From b60fc2e0b5f241d38bd2cdc582217e89e4b16cdb Mon Sep 17 00:00:00 2001 From: joe-mac-m3 Date: Thu, 8 May 2025 15:37:18 +0200 Subject: [PATCH] upload application --- .gitignore | 1 + .gitlab-ci.yml | 14 + public/app.config.json | 9 + public/assets/@mdi/font/LICENSE | 20 + public/assets/@mdi/font/README.md | 25 + .../css/materialdesignicons.min-680621ca.css | 3 + .../font/css/materialdesignicons.min.css.map | 16 + .../fonts/materialdesignicons-webfont.woff2 | Bin 0 -> 403216 bytes public/assets/cesium-68463534.js | 170170 +++++++++++++++ public/assets/cesium.js | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_0.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_1.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_10.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_11.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_12.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_13.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_14.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_15.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_16.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_17.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_18.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_19.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_2.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_20.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_21.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_22.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_23.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_24.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_25.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_26.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_27.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_3.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_4.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_5.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_6.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_7.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_8.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_9.json | 1 + .../cesium/Assets/Images/bing_maps_credit.png | Bin 0 -> 18831 bytes .../cesium/Assets/Images/cesium_credit.png | Bin 0 -> 4242 bytes .../Assets/Images/google_earth_credit.png | Bin 0 -> 7703 bytes .../cesium/Assets/Images/ion-credit.png | Bin 0 -> 6028 bytes .../Assets/Textures/LensFlare/DirtMask.jpg | Bin 0 -> 113718 bytes .../Assets/Textures/LensFlare/StarBurst.jpg | Bin 0 -> 195728 bytes .../Assets/Textures/NaturalEarthII/0/0/0.jpg | Bin 0 -> 12067 bytes .../Assets/Textures/NaturalEarthII/0/1/0.jpg | Bin 0 -> 14055 bytes .../Assets/Textures/NaturalEarthII/1/0/0.jpg | Bin 0 -> 7278 bytes .../Assets/Textures/NaturalEarthII/1/0/1.jpg | Bin 0 -> 11399 bytes .../Assets/Textures/NaturalEarthII/1/1/0.jpg | Bin 0 -> 10652 bytes .../Assets/Textures/NaturalEarthII/1/1/1.jpg | Bin 0 -> 13142 bytes .../Assets/Textures/NaturalEarthII/1/2/0.jpg | Bin 0 -> 9643 bytes .../Assets/Textures/NaturalEarthII/1/2/1.jpg | Bin 0 -> 15312 bytes .../Assets/Textures/NaturalEarthII/1/3/0.jpg | Bin 0 -> 10532 bytes .../Assets/Textures/NaturalEarthII/1/3/1.jpg | Bin 0 -> 13262 bytes .../Assets/Textures/NaturalEarthII/2/0/0.jpg | Bin 0 -> 8157 bytes .../Assets/Textures/NaturalEarthII/2/0/1.jpg | Bin 0 -> 9307 bytes .../Assets/Textures/NaturalEarthII/2/0/2.jpg | Bin 0 -> 7891 bytes .../Assets/Textures/NaturalEarthII/2/0/3.jpg | Bin 0 -> 10341 bytes .../Assets/Textures/NaturalEarthII/2/1/0.jpg | Bin 0 -> 7852 bytes .../Assets/Textures/NaturalEarthII/2/1/1.jpg | Bin 0 -> 6850 bytes .../Assets/Textures/NaturalEarthII/2/1/2.jpg | Bin 0 -> 11581 bytes .../Assets/Textures/NaturalEarthII/2/1/3.jpg | Bin 0 -> 15862 bytes .../Assets/Textures/NaturalEarthII/2/2/0.jpg | Bin 0 -> 10657 bytes .../Assets/Textures/NaturalEarthII/2/2/1.jpg | Bin 0 -> 12456 bytes .../Assets/Textures/NaturalEarthII/2/2/2.jpg | Bin 0 -> 12262 bytes .../Assets/Textures/NaturalEarthII/2/2/3.jpg | Bin 0 -> 14940 bytes .../Assets/Textures/NaturalEarthII/2/3/0.jpg | Bin 0 -> 9531 bytes .../Assets/Textures/NaturalEarthII/2/3/1.jpg | Bin 0 -> 10234 bytes .../Assets/Textures/NaturalEarthII/2/3/2.jpg | Bin 0 -> 11678 bytes .../Assets/Textures/NaturalEarthII/2/3/3.jpg | Bin 0 -> 10754 bytes .../Assets/Textures/NaturalEarthII/2/4/0.jpg | Bin 0 -> 8474 bytes .../Assets/Textures/NaturalEarthII/2/4/1.jpg | Bin 0 -> 12265 bytes .../Assets/Textures/NaturalEarthII/2/4/2.jpg | Bin 0 -> 16477 bytes .../Assets/Textures/NaturalEarthII/2/4/3.jpg | Bin 0 -> 11888 bytes .../Assets/Textures/NaturalEarthII/2/5/0.jpg | Bin 0 -> 7540 bytes .../Assets/Textures/NaturalEarthII/2/5/1.jpg | Bin 0 -> 10274 bytes .../Assets/Textures/NaturalEarthII/2/5/2.jpg | Bin 0 -> 16112 bytes .../Assets/Textures/NaturalEarthII/2/5/3.jpg | Bin 0 -> 11877 bytes .../Assets/Textures/NaturalEarthII/2/6/0.jpg | Bin 0 -> 6636 bytes .../Assets/Textures/NaturalEarthII/2/6/1.jpg | Bin 0 -> 11564 bytes .../Assets/Textures/NaturalEarthII/2/6/2.jpg | Bin 0 -> 16411 bytes .../Assets/Textures/NaturalEarthII/2/6/3.jpg | Bin 0 -> 12756 bytes .../Assets/Textures/NaturalEarthII/2/7/0.jpg | Bin 0 -> 9032 bytes .../Assets/Textures/NaturalEarthII/2/7/1.jpg | Bin 0 -> 12957 bytes .../Assets/Textures/NaturalEarthII/2/7/2.jpg | Bin 0 -> 11362 bytes .../Assets/Textures/NaturalEarthII/2/7/3.jpg | Bin 0 -> 11859 bytes .../NaturalEarthII/tilemapresource.xml | 14 + .../Assets/Textures/SkyBox/tycho2t3_80_mx.jpg | Bin 0 -> 118775 bytes .../Assets/Textures/SkyBox/tycho2t3_80_my.jpg | Bin 0 -> 152501 bytes .../Assets/Textures/SkyBox/tycho2t3_80_mz.jpg | Bin 0 -> 167980 bytes .../Assets/Textures/SkyBox/tycho2t3_80_px.jpg | Bin 0 -> 122746 bytes .../Assets/Textures/SkyBox/tycho2t3_80_py.jpg | Bin 0 -> 152999 bytes .../Assets/Textures/SkyBox/tycho2t3_80_pz.jpg | Bin 0 -> 152537 bytes .../cesium/Assets/Textures/maki/airfield.png | Bin 0 -> 1188 bytes .../cesium/Assets/Textures/maki/airport.png | Bin 0 -> 1554 bytes .../Assets/Textures/maki/alcohol-shop.png | Bin 0 -> 1293 bytes .../Assets/Textures/maki/america-football.png | Bin 0 -> 2595 bytes .../Assets/Textures/maki/art-gallery.png | Bin 0 -> 3159 bytes .../cesium/Assets/Textures/maki/bakery.png | Bin 0 -> 2714 bytes .../cesium/Assets/Textures/maki/bank.png | Bin 0 -> 936 bytes .../cesium/Assets/Textures/maki/bar.png | Bin 0 -> 1435 bytes .../cesium/Assets/Textures/maki/baseball.png | Bin 0 -> 1838 bytes .../Assets/Textures/maki/basketball.png | Bin 0 -> 1318 bytes .../cesium/Assets/Textures/maki/beer.png | Bin 0 -> 1403 bytes .../cesium/Assets/Textures/maki/bicycle.png | Bin 0 -> 3989 bytes .../cesium/Assets/Textures/maki/building.png | Bin 0 -> 1765 bytes .../cesium/Assets/Textures/maki/bus.png | Bin 0 -> 998 bytes .../cesium/Assets/Textures/maki/cafe.png | Bin 0 -> 1518 bytes .../cesium/Assets/Textures/maki/camera.png | Bin 0 -> 1976 bytes .../cesium/Assets/Textures/maki/campsite.png | Bin 0 -> 2411 bytes .../cesium/Assets/Textures/maki/car.png | Bin 0 -> 1498 bytes .../cesium/Assets/Textures/maki/cemetery.png | Bin 0 -> 967 bytes .../cesium/Assets/Textures/maki/cesium.png | Bin 0 -> 3610 bytes .../cesium/Assets/Textures/maki/chemist.png | Bin 0 -> 1603 bytes .../cesium/Assets/Textures/maki/cinema.png | Bin 0 -> 1492 bytes .../Assets/Textures/maki/circle-stroked.png | Bin 0 -> 2126 bytes .../cesium/Assets/Textures/maki/circle.png | Bin 0 -> 1459 bytes .../cesium/Assets/Textures/maki/city.png | Bin 0 -> 788 bytes .../Assets/Textures/maki/clothing-store.png | Bin 0 -> 2037 bytes .../cesium/Assets/Textures/maki/college.png | Bin 0 -> 2502 bytes .../Assets/Textures/maki/commercial.png | Bin 0 -> 1002 bytes .../cesium/Assets/Textures/maki/cricket.png | Bin 0 -> 1677 bytes .../cesium/Assets/Textures/maki/cross.png | Bin 0 -> 1888 bytes .../cesium/Assets/Textures/maki/dam.png | Bin 0 -> 1703 bytes .../cesium/Assets/Textures/maki/danger.png | Bin 0 -> 2429 bytes .../Assets/Textures/maki/disability.png | Bin 0 -> 3437 bytes .../cesium/Assets/Textures/maki/dog-park.png | Bin 0 -> 3146 bytes .../cesium/Assets/Textures/maki/embassy.png | Bin 0 -> 1680 bytes .../Textures/maki/emergency-telephone.png | Bin 0 -> 1533 bytes .../cesium/Assets/Textures/maki/entrance.png | Bin 0 -> 1307 bytes .../cesium/Assets/Textures/maki/farm.png | Bin 0 -> 1686 bytes .../cesium/Assets/Textures/maki/fast-food.png | Bin 0 -> 2019 bytes .../cesium/Assets/Textures/maki/ferry.png | Bin 0 -> 2879 bytes .../Assets/Textures/maki/fire-station.png | Bin 0 -> 2228 bytes .../cesium/Assets/Textures/maki/fuel.png | Bin 0 -> 1741 bytes .../cesium/Assets/Textures/maki/garden.png | Bin 0 -> 2057 bytes .../cesium/Assets/Textures/maki/gift.png | Bin 0 -> 1606 bytes .../cesium/Assets/Textures/maki/golf.png | Bin 0 -> 1999 bytes .../cesium/Assets/Textures/maki/grocery.png | Bin 0 -> 1425 bytes .../Assets/Textures/maki/hairdresser.png | Bin 0 -> 3301 bytes .../cesium/Assets/Textures/maki/harbor.png | Bin 0 -> 2048 bytes .../cesium/Assets/Textures/maki/heart.png | Bin 0 -> 1745 bytes .../cesium/Assets/Textures/maki/heliport.png | Bin 0 -> 2059 bytes .../cesium/Assets/Textures/maki/hospital.png | Bin 0 -> 909 bytes .../cesium/Assets/Textures/maki/ice-cream.png | Bin 0 -> 1602 bytes .../Assets/Textures/maki/industrial.png | Bin 0 -> 1092 bytes .../cesium/Assets/Textures/maki/land-use.png | Bin 0 -> 1773 bytes .../cesium/Assets/Textures/maki/laundry.png | Bin 0 -> 2407 bytes .../cesium/Assets/Textures/maki/library.png | Bin 0 -> 1355 bytes .../Assets/Textures/maki/lighthouse.png | Bin 0 -> 1944 bytes .../cesium/Assets/Textures/maki/lodging.png | Bin 0 -> 1362 bytes .../cesium/Assets/Textures/maki/logging.png | Bin 0 -> 1378 bytes .../Textures/maki/london-underground.png | Bin 0 -> 2979 bytes .../Assets/Textures/maki/marker-stroked.png | Bin 0 -> 3414 bytes .../cesium/Assets/Textures/maki/marker.png | Bin 0 -> 2448 bytes .../cesium/Assets/Textures/maki/minefield.png | Bin 0 -> 1907 bytes .../Assets/Textures/maki/mobilephone.png | Bin 0 -> 1474 bytes .../cesium/Assets/Textures/maki/monument.png | Bin 0 -> 1376 bytes .../cesium/Assets/Textures/maki/museum.png | Bin 0 -> 2578 bytes .../cesium/Assets/Textures/maki/music.png | Bin 0 -> 1371 bytes .../cesium/Assets/Textures/maki/oil-well.png | Bin 0 -> 3357 bytes .../cesium/Assets/Textures/maki/park.png | Bin 0 -> 2059 bytes .../cesium/Assets/Textures/maki/park2.png | Bin 0 -> 2284 bytes .../Assets/Textures/maki/parking-garage.png | Bin 0 -> 1563 bytes .../cesium/Assets/Textures/maki/parking.png | Bin 0 -> 1250 bytes .../cesium/Assets/Textures/maki/pharmacy.png | Bin 0 -> 2258 bytes .../cesium/Assets/Textures/maki/pitch.png | Bin 0 -> 3288 bytes .../Assets/Textures/maki/place-of-worship.png | Bin 0 -> 1111 bytes .../Assets/Textures/maki/playground.png | Bin 0 -> 3856 bytes .../cesium/Assets/Textures/maki/police.png | Bin 0 -> 2194 bytes .../Assets/Textures/maki/polling-place.png | Bin 0 -> 1772 bytes .../cesium/Assets/Textures/maki/post.png | Bin 0 -> 1273 bytes .../cesium/Assets/Textures/maki/prison.png | Bin 0 -> 1371 bytes .../Assets/Textures/maki/rail-above.png | Bin 0 -> 2071 bytes .../Assets/Textures/maki/rail-light.png | Bin 0 -> 2816 bytes .../Assets/Textures/maki/rail-metro.png | Bin 0 -> 2249 bytes .../Assets/Textures/maki/rail-underground.png | Bin 0 -> 1996 bytes .../cesium/Assets/Textures/maki/rail.png | Bin 0 -> 2073 bytes .../Textures/maki/religious-christian.png | Bin 0 -> 948 bytes .../Assets/Textures/maki/religious-jewish.png | Bin 0 -> 2384 bytes .../Assets/Textures/maki/religious-muslim.png | Bin 0 -> 3925 bytes .../Assets/Textures/maki/restaurant.png | Bin 0 -> 2499 bytes .../cesium/Assets/Textures/maki/roadblock.png | Bin 0 -> 1312 bytes .../cesium/Assets/Textures/maki/rocket.png | Bin 0 -> 1653 bytes .../cesium/Assets/Textures/maki/school.png | Bin 0 -> 3838 bytes .../cesium/Assets/Textures/maki/scooter.png | Bin 0 -> 2942 bytes .../cesium/Assets/Textures/maki/shop.png | Bin 0 -> 1544 bytes .../cesium/Assets/Textures/maki/skiing.png | Bin 0 -> 3345 bytes .../Assets/Textures/maki/slaughterhouse.png | Bin 0 -> 2270 bytes .../cesium/Assets/Textures/maki/soccer.png | Bin 0 -> 2420 bytes .../Assets/Textures/maki/square-stroked.png | Bin 0 -> 650 bytes .../cesium/Assets/Textures/maki/square.png | Bin 0 -> 582 bytes .../Assets/Textures/maki/star-stroked.png | Bin 0 -> 3460 bytes .../cesium/Assets/Textures/maki/star.png | Bin 0 -> 2703 bytes .../cesium/Assets/Textures/maki/suitcase.png | Bin 0 -> 1129 bytes .../cesium/Assets/Textures/maki/swimming.png | Bin 0 -> 2106 bytes .../cesium/Assets/Textures/maki/telephone.png | Bin 0 -> 1702 bytes .../cesium/Assets/Textures/maki/tennis.png | Bin 0 -> 1658 bytes .../cesium/Assets/Textures/maki/theatre.png | Bin 0 -> 3233 bytes .../cesium/Assets/Textures/maki/toilets.png | Bin 0 -> 2917 bytes .../cesium/Assets/Textures/maki/town-hall.png | Bin 0 -> 2005 bytes .../cesium/Assets/Textures/maki/town.png | Bin 0 -> 1125 bytes .../Assets/Textures/maki/triangle-stroked.png | Bin 0 -> 2837 bytes .../cesium/Assets/Textures/maki/triangle.png | Bin 0 -> 2137 bytes .../cesium/Assets/Textures/maki/village.png | Bin 0 -> 2145 bytes .../cesium/Assets/Textures/maki/warehouse.png | Bin 0 -> 1908 bytes .../Assets/Textures/maki/waste-basket.png | Bin 0 -> 1917 bytes .../cesium/Assets/Textures/maki/water.png | Bin 0 -> 2411 bytes .../cesium/Assets/Textures/maki/wetland.png | Bin 0 -> 2151 bytes .../cesium/Assets/Textures/maki/zoo.png | Bin 0 -> 2681 bytes .../cesium/Assets/Textures/moonSmall.jpg | Bin 0 -> 18196 bytes public/assets/cesium/Assets/Textures/pin.svg | 1 + .../cesium/Assets/Textures/waterNormals.jpg | Bin 0 -> 294196 bytes .../Assets/Textures/waterNormalsSmall.jpg | Bin 0 -> 34121 bytes .../Assets/approximateTerrainHeights.json | 1 + .../ThirdParty/Workers/basis_transcoder.js | 21 + .../cesium/ThirdParty/Workers/package.json | 1 + .../ThirdParty/Workers/pako_deflate.min.js | 2 + .../ThirdParty/Workers/pako_inflate.min.js | 2 + .../ThirdParty/Workers/z-worker-pako.js | 1 + .../cesium/ThirdParty/basis_transcoder.wasm | Bin 0 -> 500839 bytes .../cesium/ThirdParty/draco_decoder.wasm | Bin 0 -> 285747 bytes .../ThirdParty/google-earth-dbroot-parser.js | 8337 + .../assets/cesium/Workers/chunk-2LOWCAMW.js | 390 + .../assets/cesium/Workers/chunk-2PTKXHJB.js | 834 + .../assets/cesium/Workers/chunk-3HQMMUPU.js | 629 + .../assets/cesium/Workers/chunk-3IFRSGEY.js | 691 + .../assets/cesium/Workers/chunk-44QAAS4P.js | 220 + .../assets/cesium/Workers/chunk-56EDBCGT.js | 768 + .../assets/cesium/Workers/chunk-57H6I3SV.js | 100 + .../assets/cesium/Workers/chunk-6SQMLVGV.js | 10367 + .../assets/cesium/Workers/chunk-7YIOHQWH.js | 1477 + .../assets/cesium/Workers/chunk-7ZZ5LMZY.js | 2717 + .../assets/cesium/Workers/chunk-BVKITG4N.js | 239 + .../assets/cesium/Workers/chunk-C3EQ27WF.js | 353 + .../assets/cesium/Workers/chunk-C4WPMOKT.js | 139 + .../assets/cesium/Workers/chunk-EDLRS3AW.js | 171 + .../assets/cesium/Workers/chunk-EJVGYGLF.js | 476 + .../assets/cesium/Workers/chunk-FFLMY4TE.js | 2857 + .../assets/cesium/Workers/chunk-GBT7MJ6X.js | 37 + .../assets/cesium/Workers/chunk-HJMNR3GC.js | 684 + .../assets/cesium/Workers/chunk-HP5XLODI.js | 634 + .../assets/cesium/Workers/chunk-IBRIWOCM.js | 781 + .../assets/cesium/Workers/chunk-IZGUQO6Q.js | 511 + .../assets/cesium/Workers/chunk-IZJ42N4W.js | 1052 + .../assets/cesium/Workers/chunk-JBSKHTNX.js | 138 + .../assets/cesium/Workers/chunk-JISPSEF3.js | 305 + .../assets/cesium/Workers/chunk-JSQJDZI4.js | 456 + .../assets/cesium/Workers/chunk-JXVLNVXC.js | 300 + .../assets/cesium/Workers/chunk-KHZNBFOH.js | 963 + .../assets/cesium/Workers/chunk-L5GODJAR.js | 398 + .../assets/cesium/Workers/chunk-LJ2JQHJT.js | 435 + .../assets/cesium/Workers/chunk-LLAF3CPH.js | 58 + .../assets/cesium/Workers/chunk-M24KHENR.js | 1800 + .../assets/cesium/Workers/chunk-NDDI2LWR.js | 157 + .../assets/cesium/Workers/chunk-NGZJIN5Z.js | 102 + .../assets/cesium/Workers/chunk-O72GZTSE.js | 73 + .../assets/cesium/Workers/chunk-OPP2SKMA.js | 368 + .../assets/cesium/Workers/chunk-P6TRGU3S.js | 163 + .../assets/cesium/Workers/chunk-QN6TBED4.js | 421 + .../assets/cesium/Workers/chunk-QQOZO7KO.js | 1258 + .../assets/cesium/Workers/chunk-RJM36CNY.js | 117 + .../assets/cesium/Workers/chunk-RTJKHZWU.js | 196 + .../assets/cesium/Workers/chunk-TI3TRKIC.js | 945 + .../assets/cesium/Workers/chunk-TK5IIG2F.js | 122 + .../assets/cesium/Workers/chunk-U5HSOKPQ.js | 39 + .../assets/cesium/Workers/chunk-WGDFYAGC.js | 500 + .../assets/cesium/Workers/chunk-X7IQYYHF.js | 44 + .../assets/cesium/Workers/chunk-XIUSRWL6.js | 262 + .../assets/cesium/Workers/chunk-XWOUPGUF.js | 55 + .../assets/cesium/Workers/chunk-YCDZX5LS.js | 75 + .../assets/cesium/Workers/chunk-YK3QIKY7.js | 287 + .../assets/cesium/Workers/chunk-YSIJTJ7N.js | 59 + .../assets/cesium/Workers/chunk-Z2QP3CXW.js | 101 + .../assets/cesium/Workers/chunk-ZVUUPJEM.js | 1075 + .../assets/cesium/Workers/combineGeometry.js | 66 + .../cesium/Workers/createBoxGeometry.js | 56 + .../Workers/createBoxOutlineGeometry.js | 233 + .../cesium/Workers/createCircleGeometry.js | 199 + .../Workers/createCircleOutlineGeometry.js | 145 + .../Workers/createCoplanarPolygonGeometry.js | 505 + .../createCoplanarPolygonOutlineGeometry.js | 223 + .../cesium/Workers/createCorridorGeometry.js | 1261 + .../Workers/createCorridorOutlineGeometry.js | 566 + .../cesium/Workers/createCylinderGeometry.js | 58 + .../Workers/createCylinderOutlineGeometry.js | 229 + .../cesium/Workers/createEllipseGeometry.js | 69 + .../Workers/createEllipseOutlineGeometry.js | 62 + .../cesium/Workers/createEllipsoidGeometry.js | 57 + .../Workers/createEllipsoidOutlineGeometry.js | 59 + .../cesium/Workers/createFrustumGeometry.js | 56 + .../Workers/createFrustumOutlineGeometry.js | 234 + .../assets/cesium/Workers/createGeometry.js | 169 + .../Workers/createGroundPolylineGeometry.js | 1606 + .../cesium/Workers/createPlaneGeometry.js | 222 + .../Workers/createPlaneOutlineGeometry.js | 122 + .../cesium/Workers/createPolygonGeometry.js | 1409 + .../Workers/createPolygonOutlineGeometry.js | 541 + .../cesium/Workers/createPolylineGeometry.js | 494 + .../Workers/createPolylineVolumeGeometry.js | 377 + .../createPolylineVolumeOutlineGeometry.js | 275 + .../cesium/Workers/createRectangleGeometry.js | 1272 + .../Workers/createRectangleOutlineGeometry.js | 477 + .../Workers/createSimplePolylineGeometry.js | 398 + .../cesium/Workers/createSphereGeometry.js | 116 + .../Workers/createSphereOutlineGeometry.js | 116 + .../Workers/createTaskProcessorWorker.js | 32 + .../createVectorTileClampedPolylines.js | 490 + .../Workers/createVectorTileGeometries.js | 385 + .../cesium/Workers/createVectorTilePoints.js | 112 + .../Workers/createVectorTilePolygons.js | 383 + .../Workers/createVectorTilePolylines.js | 260 + ...VerticesFromGoogleEarthEnterpriseBuffer.js | 567 + .../Workers/createVerticesFromHeightmap.js | 2280 + .../createVerticesFromQuantizedTerrainMesh.js | 743 + .../cesium/Workers/createWallGeometry.js | 488 + .../Workers/createWallOutlineGeometry.js | 336 + public/assets/cesium/Workers/decodeDraco.js | 369 + .../decodeGoogleEarthEnterprisePacket.js | 2666 + public/assets/cesium/Workers/decodeI3S.js | 1343 + public/assets/cesium/Workers/transcodeKTX2.js | 3390 + .../cesium/Workers/transferTypedArrayTest.js | 41 + .../Workers/upsampleQuantizedTerrainMesh.js | 817 + public/assets/core-cc7bf7de.js | 22095 ++ public/assets/core.js | 1 + public/assets/favicon-128-4c4ce5df.png | Bin 0 -> 1312 bytes public/assets/favicon-180-4c4ce5df.png | Bin 0 -> 1661 bytes public/assets/favicon-192-4c4ce5df.png | Bin 0 -> 1806 bytes public/assets/favicon-32-4c4ce5df.png | Bin 0 -> 557 bytes public/assets/favicon-4c4ce5df.svg | 10 + public/assets/font/OFL.txt | 93 + .../font/TitilliumWeb-Regular-9ca076be.woff2 | Bin 0 -> 20368 bytes public/assets/ol-f921df59.js | 58805 +++++ public/assets/ol.js | 1 + public/assets/style/icon-marker-70960f05.png | Bin 0 -> 1223 bytes .../style/icon-marker-blue-534e374b.png | Bin 0 -> 1305 bytes .../style/icon-marker-green-0b6a92bc.png | Bin 0 -> 1305 bytes .../assets/style/icon-marker-o-036477fa.png | Bin 0 -> 1264 bytes .../style/icon-marker-o-blue-7b6d6279.png | Bin 0 -> 1395 bytes .../style/icon-marker-o-green-c863c0fa.png | Bin 0 -> 1396 bytes .../style/icon-marker-o-red-93ff58df.png | Bin 0 -> 1414 bytes .../assets/style/icon-marker-red-313d03e8.png | Bin 0 -> 1319 bytes public/assets/style/icon-pin-b7ce771e.png | Bin 0 -> 1203 bytes .../assets/style/icon-pin-blue-7be369a3.png | Bin 0 -> 1314 bytes .../assets/style/icon-pin-green-cbb935fe.png | Bin 0 -> 1314 bytes public/assets/style/icon-pin-red-3f25b245.png | Bin 0 -> 1320 bytes public/assets/ui-ec58c2c4.css | 1 + public/assets/ui-ec58c2c4.js | 36569 ++++ public/assets/ui.js | 1 + public/assets/vue-8f1c1746.js | 6083 + public/assets/vue.js | 1 + public/assets/vuetify-2bdbde4d.css | 5 + public/assets/vuetify-2bdbde4d.js | 24483 +++ public/assets/vuetify.js | 1 + .../1be4e880-c1d9-4392-9278-261142556a98.json | 206 + .../10/537/671.jpg | Bin 0 -> 3461 bytes .../10/538/671.jpg | Bin 0 -> 6676 bytes .../11/1075/1342.jpg | Bin 0 -> 5077 bytes .../11/1075/1343.jpg | Bin 0 -> 3998 bytes .../11/1076/1342.jpg | Bin 0 -> 9353 bytes .../11/1076/1343.jpg | Bin 0 -> 7401 bytes .../11/1077/1342.jpg | Bin 0 -> 1937 bytes .../11/1077/1343.jpg | Bin 0 -> 1712 bytes .../12/2151/2684.jpg | Bin 0 -> 6190 bytes .../12/2151/2685.jpg | Bin 0 -> 6549 bytes .../12/2151/2686.jpg | Bin 0 -> 6854 bytes .../12/2151/2687.jpg | Bin 0 -> 2652 bytes .../12/2152/2684.jpg | Bin 0 -> 6492 bytes .../12/2152/2685.jpg | Bin 0 -> 7146 bytes .../12/2152/2686.jpg | Bin 0 -> 7383 bytes .../12/2152/2687.jpg | Bin 0 -> 2765 bytes .../12/2153/2684.jpg | Bin 0 -> 6545 bytes .../12/2153/2685.jpg | Bin 0 -> 6451 bytes .../12/2153/2686.jpg | Bin 0 -> 7497 bytes .../12/2153/2687.jpg | Bin 0 -> 2854 bytes .../12/2154/2684.jpg | Bin 0 -> 2185 bytes .../12/2154/2685.jpg | Bin 0 -> 2211 bytes .../12/2154/2686.jpg | Bin 0 -> 2521 bytes .../12/2154/2687.jpg | Bin 0 -> 1242 bytes .../googlemaps.html | 247 + .../leaflet.html | 107 + .../openlayers.html | 99 + .../tilemapresource.xml | 15 + .../10/537/671.jpg | Bin 0 -> 4155 bytes .../10/538/671.jpg | Bin 0 -> 9049 bytes .../11/1075/1342.jpg | Bin 0 -> 5889 bytes .../11/1075/1343.jpg | Bin 0 -> 4962 bytes .../11/1076/1342.jpg | Bin 0 -> 12626 bytes .../11/1076/1343.jpg | Bin 0 -> 9832 bytes .../11/1077/1342.jpg | Bin 0 -> 2353 bytes .../11/1077/1343.jpg | Bin 0 -> 1942 bytes .../12/2151/2684.jpg | Bin 0 -> 7370 bytes .../12/2151/2685.jpg | Bin 0 -> 7487 bytes .../12/2151/2686.jpg | Bin 0 -> 9134 bytes .../12/2151/2687.jpg | Bin 0 -> 2808 bytes .../12/2152/2684.jpg | Bin 0 -> 7906 bytes .../12/2152/2685.jpg | Bin 0 -> 9549 bytes .../12/2152/2686.jpg | Bin 0 -> 10383 bytes .../12/2152/2687.jpg | Bin 0 -> 3349 bytes .../12/2153/2684.jpg | Bin 0 -> 8959 bytes .../12/2153/2685.jpg | Bin 0 -> 9176 bytes .../12/2153/2686.jpg | Bin 0 -> 10117 bytes .../12/2153/2687.jpg | Bin 0 -> 3037 bytes .../12/2154/2684.jpg | Bin 0 -> 2683 bytes .../12/2154/2685.jpg | Bin 0 -> 2720 bytes .../12/2154/2686.jpg | Bin 0 -> 3056 bytes .../12/2154/2687.jpg | Bin 0 -> 1224 bytes .../googlemaps.html | 247 + .../leaflet.html | 107 + .../openlayers.html | 99 + .../tilemapresource.xml | 15 + .../10/537/671.jpg | Bin 0 -> 4331 bytes .../10/538/671.jpg | Bin 0 -> 9116 bytes .../11/1075/1342.jpg | Bin 0 -> 6666 bytes .../11/1075/1343.jpg | Bin 0 -> 5269 bytes .../11/1076/1342.jpg | Bin 0 -> 13528 bytes .../11/1076/1343.jpg | Bin 0 -> 10433 bytes .../11/1077/1342.jpg | Bin 0 -> 2402 bytes .../11/1077/1343.jpg | Bin 0 -> 1974 bytes .../12/2151/2684.jpg | Bin 0 -> 8716 bytes .../12/2151/2685.jpg | Bin 0 -> 8458 bytes .../12/2151/2686.jpg | Bin 0 -> 9653 bytes .../12/2151/2687.jpg | Bin 0 -> 3367 bytes .../12/2152/2684.jpg | Bin 0 -> 9561 bytes .../12/2152/2685.jpg | Bin 0 -> 10359 bytes .../12/2152/2686.jpg | Bin 0 -> 10862 bytes .../12/2152/2687.jpg | Bin 0 -> 3670 bytes .../12/2153/2684.jpg | Bin 0 -> 9522 bytes .../12/2153/2685.jpg | Bin 0 -> 9349 bytes .../12/2153/2686.jpg | Bin 0 -> 10960 bytes .../12/2153/2687.jpg | Bin 0 -> 3695 bytes .../12/2154/2684.jpg | Bin 0 -> 2792 bytes .../12/2154/2685.jpg | Bin 0 -> 2816 bytes .../12/2154/2686.jpg | Bin 0 -> 3129 bytes .../12/2154/2687.jpg | Bin 0 -> 1340 bytes .../googlemaps.html | 247 + .../leaflet.html | 107 + .../openlayers.html | 99 + .../tilemapresource.xml | 15 + public/index.html | 112 + 440 files changed, 392311 insertions(+) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 public/app.config.json create mode 100644 public/assets/@mdi/font/LICENSE create mode 100644 public/assets/@mdi/font/README.md create mode 100644 public/assets/@mdi/font/css/materialdesignicons.min-680621ca.css create mode 100644 public/assets/@mdi/font/css/materialdesignicons.min.css.map create mode 100644 public/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 create mode 100644 public/assets/cesium-68463534.js create mode 100644 public/assets/cesium.js create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json create mode 100644 public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json create mode 100644 public/assets/cesium/Assets/Images/bing_maps_credit.png create mode 100644 public/assets/cesium/Assets/Images/cesium_credit.png create mode 100644 public/assets/cesium/Assets/Images/google_earth_credit.png create mode 100644 public/assets/cesium/Assets/Images/ion-credit.png create mode 100644 public/assets/cesium/Assets/Textures/LensFlare/DirtMask.jpg create mode 100644 public/assets/cesium/Assets/Textures/LensFlare/StarBurst.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg create mode 100644 public/assets/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg create mode 100644 public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg create mode 100644 public/assets/cesium/Assets/Textures/maki/airfield.png create mode 100644 public/assets/cesium/Assets/Textures/maki/airport.png create mode 100644 public/assets/cesium/Assets/Textures/maki/alcohol-shop.png create mode 100644 public/assets/cesium/Assets/Textures/maki/america-football.png create mode 100644 public/assets/cesium/Assets/Textures/maki/art-gallery.png create mode 100644 public/assets/cesium/Assets/Textures/maki/bakery.png create mode 100644 public/assets/cesium/Assets/Textures/maki/bank.png create mode 100644 public/assets/cesium/Assets/Textures/maki/bar.png create mode 100644 public/assets/cesium/Assets/Textures/maki/baseball.png create mode 100644 public/assets/cesium/Assets/Textures/maki/basketball.png create mode 100644 public/assets/cesium/Assets/Textures/maki/beer.png create mode 100644 public/assets/cesium/Assets/Textures/maki/bicycle.png create mode 100644 public/assets/cesium/Assets/Textures/maki/building.png create mode 100644 public/assets/cesium/Assets/Textures/maki/bus.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cafe.png create mode 100644 public/assets/cesium/Assets/Textures/maki/camera.png create mode 100644 public/assets/cesium/Assets/Textures/maki/campsite.png create mode 100644 public/assets/cesium/Assets/Textures/maki/car.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cemetery.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cesium.png create mode 100644 public/assets/cesium/Assets/Textures/maki/chemist.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cinema.png create mode 100644 public/assets/cesium/Assets/Textures/maki/circle-stroked.png create mode 100644 public/assets/cesium/Assets/Textures/maki/circle.png create mode 100644 public/assets/cesium/Assets/Textures/maki/city.png create mode 100644 public/assets/cesium/Assets/Textures/maki/clothing-store.png create mode 100644 public/assets/cesium/Assets/Textures/maki/college.png create mode 100644 public/assets/cesium/Assets/Textures/maki/commercial.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cricket.png create mode 100644 public/assets/cesium/Assets/Textures/maki/cross.png create mode 100644 public/assets/cesium/Assets/Textures/maki/dam.png create mode 100644 public/assets/cesium/Assets/Textures/maki/danger.png create mode 100644 public/assets/cesium/Assets/Textures/maki/disability.png create mode 100644 public/assets/cesium/Assets/Textures/maki/dog-park.png create mode 100644 public/assets/cesium/Assets/Textures/maki/embassy.png create mode 100644 public/assets/cesium/Assets/Textures/maki/emergency-telephone.png create mode 100644 public/assets/cesium/Assets/Textures/maki/entrance.png create mode 100644 public/assets/cesium/Assets/Textures/maki/farm.png create mode 100644 public/assets/cesium/Assets/Textures/maki/fast-food.png create mode 100644 public/assets/cesium/Assets/Textures/maki/ferry.png create mode 100644 public/assets/cesium/Assets/Textures/maki/fire-station.png create mode 100644 public/assets/cesium/Assets/Textures/maki/fuel.png create mode 100644 public/assets/cesium/Assets/Textures/maki/garden.png create mode 100644 public/assets/cesium/Assets/Textures/maki/gift.png create mode 100644 public/assets/cesium/Assets/Textures/maki/golf.png create mode 100644 public/assets/cesium/Assets/Textures/maki/grocery.png create mode 100644 public/assets/cesium/Assets/Textures/maki/hairdresser.png create mode 100644 public/assets/cesium/Assets/Textures/maki/harbor.png create mode 100644 public/assets/cesium/Assets/Textures/maki/heart.png create mode 100644 public/assets/cesium/Assets/Textures/maki/heliport.png create mode 100644 public/assets/cesium/Assets/Textures/maki/hospital.png create mode 100644 public/assets/cesium/Assets/Textures/maki/ice-cream.png create mode 100644 public/assets/cesium/Assets/Textures/maki/industrial.png create mode 100644 public/assets/cesium/Assets/Textures/maki/land-use.png create mode 100644 public/assets/cesium/Assets/Textures/maki/laundry.png create mode 100644 public/assets/cesium/Assets/Textures/maki/library.png create mode 100644 public/assets/cesium/Assets/Textures/maki/lighthouse.png create mode 100644 public/assets/cesium/Assets/Textures/maki/lodging.png create mode 100644 public/assets/cesium/Assets/Textures/maki/logging.png create mode 100644 public/assets/cesium/Assets/Textures/maki/london-underground.png create mode 100644 public/assets/cesium/Assets/Textures/maki/marker-stroked.png create mode 100644 public/assets/cesium/Assets/Textures/maki/marker.png create mode 100644 public/assets/cesium/Assets/Textures/maki/minefield.png create mode 100644 public/assets/cesium/Assets/Textures/maki/mobilephone.png create mode 100644 public/assets/cesium/Assets/Textures/maki/monument.png create mode 100644 public/assets/cesium/Assets/Textures/maki/museum.png create mode 100644 public/assets/cesium/Assets/Textures/maki/music.png create mode 100644 public/assets/cesium/Assets/Textures/maki/oil-well.png create mode 100644 public/assets/cesium/Assets/Textures/maki/park.png create mode 100644 public/assets/cesium/Assets/Textures/maki/park2.png create mode 100644 public/assets/cesium/Assets/Textures/maki/parking-garage.png create mode 100644 public/assets/cesium/Assets/Textures/maki/parking.png create mode 100644 public/assets/cesium/Assets/Textures/maki/pharmacy.png create mode 100644 public/assets/cesium/Assets/Textures/maki/pitch.png create mode 100644 public/assets/cesium/Assets/Textures/maki/place-of-worship.png create mode 100644 public/assets/cesium/Assets/Textures/maki/playground.png create mode 100644 public/assets/cesium/Assets/Textures/maki/police.png create mode 100644 public/assets/cesium/Assets/Textures/maki/polling-place.png create mode 100644 public/assets/cesium/Assets/Textures/maki/post.png create mode 100644 public/assets/cesium/Assets/Textures/maki/prison.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rail-above.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rail-light.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rail-metro.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rail-underground.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rail.png create mode 100644 public/assets/cesium/Assets/Textures/maki/religious-christian.png create mode 100644 public/assets/cesium/Assets/Textures/maki/religious-jewish.png create mode 100644 public/assets/cesium/Assets/Textures/maki/religious-muslim.png create mode 100644 public/assets/cesium/Assets/Textures/maki/restaurant.png create mode 100644 public/assets/cesium/Assets/Textures/maki/roadblock.png create mode 100644 public/assets/cesium/Assets/Textures/maki/rocket.png create mode 100644 public/assets/cesium/Assets/Textures/maki/school.png create mode 100644 public/assets/cesium/Assets/Textures/maki/scooter.png create mode 100644 public/assets/cesium/Assets/Textures/maki/shop.png create mode 100644 public/assets/cesium/Assets/Textures/maki/skiing.png create mode 100644 public/assets/cesium/Assets/Textures/maki/slaughterhouse.png create mode 100644 public/assets/cesium/Assets/Textures/maki/soccer.png create mode 100644 public/assets/cesium/Assets/Textures/maki/square-stroked.png create mode 100644 public/assets/cesium/Assets/Textures/maki/square.png create mode 100644 public/assets/cesium/Assets/Textures/maki/star-stroked.png create mode 100644 public/assets/cesium/Assets/Textures/maki/star.png create mode 100644 public/assets/cesium/Assets/Textures/maki/suitcase.png create mode 100644 public/assets/cesium/Assets/Textures/maki/swimming.png create mode 100644 public/assets/cesium/Assets/Textures/maki/telephone.png create mode 100644 public/assets/cesium/Assets/Textures/maki/tennis.png create mode 100644 public/assets/cesium/Assets/Textures/maki/theatre.png create mode 100644 public/assets/cesium/Assets/Textures/maki/toilets.png create mode 100644 public/assets/cesium/Assets/Textures/maki/town-hall.png create mode 100644 public/assets/cesium/Assets/Textures/maki/town.png create mode 100644 public/assets/cesium/Assets/Textures/maki/triangle-stroked.png create mode 100644 public/assets/cesium/Assets/Textures/maki/triangle.png create mode 100644 public/assets/cesium/Assets/Textures/maki/village.png create mode 100644 public/assets/cesium/Assets/Textures/maki/warehouse.png create mode 100644 public/assets/cesium/Assets/Textures/maki/waste-basket.png create mode 100644 public/assets/cesium/Assets/Textures/maki/water.png create mode 100644 public/assets/cesium/Assets/Textures/maki/wetland.png create mode 100644 public/assets/cesium/Assets/Textures/maki/zoo.png create mode 100644 public/assets/cesium/Assets/Textures/moonSmall.jpg create mode 100644 public/assets/cesium/Assets/Textures/pin.svg create mode 100644 public/assets/cesium/Assets/Textures/waterNormals.jpg create mode 100644 public/assets/cesium/Assets/Textures/waterNormalsSmall.jpg create mode 100644 public/assets/cesium/Assets/approximateTerrainHeights.json create mode 100644 public/assets/cesium/ThirdParty/Workers/basis_transcoder.js create mode 100644 public/assets/cesium/ThirdParty/Workers/package.json create mode 100644 public/assets/cesium/ThirdParty/Workers/pako_deflate.min.js create mode 100644 public/assets/cesium/ThirdParty/Workers/pako_inflate.min.js create mode 100644 public/assets/cesium/ThirdParty/Workers/z-worker-pako.js create mode 100644 public/assets/cesium/ThirdParty/basis_transcoder.wasm create mode 100644 public/assets/cesium/ThirdParty/draco_decoder.wasm create mode 100644 public/assets/cesium/ThirdParty/google-earth-dbroot-parser.js create mode 100644 public/assets/cesium/Workers/chunk-2LOWCAMW.js create mode 100644 public/assets/cesium/Workers/chunk-2PTKXHJB.js create mode 100644 public/assets/cesium/Workers/chunk-3HQMMUPU.js create mode 100644 public/assets/cesium/Workers/chunk-3IFRSGEY.js create mode 100644 public/assets/cesium/Workers/chunk-44QAAS4P.js create mode 100644 public/assets/cesium/Workers/chunk-56EDBCGT.js create mode 100644 public/assets/cesium/Workers/chunk-57H6I3SV.js create mode 100644 public/assets/cesium/Workers/chunk-6SQMLVGV.js create mode 100644 public/assets/cesium/Workers/chunk-7YIOHQWH.js create mode 100644 public/assets/cesium/Workers/chunk-7ZZ5LMZY.js create mode 100644 public/assets/cesium/Workers/chunk-BVKITG4N.js create mode 100644 public/assets/cesium/Workers/chunk-C3EQ27WF.js create mode 100644 public/assets/cesium/Workers/chunk-C4WPMOKT.js create mode 100644 public/assets/cesium/Workers/chunk-EDLRS3AW.js create mode 100644 public/assets/cesium/Workers/chunk-EJVGYGLF.js create mode 100644 public/assets/cesium/Workers/chunk-FFLMY4TE.js create mode 100644 public/assets/cesium/Workers/chunk-GBT7MJ6X.js create mode 100644 public/assets/cesium/Workers/chunk-HJMNR3GC.js create mode 100644 public/assets/cesium/Workers/chunk-HP5XLODI.js create mode 100644 public/assets/cesium/Workers/chunk-IBRIWOCM.js create mode 100644 public/assets/cesium/Workers/chunk-IZGUQO6Q.js create mode 100644 public/assets/cesium/Workers/chunk-IZJ42N4W.js create mode 100644 public/assets/cesium/Workers/chunk-JBSKHTNX.js create mode 100644 public/assets/cesium/Workers/chunk-JISPSEF3.js create mode 100644 public/assets/cesium/Workers/chunk-JSQJDZI4.js create mode 100644 public/assets/cesium/Workers/chunk-JXVLNVXC.js create mode 100644 public/assets/cesium/Workers/chunk-KHZNBFOH.js create mode 100644 public/assets/cesium/Workers/chunk-L5GODJAR.js create mode 100644 public/assets/cesium/Workers/chunk-LJ2JQHJT.js create mode 100644 public/assets/cesium/Workers/chunk-LLAF3CPH.js create mode 100644 public/assets/cesium/Workers/chunk-M24KHENR.js create mode 100644 public/assets/cesium/Workers/chunk-NDDI2LWR.js create mode 100644 public/assets/cesium/Workers/chunk-NGZJIN5Z.js create mode 100644 public/assets/cesium/Workers/chunk-O72GZTSE.js create mode 100644 public/assets/cesium/Workers/chunk-OPP2SKMA.js create mode 100644 public/assets/cesium/Workers/chunk-P6TRGU3S.js create mode 100644 public/assets/cesium/Workers/chunk-QN6TBED4.js create mode 100644 public/assets/cesium/Workers/chunk-QQOZO7KO.js create mode 100644 public/assets/cesium/Workers/chunk-RJM36CNY.js create mode 100644 public/assets/cesium/Workers/chunk-RTJKHZWU.js create mode 100644 public/assets/cesium/Workers/chunk-TI3TRKIC.js create mode 100644 public/assets/cesium/Workers/chunk-TK5IIG2F.js create mode 100644 public/assets/cesium/Workers/chunk-U5HSOKPQ.js create mode 100644 public/assets/cesium/Workers/chunk-WGDFYAGC.js create mode 100644 public/assets/cesium/Workers/chunk-X7IQYYHF.js create mode 100644 public/assets/cesium/Workers/chunk-XIUSRWL6.js create mode 100644 public/assets/cesium/Workers/chunk-XWOUPGUF.js create mode 100644 public/assets/cesium/Workers/chunk-YCDZX5LS.js create mode 100644 public/assets/cesium/Workers/chunk-YK3QIKY7.js create mode 100644 public/assets/cesium/Workers/chunk-YSIJTJ7N.js create mode 100644 public/assets/cesium/Workers/chunk-Z2QP3CXW.js create mode 100644 public/assets/cesium/Workers/chunk-ZVUUPJEM.js create mode 100644 public/assets/cesium/Workers/combineGeometry.js create mode 100644 public/assets/cesium/Workers/createBoxGeometry.js create mode 100644 public/assets/cesium/Workers/createBoxOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createCircleGeometry.js create mode 100644 public/assets/cesium/Workers/createCircleOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createCoplanarPolygonGeometry.js create mode 100644 public/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createCorridorGeometry.js create mode 100644 public/assets/cesium/Workers/createCorridorOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createCylinderGeometry.js create mode 100644 public/assets/cesium/Workers/createCylinderOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createEllipseGeometry.js create mode 100644 public/assets/cesium/Workers/createEllipseOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createEllipsoidGeometry.js create mode 100644 public/assets/cesium/Workers/createEllipsoidOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createFrustumGeometry.js create mode 100644 public/assets/cesium/Workers/createFrustumOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createGeometry.js create mode 100644 public/assets/cesium/Workers/createGroundPolylineGeometry.js create mode 100644 public/assets/cesium/Workers/createPlaneGeometry.js create mode 100644 public/assets/cesium/Workers/createPlaneOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createPolygonGeometry.js create mode 100644 public/assets/cesium/Workers/createPolygonOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createPolylineGeometry.js create mode 100644 public/assets/cesium/Workers/createPolylineVolumeGeometry.js create mode 100644 public/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createRectangleGeometry.js create mode 100644 public/assets/cesium/Workers/createRectangleOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createSimplePolylineGeometry.js create mode 100644 public/assets/cesium/Workers/createSphereGeometry.js create mode 100644 public/assets/cesium/Workers/createSphereOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/createTaskProcessorWorker.js create mode 100644 public/assets/cesium/Workers/createVectorTileClampedPolylines.js create mode 100644 public/assets/cesium/Workers/createVectorTileGeometries.js create mode 100644 public/assets/cesium/Workers/createVectorTilePoints.js create mode 100644 public/assets/cesium/Workers/createVectorTilePolygons.js create mode 100644 public/assets/cesium/Workers/createVectorTilePolylines.js create mode 100644 public/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js create mode 100644 public/assets/cesium/Workers/createVerticesFromHeightmap.js create mode 100644 public/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js create mode 100644 public/assets/cesium/Workers/createWallGeometry.js create mode 100644 public/assets/cesium/Workers/createWallOutlineGeometry.js create mode 100644 public/assets/cesium/Workers/decodeDraco.js create mode 100644 public/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js create mode 100644 public/assets/cesium/Workers/decodeI3S.js create mode 100644 public/assets/cesium/Workers/transcodeKTX2.js create mode 100644 public/assets/cesium/Workers/transferTypedArrayTest.js create mode 100644 public/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js create mode 100644 public/assets/core-cc7bf7de.js create mode 100644 public/assets/core.js create mode 100644 public/assets/favicon-128-4c4ce5df.png create mode 100644 public/assets/favicon-180-4c4ce5df.png create mode 100644 public/assets/favicon-192-4c4ce5df.png create mode 100644 public/assets/favicon-32-4c4ce5df.png create mode 100644 public/assets/favicon-4c4ce5df.svg create mode 100644 public/assets/font/OFL.txt create mode 100644 public/assets/font/TitilliumWeb-Regular-9ca076be.woff2 create mode 100644 public/assets/ol-f921df59.js create mode 100644 public/assets/ol.js create mode 100644 public/assets/style/icon-marker-70960f05.png create mode 100644 public/assets/style/icon-marker-blue-534e374b.png create mode 100644 public/assets/style/icon-marker-green-0b6a92bc.png create mode 100644 public/assets/style/icon-marker-o-036477fa.png create mode 100644 public/assets/style/icon-marker-o-blue-7b6d6279.png create mode 100644 public/assets/style/icon-marker-o-green-c863c0fa.png create mode 100644 public/assets/style/icon-marker-o-red-93ff58df.png create mode 100644 public/assets/style/icon-marker-red-313d03e8.png create mode 100644 public/assets/style/icon-pin-b7ce771e.png create mode 100644 public/assets/style/icon-pin-blue-7be369a3.png create mode 100644 public/assets/style/icon-pin-green-cbb935fe.png create mode 100644 public/assets/style/icon-pin-red-3f25b245.png create mode 100644 public/assets/ui-ec58c2c4.css create mode 100644 public/assets/ui-ec58c2c4.js create mode 100644 public/assets/ui.js create mode 100644 public/assets/vue-8f1c1746.js create mode 100644 public/assets/vue.js create mode 100644 public/assets/vuetify-2bdbde4d.css create mode 100644 public/assets/vuetify-2bdbde4d.js create mode 100644 public/assets/vuetify.js create mode 100644 public/configs/1be4e880-c1d9-4392-9278-261142556a98.json create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/10/537/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/10/538/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1075/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1075/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1076/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1076/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1077/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/11/1077/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2151/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2151/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2151/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2151/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2152/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2152/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2152/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2152/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2153/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2153/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2153/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2153/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2154/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2154/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2154/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/12/2154/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/googlemaps.html create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/leaflet.html create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/openlayers.html create mode 100644 public/datasource-data/superres_s3_2024-03-20_render/tilemapresource.xml create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/10/537/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/10/538/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1075/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1075/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1076/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1076/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1077/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/11/1077/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2151/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2151/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2151/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2151/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2152/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2152/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2152/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2152/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2153/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2153/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2153/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2153/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2154/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2154/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2154/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/12/2154/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/googlemaps.html create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/leaflet.html create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/openlayers.html create mode 100644 public/datasource-data/superres_s3_2024-06-08_render/tilemapresource.xml create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/10/537/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/10/538/671.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1075/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1075/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1076/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1076/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1077/1342.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/11/1077/1343.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2151/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2151/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2151/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2151/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2152/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2152/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2152/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2152/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2153/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2153/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2153/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2153/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2154/2684.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2154/2685.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2154/2686.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/12/2154/2687.jpg create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/googlemaps.html create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/leaflet.html create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/openlayers.html create mode 100644 public/datasource-data/superres_s3_2024-09-19_render/tilemapresource.xml create mode 100644 public/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..c336e61 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,14 @@ +image: alpine:latest + +stages: + - deploy + +pages: + stage: deploy + script: + - echo "Deploying to https://transfer.hft-stuttgart.de/pages/$CI_PROJECT_PATH/" + artifacts: + paths: + - public + only: + - master diff --git a/public/app.config.json b/public/app.config.json new file mode 100644 index 0000000..035a1ce --- /dev/null +++ b/public/app.config.json @@ -0,0 +1,9 @@ +{ + "_id": "8e48e340-60fa-49fe-b79c-c03b9ca8da64", + "name": "Space4iCity", + "description": "Space4iCity project application", + "properties": {}, + "modules": [ + "configs/1be4e880-c1d9-4392-9278-261142556a98.json" + ] +} \ No newline at end of file diff --git a/public/assets/@mdi/font/LICENSE b/public/assets/@mdi/font/LICENSE new file mode 100644 index 0000000..0bc8114 --- /dev/null +++ b/public/assets/@mdi/font/LICENSE @@ -0,0 +1,20 @@ +Pictogrammers Free License +-------------------------- + +This icon collection is released as free, open source, and GPL friendly by +the [Pictogrammers](http://pictogrammers.com/) icon group. You may use it +for commercial projects, open source projects, or anything really. + +# Icons: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) +Some of the icons are redistributed under the Apache 2.0 license. All other +icons are either redistributed under their respective licenses or are +distributed under the Apache 2.0 license. + +# Fonts: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) +All web and desktop fonts are distributed under the Apache 2.0 license. Web +and desktop fonts contain some icons that are redistributed under the Apache +2.0 license. All other icons are either redistributed under their respective +licenses or are distributed under the Apache 2.0 license. + +# Code: MIT (https://opensource.org/licenses/MIT) +The MIT license applies to all non-font and non-icon files. diff --git a/public/assets/@mdi/font/README.md b/public/assets/@mdi/font/README.md new file mode 100644 index 0000000..2ffefd6 --- /dev/null +++ b/public/assets/@mdi/font/README.md @@ -0,0 +1,25 @@ +> *Note:* Please use the main [MaterialDesign](https://github.com/Templarian/MaterialDesign/issues) repo to report issues. This repo is for distribution of the Webfont files only. + +# Webfont - Material Design Icons + +Webfont distribution for the [Material Design Icons](https://materialdesignicons.com). + +``` +npm install @mdi/font +``` + +> Package built with [@mdi/font-build](https://github.com/Templarian/MaterialDesign-Font-Build). + +## Related Packages + +[NPM @MDI Organization](https://npmjs.com/org/mdi) + +- JavaScript/Typescript: [MaterialDesign-JS](https://github.com/Templarian/MaterialDesign-JS) +- SVG: [MaterialDesign-SVG](https://github.com/Templarian/MaterialDesign-SVG) +- Font-Build [MaterialDesign-Font-Build](https://github.com/Templarian/MaterialDesign-Font-Build) +- Desktop Font: [MaterialDesign-Font](https://github.com/Templarian/MaterialDesign-Font) + +## Learn More + +- [MaterialDesignIcons.com](https://materialdesignicons.com) +- https://github.com/Templarian/MaterialDesign diff --git a/public/assets/@mdi/font/css/materialdesignicons.min-680621ca.css b/public/assets/@mdi/font/css/materialdesignicons.min-680621ca.css new file mode 100644 index 0000000..a4d5106 --- /dev/null +++ b/public/assets/@mdi/font/css/materialdesignicons.min-680621ca.css @@ -0,0 +1,3 @@ +@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.woff2?v=7.4.47") format("woff2");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing::before{content:"\F01C9"}.mdi-abacus::before{content:"\F16E0"}.mdi-abjad-arabic::before{content:"\F1328"}.mdi-abjad-hebrew::before{content:"\F1329"}.mdi-abugida-devanagari::before{content:"\F132A"}.mdi-abugida-thai::before{content:"\F132B"}.mdi-access-point::before{content:"\F0003"}.mdi-access-point-check::before{content:"\F1538"}.mdi-access-point-minus::before{content:"\F1539"}.mdi-access-point-network::before{content:"\F0002"}.mdi-access-point-network-off::before{content:"\F0BE1"}.mdi-access-point-off::before{content:"\F1511"}.mdi-access-point-plus::before{content:"\F153A"}.mdi-access-point-remove::before{content:"\F153B"}.mdi-account::before{content:"\F0004"}.mdi-account-alert::before{content:"\F0005"}.mdi-account-alert-outline::before{content:"\F0B50"}.mdi-account-arrow-down::before{content:"\F1868"}.mdi-account-arrow-down-outline::before{content:"\F1869"}.mdi-account-arrow-left::before{content:"\F0B51"}.mdi-account-arrow-left-outline::before{content:"\F0B52"}.mdi-account-arrow-right::before{content:"\F0B53"}.mdi-account-arrow-right-outline::before{content:"\F0B54"}.mdi-account-arrow-up::before{content:"\F1867"}.mdi-account-arrow-up-outline::before{content:"\F186A"}.mdi-account-badge::before{content:"\F1B0A"}.mdi-account-badge-outline::before{content:"\F1B0B"}.mdi-account-box::before{content:"\F0006"}.mdi-account-box-edit-outline::before{content:"\F1CC8"}.mdi-account-box-minus-outline::before{content:"\F1CC9"}.mdi-account-box-multiple::before{content:"\F0934"}.mdi-account-box-multiple-outline::before{content:"\F100A"}.mdi-account-box-outline::before{content:"\F0007"}.mdi-account-box-plus-outline::before{content:"\F1CCA"}.mdi-account-cancel::before{content:"\F12DF"}.mdi-account-cancel-outline::before{content:"\F12E0"}.mdi-account-card::before{content:"\F1BA4"}.mdi-account-card-outline::before{content:"\F1BA5"}.mdi-account-cash::before{content:"\F1097"}.mdi-account-cash-outline::before{content:"\F1098"}.mdi-account-check::before{content:"\F0008"}.mdi-account-check-outline::before{content:"\F0BE2"}.mdi-account-child::before{content:"\F0A89"}.mdi-account-child-circle::before{content:"\F0A8A"}.mdi-account-child-outline::before{content:"\F10C8"}.mdi-account-circle::before{content:"\F0009"}.mdi-account-circle-outline::before{content:"\F0B55"}.mdi-account-clock::before{content:"\F0B56"}.mdi-account-clock-outline::before{content:"\F0B57"}.mdi-account-cog::before{content:"\F1370"}.mdi-account-cog-outline::before{content:"\F1371"}.mdi-account-convert::before{content:"\F000A"}.mdi-account-convert-outline::before{content:"\F1301"}.mdi-account-cowboy-hat::before{content:"\F0E9B"}.mdi-account-cowboy-hat-outline::before{content:"\F17F3"}.mdi-account-credit-card::before{content:"\F1BA6"}.mdi-account-credit-card-outline::before{content:"\F1BA7"}.mdi-account-details::before{content:"\F0631"}.mdi-account-details-outline::before{content:"\F1372"}.mdi-account-edit::before{content:"\F06BC"}.mdi-account-edit-outline::before{content:"\F0FFB"}.mdi-account-eye::before{content:"\F0420"}.mdi-account-eye-outline::before{content:"\F127B"}.mdi-account-file::before{content:"\F1CA7"}.mdi-account-file-outline::before{content:"\F1CA8"}.mdi-account-file-text::before{content:"\F1CA9"}.mdi-account-file-text-outline::before{content:"\F1CAA"}.mdi-account-filter::before{content:"\F0936"}.mdi-account-filter-outline::before{content:"\F0F9D"}.mdi-account-group::before{content:"\F0849"}.mdi-account-group-outline::before{content:"\F0B58"}.mdi-account-hard-hat::before{content:"\F05B5"}.mdi-account-hard-hat-outline::before{content:"\F1A1F"}.mdi-account-heart::before{content:"\F0899"}.mdi-account-heart-outline::before{content:"\F0BE3"}.mdi-account-injury::before{content:"\F1815"}.mdi-account-injury-outline::before{content:"\F1816"}.mdi-account-key::before{content:"\F000B"}.mdi-account-key-outline::before{content:"\F0BE4"}.mdi-account-lock::before{content:"\F115E"}.mdi-account-lock-open::before{content:"\F1960"}.mdi-account-lock-open-outline::before{content:"\F1961"}.mdi-account-lock-outline::before{content:"\F115F"}.mdi-account-minus::before{content:"\F000D"}.mdi-account-minus-outline::before{content:"\F0AEC"}.mdi-account-multiple::before{content:"\F000E"}.mdi-account-multiple-check::before{content:"\F08C5"}.mdi-account-multiple-check-outline::before{content:"\F11FE"}.mdi-account-multiple-minus::before{content:"\F05D3"}.mdi-account-multiple-minus-outline::before{content:"\F0BE5"}.mdi-account-multiple-outline::before{content:"\F000F"}.mdi-account-multiple-plus::before{content:"\F0010"}.mdi-account-multiple-plus-outline::before{content:"\F0800"}.mdi-account-multiple-remove::before{content:"\F120A"}.mdi-account-multiple-remove-outline::before{content:"\F120B"}.mdi-account-music::before{content:"\F0803"}.mdi-account-music-outline::before{content:"\F0CE9"}.mdi-account-network::before{content:"\F0011"}.mdi-account-network-off::before{content:"\F1AF1"}.mdi-account-network-off-outline::before{content:"\F1AF2"}.mdi-account-network-outline::before{content:"\F0BE6"}.mdi-account-off::before{content:"\F0012"}.mdi-account-off-outline::before{content:"\F0BE7"}.mdi-account-outline::before{content:"\F0013"}.mdi-account-plus::before{content:"\F0014"}.mdi-account-plus-outline::before{content:"\F0801"}.mdi-account-question::before{content:"\F0B59"}.mdi-account-question-outline::before{content:"\F0B5A"}.mdi-account-reactivate::before{content:"\F152B"}.mdi-account-reactivate-outline::before{content:"\F152C"}.mdi-account-remove::before{content:"\F0015"}.mdi-account-remove-outline::before{content:"\F0AED"}.mdi-account-school::before{content:"\F1A20"}.mdi-account-school-outline::before{content:"\F1A21"}.mdi-account-search::before{content:"\F0016"}.mdi-account-search-outline::before{content:"\F0935"}.mdi-account-settings::before{content:"\F0630"}.mdi-account-settings-outline::before{content:"\F10C9"}.mdi-account-star::before{content:"\F0017"}.mdi-account-star-outline::before{content:"\F0BE8"}.mdi-account-supervisor::before{content:"\F0A8B"}.mdi-account-supervisor-circle::before{content:"\F0A8C"}.mdi-account-supervisor-circle-outline::before{content:"\F14EC"}.mdi-account-supervisor-outline::before{content:"\F112D"}.mdi-account-switch::before{content:"\F0019"}.mdi-account-switch-outline::before{content:"\F04CB"}.mdi-account-sync::before{content:"\F191B"}.mdi-account-sync-outline::before{content:"\F191C"}.mdi-account-tag::before{content:"\F1C1B"}.mdi-account-tag-outline::before{content:"\F1C1C"}.mdi-account-tie::before{content:"\F0CE3"}.mdi-account-tie-hat::before{content:"\F1898"}.mdi-account-tie-hat-outline::before{content:"\F1899"}.mdi-account-tie-outline::before{content:"\F10CA"}.mdi-account-tie-voice::before{content:"\F1308"}.mdi-account-tie-voice-off::before{content:"\F130A"}.mdi-account-tie-voice-off-outline::before{content:"\F130B"}.mdi-account-tie-voice-outline::before{content:"\F1309"}.mdi-account-tie-woman::before{content:"\F1A8C"}.mdi-account-voice::before{content:"\F05CB"}.mdi-account-voice-off::before{content:"\F0ED4"}.mdi-account-wrench::before{content:"\F189A"}.mdi-account-wrench-outline::before{content:"\F189B"}.mdi-adjust::before{content:"\F001A"}.mdi-advertisements::before{content:"\F192A"}.mdi-advertisements-off::before{content:"\F192B"}.mdi-air-conditioner::before{content:"\F001B"}.mdi-air-filter::before{content:"\F0D43"}.mdi-air-horn::before{content:"\F0DAC"}.mdi-air-humidifier::before{content:"\F1099"}.mdi-air-humidifier-off::before{content:"\F1466"}.mdi-air-purifier::before{content:"\F0D44"}.mdi-air-purifier-off::before{content:"\F1B57"}.mdi-airbag::before{content:"\F0BE9"}.mdi-airballoon::before{content:"\F001C"}.mdi-airballoon-outline::before{content:"\F100B"}.mdi-airplane::before{content:"\F001D"}.mdi-airplane-alert::before{content:"\F187A"}.mdi-airplane-check::before{content:"\F187B"}.mdi-airplane-clock::before{content:"\F187C"}.mdi-airplane-cog::before{content:"\F187D"}.mdi-airplane-edit::before{content:"\F187E"}.mdi-airplane-landing::before{content:"\F05D4"}.mdi-airplane-marker::before{content:"\F187F"}.mdi-airplane-minus::before{content:"\F1880"}.mdi-airplane-off::before{content:"\F001E"}.mdi-airplane-plus::before{content:"\F1881"}.mdi-airplane-remove::before{content:"\F1882"}.mdi-airplane-search::before{content:"\F1883"}.mdi-airplane-settings::before{content:"\F1884"}.mdi-airplane-takeoff::before{content:"\F05D5"}.mdi-airport::before{content:"\F084B"}.mdi-alarm::before{content:"\F0020"}.mdi-alarm-bell::before{content:"\F078E"}.mdi-alarm-check::before{content:"\F0021"}.mdi-alarm-light::before{content:"\F078F"}.mdi-alarm-light-off::before{content:"\F171E"}.mdi-alarm-light-off-outline::before{content:"\F171F"}.mdi-alarm-light-outline::before{content:"\F0BEA"}.mdi-alarm-multiple::before{content:"\F0022"}.mdi-alarm-note::before{content:"\F0E71"}.mdi-alarm-note-off::before{content:"\F0E72"}.mdi-alarm-off::before{content:"\F0023"}.mdi-alarm-panel::before{content:"\F15C4"}.mdi-alarm-panel-outline::before{content:"\F15C5"}.mdi-alarm-plus::before{content:"\F0024"}.mdi-alarm-snooze::before{content:"\F068E"}.mdi-album::before{content:"\F0025"}.mdi-alert::before{content:"\F0026"}.mdi-alert-box::before{content:"\F0027"}.mdi-alert-box-outline::before{content:"\F0CE4"}.mdi-alert-circle::before{content:"\F0028"}.mdi-alert-circle-check::before{content:"\F11ED"}.mdi-alert-circle-check-outline::before{content:"\F11EE"}.mdi-alert-circle-outline::before{content:"\F05D6"}.mdi-alert-decagram::before{content:"\F06BD"}.mdi-alert-decagram-outline::before{content:"\F0CE5"}.mdi-alert-minus::before{content:"\F14BB"}.mdi-alert-minus-outline::before{content:"\F14BE"}.mdi-alert-octagon::before{content:"\F0029"}.mdi-alert-octagon-outline::before{content:"\F0CE6"}.mdi-alert-octagram::before{content:"\F0767"}.mdi-alert-octagram-outline::before{content:"\F0CE7"}.mdi-alert-outline::before{content:"\F002A"}.mdi-alert-plus::before{content:"\F14BA"}.mdi-alert-plus-outline::before{content:"\F14BD"}.mdi-alert-remove::before{content:"\F14BC"}.mdi-alert-remove-outline::before{content:"\F14BF"}.mdi-alert-rhombus::before{content:"\F11CE"}.mdi-alert-rhombus-outline::before{content:"\F11CF"}.mdi-alien::before{content:"\F089A"}.mdi-alien-outline::before{content:"\F10CB"}.mdi-align-horizontal-center::before{content:"\F11C3"}.mdi-align-horizontal-distribute::before{content:"\F1962"}.mdi-align-horizontal-left::before{content:"\F11C2"}.mdi-align-horizontal-right::before{content:"\F11C4"}.mdi-align-vertical-bottom::before{content:"\F11C5"}.mdi-align-vertical-center::before{content:"\F11C6"}.mdi-align-vertical-distribute::before{content:"\F1963"}.mdi-align-vertical-top::before{content:"\F11C7"}.mdi-all-inclusive::before{content:"\F06BE"}.mdi-all-inclusive-box::before{content:"\F188D"}.mdi-all-inclusive-box-outline::before{content:"\F188E"}.mdi-allergy::before{content:"\F1258"}.mdi-alpha::before{content:"\F002B"}.mdi-alpha-a::before{content:"\F0AEE"}.mdi-alpha-a-box::before{content:"\F0B08"}.mdi-alpha-a-box-outline::before{content:"\F0BEB"}.mdi-alpha-a-circle::before{content:"\F0BEC"}.mdi-alpha-a-circle-outline::before{content:"\F0BED"}.mdi-alpha-b::before{content:"\F0AEF"}.mdi-alpha-b-box::before{content:"\F0B09"}.mdi-alpha-b-box-outline::before{content:"\F0BEE"}.mdi-alpha-b-circle::before{content:"\F0BEF"}.mdi-alpha-b-circle-outline::before{content:"\F0BF0"}.mdi-alpha-c::before{content:"\F0AF0"}.mdi-alpha-c-box::before{content:"\F0B0A"}.mdi-alpha-c-box-outline::before{content:"\F0BF1"}.mdi-alpha-c-circle::before{content:"\F0BF2"}.mdi-alpha-c-circle-outline::before{content:"\F0BF3"}.mdi-alpha-d::before{content:"\F0AF1"}.mdi-alpha-d-box::before{content:"\F0B0B"}.mdi-alpha-d-box-outline::before{content:"\F0BF4"}.mdi-alpha-d-circle::before{content:"\F0BF5"}.mdi-alpha-d-circle-outline::before{content:"\F0BF6"}.mdi-alpha-e::before{content:"\F0AF2"}.mdi-alpha-e-box::before{content:"\F0B0C"}.mdi-alpha-e-box-outline::before{content:"\F0BF7"}.mdi-alpha-e-circle::before{content:"\F0BF8"}.mdi-alpha-e-circle-outline::before{content:"\F0BF9"}.mdi-alpha-f::before{content:"\F0AF3"}.mdi-alpha-f-box::before{content:"\F0B0D"}.mdi-alpha-f-box-outline::before{content:"\F0BFA"}.mdi-alpha-f-circle::before{content:"\F0BFB"}.mdi-alpha-f-circle-outline::before{content:"\F0BFC"}.mdi-alpha-g::before{content:"\F0AF4"}.mdi-alpha-g-box::before{content:"\F0B0E"}.mdi-alpha-g-box-outline::before{content:"\F0BFD"}.mdi-alpha-g-circle::before{content:"\F0BFE"}.mdi-alpha-g-circle-outline::before{content:"\F0BFF"}.mdi-alpha-h::before{content:"\F0AF5"}.mdi-alpha-h-box::before{content:"\F0B0F"}.mdi-alpha-h-box-outline::before{content:"\F0C00"}.mdi-alpha-h-circle::before{content:"\F0C01"}.mdi-alpha-h-circle-outline::before{content:"\F0C02"}.mdi-alpha-i::before{content:"\F0AF6"}.mdi-alpha-i-box::before{content:"\F0B10"}.mdi-alpha-i-box-outline::before{content:"\F0C03"}.mdi-alpha-i-circle::before{content:"\F0C04"}.mdi-alpha-i-circle-outline::before{content:"\F0C05"}.mdi-alpha-j::before{content:"\F0AF7"}.mdi-alpha-j-box::before{content:"\F0B11"}.mdi-alpha-j-box-outline::before{content:"\F0C06"}.mdi-alpha-j-circle::before{content:"\F0C07"}.mdi-alpha-j-circle-outline::before{content:"\F0C08"}.mdi-alpha-k::before{content:"\F0AF8"}.mdi-alpha-k-box::before{content:"\F0B12"}.mdi-alpha-k-box-outline::before{content:"\F0C09"}.mdi-alpha-k-circle::before{content:"\F0C0A"}.mdi-alpha-k-circle-outline::before{content:"\F0C0B"}.mdi-alpha-l::before{content:"\F0AF9"}.mdi-alpha-l-box::before{content:"\F0B13"}.mdi-alpha-l-box-outline::before{content:"\F0C0C"}.mdi-alpha-l-circle::before{content:"\F0C0D"}.mdi-alpha-l-circle-outline::before{content:"\F0C0E"}.mdi-alpha-m::before{content:"\F0AFA"}.mdi-alpha-m-box::before{content:"\F0B14"}.mdi-alpha-m-box-outline::before{content:"\F0C0F"}.mdi-alpha-m-circle::before{content:"\F0C10"}.mdi-alpha-m-circle-outline::before{content:"\F0C11"}.mdi-alpha-n::before{content:"\F0AFB"}.mdi-alpha-n-box::before{content:"\F0B15"}.mdi-alpha-n-box-outline::before{content:"\F0C12"}.mdi-alpha-n-circle::before{content:"\F0C13"}.mdi-alpha-n-circle-outline::before{content:"\F0C14"}.mdi-alpha-o::before{content:"\F0AFC"}.mdi-alpha-o-box::before{content:"\F0B16"}.mdi-alpha-o-box-outline::before{content:"\F0C15"}.mdi-alpha-o-circle::before{content:"\F0C16"}.mdi-alpha-o-circle-outline::before{content:"\F0C17"}.mdi-alpha-p::before{content:"\F0AFD"}.mdi-alpha-p-box::before{content:"\F0B17"}.mdi-alpha-p-box-outline::before{content:"\F0C18"}.mdi-alpha-p-circle::before{content:"\F0C19"}.mdi-alpha-p-circle-outline::before{content:"\F0C1A"}.mdi-alpha-q::before{content:"\F0AFE"}.mdi-alpha-q-box::before{content:"\F0B18"}.mdi-alpha-q-box-outline::before{content:"\F0C1B"}.mdi-alpha-q-circle::before{content:"\F0C1C"}.mdi-alpha-q-circle-outline::before{content:"\F0C1D"}.mdi-alpha-r::before{content:"\F0AFF"}.mdi-alpha-r-box::before{content:"\F0B19"}.mdi-alpha-r-box-outline::before{content:"\F0C1E"}.mdi-alpha-r-circle::before{content:"\F0C1F"}.mdi-alpha-r-circle-outline::before{content:"\F0C20"}.mdi-alpha-s::before{content:"\F0B00"}.mdi-alpha-s-box::before{content:"\F0B1A"}.mdi-alpha-s-box-outline::before{content:"\F0C21"}.mdi-alpha-s-circle::before{content:"\F0C22"}.mdi-alpha-s-circle-outline::before{content:"\F0C23"}.mdi-alpha-t::before{content:"\F0B01"}.mdi-alpha-t-box::before{content:"\F0B1B"}.mdi-alpha-t-box-outline::before{content:"\F0C24"}.mdi-alpha-t-circle::before{content:"\F0C25"}.mdi-alpha-t-circle-outline::before{content:"\F0C26"}.mdi-alpha-u::before{content:"\F0B02"}.mdi-alpha-u-box::before{content:"\F0B1C"}.mdi-alpha-u-box-outline::before{content:"\F0C27"}.mdi-alpha-u-circle::before{content:"\F0C28"}.mdi-alpha-u-circle-outline::before{content:"\F0C29"}.mdi-alpha-v::before{content:"\F0B03"}.mdi-alpha-v-box::before{content:"\F0B1D"}.mdi-alpha-v-box-outline::before{content:"\F0C2A"}.mdi-alpha-v-circle::before{content:"\F0C2B"}.mdi-alpha-v-circle-outline::before{content:"\F0C2C"}.mdi-alpha-w::before{content:"\F0B04"}.mdi-alpha-w-box::before{content:"\F0B1E"}.mdi-alpha-w-box-outline::before{content:"\F0C2D"}.mdi-alpha-w-circle::before{content:"\F0C2E"}.mdi-alpha-w-circle-outline::before{content:"\F0C2F"}.mdi-alpha-x::before{content:"\F0B05"}.mdi-alpha-x-box::before{content:"\F0B1F"}.mdi-alpha-x-box-outline::before{content:"\F0C30"}.mdi-alpha-x-circle::before{content:"\F0C31"}.mdi-alpha-x-circle-outline::before{content:"\F0C32"}.mdi-alpha-y::before{content:"\F0B06"}.mdi-alpha-y-box::before{content:"\F0B20"}.mdi-alpha-y-box-outline::before{content:"\F0C33"}.mdi-alpha-y-circle::before{content:"\F0C34"}.mdi-alpha-y-circle-outline::before{content:"\F0C35"}.mdi-alpha-z::before{content:"\F0B07"}.mdi-alpha-z-box::before{content:"\F0B21"}.mdi-alpha-z-box-outline::before{content:"\F0C36"}.mdi-alpha-z-circle::before{content:"\F0C37"}.mdi-alpha-z-circle-outline::before{content:"\F0C38"}.mdi-alphabet-aurebesh::before{content:"\F132C"}.mdi-alphabet-cyrillic::before{content:"\F132D"}.mdi-alphabet-greek::before{content:"\F132E"}.mdi-alphabet-latin::before{content:"\F132F"}.mdi-alphabet-piqad::before{content:"\F1330"}.mdi-alphabet-tengwar::before{content:"\F1337"}.mdi-alphabetical::before{content:"\F002C"}.mdi-alphabetical-off::before{content:"\F100C"}.mdi-alphabetical-variant::before{content:"\F100D"}.mdi-alphabetical-variant-off::before{content:"\F100E"}.mdi-altimeter::before{content:"\F05D7"}.mdi-ambulance::before{content:"\F002F"}.mdi-ammunition::before{content:"\F0CE8"}.mdi-ampersand::before{content:"\F0A8D"}.mdi-amplifier::before{content:"\F0030"}.mdi-amplifier-off::before{content:"\F11B5"}.mdi-anchor::before{content:"\F0031"}.mdi-android::before{content:"\F0032"}.mdi-android-studio::before{content:"\F0034"}.mdi-angle-acute::before{content:"\F0937"}.mdi-angle-obtuse::before{content:"\F0938"}.mdi-angle-right::before{content:"\F0939"}.mdi-angular::before{content:"\F06B2"}.mdi-angularjs::before{content:"\F06BF"}.mdi-animation::before{content:"\F05D8"}.mdi-animation-outline::before{content:"\F0A8F"}.mdi-animation-play::before{content:"\F093A"}.mdi-animation-play-outline::before{content:"\F0A90"}.mdi-ansible::before{content:"\F109A"}.mdi-antenna::before{content:"\F1119"}.mdi-anvil::before{content:"\F089B"}.mdi-apache-kafka::before{content:"\F100F"}.mdi-api::before{content:"\F109B"}.mdi-api-off::before{content:"\F1257"}.mdi-apple::before{content:"\F0035"}.mdi-apple-finder::before{content:"\F0036"}.mdi-apple-icloud::before{content:"\F0038"}.mdi-apple-ios::before{content:"\F0037"}.mdi-apple-keyboard-caps::before{content:"\F0632"}.mdi-apple-keyboard-command::before{content:"\F0633"}.mdi-apple-keyboard-control::before{content:"\F0634"}.mdi-apple-keyboard-option::before{content:"\F0635"}.mdi-apple-keyboard-shift::before{content:"\F0636"}.mdi-apple-safari::before{content:"\F0039"}.mdi-application::before{content:"\F08C6"}.mdi-application-array::before{content:"\F10F5"}.mdi-application-array-outline::before{content:"\F10F6"}.mdi-application-braces::before{content:"\F10F7"}.mdi-application-braces-outline::before{content:"\F10F8"}.mdi-application-brackets::before{content:"\F0C8B"}.mdi-application-brackets-outline::before{content:"\F0C8C"}.mdi-application-cog::before{content:"\F0675"}.mdi-application-cog-outline::before{content:"\F1577"}.mdi-application-edit::before{content:"\F00AE"}.mdi-application-edit-outline::before{content:"\F0619"}.mdi-application-export::before{content:"\F0DAD"}.mdi-application-import::before{content:"\F0DAE"}.mdi-application-outline::before{content:"\F0614"}.mdi-application-parentheses::before{content:"\F10F9"}.mdi-application-parentheses-outline::before{content:"\F10FA"}.mdi-application-settings::before{content:"\F0B60"}.mdi-application-settings-outline::before{content:"\F1555"}.mdi-application-variable::before{content:"\F10FB"}.mdi-application-variable-outline::before{content:"\F10FC"}.mdi-approximately-equal::before{content:"\F0F9E"}.mdi-approximately-equal-box::before{content:"\F0F9F"}.mdi-apps::before{content:"\F003B"}.mdi-apps-box::before{content:"\F0D46"}.mdi-arch::before{content:"\F08C7"}.mdi-archive::before{content:"\F003C"}.mdi-archive-alert::before{content:"\F14FD"}.mdi-archive-alert-outline::before{content:"\F14FE"}.mdi-archive-arrow-down::before{content:"\F1259"}.mdi-archive-arrow-down-outline::before{content:"\F125A"}.mdi-archive-arrow-up::before{content:"\F125B"}.mdi-archive-arrow-up-outline::before{content:"\F125C"}.mdi-archive-cancel::before{content:"\F174B"}.mdi-archive-cancel-outline::before{content:"\F174C"}.mdi-archive-check::before{content:"\F174D"}.mdi-archive-check-outline::before{content:"\F174E"}.mdi-archive-clock::before{content:"\F174F"}.mdi-archive-clock-outline::before{content:"\F1750"}.mdi-archive-cog::before{content:"\F1751"}.mdi-archive-cog-outline::before{content:"\F1752"}.mdi-archive-edit::before{content:"\F1753"}.mdi-archive-edit-outline::before{content:"\F1754"}.mdi-archive-eye::before{content:"\F1755"}.mdi-archive-eye-outline::before{content:"\F1756"}.mdi-archive-lock::before{content:"\F1757"}.mdi-archive-lock-open::before{content:"\F1758"}.mdi-archive-lock-open-outline::before{content:"\F1759"}.mdi-archive-lock-outline::before{content:"\F175A"}.mdi-archive-marker::before{content:"\F175B"}.mdi-archive-marker-outline::before{content:"\F175C"}.mdi-archive-minus::before{content:"\F175D"}.mdi-archive-minus-outline::before{content:"\F175E"}.mdi-archive-music::before{content:"\F175F"}.mdi-archive-music-outline::before{content:"\F1760"}.mdi-archive-off::before{content:"\F1761"}.mdi-archive-off-outline::before{content:"\F1762"}.mdi-archive-outline::before{content:"\F120E"}.mdi-archive-plus::before{content:"\F1763"}.mdi-archive-plus-outline::before{content:"\F1764"}.mdi-archive-refresh::before{content:"\F1765"}.mdi-archive-refresh-outline::before{content:"\F1766"}.mdi-archive-remove::before{content:"\F1767"}.mdi-archive-remove-outline::before{content:"\F1768"}.mdi-archive-search::before{content:"\F1769"}.mdi-archive-search-outline::before{content:"\F176A"}.mdi-archive-settings::before{content:"\F176B"}.mdi-archive-settings-outline::before{content:"\F176C"}.mdi-archive-star::before{content:"\F176D"}.mdi-archive-star-outline::before{content:"\F176E"}.mdi-archive-sync::before{content:"\F176F"}.mdi-archive-sync-outline::before{content:"\F1770"}.mdi-arm-flex::before{content:"\F0FD7"}.mdi-arm-flex-outline::before{content:"\F0FD6"}.mdi-arrange-bring-forward::before{content:"\F003D"}.mdi-arrange-bring-to-front::before{content:"\F003E"}.mdi-arrange-send-backward::before{content:"\F003F"}.mdi-arrange-send-to-back::before{content:"\F0040"}.mdi-arrow-all::before{content:"\F0041"}.mdi-arrow-bottom-left::before{content:"\F0042"}.mdi-arrow-bottom-left-bold-box::before{content:"\F1964"}.mdi-arrow-bottom-left-bold-box-outline::before{content:"\F1965"}.mdi-arrow-bottom-left-bold-outline::before{content:"\F09B7"}.mdi-arrow-bottom-left-thick::before{content:"\F09B8"}.mdi-arrow-bottom-left-thin::before{content:"\F19B6"}.mdi-arrow-bottom-left-thin-circle-outline::before{content:"\F1596"}.mdi-arrow-bottom-right::before{content:"\F0043"}.mdi-arrow-bottom-right-bold-box::before{content:"\F1966"}.mdi-arrow-bottom-right-bold-box-outline::before{content:"\F1967"}.mdi-arrow-bottom-right-bold-outline::before{content:"\F09B9"}.mdi-arrow-bottom-right-thick::before{content:"\F09BA"}.mdi-arrow-bottom-right-thin::before{content:"\F19B7"}.mdi-arrow-bottom-right-thin-circle-outline::before{content:"\F1595"}.mdi-arrow-collapse::before{content:"\F0615"}.mdi-arrow-collapse-all::before{content:"\F0044"}.mdi-arrow-collapse-down::before{content:"\F0792"}.mdi-arrow-collapse-horizontal::before{content:"\F084C"}.mdi-arrow-collapse-left::before{content:"\F0793"}.mdi-arrow-collapse-right::before{content:"\F0794"}.mdi-arrow-collapse-up::before{content:"\F0795"}.mdi-arrow-collapse-vertical::before{content:"\F084D"}.mdi-arrow-decision::before{content:"\F09BB"}.mdi-arrow-decision-auto::before{content:"\F09BC"}.mdi-arrow-decision-auto-outline::before{content:"\F09BD"}.mdi-arrow-decision-outline::before{content:"\F09BE"}.mdi-arrow-down::before{content:"\F0045"}.mdi-arrow-down-bold::before{content:"\F072E"}.mdi-arrow-down-bold-box::before{content:"\F072F"}.mdi-arrow-down-bold-box-outline::before{content:"\F0730"}.mdi-arrow-down-bold-circle::before{content:"\F0047"}.mdi-arrow-down-bold-circle-outline::before{content:"\F0048"}.mdi-arrow-down-bold-hexagon-outline::before{content:"\F0049"}.mdi-arrow-down-bold-outline::before{content:"\F09BF"}.mdi-arrow-down-box::before{content:"\F06C0"}.mdi-arrow-down-circle::before{content:"\F0CDB"}.mdi-arrow-down-circle-outline::before{content:"\F0CDC"}.mdi-arrow-down-drop-circle::before{content:"\F004A"}.mdi-arrow-down-drop-circle-outline::before{content:"\F004B"}.mdi-arrow-down-left::before{content:"\F17A1"}.mdi-arrow-down-left-bold::before{content:"\F17A2"}.mdi-arrow-down-right::before{content:"\F17A3"}.mdi-arrow-down-right-bold::before{content:"\F17A4"}.mdi-arrow-down-thick::before{content:"\F0046"}.mdi-arrow-down-thin::before{content:"\F19B3"}.mdi-arrow-down-thin-circle-outline::before{content:"\F1599"}.mdi-arrow-expand::before{content:"\F0616"}.mdi-arrow-expand-all::before{content:"\F004C"}.mdi-arrow-expand-down::before{content:"\F0796"}.mdi-arrow-expand-horizontal::before{content:"\F084E"}.mdi-arrow-expand-left::before{content:"\F0797"}.mdi-arrow-expand-right::before{content:"\F0798"}.mdi-arrow-expand-up::before{content:"\F0799"}.mdi-arrow-expand-vertical::before{content:"\F084F"}.mdi-arrow-horizontal-lock::before{content:"\F115B"}.mdi-arrow-left::before{content:"\F004D"}.mdi-arrow-left-bold::before{content:"\F0731"}.mdi-arrow-left-bold-box::before{content:"\F0732"}.mdi-arrow-left-bold-box-outline::before{content:"\F0733"}.mdi-arrow-left-bold-circle::before{content:"\F004F"}.mdi-arrow-left-bold-circle-outline::before{content:"\F0050"}.mdi-arrow-left-bold-hexagon-outline::before{content:"\F0051"}.mdi-arrow-left-bold-outline::before{content:"\F09C0"}.mdi-arrow-left-bottom::before{content:"\F17A5"}.mdi-arrow-left-bottom-bold::before{content:"\F17A6"}.mdi-arrow-left-box::before{content:"\F06C1"}.mdi-arrow-left-circle::before{content:"\F0CDD"}.mdi-arrow-left-circle-outline::before{content:"\F0CDE"}.mdi-arrow-left-drop-circle::before{content:"\F0052"}.mdi-arrow-left-drop-circle-outline::before{content:"\F0053"}.mdi-arrow-left-right::before{content:"\F0E73"}.mdi-arrow-left-right-bold::before{content:"\F0E74"}.mdi-arrow-left-right-bold-outline::before{content:"\F09C1"}.mdi-arrow-left-thick::before{content:"\F004E"}.mdi-arrow-left-thin::before{content:"\F19B1"}.mdi-arrow-left-thin-circle-outline::before{content:"\F159A"}.mdi-arrow-left-top::before{content:"\F17A7"}.mdi-arrow-left-top-bold::before{content:"\F17A8"}.mdi-arrow-oscillating::before{content:"\F1C91"}.mdi-arrow-oscillating-off::before{content:"\F1C92"}.mdi-arrow-projectile::before{content:"\F1840"}.mdi-arrow-projectile-multiple::before{content:"\F183F"}.mdi-arrow-right::before{content:"\F0054"}.mdi-arrow-right-bold::before{content:"\F0734"}.mdi-arrow-right-bold-box::before{content:"\F0735"}.mdi-arrow-right-bold-box-outline::before{content:"\F0736"}.mdi-arrow-right-bold-circle::before{content:"\F0056"}.mdi-arrow-right-bold-circle-outline::before{content:"\F0057"}.mdi-arrow-right-bold-hexagon-outline::before{content:"\F0058"}.mdi-arrow-right-bold-outline::before{content:"\F09C2"}.mdi-arrow-right-bottom::before{content:"\F17A9"}.mdi-arrow-right-bottom-bold::before{content:"\F17AA"}.mdi-arrow-right-box::before{content:"\F06C2"}.mdi-arrow-right-circle::before{content:"\F0CDF"}.mdi-arrow-right-circle-outline::before{content:"\F0CE0"}.mdi-arrow-right-drop-circle::before{content:"\F0059"}.mdi-arrow-right-drop-circle-outline::before{content:"\F005A"}.mdi-arrow-right-thick::before{content:"\F0055"}.mdi-arrow-right-thin::before{content:"\F19B0"}.mdi-arrow-right-thin-circle-outline::before{content:"\F1598"}.mdi-arrow-right-top::before{content:"\F17AB"}.mdi-arrow-right-top-bold::before{content:"\F17AC"}.mdi-arrow-split-horizontal::before{content:"\F093B"}.mdi-arrow-split-vertical::before{content:"\F093C"}.mdi-arrow-top-left::before{content:"\F005B"}.mdi-arrow-top-left-bold-box::before{content:"\F1968"}.mdi-arrow-top-left-bold-box-outline::before{content:"\F1969"}.mdi-arrow-top-left-bold-outline::before{content:"\F09C3"}.mdi-arrow-top-left-bottom-right::before{content:"\F0E75"}.mdi-arrow-top-left-bottom-right-bold::before{content:"\F0E76"}.mdi-arrow-top-left-thick::before{content:"\F09C4"}.mdi-arrow-top-left-thin::before{content:"\F19B5"}.mdi-arrow-top-left-thin-circle-outline::before{content:"\F1593"}.mdi-arrow-top-right::before{content:"\F005C"}.mdi-arrow-top-right-bold-box::before{content:"\F196A"}.mdi-arrow-top-right-bold-box-outline::before{content:"\F196B"}.mdi-arrow-top-right-bold-outline::before{content:"\F09C5"}.mdi-arrow-top-right-bottom-left::before{content:"\F0E77"}.mdi-arrow-top-right-bottom-left-bold::before{content:"\F0E78"}.mdi-arrow-top-right-thick::before{content:"\F09C6"}.mdi-arrow-top-right-thin::before{content:"\F19B4"}.mdi-arrow-top-right-thin-circle-outline::before{content:"\F1594"}.mdi-arrow-u-down-left::before{content:"\F17AD"}.mdi-arrow-u-down-left-bold::before{content:"\F17AE"}.mdi-arrow-u-down-right::before{content:"\F17AF"}.mdi-arrow-u-down-right-bold::before{content:"\F17B0"}.mdi-arrow-u-left-bottom::before{content:"\F17B1"}.mdi-arrow-u-left-bottom-bold::before{content:"\F17B2"}.mdi-arrow-u-left-top::before{content:"\F17B3"}.mdi-arrow-u-left-top-bold::before{content:"\F17B4"}.mdi-arrow-u-right-bottom::before{content:"\F17B5"}.mdi-arrow-u-right-bottom-bold::before{content:"\F17B6"}.mdi-arrow-u-right-top::before{content:"\F17B7"}.mdi-arrow-u-right-top-bold::before{content:"\F17B8"}.mdi-arrow-u-up-left::before{content:"\F17B9"}.mdi-arrow-u-up-left-bold::before{content:"\F17BA"}.mdi-arrow-u-up-right::before{content:"\F17BB"}.mdi-arrow-u-up-right-bold::before{content:"\F17BC"}.mdi-arrow-up::before{content:"\F005D"}.mdi-arrow-up-bold::before{content:"\F0737"}.mdi-arrow-up-bold-box::before{content:"\F0738"}.mdi-arrow-up-bold-box-outline::before{content:"\F0739"}.mdi-arrow-up-bold-circle::before{content:"\F005F"}.mdi-arrow-up-bold-circle-outline::before{content:"\F0060"}.mdi-arrow-up-bold-hexagon-outline::before{content:"\F0061"}.mdi-arrow-up-bold-outline::before{content:"\F09C7"}.mdi-arrow-up-box::before{content:"\F06C3"}.mdi-arrow-up-circle::before{content:"\F0CE1"}.mdi-arrow-up-circle-outline::before{content:"\F0CE2"}.mdi-arrow-up-down::before{content:"\F0E79"}.mdi-arrow-up-down-bold::before{content:"\F0E7A"}.mdi-arrow-up-down-bold-outline::before{content:"\F09C8"}.mdi-arrow-up-drop-circle::before{content:"\F0062"}.mdi-arrow-up-drop-circle-outline::before{content:"\F0063"}.mdi-arrow-up-left::before{content:"\F17BD"}.mdi-arrow-up-left-bold::before{content:"\F17BE"}.mdi-arrow-up-right::before{content:"\F17BF"}.mdi-arrow-up-right-bold::before{content:"\F17C0"}.mdi-arrow-up-thick::before{content:"\F005E"}.mdi-arrow-up-thin::before{content:"\F19B2"}.mdi-arrow-up-thin-circle-outline::before{content:"\F1597"}.mdi-arrow-vertical-lock::before{content:"\F115C"}.mdi-artboard::before{content:"\F1B9A"}.mdi-artstation::before{content:"\F0B5B"}.mdi-aspect-ratio::before{content:"\F0A24"}.mdi-assistant::before{content:"\F0064"}.mdi-asterisk::before{content:"\F06C4"}.mdi-asterisk-circle-outline::before{content:"\F1A27"}.mdi-at::before{content:"\F0065"}.mdi-atlassian::before{content:"\F0804"}.mdi-atm::before{content:"\F0D47"}.mdi-atom::before{content:"\F0768"}.mdi-atom-variant::before{content:"\F0E7B"}.mdi-attachment::before{content:"\F0066"}.mdi-attachment-check::before{content:"\F1AC1"}.mdi-attachment-lock::before{content:"\F19C4"}.mdi-attachment-minus::before{content:"\F1AC2"}.mdi-attachment-off::before{content:"\F1AC3"}.mdi-attachment-plus::before{content:"\F1AC4"}.mdi-attachment-remove::before{content:"\F1AC5"}.mdi-atv::before{content:"\F1B70"}.mdi-audio-input-rca::before{content:"\F186B"}.mdi-audio-input-stereo-minijack::before{content:"\F186C"}.mdi-audio-input-xlr::before{content:"\F186D"}.mdi-audio-video::before{content:"\F093D"}.mdi-audio-video-off::before{content:"\F11B6"}.mdi-augmented-reality::before{content:"\F0850"}.mdi-aurora::before{content:"\F1BB9"}.mdi-auto-download::before{content:"\F137E"}.mdi-auto-fix::before{content:"\F0068"}.mdi-auto-mode::before{content:"\F1C20"}.mdi-auto-upload::before{content:"\F0069"}.mdi-autorenew::before{content:"\F006A"}.mdi-autorenew-off::before{content:"\F19E7"}.mdi-av-timer::before{content:"\F006B"}.mdi-awning::before{content:"\F1B87"}.mdi-awning-outline::before{content:"\F1B88"}.mdi-aws::before{content:"\F0E0F"}.mdi-axe::before{content:"\F08C8"}.mdi-axe-battle::before{content:"\F1842"}.mdi-axis::before{content:"\F0D48"}.mdi-axis-arrow::before{content:"\F0D49"}.mdi-axis-arrow-info::before{content:"\F140E"}.mdi-axis-arrow-lock::before{content:"\F0D4A"}.mdi-axis-lock::before{content:"\F0D4B"}.mdi-axis-x-arrow::before{content:"\F0D4C"}.mdi-axis-x-arrow-lock::before{content:"\F0D4D"}.mdi-axis-x-rotate-clockwise::before{content:"\F0D4E"}.mdi-axis-x-rotate-counterclockwise::before{content:"\F0D4F"}.mdi-axis-x-y-arrow-lock::before{content:"\F0D50"}.mdi-axis-y-arrow::before{content:"\F0D51"}.mdi-axis-y-arrow-lock::before{content:"\F0D52"}.mdi-axis-y-rotate-clockwise::before{content:"\F0D53"}.mdi-axis-y-rotate-counterclockwise::before{content:"\F0D54"}.mdi-axis-z-arrow::before{content:"\F0D55"}.mdi-axis-z-arrow-lock::before{content:"\F0D56"}.mdi-axis-z-rotate-clockwise::before{content:"\F0D57"}.mdi-axis-z-rotate-counterclockwise::before{content:"\F0D58"}.mdi-babel::before{content:"\F0A25"}.mdi-baby::before{content:"\F006C"}.mdi-baby-bottle::before{content:"\F0F39"}.mdi-baby-bottle-outline::before{content:"\F0F3A"}.mdi-baby-buggy::before{content:"\F13E0"}.mdi-baby-buggy-off::before{content:"\F1AF3"}.mdi-baby-carriage::before{content:"\F068F"}.mdi-baby-carriage-off::before{content:"\F0FA0"}.mdi-baby-face::before{content:"\F0E7C"}.mdi-baby-face-outline::before{content:"\F0E7D"}.mdi-backburger::before{content:"\F006D"}.mdi-backspace::before{content:"\F006E"}.mdi-backspace-outline::before{content:"\F0B5C"}.mdi-backspace-reverse::before{content:"\F0E7E"}.mdi-backspace-reverse-outline::before{content:"\F0E7F"}.mdi-backup-restore::before{content:"\F006F"}.mdi-bacteria::before{content:"\F0ED5"}.mdi-bacteria-outline::before{content:"\F0ED6"}.mdi-badge-account::before{content:"\F0DA7"}.mdi-badge-account-alert::before{content:"\F0DA8"}.mdi-badge-account-alert-outline::before{content:"\F0DA9"}.mdi-badge-account-horizontal::before{content:"\F0E0D"}.mdi-badge-account-horizontal-outline::before{content:"\F0E0E"}.mdi-badge-account-outline::before{content:"\F0DAA"}.mdi-badminton::before{content:"\F0851"}.mdi-bag-carry-on::before{content:"\F0F3B"}.mdi-bag-carry-on-check::before{content:"\F0D65"}.mdi-bag-carry-on-off::before{content:"\F0F3C"}.mdi-bag-checked::before{content:"\F0F3D"}.mdi-bag-personal::before{content:"\F0E10"}.mdi-bag-personal-off::before{content:"\F0E11"}.mdi-bag-personal-off-outline::before{content:"\F0E12"}.mdi-bag-personal-outline::before{content:"\F0E13"}.mdi-bag-personal-plus::before{content:"\F1CA4"}.mdi-bag-personal-plus-outline::before{content:"\F1CA5"}.mdi-bag-personal-tag::before{content:"\F1B0C"}.mdi-bag-personal-tag-outline::before{content:"\F1B0D"}.mdi-bag-suitcase::before{content:"\F158B"}.mdi-bag-suitcase-off::before{content:"\F158D"}.mdi-bag-suitcase-off-outline::before{content:"\F158E"}.mdi-bag-suitcase-outline::before{content:"\F158C"}.mdi-baguette::before{content:"\F0F3E"}.mdi-balcony::before{content:"\F1817"}.mdi-balloon::before{content:"\F0A26"}.mdi-ballot::before{content:"\F09C9"}.mdi-ballot-outline::before{content:"\F09CA"}.mdi-ballot-recount::before{content:"\F0C39"}.mdi-ballot-recount-outline::before{content:"\F0C3A"}.mdi-bandage::before{content:"\F0DAF"}.mdi-bank::before{content:"\F0070"}.mdi-bank-check::before{content:"\F1655"}.mdi-bank-circle::before{content:"\F1C03"}.mdi-bank-circle-outline::before{content:"\F1C04"}.mdi-bank-minus::before{content:"\F0DB0"}.mdi-bank-off::before{content:"\F1656"}.mdi-bank-off-outline::before{content:"\F1657"}.mdi-bank-outline::before{content:"\F0E80"}.mdi-bank-plus::before{content:"\F0DB1"}.mdi-bank-remove::before{content:"\F0DB2"}.mdi-bank-transfer::before{content:"\F0A27"}.mdi-bank-transfer-in::before{content:"\F0A28"}.mdi-bank-transfer-out::before{content:"\F0A29"}.mdi-barcode::before{content:"\F0071"}.mdi-barcode-off::before{content:"\F1236"}.mdi-barcode-scan::before{content:"\F0072"}.mdi-barley::before{content:"\F0073"}.mdi-barley-off::before{content:"\F0B5D"}.mdi-barn::before{content:"\F0B5E"}.mdi-barrel::before{content:"\F0074"}.mdi-barrel-outline::before{content:"\F1A28"}.mdi-baseball::before{content:"\F0852"}.mdi-baseball-bat::before{content:"\F0853"}.mdi-baseball-diamond::before{content:"\F15EC"}.mdi-baseball-diamond-outline::before{content:"\F15ED"}.mdi-baseball-outline::before{content:"\F1C5A"}.mdi-bash::before{content:"\F1183"}.mdi-basket::before{content:"\F0076"}.mdi-basket-check::before{content:"\F18E5"}.mdi-basket-check-outline::before{content:"\F18E6"}.mdi-basket-fill::before{content:"\F0077"}.mdi-basket-minus::before{content:"\F1523"}.mdi-basket-minus-outline::before{content:"\F1524"}.mdi-basket-off::before{content:"\F1525"}.mdi-basket-off-outline::before{content:"\F1526"}.mdi-basket-outline::before{content:"\F1181"}.mdi-basket-plus::before{content:"\F1527"}.mdi-basket-plus-outline::before{content:"\F1528"}.mdi-basket-remove::before{content:"\F1529"}.mdi-basket-remove-outline::before{content:"\F152A"}.mdi-basket-unfill::before{content:"\F0078"}.mdi-basketball::before{content:"\F0806"}.mdi-basketball-hoop::before{content:"\F0C3B"}.mdi-basketball-hoop-outline::before{content:"\F0C3C"}.mdi-bat::before{content:"\F0B5F"}.mdi-bathtub::before{content:"\F1818"}.mdi-bathtub-outline::before{content:"\F1819"}.mdi-battery::before{content:"\F0079"}.mdi-battery-10::before{content:"\F007A"}.mdi-battery-10-bluetooth::before{content:"\F093E"}.mdi-battery-20::before{content:"\F007B"}.mdi-battery-20-bluetooth::before{content:"\F093F"}.mdi-battery-30::before{content:"\F007C"}.mdi-battery-30-bluetooth::before{content:"\F0940"}.mdi-battery-40::before{content:"\F007D"}.mdi-battery-40-bluetooth::before{content:"\F0941"}.mdi-battery-50::before{content:"\F007E"}.mdi-battery-50-bluetooth::before{content:"\F0942"}.mdi-battery-60::before{content:"\F007F"}.mdi-battery-60-bluetooth::before{content:"\F0943"}.mdi-battery-70::before{content:"\F0080"}.mdi-battery-70-bluetooth::before{content:"\F0944"}.mdi-battery-80::before{content:"\F0081"}.mdi-battery-80-bluetooth::before{content:"\F0945"}.mdi-battery-90::before{content:"\F0082"}.mdi-battery-90-bluetooth::before{content:"\F0946"}.mdi-battery-alert::before{content:"\F0083"}.mdi-battery-alert-bluetooth::before{content:"\F0947"}.mdi-battery-alert-variant::before{content:"\F10CC"}.mdi-battery-alert-variant-outline::before{content:"\F10CD"}.mdi-battery-arrow-down::before{content:"\F17DE"}.mdi-battery-arrow-down-outline::before{content:"\F17DF"}.mdi-battery-arrow-up::before{content:"\F17E0"}.mdi-battery-arrow-up-outline::before{content:"\F17E1"}.mdi-battery-bluetooth::before{content:"\F0948"}.mdi-battery-bluetooth-variant::before{content:"\F0949"}.mdi-battery-charging::before{content:"\F0084"}.mdi-battery-charging-10::before{content:"\F089C"}.mdi-battery-charging-100::before{content:"\F0085"}.mdi-battery-charging-20::before{content:"\F0086"}.mdi-battery-charging-30::before{content:"\F0087"}.mdi-battery-charging-40::before{content:"\F0088"}.mdi-battery-charging-50::before{content:"\F089D"}.mdi-battery-charging-60::before{content:"\F0089"}.mdi-battery-charging-70::before{content:"\F089E"}.mdi-battery-charging-80::before{content:"\F008A"}.mdi-battery-charging-90::before{content:"\F008B"}.mdi-battery-charging-high::before{content:"\F12A6"}.mdi-battery-charging-low::before{content:"\F12A4"}.mdi-battery-charging-medium::before{content:"\F12A5"}.mdi-battery-charging-outline::before{content:"\F089F"}.mdi-battery-charging-wireless::before{content:"\F0807"}.mdi-battery-charging-wireless-10::before{content:"\F0808"}.mdi-battery-charging-wireless-20::before{content:"\F0809"}.mdi-battery-charging-wireless-30::before{content:"\F080A"}.mdi-battery-charging-wireless-40::before{content:"\F080B"}.mdi-battery-charging-wireless-50::before{content:"\F080C"}.mdi-battery-charging-wireless-60::before{content:"\F080D"}.mdi-battery-charging-wireless-70::before{content:"\F080E"}.mdi-battery-charging-wireless-80::before{content:"\F080F"}.mdi-battery-charging-wireless-90::before{content:"\F0810"}.mdi-battery-charging-wireless-alert::before{content:"\F0811"}.mdi-battery-charging-wireless-outline::before{content:"\F0812"}.mdi-battery-check::before{content:"\F17E2"}.mdi-battery-check-outline::before{content:"\F17E3"}.mdi-battery-clock::before{content:"\F19E5"}.mdi-battery-clock-outline::before{content:"\F19E6"}.mdi-battery-heart::before{content:"\F120F"}.mdi-battery-heart-outline::before{content:"\F1210"}.mdi-battery-heart-variant::before{content:"\F1211"}.mdi-battery-high::before{content:"\F12A3"}.mdi-battery-lock::before{content:"\F179C"}.mdi-battery-lock-open::before{content:"\F179D"}.mdi-battery-low::before{content:"\F12A1"}.mdi-battery-medium::before{content:"\F12A2"}.mdi-battery-minus::before{content:"\F17E4"}.mdi-battery-minus-outline::before{content:"\F17E5"}.mdi-battery-minus-variant::before{content:"\F008C"}.mdi-battery-negative::before{content:"\F008D"}.mdi-battery-off::before{content:"\F125D"}.mdi-battery-off-outline::before{content:"\F125E"}.mdi-battery-outline::before{content:"\F008E"}.mdi-battery-plus::before{content:"\F17E6"}.mdi-battery-plus-outline::before{content:"\F17E7"}.mdi-battery-plus-variant::before{content:"\F008F"}.mdi-battery-positive::before{content:"\F0090"}.mdi-battery-remove::before{content:"\F17E8"}.mdi-battery-remove-outline::before{content:"\F17E9"}.mdi-battery-sync::before{content:"\F1834"}.mdi-battery-sync-outline::before{content:"\F1835"}.mdi-battery-unknown::before{content:"\F0091"}.mdi-battery-unknown-bluetooth::before{content:"\F094A"}.mdi-beach::before{content:"\F0092"}.mdi-beaker::before{content:"\F0CEA"}.mdi-beaker-alert::before{content:"\F1229"}.mdi-beaker-alert-outline::before{content:"\F122A"}.mdi-beaker-check::before{content:"\F122B"}.mdi-beaker-check-outline::before{content:"\F122C"}.mdi-beaker-minus::before{content:"\F122D"}.mdi-beaker-minus-outline::before{content:"\F122E"}.mdi-beaker-outline::before{content:"\F0690"}.mdi-beaker-plus::before{content:"\F122F"}.mdi-beaker-plus-outline::before{content:"\F1230"}.mdi-beaker-question::before{content:"\F1231"}.mdi-beaker-question-outline::before{content:"\F1232"}.mdi-beaker-remove::before{content:"\F1233"}.mdi-beaker-remove-outline::before{content:"\F1234"}.mdi-bed::before{content:"\F02E3"}.mdi-bed-clock::before{content:"\F1B94"}.mdi-bed-double::before{content:"\F0FD4"}.mdi-bed-double-outline::before{content:"\F0FD3"}.mdi-bed-empty::before{content:"\F08A0"}.mdi-bed-king::before{content:"\F0FD2"}.mdi-bed-king-outline::before{content:"\F0FD1"}.mdi-bed-outline::before{content:"\F0099"}.mdi-bed-queen::before{content:"\F0FD0"}.mdi-bed-queen-outline::before{content:"\F0FDB"}.mdi-bed-single::before{content:"\F106D"}.mdi-bed-single-outline::before{content:"\F106E"}.mdi-bee::before{content:"\F0FA1"}.mdi-bee-flower::before{content:"\F0FA2"}.mdi-beehive-off-outline::before{content:"\F13ED"}.mdi-beehive-outline::before{content:"\F10CE"}.mdi-beekeeper::before{content:"\F14E2"}.mdi-beer::before{content:"\F0098"}.mdi-beer-outline::before{content:"\F130C"}.mdi-bell::before{content:"\F009A"}.mdi-bell-alert::before{content:"\F0D59"}.mdi-bell-alert-outline::before{content:"\F0E81"}.mdi-bell-badge::before{content:"\F116B"}.mdi-bell-badge-outline::before{content:"\F0178"}.mdi-bell-cancel::before{content:"\F13E7"}.mdi-bell-cancel-outline::before{content:"\F13E8"}.mdi-bell-check::before{content:"\F11E5"}.mdi-bell-check-outline::before{content:"\F11E6"}.mdi-bell-circle::before{content:"\F0D5A"}.mdi-bell-circle-outline::before{content:"\F0D5B"}.mdi-bell-cog::before{content:"\F1A29"}.mdi-bell-cog-outline::before{content:"\F1A2A"}.mdi-bell-minus::before{content:"\F13E9"}.mdi-bell-minus-outline::before{content:"\F13EA"}.mdi-bell-off::before{content:"\F009B"}.mdi-bell-off-outline::before{content:"\F0A91"}.mdi-bell-outline::before{content:"\F009C"}.mdi-bell-plus::before{content:"\F009D"}.mdi-bell-plus-outline::before{content:"\F0A92"}.mdi-bell-remove::before{content:"\F13EB"}.mdi-bell-remove-outline::before{content:"\F13EC"}.mdi-bell-ring::before{content:"\F009E"}.mdi-bell-ring-outline::before{content:"\F009F"}.mdi-bell-sleep::before{content:"\F00A0"}.mdi-bell-sleep-outline::before{content:"\F0A93"}.mdi-bench::before{content:"\F1C21"}.mdi-bench-back::before{content:"\F1C22"}.mdi-beta::before{content:"\F00A1"}.mdi-betamax::before{content:"\F09CB"}.mdi-biathlon::before{content:"\F0E14"}.mdi-bicycle::before{content:"\F109C"}.mdi-bicycle-basket::before{content:"\F1235"}.mdi-bicycle-cargo::before{content:"\F189C"}.mdi-bicycle-electric::before{content:"\F15B4"}.mdi-bicycle-penny-farthing::before{content:"\F15E9"}.mdi-bike::before{content:"\F00A3"}.mdi-bike-fast::before{content:"\F111F"}.mdi-bike-pedal::before{content:"\F1C23"}.mdi-bike-pedal-clipless::before{content:"\F1C24"}.mdi-bike-pedal-mountain::before{content:"\F1C25"}.mdi-billboard::before{content:"\F1010"}.mdi-billiards::before{content:"\F0B61"}.mdi-billiards-rack::before{content:"\F0B62"}.mdi-binoculars::before{content:"\F00A5"}.mdi-bio::before{content:"\F00A6"}.mdi-biohazard::before{content:"\F00A7"}.mdi-bird::before{content:"\F15C6"}.mdi-bitbucket::before{content:"\F00A8"}.mdi-bitcoin::before{content:"\F0813"}.mdi-black-mesa::before{content:"\F00A9"}.mdi-blender::before{content:"\F0CEB"}.mdi-blender-outline::before{content:"\F181A"}.mdi-blender-software::before{content:"\F00AB"}.mdi-blinds::before{content:"\F00AC"}.mdi-blinds-horizontal::before{content:"\F1A2B"}.mdi-blinds-horizontal-closed::before{content:"\F1A2C"}.mdi-blinds-open::before{content:"\F1011"}.mdi-blinds-vertical::before{content:"\F1A2D"}.mdi-blinds-vertical-closed::before{content:"\F1A2E"}.mdi-block-helper::before{content:"\F00AD"}.mdi-blood-bag::before{content:"\F0CEC"}.mdi-bluetooth::before{content:"\F00AF"}.mdi-bluetooth-audio::before{content:"\F00B0"}.mdi-bluetooth-connect::before{content:"\F00B1"}.mdi-bluetooth-off::before{content:"\F00B2"}.mdi-bluetooth-settings::before{content:"\F00B3"}.mdi-bluetooth-transfer::before{content:"\F00B4"}.mdi-blur::before{content:"\F00B5"}.mdi-blur-linear::before{content:"\F00B6"}.mdi-blur-off::before{content:"\F00B7"}.mdi-blur-radial::before{content:"\F00B8"}.mdi-bolt::before{content:"\F0DB3"}.mdi-bomb::before{content:"\F0691"}.mdi-bomb-off::before{content:"\F06C5"}.mdi-bone::before{content:"\F00B9"}.mdi-bone-off::before{content:"\F19E0"}.mdi-book::before{content:"\F00BA"}.mdi-book-account::before{content:"\F13AD"}.mdi-book-account-outline::before{content:"\F13AE"}.mdi-book-alert::before{content:"\F167C"}.mdi-book-alert-outline::before{content:"\F167D"}.mdi-book-alphabet::before{content:"\F061D"}.mdi-book-arrow-down::before{content:"\F167E"}.mdi-book-arrow-down-outline::before{content:"\F167F"}.mdi-book-arrow-left::before{content:"\F1680"}.mdi-book-arrow-left-outline::before{content:"\F1681"}.mdi-book-arrow-right::before{content:"\F1682"}.mdi-book-arrow-right-outline::before{content:"\F1683"}.mdi-book-arrow-up::before{content:"\F1684"}.mdi-book-arrow-up-outline::before{content:"\F1685"}.mdi-book-cancel::before{content:"\F1686"}.mdi-book-cancel-outline::before{content:"\F1687"}.mdi-book-check::before{content:"\F14F3"}.mdi-book-check-outline::before{content:"\F14F4"}.mdi-book-clock::before{content:"\F1688"}.mdi-book-clock-outline::before{content:"\F1689"}.mdi-book-cog::before{content:"\F168A"}.mdi-book-cog-outline::before{content:"\F168B"}.mdi-book-cross::before{content:"\F00A2"}.mdi-book-edit::before{content:"\F168C"}.mdi-book-edit-outline::before{content:"\F168D"}.mdi-book-education::before{content:"\F16C9"}.mdi-book-education-outline::before{content:"\F16CA"}.mdi-book-heart::before{content:"\F1A1D"}.mdi-book-heart-outline::before{content:"\F1A1E"}.mdi-book-information-variant::before{content:"\F106F"}.mdi-book-lock::before{content:"\F079A"}.mdi-book-lock-open::before{content:"\F079B"}.mdi-book-lock-open-outline::before{content:"\F168E"}.mdi-book-lock-outline::before{content:"\F168F"}.mdi-book-marker::before{content:"\F1690"}.mdi-book-marker-outline::before{content:"\F1691"}.mdi-book-minus::before{content:"\F05D9"}.mdi-book-minus-multiple::before{content:"\F0A94"}.mdi-book-minus-multiple-outline::before{content:"\F090B"}.mdi-book-minus-outline::before{content:"\F1692"}.mdi-book-multiple::before{content:"\F00BB"}.mdi-book-multiple-outline::before{content:"\F0436"}.mdi-book-music::before{content:"\F0067"}.mdi-book-music-outline::before{content:"\F1693"}.mdi-book-off::before{content:"\F1694"}.mdi-book-off-outline::before{content:"\F1695"}.mdi-book-open::before{content:"\F00BD"}.mdi-book-open-blank-variant::before{content:"\F00BE"}.mdi-book-open-blank-variant-outline::before{content:"\F1CCB"}.mdi-book-open-outline::before{content:"\F0B63"}.mdi-book-open-page-variant::before{content:"\F05DA"}.mdi-book-open-page-variant-outline::before{content:"\F15D6"}.mdi-book-open-variant::before{content:"\F14F7"}.mdi-book-open-variant-outline::before{content:"\F1CCC"}.mdi-book-outline::before{content:"\F0B64"}.mdi-book-play::before{content:"\F0E82"}.mdi-book-play-outline::before{content:"\F0E83"}.mdi-book-plus::before{content:"\F05DB"}.mdi-book-plus-multiple::before{content:"\F0A95"}.mdi-book-plus-multiple-outline::before{content:"\F0ADE"}.mdi-book-plus-outline::before{content:"\F1696"}.mdi-book-refresh::before{content:"\F1697"}.mdi-book-refresh-outline::before{content:"\F1698"}.mdi-book-remove::before{content:"\F0A97"}.mdi-book-remove-multiple::before{content:"\F0A96"}.mdi-book-remove-multiple-outline::before{content:"\F04CA"}.mdi-book-remove-outline::before{content:"\F1699"}.mdi-book-search::before{content:"\F0E84"}.mdi-book-search-outline::before{content:"\F0E85"}.mdi-book-settings::before{content:"\F169A"}.mdi-book-settings-outline::before{content:"\F169B"}.mdi-book-sync::before{content:"\F169C"}.mdi-book-sync-outline::before{content:"\F16C8"}.mdi-book-variant::before{content:"\F00BF"}.mdi-bookmark::before{content:"\F00C0"}.mdi-bookmark-box::before{content:"\F1B75"}.mdi-bookmark-box-multiple::before{content:"\F196C"}.mdi-bookmark-box-multiple-outline::before{content:"\F196D"}.mdi-bookmark-box-outline::before{content:"\F1B76"}.mdi-bookmark-check::before{content:"\F00C1"}.mdi-bookmark-check-outline::before{content:"\F137B"}.mdi-bookmark-minus::before{content:"\F09CC"}.mdi-bookmark-minus-outline::before{content:"\F09CD"}.mdi-bookmark-multiple::before{content:"\F0E15"}.mdi-bookmark-multiple-outline::before{content:"\F0E16"}.mdi-bookmark-music::before{content:"\F00C2"}.mdi-bookmark-music-outline::before{content:"\F1379"}.mdi-bookmark-off::before{content:"\F09CE"}.mdi-bookmark-off-outline::before{content:"\F09CF"}.mdi-bookmark-outline::before{content:"\F00C3"}.mdi-bookmark-plus::before{content:"\F00C5"}.mdi-bookmark-plus-outline::before{content:"\F00C4"}.mdi-bookmark-remove::before{content:"\F00C6"}.mdi-bookmark-remove-outline::before{content:"\F137A"}.mdi-bookshelf::before{content:"\F125F"}.mdi-boom-gate::before{content:"\F0E86"}.mdi-boom-gate-alert::before{content:"\F0E87"}.mdi-boom-gate-alert-outline::before{content:"\F0E88"}.mdi-boom-gate-arrow-down::before{content:"\F0E89"}.mdi-boom-gate-arrow-down-outline::before{content:"\F0E8A"}.mdi-boom-gate-arrow-up::before{content:"\F0E8C"}.mdi-boom-gate-arrow-up-outline::before{content:"\F0E8D"}.mdi-boom-gate-outline::before{content:"\F0E8B"}.mdi-boom-gate-up::before{content:"\F17F9"}.mdi-boom-gate-up-outline::before{content:"\F17FA"}.mdi-boombox::before{content:"\F05DC"}.mdi-boomerang::before{content:"\F10CF"}.mdi-bootstrap::before{content:"\F06C6"}.mdi-border-all::before{content:"\F00C7"}.mdi-border-all-variant::before{content:"\F08A1"}.mdi-border-bottom::before{content:"\F00C8"}.mdi-border-bottom-variant::before{content:"\F08A2"}.mdi-border-color::before{content:"\F00C9"}.mdi-border-horizontal::before{content:"\F00CA"}.mdi-border-inside::before{content:"\F00CB"}.mdi-border-left::before{content:"\F00CC"}.mdi-border-left-variant::before{content:"\F08A3"}.mdi-border-none::before{content:"\F00CD"}.mdi-border-none-variant::before{content:"\F08A4"}.mdi-border-outside::before{content:"\F00CE"}.mdi-border-radius::before{content:"\F1AF4"}.mdi-border-right::before{content:"\F00CF"}.mdi-border-right-variant::before{content:"\F08A5"}.mdi-border-style::before{content:"\F00D0"}.mdi-border-top::before{content:"\F00D1"}.mdi-border-top-variant::before{content:"\F08A6"}.mdi-border-vertical::before{content:"\F00D2"}.mdi-bottle-soda::before{content:"\F1070"}.mdi-bottle-soda-classic::before{content:"\F1071"}.mdi-bottle-soda-classic-outline::before{content:"\F1363"}.mdi-bottle-soda-outline::before{content:"\F1072"}.mdi-bottle-tonic::before{content:"\F112E"}.mdi-bottle-tonic-outline::before{content:"\F112F"}.mdi-bottle-tonic-plus::before{content:"\F1130"}.mdi-bottle-tonic-plus-outline::before{content:"\F1131"}.mdi-bottle-tonic-skull::before{content:"\F1132"}.mdi-bottle-tonic-skull-outline::before{content:"\F1133"}.mdi-bottle-wine::before{content:"\F0854"}.mdi-bottle-wine-outline::before{content:"\F1310"}.mdi-bow-arrow::before{content:"\F1841"}.mdi-bow-tie::before{content:"\F0678"}.mdi-bowl::before{content:"\F028E"}.mdi-bowl-mix::before{content:"\F0617"}.mdi-bowl-mix-outline::before{content:"\F02E4"}.mdi-bowl-outline::before{content:"\F02A9"}.mdi-bowling::before{content:"\F00D3"}.mdi-box::before{content:"\F00D4"}.mdi-box-cutter::before{content:"\F00D5"}.mdi-box-cutter-off::before{content:"\F0B4A"}.mdi-box-shadow::before{content:"\F0637"}.mdi-boxing-glove::before{content:"\F0B65"}.mdi-braille::before{content:"\F09D0"}.mdi-brain::before{content:"\F09D1"}.mdi-bread-slice::before{content:"\F0CEE"}.mdi-bread-slice-outline::before{content:"\F0CEF"}.mdi-bridge::before{content:"\F0618"}.mdi-briefcase::before{content:"\F00D6"}.mdi-briefcase-account::before{content:"\F0CF0"}.mdi-briefcase-account-outline::before{content:"\F0CF1"}.mdi-briefcase-arrow-left-right::before{content:"\F1A8D"}.mdi-briefcase-arrow-left-right-outline::before{content:"\F1A8E"}.mdi-briefcase-arrow-up-down::before{content:"\F1A8F"}.mdi-briefcase-arrow-up-down-outline::before{content:"\F1A90"}.mdi-briefcase-check::before{content:"\F00D7"}.mdi-briefcase-check-outline::before{content:"\F131E"}.mdi-briefcase-clock::before{content:"\F10D0"}.mdi-briefcase-clock-outline::before{content:"\F10D1"}.mdi-briefcase-download::before{content:"\F00D8"}.mdi-briefcase-download-outline::before{content:"\F0C3D"}.mdi-briefcase-edit::before{content:"\F0A98"}.mdi-briefcase-edit-outline::before{content:"\F0C3E"}.mdi-briefcase-eye::before{content:"\F17D9"}.mdi-briefcase-eye-outline::before{content:"\F17DA"}.mdi-briefcase-minus::before{content:"\F0A2A"}.mdi-briefcase-minus-outline::before{content:"\F0C3F"}.mdi-briefcase-off::before{content:"\F1658"}.mdi-briefcase-off-outline::before{content:"\F1659"}.mdi-briefcase-outline::before{content:"\F0814"}.mdi-briefcase-plus::before{content:"\F0A2B"}.mdi-briefcase-plus-outline::before{content:"\F0C40"}.mdi-briefcase-remove::before{content:"\F0A2C"}.mdi-briefcase-remove-outline::before{content:"\F0C41"}.mdi-briefcase-search::before{content:"\F0A2D"}.mdi-briefcase-search-outline::before{content:"\F0C42"}.mdi-briefcase-upload::before{content:"\F00D9"}.mdi-briefcase-upload-outline::before{content:"\F0C43"}.mdi-briefcase-variant::before{content:"\F1494"}.mdi-briefcase-variant-off::before{content:"\F165A"}.mdi-briefcase-variant-off-outline::before{content:"\F165B"}.mdi-briefcase-variant-outline::before{content:"\F1495"}.mdi-brightness-1::before{content:"\F00DA"}.mdi-brightness-2::before{content:"\F00DB"}.mdi-brightness-3::before{content:"\F00DC"}.mdi-brightness-4::before{content:"\F00DD"}.mdi-brightness-5::before{content:"\F00DE"}.mdi-brightness-6::before{content:"\F00DF"}.mdi-brightness-7::before{content:"\F00E0"}.mdi-brightness-auto::before{content:"\F00E1"}.mdi-brightness-percent::before{content:"\F0CF2"}.mdi-broadcast::before{content:"\F1720"}.mdi-broadcast-off::before{content:"\F1721"}.mdi-broom::before{content:"\F00E2"}.mdi-brush::before{content:"\F00E3"}.mdi-brush-off::before{content:"\F1771"}.mdi-brush-outline::before{content:"\F1A0D"}.mdi-brush-variant::before{content:"\F1813"}.mdi-bucket::before{content:"\F1415"}.mdi-bucket-outline::before{content:"\F1416"}.mdi-buffet::before{content:"\F0578"}.mdi-bug::before{content:"\F00E4"}.mdi-bug-check::before{content:"\F0A2E"}.mdi-bug-check-outline::before{content:"\F0A2F"}.mdi-bug-outline::before{content:"\F0A30"}.mdi-bug-pause::before{content:"\F1AF5"}.mdi-bug-pause-outline::before{content:"\F1AF6"}.mdi-bug-play::before{content:"\F1AF7"}.mdi-bug-play-outline::before{content:"\F1AF8"}.mdi-bug-stop::before{content:"\F1AF9"}.mdi-bug-stop-outline::before{content:"\F1AFA"}.mdi-bugle::before{content:"\F0DB4"}.mdi-bulkhead-light::before{content:"\F1A2F"}.mdi-bulldozer::before{content:"\F0B22"}.mdi-bullet::before{content:"\F0CF3"}.mdi-bulletin-board::before{content:"\F00E5"}.mdi-bullhorn::before{content:"\F00E6"}.mdi-bullhorn-outline::before{content:"\F0B23"}.mdi-bullhorn-variant::before{content:"\F196E"}.mdi-bullhorn-variant-outline::before{content:"\F196F"}.mdi-bullseye::before{content:"\F05DD"}.mdi-bullseye-arrow::before{content:"\F08C9"}.mdi-bulma::before{content:"\F12E7"}.mdi-bunk-bed::before{content:"\F1302"}.mdi-bunk-bed-outline::before{content:"\F0097"}.mdi-bus::before{content:"\F00E7"}.mdi-bus-alert::before{content:"\F0A99"}.mdi-bus-articulated-end::before{content:"\F079C"}.mdi-bus-articulated-front::before{content:"\F079D"}.mdi-bus-clock::before{content:"\F08CA"}.mdi-bus-double-decker::before{content:"\F079E"}.mdi-bus-electric::before{content:"\F191D"}.mdi-bus-marker::before{content:"\F1212"}.mdi-bus-multiple::before{content:"\F0F3F"}.mdi-bus-school::before{content:"\F079F"}.mdi-bus-side::before{content:"\F07A0"}.mdi-bus-sign::before{content:"\F1CC1"}.mdi-bus-stop::before{content:"\F1012"}.mdi-bus-stop-covered::before{content:"\F1013"}.mdi-bus-stop-uncovered::before{content:"\F1014"}.mdi-bus-wrench::before{content:"\F1CC2"}.mdi-butterfly::before{content:"\F1589"}.mdi-butterfly-outline::before{content:"\F158A"}.mdi-button-cursor::before{content:"\F1B4F"}.mdi-button-pointer::before{content:"\F1B50"}.mdi-cabin-a-frame::before{content:"\F188C"}.mdi-cable-data::before{content:"\F1394"}.mdi-cached::before{content:"\F00E8"}.mdi-cactus::before{content:"\F0DB5"}.mdi-cake::before{content:"\F00E9"}.mdi-cake-layered::before{content:"\F00EA"}.mdi-cake-variant::before{content:"\F00EB"}.mdi-cake-variant-outline::before{content:"\F17F0"}.mdi-calculator::before{content:"\F00EC"}.mdi-calculator-variant::before{content:"\F0A9A"}.mdi-calculator-variant-outline::before{content:"\F15A6"}.mdi-calendar::before{content:"\F00ED"}.mdi-calendar-account::before{content:"\F0ED7"}.mdi-calendar-account-outline::before{content:"\F0ED8"}.mdi-calendar-alert::before{content:"\F0A31"}.mdi-calendar-alert-outline::before{content:"\F1B62"}.mdi-calendar-arrow-left::before{content:"\F1134"}.mdi-calendar-arrow-right::before{content:"\F1135"}.mdi-calendar-badge::before{content:"\F1B9D"}.mdi-calendar-badge-outline::before{content:"\F1B9E"}.mdi-calendar-blank::before{content:"\F00EE"}.mdi-calendar-blank-multiple::before{content:"\F1073"}.mdi-calendar-blank-outline::before{content:"\F0B66"}.mdi-calendar-check::before{content:"\F00EF"}.mdi-calendar-check-outline::before{content:"\F0C44"}.mdi-calendar-clock::before{content:"\F00F0"}.mdi-calendar-clock-outline::before{content:"\F16E1"}.mdi-calendar-collapse-horizontal::before{content:"\F189D"}.mdi-calendar-collapse-horizontal-outline::before{content:"\F1B63"}.mdi-calendar-cursor::before{content:"\F157B"}.mdi-calendar-cursor-outline::before{content:"\F1B64"}.mdi-calendar-edit::before{content:"\F08A7"}.mdi-calendar-edit-outline::before{content:"\F1B65"}.mdi-calendar-end::before{content:"\F166C"}.mdi-calendar-end-outline::before{content:"\F1B66"}.mdi-calendar-expand-horizontal::before{content:"\F189E"}.mdi-calendar-expand-horizontal-outline::before{content:"\F1B67"}.mdi-calendar-export::before{content:"\F0B24"}.mdi-calendar-export-outline::before{content:"\F1B68"}.mdi-calendar-filter::before{content:"\F1A32"}.mdi-calendar-filter-outline::before{content:"\F1A33"}.mdi-calendar-heart::before{content:"\F09D2"}.mdi-calendar-heart-outline::before{content:"\F1B69"}.mdi-calendar-import::before{content:"\F0B25"}.mdi-calendar-import-outline::before{content:"\F1B6A"}.mdi-calendar-lock::before{content:"\F1641"}.mdi-calendar-lock-open::before{content:"\F1B5B"}.mdi-calendar-lock-open-outline::before{content:"\F1B5C"}.mdi-calendar-lock-outline::before{content:"\F1642"}.mdi-calendar-minus::before{content:"\F0D5C"}.mdi-calendar-minus-outline::before{content:"\F1B6B"}.mdi-calendar-month::before{content:"\F0E17"}.mdi-calendar-month-outline::before{content:"\F0E18"}.mdi-calendar-multiple::before{content:"\F00F1"}.mdi-calendar-multiple-check::before{content:"\F00F2"}.mdi-calendar-multiselect::before{content:"\F0A32"}.mdi-calendar-multiselect-outline::before{content:"\F1B55"}.mdi-calendar-outline::before{content:"\F0B67"}.mdi-calendar-plus::before{content:"\F00F3"}.mdi-calendar-plus-outline::before{content:"\F1B6C"}.mdi-calendar-question::before{content:"\F0692"}.mdi-calendar-question-outline::before{content:"\F1B6D"}.mdi-calendar-range::before{content:"\F0679"}.mdi-calendar-range-outline::before{content:"\F0B68"}.mdi-calendar-refresh::before{content:"\F01E1"}.mdi-calendar-refresh-outline::before{content:"\F0203"}.mdi-calendar-remove::before{content:"\F00F4"}.mdi-calendar-remove-outline::before{content:"\F0C45"}.mdi-calendar-search::before{content:"\F094C"}.mdi-calendar-search-outline::before{content:"\F1B6E"}.mdi-calendar-star::before{content:"\F09D3"}.mdi-calendar-star-four-points::before{content:"\F1C1F"}.mdi-calendar-star-outline::before{content:"\F1B53"}.mdi-calendar-start::before{content:"\F166D"}.mdi-calendar-start-outline::before{content:"\F1B6F"}.mdi-calendar-sync::before{content:"\F0E8E"}.mdi-calendar-sync-outline::before{content:"\F0E8F"}.mdi-calendar-text::before{content:"\F00F5"}.mdi-calendar-text-outline::before{content:"\F0C46"}.mdi-calendar-today::before{content:"\F00F6"}.mdi-calendar-today-outline::before{content:"\F1A30"}.mdi-calendar-week::before{content:"\F0A33"}.mdi-calendar-week-begin::before{content:"\F0A34"}.mdi-calendar-week-begin-outline::before{content:"\F1A31"}.mdi-calendar-week-outline::before{content:"\F1A34"}.mdi-calendar-weekend::before{content:"\F0ED9"}.mdi-calendar-weekend-outline::before{content:"\F0EDA"}.mdi-call-made::before{content:"\F00F7"}.mdi-call-merge::before{content:"\F00F8"}.mdi-call-missed::before{content:"\F00F9"}.mdi-call-received::before{content:"\F00FA"}.mdi-call-split::before{content:"\F00FB"}.mdi-camcorder::before{content:"\F00FC"}.mdi-camcorder-off::before{content:"\F00FF"}.mdi-camera::before{content:"\F0100"}.mdi-camera-account::before{content:"\F08CB"}.mdi-camera-burst::before{content:"\F0693"}.mdi-camera-control::before{content:"\F0B69"}.mdi-camera-document::before{content:"\F1871"}.mdi-camera-document-off::before{content:"\F1872"}.mdi-camera-enhance::before{content:"\F0101"}.mdi-camera-enhance-outline::before{content:"\F0B6A"}.mdi-camera-flip::before{content:"\F15D9"}.mdi-camera-flip-outline::before{content:"\F15DA"}.mdi-camera-front::before{content:"\F0102"}.mdi-camera-front-variant::before{content:"\F0103"}.mdi-camera-gopro::before{content:"\F07A1"}.mdi-camera-image::before{content:"\F08CC"}.mdi-camera-iris::before{content:"\F0104"}.mdi-camera-lock::before{content:"\F1A14"}.mdi-camera-lock-open::before{content:"\F1C0D"}.mdi-camera-lock-open-outline::before{content:"\F1C0E"}.mdi-camera-lock-outline::before{content:"\F1A15"}.mdi-camera-marker::before{content:"\F19A7"}.mdi-camera-marker-outline::before{content:"\F19A8"}.mdi-camera-metering-center::before{content:"\F07A2"}.mdi-camera-metering-matrix::before{content:"\F07A3"}.mdi-camera-metering-partial::before{content:"\F07A4"}.mdi-camera-metering-spot::before{content:"\F07A5"}.mdi-camera-off::before{content:"\F05DF"}.mdi-camera-off-outline::before{content:"\F19BF"}.mdi-camera-outline::before{content:"\F0D5D"}.mdi-camera-party-mode::before{content:"\F0105"}.mdi-camera-plus::before{content:"\F0EDB"}.mdi-camera-plus-outline::before{content:"\F0EDC"}.mdi-camera-rear::before{content:"\F0106"}.mdi-camera-rear-variant::before{content:"\F0107"}.mdi-camera-retake::before{content:"\F0E19"}.mdi-camera-retake-outline::before{content:"\F0E1A"}.mdi-camera-switch::before{content:"\F0108"}.mdi-camera-switch-outline::before{content:"\F084A"}.mdi-camera-timer::before{content:"\F0109"}.mdi-camera-wireless::before{content:"\F0DB6"}.mdi-camera-wireless-outline::before{content:"\F0DB7"}.mdi-campfire::before{content:"\F0EDD"}.mdi-cancel::before{content:"\F073A"}.mdi-candelabra::before{content:"\F17D2"}.mdi-candelabra-fire::before{content:"\F17D3"}.mdi-candle::before{content:"\F05E2"}.mdi-candy::before{content:"\F1970"}.mdi-candy-off::before{content:"\F1971"}.mdi-candy-off-outline::before{content:"\F1972"}.mdi-candy-outline::before{content:"\F1973"}.mdi-candycane::before{content:"\F010A"}.mdi-cannabis::before{content:"\F07A6"}.mdi-cannabis-off::before{content:"\F166E"}.mdi-caps-lock::before{content:"\F0A9B"}.mdi-car::before{content:"\F010B"}.mdi-car-2-plus::before{content:"\F1015"}.mdi-car-3-plus::before{content:"\F1016"}.mdi-car-arrow-left::before{content:"\F13B2"}.mdi-car-arrow-right::before{content:"\F13B3"}.mdi-car-back::before{content:"\F0E1B"}.mdi-car-battery::before{content:"\F010C"}.mdi-car-brake-abs::before{content:"\F0C47"}.mdi-car-brake-alert::before{content:"\F0C48"}.mdi-car-brake-fluid-level::before{content:"\F1909"}.mdi-car-brake-hold::before{content:"\F0D5E"}.mdi-car-brake-low-pressure::before{content:"\F190A"}.mdi-car-brake-parking::before{content:"\F0D5F"}.mdi-car-brake-retarder::before{content:"\F1017"}.mdi-car-brake-temperature::before{content:"\F190B"}.mdi-car-brake-worn-linings::before{content:"\F190C"}.mdi-car-child-seat::before{content:"\F0FA3"}.mdi-car-clock::before{content:"\F1974"}.mdi-car-clutch::before{content:"\F1018"}.mdi-car-cog::before{content:"\F13CC"}.mdi-car-connected::before{content:"\F010D"}.mdi-car-convertible::before{content:"\F07A7"}.mdi-car-coolant-level::before{content:"\F1019"}.mdi-car-cruise-control::before{content:"\F0D60"}.mdi-car-defrost-front::before{content:"\F0D61"}.mdi-car-defrost-rear::before{content:"\F0D62"}.mdi-car-door::before{content:"\F0B6B"}.mdi-car-door-lock::before{content:"\F109D"}.mdi-car-door-lock-open::before{content:"\F1C81"}.mdi-car-electric::before{content:"\F0B6C"}.mdi-car-electric-outline::before{content:"\F15B5"}.mdi-car-emergency::before{content:"\F160F"}.mdi-car-esp::before{content:"\F0C49"}.mdi-car-estate::before{content:"\F07A8"}.mdi-car-hatchback::before{content:"\F07A9"}.mdi-car-info::before{content:"\F11BE"}.mdi-car-key::before{content:"\F0B6D"}.mdi-car-lifted-pickup::before{content:"\F152D"}.mdi-car-light-alert::before{content:"\F190D"}.mdi-car-light-dimmed::before{content:"\F0C4A"}.mdi-car-light-fog::before{content:"\F0C4B"}.mdi-car-light-high::before{content:"\F0C4C"}.mdi-car-limousine::before{content:"\F08CD"}.mdi-car-multiple::before{content:"\F0B6E"}.mdi-car-off::before{content:"\F0E1C"}.mdi-car-outline::before{content:"\F14ED"}.mdi-car-parking-lights::before{content:"\F0D63"}.mdi-car-pickup::before{content:"\F07AA"}.mdi-car-search::before{content:"\F1B8D"}.mdi-car-search-outline::before{content:"\F1B8E"}.mdi-car-seat::before{content:"\F0FA4"}.mdi-car-seat-cooler::before{content:"\F0FA5"}.mdi-car-seat-heater::before{content:"\F0FA6"}.mdi-car-select::before{content:"\F1879"}.mdi-car-settings::before{content:"\F13CD"}.mdi-car-shift-pattern::before{content:"\F0F40"}.mdi-car-side::before{content:"\F07AB"}.mdi-car-speed-limiter::before{content:"\F190E"}.mdi-car-sports::before{content:"\F07AC"}.mdi-car-tire-alert::before{content:"\F0C4D"}.mdi-car-traction-control::before{content:"\F0D64"}.mdi-car-turbocharger::before{content:"\F101A"}.mdi-car-wash::before{content:"\F010E"}.mdi-car-windshield::before{content:"\F101B"}.mdi-car-windshield-outline::before{content:"\F101C"}.mdi-car-wireless::before{content:"\F1878"}.mdi-car-wrench::before{content:"\F1814"}.mdi-carabiner::before{content:"\F14C0"}.mdi-caravan::before{content:"\F07AD"}.mdi-card::before{content:"\F0B6F"}.mdi-card-account-details::before{content:"\F05D2"}.mdi-card-account-details-outline::before{content:"\F0DAB"}.mdi-card-account-details-star::before{content:"\F02A3"}.mdi-card-account-details-star-outline::before{content:"\F06DB"}.mdi-card-account-mail::before{content:"\F018E"}.mdi-card-account-mail-outline::before{content:"\F0E98"}.mdi-card-account-phone::before{content:"\F0E99"}.mdi-card-account-phone-outline::before{content:"\F0E9A"}.mdi-card-bulleted::before{content:"\F0B70"}.mdi-card-bulleted-off::before{content:"\F0B71"}.mdi-card-bulleted-off-outline::before{content:"\F0B72"}.mdi-card-bulleted-outline::before{content:"\F0B73"}.mdi-card-bulleted-settings::before{content:"\F0B74"}.mdi-card-bulleted-settings-outline::before{content:"\F0B75"}.mdi-card-minus::before{content:"\F1600"}.mdi-card-minus-outline::before{content:"\F1601"}.mdi-card-multiple::before{content:"\F17F1"}.mdi-card-multiple-outline::before{content:"\F17F2"}.mdi-card-off::before{content:"\F1602"}.mdi-card-off-outline::before{content:"\F1603"}.mdi-card-outline::before{content:"\F0B76"}.mdi-card-plus::before{content:"\F11FF"}.mdi-card-plus-outline::before{content:"\F1200"}.mdi-card-remove::before{content:"\F1604"}.mdi-card-remove-outline::before{content:"\F1605"}.mdi-card-search::before{content:"\F1074"}.mdi-card-search-outline::before{content:"\F1075"}.mdi-card-text::before{content:"\F0B77"}.mdi-card-text-outline::before{content:"\F0B78"}.mdi-cards::before{content:"\F0638"}.mdi-cards-club::before{content:"\F08CE"}.mdi-cards-club-outline::before{content:"\F189F"}.mdi-cards-diamond::before{content:"\F08CF"}.mdi-cards-diamond-outline::before{content:"\F101D"}.mdi-cards-heart::before{content:"\F08D0"}.mdi-cards-heart-outline::before{content:"\F18A0"}.mdi-cards-outline::before{content:"\F0639"}.mdi-cards-playing::before{content:"\F18A1"}.mdi-cards-playing-club::before{content:"\F18A2"}.mdi-cards-playing-club-multiple::before{content:"\F18A3"}.mdi-cards-playing-club-multiple-outline::before{content:"\F18A4"}.mdi-cards-playing-club-outline::before{content:"\F18A5"}.mdi-cards-playing-diamond::before{content:"\F18A6"}.mdi-cards-playing-diamond-multiple::before{content:"\F18A7"}.mdi-cards-playing-diamond-multiple-outline::before{content:"\F18A8"}.mdi-cards-playing-diamond-outline::before{content:"\F18A9"}.mdi-cards-playing-heart::before{content:"\F18AA"}.mdi-cards-playing-heart-multiple::before{content:"\F18AB"}.mdi-cards-playing-heart-multiple-outline::before{content:"\F18AC"}.mdi-cards-playing-heart-outline::before{content:"\F18AD"}.mdi-cards-playing-outline::before{content:"\F063A"}.mdi-cards-playing-spade::before{content:"\F18AE"}.mdi-cards-playing-spade-multiple::before{content:"\F18AF"}.mdi-cards-playing-spade-multiple-outline::before{content:"\F18B0"}.mdi-cards-playing-spade-outline::before{content:"\F18B1"}.mdi-cards-spade::before{content:"\F08D1"}.mdi-cards-spade-outline::before{content:"\F18B2"}.mdi-cards-variant::before{content:"\F06C7"}.mdi-carrot::before{content:"\F010F"}.mdi-cart::before{content:"\F0110"}.mdi-cart-arrow-down::before{content:"\F0D66"}.mdi-cart-arrow-right::before{content:"\F0C4E"}.mdi-cart-arrow-up::before{content:"\F0D67"}.mdi-cart-check::before{content:"\F15EA"}.mdi-cart-heart::before{content:"\F18E0"}.mdi-cart-minus::before{content:"\F0D68"}.mdi-cart-off::before{content:"\F066B"}.mdi-cart-outline::before{content:"\F0111"}.mdi-cart-percent::before{content:"\F1BAE"}.mdi-cart-plus::before{content:"\F0112"}.mdi-cart-remove::before{content:"\F0D69"}.mdi-cart-variant::before{content:"\F15EB"}.mdi-case-sensitive-alt::before{content:"\F0113"}.mdi-cash::before{content:"\F0114"}.mdi-cash-100::before{content:"\F0115"}.mdi-cash-check::before{content:"\F14EE"}.mdi-cash-clock::before{content:"\F1A91"}.mdi-cash-edit::before{content:"\F1CAB"}.mdi-cash-fast::before{content:"\F185C"}.mdi-cash-lock::before{content:"\F14EA"}.mdi-cash-lock-open::before{content:"\F14EB"}.mdi-cash-marker::before{content:"\F0DB8"}.mdi-cash-minus::before{content:"\F1260"}.mdi-cash-multiple::before{content:"\F0116"}.mdi-cash-off::before{content:"\F1C79"}.mdi-cash-plus::before{content:"\F1261"}.mdi-cash-refund::before{content:"\F0A9C"}.mdi-cash-register::before{content:"\F0CF4"}.mdi-cash-remove::before{content:"\F1262"}.mdi-cash-sync::before{content:"\F1A92"}.mdi-cassette::before{content:"\F09D4"}.mdi-cast::before{content:"\F0118"}.mdi-cast-audio::before{content:"\F101E"}.mdi-cast-audio-variant::before{content:"\F1749"}.mdi-cast-connected::before{content:"\F0119"}.mdi-cast-education::before{content:"\F0E1D"}.mdi-cast-off::before{content:"\F078A"}.mdi-cast-variant::before{content:"\F001F"}.mdi-castle::before{content:"\F011A"}.mdi-cat::before{content:"\F011B"}.mdi-cctv::before{content:"\F07AE"}.mdi-cctv-off::before{content:"\F185F"}.mdi-ceiling-fan::before{content:"\F1797"}.mdi-ceiling-fan-light::before{content:"\F1798"}.mdi-ceiling-light::before{content:"\F0769"}.mdi-ceiling-light-multiple::before{content:"\F18DD"}.mdi-ceiling-light-multiple-outline::before{content:"\F18DE"}.mdi-ceiling-light-outline::before{content:"\F17C7"}.mdi-cellphone::before{content:"\F011C"}.mdi-cellphone-arrow-down::before{content:"\F09D5"}.mdi-cellphone-arrow-down-variant::before{content:"\F19C5"}.mdi-cellphone-basic::before{content:"\F011E"}.mdi-cellphone-charging::before{content:"\F1397"}.mdi-cellphone-check::before{content:"\F17FD"}.mdi-cellphone-cog::before{content:"\F0951"}.mdi-cellphone-dock::before{content:"\F011F"}.mdi-cellphone-information::before{content:"\F0F41"}.mdi-cellphone-key::before{content:"\F094E"}.mdi-cellphone-link::before{content:"\F0121"}.mdi-cellphone-link-off::before{content:"\F0122"}.mdi-cellphone-lock::before{content:"\F094F"}.mdi-cellphone-marker::before{content:"\F183A"}.mdi-cellphone-message::before{content:"\F08D3"}.mdi-cellphone-message-off::before{content:"\F10D2"}.mdi-cellphone-nfc::before{content:"\F0E90"}.mdi-cellphone-nfc-off::before{content:"\F12D8"}.mdi-cellphone-off::before{content:"\F0950"}.mdi-cellphone-play::before{content:"\F101F"}.mdi-cellphone-remove::before{content:"\F094D"}.mdi-cellphone-screenshot::before{content:"\F0A35"}.mdi-cellphone-settings::before{content:"\F0123"}.mdi-cellphone-sound::before{content:"\F0952"}.mdi-cellphone-text::before{content:"\F08D2"}.mdi-cellphone-wireless::before{content:"\F0815"}.mdi-centos::before{content:"\F111A"}.mdi-certificate::before{content:"\F0124"}.mdi-certificate-outline::before{content:"\F1188"}.mdi-chair-rolling::before{content:"\F0F48"}.mdi-chair-school::before{content:"\F0125"}.mdi-chandelier::before{content:"\F1793"}.mdi-charity::before{content:"\F0C4F"}.mdi-charity-search::before{content:"\F1C82"}.mdi-chart-arc::before{content:"\F0126"}.mdi-chart-areaspline::before{content:"\F0127"}.mdi-chart-areaspline-variant::before{content:"\F0E91"}.mdi-chart-bar::before{content:"\F0128"}.mdi-chart-bar-stacked::before{content:"\F076A"}.mdi-chart-bell-curve::before{content:"\F0C50"}.mdi-chart-bell-curve-cumulative::before{content:"\F0FA7"}.mdi-chart-box::before{content:"\F154D"}.mdi-chart-box-multiple::before{content:"\F1CCD"}.mdi-chart-box-multiple-outline::before{content:"\F1CCE"}.mdi-chart-box-outline::before{content:"\F154E"}.mdi-chart-box-plus-outline::before{content:"\F154F"}.mdi-chart-bubble::before{content:"\F05E3"}.mdi-chart-donut::before{content:"\F07AF"}.mdi-chart-donut-variant::before{content:"\F07B0"}.mdi-chart-gantt::before{content:"\F066C"}.mdi-chart-histogram::before{content:"\F0129"}.mdi-chart-line::before{content:"\F012A"}.mdi-chart-line-stacked::before{content:"\F076B"}.mdi-chart-line-variant::before{content:"\F07B1"}.mdi-chart-multiline::before{content:"\F08D4"}.mdi-chart-multiple::before{content:"\F1213"}.mdi-chart-pie::before{content:"\F012B"}.mdi-chart-pie-outline::before{content:"\F1BDF"}.mdi-chart-ppf::before{content:"\F1380"}.mdi-chart-sankey::before{content:"\F11DF"}.mdi-chart-sankey-variant::before{content:"\F11E0"}.mdi-chart-scatter-plot::before{content:"\F0E92"}.mdi-chart-scatter-plot-hexbin::before{content:"\F066D"}.mdi-chart-timeline::before{content:"\F066E"}.mdi-chart-timeline-variant::before{content:"\F0E93"}.mdi-chart-timeline-variant-shimmer::before{content:"\F15B6"}.mdi-chart-tree::before{content:"\F0E94"}.mdi-chart-waterfall::before{content:"\F1918"}.mdi-chat::before{content:"\F0B79"}.mdi-chat-alert::before{content:"\F0B7A"}.mdi-chat-alert-outline::before{content:"\F12C9"}.mdi-chat-minus::before{content:"\F1410"}.mdi-chat-minus-outline::before{content:"\F1413"}.mdi-chat-outline::before{content:"\F0EDE"}.mdi-chat-plus::before{content:"\F140F"}.mdi-chat-plus-outline::before{content:"\F1412"}.mdi-chat-processing::before{content:"\F0B7B"}.mdi-chat-processing-outline::before{content:"\F12CA"}.mdi-chat-question::before{content:"\F1738"}.mdi-chat-question-outline::before{content:"\F1739"}.mdi-chat-remove::before{content:"\F1411"}.mdi-chat-remove-outline::before{content:"\F1414"}.mdi-chat-sleep::before{content:"\F12D1"}.mdi-chat-sleep-outline::before{content:"\F12D2"}.mdi-check::before{content:"\F012C"}.mdi-check-all::before{content:"\F012D"}.mdi-check-bold::before{content:"\F0E1E"}.mdi-check-circle::before{content:"\F05E0"}.mdi-check-circle-outline::before{content:"\F05E1"}.mdi-check-decagram::before{content:"\F0791"}.mdi-check-decagram-outline::before{content:"\F1740"}.mdi-check-network::before{content:"\F0C53"}.mdi-check-network-outline::before{content:"\F0C54"}.mdi-check-outline::before{content:"\F0855"}.mdi-check-underline::before{content:"\F0E1F"}.mdi-check-underline-circle::before{content:"\F0E20"}.mdi-check-underline-circle-outline::before{content:"\F0E21"}.mdi-checkbook::before{content:"\F0A9D"}.mdi-checkbook-arrow-left::before{content:"\F1C1D"}.mdi-checkbook-arrow-right::before{content:"\F1C1E"}.mdi-checkbox-blank::before{content:"\F012E"}.mdi-checkbox-blank-badge::before{content:"\F1176"}.mdi-checkbox-blank-badge-outline::before{content:"\F0117"}.mdi-checkbox-blank-circle::before{content:"\F012F"}.mdi-checkbox-blank-circle-outline::before{content:"\F0130"}.mdi-checkbox-blank-off::before{content:"\F12EC"}.mdi-checkbox-blank-off-outline::before{content:"\F12ED"}.mdi-checkbox-blank-outline::before{content:"\F0131"}.mdi-checkbox-intermediate::before{content:"\F0856"}.mdi-checkbox-intermediate-variant::before{content:"\F1B54"}.mdi-checkbox-marked::before{content:"\F0132"}.mdi-checkbox-marked-circle::before{content:"\F0133"}.mdi-checkbox-marked-circle-auto-outline::before{content:"\F1C26"}.mdi-checkbox-marked-circle-minus-outline::before{content:"\F1C27"}.mdi-checkbox-marked-circle-outline::before{content:"\F0134"}.mdi-checkbox-marked-circle-plus-outline::before{content:"\F1927"}.mdi-checkbox-marked-outline::before{content:"\F0135"}.mdi-checkbox-multiple-blank::before{content:"\F0136"}.mdi-checkbox-multiple-blank-circle::before{content:"\F063B"}.mdi-checkbox-multiple-blank-circle-outline::before{content:"\F063C"}.mdi-checkbox-multiple-blank-outline::before{content:"\F0137"}.mdi-checkbox-multiple-marked::before{content:"\F0138"}.mdi-checkbox-multiple-marked-circle::before{content:"\F063D"}.mdi-checkbox-multiple-marked-circle-outline::before{content:"\F063E"}.mdi-checkbox-multiple-marked-outline::before{content:"\F0139"}.mdi-checkbox-multiple-outline::before{content:"\F0C51"}.mdi-checkbox-outline::before{content:"\F0C52"}.mdi-checkerboard::before{content:"\F013A"}.mdi-checkerboard-minus::before{content:"\F1202"}.mdi-checkerboard-plus::before{content:"\F1201"}.mdi-checkerboard-remove::before{content:"\F1203"}.mdi-cheese::before{content:"\F12B9"}.mdi-cheese-off::before{content:"\F13EE"}.mdi-chef-hat::before{content:"\F0B7C"}.mdi-chemical-weapon::before{content:"\F013B"}.mdi-chess-bishop::before{content:"\F085C"}.mdi-chess-king::before{content:"\F0857"}.mdi-chess-knight::before{content:"\F0858"}.mdi-chess-pawn::before{content:"\F0859"}.mdi-chess-queen::before{content:"\F085A"}.mdi-chess-rook::before{content:"\F085B"}.mdi-chevron-double-down::before{content:"\F013C"}.mdi-chevron-double-left::before{content:"\F013D"}.mdi-chevron-double-right::before{content:"\F013E"}.mdi-chevron-double-up::before{content:"\F013F"}.mdi-chevron-down::before{content:"\F0140"}.mdi-chevron-down-box::before{content:"\F09D6"}.mdi-chevron-down-box-outline::before{content:"\F09D7"}.mdi-chevron-down-circle::before{content:"\F0B26"}.mdi-chevron-down-circle-outline::before{content:"\F0B27"}.mdi-chevron-left::before{content:"\F0141"}.mdi-chevron-left-box::before{content:"\F09D8"}.mdi-chevron-left-box-outline::before{content:"\F09D9"}.mdi-chevron-left-circle::before{content:"\F0B28"}.mdi-chevron-left-circle-outline::before{content:"\F0B29"}.mdi-chevron-right::before{content:"\F0142"}.mdi-chevron-right-box::before{content:"\F09DA"}.mdi-chevron-right-box-outline::before{content:"\F09DB"}.mdi-chevron-right-circle::before{content:"\F0B2A"}.mdi-chevron-right-circle-outline::before{content:"\F0B2B"}.mdi-chevron-triple-down::before{content:"\F0DB9"}.mdi-chevron-triple-left::before{content:"\F0DBA"}.mdi-chevron-triple-right::before{content:"\F0DBB"}.mdi-chevron-triple-up::before{content:"\F0DBC"}.mdi-chevron-up::before{content:"\F0143"}.mdi-chevron-up-box::before{content:"\F09DC"}.mdi-chevron-up-box-outline::before{content:"\F09DD"}.mdi-chevron-up-circle::before{content:"\F0B2C"}.mdi-chevron-up-circle-outline::before{content:"\F0B2D"}.mdi-chili-alert::before{content:"\F17EA"}.mdi-chili-alert-outline::before{content:"\F17EB"}.mdi-chili-hot::before{content:"\F07B2"}.mdi-chili-hot-outline::before{content:"\F17EC"}.mdi-chili-medium::before{content:"\F07B3"}.mdi-chili-medium-outline::before{content:"\F17ED"}.mdi-chili-mild::before{content:"\F07B4"}.mdi-chili-mild-outline::before{content:"\F17EE"}.mdi-chili-off::before{content:"\F1467"}.mdi-chili-off-outline::before{content:"\F17EF"}.mdi-chip::before{content:"\F061A"}.mdi-church::before{content:"\F0144"}.mdi-church-outline::before{content:"\F1B02"}.mdi-cigar::before{content:"\F1189"}.mdi-cigar-off::before{content:"\F141B"}.mdi-circle::before{content:"\F0765"}.mdi-circle-box::before{content:"\F15DC"}.mdi-circle-box-outline::before{content:"\F15DD"}.mdi-circle-double::before{content:"\F0E95"}.mdi-circle-edit-outline::before{content:"\F08D5"}.mdi-circle-expand::before{content:"\F0E96"}.mdi-circle-half::before{content:"\F1395"}.mdi-circle-half-full::before{content:"\F1396"}.mdi-circle-medium::before{content:"\F09DE"}.mdi-circle-multiple::before{content:"\F0B38"}.mdi-circle-multiple-outline::before{content:"\F0695"}.mdi-circle-off-outline::before{content:"\F10D3"}.mdi-circle-opacity::before{content:"\F1853"}.mdi-circle-outline::before{content:"\F0766"}.mdi-circle-slice-1::before{content:"\F0A9E"}.mdi-circle-slice-2::before{content:"\F0A9F"}.mdi-circle-slice-3::before{content:"\F0AA0"}.mdi-circle-slice-4::before{content:"\F0AA1"}.mdi-circle-slice-5::before{content:"\F0AA2"}.mdi-circle-slice-6::before{content:"\F0AA3"}.mdi-circle-slice-7::before{content:"\F0AA4"}.mdi-circle-slice-8::before{content:"\F0AA5"}.mdi-circle-small::before{content:"\F09DF"}.mdi-circular-saw::before{content:"\F0E22"}.mdi-city::before{content:"\F0146"}.mdi-city-switch::before{content:"\F1C28"}.mdi-city-variant::before{content:"\F0A36"}.mdi-city-variant-outline::before{content:"\F0A37"}.mdi-clipboard::before{content:"\F0147"}.mdi-clipboard-account::before{content:"\F0148"}.mdi-clipboard-account-outline::before{content:"\F0C55"}.mdi-clipboard-alert::before{content:"\F0149"}.mdi-clipboard-alert-outline::before{content:"\F0CF7"}.mdi-clipboard-arrow-down::before{content:"\F014A"}.mdi-clipboard-arrow-down-outline::before{content:"\F0C56"}.mdi-clipboard-arrow-left::before{content:"\F014B"}.mdi-clipboard-arrow-left-outline::before{content:"\F0CF8"}.mdi-clipboard-arrow-right::before{content:"\F0CF9"}.mdi-clipboard-arrow-right-outline::before{content:"\F0CFA"}.mdi-clipboard-arrow-up::before{content:"\F0C57"}.mdi-clipboard-arrow-up-outline::before{content:"\F0C58"}.mdi-clipboard-check::before{content:"\F014E"}.mdi-clipboard-check-multiple::before{content:"\F1263"}.mdi-clipboard-check-multiple-outline::before{content:"\F1264"}.mdi-clipboard-check-outline::before{content:"\F08A8"}.mdi-clipboard-clock::before{content:"\F16E2"}.mdi-clipboard-clock-outline::before{content:"\F16E3"}.mdi-clipboard-edit::before{content:"\F14E5"}.mdi-clipboard-edit-outline::before{content:"\F14E6"}.mdi-clipboard-file::before{content:"\F1265"}.mdi-clipboard-file-outline::before{content:"\F1266"}.mdi-clipboard-flow::before{content:"\F06C8"}.mdi-clipboard-flow-outline::before{content:"\F1117"}.mdi-clipboard-list::before{content:"\F10D4"}.mdi-clipboard-list-outline::before{content:"\F10D5"}.mdi-clipboard-minus::before{content:"\F1618"}.mdi-clipboard-minus-outline::before{content:"\F1619"}.mdi-clipboard-multiple::before{content:"\F1267"}.mdi-clipboard-multiple-outline::before{content:"\F1268"}.mdi-clipboard-off::before{content:"\F161A"}.mdi-clipboard-off-outline::before{content:"\F161B"}.mdi-clipboard-outline::before{content:"\F014C"}.mdi-clipboard-play::before{content:"\F0C59"}.mdi-clipboard-play-multiple::before{content:"\F1269"}.mdi-clipboard-play-multiple-outline::before{content:"\F126A"}.mdi-clipboard-play-outline::before{content:"\F0C5A"}.mdi-clipboard-plus::before{content:"\F0751"}.mdi-clipboard-plus-outline::before{content:"\F131F"}.mdi-clipboard-pulse::before{content:"\F085D"}.mdi-clipboard-pulse-outline::before{content:"\F085E"}.mdi-clipboard-remove::before{content:"\F161C"}.mdi-clipboard-remove-outline::before{content:"\F161D"}.mdi-clipboard-search::before{content:"\F161E"}.mdi-clipboard-search-outline::before{content:"\F161F"}.mdi-clipboard-text::before{content:"\F014D"}.mdi-clipboard-text-clock::before{content:"\F18F9"}.mdi-clipboard-text-clock-outline::before{content:"\F18FA"}.mdi-clipboard-text-multiple::before{content:"\F126B"}.mdi-clipboard-text-multiple-outline::before{content:"\F126C"}.mdi-clipboard-text-off::before{content:"\F1620"}.mdi-clipboard-text-off-outline::before{content:"\F1621"}.mdi-clipboard-text-outline::before{content:"\F0A38"}.mdi-clipboard-text-play::before{content:"\F0C5B"}.mdi-clipboard-text-play-outline::before{content:"\F0C5C"}.mdi-clipboard-text-search::before{content:"\F1622"}.mdi-clipboard-text-search-outline::before{content:"\F1623"}.mdi-clippy::before{content:"\F014F"}.mdi-clock::before{content:"\F0954"}.mdi-clock-alert::before{content:"\F0955"}.mdi-clock-alert-outline::before{content:"\F05CE"}.mdi-clock-check::before{content:"\F0FA8"}.mdi-clock-check-outline::before{content:"\F0FA9"}.mdi-clock-digital::before{content:"\F0E97"}.mdi-clock-edit::before{content:"\F19BA"}.mdi-clock-edit-outline::before{content:"\F19BB"}.mdi-clock-end::before{content:"\F0151"}.mdi-clock-fast::before{content:"\F0152"}.mdi-clock-in::before{content:"\F0153"}.mdi-clock-minus::before{content:"\F1863"}.mdi-clock-minus-outline::before{content:"\F1864"}.mdi-clock-out::before{content:"\F0154"}.mdi-clock-outline::before{content:"\F0150"}.mdi-clock-plus::before{content:"\F1861"}.mdi-clock-plus-outline::before{content:"\F1862"}.mdi-clock-remove::before{content:"\F1865"}.mdi-clock-remove-outline::before{content:"\F1866"}.mdi-clock-star-four-points::before{content:"\F1C29"}.mdi-clock-star-four-points-outline::before{content:"\F1C2A"}.mdi-clock-start::before{content:"\F0155"}.mdi-clock-time-eight::before{content:"\F1446"}.mdi-clock-time-eight-outline::before{content:"\F1452"}.mdi-clock-time-eleven::before{content:"\F1449"}.mdi-clock-time-eleven-outline::before{content:"\F1455"}.mdi-clock-time-five::before{content:"\F1443"}.mdi-clock-time-five-outline::before{content:"\F144F"}.mdi-clock-time-four::before{content:"\F1442"}.mdi-clock-time-four-outline::before{content:"\F144E"}.mdi-clock-time-nine::before{content:"\F1447"}.mdi-clock-time-nine-outline::before{content:"\F1453"}.mdi-clock-time-one::before{content:"\F143F"}.mdi-clock-time-one-outline::before{content:"\F144B"}.mdi-clock-time-seven::before{content:"\F1445"}.mdi-clock-time-seven-outline::before{content:"\F1451"}.mdi-clock-time-six::before{content:"\F1444"}.mdi-clock-time-six-outline::before{content:"\F1450"}.mdi-clock-time-ten::before{content:"\F1448"}.mdi-clock-time-ten-outline::before{content:"\F1454"}.mdi-clock-time-three::before{content:"\F1441"}.mdi-clock-time-three-outline::before{content:"\F144D"}.mdi-clock-time-twelve::before{content:"\F144A"}.mdi-clock-time-twelve-outline::before{content:"\F1456"}.mdi-clock-time-two::before{content:"\F1440"}.mdi-clock-time-two-outline::before{content:"\F144C"}.mdi-close::before{content:"\F0156"}.mdi-close-box::before{content:"\F0157"}.mdi-close-box-multiple::before{content:"\F0C5D"}.mdi-close-box-multiple-outline::before{content:"\F0C5E"}.mdi-close-box-outline::before{content:"\F0158"}.mdi-close-circle::before{content:"\F0159"}.mdi-close-circle-multiple::before{content:"\F062A"}.mdi-close-circle-multiple-outline::before{content:"\F0883"}.mdi-close-circle-outline::before{content:"\F015A"}.mdi-close-network::before{content:"\F015B"}.mdi-close-network-outline::before{content:"\F0C5F"}.mdi-close-octagon::before{content:"\F015C"}.mdi-close-octagon-outline::before{content:"\F015D"}.mdi-close-outline::before{content:"\F06C9"}.mdi-close-thick::before{content:"\F1398"}.mdi-closed-caption::before{content:"\F015E"}.mdi-closed-caption-outline::before{content:"\F0DBD"}.mdi-cloud::before{content:"\F015F"}.mdi-cloud-alert::before{content:"\F09E0"}.mdi-cloud-alert-outline::before{content:"\F1BE0"}.mdi-cloud-arrow-down::before{content:"\F1BE1"}.mdi-cloud-arrow-down-outline::before{content:"\F1BE2"}.mdi-cloud-arrow-left::before{content:"\F1BE3"}.mdi-cloud-arrow-left-outline::before{content:"\F1BE4"}.mdi-cloud-arrow-right::before{content:"\F1BE5"}.mdi-cloud-arrow-right-outline::before{content:"\F1BE6"}.mdi-cloud-arrow-up::before{content:"\F1BE7"}.mdi-cloud-arrow-up-outline::before{content:"\F1BE8"}.mdi-cloud-braces::before{content:"\F07B5"}.mdi-cloud-cancel::before{content:"\F1BE9"}.mdi-cloud-cancel-outline::before{content:"\F1BEA"}.mdi-cloud-check::before{content:"\F1BEB"}.mdi-cloud-check-outline::before{content:"\F1BEC"}.mdi-cloud-check-variant::before{content:"\F0160"}.mdi-cloud-check-variant-outline::before{content:"\F12CC"}.mdi-cloud-circle::before{content:"\F0161"}.mdi-cloud-circle-outline::before{content:"\F1BED"}.mdi-cloud-clock::before{content:"\F1BEE"}.mdi-cloud-clock-outline::before{content:"\F1BEF"}.mdi-cloud-cog::before{content:"\F1BF0"}.mdi-cloud-cog-outline::before{content:"\F1BF1"}.mdi-cloud-download::before{content:"\F0162"}.mdi-cloud-download-outline::before{content:"\F0B7D"}.mdi-cloud-key::before{content:"\F1CA1"}.mdi-cloud-key-outline::before{content:"\F1CA2"}.mdi-cloud-lock::before{content:"\F11F1"}.mdi-cloud-lock-open::before{content:"\F1BF2"}.mdi-cloud-lock-open-outline::before{content:"\F1BF3"}.mdi-cloud-lock-outline::before{content:"\F11F2"}.mdi-cloud-minus::before{content:"\F1BF4"}.mdi-cloud-minus-outline::before{content:"\F1BF5"}.mdi-cloud-off::before{content:"\F1BF6"}.mdi-cloud-off-outline::before{content:"\F0164"}.mdi-cloud-outline::before{content:"\F0163"}.mdi-cloud-percent::before{content:"\F1A35"}.mdi-cloud-percent-outline::before{content:"\F1A36"}.mdi-cloud-plus::before{content:"\F1BF7"}.mdi-cloud-plus-outline::before{content:"\F1BF8"}.mdi-cloud-print::before{content:"\F0165"}.mdi-cloud-print-outline::before{content:"\F0166"}.mdi-cloud-question::before{content:"\F0A39"}.mdi-cloud-question-outline::before{content:"\F1BF9"}.mdi-cloud-refresh::before{content:"\F1BFA"}.mdi-cloud-refresh-outline::before{content:"\F1BFB"}.mdi-cloud-refresh-variant::before{content:"\F052A"}.mdi-cloud-refresh-variant-outline::before{content:"\F1BFC"}.mdi-cloud-remove::before{content:"\F1BFD"}.mdi-cloud-remove-outline::before{content:"\F1BFE"}.mdi-cloud-search::before{content:"\F0956"}.mdi-cloud-search-outline::before{content:"\F0957"}.mdi-cloud-sync::before{content:"\F063F"}.mdi-cloud-sync-outline::before{content:"\F12D6"}.mdi-cloud-tags::before{content:"\F07B6"}.mdi-cloud-upload::before{content:"\F0167"}.mdi-cloud-upload-outline::before{content:"\F0B7E"}.mdi-clouds::before{content:"\F1B95"}.mdi-clover::before{content:"\F0816"}.mdi-clover-outline::before{content:"\F1C62"}.mdi-coach-lamp::before{content:"\F1020"}.mdi-coach-lamp-variant::before{content:"\F1A37"}.mdi-coat-rack::before{content:"\F109E"}.mdi-code-array::before{content:"\F0168"}.mdi-code-block-braces::before{content:"\F1C83"}.mdi-code-block-brackets::before{content:"\F1C84"}.mdi-code-block-parentheses::before{content:"\F1C85"}.mdi-code-block-tags::before{content:"\F1C86"}.mdi-code-braces::before{content:"\F0169"}.mdi-code-braces-box::before{content:"\F10D6"}.mdi-code-brackets::before{content:"\F016A"}.mdi-code-equal::before{content:"\F016B"}.mdi-code-greater-than::before{content:"\F016C"}.mdi-code-greater-than-or-equal::before{content:"\F016D"}.mdi-code-json::before{content:"\F0626"}.mdi-code-less-than::before{content:"\F016E"}.mdi-code-less-than-or-equal::before{content:"\F016F"}.mdi-code-not-equal::before{content:"\F0170"}.mdi-code-not-equal-variant::before{content:"\F0171"}.mdi-code-parentheses::before{content:"\F0172"}.mdi-code-parentheses-box::before{content:"\F10D7"}.mdi-code-string::before{content:"\F0173"}.mdi-code-tags::before{content:"\F0174"}.mdi-code-tags-check::before{content:"\F0694"}.mdi-codepen::before{content:"\F0175"}.mdi-coffee::before{content:"\F0176"}.mdi-coffee-maker::before{content:"\F109F"}.mdi-coffee-maker-check::before{content:"\F1931"}.mdi-coffee-maker-check-outline::before{content:"\F1932"}.mdi-coffee-maker-outline::before{content:"\F181B"}.mdi-coffee-off::before{content:"\F0FAA"}.mdi-coffee-off-outline::before{content:"\F0FAB"}.mdi-coffee-outline::before{content:"\F06CA"}.mdi-coffee-to-go::before{content:"\F0177"}.mdi-coffee-to-go-outline::before{content:"\F130E"}.mdi-coffin::before{content:"\F0B7F"}.mdi-cog::before{content:"\F0493"}.mdi-cog-box::before{content:"\F0494"}.mdi-cog-clockwise::before{content:"\F11DD"}.mdi-cog-counterclockwise::before{content:"\F11DE"}.mdi-cog-off::before{content:"\F13CE"}.mdi-cog-off-outline::before{content:"\F13CF"}.mdi-cog-outline::before{content:"\F08BB"}.mdi-cog-pause::before{content:"\F1933"}.mdi-cog-pause-outline::before{content:"\F1934"}.mdi-cog-play::before{content:"\F1935"}.mdi-cog-play-outline::before{content:"\F1936"}.mdi-cog-refresh::before{content:"\F145E"}.mdi-cog-refresh-outline::before{content:"\F145F"}.mdi-cog-stop::before{content:"\F1937"}.mdi-cog-stop-outline::before{content:"\F1938"}.mdi-cog-sync::before{content:"\F1460"}.mdi-cog-sync-outline::before{content:"\F1461"}.mdi-cog-transfer::before{content:"\F105B"}.mdi-cog-transfer-outline::before{content:"\F105C"}.mdi-cogs::before{content:"\F08D6"}.mdi-collage::before{content:"\F0640"}.mdi-collapse-all::before{content:"\F0AA6"}.mdi-collapse-all-outline::before{content:"\F0AA7"}.mdi-color-helper::before{content:"\F0179"}.mdi-comma::before{content:"\F0E23"}.mdi-comma-box::before{content:"\F0E2B"}.mdi-comma-box-outline::before{content:"\F0E24"}.mdi-comma-circle::before{content:"\F0E25"}.mdi-comma-circle-outline::before{content:"\F0E26"}.mdi-comment::before{content:"\F017A"}.mdi-comment-account::before{content:"\F017B"}.mdi-comment-account-outline::before{content:"\F017C"}.mdi-comment-alert::before{content:"\F017D"}.mdi-comment-alert-outline::before{content:"\F017E"}.mdi-comment-arrow-left::before{content:"\F09E1"}.mdi-comment-arrow-left-outline::before{content:"\F09E2"}.mdi-comment-arrow-right::before{content:"\F09E3"}.mdi-comment-arrow-right-outline::before{content:"\F09E4"}.mdi-comment-bookmark::before{content:"\F15AE"}.mdi-comment-bookmark-outline::before{content:"\F15AF"}.mdi-comment-check::before{content:"\F017F"}.mdi-comment-check-outline::before{content:"\F0180"}.mdi-comment-edit::before{content:"\F11BF"}.mdi-comment-edit-outline::before{content:"\F12C4"}.mdi-comment-eye::before{content:"\F0A3A"}.mdi-comment-eye-outline::before{content:"\F0A3B"}.mdi-comment-flash::before{content:"\F15B0"}.mdi-comment-flash-outline::before{content:"\F15B1"}.mdi-comment-minus::before{content:"\F15DF"}.mdi-comment-minus-outline::before{content:"\F15E0"}.mdi-comment-multiple::before{content:"\F085F"}.mdi-comment-multiple-outline::before{content:"\F0181"}.mdi-comment-off::before{content:"\F15E1"}.mdi-comment-off-outline::before{content:"\F15E2"}.mdi-comment-outline::before{content:"\F0182"}.mdi-comment-plus::before{content:"\F09E5"}.mdi-comment-plus-outline::before{content:"\F0183"}.mdi-comment-processing::before{content:"\F0184"}.mdi-comment-processing-outline::before{content:"\F0185"}.mdi-comment-question::before{content:"\F0817"}.mdi-comment-question-outline::before{content:"\F0186"}.mdi-comment-quote::before{content:"\F1021"}.mdi-comment-quote-outline::before{content:"\F1022"}.mdi-comment-remove::before{content:"\F05DE"}.mdi-comment-remove-outline::before{content:"\F0187"}.mdi-comment-search::before{content:"\F0A3C"}.mdi-comment-search-outline::before{content:"\F0A3D"}.mdi-comment-text::before{content:"\F0188"}.mdi-comment-text-multiple::before{content:"\F0860"}.mdi-comment-text-multiple-outline::before{content:"\F0861"}.mdi-comment-text-outline::before{content:"\F0189"}.mdi-compare::before{content:"\F018A"}.mdi-compare-horizontal::before{content:"\F1492"}.mdi-compare-remove::before{content:"\F18B3"}.mdi-compare-vertical::before{content:"\F1493"}.mdi-compass::before{content:"\F018B"}.mdi-compass-off::before{content:"\F0B80"}.mdi-compass-off-outline::before{content:"\F0B81"}.mdi-compass-outline::before{content:"\F018C"}.mdi-compass-rose::before{content:"\F1382"}.mdi-compost::before{content:"\F1A38"}.mdi-cone::before{content:"\F194C"}.mdi-cone-off::before{content:"\F194D"}.mdi-connection::before{content:"\F1616"}.mdi-console::before{content:"\F018D"}.mdi-console-line::before{content:"\F07B7"}.mdi-console-network::before{content:"\F08A9"}.mdi-console-network-outline::before{content:"\F0C60"}.mdi-consolidate::before{content:"\F10D8"}.mdi-contactless-payment::before{content:"\F0D6A"}.mdi-contactless-payment-circle::before{content:"\F0321"}.mdi-contactless-payment-circle-outline::before{content:"\F0408"}.mdi-contacts::before{content:"\F06CB"}.mdi-contacts-outline::before{content:"\F05B8"}.mdi-contain::before{content:"\F0A3E"}.mdi-contain-end::before{content:"\F0A3F"}.mdi-contain-start::before{content:"\F0A40"}.mdi-content-copy::before{content:"\F018F"}.mdi-content-cut::before{content:"\F0190"}.mdi-content-duplicate::before{content:"\F0191"}.mdi-content-paste::before{content:"\F0192"}.mdi-content-save::before{content:"\F0193"}.mdi-content-save-alert::before{content:"\F0F42"}.mdi-content-save-alert-outline::before{content:"\F0F43"}.mdi-content-save-all::before{content:"\F0194"}.mdi-content-save-all-outline::before{content:"\F0F44"}.mdi-content-save-check::before{content:"\F18EA"}.mdi-content-save-check-outline::before{content:"\F18EB"}.mdi-content-save-cog::before{content:"\F145B"}.mdi-content-save-cog-outline::before{content:"\F145C"}.mdi-content-save-edit::before{content:"\F0CFB"}.mdi-content-save-edit-outline::before{content:"\F0CFC"}.mdi-content-save-minus::before{content:"\F1B43"}.mdi-content-save-minus-outline::before{content:"\F1B44"}.mdi-content-save-move::before{content:"\F0E27"}.mdi-content-save-move-outline::before{content:"\F0E28"}.mdi-content-save-off::before{content:"\F1643"}.mdi-content-save-off-outline::before{content:"\F1644"}.mdi-content-save-outline::before{content:"\F0818"}.mdi-content-save-plus::before{content:"\F1B41"}.mdi-content-save-plus-outline::before{content:"\F1B42"}.mdi-content-save-settings::before{content:"\F061B"}.mdi-content-save-settings-outline::before{content:"\F0B2E"}.mdi-contrast::before{content:"\F0195"}.mdi-contrast-box::before{content:"\F0196"}.mdi-contrast-circle::before{content:"\F0197"}.mdi-controller::before{content:"\F02B4"}.mdi-controller-classic::before{content:"\F0B82"}.mdi-controller-classic-outline::before{content:"\F0B83"}.mdi-controller-off::before{content:"\F02B5"}.mdi-cookie::before{content:"\F0198"}.mdi-cookie-alert::before{content:"\F16D0"}.mdi-cookie-alert-outline::before{content:"\F16D1"}.mdi-cookie-check::before{content:"\F16D2"}.mdi-cookie-check-outline::before{content:"\F16D3"}.mdi-cookie-clock::before{content:"\F16E4"}.mdi-cookie-clock-outline::before{content:"\F16E5"}.mdi-cookie-cog::before{content:"\F16D4"}.mdi-cookie-cog-outline::before{content:"\F16D5"}.mdi-cookie-edit::before{content:"\F16E6"}.mdi-cookie-edit-outline::before{content:"\F16E7"}.mdi-cookie-lock::before{content:"\F16E8"}.mdi-cookie-lock-outline::before{content:"\F16E9"}.mdi-cookie-minus::before{content:"\F16DA"}.mdi-cookie-minus-outline::before{content:"\F16DB"}.mdi-cookie-off::before{content:"\F16EA"}.mdi-cookie-off-outline::before{content:"\F16EB"}.mdi-cookie-outline::before{content:"\F16DE"}.mdi-cookie-plus::before{content:"\F16D6"}.mdi-cookie-plus-outline::before{content:"\F16D7"}.mdi-cookie-refresh::before{content:"\F16EC"}.mdi-cookie-refresh-outline::before{content:"\F16ED"}.mdi-cookie-remove::before{content:"\F16D8"}.mdi-cookie-remove-outline::before{content:"\F16D9"}.mdi-cookie-settings::before{content:"\F16DC"}.mdi-cookie-settings-outline::before{content:"\F16DD"}.mdi-coolant-temperature::before{content:"\F03C8"}.mdi-copyleft::before{content:"\F1939"}.mdi-copyright::before{content:"\F05E6"}.mdi-cordova::before{content:"\F0958"}.mdi-corn::before{content:"\F07B8"}.mdi-corn-off::before{content:"\F13EF"}.mdi-cosine-wave::before{content:"\F1479"}.mdi-counter::before{content:"\F0199"}.mdi-countertop::before{content:"\F181C"}.mdi-countertop-outline::before{content:"\F181D"}.mdi-cow::before{content:"\F019A"}.mdi-cow-off::before{content:"\F18FC"}.mdi-cpu-32-bit::before{content:"\F0EDF"}.mdi-cpu-64-bit::before{content:"\F0EE0"}.mdi-cradle::before{content:"\F198B"}.mdi-cradle-outline::before{content:"\F1991"}.mdi-crane::before{content:"\F0862"}.mdi-creation::before{content:"\F0674"}.mdi-creation-outline::before{content:"\F1C2B"}.mdi-creative-commons::before{content:"\F0D6B"}.mdi-credit-card::before{content:"\F0FEF"}.mdi-credit-card-check::before{content:"\F13D0"}.mdi-credit-card-check-outline::before{content:"\F13D1"}.mdi-credit-card-chip::before{content:"\F190F"}.mdi-credit-card-chip-outline::before{content:"\F1910"}.mdi-credit-card-clock::before{content:"\F0EE1"}.mdi-credit-card-clock-outline::before{content:"\F0EE2"}.mdi-credit-card-edit::before{content:"\F17D7"}.mdi-credit-card-edit-outline::before{content:"\F17D8"}.mdi-credit-card-fast::before{content:"\F1911"}.mdi-credit-card-fast-outline::before{content:"\F1912"}.mdi-credit-card-lock::before{content:"\F18E7"}.mdi-credit-card-lock-outline::before{content:"\F18E8"}.mdi-credit-card-marker::before{content:"\F06A8"}.mdi-credit-card-marker-outline::before{content:"\F0DBE"}.mdi-credit-card-minus::before{content:"\F0FAC"}.mdi-credit-card-minus-outline::before{content:"\F0FAD"}.mdi-credit-card-multiple::before{content:"\F0FF0"}.mdi-credit-card-multiple-outline::before{content:"\F019C"}.mdi-credit-card-off::before{content:"\F0FF1"}.mdi-credit-card-off-outline::before{content:"\F05E4"}.mdi-credit-card-outline::before{content:"\F019B"}.mdi-credit-card-plus::before{content:"\F0FF2"}.mdi-credit-card-plus-outline::before{content:"\F0676"}.mdi-credit-card-refresh::before{content:"\F1645"}.mdi-credit-card-refresh-outline::before{content:"\F1646"}.mdi-credit-card-refund::before{content:"\F0FF3"}.mdi-credit-card-refund-outline::before{content:"\F0AA8"}.mdi-credit-card-remove::before{content:"\F0FAE"}.mdi-credit-card-remove-outline::before{content:"\F0FAF"}.mdi-credit-card-scan::before{content:"\F0FF4"}.mdi-credit-card-scan-outline::before{content:"\F019D"}.mdi-credit-card-search::before{content:"\F1647"}.mdi-credit-card-search-outline::before{content:"\F1648"}.mdi-credit-card-settings::before{content:"\F0FF5"}.mdi-credit-card-settings-outline::before{content:"\F08D7"}.mdi-credit-card-sync::before{content:"\F1649"}.mdi-credit-card-sync-outline::before{content:"\F164A"}.mdi-credit-card-wireless::before{content:"\F0802"}.mdi-credit-card-wireless-off::before{content:"\F057A"}.mdi-credit-card-wireless-off-outline::before{content:"\F057B"}.mdi-credit-card-wireless-outline::before{content:"\F0D6C"}.mdi-cricket::before{content:"\F0D6D"}.mdi-crop::before{content:"\F019E"}.mdi-crop-free::before{content:"\F019F"}.mdi-crop-landscape::before{content:"\F01A0"}.mdi-crop-portrait::before{content:"\F01A1"}.mdi-crop-rotate::before{content:"\F0696"}.mdi-crop-square::before{content:"\F01A2"}.mdi-cross::before{content:"\F0953"}.mdi-cross-bolnisi::before{content:"\F0CED"}.mdi-cross-celtic::before{content:"\F0CF5"}.mdi-cross-outline::before{content:"\F0CF6"}.mdi-crosshairs::before{content:"\F01A3"}.mdi-crosshairs-gps::before{content:"\F01A4"}.mdi-crosshairs-off::before{content:"\F0F45"}.mdi-crosshairs-question::before{content:"\F1136"}.mdi-crowd::before{content:"\F1975"}.mdi-crown::before{content:"\F01A5"}.mdi-crown-circle::before{content:"\F17DC"}.mdi-crown-circle-outline::before{content:"\F17DD"}.mdi-crown-outline::before{content:"\F11D0"}.mdi-cryengine::before{content:"\F0959"}.mdi-crystal-ball::before{content:"\F0B2F"}.mdi-cube::before{content:"\F01A6"}.mdi-cube-off::before{content:"\F141C"}.mdi-cube-off-outline::before{content:"\F141D"}.mdi-cube-outline::before{content:"\F01A7"}.mdi-cube-scan::before{content:"\F0B84"}.mdi-cube-send::before{content:"\F01A8"}.mdi-cube-unfolded::before{content:"\F01A9"}.mdi-cup::before{content:"\F01AA"}.mdi-cup-off::before{content:"\F05E5"}.mdi-cup-off-outline::before{content:"\F137D"}.mdi-cup-outline::before{content:"\F130F"}.mdi-cup-water::before{content:"\F01AB"}.mdi-cupboard::before{content:"\F0F46"}.mdi-cupboard-outline::before{content:"\F0F47"}.mdi-cupcake::before{content:"\F095A"}.mdi-curling::before{content:"\F0863"}.mdi-currency-bdt::before{content:"\F0864"}.mdi-currency-brl::before{content:"\F0B85"}.mdi-currency-btc::before{content:"\F01AC"}.mdi-currency-cny::before{content:"\F07BA"}.mdi-currency-eth::before{content:"\F07BB"}.mdi-currency-eur::before{content:"\F01AD"}.mdi-currency-eur-off::before{content:"\F1315"}.mdi-currency-fra::before{content:"\F1A39"}.mdi-currency-gbp::before{content:"\F01AE"}.mdi-currency-ils::before{content:"\F0C61"}.mdi-currency-inr::before{content:"\F01AF"}.mdi-currency-jpy::before{content:"\F07BC"}.mdi-currency-krw::before{content:"\F07BD"}.mdi-currency-kzt::before{content:"\F0865"}.mdi-currency-mnt::before{content:"\F1512"}.mdi-currency-ngn::before{content:"\F01B0"}.mdi-currency-php::before{content:"\F09E6"}.mdi-currency-rial::before{content:"\F0E9C"}.mdi-currency-rub::before{content:"\F01B1"}.mdi-currency-rupee::before{content:"\F1976"}.mdi-currency-sign::before{content:"\F07BE"}.mdi-currency-thb::before{content:"\F1C05"}.mdi-currency-try::before{content:"\F01B2"}.mdi-currency-twd::before{content:"\F07BF"}.mdi-currency-uah::before{content:"\F1B9B"}.mdi-currency-usd::before{content:"\F01C1"}.mdi-currency-usd-off::before{content:"\F067A"}.mdi-current-ac::before{content:"\F1480"}.mdi-current-dc::before{content:"\F095C"}.mdi-cursor-default::before{content:"\F01C0"}.mdi-cursor-default-click::before{content:"\F0CFD"}.mdi-cursor-default-click-outline::before{content:"\F0CFE"}.mdi-cursor-default-gesture::before{content:"\F1127"}.mdi-cursor-default-gesture-outline::before{content:"\F1128"}.mdi-cursor-default-outline::before{content:"\F01BF"}.mdi-cursor-move::before{content:"\F01BE"}.mdi-cursor-pointer::before{content:"\F01BD"}.mdi-cursor-text::before{content:"\F05E7"}.mdi-curtains::before{content:"\F1846"}.mdi-curtains-closed::before{content:"\F1847"}.mdi-cylinder::before{content:"\F194E"}.mdi-cylinder-off::before{content:"\F194F"}.mdi-dance-ballroom::before{content:"\F15FB"}.mdi-dance-pole::before{content:"\F1578"}.mdi-data-matrix::before{content:"\F153C"}.mdi-data-matrix-edit::before{content:"\F153D"}.mdi-data-matrix-minus::before{content:"\F153E"}.mdi-data-matrix-plus::before{content:"\F153F"}.mdi-data-matrix-remove::before{content:"\F1540"}.mdi-data-matrix-scan::before{content:"\F1541"}.mdi-database::before{content:"\F01BC"}.mdi-database-alert::before{content:"\F163A"}.mdi-database-alert-outline::before{content:"\F1624"}.mdi-database-arrow-down::before{content:"\F163B"}.mdi-database-arrow-down-outline::before{content:"\F1625"}.mdi-database-arrow-left::before{content:"\F163C"}.mdi-database-arrow-left-outline::before{content:"\F1626"}.mdi-database-arrow-right::before{content:"\F163D"}.mdi-database-arrow-right-outline::before{content:"\F1627"}.mdi-database-arrow-up::before{content:"\F163E"}.mdi-database-arrow-up-outline::before{content:"\F1628"}.mdi-database-check::before{content:"\F0AA9"}.mdi-database-check-outline::before{content:"\F1629"}.mdi-database-clock::before{content:"\F163F"}.mdi-database-clock-outline::before{content:"\F162A"}.mdi-database-cog::before{content:"\F164B"}.mdi-database-cog-outline::before{content:"\F164C"}.mdi-database-edit::before{content:"\F0B86"}.mdi-database-edit-outline::before{content:"\F162B"}.mdi-database-export::before{content:"\F095E"}.mdi-database-export-outline::before{content:"\F162C"}.mdi-database-eye::before{content:"\F191F"}.mdi-database-eye-off::before{content:"\F1920"}.mdi-database-eye-off-outline::before{content:"\F1921"}.mdi-database-eye-outline::before{content:"\F1922"}.mdi-database-import::before{content:"\F095D"}.mdi-database-import-outline::before{content:"\F162D"}.mdi-database-lock::before{content:"\F0AAA"}.mdi-database-lock-outline::before{content:"\F162E"}.mdi-database-marker::before{content:"\F12F6"}.mdi-database-marker-outline::before{content:"\F162F"}.mdi-database-minus::before{content:"\F01BB"}.mdi-database-minus-outline::before{content:"\F1630"}.mdi-database-off::before{content:"\F1640"}.mdi-database-off-outline::before{content:"\F1631"}.mdi-database-outline::before{content:"\F1632"}.mdi-database-plus::before{content:"\F01BA"}.mdi-database-plus-outline::before{content:"\F1633"}.mdi-database-refresh::before{content:"\F05C2"}.mdi-database-refresh-outline::before{content:"\F1634"}.mdi-database-remove::before{content:"\F0D00"}.mdi-database-remove-outline::before{content:"\F1635"}.mdi-database-search::before{content:"\F0866"}.mdi-database-search-outline::before{content:"\F1636"}.mdi-database-settings::before{content:"\F0D01"}.mdi-database-settings-outline::before{content:"\F1637"}.mdi-database-sync::before{content:"\F0CFF"}.mdi-database-sync-outline::before{content:"\F1638"}.mdi-death-star::before{content:"\F08D8"}.mdi-death-star-variant::before{content:"\F08D9"}.mdi-deathly-hallows::before{content:"\F0B87"}.mdi-debian::before{content:"\F08DA"}.mdi-debug-step-into::before{content:"\F01B9"}.mdi-debug-step-out::before{content:"\F01B8"}.mdi-debug-step-over::before{content:"\F01B7"}.mdi-decagram::before{content:"\F076C"}.mdi-decagram-outline::before{content:"\F076D"}.mdi-decimal::before{content:"\F10A1"}.mdi-decimal-comma::before{content:"\F10A2"}.mdi-decimal-comma-decrease::before{content:"\F10A3"}.mdi-decimal-comma-increase::before{content:"\F10A4"}.mdi-decimal-decrease::before{content:"\F01B6"}.mdi-decimal-increase::before{content:"\F01B5"}.mdi-delete::before{content:"\F01B4"}.mdi-delete-alert::before{content:"\F10A5"}.mdi-delete-alert-outline::before{content:"\F10A6"}.mdi-delete-circle::before{content:"\F0683"}.mdi-delete-circle-outline::before{content:"\F0B88"}.mdi-delete-clock::before{content:"\F1556"}.mdi-delete-clock-outline::before{content:"\F1557"}.mdi-delete-empty::before{content:"\F06CC"}.mdi-delete-empty-outline::before{content:"\F0E9D"}.mdi-delete-forever::before{content:"\F05E8"}.mdi-delete-forever-outline::before{content:"\F0B89"}.mdi-delete-off::before{content:"\F10A7"}.mdi-delete-off-outline::before{content:"\F10A8"}.mdi-delete-outline::before{content:"\F09E7"}.mdi-delete-restore::before{content:"\F0819"}.mdi-delete-sweep::before{content:"\F05E9"}.mdi-delete-sweep-outline::before{content:"\F0C62"}.mdi-delete-variant::before{content:"\F01B3"}.mdi-delta::before{content:"\F01C2"}.mdi-desk::before{content:"\F1239"}.mdi-desk-lamp::before{content:"\F095F"}.mdi-desk-lamp-off::before{content:"\F1B1F"}.mdi-desk-lamp-on::before{content:"\F1B20"}.mdi-deskphone::before{content:"\F01C3"}.mdi-desktop-classic::before{content:"\F07C0"}.mdi-desktop-tower::before{content:"\F01C5"}.mdi-desktop-tower-monitor::before{content:"\F0AAB"}.mdi-details::before{content:"\F01C6"}.mdi-dev-to::before{content:"\F0D6E"}.mdi-developer-board::before{content:"\F0697"}.mdi-deviantart::before{content:"\F01C7"}.mdi-devices::before{content:"\F0FB0"}.mdi-dharmachakra::before{content:"\F094B"}.mdi-diabetes::before{content:"\F1126"}.mdi-dialpad::before{content:"\F061C"}.mdi-diameter::before{content:"\F0C63"}.mdi-diameter-outline::before{content:"\F0C64"}.mdi-diameter-variant::before{content:"\F0C65"}.mdi-diamond::before{content:"\F0B8A"}.mdi-diamond-outline::before{content:"\F0B8B"}.mdi-diamond-stone::before{content:"\F01C8"}.mdi-diaper-outline::before{content:"\F1CCF"}.mdi-dice-1::before{content:"\F01CA"}.mdi-dice-1-outline::before{content:"\F114A"}.mdi-dice-2::before{content:"\F01CB"}.mdi-dice-2-outline::before{content:"\F114B"}.mdi-dice-3::before{content:"\F01CC"}.mdi-dice-3-outline::before{content:"\F114C"}.mdi-dice-4::before{content:"\F01CD"}.mdi-dice-4-outline::before{content:"\F114D"}.mdi-dice-5::before{content:"\F01CE"}.mdi-dice-5-outline::before{content:"\F114E"}.mdi-dice-6::before{content:"\F01CF"}.mdi-dice-6-outline::before{content:"\F114F"}.mdi-dice-d10::before{content:"\F1153"}.mdi-dice-d10-outline::before{content:"\F076F"}.mdi-dice-d12::before{content:"\F1154"}.mdi-dice-d12-outline::before{content:"\F0867"}.mdi-dice-d20::before{content:"\F1155"}.mdi-dice-d20-outline::before{content:"\F05EA"}.mdi-dice-d4::before{content:"\F1150"}.mdi-dice-d4-outline::before{content:"\F05EB"}.mdi-dice-d6::before{content:"\F1151"}.mdi-dice-d6-outline::before{content:"\F05ED"}.mdi-dice-d8::before{content:"\F1152"}.mdi-dice-d8-outline::before{content:"\F05EC"}.mdi-dice-multiple::before{content:"\F076E"}.mdi-dice-multiple-outline::before{content:"\F1156"}.mdi-digital-ocean::before{content:"\F1237"}.mdi-dip-switch::before{content:"\F07C1"}.mdi-directions::before{content:"\F01D0"}.mdi-directions-fork::before{content:"\F0641"}.mdi-disc::before{content:"\F05EE"}.mdi-disc-alert::before{content:"\F01D1"}.mdi-disc-player::before{content:"\F0960"}.mdi-dishwasher::before{content:"\F0AAC"}.mdi-dishwasher-alert::before{content:"\F11B8"}.mdi-dishwasher-off::before{content:"\F11B9"}.mdi-disqus::before{content:"\F01D2"}.mdi-distribute-horizontal-center::before{content:"\F11C9"}.mdi-distribute-horizontal-left::before{content:"\F11C8"}.mdi-distribute-horizontal-right::before{content:"\F11CA"}.mdi-distribute-vertical-bottom::before{content:"\F11CB"}.mdi-distribute-vertical-center::before{content:"\F11CC"}.mdi-distribute-vertical-top::before{content:"\F11CD"}.mdi-diversify::before{content:"\F1877"}.mdi-diving::before{content:"\F1977"}.mdi-diving-flippers::before{content:"\F0DBF"}.mdi-diving-helmet::before{content:"\F0DC0"}.mdi-diving-scuba::before{content:"\F1B77"}.mdi-diving-scuba-flag::before{content:"\F0DC2"}.mdi-diving-scuba-mask::before{content:"\F0DC1"}.mdi-diving-scuba-tank::before{content:"\F0DC3"}.mdi-diving-scuba-tank-multiple::before{content:"\F0DC4"}.mdi-diving-snorkel::before{content:"\F0DC5"}.mdi-division::before{content:"\F01D4"}.mdi-division-box::before{content:"\F01D5"}.mdi-dlna::before{content:"\F0A41"}.mdi-dna::before{content:"\F0684"}.mdi-dns::before{content:"\F01D6"}.mdi-dns-outline::before{content:"\F0B8C"}.mdi-dock-bottom::before{content:"\F10A9"}.mdi-dock-left::before{content:"\F10AA"}.mdi-dock-right::before{content:"\F10AB"}.mdi-dock-top::before{content:"\F1513"}.mdi-dock-window::before{content:"\F10AC"}.mdi-docker::before{content:"\F0868"}.mdi-doctor::before{content:"\F0A42"}.mdi-dog::before{content:"\F0A43"}.mdi-dog-service::before{content:"\F0AAD"}.mdi-dog-side::before{content:"\F0A44"}.mdi-dog-side-off::before{content:"\F16EE"}.mdi-dolby::before{content:"\F06B3"}.mdi-dolly::before{content:"\F0E9E"}.mdi-dolphin::before{content:"\F18B4"}.mdi-domain::before{content:"\F01D7"}.mdi-domain-off::before{content:"\F0D6F"}.mdi-domain-plus::before{content:"\F10AD"}.mdi-domain-remove::before{content:"\F10AE"}.mdi-domain-switch::before{content:"\F1C2C"}.mdi-dome-light::before{content:"\F141E"}.mdi-domino-mask::before{content:"\F1023"}.mdi-donkey::before{content:"\F07C2"}.mdi-door::before{content:"\F081A"}.mdi-door-closed::before{content:"\F081B"}.mdi-door-closed-cancel::before{content:"\F1C93"}.mdi-door-closed-lock::before{content:"\F10AF"}.mdi-door-open::before{content:"\F081C"}.mdi-door-sliding::before{content:"\F181E"}.mdi-door-sliding-lock::before{content:"\F181F"}.mdi-door-sliding-open::before{content:"\F1820"}.mdi-doorbell::before{content:"\F12E6"}.mdi-doorbell-video::before{content:"\F0869"}.mdi-dot-net::before{content:"\F0AAE"}.mdi-dots-circle::before{content:"\F1978"}.mdi-dots-grid::before{content:"\F15FC"}.mdi-dots-hexagon::before{content:"\F15FF"}.mdi-dots-horizontal::before{content:"\F01D8"}.mdi-dots-horizontal-circle::before{content:"\F07C3"}.mdi-dots-horizontal-circle-outline::before{content:"\F0B8D"}.mdi-dots-square::before{content:"\F15FD"}.mdi-dots-triangle::before{content:"\F15FE"}.mdi-dots-vertical::before{content:"\F01D9"}.mdi-dots-vertical-circle::before{content:"\F07C4"}.mdi-dots-vertical-circle-outline::before{content:"\F0B8E"}.mdi-download::before{content:"\F01DA"}.mdi-download-box::before{content:"\F1462"}.mdi-download-box-outline::before{content:"\F1463"}.mdi-download-circle::before{content:"\F1464"}.mdi-download-circle-outline::before{content:"\F1465"}.mdi-download-lock::before{content:"\F1320"}.mdi-download-lock-outline::before{content:"\F1321"}.mdi-download-multiple::before{content:"\F09E9"}.mdi-download-multiple-outline::before{content:"\F1CD0"}.mdi-download-network::before{content:"\F06F4"}.mdi-download-network-outline::before{content:"\F0C66"}.mdi-download-off::before{content:"\F10B0"}.mdi-download-off-outline::before{content:"\F10B1"}.mdi-download-outline::before{content:"\F0B8F"}.mdi-drag::before{content:"\F01DB"}.mdi-drag-horizontal::before{content:"\F01DC"}.mdi-drag-horizontal-variant::before{content:"\F12F0"}.mdi-drag-variant::before{content:"\F0B90"}.mdi-drag-vertical::before{content:"\F01DD"}.mdi-drag-vertical-variant::before{content:"\F12F1"}.mdi-drama-masks::before{content:"\F0D02"}.mdi-draw::before{content:"\F0F49"}.mdi-draw-pen::before{content:"\F19B9"}.mdi-drawing::before{content:"\F01DE"}.mdi-drawing-box::before{content:"\F01DF"}.mdi-dresser::before{content:"\F0F4A"}.mdi-dresser-outline::before{content:"\F0F4B"}.mdi-drone::before{content:"\F01E2"}.mdi-dropbox::before{content:"\F01E3"}.mdi-drupal::before{content:"\F01E4"}.mdi-duck::before{content:"\F01E5"}.mdi-dumbbell::before{content:"\F01E6"}.mdi-dump-truck::before{content:"\F0C67"}.mdi-ear-hearing::before{content:"\F07C5"}.mdi-ear-hearing-loop::before{content:"\F1AEE"}.mdi-ear-hearing-off::before{content:"\F0A45"}.mdi-earbuds::before{content:"\F184F"}.mdi-earbuds-off::before{content:"\F1850"}.mdi-earbuds-off-outline::before{content:"\F1851"}.mdi-earbuds-outline::before{content:"\F1852"}.mdi-earth::before{content:"\F01E7"}.mdi-earth-arrow-down::before{content:"\F1C87"}.mdi-earth-arrow-left::before{content:"\F1C88"}.mdi-earth-arrow-right::before{content:"\F1311"}.mdi-earth-arrow-up::before{content:"\F1C89"}.mdi-earth-box::before{content:"\F06CD"}.mdi-earth-box-minus::before{content:"\F1407"}.mdi-earth-box-off::before{content:"\F06CE"}.mdi-earth-box-plus::before{content:"\F1406"}.mdi-earth-box-remove::before{content:"\F1408"}.mdi-earth-minus::before{content:"\F1404"}.mdi-earth-off::before{content:"\F01E8"}.mdi-earth-plus::before{content:"\F1403"}.mdi-earth-remove::before{content:"\F1405"}.mdi-egg::before{content:"\F0AAF"}.mdi-egg-easter::before{content:"\F0AB0"}.mdi-egg-fried::before{content:"\F184A"}.mdi-egg-off::before{content:"\F13F0"}.mdi-egg-off-outline::before{content:"\F13F1"}.mdi-egg-outline::before{content:"\F13F2"}.mdi-eiffel-tower::before{content:"\F156B"}.mdi-eight-track::before{content:"\F09EA"}.mdi-eject::before{content:"\F01EA"}.mdi-eject-circle::before{content:"\F1B23"}.mdi-eject-circle-outline::before{content:"\F1B24"}.mdi-eject-outline::before{content:"\F0B91"}.mdi-electric-switch::before{content:"\F0E9F"}.mdi-electric-switch-closed::before{content:"\F10D9"}.mdi-electron-framework::before{content:"\F1024"}.mdi-elephant::before{content:"\F07C6"}.mdi-elevation-decline::before{content:"\F01EB"}.mdi-elevation-rise::before{content:"\F01EC"}.mdi-elevator::before{content:"\F01ED"}.mdi-elevator-down::before{content:"\F12C2"}.mdi-elevator-passenger::before{content:"\F1381"}.mdi-elevator-passenger-off::before{content:"\F1979"}.mdi-elevator-passenger-off-outline::before{content:"\F197A"}.mdi-elevator-passenger-outline::before{content:"\F197B"}.mdi-elevator-up::before{content:"\F12C1"}.mdi-ellipse::before{content:"\F0EA0"}.mdi-ellipse-outline::before{content:"\F0EA1"}.mdi-email::before{content:"\F01EE"}.mdi-email-alert::before{content:"\F06CF"}.mdi-email-alert-outline::before{content:"\F0D42"}.mdi-email-arrow-left::before{content:"\F10DA"}.mdi-email-arrow-left-outline::before{content:"\F10DB"}.mdi-email-arrow-right::before{content:"\F10DC"}.mdi-email-arrow-right-outline::before{content:"\F10DD"}.mdi-email-box::before{content:"\F0D03"}.mdi-email-check::before{content:"\F0AB1"}.mdi-email-check-outline::before{content:"\F0AB2"}.mdi-email-edit::before{content:"\F0EE3"}.mdi-email-edit-outline::before{content:"\F0EE4"}.mdi-email-fast::before{content:"\F186F"}.mdi-email-fast-outline::before{content:"\F1870"}.mdi-email-heart-outline::before{content:"\F1C5B"}.mdi-email-lock::before{content:"\F01F1"}.mdi-email-lock-outline::before{content:"\F1B61"}.mdi-email-mark-as-unread::before{content:"\F0B92"}.mdi-email-minus::before{content:"\F0EE5"}.mdi-email-minus-outline::before{content:"\F0EE6"}.mdi-email-multiple::before{content:"\F0EE7"}.mdi-email-multiple-outline::before{content:"\F0EE8"}.mdi-email-newsletter::before{content:"\F0FB1"}.mdi-email-off::before{content:"\F13E3"}.mdi-email-off-outline::before{content:"\F13E4"}.mdi-email-open::before{content:"\F01EF"}.mdi-email-open-heart-outline::before{content:"\F1C5C"}.mdi-email-open-multiple::before{content:"\F0EE9"}.mdi-email-open-multiple-outline::before{content:"\F0EEA"}.mdi-email-open-outline::before{content:"\F05EF"}.mdi-email-outline::before{content:"\F01F0"}.mdi-email-plus::before{content:"\F09EB"}.mdi-email-plus-outline::before{content:"\F09EC"}.mdi-email-remove::before{content:"\F1661"}.mdi-email-remove-outline::before{content:"\F1662"}.mdi-email-seal::before{content:"\F195B"}.mdi-email-seal-outline::before{content:"\F195C"}.mdi-email-search::before{content:"\F0961"}.mdi-email-search-outline::before{content:"\F0962"}.mdi-email-sync::before{content:"\F12C7"}.mdi-email-sync-outline::before{content:"\F12C8"}.mdi-email-variant::before{content:"\F05F0"}.mdi-ember::before{content:"\F0B30"}.mdi-emby::before{content:"\F06B4"}.mdi-emoticon::before{content:"\F0C68"}.mdi-emoticon-angry::before{content:"\F0C69"}.mdi-emoticon-angry-outline::before{content:"\F0C6A"}.mdi-emoticon-confused::before{content:"\F10DE"}.mdi-emoticon-confused-outline::before{content:"\F10DF"}.mdi-emoticon-cool::before{content:"\F0C6B"}.mdi-emoticon-cool-outline::before{content:"\F01F3"}.mdi-emoticon-cry::before{content:"\F0C6C"}.mdi-emoticon-cry-outline::before{content:"\F0C6D"}.mdi-emoticon-dead::before{content:"\F0C6E"}.mdi-emoticon-dead-outline::before{content:"\F069B"}.mdi-emoticon-devil::before{content:"\F0C6F"}.mdi-emoticon-devil-outline::before{content:"\F01F4"}.mdi-emoticon-excited::before{content:"\F0C70"}.mdi-emoticon-excited-outline::before{content:"\F069C"}.mdi-emoticon-frown::before{content:"\F0F4C"}.mdi-emoticon-frown-outline::before{content:"\F0F4D"}.mdi-emoticon-happy::before{content:"\F0C71"}.mdi-emoticon-happy-outline::before{content:"\F01F5"}.mdi-emoticon-kiss::before{content:"\F0C72"}.mdi-emoticon-kiss-outline::before{content:"\F0C73"}.mdi-emoticon-lol::before{content:"\F1214"}.mdi-emoticon-lol-outline::before{content:"\F1215"}.mdi-emoticon-minus::before{content:"\F1CB2"}.mdi-emoticon-minus-outline::before{content:"\F1CB3"}.mdi-emoticon-neutral::before{content:"\F0C74"}.mdi-emoticon-neutral-outline::before{content:"\F01F6"}.mdi-emoticon-outline::before{content:"\F01F2"}.mdi-emoticon-plus::before{content:"\F1CB4"}.mdi-emoticon-plus-outline::before{content:"\F1CB5"}.mdi-emoticon-poop::before{content:"\F01F7"}.mdi-emoticon-poop-outline::before{content:"\F0C75"}.mdi-emoticon-remove::before{content:"\F1CB6"}.mdi-emoticon-remove-outline::before{content:"\F1CB7"}.mdi-emoticon-sad::before{content:"\F0C76"}.mdi-emoticon-sad-outline::before{content:"\F01F8"}.mdi-emoticon-sick::before{content:"\F157C"}.mdi-emoticon-sick-outline::before{content:"\F157D"}.mdi-emoticon-tongue::before{content:"\F01F9"}.mdi-emoticon-tongue-outline::before{content:"\F0C77"}.mdi-emoticon-wink::before{content:"\F0C78"}.mdi-emoticon-wink-outline::before{content:"\F0C79"}.mdi-engine::before{content:"\F01FA"}.mdi-engine-off::before{content:"\F0A46"}.mdi-engine-off-outline::before{content:"\F0A47"}.mdi-engine-outline::before{content:"\F01FB"}.mdi-epsilon::before{content:"\F10E0"}.mdi-equal::before{content:"\F01FC"}.mdi-equal-box::before{content:"\F01FD"}.mdi-equalizer::before{content:"\F0EA2"}.mdi-equalizer-outline::before{content:"\F0EA3"}.mdi-eraser::before{content:"\F01FE"}.mdi-eraser-variant::before{content:"\F0642"}.mdi-escalator::before{content:"\F01FF"}.mdi-escalator-box::before{content:"\F1399"}.mdi-escalator-down::before{content:"\F12C0"}.mdi-escalator-up::before{content:"\F12BF"}.mdi-eslint::before{content:"\F0C7A"}.mdi-et::before{content:"\F0AB3"}.mdi-ethereum::before{content:"\F086A"}.mdi-ethernet::before{content:"\F0200"}.mdi-ethernet-cable::before{content:"\F0201"}.mdi-ethernet-cable-off::before{content:"\F0202"}.mdi-ethernet-off::before{content:"\F1CD1"}.mdi-ev-plug-ccs1::before{content:"\F1519"}.mdi-ev-plug-ccs2::before{content:"\F151A"}.mdi-ev-plug-chademo::before{content:"\F151B"}.mdi-ev-plug-tesla::before{content:"\F151C"}.mdi-ev-plug-type1::before{content:"\F151D"}.mdi-ev-plug-type2::before{content:"\F151E"}.mdi-ev-station::before{content:"\F05F1"}.mdi-evernote::before{content:"\F0204"}.mdi-excavator::before{content:"\F1025"}.mdi-exclamation::before{content:"\F0205"}.mdi-exclamation-thick::before{content:"\F1238"}.mdi-exit-run::before{content:"\F0A48"}.mdi-exit-to-app::before{content:"\F0206"}.mdi-expand-all::before{content:"\F0AB4"}.mdi-expand-all-outline::before{content:"\F0AB5"}.mdi-expansion-card::before{content:"\F08AE"}.mdi-expansion-card-variant::before{content:"\F0FB2"}.mdi-exponent::before{content:"\F0963"}.mdi-exponent-box::before{content:"\F0964"}.mdi-export::before{content:"\F0207"}.mdi-export-variant::before{content:"\F0B93"}.mdi-eye::before{content:"\F0208"}.mdi-eye-arrow-left::before{content:"\F18FD"}.mdi-eye-arrow-left-outline::before{content:"\F18FE"}.mdi-eye-arrow-right::before{content:"\F18FF"}.mdi-eye-arrow-right-outline::before{content:"\F1900"}.mdi-eye-check::before{content:"\F0D04"}.mdi-eye-check-outline::before{content:"\F0D05"}.mdi-eye-circle::before{content:"\F0B94"}.mdi-eye-circle-outline::before{content:"\F0B95"}.mdi-eye-closed::before{content:"\F1CA3"}.mdi-eye-lock::before{content:"\F1C06"}.mdi-eye-lock-open::before{content:"\F1C07"}.mdi-eye-lock-open-outline::before{content:"\F1C08"}.mdi-eye-lock-outline::before{content:"\F1C09"}.mdi-eye-minus::before{content:"\F1026"}.mdi-eye-minus-outline::before{content:"\F1027"}.mdi-eye-off::before{content:"\F0209"}.mdi-eye-off-outline::before{content:"\F06D1"}.mdi-eye-outline::before{content:"\F06D0"}.mdi-eye-plus::before{content:"\F086B"}.mdi-eye-plus-outline::before{content:"\F086C"}.mdi-eye-refresh::before{content:"\F197C"}.mdi-eye-refresh-outline::before{content:"\F197D"}.mdi-eye-remove::before{content:"\F15E3"}.mdi-eye-remove-outline::before{content:"\F15E4"}.mdi-eye-settings::before{content:"\F086D"}.mdi-eye-settings-outline::before{content:"\F086E"}.mdi-eyedropper::before{content:"\F020A"}.mdi-eyedropper-minus::before{content:"\F13DD"}.mdi-eyedropper-off::before{content:"\F13DF"}.mdi-eyedropper-plus::before{content:"\F13DC"}.mdi-eyedropper-remove::before{content:"\F13DE"}.mdi-eyedropper-variant::before{content:"\F020B"}.mdi-face-agent::before{content:"\F0D70"}.mdi-face-man::before{content:"\F0643"}.mdi-face-man-outline::before{content:"\F0B96"}.mdi-face-man-profile::before{content:"\F0644"}.mdi-face-man-shimmer::before{content:"\F15CC"}.mdi-face-man-shimmer-outline::before{content:"\F15CD"}.mdi-face-mask::before{content:"\F1586"}.mdi-face-mask-outline::before{content:"\F1587"}.mdi-face-recognition::before{content:"\F0C7B"}.mdi-face-woman::before{content:"\F1077"}.mdi-face-woman-outline::before{content:"\F1078"}.mdi-face-woman-profile::before{content:"\F1076"}.mdi-face-woman-shimmer::before{content:"\F15CE"}.mdi-face-woman-shimmer-outline::before{content:"\F15CF"}.mdi-facebook::before{content:"\F020C"}.mdi-facebook-gaming::before{content:"\F07DD"}.mdi-facebook-messenger::before{content:"\F020E"}.mdi-facebook-workplace::before{content:"\F0B31"}.mdi-factory::before{content:"\F020F"}.mdi-family-tree::before{content:"\F160E"}.mdi-fan::before{content:"\F0210"}.mdi-fan-alert::before{content:"\F146C"}.mdi-fan-auto::before{content:"\F171D"}.mdi-fan-chevron-down::before{content:"\F146D"}.mdi-fan-chevron-up::before{content:"\F146E"}.mdi-fan-clock::before{content:"\F1A3A"}.mdi-fan-minus::before{content:"\F1470"}.mdi-fan-off::before{content:"\F081D"}.mdi-fan-plus::before{content:"\F146F"}.mdi-fan-remove::before{content:"\F1471"}.mdi-fan-speed-1::before{content:"\F1472"}.mdi-fan-speed-2::before{content:"\F1473"}.mdi-fan-speed-3::before{content:"\F1474"}.mdi-fast-forward::before{content:"\F0211"}.mdi-fast-forward-10::before{content:"\F0D71"}.mdi-fast-forward-15::before{content:"\F193A"}.mdi-fast-forward-30::before{content:"\F0D06"}.mdi-fast-forward-45::before{content:"\F1B12"}.mdi-fast-forward-5::before{content:"\F11F8"}.mdi-fast-forward-60::before{content:"\F160B"}.mdi-fast-forward-outline::before{content:"\F06D2"}.mdi-faucet::before{content:"\F1B29"}.mdi-faucet-variant::before{content:"\F1B2A"}.mdi-fax::before{content:"\F0212"}.mdi-feather::before{content:"\F06D3"}.mdi-feature-search::before{content:"\F0A49"}.mdi-feature-search-outline::before{content:"\F0A4A"}.mdi-fedora::before{content:"\F08DB"}.mdi-fence::before{content:"\F179A"}.mdi-fence-electric::before{content:"\F17F6"}.mdi-fencing::before{content:"\F14C1"}.mdi-ferris-wheel::before{content:"\F0EA4"}.mdi-ferry::before{content:"\F0213"}.mdi-file::before{content:"\F0214"}.mdi-file-account::before{content:"\F073B"}.mdi-file-account-outline::before{content:"\F1028"}.mdi-file-alert::before{content:"\F0A4B"}.mdi-file-alert-outline::before{content:"\F0A4C"}.mdi-file-arrow-left-right::before{content:"\F1A93"}.mdi-file-arrow-left-right-outline::before{content:"\F1A94"}.mdi-file-arrow-up-down::before{content:"\F1A95"}.mdi-file-arrow-up-down-outline::before{content:"\F1A96"}.mdi-file-cabinet::before{content:"\F0AB6"}.mdi-file-cad::before{content:"\F0EEB"}.mdi-file-cad-box::before{content:"\F0EEC"}.mdi-file-cancel::before{content:"\F0DC6"}.mdi-file-cancel-outline::before{content:"\F0DC7"}.mdi-file-certificate::before{content:"\F1186"}.mdi-file-certificate-outline::before{content:"\F1187"}.mdi-file-chart::before{content:"\F0215"}.mdi-file-chart-check::before{content:"\F19C6"}.mdi-file-chart-check-outline::before{content:"\F19C7"}.mdi-file-chart-outline::before{content:"\F1029"}.mdi-file-check::before{content:"\F0216"}.mdi-file-check-outline::before{content:"\F0E29"}.mdi-file-clock::before{content:"\F12E1"}.mdi-file-clock-outline::before{content:"\F12E2"}.mdi-file-cloud::before{content:"\F0217"}.mdi-file-cloud-outline::before{content:"\F102A"}.mdi-file-code::before{content:"\F022E"}.mdi-file-code-outline::before{content:"\F102B"}.mdi-file-cog::before{content:"\F107B"}.mdi-file-cog-outline::before{content:"\F107C"}.mdi-file-compare::before{content:"\F08AA"}.mdi-file-delimited::before{content:"\F0218"}.mdi-file-delimited-outline::before{content:"\F0EA5"}.mdi-file-document::before{content:"\F0219"}.mdi-file-document-alert::before{content:"\F1A97"}.mdi-file-document-alert-outline::before{content:"\F1A98"}.mdi-file-document-arrow-right::before{content:"\F1C0F"}.mdi-file-document-arrow-right-outline::before{content:"\F1C10"}.mdi-file-document-check::before{content:"\F1A99"}.mdi-file-document-check-outline::before{content:"\F1A9A"}.mdi-file-document-edit::before{content:"\F0DC8"}.mdi-file-document-edit-outline::before{content:"\F0DC9"}.mdi-file-document-minus::before{content:"\F1A9B"}.mdi-file-document-minus-outline::before{content:"\F1A9C"}.mdi-file-document-multiple::before{content:"\F1517"}.mdi-file-document-multiple-outline::before{content:"\F1518"}.mdi-file-document-outline::before{content:"\F09EE"}.mdi-file-document-plus::before{content:"\F1A9D"}.mdi-file-document-plus-outline::before{content:"\F1A9E"}.mdi-file-document-refresh::before{content:"\F1C7A"}.mdi-file-document-refresh-outline::before{content:"\F1C7B"}.mdi-file-document-remove::before{content:"\F1A9F"}.mdi-file-document-remove-outline::before{content:"\F1AA0"}.mdi-file-download::before{content:"\F0965"}.mdi-file-download-outline::before{content:"\F0966"}.mdi-file-edit::before{content:"\F11E7"}.mdi-file-edit-outline::before{content:"\F11E8"}.mdi-file-excel::before{content:"\F021B"}.mdi-file-excel-box::before{content:"\F021C"}.mdi-file-excel-box-outline::before{content:"\F102C"}.mdi-file-excel-outline::before{content:"\F102D"}.mdi-file-export::before{content:"\F021D"}.mdi-file-export-outline::before{content:"\F102E"}.mdi-file-eye::before{content:"\F0DCA"}.mdi-file-eye-outline::before{content:"\F0DCB"}.mdi-file-find::before{content:"\F021E"}.mdi-file-find-outline::before{content:"\F0B97"}.mdi-file-gif-box::before{content:"\F0D78"}.mdi-file-hidden::before{content:"\F0613"}.mdi-file-image::before{content:"\F021F"}.mdi-file-image-marker::before{content:"\F1772"}.mdi-file-image-marker-outline::before{content:"\F1773"}.mdi-file-image-minus::before{content:"\F193B"}.mdi-file-image-minus-outline::before{content:"\F193C"}.mdi-file-image-outline::before{content:"\F0EB0"}.mdi-file-image-plus::before{content:"\F193D"}.mdi-file-image-plus-outline::before{content:"\F193E"}.mdi-file-image-remove::before{content:"\F193F"}.mdi-file-image-remove-outline::before{content:"\F1940"}.mdi-file-import::before{content:"\F0220"}.mdi-file-import-outline::before{content:"\F102F"}.mdi-file-jpg-box::before{content:"\F0225"}.mdi-file-key::before{content:"\F1184"}.mdi-file-key-outline::before{content:"\F1185"}.mdi-file-link::before{content:"\F1177"}.mdi-file-link-outline::before{content:"\F1178"}.mdi-file-lock::before{content:"\F0221"}.mdi-file-lock-open::before{content:"\F19C8"}.mdi-file-lock-open-outline::before{content:"\F19C9"}.mdi-file-lock-outline::before{content:"\F1030"}.mdi-file-marker::before{content:"\F1774"}.mdi-file-marker-outline::before{content:"\F1775"}.mdi-file-minus::before{content:"\F1AA1"}.mdi-file-minus-outline::before{content:"\F1AA2"}.mdi-file-move::before{content:"\F0AB9"}.mdi-file-move-outline::before{content:"\F1031"}.mdi-file-multiple::before{content:"\F0222"}.mdi-file-multiple-outline::before{content:"\F1032"}.mdi-file-music::before{content:"\F0223"}.mdi-file-music-outline::before{content:"\F0E2A"}.mdi-file-outline::before{content:"\F0224"}.mdi-file-pdf-box::before{content:"\F0226"}.mdi-file-percent::before{content:"\F081E"}.mdi-file-percent-outline::before{content:"\F1033"}.mdi-file-phone::before{content:"\F1179"}.mdi-file-phone-outline::before{content:"\F117A"}.mdi-file-plus::before{content:"\F0752"}.mdi-file-plus-outline::before{content:"\F0EED"}.mdi-file-png-box::before{content:"\F0E2D"}.mdi-file-powerpoint::before{content:"\F0227"}.mdi-file-powerpoint-box::before{content:"\F0228"}.mdi-file-powerpoint-box-outline::before{content:"\F1034"}.mdi-file-powerpoint-outline::before{content:"\F1035"}.mdi-file-presentation-box::before{content:"\F0229"}.mdi-file-question::before{content:"\F086F"}.mdi-file-question-outline::before{content:"\F1036"}.mdi-file-refresh::before{content:"\F0918"}.mdi-file-refresh-outline::before{content:"\F0541"}.mdi-file-remove::before{content:"\F0B98"}.mdi-file-remove-outline::before{content:"\F1037"}.mdi-file-replace::before{content:"\F0B32"}.mdi-file-replace-outline::before{content:"\F0B33"}.mdi-file-restore::before{content:"\F0670"}.mdi-file-restore-outline::before{content:"\F1038"}.mdi-file-rotate-left::before{content:"\F1A3B"}.mdi-file-rotate-left-outline::before{content:"\F1A3C"}.mdi-file-rotate-right::before{content:"\F1A3D"}.mdi-file-rotate-right-outline::before{content:"\F1A3E"}.mdi-file-search::before{content:"\F0C7C"}.mdi-file-search-outline::before{content:"\F0C7D"}.mdi-file-send::before{content:"\F022A"}.mdi-file-send-outline::before{content:"\F1039"}.mdi-file-settings::before{content:"\F1079"}.mdi-file-settings-outline::before{content:"\F107A"}.mdi-file-sign::before{content:"\F19C3"}.mdi-file-star::before{content:"\F103A"}.mdi-file-star-four-points::before{content:"\F1C2D"}.mdi-file-star-four-points-outline::before{content:"\F1C2E"}.mdi-file-star-outline::before{content:"\F103B"}.mdi-file-swap::before{content:"\F0FB4"}.mdi-file-swap-outline::before{content:"\F0FB5"}.mdi-file-sync::before{content:"\F1216"}.mdi-file-sync-outline::before{content:"\F1217"}.mdi-file-table::before{content:"\F0C7E"}.mdi-file-table-box::before{content:"\F10E1"}.mdi-file-table-box-multiple::before{content:"\F10E2"}.mdi-file-table-box-multiple-outline::before{content:"\F10E3"}.mdi-file-table-box-outline::before{content:"\F10E4"}.mdi-file-table-outline::before{content:"\F0C7F"}.mdi-file-tree::before{content:"\F0645"}.mdi-file-tree-outline::before{content:"\F13D2"}.mdi-file-undo::before{content:"\F08DC"}.mdi-file-undo-outline::before{content:"\F103C"}.mdi-file-upload::before{content:"\F0A4D"}.mdi-file-upload-outline::before{content:"\F0A4E"}.mdi-file-video::before{content:"\F022B"}.mdi-file-video-outline::before{content:"\F0E2C"}.mdi-file-word::before{content:"\F022C"}.mdi-file-word-box::before{content:"\F022D"}.mdi-file-word-box-outline::before{content:"\F103D"}.mdi-file-word-outline::before{content:"\F103E"}.mdi-file-xml-box::before{content:"\F1B4B"}.mdi-film::before{content:"\F022F"}.mdi-filmstrip::before{content:"\F0230"}.mdi-filmstrip-box::before{content:"\F0332"}.mdi-filmstrip-box-multiple::before{content:"\F0D18"}.mdi-filmstrip-off::before{content:"\F0231"}.mdi-filter::before{content:"\F0232"}.mdi-filter-check::before{content:"\F18EC"}.mdi-filter-check-outline::before{content:"\F18ED"}.mdi-filter-cog::before{content:"\F1AA3"}.mdi-filter-cog-outline::before{content:"\F1AA4"}.mdi-filter-menu::before{content:"\F10E5"}.mdi-filter-menu-outline::before{content:"\F10E6"}.mdi-filter-minus::before{content:"\F0EEE"}.mdi-filter-minus-outline::before{content:"\F0EEF"}.mdi-filter-multiple::before{content:"\F1A3F"}.mdi-filter-multiple-outline::before{content:"\F1A40"}.mdi-filter-off::before{content:"\F14EF"}.mdi-filter-off-outline::before{content:"\F14F0"}.mdi-filter-outline::before{content:"\F0233"}.mdi-filter-plus::before{content:"\F0EF0"}.mdi-filter-plus-outline::before{content:"\F0EF1"}.mdi-filter-remove::before{content:"\F0234"}.mdi-filter-remove-outline::before{content:"\F0235"}.mdi-filter-settings::before{content:"\F1AA5"}.mdi-filter-settings-outline::before{content:"\F1AA6"}.mdi-filter-variant::before{content:"\F0236"}.mdi-filter-variant-minus::before{content:"\F1112"}.mdi-filter-variant-plus::before{content:"\F1113"}.mdi-filter-variant-remove::before{content:"\F103F"}.mdi-finance::before{content:"\F081F"}.mdi-find-replace::before{content:"\F06D4"}.mdi-fingerprint::before{content:"\F0237"}.mdi-fingerprint-off::before{content:"\F0EB1"}.mdi-fire::before{content:"\F0238"}.mdi-fire-alert::before{content:"\F15D7"}.mdi-fire-circle::before{content:"\F1807"}.mdi-fire-extinguisher::before{content:"\F0EF2"}.mdi-fire-hydrant::before{content:"\F1137"}.mdi-fire-hydrant-alert::before{content:"\F1138"}.mdi-fire-hydrant-off::before{content:"\F1139"}.mdi-fire-off::before{content:"\F1722"}.mdi-fire-station::before{content:"\F1CC3"}.mdi-fire-truck::before{content:"\F08AB"}.mdi-firebase::before{content:"\F0967"}.mdi-firefox::before{content:"\F0239"}.mdi-fireplace::before{content:"\F0E2E"}.mdi-fireplace-off::before{content:"\F0E2F"}.mdi-firewire::before{content:"\F05BE"}.mdi-firework::before{content:"\F0E30"}.mdi-firework-off::before{content:"\F1723"}.mdi-fish::before{content:"\F023A"}.mdi-fish-off::before{content:"\F13F3"}.mdi-fishbowl::before{content:"\F0EF3"}.mdi-fishbowl-outline::before{content:"\F0EF4"}.mdi-fit-to-page::before{content:"\F0EF5"}.mdi-fit-to-page-outline::before{content:"\F0EF6"}.mdi-fit-to-screen::before{content:"\F18F4"}.mdi-fit-to-screen-outline::before{content:"\F18F5"}.mdi-flag::before{content:"\F023B"}.mdi-flag-checkered::before{content:"\F023C"}.mdi-flag-minus::before{content:"\F0B99"}.mdi-flag-minus-outline::before{content:"\F10B2"}.mdi-flag-off::before{content:"\F18EE"}.mdi-flag-off-outline::before{content:"\F18EF"}.mdi-flag-outline::before{content:"\F023D"}.mdi-flag-plus::before{content:"\F0B9A"}.mdi-flag-plus-outline::before{content:"\F10B3"}.mdi-flag-remove::before{content:"\F0B9B"}.mdi-flag-remove-outline::before{content:"\F10B4"}.mdi-flag-triangle::before{content:"\F023F"}.mdi-flag-variant::before{content:"\F0240"}.mdi-flag-variant-minus::before{content:"\F1BB4"}.mdi-flag-variant-minus-outline::before{content:"\F1BB5"}.mdi-flag-variant-off::before{content:"\F1BB0"}.mdi-flag-variant-off-outline::before{content:"\F1BB1"}.mdi-flag-variant-outline::before{content:"\F023E"}.mdi-flag-variant-plus::before{content:"\F1BB2"}.mdi-flag-variant-plus-outline::before{content:"\F1BB3"}.mdi-flag-variant-remove::before{content:"\F1BB6"}.mdi-flag-variant-remove-outline::before{content:"\F1BB7"}.mdi-flare::before{content:"\F0D72"}.mdi-flash::before{content:"\F0241"}.mdi-flash-alert::before{content:"\F0EF7"}.mdi-flash-alert-outline::before{content:"\F0EF8"}.mdi-flash-auto::before{content:"\F0242"}.mdi-flash-off::before{content:"\F0243"}.mdi-flash-off-outline::before{content:"\F1B45"}.mdi-flash-outline::before{content:"\F06D5"}.mdi-flash-red-eye::before{content:"\F067B"}.mdi-flash-triangle::before{content:"\F1B1D"}.mdi-flash-triangle-outline::before{content:"\F1B1E"}.mdi-flashlight::before{content:"\F0244"}.mdi-flashlight-off::before{content:"\F0245"}.mdi-flask::before{content:"\F0093"}.mdi-flask-empty::before{content:"\F0094"}.mdi-flask-empty-minus::before{content:"\F123A"}.mdi-flask-empty-minus-outline::before{content:"\F123B"}.mdi-flask-empty-off::before{content:"\F13F4"}.mdi-flask-empty-off-outline::before{content:"\F13F5"}.mdi-flask-empty-outline::before{content:"\F0095"}.mdi-flask-empty-plus::before{content:"\F123C"}.mdi-flask-empty-plus-outline::before{content:"\F123D"}.mdi-flask-empty-remove::before{content:"\F123E"}.mdi-flask-empty-remove-outline::before{content:"\F123F"}.mdi-flask-minus::before{content:"\F1240"}.mdi-flask-minus-outline::before{content:"\F1241"}.mdi-flask-off::before{content:"\F13F6"}.mdi-flask-off-outline::before{content:"\F13F7"}.mdi-flask-outline::before{content:"\F0096"}.mdi-flask-plus::before{content:"\F1242"}.mdi-flask-plus-outline::before{content:"\F1243"}.mdi-flask-remove::before{content:"\F1244"}.mdi-flask-remove-outline::before{content:"\F1245"}.mdi-flask-round-bottom::before{content:"\F124B"}.mdi-flask-round-bottom-empty::before{content:"\F124C"}.mdi-flask-round-bottom-empty-outline::before{content:"\F124D"}.mdi-flask-round-bottom-outline::before{content:"\F124E"}.mdi-fleur-de-lis::before{content:"\F1303"}.mdi-flip-horizontal::before{content:"\F10E7"}.mdi-flip-to-back::before{content:"\F0247"}.mdi-flip-to-front::before{content:"\F0248"}.mdi-flip-vertical::before{content:"\F10E8"}.mdi-floor-lamp::before{content:"\F08DD"}.mdi-floor-lamp-dual::before{content:"\F1040"}.mdi-floor-lamp-dual-outline::before{content:"\F17CE"}.mdi-floor-lamp-outline::before{content:"\F17C8"}.mdi-floor-lamp-torchiere::before{content:"\F1747"}.mdi-floor-lamp-torchiere-outline::before{content:"\F17D6"}.mdi-floor-lamp-torchiere-variant::before{content:"\F1041"}.mdi-floor-lamp-torchiere-variant-outline::before{content:"\F17CF"}.mdi-floor-plan::before{content:"\F0821"}.mdi-floppy::before{content:"\F0249"}.mdi-floppy-variant::before{content:"\F09EF"}.mdi-flower::before{content:"\F024A"}.mdi-flower-outline::before{content:"\F09F0"}.mdi-flower-pollen::before{content:"\F1885"}.mdi-flower-pollen-outline::before{content:"\F1886"}.mdi-flower-poppy::before{content:"\F0D08"}.mdi-flower-tulip::before{content:"\F09F1"}.mdi-flower-tulip-outline::before{content:"\F09F2"}.mdi-focus-auto::before{content:"\F0F4E"}.mdi-focus-field::before{content:"\F0F4F"}.mdi-focus-field-horizontal::before{content:"\F0F50"}.mdi-focus-field-vertical::before{content:"\F0F51"}.mdi-folder::before{content:"\F024B"}.mdi-folder-account::before{content:"\F024C"}.mdi-folder-account-outline::before{content:"\F0B9C"}.mdi-folder-alert::before{content:"\F0DCC"}.mdi-folder-alert-outline::before{content:"\F0DCD"}.mdi-folder-arrow-down::before{content:"\F19E8"}.mdi-folder-arrow-down-outline::before{content:"\F19E9"}.mdi-folder-arrow-left::before{content:"\F19EA"}.mdi-folder-arrow-left-outline::before{content:"\F19EB"}.mdi-folder-arrow-left-right::before{content:"\F19EC"}.mdi-folder-arrow-left-right-outline::before{content:"\F19ED"}.mdi-folder-arrow-right::before{content:"\F19EE"}.mdi-folder-arrow-right-outline::before{content:"\F19EF"}.mdi-folder-arrow-up::before{content:"\F19F0"}.mdi-folder-arrow-up-down::before{content:"\F19F1"}.mdi-folder-arrow-up-down-outline::before{content:"\F19F2"}.mdi-folder-arrow-up-outline::before{content:"\F19F3"}.mdi-folder-cancel::before{content:"\F19F4"}.mdi-folder-cancel-outline::before{content:"\F19F5"}.mdi-folder-check::before{content:"\F197E"}.mdi-folder-check-outline::before{content:"\F197F"}.mdi-folder-clock::before{content:"\F0ABA"}.mdi-folder-clock-outline::before{content:"\F0ABB"}.mdi-folder-cog::before{content:"\F107F"}.mdi-folder-cog-outline::before{content:"\F1080"}.mdi-folder-download::before{content:"\F024D"}.mdi-folder-download-outline::before{content:"\F10E9"}.mdi-folder-edit::before{content:"\F08DE"}.mdi-folder-edit-outline::before{content:"\F0DCE"}.mdi-folder-eye::before{content:"\F178A"}.mdi-folder-eye-outline::before{content:"\F178B"}.mdi-folder-file::before{content:"\F19F6"}.mdi-folder-file-outline::before{content:"\F19F7"}.mdi-folder-google-drive::before{content:"\F024E"}.mdi-folder-heart::before{content:"\F10EA"}.mdi-folder-heart-outline::before{content:"\F10EB"}.mdi-folder-hidden::before{content:"\F179E"}.mdi-folder-home::before{content:"\F10B5"}.mdi-folder-home-outline::before{content:"\F10B6"}.mdi-folder-image::before{content:"\F024F"}.mdi-folder-information::before{content:"\F10B7"}.mdi-folder-information-outline::before{content:"\F10B8"}.mdi-folder-key::before{content:"\F08AC"}.mdi-folder-key-network::before{content:"\F08AD"}.mdi-folder-key-network-outline::before{content:"\F0C80"}.mdi-folder-key-outline::before{content:"\F10EC"}.mdi-folder-lock::before{content:"\F0250"}.mdi-folder-lock-open::before{content:"\F0251"}.mdi-folder-lock-open-outline::before{content:"\F1AA7"}.mdi-folder-lock-outline::before{content:"\F1AA8"}.mdi-folder-marker::before{content:"\F126D"}.mdi-folder-marker-outline::before{content:"\F126E"}.mdi-folder-minus::before{content:"\F1B49"}.mdi-folder-minus-outline::before{content:"\F1B4A"}.mdi-folder-move::before{content:"\F0252"}.mdi-folder-move-outline::before{content:"\F1246"}.mdi-folder-multiple::before{content:"\F0253"}.mdi-folder-multiple-image::before{content:"\F0254"}.mdi-folder-multiple-outline::before{content:"\F0255"}.mdi-folder-multiple-plus::before{content:"\F147E"}.mdi-folder-multiple-plus-outline::before{content:"\F147F"}.mdi-folder-music::before{content:"\F1359"}.mdi-folder-music-outline::before{content:"\F135A"}.mdi-folder-network::before{content:"\F0870"}.mdi-folder-network-outline::before{content:"\F0C81"}.mdi-folder-off::before{content:"\F19F8"}.mdi-folder-off-outline::before{content:"\F19F9"}.mdi-folder-open::before{content:"\F0770"}.mdi-folder-open-outline::before{content:"\F0DCF"}.mdi-folder-outline::before{content:"\F0256"}.mdi-folder-play::before{content:"\F19FA"}.mdi-folder-play-outline::before{content:"\F19FB"}.mdi-folder-plus::before{content:"\F0257"}.mdi-folder-plus-outline::before{content:"\F0B9D"}.mdi-folder-pound::before{content:"\F0D09"}.mdi-folder-pound-outline::before{content:"\F0D0A"}.mdi-folder-question::before{content:"\F19CA"}.mdi-folder-question-outline::before{content:"\F19CB"}.mdi-folder-refresh::before{content:"\F0749"}.mdi-folder-refresh-outline::before{content:"\F0542"}.mdi-folder-remove::before{content:"\F0258"}.mdi-folder-remove-outline::before{content:"\F0B9E"}.mdi-folder-search::before{content:"\F0968"}.mdi-folder-search-outline::before{content:"\F0969"}.mdi-folder-settings::before{content:"\F107D"}.mdi-folder-settings-outline::before{content:"\F107E"}.mdi-folder-star::before{content:"\F069D"}.mdi-folder-star-multiple::before{content:"\F13D3"}.mdi-folder-star-multiple-outline::before{content:"\F13D4"}.mdi-folder-star-outline::before{content:"\F0B9F"}.mdi-folder-swap::before{content:"\F0FB6"}.mdi-folder-swap-outline::before{content:"\F0FB7"}.mdi-folder-sync::before{content:"\F0D0B"}.mdi-folder-sync-outline::before{content:"\F0D0C"}.mdi-folder-table::before{content:"\F12E3"}.mdi-folder-table-outline::before{content:"\F12E4"}.mdi-folder-text::before{content:"\F0C82"}.mdi-folder-text-outline::before{content:"\F0C83"}.mdi-folder-upload::before{content:"\F0259"}.mdi-folder-upload-outline::before{content:"\F10ED"}.mdi-folder-wrench::before{content:"\F19FC"}.mdi-folder-wrench-outline::before{content:"\F19FD"}.mdi-folder-zip::before{content:"\F06EB"}.mdi-folder-zip-outline::before{content:"\F07B9"}.mdi-font-awesome::before{content:"\F003A"}.mdi-food::before{content:"\F025A"}.mdi-food-apple::before{content:"\F025B"}.mdi-food-apple-outline::before{content:"\F0C84"}.mdi-food-croissant::before{content:"\F07C8"}.mdi-food-drumstick::before{content:"\F141F"}.mdi-food-drumstick-off::before{content:"\F1468"}.mdi-food-drumstick-off-outline::before{content:"\F1469"}.mdi-food-drumstick-outline::before{content:"\F1420"}.mdi-food-fork-drink::before{content:"\F05F2"}.mdi-food-halal::before{content:"\F1572"}.mdi-food-hot-dog::before{content:"\F184B"}.mdi-food-kosher::before{content:"\F1573"}.mdi-food-off::before{content:"\F05F3"}.mdi-food-off-outline::before{content:"\F1915"}.mdi-food-outline::before{content:"\F1916"}.mdi-food-steak::before{content:"\F146A"}.mdi-food-steak-off::before{content:"\F146B"}.mdi-food-takeout-box::before{content:"\F1836"}.mdi-food-takeout-box-outline::before{content:"\F1837"}.mdi-food-turkey::before{content:"\F171C"}.mdi-food-variant::before{content:"\F025C"}.mdi-food-variant-off::before{content:"\F13E5"}.mdi-foot-print::before{content:"\F0F52"}.mdi-football::before{content:"\F025D"}.mdi-football-australian::before{content:"\F025E"}.mdi-football-helmet::before{content:"\F025F"}.mdi-forest::before{content:"\F1897"}.mdi-forest-outline::before{content:"\F1C63"}.mdi-forklift::before{content:"\F07C9"}.mdi-form-dropdown::before{content:"\F1400"}.mdi-form-select::before{content:"\F1401"}.mdi-form-textarea::before{content:"\F1095"}.mdi-form-textbox::before{content:"\F060E"}.mdi-form-textbox-lock::before{content:"\F135D"}.mdi-form-textbox-password::before{content:"\F07F5"}.mdi-format-align-bottom::before{content:"\F0753"}.mdi-format-align-center::before{content:"\F0260"}.mdi-format-align-justify::before{content:"\F0261"}.mdi-format-align-left::before{content:"\F0262"}.mdi-format-align-middle::before{content:"\F0754"}.mdi-format-align-right::before{content:"\F0263"}.mdi-format-align-top::before{content:"\F0755"}.mdi-format-annotation-minus::before{content:"\F0ABC"}.mdi-format-annotation-plus::before{content:"\F0646"}.mdi-format-bold::before{content:"\F0264"}.mdi-format-clear::before{content:"\F0265"}.mdi-format-color-fill::before{content:"\F0266"}.mdi-format-color-highlight::before{content:"\F0E31"}.mdi-format-color-marker-cancel::before{content:"\F1313"}.mdi-format-color-text::before{content:"\F069E"}.mdi-format-columns::before{content:"\F08DF"}.mdi-format-float-center::before{content:"\F0267"}.mdi-format-float-left::before{content:"\F0268"}.mdi-format-float-none::before{content:"\F0269"}.mdi-format-float-right::before{content:"\F026A"}.mdi-format-font::before{content:"\F06D6"}.mdi-format-font-size-decrease::before{content:"\F09F3"}.mdi-format-font-size-increase::before{content:"\F09F4"}.mdi-format-header-1::before{content:"\F026B"}.mdi-format-header-2::before{content:"\F026C"}.mdi-format-header-3::before{content:"\F026D"}.mdi-format-header-4::before{content:"\F026E"}.mdi-format-header-5::before{content:"\F026F"}.mdi-format-header-6::before{content:"\F0270"}.mdi-format-header-decrease::before{content:"\F0271"}.mdi-format-header-equal::before{content:"\F0272"}.mdi-format-header-increase::before{content:"\F0273"}.mdi-format-header-pound::before{content:"\F0274"}.mdi-format-horizontal-align-center::before{content:"\F061E"}.mdi-format-horizontal-align-left::before{content:"\F061F"}.mdi-format-horizontal-align-right::before{content:"\F0620"}.mdi-format-indent-decrease::before{content:"\F0275"}.mdi-format-indent-increase::before{content:"\F0276"}.mdi-format-italic::before{content:"\F0277"}.mdi-format-letter-case::before{content:"\F0B34"}.mdi-format-letter-case-lower::before{content:"\F0B35"}.mdi-format-letter-case-upper::before{content:"\F0B36"}.mdi-format-letter-ends-with::before{content:"\F0FB8"}.mdi-format-letter-matches::before{content:"\F0FB9"}.mdi-format-letter-spacing::before{content:"\F1956"}.mdi-format-letter-spacing-variant::before{content:"\F1AFB"}.mdi-format-letter-starts-with::before{content:"\F0FBA"}.mdi-format-line-height::before{content:"\F1AFC"}.mdi-format-line-spacing::before{content:"\F0278"}.mdi-format-line-style::before{content:"\F05C8"}.mdi-format-line-weight::before{content:"\F05C9"}.mdi-format-list-bulleted::before{content:"\F0279"}.mdi-format-list-bulleted-square::before{content:"\F0DD0"}.mdi-format-list-bulleted-triangle::before{content:"\F0EB2"}.mdi-format-list-bulleted-type::before{content:"\F027A"}.mdi-format-list-checkbox::before{content:"\F096A"}.mdi-format-list-checks::before{content:"\F0756"}.mdi-format-list-group::before{content:"\F1860"}.mdi-format-list-group-plus::before{content:"\F1B56"}.mdi-format-list-numbered::before{content:"\F027B"}.mdi-format-list-numbered-rtl::before{content:"\F0D0D"}.mdi-format-list-text::before{content:"\F126F"}.mdi-format-overline::before{content:"\F0EB3"}.mdi-format-page-break::before{content:"\F06D7"}.mdi-format-page-split::before{content:"\F1917"}.mdi-format-paint::before{content:"\F027C"}.mdi-format-paragraph::before{content:"\F027D"}.mdi-format-paragraph-spacing::before{content:"\F1AFD"}.mdi-format-pilcrow::before{content:"\F06D8"}.mdi-format-pilcrow-arrow-left::before{content:"\F0286"}.mdi-format-pilcrow-arrow-right::before{content:"\F0285"}.mdi-format-quote-close::before{content:"\F027E"}.mdi-format-quote-close-outline::before{content:"\F11A8"}.mdi-format-quote-open::before{content:"\F0757"}.mdi-format-quote-open-outline::before{content:"\F11A7"}.mdi-format-rotate-90::before{content:"\F06AA"}.mdi-format-section::before{content:"\F069F"}.mdi-format-size::before{content:"\F027F"}.mdi-format-strikethrough::before{content:"\F0280"}.mdi-format-strikethrough-variant::before{content:"\F0281"}.mdi-format-subscript::before{content:"\F0282"}.mdi-format-superscript::before{content:"\F0283"}.mdi-format-text::before{content:"\F0284"}.mdi-format-text-rotation-angle-down::before{content:"\F0FBB"}.mdi-format-text-rotation-angle-up::before{content:"\F0FBC"}.mdi-format-text-rotation-down::before{content:"\F0D73"}.mdi-format-text-rotation-down-vertical::before{content:"\F0FBD"}.mdi-format-text-rotation-none::before{content:"\F0D74"}.mdi-format-text-rotation-up::before{content:"\F0FBE"}.mdi-format-text-rotation-vertical::before{content:"\F0FBF"}.mdi-format-text-variant::before{content:"\F0E32"}.mdi-format-text-variant-outline::before{content:"\F150F"}.mdi-format-text-wrapping-clip::before{content:"\F0D0E"}.mdi-format-text-wrapping-overflow::before{content:"\F0D0F"}.mdi-format-text-wrapping-wrap::before{content:"\F0D10"}.mdi-format-textbox::before{content:"\F0D11"}.mdi-format-title::before{content:"\F05F4"}.mdi-format-underline::before{content:"\F0287"}.mdi-format-underline-wavy::before{content:"\F18E9"}.mdi-format-vertical-align-bottom::before{content:"\F0621"}.mdi-format-vertical-align-center::before{content:"\F0622"}.mdi-format-vertical-align-top::before{content:"\F0623"}.mdi-format-wrap-inline::before{content:"\F0288"}.mdi-format-wrap-square::before{content:"\F0289"}.mdi-format-wrap-tight::before{content:"\F028A"}.mdi-format-wrap-top-bottom::before{content:"\F028B"}.mdi-forum::before{content:"\F028C"}.mdi-forum-minus::before{content:"\F1AA9"}.mdi-forum-minus-outline::before{content:"\F1AAA"}.mdi-forum-outline::before{content:"\F0822"}.mdi-forum-plus::before{content:"\F1AAB"}.mdi-forum-plus-outline::before{content:"\F1AAC"}.mdi-forum-remove::before{content:"\F1AAD"}.mdi-forum-remove-outline::before{content:"\F1AAE"}.mdi-forward::before{content:"\F028D"}.mdi-forwardburger::before{content:"\F0D75"}.mdi-fountain::before{content:"\F096B"}.mdi-fountain-pen::before{content:"\F0D12"}.mdi-fountain-pen-tip::before{content:"\F0D13"}.mdi-fraction-one-half::before{content:"\F1992"}.mdi-freebsd::before{content:"\F08E0"}.mdi-french-fries::before{content:"\F1957"}.mdi-frequently-asked-questions::before{content:"\F0EB4"}.mdi-fridge::before{content:"\F0290"}.mdi-fridge-alert::before{content:"\F11B1"}.mdi-fridge-alert-outline::before{content:"\F11B2"}.mdi-fridge-bottom::before{content:"\F0292"}.mdi-fridge-industrial::before{content:"\F15EE"}.mdi-fridge-industrial-alert::before{content:"\F15EF"}.mdi-fridge-industrial-alert-outline::before{content:"\F15F0"}.mdi-fridge-industrial-off::before{content:"\F15F1"}.mdi-fridge-industrial-off-outline::before{content:"\F15F2"}.mdi-fridge-industrial-outline::before{content:"\F15F3"}.mdi-fridge-off::before{content:"\F11AF"}.mdi-fridge-off-outline::before{content:"\F11B0"}.mdi-fridge-outline::before{content:"\F028F"}.mdi-fridge-top::before{content:"\F0291"}.mdi-fridge-variant::before{content:"\F15F4"}.mdi-fridge-variant-alert::before{content:"\F15F5"}.mdi-fridge-variant-alert-outline::before{content:"\F15F6"}.mdi-fridge-variant-off::before{content:"\F15F7"}.mdi-fridge-variant-off-outline::before{content:"\F15F8"}.mdi-fridge-variant-outline::before{content:"\F15F9"}.mdi-fruit-cherries::before{content:"\F1042"}.mdi-fruit-cherries-off::before{content:"\F13F8"}.mdi-fruit-citrus::before{content:"\F1043"}.mdi-fruit-citrus-off::before{content:"\F13F9"}.mdi-fruit-grapes::before{content:"\F1044"}.mdi-fruit-grapes-outline::before{content:"\F1045"}.mdi-fruit-pear::before{content:"\F1A0E"}.mdi-fruit-pineapple::before{content:"\F1046"}.mdi-fruit-watermelon::before{content:"\F1047"}.mdi-fuel::before{content:"\F07CA"}.mdi-fuel-cell::before{content:"\F18B5"}.mdi-fullscreen::before{content:"\F0293"}.mdi-fullscreen-exit::before{content:"\F0294"}.mdi-function::before{content:"\F0295"}.mdi-function-variant::before{content:"\F0871"}.mdi-furigana-horizontal::before{content:"\F1081"}.mdi-furigana-vertical::before{content:"\F1082"}.mdi-fuse::before{content:"\F0C85"}.mdi-fuse-alert::before{content:"\F142D"}.mdi-fuse-blade::before{content:"\F0C86"}.mdi-fuse-off::before{content:"\F142C"}.mdi-gamepad::before{content:"\F0296"}.mdi-gamepad-circle::before{content:"\F0E33"}.mdi-gamepad-circle-down::before{content:"\F0E34"}.mdi-gamepad-circle-left::before{content:"\F0E35"}.mdi-gamepad-circle-outline::before{content:"\F0E36"}.mdi-gamepad-circle-right::before{content:"\F0E37"}.mdi-gamepad-circle-up::before{content:"\F0E38"}.mdi-gamepad-down::before{content:"\F0E39"}.mdi-gamepad-left::before{content:"\F0E3A"}.mdi-gamepad-outline::before{content:"\F1919"}.mdi-gamepad-right::before{content:"\F0E3B"}.mdi-gamepad-round::before{content:"\F0E3C"}.mdi-gamepad-round-down::before{content:"\F0E3D"}.mdi-gamepad-round-left::before{content:"\F0E3E"}.mdi-gamepad-round-outline::before{content:"\F0E3F"}.mdi-gamepad-round-right::before{content:"\F0E40"}.mdi-gamepad-round-up::before{content:"\F0E41"}.mdi-gamepad-square::before{content:"\F0EB5"}.mdi-gamepad-square-outline::before{content:"\F0EB6"}.mdi-gamepad-up::before{content:"\F0E42"}.mdi-gamepad-variant::before{content:"\F0297"}.mdi-gamepad-variant-outline::before{content:"\F0EB7"}.mdi-gamma::before{content:"\F10EE"}.mdi-gantry-crane::before{content:"\F0DD1"}.mdi-garage::before{content:"\F06D9"}.mdi-garage-alert::before{content:"\F0872"}.mdi-garage-alert-variant::before{content:"\F12D5"}.mdi-garage-lock::before{content:"\F17FB"}.mdi-garage-open::before{content:"\F06DA"}.mdi-garage-open-variant::before{content:"\F12D4"}.mdi-garage-variant::before{content:"\F12D3"}.mdi-garage-variant-lock::before{content:"\F17FC"}.mdi-gas-burner::before{content:"\F1A1B"}.mdi-gas-cylinder::before{content:"\F0647"}.mdi-gas-station::before{content:"\F0298"}.mdi-gas-station-in-use::before{content:"\F1CC4"}.mdi-gas-station-in-use-outline::before{content:"\F1CC5"}.mdi-gas-station-off::before{content:"\F1409"}.mdi-gas-station-off-outline::before{content:"\F140A"}.mdi-gas-station-outline::before{content:"\F0EB8"}.mdi-gate::before{content:"\F0299"}.mdi-gate-alert::before{content:"\F17F8"}.mdi-gate-and::before{content:"\F08E1"}.mdi-gate-arrow-left::before{content:"\F17F7"}.mdi-gate-arrow-right::before{content:"\F1169"}.mdi-gate-buffer::before{content:"\F1AFE"}.mdi-gate-nand::before{content:"\F08E2"}.mdi-gate-nor::before{content:"\F08E3"}.mdi-gate-not::before{content:"\F08E4"}.mdi-gate-open::before{content:"\F116A"}.mdi-gate-or::before{content:"\F08E5"}.mdi-gate-xnor::before{content:"\F08E6"}.mdi-gate-xor::before{content:"\F08E7"}.mdi-gatsby::before{content:"\F0E43"}.mdi-gauge::before{content:"\F029A"}.mdi-gauge-empty::before{content:"\F0873"}.mdi-gauge-full::before{content:"\F0874"}.mdi-gauge-low::before{content:"\F0875"}.mdi-gavel::before{content:"\F029B"}.mdi-gender-female::before{content:"\F029C"}.mdi-gender-male::before{content:"\F029D"}.mdi-gender-male-female::before{content:"\F029E"}.mdi-gender-male-female-variant::before{content:"\F113F"}.mdi-gender-non-binary::before{content:"\F1140"}.mdi-gender-transgender::before{content:"\F029F"}.mdi-generator-mobile::before{content:"\F1C8A"}.mdi-generator-portable::before{content:"\F1C8B"}.mdi-generator-stationary::before{content:"\F1C8C"}.mdi-gentoo::before{content:"\F08E8"}.mdi-gesture::before{content:"\F07CB"}.mdi-gesture-double-tap::before{content:"\F073C"}.mdi-gesture-pinch::before{content:"\F0ABD"}.mdi-gesture-spread::before{content:"\F0ABE"}.mdi-gesture-swipe::before{content:"\F0D76"}.mdi-gesture-swipe-down::before{content:"\F073D"}.mdi-gesture-swipe-horizontal::before{content:"\F0ABF"}.mdi-gesture-swipe-left::before{content:"\F073E"}.mdi-gesture-swipe-right::before{content:"\F073F"}.mdi-gesture-swipe-up::before{content:"\F0740"}.mdi-gesture-swipe-vertical::before{content:"\F0AC0"}.mdi-gesture-tap::before{content:"\F0741"}.mdi-gesture-tap-box::before{content:"\F12A9"}.mdi-gesture-tap-button::before{content:"\F12A8"}.mdi-gesture-tap-hold::before{content:"\F0D77"}.mdi-gesture-two-double-tap::before{content:"\F0742"}.mdi-gesture-two-tap::before{content:"\F0743"}.mdi-ghost::before{content:"\F02A0"}.mdi-ghost-off::before{content:"\F09F5"}.mdi-ghost-off-outline::before{content:"\F165C"}.mdi-ghost-outline::before{content:"\F165D"}.mdi-gift::before{content:"\F0E44"}.mdi-gift-off::before{content:"\F16EF"}.mdi-gift-off-outline::before{content:"\F16F0"}.mdi-gift-open::before{content:"\F16F1"}.mdi-gift-open-outline::before{content:"\F16F2"}.mdi-gift-outline::before{content:"\F02A1"}.mdi-git::before{content:"\F02A2"}.mdi-github::before{content:"\F02A4"}.mdi-gitlab::before{content:"\F0BA0"}.mdi-glass-cocktail::before{content:"\F0356"}.mdi-glass-cocktail-off::before{content:"\F15E6"}.mdi-glass-flute::before{content:"\F02A5"}.mdi-glass-fragile::before{content:"\F1873"}.mdi-glass-mug::before{content:"\F02A6"}.mdi-glass-mug-off::before{content:"\F15E7"}.mdi-glass-mug-variant::before{content:"\F1116"}.mdi-glass-mug-variant-off::before{content:"\F15E8"}.mdi-glass-pint-outline::before{content:"\F130D"}.mdi-glass-stange::before{content:"\F02A7"}.mdi-glass-tulip::before{content:"\F02A8"}.mdi-glass-wine::before{content:"\F0876"}.mdi-glasses::before{content:"\F02AA"}.mdi-globe-light::before{content:"\F066F"}.mdi-globe-light-outline::before{content:"\F12D7"}.mdi-globe-model::before{content:"\F08E9"}.mdi-gmail::before{content:"\F02AB"}.mdi-gnome::before{content:"\F02AC"}.mdi-go-kart::before{content:"\F0D79"}.mdi-go-kart-track::before{content:"\F0D7A"}.mdi-gog::before{content:"\F0BA1"}.mdi-gold::before{content:"\F124F"}.mdi-golf::before{content:"\F0823"}.mdi-golf-cart::before{content:"\F11A4"}.mdi-golf-tee::before{content:"\F1083"}.mdi-gondola::before{content:"\F0686"}.mdi-goodreads::before{content:"\F0D7B"}.mdi-google::before{content:"\F02AD"}.mdi-google-ads::before{content:"\F0C87"}.mdi-google-analytics::before{content:"\F07CC"}.mdi-google-assistant::before{content:"\F07CD"}.mdi-google-cardboard::before{content:"\F02AE"}.mdi-google-chrome::before{content:"\F02AF"}.mdi-google-circles::before{content:"\F02B0"}.mdi-google-circles-communities::before{content:"\F02B1"}.mdi-google-circles-extended::before{content:"\F02B2"}.mdi-google-circles-group::before{content:"\F02B3"}.mdi-google-classroom::before{content:"\F02C0"}.mdi-google-cloud::before{content:"\F11F6"}.mdi-google-downasaur::before{content:"\F1362"}.mdi-google-drive::before{content:"\F02B6"}.mdi-google-earth::before{content:"\F02B7"}.mdi-google-fit::before{content:"\F096C"}.mdi-google-glass::before{content:"\F02B8"}.mdi-google-hangouts::before{content:"\F02C9"}.mdi-google-keep::before{content:"\F06DC"}.mdi-google-lens::before{content:"\F09F6"}.mdi-google-maps::before{content:"\F05F5"}.mdi-google-my-business::before{content:"\F1048"}.mdi-google-nearby::before{content:"\F02B9"}.mdi-google-play::before{content:"\F02BC"}.mdi-google-plus::before{content:"\F02BD"}.mdi-google-podcast::before{content:"\F0EB9"}.mdi-google-spreadsheet::before{content:"\F09F7"}.mdi-google-street-view::before{content:"\F0C88"}.mdi-google-translate::before{content:"\F02BF"}.mdi-gradient-horizontal::before{content:"\F174A"}.mdi-gradient-vertical::before{content:"\F06A0"}.mdi-grain::before{content:"\F0D7C"}.mdi-graph::before{content:"\F1049"}.mdi-graph-outline::before{content:"\F104A"}.mdi-graphql::before{content:"\F0877"}.mdi-grass::before{content:"\F1510"}.mdi-grave-stone::before{content:"\F0BA2"}.mdi-grease-pencil::before{content:"\F0648"}.mdi-greater-than::before{content:"\F096D"}.mdi-greater-than-or-equal::before{content:"\F096E"}.mdi-greenhouse::before{content:"\F002D"}.mdi-grid::before{content:"\F02C1"}.mdi-grid-large::before{content:"\F0758"}.mdi-grid-off::before{content:"\F02C2"}.mdi-grill::before{content:"\F0E45"}.mdi-grill-outline::before{content:"\F118A"}.mdi-group::before{content:"\F02C3"}.mdi-guitar-acoustic::before{content:"\F0771"}.mdi-guitar-electric::before{content:"\F02C4"}.mdi-guitar-pick::before{content:"\F02C5"}.mdi-guitar-pick-outline::before{content:"\F02C6"}.mdi-guy-fawkes-mask::before{content:"\F0825"}.mdi-gymnastics::before{content:"\F1A41"}.mdi-hail::before{content:"\F0AC1"}.mdi-hair-dryer::before{content:"\F10EF"}.mdi-hair-dryer-outline::before{content:"\F10F0"}.mdi-halloween::before{content:"\F0BA3"}.mdi-hamburger::before{content:"\F0685"}.mdi-hamburger-check::before{content:"\F1776"}.mdi-hamburger-minus::before{content:"\F1777"}.mdi-hamburger-off::before{content:"\F1778"}.mdi-hamburger-plus::before{content:"\F1779"}.mdi-hamburger-remove::before{content:"\F177A"}.mdi-hammer::before{content:"\F08EA"}.mdi-hammer-screwdriver::before{content:"\F1322"}.mdi-hammer-sickle::before{content:"\F1887"}.mdi-hammer-wrench::before{content:"\F1323"}.mdi-hand-back-left::before{content:"\F0E46"}.mdi-hand-back-left-off::before{content:"\F1830"}.mdi-hand-back-left-off-outline::before{content:"\F1832"}.mdi-hand-back-left-outline::before{content:"\F182C"}.mdi-hand-back-right::before{content:"\F0E47"}.mdi-hand-back-right-off::before{content:"\F1831"}.mdi-hand-back-right-off-outline::before{content:"\F1833"}.mdi-hand-back-right-outline::before{content:"\F182D"}.mdi-hand-clap::before{content:"\F194B"}.mdi-hand-clap-off::before{content:"\F1A42"}.mdi-hand-coin::before{content:"\F188F"}.mdi-hand-coin-outline::before{content:"\F1890"}.mdi-hand-cycle::before{content:"\F1B9C"}.mdi-hand-extended::before{content:"\F18B6"}.mdi-hand-extended-outline::before{content:"\F18B7"}.mdi-hand-front-left::before{content:"\F182B"}.mdi-hand-front-left-outline::before{content:"\F182E"}.mdi-hand-front-right::before{content:"\F0A4F"}.mdi-hand-front-right-outline::before{content:"\F182F"}.mdi-hand-heart::before{content:"\F10F1"}.mdi-hand-heart-outline::before{content:"\F157E"}.mdi-hand-okay::before{content:"\F0A50"}.mdi-hand-peace::before{content:"\F0A51"}.mdi-hand-peace-variant::before{content:"\F0A52"}.mdi-hand-pointing-down::before{content:"\F0A53"}.mdi-hand-pointing-left::before{content:"\F0A54"}.mdi-hand-pointing-right::before{content:"\F02C7"}.mdi-hand-pointing-up::before{content:"\F0A55"}.mdi-hand-saw::before{content:"\F0E48"}.mdi-hand-wash::before{content:"\F157F"}.mdi-hand-wash-outline::before{content:"\F1580"}.mdi-hand-water::before{content:"\F139F"}.mdi-hand-wave::before{content:"\F1821"}.mdi-hand-wave-outline::before{content:"\F1822"}.mdi-handball::before{content:"\F0F53"}.mdi-handcuffs::before{content:"\F113E"}.mdi-hands-pray::before{content:"\F0579"}.mdi-handshake::before{content:"\F1218"}.mdi-handshake-outline::before{content:"\F15A1"}.mdi-hanger::before{content:"\F02C8"}.mdi-hard-hat::before{content:"\F096F"}.mdi-harddisk::before{content:"\F02CA"}.mdi-harddisk-plus::before{content:"\F104B"}.mdi-harddisk-remove::before{content:"\F104C"}.mdi-hat-fedora::before{content:"\F0BA4"}.mdi-hazard-lights::before{content:"\F0C89"}.mdi-hdmi-port::before{content:"\F1BB8"}.mdi-hdr::before{content:"\F0D7D"}.mdi-hdr-off::before{content:"\F0D7E"}.mdi-head::before{content:"\F135E"}.mdi-head-alert::before{content:"\F1338"}.mdi-head-alert-outline::before{content:"\F1339"}.mdi-head-check::before{content:"\F133A"}.mdi-head-check-outline::before{content:"\F133B"}.mdi-head-cog::before{content:"\F133C"}.mdi-head-cog-outline::before{content:"\F133D"}.mdi-head-dots-horizontal::before{content:"\F133E"}.mdi-head-dots-horizontal-outline::before{content:"\F133F"}.mdi-head-flash::before{content:"\F1340"}.mdi-head-flash-outline::before{content:"\F1341"}.mdi-head-heart::before{content:"\F1342"}.mdi-head-heart-outline::before{content:"\F1343"}.mdi-head-lightbulb::before{content:"\F1344"}.mdi-head-lightbulb-outline::before{content:"\F1345"}.mdi-head-minus::before{content:"\F1346"}.mdi-head-minus-outline::before{content:"\F1347"}.mdi-head-outline::before{content:"\F135F"}.mdi-head-plus::before{content:"\F1348"}.mdi-head-plus-outline::before{content:"\F1349"}.mdi-head-question::before{content:"\F134A"}.mdi-head-question-outline::before{content:"\F134B"}.mdi-head-remove::before{content:"\F134C"}.mdi-head-remove-outline::before{content:"\F134D"}.mdi-head-snowflake::before{content:"\F134E"}.mdi-head-snowflake-outline::before{content:"\F134F"}.mdi-head-sync::before{content:"\F1350"}.mdi-head-sync-outline::before{content:"\F1351"}.mdi-headphones::before{content:"\F02CB"}.mdi-headphones-bluetooth::before{content:"\F0970"}.mdi-headphones-box::before{content:"\F02CC"}.mdi-headphones-off::before{content:"\F07CE"}.mdi-headphones-settings::before{content:"\F02CD"}.mdi-headset::before{content:"\F02CE"}.mdi-headset-dock::before{content:"\F02CF"}.mdi-headset-off::before{content:"\F02D0"}.mdi-heart::before{content:"\F02D1"}.mdi-heart-box::before{content:"\F02D2"}.mdi-heart-box-outline::before{content:"\F02D3"}.mdi-heart-broken::before{content:"\F02D4"}.mdi-heart-broken-outline::before{content:"\F0D14"}.mdi-heart-circle::before{content:"\F0971"}.mdi-heart-circle-outline::before{content:"\F0972"}.mdi-heart-cog::before{content:"\F1663"}.mdi-heart-cog-outline::before{content:"\F1664"}.mdi-heart-flash::before{content:"\F0EF9"}.mdi-heart-half::before{content:"\F06DF"}.mdi-heart-half-full::before{content:"\F06DE"}.mdi-heart-half-outline::before{content:"\F06E0"}.mdi-heart-minus::before{content:"\F142F"}.mdi-heart-minus-outline::before{content:"\F1432"}.mdi-heart-multiple::before{content:"\F0A56"}.mdi-heart-multiple-outline::before{content:"\F0A57"}.mdi-heart-off::before{content:"\F0759"}.mdi-heart-off-outline::before{content:"\F1434"}.mdi-heart-outline::before{content:"\F02D5"}.mdi-heart-plus::before{content:"\F142E"}.mdi-heart-plus-outline::before{content:"\F1431"}.mdi-heart-pulse::before{content:"\F05F6"}.mdi-heart-remove::before{content:"\F1430"}.mdi-heart-remove-outline::before{content:"\F1433"}.mdi-heart-search::before{content:"\F1C8D"}.mdi-heart-settings::before{content:"\F1665"}.mdi-heart-settings-outline::before{content:"\F1666"}.mdi-heat-pump::before{content:"\F1A43"}.mdi-heat-pump-outline::before{content:"\F1A44"}.mdi-heat-wave::before{content:"\F1A45"}.mdi-heating-coil::before{content:"\F1AAF"}.mdi-helicopter::before{content:"\F0AC2"}.mdi-help::before{content:"\F02D6"}.mdi-help-box::before{content:"\F078B"}.mdi-help-box-multiple::before{content:"\F1C0A"}.mdi-help-box-multiple-outline::before{content:"\F1C0B"}.mdi-help-box-outline::before{content:"\F1C0C"}.mdi-help-circle::before{content:"\F02D7"}.mdi-help-circle-outline::before{content:"\F0625"}.mdi-help-network::before{content:"\F06F5"}.mdi-help-network-outline::before{content:"\F0C8A"}.mdi-help-rhombus::before{content:"\F0BA5"}.mdi-help-rhombus-outline::before{content:"\F0BA6"}.mdi-hexadecimal::before{content:"\F12A7"}.mdi-hexagon::before{content:"\F02D8"}.mdi-hexagon-multiple::before{content:"\F06E1"}.mdi-hexagon-multiple-outline::before{content:"\F10F2"}.mdi-hexagon-outline::before{content:"\F02D9"}.mdi-hexagon-slice-1::before{content:"\F0AC3"}.mdi-hexagon-slice-2::before{content:"\F0AC4"}.mdi-hexagon-slice-3::before{content:"\F0AC5"}.mdi-hexagon-slice-4::before{content:"\F0AC6"}.mdi-hexagon-slice-5::before{content:"\F0AC7"}.mdi-hexagon-slice-6::before{content:"\F0AC8"}.mdi-hexagram::before{content:"\F0AC9"}.mdi-hexagram-outline::before{content:"\F0ACA"}.mdi-high-definition::before{content:"\F07CF"}.mdi-high-definition-box::before{content:"\F0878"}.mdi-highway::before{content:"\F05F7"}.mdi-hiking::before{content:"\F0D7F"}.mdi-history::before{content:"\F02DA"}.mdi-hockey-puck::before{content:"\F0879"}.mdi-hockey-sticks::before{content:"\F087A"}.mdi-hololens::before{content:"\F02DB"}.mdi-home::before{content:"\F02DC"}.mdi-home-account::before{content:"\F0826"}.mdi-home-alert::before{content:"\F087B"}.mdi-home-alert-outline::before{content:"\F15D0"}.mdi-home-analytics::before{content:"\F0EBA"}.mdi-home-assistant::before{content:"\F07D0"}.mdi-home-automation::before{content:"\F07D1"}.mdi-home-battery::before{content:"\F1901"}.mdi-home-battery-outline::before{content:"\F1902"}.mdi-home-circle::before{content:"\F07D2"}.mdi-home-circle-outline::before{content:"\F104D"}.mdi-home-city::before{content:"\F0D15"}.mdi-home-city-outline::before{content:"\F0D16"}.mdi-home-clock::before{content:"\F1A12"}.mdi-home-clock-outline::before{content:"\F1A13"}.mdi-home-edit::before{content:"\F1159"}.mdi-home-edit-outline::before{content:"\F115A"}.mdi-home-export-outline::before{content:"\F0F9B"}.mdi-home-flood::before{content:"\F0EFA"}.mdi-home-floor-0::before{content:"\F0DD2"}.mdi-home-floor-1::before{content:"\F0D80"}.mdi-home-floor-2::before{content:"\F0D81"}.mdi-home-floor-3::before{content:"\F0D82"}.mdi-home-floor-a::before{content:"\F0D83"}.mdi-home-floor-b::before{content:"\F0D84"}.mdi-home-floor-g::before{content:"\F0D85"}.mdi-home-floor-l::before{content:"\F0D86"}.mdi-home-floor-negative-1::before{content:"\F0DD3"}.mdi-home-group::before{content:"\F0DD4"}.mdi-home-group-minus::before{content:"\F19C1"}.mdi-home-group-plus::before{content:"\F19C0"}.mdi-home-group-remove::before{content:"\F19C2"}.mdi-home-heart::before{content:"\F0827"}.mdi-home-import-outline::before{content:"\F0F9C"}.mdi-home-lightbulb::before{content:"\F1251"}.mdi-home-lightbulb-outline::before{content:"\F1252"}.mdi-home-lightning-bolt::before{content:"\F1903"}.mdi-home-lightning-bolt-outline::before{content:"\F1904"}.mdi-home-lock::before{content:"\F08EB"}.mdi-home-lock-open::before{content:"\F08EC"}.mdi-home-map-marker::before{content:"\F05F8"}.mdi-home-minus::before{content:"\F0974"}.mdi-home-minus-outline::before{content:"\F13D5"}.mdi-home-modern::before{content:"\F02DD"}.mdi-home-off::before{content:"\F1A46"}.mdi-home-off-outline::before{content:"\F1A47"}.mdi-home-outline::before{content:"\F06A1"}.mdi-home-percent::before{content:"\F1C7C"}.mdi-home-percent-outline::before{content:"\F1C7D"}.mdi-home-plus::before{content:"\F0975"}.mdi-home-plus-outline::before{content:"\F13D6"}.mdi-home-remove::before{content:"\F1247"}.mdi-home-remove-outline::before{content:"\F13D7"}.mdi-home-roof::before{content:"\F112B"}.mdi-home-search::before{content:"\F13B0"}.mdi-home-search-outline::before{content:"\F13B1"}.mdi-home-silo::before{content:"\F1BA0"}.mdi-home-silo-outline::before{content:"\F1BA1"}.mdi-home-sound-in::before{content:"\F1C2F"}.mdi-home-sound-in-outline::before{content:"\F1C30"}.mdi-home-sound-out::before{content:"\F1C31"}.mdi-home-sound-out-outline::before{content:"\F1C32"}.mdi-home-switch::before{content:"\F1794"}.mdi-home-switch-outline::before{content:"\F1795"}.mdi-home-thermometer::before{content:"\F0F54"}.mdi-home-thermometer-outline::before{content:"\F0F55"}.mdi-home-variant::before{content:"\F02DE"}.mdi-home-variant-outline::before{content:"\F0BA7"}.mdi-hook::before{content:"\F06E2"}.mdi-hook-off::before{content:"\F06E3"}.mdi-hoop-house::before{content:"\F0E56"}.mdi-hops::before{content:"\F02DF"}.mdi-horizontal-rotate-clockwise::before{content:"\F10F3"}.mdi-horizontal-rotate-counterclockwise::before{content:"\F10F4"}.mdi-horse::before{content:"\F15BF"}.mdi-horse-human::before{content:"\F15C0"}.mdi-horse-variant::before{content:"\F15C1"}.mdi-horse-variant-fast::before{content:"\F186E"}.mdi-horseshoe::before{content:"\F0A58"}.mdi-hospital::before{content:"\F0FF6"}.mdi-hospital-box::before{content:"\F02E0"}.mdi-hospital-box-outline::before{content:"\F0FF7"}.mdi-hospital-building::before{content:"\F02E1"}.mdi-hospital-marker::before{content:"\F02E2"}.mdi-hot-tub::before{content:"\F0828"}.mdi-hours-12::before{content:"\F1C94"}.mdi-hours-24::before{content:"\F1478"}.mdi-hub::before{content:"\F1C95"}.mdi-hub-outline::before{content:"\F1C96"}.mdi-hubspot::before{content:"\F0D17"}.mdi-hulu::before{content:"\F0829"}.mdi-human::before{content:"\F02E6"}.mdi-human-baby-changing-table::before{content:"\F138B"}.mdi-human-cane::before{content:"\F1581"}.mdi-human-capacity-decrease::before{content:"\F159B"}.mdi-human-capacity-increase::before{content:"\F159C"}.mdi-human-child::before{content:"\F02E7"}.mdi-human-dolly::before{content:"\F1980"}.mdi-human-edit::before{content:"\F14E8"}.mdi-human-female::before{content:"\F0649"}.mdi-human-female-boy::before{content:"\F0A59"}.mdi-human-female-dance::before{content:"\F15C9"}.mdi-human-female-female::before{content:"\F0A5A"}.mdi-human-female-female-child::before{content:"\F1C8E"}.mdi-human-female-girl::before{content:"\F0A5B"}.mdi-human-greeting::before{content:"\F17C4"}.mdi-human-greeting-proximity::before{content:"\F159D"}.mdi-human-greeting-variant::before{content:"\F064A"}.mdi-human-handsdown::before{content:"\F064B"}.mdi-human-handsup::before{content:"\F064C"}.mdi-human-male::before{content:"\F064D"}.mdi-human-male-board::before{content:"\F0890"}.mdi-human-male-board-poll::before{content:"\F0846"}.mdi-human-male-boy::before{content:"\F0A5C"}.mdi-human-male-child::before{content:"\F138C"}.mdi-human-male-female::before{content:"\F02E8"}.mdi-human-male-female-child::before{content:"\F1823"}.mdi-human-male-girl::before{content:"\F0A5D"}.mdi-human-male-height::before{content:"\F0EFB"}.mdi-human-male-height-variant::before{content:"\F0EFC"}.mdi-human-male-male::before{content:"\F0A5E"}.mdi-human-male-male-child::before{content:"\F1C8F"}.mdi-human-non-binary::before{content:"\F1848"}.mdi-human-pregnant::before{content:"\F05CF"}.mdi-human-queue::before{content:"\F1571"}.mdi-human-scooter::before{content:"\F11E9"}.mdi-human-walker::before{content:"\F1B71"}.mdi-human-wheelchair::before{content:"\F138D"}.mdi-human-white-cane::before{content:"\F1981"}.mdi-humble-bundle::before{content:"\F0744"}.mdi-hvac::before{content:"\F1352"}.mdi-hvac-off::before{content:"\F159E"}.mdi-hydraulic-oil-level::before{content:"\F1324"}.mdi-hydraulic-oil-temperature::before{content:"\F1325"}.mdi-hydro-power::before{content:"\F12E5"}.mdi-hydrogen-station::before{content:"\F1894"}.mdi-ice-cream::before{content:"\F082A"}.mdi-ice-cream-off::before{content:"\F0E52"}.mdi-ice-pop::before{content:"\F0EFD"}.mdi-id-card::before{content:"\F0FC0"}.mdi-identifier::before{content:"\F0EFE"}.mdi-ideogram-cjk::before{content:"\F1331"}.mdi-ideogram-cjk-variant::before{content:"\F1332"}.mdi-image::before{content:"\F02E9"}.mdi-image-album::before{content:"\F02EA"}.mdi-image-area::before{content:"\F02EB"}.mdi-image-area-close::before{content:"\F02EC"}.mdi-image-auto-adjust::before{content:"\F0FC1"}.mdi-image-broken::before{content:"\F02ED"}.mdi-image-broken-variant::before{content:"\F02EE"}.mdi-image-check::before{content:"\F1B25"}.mdi-image-check-outline::before{content:"\F1B26"}.mdi-image-edit::before{content:"\F11E3"}.mdi-image-edit-outline::before{content:"\F11E4"}.mdi-image-filter-black-white::before{content:"\F02F0"}.mdi-image-filter-center-focus::before{content:"\F02F1"}.mdi-image-filter-center-focus-strong::before{content:"\F0EFF"}.mdi-image-filter-center-focus-strong-outline::before{content:"\F0F00"}.mdi-image-filter-center-focus-weak::before{content:"\F02F2"}.mdi-image-filter-drama::before{content:"\F02F3"}.mdi-image-filter-drama-outline::before{content:"\F1BFF"}.mdi-image-filter-frames::before{content:"\F02F4"}.mdi-image-filter-hdr::before{content:"\F02F5"}.mdi-image-filter-hdr-outline::before{content:"\F1C64"}.mdi-image-filter-none::before{content:"\F02F6"}.mdi-image-filter-tilt-shift::before{content:"\F02F7"}.mdi-image-filter-vintage::before{content:"\F02F8"}.mdi-image-frame::before{content:"\F0E49"}.mdi-image-lock::before{content:"\F1AB0"}.mdi-image-lock-outline::before{content:"\F1AB1"}.mdi-image-marker::before{content:"\F177B"}.mdi-image-marker-outline::before{content:"\F177C"}.mdi-image-minus::before{content:"\F1419"}.mdi-image-minus-outline::before{content:"\F1B47"}.mdi-image-move::before{content:"\F09F8"}.mdi-image-multiple::before{content:"\F02F9"}.mdi-image-multiple-outline::before{content:"\F02EF"}.mdi-image-off::before{content:"\F082B"}.mdi-image-off-outline::before{content:"\F11D1"}.mdi-image-outline::before{content:"\F0976"}.mdi-image-plus::before{content:"\F087C"}.mdi-image-plus-outline::before{content:"\F1B46"}.mdi-image-refresh::before{content:"\F19FE"}.mdi-image-refresh-outline::before{content:"\F19FF"}.mdi-image-remove::before{content:"\F1418"}.mdi-image-remove-outline::before{content:"\F1B48"}.mdi-image-search::before{content:"\F0977"}.mdi-image-search-outline::before{content:"\F0978"}.mdi-image-size-select-actual::before{content:"\F0C8D"}.mdi-image-size-select-large::before{content:"\F0C8E"}.mdi-image-size-select-small::before{content:"\F0C8F"}.mdi-image-sync::before{content:"\F1A00"}.mdi-image-sync-outline::before{content:"\F1A01"}.mdi-image-text::before{content:"\F160D"}.mdi-import::before{content:"\F02FA"}.mdi-inbox::before{content:"\F0687"}.mdi-inbox-arrow-down::before{content:"\F02FB"}.mdi-inbox-arrow-down-outline::before{content:"\F1270"}.mdi-inbox-arrow-up::before{content:"\F03D1"}.mdi-inbox-arrow-up-outline::before{content:"\F1271"}.mdi-inbox-full::before{content:"\F1272"}.mdi-inbox-full-outline::before{content:"\F1273"}.mdi-inbox-multiple::before{content:"\F08B0"}.mdi-inbox-multiple-outline::before{content:"\F0BA8"}.mdi-inbox-outline::before{content:"\F1274"}.mdi-inbox-remove::before{content:"\F159F"}.mdi-inbox-remove-outline::before{content:"\F15A0"}.mdi-incognito::before{content:"\F05F9"}.mdi-incognito-circle::before{content:"\F1421"}.mdi-incognito-circle-off::before{content:"\F1422"}.mdi-incognito-off::before{content:"\F0075"}.mdi-induction::before{content:"\F184C"}.mdi-infinity::before{content:"\F06E4"}.mdi-information::before{content:"\F02FC"}.mdi-information-box::before{content:"\F1C65"}.mdi-information-box-outline::before{content:"\F1C66"}.mdi-information-off::before{content:"\F178C"}.mdi-information-off-outline::before{content:"\F178D"}.mdi-information-outline::before{content:"\F02FD"}.mdi-information-slab-box::before{content:"\F1C67"}.mdi-information-slab-box-outline::before{content:"\F1C68"}.mdi-information-slab-circle::before{content:"\F1C69"}.mdi-information-slab-circle-outline::before{content:"\F1C6A"}.mdi-information-slab-symbol::before{content:"\F1C6B"}.mdi-information-symbol::before{content:"\F1C6C"}.mdi-information-variant::before{content:"\F064E"}.mdi-information-variant-box::before{content:"\F1C6D"}.mdi-information-variant-box-outline::before{content:"\F1C6E"}.mdi-information-variant-circle::before{content:"\F1C6F"}.mdi-information-variant-circle-outline::before{content:"\F1C70"}.mdi-instagram::before{content:"\F02FE"}.mdi-instrument-triangle::before{content:"\F104E"}.mdi-integrated-circuit-chip::before{content:"\F1913"}.mdi-invert-colors::before{content:"\F0301"}.mdi-invert-colors-off::before{content:"\F0E4A"}.mdi-invoice::before{content:"\F1CD2"}.mdi-invoice-arrow-left::before{content:"\F1CD3"}.mdi-invoice-arrow-left-outline::before{content:"\F1CD4"}.mdi-invoice-arrow-right::before{content:"\F1CD5"}.mdi-invoice-arrow-right-outline::before{content:"\F1CD6"}.mdi-invoice-check::before{content:"\F1CD7"}.mdi-invoice-check-outline::before{content:"\F1CD8"}.mdi-invoice-clock::before{content:"\F1CD9"}.mdi-invoice-clock-outline::before{content:"\F1CDA"}.mdi-invoice-edit::before{content:"\F1CDB"}.mdi-invoice-edit-outline::before{content:"\F1CDC"}.mdi-invoice-export-outline::before{content:"\F1CDD"}.mdi-invoice-fast::before{content:"\F1CDE"}.mdi-invoice-fast-outline::before{content:"\F1CDF"}.mdi-invoice-import::before{content:"\F1CE0"}.mdi-invoice-import-outline::before{content:"\F1CE1"}.mdi-invoice-list::before{content:"\F1CE2"}.mdi-invoice-list-outline::before{content:"\F1CE3"}.mdi-invoice-minus::before{content:"\F1CE4"}.mdi-invoice-minus-outline::before{content:"\F1CE5"}.mdi-invoice-multiple::before{content:"\F1CE6"}.mdi-invoice-multiple-outline::before{content:"\F1CE7"}.mdi-invoice-outline::before{content:"\F1CE8"}.mdi-invoice-plus::before{content:"\F1CE9"}.mdi-invoice-plus-outline::before{content:"\F1CEA"}.mdi-invoice-remove::before{content:"\F1CEB"}.mdi-invoice-remove-outline::before{content:"\F1CEC"}.mdi-invoice-send::before{content:"\F1CED"}.mdi-invoice-send-outline::before{content:"\F1CEE"}.mdi-invoice-text::before{content:"\F1CEF"}.mdi-invoice-text-arrow-left::before{content:"\F1CF0"}.mdi-invoice-text-arrow-left-outline::before{content:"\F1CF1"}.mdi-invoice-text-arrow-right::before{content:"\F1CF2"}.mdi-invoice-text-arrow-right-outline::before{content:"\F1CF3"}.mdi-invoice-text-check::before{content:"\F1CF4"}.mdi-invoice-text-check-outline::before{content:"\F1CF5"}.mdi-invoice-text-clock::before{content:"\F1CF6"}.mdi-invoice-text-clock-outline::before{content:"\F1CF7"}.mdi-invoice-text-edit::before{content:"\F1CF8"}.mdi-invoice-text-edit-outline::before{content:"\F1CF9"}.mdi-invoice-text-fast::before{content:"\F1CFA"}.mdi-invoice-text-fast-outline::before{content:"\F1CFB"}.mdi-invoice-text-minus::before{content:"\F1CFC"}.mdi-invoice-text-minus-outline::before{content:"\F1CFD"}.mdi-invoice-text-multiple::before{content:"\F1CFE"}.mdi-invoice-text-multiple-outline::before{content:"\F1CFF"}.mdi-invoice-text-outline::before{content:"\F1D00"}.mdi-invoice-text-plus::before{content:"\F1D01"}.mdi-invoice-text-plus-outline::before{content:"\F1D02"}.mdi-invoice-text-remove::before{content:"\F1D03"}.mdi-invoice-text-remove-outline::before{content:"\F1D04"}.mdi-invoice-text-send::before{content:"\F1D05"}.mdi-invoice-text-send-outline::before{content:"\F1D06"}.mdi-iobroker::before{content:"\F12E8"}.mdi-ip::before{content:"\F0A5F"}.mdi-ip-network::before{content:"\F0A60"}.mdi-ip-network-outline::before{content:"\F0C90"}.mdi-ip-outline::before{content:"\F1982"}.mdi-ipod::before{content:"\F0C91"}.mdi-iron::before{content:"\F1824"}.mdi-iron-board::before{content:"\F1838"}.mdi-iron-outline::before{content:"\F1825"}.mdi-island::before{content:"\F104F"}.mdi-island-variant::before{content:"\F1CC6"}.mdi-iv-bag::before{content:"\F10B9"}.mdi-jabber::before{content:"\F0DD5"}.mdi-jeepney::before{content:"\F0302"}.mdi-jellyfish::before{content:"\F0F01"}.mdi-jellyfish-outline::before{content:"\F0F02"}.mdi-jira::before{content:"\F0303"}.mdi-jquery::before{content:"\F087D"}.mdi-jsfiddle::before{content:"\F0304"}.mdi-jump-rope::before{content:"\F12FF"}.mdi-kabaddi::before{content:"\F0D87"}.mdi-kangaroo::before{content:"\F1558"}.mdi-karate::before{content:"\F082C"}.mdi-kayaking::before{content:"\F08AF"}.mdi-keg::before{content:"\F0305"}.mdi-kettle::before{content:"\F05FA"}.mdi-kettle-alert::before{content:"\F1317"}.mdi-kettle-alert-outline::before{content:"\F1318"}.mdi-kettle-off::before{content:"\F131B"}.mdi-kettle-off-outline::before{content:"\F131C"}.mdi-kettle-outline::before{content:"\F0F56"}.mdi-kettle-pour-over::before{content:"\F173C"}.mdi-kettle-steam::before{content:"\F1319"}.mdi-kettle-steam-outline::before{content:"\F131A"}.mdi-kettlebell::before{content:"\F1300"}.mdi-key::before{content:"\F0306"}.mdi-key-alert::before{content:"\F1983"}.mdi-key-alert-outline::before{content:"\F1984"}.mdi-key-arrow-right::before{content:"\F1312"}.mdi-key-chain::before{content:"\F1574"}.mdi-key-chain-variant::before{content:"\F1575"}.mdi-key-change::before{content:"\F0307"}.mdi-key-link::before{content:"\F119F"}.mdi-key-minus::before{content:"\F0308"}.mdi-key-outline::before{content:"\F0DD6"}.mdi-key-plus::before{content:"\F0309"}.mdi-key-remove::before{content:"\F030A"}.mdi-key-star::before{content:"\F119E"}.mdi-key-variant::before{content:"\F030B"}.mdi-key-wireless::before{content:"\F0FC2"}.mdi-keyboard::before{content:"\F030C"}.mdi-keyboard-backspace::before{content:"\F030D"}.mdi-keyboard-caps::before{content:"\F030E"}.mdi-keyboard-close::before{content:"\F030F"}.mdi-keyboard-close-outline::before{content:"\F1C00"}.mdi-keyboard-esc::before{content:"\F12B7"}.mdi-keyboard-f1::before{content:"\F12AB"}.mdi-keyboard-f10::before{content:"\F12B4"}.mdi-keyboard-f11::before{content:"\F12B5"}.mdi-keyboard-f12::before{content:"\F12B6"}.mdi-keyboard-f2::before{content:"\F12AC"}.mdi-keyboard-f3::before{content:"\F12AD"}.mdi-keyboard-f4::before{content:"\F12AE"}.mdi-keyboard-f5::before{content:"\F12AF"}.mdi-keyboard-f6::before{content:"\F12B0"}.mdi-keyboard-f7::before{content:"\F12B1"}.mdi-keyboard-f8::before{content:"\F12B2"}.mdi-keyboard-f9::before{content:"\F12B3"}.mdi-keyboard-off::before{content:"\F0310"}.mdi-keyboard-off-outline::before{content:"\F0E4B"}.mdi-keyboard-outline::before{content:"\F097B"}.mdi-keyboard-return::before{content:"\F0311"}.mdi-keyboard-settings::before{content:"\F09F9"}.mdi-keyboard-settings-outline::before{content:"\F09FA"}.mdi-keyboard-space::before{content:"\F1050"}.mdi-keyboard-tab::before{content:"\F0312"}.mdi-keyboard-tab-reverse::before{content:"\F0325"}.mdi-keyboard-variant::before{content:"\F0313"}.mdi-khanda::before{content:"\F10FD"}.mdi-kickstarter::before{content:"\F0745"}.mdi-kite::before{content:"\F1985"}.mdi-kite-outline::before{content:"\F1986"}.mdi-kitesurfing::before{content:"\F1744"}.mdi-klingon::before{content:"\F135B"}.mdi-knife::before{content:"\F09FB"}.mdi-knife-military::before{content:"\F09FC"}.mdi-knob::before{content:"\F1B96"}.mdi-koala::before{content:"\F173F"}.mdi-kodi::before{content:"\F0314"}.mdi-kubernetes::before{content:"\F10FE"}.mdi-label::before{content:"\F0315"}.mdi-label-multiple::before{content:"\F1375"}.mdi-label-multiple-outline::before{content:"\F1376"}.mdi-label-off::before{content:"\F0ACB"}.mdi-label-off-outline::before{content:"\F0ACC"}.mdi-label-outline::before{content:"\F0316"}.mdi-label-percent::before{content:"\F12EA"}.mdi-label-percent-outline::before{content:"\F12EB"}.mdi-label-variant::before{content:"\F0ACD"}.mdi-label-variant-outline::before{content:"\F0ACE"}.mdi-ladder::before{content:"\F15A2"}.mdi-ladybug::before{content:"\F082D"}.mdi-lambda::before{content:"\F0627"}.mdi-lamp::before{content:"\F06B5"}.mdi-lamp-outline::before{content:"\F17D0"}.mdi-lamps::before{content:"\F1576"}.mdi-lamps-outline::before{content:"\F17D1"}.mdi-lan::before{content:"\F0317"}.mdi-lan-check::before{content:"\F12AA"}.mdi-lan-connect::before{content:"\F0318"}.mdi-lan-disconnect::before{content:"\F0319"}.mdi-lan-pending::before{content:"\F031A"}.mdi-land-fields::before{content:"\F1AB2"}.mdi-land-plots::before{content:"\F1AB3"}.mdi-land-plots-circle::before{content:"\F1AB4"}.mdi-land-plots-circle-variant::before{content:"\F1AB5"}.mdi-land-plots-marker::before{content:"\F1C5D"}.mdi-land-rows-horizontal::before{content:"\F1AB6"}.mdi-land-rows-vertical::before{content:"\F1AB7"}.mdi-landslide::before{content:"\F1A48"}.mdi-landslide-outline::before{content:"\F1A49"}.mdi-language-c::before{content:"\F0671"}.mdi-language-cpp::before{content:"\F0672"}.mdi-language-csharp::before{content:"\F031B"}.mdi-language-css3::before{content:"\F031C"}.mdi-language-fortran::before{content:"\F121A"}.mdi-language-go::before{content:"\F07D3"}.mdi-language-haskell::before{content:"\F0C92"}.mdi-language-html5::before{content:"\F031D"}.mdi-language-java::before{content:"\F0B37"}.mdi-language-javascript::before{content:"\F031E"}.mdi-language-kotlin::before{content:"\F1219"}.mdi-language-lua::before{content:"\F08B1"}.mdi-language-markdown::before{content:"\F0354"}.mdi-language-markdown-outline::before{content:"\F0F5B"}.mdi-language-php::before{content:"\F031F"}.mdi-language-python::before{content:"\F0320"}.mdi-language-r::before{content:"\F07D4"}.mdi-language-ruby::before{content:"\F0D2D"}.mdi-language-ruby-on-rails::before{content:"\F0ACF"}.mdi-language-rust::before{content:"\F1617"}.mdi-language-swift::before{content:"\F06E5"}.mdi-language-typescript::before{content:"\F06E6"}.mdi-language-xaml::before{content:"\F0673"}.mdi-laptop::before{content:"\F0322"}.mdi-laptop-account::before{content:"\F1A4A"}.mdi-laptop-off::before{content:"\F06E7"}.mdi-laravel::before{content:"\F0AD0"}.mdi-laser-pointer::before{content:"\F1484"}.mdi-lasso::before{content:"\F0F03"}.mdi-lastpass::before{content:"\F0446"}.mdi-latitude::before{content:"\F0F57"}.mdi-launch::before{content:"\F0327"}.mdi-lava-lamp::before{content:"\F07D5"}.mdi-layers::before{content:"\F0328"}.mdi-layers-edit::before{content:"\F1892"}.mdi-layers-minus::before{content:"\F0E4C"}.mdi-layers-off::before{content:"\F0329"}.mdi-layers-off-outline::before{content:"\F09FD"}.mdi-layers-outline::before{content:"\F09FE"}.mdi-layers-plus::before{content:"\F0E4D"}.mdi-layers-remove::before{content:"\F0E4E"}.mdi-layers-search::before{content:"\F1206"}.mdi-layers-search-outline::before{content:"\F1207"}.mdi-layers-triple::before{content:"\F0F58"}.mdi-layers-triple-outline::before{content:"\F0F59"}.mdi-lead-pencil::before{content:"\F064F"}.mdi-leaf::before{content:"\F032A"}.mdi-leaf-circle::before{content:"\F1905"}.mdi-leaf-circle-outline::before{content:"\F1906"}.mdi-leaf-maple::before{content:"\F0C93"}.mdi-leaf-maple-off::before{content:"\F12DA"}.mdi-leaf-off::before{content:"\F12D9"}.mdi-leak::before{content:"\F0DD7"}.mdi-leak-off::before{content:"\F0DD8"}.mdi-lectern::before{content:"\F1AF0"}.mdi-led-off::before{content:"\F032B"}.mdi-led-on::before{content:"\F032C"}.mdi-led-outline::before{content:"\F032D"}.mdi-led-strip::before{content:"\F07D6"}.mdi-led-strip-variant::before{content:"\F1051"}.mdi-led-strip-variant-off::before{content:"\F1A4B"}.mdi-led-variant-off::before{content:"\F032E"}.mdi-led-variant-on::before{content:"\F032F"}.mdi-led-variant-outline::before{content:"\F0330"}.mdi-leek::before{content:"\F117D"}.mdi-less-than::before{content:"\F097C"}.mdi-less-than-or-equal::before{content:"\F097D"}.mdi-library::before{content:"\F0331"}.mdi-library-outline::before{content:"\F1A22"}.mdi-library-shelves::before{content:"\F0BA9"}.mdi-license::before{content:"\F0FC3"}.mdi-lifebuoy::before{content:"\F087E"}.mdi-light-flood-down::before{content:"\F1987"}.mdi-light-flood-up::before{content:"\F1988"}.mdi-light-recessed::before{content:"\F179B"}.mdi-light-switch::before{content:"\F097E"}.mdi-light-switch-off::before{content:"\F1A24"}.mdi-lightbulb::before{content:"\F0335"}.mdi-lightbulb-alert::before{content:"\F19E1"}.mdi-lightbulb-alert-outline::before{content:"\F19E2"}.mdi-lightbulb-auto::before{content:"\F1800"}.mdi-lightbulb-auto-outline::before{content:"\F1801"}.mdi-lightbulb-cfl::before{content:"\F1208"}.mdi-lightbulb-cfl-off::before{content:"\F1209"}.mdi-lightbulb-cfl-spiral::before{content:"\F1275"}.mdi-lightbulb-cfl-spiral-off::before{content:"\F12C3"}.mdi-lightbulb-fluorescent-tube::before{content:"\F1804"}.mdi-lightbulb-fluorescent-tube-outline::before{content:"\F1805"}.mdi-lightbulb-group::before{content:"\F1253"}.mdi-lightbulb-group-off::before{content:"\F12CD"}.mdi-lightbulb-group-off-outline::before{content:"\F12CE"}.mdi-lightbulb-group-outline::before{content:"\F1254"}.mdi-lightbulb-multiple::before{content:"\F1255"}.mdi-lightbulb-multiple-off::before{content:"\F12CF"}.mdi-lightbulb-multiple-off-outline::before{content:"\F12D0"}.mdi-lightbulb-multiple-outline::before{content:"\F1256"}.mdi-lightbulb-night::before{content:"\F1A4C"}.mdi-lightbulb-night-outline::before{content:"\F1A4D"}.mdi-lightbulb-off::before{content:"\F0E4F"}.mdi-lightbulb-off-outline::before{content:"\F0E50"}.mdi-lightbulb-on::before{content:"\F06E8"}.mdi-lightbulb-on-10::before{content:"\F1A4E"}.mdi-lightbulb-on-20::before{content:"\F1A4F"}.mdi-lightbulb-on-30::before{content:"\F1A50"}.mdi-lightbulb-on-40::before{content:"\F1A51"}.mdi-lightbulb-on-50::before{content:"\F1A52"}.mdi-lightbulb-on-60::before{content:"\F1A53"}.mdi-lightbulb-on-70::before{content:"\F1A54"}.mdi-lightbulb-on-80::before{content:"\F1A55"}.mdi-lightbulb-on-90::before{content:"\F1A56"}.mdi-lightbulb-on-outline::before{content:"\F06E9"}.mdi-lightbulb-outline::before{content:"\F0336"}.mdi-lightbulb-question::before{content:"\F19E3"}.mdi-lightbulb-question-outline::before{content:"\F19E4"}.mdi-lightbulb-spot::before{content:"\F17F4"}.mdi-lightbulb-spot-off::before{content:"\F17F5"}.mdi-lightbulb-variant::before{content:"\F1802"}.mdi-lightbulb-variant-outline::before{content:"\F1803"}.mdi-lighthouse::before{content:"\F09FF"}.mdi-lighthouse-on::before{content:"\F0A00"}.mdi-lightning-bolt::before{content:"\F140B"}.mdi-lightning-bolt-circle::before{content:"\F0820"}.mdi-lightning-bolt-outline::before{content:"\F140C"}.mdi-line-scan::before{content:"\F0624"}.mdi-lingerie::before{content:"\F1476"}.mdi-link::before{content:"\F0337"}.mdi-link-box::before{content:"\F0D1A"}.mdi-link-box-outline::before{content:"\F0D1B"}.mdi-link-box-variant::before{content:"\F0D1C"}.mdi-link-box-variant-outline::before{content:"\F0D1D"}.mdi-link-circle::before{content:"\F1CAC"}.mdi-link-circle-outline::before{content:"\F1CAD"}.mdi-link-edit::before{content:"\F1CAE"}.mdi-link-lock::before{content:"\F10BA"}.mdi-link-off::before{content:"\F0338"}.mdi-link-plus::before{content:"\F0C94"}.mdi-link-variant::before{content:"\F0339"}.mdi-link-variant-minus::before{content:"\F10FF"}.mdi-link-variant-off::before{content:"\F033A"}.mdi-link-variant-plus::before{content:"\F1100"}.mdi-link-variant-remove::before{content:"\F1101"}.mdi-linkedin::before{content:"\F033B"}.mdi-linux::before{content:"\F033D"}.mdi-linux-mint::before{content:"\F08ED"}.mdi-lipstick::before{content:"\F13B5"}.mdi-liquid-spot::before{content:"\F1826"}.mdi-liquor::before{content:"\F191E"}.mdi-list-box::before{content:"\F1B7B"}.mdi-list-box-outline::before{content:"\F1B7C"}.mdi-list-status::before{content:"\F15AB"}.mdi-litecoin::before{content:"\F0A61"}.mdi-loading::before{content:"\F0772"}.mdi-location-enter::before{content:"\F0FC4"}.mdi-location-exit::before{content:"\F0FC5"}.mdi-lock::before{content:"\F033E"}.mdi-lock-alert::before{content:"\F08EE"}.mdi-lock-alert-outline::before{content:"\F15D1"}.mdi-lock-check::before{content:"\F139A"}.mdi-lock-check-outline::before{content:"\F16A8"}.mdi-lock-clock::before{content:"\F097F"}.mdi-lock-minus::before{content:"\F16A9"}.mdi-lock-minus-outline::before{content:"\F16AA"}.mdi-lock-off::before{content:"\F1671"}.mdi-lock-off-outline::before{content:"\F1672"}.mdi-lock-open::before{content:"\F033F"}.mdi-lock-open-alert::before{content:"\F139B"}.mdi-lock-open-alert-outline::before{content:"\F15D2"}.mdi-lock-open-check::before{content:"\F139C"}.mdi-lock-open-check-outline::before{content:"\F16AB"}.mdi-lock-open-minus::before{content:"\F16AC"}.mdi-lock-open-minus-outline::before{content:"\F16AD"}.mdi-lock-open-outline::before{content:"\F0340"}.mdi-lock-open-plus::before{content:"\F16AE"}.mdi-lock-open-plus-outline::before{content:"\F16AF"}.mdi-lock-open-remove::before{content:"\F16B0"}.mdi-lock-open-remove-outline::before{content:"\F16B1"}.mdi-lock-open-variant::before{content:"\F0FC6"}.mdi-lock-open-variant-outline::before{content:"\F0FC7"}.mdi-lock-outline::before{content:"\F0341"}.mdi-lock-pattern::before{content:"\F06EA"}.mdi-lock-percent::before{content:"\F1C12"}.mdi-lock-percent-open::before{content:"\F1C13"}.mdi-lock-percent-open-outline::before{content:"\F1C14"}.mdi-lock-percent-open-variant::before{content:"\F1C15"}.mdi-lock-percent-open-variant-outline::before{content:"\F1C16"}.mdi-lock-percent-outline::before{content:"\F1C17"}.mdi-lock-plus::before{content:"\F05FB"}.mdi-lock-plus-outline::before{content:"\F16B2"}.mdi-lock-question::before{content:"\F08EF"}.mdi-lock-remove::before{content:"\F16B3"}.mdi-lock-remove-outline::before{content:"\F16B4"}.mdi-lock-reset::before{content:"\F0773"}.mdi-lock-smart::before{content:"\F08B2"}.mdi-locker::before{content:"\F07D7"}.mdi-locker-multiple::before{content:"\F07D8"}.mdi-login::before{content:"\F0342"}.mdi-login-variant::before{content:"\F05FC"}.mdi-logout::before{content:"\F0343"}.mdi-logout-variant::before{content:"\F05FD"}.mdi-longitude::before{content:"\F0F5A"}.mdi-looks::before{content:"\F0344"}.mdi-lotion::before{content:"\F1582"}.mdi-lotion-outline::before{content:"\F1583"}.mdi-lotion-plus::before{content:"\F1584"}.mdi-lotion-plus-outline::before{content:"\F1585"}.mdi-loupe::before{content:"\F0345"}.mdi-lumx::before{content:"\F0346"}.mdi-lungs::before{content:"\F1084"}.mdi-mace::before{content:"\F1843"}.mdi-magazine-pistol::before{content:"\F0324"}.mdi-magazine-rifle::before{content:"\F0323"}.mdi-magic-staff::before{content:"\F1844"}.mdi-magnet::before{content:"\F0347"}.mdi-magnet-on::before{content:"\F0348"}.mdi-magnify::before{content:"\F0349"}.mdi-magnify-close::before{content:"\F0980"}.mdi-magnify-expand::before{content:"\F1874"}.mdi-magnify-minus::before{content:"\F034A"}.mdi-magnify-minus-cursor::before{content:"\F0A62"}.mdi-magnify-minus-outline::before{content:"\F06EC"}.mdi-magnify-plus::before{content:"\F034B"}.mdi-magnify-plus-cursor::before{content:"\F0A63"}.mdi-magnify-plus-outline::before{content:"\F06ED"}.mdi-magnify-remove-cursor::before{content:"\F120C"}.mdi-magnify-remove-outline::before{content:"\F120D"}.mdi-magnify-scan::before{content:"\F1276"}.mdi-mail::before{content:"\F0EBB"}.mdi-mailbox::before{content:"\F06EE"}.mdi-mailbox-open::before{content:"\F0D88"}.mdi-mailbox-open-outline::before{content:"\F0D89"}.mdi-mailbox-open-up::before{content:"\F0D8A"}.mdi-mailbox-open-up-outline::before{content:"\F0D8B"}.mdi-mailbox-outline::before{content:"\F0D8C"}.mdi-mailbox-up::before{content:"\F0D8D"}.mdi-mailbox-up-outline::before{content:"\F0D8E"}.mdi-manjaro::before{content:"\F160A"}.mdi-map::before{content:"\F034D"}.mdi-map-check::before{content:"\F0EBC"}.mdi-map-check-outline::before{content:"\F0EBD"}.mdi-map-clock::before{content:"\F0D1E"}.mdi-map-clock-outline::before{content:"\F0D1F"}.mdi-map-legend::before{content:"\F0A01"}.mdi-map-marker::before{content:"\F034E"}.mdi-map-marker-account::before{content:"\F18E3"}.mdi-map-marker-account-outline::before{content:"\F18E4"}.mdi-map-marker-alert::before{content:"\F0F05"}.mdi-map-marker-alert-outline::before{content:"\F0F06"}.mdi-map-marker-check::before{content:"\F0C95"}.mdi-map-marker-check-outline::before{content:"\F12FB"}.mdi-map-marker-circle::before{content:"\F034F"}.mdi-map-marker-distance::before{content:"\F08F0"}.mdi-map-marker-down::before{content:"\F1102"}.mdi-map-marker-left::before{content:"\F12DB"}.mdi-map-marker-left-outline::before{content:"\F12DD"}.mdi-map-marker-minus::before{content:"\F0650"}.mdi-map-marker-minus-outline::before{content:"\F12F9"}.mdi-map-marker-multiple::before{content:"\F0350"}.mdi-map-marker-multiple-outline::before{content:"\F1277"}.mdi-map-marker-off::before{content:"\F0351"}.mdi-map-marker-off-outline::before{content:"\F12FD"}.mdi-map-marker-outline::before{content:"\F07D9"}.mdi-map-marker-path::before{content:"\F0D20"}.mdi-map-marker-plus::before{content:"\F0651"}.mdi-map-marker-plus-outline::before{content:"\F12F8"}.mdi-map-marker-question::before{content:"\F0F07"}.mdi-map-marker-question-outline::before{content:"\F0F08"}.mdi-map-marker-radius::before{content:"\F0352"}.mdi-map-marker-radius-outline::before{content:"\F12FC"}.mdi-map-marker-remove::before{content:"\F0F09"}.mdi-map-marker-remove-outline::before{content:"\F12FA"}.mdi-map-marker-remove-variant::before{content:"\F0F0A"}.mdi-map-marker-right::before{content:"\F12DC"}.mdi-map-marker-right-outline::before{content:"\F12DE"}.mdi-map-marker-star::before{content:"\F1608"}.mdi-map-marker-star-outline::before{content:"\F1609"}.mdi-map-marker-up::before{content:"\F1103"}.mdi-map-minus::before{content:"\F0981"}.mdi-map-outline::before{content:"\F0982"}.mdi-map-plus::before{content:"\F0983"}.mdi-map-search::before{content:"\F0984"}.mdi-map-search-outline::before{content:"\F0985"}.mdi-mapbox::before{content:"\F0BAA"}.mdi-margin::before{content:"\F0353"}.mdi-marker::before{content:"\F0652"}.mdi-marker-cancel::before{content:"\F0DD9"}.mdi-marker-check::before{content:"\F0355"}.mdi-mastodon::before{content:"\F0AD1"}.mdi-material-design::before{content:"\F0986"}.mdi-material-ui::before{content:"\F0357"}.mdi-math-compass::before{content:"\F0358"}.mdi-math-cos::before{content:"\F0C96"}.mdi-math-integral::before{content:"\F0FC8"}.mdi-math-integral-box::before{content:"\F0FC9"}.mdi-math-log::before{content:"\F1085"}.mdi-math-norm::before{content:"\F0FCA"}.mdi-math-norm-box::before{content:"\F0FCB"}.mdi-math-sin::before{content:"\F0C97"}.mdi-math-tan::before{content:"\F0C98"}.mdi-matrix::before{content:"\F0628"}.mdi-medal::before{content:"\F0987"}.mdi-medal-outline::before{content:"\F1326"}.mdi-medical-bag::before{content:"\F06EF"}.mdi-medical-cotton-swab::before{content:"\F1AB8"}.mdi-medication::before{content:"\F1B14"}.mdi-medication-outline::before{content:"\F1B15"}.mdi-meditation::before{content:"\F117B"}.mdi-memory::before{content:"\F035B"}.mdi-memory-arrow-down::before{content:"\F1CA6"}.mdi-menorah::before{content:"\F17D4"}.mdi-menorah-fire::before{content:"\F17D5"}.mdi-menu::before{content:"\F035C"}.mdi-menu-close::before{content:"\F1C90"}.mdi-menu-down::before{content:"\F035D"}.mdi-menu-down-outline::before{content:"\F06B6"}.mdi-menu-left::before{content:"\F035E"}.mdi-menu-left-outline::before{content:"\F0A02"}.mdi-menu-open::before{content:"\F0BAB"}.mdi-menu-right::before{content:"\F035F"}.mdi-menu-right-outline::before{content:"\F0A03"}.mdi-menu-swap::before{content:"\F0A64"}.mdi-menu-swap-outline::before{content:"\F0A65"}.mdi-menu-up::before{content:"\F0360"}.mdi-menu-up-outline::before{content:"\F06B7"}.mdi-merge::before{content:"\F0F5C"}.mdi-message::before{content:"\F0361"}.mdi-message-alert::before{content:"\F0362"}.mdi-message-alert-outline::before{content:"\F0A04"}.mdi-message-arrow-left::before{content:"\F12F2"}.mdi-message-arrow-left-outline::before{content:"\F12F3"}.mdi-message-arrow-right::before{content:"\F12F4"}.mdi-message-arrow-right-outline::before{content:"\F12F5"}.mdi-message-badge::before{content:"\F1941"}.mdi-message-badge-outline::before{content:"\F1942"}.mdi-message-bookmark::before{content:"\F15AC"}.mdi-message-bookmark-outline::before{content:"\F15AD"}.mdi-message-bulleted::before{content:"\F06A2"}.mdi-message-bulleted-off::before{content:"\F06A3"}.mdi-message-check::before{content:"\F1B8A"}.mdi-message-check-outline::before{content:"\F1B8B"}.mdi-message-cog::before{content:"\F06F1"}.mdi-message-cog-outline::before{content:"\F1172"}.mdi-message-draw::before{content:"\F0363"}.mdi-message-fast::before{content:"\F19CC"}.mdi-message-fast-outline::before{content:"\F19CD"}.mdi-message-flash::before{content:"\F15A9"}.mdi-message-flash-outline::before{content:"\F15AA"}.mdi-message-image::before{content:"\F0364"}.mdi-message-image-outline::before{content:"\F116C"}.mdi-message-lock::before{content:"\F0FCC"}.mdi-message-lock-outline::before{content:"\F116D"}.mdi-message-minus::before{content:"\F116E"}.mdi-message-minus-outline::before{content:"\F116F"}.mdi-message-off::before{content:"\F164D"}.mdi-message-off-outline::before{content:"\F164E"}.mdi-message-outline::before{content:"\F0365"}.mdi-message-plus::before{content:"\F0653"}.mdi-message-plus-outline::before{content:"\F10BB"}.mdi-message-processing::before{content:"\F0366"}.mdi-message-processing-outline::before{content:"\F1170"}.mdi-message-question::before{content:"\F173A"}.mdi-message-question-outline::before{content:"\F173B"}.mdi-message-reply::before{content:"\F0367"}.mdi-message-reply-outline::before{content:"\F173D"}.mdi-message-reply-text::before{content:"\F0368"}.mdi-message-reply-text-outline::before{content:"\F173E"}.mdi-message-settings::before{content:"\F06F0"}.mdi-message-settings-outline::before{content:"\F1171"}.mdi-message-star::before{content:"\F069A"}.mdi-message-star-outline::before{content:"\F1250"}.mdi-message-text::before{content:"\F0369"}.mdi-message-text-clock::before{content:"\F1173"}.mdi-message-text-clock-outline::before{content:"\F1174"}.mdi-message-text-fast::before{content:"\F19CE"}.mdi-message-text-fast-outline::before{content:"\F19CF"}.mdi-message-text-lock::before{content:"\F0FCD"}.mdi-message-text-lock-outline::before{content:"\F1175"}.mdi-message-text-outline::before{content:"\F036A"}.mdi-message-video::before{content:"\F036B"}.mdi-meteor::before{content:"\F0629"}.mdi-meter-electric::before{content:"\F1A57"}.mdi-meter-electric-outline::before{content:"\F1A58"}.mdi-meter-gas::before{content:"\F1A59"}.mdi-meter-gas-outline::before{content:"\F1A5A"}.mdi-metronome::before{content:"\F07DA"}.mdi-metronome-tick::before{content:"\F07DB"}.mdi-micro-sd::before{content:"\F07DC"}.mdi-microphone::before{content:"\F036C"}.mdi-microphone-message::before{content:"\F050A"}.mdi-microphone-message-off::before{content:"\F050B"}.mdi-microphone-minus::before{content:"\F08B3"}.mdi-microphone-off::before{content:"\F036D"}.mdi-microphone-outline::before{content:"\F036E"}.mdi-microphone-plus::before{content:"\F08B4"}.mdi-microphone-question::before{content:"\F1989"}.mdi-microphone-question-outline::before{content:"\F198A"}.mdi-microphone-settings::before{content:"\F036F"}.mdi-microphone-variant::before{content:"\F0370"}.mdi-microphone-variant-off::before{content:"\F0371"}.mdi-microscope::before{content:"\F0654"}.mdi-microsoft::before{content:"\F0372"}.mdi-microsoft-access::before{content:"\F138E"}.mdi-microsoft-azure::before{content:"\F0805"}.mdi-microsoft-azure-devops::before{content:"\F0FD5"}.mdi-microsoft-bing::before{content:"\F00A4"}.mdi-microsoft-dynamics-365::before{content:"\F0988"}.mdi-microsoft-edge::before{content:"\F01E9"}.mdi-microsoft-excel::before{content:"\F138F"}.mdi-microsoft-internet-explorer::before{content:"\F0300"}.mdi-microsoft-office::before{content:"\F03C6"}.mdi-microsoft-onedrive::before{content:"\F03CA"}.mdi-microsoft-onenote::before{content:"\F0747"}.mdi-microsoft-outlook::before{content:"\F0D22"}.mdi-microsoft-powerpoint::before{content:"\F1390"}.mdi-microsoft-sharepoint::before{content:"\F1391"}.mdi-microsoft-teams::before{content:"\F02BB"}.mdi-microsoft-visual-studio::before{content:"\F0610"}.mdi-microsoft-visual-studio-code::before{content:"\F0A1E"}.mdi-microsoft-windows::before{content:"\F05B3"}.mdi-microsoft-windows-classic::before{content:"\F0A21"}.mdi-microsoft-word::before{content:"\F1392"}.mdi-microsoft-xbox::before{content:"\F05B9"}.mdi-microsoft-xbox-controller::before{content:"\F05BA"}.mdi-microsoft-xbox-controller-battery-alert::before{content:"\F074B"}.mdi-microsoft-xbox-controller-battery-charging::before{content:"\F0A22"}.mdi-microsoft-xbox-controller-battery-empty::before{content:"\F074C"}.mdi-microsoft-xbox-controller-battery-full::before{content:"\F074D"}.mdi-microsoft-xbox-controller-battery-low::before{content:"\F074E"}.mdi-microsoft-xbox-controller-battery-medium::before{content:"\F074F"}.mdi-microsoft-xbox-controller-battery-unknown::before{content:"\F0750"}.mdi-microsoft-xbox-controller-menu::before{content:"\F0E6F"}.mdi-microsoft-xbox-controller-off::before{content:"\F05BB"}.mdi-microsoft-xbox-controller-view::before{content:"\F0E70"}.mdi-microwave::before{content:"\F0C99"}.mdi-microwave-off::before{content:"\F1423"}.mdi-middleware::before{content:"\F0F5D"}.mdi-middleware-outline::before{content:"\F0F5E"}.mdi-midi::before{content:"\F08F1"}.mdi-midi-port::before{content:"\F08F2"}.mdi-mine::before{content:"\F0DDA"}.mdi-minecraft::before{content:"\F0373"}.mdi-mini-sd::before{content:"\F0A05"}.mdi-minidisc::before{content:"\F0A06"}.mdi-minus::before{content:"\F0374"}.mdi-minus-box::before{content:"\F0375"}.mdi-minus-box-multiple::before{content:"\F1141"}.mdi-minus-box-multiple-outline::before{content:"\F1142"}.mdi-minus-box-outline::before{content:"\F06F2"}.mdi-minus-circle::before{content:"\F0376"}.mdi-minus-circle-multiple::before{content:"\F035A"}.mdi-minus-circle-multiple-outline::before{content:"\F0AD3"}.mdi-minus-circle-off::before{content:"\F1459"}.mdi-minus-circle-off-outline::before{content:"\F145A"}.mdi-minus-circle-outline::before{content:"\F0377"}.mdi-minus-network::before{content:"\F0378"}.mdi-minus-network-outline::before{content:"\F0C9A"}.mdi-minus-thick::before{content:"\F1639"}.mdi-mirror::before{content:"\F11FD"}.mdi-mirror-rectangle::before{content:"\F179F"}.mdi-mirror-variant::before{content:"\F17A0"}.mdi-mixed-martial-arts::before{content:"\F0D8F"}.mdi-mixed-reality::before{content:"\F087F"}.mdi-molecule::before{content:"\F0BAC"}.mdi-molecule-co::before{content:"\F12FE"}.mdi-molecule-co2::before{content:"\F07E4"}.mdi-monitor::before{content:"\F0379"}.mdi-monitor-account::before{content:"\F1A5B"}.mdi-monitor-arrow-down::before{content:"\F19D0"}.mdi-monitor-arrow-down-variant::before{content:"\F19D1"}.mdi-monitor-cellphone::before{content:"\F0989"}.mdi-monitor-cellphone-star::before{content:"\F098A"}.mdi-monitor-dashboard::before{content:"\F0A07"}.mdi-monitor-edit::before{content:"\F12C6"}.mdi-monitor-eye::before{content:"\F13B4"}.mdi-monitor-lock::before{content:"\F0DDB"}.mdi-monitor-multiple::before{content:"\F037A"}.mdi-monitor-off::before{content:"\F0D90"}.mdi-monitor-screenshot::before{content:"\F0E51"}.mdi-monitor-share::before{content:"\F1483"}.mdi-monitor-shimmer::before{content:"\F1104"}.mdi-monitor-small::before{content:"\F1876"}.mdi-monitor-speaker::before{content:"\F0F5F"}.mdi-monitor-speaker-off::before{content:"\F0F60"}.mdi-monitor-star::before{content:"\F0DDC"}.mdi-monitor-vertical::before{content:"\F1C33"}.mdi-moon-first-quarter::before{content:"\F0F61"}.mdi-moon-full::before{content:"\F0F62"}.mdi-moon-last-quarter::before{content:"\F0F63"}.mdi-moon-new::before{content:"\F0F64"}.mdi-moon-waning-crescent::before{content:"\F0F65"}.mdi-moon-waning-gibbous::before{content:"\F0F66"}.mdi-moon-waxing-crescent::before{content:"\F0F67"}.mdi-moon-waxing-gibbous::before{content:"\F0F68"}.mdi-moped::before{content:"\F1086"}.mdi-moped-electric::before{content:"\F15B7"}.mdi-moped-electric-outline::before{content:"\F15B8"}.mdi-moped-outline::before{content:"\F15B9"}.mdi-more::before{content:"\F037B"}.mdi-mortar-pestle::before{content:"\F1748"}.mdi-mortar-pestle-plus::before{content:"\F03F1"}.mdi-mosque::before{content:"\F0D45"}.mdi-mosque-outline::before{content:"\F1827"}.mdi-mother-heart::before{content:"\F1314"}.mdi-mother-nurse::before{content:"\F0D21"}.mdi-motion::before{content:"\F15B2"}.mdi-motion-outline::before{content:"\F15B3"}.mdi-motion-pause::before{content:"\F1590"}.mdi-motion-pause-outline::before{content:"\F1592"}.mdi-motion-play::before{content:"\F158F"}.mdi-motion-play-outline::before{content:"\F1591"}.mdi-motion-sensor::before{content:"\F0D91"}.mdi-motion-sensor-off::before{content:"\F1435"}.mdi-motorbike::before{content:"\F037C"}.mdi-motorbike-electric::before{content:"\F15BA"}.mdi-motorbike-off::before{content:"\F1B16"}.mdi-mouse::before{content:"\F037D"}.mdi-mouse-bluetooth::before{content:"\F098B"}.mdi-mouse-left-click::before{content:"\F1D07"}.mdi-mouse-left-click-outline::before{content:"\F1D08"}.mdi-mouse-move-down::before{content:"\F1550"}.mdi-mouse-move-up::before{content:"\F1551"}.mdi-mouse-move-vertical::before{content:"\F1552"}.mdi-mouse-off::before{content:"\F037E"}.mdi-mouse-outline::before{content:"\F1D09"}.mdi-mouse-right-click::before{content:"\F1D0A"}.mdi-mouse-right-click-outline::before{content:"\F1D0B"}.mdi-mouse-scroll-wheel::before{content:"\F1D0C"}.mdi-mouse-variant::before{content:"\F037F"}.mdi-mouse-variant-off::before{content:"\F0380"}.mdi-move-resize::before{content:"\F0655"}.mdi-move-resize-variant::before{content:"\F0656"}.mdi-movie::before{content:"\F0381"}.mdi-movie-check::before{content:"\F16F3"}.mdi-movie-check-outline::before{content:"\F16F4"}.mdi-movie-cog::before{content:"\F16F5"}.mdi-movie-cog-outline::before{content:"\F16F6"}.mdi-movie-edit::before{content:"\F1122"}.mdi-movie-edit-outline::before{content:"\F1123"}.mdi-movie-filter::before{content:"\F1124"}.mdi-movie-filter-outline::before{content:"\F1125"}.mdi-movie-minus::before{content:"\F16F7"}.mdi-movie-minus-outline::before{content:"\F16F8"}.mdi-movie-off::before{content:"\F16F9"}.mdi-movie-off-outline::before{content:"\F16FA"}.mdi-movie-open::before{content:"\F0FCE"}.mdi-movie-open-check::before{content:"\F16FB"}.mdi-movie-open-check-outline::before{content:"\F16FC"}.mdi-movie-open-cog::before{content:"\F16FD"}.mdi-movie-open-cog-outline::before{content:"\F16FE"}.mdi-movie-open-edit::before{content:"\F16FF"}.mdi-movie-open-edit-outline::before{content:"\F1700"}.mdi-movie-open-minus::before{content:"\F1701"}.mdi-movie-open-minus-outline::before{content:"\F1702"}.mdi-movie-open-off::before{content:"\F1703"}.mdi-movie-open-off-outline::before{content:"\F1704"}.mdi-movie-open-outline::before{content:"\F0FCF"}.mdi-movie-open-play::before{content:"\F1705"}.mdi-movie-open-play-outline::before{content:"\F1706"}.mdi-movie-open-plus::before{content:"\F1707"}.mdi-movie-open-plus-outline::before{content:"\F1708"}.mdi-movie-open-remove::before{content:"\F1709"}.mdi-movie-open-remove-outline::before{content:"\F170A"}.mdi-movie-open-settings::before{content:"\F170B"}.mdi-movie-open-settings-outline::before{content:"\F170C"}.mdi-movie-open-star::before{content:"\F170D"}.mdi-movie-open-star-outline::before{content:"\F170E"}.mdi-movie-outline::before{content:"\F0DDD"}.mdi-movie-play::before{content:"\F170F"}.mdi-movie-play-outline::before{content:"\F1710"}.mdi-movie-plus::before{content:"\F1711"}.mdi-movie-plus-outline::before{content:"\F1712"}.mdi-movie-remove::before{content:"\F1713"}.mdi-movie-remove-outline::before{content:"\F1714"}.mdi-movie-roll::before{content:"\F07DE"}.mdi-movie-search::before{content:"\F11D2"}.mdi-movie-search-outline::before{content:"\F11D3"}.mdi-movie-settings::before{content:"\F1715"}.mdi-movie-settings-outline::before{content:"\F1716"}.mdi-movie-star::before{content:"\F1717"}.mdi-movie-star-outline::before{content:"\F1718"}.mdi-mower::before{content:"\F166F"}.mdi-mower-bag::before{content:"\F1670"}.mdi-mower-bag-on::before{content:"\F1B60"}.mdi-mower-on::before{content:"\F1B5F"}.mdi-muffin::before{content:"\F098C"}.mdi-multicast::before{content:"\F1893"}.mdi-multimedia::before{content:"\F1B97"}.mdi-multiplication::before{content:"\F0382"}.mdi-multiplication-box::before{content:"\F0383"}.mdi-mushroom::before{content:"\F07DF"}.mdi-mushroom-off::before{content:"\F13FA"}.mdi-mushroom-off-outline::before{content:"\F13FB"}.mdi-mushroom-outline::before{content:"\F07E0"}.mdi-music::before{content:"\F075A"}.mdi-music-accidental-double-flat::before{content:"\F0F69"}.mdi-music-accidental-double-sharp::before{content:"\F0F6A"}.mdi-music-accidental-flat::before{content:"\F0F6B"}.mdi-music-accidental-natural::before{content:"\F0F6C"}.mdi-music-accidental-sharp::before{content:"\F0F6D"}.mdi-music-box::before{content:"\F0384"}.mdi-music-box-multiple::before{content:"\F0333"}.mdi-music-box-multiple-outline::before{content:"\F0F04"}.mdi-music-box-outline::before{content:"\F0385"}.mdi-music-circle::before{content:"\F0386"}.mdi-music-circle-outline::before{content:"\F0AD4"}.mdi-music-clef-alto::before{content:"\F0F6E"}.mdi-music-clef-bass::before{content:"\F0F6F"}.mdi-music-clef-treble::before{content:"\F0F70"}.mdi-music-note::before{content:"\F0387"}.mdi-music-note-bluetooth::before{content:"\F05FE"}.mdi-music-note-bluetooth-off::before{content:"\F05FF"}.mdi-music-note-eighth::before{content:"\F0388"}.mdi-music-note-eighth-dotted::before{content:"\F0F71"}.mdi-music-note-half::before{content:"\F0389"}.mdi-music-note-half-dotted::before{content:"\F0F72"}.mdi-music-note-minus::before{content:"\F1B89"}.mdi-music-note-off::before{content:"\F038A"}.mdi-music-note-off-outline::before{content:"\F0F73"}.mdi-music-note-outline::before{content:"\F0F74"}.mdi-music-note-plus::before{content:"\F0DDE"}.mdi-music-note-quarter::before{content:"\F038B"}.mdi-music-note-quarter-dotted::before{content:"\F0F75"}.mdi-music-note-sixteenth::before{content:"\F038C"}.mdi-music-note-sixteenth-dotted::before{content:"\F0F76"}.mdi-music-note-whole::before{content:"\F038D"}.mdi-music-note-whole-dotted::before{content:"\F0F77"}.mdi-music-off::before{content:"\F075B"}.mdi-music-rest-eighth::before{content:"\F0F78"}.mdi-music-rest-half::before{content:"\F0F79"}.mdi-music-rest-quarter::before{content:"\F0F7A"}.mdi-music-rest-sixteenth::before{content:"\F0F7B"}.mdi-music-rest-whole::before{content:"\F0F7C"}.mdi-mustache::before{content:"\F15DE"}.mdi-nail::before{content:"\F0DDF"}.mdi-nas::before{content:"\F08F3"}.mdi-nativescript::before{content:"\F0880"}.mdi-nature::before{content:"\F038E"}.mdi-nature-outline::before{content:"\F1C71"}.mdi-nature-people::before{content:"\F038F"}.mdi-nature-people-outline::before{content:"\F1C72"}.mdi-navigation::before{content:"\F0390"}.mdi-navigation-outline::before{content:"\F1607"}.mdi-navigation-variant::before{content:"\F18F0"}.mdi-navigation-variant-outline::before{content:"\F18F1"}.mdi-near-me::before{content:"\F05CD"}.mdi-necklace::before{content:"\F0F0B"}.mdi-needle::before{content:"\F0391"}.mdi-needle-off::before{content:"\F19D2"}.mdi-netflix::before{content:"\F0746"}.mdi-network::before{content:"\F06F3"}.mdi-network-off::before{content:"\F0C9B"}.mdi-network-off-outline::before{content:"\F0C9C"}.mdi-network-outline::before{content:"\F0C9D"}.mdi-network-pos::before{content:"\F1ACB"}.mdi-network-strength-1::before{content:"\F08F4"}.mdi-network-strength-1-alert::before{content:"\F08F5"}.mdi-network-strength-2::before{content:"\F08F6"}.mdi-network-strength-2-alert::before{content:"\F08F7"}.mdi-network-strength-3::before{content:"\F08F8"}.mdi-network-strength-3-alert::before{content:"\F08F9"}.mdi-network-strength-4::before{content:"\F08FA"}.mdi-network-strength-4-alert::before{content:"\F08FB"}.mdi-network-strength-4-cog::before{content:"\F191A"}.mdi-network-strength-off::before{content:"\F08FC"}.mdi-network-strength-off-outline::before{content:"\F08FD"}.mdi-network-strength-outline::before{content:"\F08FE"}.mdi-new-box::before{content:"\F0394"}.mdi-newspaper::before{content:"\F0395"}.mdi-newspaper-check::before{content:"\F1943"}.mdi-newspaper-minus::before{content:"\F0F0C"}.mdi-newspaper-plus::before{content:"\F0F0D"}.mdi-newspaper-remove::before{content:"\F1944"}.mdi-newspaper-variant::before{content:"\F1001"}.mdi-newspaper-variant-multiple::before{content:"\F1002"}.mdi-newspaper-variant-multiple-outline::before{content:"\F1003"}.mdi-newspaper-variant-outline::before{content:"\F1004"}.mdi-nfc::before{content:"\F0396"}.mdi-nfc-search-variant::before{content:"\F0E53"}.mdi-nfc-tap::before{content:"\F0397"}.mdi-nfc-variant::before{content:"\F0398"}.mdi-nfc-variant-off::before{content:"\F0E54"}.mdi-ninja::before{content:"\F0774"}.mdi-nintendo-game-boy::before{content:"\F1393"}.mdi-nintendo-switch::before{content:"\F07E1"}.mdi-nintendo-wii::before{content:"\F05AB"}.mdi-nintendo-wiiu::before{content:"\F072D"}.mdi-nix::before{content:"\F1105"}.mdi-nodejs::before{content:"\F0399"}.mdi-noodles::before{content:"\F117E"}.mdi-not-equal::before{content:"\F098D"}.mdi-not-equal-variant::before{content:"\F098E"}.mdi-note::before{content:"\F039A"}.mdi-note-alert::before{content:"\F177D"}.mdi-note-alert-outline::before{content:"\F177E"}.mdi-note-check::before{content:"\F177F"}.mdi-note-check-outline::before{content:"\F1780"}.mdi-note-edit::before{content:"\F1781"}.mdi-note-edit-outline::before{content:"\F1782"}.mdi-note-minus::before{content:"\F164F"}.mdi-note-minus-outline::before{content:"\F1650"}.mdi-note-multiple::before{content:"\F06B8"}.mdi-note-multiple-outline::before{content:"\F06B9"}.mdi-note-off::before{content:"\F1783"}.mdi-note-off-outline::before{content:"\F1784"}.mdi-note-outline::before{content:"\F039B"}.mdi-note-plus::before{content:"\F039C"}.mdi-note-plus-outline::before{content:"\F039D"}.mdi-note-remove::before{content:"\F1651"}.mdi-note-remove-outline::before{content:"\F1652"}.mdi-note-search::before{content:"\F1653"}.mdi-note-search-outline::before{content:"\F1654"}.mdi-note-text::before{content:"\F039E"}.mdi-note-text-outline::before{content:"\F11D7"}.mdi-notebook::before{content:"\F082E"}.mdi-notebook-check::before{content:"\F14F5"}.mdi-notebook-check-outline::before{content:"\F14F6"}.mdi-notebook-edit::before{content:"\F14E7"}.mdi-notebook-edit-outline::before{content:"\F14E9"}.mdi-notebook-heart::before{content:"\F1A0B"}.mdi-notebook-heart-outline::before{content:"\F1A0C"}.mdi-notebook-minus::before{content:"\F1610"}.mdi-notebook-minus-outline::before{content:"\F1611"}.mdi-notebook-multiple::before{content:"\F0E55"}.mdi-notebook-outline::before{content:"\F0EBF"}.mdi-notebook-plus::before{content:"\F1612"}.mdi-notebook-plus-outline::before{content:"\F1613"}.mdi-notebook-remove::before{content:"\F1614"}.mdi-notebook-remove-outline::before{content:"\F1615"}.mdi-notification-clear-all::before{content:"\F039F"}.mdi-npm::before{content:"\F06F7"}.mdi-nuke::before{content:"\F06A4"}.mdi-null::before{content:"\F07E2"}.mdi-numeric::before{content:"\F03A0"}.mdi-numeric-0::before{content:"\F0B39"}.mdi-numeric-0-box::before{content:"\F03A1"}.mdi-numeric-0-box-multiple::before{content:"\F0F0E"}.mdi-numeric-0-box-multiple-outline::before{content:"\F03A2"}.mdi-numeric-0-box-outline::before{content:"\F03A3"}.mdi-numeric-0-circle::before{content:"\F0C9E"}.mdi-numeric-0-circle-outline::before{content:"\F0C9F"}.mdi-numeric-1::before{content:"\F0B3A"}.mdi-numeric-1-box::before{content:"\F03A4"}.mdi-numeric-1-box-multiple::before{content:"\F0F0F"}.mdi-numeric-1-box-multiple-outline::before{content:"\F03A5"}.mdi-numeric-1-box-outline::before{content:"\F03A6"}.mdi-numeric-1-circle::before{content:"\F0CA0"}.mdi-numeric-1-circle-outline::before{content:"\F0CA1"}.mdi-numeric-10::before{content:"\F0FE9"}.mdi-numeric-10-box::before{content:"\F0F7D"}.mdi-numeric-10-box-multiple::before{content:"\F0FEA"}.mdi-numeric-10-box-multiple-outline::before{content:"\F0FEB"}.mdi-numeric-10-box-outline::before{content:"\F0F7E"}.mdi-numeric-10-circle::before{content:"\F0FEC"}.mdi-numeric-10-circle-outline::before{content:"\F0FED"}.mdi-numeric-2::before{content:"\F0B3B"}.mdi-numeric-2-box::before{content:"\F03A7"}.mdi-numeric-2-box-multiple::before{content:"\F0F10"}.mdi-numeric-2-box-multiple-outline::before{content:"\F03A8"}.mdi-numeric-2-box-outline::before{content:"\F03A9"}.mdi-numeric-2-circle::before{content:"\F0CA2"}.mdi-numeric-2-circle-outline::before{content:"\F0CA3"}.mdi-numeric-3::before{content:"\F0B3C"}.mdi-numeric-3-box::before{content:"\F03AA"}.mdi-numeric-3-box-multiple::before{content:"\F0F11"}.mdi-numeric-3-box-multiple-outline::before{content:"\F03AB"}.mdi-numeric-3-box-outline::before{content:"\F03AC"}.mdi-numeric-3-circle::before{content:"\F0CA4"}.mdi-numeric-3-circle-outline::before{content:"\F0CA5"}.mdi-numeric-4::before{content:"\F0B3D"}.mdi-numeric-4-box::before{content:"\F03AD"}.mdi-numeric-4-box-multiple::before{content:"\F0F12"}.mdi-numeric-4-box-multiple-outline::before{content:"\F03B2"}.mdi-numeric-4-box-outline::before{content:"\F03AE"}.mdi-numeric-4-circle::before{content:"\F0CA6"}.mdi-numeric-4-circle-outline::before{content:"\F0CA7"}.mdi-numeric-5::before{content:"\F0B3E"}.mdi-numeric-5-box::before{content:"\F03B1"}.mdi-numeric-5-box-multiple::before{content:"\F0F13"}.mdi-numeric-5-box-multiple-outline::before{content:"\F03AF"}.mdi-numeric-5-box-outline::before{content:"\F03B0"}.mdi-numeric-5-circle::before{content:"\F0CA8"}.mdi-numeric-5-circle-outline::before{content:"\F0CA9"}.mdi-numeric-6::before{content:"\F0B3F"}.mdi-numeric-6-box::before{content:"\F03B3"}.mdi-numeric-6-box-multiple::before{content:"\F0F14"}.mdi-numeric-6-box-multiple-outline::before{content:"\F03B4"}.mdi-numeric-6-box-outline::before{content:"\F03B5"}.mdi-numeric-6-circle::before{content:"\F0CAA"}.mdi-numeric-6-circle-outline::before{content:"\F0CAB"}.mdi-numeric-7::before{content:"\F0B40"}.mdi-numeric-7-box::before{content:"\F03B6"}.mdi-numeric-7-box-multiple::before{content:"\F0F15"}.mdi-numeric-7-box-multiple-outline::before{content:"\F03B7"}.mdi-numeric-7-box-outline::before{content:"\F03B8"}.mdi-numeric-7-circle::before{content:"\F0CAC"}.mdi-numeric-7-circle-outline::before{content:"\F0CAD"}.mdi-numeric-8::before{content:"\F0B41"}.mdi-numeric-8-box::before{content:"\F03B9"}.mdi-numeric-8-box-multiple::before{content:"\F0F16"}.mdi-numeric-8-box-multiple-outline::before{content:"\F03BA"}.mdi-numeric-8-box-outline::before{content:"\F03BB"}.mdi-numeric-8-circle::before{content:"\F0CAE"}.mdi-numeric-8-circle-outline::before{content:"\F0CAF"}.mdi-numeric-9::before{content:"\F0B42"}.mdi-numeric-9-box::before{content:"\F03BC"}.mdi-numeric-9-box-multiple::before{content:"\F0F17"}.mdi-numeric-9-box-multiple-outline::before{content:"\F03BD"}.mdi-numeric-9-box-outline::before{content:"\F03BE"}.mdi-numeric-9-circle::before{content:"\F0CB0"}.mdi-numeric-9-circle-outline::before{content:"\F0CB1"}.mdi-numeric-9-plus::before{content:"\F0FEE"}.mdi-numeric-9-plus-box::before{content:"\F03BF"}.mdi-numeric-9-plus-box-multiple::before{content:"\F0F18"}.mdi-numeric-9-plus-box-multiple-outline::before{content:"\F03C0"}.mdi-numeric-9-plus-box-outline::before{content:"\F03C1"}.mdi-numeric-9-plus-circle::before{content:"\F0CB2"}.mdi-numeric-9-plus-circle-outline::before{content:"\F0CB3"}.mdi-numeric-negative-1::before{content:"\F1052"}.mdi-numeric-off::before{content:"\F19D3"}.mdi-numeric-positive-1::before{content:"\F15CB"}.mdi-nut::before{content:"\F06F8"}.mdi-nutrition::before{content:"\F03C2"}.mdi-nuxt::before{content:"\F1106"}.mdi-oar::before{content:"\F067C"}.mdi-ocarina::before{content:"\F0DE0"}.mdi-oci::before{content:"\F12E9"}.mdi-ocr::before{content:"\F113A"}.mdi-octagon::before{content:"\F03C3"}.mdi-octagon-outline::before{content:"\F03C4"}.mdi-octagram::before{content:"\F06F9"}.mdi-octagram-edit::before{content:"\F1C34"}.mdi-octagram-edit-outline::before{content:"\F1C35"}.mdi-octagram-minus::before{content:"\F1C36"}.mdi-octagram-minus-outline::before{content:"\F1C37"}.mdi-octagram-outline::before{content:"\F0775"}.mdi-octagram-plus::before{content:"\F1C38"}.mdi-octagram-plus-outline::before{content:"\F1C39"}.mdi-octahedron::before{content:"\F1950"}.mdi-octahedron-off::before{content:"\F1951"}.mdi-odnoklassniki::before{content:"\F03C5"}.mdi-offer::before{content:"\F121B"}.mdi-office-building::before{content:"\F0991"}.mdi-office-building-cog::before{content:"\F1949"}.mdi-office-building-cog-outline::before{content:"\F194A"}.mdi-office-building-marker::before{content:"\F1520"}.mdi-office-building-marker-outline::before{content:"\F1521"}.mdi-office-building-minus::before{content:"\F1BAA"}.mdi-office-building-minus-outline::before{content:"\F1BAB"}.mdi-office-building-outline::before{content:"\F151F"}.mdi-office-building-plus::before{content:"\F1BA8"}.mdi-office-building-plus-outline::before{content:"\F1BA9"}.mdi-office-building-remove::before{content:"\F1BAC"}.mdi-office-building-remove-outline::before{content:"\F1BAD"}.mdi-oil::before{content:"\F03C7"}.mdi-oil-lamp::before{content:"\F0F19"}.mdi-oil-level::before{content:"\F1053"}.mdi-oil-temperature::before{content:"\F0FF8"}.mdi-om::before{content:"\F0973"}.mdi-omega::before{content:"\F03C9"}.mdi-one-up::before{content:"\F0BAD"}.mdi-onepassword::before{content:"\F0881"}.mdi-opacity::before{content:"\F05CC"}.mdi-open-in-app::before{content:"\F03CB"}.mdi-open-in-new::before{content:"\F03CC"}.mdi-open-source-initiative::before{content:"\F0BAE"}.mdi-openid::before{content:"\F03CD"}.mdi-opera::before{content:"\F03CE"}.mdi-orbit::before{content:"\F0018"}.mdi-orbit-variant::before{content:"\F15DB"}.mdi-order-alphabetical-ascending::before{content:"\F020D"}.mdi-order-alphabetical-descending::before{content:"\F0D07"}.mdi-order-bool-ascending::before{content:"\F02BE"}.mdi-order-bool-ascending-variant::before{content:"\F098F"}.mdi-order-bool-descending::before{content:"\F1384"}.mdi-order-bool-descending-variant::before{content:"\F0990"}.mdi-order-numeric-ascending::before{content:"\F0545"}.mdi-order-numeric-descending::before{content:"\F0546"}.mdi-origin::before{content:"\F0B43"}.mdi-ornament::before{content:"\F03CF"}.mdi-ornament-variant::before{content:"\F03D0"}.mdi-outdoor-lamp::before{content:"\F1054"}.mdi-overscan::before{content:"\F1005"}.mdi-owl::before{content:"\F03D2"}.mdi-pac-man::before{content:"\F0BAF"}.mdi-package::before{content:"\F03D3"}.mdi-package-check::before{content:"\F1B51"}.mdi-package-down::before{content:"\F03D4"}.mdi-package-up::before{content:"\F03D5"}.mdi-package-variant::before{content:"\F03D6"}.mdi-package-variant-closed::before{content:"\F03D7"}.mdi-package-variant-closed-check::before{content:"\F1B52"}.mdi-package-variant-closed-minus::before{content:"\F19D4"}.mdi-package-variant-closed-plus::before{content:"\F19D5"}.mdi-package-variant-closed-remove::before{content:"\F19D6"}.mdi-package-variant-minus::before{content:"\F19D7"}.mdi-package-variant-plus::before{content:"\F19D8"}.mdi-package-variant-remove::before{content:"\F19D9"}.mdi-page-first::before{content:"\F0600"}.mdi-page-last::before{content:"\F0601"}.mdi-page-layout-body::before{content:"\F06FA"}.mdi-page-layout-footer::before{content:"\F06FB"}.mdi-page-layout-header::before{content:"\F06FC"}.mdi-page-layout-header-footer::before{content:"\F0F7F"}.mdi-page-layout-sidebar-left::before{content:"\F06FD"}.mdi-page-layout-sidebar-right::before{content:"\F06FE"}.mdi-page-next::before{content:"\F0BB0"}.mdi-page-next-outline::before{content:"\F0BB1"}.mdi-page-previous::before{content:"\F0BB2"}.mdi-page-previous-outline::before{content:"\F0BB3"}.mdi-pail::before{content:"\F1417"}.mdi-pail-minus::before{content:"\F1437"}.mdi-pail-minus-outline::before{content:"\F143C"}.mdi-pail-off::before{content:"\F1439"}.mdi-pail-off-outline::before{content:"\F143E"}.mdi-pail-outline::before{content:"\F143A"}.mdi-pail-plus::before{content:"\F1436"}.mdi-pail-plus-outline::before{content:"\F143B"}.mdi-pail-remove::before{content:"\F1438"}.mdi-pail-remove-outline::before{content:"\F143D"}.mdi-palette::before{content:"\F03D8"}.mdi-palette-advanced::before{content:"\F03D9"}.mdi-palette-outline::before{content:"\F0E0C"}.mdi-palette-swatch::before{content:"\F08B5"}.mdi-palette-swatch-outline::before{content:"\F135C"}.mdi-palette-swatch-variant::before{content:"\F195A"}.mdi-palm-tree::before{content:"\F1055"}.mdi-pan::before{content:"\F0BB4"}.mdi-pan-bottom-left::before{content:"\F0BB5"}.mdi-pan-bottom-right::before{content:"\F0BB6"}.mdi-pan-down::before{content:"\F0BB7"}.mdi-pan-horizontal::before{content:"\F0BB8"}.mdi-pan-left::before{content:"\F0BB9"}.mdi-pan-right::before{content:"\F0BBA"}.mdi-pan-top-left::before{content:"\F0BBB"}.mdi-pan-top-right::before{content:"\F0BBC"}.mdi-pan-up::before{content:"\F0BBD"}.mdi-pan-vertical::before{content:"\F0BBE"}.mdi-panda::before{content:"\F03DA"}.mdi-pandora::before{content:"\F03DB"}.mdi-panorama::before{content:"\F03DC"}.mdi-panorama-fisheye::before{content:"\F03DD"}.mdi-panorama-horizontal::before{content:"\F1928"}.mdi-panorama-horizontal-outline::before{content:"\F03DE"}.mdi-panorama-outline::before{content:"\F198C"}.mdi-panorama-sphere::before{content:"\F198D"}.mdi-panorama-sphere-outline::before{content:"\F198E"}.mdi-panorama-variant::before{content:"\F198F"}.mdi-panorama-variant-outline::before{content:"\F1990"}.mdi-panorama-vertical::before{content:"\F1929"}.mdi-panorama-vertical-outline::before{content:"\F03DF"}.mdi-panorama-wide-angle::before{content:"\F195F"}.mdi-panorama-wide-angle-outline::before{content:"\F03E0"}.mdi-paper-cut-vertical::before{content:"\F03E1"}.mdi-paper-roll::before{content:"\F1157"}.mdi-paper-roll-outline::before{content:"\F1158"}.mdi-paperclip::before{content:"\F03E2"}.mdi-paperclip-check::before{content:"\F1AC6"}.mdi-paperclip-lock::before{content:"\F19DA"}.mdi-paperclip-minus::before{content:"\F1AC7"}.mdi-paperclip-off::before{content:"\F1AC8"}.mdi-paperclip-plus::before{content:"\F1AC9"}.mdi-paperclip-remove::before{content:"\F1ACA"}.mdi-parachute::before{content:"\F0CB4"}.mdi-parachute-outline::before{content:"\F0CB5"}.mdi-paragliding::before{content:"\F1745"}.mdi-parking::before{content:"\F03E3"}.mdi-party-popper::before{content:"\F1056"}.mdi-passport::before{content:"\F07E3"}.mdi-passport-alert::before{content:"\F1CB8"}.mdi-passport-biometric::before{content:"\F0DE1"}.mdi-passport-cancel::before{content:"\F1CB9"}.mdi-passport-check::before{content:"\F1CBA"}.mdi-passport-minus::before{content:"\F1CBB"}.mdi-passport-plus::before{content:"\F1CBC"}.mdi-passport-remove::before{content:"\F1CBD"}.mdi-pasta::before{content:"\F1160"}.mdi-patio-heater::before{content:"\F0F80"}.mdi-patreon::before{content:"\F0882"}.mdi-pause::before{content:"\F03E4"}.mdi-pause-box::before{content:"\F00BC"}.mdi-pause-box-outline::before{content:"\F1B7A"}.mdi-pause-circle::before{content:"\F03E5"}.mdi-pause-circle-outline::before{content:"\F03E6"}.mdi-pause-octagon::before{content:"\F03E7"}.mdi-pause-octagon-outline::before{content:"\F03E8"}.mdi-paw::before{content:"\F03E9"}.mdi-paw-off::before{content:"\F0657"}.mdi-paw-off-outline::before{content:"\F1676"}.mdi-paw-outline::before{content:"\F1675"}.mdi-peace::before{content:"\F0884"}.mdi-peanut::before{content:"\F0FFC"}.mdi-peanut-off::before{content:"\F0FFD"}.mdi-peanut-off-outline::before{content:"\F0FFF"}.mdi-peanut-outline::before{content:"\F0FFE"}.mdi-pen::before{content:"\F03EA"}.mdi-pen-lock::before{content:"\F0DE2"}.mdi-pen-minus::before{content:"\F0DE3"}.mdi-pen-off::before{content:"\F0DE4"}.mdi-pen-plus::before{content:"\F0DE5"}.mdi-pen-remove::before{content:"\F0DE6"}.mdi-pencil::before{content:"\F03EB"}.mdi-pencil-box::before{content:"\F03EC"}.mdi-pencil-box-multiple::before{content:"\F1144"}.mdi-pencil-box-multiple-outline::before{content:"\F1145"}.mdi-pencil-box-outline::before{content:"\F03ED"}.mdi-pencil-circle::before{content:"\F06FF"}.mdi-pencil-circle-outline::before{content:"\F0776"}.mdi-pencil-lock::before{content:"\F03EE"}.mdi-pencil-lock-outline::before{content:"\F0DE7"}.mdi-pencil-minus::before{content:"\F0DE8"}.mdi-pencil-minus-outline::before{content:"\F0DE9"}.mdi-pencil-off::before{content:"\F03EF"}.mdi-pencil-off-outline::before{content:"\F0DEA"}.mdi-pencil-outline::before{content:"\F0CB6"}.mdi-pencil-plus::before{content:"\F0DEB"}.mdi-pencil-plus-outline::before{content:"\F0DEC"}.mdi-pencil-remove::before{content:"\F0DED"}.mdi-pencil-remove-outline::before{content:"\F0DEE"}.mdi-pencil-ruler::before{content:"\F1353"}.mdi-pencil-ruler-outline::before{content:"\F1C11"}.mdi-penguin::before{content:"\F0EC0"}.mdi-pentagon::before{content:"\F0701"}.mdi-pentagon-outline::before{content:"\F0700"}.mdi-pentagram::before{content:"\F1667"}.mdi-percent::before{content:"\F03F0"}.mdi-percent-box::before{content:"\F1A02"}.mdi-percent-box-outline::before{content:"\F1A03"}.mdi-percent-circle::before{content:"\F1A04"}.mdi-percent-circle-outline::before{content:"\F1A05"}.mdi-percent-outline::before{content:"\F1278"}.mdi-periodic-table::before{content:"\F08B6"}.mdi-perspective-less::before{content:"\F0D23"}.mdi-perspective-more::before{content:"\F0D24"}.mdi-ph::before{content:"\F17C5"}.mdi-phone::before{content:"\F03F2"}.mdi-phone-alert::before{content:"\F0F1A"}.mdi-phone-alert-outline::before{content:"\F118E"}.mdi-phone-bluetooth::before{content:"\F03F3"}.mdi-phone-bluetooth-outline::before{content:"\F118F"}.mdi-phone-cancel::before{content:"\F10BC"}.mdi-phone-cancel-outline::before{content:"\F1190"}.mdi-phone-check::before{content:"\F11A9"}.mdi-phone-check-outline::before{content:"\F11AA"}.mdi-phone-classic::before{content:"\F0602"}.mdi-phone-classic-off::before{content:"\F1279"}.mdi-phone-clock::before{content:"\F19DB"}.mdi-phone-dial::before{content:"\F1559"}.mdi-phone-dial-outline::before{content:"\F155A"}.mdi-phone-forward::before{content:"\F03F4"}.mdi-phone-forward-outline::before{content:"\F1191"}.mdi-phone-hangup::before{content:"\F03F5"}.mdi-phone-hangup-outline::before{content:"\F1192"}.mdi-phone-in-talk::before{content:"\F03F6"}.mdi-phone-in-talk-outline::before{content:"\F1182"}.mdi-phone-incoming::before{content:"\F03F7"}.mdi-phone-incoming-outgoing::before{content:"\F1B3F"}.mdi-phone-incoming-outgoing-outline::before{content:"\F1B40"}.mdi-phone-incoming-outline::before{content:"\F1193"}.mdi-phone-lock::before{content:"\F03F8"}.mdi-phone-lock-outline::before{content:"\F1194"}.mdi-phone-log::before{content:"\F03F9"}.mdi-phone-log-outline::before{content:"\F1195"}.mdi-phone-message::before{content:"\F1196"}.mdi-phone-message-outline::before{content:"\F1197"}.mdi-phone-minus::before{content:"\F0658"}.mdi-phone-minus-outline::before{content:"\F1198"}.mdi-phone-missed::before{content:"\F03FA"}.mdi-phone-missed-outline::before{content:"\F11A5"}.mdi-phone-off::before{content:"\F0DEF"}.mdi-phone-off-outline::before{content:"\F11A6"}.mdi-phone-outgoing::before{content:"\F03FB"}.mdi-phone-outgoing-outline::before{content:"\F1199"}.mdi-phone-outline::before{content:"\F0DF0"}.mdi-phone-paused::before{content:"\F03FC"}.mdi-phone-paused-outline::before{content:"\F119A"}.mdi-phone-plus::before{content:"\F0659"}.mdi-phone-plus-outline::before{content:"\F119B"}.mdi-phone-refresh::before{content:"\F1993"}.mdi-phone-refresh-outline::before{content:"\F1994"}.mdi-phone-remove::before{content:"\F152F"}.mdi-phone-remove-outline::before{content:"\F1530"}.mdi-phone-return::before{content:"\F082F"}.mdi-phone-return-outline::before{content:"\F119C"}.mdi-phone-ring::before{content:"\F11AB"}.mdi-phone-ring-outline::before{content:"\F11AC"}.mdi-phone-rotate-landscape::before{content:"\F0885"}.mdi-phone-rotate-portrait::before{content:"\F0886"}.mdi-phone-settings::before{content:"\F03FD"}.mdi-phone-settings-outline::before{content:"\F119D"}.mdi-phone-sync::before{content:"\F1995"}.mdi-phone-sync-outline::before{content:"\F1996"}.mdi-phone-voip::before{content:"\F03FE"}.mdi-pi::before{content:"\F03FF"}.mdi-pi-box::before{content:"\F0400"}.mdi-pi-hole::before{content:"\F0DF1"}.mdi-piano::before{content:"\F067D"}.mdi-piano-off::before{content:"\F0698"}.mdi-pickaxe::before{content:"\F08B7"}.mdi-picture-in-picture-bottom-right::before{content:"\F0E57"}.mdi-picture-in-picture-bottom-right-outline::before{content:"\F0E58"}.mdi-picture-in-picture-top-right::before{content:"\F0E59"}.mdi-picture-in-picture-top-right-outline::before{content:"\F0E5A"}.mdi-pier::before{content:"\F0887"}.mdi-pier-crane::before{content:"\F0888"}.mdi-pig::before{content:"\F0401"}.mdi-pig-variant::before{content:"\F1006"}.mdi-pig-variant-outline::before{content:"\F1678"}.mdi-piggy-bank::before{content:"\F1007"}.mdi-piggy-bank-outline::before{content:"\F1679"}.mdi-pill::before{content:"\F0402"}.mdi-pill-multiple::before{content:"\F1B4C"}.mdi-pill-off::before{content:"\F1A5C"}.mdi-pillar::before{content:"\F0702"}.mdi-pin::before{content:"\F0403"}.mdi-pin-off::before{content:"\F0404"}.mdi-pin-off-outline::before{content:"\F0930"}.mdi-pin-outline::before{content:"\F0931"}.mdi-pine-tree::before{content:"\F0405"}.mdi-pine-tree-box::before{content:"\F0406"}.mdi-pine-tree-fire::before{content:"\F141A"}.mdi-pine-tree-variant::before{content:"\F1C73"}.mdi-pine-tree-variant-outline::before{content:"\F1C74"}.mdi-pinterest::before{content:"\F0407"}.mdi-pinwheel::before{content:"\F0AD5"}.mdi-pinwheel-outline::before{content:"\F0AD6"}.mdi-pipe::before{content:"\F07E5"}.mdi-pipe-disconnected::before{content:"\F07E6"}.mdi-pipe-leak::before{content:"\F0889"}.mdi-pipe-valve::before{content:"\F184D"}.mdi-pipe-wrench::before{content:"\F1354"}.mdi-pirate::before{content:"\F0A08"}.mdi-pistol::before{content:"\F0703"}.mdi-piston::before{content:"\F088A"}.mdi-pitchfork::before{content:"\F1553"}.mdi-pizza::before{content:"\F0409"}.mdi-plane-car::before{content:"\F1AFF"}.mdi-plane-train::before{content:"\F1B00"}.mdi-play::before{content:"\F040A"}.mdi-play-box::before{content:"\F127A"}.mdi-play-box-edit-outline::before{content:"\F1C3A"}.mdi-play-box-lock::before{content:"\F1A16"}.mdi-play-box-lock-open::before{content:"\F1A17"}.mdi-play-box-lock-open-outline::before{content:"\F1A18"}.mdi-play-box-lock-outline::before{content:"\F1A19"}.mdi-play-box-multiple::before{content:"\F0D19"}.mdi-play-box-multiple-outline::before{content:"\F13E6"}.mdi-play-box-outline::before{content:"\F040B"}.mdi-play-circle::before{content:"\F040C"}.mdi-play-circle-outline::before{content:"\F040D"}.mdi-play-network::before{content:"\F088B"}.mdi-play-network-outline::before{content:"\F0CB7"}.mdi-play-outline::before{content:"\F0F1B"}.mdi-play-pause::before{content:"\F040E"}.mdi-play-protected-content::before{content:"\F040F"}.mdi-play-speed::before{content:"\F08FF"}.mdi-playlist-check::before{content:"\F05C7"}.mdi-playlist-edit::before{content:"\F0900"}.mdi-playlist-minus::before{content:"\F0410"}.mdi-playlist-music::before{content:"\F0CB8"}.mdi-playlist-music-outline::before{content:"\F0CB9"}.mdi-playlist-play::before{content:"\F0411"}.mdi-playlist-plus::before{content:"\F0412"}.mdi-playlist-remove::before{content:"\F0413"}.mdi-playlist-star::before{content:"\F0DF2"}.mdi-plex::before{content:"\F06BA"}.mdi-pliers::before{content:"\F19A4"}.mdi-plus::before{content:"\F0415"}.mdi-plus-box::before{content:"\F0416"}.mdi-plus-box-multiple::before{content:"\F0334"}.mdi-plus-box-multiple-outline::before{content:"\F1143"}.mdi-plus-box-outline::before{content:"\F0704"}.mdi-plus-circle::before{content:"\F0417"}.mdi-plus-circle-multiple::before{content:"\F034C"}.mdi-plus-circle-multiple-outline::before{content:"\F0418"}.mdi-plus-circle-outline::before{content:"\F0419"}.mdi-plus-lock::before{content:"\F1A5D"}.mdi-plus-lock-open::before{content:"\F1A5E"}.mdi-plus-minus::before{content:"\F0992"}.mdi-plus-minus-box::before{content:"\F0993"}.mdi-plus-minus-variant::before{content:"\F14C9"}.mdi-plus-network::before{content:"\F041A"}.mdi-plus-network-outline::before{content:"\F0CBA"}.mdi-plus-outline::before{content:"\F0705"}.mdi-plus-thick::before{content:"\F11EC"}.mdi-pocket::before{content:"\F1CBE"}.mdi-podcast::before{content:"\F0994"}.mdi-podium::before{content:"\F0D25"}.mdi-podium-bronze::before{content:"\F0D26"}.mdi-podium-gold::before{content:"\F0D27"}.mdi-podium-silver::before{content:"\F0D28"}.mdi-point-of-sale::before{content:"\F0D92"}.mdi-pokeball::before{content:"\F041D"}.mdi-pokemon-go::before{content:"\F0A09"}.mdi-poker-chip::before{content:"\F0830"}.mdi-polaroid::before{content:"\F041E"}.mdi-police-badge::before{content:"\F1167"}.mdi-police-badge-outline::before{content:"\F1168"}.mdi-police-station::before{content:"\F1839"}.mdi-poll::before{content:"\F041F"}.mdi-polo::before{content:"\F14C3"}.mdi-polymer::before{content:"\F0421"}.mdi-pool::before{content:"\F0606"}.mdi-pool-thermometer::before{content:"\F1A5F"}.mdi-popcorn::before{content:"\F0422"}.mdi-post::before{content:"\F1008"}.mdi-post-lamp::before{content:"\F1A60"}.mdi-post-outline::before{content:"\F1009"}.mdi-postage-stamp::before{content:"\F0CBB"}.mdi-pot::before{content:"\F02E5"}.mdi-pot-mix::before{content:"\F065B"}.mdi-pot-mix-outline::before{content:"\F0677"}.mdi-pot-outline::before{content:"\F02FF"}.mdi-pot-steam::before{content:"\F065A"}.mdi-pot-steam-outline::before{content:"\F0326"}.mdi-pound::before{content:"\F0423"}.mdi-pound-box::before{content:"\F0424"}.mdi-pound-box-outline::before{content:"\F117F"}.mdi-power::before{content:"\F0425"}.mdi-power-cycle::before{content:"\F0901"}.mdi-power-off::before{content:"\F0902"}.mdi-power-on::before{content:"\F0903"}.mdi-power-plug::before{content:"\F06A5"}.mdi-power-plug-battery::before{content:"\F1C3B"}.mdi-power-plug-battery-outline::before{content:"\F1C3C"}.mdi-power-plug-off::before{content:"\F06A6"}.mdi-power-plug-off-outline::before{content:"\F1424"}.mdi-power-plug-outline::before{content:"\F1425"}.mdi-power-settings::before{content:"\F0426"}.mdi-power-sleep::before{content:"\F0904"}.mdi-power-socket::before{content:"\F0427"}.mdi-power-socket-au::before{content:"\F0905"}.mdi-power-socket-ch::before{content:"\F0FB3"}.mdi-power-socket-de::before{content:"\F1107"}.mdi-power-socket-eu::before{content:"\F07E7"}.mdi-power-socket-fr::before{content:"\F1108"}.mdi-power-socket-it::before{content:"\F14FF"}.mdi-power-socket-jp::before{content:"\F1109"}.mdi-power-socket-uk::before{content:"\F07E8"}.mdi-power-socket-us::before{content:"\F07E9"}.mdi-power-standby::before{content:"\F0906"}.mdi-powershell::before{content:"\F0A0A"}.mdi-prescription::before{content:"\F0706"}.mdi-presentation::before{content:"\F0428"}.mdi-presentation-play::before{content:"\F0429"}.mdi-pretzel::before{content:"\F1562"}.mdi-printer::before{content:"\F042A"}.mdi-printer-3d::before{content:"\F042B"}.mdi-printer-3d-nozzle::before{content:"\F0E5B"}.mdi-printer-3d-nozzle-alert::before{content:"\F11C0"}.mdi-printer-3d-nozzle-alert-outline::before{content:"\F11C1"}.mdi-printer-3d-nozzle-heat::before{content:"\F18B8"}.mdi-printer-3d-nozzle-heat-outline::before{content:"\F18B9"}.mdi-printer-3d-nozzle-off::before{content:"\F1B19"}.mdi-printer-3d-nozzle-off-outline::before{content:"\F1B1A"}.mdi-printer-3d-nozzle-outline::before{content:"\F0E5C"}.mdi-printer-3d-off::before{content:"\F1B0E"}.mdi-printer-alert::before{content:"\F042C"}.mdi-printer-check::before{content:"\F1146"}.mdi-printer-eye::before{content:"\F1458"}.mdi-printer-off::before{content:"\F0E5D"}.mdi-printer-off-outline::before{content:"\F1785"}.mdi-printer-outline::before{content:"\F1786"}.mdi-printer-pos::before{content:"\F1057"}.mdi-printer-pos-alert::before{content:"\F1BBC"}.mdi-printer-pos-alert-outline::before{content:"\F1BBD"}.mdi-printer-pos-cancel::before{content:"\F1BBE"}.mdi-printer-pos-cancel-outline::before{content:"\F1BBF"}.mdi-printer-pos-check::before{content:"\F1BC0"}.mdi-printer-pos-check-outline::before{content:"\F1BC1"}.mdi-printer-pos-cog::before{content:"\F1BC2"}.mdi-printer-pos-cog-outline::before{content:"\F1BC3"}.mdi-printer-pos-edit::before{content:"\F1BC4"}.mdi-printer-pos-edit-outline::before{content:"\F1BC5"}.mdi-printer-pos-minus::before{content:"\F1BC6"}.mdi-printer-pos-minus-outline::before{content:"\F1BC7"}.mdi-printer-pos-network::before{content:"\F1BC8"}.mdi-printer-pos-network-outline::before{content:"\F1BC9"}.mdi-printer-pos-off::before{content:"\F1BCA"}.mdi-printer-pos-off-outline::before{content:"\F1BCB"}.mdi-printer-pos-outline::before{content:"\F1BCC"}.mdi-printer-pos-pause::before{content:"\F1BCD"}.mdi-printer-pos-pause-outline::before{content:"\F1BCE"}.mdi-printer-pos-play::before{content:"\F1BCF"}.mdi-printer-pos-play-outline::before{content:"\F1BD0"}.mdi-printer-pos-plus::before{content:"\F1BD1"}.mdi-printer-pos-plus-outline::before{content:"\F1BD2"}.mdi-printer-pos-refresh::before{content:"\F1BD3"}.mdi-printer-pos-refresh-outline::before{content:"\F1BD4"}.mdi-printer-pos-remove::before{content:"\F1BD5"}.mdi-printer-pos-remove-outline::before{content:"\F1BD6"}.mdi-printer-pos-star::before{content:"\F1BD7"}.mdi-printer-pos-star-outline::before{content:"\F1BD8"}.mdi-printer-pos-stop::before{content:"\F1BD9"}.mdi-printer-pos-stop-outline::before{content:"\F1BDA"}.mdi-printer-pos-sync::before{content:"\F1BDB"}.mdi-printer-pos-sync-outline::before{content:"\F1BDC"}.mdi-printer-pos-wrench::before{content:"\F1BDD"}.mdi-printer-pos-wrench-outline::before{content:"\F1BDE"}.mdi-printer-search::before{content:"\F1457"}.mdi-printer-settings::before{content:"\F0707"}.mdi-printer-wireless::before{content:"\F0A0B"}.mdi-priority-high::before{content:"\F0603"}.mdi-priority-low::before{content:"\F0604"}.mdi-professional-hexagon::before{content:"\F042D"}.mdi-progress-alert::before{content:"\F0CBC"}.mdi-progress-check::before{content:"\F0995"}.mdi-progress-clock::before{content:"\F0996"}.mdi-progress-close::before{content:"\F110A"}.mdi-progress-download::before{content:"\F0997"}.mdi-progress-helper::before{content:"\F1BA2"}.mdi-progress-pencil::before{content:"\F1787"}.mdi-progress-question::before{content:"\F1522"}.mdi-progress-star::before{content:"\F1788"}.mdi-progress-star-four-points::before{content:"\F1C3D"}.mdi-progress-tag::before{content:"\F1D0D"}.mdi-progress-upload::before{content:"\F0998"}.mdi-progress-wrench::before{content:"\F0CBD"}.mdi-projector::before{content:"\F042E"}.mdi-projector-off::before{content:"\F1A23"}.mdi-projector-screen::before{content:"\F042F"}.mdi-projector-screen-off::before{content:"\F180D"}.mdi-projector-screen-off-outline::before{content:"\F180E"}.mdi-projector-screen-outline::before{content:"\F1724"}.mdi-projector-screen-variant::before{content:"\F180F"}.mdi-projector-screen-variant-off::before{content:"\F1810"}.mdi-projector-screen-variant-off-outline::before{content:"\F1811"}.mdi-projector-screen-variant-outline::before{content:"\F1812"}.mdi-propane-tank::before{content:"\F1357"}.mdi-propane-tank-outline::before{content:"\F1358"}.mdi-protocol::before{content:"\F0FD8"}.mdi-publish::before{content:"\F06A7"}.mdi-publish-off::before{content:"\F1945"}.mdi-pulse::before{content:"\F0430"}.mdi-pump::before{content:"\F1402"}.mdi-pump-off::before{content:"\F1B22"}.mdi-pumpkin::before{content:"\F0BBF"}.mdi-purse::before{content:"\F0F1C"}.mdi-purse-outline::before{content:"\F0F1D"}.mdi-puzzle::before{content:"\F0431"}.mdi-puzzle-check::before{content:"\F1426"}.mdi-puzzle-check-outline::before{content:"\F1427"}.mdi-puzzle-edit::before{content:"\F14D3"}.mdi-puzzle-edit-outline::before{content:"\F14D9"}.mdi-puzzle-heart::before{content:"\F14D4"}.mdi-puzzle-heart-outline::before{content:"\F14DA"}.mdi-puzzle-minus::before{content:"\F14D1"}.mdi-puzzle-minus-outline::before{content:"\F14D7"}.mdi-puzzle-outline::before{content:"\F0A66"}.mdi-puzzle-plus::before{content:"\F14D0"}.mdi-puzzle-plus-outline::before{content:"\F14D6"}.mdi-puzzle-remove::before{content:"\F14D2"}.mdi-puzzle-remove-outline::before{content:"\F14D8"}.mdi-puzzle-star::before{content:"\F14D5"}.mdi-puzzle-star-outline::before{content:"\F14DB"}.mdi-pyramid::before{content:"\F1952"}.mdi-pyramid-off::before{content:"\F1953"}.mdi-qi::before{content:"\F0999"}.mdi-qqchat::before{content:"\F0605"}.mdi-qrcode::before{content:"\F0432"}.mdi-qrcode-edit::before{content:"\F08B8"}.mdi-qrcode-minus::before{content:"\F118C"}.mdi-qrcode-plus::before{content:"\F118B"}.mdi-qrcode-remove::before{content:"\F118D"}.mdi-qrcode-scan::before{content:"\F0433"}.mdi-quadcopter::before{content:"\F0434"}.mdi-quality-high::before{content:"\F0435"}.mdi-quality-low::before{content:"\F0A0C"}.mdi-quality-medium::before{content:"\F0A0D"}.mdi-queue-first-in-last-out::before{content:"\F1CAF"}.mdi-quora::before{content:"\F0D29"}.mdi-rabbit::before{content:"\F0907"}.mdi-rabbit-variant::before{content:"\F1A61"}.mdi-rabbit-variant-outline::before{content:"\F1A62"}.mdi-racing-helmet::before{content:"\F0D93"}.mdi-racquetball::before{content:"\F0D94"}.mdi-radar::before{content:"\F0437"}.mdi-radiator::before{content:"\F0438"}.mdi-radiator-disabled::before{content:"\F0AD7"}.mdi-radiator-off::before{content:"\F0AD8"}.mdi-radio::before{content:"\F0439"}.mdi-radio-am::before{content:"\F0CBE"}.mdi-radio-fm::before{content:"\F0CBF"}.mdi-radio-handheld::before{content:"\F043A"}.mdi-radio-off::before{content:"\F121C"}.mdi-radio-tower::before{content:"\F043B"}.mdi-radioactive::before{content:"\F043C"}.mdi-radioactive-circle::before{content:"\F185D"}.mdi-radioactive-circle-outline::before{content:"\F185E"}.mdi-radioactive-off::before{content:"\F0EC1"}.mdi-radiobox-blank::before{content:"\F043D"}.mdi-radiobox-indeterminate-variant::before{content:"\F1C5E"}.mdi-radiobox-marked::before{content:"\F043E"}.mdi-radiology-box::before{content:"\F14C5"}.mdi-radiology-box-outline::before{content:"\F14C6"}.mdi-radius::before{content:"\F0CC0"}.mdi-radius-outline::before{content:"\F0CC1"}.mdi-railroad-light::before{content:"\F0F1E"}.mdi-rake::before{content:"\F1544"}.mdi-raspberry-pi::before{content:"\F043F"}.mdi-raw::before{content:"\F1A0F"}.mdi-raw-off::before{content:"\F1A10"}.mdi-ray-end::before{content:"\F0440"}.mdi-ray-end-arrow::before{content:"\F0441"}.mdi-ray-start::before{content:"\F0442"}.mdi-ray-start-arrow::before{content:"\F0443"}.mdi-ray-start-end::before{content:"\F0444"}.mdi-ray-start-vertex-end::before{content:"\F15D8"}.mdi-ray-vertex::before{content:"\F0445"}.mdi-razor-double-edge::before{content:"\F1997"}.mdi-razor-single-edge::before{content:"\F1998"}.mdi-react::before{content:"\F0708"}.mdi-read::before{content:"\F0447"}.mdi-receipt::before{content:"\F0824"}.mdi-receipt-clock::before{content:"\F1C3E"}.mdi-receipt-clock-outline::before{content:"\F1C3F"}.mdi-receipt-outline::before{content:"\F04F7"}.mdi-receipt-send::before{content:"\F1C40"}.mdi-receipt-send-outline::before{content:"\F1C41"}.mdi-receipt-text::before{content:"\F0449"}.mdi-receipt-text-arrow-left::before{content:"\F1C42"}.mdi-receipt-text-arrow-left-outline::before{content:"\F1C43"}.mdi-receipt-text-arrow-right::before{content:"\F1C44"}.mdi-receipt-text-arrow-right-outline::before{content:"\F1C45"}.mdi-receipt-text-check::before{content:"\F1A63"}.mdi-receipt-text-check-outline::before{content:"\F1A64"}.mdi-receipt-text-clock::before{content:"\F1C46"}.mdi-receipt-text-clock-outline::before{content:"\F1C47"}.mdi-receipt-text-edit::before{content:"\F1C48"}.mdi-receipt-text-edit-outline::before{content:"\F1C49"}.mdi-receipt-text-minus::before{content:"\F1A65"}.mdi-receipt-text-minus-outline::before{content:"\F1A66"}.mdi-receipt-text-outline::before{content:"\F19DC"}.mdi-receipt-text-plus::before{content:"\F1A67"}.mdi-receipt-text-plus-outline::before{content:"\F1A68"}.mdi-receipt-text-remove::before{content:"\F1A69"}.mdi-receipt-text-remove-outline::before{content:"\F1A6A"}.mdi-receipt-text-send::before{content:"\F1C4A"}.mdi-receipt-text-send-outline::before{content:"\F1C4B"}.mdi-record::before{content:"\F044A"}.mdi-record-circle::before{content:"\F0EC2"}.mdi-record-circle-outline::before{content:"\F0EC3"}.mdi-record-player::before{content:"\F099A"}.mdi-record-rec::before{content:"\F044B"}.mdi-rectangle::before{content:"\F0E5E"}.mdi-rectangle-outline::before{content:"\F0E5F"}.mdi-recycle::before{content:"\F044C"}.mdi-recycle-variant::before{content:"\F139D"}.mdi-reddit::before{content:"\F044D"}.mdi-redhat::before{content:"\F111B"}.mdi-redo::before{content:"\F044E"}.mdi-redo-variant::before{content:"\F044F"}.mdi-reflect-horizontal::before{content:"\F0A0E"}.mdi-reflect-vertical::before{content:"\F0A0F"}.mdi-refresh::before{content:"\F0450"}.mdi-refresh-auto::before{content:"\F18F2"}.mdi-refresh-circle::before{content:"\F1377"}.mdi-regex::before{content:"\F0451"}.mdi-registered-trademark::before{content:"\F0A67"}.mdi-reiterate::before{content:"\F1588"}.mdi-relation-many-to-many::before{content:"\F1496"}.mdi-relation-many-to-one::before{content:"\F1497"}.mdi-relation-many-to-one-or-many::before{content:"\F1498"}.mdi-relation-many-to-only-one::before{content:"\F1499"}.mdi-relation-many-to-zero-or-many::before{content:"\F149A"}.mdi-relation-many-to-zero-or-one::before{content:"\F149B"}.mdi-relation-one-or-many-to-many::before{content:"\F149C"}.mdi-relation-one-or-many-to-one::before{content:"\F149D"}.mdi-relation-one-or-many-to-one-or-many::before{content:"\F149E"}.mdi-relation-one-or-many-to-only-one::before{content:"\F149F"}.mdi-relation-one-or-many-to-zero-or-many::before{content:"\F14A0"}.mdi-relation-one-or-many-to-zero-or-one::before{content:"\F14A1"}.mdi-relation-one-to-many::before{content:"\F14A2"}.mdi-relation-one-to-one::before{content:"\F14A3"}.mdi-relation-one-to-one-or-many::before{content:"\F14A4"}.mdi-relation-one-to-only-one::before{content:"\F14A5"}.mdi-relation-one-to-zero-or-many::before{content:"\F14A6"}.mdi-relation-one-to-zero-or-one::before{content:"\F14A7"}.mdi-relation-only-one-to-many::before{content:"\F14A8"}.mdi-relation-only-one-to-one::before{content:"\F14A9"}.mdi-relation-only-one-to-one-or-many::before{content:"\F14AA"}.mdi-relation-only-one-to-only-one::before{content:"\F14AB"}.mdi-relation-only-one-to-zero-or-many::before{content:"\F14AC"}.mdi-relation-only-one-to-zero-or-one::before{content:"\F14AD"}.mdi-relation-zero-or-many-to-many::before{content:"\F14AE"}.mdi-relation-zero-or-many-to-one::before{content:"\F14AF"}.mdi-relation-zero-or-many-to-one-or-many::before{content:"\F14B0"}.mdi-relation-zero-or-many-to-only-one::before{content:"\F14B1"}.mdi-relation-zero-or-many-to-zero-or-many::before{content:"\F14B2"}.mdi-relation-zero-or-many-to-zero-or-one::before{content:"\F14B3"}.mdi-relation-zero-or-one-to-many::before{content:"\F14B4"}.mdi-relation-zero-or-one-to-one::before{content:"\F14B5"}.mdi-relation-zero-or-one-to-one-or-many::before{content:"\F14B6"}.mdi-relation-zero-or-one-to-only-one::before{content:"\F14B7"}.mdi-relation-zero-or-one-to-zero-or-many::before{content:"\F14B8"}.mdi-relation-zero-or-one-to-zero-or-one::before{content:"\F14B9"}.mdi-relative-scale::before{content:"\F0452"}.mdi-reload::before{content:"\F0453"}.mdi-reload-alert::before{content:"\F110B"}.mdi-reminder::before{content:"\F088C"}.mdi-remote::before{content:"\F0454"}.mdi-remote-desktop::before{content:"\F08B9"}.mdi-remote-off::before{content:"\F0EC4"}.mdi-remote-tv::before{content:"\F0EC5"}.mdi-remote-tv-off::before{content:"\F0EC6"}.mdi-rename::before{content:"\F1C18"}.mdi-rename-box::before{content:"\F0455"}.mdi-rename-box-outline::before{content:"\F1C19"}.mdi-rename-outline::before{content:"\F1C1A"}.mdi-reorder-horizontal::before{content:"\F0688"}.mdi-reorder-vertical::before{content:"\F0689"}.mdi-repeat::before{content:"\F0456"}.mdi-repeat-off::before{content:"\F0457"}.mdi-repeat-once::before{content:"\F0458"}.mdi-repeat-variant::before{content:"\F0547"}.mdi-replay::before{content:"\F0459"}.mdi-reply::before{content:"\F045A"}.mdi-reply-all::before{content:"\F045B"}.mdi-reply-all-outline::before{content:"\F0F1F"}.mdi-reply-circle::before{content:"\F11AE"}.mdi-reply-outline::before{content:"\F0F20"}.mdi-reproduction::before{content:"\F045C"}.mdi-resistor::before{content:"\F0B44"}.mdi-resistor-nodes::before{content:"\F0B45"}.mdi-resize::before{content:"\F0A68"}.mdi-resize-bottom-right::before{content:"\F045D"}.mdi-responsive::before{content:"\F045E"}.mdi-restart::before{content:"\F0709"}.mdi-restart-alert::before{content:"\F110C"}.mdi-restart-off::before{content:"\F0D95"}.mdi-restore::before{content:"\F099B"}.mdi-restore-alert::before{content:"\F110D"}.mdi-rewind::before{content:"\F045F"}.mdi-rewind-10::before{content:"\F0D2A"}.mdi-rewind-15::before{content:"\F1946"}.mdi-rewind-30::before{content:"\F0D96"}.mdi-rewind-45::before{content:"\F1B13"}.mdi-rewind-5::before{content:"\F11F9"}.mdi-rewind-60::before{content:"\F160C"}.mdi-rewind-outline::before{content:"\F070A"}.mdi-rhombus::before{content:"\F070B"}.mdi-rhombus-medium::before{content:"\F0A10"}.mdi-rhombus-medium-outline::before{content:"\F14DC"}.mdi-rhombus-outline::before{content:"\F070C"}.mdi-rhombus-split::before{content:"\F0A11"}.mdi-rhombus-split-outline::before{content:"\F14DD"}.mdi-ribbon::before{content:"\F0460"}.mdi-rice::before{content:"\F07EA"}.mdi-rickshaw::before{content:"\F15BB"}.mdi-rickshaw-electric::before{content:"\F15BC"}.mdi-ring::before{content:"\F07EB"}.mdi-rivet::before{content:"\F0E60"}.mdi-road::before{content:"\F0461"}.mdi-road-variant::before{content:"\F0462"}.mdi-robber::before{content:"\F1058"}.mdi-robot::before{content:"\F06A9"}.mdi-robot-angry::before{content:"\F169D"}.mdi-robot-angry-outline::before{content:"\F169E"}.mdi-robot-confused::before{content:"\F169F"}.mdi-robot-confused-outline::before{content:"\F16A0"}.mdi-robot-dead::before{content:"\F16A1"}.mdi-robot-dead-outline::before{content:"\F16A2"}.mdi-robot-excited::before{content:"\F16A3"}.mdi-robot-excited-outline::before{content:"\F16A4"}.mdi-robot-happy::before{content:"\F1719"}.mdi-robot-happy-outline::before{content:"\F171A"}.mdi-robot-industrial::before{content:"\F0B46"}.mdi-robot-industrial-outline::before{content:"\F1A1A"}.mdi-robot-love::before{content:"\F16A5"}.mdi-robot-love-outline::before{content:"\F16A6"}.mdi-robot-mower::before{content:"\F11F7"}.mdi-robot-mower-outline::before{content:"\F11F3"}.mdi-robot-off::before{content:"\F16A7"}.mdi-robot-off-outline::before{content:"\F167B"}.mdi-robot-outline::before{content:"\F167A"}.mdi-robot-vacuum::before{content:"\F070D"}.mdi-robot-vacuum-alert::before{content:"\F1B5D"}.mdi-robot-vacuum-off::before{content:"\F1C01"}.mdi-robot-vacuum-variant::before{content:"\F0908"}.mdi-robot-vacuum-variant-alert::before{content:"\F1B5E"}.mdi-robot-vacuum-variant-off::before{content:"\F1C02"}.mdi-rocket::before{content:"\F0463"}.mdi-rocket-launch::before{content:"\F14DE"}.mdi-rocket-launch-outline::before{content:"\F14DF"}.mdi-rocket-outline::before{content:"\F13AF"}.mdi-rodent::before{content:"\F1327"}.mdi-roller-shade::before{content:"\F1A6B"}.mdi-roller-shade-closed::before{content:"\F1A6C"}.mdi-roller-skate::before{content:"\F0D2B"}.mdi-roller-skate-off::before{content:"\F0145"}.mdi-rollerblade::before{content:"\F0D2C"}.mdi-rollerblade-off::before{content:"\F002E"}.mdi-rollupjs::before{content:"\F0BC0"}.mdi-rolodex::before{content:"\F1AB9"}.mdi-rolodex-outline::before{content:"\F1ABA"}.mdi-roman-numeral-1::before{content:"\F1088"}.mdi-roman-numeral-10::before{content:"\F1091"}.mdi-roman-numeral-2::before{content:"\F1089"}.mdi-roman-numeral-3::before{content:"\F108A"}.mdi-roman-numeral-4::before{content:"\F108B"}.mdi-roman-numeral-5::before{content:"\F108C"}.mdi-roman-numeral-6::before{content:"\F108D"}.mdi-roman-numeral-7::before{content:"\F108E"}.mdi-roman-numeral-8::before{content:"\F108F"}.mdi-roman-numeral-9::before{content:"\F1090"}.mdi-room-service::before{content:"\F088D"}.mdi-room-service-outline::before{content:"\F0D97"}.mdi-rotate-360::before{content:"\F1999"}.mdi-rotate-3d::before{content:"\F0EC7"}.mdi-rotate-3d-variant::before{content:"\F0464"}.mdi-rotate-left::before{content:"\F0465"}.mdi-rotate-left-variant::before{content:"\F0466"}.mdi-rotate-orbit::before{content:"\F0D98"}.mdi-rotate-right::before{content:"\F0467"}.mdi-rotate-right-variant::before{content:"\F0468"}.mdi-rounded-corner::before{content:"\F0607"}.mdi-router::before{content:"\F11E2"}.mdi-router-network::before{content:"\F1087"}.mdi-router-network-wireless::before{content:"\F1C97"}.mdi-router-wireless::before{content:"\F0469"}.mdi-router-wireless-off::before{content:"\F15A3"}.mdi-router-wireless-settings::before{content:"\F0A69"}.mdi-routes::before{content:"\F046A"}.mdi-routes-clock::before{content:"\F1059"}.mdi-rowing::before{content:"\F0608"}.mdi-rss::before{content:"\F046B"}.mdi-rss-box::before{content:"\F046C"}.mdi-rss-off::before{content:"\F0F21"}.mdi-rug::before{content:"\F1475"}.mdi-rugby::before{content:"\F0D99"}.mdi-ruler::before{content:"\F046D"}.mdi-ruler-square::before{content:"\F0CC2"}.mdi-ruler-square-compass::before{content:"\F0EBE"}.mdi-run::before{content:"\F070E"}.mdi-run-fast::before{content:"\F046E"}.mdi-rv-truck::before{content:"\F11D4"}.mdi-sack::before{content:"\F0D2E"}.mdi-sack-outline::before{content:"\F1C4C"}.mdi-sack-percent::before{content:"\F0D2F"}.mdi-safe::before{content:"\F0A6A"}.mdi-safe-square::before{content:"\F127C"}.mdi-safe-square-outline::before{content:"\F127D"}.mdi-safety-goggles::before{content:"\F0D30"}.mdi-sail-boat::before{content:"\F0EC8"}.mdi-sail-boat-sink::before{content:"\F1AEF"}.mdi-sale::before{content:"\F046F"}.mdi-sale-outline::before{content:"\F1A06"}.mdi-salesforce::before{content:"\F088E"}.mdi-sass::before{content:"\F07EC"}.mdi-satellite::before{content:"\F0470"}.mdi-satellite-uplink::before{content:"\F0909"}.mdi-satellite-variant::before{content:"\F0471"}.mdi-sausage::before{content:"\F08BA"}.mdi-sausage-off::before{content:"\F1789"}.mdi-saw-blade::before{content:"\F0E61"}.mdi-sawtooth-wave::before{content:"\F147A"}.mdi-saxophone::before{content:"\F0609"}.mdi-scale::before{content:"\F0472"}.mdi-scale-balance::before{content:"\F05D1"}.mdi-scale-bathroom::before{content:"\F0473"}.mdi-scale-off::before{content:"\F105A"}.mdi-scale-unbalanced::before{content:"\F19B8"}.mdi-scan-helper::before{content:"\F13D8"}.mdi-scanner::before{content:"\F06AB"}.mdi-scanner-off::before{content:"\F090A"}.mdi-scatter-plot::before{content:"\F0EC9"}.mdi-scatter-plot-outline::before{content:"\F0ECA"}.mdi-scent::before{content:"\F1958"}.mdi-scent-off::before{content:"\F1959"}.mdi-school::before{content:"\F0474"}.mdi-school-outline::before{content:"\F1180"}.mdi-scissors-cutting::before{content:"\F0A6B"}.mdi-scooter::before{content:"\F15BD"}.mdi-scooter-electric::before{content:"\F15BE"}.mdi-scoreboard::before{content:"\F127E"}.mdi-scoreboard-outline::before{content:"\F127F"}.mdi-screen-rotation::before{content:"\F0475"}.mdi-screen-rotation-lock::before{content:"\F0478"}.mdi-screw-flat-top::before{content:"\F0DF3"}.mdi-screw-lag::before{content:"\F0DF4"}.mdi-screw-machine-flat-top::before{content:"\F0DF5"}.mdi-screw-machine-round-top::before{content:"\F0DF6"}.mdi-screw-round-top::before{content:"\F0DF7"}.mdi-screwdriver::before{content:"\F0476"}.mdi-script::before{content:"\F0BC1"}.mdi-script-outline::before{content:"\F0477"}.mdi-script-text::before{content:"\F0BC2"}.mdi-script-text-key::before{content:"\F1725"}.mdi-script-text-key-outline::before{content:"\F1726"}.mdi-script-text-outline::before{content:"\F0BC3"}.mdi-script-text-play::before{content:"\F1727"}.mdi-script-text-play-outline::before{content:"\F1728"}.mdi-sd::before{content:"\F0479"}.mdi-seal::before{content:"\F047A"}.mdi-seal-variant::before{content:"\F0FD9"}.mdi-search-web::before{content:"\F070F"}.mdi-seat::before{content:"\F0CC3"}.mdi-seat-flat::before{content:"\F047B"}.mdi-seat-flat-angled::before{content:"\F047C"}.mdi-seat-individual-suite::before{content:"\F047D"}.mdi-seat-legroom-extra::before{content:"\F047E"}.mdi-seat-legroom-normal::before{content:"\F047F"}.mdi-seat-legroom-reduced::before{content:"\F0480"}.mdi-seat-outline::before{content:"\F0CC4"}.mdi-seat-passenger::before{content:"\F1249"}.mdi-seat-recline-extra::before{content:"\F0481"}.mdi-seat-recline-normal::before{content:"\F0482"}.mdi-seatbelt::before{content:"\F0CC5"}.mdi-security::before{content:"\F0483"}.mdi-security-network::before{content:"\F0484"}.mdi-seed::before{content:"\F0E62"}.mdi-seed-off::before{content:"\F13FD"}.mdi-seed-off-outline::before{content:"\F13FE"}.mdi-seed-outline::before{content:"\F0E63"}.mdi-seed-plus::before{content:"\F1A6D"}.mdi-seed-plus-outline::before{content:"\F1A6E"}.mdi-seesaw::before{content:"\F15A4"}.mdi-segment::before{content:"\F0ECB"}.mdi-select::before{content:"\F0485"}.mdi-select-all::before{content:"\F0486"}.mdi-select-arrow-down::before{content:"\F1B59"}.mdi-select-arrow-up::before{content:"\F1B58"}.mdi-select-color::before{content:"\F0D31"}.mdi-select-compare::before{content:"\F0AD9"}.mdi-select-drag::before{content:"\F0A6C"}.mdi-select-group::before{content:"\F0F82"}.mdi-select-inverse::before{content:"\F0487"}.mdi-select-marker::before{content:"\F1280"}.mdi-select-multiple::before{content:"\F1281"}.mdi-select-multiple-marker::before{content:"\F1282"}.mdi-select-off::before{content:"\F0488"}.mdi-select-place::before{content:"\F0FDA"}.mdi-select-remove::before{content:"\F17C1"}.mdi-select-search::before{content:"\F1204"}.mdi-selection::before{content:"\F0489"}.mdi-selection-drag::before{content:"\F0A6D"}.mdi-selection-ellipse::before{content:"\F0D32"}.mdi-selection-ellipse-arrow-inside::before{content:"\F0F22"}.mdi-selection-ellipse-remove::before{content:"\F17C2"}.mdi-selection-marker::before{content:"\F1283"}.mdi-selection-multiple::before{content:"\F1285"}.mdi-selection-multiple-marker::before{content:"\F1284"}.mdi-selection-off::before{content:"\F0777"}.mdi-selection-remove::before{content:"\F17C3"}.mdi-selection-search::before{content:"\F1205"}.mdi-semantic-web::before{content:"\F1316"}.mdi-send::before{content:"\F048A"}.mdi-send-check::before{content:"\F1161"}.mdi-send-check-outline::before{content:"\F1162"}.mdi-send-circle::before{content:"\F0DF8"}.mdi-send-circle-outline::before{content:"\F0DF9"}.mdi-send-clock::before{content:"\F1163"}.mdi-send-clock-outline::before{content:"\F1164"}.mdi-send-lock::before{content:"\F07ED"}.mdi-send-lock-outline::before{content:"\F1166"}.mdi-send-outline::before{content:"\F1165"}.mdi-send-variant::before{content:"\F1C4D"}.mdi-send-variant-clock::before{content:"\F1C7E"}.mdi-send-variant-clock-outline::before{content:"\F1C7F"}.mdi-send-variant-outline::before{content:"\F1C4E"}.mdi-serial-port::before{content:"\F065C"}.mdi-server::before{content:"\F048B"}.mdi-server-minus::before{content:"\F048C"}.mdi-server-minus-outline::before{content:"\F1C98"}.mdi-server-network::before{content:"\F048D"}.mdi-server-network-off::before{content:"\F048E"}.mdi-server-network-outline::before{content:"\F1C99"}.mdi-server-off::before{content:"\F048F"}.mdi-server-outline::before{content:"\F1C9A"}.mdi-server-plus::before{content:"\F0490"}.mdi-server-plus-outline::before{content:"\F1C9B"}.mdi-server-remove::before{content:"\F0491"}.mdi-server-security::before{content:"\F0492"}.mdi-set-all::before{content:"\F0778"}.mdi-set-center::before{content:"\F0779"}.mdi-set-center-right::before{content:"\F077A"}.mdi-set-left::before{content:"\F077B"}.mdi-set-left-center::before{content:"\F077C"}.mdi-set-left-right::before{content:"\F077D"}.mdi-set-merge::before{content:"\F14E0"}.mdi-set-none::before{content:"\F077E"}.mdi-set-right::before{content:"\F077F"}.mdi-set-split::before{content:"\F14E1"}.mdi-set-square::before{content:"\F145D"}.mdi-set-top-box::before{content:"\F099F"}.mdi-settings-helper::before{content:"\F0A6E"}.mdi-shaker::before{content:"\F110E"}.mdi-shaker-outline::before{content:"\F110F"}.mdi-shape::before{content:"\F0831"}.mdi-shape-circle-plus::before{content:"\F065D"}.mdi-shape-outline::before{content:"\F0832"}.mdi-shape-oval-plus::before{content:"\F11FA"}.mdi-shape-plus::before{content:"\F0495"}.mdi-shape-plus-outline::before{content:"\F1C4F"}.mdi-shape-polygon-plus::before{content:"\F065E"}.mdi-shape-rectangle-plus::before{content:"\F065F"}.mdi-shape-square-plus::before{content:"\F0660"}.mdi-shape-square-rounded-plus::before{content:"\F14FA"}.mdi-share::before{content:"\F0496"}.mdi-share-all::before{content:"\F11F4"}.mdi-share-all-outline::before{content:"\F11F5"}.mdi-share-circle::before{content:"\F11AD"}.mdi-share-off::before{content:"\F0F23"}.mdi-share-off-outline::before{content:"\F0F24"}.mdi-share-outline::before{content:"\F0932"}.mdi-share-variant::before{content:"\F0497"}.mdi-share-variant-outline::before{content:"\F1514"}.mdi-shark::before{content:"\F18BA"}.mdi-shark-fin::before{content:"\F1673"}.mdi-shark-fin-outline::before{content:"\F1674"}.mdi-shark-off::before{content:"\F18BB"}.mdi-sheep::before{content:"\F0CC6"}.mdi-shield::before{content:"\F0498"}.mdi-shield-account::before{content:"\F088F"}.mdi-shield-account-outline::before{content:"\F0A12"}.mdi-shield-account-variant::before{content:"\F15A7"}.mdi-shield-account-variant-outline::before{content:"\F15A8"}.mdi-shield-airplane::before{content:"\F06BB"}.mdi-shield-airplane-outline::before{content:"\F0CC7"}.mdi-shield-alert::before{content:"\F0ECC"}.mdi-shield-alert-outline::before{content:"\F0ECD"}.mdi-shield-bug::before{content:"\F13DA"}.mdi-shield-bug-outline::before{content:"\F13DB"}.mdi-shield-car::before{content:"\F0F83"}.mdi-shield-check::before{content:"\F0565"}.mdi-shield-check-outline::before{content:"\F0CC8"}.mdi-shield-cross::before{content:"\F0CC9"}.mdi-shield-cross-outline::before{content:"\F0CCA"}.mdi-shield-crown::before{content:"\F18BC"}.mdi-shield-crown-outline::before{content:"\F18BD"}.mdi-shield-edit::before{content:"\F11A0"}.mdi-shield-edit-outline::before{content:"\F11A1"}.mdi-shield-half::before{content:"\F1360"}.mdi-shield-half-full::before{content:"\F0780"}.mdi-shield-home::before{content:"\F068A"}.mdi-shield-home-outline::before{content:"\F0CCB"}.mdi-shield-key::before{content:"\F0BC4"}.mdi-shield-key-outline::before{content:"\F0BC5"}.mdi-shield-link-variant::before{content:"\F0D33"}.mdi-shield-link-variant-outline::before{content:"\F0D34"}.mdi-shield-lock::before{content:"\F099D"}.mdi-shield-lock-open::before{content:"\F199A"}.mdi-shield-lock-open-outline::before{content:"\F199B"}.mdi-shield-lock-outline::before{content:"\F0CCC"}.mdi-shield-moon::before{content:"\F1828"}.mdi-shield-moon-outline::before{content:"\F1829"}.mdi-shield-off::before{content:"\F099E"}.mdi-shield-off-outline::before{content:"\F099C"}.mdi-shield-outline::before{content:"\F0499"}.mdi-shield-plus::before{content:"\F0ADA"}.mdi-shield-plus-outline::before{content:"\F0ADB"}.mdi-shield-refresh::before{content:"\F00AA"}.mdi-shield-refresh-outline::before{content:"\F01E0"}.mdi-shield-remove::before{content:"\F0ADC"}.mdi-shield-remove-outline::before{content:"\F0ADD"}.mdi-shield-search::before{content:"\F0D9A"}.mdi-shield-star::before{content:"\F113B"}.mdi-shield-star-outline::before{content:"\F113C"}.mdi-shield-sun::before{content:"\F105D"}.mdi-shield-sun-outline::before{content:"\F105E"}.mdi-shield-sword::before{content:"\F18BE"}.mdi-shield-sword-outline::before{content:"\F18BF"}.mdi-shield-sync::before{content:"\F11A2"}.mdi-shield-sync-outline::before{content:"\F11A3"}.mdi-shimmer::before{content:"\F1545"}.mdi-ship-wheel::before{content:"\F0833"}.mdi-shipping-pallet::before{content:"\F184E"}.mdi-shoe-ballet::before{content:"\F15CA"}.mdi-shoe-cleat::before{content:"\F15C7"}.mdi-shoe-formal::before{content:"\F0B47"}.mdi-shoe-heel::before{content:"\F0B48"}.mdi-shoe-print::before{content:"\F0DFA"}.mdi-shoe-sneaker::before{content:"\F15C8"}.mdi-shopping::before{content:"\F049A"}.mdi-shopping-music::before{content:"\F049B"}.mdi-shopping-outline::before{content:"\F11D5"}.mdi-shopping-search::before{content:"\F0F84"}.mdi-shopping-search-outline::before{content:"\F1A6F"}.mdi-shore::before{content:"\F14F9"}.mdi-shovel::before{content:"\F0710"}.mdi-shovel-off::before{content:"\F0711"}.mdi-shower::before{content:"\F09A0"}.mdi-shower-head::before{content:"\F09A1"}.mdi-shredder::before{content:"\F049C"}.mdi-shuffle::before{content:"\F049D"}.mdi-shuffle-disabled::before{content:"\F049E"}.mdi-shuffle-variant::before{content:"\F049F"}.mdi-shuriken::before{content:"\F137F"}.mdi-sickle::before{content:"\F18C0"}.mdi-sigma::before{content:"\F04A0"}.mdi-sigma-lower::before{content:"\F062B"}.mdi-sign-caution::before{content:"\F04A1"}.mdi-sign-direction::before{content:"\F0781"}.mdi-sign-direction-minus::before{content:"\F1000"}.mdi-sign-direction-plus::before{content:"\F0FDC"}.mdi-sign-direction-remove::before{content:"\F0FDD"}.mdi-sign-language::before{content:"\F1B4D"}.mdi-sign-language-outline::before{content:"\F1B4E"}.mdi-sign-pole::before{content:"\F14F8"}.mdi-sign-real-estate::before{content:"\F1118"}.mdi-sign-text::before{content:"\F0782"}.mdi-sign-yield::before{content:"\F1BAF"}.mdi-signal::before{content:"\F04A2"}.mdi-signal-2g::before{content:"\F0712"}.mdi-signal-3g::before{content:"\F0713"}.mdi-signal-4g::before{content:"\F0714"}.mdi-signal-5g::before{content:"\F0A6F"}.mdi-signal-cellular-1::before{content:"\F08BC"}.mdi-signal-cellular-2::before{content:"\F08BD"}.mdi-signal-cellular-3::before{content:"\F08BE"}.mdi-signal-cellular-outline::before{content:"\F08BF"}.mdi-signal-distance-variant::before{content:"\F0E64"}.mdi-signal-hspa::before{content:"\F0715"}.mdi-signal-hspa-plus::before{content:"\F0716"}.mdi-signal-off::before{content:"\F0783"}.mdi-signal-variant::before{content:"\F060A"}.mdi-signature::before{content:"\F0DFB"}.mdi-signature-freehand::before{content:"\F0DFC"}.mdi-signature-image::before{content:"\F0DFD"}.mdi-signature-text::before{content:"\F0DFE"}.mdi-silo::before{content:"\F1B9F"}.mdi-silo-outline::before{content:"\F0B49"}.mdi-silverware::before{content:"\F04A3"}.mdi-silverware-clean::before{content:"\F0FDE"}.mdi-silverware-fork::before{content:"\F04A4"}.mdi-silverware-fork-knife::before{content:"\F0A70"}.mdi-silverware-spoon::before{content:"\F04A5"}.mdi-silverware-variant::before{content:"\F04A6"}.mdi-sim::before{content:"\F04A7"}.mdi-sim-alert::before{content:"\F04A8"}.mdi-sim-alert-outline::before{content:"\F15D3"}.mdi-sim-off::before{content:"\F04A9"}.mdi-sim-off-outline::before{content:"\F15D4"}.mdi-sim-outline::before{content:"\F15D5"}.mdi-simple-icons::before{content:"\F131D"}.mdi-sina-weibo::before{content:"\F0ADF"}.mdi-sine-wave::before{content:"\F095B"}.mdi-sitemap::before{content:"\F04AA"}.mdi-sitemap-outline::before{content:"\F199C"}.mdi-size-l::before{content:"\F13A6"}.mdi-size-m::before{content:"\F13A5"}.mdi-size-s::before{content:"\F13A4"}.mdi-size-xl::before{content:"\F13A7"}.mdi-size-xs::before{content:"\F13A3"}.mdi-size-xxl::before{content:"\F13A8"}.mdi-size-xxs::before{content:"\F13A2"}.mdi-size-xxxl::before{content:"\F13A9"}.mdi-skate::before{content:"\F0D35"}.mdi-skate-off::before{content:"\F0699"}.mdi-skateboard::before{content:"\F14C2"}.mdi-skateboarding::before{content:"\F0501"}.mdi-skew-less::before{content:"\F0D36"}.mdi-skew-more::before{content:"\F0D37"}.mdi-ski::before{content:"\F1304"}.mdi-ski-cross-country::before{content:"\F1305"}.mdi-ski-water::before{content:"\F1306"}.mdi-skip-backward::before{content:"\F04AB"}.mdi-skip-backward-outline::before{content:"\F0F25"}.mdi-skip-forward::before{content:"\F04AC"}.mdi-skip-forward-outline::before{content:"\F0F26"}.mdi-skip-next::before{content:"\F04AD"}.mdi-skip-next-circle::before{content:"\F0661"}.mdi-skip-next-circle-outline::before{content:"\F0662"}.mdi-skip-next-outline::before{content:"\F0F27"}.mdi-skip-previous::before{content:"\F04AE"}.mdi-skip-previous-circle::before{content:"\F0663"}.mdi-skip-previous-circle-outline::before{content:"\F0664"}.mdi-skip-previous-outline::before{content:"\F0F28"}.mdi-skull::before{content:"\F068C"}.mdi-skull-crossbones::before{content:"\F0BC6"}.mdi-skull-crossbones-outline::before{content:"\F0BC7"}.mdi-skull-outline::before{content:"\F0BC8"}.mdi-skull-scan::before{content:"\F14C7"}.mdi-skull-scan-outline::before{content:"\F14C8"}.mdi-skype::before{content:"\F04AF"}.mdi-skype-business::before{content:"\F04B0"}.mdi-slack::before{content:"\F04B1"}.mdi-slash-forward::before{content:"\F0FDF"}.mdi-slash-forward-box::before{content:"\F0FE0"}.mdi-sledding::before{content:"\F041B"}.mdi-sleep::before{content:"\F04B2"}.mdi-sleep-off::before{content:"\F04B3"}.mdi-slide::before{content:"\F15A5"}.mdi-slope-downhill::before{content:"\F0DFF"}.mdi-slope-uphill::before{content:"\F0E00"}.mdi-slot-machine::before{content:"\F1114"}.mdi-slot-machine-outline::before{content:"\F1115"}.mdi-smart-card::before{content:"\F10BD"}.mdi-smart-card-off::before{content:"\F18F7"}.mdi-smart-card-off-outline::before{content:"\F18F8"}.mdi-smart-card-outline::before{content:"\F10BE"}.mdi-smart-card-reader::before{content:"\F10BF"}.mdi-smart-card-reader-outline::before{content:"\F10C0"}.mdi-smog::before{content:"\F0A71"}.mdi-smoke::before{content:"\F1799"}.mdi-smoke-detector::before{content:"\F0392"}.mdi-smoke-detector-alert::before{content:"\F192E"}.mdi-smoke-detector-alert-outline::before{content:"\F192F"}.mdi-smoke-detector-off::before{content:"\F1809"}.mdi-smoke-detector-off-outline::before{content:"\F180A"}.mdi-smoke-detector-outline::before{content:"\F1808"}.mdi-smoke-detector-variant::before{content:"\F180B"}.mdi-smoke-detector-variant-alert::before{content:"\F1930"}.mdi-smoke-detector-variant-off::before{content:"\F180C"}.mdi-smoking::before{content:"\F04B4"}.mdi-smoking-off::before{content:"\F04B5"}.mdi-smoking-pipe::before{content:"\F140D"}.mdi-smoking-pipe-off::before{content:"\F1428"}.mdi-snail::before{content:"\F1677"}.mdi-snake::before{content:"\F150E"}.mdi-snapchat::before{content:"\F04B6"}.mdi-snowboard::before{content:"\F1307"}.mdi-snowflake::before{content:"\F0717"}.mdi-snowflake-alert::before{content:"\F0F29"}.mdi-snowflake-check::before{content:"\F1A70"}.mdi-snowflake-melt::before{content:"\F12CB"}.mdi-snowflake-off::before{content:"\F14E3"}.mdi-snowflake-thermometer::before{content:"\F1A71"}.mdi-snowflake-variant::before{content:"\F0F2A"}.mdi-snowman::before{content:"\F04B7"}.mdi-snowmobile::before{content:"\F06DD"}.mdi-snowshoeing::before{content:"\F1A72"}.mdi-soccer::before{content:"\F04B8"}.mdi-soccer-field::before{content:"\F0834"}.mdi-social-distance-2-meters::before{content:"\F1579"}.mdi-social-distance-6-feet::before{content:"\F157A"}.mdi-sofa::before{content:"\F04B9"}.mdi-sofa-outline::before{content:"\F156D"}.mdi-sofa-single::before{content:"\F156E"}.mdi-sofa-single-outline::before{content:"\F156F"}.mdi-solar-panel::before{content:"\F0D9B"}.mdi-solar-panel-large::before{content:"\F0D9C"}.mdi-solar-power::before{content:"\F0A72"}.mdi-solar-power-variant::before{content:"\F1A73"}.mdi-solar-power-variant-outline::before{content:"\F1A74"}.mdi-soldering-iron::before{content:"\F1092"}.mdi-solid::before{content:"\F068D"}.mdi-sony-playstation::before{content:"\F0414"}.mdi-sort::before{content:"\F04BA"}.mdi-sort-alphabetical-ascending::before{content:"\F05BD"}.mdi-sort-alphabetical-ascending-variant::before{content:"\F1148"}.mdi-sort-alphabetical-descending::before{content:"\F05BF"}.mdi-sort-alphabetical-descending-variant::before{content:"\F1149"}.mdi-sort-alphabetical-variant::before{content:"\F04BB"}.mdi-sort-ascending::before{content:"\F04BC"}.mdi-sort-bool-ascending::before{content:"\F1385"}.mdi-sort-bool-ascending-variant::before{content:"\F1386"}.mdi-sort-bool-descending::before{content:"\F1387"}.mdi-sort-bool-descending-variant::before{content:"\F1388"}.mdi-sort-calendar-ascending::before{content:"\F1547"}.mdi-sort-calendar-descending::before{content:"\F1548"}.mdi-sort-clock-ascending::before{content:"\F1549"}.mdi-sort-clock-ascending-outline::before{content:"\F154A"}.mdi-sort-clock-descending::before{content:"\F154B"}.mdi-sort-clock-descending-outline::before{content:"\F154C"}.mdi-sort-descending::before{content:"\F04BD"}.mdi-sort-numeric-ascending::before{content:"\F1389"}.mdi-sort-numeric-ascending-variant::before{content:"\F090D"}.mdi-sort-numeric-descending::before{content:"\F138A"}.mdi-sort-numeric-descending-variant::before{content:"\F0AD2"}.mdi-sort-numeric-variant::before{content:"\F04BE"}.mdi-sort-reverse-variant::before{content:"\F033C"}.mdi-sort-variant::before{content:"\F04BF"}.mdi-sort-variant-lock::before{content:"\F0CCD"}.mdi-sort-variant-lock-open::before{content:"\F0CCE"}.mdi-sort-variant-off::before{content:"\F1ABB"}.mdi-sort-variant-remove::before{content:"\F1147"}.mdi-soundbar::before{content:"\F17DB"}.mdi-soundcloud::before{content:"\F04C0"}.mdi-source-branch::before{content:"\F062C"}.mdi-source-branch-check::before{content:"\F14CF"}.mdi-source-branch-minus::before{content:"\F14CB"}.mdi-source-branch-plus::before{content:"\F14CA"}.mdi-source-branch-refresh::before{content:"\F14CD"}.mdi-source-branch-remove::before{content:"\F14CC"}.mdi-source-branch-sync::before{content:"\F14CE"}.mdi-source-commit::before{content:"\F0718"}.mdi-source-commit-end::before{content:"\F0719"}.mdi-source-commit-end-local::before{content:"\F071A"}.mdi-source-commit-local::before{content:"\F071B"}.mdi-source-commit-next-local::before{content:"\F071C"}.mdi-source-commit-start::before{content:"\F071D"}.mdi-source-commit-start-next-local::before{content:"\F071E"}.mdi-source-fork::before{content:"\F04C1"}.mdi-source-merge::before{content:"\F062D"}.mdi-source-pull::before{content:"\F04C2"}.mdi-source-repository::before{content:"\F0CCF"}.mdi-source-repository-multiple::before{content:"\F0CD0"}.mdi-soy-sauce::before{content:"\F07EE"}.mdi-soy-sauce-off::before{content:"\F13FC"}.mdi-spa::before{content:"\F0CD1"}.mdi-spa-outline::before{content:"\F0CD2"}.mdi-space-invaders::before{content:"\F0BC9"}.mdi-space-station::before{content:"\F1383"}.mdi-spade::before{content:"\F0E65"}.mdi-speaker::before{content:"\F04C3"}.mdi-speaker-bluetooth::before{content:"\F09A2"}.mdi-speaker-message::before{content:"\F1B11"}.mdi-speaker-multiple::before{content:"\F0D38"}.mdi-speaker-off::before{content:"\F04C4"}.mdi-speaker-pause::before{content:"\F1B73"}.mdi-speaker-play::before{content:"\F1B72"}.mdi-speaker-stop::before{content:"\F1B74"}.mdi-speaker-wireless::before{content:"\F071F"}.mdi-spear::before{content:"\F1845"}.mdi-speedometer::before{content:"\F04C5"}.mdi-speedometer-medium::before{content:"\F0F85"}.mdi-speedometer-slow::before{content:"\F0F86"}.mdi-spellcheck::before{content:"\F04C6"}.mdi-sphere::before{content:"\F1954"}.mdi-sphere-off::before{content:"\F1955"}.mdi-spider::before{content:"\F11EA"}.mdi-spider-outline::before{content:"\F1C75"}.mdi-spider-thread::before{content:"\F11EB"}.mdi-spider-web::before{content:"\F0BCA"}.mdi-spirit-level::before{content:"\F14F1"}.mdi-spoon-sugar::before{content:"\F1429"}.mdi-spotify::before{content:"\F04C7"}.mdi-spotlight::before{content:"\F04C8"}.mdi-spotlight-beam::before{content:"\F04C9"}.mdi-spray::before{content:"\F0665"}.mdi-spray-bottle::before{content:"\F0AE0"}.mdi-sprinkler::before{content:"\F105F"}.mdi-sprinkler-fire::before{content:"\F199D"}.mdi-sprinkler-variant::before{content:"\F1060"}.mdi-sprout::before{content:"\F0E66"}.mdi-sprout-outline::before{content:"\F0E67"}.mdi-square::before{content:"\F0764"}.mdi-square-circle::before{content:"\F1500"}.mdi-square-circle-outline::before{content:"\F1C50"}.mdi-square-edit-outline::before{content:"\F090C"}.mdi-square-medium::before{content:"\F0A13"}.mdi-square-medium-outline::before{content:"\F0A14"}.mdi-square-off::before{content:"\F12EE"}.mdi-square-off-outline::before{content:"\F12EF"}.mdi-square-opacity::before{content:"\F1854"}.mdi-square-outline::before{content:"\F0763"}.mdi-square-root::before{content:"\F0784"}.mdi-square-root-box::before{content:"\F09A3"}.mdi-square-rounded::before{content:"\F14FB"}.mdi-square-rounded-badge::before{content:"\F1A07"}.mdi-square-rounded-badge-outline::before{content:"\F1A08"}.mdi-square-rounded-outline::before{content:"\F14FC"}.mdi-square-small::before{content:"\F0A15"}.mdi-square-wave::before{content:"\F147B"}.mdi-squeegee::before{content:"\F0AE1"}.mdi-ssh::before{content:"\F08C0"}.mdi-stack-exchange::before{content:"\F060B"}.mdi-stack-overflow::before{content:"\F04CC"}.mdi-stackpath::before{content:"\F0359"}.mdi-stadium::before{content:"\F0FF9"}.mdi-stadium-outline::before{content:"\F1B03"}.mdi-stadium-variant::before{content:"\F0720"}.mdi-stairs::before{content:"\F04CD"}.mdi-stairs-box::before{content:"\F139E"}.mdi-stairs-down::before{content:"\F12BE"}.mdi-stairs-up::before{content:"\F12BD"}.mdi-stamper::before{content:"\F0D39"}.mdi-standard-definition::before{content:"\F07EF"}.mdi-star::before{content:"\F04CE"}.mdi-star-box::before{content:"\F0A73"}.mdi-star-box-multiple::before{content:"\F1286"}.mdi-star-box-multiple-outline::before{content:"\F1287"}.mdi-star-box-outline::before{content:"\F0A74"}.mdi-star-check::before{content:"\F1566"}.mdi-star-check-outline::before{content:"\F156A"}.mdi-star-circle::before{content:"\F04CF"}.mdi-star-circle-outline::before{content:"\F09A4"}.mdi-star-cog::before{content:"\F1668"}.mdi-star-cog-outline::before{content:"\F1669"}.mdi-star-crescent::before{content:"\F0979"}.mdi-star-david::before{content:"\F097A"}.mdi-star-face::before{content:"\F09A5"}.mdi-star-four-points::before{content:"\F0AE2"}.mdi-star-four-points-box::before{content:"\F1C51"}.mdi-star-four-points-box-outline::before{content:"\F1C52"}.mdi-star-four-points-circle::before{content:"\F1C53"}.mdi-star-four-points-circle-outline::before{content:"\F1C54"}.mdi-star-four-points-outline::before{content:"\F0AE3"}.mdi-star-four-points-small::before{content:"\F1C55"}.mdi-star-half::before{content:"\F0246"}.mdi-star-half-full::before{content:"\F04D0"}.mdi-star-minus::before{content:"\F1564"}.mdi-star-minus-outline::before{content:"\F1568"}.mdi-star-off::before{content:"\F04D1"}.mdi-star-off-outline::before{content:"\F155B"}.mdi-star-outline::before{content:"\F04D2"}.mdi-star-plus::before{content:"\F1563"}.mdi-star-plus-outline::before{content:"\F1567"}.mdi-star-remove::before{content:"\F1565"}.mdi-star-remove-outline::before{content:"\F1569"}.mdi-star-settings::before{content:"\F166A"}.mdi-star-settings-outline::before{content:"\F166B"}.mdi-star-shooting::before{content:"\F1741"}.mdi-star-shooting-outline::before{content:"\F1742"}.mdi-star-three-points::before{content:"\F0AE4"}.mdi-star-three-points-outline::before{content:"\F0AE5"}.mdi-state-machine::before{content:"\F11EF"}.mdi-steam::before{content:"\F04D3"}.mdi-steering::before{content:"\F04D4"}.mdi-steering-off::before{content:"\F090E"}.mdi-step-backward::before{content:"\F04D5"}.mdi-step-backward-2::before{content:"\F04D6"}.mdi-step-forward::before{content:"\F04D7"}.mdi-step-forward-2::before{content:"\F04D8"}.mdi-stethoscope::before{content:"\F04D9"}.mdi-sticker::before{content:"\F1364"}.mdi-sticker-alert::before{content:"\F1365"}.mdi-sticker-alert-outline::before{content:"\F1366"}.mdi-sticker-check::before{content:"\F1367"}.mdi-sticker-check-outline::before{content:"\F1368"}.mdi-sticker-circle-outline::before{content:"\F05D0"}.mdi-sticker-emoji::before{content:"\F0785"}.mdi-sticker-minus::before{content:"\F1369"}.mdi-sticker-minus-outline::before{content:"\F136A"}.mdi-sticker-outline::before{content:"\F136B"}.mdi-sticker-plus::before{content:"\F136C"}.mdi-sticker-plus-outline::before{content:"\F136D"}.mdi-sticker-remove::before{content:"\F136E"}.mdi-sticker-remove-outline::before{content:"\F136F"}.mdi-sticker-text::before{content:"\F178E"}.mdi-sticker-text-outline::before{content:"\F178F"}.mdi-stocking::before{content:"\F04DA"}.mdi-stomach::before{content:"\F1093"}.mdi-stool::before{content:"\F195D"}.mdi-stool-outline::before{content:"\F195E"}.mdi-stop::before{content:"\F04DB"}.mdi-stop-circle::before{content:"\F0666"}.mdi-stop-circle-outline::before{content:"\F0667"}.mdi-storage-tank::before{content:"\F1A75"}.mdi-storage-tank-outline::before{content:"\F1A76"}.mdi-store::before{content:"\F04DC"}.mdi-store-24-hour::before{content:"\F04DD"}.mdi-store-alert::before{content:"\F18C1"}.mdi-store-alert-outline::before{content:"\F18C2"}.mdi-store-check::before{content:"\F18C3"}.mdi-store-check-outline::before{content:"\F18C4"}.mdi-store-clock::before{content:"\F18C5"}.mdi-store-clock-outline::before{content:"\F18C6"}.mdi-store-cog::before{content:"\F18C7"}.mdi-store-cog-outline::before{content:"\F18C8"}.mdi-store-edit::before{content:"\F18C9"}.mdi-store-edit-outline::before{content:"\F18CA"}.mdi-store-marker::before{content:"\F18CB"}.mdi-store-marker-outline::before{content:"\F18CC"}.mdi-store-minus::before{content:"\F165E"}.mdi-store-minus-outline::before{content:"\F18CD"}.mdi-store-off::before{content:"\F18CE"}.mdi-store-off-outline::before{content:"\F18CF"}.mdi-store-outline::before{content:"\F1361"}.mdi-store-plus::before{content:"\F165F"}.mdi-store-plus-outline::before{content:"\F18D0"}.mdi-store-remove::before{content:"\F1660"}.mdi-store-remove-outline::before{content:"\F18D1"}.mdi-store-search::before{content:"\F18D2"}.mdi-store-search-outline::before{content:"\F18D3"}.mdi-store-settings::before{content:"\F18D4"}.mdi-store-settings-outline::before{content:"\F18D5"}.mdi-storefront::before{content:"\F07C7"}.mdi-storefront-check::before{content:"\F1B7D"}.mdi-storefront-check-outline::before{content:"\F1B7E"}.mdi-storefront-edit::before{content:"\F1B7F"}.mdi-storefront-edit-outline::before{content:"\F1B80"}.mdi-storefront-minus::before{content:"\F1B83"}.mdi-storefront-minus-outline::before{content:"\F1B84"}.mdi-storefront-outline::before{content:"\F10C1"}.mdi-storefront-plus::before{content:"\F1B81"}.mdi-storefront-plus-outline::before{content:"\F1B82"}.mdi-storefront-remove::before{content:"\F1B85"}.mdi-storefront-remove-outline::before{content:"\F1B86"}.mdi-stove::before{content:"\F04DE"}.mdi-strategy::before{content:"\F11D6"}.mdi-stretch-to-page::before{content:"\F0F2B"}.mdi-stretch-to-page-outline::before{content:"\F0F2C"}.mdi-string-lights::before{content:"\F12BA"}.mdi-string-lights-off::before{content:"\F12BB"}.mdi-subdirectory-arrow-left::before{content:"\F060C"}.mdi-subdirectory-arrow-right::before{content:"\F060D"}.mdi-submarine::before{content:"\F156C"}.mdi-subtitles::before{content:"\F0A16"}.mdi-subtitles-outline::before{content:"\F0A17"}.mdi-subway::before{content:"\F06AC"}.mdi-subway-alert-variant::before{content:"\F0D9D"}.mdi-subway-variant::before{content:"\F04DF"}.mdi-summit::before{content:"\F0786"}.mdi-sun-angle::before{content:"\F1B27"}.mdi-sun-angle-outline::before{content:"\F1B28"}.mdi-sun-clock::before{content:"\F1A77"}.mdi-sun-clock-outline::before{content:"\F1A78"}.mdi-sun-compass::before{content:"\F19A5"}.mdi-sun-snowflake::before{content:"\F1796"}.mdi-sun-snowflake-variant::before{content:"\F1A79"}.mdi-sun-thermometer::before{content:"\F18D6"}.mdi-sun-thermometer-outline::before{content:"\F18D7"}.mdi-sun-wireless::before{content:"\F17FE"}.mdi-sun-wireless-outline::before{content:"\F17FF"}.mdi-sunglasses::before{content:"\F04E0"}.mdi-surfing::before{content:"\F1746"}.mdi-surround-sound::before{content:"\F05C5"}.mdi-surround-sound-2-0::before{content:"\F07F0"}.mdi-surround-sound-2-1::before{content:"\F1729"}.mdi-surround-sound-3-1::before{content:"\F07F1"}.mdi-surround-sound-5-1::before{content:"\F07F2"}.mdi-surround-sound-5-1-2::before{content:"\F172A"}.mdi-surround-sound-7-1::before{content:"\F07F3"}.mdi-svg::before{content:"\F0721"}.mdi-swap-horizontal::before{content:"\F04E1"}.mdi-swap-horizontal-bold::before{content:"\F0BCD"}.mdi-swap-horizontal-circle::before{content:"\F0FE1"}.mdi-swap-horizontal-circle-outline::before{content:"\F0FE2"}.mdi-swap-horizontal-hidden::before{content:"\F1D0E"}.mdi-swap-horizontal-variant::before{content:"\F08C1"}.mdi-swap-vertical::before{content:"\F04E2"}.mdi-swap-vertical-bold::before{content:"\F0BCE"}.mdi-swap-vertical-circle::before{content:"\F0FE3"}.mdi-swap-vertical-circle-outline::before{content:"\F0FE4"}.mdi-swap-vertical-variant::before{content:"\F08C2"}.mdi-swim::before{content:"\F04E3"}.mdi-switch::before{content:"\F04E4"}.mdi-sword::before{content:"\F04E5"}.mdi-sword-cross::before{content:"\F0787"}.mdi-syllabary-hangul::before{content:"\F1333"}.mdi-syllabary-hiragana::before{content:"\F1334"}.mdi-syllabary-katakana::before{content:"\F1335"}.mdi-syllabary-katakana-halfwidth::before{content:"\F1336"}.mdi-symbol::before{content:"\F1501"}.mdi-symfony::before{content:"\F0AE6"}.mdi-synagogue::before{content:"\F1B04"}.mdi-synagogue-outline::before{content:"\F1B05"}.mdi-sync::before{content:"\F04E6"}.mdi-sync-alert::before{content:"\F04E7"}.mdi-sync-circle::before{content:"\F1378"}.mdi-sync-off::before{content:"\F04E8"}.mdi-tab::before{content:"\F04E9"}.mdi-tab-minus::before{content:"\F0B4B"}.mdi-tab-plus::before{content:"\F075C"}.mdi-tab-remove::before{content:"\F0B4C"}.mdi-tab-search::before{content:"\F199E"}.mdi-tab-unselected::before{content:"\F04EA"}.mdi-table::before{content:"\F04EB"}.mdi-table-account::before{content:"\F13B9"}.mdi-table-alert::before{content:"\F13BA"}.mdi-table-arrow-down::before{content:"\F13BB"}.mdi-table-arrow-left::before{content:"\F13BC"}.mdi-table-arrow-right::before{content:"\F13BD"}.mdi-table-arrow-up::before{content:"\F13BE"}.mdi-table-border::before{content:"\F0A18"}.mdi-table-cancel::before{content:"\F13BF"}.mdi-table-chair::before{content:"\F1061"}.mdi-table-check::before{content:"\F13C0"}.mdi-table-clock::before{content:"\F13C1"}.mdi-table-cog::before{content:"\F13C2"}.mdi-table-column::before{content:"\F0835"}.mdi-table-column-plus-after::before{content:"\F04EC"}.mdi-table-column-plus-before::before{content:"\F04ED"}.mdi-table-column-remove::before{content:"\F04EE"}.mdi-table-column-width::before{content:"\F04EF"}.mdi-table-edit::before{content:"\F04F0"}.mdi-table-eye::before{content:"\F1094"}.mdi-table-eye-off::before{content:"\F13C3"}.mdi-table-filter::before{content:"\F1B8C"}.mdi-table-furniture::before{content:"\F05BC"}.mdi-table-headers-eye::before{content:"\F121D"}.mdi-table-headers-eye-off::before{content:"\F121E"}.mdi-table-heart::before{content:"\F13C4"}.mdi-table-key::before{content:"\F13C5"}.mdi-table-large::before{content:"\F04F1"}.mdi-table-large-plus::before{content:"\F0F87"}.mdi-table-large-remove::before{content:"\F0F88"}.mdi-table-lock::before{content:"\F13C6"}.mdi-table-merge-cells::before{content:"\F09A6"}.mdi-table-minus::before{content:"\F13C7"}.mdi-table-multiple::before{content:"\F13C8"}.mdi-table-network::before{content:"\F13C9"}.mdi-table-of-contents::before{content:"\F0836"}.mdi-table-off::before{content:"\F13CA"}.mdi-table-picnic::before{content:"\F1743"}.mdi-table-pivot::before{content:"\F183C"}.mdi-table-plus::before{content:"\F0A75"}.mdi-table-question::before{content:"\F1B21"}.mdi-table-refresh::before{content:"\F13A0"}.mdi-table-remove::before{content:"\F0A76"}.mdi-table-row::before{content:"\F0837"}.mdi-table-row-height::before{content:"\F04F2"}.mdi-table-row-plus-after::before{content:"\F04F3"}.mdi-table-row-plus-before::before{content:"\F04F4"}.mdi-table-row-remove::before{content:"\F04F5"}.mdi-table-search::before{content:"\F090F"}.mdi-table-settings::before{content:"\F0838"}.mdi-table-split-cell::before{content:"\F142A"}.mdi-table-star::before{content:"\F13CB"}.mdi-table-sync::before{content:"\F13A1"}.mdi-table-tennis::before{content:"\F0E68"}.mdi-tablet::before{content:"\F04F6"}.mdi-tablet-cellphone::before{content:"\F09A7"}.mdi-tablet-dashboard::before{content:"\F0ECE"}.mdi-taco::before{content:"\F0762"}.mdi-tag::before{content:"\F04F9"}.mdi-tag-arrow-down::before{content:"\F172B"}.mdi-tag-arrow-down-outline::before{content:"\F172C"}.mdi-tag-arrow-left::before{content:"\F172D"}.mdi-tag-arrow-left-outline::before{content:"\F172E"}.mdi-tag-arrow-right::before{content:"\F172F"}.mdi-tag-arrow-right-outline::before{content:"\F1730"}.mdi-tag-arrow-up::before{content:"\F1731"}.mdi-tag-arrow-up-outline::before{content:"\F1732"}.mdi-tag-check::before{content:"\F1A7A"}.mdi-tag-check-outline::before{content:"\F1A7B"}.mdi-tag-edit::before{content:"\F1C9C"}.mdi-tag-edit-outline::before{content:"\F1C9D"}.mdi-tag-faces::before{content:"\F04FA"}.mdi-tag-heart::before{content:"\F068B"}.mdi-tag-heart-outline::before{content:"\F0BCF"}.mdi-tag-hidden::before{content:"\F1C76"}.mdi-tag-minus::before{content:"\F0910"}.mdi-tag-minus-outline::before{content:"\F121F"}.mdi-tag-multiple::before{content:"\F04FB"}.mdi-tag-multiple-outline::before{content:"\F12F7"}.mdi-tag-off::before{content:"\F1220"}.mdi-tag-off-outline::before{content:"\F1221"}.mdi-tag-outline::before{content:"\F04FC"}.mdi-tag-plus::before{content:"\F0722"}.mdi-tag-plus-outline::before{content:"\F1222"}.mdi-tag-remove::before{content:"\F0723"}.mdi-tag-remove-outline::before{content:"\F1223"}.mdi-tag-search::before{content:"\F1907"}.mdi-tag-search-outline::before{content:"\F1908"}.mdi-tag-text::before{content:"\F1224"}.mdi-tag-text-outline::before{content:"\F04FD"}.mdi-tailwind::before{content:"\F13FF"}.mdi-tally-mark-1::before{content:"\F1ABC"}.mdi-tally-mark-2::before{content:"\F1ABD"}.mdi-tally-mark-3::before{content:"\F1ABE"}.mdi-tally-mark-4::before{content:"\F1ABF"}.mdi-tally-mark-5::before{content:"\F1AC0"}.mdi-tangram::before{content:"\F04F8"}.mdi-tank::before{content:"\F0D3A"}.mdi-tanker-truck::before{content:"\F0FE5"}.mdi-tape-drive::before{content:"\F16DF"}.mdi-tape-measure::before{content:"\F0B4D"}.mdi-target::before{content:"\F04FE"}.mdi-target-account::before{content:"\F0BD0"}.mdi-target-variant::before{content:"\F0A77"}.mdi-taxi::before{content:"\F04FF"}.mdi-tea::before{content:"\F0D9E"}.mdi-tea-outline::before{content:"\F0D9F"}.mdi-teamviewer::before{content:"\F0500"}.mdi-teddy-bear::before{content:"\F18FB"}.mdi-telescope::before{content:"\F0B4E"}.mdi-television::before{content:"\F0502"}.mdi-television-ambient-light::before{content:"\F1356"}.mdi-television-box::before{content:"\F0839"}.mdi-television-classic::before{content:"\F07F4"}.mdi-television-classic-off::before{content:"\F083A"}.mdi-television-guide::before{content:"\F0503"}.mdi-television-off::before{content:"\F083B"}.mdi-television-pause::before{content:"\F0F89"}.mdi-television-play::before{content:"\F0ECF"}.mdi-television-shimmer::before{content:"\F1110"}.mdi-television-speaker::before{content:"\F1B1B"}.mdi-television-speaker-off::before{content:"\F1B1C"}.mdi-television-stop::before{content:"\F0F8A"}.mdi-temperature-celsius::before{content:"\F0504"}.mdi-temperature-fahrenheit::before{content:"\F0505"}.mdi-temperature-kelvin::before{content:"\F0506"}.mdi-temple-buddhist::before{content:"\F1B06"}.mdi-temple-buddhist-outline::before{content:"\F1B07"}.mdi-temple-hindu::before{content:"\F1B08"}.mdi-temple-hindu-outline::before{content:"\F1B09"}.mdi-tennis::before{content:"\F0DA0"}.mdi-tennis-ball::before{content:"\F0507"}.mdi-tennis-ball-outline::before{content:"\F1C5F"}.mdi-tent::before{content:"\F0508"}.mdi-terraform::before{content:"\F1062"}.mdi-terrain::before{content:"\F0509"}.mdi-test-tube::before{content:"\F0668"}.mdi-test-tube-empty::before{content:"\F0911"}.mdi-test-tube-off::before{content:"\F0912"}.mdi-text::before{content:"\F09A8"}.mdi-text-account::before{content:"\F1570"}.mdi-text-box::before{content:"\F021A"}.mdi-text-box-check::before{content:"\F0EA6"}.mdi-text-box-check-outline::before{content:"\F0EA7"}.mdi-text-box-edit::before{content:"\F1A7C"}.mdi-text-box-edit-outline::before{content:"\F1A7D"}.mdi-text-box-minus::before{content:"\F0EA8"}.mdi-text-box-minus-outline::before{content:"\F0EA9"}.mdi-text-box-multiple::before{content:"\F0AB7"}.mdi-text-box-multiple-outline::before{content:"\F0AB8"}.mdi-text-box-outline::before{content:"\F09ED"}.mdi-text-box-plus::before{content:"\F0EAA"}.mdi-text-box-plus-outline::before{content:"\F0EAB"}.mdi-text-box-remove::before{content:"\F0EAC"}.mdi-text-box-remove-outline::before{content:"\F0EAD"}.mdi-text-box-search::before{content:"\F0EAE"}.mdi-text-box-search-outline::before{content:"\F0EAF"}.mdi-text-long::before{content:"\F09AA"}.mdi-text-recognition::before{content:"\F113D"}.mdi-text-search::before{content:"\F13B8"}.mdi-text-search-variant::before{content:"\F1A7E"}.mdi-text-shadow::before{content:"\F0669"}.mdi-text-short::before{content:"\F09A9"}.mdi-texture::before{content:"\F050C"}.mdi-texture-box::before{content:"\F0FE6"}.mdi-theater::before{content:"\F050D"}.mdi-theme-light-dark::before{content:"\F050E"}.mdi-thermometer::before{content:"\F050F"}.mdi-thermometer-alert::before{content:"\F0E01"}.mdi-thermometer-auto::before{content:"\F1B0F"}.mdi-thermometer-bluetooth::before{content:"\F1895"}.mdi-thermometer-check::before{content:"\F1A7F"}.mdi-thermometer-chevron-down::before{content:"\F0E02"}.mdi-thermometer-chevron-up::before{content:"\F0E03"}.mdi-thermometer-high::before{content:"\F10C2"}.mdi-thermometer-lines::before{content:"\F0510"}.mdi-thermometer-low::before{content:"\F10C3"}.mdi-thermometer-minus::before{content:"\F0E04"}.mdi-thermometer-off::before{content:"\F1531"}.mdi-thermometer-plus::before{content:"\F0E05"}.mdi-thermometer-probe::before{content:"\F1B2B"}.mdi-thermometer-probe-off::before{content:"\F1B2C"}.mdi-thermometer-water::before{content:"\F1A80"}.mdi-thermostat::before{content:"\F0393"}.mdi-thermostat-auto::before{content:"\F1B17"}.mdi-thermostat-box::before{content:"\F0891"}.mdi-thermostat-box-auto::before{content:"\F1B18"}.mdi-thermostat-cog::before{content:"\F1C80"}.mdi-thought-bubble::before{content:"\F07F6"}.mdi-thought-bubble-outline::before{content:"\F07F7"}.mdi-thumb-down::before{content:"\F0511"}.mdi-thumb-down-outline::before{content:"\F0512"}.mdi-thumb-up::before{content:"\F0513"}.mdi-thumb-up-outline::before{content:"\F0514"}.mdi-thumbs-up-down::before{content:"\F0515"}.mdi-thumbs-up-down-outline::before{content:"\F1914"}.mdi-ticket::before{content:"\F0516"}.mdi-ticket-account::before{content:"\F0517"}.mdi-ticket-confirmation::before{content:"\F0518"}.mdi-ticket-confirmation-outline::before{content:"\F13AA"}.mdi-ticket-outline::before{content:"\F0913"}.mdi-ticket-percent::before{content:"\F0724"}.mdi-ticket-percent-outline::before{content:"\F142B"}.mdi-tie::before{content:"\F0519"}.mdi-tilde::before{content:"\F0725"}.mdi-tilde-off::before{content:"\F18F3"}.mdi-timelapse::before{content:"\F051A"}.mdi-timeline::before{content:"\F0BD1"}.mdi-timeline-alert::before{content:"\F0F95"}.mdi-timeline-alert-outline::before{content:"\F0F98"}.mdi-timeline-check::before{content:"\F1532"}.mdi-timeline-check-outline::before{content:"\F1533"}.mdi-timeline-clock::before{content:"\F11FB"}.mdi-timeline-clock-outline::before{content:"\F11FC"}.mdi-timeline-minus::before{content:"\F1534"}.mdi-timeline-minus-outline::before{content:"\F1535"}.mdi-timeline-outline::before{content:"\F0BD2"}.mdi-timeline-plus::before{content:"\F0F96"}.mdi-timeline-plus-outline::before{content:"\F0F97"}.mdi-timeline-question::before{content:"\F0F99"}.mdi-timeline-question-outline::before{content:"\F0F9A"}.mdi-timeline-remove::before{content:"\F1536"}.mdi-timeline-remove-outline::before{content:"\F1537"}.mdi-timeline-text::before{content:"\F0BD3"}.mdi-timeline-text-outline::before{content:"\F0BD4"}.mdi-timer::before{content:"\F13AB"}.mdi-timer-10::before{content:"\F051C"}.mdi-timer-3::before{content:"\F051D"}.mdi-timer-alert::before{content:"\F1ACC"}.mdi-timer-alert-outline::before{content:"\F1ACD"}.mdi-timer-cancel::before{content:"\F1ACE"}.mdi-timer-cancel-outline::before{content:"\F1ACF"}.mdi-timer-check::before{content:"\F1AD0"}.mdi-timer-check-outline::before{content:"\F1AD1"}.mdi-timer-cog::before{content:"\F1925"}.mdi-timer-cog-outline::before{content:"\F1926"}.mdi-timer-edit::before{content:"\F1AD2"}.mdi-timer-edit-outline::before{content:"\F1AD3"}.mdi-timer-lock::before{content:"\F1AD4"}.mdi-timer-lock-open::before{content:"\F1AD5"}.mdi-timer-lock-open-outline::before{content:"\F1AD6"}.mdi-timer-lock-outline::before{content:"\F1AD7"}.mdi-timer-marker::before{content:"\F1AD8"}.mdi-timer-marker-outline::before{content:"\F1AD9"}.mdi-timer-minus::before{content:"\F1ADA"}.mdi-timer-minus-outline::before{content:"\F1ADB"}.mdi-timer-music::before{content:"\F1ADC"}.mdi-timer-music-outline::before{content:"\F1ADD"}.mdi-timer-off::before{content:"\F13AC"}.mdi-timer-off-outline::before{content:"\F051E"}.mdi-timer-outline::before{content:"\F051B"}.mdi-timer-pause::before{content:"\F1ADE"}.mdi-timer-pause-outline::before{content:"\F1ADF"}.mdi-timer-play::before{content:"\F1AE0"}.mdi-timer-play-outline::before{content:"\F1AE1"}.mdi-timer-plus::before{content:"\F1AE2"}.mdi-timer-plus-outline::before{content:"\F1AE3"}.mdi-timer-refresh::before{content:"\F1AE4"}.mdi-timer-refresh-outline::before{content:"\F1AE5"}.mdi-timer-remove::before{content:"\F1AE6"}.mdi-timer-remove-outline::before{content:"\F1AE7"}.mdi-timer-sand::before{content:"\F051F"}.mdi-timer-sand-complete::before{content:"\F199F"}.mdi-timer-sand-empty::before{content:"\F06AD"}.mdi-timer-sand-full::before{content:"\F078C"}.mdi-timer-sand-paused::before{content:"\F19A0"}.mdi-timer-settings::before{content:"\F1923"}.mdi-timer-settings-outline::before{content:"\F1924"}.mdi-timer-star::before{content:"\F1AE8"}.mdi-timer-star-outline::before{content:"\F1AE9"}.mdi-timer-stop::before{content:"\F1AEA"}.mdi-timer-stop-outline::before{content:"\F1AEB"}.mdi-timer-sync::before{content:"\F1AEC"}.mdi-timer-sync-outline::before{content:"\F1AED"}.mdi-timetable::before{content:"\F0520"}.mdi-tire::before{content:"\F1896"}.mdi-toaster::before{content:"\F1063"}.mdi-toaster-off::before{content:"\F11B7"}.mdi-toaster-oven::before{content:"\F0CD3"}.mdi-toggle-switch::before{content:"\F0521"}.mdi-toggle-switch-off::before{content:"\F0522"}.mdi-toggle-switch-off-outline::before{content:"\F0A19"}.mdi-toggle-switch-outline::before{content:"\F0A1A"}.mdi-toggle-switch-variant::before{content:"\F1A25"}.mdi-toggle-switch-variant-off::before{content:"\F1A26"}.mdi-toilet::before{content:"\F09AB"}.mdi-toolbox::before{content:"\F09AC"}.mdi-toolbox-outline::before{content:"\F09AD"}.mdi-tools::before{content:"\F1064"}.mdi-tooltip::before{content:"\F0523"}.mdi-tooltip-account::before{content:"\F000C"}.mdi-tooltip-cellphone::before{content:"\F183B"}.mdi-tooltip-check::before{content:"\F155C"}.mdi-tooltip-check-outline::before{content:"\F155D"}.mdi-tooltip-edit::before{content:"\F0524"}.mdi-tooltip-edit-outline::before{content:"\F12C5"}.mdi-tooltip-image::before{content:"\F0525"}.mdi-tooltip-image-outline::before{content:"\F0BD5"}.mdi-tooltip-minus::before{content:"\F155E"}.mdi-tooltip-minus-outline::before{content:"\F155F"}.mdi-tooltip-outline::before{content:"\F0526"}.mdi-tooltip-plus::before{content:"\F0BD6"}.mdi-tooltip-plus-outline::before{content:"\F0527"}.mdi-tooltip-question::before{content:"\F1BBA"}.mdi-tooltip-question-outline::before{content:"\F1BBB"}.mdi-tooltip-remove::before{content:"\F1560"}.mdi-tooltip-remove-outline::before{content:"\F1561"}.mdi-tooltip-text::before{content:"\F0528"}.mdi-tooltip-text-outline::before{content:"\F0BD7"}.mdi-tooth::before{content:"\F08C3"}.mdi-tooth-outline::before{content:"\F0529"}.mdi-toothbrush::before{content:"\F1129"}.mdi-toothbrush-electric::before{content:"\F112C"}.mdi-toothbrush-paste::before{content:"\F112A"}.mdi-torch::before{content:"\F1606"}.mdi-tortoise::before{content:"\F0D3B"}.mdi-toslink::before{content:"\F12B8"}.mdi-touch-text-outline::before{content:"\F1C60"}.mdi-tournament::before{content:"\F09AE"}.mdi-tow-truck::before{content:"\F083C"}.mdi-tower-beach::before{content:"\F0681"}.mdi-tower-fire::before{content:"\F0682"}.mdi-town-hall::before{content:"\F1875"}.mdi-toy-brick::before{content:"\F1288"}.mdi-toy-brick-marker::before{content:"\F1289"}.mdi-toy-brick-marker-outline::before{content:"\F128A"}.mdi-toy-brick-minus::before{content:"\F128B"}.mdi-toy-brick-minus-outline::before{content:"\F128C"}.mdi-toy-brick-outline::before{content:"\F128D"}.mdi-toy-brick-plus::before{content:"\F128E"}.mdi-toy-brick-plus-outline::before{content:"\F128F"}.mdi-toy-brick-remove::before{content:"\F1290"}.mdi-toy-brick-remove-outline::before{content:"\F1291"}.mdi-toy-brick-search::before{content:"\F1292"}.mdi-toy-brick-search-outline::before{content:"\F1293"}.mdi-track-light::before{content:"\F0914"}.mdi-track-light-off::before{content:"\F1B01"}.mdi-trackpad::before{content:"\F07F8"}.mdi-trackpad-lock::before{content:"\F0933"}.mdi-tractor::before{content:"\F0892"}.mdi-tractor-variant::before{content:"\F14C4"}.mdi-trademark::before{content:"\F0A78"}.mdi-traffic-cone::before{content:"\F137C"}.mdi-traffic-light::before{content:"\F052B"}.mdi-traffic-light-outline::before{content:"\F182A"}.mdi-train::before{content:"\F052C"}.mdi-train-bus::before{content:"\F1CC7"}.mdi-train-car::before{content:"\F0BD8"}.mdi-train-car-autorack::before{content:"\F1B2D"}.mdi-train-car-box::before{content:"\F1B2E"}.mdi-train-car-box-full::before{content:"\F1B2F"}.mdi-train-car-box-open::before{content:"\F1B30"}.mdi-train-car-caboose::before{content:"\F1B31"}.mdi-train-car-centerbeam::before{content:"\F1B32"}.mdi-train-car-centerbeam-full::before{content:"\F1B33"}.mdi-train-car-container::before{content:"\F1B34"}.mdi-train-car-flatbed::before{content:"\F1B35"}.mdi-train-car-flatbed-car::before{content:"\F1B36"}.mdi-train-car-flatbed-tank::before{content:"\F1B37"}.mdi-train-car-gondola::before{content:"\F1B38"}.mdi-train-car-gondola-full::before{content:"\F1B39"}.mdi-train-car-hopper::before{content:"\F1B3A"}.mdi-train-car-hopper-covered::before{content:"\F1B3B"}.mdi-train-car-hopper-full::before{content:"\F1B3C"}.mdi-train-car-intermodal::before{content:"\F1B3D"}.mdi-train-car-passenger::before{content:"\F1733"}.mdi-train-car-passenger-door::before{content:"\F1734"}.mdi-train-car-passenger-door-open::before{content:"\F1735"}.mdi-train-car-passenger-variant::before{content:"\F1736"}.mdi-train-car-tank::before{content:"\F1B3E"}.mdi-train-variant::before{content:"\F08C4"}.mdi-tram::before{content:"\F052D"}.mdi-tram-side::before{content:"\F0FE7"}.mdi-transcribe::before{content:"\F052E"}.mdi-transcribe-close::before{content:"\F052F"}.mdi-transfer::before{content:"\F1065"}.mdi-transfer-down::before{content:"\F0DA1"}.mdi-transfer-left::before{content:"\F0DA2"}.mdi-transfer-right::before{content:"\F0530"}.mdi-transfer-up::before{content:"\F0DA3"}.mdi-transit-connection::before{content:"\F0D3C"}.mdi-transit-connection-horizontal::before{content:"\F1546"}.mdi-transit-connection-variant::before{content:"\F0D3D"}.mdi-transit-detour::before{content:"\F0F8B"}.mdi-transit-skip::before{content:"\F1515"}.mdi-transit-transfer::before{content:"\F06AE"}.mdi-transition::before{content:"\F0915"}.mdi-transition-masked::before{content:"\F0916"}.mdi-translate::before{content:"\F05CA"}.mdi-translate-off::before{content:"\F0E06"}.mdi-translate-variant::before{content:"\F1B99"}.mdi-transmission-tower::before{content:"\F0D3E"}.mdi-transmission-tower-export::before{content:"\F192C"}.mdi-transmission-tower-import::before{content:"\F192D"}.mdi-transmission-tower-off::before{content:"\F19DD"}.mdi-trash-can::before{content:"\F0A79"}.mdi-trash-can-outline::before{content:"\F0A7A"}.mdi-tray::before{content:"\F1294"}.mdi-tray-alert::before{content:"\F1295"}.mdi-tray-arrow-down::before{content:"\F0120"}.mdi-tray-arrow-up::before{content:"\F011D"}.mdi-tray-full::before{content:"\F1296"}.mdi-tray-minus::before{content:"\F1297"}.mdi-tray-plus::before{content:"\F1298"}.mdi-tray-remove::before{content:"\F1299"}.mdi-treasure-chest::before{content:"\F0726"}.mdi-treasure-chest-outline::before{content:"\F1C77"}.mdi-tree::before{content:"\F0531"}.mdi-tree-outline::before{content:"\F0E69"}.mdi-trello::before{content:"\F0532"}.mdi-trending-down::before{content:"\F0533"}.mdi-trending-neutral::before{content:"\F0534"}.mdi-trending-up::before{content:"\F0535"}.mdi-triangle::before{content:"\F0536"}.mdi-triangle-down::before{content:"\F1C56"}.mdi-triangle-down-outline::before{content:"\F1C57"}.mdi-triangle-outline::before{content:"\F0537"}.mdi-triangle-small-down::before{content:"\F1A09"}.mdi-triangle-small-up::before{content:"\F1A0A"}.mdi-triangle-wave::before{content:"\F147C"}.mdi-triforce::before{content:"\F0BD9"}.mdi-trophy::before{content:"\F0538"}.mdi-trophy-award::before{content:"\F0539"}.mdi-trophy-broken::before{content:"\F0DA4"}.mdi-trophy-outline::before{content:"\F053A"}.mdi-trophy-variant::before{content:"\F053B"}.mdi-trophy-variant-outline::before{content:"\F053C"}.mdi-truck::before{content:"\F053D"}.mdi-truck-alert::before{content:"\F19DE"}.mdi-truck-alert-outline::before{content:"\F19DF"}.mdi-truck-cargo-container::before{content:"\F18D8"}.mdi-truck-check::before{content:"\F0CD4"}.mdi-truck-check-outline::before{content:"\F129A"}.mdi-truck-delivery::before{content:"\F053E"}.mdi-truck-delivery-outline::before{content:"\F129B"}.mdi-truck-fast::before{content:"\F0788"}.mdi-truck-fast-outline::before{content:"\F129C"}.mdi-truck-flatbed::before{content:"\F1891"}.mdi-truck-minus::before{content:"\F19AE"}.mdi-truck-minus-outline::before{content:"\F19BD"}.mdi-truck-off-road::before{content:"\F1C9E"}.mdi-truck-off-road-off::before{content:"\F1C9F"}.mdi-truck-outline::before{content:"\F129D"}.mdi-truck-plus::before{content:"\F19AD"}.mdi-truck-plus-outline::before{content:"\F19BC"}.mdi-truck-remove::before{content:"\F19AF"}.mdi-truck-remove-outline::before{content:"\F19BE"}.mdi-truck-snowflake::before{content:"\F19A6"}.mdi-truck-trailer::before{content:"\F0727"}.mdi-trumpet::before{content:"\F1096"}.mdi-tshirt-crew::before{content:"\F0A7B"}.mdi-tshirt-crew-outline::before{content:"\F053F"}.mdi-tshirt-v::before{content:"\F0A7C"}.mdi-tshirt-v-outline::before{content:"\F0540"}.mdi-tsunami::before{content:"\F1A81"}.mdi-tumble-dryer::before{content:"\F0917"}.mdi-tumble-dryer-alert::before{content:"\F11BA"}.mdi-tumble-dryer-off::before{content:"\F11BB"}.mdi-tune::before{content:"\F062E"}.mdi-tune-variant::before{content:"\F1542"}.mdi-tune-vertical::before{content:"\F066A"}.mdi-tune-vertical-variant::before{content:"\F1543"}.mdi-tunnel::before{content:"\F183D"}.mdi-tunnel-outline::before{content:"\F183E"}.mdi-turbine::before{content:"\F1A82"}.mdi-turkey::before{content:"\F171B"}.mdi-turnstile::before{content:"\F0CD5"}.mdi-turnstile-outline::before{content:"\F0CD6"}.mdi-turtle::before{content:"\F0CD7"}.mdi-twitch::before{content:"\F0543"}.mdi-twitter::before{content:"\F0544"}.mdi-two-factor-authentication::before{content:"\F09AF"}.mdi-typewriter::before{content:"\F0F2D"}.mdi-ubisoft::before{content:"\F0BDA"}.mdi-ubuntu::before{content:"\F0548"}.mdi-ufo::before{content:"\F10C4"}.mdi-ufo-outline::before{content:"\F10C5"}.mdi-ultra-high-definition::before{content:"\F07F9"}.mdi-umbraco::before{content:"\F0549"}.mdi-umbrella::before{content:"\F054A"}.mdi-umbrella-beach::before{content:"\F188A"}.mdi-umbrella-beach-outline::before{content:"\F188B"}.mdi-umbrella-closed::before{content:"\F09B0"}.mdi-umbrella-closed-outline::before{content:"\F13E2"}.mdi-umbrella-closed-variant::before{content:"\F13E1"}.mdi-umbrella-outline::before{content:"\F054B"}.mdi-underwear-outline::before{content:"\F1D0F"}.mdi-undo::before{content:"\F054C"}.mdi-undo-variant::before{content:"\F054D"}.mdi-unfold-less-horizontal::before{content:"\F054E"}.mdi-unfold-less-vertical::before{content:"\F0760"}.mdi-unfold-more-horizontal::before{content:"\F054F"}.mdi-unfold-more-vertical::before{content:"\F0761"}.mdi-ungroup::before{content:"\F0550"}.mdi-unicode::before{content:"\F0ED0"}.mdi-unicorn::before{content:"\F15C2"}.mdi-unicorn-variant::before{content:"\F15C3"}.mdi-unicycle::before{content:"\F15E5"}.mdi-unity::before{content:"\F06AF"}.mdi-unreal::before{content:"\F09B1"}.mdi-update::before{content:"\F06B0"}.mdi-upload::before{content:"\F0552"}.mdi-upload-box::before{content:"\F1D10"}.mdi-upload-box-outline::before{content:"\F1D11"}.mdi-upload-circle::before{content:"\F1D12"}.mdi-upload-circle-outline::before{content:"\F1D13"}.mdi-upload-lock::before{content:"\F1373"}.mdi-upload-lock-outline::before{content:"\F1374"}.mdi-upload-multiple::before{content:"\F083D"}.mdi-upload-multiple-outline::before{content:"\F1D14"}.mdi-upload-network::before{content:"\F06F6"}.mdi-upload-network-outline::before{content:"\F0CD8"}.mdi-upload-off::before{content:"\F10C6"}.mdi-upload-off-outline::before{content:"\F10C7"}.mdi-upload-outline::before{content:"\F0E07"}.mdi-usb::before{content:"\F0553"}.mdi-usb-c-port::before{content:"\F1CBF"}.mdi-usb-flash-drive::before{content:"\F129E"}.mdi-usb-flash-drive-outline::before{content:"\F129F"}.mdi-usb-port::before{content:"\F11F0"}.mdi-vacuum::before{content:"\F19A1"}.mdi-vacuum-outline::before{content:"\F19A2"}.mdi-valve::before{content:"\F1066"}.mdi-valve-closed::before{content:"\F1067"}.mdi-valve-open::before{content:"\F1068"}.mdi-van-passenger::before{content:"\F07FA"}.mdi-van-utility::before{content:"\F07FB"}.mdi-vanish::before{content:"\F07FC"}.mdi-vanish-quarter::before{content:"\F1554"}.mdi-vanity-light::before{content:"\F11E1"}.mdi-variable::before{content:"\F0AE7"}.mdi-variable-box::before{content:"\F1111"}.mdi-vector-arrange-above::before{content:"\F0554"}.mdi-vector-arrange-below::before{content:"\F0555"}.mdi-vector-bezier::before{content:"\F0AE8"}.mdi-vector-circle::before{content:"\F0556"}.mdi-vector-circle-variant::before{content:"\F0557"}.mdi-vector-combine::before{content:"\F0558"}.mdi-vector-curve::before{content:"\F0559"}.mdi-vector-difference::before{content:"\F055A"}.mdi-vector-difference-ab::before{content:"\F055B"}.mdi-vector-difference-ba::before{content:"\F055C"}.mdi-vector-ellipse::before{content:"\F0893"}.mdi-vector-intersection::before{content:"\F055D"}.mdi-vector-line::before{content:"\F055E"}.mdi-vector-link::before{content:"\F0FE8"}.mdi-vector-point::before{content:"\F01C4"}.mdi-vector-point-edit::before{content:"\F09E8"}.mdi-vector-point-minus::before{content:"\F1B78"}.mdi-vector-point-plus::before{content:"\F1B79"}.mdi-vector-point-select::before{content:"\F055F"}.mdi-vector-polygon::before{content:"\F0560"}.mdi-vector-polygon-variant::before{content:"\F1856"}.mdi-vector-polyline::before{content:"\F0561"}.mdi-vector-polyline-edit::before{content:"\F1225"}.mdi-vector-polyline-minus::before{content:"\F1226"}.mdi-vector-polyline-plus::before{content:"\F1227"}.mdi-vector-polyline-remove::before{content:"\F1228"}.mdi-vector-radius::before{content:"\F074A"}.mdi-vector-rectangle::before{content:"\F05C6"}.mdi-vector-selection::before{content:"\F0562"}.mdi-vector-square::before{content:"\F0001"}.mdi-vector-square-close::before{content:"\F1857"}.mdi-vector-square-edit::before{content:"\F18D9"}.mdi-vector-square-minus::before{content:"\F18DA"}.mdi-vector-square-open::before{content:"\F1858"}.mdi-vector-square-plus::before{content:"\F18DB"}.mdi-vector-square-remove::before{content:"\F18DC"}.mdi-vector-triangle::before{content:"\F0563"}.mdi-vector-union::before{content:"\F0564"}.mdi-vhs::before{content:"\F0A1B"}.mdi-vibrate::before{content:"\F0566"}.mdi-vibrate-off::before{content:"\F0CD9"}.mdi-video::before{content:"\F0567"}.mdi-video-2d::before{content:"\F1A1C"}.mdi-video-3d::before{content:"\F07FD"}.mdi-video-3d-off::before{content:"\F13D9"}.mdi-video-3d-variant::before{content:"\F0ED1"}.mdi-video-4k-box::before{content:"\F083E"}.mdi-video-account::before{content:"\F0919"}.mdi-video-box::before{content:"\F00FD"}.mdi-video-box-off::before{content:"\F00FE"}.mdi-video-check::before{content:"\F1069"}.mdi-video-check-outline::before{content:"\F106A"}.mdi-video-high-definition::before{content:"\F152E"}.mdi-video-image::before{content:"\F091A"}.mdi-video-input-antenna::before{content:"\F083F"}.mdi-video-input-component::before{content:"\F0840"}.mdi-video-input-hdmi::before{content:"\F0841"}.mdi-video-input-scart::before{content:"\F0F8C"}.mdi-video-input-svideo::before{content:"\F0842"}.mdi-video-marker::before{content:"\F19A9"}.mdi-video-marker-outline::before{content:"\F19AA"}.mdi-video-minus::before{content:"\F09B2"}.mdi-video-minus-outline::before{content:"\F02BA"}.mdi-video-off::before{content:"\F0568"}.mdi-video-off-outline::before{content:"\F0BDB"}.mdi-video-outline::before{content:"\F0BDC"}.mdi-video-plus::before{content:"\F09B3"}.mdi-video-plus-outline::before{content:"\F01D3"}.mdi-video-stabilization::before{content:"\F091B"}.mdi-video-standard-definition::before{content:"\F1CA0"}.mdi-video-switch::before{content:"\F0569"}.mdi-video-switch-outline::before{content:"\F0790"}.mdi-video-vintage::before{content:"\F0A1C"}.mdi-video-wireless::before{content:"\F0ED2"}.mdi-video-wireless-outline::before{content:"\F0ED3"}.mdi-view-agenda::before{content:"\F056A"}.mdi-view-agenda-outline::before{content:"\F11D8"}.mdi-view-array::before{content:"\F056B"}.mdi-view-array-outline::before{content:"\F1485"}.mdi-view-carousel::before{content:"\F056C"}.mdi-view-carousel-outline::before{content:"\F1486"}.mdi-view-column::before{content:"\F056D"}.mdi-view-column-outline::before{content:"\F1487"}.mdi-view-comfy::before{content:"\F0E6A"}.mdi-view-comfy-outline::before{content:"\F1488"}.mdi-view-compact::before{content:"\F0E6B"}.mdi-view-compact-outline::before{content:"\F0E6C"}.mdi-view-dashboard::before{content:"\F056E"}.mdi-view-dashboard-edit::before{content:"\F1947"}.mdi-view-dashboard-edit-outline::before{content:"\F1948"}.mdi-view-dashboard-outline::before{content:"\F0A1D"}.mdi-view-dashboard-variant::before{content:"\F0843"}.mdi-view-dashboard-variant-outline::before{content:"\F1489"}.mdi-view-day::before{content:"\F056F"}.mdi-view-day-outline::before{content:"\F148A"}.mdi-view-gallery::before{content:"\F1888"}.mdi-view-gallery-outline::before{content:"\F1889"}.mdi-view-grid::before{content:"\F0570"}.mdi-view-grid-compact::before{content:"\F1C61"}.mdi-view-grid-outline::before{content:"\F11D9"}.mdi-view-grid-plus::before{content:"\F0F8D"}.mdi-view-grid-plus-outline::before{content:"\F11DA"}.mdi-view-headline::before{content:"\F0571"}.mdi-view-list::before{content:"\F0572"}.mdi-view-list-outline::before{content:"\F148B"}.mdi-view-module::before{content:"\F0573"}.mdi-view-module-outline::before{content:"\F148C"}.mdi-view-parallel::before{content:"\F0728"}.mdi-view-parallel-outline::before{content:"\F148D"}.mdi-view-quilt::before{content:"\F0574"}.mdi-view-quilt-outline::before{content:"\F148E"}.mdi-view-sequential::before{content:"\F0729"}.mdi-view-sequential-outline::before{content:"\F148F"}.mdi-view-split-horizontal::before{content:"\F0BCB"}.mdi-view-split-vertical::before{content:"\F0BCC"}.mdi-view-stream::before{content:"\F0575"}.mdi-view-stream-outline::before{content:"\F1490"}.mdi-view-week::before{content:"\F0576"}.mdi-view-week-outline::before{content:"\F1491"}.mdi-vimeo::before{content:"\F0577"}.mdi-violin::before{content:"\F060F"}.mdi-virtual-reality::before{content:"\F0894"}.mdi-virus::before{content:"\F13B6"}.mdi-virus-off::before{content:"\F18E1"}.mdi-virus-off-outline::before{content:"\F18E2"}.mdi-virus-outline::before{content:"\F13B7"}.mdi-vlc::before{content:"\F057C"}.mdi-voicemail::before{content:"\F057D"}.mdi-volcano::before{content:"\F1A83"}.mdi-volcano-outline::before{content:"\F1A84"}.mdi-volleyball::before{content:"\F09B4"}.mdi-volume-equal::before{content:"\F1B10"}.mdi-volume-high::before{content:"\F057E"}.mdi-volume-low::before{content:"\F057F"}.mdi-volume-medium::before{content:"\F0580"}.mdi-volume-minus::before{content:"\F075E"}.mdi-volume-mute::before{content:"\F075F"}.mdi-volume-off::before{content:"\F0581"}.mdi-volume-plus::before{content:"\F075D"}.mdi-volume-source::before{content:"\F1120"}.mdi-volume-variant-off::before{content:"\F0E08"}.mdi-volume-vibrate::before{content:"\F1121"}.mdi-vote::before{content:"\F0A1F"}.mdi-vote-outline::before{content:"\F0A20"}.mdi-vpn::before{content:"\F0582"}.mdi-vuejs::before{content:"\F0844"}.mdi-vuetify::before{content:"\F0E6D"}.mdi-walk::before{content:"\F0583"}.mdi-wall::before{content:"\F07FE"}.mdi-wall-fire::before{content:"\F1A11"}.mdi-wall-sconce::before{content:"\F091C"}.mdi-wall-sconce-flat::before{content:"\F091D"}.mdi-wall-sconce-flat-outline::before{content:"\F17C9"}.mdi-wall-sconce-flat-variant::before{content:"\F041C"}.mdi-wall-sconce-flat-variant-outline::before{content:"\F17CA"}.mdi-wall-sconce-outline::before{content:"\F17CB"}.mdi-wall-sconce-round::before{content:"\F0748"}.mdi-wall-sconce-round-outline::before{content:"\F17CC"}.mdi-wall-sconce-round-variant::before{content:"\F091E"}.mdi-wall-sconce-round-variant-outline::before{content:"\F17CD"}.mdi-wallet::before{content:"\F0584"}.mdi-wallet-bifold::before{content:"\F1C58"}.mdi-wallet-bifold-outline::before{content:"\F1C59"}.mdi-wallet-giftcard::before{content:"\F0585"}.mdi-wallet-membership::before{content:"\F0586"}.mdi-wallet-outline::before{content:"\F0BDD"}.mdi-wallet-plus::before{content:"\F0F8E"}.mdi-wallet-plus-outline::before{content:"\F0F8F"}.mdi-wallet-travel::before{content:"\F0587"}.mdi-wallpaper::before{content:"\F0E09"}.mdi-wan::before{content:"\F0588"}.mdi-wardrobe::before{content:"\F0F90"}.mdi-wardrobe-outline::before{content:"\F0F91"}.mdi-warehouse::before{content:"\F0F81"}.mdi-washing-machine::before{content:"\F072A"}.mdi-washing-machine-alert::before{content:"\F11BC"}.mdi-washing-machine-off::before{content:"\F11BD"}.mdi-watch::before{content:"\F0589"}.mdi-watch-export::before{content:"\F058A"}.mdi-watch-export-variant::before{content:"\F0895"}.mdi-watch-import::before{content:"\F058B"}.mdi-watch-import-variant::before{content:"\F0896"}.mdi-watch-variant::before{content:"\F0897"}.mdi-watch-vibrate::before{content:"\F06B1"}.mdi-watch-vibrate-off::before{content:"\F0CDA"}.mdi-water::before{content:"\F058C"}.mdi-water-alert::before{content:"\F1502"}.mdi-water-alert-outline::before{content:"\F1503"}.mdi-water-boiler::before{content:"\F0F92"}.mdi-water-boiler-alert::before{content:"\F11B3"}.mdi-water-boiler-auto::before{content:"\F1B98"}.mdi-water-boiler-off::before{content:"\F11B4"}.mdi-water-check::before{content:"\F1504"}.mdi-water-check-outline::before{content:"\F1505"}.mdi-water-circle::before{content:"\F1806"}.mdi-water-minus::before{content:"\F1506"}.mdi-water-minus-outline::before{content:"\F1507"}.mdi-water-off::before{content:"\F058D"}.mdi-water-off-outline::before{content:"\F1508"}.mdi-water-opacity::before{content:"\F1855"}.mdi-water-outline::before{content:"\F0E0A"}.mdi-water-percent::before{content:"\F058E"}.mdi-water-percent-alert::before{content:"\F1509"}.mdi-water-plus::before{content:"\F150A"}.mdi-water-plus-outline::before{content:"\F150B"}.mdi-water-polo::before{content:"\F12A0"}.mdi-water-pump::before{content:"\F058F"}.mdi-water-pump-off::before{content:"\F0F93"}.mdi-water-remove::before{content:"\F150C"}.mdi-water-remove-outline::before{content:"\F150D"}.mdi-water-sync::before{content:"\F17C6"}.mdi-water-thermometer::before{content:"\F1A85"}.mdi-water-thermometer-outline::before{content:"\F1A86"}.mdi-water-well::before{content:"\F106B"}.mdi-water-well-outline::before{content:"\F106C"}.mdi-waterfall::before{content:"\F1849"}.mdi-watering-can::before{content:"\F1481"}.mdi-watering-can-outline::before{content:"\F1482"}.mdi-watermark::before{content:"\F0612"}.mdi-wave::before{content:"\F0F2E"}.mdi-wave-arrow-down::before{content:"\F1CB0"}.mdi-wave-arrow-up::before{content:"\F1CB1"}.mdi-wave-undercurrent::before{content:"\F1CC0"}.mdi-waveform::before{content:"\F147D"}.mdi-waves::before{content:"\F078D"}.mdi-waves-arrow-left::before{content:"\F1859"}.mdi-waves-arrow-right::before{content:"\F185A"}.mdi-waves-arrow-up::before{content:"\F185B"}.mdi-waze::before{content:"\F0BDE"}.mdi-weather-cloudy::before{content:"\F0590"}.mdi-weather-cloudy-alert::before{content:"\F0F2F"}.mdi-weather-cloudy-arrow-right::before{content:"\F0E6E"}.mdi-weather-cloudy-clock::before{content:"\F18F6"}.mdi-weather-dust::before{content:"\F1B5A"}.mdi-weather-fog::before{content:"\F0591"}.mdi-weather-hail::before{content:"\F0592"}.mdi-weather-hazy::before{content:"\F0F30"}.mdi-weather-hurricane::before{content:"\F0898"}.mdi-weather-hurricane-outline::before{content:"\F1C78"}.mdi-weather-lightning::before{content:"\F0593"}.mdi-weather-lightning-rainy::before{content:"\F067E"}.mdi-weather-moonset::before{content:"\F1D15"}.mdi-weather-moonset-down::before{content:"\F1D16"}.mdi-weather-moonset-up::before{content:"\F1D17"}.mdi-weather-night::before{content:"\F0594"}.mdi-weather-night-partly-cloudy::before{content:"\F0F31"}.mdi-weather-partly-cloudy::before{content:"\F0595"}.mdi-weather-partly-lightning::before{content:"\F0F32"}.mdi-weather-partly-rainy::before{content:"\F0F33"}.mdi-weather-partly-snowy::before{content:"\F0F34"}.mdi-weather-partly-snowy-rainy::before{content:"\F0F35"}.mdi-weather-pouring::before{content:"\F0596"}.mdi-weather-rainy::before{content:"\F0597"}.mdi-weather-snowy::before{content:"\F0598"}.mdi-weather-snowy-heavy::before{content:"\F0F36"}.mdi-weather-snowy-rainy::before{content:"\F067F"}.mdi-weather-sunny::before{content:"\F0599"}.mdi-weather-sunny-alert::before{content:"\F0F37"}.mdi-weather-sunny-off::before{content:"\F14E4"}.mdi-weather-sunset::before{content:"\F059A"}.mdi-weather-sunset-down::before{content:"\F059B"}.mdi-weather-sunset-up::before{content:"\F059C"}.mdi-weather-tornado::before{content:"\F0F38"}.mdi-weather-windy::before{content:"\F059D"}.mdi-weather-windy-variant::before{content:"\F059E"}.mdi-web::before{content:"\F059F"}.mdi-web-box::before{content:"\F0F94"}.mdi-web-cancel::before{content:"\F1790"}.mdi-web-check::before{content:"\F0789"}.mdi-web-clock::before{content:"\F124A"}.mdi-web-minus::before{content:"\F10A0"}.mdi-web-off::before{content:"\F0A8E"}.mdi-web-plus::before{content:"\F0033"}.mdi-web-refresh::before{content:"\F1791"}.mdi-web-remove::before{content:"\F0551"}.mdi-web-sync::before{content:"\F1792"}.mdi-webcam::before{content:"\F05A0"}.mdi-webcam-off::before{content:"\F1737"}.mdi-webhook::before{content:"\F062F"}.mdi-webpack::before{content:"\F072B"}.mdi-webrtc::before{content:"\F1248"}.mdi-wechat::before{content:"\F0611"}.mdi-weight::before{content:"\F05A1"}.mdi-weight-gram::before{content:"\F0D3F"}.mdi-weight-kilogram::before{content:"\F05A2"}.mdi-weight-lifter::before{content:"\F115D"}.mdi-weight-pound::before{content:"\F09B5"}.mdi-whatsapp::before{content:"\F05A3"}.mdi-wheel-barrow::before{content:"\F14F2"}.mdi-wheelchair::before{content:"\F1A87"}.mdi-wheelchair-accessibility::before{content:"\F05A4"}.mdi-whistle::before{content:"\F09B6"}.mdi-whistle-outline::before{content:"\F12BC"}.mdi-white-balance-auto::before{content:"\F05A5"}.mdi-white-balance-incandescent::before{content:"\F05A6"}.mdi-white-balance-iridescent::before{content:"\F05A7"}.mdi-white-balance-sunny::before{content:"\F05A8"}.mdi-widgets::before{content:"\F072C"}.mdi-widgets-outline::before{content:"\F1355"}.mdi-wifi::before{content:"\F05A9"}.mdi-wifi-alert::before{content:"\F16B5"}.mdi-wifi-arrow-down::before{content:"\F16B6"}.mdi-wifi-arrow-left::before{content:"\F16B7"}.mdi-wifi-arrow-left-right::before{content:"\F16B8"}.mdi-wifi-arrow-right::before{content:"\F16B9"}.mdi-wifi-arrow-up::before{content:"\F16BA"}.mdi-wifi-arrow-up-down::before{content:"\F16BB"}.mdi-wifi-cancel::before{content:"\F16BC"}.mdi-wifi-check::before{content:"\F16BD"}.mdi-wifi-cog::before{content:"\F16BE"}.mdi-wifi-lock::before{content:"\F16BF"}.mdi-wifi-lock-open::before{content:"\F16C0"}.mdi-wifi-marker::before{content:"\F16C1"}.mdi-wifi-minus::before{content:"\F16C2"}.mdi-wifi-off::before{content:"\F05AA"}.mdi-wifi-plus::before{content:"\F16C3"}.mdi-wifi-refresh::before{content:"\F16C4"}.mdi-wifi-remove::before{content:"\F16C5"}.mdi-wifi-settings::before{content:"\F16C6"}.mdi-wifi-star::before{content:"\F0E0B"}.mdi-wifi-strength-1::before{content:"\F091F"}.mdi-wifi-strength-1-alert::before{content:"\F0920"}.mdi-wifi-strength-1-lock::before{content:"\F0921"}.mdi-wifi-strength-1-lock-open::before{content:"\F16CB"}.mdi-wifi-strength-2::before{content:"\F0922"}.mdi-wifi-strength-2-alert::before{content:"\F0923"}.mdi-wifi-strength-2-lock::before{content:"\F0924"}.mdi-wifi-strength-2-lock-open::before{content:"\F16CC"}.mdi-wifi-strength-3::before{content:"\F0925"}.mdi-wifi-strength-3-alert::before{content:"\F0926"}.mdi-wifi-strength-3-lock::before{content:"\F0927"}.mdi-wifi-strength-3-lock-open::before{content:"\F16CD"}.mdi-wifi-strength-4::before{content:"\F0928"}.mdi-wifi-strength-4-alert::before{content:"\F0929"}.mdi-wifi-strength-4-lock::before{content:"\F092A"}.mdi-wifi-strength-4-lock-open::before{content:"\F16CE"}.mdi-wifi-strength-alert-outline::before{content:"\F092B"}.mdi-wifi-strength-lock-open-outline::before{content:"\F16CF"}.mdi-wifi-strength-lock-outline::before{content:"\F092C"}.mdi-wifi-strength-off::before{content:"\F092D"}.mdi-wifi-strength-off-outline::before{content:"\F092E"}.mdi-wifi-strength-outline::before{content:"\F092F"}.mdi-wifi-sync::before{content:"\F16C7"}.mdi-wikipedia::before{content:"\F05AC"}.mdi-wind-power::before{content:"\F1A88"}.mdi-wind-power-outline::before{content:"\F1A89"}.mdi-wind-turbine::before{content:"\F0DA5"}.mdi-wind-turbine-alert::before{content:"\F19AB"}.mdi-wind-turbine-check::before{content:"\F19AC"}.mdi-window-close::before{content:"\F05AD"}.mdi-window-closed::before{content:"\F05AE"}.mdi-window-closed-variant::before{content:"\F11DB"}.mdi-window-maximize::before{content:"\F05AF"}.mdi-window-minimize::before{content:"\F05B0"}.mdi-window-open::before{content:"\F05B1"}.mdi-window-open-variant::before{content:"\F11DC"}.mdi-window-restore::before{content:"\F05B2"}.mdi-window-shutter::before{content:"\F111C"}.mdi-window-shutter-alert::before{content:"\F111D"}.mdi-window-shutter-auto::before{content:"\F1BA3"}.mdi-window-shutter-cog::before{content:"\F1A8A"}.mdi-window-shutter-open::before{content:"\F111E"}.mdi-window-shutter-settings::before{content:"\F1A8B"}.mdi-windsock::before{content:"\F15FA"}.mdi-wiper::before{content:"\F0AE9"}.mdi-wiper-wash::before{content:"\F0DA6"}.mdi-wiper-wash-alert::before{content:"\F18DF"}.mdi-wizard-hat::before{content:"\F1477"}.mdi-wordpress::before{content:"\F05B4"}.mdi-wrap::before{content:"\F05B6"}.mdi-wrap-disabled::before{content:"\F0BDF"}.mdi-wrench::before{content:"\F05B7"}.mdi-wrench-check::before{content:"\F1B8F"}.mdi-wrench-check-outline::before{content:"\F1B90"}.mdi-wrench-clock::before{content:"\F19A3"}.mdi-wrench-clock-outline::before{content:"\F1B93"}.mdi-wrench-cog::before{content:"\F1B91"}.mdi-wrench-cog-outline::before{content:"\F1B92"}.mdi-wrench-outline::before{content:"\F0BE0"}.mdi-xamarin::before{content:"\F0845"}.mdi-xml::before{content:"\F05C0"}.mdi-xmpp::before{content:"\F07FF"}.mdi-yahoo::before{content:"\F0B4F"}.mdi-yeast::before{content:"\F05C1"}.mdi-yin-yang::before{content:"\F0680"}.mdi-yoga::before{content:"\F117C"}.mdi-youtube::before{content:"\F05C3"}.mdi-youtube-gaming::before{content:"\F0848"}.mdi-youtube-studio::before{content:"\F0847"}.mdi-youtube-subscription::before{content:"\F0D40"}.mdi-youtube-tv::before{content:"\F0448"}.mdi-yurt::before{content:"\F1516"}.mdi-z-wave::before{content:"\F0AEA"}.mdi-zend::before{content:"\F0AEB"}.mdi-zigbee::before{content:"\F0D41"}.mdi-zip-box::before{content:"\F05C4"}.mdi-zip-box-outline::before{content:"\F0FFA"}.mdi-zip-disk::before{content:"\F0A23"}.mdi-zodiac-aquarius::before{content:"\F0A7D"}.mdi-zodiac-aries::before{content:"\F0A7E"}.mdi-zodiac-cancer::before{content:"\F0A7F"}.mdi-zodiac-capricorn::before{content:"\F0A80"}.mdi-zodiac-gemini::before{content:"\F0A81"}.mdi-zodiac-leo::before{content:"\F0A82"}.mdi-zodiac-libra::before{content:"\F0A83"}.mdi-zodiac-pisces::before{content:"\F0A84"}.mdi-zodiac-sagittarius::before{content:"\F0A85"}.mdi-zodiac-scorpio::before{content:"\F0A86"}.mdi-zodiac-taurus::before{content:"\F0A87"}.mdi-zodiac-virgo::before{content:"\F0A88"}.mdi-blank::before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} + +/*# sourceMappingURL=materialdesignicons.min.css.map */ \ No newline at end of file diff --git a/public/assets/@mdi/font/css/materialdesignicons.min.css.map b/public/assets/@mdi/font/css/materialdesignicons.min.css.map new file mode 100644 index 0000000..c179c66 --- /dev/null +++ b/public/assets/@mdi/font/css/materialdesignicons.min.css.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "file": "materialdesignicons.css", + "sources": [ + "../scss/materialdesignicons.scss", + "../scss/_variables.scss", + "../scss/_functions.scss", + "../scss/_path.scss", + "../scss/_core.scss", + "../scss/_icons.scss", + "../scss/_extras.scss", + "../scss/_animated.scss" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/public/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 b/public/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8c69b85f666bf3996d7e3194623bf53e774c44a3 GIT binary patch literal 403216 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

A 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

~kC(4S|_D1W! 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%0A?P6XIbsbH%^bgaA!ca7le#O1f9ZxwdH9s;d7b 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium-68463534.js b/public/assets/cesium-68463534.js new file mode 100644 index 0000000..cc22b08 --- /dev/null +++ b/public/assets/cesium-68463534.js @@ -0,0 +1,170170 @@ +function _mergeNamespaces(e, t) { + for (var n = 0; n < t.length; n++) { + const i = t[n]; + if (typeof i != "string" && !Array.isArray(i)) { + for (const r in i) + if (r !== "default" && !(r in e)) { + const o = Object.getOwnPropertyDescriptor(i, r); + o && Object.defineProperty(e, r, o.get ? o : { + enumerable: !0, + get: () => i[r] + }); + } + } + } + return Object.freeze(Object.defineProperty(e, Symbol.toStringTag, { value: "Module" })); +} +function defined(e) { + return e != null; +} +function DeveloperError(e) { + this.name = "DeveloperError", this.message = e; + let t; + try { + throw new Error(); + } catch (n) { + t = n.stack; + } + this.stack = t; +} +defined(Object.create) && (DeveloperError.prototype = Object.create(Error.prototype), DeveloperError.prototype.constructor = DeveloperError); +DeveloperError.prototype.toString = function() { + let e = `${this.name}: ${this.message}`; + return defined(this.stack) && (e += ` +${this.stack.toString()}`), e; +}; +DeveloperError.throwInstantiationError = function() { + throw new DeveloperError( + "This function defines an interface and should not be called directly." + ); +}; +const Check = {}; +Check.typeOf = {}; +function getUndefinedErrorMessage(e) { + return `${e} is required, actual value was undefined`; +} +function getFailedTypeErrorMessage(e, t, n) { + return `Expected ${n} to be typeof ${t}, actual typeof was ${e}`; +} +Check.defined = function(e, t) { + if (!defined(t)) + throw new DeveloperError(getUndefinedErrorMessage(e)); +}; +Check.typeOf.func = function(e, t) { + if (typeof t != "function") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "function", e) + ); +}; +Check.typeOf.string = function(e, t) { + if (typeof t != "string") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "string", e) + ); +}; +Check.typeOf.number = function(e, t) { + if (typeof t != "number") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "number", e) + ); +}; +Check.typeOf.number.lessThan = function(e, t, n) { + if (Check.typeOf.number(e, t), t >= n) + throw new DeveloperError( + `Expected ${e} to be less than ${n}, actual value was ${t}` + ); +}; +Check.typeOf.number.lessThanOrEquals = function(e, t, n) { + if (Check.typeOf.number(e, t), t > n) + throw new DeveloperError( + `Expected ${e} to be less than or equal to ${n}, actual value was ${t}` + ); +}; +Check.typeOf.number.greaterThan = function(e, t, n) { + if (Check.typeOf.number(e, t), t <= n) + throw new DeveloperError( + `Expected ${e} to be greater than ${n}, actual value was ${t}` + ); +}; +Check.typeOf.number.greaterThanOrEquals = function(e, t, n) { + if (Check.typeOf.number(e, t), t < n) + throw new DeveloperError( + `Expected ${e} to be greater than or equal to ${n}, actual value was ${t}` + ); +}; +Check.typeOf.object = function(e, t) { + if (typeof t != "object") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "object", e) + ); +}; +Check.typeOf.bool = function(e, t) { + if (typeof t != "boolean") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "boolean", e) + ); +}; +Check.typeOf.bigint = function(e, t) { + if (typeof t != "bigint") + throw new DeveloperError( + getFailedTypeErrorMessage(typeof t, "bigint", e) + ); +}; +Check.typeOf.number.equals = function(e, t, n, i) { + if (Check.typeOf.number(e, n), Check.typeOf.number(t, i), n !== i) + throw new DeveloperError( + `${e} must be equal to ${t}, the actual values are ${n} and ${i}` + ); +}; +function defaultValue(e, t) { + return e ?? t; +} +defaultValue.EMPTY_OBJECT = Object.freeze({}); +var commonjsGlobal = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function getDefaultExportFromCjs(e) { + return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e; +} +var MersenneTwister = function(e) { + e == null && (e = (/* @__PURE__ */ new Date()).getTime()), this.N = 624, this.M = 397, this.MATRIX_A = 2567483615, this.UPPER_MASK = 2147483648, this.LOWER_MASK = 2147483647, this.mt = new Array(this.N), this.mti = this.N + 1, e.constructor == Array ? this.init_by_array(e, e.length) : this.init_seed(e); +}; +MersenneTwister.prototype.init_seed = function(e) { + for (this.mt[0] = e >>> 0, this.mti = 1; this.mti < this.N; this.mti++) { + var e = this.mt[this.mti - 1] ^ this.mt[this.mti - 1] >>> 30; + this.mt[this.mti] = (((e & 4294901760) >>> 16) * 1812433253 << 16) + (e & 65535) * 1812433253 + this.mti, this.mt[this.mti] >>>= 0; + } +}; +MersenneTwister.prototype.init_by_array = function(e, t) { + var n, i, r; + for (this.init_seed(19650218), n = 1, i = 0, r = this.N > t ? this.N : t; r; r--) { + var o = this.mt[n - 1] ^ this.mt[n - 1] >>> 30; + this.mt[n] = (this.mt[n] ^ (((o & 4294901760) >>> 16) * 1664525 << 16) + (o & 65535) * 1664525) + e[i] + i, this.mt[n] >>>= 0, n++, i++, n >= this.N && (this.mt[0] = this.mt[this.N - 1], n = 1), i >= t && (i = 0); + } + for (r = this.N - 1; r; r--) { + var o = this.mt[n - 1] ^ this.mt[n - 1] >>> 30; + this.mt[n] = (this.mt[n] ^ (((o & 4294901760) >>> 16) * 1566083941 << 16) + (o & 65535) * 1566083941) - n, this.mt[n] >>>= 0, n++, n >= this.N && (this.mt[0] = this.mt[this.N - 1], n = 1); + } + this.mt[0] = 2147483648; +}; +MersenneTwister.prototype.random_int = function() { + var e, t = new Array(0, this.MATRIX_A); + if (this.mti >= this.N) { + var n; + for (this.mti == this.N + 1 && this.init_seed(5489), n = 0; n < this.N - this.M; n++) + e = this.mt[n] & this.UPPER_MASK | this.mt[n + 1] & this.LOWER_MASK, this.mt[n] = this.mt[n + this.M] ^ e >>> 1 ^ t[e & 1]; + for (; n < this.N - 1; n++) + e = this.mt[n] & this.UPPER_MASK | this.mt[n + 1] & this.LOWER_MASK, this.mt[n] = this.mt[n + (this.M - this.N)] ^ e >>> 1 ^ t[e & 1]; + e = this.mt[this.N - 1] & this.UPPER_MASK | this.mt[0] & this.LOWER_MASK, this.mt[this.N - 1] = this.mt[this.M - 1] ^ e >>> 1 ^ t[e & 1], this.mti = 0; + } + return e = this.mt[this.mti++], e ^= e >>> 11, e ^= e << 7 & 2636928640, e ^= e << 15 & 4022730752, e ^= e >>> 18, e >>> 0; +}; +MersenneTwister.prototype.random_int31 = function() { + return this.random_int() >>> 1; +}; +MersenneTwister.prototype.random_incl = function() { + return this.random_int() * (1 / 4294967295); +}; +MersenneTwister.prototype.random = function() { + return this.random_int() * (1 / 4294967296); +}; +MersenneTwister.prototype.random_excl = function() { + return (this.random_int() + 0.5) * (1 / 4294967296); +}; +MersenneTwister.prototype.random_long = function() { + var e = this.random_int() >>> 5, t = this.random_int() >>> 6; + return (e * 67108864 + t) * (1 / 9007199254740992); +}; +var mersenneTwister = MersenneTwister; +const MersenneTwister$1 = /* @__PURE__ */ getDefaultExportFromCjs(mersenneTwister), CesiumMath = {}; +CesiumMath.EPSILON1 = 0.1; +CesiumMath.EPSILON2 = 0.01; +CesiumMath.EPSILON3 = 1e-3; +CesiumMath.EPSILON4 = 1e-4; +CesiumMath.EPSILON5 = 1e-5; +CesiumMath.EPSILON6 = 1e-6; +CesiumMath.EPSILON7 = 1e-7; +CesiumMath.EPSILON8 = 1e-8; +CesiumMath.EPSILON9 = 1e-9; +CesiumMath.EPSILON10 = 1e-10; +CesiumMath.EPSILON11 = 1e-11; +CesiumMath.EPSILON12 = 1e-12; +CesiumMath.EPSILON13 = 1e-13; +CesiumMath.EPSILON14 = 1e-14; +CesiumMath.EPSILON15 = 1e-15; +CesiumMath.EPSILON16 = 1e-16; +CesiumMath.EPSILON17 = 1e-17; +CesiumMath.EPSILON18 = 1e-18; +CesiumMath.EPSILON19 = 1e-19; +CesiumMath.EPSILON20 = 1e-20; +CesiumMath.EPSILON21 = 1e-21; +CesiumMath.GRAVITATIONALPARAMETER = 3986004418e5; +CesiumMath.SOLAR_RADIUS = 6955e5; +CesiumMath.LUNAR_RADIUS = 1737400; +CesiumMath.SIXTY_FOUR_KILOBYTES = 64 * 1024; +CesiumMath.FOUR_GIGABYTES = 4 * 1024 * 1024 * 1024; +CesiumMath.sign = defaultValue(Math.sign, function(t) { + return t = +t, t === 0 || t !== t ? t : t > 0 ? 1 : -1; +}); +CesiumMath.signNotZero = function(e) { + return e < 0 ? -1 : 1; +}; +CesiumMath.toSNorm = function(e, t) { + return t = defaultValue(t, 255), Math.round( + (CesiumMath.clamp(e, -1, 1) * 0.5 + 0.5) * t + ); +}; +CesiumMath.fromSNorm = function(e, t) { + return t = defaultValue(t, 255), CesiumMath.clamp(e, 0, t) / t * 2 - 1; +}; +CesiumMath.normalize = function(e, t, n) { + return n = Math.max(n - t, 0), n === 0 ? 0 : CesiumMath.clamp((e - t) / n, 0, 1); +}; +CesiumMath.sinh = defaultValue(Math.sinh, function(t) { + return (Math.exp(t) - Math.exp(-t)) / 2; +}); +CesiumMath.cosh = defaultValue(Math.cosh, function(t) { + return (Math.exp(t) + Math.exp(-t)) / 2; +}); +CesiumMath.lerp = function(e, t, n) { + return (1 - n) * e + n * t; +}; +CesiumMath.PI = Math.PI; +CesiumMath.ONE_OVER_PI = 1 / Math.PI; +CesiumMath.PI_OVER_TWO = Math.PI / 2; +CesiumMath.PI_OVER_THREE = Math.PI / 3; +CesiumMath.PI_OVER_FOUR = Math.PI / 4; +CesiumMath.PI_OVER_SIX = Math.PI / 6; +CesiumMath.THREE_PI_OVER_TWO = 3 * Math.PI / 2; +CesiumMath.TWO_PI = 2 * Math.PI; +CesiumMath.ONE_OVER_TWO_PI = 1 / (2 * Math.PI); +CesiumMath.RADIANS_PER_DEGREE = Math.PI / 180; +CesiumMath.DEGREES_PER_RADIAN = 180 / Math.PI; +CesiumMath.RADIANS_PER_ARCSECOND = CesiumMath.RADIANS_PER_DEGREE / 3600; +CesiumMath.toRadians = function(e) { + return e * CesiumMath.RADIANS_PER_DEGREE; +}; +CesiumMath.toDegrees = function(e) { + return e * CesiumMath.DEGREES_PER_RADIAN; +}; +CesiumMath.convertLongitudeRange = function(e) { + const t = CesiumMath.TWO_PI, n = e - Math.floor(e / t) * t; + return n < -Math.PI ? n + t : n >= Math.PI ? n - t : n; +}; +CesiumMath.clampToLatitudeRange = function(e) { + return CesiumMath.clamp( + e, + -1 * CesiumMath.PI_OVER_TWO, + CesiumMath.PI_OVER_TWO + ); +}; +CesiumMath.negativePiToPi = function(e) { + return e >= -CesiumMath.PI && e <= CesiumMath.PI ? e : CesiumMath.zeroToTwoPi(e + CesiumMath.PI) - CesiumMath.PI; +}; +CesiumMath.zeroToTwoPi = function(e) { + if (e >= 0 && e <= CesiumMath.TWO_PI) + return e; + const t = CesiumMath.mod(e, CesiumMath.TWO_PI); + return Math.abs(t) < CesiumMath.EPSILON14 && Math.abs(e) > CesiumMath.EPSILON14 ? CesiumMath.TWO_PI : t; +}; +CesiumMath.mod = function(e, t) { + return CesiumMath.sign(e) === CesiumMath.sign(t) && Math.abs(e) < Math.abs(t) ? e : (e % t + t) % t; +}; +CesiumMath.equalsEpsilon = function(e, t, n, i) { + n = defaultValue(n, 0), i = defaultValue(i, n); + const r = Math.abs(e - t); + return r <= i || r <= n * Math.max(Math.abs(e), Math.abs(t)); +}; +CesiumMath.lessThan = function(e, t, n) { + return e - t < -n; +}; +CesiumMath.lessThanOrEquals = function(e, t, n) { + return e - t < n; +}; +CesiumMath.greaterThan = function(e, t, n) { + return e - t > n; +}; +CesiumMath.greaterThanOrEquals = function(e, t, n) { + return e - t > -n; +}; +const factorials = [1]; +CesiumMath.factorial = function(e) { + const t = factorials.length; + if (e >= t) { + let n = factorials[t - 1]; + for (let i = t; i <= e; i++) { + const r = n * i; + factorials.push(r), n = r; + } + } + return factorials[e]; +}; +CesiumMath.incrementWrap = function(e, t, n) { + return n = defaultValue(n, 0), ++e, e > t && (e = n), e; +}; +CesiumMath.isPowerOfTwo = function(e) { + return e !== 0 && (e & e - 1) === 0; +}; +CesiumMath.nextPowerOfTwo = function(e) { + return --e, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, ++e, e; +}; +CesiumMath.previousPowerOfTwo = function(e) { + return e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, e |= e >> 32, e = (e >>> 0) - (e >>> 1), e; +}; +CesiumMath.clamp = function(e, t, n) { + return e < t ? t : e > n ? n : e; +}; +let randomNumberGenerator$2 = new MersenneTwister$1(); +CesiumMath.setRandomNumberSeed = function(e) { + randomNumberGenerator$2 = new MersenneTwister$1(e); +}; +CesiumMath.nextRandomNumber = function() { + return randomNumberGenerator$2.random(); +}; +CesiumMath.randomBetween = function(e, t) { + return CesiumMath.nextRandomNumber() * (t - e) + e; +}; +CesiumMath.acosClamped = function(e) { + return Math.acos(CesiumMath.clamp(e, -1, 1)); +}; +CesiumMath.asinClamped = function(e) { + return Math.asin(CesiumMath.clamp(e, -1, 1)); +}; +CesiumMath.chordLength = function(e, t) { + return 2 * t * Math.sin(e * 0.5); +}; +CesiumMath.logBase = function(e, t) { + return Math.log(e) / Math.log(t); +}; +CesiumMath.cbrt = defaultValue(Math.cbrt, function(t) { + const n = Math.pow(Math.abs(t), 0.3333333333333333); + return t < 0 ? -n : n; +}); +CesiumMath.log2 = defaultValue(Math.log2, function(t) { + return Math.log(t) * Math.LOG2E; +}); +CesiumMath.fog = function(e, t) { + const n = e * t; + return 1 - Math.exp(-(n * n)); +}; +CesiumMath.fastApproximateAtan = function(e) { + return e * (-0.1784 * Math.abs(e) - 0.0663 * e * e + 1.0301); +}; +CesiumMath.fastApproximateAtan2 = function(e, t) { + let n, i = Math.abs(e); + n = Math.abs(t); + const r = Math.max(i, n); + n = Math.min(i, n); + const o = n / r; + return i = CesiumMath.fastApproximateAtan(o), i = Math.abs(t) > Math.abs(e) ? CesiumMath.PI_OVER_TWO - i : i, i = e < 0 ? CesiumMath.PI - i : i, i = t < 0 ? -i : i, i; +}; +function Cartesian3(e, t, n) { + this.x = defaultValue(e, 0), this.y = defaultValue(t, 0), this.z = defaultValue(n, 0); +} +Cartesian3.fromSpherical = function(e, t) { + defined(t) || (t = new Cartesian3()); + const n = e.clock, i = e.cone, r = defaultValue(e.magnitude, 1), o = r * Math.sin(i); + return t.x = o * Math.cos(n), t.y = o * Math.sin(n), t.z = r * Math.cos(i), t; +}; +Cartesian3.fromElements = function(e, t, n, i) { + return defined(i) ? (i.x = e, i.y = t, i.z = n, i) : new Cartesian3(e, t, n); +}; +Cartesian3.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.x = e.x, t.y = e.y, t.z = e.z, t) : new Cartesian3(e.x, e.y, e.z); +}; +Cartesian3.fromCartesian4 = Cartesian3.clone; +Cartesian3.packedLength = 3; +Cartesian3.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.x, t[n++] = e.y, t[n] = e.z, t; +}; +Cartesian3.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Cartesian3()), n.x = e[t++], n.y = e[t++], n.z = e[t], n; +}; +Cartesian3.packArray = function(e, t) { + const n = e.length, i = n * 3; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Cartesian3.pack(e[r], t, r * 3); + return t; +}; +Cartesian3.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 3 : t = new Array(n / 3); + for (let i = 0; i < n; i += 3) { + const r = i / 3; + t[r] = Cartesian3.unpack(e, i, t[r]); + } + return t; +}; +Cartesian3.fromArray = Cartesian3.unpack; +Cartesian3.maximumComponent = function(e) { + return Math.max(e.x, e.y, e.z); +}; +Cartesian3.minimumComponent = function(e) { + return Math.min(e.x, e.y, e.z); +}; +Cartesian3.minimumByComponent = function(e, t, n) { + return n.x = Math.min(e.x, t.x), n.y = Math.min(e.y, t.y), n.z = Math.min(e.z, t.z), n; +}; +Cartesian3.maximumByComponent = function(e, t, n) { + return n.x = Math.max(e.x, t.x), n.y = Math.max(e.y, t.y), n.z = Math.max(e.z, t.z), n; +}; +Cartesian3.clamp = function(e, t, n, i) { + const r = CesiumMath.clamp(e.x, t.x, n.x), o = CesiumMath.clamp(e.y, t.y, n.y), s = CesiumMath.clamp(e.z, t.z, n.z); + return i.x = r, i.y = o, i.z = s, i; +}; +Cartesian3.magnitudeSquared = function(e) { + return e.x * e.x + e.y * e.y + e.z * e.z; +}; +Cartesian3.magnitude = function(e) { + return Math.sqrt(Cartesian3.magnitudeSquared(e)); +}; +const distanceScratch$3 = new Cartesian3(); +Cartesian3.distance = function(e, t) { + return Cartesian3.subtract(e, t, distanceScratch$3), Cartesian3.magnitude(distanceScratch$3); +}; +Cartesian3.distanceSquared = function(e, t) { + return Cartesian3.subtract(e, t, distanceScratch$3), Cartesian3.magnitudeSquared(distanceScratch$3); +}; +Cartesian3.normalize = function(e, t) { + const n = Cartesian3.magnitude(e); + return t.x = e.x / n, t.y = e.y / n, t.z = e.z / n, t; +}; +Cartesian3.dot = function(e, t) { + return e.x * t.x + e.y * t.y + e.z * t.z; +}; +Cartesian3.multiplyComponents = function(e, t, n) { + return n.x = e.x * t.x, n.y = e.y * t.y, n.z = e.z * t.z, n; +}; +Cartesian3.divideComponents = function(e, t, n) { + return n.x = e.x / t.x, n.y = e.y / t.y, n.z = e.z / t.z, n; +}; +Cartesian3.add = function(e, t, n) { + return n.x = e.x + t.x, n.y = e.y + t.y, n.z = e.z + t.z, n; +}; +Cartesian3.subtract = function(e, t, n) { + return n.x = e.x - t.x, n.y = e.y - t.y, n.z = e.z - t.z, n; +}; +Cartesian3.multiplyByScalar = function(e, t, n) { + return n.x = e.x * t, n.y = e.y * t, n.z = e.z * t, n; +}; +Cartesian3.divideByScalar = function(e, t, n) { + return n.x = e.x / t, n.y = e.y / t, n.z = e.z / t, n; +}; +Cartesian3.negate = function(e, t) { + return t.x = -e.x, t.y = -e.y, t.z = -e.z, t; +}; +Cartesian3.abs = function(e, t) { + return t.x = Math.abs(e.x), t.y = Math.abs(e.y), t.z = Math.abs(e.z), t; +}; +const lerpScratch$3 = new Cartesian3(); +Cartesian3.lerp = function(e, t, n, i) { + return Cartesian3.multiplyByScalar(t, n, lerpScratch$3), i = Cartesian3.multiplyByScalar(e, 1 - n, i), Cartesian3.add(lerpScratch$3, i, i); +}; +const angleBetweenScratch$1 = new Cartesian3(), angleBetweenScratch2$1 = new Cartesian3(); +Cartesian3.angleBetween = function(e, t) { + Cartesian3.normalize(e, angleBetweenScratch$1), Cartesian3.normalize(t, angleBetweenScratch2$1); + const n = Cartesian3.dot(angleBetweenScratch$1, angleBetweenScratch2$1), i = Cartesian3.magnitude( + Cartesian3.cross( + angleBetweenScratch$1, + angleBetweenScratch2$1, + angleBetweenScratch$1 + ) + ); + return Math.atan2(i, n); +}; +const mostOrthogonalAxisScratch$2 = new Cartesian3(); +Cartesian3.mostOrthogonalAxis = function(e, t) { + const n = Cartesian3.normalize(e, mostOrthogonalAxisScratch$2); + return Cartesian3.abs(n, n), n.x <= n.y ? n.x <= n.z ? t = Cartesian3.clone(Cartesian3.UNIT_X, t) : t = Cartesian3.clone(Cartesian3.UNIT_Z, t) : n.y <= n.z ? t = Cartesian3.clone(Cartesian3.UNIT_Y, t) : t = Cartesian3.clone(Cartesian3.UNIT_Z, t), t; +}; +Cartesian3.projectVector = function(e, t, n) { + const i = Cartesian3.dot(e, t) / Cartesian3.dot(t, t); + return Cartesian3.multiplyByScalar(t, i, n); +}; +Cartesian3.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.x === t.x && e.y === t.y && e.z === t.z; +}; +Cartesian3.equalsArray = function(e, t, n) { + return e.x === t[n] && e.y === t[n + 1] && e.z === t[n + 2]; +}; +Cartesian3.equalsEpsilon = function(e, t, n, i) { + return e === t || defined(e) && defined(t) && CesiumMath.equalsEpsilon( + e.x, + t.x, + n, + i + ) && CesiumMath.equalsEpsilon( + e.y, + t.y, + n, + i + ) && CesiumMath.equalsEpsilon( + e.z, + t.z, + n, + i + ); +}; +Cartesian3.cross = function(e, t, n) { + const i = e.x, r = e.y, o = e.z, s = t.x, c = t.y, l = t.z, d = r * l - o * c, f = o * s - i * l, h = i * c - r * s; + return n.x = d, n.y = f, n.z = h, n; +}; +Cartesian3.midpoint = function(e, t, n) { + return n.x = (e.x + t.x) * 0.5, n.y = (e.y + t.y) * 0.5, n.z = (e.z + t.z) * 0.5, n; +}; +Cartesian3.fromDegrees = function(e, t, n, i, r) { + return e = CesiumMath.toRadians(e), t = CesiumMath.toRadians(t), Cartesian3.fromRadians(e, t, n, i, r); +}; +let scratchN = new Cartesian3(), scratchK = new Cartesian3(); +Cartesian3._ellipsoidRadiiSquared = new Cartesian3( + 6378137 * 6378137, + 6378137 * 6378137, + 6356752314245179e-9 * 6356752314245179e-9 +); +Cartesian3.fromRadians = function(e, t, n, i, r) { + n = defaultValue(n, 0); + const o = defined(i) ? i.radiiSquared : Cartesian3._ellipsoidRadiiSquared, s = Math.cos(t); + scratchN.x = s * Math.cos(e), scratchN.y = s * Math.sin(e), scratchN.z = Math.sin(t), scratchN = Cartesian3.normalize(scratchN, scratchN), Cartesian3.multiplyComponents(o, scratchN, scratchK); + const c = Math.sqrt(Cartesian3.dot(scratchN, scratchK)); + return scratchK = Cartesian3.divideByScalar(scratchK, c, scratchK), scratchN = Cartesian3.multiplyByScalar(scratchN, n, scratchN), defined(r) || (r = new Cartesian3()), Cartesian3.add(scratchK, scratchN, r); +}; +Cartesian3.fromDegreesArray = function(e, t, n) { + const i = e.length; + defined(n) ? n.length = i / 2 : n = new Array(i / 2); + for (let r = 0; r < i; r += 2) { + const o = e[r], s = e[r + 1], c = r / 2; + n[c] = Cartesian3.fromDegrees( + o, + s, + 0, + t, + n[c] + ); + } + return n; +}; +Cartesian3.fromRadiansArray = function(e, t, n) { + const i = e.length; + defined(n) ? n.length = i / 2 : n = new Array(i / 2); + for (let r = 0; r < i; r += 2) { + const o = e[r], s = e[r + 1], c = r / 2; + n[c] = Cartesian3.fromRadians( + o, + s, + 0, + t, + n[c] + ); + } + return n; +}; +Cartesian3.fromDegreesArrayHeights = function(e, t, n) { + const i = e.length; + defined(n) ? n.length = i / 3 : n = new Array(i / 3); + for (let r = 0; r < i; r += 3) { + const o = e[r], s = e[r + 1], c = e[r + 2], l = r / 3; + n[l] = Cartesian3.fromDegrees( + o, + s, + c, + t, + n[l] + ); + } + return n; +}; +Cartesian3.fromRadiansArrayHeights = function(e, t, n) { + const i = e.length; + defined(n) ? n.length = i / 3 : n = new Array(i / 3); + for (let r = 0; r < i; r += 3) { + const o = e[r], s = e[r + 1], c = e[r + 2], l = r / 3; + n[l] = Cartesian3.fromRadians( + o, + s, + c, + t, + n[l] + ); + } + return n; +}; +Cartesian3.ZERO = Object.freeze(new Cartesian3(0, 0, 0)); +Cartesian3.ONE = Object.freeze(new Cartesian3(1, 1, 1)); +Cartesian3.UNIT_X = Object.freeze(new Cartesian3(1, 0, 0)); +Cartesian3.UNIT_Y = Object.freeze(new Cartesian3(0, 1, 0)); +Cartesian3.UNIT_Z = Object.freeze(new Cartesian3(0, 0, 1)); +Cartesian3.prototype.clone = function(e) { + return Cartesian3.clone(this, e); +}; +Cartesian3.prototype.equals = function(e) { + return Cartesian3.equals(this, e); +}; +Cartesian3.prototype.equalsEpsilon = function(e, t, n) { + return Cartesian3.equalsEpsilon( + this, + e, + t, + n + ); +}; +Cartesian3.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z})`; +}; +function Cartesian4(e, t, n, i) { + this.x = defaultValue(e, 0), this.y = defaultValue(t, 0), this.z = defaultValue(n, 0), this.w = defaultValue(i, 0); +} +Cartesian4.fromElements = function(e, t, n, i, r) { + return defined(r) ? (r.x = e, r.y = t, r.z = n, r.w = i, r) : new Cartesian4(e, t, n, i); +}; +Cartesian4.fromColor = function(e, t) { + return defined(t) ? (t.x = e.red, t.y = e.green, t.z = e.blue, t.w = e.alpha, t) : new Cartesian4(e.red, e.green, e.blue, e.alpha); +}; +Cartesian4.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.x = e.x, t.y = e.y, t.z = e.z, t.w = e.w, t) : new Cartesian4(e.x, e.y, e.z, e.w); +}; +Cartesian4.packedLength = 4; +Cartesian4.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.x, t[n++] = e.y, t[n++] = e.z, t[n] = e.w, t; +}; +Cartesian4.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Cartesian4()), n.x = e[t++], n.y = e[t++], n.z = e[t++], n.w = e[t], n; +}; +Cartesian4.packArray = function(e, t) { + const n = e.length, i = n * 4; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Cartesian4.pack(e[r], t, r * 4); + return t; +}; +Cartesian4.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 4 : t = new Array(n / 4); + for (let i = 0; i < n; i += 4) { + const r = i / 4; + t[r] = Cartesian4.unpack(e, i, t[r]); + } + return t; +}; +Cartesian4.fromArray = Cartesian4.unpack; +Cartesian4.maximumComponent = function(e) { + return Math.max(e.x, e.y, e.z, e.w); +}; +Cartesian4.minimumComponent = function(e) { + return Math.min(e.x, e.y, e.z, e.w); +}; +Cartesian4.minimumByComponent = function(e, t, n) { + return n.x = Math.min(e.x, t.x), n.y = Math.min(e.y, t.y), n.z = Math.min(e.z, t.z), n.w = Math.min(e.w, t.w), n; +}; +Cartesian4.maximumByComponent = function(e, t, n) { + return n.x = Math.max(e.x, t.x), n.y = Math.max(e.y, t.y), n.z = Math.max(e.z, t.z), n.w = Math.max(e.w, t.w), n; +}; +Cartesian4.clamp = function(e, t, n, i) { + const r = CesiumMath.clamp(e.x, t.x, n.x), o = CesiumMath.clamp(e.y, t.y, n.y), s = CesiumMath.clamp(e.z, t.z, n.z), c = CesiumMath.clamp(e.w, t.w, n.w); + return i.x = r, i.y = o, i.z = s, i.w = c, i; +}; +Cartesian4.magnitudeSquared = function(e) { + return e.x * e.x + e.y * e.y + e.z * e.z + e.w * e.w; +}; +Cartesian4.magnitude = function(e) { + return Math.sqrt(Cartesian4.magnitudeSquared(e)); +}; +const distanceScratch$2 = new Cartesian4(); +Cartesian4.distance = function(e, t) { + return Cartesian4.subtract(e, t, distanceScratch$2), Cartesian4.magnitude(distanceScratch$2); +}; +Cartesian4.distanceSquared = function(e, t) { + return Cartesian4.subtract(e, t, distanceScratch$2), Cartesian4.magnitudeSquared(distanceScratch$2); +}; +Cartesian4.normalize = function(e, t) { + const n = Cartesian4.magnitude(e); + return t.x = e.x / n, t.y = e.y / n, t.z = e.z / n, t.w = e.w / n, t; +}; +Cartesian4.dot = function(e, t) { + return e.x * t.x + e.y * t.y + e.z * t.z + e.w * t.w; +}; +Cartesian4.multiplyComponents = function(e, t, n) { + return n.x = e.x * t.x, n.y = e.y * t.y, n.z = e.z * t.z, n.w = e.w * t.w, n; +}; +Cartesian4.divideComponents = function(e, t, n) { + return n.x = e.x / t.x, n.y = e.y / t.y, n.z = e.z / t.z, n.w = e.w / t.w, n; +}; +Cartesian4.add = function(e, t, n) { + return n.x = e.x + t.x, n.y = e.y + t.y, n.z = e.z + t.z, n.w = e.w + t.w, n; +}; +Cartesian4.subtract = function(e, t, n) { + return n.x = e.x - t.x, n.y = e.y - t.y, n.z = e.z - t.z, n.w = e.w - t.w, n; +}; +Cartesian4.multiplyByScalar = function(e, t, n) { + return n.x = e.x * t, n.y = e.y * t, n.z = e.z * t, n.w = e.w * t, n; +}; +Cartesian4.divideByScalar = function(e, t, n) { + return n.x = e.x / t, n.y = e.y / t, n.z = e.z / t, n.w = e.w / t, n; +}; +Cartesian4.negate = function(e, t) { + return t.x = -e.x, t.y = -e.y, t.z = -e.z, t.w = -e.w, t; +}; +Cartesian4.abs = function(e, t) { + return t.x = Math.abs(e.x), t.y = Math.abs(e.y), t.z = Math.abs(e.z), t.w = Math.abs(e.w), t; +}; +const lerpScratch$2 = new Cartesian4(); +Cartesian4.lerp = function(e, t, n, i) { + return Cartesian4.multiplyByScalar(t, n, lerpScratch$2), i = Cartesian4.multiplyByScalar(e, 1 - n, i), Cartesian4.add(lerpScratch$2, i, i); +}; +const mostOrthogonalAxisScratch$1 = new Cartesian4(); +Cartesian4.mostOrthogonalAxis = function(e, t) { + const n = Cartesian4.normalize(e, mostOrthogonalAxisScratch$1); + return Cartesian4.abs(n, n), n.x <= n.y ? n.x <= n.z ? n.x <= n.w ? t = Cartesian4.clone(Cartesian4.UNIT_X, t) : t = Cartesian4.clone(Cartesian4.UNIT_W, t) : n.z <= n.w ? t = Cartesian4.clone(Cartesian4.UNIT_Z, t) : t = Cartesian4.clone(Cartesian4.UNIT_W, t) : n.y <= n.z ? n.y <= n.w ? t = Cartesian4.clone(Cartesian4.UNIT_Y, t) : t = Cartesian4.clone(Cartesian4.UNIT_W, t) : n.z <= n.w ? t = Cartesian4.clone(Cartesian4.UNIT_Z, t) : t = Cartesian4.clone(Cartesian4.UNIT_W, t), t; +}; +Cartesian4.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.x === t.x && e.y === t.y && e.z === t.z && e.w === t.w; +}; +Cartesian4.equalsArray = function(e, t, n) { + return e.x === t[n] && e.y === t[n + 1] && e.z === t[n + 2] && e.w === t[n + 3]; +}; +Cartesian4.equalsEpsilon = function(e, t, n, i) { + return e === t || defined(e) && defined(t) && CesiumMath.equalsEpsilon( + e.x, + t.x, + n, + i + ) && CesiumMath.equalsEpsilon( + e.y, + t.y, + n, + i + ) && CesiumMath.equalsEpsilon( + e.z, + t.z, + n, + i + ) && CesiumMath.equalsEpsilon( + e.w, + t.w, + n, + i + ); +}; +Cartesian4.ZERO = Object.freeze(new Cartesian4(0, 0, 0, 0)); +Cartesian4.ONE = Object.freeze(new Cartesian4(1, 1, 1, 1)); +Cartesian4.UNIT_X = Object.freeze(new Cartesian4(1, 0, 0, 0)); +Cartesian4.UNIT_Y = Object.freeze(new Cartesian4(0, 1, 0, 0)); +Cartesian4.UNIT_Z = Object.freeze(new Cartesian4(0, 0, 1, 0)); +Cartesian4.UNIT_W = Object.freeze(new Cartesian4(0, 0, 0, 1)); +Cartesian4.prototype.clone = function(e) { + return Cartesian4.clone(this, e); +}; +Cartesian4.prototype.equals = function(e) { + return Cartesian4.equals(this, e); +}; +Cartesian4.prototype.equalsEpsilon = function(e, t, n) { + return Cartesian4.equalsEpsilon( + this, + e, + t, + n + ); +}; +Cartesian4.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`; +}; +const scratchF32Array = new Float32Array(1), scratchU8Array = new Uint8Array(scratchF32Array.buffer), testU32 = new Uint32Array([287454020]), testU8 = new Uint8Array(testU32.buffer), littleEndian = testU8[0] === 68; +Cartesian4.packFloat = function(e, t) { + return defined(t) || (t = new Cartesian4()), scratchF32Array[0] = e, littleEndian ? (t.x = scratchU8Array[0], t.y = scratchU8Array[1], t.z = scratchU8Array[2], t.w = scratchU8Array[3]) : (t.x = scratchU8Array[3], t.y = scratchU8Array[2], t.z = scratchU8Array[1], t.w = scratchU8Array[0]), t; +}; +Cartesian4.unpackFloat = function(e) { + return littleEndian ? (scratchU8Array[0] = e.x, scratchU8Array[1] = e.y, scratchU8Array[2] = e.z, scratchU8Array[3] = e.w) : (scratchU8Array[0] = e.w, scratchU8Array[1] = e.z, scratchU8Array[2] = e.y, scratchU8Array[3] = e.x), scratchF32Array[0]; +}; +function Matrix3(e, t, n, i, r, o, s, c, l) { + this[0] = defaultValue(e, 0), this[1] = defaultValue(i, 0), this[2] = defaultValue(s, 0), this[3] = defaultValue(t, 0), this[4] = defaultValue(r, 0), this[5] = defaultValue(c, 0), this[6] = defaultValue(n, 0), this[7] = defaultValue(o, 0), this[8] = defaultValue(l, 0); +} +Matrix3.packedLength = 9; +Matrix3.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e[0], t[n++] = e[1], t[n++] = e[2], t[n++] = e[3], t[n++] = e[4], t[n++] = e[5], t[n++] = e[6], t[n++] = e[7], t[n++] = e[8], t; +}; +Matrix3.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Matrix3()), n[0] = e[t++], n[1] = e[t++], n[2] = e[t++], n[3] = e[t++], n[4] = e[t++], n[5] = e[t++], n[6] = e[t++], n[7] = e[t++], n[8] = e[t++], n; +}; +Matrix3.packArray = function(e, t) { + const n = e.length, i = n * 9; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Matrix3.pack(e[r], t, r * 9); + return t; +}; +Matrix3.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 9 : t = new Array(n / 9); + for (let i = 0; i < n; i += 9) { + const r = i / 9; + t[r] = Matrix3.unpack(e, i, t[r]); + } + return t; +}; +Matrix3.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t) : new Matrix3( + e[0], + e[3], + e[6], + e[1], + e[4], + e[7], + e[2], + e[5], + e[8] + ); +}; +Matrix3.fromArray = Matrix3.unpack; +Matrix3.fromColumnMajorArray = function(e, t) { + return Matrix3.clone(e, t); +}; +Matrix3.fromRowMajorArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[3], t[2] = e[6], t[3] = e[1], t[4] = e[4], t[5] = e[7], t[6] = e[2], t[7] = e[5], t[8] = e[8], t) : new Matrix3( + e[0], + e[1], + e[2], + e[3], + e[4], + e[5], + e[6], + e[7], + e[8] + ); +}; +Matrix3.fromQuaternion = function(e, t) { + const n = e.x * e.x, i = e.x * e.y, r = e.x * e.z, o = e.x * e.w, s = e.y * e.y, c = e.y * e.z, l = e.y * e.w, d = e.z * e.z, f = e.z * e.w, h = e.w * e.w, p = n - s - d + h, m = 2 * (i - f), _ = 2 * (r + l), y = 2 * (i + f), C = -n + s - d + h, T = 2 * (c - o), x = 2 * (r - l), b = 2 * (c + o), S = -n - s + d + h; + return defined(t) ? (t[0] = p, t[1] = y, t[2] = x, t[3] = m, t[4] = C, t[5] = b, t[6] = _, t[7] = T, t[8] = S, t) : new Matrix3(p, m, _, y, C, T, x, b, S); +}; +Matrix3.fromHeadingPitchRoll = function(e, t) { + const n = Math.cos(-e.pitch), i = Math.cos(-e.heading), r = Math.cos(e.roll), o = Math.sin(-e.pitch), s = Math.sin(-e.heading), c = Math.sin(e.roll), l = n * i, d = -r * s + c * o * i, f = c * s + r * o * i, h = n * s, p = r * i + c * o * s, m = -c * i + r * o * s, _ = -o, y = c * n, C = r * n; + return defined(t) ? (t[0] = l, t[1] = h, t[2] = _, t[3] = d, t[4] = p, t[5] = y, t[6] = f, t[7] = m, t[8] = C, t) : new Matrix3(l, d, f, h, p, m, _, y, C); +}; +Matrix3.fromScale = function(e, t) { + return defined(t) ? (t[0] = e.x, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = e.y, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = e.z, t) : new Matrix3(e.x, 0, 0, 0, e.y, 0, 0, 0, e.z); +}; +Matrix3.fromUniformScale = function(e, t) { + return defined(t) ? (t[0] = e, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = e, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = e, t) : new Matrix3(e, 0, 0, 0, e, 0, 0, 0, e); +}; +Matrix3.fromCrossProduct = function(e, t) { + return defined(t) ? (t[0] = 0, t[1] = e.z, t[2] = -e.y, t[3] = -e.z, t[4] = 0, t[5] = e.x, t[6] = e.y, t[7] = -e.x, t[8] = 0, t) : new Matrix3( + 0, + -e.z, + e.y, + e.z, + 0, + -e.x, + -e.y, + e.x, + 0 + ); +}; +Matrix3.fromRotationX = function(e, t) { + const n = Math.cos(e), i = Math.sin(e); + return defined(t) ? (t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = n, t[5] = i, t[6] = 0, t[7] = -i, t[8] = n, t) : new Matrix3( + 1, + 0, + 0, + 0, + n, + -i, + 0, + i, + n + ); +}; +Matrix3.fromRotationY = function(e, t) { + const n = Math.cos(e), i = Math.sin(e); + return defined(t) ? (t[0] = n, t[1] = 0, t[2] = -i, t[3] = 0, t[4] = 1, t[5] = 0, t[6] = i, t[7] = 0, t[8] = n, t) : new Matrix3( + n, + 0, + i, + 0, + 1, + 0, + -i, + 0, + n + ); +}; +Matrix3.fromRotationZ = function(e, t) { + const n = Math.cos(e), i = Math.sin(e); + return defined(t) ? (t[0] = n, t[1] = i, t[2] = 0, t[3] = -i, t[4] = n, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = 1, t) : new Matrix3( + n, + -i, + 0, + i, + n, + 0, + 0, + 0, + 1 + ); +}; +Matrix3.toArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t) : [ + e[0], + e[1], + e[2], + e[3], + e[4], + e[5], + e[6], + e[7], + e[8] + ]; +}; +Matrix3.getElementIndex = function(e, t) { + return e * 3 + t; +}; +Matrix3.getColumn = function(e, t, n) { + const i = t * 3, r = e[i], o = e[i + 1], s = e[i + 2]; + return n.x = r, n.y = o, n.z = s, n; +}; +Matrix3.setColumn = function(e, t, n, i) { + i = Matrix3.clone(e, i); + const r = t * 3; + return i[r] = n.x, i[r + 1] = n.y, i[r + 2] = n.z, i; +}; +Matrix3.getRow = function(e, t, n) { + const i = e[t], r = e[t + 3], o = e[t + 6]; + return n.x = i, n.y = r, n.z = o, n; +}; +Matrix3.setRow = function(e, t, n, i) { + return i = Matrix3.clone(e, i), i[t] = n.x, i[t + 3] = n.y, i[t + 6] = n.z, i; +}; +const scaleScratch1$2 = new Cartesian3(); +Matrix3.setScale = function(e, t, n) { + const i = Matrix3.getScale(e, scaleScratch1$2), r = t.x / i.x, o = t.y / i.y, s = t.z / i.z; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * r, n[3] = e[3] * o, n[4] = e[4] * o, n[5] = e[5] * o, n[6] = e[6] * s, n[7] = e[7] * s, n[8] = e[8] * s, n; +}; +const scaleScratch2$2 = new Cartesian3(); +Matrix3.setUniformScale = function(e, t, n) { + const i = Matrix3.getScale(e, scaleScratch2$2), r = t / i.x, o = t / i.y, s = t / i.z; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * r, n[3] = e[3] * o, n[4] = e[4] * o, n[5] = e[5] * o, n[6] = e[6] * s, n[7] = e[7] * s, n[8] = e[8] * s, n; +}; +const scratchColumn$2 = new Cartesian3(); +Matrix3.getScale = function(e, t) { + return t.x = Cartesian3.magnitude( + Cartesian3.fromElements(e[0], e[1], e[2], scratchColumn$2) + ), t.y = Cartesian3.magnitude( + Cartesian3.fromElements(e[3], e[4], e[5], scratchColumn$2) + ), t.z = Cartesian3.magnitude( + Cartesian3.fromElements(e[6], e[7], e[8], scratchColumn$2) + ), t; +}; +const scaleScratch3$2 = new Cartesian3(); +Matrix3.getMaximumScale = function(e) { + return Matrix3.getScale(e, scaleScratch3$2), Cartesian3.maximumComponent(scaleScratch3$2); +}; +const scaleScratch4$2 = new Cartesian3(); +Matrix3.setRotation = function(e, t, n) { + const i = Matrix3.getScale(e, scaleScratch4$2); + return n[0] = t[0] * i.x, n[1] = t[1] * i.x, n[2] = t[2] * i.x, n[3] = t[3] * i.y, n[4] = t[4] * i.y, n[5] = t[5] * i.y, n[6] = t[6] * i.z, n[7] = t[7] * i.z, n[8] = t[8] * i.z, n; +}; +const scaleScratch5$2 = new Cartesian3(); +Matrix3.getRotation = function(e, t) { + const n = Matrix3.getScale(e, scaleScratch5$2); + return t[0] = e[0] / n.x, t[1] = e[1] / n.x, t[2] = e[2] / n.x, t[3] = e[3] / n.y, t[4] = e[4] / n.y, t[5] = e[5] / n.y, t[6] = e[6] / n.z, t[7] = e[7] / n.z, t[8] = e[8] / n.z, t; +}; +Matrix3.multiply = function(e, t, n) { + const i = e[0] * t[0] + e[3] * t[1] + e[6] * t[2], r = e[1] * t[0] + e[4] * t[1] + e[7] * t[2], o = e[2] * t[0] + e[5] * t[1] + e[8] * t[2], s = e[0] * t[3] + e[3] * t[4] + e[6] * t[5], c = e[1] * t[3] + e[4] * t[4] + e[7] * t[5], l = e[2] * t[3] + e[5] * t[4] + e[8] * t[5], d = e[0] * t[6] + e[3] * t[7] + e[6] * t[8], f = e[1] * t[6] + e[4] * t[7] + e[7] * t[8], h = e[2] * t[6] + e[5] * t[7] + e[8] * t[8]; + return n[0] = i, n[1] = r, n[2] = o, n[3] = s, n[4] = c, n[5] = l, n[6] = d, n[7] = f, n[8] = h, n; +}; +Matrix3.add = function(e, t, n) { + return n[0] = e[0] + t[0], n[1] = e[1] + t[1], n[2] = e[2] + t[2], n[3] = e[3] + t[3], n[4] = e[4] + t[4], n[5] = e[5] + t[5], n[6] = e[6] + t[6], n[7] = e[7] + t[7], n[8] = e[8] + t[8], n; +}; +Matrix3.subtract = function(e, t, n) { + return n[0] = e[0] - t[0], n[1] = e[1] - t[1], n[2] = e[2] - t[2], n[3] = e[3] - t[3], n[4] = e[4] - t[4], n[5] = e[5] - t[5], n[6] = e[6] - t[6], n[7] = e[7] - t[7], n[8] = e[8] - t[8], n; +}; +Matrix3.multiplyByVector = function(e, t, n) { + const i = t.x, r = t.y, o = t.z, s = e[0] * i + e[3] * r + e[6] * o, c = e[1] * i + e[4] * r + e[7] * o, l = e[2] * i + e[5] * r + e[8] * o; + return n.x = s, n.y = c, n.z = l, n; +}; +Matrix3.multiplyByScalar = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3] * t, n[4] = e[4] * t, n[5] = e[5] * t, n[6] = e[6] * t, n[7] = e[7] * t, n[8] = e[8] * t, n; +}; +Matrix3.multiplyByScale = function(e, t, n) { + return n[0] = e[0] * t.x, n[1] = e[1] * t.x, n[2] = e[2] * t.x, n[3] = e[3] * t.y, n[4] = e[4] * t.y, n[5] = e[5] * t.y, n[6] = e[6] * t.z, n[7] = e[7] * t.z, n[8] = e[8] * t.z, n; +}; +Matrix3.multiplyByUniformScale = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3] * t, n[4] = e[4] * t, n[5] = e[5] * t, n[6] = e[6] * t, n[7] = e[7] * t, n[8] = e[8] * t, n; +}; +Matrix3.negate = function(e, t) { + return t[0] = -e[0], t[1] = -e[1], t[2] = -e[2], t[3] = -e[3], t[4] = -e[4], t[5] = -e[5], t[6] = -e[6], t[7] = -e[7], t[8] = -e[8], t; +}; +Matrix3.transpose = function(e, t) { + const n = e[0], i = e[3], r = e[6], o = e[1], s = e[4], c = e[7], l = e[2], d = e[5], f = e[8]; + return t[0] = n, t[1] = i, t[2] = r, t[3] = o, t[4] = s, t[5] = c, t[6] = l, t[7] = d, t[8] = f, t; +}; +function computeFrobeniusNorm(e) { + let t = 0; + for (let n = 0; n < 9; ++n) { + const i = e[n]; + t += i * i; + } + return Math.sqrt(t); +} +const rowVal = [1, 0, 0], colVal = [2, 2, 1]; +function offDiagonalFrobeniusNorm(e) { + let t = 0; + for (let n = 0; n < 3; ++n) { + const i = e[Matrix3.getElementIndex(colVal[n], rowVal[n])]; + t += 2 * i * i; + } + return Math.sqrt(t); +} +function shurDecomposition(e, t) { + const n = CesiumMath.EPSILON15; + let i = 0, r = 1; + for (let d = 0; d < 3; ++d) { + const f = Math.abs( + e[Matrix3.getElementIndex(colVal[d], rowVal[d])] + ); + f > i && (r = d, i = f); + } + let o = 1, s = 0; + const c = rowVal[r], l = colVal[r]; + if (Math.abs(e[Matrix3.getElementIndex(l, c)]) > n) { + const d = e[Matrix3.getElementIndex(l, l)], f = e[Matrix3.getElementIndex(c, c)], h = e[Matrix3.getElementIndex(l, c)], p = (d - f) / 2 / h; + let m; + p < 0 ? m = -1 / (-p + Math.sqrt(1 + p * p)) : m = 1 / (p + Math.sqrt(1 + p * p)), o = 1 / Math.sqrt(1 + m * m), s = m * o; + } + return t = Matrix3.clone(Matrix3.IDENTITY, t), t[Matrix3.getElementIndex(c, c)] = t[Matrix3.getElementIndex(l, l)] = o, t[Matrix3.getElementIndex(l, c)] = s, t[Matrix3.getElementIndex(c, l)] = -s, t; +} +const jMatrix = new Matrix3(), jMatrixTranspose = new Matrix3(); +Matrix3.computeEigenDecomposition = function(e, t) { + const n = CesiumMath.EPSILON20, i = 10; + let r = 0, o = 0; + defined(t) || (t = {}); + const s = t.unitary = Matrix3.clone( + Matrix3.IDENTITY, + t.unitary + ), c = t.diagonal = Matrix3.clone(e, t.diagonal), l = n * computeFrobeniusNorm(c); + for (; o < i && offDiagonalFrobeniusNorm(c) > l; ) + shurDecomposition(c, jMatrix), Matrix3.transpose(jMatrix, jMatrixTranspose), Matrix3.multiply(c, jMatrix, c), Matrix3.multiply(jMatrixTranspose, c, c), Matrix3.multiply(s, jMatrix, s), ++r > 2 && (++o, r = 0); + return t; +}; +Matrix3.abs = function(e, t) { + return t[0] = Math.abs(e[0]), t[1] = Math.abs(e[1]), t[2] = Math.abs(e[2]), t[3] = Math.abs(e[3]), t[4] = Math.abs(e[4]), t[5] = Math.abs(e[5]), t[6] = Math.abs(e[6]), t[7] = Math.abs(e[7]), t[8] = Math.abs(e[8]), t; +}; +Matrix3.determinant = function(e) { + const t = e[0], n = e[3], i = e[6], r = e[1], o = e[4], s = e[7], c = e[2], l = e[5], d = e[8]; + return t * (o * d - l * s) + r * (l * i - n * d) + c * (n * s - o * i); +}; +Matrix3.inverse = function(e, t) { + const n = e[0], i = e[1], r = e[2], o = e[3], s = e[4], c = e[5], l = e[6], d = e[7], f = e[8], h = Matrix3.determinant(e); + t[0] = s * f - d * c, t[1] = d * r - i * f, t[2] = i * c - s * r, t[3] = l * c - o * f, t[4] = n * f - l * r, t[5] = o * r - n * c, t[6] = o * d - l * s, t[7] = l * i - n * d, t[8] = n * s - o * i; + const p = 1 / h; + return Matrix3.multiplyByScalar(t, p, t); +}; +const scratchTransposeMatrix$1 = new Matrix3(); +Matrix3.inverseTranspose = function(e, t) { + return Matrix3.inverse( + Matrix3.transpose(e, scratchTransposeMatrix$1), + t + ); +}; +Matrix3.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[3] === t[3] && e[4] === t[4] && e[5] === t[5] && e[6] === t[6] && e[7] === t[7] && e[8] === t[8]; +}; +Matrix3.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e[0] - t[0]) <= n && Math.abs(e[1] - t[1]) <= n && Math.abs(e[2] - t[2]) <= n && Math.abs(e[3] - t[3]) <= n && Math.abs(e[4] - t[4]) <= n && Math.abs(e[5] - t[5]) <= n && Math.abs(e[6] - t[6]) <= n && Math.abs(e[7] - t[7]) <= n && Math.abs(e[8] - t[8]) <= n; +}; +Matrix3.IDENTITY = Object.freeze( + new Matrix3(1, 0, 0, 0, 1, 0, 0, 0, 1) +); +Matrix3.ZERO = Object.freeze( + new Matrix3(0, 0, 0, 0, 0, 0, 0, 0, 0) +); +Matrix3.COLUMN0ROW0 = 0; +Matrix3.COLUMN0ROW1 = 1; +Matrix3.COLUMN0ROW2 = 2; +Matrix3.COLUMN1ROW0 = 3; +Matrix3.COLUMN1ROW1 = 4; +Matrix3.COLUMN1ROW2 = 5; +Matrix3.COLUMN2ROW0 = 6; +Matrix3.COLUMN2ROW1 = 7; +Matrix3.COLUMN2ROW2 = 8; +Object.defineProperties(Matrix3.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix3.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix3.packedLength; + } + } +}); +Matrix3.prototype.clone = function(e) { + return Matrix3.clone(this, e); +}; +Matrix3.prototype.equals = function(e) { + return Matrix3.equals(this, e); +}; +Matrix3.equalsArray = function(e, t, n) { + return e[0] === t[n] && e[1] === t[n + 1] && e[2] === t[n + 2] && e[3] === t[n + 3] && e[4] === t[n + 4] && e[5] === t[n + 5] && e[6] === t[n + 6] && e[7] === t[n + 7] && e[8] === t[n + 8]; +}; +Matrix3.prototype.equalsEpsilon = function(e, t) { + return Matrix3.equalsEpsilon(this, e, t); +}; +Matrix3.prototype.toString = function() { + return `(${this[0]}, ${this[3]}, ${this[6]}) +(${this[1]}, ${this[4]}, ${this[7]}) +(${this[2]}, ${this[5]}, ${this[8]})`; +}; +function RuntimeError(e) { + this.name = "RuntimeError", this.message = e; + let t; + try { + throw new Error(); + } catch (n) { + t = n.stack; + } + this.stack = t; +} +defined(Object.create) && (RuntimeError.prototype = Object.create(Error.prototype), RuntimeError.prototype.constructor = RuntimeError); +RuntimeError.prototype.toString = function() { + let e = `${this.name}: ${this.message}`; + return defined(this.stack) && (e += ` +${this.stack.toString()}`), e; +}; +function Matrix4(e, t, n, i, r, o, s, c, l, d, f, h, p, m, _, y) { + this[0] = defaultValue(e, 0), this[1] = defaultValue(r, 0), this[2] = defaultValue(l, 0), this[3] = defaultValue(p, 0), this[4] = defaultValue(t, 0), this[5] = defaultValue(o, 0), this[6] = defaultValue(d, 0), this[7] = defaultValue(m, 0), this[8] = defaultValue(n, 0), this[9] = defaultValue(s, 0), this[10] = defaultValue(f, 0), this[11] = defaultValue(_, 0), this[12] = defaultValue(i, 0), this[13] = defaultValue(c, 0), this[14] = defaultValue(h, 0), this[15] = defaultValue(y, 0); +} +Matrix4.packedLength = 16; +Matrix4.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e[0], t[n++] = e[1], t[n++] = e[2], t[n++] = e[3], t[n++] = e[4], t[n++] = e[5], t[n++] = e[6], t[n++] = e[7], t[n++] = e[8], t[n++] = e[9], t[n++] = e[10], t[n++] = e[11], t[n++] = e[12], t[n++] = e[13], t[n++] = e[14], t[n] = e[15], t; +}; +Matrix4.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Matrix4()), n[0] = e[t++], n[1] = e[t++], n[2] = e[t++], n[3] = e[t++], n[4] = e[t++], n[5] = e[t++], n[6] = e[t++], n[7] = e[t++], n[8] = e[t++], n[9] = e[t++], n[10] = e[t++], n[11] = e[t++], n[12] = e[t++], n[13] = e[t++], n[14] = e[t++], n[15] = e[t], n; +}; +Matrix4.packArray = function(e, t) { + const n = e.length, i = n * 16; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Matrix4.pack(e[r], t, r * 16); + return t; +}; +Matrix4.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 16 : t = new Array(n / 16); + for (let i = 0; i < n; i += 16) { + const r = i / 16; + t[r] = Matrix4.unpack(e, i, t[r]); + } + return t; +}; +Matrix4.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t) : new Matrix4( + e[0], + e[4], + e[8], + e[12], + e[1], + e[5], + e[9], + e[13], + e[2], + e[6], + e[10], + e[14], + e[3], + e[7], + e[11], + e[15] + ); +}; +Matrix4.fromArray = Matrix4.unpack; +Matrix4.fromColumnMajorArray = function(e, t) { + return Matrix4.clone(e, t); +}; +Matrix4.fromRowMajorArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[4], t[2] = e[8], t[3] = e[12], t[4] = e[1], t[5] = e[5], t[6] = e[9], t[7] = e[13], t[8] = e[2], t[9] = e[6], t[10] = e[10], t[11] = e[14], t[12] = e[3], t[13] = e[7], t[14] = e[11], t[15] = e[15], t) : new Matrix4( + e[0], + e[1], + e[2], + e[3], + e[4], + e[5], + e[6], + e[7], + e[8], + e[9], + e[10], + e[11], + e[12], + e[13], + e[14], + e[15] + ); +}; +Matrix4.fromRotationTranslation = function(e, t, n) { + return t = defaultValue(t, Cartesian3.ZERO), defined(n) ? (n[0] = e[0], n[1] = e[1], n[2] = e[2], n[3] = 0, n[4] = e[3], n[5] = e[4], n[6] = e[5], n[7] = 0, n[8] = e[6], n[9] = e[7], n[10] = e[8], n[11] = 0, n[12] = t.x, n[13] = t.y, n[14] = t.z, n[15] = 1, n) : new Matrix4( + e[0], + e[3], + e[6], + t.x, + e[1], + e[4], + e[7], + t.y, + e[2], + e[5], + e[8], + t.z, + 0, + 0, + 0, + 1 + ); +}; +Matrix4.fromTranslationQuaternionRotationScale = function(e, t, n, i) { + defined(i) || (i = new Matrix4()); + const r = n.x, o = n.y, s = n.z, c = t.x * t.x, l = t.x * t.y, d = t.x * t.z, f = t.x * t.w, h = t.y * t.y, p = t.y * t.z, m = t.y * t.w, _ = t.z * t.z, y = t.z * t.w, C = t.w * t.w, T = c - h - _ + C, x = 2 * (l - y), b = 2 * (d + m), S = 2 * (l + y), E = -c + h - _ + C, A = 2 * (p - f), D = 2 * (d - m), P = 2 * (p + f), I = -c - h + _ + C; + return i[0] = T * r, i[1] = S * r, i[2] = D * r, i[3] = 0, i[4] = x * o, i[5] = E * o, i[6] = P * o, i[7] = 0, i[8] = b * s, i[9] = A * s, i[10] = I * s, i[11] = 0, i[12] = e.x, i[13] = e.y, i[14] = e.z, i[15] = 1, i; +}; +Matrix4.fromTranslationRotationScale = function(e, t) { + return Matrix4.fromTranslationQuaternionRotationScale( + e.translation, + e.rotation, + e.scale, + t + ); +}; +Matrix4.fromTranslation = function(e, t) { + return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, e, t); +}; +Matrix4.fromScale = function(e, t) { + return defined(t) ? (t[0] = e.x, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = e.y, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = e.z, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, t) : new Matrix4( + e.x, + 0, + 0, + 0, + 0, + e.y, + 0, + 0, + 0, + 0, + e.z, + 0, + 0, + 0, + 0, + 1 + ); +}; +Matrix4.fromUniformScale = function(e, t) { + return defined(t) ? (t[0] = e, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = e, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = e, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, t) : new Matrix4( + e, + 0, + 0, + 0, + 0, + e, + 0, + 0, + 0, + 0, + e, + 0, + 0, + 0, + 0, + 1 + ); +}; +Matrix4.fromRotation = function(e, t) { + return defined(t) || (t = new Matrix4()), t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = 0, t[4] = e[3], t[5] = e[4], t[6] = e[5], t[7] = 0, t[8] = e[6], t[9] = e[7], t[10] = e[8], t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, t; +}; +const fromCameraF = new Cartesian3(), fromCameraR = new Cartesian3(), fromCameraU = new Cartesian3(); +Matrix4.fromCamera = function(e, t) { + const n = e.position, i = e.direction, r = e.up; + Cartesian3.normalize(i, fromCameraF), Cartesian3.normalize( + Cartesian3.cross(fromCameraF, r, fromCameraR), + fromCameraR + ), Cartesian3.normalize( + Cartesian3.cross(fromCameraR, fromCameraF, fromCameraU), + fromCameraU + ); + const o = fromCameraR.x, s = fromCameraR.y, c = fromCameraR.z, l = fromCameraF.x, d = fromCameraF.y, f = fromCameraF.z, h = fromCameraU.x, p = fromCameraU.y, m = fromCameraU.z, _ = n.x, y = n.y, C = n.z, T = o * -_ + s * -y + c * -C, x = h * -_ + p * -y + m * -C, b = l * _ + d * y + f * C; + return defined(t) ? (t[0] = o, t[1] = h, t[2] = -l, t[3] = 0, t[4] = s, t[5] = p, t[6] = -d, t[7] = 0, t[8] = c, t[9] = m, t[10] = -f, t[11] = 0, t[12] = T, t[13] = x, t[14] = b, t[15] = 1, t) : new Matrix4( + o, + s, + c, + T, + h, + p, + m, + x, + -l, + -d, + -f, + b, + 0, + 0, + 0, + 1 + ); +}; +Matrix4.computePerspectiveFieldOfView = function(e, t, n, i, r) { + const s = 1 / Math.tan(e * 0.5), c = s / t, l = (i + n) / (n - i), d = 2 * i * n / (n - i); + return r[0] = c, r[1] = 0, r[2] = 0, r[3] = 0, r[4] = 0, r[5] = s, r[6] = 0, r[7] = 0, r[8] = 0, r[9] = 0, r[10] = l, r[11] = -1, r[12] = 0, r[13] = 0, r[14] = d, r[15] = 0, r; +}; +Matrix4.computeOrthographicOffCenter = function(e, t, n, i, r, o, s) { + let c = 1 / (t - e), l = 1 / (i - n), d = 1 / (o - r); + const f = -(t + e) * c, h = -(i + n) * l, p = -(o + r) * d; + return c *= 2, l *= 2, d *= -2, s[0] = c, s[1] = 0, s[2] = 0, s[3] = 0, s[4] = 0, s[5] = l, s[6] = 0, s[7] = 0, s[8] = 0, s[9] = 0, s[10] = d, s[11] = 0, s[12] = f, s[13] = h, s[14] = p, s[15] = 1, s; +}; +Matrix4.computePerspectiveOffCenter = function(e, t, n, i, r, o, s) { + const c = 2 * r / (t - e), l = 2 * r / (i - n), d = (t + e) / (t - e), f = (i + n) / (i - n), h = -(o + r) / (o - r), p = -1, m = -2 * o * r / (o - r); + return s[0] = c, s[1] = 0, s[2] = 0, s[3] = 0, s[4] = 0, s[5] = l, s[6] = 0, s[7] = 0, s[8] = d, s[9] = f, s[10] = h, s[11] = p, s[12] = 0, s[13] = 0, s[14] = m, s[15] = 0, s; +}; +Matrix4.computeInfinitePerspectiveOffCenter = function(e, t, n, i, r, o) { + const s = 2 * r / (t - e), c = 2 * r / (i - n), l = (t + e) / (t - e), d = (i + n) / (i - n), f = -1, h = -1, p = -2 * r; + return o[0] = s, o[1] = 0, o[2] = 0, o[3] = 0, o[4] = 0, o[5] = c, o[6] = 0, o[7] = 0, o[8] = l, o[9] = d, o[10] = f, o[11] = h, o[12] = 0, o[13] = 0, o[14] = p, o[15] = 0, o; +}; +Matrix4.computeViewportTransformation = function(e, t, n, i) { + defined(i) || (i = new Matrix4()), e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const r = defaultValue(e.x, 0), o = defaultValue(e.y, 0), s = defaultValue(e.width, 0), c = defaultValue(e.height, 0); + t = defaultValue(t, 0), n = defaultValue(n, 1); + const l = s * 0.5, d = c * 0.5, f = (n - t) * 0.5, h = l, p = d, m = f, _ = r + l, y = o + d, C = t + f, T = 1; + return i[0] = h, i[1] = 0, i[2] = 0, i[3] = 0, i[4] = 0, i[5] = p, i[6] = 0, i[7] = 0, i[8] = 0, i[9] = 0, i[10] = m, i[11] = 0, i[12] = _, i[13] = y, i[14] = C, i[15] = T, i; +}; +Matrix4.computeView = function(e, t, n, i, r) { + return r[0] = i.x, r[1] = n.x, r[2] = -t.x, r[3] = 0, r[4] = i.y, r[5] = n.y, r[6] = -t.y, r[7] = 0, r[8] = i.z, r[9] = n.z, r[10] = -t.z, r[11] = 0, r[12] = -Cartesian3.dot(i, e), r[13] = -Cartesian3.dot(n, e), r[14] = Cartesian3.dot(t, e), r[15] = 1, r; +}; +Matrix4.toArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t) : [ + e[0], + e[1], + e[2], + e[3], + e[4], + e[5], + e[6], + e[7], + e[8], + e[9], + e[10], + e[11], + e[12], + e[13], + e[14], + e[15] + ]; +}; +Matrix4.getElementIndex = function(e, t) { + return e * 4 + t; +}; +Matrix4.getColumn = function(e, t, n) { + const i = t * 4, r = e[i], o = e[i + 1], s = e[i + 2], c = e[i + 3]; + return n.x = r, n.y = o, n.z = s, n.w = c, n; +}; +Matrix4.setColumn = function(e, t, n, i) { + i = Matrix4.clone(e, i); + const r = t * 4; + return i[r] = n.x, i[r + 1] = n.y, i[r + 2] = n.z, i[r + 3] = n.w, i; +}; +Matrix4.getRow = function(e, t, n) { + const i = e[t], r = e[t + 4], o = e[t + 8], s = e[t + 12]; + return n.x = i, n.y = r, n.z = o, n.w = s, n; +}; +Matrix4.setRow = function(e, t, n, i) { + return i = Matrix4.clone(e, i), i[t] = n.x, i[t + 4] = n.y, i[t + 8] = n.z, i[t + 12] = n.w, i; +}; +Matrix4.setTranslation = function(e, t, n) { + return n[0] = e[0], n[1] = e[1], n[2] = e[2], n[3] = e[3], n[4] = e[4], n[5] = e[5], n[6] = e[6], n[7] = e[7], n[8] = e[8], n[9] = e[9], n[10] = e[10], n[11] = e[11], n[12] = t.x, n[13] = t.y, n[14] = t.z, n[15] = e[15], n; +}; +const scaleScratch1$1 = new Cartesian3(); +Matrix4.setScale = function(e, t, n) { + const i = Matrix4.getScale(e, scaleScratch1$1), r = t.x / i.x, o = t.y / i.y, s = t.z / i.z; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * r, n[3] = e[3], n[4] = e[4] * o, n[5] = e[5] * o, n[6] = e[6] * o, n[7] = e[7], n[8] = e[8] * s, n[9] = e[9] * s, n[10] = e[10] * s, n[11] = e[11], n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n; +}; +const scaleScratch2$1 = new Cartesian3(); +Matrix4.setUniformScale = function(e, t, n) { + const i = Matrix4.getScale(e, scaleScratch2$1), r = t / i.x, o = t / i.y, s = t / i.z; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * r, n[3] = e[3], n[4] = e[4] * o, n[5] = e[5] * o, n[6] = e[6] * o, n[7] = e[7], n[8] = e[8] * s, n[9] = e[9] * s, n[10] = e[10] * s, n[11] = e[11], n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n; +}; +const scratchColumn$1 = new Cartesian3(); +Matrix4.getScale = function(e, t) { + return t.x = Cartesian3.magnitude( + Cartesian3.fromElements(e[0], e[1], e[2], scratchColumn$1) + ), t.y = Cartesian3.magnitude( + Cartesian3.fromElements(e[4], e[5], e[6], scratchColumn$1) + ), t.z = Cartesian3.magnitude( + Cartesian3.fromElements(e[8], e[9], e[10], scratchColumn$1) + ), t; +}; +const scaleScratch3$1 = new Cartesian3(); +Matrix4.getMaximumScale = function(e) { + return Matrix4.getScale(e, scaleScratch3$1), Cartesian3.maximumComponent(scaleScratch3$1); +}; +const scaleScratch4$1 = new Cartesian3(); +Matrix4.setRotation = function(e, t, n) { + const i = Matrix4.getScale(e, scaleScratch4$1); + return n[0] = t[0] * i.x, n[1] = t[1] * i.x, n[2] = t[2] * i.x, n[3] = e[3], n[4] = t[3] * i.y, n[5] = t[4] * i.y, n[6] = t[5] * i.y, n[7] = e[7], n[8] = t[6] * i.z, n[9] = t[7] * i.z, n[10] = t[8] * i.z, n[11] = e[11], n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n; +}; +const scaleScratch5$1 = new Cartesian3(); +Matrix4.getRotation = function(e, t) { + const n = Matrix4.getScale(e, scaleScratch5$1); + return t[0] = e[0] / n.x, t[1] = e[1] / n.x, t[2] = e[2] / n.x, t[3] = e[4] / n.y, t[4] = e[5] / n.y, t[5] = e[6] / n.y, t[6] = e[8] / n.z, t[7] = e[9] / n.z, t[8] = e[10] / n.z, t; +}; +Matrix4.multiply = function(e, t, n) { + const i = e[0], r = e[1], o = e[2], s = e[3], c = e[4], l = e[5], d = e[6], f = e[7], h = e[8], p = e[9], m = e[10], _ = e[11], y = e[12], C = e[13], T = e[14], x = e[15], b = t[0], S = t[1], E = t[2], A = t[3], D = t[4], P = t[5], I = t[6], M = t[7], R = t[8], L = t[9], g = t[10], w = t[11], O = t[12], N = t[13], F = t[14], B = t[15], V = i * b + c * S + h * E + y * A, U = r * b + l * S + p * E + C * A, k = o * b + d * S + m * E + T * A, $ = s * b + f * S + _ * E + x * A, G = i * D + c * P + h * I + y * M, q = r * D + l * P + p * I + C * M, z = o * D + d * P + m * I + T * M, H = s * D + f * P + _ * I + x * M, Q = i * R + c * L + h * g + y * w, ne = r * R + l * L + p * g + C * w, K = o * R + d * L + m * g + T * w, Z = s * R + f * L + _ * g + x * w, ee = i * O + c * N + h * F + y * B, oe = r * O + l * N + p * F + C * B, X = o * O + d * N + m * F + T * B, fe = s * O + f * N + _ * F + x * B; + return n[0] = V, n[1] = U, n[2] = k, n[3] = $, n[4] = G, n[5] = q, n[6] = z, n[7] = H, n[8] = Q, n[9] = ne, n[10] = K, n[11] = Z, n[12] = ee, n[13] = oe, n[14] = X, n[15] = fe, n; +}; +Matrix4.add = function(e, t, n) { + return n[0] = e[0] + t[0], n[1] = e[1] + t[1], n[2] = e[2] + t[2], n[3] = e[3] + t[3], n[4] = e[4] + t[4], n[5] = e[5] + t[5], n[6] = e[6] + t[6], n[7] = e[7] + t[7], n[8] = e[8] + t[8], n[9] = e[9] + t[9], n[10] = e[10] + t[10], n[11] = e[11] + t[11], n[12] = e[12] + t[12], n[13] = e[13] + t[13], n[14] = e[14] + t[14], n[15] = e[15] + t[15], n; +}; +Matrix4.subtract = function(e, t, n) { + return n[0] = e[0] - t[0], n[1] = e[1] - t[1], n[2] = e[2] - t[2], n[3] = e[3] - t[3], n[4] = e[4] - t[4], n[5] = e[5] - t[5], n[6] = e[6] - t[6], n[7] = e[7] - t[7], n[8] = e[8] - t[8], n[9] = e[9] - t[9], n[10] = e[10] - t[10], n[11] = e[11] - t[11], n[12] = e[12] - t[12], n[13] = e[13] - t[13], n[14] = e[14] - t[14], n[15] = e[15] - t[15], n; +}; +Matrix4.multiplyTransformation = function(e, t, n) { + const i = e[0], r = e[1], o = e[2], s = e[4], c = e[5], l = e[6], d = e[8], f = e[9], h = e[10], p = e[12], m = e[13], _ = e[14], y = t[0], C = t[1], T = t[2], x = t[4], b = t[5], S = t[6], E = t[8], A = t[9], D = t[10], P = t[12], I = t[13], M = t[14], R = i * y + s * C + d * T, L = r * y + c * C + f * T, g = o * y + l * C + h * T, w = i * x + s * b + d * S, O = r * x + c * b + f * S, N = o * x + l * b + h * S, F = i * E + s * A + d * D, B = r * E + c * A + f * D, V = o * E + l * A + h * D, U = i * P + s * I + d * M + p, k = r * P + c * I + f * M + m, $ = o * P + l * I + h * M + _; + return n[0] = R, n[1] = L, n[2] = g, n[3] = 0, n[4] = w, n[5] = O, n[6] = N, n[7] = 0, n[8] = F, n[9] = B, n[10] = V, n[11] = 0, n[12] = U, n[13] = k, n[14] = $, n[15] = 1, n; +}; +Matrix4.multiplyByMatrix3 = function(e, t, n) { + const i = e[0], r = e[1], o = e[2], s = e[4], c = e[5], l = e[6], d = e[8], f = e[9], h = e[10], p = t[0], m = t[1], _ = t[2], y = t[3], C = t[4], T = t[5], x = t[6], b = t[7], S = t[8], E = i * p + s * m + d * _, A = r * p + c * m + f * _, D = o * p + l * m + h * _, P = i * y + s * C + d * T, I = r * y + c * C + f * T, M = o * y + l * C + h * T, R = i * x + s * b + d * S, L = r * x + c * b + f * S, g = o * x + l * b + h * S; + return n[0] = E, n[1] = A, n[2] = D, n[3] = 0, n[4] = P, n[5] = I, n[6] = M, n[7] = 0, n[8] = R, n[9] = L, n[10] = g, n[11] = 0, n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n; +}; +Matrix4.multiplyByTranslation = function(e, t, n) { + const i = t.x, r = t.y, o = t.z, s = i * e[0] + r * e[4] + o * e[8] + e[12], c = i * e[1] + r * e[5] + o * e[9] + e[13], l = i * e[2] + r * e[6] + o * e[10] + e[14]; + return n[0] = e[0], n[1] = e[1], n[2] = e[2], n[3] = e[3], n[4] = e[4], n[5] = e[5], n[6] = e[6], n[7] = e[7], n[8] = e[8], n[9] = e[9], n[10] = e[10], n[11] = e[11], n[12] = s, n[13] = c, n[14] = l, n[15] = e[15], n; +}; +Matrix4.multiplyByScale = function(e, t, n) { + const i = t.x, r = t.y, o = t.z; + return i === 1 && r === 1 && o === 1 ? Matrix4.clone(e, n) : (n[0] = i * e[0], n[1] = i * e[1], n[2] = i * e[2], n[3] = e[3], n[4] = r * e[4], n[5] = r * e[5], n[6] = r * e[6], n[7] = e[7], n[8] = o * e[8], n[9] = o * e[9], n[10] = o * e[10], n[11] = e[11], n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n); +}; +Matrix4.multiplyByUniformScale = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3], n[4] = e[4] * t, n[5] = e[5] * t, n[6] = e[6] * t, n[7] = e[7], n[8] = e[8] * t, n[9] = e[9] * t, n[10] = e[10] * t, n[11] = e[11], n[12] = e[12], n[13] = e[13], n[14] = e[14], n[15] = e[15], n; +}; +Matrix4.multiplyByVector = function(e, t, n) { + const i = t.x, r = t.y, o = t.z, s = t.w, c = e[0] * i + e[4] * r + e[8] * o + e[12] * s, l = e[1] * i + e[5] * r + e[9] * o + e[13] * s, d = e[2] * i + e[6] * r + e[10] * o + e[14] * s, f = e[3] * i + e[7] * r + e[11] * o + e[15] * s; + return n.x = c, n.y = l, n.z = d, n.w = f, n; +}; +Matrix4.multiplyByPointAsVector = function(e, t, n) { + const i = t.x, r = t.y, o = t.z, s = e[0] * i + e[4] * r + e[8] * o, c = e[1] * i + e[5] * r + e[9] * o, l = e[2] * i + e[6] * r + e[10] * o; + return n.x = s, n.y = c, n.z = l, n; +}; +Matrix4.multiplyByPoint = function(e, t, n) { + const i = t.x, r = t.y, o = t.z, s = e[0] * i + e[4] * r + e[8] * o + e[12], c = e[1] * i + e[5] * r + e[9] * o + e[13], l = e[2] * i + e[6] * r + e[10] * o + e[14]; + return n.x = s, n.y = c, n.z = l, n; +}; +Matrix4.multiplyByScalar = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3] * t, n[4] = e[4] * t, n[5] = e[5] * t, n[6] = e[6] * t, n[7] = e[7] * t, n[8] = e[8] * t, n[9] = e[9] * t, n[10] = e[10] * t, n[11] = e[11] * t, n[12] = e[12] * t, n[13] = e[13] * t, n[14] = e[14] * t, n[15] = e[15] * t, n; +}; +Matrix4.negate = function(e, t) { + return t[0] = -e[0], t[1] = -e[1], t[2] = -e[2], t[3] = -e[3], t[4] = -e[4], t[5] = -e[5], t[6] = -e[6], t[7] = -e[7], t[8] = -e[8], t[9] = -e[9], t[10] = -e[10], t[11] = -e[11], t[12] = -e[12], t[13] = -e[13], t[14] = -e[14], t[15] = -e[15], t; +}; +Matrix4.transpose = function(e, t) { + const n = e[1], i = e[2], r = e[3], o = e[6], s = e[7], c = e[11]; + return t[0] = e[0], t[1] = e[4], t[2] = e[8], t[3] = e[12], t[4] = n, t[5] = e[5], t[6] = e[9], t[7] = e[13], t[8] = i, t[9] = o, t[10] = e[10], t[11] = e[14], t[12] = r, t[13] = s, t[14] = c, t[15] = e[15], t; +}; +Matrix4.abs = function(e, t) { + return t[0] = Math.abs(e[0]), t[1] = Math.abs(e[1]), t[2] = Math.abs(e[2]), t[3] = Math.abs(e[3]), t[4] = Math.abs(e[4]), t[5] = Math.abs(e[5]), t[6] = Math.abs(e[6]), t[7] = Math.abs(e[7]), t[8] = Math.abs(e[8]), t[9] = Math.abs(e[9]), t[10] = Math.abs(e[10]), t[11] = Math.abs(e[11]), t[12] = Math.abs(e[12]), t[13] = Math.abs(e[13]), t[14] = Math.abs(e[14]), t[15] = Math.abs(e[15]), t; +}; +Matrix4.equals = function(e, t) { + return e === t || defined(e) && defined(t) && // Translation + e[12] === t[12] && e[13] === t[13] && e[14] === t[14] && // Rotation/scale + e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[4] === t[4] && e[5] === t[5] && e[6] === t[6] && e[8] === t[8] && e[9] === t[9] && e[10] === t[10] && // Bottom row + e[3] === t[3] && e[7] === t[7] && e[11] === t[11] && e[15] === t[15]; +}; +Matrix4.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e[0] - t[0]) <= n && Math.abs(e[1] - t[1]) <= n && Math.abs(e[2] - t[2]) <= n && Math.abs(e[3] - t[3]) <= n && Math.abs(e[4] - t[4]) <= n && Math.abs(e[5] - t[5]) <= n && Math.abs(e[6] - t[6]) <= n && Math.abs(e[7] - t[7]) <= n && Math.abs(e[8] - t[8]) <= n && Math.abs(e[9] - t[9]) <= n && Math.abs(e[10] - t[10]) <= n && Math.abs(e[11] - t[11]) <= n && Math.abs(e[12] - t[12]) <= n && Math.abs(e[13] - t[13]) <= n && Math.abs(e[14] - t[14]) <= n && Math.abs(e[15] - t[15]) <= n; +}; +Matrix4.getTranslation = function(e, t) { + return t.x = e[12], t.y = e[13], t.z = e[14], t; +}; +Matrix4.getMatrix3 = function(e, t) { + return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[4], t[4] = e[5], t[5] = e[6], t[6] = e[8], t[7] = e[9], t[8] = e[10], t; +}; +const scratchInverseRotation = new Matrix3(), scratchMatrix3Zero = new Matrix3(), scratchBottomRow = new Cartesian4(), scratchExpectedBottomRow = new Cartesian4(0, 0, 0, 1); +Matrix4.inverse = function(e, t) { + const n = e[0], i = e[4], r = e[8], o = e[12], s = e[1], c = e[5], l = e[9], d = e[13], f = e[2], h = e[6], p = e[10], m = e[14], _ = e[3], y = e[7], C = e[11], T = e[15]; + let x = p * T, b = m * C, S = h * T, E = m * y, A = h * C, D = p * y, P = f * T, I = m * _, M = f * C, R = p * _, L = f * y, g = h * _; + const w = x * c + E * l + A * d - (b * c + S * l + D * d), O = b * s + P * l + R * d - (x * s + I * l + M * d), N = S * s + I * c + L * d - (E * s + P * c + g * d), F = D * s + M * c + g * l - (A * s + R * c + L * l), B = b * i + S * r + D * o - (x * i + E * r + A * o), V = x * n + I * r + M * o - (b * n + P * r + R * o), U = E * n + P * i + g * o - (S * n + I * i + L * o), k = A * n + R * i + L * r - (D * n + M * i + g * r); + x = r * d, b = o * l, S = i * d, E = o * c, A = i * l, D = r * c, P = n * d, I = o * s, M = n * l, R = r * s, L = n * c, g = i * s; + const $ = x * y + E * C + A * T - (b * y + S * C + D * T), G = b * _ + P * C + R * T - (x * _ + I * C + M * T), q = S * _ + I * y + L * T - (E * _ + P * y + g * T), z = D * _ + M * y + g * C - (A * _ + R * y + L * C), H = S * p + D * m + b * h - (A * m + x * h + E * p), Q = M * m + x * f + I * p - (P * p + R * m + b * f), ne = P * h + g * m + E * f - (L * m + S * f + I * h), K = L * p + A * f + R * h - (M * h + g * p + D * f); + let Z = n * w + i * O + r * N + o * F; + if (Math.abs(Z) < CesiumMath.EPSILON21) { + if (Matrix3.equalsEpsilon( + Matrix4.getMatrix3(e, scratchInverseRotation), + scratchMatrix3Zero, + CesiumMath.EPSILON7 + ) && Cartesian4.equals( + Matrix4.getRow(e, 3, scratchBottomRow), + scratchExpectedBottomRow + )) + return t[0] = 0, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 0, t[11] = 0, t[12] = -e[12], t[13] = -e[13], t[14] = -e[14], t[15] = 1, t; + throw new RuntimeError( + "matrix is not invertible because its determinate is zero." + ); + } + return Z = 1 / Z, t[0] = w * Z, t[1] = O * Z, t[2] = N * Z, t[3] = F * Z, t[4] = B * Z, t[5] = V * Z, t[6] = U * Z, t[7] = k * Z, t[8] = $ * Z, t[9] = G * Z, t[10] = q * Z, t[11] = z * Z, t[12] = H * Z, t[13] = Q * Z, t[14] = ne * Z, t[15] = K * Z, t; +}; +Matrix4.inverseTransformation = function(e, t) { + const n = e[0], i = e[1], r = e[2], o = e[4], s = e[5], c = e[6], l = e[8], d = e[9], f = e[10], h = e[12], p = e[13], m = e[14], _ = -n * h - i * p - r * m, y = -o * h - s * p - c * m, C = -l * h - d * p - f * m; + return t[0] = n, t[1] = o, t[2] = l, t[3] = 0, t[4] = i, t[5] = s, t[6] = d, t[7] = 0, t[8] = r, t[9] = c, t[10] = f, t[11] = 0, t[12] = _, t[13] = y, t[14] = C, t[15] = 1, t; +}; +const scratchTransposeMatrix = new Matrix4(); +Matrix4.inverseTranspose = function(e, t) { + return Matrix4.inverse( + Matrix4.transpose(e, scratchTransposeMatrix), + t + ); +}; +Matrix4.IDENTITY = Object.freeze( + new Matrix4( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ) +); +Matrix4.ZERO = Object.freeze( + new Matrix4( + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ) +); +Matrix4.COLUMN0ROW0 = 0; +Matrix4.COLUMN0ROW1 = 1; +Matrix4.COLUMN0ROW2 = 2; +Matrix4.COLUMN0ROW3 = 3; +Matrix4.COLUMN1ROW0 = 4; +Matrix4.COLUMN1ROW1 = 5; +Matrix4.COLUMN1ROW2 = 6; +Matrix4.COLUMN1ROW3 = 7; +Matrix4.COLUMN2ROW0 = 8; +Matrix4.COLUMN2ROW1 = 9; +Matrix4.COLUMN2ROW2 = 10; +Matrix4.COLUMN2ROW3 = 11; +Matrix4.COLUMN3ROW0 = 12; +Matrix4.COLUMN3ROW1 = 13; +Matrix4.COLUMN3ROW2 = 14; +Matrix4.COLUMN3ROW3 = 15; +Object.defineProperties(Matrix4.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix4.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix4.packedLength; + } + } +}); +Matrix4.prototype.clone = function(e) { + return Matrix4.clone(this, e); +}; +Matrix4.prototype.equals = function(e) { + return Matrix4.equals(this, e); +}; +Matrix4.equalsArray = function(e, t, n) { + return e[0] === t[n] && e[1] === t[n + 1] && e[2] === t[n + 2] && e[3] === t[n + 3] && e[4] === t[n + 4] && e[5] === t[n + 5] && e[6] === t[n + 6] && e[7] === t[n + 7] && e[8] === t[n + 8] && e[9] === t[n + 9] && e[10] === t[n + 10] && e[11] === t[n + 11] && e[12] === t[n + 12] && e[13] === t[n + 13] && e[14] === t[n + 14] && e[15] === t[n + 15]; +}; +Matrix4.prototype.equalsEpsilon = function(e, t) { + return Matrix4.equalsEpsilon(this, e, t); +}; +Matrix4.prototype.toString = function() { + return `(${this[0]}, ${this[4]}, ${this[8]}, ${this[12]}) +(${this[1]}, ${this[5]}, ${this[9]}, ${this[13]}) +(${this[2]}, ${this[6]}, ${this[10]}, ${this[14]}) +(${this[3]}, ${this[7]}, ${this[11]}, ${this[15]})`; +}; +const WebGLConstants = { + DEPTH_BUFFER_BIT: 256, + STENCIL_BUFFER_BIT: 1024, + COLOR_BUFFER_BIT: 16384, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + ZERO: 0, + ONE: 1, + SRC_COLOR: 768, + ONE_MINUS_SRC_COLOR: 769, + SRC_ALPHA: 770, + ONE_MINUS_SRC_ALPHA: 771, + DST_ALPHA: 772, + ONE_MINUS_DST_ALPHA: 773, + DST_COLOR: 774, + ONE_MINUS_DST_COLOR: 775, + SRC_ALPHA_SATURATE: 776, + FUNC_ADD: 32774, + BLEND_EQUATION: 32777, + BLEND_EQUATION_RGB: 32777, + // same as BLEND_EQUATION + BLEND_EQUATION_ALPHA: 34877, + FUNC_SUBTRACT: 32778, + FUNC_REVERSE_SUBTRACT: 32779, + BLEND_DST_RGB: 32968, + BLEND_SRC_RGB: 32969, + BLEND_DST_ALPHA: 32970, + BLEND_SRC_ALPHA: 32971, + CONSTANT_COLOR: 32769, + ONE_MINUS_CONSTANT_COLOR: 32770, + CONSTANT_ALPHA: 32771, + ONE_MINUS_CONSTANT_ALPHA: 32772, + BLEND_COLOR: 32773, + ARRAY_BUFFER: 34962, + ELEMENT_ARRAY_BUFFER: 34963, + ARRAY_BUFFER_BINDING: 34964, + ELEMENT_ARRAY_BUFFER_BINDING: 34965, + STREAM_DRAW: 35040, + STATIC_DRAW: 35044, + DYNAMIC_DRAW: 35048, + BUFFER_SIZE: 34660, + BUFFER_USAGE: 34661, + CURRENT_VERTEX_ATTRIB: 34342, + FRONT: 1028, + BACK: 1029, + FRONT_AND_BACK: 1032, + CULL_FACE: 2884, + BLEND: 3042, + DITHER: 3024, + STENCIL_TEST: 2960, + DEPTH_TEST: 2929, + SCISSOR_TEST: 3089, + POLYGON_OFFSET_FILL: 32823, + SAMPLE_ALPHA_TO_COVERAGE: 32926, + SAMPLE_COVERAGE: 32928, + NO_ERROR: 0, + INVALID_ENUM: 1280, + INVALID_VALUE: 1281, + INVALID_OPERATION: 1282, + OUT_OF_MEMORY: 1285, + CW: 2304, + CCW: 2305, + LINE_WIDTH: 2849, + ALIASED_POINT_SIZE_RANGE: 33901, + ALIASED_LINE_WIDTH_RANGE: 33902, + CULL_FACE_MODE: 2885, + FRONT_FACE: 2886, + DEPTH_RANGE: 2928, + DEPTH_WRITEMASK: 2930, + DEPTH_CLEAR_VALUE: 2931, + DEPTH_FUNC: 2932, + STENCIL_CLEAR_VALUE: 2961, + STENCIL_FUNC: 2962, + STENCIL_FAIL: 2964, + STENCIL_PASS_DEPTH_FAIL: 2965, + STENCIL_PASS_DEPTH_PASS: 2966, + STENCIL_REF: 2967, + STENCIL_VALUE_MASK: 2963, + STENCIL_WRITEMASK: 2968, + STENCIL_BACK_FUNC: 34816, + STENCIL_BACK_FAIL: 34817, + STENCIL_BACK_PASS_DEPTH_FAIL: 34818, + STENCIL_BACK_PASS_DEPTH_PASS: 34819, + STENCIL_BACK_REF: 36003, + STENCIL_BACK_VALUE_MASK: 36004, + STENCIL_BACK_WRITEMASK: 36005, + VIEWPORT: 2978, + SCISSOR_BOX: 3088, + COLOR_CLEAR_VALUE: 3106, + COLOR_WRITEMASK: 3107, + UNPACK_ALIGNMENT: 3317, + PACK_ALIGNMENT: 3333, + MAX_TEXTURE_SIZE: 3379, + MAX_VIEWPORT_DIMS: 3386, + SUBPIXEL_BITS: 3408, + RED_BITS: 3410, + GREEN_BITS: 3411, + BLUE_BITS: 3412, + ALPHA_BITS: 3413, + DEPTH_BITS: 3414, + STENCIL_BITS: 3415, + POLYGON_OFFSET_UNITS: 10752, + POLYGON_OFFSET_FACTOR: 32824, + TEXTURE_BINDING_2D: 32873, + SAMPLE_BUFFERS: 32936, + SAMPLES: 32937, + SAMPLE_COVERAGE_VALUE: 32938, + SAMPLE_COVERAGE_INVERT: 32939, + COMPRESSED_TEXTURE_FORMATS: 34467, + DONT_CARE: 4352, + FASTEST: 4353, + NICEST: 4354, + GENERATE_MIPMAP_HINT: 33170, + BYTE: 5120, + UNSIGNED_BYTE: 5121, + SHORT: 5122, + UNSIGNED_SHORT: 5123, + INT: 5124, + UNSIGNED_INT: 5125, + FLOAT: 5126, + DEPTH_COMPONENT: 6402, + ALPHA: 6406, + RGB: 6407, + RGBA: 6408, + LUMINANCE: 6409, + LUMINANCE_ALPHA: 6410, + UNSIGNED_SHORT_4_4_4_4: 32819, + UNSIGNED_SHORT_5_5_5_1: 32820, + UNSIGNED_SHORT_5_6_5: 33635, + FRAGMENT_SHADER: 35632, + VERTEX_SHADER: 35633, + MAX_VERTEX_ATTRIBS: 34921, + MAX_VERTEX_UNIFORM_VECTORS: 36347, + MAX_VARYING_VECTORS: 36348, + MAX_COMBINED_TEXTURE_IMAGE_UNITS: 35661, + MAX_VERTEX_TEXTURE_IMAGE_UNITS: 35660, + MAX_TEXTURE_IMAGE_UNITS: 34930, + MAX_FRAGMENT_UNIFORM_VECTORS: 36349, + SHADER_TYPE: 35663, + DELETE_STATUS: 35712, + LINK_STATUS: 35714, + VALIDATE_STATUS: 35715, + ATTACHED_SHADERS: 35717, + ACTIVE_UNIFORMS: 35718, + ACTIVE_ATTRIBUTES: 35721, + SHADING_LANGUAGE_VERSION: 35724, + CURRENT_PROGRAM: 35725, + NEVER: 512, + LESS: 513, + EQUAL: 514, + LEQUAL: 515, + GREATER: 516, + NOTEQUAL: 517, + GEQUAL: 518, + ALWAYS: 519, + KEEP: 7680, + REPLACE: 7681, + INCR: 7682, + DECR: 7683, + INVERT: 5386, + INCR_WRAP: 34055, + DECR_WRAP: 34056, + VENDOR: 7936, + RENDERER: 7937, + VERSION: 7938, + NEAREST: 9728, + LINEAR: 9729, + NEAREST_MIPMAP_NEAREST: 9984, + LINEAR_MIPMAP_NEAREST: 9985, + NEAREST_MIPMAP_LINEAR: 9986, + LINEAR_MIPMAP_LINEAR: 9987, + TEXTURE_MAG_FILTER: 10240, + TEXTURE_MIN_FILTER: 10241, + TEXTURE_WRAP_S: 10242, + TEXTURE_WRAP_T: 10243, + TEXTURE_2D: 3553, + TEXTURE: 5890, + TEXTURE_CUBE_MAP: 34067, + TEXTURE_BINDING_CUBE_MAP: 34068, + TEXTURE_CUBE_MAP_POSITIVE_X: 34069, + TEXTURE_CUBE_MAP_NEGATIVE_X: 34070, + TEXTURE_CUBE_MAP_POSITIVE_Y: 34071, + TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072, + TEXTURE_CUBE_MAP_POSITIVE_Z: 34073, + TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074, + MAX_CUBE_MAP_TEXTURE_SIZE: 34076, + TEXTURE0: 33984, + TEXTURE1: 33985, + TEXTURE2: 33986, + TEXTURE3: 33987, + TEXTURE4: 33988, + TEXTURE5: 33989, + TEXTURE6: 33990, + TEXTURE7: 33991, + TEXTURE8: 33992, + TEXTURE9: 33993, + TEXTURE10: 33994, + TEXTURE11: 33995, + TEXTURE12: 33996, + TEXTURE13: 33997, + TEXTURE14: 33998, + TEXTURE15: 33999, + TEXTURE16: 34e3, + TEXTURE17: 34001, + TEXTURE18: 34002, + TEXTURE19: 34003, + TEXTURE20: 34004, + TEXTURE21: 34005, + TEXTURE22: 34006, + TEXTURE23: 34007, + TEXTURE24: 34008, + TEXTURE25: 34009, + TEXTURE26: 34010, + TEXTURE27: 34011, + TEXTURE28: 34012, + TEXTURE29: 34013, + TEXTURE30: 34014, + TEXTURE31: 34015, + ACTIVE_TEXTURE: 34016, + REPEAT: 10497, + CLAMP_TO_EDGE: 33071, + MIRRORED_REPEAT: 33648, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + INT_VEC2: 35667, + INT_VEC3: 35668, + INT_VEC4: 35669, + BOOL: 35670, + BOOL_VEC2: 35671, + BOOL_VEC3: 35672, + BOOL_VEC4: 35673, + FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + SAMPLER_2D: 35678, + SAMPLER_CUBE: 35680, + VERTEX_ATTRIB_ARRAY_ENABLED: 34338, + VERTEX_ATTRIB_ARRAY_SIZE: 34339, + VERTEX_ATTRIB_ARRAY_STRIDE: 34340, + VERTEX_ATTRIB_ARRAY_TYPE: 34341, + VERTEX_ATTRIB_ARRAY_NORMALIZED: 34922, + VERTEX_ATTRIB_ARRAY_POINTER: 34373, + VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 34975, + IMPLEMENTATION_COLOR_READ_TYPE: 35738, + IMPLEMENTATION_COLOR_READ_FORMAT: 35739, + COMPILE_STATUS: 35713, + LOW_FLOAT: 36336, + MEDIUM_FLOAT: 36337, + HIGH_FLOAT: 36338, + LOW_INT: 36339, + MEDIUM_INT: 36340, + HIGH_INT: 36341, + FRAMEBUFFER: 36160, + RENDERBUFFER: 36161, + RGBA4: 32854, + RGB5_A1: 32855, + RGB565: 36194, + DEPTH_COMPONENT16: 33189, + STENCIL_INDEX: 6401, + STENCIL_INDEX8: 36168, + DEPTH_STENCIL: 34041, + RENDERBUFFER_WIDTH: 36162, + RENDERBUFFER_HEIGHT: 36163, + RENDERBUFFER_INTERNAL_FORMAT: 36164, + RENDERBUFFER_RED_SIZE: 36176, + RENDERBUFFER_GREEN_SIZE: 36177, + RENDERBUFFER_BLUE_SIZE: 36178, + RENDERBUFFER_ALPHA_SIZE: 36179, + RENDERBUFFER_DEPTH_SIZE: 36180, + RENDERBUFFER_STENCIL_SIZE: 36181, + FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 36048, + FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 36049, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 36050, + FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 36051, + COLOR_ATTACHMENT0: 36064, + DEPTH_ATTACHMENT: 36096, + STENCIL_ATTACHMENT: 36128, + DEPTH_STENCIL_ATTACHMENT: 33306, + NONE: 0, + FRAMEBUFFER_COMPLETE: 36053, + FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 36054, + FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 36055, + FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 36057, + FRAMEBUFFER_UNSUPPORTED: 36061, + FRAMEBUFFER_BINDING: 36006, + RENDERBUFFER_BINDING: 36007, + MAX_RENDERBUFFER_SIZE: 34024, + INVALID_FRAMEBUFFER_OPERATION: 1286, + UNPACK_FLIP_Y_WEBGL: 37440, + UNPACK_PREMULTIPLY_ALPHA_WEBGL: 37441, + CONTEXT_LOST_WEBGL: 37442, + UNPACK_COLORSPACE_CONVERSION_WEBGL: 37443, + BROWSER_DEFAULT_WEBGL: 37444, + // WEBGL_compressed_texture_s3tc + COMPRESSED_RGB_S3TC_DXT1_EXT: 33776, + COMPRESSED_RGBA_S3TC_DXT1_EXT: 33777, + COMPRESSED_RGBA_S3TC_DXT3_EXT: 33778, + COMPRESSED_RGBA_S3TC_DXT5_EXT: 33779, + // WEBGL_compressed_texture_pvrtc + COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 35840, + COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 35841, + COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 35842, + COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 35843, + // WEBGL_compressed_texture_astc + COMPRESSED_RGBA_ASTC_4x4_WEBGL: 37808, + // WEBGL_compressed_texture_etc1 + COMPRESSED_RGB_ETC1_WEBGL: 36196, + // EXT_texture_compression_bptc + COMPRESSED_RGBA_BPTC_UNORM: 36492, + // EXT_color_buffer_half_float + HALF_FLOAT_OES: 36193, + // Desktop OpenGL + DOUBLE: 5130, + // WebGL 2 + READ_BUFFER: 3074, + UNPACK_ROW_LENGTH: 3314, + UNPACK_SKIP_ROWS: 3315, + UNPACK_SKIP_PIXELS: 3316, + PACK_ROW_LENGTH: 3330, + PACK_SKIP_ROWS: 3331, + PACK_SKIP_PIXELS: 3332, + COLOR: 6144, + DEPTH: 6145, + STENCIL: 6146, + RED: 6403, + RGB8: 32849, + RGBA8: 32856, + RGB10_A2: 32857, + TEXTURE_BINDING_3D: 32874, + UNPACK_SKIP_IMAGES: 32877, + UNPACK_IMAGE_HEIGHT: 32878, + TEXTURE_3D: 32879, + TEXTURE_WRAP_R: 32882, + MAX_3D_TEXTURE_SIZE: 32883, + UNSIGNED_INT_2_10_10_10_REV: 33640, + MAX_ELEMENTS_VERTICES: 33e3, + MAX_ELEMENTS_INDICES: 33001, + TEXTURE_MIN_LOD: 33082, + TEXTURE_MAX_LOD: 33083, + TEXTURE_BASE_LEVEL: 33084, + TEXTURE_MAX_LEVEL: 33085, + MIN: 32775, + MAX: 32776, + DEPTH_COMPONENT24: 33190, + MAX_TEXTURE_LOD_BIAS: 34045, + TEXTURE_COMPARE_MODE: 34892, + TEXTURE_COMPARE_FUNC: 34893, + CURRENT_QUERY: 34917, + QUERY_RESULT: 34918, + QUERY_RESULT_AVAILABLE: 34919, + STREAM_READ: 35041, + STREAM_COPY: 35042, + STATIC_READ: 35045, + STATIC_COPY: 35046, + DYNAMIC_READ: 35049, + DYNAMIC_COPY: 35050, + MAX_DRAW_BUFFERS: 34852, + DRAW_BUFFER0: 34853, + DRAW_BUFFER1: 34854, + DRAW_BUFFER2: 34855, + DRAW_BUFFER3: 34856, + DRAW_BUFFER4: 34857, + DRAW_BUFFER5: 34858, + DRAW_BUFFER6: 34859, + DRAW_BUFFER7: 34860, + DRAW_BUFFER8: 34861, + DRAW_BUFFER9: 34862, + DRAW_BUFFER10: 34863, + DRAW_BUFFER11: 34864, + DRAW_BUFFER12: 34865, + DRAW_BUFFER13: 34866, + DRAW_BUFFER14: 34867, + DRAW_BUFFER15: 34868, + MAX_FRAGMENT_UNIFORM_COMPONENTS: 35657, + MAX_VERTEX_UNIFORM_COMPONENTS: 35658, + SAMPLER_3D: 35679, + SAMPLER_2D_SHADOW: 35682, + FRAGMENT_SHADER_DERIVATIVE_HINT: 35723, + PIXEL_PACK_BUFFER: 35051, + PIXEL_UNPACK_BUFFER: 35052, + PIXEL_PACK_BUFFER_BINDING: 35053, + PIXEL_UNPACK_BUFFER_BINDING: 35055, + FLOAT_MAT2x3: 35685, + FLOAT_MAT2x4: 35686, + FLOAT_MAT3x2: 35687, + FLOAT_MAT3x4: 35688, + FLOAT_MAT4x2: 35689, + FLOAT_MAT4x3: 35690, + SRGB: 35904, + SRGB8: 35905, + SRGB8_ALPHA8: 35907, + COMPARE_REF_TO_TEXTURE: 34894, + RGBA32F: 34836, + RGB32F: 34837, + RGBA16F: 34842, + RGB16F: 34843, + VERTEX_ATTRIB_ARRAY_INTEGER: 35069, + MAX_ARRAY_TEXTURE_LAYERS: 35071, + MIN_PROGRAM_TEXEL_OFFSET: 35076, + MAX_PROGRAM_TEXEL_OFFSET: 35077, + MAX_VARYING_COMPONENTS: 35659, + TEXTURE_2D_ARRAY: 35866, + TEXTURE_BINDING_2D_ARRAY: 35869, + R11F_G11F_B10F: 35898, + UNSIGNED_INT_10F_11F_11F_REV: 35899, + RGB9_E5: 35901, + UNSIGNED_INT_5_9_9_9_REV: 35902, + TRANSFORM_FEEDBACK_BUFFER_MODE: 35967, + MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 35968, + TRANSFORM_FEEDBACK_VARYINGS: 35971, + TRANSFORM_FEEDBACK_BUFFER_START: 35972, + TRANSFORM_FEEDBACK_BUFFER_SIZE: 35973, + TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 35976, + RASTERIZER_DISCARD: 35977, + MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 35978, + MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 35979, + INTERLEAVED_ATTRIBS: 35980, + SEPARATE_ATTRIBS: 35981, + TRANSFORM_FEEDBACK_BUFFER: 35982, + TRANSFORM_FEEDBACK_BUFFER_BINDING: 35983, + RGBA32UI: 36208, + RGB32UI: 36209, + RGBA16UI: 36214, + RGB16UI: 36215, + RGBA8UI: 36220, + RGB8UI: 36221, + RGBA32I: 36226, + RGB32I: 36227, + RGBA16I: 36232, + RGB16I: 36233, + RGBA8I: 36238, + RGB8I: 36239, + RED_INTEGER: 36244, + RGB_INTEGER: 36248, + RGBA_INTEGER: 36249, + SAMPLER_2D_ARRAY: 36289, + SAMPLER_2D_ARRAY_SHADOW: 36292, + SAMPLER_CUBE_SHADOW: 36293, + UNSIGNED_INT_VEC2: 36294, + UNSIGNED_INT_VEC3: 36295, + UNSIGNED_INT_VEC4: 36296, + INT_SAMPLER_2D: 36298, + INT_SAMPLER_3D: 36299, + INT_SAMPLER_CUBE: 36300, + INT_SAMPLER_2D_ARRAY: 36303, + UNSIGNED_INT_SAMPLER_2D: 36306, + UNSIGNED_INT_SAMPLER_3D: 36307, + UNSIGNED_INT_SAMPLER_CUBE: 36308, + UNSIGNED_INT_SAMPLER_2D_ARRAY: 36311, + DEPTH_COMPONENT32F: 36012, + DEPTH32F_STENCIL8: 36013, + FLOAT_32_UNSIGNED_INT_24_8_REV: 36269, + FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 33296, + FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 33297, + FRAMEBUFFER_ATTACHMENT_RED_SIZE: 33298, + FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 33299, + FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 33300, + FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 33301, + FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 33302, + FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 33303, + FRAMEBUFFER_DEFAULT: 33304, + UNSIGNED_INT_24_8: 34042, + DEPTH24_STENCIL8: 35056, + UNSIGNED_NORMALIZED: 35863, + DRAW_FRAMEBUFFER_BINDING: 36006, + // Same as FRAMEBUFFER_BINDING + READ_FRAMEBUFFER: 36008, + DRAW_FRAMEBUFFER: 36009, + READ_FRAMEBUFFER_BINDING: 36010, + RENDERBUFFER_SAMPLES: 36011, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 36052, + MAX_COLOR_ATTACHMENTS: 36063, + COLOR_ATTACHMENT1: 36065, + COLOR_ATTACHMENT2: 36066, + COLOR_ATTACHMENT3: 36067, + COLOR_ATTACHMENT4: 36068, + COLOR_ATTACHMENT5: 36069, + COLOR_ATTACHMENT6: 36070, + COLOR_ATTACHMENT7: 36071, + COLOR_ATTACHMENT8: 36072, + COLOR_ATTACHMENT9: 36073, + COLOR_ATTACHMENT10: 36074, + COLOR_ATTACHMENT11: 36075, + COLOR_ATTACHMENT12: 36076, + COLOR_ATTACHMENT13: 36077, + COLOR_ATTACHMENT14: 36078, + COLOR_ATTACHMENT15: 36079, + FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 36182, + MAX_SAMPLES: 36183, + HALF_FLOAT: 5131, + RG: 33319, + RG_INTEGER: 33320, + R8: 33321, + RG8: 33323, + R16F: 33325, + R32F: 33326, + RG16F: 33327, + RG32F: 33328, + R8I: 33329, + R8UI: 33330, + R16I: 33331, + R16UI: 33332, + R32I: 33333, + R32UI: 33334, + RG8I: 33335, + RG8UI: 33336, + RG16I: 33337, + RG16UI: 33338, + RG32I: 33339, + RG32UI: 33340, + VERTEX_ARRAY_BINDING: 34229, + R8_SNORM: 36756, + RG8_SNORM: 36757, + RGB8_SNORM: 36758, + RGBA8_SNORM: 36759, + SIGNED_NORMALIZED: 36764, + COPY_READ_BUFFER: 36662, + COPY_WRITE_BUFFER: 36663, + COPY_READ_BUFFER_BINDING: 36662, + // Same as COPY_READ_BUFFER + COPY_WRITE_BUFFER_BINDING: 36663, + // Same as COPY_WRITE_BUFFER + UNIFORM_BUFFER: 35345, + UNIFORM_BUFFER_BINDING: 35368, + UNIFORM_BUFFER_START: 35369, + UNIFORM_BUFFER_SIZE: 35370, + MAX_VERTEX_UNIFORM_BLOCKS: 35371, + MAX_FRAGMENT_UNIFORM_BLOCKS: 35373, + MAX_COMBINED_UNIFORM_BLOCKS: 35374, + MAX_UNIFORM_BUFFER_BINDINGS: 35375, + MAX_UNIFORM_BLOCK_SIZE: 35376, + MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 35377, + MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 35379, + UNIFORM_BUFFER_OFFSET_ALIGNMENT: 35380, + ACTIVE_UNIFORM_BLOCKS: 35382, + UNIFORM_TYPE: 35383, + UNIFORM_SIZE: 35384, + UNIFORM_BLOCK_INDEX: 35386, + UNIFORM_OFFSET: 35387, + UNIFORM_ARRAY_STRIDE: 35388, + UNIFORM_MATRIX_STRIDE: 35389, + UNIFORM_IS_ROW_MAJOR: 35390, + UNIFORM_BLOCK_BINDING: 35391, + UNIFORM_BLOCK_DATA_SIZE: 35392, + UNIFORM_BLOCK_ACTIVE_UNIFORMS: 35394, + UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 35395, + UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 35396, + UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 35398, + INVALID_INDEX: 4294967295, + MAX_VERTEX_OUTPUT_COMPONENTS: 37154, + MAX_FRAGMENT_INPUT_COMPONENTS: 37157, + MAX_SERVER_WAIT_TIMEOUT: 37137, + OBJECT_TYPE: 37138, + SYNC_CONDITION: 37139, + SYNC_STATUS: 37140, + SYNC_FLAGS: 37141, + SYNC_FENCE: 37142, + SYNC_GPU_COMMANDS_COMPLETE: 37143, + UNSIGNALED: 37144, + SIGNALED: 37145, + ALREADY_SIGNALED: 37146, + TIMEOUT_EXPIRED: 37147, + CONDITION_SATISFIED: 37148, + WAIT_FAILED: 37149, + SYNC_FLUSH_COMMANDS_BIT: 1, + VERTEX_ATTRIB_ARRAY_DIVISOR: 35070, + ANY_SAMPLES_PASSED: 35887, + ANY_SAMPLES_PASSED_CONSERVATIVE: 36202, + SAMPLER_BINDING: 35097, + RGB10_A2UI: 36975, + INT_2_10_10_10_REV: 36255, + TRANSFORM_FEEDBACK: 36386, + TRANSFORM_FEEDBACK_PAUSED: 36387, + TRANSFORM_FEEDBACK_ACTIVE: 36388, + TRANSFORM_FEEDBACK_BINDING: 36389, + COMPRESSED_R11_EAC: 37488, + COMPRESSED_SIGNED_R11_EAC: 37489, + COMPRESSED_RG11_EAC: 37490, + COMPRESSED_SIGNED_RG11_EAC: 37491, + COMPRESSED_RGB8_ETC2: 37492, + COMPRESSED_SRGB8_ETC2: 37493, + COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37494, + COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37495, + COMPRESSED_RGBA8_ETC2_EAC: 37496, + COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 37497, + TEXTURE_IMMUTABLE_FORMAT: 37167, + MAX_ELEMENT_INDEX: 36203, + TEXTURE_IMMUTABLE_LEVELS: 33503, + // Extensions + MAX_TEXTURE_MAX_ANISOTROPY_EXT: 34047 +}, WebGLConstants$1 = Object.freeze(WebGLConstants), viewerPositionWCScratch = new Cartesian3(); +function AutomaticUniform(e) { + this._size = e.size, this._datatype = e.datatype, this.getValue = e.getValue; +} +const datatypeToGlsl = {}; +datatypeToGlsl[WebGLConstants$1.FLOAT] = "float"; +datatypeToGlsl[WebGLConstants$1.FLOAT_VEC2] = "vec2"; +datatypeToGlsl[WebGLConstants$1.FLOAT_VEC3] = "vec3"; +datatypeToGlsl[WebGLConstants$1.FLOAT_VEC4] = "vec4"; +datatypeToGlsl[WebGLConstants$1.INT] = "int"; +datatypeToGlsl[WebGLConstants$1.INT_VEC2] = "ivec2"; +datatypeToGlsl[WebGLConstants$1.INT_VEC3] = "ivec3"; +datatypeToGlsl[WebGLConstants$1.INT_VEC4] = "ivec4"; +datatypeToGlsl[WebGLConstants$1.BOOL] = "bool"; +datatypeToGlsl[WebGLConstants$1.BOOL_VEC2] = "bvec2"; +datatypeToGlsl[WebGLConstants$1.BOOL_VEC3] = "bvec3"; +datatypeToGlsl[WebGLConstants$1.BOOL_VEC4] = "bvec4"; +datatypeToGlsl[WebGLConstants$1.FLOAT_MAT2] = "mat2"; +datatypeToGlsl[WebGLConstants$1.FLOAT_MAT3] = "mat3"; +datatypeToGlsl[WebGLConstants$1.FLOAT_MAT4] = "mat4"; +datatypeToGlsl[WebGLConstants$1.SAMPLER_2D] = "sampler2D"; +datatypeToGlsl[WebGLConstants$1.SAMPLER_CUBE] = "samplerCube"; +AutomaticUniform.prototype.getDeclaration = function(e) { + let t = `uniform ${datatypeToGlsl[this._datatype]} ${e}`; + const n = this._size; + return n === 1 ? t += ";" : t += `[${n.toString()}];`, t; +}; +const AutomaticUniforms = { + /** + * An automatic GLSL uniform containing the viewport's x, y, width, + * and height properties in an vec4's x, y, z, + * and w components, respectively. + * + * @example + * // GLSL declaration + * uniform vec4 czm_viewport; + * + * // Scale the window coordinate components to [0, 1] by dividing + * // by the viewport's width and height. + * vec2 v = gl_FragCoord.xy / czm_viewport.zw; + * + * @see Context#getViewport + */ + czm_viewport: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC4, + getValue: function(e) { + return e.viewportCartesian4; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 orthographic projection matrix that + * transforms window coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + *

+ * This transform is useful when a vertex shader inputs or manipulates window coordinates + * as done by {@link BillboardCollection}. + *

+ * Do not confuse {@link czm_viewportTransformation} with czm_viewportOrthographic. + * The former transforms from normalized device coordinates to window coordinates; the later transforms + * from window coordinates to clip coordinates, and is often used to assign to gl_Position. + * + * @example + * // GLSL declaration + * uniform mat4 czm_viewportOrthographic; + * + * // Example + * gl_Position = czm_viewportOrthographic * vec4(windowPosition, 0.0, 1.0); + * + * @see UniformState#viewportOrthographic + * @see czm_viewport + * @see czm_viewportTransformation + * @see BillboardCollection + */ + czm_viewportOrthographic: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.viewportOrthographic; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 transformation matrix that + * transforms normalized device coordinates to window coordinates. The context's + * full viewport is used, and the depth range is assumed to be near = 0 + * and far = 1. + *

+ * This transform is useful when there is a need to manipulate window coordinates + * in a vertex shader as done by {@link BillboardCollection}. In many cases, + * this matrix will not be used directly; instead, {@link czm_modelToWindowCoordinates} + * will be used to transform directly from model to window coordinates. + *

+ * Do not confuse czm_viewportTransformation with {@link czm_viewportOrthographic}. + * The former transforms from normalized device coordinates to window coordinates; the later transforms + * from window coordinates to clip coordinates, and is often used to assign to gl_Position. + * + * @example + * // GLSL declaration + * uniform mat4 czm_viewportTransformation; + * + * // Use czm_viewportTransformation as part of the + * // transform from model to window coordinates. + * vec4 q = czm_modelViewProjection * positionMC; // model to clip coordinates + * q.xyz /= q.w; // clip to normalized device coordinates (ndc) + * q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // ndc to window coordinates + * + * @see UniformState#viewportTransformation + * @see czm_viewport + * @see czm_viewportOrthographic + * @see czm_modelToWindowCoordinates + * @see BillboardCollection + */ + czm_viewportTransformation: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.viewportTransformation; + } + }), + /** + * An automatic GLSL uniform representing the depth of the scene + * after the globe pass and then updated after the 3D Tiles pass. + * The depth is packed into an RGBA texture. + * + * @example + * // GLSL declaration + * uniform sampler2D czm_globeDepthTexture; + * + * // Get the depth at the current fragment + * vec2 coords = gl_FragCoord.xy / czm_viewport.zw; + * float depth = czm_unpackDepth(texture(czm_globeDepthTexture, coords)); + */ + czm_globeDepthTexture: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.SAMPLER_2D, + getValue: function(e) { + return e.globeDepthTexture; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model transformation matrix that + * transforms model coordinates to world coordinates. + * + * @example + * // GLSL declaration + * uniform mat4 czm_model; + * + * // Example + * vec4 worldPosition = czm_model * modelPosition; + * + * @see UniformState#model + * @see czm_inverseModel + * @see czm_modelView + * @see czm_modelViewProjection + */ + czm_model: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.model; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model transformation matrix that + * transforms world coordinates to model coordinates. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseModel; + * + * // Example + * vec4 modelPosition = czm_inverseModel * worldPosition; + * + * @see UniformState#inverseModel + * @see czm_model + * @see czm_inverseModelView + */ + czm_inverseModel: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseModel; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 view transformation matrix that + * transforms world coordinates to eye coordinates. + * + * @example + * // GLSL declaration + * uniform mat4 czm_view; + * + * // Example + * vec4 eyePosition = czm_view * worldPosition; + * + * @see UniformState#view + * @see czm_viewRotation + * @see czm_modelView + * @see czm_viewProjection + * @see czm_modelViewProjection + * @see czm_inverseView + */ + czm_view: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.view; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 view transformation matrix that + * transforms 3D world coordinates to eye coordinates. In 3D mode, this is identical to + * {@link czm_view}, but in 2D and Columbus View it represents the view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat4 czm_view3D; + * + * // Example + * vec4 eyePosition3D = czm_view3D * worldPosition3D; + * + * @see UniformState#view3D + * @see czm_view + */ + czm_view3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.view3D; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 view rotation matrix that + * transforms vectors in world coordinates to eye coordinates. + * + * @example + * // GLSL declaration + * uniform mat3 czm_viewRotation; + * + * // Example + * vec3 eyeVector = czm_viewRotation * worldVector; + * + * @see UniformState#viewRotation + * @see czm_view + * @see czm_inverseView + * @see czm_inverseViewRotation + */ + czm_viewRotation: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.viewRotation; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 view rotation matrix that + * transforms vectors in 3D world coordinates to eye coordinates. In 3D mode, this is identical to + * {@link czm_viewRotation}, but in 2D and Columbus View it represents the view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat3 czm_viewRotation3D; + * + * // Example + * vec3 eyeVector = czm_viewRotation3D * worldVector; + * + * @see UniformState#viewRotation3D + * @see czm_viewRotation + */ + czm_viewRotation3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.viewRotation3D; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 transformation matrix that + * transforms from eye coordinates to world coordinates. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseView; + * + * // Example + * vec4 worldPosition = czm_inverseView * eyePosition; + * + * @see UniformState#inverseView + * @see czm_view + * @see czm_inverseNormal + */ + czm_inverseView: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseView; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 transformation matrix that + * transforms from 3D eye coordinates to world coordinates. In 3D mode, this is identical to + * {@link czm_inverseView}, but in 2D and Columbus View it represents the inverse view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseView3D; + * + * // Example + * vec4 worldPosition = czm_inverseView3D * eyePosition; + * + * @see UniformState#inverseView3D + * @see czm_inverseView + */ + czm_inverseView3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseView3D; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 rotation matrix that + * transforms vectors from eye coordinates to world coordinates. + * + * @example + * // GLSL declaration + * uniform mat3 czm_inverseViewRotation; + * + * // Example + * vec4 worldVector = czm_inverseViewRotation * eyeVector; + * + * @see UniformState#inverseView + * @see czm_view + * @see czm_viewRotation + * @see czm_inverseViewRotation + */ + czm_inverseViewRotation: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.inverseViewRotation; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 rotation matrix that + * transforms vectors from 3D eye coordinates to world coordinates. In 3D mode, this is identical to + * {@link czm_inverseViewRotation}, but in 2D and Columbus View it represents the inverse view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat3 czm_inverseViewRotation3D; + * + * // Example + * vec4 worldVector = czm_inverseViewRotation3D * eyeVector; + * + * @see UniformState#inverseView3D + * @see czm_inverseViewRotation + */ + czm_inverseViewRotation3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.inverseViewRotation3D; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 projection transformation matrix that + * transforms eye coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_projection; + * + * // Example + * gl_Position = czm_projection * eyePosition; + * + * @see UniformState#projection + * @see czm_viewProjection + * @see czm_modelViewProjection + * @see czm_infiniteProjection + */ + czm_projection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.projection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 inverse projection transformation matrix that + * transforms from clip coordinates to eye coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseProjection; + * + * // Example + * vec4 eyePosition = czm_inverseProjection * clipPosition; + * + * @see UniformState#inverseProjection + * @see czm_projection + */ + czm_inverseProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 projection transformation matrix with the far plane at infinity, + * that transforms eye coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. An infinite far plane is used + * in algorithms like shadow volumes and GPU ray casting with proxy geometry to ensure that triangles + * are not clipped by the far plane. + * + * @example + * // GLSL declaration + * uniform mat4 czm_infiniteProjection; + * + * // Example + * gl_Position = czm_infiniteProjection * eyePosition; + * + * @see UniformState#infiniteProjection + * @see czm_projection + * @see czm_modelViewInfiniteProjection + */ + czm_infiniteProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.infiniteProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view transformation matrix that + * transforms model coordinates to eye coordinates. + *

+ * Positions should be transformed to eye coordinates using czm_modelView and + * normals should be transformed using {@link czm_normal}. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelView; + * + * // Example + * vec4 eyePosition = czm_modelView * modelPosition; + * + * // The above is equivalent to, but more efficient than: + * vec4 eyePosition = czm_view * czm_model * modelPosition; + * + * @see UniformState#modelView + * @see czm_model + * @see czm_view + * @see czm_modelViewProjection + * @see czm_normal + */ + czm_modelView: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelView; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view transformation matrix that + * transforms 3D model coordinates to eye coordinates. In 3D mode, this is identical to + * {@link czm_modelView}, but in 2D and Columbus View it represents the model-view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + *

+ * Positions should be transformed to eye coordinates using czm_modelView3D and + * normals should be transformed using {@link czm_normal3D}. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelView3D; + * + * // Example + * vec4 eyePosition = czm_modelView3D * modelPosition; + * + * // The above is equivalent to, but more efficient than: + * vec4 eyePosition = czm_view3D * czm_model * modelPosition; + * + * @see UniformState#modelView3D + * @see czm_modelView + */ + czm_modelView3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelView3D; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view transformation matrix that + * transforms model coordinates, relative to the eye, to eye coordinates. This is used + * in conjunction with {@link czm_translateRelativeToEye}. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelViewRelativeToEye; + * + * // Example + * attribute vec3 positionHigh; + * attribute vec3 positionLow; + * + * void main() + * { + * vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + * gl_Position = czm_projection * (czm_modelViewRelativeToEye * p); + * } + * + * @see czm_modelViewProjectionRelativeToEye + * @see czm_translateRelativeToEye + * @see EncodedCartesian3 + */ + czm_modelViewRelativeToEye: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelViewRelativeToEye; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 transformation matrix that + * transforms from eye coordinates to model coordinates. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseModelView; + * + * // Example + * vec4 modelPosition = czm_inverseModelView * eyePosition; + * + * @see UniformState#inverseModelView + * @see czm_modelView + */ + czm_inverseModelView: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseModelView; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 transformation matrix that + * transforms from eye coordinates to 3D model coordinates. In 3D mode, this is identical to + * {@link czm_inverseModelView}, but in 2D and Columbus View it represents the inverse model-view matrix + * as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseModelView3D; + * + * // Example + * vec4 modelPosition = czm_inverseModelView3D * eyePosition; + * + * @see UniformState#inverseModelView + * @see czm_inverseModelView + * @see czm_modelView3D + */ + czm_inverseModelView3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseModelView3D; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 view-projection transformation matrix that + * transforms world coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_viewProjection; + * + * // Example + * vec4 gl_Position = czm_viewProjection * czm_model * modelPosition; + * + * // The above is equivalent to, but more efficient than: + * gl_Position = czm_projection * czm_view * czm_model * modelPosition; + * + * @see UniformState#viewProjection + * @see czm_view + * @see czm_projection + * @see czm_modelViewProjection + * @see czm_inverseViewProjection + */ + czm_viewProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.viewProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 view-projection transformation matrix that + * transforms clip coordinates to world coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseViewProjection; + * + * // Example + * vec4 worldPosition = czm_inverseViewProjection * clipPosition; + * + * @see UniformState#inverseViewProjection + * @see czm_viewProjection + */ + czm_inverseViewProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseViewProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view-projection transformation matrix that + * transforms model coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelViewProjection; + * + * // Example + * vec4 gl_Position = czm_modelViewProjection * modelPosition; + * + * // The above is equivalent to, but more efficient than: + * gl_Position = czm_projection * czm_view * czm_model * modelPosition; + * + * @see UniformState#modelViewProjection + * @see czm_model + * @see czm_view + * @see czm_projection + * @see czm_modelView + * @see czm_viewProjection + * @see czm_modelViewInfiniteProjection + * @see czm_inverseModelViewProjection + */ + czm_modelViewProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelViewProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 inverse model-view-projection transformation matrix that + * transforms clip coordinates to model coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. + * + * @example + * // GLSL declaration + * uniform mat4 czm_inverseModelViewProjection; + * + * // Example + * vec4 modelPosition = czm_inverseModelViewProjection * clipPosition; + * + * @see UniformState#modelViewProjection + * @see czm_modelViewProjection + */ + czm_inverseModelViewProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.inverseModelViewProjection; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view-projection transformation matrix that + * transforms model coordinates, relative to the eye, to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. This is used in + * conjunction with {@link czm_translateRelativeToEye}. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelViewProjectionRelativeToEye; + * + * // Example + * attribute vec3 positionHigh; + * attribute vec3 positionLow; + * + * void main() + * { + * vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + * gl_Position = czm_modelViewProjectionRelativeToEye * p; + * } + * + * @see czm_modelViewRelativeToEye + * @see czm_translateRelativeToEye + * @see EncodedCartesian3 + */ + czm_modelViewProjectionRelativeToEye: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelViewProjectionRelativeToEye; + } + }), + /** + * An automatic GLSL uniform representing a 4x4 model-view-projection transformation matrix that + * transforms model coordinates to clip coordinates. Clip coordinates is the + * coordinate system for a vertex shader's gl_Position output. The projection matrix places + * the far plane at infinity. This is useful in algorithms like shadow volumes and GPU ray casting with + * proxy geometry to ensure that triangles are not clipped by the far plane. + * + * @example + * // GLSL declaration + * uniform mat4 czm_modelViewInfiniteProjection; + * + * // Example + * vec4 gl_Position = czm_modelViewInfiniteProjection * modelPosition; + * + * // The above is equivalent to, but more efficient than: + * gl_Position = czm_infiniteProjection * czm_view * czm_model * modelPosition; + * + * @see UniformState#modelViewInfiniteProjection + * @see czm_model + * @see czm_view + * @see czm_infiniteProjection + * @see czm_modelViewProjection + */ + czm_modelViewInfiniteProjection: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelViewInfiniteProjection; + } + }), + /** + * An automatic GLSL uniform that indicates if the current camera is orthographic in 3D. + * + * @see UniformState#orthographicIn3D + */ + czm_orthographicIn3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.orthographicIn3D ? 1 : 0; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 normal transformation matrix that + * transforms normal vectors in model coordinates to eye coordinates. + *

+ * Positions should be transformed to eye coordinates using {@link czm_modelView} and + * normals should be transformed using czm_normal. + * + * @example + * // GLSL declaration + * uniform mat3 czm_normal; + * + * // Example + * vec3 eyeNormal = czm_normal * normal; + * + * @see UniformState#normal + * @see czm_inverseNormal + * @see czm_modelView + */ + czm_normal: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.normal; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 normal transformation matrix that + * transforms normal vectors in 3D model coordinates to eye coordinates. + * In 3D mode, this is identical to + * {@link czm_normal}, but in 2D and Columbus View it represents the normal transformation + * matrix as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + *

+ * Positions should be transformed to eye coordinates using {@link czm_modelView3D} and + * normals should be transformed using czm_normal3D. + * + * @example + * // GLSL declaration + * uniform mat3 czm_normal3D; + * + * // Example + * vec3 eyeNormal = czm_normal3D * normal; + * + * @see UniformState#normal3D + * @see czm_normal + */ + czm_normal3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.normal3D; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 normal transformation matrix that + * transforms normal vectors in eye coordinates to model coordinates. This is + * the opposite of the transform provided by {@link czm_normal}. + * + * @example + * // GLSL declaration + * uniform mat3 czm_inverseNormal; + * + * // Example + * vec3 normalMC = czm_inverseNormal * normalEC; + * + * @see UniformState#inverseNormal + * @see czm_normal + * @see czm_modelView + * @see czm_inverseView + */ + czm_inverseNormal: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.inverseNormal; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 normal transformation matrix that + * transforms normal vectors in eye coordinates to 3D model coordinates. This is + * the opposite of the transform provided by {@link czm_normal}. + * In 3D mode, this is identical to + * {@link czm_inverseNormal}, but in 2D and Columbus View it represents the inverse normal transformation + * matrix as if the camera were at an equivalent location in 3D mode. This is useful for lighting + * 2D and Columbus View in the same way that 3D is lit. + * + * @example + * // GLSL declaration + * uniform mat3 czm_inverseNormal3D; + * + * // Example + * vec3 normalMC = czm_inverseNormal3D * normalEC; + * + * @see UniformState#inverseNormal3D + * @see czm_inverseNormal + */ + czm_inverseNormal3D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.inverseNormal3D; + } + }), + /** + * An automatic GLSL uniform containing the height in meters of the + * eye (camera) above or below the ellipsoid. + * + * @see UniformState#eyeHeight + */ + czm_eyeHeight: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.eyeHeight; + } + }), + /** + * An automatic GLSL uniform containing height (x) and height squared (y) + * in meters of the eye (camera) above the 2D world plane. This uniform is only valid + * when the {@link SceneMode} is SCENE2D. + * + * @see UniformState#eyeHeight2D + */ + czm_eyeHeight2D: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC2, + getValue: function(e) { + return e.eyeHeight2D; + } + }), + /** + * An automatic GLSL uniform containing the ellipsoid surface normal + * at the position below the eye (camera), in eye coordinates. + * This uniform is only valid when the {@link SceneMode} is SCENE3D. + */ + czm_eyeEllipsoidNormalEC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.eyeEllipsoidNormalEC; + } + }), + /** + * An automatic GLSL uniform containing the ellipsoid radii of curvature at the camera position. + * The .x component is the prime vertical radius of curvature (east-west direction) + * .y is the meridional radius of curvature (north-south direction) + * This uniform is only valid when the {@link SceneMode} is SCENE3D. + */ + czm_eyeEllipsoidCurvature: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC2, + getValue: function(e) { + return e.eyeEllipsoidCurvature; + } + }), + /** + * An automatic GLSL uniform containing the transform from model coordinates + * to an east-north-up coordinate system centered at the position on the + * ellipsoid below the camera. + * This uniform is only valid when the {@link SceneMode} is SCENE3D. + */ + czm_modelToEnu: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.modelToEnu; + } + }), + /** + * An automatic GLSL uniform containing the the inverse of + * {@link AutomaticUniforms.czm_modelToEnu}. + * This uniform is only valid when the {@link SceneMode} is SCENE3D. + */ + czm_enuToModel: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT4, + getValue: function(e) { + return e.enuToModel; + } + }), + /** + * An automatic GLSL uniform containing the near distance (x) and the far distance (y) + * of the frustum defined by the camera. This is the largest possible frustum, not an individual + * frustum used for multi-frustum rendering. + * + * @example + * // GLSL declaration + * uniform vec2 czm_entireFrustum; + * + * // Example + * float frustumLength = czm_entireFrustum.y - czm_entireFrustum.x; + * + * @see UniformState#entireFrustum + * @see czm_currentFrustum + */ + czm_entireFrustum: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC2, + getValue: function(e) { + return e.entireFrustum; + } + }), + /** + * An automatic GLSL uniform containing the near distance (x) and the far distance (y) + * of the frustum defined by the camera. This is the individual + * frustum used for multi-frustum rendering. + * + * @example + * // GLSL declaration + * uniform vec2 czm_currentFrustum; + * + * // Example + * float frustumLength = czm_currentFrustum.y - czm_currentFrustum.x; + * + * @see UniformState#currentFrustum + * @see czm_entireFrustum + */ + czm_currentFrustum: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC2, + getValue: function(e) { + return e.currentFrustum; + } + }), + /** + * The distances to the frustum planes. The top, bottom, left and right distances are + * the x, y, z, and w components, respectively. + */ + czm_frustumPlanes: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC4, + getValue: function(e) { + return e.frustumPlanes; + } + }), + /** + * Gets the far plane's distance from the near plane, plus 1.0. + */ + czm_farDepthFromNearPlusOne: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.farDepthFromNearPlusOne; + } + }), + /** + * Gets the log2 of {@link AutomaticUniforms#czm_farDepthFromNearPlusOne}. + */ + czm_log2FarDepthFromNearPlusOne: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.log2FarDepthFromNearPlusOne; + } + }), + /** + * Gets 1.0 divided by {@link AutomaticUniforms#czm_log2FarDepthFromNearPlusOne}. + */ + czm_oneOverLog2FarDepthFromNearPlusOne: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.oneOverLog2FarDepthFromNearPlusOne; + } + }), + /** + * An automatic GLSL uniform representing the sun position in world coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_sunPositionWC; + * + * @see UniformState#sunPositionWC + * @see czm_sunPositionColumbusView + * @see czm_sunDirectionWC + */ + czm_sunPositionWC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.sunPositionWC; + } + }), + /** + * An automatic GLSL uniform representing the sun position in Columbus view world coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_sunPositionColumbusView; + * + * @see UniformState#sunPositionColumbusView + * @see czm_sunPositionWC + */ + czm_sunPositionColumbusView: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.sunPositionColumbusView; + } + }), + /** + * An automatic GLSL uniform representing the normalized direction to the sun in eye coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_sunDirectionEC; + * + * // Example + * float diffuse = max(dot(czm_sunDirectionEC, normalEC), 0.0); + * + * @see UniformState#sunDirectionEC + * @see czm_moonDirectionEC + * @see czm_sunDirectionWC + */ + czm_sunDirectionEC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.sunDirectionEC; + } + }), + /** + * An automatic GLSL uniform representing the normalized direction to the sun in world coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_sunDirectionWC; + * + * // Example + * float diffuse = max(dot(czm_sunDirectionWC, normalWC), 0.0); + * + * @see UniformState#sunDirectionWC + * @see czm_sunPositionWC + * @see czm_sunDirectionEC + */ + czm_sunDirectionWC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.sunDirectionWC; + } + }), + /** + * An automatic GLSL uniform representing the normalized direction to the moon in eye coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_moonDirectionEC; + * + * // Example + * float diffuse = max(dot(czm_moonDirectionEC, normalEC), 0.0); + * + * @see UniformState#moonDirectionEC + * @see czm_sunDirectionEC + */ + czm_moonDirectionEC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.moonDirectionEC; + } + }), + /** + * An automatic GLSL uniform representing the normalized direction to the scene's light source in eye coordinates. + * This is commonly used for directional lighting computations. + * + * @example + * // GLSL declaration + * uniform vec3 czm_lightDirectionEC; + * + * // Example + * float diffuse = max(dot(czm_lightDirectionEC, normalEC), 0.0); + * + * @see UniformState#lightDirectionEC + * @see czm_lightDirectionWC + */ + czm_lightDirectionEC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.lightDirectionEC; + } + }), + /** + * An automatic GLSL uniform representing the normalized direction to the scene's light source in world coordinates. + * This is commonly used for directional lighting computations. + * + * @example + * // GLSL declaration + * uniform vec3 czm_lightDirectionWC; + * + * // Example + * float diffuse = max(dot(czm_lightDirectionWC, normalWC), 0.0); + * + * @see UniformState#lightDirectionWC + * @see czm_lightDirectionEC + */ + czm_lightDirectionWC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.lightDirectionWC; + } + }), + /** + * An automatic GLSL uniform that represents the color of light emitted by the scene's light source. This + * is equivalent to the light color multiplied by the light intensity limited to a maximum luminance of 1.0 + * suitable for non-HDR lighting. + * + * @example + * // GLSL declaration + * uniform vec3 czm_lightColor; + * + * // Example + * vec3 diffuseColor = czm_lightColor * max(dot(czm_lightDirectionWC, normalWC), 0.0); + * + * @see UniformState#lightColor + * @see czm_lightColorHdr + */ + czm_lightColor: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.lightColor; + } + }), + /** + * An automatic GLSL uniform that represents the high dynamic range color of light emitted by the scene's light + * source. This is equivalent to the light color multiplied by the light intensity suitable for HDR lighting. + * + * @example + * // GLSL declaration + * uniform vec3 czm_lightColorHdr; + * + * // Example + * vec3 diffuseColor = czm_lightColorHdr * max(dot(czm_lightDirectionWC, normalWC), 0.0); + * + * @see UniformState#lightColorHdr + * @see czm_lightColor + */ + czm_lightColorHdr: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.lightColorHdr; + } + }), + /** + * An automatic GLSL uniform representing the high bits of the camera position in model + * coordinates. This is used for GPU RTE to eliminate jittering artifacts when rendering + * as described in {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}. + * + * @example + * // GLSL declaration + * uniform vec3 czm_encodedCameraPositionMCHigh; + * + * @see czm_encodedCameraPositionMCLow + * @see czm_modelViewRelativeToEye + * @see czm_modelViewProjectionRelativeToEye + */ + czm_encodedCameraPositionMCHigh: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.encodedCameraPositionMCHigh; + } + }), + /** + * An automatic GLSL uniform representing the low bits of the camera position in model + * coordinates. This is used for GPU RTE to eliminate jittering artifacts when rendering + * as described in {@linkhttp://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}. + * + * @example + * // GLSL declaration + * uniform vec3 czm_encodedCameraPositionMCLow; + * + * @see czm_encodedCameraPositionMCHigh + * @see czm_modelViewRelativeToEye + * @see czm_modelViewProjectionRelativeToEye + */ + czm_encodedCameraPositionMCLow: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.encodedCameraPositionMCLow; + } + }), + /** + * An automatic GLSL uniform representing the position of the viewer (camera) in world coordinates. + * + * @example + * // GLSL declaration + * uniform vec3 czm_viewerPositionWC; + */ + czm_viewerPositionWC: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return Matrix4.getTranslation( + e.inverseView, + viewerPositionWCScratch + ); + } + }), + /** + * An automatic GLSL uniform representing the frame number. This uniform is automatically incremented + * every frame. + * + * @example + * // GLSL declaration + * uniform float czm_frameNumber; + */ + czm_frameNumber: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.frameState.frameNumber; + } + }), + /** + * An automatic GLSL uniform representing the current morph transition time between + * 2D/Columbus View and 3D, with 0.0 being 2D or Columbus View and 1.0 being 3D. + * + * @example + * // GLSL declaration + * uniform float czm_morphTime; + * + * // Example + * vec4 p = czm_columbusViewMorph(position2D, position3D, czm_morphTime); + */ + czm_morphTime: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.frameState.morphTime; + } + }), + /** + * An automatic GLSL uniform representing the current {@link SceneMode}, expressed + * as a float. + * + * @example + * // GLSL declaration + * uniform float czm_sceneMode; + * + * // Example + * if (czm_sceneMode == czm_sceneMode2D) + * { + * eyeHeightSq = czm_eyeHeight2D.y; + * } + * + * @see czm_sceneMode2D + * @see czm_sceneModeColumbusView + * @see czm_sceneMode3D + * @see czm_sceneModeMorphing + */ + czm_sceneMode: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.frameState.mode; + } + }), + /** + * An automatic GLSL uniform representing the current rendering pass. + * + * @example + * // GLSL declaration + * uniform float czm_pass; + * + * // Example + * if ((czm_pass == czm_passTranslucent) && isOpaque()) + * { + * gl_Position *= 0.0; // Cull opaque geometry in the translucent pass + * } + */ + czm_pass: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.pass; + } + }), + /** + * An automatic GLSL uniform representing the current scene background color. + * + * @example + * // GLSL declaration + * uniform vec4 czm_backgroundColor; + * + * // Example: If the given color's RGB matches the background color, invert it. + * vec4 adjustColorForContrast(vec4 color) + * { + * if (czm_backgroundColor.rgb == color.rgb) + * { + * color.rgb = vec3(1.0) - color.rgb; + * } + * + * return color; + * } + */ + czm_backgroundColor: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC4, + getValue: function(e) { + return e.backgroundColor; + } + }), + /** + * An automatic GLSL uniform containing the BRDF look up texture used for image-based lighting computations. + * + * @example + * // GLSL declaration + * uniform sampler2D czm_brdfLut; + * + * // Example: For a given roughness and NdotV value, find the material's BRDF information in the red and green channels + * float roughness = 0.5; + * float NdotV = dot(normal, view); + * vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; + */ + czm_brdfLut: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.SAMPLER_2D, + getValue: function(e) { + return e.brdfLut; + } + }), + /** + * An automatic GLSL uniform containing the environment map used within the scene. + * + * @example + * // GLSL declaration + * uniform samplerCube czm_environmentMap; + * + * // Example: Create a perfect reflection of the environment map on a model + * float reflected = reflect(view, normal); + * vec4 reflectedColor = texture(czm_environmentMap, reflected); + */ + czm_environmentMap: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.SAMPLER_CUBE, + getValue: function(e) { + return e.environmentMap; + } + }), + /** + * An automatic GLSL uniform containing the specular environment cube map used within the scene. + * + * @example + * // GLSL declaration + * uniform sampler2D czm_specularEnvironmentMaps; + */ + czm_specularEnvironmentMaps: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.SAMPLER_2D, + getValue: function(e) { + return e.specularEnvironmentMaps; + } + }), + /** + * An automatic GLSL uniform containing the maximum valid level-of-detail of the specular environment cube map used within the scene. + * + * @example + * // GLSL declaration + * uniform float czm_specularEnvironmentMapsMaximumLOD; + */ + czm_specularEnvironmentMapsMaximumLOD: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.specularEnvironmentMapsMaximumLOD; + } + }), + /** + * An automatic GLSL uniform containing the spherical harmonic coefficients used within the scene. + * + * @example + * // GLSL declaration + * uniform vec3[9] czm_sphericalHarmonicCoefficients; + */ + czm_sphericalHarmonicCoefficients: new AutomaticUniform({ + size: 9, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.sphericalHarmonicCoefficients; + } + }), + /** + * An automatic GLSL uniform representing a 3x3 rotation matrix that transforms + * from True Equator Mean Equinox (TEME) axes to the pseudo-fixed axes at the current scene time. + * + * @example + * // GLSL declaration + * uniform mat3 czm_temeToPseudoFixed; + * + * // Example + * vec3 pseudoFixed = czm_temeToPseudoFixed * teme; + * + * @see UniformState#temeToPseudoFixedMatrix + * @see Transforms.computeTemeToPseudoFixedMatrix + */ + czm_temeToPseudoFixed: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_MAT3, + getValue: function(e) { + return e.temeToPseudoFixedMatrix; + } + }), + /** + * An automatic GLSL uniform representing the ratio of canvas coordinate space to canvas pixel space. + * + * @example + * uniform float czm_pixelRatio; + */ + czm_pixelRatio: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.pixelRatio; + } + }), + /** + * An automatic GLSL uniform scalar used to mix a color with the fog color based on the distance to the camera. + * + * @see czm_fog + */ + czm_fogDensity: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.fogDensity; + } + }), + /** + * An automatic GLSL uniform scalar used to set a minimum brightness when dynamic lighting is applied to fog. + * + * @see czm_fog + */ + czm_fogMinimumBrightness: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.fogMinimumBrightness; + } + }), + /** + * An automatic uniform representing the color shift for the atmosphere in HSB color space + * + * @example + * uniform vec3 czm_atmosphereHsbShift; + */ + czm_atmosphereHsbShift: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.atmosphereHsbShift; + } + }), + /** + * An automatic uniform representing the intensity of the light that is used for computing the atmosphere color + * + * @example + * uniform float czm_atmosphereLightIntensity; + */ + czm_atmosphereLightIntensity: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.atmosphereLightIntensity; + } + }), + /** + * An automatic uniform representing the Rayleigh scattering coefficient used when computing the atmosphere scattering + * + * @example + * uniform vec3 czm_atmosphereRayleighCoefficient; + */ + czm_atmosphereRayleighCoefficient: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.atmosphereRayleighCoefficient; + } + }), + /** + * An automatic uniform representing the Rayleigh scale height in meters used for computing atmosphere scattering. + * + * @example + * uniform vec3 czm_atmosphereRayleighScaleHeight; + */ + czm_atmosphereRayleighScaleHeight: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.atmosphereRayleighScaleHeight; + } + }), + /** + * An automatic uniform representing the Mie scattering coefficient used when computing atmosphere scattering. + * + * @example + * uniform vec3 czm_atmosphereMieCoefficient; + */ + czm_atmosphereMieCoefficient: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.atmosphereMieCoefficient; + } + }), + /** + * An automatic uniform storign the Mie scale height used when computing atmosphere scattering. + * + * @example + * uniform float czm_atmosphereMieScaleHeight; + */ + czm_atmosphereMieScaleHeight: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.atmosphereMieScaleHeight; + } + }), + /** + * An automatic uniform representing the anisotropy of the medium to consider for Mie scattering. + * + * @example + * uniform float czm_atmosphereAnisotropy; + */ + czm_atmosphereMieAnisotropy: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.atmosphereMieAnisotropy; + } + }), + /** + * An automatic uniform representing which light source to use for dynamic lighting + * + * @example + * uniform float czm_atmosphereDynamicLighting + */ + czm_atmosphereDynamicLighting: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.atmosphereDynamicLighting; + } + }), + /** + * An automatic GLSL uniform representing the splitter position to use when rendering with a splitter. + * This will be in pixel coordinates relative to the canvas. + * + * @example + * // GLSL declaration + * uniform float czm_splitPosition; + */ + czm_splitPosition: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.splitPosition; + } + }), + /** + * An automatic GLSL uniform scalar representing the geometric tolerance per meter + */ + czm_geometricToleranceOverMeter: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.geometricToleranceOverMeter; + } + }), + /** + * An automatic GLSL uniform representing the distance from the camera at which to disable the depth test of billboards, labels and points + * to, for example, prevent clipping against terrain. When set to zero, the depth test should always be applied. When less than zero, + * the depth test should never be applied. + */ + czm_minimumDisableDepthTestDistance: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.minimumDisableDepthTestDistance; + } + }), + /** + * An automatic GLSL uniform that will be the highlight color of unclassified 3D Tiles. + */ + czm_invertClassificationColor: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC4, + getValue: function(e) { + return e.invertClassificationColor; + } + }), + /** + * An automatic GLSL uniform that is used for gamma correction. + */ + czm_gamma: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT, + getValue: function(e) { + return e.gamma; + } + }), + /** + * An automatic GLSL uniform that stores the ellipsoid radii. + */ + czm_ellipsoidRadii: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.ellipsoid.radii; + } + }), + /** + * An automatic GLSL uniform that stores the ellipsoid inverse radii. + */ + czm_ellipsoidInverseRadii: new AutomaticUniform({ + size: 1, + datatype: WebGLConstants$1.FLOAT_VEC3, + getValue: function(e) { + return e.ellipsoid.oneOverRadii; + } + }) +}; +function createGuid() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(e) { + const t = Math.random() * 16 | 0; + return (e === "x" ? t : t & 3 | 8).toString(16); + }); +} +function returnTrue() { + return !0; +} +function destroyObject(e, t) { + function n() { + } + for (const i in e) + typeof e[i] == "function" && (e[i] = n); + e.isDestroyed = returnTrue; +} +const IndexDatatype = { + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + * + * @type {number} + * @constant + */ + UNSIGNED_BYTE: WebGLConstants$1.UNSIGNED_BYTE, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + * + * @type {number} + * @constant + */ + UNSIGNED_SHORT: WebGLConstants$1.UNSIGNED_SHORT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + * + * @type {number} + * @constant + */ + UNSIGNED_INT: WebGLConstants$1.UNSIGNED_INT +}; +IndexDatatype.getSizeInBytes = function(e) { + switch (e) { + case IndexDatatype.UNSIGNED_BYTE: + return Uint8Array.BYTES_PER_ELEMENT; + case IndexDatatype.UNSIGNED_SHORT: + return Uint16Array.BYTES_PER_ELEMENT; + case IndexDatatype.UNSIGNED_INT: + return Uint32Array.BYTES_PER_ELEMENT; + } +}; +IndexDatatype.fromSizeInBytes = function(e) { + switch (e) { + case 2: + return IndexDatatype.UNSIGNED_SHORT; + case 4: + return IndexDatatype.UNSIGNED_INT; + case 1: + return IndexDatatype.UNSIGNED_BYTE; + } +}; +IndexDatatype.validate = function(e) { + return defined(e) && (e === IndexDatatype.UNSIGNED_BYTE || e === IndexDatatype.UNSIGNED_SHORT || e === IndexDatatype.UNSIGNED_INT); +}; +IndexDatatype.createTypedArray = function(e, t) { + return e >= CesiumMath.SIXTY_FOUR_KILOBYTES ? new Uint32Array(t) : new Uint16Array(t); +}; +IndexDatatype.createTypedArrayFromArrayBuffer = function(e, t, n, i) { + return e >= CesiumMath.SIXTY_FOUR_KILOBYTES ? new Uint32Array(t, n, i) : new Uint16Array(t, n, i); +}; +IndexDatatype.fromTypedArray = function(e) { + if (e instanceof Uint8Array) + return IndexDatatype.UNSIGNED_BYTE; + if (e instanceof Uint16Array) + return IndexDatatype.UNSIGNED_SHORT; + if (e instanceof Uint32Array) + return IndexDatatype.UNSIGNED_INT; +}; +const IndexDatatype$1 = Object.freeze(IndexDatatype), BufferUsage = { + STREAM_DRAW: WebGLConstants$1.STREAM_DRAW, + STATIC_DRAW: WebGLConstants$1.STATIC_DRAW, + DYNAMIC_DRAW: WebGLConstants$1.DYNAMIC_DRAW, + validate: function(e) { + return e === BufferUsage.STREAM_DRAW || e === BufferUsage.STATIC_DRAW || e === BufferUsage.DYNAMIC_DRAW; + } +}, BufferUsage$1 = Object.freeze(BufferUsage); +function Buffer(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context._gl, n = e.bufferTarget, i = e.typedArray; + let r = e.sizeInBytes; + const o = e.usage, s = defined(i); + s && (r = i.byteLength); + const c = t.createBuffer(); + t.bindBuffer(n, c), t.bufferData(n, s ? i : r, o), t.bindBuffer(n, null), this._id = createGuid(), this._gl = t, this._webgl2 = e.context._webgl2, this._bufferTarget = n, this._sizeInBytes = r, this._usage = o, this._buffer = c, this.vertexArrayDestroyable = !0; +} +Buffer.createVertexBuffer = function(e) { + return new Buffer({ + context: e.context, + bufferTarget: WebGLConstants$1.ARRAY_BUFFER, + typedArray: e.typedArray, + sizeInBytes: e.sizeInBytes, + usage: e.usage + }); +}; +Buffer.createIndexBuffer = function(e) { + const t = e.context, n = e.indexDatatype, i = IndexDatatype$1.getSizeInBytes(n), r = new Buffer({ + context: t, + bufferTarget: WebGLConstants$1.ELEMENT_ARRAY_BUFFER, + typedArray: e.typedArray, + sizeInBytes: e.sizeInBytes, + usage: e.usage + }), o = r.sizeInBytes / i; + return Object.defineProperties(r, { + indexDatatype: { + get: function() { + return n; + } + }, + bytesPerIndex: { + get: function() { + return i; + } + }, + numberOfIndices: { + get: function() { + return o; + } + } + }), r; +}; +Object.defineProperties(Buffer.prototype, { + sizeInBytes: { + get: function() { + return this._sizeInBytes; + } + }, + usage: { + get: function() { + return this._usage; + } + } +}); +Buffer.prototype._getBuffer = function() { + return this._buffer; +}; +Buffer.prototype.copyFromArrayView = function(e, t) { + t = defaultValue(t, 0); + const n = this._gl, i = this._bufferTarget; + n.bindBuffer(i, this._buffer), n.bufferSubData(i, t, e), n.bindBuffer(i, null); +}; +Buffer.prototype.copyFromBuffer = function(e, t, n, i) { + const r = WebGLConstants$1.COPY_READ_BUFFER, o = WebGLConstants$1.COPY_WRITE_BUFFER, s = this._gl; + s.bindBuffer(o, this._buffer), s.bindBuffer(r, e._buffer), s.copyBufferSubData( + r, + o, + t, + n, + i + ), s.bindBuffer(o, null), s.bindBuffer(r, null); +}; +Buffer.prototype.getBufferData = function(e, t, n, i) { + t = defaultValue(t, 0), n = defaultValue(n, 0); + const r = this._gl, o = WebGLConstants$1.COPY_READ_BUFFER; + r.bindBuffer(o, this._buffer), r.getBufferSubData( + o, + t, + e, + n, + i + ), r.bindBuffer(o, null); +}; +Buffer.prototype.isDestroyed = function() { + return !1; +}; +Buffer.prototype.destroy = function() { + return this._gl.deleteBuffer(this._buffer), destroyObject(this); +}; +let _supportsFullscreen; +const _names = { + requestFullscreen: void 0, + exitFullscreen: void 0, + fullscreenEnabled: void 0, + fullscreenElement: void 0, + fullscreenchange: void 0, + fullscreenerror: void 0 +}, Fullscreen = {}; +Object.defineProperties(Fullscreen, { + /** + * The element that is currently fullscreen, if any. To simply check if the + * browser is in fullscreen mode or not, use {@link Fullscreen#fullscreen}. + * @memberof Fullscreen + * @type {object} + * @readonly + */ + element: { + get: function() { + if (Fullscreen.supportsFullscreen()) + return document[_names.fullscreenElement]; + } + }, + /** + * The name of the event on the document that is fired when fullscreen is + * entered or exited. This event name is intended for use with addEventListener. + * In your event handler, to determine if the browser is in fullscreen mode or not, + * use {@link Fullscreen#fullscreen}. + * @memberof Fullscreen + * @type {string} + * @readonly + */ + changeEventName: { + get: function() { + if (Fullscreen.supportsFullscreen()) + return _names.fullscreenchange; + } + }, + /** + * The name of the event that is fired when a fullscreen error + * occurs. This event name is intended for use with addEventListener. + * @memberof Fullscreen + * @type {string} + * @readonly + */ + errorEventName: { + get: function() { + if (Fullscreen.supportsFullscreen()) + return _names.fullscreenerror; + } + }, + /** + * Determine whether the browser will allow an element to be made fullscreen, or not. + * For example, by default, iframes cannot go fullscreen unless the containing page + * adds an "allowfullscreen" attribute (or prefixed equivalent). + * @memberof Fullscreen + * @type {boolean} + * @readonly + */ + enabled: { + get: function() { + if (Fullscreen.supportsFullscreen()) + return document[_names.fullscreenEnabled]; + } + }, + /** + * Determines if the browser is currently in fullscreen mode. + * @memberof Fullscreen + * @type {boolean} + * @readonly + */ + fullscreen: { + get: function() { + if (Fullscreen.supportsFullscreen()) + return Fullscreen.element !== null; + } + } +}); +Fullscreen.supportsFullscreen = function() { + if (defined(_supportsFullscreen)) + return _supportsFullscreen; + _supportsFullscreen = !1; + const e = document.body; + if (typeof e.requestFullscreen == "function") + return _names.requestFullscreen = "requestFullscreen", _names.exitFullscreen = "exitFullscreen", _names.fullscreenEnabled = "fullscreenEnabled", _names.fullscreenElement = "fullscreenElement", _names.fullscreenchange = "fullscreenchange", _names.fullscreenerror = "fullscreenerror", _supportsFullscreen = !0, _supportsFullscreen; + const t = ["webkit", "moz", "o", "ms", "khtml"]; + let n; + for (let i = 0, r = t.length; i < r; ++i) { + const o = t[i]; + n = `${o}RequestFullscreen`, typeof e[n] == "function" ? (_names.requestFullscreen = n, _supportsFullscreen = !0) : (n = `${o}RequestFullScreen`, typeof e[n] == "function" && (_names.requestFullscreen = n, _supportsFullscreen = !0)), n = `${o}ExitFullscreen`, typeof document[n] == "function" ? _names.exitFullscreen = n : (n = `${o}CancelFullScreen`, typeof document[n] == "function" && (_names.exitFullscreen = n)), n = `${o}FullscreenEnabled`, document[n] !== void 0 ? _names.fullscreenEnabled = n : (n = `${o}FullScreenEnabled`, document[n] !== void 0 && (_names.fullscreenEnabled = n)), n = `${o}FullscreenElement`, document[n] !== void 0 ? _names.fullscreenElement = n : (n = `${o}FullScreenElement`, document[n] !== void 0 && (_names.fullscreenElement = n)), n = `${o}fullscreenchange`, document[`on${n}`] !== void 0 && (o === "ms" && (n = "MSFullscreenChange"), _names.fullscreenchange = n), n = `${o}fullscreenerror`, document[`on${n}`] !== void 0 && (o === "ms" && (n = "MSFullscreenError"), _names.fullscreenerror = n); + } + return _supportsFullscreen; +}; +Fullscreen.requestFullscreen = function(e, t) { + Fullscreen.supportsFullscreen() && e[_names.requestFullscreen]({ vrDisplay: t }); +}; +Fullscreen.exitFullscreen = function() { + Fullscreen.supportsFullscreen() && document[_names.exitFullscreen](); +}; +Fullscreen._names = _names; +let theNavigator; +typeof navigator < "u" ? theNavigator = navigator : theNavigator = {}; +function extractVersion(e) { + const t = e.split("."); + for (let n = 0, i = t.length; n < i; ++n) + t[n] = parseInt(t[n], 10); + return t; +} +let isChromeResult, chromeVersionResult; +function isChrome() { + if (!defined(isChromeResult) && (isChromeResult = !1, !isEdge())) { + const e = / Chrome\/([\.0-9]+)/.exec(theNavigator.userAgent); + e !== null && (isChromeResult = !0, chromeVersionResult = extractVersion(e[1])); + } + return isChromeResult; +} +function chromeVersion() { + return isChrome() && chromeVersionResult; +} +let isSafariResult, safariVersionResult; +function isSafari() { + if (!defined(isSafariResult) && (isSafariResult = !1, !isChrome() && !isEdge() && / Safari\/[\.0-9]+/.test(theNavigator.userAgent))) { + const e = / Version\/([\.0-9]+)/.exec(theNavigator.userAgent); + e !== null && (isSafariResult = !0, safariVersionResult = extractVersion(e[1])); + } + return isSafariResult; +} +function safariVersion() { + return isSafari() && safariVersionResult; +} +let isWebkitResult, webkitVersionResult; +function isWebkit() { + if (!defined(isWebkitResult)) { + isWebkitResult = !1; + const e = / AppleWebKit\/([\.0-9]+)(\+?)/.exec(theNavigator.userAgent); + e !== null && (isWebkitResult = !0, webkitVersionResult = extractVersion(e[1]), webkitVersionResult.isNightly = !!e[2]); + } + return isWebkitResult; +} +function webkitVersion() { + return isWebkit() && webkitVersionResult; +} +let isInternetExplorerResult, internetExplorerVersionResult; +function isInternetExplorer() { + if (!defined(isInternetExplorerResult)) { + isInternetExplorerResult = !1; + let e; + theNavigator.appName === "Microsoft Internet Explorer" ? (e = /MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent), e !== null && (isInternetExplorerResult = !0, internetExplorerVersionResult = extractVersion(e[1]))) : theNavigator.appName === "Netscape" && (e = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec( + theNavigator.userAgent + ), e !== null && (isInternetExplorerResult = !0, internetExplorerVersionResult = extractVersion(e[1]))); + } + return isInternetExplorerResult; +} +function internetExplorerVersion() { + return isInternetExplorer() && internetExplorerVersionResult; +} +let isEdgeResult, edgeVersionResult; +function isEdge() { + if (!defined(isEdgeResult)) { + isEdgeResult = !1; + const e = / Edg\/([\.0-9]+)/.exec(theNavigator.userAgent); + e !== null && (isEdgeResult = !0, edgeVersionResult = extractVersion(e[1])); + } + return isEdgeResult; +} +function edgeVersion() { + return isEdge() && edgeVersionResult; +} +let isFirefoxResult, firefoxVersionResult; +function isFirefox() { + if (!defined(isFirefoxResult)) { + isFirefoxResult = !1; + const e = /Firefox\/([\.0-9]+)/.exec(theNavigator.userAgent); + e !== null && (isFirefoxResult = !0, firefoxVersionResult = extractVersion(e[1])); + } + return isFirefoxResult; +} +let isWindowsResult; +function isWindows() { + return defined(isWindowsResult) || (isWindowsResult = /Windows/i.test(theNavigator.appVersion)), isWindowsResult; +} +let isIPadOrIOSResult; +function isIPadOrIOS() { + return defined(isIPadOrIOSResult) || (isIPadOrIOSResult = navigator.platform === "iPhone" || navigator.platform === "iPod" || navigator.platform === "iPad"), isIPadOrIOSResult; +} +function firefoxVersion() { + return isFirefox() && firefoxVersionResult; +} +let hasPointerEvents; +function supportsPointerEvents() { + return defined(hasPointerEvents) || (hasPointerEvents = typeof PointerEvent < "u" && (!defined(theNavigator.pointerEnabled) || theNavigator.pointerEnabled)), hasPointerEvents; +} +let imageRenderingValueResult, supportsImageRenderingPixelatedResult; +function supportsImageRenderingPixelated() { + if (!defined(supportsImageRenderingPixelatedResult)) { + const e = document.createElement("canvas"); + e.setAttribute( + "style", + "image-rendering: -moz-crisp-edges;image-rendering: pixelated;" + ); + const t = e.style.imageRendering; + supportsImageRenderingPixelatedResult = defined(t) && t !== "", supportsImageRenderingPixelatedResult && (imageRenderingValueResult = t); + } + return supportsImageRenderingPixelatedResult; +} +function imageRenderingValue() { + return supportsImageRenderingPixelated() ? imageRenderingValueResult : void 0; +} +function supportsWebP() { + return supportsWebP._result; +} +supportsWebP._promise = void 0; +supportsWebP._result = void 0; +supportsWebP.initialize = function() { + return defined(supportsWebP._promise) || (supportsWebP._promise = new Promise((e) => { + const t = new Image(); + t.onload = function() { + supportsWebP._result = t.width > 0 && t.height > 0, e(supportsWebP._result); + }, t.onerror = function() { + supportsWebP._result = !1, e(supportsWebP._result); + }, t.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"; + })), supportsWebP._promise; +}; +Object.defineProperties(supportsWebP, { + initialized: { + get: function() { + return defined(supportsWebP._result); + } + } +}); +const typedArrayTypes = []; +typeof ArrayBuffer < "u" && (typedArrayTypes.push( + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +), typeof Uint8ClampedArray < "u" && typedArrayTypes.push(Uint8ClampedArray), typeof Uint8ClampedArray < "u" && typedArrayTypes.push(Uint8ClampedArray), typeof BigInt64Array < "u" && typedArrayTypes.push(BigInt64Array), typeof BigUint64Array < "u" && typedArrayTypes.push(BigUint64Array)); +const FeatureDetection = { + isChrome, + chromeVersion, + isSafari, + safariVersion, + isWebkit, + webkitVersion, + isInternetExplorer, + internetExplorerVersion, + isEdge, + edgeVersion, + isFirefox, + firefoxVersion, + isWindows, + isIPadOrIOS, + hardwareConcurrency: defaultValue(theNavigator.hardwareConcurrency, 3), + supportsPointerEvents, + supportsImageRenderingPixelated, + supportsWebP, + imageRenderingValue, + typedArrayTypes +}; +FeatureDetection.supportsBasis = function(e) { + return FeatureDetection.supportsWebAssembly() && e.context.supportsBasis; +}; +FeatureDetection.supportsFullscreen = function() { + return Fullscreen.supportsFullscreen(); +}; +FeatureDetection.supportsTypedArrays = function() { + return typeof ArrayBuffer < "u"; +}; +FeatureDetection.supportsBigInt64Array = function() { + return typeof BigInt64Array < "u"; +}; +FeatureDetection.supportsBigUint64Array = function() { + return typeof BigUint64Array < "u"; +}; +FeatureDetection.supportsBigInt = function() { + return typeof BigInt < "u"; +}; +FeatureDetection.supportsWebWorkers = function() { + return typeof Worker < "u"; +}; +FeatureDetection.supportsWebAssembly = function() { + return typeof WebAssembly < "u"; +}; +FeatureDetection.supportsWebgl2 = function(e) { + return e.context.webgl2; +}; +FeatureDetection.supportsEsmWebWorkers = function() { + return !isFirefox() || parseInt(firefoxVersionResult) >= 114; +}; +function hue2rgb(e, t, n) { + return n < 0 && (n += 1), n > 1 && (n -= 1), n * 6 < 1 ? e + (t - e) * 6 * n : n * 2 < 1 ? t : n * 3 < 2 ? e + (t - e) * (2 / 3 - n) * 6 : e; +} +function Color(e, t, n, i) { + this.red = defaultValue(e, 1), this.green = defaultValue(t, 1), this.blue = defaultValue(n, 1), this.alpha = defaultValue(i, 1); +} +Color.fromCartesian4 = function(e, t) { + return defined(t) ? (t.red = e.x, t.green = e.y, t.blue = e.z, t.alpha = e.w, t) : new Color(e.x, e.y, e.z, e.w); +}; +Color.fromBytes = function(e, t, n, i, r) { + return e = Color.byteToFloat(defaultValue(e, 255)), t = Color.byteToFloat(defaultValue(t, 255)), n = Color.byteToFloat(defaultValue(n, 255)), i = Color.byteToFloat(defaultValue(i, 255)), defined(r) ? (r.red = e, r.green = t, r.blue = n, r.alpha = i, r) : new Color(e, t, n, i); +}; +Color.fromAlpha = function(e, t, n) { + return defined(n) ? (n.red = e.red, n.green = e.green, n.blue = e.blue, n.alpha = t, n) : new Color(e.red, e.green, e.blue, t); +}; +let scratchArrayBuffer, scratchUint32Array, scratchUint8Array; +FeatureDetection.supportsTypedArrays() && (scratchArrayBuffer = new ArrayBuffer(4), scratchUint32Array = new Uint32Array(scratchArrayBuffer), scratchUint8Array = new Uint8Array(scratchArrayBuffer)); +Color.fromRgba = function(e, t) { + return scratchUint32Array[0] = e, Color.fromBytes( + scratchUint8Array[0], + scratchUint8Array[1], + scratchUint8Array[2], + scratchUint8Array[3], + t + ); +}; +Color.fromHsl = function(e, t, n, i, r) { + e = defaultValue(e, 0) % 1, t = defaultValue(t, 0), n = defaultValue(n, 0), i = defaultValue(i, 1); + let o = n, s = n, c = n; + if (t !== 0) { + let l; + n < 0.5 ? l = n * (1 + t) : l = n + t - n * t; + const d = 2 * n - l; + o = hue2rgb(d, l, e + 1 / 3), s = hue2rgb(d, l, e), c = hue2rgb(d, l, e - 1 / 3); + } + return defined(r) ? (r.red = o, r.green = s, r.blue = c, r.alpha = i, r) : new Color(o, s, c, i); +}; +Color.fromRandom = function(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let n = e.red; + if (!defined(n)) { + const s = defaultValue(e.minimumRed, 0), c = defaultValue(e.maximumRed, 1); + n = s + CesiumMath.nextRandomNumber() * (c - s); + } + let i = e.green; + if (!defined(i)) { + const s = defaultValue(e.minimumGreen, 0), c = defaultValue(e.maximumGreen, 1); + i = s + CesiumMath.nextRandomNumber() * (c - s); + } + let r = e.blue; + if (!defined(r)) { + const s = defaultValue(e.minimumBlue, 0), c = defaultValue(e.maximumBlue, 1); + r = s + CesiumMath.nextRandomNumber() * (c - s); + } + let o = e.alpha; + if (!defined(o)) { + const s = defaultValue(e.minimumAlpha, 0), c = defaultValue(e.maximumAlpha, 1); + o = s + CesiumMath.nextRandomNumber() * (c - s); + } + return defined(t) ? (t.red = n, t.green = i, t.blue = r, t.alpha = o, t) : new Color(n, i, r, o); +}; +const rgbaMatcher = /^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i, rrggbbaaMatcher = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i, rgbParenthesesMatcher = /^rgba?\s*\(\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i, hslParenthesesMatcher = /^hsla?\s*\(\s*([0-9.]+)\s*[,\s]+\s*([0-9.]+%)\s*[,\s]+\s*([0-9.]+%)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i; +Color.fromCssColorString = function(e, t) { + defined(t) || (t = new Color()), e = e.trim(); + const n = Color[e.toUpperCase()]; + if (defined(n)) + return Color.clone(n, t), t; + let i = rgbaMatcher.exec(e); + return i !== null ? (t.red = parseInt(i[1], 16) / 15, t.green = parseInt(i[2], 16) / 15, t.blue = parseInt(i[3], 16) / 15, t.alpha = parseInt(defaultValue(i[4], "f"), 16) / 15, t) : (i = rrggbbaaMatcher.exec(e), i !== null ? (t.red = parseInt(i[1], 16) / 255, t.green = parseInt(i[2], 16) / 255, t.blue = parseInt(i[3], 16) / 255, t.alpha = parseInt(defaultValue(i[4], "ff"), 16) / 255, t) : (i = rgbParenthesesMatcher.exec(e), i !== null ? (t.red = parseFloat(i[1]) / (i[1].substr(-1) === "%" ? 100 : 255), t.green = parseFloat(i[2]) / (i[2].substr(-1) === "%" ? 100 : 255), t.blue = parseFloat(i[3]) / (i[3].substr(-1) === "%" ? 100 : 255), t.alpha = parseFloat(defaultValue(i[4], "1.0")), t) : (i = hslParenthesesMatcher.exec(e), i !== null ? Color.fromHsl( + parseFloat(i[1]) / 360, + parseFloat(i[2]) / 100, + parseFloat(i[3]) / 100, + parseFloat(defaultValue(i[4], "1.0")), + t + ) : (t = void 0, t)))); +}; +Color.packedLength = 4; +Color.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.red, t[n++] = e.green, t[n++] = e.blue, t[n] = e.alpha, t; +}; +Color.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Color()), n.red = e[t++], n.green = e[t++], n.blue = e[t++], n.alpha = e[t], n; +}; +Color.byteToFloat = function(e) { + return e / 255; +}; +Color.floatToByte = function(e) { + return e === 1 ? 255 : e * 256 | 0; +}; +Color.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.red = e.red, t.green = e.green, t.blue = e.blue, t.alpha = e.alpha, t) : new Color(e.red, e.green, e.blue, e.alpha); +}; +Color.equals = function(e, t) { + return e === t || // + defined(e) && // + defined(t) && // + e.red === t.red && // + e.green === t.green && // + e.blue === t.blue && // + e.alpha === t.alpha; +}; +Color.equalsArray = function(e, t, n) { + return e.red === t[n] && e.green === t[n + 1] && e.blue === t[n + 2] && e.alpha === t[n + 3]; +}; +Color.prototype.clone = function(e) { + return Color.clone(this, e); +}; +Color.prototype.equals = function(e) { + return Color.equals(this, e); +}; +Color.prototype.equalsEpsilon = function(e, t) { + return this === e || // + defined(e) && // + Math.abs(this.red - e.red) <= t && // + Math.abs(this.green - e.green) <= t && // + Math.abs(this.blue - e.blue) <= t && // + Math.abs(this.alpha - e.alpha) <= t; +}; +Color.prototype.toString = function() { + return `(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`; +}; +Color.prototype.toCssColorString = function() { + const e = Color.floatToByte(this.red), t = Color.floatToByte(this.green), n = Color.floatToByte(this.blue); + return this.alpha === 1 ? `rgb(${e},${t},${n})` : `rgba(${e},${t},${n},${this.alpha})`; +}; +Color.prototype.toCssHexString = function() { + let e = Color.floatToByte(this.red).toString(16); + e.length < 2 && (e = `0${e}`); + let t = Color.floatToByte(this.green).toString(16); + t.length < 2 && (t = `0${t}`); + let n = Color.floatToByte(this.blue).toString(16); + if (n.length < 2 && (n = `0${n}`), this.alpha < 1) { + let i = Color.floatToByte(this.alpha).toString(16); + return i.length < 2 && (i = `0${i}`), `#${e}${t}${n}${i}`; + } + return `#${e}${t}${n}`; +}; +Color.prototype.toBytes = function(e) { + const t = Color.floatToByte(this.red), n = Color.floatToByte(this.green), i = Color.floatToByte(this.blue), r = Color.floatToByte(this.alpha); + return defined(e) ? (e[0] = t, e[1] = n, e[2] = i, e[3] = r, e) : [t, n, i, r]; +}; +Color.prototype.toRgba = function() { + return scratchUint8Array[0] = Color.floatToByte(this.red), scratchUint8Array[1] = Color.floatToByte(this.green), scratchUint8Array[2] = Color.floatToByte(this.blue), scratchUint8Array[3] = Color.floatToByte(this.alpha), scratchUint32Array[0]; +}; +Color.prototype.brighten = function(e, t) { + return e = 1 - e, t.red = 1 - (1 - this.red) * e, t.green = 1 - (1 - this.green) * e, t.blue = 1 - (1 - this.blue) * e, t.alpha = this.alpha, t; +}; +Color.prototype.darken = function(e, t) { + return e = 1 - e, t.red = this.red * e, t.green = this.green * e, t.blue = this.blue * e, t.alpha = this.alpha, t; +}; +Color.prototype.withAlpha = function(e, t) { + return Color.fromAlpha(this, e, t); +}; +Color.add = function(e, t, n) { + return n.red = e.red + t.red, n.green = e.green + t.green, n.blue = e.blue + t.blue, n.alpha = e.alpha + t.alpha, n; +}; +Color.subtract = function(e, t, n) { + return n.red = e.red - t.red, n.green = e.green - t.green, n.blue = e.blue - t.blue, n.alpha = e.alpha - t.alpha, n; +}; +Color.multiply = function(e, t, n) { + return n.red = e.red * t.red, n.green = e.green * t.green, n.blue = e.blue * t.blue, n.alpha = e.alpha * t.alpha, n; +}; +Color.divide = function(e, t, n) { + return n.red = e.red / t.red, n.green = e.green / t.green, n.blue = e.blue / t.blue, n.alpha = e.alpha / t.alpha, n; +}; +Color.mod = function(e, t, n) { + return n.red = e.red % t.red, n.green = e.green % t.green, n.blue = e.blue % t.blue, n.alpha = e.alpha % t.alpha, n; +}; +Color.lerp = function(e, t, n, i) { + return i.red = CesiumMath.lerp(e.red, t.red, n), i.green = CesiumMath.lerp(e.green, t.green, n), i.blue = CesiumMath.lerp(e.blue, t.blue, n), i.alpha = CesiumMath.lerp(e.alpha, t.alpha, n), i; +}; +Color.multiplyByScalar = function(e, t, n) { + return n.red = e.red * t, n.green = e.green * t, n.blue = e.blue * t, n.alpha = e.alpha * t, n; +}; +Color.divideByScalar = function(e, t, n) { + return n.red = e.red / t, n.green = e.green / t, n.blue = e.blue / t, n.alpha = e.alpha / t, n; +}; +Color.ALICEBLUE = Object.freeze(Color.fromCssColorString("#F0F8FF")); +Color.ANTIQUEWHITE = Object.freeze(Color.fromCssColorString("#FAEBD7")); +Color.AQUA = Object.freeze(Color.fromCssColorString("#00FFFF")); +Color.AQUAMARINE = Object.freeze(Color.fromCssColorString("#7FFFD4")); +Color.AZURE = Object.freeze(Color.fromCssColorString("#F0FFFF")); +Color.BEIGE = Object.freeze(Color.fromCssColorString("#F5F5DC")); +Color.BISQUE = Object.freeze(Color.fromCssColorString("#FFE4C4")); +Color.BLACK = Object.freeze(Color.fromCssColorString("#000000")); +Color.BLANCHEDALMOND = Object.freeze(Color.fromCssColorString("#FFEBCD")); +Color.BLUE = Object.freeze(Color.fromCssColorString("#0000FF")); +Color.BLUEVIOLET = Object.freeze(Color.fromCssColorString("#8A2BE2")); +Color.BROWN = Object.freeze(Color.fromCssColorString("#A52A2A")); +Color.BURLYWOOD = Object.freeze(Color.fromCssColorString("#DEB887")); +Color.CADETBLUE = Object.freeze(Color.fromCssColorString("#5F9EA0")); +Color.CHARTREUSE = Object.freeze(Color.fromCssColorString("#7FFF00")); +Color.CHOCOLATE = Object.freeze(Color.fromCssColorString("#D2691E")); +Color.CORAL = Object.freeze(Color.fromCssColorString("#FF7F50")); +Color.CORNFLOWERBLUE = Object.freeze(Color.fromCssColorString("#6495ED")); +Color.CORNSILK = Object.freeze(Color.fromCssColorString("#FFF8DC")); +Color.CRIMSON = Object.freeze(Color.fromCssColorString("#DC143C")); +Color.CYAN = Object.freeze(Color.fromCssColorString("#00FFFF")); +Color.DARKBLUE = Object.freeze(Color.fromCssColorString("#00008B")); +Color.DARKCYAN = Object.freeze(Color.fromCssColorString("#008B8B")); +Color.DARKGOLDENROD = Object.freeze(Color.fromCssColorString("#B8860B")); +Color.DARKGRAY = Object.freeze(Color.fromCssColorString("#A9A9A9")); +Color.DARKGREEN = Object.freeze(Color.fromCssColorString("#006400")); +Color.DARKGREY = Color.DARKGRAY; +Color.DARKKHAKI = Object.freeze(Color.fromCssColorString("#BDB76B")); +Color.DARKMAGENTA = Object.freeze(Color.fromCssColorString("#8B008B")); +Color.DARKOLIVEGREEN = Object.freeze(Color.fromCssColorString("#556B2F")); +Color.DARKORANGE = Object.freeze(Color.fromCssColorString("#FF8C00")); +Color.DARKORCHID = Object.freeze(Color.fromCssColorString("#9932CC")); +Color.DARKRED = Object.freeze(Color.fromCssColorString("#8B0000")); +Color.DARKSALMON = Object.freeze(Color.fromCssColorString("#E9967A")); +Color.DARKSEAGREEN = Object.freeze(Color.fromCssColorString("#8FBC8F")); +Color.DARKSLATEBLUE = Object.freeze(Color.fromCssColorString("#483D8B")); +Color.DARKSLATEGRAY = Object.freeze(Color.fromCssColorString("#2F4F4F")); +Color.DARKSLATEGREY = Color.DARKSLATEGRAY; +Color.DARKTURQUOISE = Object.freeze(Color.fromCssColorString("#00CED1")); +Color.DARKVIOLET = Object.freeze(Color.fromCssColorString("#9400D3")); +Color.DEEPPINK = Object.freeze(Color.fromCssColorString("#FF1493")); +Color.DEEPSKYBLUE = Object.freeze(Color.fromCssColorString("#00BFFF")); +Color.DIMGRAY = Object.freeze(Color.fromCssColorString("#696969")); +Color.DIMGREY = Color.DIMGRAY; +Color.DODGERBLUE = Object.freeze(Color.fromCssColorString("#1E90FF")); +Color.FIREBRICK = Object.freeze(Color.fromCssColorString("#B22222")); +Color.FLORALWHITE = Object.freeze(Color.fromCssColorString("#FFFAF0")); +Color.FORESTGREEN = Object.freeze(Color.fromCssColorString("#228B22")); +Color.FUCHSIA = Object.freeze(Color.fromCssColorString("#FF00FF")); +Color.GAINSBORO = Object.freeze(Color.fromCssColorString("#DCDCDC")); +Color.GHOSTWHITE = Object.freeze(Color.fromCssColorString("#F8F8FF")); +Color.GOLD = Object.freeze(Color.fromCssColorString("#FFD700")); +Color.GOLDENROD = Object.freeze(Color.fromCssColorString("#DAA520")); +Color.GRAY = Object.freeze(Color.fromCssColorString("#808080")); +Color.GREEN = Object.freeze(Color.fromCssColorString("#008000")); +Color.GREENYELLOW = Object.freeze(Color.fromCssColorString("#ADFF2F")); +Color.GREY = Color.GRAY; +Color.HONEYDEW = Object.freeze(Color.fromCssColorString("#F0FFF0")); +Color.HOTPINK = Object.freeze(Color.fromCssColorString("#FF69B4")); +Color.INDIANRED = Object.freeze(Color.fromCssColorString("#CD5C5C")); +Color.INDIGO = Object.freeze(Color.fromCssColorString("#4B0082")); +Color.IVORY = Object.freeze(Color.fromCssColorString("#FFFFF0")); +Color.KHAKI = Object.freeze(Color.fromCssColorString("#F0E68C")); +Color.LAVENDER = Object.freeze(Color.fromCssColorString("#E6E6FA")); +Color.LAVENDAR_BLUSH = Object.freeze(Color.fromCssColorString("#FFF0F5")); +Color.LAWNGREEN = Object.freeze(Color.fromCssColorString("#7CFC00")); +Color.LEMONCHIFFON = Object.freeze(Color.fromCssColorString("#FFFACD")); +Color.LIGHTBLUE = Object.freeze(Color.fromCssColorString("#ADD8E6")); +Color.LIGHTCORAL = Object.freeze(Color.fromCssColorString("#F08080")); +Color.LIGHTCYAN = Object.freeze(Color.fromCssColorString("#E0FFFF")); +Color.LIGHTGOLDENRODYELLOW = Object.freeze(Color.fromCssColorString("#FAFAD2")); +Color.LIGHTGRAY = Object.freeze(Color.fromCssColorString("#D3D3D3")); +Color.LIGHTGREEN = Object.freeze(Color.fromCssColorString("#90EE90")); +Color.LIGHTGREY = Color.LIGHTGRAY; +Color.LIGHTPINK = Object.freeze(Color.fromCssColorString("#FFB6C1")); +Color.LIGHTSEAGREEN = Object.freeze(Color.fromCssColorString("#20B2AA")); +Color.LIGHTSKYBLUE = Object.freeze(Color.fromCssColorString("#87CEFA")); +Color.LIGHTSLATEGRAY = Object.freeze(Color.fromCssColorString("#778899")); +Color.LIGHTSLATEGREY = Color.LIGHTSLATEGRAY; +Color.LIGHTSTEELBLUE = Object.freeze(Color.fromCssColorString("#B0C4DE")); +Color.LIGHTYELLOW = Object.freeze(Color.fromCssColorString("#FFFFE0")); +Color.LIME = Object.freeze(Color.fromCssColorString("#00FF00")); +Color.LIMEGREEN = Object.freeze(Color.fromCssColorString("#32CD32")); +Color.LINEN = Object.freeze(Color.fromCssColorString("#FAF0E6")); +Color.MAGENTA = Object.freeze(Color.fromCssColorString("#FF00FF")); +Color.MAROON = Object.freeze(Color.fromCssColorString("#800000")); +Color.MEDIUMAQUAMARINE = Object.freeze(Color.fromCssColorString("#66CDAA")); +Color.MEDIUMBLUE = Object.freeze(Color.fromCssColorString("#0000CD")); +Color.MEDIUMORCHID = Object.freeze(Color.fromCssColorString("#BA55D3")); +Color.MEDIUMPURPLE = Object.freeze(Color.fromCssColorString("#9370DB")); +Color.MEDIUMSEAGREEN = Object.freeze(Color.fromCssColorString("#3CB371")); +Color.MEDIUMSLATEBLUE = Object.freeze(Color.fromCssColorString("#7B68EE")); +Color.MEDIUMSPRINGGREEN = Object.freeze(Color.fromCssColorString("#00FA9A")); +Color.MEDIUMTURQUOISE = Object.freeze(Color.fromCssColorString("#48D1CC")); +Color.MEDIUMVIOLETRED = Object.freeze(Color.fromCssColorString("#C71585")); +Color.MIDNIGHTBLUE = Object.freeze(Color.fromCssColorString("#191970")); +Color.MINTCREAM = Object.freeze(Color.fromCssColorString("#F5FFFA")); +Color.MISTYROSE = Object.freeze(Color.fromCssColorString("#FFE4E1")); +Color.MOCCASIN = Object.freeze(Color.fromCssColorString("#FFE4B5")); +Color.NAVAJOWHITE = Object.freeze(Color.fromCssColorString("#FFDEAD")); +Color.NAVY = Object.freeze(Color.fromCssColorString("#000080")); +Color.OLDLACE = Object.freeze(Color.fromCssColorString("#FDF5E6")); +Color.OLIVE = Object.freeze(Color.fromCssColorString("#808000")); +Color.OLIVEDRAB = Object.freeze(Color.fromCssColorString("#6B8E23")); +Color.ORANGE = Object.freeze(Color.fromCssColorString("#FFA500")); +Color.ORANGERED = Object.freeze(Color.fromCssColorString("#FF4500")); +Color.ORCHID = Object.freeze(Color.fromCssColorString("#DA70D6")); +Color.PALEGOLDENROD = Object.freeze(Color.fromCssColorString("#EEE8AA")); +Color.PALEGREEN = Object.freeze(Color.fromCssColorString("#98FB98")); +Color.PALETURQUOISE = Object.freeze(Color.fromCssColorString("#AFEEEE")); +Color.PALEVIOLETRED = Object.freeze(Color.fromCssColorString("#DB7093")); +Color.PAPAYAWHIP = Object.freeze(Color.fromCssColorString("#FFEFD5")); +Color.PEACHPUFF = Object.freeze(Color.fromCssColorString("#FFDAB9")); +Color.PERU = Object.freeze(Color.fromCssColorString("#CD853F")); +Color.PINK = Object.freeze(Color.fromCssColorString("#FFC0CB")); +Color.PLUM = Object.freeze(Color.fromCssColorString("#DDA0DD")); +Color.POWDERBLUE = Object.freeze(Color.fromCssColorString("#B0E0E6")); +Color.PURPLE = Object.freeze(Color.fromCssColorString("#800080")); +Color.RED = Object.freeze(Color.fromCssColorString("#FF0000")); +Color.ROSYBROWN = Object.freeze(Color.fromCssColorString("#BC8F8F")); +Color.ROYALBLUE = Object.freeze(Color.fromCssColorString("#4169E1")); +Color.SADDLEBROWN = Object.freeze(Color.fromCssColorString("#8B4513")); +Color.SALMON = Object.freeze(Color.fromCssColorString("#FA8072")); +Color.SANDYBROWN = Object.freeze(Color.fromCssColorString("#F4A460")); +Color.SEAGREEN = Object.freeze(Color.fromCssColorString("#2E8B57")); +Color.SEASHELL = Object.freeze(Color.fromCssColorString("#FFF5EE")); +Color.SIENNA = Object.freeze(Color.fromCssColorString("#A0522D")); +Color.SILVER = Object.freeze(Color.fromCssColorString("#C0C0C0")); +Color.SKYBLUE = Object.freeze(Color.fromCssColorString("#87CEEB")); +Color.SLATEBLUE = Object.freeze(Color.fromCssColorString("#6A5ACD")); +Color.SLATEGRAY = Object.freeze(Color.fromCssColorString("#708090")); +Color.SLATEGREY = Color.SLATEGRAY; +Color.SNOW = Object.freeze(Color.fromCssColorString("#FFFAFA")); +Color.SPRINGGREEN = Object.freeze(Color.fromCssColorString("#00FF7F")); +Color.STEELBLUE = Object.freeze(Color.fromCssColorString("#4682B4")); +Color.TAN = Object.freeze(Color.fromCssColorString("#D2B48C")); +Color.TEAL = Object.freeze(Color.fromCssColorString("#008080")); +Color.THISTLE = Object.freeze(Color.fromCssColorString("#D8BFD8")); +Color.TOMATO = Object.freeze(Color.fromCssColorString("#FF6347")); +Color.TURQUOISE = Object.freeze(Color.fromCssColorString("#40E0D0")); +Color.VIOLET = Object.freeze(Color.fromCssColorString("#EE82EE")); +Color.WHEAT = Object.freeze(Color.fromCssColorString("#F5DEB3")); +Color.WHITE = Object.freeze(Color.fromCssColorString("#FFFFFF")); +Color.WHITESMOKE = Object.freeze(Color.fromCssColorString("#F5F5F5")); +Color.YELLOW = Object.freeze(Color.fromCssColorString("#FFFF00")); +Color.YELLOWGREEN = Object.freeze(Color.fromCssColorString("#9ACD32")); +Color.TRANSPARENT = Object.freeze(new Color(0, 0, 0, 0)); +function ClearCommand(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.color = e.color, this.depth = e.depth, this.stencil = e.stencil, this.renderState = e.renderState, this.framebuffer = e.framebuffer, this.owner = e.owner, this.pass = e.pass; +} +ClearCommand.ALL = Object.freeze( + new ClearCommand({ + color: new Color(0, 0, 0, 0), + depth: 1, + stencil: 0 + }) +); +ClearCommand.prototype.execute = function(e, t) { + e.clear(this, t); +}; +const Pass = { + // If you add/modify/remove Pass constants, also change the automatic GLSL constants + // that start with 'czm_pass' + // + // Commands are executed in order by pass up to the translucent pass. + // Translucent geometry needs special handling (sorting/OIT). The compute pass + // is executed first and the overlay pass is executed last. Both are not sorted + // by frustum. + ENVIRONMENT: 0, + COMPUTE: 1, + GLOBE: 2, + TERRAIN_CLASSIFICATION: 3, + CESIUM_3D_TILE: 4, + CESIUM_3D_TILE_CLASSIFICATION: 5, + CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW: 6, + OPAQUE: 7, + TRANSLUCENT: 8, + VOXELS: 9, + OVERLAY: 10, + NUMBER_OF_PASSES: 11 +}, Pass$1 = Object.freeze(Pass); +function ComputeCommand(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.vertexArray = e.vertexArray, this.fragmentShaderSource = e.fragmentShaderSource, this.shaderProgram = e.shaderProgram, this.uniformMap = e.uniformMap, this.outputTexture = e.outputTexture, this.preExecute = e.preExecute, this.postExecute = e.postExecute, this.canceled = e.canceled, this.persists = defaultValue(e.persists, !1), this.pass = Pass$1.COMPUTE, this.owner = e.owner; +} +ComputeCommand.prototype.execute = function(e) { + e.execute(this); +}; +function Cartesian2(e, t) { + this.x = defaultValue(e, 0), this.y = defaultValue(t, 0); +} +Cartesian2.fromElements = function(e, t, n) { + return defined(n) ? (n.x = e, n.y = t, n) : new Cartesian2(e, t); +}; +Cartesian2.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.x = e.x, t.y = e.y, t) : new Cartesian2(e.x, e.y); +}; +Cartesian2.fromCartesian3 = Cartesian2.clone; +Cartesian2.fromCartesian4 = Cartesian2.clone; +Cartesian2.packedLength = 2; +Cartesian2.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.x, t[n] = e.y, t; +}; +Cartesian2.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Cartesian2()), n.x = e[t++], n.y = e[t], n; +}; +Cartesian2.packArray = function(e, t) { + const n = e.length, i = n * 2; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Cartesian2.pack(e[r], t, r * 2); + return t; +}; +Cartesian2.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 2 : t = new Array(n / 2); + for (let i = 0; i < n; i += 2) { + const r = i / 2; + t[r] = Cartesian2.unpack(e, i, t[r]); + } + return t; +}; +Cartesian2.fromArray = Cartesian2.unpack; +Cartesian2.maximumComponent = function(e) { + return Math.max(e.x, e.y); +}; +Cartesian2.minimumComponent = function(e) { + return Math.min(e.x, e.y); +}; +Cartesian2.minimumByComponent = function(e, t, n) { + return n.x = Math.min(e.x, t.x), n.y = Math.min(e.y, t.y), n; +}; +Cartesian2.maximumByComponent = function(e, t, n) { + return n.x = Math.max(e.x, t.x), n.y = Math.max(e.y, t.y), n; +}; +Cartesian2.clamp = function(e, t, n, i) { + const r = CesiumMath.clamp(e.x, t.x, n.x), o = CesiumMath.clamp(e.y, t.y, n.y); + return i.x = r, i.y = o, i; +}; +Cartesian2.magnitudeSquared = function(e) { + return e.x * e.x + e.y * e.y; +}; +Cartesian2.magnitude = function(e) { + return Math.sqrt(Cartesian2.magnitudeSquared(e)); +}; +const distanceScratch$1 = new Cartesian2(); +Cartesian2.distance = function(e, t) { + return Cartesian2.subtract(e, t, distanceScratch$1), Cartesian2.magnitude(distanceScratch$1); +}; +Cartesian2.distanceSquared = function(e, t) { + return Cartesian2.subtract(e, t, distanceScratch$1), Cartesian2.magnitudeSquared(distanceScratch$1); +}; +Cartesian2.normalize = function(e, t) { + const n = Cartesian2.magnitude(e); + return t.x = e.x / n, t.y = e.y / n, t; +}; +Cartesian2.dot = function(e, t) { + return e.x * t.x + e.y * t.y; +}; +Cartesian2.cross = function(e, t) { + return e.x * t.y - e.y * t.x; +}; +Cartesian2.multiplyComponents = function(e, t, n) { + return n.x = e.x * t.x, n.y = e.y * t.y, n; +}; +Cartesian2.divideComponents = function(e, t, n) { + return n.x = e.x / t.x, n.y = e.y / t.y, n; +}; +Cartesian2.add = function(e, t, n) { + return n.x = e.x + t.x, n.y = e.y + t.y, n; +}; +Cartesian2.subtract = function(e, t, n) { + return n.x = e.x - t.x, n.y = e.y - t.y, n; +}; +Cartesian2.multiplyByScalar = function(e, t, n) { + return n.x = e.x * t, n.y = e.y * t, n; +}; +Cartesian2.divideByScalar = function(e, t, n) { + return n.x = e.x / t, n.y = e.y / t, n; +}; +Cartesian2.negate = function(e, t) { + return t.x = -e.x, t.y = -e.y, t; +}; +Cartesian2.abs = function(e, t) { + return t.x = Math.abs(e.x), t.y = Math.abs(e.y), t; +}; +const lerpScratch$1 = new Cartesian2(); +Cartesian2.lerp = function(e, t, n, i) { + return Cartesian2.multiplyByScalar(t, n, lerpScratch$1), i = Cartesian2.multiplyByScalar(e, 1 - n, i), Cartesian2.add(lerpScratch$1, i, i); +}; +const angleBetweenScratch = new Cartesian2(), angleBetweenScratch2 = new Cartesian2(); +Cartesian2.angleBetween = function(e, t) { + return Cartesian2.normalize(e, angleBetweenScratch), Cartesian2.normalize(t, angleBetweenScratch2), CesiumMath.acosClamped( + Cartesian2.dot(angleBetweenScratch, angleBetweenScratch2) + ); +}; +const mostOrthogonalAxisScratch = new Cartesian2(); +Cartesian2.mostOrthogonalAxis = function(e, t) { + const n = Cartesian2.normalize(e, mostOrthogonalAxisScratch); + return Cartesian2.abs(n, n), n.x <= n.y ? t = Cartesian2.clone(Cartesian2.UNIT_X, t) : t = Cartesian2.clone(Cartesian2.UNIT_Y, t), t; +}; +Cartesian2.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.x === t.x && e.y === t.y; +}; +Cartesian2.equalsArray = function(e, t, n) { + return e.x === t[n] && e.y === t[n + 1]; +}; +Cartesian2.equalsEpsilon = function(e, t, n, i) { + return e === t || defined(e) && defined(t) && CesiumMath.equalsEpsilon( + e.x, + t.x, + n, + i + ) && CesiumMath.equalsEpsilon( + e.y, + t.y, + n, + i + ); +}; +Cartesian2.ZERO = Object.freeze(new Cartesian2(0, 0)); +Cartesian2.ONE = Object.freeze(new Cartesian2(1, 1)); +Cartesian2.UNIT_X = Object.freeze(new Cartesian2(1, 0)); +Cartesian2.UNIT_Y = Object.freeze(new Cartesian2(0, 1)); +Cartesian2.prototype.clone = function(e) { + return Cartesian2.clone(this, e); +}; +Cartesian2.prototype.equals = function(e) { + return Cartesian2.equals(this, e); +}; +Cartesian2.prototype.equalsEpsilon = function(e, t, n) { + return Cartesian2.equalsEpsilon( + this, + e, + t, + n + ); +}; +Cartesian2.prototype.toString = function() { + return `(${this.x}, ${this.y})`; +}; +const scaleToGeodeticSurfaceIntersection = new Cartesian3(), scaleToGeodeticSurfaceGradient = new Cartesian3(); +function scaleToGeodeticSurface(e, t, n, i, r) { + const o = e.x, s = e.y, c = e.z, l = t.x, d = t.y, f = t.z, h = o * o * l * l, p = s * s * d * d, m = c * c * f * f, _ = h + p + m, y = Math.sqrt(1 / _), C = Cartesian3.multiplyByScalar( + e, + y, + scaleToGeodeticSurfaceIntersection + ); + if (_ < i) + return isFinite(y) ? Cartesian3.clone(C, r) : void 0; + const T = n.x, x = n.y, b = n.z, S = scaleToGeodeticSurfaceGradient; + S.x = C.x * T * 2, S.y = C.y * x * 2, S.z = C.z * b * 2; + let E = (1 - y) * Cartesian3.magnitude(e) / (0.5 * Cartesian3.magnitude(S)), A = 0, D, P, I, M, R, L, g, w, O, N, F; + do { + E -= A, I = 1 / (1 + E * T), M = 1 / (1 + E * x), R = 1 / (1 + E * b), L = I * I, g = M * M, w = R * R, O = L * I, N = g * M, F = w * R, D = h * L + p * g + m * w - 1, P = h * O * T + p * N * x + m * F * b; + const B = -2 * P; + A = D / B; + } while (Math.abs(D) > CesiumMath.EPSILON12); + return defined(r) ? (r.x = o * I, r.y = s * M, r.z = c * R, r) : new Cartesian3( + o * I, + s * M, + c * R + ); +} +function Cartographic(e, t, n) { + this.longitude = defaultValue(e, 0), this.latitude = defaultValue(t, 0), this.height = defaultValue(n, 0); +} +Cartographic.fromRadians = function(e, t, n, i) { + return n = defaultValue(n, 0), defined(i) ? (i.longitude = e, i.latitude = t, i.height = n, i) : new Cartographic(e, t, n); +}; +Cartographic.fromDegrees = function(e, t, n, i) { + return e = CesiumMath.toRadians(e), t = CesiumMath.toRadians(t), Cartographic.fromRadians(e, t, n, i); +}; +const cartesianToCartographicN$1 = new Cartesian3(), cartesianToCartographicP$1 = new Cartesian3(), cartesianToCartographicH$1 = new Cartesian3(); +Cartographic._ellipsoidOneOverRadii = new Cartesian3( + 1 / 6378137, + 1 / 6378137, + 1 / 6356752314245179e-9 +); +Cartographic._ellipsoidOneOverRadiiSquared = new Cartesian3( + 1 / (6378137 * 6378137), + 1 / (6378137 * 6378137), + 1 / (6356752314245179e-9 * 6356752314245179e-9) +); +Cartographic._ellipsoidCenterToleranceSquared = CesiumMath.EPSILON1; +Cartographic.fromCartesian = function(e, t, n) { + const i = defined(t) ? t.oneOverRadii : Cartographic._ellipsoidOneOverRadii, r = defined(t) ? t.oneOverRadiiSquared : Cartographic._ellipsoidOneOverRadiiSquared, o = defined(t) ? t._centerToleranceSquared : Cartographic._ellipsoidCenterToleranceSquared, s = scaleToGeodeticSurface( + e, + i, + r, + o, + cartesianToCartographicP$1 + ); + if (!defined(s)) + return; + let c = Cartesian3.multiplyComponents( + s, + r, + cartesianToCartographicN$1 + ); + c = Cartesian3.normalize(c, c); + const l = Cartesian3.subtract(e, s, cartesianToCartographicH$1), d = Math.atan2(c.y, c.x), f = Math.asin(c.z), h = CesiumMath.sign(Cartesian3.dot(l, e)) * Cartesian3.magnitude(l); + return defined(n) ? (n.longitude = d, n.latitude = f, n.height = h, n) : new Cartographic(d, f, h); +}; +Cartographic.toCartesian = function(e, t, n) { + return Cartesian3.fromRadians( + e.longitude, + e.latitude, + e.height, + t, + n + ); +}; +Cartographic.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.longitude = e.longitude, t.latitude = e.latitude, t.height = e.height, t) : new Cartographic( + e.longitude, + e.latitude, + e.height + ); +}; +Cartographic.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.longitude === t.longitude && e.latitude === t.latitude && e.height === t.height; +}; +Cartographic.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e.longitude - t.longitude) <= n && Math.abs(e.latitude - t.latitude) <= n && Math.abs(e.height - t.height) <= n; +}; +Cartographic.ZERO = Object.freeze(new Cartographic(0, 0, 0)); +Cartographic.prototype.clone = function(e) { + return Cartographic.clone(this, e); +}; +Cartographic.prototype.equals = function(e) { + return Cartographic.equals(this, e); +}; +Cartographic.prototype.equalsEpsilon = function(e, t) { + return Cartographic.equalsEpsilon(this, e, t); +}; +Cartographic.prototype.toString = function() { + return `(${this.longitude}, ${this.latitude}, ${this.height})`; +}; +function initialize$h(e, t, n, i) { + t = defaultValue(t, 0), n = defaultValue(n, 0), i = defaultValue(i, 0), e._radii = new Cartesian3(t, n, i), e._radiiSquared = new Cartesian3(t * t, n * n, i * i), e._radiiToTheFourth = new Cartesian3( + t * t * t * t, + n * n * n * n, + i * i * i * i + ), e._oneOverRadii = new Cartesian3( + t === 0 ? 0 : 1 / t, + n === 0 ? 0 : 1 / n, + i === 0 ? 0 : 1 / i + ), e._oneOverRadiiSquared = new Cartesian3( + t === 0 ? 0 : 1 / (t * t), + n === 0 ? 0 : 1 / (n * n), + i === 0 ? 0 : 1 / (i * i) + ), e._minimumRadius = Math.min(t, n, i), e._maximumRadius = Math.max(t, n, i), e._centerToleranceSquared = CesiumMath.EPSILON1, e._radiiSquared.z !== 0 && (e._squaredXOverSquaredZ = e._radiiSquared.x / e._radiiSquared.z); +} +function Ellipsoid(e, t, n) { + this._radii = void 0, this._radiiSquared = void 0, this._radiiToTheFourth = void 0, this._oneOverRadii = void 0, this._oneOverRadiiSquared = void 0, this._minimumRadius = void 0, this._maximumRadius = void 0, this._centerToleranceSquared = void 0, this._squaredXOverSquaredZ = void 0, initialize$h(this, e, t, n); +} +Object.defineProperties(Ellipsoid.prototype, { + /** + * Gets the radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radii: { + get: function() { + return this._radii; + } + }, + /** + * Gets the squared radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radiiSquared: { + get: function() { + return this._radiiSquared; + } + }, + /** + * Gets the radii of the ellipsoid raise to the fourth power. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radiiToTheFourth: { + get: function() { + return this._radiiToTheFourth; + } + }, + /** + * Gets one over the radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + oneOverRadii: { + get: function() { + return this._oneOverRadii; + } + }, + /** + * Gets one over the squared radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + oneOverRadiiSquared: { + get: function() { + return this._oneOverRadiiSquared; + } + }, + /** + * Gets the minimum radius of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {number} + * @readonly + */ + minimumRadius: { + get: function() { + return this._minimumRadius; + } + }, + /** + * Gets the maximum radius of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {number} + * @readonly + */ + maximumRadius: { + get: function() { + return this._maximumRadius; + } + } +}); +Ellipsoid.clone = function(e, t) { + if (!defined(e)) + return; + const n = e._radii; + return defined(t) ? (Cartesian3.clone(n, t._radii), Cartesian3.clone(e._radiiSquared, t._radiiSquared), Cartesian3.clone(e._radiiToTheFourth, t._radiiToTheFourth), Cartesian3.clone(e._oneOverRadii, t._oneOverRadii), Cartesian3.clone(e._oneOverRadiiSquared, t._oneOverRadiiSquared), t._minimumRadius = e._minimumRadius, t._maximumRadius = e._maximumRadius, t._centerToleranceSquared = e._centerToleranceSquared, t) : new Ellipsoid(n.x, n.y, n.z); +}; +Ellipsoid.fromCartesian3 = function(e, t) { + return defined(t) || (t = new Ellipsoid()), defined(e) && initialize$h(t, e.x, e.y, e.z), t; +}; +Ellipsoid.WGS84 = Object.freeze( + new Ellipsoid(6378137, 6378137, 6356752314245179e-9) +); +Ellipsoid.UNIT_SPHERE = Object.freeze(new Ellipsoid(1, 1, 1)); +Ellipsoid.MOON = Object.freeze( + new Ellipsoid( + CesiumMath.LUNAR_RADIUS, + CesiumMath.LUNAR_RADIUS, + CesiumMath.LUNAR_RADIUS + ) +); +Ellipsoid._default = Ellipsoid.WGS84; +Object.defineProperties(Ellipsoid, { + /** + * The default ellipsoid used when not otherwise specified. + * @memberof Ellipsoid + * @type {Ellipsoid} + * @example + * Cesium.Ellipsoid.default = Cesium.Ellipsoid.MOON; + * + * // Apollo 11 landing site + * const position = Cesium.Cartesian3.fromRadians( + * 0.67416, + * 23.47315, + * ); + */ + default: { + get: function() { + return Ellipsoid._default; + }, + set: function(e) { + Ellipsoid._default = e, Cartesian3._ellipsoidRadiiSquared = e.radiiSquared, Cartographic._ellipsoidOneOverRadii = e.oneOverRadii, Cartographic._ellipsoidOneOverRadiiSquared = e.oneOverRadiiSquared, Cartographic._ellipsoidCenterToleranceSquared = e._centerToleranceSquared; + } + } +}); +Ellipsoid.prototype.clone = function(e) { + return Ellipsoid.clone(this, e); +}; +Ellipsoid.packedLength = Cartesian3.packedLength; +Ellipsoid.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._radii, t, n), t; +}; +Ellipsoid.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t); + return Ellipsoid.fromCartesian3(i, n); +}; +Ellipsoid.prototype.geocentricSurfaceNormal = Cartesian3.normalize; +Ellipsoid.prototype.geodeticSurfaceNormalCartographic = function(e, t) { + const n = e.longitude, i = e.latitude, r = Math.cos(i), o = r * Math.cos(n), s = r * Math.sin(n), c = Math.sin(i); + return defined(t) || (t = new Cartesian3()), t.x = o, t.y = s, t.z = c, Cartesian3.normalize(t, t); +}; +Ellipsoid.prototype.geodeticSurfaceNormal = function(e, t) { + if (!Cartesian3.equalsEpsilon(e, Cartesian3.ZERO, CesiumMath.EPSILON14)) + return defined(t) || (t = new Cartesian3()), t = Cartesian3.multiplyComponents( + e, + this._oneOverRadiiSquared, + t + ), Cartesian3.normalize(t, t); +}; +const cartographicToCartesianNormal = new Cartesian3(), cartographicToCartesianK = new Cartesian3(); +Ellipsoid.prototype.cartographicToCartesian = function(e, t) { + const n = cartographicToCartesianNormal, i = cartographicToCartesianK; + this.geodeticSurfaceNormalCartographic(e, n), Cartesian3.multiplyComponents(this._radiiSquared, n, i); + const r = Math.sqrt(Cartesian3.dot(n, i)); + return Cartesian3.divideByScalar(i, r, i), Cartesian3.multiplyByScalar(n, e.height, n), defined(t) || (t = new Cartesian3()), Cartesian3.add(i, n, t); +}; +Ellipsoid.prototype.cartographicArrayToCartesianArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n : t = new Array(n); + for (let i = 0; i < n; i++) + t[i] = this.cartographicToCartesian(e[i], t[i]); + return t; +}; +const cartesianToCartographicN = new Cartesian3(), cartesianToCartographicP = new Cartesian3(), cartesianToCartographicH = new Cartesian3(); +Ellipsoid.prototype.cartesianToCartographic = function(e, t) { + const n = this.scaleToGeodeticSurface(e, cartesianToCartographicP); + if (!defined(n)) + return; + const i = this.geodeticSurfaceNormal(n, cartesianToCartographicN), r = Cartesian3.subtract(e, n, cartesianToCartographicH), o = Math.atan2(i.y, i.x), s = Math.asin(i.z), c = CesiumMath.sign(Cartesian3.dot(r, e)) * Cartesian3.magnitude(r); + return defined(t) ? (t.longitude = o, t.latitude = s, t.height = c, t) : new Cartographic(o, s, c); +}; +Ellipsoid.prototype.cartesianArrayToCartographicArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n : t = new Array(n); + for (let i = 0; i < n; ++i) + t[i] = this.cartesianToCartographic(e[i], t[i]); + return t; +}; +Ellipsoid.prototype.scaleToGeodeticSurface = function(e, t) { + return scaleToGeodeticSurface( + e, + this._oneOverRadii, + this._oneOverRadiiSquared, + this._centerToleranceSquared, + t + ); +}; +Ellipsoid.prototype.scaleToGeocentricSurface = function(e, t) { + defined(t) || (t = new Cartesian3()); + const n = e.x, i = e.y, r = e.z, o = this._oneOverRadiiSquared, s = 1 / Math.sqrt( + n * n * o.x + i * i * o.y + r * r * o.z + ); + return Cartesian3.multiplyByScalar(e, s, t); +}; +Ellipsoid.prototype.transformPositionToScaledSpace = function(e, t) { + return defined(t) || (t = new Cartesian3()), Cartesian3.multiplyComponents(e, this._oneOverRadii, t); +}; +Ellipsoid.prototype.transformPositionFromScaledSpace = function(e, t) { + return defined(t) || (t = new Cartesian3()), Cartesian3.multiplyComponents(e, this._radii, t); +}; +Ellipsoid.prototype.equals = function(e) { + return this === e || defined(e) && Cartesian3.equals(this._radii, e._radii); +}; +Ellipsoid.prototype.toString = function() { + return this._radii.toString(); +}; +Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(e, t, n) { + t = defaultValue(t, 0); + const i = this._squaredXOverSquaredZ; + if (defined(n) || (n = new Cartesian3()), n.x = 0, n.y = 0, n.z = e.z * (1 - i), !(Math.abs(n.z) >= this._radii.z - t)) + return n; +}; +const scratchEndpoint = new Cartesian3(); +Ellipsoid.prototype.getLocalCurvature = function(e, t) { + defined(t) || (t = new Cartesian2()); + const n = this.getSurfaceNormalIntersectionWithZAxis( + e, + 0, + scratchEndpoint + ), i = Cartesian3.distance( + e, + n + ), r = this.minimumRadius * i / this.maximumRadius ** 2, o = i * r ** 2; + return Cartesian2.fromElements( + 1 / i, + 1 / o, + t + ); +}; +const abscissas = [ + 0.14887433898163, + 0.43339539412925, + 0.67940956829902, + 0.86506336668898, + 0.97390652851717, + 0 +], weights = [ + 0.29552422471475, + 0.26926671930999, + 0.21908636251598, + 0.14945134915058, + 0.066671344308684, + 0 +]; +function gaussLegendreQuadrature(e, t, n) { + const i = 0.5 * (t + e), r = 0.5 * (t - e); + let o = 0; + for (let s = 0; s < 5; s++) { + const c = r * abscissas[s]; + o += weights[s] * (n(i + c) + n(i - c)); + } + return o *= r, o; +} +Ellipsoid.prototype.surfaceArea = function(e) { + const t = e.west; + let n = e.east; + const i = e.south, r = e.north; + for (; n < t; ) + n += CesiumMath.TWO_PI; + const o = this._radiiSquared, s = o.x, c = o.y, l = o.z, d = s * c; + return gaussLegendreQuadrature(i, r, function(f) { + const h = Math.cos(f), p = Math.sin(f); + return Math.cos(f) * gaussLegendreQuadrature(t, n, function(m) { + const _ = Math.cos(m), y = Math.sin(m); + return Math.sqrt( + d * p * p + l * (c * _ * _ + s * y * y) * h * h + ); + }); + }); +}; +function GeographicProjection(e) { + this._ellipsoid = defaultValue(e, Ellipsoid.default), this._semimajorAxis = this._ellipsoid.maximumRadius, this._oneOverSemimajorAxis = 1 / this._semimajorAxis; +} +Object.defineProperties(GeographicProjection.prototype, { + /** + * Gets the {@link Ellipsoid}. + * + * @memberof GeographicProjection.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +GeographicProjection.prototype.project = function(e, t) { + const n = this._semimajorAxis, i = e.longitude * n, r = e.latitude * n, o = e.height; + return defined(t) ? (t.x = i, t.y = r, t.z = o, t) : new Cartesian3(i, r, o); +}; +GeographicProjection.prototype.unproject = function(e, t) { + const n = this._oneOverSemimajorAxis, i = e.x * n, r = e.y * n, o = e.z; + return defined(t) ? (t.longitude = i, t.latitude = r, t.height = o, t) : new Cartographic(i, r, o); +}; +const Intersect = { + /** + * Represents that an object is not contained within the frustum. + * + * @type {number} + * @constant + */ + OUTSIDE: -1, + /** + * Represents that an object intersects one of the frustum's planes. + * + * @type {number} + * @constant + */ + INTERSECTING: 0, + /** + * Represents that an object is fully within the frustum. + * + * @type {number} + * @constant + */ + INSIDE: 1 +}, Intersect$1 = Object.freeze(Intersect); +function binarySearch(e, t, n) { + let i = 0, r = e.length - 1, o, s; + for (; i <= r; ) { + if (o = ~~((i + r) / 2), s = n(e[o], t), s < 0) { + i = o + 1; + continue; + } + if (s > 0) { + r = o - 1; + continue; + } + return o; + } + return ~(r + 1); +} +function EarthOrientationParametersSample(e, t, n, i, r) { + this.xPoleWander = e, this.yPoleWander = t, this.xPoleOffset = n, this.yPoleOffset = i, this.ut1MinusUtc = r; +} +function isLeapYear(e) { + return e % 4 === 0 && e % 100 !== 0 || e % 400 === 0; +} +function GregorianDate(e, t, n, i, r, o, s, c) { + e = defaultValue(e, 1), t = defaultValue(t, 1), n = defaultValue(n, 1), i = defaultValue(i, 0), r = defaultValue(r, 0), o = defaultValue(o, 0), s = defaultValue(s, 0), c = defaultValue(c, !1), this.year = e, this.month = t, this.day = n, this.hour = i, this.minute = r, this.second = o, this.millisecond = s, this.isLeapSecond = c; +} +function LeapSecond(e, t) { + this.julianDate = e, this.offset = t; +} +const TimeConstants = { + /** + * The number of seconds in one millisecond: 0.001 + * @type {number} + * @constant + */ + SECONDS_PER_MILLISECOND: 1e-3, + /** + * The number of seconds in one minute: 60. + * @type {number} + * @constant + */ + SECONDS_PER_MINUTE: 60, + /** + * The number of minutes in one hour: 60. + * @type {number} + * @constant + */ + MINUTES_PER_HOUR: 60, + /** + * The number of hours in one day: 24. + * @type {number} + * @constant + */ + HOURS_PER_DAY: 24, + /** + * The number of seconds in one hour: 3600. + * @type {number} + * @constant + */ + SECONDS_PER_HOUR: 3600, + /** + * The number of minutes in one day: 1440. + * @type {number} + * @constant + */ + MINUTES_PER_DAY: 1440, + /** + * The number of seconds in one day, ignoring leap seconds: 86400. + * @type {number} + * @constant + */ + SECONDS_PER_DAY: 86400, + /** + * The number of days in one Julian century: 36525. + * @type {number} + * @constant + */ + DAYS_PER_JULIAN_CENTURY: 36525, + /** + * One trillionth of a second. + * @type {number} + * @constant + */ + PICOSECOND: 1e-9, + /** + * The number of days to subtract from a Julian date to determine the + * modified Julian date, which gives the number of days since midnight + * on November 17, 1858. + * @type {number} + * @constant + */ + MODIFIED_JULIAN_DATE_DIFFERENCE: 24000005e-1 +}, TimeConstants$1 = Object.freeze(TimeConstants), TimeStandard = { + /** + * Represents the coordinated Universal Time (UTC) time standard. + * + * UTC is related to TAI according to the relationship + * UTC = TAI - deltaT where deltaT is the number of leap + * seconds which have been introduced as of the time in TAI. + * + * @type {number} + * @constant + */ + UTC: 0, + /** + * Represents the International Atomic Time (TAI) time standard. + * TAI is the principal time standard to which the other time standards are related. + * + * @type {number} + * @constant + */ + TAI: 1 +}, TimeStandard$1 = Object.freeze(TimeStandard), gregorianDateScratch = new GregorianDate(), daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], daysInLeapFeburary = 29; +function compareLeapSecondDates$1(e, t) { + return JulianDate.compare(e.julianDate, t.julianDate); +} +const binarySearchScratchLeapSecond = new LeapSecond(); +function convertUtcToTai(e) { + binarySearchScratchLeapSecond.julianDate = e; + const t = JulianDate.leapSeconds; + let n = binarySearch( + t, + binarySearchScratchLeapSecond, + compareLeapSecondDates$1 + ); + n < 0 && (n = ~n), n >= t.length && (n = t.length - 1); + let i = t[n].offset; + n > 0 && JulianDate.secondsDifference( + t[n].julianDate, + e + ) > i && (n--, i = t[n].offset), JulianDate.addSeconds(e, i, e); +} +function convertTaiToUtc(e, t) { + binarySearchScratchLeapSecond.julianDate = e; + const n = JulianDate.leapSeconds; + let i = binarySearch( + n, + binarySearchScratchLeapSecond, + compareLeapSecondDates$1 + ); + if (i < 0 && (i = ~i), i === 0) + return JulianDate.addSeconds(e, -n[0].offset, t); + if (i >= n.length) + return JulianDate.addSeconds( + e, + -n[i - 1].offset, + t + ); + const r = JulianDate.secondsDifference( + n[i].julianDate, + e + ); + if (r === 0) + return JulianDate.addSeconds( + e, + -n[i].offset, + t + ); + if (!(r <= 1)) + return JulianDate.addSeconds( + e, + -n[--i].offset, + t + ); +} +function setComponents(e, t, n) { + const i = t / TimeConstants$1.SECONDS_PER_DAY | 0; + return e += i, t -= TimeConstants$1.SECONDS_PER_DAY * i, t < 0 && (e--, t += TimeConstants$1.SECONDS_PER_DAY), n.dayNumber = e, n.secondsOfDay = t, n; +} +function computeJulianDateComponents(e, t, n, i, r, o, s) { + const c = (t - 14) / 12 | 0, l = e + 4800 + c; + let d = (1461 * l / 4 | 0) + (367 * (t - 2 - 12 * c) / 12 | 0) - (3 * ((l + 100) / 100 | 0) / 4 | 0) + n - 32075; + i = i - 12, i < 0 && (i += 24); + const f = o + (i * TimeConstants$1.SECONDS_PER_HOUR + r * TimeConstants$1.SECONDS_PER_MINUTE + s * TimeConstants$1.SECONDS_PER_MILLISECOND); + return f >= 43200 && (d -= 1), [d, f]; +} +const matchCalendarYear = /^(\d{4})$/, matchCalendarMonth = /^(\d{4})-(\d{2})$/, matchOrdinalDate = /^(\d{4})-?(\d{3})$/, matchWeekDate = /^(\d{4})-?W(\d{2})-?(\d{1})?$/, matchCalendarDate = /^(\d{4})-?(\d{2})-?(\d{2})$/, utcOffset = /([Z+\-])?(\d{2})?:?(\d{2})?$/, matchHours = /^(\d{2})(\.\d+)?/.source + utcOffset.source, matchHoursMinutes = /^(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source, matchHoursMinutesSeconds = /^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source; +function JulianDate(e, t, n) { + this.dayNumber = void 0, this.secondsOfDay = void 0, e = defaultValue(e, 0), t = defaultValue(t, 0), n = defaultValue(n, TimeStandard$1.UTC); + const i = e | 0; + t = t + (e - i) * TimeConstants$1.SECONDS_PER_DAY, setComponents(i, t, this), n === TimeStandard$1.UTC && convertUtcToTai(this); +} +JulianDate.fromGregorianDate = function(e, t) { + const n = computeJulianDateComponents( + e.year, + e.month, + e.day, + e.hour, + e.minute, + e.second, + e.millisecond + ); + return defined(t) ? (setComponents(n[0], n[1], t), convertUtcToTai(t), t) : new JulianDate(n[0], n[1], TimeStandard$1.UTC); +}; +JulianDate.fromDate = function(e, t) { + const n = computeJulianDateComponents( + e.getUTCFullYear(), + e.getUTCMonth() + 1, + e.getUTCDate(), + e.getUTCHours(), + e.getUTCMinutes(), + e.getUTCSeconds(), + e.getUTCMilliseconds() + ); + return defined(t) ? (setComponents(n[0], n[1], t), convertUtcToTai(t), t) : new JulianDate(n[0], n[1], TimeStandard$1.UTC); +}; +JulianDate.fromIso8601 = function(e, t) { + e = e.replace(",", "."); + let n = e.split("T"), i, r = 1, o = 1, s = 0, c = 0, l = 0, d = 0; + const f = n[0], h = n[1]; + let p, m; + if (n = f.match(matchCalendarDate), n !== null) + i = +n[1], r = +n[2], o = +n[3]; + else if (n = f.match(matchCalendarMonth), n !== null) + i = +n[1], r = +n[2]; + else if (n = f.match(matchCalendarYear), n !== null) + i = +n[1]; + else { + let T; + if (n = f.match(matchOrdinalDate), n !== null) + i = +n[1], T = +n[2], m = isLeapYear(i); + else if (n = f.match(matchWeekDate), n !== null) { + i = +n[1]; + const x = +n[2], b = +n[3] || 0, S = new Date(Date.UTC(i, 0, 4)); + T = x * 7 + b - S.getUTCDay() - 3; + } + p = new Date(Date.UTC(i, 0, 1)), p.setUTCDate(T), r = p.getUTCMonth() + 1, o = p.getUTCDate(); + } + m = isLeapYear(i); + let _; + if (defined(h)) { + n = h.match(matchHoursMinutesSeconds), n !== null ? (s = +n[1], c = +n[2], l = +n[3], d = +(n[4] || 0) * 1e3, _ = 5) : (n = h.match(matchHoursMinutes), n !== null ? (s = +n[1], c = +n[2], l = +(n[3] || 0) * 60, _ = 4) : (n = h.match(matchHours), n !== null && (s = +n[1], c = +(n[2] || 0) * 60, _ = 3))); + const T = n[_], x = +n[_ + 1], b = +(n[_ + 2] || 0); + switch (T) { + case "+": + s = s - x, c = c - b; + break; + case "-": + s = s + x, c = c + b; + break; + case "Z": + break; + default: + c = c + new Date( + Date.UTC(i, r - 1, o, s, c) + ).getTimezoneOffset(); + break; + } + } + const y = l === 60; + for (y && l--; c >= 60; ) + c -= 60, s++; + for (; s >= 24; ) + s -= 24, o++; + for (p = m && r === 2 ? daysInLeapFeburary : daysInMonth[r - 1]; o > p; ) + o -= p, r++, r > 12 && (r -= 12, i++), p = m && r === 2 ? daysInLeapFeburary : daysInMonth[r - 1]; + for (; c < 0; ) + c += 60, s--; + for (; s < 0; ) + s += 24, o--; + for (; o < 1; ) + r--, r < 1 && (r += 12, i--), p = m && r === 2 ? daysInLeapFeburary : daysInMonth[r - 1], o += p; + const C = computeJulianDateComponents( + i, + r, + o, + s, + c, + l, + d + ); + return defined(t) ? (setComponents(C[0], C[1], t), convertUtcToTai(t)) : t = new JulianDate(C[0], C[1], TimeStandard$1.UTC), y && JulianDate.addSeconds(t, 1, t), t; +}; +JulianDate.now = function(e) { + return JulianDate.fromDate(/* @__PURE__ */ new Date(), e); +}; +const toGregorianDateScratch = new JulianDate(0, 0, TimeStandard$1.TAI); +JulianDate.toGregorianDate = function(e, t) { + let n = !1, i = convertTaiToUtc(e, toGregorianDateScratch); + defined(i) || (JulianDate.addSeconds(e, -1, toGregorianDateScratch), i = convertTaiToUtc(toGregorianDateScratch, toGregorianDateScratch), n = !0); + let r = i.dayNumber; + const o = i.secondsOfDay; + o >= 43200 && (r += 1); + let s = r + 68569 | 0; + const c = 4 * s / 146097 | 0; + s = s - ((146097 * c + 3) / 4 | 0) | 0; + const l = 4e3 * (s + 1) / 1461001 | 0; + s = s - (1461 * l / 4 | 0) + 31 | 0; + const d = 80 * s / 2447 | 0, f = s - (2447 * d / 80 | 0) | 0; + s = d / 11 | 0; + const h = d + 2 - 12 * s | 0, p = 100 * (c - 49) + l + s | 0; + let m = o / TimeConstants$1.SECONDS_PER_HOUR | 0, _ = o - m * TimeConstants$1.SECONDS_PER_HOUR; + const y = _ / TimeConstants$1.SECONDS_PER_MINUTE | 0; + _ = _ - y * TimeConstants$1.SECONDS_PER_MINUTE; + let C = _ | 0; + const T = (_ - C) / TimeConstants$1.SECONDS_PER_MILLISECOND; + return m += 12, m > 23 && (m -= 24), n && (C += 1), defined(t) ? (t.year = p, t.month = h, t.day = f, t.hour = m, t.minute = y, t.second = C, t.millisecond = T, t.isLeapSecond = n, t) : new GregorianDate( + p, + h, + f, + m, + y, + C, + T, + n + ); +}; +JulianDate.toDate = function(e) { + const t = JulianDate.toGregorianDate(e, gregorianDateScratch); + let n = t.second; + return t.isLeapSecond && (n -= 1), new Date( + Date.UTC( + t.year, + t.month - 1, + t.day, + t.hour, + t.minute, + n, + t.millisecond + ) + ); +}; +JulianDate.toIso8601 = function(e, t) { + const n = JulianDate.toGregorianDate(e, gregorianDateScratch); + let i = n.year, r = n.month, o = n.day, s = n.hour; + const c = n.minute, l = n.second, d = n.millisecond; + i === 1e4 && r === 1 && o === 1 && s === 0 && c === 0 && l === 0 && d === 0 && (i = 9999, r = 12, o = 31, s = 24); + let f; + return !defined(t) && d !== 0 ? (f = (d * 0.01).toString().replace(".", ""), `${i.toString().padStart(4, "0")}-${r.toString().padStart(2, "0")}-${o.toString().padStart(2, "0")}T${s.toString().padStart(2, "0")}:${c.toString().padStart(2, "0")}:${l.toString().padStart(2, "0")}.${f}Z`) : !defined(t) || t === 0 ? `${i.toString().padStart(4, "0")}-${r.toString().padStart(2, "0")}-${o.toString().padStart(2, "0")}T${s.toString().padStart(2, "0")}:${c.toString().padStart(2, "0")}:${l.toString().padStart(2, "0")}Z` : (f = (d * 0.01).toFixed(t).replace(".", "").slice(0, t), `${i.toString().padStart(4, "0")}-${r.toString().padStart(2, "0")}-${o.toString().padStart(2, "0")}T${s.toString().padStart(2, "0")}:${c.toString().padStart(2, "0")}:${l.toString().padStart(2, "0")}.${f}Z`); +}; +JulianDate.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.dayNumber = e.dayNumber, t.secondsOfDay = e.secondsOfDay, t) : new JulianDate( + e.dayNumber, + e.secondsOfDay, + TimeStandard$1.TAI + ); +}; +JulianDate.compare = function(e, t) { + const n = e.dayNumber - t.dayNumber; + return n !== 0 ? n : e.secondsOfDay - t.secondsOfDay; +}; +JulianDate.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.dayNumber === t.dayNumber && e.secondsOfDay === t.secondsOfDay; +}; +JulianDate.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(JulianDate.secondsDifference(e, t)) <= n; +}; +JulianDate.totalDays = function(e) { + return e.dayNumber + e.secondsOfDay / TimeConstants$1.SECONDS_PER_DAY; +}; +JulianDate.secondsDifference = function(e, t) { + return (e.dayNumber - t.dayNumber) * TimeConstants$1.SECONDS_PER_DAY + (e.secondsOfDay - t.secondsOfDay); +}; +JulianDate.daysDifference = function(e, t) { + const n = e.dayNumber - t.dayNumber, i = (e.secondsOfDay - t.secondsOfDay) / TimeConstants$1.SECONDS_PER_DAY; + return n + i; +}; +JulianDate.computeTaiMinusUtc = function(e) { + binarySearchScratchLeapSecond.julianDate = e; + const t = JulianDate.leapSeconds; + let n = binarySearch( + t, + binarySearchScratchLeapSecond, + compareLeapSecondDates$1 + ); + return n < 0 && (n = ~n, --n, n < 0 && (n = 0)), t[n].offset; +}; +JulianDate.addSeconds = function(e, t, n) { + return setComponents( + e.dayNumber, + e.secondsOfDay + t, + n + ); +}; +JulianDate.addMinutes = function(e, t, n) { + const i = e.secondsOfDay + t * TimeConstants$1.SECONDS_PER_MINUTE; + return setComponents(e.dayNumber, i, n); +}; +JulianDate.addHours = function(e, t, n) { + const i = e.secondsOfDay + t * TimeConstants$1.SECONDS_PER_HOUR; + return setComponents(e.dayNumber, i, n); +}; +JulianDate.addDays = function(e, t, n) { + const i = e.dayNumber + t; + return setComponents(i, e.secondsOfDay, n); +}; +JulianDate.lessThan = function(e, t) { + return JulianDate.compare(e, t) < 0; +}; +JulianDate.lessThanOrEquals = function(e, t) { + return JulianDate.compare(e, t) <= 0; +}; +JulianDate.greaterThan = function(e, t) { + return JulianDate.compare(e, t) > 0; +}; +JulianDate.greaterThanOrEquals = function(e, t) { + return JulianDate.compare(e, t) >= 0; +}; +JulianDate.prototype.clone = function(e) { + return JulianDate.clone(this, e); +}; +JulianDate.prototype.equals = function(e) { + return JulianDate.equals(this, e); +}; +JulianDate.prototype.equalsEpsilon = function(e, t) { + return JulianDate.equalsEpsilon(this, e, t); +}; +JulianDate.prototype.toString = function() { + return JulianDate.toIso8601(this); +}; +JulianDate.leapSeconds = [ + new LeapSecond(new JulianDate(2441317, 43210, TimeStandard$1.TAI), 10), + // January 1, 1972 00:00:00 UTC + new LeapSecond(new JulianDate(2441499, 43211, TimeStandard$1.TAI), 11), + // July 1, 1972 00:00:00 UTC + new LeapSecond(new JulianDate(2441683, 43212, TimeStandard$1.TAI), 12), + // January 1, 1973 00:00:00 UTC + new LeapSecond(new JulianDate(2442048, 43213, TimeStandard$1.TAI), 13), + // January 1, 1974 00:00:00 UTC + new LeapSecond(new JulianDate(2442413, 43214, TimeStandard$1.TAI), 14), + // January 1, 1975 00:00:00 UTC + new LeapSecond(new JulianDate(2442778, 43215, TimeStandard$1.TAI), 15), + // January 1, 1976 00:00:00 UTC + new LeapSecond(new JulianDate(2443144, 43216, TimeStandard$1.TAI), 16), + // January 1, 1977 00:00:00 UTC + new LeapSecond(new JulianDate(2443509, 43217, TimeStandard$1.TAI), 17), + // January 1, 1978 00:00:00 UTC + new LeapSecond(new JulianDate(2443874, 43218, TimeStandard$1.TAI), 18), + // January 1, 1979 00:00:00 UTC + new LeapSecond(new JulianDate(2444239, 43219, TimeStandard$1.TAI), 19), + // January 1, 1980 00:00:00 UTC + new LeapSecond(new JulianDate(2444786, 43220, TimeStandard$1.TAI), 20), + // July 1, 1981 00:00:00 UTC + new LeapSecond(new JulianDate(2445151, 43221, TimeStandard$1.TAI), 21), + // July 1, 1982 00:00:00 UTC + new LeapSecond(new JulianDate(2445516, 43222, TimeStandard$1.TAI), 22), + // July 1, 1983 00:00:00 UTC + new LeapSecond(new JulianDate(2446247, 43223, TimeStandard$1.TAI), 23), + // July 1, 1985 00:00:00 UTC + new LeapSecond(new JulianDate(2447161, 43224, TimeStandard$1.TAI), 24), + // January 1, 1988 00:00:00 UTC + new LeapSecond(new JulianDate(2447892, 43225, TimeStandard$1.TAI), 25), + // January 1, 1990 00:00:00 UTC + new LeapSecond(new JulianDate(2448257, 43226, TimeStandard$1.TAI), 26), + // January 1, 1991 00:00:00 UTC + new LeapSecond(new JulianDate(2448804, 43227, TimeStandard$1.TAI), 27), + // July 1, 1992 00:00:00 UTC + new LeapSecond(new JulianDate(2449169, 43228, TimeStandard$1.TAI), 28), + // July 1, 1993 00:00:00 UTC + new LeapSecond(new JulianDate(2449534, 43229, TimeStandard$1.TAI), 29), + // July 1, 1994 00:00:00 UTC + new LeapSecond(new JulianDate(2450083, 43230, TimeStandard$1.TAI), 30), + // January 1, 1996 00:00:00 UTC + new LeapSecond(new JulianDate(2450630, 43231, TimeStandard$1.TAI), 31), + // July 1, 1997 00:00:00 UTC + new LeapSecond(new JulianDate(2451179, 43232, TimeStandard$1.TAI), 32), + // January 1, 1999 00:00:00 UTC + new LeapSecond(new JulianDate(2453736, 43233, TimeStandard$1.TAI), 33), + // January 1, 2006 00:00:00 UTC + new LeapSecond(new JulianDate(2454832, 43234, TimeStandard$1.TAI), 34), + // January 1, 2009 00:00:00 UTC + new LeapSecond(new JulianDate(2456109, 43235, TimeStandard$1.TAI), 35), + // July 1, 2012 00:00:00 UTC + new LeapSecond(new JulianDate(2457204, 43236, TimeStandard$1.TAI), 36), + // July 1, 2015 00:00:00 UTC + new LeapSecond(new JulianDate(2457754, 43237, TimeStandard$1.TAI), 37) + // January 1, 2017 00:00:00 UTC +]; +var URI = { exports: {} }, punycode = { exports: {} }; +/*! https://mths.be/punycode v1.4.0 by @mathias */ +punycode.exports; +var hasRequiredPunycode; +function requirePunycode() { + return hasRequiredPunycode || (hasRequiredPunycode = 1, function(e, t) { + (function(n) { + var i = t && !t.nodeType && t, r = e && !e.nodeType && e, o = typeof commonjsGlobal == "object" && commonjsGlobal; + (o.global === o || o.window === o || o.self === o) && (n = o); + var s, c = 2147483647, l = 36, d = 1, f = 26, h = 38, p = 700, m = 72, _ = 128, y = "-", C = /^xn--/, T = /[^\x20-\x7E]/, x = /[\x2E\u3002\uFF0E\uFF61]/g, b = { + overflow: "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, S = l - d, E = Math.floor, A = String.fromCharCode, D; + function P(U) { + throw new RangeError(b[U]); + } + function I(U, k) { + for (var $ = U.length, G = []; $--; ) + G[$] = k(U[$]); + return G; + } + function M(U, k) { + var $ = U.split("@"), G = ""; + $.length > 1 && (G = $[0] + "@", U = $[1]), U = U.replace(x, "."); + var q = U.split("."), z = I(q, k).join("."); + return G + z; + } + function R(U) { + for (var k = [], $ = 0, G = U.length, q, z; $ < G; ) + q = U.charCodeAt($++), q >= 55296 && q <= 56319 && $ < G ? (z = U.charCodeAt($++), (z & 64512) == 56320 ? k.push(((q & 1023) << 10) + (z & 1023) + 65536) : (k.push(q), $--)) : k.push(q); + return k; + } + function L(U) { + return I(U, function(k) { + var $ = ""; + return k > 65535 && (k -= 65536, $ += A(k >>> 10 & 1023 | 55296), k = 56320 | k & 1023), $ += A(k), $; + }).join(""); + } + function g(U) { + return U - 48 < 10 ? U - 22 : U - 65 < 26 ? U - 65 : U - 97 < 26 ? U - 97 : l; + } + function w(U, k) { + return U + 22 + 75 * (U < 26) - ((k != 0) << 5); + } + function O(U, k, $) { + var G = 0; + for (U = $ ? E(U / p) : U >> 1, U += E(U / k); U > S * f >> 1; G += l) + U = E(U / S); + return E(G + (S + 1) * U / (U + h)); + } + function N(U) { + var k = [], $ = U.length, G, q = 0, z = _, H = m, Q, ne, K, Z, ee, oe, X, fe, de; + for (Q = U.lastIndexOf(y), Q < 0 && (Q = 0), ne = 0; ne < Q; ++ne) + U.charCodeAt(ne) >= 128 && P("not-basic"), k.push(U.charCodeAt(ne)); + for (K = Q > 0 ? Q + 1 : 0; K < $; ) { + for (Z = q, ee = 1, oe = l; K >= $ && P("invalid-input"), X = g(U.charCodeAt(K++)), (X >= l || X > E((c - q) / ee)) && P("overflow"), q += X * ee, fe = oe <= H ? d : oe >= H + f ? f : oe - H, !(X < fe); oe += l) + de = l - fe, ee > E(c / de) && P("overflow"), ee *= de; + G = k.length + 1, H = O(q - Z, G, Z == 0), E(q / G) > c - z && P("overflow"), z += E(q / G), q %= G, k.splice(q++, 0, z); + } + return L(k); + } + function F(U) { + var k, $, G, q, z, H, Q, ne, K, Z, ee, oe = [], X, fe, de, ce; + for (U = R(U), X = U.length, k = _, $ = 0, z = m, H = 0; H < X; ++H) + ee = U[H], ee < 128 && oe.push(A(ee)); + for (G = q = oe.length, q && oe.push(y); G < X; ) { + for (Q = c, H = 0; H < X; ++H) + ee = U[H], ee >= k && ee < Q && (Q = ee); + for (fe = G + 1, Q - k > E((c - $) / fe) && P("overflow"), $ += (Q - k) * fe, k = Q, H = 0; H < X; ++H) + if (ee = U[H], ee < k && ++$ > c && P("overflow"), ee == k) { + for (ne = $, K = l; Z = K <= z ? d : K >= z + f ? f : K - z, !(ne < Z); K += l) + ce = ne - Z, de = l - Z, oe.push( + A(w(Z + ce % de, 0)) + ), ne = E(ce / de); + oe.push(A(w(ne, 0))), z = O($, fe, G == q), $ = 0, ++G; + } + ++$, ++k; + } + return oe.join(""); + } + function B(U) { + return M(U, function(k) { + return C.test(k) ? N(k.slice(4).toLowerCase()) : k; + }); + } + function V(U) { + return M(U, function(k) { + return T.test(k) ? "xn--" + F(k) : k; + }); + } + if (s = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + version: "1.3.2", + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + ucs2: { + decode: R, + encode: L + }, + decode: N, + encode: F, + toASCII: V, + toUnicode: B + }, i && r) + if (e.exports == i) + r.exports = s; + else + for (D in s) + s.hasOwnProperty(D) && (i[D] = s[D]); + else + n.punycode = s; + })(commonjsGlobal); + }(punycode, punycode.exports)), punycode.exports; +} +var IPv6 = { exports: {} }; +/*! + * URI.js - Mutating URLs + * IPv6 Support + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ +var hasRequiredIPv6; +function requireIPv6() { + return hasRequiredIPv6 || (hasRequiredIPv6 = 1, function(e) { + (function(t, n) { + e.exports ? e.exports = n() : t.IPv6 = n(t); + })(commonjsGlobal, function(t) { + var n = t && t.IPv6; + function i(o) { + var s = o.toLowerCase(), c = s.split(":"), l = c.length, d = 8; + c[0] === "" && c[1] === "" && c[2] === "" ? (c.shift(), c.shift()) : c[0] === "" && c[1] === "" ? c.shift() : c[l - 1] === "" && c[l - 2] === "" && c.pop(), l = c.length, c[l - 1].indexOf(".") !== -1 && (d = 7); + var f; + for (f = 0; f < l && c[f] !== ""; f++) + ; + if (f < d) + for (c.splice(f, 1, "0000"); c.length < d; ) + c.splice(f, 0, "0000"); + for (var h, p = 0; p < d; p++) { + h = c[p].split(""); + for (var m = 0; m < 3 && (h[0] === "0" && h.length > 1); m++) + h.splice(0, 1); + c[p] = h.join(""); + } + var _ = -1, y = 0, C = 0, T = -1, x = !1; + for (p = 0; p < d; p++) + x ? c[p] === "0" ? C += 1 : (x = !1, C > y && (_ = T, y = C)) : c[p] === "0" && (x = !0, T = p, C = 1); + C > y && (_ = T, y = C), y > 1 && c.splice(_, y, ""), l = c.length; + var b = ""; + for (c[0] === "" && (b = ":"), p = 0; p < l && (b += c[p], p !== l - 1); p++) + b += ":"; + return c[l - 1] === "" && (b += ":"), b; + } + function r() { + return t.IPv6 === this && (t.IPv6 = n), this; + } + return { + best: i, + noConflict: r + }; + }); + }(IPv6)), IPv6.exports; +} +var SecondLevelDomains = { exports: {} }; +/*! + * URI.js - Mutating URLs + * Second Level Domain (SLD) Support + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ +var hasRequiredSecondLevelDomains; +function requireSecondLevelDomains() { + return hasRequiredSecondLevelDomains || (hasRequiredSecondLevelDomains = 1, function(e) { + (function(t, n) { + e.exports ? e.exports = n() : t.SecondLevelDomains = n(t); + })(commonjsGlobal, function(t) { + var n = t && t.SecondLevelDomains, i = { + // list of known Second Level Domains + // converted list of SLDs from https://github.com/gavingmiller/second-level-domains + // ---- + // publicsuffix.org is more current and actually used by a couple of browsers internally. + // downside is it also contains domains like "dyndns.org" - which is fine for the security + // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js + // ---- + list: { + ac: " com gov mil net org ", + ae: " ac co gov mil name net org pro sch ", + af: " com edu gov net org ", + al: " com edu gov mil net org ", + ao: " co ed gv it og pb ", + ar: " com edu gob gov int mil net org tur ", + at: " ac co gv or ", + au: " asn com csiro edu gov id net org ", + ba: " co com edu gov mil net org rs unbi unmo unsa untz unze ", + bb: " biz co com edu gov info net org store tv ", + bh: " biz cc com edu gov info net org ", + bn: " com edu gov net org ", + bo: " com edu gob gov int mil net org tv ", + br: " adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ", + bs: " com edu gov net org ", + bz: " du et om ov rg ", + ca: " ab bc mb nb nf nl ns nt nu on pe qc sk yk ", + ck: " biz co edu gen gov info net org ", + cn: " ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ", + co: " com edu gov mil net nom org ", + cr: " ac c co ed fi go or sa ", + cy: " ac biz com ekloges gov ltd name net org parliament press pro tm ", + do: " art com edu gob gov mil net org sld web ", + dz: " art asso com edu gov net org pol ", + ec: " com edu fin gov info med mil net org pro ", + eg: " com edu eun gov mil name net org sci ", + er: " com edu gov ind mil net org rochest w ", + es: " com edu gob nom org ", + et: " biz com edu gov info name net org ", + fj: " ac biz com info mil name net org pro ", + fk: " ac co gov net nom org ", + fr: " asso com f gouv nom prd presse tm ", + gg: " co net org ", + gh: " com edu gov mil org ", + gn: " ac com gov net org ", + gr: " com edu gov mil net org ", + gt: " com edu gob ind mil net org ", + gu: " com edu gov net org ", + hk: " com edu gov idv net org ", + hu: " 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ", + id: " ac co go mil net or sch web ", + il: " ac co gov idf k12 muni net org ", + in: " ac co edu ernet firm gen gov i ind mil net nic org res ", + iq: " com edu gov i mil net org ", + ir: " ac co dnssec gov i id net org sch ", + it: " edu gov ", + je: " co net org ", + jo: " com edu gov mil name net org sch ", + jp: " ac ad co ed go gr lg ne or ", + ke: " ac co go info me mobi ne or sc ", + kh: " com edu gov mil net org per ", + ki: " biz com de edu gov info mob net org tel ", + km: " asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ", + kn: " edu gov net org ", + kr: " ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ", + kw: " com edu gov net org ", + ky: " com edu gov net org ", + kz: " com edu gov mil net org ", + lb: " com edu gov net org ", + lk: " assn com edu gov grp hotel int ltd net ngo org sch soc web ", + lr: " com edu gov net org ", + lv: " asn com conf edu gov id mil net org ", + ly: " com edu gov id med net org plc sch ", + ma: " ac co gov m net org press ", + mc: " asso tm ", + me: " ac co edu gov its net org priv ", + mg: " com edu gov mil nom org prd tm ", + mk: " com edu gov inf name net org pro ", + ml: " com edu gov net org presse ", + mn: " edu gov org ", + mo: " com edu gov net org ", + mt: " com edu gov net org ", + mv: " aero biz com coop edu gov info int mil museum name net org pro ", + mw: " ac co com coop edu gov int museum net org ", + mx: " com edu gob net org ", + my: " com edu gov mil name net org sch ", + nf: " arts com firm info net other per rec store web ", + ng: " biz com edu gov mil mobi name net org sch ", + ni: " ac co com edu gob mil net nom org ", + np: " com edu gov mil net org ", + nr: " biz com edu gov info net org ", + om: " ac biz co com edu gov med mil museum net org pro sch ", + pe: " com edu gob mil net nom org sld ", + ph: " com edu gov i mil net ngo org ", + pk: " biz com edu fam gob gok gon gop gos gov net org web ", + pl: " art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ", + pr: " ac biz com edu est gov info isla name net org pro prof ", + ps: " com edu gov net org plo sec ", + pw: " belau co ed go ne or ", + ro: " arts com firm info nom nt org rec store tm www ", + rs: " ac co edu gov in org ", + sb: " com edu gov net org ", + sc: " com edu gov net org ", + sh: " co com edu gov net nom org ", + sl: " com edu gov net org ", + st: " co com consulado edu embaixada gov mil net org principe saotome store ", + sv: " com edu gob org red ", + sz: " ac co org ", + tr: " av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ", + tt: " aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ", + tw: " club com ebiz edu game gov idv mil net org ", + mu: " ac co com gov net or org ", + mz: " ac co edu gov org ", + na: " co com ", + nz: " ac co cri geek gen govt health iwi maori mil net org parliament school ", + pa: " abo ac com edu gob ing med net nom org sld ", + pt: " com edu gov int net nome org publ ", + py: " com edu gov mil net org ", + qa: " com edu gov mil net org ", + re: " asso com nom ", + ru: " ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ", + rw: " ac co com edu gouv gov int mil net ", + sa: " com edu gov med net org pub sch ", + sd: " com edu gov info med net org tv ", + se: " a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ", + sg: " com edu gov idn net org per ", + sn: " art com edu gouv org perso univ ", + sy: " com edu gov mil net news org ", + th: " ac co go in mi net or ", + tj: " ac biz co com edu go gov info int mil name net nic org test web ", + tn: " agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ", + tz: " ac co go ne or ", + ua: " biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ", + ug: " ac co go ne or org sc ", + uk: " ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ", + us: " dni fed isa kids nsn ", + uy: " com edu gub mil net org ", + ve: " co com edu gob info mil net org web ", + vi: " co com k12 net org ", + vn: " ac biz com edu gov health info int name net org pro ", + ye: " co com gov ltd me net org plc ", + yu: " ac co edu gov org ", + za: " ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ", + zm: " ac co com edu gov net org sch ", + // https://en.wikipedia.org/wiki/CentralNic#Second-level_domains + com: "ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ", + net: "gb jp se uk ", + org: "ae", + de: "com " + }, + // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost + // in both performance and memory footprint. No initialization required. + // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4 + // Following methods use lastIndexOf() rather than array.split() in order + // to avoid any memory allocations. + has: function(r) { + var o = r.lastIndexOf("."); + if (o <= 0 || o >= r.length - 1) + return !1; + var s = r.lastIndexOf(".", o - 1); + if (s <= 0 || s >= o - 1) + return !1; + var c = i.list[r.slice(o + 1)]; + return c ? c.indexOf(" " + r.slice(s + 1, o) + " ") >= 0 : !1; + }, + is: function(r) { + var o = r.lastIndexOf("."); + if (o <= 0 || o >= r.length - 1) + return !1; + var s = r.lastIndexOf(".", o - 1); + if (s >= 0) + return !1; + var c = i.list[r.slice(o + 1)]; + return c ? c.indexOf(" " + r.slice(0, o) + " ") >= 0 : !1; + }, + get: function(r) { + var o = r.lastIndexOf("."); + if (o <= 0 || o >= r.length - 1) + return null; + var s = r.lastIndexOf(".", o - 1); + if (s <= 0 || s >= o - 1) + return null; + var c = i.list[r.slice(o + 1)]; + return !c || c.indexOf(" " + r.slice(s + 1, o) + " ") < 0 ? null : r.slice(s + 1); + }, + noConflict: function() { + return t.SecondLevelDomains === this && (t.SecondLevelDomains = n), this; + } + }; + return i; + }); + }(SecondLevelDomains)), SecondLevelDomains.exports; +} +/*! + * URI.js - Mutating URLs + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ +(function(e) { + (function(t, n) { + e.exports ? e.exports = n(requirePunycode(), requireIPv6(), requireSecondLevelDomains()) : t.URI = n(t.punycode, t.IPv6, t.SecondLevelDomains, t); + })(commonjsGlobal, function(t, n, i, r) { + var o = r && r.URI; + function s(g, w) { + var O = arguments.length >= 1, N = arguments.length >= 2; + if (!(this instanceof s)) + return O ? N ? new s(g, w) : new s(g) : new s(); + if (g === void 0) { + if (O) + throw new TypeError("undefined is not a valid argument for URI"); + typeof location < "u" ? g = location.href + "" : g = ""; + } + if (g === null && O) + throw new TypeError("null is not a valid argument for URI"); + return this.href(g), w !== void 0 ? this.absoluteTo(w) : this; + } + function c(g) { + return /^[0-9]+$/.test(g); + } + s.version = "1.19.11"; + var l = s.prototype, d = Object.prototype.hasOwnProperty; + function f(g) { + return g.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); + } + function h(g) { + return g === void 0 ? "Undefined" : String(Object.prototype.toString.call(g)).slice(8, -1); + } + function p(g) { + return h(g) === "Array"; + } + function m(g, w) { + var O = {}, N, F; + if (h(w) === "RegExp") + O = null; + else if (p(w)) + for (N = 0, F = w.length; N < F; N++) + O[w[N]] = !0; + else + O[w] = !0; + for (N = 0, F = g.length; N < F; N++) { + var B = O && O[g[N]] !== void 0 || !O && w.test(g[N]); + B && (g.splice(N, 1), F--, N--); + } + return g; + } + function _(g, w) { + var O, N; + if (p(w)) { + for (O = 0, N = w.length; O < N; O++) + if (!_(g, w[O])) + return !1; + return !0; + } + var F = h(w); + for (O = 0, N = g.length; O < N; O++) + if (F === "RegExp") { + if (typeof g[O] == "string" && g[O].match(w)) + return !0; + } else if (g[O] === w) + return !0; + return !1; + } + function y(g, w) { + if (!p(g) || !p(w) || g.length !== w.length) + return !1; + g.sort(), w.sort(); + for (var O = 0, N = g.length; O < N; O++) + if (g[O] !== w[O]) + return !1; + return !0; + } + function C(g) { + var w = /^\/+|\/+$/g; + return g.replace(w, ""); + } + s._parts = function() { + return { + protocol: null, + username: null, + password: null, + hostname: null, + urn: null, + port: null, + path: null, + query: null, + fragment: null, + // state + preventInvalidHostname: s.preventInvalidHostname, + duplicateQueryParameters: s.duplicateQueryParameters, + escapeQuerySpace: s.escapeQuerySpace + }; + }, s.preventInvalidHostname = !1, s.duplicateQueryParameters = !1, s.escapeQuerySpace = !0, s.protocol_expression = /^[a-z][a-z0-9.+-]*$/i, s.idn_expression = /[^a-z0-9\._-]/i, s.punycode_expression = /(xn--)/i, s.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, s.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/, s.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig, s.findUri = { + // valid "scheme://" or "www." + start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi, + // everything up to the next whitespace + end: /[\s\r\n]|$/, + // trim trailing punctuation captured by end RegExp + trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/, + // balanced parens inclusion (), [], {}, <> + parens: /(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g + }, s.leading_whitespace_expression = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/, s.ascii_tab_whitespace = /[\u0009\u000A\u000D]+/g, s.defaultPorts = { + http: "80", + https: "443", + ftp: "21", + gopher: "70", + ws: "80", + wss: "443" + }, s.hostProtocols = [ + "http", + "https" + ], s.invalid_hostname_characters = /[^a-zA-Z0-9\.\-:_]/, s.domAttributes = { + a: "href", + blockquote: "cite", + link: "href", + base: "href", + script: "src", + form: "action", + img: "src", + area: "href", + iframe: "src", + embed: "src", + source: "src", + track: "src", + input: "src", + // but only if type="image" + audio: "src", + video: "src" + }, s.getDomAttribute = function(g) { + if (!(!g || !g.nodeName)) { + var w = g.nodeName.toLowerCase(); + if (!(w === "input" && g.type !== "image")) + return s.domAttributes[w]; + } + }; + function T(g) { + return escape(g); + } + function x(g) { + return encodeURIComponent(g).replace(/[!'()*]/g, T).replace(/\*/g, "%2A"); + } + s.encode = x, s.decode = decodeURIComponent, s.iso8859 = function() { + s.encode = escape, s.decode = unescape; + }, s.unicode = function() { + s.encode = x, s.decode = decodeURIComponent; + }, s.characters = { + pathname: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig, + map: { + // -._~!'()* + "%24": "$", + "%26": "&", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=", + "%3A": ":", + "%40": "@" + } + }, + decode: { + expression: /[\/\?#]/g, + map: { + "/": "%2F", + "?": "%3F", + "#": "%23" + } + } + }, + reserved: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig, + map: { + // gen-delims + "%3A": ":", + "%2F": "/", + "%3F": "?", + "%23": "#", + "%5B": "[", + "%5D": "]", + "%40": "@", + // sub-delims + "%21": "!", + "%24": "$", + "%26": "&", + "%27": "'", + "%28": "(", + "%29": ")", + "%2A": "*", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=" + } + } + }, + urnpath: { + // The characters under `encode` are the characters called out by RFC 2141 as being acceptable + // for usage in a URN. RFC2141 also calls out "-", ".", and "_" as acceptable characters, but + // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also + // note that the colon character is not featured in the encoding map; this is because URI.js + // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it + // should not appear unencoded in a segment itself. + // See also the note above about RFC3986 and capitalalized hex digits. + encode: { + expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig, + map: { + "%21": "!", + "%24": "$", + "%27": "'", + "%28": "(", + "%29": ")", + "%2A": "*", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=", + "%40": "@" + } + }, + // These characters are the characters called out by RFC2141 as "reserved" characters that + // should never appear in a URN, plus the colon character (see note above). + decode: { + expression: /[\/\?#:]/g, + map: { + "/": "%2F", + "?": "%3F", + "#": "%23", + ":": "%3A" + } + } + } + }, s.encodeQuery = function(g, w) { + var O = s.encode(g + ""); + return w === void 0 && (w = s.escapeQuerySpace), w ? O.replace(/%20/g, "+") : O; + }, s.decodeQuery = function(g, w) { + g += "", w === void 0 && (w = s.escapeQuerySpace); + try { + return s.decode(w ? g.replace(/\+/g, "%20") : g); + } catch { + return g; + } + }; + var b = { encode: "encode", decode: "decode" }, S, E = function(g, w) { + return function(O) { + try { + return s[w](O + "").replace(s.characters[g][w].expression, function(N) { + return s.characters[g][w].map[N]; + }); + } catch { + return O; + } + }; + }; + for (S in b) + s[S + "PathSegment"] = E("pathname", b[S]), s[S + "UrnPathSegment"] = E("urnpath", b[S]); + var A = function(g, w, O) { + return function(N) { + var F; + O ? F = function(k) { + return s[w](s[O](k)); + } : F = s[w]; + for (var B = (N + "").split(g), V = 0, U = B.length; V < U; V++) + B[V] = F(B[V]); + return B.join(g); + }; + }; + s.decodePath = A("/", "decodePathSegment"), s.decodeUrnPath = A(":", "decodeUrnPathSegment"), s.recodePath = A("/", "encodePathSegment", "decode"), s.recodeUrnPath = A(":", "encodeUrnPathSegment", "decode"), s.encodeReserved = E("reserved", "encode"), s.parse = function(g, w) { + var O; + return w || (w = { + preventInvalidHostname: s.preventInvalidHostname + }), g = g.replace(s.leading_whitespace_expression, ""), g = g.replace(s.ascii_tab_whitespace, ""), O = g.indexOf("#"), O > -1 && (w.fragment = g.substring(O + 1) || null, g = g.substring(0, O)), O = g.indexOf("?"), O > -1 && (w.query = g.substring(O + 1) || null, g = g.substring(0, O)), g = g.replace(/^(https?|ftp|wss?)?:+[/\\]*/i, "$1://"), g = g.replace(/^[/\\]{2,}/i, "//"), g.substring(0, 2) === "//" ? (w.protocol = null, g = g.substring(2), g = s.parseAuthority(g, w)) : (O = g.indexOf(":"), O > -1 && (w.protocol = g.substring(0, O) || null, w.protocol && !w.protocol.match(s.protocol_expression) ? w.protocol = void 0 : g.substring(O + 1, O + 3).replace(/\\/g, "/") === "//" ? (g = g.substring(O + 3), g = s.parseAuthority(g, w)) : (g = g.substring(O + 1), w.urn = !0))), w.path = g, w; + }, s.parseHost = function(g, w) { + g || (g = ""), g = g.replace(/\\/g, "/"); + var O = g.indexOf("/"), N, F; + if (O === -1 && (O = g.length), g.charAt(0) === "[") + N = g.indexOf("]"), w.hostname = g.substring(1, N) || null, w.port = g.substring(N + 2, O) || null, w.port === "/" && (w.port = null); + else { + var B = g.indexOf(":"), V = g.indexOf("/"), U = g.indexOf(":", B + 1); + U !== -1 && (V === -1 || U < V) ? (w.hostname = g.substring(0, O) || null, w.port = null) : (F = g.substring(0, O).split(":"), w.hostname = F[0] || null, w.port = F[1] || null); + } + return w.hostname && g.substring(O).charAt(0) !== "/" && (O++, g = "/" + g), w.preventInvalidHostname && s.ensureValidHostname(w.hostname, w.protocol), w.port && s.ensureValidPort(w.port), g.substring(O) || "/"; + }, s.parseAuthority = function(g, w) { + return g = s.parseUserinfo(g, w), s.parseHost(g, w); + }, s.parseUserinfo = function(g, w) { + var O = g, N = g.indexOf("\\"); + N !== -1 && (g = g.replace(/\\/g, "/")); + var F = g.indexOf("/"), B = g.lastIndexOf("@", F > -1 ? F : g.length - 1), V; + return B > -1 && (F === -1 || B < F) ? (V = g.substring(0, B).split(":"), w.username = V[0] ? s.decode(V[0]) : null, V.shift(), w.password = V[0] ? s.decode(V.join(":")) : null, g = O.substring(B + 1)) : (w.username = null, w.password = null), g; + }, s.parseQuery = function(g, w) { + if (!g) + return {}; + if (g = g.replace(/&+/g, "&").replace(/^\?*&*|&+$/g, ""), !g) + return {}; + for (var O = {}, N = g.split("&"), F = N.length, B, V, U, k = 0; k < F; k++) + B = N[k].split("="), V = s.decodeQuery(B.shift(), w), U = B.length ? s.decodeQuery(B.join("="), w) : null, V !== "__proto__" && (d.call(O, V) ? ((typeof O[V] == "string" || O[V] === null) && (O[V] = [O[V]]), O[V].push(U)) : O[V] = U); + return O; + }, s.build = function(g) { + var w = "", O = !1; + return g.protocol && (w += g.protocol + ":"), !g.urn && (w || g.hostname) && (w += "//", O = !0), w += s.buildAuthority(g) || "", typeof g.path == "string" && (g.path.charAt(0) !== "/" && O && (w += "/"), w += g.path), typeof g.query == "string" && g.query && (w += "?" + g.query), typeof g.fragment == "string" && g.fragment && (w += "#" + g.fragment), w; + }, s.buildHost = function(g) { + var w = ""; + if (g.hostname) + s.ip6_expression.test(g.hostname) ? w += "[" + g.hostname + "]" : w += g.hostname; + else return ""; + return g.port && (w += ":" + g.port), w; + }, s.buildAuthority = function(g) { + return s.buildUserinfo(g) + s.buildHost(g); + }, s.buildUserinfo = function(g) { + var w = ""; + return g.username && (w += s.encode(g.username)), g.password && (w += ":" + s.encode(g.password)), w && (w += "@"), w; + }, s.buildQuery = function(g, w, O) { + var N = "", F, B, V, U; + for (B in g) + if (B !== "__proto__" && d.call(g, B)) + if (p(g[B])) + for (F = {}, V = 0, U = g[B].length; V < U; V++) + g[B][V] !== void 0 && F[g[B][V] + ""] === void 0 && (N += "&" + s.buildQueryParameter(B, g[B][V], O), w !== !0 && (F[g[B][V] + ""] = !0)); + else g[B] !== void 0 && (N += "&" + s.buildQueryParameter(B, g[B], O)); + return N.substring(1); + }, s.buildQueryParameter = function(g, w, O) { + return s.encodeQuery(g, O) + (w !== null ? "=" + s.encodeQuery(w, O) : ""); + }, s.addQuery = function(g, w, O) { + if (typeof w == "object") + for (var N in w) + d.call(w, N) && s.addQuery(g, N, w[N]); + else if (typeof w == "string") { + if (g[w] === void 0) { + g[w] = O; + return; + } else typeof g[w] == "string" && (g[w] = [g[w]]); + p(O) || (O = [O]), g[w] = (g[w] || []).concat(O); + } else + throw new TypeError("URI.addQuery() accepts an object, string as the name parameter"); + }, s.setQuery = function(g, w, O) { + if (typeof w == "object") + for (var N in w) + d.call(w, N) && s.setQuery(g, N, w[N]); + else if (typeof w == "string") + g[w] = O === void 0 ? null : O; + else + throw new TypeError("URI.setQuery() accepts an object, string as the name parameter"); + }, s.removeQuery = function(g, w, O) { + var N, F, B; + if (p(w)) + for (N = 0, F = w.length; N < F; N++) + g[w[N]] = void 0; + else if (h(w) === "RegExp") + for (B in g) + w.test(B) && (g[B] = void 0); + else if (typeof w == "object") + for (B in w) + d.call(w, B) && s.removeQuery(g, B, w[B]); + else if (typeof w == "string") + O !== void 0 ? h(O) === "RegExp" ? !p(g[w]) && O.test(g[w]) ? g[w] = void 0 : g[w] = m(g[w], O) : g[w] === String(O) && (!p(O) || O.length === 1) ? g[w] = void 0 : p(g[w]) && (g[w] = m(g[w], O)) : g[w] = void 0; + else + throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter"); + }, s.hasQuery = function(g, w, O, N) { + switch (h(w)) { + case "String": + break; + case "RegExp": + for (var F in g) + if (d.call(g, F) && w.test(F) && (O === void 0 || s.hasQuery(g, F, O))) + return !0; + return !1; + case "Object": + for (var B in w) + if (d.call(w, B) && !s.hasQuery(g, B, w[B])) + return !1; + return !0; + default: + throw new TypeError("URI.hasQuery() accepts a string, regular expression or object as the name parameter"); + } + switch (h(O)) { + case "Undefined": + return w in g; + case "Boolean": + var V = !!(p(g[w]) ? g[w].length : g[w]); + return O === V; + case "Function": + return !!O(g[w], w, g); + case "Array": + if (!p(g[w])) + return !1; + var U = N ? _ : y; + return U(g[w], O); + case "RegExp": + return p(g[w]) ? N ? _(g[w], O) : !1 : !!(g[w] && g[w].match(O)); + case "Number": + O = String(O); + case "String": + return p(g[w]) ? N ? _(g[w], O) : !1 : g[w] === O; + default: + throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter"); + } + }, s.joinPaths = function() { + for (var g = [], w = [], O = 0, N = 0; N < arguments.length; N++) { + var F = new s(arguments[N]); + g.push(F); + for (var B = F.segment(), V = 0; V < B.length; V++) + typeof B[V] == "string" && w.push(B[V]), B[V] && O++; + } + if (!w.length || !O) + return new s(""); + var U = new s("").segment(w); + return (g[0].path() === "" || g[0].path().slice(0, 1) === "/") && U.path("/" + U.path()), U.normalize(); + }, s.commonPath = function(g, w) { + var O = Math.min(g.length, w.length), N; + for (N = 0; N < O; N++) + if (g.charAt(N) !== w.charAt(N)) { + N--; + break; + } + return N < 1 ? g.charAt(0) === w.charAt(0) && g.charAt(0) === "/" ? "/" : "" : ((g.charAt(N) !== "/" || w.charAt(N) !== "/") && (N = g.substring(0, N).lastIndexOf("/")), g.substring(0, N + 1)); + }, s.withinString = function(g, w, O) { + O || (O = {}); + var N = O.start || s.findUri.start, F = O.end || s.findUri.end, B = O.trim || s.findUri.trim, V = O.parens || s.findUri.parens, U = /[a-z0-9-]=["']?$/i; + for (N.lastIndex = 0; ; ) { + var k = N.exec(g); + if (!k) + break; + var $ = k.index; + if (O.ignoreHtml) { + var G = g.slice(Math.max($ - 3, 0), $); + if (G && U.test(G)) + continue; + } + for (var q = $ + g.slice($).search(F), z = g.slice($, q), H = -1; ; ) { + var Q = V.exec(z); + if (!Q) + break; + var ne = Q.index + Q[0].length; + H = Math.max(H, ne); + } + if (H > -1 ? z = z.slice(0, H) + z.slice(H).replace(B, "") : z = z.replace(B, ""), !(z.length <= k[0].length) && !(O.ignore && O.ignore.test(z))) { + q = $ + z.length; + var K = w(z, $, q, g); + if (K === void 0) { + N.lastIndex = q; + continue; + } + K = String(K), g = g.slice(0, $) + K + g.slice(q), N.lastIndex = $ + K.length; + } + } + return N.lastIndex = 0, g; + }, s.ensureValidHostname = function(g, w) { + var O = !!g, N = !!w, F = !1; + if (N && (F = _(s.hostProtocols, w)), F && !O) + throw new TypeError("Hostname cannot be empty, if protocol is " + w); + if (g && g.match(s.invalid_hostname_characters)) { + if (!t) + throw new TypeError('Hostname "' + g + '" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available'); + if (t.toASCII(g).match(s.invalid_hostname_characters)) + throw new TypeError('Hostname "' + g + '" contains characters other than [A-Z0-9.-:_]'); + } + }, s.ensureValidPort = function(g) { + if (g) { + var w = Number(g); + if (!(c(w) && w > 0 && w < 65536)) + throw new TypeError('Port "' + g + '" is not a valid port'); + } + }, s.noConflict = function(g) { + if (g) { + var w = { + URI: this.noConflict() + }; + return r.URITemplate && typeof r.URITemplate.noConflict == "function" && (w.URITemplate = r.URITemplate.noConflict()), r.IPv6 && typeof r.IPv6.noConflict == "function" && (w.IPv6 = r.IPv6.noConflict()), r.SecondLevelDomains && typeof r.SecondLevelDomains.noConflict == "function" && (w.SecondLevelDomains = r.SecondLevelDomains.noConflict()), w; + } else r.URI === this && (r.URI = o); + return this; + }, l.build = function(g) { + return g === !0 ? this._deferred_build = !0 : (g === void 0 || this._deferred_build) && (this._string = s.build(this._parts), this._deferred_build = !1), this; + }, l.clone = function() { + return new s(this); + }, l.valueOf = l.toString = function() { + return this.build(!1)._string; + }; + function D(g) { + return function(w, O) { + return w === void 0 ? this._parts[g] || "" : (this._parts[g] = w || null, this.build(!O), this); + }; + } + function P(g, w) { + return function(O, N) { + return O === void 0 ? this._parts[g] || "" : (O !== null && (O = O + "", O.charAt(0) === w && (O = O.substring(1))), this._parts[g] = O, this.build(!N), this); + }; + } + l.protocol = D("protocol"), l.username = D("username"), l.password = D("password"), l.hostname = D("hostname"), l.port = D("port"), l.query = P("query", "?"), l.fragment = P("fragment", "#"), l.search = function(g, w) { + var O = this.query(g, w); + return typeof O == "string" && O.length ? "?" + O : O; + }, l.hash = function(g, w) { + var O = this.fragment(g, w); + return typeof O == "string" && O.length ? "#" + O : O; + }, l.pathname = function(g, w) { + if (g === void 0 || g === !0) { + var O = this._parts.path || (this._parts.hostname ? "/" : ""); + return g ? (this._parts.urn ? s.decodeUrnPath : s.decodePath)(O) : O; + } else + return this._parts.urn ? this._parts.path = g ? s.recodeUrnPath(g) : "" : this._parts.path = g ? s.recodePath(g) : "/", this.build(!w), this; + }, l.path = l.pathname, l.href = function(g, w) { + var O; + if (g === void 0) + return this.toString(); + this._string = "", this._parts = s._parts(); + var N = g instanceof s, F = typeof g == "object" && (g.hostname || g.path || g.pathname); + if (g.nodeName) { + var B = s.getDomAttribute(g); + g = g[B] || "", F = !1; + } + if (!N && F && g.pathname !== void 0 && (g = g.toString()), typeof g == "string" || g instanceof String) + this._parts = s.parse(String(g), this._parts); + else if (N || F) { + var V = N ? g._parts : g; + for (O in V) + O !== "query" && d.call(this._parts, O) && (this._parts[O] = V[O]); + V.query && this.query(V.query, !1); + } else + throw new TypeError("invalid input"); + return this.build(!w), this; + }, l.is = function(g) { + var w = !1, O = !1, N = !1, F = !1, B = !1, V = !1, U = !1, k = !this._parts.urn; + switch (this._parts.hostname && (k = !1, O = s.ip4_expression.test(this._parts.hostname), N = s.ip6_expression.test(this._parts.hostname), w = O || N, F = !w, B = F && i && i.has(this._parts.hostname), V = F && s.idn_expression.test(this._parts.hostname), U = F && s.punycode_expression.test(this._parts.hostname)), g.toLowerCase()) { + case "relative": + return k; + case "absolute": + return !k; + case "domain": + case "name": + return F; + case "sld": + return B; + case "ip": + return w; + case "ip4": + case "ipv4": + case "inet4": + return O; + case "ip6": + case "ipv6": + case "inet6": + return N; + case "idn": + return V; + case "url": + return !this._parts.urn; + case "urn": + return !!this._parts.urn; + case "punycode": + return U; + } + return null; + }; + var I = l.protocol, M = l.port, R = l.hostname; + l.protocol = function(g, w) { + if (g && (g = g.replace(/:(\/\/)?$/, ""), !g.match(s.protocol_expression))) + throw new TypeError('Protocol "' + g + `" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]`); + return I.call(this, g, w); + }, l.scheme = l.protocol, l.port = function(g, w) { + return this._parts.urn ? g === void 0 ? "" : this : (g !== void 0 && (g === 0 && (g = null), g && (g += "", g.charAt(0) === ":" && (g = g.substring(1)), s.ensureValidPort(g))), M.call(this, g, w)); + }, l.hostname = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g !== void 0) { + var O = { preventInvalidHostname: this._parts.preventInvalidHostname }, N = s.parseHost(g, O); + if (N !== "/") + throw new TypeError('Hostname "' + g + '" contains characters other than [A-Z0-9.-]'); + g = O.hostname, this._parts.preventInvalidHostname && s.ensureValidHostname(g, this._parts.protocol); + } + return R.call(this, g, w); + }, l.origin = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0) { + var O = this.protocol(), N = this.authority(); + return N ? (O ? O + "://" : "") + this.authority() : ""; + } else { + var F = s(g); + return this.protocol(F.protocol()).authority(F.authority()).build(!w), this; + } + }, l.host = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0) + return this._parts.hostname ? s.buildHost(this._parts) : ""; + var O = s.parseHost(g, this._parts); + if (O !== "/") + throw new TypeError('Hostname "' + g + '" contains characters other than [A-Z0-9.-]'); + return this.build(!w), this; + }, l.authority = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0) + return this._parts.hostname ? s.buildAuthority(this._parts) : ""; + var O = s.parseAuthority(g, this._parts); + if (O !== "/") + throw new TypeError('Hostname "' + g + '" contains characters other than [A-Z0-9.-]'); + return this.build(!w), this; + }, l.userinfo = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0) { + var O = s.buildUserinfo(this._parts); + return O && O.substring(0, O.length - 1); + } else + return g[g.length - 1] !== "@" && (g += "@"), s.parseUserinfo(g, this._parts), this.build(!w), this; + }, l.resource = function(g, w) { + var O; + return g === void 0 ? this.path() + this.search() + this.hash() : (O = s.parse(g), this._parts.path = O.path, this._parts.query = O.query, this._parts.fragment = O.fragment, this.build(!w), this); + }, l.subdomain = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0) { + if (!this._parts.hostname || this.is("IP")) + return ""; + var O = this._parts.hostname.length - this.domain().length - 1; + return this._parts.hostname.substring(0, O) || ""; + } else { + var N = this._parts.hostname.length - this.domain().length, F = this._parts.hostname.substring(0, N), B = new RegExp("^" + f(F)); + if (g && g.charAt(g.length - 1) !== "." && (g += "."), g.indexOf(":") !== -1) + throw new TypeError("Domains cannot contain colons"); + return g && s.ensureValidHostname(g, this._parts.protocol), this._parts.hostname = this._parts.hostname.replace(B, g), this.build(!w), this; + } + }, l.domain = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (typeof g == "boolean" && (w = g, g = void 0), g === void 0) { + if (!this._parts.hostname || this.is("IP")) + return ""; + var O = this._parts.hostname.match(/\./g); + if (O && O.length < 2) + return this._parts.hostname; + var N = this._parts.hostname.length - this.tld(w).length - 1; + return N = this._parts.hostname.lastIndexOf(".", N - 1) + 1, this._parts.hostname.substring(N) || ""; + } else { + if (!g) + throw new TypeError("cannot set domain empty"); + if (g.indexOf(":") !== -1) + throw new TypeError("Domains cannot contain colons"); + if (s.ensureValidHostname(g, this._parts.protocol), !this._parts.hostname || this.is("IP")) + this._parts.hostname = g; + else { + var F = new RegExp(f(this.domain()) + "$"); + this._parts.hostname = this._parts.hostname.replace(F, g); + } + return this.build(!w), this; + } + }, l.tld = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (typeof g == "boolean" && (w = g, g = void 0), g === void 0) { + if (!this._parts.hostname || this.is("IP")) + return ""; + var O = this._parts.hostname.lastIndexOf("."), N = this._parts.hostname.substring(O + 1); + return w !== !0 && i && i.list[N.toLowerCase()] && i.get(this._parts.hostname) || N; + } else { + var F; + if (g) + if (g.match(/[^a-zA-Z0-9-]/)) + if (i && i.is(g)) + F = new RegExp(f(this.tld()) + "$"), this._parts.hostname = this._parts.hostname.replace(F, g); + else + throw new TypeError('TLD "' + g + '" contains characters other than [A-Z0-9]'); + else { + if (!this._parts.hostname || this.is("IP")) + throw new ReferenceError("cannot set TLD on non-domain host"); + F = new RegExp(f(this.tld()) + "$"), this._parts.hostname = this._parts.hostname.replace(F, g); + } + else throw new TypeError("cannot set TLD empty"); + return this.build(!w), this; + } + }, l.directory = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0 || g === !0) { + if (!this._parts.path && !this._parts.hostname) + return ""; + if (this._parts.path === "/") + return "/"; + var O = this._parts.path.length - this.filename().length - 1, N = this._parts.path.substring(0, O) || (this._parts.hostname ? "/" : ""); + return g ? s.decodePath(N) : N; + } else { + var F = this._parts.path.length - this.filename().length, B = this._parts.path.substring(0, F), V = new RegExp("^" + f(B)); + return this.is("relative") || (g || (g = "/"), g.charAt(0) !== "/" && (g = "/" + g)), g && g.charAt(g.length - 1) !== "/" && (g += "/"), g = s.recodePath(g), this._parts.path = this._parts.path.replace(V, g), this.build(!w), this; + } + }, l.filename = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (typeof g != "string") { + if (!this._parts.path || this._parts.path === "/") + return ""; + var O = this._parts.path.lastIndexOf("/"), N = this._parts.path.substring(O + 1); + return g ? s.decodePathSegment(N) : N; + } else { + var F = !1; + g.charAt(0) === "/" && (g = g.substring(1)), g.match(/\.?\//) && (F = !0); + var B = new RegExp(f(this.filename()) + "$"); + return g = s.recodePath(g), this._parts.path = this._parts.path.replace(B, g), F ? this.normalizePath(w) : this.build(!w), this; + } + }, l.suffix = function(g, w) { + if (this._parts.urn) + return g === void 0 ? "" : this; + if (g === void 0 || g === !0) { + if (!this._parts.path || this._parts.path === "/") + return ""; + var O = this.filename(), N = O.lastIndexOf("."), F, B; + return N === -1 ? "" : (F = O.substring(N + 1), B = /^[a-z0-9%]+$/i.test(F) ? F : "", g ? s.decodePathSegment(B) : B); + } else { + g.charAt(0) === "." && (g = g.substring(1)); + var V = this.suffix(), U; + if (V) + g ? U = new RegExp(f(V) + "$") : U = new RegExp(f("." + V) + "$"); + else { + if (!g) + return this; + this._parts.path += "." + s.recodePath(g); + } + return U && (g = s.recodePath(g), this._parts.path = this._parts.path.replace(U, g)), this.build(!w), this; + } + }, l.segment = function(g, w, O) { + var N = this._parts.urn ? ":" : "/", F = this.path(), B = F.substring(0, 1) === "/", V = F.split(N); + if (g !== void 0 && typeof g != "number" && (O = w, w = g, g = void 0), g !== void 0 && typeof g != "number") + throw new Error('Bad segment "' + g + '", must be 0-based integer'); + if (B && V.shift(), g < 0 && (g = Math.max(V.length + g, 0)), w === void 0) + return g === void 0 ? V : V[g]; + if (g === null || V[g] === void 0) + if (p(w)) { + V = []; + for (var U = 0, k = w.length; U < k; U++) + !w[U].length && (!V.length || !V[V.length - 1].length) || (V.length && !V[V.length - 1].length && V.pop(), V.push(C(w[U]))); + } else (w || typeof w == "string") && (w = C(w), V[V.length - 1] === "" ? V[V.length - 1] = w : V.push(w)); + else + w ? V[g] = C(w) : V.splice(g, 1); + return B && V.unshift(""), this.path(V.join(N), O); + }, l.segmentCoded = function(g, w, O) { + var N, F, B; + if (typeof g != "number" && (O = w, w = g, g = void 0), w === void 0) { + if (N = this.segment(g, w, O), !p(N)) + N = N !== void 0 ? s.decode(N) : void 0; + else + for (F = 0, B = N.length; F < B; F++) + N[F] = s.decode(N[F]); + return N; + } + if (!p(w)) + w = typeof w == "string" || w instanceof String ? s.encode(w) : w; + else + for (F = 0, B = w.length; F < B; F++) + w[F] = s.encode(w[F]); + return this.segment(g, w, O); + }; + var L = l.query; + return l.query = function(g, w) { + if (g === !0) + return s.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + if (typeof g == "function") { + var O = s.parseQuery(this._parts.query, this._parts.escapeQuerySpace), N = g.call(this, O); + return this._parts.query = s.buildQuery(N || O, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace), this.build(!w), this; + } else return g !== void 0 && typeof g != "string" ? (this._parts.query = s.buildQuery(g, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace), this.build(!w), this) : L.call(this, g, w); + }, l.setQuery = function(g, w, O) { + var N = s.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + if (typeof g == "string" || g instanceof String) + N[g] = w !== void 0 ? w : null; + else if (typeof g == "object") + for (var F in g) + d.call(g, F) && (N[F] = g[F]); + else + throw new TypeError("URI.addQuery() accepts an object, string as the name parameter"); + return this._parts.query = s.buildQuery(N, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace), typeof g != "string" && (O = w), this.build(!O), this; + }, l.addQuery = function(g, w, O) { + var N = s.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + return s.addQuery(N, g, w === void 0 ? null : w), this._parts.query = s.buildQuery(N, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace), typeof g != "string" && (O = w), this.build(!O), this; + }, l.removeQuery = function(g, w, O) { + var N = s.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + return s.removeQuery(N, g, w), this._parts.query = s.buildQuery(N, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace), typeof g != "string" && (O = w), this.build(!O), this; + }, l.hasQuery = function(g, w, O) { + var N = s.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + return s.hasQuery(N, g, w, O); + }, l.setSearch = l.setQuery, l.addSearch = l.addQuery, l.removeSearch = l.removeQuery, l.hasSearch = l.hasQuery, l.normalize = function() { + return this._parts.urn ? this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build() : this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build(); + }, l.normalizeProtocol = function(g) { + return typeof this._parts.protocol == "string" && (this._parts.protocol = this._parts.protocol.toLowerCase(), this.build(!g)), this; + }, l.normalizeHostname = function(g) { + return this._parts.hostname && (this.is("IDN") && t ? this._parts.hostname = t.toASCII(this._parts.hostname) : this.is("IPv6") && n && (this._parts.hostname = n.best(this._parts.hostname)), this._parts.hostname = this._parts.hostname.toLowerCase(), this.build(!g)), this; + }, l.normalizePort = function(g) { + return typeof this._parts.protocol == "string" && this._parts.port === s.defaultPorts[this._parts.protocol] && (this._parts.port = null, this.build(!g)), this; + }, l.normalizePath = function(g) { + var w = this._parts.path; + if (!w) + return this; + if (this._parts.urn) + return this._parts.path = s.recodeUrnPath(this._parts.path), this.build(!g), this; + if (this._parts.path === "/") + return this; + w = s.recodePath(w); + var O, N = "", F, B; + for (w.charAt(0) !== "/" && (O = !0, w = "/" + w), (w.slice(-3) === "/.." || w.slice(-2) === "/.") && (w += "/"), w = w.replace(/(\/(\.\/)+)|(\/\.$)/g, "/").replace(/\/{2,}/g, "/"), O && (N = w.substring(1).match(/^(\.\.\/)+/) || "", N && (N = N[0])); F = w.search(/\/\.\.(\/|$)/), F !== -1; ) { + if (F === 0) { + w = w.substring(3); + continue; + } + B = w.substring(0, F).lastIndexOf("/"), B === -1 && (B = F), w = w.substring(0, B) + w.substring(F + 3); + } + return O && this.is("relative") && (w = N + w.substring(1)), this._parts.path = w, this.build(!g), this; + }, l.normalizePathname = l.normalizePath, l.normalizeQuery = function(g) { + return typeof this._parts.query == "string" && (this._parts.query.length ? this.query(s.parseQuery(this._parts.query, this._parts.escapeQuerySpace)) : this._parts.query = null, this.build(!g)), this; + }, l.normalizeFragment = function(g) { + return this._parts.fragment || (this._parts.fragment = null, this.build(!g)), this; + }, l.normalizeSearch = l.normalizeQuery, l.normalizeHash = l.normalizeFragment, l.iso8859 = function() { + var g = s.encode, w = s.decode; + s.encode = escape, s.decode = decodeURIComponent; + try { + this.normalize(); + } finally { + s.encode = g, s.decode = w; + } + return this; + }, l.unicode = function() { + var g = s.encode, w = s.decode; + s.encode = x, s.decode = unescape; + try { + this.normalize(); + } finally { + s.encode = g, s.decode = w; + } + return this; + }, l.readable = function() { + var g = this.clone(); + g.username("").password("").normalize(); + var w = ""; + if (g._parts.protocol && (w += g._parts.protocol + "://"), g._parts.hostname && (g.is("punycode") && t ? (w += t.toUnicode(g._parts.hostname), g._parts.port && (w += ":" + g._parts.port)) : w += g.host()), g._parts.hostname && g._parts.path && g._parts.path.charAt(0) !== "/" && (w += "/"), w += g.path(!0), g._parts.query) { + for (var O = "", N = 0, F = g._parts.query.split("&"), B = F.length; N < B; N++) { + var V = (F[N] || "").split("="); + O += "&" + s.decodeQuery(V[0], this._parts.escapeQuerySpace).replace(/&/g, "%26"), V[1] !== void 0 && (O += "=" + s.decodeQuery(V[1], this._parts.escapeQuerySpace).replace(/&/g, "%26")); + } + w += "?" + O.substring(1); + } + return w += s.decodeQuery(g.hash(), !0), w; + }, l.absoluteTo = function(g) { + var w = this.clone(), O = ["protocol", "username", "password", "hostname", "port"], N, F, B; + if (this._parts.urn) + throw new Error("URNs do not have any generally defined hierarchical components"); + if (g instanceof s || (g = new s(g)), w._parts.protocol || (w._parts.protocol = g._parts.protocol, this._parts.hostname)) + return w; + for (F = 0; B = O[F]; F++) + w._parts[B] = g._parts[B]; + return w._parts.path ? (w._parts.path.substring(-2) === ".." && (w._parts.path += "/"), w.path().charAt(0) !== "/" && (N = g.directory(), N = N || (g.path().indexOf("/") === 0 ? "/" : ""), w._parts.path = (N ? N + "/" : "") + w._parts.path, w.normalizePath())) : (w._parts.path = g._parts.path, w._parts.query || (w._parts.query = g._parts.query)), w.build(), w; + }, l.relativeTo = function(g) { + var w = this.clone().normalize(), O, N, F, B, V; + if (w._parts.urn) + throw new Error("URNs do not have any generally defined hierarchical components"); + if (g = new s(g).normalize(), O = w._parts, N = g._parts, B = w.path(), V = g.path(), B.charAt(0) !== "/") + throw new Error("URI is already relative"); + if (V.charAt(0) !== "/") + throw new Error("Cannot calculate a URI relative to another relative URI"); + if (O.protocol === N.protocol && (O.protocol = null), O.username !== N.username || O.password !== N.password || O.protocol !== null || O.username !== null || O.password !== null) + return w.build(); + if (O.hostname === N.hostname && O.port === N.port) + O.hostname = null, O.port = null; + else + return w.build(); + if (B === V) + return O.path = "", w.build(); + if (F = s.commonPath(B, V), !F) + return w.build(); + var U = N.path.substring(F.length).replace(/[^\/]*$/, "").replace(/.*?\//g, "../"); + return O.path = U + O.path.substring(F.length) || "./", w.build(); + }, l.equals = function(g) { + var w = this.clone(), O = new s(g), N = {}, F = {}, B = {}, V, U, k; + if (w.normalize(), O.normalize(), w.toString() === O.toString()) + return !0; + if (V = w.query(), U = O.query(), w.query(""), O.query(""), w.toString() !== O.toString() || V.length !== U.length) + return !1; + N = s.parseQuery(V, this._parts.escapeQuerySpace), F = s.parseQuery(U, this._parts.escapeQuerySpace); + for (k in N) + if (d.call(N, k)) { + if (p(N[k])) { + if (!y(N[k], F[k])) + return !1; + } else if (N[k] !== F[k]) + return !1; + B[k] = !0; + } + for (k in F) + if (d.call(F, k) && !B[k]) + return !1; + return !0; + }, l.preventInvalidHostname = function(g) { + return this._parts.preventInvalidHostname = !!g, this; + }, l.duplicateQueryParameters = function(g) { + return this._parts.duplicateQueryParameters = !!g, this; + }, l.escapeQuerySpace = function(g) { + return this._parts.escapeQuerySpace = !!g, this; + }, s; + }); +})(URI); +var URIExports = URI.exports; +const Uri = /* @__PURE__ */ getDefaultExportFromCjs(URIExports); +function appendForwardSlash(e) { + return (e.length === 0 || e[e.length - 1] !== "/") && (e = `${e}/`), e; +} +function clone$1(e, t) { + if (e === null || typeof e != "object") + return e; + t = defaultValue(t, !1); + const n = new e.constructor(); + for (const i in e) + if (e.hasOwnProperty(i)) { + let r = e[i]; + t && (r = clone$1(r, t)), n[i] = r; + } + return n; +} +function combine$2(e, t, n) { + n = defaultValue(n, !1); + const i = {}, r = defined(e), o = defined(t); + let s, c, l; + if (r) + for (s in e) + e.hasOwnProperty(s) && (c = e[s], o && n && typeof c == "object" && t.hasOwnProperty(s) ? (l = t[s], typeof l == "object" ? i[s] = combine$2(c, l, n) : i[s] = c) : i[s] = c); + if (o) + for (s in t) + t.hasOwnProperty(s) && !i.hasOwnProperty(s) && (l = t[s], i[s] = l); + return i; +} +function defer() { + let e, t; + const n = new Promise(function(i, r) { + e = i, t = r; + }); + return { + resolve: e, + reject: t, + promise: n + }; +} +function getAbsoluteUri(e, t) { + let n; + return typeof document < "u" && (n = document), getAbsoluteUri._implementation(e, t, n); +} +getAbsoluteUri._implementation = function(e, t, n) { + if (!defined(t)) { + if (typeof n > "u") + return e; + t = defaultValue(n.baseURI, n.location.href); + } + const i = new Uri(e); + return i.scheme() !== "" ? i.toString() : i.absoluteTo(t).toString(); +}; +function getBaseUri(e, t) { + let n = ""; + const i = e.lastIndexOf("/"); + return i !== -1 && (n = e.substring(0, i + 1)), t && (e = new Uri(e), e.query().length !== 0 && (n += `?${e.query()}`), e.fragment().length !== 0 && (n += `#${e.fragment()}`)), n; +} +function getExtensionFromUri(e) { + const t = new Uri(e); + t.normalize(); + let n = t.path(), i = n.lastIndexOf("/"); + return i !== -1 && (n = n.substr(i + 1)), i = n.lastIndexOf("."), i === -1 ? n = "" : n = n.substr(i + 1), n; +} +const context2DsByWidthAndHeight = {}; +function getImagePixels(e, t, n) { + defined(t) || (t = e.width), defined(n) || (n = e.height); + let i = context2DsByWidthAndHeight[t]; + defined(i) || (i = {}, context2DsByWidthAndHeight[t] = i); + let r = i[n]; + if (!defined(r)) { + const o = document.createElement("canvas"); + o.width = t, o.height = n, r = o.getContext("2d", { willReadFrequently: !0 }), r.globalCompositeOperation = "copy", i[n] = r; + } + return r.drawImage(e, 0, 0, t, n), r.getImageData(0, 0, t, n).data; +} +const blobUriRegex = /^blob:/i; +function isBlobUri(e) { + return blobUriRegex.test(e); +} +let a$1; +function isCrossOriginUrl(e) { + defined(a$1) || (a$1 = document.createElement("a")), a$1.href = window.location.href; + const t = a$1.host, n = a$1.protocol; + return a$1.href = e, a$1.href = a$1.href, n !== a$1.protocol || t !== a$1.host; +} +const dataUriRegex$1 = /^data:/i; +function isDataUri(e) { + return dataUriRegex$1.test(e); +} +function loadAndExecuteScript(e) { + const t = document.createElement("script"); + return t.async = !0, t.src = e, new Promise((n, i) => { + window.crossOriginIsolated && t.setAttribute("crossorigin", "anonymous"); + const r = document.getElementsByTagName("head")[0]; + t.onload = function() { + t.onload = void 0, r.removeChild(t), n(); + }, t.onerror = function(o) { + i(o); + }, r.appendChild(t); + }); +} +function objectToQuery(e) { + let t = ""; + for (const n in e) + if (e.hasOwnProperty(n)) { + const i = e[n], r = `${encodeURIComponent(n)}=`; + if (Array.isArray(i)) + for (let o = 0, s = i.length; o < s; ++o) + t += `${r + encodeURIComponent(i[o])}&`; + else + t += `${r + encodeURIComponent(i)}&`; + } + return t = t.slice(0, -1), t; +} +function queryToObject(e) { + const t = {}; + if (e === "") + return t; + const n = e.replace(/\+/g, "%20").split(/[&;]/); + for (let i = 0, r = n.length; i < r; ++i) { + const o = n[i].split("="), s = decodeURIComponent(o[0]); + let c = o[1]; + defined(c) ? c = decodeURIComponent(c) : c = ""; + const l = t[s]; + typeof l == "string" ? t[s] = [l, c] : Array.isArray(l) ? l.push(c) : t[s] = c; + } + return t; +} +const RequestState = { + /** + * Initial unissued state. + * + * @type {number} + * @constant + */ + UNISSUED: 0, + /** + * Issued but not yet active. Will become active when open slots are available. + * + * @type {number} + * @constant + */ + ISSUED: 1, + /** + * Actual http request has been sent. + * + * @type {number} + * @constant + */ + ACTIVE: 2, + /** + * Request completed successfully. + * + * @type {number} + * @constant + */ + RECEIVED: 3, + /** + * Request was cancelled, either explicitly or automatically because of low priority. + * + * @type {number} + * @constant + */ + CANCELLED: 4, + /** + * Request failed. + * + * @type {number} + * @constant + */ + FAILED: 5 +}, RequestState$1 = Object.freeze(RequestState), RequestType = { + /** + * Terrain request. + * + * @type {number} + * @constant + */ + TERRAIN: 0, + /** + * Imagery request. + * + * @type {number} + * @constant + */ + IMAGERY: 1, + /** + * 3D Tiles request. + * + * @type {number} + * @constant + */ + TILES3D: 2, + /** + * Other request. + * + * @type {number} + * @constant + */ + OTHER: 3 +}, RequestType$1 = Object.freeze(RequestType); +function Request(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.throttleByServer, !1), n = defaultValue(e.throttle, !1); + this.url = e.url, this.requestFunction = e.requestFunction, this.cancelFunction = e.cancelFunction, this.priorityFunction = e.priorityFunction, this.priority = defaultValue(e.priority, 0), this.throttle = n, this.throttleByServer = t, this.type = defaultValue(e.type, RequestType$1.OTHER), this.serverKey = e.serverKey, this.state = RequestState$1.UNISSUED, this.deferred = void 0, this.cancelled = !1; +} +Request.prototype.cancel = function() { + this.cancelled = !0; +}; +Request.prototype.clone = function(e) { + return defined(e) ? (e.url = this.url, e.requestFunction = this.requestFunction, e.cancelFunction = this.cancelFunction, e.priorityFunction = this.priorityFunction, e.priority = this.priority, e.throttle = this.throttle, e.throttleByServer = this.throttleByServer, e.type = this.type, e.serverKey = this.serverKey, e.state = RequestState$1.UNISSUED, e.deferred = void 0, e.cancelled = !1, e) : new Request(this); +}; +function parseResponseHeaders(e) { + const t = {}; + if (!e) + return t; + const n = e.split(`\r +`); + for (let i = 0; i < n.length; ++i) { + const r = n[i], o = r.indexOf(": "); + if (o > 0) { + const s = r.substring(0, o), c = r.substring(o + 2); + t[s] = c; + } + } + return t; +} +function RequestErrorEvent(e, t, n) { + this.statusCode = e, this.response = t, this.responseHeaders = n, typeof this.responseHeaders == "string" && (this.responseHeaders = parseResponseHeaders(this.responseHeaders)); +} +RequestErrorEvent.prototype.toString = function() { + let e = "Request has failed."; + return defined(this.statusCode) && (e += ` Status Code: ${this.statusCode}`), e; +}; +function Event() { + this._listeners = [], this._scopes = [], this._toRemove = [], this._insideRaiseEvent = !1; +} +Object.defineProperties(Event.prototype, { + /** + * The number of listeners currently subscribed to the event. + * @memberof Event.prototype + * @type {number} + * @readonly + */ + numberOfListeners: { + get: function() { + return this._listeners.length - this._toRemove.length; + } + } +}); +Event.prototype.addEventListener = function(e, t) { + this._listeners.push(e), this._scopes.push(t); + const n = this; + return function() { + n.removeEventListener(e, t); + }; +}; +Event.prototype.removeEventListener = function(e, t) { + const n = this._listeners, i = this._scopes; + let r = -1; + for (let o = 0; o < n.length; o++) + if (n[o] === e && i[o] === t) { + r = o; + break; + } + return r !== -1 ? (this._insideRaiseEvent ? (this._toRemove.push(r), n[r] = void 0, i[r] = void 0) : (n.splice(r, 1), i.splice(r, 1)), !0) : !1; +}; +function compareNumber(e, t) { + return t - e; +} +Event.prototype.raiseEvent = function() { + this._insideRaiseEvent = !0; + let e; + const t = this._listeners, n = this._scopes; + let i = t.length; + for (e = 0; e < i; e++) { + const o = t[e]; + defined(o) && t[e].apply(n[e], arguments); + } + const r = this._toRemove; + if (i = r.length, i > 0) { + for (r.sort(compareNumber), e = 0; e < i; e++) { + const o = r[e]; + t.splice(o, 1), n.splice(o, 1); + } + r.length = 0; + } + this._insideRaiseEvent = !1; +}; +function Heap(e) { + this._comparator = e.comparator, this._array = [], this._length = 0, this._maximumLength = void 0; +} +Object.defineProperties(Heap.prototype, { + /** + * Gets the length of the heap. + * + * @memberof Heap.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + }, + /** + * Gets the internal array. + * + * @memberof Heap.prototype + * + * @type {Array} + * @readonly + */ + internalArray: { + get: function() { + return this._array; + } + }, + /** + * Gets and sets the maximum length of the heap. + * + * @memberof Heap.prototype + * + * @type {number} + */ + maximumLength: { + get: function() { + return this._maximumLength; + }, + set: function(e) { + const t = this._length; + if (e < t) { + const n = this._array; + for (let i = e; i < t; ++i) + n[i] = void 0; + this._length = e, n.length = e; + } + this._maximumLength = e; + } + }, + /** + * The comparator to use for the heap. If comparator(a, b) is less than 0, sort a to a lower index than b, otherwise sort to a higher index. + * + * @memberof Heap.prototype + * + * @type {Heap.ComparatorCallback} + */ + comparator: { + get: function() { + return this._comparator; + } + } +}); +function swap$3(e, t, n) { + const i = e[t]; + e[t] = e[n], e[n] = i; +} +Heap.prototype.reserve = function(e) { + e = defaultValue(e, this._length), this._array.length = e; +}; +Heap.prototype.heapify = function(e) { + e = defaultValue(e, 0); + const t = this._length, n = this._comparator, i = this._array; + let r = -1, o = !0; + for (; o; ) { + const s = 2 * (e + 1), c = s - 1; + c < t && n(i[c], i[e]) < 0 ? r = c : r = e, s < t && n(i[s], i[r]) < 0 && (r = s), r !== e ? (swap$3(i, r, e), e = r) : o = !1; + } +}; +Heap.prototype.resort = function() { + const e = this._length; + for (let t = Math.ceil(e / 2); t >= 0; --t) + this.heapify(t); +}; +Heap.prototype.insert = function(e) { + const t = this._array, n = this._comparator, i = this._maximumLength; + let r = this._length++; + for (r < t.length ? t[r] = e : t.push(e); r !== 0; ) { + const s = Math.floor((r - 1) / 2); + if (n(t[r], t[s]) < 0) + swap$3(t, r, s), r = s; + else + break; + } + let o; + return defined(i) && this._length > i && (o = t[i], this._length = i), o; +}; +Heap.prototype.pop = function(e) { + if (e = defaultValue(e, 0), this._length === 0) + return; + const t = this._array, n = t[e]; + return swap$3(t, e, --this._length), this.heapify(e), t[this._length] = void 0, n; +}; +function sortRequests(e, t) { + return e.priority - t.priority; +} +const statistics = { + numberOfAttemptedRequests: 0, + numberOfActiveRequests: 0, + numberOfCancelledRequests: 0, + numberOfCancelledActiveRequests: 0, + numberOfFailedRequests: 0, + numberOfActiveRequestsEver: 0, + lastNumberOfActiveRequests: 0 +}; +let priorityHeapLength = 20; +const requestHeap = new Heap({ + comparator: sortRequests +}); +requestHeap.maximumLength = priorityHeapLength; +requestHeap.reserve(priorityHeapLength); +const activeRequests = []; +let numberOfActiveRequestsByServer = {}; +const pageUri = typeof document < "u" ? new Uri(document.location.href) : new Uri(), requestCompletedEvent = new Event(); +function RequestScheduler() { +} +RequestScheduler.maximumRequests = 50; +RequestScheduler.maximumRequestsPerServer = 18; +RequestScheduler.requestsByServer = {}; +RequestScheduler.throttleRequests = !0; +RequestScheduler.debugShowStatistics = !1; +RequestScheduler.requestCompletedEvent = requestCompletedEvent; +Object.defineProperties(RequestScheduler, { + /** + * Returns the statistics used by the request scheduler. + * + * @memberof RequestScheduler + * + * @type {object} + * @readonly + * @private + */ + statistics: { + get: function() { + return statistics; + } + }, + /** + * The maximum size of the priority heap. This limits the number of requests that are sorted by priority. Only applies to requests that are not yet active. + * + * @memberof RequestScheduler + * + * @type {number} + * @default 20 + * @private + */ + priorityHeapLength: { + get: function() { + return priorityHeapLength; + }, + set: function(e) { + if (e < priorityHeapLength) + for (; requestHeap.length > e; ) { + const t = requestHeap.pop(); + cancelRequest(t); + } + priorityHeapLength = e, requestHeap.maximumLength = e, requestHeap.reserve(e); + } + } +}); +function updatePriority(e) { + defined(e.priorityFunction) && (e.priority = e.priorityFunction()); +} +RequestScheduler.serverHasOpenSlots = function(e, t) { + t = defaultValue(t, 1); + const n = defaultValue( + RequestScheduler.requestsByServer[e], + RequestScheduler.maximumRequestsPerServer + ); + return numberOfActiveRequestsByServer[e] + t <= n; +}; +RequestScheduler.heapHasOpenSlots = function(e) { + return requestHeap.length + e <= priorityHeapLength; +}; +function issueRequest(e) { + return e.state === RequestState$1.UNISSUED && (e.state = RequestState$1.ISSUED, e.deferred = defer()), e.deferred.promise; +} +function getRequestReceivedFunction(e) { + return function(t) { + if (e.state === RequestState$1.CANCELLED) + return; + const n = e.deferred; + --statistics.numberOfActiveRequests, --numberOfActiveRequestsByServer[e.serverKey], requestCompletedEvent.raiseEvent(), e.state = RequestState$1.RECEIVED, e.deferred = void 0, n.resolve(t); + }; +} +function getRequestFailedFunction(e) { + return function(t) { + e.state !== RequestState$1.CANCELLED && (++statistics.numberOfFailedRequests, --statistics.numberOfActiveRequests, --numberOfActiveRequestsByServer[e.serverKey], requestCompletedEvent.raiseEvent(t), e.state = RequestState$1.FAILED, e.deferred.reject(t)); + }; +} +function startRequest(e) { + const t = issueRequest(e); + return e.state = RequestState$1.ACTIVE, activeRequests.push(e), ++statistics.numberOfActiveRequests, ++statistics.numberOfActiveRequestsEver, ++numberOfActiveRequestsByServer[e.serverKey], e.requestFunction().then(getRequestReceivedFunction(e)).catch(getRequestFailedFunction(e)), t; +} +function cancelRequest(e) { + const t = e.state === RequestState$1.ACTIVE; + if (e.state = RequestState$1.CANCELLED, ++statistics.numberOfCancelledRequests, defined(e.deferred)) { + const n = e.deferred; + e.deferred = void 0, n.reject(); + } + t && (--statistics.numberOfActiveRequests, --numberOfActiveRequestsByServer[e.serverKey], ++statistics.numberOfCancelledActiveRequests), defined(e.cancelFunction) && e.cancelFunction(); +} +RequestScheduler.update = function() { + let e, t, n = 0; + const i = activeRequests.length; + for (e = 0; e < i; ++e) { + if (t = activeRequests[e], t.cancelled && cancelRequest(t), t.state !== RequestState$1.ACTIVE) { + ++n; + continue; + } + n > 0 && (activeRequests[e - n] = t); + } + activeRequests.length -= n; + const r = requestHeap.internalArray, o = requestHeap.length; + for (e = 0; e < o; ++e) + updatePriority(r[e]); + requestHeap.resort(); + const s = Math.max( + RequestScheduler.maximumRequests - activeRequests.length, + 0 + ); + let c = 0; + for (; c < s && requestHeap.length > 0; ) { + if (t = requestHeap.pop(), t.cancelled) { + cancelRequest(t); + continue; + } + if (t.throttleByServer && !RequestScheduler.serverHasOpenSlots(t.serverKey)) { + cancelRequest(t); + continue; + } + startRequest(t), ++c; + } + updateStatistics(); +}; +RequestScheduler.getServerKey = function(e) { + let t = new Uri(e); + t.scheme() === "" && (t = t.absoluteTo(pageUri), t.normalize()); + let n = t.authority(); + /:/.test(n) || (n = `${n}:${t.scheme() === "https" ? "443" : "80"}`); + const i = numberOfActiveRequestsByServer[n]; + return defined(i) || (numberOfActiveRequestsByServer[n] = 0), n; +}; +RequestScheduler.request = function(e) { + if (isDataUri(e.url) || isBlobUri(e.url)) + return requestCompletedEvent.raiseEvent(), e.state = RequestState$1.RECEIVED, e.requestFunction(); + if (++statistics.numberOfAttemptedRequests, defined(e.serverKey) || (e.serverKey = RequestScheduler.getServerKey(e.url)), RequestScheduler.throttleRequests && e.throttleByServer && !RequestScheduler.serverHasOpenSlots(e.serverKey)) + return; + if (!RequestScheduler.throttleRequests || !e.throttle) + return startRequest(e); + if (activeRequests.length >= RequestScheduler.maximumRequests) + return; + updatePriority(e); + const t = requestHeap.insert(e); + if (defined(t)) { + if (t === e) + return; + cancelRequest(t); + } + return issueRequest(e); +}; +function updateStatistics() { + RequestScheduler.debugShowStatistics && (statistics.numberOfActiveRequests === 0 && statistics.lastNumberOfActiveRequests > 0 && (statistics.numberOfAttemptedRequests > 0 && (console.log( + `Number of attempted requests: ${statistics.numberOfAttemptedRequests}` + ), statistics.numberOfAttemptedRequests = 0), statistics.numberOfCancelledRequests > 0 && (console.log( + `Number of cancelled requests: ${statistics.numberOfCancelledRequests}` + ), statistics.numberOfCancelledRequests = 0), statistics.numberOfCancelledActiveRequests > 0 && (console.log( + `Number of cancelled active requests: ${statistics.numberOfCancelledActiveRequests}` + ), statistics.numberOfCancelledActiveRequests = 0), statistics.numberOfFailedRequests > 0 && (console.log( + `Number of failed requests: ${statistics.numberOfFailedRequests}` + ), statistics.numberOfFailedRequests = 0)), statistics.lastNumberOfActiveRequests = statistics.numberOfActiveRequests); +} +RequestScheduler.clearForSpecs = function() { + for (; requestHeap.length > 0; ) { + const t = requestHeap.pop(); + cancelRequest(t); + } + const e = activeRequests.length; + for (let t = 0; t < e; ++t) + cancelRequest(activeRequests[t]); + activeRequests.length = 0, numberOfActiveRequestsByServer = {}, statistics.numberOfAttemptedRequests = 0, statistics.numberOfActiveRequests = 0, statistics.numberOfCancelledRequests = 0, statistics.numberOfCancelledActiveRequests = 0, statistics.numberOfFailedRequests = 0, statistics.numberOfActiveRequestsEver = 0, statistics.lastNumberOfActiveRequests = 0; +}; +RequestScheduler.numberOfActiveRequestsByServer = function(e) { + return numberOfActiveRequestsByServer[e]; +}; +RequestScheduler.requestHeap = requestHeap; +const TrustedServers = {}; +let _servers = {}; +TrustedServers.add = function(e, t) { + const n = `${e.toLowerCase()}:${t}`; + defined(_servers[n]) || (_servers[n] = !0); +}; +TrustedServers.remove = function(e, t) { + const n = `${e.toLowerCase()}:${t}`; + defined(_servers[n]) && delete _servers[n]; +}; +function getAuthority(e) { + const t = new Uri(e); + t.normalize(); + let n = t.authority(); + if (n.length !== 0) { + if (t.authority(n), n.indexOf("@") !== -1 && (n = n.split("@")[1]), n.indexOf(":") === -1) { + let i = t.scheme(); + if (i.length === 0 && (i = window.location.protocol, i = i.substring(0, i.length - 1)), i === "http") + n += ":80"; + else if (i === "https") + n += ":443"; + else + return; + } + return n; + } +} +TrustedServers.contains = function(e) { + const t = getAuthority(e); + return !!(defined(t) && defined(_servers[t])); +}; +TrustedServers.clear = function() { + _servers = {}; +}; +const xhrBlobSupported = function() { + try { + const e = new XMLHttpRequest(); + return e.open("GET", "#", !0), e.responseType = "blob", e.responseType === "blob"; + } catch { + return !1; + } +}(); +function Resource(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), typeof e == "string" && (e = { + url: e + }), this._url = void 0, this._templateValues = defaultClone(e.templateValues, {}), this._queryParameters = defaultClone(e.queryParameters, {}), this.headers = defaultClone(e.headers, {}), this.request = defaultValue(e.request, new Request()), this.proxy = e.proxy, this.retryCallback = e.retryCallback, this.retryAttempts = defaultValue(e.retryAttempts, 0), this._retryCount = 0, defaultValue(e.parseUrl, !0) ? this.parseUrl(e.url, !0, !0) : this._url = e.url, this._credits = e.credits; +} +function defaultClone(e, t) { + return defined(e) ? clone$1(e) : t; +} +Resource.createIfNeeded = function(e) { + return e instanceof Resource ? e.getDerivedResource({ + request: e.request + }) : typeof e != "string" ? e : new Resource({ + url: e + }); +}; +let supportsImageBitmapOptionsPromise; +Resource.supportsImageBitmapOptions = function() { + return defined(supportsImageBitmapOptionsPromise) ? supportsImageBitmapOptionsPromise : typeof createImageBitmap != "function" ? (supportsImageBitmapOptionsPromise = Promise.resolve(!1), supportsImageBitmapOptionsPromise) : (supportsImageBitmapOptionsPromise = Resource.fetchBlob({ + url: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAABGdBTUEAAE4g3rEiDgAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADElEQVQI12Ng6GAAAAEUAIngE3ZiAAAAAElFTkSuQmCC" + }).then(function(t) { + const n = { + imageOrientation: "flipY", + // default is "none" + premultiplyAlpha: "none", + // default is "default" + colorSpaceConversion: "none" + // default is "default" + }; + return Promise.all([ + createImageBitmap(t, n), + createImageBitmap(t) + ]); + }).then(function(t) { + const n = getImagePixels(t[0]), i = getImagePixels(t[1]); + return n[1] !== i[1]; + }).catch(function() { + return !1; + }), supportsImageBitmapOptionsPromise); +}; +Object.defineProperties(Resource, { + /** + * Returns true if blobs are supported. + * + * @memberof Resource + * @type {boolean} + * + * @readonly + */ + isBlobSupported: { + get: function() { + return xhrBlobSupported; + } + } +}); +Object.defineProperties(Resource.prototype, { + /** + * Query parameters appended to the url. + * + * @memberof Resource.prototype + * @type {object} + * + * @readonly + */ + queryParameters: { + get: function() { + return this._queryParameters; + } + }, + /** + * The key/value pairs used to replace template parameters in the url. + * + * @memberof Resource.prototype + * @type {object} + * + * @readonly + */ + templateValues: { + get: function() { + return this._templateValues; + } + }, + /** + * The url to the resource with template values replaced, query string appended and encoded by proxy if one was set. + * + * @memberof Resource.prototype + * @type {string} + */ + url: { + get: function() { + return this.getUrlComponent(!0, !0); + }, + set: function(e) { + this.parseUrl(e, !1, !1); + } + }, + /** + * The file extension of the resource. + * + * @memberof Resource.prototype + * @type {string} + * + * @readonly + */ + extension: { + get: function() { + return getExtensionFromUri(this._url); + } + }, + /** + * True if the Resource refers to a data URI. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isDataUri: { + get: function() { + return isDataUri(this._url); + } + }, + /** + * True if the Resource refers to a blob URI. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isBlobUri: { + get: function() { + return isBlobUri(this._url); + } + }, + /** + * True if the Resource refers to a cross origin URL. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isCrossOriginUrl: { + get: function() { + return isCrossOriginUrl(this._url); + } + }, + /** + * True if the Resource has request headers. This is equivalent to checking if the headers property has any keys. + * + * @memberof Resource.prototype + * @type {boolean} + */ + hasHeaders: { + get: function() { + return Object.keys(this.headers).length > 0; + } + }, + /** + * Gets the credits required for attribution of an asset. + * @private + */ + credits: { + get: function() { + return this._credits; + } + } +}); +Resource.prototype.toString = function() { + return this.getUrlComponent(!0, !0); +}; +Resource.prototype.parseUrl = function(e, t, n, i) { + let r = new Uri(e); + const o = parseQueryString(r.query()); + this._queryParameters = t ? combineQueryParameters(o, this.queryParameters, n) : o, r.search(""), r.fragment(""), defined(i) && r.scheme() === "" && (r = r.absoluteTo(getAbsoluteUri(i))), this._url = r.toString(); +}; +function parseQueryString(e) { + return e.length === 0 ? {} : e.indexOf("=") === -1 ? { [e]: void 0 } : queryToObject(e); +} +function combineQueryParameters(e, t, n) { + if (!n) + return combine$2(e, t); + const i = clone$1(e, !0); + for (const r in t) + if (t.hasOwnProperty(r)) { + let o = i[r]; + const s = t[r]; + defined(o) ? (Array.isArray(o) || (o = i[r] = [o]), i[r] = o.concat(s)) : i[r] = Array.isArray(s) ? s.slice() : s; + } + return i; +} +Resource.prototype.getUrlComponent = function(e, t) { + if (this.isDataUri) + return this._url; + let n = this._url; + e && (n = `${n}${stringifyQuery(this.queryParameters)}`), n = n.replace(/%7B/g, "{").replace(/%7D/g, "}"); + const i = this._templateValues; + return Object.keys(i).length > 0 && (n = n.replace(/{(.*?)}/g, function(r, o) { + const s = i[o]; + return defined(s) ? encodeURIComponent(s) : r; + })), t && defined(this.proxy) && (n = this.proxy.getURL(n)), n; +}; +function stringifyQuery(e) { + const t = Object.keys(e); + return t.length === 0 ? "" : t.length === 1 && !defined(e[t[0]]) ? `?${t[0]}` : `?${objectToQuery(e)}`; +} +Resource.prototype.setQueryParameters = function(e, t) { + t ? this._queryParameters = combineQueryParameters( + this._queryParameters, + e, + !1 + ) : this._queryParameters = combineQueryParameters( + e, + this._queryParameters, + !1 + ); +}; +Resource.prototype.appendQueryParameters = function(e) { + this._queryParameters = combineQueryParameters( + e, + this._queryParameters, + !0 + ); +}; +Resource.prototype.setTemplateValues = function(e, t) { + t ? this._templateValues = combine$2(this._templateValues, e) : this._templateValues = combine$2(e, this._templateValues); +}; +Resource.prototype.getDerivedResource = function(e) { + const t = this.clone(); + if (t._retryCount = 0, defined(e.url)) { + const n = defaultValue(e.preserveQueryParameters, !1); + t.parseUrl(e.url, !0, n, this._url); + } + return defined(e.queryParameters) && (t._queryParameters = combine$2( + e.queryParameters, + t.queryParameters + )), defined(e.templateValues) && (t._templateValues = combine$2( + e.templateValues, + t.templateValues + )), defined(e.headers) && (t.headers = combine$2(e.headers, t.headers)), defined(e.proxy) && (t.proxy = e.proxy), defined(e.request) && (t.request = e.request), defined(e.retryCallback) && (t.retryCallback = e.retryCallback), defined(e.retryAttempts) && (t.retryAttempts = e.retryAttempts), t; +}; +Resource.prototype.retryOnError = function(e) { + const t = this.retryCallback; + if (typeof t != "function" || this._retryCount >= this.retryAttempts) + return Promise.resolve(!1); + const n = this; + return Promise.resolve(t(this, e)).then(function(i) { + return ++n._retryCount, i; + }); +}; +Resource.prototype.clone = function(e) { + return defined(e) ? (e._url = this._url, e._queryParameters = clone$1(this._queryParameters), e._templateValues = clone$1(this._templateValues), e.headers = clone$1(this.headers), e.proxy = this.proxy, e.retryCallback = this.retryCallback, e.retryAttempts = this.retryAttempts, e._retryCount = 0, e.request = this.request.clone(), e) : new Resource({ + url: this._url, + queryParameters: this.queryParameters, + templateValues: this.templateValues, + headers: this.headers, + proxy: this.proxy, + retryCallback: this.retryCallback, + retryAttempts: this.retryAttempts, + request: this.request.clone(), + parseUrl: !1, + credits: defined(this.credits) ? this.credits.slice() : void 0 + }); +}; +Resource.prototype.getBaseUri = function(e) { + return getBaseUri(this.getUrlComponent(e), e); +}; +Resource.prototype.appendForwardSlash = function() { + this._url = appendForwardSlash(this._url); +}; +Resource.prototype.fetchArrayBuffer = function() { + return this.fetch({ + responseType: "arraybuffer" + }); +}; +Resource.fetchArrayBuffer = function(e) { + return new Resource(e).fetchArrayBuffer(); +}; +Resource.prototype.fetchBlob = function() { + return this.fetch({ + responseType: "blob" + }); +}; +Resource.fetchBlob = function(e) { + return new Resource(e).fetchBlob(); +}; +Resource.prototype.fetchImage = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.preferImageBitmap, !1), n = defaultValue(e.preferBlob, !1), i = defaultValue(e.flipY, !1), r = defaultValue( + e.skipColorSpaceConversion, + !1 + ); + if (checkAndResetRequest(this.request), !xhrBlobSupported || this.isDataUri || this.isBlobUri || !this.hasHeaders && !n) + return fetchImage({ + resource: this, + flipY: i, + skipColorSpaceConversion: r, + preferImageBitmap: t + }); + const o = this.fetchBlob(); + if (!defined(o)) + return; + let s, c, l, d; + return Resource.supportsImageBitmapOptions().then(function(f) { + return s = f, c = s && t, o; + }).then(function(f) { + if (!defined(f)) + return; + if (d = f, c) + return Resource.createImageBitmapFromBlob(f, { + flipY: i, + premultiplyAlpha: !1, + skipColorSpaceConversion: r + }); + const h = window.URL.createObjectURL(f); + return l = new Resource({ + url: h + }), fetchImage({ + resource: l, + flipY: i, + skipColorSpaceConversion: r, + preferImageBitmap: !1 + }); + }).then(function(f) { + if (defined(f)) + return f.blob = d, c || window.URL.revokeObjectURL(l.url), f; + }).catch(function(f) { + return defined(l) && window.URL.revokeObjectURL(l.url), f.blob = d, Promise.reject(f); + }); +}; +function fetchImage(e) { + const t = e.resource, n = e.flipY, i = e.skipColorSpaceConversion, r = e.preferImageBitmap, o = t.request; + o.url = t.url, o.requestFunction = function() { + let c = !1; + !t.isDataUri && !t.isBlobUri && (c = t.isCrossOriginUrl); + const l = defer(); + return Resource._Implementations.createImage( + o, + c, + l, + n, + i, + r + ), l.promise; + }; + const s = RequestScheduler.request(o); + if (defined(s)) + return s.catch(function(c) { + return o.state !== RequestState$1.FAILED ? Promise.reject(c) : t.retryOnError(c).then(function(l) { + return l ? (o.state = RequestState$1.UNISSUED, o.deferred = void 0, fetchImage({ + resource: t, + flipY: n, + skipColorSpaceConversion: i, + preferImageBitmap: r + })) : Promise.reject(c); + }); + }); +} +Resource.fetchImage = function(e) { + return new Resource(e).fetchImage({ + flipY: e.flipY, + skipColorSpaceConversion: e.skipColorSpaceConversion, + preferBlob: e.preferBlob, + preferImageBitmap: e.preferImageBitmap + }); +}; +Resource.prototype.fetchText = function() { + return this.fetch({ + responseType: "text" + }); +}; +Resource.fetchText = function(e) { + return new Resource(e).fetchText(); +}; +Resource.prototype.fetchJson = function() { + const e = this.fetch({ + responseType: "text", + headers: { + Accept: "application/json,*/*;q=0.01" + } + }); + if (defined(e)) + return e.then(function(t) { + if (defined(t)) + return JSON.parse(t); + }); +}; +Resource.fetchJson = function(e) { + return new Resource(e).fetchJson(); +}; +Resource.prototype.fetchXML = function() { + return this.fetch({ + responseType: "document", + overrideMimeType: "text/xml" + }); +}; +Resource.fetchXML = function(e) { + return new Resource(e).fetchXML(); +}; +Resource.prototype.fetchJsonp = function(e) { + e = defaultValue(e, "callback"), checkAndResetRequest(this.request); + let t; + do + t = `loadJsonp${CesiumMath.nextRandomNumber().toString().substring(2, 8)}`; + while (defined(window[t])); + return fetchJsonp(this, e, t); +}; +function fetchJsonp(e, t, n) { + const i = {}; + i[t] = n, e.setQueryParameters(i); + const r = e.request, o = e.url; + r.url = o, r.requestFunction = function() { + const c = defer(); + return window[n] = function(l) { + c.resolve(l); + try { + delete window[n]; + } catch { + window[n] = void 0; + } + }, Resource._Implementations.loadAndExecuteScript(o, n, c), c.promise; + }; + const s = RequestScheduler.request(r); + if (defined(s)) + return s.catch(function(c) { + return r.state !== RequestState$1.FAILED ? Promise.reject(c) : e.retryOnError(c).then(function(l) { + return l ? (r.state = RequestState$1.UNISSUED, r.deferred = void 0, fetchJsonp(e, t, n)) : Promise.reject(c); + }); + }); +} +Resource.fetchJsonp = function(e) { + return new Resource(e).fetchJsonp(e.callbackParameterName); +}; +Resource.prototype._makeRequest = function(e) { + const t = this; + checkAndResetRequest(t.request); + const n = t.request, i = t.url; + n.url = i, n.requestFunction = function() { + const o = e.responseType, s = combine$2(e.headers, t.headers), c = e.overrideMimeType, l = e.method, d = e.data, f = defer(), h = Resource._Implementations.loadWithXhr( + i, + o, + l, + d, + s, + f, + c + ); + return defined(h) && defined(h.abort) && (n.cancelFunction = function() { + h.abort(); + }), f.promise; + }; + const r = RequestScheduler.request(n); + if (defined(r)) + return r.then(function(o) { + return n.cancelFunction = void 0, o; + }).catch(function(o) { + return n.cancelFunction = void 0, n.state !== RequestState$1.FAILED ? Promise.reject(o) : t.retryOnError(o).then(function(s) { + return s ? (n.state = RequestState$1.UNISSUED, n.deferred = void 0, t.fetch(e)) : Promise.reject(o); + }); + }); +}; +function checkAndResetRequest(e) { + if (e.state === RequestState$1.ISSUED || e.state === RequestState$1.ACTIVE) + throw new RuntimeError("The Resource is already being fetched."); + e.state = RequestState$1.UNISSUED, e.deferred = void 0; +} +const dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; +function decodeDataUriText(e, t) { + const n = decodeURIComponent(t); + return e ? atob(n) : n; +} +function decodeDataUriArrayBuffer(e, t) { + const n = decodeDataUriText(e, t), i = new ArrayBuffer(n.length), r = new Uint8Array(i); + for (let o = 0; o < n.length; o++) + r[o] = n.charCodeAt(o); + return i; +} +function decodeDataUri(e, t) { + t = defaultValue(t, ""); + const n = e[1], i = !!e[2], r = e[3]; + let o, s; + switch (t) { + case "": + case "text": + return decodeDataUriText(i, r); + case "arraybuffer": + return decodeDataUriArrayBuffer(i, r); + case "blob": + return o = decodeDataUriArrayBuffer(i, r), new Blob([o], { + type: n + }); + case "document": + return s = new DOMParser(), s.parseFromString( + decodeDataUriText(i, r), + n + ); + case "json": + return JSON.parse(decodeDataUriText(i, r)); + } +} +Resource.prototype.fetch = function(e) { + return e = defaultClone(e, {}), e.method = "GET", this._makeRequest(e); +}; +Resource.fetch = function(e) { + return new Resource(e).fetch({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource.prototype.delete = function(e) { + return e = defaultClone(e, {}), e.method = "DELETE", this._makeRequest(e); +}; +Resource.delete = function(e) { + return new Resource(e).delete({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: e.responseType, + overrideMimeType: e.overrideMimeType, + data: e.data + }); +}; +Resource.prototype.head = function(e) { + return e = defaultClone(e, {}), e.method = "HEAD", this._makeRequest(e); +}; +Resource.head = function(e) { + return new Resource(e).head({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource.prototype.options = function(e) { + return e = defaultClone(e, {}), e.method = "OPTIONS", this._makeRequest(e); +}; +Resource.options = function(e) { + return new Resource(e).options({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource.prototype.post = function(e, t) { + return Check.defined("data", e), t = defaultClone(t, {}), t.method = "POST", t.data = e, this._makeRequest(t); +}; +Resource.post = function(e) { + return new Resource(e).post(e.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource.prototype.put = function(e, t) { + return Check.defined("data", e), t = defaultClone(t, {}), t.method = "PUT", t.data = e, this._makeRequest(t); +}; +Resource.put = function(e) { + return new Resource(e).put(e.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource.prototype.patch = function(e, t) { + return Check.defined("data", e), t = defaultClone(t, {}), t.method = "PATCH", t.data = e, this._makeRequest(t); +}; +Resource.patch = function(e) { + return new Resource(e).patch(e.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: e.responseType, + overrideMimeType: e.overrideMimeType + }); +}; +Resource._Implementations = {}; +Resource._Implementations.loadImageElement = function(e, t, n) { + const i = new Image(); + i.onload = function() { + i.naturalWidth === 0 && i.naturalHeight === 0 && i.width === 0 && i.height === 0 && (i.width = 300, i.height = 150), n.resolve(i); + }, i.onerror = function(r) { + n.reject(r); + }, t && (TrustedServers.contains(e) ? i.crossOrigin = "use-credentials" : i.crossOrigin = ""), i.src = e; +}; +Resource._Implementations.createImage = function(e, t, n, i, r, o) { + const s = e.url; + Resource.supportsImageBitmapOptions().then(function(c) { + if (!(c && o)) { + Resource._Implementations.loadImageElement(s, t, n); + return; + } + const l = "blob", d = "GET", f = defer(), h = Resource._Implementations.loadWithXhr( + s, + l, + d, + void 0, + void 0, + f, + void 0, + void 0, + void 0 + ); + return defined(h) && defined(h.abort) && (e.cancelFunction = function() { + h.abort(); + }), f.promise.then(function(p) { + if (!defined(p)) { + n.reject( + new RuntimeError( + `Successfully retrieved ${s} but it contained no content.` + ) + ); + return; + } + return Resource.createImageBitmapFromBlob(p, { + flipY: i, + premultiplyAlpha: !1, + skipColorSpaceConversion: r + }); + }).then(function(p) { + n.resolve(p); + }); + }).catch(function(c) { + n.reject(c); + }); +}; +Resource.createImageBitmapFromBlob = function(e, t) { + return Check.defined("options", t), Check.typeOf.bool("options.flipY", t.flipY), Check.typeOf.bool("options.premultiplyAlpha", t.premultiplyAlpha), Check.typeOf.bool( + "options.skipColorSpaceConversion", + t.skipColorSpaceConversion + ), createImageBitmap(e, { + imageOrientation: t.flipY ? "flipY" : "none", + premultiplyAlpha: t.premultiplyAlpha ? "premultiply" : "none", + colorSpaceConversion: t.skipColorSpaceConversion ? "none" : "default" + }); +}; +function loadWithHttpRequest(e, t, n, i, r, o, s) { + fetch(e, { + method: n, + headers: r + }).then(async (c) => { + if (!c.ok) { + const l = {}; + c.headers.forEach((d, f) => { + l[f] = d; + }), o.reject( + new RequestErrorEvent(c.status, c, l) + ); + return; + } + switch (t) { + case "text": + o.resolve(c.text()); + break; + case "json": + o.resolve(c.json()); + break; + default: + o.resolve(new Uint8Array(await c.arrayBuffer()).buffer); + break; + } + }).catch(() => { + o.reject(new RequestErrorEvent()); + }); +} +const noXMLHttpRequest = typeof XMLHttpRequest > "u"; +Resource._Implementations.loadWithXhr = function(e, t, n, i, r, o, s) { + const c = dataUriRegex.exec(e); + if (c !== null) { + o.resolve(decodeDataUri(c, t)); + return; + } + if (noXMLHttpRequest) { + loadWithHttpRequest( + e, + t, + n, + i, + r, + o + ); + return; + } + const l = new XMLHttpRequest(); + if (TrustedServers.contains(e) && (l.withCredentials = !0), l.open(n, e, !0), defined(s) && defined(l.overrideMimeType) && l.overrideMimeType(s), defined(r)) + for (const f in r) + r.hasOwnProperty(f) && l.setRequestHeader(f, r[f]); + defined(t) && (l.responseType = t); + let d = !1; + return typeof e == "string" && (d = e.indexOf("file://") === 0 || typeof window < "u" && window.location.origin === "file://"), l.onload = function() { + if ((l.status < 200 || l.status >= 300) && !(d && l.status === 0)) { + o.reject( + new RequestErrorEvent( + l.status, + l.response, + l.getAllResponseHeaders() + ) + ); + return; + } + const f = l.response, h = l.responseType; + if (n === "HEAD" || n === "OPTIONS") { + const m = l.getAllResponseHeaders().trim().split(/[\r\n]+/), _ = {}; + m.forEach(function(y) { + const C = y.split(": "), T = C.shift(); + _[T] = C.join(": "); + }), o.resolve(_); + return; + } + if (l.status === 204) + o.resolve(void 0); + else if (defined(f) && (!defined(t) || h === t)) + o.resolve(f); + else if (t === "json" && typeof f == "string") + try { + o.resolve(JSON.parse(f)); + } catch (p) { + o.reject(p); + } + else (h === "" || h === "document") && defined(l.responseXML) && l.responseXML.hasChildNodes() ? o.resolve(l.responseXML) : (h === "" || h === "text") && defined(l.responseText) ? o.resolve(l.responseText) : o.reject( + new RuntimeError("Invalid XMLHttpRequest response type.") + ); + }, l.onerror = function(f) { + o.reject(new RequestErrorEvent()); + }, l.send(i), l; +}; +Resource._Implementations.loadAndExecuteScript = function(e, t, n) { + return loadAndExecuteScript(e).catch(function(i) { + n.reject(i); + }); +}; +Resource._DefaultImplementations = {}; +Resource._DefaultImplementations.createImage = Resource._Implementations.createImage; +Resource._DefaultImplementations.loadWithXhr = Resource._Implementations.loadWithXhr; +Resource._DefaultImplementations.loadAndExecuteScript = Resource._Implementations.loadAndExecuteScript; +Resource.DEFAULT = Object.freeze( + new Resource({ + url: typeof document > "u" ? "" : document.location.href.split("?")[0] + }) +); +function EarthOrientationParameters(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._dates = void 0, this._samples = void 0, this._dateColumn = -1, this._xPoleWanderRadiansColumn = -1, this._yPoleWanderRadiansColumn = -1, this._ut1MinusUtcSecondsColumn = -1, this._xCelestialPoleOffsetRadiansColumn = -1, this._yCelestialPoleOffsetRadiansColumn = -1, this._taiMinusUtcSecondsColumn = -1, this._columnCount = 0, this._lastIndex = -1, this._addNewLeapSeconds = defaultValue(e.addNewLeapSeconds, !0), defined(e.data) ? onDataReady(this, e.data) : onDataReady(this, { + columnNames: [ + "dateIso8601", + "modifiedJulianDateUtc", + "xPoleWanderRadians", + "yPoleWanderRadians", + "ut1MinusUtcSeconds", + "lengthOfDayCorrectionSeconds", + "xCelestialPoleOffsetRadians", + "yCelestialPoleOffsetRadians", + "taiMinusUtcSeconds" + ], + samples: [] + }); +} +EarthOrientationParameters.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = Resource.createIfNeeded(e); + let i; + try { + i = await n.fetchJson(); + } catch { + throw new RuntimeError( + `An error occurred while retrieving the EOP data from the URL ${n.url}.` + ); + } + return new EarthOrientationParameters({ + addNewLeapSeconds: t.addNewLeapSeconds, + data: i + }); +}; +EarthOrientationParameters.NONE = Object.freeze({ + compute: function(e, t) { + return defined(t) ? (t.xPoleWander = 0, t.yPoleWander = 0, t.xPoleOffset = 0, t.yPoleOffset = 0, t.ut1MinusUtc = 0) : t = new EarthOrientationParametersSample(0, 0, 0, 0, 0), t; + } +}); +EarthOrientationParameters.prototype.compute = function(e, t) { + if (!defined(this._samples)) + return; + if (defined(t) || (t = new EarthOrientationParametersSample(0, 0, 0, 0, 0)), this._samples.length === 0) + return t.xPoleWander = 0, t.yPoleWander = 0, t.xPoleOffset = 0, t.yPoleOffset = 0, t.ut1MinusUtc = 0, t; + const n = this._dates, i = this._lastIndex; + let r = 0, o = 0; + if (defined(i)) { + const c = n[i], l = n[i + 1], d = JulianDate.lessThanOrEquals( + c, + e + ), f = !defined(l), h = f || JulianDate.greaterThanOrEquals(l, e); + if (d && h) + return r = i, !f && l.equals(e) && ++r, o = r + 1, interpolate(this, n, this._samples, e, r, o, t), t; + } + let s = binarySearch(n, e, JulianDate.compare, this._dateColumn); + return s >= 0 ? (s < n.length - 1 && n[s + 1].equals(e) && ++s, r = s, o = s) : (o = ~s, r = o - 1, r < 0 && (r = 0)), this._lastIndex = r, interpolate(this, n, this._samples, e, r, o, t), t; +}; +function compareLeapSecondDates(e, t) { + return JulianDate.compare(e.julianDate, t); +} +function onDataReady(e, t) { + if (!defined(t.columnNames)) + throw new RuntimeError( + "Error in loaded EOP data: The columnNames property is required." + ); + if (!defined(t.samples)) + throw new RuntimeError( + "Error in loaded EOP data: The samples property is required." + ); + const n = t.columnNames.indexOf("modifiedJulianDateUtc"), i = t.columnNames.indexOf( + "xPoleWanderRadians" + ), r = t.columnNames.indexOf( + "yPoleWanderRadians" + ), o = t.columnNames.indexOf( + "ut1MinusUtcSeconds" + ), s = t.columnNames.indexOf( + "xCelestialPoleOffsetRadians" + ), c = t.columnNames.indexOf( + "yCelestialPoleOffsetRadians" + ), l = t.columnNames.indexOf( + "taiMinusUtcSeconds" + ); + if (n < 0 || i < 0 || r < 0 || o < 0 || s < 0 || c < 0 || l < 0) + throw new RuntimeError( + "Error in loaded EOP data: The columnNames property must include modifiedJulianDateUtc, xPoleWanderRadians, yPoleWanderRadians, ut1MinusUtcSeconds, xCelestialPoleOffsetRadians, yCelestialPoleOffsetRadians, and taiMinusUtcSeconds columns" + ); + const d = e._samples = t.samples, f = e._dates = []; + e._dateColumn = n, e._xPoleWanderRadiansColumn = i, e._yPoleWanderRadiansColumn = r, e._ut1MinusUtcSecondsColumn = o, e._xCelestialPoleOffsetRadiansColumn = s, e._yCelestialPoleOffsetRadiansColumn = c, e._taiMinusUtcSecondsColumn = l, e._columnCount = t.columnNames.length, e._lastIndex = void 0; + let h; + const p = e._addNewLeapSeconds; + for (let m = 0, _ = d.length; m < _; m += e._columnCount) { + const y = d[m + n], C = d[m + l], T = y + TimeConstants$1.MODIFIED_JULIAN_DATE_DIFFERENCE, x = new JulianDate(T, C, TimeStandard$1.TAI); + if (f.push(x), p) { + if (C !== h && defined(h)) { + const b = JulianDate.leapSeconds, S = binarySearch( + b, + x, + compareLeapSecondDates + ); + if (S < 0) { + const E = new LeapSecond(x, C); + b.splice(~S, 0, E); + } + } + h = C; + } + } +} +function fillResultFromIndex(e, t, n, i, r) { + const o = n * i; + r.xPoleWander = t[o + e._xPoleWanderRadiansColumn], r.yPoleWander = t[o + e._yPoleWanderRadiansColumn], r.xPoleOffset = t[o + e._xCelestialPoleOffsetRadiansColumn], r.yPoleOffset = t[o + e._yCelestialPoleOffsetRadiansColumn], r.ut1MinusUtc = t[o + e._ut1MinusUtcSecondsColumn]; +} +function linearInterp(e, t, n) { + return t + e * (n - t); +} +function interpolate(e, t, n, i, r, o, s) { + const c = e._columnCount; + if (o > t.length - 1) + return s.xPoleWander = 0, s.yPoleWander = 0, s.xPoleOffset = 0, s.yPoleOffset = 0, s.ut1MinusUtc = 0, s; + const l = t[r], d = t[o]; + if (l.equals(d) || i.equals(l)) + return fillResultFromIndex(e, n, r, c, s), s; + if (i.equals(d)) + return fillResultFromIndex(e, n, o, c, s), s; + const f = JulianDate.secondsDifference(i, l) / JulianDate.secondsDifference(d, l), h = r * c, p = o * c; + let m = n[h + e._ut1MinusUtcSecondsColumn], _ = n[p + e._ut1MinusUtcSecondsColumn]; + const y = _ - m; + if (y > 0.5 || y < -0.5) { + const C = n[h + e._taiMinusUtcSecondsColumn], T = n[p + e._taiMinusUtcSecondsColumn]; + C !== T && (d.equals(i) ? m = _ : _ -= T - C); + } + return s.xPoleWander = linearInterp( + f, + n[h + e._xPoleWanderRadiansColumn], + n[p + e._xPoleWanderRadiansColumn] + ), s.yPoleWander = linearInterp( + f, + n[h + e._yPoleWanderRadiansColumn], + n[p + e._yPoleWanderRadiansColumn] + ), s.xPoleOffset = linearInterp( + f, + n[h + e._xCelestialPoleOffsetRadiansColumn], + n[p + e._xCelestialPoleOffsetRadiansColumn] + ), s.yPoleOffset = linearInterp( + f, + n[h + e._yCelestialPoleOffsetRadiansColumn], + n[p + e._yCelestialPoleOffsetRadiansColumn] + ), s.ut1MinusUtc = linearInterp( + f, + m, + _ + ), s; +} +function HeadingPitchRoll(e, t, n) { + this.heading = defaultValue(e, 0), this.pitch = defaultValue(t, 0), this.roll = defaultValue(n, 0); +} +HeadingPitchRoll.fromQuaternion = function(e, t) { + defined(t) || (t = new HeadingPitchRoll()); + const n = 2 * (e.w * e.y - e.z * e.x), i = 1 - 2 * (e.x * e.x + e.y * e.y), r = 2 * (e.w * e.x + e.y * e.z), o = 1 - 2 * (e.y * e.y + e.z * e.z), s = 2 * (e.w * e.z + e.x * e.y); + return t.heading = -Math.atan2(s, o), t.roll = Math.atan2(r, i), t.pitch = -CesiumMath.asinClamped(n), t; +}; +HeadingPitchRoll.fromDegrees = function(e, t, n, i) { + return defined(i) || (i = new HeadingPitchRoll()), i.heading = e * CesiumMath.RADIANS_PER_DEGREE, i.pitch = t * CesiumMath.RADIANS_PER_DEGREE, i.roll = n * CesiumMath.RADIANS_PER_DEGREE, i; +}; +HeadingPitchRoll.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.heading = e.heading, t.pitch = e.pitch, t.roll = e.roll, t) : new HeadingPitchRoll( + e.heading, + e.pitch, + e.roll + ); +}; +HeadingPitchRoll.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.heading === t.heading && e.pitch === t.pitch && e.roll === t.roll; +}; +HeadingPitchRoll.equalsEpsilon = function(e, t, n, i) { + return e === t || defined(e) && defined(t) && CesiumMath.equalsEpsilon( + e.heading, + t.heading, + n, + i + ) && CesiumMath.equalsEpsilon( + e.pitch, + t.pitch, + n, + i + ) && CesiumMath.equalsEpsilon( + e.roll, + t.roll, + n, + i + ); +}; +HeadingPitchRoll.prototype.clone = function(e) { + return HeadingPitchRoll.clone(this, e); +}; +HeadingPitchRoll.prototype.equals = function(e) { + return HeadingPitchRoll.equals(this, e); +}; +HeadingPitchRoll.prototype.equalsEpsilon = function(e, t, n) { + return HeadingPitchRoll.equalsEpsilon( + this, + e, + t, + n + ); +}; +HeadingPitchRoll.prototype.toString = function() { + return `(${this.heading}, ${this.pitch}, ${this.roll})`; +}; +const cesiumScriptRegex = /((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/; +function getBaseUrlFromCesiumScript() { + const e = document.getElementsByTagName("script"); + for (let t = 0, n = e.length; t < n; ++t) { + const i = e[t].getAttribute("src"), r = cesiumScriptRegex.exec(i); + if (r !== null) + return r[1]; + } +} +let a; +function tryMakeAbsolute(e) { + return typeof document > "u" ? e : (defined(a) || (a = document.createElement("a")), a.href = e, a.href); +} +let baseResource; +function getCesiumBaseUrl() { + var t; + if (defined(baseResource)) + return baseResource; + let e; + return typeof CESIUM_BASE_URL < "u" ? e = CESIUM_BASE_URL : defined((t = import.meta) == null ? void 0 : t.url) ? e = getAbsoluteUri(".", import.meta.url) : typeof define == "object" && defined(define.amd) && !define.amd.toUrlUndefined && defined(require.toUrl) ? e = getAbsoluteUri( + "..", + buildModuleUrl("Core/buildModuleUrl.js") + ) : e = getBaseUrlFromCesiumScript(), baseResource = new Resource({ + url: tryMakeAbsolute(e) + }), baseResource.appendForwardSlash(), baseResource; +} +function buildModuleUrlFromRequireToUrl(e) { + return tryMakeAbsolute(require.toUrl(`../${e}`)); +} +function buildModuleUrlFromBaseUrl(e) { + return getCesiumBaseUrl().getDerivedResource({ + url: e + }).url; +} +let implementation; +function buildModuleUrl(e) { + return defined(implementation) || (typeof define == "object" && defined(define.amd) && !define.amd.toUrlUndefined && defined(require.toUrl) ? implementation = buildModuleUrlFromRequireToUrl : implementation = buildModuleUrlFromBaseUrl), implementation(e); +} +buildModuleUrl._cesiumScriptRegex = cesiumScriptRegex; +buildModuleUrl._buildModuleUrlFromBaseUrl = buildModuleUrlFromBaseUrl; +buildModuleUrl._clearBaseResource = function() { + baseResource = void 0; +}; +buildModuleUrl.setBaseUrl = function(e) { + baseResource = Resource.DEFAULT.getDerivedResource({ + url: e + }); +}; +buildModuleUrl.getCesiumBaseUrl = getCesiumBaseUrl; +function Iau2006XysSample(e, t, n) { + this.x = e, this.y = t, this.s = n; +} +function Iau2006XysData(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._xysFileUrlTemplate = Resource.createIfNeeded( + e.xysFileUrlTemplate + ), this._interpolationOrder = defaultValue(e.interpolationOrder, 9), this._sampleZeroJulianEphemerisDate = defaultValue( + e.sampleZeroJulianEphemerisDate, + 24423965e-1 + ), this._sampleZeroDateTT = new JulianDate( + this._sampleZeroJulianEphemerisDate, + 0, + TimeStandard$1.TAI + ), this._stepSizeDays = defaultValue(e.stepSizeDays, 1), this._samplesPerXysFile = defaultValue(e.samplesPerXysFile, 1e3), this._totalSamples = defaultValue(e.totalSamples, 27426), this._samples = new Array(this._totalSamples * 3), this._chunkDownloadsInProgress = []; + const t = this._interpolationOrder, n = this._denominators = new Array(t + 1), i = this._xTable = new Array(t + 1), r = Math.pow(this._stepSizeDays, t); + for (let o = 0; o <= t; ++o) { + n[o] = r, i[o] = o * this._stepSizeDays; + for (let s = 0; s <= t; ++s) + s !== o && (n[o] *= o - s); + n[o] = 1 / n[o]; + } + this._work = new Array(t + 1), this._coef = new Array(t + 1); +} +const julianDateScratch$1 = new JulianDate(0, 0, TimeStandard$1.TAI); +function getDaysSinceEpoch(e, t, n) { + const i = julianDateScratch$1; + return i.dayNumber = t, i.secondsOfDay = n, JulianDate.daysDifference(i, e._sampleZeroDateTT); +} +Iau2006XysData.prototype.preload = function(e, t, n, i) { + const r = getDaysSinceEpoch( + this, + e, + t + ), o = getDaysSinceEpoch(this, n, i); + let s = r / this._stepSizeDays - this._interpolationOrder / 2 | 0; + s < 0 && (s = 0); + let c = o / this._stepSizeDays - this._interpolationOrder / 2 | 0 + this._interpolationOrder; + c >= this._totalSamples && (c = this._totalSamples - 1); + const l = s / this._samplesPerXysFile | 0, d = c / this._samplesPerXysFile | 0, f = []; + for (let h = l; h <= d; ++h) + f.push(requestXysChunk(this, h)); + return Promise.all(f); +}; +Iau2006XysData.prototype.computeXysRadians = function(e, t, n) { + const i = getDaysSinceEpoch(this, e, t); + if (i < 0) + return; + const r = i / this._stepSizeDays | 0; + if (r >= this._totalSamples) + return; + const o = this._interpolationOrder; + let s = r - (o / 2 | 0); + s < 0 && (s = 0); + let c = s + o; + c >= this._totalSamples && (c = this._totalSamples - 1, s = c - o, s < 0 && (s = 0)); + let l = !1; + const d = this._samples; + if (defined(d[s * 3]) || (requestXysChunk(this, s / this._samplesPerXysFile | 0), l = !0), defined(d[c * 3]) || (requestXysChunk(this, c / this._samplesPerXysFile | 0), l = !0), l) + return; + defined(n) ? (n.x = 0, n.y = 0, n.s = 0) : n = new Iau2006XysSample(0, 0, 0); + const f = i - s * this._stepSizeDays, h = this._work, p = this._denominators, m = this._coef, _ = this._xTable; + let y, C; + for (y = 0; y <= o; ++y) + h[y] = f - _[y]; + for (y = 0; y <= o; ++y) { + for (m[y] = 1, C = 0; C <= o; ++C) + C !== y && (m[y] *= h[C]); + m[y] *= p[y]; + let T = (s + y) * 3; + n.x += m[y] * d[T++], n.y += m[y] * d[T++], n.s += m[y] * d[T]; + } + return n; +}; +function requestXysChunk(e, t) { + if (e._chunkDownloadsInProgress[t]) + return e._chunkDownloadsInProgress[t]; + let n; + const i = e._xysFileUrlTemplate; + defined(i) ? n = i.getDerivedResource({ + templateValues: { + 0: t + } + }) : n = new Resource({ + url: buildModuleUrl(`Assets/IAU2006_XYS/IAU2006_XYS_${t}.json`) + }); + const r = n.fetchJson().then(function(o) { + e._chunkDownloadsInProgress[t] = !1; + const s = e._samples, c = o.samples, l = t * e._samplesPerXysFile * 3; + for (let d = 0, f = c.length; d < f; ++d) + s[l + d] = c[d]; + }); + return e._chunkDownloadsInProgress[t] = r, r; +} +function Quaternion(e, t, n, i) { + this.x = defaultValue(e, 0), this.y = defaultValue(t, 0), this.z = defaultValue(n, 0), this.w = defaultValue(i, 0); +} +let fromAxisAngleScratch = new Cartesian3(); +Quaternion.fromAxisAngle = function(e, t, n) { + const i = t / 2, r = Math.sin(i); + fromAxisAngleScratch = Cartesian3.normalize(e, fromAxisAngleScratch); + const o = fromAxisAngleScratch.x * r, s = fromAxisAngleScratch.y * r, c = fromAxisAngleScratch.z * r, l = Math.cos(i); + return defined(n) ? (n.x = o, n.y = s, n.z = c, n.w = l, n) : new Quaternion(o, s, c, l); +}; +const fromRotationMatrixNext = [1, 2, 0], fromRotationMatrixQuat = new Array(3); +Quaternion.fromRotationMatrix = function(e, t) { + let n, i, r, o, s; + const c = e[Matrix3.COLUMN0ROW0], l = e[Matrix3.COLUMN1ROW1], d = e[Matrix3.COLUMN2ROW2], f = c + l + d; + if (f > 0) + n = Math.sqrt(f + 1), s = 0.5 * n, n = 0.5 / n, i = (e[Matrix3.COLUMN1ROW2] - e[Matrix3.COLUMN2ROW1]) * n, r = (e[Matrix3.COLUMN2ROW0] - e[Matrix3.COLUMN0ROW2]) * n, o = (e[Matrix3.COLUMN0ROW1] - e[Matrix3.COLUMN1ROW0]) * n; + else { + const h = fromRotationMatrixNext; + let p = 0; + l > c && (p = 1), d > c && d > l && (p = 2); + const m = h[p], _ = h[m]; + n = Math.sqrt( + e[Matrix3.getElementIndex(p, p)] - e[Matrix3.getElementIndex(m, m)] - e[Matrix3.getElementIndex(_, _)] + 1 + ); + const y = fromRotationMatrixQuat; + y[p] = 0.5 * n, n = 0.5 / n, s = (e[Matrix3.getElementIndex(_, m)] - e[Matrix3.getElementIndex(m, _)]) * n, y[m] = (e[Matrix3.getElementIndex(m, p)] + e[Matrix3.getElementIndex(p, m)]) * n, y[_] = (e[Matrix3.getElementIndex(_, p)] + e[Matrix3.getElementIndex(p, _)]) * n, i = -y[0], r = -y[1], o = -y[2]; + } + return defined(t) ? (t.x = i, t.y = r, t.z = o, t.w = s, t) : new Quaternion(i, r, o, s); +}; +const scratchHPRQuaternion$1 = new Quaternion(); +let scratchHeadingQuaternion = new Quaternion(), scratchPitchQuaternion = new Quaternion(), scratchRollQuaternion = new Quaternion(); +Quaternion.fromHeadingPitchRoll = function(e, t) { + return scratchRollQuaternion = Quaternion.fromAxisAngle( + Cartesian3.UNIT_X, + e.roll, + scratchHPRQuaternion$1 + ), scratchPitchQuaternion = Quaternion.fromAxisAngle( + Cartesian3.UNIT_Y, + -e.pitch, + t + ), t = Quaternion.multiply( + scratchPitchQuaternion, + scratchRollQuaternion, + scratchPitchQuaternion + ), scratchHeadingQuaternion = Quaternion.fromAxisAngle( + Cartesian3.UNIT_Z, + -e.heading, + scratchHPRQuaternion$1 + ), Quaternion.multiply(scratchHeadingQuaternion, t, t); +}; +const sampledQuaternionAxis = new Cartesian3(), sampledQuaternionRotation = new Cartesian3(), sampledQuaternionTempQuaternion = new Quaternion(), sampledQuaternionQuaternion0 = new Quaternion(), sampledQuaternionQuaternion0Conjugate = new Quaternion(); +Quaternion.packedLength = 4; +Quaternion.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.x, t[n++] = e.y, t[n++] = e.z, t[n] = e.w, t; +}; +Quaternion.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Quaternion()), n.x = e[t], n.y = e[t + 1], n.z = e[t + 2], n.w = e[t + 3], n; +}; +Quaternion.packedInterpolationLength = 3; +Quaternion.convertPackedArrayForInterpolation = function(e, t, n, i) { + Quaternion.unpack( + e, + n * 4, + sampledQuaternionQuaternion0Conjugate + ), Quaternion.conjugate( + sampledQuaternionQuaternion0Conjugate, + sampledQuaternionQuaternion0Conjugate + ); + for (let r = 0, o = n - t + 1; r < o; r++) { + const s = r * 3; + Quaternion.unpack( + e, + (t + r) * 4, + sampledQuaternionTempQuaternion + ), Quaternion.multiply( + sampledQuaternionTempQuaternion, + sampledQuaternionQuaternion0Conjugate, + sampledQuaternionTempQuaternion + ), sampledQuaternionTempQuaternion.w < 0 && Quaternion.negate( + sampledQuaternionTempQuaternion, + sampledQuaternionTempQuaternion + ), Quaternion.computeAxis( + sampledQuaternionTempQuaternion, + sampledQuaternionAxis + ); + const c = Quaternion.computeAngle(sampledQuaternionTempQuaternion); + defined(i) || (i = []), i[s] = sampledQuaternionAxis.x * c, i[s + 1] = sampledQuaternionAxis.y * c, i[s + 2] = sampledQuaternionAxis.z * c; + } +}; +Quaternion.unpackInterpolationResult = function(e, t, n, i, r) { + defined(r) || (r = new Quaternion()), Cartesian3.fromArray(e, 0, sampledQuaternionRotation); + const o = Cartesian3.magnitude(sampledQuaternionRotation); + return Quaternion.unpack(t, i * 4, sampledQuaternionQuaternion0), o === 0 ? Quaternion.clone(Quaternion.IDENTITY, sampledQuaternionTempQuaternion) : Quaternion.fromAxisAngle( + sampledQuaternionRotation, + o, + sampledQuaternionTempQuaternion + ), Quaternion.multiply( + sampledQuaternionTempQuaternion, + sampledQuaternionQuaternion0, + r + ); +}; +Quaternion.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.x = e.x, t.y = e.y, t.z = e.z, t.w = e.w, t) : new Quaternion( + e.x, + e.y, + e.z, + e.w + ); +}; +Quaternion.conjugate = function(e, t) { + return t.x = -e.x, t.y = -e.y, t.z = -e.z, t.w = e.w, t; +}; +Quaternion.magnitudeSquared = function(e) { + return e.x * e.x + e.y * e.y + e.z * e.z + e.w * e.w; +}; +Quaternion.magnitude = function(e) { + return Math.sqrt(Quaternion.magnitudeSquared(e)); +}; +Quaternion.normalize = function(e, t) { + const n = 1 / Quaternion.magnitude(e), i = e.x * n, r = e.y * n, o = e.z * n, s = e.w * n; + return t.x = i, t.y = r, t.z = o, t.w = s, t; +}; +Quaternion.inverse = function(e, t) { + const n = Quaternion.magnitudeSquared(e); + return t = Quaternion.conjugate(e, t), Quaternion.multiplyByScalar(t, 1 / n, t); +}; +Quaternion.add = function(e, t, n) { + return n.x = e.x + t.x, n.y = e.y + t.y, n.z = e.z + t.z, n.w = e.w + t.w, n; +}; +Quaternion.subtract = function(e, t, n) { + return n.x = e.x - t.x, n.y = e.y - t.y, n.z = e.z - t.z, n.w = e.w - t.w, n; +}; +Quaternion.negate = function(e, t) { + return t.x = -e.x, t.y = -e.y, t.z = -e.z, t.w = -e.w, t; +}; +Quaternion.dot = function(e, t) { + return e.x * t.x + e.y * t.y + e.z * t.z + e.w * t.w; +}; +Quaternion.multiply = function(e, t, n) { + const i = e.x, r = e.y, o = e.z, s = e.w, c = t.x, l = t.y, d = t.z, f = t.w, h = s * c + i * f + r * d - o * l, p = s * l - i * d + r * f + o * c, m = s * d + i * l - r * c + o * f, _ = s * f - i * c - r * l - o * d; + return n.x = h, n.y = p, n.z = m, n.w = _, n; +}; +Quaternion.multiplyByScalar = function(e, t, n) { + return n.x = e.x * t, n.y = e.y * t, n.z = e.z * t, n.w = e.w * t, n; +}; +Quaternion.divideByScalar = function(e, t, n) { + return n.x = e.x / t, n.y = e.y / t, n.z = e.z / t, n.w = e.w / t, n; +}; +Quaternion.computeAxis = function(e, t) { + const n = e.w; + if (Math.abs(n - 1) < CesiumMath.EPSILON6 || Math.abs(n + 1) < CesiumMath.EPSILON6) + return t.x = 1, t.y = t.z = 0, t; + const i = 1 / Math.sqrt(1 - n * n); + return t.x = e.x * i, t.y = e.y * i, t.z = e.z * i, t; +}; +Quaternion.computeAngle = function(e) { + return Math.abs(e.w - 1) < CesiumMath.EPSILON6 ? 0 : 2 * Math.acos(e.w); +}; +let lerpScratch = new Quaternion(); +Quaternion.lerp = function(e, t, n, i) { + return lerpScratch = Quaternion.multiplyByScalar(t, n, lerpScratch), i = Quaternion.multiplyByScalar(e, 1 - n, i), Quaternion.add(lerpScratch, i, i); +}; +let slerpEndNegated = new Quaternion(), slerpScaledP = new Quaternion(), slerpScaledR = new Quaternion(); +Quaternion.slerp = function(e, t, n, i) { + let r = Quaternion.dot(e, t), o = t; + if (r < 0 && (r = -r, o = slerpEndNegated = Quaternion.negate(t, slerpEndNegated)), 1 - r < CesiumMath.EPSILON6) + return Quaternion.lerp(e, o, n, i); + const s = Math.acos(r); + return slerpScaledP = Quaternion.multiplyByScalar( + e, + Math.sin((1 - n) * s), + slerpScaledP + ), slerpScaledR = Quaternion.multiplyByScalar( + o, + Math.sin(n * s), + slerpScaledR + ), i = Quaternion.add(slerpScaledP, slerpScaledR, i), Quaternion.multiplyByScalar(i, 1 / Math.sin(s), i); +}; +Quaternion.log = function(e, t) { + const n = CesiumMath.acosClamped(e.w); + let i = 0; + return n !== 0 && (i = n / Math.sin(n)), Cartesian3.multiplyByScalar(e, i, t); +}; +Quaternion.exp = function(e, t) { + const n = Cartesian3.magnitude(e); + let i = 0; + return n !== 0 && (i = Math.sin(n) / n), t.x = e.x * i, t.y = e.y * i, t.z = e.z * i, t.w = Math.cos(n), t; +}; +const squadScratchCartesian0 = new Cartesian3(), squadScratchCartesian1 = new Cartesian3(), squadScratchQuaternion0 = new Quaternion(), squadScratchQuaternion1 = new Quaternion(); +Quaternion.computeInnerQuadrangle = function(e, t, n, i) { + const r = Quaternion.conjugate(t, squadScratchQuaternion0); + Quaternion.multiply(r, n, squadScratchQuaternion1); + const o = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian0); + Quaternion.multiply(r, e, squadScratchQuaternion1); + const s = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian1); + return Cartesian3.add(o, s, o), Cartesian3.multiplyByScalar(o, 0.25, o), Cartesian3.negate(o, o), Quaternion.exp(o, squadScratchQuaternion0), Quaternion.multiply(t, squadScratchQuaternion0, i); +}; +Quaternion.squad = function(e, t, n, i, r, o) { + const s = Quaternion.slerp(e, t, r, squadScratchQuaternion0), c = Quaternion.slerp(n, i, r, squadScratchQuaternion1); + return Quaternion.slerp(s, c, 2 * r * (1 - r), o); +}; +const fastSlerpScratchQuaternion = new Quaternion(), opmu = 1.9011074535173003, u = FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [], v = FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [], bT = FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [], bD = FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : []; +for (let e = 0; e < 7; ++e) { + const t = e + 1, n = 2 * t + 1; + u[e] = 1 / (t * n), v[e] = t / n; +} +u[7] = opmu / (8 * 17); +v[7] = opmu * 8 / 17; +Quaternion.fastSlerp = function(e, t, n, i) { + let r = Quaternion.dot(e, t), o; + r >= 0 ? o = 1 : (o = -1, r = -r); + const s = r - 1, c = 1 - n, l = n * n, d = c * c; + for (let m = 7; m >= 0; --m) + bT[m] = (u[m] * l - v[m]) * s, bD[m] = (u[m] * d - v[m]) * s; + const f = o * n * (1 + bT[0] * (1 + bT[1] * (1 + bT[2] * (1 + bT[3] * (1 + bT[4] * (1 + bT[5] * (1 + bT[6] * (1 + bT[7])))))))), h = c * (1 + bD[0] * (1 + bD[1] * (1 + bD[2] * (1 + bD[3] * (1 + bD[4] * (1 + bD[5] * (1 + bD[6] * (1 + bD[7])))))))), p = Quaternion.multiplyByScalar( + e, + h, + fastSlerpScratchQuaternion + ); + return Quaternion.multiplyByScalar(t, f, i), Quaternion.add(p, i, i); +}; +Quaternion.fastSquad = function(e, t, n, i, r, o) { + const s = Quaternion.fastSlerp(e, t, r, squadScratchQuaternion0), c = Quaternion.fastSlerp(n, i, r, squadScratchQuaternion1); + return Quaternion.fastSlerp(s, c, 2 * r * (1 - r), o); +}; +Quaternion.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.x === t.x && e.y === t.y && e.z === t.z && e.w === t.w; +}; +Quaternion.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e.x - t.x) <= n && Math.abs(e.y - t.y) <= n && Math.abs(e.z - t.z) <= n && Math.abs(e.w - t.w) <= n; +}; +Quaternion.ZERO = Object.freeze(new Quaternion(0, 0, 0, 0)); +Quaternion.IDENTITY = Object.freeze(new Quaternion(0, 0, 0, 1)); +Quaternion.prototype.clone = function(e) { + return Quaternion.clone(this, e); +}; +Quaternion.prototype.equals = function(e) { + return Quaternion.equals(this, e); +}; +Quaternion.prototype.equalsEpsilon = function(e, t) { + return Quaternion.equalsEpsilon(this, e, t); +}; +Quaternion.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`; +}; +const Transforms = {}, vectorProductLocalFrame = { + up: { + south: "east", + north: "west", + west: "south", + east: "north" + }, + down: { + south: "west", + north: "east", + west: "north", + east: "south" + }, + south: { + up: "west", + down: "east", + west: "down", + east: "up" + }, + north: { + up: "east", + down: "west", + west: "up", + east: "down" + }, + west: { + up: "north", + down: "south", + north: "down", + south: "up" + }, + east: { + up: "south", + down: "north", + north: "up", + south: "down" + } +}, degeneratePositionLocalFrame = { + north: [-1, 0, 0], + east: [0, 1, 0], + up: [0, 0, 1], + south: [1, 0, 0], + west: [0, -1, 0], + down: [0, 0, -1] +}, localFrameToFixedFrameCache = {}, scratchCalculateCartesian = { + east: new Cartesian3(), + north: new Cartesian3(), + up: new Cartesian3(), + west: new Cartesian3(), + south: new Cartesian3(), + down: new Cartesian3() +}; +let scratchFirstCartesian = new Cartesian3(), scratchSecondCartesian = new Cartesian3(), scratchThirdCartesian = new Cartesian3(); +Transforms.localFrameToFixedFrameGenerator = function(e, t) { + if (!vectorProductLocalFrame.hasOwnProperty(e) || !vectorProductLocalFrame[e].hasOwnProperty(t)) + throw new DeveloperError( + "firstAxis and secondAxis must be east, north, up, west, south or down." + ); + const n = vectorProductLocalFrame[e][t]; + let i; + const r = e + t; + return defined(localFrameToFixedFrameCache[r]) ? i = localFrameToFixedFrameCache[r] : (i = function(o, s, c) { + if (defined(c) || (c = new Matrix4()), Cartesian3.equalsEpsilon(o, Cartesian3.ZERO, CesiumMath.EPSILON14)) + Cartesian3.unpack( + degeneratePositionLocalFrame[e], + 0, + scratchFirstCartesian + ), Cartesian3.unpack( + degeneratePositionLocalFrame[t], + 0, + scratchSecondCartesian + ), Cartesian3.unpack( + degeneratePositionLocalFrame[n], + 0, + scratchThirdCartesian + ); + else if (CesiumMath.equalsEpsilon(o.x, 0, CesiumMath.EPSILON14) && CesiumMath.equalsEpsilon(o.y, 0, CesiumMath.EPSILON14)) { + const l = CesiumMath.sign(o.z); + Cartesian3.unpack( + degeneratePositionLocalFrame[e], + 0, + scratchFirstCartesian + ), e !== "east" && e !== "west" && Cartesian3.multiplyByScalar( + scratchFirstCartesian, + l, + scratchFirstCartesian + ), Cartesian3.unpack( + degeneratePositionLocalFrame[t], + 0, + scratchSecondCartesian + ), t !== "east" && t !== "west" && Cartesian3.multiplyByScalar( + scratchSecondCartesian, + l, + scratchSecondCartesian + ), Cartesian3.unpack( + degeneratePositionLocalFrame[n], + 0, + scratchThirdCartesian + ), n !== "east" && n !== "west" && Cartesian3.multiplyByScalar( + scratchThirdCartesian, + l, + scratchThirdCartesian + ); + } else { + s = defaultValue(s, Ellipsoid.default), s.geodeticSurfaceNormal(o, scratchCalculateCartesian.up); + const l = scratchCalculateCartesian.up, d = scratchCalculateCartesian.east; + d.x = -o.y, d.y = o.x, d.z = 0, Cartesian3.normalize(d, scratchCalculateCartesian.east), Cartesian3.cross(l, d, scratchCalculateCartesian.north), Cartesian3.multiplyByScalar( + scratchCalculateCartesian.up, + -1, + scratchCalculateCartesian.down + ), Cartesian3.multiplyByScalar( + scratchCalculateCartesian.east, + -1, + scratchCalculateCartesian.west + ), Cartesian3.multiplyByScalar( + scratchCalculateCartesian.north, + -1, + scratchCalculateCartesian.south + ), scratchFirstCartesian = scratchCalculateCartesian[e], scratchSecondCartesian = scratchCalculateCartesian[t], scratchThirdCartesian = scratchCalculateCartesian[n]; + } + return c[0] = scratchFirstCartesian.x, c[1] = scratchFirstCartesian.y, c[2] = scratchFirstCartesian.z, c[3] = 0, c[4] = scratchSecondCartesian.x, c[5] = scratchSecondCartesian.y, c[6] = scratchSecondCartesian.z, c[7] = 0, c[8] = scratchThirdCartesian.x, c[9] = scratchThirdCartesian.y, c[10] = scratchThirdCartesian.z, c[11] = 0, c[12] = o.x, c[13] = o.y, c[14] = o.z, c[15] = 1, c; + }, localFrameToFixedFrameCache[r] = i), i; +}; +Transforms.eastNorthUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "east", + "north" +); +Transforms.northEastDownToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "east" +); +Transforms.northUpEastToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "up" +); +Transforms.northWestUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "west" +); +const scratchHPRQuaternion = new Quaternion(), scratchScale$9 = new Cartesian3(1, 1, 1), scratchHPRMatrix4 = new Matrix4(); +Transforms.headingPitchRollToFixedFrame = function(e, t, n, i, r) { + i = defaultValue( + i, + Transforms.eastNorthUpToFixedFrame + ); + const o = Quaternion.fromHeadingPitchRoll( + t, + scratchHPRQuaternion + ), s = Matrix4.fromTranslationQuaternionRotationScale( + Cartesian3.ZERO, + o, + scratchScale$9, + scratchHPRMatrix4 + ); + return r = i(e, n, r), Matrix4.multiply(r, s, r); +}; +const scratchENUMatrix4 = new Matrix4(), scratchHPRMatrix3 = new Matrix3(); +Transforms.headingPitchRollQuaternion = function(e, t, n, i, r) { + const o = Transforms.headingPitchRollToFixedFrame( + e, + t, + n, + i, + scratchENUMatrix4 + ), s = Matrix4.getMatrix3(o, scratchHPRMatrix3); + return Quaternion.fromRotationMatrix(s, r); +}; +const noScale = new Cartesian3(1, 1, 1), hprCenterScratch = new Cartesian3(), ffScratch = new Matrix4(), hprTransformScratch = new Matrix4(), hprRotationScratch = new Matrix3(), hprQuaternionScratch = new Quaternion(); +Transforms.fixedFrameToHeadingPitchRoll = function(e, t, n, i) { + t = defaultValue(t, Ellipsoid.default), n = defaultValue( + n, + Transforms.eastNorthUpToFixedFrame + ), defined(i) || (i = new HeadingPitchRoll()); + const r = Matrix4.getTranslation(e, hprCenterScratch); + if (Cartesian3.equals(r, Cartesian3.ZERO)) + return i.heading = 0, i.pitch = 0, i.roll = 0, i; + let o = Matrix4.inverseTransformation( + n(r, t, ffScratch), + ffScratch + ), s = Matrix4.setScale(e, noScale, hprTransformScratch); + s = Matrix4.setTranslation( + s, + Cartesian3.ZERO, + s + ), o = Matrix4.multiply(o, s, o); + let c = Quaternion.fromRotationMatrix( + Matrix4.getMatrix3(o, hprRotationScratch), + hprQuaternionScratch + ); + return c = Quaternion.normalize( + c, + c + ), HeadingPitchRoll.fromQuaternion(c, i); +}; +const gmstConstant0 = 6 * 3600 + 41 * 60 + 50.54841, gmstConstant1 = 8640184812866e-6, gmstConstant2 = 0.093104, gmstConstant3 = -62e-7, rateCoef = 11772758384668e-32, wgs84WRPrecessing = 72921158553e-15, twoPiOverSecondsInDay = CesiumMath.TWO_PI / 86400; +let dateInUtc = new JulianDate(); +Transforms.computeIcrfToCentralBodyFixedMatrix = function(e, t) { + let n = Transforms.computeIcrfToFixedMatrix(e, t); + return defined(n) || (n = Transforms.computeTemeToPseudoFixedMatrix(e, t)), n; +}; +Transforms.computeTemeToPseudoFixedMatrix = function(e, t) { + dateInUtc = JulianDate.addSeconds( + e, + -JulianDate.computeTaiMinusUtc(e), + dateInUtc + ); + const n = dateInUtc.dayNumber, i = dateInUtc.secondsOfDay; + let r; + const o = n - 2451545; + i >= 43200 ? r = (o + 0.5) / TimeConstants$1.DAYS_PER_JULIAN_CENTURY : r = (o - 0.5) / TimeConstants$1.DAYS_PER_JULIAN_CENTURY; + const c = (gmstConstant0 + r * (gmstConstant1 + r * (gmstConstant2 + r * gmstConstant3))) * twoPiOverSecondsInDay % CesiumMath.TWO_PI, l = wgs84WRPrecessing + rateCoef * (n - 24515455e-1), d = (i + TimeConstants$1.SECONDS_PER_DAY * 0.5) % TimeConstants$1.SECONDS_PER_DAY, f = c + l * d, h = Math.cos(f), p = Math.sin(f); + return defined(t) ? (t[0] = h, t[1] = -p, t[2] = 0, t[3] = p, t[4] = h, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = 1, t) : new Matrix3( + h, + p, + 0, + -p, + h, + 0, + 0, + 0, + 1 + ); +}; +Transforms.iau2006XysData = new Iau2006XysData(); +Transforms.earthOrientationParameters = EarthOrientationParameters.NONE; +const ttMinusTai = 32.184, j2000ttDays = 2451545; +Transforms.preloadIcrfFixed = function(e) { + const t = e.start.dayNumber, n = e.start.secondsOfDay + ttMinusTai, i = e.stop.dayNumber, r = e.stop.secondsOfDay + ttMinusTai; + return Transforms.iau2006XysData.preload( + t, + n, + i, + r + ); +}; +Transforms.computeIcrfToFixedMatrix = function(e, t) { + defined(t) || (t = new Matrix3()); + const n = Transforms.computeFixedToIcrfMatrix(e, t); + if (defined(n)) + return Matrix3.transpose(n, t); +}; +const TdtMinusTai$2 = 32.184, J2000d$2 = 2451545, scratchHpr$1 = new HeadingPitchRoll(), scratchRotationMatrix$2 = new Matrix3(), dateScratch = new JulianDate(); +Transforms.computeMoonFixedToIcrfMatrix = function(e, t) { + const n = JulianDate.addSeconds(e, TdtMinusTai$2, dateScratch), i = JulianDate.totalDays(n) - J2000d$2, r = CesiumMath.toRadians(12.112) - CesiumMath.toRadians(0.052992) * i, o = CesiumMath.toRadians(24.224) - CesiumMath.toRadians(0.105984) * i, s = CesiumMath.toRadians(227.645) + CesiumMath.toRadians(13.012) * i, c = CesiumMath.toRadians(261.105) + CesiumMath.toRadians(13.340716) * i, l = CesiumMath.toRadians(358) + CesiumMath.toRadians(0.9856) * i; + return scratchHpr$1.pitch = CesiumMath.toRadians(180) - CesiumMath.toRadians(3.878) * Math.sin(r) - CesiumMath.toRadians(0.12) * Math.sin(o) + CesiumMath.toRadians(0.07) * Math.sin(s) - CesiumMath.toRadians(0.017) * Math.sin(c), scratchHpr$1.roll = CesiumMath.toRadians(66.53 - 90) + CesiumMath.toRadians(1.543) * Math.cos(r) + CesiumMath.toRadians(0.24) * Math.cos(o) - CesiumMath.toRadians(0.028) * Math.cos(s) + CesiumMath.toRadians(7e-3) * Math.cos(c), scratchHpr$1.heading = CesiumMath.toRadians(244.375 - 90) + CesiumMath.toRadians(13.17635831) * i + CesiumMath.toRadians(3.558) * Math.sin(r) + CesiumMath.toRadians(0.121) * Math.sin(o) - CesiumMath.toRadians(0.064) * Math.sin(s) + CesiumMath.toRadians(0.016) * Math.sin(c) + CesiumMath.toRadians(0.025) * Math.sin(l), Matrix3.fromHeadingPitchRoll(scratchHpr$1, scratchRotationMatrix$2); +}; +Transforms.computeIcrfToMoonFixedMatrix = function(e, t) { + defined(t) || (t = new Matrix3()); + const n = Transforms.computeMoonFixedToIcrfMatrix(e, t); + if (defined(n)) + return Matrix3.transpose(n, t); +}; +const xysScratch = new Iau2006XysSample(0, 0, 0), eopScratch = new EarthOrientationParametersSample( + 0, + 0, + 0, + 0, + 0 +), rotation1Scratch = new Matrix3(), rotation2Scratch = new Matrix3(); +Transforms.computeFixedToIcrfMatrix = function(e, t) { + defined(t) || (t = new Matrix3()); + const n = Transforms.earthOrientationParameters.compute(e, eopScratch); + if (!defined(n)) + return; + const i = e.dayNumber, r = e.secondsOfDay + ttMinusTai, o = Transforms.iau2006XysData.computeXysRadians( + i, + r, + xysScratch + ); + if (!defined(o)) + return; + const s = o.x + n.xPoleOffset, c = o.y + n.yPoleOffset, l = 1 / (1 + Math.sqrt(1 - s * s - c * c)), d = rotation1Scratch; + d[0] = 1 - l * s * s, d[3] = -l * s * c, d[6] = s, d[1] = -l * s * c, d[4] = 1 - l * c * c, d[7] = c, d[2] = -s, d[5] = -c, d[8] = 1 - l * (s * s + c * c); + const f = Matrix3.fromRotationZ(-o.s, rotation2Scratch), h = Matrix3.multiply(d, f, rotation1Scratch), p = e.dayNumber, m = e.secondsOfDay - JulianDate.computeTaiMinusUtc(e) + n.ut1MinusUtc, _ = p - 2451545, y = m / TimeConstants$1.SECONDS_PER_DAY; + let C = 0.779057273264 + y + 0.00273781191135448 * (_ + y); + C = C % 1 * CesiumMath.TWO_PI; + const T = Matrix3.fromRotationZ(C, rotation2Scratch), x = Matrix3.multiply(h, T, rotation1Scratch), b = Math.cos(n.xPoleWander), S = Math.cos(n.yPoleWander), E = Math.sin(n.xPoleWander), A = Math.sin(n.yPoleWander); + let D = i - j2000ttDays + r / TimeConstants$1.SECONDS_PER_DAY; + D /= 36525; + const P = -47e-6 * D * CesiumMath.RADIANS_PER_DEGREE / 3600, I = Math.cos(P), M = Math.sin(P), R = rotation2Scratch; + return R[0] = b * I, R[1] = b * M, R[2] = E, R[3] = -S * M + A * E * I, R[4] = S * I + A * E * M, R[5] = -A * b, R[6] = -A * M - S * E * I, R[7] = A * I - S * E * M, R[8] = S * b, Matrix3.multiply(x, R, t); +}; +const pointToWindowCoordinatesTemp = new Cartesian4(); +Transforms.pointToWindowCoordinates = function(e, t, n, i) { + return i = Transforms.pointToGLWindowCoordinates( + e, + t, + n, + i + ), i.y = 2 * t[5] - i.y, i; +}; +Transforms.pointToGLWindowCoordinates = function(e, t, n, i) { + defined(i) || (i = new Cartesian2()); + const r = pointToWindowCoordinatesTemp; + return Matrix4.multiplyByVector( + e, + Cartesian4.fromElements(n.x, n.y, n.z, 1, r), + r + ), Cartesian4.multiplyByScalar(r, 1 / r.w, r), Matrix4.multiplyByVector(t, r, r), Cartesian2.fromCartesian4(r, i); +}; +const normalScratch$5 = new Cartesian3(), rightScratch$1 = new Cartesian3(), upScratch = new Cartesian3(); +Transforms.rotationMatrixFromPositionVelocity = function(e, t, n, i) { + const r = defaultValue( + n, + Ellipsoid.default + ).geodeticSurfaceNormal(e, normalScratch$5); + let o = Cartesian3.cross(t, r, rightScratch$1); + Cartesian3.equalsEpsilon(o, Cartesian3.ZERO, CesiumMath.EPSILON6) && (o = Cartesian3.clone(Cartesian3.UNIT_X, o)); + const s = Cartesian3.cross(o, t, upScratch); + return Cartesian3.normalize(s, s), Cartesian3.cross(t, s, o), Cartesian3.negate(o, o), Cartesian3.normalize(o, o), defined(i) || (i = new Matrix3()), i[0] = t.x, i[1] = t.y, i[2] = t.z, i[3] = o.x, i[4] = o.y, i[5] = o.z, i[6] = s.x, i[7] = s.y, i[8] = s.z, i; +}; +const swizzleMatrix = new Matrix4( + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 +), scratchCartographic$k = new Cartographic(), scratchCartesian3Projection$1 = new Cartesian3(), scratchCenter$a = new Cartesian3(), scratchRotation$5 = new Matrix3(), scratchFromENU = new Matrix4(), scratchToENU = new Matrix4(); +Transforms.basisTo2D = function(e, t, n) { + const i = Matrix4.getTranslation(t, scratchCenter$a), r = e.ellipsoid; + let o; + if (Cartesian3.equals(i, Cartesian3.ZERO)) + o = Cartesian3.clone( + Cartesian3.ZERO, + scratchCartesian3Projection$1 + ); + else { + const f = r.cartesianToCartographic( + i, + scratchCartographic$k + ); + o = e.project( + f, + scratchCartesian3Projection$1 + ), Cartesian3.fromElements( + o.z, + o.x, + o.y, + o + ); + } + const s = Transforms.eastNorthUpToFixedFrame( + i, + r, + scratchFromENU + ), c = Matrix4.inverseTransformation(s, scratchToENU), l = Matrix4.getMatrix3(t, scratchRotation$5), d = Matrix4.multiplyByMatrix3(c, l, n); + return Matrix4.multiply(swizzleMatrix, d, n), Matrix4.setTranslation(n, o, n), n; +}; +Transforms.ellipsoidTo2DModelMatrix = function(e, t, n) { + const i = e.ellipsoid, r = Transforms.eastNorthUpToFixedFrame( + t, + i, + scratchFromENU + ), o = Matrix4.inverseTransformation(r, scratchToENU), s = i.cartesianToCartographic( + t, + scratchCartographic$k + ), c = e.project( + s, + scratchCartesian3Projection$1 + ); + Cartesian3.fromElements( + c.z, + c.x, + c.y, + c + ); + const l = Matrix4.fromTranslation( + c, + scratchFromENU + ); + return Matrix4.multiply(swizzleMatrix, o, n), Matrix4.multiply(l, n, n), n; +}; +function Rectangle(e, t, n, i) { + this.west = defaultValue(e, 0), this.south = defaultValue(t, 0), this.east = defaultValue(n, 0), this.north = defaultValue(i, 0); +} +Object.defineProperties(Rectangle.prototype, { + /** + * Gets the width of the rectangle in radians. + * @memberof Rectangle.prototype + * @type {number} + * @readonly + */ + width: { + get: function() { + return Rectangle.computeWidth(this); + } + }, + /** + * Gets the height of the rectangle in radians. + * @memberof Rectangle.prototype + * @type {number} + * @readonly + */ + height: { + get: function() { + return Rectangle.computeHeight(this); + } + } +}); +Rectangle.packedLength = 4; +Rectangle.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.west, t[n++] = e.south, t[n++] = e.east, t[n] = e.north, t; +}; +Rectangle.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Rectangle()), n.west = e[t++], n.south = e[t++], n.east = e[t++], n.north = e[t], n; +}; +Rectangle.computeWidth = function(e) { + let t = e.east; + const n = e.west; + return t < n && (t += CesiumMath.TWO_PI), t - n; +}; +Rectangle.computeHeight = function(e) { + return e.north - e.south; +}; +Rectangle.fromDegrees = function(e, t, n, i, r) { + return e = CesiumMath.toRadians(defaultValue(e, 0)), t = CesiumMath.toRadians(defaultValue(t, 0)), n = CesiumMath.toRadians(defaultValue(n, 0)), i = CesiumMath.toRadians(defaultValue(i, 0)), defined(r) ? (r.west = e, r.south = t, r.east = n, r.north = i, r) : new Rectangle(e, t, n, i); +}; +Rectangle.fromRadians = function(e, t, n, i, r) { + return defined(r) ? (r.west = defaultValue(e, 0), r.south = defaultValue(t, 0), r.east = defaultValue(n, 0), r.north = defaultValue(i, 0), r) : new Rectangle(e, t, n, i); +}; +Rectangle.fromCartographicArray = function(e, t) { + let n = Number.MAX_VALUE, i = -Number.MAX_VALUE, r = Number.MAX_VALUE, o = -Number.MAX_VALUE, s = Number.MAX_VALUE, c = -Number.MAX_VALUE; + for (let l = 0, d = e.length; l < d; l++) { + const f = e[l]; + n = Math.min(n, f.longitude), i = Math.max(i, f.longitude), s = Math.min(s, f.latitude), c = Math.max(c, f.latitude); + const h = f.longitude >= 0 ? f.longitude : f.longitude + CesiumMath.TWO_PI; + r = Math.min(r, h), o = Math.max(o, h); + } + return i - n > o - r && (n = r, i = o, i > CesiumMath.PI && (i = i - CesiumMath.TWO_PI), n > CesiumMath.PI && (n = n - CesiumMath.TWO_PI)), defined(t) ? (t.west = n, t.south = s, t.east = i, t.north = c, t) : new Rectangle(n, s, i, c); +}; +Rectangle.fromCartesianArray = function(e, t, n) { + t = defaultValue(t, Ellipsoid.default); + let i = Number.MAX_VALUE, r = -Number.MAX_VALUE, o = Number.MAX_VALUE, s = -Number.MAX_VALUE, c = Number.MAX_VALUE, l = -Number.MAX_VALUE; + for (let d = 0, f = e.length; d < f; d++) { + const h = t.cartesianToCartographic(e[d]); + i = Math.min(i, h.longitude), r = Math.max(r, h.longitude), c = Math.min(c, h.latitude), l = Math.max(l, h.latitude); + const p = h.longitude >= 0 ? h.longitude : h.longitude + CesiumMath.TWO_PI; + o = Math.min(o, p), s = Math.max(s, p); + } + return r - i > s - o && (i = o, r = s, r > CesiumMath.PI && (r = r - CesiumMath.TWO_PI), i > CesiumMath.PI && (i = i - CesiumMath.TWO_PI)), defined(n) ? (n.west = i, n.south = c, n.east = r, n.north = l, n) : new Rectangle(i, c, r, l); +}; +const fromBoundingSphereMatrixScratch = new Cartesian3(), fromBoundingSphereEastScratch = new Cartesian3(), fromBoundingSphereNorthScratch = new Cartesian3(), fromBoundingSphereWestScratch = new Cartesian3(), fromBoundingSphereSouthScratch = new Cartesian3(), fromBoundingSpherePositionsScratch = new Array(5); +for (let e = 0; e < fromBoundingSpherePositionsScratch.length; ++e) + fromBoundingSpherePositionsScratch[e] = new Cartesian3(); +Rectangle.fromBoundingSphere = function(e, t, n) { + const i = e.center, r = e.radius; + if (defined(t) || (t = Ellipsoid.default), defined(n) || (n = new Rectangle()), Cartesian3.equals(i, Cartesian3.ZERO)) + return Rectangle.clone(Rectangle.MAX_VALUE, n), n; + const o = Transforms.eastNorthUpToFixedFrame( + i, + t, + fromBoundingSphereMatrixScratch + ), s = Matrix4.multiplyByPointAsVector( + o, + Cartesian3.UNIT_X, + fromBoundingSphereEastScratch + ); + Cartesian3.normalize(s, s); + const c = Matrix4.multiplyByPointAsVector( + o, + Cartesian3.UNIT_Y, + fromBoundingSphereNorthScratch + ); + Cartesian3.normalize(c, c), Cartesian3.multiplyByScalar(c, r, c), Cartesian3.multiplyByScalar(s, r, s); + const l = Cartesian3.negate(c, fromBoundingSphereSouthScratch), d = Cartesian3.negate(s, fromBoundingSphereWestScratch), f = fromBoundingSpherePositionsScratch; + let h = f[0]; + return Cartesian3.add(i, c, h), h = f[1], Cartesian3.add(i, d, h), h = f[2], Cartesian3.add(i, l, h), h = f[3], Cartesian3.add(i, s, h), f[4] = i, Rectangle.fromCartesianArray(f, t, n); +}; +Rectangle.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.west = e.west, t.south = e.south, t.east = e.east, t.north = e.north, t) : new Rectangle( + e.west, + e.south, + e.east, + e.north + ); +}; +Rectangle.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e.west - t.west) <= n && Math.abs(e.south - t.south) <= n && Math.abs(e.east - t.east) <= n && Math.abs(e.north - t.north) <= n; +}; +Rectangle.prototype.clone = function(e) { + return Rectangle.clone(this, e); +}; +Rectangle.prototype.equals = function(e) { + return Rectangle.equals(this, e); +}; +Rectangle.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.west === t.west && e.south === t.south && e.east === t.east && e.north === t.north; +}; +Rectangle.prototype.equalsEpsilon = function(e, t) { + return Rectangle.equalsEpsilon(this, e, t); +}; +Rectangle.validate = function(e) { +}; +Rectangle.southwest = function(e, t) { + return defined(t) ? (t.longitude = e.west, t.latitude = e.south, t.height = 0, t) : new Cartographic(e.west, e.south); +}; +Rectangle.northwest = function(e, t) { + return defined(t) ? (t.longitude = e.west, t.latitude = e.north, t.height = 0, t) : new Cartographic(e.west, e.north); +}; +Rectangle.northeast = function(e, t) { + return defined(t) ? (t.longitude = e.east, t.latitude = e.north, t.height = 0, t) : new Cartographic(e.east, e.north); +}; +Rectangle.southeast = function(e, t) { + return defined(t) ? (t.longitude = e.east, t.latitude = e.south, t.height = 0, t) : new Cartographic(e.east, e.south); +}; +Rectangle.center = function(e, t) { + let n = e.east; + const i = e.west; + n < i && (n += CesiumMath.TWO_PI); + const r = CesiumMath.negativePiToPi((i + n) * 0.5), o = (e.south + e.north) * 0.5; + return defined(t) ? (t.longitude = r, t.latitude = o, t.height = 0, t) : new Cartographic(r, o); +}; +Rectangle.intersection = function(e, t, n) { + let i = e.east, r = e.west, o = t.east, s = t.west; + i < r && o > 0 ? i += CesiumMath.TWO_PI : o < s && i > 0 && (o += CesiumMath.TWO_PI), i < r && s < 0 ? s += CesiumMath.TWO_PI : o < s && r < 0 && (r += CesiumMath.TWO_PI); + const c = CesiumMath.negativePiToPi( + Math.max(r, s) + ), l = CesiumMath.negativePiToPi( + Math.min(i, o) + ); + if ((e.west < e.east || t.west < t.east) && l <= c) + return; + const d = Math.max(e.south, t.south), f = Math.min(e.north, t.north); + if (!(d >= f)) + return defined(n) ? (n.west = c, n.south = d, n.east = l, n.north = f, n) : new Rectangle(c, d, l, f); +}; +Rectangle.simpleIntersection = function(e, t, n) { + const i = Math.max(e.west, t.west), r = Math.max(e.south, t.south), o = Math.min(e.east, t.east), s = Math.min(e.north, t.north); + if (!(r >= s || i >= o)) + return defined(n) ? (n.west = i, n.south = r, n.east = o, n.north = s, n) : new Rectangle(i, r, o, s); +}; +Rectangle.union = function(e, t, n) { + defined(n) || (n = new Rectangle()); + let i = e.east, r = e.west, o = t.east, s = t.west; + i < r && o > 0 ? i += CesiumMath.TWO_PI : o < s && i > 0 && (o += CesiumMath.TWO_PI), i < r && s < 0 ? s += CesiumMath.TWO_PI : o < s && r < 0 && (r += CesiumMath.TWO_PI); + const c = CesiumMath.negativePiToPi( + Math.min(r, s) + ), l = CesiumMath.negativePiToPi( + Math.max(i, o) + ); + return n.west = c, n.south = Math.min(e.south, t.south), n.east = l, n.north = Math.max(e.north, t.north), n; +}; +Rectangle.expand = function(e, t, n) { + return defined(n) || (n = new Rectangle()), n.west = Math.min(e.west, t.longitude), n.south = Math.min(e.south, t.latitude), n.east = Math.max(e.east, t.longitude), n.north = Math.max(e.north, t.latitude), n; +}; +Rectangle.contains = function(e, t) { + let n = t.longitude; + const i = t.latitude, r = e.west; + let o = e.east; + return o < r && (o += CesiumMath.TWO_PI, n < 0 && (n += CesiumMath.TWO_PI)), (n > r || CesiumMath.equalsEpsilon(n, r, CesiumMath.EPSILON14)) && (n < o || CesiumMath.equalsEpsilon(n, o, CesiumMath.EPSILON14)) && i >= e.south && i <= e.north; +}; +const subsampleLlaScratch = new Cartographic(); +Rectangle.subsample = function(e, t, n, i) { + t = defaultValue(t, Ellipsoid.default), n = defaultValue(n, 0), defined(i) || (i = []); + let r = 0; + const o = e.north, s = e.south, c = e.east, l = e.west, d = subsampleLlaScratch; + d.height = n, d.longitude = l, d.latitude = o, i[r] = t.cartographicToCartesian(d, i[r]), r++, d.longitude = c, i[r] = t.cartographicToCartesian(d, i[r]), r++, d.latitude = s, i[r] = t.cartographicToCartesian(d, i[r]), r++, d.longitude = l, i[r] = t.cartographicToCartesian(d, i[r]), r++, o < 0 ? d.latitude = o : s > 0 ? d.latitude = s : d.latitude = 0; + for (let f = 1; f < 8; ++f) + d.longitude = -Math.PI + f * CesiumMath.PI_OVER_TWO, Rectangle.contains(e, d) && (i[r] = t.cartographicToCartesian(d, i[r]), r++); + return d.latitude === 0 && (d.longitude = l, i[r] = t.cartographicToCartesian(d, i[r]), r++, d.longitude = c, i[r] = t.cartographicToCartesian(d, i[r]), r++), i.length = r, i; +}; +Rectangle.subsection = function(e, t, n, i, r, o) { + if (defined(o) || (o = new Rectangle()), e.west <= e.east) { + const c = e.east - e.west; + o.west = e.west + t * c, o.east = e.west + i * c; + } else { + const c = CesiumMath.TWO_PI + e.east - e.west; + o.west = CesiumMath.negativePiToPi(e.west + t * c), o.east = CesiumMath.negativePiToPi(e.west + i * c); + } + const s = e.north - e.south; + return o.south = e.south + n * s, o.north = e.south + r * s, t === 1 && (o.west = e.east), i === 1 && (o.east = e.east), n === 1 && (o.south = e.north), r === 1 && (o.north = e.north), o; +}; +Rectangle.MAX_VALUE = Object.freeze( + new Rectangle( + -Math.PI, + -CesiumMath.PI_OVER_TWO, + Math.PI, + CesiumMath.PI_OVER_TWO + ) +); +function BoundingRectangle(e, t, n, i) { + this.x = defaultValue(e, 0), this.y = defaultValue(t, 0), this.width = defaultValue(n, 0), this.height = defaultValue(i, 0); +} +BoundingRectangle.packedLength = 4; +BoundingRectangle.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.x, t[n++] = e.y, t[n++] = e.width, t[n] = e.height, t; +}; +BoundingRectangle.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new BoundingRectangle()), n.x = e[t++], n.y = e[t++], n.width = e[t++], n.height = e[t], n; +}; +BoundingRectangle.fromPoints = function(e, t) { + if (defined(t) || (t = new BoundingRectangle()), !defined(e) || e.length === 0) + return t.x = 0, t.y = 0, t.width = 0, t.height = 0, t; + const n = e.length; + let i = e[0].x, r = e[0].y, o = e[0].x, s = e[0].y; + for (let c = 1; c < n; c++) { + const l = e[c], d = l.x, f = l.y; + i = Math.min(d, i), o = Math.max(d, o), r = Math.min(f, r), s = Math.max(f, s); + } + return t.x = i, t.y = r, t.width = o - i, t.height = s - r, t; +}; +const defaultProjection$1 = new GeographicProjection(), fromRectangleLowerLeft = new Cartographic(), fromRectangleUpperRight = new Cartographic(); +BoundingRectangle.fromRectangle = function(e, t, n) { + if (defined(n) || (n = new BoundingRectangle()), !defined(e)) + return n.x = 0, n.y = 0, n.width = 0, n.height = 0, n; + defaultProjection$1._ellipsoid = Ellipsoid.default, t = defaultValue(t, defaultProjection$1); + const i = t.project( + Rectangle.southwest(e, fromRectangleLowerLeft) + ), r = t.project( + Rectangle.northeast(e, fromRectangleUpperRight) + ); + return Cartesian2.subtract(r, i, r), n.x = i.x, n.y = i.y, n.width = r.x, n.height = r.y, n; +}; +BoundingRectangle.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.x = e.x, t.y = e.y, t.width = e.width, t.height = e.height, t) : new BoundingRectangle( + e.x, + e.y, + e.width, + e.height + ); +}; +BoundingRectangle.union = function(e, t, n) { + defined(n) || (n = new BoundingRectangle()); + const i = Math.min(e.x, t.x), r = Math.min(e.y, t.y), o = Math.max(e.x + e.width, t.x + t.width), s = Math.max(e.y + e.height, t.y + t.height); + return n.x = i, n.y = r, n.width = o - i, n.height = s - r, n; +}; +BoundingRectangle.expand = function(e, t, n) { + n = BoundingRectangle.clone(e, n); + const i = t.x - n.x, r = t.y - n.y; + return i > n.width ? n.width = i : i < 0 && (n.width -= i, n.x = t.x), r > n.height ? n.height = r : r < 0 && (n.height -= r, n.y = t.y), n; +}; +BoundingRectangle.intersect = function(e, t) { + const n = e.x, i = e.y, r = t.x, o = t.y; + return n > r + t.width || n + e.width < r || i + e.height < o || i > o + t.height ? Intersect$1.OUTSIDE : Intersect$1.INTERSECTING; +}; +BoundingRectangle.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.x === t.x && e.y === t.y && e.width === t.width && e.height === t.height; +}; +BoundingRectangle.prototype.clone = function(e) { + return BoundingRectangle.clone(this, e); +}; +BoundingRectangle.prototype.intersect = function(e) { + return BoundingRectangle.intersect(this, e); +}; +BoundingRectangle.prototype.equals = function(e) { + return BoundingRectangle.equals(this, e); +}; +const PrimitiveType = { + /** + * Points primitive where each vertex (or index) is a separate point. + * + * @type {number} + * @constant + */ + POINTS: WebGLConstants$1.POINTS, + /** + * Lines primitive where each two vertices (or indices) is a line segment. Line segments are not necessarily connected. + * + * @type {number} + * @constant + */ + LINES: WebGLConstants$1.LINES, + /** + * Line loop primitive where each vertex (or index) after the first connects a line to + * the previous vertex, and the last vertex implicitly connects to the first. + * + * @type {number} + * @constant + */ + LINE_LOOP: WebGLConstants$1.LINE_LOOP, + /** + * Line strip primitive where each vertex (or index) after the first connects a line to the previous vertex. + * + * @type {number} + * @constant + */ + LINE_STRIP: WebGLConstants$1.LINE_STRIP, + /** + * Triangles primitive where each three vertices (or indices) is a triangle. Triangles do not necessarily share edges. + * + * @type {number} + * @constant + */ + TRIANGLES: WebGLConstants$1.TRIANGLES, + /** + * Triangle strip primitive where each vertex (or index) after the first two connect to + * the previous two vertices forming a triangle. For example, this can be used to model a wall. + * + * @type {number} + * @constant + */ + TRIANGLE_STRIP: WebGLConstants$1.TRIANGLE_STRIP, + /** + * Triangle fan primitive where each vertex (or index) after the first two connect to + * the previous vertex and the first vertex forming a triangle. For example, this can be used + * to model a cone or circle. + * + * @type {number} + * @constant + */ + TRIANGLE_FAN: WebGLConstants$1.TRIANGLE_FAN +}; +PrimitiveType.isLines = function(e) { + return e === PrimitiveType.LINES || e === PrimitiveType.LINE_LOOP || e === PrimitiveType.LINE_STRIP; +}; +PrimitiveType.isTriangles = function(e) { + return e === PrimitiveType.TRIANGLES || e === PrimitiveType.TRIANGLE_STRIP || e === PrimitiveType.TRIANGLE_FAN; +}; +PrimitiveType.validate = function(e) { + return e === PrimitiveType.POINTS || e === PrimitiveType.LINES || e === PrimitiveType.LINE_LOOP || e === PrimitiveType.LINE_STRIP || e === PrimitiveType.TRIANGLES || e === PrimitiveType.TRIANGLE_STRIP || e === PrimitiveType.TRIANGLE_FAN; +}; +const PrimitiveType$1 = Object.freeze(PrimitiveType), ViewportQuadVS = `in vec4 position; +in vec2 textureCoordinates; + +out vec2 v_textureCoordinates; + +void main() +{ + gl_Position = position; + v_textureCoordinates = textureCoordinates; +} +`, Flags = { + CULL: 1, + OCCLUDE: 2, + EXECUTE_IN_CLOSEST_FRUSTUM: 4, + DEBUG_SHOW_BOUNDING_VOLUME: 8, + CAST_SHADOWS: 16, + RECEIVE_SHADOWS: 32, + PICK_ONLY: 64, + DEPTH_FOR_TRANSLUCENT_CLASSIFICATION: 128 +}; +function DrawCommand(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._boundingVolume = e.boundingVolume, this._orientedBoundingBox = e.orientedBoundingBox, this._modelMatrix = e.modelMatrix, this._primitiveType = defaultValue( + e.primitiveType, + PrimitiveType$1.TRIANGLES + ), this._vertexArray = e.vertexArray, this._count = e.count, this._offset = defaultValue(e.offset, 0), this._instanceCount = defaultValue(e.instanceCount, 0), this._shaderProgram = e.shaderProgram, this._uniformMap = e.uniformMap, this._renderState = e.renderState, this._framebuffer = e.framebuffer, this._pass = e.pass, this._owner = e.owner, this._debugOverlappingFrustums = 0, this._pickId = e.pickId, this._flags = 0, this.cull = defaultValue(e.cull, !0), this.occlude = defaultValue(e.occlude, !0), this.executeInClosestFrustum = defaultValue( + e.executeInClosestFrustum, + !1 + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.castShadows = defaultValue(e.castShadows, !1), this.receiveShadows = defaultValue(e.receiveShadows, !1), this.pickOnly = defaultValue(e.pickOnly, !1), this.depthForTranslucentClassification = defaultValue( + e.depthForTranslucentClassification, + !1 + ), this.dirty = !0, this.lastDirtyTime = 0, this.derivedCommands = {}; +} +function hasFlag(e, t) { + return (e._flags & t) === t; +} +function setFlag(e, t, n) { + n ? e._flags |= t : e._flags &= ~t; +} +Object.defineProperties(DrawCommand.prototype, { + /** + * The bounding volume of the geometry in world space. This is used for culling and frustum selection. + *

+ * For best rendering performance, use the tightest possible bounding volume. Although + * undefined is allowed, always try to provide a bounding volume to + * allow the tightest possible near and far planes to be computed for the scene, and + * minimize the number of frustums needed. + *

+ * + * @memberof DrawCommand.prototype + * @type {object} + * @default undefined + * + * @see DrawCommand#debugShowBoundingVolume + */ + boundingVolume: { + get: function() { + return this._boundingVolume; + }, + set: function(e) { + this._boundingVolume !== e && (this._boundingVolume = e, this.dirty = !0); + } + }, + /** + * The oriented bounding box of the geometry in world space. If this is defined, it is used instead of + * {@link DrawCommand#boundingVolume} for plane intersection testing. + * + * @memberof DrawCommand.prototype + * @type {OrientedBoundingBox} + * @default undefined + * + * @see DrawCommand#debugShowBoundingVolume + */ + orientedBoundingBox: { + get: function() { + return this._orientedBoundingBox; + }, + set: function(e) { + this._orientedBoundingBox !== e && (this._orientedBoundingBox = e, this.dirty = !0); + } + }, + /** + * When true, the renderer frustum and horizon culls the command based on its {@link DrawCommand#boundingVolume}. + * If the command was already culled, set this to false for a performance improvement. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default true + */ + cull: { + get: function() { + return hasFlag(this, Flags.CULL); + }, + set: function(e) { + hasFlag(this, Flags.CULL) !== e && (setFlag(this, Flags.CULL, e), this.dirty = !0); + } + }, + /** + * When true, the horizon culls the command based on its {@link DrawCommand#boundingVolume}. + * {@link DrawCommand#cull} must also be true in order for the command to be culled. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default true + */ + occlude: { + get: function() { + return hasFlag(this, Flags.OCCLUDE); + }, + set: function(e) { + hasFlag(this, Flags.OCCLUDE) !== e && (setFlag(this, Flags.OCCLUDE, e), this.dirty = !0); + } + }, + /** + * The transformation from the geometry in model space to world space. + *

+ * When undefined, the geometry is assumed to be defined in world space. + *

+ * + * @memberof DrawCommand.prototype + * @type {Matrix4} + * @default undefined + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._modelMatrix !== e && (this._modelMatrix = e, this.dirty = !0); + } + }, + /** + * The type of geometry in the vertex array. + * + * @memberof DrawCommand.prototype + * @type {PrimitiveType} + * @default PrimitiveType.TRIANGLES + */ + primitiveType: { + get: function() { + return this._primitiveType; + }, + set: function(e) { + this._primitiveType !== e && (this._primitiveType = e, this.dirty = !0); + } + }, + /** + * The vertex array. + * + * @memberof DrawCommand.prototype + * @type {VertexArray} + * @default undefined + */ + vertexArray: { + get: function() { + return this._vertexArray; + }, + set: function(e) { + this._vertexArray !== e && (this._vertexArray = e, this.dirty = !0); + } + }, + /** + * The number of vertices to draw in the vertex array. + * + * @memberof DrawCommand.prototype + * @type {number} + * @default undefined + */ + count: { + get: function() { + return this._count; + }, + set: function(e) { + this._count !== e && (this._count = e, this.dirty = !0); + } + }, + /** + * The offset to start drawing in the vertex array. + * + * @memberof DrawCommand.prototype + * @type {number} + * @default 0 + */ + offset: { + get: function() { + return this._offset; + }, + set: function(e) { + this._offset !== e && (this._offset = e, this.dirty = !0); + } + }, + /** + * The number of instances to draw. + * + * @memberof DrawCommand.prototype + * @type {number} + * @default 0 + */ + instanceCount: { + get: function() { + return this._instanceCount; + }, + set: function(e) { + this._instanceCount !== e && (this._instanceCount = e, this.dirty = !0); + } + }, + /** + * The shader program to apply. + * + * @memberof DrawCommand.prototype + * @type {ShaderProgram} + * @default undefined + */ + shaderProgram: { + get: function() { + return this._shaderProgram; + }, + set: function(e) { + this._shaderProgram !== e && (this._shaderProgram = e, this.dirty = !0); + } + }, + /** + * Whether this command should cast shadows when shadowing is enabled. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + */ + castShadows: { + get: function() { + return hasFlag(this, Flags.CAST_SHADOWS); + }, + set: function(e) { + hasFlag(this, Flags.CAST_SHADOWS) !== e && (setFlag(this, Flags.CAST_SHADOWS, e), this.dirty = !0); + } + }, + /** + * Whether this command should receive shadows when shadowing is enabled. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + */ + receiveShadows: { + get: function() { + return hasFlag(this, Flags.RECEIVE_SHADOWS); + }, + set: function(e) { + hasFlag(this, Flags.RECEIVE_SHADOWS) !== e && (setFlag(this, Flags.RECEIVE_SHADOWS, e), this.dirty = !0); + } + }, + /** + * An object with functions whose names match the uniforms in the shader program + * and return values to set those uniforms. + * + * @memberof DrawCommand.prototype + * @type {object} + * @default undefined + */ + uniformMap: { + get: function() { + return this._uniformMap; + }, + set: function(e) { + this._uniformMap !== e && (this._uniformMap = e, this.dirty = !0); + } + }, + /** + * The render state. + * + * @memberof DrawCommand.prototype + * @type {RenderState} + * @default undefined + */ + renderState: { + get: function() { + return this._renderState; + }, + set: function(e) { + this._renderState !== e && (this._renderState = e, this.dirty = !0); + } + }, + /** + * The framebuffer to draw to. + * + * @memberof DrawCommand.prototype + * @type {Framebuffer} + * @default undefined + */ + framebuffer: { + get: function() { + return this._framebuffer; + }, + set: function(e) { + this._framebuffer !== e && (this._framebuffer = e, this.dirty = !0); + } + }, + /** + * The pass when to render. + * + * @memberof DrawCommand.prototype + * @type {Pass} + * @default undefined + */ + pass: { + get: function() { + return this._pass; + }, + set: function(e) { + this._pass !== e && (this._pass = e, this.dirty = !0); + } + }, + /** + * Specifies if this command is only to be executed in the frustum closest + * to the eye containing the bounding volume. Defaults to false. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + */ + executeInClosestFrustum: { + get: function() { + return hasFlag(this, Flags.EXECUTE_IN_CLOSEST_FRUSTUM); + }, + set: function(e) { + hasFlag(this, Flags.EXECUTE_IN_CLOSEST_FRUSTUM) !== e && (setFlag(this, Flags.EXECUTE_IN_CLOSEST_FRUSTUM, e), this.dirty = !0); + } + }, + /** + * The object who created this command. This is useful for debugging command + * execution; it allows us to see who created a command when we only have a + * reference to the command, and can be used to selectively execute commands + * with {@link Scene#debugCommandFilter}. + * + * @memberof DrawCommand.prototype + * @type {object} + * @default undefined + * + * @see Scene#debugCommandFilter + */ + owner: { + get: function() { + return this._owner; + }, + set: function(e) { + this._owner !== e && (this._owner = e, this.dirty = !0); + } + }, + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the {@link DrawCommand#boundingVolume} for this command, assuming it is a sphere, when the command executes. + *

+ * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + * + * @see DrawCommand#boundingVolume + */ + debugShowBoundingVolume: { + get: function() { + return hasFlag(this, Flags.DEBUG_SHOW_BOUNDING_VOLUME); + }, + set: function(e) { + hasFlag(this, Flags.DEBUG_SHOW_BOUNDING_VOLUME) !== e && (setFlag(this, Flags.DEBUG_SHOW_BOUNDING_VOLUME, e), this.dirty = !0); + } + }, + /** + * Used to implement Scene.debugShowFrustums. + * @private + */ + debugOverlappingFrustums: { + get: function() { + return this._debugOverlappingFrustums; + }, + set: function(e) { + this._debugOverlappingFrustums !== e && (this._debugOverlappingFrustums = e, this.dirty = !0); + } + }, + /** + * A GLSL string that will evaluate to a pick id. When undefined, the command will only draw depth + * during the pick pass. + * + * @memberof DrawCommand.prototype + * @type {string} + * @default undefined + */ + pickId: { + get: function() { + return this._pickId; + }, + set: function(e) { + this._pickId !== e && (this._pickId = e, this.dirty = !0); + } + }, + /** + * Whether this command should be executed in the pick pass only. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + */ + pickOnly: { + get: function() { + return hasFlag(this, Flags.PICK_ONLY); + }, + set: function(e) { + hasFlag(this, Flags.PICK_ONLY) !== e && (setFlag(this, Flags.PICK_ONLY, e), this.dirty = !0); + } + }, + /** + * Whether this command should be derived to draw depth for classification of translucent primitives. + * + * @memberof DrawCommand.prototype + * @type {boolean} + * @default false + */ + depthForTranslucentClassification: { + get: function() { + return hasFlag(this, Flags.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION); + }, + set: function(e) { + hasFlag(this, Flags.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION) !== e && (setFlag(this, Flags.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION, e), this.dirty = !0); + } + } +}); +DrawCommand.shallowClone = function(e, t) { + if (defined(e)) + return defined(t) || (t = new DrawCommand()), t._boundingVolume = e._boundingVolume, t._orientedBoundingBox = e._orientedBoundingBox, t._modelMatrix = e._modelMatrix, t._primitiveType = e._primitiveType, t._vertexArray = e._vertexArray, t._count = e._count, t._offset = e._offset, t._instanceCount = e._instanceCount, t._shaderProgram = e._shaderProgram, t._uniformMap = e._uniformMap, t._renderState = e._renderState, t._framebuffer = e._framebuffer, t._pass = e._pass, t._owner = e._owner, t._debugOverlappingFrustums = e._debugOverlappingFrustums, t._pickId = e._pickId, t._flags = e._flags, t.dirty = !0, t.lastDirtyTime = 0, t; +}; +DrawCommand.prototype.execute = function(e, t) { + e.draw(this, t); +}; +const PixelDatatype = { + UNSIGNED_BYTE: WebGLConstants$1.UNSIGNED_BYTE, + UNSIGNED_SHORT: WebGLConstants$1.UNSIGNED_SHORT, + UNSIGNED_INT: WebGLConstants$1.UNSIGNED_INT, + FLOAT: WebGLConstants$1.FLOAT, + HALF_FLOAT: WebGLConstants$1.HALF_FLOAT_OES, + UNSIGNED_INT_24_8: WebGLConstants$1.UNSIGNED_INT_24_8, + UNSIGNED_SHORT_4_4_4_4: WebGLConstants$1.UNSIGNED_SHORT_4_4_4_4, + UNSIGNED_SHORT_5_5_5_1: WebGLConstants$1.UNSIGNED_SHORT_5_5_5_1, + UNSIGNED_SHORT_5_6_5: WebGLConstants$1.UNSIGNED_SHORT_5_6_5 +}; +PixelDatatype.toWebGLConstant = function(e, t) { + switch (e) { + case PixelDatatype.UNSIGNED_BYTE: + return WebGLConstants$1.UNSIGNED_BYTE; + case PixelDatatype.UNSIGNED_SHORT: + return WebGLConstants$1.UNSIGNED_SHORT; + case PixelDatatype.UNSIGNED_INT: + return WebGLConstants$1.UNSIGNED_INT; + case PixelDatatype.FLOAT: + return WebGLConstants$1.FLOAT; + case PixelDatatype.HALF_FLOAT: + return t.webgl2 ? WebGLConstants$1.HALF_FLOAT : WebGLConstants$1.HALF_FLOAT_OES; + case PixelDatatype.UNSIGNED_INT_24_8: + return WebGLConstants$1.UNSIGNED_INT_24_8; + case PixelDatatype.UNSIGNED_SHORT_4_4_4_4: + return WebGLConstants$1.UNSIGNED_SHORT_4_4_4_4; + case PixelDatatype.UNSIGNED_SHORT_5_5_5_1: + return WebGLConstants$1.UNSIGNED_SHORT_5_5_5_1; + case PixelDatatype.UNSIGNED_SHORT_5_6_5: + return PixelDatatype.UNSIGNED_SHORT_5_6_5; + } +}; +PixelDatatype.isPacked = function(e) { + return e === PixelDatatype.UNSIGNED_INT_24_8 || e === PixelDatatype.UNSIGNED_SHORT_4_4_4_4 || e === PixelDatatype.UNSIGNED_SHORT_5_5_5_1 || e === PixelDatatype.UNSIGNED_SHORT_5_6_5; +}; +PixelDatatype.sizeInBytes = function(e) { + switch (e) { + case PixelDatatype.UNSIGNED_BYTE: + return 1; + case PixelDatatype.UNSIGNED_SHORT: + case PixelDatatype.UNSIGNED_SHORT_4_4_4_4: + case PixelDatatype.UNSIGNED_SHORT_5_5_5_1: + case PixelDatatype.UNSIGNED_SHORT_5_6_5: + case PixelDatatype.HALF_FLOAT: + return 2; + case PixelDatatype.UNSIGNED_INT: + case PixelDatatype.FLOAT: + case PixelDatatype.UNSIGNED_INT_24_8: + return 4; + } +}; +PixelDatatype.validate = function(e) { + return e === PixelDatatype.UNSIGNED_BYTE || e === PixelDatatype.UNSIGNED_SHORT || e === PixelDatatype.UNSIGNED_INT || e === PixelDatatype.FLOAT || e === PixelDatatype.HALF_FLOAT || e === PixelDatatype.UNSIGNED_INT_24_8 || e === PixelDatatype.UNSIGNED_SHORT_4_4_4_4 || e === PixelDatatype.UNSIGNED_SHORT_5_5_5_1 || e === PixelDatatype.UNSIGNED_SHORT_5_6_5; +}; +PixelDatatype.getTypedArrayConstructor = function(e) { + const t = PixelDatatype.sizeInBytes(e); + return t === Uint8Array.BYTES_PER_ELEMENT ? Uint8Array : t === Uint16Array.BYTES_PER_ELEMENT ? Uint16Array : t === Float32Array.BYTES_PER_ELEMENT && e === PixelDatatype.FLOAT ? Float32Array : Uint32Array; +}; +const PixelDatatype$1 = Object.freeze(PixelDatatype), PixelFormat = { + /** + * A pixel format containing a depth value. + * + * @type {number} + * @constant + */ + DEPTH_COMPONENT: WebGLConstants$1.DEPTH_COMPONENT, + /** + * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}. + * + * @type {number} + * @constant + */ + DEPTH_STENCIL: WebGLConstants$1.DEPTH_STENCIL, + /** + * A pixel format containing an alpha channel. + * + * @type {number} + * @constant + */ + ALPHA: WebGLConstants$1.ALPHA, + /** + * A pixel format containing a red channel + * + * @type {number} + * @constant + */ + RED: WebGLConstants$1.RED, + /** + * A pixel format containing red and green channels. + * + * @type {number} + * @constant + */ + RG: WebGLConstants$1.RG, + /** + * A pixel format containing red, green, and blue channels. + * + * @type {number} + * @constant + */ + RGB: WebGLConstants$1.RGB, + /** + * A pixel format containing red, green, blue, and alpha channels. + * + * @type {number} + * @constant + */ + RGBA: WebGLConstants$1.RGBA, + /** + * A pixel format containing a luminance (intensity) channel. + * + * @type {number} + * @constant + */ + LUMINANCE: WebGLConstants$1.LUMINANCE, + /** + * A pixel format containing luminance (intensity) and alpha channels. + * + * @type {number} + * @constant + */ + LUMINANCE_ALPHA: WebGLConstants$1.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + * + * @type {number} + * @constant + */ + RGB_DXT1: WebGLConstants$1.COMPRESSED_RGB_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT1: WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT3: WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT3_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT5: WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT5_EXT, + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + * + * @type {number} + * @constant + */ + RGB_PVRTC_4BPPV1: WebGLConstants$1.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + * + * @type {number} + * @constant + */ + RGB_PVRTC_2BPPV1: WebGLConstants$1.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + * + * @type {number} + * @constant + */ + RGBA_PVRTC_4BPPV1: WebGLConstants$1.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + * + * @type {number} + * @constant + */ + RGBA_PVRTC_2BPPV1: WebGLConstants$1.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is ASTC compressed. + * + * @type {number} + * @constant + */ + RGBA_ASTC: WebGLConstants$1.COMPRESSED_RGBA_ASTC_4x4_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + * + * @type {number} + * @constant + */ + RGB_ETC1: WebGLConstants$1.COMPRESSED_RGB_ETC1_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC2 compressed. + * + * @type {number} + * @constant + */ + RGB8_ETC2: WebGLConstants$1.COMPRESSED_RGB8_ETC2, + /** + * A pixel format containing red, green, blue, and alpha channels that is ETC2 compressed. + * + * @type {number} + * @constant + */ + RGBA8_ETC2_EAC: WebGLConstants$1.COMPRESSED_RGBA8_ETC2_EAC, + /** + * A pixel format containing red, green, blue, and alpha channels that is BC7 compressed. + * + * @type {number} + * @constant + */ + RGBA_BC7: WebGLConstants$1.COMPRESSED_RGBA_BPTC_UNORM +}; +PixelFormat.componentsLength = function(e) { + switch (e) { + case PixelFormat.RGB: + return 3; + case PixelFormat.RGBA: + return 4; + case PixelFormat.LUMINANCE_ALPHA: + case PixelFormat.RG: + return 2; + case PixelFormat.ALPHA: + case PixelFormat.RED: + case PixelFormat.LUMINANCE: + return 1; + default: + return 1; + } +}; +PixelFormat.validate = function(e) { + return e === PixelFormat.DEPTH_COMPONENT || e === PixelFormat.DEPTH_STENCIL || e === PixelFormat.ALPHA || e === PixelFormat.RED || e === PixelFormat.RG || e === PixelFormat.RGB || e === PixelFormat.RGBA || e === PixelFormat.LUMINANCE || e === PixelFormat.LUMINANCE_ALPHA || e === PixelFormat.RGB_DXT1 || e === PixelFormat.RGBA_DXT1 || e === PixelFormat.RGBA_DXT3 || e === PixelFormat.RGBA_DXT5 || e === PixelFormat.RGB_PVRTC_4BPPV1 || e === PixelFormat.RGB_PVRTC_2BPPV1 || e === PixelFormat.RGBA_PVRTC_4BPPV1 || e === PixelFormat.RGBA_PVRTC_2BPPV1 || e === PixelFormat.RGBA_ASTC || e === PixelFormat.RGB_ETC1 || e === PixelFormat.RGB8_ETC2 || e === PixelFormat.RGBA8_ETC2_EAC || e === PixelFormat.RGBA_BC7; +}; +PixelFormat.isColorFormat = function(e) { + return e === PixelFormat.RED || e === PixelFormat.ALPHA || e === PixelFormat.RGB || e === PixelFormat.RGBA || e === PixelFormat.LUMINANCE || e === PixelFormat.LUMINANCE_ALPHA; +}; +PixelFormat.isDepthFormat = function(e) { + return e === PixelFormat.DEPTH_COMPONENT || e === PixelFormat.DEPTH_STENCIL; +}; +PixelFormat.isCompressedFormat = function(e) { + return e === PixelFormat.RGB_DXT1 || e === PixelFormat.RGBA_DXT1 || e === PixelFormat.RGBA_DXT3 || e === PixelFormat.RGBA_DXT5 || e === PixelFormat.RGB_PVRTC_4BPPV1 || e === PixelFormat.RGB_PVRTC_2BPPV1 || e === PixelFormat.RGBA_PVRTC_4BPPV1 || e === PixelFormat.RGBA_PVRTC_2BPPV1 || e === PixelFormat.RGBA_ASTC || e === PixelFormat.RGB_ETC1 || e === PixelFormat.RGB8_ETC2 || e === PixelFormat.RGBA8_ETC2_EAC || e === PixelFormat.RGBA_BC7; +}; +PixelFormat.isDXTFormat = function(e) { + return e === PixelFormat.RGB_DXT1 || e === PixelFormat.RGBA_DXT1 || e === PixelFormat.RGBA_DXT3 || e === PixelFormat.RGBA_DXT5; +}; +PixelFormat.isPVRTCFormat = function(e) { + return e === PixelFormat.RGB_PVRTC_4BPPV1 || e === PixelFormat.RGB_PVRTC_2BPPV1 || e === PixelFormat.RGBA_PVRTC_4BPPV1 || e === PixelFormat.RGBA_PVRTC_2BPPV1; +}; +PixelFormat.isASTCFormat = function(e) { + return e === PixelFormat.RGBA_ASTC; +}; +PixelFormat.isETC1Format = function(e) { + return e === PixelFormat.RGB_ETC1; +}; +PixelFormat.isETC2Format = function(e) { + return e === PixelFormat.RGB8_ETC2 || e === PixelFormat.RGBA8_ETC2_EAC; +}; +PixelFormat.isBC7Format = function(e) { + return e === PixelFormat.RGBA_BC7; +}; +PixelFormat.compressedTextureSizeInBytes = function(e, t, n) { + switch (e) { + case PixelFormat.RGB_DXT1: + case PixelFormat.RGBA_DXT1: + case PixelFormat.RGB_ETC1: + case PixelFormat.RGB8_ETC2: + return Math.floor((t + 3) / 4) * Math.floor((n + 3) / 4) * 8; + case PixelFormat.RGBA_DXT3: + case PixelFormat.RGBA_DXT5: + case PixelFormat.RGBA_ASTC: + case PixelFormat.RGBA8_ETC2_EAC: + return Math.floor((t + 3) / 4) * Math.floor((n + 3) / 4) * 16; + case PixelFormat.RGB_PVRTC_4BPPV1: + case PixelFormat.RGBA_PVRTC_4BPPV1: + return Math.floor((Math.max(t, 8) * Math.max(n, 8) * 4 + 7) / 8); + case PixelFormat.RGB_PVRTC_2BPPV1: + case PixelFormat.RGBA_PVRTC_2BPPV1: + return Math.floor( + (Math.max(t, 16) * Math.max(n, 8) * 2 + 7) / 8 + ); + case PixelFormat.RGBA_BC7: + return Math.ceil(t / 4) * Math.ceil(n / 4) * 16; + default: + return 0; + } +}; +PixelFormat.textureSizeInBytes = function(e, t, n, i) { + let r = PixelFormat.componentsLength(e); + return PixelDatatype$1.isPacked(t) && (r = 1), r * PixelDatatype$1.sizeInBytes(t) * n * i; +}; +PixelFormat.alignmentInBytes = function(e, t, n) { + const i = PixelFormat.textureSizeInBytes(e, t, n, 1) % 4; + return i === 0 ? 4 : i === 2 ? 2 : 1; +}; +PixelFormat.createTypedArray = function(e, t, n, i) { + const r = PixelDatatype$1.getTypedArrayConstructor(t), o = PixelFormat.componentsLength(e) * n * i; + return new r(o); +}; +PixelFormat.flipY = function(e, t, n, i, r) { + if (r === 1) + return e; + const o = PixelFormat.createTypedArray( + t, + n, + i, + r + ), s = PixelFormat.componentsLength(t), c = i * s; + for (let l = 0; l < r; ++l) { + const d = l * i * s, f = (r - l - 1) * i * s; + for (let h = 0; h < c; ++h) + o[f + h] = e[d + h]; + } + return o; +}; +PixelFormat.toInternalFormat = function(e, t, n) { + if (!n.webgl2) + return e; + if (e === PixelFormat.DEPTH_STENCIL) + return WebGLConstants$1.DEPTH24_STENCIL8; + if (e === PixelFormat.DEPTH_COMPONENT) { + if (t === PixelDatatype$1.UNSIGNED_SHORT) + return WebGLConstants$1.DEPTH_COMPONENT16; + if (t === PixelDatatype$1.UNSIGNED_INT) + return WebGLConstants$1.DEPTH_COMPONENT24; + } + if (t === PixelDatatype$1.FLOAT) + switch (e) { + case PixelFormat.RGBA: + return WebGLConstants$1.RGBA32F; + case PixelFormat.RGB: + return WebGLConstants$1.RGB32F; + case PixelFormat.RG: + return WebGLConstants$1.RG32F; + case PixelFormat.RED: + return WebGLConstants$1.R32F; + } + if (t === PixelDatatype$1.HALF_FLOAT) + switch (e) { + case PixelFormat.RGBA: + return WebGLConstants$1.RGBA16F; + case PixelFormat.RGB: + return WebGLConstants$1.RGB16F; + case PixelFormat.RG: + return WebGLConstants$1.RG16F; + case PixelFormat.RED: + return WebGLConstants$1.R16F; + } + return e; +}; +const PixelFormat$1 = Object.freeze(PixelFormat), ContextLimits = { + _maximumCombinedTextureImageUnits: 0, + _maximumCubeMapSize: 0, + _maximumFragmentUniformVectors: 0, + _maximumTextureImageUnits: 0, + _maximumRenderbufferSize: 0, + _maximumTextureSize: 0, + _maximumVaryingVectors: 0, + _maximumVertexAttributes: 0, + _maximumVertexTextureImageUnits: 0, + _maximumVertexUniformVectors: 0, + _minimumAliasedLineWidth: 0, + _maximumAliasedLineWidth: 0, + _minimumAliasedPointSize: 0, + _maximumAliasedPointSize: 0, + _maximumViewportWidth: 0, + _maximumViewportHeight: 0, + _maximumTextureFilterAnisotropy: 0, + _maximumDrawBuffers: 0, + _maximumColorAttachments: 0, + _maximumSamples: 0, + _highpFloatSupported: !1, + _highpIntSupported: !1 +}; +Object.defineProperties(ContextLimits, { + /** + * The maximum number of texture units that can be used from the vertex and fragment + * shader with this WebGL implementation. The minimum is eight. If both shaders access the + * same texture unit, this counts as two texture units. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_COMBINED_TEXTURE_IMAGE_UNITS. + */ + maximumCombinedTextureImageUnits: { + get: function() { + return ContextLimits._maximumCombinedTextureImageUnits; + } + }, + /** + * The approximate maximum cube mape width and height supported by this WebGL implementation. + * The minimum is 16, but most desktop and laptop implementations will support much larger sizes like 8,192. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_CUBE_MAP_TEXTURE_SIZE. + */ + maximumCubeMapSize: { + get: function() { + return ContextLimits._maximumCubeMapSize; + } + }, + /** + * The maximum number of vec4, ivec4, and bvec4 + * uniforms that can be used by a fragment shader with this WebGL implementation. The minimum is 16. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_FRAGMENT_UNIFORM_VECTORS. + */ + maximumFragmentUniformVectors: { + get: function() { + return ContextLimits._maximumFragmentUniformVectors; + } + }, + /** + * The maximum number of texture units that can be used from the fragment shader with this WebGL implementation. The minimum is eight. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_TEXTURE_IMAGE_UNITS. + */ + maximumTextureImageUnits: { + get: function() { + return ContextLimits._maximumTextureImageUnits; + } + }, + /** + * The maximum renderbuffer width and height supported by this WebGL implementation. + * The minimum is 16, but most desktop and laptop implementations will support much larger sizes like 8,192. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_RENDERBUFFER_SIZE. + */ + maximumRenderbufferSize: { + get: function() { + return ContextLimits._maximumRenderbufferSize; + } + }, + /** + * The approximate maximum texture width and height supported by this WebGL implementation. + * The minimum is 64, but most desktop and laptop implementations will support much larger sizes like 8,192. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_TEXTURE_SIZE. + */ + maximumTextureSize: { + get: function() { + return ContextLimits._maximumTextureSize; + } + }, + /** + * The maximum number of vec4 varying variables supported by this WebGL implementation. + * The minimum is eight. Matrices and arrays count as multiple vec4s. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VARYING_VECTORS. + */ + maximumVaryingVectors: { + get: function() { + return ContextLimits._maximumVaryingVectors; + } + }, + /** + * The maximum number of vec4 vertex attributes supported by this WebGL implementation. The minimum is eight. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VERTEX_ATTRIBS. + */ + maximumVertexAttributes: { + get: function() { + return ContextLimits._maximumVertexAttributes; + } + }, + /** + * The maximum number of texture units that can be used from the vertex shader with this WebGL implementation. + * The minimum is zero, which means the GL does not support vertex texture fetch. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VERTEX_TEXTURE_IMAGE_UNITS. + */ + maximumVertexTextureImageUnits: { + get: function() { + return ContextLimits._maximumVertexTextureImageUnits; + } + }, + /** + * The maximum number of vec4, ivec4, and bvec4 + * uniforms that can be used by a vertex shader with this WebGL implementation. The minimum is 16. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VERTEX_UNIFORM_VECTORS. + */ + maximumVertexUniformVectors: { + get: function() { + return ContextLimits._maximumVertexUniformVectors; + } + }, + /** + * The minimum aliased line width, in pixels, supported by this WebGL implementation. It will be at most one. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with ALIASED_LINE_WIDTH_RANGE. + */ + minimumAliasedLineWidth: { + get: function() { + return ContextLimits._minimumAliasedLineWidth; + } + }, + /** + * The maximum aliased line width, in pixels, supported by this WebGL implementation. It will be at least one. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with ALIASED_LINE_WIDTH_RANGE. + */ + maximumAliasedLineWidth: { + get: function() { + return ContextLimits._maximumAliasedLineWidth; + } + }, + /** + * The minimum aliased point size, in pixels, supported by this WebGL implementation. It will be at most one. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with ALIASED_POINT_SIZE_RANGE. + */ + minimumAliasedPointSize: { + get: function() { + return ContextLimits._minimumAliasedPointSize; + } + }, + /** + * The maximum aliased point size, in pixels, supported by this WebGL implementation. It will be at least one. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with ALIASED_POINT_SIZE_RANGE. + */ + maximumAliasedPointSize: { + get: function() { + return ContextLimits._maximumAliasedPointSize; + } + }, + /** + * The maximum supported width of the viewport. It will be at least as large as the visible width of the associated canvas. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VIEWPORT_DIMS. + */ + maximumViewportWidth: { + get: function() { + return ContextLimits._maximumViewportWidth; + } + }, + /** + * The maximum supported height of the viewport. It will be at least as large as the visible height of the associated canvas. + * @memberof ContextLimits + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with MAX_VIEWPORT_DIMS. + */ + maximumViewportHeight: { + get: function() { + return ContextLimits._maximumViewportHeight; + } + }, + /** + * The maximum degree of anisotropy for texture filtering + * @memberof ContextLimits + * @type {number} + */ + maximumTextureFilterAnisotropy: { + get: function() { + return ContextLimits._maximumTextureFilterAnisotropy; + } + }, + /** + * The maximum number of simultaneous outputs that may be written in a fragment shader. + * @memberof ContextLimits + * @type {number} + */ + maximumDrawBuffers: { + get: function() { + return ContextLimits._maximumDrawBuffers; + } + }, + /** + * The maximum number of color attachments supported. + * @memberof ContextLimits + * @type {number} + */ + maximumColorAttachments: { + get: function() { + return ContextLimits._maximumColorAttachments; + } + }, + /** + * The maximum number of samples supported for multisampling. + * @memberof ContextLimits + * @type {number} + */ + maximumSamples: { + get: function() { + return ContextLimits._maximumSamples; + } + }, + /** + * High precision float supported (highp) in fragment shaders. + * @memberof ContextLimits + * @type {boolean} + */ + highpFloatSupported: { + get: function() { + return ContextLimits._highpFloatSupported; + } + }, + /** + * High precision int supported (highp) in fragment shaders. + * @memberof ContextLimits + * @type {boolean} + */ + highpIntSupported: { + get: function() { + return ContextLimits._highpIntSupported; + } + } +}); +function attachTexture(e, t, n) { + const i = e._gl; + i.framebufferTexture2D( + i.FRAMEBUFFER, + t, + n._target, + n._texture, + 0 + ); +} +function attachRenderbuffer(e, t, n) { + const i = e._gl; + i.framebufferRenderbuffer( + i.FRAMEBUFFER, + t, + i.RENDERBUFFER, + n._getRenderbuffer() + ); +} +function Framebuffer(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.context._gl; + ContextLimits.maximumColorAttachments, this._gl = n, this._framebuffer = n.createFramebuffer(), this._colorTextures = [], this._colorRenderbuffers = [], this._activeColorAttachments = [], this._depthTexture = void 0, this._depthRenderbuffer = void 0, this._stencilRenderbuffer = void 0, this._depthStencilTexture = void 0, this._depthStencilRenderbuffer = void 0, this.destroyAttachments = defaultValue(e.destroyAttachments, !0), defined(e.depthTexture) || defined(e.depthRenderbuffer), defined(e.depthStencilTexture) || defined(e.depthStencilRenderbuffer), this._bind(); + let i, r, o, s, c; + if (defined(e.colorTextures)) { + const l = e.colorTextures; + for (s = this._colorTextures.length = this._activeColorAttachments.length = l.length, o = 0; o < s; ++o) + i = l[o], c = this._gl.COLOR_ATTACHMENT0 + o, attachTexture(this, c, i), this._activeColorAttachments[o] = c, this._colorTextures[o] = i; + } + if (defined(e.colorRenderbuffers)) { + const l = e.colorRenderbuffers; + for (s = this._colorRenderbuffers.length = this._activeColorAttachments.length = l.length, o = 0; o < s; ++o) + r = l[o], c = this._gl.COLOR_ATTACHMENT0 + o, attachRenderbuffer(this, c, r), this._activeColorAttachments[o] = c, this._colorRenderbuffers[o] = r; + } + defined(e.depthTexture) && (i = e.depthTexture, attachTexture(this, this._gl.DEPTH_ATTACHMENT, i), this._depthTexture = i), defined(e.depthRenderbuffer) && (r = e.depthRenderbuffer, attachRenderbuffer(this, this._gl.DEPTH_ATTACHMENT, r), this._depthRenderbuffer = r), defined(e.stencilRenderbuffer) && (r = e.stencilRenderbuffer, attachRenderbuffer(this, this._gl.STENCIL_ATTACHMENT, r), this._stencilRenderbuffer = r), defined(e.depthStencilTexture) && (i = e.depthStencilTexture, attachTexture(this, this._gl.DEPTH_STENCIL_ATTACHMENT, i), this._depthStencilTexture = i), defined(e.depthStencilRenderbuffer) && (r = e.depthStencilRenderbuffer, attachRenderbuffer(this, this._gl.DEPTH_STENCIL_ATTACHMENT, r), this._depthStencilRenderbuffer = r), this._unBind(); +} +Object.defineProperties(Framebuffer.prototype, { + /** + * The status of the framebuffer. If the status is not WebGLConstants.FRAMEBUFFER_COMPLETE, + * a {@link DeveloperError} will be thrown when attempting to render to the framebuffer. + * @memberof Framebuffer.prototype + * @type {number} + */ + status: { + get: function() { + this._bind(); + const e = this._gl.checkFramebufferStatus(this._gl.FRAMEBUFFER); + return this._unBind(), e; + } + }, + numberOfColorAttachments: { + get: function() { + return this._activeColorAttachments.length; + } + }, + depthTexture: { + get: function() { + return this._depthTexture; + } + }, + depthRenderbuffer: { + get: function() { + return this._depthRenderbuffer; + } + }, + stencilRenderbuffer: { + get: function() { + return this._stencilRenderbuffer; + } + }, + depthStencilTexture: { + get: function() { + return this._depthStencilTexture; + } + }, + depthStencilRenderbuffer: { + get: function() { + return this._depthStencilRenderbuffer; + } + }, + /** + * True if the framebuffer has a depth attachment. Depth attachments include + * depth and depth-stencil textures, and depth and depth-stencil renderbuffers. When + * rendering to a framebuffer, a depth attachment is required for the depth test to have effect. + * @memberof Framebuffer.prototype + * @type {boolean} + */ + hasDepthAttachment: { + get: function() { + return !!(this.depthTexture || this.depthRenderbuffer || this.depthStencilTexture || this.depthStencilRenderbuffer); + } + } +}); +Framebuffer.prototype._bind = function() { + const e = this._gl; + e.bindFramebuffer(e.FRAMEBUFFER, this._framebuffer); +}; +Framebuffer.prototype._unBind = function() { + const e = this._gl; + e.bindFramebuffer(e.FRAMEBUFFER, null); +}; +Framebuffer.prototype.bindDraw = function() { + const e = this._gl; + e.bindFramebuffer(e.DRAW_FRAMEBUFFER, this._framebuffer); +}; +Framebuffer.prototype.bindRead = function() { + const e = this._gl; + e.bindFramebuffer(e.READ_FRAMEBUFFER, this._framebuffer); +}; +Framebuffer.prototype._getActiveColorAttachments = function() { + return this._activeColorAttachments; +}; +Framebuffer.prototype.getColorTexture = function(e) { + return this._colorTextures[e]; +}; +Framebuffer.prototype.getColorRenderbuffer = function(e) { + return this._colorRenderbuffers[e]; +}; +Framebuffer.prototype.isDestroyed = function() { + return !1; +}; +Framebuffer.prototype.destroy = function() { + if (this.destroyAttachments) { + let e = 0; + const t = this._colorTextures; + let n = t.length; + for (; e < n; ++e) { + const r = t[e]; + defined(r) && r.destroy(); + } + const i = this._colorRenderbuffers; + for (n = i.length, e = 0; e < n; ++e) { + const r = i[e]; + defined(r) && r.destroy(); + } + this._depthTexture = this._depthTexture && this._depthTexture.destroy(), this._depthRenderbuffer = this._depthRenderbuffer && this._depthRenderbuffer.destroy(), this._stencilRenderbuffer = this._stencilRenderbuffer && this._stencilRenderbuffer.destroy(), this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(), this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy(); + } + return this._gl.deleteFramebuffer(this._framebuffer), destroyObject(this); +}; +const WindingOrder = { + /** + * Vertices are in clockwise order. + * + * @type {number} + * @constant + */ + CLOCKWISE: WebGLConstants$1.CW, + /** + * Vertices are in counter-clockwise order. + * + * @type {number} + * @constant + */ + COUNTER_CLOCKWISE: WebGLConstants$1.CCW +}; +WindingOrder.validate = function(e) { + return e === WindingOrder.CLOCKWISE || e === WindingOrder.COUNTER_CLOCKWISE; +}; +const WindingOrder$1 = Object.freeze(WindingOrder); +function freezeRenderState(e) { + if (typeof e != "object" || e === null) + return e; + let t; + const n = Object.keys(e); + for (let i = 0; i < n.length; i++) + t = n[i], e.hasOwnProperty(t) && t !== "_applyFunctions" && (e[t] = freezeRenderState(e[t])); + return Object.freeze(e); +} +function RenderState(e) { + const t = defaultValue(e, defaultValue.EMPTY_OBJECT), n = defaultValue(t.cull, defaultValue.EMPTY_OBJECT), i = defaultValue( + t.polygonOffset, + defaultValue.EMPTY_OBJECT + ), r = defaultValue(t.scissorTest, defaultValue.EMPTY_OBJECT), o = defaultValue( + r.rectangle, + defaultValue.EMPTY_OBJECT + ), s = defaultValue(t.depthRange, defaultValue.EMPTY_OBJECT), c = defaultValue(t.depthTest, defaultValue.EMPTY_OBJECT), l = defaultValue(t.colorMask, defaultValue.EMPTY_OBJECT), d = defaultValue(t.blending, defaultValue.EMPTY_OBJECT), f = defaultValue(d.color, defaultValue.EMPTY_OBJECT), h = defaultValue(t.stencilTest, defaultValue.EMPTY_OBJECT), p = defaultValue( + h.frontOperation, + defaultValue.EMPTY_OBJECT + ), m = defaultValue( + h.backOperation, + defaultValue.EMPTY_OBJECT + ), _ = defaultValue( + t.sampleCoverage, + defaultValue.EMPTY_OBJECT + ), y = t.viewport; + this.frontFace = defaultValue(t.frontFace, WindingOrder$1.COUNTER_CLOCKWISE), this.cull = { + enabled: defaultValue(n.enabled, !1), + face: defaultValue(n.face, WebGLConstants$1.BACK) + }, this.lineWidth = defaultValue(t.lineWidth, 1), this.polygonOffset = { + enabled: defaultValue(i.enabled, !1), + factor: defaultValue(i.factor, 0), + units: defaultValue(i.units, 0) + }, this.scissorTest = { + enabled: defaultValue(r.enabled, !1), + rectangle: BoundingRectangle.clone(o) + }, this.depthRange = { + near: defaultValue(s.near, 0), + far: defaultValue(s.far, 1) + }, this.depthTest = { + enabled: defaultValue(c.enabled, !1), + func: defaultValue(c.func, WebGLConstants$1.LESS) + // func, because function is a JavaScript keyword + }, this.colorMask = { + red: defaultValue(l.red, !0), + green: defaultValue(l.green, !0), + blue: defaultValue(l.blue, !0), + alpha: defaultValue(l.alpha, !0) + }, this.depthMask = defaultValue(t.depthMask, !0), this.stencilMask = defaultValue(t.stencilMask, -1), this.blending = { + enabled: defaultValue(d.enabled, !1), + color: new Color( + defaultValue(f.red, 0), + defaultValue(f.green, 0), + defaultValue(f.blue, 0), + defaultValue(f.alpha, 0) + ), + equationRgb: defaultValue(d.equationRgb, WebGLConstants$1.FUNC_ADD), + equationAlpha: defaultValue( + d.equationAlpha, + WebGLConstants$1.FUNC_ADD + ), + functionSourceRgb: defaultValue( + d.functionSourceRgb, + WebGLConstants$1.ONE + ), + functionSourceAlpha: defaultValue( + d.functionSourceAlpha, + WebGLConstants$1.ONE + ), + functionDestinationRgb: defaultValue( + d.functionDestinationRgb, + WebGLConstants$1.ZERO + ), + functionDestinationAlpha: defaultValue( + d.functionDestinationAlpha, + WebGLConstants$1.ZERO + ) + }, this.stencilTest = { + enabled: defaultValue(h.enabled, !1), + frontFunction: defaultValue( + h.frontFunction, + WebGLConstants$1.ALWAYS + ), + backFunction: defaultValue(h.backFunction, WebGLConstants$1.ALWAYS), + reference: defaultValue(h.reference, 0), + mask: defaultValue(h.mask, -1), + frontOperation: { + fail: defaultValue(p.fail, WebGLConstants$1.KEEP), + zFail: defaultValue(p.zFail, WebGLConstants$1.KEEP), + zPass: defaultValue(p.zPass, WebGLConstants$1.KEEP) + }, + backOperation: { + fail: defaultValue(m.fail, WebGLConstants$1.KEEP), + zFail: defaultValue(m.zFail, WebGLConstants$1.KEEP), + zPass: defaultValue(m.zPass, WebGLConstants$1.KEEP) + } + }, this.sampleCoverage = { + enabled: defaultValue(_.enabled, !1), + value: defaultValue(_.value, 1), + invert: defaultValue(_.invert, !1) + }, this.viewport = defined(y) ? new BoundingRectangle( + y.x, + y.y, + y.width, + y.height + ) : void 0, this.id = 0, this._applyFunctions = []; +} +let nextRenderStateId = 0, renderStateCache = {}; +RenderState.fromCache = function(e) { + const t = JSON.stringify(e); + let n = renderStateCache[t]; + if (defined(n)) + return ++n.referenceCount, n.state; + let i = new RenderState(e); + const r = JSON.stringify(i); + return n = renderStateCache[r], defined(n) || (i.id = nextRenderStateId++, n = { + referenceCount: 0, + state: i + }, renderStateCache[r] = n), ++n.referenceCount, renderStateCache[t] = { + referenceCount: 1, + state: n.state + }, n.state; +}; +RenderState.removeFromCache = function(e) { + const t = new RenderState(e), n = JSON.stringify(t), i = renderStateCache[n], r = JSON.stringify(e), o = renderStateCache[r]; + defined(o) && (--o.referenceCount, o.referenceCount === 0 && (delete renderStateCache[r], defined(i) && --i.referenceCount)), defined(i) && i.referenceCount === 0 && delete renderStateCache[n]; +}; +RenderState.getCache = function() { + return renderStateCache; +}; +RenderState.clearCache = function() { + renderStateCache = {}; +}; +function enableOrDisable(e, t, n) { + n ? e.enable(t) : e.disable(t); +} +function applyFrontFace(e, t) { + e.frontFace(t.frontFace); +} +function applyCull(e, t) { + const n = t.cull, i = n.enabled; + enableOrDisable(e, e.CULL_FACE, i), i && e.cullFace(n.face); +} +function applyLineWidth(e, t) { + e.lineWidth(t.lineWidth); +} +function applyPolygonOffset(e, t) { + const n = t.polygonOffset, i = n.enabled; + enableOrDisable(e, e.POLYGON_OFFSET_FILL, i), i && e.polygonOffset(n.factor, n.units); +} +function applyScissorTest(e, t, n) { + const i = t.scissorTest, r = defined(n.scissorTest) ? n.scissorTest.enabled : i.enabled; + if (enableOrDisable(e, e.SCISSOR_TEST, r), r) { + const o = defined(n.scissorTest) ? n.scissorTest.rectangle : i.rectangle; + e.scissor(o.x, o.y, o.width, o.height); + } +} +function applyDepthRange(e, t) { + const n = t.depthRange; + e.depthRange(n.near, n.far); +} +function applyDepthTest(e, t) { + const n = t.depthTest, i = n.enabled; + enableOrDisable(e, e.DEPTH_TEST, i), i && e.depthFunc(n.func); +} +function applyColorMask(e, t) { + const n = t.colorMask; + e.colorMask(n.red, n.green, n.blue, n.alpha); +} +function applyDepthMask(e, t) { + e.depthMask(t.depthMask); +} +function applyStencilMask(e, t) { + e.stencilMask(t.stencilMask); +} +function applyBlendingColor(e, t) { + e.blendColor(t.red, t.green, t.blue, t.alpha); +} +function applyBlending(e, t, n) { + const i = t.blending, r = defined(n.blendingEnabled) ? n.blendingEnabled : i.enabled; + enableOrDisable(e, e.BLEND, r), r && (applyBlendingColor(e, i.color), e.blendEquationSeparate(i.equationRgb, i.equationAlpha), e.blendFuncSeparate( + i.functionSourceRgb, + i.functionDestinationRgb, + i.functionSourceAlpha, + i.functionDestinationAlpha + )); +} +function applyStencilTest(e, t) { + const n = t.stencilTest, i = n.enabled; + if (enableOrDisable(e, e.STENCIL_TEST, i), i) { + const r = n.frontFunction, o = n.backFunction, s = n.reference, c = n.mask; + e.stencilFunc(r, s, c), e.stencilFuncSeparate(e.BACK, o, s, c), e.stencilFuncSeparate(e.FRONT, r, s, c); + const l = n.frontOperation, d = l.fail, f = l.zFail, h = l.zPass; + e.stencilOpSeparate( + e.FRONT, + d, + f, + h + ); + const p = n.backOperation, m = p.fail, _ = p.zFail, y = p.zPass; + e.stencilOpSeparate( + e.BACK, + m, + _, + y + ); + } +} +function applySampleCoverage(e, t) { + const n = t.sampleCoverage, i = n.enabled; + enableOrDisable(e, e.SAMPLE_COVERAGE, i), i && e.sampleCoverage(n.value, n.invert); +} +const scratchViewport$2 = new BoundingRectangle(); +function applyViewport(e, t, n) { + let i = defaultValue(t.viewport, n.viewport); + defined(i) || (i = scratchViewport$2, i.width = n.context.drawingBufferWidth, i.height = n.context.drawingBufferHeight), n.context.uniformState.viewport = i, e.viewport(i.x, i.y, i.width, i.height); +} +RenderState.apply = function(e, t, n) { + applyFrontFace(e, t), applyCull(e, t), applyLineWidth(e, t), applyPolygonOffset(e, t), applyDepthRange(e, t), applyDepthTest(e, t), applyColorMask(e, t), applyDepthMask(e, t), applyStencilMask(e, t), applyStencilTest(e, t), applySampleCoverage(e, t), applyScissorTest(e, t, n), applyBlending(e, t, n), applyViewport(e, t, n); +}; +function createFuncs(e, t) { + const n = []; + return e.frontFace !== t.frontFace && n.push(applyFrontFace), (e.cull.enabled !== t.cull.enabled || e.cull.face !== t.cull.face) && n.push(applyCull), e.lineWidth !== t.lineWidth && n.push(applyLineWidth), (e.polygonOffset.enabled !== t.polygonOffset.enabled || e.polygonOffset.factor !== t.polygonOffset.factor || e.polygonOffset.units !== t.polygonOffset.units) && n.push(applyPolygonOffset), (e.depthRange.near !== t.depthRange.near || e.depthRange.far !== t.depthRange.far) && n.push(applyDepthRange), (e.depthTest.enabled !== t.depthTest.enabled || e.depthTest.func !== t.depthTest.func) && n.push(applyDepthTest), (e.colorMask.red !== t.colorMask.red || e.colorMask.green !== t.colorMask.green || e.colorMask.blue !== t.colorMask.blue || e.colorMask.alpha !== t.colorMask.alpha) && n.push(applyColorMask), e.depthMask !== t.depthMask && n.push(applyDepthMask), e.stencilMask !== t.stencilMask && n.push(applyStencilMask), (e.stencilTest.enabled !== t.stencilTest.enabled || e.stencilTest.frontFunction !== t.stencilTest.frontFunction || e.stencilTest.backFunction !== t.stencilTest.backFunction || e.stencilTest.reference !== t.stencilTest.reference || e.stencilTest.mask !== t.stencilTest.mask || e.stencilTest.frontOperation.fail !== t.stencilTest.frontOperation.fail || e.stencilTest.frontOperation.zFail !== t.stencilTest.frontOperation.zFail || e.stencilTest.backOperation.fail !== t.stencilTest.backOperation.fail || e.stencilTest.backOperation.zFail !== t.stencilTest.backOperation.zFail || e.stencilTest.backOperation.zPass !== t.stencilTest.backOperation.zPass) && n.push(applyStencilTest), (e.sampleCoverage.enabled !== t.sampleCoverage.enabled || e.sampleCoverage.value !== t.sampleCoverage.value || e.sampleCoverage.invert !== t.sampleCoverage.invert) && n.push(applySampleCoverage), n; +} +RenderState.partialApply = function(e, t, n, i, r, o) { + if (t !== n) { + let f = n._applyFunctions[t.id]; + defined(f) || (f = createFuncs(t, n), n._applyFunctions[t.id] = f); + const h = f.length; + for (let p = 0; p < h; ++p) + f[p](e, n); + } + const s = defined(i.scissorTest) ? i.scissorTest : t.scissorTest, c = defined(r.scissorTest) ? r.scissorTest : n.scissorTest; + (s !== c || o) && applyScissorTest(e, n, r); + const l = defined(i.blendingEnabled) ? i.blendingEnabled : t.blending.enabled, d = defined(r.blendingEnabled) ? r.blendingEnabled : n.blending.enabled; + (l !== d || d && t.blending !== n.blending) && applyBlending(e, n, r), (t !== n || i !== r || i.context !== r.context) && applyViewport(e, n, r); +}; +RenderState.getState = function(e) { + return { + frontFace: e.frontFace, + cull: { + enabled: e.cull.enabled, + face: e.cull.face + }, + lineWidth: e.lineWidth, + polygonOffset: { + enabled: e.polygonOffset.enabled, + factor: e.polygonOffset.factor, + units: e.polygonOffset.units + }, + scissorTest: { + enabled: e.scissorTest.enabled, + rectangle: BoundingRectangle.clone(e.scissorTest.rectangle) + }, + depthRange: { + near: e.depthRange.near, + far: e.depthRange.far + }, + depthTest: { + enabled: e.depthTest.enabled, + func: e.depthTest.func + }, + colorMask: { + red: e.colorMask.red, + green: e.colorMask.green, + blue: e.colorMask.blue, + alpha: e.colorMask.alpha + }, + depthMask: e.depthMask, + stencilMask: e.stencilMask, + blending: { + enabled: e.blending.enabled, + color: Color.clone(e.blending.color), + equationRgb: e.blending.equationRgb, + equationAlpha: e.blending.equationAlpha, + functionSourceRgb: e.blending.functionSourceRgb, + functionSourceAlpha: e.blending.functionSourceAlpha, + functionDestinationRgb: e.blending.functionDestinationRgb, + functionDestinationAlpha: e.blending.functionDestinationAlpha + }, + stencilTest: { + enabled: e.stencilTest.enabled, + frontFunction: e.stencilTest.frontFunction, + backFunction: e.stencilTest.backFunction, + reference: e.stencilTest.reference, + mask: e.stencilTest.mask, + frontOperation: { + fail: e.stencilTest.frontOperation.fail, + zFail: e.stencilTest.frontOperation.zFail, + zPass: e.stencilTest.frontOperation.zPass + }, + backOperation: { + fail: e.stencilTest.backOperation.fail, + zFail: e.stencilTest.backOperation.zFail, + zPass: e.stencilTest.backOperation.zPass + } + }, + sampleCoverage: { + enabled: e.sampleCoverage.enabled, + value: e.sampleCoverage.value, + invert: e.sampleCoverage.invert + }, + viewport: defined(e.viewport) ? BoundingRectangle.clone(e.viewport) : void 0 + }; +}; +function Matrix2(e, t, n, i) { + this[0] = defaultValue(e, 0), this[1] = defaultValue(n, 0), this[2] = defaultValue(t, 0), this[3] = defaultValue(i, 0); +} +Matrix2.packedLength = 4; +Matrix2.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e[0], t[n++] = e[1], t[n++] = e[2], t[n++] = e[3], t; +}; +Matrix2.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new Matrix2()), n[0] = e[t++], n[1] = e[t++], n[2] = e[t++], n[3] = e[t++], n; +}; +Matrix2.packArray = function(e, t) { + const n = e.length, i = n * 4; + defined(t) ? !Array.isArray(t) && t.length !== i || t.length !== i && (t.length = i) : t = new Array(i); + for (let r = 0; r < n; ++r) + Matrix2.pack(e[r], t, r * 4); + return t; +}; +Matrix2.unpackArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n / 4 : t = new Array(n / 4); + for (let i = 0; i < n; i += 4) { + const r = i / 4; + t[r] = Matrix2.unpack(e, i, t[r]); + } + return t; +}; +Matrix2.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t) : new Matrix2(e[0], e[2], e[1], e[3]); +}; +Matrix2.fromArray = Matrix2.unpack; +Matrix2.fromColumnMajorArray = function(e, t) { + return Matrix2.clone(e, t); +}; +Matrix2.fromRowMajorArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[2], t[2] = e[1], t[3] = e[3], t) : new Matrix2(e[0], e[1], e[2], e[3]); +}; +Matrix2.fromScale = function(e, t) { + return defined(t) ? (t[0] = e.x, t[1] = 0, t[2] = 0, t[3] = e.y, t) : new Matrix2(e.x, 0, 0, e.y); +}; +Matrix2.fromUniformScale = function(e, t) { + return defined(t) ? (t[0] = e, t[1] = 0, t[2] = 0, t[3] = e, t) : new Matrix2(e, 0, 0, e); +}; +Matrix2.fromRotation = function(e, t) { + const n = Math.cos(e), i = Math.sin(e); + return defined(t) ? (t[0] = n, t[1] = i, t[2] = -i, t[3] = n, t) : new Matrix2(n, -i, i, n); +}; +Matrix2.toArray = function(e, t) { + return defined(t) ? (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t) : [e[0], e[1], e[2], e[3]]; +}; +Matrix2.getElementIndex = function(e, t) { + return e * 2 + t; +}; +Matrix2.getColumn = function(e, t, n) { + const i = t * 2, r = e[i], o = e[i + 1]; + return n.x = r, n.y = o, n; +}; +Matrix2.setColumn = function(e, t, n, i) { + i = Matrix2.clone(e, i); + const r = t * 2; + return i[r] = n.x, i[r + 1] = n.y, i; +}; +Matrix2.getRow = function(e, t, n) { + const i = e[t], r = e[t + 2]; + return n.x = i, n.y = r, n; +}; +Matrix2.setRow = function(e, t, n, i) { + return i = Matrix2.clone(e, i), i[t] = n.x, i[t + 2] = n.y, i; +}; +const scaleScratch1 = new Cartesian2(); +Matrix2.setScale = function(e, t, n) { + const i = Matrix2.getScale(e, scaleScratch1), r = t.x / i.x, o = t.y / i.y; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * o, n[3] = e[3] * o, n; +}; +const scaleScratch2 = new Cartesian2(); +Matrix2.setUniformScale = function(e, t, n) { + const i = Matrix2.getScale(e, scaleScratch2), r = t / i.x, o = t / i.y; + return n[0] = e[0] * r, n[1] = e[1] * r, n[2] = e[2] * o, n[3] = e[3] * o, n; +}; +const scratchColumn = new Cartesian2(); +Matrix2.getScale = function(e, t) { + return t.x = Cartesian2.magnitude( + Cartesian2.fromElements(e[0], e[1], scratchColumn) + ), t.y = Cartesian2.magnitude( + Cartesian2.fromElements(e[2], e[3], scratchColumn) + ), t; +}; +const scaleScratch3 = new Cartesian2(); +Matrix2.getMaximumScale = function(e) { + return Matrix2.getScale(e, scaleScratch3), Cartesian2.maximumComponent(scaleScratch3); +}; +const scaleScratch4 = new Cartesian2(); +Matrix2.setRotation = function(e, t, n) { + const i = Matrix2.getScale(e, scaleScratch4); + return n[0] = t[0] * i.x, n[1] = t[1] * i.x, n[2] = t[2] * i.y, n[3] = t[3] * i.y, n; +}; +const scaleScratch5 = new Cartesian2(); +Matrix2.getRotation = function(e, t) { + const n = Matrix2.getScale(e, scaleScratch5); + return t[0] = e[0] / n.x, t[1] = e[1] / n.x, t[2] = e[2] / n.y, t[3] = e[3] / n.y, t; +}; +Matrix2.multiply = function(e, t, n) { + const i = e[0] * t[0] + e[2] * t[1], r = e[0] * t[2] + e[2] * t[3], o = e[1] * t[0] + e[3] * t[1], s = e[1] * t[2] + e[3] * t[3]; + return n[0] = i, n[1] = o, n[2] = r, n[3] = s, n; +}; +Matrix2.add = function(e, t, n) { + return n[0] = e[0] + t[0], n[1] = e[1] + t[1], n[2] = e[2] + t[2], n[3] = e[3] + t[3], n; +}; +Matrix2.subtract = function(e, t, n) { + return n[0] = e[0] - t[0], n[1] = e[1] - t[1], n[2] = e[2] - t[2], n[3] = e[3] - t[3], n; +}; +Matrix2.multiplyByVector = function(e, t, n) { + const i = e[0] * t.x + e[2] * t.y, r = e[1] * t.x + e[3] * t.y; + return n.x = i, n.y = r, n; +}; +Matrix2.multiplyByScalar = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3] * t, n; +}; +Matrix2.multiplyByScale = function(e, t, n) { + return n[0] = e[0] * t.x, n[1] = e[1] * t.x, n[2] = e[2] * t.y, n[3] = e[3] * t.y, n; +}; +Matrix2.multiplyByUniformScale = function(e, t, n) { + return n[0] = e[0] * t, n[1] = e[1] * t, n[2] = e[2] * t, n[3] = e[3] * t, n; +}; +Matrix2.negate = function(e, t) { + return t[0] = -e[0], t[1] = -e[1], t[2] = -e[2], t[3] = -e[3], t; +}; +Matrix2.transpose = function(e, t) { + const n = e[0], i = e[2], r = e[1], o = e[3]; + return t[0] = n, t[1] = i, t[2] = r, t[3] = o, t; +}; +Matrix2.abs = function(e, t) { + return t[0] = Math.abs(e[0]), t[1] = Math.abs(e[1]), t[2] = Math.abs(e[2]), t[3] = Math.abs(e[3]), t; +}; +Matrix2.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[3] === t[3]; +}; +Matrix2.equalsArray = function(e, t, n) { + return e[0] === t[n] && e[1] === t[n + 1] && e[2] === t[n + 2] && e[3] === t[n + 3]; +}; +Matrix2.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e[0] - t[0]) <= n && Math.abs(e[1] - t[1]) <= n && Math.abs(e[2] - t[2]) <= n && Math.abs(e[3] - t[3]) <= n; +}; +Matrix2.IDENTITY = Object.freeze(new Matrix2(1, 0, 0, 1)); +Matrix2.ZERO = Object.freeze(new Matrix2(0, 0, 0, 0)); +Matrix2.COLUMN0ROW0 = 0; +Matrix2.COLUMN0ROW1 = 1; +Matrix2.COLUMN1ROW0 = 2; +Matrix2.COLUMN1ROW1 = 3; +Object.defineProperties(Matrix2.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix2.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix2.packedLength; + } + } +}); +Matrix2.prototype.clone = function(e) { + return Matrix2.clone(this, e); +}; +Matrix2.prototype.equals = function(e) { + return Matrix2.equals(this, e); +}; +Matrix2.prototype.equalsEpsilon = function(e, t) { + return Matrix2.equalsEpsilon(this, e, t); +}; +Matrix2.prototype.toString = function() { + return `(${this[0]}, ${this[2]}) +(${this[1]}, ${this[3]})`; +}; +function createUniform$1(e, t, n, i) { + switch (t.type) { + case e.FLOAT: + return new UniformFloat(e, t, n, i); + case e.FLOAT_VEC2: + return new UniformFloatVec2(e, t, n, i); + case e.FLOAT_VEC3: + return new UniformFloatVec3(e, t, n, i); + case e.FLOAT_VEC4: + return new UniformFloatVec4(e, t, n, i); + case e.SAMPLER_2D: + case e.SAMPLER_CUBE: + return new UniformSampler(e, t, n, i); + case e.INT: + case e.BOOL: + return new UniformInt(e, t, n, i); + case e.INT_VEC2: + case e.BOOL_VEC2: + return new UniformIntVec2(e, t, n, i); + case e.INT_VEC3: + case e.BOOL_VEC3: + return new UniformIntVec3(e, t, n, i); + case e.INT_VEC4: + case e.BOOL_VEC4: + return new UniformIntVec4(e, t, n, i); + case e.FLOAT_MAT2: + return new UniformMat2(e, t, n, i); + case e.FLOAT_MAT3: + return new UniformMat3(e, t, n, i); + case e.FLOAT_MAT4: + return new UniformMat4(e, t, n, i); + default: + throw new RuntimeError( + `Unrecognized uniform type: ${t.type} for uniform "${n}".` + ); + } +} +function UniformFloat(e, t, n, i) { + this.name = n, this.value = void 0, this._value = 0, this._gl = e, this._location = i; +} +UniformFloat.prototype.set = function() { + this.value !== this._value && (this._value = this.value, this._gl.uniform1f(this._location, this.value)); +}; +function UniformFloatVec2(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Cartesian2(), this._gl = e, this._location = i; +} +UniformFloatVec2.prototype.set = function() { + const e = this.value; + Cartesian2.equals(e, this._value) || (Cartesian2.clone(e, this._value), this._gl.uniform2f(this._location, e.x, e.y)); +}; +function UniformFloatVec3(e, t, n, i) { + this.name = n, this.value = void 0, this._value = void 0, this._gl = e, this._location = i; +} +UniformFloatVec3.prototype.set = function() { + const e = this.value; + defined(e.red) ? Color.equals(e, this._value) || (this._value = Color.clone(e, this._value), this._gl.uniform3f(this._location, e.red, e.green, e.blue)) : defined(e.x) && (Cartesian3.equals(e, this._value) || (this._value = Cartesian3.clone(e, this._value), this._gl.uniform3f(this._location, e.x, e.y, e.z))); +}; +function UniformFloatVec4(e, t, n, i) { + this.name = n, this.value = void 0, this._value = void 0, this._gl = e, this._location = i; +} +UniformFloatVec4.prototype.set = function() { + const e = this.value; + defined(e.red) ? Color.equals(e, this._value) || (this._value = Color.clone(e, this._value), this._gl.uniform4f(this._location, e.red, e.green, e.blue, e.alpha)) : defined(e.x) && (Cartesian4.equals(e, this._value) || (this._value = Cartesian4.clone(e, this._value), this._gl.uniform4f(this._location, e.x, e.y, e.z, e.w))); +}; +function UniformSampler(e, t, n, i) { + this.name = n, this.value = void 0, this._gl = e, this._location = i, this.textureUnitIndex = void 0; +} +UniformSampler.prototype.set = function() { + const e = this._gl; + e.activeTexture(e.TEXTURE0 + this.textureUnitIndex); + const t = this.value; + e.bindTexture(t._target, t._texture); +}; +UniformSampler.prototype._setSampler = function(e) { + return this.textureUnitIndex = e, this._gl.uniform1i(this._location, e), e + 1; +}; +function UniformInt(e, t, n, i) { + this.name = n, this.value = void 0, this._value = 0, this._gl = e, this._location = i; +} +UniformInt.prototype.set = function() { + this.value !== this._value && (this._value = this.value, this._gl.uniform1i(this._location, this.value)); +}; +function UniformIntVec2(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Cartesian2(), this._gl = e, this._location = i; +} +UniformIntVec2.prototype.set = function() { + const e = this.value; + Cartesian2.equals(e, this._value) || (Cartesian2.clone(e, this._value), this._gl.uniform2i(this._location, e.x, e.y)); +}; +function UniformIntVec3(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Cartesian3(), this._gl = e, this._location = i; +} +UniformIntVec3.prototype.set = function() { + const e = this.value; + Cartesian3.equals(e, this._value) || (Cartesian3.clone(e, this._value), this._gl.uniform3i(this._location, e.x, e.y, e.z)); +}; +function UniformIntVec4(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Cartesian4(), this._gl = e, this._location = i; +} +UniformIntVec4.prototype.set = function() { + const e = this.value; + Cartesian4.equals(e, this._value) || (Cartesian4.clone(e, this._value), this._gl.uniform4i(this._location, e.x, e.y, e.z, e.w)); +}; +const scratchUniformArray$1 = new Float32Array(4); +function UniformMat2(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Matrix2(), this._gl = e, this._location = i; +} +UniformMat2.prototype.set = function() { + if (!Matrix2.equalsArray(this.value, this._value, 0)) { + Matrix2.clone(this.value, this._value); + const e = Matrix2.toArray(this.value, scratchUniformArray$1); + this._gl.uniformMatrix2fv(this._location, !1, e); + } +}; +const scratchMat3Array = new Float32Array(9); +function UniformMat3(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Matrix3(), this._gl = e, this._location = i; +} +UniformMat3.prototype.set = function() { + if (!Matrix3.equalsArray(this.value, this._value, 0)) { + Matrix3.clone(this.value, this._value); + const e = Matrix3.toArray(this.value, scratchMat3Array); + this._gl.uniformMatrix3fv(this._location, !1, e); + } +}; +const scratchMat4Array = new Float32Array(16); +function UniformMat4(e, t, n, i) { + this.name = n, this.value = void 0, this._value = new Matrix4(), this._gl = e, this._location = i; +} +UniformMat4.prototype.set = function() { + if (!Matrix4.equalsArray(this.value, this._value, 0)) { + Matrix4.clone(this.value, this._value); + const e = Matrix4.toArray(this.value, scratchMat4Array); + this._gl.uniformMatrix4fv(this._location, !1, e); + } +}; +function createUniformArray(e, t, n, i) { + switch (t.type) { + case e.FLOAT: + return new UniformArrayFloat(e, t, n, i); + case e.FLOAT_VEC2: + return new UniformArrayFloatVec2( + e, + t, + n, + i + ); + case e.FLOAT_VEC3: + return new UniformArrayFloatVec3( + e, + t, + n, + i + ); + case e.FLOAT_VEC4: + return new UniformArrayFloatVec4( + e, + t, + n, + i + ); + case e.SAMPLER_2D: + case e.SAMPLER_CUBE: + return new UniformArraySampler(e, t, n, i); + case e.INT: + case e.BOOL: + return new UniformArrayInt(e, t, n, i); + case e.INT_VEC2: + case e.BOOL_VEC2: + return new UniformArrayIntVec2(e, t, n, i); + case e.INT_VEC3: + case e.BOOL_VEC3: + return new UniformArrayIntVec3(e, t, n, i); + case e.INT_VEC4: + case e.BOOL_VEC4: + return new UniformArrayIntVec4(e, t, n, i); + case e.FLOAT_MAT2: + return new UniformArrayMat2(e, t, n, i); + case e.FLOAT_MAT3: + return new UniformArrayMat3(e, t, n, i); + case e.FLOAT_MAT4: + return new UniformArrayMat4(e, t, n, i); + default: + throw new RuntimeError( + `Unrecognized uniform type: ${t.type} for uniform "${n}".` + ); + } +} +function UniformArrayFloat(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r), this._gl = e, this._location = i[0]; +} +UniformArrayFloat.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1; + for (let r = 0; r < t; ++r) { + const o = e[r]; + o !== n[r] && (n[r] = o, i = !0); + } + i && this._gl.uniform1fv(this._location, n); +}; +function UniformArrayFloatVec2(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 2), this._gl = e, this._location = i[0]; +} +UniformArrayFloatVec2.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Cartesian2.equalsArray(s, n, r) || (Cartesian2.pack(s, n, r), i = !0), r += 2; + } + i && this._gl.uniform2fv(this._location, n); +}; +function UniformArrayFloatVec3(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 3), this._gl = e, this._location = i[0]; +} +UniformArrayFloatVec3.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + defined(s.red) ? (s.red !== n[r] || s.green !== n[r + 1] || s.blue !== n[r + 2]) && (n[r] = s.red, n[r + 1] = s.green, n[r + 2] = s.blue, i = !0) : defined(s.x) && (Cartesian3.equalsArray(s, n, r) || (Cartesian3.pack(s, n, r), i = !0)), r += 3; + } + i && this._gl.uniform3fv(this._location, n); +}; +function UniformArrayFloatVec4(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 4), this._gl = e, this._location = i[0]; +} +UniformArrayFloatVec4.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + defined(s.red) ? Color.equalsArray(s, n, r) || (Color.pack(s, n, r), i = !0) : defined(s.x) && (Cartesian4.equalsArray(s, n, r) || (Cartesian4.pack(s, n, r), i = !0)), r += 4; + } + i && this._gl.uniform4fv(this._location, n); +}; +function UniformArraySampler(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r), this._gl = e, this._locations = i, this.textureUnitIndex = void 0; +} +UniformArraySampler.prototype.set = function() { + const e = this._gl, t = e.TEXTURE0 + this.textureUnitIndex, n = this.value, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + e.activeTexture(t + r), e.bindTexture(o._target, o._texture); + } +}; +UniformArraySampler.prototype._setSampler = function(e) { + this.textureUnitIndex = e; + const t = this._locations, n = t.length; + for (let i = 0; i < n; ++i) { + const r = e + i; + this._gl.uniform1i(t[i], r); + } + return e + n; +}; +function UniformArrayInt(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Int32Array(r), this._gl = e, this._location = i[0]; +} +UniformArrayInt.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1; + for (let r = 0; r < t; ++r) { + const o = e[r]; + o !== n[r] && (n[r] = o, i = !0); + } + i && this._gl.uniform1iv(this._location, n); +}; +function UniformArrayIntVec2(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Int32Array(r * 2), this._gl = e, this._location = i[0]; +} +UniformArrayIntVec2.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Cartesian2.equalsArray(s, n, r) || (Cartesian2.pack(s, n, r), i = !0), r += 2; + } + i && this._gl.uniform2iv(this._location, n); +}; +function UniformArrayIntVec3(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Int32Array(r * 3), this._gl = e, this._location = i[0]; +} +UniformArrayIntVec3.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Cartesian3.equalsArray(s, n, r) || (Cartesian3.pack(s, n, r), i = !0), r += 3; + } + i && this._gl.uniform3iv(this._location, n); +}; +function UniformArrayIntVec4(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Int32Array(r * 4), this._gl = e, this._location = i[0]; +} +UniformArrayIntVec4.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Cartesian4.equalsArray(s, n, r) || (Cartesian4.pack(s, n, r), i = !0), r += 4; + } + i && this._gl.uniform4iv(this._location, n); +}; +function UniformArrayMat2(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 4), this._gl = e, this._location = i[0]; +} +UniformArrayMat2.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Matrix2.equalsArray(s, n, r) || (Matrix2.pack(s, n, r), i = !0), r += 4; + } + i && this._gl.uniformMatrix2fv(this._location, !1, n); +}; +function UniformArrayMat3(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 9), this._gl = e, this._location = i[0]; +} +UniformArrayMat3.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Matrix3.equalsArray(s, n, r) || (Matrix3.pack(s, n, r), i = !0), r += 9; + } + i && this._gl.uniformMatrix3fv(this._location, !1, n); +}; +function UniformArrayMat4(e, t, n, i) { + const r = i.length; + this.name = n, this.value = new Array(r), this._value = new Float32Array(r * 16), this._gl = e, this._location = i[0]; +} +UniformArrayMat4.prototype.set = function() { + const e = this.value, t = e.length, n = this._value; + let i = !1, r = 0; + for (let o = 0; o < t; ++o) { + const s = e[o]; + Matrix4.equalsArray(s, n, r) || (Matrix4.pack(s, n, r), i = !0), r += 16; + } + i && this._gl.uniformMatrix4fv(this._location, !1, n); +}; +let nextShaderProgramId = 0; +function ShaderProgram(e) { + let t = e.vertexShaderText, n = e.fragmentShaderText; + typeof spector < "u" && (t = t.replace(/^#line/gm, "//#line"), n = n.replace(/^#line/gm, "//#line")); + const i = handleUniformPrecisionMismatches( + t, + n + ); + this._gl = e.gl, this._logShaderCompilation = e.logShaderCompilation, this._debugShaders = e.debugShaders, this._attributeLocations = e.attributeLocations, this._program = void 0, this._numberOfVertexAttributes = void 0, this._vertexAttributes = void 0, this._uniformsByName = void 0, this._uniforms = void 0, this._automaticUniforms = void 0, this._manualUniforms = void 0, this._duplicateUniformNames = i.duplicateUniformNames, this._cachedShader = void 0, this.maximumTextureUnitIndex = void 0, this._vertexShaderSource = e.vertexShaderSource, this._vertexShaderText = e.vertexShaderText, this._fragmentShaderSource = e.fragmentShaderSource, this._fragmentShaderText = i.fragmentShaderText, this.id = nextShaderProgramId++; +} +ShaderProgram.fromCache = function(e) { + return e = defaultValue(e, defaultValue.EMPTY_OBJECT), e.context.shaderCache.getShaderProgram(e); +}; +ShaderProgram.replaceCache = function(e) { + return e = defaultValue(e, defaultValue.EMPTY_OBJECT), e.context.shaderCache.replaceShaderProgram(e); +}; +Object.defineProperties(ShaderProgram.prototype, { + /** + * GLSL source for the shader program's vertex shader. + * @memberof ShaderProgram.prototype + * + * @type {ShaderSource} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * GLSL source for the shader program's fragment shader. + * @memberof ShaderProgram.prototype + * + * @type {ShaderSource} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + vertexAttributes: { + get: function() { + return initialize$g(this), this._vertexAttributes; + } + }, + numberOfVertexAttributes: { + get: function() { + return initialize$g(this), this._numberOfVertexAttributes; + } + }, + allUniforms: { + get: function() { + return initialize$g(this), this._uniformsByName; + } + } +}); +function extractUniforms(e) { + const t = [], n = e.match(/uniform.*?(?![^{]*})(?=[=\[;])/g); + if (defined(n)) { + const i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r].trim(), s = o.slice(o.lastIndexOf(" ") + 1); + t.push(s); + } + } + return t; +} +function handleUniformPrecisionMismatches(e, t) { + const n = {}; + if (!ContextLimits.highpFloatSupported || !ContextLimits.highpIntSupported) { + let i, r, o, s; + const c = extractUniforms(e), l = extractUniforms(t), d = c.length, f = l.length; + for (i = 0; i < d; i++) + for (r = 0; r < f; r++) + if (c[i] === l[r]) { + o = c[i], s = `czm_mediump_${o}`; + const h = new RegExp(`${o}\\b`, "g"); + t = t.replace(h, s), n[s] = o; + } + } + return { + fragmentShaderText: t, + duplicateUniformNames: n + }; +} +const consolePrefix = "[Cesium WebGL] "; +function createAndLinkProgram(e, t) { + const n = t._vertexShaderText, i = t._fragmentShaderText, r = e.createShader(e.VERTEX_SHADER); + e.shaderSource(r, n), e.compileShader(r); + const o = e.createShader(e.FRAGMENT_SHADER); + e.shaderSource(o, i), e.compileShader(o); + const s = e.createProgram(); + e.attachShader(s, r), e.attachShader(s, o); + const c = t._attributeLocations; + if (defined(c)) + for (const p in c) + c.hasOwnProperty(p) && e.bindAttribLocation( + s, + c[p], + p + ); + e.linkProgram(s); + let l; + if (e.getProgramParameter(s, e.LINK_STATUS)) + return t._logShaderCompilation && (l = e.getShaderInfoLog(r), defined(l) && l.length > 0 && console.log(`${consolePrefix}Vertex shader compile log: ${l}`), l = e.getShaderInfoLog(o), defined(l) && l.length > 0 && console.log(`${consolePrefix}Fragment shader compile log: ${l}`), l = e.getProgramInfoLog(s), defined(l) && l.length > 0 && console.log(`${consolePrefix}Shader program link log: ${l}`)), e.deleteShader(r), e.deleteShader(o), s; + let d; + const f = t._debugShaders; + throw e.getShaderParameter(o, e.COMPILE_STATUS) ? e.getShaderParameter(r, e.COMPILE_STATUS) ? (l = e.getProgramInfoLog(s), console.error(`${consolePrefix}Shader program link log: ${l}`), h(r, "vertex"), h(o, "fragment"), d = `Program failed to link. Link log: ${l}`) : (l = e.getShaderInfoLog(r), console.error(`${consolePrefix}Vertex shader compile log: ${l}`), console.error(`${consolePrefix} Vertex shader source: +${n}`), d = `Vertex shader failed to compile. Compile log: ${l}`) : (l = e.getShaderInfoLog(o), console.error(`${consolePrefix}Fragment shader compile log: ${l}`), console.error(`${consolePrefix} Fragment shader source: +${i}`), d = `Fragment shader failed to compile. Compile log: ${l}`), e.deleteShader(r), e.deleteShader(o), e.deleteProgram(s), new RuntimeError(d); + function h(p, m) { + if (!defined(f)) + return; + const _ = f.getTranslatedShaderSource(p); + if (_ === "") { + console.error(`${consolePrefix}${m} shader translation failed.`); + return; + } + console.error( + `${consolePrefix}Translated ${m} shaderSource: +${_}` + ); + } +} +function findVertexAttributes(e, t, n) { + const i = {}; + for (let r = 0; r < n; ++r) { + const o = e.getActiveAttrib(t, r), s = e.getAttribLocation(t, o.name); + i[o.name] = { + name: o.name, + type: o.type, + index: s + }; + } + return i; +} +function findUniforms(e, t) { + const n = {}, i = [], r = [], o = e.getProgramParameter(t, e.ACTIVE_UNIFORMS); + for (let s = 0; s < o; ++s) { + const c = e.getActiveUniform(t, s), l = "[0]", d = c.name.indexOf( + l, + c.name.length - l.length + ) !== -1 ? c.name.slice(0, c.name.length - 3) : c.name; + if (d.indexOf("gl_") !== 0) + if (c.name.indexOf("[") < 0) { + const f = e.getUniformLocation(t, d); + if (f !== null) { + const h = createUniform$1( + e, + c, + d, + f + ); + n[d] = h, i.push(h), h._setSampler && r.push(h); + } + } else { + let f, h, p, m; + const _ = d.indexOf("["); + if (_ >= 0) { + if (f = n[d.slice(0, _)], !defined(f)) + continue; + h = f._locations, h.length <= 1 && (p = f.value, m = e.getUniformLocation(t, d), m !== null && (h.push(m), p.push(e.getUniform(t, m)))); + } else { + h = []; + for (let y = 0; y < c.size; ++y) + m = e.getUniformLocation(t, `${d}[${y}]`), m !== null && h.push(m); + f = createUniformArray( + e, + c, + d, + h + ), n[d] = f, i.push(f), f._setSampler && r.push(f); + } + } + } + return { + uniformsByName: n, + uniforms: i, + samplerUniforms: r + }; +} +function partitionUniforms(e, t) { + const n = [], i = []; + for (const r in t) + if (t.hasOwnProperty(r)) { + const o = t[r]; + let s = r; + const c = e._duplicateUniformNames[s]; + defined(c) && (o.name = c, s = c); + const l = AutomaticUniforms[s]; + defined(l) ? n.push({ + uniform: o, + automaticUniform: l + }) : i.push(o); + } + return { + automaticUniforms: n, + manualUniforms: i + }; +} +function setSamplerUniforms(e, t, n) { + e.useProgram(t); + let i = 0; + const r = n.length; + for (let o = 0; o < r; ++o) + i = n[o]._setSampler(i); + return e.useProgram(null), i; +} +function initialize$g(e) { + defined(e._program) || reinitialize(e); +} +function reinitialize(e) { + const t = e._program, n = e._gl, i = createAndLinkProgram(n, e, e._debugShaders), r = n.getProgramParameter( + i, + n.ACTIVE_ATTRIBUTES + ), o = findUniforms(n, i), s = partitionUniforms( + e, + o.uniformsByName + ); + e._program = i, e._numberOfVertexAttributes = r, e._vertexAttributes = findVertexAttributes( + n, + i, + r + ), e._uniformsByName = o.uniformsByName, e._uniforms = o.uniforms, e._automaticUniforms = s.automaticUniforms, e._manualUniforms = s.manualUniforms, e.maximumTextureUnitIndex = setSamplerUniforms( + n, + i, + o.samplerUniforms + ), t && e._gl.deleteProgram(t), typeof spector < "u" && (e._program.__SPECTOR_rebuildProgram = function(c, l, d, f) { + const h = e._vertexShaderText, p = e._fragmentShaderText, m = / ! = /g; + e._vertexShaderText = c.replace(m, " != "), e._fragmentShaderText = l.replace(m, " != "); + try { + reinitialize(e), d(e._program); + } catch (_) { + e._vertexShaderText = h, e._fragmentShaderText = p; + const C = /(?:Compile|Link) error: ([^]*)/.exec(_.message); + f(C ? C[1] : _.message); + } + }); +} +ShaderProgram.prototype._bind = function() { + initialize$g(this), this._gl.useProgram(this._program); +}; +ShaderProgram.prototype._setUniforms = function(e, t, n) { + let i, r; + if (defined(e)) { + const c = this._manualUniforms; + for (i = c.length, r = 0; r < i; ++r) { + const l = c[r]; + l.value = e[l.name](); + } + } + const o = this._automaticUniforms; + for (i = o.length, r = 0; r < i; ++r) { + const c = o[r]; + c.uniform.value = c.automaticUniform.getValue(t); + } + const s = this._uniforms; + for (i = s.length, r = 0; r < i; ++r) + s[r].set(); + if (n) { + const c = this._gl, l = this._program; + c.validateProgram(l); + } +}; +ShaderProgram.prototype.isDestroyed = function() { + return !1; +}; +ShaderProgram.prototype.destroy = function() { + this._cachedShader.cache.releaseShaderProgram(this); +}; +ShaderProgram.prototype.finalDestroy = function() { + return this._gl.deleteProgram(this._program), destroyObject(this); +}; +function ComputeEngine(e) { + this._context = e; +} +let renderStateScratch; +const drawCommandScratch = new DrawCommand({ + primitiveType: PrimitiveType$1.TRIANGLES +}), clearCommandScratch = new ClearCommand({ + color: new Color(0, 0, 0, 0) +}); +function createFramebuffer$1(e, t) { + return new Framebuffer({ + context: e, + colorTextures: [t], + destroyAttachments: !1 + }); +} +function createViewportQuadShader(e, t) { + return ShaderProgram.fromCache({ + context: e, + vertexShaderSource: ViewportQuadVS, + fragmentShaderSource: t, + attributeLocations: { + position: 0, + textureCoordinates: 1 + } + }); +} +function createRenderState$1(e, t) { + return (!defined(renderStateScratch) || renderStateScratch.viewport.width !== e || renderStateScratch.viewport.height !== t) && (renderStateScratch = RenderState.fromCache({ + viewport: new BoundingRectangle(0, 0, e, t) + })), renderStateScratch; +} +ComputeEngine.prototype.execute = function(e) { + defined(e.preExecute) && e.preExecute(e); + const t = e.outputTexture, n = t.width, i = t.height, r = this._context, o = defined(e.vertexArray) ? e.vertexArray : r.getViewportQuadVertexArray(), s = defined(e.shaderProgram) ? e.shaderProgram : createViewportQuadShader(r, e.fragmentShaderSource), c = createFramebuffer$1(r, t), l = createRenderState$1(n, i), d = e.uniformMap, f = clearCommandScratch; + f.framebuffer = c, f.renderState = l, f.execute(r); + const h = drawCommandScratch; + h.vertexArray = o, h.renderState = l, h.shaderProgram = s, h.uniformMap = d, h.framebuffer = c, h.execute(r), c.destroy(), e.persists || (s.destroy(), defined(e.vertexArray) && o.destroy()), defined(e.postExecute) && e.postExecute(t); +}; +ComputeEngine.prototype.isDestroyed = function() { + return !1; +}; +ComputeEngine.prototype.destroy = function() { + return destroyObject(this); +}; +const ComponentDatatype = { + /** + * 8-bit signed byte corresponding to gl.BYTE and the type + * of an element in Int8Array. + * + * @type {number} + * @constant + */ + BYTE: WebGLConstants$1.BYTE, + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + * + * @type {number} + * @constant + */ + UNSIGNED_BYTE: WebGLConstants$1.UNSIGNED_BYTE, + /** + * 16-bit signed short corresponding to SHORT and the type + * of an element in Int16Array. + * + * @type {number} + * @constant + */ + SHORT: WebGLConstants$1.SHORT, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + * + * @type {number} + * @constant + */ + UNSIGNED_SHORT: WebGLConstants$1.UNSIGNED_SHORT, + /** + * 32-bit signed int corresponding to INT and the type + * of an element in Int32Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + */ + INT: WebGLConstants$1.INT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + */ + UNSIGNED_INT: WebGLConstants$1.UNSIGNED_INT, + /** + * 32-bit floating-point corresponding to FLOAT and the type + * of an element in Float32Array. + * + * @type {number} + * @constant + */ + FLOAT: WebGLConstants$1.FLOAT, + /** + * 64-bit floating-point corresponding to gl.DOUBLE (in Desktop OpenGL; + * this is not supported in WebGL, and is emulated in Cesium via {@link GeometryPipeline.encodeAttribute}) + * and the type of an element in Float64Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + * @default 0x140A + */ + DOUBLE: WebGLConstants$1.DOUBLE +}; +ComponentDatatype.getSizeInBytes = function(e) { + switch (e) { + case ComponentDatatype.BYTE: + return Int8Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_BYTE: + return Uint8Array.BYTES_PER_ELEMENT; + case ComponentDatatype.SHORT: + return Int16Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_SHORT: + return Uint16Array.BYTES_PER_ELEMENT; + case ComponentDatatype.INT: + return Int32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_INT: + return Uint32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.FLOAT: + return Float32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.DOUBLE: + return Float64Array.BYTES_PER_ELEMENT; + } +}; +ComponentDatatype.fromTypedArray = function(e) { + if (e instanceof Int8Array) + return ComponentDatatype.BYTE; + if (e instanceof Uint8Array) + return ComponentDatatype.UNSIGNED_BYTE; + if (e instanceof Int16Array) + return ComponentDatatype.SHORT; + if (e instanceof Uint16Array) + return ComponentDatatype.UNSIGNED_SHORT; + if (e instanceof Int32Array) + return ComponentDatatype.INT; + if (e instanceof Uint32Array) + return ComponentDatatype.UNSIGNED_INT; + if (e instanceof Float32Array) + return ComponentDatatype.FLOAT; + if (e instanceof Float64Array) + return ComponentDatatype.DOUBLE; +}; +ComponentDatatype.validate = function(e) { + return defined(e) && (e === ComponentDatatype.BYTE || e === ComponentDatatype.UNSIGNED_BYTE || e === ComponentDatatype.SHORT || e === ComponentDatatype.UNSIGNED_SHORT || e === ComponentDatatype.INT || e === ComponentDatatype.UNSIGNED_INT || e === ComponentDatatype.FLOAT || e === ComponentDatatype.DOUBLE); +}; +ComponentDatatype.createTypedArray = function(e, t) { + switch (e) { + case ComponentDatatype.BYTE: + return new Int8Array(t); + case ComponentDatatype.UNSIGNED_BYTE: + return new Uint8Array(t); + case ComponentDatatype.SHORT: + return new Int16Array(t); + case ComponentDatatype.UNSIGNED_SHORT: + return new Uint16Array(t); + case ComponentDatatype.INT: + return new Int32Array(t); + case ComponentDatatype.UNSIGNED_INT: + return new Uint32Array(t); + case ComponentDatatype.FLOAT: + return new Float32Array(t); + case ComponentDatatype.DOUBLE: + return new Float64Array(t); + } +}; +ComponentDatatype.createArrayBufferView = function(e, t, n, i) { + switch (n = defaultValue(n, 0), i = defaultValue( + i, + (t.byteLength - n) / ComponentDatatype.getSizeInBytes(e) + ), e) { + case ComponentDatatype.BYTE: + return new Int8Array(t, n, i); + case ComponentDatatype.UNSIGNED_BYTE: + return new Uint8Array(t, n, i); + case ComponentDatatype.SHORT: + return new Int16Array(t, n, i); + case ComponentDatatype.UNSIGNED_SHORT: + return new Uint16Array(t, n, i); + case ComponentDatatype.INT: + return new Int32Array(t, n, i); + case ComponentDatatype.UNSIGNED_INT: + return new Uint32Array(t, n, i); + case ComponentDatatype.FLOAT: + return new Float32Array(t, n, i); + case ComponentDatatype.DOUBLE: + return new Float64Array(t, n, i); + } +}; +ComponentDatatype.fromName = function(e) { + switch (e) { + case "BYTE": + return ComponentDatatype.BYTE; + case "UNSIGNED_BYTE": + return ComponentDatatype.UNSIGNED_BYTE; + case "SHORT": + return ComponentDatatype.SHORT; + case "UNSIGNED_SHORT": + return ComponentDatatype.UNSIGNED_SHORT; + case "INT": + return ComponentDatatype.INT; + case "UNSIGNED_INT": + return ComponentDatatype.UNSIGNED_INT; + case "FLOAT": + return ComponentDatatype.FLOAT; + case "DOUBLE": + return ComponentDatatype.DOUBLE; + } +}; +const ComponentDatatype$1 = Object.freeze(ComponentDatatype), warnings = {}; +function oneTimeWarning(e, t) { + defined(warnings[e]) || (warnings[e] = !0, console.warn(defaultValue(t, e))); +} +oneTimeWarning.geometryOutlines = "Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0."; +oneTimeWarning.geometryZIndex = "Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored"; +oneTimeWarning.geometryHeightReference = "Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored"; +oneTimeWarning.geometryExtrudedHeightReference = "Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored"; +function deprecationWarning(e, t) { + oneTimeWarning(e, t); +} +const GeometryType = { + NONE: 0, + TRIANGLES: 1, + LINES: 2, + POLYLINES: 3 +}, GeometryType$1 = Object.freeze(GeometryType); +function Geometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.attributes = e.attributes, this.indices = e.indices, this.primitiveType = defaultValue( + e.primitiveType, + PrimitiveType$1.TRIANGLES + ), this.boundingSphere = e.boundingSphere, this.geometryType = defaultValue(e.geometryType, GeometryType$1.NONE), this.boundingSphereCV = e.boundingSphereCV, this.offsetAttribute = e.offsetAttribute; +} +Geometry.computeNumberOfVertices = function(e) { + let t = -1; + for (const n in e.attributes) + if (e.attributes.hasOwnProperty(n) && defined(e.attributes[n]) && defined(e.attributes[n].values)) { + const i = e.attributes[n]; + t = i.values.length / i.componentsPerAttribute; + } + return t; +}; +const rectangleCenterScratch$3 = new Cartographic(), enuCenterScratch = new Cartesian3(), fixedFrameToEnuScratch = new Matrix4(), boundingRectanglePointsCartographicScratch = [ + new Cartographic(), + new Cartographic(), + new Cartographic() +], boundingRectanglePointsEnuScratch = [ + new Cartesian2(), + new Cartesian2(), + new Cartesian2() +], points2DScratch$2 = [new Cartesian2(), new Cartesian2(), new Cartesian2()], pointEnuScratch = new Cartesian3(), enuRotationScratch = new Quaternion(), enuRotationMatrixScratch = new Matrix4(), rotation2DScratch$1 = new Matrix2(); +Geometry._textureCoordinateRotationPoints = function(e, t, n, i) { + let r; + const o = Rectangle.center( + i, + rectangleCenterScratch$3 + ), s = Cartographic.toCartesian( + o, + n, + enuCenterScratch + ), c = Transforms.eastNorthUpToFixedFrame( + s, + n, + fixedFrameToEnuScratch + ), l = Matrix4.inverse( + c, + fixedFrameToEnuScratch + ), d = boundingRectanglePointsEnuScratch, f = boundingRectanglePointsCartographicScratch; + f[0].longitude = i.west, f[0].latitude = i.south, f[1].longitude = i.west, f[1].latitude = i.north, f[2].longitude = i.east, f[2].latitude = i.south; + let h = pointEnuScratch; + for (r = 0; r < 3; r++) + Cartographic.toCartesian(f[r], n, h), h = Matrix4.multiplyByPointAsVector(l, h, h), d[r].x = h.x, d[r].y = h.y; + const p = Quaternion.fromAxisAngle( + Cartesian3.UNIT_Z, + -t, + enuRotationScratch + ), m = Matrix3.fromQuaternion( + p, + enuRotationMatrixScratch + ), _ = e.length; + let y = Number.POSITIVE_INFINITY, C = Number.POSITIVE_INFINITY, T = Number.NEGATIVE_INFINITY, x = Number.NEGATIVE_INFINITY; + for (r = 0; r < _; r++) + h = Matrix4.multiplyByPointAsVector( + l, + e[r], + h + ), h = Matrix3.multiplyByVector(m, h, h), y = Math.min(y, h.x), C = Math.min(C, h.y), T = Math.max(T, h.x), x = Math.max(x, h.y); + const b = Matrix2.fromRotation( + t, + rotation2DScratch$1 + ), S = points2DScratch$2; + S[0].x = y, S[0].y = C, S[1].x = y, S[1].y = x, S[2].x = T, S[2].y = C; + const E = d[0], A = d[2].x - E.x, D = d[1].y - E.y; + for (r = 0; r < 3; r++) { + const L = S[r]; + Matrix2.multiplyByVector(b, L, L), L.x = (L.x - E.x) / A, L.y = (L.y - E.y) / D; + } + const P = S[0], I = S[1], M = S[2], R = new Array(6); + return Cartesian2.pack(P, R), Cartesian2.pack(I, R, 2), Cartesian2.pack(M, R, 4), R; +}; +function GeometryAttribute(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.componentDatatype = e.componentDatatype, this.componentsPerAttribute = e.componentsPerAttribute, this.normalize = defaultValue(e.normalize, !1), this.values = e.values; +} +function CompressedTextureBuffer(e, t, n, i, r) { + this._format = e, this._datatype = t, this._width = n, this._height = i, this._buffer = r; +} +Object.defineProperties(CompressedTextureBuffer.prototype, { + /** + * The format of the compressed texture. + * @type {PixelFormat} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + internalFormat: { + get: function() { + return this._format; + } + }, + /** + * The datatype of the compressed texture. + * @type {PixelDatatype} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + pixelDatatype: { + get: function() { + return this._datatype; + } + }, + /** + * The width of the texture. + * @type {number} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + width: { + get: function() { + return this._width; + } + }, + /** + * The height of the texture. + * @type {number} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + height: { + get: function() { + return this._height; + } + }, + /** + * The compressed texture buffer. + * @type {Uint8Array} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + bufferView: { + get: function() { + return this._buffer; + } + }, + /** + * The compressed texture buffer. Alias for bufferView. + * @type {Uint8Array} + * @readonly + * @memberof CompressedTextureBuffer.prototype + */ + arrayBufferView: { + get: function() { + return this._buffer; + } + } +}); +CompressedTextureBuffer.clone = function(e) { + if (defined(e)) + return new CompressedTextureBuffer( + e._format, + e._datatype, + e._width, + e._height, + e._buffer + ); +}; +CompressedTextureBuffer.prototype.clone = function() { + return CompressedTextureBuffer.clone(this); +}; +function canTransferArrayBuffer() { + if (!defined(TaskProcessor._canTransferArrayBuffer)) { + const e = createWorker("transferTypedArrayTest"); + e.postMessage = defaultValue( + e.webkitPostMessage, + e.postMessage + ); + const t = 99, n = new Int8Array([t]); + try { + e.postMessage( + { + array: n + }, + [n.buffer] + ); + } catch { + return TaskProcessor._canTransferArrayBuffer = !1, TaskProcessor._canTransferArrayBuffer; + } + TaskProcessor._canTransferArrayBuffer = new Promise((i) => { + e.onmessage = function(r) { + const o = r.data.array, s = defined(o) && o[0] === t; + i(s), e.terminate(), TaskProcessor._canTransferArrayBuffer = s; + }; + }); + } + return TaskProcessor._canTransferArrayBuffer; +} +const taskCompletedEvent = new Event(); +function urlFromScript(e) { + let t; + try { + t = new Blob([e], { + type: "application/javascript" + }); + } catch { + const r = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, o = new r(); + o.append(e), t = o.getBlob("application/javascript"); + } + return (window.URL || window.webkitURL).createObjectURL(t); +} +function createWorker(e) { + const t = new Uri(e), n = t.scheme().length !== 0 && t.fragment().length === 0, i = e.replace(/\.js$/, ""), r = {}; + let o, s; + if (isCrossOriginUrl(e)) + s = e; + else if (!n) { + const c = buildModuleUrl( + `${TaskProcessor._workerModulePrefix}/${i}.js` + ); + isCrossOriginUrl(c) && (s = c); + } + if (s) { + const c = `import "${s}";`; + return o = urlFromScript(c), r.type = "module", new Worker(o, r); + } + if (!n && typeof CESIUM_WORKERS < "u") { + const c = ` + importScripts("${urlFromScript(CESIUM_WORKERS)}"); + CesiumWorkers["${i}"](); + `; + return o = urlFromScript(c), new Worker(o, r); + } + if (o = e, n || (o = buildModuleUrl( + `${TaskProcessor._workerModulePrefix + i}.js` + )), !FeatureDetection.supportsEsmWebWorkers()) + throw new RuntimeError( + "This browser is not supported. Please update your browser to continue." + ); + return r.type = "module", new Worker(o, r); +} +async function getWebAssemblyLoaderConfig(e, t) { + const n = { + modulePath: void 0, + wasmBinaryFile: void 0, + wasmBinary: void 0 + }; + if (!FeatureDetection.supportsWebAssembly()) { + if (!defined(t.fallbackModulePath)) + throw new RuntimeError( + `This browser does not support Web Assembly, and no backup module was provided for ${e._workerPath}` + ); + return n.modulePath = buildModuleUrl(t.fallbackModulePath), n; + } + n.wasmBinaryFile = buildModuleUrl(t.wasmBinaryFile); + const i = await Resource.fetchArrayBuffer({ + url: n.wasmBinaryFile + }); + return n.wasmBinary = i, n; +} +function TaskProcessor(e, t) { + this._workerPath = e, this._maximumActiveTasks = defaultValue( + t, + Number.POSITIVE_INFINITY + ), this._activeTasks = 0, this._nextID = 0, this._webAssemblyPromise = void 0; +} +const createOnmessageHandler = (e, t, n, i) => { + const r = ({ data: o }) => { + if (o.id === t) { + if (defined(o.error)) { + let s = o.error; + s.name === "RuntimeError" ? (s = new RuntimeError(o.error.message), s.stack = o.error.stack) : s.name === "DeveloperError" ? (s = new DeveloperError(o.error.message), s.stack = o.error.stack) : s.name === "Error" && (s = new Error(o.error.message), s.stack = o.error.stack), taskCompletedEvent.raiseEvent(s), i(s); + } else + taskCompletedEvent.raiseEvent(), n(o.result); + e.removeEventListener("message", r); + } + }; + return r; +}, emptyTransferableObjectArray = []; +async function runTask(e, t, n) { + const i = await Promise.resolve(canTransferArrayBuffer()); + defined(n) ? i || (n.length = 0) : n = emptyTransferableObjectArray; + const r = e._nextID++, o = new Promise((s, c) => { + e._worker.addEventListener( + "message", + createOnmessageHandler(e._worker, r, s, c) + ); + }); + return e._worker.postMessage( + { + id: r, + baseUrl: buildModuleUrl.getCesiumBaseUrl().url, + parameters: t, + canTransferArrayBuffer: i + }, + n + ), o; +} +async function scheduleTask(e, t, n) { + ++e._activeTasks; + try { + const i = await runTask(e, t, n); + return --e._activeTasks, i; + } catch (i) { + throw --e._activeTasks, i; + } +} +TaskProcessor.prototype.scheduleTask = function(e, t) { + if (defined(this._worker) || (this._worker = createWorker(this._workerPath)), !(this._activeTasks >= this._maximumActiveTasks)) + return scheduleTask(this, e, t); +}; +TaskProcessor.prototype.initWebAssemblyModule = async function(e) { + if (defined(this._webAssemblyPromise)) + return this._webAssemblyPromise; + const t = async () => { + const n = this._worker = createWorker(this._workerPath), i = await getWebAssemblyLoaderConfig( + this, + e + ), r = await Promise.resolve(canTransferArrayBuffer()); + let o; + const s = i.wasmBinary; + defined(s) && r && (o = [s]); + const c = new Promise((l, d) => { + n.onmessage = function({ data: f }) { + defined(f) ? l(f.result) : d(new RuntimeError("Could not configure wasm module")); + }; + }); + return n.postMessage( + { + canTransferArrayBuffer: r, + parameters: { webAssemblyConfig: i } + }, + o + ), c; + }; + return this._webAssemblyPromise = t(), this._webAssemblyPromise; +}; +TaskProcessor.prototype.isDestroyed = function() { + return !1; +}; +TaskProcessor.prototype.destroy = function() { + return defined(this._worker) && this._worker.terminate(), destroyObject(this); +}; +TaskProcessor.taskCompletedEvent = taskCompletedEvent; +TaskProcessor._defaultWorkerModulePrefix = "Workers/"; +TaskProcessor._workerModulePrefix = TaskProcessor._defaultWorkerModulePrefix; +TaskProcessor._canTransferArrayBuffer = void 0; +function KTX2Transcoder() { +} +KTX2Transcoder._transcodeTaskProcessor = new TaskProcessor( + "transcodeKTX2", + Number.POSITIVE_INFINITY + // KTX2 transcoding is used in place of Resource.fetchImage, so it can't reject as "just soooo busy right now" +); +KTX2Transcoder._readyPromise = void 0; +function makeReadyPromise() { + const e = KTX2Transcoder._transcodeTaskProcessor.initWebAssemblyModule({ + wasmBinaryFile: "ThirdParty/basis_transcoder.wasm" + }).then(function(t) { + if (t) + return KTX2Transcoder._transcodeTaskProcessor; + throw new RuntimeError("KTX2 transcoder could not be initialized."); + }); + KTX2Transcoder._readyPromise = e; +} +KTX2Transcoder.transcode = function(e, t) { + return defined(KTX2Transcoder._readyPromise) || makeReadyPromise(), KTX2Transcoder._readyPromise.then(function(n) { + let i = e; + e instanceof ArrayBuffer && (i = new Uint8Array(e)); + const r = { + supportedTargetFormats: t, + ktx2Buffer: i + }; + return n.scheduleTask(r, [i.buffer]); + }).then(function(n) { + const i = n.length, r = Object.keys(n[0]); + for (let o = 0; o < i; o++) { + const s = n[o]; + for (let c = 0; c < r.length; c++) { + const l = s[r[c]]; + s[r[c]] = new CompressedTextureBuffer( + l.internalFormat, + l.datatype, + l.width, + l.height, + l.levelBuffer + ); + } + } + if (r.length === 1) { + for (let o = 0; o < i; ++o) + n[o] = n[o][r[0]]; + i === 1 && (n = n[0]); + } + return n; + }).catch(function(n) { + throw n; + }); +}; +let supportedTranscoderFormats; +loadKTX2.setKTX2SupportedFormats = function(e, t, n, i, r, o) { + supportedTranscoderFormats = { + s3tc: e, + pvrtc: t, + astc: n, + etc: i, + etc1: r, + bc7: o + }; +}; +function loadKTX2(e) { + let t; + return e instanceof ArrayBuffer || ArrayBuffer.isView(e) ? t = Promise.resolve(e) : t = Resource.createIfNeeded(e).fetchArrayBuffer(), t.then(function(n) { + return KTX2Transcoder.transcode(n, supportedTranscoderFormats); + }); +} +function CubeMapFace(e, t, n, i, r, o, s, c, l, d, f) { + this._context = e, this._texture = t, this._textureTarget = n, this._targetFace = i, this._pixelDatatype = s, this._internalFormat = r, this._pixelFormat = o, this._size = c, this._preMultiplyAlpha = l, this._flipY = d, this._initialized = f; +} +Object.defineProperties(CubeMapFace.prototype, { + pixelFormat: { + get: function() { + return this._pixelFormat; + } + }, + pixelDatatype: { + get: function() { + return this._pixelDatatype; + } + }, + _target: { + get: function() { + return this._targetFace; + } + } +}); +CubeMapFace.prototype.copyFrom = function(e) { + const { + xOffset: t = 0, + yOffset: n = 0, + source: i, + skipColorSpaceConversion: r = !1 + } = e, { width: o, height: s } = i, c = this._context._gl, l = this._textureTarget, d = this._targetFace; + c.activeTexture(c.TEXTURE0), c.bindTexture(l, this._texture); + let f = i.arrayBufferView; + const h = this._size, p = this._pixelFormat, m = this._internalFormat, _ = this._pixelDatatype, y = this._preMultiplyAlpha, C = this._flipY; + let T = 4; + defined(f) && (T = PixelFormat$1.alignmentInBytes( + p, + _, + o + )), c.pixelStorei(c.UNPACK_ALIGNMENT, T), r ? c.pixelStorei(c.UNPACK_COLORSPACE_CONVERSION_WEBGL, c.NONE) : c.pixelStorei( + c.UNPACK_COLORSPACE_CONVERSION_WEBGL, + c.BROWSER_DEFAULT_WEBGL + ); + let x = !1; + if (!this._initialized) { + let b; + t === 0 && n === 0 && o === h && s === h ? (defined(f) ? (c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), c.pixelStorei(c.UNPACK_FLIP_Y_WEBGL, !1), C && (f = PixelFormat$1.flipY( + f, + p, + _, + h, + h + )), b = f) : (c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL, y), c.pixelStorei(c.UNPACK_FLIP_Y_WEBGL, C), b = i), x = !0) : (c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), c.pixelStorei(c.UNPACK_FLIP_Y_WEBGL, !1), b = PixelFormat$1.createTypedArray( + p, + _, + h, + h + )), c.texImage2D( + d, + 0, + m, + h, + h, + 0, + p, + PixelDatatype$1.toWebGLConstant(_, this._context), + b + ), this._initialized = !0; + } + x || (defined(f) ? (c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), c.pixelStorei(c.UNPACK_FLIP_Y_WEBGL, !1), C && (f = PixelFormat$1.flipY( + f, + p, + _, + o, + s + )), c.texSubImage2D( + d, + 0, + t, + n, + o, + s, + p, + PixelDatatype$1.toWebGLConstant(_, this._context), + f + )) : (c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL, y), c.pixelStorei(c.UNPACK_FLIP_Y_WEBGL, C), c.texSubImage2D( + d, + 0, + t, + n, + p, + PixelDatatype$1.toWebGLConstant(_, this._context), + i + ))), c.bindTexture(l, null); +}; +CubeMapFace.prototype.copyFromFramebuffer = function(e, t, n, i, r, o) { + e = defaultValue(e, 0), t = defaultValue(t, 0), n = defaultValue(n, 0), i = defaultValue(i, 0), r = defaultValue(r, this._size), o = defaultValue(o, this._size); + const s = this._context._gl, c = this._textureTarget; + s.activeTexture(s.TEXTURE0), s.bindTexture(c, this._texture), s.copyTexSubImage2D( + this._targetFace, + 0, + e, + t, + n, + i, + r, + o + ), s.bindTexture(c, null), this._initialized = !0; +}; +const MipmapHint = { + DONT_CARE: WebGLConstants$1.DONT_CARE, + FASTEST: WebGLConstants$1.FASTEST, + NICEST: WebGLConstants$1.NICEST, + validate: function(e) { + return e === MipmapHint.DONT_CARE || e === MipmapHint.FASTEST || e === MipmapHint.NICEST; + } +}, MipmapHint$1 = Object.freeze(MipmapHint), TextureMagnificationFilter = { + /** + * Samples the texture by returning the closest pixel. + * + * @type {number} + * @constant + */ + NEAREST: WebGLConstants$1.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + * + * @type {number} + * @constant + */ + LINEAR: WebGLConstants$1.LINEAR +}; +TextureMagnificationFilter.validate = function(e) { + return e === TextureMagnificationFilter.NEAREST || e === TextureMagnificationFilter.LINEAR; +}; +const TextureMagnificationFilter$1 = Object.freeze(TextureMagnificationFilter), TextureMinificationFilter = { + /** + * Samples the texture by returning the closest pixel. + * + * @type {number} + * @constant + */ + NEAREST: WebGLConstants$1.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + * + * @type {number} + * @constant + */ + LINEAR: WebGLConstants$1.LINEAR, + /** + * Selects the nearest mip level and applies nearest sampling within that level. + *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ * + * @type {number} + * @constant + */ + NEAREST_MIPMAP_NEAREST: WebGLConstants$1.NEAREST_MIPMAP_NEAREST, + /** + * Selects the nearest mip level and applies linear sampling within that level. + *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ * + * @type {number} + * @constant + */ + LINEAR_MIPMAP_NEAREST: WebGLConstants$1.LINEAR_MIPMAP_NEAREST, + /** + * Read texture values with nearest sampling from two adjacent mip levels and linearly interpolate the results. + *

+ * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

+ *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ * + * @type {number} + * @constant + */ + NEAREST_MIPMAP_LINEAR: WebGLConstants$1.NEAREST_MIPMAP_LINEAR, + /** + * Read texture values with linear sampling from two adjacent mip levels and linearly interpolate the results. + *

+ * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

+ *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ * @type {number} + * @constant + */ + LINEAR_MIPMAP_LINEAR: WebGLConstants$1.LINEAR_MIPMAP_LINEAR +}; +TextureMinificationFilter.validate = function(e) { + return e === TextureMinificationFilter.NEAREST || e === TextureMinificationFilter.LINEAR || e === TextureMinificationFilter.NEAREST_MIPMAP_NEAREST || e === TextureMinificationFilter.LINEAR_MIPMAP_NEAREST || e === TextureMinificationFilter.NEAREST_MIPMAP_LINEAR || e === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR; +}; +const TextureMinificationFilter$1 = Object.freeze(TextureMinificationFilter), TextureWrap = { + CLAMP_TO_EDGE: WebGLConstants$1.CLAMP_TO_EDGE, + REPEAT: WebGLConstants$1.REPEAT, + MIRRORED_REPEAT: WebGLConstants$1.MIRRORED_REPEAT, + validate: function(e) { + return e === TextureWrap.CLAMP_TO_EDGE || e === TextureWrap.REPEAT || e === TextureWrap.MIRRORED_REPEAT; + } +}, TextureWrap$1 = Object.freeze(TextureWrap); +function Sampler(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + wrapS: t = TextureWrap$1.CLAMP_TO_EDGE, + wrapT: n = TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: i = TextureMinificationFilter$1.LINEAR, + magnificationFilter: r = TextureMagnificationFilter$1.LINEAR, + maximumAnisotropy: o = 1 + } = e; + this._wrapS = t, this._wrapT = n, this._minificationFilter = i, this._magnificationFilter = r, this._maximumAnisotropy = o; +} +Object.defineProperties(Sampler.prototype, { + wrapS: { + get: function() { + return this._wrapS; + } + }, + wrapT: { + get: function() { + return this._wrapT; + } + }, + minificationFilter: { + get: function() { + return this._minificationFilter; + } + }, + magnificationFilter: { + get: function() { + return this._magnificationFilter; + } + }, + maximumAnisotropy: { + get: function() { + return this._maximumAnisotropy; + } + } +}); +Sampler.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e._wrapS === t._wrapS && e._wrapT === t._wrapT && e._minificationFilter === t._minificationFilter && e._magnificationFilter === t._magnificationFilter && e._maximumAnisotropy === t._maximumAnisotropy; +}; +Sampler.NEAREST = Object.freeze( + new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) +); +function CubeMap(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + context: t, + source: n, + pixelFormat: i = PixelFormat$1.RGBA, + pixelDatatype: r = PixelDatatype$1.UNSIGNED_BYTE, + flipY: o = !0, + skipColorSpaceConversion: s = !1, + sampler: c = new Sampler() + } = e, l = e.preMultiplyAlpha || i === PixelFormat$1.RGB || i === PixelFormat$1.LUMINANCE; + let { width: d, height: f } = e; + defined(n) && ({ width: d, height: f } = n.positiveX); + const h = d, p = PixelFormat$1.textureSizeInBytes(i, r, h, h) * 6, m = PixelFormat$1.toInternalFormat( + i, + r, + t + ), _ = t._gl, y = _.TEXTURE_CUBE_MAP, C = _.createTexture(); + this._context = t, this._textureFilterAnisotropic = t._textureFilterAnisotropic, this._textureTarget = y, this._texture = C, this._pixelFormat = i, this._pixelDatatype = r, this._size = h, this._hasMipmap = !1, this._sizeInBytes = p, this._preMultiplyAlpha = l, this._flipY = o; + const T = defined(n); + function x(b) { + return new CubeMapFace( + t, + C, + y, + b, + m, + i, + r, + h, + l, + o, + T + ); + } + this._positiveX = x(_.TEXTURE_CUBE_MAP_POSITIVE_X), this._negativeX = x(_.TEXTURE_CUBE_MAP_NEGATIVE_X), this._positiveY = x(_.TEXTURE_CUBE_MAP_POSITIVE_Y), this._negativeY = x(_.TEXTURE_CUBE_MAP_NEGATIVE_Y), this._positiveZ = x(_.TEXTURE_CUBE_MAP_POSITIVE_Z), this._negativeZ = x(_.TEXTURE_CUBE_MAP_NEGATIVE_Z), this._sampler = c, setupSampler$1(this, c), _.activeTexture(_.TEXTURE0), _.bindTexture(y, C), s ? _.pixelStorei(_.UNPACK_COLORSPACE_CONVERSION_WEBGL, _.NONE) : _.pixelStorei( + _.UNPACK_COLORSPACE_CONVERSION_WEBGL, + _.BROWSER_DEFAULT_WEBGL + ); + for (const b of CubeMap.getFaceNames()) + loadFace(this[b], n == null ? void 0 : n[b], 0); + _.bindTexture(y, null); +} +CubeMap.FaceName = Object.freeze({ + POSITIVEX: "positiveX", + NEGATIVEX: "negativeX", + POSITIVEY: "positiveY", + NEGATIVEY: "negativeY", + POSITIVEZ: "positiveZ", + NEGATIVEZ: "negativeZ" +}); +function* makeFacesIterator() { + yield CubeMap.FaceName.POSITIVEX, yield CubeMap.FaceName.NEGATIVEX, yield CubeMap.FaceName.POSITIVEY, yield CubeMap.FaceName.NEGATIVEY, yield CubeMap.FaceName.POSITIVEZ, yield CubeMap.FaceName.NEGATIVEZ; +} +CubeMap.getFaceNames = function() { + return makeFacesIterator(); +}; +function loadFace(e, t, n) { + n = defaultValue(n, 0); + const i = e._targetFace, r = Math.max(Math.floor(e._size / 2 ** n), 1), o = e._pixelFormat, s = e._pixelDatatype, c = e._internalFormat, l = e._flipY, d = e._preMultiplyAlpha, f = e._context, h = f._gl; + if (!defined(t)) { + h.texImage2D( + i, + n, + c, + r, + r, + 0, + o, + PixelDatatype$1.toWebGLConstant(s, f), + null + ); + return; + } + let { arrayBufferView: p } = t, m = 4; + defined(p) && (m = PixelFormat$1.alignmentInBytes( + o, + s, + r + )), h.pixelStorei(h.UNPACK_ALIGNMENT, m), defined(p) ? (h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL, !1), l && (p = PixelFormat$1.flipY( + p, + o, + s, + r, + r + )), h.texImage2D( + i, + n, + c, + r, + r, + 0, + o, + PixelDatatype$1.toWebGLConstant(s, f), + p + )) : (h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL, d), h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL, l), h.texImage2D( + i, + n, + c, + o, + PixelDatatype$1.toWebGLConstant(s, f), + t + )); +} +Object.defineProperties(CubeMap.prototype, { + positiveX: { + get: function() { + return this._positiveX; + } + }, + negativeX: { + get: function() { + return this._negativeX; + } + }, + positiveY: { + get: function() { + return this._positiveY; + } + }, + negativeY: { + get: function() { + return this._negativeY; + } + }, + positiveZ: { + get: function() { + return this._positiveZ; + } + }, + negativeZ: { + get: function() { + return this._negativeZ; + } + }, + sampler: { + get: function() { + return this._sampler; + }, + set: function(e) { + setupSampler$1(this, e), this._sampler = e; + } + }, + pixelFormat: { + get: function() { + return this._pixelFormat; + } + }, + pixelDatatype: { + get: function() { + return this._pixelDatatype; + } + }, + width: { + get: function() { + return this._size; + } + }, + height: { + get: function() { + return this._size; + } + }, + sizeInBytes: { + get: function() { + return this._hasMipmap ? Math.floor(this._sizeInBytes * 4 / 3) : this._sizeInBytes; + } + }, + preMultiplyAlpha: { + get: function() { + return this._preMultiplyAlpha; + } + }, + flipY: { + get: function() { + return this._flipY; + } + }, + _target: { + get: function() { + return this._textureTarget; + } + } +}); +function setupSampler$1(e, t) { + let { minificationFilter: n, magnificationFilter: i } = t; + const r = [ + TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST, + TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR, + TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST, + TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR + ].includes(n), o = e._context, s = e._pixelDatatype; + (s === PixelDatatype$1.FLOAT && !o.textureFloatLinear || s === PixelDatatype$1.HALF_FLOAT && !o.textureHalfFloatLinear) && (n = r ? TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST : TextureMinificationFilter$1.NEAREST, i = TextureMagnificationFilter$1.NEAREST); + const c = o._gl, l = e._textureTarget; + c.activeTexture(c.TEXTURE0), c.bindTexture(l, e._texture), c.texParameteri(l, c.TEXTURE_MIN_FILTER, n), c.texParameteri(l, c.TEXTURE_MAG_FILTER, i), c.texParameteri(l, c.TEXTURE_WRAP_S, t.wrapS), c.texParameteri(l, c.TEXTURE_WRAP_T, t.wrapT), defined(e._textureFilterAnisotropic) && c.texParameteri( + l, + e._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, + t.maximumAnisotropy + ), c.bindTexture(l, null); +} +CubeMap.prototype.loadMipmaps = function(e, t) { + t = defaultValue(t, !1); + const n = this._context._gl, i = this._texture, r = this._textureTarget; + n.activeTexture(n.TEXTURE0), n.bindTexture(r, i), t ? n.pixelStorei(n.UNPACK_COLORSPACE_CONVERSION_WEBGL, n.NONE) : n.pixelStorei( + n.UNPACK_COLORSPACE_CONVERSION_WEBGL, + n.BROWSER_DEFAULT_WEBGL + ); + for (let o = 0; o < e.length; o++) { + const s = e[o], c = o + 1; + for (const l of CubeMap.getFaceNames()) + loadFace(this[l], s[l], c); + } + n.bindTexture(r, null), this._hasMipmap = !0; +}; +CubeMap.prototype.generateMipmap = function(e) { + e = defaultValue(e, MipmapHint$1.DONT_CARE), this._hasMipmap = !0; + const t = this._context._gl, n = this._textureTarget; + t.hint(t.GENERATE_MIPMAP_HINT, e), t.activeTexture(t.TEXTURE0), t.bindTexture(n, this._texture), t.generateMipmap(n), t.bindTexture(n, null); +}; +CubeMap.prototype.isDestroyed = function() { + return !1; +}; +CubeMap.prototype.destroy = function() { + return this._context._gl.deleteTexture(this._texture), this._positiveX = destroyObject(this._positiveX), this._negativeX = destroyObject(this._negativeX), this._positiveY = destroyObject(this._positiveY), this._negativeY = destroyObject(this._negativeY), this._positiveZ = destroyObject(this._positiveZ), this._negativeZ = destroyObject(this._negativeZ), destroyObject(this); +}; +function PassState(e) { + this.context = e, this.framebuffer = void 0, this.blendingEnabled = void 0, this.scissorTest = void 0, this.viewport = void 0; +} +const czm_degreesPerRadian = `/** + * A built-in GLSL floating-point constant for converting radians to degrees. + * + * @alias czm_degreesPerRadian + * @glslConstant + * + * @see CesiumMath.DEGREES_PER_RADIAN + * + * @example + * // GLSL declaration + * const float czm_degreesPerRadian = ...; + * + * // Example + * float deg = czm_degreesPerRadian * rad; + */ +const float czm_degreesPerRadian = 57.29577951308232; +`, czm_depthRange = `/** + * A built-in GLSL vec2 constant for defining the depth range. + * This is a workaround to a bug where IE11 does not implement gl_DepthRange. + * + * @alias czm_depthRange + * @glslConstant + * + * @example + * // GLSL declaration + * float depthRangeNear = czm_depthRange.near; + * float depthRangeFar = czm_depthRange.far; + * + */ +const czm_depthRangeStruct czm_depthRange = czm_depthRangeStruct(0.0, 1.0); +`, czm_epsilon1 = `/** + * 0.1 + * + * @name czm_epsilon1 + * @glslConstant + */ +const float czm_epsilon1 = 0.1; +`, czm_epsilon2 = `/** + * 0.01 + * + * @name czm_epsilon2 + * @glslConstant + */ +const float czm_epsilon2 = 0.01; +`, czm_epsilon3 = `/** + * 0.001 + * + * @name czm_epsilon3 + * @glslConstant + */ +const float czm_epsilon3 = 0.001; +`, czm_epsilon4 = `/** + * 0.0001 + * + * @name czm_epsilon4 + * @glslConstant + */ +const float czm_epsilon4 = 0.0001; +`, czm_epsilon5 = `/** + * 0.00001 + * + * @name czm_epsilon5 + * @glslConstant + */ +const float czm_epsilon5 = 0.00001; +`, czm_epsilon6 = `/** + * 0.000001 + * + * @name czm_epsilon6 + * @glslConstant + */ +const float czm_epsilon6 = 0.000001; +`, czm_epsilon7 = `/** + * 0.0000001 + * + * @name czm_epsilon7 + * @glslConstant + */ +const float czm_epsilon7 = 0.0000001; +`, czm_infinity = `/** + * DOC_TBA + * + * @name czm_infinity + * @glslConstant + */ +const float czm_infinity = 5906376272000.0; // Distance from the Sun to Pluto in meters. TODO: What is best given lowp, mediump, and highp? +`, czm_oneOverPi = `/** + * A built-in GLSL floating-point constant for 1/pi. + * + * @alias czm_oneOverPi + * @glslConstant + * + * @see CesiumMath.ONE_OVER_PI + * + * @example + * // GLSL declaration + * const float czm_oneOverPi = ...; + * + * // Example + * float pi = 1.0 / czm_oneOverPi; + */ +const float czm_oneOverPi = 0.3183098861837907; +`, czm_oneOverTwoPi = `/** + * A built-in GLSL floating-point constant for 1/2pi. + * + * @alias czm_oneOverTwoPi + * @glslConstant + * + * @see CesiumMath.ONE_OVER_TWO_PI + * + * @example + * // GLSL declaration + * const float czm_oneOverTwoPi = ...; + * + * // Example + * float pi = 2.0 * czm_oneOverTwoPi; + */ +const float czm_oneOverTwoPi = 0.15915494309189535; +`, czm_passCesium3DTile = `/** + * The automatic GLSL constant for {@link Pass#CESIUM_3D_TILE} + * + * @name czm_passCesium3DTile + * @glslConstant + * + * @see czm_pass + */ +const float czm_passCesium3DTile = 4.0; +`, czm_passCesium3DTileClassification = `/** + * The automatic GLSL constant for {@link Pass#CESIUM_3D_TILE_CLASSIFICATION} + * + * @name czm_passCesium3DTileClassification + * @glslConstant + * + * @see czm_pass + */ +const float czm_passCesium3DTileClassification = 5.0; +`, czm_passCesium3DTileClassificationIgnoreShow = `/** + * The automatic GLSL constant for {@link Pass#CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW} + * + * @name czm_passCesium3DTileClassificationIgnoreShow + * @glslConstant + * + * @see czm_pass + */ +const float czm_passCesium3DTileClassificationIgnoreShow = 6.0; +`, czm_passClassification = `/** + * The automatic GLSL constant for {@link Pass#CLASSIFICATION} + * + * @name czm_passClassification + * @glslConstant + * + * @see czm_pass + */ +const float czm_passClassification = 7.0; +`, czm_passCompute = `/** + * The automatic GLSL constant for {@link Pass#COMPUTE} + * + * @name czm_passCompute + * @glslConstant + * + * @see czm_pass + */ +const float czm_passCompute = 1.0; +`, czm_passEnvironment = `/** + * The automatic GLSL constant for {@link Pass#ENVIRONMENT} + * + * @name czm_passEnvironment + * @glslConstant + * + * @see czm_pass + */ +const float czm_passEnvironment = 0.0; +`, czm_passGlobe = `/** + * The automatic GLSL constant for {@link Pass#GLOBE} + * + * @name czm_passGlobe + * @glslConstant + * + * @see czm_pass + */ +const float czm_passGlobe = 2.0; +`, czm_passOpaque = `/** + * The automatic GLSL constant for {@link Pass#OPAQUE} + * + * @name czm_passOpaque + * @glslConstant + * + * @see czm_pass + */ +const float czm_passOpaque = 7.0; +`, czm_passOverlay = `/** + * The automatic GLSL constant for {@link Pass#OVERLAY} + * + * @name czm_passOverlay + * @glslConstant + * + * @see czm_pass + */ +const float czm_passOverlay = 10.0; +`, czm_passTerrainClassification = `/** + * The automatic GLSL constant for {@link Pass#TERRAIN_CLASSIFICATION} + * + * @name czm_passTerrainClassification + * @glslConstant + * + * @see czm_pass + */ +const float czm_passTerrainClassification = 3.0; +`, czm_passTranslucent = `/** + * The automatic GLSL constant for {@link Pass#TRANSLUCENT} + * + * @name czm_passTranslucent + * @glslConstant + * + * @see czm_pass + */ +const float czm_passTranslucent = 8.0; +`, czm_passVoxels = `/** + * The automatic GLSL constant for {@link Pass#VOXELS} + * + * @name czm_passVoxels + * @glslConstant + * + * @see czm_pass + */ +const float czm_passVoxels = 9.0; +`, czm_pi = `/** + * A built-in GLSL floating-point constant for Math.PI. + * + * @alias czm_pi + * @glslConstant + * + * @see CesiumMath.PI + * + * @example + * // GLSL declaration + * const float czm_pi = ...; + * + * // Example + * float twoPi = 2.0 * czm_pi; + */ +const float czm_pi = 3.141592653589793; +`, czm_piOverFour = `/** + * A built-in GLSL floating-point constant for pi/4. + * + * @alias czm_piOverFour + * @glslConstant + * + * @see CesiumMath.PI_OVER_FOUR + * + * @example + * // GLSL declaration + * const float czm_piOverFour = ...; + * + * // Example + * float pi = 4.0 * czm_piOverFour; + */ +const float czm_piOverFour = 0.7853981633974483; +`, czm_piOverSix = `/** + * A built-in GLSL floating-point constant for pi/6. + * + * @alias czm_piOverSix + * @glslConstant + * + * @see CesiumMath.PI_OVER_SIX + * + * @example + * // GLSL declaration + * const float czm_piOverSix = ...; + * + * // Example + * float pi = 6.0 * czm_piOverSix; + */ +const float czm_piOverSix = 0.5235987755982988; +`, czm_piOverThree = `/** + * A built-in GLSL floating-point constant for pi/3. + * + * @alias czm_piOverThree + * @glslConstant + * + * @see CesiumMath.PI_OVER_THREE + * + * @example + * // GLSL declaration + * const float czm_piOverThree = ...; + * + * // Example + * float pi = 3.0 * czm_piOverThree; + */ +const float czm_piOverThree = 1.0471975511965976; +`, czm_piOverTwo = `/** + * A built-in GLSL floating-point constant for pi/2. + * + * @alias czm_piOverTwo + * @glslConstant + * + * @see CesiumMath.PI_OVER_TWO + * + * @example + * // GLSL declaration + * const float czm_piOverTwo = ...; + * + * // Example + * float pi = 2.0 * czm_piOverTwo; + */ +const float czm_piOverTwo = 1.5707963267948966; +`, czm_radiansPerDegree = `/** + * A built-in GLSL floating-point constant for converting degrees to radians. + * + * @alias czm_radiansPerDegree + * @glslConstant + * + * @see CesiumMath.RADIANS_PER_DEGREE + * + * @example + * // GLSL declaration + * const float czm_radiansPerDegree = ...; + * + * // Example + * float rad = czm_radiansPerDegree * deg; + */ +const float czm_radiansPerDegree = 0.017453292519943295; +`, czm_sceneMode2D = `/** + * The constant identifier for the 2D {@link SceneMode} + * + * @name czm_sceneMode2D + * @glslConstant + * @see czm_sceneMode + * @see czm_sceneModeColumbusView + * @see czm_sceneMode3D + * @see czm_sceneModeMorphing + */ +const float czm_sceneMode2D = 2.0; +`, czm_sceneMode3D = `/** + * The constant identifier for the 3D {@link SceneMode} + * + * @name czm_sceneMode3D + * @glslConstant + * @see czm_sceneMode + * @see czm_sceneMode2D + * @see czm_sceneModeColumbusView + * @see czm_sceneModeMorphing + */ +const float czm_sceneMode3D = 3.0; +`, czm_sceneModeColumbusView = `/** + * The constant identifier for the Columbus View {@link SceneMode} + * + * @name czm_sceneModeColumbusView + * @glslConstant + * @see czm_sceneMode + * @see czm_sceneMode2D + * @see czm_sceneMode3D + * @see czm_sceneModeMorphing + */ +const float czm_sceneModeColumbusView = 1.0; +`, czm_sceneModeMorphing = `/** + * The constant identifier for the Morphing {@link SceneMode} + * + * @name czm_sceneModeMorphing + * @glslConstant + * @see czm_sceneMode + * @see czm_sceneMode2D + * @see czm_sceneModeColumbusView + * @see czm_sceneMode3D + */ +const float czm_sceneModeMorphing = 0.0; +`, czm_solarRadius = `/** + * A built-in GLSL floating-point constant for one solar radius. + * + * @alias czm_solarRadius + * @glslConstant + * + * @see CesiumMath.SOLAR_RADIUS + * + * @example + * // GLSL declaration + * const float czm_solarRadius = ...; + */ +const float czm_solarRadius = 695500000.0; +`, czm_threePiOver2 = `/** + * A built-in GLSL floating-point constant for 3pi/2. + * + * @alias czm_threePiOver2 + * @glslConstant + * + * @see CesiumMath.THREE_PI_OVER_TWO + * + * @example + * // GLSL declaration + * const float czm_threePiOver2 = ...; + * + * // Example + * float pi = (2.0 / 3.0) * czm_threePiOver2; + */ +const float czm_threePiOver2 = 4.71238898038469; +`, czm_twoPi = `/** + * A built-in GLSL floating-point constant for 2pi. + * + * @alias czm_twoPi + * @glslConstant + * + * @see CesiumMath.TWO_PI + * + * @example + * // GLSL declaration + * const float czm_twoPi = ...; + * + * // Example + * float pi = czm_twoPi / 2.0; + */ +const float czm_twoPi = 6.283185307179586; +`, czm_webMercatorMaxLatitude = `/** + * The maximum latitude, in radians, both North and South, supported by a Web Mercator + * (EPSG:3857) projection. Technically, the Mercator projection is defined + * for any latitude up to (but not including) 90 degrees, but it makes sense + * to cut it off sooner because it grows exponentially with increasing latitude. + * The logic behind this particular cutoff value, which is the one used by + * Google Maps, Bing Maps, and Esri, is that it makes the projection + * square. That is, the rectangle is equal in the X and Y directions. + * + * The constant value is computed as follows: + * czm_pi * 0.5 - (2.0 * atan(exp(-czm_pi))) + * + * @name czm_webMercatorMaxLatitude + * @glslConstant + */ +const float czm_webMercatorMaxLatitude = 1.4844222297453324; +`, czm_depthRangeStruct = `/** + * @name czm_depthRangeStruct + * @glslStruct + */ +struct czm_depthRangeStruct +{ + float near; + float far; +}; +`, czm_material = `/** + * Holds material information that can be used for lighting. Returned by all czm_getMaterial functions. + * + * @name czm_material + * @glslStruct + * + * @property {vec3} diffuse Incoming light that scatters evenly in all directions. + * @property {float} specular Intensity of incoming light reflecting in a single direction. + * @property {float} shininess The sharpness of the specular reflection. Higher values create a smaller, more focused specular highlight. + * @property {vec3} normal Surface's normal in eye coordinates. It is used for effects such as normal mapping. The default is the surface's unmodified normal. + * @property {vec3} emission Light emitted by the material equally in all directions. The default is vec3(0.0), which emits no light. + * @property {float} alpha Alpha of this material. 0.0 is completely transparent; 1.0 is completely opaque. + */ +struct czm_material +{ + vec3 diffuse; + float specular; + float shininess; + vec3 normal; + vec3 emission; + float alpha; +}; +`, czm_materialInput = `/** + * Used as input to every material's czm_getMaterial function. + * + * @name czm_materialInput + * @glslStruct + * + * @property {float} s 1D texture coordinates. + * @property {vec2} st 2D texture coordinates. + * @property {vec3} str 3D texture coordinates. + * @property {vec3} normalEC Unperturbed surface normal in eye coordinates. + * @property {mat3} tangentToEyeMatrix Matrix for converting a tangent space normal to eye space. + * @property {vec3} positionToEyeEC Vector from the fragment to the eye in eye coordinates. The magnitude is the distance in meters from the fragment to the eye. + * @property {float} height The height of the terrain in meters above or below the ellipsoid. Only available for globe materials. + * @property {float} slope The slope of the terrain in radians. 0 is flat; pi/2 is vertical. Only available for globe materials. + * @property {float} aspect The aspect of the terrain in radians. 0 is East, pi/2 is North, pi is West, 3pi/2 is South. Only available for globe materials. +* @property {float} waterMask The value of the water mask. 0 is land, 1 is water. Only available for globe materials. + */ +struct czm_materialInput +{ + float s; + vec2 st; + vec3 str; + vec3 normalEC; + mat3 tangentToEyeMatrix; + vec3 positionToEyeEC; + float height; + float slope; + float aspect; + float waterMask; +}; +`, czm_modelMaterial = `/** + * Struct for representing a material for a {@link Model}. The model + * rendering pipeline will pass this struct between material, custom shaders, + * and lighting stages. This is not to be confused with {@link czm_material} + * which is used by the older Fabric materials system, although they are similar. + *

+ * All color values (diffuse, specular, emissive) are in linear color space. + *

+ * + * @name czm_modelMaterial + * @glslStruct + * + * @property {vec4} baseColor The base color of the material. + * @property {vec3} diffuse Incoming light that scatters evenly in all directions. + * @property {float} alpha Alpha of this material. 0.0 is completely transparent; 1.0 is completely opaque. + * @property {vec3} specular Color of reflected light at normal incidence in PBR materials. This is sometimes referred to as f0 in the literature. + * @property {float} roughness A number from 0.0 to 1.0 representing how rough the surface is. Values near 0.0 produce glossy surfaces, while values near 1.0 produce rough surfaces. + * @property {vec3} normalEC Surface's normal in eye coordinates. It is used for effects such as normal mapping. The default is the surface's unmodified normal. + * @property {float} occlusion Ambient occlusion recieved at this point on the material. 1.0 means fully lit, 0.0 means fully occluded. + * @property {vec3} emissive Light emitted by the material equally in all directions. The default is vec3(0.0), which emits no light. + */ +struct czm_modelMaterial { + vec4 baseColor; + vec3 diffuse; + float alpha; + vec3 specular; + float roughness; + vec3 normalEC; + float occlusion; + vec3 emissive; +#ifdef USE_SPECULAR + float specularWeight; +#endif +#ifdef USE_ANISOTROPY + vec3 anisotropicT; + vec3 anisotropicB; + float anisotropyStrength; +#endif +#ifdef USE_CLEARCOAT + float clearcoatFactor; + float clearcoatRoughness; + vec3 clearcoatNormal; + // Add clearcoatF0 when KHR_materials_ior is implemented +#endif +}; +`, czm_modelVertexOutput = `/** + * Struct for representing the output of a custom vertex shader. + * + * @name czm_modelVertexOutput + * @glslStruct + * + * @see {@link CustomShader} + * @see {@link Model} + * + * @property {vec3} positionMC The position of the vertex in model coordinates + * @property {float} pointSize A custom value for gl_PointSize. This is only used for point primitives. + */ +struct czm_modelVertexOutput { + vec3 positionMC; + float pointSize; +}; +`, czm_ray = `/** + * DOC_TBA + * + * @name czm_ray + * @glslStruct + */ +struct czm_ray +{ + vec3 origin; + vec3 direction; +}; +`, czm_raySegment = `/** + * DOC_TBA + * + * @name czm_raySegment + * @glslStruct + */ +struct czm_raySegment +{ + float start; + float stop; +}; + +/** + * DOC_TBA + * + * @name czm_emptyRaySegment + * @glslConstant + */ +const czm_raySegment czm_emptyRaySegment = czm_raySegment(-czm_infinity, -czm_infinity); + +/** + * DOC_TBA + * + * @name czm_fullRaySegment + * @glslConstant + */ +const czm_raySegment czm_fullRaySegment = czm_raySegment(0.0, czm_infinity); +`, czm_shadowParameters = `struct czm_shadowParameters +{ +#ifdef USE_CUBE_MAP_SHADOW + vec3 texCoords; +#else + vec2 texCoords; +#endif + + float depthBias; + float depth; + float nDotL; + vec2 texelStepSize; + float normalShadingSmooth; + float darkness; +}; +`, czm_HSBToRGB = `/** + * Converts an HSB color (hue, saturation, brightness) to RGB + * HSB <-> RGB conversion with minimal branching: {@link http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl} + * + * @name czm_HSBToRGB + * @glslFunction + * + * @param {vec3} hsb The color in HSB. + * + * @returns {vec3} The color in RGB. + * + * @example + * vec3 hsb = czm_RGBToHSB(rgb); + * hsb.z *= 0.1; + * rgb = czm_HSBToRGB(hsb); + */ + +const vec4 K_HSB2RGB = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + +vec3 czm_HSBToRGB(vec3 hsb) +{ + vec3 p = abs(fract(hsb.xxx + K_HSB2RGB.xyz) * 6.0 - K_HSB2RGB.www); + return hsb.z * mix(K_HSB2RGB.xxx, clamp(p - K_HSB2RGB.xxx, 0.0, 1.0), hsb.y); +} +`, czm_HSLToRGB = `/** + * Converts an HSL color (hue, saturation, lightness) to RGB + * HSL <-> RGB conversion: {@link http://www.chilliant.com/rgb2hsv.html} + * + * @name czm_HSLToRGB + * @glslFunction + * + * @param {vec3} rgb The color in HSL. + * + * @returns {vec3} The color in RGB. + * + * @example + * vec3 hsl = czm_RGBToHSL(rgb); + * hsl.z *= 0.1; + * rgb = czm_HSLToRGB(hsl); + */ + +vec3 hueToRGB(float hue) +{ + float r = abs(hue * 6.0 - 3.0) - 1.0; + float g = 2.0 - abs(hue * 6.0 - 2.0); + float b = 2.0 - abs(hue * 6.0 - 4.0); + return clamp(vec3(r, g, b), 0.0, 1.0); +} + +vec3 czm_HSLToRGB(vec3 hsl) +{ + vec3 rgb = hueToRGB(hsl.x); + float c = (1.0 - abs(2.0 * hsl.z - 1.0)) * hsl.y; + return (rgb - 0.5) * c + hsl.z; +} +`, czm_RGBToHSB = `/** + * Converts an RGB color to HSB (hue, saturation, brightness) + * HSB <-> RGB conversion with minimal branching: {@link http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl} + * + * @name czm_RGBToHSB + * @glslFunction + * + * @param {vec3} rgb The color in RGB. + * + * @returns {vec3} The color in HSB. + * + * @example + * vec3 hsb = czm_RGBToHSB(rgb); + * hsb.z *= 0.1; + * rgb = czm_HSBToRGB(hsb); + */ + +const vec4 K_RGB2HSB = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + +vec3 czm_RGBToHSB(vec3 rgb) +{ + vec4 p = mix(vec4(rgb.bg, K_RGB2HSB.wz), vec4(rgb.gb, K_RGB2HSB.xy), step(rgb.b, rgb.g)); + vec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r)); + + float d = q.x - min(q.w, q.y); + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + czm_epsilon7)), d / (q.x + czm_epsilon7), q.x); +} +`, czm_RGBToHSL = `/** + * Converts an RGB color to HSL (hue, saturation, lightness) + * HSL <-> RGB conversion: {@link http://www.chilliant.com/rgb2hsv.html} + * + * @name czm_RGBToHSL + * @glslFunction + * + * @param {vec3} rgb The color in RGB. + * + * @returns {vec3} The color in HSL. + * + * @example + * vec3 hsl = czm_RGBToHSL(rgb); + * hsl.z *= 0.1; + * rgb = czm_HSLToRGB(hsl); + */ + +vec3 RGBtoHCV(vec3 rgb) +{ + // Based on work by Sam Hocevar and Emil Persson + vec4 p = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0 / 3.0) : vec4(rgb.gb, 0.0, -1.0 / 3.0); + vec4 q = (rgb.r < p.x) ? vec4(p.xyw, rgb.r) : vec4(rgb.r, p.yzx); + float c = q.x - min(q.w, q.y); + float h = abs((q.w - q.y) / (6.0 * c + czm_epsilon7) + q.z); + return vec3(h, c, q.x); +} + +vec3 czm_RGBToHSL(vec3 rgb) +{ + vec3 hcv = RGBtoHCV(rgb); + float l = hcv.z - hcv.y * 0.5; + float s = hcv.y / (1.0 - abs(l * 2.0 - 1.0) + czm_epsilon7); + return vec3(hcv.x, s, l); +} +`, czm_RGBToXYZ = `/** + * Converts an RGB color to CIE Yxy. + *

The conversion is described in + * {@link http://content.gpwiki.org/index.php/D3DBook:High-Dynamic_Range_Rendering#Luminance_Transform|Luminance Transform} + *

+ * + * @name czm_RGBToXYZ + * @glslFunction + * + * @param {vec3} rgb The color in RGB. + * + * @returns {vec3} The color in CIE Yxy. + * + * @example + * vec3 xyz = czm_RGBToXYZ(rgb); + * xyz.x = max(xyz.x - luminanceThreshold, 0.0); + * rgb = czm_XYZToRGB(xyz); + */ +vec3 czm_RGBToXYZ(vec3 rgb) +{ + const mat3 RGB2XYZ = mat3(0.4124, 0.2126, 0.0193, + 0.3576, 0.7152, 0.1192, + 0.1805, 0.0722, 0.9505); + vec3 xyz = RGB2XYZ * rgb; + vec3 Yxy; + Yxy.r = xyz.g; + float temp = dot(vec3(1.0), xyz); + Yxy.gb = xyz.rg / temp; + return Yxy; +} +`, czm_XYZToRGB = `/** + * Converts a CIE Yxy color to RGB. + *

The conversion is described in + * {@link http://content.gpwiki.org/index.php/D3DBook:High-Dynamic_Range_Rendering#Luminance_Transform|Luminance Transform} + *

+ * + * @name czm_XYZToRGB + * @glslFunction + * + * @param {vec3} Yxy The color in CIE Yxy. + * + * @returns {vec3} The color in RGB. + * + * @example + * vec3 xyz = czm_RGBToXYZ(rgb); + * xyz.x = max(xyz.x - luminanceThreshold, 0.0); + * rgb = czm_XYZToRGB(xyz); + */ +vec3 czm_XYZToRGB(vec3 Yxy) +{ + const mat3 XYZ2RGB = mat3( 3.2405, -0.9693, 0.0556, + -1.5371, 1.8760, -0.2040, + -0.4985, 0.0416, 1.0572); + vec3 xyz; + xyz.r = Yxy.r * Yxy.g / Yxy.b; + xyz.g = Yxy.r; + xyz.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b; + + return XYZ2RGB * xyz; +} +`, czm_acesTonemapping = `// See: +// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/ + +vec3 czm_acesTonemapping(vec3 color) { +#ifdef USE_VCS_CUSTOM_SHADING + // the formula below does not seem to be the one from ACES + float a = 2.51; + float b = 0.03; + float c = 2.43; + float d = 0.59; + float e = 0.14; + color = (color * (a * color + b)) / (color * (c * color + d) + e); + color = clamp(color, 0.0, 1.0); + + return color; +#else + float g = 0.985; + float a = 0.065; + float b = 0.0001; + float c = 0.433; + float d = 0.238; + + color = (color * (color + a) - b) / (color * (g * color + c) + d); + + color = clamp(color, 0.0, 1.0); + + return color; +#endif +} +`, czm_alphaWeight = `/** + * @private + */ +float czm_alphaWeight(float a) +{ + float z = (gl_FragCoord.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2]; + + // See Weighted Blended Order-Independent Transparency for examples of different weighting functions: + // http://jcgt.org/published/0002/02/09/ + return pow(a + 0.01, 4.0) + max(1e-2, min(3.0 * 1e3, 0.003 / (1e-5 + pow(abs(z) / 200.0, 4.0)))); +} +`, czm_antialias = `/** + * Procedural anti-aliasing by blurring two colors that meet at a sharp edge. + * + * @name czm_antialias + * @glslFunction + * + * @param {vec4} color1 The color on one side of the edge. + * @param {vec4} color2 The color on the other side of the edge. + * @param {vec4} currentcolor The current color, either color1 or color2. + * @param {float} dist The distance to the edge in texture coordinates. + * @param {float} [fuzzFactor=0.1] Controls the blurriness between the two colors. + * @returns {vec4} The anti-aliased color. + * + * @example + * // GLSL declarations + * vec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist, float fuzzFactor); + * vec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist); + * + * // get the color for a material that has a sharp edge at the line y = 0.5 in texture space + * float dist = abs(textureCoordinates.t - 0.5); + * vec4 currentColor = mix(bottomColor, topColor, step(0.5, textureCoordinates.t)); + * vec4 color = czm_antialias(bottomColor, topColor, currentColor, dist, 0.1); + */ +vec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist, float fuzzFactor) +{ + float val1 = clamp(dist / fuzzFactor, 0.0, 1.0); + float val2 = clamp((dist - 0.5) / fuzzFactor, 0.0, 1.0); + val1 = val1 * (1.0 - val2); + val1 = val1 * val1 * (3.0 - (2.0 * val1)); + val1 = pow(val1, 0.5); //makes the transition nicer + + vec4 midColor = (color1 + color2) * 0.5; + return mix(midColor, currentColor, val1); +} + +vec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist) +{ + return czm_antialias(color1, color2, currentColor, dist, 0.1); +} +`, czm_applyHSBShift = `/** + * Apply a HSB color shift to an RGB color. + * + * @param {vec3} rgb The color in RGB space. + * @param {vec3} hsbShift The amount to shift each component. The xyz components correspond to hue, saturation, and brightness. Shifting the hue by +/- 1.0 corresponds to shifting the hue by a full cycle. Saturation and brightness are clamped between 0 and 1 after the adjustment + * @param {bool} ignoreBlackPixels If true, black pixels will be unchanged. This is necessary in some shaders such as atmosphere-related effects. + * + * @return {vec3} The RGB color after shifting in HSB space and clamping saturation and brightness to a valid range. + */ +vec3 czm_applyHSBShift(vec3 rgb, vec3 hsbShift, bool ignoreBlackPixels) { + // Convert rgb color to hsb + vec3 hsb = czm_RGBToHSB(rgb); + + // Perform hsb shift + // Hue cycles around so no clamp is needed. + hsb.x += hsbShift.x; // hue + hsb.y = clamp(hsb.y + hsbShift.y, 0.0, 1.0); // saturation + + // brightness + // + // Some shaders such as atmosphere-related effects need to leave black + // pixels unchanged + if (ignoreBlackPixels) { + hsb.z = hsb.z > czm_epsilon7 ? hsb.z + hsbShift.z : 0.0; + } else { + hsb.z = hsb.z + hsbShift.z; + } + hsb.z = clamp(hsb.z, 0.0, 1.0); + + // Convert shifted hsb back to rgb + return czm_HSBToRGB(hsb); +} +`, czm_approximateSphericalCoordinates = `/** + * Approximately computes spherical coordinates given a normal. + * Uses approximate inverse trigonometry for speed and consistency, + * since inverse trigonometry can differ from vendor-to-vendor and when compared with the CPU. + * + * @name czm_approximateSphericalCoordinates + * @glslFunction + * + * @param {vec3} normal arbitrary-length normal. + * + * @returns {vec2} Approximate latitude and longitude spherical coordinates. + */ +vec2 czm_approximateSphericalCoordinates(vec3 normal) { + // Project into plane with vertical for latitude + float latitudeApproximation = czm_fastApproximateAtan(sqrt(normal.x * normal.x + normal.y * normal.y), normal.z); + float longitudeApproximation = czm_fastApproximateAtan(normal.x, normal.y); + return vec2(latitudeApproximation, longitudeApproximation); +} +`, czm_approximateTanh = `/** + * Compute a rational approximation to tanh(x) + * + * @param {float} x A real number input + * @returns {float} An approximation for tanh(x) +*/ +float czm_approximateTanh(float x) { + float x2 = x * x; + return max(-1.0, min(1.0, x * (27.0 + x2) / (27.0 + 9.0 * x2))); +} +`, czm_backFacing = `/** + * Determines if the fragment is back facing + * + * @name czm_backFacing + * @glslFunction + * + * @returns {bool} true if the fragment is back facing; otherwise, false. + */ +bool czm_backFacing() +{ + // !gl_FrontFacing doesn't work as expected on Mac/Intel so use the more verbose form instead. See https://github.com/CesiumGS/cesium/pull/8494. + return gl_FrontFacing == false; +} +`, czm_branchFreeTernary = `/** + * Branchless ternary operator to be used when it's inexpensive to explicitly + * evaluate both possibilities for a float expression. + * + * @name czm_branchFreeTernary + * @glslFunction + * + * @param {bool} comparison A comparison statement + * @param {float} a Value to return if the comparison is true. + * @param {float} b Value to return if the comparison is false. + * + * @returns {float} equivalent of comparison ? a : b + */ +float czm_branchFreeTernary(bool comparison, float a, float b) { + float useA = float(comparison); + return a * useA + b * (1.0 - useA); +} + +/** + * Branchless ternary operator to be used when it's inexpensive to explicitly + * evaluate both possibilities for a vec2 expression. + * + * @name czm_branchFreeTernary + * @glslFunction + * + * @param {bool} comparison A comparison statement + * @param {vec2} a Value to return if the comparison is true. + * @param {vec2} b Value to return if the comparison is false. + * + * @returns {vec2} equivalent of comparison ? a : b + */ +vec2 czm_branchFreeTernary(bool comparison, vec2 a, vec2 b) { + float useA = float(comparison); + return a * useA + b * (1.0 - useA); +} + +/** + * Branchless ternary operator to be used when it's inexpensive to explicitly + * evaluate both possibilities for a vec3 expression. + * + * @name czm_branchFreeTernary + * @glslFunction + * + * @param {bool} comparison A comparison statement + * @param {vec3} a Value to return if the comparison is true. + * @param {vec3} b Value to return if the comparison is false. + * + * @returns {vec3} equivalent of comparison ? a : b + */ +vec3 czm_branchFreeTernary(bool comparison, vec3 a, vec3 b) { + float useA = float(comparison); + return a * useA + b * (1.0 - useA); +} + +/** + * Branchless ternary operator to be used when it's inexpensive to explicitly + * evaluate both possibilities for a vec4 expression. + * + * @name czm_branchFreeTernary + * @glslFunction + * + * @param {bool} comparison A comparison statement + * @param {vec3} a Value to return if the comparison is true. + * @param {vec3} b Value to return if the comparison is false. + * + * @returns {vec3} equivalent of comparison ? a : b + */ +vec4 czm_branchFreeTernary(bool comparison, vec4 a, vec4 b) { + float useA = float(comparison); + return a * useA + b * (1.0 - useA); +} +`, czm_cascadeColor = ` +vec4 czm_cascadeColor(vec4 weights) +{ + return vec4(1.0, 0.0, 0.0, 1.0) * weights.x + + vec4(0.0, 1.0, 0.0, 1.0) * weights.y + + vec4(0.0, 0.0, 1.0, 1.0) * weights.z + + vec4(1.0, 0.0, 1.0, 1.0) * weights.w; +} +`, czm_cascadeDistance = ` +uniform vec4 shadowMap_cascadeDistances; + +float czm_cascadeDistance(vec4 weights) +{ + return dot(shadowMap_cascadeDistances, weights); +} +`, czm_cascadeMatrix = ` +uniform mat4 shadowMap_cascadeMatrices[4]; + +mat4 czm_cascadeMatrix(vec4 weights) +{ + return shadowMap_cascadeMatrices[0] * weights.x + + shadowMap_cascadeMatrices[1] * weights.y + + shadowMap_cascadeMatrices[2] * weights.z + + shadowMap_cascadeMatrices[3] * weights.w; +} +`, czm_cascadeWeights = ` +uniform vec4 shadowMap_cascadeSplits[2]; + +vec4 czm_cascadeWeights(float depthEye) +{ + // One component is set to 1.0 and all others set to 0.0. + vec4 near = step(shadowMap_cascadeSplits[0], vec4(depthEye)); + vec4 far = step(depthEye, shadowMap_cascadeSplits[1]); + return near * far; +} +`, czm_clipPolygons = `float getSignedDistance(vec2 uv, highp sampler2D clippingDistance) { + float signedDistance = texture(clippingDistance, uv).r; + return (signedDistance - 0.5) * 2.0; +} + +void czm_clipPolygons(highp sampler2D clippingDistance, int extentsLength, vec2 clippingPosition, int regionIndex) { + // Position is completely outside of polygons bounds + vec2 rectUv = clippingPosition; + if (regionIndex < 0 || rectUv.x <= 0.0 || rectUv.y <= 0.0 || rectUv.x >= 1.0 || rectUv.y >= 1.0) { + #ifdef CLIPPING_INVERSE + discard; + #endif + return; + } + + vec2 clippingDistanceTextureDimensions = vec2(textureSize(clippingDistance, 0)); + vec2 sampleOffset = max(1.0 / clippingDistanceTextureDimensions, vec2(0.005)); + float dimension = float(extentsLength); + if (extentsLength > 2) { + dimension = ceil(log2(float(extentsLength))); + } + + vec2 textureOffset = vec2(mod(float(regionIndex), dimension), floor(float(regionIndex) / dimension)) / dimension; + vec2 uv = textureOffset + rectUv / dimension; + + float signedDistance = getSignedDistance(uv, clippingDistance); + + #ifdef CLIPPING_INVERSE + if (signedDistance > 0.0) { + discard; + } + #else + if (signedDistance < 0.0) { + discard; + } + #endif +} +`, czm_columbusViewMorph = `/** + * DOC_TBA + * + * @name czm_columbusViewMorph + * @glslFunction + */ +vec4 czm_columbusViewMorph(vec4 position2D, vec4 position3D, float time) +{ + // Just linear for now. + vec3 p = mix(position2D.xyz, position3D.xyz, time); + return vec4(p, 1.0); +} +`, czm_computeAtmosphereColor = `/** + * Compute the atmosphere color, applying Rayleigh and Mie scattering. This + * builtin uses automatic uniforms so the atmophere settings are synced with the + * state of the Scene, even in other contexts like Model. + * + * @name czm_computeAtmosphereColor + * @glslFunction + * + * @param {vec3} positionWC Position of the fragment in world coords (low precision) + * @param {vec3} lightDirection Light direction from the sun or other light source. + * @param {vec3} rayleighColor The Rayleigh scattering color computed by a scattering function + * @param {vec3} mieColor The Mie scattering color computed by a scattering function + * @param {float} opacity The opacity computed by a scattering function. + */ +vec4 czm_computeAtmosphereColor( + vec3 positionWC, + vec3 lightDirection, + vec3 rayleighColor, + vec3 mieColor, + float opacity +) { + // Setup the primary ray: from the camera position to the vertex position. + vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; + vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); + + float cosAngle = dot(cameraToPositionWCDirection, lightDirection); + float cosAngleSq = cosAngle * cosAngle; + + float G = czm_atmosphereMieAnisotropy; + float GSq = G * G; + + // The Rayleigh phase function. + float rayleighPhase = 3.0 / (50.2654824574) * (1.0 + cosAngleSq); + // The Mie phase function. + float miePhase = 3.0 / (25.1327412287) * ((1.0 - GSq) * (cosAngleSq + 1.0)) / (pow(1.0 + GSq - 2.0 * cosAngle * G, 1.5) * (2.0 + GSq)); + + // The final color is generated by combining the effects of the Rayleigh and Mie scattering. + vec3 rayleigh = rayleighPhase * rayleighColor; + vec3 mie = miePhase * mieColor; + + vec3 color = (rayleigh + mie) * czm_atmosphereLightIntensity; + + return vec4(color, opacity); +} +`, czm_computeGroundAtmosphereScattering = `/** + * Compute atmosphere scattering for the ground atmosphere and fog. This method + * uses automatic uniforms so it is always synced with the scene settings. + * + * @name czm_computeGroundAtmosphereScattering + * @glslfunction + * + * @param {vec3} positionWC The position of the fragment in world coordinates. + * @param {vec3} lightDirection The direction of the light to calculate the scattering from. + * @param {vec3} rayleighColor The variable the Rayleigh scattering will be written to. + * @param {vec3} mieColor The variable the Mie scattering will be written to. + * @param {float} opacity The variable the transmittance will be written to. + */ +void czm_computeGroundAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity) { + vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; + vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); + czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); + + float atmosphereInnerRadius = length(positionWC); + + czm_computeScattering( + primaryRay, + length(cameraToPositionWC), + lightDirection, + atmosphereInnerRadius, + rayleighColor, + mieColor, + opacity + ); +} +`, czm_computePosition = `/** + * Returns a position in model coordinates relative to eye taking into + * account the current scene mode: 3D, 2D, or Columbus view. + *

+ * This uses standard position attributes, position3DHigh, + * position3DLow, position2DHigh, and position2DLow, + * and should be used when writing a vertex shader for an {@link Appearance}. + *

+ * + * @name czm_computePosition + * @glslFunction + * + * @returns {vec4} The position relative to eye. + * + * @example + * vec4 p = czm_computePosition(); + * v_positionEC = (czm_modelViewRelativeToEye * p).xyz; + * gl_Position = czm_modelViewProjectionRelativeToEye * p; + * + * @see czm_translateRelativeToEye + */ +vec4 czm_computePosition(); +`, czm_computeScattering = `/** + * This function computes the colors contributed by Rayliegh and Mie scattering on a given ray, as well as + * the transmittance value for the ray. This function uses automatic uniforms + * so the atmosphere settings are always synced with the current scene. + * + * @name czm_computeScattering + * @glslfunction + * + * @param {czm_ray} primaryRay The ray from the camera to the position. + * @param {float} primaryRayLength The length of the primary ray. + * @param {vec3} lightDirection The direction of the light to calculate the scattering from. + * @param {vec3} rayleighColor The variable the Rayleigh scattering will be written to. + * @param {vec3} mieColor The variable the Mie scattering will be written to. + * @param {float} opacity The variable the transmittance will be written to. + */ +void czm_computeScattering( + czm_ray primaryRay, + float primaryRayLength, + vec3 lightDirection, + float atmosphereInnerRadius, + out vec3 rayleighColor, + out vec3 mieColor, + out float opacity +) { + const float ATMOSPHERE_THICKNESS = 111e3; // The thickness of the atmosphere in meters. + const int PRIMARY_STEPS_MAX = 16; // Maximum number of times the ray from the camera to the world position (primary ray) is sampled. + const int LIGHT_STEPS_MAX = 4; // Maximum number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. + + // Initialize the default scattering amounts to 0. + rayleighColor = vec3(0.0); + mieColor = vec3(0.0); + opacity = 0.0; + + float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; + + vec3 origin = vec3(0.0); + + // Calculate intersection from the camera to the outer ring of the atmosphere. + czm_raySegment primaryRayAtmosphereIntersect = czm_raySphereIntersectionInterval(primaryRay, origin, atmosphereOuterRadius); + + // Return empty colors if no intersection with the atmosphere geometry. + if (primaryRayAtmosphereIntersect == czm_emptyRaySegment) { + rayleighColor = vec3(1.0, 0.0, 1.0); + return; + } + + // To deal with smaller values of PRIMARY_STEPS (e.g. 4) + // we implement a split strategy: sky or horizon. + // For performance reasons, instead of a if/else branch + // a soft choice is implemented through a weight 0.0 <= w_stop_gt_lprl <= 1.0 + float x = 1e-7 * primaryRayAtmosphereIntersect.stop / length(primaryRayLength); + // Value close to 0.0: close to the horizon + // Value close to 1.0: above in the sky + float w_stop_gt_lprl = 0.5 * (1.0 + czm_approximateTanh(x)); + + // The ray should start from the first intersection with the outer atmopshere, or from the camera position, if it is inside the atmosphere. + float start_0 = primaryRayAtmosphereIntersect.start; + primaryRayAtmosphereIntersect.start = max(primaryRayAtmosphereIntersect.start, 0.0); + // The ray should end at the exit from the atmosphere or at the distance to the vertex, whichever is smaller. + primaryRayAtmosphereIntersect.stop = min(primaryRayAtmosphereIntersect.stop, length(primaryRayLength)); + + // For the number of ray steps, distinguish inside or outside atmosphere (outer space) + // (1) from outer space we have to use more ray steps to get a realistic rendering + // (2) within atmosphere we need fewer steps for faster rendering + float x_o_a = start_0 - ATMOSPHERE_THICKNESS; // ATMOSPHERE_THICKNESS used as an ad-hoc constant, no precise meaning here, only the order of magnitude matters + float w_inside_atmosphere = 1.0 - 0.5 * (1.0 + czm_approximateTanh(x_o_a)); + int PRIMARY_STEPS = PRIMARY_STEPS_MAX - int(w_inside_atmosphere * 12.0); // Number of times the ray from the camera to the world position (primary ray) is sampled. + int LIGHT_STEPS = LIGHT_STEPS_MAX - int(w_inside_atmosphere * 2.0); // Number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. + + // Setup for sampling positions along the ray - starting from the intersection with the outer ring of the atmosphere. + float rayPositionLength = primaryRayAtmosphereIntersect.start; + // (1) Outside the atmosphere: constant rayStepLength + // (2) Inside atmosphere: variable rayStepLength to compensate the rough rendering of the smaller number of ray steps + float totalRayLength = primaryRayAtmosphereIntersect.stop - rayPositionLength; + float rayStepLengthIncrease = w_inside_atmosphere * ((1.0 - w_stop_gt_lprl) * totalRayLength / (float(PRIMARY_STEPS * (PRIMARY_STEPS + 1)) / 2.0)); + float rayStepLength = max(1.0 - w_inside_atmosphere, w_stop_gt_lprl) * totalRayLength / max(7.0 * w_inside_atmosphere, float(PRIMARY_STEPS)); + + vec3 rayleighAccumulation = vec3(0.0); + vec3 mieAccumulation = vec3(0.0); + vec2 opticalDepth = vec2(0.0); + vec2 heightScale = vec2(czm_atmosphereRayleighScaleHeight, czm_atmosphereMieScaleHeight); + + // Sample positions on the primary ray. + for (int i = 0; i < PRIMARY_STEPS_MAX; ++i) { + + // The loop should be: for (int i = 0; i < PRIMARY_STEPS; ++i) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to break early instead + if (i >= PRIMARY_STEPS) { + break; + } + + // Calculate sample position along viewpoint ray. + vec3 samplePosition = primaryRay.origin + primaryRay.direction * (rayPositionLength + rayStepLength); + + // Calculate height of sample position above ellipsoid. + float sampleHeight = length(samplePosition) - atmosphereInnerRadius; + + // Calculate and accumulate density of particles at the sample position. + vec2 sampleDensity = exp(-sampleHeight / heightScale) * rayStepLength; + opticalDepth += sampleDensity; + + // Generate ray from the sample position segment to the light source, up to the outer ring of the atmosphere. + czm_ray lightRay = czm_ray(samplePosition, lightDirection); + czm_raySegment lightRayAtmosphereIntersect = czm_raySphereIntersectionInterval(lightRay, origin, atmosphereOuterRadius); + + float lightStepLength = lightRayAtmosphereIntersect.stop / float(LIGHT_STEPS); + float lightPositionLength = 0.0; + + vec2 lightOpticalDepth = vec2(0.0); + + // Sample positions along the light ray, to accumulate incidence of light on the latest sample segment. + for (int j = 0; j < LIGHT_STEPS_MAX; ++j) { + + // The loop should be: for (int j = 0; i < LIGHT_STEPS; ++j) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to break early instead + if (j >= LIGHT_STEPS) { + break; + } + + // Calculate sample position along light ray. + vec3 lightPosition = samplePosition + lightDirection * (lightPositionLength + lightStepLength * 0.5); + + // Calculate height of the light sample position above ellipsoid. + float lightHeight = length(lightPosition) - atmosphereInnerRadius; + + // Calculate density of photons at the light sample position. + lightOpticalDepth += exp(-lightHeight / heightScale) * lightStepLength; + + // Increment distance on light ray. + lightPositionLength += lightStepLength; + } + + // Compute attenuation via the primary ray and the light ray. + vec3 attenuation = exp(-((czm_atmosphereMieCoefficient * (opticalDepth.y + lightOpticalDepth.y)) + (czm_atmosphereRayleighCoefficient * (opticalDepth.x + lightOpticalDepth.x)))); + + // Accumulate the scattering. + rayleighAccumulation += sampleDensity.x * attenuation; + mieAccumulation += sampleDensity.y * attenuation; + + // Increment distance on primary ray. + rayPositionLength += (rayStepLength += rayStepLengthIncrease); + } + + // Compute the scattering amount. + rayleighColor = czm_atmosphereRayleighCoefficient * rayleighAccumulation; + mieColor = czm_atmosphereMieCoefficient * mieAccumulation; + + // Compute the transmittance i.e. how much light is passing through the atmosphere. + opacity = length(exp(-((czm_atmosphereMieCoefficient * opticalDepth.y) + (czm_atmosphereRayleighCoefficient * opticalDepth.x)))); +} +`, czm_cosineAndSine = `/** + * @private + */ +vec2 cordic(float angle) +{ +// Scale the vector by the appropriate factor for the 24 iterations to follow. + vec2 vector = vec2(6.0725293500888267e-1, 0.0); +// Iteration 1 + float sense = (angle < 0.0) ? -1.0 : 1.0; + // float factor = sense * 1.0; // 2^-0 + mat2 rotation = mat2(1.0, sense, -sense, 1.0); + vector = rotation * vector; + angle -= sense * 7.8539816339744828e-1; // atan(2^-0) +// Iteration 2 + sense = (angle < 0.0) ? -1.0 : 1.0; + float factor = sense * 5.0e-1; // 2^-1 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 4.6364760900080609e-1; // atan(2^-1) +// Iteration 3 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 2.5e-1; // 2^-2 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 2.4497866312686414e-1; // atan(2^-2) +// Iteration 4 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.25e-1; // 2^-3 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.2435499454676144e-1; // atan(2^-3) +// Iteration 5 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 6.25e-2; // 2^-4 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 6.2418809995957350e-2; // atan(2^-4) +// Iteration 6 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 3.125e-2; // 2^-5 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 3.1239833430268277e-2; // atan(2^-5) +// Iteration 7 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.5625e-2; // 2^-6 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.5623728620476831e-2; // atan(2^-6) +// Iteration 8 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 7.8125e-3; // 2^-7 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 7.8123410601011111e-3; // atan(2^-7) +// Iteration 9 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 3.90625e-3; // 2^-8 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 3.9062301319669718e-3; // atan(2^-8) +// Iteration 10 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.953125e-3; // 2^-9 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.9531225164788188e-3; // atan(2^-9) +// Iteration 11 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 9.765625e-4; // 2^-10 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 9.7656218955931946e-4; // atan(2^-10) +// Iteration 12 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 4.8828125e-4; // 2^-11 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 4.8828121119489829e-4; // atan(2^-11) +// Iteration 13 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 2.44140625e-4; // 2^-12 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 2.4414062014936177e-4; // atan(2^-12) +// Iteration 14 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.220703125e-4; // 2^-13 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.2207031189367021e-4; // atan(2^-13) +// Iteration 15 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 6.103515625e-5; // 2^-14 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 6.1035156174208773e-5; // atan(2^-14) +// Iteration 16 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 3.0517578125e-5; // 2^-15 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 3.0517578115526096e-5; // atan(2^-15) +// Iteration 17 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.52587890625e-5; // 2^-16 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.5258789061315762e-5; // atan(2^-16) +// Iteration 18 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 7.62939453125e-6; // 2^-17 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 7.6293945311019700e-6; // atan(2^-17) +// Iteration 19 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 3.814697265625e-6; // 2^-18 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 3.8146972656064961e-6; // atan(2^-18) +// Iteration 20 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.9073486328125e-6; // 2^-19 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 1.9073486328101870e-6; // atan(2^-19) +// Iteration 21 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 9.5367431640625e-7; // 2^-20 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 9.5367431640596084e-7; // atan(2^-20) +// Iteration 22 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 4.76837158203125e-7; // 2^-21 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 4.7683715820308884e-7; // atan(2^-21) +// Iteration 23 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 2.384185791015625e-7; // 2^-22 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; + angle -= sense * 2.3841857910155797e-7; // atan(2^-22) +// Iteration 24 + sense = (angle < 0.0) ? -1.0 : 1.0; + factor = sense * 1.1920928955078125e-7; // 2^-23 + rotation[0][1] = factor; + rotation[1][0] = -factor; + vector = rotation * vector; +// angle -= sense * 1.1920928955078068e-7; // atan(2^-23) + + return vector; +} + +/** + * Computes the cosine and sine of the provided angle using the CORDIC algorithm. + * + * @name czm_cosineAndSine + * @glslFunction + * + * @param {float} angle The angle in radians. + * + * @returns {vec2} The resulting cosine of the angle (as the x coordinate) and sine of the angle (as the y coordinate). + * + * @example + * vec2 v = czm_cosineAndSine(czm_piOverSix); + * float cosine = v.x; + * float sine = v.y; + */ +vec2 czm_cosineAndSine(float angle) +{ + if (angle < -czm_piOverTwo || angle > czm_piOverTwo) + { + if (angle < 0.0) + { + return -cordic(angle + czm_pi); + } + else + { + return -cordic(angle - czm_pi); + } + } + else + { + return cordic(angle); + } +} +`, czm_decompressTextureCoordinates = `/** + * Decompresses texture coordinates that were packed into a single float. + * + * @name czm_decompressTextureCoordinates + * @glslFunction + * + * @param {float} encoded The compressed texture coordinates. + * @returns {vec2} The decompressed texture coordinates. + */ + vec2 czm_decompressTextureCoordinates(float encoded) + { + float temp = encoded / 4096.0; + float xZeroTo4095 = floor(temp); + float stx = xZeroTo4095 / 4095.0; + float sty = (encoded - xZeroTo4095 * 4096.0) / 4095.0; + return vec2(stx, sty); + } +`, czm_depthClamp = `// emulated noperspective +#if (__VERSION__ == 300 || defined(GL_EXT_frag_depth)) && !defined(LOG_DEPTH) +out float v_WindowZ; +#endif + +/** + * Emulates GL_DEPTH_CLAMP, which is not available in WebGL 1 or 2. + * GL_DEPTH_CLAMP clamps geometry that is outside the near and far planes, + * capping the shadow volume. More information here: + * https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_depth_clamp.txt. + * + * When GL_EXT_frag_depth is available we emulate GL_DEPTH_CLAMP by ensuring + * no geometry gets clipped by setting the clip space z value to 0.0 and then + * sending the unaltered screen space z value (using emulated noperspective + * interpolation) to the frag shader where it is clamped to [0,1] and then + * written with gl_FragDepth (see czm_writeDepthClamp). This technique is based on: + * https://stackoverflow.com/questions/5960757/how-to-emulate-gl-depth-clamp-nv. + * + * When GL_EXT_frag_depth is not available, which is the case on some mobile + * devices, we must attempt to fix this only in the vertex shader. + * The approach is to clamp the z value to the far plane, which closes the + * shadow volume but also distorts the geometry, so there can still be artifacts + * on frustum seams. + * + * @name czm_depthClamp + * @glslFunction + * + * @param {vec4} coords The vertex in clip coordinates. + * @returns {vec4} The modified vertex. + * + * @example + * gl_Position = czm_depthClamp(czm_modelViewProjection * vec4(position, 1.0)); + * + * @see czm_writeDepthClamp + */ +vec4 czm_depthClamp(vec4 coords) +{ +#ifndef LOG_DEPTH +#if __VERSION__ == 300 || defined(GL_EXT_frag_depth) + v_WindowZ = (0.5 * (coords.z / coords.w) + 0.5) * coords.w; + coords.z = 0.0; +#else + coords.z = min(coords.z, coords.w); +#endif +#endif + return coords; +} +`, czm_eastNorthUpToEyeCoordinates = `/** + * Computes a 3x3 rotation matrix that transforms vectors from an ellipsoid's east-north-up coordinate system + * to eye coordinates. In east-north-up coordinates, x points east, y points north, and z points along the + * surface normal. East-north-up can be used as an ellipsoid's tangent space for operations such as bump mapping. + *

+ * The ellipsoid is assumed to be centered at the model coordinate's origin. + * + * @name czm_eastNorthUpToEyeCoordinates + * @glslFunction + * + * @param {vec3} positionMC The position on the ellipsoid in model coordinates. + * @param {vec3} normalEC The normalized ellipsoid surface normal, at positionMC, in eye coordinates. + * + * @returns {mat3} A 3x3 rotation matrix that transforms vectors from the east-north-up coordinate system to eye coordinates. + * + * @example + * // Transform a vector defined in the east-north-up coordinate + * // system, (0, 0, 1) which is the surface normal, to eye + * // coordinates. + * mat3 m = czm_eastNorthUpToEyeCoordinates(positionMC, normalEC); + * vec3 normalEC = m * vec3(0.0, 0.0, 1.0); + */ +mat3 czm_eastNorthUpToEyeCoordinates(vec3 positionMC, vec3 normalEC) +{ + vec3 tangentMC = normalize(vec3(-positionMC.y, positionMC.x, 0.0)); // normalized surface tangent in model coordinates + vec3 tangentEC = normalize(czm_normal3D * tangentMC); // normalized surface tangent in eye coordinates + vec3 bitangentEC = normalize(cross(normalEC, tangentEC)); // normalized surface bitangent in eye coordinates + + return mat3( + tangentEC.x, tangentEC.y, tangentEC.z, + bitangentEC.x, bitangentEC.y, bitangentEC.z, + normalEC.x, normalEC.y, normalEC.z); +} +`, czm_ellipsoidContainsPoint = `/** + * DOC_TBA + * + * @name czm_ellipsoidContainsPoint + * @glslFunction + * + */ +bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point) +{ + vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz; + return (dot(scaled, scaled) <= 1.0); +} +`, czm_ellipsoidTextureCoordinates = `/** + * Approximate uv coordinates based on the ellipsoid normal. + * + * @name czm_ellipsoidTextureCoordinates + * @glslFunction + */ +vec2 czm_ellipsoidTextureCoordinates(vec3 normal) +{ + return vec2(atan(normal.y, normal.x) * czm_oneOverTwoPi + 0.5, asin(normal.z) * czm_oneOverPi + 0.5); +} +`, czm_equalsEpsilon = `/** + * Compares left and right componentwise. Returns true + * if they are within epsilon and false otherwise. The inputs + * left and right can be floats, vec2s, + * vec3s, or vec4s. + * + * @name czm_equalsEpsilon + * @glslFunction + * + * @param {} left The first vector. + * @param {} right The second vector. + * @param {float} epsilon The epsilon to use for equality testing. + * @returns {bool} true if the components are within epsilon and false otherwise. + * + * @example + * // GLSL declarations + * bool czm_equalsEpsilon(float left, float right, float epsilon); + * bool czm_equalsEpsilon(vec2 left, vec2 right, float epsilon); + * bool czm_equalsEpsilon(vec3 left, vec3 right, float epsilon); + * bool czm_equalsEpsilon(vec4 left, vec4 right, float epsilon); + */ +bool czm_equalsEpsilon(vec4 left, vec4 right, float epsilon) { + return all(lessThanEqual(abs(left - right), vec4(epsilon))); +} + +bool czm_equalsEpsilon(vec3 left, vec3 right, float epsilon) { + return all(lessThanEqual(abs(left - right), vec3(epsilon))); +} + +bool czm_equalsEpsilon(vec2 left, vec2 right, float epsilon) { + return all(lessThanEqual(abs(left - right), vec2(epsilon))); +} + +bool czm_equalsEpsilon(float left, float right, float epsilon) { + return (abs(left - right) <= epsilon); +} +`, czm_eyeOffset = `/** + * DOC_TBA + * + * @name czm_eyeOffset + * @glslFunction + * + * @param {vec4} positionEC DOC_TBA. + * @param {vec3} eyeOffset DOC_TBA. + * + * @returns {vec4} DOC_TBA. + */ +vec4 czm_eyeOffset(vec4 positionEC, vec3 eyeOffset) +{ + // This equation is approximate in x and y. + vec4 p = positionEC; + vec4 zEyeOffset = normalize(p) * eyeOffset.z; + p.xy += eyeOffset.xy + zEyeOffset.xy; + p.z += zEyeOffset.z; + return p; +} +`, czm_eyeToWindowCoordinates = `/** + * Transforms a position from eye to window coordinates. The transformation + * from eye to clip coordinates is done using {@link czm_projection}. + * The transform from normalized device coordinates to window coordinates is + * done using {@link czm_viewportTransformation}, which assumes a depth range + * of near = 0 and far = 1. + *

+ * This transform is useful when there is a need to manipulate window coordinates + * in a vertex shader as done by {@link BillboardCollection}. + * + * @name czm_eyeToWindowCoordinates + * @glslFunction + * + * @param {vec4} position The position in eye coordinates to transform. + * + * @returns {vec4} The transformed position in window coordinates. + * + * @see czm_modelToWindowCoordinates + * @see czm_projection + * @see czm_viewportTransformation + * @see BillboardCollection + * + * @example + * vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); + */ +vec4 czm_eyeToWindowCoordinates(vec4 positionEC) +{ + vec4 q = czm_projection * positionEC; // clip coordinates + q.xyz /= q.w; // normalized device coordinates + q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // window coordinates + return q; +} +`, czm_fastApproximateAtan = `/** + * Approxiamtes atan over the range [0, 1]. Safe to flip output for negative input. + * + * Based on Michal Drobot's approximation from ShaderFastLibs, which in turn is based on + * "Efficient approximations for the arctangent function," Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006. + * Adapted from ShaderFastLibs under MIT License. + * + * Chosen for the following characteristics over range [0, 1]: + * - basically no error at 0 and 1, important for getting around range limit (naive atan2 via atan requires infinite range atan) + * - no visible artifacts from first-derivative discontinuities, unlike latitude via range-reduced sqrt asin approximations (at equator) + * + * The original code is x * (-0.1784 * abs(x) - 0.0663 * x * x + 1.0301); + * Removed the abs() in here because it isn't needed, the input range is guaranteed as [0, 1] by how we're approximating atan2. + * + * @name czm_fastApproximateAtan + * @glslFunction + * + * @param {float} x Value between 0 and 1 inclusive. + * + * @returns {float} Approximation of atan(x) + */ +float czm_fastApproximateAtan(float x) { + return x * (-0.1784 * x - 0.0663 * x * x + 1.0301); +} + +/** + * Approximation of atan2. + * + * Range reduction math based on nvidia's cg reference implementation for atan2: http://developer.download.nvidia.com/cg/atan2.html + * However, we replaced their atan curve with Michael Drobot's (see above). + * + * @name czm_fastApproximateAtan + * @glslFunction + * + * @param {float} x Value between -1 and 1 inclusive. + * @param {float} y Value between -1 and 1 inclusive. + * + * @returns {float} Approximation of atan2(x, y) + */ +float czm_fastApproximateAtan(float x, float y) { + // atan approximations are usually only reliable over [-1, 1], or, in our case, [0, 1] due to modifications. + // So range-reduce using abs and by flipping whether x or y is on top. + float t = abs(x); // t used as swap and atan result. + float opposite = abs(y); + float adjacent = max(t, opposite); + opposite = min(t, opposite); + + t = czm_fastApproximateAtan(opposite / adjacent); + + // Undo range reduction + t = czm_branchFreeTernary(abs(y) > abs(x), czm_piOverTwo - t, t); + t = czm_branchFreeTernary(x < 0.0, czm_pi - t, t); + t = czm_branchFreeTernary(y < 0.0, -t, t); + return t; +} +`, czm_fog = `/** + * Gets the color with fog at a distance from the camera. + * + * @name czm_fog + * @glslFunction + * + * @param {float} distanceToCamera The distance to the camera in meters. + * @param {vec3} color The original color. + * @param {vec3} fogColor The color of the fog. + * + * @returns {vec3} The color adjusted for fog at the distance from the camera. + */ +vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor) +{ + float scalar = distanceToCamera * czm_fogDensity; + float fog = 1.0 - exp(-(scalar * scalar)); + return mix(color, fogColor, fog); +} + +/** + * Gets the color with fog at a distance from the camera. + * + * @name czm_fog + * @glslFunction + * + * @param {float} distanceToCamera The distance to the camera in meters. + * @param {vec3} color The original color. + * @param {vec3} fogColor The color of the fog. + * @param {float} fogModifierConstant A constant to modify the appearance of fog. + * + * @returns {vec3} The color adjusted for fog at the distance from the camera. + */ +vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor, float fogModifierConstant) +{ + float scalar = distanceToCamera * czm_fogDensity; + float fog = 1.0 - exp(-((fogModifierConstant * scalar + fogModifierConstant) * (scalar * (1.0 + fogModifierConstant)))); + return mix(color, fogColor, fog); +} +`, czm_gammaCorrect = `/** + * Converts a color from RGB space to linear space. + * + * @name czm_gammaCorrect + * @glslFunction + * + * @param {vec3} color The color in RGB space. + * @returns {vec3} The color in linear space. + */ +vec3 czm_gammaCorrect(vec3 color) { +#ifdef HDR + color = pow(color, vec3(czm_gamma)); +#endif + return color; +} + +vec4 czm_gammaCorrect(vec4 color) { +#ifdef HDR + color.rgb = pow(color.rgb, vec3(czm_gamma)); +#endif + return color; +} +`, czm_geodeticSurfaceNormal = `/** + * DOC_TBA + * + * @name czm_geodeticSurfaceNormal + * @glslFunction + * + * @param {vec3} positionOnEllipsoid DOC_TBA + * @param {vec3} ellipsoidCenter DOC_TBA + * @param {vec3} oneOverEllipsoidRadiiSquared DOC_TBA + * + * @returns {vec3} DOC_TBA. + */ +vec3 czm_geodeticSurfaceNormal(vec3 positionOnEllipsoid, vec3 ellipsoidCenter, vec3 oneOverEllipsoidRadiiSquared) +{ + return normalize((positionOnEllipsoid - ellipsoidCenter) * oneOverEllipsoidRadiiSquared); +} +`, czm_getDefaultMaterial = `/** + * An czm_material with default values. Every material's czm_getMaterial + * should use this default material as a base for the material it returns. + * The default normal value is given by materialInput.normalEC. + * + * @name czm_getDefaultMaterial + * @glslFunction + * + * @param {czm_materialInput} input The input used to construct the default material. + * + * @returns {czm_material} The default material. + * + * @see czm_materialInput + * @see czm_material + * @see czm_getMaterial + */ +czm_material czm_getDefaultMaterial(czm_materialInput materialInput) +{ + czm_material material; + material.diffuse = vec3(0.0); + material.specular = 0.0; + material.shininess = 1.0; + material.normal = materialInput.normalEC; + material.emission = vec3(0.0); + material.alpha = 1.0; + return material; +} +`, czm_getDynamicAtmosphereLightDirection = `/** + * Select which direction vector to use for dynamic atmosphere lighting based on an enum value + * + * @name czm_getDynamicAtmosphereLightDirection + * @glslfunction + * @see DynamicAtmosphereLightingType.js + * + * @param {vec3} positionWC the position of the vertex/fragment in world coordinates. This is normalized and returned when dynamic lighting is turned off. + * @param {float} lightEnum The enum value for selecting between light sources. + * @return {vec3} The normalized light direction vector. Depending on the enum value, it is either positionWC, czm_lightDirectionWC or czm_sunDirectionWC + */ +vec3 czm_getDynamicAtmosphereLightDirection(vec3 positionWC, float lightEnum) { + const float NONE = 0.0; + const float SCENE_LIGHT = 1.0; + const float SUNLIGHT = 2.0; + + vec3 lightDirection = + positionWC * float(lightEnum == NONE) + + czm_lightDirectionWC * float(lightEnum == SCENE_LIGHT) + + czm_sunDirectionWC * float(lightEnum == SUNLIGHT); + return normalize(lightDirection); +} +`, czm_getLambertDiffuse = `/** + * Calculates the intensity of diffusely reflected light. + * + * @name czm_getLambertDiffuse + * @glslFunction + * + * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. + * @param {vec3} normalEC The surface normal in eye coordinates. + * + * @returns {float} The intensity of the diffuse reflection. + * + * @see czm_phong + * + * @example + * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); + * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); + * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); + */ +float czm_getLambertDiffuse(vec3 lightDirectionEC, vec3 normalEC) +{ + return max(dot(lightDirectionEC, normalEC), 0.0); +} +`, czm_getSpecular = `/** + * Calculates the specular intensity of reflected light. + * + * @name czm_getSpecular + * @glslFunction + * + * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. + * @param {vec3} toEyeEC Unit vector pointing to the eye position in eye coordinates. + * @param {vec3} normalEC The surface normal in eye coordinates. + * @param {float} shininess The sharpness of the specular reflection. Higher values create a smaller, more focused specular highlight. + * + * @returns {float} The intensity of the specular highlight. + * + * @see czm_phong + * + * @example + * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); + * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); + * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); + */ +float czm_getSpecular(vec3 lightDirectionEC, vec3 toEyeEC, vec3 normalEC, float shininess) +{ + vec3 toReflectedLight = reflect(-lightDirectionEC, normalEC); + float specular = max(dot(toReflectedLight, toEyeEC), 0.0); + + // pow has undefined behavior if both parameters <= 0. + // Prevent this by making sure shininess is at least czm_epsilon2. + return pow(specular, max(shininess, czm_epsilon2)); +} +`, czm_getWaterNoise = `/** + * @private + */ +vec4 czm_getWaterNoise(sampler2D normalMap, vec2 uv, float time, float angleInRadians) +{ + float cosAngle = cos(angleInRadians); + float sinAngle = sin(angleInRadians); + + // time dependent sampling directions + vec2 s0 = vec2(1.0/17.0, 0.0); + vec2 s1 = vec2(-1.0/29.0, 0.0); + vec2 s2 = vec2(1.0/101.0, 1.0/59.0); + vec2 s3 = vec2(-1.0/109.0, -1.0/57.0); + + // rotate sampling direction by specified angle + s0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y)); + s1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y)); + s2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y)); + s3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y)); + + vec2 uv0 = (uv/103.0) + (time * s0); + vec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23); + vec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51); + vec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71); + + uv0 = fract(uv0); + uv1 = fract(uv1); + uv2 = fract(uv2); + uv3 = fract(uv3); + vec4 noise = (texture(normalMap, uv0)) + + (texture(normalMap, uv1)) + + (texture(normalMap, uv2)) + + (texture(normalMap, uv3)); + + // average and scale to between -1 and 1 + return ((noise / 4.0) - 0.5) * 2.0; +} +`, czm_hue = `/** + * Adjusts the hue of a color. + * + * @name czm_hue + * @glslFunction + * + * @param {vec3} rgb The color. + * @param {float} adjustment The amount to adjust the hue of the color in radians. + * + * @returns {float} The color with the hue adjusted. + * + * @example + * vec3 adjustHue = czm_hue(color, czm_pi); // The same as czm_hue(color, -czm_pi) + */ +vec3 czm_hue(vec3 rgb, float adjustment) +{ + const mat3 toYIQ = mat3(0.299, 0.587, 0.114, + 0.595716, -0.274453, -0.321263, + 0.211456, -0.522591, 0.311135); + const mat3 toRGB = mat3(1.0, 0.9563, 0.6210, + 1.0, -0.2721, -0.6474, + 1.0, -1.107, 1.7046); + + vec3 yiq = toYIQ * rgb; + float hue = atan(yiq.z, yiq.y) + adjustment; + float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y); + + vec3 color = vec3(yiq.x, chroma * cos(hue), chroma * sin(hue)); + return toRGB * color; +} +`, czm_inverseGamma = `/** + * Converts a color in linear space to RGB space. + * + * @name czm_inverseGamma + * @glslFunction + * + * @param {vec3} color The color in linear space. + * @returns {vec3} The color in RGB space. + */ +vec3 czm_inverseGamma(vec3 color) { + return pow(color, vec3(1.0 / czm_gamma)); +} +`, czm_isEmpty = `/** + * Determines if a time interval is empty. + * + * @name czm_isEmpty + * @glslFunction + * + * @param {czm_raySegment} interval The interval to test. + * + * @returns {bool} true if the time interval is empty; otherwise, false. + * + * @example + * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true + * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false + * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. + */ +bool czm_isEmpty(czm_raySegment interval) +{ + return (interval.stop < 0.0); +} +`, czm_isFull = `/** + * Determines if a time interval is empty. + * + * @name czm_isFull + * @glslFunction + * + * @param {czm_raySegment} interval The interval to test. + * + * @returns {bool} true if the time interval is empty; otherwise, false. + * + * @example + * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true + * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false + * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. + */ +bool czm_isFull(czm_raySegment interval) +{ + return (interval.start == 0.0 && interval.stop == czm_infinity); +} +`, czm_latitudeToWebMercatorFraction = `/** + * Computes the fraction of a Web Wercator rectangle at which a given geodetic latitude is located. + * + * @name czm_latitudeToWebMercatorFraction + * @glslFunction + * + * @param {float} latitude The geodetic latitude, in radians. + * @param {float} southMercatorY The Web Mercator coordinate of the southern boundary of the rectangle. + * @param {float} oneOverMercatorHeight The total height of the rectangle in Web Mercator coordinates. + * + * @returns {float} The fraction of the rectangle at which the latitude occurs. If the latitude is the southern + * boundary of the rectangle, the return value will be zero. If it is the northern boundary, the return + * value will be 1.0. Latitudes in between are mapped according to the Web Mercator projection. + */ +float czm_latitudeToWebMercatorFraction(float latitude, float southMercatorY, float oneOverMercatorHeight) +{ + float sinLatitude = sin(latitude); + float mercatorY = 0.5 * log((1.0 + sinLatitude) / (1.0 - sinLatitude)); + + return (mercatorY - southMercatorY) * oneOverMercatorHeight; +} +`, czm_lineDistance = `/** + * Computes distance from an point in 2D to a line in 2D. + * + * @name czm_lineDistance + * @glslFunction + * + * param {vec2} point1 A point along the line. + * param {vec2} point2 A point along the line. + * param {vec2} point A point that may or may not be on the line. + * returns {float} The distance from the point to the line. + */ +float czm_lineDistance(vec2 point1, vec2 point2, vec2 point) { + return abs((point2.y - point1.y) * point.x - (point2.x - point1.x) * point.y + point2.x * point1.y - point2.y * point1.x) / distance(point2, point1); +} +`, czm_linearToSrgb = `/** + * Converts a linear RGB color to an sRGB color. + * + * @param {vec3|vec4} linearIn The color in linear color space. + * @returns {vec3|vec4} The color in sRGB color space. The vector type matches the input. + */ +vec3 czm_linearToSrgb(vec3 linearIn) +{ + return pow(linearIn, vec3(1.0/2.2)); +} + +vec4 czm_linearToSrgb(vec4 linearIn) +{ + vec3 srgbOut = pow(linearIn.rgb, vec3(1.0/2.2)); + return vec4(srgbOut, linearIn.a); +} +`, czm_luminance = `/** + * Computes the luminance of a color. + * + * @name czm_luminance + * @glslFunction + * + * @param {vec3} rgb The color. + * + * @returns {float} The luminance. + * + * @example + * float light = czm_luminance(vec3(0.0)); // 0.0 + * float dark = czm_luminance(vec3(1.0)); // ~1.0 + */ +float czm_luminance(vec3 rgb) +{ + // Algorithm from Chapter 10 of Graphics Shaders. + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + return dot(rgb, W); +} +`, czm_maximumComponent = `/** + * Find the maximum component of a vector. + * + * @name czm_maximumComponent + * @glslFunction + * + * @param {vec2|vec3|vec4} v The input vector. + * @returns {float} The value of the largest component. + */ +float czm_maximumComponent(vec2 v) +{ + return max(v.x, v.y); +} +float czm_maximumComponent(vec3 v) +{ + return max(max(v.x, v.y), v.z); +} +float czm_maximumComponent(vec4 v) +{ + return max(max(max(v.x, v.y), v.z), v.w); +} +`, czm_metersPerPixel = `/** + * Computes the size of a pixel in meters at a distance from the eye. + *

+ * Use this version when passing in a custom pixel ratio. For example, passing in 1.0 will return meters per native device pixel. + *

+ * @name czm_metersPerPixel + * @glslFunction + * + * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. + * @param {float} pixelRatio The scaling factor from pixel space to coordinate space + * + * @returns {float} The meters per pixel at positionEC. + */ +float czm_metersPerPixel(vec4 positionEC, float pixelRatio) +{ + float width = czm_viewport.z; + float height = czm_viewport.w; + float pixelWidth; + float pixelHeight; + + float top = czm_frustumPlanes.x; + float bottom = czm_frustumPlanes.y; + float left = czm_frustumPlanes.z; + float right = czm_frustumPlanes.w; + + if (czm_sceneMode == czm_sceneMode2D || czm_orthographicIn3D == 1.0) + { + float frustumWidth = right - left; + float frustumHeight = top - bottom; + pixelWidth = frustumWidth / width; + pixelHeight = frustumHeight / height; + } + else + { + float distanceToPixel = -positionEC.z; + float inverseNear = 1.0 / czm_currentFrustum.x; + float tanTheta = top * inverseNear; + pixelHeight = 2.0 * distanceToPixel * tanTheta / height; + tanTheta = right * inverseNear; + pixelWidth = 2.0 * distanceToPixel * tanTheta / width; + } + + return max(pixelWidth, pixelHeight) * pixelRatio; +} + +/** + * Computes the size of a pixel in meters at a distance from the eye. + *

+ * Use this version when scaling by pixel ratio. + *

+ * @name czm_metersPerPixel + * @glslFunction + * + * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. + * + * @returns {float} The meters per pixel at positionEC. + */ +float czm_metersPerPixel(vec4 positionEC) +{ + return czm_metersPerPixel(positionEC, czm_pixelRatio); +} +`, czm_modelToWindowCoordinates = `/** + * Transforms a position from model to window coordinates. The transformation + * from model to clip coordinates is done using {@link czm_modelViewProjection}. + * The transform from normalized device coordinates to window coordinates is + * done using {@link czm_viewportTransformation}, which assumes a depth range + * of near = 0 and far = 1. + *

+ * This transform is useful when there is a need to manipulate window coordinates + * in a vertex shader as done by {@link BillboardCollection}. + *

+ * This function should not be confused with {@link czm_viewportOrthographic}, + * which is an orthographic projection matrix that transforms from window + * coordinates to clip coordinates. + * + * @name czm_modelToWindowCoordinates + * @glslFunction + * + * @param {vec4} position The position in model coordinates to transform. + * + * @returns {vec4} The transformed position in window coordinates. + * + * @see czm_eyeToWindowCoordinates + * @see czm_modelViewProjection + * @see czm_viewportTransformation + * @see czm_viewportOrthographic + * @see BillboardCollection + * + * @example + * vec4 positionWC = czm_modelToWindowCoordinates(positionMC); + */ +vec4 czm_modelToWindowCoordinates(vec4 position) +{ + vec4 q = czm_modelViewProjection * position; // clip coordinates + q.xyz /= q.w; // normalized device coordinates + q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // window coordinates + return q; +} +`, czm_multiplyWithColorBalance = `/** + * DOC_TBA + * + * @name czm_multiplyWithColorBalance + * @glslFunction + */ +vec3 czm_multiplyWithColorBalance(vec3 left, vec3 right) +{ + // Algorithm from Chapter 10 of Graphics Shaders. + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + vec3 target = left * right; + float leftLuminance = dot(left, W); + float rightLuminance = dot(right, W); + float targetLuminance = dot(target, W); + + return ((leftLuminance + rightLuminance) / (2.0 * targetLuminance)) * target; +} +`, czm_nearFarScalar = `/** + * Computes a value that scales with distance. The scaling is clamped at the near and + * far distances, and does not extrapolate. This function works with the + * {@link NearFarScalar} JavaScript class. + * + * @name czm_nearFarScalar + * @glslFunction + * + * @param {vec4} nearFarScalar A vector with 4 components: Near distance (x), Near value (y), Far distance (z), Far value (w). + * @param {float} cameraDistSq The square of the current distance from the camera. + * + * @returns {float} The value at this distance. + */ +float czm_nearFarScalar(vec4 nearFarScalar, float cameraDistSq) +{ + float valueAtMin = nearFarScalar.y; + float valueAtMax = nearFarScalar.w; + float nearDistanceSq = nearFarScalar.x * nearFarScalar.x; + float farDistanceSq = nearFarScalar.z * nearFarScalar.z; + + float t = (cameraDistSq - nearDistanceSq) / (farDistanceSq - nearDistanceSq); + + t = pow(clamp(t, 0.0, 1.0), 0.2); + + return mix(valueAtMin, valueAtMax, t); +} +`, czm_octDecode = ` /** + * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The oct-encoded, unit-length vector + * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(vec2 encoded, float range) + { + if (encoded.x == 0.0 && encoded.y == 0.0) { + return vec3(0.0, 0.0, 0.0); + } + + encoded = encoded / range * 2.0 - 1.0; + vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); + if (v.z < 0.0) + { + v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); + } + + return normalize(v); + } + +/** + * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The oct-encoded, unit-length vector + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(vec2 encoded) + { + return czm_octDecode(encoded, 255.0); + } + + /** + * Decodes a unit-length vector in 'oct' encoding packed into a floating-point number to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {float} encoded The oct-encoded, unit-length vector + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(float encoded) + { + float temp = encoded / 256.0; + float x = floor(temp); + float y = (temp - x) * 256.0; + return czm_octDecode(vec2(x, y)); + } + +/** + * Decodes three unit-length vectors in 'oct' encoding packed into two floating-point numbers to normalized 3-component Cartesian vectors. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The packed oct-encoded, unit-length vectors. + * @param {vec3} vector1 One decoded and normalized vector. + * @param {vec3} vector2 One decoded and normalized vector. + * @param {vec3} vector3 One decoded and normalized vector. + */ + void czm_octDecode(vec2 encoded, out vec3 vector1, out vec3 vector2, out vec3 vector3) + { + float temp = encoded.x / 65536.0; + float x = floor(temp); + float encodedFloat1 = (temp - x) * 65536.0; + + temp = encoded.y / 65536.0; + float y = floor(temp); + float encodedFloat2 = (temp - y) * 65536.0; + + vector1 = czm_octDecode(encodedFloat1); + vector2 = czm_octDecode(encodedFloat2); + vector3 = czm_octDecode(vec2(x, y)); + } + +`, czm_packDepth = `/** + * Packs a depth value into a vec3 that can be represented by unsigned bytes. + * + * @name czm_packDepth + * @glslFunction + * + * @param {float} depth The floating-point depth. + * @returns {vec3} The packed depth. + */ +vec4 czm_packDepth(float depth) +{ + // See Aras Pranckevičius' post Encoding Floats to RGBA + // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ + vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth; + enc = fract(enc); + enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0); + return enc; +} +`, czm_pbrLighting = `vec3 lambertianDiffuse(vec3 diffuseColor) +{ + return diffuseColor / czm_pi; +} + +vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) +{ + float versine = 1.0 - VdotH; + // pow(versine, 5.0) is slow. See https://stackoverflow.com/a/68793086/10082269 + float versineSquared = versine * versine; + return f0 + (f90 - f0) * versineSquared * versineSquared * versine; +} + +#ifdef USE_ANISOTROPY +/** + * @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent) + * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) + * @param {vec3} lightDirection The direction from the fragment to the light source, transformed to tangent-bitangent-normal coordinates + * @param {vec3} viewDirection The direction from the fragment to the camera, transformed to tangent-bitangent-normal coordinates + */ +float smithVisibilityGGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 lightDirection, vec3 viewDirection) +{ + vec3 roughnessScale = vec3(tangentialRoughness, bitangentRoughness, 1.0); + float GGXV = lightDirection.z * length(roughnessScale * viewDirection); + float GGXL = viewDirection.z * length(roughnessScale * lightDirection); + float v = 0.5 / (GGXV + GGXL); + return clamp(v, 0.0, 1.0); +} + +/** + * @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent) + * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) + * @param {vec3} halfwayDirection The unit vector halfway between light and view directions, transformed to tangent-bitangent-normal coordinates + */ +float GGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 halfwayDirection) +{ + float roughnessSquared = bitangentRoughness * tangentialRoughness; + vec3 f = halfwayDirection * vec3(bitangentRoughness, tangentialRoughness, roughnessSquared); + float w2 = roughnessSquared / dot(f, f); + return roughnessSquared * w2 * w2 / czm_pi; +} +#endif + +/** + * Estimate the geometric self-shadowing of the microfacets in a surface, + * using the Smith Joint GGX visibility function. + * Note: Vis = G / (4 * NdotL * NdotV) + * see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 + * see Real-Time Rendering. Page 331 to 336. + * see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) + * + * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. + * @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source. + * @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera. + */ +float smithVisibilityGGX(float alphaRoughness, float NdotL, float NdotV) +{ + float alphaRoughnessSq = alphaRoughness * alphaRoughness; + + float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + + float GGX = GGXV + GGXL; + if (GGX > 0.0) + { + return 0.5 / GGX; + } + return 0.0; +} + +float smithVisibilityG1(float NdotV, float roughness) +{ + // this is the k value for direct lighting. + // for image based lighting it will be roughness^2 / 2 + float k = (roughness + 1.0) * (roughness + 1.0) / 8.0; + return NdotV / (NdotV * (1.0 - k) + k); +} + +float smithVisibilityGGX_VCS(float roughness, float NdotL, float NdotV) +{ + // Avoid divide-by-zero errors + NdotL = clamp(NdotL, 0.001, 1.0); + NdotV += 0.001; + return ( + smithVisibilityG1(NdotL, roughness) * + smithVisibilityG1(NdotV, roughness) + ); +} + +/** + * Estimate the fraction of the microfacets in a surface that are aligned with + * the halfway vector, which is aligned halfway between the directions from + * the fragment to the camera and from the fragment to the light source. + * + * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. + * @param {float} NdotH The cosine of the angle between the surface normal and the halfway vector. + * @return {float} The fraction of microfacets aligned to the halfway vector. + */ +float GGX(float alphaRoughness, float NdotH) +{ + float alphaRoughnessSquared = alphaRoughness * alphaRoughness; + float f = (NdotH * alphaRoughnessSquared - NdotH) * NdotH + 1.0; + return alphaRoughnessSquared / (czm_pi * f * f); +} + +/** + * Compute the strength of the specular reflection due to direct lighting. + * + * @param {vec3} normal The surface normal. + * @param {vec3} lightDirection The unit vector pointing from the fragment to the light source. + * @param {vec3} viewDirection The unit vector pointing from the fragment to the camera. + * @param {vec3} halfwayDirection The unit vector pointing from the fragment to halfway between the light source and the camera. + * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. + * @return {float} The strength of the specular reflection. + */ +float computeDirectSpecularStrength(vec3 normal, vec3 lightDirection, vec3 viewDirection, vec3 halfwayDirection, float alphaRoughness) +{ + float NdotL = clamp(dot(normal, lightDirection), 0.0, 1.0); + float NdotV = clamp(dot(normal, viewDirection), 0.0, 1.0); + float G = smithVisibilityGGX(alphaRoughness, NdotL, NdotV); + float NdotH = clamp(dot(normal, halfwayDirection), 0.0, 1.0); + float D = GGX(alphaRoughness, NdotH); + return G * D; +} + +/** + * Compute the diffuse and specular contributions using physically based + * rendering. This function only handles direct lighting. + *

+ * This function only handles the lighting calculations. Metallic/roughness + * and specular/glossy must be handled separately. See {@MaterialStageFS} + *

+ * + * @name czm_pbrLighting + * @glslFunction + * + * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position + * @param {vec3} normalEC The surface normal in eye coordinates + * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. + * @param {czm_modelMaterial} The material properties. + * @return {vec3} The computed HDR color + */ +vec3 czm_pbrLighting(vec3 positionEC, vec3 viewDirectionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material) +{ + #ifdef USE_CUSTOM_LIGHT_COLOR + vec3 lightColorHdr = model_lightColorHdr; + #else + vec3 lightColorHdr = czm_lightColorHdr; + #endif + #ifdef USE_VCS_CUSTOM_SHADING + lightColorHdr *= 0.35; + + vec3 diffuseColor = material.diffuse; + float u_lambertDiffuseMultiplier = 0.9; + float u_vertexShadowDarkness = 0.3; + + float ambientLuminanceNight = 0.05; + float ambientLuminanceDay = (1.0 - ambientLuminanceNight) * u_vertexShadowDarkness + ambientLuminanceNight; + + float distance = length(positionEC); + vec3 v = -normalize(positionEC); + vec3 l = lightDirectionEC; + vec3 h = normalize(v + l); + vec3 n = normalEC; + float NdotL = dot(n, l); + float NdotLclamped = clamp(NdotL, 0.0001, 1.0); + float NdotV = abs(dot(n, v)) + 0.001; + float NdotH = clamp(dot(n, h), 0.0, 1.0); + float VdotH = clamp(dot(v, h), 0.0, 1.0); + + float directLight = clamp(NdotL*50.0, 0.0, 1.0); + + vec3 positionWC = vec3(czm_inverseView * vec4(positionEC, 1.0)); + vec3 upWC = normalize(positionWC); + vec3 lWC = normalize(czm_inverseViewRotation * l); + vec3 nWC = normalize(czm_inverseViewRotation * n); + float LdotZ = dot(lWC, -upWC); + float NdotZ = dot(nWC, upWC); + float sunAboveHorizon = clamp(-200.0 * LdotZ, 0.0, 1.0); + + // beginning of nautical twilight at 12 degrees below horizon (in radiens) + float LdotZclamped = clamp(LdotZ, 0.0, 1.0); + float m = 0.209439510239; + float nn = (-LdotZclamped + m) / m; + float beta = smoothstep(0.0, 1.0, nn); + float ambientLightLuminance = mix(ambientLuminanceNight, ambientLuminanceDay, beta); + + //modify hue of sunlight + vec3 directLightColorHdr = lightColorHdr; + float gamma = clamp(-20.0 * LdotZ, 0.0, 1.0); + + float sun_minB = 0.5; //0.7; + float sun_minG = sun_minB * 0.5 + 0.5; + float sun_G = gamma*(1.0 - sun_minG) + sun_minG; + float sun_B = gamma*(1.0 - sun_minB) + sun_minB; + directLightColorHdr.g *= sun_G; + directLightColorHdr.b *= sun_B; + + //ambient diffuse light + float ambientModulationMinimum = 0.2; + float ambientModulation = ambientModulationMinimum + (NdotZ*0.5 + 0.5)*(NdotL*0.2 + 0.8)*(1.0 - ambientModulationMinimum); + vec3 ambientLightContribution = diffuseColor * lightColorHdr * ambientLightLuminance * ambientModulation; + + // direct light + vec3 directLightContribution = diffuseColor * directLightColorHdr * NdotLclamped * u_lambertDiffuseMultiplier * sunAboveHorizon; + + //direct specular light + vec3 f0 = material.specular; + float reflectance = czm_maximumComponent(f0); + vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0)); + vec3 F = fresnelSchlick2(f0, f90, VdotH); + float alphaRoughness = material.roughness * material.roughness; + float G = smithVisibilityGGX_VCS(material.roughness, NdotLclamped, NdotV); + float D = GGX(alphaRoughness, NdotH); + vec3 directSpecularContribution = directLight * clamp(F * G * D / (4.0 * NdotLclamped * NdotV) * sunAboveHorizon * directLightColorHdr, 0.0, 1.0); + + //ambient specular light + const vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9); + const vec3 REFLECTANCE_DIELECTRIC = vec3(0.04); + vec3 g0 = (f0 - REFLECTANCE_DIELECTRIC) / (1.0 - REFLECTANCE_DIELECTRIC) ; + vec3 ambientSpecularContribution = g0 * blueSkyDiffuseColor * ambientLightLuminance * ambientModulation; + + vec3 finalColorRGB = ambientLightContribution + directLightContribution + directSpecularContribution + ambientSpecularContribution; + return finalColorRGB; + #else + + vec3 halfwayDirectionEC = normalize(viewDirectionEC + lightDirectionEC); + float VdotH = clamp(dot(viewDirectionEC, halfwayDirectionEC), 0.0, 1.0); + float NdotL = clamp(dot(normalEC, lightDirectionEC), 0.001, 1.0); + + vec3 f0 = material.specular; + float reflectance = czm_maximumComponent(f0); + // Typical dielectrics will have reflectance 0.04, so f90 will be 1.0. + // In this case, at grazing angle, all incident energy is reflected. + vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0)); + vec3 F = fresnelSchlick2(f0, f90, VdotH); + + #if defined(USE_SPECULAR) + F *= material.specularWeight; + #endif + + float alphaRoughness = material.roughness * material.roughness; + #ifdef USE_ANISOTROPY + mat3 tbn = mat3(material.anisotropicT, material.anisotropicB, normalEC); + vec3 lightDirection = lightDirectionEC * tbn; + vec3 viewDirection = viewDirectionEC * tbn; + vec3 halfwayDirection = halfwayDirectionEC * tbn; + float anisotropyStrength = material.anisotropyStrength; + float tangentialRoughness = mix(alphaRoughness, 1.0, anisotropyStrength * anisotropyStrength); + float bitangentRoughness = clamp(alphaRoughness, 0.001, 1.0); + float G = smithVisibilityGGX_anisotropic(bitangentRoughness, tangentialRoughness, lightDirection, viewDirection); + float D = GGX_anisotropic(bitangentRoughness, tangentialRoughness, halfwayDirection); + vec3 specularContribution = F * G * D; + #else + float specularStrength = computeDirectSpecularStrength(normalEC, lightDirectionEC, viewDirectionEC, halfwayDirectionEC, alphaRoughness); + vec3 specularContribution = F * specularStrength; + #endif + + vec3 diffuseColor = material.diffuse; + // F here represents the specular contribution + vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor); + + // Lo = (diffuse + specular) * Li * NdotL + return (diffuseContribution + specularContribution) * NdotL * lightColorHdr; + #endif +} +`, czm_pbrNeutralTonemapping = `// KhronosGroup https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral + +// Input color is non-negative and resides in the Linear Rec. 709 color space. +// Output color is also Linear Rec. 709, but in the [0, 1] range. + +vec3 czm_pbrNeutralTonemapping(vec3 color) { + const float startCompression = 0.8 - 0.04; + const float desaturation = 0.15; + + float x = min(color.r, min(color.g, color.b)); + float offset = czm_branchFreeTernary(x < 0.08, x - 6.25 * x * x, 0.04); + color -= offset; + + float peak = max(color.r, max(color.g, color.b)); + if (peak < startCompression) return color; + + const float d = 1.0 - startCompression; + float newPeak = 1.0 - d * d / (peak + d - startCompression); + color *= newPeak / peak; + + float g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0); + return mix(color, newPeak * vec3(1.0, 1.0, 1.0), g); +} +`, czm_phong = `float czm_private_getLambertDiffuseOfMaterial(vec3 lightDirectionEC, czm_material material) +{ + return czm_getLambertDiffuse(lightDirectionEC, material.normal); +} + +float czm_private_getSpecularOfMaterial(vec3 lightDirectionEC, vec3 toEyeEC, czm_material material) +{ + return czm_getSpecular(lightDirectionEC, toEyeEC, material.normal, material.shininess); +} + +/** + * Computes a color using the Phong lighting model. + * + * @name czm_phong + * @glslFunction + * + * @param {vec3} toEye A normalized vector from the fragment to the eye in eye coordinates. + * @param {czm_material} material The fragment's material. + * + * @returns {vec4} The computed color. + * + * @example + * vec3 positionToEyeEC = // ... + * czm_material material = // ... + * vec3 lightDirectionEC = // ... + * out_FragColor = czm_phong(normalize(positionToEyeEC), material, lightDirectionEC); + * + * @see czm_getMaterial + */ +vec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) +{ + // Diffuse from directional light sources at eye (for top-down) + float diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material); + if (czm_sceneMode == czm_sceneMode3D) { + // (and horizon views in 3D) + diffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material); + } + + float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); + + // Temporary workaround for adding ambient. + vec3 materialDiffuse = material.diffuse * 0.5; + + vec3 ambient = materialDiffuse; + vec3 color = ambient + material.emission; + color += materialDiffuse * diffuse * czm_lightColor; + color += material.specular * specular * czm_lightColor; + + return vec4(color, material.alpha); +} + +vec4 czm_private_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) +{ + float diffuse = czm_private_getLambertDiffuseOfMaterial(lightDirectionEC, material); + float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); + + vec3 ambient = vec3(0.0); + vec3 color = ambient + material.emission; + color += material.diffuse * diffuse * czm_lightColor; + color += material.specular * specular * czm_lightColor; + + return vec4(color, material.alpha); +} +`, czm_planeDistance = `/** + * Computes distance from a point to a plane. + * + * @name czm_planeDistance + * @glslFunction + * + * param {vec4} plane A Plane in Hessian Normal Form. See Plane.js + * param {vec3} point A point in the same space as the plane. + * returns {float} The distance from the point to the plane. + */ +float czm_planeDistance(vec4 plane, vec3 point) { + return (dot(plane.xyz, point) + plane.w); +} + +/** + * Computes distance from a point to a plane. + * + * @name czm_planeDistance + * @glslFunction + * + * param {vec3} planeNormal Normal for a plane in Hessian Normal Form. See Plane.js + * param {float} planeDistance Distance for a plane in Hessian Normal form. See Plane.js + * param {vec3} point A point in the same space as the plane. + * returns {float} The distance from the point to the plane. + */ +float czm_planeDistance(vec3 planeNormal, float planeDistance, vec3 point) { + return (dot(planeNormal, point) + planeDistance); +} +`, czm_pointAlongRay = `/** + * Computes the point along a ray at the given time. time can be positive, negative, or zero. + * + * @name czm_pointAlongRay + * @glslFunction + * + * @param {czm_ray} ray The ray to compute the point along. + * @param {float} time The time along the ray. + * + * @returns {vec3} The point along the ray at the given time. + * + * @example + * czm_ray ray = czm_ray(vec3(0.0), vec3(1.0, 0.0, 0.0)); // origin, direction + * vec3 v = czm_pointAlongRay(ray, 2.0); // (2.0, 0.0, 0.0) + */ +vec3 czm_pointAlongRay(czm_ray ray, float time) +{ + return ray.origin + (time * ray.direction); +} +`, czm_rayEllipsoidIntersectionInterval = `/** + * DOC_TBA + * + * @name czm_rayEllipsoidIntersectionInterval + * @glslFunction + */ +czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii) +{ + // ray and ellipsoid center in eye coordinates. radii in model coordinates. + vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; + vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; + + q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz; + + float q2 = dot(q, q); + float qw = dot(q, w); + + if (q2 > 1.0) // Outside ellipsoid. + { + if (qw >= 0.0) // Looking outward or tangent (0 intersections). + { + return czm_emptyRaySegment; + } + else // qw < 0.0. + { + float qw2 = qw * qw; + float difference = q2 - 1.0; // Positively valued. + float w2 = dot(w, w); + float product = w2 * difference; + + if (qw2 < product) // Imaginary roots (0 intersections). + { + return czm_emptyRaySegment; + } + else if (qw2 > product) // Distinct roots (2 intersections). + { + float discriminant = qw * qw - product; + float temp = -qw + sqrt(discriminant); // Avoid cancellation. + float root0 = temp / w2; + float root1 = difference / temp; + if (root0 < root1) + { + czm_raySegment i = czm_raySegment(root0, root1); + return i; + } + else + { + czm_raySegment i = czm_raySegment(root1, root0); + return i; + } + } + else // qw2 == product. Repeated roots (2 intersections). + { + float root = sqrt(difference / w2); + czm_raySegment i = czm_raySegment(root, root); + return i; + } + } + } + else if (q2 < 1.0) // Inside ellipsoid (2 intersections). + { + float difference = q2 - 1.0; // Negatively valued. + float w2 = dot(w, w); + float product = w2 * difference; // Negatively valued. + float discriminant = qw * qw - product; + float temp = -qw + sqrt(discriminant); // Positively valued. + czm_raySegment i = czm_raySegment(0.0, temp / w2); + return i; + } + else // q2 == 1.0. On ellipsoid. + { + if (qw < 0.0) // Looking inward. + { + float w2 = dot(w, w); + czm_raySegment i = czm_raySegment(0.0, -qw / w2); + return i; + } + else // qw >= 0.0. Looking outward or tangent. + { + return czm_emptyRaySegment; + } + } +} +`, czm_raySphereIntersectionInterval = `/** + * Compute the intersection interval of a ray with a sphere. + * + * @name czm_raySphereIntersectionInterval + * @glslFunction + * + * @param {czm_ray} ray The ray. + * @param {vec3} center The center of the sphere. + * @param {float} radius The radius of the sphere. + * @return {czm_raySegment} The intersection interval of the ray with the sphere. + */ +czm_raySegment czm_raySphereIntersectionInterval(czm_ray ray, vec3 center, float radius) +{ + vec3 o = ray.origin; + vec3 d = ray.direction; + + vec3 oc = o - center; + + float a = dot(d, d); + float b = 2.0 * dot(d, oc); + float c = dot(oc, oc) - (radius * radius); + + float det = (b * b) - (4.0 * a * c); + + if (det < 0.0) { + return czm_emptyRaySegment; + } + + float sqrtDet = sqrt(det); + + float t0 = (-b - sqrtDet) / (2.0 * a); + float t1 = (-b + sqrtDet) / (2.0 * a); + + czm_raySegment result = czm_raySegment(t0, t1); + return result; +} +`, czm_readDepth = `float czm_readDepth(sampler2D depthTexture, vec2 texCoords) +{ + return czm_reverseLogDepth(texture(depthTexture, texCoords).r); +} +`, czm_readNonPerspective = `/** + * Reads a value previously transformed with {@link czm_writeNonPerspective} + * by dividing it by \`w\`, the value used in the perspective divide. + * This function is intended to be called in a fragment shader to access a + * \`varying\` that should not be subject to perspective interpolation. + * For example, screen-space texture coordinates. The value should have been + * previously written in the vertex shader with a call to + * {@link czm_writeNonPerspective}. + * + * @name czm_readNonPerspective + * @glslFunction + * + * @param {float|vec2|vec3|vec4} value The non-perspective value to be read. + * @param {float} oneOverW One over the perspective divide value, \`w\`. Usually this is simply \`gl_FragCoord.w\`. + * @returns {float|vec2|vec3|vec4} The usable value. + */ +float czm_readNonPerspective(float value, float oneOverW) { + return value * oneOverW; +} + +vec2 czm_readNonPerspective(vec2 value, float oneOverW) { + return value * oneOverW; +} + +vec3 czm_readNonPerspective(vec3 value, float oneOverW) { + return value * oneOverW; +} + +vec4 czm_readNonPerspective(vec4 value, float oneOverW) { + return value * oneOverW; +} +`, czm_reverseLogDepth = `float czm_reverseLogDepth(float logZ) +{ +#ifdef LOG_DEPTH + float near = czm_currentFrustum.x; + float far = czm_currentFrustum.y; + float log2Depth = logZ * czm_log2FarDepthFromNearPlusOne; + float depthFromNear = pow(2.0, log2Depth) - 1.0; + return far * (1.0 - near / (depthFromNear + near)) / (far - near); +#endif + return logZ; +} +`, czm_round = `/** + * Round a floating point value. This function exists because round() doesn't + * exist in GLSL 1.00. + * + * @param {float|vec2|vec3|vec4} value The value to round + * @param {float|vec2|vec3|vec3} The rounded value. The type matches the input. + */ +float czm_round(float value) { + return floor(value + 0.5); +} + +vec2 czm_round(vec2 value) { + return floor(value + 0.5); +} + +vec3 czm_round(vec3 value) { + return floor(value + 0.5); +} + +vec4 czm_round(vec4 value) { + return floor(value + 0.5); +} +`, czm_saturation = `/** + * Adjusts the saturation of a color. + * + * @name czm_saturation + * @glslFunction + * + * @param {vec3} rgb The color. + * @param {float} adjustment The amount to adjust the saturation of the color. + * + * @returns {float} The color with the saturation adjusted. + * + * @example + * vec3 greyScale = czm_saturation(color, 0.0); + * vec3 doubleSaturation = czm_saturation(color, 2.0); + */ +vec3 czm_saturation(vec3 rgb, float adjustment) +{ + // Algorithm from Chapter 16 of OpenGL Shading Language + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + vec3 intensity = vec3(dot(rgb, W)); + return mix(intensity, rgb, adjustment); +} +`, czm_shadowDepthCompare = ` +float czm_sampleShadowMap(highp samplerCube shadowMap, vec3 d) +{ + return czm_unpackDepth(czm_textureCube(shadowMap, d)); +} + +float czm_sampleShadowMap(highp sampler2D shadowMap, vec2 uv) +{ +#ifdef USE_SHADOW_DEPTH_TEXTURE + return texture(shadowMap, uv).r; +#else + return czm_unpackDepth(texture(shadowMap, uv)); +#endif +} + +float czm_shadowDepthCompare(samplerCube shadowMap, vec3 uv, float depth) +{ + return step(depth, czm_sampleShadowMap(shadowMap, uv)); +} + +float czm_shadowDepthCompare(sampler2D shadowMap, vec2 uv, float depth) +{ + return step(depth, czm_sampleShadowMap(shadowMap, uv)); +} +`, czm_shadowVisibility = ` +float czm_private_shadowVisibility(float visibility, float nDotL, float normalShadingSmooth, float darkness) +{ +#ifdef USE_NORMAL_SHADING +#ifdef USE_NORMAL_SHADING_SMOOTH + float strength = clamp(nDotL / normalShadingSmooth, 0.0, 1.0); +#else + float strength = step(0.0, nDotL); +#endif + visibility *= strength; +#endif + + visibility = max(visibility, darkness); + return visibility; +} + +#ifdef USE_CUBE_MAP_SHADOW +float czm_shadowVisibility(samplerCube shadowMap, czm_shadowParameters shadowParameters) +{ + float depthBias = shadowParameters.depthBias; + float depth = shadowParameters.depth; + float nDotL = shadowParameters.nDotL; + float normalShadingSmooth = shadowParameters.normalShadingSmooth; + float darkness = shadowParameters.darkness; + vec3 uvw = shadowParameters.texCoords; + + depth -= depthBias; + float visibility = czm_shadowDepthCompare(shadowMap, uvw, depth); + return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); +} +#else +float czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters) +{ + float depthBias = shadowParameters.depthBias; + float depth = shadowParameters.depth; + float nDotL = shadowParameters.nDotL; + float normalShadingSmooth = shadowParameters.normalShadingSmooth; + float darkness = shadowParameters.darkness; + vec2 uv = shadowParameters.texCoords; + + depth -= depthBias; +#ifdef USE_SOFT_SHADOWS + vec2 texelStepSize = shadowParameters.texelStepSize; + float radius = 1.0; + float dx0 = -texelStepSize.x * radius; + float dy0 = -texelStepSize.y * radius; + float dx1 = texelStepSize.x * radius; + float dy1 = texelStepSize.y * radius; + float visibility = ( + czm_shadowDepthCompare(shadowMap, uv, depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) + + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth) + ) * (1.0 / 9.0); +#else + float visibility = czm_shadowDepthCompare(shadowMap, uv, depth); +#endif + + return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); +} +#endif +`, czm_signNotZero = `/** + * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative. This is similar to the GLSL + * built-in function sign except that returns 1.0 instead of 0.0 when the input value is 0.0. + * + * @name czm_signNotZero + * @glslFunction + * + * @param {} value The value for which to determine the sign. + * @returns {} 1.0 if the value is positive or zero, -1.0 if the value is negative. + */ +float czm_signNotZero(float value) +{ + return value >= 0.0 ? 1.0 : -1.0; +} + +vec2 czm_signNotZero(vec2 value) +{ + return vec2(czm_signNotZero(value.x), czm_signNotZero(value.y)); +} + +vec3 czm_signNotZero(vec3 value) +{ + return vec3(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z)); +} + +vec4 czm_signNotZero(vec4 value) +{ + return vec4(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z), czm_signNotZero(value.w)); +} +`, czm_sphericalHarmonics = `/** + * Computes a color from the third order spherical harmonic coefficients and a normalized direction vector. + *

+ * The order of the coefficients is [L00, L1_1, L10, L11, L2_2, L2_1, L20, L21, L22]. + *

+ * + * @name czm_sphericalHarmonics + * @glslFunction + * + * @param {vec3} normal The normalized direction. + * @param {vec3[9]} coefficients The third order spherical harmonic coefficients. + * @returns {vec3} The color at the direction. + * + * @see https://graphics.stanford.edu/papers/envmap/envmap.pdf + */ +vec3 czm_sphericalHarmonics(vec3 normal, vec3 coefficients[9]) +{ + vec3 L00 = coefficients[0]; + vec3 L1_1 = coefficients[1]; + vec3 L10 = coefficients[2]; + vec3 L11 = coefficients[3]; + vec3 L2_2 = coefficients[4]; + vec3 L2_1 = coefficients[5]; + vec3 L20 = coefficients[6]; + vec3 L21 = coefficients[7]; + vec3 L22 = coefficients[8]; + + float x = normal.x; + float y = normal.y; + float z = normal.z; + + return + L00 + + L1_1 * y + + L10 * z + + L11 * x + + L2_2 * (y * x) + + L2_1 * (y * z) + + L20 * (3.0 * z * z - 1.0) + + L21 * (z * x) + + L22 * (x * x - y * y); +} +`, czm_srgbToLinear = `/** + * Converts an sRGB color to a linear RGB color. + * + * @param {vec3|vec4} srgbIn The color in sRGB space + * @returns {vec3|vec4} The color in linear color space. The vector type matches the input. + */ +vec3 czm_srgbToLinear(vec3 srgbIn) +{ + return pow(srgbIn, vec3(2.2)); +} + +vec4 czm_srgbToLinear(vec4 srgbIn) +{ + vec3 linearOut = pow(srgbIn.rgb, vec3(2.2)); + return vec4(linearOut, srgbIn.a); +} +`, czm_tangentToEyeSpaceMatrix = `/** + * Creates a matrix that transforms vectors from tangent space to eye space. + * + * @name czm_tangentToEyeSpaceMatrix + * @glslFunction + * + * @param {vec3} normalEC The normal vector in eye coordinates. + * @param {vec3} tangentEC The tangent vector in eye coordinates. + * @param {vec3} bitangentEC The bitangent vector in eye coordinates. + * + * @returns {mat3} The matrix that transforms from tangent space to eye space. + * + * @example + * mat3 tangentToEye = czm_tangentToEyeSpaceMatrix(normalEC, tangentEC, bitangentEC); + * vec3 normal = tangentToEye * texture(normalMap, st).xyz; + */ +mat3 czm_tangentToEyeSpaceMatrix(vec3 normalEC, vec3 tangentEC, vec3 bitangentEC) +{ + vec3 normal = normalize(normalEC); + vec3 tangent = normalize(tangentEC); + vec3 bitangent = normalize(bitangentEC); + return mat3(tangent.x , tangent.y , tangent.z, + bitangent.x, bitangent.y, bitangent.z, + normal.x , normal.y , normal.z); +} +`, czm_textureCube = `/** + * A wrapper around the texture (WebGL2) / textureCube (WebGL1) + * function to allow for WebGL 1 support. + * + * @name czm_textureCube + * @glslFunction + * + * @param {samplerCube} sampler The sampler. + * @param {vec3} p The coordinate at which to sample the texture. + */ +vec4 czm_textureCube(samplerCube sampler, vec3 p) { +#if __VERSION__ == 300 + return texture(sampler, p); +#else + return textureCube(sampler, p); +#endif +} + +/** + * A wrapper around the textureLod (WebGL2) / textureCube (WebGL1) + * function to allow for WebGL 1 support in fragment shaders. + * + * @name czm_textureCubeLod + * @glslFunction + * + * @param {samplerCube} sampler The sampler. + * @param {vec3} p The coordinate at which to sample the texture. + * @param {float} lod The mipmap level from which to sample. + */ +vec4 czm_textureCube(samplerCube sampler, vec3 p, float lod) { +#if __VERSION__ == 300 + return textureLod(sampler, p, lod); +#elif defined(GL_EXT_shader_texture_lod) + return textureCubeLodEXT(sampler, p, lod); +#endif +}`, czm_transformPlane = `/** + * Transforms a plane. + * + * @name czm_transformPlane + * @glslFunction + * + * @param {vec4} plane The plane in Hessian Normal Form. + * @param {mat4} transform The inverse-transpose of a transformation matrix. + */ +vec4 czm_transformPlane(vec4 plane, mat4 transform) { + vec4 transformedPlane = transform * plane; + // Convert the transformed plane to Hessian Normal Form + float normalMagnitude = length(transformedPlane.xyz); + return transformedPlane / normalMagnitude; +} +`, czm_translateRelativeToEye = `/** + * Translates a position (or any vec3) that was encoded with {@link EncodedCartesian3}, + * and then provided to the shader as separate high and low bits to + * be relative to the eye. As shown in the example, the position can then be transformed in eye + * or clip coordinates using {@link czm_modelViewRelativeToEye} or {@link czm_modelViewProjectionRelativeToEye}, + * respectively. + *

+ * This technique, called GPU RTE, eliminates jittering artifacts when using large coordinates as + * described in {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}. + *

+ * + * @name czm_translateRelativeToEye + * @glslFunction + * + * @param {vec3} high The position's high bits. + * @param {vec3} low The position's low bits. + * @returns {vec3} The position translated to be relative to the camera's position. + * + * @example + * in vec3 positionHigh; + * in vec3 positionLow; + * + * void main() + * { + * vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + * gl_Position = czm_modelViewProjectionRelativeToEye * p; + * } + * + * @see czm_modelViewRelativeToEye + * @see czm_modelViewProjectionRelativeToEye + * @see czm_computePosition + * @see EncodedCartesian3 + */ +vec4 czm_translateRelativeToEye(vec3 high, vec3 low) +{ + vec3 highDifference = high - czm_encodedCameraPositionMCHigh; + // This check handles the case when NaN values have gotten into \`highDifference\`. + // Such a thing could happen on devices running iOS. + if (length(highDifference) == 0.0) { + highDifference = vec3(0); + } + vec3 lowDifference = low - czm_encodedCameraPositionMCLow; + + return vec4(highDifference + lowDifference, 1.0); +} +`, czm_translucentPhong = `/** + * @private + */ +vec4 czm_translucentPhong(vec3 toEye, czm_material material, vec3 lightDirectionEC) +{ + // Diffuse from directional light sources at eye (for top-down and horizon views) + float diffuse = czm_getLambertDiffuse(vec3(0.0, 0.0, 1.0), material.normal); + + if (czm_sceneMode == czm_sceneMode3D) { + // (and horizon views in 3D) + diffuse += czm_getLambertDiffuse(vec3(0.0, 1.0, 0.0), material.normal); + } + + diffuse = clamp(diffuse, 0.0, 1.0); + + float specular = czm_getSpecular(lightDirectionEC, toEye, material.normal, material.shininess); + + // Temporary workaround for adding ambient. + vec3 materialDiffuse = material.diffuse * 0.5; + + vec3 ambient = materialDiffuse; + vec3 color = ambient + material.emission; + color += materialDiffuse * diffuse * czm_lightColor; + color += material.specular * specular * czm_lightColor; + + return vec4(color, material.alpha); +} +`, czm_transpose = `/** + * Returns the transpose of the matrix. The input matrix can be + * a mat2, mat3, or mat4. + * + * @name czm_transpose + * @glslFunction + * + * @param {} matrix The matrix to transpose. + * + * @returns {} The transposed matrix. + * + * @example + * // GLSL declarations + * mat2 czm_transpose(mat2 matrix); + * mat3 czm_transpose(mat3 matrix); + * mat4 czm_transpose(mat4 matrix); + * + * // Transpose a 3x3 rotation matrix to find its inverse. + * mat3 eastNorthUpToEye = czm_eastNorthUpToEyeCoordinates( + * positionMC, normalEC); + * mat3 eyeToEastNorthUp = czm_transpose(eastNorthUpToEye); + */ +mat2 czm_transpose(mat2 matrix) +{ + return mat2( + matrix[0][0], matrix[1][0], + matrix[0][1], matrix[1][1]); +} + +mat3 czm_transpose(mat3 matrix) +{ + return mat3( + matrix[0][0], matrix[1][0], matrix[2][0], + matrix[0][1], matrix[1][1], matrix[2][1], + matrix[0][2], matrix[1][2], matrix[2][2]); +} + +mat4 czm_transpose(mat4 matrix) +{ + return mat4( + matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0], + matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1], + matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2], + matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]); +} +`, czm_unpackClippingExtents = `vec2 getLookupUv(vec2 dimensions, int i) { + int pixY = i / int(dimensions.x); + int pixX = i - (pixY * int(dimensions.x)); + float pixelWidth = 1.0 / dimensions.x; + float pixelHeight = 1.0 / dimensions.y; + float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel + float v = (float(pixY) + 0.5) * pixelHeight; + return vec2(u, v); +} + +vec4 czm_unpackClippingExtents(highp sampler2D extentsTexture, int index) { + vec2 textureDimensions = vec2(textureSize(extentsTexture, 0)); + return texture(extentsTexture, getLookupUv(textureDimensions, index)); +}`, czm_unpackDepth = `/** + * Unpacks a vec4 depth value to a float in [0, 1) range. + * + * @name czm_unpackDepth + * @glslFunction + * + * @param {vec4} packedDepth The packed depth. + * + * @returns {float} The floating-point depth in [0, 1) range. + */ + float czm_unpackDepth(vec4 packedDepth) + { + // See Aras Pranckevičius' post Encoding Floats to RGBA + // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ + return dot(packedDepth, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)); + } +`, czm_unpackFloat = `/** + * Unpack an IEEE 754 single-precision float that is packed as a little-endian unsigned normalized vec4. + * + * @name czm_unpackFloat + * @glslFunction + * + * @param {vec4} packedFloat The packed float. + * + * @returns {float} The floating-point depth in arbitrary range. + */ +float czm_unpackFloat(vec4 packedFloat) +{ + // Convert to [0.0, 255.0] and round to integer + packedFloat = floor(packedFloat * 255.0 + 0.5); + float sign = 1.0 - step(128.0, packedFloat[3]) * 2.0; + float exponent = 2.0 * mod(packedFloat[3], 128.0) + step(128.0, packedFloat[2]) - 127.0; + if (exponent == -127.0) + { + return 0.0; + } + float mantissa = mod(packedFloat[2], 128.0) * 65536.0 + packedFloat[1] * 256.0 + packedFloat[0] + float(0x800000); + float result = sign * exp2(exponent - 23.0) * mantissa; + return result; +} +`, czm_unpackUint = `/** + * Unpack unsigned integers of 1-4 bytes. in WebGL 1, there is no uint type, + * so the return value is an int. + *

+ * There are also precision limitations in WebGL 1. highp int is still limited + * to 24 bits. Above the value of 2^24 = 16777216, precision loss may occur. + *

+ * + * @param {float|vec2|vec3|vec4} packed The packed value. For vectors, the components are listed in little-endian order. + * + * @return {int} The unpacked value. + */ + int czm_unpackUint(float packedValue) { + float rounded = czm_round(packedValue * 255.0); + return int(rounded); + } + + int czm_unpackUint(vec2 packedValue) { + vec2 rounded = czm_round(packedValue * 255.0); + return int(dot(rounded, vec2(1.0, 256.0))); + } + + int czm_unpackUint(vec3 packedValue) { + vec3 rounded = czm_round(packedValue * 255.0); + return int(dot(rounded, vec3(1.0, 256.0, 65536.0))); + } + + int czm_unpackUint(vec4 packedValue) { + vec4 rounded = czm_round(packedValue * 255.0); + return int(dot(rounded, vec4(1.0, 256.0, 65536.0, 16777216.0))); + } +`, czm_valueTransform = `/** + * Transform metadata values following the EXT_structural_metadata spec + * by multiplying by scale and adding the offset. Operations are always + * performed component-wise, even for matrices. + * + * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} offset The offset to add + * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} scale The scale factor to multiply + * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} value The original value. + * + * @return {float|vec2|vec3|vec4|mat2|mat3|mat4} The transformed value of the same scalar/vector/matrix type as the input. + */ +float czm_valueTransform(float offset, float scale, float value) { + return scale * value + offset; +} + +vec2 czm_valueTransform(vec2 offset, vec2 scale, vec2 value) { + return scale * value + offset; +} + +vec3 czm_valueTransform(vec3 offset, vec3 scale, vec3 value) { + return scale * value + offset; +} + +vec4 czm_valueTransform(vec4 offset, vec4 scale, vec4 value) { + return scale * value + offset; +} + +mat2 czm_valueTransform(mat2 offset, mat2 scale, mat2 value) { + return matrixCompMult(scale, value) + offset; +} + +mat3 czm_valueTransform(mat3 offset, mat3 scale, mat3 value) { + return matrixCompMult(scale, value) + offset; +} + +mat4 czm_valueTransform(mat4 offset, mat4 scale, mat4 value) { + return matrixCompMult(scale, value) + offset; +} +`, czm_vertexLogDepth = `#ifdef LOG_DEPTH +// 1.0 at the near plane, increasing linearly from there. +out float v_depthFromNearPlusOne; +#ifdef SHADOW_MAP +out vec3 v_logPositionEC; +#endif +#endif + +vec4 czm_updatePositionDepth(vec4 coords) { +#if defined(LOG_DEPTH) + +#ifdef SHADOW_MAP + vec3 logPositionEC = (czm_inverseProjection * coords).xyz; + v_logPositionEC = logPositionEC; +#endif + + // With the very high far/near ratios used with the logarithmic depth + // buffer, floating point rounding errors can cause linear depth values + // to end up on the wrong side of the far plane, even for vertices that + // are really nowhere near it. Since we always write a correct logarithmic + // depth value in the fragment shader anyway, we just need to make sure + // such errors don't cause the primitive to be clipped entirely before + // we even get to the fragment shader. + coords.z = clamp(coords.z / coords.w, -1.0, 1.0) * coords.w; +#endif + + return coords; +} + +/** + * Writes the logarithmic depth to gl_Position using the already computed gl_Position. + * + * @name czm_vertexLogDepth + * @glslFunction + */ +void czm_vertexLogDepth() +{ +#ifdef LOG_DEPTH + v_depthFromNearPlusOne = (gl_Position.w - czm_currentFrustum.x) + 1.0; + gl_Position = czm_updatePositionDepth(gl_Position); +#endif +} + +/** + * Writes the logarithmic depth to gl_Position using the provided clip coordinates. + *

+ * An example use case for this function would be moving the vertex in window coordinates + * before converting back to clip coordinates. Use the original vertex clip coordinates. + *

+ * @name czm_vertexLogDepth + * @glslFunction + * + * @param {vec4} clipCoords The vertex in clip coordinates. + * + * @example + * czm_vertexLogDepth(czm_projection * vec4(positionEyeCoordinates, 1.0)); + */ +void czm_vertexLogDepth(vec4 clipCoords) +{ +#ifdef LOG_DEPTH + v_depthFromNearPlusOne = (clipCoords.w - czm_currentFrustum.x) + 1.0; + czm_updatePositionDepth(clipCoords); +#endif +} +`, czm_windowToEyeCoordinates = `vec4 czm_screenToEyeCoordinates(vec4 screenCoordinate) +{ + // Reconstruct NDC coordinates + float x = 2.0 * screenCoordinate.x - 1.0; + float y = 2.0 * screenCoordinate.y - 1.0; + float z = (screenCoordinate.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2]; + vec4 q = vec4(x, y, z, 1.0); + + // Reverse the perspective division to obtain clip coordinates. + q /= screenCoordinate.w; + + // Reverse the projection transformation to obtain eye coordinates. + if (!(czm_inverseProjection == mat4(0.0))) // IE and Edge sometimes do something weird with != between mat4s + { + q = czm_inverseProjection * q; + } + else + { + float top = czm_frustumPlanes.x; + float bottom = czm_frustumPlanes.y; + float left = czm_frustumPlanes.z; + float right = czm_frustumPlanes.w; + + float near = czm_currentFrustum.x; + float far = czm_currentFrustum.y; + + q.x = (q.x * (right - left) + left + right) * 0.5; + q.y = (q.y * (top - bottom) + bottom + top) * 0.5; + q.z = (q.z * (near - far) - near - far) * 0.5; + q.w = 1.0; + } + + return q; +} + +/** + * Transforms a position from window to eye coordinates. + * The transform from window to normalized device coordinates is done using components + * of (@link czm_viewport} and {@link czm_viewportTransformation} instead of calculating + * the inverse of czm_viewportTransformation. The transformation from + * normalized device coordinates to clip coordinates is done using fragmentCoordinate.w, + * which is expected to be the scalar used in the perspective divide. The transformation + * from clip to eye coordinates is done using {@link czm_inverseProjection}. + * + * @name czm_windowToEyeCoordinates + * @glslFunction + * + * @param {vec4} fragmentCoordinate The position in window coordinates to transform. + * + * @returns {vec4} The transformed position in eye coordinates. + * + * @see czm_modelToWindowCoordinates + * @see czm_eyeToWindowCoordinates + * @see czm_inverseProjection + * @see czm_viewport + * @see czm_viewportTransformation + * + * @example + * vec4 positionEC = czm_windowToEyeCoordinates(gl_FragCoord); + */ +vec4 czm_windowToEyeCoordinates(vec4 fragmentCoordinate) +{ + vec2 screenCoordXY = (fragmentCoordinate.xy - czm_viewport.xy) / czm_viewport.zw; + return czm_screenToEyeCoordinates(vec4(screenCoordXY, fragmentCoordinate.zw)); +} + +vec4 czm_screenToEyeCoordinates(vec2 screenCoordinateXY, float depthOrLogDepth) +{ + // See reverseLogDepth.glsl. This is separate to re-use the pow. +#if defined(LOG_DEPTH) || defined(LOG_DEPTH_READ_ONLY) + float near = czm_currentFrustum.x; + float far = czm_currentFrustum.y; + float log2Depth = depthOrLogDepth * czm_log2FarDepthFromNearPlusOne; + float depthFromNear = pow(2.0, log2Depth) - 1.0; + float depthFromCamera = depthFromNear + near; + vec4 screenCoord = vec4(screenCoordinateXY, far * (1.0 - near / depthFromCamera) / (far - near), 1.0); + vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); + eyeCoordinate.w = 1.0 / depthFromCamera; // Better precision + return eyeCoordinate; +#else + vec4 screenCoord = vec4(screenCoordinateXY, depthOrLogDepth, 1.0); + vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); +#endif + return eyeCoordinate; +} + +/** + * Transforms a position given as window x/y and a depth or a log depth from window to eye coordinates. + * This function produces more accurate results for window positions with log depth than + * conventionally unpacking the log depth using czm_reverseLogDepth and using the standard version + * of czm_windowToEyeCoordinates. + * + * @name czm_windowToEyeCoordinates + * @glslFunction + * + * @param {vec2} fragmentCoordinateXY The XY position in window coordinates to transform. + * @param {float} depthOrLogDepth A depth or log depth for the fragment. + * + * @see czm_modelToWindowCoordinates + * @see czm_eyeToWindowCoordinates + * @see czm_inverseProjection + * @see czm_viewport + * @see czm_viewportTransformation + * + * @returns {vec4} The transformed position in eye coordinates. + */ +vec4 czm_windowToEyeCoordinates(vec2 fragmentCoordinateXY, float depthOrLogDepth) +{ + vec2 screenCoordXY = (fragmentCoordinateXY.xy - czm_viewport.xy) / czm_viewport.zw; + return czm_screenToEyeCoordinates(screenCoordXY, depthOrLogDepth); +} +`, czm_writeDepthClamp = `// emulated noperspective +#if !defined(LOG_DEPTH) +in float v_WindowZ; +#endif + +/** + * Emulates GL_DEPTH_CLAMP. Clamps a fragment to the near and far plane + * by writing the fragment's depth. See czm_depthClamp for more details. + * + * @name czm_writeDepthClamp + * @glslFunction + * + * @example + * out_FragColor = color; + * czm_writeDepthClamp(); + * + * @see czm_depthClamp + */ +void czm_writeDepthClamp() +{ +#if (!defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) + gl_FragDepth = clamp(v_WindowZ * gl_FragCoord.w, 0.0, 1.0); +#endif +} +`, czm_writeLogDepth = `#ifdef LOG_DEPTH +in float v_depthFromNearPlusOne; + +#ifdef POLYGON_OFFSET +uniform vec2 u_polygonOffset; +#endif + +#endif + +/** + * Writes the fragment depth to the logarithmic depth buffer. + *

+ * Use this when the vertex shader does not call {@link czm_vertexlogDepth}, for example, when + * ray-casting geometry using a full screen quad. + *

+ * @name czm_writeLogDepth + * @glslFunction + * + * @param {float} depth The depth coordinate, where 1.0 is on the near plane and + * depth increases in eye-space units from there + * + * @example + * czm_writeLogDepth((czm_projection * v_positionEyeCoordinates).w + 1.0); + */ +void czm_writeLogDepth(float depth) +{ +#if (defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) + // Discard the vertex if it's not between the near and far planes. + // We allow a bit of epsilon on the near plane comparison because a 1.0 + // from the vertex shader (indicating the vertex should be _on_ the near + // plane) will not necessarily come here as exactly 1.0. + if (depth <= 0.9999999 || depth > czm_farDepthFromNearPlusOne) { + discard; + } + +#ifdef POLYGON_OFFSET + // Polygon offset: m * factor + r * units + float factor = u_polygonOffset[0]; + float units = u_polygonOffset[1]; + +#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) + // This factor doesn't work in IE 10 + if (factor != 0.0) { + // m = sqrt(dZdX^2 + dZdY^2); + float x = dFdx(depth); + float y = dFdy(depth); + float m = sqrt(x * x + y * y); + + // Apply the factor before computing the log depth. + depth += m * factor; + } +#endif + +#endif + + gl_FragDepth = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne; + +#ifdef POLYGON_OFFSET + // Apply the units after the log depth. + gl_FragDepth += czm_epsilon7 * units; +#endif + +#endif +} + +/** + * Writes the fragment depth to the logarithmic depth buffer. + *

+ * Use this when the vertex shader calls {@link czm_vertexlogDepth}. + *

+ * + * @name czm_writeLogDepth + * @glslFunction + */ +void czm_writeLogDepth() { +#ifdef LOG_DEPTH + czm_writeLogDepth(v_depthFromNearPlusOne); +#endif +} +`, czm_writeNonPerspective = `/** + * Transforms a value for non-perspective interpolation by multiplying + * it by w, the value used in the perspective divide. This function is + * intended to be called in a vertex shader to compute the value of a + * \`varying\` that should not be subject to perspective interpolation. + * For example, screen-space texture coordinates. The fragment shader + * must call {@link czm_readNonPerspective} to retrieve the final + * non-perspective value. + * + * @name czm_writeNonPerspective + * @glslFunction + * + * @param {float|vec2|vec3|vec4} value The value to be interpolated without accounting for perspective. + * @param {float} w The perspective divide value. Usually this is the computed \`gl_Position.w\`. + * @returns {float|vec2|vec3|vec4} The transformed value, intended to be stored in a \`varying\` and read in the + * fragment shader with {@link czm_readNonPerspective}. + */ +float czm_writeNonPerspective(float value, float w) { + return value * w; +} + +vec2 czm_writeNonPerspective(vec2 value, float w) { + return value * w; +} + +vec3 czm_writeNonPerspective(vec3 value, float w) { + return value * w; +} + +vec4 czm_writeNonPerspective(vec4 value, float w) { + return value * w; +} +`, CzmBuiltins = { + czm_degreesPerRadian, + czm_depthRange, + czm_epsilon1, + czm_epsilon2, + czm_epsilon3, + czm_epsilon4, + czm_epsilon5, + czm_epsilon6, + czm_epsilon7, + czm_infinity, + czm_oneOverPi, + czm_oneOverTwoPi, + czm_passCesium3DTile, + czm_passCesium3DTileClassification, + czm_passCesium3DTileClassificationIgnoreShow, + czm_passClassification, + czm_passCompute, + czm_passEnvironment, + czm_passGlobe, + czm_passOpaque, + czm_passOverlay, + czm_passTerrainClassification, + czm_passTranslucent, + czm_passVoxels, + czm_pi, + czm_piOverFour, + czm_piOverSix, + czm_piOverThree, + czm_piOverTwo, + czm_radiansPerDegree, + czm_sceneMode2D, + czm_sceneMode3D, + czm_sceneModeColumbusView, + czm_sceneModeMorphing, + czm_solarRadius, + czm_threePiOver2, + czm_twoPi, + czm_webMercatorMaxLatitude, + czm_depthRangeStruct, + czm_material, + czm_materialInput, + czm_modelMaterial, + czm_modelVertexOutput, + czm_ray, + czm_raySegment, + czm_shadowParameters, + czm_HSBToRGB, + czm_HSLToRGB, + czm_RGBToHSB, + czm_RGBToHSL, + czm_RGBToXYZ, + czm_XYZToRGB, + czm_acesTonemapping, + czm_alphaWeight, + czm_antialias, + czm_applyHSBShift, + czm_approximateSphericalCoordinates, + czm_approximateTanh, + czm_backFacing, + czm_branchFreeTernary, + czm_cascadeColor, + czm_cascadeDistance, + czm_cascadeMatrix, + czm_cascadeWeights, + czm_clipPolygons, + czm_columbusViewMorph, + czm_computeAtmosphereColor, + czm_computeGroundAtmosphereScattering, + czm_computePosition, + czm_computeScattering, + czm_cosineAndSine, + czm_decompressTextureCoordinates, + czm_depthClamp, + czm_eastNorthUpToEyeCoordinates, + czm_ellipsoidContainsPoint, + czm_ellipsoidTextureCoordinates, + czm_equalsEpsilon, + czm_eyeOffset, + czm_eyeToWindowCoordinates, + czm_fastApproximateAtan, + czm_fog, + czm_gammaCorrect, + czm_geodeticSurfaceNormal, + czm_getDefaultMaterial, + czm_getDynamicAtmosphereLightDirection, + czm_getLambertDiffuse, + czm_getSpecular, + czm_getWaterNoise, + czm_hue, + czm_inverseGamma, + czm_isEmpty, + czm_isFull, + czm_latitudeToWebMercatorFraction, + czm_lineDistance, + czm_linearToSrgb, + czm_luminance, + czm_maximumComponent, + czm_metersPerPixel, + czm_modelToWindowCoordinates, + czm_multiplyWithColorBalance, + czm_nearFarScalar, + czm_octDecode, + czm_packDepth, + czm_pbrLighting, + czm_pbrNeutralTonemapping, + czm_phong, + czm_planeDistance, + czm_pointAlongRay, + czm_rayEllipsoidIntersectionInterval, + czm_raySphereIntersectionInterval, + czm_readDepth, + czm_readNonPerspective, + czm_reverseLogDepth, + czm_round, + czm_saturation, + czm_shadowDepthCompare, + czm_shadowVisibility, + czm_signNotZero, + czm_sphericalHarmonics, + czm_srgbToLinear, + czm_tangentToEyeSpaceMatrix, + czm_textureCube, + czm_transformPlane, + czm_translateRelativeToEye, + czm_translucentPhong, + czm_transpose, + czm_unpackClippingExtents, + czm_unpackDepth, + czm_unpackFloat, + czm_unpackUint, + czm_valueTransform, + czm_vertexLogDepth, + czm_windowToEyeCoordinates, + czm_writeDepthClamp, + czm_writeLogDepth, + czm_writeNonPerspective +}; +function demodernizeShader(e, t) { + let n = e; + return n = n.replaceAll("version 300 es", ""), n = n.replaceAll( + /(texture\()/g, + "texture2D(" + // Trailing ')' is included in the match group. + ), t ? (n = n.replaceAll( + /\n\s*(in)\s+(vec\d|mat\d|float)/g, + ` +varying $2` + ), /out_FragData_(\d+)/.test(n) && (n = `#extension GL_EXT_draw_buffers : enable +${n}`, n = n.replaceAll( + /layout\s+\(location\s*=\s*\d+\)\s*out\s+vec4\s+out_FragData_\d+;/g, + "" + ), n = n.replaceAll(/out_FragData_(\d+)/g, "gl_FragData[$1]")), n = n.replaceAll( + /layout\s+\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g, + "" + ), n = n.replaceAll(/out_FragColor/g, "gl_FragColor"), n = n.replaceAll(/out_FragColor\[(\d+)\]/g, "gl_FragColor[$1]"), /gl_FragDepth/.test(n) && (n = `#extension GL_EXT_frag_depth : enable +${n}`, n = n.replaceAll(/gl_FragDepth/g, "gl_FragDepthEXT")), n = `#ifdef GL_EXT_shader_texture_lod +#extension GL_EXT_shader_texture_lod : enable +#endif +${n}`, n = `#ifdef GL_OES_standard_derivatives +#extension GL_OES_standard_derivatives : enable +#endif +${n}`) : (n = n.replaceAll(/(in)\s+(vec\d|mat\d|float)/g, "attribute $2"), n = n.replaceAll( + /(out)\s+(vec\d|mat\d|float)\s+([\w]+);/g, + "varying $2 $3;" + )), n = `#version 100 +${n}`, n; +} +function removeComments(e) { + return e = e.replace(/\/\/.*/g, ""), e.replace(/\/\*\*[\s\S]*?\*\//gm, function(t) { + const n = t.match(/\n/gm).length; + let i = ""; + for (let r = 0; r < n; ++r) + i += ` +`; + return i; + }); +} +function getDependencyNode(e, t, n) { + let i; + for (let r = 0; r < n.length; ++r) + n[r].name === e && (i = n[r]); + return defined(i) || (t = removeComments(t), i = { + name: e, + glslSource: t, + dependsOn: [], + requiredBy: [], + evaluated: !1 + }, n.push(i)), i; +} +function generateDependencies(e, t) { + if (e.evaluated) + return; + e.evaluated = !0; + let n = e.glslSource.match(/\bczm_[a-zA-Z0-9_]*/g); + defined(n) && n !== null && (n = n.filter(function(i, r) { + return n.indexOf(i) === r; + }), n.forEach(function(i) { + if (i !== e.name && ShaderSource._czmBuiltinsAndUniforms.hasOwnProperty(i)) { + const r = getDependencyNode( + i, + ShaderSource._czmBuiltinsAndUniforms[i], + t + ); + e.dependsOn.push(r), r.requiredBy.push(e), generateDependencies(r, t); + } + })); +} +function sortDependencies(e) { + const t = [], n = []; + for (; e.length > 0; ) { + const i = e.pop(); + n.push(i), i.requiredBy.length === 0 && t.push(i); + } + for (; t.length > 0; ) { + const i = t.shift(); + e.push(i); + for (let r = 0; r < i.dependsOn.length; ++r) { + const o = i.dependsOn[r], s = o.requiredBy.indexOf(i); + o.requiredBy.splice(s, 1), o.requiredBy.length === 0 && t.push(o); + } + } + for (let i = 0; i < n.length; ++i) + n[i].requiredBy.length; +} +function getBuiltinsAndAutomaticUniforms(e) { + const t = [], n = getDependencyNode("main", e, t); + generateDependencies(n, t), sortDependencies(t); + let i = ""; + for (let r = t.length - 1; r >= 0; --r) + i = `${i + t[r].glslSource} +`; + return i.replace(n.glslSource, ""); +} +function combineShader(e, t, n) { + let i, r, o = ""; + const s = e.sources; + if (defined(s)) + for (i = 0, r = s.length; i < r; ++i) + o += ` +#line 0 +${s[i]}`; + o = removeComments(o), o = o.replace(/#version\s+(.*?)\n/gm, function(_, y) { + return ` +`; + }); + const c = []; + o = o.replace(/#extension.*\n/gm, function(_) { + return c.push(_), ` +`; + }), o = o.replace( + /precision\s(lowp|mediump|highp)\s(float|int);/, + "" + ); + const l = e.pickColorQualifier; + defined(l) && (o = ShaderSource.createPickFragmentShaderSource( + o, + l + )); + let d = ""; + const f = c.length; + for (i = 0; i < f; i++) + d += c[i]; + t && (d += `#ifdef GL_FRAGMENT_PRECISION_HIGH + precision highp float; + precision highp int; +#else + precision mediump float; + precision mediump int; + #define highp mediump +#endif + +`); + const h = e.defines; + if (defined(h)) + for (i = 0, r = h.length; i < r; ++i) { + const _ = h[i]; + _.length !== 0 && (d += `#define ${_} +`); + } + n.textureFloatLinear && (d += `#define OES_texture_float_linear + +`), n.floatingPointTexture && (d += `#define OES_texture_float + +`); + let p = ""; + e.includeBuiltIns && (p = getBuiltinsAndAutomaticUniforms(o)), d += ` +#line 0 +`; + const m = p + o; + return n.webgl2 && t && !/layout\s*\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g.test( + m + ) && !/czm_out_FragColor/g.test(m) && /out_FragColor/g.test(m) && (d += `layout(location = 0) out vec4 out_FragColor; + +`), d += p, d += o, n.webgl2 ? d = `#version 300 es +${d}` : d = demodernizeShader(d, t), d; +} +function ShaderSource(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.pickColorQualifier; + this.defines = defined(e.defines) ? e.defines.slice(0) : [], this.sources = defined(e.sources) ? e.sources.slice(0) : [], this.pickColorQualifier = t, this.includeBuiltIns = defaultValue(e.includeBuiltIns, !0); +} +ShaderSource.prototype.clone = function() { + return new ShaderSource({ + sources: this.sources, + defines: this.defines, + pickColorQualifier: this.pickColorQualifier, + includeBuiltIns: this.includeBuiltIns + }); +}; +ShaderSource.replaceMain = function(e, t) { + return t = `void ${t}()`, e.replace(/void\s+main\s*\(\s*(?:void)?\s*\)/g, t); +}; +ShaderSource.prototype.getCacheKey = function() { + const t = this.defines.slice().sort().join(","), n = this.pickColorQualifier, i = this.includeBuiltIns, r = this.sources.join(` +`); + return `${t}:${n}:${i}:${r}`; +}; +ShaderSource.prototype.createCombinedVertexShader = function(e) { + return combineShader(this, !1, e); +}; +ShaderSource.prototype.createCombinedFragmentShader = function(e) { + return combineShader(this, !0, e); +}; +ShaderSource._czmBuiltinsAndUniforms = {}; +for (const e in CzmBuiltins) + CzmBuiltins.hasOwnProperty(e) && (ShaderSource._czmBuiltinsAndUniforms[e] = CzmBuiltins[e]); +for (const e in AutomaticUniforms) + if (AutomaticUniforms.hasOwnProperty(e)) { + const t = AutomaticUniforms[e]; + typeof t.getDeclaration == "function" && (ShaderSource._czmBuiltinsAndUniforms[e] = t.getDeclaration(e)); + } +ShaderSource.createPickVertexShaderSource = function(e) { + return `${ShaderSource.replaceMain( + e, + "czm_old_main" + )} +in vec4 pickColor; +out vec4 czm_pickColor; +void main() +{ + czm_old_main(); + czm_pickColor = pickColor; +}`; +}; +ShaderSource.createPickFragmentShaderSource = function(e, t) { + const n = ShaderSource.replaceMain( + e, + "czm_old_main" + ), i = `${t} vec4 czm_pickColor; +void main() +{ + czm_old_main(); + if (out_FragColor.a == 0.0) { + discard; + } + out_FragColor = czm_pickColor; +}`; + return `${n} +${i}`; +}; +function containsDefine(e, t) { + const n = e.defines, i = n.length; + for (let r = 0; r < i; ++r) + if (n[r] === t) + return !0; + return !1; +} +function containsString(e, t) { + const n = e.sources, i = n.length; + for (let r = 0; r < i; ++r) + if (n[r].indexOf(t) !== -1) + return !0; + return !1; +} +function findFirstString(e, t) { + const n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i]; + if (containsString(e, r)) + return r; + } +} +const normalVaryingNames = ["v_normalEC", "v_normal"]; +ShaderSource.findNormalVarying = function(e) { + return containsString(e, "#ifdef HAS_NORMALS") ? containsDefine(e, "HAS_NORMALS") ? "v_normalEC" : void 0 : findFirstString(e, normalVaryingNames); +}; +const positionVaryingNames = ["v_positionEC"]; +ShaderSource.findPositionVarying = function(e) { + return findFirstString(e, positionVaryingNames); +}; +function ShaderCache(e) { + this._context = e, this._shaders = {}, this._numberOfShaders = 0, this._shadersToRelease = {}; +} +Object.defineProperties(ShaderCache.prototype, { + numberOfShaders: { + get: function() { + return this._numberOfShaders; + } + } +}); +ShaderCache.prototype.replaceShaderProgram = function(e) { + return defined(e.shaderProgram) && e.shaderProgram.destroy(), this.getShaderProgram(e); +}; +function toSortedJson(e) { + const t = Object.keys(e).sort(); + return JSON.stringify(e, t); +} +ShaderCache.prototype.getShaderProgram = function(e) { + let t = e.vertexShaderSource, n = e.fragmentShaderSource; + const i = e.attributeLocations; + typeof t == "string" && (t = new ShaderSource({ + sources: [t] + })), typeof n == "string" && (n = new ShaderSource({ + sources: [n] + })); + const r = t.getCacheKey(), o = n.getCacheKey(), s = defined(i) ? toSortedJson(i) : "", c = `${r}:${o}:${s}`; + let l; + if (defined(this._shaders[c])) + l = this._shaders[c], delete this._shadersToRelease[c]; + else { + const d = this._context, f = t.createCombinedVertexShader( + d + ), h = n.createCombinedFragmentShader( + d + ), p = new ShaderProgram({ + gl: d._gl, + logShaderCompilation: d.logShaderCompilation, + debugShaders: d.debugShaders, + vertexShaderSource: t, + vertexShaderText: f, + fragmentShaderSource: n, + fragmentShaderText: h, + attributeLocations: i + }); + l = { + cache: this, + shaderProgram: p, + keyword: c, + derivedKeywords: [], + count: 0 + }, p._cachedShader = l, this._shaders[c] = l, ++this._numberOfShaders; + } + return ++l.count, l.shaderProgram; +}; +ShaderCache.prototype.replaceDerivedShaderProgram = function(e, t, n) { + const i = e._cachedShader, r = t + i.keyword, o = this._shaders[r]; + if (defined(o)) { + destroyShader(this, o); + const s = i.derivedKeywords.indexOf(t); + s > -1 && i.derivedKeywords.splice(s, 1); + } + return this.createDerivedShaderProgram(e, t, n); +}; +ShaderCache.prototype.getDerivedShaderProgram = function(e, t) { + const n = e._cachedShader, i = t + n.keyword, r = this._shaders[i]; + if (defined(r)) + return r.shaderProgram; +}; +ShaderCache.prototype.createDerivedShaderProgram = function(e, t, n) { + const i = e._cachedShader, r = t + i.keyword; + let o = n.vertexShaderSource, s = n.fragmentShaderSource; + const c = n.attributeLocations; + typeof o == "string" && (o = new ShaderSource({ + sources: [o] + })), typeof s == "string" && (s = new ShaderSource({ + sources: [s] + })); + const l = this._context, d = o.createCombinedVertexShader( + l + ), f = s.createCombinedFragmentShader( + l + ), h = new ShaderProgram({ + gl: l._gl, + logShaderCompilation: l.logShaderCompilation, + debugShaders: l.debugShaders, + vertexShaderSource: o, + vertexShaderText: d, + fragmentShaderSource: s, + fragmentShaderText: f, + attributeLocations: c + }), p = { + cache: this, + shaderProgram: h, + keyword: r, + derivedKeywords: [], + count: 0 + }; + return i.derivedKeywords.push(t), h._cachedShader = p, this._shaders[r] = p, h; +}; +function destroyShader(e, t) { + const n = t.derivedKeywords, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r] + t.keyword, s = e._shaders[o]; + destroyShader(e, s); + } + delete e._shaders[t.keyword], t.shaderProgram.finalDestroy(); +} +ShaderCache.prototype.destroyReleasedShaderPrograms = function() { + const e = this._shadersToRelease; + for (const t in e) + if (e.hasOwnProperty(t)) { + const n = e[t]; + destroyShader(this, n), --this._numberOfShaders; + } + this._shadersToRelease = {}; +}; +ShaderCache.prototype.releaseShaderProgram = function(e) { + if (defined(e)) { + const t = e._cachedShader; + t && --t.count === 0 && (this._shadersToRelease[t.keyword] = t); + } +}; +ShaderCache.prototype.isDestroyed = function() { + return !1; +}; +ShaderCache.prototype.destroy = function() { + const e = this._shaders; + for (const t in e) + e.hasOwnProperty(t) && e[t].shaderProgram.finalDestroy(); + return destroyObject(this); +}; +function Texture(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + context: t, + source: n, + pixelFormat: i = PixelFormat$1.RGBA, + pixelDatatype: r = PixelDatatype$1.UNSIGNED_BYTE, + flipY: o = !0, + skipColorSpaceConversion: s = !1, + sampler: c = new Sampler() + } = e; + let { width: l, height: d } = e; + defined(n) && (defined(l) || (l = defaultValue(n.videoWidth, n.width)), defined(d) || (d = defaultValue(n.videoHeight, n.height))); + const f = e.preMultiplyAlpha || i === PixelFormat$1.RGB || i === PixelFormat$1.LUMINANCE, h = PixelFormat$1.toInternalFormat( + i, + r, + t + ), p = PixelFormat$1.isCompressedFormat(h), m = t._gl, _ = p ? PixelFormat$1.compressedTextureSizeInBytes(i, l, d) : PixelFormat$1.textureSizeInBytes(i, r, l, d); + this._id = createGuid(), this._context = t, this._textureFilterAnisotropic = t._textureFilterAnisotropic, this._textureTarget = m.TEXTURE_2D, this._texture = m.createTexture(), this._internalFormat = h, this._pixelFormat = i, this._pixelDatatype = r, this._width = l, this._height = d, this._dimensions = new Cartesian2(l, d), this._hasMipmap = !1, this._sizeInBytes = _, this._preMultiplyAlpha = f, this._flipY = o, this._initialized = !1, this._sampler = void 0, this._sampler = c, setupSampler(this, c), m.activeTexture(m.TEXTURE0), m.bindTexture(this._textureTarget, this._texture), defined(n) ? (s ? m.pixelStorei(m.UNPACK_COLORSPACE_CONVERSION_WEBGL, m.NONE) : m.pixelStorei( + m.UNPACK_COLORSPACE_CONVERSION_WEBGL, + m.BROWSER_DEFAULT_WEBGL + ), defined(n.arrayBufferView) ? PixelFormat$1.isCompressedFormat(h) ? loadCompressedBufferSource(this, n) : loadBufferSource(this, n) : defined(n.framebuffer) ? loadFramebufferSource(this, n) : loadImageSource(this, n), this._initialized = !0) : loadNull(this), m.bindTexture(this._textureTarget, null); +} +function loadCompressedBufferSource(e, t) { + const i = e._context._gl, r = e._textureTarget, o = e._internalFormat, { width: s, height: c } = e; + if (i.pixelStorei(i.UNPACK_ALIGNMENT, 4), i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !1), i.compressedTexImage2D( + r, + 0, + o, + s, + c, + 0, + t.arrayBufferView + ), defined(t.mipLevels)) { + let l = s, d = c; + for (let f = 0; f < t.mipLevels.length; ++f) + l = nextMipSize(l), d = nextMipSize(d), i.compressedTexImage2D( + r, + f + 1, + o, + l, + d, + 0, + t.mipLevels[f] + ); + } +} +function loadBufferSource(e, t) { + const n = e._context, i = n._gl, r = e._textureTarget, o = e._internalFormat, { width: s, height: c, pixelFormat: l, pixelDatatype: d, flipY: f } = e, h = PixelFormat$1.alignmentInBytes( + l, + d, + s + ); + i.pixelStorei(i.UNPACK_ALIGNMENT, h), i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !1); + let p = t.arrayBufferView; + if (f && (p = PixelFormat$1.flipY( + p, + l, + d, + s, + c + )), i.texImage2D( + r, + 0, + o, + s, + c, + 0, + l, + PixelDatatype$1.toWebGLConstant(d, n), + p + ), defined(t.mipLevels)) { + let m = s, _ = c; + for (let y = 0; y < t.mipLevels.length; ++y) + m = nextMipSize(m), _ = nextMipSize(_), i.texImage2D( + r, + y + 1, + o, + m, + _, + 0, + l, + PixelDatatype$1.toWebGLConstant(d, n), + t.mipLevels[y] + ); + } +} +function loadFramebufferSource(e, t) { + const n = e._context, i = n._gl; + i.pixelStorei(i.UNPACK_ALIGNMENT, 4), i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !1), t.framebuffer !== n.defaultFramebuffer && t.framebuffer._bind(), i.copyTexImage2D( + e._textureTarget, + 0, + e._internalFormat, + t.xOffset, + t.yOffset, + e.width, + e.height, + 0 + ), t.framebuffer !== n.defaultFramebuffer && t.framebuffer._unBind(); +} +function loadImageSource(e, t) { + const n = e._context, i = n._gl; + i.pixelStorei(i.UNPACK_ALIGNMENT, 4), i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.preMultiplyAlpha), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, e.flipY), i.texImage2D( + e._textureTarget, + 0, + e._internalFormat, + e.pixelFormat, + PixelDatatype$1.toWebGLConstant(e.pixelDatatype, n), + t + ); +} +function nextMipSize(e) { + const t = Math.floor(e / 2) | 0; + return Math.max(t, 1); +} +function loadNull(e) { + const t = e._context; + t._gl.texImage2D( + e._textureTarget, + 0, + e._internalFormat, + e._width, + e._height, + 0, + e._pixelFormat, + PixelDatatype$1.toWebGLConstant(e._pixelDatatype, t), + null + ); +} +Texture.create = function(e) { + return new Texture(e); +}; +Texture.fromFramebuffer = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context, n = t._gl, { + pixelFormat: i = PixelFormat$1.RGB, + framebufferXOffset: r = 0, + framebufferYOffset: o = 0, + width: s = n.drawingBufferWidth, + height: c = n.drawingBufferHeight, + framebuffer: l + } = e; + return new Texture({ + context: t, + width: s, + height: c, + pixelFormat: i, + source: { + framebuffer: defined(l) ? l : t.defaultFramebuffer, + xOffset: r, + yOffset: o, + width: s, + height: c + } + }); +}; +Object.defineProperties(Texture.prototype, { + /** + * A unique id for the texture + * @memberof Texture.prototype + * @type {string} + * @readonly + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The sampler to use when sampling this texture. + * Create a sampler by calling {@link Sampler}. If this + * parameter is not specified, a default sampler is used. The default sampler clamps texture + * coordinates in both directions, uses linear filtering for both magnification and minification, + * and uses a maximum anisotropy of 1.0. + * @memberof Texture.prototype + * @type {object} + */ + sampler: { + get: function() { + return this._sampler; + }, + set: function(e) { + setupSampler(this, e), this._sampler = e; + } + }, + pixelFormat: { + get: function() { + return this._pixelFormat; + } + }, + pixelDatatype: { + get: function() { + return this._pixelDatatype; + } + }, + dimensions: { + get: function() { + return this._dimensions; + } + }, + preMultiplyAlpha: { + get: function() { + return this._preMultiplyAlpha; + } + }, + flipY: { + get: function() { + return this._flipY; + } + }, + width: { + get: function() { + return this._width; + } + }, + height: { + get: function() { + return this._height; + } + }, + sizeInBytes: { + get: function() { + return this._hasMipmap ? Math.floor(this._sizeInBytes * 4 / 3) : this._sizeInBytes; + } + }, + _target: { + get: function() { + return this._textureTarget; + } + } +}); +function setupSampler(e, t) { + let { minificationFilter: n, magnificationFilter: i } = t; + const r = [ + TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST, + TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR, + TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST, + TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR + ].includes(n), o = e._context, s = e._pixelFormat, c = e._pixelDatatype; + (c === PixelDatatype$1.FLOAT && !o.textureFloatLinear || c === PixelDatatype$1.HALF_FLOAT && !o.textureHalfFloatLinear) && (n = r ? TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST : TextureMinificationFilter$1.NEAREST, i = TextureMagnificationFilter$1.NEAREST), o.webgl2 && PixelFormat$1.isDepthFormat(s) && (n = TextureMinificationFilter$1.NEAREST, i = TextureMagnificationFilter$1.NEAREST); + const l = o._gl, d = e._textureTarget; + l.activeTexture(l.TEXTURE0), l.bindTexture(d, e._texture), l.texParameteri(d, l.TEXTURE_MIN_FILTER, n), l.texParameteri(d, l.TEXTURE_MAG_FILTER, i), l.texParameteri(d, l.TEXTURE_WRAP_S, t.wrapS), l.texParameteri(d, l.TEXTURE_WRAP_T, t.wrapT), defined(e._textureFilterAnisotropic) && l.texParameteri( + d, + e._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, + t.maximumAnisotropy + ), l.bindTexture(d, null); +} +Texture.prototype.copyFrom = function(e) { + const { + xOffset: t = 0, + yOffset: n = 0, + source: i, + skipColorSpaceConversion: r = !1 + } = e, o = this._context, s = o._gl, c = this._textureTarget; + s.activeTexture(s.TEXTURE0), s.bindTexture(c, this._texture); + const { width: l, height: d, arrayBufferView: f } = i, h = this._width, p = this._height, m = this._internalFormat, _ = this._pixelFormat, y = this._pixelDatatype, C = this._preMultiplyAlpha, T = this._flipY; + let x = 4; + defined(f) && (x = PixelFormat$1.alignmentInBytes( + _, + y, + l + )), s.pixelStorei(s.UNPACK_ALIGNMENT, x), r ? s.pixelStorei(s.UNPACK_COLORSPACE_CONVERSION_WEBGL, s.NONE) : s.pixelStorei( + s.UNPACK_COLORSPACE_CONVERSION_WEBGL, + s.BROWSER_DEFAULT_WEBGL + ); + let b = !1; + if (!this._initialized) { + let S; + t === 0 && n === 0 && l === h && d === p ? (defined(f) ? (s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, !1), T ? S = PixelFormat$1.flipY( + f, + _, + y, + h, + p + ) : S = f) : (s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, C), s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, T), S = i), b = !0) : (s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, !1), S = PixelFormat$1.createTypedArray( + _, + y, + h, + p + )), s.texImage2D( + c, + 0, + m, + h, + p, + 0, + _, + PixelDatatype$1.toWebGLConstant(y, o), + S + ), this._initialized = !0; + } + if (!b) { + let S; + defined(f) ? (s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, !1), T ? S = PixelFormat$1.flipY( + f, + _, + y, + l, + d + ) : S = f) : (s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, C), s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, T), S = i), s.texSubImage2D( + c, + 0, + t, + n, + l, + d, + _, + PixelDatatype$1.toWebGLConstant(y, o), + S + ); + } + s.bindTexture(c, null); +}; +Texture.prototype.copyFromFramebuffer = function(e, t, n, i, r, o) { + e = defaultValue(e, 0), t = defaultValue(t, 0), n = defaultValue(n, 0), i = defaultValue(i, 0), r = defaultValue(r, this._width), o = defaultValue(o, this._height); + const s = this._context._gl, c = this._textureTarget; + s.activeTexture(s.TEXTURE0), s.bindTexture(c, this._texture), s.copyTexSubImage2D( + c, + 0, + e, + t, + n, + i, + r, + o + ), s.bindTexture(c, null), this._initialized = !0; +}; +Texture.prototype.generateMipmap = function(e) { + e = defaultValue(e, MipmapHint$1.DONT_CARE), this._hasMipmap = !0; + const t = this._context._gl, n = this._textureTarget; + t.hint(t.GENERATE_MIPMAP_HINT, e), t.activeTexture(t.TEXTURE0), t.bindTexture(n, this._texture), t.generateMipmap(n), t.bindTexture(n, null); +}; +Texture.prototype.isDestroyed = function() { + return !1; +}; +Texture.prototype.destroy = function() { + return this._context._gl.deleteTexture(this._texture), destroyObject(this); +}; +function TextureCache() { + this._textures = {}, this._numberOfTextures = 0, this._texturesToRelease = {}; +} +Object.defineProperties(TextureCache.prototype, { + numberOfTextures: { + get: function() { + return this._numberOfTextures; + } + } +}); +TextureCache.prototype.getTexture = function(e) { + const t = this._textures[e]; + if (defined(t)) + return delete this._texturesToRelease[e], ++t.count, t.texture; +}; +TextureCache.prototype.addTexture = function(e, t) { + const n = { + texture: t, + count: 1 + }; + t.finalDestroy = t.destroy; + const i = this; + t.destroy = function() { + --n.count === 0 && (i._texturesToRelease[e] = n); + }, this._textures[e] = n, ++this._numberOfTextures; +}; +TextureCache.prototype.destroyReleasedTextures = function() { + const e = this._texturesToRelease; + for (const t in e) + if (e.hasOwnProperty(t)) { + const n = e[t]; + delete this._textures[t], n.texture.finalDestroy(), --this._numberOfTextures; + } + this._texturesToRelease = {}; +}; +TextureCache.prototype.isDestroyed = function() { + return !1; +}; +TextureCache.prototype.destroy = function() { + const e = this._textures; + for (const t in e) + e.hasOwnProperty(t) && e[t].texture.finalDestroy(); + return destroyObject(this); +}; +function EncodedCartesian3() { + this.high = Cartesian3.clone(Cartesian3.ZERO), this.low = Cartesian3.clone(Cartesian3.ZERO); +} +EncodedCartesian3.encode = function(e, t) { + defined(t) || (t = { + high: 0, + low: 0 + }); + let n; + return e >= 0 ? (n = Math.floor(e / 65536) * 65536, t.high = n, t.low = e - n) : (n = Math.floor(-e / 65536) * 65536, t.high = -n, t.low = e + n), t; +}; +const scratchEncode = { + high: 0, + low: 0 +}; +EncodedCartesian3.fromCartesian = function(e, t) { + defined(t) || (t = new EncodedCartesian3()); + const n = t.high, i = t.low; + return EncodedCartesian3.encode(e.x, scratchEncode), n.x = scratchEncode.high, i.x = scratchEncode.low, EncodedCartesian3.encode(e.y, scratchEncode), n.y = scratchEncode.high, i.y = scratchEncode.low, EncodedCartesian3.encode(e.z, scratchEncode), n.z = scratchEncode.high, i.z = scratchEncode.low, t; +}; +const encodedP = new EncodedCartesian3(); +EncodedCartesian3.writeElements = function(e, t, n) { + EncodedCartesian3.fromCartesian(e, encodedP); + const i = encodedP.high, r = encodedP.low; + t[n] = i.x, t[n + 1] = i.y, t[n + 2] = i.z, t[n + 3] = r.x, t[n + 4] = r.y, t[n + 5] = r.z; +}; +function Plane(e, t) { + this.normal = Cartesian3.clone(e), this.distance = t; +} +Plane.fromPointNormal = function(e, t, n) { + const i = -Cartesian3.dot(t, e); + return defined(n) ? (Cartesian3.clone(t, n.normal), n.distance = i, n) : new Plane(t, i); +}; +const scratchNormal$8 = new Cartesian3(); +Plane.fromCartesian4 = function(e, t) { + const n = Cartesian3.fromCartesian4(e, scratchNormal$8), i = e.w; + return defined(t) ? (Cartesian3.clone(n, t.normal), t.distance = i, t) : new Plane(n, i); +}; +Plane.getPointDistance = function(e, t) { + return Cartesian3.dot(e.normal, t) + e.distance; +}; +const scratchCartesian$b = new Cartesian3(); +Plane.projectPointOntoPlane = function(e, t, n) { + defined(n) || (n = new Cartesian3()); + const i = Plane.getPointDistance(e, t), r = Cartesian3.multiplyByScalar( + e.normal, + i, + scratchCartesian$b + ); + return Cartesian3.subtract(t, r, n); +}; +const scratchInverseTranspose = new Matrix4(), scratchPlaneCartesian4 = new Cartesian4(), scratchTransformNormal = new Cartesian3(); +Plane.transform = function(e, t, n) { + const i = e.normal, r = e.distance, o = Matrix4.inverseTranspose( + t, + scratchInverseTranspose + ); + let s = Cartesian4.fromElements( + i.x, + i.y, + i.z, + r, + scratchPlaneCartesian4 + ); + s = Matrix4.multiplyByVector( + o, + s, + s + ); + const c = Cartesian3.fromCartesian4( + s, + scratchTransformNormal + ); + return s = Cartesian4.divideByScalar( + s, + Cartesian3.magnitude(c), + s + ), Plane.fromCartesian4(s, n); +}; +Plane.clone = function(e, t) { + return defined(t) ? (Cartesian3.clone(e.normal, t.normal), t.distance = e.distance, t) : new Plane(e.normal, e.distance); +}; +Plane.equals = function(e, t) { + return e.distance === t.distance && Cartesian3.equals(e.normal, t.normal); +}; +Plane.ORIGIN_XY_PLANE = Object.freeze(new Plane(Cartesian3.UNIT_Z, 0)); +Plane.ORIGIN_YZ_PLANE = Object.freeze(new Plane(Cartesian3.UNIT_X, 0)); +Plane.ORIGIN_ZX_PLANE = Object.freeze(new Plane(Cartesian3.UNIT_Y, 0)); +function CullingVolume(e) { + this.planes = defaultValue(e, []); +} +const faces = [new Cartesian3(), new Cartesian3(), new Cartesian3()]; +Cartesian3.clone(Cartesian3.UNIT_X, faces[0]); +Cartesian3.clone(Cartesian3.UNIT_Y, faces[1]); +Cartesian3.clone(Cartesian3.UNIT_Z, faces[2]); +const scratchPlaneCenter = new Cartesian3(), scratchPlaneNormal$1 = new Cartesian3(), scratchPlane$2 = new Plane(new Cartesian3(1, 0, 0), 0); +CullingVolume.fromBoundingSphere = function(e, t) { + defined(t) || (t = new CullingVolume()); + const n = faces.length, i = t.planes; + i.length = 2 * n; + const r = e.center, o = e.radius; + let s = 0; + for (let c = 0; c < n; ++c) { + const l = faces[c]; + let d = i[s], f = i[s + 1]; + defined(d) || (d = i[s] = new Cartesian4()), defined(f) || (f = i[s + 1] = new Cartesian4()), Cartesian3.multiplyByScalar(l, -o, scratchPlaneCenter), Cartesian3.add(r, scratchPlaneCenter, scratchPlaneCenter), d.x = l.x, d.y = l.y, d.z = l.z, d.w = -Cartesian3.dot(l, scratchPlaneCenter), Cartesian3.multiplyByScalar(l, o, scratchPlaneCenter), Cartesian3.add(r, scratchPlaneCenter, scratchPlaneCenter), f.x = -l.x, f.y = -l.y, f.z = -l.z, f.w = -Cartesian3.dot( + Cartesian3.negate(l, scratchPlaneNormal$1), + scratchPlaneCenter + ), s += 2; + } + return t; +}; +CullingVolume.prototype.computeVisibility = function(e) { + const t = this.planes; + let n = !1; + for (let i = 0, r = t.length; i < r; ++i) { + const o = e.intersectPlane( + Plane.fromCartesian4(t[i], scratchPlane$2) + ); + if (o === Intersect$1.OUTSIDE) + return Intersect$1.OUTSIDE; + o === Intersect$1.INTERSECTING && (n = !0); + } + return n ? Intersect$1.INTERSECTING : Intersect$1.INSIDE; +}; +CullingVolume.prototype.computeVisibilityWithPlaneMask = function(e, t) { + if (t === CullingVolume.MASK_OUTSIDE || t === CullingVolume.MASK_INSIDE) + return t; + let n = CullingVolume.MASK_INSIDE; + const i = this.planes; + for (let r = 0, o = i.length; r < o; ++r) { + const s = r < 31 ? 1 << r : 0; + if (r < 31 && !(t & s)) + continue; + const c = e.intersectPlane( + Plane.fromCartesian4(i[r], scratchPlane$2) + ); + if (c === Intersect$1.OUTSIDE) + return CullingVolume.MASK_OUTSIDE; + c === Intersect$1.INTERSECTING && (n |= s); + } + return n; +}; +CullingVolume.MASK_OUTSIDE = 4294967295; +CullingVolume.MASK_INSIDE = 0; +CullingVolume.MASK_INDETERMINATE = 2147483647; +function OrthographicOffCenterFrustum(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.left = e.left, this._left = void 0, this.right = e.right, this._right = void 0, this.top = e.top, this._top = void 0, this.bottom = e.bottom, this._bottom = void 0, this.near = defaultValue(e.near, 1), this._near = this.near, this.far = defaultValue(e.far, 5e8), this._far = this.far, this._cullingVolume = new CullingVolume(), this._orthographicMatrix = new Matrix4(); +} +function update$5(e) { + (e.top !== e._top || e.bottom !== e._bottom || e.left !== e._left || e.right !== e._right || e.near !== e._near || e.far !== e._far) && (e._left = e.left, e._right = e.right, e._top = e.top, e._bottom = e.bottom, e._near = e.near, e._far = e.far, e._orthographicMatrix = Matrix4.computeOrthographicOffCenter( + e.left, + e.right, + e.bottom, + e.top, + e.near, + e.far, + e._orthographicMatrix + )); +} +Object.defineProperties(OrthographicOffCenterFrustum.prototype, { + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + */ + projectionMatrix: { + get: function() { + return update$5(this), this._orthographicMatrix; + } + } +}); +const getPlanesRight$1 = new Cartesian3(), getPlanesNearCenter$1 = new Cartesian3(), getPlanesPoint = new Cartesian3(), negateScratch = new Cartesian3(); +OrthographicOffCenterFrustum.prototype.computeCullingVolume = function(e, t, n) { + const i = this._cullingVolume.planes, r = this.top, o = this.bottom, s = this.right, c = this.left, l = this.near, d = this.far, f = Cartesian3.cross(t, n, getPlanesRight$1); + Cartesian3.normalize(f, f); + const h = getPlanesNearCenter$1; + Cartesian3.multiplyByScalar(t, l, h), Cartesian3.add(e, h, h); + const p = getPlanesPoint; + Cartesian3.multiplyByScalar(f, c, p), Cartesian3.add(h, p, p); + let m = i[0]; + return defined(m) || (m = i[0] = new Cartesian4()), m.x = f.x, m.y = f.y, m.z = f.z, m.w = -Cartesian3.dot(f, p), Cartesian3.multiplyByScalar(f, s, p), Cartesian3.add(h, p, p), m = i[1], defined(m) || (m = i[1] = new Cartesian4()), m.x = -f.x, m.y = -f.y, m.z = -f.z, m.w = -Cartesian3.dot(Cartesian3.negate(f, negateScratch), p), Cartesian3.multiplyByScalar(n, o, p), Cartesian3.add(h, p, p), m = i[2], defined(m) || (m = i[2] = new Cartesian4()), m.x = n.x, m.y = n.y, m.z = n.z, m.w = -Cartesian3.dot(n, p), Cartesian3.multiplyByScalar(n, r, p), Cartesian3.add(h, p, p), m = i[3], defined(m) || (m = i[3] = new Cartesian4()), m.x = -n.x, m.y = -n.y, m.z = -n.z, m.w = -Cartesian3.dot(Cartesian3.negate(n, negateScratch), p), m = i[4], defined(m) || (m = i[4] = new Cartesian4()), m.x = t.x, m.y = t.y, m.z = t.z, m.w = -Cartesian3.dot(t, h), Cartesian3.multiplyByScalar(t, d, p), Cartesian3.add(e, p, p), m = i[5], defined(m) || (m = i[5] = new Cartesian4()), m.x = -t.x, m.y = -t.y, m.z = -t.z, m.w = -Cartesian3.dot(Cartesian3.negate(t, negateScratch), p), this._cullingVolume; +}; +OrthographicOffCenterFrustum.prototype.getPixelDimensions = function(e, t, n, i, r) { + update$5(this); + const o = this.right - this.left, s = this.top - this.bottom, c = i * o / e, l = i * s / t; + return r.x = c, r.y = l, r; +}; +OrthographicOffCenterFrustum.prototype.clone = function(e) { + return defined(e) || (e = new OrthographicOffCenterFrustum()), e.left = this.left, e.right = this.right, e.top = this.top, e.bottom = this.bottom, e.near = this.near, e.far = this.far, e._left = void 0, e._right = void 0, e._top = void 0, e._bottom = void 0, e._near = void 0, e._far = void 0, e; +}; +OrthographicOffCenterFrustum.prototype.equals = function(e) { + return defined(e) && e instanceof OrthographicOffCenterFrustum && this.right === e.right && this.left === e.left && this.top === e.top && this.bottom === e.bottom && this.near === e.near && this.far === e.far; +}; +OrthographicOffCenterFrustum.prototype.equalsEpsilon = function(e, t, n) { + return e === this || defined(e) && e instanceof OrthographicOffCenterFrustum && CesiumMath.equalsEpsilon( + this.right, + e.right, + t, + n + ) && CesiumMath.equalsEpsilon( + this.left, + e.left, + t, + n + ) && CesiumMath.equalsEpsilon( + this.top, + e.top, + t, + n + ) && CesiumMath.equalsEpsilon( + this.bottom, + e.bottom, + t, + n + ) && CesiumMath.equalsEpsilon( + this.near, + e.near, + t, + n + ) && CesiumMath.equalsEpsilon( + this.far, + e.far, + t, + n + ); +}; +function OrthographicFrustum(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._offCenterFrustum = new OrthographicOffCenterFrustum(), this.width = e.width, this._width = void 0, this.aspectRatio = e.aspectRatio, this._aspectRatio = void 0, this.near = defaultValue(e.near, 1), this._near = this.near, this.far = defaultValue(e.far, 5e8), this._far = this.far; +} +OrthographicFrustum.packedLength = 4; +OrthographicFrustum.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.width, t[n++] = e.aspectRatio, t[n++] = e.near, t[n] = e.far, t; +}; +OrthographicFrustum.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new OrthographicFrustum()), n.width = e[t++], n.aspectRatio = e[t++], n.near = e[t++], n.far = e[t], n; +}; +function update$4(e) { + const t = e._offCenterFrustum; + if (e.width !== e._width || e.aspectRatio !== e._aspectRatio || e.near !== e._near || e.far !== e._far) { + e._aspectRatio = e.aspectRatio, e._width = e.width, e._near = e.near, e._far = e.far; + const n = 1 / e.aspectRatio; + t.right = e.width * 0.5, t.left = -t.right, t.top = n * t.right, t.bottom = -t.top, t.near = e.near, t.far = e.far; + } +} +Object.defineProperties(OrthographicFrustum.prototype, { + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicFrustum.prototype + * @type {Matrix4} + * @readonly + */ + projectionMatrix: { + get: function() { + return update$4(this), this._offCenterFrustum.projectionMatrix; + } + }, + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicFrustum.prototype + * @type {OrthographicOffCenterFrustum} + * @readonly + * @private + */ + offCenterFrustum: { + get: function() { + return update$4(this), this._offCenterFrustum; + } + } +}); +OrthographicFrustum.prototype.computeCullingVolume = function(e, t, n) { + return update$4(this), this._offCenterFrustum.computeCullingVolume(e, t, n); +}; +OrthographicFrustum.prototype.getPixelDimensions = function(e, t, n, i, r) { + return update$4(this), this._offCenterFrustum.getPixelDimensions( + e, + t, + n, + i, + r + ); +}; +OrthographicFrustum.prototype.clone = function(e) { + return defined(e) || (e = new OrthographicFrustum()), e.aspectRatio = this.aspectRatio, e.width = this.width, e.near = this.near, e.far = this.far, e._aspectRatio = void 0, e._width = void 0, e._near = void 0, e._far = void 0, this._offCenterFrustum.clone(e._offCenterFrustum), e; +}; +OrthographicFrustum.prototype.equals = function(e) { + return !defined(e) || !(e instanceof OrthographicFrustum) ? !1 : (update$4(this), update$4(e), this.width === e.width && this.aspectRatio === e.aspectRatio && this._offCenterFrustum.equals(e._offCenterFrustum)); +}; +OrthographicFrustum.prototype.equalsEpsilon = function(e, t, n) { + return !defined(e) || !(e instanceof OrthographicFrustum) ? !1 : (update$4(this), update$4(e), CesiumMath.equalsEpsilon( + this.width, + e.width, + t, + n + ) && CesiumMath.equalsEpsilon( + this.aspectRatio, + e.aspectRatio, + t, + n + ) && this._offCenterFrustum.equalsEpsilon( + e._offCenterFrustum, + t, + n + )); +}; +const Simon1994PlanetaryPositions = {}; +function computeTdbMinusTtSpice(e) { + const t = 6.239996 + 0.0172019696544 * e; + return 1657e-6 * Math.sin(t + 0.01671 * Math.sin(t)); +} +const TdtMinusTai$1 = 32.184, J2000d$1 = 2451545; +function taiToTdb(e, t) { + t = JulianDate.addSeconds(e, TdtMinusTai$1, t); + const n = JulianDate.totalDays(t) - J2000d$1; + return t = JulianDate.addSeconds(t, computeTdbMinusTtSpice(n), t), t; +} +const epoch = new JulianDate(2451545, 0, TimeStandard$1.TAI), MetersPerKilometer = 1e3, RadiansPerDegree = CesiumMath.RADIANS_PER_DEGREE, RadiansPerArcSecond = CesiumMath.RADIANS_PER_ARCSECOND, MetersPerAstronomicalUnit = 14959787e4, perifocalToEquatorial = new Matrix3(); +function elementsToCartesian(e, t, n, i, r, o, s) { + n < 0 && (n = -n, r += CesiumMath.PI); + const c = e * (1 - t), l = i - r, d = r, f = meanAnomalyToTrueAnomaly( + o - i, + t + ); + perifocalToCartesianMatrix( + l, + n, + d, + perifocalToEquatorial + ); + const h = c * (1 + t), p = Math.cos(f), m = Math.sin(f), _ = 1 + t * p, y = h / _; + return defined(s) ? (s.x = y * p, s.y = y * m, s.z = 0) : s = new Cartesian3(y * p, y * m, 0), Matrix3.multiplyByVector(perifocalToEquatorial, s, s); +} +function meanAnomalyToTrueAnomaly(e, t) { + const n = meanAnomalyToEccentricAnomaly( + e, + t + ); + return eccentricAnomalyToTrueAnomaly(n, t); +} +const maxIterationCount = 50, keplerEqConvergence = CesiumMath.EPSILON8; +function meanAnomalyToEccentricAnomaly(e, t) { + const n = Math.floor(e / CesiumMath.TWO_PI); + e -= n * CesiumMath.TWO_PI; + let i = e + t * Math.sin(e) / (1 - Math.sin(e + t) + Math.sin(e)), r = Number.MAX_VALUE, o; + for (o = 0; o < maxIterationCount && Math.abs(r - i) > keplerEqConvergence; ++o) { + r = i; + const s = r - t * Math.sin(r) - e, c = 1 - t * Math.cos(r); + i = r - s / c; + } + return r = i + n * CesiumMath.TWO_PI, r; +} +function eccentricAnomalyToTrueAnomaly(e, t) { + const n = Math.floor(e / CesiumMath.TWO_PI); + e -= n * CesiumMath.TWO_PI; + const i = Math.cos(e) - t, r = Math.sin(e) * Math.sqrt(1 - t * t); + let o = Math.atan2(r, i); + return o = CesiumMath.zeroToTwoPi(o), e < 0 && (o -= CesiumMath.TWO_PI), o += n * CesiumMath.TWO_PI, o; +} +function perifocalToCartesianMatrix(e, t, n, i) { + const r = Math.cos(e), o = Math.sin(e), s = Math.cos(t), c = Math.sin(t), l = Math.cos(n), d = Math.sin(n); + return defined(i) ? (i[0] = l * r - d * o * s, i[1] = d * r + l * o * s, i[2] = o * c, i[3] = -l * o - d * r * s, i[4] = -d * o + l * r * s, i[5] = r * c, i[6] = d * c, i[7] = -l * c, i[8] = s) : i = new Matrix3( + l * r - d * o * s, + -l * o - d * r * s, + d * c, + d * r + l * o * s, + -d * o + l * r * s, + -l * c, + o * c, + r * c, + s + ), i; +} +const semiMajorAxis0 = 1.0000010178 * MetersPerAstronomicalUnit, meanLongitude0 = 100.46645683 * RadiansPerDegree, meanLongitude1 = 129597742283429e-5 * RadiansPerArcSecond, p1u = 16002, p2u = 21863, p3u = 32004, p4u = 10931, p5u = 14529, p6u = 16368, p7u = 15318, p8u = 32794, Ca1 = 64 * 1e-7 * MetersPerAstronomicalUnit, Ca2 = -152 * 1e-7 * MetersPerAstronomicalUnit, Ca3 = 62 * 1e-7 * MetersPerAstronomicalUnit, Ca4 = -8 * 1e-7 * MetersPerAstronomicalUnit, Ca5 = 32 * 1e-7 * MetersPerAstronomicalUnit, Ca6 = -41 * 1e-7 * MetersPerAstronomicalUnit, Ca7 = 19 * 1e-7 * MetersPerAstronomicalUnit, Ca8 = -11 * 1e-7 * MetersPerAstronomicalUnit, Sa1 = -150 * 1e-7 * MetersPerAstronomicalUnit, Sa2 = -46 * 1e-7 * MetersPerAstronomicalUnit, Sa3 = 68 * 1e-7 * MetersPerAstronomicalUnit, Sa4 = 54 * 1e-7 * MetersPerAstronomicalUnit, Sa5 = 14 * 1e-7 * MetersPerAstronomicalUnit, Sa6 = 24 * 1e-7 * MetersPerAstronomicalUnit, Sa7 = -28 * 1e-7 * MetersPerAstronomicalUnit, Sa8 = 22 * 1e-7 * MetersPerAstronomicalUnit, q1u = 10, q2u = 16002, q3u = 21863, q4u = 10931, q5u = 1473, q6u = 32004, q7u = 4387, q8u = 73, Cl1 = -325 * 1e-7, Cl2 = -322 * 1e-7, Cl3 = -79 * 1e-7, Cl4 = 232 * 1e-7, Cl5 = -52 * 1e-7, Cl6 = 97 * 1e-7, Cl7 = 55 * 1e-7, Cl8 = -41 * 1e-7, Sl1 = -105 * 1e-7, Sl2 = -137 * 1e-7, Sl3 = 258 * 1e-7, Sl4 = 35 * 1e-7, Sl5 = -116 * 1e-7, Sl6 = -88 * 1e-7, Sl7 = -112 * 1e-7, Sl8 = -80 * 1e-7, scratchDate$1 = new JulianDate(0, 0, TimeStandard$1.TAI); +function computeSimonEarthMoonBarycenter(e, t) { + taiToTdb(e, scratchDate$1); + const i = (scratchDate$1.dayNumber - epoch.dayNumber + (scratchDate$1.secondsOfDay - epoch.secondsOfDay) / TimeConstants$1.SECONDS_PER_DAY) / (TimeConstants$1.DAYS_PER_JULIAN_CENTURY * 10), r = 0.3595362 * i, o = semiMajorAxis0 + Ca1 * Math.cos(p1u * r) + Sa1 * Math.sin(p1u * r) + Ca2 * Math.cos(p2u * r) + Sa2 * Math.sin(p2u * r) + Ca3 * Math.cos(p3u * r) + Sa3 * Math.sin(p3u * r) + Ca4 * Math.cos(p4u * r) + Sa4 * Math.sin(p4u * r) + Ca5 * Math.cos(p5u * r) + Sa5 * Math.sin(p5u * r) + Ca6 * Math.cos(p6u * r) + Sa6 * Math.sin(p6u * r) + Ca7 * Math.cos(p7u * r) + Sa7 * Math.sin(p7u * r) + Ca8 * Math.cos(p8u * r) + Sa8 * Math.sin(p8u * r), s = meanLongitude0 + meanLongitude1 * i + Cl1 * Math.cos(q1u * r) + Sl1 * Math.sin(q1u * r) + Cl2 * Math.cos(q2u * r) + Sl2 * Math.sin(q2u * r) + Cl3 * Math.cos(q3u * r) + Sl3 * Math.sin(q3u * r) + Cl4 * Math.cos(q4u * r) + Sl4 * Math.sin(q4u * r) + Cl5 * Math.cos(q5u * r) + Sl5 * Math.sin(q5u * r) + Cl6 * Math.cos(q6u * r) + Sl6 * Math.sin(q6u * r) + Cl7 * Math.cos(q7u * r) + Sl7 * Math.sin(q7u * r) + Cl8 * Math.cos(q8u * r) + Sl8 * Math.sin(q8u * r), c = 0.0167086342 - 4203654e-10 * i, l = 102.93734808 * RadiansPerDegree + 11612.3529 * RadiansPerArcSecond * i, d = 469.97289 * RadiansPerArcSecond * i, f = 174.87317577 * RadiansPerDegree - 8679.27034 * RadiansPerArcSecond * i; + return elementsToCartesian( + o, + c, + d, + l, + f, + s, + t + ); +} +function computeSimonMoon(e, t) { + taiToTdb(e, scratchDate$1); + const i = (scratchDate$1.dayNumber - epoch.dayNumber + (scratchDate$1.secondsOfDay - epoch.secondsOfDay) / TimeConstants$1.SECONDS_PER_DAY) / TimeConstants$1.DAYS_PER_JULIAN_CENTURY, r = i * i, o = r * i, s = o * i; + let c = 383397.7725 + 4e-3 * i, l = 0.055545526 - 16e-9 * i; + const d = 5.15668983 * RadiansPerDegree; + let f = -8e-5 * i + 0.02966 * r - 42e-6 * o - 13e-8 * s; + const h = 83.35324312 * RadiansPerDegree; + let p = 146434202669e-4 * i - 38.2702 * r - 0.045047 * o + 21301e-8 * s; + const m = 125.04455501 * RadiansPerDegree; + let _ = -69679193631e-4 * i + 6.3602 * r + 7625e-6 * o - 3586e-8 * s; + const y = 218.31664563 * RadiansPerDegree; + let C = 17325593434847e-4 * i - 6.391 * r + 6588e-6 * o - 3169e-8 * s; + const T = 297.85019547 * RadiansPerDegree + RadiansPerArcSecond * (1602961601209e-3 * i - 6.3706 * r + 6593e-6 * o - 3169e-8 * s), x = 93.27209062 * RadiansPerDegree + RadiansPerArcSecond * (17395272628478e-4 * i - 12.7512 * r - 1037e-6 * o + 417e-8 * s), b = 134.96340251 * RadiansPerDegree + RadiansPerArcSecond * (17179159232178e-4 * i + 31.8792 * r + 0.051635 * o - 2447e-7 * s), S = 357.52910918 * RadiansPerDegree + RadiansPerArcSecond * (1295965810481e-4 * i - 0.5532 * r + 136e-6 * o - 1149e-8 * s), E = 310.17137918 * RadiansPerDegree - RadiansPerArcSecond * (6967051436e-3 * i + 6.2068 * r + 7618e-6 * o - 3219e-8 * s), A = 2 * T, D = 4 * T, P = 6 * T, I = 2 * b, M = 3 * b, R = 4 * b, L = 2 * x; + c += 3400.4 * Math.cos(A) - 635.6 * Math.cos(A - b) - 235.6 * Math.cos(b) + 218.1 * Math.cos(A - S) + 181 * Math.cos(A + b), l += 0.014216 * Math.cos(A - b) + 8551e-6 * Math.cos(A - I) - 1383e-6 * Math.cos(b) + 1356e-6 * Math.cos(A + b) - 1147e-6 * Math.cos(D - M) - 914e-6 * Math.cos(D - I) + 869e-6 * Math.cos(A - S - b) - 627e-6 * Math.cos(A) - 394e-6 * Math.cos(D - R) + 282e-6 * Math.cos(A - S - I) - 279e-6 * Math.cos(T - b) - 236e-6 * Math.cos(I) + 231e-6 * Math.cos(D) + 229e-6 * Math.cos(P - R) - 201e-6 * Math.cos(I - L), f += 486.26 * Math.cos(A - L) - 40.13 * Math.cos(A) + 37.51 * Math.cos(L) + 25.73 * Math.cos(I - L) + 19.97 * Math.cos(A - S - L), p += -55609 * Math.sin(A - b) - 34711 * Math.sin(A - I) - 9792 * Math.sin(b) + 9385 * Math.sin(D - M) + 7505 * Math.sin(D - I) + 5318 * Math.sin(A + b) + 3484 * Math.sin(D - R) - 3417 * Math.sin(A - S - b) - 2530 * Math.sin(P - R) - 2376 * Math.sin(A) - 2075 * Math.sin(A - M) - 1883 * Math.sin(I) - 1736 * Math.sin(P - 5 * b) + 1626 * Math.sin(S) - 1370 * Math.sin(P - M), _ += -5392 * Math.sin(A - L) - 540 * Math.sin(S) - 441 * Math.sin(A) + 423 * Math.sin(L) - 288 * Math.sin(I - L), C += -3332.9 * Math.sin(A) + 1197.4 * Math.sin(A - b) - 662.5 * Math.sin(S) + 396.3 * Math.sin(b) - 218 * Math.sin(A - S); + const g = 2 * E, w = 3 * E; + f += 46.997 * Math.cos(E) * i - 0.614 * Math.cos(A - L + E) * i + 0.614 * Math.cos(A - L - E) * i - 0.0297 * Math.cos(g) * r - 0.0335 * Math.cos(E) * r + 12e-4 * Math.cos(A - L + g) * r - 16e-5 * Math.cos(E) * o + 4e-5 * Math.cos(w) * o + 4e-5 * Math.cos(g) * o; + const O = 2.116 * Math.sin(E) * i - 0.111 * Math.sin(A - L - E) * i - 15e-4 * Math.sin(E) * r; + p += O, C += O, _ += -520.77 * Math.sin(E) * i + 13.66 * Math.sin(A - L + E) * i + 1.12 * Math.sin(A - E) * i - 1.06 * Math.sin(L - E) * i + 0.66 * Math.sin(g) * r + 0.371 * Math.sin(E) * r - 0.035 * Math.sin(A - L + g) * r - 0.015 * Math.sin(A - L + E) * r + 14e-4 * Math.sin(E) * o - 11e-4 * Math.sin(w) * o - 9e-4 * Math.sin(g) * o, c *= MetersPerKilometer; + const N = d + f * RadiansPerArcSecond, F = h + p * RadiansPerArcSecond, B = y + C * RadiansPerArcSecond, V = m + _ * RadiansPerArcSecond; + return elementsToCartesian( + c, + l, + N, + F, + V, + B, + t + ); +} +const moonEarthMassRatio = 0.012300034, factor = moonEarthMassRatio / (moonEarthMassRatio + 1) * -1; +function computeSimonEarth(e, t) { + return t = computeSimonMoon(e, t), Cartesian3.multiplyByScalar(t, factor, t); +} +const axesTransformation = new Matrix3( + 1.0000000000000002, + 5619723173785822e-31, + 4690511510146299e-34, + -5154129427414611e-31, + 0.9174820620691819, + -0.39777715593191376, + -223970096136568e-30, + 0.39777715593191376, + 0.9174820620691819 +); +let translation$1 = new Cartesian3(); +Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame = function(e, t) { + return defined(e) || (e = JulianDate.now()), defined(t) || (t = new Cartesian3()), translation$1 = computeSimonEarthMoonBarycenter(e, translation$1), t = Cartesian3.negate(translation$1, t), computeSimonEarth(e, translation$1), Cartesian3.subtract(t, translation$1, t), Matrix3.multiplyByVector(axesTransformation, t, t), t; +}; +Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(e, t) { + return defined(e) || (e = JulianDate.now()), t = computeSimonMoon(e, t), Matrix3.multiplyByVector(axesTransformation, t, t), t; +}; +const SceneMode = { + /** + * Morphing between mode, e.g., 3D to 2D. + * + * @type {number} + * @constant + */ + MORPHING: 0, + /** + * Columbus View mode. A 2.5D perspective view where the map is laid out + * flat and objects with non-zero height are drawn above it. + * + * @type {number} + * @constant + */ + COLUMBUS_VIEW: 1, + /** + * 2D mode. The map is viewed top-down with an orthographic projection. + * + * @type {number} + * @constant + */ + SCENE2D: 2, + /** + * 3D mode. A traditional 3D perspective view of the globe. + * + * @type {number} + * @constant + */ + SCENE3D: 3 +}; +SceneMode.getMorphTime = function(e) { + return e === SceneMode.SCENE3D ? 1 : e === SceneMode.MORPHING ? void 0 : 0; +}; +const SceneMode$1 = Object.freeze(SceneMode); +function SunLight(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.color = Color.clone(defaultValue(e.color, Color.WHITE)), this.intensity = defaultValue(e.intensity, 2); +} +function UniformState() { + this.globeDepthTexture = void 0, this.gamma = void 0, this._viewport = new BoundingRectangle(), this._viewportCartesian4 = new Cartesian4(), this._viewportDirty = !1, this._viewportOrthographicMatrix = Matrix4.clone(Matrix4.IDENTITY), this._viewportTransformation = Matrix4.clone(Matrix4.IDENTITY), this._model = Matrix4.clone(Matrix4.IDENTITY), this._view = Matrix4.clone(Matrix4.IDENTITY), this._inverseView = Matrix4.clone(Matrix4.IDENTITY), this._projection = Matrix4.clone(Matrix4.IDENTITY), this._infiniteProjection = Matrix4.clone(Matrix4.IDENTITY), this._entireFrustum = new Cartesian2(), this._currentFrustum = new Cartesian2(), this._frustumPlanes = new Cartesian4(), this._farDepthFromNearPlusOne = void 0, this._log2FarDepthFromNearPlusOne = void 0, this._oneOverLog2FarDepthFromNearPlusOne = void 0, this._frameState = void 0, this._temeToPseudoFixed = Matrix3.clone(Matrix4.IDENTITY), this._view3DDirty = !0, this._view3D = new Matrix4(), this._inverseView3DDirty = !0, this._inverseView3D = new Matrix4(), this._inverseModelDirty = !0, this._inverseModel = new Matrix4(), this._inverseTransposeModelDirty = !0, this._inverseTransposeModel = new Matrix3(), this._viewRotation = new Matrix3(), this._inverseViewRotation = new Matrix3(), this._viewRotation3D = new Matrix3(), this._inverseViewRotation3D = new Matrix3(), this._inverseProjectionDirty = !0, this._inverseProjection = new Matrix4(), this._modelViewDirty = !0, this._modelView = new Matrix4(), this._modelView3DDirty = !0, this._modelView3D = new Matrix4(), this._modelViewRelativeToEyeDirty = !0, this._modelViewRelativeToEye = new Matrix4(), this._inverseModelViewDirty = !0, this._inverseModelView = new Matrix4(), this._inverseModelView3DDirty = !0, this._inverseModelView3D = new Matrix4(), this._viewProjectionDirty = !0, this._viewProjection = new Matrix4(), this._inverseViewProjectionDirty = !0, this._inverseViewProjection = new Matrix4(), this._modelViewProjectionDirty = !0, this._modelViewProjection = new Matrix4(), this._inverseModelViewProjectionDirty = !0, this._inverseModelViewProjection = new Matrix4(), this._modelViewProjectionRelativeToEyeDirty = !0, this._modelViewProjectionRelativeToEye = new Matrix4(), this._modelViewInfiniteProjectionDirty = !0, this._modelViewInfiniteProjection = new Matrix4(), this._normalDirty = !0, this._normal = new Matrix3(), this._normal3DDirty = !0, this._normal3D = new Matrix3(), this._inverseNormalDirty = !0, this._inverseNormal = new Matrix3(), this._inverseNormal3DDirty = !0, this._inverseNormal3D = new Matrix3(), this._encodedCameraPositionMCDirty = !0, this._encodedCameraPositionMC = new EncodedCartesian3(), this._cameraPosition = new Cartesian3(), this._sunPositionWC = new Cartesian3(), this._sunPositionColumbusView = new Cartesian3(), this._sunDirectionWC = new Cartesian3(), this._sunDirectionEC = new Cartesian3(), this._moonDirectionEC = new Cartesian3(), this._lightDirectionWC = new Cartesian3(), this._lightDirectionEC = new Cartesian3(), this._lightColor = new Cartesian3(), this._lightColorHdr = new Cartesian3(), this._pass = void 0, this._mode = void 0, this._mapProjection = void 0, this._ellipsoid = void 0, this._cameraDirection = new Cartesian3(), this._cameraRight = new Cartesian3(), this._cameraUp = new Cartesian3(), this._frustum2DWidth = 0, this._eyeHeight = 0, this._eyeHeight2D = new Cartesian2(), this._eyeEllipsoidNormalEC = new Cartesian3(), this._eyeEllipsoidCurvature = new Cartesian2(), this._modelToEnu = new Matrix4(), this._enuToModel = new Matrix4(), this._pixelRatio = 1, this._orthographicIn3D = !1, this._backgroundColor = new Color(), this._brdfLut = void 0, this._environmentMap = void 0, this._sphericalHarmonicCoefficients = void 0, this._specularEnvironmentMaps = void 0, this._specularEnvironmentMapsMaximumLOD = void 0, this._fogDensity = void 0, this._fogMinimumBrightness = void 0, this._atmosphereHsbShift = void 0, this._atmosphereLightIntensity = void 0, this._atmosphereRayleighCoefficient = new Cartesian3(), this._atmosphereRayleighScaleHeight = new Cartesian3(), this._atmosphereMieCoefficient = new Cartesian3(), this._atmosphereMieScaleHeight = void 0, this._atmosphereMieAnisotropy = void 0, this._atmosphereDynamicLighting = void 0, this._invertClassificationColor = void 0, this._splitPosition = 0, this._pixelSizePerMeter = void 0, this._geometricToleranceOverMeter = void 0, this._minimumDisableDepthTestDistance = void 0; +} +Object.defineProperties(UniformState.prototype, { + /** + * @memberof UniformState.prototype + * @type {FrameState} + * @readonly + */ + frameState: { + get: function() { + return this._frameState; + } + }, + /** + * @memberof UniformState.prototype + * @type {BoundingRectangle} + */ + viewport: { + get: function() { + return this._viewport; + }, + set: function(e) { + if (!BoundingRectangle.equals(e, this._viewport)) { + BoundingRectangle.clone(e, this._viewport); + const t = this._viewport, n = this._viewportCartesian4; + n.x = t.x, n.y = t.y, n.z = t.width, n.w = t.height, this._viewportDirty = !0; + } + } + }, + /** + * @memberof UniformState.prototype + * @private + */ + viewportCartesian4: { + get: function() { + return this._viewportCartesian4; + } + }, + viewportOrthographic: { + get: function() { + return cleanViewport(this), this._viewportOrthographicMatrix; + } + }, + viewportTransformation: { + get: function() { + return cleanViewport(this), this._viewportTransformation; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + model: { + get: function() { + return this._model; + }, + set: function(e) { + Matrix4.clone(e, this._model), this._modelView3DDirty = !0, this._inverseModelView3DDirty = !0, this._inverseModelDirty = !0, this._inverseTransposeModelDirty = !0, this._modelViewDirty = !0, this._inverseModelViewDirty = !0, this._modelViewRelativeToEyeDirty = !0, this._inverseModelViewDirty = !0, this._modelViewProjectionDirty = !0, this._inverseModelViewProjectionDirty = !0, this._modelViewProjectionRelativeToEyeDirty = !0, this._modelViewInfiniteProjectionDirty = !0, this._normalDirty = !0, this._inverseNormalDirty = !0, this._normal3DDirty = !0, this._inverseNormal3DDirty = !0, this._encodedCameraPositionMCDirty = !0; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseModel: { + get: function() { + return this._inverseModelDirty && (this._inverseModelDirty = !1, Matrix4.inverse(this._model, this._inverseModel)), this._inverseModel; + } + }, + /** + * @memberof UniformState.prototype + * @private + */ + inverseTransposeModel: { + get: function() { + const e = this._inverseTransposeModel; + return this._inverseTransposeModelDirty && (this._inverseTransposeModelDirty = !1, Matrix4.getMatrix3(this.inverseModel, e), Matrix3.transpose(e, e)), e; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + view: { + get: function() { + return this._view; + } + }, + /** + * The 3D view matrix. In 3D mode, this is identical to {@link UniformState#view}, + * but in 2D and Columbus View it is a synthetic matrix based on the equivalent position + * of the camera in the 3D world. + * @memberof UniformState.prototype + * @type {Matrix4} + */ + view3D: { + get: function() { + return updateView3D(this), this._view3D; + } + }, + /** + * The 3x3 rotation matrix of the current view matrix ({@link UniformState#view}). + * @memberof UniformState.prototype + * @type {Matrix3} + */ + viewRotation: { + get: function() { + return updateView3D(this), this._viewRotation; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix3} + */ + viewRotation3D: { + get: function() { + return updateView3D(this), this._viewRotation3D; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseView: { + get: function() { + return this._inverseView; + } + }, + /** + * the 4x4 inverse-view matrix that transforms from eye to 3D world coordinates. In 3D mode, this is + * identical to {@link UniformState#inverseView}, but in 2D and Columbus View it is a synthetic matrix + * based on the equivalent position of the camera in the 3D world. + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseView3D: { + get: function() { + return updateInverseView3D(this), this._inverseView3D; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix3} + */ + inverseViewRotation: { + get: function() { + return this._inverseViewRotation; + } + }, + /** + * The 3x3 rotation matrix of the current 3D inverse-view matrix ({@link UniformState#inverseView3D}). + * @memberof UniformState.prototype + * @type {Matrix3} + */ + inverseViewRotation3D: { + get: function() { + return updateInverseView3D(this), this._inverseViewRotation3D; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + projection: { + get: function() { + return this._projection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseProjection: { + get: function() { + return cleanInverseProjection(this), this._inverseProjection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + infiniteProjection: { + get: function() { + return this._infiniteProjection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelView: { + get: function() { + return cleanModelView(this), this._modelView; + } + }, + /** + * The 3D model-view matrix. In 3D mode, this is equivalent to {@link UniformState#modelView}. In 2D and + * Columbus View, however, it is a synthetic matrix based on the equivalent position of the camera in the 3D world. + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelView3D: { + get: function() { + return cleanModelView3D(this), this._modelView3D; + } + }, + /** + * Model-view relative to eye matrix. + * + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelViewRelativeToEye: { + get: function() { + return cleanModelViewRelativeToEye(this), this._modelViewRelativeToEye; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseModelView: { + get: function() { + return cleanInverseModelView(this), this._inverseModelView; + } + }, + /** + * The inverse of the 3D model-view matrix. In 3D mode, this is equivalent to {@link UniformState#inverseModelView}. + * In 2D and Columbus View, however, it is a synthetic matrix based on the equivalent position of the camera in the 3D world. + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseModelView3D: { + get: function() { + return cleanInverseModelView3D(this), this._inverseModelView3D; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + viewProjection: { + get: function() { + return cleanViewProjection(this), this._viewProjection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseViewProjection: { + get: function() { + return cleanInverseViewProjection(this), this._inverseViewProjection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelViewProjection: { + get: function() { + return cleanModelViewProjection(this), this._modelViewProjection; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + inverseModelViewProjection: { + get: function() { + return cleanInverseModelViewProjection(this), this._inverseModelViewProjection; + } + }, + /** + * Model-view-projection relative to eye matrix. + * + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelViewProjectionRelativeToEye: { + get: function() { + return cleanModelViewProjectionRelativeToEye(this), this._modelViewProjectionRelativeToEye; + } + }, + /** + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelViewInfiniteProjection: { + get: function() { + return cleanModelViewInfiniteProjection(this), this._modelViewInfiniteProjection; + } + }, + /** + * A 3x3 normal transformation matrix that transforms normal vectors in model coordinates to + * eye coordinates. + * @memberof UniformState.prototype + * @type {Matrix3} + */ + normal: { + get: function() { + return cleanNormal(this), this._normal; + } + }, + /** + * A 3x3 normal transformation matrix that transforms normal vectors in 3D model + * coordinates to eye coordinates. In 3D mode, this is identical to + * {@link UniformState#normal}, but in 2D and Columbus View it represents the normal transformation + * matrix as if the camera were at an equivalent location in 3D mode. + * @memberof UniformState.prototype + * @type {Matrix3} + */ + normal3D: { + get: function() { + return cleanNormal3D(this), this._normal3D; + } + }, + /** + * An inverse 3x3 normal transformation matrix that transforms normal vectors in model coordinates + * to eye coordinates. + * @memberof UniformState.prototype + * @type {Matrix3} + */ + inverseNormal: { + get: function() { + return cleanInverseNormal(this), this._inverseNormal; + } + }, + /** + * An inverse 3x3 normal transformation matrix that transforms normal vectors in eye coordinates + * to 3D model coordinates. In 3D mode, this is identical to + * {@link UniformState#inverseNormal}, but in 2D and Columbus View it represents the normal transformation + * matrix as if the camera were at an equivalent location in 3D mode. + * @memberof UniformState.prototype + * @type {Matrix3} + */ + inverseNormal3D: { + get: function() { + return cleanInverseNormal3D(this), this._inverseNormal3D; + } + }, + /** + * The near distance (x) and the far distance (y) of the frustum defined by the camera. + * This is the largest possible frustum, not an individual frustum used for multi-frustum rendering. + * @memberof UniformState.prototype + * @type {Cartesian2} + */ + entireFrustum: { + get: function() { + return this._entireFrustum; + } + }, + /** + * The near distance (x) and the far distance (y) of the frustum defined by the camera. + * This is the individual frustum used for multi-frustum rendering. + * @memberof UniformState.prototype + * @type {Cartesian2} + */ + currentFrustum: { + get: function() { + return this._currentFrustum; + } + }, + /** + * The distances to the frustum planes. The top, bottom, left and right distances are + * the x, y, z, and w components, respectively. + * @memberof UniformState.prototype + * @type {Cartesian4} + */ + frustumPlanes: { + get: function() { + return this._frustumPlanes; + } + }, + /** + * The far plane's distance from the near plane, plus 1.0. + * + * @memberof UniformState.prototype + * @type {number} + */ + farDepthFromNearPlusOne: { + get: function() { + return this._farDepthFromNearPlusOne; + } + }, + /** + * The log2 of {@link UniformState#farDepthFromNearPlusOne}. + * + * @memberof UniformState.prototype + * @type {number} + */ + log2FarDepthFromNearPlusOne: { + get: function() { + return this._log2FarDepthFromNearPlusOne; + } + }, + /** + * 1.0 divided by {@link UniformState#log2FarDepthFromNearPlusOne}. + * + * @memberof UniformState.prototype + * @type {number} + */ + oneOverLog2FarDepthFromNearPlusOne: { + get: function() { + return this._oneOverLog2FarDepthFromNearPlusOne; + } + }, + /** + * The height in meters of the eye (camera) above or below the ellipsoid. + * @memberof UniformState.prototype + * @type {number} + */ + eyeHeight: { + get: function() { + return this._eyeHeight; + } + }, + /** + * The height (x) and the height squared (y) + * in meters of the eye (camera) above the 2D world plane. This uniform is only valid + * when the {@link SceneMode} is SCENE2D. + * @memberof UniformState.prototype + * @type {Cartesian2} + */ + eyeHeight2D: { + get: function() { + return this._eyeHeight2D; + } + }, + /** + * The ellipsoid surface normal at the camera position, in model coordinates. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + eyeEllipsoidNormalEC: { + get: function() { + return this._eyeEllipsoidNormalEC; + } + }, + /** + * The ellipsoid radii of curvature at the camera position. + * The .x component is the prime vertical radius, .y is the meridional. + * @memberof UniformState.prototype + * @type {Cartesian2} + */ + eyeEllipsoidCurvature: { + get: function() { + return this._eyeEllipsoidCurvature; + } + }, + /** + * A transform from model coordinates to an east-north-up coordinate system + * centered at the position on the ellipsoid below the camera + * @memberof UniformState.prototype + * @type {Matrix4} + */ + modelToEnu: { + get: function() { + return this._modelToEnu; + } + }, + /** + * The inverse of {@link UniformState.prototype.modelToEnu} + * @memberof UniformState.prototype + * @type {Matrix4} + */ + enuToModel: { + get: function() { + return this._enuToModel; + } + }, + /** + * The sun position in 3D world coordinates at the current scene time. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + sunPositionWC: { + get: function() { + return this._sunPositionWC; + } + }, + /** + * The sun position in 2D world coordinates at the current scene time. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + sunPositionColumbusView: { + get: function() { + return this._sunPositionColumbusView; + } + }, + /** + * A normalized vector to the sun in 3D world coordinates at the current scene time. Even in 2D or + * Columbus View mode, this returns the direction to the sun in the 3D scene. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + sunDirectionWC: { + get: function() { + return this._sunDirectionWC; + } + }, + /** + * A normalized vector to the sun in eye coordinates at the current scene time. In 3D mode, this + * returns the actual vector from the camera position to the sun position. In 2D and Columbus View, it returns + * the vector from the equivalent 3D camera position to the position of the sun in the 3D scene. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + sunDirectionEC: { + get: function() { + return this._sunDirectionEC; + } + }, + /** + * A normalized vector to the moon in eye coordinates at the current scene time. In 3D mode, this + * returns the actual vector from the camera position to the moon position. In 2D and Columbus View, it returns + * the vector from the equivalent 3D camera position to the position of the moon in the 3D scene. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + moonDirectionEC: { + get: function() { + return this._moonDirectionEC; + } + }, + /** + * A normalized vector to the scene's light source in 3D world coordinates. Even in 2D or + * Columbus View mode, this returns the direction to the light in the 3D scene. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + lightDirectionWC: { + get: function() { + return this._lightDirectionWC; + } + }, + /** + * A normalized vector to the scene's light source in eye coordinates. In 3D mode, this + * returns the actual vector from the camera position to the light. In 2D and Columbus View, it returns + * the vector from the equivalent 3D camera position in the 3D scene. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + lightDirectionEC: { + get: function() { + return this._lightDirectionEC; + } + }, + /** + * The color of light emitted by the scene's light source. This is equivalent to the light + * color multiplied by the light intensity limited to a maximum luminance of 1.0 suitable + * for non-HDR lighting. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + lightColor: { + get: function() { + return this._lightColor; + } + }, + /** + * The high dynamic range color of light emitted by the scene's light source. This is equivalent to + * the light color multiplied by the light intensity suitable for HDR lighting. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + lightColorHdr: { + get: function() { + return this._lightColorHdr; + } + }, + /** + * The high bits of the camera position. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + encodedCameraPositionMCHigh: { + get: function() { + return cleanEncodedCameraPositionMC(this), this._encodedCameraPositionMC.high; + } + }, + /** + * The low bits of the camera position. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + encodedCameraPositionMCLow: { + get: function() { + return cleanEncodedCameraPositionMC(this), this._encodedCameraPositionMC.low; + } + }, + /** + * A 3x3 matrix that transforms from True Equator Mean Equinox (TEME) axes to the + * pseudo-fixed axes at the Scene's current time. + * @memberof UniformState.prototype + * @type {Matrix3} + */ + temeToPseudoFixedMatrix: { + get: function() { + return this._temeToPseudoFixed; + } + }, + /** + * Gets the scaling factor for transforming from the canvas + * pixel space to canvas coordinate space. + * @memberof UniformState.prototype + * @type {number} + */ + pixelRatio: { + get: function() { + return this._pixelRatio; + } + }, + /** + * A scalar used to mix a color with the fog color based on the distance to the camera. + * @memberof UniformState.prototype + * @type {number} + */ + fogDensity: { + get: function() { + return this._fogDensity; + } + }, + /** + * A scalar used as a minimum value when brightening fog + * @memberof UniformState.prototype + * @type {number} + */ + fogMinimumBrightness: { + get: function() { + return this._fogMinimumBrightness; + } + }, + /** + * A color shift to apply to the atmosphere color in HSB. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + atmosphereHsbShift: { + get: function() { + return this._atmosphereHsbShift; + } + }, + /** + * The intensity of the light that is used for computing the atmosphere color + * @memberof UniformState.prototype + * @type {number} + */ + atmosphereLightIntensity: { + get: function() { + return this._atmosphereLightIntensity; + } + }, + /** + * The Rayleigh scattering coefficient used in the atmospheric scattering equations for the sky atmosphere. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + atmosphereRayleighCoefficient: { + get: function() { + return this._atmosphereRayleighCoefficient; + } + }, + /** + * The Rayleigh scale height used in the atmospheric scattering equations for the sky atmosphere, in meters. + * @memberof UniformState.prototype + * @type {number} + */ + atmosphereRayleighScaleHeight: { + get: function() { + return this._atmosphereRayleighScaleHeight; + } + }, + /** + * The Mie scattering coefficient used in the atmospheric scattering equations for the sky atmosphere. + * @memberof UniformState.prototype + * @type {Cartesian3} + */ + atmosphereMieCoefficient: { + get: function() { + return this._atmosphereMieCoefficient; + } + }, + /** + * The Mie scale height used in the atmospheric scattering equations for the sky atmosphere, in meters. + * @memberof UniformState.prototype + * @type {number} + */ + atmosphereMieScaleHeight: { + get: function() { + return this._atmosphereMieScaleHeight; + } + }, + /** + * The anisotropy of the medium to consider for Mie scattering. + * @memberof UniformState.prototype + * @type {number} + */ + atmosphereMieAnisotropy: { + get: function() { + return this._atmosphereMieAnisotropy; + } + }, + /** + * Which light source to use for dynamically lighting the atmosphere + * + * @memberof UniformState.prototype + * @type {DynamicAtmosphereLightingType} + */ + atmosphereDynamicLighting: { + get: function() { + return this._atmosphereDynamicLighting; + } + }, + /** + * A scalar that represents the geometric tolerance per meter + * @memberof UniformState.prototype + * @type {number} + */ + geometricToleranceOverMeter: { + get: function() { + return this._geometricToleranceOverMeter; + } + }, + /** + * @memberof UniformState.prototype + * @type {Pass} + */ + pass: { + get: function() { + return this._pass; + } + }, + /** + * The current background color + * @memberof UniformState.prototype + * @type {Color} + */ + backgroundColor: { + get: function() { + return this._backgroundColor; + } + }, + /** + * The look up texture used to find the BRDF for a material + * @memberof UniformState.prototype + * @type {Texture} + */ + brdfLut: { + get: function() { + return this._brdfLut; + } + }, + /** + * The environment map of the scene + * @memberof UniformState.prototype + * @type {CubeMap} + */ + environmentMap: { + get: function() { + return this._environmentMap; + } + }, + /** + * The spherical harmonic coefficients of the scene. + * @memberof UniformState.prototype + * @type {Cartesian3[]} + */ + sphericalHarmonicCoefficients: { + get: function() { + return this._sphericalHarmonicCoefficients; + } + }, + /** + * The specular environment cube map of the scene. + * @memberof UniformState.prototype + * @type {Texture} + */ + specularEnvironmentMaps: { + get: function() { + return this._specularEnvironmentMaps; + } + }, + /** + * The maximum level-of-detail of the specular environment cube map of the scene. + * @memberof UniformState.prototype + * @type {number} + */ + specularEnvironmentMapsMaximumLOD: { + get: function() { + return this._specularEnvironmentMapsMaximumLOD; + } + }, + /** + * The splitter position to use when rendering with a splitter. This will be in pixel coordinates relative to the canvas. + * @memberof UniformState.prototype + * @type {number} + */ + splitPosition: { + get: function() { + return this._splitPosition; + } + }, + /** + * The distance from the camera at which to disable the depth test of billboards, labels and points + * to, for example, prevent clipping against terrain. When set to zero, the depth test should always + * be applied. When less than zero, the depth test should never be applied. + * + * @memberof UniformState.prototype + * @type {number} + */ + minimumDisableDepthTestDistance: { + get: function() { + return this._minimumDisableDepthTestDistance; + } + }, + /** + * The highlight color of unclassified 3D Tiles. + * + * @memberof UniformState.prototype + * @type {Color} + */ + invertClassificationColor: { + get: function() { + return this._invertClassificationColor; + } + }, + /** + * Whether or not the current projection is orthographic in 3D. + * + * @memberOf UniformState.prototype + * @type {boolean} + */ + orthographicIn3D: { + get: function() { + return this._orthographicIn3D; + } + }, + /** + * The current ellipsoid. + * + * @memberOf UniformState.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return defaultValue(this._ellipsoid, Ellipsoid.default); + } + } +}); +function setView(e, t) { + Matrix4.clone(t, e._view), Matrix4.getMatrix3(t, e._viewRotation), e._view3DDirty = !0, e._inverseView3DDirty = !0, e._modelViewDirty = !0, e._modelView3DDirty = !0, e._modelViewRelativeToEyeDirty = !0, e._inverseModelViewDirty = !0, e._inverseModelView3DDirty = !0, e._viewProjectionDirty = !0, e._inverseViewProjectionDirty = !0, e._modelViewProjectionDirty = !0, e._modelViewProjectionRelativeToEyeDirty = !0, e._modelViewInfiniteProjectionDirty = !0, e._normalDirty = !0, e._inverseNormalDirty = !0, e._normal3DDirty = !0, e._inverseNormal3DDirty = !0; +} +function setInverseView(e, t) { + Matrix4.clone(t, e._inverseView), Matrix4.getMatrix3(t, e._inverseViewRotation); +} +function setProjection(e, t) { + Matrix4.clone(t, e._projection), e._inverseProjectionDirty = !0, e._viewProjectionDirty = !0, e._inverseViewProjectionDirty = !0, e._modelViewProjectionDirty = !0, e._modelViewProjectionRelativeToEyeDirty = !0; +} +function setInfiniteProjection(e, t) { + Matrix4.clone(t, e._infiniteProjection), e._modelViewInfiniteProjectionDirty = !0; +} +const surfacePositionScratch = new Cartesian3(), enuTransformScratch = new Matrix4(); +function setCamera(e, t) { + Cartesian3.clone(t.positionWC, e._cameraPosition), Cartesian3.clone(t.directionWC, e._cameraDirection), Cartesian3.clone(t.rightWC, e._cameraRight), Cartesian3.clone(t.upWC, e._cameraUp); + const n = e._ellipsoid; + let i; + const r = t.positionCartographic; + if (defined(r) ? (e._eyeHeight = r.height, e._eyeEllipsoidNormalEC = n.geodeticSurfaceNormalCartographic( + r, + e._eyeEllipsoidNormalEC + ), i = Cartesian3.fromRadians( + r.longitude, + r.latitude, + 0, + n, + surfacePositionScratch + )) : (e._eyeHeight = -n.maximumRadius, Cartesian3.magnitude(t.positionWC) > 0 && (e._eyeEllipsoidNormalEC = Cartesian3.normalize( + t.positionWC, + e._eyeEllipsoidNormalEC + )), i = n.scaleToGeodeticSurface( + t.positionWC, + surfacePositionScratch + )), e._encodedCameraPositionMCDirty = !0, !defined(i)) + return; + e._eyeEllipsoidNormalEC = Matrix3.multiplyByVector( + e._viewRotation, + e._eyeEllipsoidNormalEC, + e._eyeEllipsoidNormalEC + ); + const o = Transforms.eastNorthUpToFixedFrame( + i, + n, + enuTransformScratch + ); + e._enuToModel = Matrix4.multiplyTransformation( + e.inverseModel, + o, + e._enuToModel + ), e._modelToEnu = Matrix4.inverseTransformation( + e._enuToModel, + e._modelToEnu + ), CesiumMath.equalsEpsilon( + n._radii.x, + n._radii.y, + CesiumMath.EPSILON15 + ) && (e._eyeEllipsoidCurvature = n.getLocalCurvature( + i, + e._eyeEllipsoidCurvature + )); +} +const transformMatrix = new Matrix3(), sunCartographicScratch = new Cartographic(); +function setSunAndMoonDirections(e, t) { + Transforms.computeIcrfToCentralBodyFixedMatrix( + t.time, + transformMatrix + ); + let n = Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame( + t.time, + e._sunPositionWC + ); + Matrix3.multiplyByVector(transformMatrix, n, n), Cartesian3.normalize(n, e._sunDirectionWC), n = Matrix3.multiplyByVector( + e.viewRotation3D, + n, + e._sunDirectionEC + ), Cartesian3.normalize(n, n), n = Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame( + t.time, + e._moonDirectionEC + ), Matrix3.multiplyByVector(transformMatrix, n, n), Matrix3.multiplyByVector(e.viewRotation3D, n, n), Cartesian3.normalize(n, n); + const i = t.mapProjection, o = i.ellipsoid.cartesianToCartographic( + e._sunPositionWC, + sunCartographicScratch + ); + i.project(o, e._sunPositionColumbusView); +} +UniformState.prototype.updateCamera = function(e) { + setView(this, e.viewMatrix), setInverseView(this, e.inverseViewMatrix), setCamera(this, e), this._entireFrustum.x = e.frustum.near, this._entireFrustum.y = e.frustum.far, this.updateFrustum(e.frustum), this._orthographicIn3D = this._mode !== SceneMode$1.SCENE2D && e.frustum instanceof OrthographicFrustum; +}; +UniformState.prototype.updateFrustum = function(e) { + setProjection(this, e.projectionMatrix), defined(e.infiniteProjectionMatrix) && setInfiniteProjection(this, e.infiniteProjectionMatrix), this._currentFrustum.x = e.near, this._currentFrustum.y = e.far, this._farDepthFromNearPlusOne = e.far - e.near + 1, this._log2FarDepthFromNearPlusOne = CesiumMath.log2( + this._farDepthFromNearPlusOne + ), this._oneOverLog2FarDepthFromNearPlusOne = 1 / this._log2FarDepthFromNearPlusOne; + const t = e.offCenterFrustum; + defined(t) && (e = t), this._frustumPlanes.x = e.top, this._frustumPlanes.y = e.bottom, this._frustumPlanes.z = e.left, this._frustumPlanes.w = e.right; +}; +UniformState.prototype.updatePass = function(e) { + this._pass = e; +}; +const EMPTY_ARRAY = [], defaultLight = new SunLight(); +UniformState.prototype.update = function(e) { + this._mode = e.mode, this._mapProjection = e.mapProjection, this._ellipsoid = e.mapProjection.ellipsoid, this._pixelRatio = e.pixelRatio; + const t = e.camera; + this.updateCamera(t), e.mode === SceneMode$1.SCENE2D ? (this._frustum2DWidth = t.frustum.right - t.frustum.left, this._eyeHeight2D.x = this._frustum2DWidth * 0.5, this._eyeHeight2D.y = this._eyeHeight2D.x * this._eyeHeight2D.x) : (this._frustum2DWidth = 0, this._eyeHeight2D.x = 0, this._eyeHeight2D.y = 0), setSunAndMoonDirections(this, e); + const n = defaultValue(e.light, defaultLight); + n instanceof SunLight ? (this._lightDirectionWC = Cartesian3.clone( + this._sunDirectionWC, + this._lightDirectionWC + ), this._lightDirectionEC = Cartesian3.clone( + this._sunDirectionEC, + this._lightDirectionEC + )) : (this._lightDirectionWC = Cartesian3.normalize( + Cartesian3.negate(n.direction, this._lightDirectionWC), + this._lightDirectionWC + ), this._lightDirectionEC = Matrix3.multiplyByVector( + this.viewRotation3D, + this._lightDirectionWC, + this._lightDirectionEC + )); + const i = n.color; + let r = Cartesian3.fromElements( + i.red, + i.green, + i.blue, + this._lightColorHdr + ); + r = Cartesian3.multiplyByScalar( + r, + n.intensity, + r + ); + const o = Cartesian3.maximumComponent(r); + o > 1 ? Cartesian3.divideByScalar( + r, + o, + this._lightColor + ) : Cartesian3.clone(r, this._lightColor); + const s = e.brdfLutGenerator, c = defined(s) ? s.colorTexture : void 0; + this._brdfLut = c, this._environmentMap = defaultValue( + e.environmentMap, + e.context.defaultCubeMap + ), this._sphericalHarmonicCoefficients = defaultValue( + e.sphericalHarmonicCoefficients, + EMPTY_ARRAY + ), this._specularEnvironmentMaps = e.specularEnvironmentMaps, this._specularEnvironmentMapsMaximumLOD = e.specularEnvironmentMapsMaximumLOD, this._fogDensity = e.fog.density, this._fogMinimumBrightness = e.fog.minimumBrightness; + const l = e.atmosphere; + defined(l) && (this._atmosphereHsbShift = Cartesian3.fromElements( + l.hueShift, + l.saturationShift, + l.brightnessShift, + this._atmosphereHsbShift + ), this._atmosphereLightIntensity = l.lightIntensity, this._atmosphereRayleighCoefficient = Cartesian3.clone( + l.rayleighCoefficient, + this._atmosphereRayleighCoefficient + ), this._atmosphereRayleighScaleHeight = l.rayleighScaleHeight, this._atmosphereMieCoefficient = Cartesian3.clone( + l.mieCoefficient, + this._atmosphereMieCoefficient + ), this._atmosphereMieScaleHeight = l.mieScaleHeight, this._atmosphereMieAnisotropy = l.mieAnisotropy, this._atmosphereDynamicLighting = l.dynamicLighting), this._invertClassificationColor = e.invertClassificationColor, this._frameState = e, this._temeToPseudoFixed = Transforms.computeTemeToPseudoFixedMatrix( + e.time, + this._temeToPseudoFixed + ), this._splitPosition = e.splitPosition * e.context.drawingBufferWidth; + const d = t.frustum.fov, f = this._viewport; + let h; + defined(d) ? f.height > f.width ? h = Math.tan(0.5 * d) * 2 / f.height : h = Math.tan(0.5 * d) * 2 / f.width : h = 1 / Math.max(f.width, f.height), this._geometricToleranceOverMeter = h * e.maximumScreenSpaceError, Color.clone(e.backgroundColor, this._backgroundColor), this._minimumDisableDepthTestDistance = e.minimumDisableDepthTestDistance, this._minimumDisableDepthTestDistance *= this._minimumDisableDepthTestDistance, this._minimumDisableDepthTestDistance === Number.POSITIVE_INFINITY && (this._minimumDisableDepthTestDistance = -1); +}; +function cleanViewport(e) { + if (e._viewportDirty) { + const t = e._viewport; + Matrix4.computeOrthographicOffCenter( + t.x, + t.x + t.width, + t.y, + t.y + t.height, + 0, + 1, + e._viewportOrthographicMatrix + ), Matrix4.computeViewportTransformation( + t, + 0, + 1, + e._viewportTransformation + ), e._viewportDirty = !1; + } +} +function cleanInverseProjection(e) { + e._inverseProjectionDirty && (e._inverseProjectionDirty = !1, e._mode !== SceneMode$1.SCENE2D && e._mode !== SceneMode$1.MORPHING && !e._orthographicIn3D ? Matrix4.inverse( + e._projection, + e._inverseProjection + ) : Matrix4.clone(Matrix4.ZERO, e._inverseProjection)); +} +function cleanModelView(e) { + e._modelViewDirty && (e._modelViewDirty = !1, Matrix4.multiplyTransformation( + e._view, + e._model, + e._modelView + )); +} +function cleanModelView3D(e) { + e._modelView3DDirty && (e._modelView3DDirty = !1, Matrix4.multiplyTransformation( + e.view3D, + e._model, + e._modelView3D + )); +} +function cleanInverseModelView(e) { + e._inverseModelViewDirty && (e._inverseModelViewDirty = !1, Matrix4.inverse(e.modelView, e._inverseModelView)); +} +function cleanInverseModelView3D(e) { + e._inverseModelView3DDirty && (e._inverseModelView3DDirty = !1, Matrix4.inverse(e.modelView3D, e._inverseModelView3D)); +} +function cleanViewProjection(e) { + e._viewProjectionDirty && (e._viewProjectionDirty = !1, Matrix4.multiply( + e._projection, + e._view, + e._viewProjection + )); +} +function cleanInverseViewProjection(e) { + e._inverseViewProjectionDirty && (e._inverseViewProjectionDirty = !1, Matrix4.inverse( + e.viewProjection, + e._inverseViewProjection + )); +} +function cleanModelViewProjection(e) { + e._modelViewProjectionDirty && (e._modelViewProjectionDirty = !1, Matrix4.multiply( + e._projection, + e.modelView, + e._modelViewProjection + )); +} +function cleanModelViewRelativeToEye(e) { + if (e._modelViewRelativeToEyeDirty) { + e._modelViewRelativeToEyeDirty = !1; + const t = e.modelView, n = e._modelViewRelativeToEye; + n[0] = t[0], n[1] = t[1], n[2] = t[2], n[3] = t[3], n[4] = t[4], n[5] = t[5], n[6] = t[6], n[7] = t[7], n[8] = t[8], n[9] = t[9], n[10] = t[10], n[11] = t[11], n[12] = 0, n[13] = 0, n[14] = 0, n[15] = t[15]; + } +} +function cleanInverseModelViewProjection(e) { + e._inverseModelViewProjectionDirty && (e._inverseModelViewProjectionDirty = !1, Matrix4.inverse( + e.modelViewProjection, + e._inverseModelViewProjection + )); +} +function cleanModelViewProjectionRelativeToEye(e) { + e._modelViewProjectionRelativeToEyeDirty && (e._modelViewProjectionRelativeToEyeDirty = !1, Matrix4.multiply( + e._projection, + e.modelViewRelativeToEye, + e._modelViewProjectionRelativeToEye + )); +} +function cleanModelViewInfiniteProjection(e) { + e._modelViewInfiniteProjectionDirty && (e._modelViewInfiniteProjectionDirty = !1, Matrix4.multiply( + e._infiniteProjection, + e.modelView, + e._modelViewInfiniteProjection + )); +} +function cleanNormal(e) { + if (e._normalDirty) { + e._normalDirty = !1; + const t = e._normal; + Matrix4.getMatrix3(e.inverseModelView, t), Matrix3.transpose(t, t); + } +} +function cleanNormal3D(e) { + if (e._normal3DDirty) { + e._normal3DDirty = !1; + const t = e._normal3D; + Matrix4.getMatrix3(e.inverseModelView3D, t), Matrix3.transpose(t, t); + } +} +function cleanInverseNormal(e) { + if (e._inverseNormalDirty) { + e._inverseNormalDirty = !1; + const t = e._inverseNormal; + Matrix4.getMatrix3(e.modelView, t), Matrix3.transpose(t, t); + } +} +function cleanInverseNormal3D(e) { + if (e._inverseNormal3DDirty) { + e._inverseNormal3DDirty = !1; + const t = e._inverseNormal3D; + Matrix4.getMatrix3(e.modelView3D, t), Matrix3.transpose(t, t); + } +} +const cameraPositionMC = new Cartesian3(); +function cleanEncodedCameraPositionMC(e) { + e._encodedCameraPositionMCDirty && (e._encodedCameraPositionMCDirty = !1, Matrix4.multiplyByPoint( + e.inverseModel, + e._cameraPosition, + cameraPositionMC + ), EncodedCartesian3.fromCartesian( + cameraPositionMC, + e._encodedCameraPositionMC + )); +} +const view2Dto3DPScratch = new Cartesian3(), view2Dto3DRScratch = new Cartesian3(), view2Dto3DUScratch = new Cartesian3(), view2Dto3DDScratch = new Cartesian3(), view2Dto3DCartographicScratch = new Cartographic(), view2Dto3DCartesian3Scratch = new Cartesian3(), view2Dto3DMatrix4Scratch = new Matrix4(); +function view2Dto3D(e, t, n, i, r, o, s, c) { + const l = view2Dto3DPScratch; + l.x = e.y, l.y = e.z, l.z = e.x; + const d = view2Dto3DRScratch; + d.x = n.y, d.y = n.z, d.z = n.x; + const f = view2Dto3DUScratch; + f.x = i.y, f.y = i.z, f.z = i.x; + const h = view2Dto3DDScratch; + h.x = t.y, h.y = t.z, h.z = t.x, o === SceneMode$1.SCENE2D && (l.z = r * 0.5); + const p = s.unproject(l, view2Dto3DCartographicScratch); + p.longitude = CesiumMath.clamp( + p.longitude, + -Math.PI, + Math.PI + ), p.latitude = CesiumMath.clamp( + p.latitude, + -CesiumMath.PI_OVER_TWO, + CesiumMath.PI_OVER_TWO + ); + const m = s.ellipsoid, _ = m.cartographicToCartesian( + p, + view2Dto3DCartesian3Scratch + ), y = Transforms.eastNorthUpToFixedFrame( + _, + m, + view2Dto3DMatrix4Scratch + ); + return Matrix4.multiplyByPointAsVector(y, d, d), Matrix4.multiplyByPointAsVector(y, f, f), Matrix4.multiplyByPointAsVector(y, h, h), defined(c) || (c = new Matrix4()), c[0] = d.x, c[1] = f.x, c[2] = -h.x, c[3] = 0, c[4] = d.y, c[5] = f.y, c[6] = -h.y, c[7] = 0, c[8] = d.z, c[9] = f.z, c[10] = -h.z, c[11] = 0, c[12] = -Cartesian3.dot(d, _), c[13] = -Cartesian3.dot(f, _), c[14] = Cartesian3.dot(h, _), c[15] = 1, c; +} +function updateView3D(e) { + e._view3DDirty && (e._mode === SceneMode$1.SCENE3D ? Matrix4.clone(e._view, e._view3D) : view2Dto3D( + e._cameraPosition, + e._cameraDirection, + e._cameraRight, + e._cameraUp, + e._frustum2DWidth, + e._mode, + e._mapProjection, + e._view3D + ), Matrix4.getMatrix3(e._view3D, e._viewRotation3D), e._view3DDirty = !1); +} +function updateInverseView3D(e) { + e._inverseView3DDirty && (Matrix4.inverseTransformation(e.view3D, e._inverseView3D), Matrix4.getMatrix3(e._inverseView3D, e._inverseViewRotation3D), e._inverseView3DDirty = !1); +} +function addAttribute(e, t, n, i) { + const r = defined(t.vertexBuffer), o = defined(t.value), s = t.value ? t.value.length : t.componentsPerAttribute, c = { + index: defaultValue(t.index, n), + enabled: defaultValue(t.enabled, !0), + vertexBuffer: t.vertexBuffer, + value: o ? t.value.slice(0) : void 0, + componentsPerAttribute: s, + componentDatatype: defaultValue( + t.componentDatatype, + ComponentDatatype$1.FLOAT + ), + normalize: defaultValue(t.normalize, !1), + offsetInBytes: defaultValue(t.offsetInBytes, 0), + strideInBytes: defaultValue(t.strideInBytes, 0), + instanceDivisor: defaultValue(t.instanceDivisor, 0) + }; + if (r) + c.vertexAttrib = function(l) { + const d = this.index; + l.bindBuffer(l.ARRAY_BUFFER, this.vertexBuffer._getBuffer()), l.vertexAttribPointer( + d, + this.componentsPerAttribute, + this.componentDatatype, + this.normalize, + this.strideInBytes, + this.offsetInBytes + ), l.enableVertexAttribArray(d), this.instanceDivisor > 0 && (i.glVertexAttribDivisor(d, this.instanceDivisor), i._vertexAttribDivisors[d] = this.instanceDivisor, i._previousDrawInstanced = !0); + }, c.disableVertexAttribArray = function(l) { + l.disableVertexAttribArray(this.index), this.instanceDivisor > 0 && i.glVertexAttribDivisor(n, 0); + }; + else { + switch (c.componentsPerAttribute) { + case 1: + c.vertexAttrib = function(l) { + l.vertexAttrib1fv(this.index, this.value); + }; + break; + case 2: + c.vertexAttrib = function(l) { + l.vertexAttrib2fv(this.index, this.value); + }; + break; + case 3: + c.vertexAttrib = function(l) { + l.vertexAttrib3fv(this.index, this.value); + }; + break; + case 4: + c.vertexAttrib = function(l) { + l.vertexAttrib4fv(this.index, this.value); + }; + break; + } + c.disableVertexAttribArray = function(l) { + }; + } + e.push(c); +} +function bind(e, t, n) { + for (let i = 0; i < t.length; ++i) { + const r = t[i]; + r.enabled && r.vertexAttrib(e); + } + defined(n) && e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, n._getBuffer()); +} +function VertexArray(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context, n = t._gl, i = e.attributes, r = e.indexBuffer; + let o; + const s = []; + let c = 1, l = !1, d = !1, f = i.length; + for (o = 0; o < f; ++o) + addAttribute(s, i[o], o, t); + for (f = s.length, o = 0; o < f; ++o) { + const p = s[o]; + if (defined(p.vertexBuffer) && p.instanceDivisor === 0) { + const m = p.strideInBytes || p.componentsPerAttribute * ComponentDatatype$1.getSizeInBytes(p.componentDatatype); + c = p.vertexBuffer.sizeInBytes / m; + break; + } + } + for (o = 0; o < f; ++o) + s[o].instanceDivisor > 0 && (l = !0), defined(s[o].value) && (d = !0); + let h; + t.vertexArrayObject && (h = t.glCreateVertexArray(), t.glBindVertexArray(h), bind(n, s, r), t.glBindVertexArray(null)), this._numberOfVertices = c, this._hasInstancedAttributes = l, this._hasConstantAttributes = d, this._context = t, this._gl = n, this._vao = h, this._attributes = s, this._indexBuffer = r; +} +function computeNumberOfVertices(e) { + return e.values.length / e.componentsPerAttribute; +} +function computeAttributeSizeInBytes(e) { + return ComponentDatatype$1.getSizeInBytes(e.componentDatatype) * e.componentsPerAttribute; +} +function interleaveAttributes(e) { + let t, n, i; + const r = []; + for (n in e) + e.hasOwnProperty(n) && defined(e[n]) && defined(e[n].values) && (r.push(n), e[n].componentDatatype === ComponentDatatype$1.DOUBLE && (e[n].componentDatatype = ComponentDatatype$1.FLOAT, e[n].values = ComponentDatatype$1.createTypedArray( + ComponentDatatype$1.FLOAT, + e[n].values + ))); + let o; + const s = r.length; + if (s > 0) + for (o = computeNumberOfVertices(e[r[0]]), t = 1; t < s; ++t) { + const d = computeNumberOfVertices( + e[r[t]] + ); + if (d !== o) + throw new RuntimeError( + `Each attribute list must have the same number of vertices. Attribute ${r[t]} has a different number of vertices (${d.toString()}) than attribute ${r[0]} (${o.toString()}).` + ); + } + r.sort(function(d, f) { + return ComponentDatatype$1.getSizeInBytes(e[f].componentDatatype) - ComponentDatatype$1.getSizeInBytes(e[d].componentDatatype); + }); + let c = 0; + const l = {}; + for (t = 0; t < s; ++t) + n = r[t], i = e[n], l[n] = c, c += computeAttributeSizeInBytes(i); + if (c > 0) { + const d = ComponentDatatype$1.getSizeInBytes( + e[r[0]].componentDatatype + ), f = c % d; + f !== 0 && (c += d - f); + const h = o * c, p = new ArrayBuffer(h), m = {}; + for (t = 0; t < s; ++t) { + n = r[t]; + const _ = ComponentDatatype$1.getSizeInBytes( + e[n].componentDatatype + ); + m[n] = { + pointer: ComponentDatatype$1.createTypedArray( + e[n].componentDatatype, + p + ), + index: l[n] / _, + // Offset in ComponentType + strideInComponentType: c / _ + }; + } + for (t = 0; t < o; ++t) + for (let _ = 0; _ < s; ++_) { + n = r[_], i = e[n]; + const y = i.values, C = m[n], T = C.pointer, x = i.componentsPerAttribute; + for (let b = 0; b < x; ++b) + T[C.index + b] = y[t * x + b]; + C.index += C.strideInComponentType; + } + return { + buffer: p, + offsetsInBytes: l, + vertexSizeInBytes: c + }; + } +} +VertexArray.fromGeometry = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context, n = defaultValue(e.geometry, defaultValue.EMPTY_OBJECT), i = defaultValue( + e.bufferUsage, + BufferUsage$1.DYNAMIC_DRAW + ), r = defaultValue( + e.attributeLocations, + defaultValue.EMPTY_OBJECT + ), o = defaultValue(e.interleave, !1), s = e.vertexArrayAttributes; + let c, l, d; + const f = defined(s) ? s : [], h = n.attributes; + if (o) { + const _ = interleaveAttributes(h); + if (defined(_)) { + d = Buffer.createVertexBuffer({ + context: t, + typedArray: _.buffer, + usage: i + }); + const y = _.offsetsInBytes, C = _.vertexSizeInBytes; + for (c in h) + h.hasOwnProperty(c) && defined(h[c]) && (l = h[c], defined(l.values) ? f.push({ + index: r[c], + vertexBuffer: d, + componentDatatype: l.componentDatatype, + componentsPerAttribute: l.componentsPerAttribute, + normalize: l.normalize, + offsetInBytes: y[c], + strideInBytes: C + }) : f.push({ + index: r[c], + value: l.value, + componentDatatype: l.componentDatatype, + normalize: l.normalize + })); + } + } else + for (c in h) + if (h.hasOwnProperty(c) && defined(h[c])) { + l = h[c]; + let _ = l.componentDatatype; + _ === ComponentDatatype$1.DOUBLE && (_ = ComponentDatatype$1.FLOAT), d = void 0, defined(l.values) && (d = Buffer.createVertexBuffer({ + context: t, + typedArray: ComponentDatatype$1.createTypedArray( + _, + l.values + ), + usage: i + })), f.push({ + index: r[c], + vertexBuffer: d, + value: l.value, + componentDatatype: _, + componentsPerAttribute: l.componentsPerAttribute, + normalize: l.normalize + }); + } + let p; + const m = n.indices; + return defined(m) && (Geometry.computeNumberOfVertices(n) >= CesiumMath.SIXTY_FOUR_KILOBYTES && t.elementIndexUint ? p = Buffer.createIndexBuffer({ + context: t, + typedArray: new Uint32Array(m), + usage: i, + indexDatatype: IndexDatatype$1.UNSIGNED_INT + }) : p = Buffer.createIndexBuffer({ + context: t, + typedArray: new Uint16Array(m), + usage: i, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + })), new VertexArray({ + context: t, + attributes: f, + indexBuffer: p + }); +}; +Object.defineProperties(VertexArray.prototype, { + numberOfAttributes: { + get: function() { + return this._attributes.length; + } + }, + numberOfVertices: { + get: function() { + return this._numberOfVertices; + } + }, + indexBuffer: { + get: function() { + return this._indexBuffer; + } + } +}); +VertexArray.prototype.getAttribute = function(e) { + return this._attributes[e]; +}; +function setVertexAttribDivisor(e) { + const t = e._context, n = e._hasInstancedAttributes; + if (!n && !t._previousDrawInstanced) + return; + t._previousDrawInstanced = n; + const i = t._vertexAttribDivisors, r = e._attributes, o = ContextLimits.maximumVertexAttributes; + let s; + if (n) { + const c = r.length; + for (s = 0; s < c; ++s) { + const l = r[s]; + if (l.enabled) { + const d = l.instanceDivisor, f = l.index; + d !== i[f] && (t.glVertexAttribDivisor(f, d), i[f] = d); + } + } + } else + for (s = 0; s < o; ++s) + i[s] > 0 && (t.glVertexAttribDivisor(s, 0), i[s] = 0); +} +function setConstantAttributes(e, t) { + const n = e._attributes, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + o.enabled && defined(o.value) && o.vertexAttrib(t); + } +} +VertexArray.prototype._bind = function() { + defined(this._vao) ? (this._context.glBindVertexArray(this._vao), this._context.instancedArrays && setVertexAttribDivisor(this), this._hasConstantAttributes && setConstantAttributes(this, this._gl)) : bind(this._gl, this._attributes, this._indexBuffer); +}; +VertexArray.prototype._unBind = function() { + if (defined(this._vao)) + this._context.glBindVertexArray(null); + else { + const e = this._attributes, t = this._gl; + for (let n = 0; n < e.length; ++n) { + const i = e[n]; + i.enabled && i.disableVertexAttribArray(t); + } + this._indexBuffer && t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, null); + } +}; +VertexArray.prototype.isDestroyed = function() { + return !1; +}; +VertexArray.prototype.destroy = function() { + const e = this._attributes; + for (let n = 0; n < e.length; ++n) { + const i = e[n].vertexBuffer; + defined(i) && !i.isDestroyed() && i.vertexArrayDestroyable && i.destroy(); + } + const t = this._indexBuffer; + return defined(t) && !t.isDestroyed() && t.vertexArrayDestroyable && t.destroy(), defined(this._vao) && this._context.glDeleteVertexArray(this._vao), destroyObject(this); +}; +function Context(e, t) { + const { + getWebGLStub: n, + requestWebgl1: i, + webgl: r = {}, + allowTextureFilterAnisotropic: o = !0 + } = defaultValue(t, {}); + r.alpha = defaultValue(r.alpha, !1), r.stencil = defaultValue(r.stencil, !0), r.powerPreference = defaultValue( + r.powerPreference, + "high-performance" + ); + const s = defined(n) ? n(e, r) : getWebGLContext(e, r, i), l = typeof WebGL2RenderingContext < "u" && s instanceof WebGL2RenderingContext; + this._canvas = e, this._originalGLContext = s, this._gl = s, this._webgl2 = l, this._id = createGuid(), this.validateFramebuffer = !1, this.validateShaderProgram = !1, this.logShaderCompilation = !1, this._throwOnWebGLError = !1, this._shaderCache = new ShaderCache(this), this._textureCache = new TextureCache(); + const d = s; + this._stencilBits = d.getParameter(d.STENCIL_BITS), ContextLimits._maximumCombinedTextureImageUnits = d.getParameter( + d.MAX_COMBINED_TEXTURE_IMAGE_UNITS + ), ContextLimits._maximumCubeMapSize = d.getParameter( + d.MAX_CUBE_MAP_TEXTURE_SIZE + ), ContextLimits._maximumFragmentUniformVectors = d.getParameter( + d.MAX_FRAGMENT_UNIFORM_VECTORS + ), ContextLimits._maximumTextureImageUnits = d.getParameter( + d.MAX_TEXTURE_IMAGE_UNITS + ), ContextLimits._maximumRenderbufferSize = d.getParameter( + d.MAX_RENDERBUFFER_SIZE + ), ContextLimits._maximumTextureSize = d.getParameter(d.MAX_TEXTURE_SIZE), ContextLimits._maximumVaryingVectors = d.getParameter( + d.MAX_VARYING_VECTORS + ), ContextLimits._maximumVertexAttributes = d.getParameter( + d.MAX_VERTEX_ATTRIBS + ), ContextLimits._maximumVertexTextureImageUnits = d.getParameter( + d.MAX_VERTEX_TEXTURE_IMAGE_UNITS + ), ContextLimits._maximumVertexUniformVectors = d.getParameter( + d.MAX_VERTEX_UNIFORM_VECTORS + ), ContextLimits._maximumSamples = this._webgl2 ? d.getParameter(d.MAX_SAMPLES) : 0; + const f = d.getParameter(d.ALIASED_LINE_WIDTH_RANGE); + ContextLimits._minimumAliasedLineWidth = f[0], ContextLimits._maximumAliasedLineWidth = f[1]; + const h = d.getParameter(d.ALIASED_POINT_SIZE_RANGE); + ContextLimits._minimumAliasedPointSize = h[0], ContextLimits._maximumAliasedPointSize = h[1]; + const p = d.getParameter(d.MAX_VIEWPORT_DIMS); + ContextLimits._maximumViewportWidth = p[0], ContextLimits._maximumViewportHeight = p[1]; + const m = d.getShaderPrecisionFormat( + d.FRAGMENT_SHADER, + d.HIGH_FLOAT + ); + ContextLimits._highpFloatSupported = m.precision !== 0; + const _ = d.getShaderPrecisionFormat(d.FRAGMENT_SHADER, d.HIGH_INT); + ContextLimits._highpIntSupported = _.rangeMax !== 0, this._antialias = d.getContextAttributes().antialias, this._standardDerivatives = !!getExtension(d, ["OES_standard_derivatives"]), this._blendMinmax = !!getExtension(d, ["EXT_blend_minmax"]), this._elementIndexUint = !!getExtension(d, ["OES_element_index_uint"]), this._depthTexture = !!getExtension(d, [ + "WEBGL_depth_texture", + "WEBKIT_WEBGL_depth_texture" + ]), this._fragDepth = !!getExtension(d, ["EXT_frag_depth"]), this._debugShaders = getExtension(d, ["WEBGL_debug_shaders"]), this._textureFloat = !!getExtension(d, ["OES_texture_float"]), this._textureHalfFloat = !!getExtension(d, ["OES_texture_half_float"]), this._textureFloatLinear = !!getExtension(d, ["OES_texture_float_linear"]), this._textureHalfFloatLinear = !!getExtension(d, [ + "OES_texture_half_float_linear" + ]), this._supportsTextureLod = !!getExtension(d, ["EXT_shader_texture_lod"]), this._colorBufferFloat = !!getExtension(d, [ + "EXT_color_buffer_float", + "WEBGL_color_buffer_float" + ]), this._floatBlend = !!getExtension(d, ["EXT_float_blend"]), this._colorBufferHalfFloat = !!getExtension(d, [ + "EXT_color_buffer_half_float" + ]), this._s3tc = !!getExtension(d, [ + "WEBGL_compressed_texture_s3tc", + "MOZ_WEBGL_compressed_texture_s3tc", + "WEBKIT_WEBGL_compressed_texture_s3tc" + ]), this._pvrtc = !!getExtension(d, [ + "WEBGL_compressed_texture_pvrtc", + "WEBKIT_WEBGL_compressed_texture_pvrtc" + ]), this._astc = !!getExtension(d, ["WEBGL_compressed_texture_astc"]), this._etc = !!getExtension(d, ["WEBG_compressed_texture_etc"]), this._etc1 = !!getExtension(d, ["WEBGL_compressed_texture_etc1"]), this._bc7 = !!getExtension(d, ["EXT_texture_compression_bptc"]), loadKTX2.setKTX2SupportedFormats( + this._s3tc, + this._pvrtc, + this._astc, + this._etc, + this._etc1, + this._bc7 + ); + const y = o ? getExtension(d, [ + "EXT_texture_filter_anisotropic", + "WEBKIT_EXT_texture_filter_anisotropic" + ]) : void 0; + this._textureFilterAnisotropic = y, ContextLimits._maximumTextureFilterAnisotropy = defined( + y + ) ? d.getParameter(y.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1; + let C, T, x, b, S, E, A, D, P, I; + if (l) { + const g = this; + C = function() { + return g._gl.createVertexArray(); + }, T = function(w) { + g._gl.bindVertexArray(w); + }, x = function(w) { + g._gl.deleteVertexArray(w); + }, b = function(w, O, N, F, B) { + d.drawElementsInstanced(w, O, N, F, B); + }, S = function(w, O, N, F) { + d.drawArraysInstanced(w, O, N, F); + }, E = function(w, O) { + d.vertexAttribDivisor(w, O); + }, A = function(w) { + d.drawBuffers(w); + }; + } else + D = getExtension(d, ["OES_vertex_array_object"]), defined(D) && (C = function() { + return D.createVertexArrayOES(); + }, T = function(g) { + D.bindVertexArrayOES(g); + }, x = function(g) { + D.deleteVertexArrayOES(g); + }), P = getExtension(d, ["ANGLE_instanced_arrays"]), defined(P) && (b = function(g, w, O, N, F) { + P.drawElementsInstancedANGLE( + g, + w, + O, + N, + F + ); + }, S = function(g, w, O, N) { + P.drawArraysInstancedANGLE( + g, + w, + O, + N + ); + }, E = function(g, w) { + P.vertexAttribDivisorANGLE(g, w); + }), I = getExtension(d, ["WEBGL_draw_buffers"]), defined(I) && (A = function(g) { + I.drawBuffersWEBGL(g); + }); + this.glCreateVertexArray = C, this.glBindVertexArray = T, this.glDeleteVertexArray = x, this.glDrawElementsInstanced = b, this.glDrawArraysInstanced = S, this.glVertexAttribDivisor = E, this.glDrawBuffers = A, this._vertexArrayObject = !!D, this._instancedArrays = !!P, this._drawBuffers = !!I, ContextLimits._maximumDrawBuffers = this.drawBuffers ? d.getParameter(WebGLConstants$1.MAX_DRAW_BUFFERS) : 1, ContextLimits._maximumColorAttachments = this.drawBuffers ? d.getParameter(WebGLConstants$1.MAX_COLOR_ATTACHMENTS) : 1, this._clearColor = new Color(0, 0, 0, 0), this._clearDepth = 1, this._clearStencil = 0; + const M = new UniformState(), R = new PassState(this), L = RenderState.fromCache(); + this._defaultPassState = R, this._defaultRenderState = L, this._defaultTexture = void 0, this._defaultEmissiveTexture = void 0, this._defaultNormalTexture = void 0, this._defaultCubeMap = void 0, this._us = M, this._currentRenderState = L, this._currentPassState = R, this._currentFramebuffer = void 0, this._maxFrameTextureUnitIndex = 0, this._vertexAttribDivisors = [], this._previousDrawInstanced = !1; + for (let g = 0; g < ContextLimits._maximumVertexAttributes; g++) + this._vertexAttribDivisors.push(0); + this._pickObjects = {}, this._nextPickColor = new Uint32Array(1), this.options = { + getWebGLStub: n, + requestWebgl1: i, + webgl: r, + allowTextureFilterAnisotropic: o + }, this.cache = {}, RenderState.apply(d, L, R); +} +function getWebGLContext(e, t, n) { + if (typeof WebGLRenderingContext > "u") + throw new RuntimeError( + "The browser does not support WebGL. Visit http://get.webgl.org." + ); + !n && !(typeof WebGL2RenderingContext < "u") && (n = !0); + const r = n ? "webgl" : "webgl2", o = e.getContext(r, t); + if (!defined(o)) + throw new RuntimeError( + "The browser supports WebGL, but initialization failed." + ); + return o; +} +function errorToString(e, t) { + let n = "WebGL Error: "; + switch (t) { + case e.INVALID_ENUM: + n += "INVALID_ENUM"; + break; + case e.INVALID_VALUE: + n += "INVALID_VALUE"; + break; + case e.INVALID_OPERATION: + n += "INVALID_OPERATION"; + break; + case e.OUT_OF_MEMORY: + n += "OUT_OF_MEMORY"; + break; + case e.CONTEXT_LOST_WEBGL: + n += "CONTEXT_LOST_WEBGL lost"; + break; + default: + n += `Unknown (${t})`; + } + return n; +} +function createErrorMessage(e, t, n, i) { + let r = `${errorToString(e, i)}: ${t.name}(`; + for (let o = 0; o < n.length; ++o) + o !== 0 && (r += ", "), r += n[o]; + return r += ");", r; +} +function throwOnError(e, t, n) { + const i = e.getError(); + if (i !== e.NO_ERROR) + throw new RuntimeError( + createErrorMessage(e, t, n, i) + ); +} +function makeGetterSetter(e, t, n) { + return { + get: function() { + const i = e[t]; + return n(e, `get: ${t}`, i), e[t]; + }, + set: function(i) { + e[t] = i, n(e, `set: ${t}`, i); + } + }; +} +function wrapGL(e, t) { + if (!defined(t)) + return e; + function n(r) { + return function() { + const o = r.apply(e, arguments); + return t(e, r, arguments), o; + }; + } + const i = {}; + for (const r in e) { + const o = e[r]; + o instanceof Function ? i[r] = n(o) : Object.defineProperty( + i, + r, + makeGetterSetter(e, r, t) + ); + } + return i; +} +function getExtension(e, t) { + const n = t.length; + for (let i = 0; i < n; ++i) { + const r = e.getExtension(t[i]); + if (r) + return r; + } +} +const defaultFramebufferMarker = {}; +Object.defineProperties(Context.prototype, { + id: { + get: function() { + return this._id; + } + }, + webgl2: { + get: function() { + return this._webgl2; + } + }, + canvas: { + get: function() { + return this._canvas; + } + }, + shaderCache: { + get: function() { + return this._shaderCache; + } + }, + textureCache: { + get: function() { + return this._textureCache; + } + }, + uniformState: { + get: function() { + return this._us; + } + }, + /** + * The number of stencil bits per pixel in the default bound framebuffer. The minimum is eight bits. + * @memberof Context.prototype + * @type {number} + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with STENCIL_BITS. + */ + stencilBits: { + get: function() { + return this._stencilBits; + } + }, + /** + * true if the WebGL context supports stencil buffers. + * Stencil buffers are not supported by all systems. + * @memberof Context.prototype + * @type {boolean} + */ + stencilBuffer: { + get: function() { + return this._stencilBits >= 8; + } + }, + /** + * true if the WebGL context supports antialiasing. By default + * antialiasing is requested, but it is not supported by all systems. + * @memberof Context.prototype + * @type {boolean} + */ + antialias: { + get: function() { + return this._antialias; + } + }, + /** + * true if the WebGL context supports multisample antialiasing. Requires + * WebGL2. + * @memberof Context.prototype + * @type {boolean} + */ + msaa: { + get: function() { + return this._webgl2; + } + }, + /** + * true if the OES_standard_derivatives extension is supported. This + * extension provides access to dFdx, dFdy, and fwidth + * functions from GLSL. A shader using these functions still needs to explicitly enable the + * extension with #extension GL_OES_standard_derivatives : enable. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/gles/extensions/OES/OES_standard_derivatives.txt|OES_standard_derivatives} + */ + standardDerivatives: { + get: function() { + return this._standardDerivatives || this._webgl2; + } + }, + /** + * true if the EXT_float_blend extension is supported. This + * extension enables blending with 32-bit float values. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_float_blend/} + */ + floatBlend: { + get: function() { + return this._floatBlend; + } + }, + /** + * true if the EXT_blend_minmax extension is supported. This + * extension extends blending capabilities by adding two new blend equations: + * the minimum or maximum color components of the source and destination colors. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_blend_minmax/} + */ + blendMinmax: { + get: function() { + return this._blendMinmax || this._webgl2; + } + }, + /** + * true if the OES_element_index_uint extension is supported. This + * extension allows the use of unsigned int indices, which can improve performance by + * eliminating batch breaking caused by unsigned short indices. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/|OES_element_index_uint} + */ + elementIndexUint: { + get: function() { + return this._elementIndexUint || this._webgl2; + } + }, + /** + * true if WEBGL_depth_texture is supported. This extension provides + * access to depth textures that, for example, can be attached to framebuffers for shadow mapping. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/|WEBGL_depth_texture} + */ + depthTexture: { + get: function() { + return this._depthTexture || this._webgl2; + } + }, + /** + * true if OES_texture_float is supported. This extension provides + * access to floating point textures that, for example, can be attached to framebuffers for high dynamic range. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/OES_texture_float/} + */ + floatingPointTexture: { + get: function() { + return this._webgl2 || this._textureFloat; + } + }, + /** + * true if OES_texture_half_float is supported. This extension provides + * access to floating point textures that, for example, can be attached to framebuffers for high dynamic range. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/} + */ + halfFloatingPointTexture: { + get: function() { + return this._webgl2 || this._textureHalfFloat; + } + }, + /** + * true if OES_texture_float_linear is supported. This extension provides + * access to linear sampling methods for minification and magnification filters of floating-point textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/} + */ + textureFloatLinear: { + get: function() { + return this._textureFloatLinear; + } + }, + /** + * true if OES_texture_half_float_linear is supported. This extension provides + * access to linear sampling methods for minification and magnification filters of half floating-point textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/} + */ + textureHalfFloatLinear: { + get: function() { + return this._webgl2 && this._textureFloatLinear || !this._webgl2 && this._textureHalfFloatLinear; + } + }, + /** + * true if EXT_shader_texture_lod is supported. This extension provides + * access to explicit LOD selection in texture sampling functions. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://registry.khronos.org/webgl/extensions/EXT_shader_texture_lod/} + */ + supportsTextureLod: { + get: function() { + return this._webgl2 || this._supportsTextureLod; + } + }, + /** + * true if EXT_texture_filter_anisotropic is supported. This extension provides + * access to anisotropic filtering for textured surfaces at an oblique angle from the viewer. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/} + */ + textureFilterAnisotropic: { + get: function() { + return !!this._textureFilterAnisotropic; + } + }, + /** + * true if WEBGL_compressed_texture_s3tc is supported. This extension provides + * access to DXT compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/} + */ + s3tc: { + get: function() { + return this._s3tc; + } + }, + /** + * true if WEBGL_compressed_texture_pvrtc is supported. This extension provides + * access to PVR compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/} + */ + pvrtc: { + get: function() { + return this._pvrtc; + } + }, + /** + * true if WEBGL_compressed_texture_astc is supported. This extension provides + * access to ASTC compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/} + */ + astc: { + get: function() { + return this._astc; + } + }, + /** + * true if WEBGL_compressed_texture_etc is supported. This extension provides + * access to ETC compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc/} + */ + etc: { + get: function() { + return this._etc; + } + }, + /** + * true if WEBGL_compressed_texture_etc1 is supported. This extension provides + * access to ETC1 compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc1/} + */ + etc1: { + get: function() { + return this._etc1; + } + }, + /** + * true if EXT_texture_compression_bptc is supported. This extension provides + * access to BC7 compressed textures. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/} + */ + bc7: { + get: function() { + return this._bc7; + } + }, + /** + * true if S3TC, PVRTC, ASTC, ETC, ETC1, or BC7 compression is supported. + * @memberof Context.prototype + * @type {boolean} + */ + supportsBasis: { + get: function() { + return this._s3tc || this._pvrtc || this._astc || this._etc || this._etc1 || this._bc7; + } + }, + /** + * true if the OES_vertex_array_object extension is supported. This + * extension can improve performance by reducing the overhead of switching vertex arrays. + * When enabled, this extension is automatically used by {@link VertexArray}. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/|OES_vertex_array_object} + */ + vertexArrayObject: { + get: function() { + return this._vertexArrayObject || this._webgl2; + } + }, + /** + * true if the EXT_frag_depth extension is supported. This + * extension provides access to the gl_FragDepthEXT built-in output variable + * from GLSL fragment shaders. A shader using these functions still needs to explicitly enable the + * extension with #extension GL_EXT_frag_depth : enable. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/|EXT_frag_depth} + */ + fragmentDepth: { + get: function() { + return this._fragDepth || this._webgl2; + } + }, + /** + * true if the ANGLE_instanced_arrays extension is supported. This + * extension provides access to instanced rendering. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays} + */ + instancedArrays: { + get: function() { + return this._instancedArrays || this._webgl2; + } + }, + /** + * true if the EXT_color_buffer_float extension is supported. This + * extension makes the gl.RGBA32F format color renderable. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_color_buffer_float/} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_color_buffer_float/} + */ + colorBufferFloat: { + get: function() { + return this._colorBufferFloat; + } + }, + /** + * true if the EXT_color_buffer_half_float extension is supported. This + * extension makes the format gl.RGBA16F format color renderable. + * @memberof Context.prototype + * @type {boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_color_buffer_half_float/} + * @see {@link https://www.khronos.org/registry/webgl/extensions/EXT_color_buffer_float/} + */ + colorBufferHalfFloat: { + get: function() { + return this._webgl2 && this._colorBufferFloat || !this._webgl2 && this._colorBufferHalfFloat; + } + }, + /** + * true if the WEBGL_draw_buffers extension is supported. This + * extensions provides support for multiple render targets. The framebuffer object can have mutiple + * color attachments and the GLSL fragment shader can write to the built-in output array gl_FragData. + * A shader using this feature needs to explicitly enable the extension with + * #extension GL_EXT_draw_buffers : enable. + * @memberof Context.prototype + * @type {boolean} + * @see {@link http://www.khronos.org/registry/webgl/extensions/WEBGL_draw_buffers/|WEBGL_draw_buffers} + */ + drawBuffers: { + get: function() { + return this._drawBuffers || this._webgl2; + } + }, + debugShaders: { + get: function() { + return this._debugShaders; + } + }, + throwOnWebGLError: { + get: function() { + return this._throwOnWebGLError; + }, + set: function(e) { + this._throwOnWebGLError = e, this._gl = wrapGL( + this._originalGLContext, + e ? throwOnError : void 0 + ); + } + }, + /** + * A 1x1 RGBA texture initialized to [255, 255, 255, 255]. This can + * be used as a placeholder texture while other textures are downloaded. + * @memberof Context.prototype + * @type {Texture} + */ + defaultTexture: { + get: function() { + return this._defaultTexture === void 0 && (this._defaultTexture = new Texture({ + context: this, + source: { + width: 1, + height: 1, + arrayBufferView: new Uint8Array([255, 255, 255, 255]) + }, + flipY: !1 + })), this._defaultTexture; + } + }, + /** + * A 1x1 RGB texture initialized to [0, 0, 0] representing a material that is + * not emissive. This can be used as a placeholder texture for emissive + * textures while other textures are downloaded. + * @memberof Context.prototype + * @type {Texture} + */ + defaultEmissiveTexture: { + get: function() { + return this._defaultEmissiveTexture === void 0 && (this._defaultEmissiveTexture = new Texture({ + context: this, + pixelFormat: PixelFormat$1.RGB, + source: { + width: 1, + height: 1, + arrayBufferView: new Uint8Array([0, 0, 0]) + }, + flipY: !1 + })), this._defaultEmissiveTexture; + } + }, + /** + * A 1x1 RGBA texture initialized to [128, 128, 255] to encode a tangent + * space normal pointing in the +z direction, i.e. (0, 0, 1). This can + * be used as a placeholder normal texture while other textures are + * downloaded. + * @memberof Context.prototype + * @type {Texture} + */ + defaultNormalTexture: { + get: function() { + return this._defaultNormalTexture === void 0 && (this._defaultNormalTexture = new Texture({ + context: this, + pixelFormat: PixelFormat$1.RGB, + source: { + width: 1, + height: 1, + arrayBufferView: new Uint8Array([128, 128, 255]) + }, + flipY: !1 + })), this._defaultNormalTexture; + } + }, + /** + * A cube map, where each face is a 1x1 RGBA texture initialized to + * [255, 255, 255, 255]. This can be used as a placeholder cube map while + * other cube maps are downloaded. + * @memberof Context.prototype + * @type {CubeMap} + */ + defaultCubeMap: { + get: function() { + if (this._defaultCubeMap === void 0) { + const e = { + width: 1, + height: 1, + arrayBufferView: new Uint8Array([255, 255, 255, 255]) + }; + this._defaultCubeMap = new CubeMap({ + context: this, + source: { + positiveX: e, + negativeX: e, + positiveY: e, + negativeY: e, + positiveZ: e, + negativeZ: e + }, + flipY: !1 + }); + } + return this._defaultCubeMap; + } + }, + /** + * The drawingBufferHeight of the underlying GL context. + * @memberof Context.prototype + * @type {number} + * @see {@link https://www.khronos.org/registry/webgl/specs/1.0/#DOM-WebGLRenderingContext-drawingBufferHeight|drawingBufferHeight} + */ + drawingBufferHeight: { + get: function() { + return this._gl.drawingBufferHeight; + } + }, + /** + * The drawingBufferWidth of the underlying GL context. + * @memberof Context.prototype + * @type {number} + * @see {@link https://www.khronos.org/registry/webgl/specs/1.0/#DOM-WebGLRenderingContext-drawingBufferWidth|drawingBufferWidth} + */ + drawingBufferWidth: { + get: function() { + return this._gl.drawingBufferWidth; + } + }, + /** + * Gets an object representing the currently bound framebuffer. While this instance is not an actual + * {@link Framebuffer}, it is used to represent the default framebuffer in calls to + * {@link Texture.fromFramebuffer}. + * @memberof Context.prototype + * @type {object} + */ + defaultFramebuffer: { + get: function() { + return defaultFramebufferMarker; + } + } +}); +function applyRenderState(e, t, n, i) { + const r = e._currentRenderState, o = e._currentPassState; + e._currentRenderState = t, e._currentPassState = n, RenderState.partialApply( + e._gl, + r, + t, + o, + n, + i + ); +} +let scratchBackBufferArray; +typeof WebGLRenderingContext < "u" && (scratchBackBufferArray = [WebGLConstants$1.BACK]); +function bindFramebuffer(e, t) { + if (t !== e._currentFramebuffer) { + e._currentFramebuffer = t; + let n = scratchBackBufferArray; + if (defined(t)) + t._bind(), n = t._getActiveColorAttachments(); + else { + const i = e._gl; + i.bindFramebuffer(i.FRAMEBUFFER, null); + } + e.drawBuffers && e.glDrawBuffers(n); + } +} +const defaultClearCommand = new ClearCommand(); +Context.prototype.clear = function(e, t) { + e = defaultValue(e, defaultClearCommand), t = defaultValue(t, this._defaultPassState); + const n = this._gl; + let i = 0; + const r = e.color, o = e.depth, s = e.stencil; + defined(r) && (Color.equals(this._clearColor, r) || (Color.clone(r, this._clearColor), n.clearColor(r.red, r.green, r.blue, r.alpha)), i |= n.COLOR_BUFFER_BIT), defined(o) && (o !== this._clearDepth && (this._clearDepth = o, n.clearDepth(o)), i |= n.DEPTH_BUFFER_BIT), defined(s) && (s !== this._clearStencil && (this._clearStencil = s, n.clearStencil(s)), i |= n.STENCIL_BUFFER_BIT); + const c = defaultValue(e.renderState, this._defaultRenderState); + applyRenderState(this, c, t, !0); + const l = defaultValue( + e.framebuffer, + t.framebuffer + ); + bindFramebuffer(this, l), n.clear(i); +}; +function beginDraw(e, t, n, i, r) { + bindFramebuffer(e, t), applyRenderState(e, r, n, !1), i._bind(), e._maxFrameTextureUnitIndex = Math.max( + e._maxFrameTextureUnitIndex, + i.maximumTextureUnitIndex + ); +} +function continueDraw(e, t, n, i) { + const r = t._primitiveType, o = t._vertexArray; + let s = t._offset, c = t._count; + const l = t.instanceCount; + e._us.model = defaultValue(t._modelMatrix, Matrix4.IDENTITY), n._setUniforms( + i, + e._us, + e.validateShaderProgram + ), o._bind(); + const d = o.indexBuffer; + defined(d) ? (s = s * d.bytesPerIndex, defined(c) ? c = Math.min(c, d.numberOfIndices) : c = d.numberOfIndices, l === 0 ? e._gl.drawElements( + r, + c, + d.indexDatatype, + s + ) : e.glDrawElementsInstanced( + r, + c, + d.indexDatatype, + s, + l + )) : (defined(c) ? c = Math.min(c, o.numberOfVertices) : c = o.numberOfVertices, l === 0 ? e._gl.drawArrays(r, s, c) : e.glDrawArraysInstanced( + r, + s, + c, + l + )), o._unBind(); +} +Context.prototype.draw = function(e, t, n, i) { + t = defaultValue(t, this._defaultPassState); + const r = defaultValue( + e._framebuffer, + t.framebuffer + ), o = defaultValue( + e._renderState, + this._defaultRenderState + ); + n = defaultValue(n, e._shaderProgram), i = defaultValue(i, e._uniformMap), beginDraw(this, r, t, n, o), continueDraw(this, e, n, i); +}; +Context.prototype.endFrame = function() { + const e = this._gl; + e.useProgram(null), this._currentFramebuffer = void 0, e.bindFramebuffer(e.FRAMEBUFFER, null); + const t = scratchBackBufferArray; + this.drawBuffers && this.glDrawBuffers(t); + const n = this._maxFrameTextureUnitIndex; + this._maxFrameTextureUnitIndex = 0; + for (let i = 0; i < n; ++i) + e.activeTexture(e.TEXTURE0 + i), e.bindTexture(e.TEXTURE_2D, null), e.bindTexture(e.TEXTURE_CUBE_MAP, null); +}; +Context.prototype.readPixels = function(e) { + const t = this._gl; + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = Math.max(defaultValue(e.x, 0), 0), i = Math.max(defaultValue(e.y, 0), 0), r = defaultValue(e.width, t.drawingBufferWidth), o = defaultValue(e.height, t.drawingBufferHeight), s = e.framebuffer; + let c = PixelDatatype$1.UNSIGNED_BYTE; + defined(s) && s.numberOfColorAttachments > 0 && (c = s.getColorTexture(0).pixelDatatype); + const l = PixelFormat$1.createTypedArray( + PixelFormat$1.RGBA, + c, + r, + o + ); + return bindFramebuffer(this, s), t.readPixels( + n, + i, + r, + o, + PixelFormat$1.RGBA, + PixelDatatype$1.toWebGLConstant(c, this), + l + ), l; +}; +const viewportQuadAttributeLocations = { + position: 0, + textureCoordinates: 1 +}; +Context.prototype.getViewportQuadVertexArray = function() { + let e = this.cache.viewportQuad_vertexArray; + if (!defined(e)) { + const t = new Geometry({ + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: [-1, -1, 1, -1, 1, 1, -1, 1] + }), + textureCoordinates: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: [0, 0, 1, 0, 1, 1, 0, 1] + }) + }, + // Workaround Internet Explorer 11.0.8 lack of TRIANGLE_FAN + indices: new Uint16Array([0, 1, 2, 0, 2, 3]), + primitiveType: PrimitiveType$1.TRIANGLES + }); + e = VertexArray.fromGeometry({ + context: this, + geometry: t, + attributeLocations: viewportQuadAttributeLocations, + bufferUsage: BufferUsage$1.STATIC_DRAW, + interleave: !0 + }), this.cache.viewportQuad_vertexArray = e; + } + return e; +}; +Context.prototype.createViewportQuadCommand = function(e, t) { + return t = defaultValue(t, defaultValue.EMPTY_OBJECT), new DrawCommand({ + vertexArray: this.getViewportQuadVertexArray(), + primitiveType: PrimitiveType$1.TRIANGLES, + renderState: t.renderState, + shaderProgram: ShaderProgram.fromCache({ + context: this, + vertexShaderSource: ViewportQuadVS, + fragmentShaderSource: e, + attributeLocations: viewportQuadAttributeLocations + }), + uniformMap: t.uniformMap, + owner: t.owner, + framebuffer: t.framebuffer, + pass: t.pass + }); +}; +Context.prototype.getObjectByPickColor = function(e) { + return this._pickObjects[e.toRgba()]; +}; +function PickId(e, t, n) { + this._pickObjects = e, this.key = t, this.color = n; +} +Object.defineProperties(PickId.prototype, { + object: { + get: function() { + return this._pickObjects[this.key]; + }, + set: function(e) { + this._pickObjects[this.key] = e; + } + } +}); +PickId.prototype.destroy = function() { + delete this._pickObjects[this.key]; +}; +Context.prototype.createPickId = function(e) { + ++this._nextPickColor[0]; + const t = this._nextPickColor[0]; + if (t === 0) + throw new RuntimeError("Out of unique Pick IDs."); + return this._pickObjects[t] = e, new PickId(this._pickObjects, t, Color.fromRgba(t)); +}; +Context.prototype.isDestroyed = function() { + return !1; +}; +Context.prototype.destroy = function() { + const e = this.cache; + for (const t in e) + if (e.hasOwnProperty(t)) { + const n = e[t]; + defined(n.destroy) && n.destroy(); + } + return this._shaderCache = this._shaderCache.destroy(), this._textureCache = this._textureCache.destroy(), this._defaultTexture = this._defaultTexture && this._defaultTexture.destroy(), this._defaultEmissiveTexture = this._defaultEmissiveTexture && this._defaultEmissiveTexture.destroy(), this._defaultNormalTexture = this._defaultNormalTexture && this._defaultNormalTexture.destroy(), this._defaultCubeMap = this._defaultCubeMap && this._defaultCubeMap.destroy(), destroyObject(this); +}; +Context._deprecationWarning = deprecationWarning; +function MultisampleFramebuffer(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context, n = e.width, i = e.height; + this._width = n, this._height = i; + const r = e.colorRenderbuffers, o = e.colorTextures; + if (defined(r) !== defined(o)) + throw new DeveloperError( + "Both color renderbuffer and texture attachments must be provided." + ); + const s = e.depthStencilRenderbuffer, c = e.depthStencilTexture; + if (defined(s) !== defined(c)) + throw new DeveloperError( + "Both depth-stencil renderbuffer and texture attachments must be provided." + ); + this._renderFramebuffer = new Framebuffer({ + context: t, + colorRenderbuffers: r, + depthStencilRenderbuffer: s, + destroyAttachments: e.destroyAttachments + }), this._colorFramebuffer = new Framebuffer({ + context: t, + colorTextures: o, + depthStencilTexture: c, + destroyAttachments: e.destroyAttachments + }); +} +MultisampleFramebuffer.prototype.getRenderFramebuffer = function() { + return this._renderFramebuffer; +}; +MultisampleFramebuffer.prototype.getColorFramebuffer = function() { + return this._colorFramebuffer; +}; +MultisampleFramebuffer.prototype.blitFramebuffers = function(e, t) { + this._renderFramebuffer.bindRead(), this._colorFramebuffer.bindDraw(); + const n = e._gl; + let i = 0; + this._colorFramebuffer._colorTextures.length > 0 && (i |= n.COLOR_BUFFER_BIT), defined(this._colorFramebuffer.depthStencilTexture) && (i |= n.DEPTH_BUFFER_BIT | (t ? n.STENCIL_BUFFER_BIT : 0)), n.blitFramebuffer( + 0, + 0, + this._width, + this._height, + 0, + 0, + this._width, + this._height, + i, + n.NEAREST + ), n.bindFramebuffer(n.READ_FRAMEBUFFER, null), n.bindFramebuffer(n.DRAW_FRAMEBUFFER, null); +}; +MultisampleFramebuffer.prototype.isDestroyed = function() { + return !1; +}; +MultisampleFramebuffer.prototype.destroy = function() { + return this._renderFramebuffer.destroy(), this._colorFramebuffer.destroy(), destroyObject(this); +}; +const RenderbufferFormat = { + RGBA4: WebGLConstants$1.RGBA4, + RGBA8: WebGLConstants$1.RGBA8, + RGBA16F: WebGLConstants$1.RGBA16F, + RGBA32F: WebGLConstants$1.RGBA32F, + RGB5_A1: WebGLConstants$1.RGB5_A1, + RGB565: WebGLConstants$1.RGB565, + DEPTH_COMPONENT16: WebGLConstants$1.DEPTH_COMPONENT16, + STENCIL_INDEX8: WebGLConstants$1.STENCIL_INDEX8, + DEPTH_STENCIL: WebGLConstants$1.DEPTH_STENCIL, + DEPTH24_STENCIL8: WebGLConstants$1.DEPTH24_STENCIL8, + validate: function(e) { + return e === RenderbufferFormat.RGBA4 || e === RenderbufferFormat.RGBA8 || e === RenderbufferFormat.RGBA16F || e === RenderbufferFormat.RGBA32F || e === RenderbufferFormat.RGB5_A1 || e === RenderbufferFormat.RGB565 || e === RenderbufferFormat.DEPTH_COMPONENT16 || e === RenderbufferFormat.STENCIL_INDEX8 || e === RenderbufferFormat.DEPTH_STENCIL || e === RenderbufferFormat.DEPTH24_STENCIL8; + }, + getColorFormat: function(e) { + return e === WebGLConstants$1.FLOAT ? RenderbufferFormat.RGBA32F : e === WebGLConstants$1.HALF_FLOAT_OES ? RenderbufferFormat.RGBA16F : RenderbufferFormat.RGBA8; + } +}, RenderbufferFormat$1 = Object.freeze(RenderbufferFormat); +function Renderbuffer(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.context._gl; + ContextLimits.maximumRenderbufferSize; + const i = defaultValue(e.format, RenderbufferFormat$1.RGBA4), r = defined(e.width) ? e.width : n.drawingBufferWidth, o = defined(e.height) ? e.height : n.drawingBufferHeight, s = defaultValue(e.numSamples, 1); + this._gl = n, this._format = i, this._width = r, this._height = o, this._renderbuffer = this._gl.createRenderbuffer(), n.bindRenderbuffer(n.RENDERBUFFER, this._renderbuffer), s > 1 ? n.renderbufferStorageMultisample( + n.RENDERBUFFER, + s, + i, + r, + o + ) : n.renderbufferStorage(n.RENDERBUFFER, i, r, o), n.bindRenderbuffer(n.RENDERBUFFER, null); +} +Object.defineProperties(Renderbuffer.prototype, { + format: { + get: function() { + return this._format; + } + }, + width: { + get: function() { + return this._width; + } + }, + height: { + get: function() { + return this._height; + } + } +}); +Renderbuffer.prototype._getRenderbuffer = function() { + return this._renderbuffer; +}; +Renderbuffer.prototype.isDestroyed = function() { + return !1; +}; +Renderbuffer.prototype.destroy = function() { + return this._gl.deleteRenderbuffer(this._renderbuffer), destroyObject(this); +}; +function FramebufferManager(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._numSamples = defaultValue(e.numSamples, 1), this._colorAttachmentsLength = defaultValue( + e.colorAttachmentsLength, + 1 + ), this._color = defaultValue(e.color, !0), this._depth = defaultValue(e.depth, !1), this._depthStencil = defaultValue(e.depthStencil, !1), this._supportsDepthTexture = defaultValue( + e.supportsDepthTexture, + !1 + ), this._createColorAttachments = defaultValue( + e.createColorAttachments, + !0 + ), this._createDepthAttachments = defaultValue( + e.createDepthAttachments, + !0 + ), this._pixelDatatype = e.pixelDatatype, this._pixelFormat = e.pixelFormat, this._width = void 0, this._height = void 0, this._framebuffer = void 0, this._multisampleFramebuffer = void 0, this._colorTextures = void 0, this._color && (this._colorTextures = new Array(this._colorAttachmentsLength), this._colorRenderbuffers = new Array(this._colorAttachmentsLength)), this._colorRenderbuffer = void 0, this._depthStencilRenderbuffer = void 0, this._depthStencilTexture = void 0, this._depthRenderbuffer = void 0, this._depthTexture = void 0, this._attachmentsDirty = !1; +} +Object.defineProperties(FramebufferManager.prototype, { + framebuffer: { + get: function() { + return this._numSamples > 1 ? this._multisampleFramebuffer.getRenderFramebuffer() : this._framebuffer; + } + }, + numSamples: { + get: function() { + return this._numSamples; + } + }, + status: { + get: function() { + return this.framebuffer.status; + } + } +}); +FramebufferManager.prototype.isDirty = function(e, t, n, i, r) { + n = defaultValue(n, 1); + const o = this._width !== e || this._height !== t, s = this._numSamples !== n, c = defined(i) && this._pixelDatatype !== i || defined(r) && this._pixelFormat !== r, l = defined(n === 1 ? this._framebuffer : this._multisampleFramebuffer); + return this._attachmentsDirty || o || s || c || !l || this._color && !defined(this._colorTextures[0]); +}; +FramebufferManager.prototype.update = function(e, t, n, i, r, o) { + if (i = e.msaa ? defaultValue(i, 1) : 1, r = defaultValue( + r, + this._color ? defaultValue(this._pixelDatatype, PixelDatatype$1.UNSIGNED_BYTE) : void 0 + ), o = defaultValue( + o, + this._color ? defaultValue(this._pixelFormat, PixelFormat$1.RGBA) : void 0 + ), this.isDirty(t, n, i, r, o)) { + if (this.destroy(), this._width = t, this._height = n, this._numSamples = i, this._pixelDatatype = r, this._pixelFormat = o, this._attachmentsDirty = !1, this._color && this._createColorAttachments) { + for (let s = 0; s < this._colorAttachmentsLength; ++s) + if (this._colorTextures[s] = new Texture({ + context: e, + width: t, + height: n, + pixelFormat: o, + pixelDatatype: r, + sampler: Sampler.NEAREST + }), this._numSamples > 1) { + const c = RenderbufferFormat$1.getColorFormat(r); + this._colorRenderbuffers[s] = new Renderbuffer({ + context: e, + width: t, + height: n, + format: c, + numSamples: this._numSamples + }); + } + } + this._depthStencil && this._createDepthAttachments && (this._supportsDepthTexture && e.depthTexture ? (this._depthStencilTexture = new Texture({ + context: e, + width: t, + height: n, + pixelFormat: PixelFormat$1.DEPTH_STENCIL, + pixelDatatype: PixelDatatype$1.UNSIGNED_INT_24_8, + sampler: Sampler.NEAREST + }), this._numSamples > 1 && (this._depthStencilRenderbuffer = new Renderbuffer({ + context: e, + width: t, + height: n, + format: RenderbufferFormat$1.DEPTH24_STENCIL8, + numSamples: this._numSamples + }))) : this._depthStencilRenderbuffer = new Renderbuffer({ + context: e, + width: t, + height: n, + format: RenderbufferFormat$1.DEPTH_STENCIL + })), this._depth && this._createDepthAttachments && (this._supportsDepthTexture && e.depthTexture ? this._depthTexture = new Texture({ + context: e, + width: t, + height: n, + pixelFormat: PixelFormat$1.DEPTH_COMPONENT, + pixelDatatype: PixelDatatype$1.UNSIGNED_INT, + sampler: Sampler.NEAREST + }) : this._depthRenderbuffer = new Renderbuffer({ + context: e, + width: t, + height: n, + format: RenderbufferFormat$1.DEPTH_COMPONENT16 + })), this._numSamples > 1 ? this._multisampleFramebuffer = new MultisampleFramebuffer({ + context: e, + width: this._width, + height: this._height, + colorTextures: this._colorTextures, + colorRenderbuffers: this._colorRenderbuffers, + depthStencilTexture: this._depthStencilTexture, + depthStencilRenderbuffer: this._depthStencilRenderbuffer, + destroyAttachments: !1 + }) : this._framebuffer = new Framebuffer({ + context: e, + colorTextures: this._colorTextures, + depthTexture: this._depthTexture, + depthRenderbuffer: this._depthRenderbuffer, + depthStencilTexture: this._depthStencilTexture, + depthStencilRenderbuffer: this._depthStencilRenderbuffer, + destroyAttachments: !1 + }); + } +}; +FramebufferManager.prototype.getColorTexture = function(e) { + return e = defaultValue(e, 0), this._colorTextures[e]; +}; +FramebufferManager.prototype.setColorTexture = function(e, t) { + t = defaultValue(t, 0), this._attachmentsDirty = e !== this._colorTextures[t], this._colorTextures[t] = e; +}; +FramebufferManager.prototype.getColorRenderbuffer = function(e) { + return e = defaultValue(e, 0), this._colorRenderbuffers[e]; +}; +FramebufferManager.prototype.setColorRenderbuffer = function(e, t) { + t = defaultValue(t, 0), this._attachmentsDirty = e !== this._colorRenderbuffers[t], this._colorRenderbuffers[t] = e; +}; +FramebufferManager.prototype.getDepthRenderbuffer = function() { + return this._depthRenderbuffer; +}; +FramebufferManager.prototype.setDepthRenderbuffer = function(e) { + this._attachmentsDirty = e !== this._depthRenderbuffer, this._depthRenderbuffer = e; +}; +FramebufferManager.prototype.getDepthTexture = function() { + return this._depthTexture; +}; +FramebufferManager.prototype.setDepthTexture = function(e) { + this._attachmentsDirty = e !== this._depthTexture, this._depthTexture = e; +}; +FramebufferManager.prototype.getDepthStencilRenderbuffer = function() { + return this._depthStencilRenderbuffer; +}; +FramebufferManager.prototype.setDepthStencilRenderbuffer = function(e) { + this._attachmentsDirty = e !== this._depthStencilRenderbuffer, this._depthStencilRenderbuffer = e; +}; +FramebufferManager.prototype.getDepthStencilTexture = function() { + return this._depthStencilTexture; +}; +FramebufferManager.prototype.setDepthStencilTexture = function(e) { + this._attachmentsDirty = e !== this._depthStencilTexture, this._depthStencilTexture = e; +}; +FramebufferManager.prototype.prepareTextures = function(e, t) { + this._numSamples > 1 && this._multisampleFramebuffer.blitFramebuffers(e, t); +}; +FramebufferManager.prototype.clear = function(e, t, n) { + const i = t.framebuffer; + t.framebuffer = this.framebuffer, t.execute(e, n), t.framebuffer = i; +}; +FramebufferManager.prototype.destroyFramebuffer = function() { + this._framebuffer = this._framebuffer && this._framebuffer.destroy(), this._multisampleFramebuffer = this._multisampleFramebuffer && this._multisampleFramebuffer.destroy(); +}; +FramebufferManager.prototype.destroy = function() { + if (this._color) { + let e; + const t = this._colorTextures.length; + for (e = 0; e < t; ++e) { + const n = this._colorTextures[e]; + this._createColorAttachments && defined(n) && !n.isDestroyed() && (this._colorTextures[e].destroy(), this._colorTextures[e] = void 0), defined(n) && n.isDestroyed() && (this._colorTextures[e] = void 0); + const i = this._colorRenderbuffers[e]; + this._createColorAttachments && defined(i) && !i.isDestroyed() && (this._colorRenderbuffers[e].destroy(), this._colorRenderbuffers[e] = void 0), defined(i) && i.isDestroyed() && (this._colorRenderbuffers[e] = void 0); + } + } + this._depthStencil && (this._createDepthAttachments && (this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(), this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy()), defined(this._depthStencilTexture) && this._depthStencilTexture.isDestroyed() && (this._depthStencilTexture = void 0), defined(this._depthStencilRenderbuffer) && this._depthStencilRenderbuffer.isDestroyed() && (this._depthStencilRenderbuffer = void 0)), this._depth && (this._createDepthAttachments && (this._depthTexture = this._depthTexture && this._depthTexture.destroy(), this._depthRenderbuffer = this._depthRenderbuffer && this._depthRenderbuffer.destroy()), defined(this._depthTexture) && this._depthTexture.isDestroyed() && (this._depthTexture = void 0), defined(this._depthRenderbuffer) && this._depthRenderbuffer.isDestroyed() && (this._depthRenderbuffer = void 0)), this.destroyFramebuffer(); +}; +const ShaderDestination = { + VERTEX: 0, + FRAGMENT: 1, + BOTH: 2 +}; +ShaderDestination.includesVertexShader = function(e) { + return e === ShaderDestination.VERTEX || e === ShaderDestination.BOTH; +}; +ShaderDestination.includesFragmentShader = function(e) { + return e === ShaderDestination.FRAGMENT || e === ShaderDestination.BOTH; +}; +const ShaderDestination$1 = Object.freeze(ShaderDestination); +function ShaderStruct(e) { + this.name = e, this.fields = []; +} +ShaderStruct.prototype.addField = function(e, t) { + const n = ` ${e} ${t};`; + this.fields.push(n); +}; +ShaderStruct.prototype.generateGlslLines = function() { + let e = this.fields; + return e.length === 0 && (e = [" float _empty;"]), [].concat(`struct ${this.name}`, "{", e, "};"); +}; +function ShaderFunction(e) { + this.signature = e, this.body = []; +} +ShaderFunction.prototype.addLines = function(e) { + const t = this.body; + if (Array.isArray(e)) { + const n = e.length; + for (let i = 0; i < n; i++) + t.push(` ${e[i]}`); + } else + t.push(` ${e}`); +}; +ShaderFunction.prototype.generateGlslLines = function() { + return [].concat(this.signature, "{", this.body, "}"); +}; +function ShaderBuilder() { + this._positionAttributeLine = void 0, this._nextAttributeLocation = 1, this._attributeLocations = {}, this._attributeLines = [], this._structs = {}, this._functions = {}, this._vertexShaderParts = { + defineLines: [], + uniformLines: [], + shaderLines: [], + varyingLines: [], + // identifiers of structs/functions to include, listed in insertion order + structIds: [], + functionIds: [] + }, this._fragmentShaderParts = { + defineLines: [], + uniformLines: [], + shaderLines: [], + varyingLines: [], + // identifiers of structs/functions to include, listed in insertion order + structIds: [], + functionIds: [] + }; +} +Object.defineProperties(ShaderBuilder.prototype, { + /** + * Get a dictionary of attribute names to the integer location in + * the vertex shader. + * + * @memberof ShaderBuilder.prototype + * @type {Object} + * @readonly + * @private + */ + attributeLocations: { + get: function() { + return this._attributeLocations; + } + } +}); +ShaderBuilder.prototype.addDefine = function(e, t, n) { + n = defaultValue(n, ShaderDestination$1.BOTH); + let i = e; + defined(t) && (i += ` ${t.toString()}`), ShaderDestination$1.includesVertexShader(n) && this._vertexShaderParts.defineLines.push(i), ShaderDestination$1.includesFragmentShader(n) && this._fragmentShaderParts.defineLines.push(i); +}; +ShaderBuilder.prototype.addStruct = function(e, t, n) { + this._structs[e] = new ShaderStruct(t), ShaderDestination$1.includesVertexShader(n) && this._vertexShaderParts.structIds.push(e), ShaderDestination$1.includesFragmentShader(n) && this._fragmentShaderParts.structIds.push(e); +}; +ShaderBuilder.prototype.addStructField = function(e, t, n) { + this._structs[e].addField(t, n); +}; +ShaderBuilder.prototype.addFunction = function(e, t, n) { + this._functions[e] = new ShaderFunction(t), ShaderDestination$1.includesVertexShader(n) && this._vertexShaderParts.functionIds.push(e), ShaderDestination$1.includesFragmentShader(n) && this._fragmentShaderParts.functionIds.push(e); +}; +ShaderBuilder.prototype.addFunctionLines = function(e, t) { + this._functions[e].addLines(t); +}; +ShaderBuilder.prototype.addUniform = function(e, t, n) { + n = defaultValue(n, ShaderDestination$1.BOTH); + const i = `uniform ${e} ${t};`; + ShaderDestination$1.includesVertexShader(n) && this._vertexShaderParts.uniformLines.push(i), ShaderDestination$1.includesFragmentShader(n) && this._fragmentShaderParts.uniformLines.push(i); +}; +ShaderBuilder.prototype.setPositionAttribute = function(e, t) { + return this._positionAttributeLine = `in ${e} ${t};`, this._attributeLocations[t] = 0, 0; +}; +ShaderBuilder.prototype.addAttribute = function(e, t) { + const n = `in ${e} ${t};`; + this._attributeLines.push(n); + const i = this._nextAttributeLocation; + return this._attributeLocations[t] = i, this._nextAttributeLocation += getAttributeLocationCount(e), i; +}; +ShaderBuilder.prototype.addVarying = function(e, t, n) { + n = defined(n) ? `${n} ` : ""; + const i = `${e} ${t};`; + this._vertexShaderParts.varyingLines.push(`${n}out ${i}`), this._fragmentShaderParts.varyingLines.push(`${n}in ${i}`); +}; +ShaderBuilder.prototype.addVertexLines = function(e) { + const t = this._vertexShaderParts.shaderLines; + Array.isArray(e) ? t.push.apply(t, e) : t.push(e); +}; +ShaderBuilder.prototype.addFragmentLines = function(e) { + const t = this._fragmentShaderParts.shaderLines; + Array.isArray(e) ? t.push.apply(t, e) : t.push(e); +}; +ShaderBuilder.prototype.buildShaderProgram = function(e) { + const t = defined(this._positionAttributeLine) ? [this._positionAttributeLine] : [], n = generateStructLines(this), i = generateFunctionLines(this), r = t.concat( + this._attributeLines, + this._vertexShaderParts.uniformLines, + this._vertexShaderParts.varyingLines, + n.vertexLines, + i.vertexLines, + this._vertexShaderParts.shaderLines + ).join(` +`), o = new ShaderSource({ + defines: this._vertexShaderParts.defineLines, + sources: [r] + }), s = this._fragmentShaderParts.uniformLines.concat( + this._fragmentShaderParts.varyingLines, + n.fragmentLines, + i.fragmentLines, + this._fragmentShaderParts.shaderLines + ).join(` +`), c = new ShaderSource({ + defines: this._fragmentShaderParts.defineLines, + sources: [s] + }); + return ShaderProgram.fromCache({ + context: e, + vertexShaderSource: o, + fragmentShaderSource: c, + attributeLocations: this._attributeLocations + }); +}; +ShaderBuilder.prototype.clone = function() { + return clone$1(this, !0); +}; +function generateStructLines(e) { + const t = [], n = []; + let i, r = e._vertexShaderParts.structIds, o, s, c; + for (i = 0; i < r.length; i++) + o = r[i], s = e._structs[o], c = s.generateGlslLines(), t.push.apply(t, c); + for (r = e._fragmentShaderParts.structIds, i = 0; i < r.length; i++) + o = r[i], s = e._structs[o], c = s.generateGlslLines(), n.push.apply(n, c); + return { + vertexLines: t, + fragmentLines: n + }; +} +function getAttributeLocationCount(e) { + switch (e) { + case "mat2": + return 2; + case "mat3": + return 3; + case "mat4": + return 4; + default: + return 1; + } +} +function generateFunctionLines(e) { + const t = [], n = []; + let i, r = e._vertexShaderParts.functionIds, o, s, c; + for (i = 0; i < r.length; i++) + o = r[i], s = e._functions[o], c = s.generateGlslLines(), t.push.apply(t, c); + for (r = e._fragmentShaderParts.functionIds, i = 0; i < r.length; i++) + o = r[i], s = e._functions[o], c = s.generateGlslLines(), n.push.apply(n, c); + return { + vertexLines: t, + fragmentLines: n + }; +} +function VertexArrayFacade(e, t, n, i) { + const r = VertexArrayFacade._verifyAttributes(t); + n = defaultValue(n, 0); + const o = [], s = {}; + let c, l; + const d = r.length; + for (let h = 0; h < d; ++h) { + const p = r[h]; + if (p.vertexBuffer) { + o.push(p); + continue; + } + l = p.usage, c = s[l], defined(c) || (c = s[l] = []), c.push(p); + } + function f(h, p) { + return ComponentDatatype$1.getSizeInBytes(p.componentDatatype) - ComponentDatatype$1.getSizeInBytes(h.componentDatatype); + } + this._allBuffers = []; + for (l in s) + if (s.hasOwnProperty(l)) { + c = s[l], c.sort(f); + const h = VertexArrayFacade._vertexSizeInBytes( + c + ), p = c[0].usage, m = { + vertexSizeInBytes: h, + vertexBuffer: void 0, + usage: p, + needsCommit: !1, + arrayBuffer: void 0, + arrayViews: VertexArrayFacade._createArrayViews( + c, + h + ) + }; + this._allBuffers.push(m); + } + this._size = 0, this._instanced = defaultValue(i, !1), this._precreated = o, this._context = e, this.writers = void 0, this.va = void 0, this.resize(n); +} +VertexArrayFacade._verifyAttributes = function(e) { + const t = []; + for (let i = 0; i < e.length; ++i) { + const r = e[i], o = { + index: defaultValue(r.index, i), + enabled: defaultValue(r.enabled, !0), + componentsPerAttribute: r.componentsPerAttribute, + componentDatatype: defaultValue( + r.componentDatatype, + ComponentDatatype$1.FLOAT + ), + normalize: defaultValue(r.normalize, !1), + // There will be either a vertexBuffer or an [optional] usage. + vertexBuffer: r.vertexBuffer, + usage: defaultValue(r.usage, BufferUsage$1.STATIC_DRAW) + }; + t.push(o); + } + const n = new Array(t.length); + for (let i = 0; i < t.length; ++i) { + const o = t[i].index; + n[o] = !0; + } + return t; +}; +VertexArrayFacade._vertexSizeInBytes = function(e) { + let t = 0; + const n = e.length; + for (let s = 0; s < n; ++s) { + const c = e[s]; + t += c.componentsPerAttribute * ComponentDatatype$1.getSizeInBytes(c.componentDatatype); + } + const i = n > 0 ? ComponentDatatype$1.getSizeInBytes(e[0].componentDatatype) : 0, r = i > 0 ? t % i : 0, o = r === 0 ? 0 : i - r; + return t += o, t; +}; +VertexArrayFacade._createArrayViews = function(e, t) { + const n = []; + let i = 0; + const r = e.length; + for (let o = 0; o < r; ++o) { + const s = e[o], c = s.componentDatatype; + n.push({ + index: s.index, + enabled: s.enabled, + componentsPerAttribute: s.componentsPerAttribute, + componentDatatype: c, + normalize: s.normalize, + offsetInBytes: i, + vertexSizeInComponentType: t / ComponentDatatype$1.getSizeInBytes(c), + view: void 0 + }), i += s.componentsPerAttribute * ComponentDatatype$1.getSizeInBytes(c); + } + return n; +}; +VertexArrayFacade.prototype.resize = function(e) { + this._size = e; + const t = this._allBuffers; + this.writers = []; + for (let n = 0, i = t.length; n < i; ++n) { + const r = t[n]; + VertexArrayFacade._resize(r, this._size), VertexArrayFacade._appendWriters(this.writers, r); + } + destroyVA(this); +}; +VertexArrayFacade._resize = function(e, t) { + if (e.vertexSizeInBytes > 0) { + const n = new ArrayBuffer(t * e.vertexSizeInBytes); + if (defined(e.arrayBuffer)) { + const o = new Uint8Array(n), s = new Uint8Array(e.arrayBuffer), c = s.length; + for (let l = 0; l < c; ++l) + o[l] = s[l]; + } + const i = e.arrayViews, r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o]; + s.view = ComponentDatatype$1.createArrayBufferView( + s.componentDatatype, + n, + s.offsetInBytes + ); + } + e.arrayBuffer = n; + } +}; +const createWriters = [ + // 1 component per attribute + function(e, t, n) { + return function(i, r) { + t[i * n] = r, e.needsCommit = !0; + }; + }, + // 2 component per attribute + function(e, t, n) { + return function(i, r, o) { + const s = i * n; + t[s] = r, t[s + 1] = o, e.needsCommit = !0; + }; + }, + // 3 component per attribute + function(e, t, n) { + return function(i, r, o, s) { + const c = i * n; + t[c] = r, t[c + 1] = o, t[c + 2] = s, e.needsCommit = !0; + }; + }, + // 4 component per attribute + function(e, t, n) { + return function(i, r, o, s, c) { + const l = i * n; + t[l] = r, t[l + 1] = o, t[l + 2] = s, t[l + 3] = c, e.needsCommit = !0; + }; + } +]; +VertexArrayFacade._appendWriters = function(e, t) { + const n = t.arrayViews, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + e[o.index] = createWriters[o.componentsPerAttribute - 1](t, o.view, o.vertexSizeInComponentType); + } +}; +VertexArrayFacade.prototype.commit = function(e) { + let t = !1; + const n = this._allBuffers; + let i, r, o; + for (r = 0, o = n.length; r < o; ++r) + i = n[r], t = commit(this, i) || t; + if (t || !defined(this.va)) { + destroyVA(this); + const s = this.va = [], c = CesiumMath.SIXTY_FOUR_KILOBYTES - 4, l = defined(e) && !this._instanced ? Math.ceil(this._size / c) : 1; + for (let d = 0; d < l; ++d) { + let f = []; + for (r = 0, o = n.length; r < o; ++r) { + i = n[r]; + const h = d * (i.vertexSizeInBytes * c); + VertexArrayFacade._appendAttributes( + f, + i, + h, + this._instanced + ); + } + f = f.concat(this._precreated), s.push({ + va: new VertexArray({ + context: this._context, + attributes: f, + indexBuffer: e + }), + indicesCount: 1.5 * (d !== l - 1 ? c : this._size % c) + // TODO: not hardcode 1.5, this assumes 6 indices per 4 vertices (as for Billboard quads). + }); + } + } +}; +function commit(e, t) { + if (t.needsCommit && t.vertexSizeInBytes > 0) { + t.needsCommit = !1; + const n = t.vertexBuffer, i = e._size * t.vertexSizeInBytes, r = defined(n); + if (!r || n.sizeInBytes < i) + return r && n.destroy(), t.vertexBuffer = Buffer.createVertexBuffer({ + context: e._context, + typedArray: t.arrayBuffer, + usage: t.usage + }), t.vertexBuffer.vertexArrayDestroyable = !1, !0; + t.vertexBuffer.copyFromArrayView(t.arrayBuffer); + } + return !1; +} +VertexArrayFacade._appendAttributes = function(e, t, n, i) { + const r = t.arrayViews, o = r.length; + for (let s = 0; s < o; ++s) { + const c = r[s]; + e.push({ + index: c.index, + enabled: c.enabled, + componentsPerAttribute: c.componentsPerAttribute, + componentDatatype: c.componentDatatype, + normalize: c.normalize, + vertexBuffer: t.vertexBuffer, + offsetInBytes: n + c.offsetInBytes, + strideInBytes: t.vertexSizeInBytes, + instanceDivisor: i ? 1 : 0 + }); + } +}; +VertexArrayFacade.prototype.subCommit = function(e, t) { + const n = this._allBuffers; + for (let i = 0, r = n.length; i < r; ++i) + subCommit(n[i], e, t); +}; +function subCommit(e, t, n) { + if (e.needsCommit && e.vertexSizeInBytes > 0) { + const i = e.vertexSizeInBytes * t, r = e.vertexSizeInBytes * n; + e.vertexBuffer.copyFromArrayView( + new Uint8Array(e.arrayBuffer, i, r), + i + ); + } +} +VertexArrayFacade.prototype.endSubCommits = function() { + const e = this._allBuffers; + for (let t = 0, n = e.length; t < n; ++t) + e[t].needsCommit = !1; +}; +function destroyVA(e) { + const t = e.va; + if (!defined(t)) + return; + const n = t.length; + for (let i = 0; i < n; ++i) + t[i].va.destroy(); + e.va = void 0; +} +VertexArrayFacade.prototype.isDestroyed = function() { + return !1; +}; +VertexArrayFacade.prototype.destroy = function() { + const e = this._allBuffers; + for (let t = 0, n = e.length; t < n; ++t) { + const i = e[t]; + i.vertexBuffer = i.vertexBuffer && i.vertexBuffer.destroy(); + } + return destroyVA(this), destroyObject(this); +}; +function loadCubeMap(e, t, n) { + const i = { + flipY: !0, + skipColorSpaceConversion: n, + preferImageBitmap: !0 + }, r = [ + Resource.createIfNeeded(t.positiveX).fetchImage(i), + Resource.createIfNeeded(t.negativeX).fetchImage(i), + Resource.createIfNeeded(t.positiveY).fetchImage(i), + Resource.createIfNeeded(t.negativeY).fetchImage(i), + Resource.createIfNeeded(t.positiveZ).fetchImage(i), + Resource.createIfNeeded(t.negativeZ).fetchImage(i) + ]; + return Promise.all(r).then(function(o) { + return new CubeMap({ + context: e, + source: { + positiveX: o[0], + negativeX: o[1], + positiveY: o[2], + negativeY: o[3], + positiveZ: o[4], + negativeZ: o[5] + } + }); + }); +} +function ConstantProperty(e) { + this._value = void 0, this._hasClone = !1, this._hasEquals = !1, this._definitionChanged = new Event(), this.setValue(e); +} +Object.defineProperties(ConstantProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * This property always returns true. + * @memberof ConstantProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + value: !0 + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + * @memberof ConstantProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +ConstantProperty.prototype.getValue = function(e, t) { + return this._hasClone ? this._value.clone(t) : this._value; +}; +ConstantProperty.prototype.setValue = function(e) { + const t = this._value; + if (t !== e) { + const n = defined(e), i = n && typeof e.clone == "function", r = n && typeof e.equals == "function"; + (!r || !e.equals(t)) && (this._hasClone = i, this._hasEquals = r, this._value = i ? e.clone(this._value) : e, this._definitionChanged.raiseEvent(this)); + } +}; +ConstantProperty.prototype.equals = function(e) { + return this === e || // + e instanceof ConstantProperty && // + (!this._hasEquals && this._value === e._value || // + this._hasEquals && this._value.equals(e._value)); +}; +ConstantProperty.prototype.valueOf = function() { + return this._value; +}; +ConstantProperty.prototype.toString = function() { + return String(this._value); +}; +function createProperty(e, t, n, i, r) { + return { + configurable: i, + get: function() { + return this[t]; + }, + set: function(o) { + const s = this[t], c = this[n]; + defined(c) && (c(), this[n] = void 0), o !== void 0 && (!defined(o) || !defined(o.getValue)) && defined(r) && (o = r(o)), s !== o && (this[t] = o, this._definitionChanged.raiseEvent(this, e, o, s)), defined(o) && defined(o.definitionChanged) && (this[n] = o.definitionChanged.addEventListener( + function() { + this._definitionChanged.raiseEvent(this, e, o, o); + }, + this + )); + } + }; +} +function createConstantProperty$1(e) { + return new ConstantProperty(e); +} +function createPropertyDescriptor(e, t, n) { + return createProperty( + e, + `_${e.toString()}`, + `_${e.toString()}Subscription`, + defaultValue(t, !1), + defaultValue(n, createConstantProperty$1) + ); +} +function BillboardGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._image = void 0, this._imageSubscription = void 0, this._scale = void 0, this._scaleSubscription = void 0, this._pixelOffset = void 0, this._pixelOffsetSubscription = void 0, this._eyeOffset = void 0, this._eyeOffsetSubscription = void 0, this._horizontalOrigin = void 0, this._horizontalOriginSubscription = void 0, this._verticalOrigin = void 0, this._verticalOriginSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._color = void 0, this._colorSubscription = void 0, this._rotation = void 0, this._rotationSubscription = void 0, this._alignedAxis = void 0, this._alignedAxisSubscription = void 0, this._sizeInMeters = void 0, this._sizeInMetersSubscription = void 0, this._width = void 0, this._widthSubscription = void 0, this._height = void 0, this._heightSubscription = void 0, this._scaleByDistance = void 0, this._scaleByDistanceSubscription = void 0, this._translucencyByDistance = void 0, this._translucencyByDistanceSubscription = void 0, this._pixelOffsetScaleByDistance = void 0, this._pixelOffsetScaleByDistanceSubscription = void 0, this._imageSubRegion = void 0, this._imageSubRegionSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._disableDepthTestDistance = void 0, this._disableDepthTestDistanceSubscription = void 0, this._splitDirection = void 0, this._splitDirectionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(BillboardGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof BillboardGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the billboard. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the Image, URI, or Canvas to use for the billboard. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + image: createPropertyDescriptor("image"), + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the billboard while a scale less than 1.0 shrinks it. + *

+ *

+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, and 2.0. + *
+ *

+ * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + scale: createPropertyDescriptor("scale"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the billboard's pixel offset in screen space + * from the origin of this billboard. This is commonly used to align multiple billboards and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

+ *

+ * + * + * + *
default
b.pixeloffset = new Cartesian2(50, 25);
+ * The billboard's origin is indicated by the yellow point. + *
+ *

+ * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default Cartesian2.ZERO + */ + pixelOffset: createPropertyDescriptor("pixelOffset"), + /** + * Gets or sets the {@link Cartesian3} Property specifying the billboard's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

+ * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

+ * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *

+ * + * + * + *
+ * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0); + *
+ *

+ * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default Cartesian3.ZERO + */ + eyeOffset: createPropertyDescriptor("eyeOffset"), + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default HorizontalOrigin.CENTER + */ + horizontalOrigin: createPropertyDescriptor("horizontalOrigin"), + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default VerticalOrigin.CENTER + */ + verticalOrigin: createPropertyDescriptor("verticalOrigin"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the Property specifying the {@link Color} that is multiplied with the image. + * This has two common use cases. First, the same white texture may be used by many different billboards, + * each with a different color, to create colored billboards. Second, the color's alpha component can be + * used to make the billboard translucent as shown below. An alpha of 0.0 makes the billboard + * transparent, and 1.0 makes the billboard opaque. + *

+ *

+ * + * + * + *
default
alpha : 0.5
+ *
+ *

+ * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the numeric Property specifying the rotation of the image + * counter clockwise from the alignedAxis. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + rotation: createPropertyDescriptor("rotation"), + /** + * Gets or sets the {@link Cartesian3} Property specifying the unit vector axis of rotation + * in the fixed frame. When set to Cartesian3.ZERO the rotation is from the top of the screen. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default Cartesian3.ZERO + */ + alignedAxis: createPropertyDescriptor("alignedAxis"), + /** + * Gets or sets the boolean Property specifying if this billboard's size will be measured in meters. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default false + */ + sizeInMeters: createPropertyDescriptor("sizeInMeters"), + /** + * Gets or sets the numeric Property specifying the width of the billboard in pixels. + * When undefined, the native width is used. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + width: createPropertyDescriptor("width"), + /** + * Gets or sets the numeric Property specifying the height of the billboard in pixels. + * When undefined, the native height is used. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + height: createPropertyDescriptor("height"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the scale of the billboard based on the distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + scaleByDistance: createPropertyDescriptor("scaleByDistance"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the billboard based on the distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + translucencyByDistance: createPropertyDescriptor("translucencyByDistance"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the billboard based on the distance from the camera. + * A billboard's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset remains clamped to the nearest bound. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + pixelOffsetScaleByDistance: createPropertyDescriptor( + "pixelOffsetScaleByDistance" + ), + /** + * Gets or sets the Property specifying a {@link BoundingRectangle} that defines a + * sub-region of the image to use for the billboard, rather than the entire image, + * measured in pixels from the bottom-left. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + imageSubRegion: createPropertyDescriptor("imageSubRegion"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this billboard will be displayed. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + */ + disableDepthTestDistance: createPropertyDescriptor( + "disableDepthTestDistance" + ), + /** + * Gets or sets the Property specifying the {@link SplitDirection} of this billboard. + * @memberof BillboardGraphics.prototype + * @type {Property|undefined} + * @default SplitDirection.NONE + */ + splitDirection: createPropertyDescriptor("splitDirection") +}); +BillboardGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this._show, e.image = this._image, e.scale = this._scale, e.pixelOffset = this._pixelOffset, e.eyeOffset = this._eyeOffset, e.horizontalOrigin = this._horizontalOrigin, e.verticalOrigin = this._verticalOrigin, e.heightReference = this._heightReference, e.color = this._color, e.rotation = this._rotation, e.alignedAxis = this._alignedAxis, e.sizeInMeters = this._sizeInMeters, e.width = this._width, e.height = this._height, e.scaleByDistance = this._scaleByDistance, e.translucencyByDistance = this._translucencyByDistance, e.pixelOffsetScaleByDistance = this._pixelOffsetScaleByDistance, e.imageSubRegion = this._imageSubRegion, e.distanceDisplayCondition = this._distanceDisplayCondition, e.disableDepthTestDistance = this._disableDepthTestDistance, e.splitDirection = this._splitDirection, e) : new BillboardGraphics(this); +}; +BillboardGraphics.prototype.merge = function(e) { + this.show = defaultValue(this._show, e.show), this.image = defaultValue(this._image, e.image), this.scale = defaultValue(this._scale, e.scale), this.pixelOffset = defaultValue(this._pixelOffset, e.pixelOffset), this.eyeOffset = defaultValue(this._eyeOffset, e.eyeOffset), this.horizontalOrigin = defaultValue( + this._horizontalOrigin, + e.horizontalOrigin + ), this.verticalOrigin = defaultValue( + this._verticalOrigin, + e.verticalOrigin + ), this.heightReference = defaultValue( + this._heightReference, + e.heightReference + ), this.color = defaultValue(this._color, e.color), this.rotation = defaultValue(this._rotation, e.rotation), this.alignedAxis = defaultValue(this._alignedAxis, e.alignedAxis), this.sizeInMeters = defaultValue(this._sizeInMeters, e.sizeInMeters), this.width = defaultValue(this._width, e.width), this.height = defaultValue(this._height, e.height), this.scaleByDistance = defaultValue( + this._scaleByDistance, + e.scaleByDistance + ), this.translucencyByDistance = defaultValue( + this._translucencyByDistance, + e.translucencyByDistance + ), this.pixelOffsetScaleByDistance = defaultValue( + this._pixelOffsetScaleByDistance, + e.pixelOffsetScaleByDistance + ), this.imageSubRegion = defaultValue( + this._imageSubRegion, + e.imageSubRegion + ), this.distanceDisplayCondition = defaultValue( + this._distanceDisplayCondition, + e.distanceDisplayCondition + ), this.disableDepthTestDistance = defaultValue( + this._disableDepthTestDistance, + e.disableDepthTestDistance + ), this.splitDirection = defaultValue( + this.splitDirection, + e.splitDirection + ); +}; +function AssociativeArray() { + this._array = [], this._hash = {}; +} +Object.defineProperties(AssociativeArray.prototype, { + /** + * Gets the number of items in the collection. + * @memberof AssociativeArray.prototype + * + * @type {number} + */ + length: { + get: function() { + return this._array.length; + } + }, + /** + * Gets an unordered array of all values in the collection. + * This is a live array that will automatically reflect the values in the collection, + * it should not be modified directly. + * @memberof AssociativeArray.prototype + * + * @type {Array} + */ + values: { + get: function() { + return this._array; + } + } +}); +AssociativeArray.prototype.contains = function(e) { + return defined(this._hash[e]); +}; +AssociativeArray.prototype.set = function(e, t) { + const n = this._hash[e]; + t !== n && (this.remove(e), this._hash[e] = t, this._array.push(t)); +}; +AssociativeArray.prototype.get = function(e) { + return this._hash[e]; +}; +AssociativeArray.prototype.remove = function(e) { + const t = this._hash[e], n = defined(t); + if (n) { + const i = this._array; + i.splice(i.indexOf(t), 1), delete this._hash[e]; + } + return n; +}; +AssociativeArray.prototype.removeAll = function() { + const e = this._array; + e.length > 0 && (this._hash = {}, e.length = 0); +}; +function DistanceDisplayCondition(e, t) { + e = defaultValue(e, 0), this._near = e, t = defaultValue(t, Number.MAX_VALUE), this._far = t; +} +Object.defineProperties(DistanceDisplayCondition.prototype, { + /** + * The smallest distance in the interval where the object is visible. + * @memberof DistanceDisplayCondition.prototype + * @type {number} + * @default 0.0 + */ + near: { + get: function() { + return this._near; + }, + set: function(e) { + this._near = e; + } + }, + /** + * The largest distance in the interval where the object is visible. + * @memberof DistanceDisplayCondition.prototype + * @type {number} + * @default Number.MAX_VALUE + */ + far: { + get: function() { + return this._far; + }, + set: function(e) { + this._far = e; + } + } +}); +DistanceDisplayCondition.packedLength = 2; +DistanceDisplayCondition.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.near, t[n] = e.far, t; +}; +DistanceDisplayCondition.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new DistanceDisplayCondition()), n.near = e[t++], n.far = e[t], n; +}; +DistanceDisplayCondition.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.near === t.near && e.far === t.far; +}; +DistanceDisplayCondition.clone = function(e, t) { + if (defined(e)) + return defined(t) || (t = new DistanceDisplayCondition()), t.near = e.near, t.far = e.far, t; +}; +DistanceDisplayCondition.prototype.clone = function(e) { + return DistanceDisplayCondition.clone(this, e); +}; +DistanceDisplayCondition.prototype.equals = function(e) { + return DistanceDisplayCondition.equals(this, e); +}; +function NearFarScalar(e, t, n, i) { + this.near = defaultValue(e, 0), this.nearValue = defaultValue(t, 0), this.far = defaultValue(n, 1), this.farValue = defaultValue(i, 0); +} +NearFarScalar.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.near = e.near, t.nearValue = e.nearValue, t.far = e.far, t.farValue = e.farValue, t) : new NearFarScalar( + e.near, + e.nearValue, + e.far, + e.farValue + ); +}; +NearFarScalar.packedLength = 4; +NearFarScalar.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.near, t[n++] = e.nearValue, t[n++] = e.far, t[n] = e.farValue, t; +}; +NearFarScalar.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new NearFarScalar()), n.near = e[t++], n.nearValue = e[t++], n.far = e[t++], n.farValue = e[t], n; +}; +NearFarScalar.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.near === t.near && e.nearValue === t.nearValue && e.far === t.far && e.farValue === t.farValue; +}; +NearFarScalar.prototype.clone = function(e) { + return NearFarScalar.clone(this, e); +}; +NearFarScalar.prototype.equals = function(e) { + return NearFarScalar.equals(this, e); +}; +const HeightReference = { + /** + * The position is absolute. + * @type {number} + * @constant + */ + NONE: 0, + /** + * The position is clamped to the terrain and 3D Tiles. + * @type {number} + * @constant + */ + CLAMP_TO_GROUND: 1, + /** + * The position height is the height above the terrain and 3D Tiles. + * @type {number} + * @constant + */ + RELATIVE_TO_GROUND: 2, + /** + * The position is clamped to terain. + * @type {number} + * @constant + */ + CLAMP_TO_TERRAIN: 3, + /** + * The position height is the height above terrain. + * @type {number} + * @constant + */ + RELATIVE_TO_TERRAIN: 4, + /** + * The position is clamped to 3D Tiles. + * @type {number} + * @constant + */ + CLAMP_TO_3D_TILE: 5, + /** + * The position height is the height above 3D Tiles. + * @type {number} + * @constant + */ + RELATIVE_TO_3D_TILE: 6 +}, HeightReference$1 = Object.freeze(HeightReference); +function isHeightReferenceClamp(e) { + return e === HeightReference.CLAMP_TO_GROUND || e === HeightReference.CLAMP_TO_3D_TILE || e === HeightReference.CLAMP_TO_TERRAIN; +} +function isHeightReferenceRelative(e) { + return e === HeightReference.RELATIVE_TO_GROUND || e === HeightReference.RELATIVE_TO_3D_TILE || e === HeightReference.RELATIVE_TO_TERRAIN; +} +const HorizontalOrigin = { + /** + * The origin is at the horizontal center of the object. + * + * @type {number} + * @constant + */ + CENTER: 0, + /** + * The origin is on the left side of the object. + * + * @type {number} + * @constant + */ + LEFT: 1, + /** + * The origin is on the right side of the object. + * + * @type {number} + * @constant + */ + RIGHT: -1 +}, HorizontalOrigin$1 = Object.freeze(HorizontalOrigin), VerticalOrigin = { + /** + * The origin is at the vertical center between BASELINE and TOP. + * + * @type {number} + * @constant + */ + CENTER: 0, + /** + * The origin is at the bottom of the object. + * + * @type {number} + * @constant + */ + BOTTOM: 1, + /** + * If the object contains text, the origin is at the baseline of the text, else the origin is at the bottom of the object. + * + * @type {number} + * @constant + */ + BASELINE: 2, + /** + * The origin is at the top of the object. + * + * @type {number} + * @constant + */ + TOP: -1 +}, VerticalOrigin$1 = Object.freeze(VerticalOrigin), BoundingSphereState = { + /** + * The BoundingSphere has been computed. + * @type BoundingSphereState + * @constant + */ + DONE: 0, + /** + * The BoundingSphere is still being computed. + * @type BoundingSphereState + * @constant + */ + PENDING: 1, + /** + * The BoundingSphere does not exist. + * @type BoundingSphereState + * @constant + */ + FAILED: 2 +}, BoundingSphereState$1 = Object.freeze(BoundingSphereState); +function Property() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(Property.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof Property.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof Property.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: DeveloperError.throwInstantiationError + } +}); +Property.prototype.getValue = DeveloperError.throwInstantiationError; +Property.prototype.equals = DeveloperError.throwInstantiationError; +Property.equals = function(e, t) { + return e === t || defined(e) && e.equals(t); +}; +Property.arrayEquals = function(e, t) { + if (e === t) + return !0; + if (!defined(e) || !defined(t) || e.length !== t.length) + return !1; + const n = e.length; + for (let i = 0; i < n; i++) + if (!Property.equals(e[i], t[i])) + return !1; + return !0; +}; +Property.isConstant = function(e) { + return !defined(e) || e.isConstant; +}; +Property.getValueOrUndefined = function(e, t, n) { + return defined(e) ? e.getValue(t, n) : void 0; +}; +Property.getValueOrDefault = function(e, t, n, i) { + return defined(e) ? defaultValue(e.getValue(t, i), n) : n; +}; +Property.getValueOrClonedDefault = function(e, t, n, i) { + let r; + return defined(e) && (r = e.getValue(t, i)), defined(r) || (r = n.clone(r)), r; +}; +const SplitDirection = { + /** + * Display the primitive or ImageryLayer to the left of the {@link Scene#splitPosition}. + * + * @type {number} + * @constant + */ + LEFT: -1, + /** + * Always display the primitive or ImageryLayer. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * Display the primitive or ImageryLayer to the right of the {@link Scene#splitPosition}. + * + * @type {number} + * @constant + */ + RIGHT: 1 +}, SplitDirection$1 = Object.freeze(SplitDirection), defaultColor$8 = Color.WHITE, defaultEyeOffset$1 = Cartesian3.ZERO, defaultHeightReference$2 = HeightReference$1.NONE, defaultPixelOffset$1 = Cartesian2.ZERO, defaultScale$4 = 1, defaultRotation$1 = 0, defaultAlignedAxis = Cartesian3.ZERO, defaultHorizontalOrigin$1 = HorizontalOrigin$1.CENTER, defaultVerticalOrigin$1 = VerticalOrigin$1.CENTER, defaultSizeInMeters = !1, defaultSplitDirection$1 = SplitDirection$1.NONE, positionScratch$d = new Cartesian3(), colorScratch$7 = new Color(), eyeOffsetScratch$1 = new Cartesian3(), pixelOffsetScratch$1 = new Cartesian2(), scaleByDistanceScratch$2 = new NearFarScalar(), translucencyByDistanceScratch$2 = new NearFarScalar(), pixelOffsetScaleByDistanceScratch$1 = new NearFarScalar(), boundingRectangleScratch = new BoundingRectangle(), distanceDisplayConditionScratch$8 = new DistanceDisplayCondition(); +function EntityData$3(e) { + this.entity = e, this.billboard = void 0, this.textureValue = void 0; +} +function BillboardVisualizer(e, t) { + t.collectionChanged.addEventListener( + BillboardVisualizer.prototype._onCollectionChanged, + this + ), this._cluster = e, this._entityCollection = t, this._items = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +BillboardVisualizer.prototype.update = function(e) { + const t = this._items.values, n = this._cluster; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i], s = o.entity, c = s._billboard; + let l, d = o.billboard, f = s.isShowing && s.isAvailable(e) && Property.getValueOrDefault(c._show, e, !0), h; + if (f && (h = Property.getValueOrUndefined( + s._position, + e, + positionScratch$d + ), l = Property.getValueOrUndefined( + c._image, + e + ), f = defined(h) && defined(l)), !f) { + returnPrimitive$2(o, s, n); + continue; + } + Property.isConstant(s._position) || (n._clusterDirty = !0), defined(d) || (d = n.getBillboard(s), d.id = s, d.image = void 0, o.billboard = d), d.show = f, (!defined(d.image) || o.textureValue !== l) && (d.image = l, o.textureValue = l), d.position = h, d.color = Property.getValueOrDefault( + c._color, + e, + defaultColor$8, + colorScratch$7 + ), d.eyeOffset = Property.getValueOrDefault( + c._eyeOffset, + e, + defaultEyeOffset$1, + eyeOffsetScratch$1 + ), d.heightReference = Property.getValueOrDefault( + c._heightReference, + e, + defaultHeightReference$2 + ), d.pixelOffset = Property.getValueOrDefault( + c._pixelOffset, + e, + defaultPixelOffset$1, + pixelOffsetScratch$1 + ), d.scale = Property.getValueOrDefault( + c._scale, + e, + defaultScale$4 + ), d.rotation = Property.getValueOrDefault( + c._rotation, + e, + defaultRotation$1 + ), d.alignedAxis = Property.getValueOrDefault( + c._alignedAxis, + e, + defaultAlignedAxis + ), d.horizontalOrigin = Property.getValueOrDefault( + c._horizontalOrigin, + e, + defaultHorizontalOrigin$1 + ), d.verticalOrigin = Property.getValueOrDefault( + c._verticalOrigin, + e, + defaultVerticalOrigin$1 + ), d.width = Property.getValueOrUndefined( + c._width, + e + ), d.height = Property.getValueOrUndefined( + c._height, + e + ), d.scaleByDistance = Property.getValueOrUndefined( + c._scaleByDistance, + e, + scaleByDistanceScratch$2 + ), d.translucencyByDistance = Property.getValueOrUndefined( + c._translucencyByDistance, + e, + translucencyByDistanceScratch$2 + ), d.pixelOffsetScaleByDistance = Property.getValueOrUndefined( + c._pixelOffsetScaleByDistance, + e, + pixelOffsetScaleByDistanceScratch$1 + ), d.sizeInMeters = Property.getValueOrDefault( + c._sizeInMeters, + e, + defaultSizeInMeters + ), d.distanceDisplayCondition = Property.getValueOrUndefined( + c._distanceDisplayCondition, + e, + distanceDisplayConditionScratch$8 + ), d.disableDepthTestDistance = Property.getValueOrUndefined( + c._disableDepthTestDistance, + e + ), d.splitDirection = Property.getValueOrDefault( + c._splitDirection, + e, + defaultSplitDirection$1 + ); + const p = Property.getValueOrUndefined( + c._imageSubRegion, + e, + boundingRectangleScratch + ); + defined(p) && d.setImageSubRegion(d._imageId, p); + } + return !0; +}; +BillboardVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = this._items.get(e.id); + if (!defined(n) || !defined(n.billboard)) + return BoundingSphereState$1.FAILED; + const i = n.billboard; + if (i.heightReference === HeightReference$1.NONE) + t.center = Cartesian3.clone(i.position, t.center); + else { + if (!defined(i._clampedPosition)) + return BoundingSphereState$1.PENDING; + t.center = Cartesian3.clone(i._clampedPosition, t.center); + } + return t.radius = 0, BoundingSphereState$1.DONE; +}; +BillboardVisualizer.prototype.isDestroyed = function() { + return !1; +}; +BillboardVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + BillboardVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._entityCollection.values; + for (let t = 0; t < e.length; t++) + this._cluster.removeBillboard(e[t]); + return destroyObject(this); +}; +BillboardVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o; + const s = this._items, c = this._cluster; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._billboard) && defined(o._position) && s.set(o.id, new EntityData$3(o)); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._billboard) && defined(o._position) ? s.contains(o.id) || s.set(o.id, new EntityData$3(o)) : (returnPrimitive$2(s.get(o.id), o, c), s.remove(o.id)); + for (r = n.length - 1; r > -1; r--) + o = n[r], returnPrimitive$2(s.get(o.id), o, c), s.remove(o.id); +}; +function returnPrimitive$2(e, t, n) { + defined(e) && (e.billboard = void 0, n.removeBillboard(t)); +} +function Interval(e, t) { + this.start = defaultValue(e, 0), this.stop = defaultValue(t, 0); +} +function BoundingSphere(e, t) { + this.center = Cartesian3.clone(defaultValue(e, Cartesian3.ZERO)), this.radius = defaultValue(t, 0); +} +const fromPointsXMin = new Cartesian3(), fromPointsYMin = new Cartesian3(), fromPointsZMin = new Cartesian3(), fromPointsXMax = new Cartesian3(), fromPointsYMax = new Cartesian3(), fromPointsZMax = new Cartesian3(), fromPointsCurrentPos = new Cartesian3(), fromPointsScratch = new Cartesian3(), fromPointsRitterCenter = new Cartesian3(), fromPointsMinBoxPt = new Cartesian3(), fromPointsMaxBoxPt = new Cartesian3(), fromPointsNaiveCenterScratch = new Cartesian3(), volumeConstant = 4 / 3 * CesiumMath.PI; +BoundingSphere.fromPoints = function(e, t) { + if (defined(t) || (t = new BoundingSphere()), !defined(e) || e.length === 0) + return t.center = Cartesian3.clone(Cartesian3.ZERO, t.center), t.radius = 0, t; + const n = Cartesian3.clone(e[0], fromPointsCurrentPos), i = Cartesian3.clone(n, fromPointsXMin), r = Cartesian3.clone(n, fromPointsYMin), o = Cartesian3.clone(n, fromPointsZMin), s = Cartesian3.clone(n, fromPointsXMax), c = Cartesian3.clone(n, fromPointsYMax), l = Cartesian3.clone(n, fromPointsZMax), d = e.length; + let f; + for (f = 1; f < d; f++) { + Cartesian3.clone(e[f], n); + const P = n.x, I = n.y, M = n.z; + P < i.x && Cartesian3.clone(n, i), P > s.x && Cartesian3.clone(n, s), I < r.y && Cartesian3.clone(n, r), I > c.y && Cartesian3.clone(n, c), M < o.z && Cartesian3.clone(n, o), M > l.z && Cartesian3.clone(n, l); + } + const h = Cartesian3.magnitudeSquared( + Cartesian3.subtract(s, i, fromPointsScratch) + ), p = Cartesian3.magnitudeSquared( + Cartesian3.subtract(c, r, fromPointsScratch) + ), m = Cartesian3.magnitudeSquared( + Cartesian3.subtract(l, o, fromPointsScratch) + ); + let _ = i, y = s, C = h; + p > C && (C = p, _ = r, y = c), m > C && (C = m, _ = o, y = l); + const T = fromPointsRitterCenter; + T.x = (_.x + y.x) * 0.5, T.y = (_.y + y.y) * 0.5, T.z = (_.z + y.z) * 0.5; + let x = Cartesian3.magnitudeSquared( + Cartesian3.subtract(y, T, fromPointsScratch) + ), b = Math.sqrt(x); + const S = fromPointsMinBoxPt; + S.x = i.x, S.y = r.y, S.z = o.z; + const E = fromPointsMaxBoxPt; + E.x = s.x, E.y = c.y, E.z = l.z; + const A = Cartesian3.midpoint( + S, + E, + fromPointsNaiveCenterScratch + ); + let D = 0; + for (f = 0; f < d; f++) { + Cartesian3.clone(e[f], n); + const P = Cartesian3.magnitude( + Cartesian3.subtract(n, A, fromPointsScratch) + ); + P > D && (D = P); + const I = Cartesian3.magnitudeSquared( + Cartesian3.subtract(n, T, fromPointsScratch) + ); + if (I > x) { + const M = Math.sqrt(I); + b = (b + M) * 0.5, x = b * b; + const R = M - b; + T.x = (b * T.x + R * n.x) / M, T.y = (b * T.y + R * n.y) / M, T.z = (b * T.z + R * n.z) / M; + } + } + return b < D ? (Cartesian3.clone(T, t.center), t.radius = b) : (Cartesian3.clone(A, t.center), t.radius = D), t; +}; +const defaultProjection = new GeographicProjection(), fromRectangle2DLowerLeft = new Cartesian3(), fromRectangle2DUpperRight = new Cartesian3(), fromRectangle2DSouthwest = new Cartographic(), fromRectangle2DNortheast = new Cartographic(); +BoundingSphere.fromRectangle2D = function(e, t, n) { + return BoundingSphere.fromRectangleWithHeights2D( + e, + t, + 0, + 0, + n + ); +}; +BoundingSphere.fromRectangleWithHeights2D = function(e, t, n, i, r) { + if (defined(r) || (r = new BoundingSphere()), !defined(e)) + return r.center = Cartesian3.clone(Cartesian3.ZERO, r.center), r.radius = 0, r; + defaultProjection._ellipsoid = Ellipsoid.default, t = defaultValue(t, defaultProjection), Rectangle.southwest(e, fromRectangle2DSouthwest), fromRectangle2DSouthwest.height = n, Rectangle.northeast(e, fromRectangle2DNortheast), fromRectangle2DNortheast.height = i; + const o = t.project( + fromRectangle2DSouthwest, + fromRectangle2DLowerLeft + ), s = t.project( + fromRectangle2DNortheast, + fromRectangle2DUpperRight + ), c = s.x - o.x, l = s.y - o.y, d = s.z - o.z; + r.radius = Math.sqrt(c * c + l * l + d * d) * 0.5; + const f = r.center; + return f.x = o.x + c * 0.5, f.y = o.y + l * 0.5, f.z = o.z + d * 0.5, r; +}; +const fromRectangle3DScratch = []; +BoundingSphere.fromRectangle3D = function(e, t, n, i) { + if (t = defaultValue(t, Ellipsoid.default), n = defaultValue(n, 0), defined(i) || (i = new BoundingSphere()), !defined(e)) + return i.center = Cartesian3.clone(Cartesian3.ZERO, i.center), i.radius = 0, i; + const r = Rectangle.subsample( + e, + t, + n, + fromRectangle3DScratch + ); + return BoundingSphere.fromPoints(r, i); +}; +BoundingSphere.fromVertices = function(e, t, n, i) { + if (defined(i) || (i = new BoundingSphere()), !defined(e) || e.length === 0) + return i.center = Cartesian3.clone(Cartesian3.ZERO, i.center), i.radius = 0, i; + t = defaultValue(t, Cartesian3.ZERO), n = defaultValue(n, 3); + const r = fromPointsCurrentPos; + r.x = e[0] + t.x, r.y = e[1] + t.y, r.z = e[2] + t.z; + const o = Cartesian3.clone(r, fromPointsXMin), s = Cartesian3.clone(r, fromPointsYMin), c = Cartesian3.clone(r, fromPointsZMin), l = Cartesian3.clone(r, fromPointsXMax), d = Cartesian3.clone(r, fromPointsYMax), f = Cartesian3.clone(r, fromPointsZMax), h = e.length; + let p; + for (p = 0; p < h; p += n) { + const M = e[p] + t.x, R = e[p + 1] + t.y, L = e[p + 2] + t.z; + r.x = M, r.y = R, r.z = L, M < o.x && Cartesian3.clone(r, o), M > l.x && Cartesian3.clone(r, l), R < s.y && Cartesian3.clone(r, s), R > d.y && Cartesian3.clone(r, d), L < c.z && Cartesian3.clone(r, c), L > f.z && Cartesian3.clone(r, f); + } + const m = Cartesian3.magnitudeSquared( + Cartesian3.subtract(l, o, fromPointsScratch) + ), _ = Cartesian3.magnitudeSquared( + Cartesian3.subtract(d, s, fromPointsScratch) + ), y = Cartesian3.magnitudeSquared( + Cartesian3.subtract(f, c, fromPointsScratch) + ); + let C = o, T = l, x = m; + _ > x && (x = _, C = s, T = d), y > x && (x = y, C = c, T = f); + const b = fromPointsRitterCenter; + b.x = (C.x + T.x) * 0.5, b.y = (C.y + T.y) * 0.5, b.z = (C.z + T.z) * 0.5; + let S = Cartesian3.magnitudeSquared( + Cartesian3.subtract(T, b, fromPointsScratch) + ), E = Math.sqrt(S); + const A = fromPointsMinBoxPt; + A.x = o.x, A.y = s.y, A.z = c.z; + const D = fromPointsMaxBoxPt; + D.x = l.x, D.y = d.y, D.z = f.z; + const P = Cartesian3.midpoint( + A, + D, + fromPointsNaiveCenterScratch + ); + let I = 0; + for (p = 0; p < h; p += n) { + r.x = e[p] + t.x, r.y = e[p + 1] + t.y, r.z = e[p + 2] + t.z; + const M = Cartesian3.magnitude( + Cartesian3.subtract(r, P, fromPointsScratch) + ); + M > I && (I = M); + const R = Cartesian3.magnitudeSquared( + Cartesian3.subtract(r, b, fromPointsScratch) + ); + if (R > S) { + const L = Math.sqrt(R); + E = (E + L) * 0.5, S = E * E; + const g = L - E; + b.x = (E * b.x + g * r.x) / L, b.y = (E * b.y + g * r.y) / L, b.z = (E * b.z + g * r.z) / L; + } + } + return E < I ? (Cartesian3.clone(b, i.center), i.radius = E) : (Cartesian3.clone(P, i.center), i.radius = I), i; +}; +BoundingSphere.fromEncodedCartesianVertices = function(e, t, n) { + if (defined(n) || (n = new BoundingSphere()), !defined(e) || !defined(t) || e.length !== t.length || e.length === 0) + return n.center = Cartesian3.clone(Cartesian3.ZERO, n.center), n.radius = 0, n; + const i = fromPointsCurrentPos; + i.x = e[0] + t[0], i.y = e[1] + t[1], i.z = e[2] + t[2]; + const r = Cartesian3.clone(i, fromPointsXMin), o = Cartesian3.clone(i, fromPointsYMin), s = Cartesian3.clone(i, fromPointsZMin), c = Cartesian3.clone(i, fromPointsXMax), l = Cartesian3.clone(i, fromPointsYMax), d = Cartesian3.clone(i, fromPointsZMax), f = e.length; + let h; + for (h = 0; h < f; h += 3) { + const I = e[h] + t[h], M = e[h + 1] + t[h + 1], R = e[h + 2] + t[h + 2]; + i.x = I, i.y = M, i.z = R, I < r.x && Cartesian3.clone(i, r), I > c.x && Cartesian3.clone(i, c), M < o.y && Cartesian3.clone(i, o), M > l.y && Cartesian3.clone(i, l), R < s.z && Cartesian3.clone(i, s), R > d.z && Cartesian3.clone(i, d); + } + const p = Cartesian3.magnitudeSquared( + Cartesian3.subtract(c, r, fromPointsScratch) + ), m = Cartesian3.magnitudeSquared( + Cartesian3.subtract(l, o, fromPointsScratch) + ), _ = Cartesian3.magnitudeSquared( + Cartesian3.subtract(d, s, fromPointsScratch) + ); + let y = r, C = c, T = p; + m > T && (T = m, y = o, C = l), _ > T && (T = _, y = s, C = d); + const x = fromPointsRitterCenter; + x.x = (y.x + C.x) * 0.5, x.y = (y.y + C.y) * 0.5, x.z = (y.z + C.z) * 0.5; + let b = Cartesian3.magnitudeSquared( + Cartesian3.subtract(C, x, fromPointsScratch) + ), S = Math.sqrt(b); + const E = fromPointsMinBoxPt; + E.x = r.x, E.y = o.y, E.z = s.z; + const A = fromPointsMaxBoxPt; + A.x = c.x, A.y = l.y, A.z = d.z; + const D = Cartesian3.midpoint( + E, + A, + fromPointsNaiveCenterScratch + ); + let P = 0; + for (h = 0; h < f; h += 3) { + i.x = e[h] + t[h], i.y = e[h + 1] + t[h + 1], i.z = e[h + 2] + t[h + 2]; + const I = Cartesian3.magnitude( + Cartesian3.subtract(i, D, fromPointsScratch) + ); + I > P && (P = I); + const M = Cartesian3.magnitudeSquared( + Cartesian3.subtract(i, x, fromPointsScratch) + ); + if (M > b) { + const R = Math.sqrt(M); + S = (S + R) * 0.5, b = S * S; + const L = R - S; + x.x = (S * x.x + L * i.x) / R, x.y = (S * x.y + L * i.y) / R, x.z = (S * x.z + L * i.z) / R; + } + } + return S < P ? (Cartesian3.clone(x, n.center), n.radius = S) : (Cartesian3.clone(D, n.center), n.radius = P), n; +}; +BoundingSphere.fromCornerPoints = function(e, t, n) { + defined(n) || (n = new BoundingSphere()); + const i = Cartesian3.midpoint(e, t, n.center); + return n.radius = Cartesian3.distance(i, t), n; +}; +BoundingSphere.fromEllipsoid = function(e, t) { + return defined(t) || (t = new BoundingSphere()), Cartesian3.clone(Cartesian3.ZERO, t.center), t.radius = e.maximumRadius, t; +}; +const fromBoundingSpheresScratch = new Cartesian3(); +BoundingSphere.fromBoundingSpheres = function(e, t) { + if (defined(t) || (t = new BoundingSphere()), !defined(e) || e.length === 0) + return t.center = Cartesian3.clone(Cartesian3.ZERO, t.center), t.radius = 0, t; + const n = e.length; + if (n === 1) + return BoundingSphere.clone(e[0], t); + if (n === 2) + return BoundingSphere.union(e[0], e[1], t); + const i = []; + let r; + for (r = 0; r < n; r++) + i.push(e[r].center); + t = BoundingSphere.fromPoints(i, t); + const o = t.center; + let s = t.radius; + for (r = 0; r < n; r++) { + const c = e[r]; + s = Math.max( + s, + Cartesian3.distance(o, c.center, fromBoundingSpheresScratch) + c.radius + ); + } + return t.radius = s, t; +}; +const fromOrientedBoundingBoxScratchU = new Cartesian3(), fromOrientedBoundingBoxScratchV = new Cartesian3(), fromOrientedBoundingBoxScratchW = new Cartesian3(); +BoundingSphere.fromOrientedBoundingBox = function(e, t) { + defined(t) || (t = new BoundingSphere()); + const n = e.halfAxes, i = Matrix3.getColumn(n, 0, fromOrientedBoundingBoxScratchU), r = Matrix3.getColumn(n, 1, fromOrientedBoundingBoxScratchV), o = Matrix3.getColumn(n, 2, fromOrientedBoundingBoxScratchW); + return Cartesian3.add(i, r, i), Cartesian3.add(i, o, i), t.center = Cartesian3.clone(e.center, t.center), t.radius = Cartesian3.magnitude(i), t; +}; +const scratchFromTransformationCenter = new Cartesian3(), scratchFromTransformationScale = new Cartesian3(); +BoundingSphere.fromTransformation = function(e, t) { + defined(t) || (t = new BoundingSphere()); + const n = Matrix4.getTranslation( + e, + scratchFromTransformationCenter + ), i = Matrix4.getScale( + e, + scratchFromTransformationScale + ), r = 0.5 * Cartesian3.magnitude(i); + return t.center = Cartesian3.clone(n, t.center), t.radius = r, t; +}; +BoundingSphere.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.center = Cartesian3.clone(e.center, t.center), t.radius = e.radius, t) : new BoundingSphere(e.center, e.radius); +}; +BoundingSphere.packedLength = 4; +BoundingSphere.pack = function(e, t, n) { + n = defaultValue(n, 0); + const i = e.center; + return t[n++] = i.x, t[n++] = i.y, t[n++] = i.z, t[n] = e.radius, t; +}; +BoundingSphere.unpack = function(e, t, n) { + t = defaultValue(t, 0), defined(n) || (n = new BoundingSphere()); + const i = n.center; + return i.x = e[t++], i.y = e[t++], i.z = e[t++], n.radius = e[t], n; +}; +const unionScratch = new Cartesian3(), unionScratchCenter = new Cartesian3(); +BoundingSphere.union = function(e, t, n) { + defined(n) || (n = new BoundingSphere()); + const i = e.center, r = e.radius, o = t.center, s = t.radius, c = Cartesian3.subtract( + o, + i, + unionScratch + ), l = Cartesian3.magnitude(c); + if (r >= l + s) + return e.clone(n), n; + if (s >= l + r) + return t.clone(n), n; + const d = (r + l + s) * 0.5, f = Cartesian3.multiplyByScalar( + c, + (-r + d) / l, + unionScratchCenter + ); + return Cartesian3.add(f, i, f), Cartesian3.clone(f, n.center), n.radius = d, n; +}; +const expandScratch = new Cartesian3(); +BoundingSphere.expand = function(e, t, n) { + n = BoundingSphere.clone(e, n); + const i = Cartesian3.magnitude( + Cartesian3.subtract(t, n.center, expandScratch) + ); + return i > n.radius && (n.radius = i), n; +}; +BoundingSphere.intersectPlane = function(e, t) { + const n = e.center, i = e.radius, r = t.normal, o = Cartesian3.dot(r, n) + t.distance; + return o < -i ? Intersect$1.OUTSIDE : o < i ? Intersect$1.INTERSECTING : Intersect$1.INSIDE; +}; +BoundingSphere.transform = function(e, t, n) { + return defined(n) || (n = new BoundingSphere()), n.center = Matrix4.multiplyByPoint( + t, + e.center, + n.center + ), n.radius = Matrix4.getMaximumScale(t) * e.radius, n; +}; +const distanceSquaredToScratch = new Cartesian3(); +BoundingSphere.distanceSquaredTo = function(e, t) { + const n = Cartesian3.subtract( + e.center, + t, + distanceSquaredToScratch + ), i = Cartesian3.magnitude(n) - e.radius; + return i <= 0 ? 0 : i * i; +}; +BoundingSphere.transformWithoutScale = function(e, t, n) { + return defined(n) || (n = new BoundingSphere()), n.center = Matrix4.multiplyByPoint( + t, + e.center, + n.center + ), n.radius = e.radius, n; +}; +const scratchCartesian3$e = new Cartesian3(); +BoundingSphere.computePlaneDistances = function(e, t, n, i) { + defined(i) || (i = new Interval()); + const r = Cartesian3.subtract( + e.center, + t, + scratchCartesian3$e + ), o = Cartesian3.dot(n, r); + return i.start = o - e.radius, i.stop = o + e.radius, i; +}; +const projectTo2DNormalScratch = new Cartesian3(), projectTo2DEastScratch = new Cartesian3(), projectTo2DNorthScratch = new Cartesian3(), projectTo2DWestScratch = new Cartesian3(), projectTo2DSouthScratch = new Cartesian3(), projectTo2DCartographicScratch = new Cartographic(), projectTo2DPositionsScratch = new Array(8); +for (let e = 0; e < 8; ++e) + projectTo2DPositionsScratch[e] = new Cartesian3(); +const projectTo2DProjection = new GeographicProjection(); +BoundingSphere.projectTo2D = function(e, t, n) { + projectTo2DProjection._ellipsoid = Ellipsoid.default, t = defaultValue(t, projectTo2DProjection); + const i = t.ellipsoid; + let r = e.center; + const o = e.radius; + let s; + Cartesian3.equals(r, Cartesian3.ZERO) ? s = Cartesian3.clone(Cartesian3.UNIT_X, projectTo2DNormalScratch) : s = i.geodeticSurfaceNormal(r, projectTo2DNormalScratch); + const c = Cartesian3.cross( + Cartesian3.UNIT_Z, + s, + projectTo2DEastScratch + ); + Cartesian3.normalize(c, c); + const l = Cartesian3.cross(s, c, projectTo2DNorthScratch); + Cartesian3.normalize(l, l), Cartesian3.multiplyByScalar(s, o, s), Cartesian3.multiplyByScalar(l, o, l), Cartesian3.multiplyByScalar(c, o, c); + const d = Cartesian3.negate(l, projectTo2DSouthScratch), f = Cartesian3.negate(c, projectTo2DWestScratch), h = projectTo2DPositionsScratch; + let p = h[0]; + Cartesian3.add(s, l, p), Cartesian3.add(p, c, p), p = h[1], Cartesian3.add(s, l, p), Cartesian3.add(p, f, p), p = h[2], Cartesian3.add(s, d, p), Cartesian3.add(p, f, p), p = h[3], Cartesian3.add(s, d, p), Cartesian3.add(p, c, p), Cartesian3.negate(s, s), p = h[4], Cartesian3.add(s, l, p), Cartesian3.add(p, c, p), p = h[5], Cartesian3.add(s, l, p), Cartesian3.add(p, f, p), p = h[6], Cartesian3.add(s, d, p), Cartesian3.add(p, f, p), p = h[7], Cartesian3.add(s, d, p), Cartesian3.add(p, c, p); + const m = h.length; + for (let T = 0; T < m; ++T) { + const x = h[T]; + Cartesian3.add(r, x, x); + const b = i.cartesianToCartographic( + x, + projectTo2DCartographicScratch + ); + t.project(b, x); + } + n = BoundingSphere.fromPoints(h, n), r = n.center; + const _ = r.x, y = r.y, C = r.z; + return r.x = C, r.y = _, r.z = y, n; +}; +BoundingSphere.isOccluded = function(e, t) { + return !t.isBoundingSphereVisible(e); +}; +BoundingSphere.equals = function(e, t) { + return e === t || defined(e) && defined(t) && Cartesian3.equals(e.center, t.center) && e.radius === t.radius; +}; +BoundingSphere.prototype.intersectPlane = function(e) { + return BoundingSphere.intersectPlane(this, e); +}; +BoundingSphere.prototype.distanceSquaredTo = function(e) { + return BoundingSphere.distanceSquaredTo(this, e); +}; +BoundingSphere.prototype.computePlaneDistances = function(e, t, n) { + return BoundingSphere.computePlaneDistances( + this, + e, + t, + n + ); +}; +BoundingSphere.prototype.isOccluded = function(e) { + return BoundingSphere.isOccluded(this, e); +}; +BoundingSphere.prototype.equals = function(e) { + return BoundingSphere.equals(this, e); +}; +BoundingSphere.prototype.clone = function(e) { + return BoundingSphere.clone(this, e); +}; +BoundingSphere.prototype.volume = function() { + const e = this.radius; + return volumeConstant * e * e * e; +}; +function GeometryAttributes(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.position = e.position, this.normal = e.normal, this.st = e.st, this.bitangent = e.bitangent, this.tangent = e.tangent, this.color = e.color; +} +const GeometryOffsetAttribute = { + NONE: 0, + TOP: 1, + ALL: 2 +}, GeometryOffsetAttribute$1 = Object.freeze(GeometryOffsetAttribute); +function VertexFormat(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.position = defaultValue(e.position, !1), this.normal = defaultValue(e.normal, !1), this.st = defaultValue(e.st, !1), this.bitangent = defaultValue(e.bitangent, !1), this.tangent = defaultValue(e.tangent, !1), this.color = defaultValue(e.color, !1); +} +VertexFormat.POSITION_ONLY = Object.freeze( + new VertexFormat({ + position: !0 + }) +); +VertexFormat.POSITION_AND_NORMAL = Object.freeze( + new VertexFormat({ + position: !0, + normal: !0 + }) +); +VertexFormat.POSITION_NORMAL_AND_ST = Object.freeze( + new VertexFormat({ + position: !0, + normal: !0, + st: !0 + }) +); +VertexFormat.POSITION_AND_ST = Object.freeze( + new VertexFormat({ + position: !0, + st: !0 + }) +); +VertexFormat.POSITION_AND_COLOR = Object.freeze( + new VertexFormat({ + position: !0, + color: !0 + }) +); +VertexFormat.ALL = Object.freeze( + new VertexFormat({ + position: !0, + normal: !0, + st: !0, + tangent: !0, + bitangent: !0 + }) +); +VertexFormat.DEFAULT = VertexFormat.POSITION_NORMAL_AND_ST; +VertexFormat.packedLength = 6; +VertexFormat.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.position ? 1 : 0, t[n++] = e.normal ? 1 : 0, t[n++] = e.st ? 1 : 0, t[n++] = e.tangent ? 1 : 0, t[n++] = e.bitangent ? 1 : 0, t[n] = e.color ? 1 : 0, t; +}; +VertexFormat.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new VertexFormat()), n.position = e[t++] === 1, n.normal = e[t++] === 1, n.st = e[t++] === 1, n.tangent = e[t++] === 1, n.bitangent = e[t++] === 1, n.color = e[t] === 1, n; +}; +VertexFormat.clone = function(e, t) { + if (defined(e)) + return defined(t) || (t = new VertexFormat()), t.position = e.position, t.normal = e.normal, t.st = e.st, t.tangent = e.tangent, t.bitangent = e.bitangent, t.color = e.color, t; +}; +const diffScratch$1 = new Cartesian3(); +function BoxGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.minimum, n = e.maximum, i = defaultValue(e.vertexFormat, VertexFormat.DEFAULT); + this._minimum = Cartesian3.clone(t), this._maximum = Cartesian3.clone(n), this._vertexFormat = i, this._offsetAttribute = e.offsetAttribute, this._workerName = "createBoxGeometry"; +} +BoxGeometry.fromDimensions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.dimensions, n = Cartesian3.multiplyByScalar(t, 0.5, new Cartesian3()); + return new BoxGeometry({ + minimum: Cartesian3.negate(n, new Cartesian3()), + maximum: n, + vertexFormat: e.vertexFormat, + offsetAttribute: e.offsetAttribute + }); +}; +BoxGeometry.fromAxisAlignedBoundingBox = function(e) { + return new BoxGeometry({ + minimum: e.minimum, + maximum: e.maximum + }); +}; +BoxGeometry.packedLength = 2 * Cartesian3.packedLength + VertexFormat.packedLength + 1; +BoxGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._minimum, t, n), Cartesian3.pack( + e._maximum, + t, + n + Cartesian3.packedLength + ), VertexFormat.pack( + e._vertexFormat, + t, + n + 2 * Cartesian3.packedLength + ), t[n + 2 * Cartesian3.packedLength + VertexFormat.packedLength] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchMin$4 = new Cartesian3(), scratchMax$4 = new Cartesian3(), scratchVertexFormat$c = new VertexFormat(), scratchOptions$n = { + minimum: scratchMin$4, + maximum: scratchMax$4, + vertexFormat: scratchVertexFormat$c, + offsetAttribute: void 0 +}; +BoxGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchMin$4), r = Cartesian3.unpack( + e, + t + Cartesian3.packedLength, + scratchMax$4 + ), o = VertexFormat.unpack( + e, + t + 2 * Cartesian3.packedLength, + scratchVertexFormat$c + ), s = e[t + 2 * Cartesian3.packedLength + VertexFormat.packedLength]; + return defined(n) ? (n._minimum = Cartesian3.clone(i, n._minimum), n._maximum = Cartesian3.clone(r, n._maximum), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._offsetAttribute = s === -1 ? void 0 : s, n) : (scratchOptions$n.offsetAttribute = s === -1 ? void 0 : s, new BoxGeometry(scratchOptions$n)); +}; +BoxGeometry.createGeometry = function(e) { + const t = e._minimum, n = e._maximum, i = e._vertexFormat; + if (Cartesian3.equals(t, n)) + return; + const r = new GeometryAttributes(); + let o, s; + if (i.position && (i.st || i.normal || i.tangent || i.bitangent)) { + if (i.position && (s = new Float64Array(6 * 4 * 3), s[0] = t.x, s[1] = t.y, s[2] = n.z, s[3] = n.x, s[4] = t.y, s[5] = n.z, s[6] = n.x, s[7] = n.y, s[8] = n.z, s[9] = t.x, s[10] = n.y, s[11] = n.z, s[12] = t.x, s[13] = t.y, s[14] = t.z, s[15] = n.x, s[16] = t.y, s[17] = t.z, s[18] = n.x, s[19] = n.y, s[20] = t.z, s[21] = t.x, s[22] = n.y, s[23] = t.z, s[24] = n.x, s[25] = t.y, s[26] = t.z, s[27] = n.x, s[28] = n.y, s[29] = t.z, s[30] = n.x, s[31] = n.y, s[32] = n.z, s[33] = n.x, s[34] = t.y, s[35] = n.z, s[36] = t.x, s[37] = t.y, s[38] = t.z, s[39] = t.x, s[40] = n.y, s[41] = t.z, s[42] = t.x, s[43] = n.y, s[44] = n.z, s[45] = t.x, s[46] = t.y, s[47] = n.z, s[48] = t.x, s[49] = n.y, s[50] = t.z, s[51] = n.x, s[52] = n.y, s[53] = t.z, s[54] = n.x, s[55] = n.y, s[56] = n.z, s[57] = t.x, s[58] = n.y, s[59] = n.z, s[60] = t.x, s[61] = t.y, s[62] = t.z, s[63] = n.x, s[64] = t.y, s[65] = t.z, s[66] = n.x, s[67] = t.y, s[68] = n.z, s[69] = t.x, s[70] = t.y, s[71] = n.z, r.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: s + })), i.normal) { + const d = new Float32Array(72); + d[0] = 0, d[1] = 0, d[2] = 1, d[3] = 0, d[4] = 0, d[5] = 1, d[6] = 0, d[7] = 0, d[8] = 1, d[9] = 0, d[10] = 0, d[11] = 1, d[12] = 0, d[13] = 0, d[14] = -1, d[15] = 0, d[16] = 0, d[17] = -1, d[18] = 0, d[19] = 0, d[20] = -1, d[21] = 0, d[22] = 0, d[23] = -1, d[24] = 1, d[25] = 0, d[26] = 0, d[27] = 1, d[28] = 0, d[29] = 0, d[30] = 1, d[31] = 0, d[32] = 0, d[33] = 1, d[34] = 0, d[35] = 0, d[36] = -1, d[37] = 0, d[38] = 0, d[39] = -1, d[40] = 0, d[41] = 0, d[42] = -1, d[43] = 0, d[44] = 0, d[45] = -1, d[46] = 0, d[47] = 0, d[48] = 0, d[49] = 1, d[50] = 0, d[51] = 0, d[52] = 1, d[53] = 0, d[54] = 0, d[55] = 1, d[56] = 0, d[57] = 0, d[58] = 1, d[59] = 0, d[60] = 0, d[61] = -1, d[62] = 0, d[63] = 0, d[64] = -1, d[65] = 0, d[66] = 0, d[67] = -1, d[68] = 0, d[69] = 0, d[70] = -1, d[71] = 0, r.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: d + }); + } + if (i.st) { + const d = new Float32Array(48); + d[0] = 0, d[1] = 0, d[2] = 1, d[3] = 0, d[4] = 1, d[5] = 1, d[6] = 0, d[7] = 1, d[8] = 1, d[9] = 0, d[10] = 0, d[11] = 0, d[12] = 0, d[13] = 1, d[14] = 1, d[15] = 1, d[16] = 0, d[17] = 0, d[18] = 1, d[19] = 0, d[20] = 1, d[21] = 1, d[22] = 0, d[23] = 1, d[24] = 1, d[25] = 0, d[26] = 0, d[27] = 0, d[28] = 0, d[29] = 1, d[30] = 1, d[31] = 1, d[32] = 1, d[33] = 0, d[34] = 0, d[35] = 0, d[36] = 0, d[37] = 1, d[38] = 1, d[39] = 1, d[40] = 0, d[41] = 0, d[42] = 1, d[43] = 0, d[44] = 1, d[45] = 1, d[46] = 0, d[47] = 1, r.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: d + }); + } + if (i.tangent) { + const d = new Float32Array(72); + d[0] = 1, d[1] = 0, d[2] = 0, d[3] = 1, d[4] = 0, d[5] = 0, d[6] = 1, d[7] = 0, d[8] = 0, d[9] = 1, d[10] = 0, d[11] = 0, d[12] = -1, d[13] = 0, d[14] = 0, d[15] = -1, d[16] = 0, d[17] = 0, d[18] = -1, d[19] = 0, d[20] = 0, d[21] = -1, d[22] = 0, d[23] = 0, d[24] = 0, d[25] = 1, d[26] = 0, d[27] = 0, d[28] = 1, d[29] = 0, d[30] = 0, d[31] = 1, d[32] = 0, d[33] = 0, d[34] = 1, d[35] = 0, d[36] = 0, d[37] = -1, d[38] = 0, d[39] = 0, d[40] = -1, d[41] = 0, d[42] = 0, d[43] = -1, d[44] = 0, d[45] = 0, d[46] = -1, d[47] = 0, d[48] = -1, d[49] = 0, d[50] = 0, d[51] = -1, d[52] = 0, d[53] = 0, d[54] = -1, d[55] = 0, d[56] = 0, d[57] = -1, d[58] = 0, d[59] = 0, d[60] = 1, d[61] = 0, d[62] = 0, d[63] = 1, d[64] = 0, d[65] = 0, d[66] = 1, d[67] = 0, d[68] = 0, d[69] = 1, d[70] = 0, d[71] = 0, r.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: d + }); + } + if (i.bitangent) { + const d = new Float32Array(72); + d[0] = 0, d[1] = 1, d[2] = 0, d[3] = 0, d[4] = 1, d[5] = 0, d[6] = 0, d[7] = 1, d[8] = 0, d[9] = 0, d[10] = 1, d[11] = 0, d[12] = 0, d[13] = 1, d[14] = 0, d[15] = 0, d[16] = 1, d[17] = 0, d[18] = 0, d[19] = 1, d[20] = 0, d[21] = 0, d[22] = 1, d[23] = 0, d[24] = 0, d[25] = 0, d[26] = 1, d[27] = 0, d[28] = 0, d[29] = 1, d[30] = 0, d[31] = 0, d[32] = 1, d[33] = 0, d[34] = 0, d[35] = 1, d[36] = 0, d[37] = 0, d[38] = 1, d[39] = 0, d[40] = 0, d[41] = 1, d[42] = 0, d[43] = 0, d[44] = 1, d[45] = 0, d[46] = 0, d[47] = 1, d[48] = 0, d[49] = 0, d[50] = 1, d[51] = 0, d[52] = 0, d[53] = 1, d[54] = 0, d[55] = 0, d[56] = 1, d[57] = 0, d[58] = 0, d[59] = 1, d[60] = 0, d[61] = 0, d[62] = 1, d[63] = 0, d[64] = 0, d[65] = 1, d[66] = 0, d[67] = 0, d[68] = 1, d[69] = 0, d[70] = 0, d[71] = 1, r.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: d + }); + } + o = new Uint16Array(6 * 2 * 3), o[0] = 0, o[1] = 1, o[2] = 2, o[3] = 0, o[4] = 2, o[5] = 3, o[6] = 6, o[7] = 5, o[8] = 4, o[9] = 7, o[10] = 6, o[11] = 4, o[12] = 8, o[13] = 9, o[14] = 10, o[15] = 8, o[16] = 10, o[17] = 11, o[18] = 14, o[19] = 13, o[20] = 12, o[21] = 15, o[22] = 14, o[23] = 12, o[24] = 18, o[25] = 17, o[26] = 16, o[27] = 19, o[28] = 18, o[29] = 16, o[30] = 20, o[31] = 21, o[32] = 22, o[33] = 20, o[34] = 22, o[35] = 23; + } else + s = new Float64Array(8 * 3), s[0] = t.x, s[1] = t.y, s[2] = t.z, s[3] = n.x, s[4] = t.y, s[5] = t.z, s[6] = n.x, s[7] = n.y, s[8] = t.z, s[9] = t.x, s[10] = n.y, s[11] = t.z, s[12] = t.x, s[13] = t.y, s[14] = n.z, s[15] = n.x, s[16] = t.y, s[17] = n.z, s[18] = n.x, s[19] = n.y, s[20] = n.z, s[21] = t.x, s[22] = n.y, s[23] = n.z, r.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: s + }), o = new Uint16Array(6 * 2 * 3), o[0] = 4, o[1] = 5, o[2] = 6, o[3] = 4, o[4] = 6, o[5] = 7, o[6] = 1, o[7] = 0, o[8] = 3, o[9] = 1, o[10] = 3, o[11] = 2, o[12] = 1, o[13] = 6, o[14] = 5, o[15] = 1, o[16] = 2, o[17] = 6, o[18] = 2, o[19] = 3, o[20] = 7, o[21] = 2, o[22] = 7, o[23] = 6, o[24] = 3, o[25] = 0, o[26] = 4, o[27] = 3, o[28] = 4, o[29] = 7, o[30] = 0, o[31] = 1, o[32] = 5, o[33] = 0, o[34] = 5, o[35] = 4; + const c = Cartesian3.subtract(n, t, diffScratch$1), l = Cartesian3.magnitude(c) * 0.5; + if (defined(e._offsetAttribute)) { + const d = s.length, f = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, h = new Uint8Array(d / 3).fill(f); + r.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: h + }); + } + return new Geometry({ + attributes: r, + indices: o, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: new BoundingSphere(Cartesian3.ZERO, l), + offsetAttribute: e._offsetAttribute + }); +}; +let unitBoxGeometry; +BoxGeometry.getUnitBox = function() { + return defined(unitBoxGeometry) || (unitBoxGeometry = BoxGeometry.createGeometry( + BoxGeometry.fromDimensions({ + dimensions: new Cartesian3(1, 1, 1), + vertexFormat: VertexFormat.POSITION_ONLY + }) + )), unitBoxGeometry; +}; +const diffScratch = new Cartesian3(); +function BoxOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.minimum, n = e.maximum; + this._min = Cartesian3.clone(t), this._max = Cartesian3.clone(n), this._offsetAttribute = e.offsetAttribute, this._workerName = "createBoxOutlineGeometry"; +} +BoxOutlineGeometry.fromDimensions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.dimensions, n = Cartesian3.multiplyByScalar(t, 0.5, new Cartesian3()); + return new BoxOutlineGeometry({ + minimum: Cartesian3.negate(n, new Cartesian3()), + maximum: n, + offsetAttribute: e.offsetAttribute + }); +}; +BoxOutlineGeometry.fromAxisAlignedBoundingBox = function(e) { + return new BoxOutlineGeometry({ + minimum: e.minimum, + maximum: e.maximum + }); +}; +BoxOutlineGeometry.packedLength = 2 * Cartesian3.packedLength + 1; +BoxOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._min, t, n), Cartesian3.pack(e._max, t, n + Cartesian3.packedLength), t[n + Cartesian3.packedLength * 2] = defaultValue( + e._offsetAttribute, + -1 + ), t; +}; +const scratchMin$3 = new Cartesian3(), scratchMax$3 = new Cartesian3(), scratchOptions$m = { + minimum: scratchMin$3, + maximum: scratchMax$3, + offsetAttribute: void 0 +}; +BoxOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchMin$3), r = Cartesian3.unpack( + e, + t + Cartesian3.packedLength, + scratchMax$3 + ), o = e[t + Cartesian3.packedLength * 2]; + return defined(n) ? (n._min = Cartesian3.clone(i, n._min), n._max = Cartesian3.clone(r, n._max), n._offsetAttribute = o === -1 ? void 0 : o, n) : (scratchOptions$m.offsetAttribute = o === -1 ? void 0 : o, new BoxOutlineGeometry(scratchOptions$m)); +}; +BoxOutlineGeometry.createGeometry = function(e) { + const t = e._min, n = e._max; + if (Cartesian3.equals(t, n)) + return; + const i = new GeometryAttributes(), r = new Uint16Array(12 * 2), o = new Float64Array(8 * 3); + o[0] = t.x, o[1] = t.y, o[2] = t.z, o[3] = n.x, o[4] = t.y, o[5] = t.z, o[6] = n.x, o[7] = n.y, o[8] = t.z, o[9] = t.x, o[10] = n.y, o[11] = t.z, o[12] = t.x, o[13] = t.y, o[14] = n.z, o[15] = n.x, o[16] = t.y, o[17] = n.z, o[18] = n.x, o[19] = n.y, o[20] = n.z, o[21] = t.x, o[22] = n.y, o[23] = n.z, i.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: o + }), r[0] = 4, r[1] = 5, r[2] = 5, r[3] = 6, r[4] = 6, r[5] = 7, r[6] = 7, r[7] = 4, r[8] = 0, r[9] = 1, r[10] = 1, r[11] = 2, r[12] = 2, r[13] = 3, r[14] = 3, r[15] = 0, r[16] = 0, r[17] = 4, r[18] = 1, r[19] = 5, r[20] = 2, r[21] = 6, r[22] = 3, r[23] = 7; + const s = Cartesian3.subtract(n, t, diffScratch), c = Cartesian3.magnitude(s) * 0.5; + if (defined(e._offsetAttribute)) { + const l = o.length, d = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, f = new Uint8Array(l / 3).fill(d); + i.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: f + }); + } + return new Geometry({ + attributes: i, + indices: r, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: new BoundingSphere(Cartesian3.ZERO, c), + offsetAttribute: e._offsetAttribute + }); +}; +function ColorGeometryInstanceAttribute(e, t, n, i) { + e = defaultValue(e, 1), t = defaultValue(t, 1), n = defaultValue(n, 1), i = defaultValue(i, 1), this.value = new Uint8Array([ + Color.floatToByte(e), + Color.floatToByte(t), + Color.floatToByte(n), + Color.floatToByte(i) + ]); +} +Object.defineProperties(ColorGeometryInstanceAttribute.prototype, { + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + * + * @memberof ColorGeometryInstanceAttribute.prototype + * + * @type {ComponentDatatype} + * @readonly + * + * @default {@link ComponentDatatype.UNSIGNED_BYTE} + */ + componentDatatype: { + get: function() { + return ComponentDatatype$1.UNSIGNED_BYTE; + } + }, + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + * + * @memberof ColorGeometryInstanceAttribute.prototype + * + * @type {number} + * @readonly + * + * @default 4 + */ + componentsPerAttribute: { + get: function() { + return 4; + } + }, + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * + * @memberof ColorGeometryInstanceAttribute.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + normalize: { + get: function() { + return !0; + } + } +}); +ColorGeometryInstanceAttribute.fromColor = function(e) { + return new ColorGeometryInstanceAttribute( + e.red, + e.green, + e.blue, + e.alpha + ); +}; +ColorGeometryInstanceAttribute.toValue = function(e, t) { + return defined(t) ? e.toBytes(t) : new Uint8Array(e.toBytes()); +}; +ColorGeometryInstanceAttribute.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.value[0] === t.value[0] && e.value[1] === t.value[1] && e.value[2] === t.value[2] && e.value[3] === t.value[3]; +}; +function DistanceDisplayConditionGeometryInstanceAttribute(e, t) { + e = defaultValue(e, 0), t = defaultValue(t, Number.MAX_VALUE), this.value = new Float32Array([e, t]); +} +Object.defineProperties( + DistanceDisplayConditionGeometryInstanceAttribute.prototype, + { + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + * + * @memberof DistanceDisplayConditionGeometryInstanceAttribute.prototype + * + * @type {ComponentDatatype} + * @readonly + * + * @default {@link ComponentDatatype.FLOAT} + */ + componentDatatype: { + get: function() { + return ComponentDatatype$1.FLOAT; + } + }, + /** + * The number of components in the attributes, i.e., {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + * + * @memberof DistanceDisplayConditionGeometryInstanceAttribute.prototype + * + * @type {number} + * @readonly + * + * @default 3 + */ + componentsPerAttribute: { + get: function() { + return 2; + } + }, + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * + * @memberof DistanceDisplayConditionGeometryInstanceAttribute.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + normalize: { + get: function() { + return !1; + } + } + } +); +DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition = function(e) { + return new DistanceDisplayConditionGeometryInstanceAttribute( + e.near, + e.far + ); +}; +DistanceDisplayConditionGeometryInstanceAttribute.toValue = function(e, t) { + return defined(t) ? (t[0] = e.near, t[1] = e.far, t) : new Float32Array([ + e.near, + e.far + ]); +}; +function GeometryInstance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.geometry = e.geometry, this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this.id = e.id, this.pickPrimitive = e.pickPrimitive, this.attributes = defaultValue(e.attributes, {}), this.westHemisphereGeometry = void 0, this.eastHemisphereGeometry = void 0; +} +function TimeInterval(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.start = defined(e.start) ? JulianDate.clone(e.start) : new JulianDate(), this.stop = defined(e.stop) ? JulianDate.clone(e.stop) : new JulianDate(), this.data = e.data, this.isStartIncluded = defaultValue(e.isStartIncluded, !0), this.isStopIncluded = defaultValue(e.isStopIncluded, !0); +} +Object.defineProperties(TimeInterval.prototype, { + /** + * Gets whether or not this interval is empty. + * @memberof TimeInterval.prototype + * @type {boolean} + * @readonly + */ + isEmpty: { + get: function() { + const e = JulianDate.compare(this.stop, this.start); + return e < 0 || e === 0 && (!this.isStartIncluded || !this.isStopIncluded); + } + } +}); +const scratchInterval = { + start: void 0, + stop: void 0, + isStartIncluded: void 0, + isStopIncluded: void 0, + data: void 0 +}; +TimeInterval.fromIso8601 = function(e, t) { + const n = e.iso8601.split("/"); + if (n.length !== 2) + throw new DeveloperError( + "options.iso8601 is an invalid ISO 8601 interval." + ); + const i = JulianDate.fromIso8601(n[0]), r = JulianDate.fromIso8601(n[1]), o = defaultValue(e.isStartIncluded, !0), s = defaultValue(e.isStopIncluded, !0), c = e.data; + return defined(t) ? (t.start = i, t.stop = r, t.isStartIncluded = o, t.isStopIncluded = s, t.data = c, t) : (scratchInterval.start = i, scratchInterval.stop = r, scratchInterval.isStartIncluded = o, scratchInterval.isStopIncluded = s, scratchInterval.data = c, new TimeInterval(scratchInterval)); +}; +TimeInterval.toIso8601 = function(e, t) { + return `${JulianDate.toIso8601( + e.start, + t + )}/${JulianDate.toIso8601(e.stop, t)}`; +}; +TimeInterval.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.start = e.start, t.stop = e.stop, t.isStartIncluded = e.isStartIncluded, t.isStopIncluded = e.isStopIncluded, t.data = e.data, t) : new TimeInterval(e); +}; +TimeInterval.equals = function(e, t, n) { + return e === t || defined(e) && defined(t) && (e.isEmpty && t.isEmpty || e.isStartIncluded === t.isStartIncluded && e.isStopIncluded === t.isStopIncluded && JulianDate.equals(e.start, t.start) && JulianDate.equals(e.stop, t.stop) && (e.data === t.data || defined(n) && n(e.data, t.data))); +}; +TimeInterval.equalsEpsilon = function(e, t, n, i) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && (e.isEmpty && t.isEmpty || e.isStartIncluded === t.isStartIncluded && e.isStopIncluded === t.isStopIncluded && JulianDate.equalsEpsilon(e.start, t.start, n) && JulianDate.equalsEpsilon(e.stop, t.stop, n) && (e.data === t.data || defined(i) && i(e.data, t.data))); +}; +TimeInterval.intersect = function(e, t, n, i) { + if (!defined(t)) + return TimeInterval.clone(TimeInterval.EMPTY, n); + const r = e.start, o = e.stop, s = t.start, c = t.stop, l = JulianDate.greaterThanOrEquals(s, r) && JulianDate.greaterThanOrEquals(o, s), d = !l && JulianDate.lessThanOrEquals(s, r) && JulianDate.lessThanOrEquals(r, c); + if (!l && !d) + return TimeInterval.clone(TimeInterval.EMPTY, n); + const f = e.isStartIncluded, h = e.isStopIncluded, p = t.isStartIncluded, m = t.isStopIncluded, _ = JulianDate.lessThan(o, c); + return defined(n) || (n = new TimeInterval()), n.start = l ? s : r, n.isStartIncluded = f && p || !JulianDate.equals(s, r) && (l && p || d && f), n.stop = _ ? o : c, n.isStopIncluded = _ ? h : h && m || !JulianDate.equals(c, o) && m, n.data = defined(i) ? i(e.data, t.data) : e.data, n; +}; +TimeInterval.contains = function(e, t) { + if (e.isEmpty) + return !1; + const n = JulianDate.compare( + e.start, + t + ); + if (n === 0) + return e.isStartIncluded; + const i = JulianDate.compare(t, e.stop); + return i === 0 ? e.isStopIncluded : n < 0 && i < 0; +}; +TimeInterval.prototype.clone = function(e) { + return TimeInterval.clone(this, e); +}; +TimeInterval.prototype.equals = function(e, t) { + return TimeInterval.equals(this, e, t); +}; +TimeInterval.prototype.equalsEpsilon = function(e, t, n) { + return TimeInterval.equalsEpsilon(this, e, t, n); +}; +TimeInterval.prototype.toString = function() { + return TimeInterval.toIso8601(this); +}; +TimeInterval.EMPTY = Object.freeze( + new TimeInterval({ + start: new JulianDate(), + stop: new JulianDate(), + isStartIncluded: !1, + isStopIncluded: !1 + }) +); +const MINIMUM_VALUE = Object.freeze( + JulianDate.fromIso8601("0000-01-01T00:00:00Z") +), MAXIMUM_VALUE = Object.freeze( + JulianDate.fromIso8601("9999-12-31T24:00:00Z") +), MAXIMUM_INTERVAL = Object.freeze( + new TimeInterval({ + start: MINIMUM_VALUE, + stop: MAXIMUM_VALUE + }) +), Iso8601 = { + /** + * A {@link JulianDate} representing the earliest time representable by an ISO8601 date. + * This is equivalent to the date string '0000-01-01T00:00:00Z' + * + * @type {JulianDate} + * @constant + */ + MINIMUM_VALUE, + /** + * A {@link JulianDate} representing the latest time representable by an ISO8601 date. + * This is equivalent to the date string '9999-12-31T24:00:00Z' + * + * @type {JulianDate} + * @constant + */ + MAXIMUM_VALUE, + /** + * A {@link TimeInterval} representing the largest interval representable by an ISO8601 interval. + * This is equivalent to the interval string '0000-01-01T00:00:00Z/9999-12-31T24:00:00Z' + * + * @type {TimeInterval} + * @constant + */ + MAXIMUM_INTERVAL +}; +function OffsetGeometryInstanceAttribute(e, t, n) { + e = defaultValue(e, 0), t = defaultValue(t, 0), n = defaultValue(n, 0), this.value = new Float32Array([e, t, n]); +} +Object.defineProperties(OffsetGeometryInstanceAttribute.prototype, { + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link OffsetGeometryInstanceAttribute#value}. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {ComponentDatatype} + * @readonly + * + * @default {@link ComponentDatatype.FLOAT} + */ + componentDatatype: { + get: function() { + return ComponentDatatype$1.FLOAT; + } + }, + /** + * The number of components in the attributes, i.e., {@link OffsetGeometryInstanceAttribute#value}. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {number} + * @readonly + * + * @default 3 + */ + componentsPerAttribute: { + get: function() { + return 3; + } + }, + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + normalize: { + get: function() { + return !1; + } + } +}); +OffsetGeometryInstanceAttribute.fromCartesian3 = function(e) { + return new OffsetGeometryInstanceAttribute(e.x, e.y, e.z); +}; +OffsetGeometryInstanceAttribute.toValue = function(e, t) { + return defined(t) || (t = new Float32Array([e.x, e.y, e.z])), t[0] = e.x, t[1] = e.y, t[2] = e.z, t; +}; +function ShowGeometryInstanceAttribute(e) { + e = defaultValue(e, !0), this.value = ShowGeometryInstanceAttribute.toValue(e); +} +Object.defineProperties(ShowGeometryInstanceAttribute.prototype, { + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + * + * @memberof ShowGeometryInstanceAttribute.prototype + * + * @type {ComponentDatatype} + * @readonly + * + * @default {@link ComponentDatatype.UNSIGNED_BYTE} + */ + componentDatatype: { + get: function() { + return ComponentDatatype$1.UNSIGNED_BYTE; + } + }, + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + * + * @memberof ShowGeometryInstanceAttribute.prototype + * + * @type {number} + * @readonly + * + * @default 1 + */ + componentsPerAttribute: { + get: function() { + return 1; + } + }, + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * + * @memberof ShowGeometryInstanceAttribute.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + normalize: { + get: function() { + return !1; + } + } +}); +ShowGeometryInstanceAttribute.toValue = function(e, t) { + return defined(t) ? (t[0] = e, t) : new Uint8Array([e]); +}; +const AllMaterialAppearanceFS = `in vec3 v_positionEC; +in vec3 v_normalEC; +in vec3 v_tangentEC; +in vec3 v_bitangentEC; +in vec2 v_st; + +void main() +{ + vec3 positionToEyeEC = -v_positionEC; + mat3 tangentToEyeMatrix = czm_tangentToEyeSpaceMatrix(v_normalEC, v_tangentEC, v_bitangentEC); + + vec3 normalEC = normalize(v_normalEC); +#ifdef FACE_FORWARD + normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); +#endif + + czm_materialInput materialInput; + materialInput.normalEC = normalEC; + materialInput.tangentToEyeMatrix = tangentToEyeMatrix; + materialInput.positionToEyeEC = positionToEyeEC; + materialInput.st = v_st; + czm_material material = czm_getMaterial(materialInput); + +#ifdef FLAT + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#else + out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +#endif +} +`, AllMaterialAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 normal; +in vec3 tangent; +in vec3 bitangent; +in vec2 st; +in float batchId; + +out vec3 v_positionEC; +out vec3 v_normalEC; +out vec3 v_tangentEC; +out vec3 v_bitangentEC; +out vec2 v_st; + +void main() +{ + vec4 p = czm_computePosition(); + + v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates + v_normalEC = czm_normal * normal; // normal in eye coordinates + v_tangentEC = czm_normal * tangent; // tangent in eye coordinates + v_bitangentEC = czm_normal * bitangent; // bitangent in eye coordinates + v_st = st; + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`, BasicMaterialAppearanceFS = `in vec3 v_positionEC; +in vec3 v_normalEC; + +void main() +{ + vec3 positionToEyeEC = -v_positionEC; + + vec3 normalEC = normalize(v_normalEC); +#ifdef FACE_FORWARD + normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); +#endif + + czm_materialInput materialInput; + materialInput.normalEC = normalEC; + materialInput.positionToEyeEC = positionToEyeEC; + czm_material material = czm_getMaterial(materialInput); + +#ifdef FLAT + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#else + out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +#endif +} +`, BasicMaterialAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 normal; +in float batchId; + +out vec3 v_positionEC; +out vec3 v_normalEC; + +void main() +{ + vec4 p = czm_computePosition(); + + v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates + v_normalEC = czm_normal * normal; // normal in eye coordinates + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`, TexturedMaterialAppearanceFS = `in vec3 v_positionEC; +in vec3 v_normalEC; +in vec2 v_st; + +void main() +{ + vec3 positionToEyeEC = -v_positionEC; + + vec3 normalEC = normalize(v_normalEC); +#ifdef FACE_FORWARD + normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); +#endif + + czm_materialInput materialInput; + materialInput.normalEC = normalEC; + materialInput.positionToEyeEC = positionToEyeEC; + materialInput.st = v_st; + czm_material material = czm_getMaterial(materialInput); + +#ifdef FLAT + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#else + out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +#endif +} +`, TexturedMaterialAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 normal; +in vec2 st; +in float batchId; + +out vec3 v_positionEC; +out vec3 v_normalEC; +out vec2 v_st; + +void main() +{ + vec4 p = czm_computePosition(); + + v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates + v_normalEC = czm_normal * normal; // normal in eye coordinates + v_st = st; + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`, BlendEquation = { + /** + * Pixel values are added componentwise. This is used in additive blending for translucency. + * + * @type {number} + * @constant + */ + ADD: WebGLConstants$1.FUNC_ADD, + /** + * Pixel values are subtracted componentwise (source - destination). This is used in alpha blending for translucency. + * + * @type {number} + * @constant + */ + SUBTRACT: WebGLConstants$1.FUNC_SUBTRACT, + /** + * Pixel values are subtracted componentwise (destination - source). + * + * @type {number} + * @constant + */ + REVERSE_SUBTRACT: WebGLConstants$1.FUNC_REVERSE_SUBTRACT, + /** + * Pixel values are given to the minimum function (min(source, destination)). + * + * This equation operates on each pixel color component. + * + * @type {number} + * @constant + */ + MIN: WebGLConstants$1.MIN, + /** + * Pixel values are given to the maximum function (max(source, destination)). + * + * This equation operates on each pixel color component. + * + * @type {number} + * @constant + */ + MAX: WebGLConstants$1.MAX +}, BlendEquation$1 = Object.freeze(BlendEquation), BlendFunction = { + /** + * The blend factor is zero. + * + * @type {number} + * @constant + */ + ZERO: WebGLConstants$1.ZERO, + /** + * The blend factor is one. + * + * @type {number} + * @constant + */ + ONE: WebGLConstants$1.ONE, + /** + * The blend factor is the source color. + * + * @type {number} + * @constant + */ + SOURCE_COLOR: WebGLConstants$1.SRC_COLOR, + /** + * The blend factor is one minus the source color. + * + * @type {number} + * @constant + */ + ONE_MINUS_SOURCE_COLOR: WebGLConstants$1.ONE_MINUS_SRC_COLOR, + /** + * The blend factor is the destination color. + * + * @type {number} + * @constant + */ + DESTINATION_COLOR: WebGLConstants$1.DST_COLOR, + /** + * The blend factor is one minus the destination color. + * + * @type {number} + * @constant + */ + ONE_MINUS_DESTINATION_COLOR: WebGLConstants$1.ONE_MINUS_DST_COLOR, + /** + * The blend factor is the source alpha. + * + * @type {number} + * @constant + */ + SOURCE_ALPHA: WebGLConstants$1.SRC_ALPHA, + /** + * The blend factor is one minus the source alpha. + * + * @type {number} + * @constant + */ + ONE_MINUS_SOURCE_ALPHA: WebGLConstants$1.ONE_MINUS_SRC_ALPHA, + /** + * The blend factor is the destination alpha. + * + * @type {number} + * @constant + */ + DESTINATION_ALPHA: WebGLConstants$1.DST_ALPHA, + /** + * The blend factor is one minus the destination alpha. + * + * @type {number} + * @constant + */ + ONE_MINUS_DESTINATION_ALPHA: WebGLConstants$1.ONE_MINUS_DST_ALPHA, + /** + * The blend factor is the constant color. + * + * @type {number} + * @constant + */ + CONSTANT_COLOR: WebGLConstants$1.CONSTANT_COLOR, + /** + * The blend factor is one minus the constant color. + * + * @type {number} + * @constant + */ + ONE_MINUS_CONSTANT_COLOR: WebGLConstants$1.ONE_MINUS_CONSTANT_COLOR, + /** + * The blend factor is the constant alpha. + * + * @type {number} + * @constant + */ + CONSTANT_ALPHA: WebGLConstants$1.CONSTANT_ALPHA, + /** + * The blend factor is one minus the constant alpha. + * + * @type {number} + * @constant + */ + ONE_MINUS_CONSTANT_ALPHA: WebGLConstants$1.ONE_MINUS_CONSTANT_ALPHA, + /** + * The blend factor is the saturated source alpha. + * + * @type {number} + * @constant + */ + SOURCE_ALPHA_SATURATE: WebGLConstants$1.SRC_ALPHA_SATURATE +}, BlendFunction$1 = Object.freeze(BlendFunction), BlendingState = { + /** + * Blending is disabled. + * + * @type {object} + * @constant + */ + DISABLED: Object.freeze({ + enabled: !1 + }), + /** + * Blending is enabled using alpha blending, source(source.alpha) + destination(1 - source.alpha). + * + * @type {object} + * @constant + */ + ALPHA_BLEND: Object.freeze({ + enabled: !0, + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.SOURCE_ALPHA, + functionSourceAlpha: BlendFunction$1.ONE, + functionDestinationRgb: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA, + functionDestinationAlpha: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA + }), + /** + * Blending is enabled using alpha blending with premultiplied alpha, source + destination(1 - source.alpha). + * + * @type {object} + * @constant + */ + PRE_MULTIPLIED_ALPHA_BLEND: Object.freeze({ + enabled: !0, + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.ONE, + functionSourceAlpha: BlendFunction$1.ONE, + functionDestinationRgb: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA, + functionDestinationAlpha: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA + }), + /** + * Blending is enabled using additive blending, source(source.alpha) + destination. + * + * @type {object} + * @constant + */ + ADDITIVE_BLEND: Object.freeze({ + enabled: !0, + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.SOURCE_ALPHA, + functionSourceAlpha: BlendFunction$1.ONE, + functionDestinationRgb: BlendFunction$1.ONE, + functionDestinationAlpha: BlendFunction$1.ONE + }) +}, BlendingState$1 = Object.freeze(BlendingState), CullFace = { + /** + * Front-facing triangles are culled. + * + * @type {number} + * @constant + */ + FRONT: WebGLConstants$1.FRONT, + /** + * Back-facing triangles are culled. + * + * @type {number} + * @constant + */ + BACK: WebGLConstants$1.BACK, + /** + * Both front-facing and back-facing triangles are culled. + * + * @type {number} + * @constant + */ + FRONT_AND_BACK: WebGLConstants$1.FRONT_AND_BACK +}, CullFace$1 = Object.freeze(CullFace); +function Appearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.material = e.material, this.translucent = defaultValue(e.translucent, !0), this._vertexShaderSource = e.vertexShaderSource, this._fragmentShaderSource = e.fragmentShaderSource, this._renderState = e.renderState, this._closed = defaultValue(e.closed, !1); +} +Object.defineProperties(Appearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof Appearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link Appearance#material}. + * Use {@link Appearance#getFragmentShaderSource} to get the full source. + * + * @memberof Appearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + * + * @memberof Appearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When true, the geometry is expected to be closed. + * + * @memberof Appearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + } +}); +Appearance.prototype.getFragmentShaderSource = function() { + const e = []; + return this.flat && e.push("#define FLAT"), this.faceForward && e.push("#define FACE_FORWARD"), defined(this.material) && e.push(this.material.shaderSource), e.push(this.fragmentShaderSource), e.join(` +`); +}; +Appearance.prototype.isTranslucent = function() { + return defined(this.material) && this.material.isTranslucent() || !defined(this.material) && this.translucent; +}; +Appearance.prototype.getRenderState = function() { + const e = this.isTranslucent(), t = clone$1(this.renderState, !1); + return e ? (t.depthMask = !1, t.blending = BlendingState$1.ALPHA_BLEND) : t.depthMask = !0, t; +}; +Appearance.getDefaultRenderState = function(e, t, n) { + let i = { + depthTest: { + enabled: !0 + } + }; + return e && (i.depthMask = !1, i.blending = BlendingState$1.ALPHA_BLEND), t && (i.cull = { + enabled: !0, + face: CullFace$1.BACK + }), defined(n) && (i = combine$2(n, i, !0)), i; +}; +const AspectRampMaterial = `uniform sampler2D image; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + vec4 rampColor = texture(image, vec2(materialInput.aspect / (2.0 * czm_pi), 0.5)); + rampColor = czm_gammaCorrect(rampColor); + material.diffuse = rampColor.rgb; + material.alpha = rampColor.a; + return material; +} +`, BumpMapMaterial = `uniform sampler2D image; +uniform float strength; +uniform vec2 repeat; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + + vec2 centerPixel = fract(repeat * st); + float centerBump = texture(image, centerPixel).channel; + + float imageWidth = float(imageDimensions.x); + vec2 rightPixel = fract(repeat * (st + vec2(1.0 / imageWidth, 0.0))); + float rightBump = texture(image, rightPixel).channel; + + float imageHeight = float(imageDimensions.y); + vec2 leftPixel = fract(repeat * (st + vec2(0.0, 1.0 / imageHeight))); + float topBump = texture(image, leftPixel).channel; + + vec3 normalTangentSpace = normalize(vec3(centerBump - rightBump, centerBump - topBump, clamp(1.0 - strength, 0.1, 1.0))); + vec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace; + + material.normal = normalEC; + material.diffuse = vec3(0.01); + + return material; +} +`, CheckerboardMaterial = `uniform vec4 lightColor; +uniform vec4 darkColor; +uniform vec2 repeat; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + + // From Stefan Gustavson's Procedural Textures in GLSL in OpenGL Insights + float b = mod(floor(repeat.s * st.s) + floor(repeat.t * st.t), 2.0); // 0.0 or 1.0 + + // Find the distance from the closest separator (region between two colors) + float scaledWidth = fract(repeat.s * st.s); + scaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5)); + float scaledHeight = fract(repeat.t * st.t); + scaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5)); + float value = min(scaledWidth, scaledHeight); + + vec4 currentColor = mix(lightColor, darkColor, b); + vec4 color = czm_antialias(lightColor, darkColor, currentColor, value, 0.03); + + color = czm_gammaCorrect(color); + material.diffuse = color.rgb; + material.alpha = color.a; + + return material; +} +`, DotMaterial = `uniform vec4 lightColor; +uniform vec4 darkColor; +uniform vec2 repeat; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + // From Stefan Gustavson's Procedural Textures in GLSL in OpenGL Insights + float b = smoothstep(0.3, 0.32, length(fract(repeat * materialInput.st) - 0.5)); // 0.0 or 1.0 + + vec4 color = mix(lightColor, darkColor, b); + color = czm_gammaCorrect(color); + material.diffuse = color.rgb; + material.alpha = color.a; + + return material; +} +`, ElevationBandMaterial = `uniform sampler2D heights; +uniform sampler2D colors; + +// This material expects heights to be sorted from lowest to highest. + +float getHeight(int idx, float invTexSize) +{ + vec2 uv = vec2((float(idx) + 0.5) * invTexSize, 0.5); +#ifdef OES_texture_float + return texture(heights, uv).x; +#else + return czm_unpackFloat(texture(heights, uv)); +#endif +} + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + float height = materialInput.height; + float invTexSize = 1.0 / float(heightsDimensions.x); + + float minHeight = getHeight(0, invTexSize); + float maxHeight = getHeight(heightsDimensions.x - 1, invTexSize); + + // early-out when outside the height range + if (height < minHeight || height > maxHeight) { + material.diffuse = vec3(0.0); + material.alpha = 0.0; + return material; + } + + // Binary search to find heights above and below. + int idxBelow = 0; + int idxAbove = heightsDimensions.x; + float heightBelow = minHeight; + float heightAbove = maxHeight; + + // while loop not allowed, so use for loop with max iterations. + // maxIterations of 16 supports a texture size up to 65536 (2^16). + const int maxIterations = 16; + for (int i = 0; i < maxIterations; i++) { + if (idxBelow >= idxAbove - 1) { + break; + } + + int idxMid = (idxBelow + idxAbove) / 2; + float heightTex = getHeight(idxMid, invTexSize); + + if (height > heightTex) { + idxBelow = idxMid; + heightBelow = heightTex; + } else { + idxAbove = idxMid; + heightAbove = heightTex; + } + } + + float lerper = heightBelow == heightAbove ? 1.0 : (height - heightBelow) / (heightAbove - heightBelow); + vec2 colorUv = vec2(invTexSize * (float(idxBelow) + 0.5 + lerper), 0.5); + vec4 color = texture(colors, colorUv); + + // undo preumultiplied alpha + if (color.a > 0.0) + { + color.rgb /= color.a; + } + + color.rgb = czm_gammaCorrect(color.rgb); + + material.diffuse = color.rgb; + material.alpha = color.a; + return material; +} +`, ElevationContourMaterial = `uniform vec4 color; +uniform float spacing; +uniform float width; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + float distanceToContour = mod(materialInput.height, spacing); + +#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) + float dxc = abs(dFdx(materialInput.height)); + float dyc = abs(dFdy(materialInput.height)); + float dF = max(dxc, dyc) * czm_pixelRatio * width; + float alpha = (distanceToContour < dF) ? 1.0 : 0.0; +#else + // If no derivatives available (IE 10?), use pixel ratio + float alpha = (distanceToContour < (czm_pixelRatio * width)) ? 1.0 : 0.0; +#endif + + vec4 outColor = czm_gammaCorrect(vec4(color.rgb, alpha * color.a)); + material.diffuse = outColor.rgb; + material.alpha = outColor.a; + + return material; +} +`, ElevationRampMaterial = `uniform sampler2D image; +uniform float minimumHeight; +uniform float maximumHeight; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + float scaledHeight = clamp((materialInput.height - minimumHeight) / (maximumHeight - minimumHeight), 0.0, 1.0); + vec4 rampColor = texture(image, vec2(scaledHeight, 0.5)); + rampColor = czm_gammaCorrect(rampColor); + material.diffuse = rampColor.rgb; + material.alpha = rampColor.a; + return material; +} +`, FadeMaterial = `uniform vec4 fadeInColor; +uniform vec4 fadeOutColor; +uniform float maximumDistance; +uniform bool repeat; +uniform vec2 fadeDirection; +uniform vec2 time; + +float getTime(float t, float coord) +{ + float scalar = 1.0 / maximumDistance; + float q = distance(t, coord) * scalar; + if (repeat) + { + float r = distance(t, coord + 1.0) * scalar; + float s = distance(t, coord - 1.0) * scalar; + q = min(min(r, s), q); + } + return clamp(q, 0.0, 1.0); +} + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + float s = getTime(time.x, st.s) * fadeDirection.s; + float t = getTime(time.y, st.t) * fadeDirection.t; + + float u = length(vec2(s, t)); + vec4 color = mix(fadeInColor, fadeOutColor, u); + + color = czm_gammaCorrect(color); + material.emission = color.rgb; + material.alpha = color.a; + + return material; +} +`, GridMaterial = `uniform vec4 color; +uniform float cellAlpha; +uniform vec2 lineCount; +uniform vec2 lineThickness; +uniform vec2 lineOffset; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + + float scaledWidth = fract(lineCount.s * st.s - lineOffset.s); + scaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5)); + float scaledHeight = fract(lineCount.t * st.t - lineOffset.t); + scaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5)); + + float value; + + // Fuzz Factor - Controls blurriness of lines +#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) + const float fuzz = 1.2; + vec2 thickness = (lineThickness * czm_pixelRatio) - 1.0; + + // From "3D Engine Design for Virtual Globes" by Cozzi and Ring, Listing 4.13. + vec2 dx = abs(dFdx(st)); + vec2 dy = abs(dFdy(st)); + vec2 dF = vec2(max(dx.s, dy.s), max(dx.t, dy.t)) * lineCount; + value = min( + smoothstep(dF.s * thickness.s, dF.s * (fuzz + thickness.s), scaledWidth), + smoothstep(dF.t * thickness.t, dF.t * (fuzz + thickness.t), scaledHeight)); +#else + // If no derivatives available (IE 10?), revert to view-dependent fuzz + const float fuzz = 0.05; + + vec2 range = 0.5 - (lineThickness * 0.05); + value = min( + 1.0 - smoothstep(range.s, range.s + fuzz, scaledWidth), + 1.0 - smoothstep(range.t, range.t + fuzz, scaledHeight)); +#endif + + // Edges taken from RimLightingMaterial.glsl + // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html + float dRim = 1.0 - abs(dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC))); + float sRim = smoothstep(0.8, 1.0, dRim); + value *= (1.0 - sRim); + + vec4 halfColor; + halfColor.rgb = color.rgb * 0.5; + halfColor.a = color.a * (1.0 - ((1.0 - cellAlpha) * value)); + halfColor = czm_gammaCorrect(halfColor); + material.diffuse = halfColor.rgb; + material.emission = halfColor.rgb; + material.alpha = halfColor.a; + + return material; +} +`, NormalMapMaterial = `uniform sampler2D image; +uniform float strength; +uniform vec2 repeat; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec4 textureValue = texture(image, fract(repeat * materialInput.st)); + vec3 normalTangentSpace = textureValue.channels; + normalTangentSpace.xy = normalTangentSpace.xy * 2.0 - 1.0; + normalTangentSpace.z = clamp(1.0 - strength, 0.1, 1.0); + normalTangentSpace = normalize(normalTangentSpace); + vec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace; + + material.normal = normalEC; + + return material; +} +`, PolylineArrowMaterial = `uniform vec4 color; + +float getPointOnLine(vec2 p0, vec2 p1, float x) +{ + float slope = (p0.y - p1.y) / (p0.x - p1.x); + return slope * (x - p0.x) + p0.y; +} + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + +#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) + float base = 1.0 - abs(fwidth(st.s)) * 10.0 * czm_pixelRatio; +#else + // If no derivatives available (IE 10?), 2.5% of the line will be the arrow head + float base = 0.975; +#endif + + vec2 center = vec2(1.0, 0.5); + float ptOnUpperLine = getPointOnLine(vec2(base, 1.0), center, st.s); + float ptOnLowerLine = getPointOnLine(vec2(base, 0.0), center, st.s); + + float halfWidth = 0.15; + float s = step(0.5 - halfWidth, st.t); + s *= 1.0 - step(0.5 + halfWidth, st.t); + s *= 1.0 - step(base, st.s); + + float t = step(base, materialInput.st.s); + t *= 1.0 - step(ptOnUpperLine, st.t); + t *= step(ptOnLowerLine, st.t); + + // Find the distance from the closest separator (region between two colors) + float dist; + if (st.s < base) + { + float d1 = abs(st.t - (0.5 - halfWidth)); + float d2 = abs(st.t - (0.5 + halfWidth)); + dist = min(d1, d2); + } + else + { + float d1 = czm_infinity; + if (st.t < 0.5 - halfWidth && st.t > 0.5 + halfWidth) + { + d1 = abs(st.s - base); + } + float d2 = abs(st.t - ptOnUpperLine); + float d3 = abs(st.t - ptOnLowerLine); + dist = min(min(d1, d2), d3); + } + + vec4 outsideColor = vec4(0.0); + vec4 currentColor = mix(outsideColor, color, clamp(s + t, 0.0, 1.0)); + vec4 outColor = czm_antialias(outsideColor, color, currentColor, dist); + + outColor = czm_gammaCorrect(outColor); + material.diffuse = outColor.rgb; + material.alpha = outColor.a; + return material; +} +`, PolylineDashMaterial = `uniform vec4 color; +uniform vec4 gapColor; +uniform float dashLength; +uniform float dashPattern; +in float v_polylineAngle; + +const float maskLength = 16.0; + +mat2 rotate(float rad) { + float c = cos(rad); + float s = sin(rad); + return mat2( + c, s, + -s, c + ); +} + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 pos = rotate(v_polylineAngle) * gl_FragCoord.xy; + + // Get the relative position within the dash from 0 to 1 + float dashPosition = fract(pos.x / (dashLength * czm_pixelRatio)); + // Figure out the mask index. + float maskIndex = floor(dashPosition * maskLength); + // Test the bit mask. + float maskTest = floor(dashPattern / pow(2.0, maskIndex)); + vec4 fragColor = (mod(maskTest, 2.0) < 1.0) ? gapColor : color; + if (fragColor.a < 0.005) { // matches 0/255 and 1/255 + discard; + } + + fragColor = czm_gammaCorrect(fragColor); + material.emission = fragColor.rgb; + material.alpha = fragColor.a; + return material; +} +`, PolylineGlowMaterial = `uniform vec4 color; +uniform float glowPower; +uniform float taperPower; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + float glow = glowPower / abs(st.t - 0.5) - (glowPower / 0.5); + + if (taperPower <= 0.99999) { + glow *= min(1.0, taperPower / (0.5 - st.s * 0.5) - (taperPower / 0.5)); + } + + vec4 fragColor; + fragColor.rgb = max(vec3(glow - 1.0 + color.rgb), color.rgb); + fragColor.a = clamp(0.0, 1.0, glow) * color.a; + fragColor = czm_gammaCorrect(fragColor); + + material.emission = fragColor.rgb; + material.alpha = fragColor.a; + + return material; +} +`, PolylineOutlineMaterial = `uniform vec4 color; +uniform vec4 outlineColor; +uniform float outlineWidth; + +in float v_width; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec2 st = materialInput.st; + float halfInteriorWidth = 0.5 * (v_width - outlineWidth) / v_width; + float b = step(0.5 - halfInteriorWidth, st.t); + b *= 1.0 - step(0.5 + halfInteriorWidth, st.t); + + // Find the distance from the closest separator (region between two colors) + float d1 = abs(st.t - (0.5 - halfInteriorWidth)); + float d2 = abs(st.t - (0.5 + halfInteriorWidth)); + float dist = min(d1, d2); + + vec4 currentColor = mix(outlineColor, color, b); + vec4 outColor = czm_antialias(outlineColor, color, currentColor, dist); + outColor = czm_gammaCorrect(outColor); + + material.diffuse = outColor.rgb; + material.alpha = outColor.a; + + return material; +} +`, RimLightingMaterial = `uniform vec4 color; +uniform vec4 rimColor; +uniform float width; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html + float d = 1.0 - dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC)); + float s = smoothstep(1.0 - width, 1.0, d); + + vec4 outColor = czm_gammaCorrect(color); + vec4 outRimColor = czm_gammaCorrect(rimColor); + + material.diffuse = outColor.rgb; + material.emission = outRimColor.rgb * s; + material.alpha = mix(outColor.a, outRimColor.a, s); + + return material; +} +`, SlopeRampMaterial = `uniform sampler2D image; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + vec4 rampColor = texture(image, vec2(materialInput.slope / (czm_pi / 2.0), 0.5)); + rampColor = czm_gammaCorrect(rampColor); + material.diffuse = rampColor.rgb; + material.alpha = rampColor.a; + return material; +} +`, StripeMaterial = `uniform vec4 evenColor; +uniform vec4 oddColor; +uniform float offset; +uniform float repeat; +uniform bool horizontal; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + // Based on the Stripes Fragment Shader in the Orange Book (11.1.2) + float coord = mix(materialInput.st.s, materialInput.st.t, float(horizontal)); + float value = fract((coord - offset) * (repeat * 0.5)); + float dist = min(value, min(abs(value - 0.5), 1.0 - value)); + + vec4 currentColor = mix(evenColor, oddColor, step(0.5, value)); + vec4 color = czm_antialias(evenColor, oddColor, currentColor, dist); + color = czm_gammaCorrect(color); + + material.diffuse = color.rgb; + material.alpha = color.a; + + return material; +} +`, WaterMaskMaterial = `uniform vec4 waterColor; +uniform vec4 landColor; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + vec4 outColor = mix(landColor, waterColor, materialInput.waterMask); + outColor = czm_gammaCorrect(outColor); + + material.diffuse = outColor.rgb; + material.alpha = outColor.a; + + return material; +} +`, WaterMaterial = `// Thanks for the contribution Jonas +// http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog + +uniform sampler2D specularMap; +uniform sampler2D normalMap; +uniform vec4 baseWaterColor; +uniform vec4 blendColor; +uniform float frequency; +uniform float animationSpeed; +uniform float amplitude; +uniform float specularIntensity; +uniform float fadeFactor; + +czm_material czm_getMaterial(czm_materialInput materialInput) +{ + czm_material material = czm_getDefaultMaterial(materialInput); + + float time = czm_frameNumber * animationSpeed; + + // fade is a function of the distance from the fragment and the frequency of the waves + float fade = max(1.0, (length(materialInput.positionToEyeEC) / 10000000000.0) * frequency * fadeFactor); + + float specularMapValue = texture(specularMap, materialInput.st).r; + + // note: not using directional motion at this time, just set the angle to 0.0; + vec4 noise = czm_getWaterNoise(normalMap, materialInput.st * frequency, time, 0.0); + vec3 normalTangentSpace = noise.xyz * vec3(1.0, 1.0, (1.0 / amplitude)); + + // fade out the normal perturbation as we move further from the water surface + normalTangentSpace.xy /= fade; + + // attempt to fade out the normal perturbation as we approach non water areas (low specular map value) + normalTangentSpace = mix(vec3(0.0, 0.0, 50.0), normalTangentSpace, specularMapValue); + + normalTangentSpace = normalize(normalTangentSpace); + + // get ratios for alignment of the new normal vector with a vector perpendicular to the tangent plane + float tsPerturbationRatio = clamp(dot(normalTangentSpace, vec3(0.0, 0.0, 1.0)), 0.0, 1.0); + + // fade out water effect as specular map value decreases + material.alpha = mix(blendColor.a, baseWaterColor.a, specularMapValue) * specularMapValue; + + // base color is a blend of the water and non-water color based on the value from the specular map + // may need a uniform blend factor to better control this + material.diffuse = mix(blendColor.rgb, baseWaterColor.rgb, specularMapValue); + + // diffuse highlights are based on how perturbed the normal is + material.diffuse += (0.1 * tsPerturbationRatio); + + material.diffuse = material.diffuse; + + material.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace); + + material.specular = specularIntensity; + material.shininess = 10.0; + + return material; +} +`; +function Material$4(e) { + this.type = void 0, this.shaderSource = void 0, this.materials = void 0, this.uniforms = void 0, this._uniforms = void 0, this.translucent = void 0, this._minificationFilter = defaultValue( + e.minificationFilter, + TextureMinificationFilter$1.LINEAR + ), this._magnificationFilter = defaultValue( + e.magnificationFilter, + TextureMagnificationFilter$1.LINEAR + ), this._strict = void 0, this._template = void 0, this._count = void 0, this._texturePaths = {}, this._loadedImages = [], this._loadedCubeMaps = [], this._textures = {}, this._updateFunctions = [], this._defaultTexture = void 0, initializeMaterial(e, this), Object.defineProperties(this, { + type: { + value: this.type, + writable: !1 + } + }), defined(Material$4._uniformList[this.type]) || (Material$4._uniformList[this.type] = Object.keys(this._uniforms)); +} +Material$4._uniformList = {}; +Material$4.fromType = function(e, t) { + const n = new Material$4({ + fabric: { + type: e + } + }); + if (defined(t)) + for (const i in t) + t.hasOwnProperty(i) && (n.uniforms[i] = t[i]); + return n; +}; +Material$4.prototype.isTranslucent = function() { + if (defined(this.translucent)) + return typeof this.translucent == "function" ? this.translucent() : this.translucent; + let e = !0; + const t = this._translucentFunctions, n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i]; + if (typeof r == "function" ? e = e && r() : e = e && r, !e) + break; + } + return e; +}; +Material$4.prototype.update = function(e) { + this._defaultTexture = e.defaultTexture; + let t, n; + const i = this._loadedImages; + let r = i.length; + for (t = 0; t < r; ++t) { + const l = i[t]; + n = l.id; + let d = l.image, f; + Array.isArray(d) && (f = d.slice(1, d.length).map(function(y) { + return y.bufferView; + }), d = d[0]); + const h = new Sampler({ + minificationFilter: this._minificationFilter, + magnificationFilter: this._magnificationFilter + }); + let p; + defined(d.internalFormat) ? p = new Texture({ + context: e, + pixelFormat: d.internalFormat, + width: d.width, + height: d.height, + source: { + arrayBufferView: d.bufferView, + mipLevels: f + }, + sampler: h + }) : p = new Texture({ + context: e, + source: d, + sampler: h + }); + const m = this._textures[n]; + defined(m) && m !== this._defaultTexture && m.destroy(), this._textures[n] = p; + const _ = `${n}Dimensions`; + if (this.uniforms.hasOwnProperty(_)) { + const y = this.uniforms[_]; + y.x = p._width, y.y = p._height; + } + } + i.length = 0; + const o = this._loadedCubeMaps; + for (r = o.length, t = 0; t < r; ++t) { + const l = o[t]; + n = l.id; + const d = l.images, f = new CubeMap({ + context: e, + source: { + positiveX: d[0], + negativeX: d[1], + positiveY: d[2], + negativeY: d[3], + positiveZ: d[4], + negativeZ: d[5] + }, + sampler: new Sampler({ + minificationFilter: this._minificationFilter, + magnificationFilter: this._magnificationFilter + }) + }); + this._textures[n] = f; + } + o.length = 0; + const s = this._updateFunctions; + for (r = s.length, t = 0; t < r; ++t) + s[t](this, e); + const c = this.materials; + for (const l in c) + c.hasOwnProperty(l) && c[l].update(e); +}; +Material$4.prototype.isDestroyed = function() { + return !1; +}; +Material$4.prototype.destroy = function() { + const e = this._textures; + for (const n in e) + if (e.hasOwnProperty(n)) { + const i = e[n]; + i !== this._defaultTexture && i.destroy(); + } + const t = this.materials; + for (const n in t) + t.hasOwnProperty(n) && t[n].destroy(); + return destroyObject(this); +}; +function initializeMaterial(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), t._strict = defaultValue(e.strict, !1), t._count = defaultValue(e.count, 0), t._template = clone$1( + defaultValue(e.fabric, defaultValue.EMPTY_OBJECT) + ), t._template.uniforms = clone$1( + defaultValue(t._template.uniforms, defaultValue.EMPTY_OBJECT) + ), t._template.materials = clone$1( + defaultValue(t._template.materials, defaultValue.EMPTY_OBJECT) + ), t.type = defined(t._template.type) ? t._template.type : createGuid(), t.shaderSource = "", t.materials = {}, t.uniforms = {}, t._uniforms = {}, t._translucentFunctions = []; + let n; + const i = Material$4._materialCache.getMaterial(t.type); + if (defined(i)) { + const o = clone$1(i.fabric, !0); + t._template = combine$2(t._template, o, !0), n = i.translucent; + } + checkForTemplateErrors(t), defined(i) || Material$4._materialCache.addMaterial(t.type, t), createMethodDefinition(t), createUniforms(t), createSubMaterials(t); + const r = t._translucentFunctions.length === 0 ? !0 : void 0; + if (n = defaultValue(n, r), n = defaultValue(e.translucent, n), defined(n)) + if (typeof n == "function") { + const o = function() { + return n(t); + }; + t._translucentFunctions.push(o); + } else + t._translucentFunctions.push(n); +} +function checkForValidProperties(e, t, n, i) { + if (defined(e)) { + for (const r in e) + if (e.hasOwnProperty(r)) { + const o = t.indexOf(r) !== -1; + (i && !o || !i && o) && n(r, t); + } + } +} +function invalidNameError(e, t) { +} +function duplicateNameError(e, t) { +} +const templateProperties = [ + "type", + "materials", + "uniforms", + "components", + "source" +], componentProperties = [ + "diffuse", + "specular", + "shininess", + "normal", + "emission", + "alpha" +]; +function checkForTemplateErrors(e) { + const t = e._template, n = t.uniforms, i = t.materials, r = t.components; + checkForValidProperties(t, templateProperties, invalidNameError, !0), checkForValidProperties( + r, + componentProperties, + invalidNameError, + !0 + ); + const o = []; + for (const s in i) + i.hasOwnProperty(s) && o.push(s); + checkForValidProperties(n, o, duplicateNameError, !1); +} +function isMaterialFused(e, t) { + const n = t._template.materials; + for (const i in n) + if (n.hasOwnProperty(i) && e.indexOf(i) > -1) + return !0; + return !1; +} +function createMethodDefinition(e) { + const t = e._template.components, n = e._template.source; + if (defined(n)) + e.shaderSource += `${n} +`; + else { + if (e.shaderSource += `czm_material czm_getMaterial(czm_materialInput materialInput) +{ +`, e.shaderSource += `czm_material material = czm_getDefaultMaterial(materialInput); +`, defined(t)) { + const i = Object.keys(e._template.materials).length > 0; + for (const r in t) + if (t.hasOwnProperty(r)) + if (r === "diffuse" || r === "emission") { + const s = i && isMaterialFused(t[r], e) ? t[r] : `czm_gammaCorrect(${t[r]})`; + e.shaderSource += `material.${r} = ${s}; +`; + } else r === "alpha" ? e.shaderSource += `material.alpha = ${t.alpha}; +` : e.shaderSource += `material.${r} = ${t[r]}; +`; + } + e.shaderSource += `return material; +} +`; + } +} +const matrixMap = { + mat2: Matrix2, + mat3: Matrix3, + mat4: Matrix4 +}, ktx2Regex$2 = /\.ktx2$/i; +function createTexture2DUpdateFunction(e) { + let t; + return function(n, i) { + const r = n.uniforms, o = r[e], s = t !== o, c = !defined(o) || o === Material$4.DefaultImageId; + t = o; + let l = n._textures[e], d, f; + if (o instanceof HTMLVideoElement) { + if (o.readyState >= 2) { + if (s && defined(l) && (l !== i.defaultTexture && l.destroy(), l = void 0), !defined(l) || l === i.defaultTexture) { + const p = new Sampler({ + minificationFilter: n._minificationFilter, + magnificationFilter: n._magnificationFilter + }); + l = new Texture({ + context: i, + source: o, + sampler: p + }), n._textures[e] = l; + return; + } + l.copyFrom({ + source: o + }); + } else defined(l) || (n._textures[e] = i.defaultTexture); + return; + } + if (o instanceof Texture && o !== l) { + n._texturePaths[e] = void 0; + const p = n._textures[e]; + defined(p) && p !== n._defaultTexture && p.destroy(), n._textures[e] = o, d = `${e}Dimensions`, r.hasOwnProperty(d) && (f = r[d], f.x = o._width, f.y = o._height); + return; + } + if (s && defined(l) && c && (l !== n._defaultTexture && l.destroy(), l = void 0), defined(l) || (n._texturePaths[e] = void 0, l = n._textures[e] = n._defaultTexture, d = `${e}Dimensions`, r.hasOwnProperty(d) && (f = r[d], f.x = l._width, f.y = l._height)), c) + return; + const h = o instanceof Resource; + if (!defined(n._texturePaths[e]) || h && o.url !== n._texturePaths[e].url || !h && o !== n._texturePaths[e]) { + if (typeof o == "string" || h) { + const p = h ? o : Resource.createIfNeeded(o); + let m; + ktx2Regex$2.test(p.url) ? m = loadKTX2(p.url) : m = p.fetchImage(), Promise.resolve(m).then(function(_) { + n._loadedImages.push({ + id: e, + image: _ + }); + }).catch(function() { + defined(l) && l !== n._defaultTexture && l.destroy(), n._textures[e] = n._defaultTexture; + }); + } else (o instanceof HTMLCanvasElement || o instanceof HTMLImageElement) && n._loadedImages.push({ + id: e, + image: o + }); + n._texturePaths[e] = o; + } + }; +} +function createCubeMapUpdateFunction(e) { + return function(t, n) { + const i = t.uniforms[e]; + if (i instanceof CubeMap) { + const o = t._textures[e]; + o !== t._defaultTexture && o.destroy(), t._texturePaths[e] = void 0, t._textures[e] = i; + return; + } + if (defined(t._textures[e]) || (t._texturePaths[e] = void 0, t._textures[e] = n.defaultCubeMap), i === Material$4.DefaultCubeMapId) + return; + const r = i.positiveX + i.negativeX + i.positiveY + i.negativeY + i.positiveZ + i.negativeZ; + if (r !== t._texturePaths[e]) { + const o = [ + Resource.createIfNeeded(i.positiveX).fetchImage(), + Resource.createIfNeeded(i.negativeX).fetchImage(), + Resource.createIfNeeded(i.positiveY).fetchImage(), + Resource.createIfNeeded(i.negativeY).fetchImage(), + Resource.createIfNeeded(i.positiveZ).fetchImage(), + Resource.createIfNeeded(i.negativeZ).fetchImage() + ]; + Promise.all(o).then(function(s) { + t._loadedCubeMaps.push({ + id: e, + images: s + }); + }), t._texturePaths[e] = r; + } + }; +} +function createUniforms(e) { + const t = e._template.uniforms; + for (const n in t) + t.hasOwnProperty(n) && createUniform(e, n); +} +function createUniform(e, t) { + e._strict; + const n = e._template.uniforms, i = n[t], r = getUniformType(i); + if (r === "channels") + replaceToken(e, t, i, !1); + else { + if (r === "sampler2D") { + const c = `${t}Dimensions`; + getNumberOfTokens(e, c) > 0 && (n[c] = { + type: "ivec3", + x: 1, + y: 1 + }, createUniform(e, c)); + } + if (!new RegExp( + `uniform\\s+${r}\\s+${t}\\s*;` + ).test(e.shaderSource)) { + const c = `uniform ${r} ${t};`; + e.shaderSource = c + e.shaderSource; + } + const s = `${t}_${e._count++}`; + if (replaceToken(e, t, s), e.uniforms[t] = i, r === "sampler2D") + e._uniforms[s] = function() { + return e._textures[t]; + }, e._updateFunctions.push(createTexture2DUpdateFunction(t)); + else if (r === "samplerCube") + e._uniforms[s] = function() { + return e._textures[t]; + }, e._updateFunctions.push(createCubeMapUpdateFunction(t)); + else if (r.indexOf("mat") !== -1) { + const c = new matrixMap[r](); + e._uniforms[s] = function() { + return matrixMap[r].fromColumnMajorArray( + e.uniforms[t], + c + ); + }; + } else + e._uniforms[s] = function() { + return e.uniforms[t]; + }; + } +} +function getUniformType(e) { + let t = e.type; + if (!defined(t)) { + const n = typeof e; + if (n === "number") + t = "float"; + else if (n === "boolean") + t = "bool"; + else if (n === "string" || e instanceof Resource || e instanceof HTMLCanvasElement || e instanceof HTMLImageElement) + /^([rgba]){1,4}$/i.test(e) ? t = "channels" : e === Material$4.DefaultCubeMapId ? t = "samplerCube" : t = "sampler2D"; + else if (n === "object") + if (Array.isArray(e)) + (e.length === 4 || e.length === 9 || e.length === 16) && (t = `mat${Math.sqrt(e.length)}`); + else { + let i = 0; + for (const r in e) + e.hasOwnProperty(r) && (i += 1); + i >= 2 && i <= 4 ? t = `vec${i}` : i === 6 && (t = "samplerCube"); + } + } + return t; +} +function createSubMaterials(e) { + const t = e._strict, n = e._template.materials; + for (const i in n) + if (n.hasOwnProperty(i)) { + const r = new Material$4({ + strict: t, + fabric: n[i], + count: e._count + }); + e._count = r._count, e._uniforms = combine$2( + e._uniforms, + r._uniforms, + !0 + ), e.materials[i] = r, e._translucentFunctions = e._translucentFunctions.concat( + r._translucentFunctions + ); + const o = "czm_getMaterial", s = `${o}_${e._count++}`; + replaceToken(r, o, s), e.shaderSource = r.shaderSource + e.shaderSource; + const c = `${s}(materialInput)`; + replaceToken( + e, + i, + c + ); + } +} +function replaceToken(e, t, n, i) { + i = defaultValue(i, !0); + let r = 0; + const o = "([\\w])?", s = `([\\w${i ? "." : ""}])?`, c = new RegExp(s + t + o, "g"); + return e.shaderSource = e.shaderSource.replace(c, function(l, d, f) { + return d || f ? l : (r += 1, n); + }), r; +} +function getNumberOfTokens(e, t, n) { + return replaceToken(e, t, t, n); +} +Material$4._materialCache = { + _materials: {}, + addMaterial: function(e, t) { + this._materials[e] = t; + }, + getMaterial: function(e) { + return this._materials[e]; + } +}; +Material$4.DefaultImageId = "czm_defaultImage"; +Material$4.DefaultCubeMapId = "czm_defaultCubeMap"; +Material$4.ColorType = "Color"; +Material$4._materialCache.addMaterial(Material$4.ColorType, { + fabric: { + type: Material$4.ColorType, + uniforms: { + color: new Color(1, 0, 0, 0.5) + }, + components: { + diffuse: "color.rgb", + alpha: "color.a" + } + }, + translucent: function(e) { + return e.uniforms.color.alpha < 1; + } +}); +Material$4.ImageType = "Image"; +Material$4._materialCache.addMaterial(Material$4.ImageType, { + fabric: { + type: Material$4.ImageType, + uniforms: { + image: Material$4.DefaultImageId, + repeat: new Cartesian2(1, 1), + color: new Color(1, 1, 1, 1) + }, + components: { + diffuse: "texture(image, fract(repeat * materialInput.st)).rgb * color.rgb", + alpha: "texture(image, fract(repeat * materialInput.st)).a * color.a" + } + }, + translucent: function(e) { + return e.uniforms.color.alpha < 1; + } +}); +Material$4.DiffuseMapType = "DiffuseMap"; +Material$4._materialCache.addMaterial(Material$4.DiffuseMapType, { + fabric: { + type: Material$4.DiffuseMapType, + uniforms: { + image: Material$4.DefaultImageId, + channels: "rgb", + repeat: new Cartesian2(1, 1) + }, + components: { + diffuse: "texture(image, fract(repeat * materialInput.st)).channels" + } + }, + translucent: !1 +}); +Material$4.AlphaMapType = "AlphaMap"; +Material$4._materialCache.addMaterial(Material$4.AlphaMapType, { + fabric: { + type: Material$4.AlphaMapType, + uniforms: { + image: Material$4.DefaultImageId, + channel: "a", + repeat: new Cartesian2(1, 1) + }, + components: { + alpha: "texture(image, fract(repeat * materialInput.st)).channel" + } + }, + translucent: !0 +}); +Material$4.SpecularMapType = "SpecularMap"; +Material$4._materialCache.addMaterial(Material$4.SpecularMapType, { + fabric: { + type: Material$4.SpecularMapType, + uniforms: { + image: Material$4.DefaultImageId, + channel: "r", + repeat: new Cartesian2(1, 1) + }, + components: { + specular: "texture(image, fract(repeat * materialInput.st)).channel" + } + }, + translucent: !1 +}); +Material$4.EmissionMapType = "EmissionMap"; +Material$4._materialCache.addMaterial(Material$4.EmissionMapType, { + fabric: { + type: Material$4.EmissionMapType, + uniforms: { + image: Material$4.DefaultImageId, + channels: "rgb", + repeat: new Cartesian2(1, 1) + }, + components: { + emission: "texture(image, fract(repeat * materialInput.st)).channels" + } + }, + translucent: !1 +}); +Material$4.BumpMapType = "BumpMap"; +Material$4._materialCache.addMaterial(Material$4.BumpMapType, { + fabric: { + type: Material$4.BumpMapType, + uniforms: { + image: Material$4.DefaultImageId, + channel: "r", + strength: 0.8, + repeat: new Cartesian2(1, 1) + }, + source: BumpMapMaterial + }, + translucent: !1 +}); +Material$4.NormalMapType = "NormalMap"; +Material$4._materialCache.addMaterial(Material$4.NormalMapType, { + fabric: { + type: Material$4.NormalMapType, + uniforms: { + image: Material$4.DefaultImageId, + channels: "rgb", + strength: 0.8, + repeat: new Cartesian2(1, 1) + }, + source: NormalMapMaterial + }, + translucent: !1 +}); +Material$4.GridType = "Grid"; +Material$4._materialCache.addMaterial(Material$4.GridType, { + fabric: { + type: Material$4.GridType, + uniforms: { + color: new Color(0, 1, 0, 1), + cellAlpha: 0.1, + lineCount: new Cartesian2(8, 8), + lineThickness: new Cartesian2(1, 1), + lineOffset: new Cartesian2(0, 0) + }, + source: GridMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.color.alpha < 1 || t.cellAlpha < 1; + } +}); +Material$4.StripeType = "Stripe"; +Material$4._materialCache.addMaterial(Material$4.StripeType, { + fabric: { + type: Material$4.StripeType, + uniforms: { + horizontal: !0, + evenColor: new Color(1, 1, 1, 0.5), + oddColor: new Color(0, 0, 1, 0.5), + offset: 0, + repeat: 5 + }, + source: StripeMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.evenColor.alpha < 1 || t.oddColor.alpha < 1; + } +}); +Material$4.CheckerboardType = "Checkerboard"; +Material$4._materialCache.addMaterial(Material$4.CheckerboardType, { + fabric: { + type: Material$4.CheckerboardType, + uniforms: { + lightColor: new Color(1, 1, 1, 0.5), + darkColor: new Color(0, 0, 0, 0.5), + repeat: new Cartesian2(5, 5) + }, + source: CheckerboardMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.lightColor.alpha < 1 || t.darkColor.alpha < 1; + } +}); +Material$4.DotType = "Dot"; +Material$4._materialCache.addMaterial(Material$4.DotType, { + fabric: { + type: Material$4.DotType, + uniforms: { + lightColor: new Color(1, 1, 0, 0.75), + darkColor: new Color(0, 1, 1, 0.75), + repeat: new Cartesian2(5, 5) + }, + source: DotMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.lightColor.alpha < 1 || t.darkColor.alpha < 1; + } +}); +Material$4.WaterType = "Water"; +Material$4._materialCache.addMaterial(Material$4.WaterType, { + fabric: { + type: Material$4.WaterType, + uniforms: { + baseWaterColor: new Color(0.2, 0.3, 0.6, 1), + blendColor: new Color(0, 1, 0.699, 1), + specularMap: Material$4.DefaultImageId, + normalMap: Material$4.DefaultImageId, + frequency: 10, + animationSpeed: 0.01, + amplitude: 1, + specularIntensity: 0.5, + fadeFactor: 1 + }, + source: WaterMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.baseWaterColor.alpha < 1 || t.blendColor.alpha < 1; + } +}); +Material$4.RimLightingType = "RimLighting"; +Material$4._materialCache.addMaterial(Material$4.RimLightingType, { + fabric: { + type: Material$4.RimLightingType, + uniforms: { + color: new Color(1, 0, 0, 0.7), + rimColor: new Color(1, 1, 1, 0.4), + width: 0.3 + }, + source: RimLightingMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.color.alpha < 1 || t.rimColor.alpha < 1; + } +}); +Material$4.FadeType = "Fade"; +Material$4._materialCache.addMaterial(Material$4.FadeType, { + fabric: { + type: Material$4.FadeType, + uniforms: { + fadeInColor: new Color(1, 0, 0, 1), + fadeOutColor: new Color(0, 0, 0, 0), + maximumDistance: 0.5, + repeat: !0, + fadeDirection: { + x: !0, + y: !0 + }, + time: new Cartesian2(0.5, 0.5) + }, + source: FadeMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.fadeInColor.alpha < 1 || t.fadeOutColor.alpha < 1; + } +}); +Material$4.PolylineArrowType = "PolylineArrow"; +Material$4._materialCache.addMaterial(Material$4.PolylineArrowType, { + fabric: { + type: Material$4.PolylineArrowType, + uniforms: { + color: new Color(1, 1, 1, 1) + }, + source: PolylineArrowMaterial + }, + translucent: !0 +}); +Material$4.PolylineDashType = "PolylineDash"; +Material$4._materialCache.addMaterial(Material$4.PolylineDashType, { + fabric: { + type: Material$4.PolylineDashType, + uniforms: { + color: new Color(1, 0, 1, 1), + gapColor: new Color(0, 0, 0, 0), + dashLength: 16, + dashPattern: 255 + }, + source: PolylineDashMaterial + }, + translucent: !0 +}); +Material$4.PolylineGlowType = "PolylineGlow"; +Material$4._materialCache.addMaterial(Material$4.PolylineGlowType, { + fabric: { + type: Material$4.PolylineGlowType, + uniforms: { + color: new Color(0, 0.5, 1, 1), + glowPower: 0.25, + taperPower: 1 + }, + source: PolylineGlowMaterial + }, + translucent: !0 +}); +Material$4.PolylineOutlineType = "PolylineOutline"; +Material$4._materialCache.addMaterial(Material$4.PolylineOutlineType, { + fabric: { + type: Material$4.PolylineOutlineType, + uniforms: { + color: new Color(1, 1, 1, 1), + outlineColor: new Color(1, 0, 0, 1), + outlineWidth: 1 + }, + source: PolylineOutlineMaterial + }, + translucent: function(e) { + const t = e.uniforms; + return t.color.alpha < 1 || t.outlineColor.alpha < 1; + } +}); +Material$4.ElevationContourType = "ElevationContour"; +Material$4._materialCache.addMaterial(Material$4.ElevationContourType, { + fabric: { + type: Material$4.ElevationContourType, + uniforms: { + spacing: 100, + color: new Color(1, 0, 0, 1), + width: 1 + }, + source: ElevationContourMaterial + }, + translucent: !1 +}); +Material$4.ElevationRampType = "ElevationRamp"; +Material$4._materialCache.addMaterial(Material$4.ElevationRampType, { + fabric: { + type: Material$4.ElevationRampType, + uniforms: { + image: Material$4.DefaultImageId, + minimumHeight: 0, + maximumHeight: 1e4 + }, + source: ElevationRampMaterial + }, + translucent: !1 +}); +Material$4.SlopeRampMaterialType = "SlopeRamp"; +Material$4._materialCache.addMaterial(Material$4.SlopeRampMaterialType, { + fabric: { + type: Material$4.SlopeRampMaterialType, + uniforms: { + image: Material$4.DefaultImageId + }, + source: SlopeRampMaterial + }, + translucent: !1 +}); +Material$4.AspectRampMaterialType = "AspectRamp"; +Material$4._materialCache.addMaterial(Material$4.AspectRampMaterialType, { + fabric: { + type: Material$4.AspectRampMaterialType, + uniforms: { + image: Material$4.DefaultImageId + }, + source: AspectRampMaterial + }, + translucent: !1 +}); +Material$4.ElevationBandType = "ElevationBand"; +Material$4._materialCache.addMaterial(Material$4.ElevationBandType, { + fabric: { + type: Material$4.ElevationBandType, + uniforms: { + heights: Material$4.DefaultImageId, + colors: Material$4.DefaultImageId + }, + source: ElevationBandMaterial + }, + translucent: !0 +}); +Material$4.WaterMaskType = "WaterMask"; +Material$4._materialCache.addMaterial(Material$4.WaterMaskType, { + fabric: { + type: Material$4.WaterMaskType, + source: WaterMaskMaterial, + uniforms: { + waterColor: new Color(1, 1, 1, 1), + landColor: new Color(0, 0, 0, 0) + } + }, + translucent: !1 +}); +function MaterialAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.translucent, !0), n = defaultValue(e.closed, !1), i = defaultValue( + e.materialSupport, + MaterialAppearance.MaterialSupport.TEXTURED + ); + this.material = defined(e.material) ? e.material : Material$4.fromType(Material$4.ColorType), this.translucent = t, this._vertexShaderSource = defaultValue( + e.vertexShaderSource, + i.vertexShaderSource + ), this._fragmentShaderSource = defaultValue( + e.fragmentShaderSource, + i.fragmentShaderSource + ), this._renderState = Appearance.getDefaultRenderState( + t, + n, + e.renderState + ), this._closed = n, this._materialSupport = i, this._vertexFormat = i.vertexFormat, this._flat = defaultValue(e.flat, !1), this._faceForward = defaultValue(e.faceForward, !n); +} +Object.defineProperties(MaterialAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof MaterialAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link MaterialAppearance#material}, + * {@link MaterialAppearance#flat}, and {@link MaterialAppearance#faceForward}. + * Use {@link MaterialAppearance#getFragmentShaderSource} to get the full source. + * + * @memberof MaterialAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link MaterialAppearance} + * instance, or it is set implicitly via {@link MaterialAppearance#translucent} + * and {@link MaterialAppearance#closed}. + *

+ * + * @memberof MaterialAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When true, the geometry is expected to be closed so + * {@link MaterialAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + * + * @memberof MaterialAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The type of materials supported by this instance. This impacts the required + * {@link VertexFormat} and the complexity of the vertex and fragment shaders. + * + * @memberof MaterialAppearance.prototype + * + * @type {MaterialAppearance.MaterialSupportType} + * @readonly + * + * @default {@link MaterialAppearance.MaterialSupport.TEXTURED} + */ + materialSupport: { + get: function() { + return this._materialSupport; + } + }, + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + * + * @memberof MaterialAppearance.prototype + * + * @type VertexFormat + * @readonly + * + * @default {@link MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat} + */ + vertexFormat: { + get: function() { + return this._vertexFormat; + } + }, + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + * + * @memberof MaterialAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + flat: { + get: function() { + return this._flat; + } + }, + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + * + * @memberof MaterialAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + faceForward: { + get: function() { + return this._faceForward; + } + } +}); +MaterialAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +MaterialAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +MaterialAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +MaterialAppearance.MaterialSupport = { + /** + * Only basic materials, which require just position and + * normal vertex attributes, are supported. + * + * @type {MaterialAppearance.MaterialSupportType} + * @constant + */ + BASIC: Object.freeze({ + vertexFormat: VertexFormat.POSITION_AND_NORMAL, + vertexShaderSource: BasicMaterialAppearanceVS, + fragmentShaderSource: BasicMaterialAppearanceFS + }), + /** + * Materials with textures, which require position, + * normal, and st vertex attributes, + * are supported. The vast majority of materials fall into this category. + * + * @type {MaterialAppearance.MaterialSupportType} + * @constant + */ + TEXTURED: Object.freeze({ + vertexFormat: VertexFormat.POSITION_NORMAL_AND_ST, + vertexShaderSource: TexturedMaterialAppearanceVS, + fragmentShaderSource: TexturedMaterialAppearanceFS + }), + /** + * All materials, including those that work in tangent space, are supported. + * This requires position, normal, st, + * tangent, and bitangent vertex attributes. + * + * @type {MaterialAppearance.MaterialSupportType} + * @constant + */ + ALL: Object.freeze({ + vertexFormat: VertexFormat.ALL, + vertexShaderSource: AllMaterialAppearanceVS, + fragmentShaderSource: AllMaterialAppearanceFS + }) +}; +const PerInstanceColorAppearanceFS = `in vec3 v_positionEC; +in vec3 v_normalEC; +in vec4 v_color; + +void main() +{ + vec3 positionToEyeEC = -v_positionEC; + + vec3 normalEC = normalize(v_normalEC); +#ifdef FACE_FORWARD + normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); +#endif + + vec4 color = czm_gammaCorrect(v_color); + + czm_materialInput materialInput; + materialInput.normalEC = normalEC; + materialInput.positionToEyeEC = positionToEyeEC; + czm_material material = czm_getDefaultMaterial(materialInput); + material.diffuse = color.rgb; + material.alpha = color.a; + + out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +} +`, PerInstanceColorAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 normal; +in vec4 color; +in float batchId; + +out vec3 v_positionEC; +out vec3 v_normalEC; +out vec4 v_color; + +void main() +{ + vec4 p = czm_computePosition(); + + v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates + v_normalEC = czm_normal * normal; // normal in eye coordinates + v_color = color; + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`, PerInstanceFlatColorAppearanceFS = `in vec4 v_color; + +void main() +{ + out_FragColor = czm_gammaCorrect(v_color); +} +`, PerInstanceFlatColorAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec4 color; +in float batchId; + +out vec4 v_color; + +void main() +{ + vec4 p = czm_computePosition(); + + v_color = color; + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`; +function PerInstanceColorAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.translucent, !0), n = defaultValue(e.closed, !1), i = defaultValue(e.flat, !1), r = i ? PerInstanceFlatColorAppearanceVS : PerInstanceColorAppearanceVS, o = i ? PerInstanceFlatColorAppearanceFS : PerInstanceColorAppearanceFS, s = i ? PerInstanceColorAppearance.FLAT_VERTEX_FORMAT : PerInstanceColorAppearance.VERTEX_FORMAT; + this.material = void 0, this.translucent = t, this._vertexShaderSource = defaultValue(e.vertexShaderSource, r), this._fragmentShaderSource = defaultValue(e.fragmentShaderSource, o), this._renderState = Appearance.getDefaultRenderState( + t, + n, + e.renderState + ), this._closed = n, this._vertexFormat = s, this._flat = i, this._faceForward = defaultValue(e.faceForward, !n); +} +Object.defineProperties(PerInstanceColorAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PerInstanceColorAppearance} + * instance, or it is set implicitly via {@link PerInstanceColorAppearance#translucent} + * and {@link PerInstanceColorAppearance#closed}. + *

+ * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When true, the geometry is expected to be closed so + * {@link PerInstanceColorAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type VertexFormat + * @readonly + */ + vertexFormat: { + get: function() { + return this._vertexFormat; + } + }, + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + flat: { + get: function() { + return this._flat; + } + }, + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + * + * @memberof PerInstanceColorAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + faceForward: { + get: function() { + return this._faceForward; + } + } +}); +PerInstanceColorAppearance.VERTEX_FORMAT = VertexFormat.POSITION_AND_NORMAL; +PerInstanceColorAppearance.FLAT_VERTEX_FORMAT = VertexFormat.POSITION_ONLY; +PerInstanceColorAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +PerInstanceColorAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +PerInstanceColorAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +function ColorMaterialProperty(e) { + this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this.color = e; +} +Object.defineProperties(ColorMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof ColorMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof ColorMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the {@link Color} {@link Property}. + * @memberof ColorMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color") +}); +ColorMaterialProperty.prototype.getType = function(e) { + return "Color"; +}; +const timeScratch$r = new JulianDate(); +ColorMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$r)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + Color.WHITE, + t.color + ), t; +}; +ColorMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof ColorMaterialProperty && // + Property.equals(this._color, e._color); +}; +function GeographicTilingScheme(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this._rectangle = defaultValue(e.rectangle, Rectangle.MAX_VALUE), this._projection = new GeographicProjection(this._ellipsoid), this._numberOfLevelZeroTilesX = defaultValue( + e.numberOfLevelZeroTilesX, + 2 + ), this._numberOfLevelZeroTilesY = defaultValue( + e.numberOfLevelZeroTilesY, + 1 + ); +} +Object.defineProperties(GeographicTilingScheme.prototype, { + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {Rectangle} + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the map projection used by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {MapProjection} + */ + projection: { + get: function() { + return this._projection; + } + } +}); +GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function(e) { + return this._numberOfLevelZeroTilesX << e; +}; +GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function(e) { + return this._numberOfLevelZeroTilesY << e; +}; +GeographicTilingScheme.prototype.rectangleToNativeRectangle = function(e, t) { + const n = CesiumMath.toDegrees(e.west), i = CesiumMath.toDegrees(e.south), r = CesiumMath.toDegrees(e.east), o = CesiumMath.toDegrees(e.north); + return defined(t) ? (t.west = n, t.south = i, t.east = r, t.north = o, t) : new Rectangle(n, i, r, o); +}; +GeographicTilingScheme.prototype.tileXYToNativeRectangle = function(e, t, n, i) { + const r = this.tileXYToRectangle(e, t, n, i); + return r.west = CesiumMath.toDegrees(r.west), r.south = CesiumMath.toDegrees(r.south), r.east = CesiumMath.toDegrees(r.east), r.north = CesiumMath.toDegrees(r.north), r; +}; +GeographicTilingScheme.prototype.tileXYToRectangle = function(e, t, n, i) { + const r = this._rectangle, o = this.getNumberOfXTilesAtLevel(n), s = this.getNumberOfYTilesAtLevel(n), c = r.width / o, l = e * c + r.west, d = (e + 1) * c + r.west, f = r.height / s, h = r.north - t * f, p = r.north - (t + 1) * f; + return defined(i) || (i = new Rectangle(l, p, d, h)), i.west = l, i.south = p, i.east = d, i.north = h, i; +}; +GeographicTilingScheme.prototype.positionToTileXY = function(e, t, n) { + const i = this._rectangle; + if (!Rectangle.contains(i, e)) + return; + const r = this.getNumberOfXTilesAtLevel(t), o = this.getNumberOfYTilesAtLevel(t), s = i.width / r, c = i.height / o; + let l = e.longitude; + i.east < i.west && (l += CesiumMath.TWO_PI); + let d = (l - i.west) / s | 0; + d >= r && (d = r - 1); + let f = (i.north - e.latitude) / c | 0; + return f >= o && (f = o - 1), defined(n) ? (n.x = d, n.y = f, n) : new Cartesian2(d, f); +}; +const scratchDiagonalCartesianNE = new Cartesian3(), scratchDiagonalCartesianSW = new Cartesian3(), scratchDiagonalCartographic = new Cartographic(), scratchCenterCartesian = new Cartesian3(), scratchSurfaceCartesian = new Cartesian3(), scratchBoundingSphere$5 = new BoundingSphere(), tilingScheme = new GeographicTilingScheme(), scratchCorners$1 = [ + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic() +], scratchTileXY = new Cartesian2(), ApproximateTerrainHeights = {}; +ApproximateTerrainHeights.initialize = function() { + let e = ApproximateTerrainHeights._initPromise; + return defined(e) || (e = Resource.fetchJson( + buildModuleUrl("Assets/approximateTerrainHeights.json") + ).then(function(t) { + ApproximateTerrainHeights._terrainHeights = t; + }), ApproximateTerrainHeights._initPromise = e), e; +}; +ApproximateTerrainHeights.getMinimumMaximumHeights = function(e, t) { + t = defaultValue(t, Ellipsoid.default); + const n = getTileXYLevel(e); + let i = ApproximateTerrainHeights._defaultMinTerrainHeight, r = ApproximateTerrainHeights._defaultMaxTerrainHeight; + if (defined(n)) { + const o = `${n.level}-${n.x}-${n.y}`, s = ApproximateTerrainHeights._terrainHeights[o]; + defined(s) && (i = s[0], r = s[1]), t.cartographicToCartesian( + Rectangle.northeast(e, scratchDiagonalCartographic), + scratchDiagonalCartesianNE + ), t.cartographicToCartesian( + Rectangle.southwest(e, scratchDiagonalCartographic), + scratchDiagonalCartesianSW + ), Cartesian3.midpoint( + scratchDiagonalCartesianSW, + scratchDiagonalCartesianNE, + scratchCenterCartesian + ); + const c = t.scaleToGeodeticSurface( + scratchCenterCartesian, + scratchSurfaceCartesian + ); + if (defined(c)) { + const l = Cartesian3.distance( + scratchCenterCartesian, + c + ); + i = Math.min(i, -l); + } else + i = ApproximateTerrainHeights._defaultMinTerrainHeight; + } + return i = Math.max( + ApproximateTerrainHeights._defaultMinTerrainHeight, + i + ), { + minimumTerrainHeight: i, + maximumTerrainHeight: r + }; +}; +ApproximateTerrainHeights.getBoundingSphere = function(e, t) { + t = defaultValue(t, Ellipsoid.default); + const n = getTileXYLevel(e); + let i = ApproximateTerrainHeights._defaultMaxTerrainHeight; + if (defined(n)) { + const o = `${n.level}-${n.x}-${n.y}`, s = ApproximateTerrainHeights._terrainHeights[o]; + defined(s) && (i = s[1]); + } + const r = BoundingSphere.fromRectangle3D(e, t, 0); + return BoundingSphere.fromRectangle3D( + e, + t, + i, + scratchBoundingSphere$5 + ), BoundingSphere.union(r, scratchBoundingSphere$5, r); +}; +function getTileXYLevel(e) { + Cartographic.fromRadians( + e.east, + e.north, + 0, + scratchCorners$1[0] + ), Cartographic.fromRadians( + e.west, + e.north, + 0, + scratchCorners$1[1] + ), Cartographic.fromRadians( + e.east, + e.south, + 0, + scratchCorners$1[2] + ), Cartographic.fromRadians( + e.west, + e.south, + 0, + scratchCorners$1[3] + ); + let t = 0, n = 0, i = 0, r = 0; + const o = ApproximateTerrainHeights._terrainHeightsMaxLevel; + let s; + for (s = 0; s <= o; ++s) { + let c = !1; + for (let l = 0; l < 4; ++l) { + const d = scratchCorners$1[l]; + if (tilingScheme.positionToTileXY(d, s, scratchTileXY), l === 0) + i = scratchTileXY.x, r = scratchTileXY.y; + else if (i !== scratchTileXY.x || r !== scratchTileXY.y) { + c = !0; + break; + } + } + if (c) + break; + t = i, n = r; + } + if (s !== 0) + return { + x: t, + y: n, + level: s > o ? o : s - 1 + }; +} +ApproximateTerrainHeights._terrainHeightsMaxLevel = 6; +ApproximateTerrainHeights._defaultMaxTerrainHeight = 9e3; +ApproximateTerrainHeights._defaultMinTerrainHeight = -1e5; +ApproximateTerrainHeights._terrainHeights = void 0; +ApproximateTerrainHeights._initPromise = void 0; +Object.defineProperties(ApproximateTerrainHeights, { + /** + * Determines if the terrain heights are initialized and ready to use. To initialize the terrain heights, + * call {@link ApproximateTerrainHeights#initialize} and wait for the returned promise to resolve. + * @type {boolean} + * @readonly + * @memberof ApproximateTerrainHeights + */ + initialized: { + get: function() { + return defined(ApproximateTerrainHeights._terrainHeights); + } + } +}); +function AxisAlignedBoundingBox(e, t, n) { + this.minimum = Cartesian3.clone(defaultValue(e, Cartesian3.ZERO)), this.maximum = Cartesian3.clone(defaultValue(t, Cartesian3.ZERO)), defined(n) ? n = Cartesian3.clone(n) : n = Cartesian3.midpoint(this.minimum, this.maximum, new Cartesian3()), this.center = n; +} +AxisAlignedBoundingBox.fromCorners = function(e, t, n) { + return defined(n) || (n = new AxisAlignedBoundingBox()), n.minimum = Cartesian3.clone(e, n.minimum), n.maximum = Cartesian3.clone(t, n.maximum), n.center = Cartesian3.midpoint(e, t, n.center), n; +}; +AxisAlignedBoundingBox.fromPoints = function(e, t) { + if (defined(t) || (t = new AxisAlignedBoundingBox()), !defined(e) || e.length === 0) + return t.minimum = Cartesian3.clone(Cartesian3.ZERO, t.minimum), t.maximum = Cartesian3.clone(Cartesian3.ZERO, t.maximum), t.center = Cartesian3.clone(Cartesian3.ZERO, t.center), t; + let n = e[0].x, i = e[0].y, r = e[0].z, o = e[0].x, s = e[0].y, c = e[0].z; + const l = e.length; + for (let h = 1; h < l; h++) { + const p = e[h], m = p.x, _ = p.y, y = p.z; + n = Math.min(m, n), o = Math.max(m, o), i = Math.min(_, i), s = Math.max(_, s), r = Math.min(y, r), c = Math.max(y, c); + } + const d = t.minimum; + d.x = n, d.y = i, d.z = r; + const f = t.maximum; + return f.x = o, f.y = s, f.z = c, t.center = Cartesian3.midpoint(d, f, t.center), t; +}; +AxisAlignedBoundingBox.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.minimum = Cartesian3.clone(e.minimum, t.minimum), t.maximum = Cartesian3.clone(e.maximum, t.maximum), t.center = Cartesian3.clone(e.center, t.center), t) : new AxisAlignedBoundingBox(e.minimum, e.maximum, e.center); +}; +AxisAlignedBoundingBox.equals = function(e, t) { + return e === t || defined(e) && defined(t) && Cartesian3.equals(e.center, t.center) && Cartesian3.equals(e.minimum, t.minimum) && Cartesian3.equals(e.maximum, t.maximum); +}; +let intersectScratch = new Cartesian3(); +AxisAlignedBoundingBox.intersectPlane = function(e, t) { + intersectScratch = Cartesian3.subtract( + e.maximum, + e.minimum, + intersectScratch + ); + const n = Cartesian3.multiplyByScalar( + intersectScratch, + 0.5, + intersectScratch + ), i = t.normal, r = n.x * Math.abs(i.x) + n.y * Math.abs(i.y) + n.z * Math.abs(i.z), o = Cartesian3.dot(e.center, i) + t.distance; + return o - r > 0 ? Intersect$1.INSIDE : o + r < 0 ? Intersect$1.OUTSIDE : Intersect$1.INTERSECTING; +}; +AxisAlignedBoundingBox.prototype.clone = function(e) { + return AxisAlignedBoundingBox.clone(this, e); +}; +AxisAlignedBoundingBox.prototype.intersectPlane = function(e) { + return AxisAlignedBoundingBox.intersectPlane(this, e); +}; +AxisAlignedBoundingBox.prototype.equals = function(e) { + return AxisAlignedBoundingBox.equals(this, e); +}; +const QuadraticRealPolynomial = {}; +QuadraticRealPolynomial.computeDiscriminant = function(e, t, n) { + return t * t - 4 * e * n; +}; +function addWithCancellationCheck$1(e, t, n) { + const i = e + t; + return CesiumMath.sign(e) !== CesiumMath.sign(t) && Math.abs(i / Math.max(Math.abs(e), Math.abs(t))) < n ? 0 : i; +} +QuadraticRealPolynomial.computeRealRoots = function(e, t, n) { + let i; + if (e === 0) + return t === 0 ? [] : [-n / t]; + if (t === 0) { + if (n === 0) + return [0, 0]; + const l = Math.abs(n), d = Math.abs(e); + if (l < d && l / d < CesiumMath.EPSILON14) + return [0, 0]; + if (l > d && d / l < CesiumMath.EPSILON14) + return []; + if (i = -n / e, i < 0) + return []; + const f = Math.sqrt(i); + return [-f, f]; + } else if (n === 0) + return i = -t / e, i < 0 ? [i, 0] : [0, i]; + const r = t * t, o = 4 * e * n, s = addWithCancellationCheck$1(r, -o, CesiumMath.EPSILON14); + if (s < 0) + return []; + const c = -0.5 * addWithCancellationCheck$1( + t, + CesiumMath.sign(t) * Math.sqrt(s), + CesiumMath.EPSILON14 + ); + return t > 0 ? [c / e, n / c] : [n / c, c / e]; +}; +const CubicRealPolynomial = {}; +CubicRealPolynomial.computeDiscriminant = function(e, t, n, i) { + const r = e * e, o = t * t, s = n * n, c = i * i; + return 18 * e * t * n * i + o * s - 27 * r * c - 4 * (e * s * n + o * t * i); +}; +function computeRealRoots(e, t, n, i) { + const r = e, o = t / 3, s = n / 3, c = i, l = r * s, d = o * c, f = o * o, h = s * s, p = r * s - f, m = r * c - o * s, _ = o * c - h, y = 4 * p * _ - m * m; + let C, T; + if (y < 0) { + let k, $, G; + f * d >= l * h ? (k = r, $ = p, G = -2 * o * p + r * m) : (k = c, $ = _, G = -c * m + 2 * s * _); + const z = -(G < 0 ? -1 : 1) * Math.abs(k) * Math.sqrt(-y); + T = -G + z; + const H = T / 2, Q = H < 0 ? -Math.pow(-H, 1 / 3) : Math.pow(H, 1 / 3), ne = T === z ? -Q : -$ / Q; + return C = $ <= 0 ? Q + ne : -G / (Q * Q + ne * ne + $), f * d >= l * h ? [(C - o) / r] : [-c / (C + s)]; + } + const x = p, b = -2 * o * p + r * m, S = _, E = -c * m + 2 * s * _, A = Math.sqrt(y), D = Math.sqrt(3) / 2; + let P = Math.abs(Math.atan2(r * A, -b) / 3); + C = 2 * Math.sqrt(-x); + let I = Math.cos(P); + T = C * I; + let M = C * (-I / 2 - D * Math.sin(P)); + const R = T + M > 2 * o ? T - o : M - o, L = r, g = R / L; + P = Math.abs(Math.atan2(c * A, -E) / 3), C = 2 * Math.sqrt(-S), I = Math.cos(P), T = C * I, M = C * (-I / 2 - D * Math.sin(P)); + const w = -c, O = T + M < 2 * s ? T + s : M + s, N = w / O, F = L * O, B = -R * O - L * w, V = R * w, U = (s * B - o * V) / (-o * B + s * F); + return g <= U ? g <= N ? U <= N ? [g, U, N] : [g, N, U] : [N, g, U] : g <= N ? [U, g, N] : U <= N ? [U, N, g] : [N, U, g]; +} +CubicRealPolynomial.computeRealRoots = function(e, t, n, i) { + let r, o; + if (e === 0) + return QuadraticRealPolynomial.computeRealRoots(t, n, i); + if (t === 0) { + if (n === 0) { + if (i === 0) + return [0, 0, 0]; + o = -i / e; + const s = o < 0 ? -Math.pow(-o, 1 / 3) : Math.pow(o, 1 / 3); + return [s, s, s]; + } else if (i === 0) + return r = QuadraticRealPolynomial.computeRealRoots(e, 0, n), r.Length === 0 ? [0] : [r[0], 0, r[1]]; + return computeRealRoots(e, 0, n, i); + } else { + if (n === 0) + return i === 0 ? (o = -t / e, o < 0 ? [o, 0, 0] : [0, 0, o]) : computeRealRoots(e, t, 0, i); + if (i === 0) + return r = QuadraticRealPolynomial.computeRealRoots(e, t, n), r.length === 0 ? [0] : r[1] <= 0 ? [r[0], r[1], 0] : r[0] >= 0 ? [0, r[0], r[1]] : [r[0], 0, r[1]]; + } + return computeRealRoots(e, t, n, i); +}; +const QuarticRealPolynomial = {}; +QuarticRealPolynomial.computeDiscriminant = function(e, t, n, i, r) { + const o = e * e, s = o * e, c = t * t, l = c * t, d = n * n, f = d * n, h = i * i, p = h * i, m = r * r, _ = m * r; + return c * d * h - 4 * l * p - 4 * e * f * h + 18 * e * t * n * p - 27 * o * h * h + 256 * s * _ + r * (18 * l * n * i - 4 * c * f + 16 * e * d * d - 80 * e * t * d * i - 6 * e * c * h + 144 * o * n * h) + m * (144 * e * c * n - 27 * c * c - 128 * o * d - 192 * o * t * i); +}; +function original(e, t, n, i) { + const r = e * e, o = t - 3 * r / 8, s = n - t * e / 2 + r * e / 8, c = i - n * e / 4 + t * r / 16 - 3 * r * r / 256, l = CubicRealPolynomial.computeRealRoots( + 1, + 2 * o, + o * o - 4 * c, + -s * s + ); + if (l.length > 0) { + const d = -e / 4, f = l[l.length - 1]; + if (Math.abs(f) < CesiumMath.EPSILON14) { + const h = QuadraticRealPolynomial.computeRealRoots(1, o, c); + if (h.length === 2) { + const p = h[0], m = h[1]; + let _; + if (p >= 0 && m >= 0) { + const y = Math.sqrt(p), C = Math.sqrt(m); + return [d - C, d - y, d + y, d + C]; + } else { + if (p >= 0 && m < 0) + return _ = Math.sqrt(p), [d - _, d + _]; + if (p < 0 && m >= 0) + return _ = Math.sqrt(m), [d - _, d + _]; + } + } + return []; + } else if (f > 0) { + const h = Math.sqrt(f), p = (o + f - s / h) / 2, m = (o + f + s / h) / 2, _ = QuadraticRealPolynomial.computeRealRoots(1, h, p), y = QuadraticRealPolynomial.computeRealRoots(1, -h, m); + return _.length !== 0 ? (_[0] += d, _[1] += d, y.length !== 0 ? (y[0] += d, y[1] += d, _[1] <= y[0] ? [_[0], _[1], y[0], y[1]] : y[1] <= _[0] ? [y[0], y[1], _[0], _[1]] : _[0] >= y[0] && _[1] <= y[1] ? [y[0], _[0], _[1], y[1]] : y[0] >= _[0] && y[1] <= _[1] ? [_[0], y[0], y[1], _[1]] : _[0] > y[0] && _[0] < y[1] ? [y[0], _[0], y[1], _[1]] : [_[0], y[0], _[1], y[1]]) : _) : y.length !== 0 ? (y[0] += d, y[1] += d, y) : []; + } + } + return []; +} +function neumark(e, t, n, i) { + const r = n * n, o = t * t, s = e * e, c = -2 * t, l = n * e + o - 4 * i, d = s * i - n * t * e + r, f = CubicRealPolynomial.computeRealRoots(1, c, l, d); + if (f.length > 0) { + const h = f[0], p = t - h, m = p * p, _ = e / 2, y = p / 2, C = m - 4 * i, T = m + 4 * Math.abs(i), x = s - 4 * h, b = s + 4 * Math.abs(h); + let S, E; + if (h < 0 || C * b < x * T) { + const L = Math.sqrt(x); + S = L / 2, E = L === 0 ? 0 : (e * y - n) / L; + } else { + const L = Math.sqrt(C); + S = L === 0 ? 0 : (e * y - n) / L, E = L / 2; + } + let A, D; + _ === 0 && S === 0 ? (A = 0, D = 0) : CesiumMath.sign(_) === CesiumMath.sign(S) ? (A = _ + S, D = h / A) : (D = _ - S, A = h / D); + let P, I; + y === 0 && E === 0 ? (P = 0, I = 0) : CesiumMath.sign(y) === CesiumMath.sign(E) ? (P = y + E, I = i / P) : (I = y - E, P = i / I); + const M = QuadraticRealPolynomial.computeRealRoots(1, A, P), R = QuadraticRealPolynomial.computeRealRoots(1, D, I); + if (M.length !== 0) + return R.length !== 0 ? M[1] <= R[0] ? [M[0], M[1], R[0], R[1]] : R[1] <= M[0] ? [R[0], R[1], M[0], M[1]] : M[0] >= R[0] && M[1] <= R[1] ? [R[0], M[0], M[1], R[1]] : R[0] >= M[0] && R[1] <= M[1] ? [M[0], R[0], R[1], M[1]] : M[0] > R[0] && M[0] < R[1] ? [R[0], M[0], R[1], M[1]] : [M[0], R[0], M[1], R[1]] : M; + if (R.length !== 0) + return R; + } + return []; +} +QuarticRealPolynomial.computeRealRoots = function(e, t, n, i, r) { + if (Math.abs(e) < CesiumMath.EPSILON15) + return CubicRealPolynomial.computeRealRoots(t, n, i, r); + const o = t / e, s = n / e, c = i / e, l = r / e; + let d = o < 0 ? 1 : 0; + switch (d += s < 0 ? d + 1 : d, d += c < 0 ? d + 1 : d, d += l < 0 ? d + 1 : d, d) { + case 0: + return original(o, s, c, l); + case 1: + return neumark(o, s, c, l); + case 2: + return neumark(o, s, c, l); + case 3: + return original(o, s, c, l); + case 4: + return original(o, s, c, l); + case 5: + return neumark(o, s, c, l); + case 6: + return original(o, s, c, l); + case 7: + return original(o, s, c, l); + case 8: + return neumark(o, s, c, l); + case 9: + return original(o, s, c, l); + case 10: + return original(o, s, c, l); + case 11: + return neumark(o, s, c, l); + case 12: + return original(o, s, c, l); + case 13: + return original(o, s, c, l); + case 14: + return original(o, s, c, l); + case 15: + return original(o, s, c, l); + default: + return; + } +}; +function Ray(e, t) { + t = Cartesian3.clone(defaultValue(t, Cartesian3.ZERO)), Cartesian3.equals(t, Cartesian3.ZERO) || Cartesian3.normalize(t, t), this.origin = Cartesian3.clone(defaultValue(e, Cartesian3.ZERO)), this.direction = t; +} +Ray.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.origin = Cartesian3.clone(e.origin), t.direction = Cartesian3.clone(e.direction), t) : new Ray(e.origin, e.direction); +}; +Ray.getPoint = function(e, t, n) { + return defined(n) || (n = new Cartesian3()), n = Cartesian3.multiplyByScalar(e.direction, t, n), Cartesian3.add(e.origin, n, n); +}; +const IntersectionTests = {}; +IntersectionTests.rayPlane = function(e, t, n) { + defined(n) || (n = new Cartesian3()); + const i = e.origin, r = e.direction, o = t.normal, s = Cartesian3.dot(o, r); + if (Math.abs(s) < CesiumMath.EPSILON15) + return; + const c = (-t.distance - Cartesian3.dot(o, i)) / s; + if (!(c < 0)) + return n = Cartesian3.multiplyByScalar(r, c, n), Cartesian3.add(i, n, n); +}; +const scratchEdge0 = new Cartesian3(), scratchEdge1 = new Cartesian3(), scratchPVec = new Cartesian3(), scratchTVec = new Cartesian3(), scratchQVec = new Cartesian3(); +IntersectionTests.rayTriangleParametric = function(e, t, n, i, r) { + r = defaultValue(r, !1); + const o = e.origin, s = e.direction, c = Cartesian3.subtract(n, t, scratchEdge0), l = Cartesian3.subtract(i, t, scratchEdge1), d = Cartesian3.cross(s, l, scratchPVec), f = Cartesian3.dot(c, d); + let h, p, m, _, y; + if (r) { + if (f < CesiumMath.EPSILON6 || (h = Cartesian3.subtract(o, t, scratchTVec), m = Cartesian3.dot(h, d), m < 0 || m > f) || (p = Cartesian3.cross(h, c, scratchQVec), _ = Cartesian3.dot(s, p), _ < 0 || m + _ > f)) + return; + y = Cartesian3.dot(l, p) / f; + } else { + if (Math.abs(f) < CesiumMath.EPSILON6) + return; + const C = 1 / f; + if (h = Cartesian3.subtract(o, t, scratchTVec), m = Cartesian3.dot(h, d) * C, m < 0 || m > 1 || (p = Cartesian3.cross(h, c, scratchQVec), _ = Cartesian3.dot(s, p) * C, _ < 0 || m + _ > 1)) + return; + y = Cartesian3.dot(l, p) * C; + } + return y; +}; +IntersectionTests.rayTriangle = function(e, t, n, i, r, o) { + const s = IntersectionTests.rayTriangleParametric( + e, + t, + n, + i, + r + ); + if (!(!defined(s) || s < 0)) + return defined(o) || (o = new Cartesian3()), Cartesian3.multiplyByScalar(e.direction, s, o), Cartesian3.add(e.origin, o, o); +}; +const scratchLineSegmentTriangleRay = new Ray(); +IntersectionTests.lineSegmentTriangle = function(e, t, n, i, r, o, s) { + const c = scratchLineSegmentTriangleRay; + Cartesian3.clone(e, c.origin), Cartesian3.subtract(t, e, c.direction), Cartesian3.normalize(c.direction, c.direction); + const l = IntersectionTests.rayTriangleParametric( + c, + n, + i, + r, + o + ); + if (!(!defined(l) || l < 0 || l > Cartesian3.distance(e, t))) + return defined(s) || (s = new Cartesian3()), Cartesian3.multiplyByScalar(c.direction, l, s), Cartesian3.add(c.origin, s, s); +}; +function solveQuadratic(e, t, n, i) { + const r = t * t - 4 * e * n; + if (r < 0) + return; + if (r > 0) { + const s = 1 / (2 * e), c = Math.sqrt(r), l = (-t + c) * s, d = (-t - c) * s; + return l < d ? (i.root0 = l, i.root1 = d) : (i.root0 = d, i.root1 = l), i; + } + const o = -t / (2 * e); + if (o !== 0) + return i.root0 = i.root1 = o, i; +} +const raySphereRoots = { + root0: 0, + root1: 0 +}; +function raySphere(e, t, n) { + defined(n) || (n = new Interval()); + const i = e.origin, r = e.direction, o = t.center, s = t.radius * t.radius, c = Cartesian3.subtract(i, o, scratchPVec), l = Cartesian3.dot(r, r), d = 2 * Cartesian3.dot(r, c), f = Cartesian3.magnitudeSquared(c) - s, h = solveQuadratic(l, d, f, raySphereRoots); + if (defined(h)) + return n.start = h.root0, n.stop = h.root1, n; +} +IntersectionTests.raySphere = function(e, t, n) { + if (n = raySphere(e, t, n), !(!defined(n) || n.stop < 0)) + return n.start = Math.max(n.start, 0), n; +}; +const scratchLineSegmentRay = new Ray(); +IntersectionTests.lineSegmentSphere = function(e, t, n, i) { + const r = scratchLineSegmentRay; + Cartesian3.clone(e, r.origin); + const o = Cartesian3.subtract(t, e, r.direction), s = Cartesian3.magnitude(o); + if (Cartesian3.normalize(o, o), i = raySphere(r, n, i), !(!defined(i) || i.stop < 0 || i.start > s)) + return i.start = Math.max(i.start, 0), i.stop = Math.min(i.stop, s), i; +}; +const scratchQ = new Cartesian3(), scratchW$1 = new Cartesian3(); +IntersectionTests.rayEllipsoid = function(e, t) { + const n = t.oneOverRadii, i = Cartesian3.multiplyComponents(n, e.origin, scratchQ), r = Cartesian3.multiplyComponents( + n, + e.direction, + scratchW$1 + ), o = Cartesian3.magnitudeSquared(i), s = Cartesian3.dot(i, r); + let c, l, d, f, h; + if (o > 1) { + if (s >= 0) + return; + const p = s * s; + if (c = o - 1, l = Cartesian3.magnitudeSquared(r), d = l * c, p < d) + return; + if (p > d) { + f = s * s - d, h = -s + Math.sqrt(f); + const _ = h / l, y = c / h; + return _ < y ? new Interval(_, y) : { + start: y, + stop: _ + }; + } + const m = Math.sqrt(c / l); + return new Interval(m, m); + } else if (o < 1) + return c = o - 1, l = Cartesian3.magnitudeSquared(r), d = l * c, f = s * s - d, h = -s + Math.sqrt(f), new Interval(0, h / l); + if (s < 0) + return l = Cartesian3.magnitudeSquared(r), new Interval(0, -s / l); +}; +function addWithCancellationCheck(e, t, n) { + const i = e + t; + return CesiumMath.sign(e) !== CesiumMath.sign(t) && Math.abs(i / Math.max(Math.abs(e), Math.abs(t))) < n ? 0 : i; +} +IntersectionTests.quadraticVectorExpression = function(e, t, n, i, r) { + const o = i * i, s = r * r, c = (e[Matrix3.COLUMN1ROW1] - e[Matrix3.COLUMN2ROW2]) * s, l = r * (i * addWithCancellationCheck( + e[Matrix3.COLUMN1ROW0], + e[Matrix3.COLUMN0ROW1], + CesiumMath.EPSILON15 + ) + t.y), d = e[Matrix3.COLUMN0ROW0] * o + e[Matrix3.COLUMN2ROW2] * s + i * t.x + n, f = s * addWithCancellationCheck( + e[Matrix3.COLUMN2ROW1], + e[Matrix3.COLUMN1ROW2], + CesiumMath.EPSILON15 + ), h = r * (i * addWithCancellationCheck(e[Matrix3.COLUMN2ROW0], e[Matrix3.COLUMN0ROW2]) + t.z); + let p; + const m = []; + if (h === 0 && f === 0) { + if (p = QuadraticRealPolynomial.computeRealRoots(c, l, d), p.length === 0) + return m; + const P = p[0], I = Math.sqrt(Math.max(1 - P * P, 0)); + if (m.push(new Cartesian3(i, r * P, r * -I)), m.push(new Cartesian3(i, r * P, r * I)), p.length === 2) { + const M = p[1], R = Math.sqrt(Math.max(1 - M * M, 0)); + m.push(new Cartesian3(i, r * M, r * -R)), m.push(new Cartesian3(i, r * M, r * R)); + } + return m; + } + const _ = h * h, y = f * f, C = c * c, T = h * f, x = C + y, b = 2 * (l * c + T), S = 2 * d * c + l * l - y + _, E = 2 * (d * l - T), A = d * d - _; + if (x === 0 && b === 0 && S === 0 && E === 0) + return m; + p = QuarticRealPolynomial.computeRealRoots(x, b, S, E, A); + const D = p.length; + if (D === 0) + return m; + for (let P = 0; P < D; ++P) { + const I = p[P], M = I * I, R = Math.max(1 - M, 0), L = Math.sqrt(R); + let g; + CesiumMath.sign(c) === CesiumMath.sign(d) ? g = addWithCancellationCheck( + c * M + d, + l * I, + CesiumMath.EPSILON12 + ) : CesiumMath.sign(d) === CesiumMath.sign(l * I) ? g = addWithCancellationCheck( + c * M, + l * I + d, + CesiumMath.EPSILON12 + ) : g = addWithCancellationCheck( + c * M + l * I, + d, + CesiumMath.EPSILON12 + ); + const w = addWithCancellationCheck( + f * I, + h, + CesiumMath.EPSILON15 + ), O = g * w; + O < 0 ? m.push(new Cartesian3(i, r * I, r * L)) : O > 0 ? m.push(new Cartesian3(i, r * I, r * -L)) : L !== 0 ? (m.push(new Cartesian3(i, r * I, r * -L)), m.push(new Cartesian3(i, r * I, r * L)), ++P) : m.push(new Cartesian3(i, r * I, r * L)); + } + return m; +}; +const firstAxisScratch = new Cartesian3(), secondAxisScratch = new Cartesian3(), thirdAxisScratch = new Cartesian3(), referenceScratch = new Cartesian3(), bCart = new Cartesian3(), bScratch = new Matrix3(), btScratch = new Matrix3(), diScratch = new Matrix3(), dScratch$1 = new Matrix3(), cScratch = new Matrix3(), tempMatrix = new Matrix3(), aScratch = new Matrix3(), sScratch$1 = new Cartesian3(), closestScratch = new Cartesian3(), surfPointScratch = new Cartographic(); +IntersectionTests.grazingAltitudeLocation = function(e, t) { + const n = e.origin, i = e.direction; + if (!Cartesian3.equals(n, Cartesian3.ZERO)) { + const A = t.geodeticSurfaceNormal(n, firstAxisScratch); + if (Cartesian3.dot(i, A) >= 0) + return n; + } + const r = defined(this.rayEllipsoid(e, t)), o = t.transformPositionToScaledSpace( + i, + firstAxisScratch + ), s = Cartesian3.normalize(o, o), c = Cartesian3.mostOrthogonalAxis(o, referenceScratch), l = Cartesian3.normalize( + Cartesian3.cross(c, s, secondAxisScratch), + secondAxisScratch + ), d = Cartesian3.normalize( + Cartesian3.cross(s, l, thirdAxisScratch), + thirdAxisScratch + ), f = bScratch; + f[0] = s.x, f[1] = s.y, f[2] = s.z, f[3] = l.x, f[4] = l.y, f[5] = l.z, f[6] = d.x, f[7] = d.y, f[8] = d.z; + const h = Matrix3.transpose(f, btScratch), p = Matrix3.fromScale(t.radii, diScratch), m = Matrix3.fromScale(t.oneOverRadii, dScratch$1), _ = cScratch; + _[0] = 0, _[1] = -i.z, _[2] = i.y, _[3] = i.z, _[4] = 0, _[5] = -i.x, _[6] = -i.y, _[7] = i.x, _[8] = 0; + const y = Matrix3.multiply( + Matrix3.multiply(h, m, tempMatrix), + _, + tempMatrix + ), C = Matrix3.multiply( + Matrix3.multiply(y, p, aScratch), + f, + aScratch + ), T = Matrix3.multiplyByVector(y, n, bCart), x = IntersectionTests.quadraticVectorExpression( + C, + Cartesian3.negate(T, firstAxisScratch), + 0, + 0, + 1 + ); + let b, S; + const E = x.length; + if (E > 0) { + let A = Cartesian3.clone(Cartesian3.ZERO, closestScratch), D = Number.NEGATIVE_INFINITY; + for (let I = 0; I < E; ++I) { + b = Matrix3.multiplyByVector( + p, + Matrix3.multiplyByVector(f, x[I], sScratch$1), + sScratch$1 + ); + const M = Cartesian3.normalize( + Cartesian3.subtract(b, n, referenceScratch), + referenceScratch + ), R = Cartesian3.dot(M, i); + R > D && (D = R, A = Cartesian3.clone(b, A)); + } + const P = t.cartesianToCartographic( + A, + surfPointScratch + ); + return D = CesiumMath.clamp(D, 0, 1), S = Cartesian3.magnitude( + Cartesian3.subtract(A, n, referenceScratch) + ) * Math.sqrt(1 - D * D), S = r ? -S : S, P.height = S, t.cartographicToCartesian(P, new Cartesian3()); + } +}; +const lineSegmentPlaneDifference = new Cartesian3(); +IntersectionTests.lineSegmentPlane = function(e, t, n, i) { + defined(i) || (i = new Cartesian3()); + const r = Cartesian3.subtract( + t, + e, + lineSegmentPlaneDifference + ), o = n.normal, s = Cartesian3.dot(o, r); + if (Math.abs(s) < CesiumMath.EPSILON6) + return; + const c = Cartesian3.dot(o, e), l = -(n.distance + c) / s; + if (!(l < 0 || l > 1)) + return Cartesian3.multiplyByScalar(r, l, i), Cartesian3.add(e, i, i), i; +}; +IntersectionTests.trianglePlaneIntersection = function(e, t, n, i) { + const r = i.normal, o = i.distance, s = Cartesian3.dot(r, e) + o < 0, c = Cartesian3.dot(r, t) + o < 0, l = Cartesian3.dot(r, n) + o < 0; + let d = 0; + d += s ? 1 : 0, d += c ? 1 : 0, d += l ? 1 : 0; + let f, h; + if ((d === 1 || d === 2) && (f = new Cartesian3(), h = new Cartesian3()), d === 1) { + if (s) + return IntersectionTests.lineSegmentPlane(e, t, i, f), IntersectionTests.lineSegmentPlane(e, n, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 0, + 3, + 4, + // In front + 1, + 2, + 4, + 1, + 4, + 3 + ] + }; + if (c) + return IntersectionTests.lineSegmentPlane(t, n, i, f), IntersectionTests.lineSegmentPlane(t, e, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 1, + 3, + 4, + // In front + 2, + 0, + 4, + 2, + 4, + 3 + ] + }; + if (l) + return IntersectionTests.lineSegmentPlane(n, e, i, f), IntersectionTests.lineSegmentPlane(n, t, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 2, + 3, + 4, + // In front + 0, + 1, + 4, + 0, + 4, + 3 + ] + }; + } else if (d === 2) + if (s) + if (c) { + if (!l) + return IntersectionTests.lineSegmentPlane(e, n, i, f), IntersectionTests.lineSegmentPlane(t, n, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 0, + 1, + 4, + 0, + 4, + 3, + // In front + 2, + 3, + 4 + ] + }; + } else return IntersectionTests.lineSegmentPlane(n, t, i, f), IntersectionTests.lineSegmentPlane(e, t, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 2, + 0, + 4, + 2, + 4, + 3, + // In front + 1, + 3, + 4 + ] + }; + else return IntersectionTests.lineSegmentPlane(t, e, i, f), IntersectionTests.lineSegmentPlane(n, e, i, h), { + positions: [e, t, n, f, h], + indices: [ + // Behind + 1, + 2, + 4, + 1, + 4, + 3, + // In front + 0, + 3, + 4 + ] + }; +}; +const scratchCart4 = new Cartesian4(); +function EllipsoidTangentPlane(e, t) { + t = defaultValue(t, Ellipsoid.default), e = t.scaleToGeodeticSurface(e); + const n = Transforms.eastNorthUpToFixedFrame(e, t); + this._ellipsoid = t, this._origin = e, this._xAxis = Cartesian3.fromCartesian4( + Matrix4.getColumn(n, 0, scratchCart4) + ), this._yAxis = Cartesian3.fromCartesian4( + Matrix4.getColumn(n, 1, scratchCart4) + ); + const i = Cartesian3.fromCartesian4( + Matrix4.getColumn(n, 2, scratchCart4) + ); + this._plane = Plane.fromPointNormal(e, i); +} +Object.defineProperties(EllipsoidTangentPlane.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidTangentPlane.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the origin. + * @memberof EllipsoidTangentPlane.prototype + * @type {Cartesian3} + */ + origin: { + get: function() { + return this._origin; + } + }, + /** + * Gets the plane which is tangent to the ellipsoid. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Plane} + */ + plane: { + get: function() { + return this._plane; + } + }, + /** + * Gets the local X-axis (east) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + xAxis: { + get: function() { + return this._xAxis; + } + }, + /** + * Gets the local Y-axis (north) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + yAxis: { + get: function() { + return this._yAxis; + } + }, + /** + * Gets the local Z-axis (up) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + zAxis: { + get: function() { + return this._plane.normal; + } + } +}); +const tmp = new AxisAlignedBoundingBox(); +EllipsoidTangentPlane.fromPoints = function(e, t) { + const n = AxisAlignedBoundingBox.fromPoints(e, tmp); + return new EllipsoidTangentPlane(n.center, t); +}; +const scratchProjectPointOntoPlaneRay$1 = new Ray(), scratchProjectPointOntoPlaneCartesian3$1 = new Cartesian3(); +EllipsoidTangentPlane.prototype.projectPointOntoPlane = function(e, t) { + const n = scratchProjectPointOntoPlaneRay$1; + n.origin = e, Cartesian3.normalize(e, n.direction); + let i = IntersectionTests.rayPlane( + n, + this._plane, + scratchProjectPointOntoPlaneCartesian3$1 + ); + if (defined(i) || (Cartesian3.negate(n.direction, n.direction), i = IntersectionTests.rayPlane( + n, + this._plane, + scratchProjectPointOntoPlaneCartesian3$1 + )), defined(i)) { + const r = Cartesian3.subtract( + i, + this._origin, + i + ), o = Cartesian3.dot(this._xAxis, r), s = Cartesian3.dot(this._yAxis, r); + return defined(t) ? (t.x = o, t.y = s, t) : new Cartesian2(o, s); + } +}; +EllipsoidTangentPlane.prototype.projectPointsOntoPlane = function(e, t) { + defined(t) || (t = []); + let n = 0; + const i = e.length; + for (let r = 0; r < i; r++) { + const o = this.projectPointOntoPlane(e[r], t[n]); + defined(o) && (t[n] = o, n++); + } + return t.length = n, t; +}; +EllipsoidTangentPlane.prototype.projectPointToNearestOnPlane = function(e, t) { + defined(t) || (t = new Cartesian2()); + const n = scratchProjectPointOntoPlaneRay$1; + n.origin = e, Cartesian3.clone(this._plane.normal, n.direction); + let i = IntersectionTests.rayPlane( + n, + this._plane, + scratchProjectPointOntoPlaneCartesian3$1 + ); + defined(i) || (Cartesian3.negate(n.direction, n.direction), i = IntersectionTests.rayPlane( + n, + this._plane, + scratchProjectPointOntoPlaneCartesian3$1 + )); + const r = Cartesian3.subtract( + i, + this._origin, + i + ), o = Cartesian3.dot(this._xAxis, r), s = Cartesian3.dot(this._yAxis, r); + return t.x = o, t.y = s, t; +}; +EllipsoidTangentPlane.prototype.projectPointsToNearestOnPlane = function(e, t) { + defined(t) || (t = []); + const n = e.length; + t.length = n; + for (let i = 0; i < n; i++) + t[i] = this.projectPointToNearestOnPlane(e[i], t[i]); + return t; +}; +const projectPointsOntoEllipsoidScratch = new Cartesian3(); +EllipsoidTangentPlane.prototype.projectPointOntoEllipsoid = function(e, t) { + defined(t) || (t = new Cartesian3()); + const n = this._ellipsoid, i = this._origin, r = this._xAxis, o = this._yAxis, s = projectPointsOntoEllipsoidScratch; + return Cartesian3.multiplyByScalar(r, e.x, s), t = Cartesian3.add(i, s, t), Cartesian3.multiplyByScalar(o, e.y, s), Cartesian3.add(t, s, t), n.scaleToGeocentricSurface(t, t), t; +}; +EllipsoidTangentPlane.prototype.projectPointsOntoEllipsoid = function(e, t) { + const n = e.length; + defined(t) ? t.length = n : t = new Array(n); + for (let i = 0; i < n; ++i) + t[i] = this.projectPointOntoEllipsoid(e[i], t[i]); + return t; +}; +function OrientedBoundingBox(e, t) { + this.center = Cartesian3.clone(defaultValue(e, Cartesian3.ZERO)), this.halfAxes = Matrix3.clone(defaultValue(t, Matrix3.ZERO)); +} +OrientedBoundingBox.packedLength = Cartesian3.packedLength + Matrix3.packedLength; +OrientedBoundingBox.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e.center, t, n), Matrix3.pack(e.halfAxes, t, n + Cartesian3.packedLength), t; +}; +OrientedBoundingBox.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new OrientedBoundingBox()), Cartesian3.unpack(e, t, n.center), Matrix3.unpack( + e, + t + Cartesian3.packedLength, + n.halfAxes + ), n; +}; +const scratchCartesian1$9 = new Cartesian3(), scratchCartesian2$c = new Cartesian3(), scratchCartesian3$d = new Cartesian3(), scratchCartesian4$6 = new Cartesian3(), scratchCartesian5$2 = new Cartesian3(), scratchCartesian6$1 = new Cartesian3(), scratchCovarianceResult = new Matrix3(), scratchEigenResult = { + unitary: new Matrix3(), + diagonal: new Matrix3() +}; +OrientedBoundingBox.fromPoints = function(e, t) { + if (defined(t) || (t = new OrientedBoundingBox()), !defined(e) || e.length === 0) + return t.halfAxes = Matrix3.ZERO, t.center = Cartesian3.ZERO, t; + let n; + const i = e.length, r = Cartesian3.clone(e[0], scratchCartesian1$9); + for (n = 1; n < i; n++) + Cartesian3.add(r, e[n], r); + const o = 1 / i; + Cartesian3.multiplyByScalar(r, o, r); + let s = 0, c = 0, l = 0, d = 0, f = 0, h = 0, p; + for (n = 0; n < i; n++) + p = Cartesian3.subtract(e[n], r, scratchCartesian2$c), s += p.x * p.x, c += p.x * p.y, l += p.x * p.z, d += p.y * p.y, f += p.y * p.z, h += p.z * p.z; + s *= o, c *= o, l *= o, d *= o, f *= o, h *= o; + const m = scratchCovarianceResult; + m[0] = s, m[1] = c, m[2] = l, m[3] = c, m[4] = d, m[5] = f, m[6] = l, m[7] = f, m[8] = h; + const _ = Matrix3.computeEigenDecomposition( + m, + scratchEigenResult + ), y = Matrix3.clone(_.unitary, t.halfAxes); + let C = Matrix3.getColumn(y, 0, scratchCartesian4$6), T = Matrix3.getColumn(y, 1, scratchCartesian5$2), x = Matrix3.getColumn(y, 2, scratchCartesian6$1), b = -Number.MAX_VALUE, S = -Number.MAX_VALUE, E = -Number.MAX_VALUE, A = Number.MAX_VALUE, D = Number.MAX_VALUE, P = Number.MAX_VALUE; + for (n = 0; n < i; n++) + p = e[n], b = Math.max(Cartesian3.dot(C, p), b), S = Math.max(Cartesian3.dot(T, p), S), E = Math.max(Cartesian3.dot(x, p), E), A = Math.min(Cartesian3.dot(C, p), A), D = Math.min(Cartesian3.dot(T, p), D), P = Math.min(Cartesian3.dot(x, p), P); + C = Cartesian3.multiplyByScalar(C, 0.5 * (A + b), C), T = Cartesian3.multiplyByScalar(T, 0.5 * (D + S), T), x = Cartesian3.multiplyByScalar(x, 0.5 * (P + E), x); + const I = Cartesian3.add(C, T, t.center); + Cartesian3.add(I, x, I); + const M = scratchCartesian3$d; + return M.x = b - A, M.y = S - D, M.z = E - P, Cartesian3.multiplyByScalar(M, 0.5, M), Matrix3.multiplyByScale(t.halfAxes, M, t.halfAxes), t; +}; +const scratchOffset = new Cartesian3(), scratchScale$8 = new Cartesian3(); +function fromPlaneExtents(e, t, n, i, r, o, s, c, l, d, f) { + defined(f) || (f = new OrientedBoundingBox()); + const h = f.halfAxes; + Matrix3.setColumn(h, 0, t, h), Matrix3.setColumn(h, 1, n, h), Matrix3.setColumn(h, 2, i, h); + let p = scratchOffset; + p.x = (r + o) / 2, p.y = (s + c) / 2, p.z = (l + d) / 2; + const m = scratchScale$8; + m.x = (o - r) / 2, m.y = (c - s) / 2, m.z = (d - l) / 2; + const _ = f.center; + return p = Matrix3.multiplyByVector(h, p, p), Cartesian3.add(e, p, _), Matrix3.multiplyByScale(h, m, h), f; +} +const scratchRectangleCenterCartographic = new Cartographic(), scratchRectangleCenter = new Cartesian3(), scratchPerimeterCartographicNC = new Cartographic(), scratchPerimeterCartographicNW = new Cartographic(), scratchPerimeterCartographicCW = new Cartographic(), scratchPerimeterCartographicSW = new Cartographic(), scratchPerimeterCartographicSC = new Cartographic(), scratchPerimeterCartesianNC = new Cartesian3(), scratchPerimeterCartesianNW = new Cartesian3(), scratchPerimeterCartesianCW = new Cartesian3(), scratchPerimeterCartesianSW = new Cartesian3(), scratchPerimeterCartesianSC = new Cartesian3(), scratchPerimeterProjectedNC = new Cartesian2(), scratchPerimeterProjectedNW = new Cartesian2(), scratchPerimeterProjectedCW = new Cartesian2(), scratchPerimeterProjectedSW = new Cartesian2(), scratchPerimeterProjectedSC = new Cartesian2(), scratchPlaneOrigin = new Cartesian3(), scratchPlaneNormal = new Cartesian3(), scratchPlaneXAxis = new Cartesian3(), scratchHorizonCartesian = new Cartesian3(), scratchHorizonProjected = new Cartesian2(), scratchMaxY = new Cartesian3(), scratchMinY = new Cartesian3(), scratchZ = new Cartesian3(), scratchPlane$1 = new Plane(Cartesian3.UNIT_X, 0); +OrientedBoundingBox.fromRectangle = function(e, t, n, i, r) { + t = defaultValue(t, 0), n = defaultValue(n, 0), i = defaultValue(i, Ellipsoid.default); + let o, s, c, l, d, f, h; + if (e.width <= CesiumMath.PI) { + const D = Rectangle.center( + e, + scratchRectangleCenterCartographic + ), P = i.cartographicToCartesian( + D, + scratchRectangleCenter + ), I = new EllipsoidTangentPlane(P, i); + h = I.plane; + const M = D.longitude, R = e.south < 0 && e.north > 0 ? 0 : D.latitude, L = Cartographic.fromRadians( + M, + e.north, + n, + scratchPerimeterCartographicNC + ), g = Cartographic.fromRadians( + e.west, + e.north, + n, + scratchPerimeterCartographicNW + ), w = Cartographic.fromRadians( + e.west, + R, + n, + scratchPerimeterCartographicCW + ), O = Cartographic.fromRadians( + e.west, + e.south, + n, + scratchPerimeterCartographicSW + ), N = Cartographic.fromRadians( + M, + e.south, + n, + scratchPerimeterCartographicSC + ), F = i.cartographicToCartesian( + L, + scratchPerimeterCartesianNC + ); + let B = i.cartographicToCartesian( + g, + scratchPerimeterCartesianNW + ); + const V = i.cartographicToCartesian( + w, + scratchPerimeterCartesianCW + ); + let U = i.cartographicToCartesian( + O, + scratchPerimeterCartesianSW + ); + const k = i.cartographicToCartesian( + N, + scratchPerimeterCartesianSC + ), $ = I.projectPointToNearestOnPlane( + F, + scratchPerimeterProjectedNC + ), G = I.projectPointToNearestOnPlane( + B, + scratchPerimeterProjectedNW + ), q = I.projectPointToNearestOnPlane( + V, + scratchPerimeterProjectedCW + ), z = I.projectPointToNearestOnPlane( + U, + scratchPerimeterProjectedSW + ), H = I.projectPointToNearestOnPlane( + k, + scratchPerimeterProjectedSC + ); + return o = Math.min( + G.x, + q.x, + z.x + ), s = -o, l = Math.max(G.y, $.y), c = Math.min(z.y, H.y), g.height = O.height = t, B = i.cartographicToCartesian( + g, + scratchPerimeterCartesianNW + ), U = i.cartographicToCartesian( + O, + scratchPerimeterCartesianSW + ), d = Math.min( + Plane.getPointDistance(h, B), + Plane.getPointDistance(h, U) + ), f = n, fromPlaneExtents( + I.origin, + I.xAxis, + I.yAxis, + I.zAxis, + o, + s, + c, + l, + d, + f, + r + ); + } + const p = e.south > 0, m = e.north < 0, _ = p ? e.south : m ? e.north : 0, y = Rectangle.center( + e, + scratchRectangleCenterCartographic + ).longitude, C = Cartesian3.fromRadians( + y, + _, + n, + i, + scratchPlaneOrigin + ); + C.z = 0; + const x = Math.abs(C.x) < CesiumMath.EPSILON10 && Math.abs(C.y) < CesiumMath.EPSILON10 ? Cartesian3.UNIT_X : Cartesian3.normalize(C, scratchPlaneNormal), b = Cartesian3.UNIT_Z, S = Cartesian3.cross( + x, + b, + scratchPlaneXAxis + ); + h = Plane.fromPointNormal(C, x, scratchPlane$1); + const E = Cartesian3.fromRadians( + y + CesiumMath.PI_OVER_TWO, + _, + n, + i, + scratchHorizonCartesian + ); + s = Cartesian3.dot( + Plane.projectPointOntoPlane( + h, + E, + scratchHorizonProjected + ), + S + ), o = -s, l = Cartesian3.fromRadians( + 0, + e.north, + m ? t : n, + i, + scratchMaxY + ).z, c = Cartesian3.fromRadians( + 0, + e.south, + p ? t : n, + i, + scratchMinY + ).z; + const A = Cartesian3.fromRadians( + e.east, + _, + n, + i, + scratchZ + ); + return d = Plane.getPointDistance(h, A), f = 0, fromPlaneExtents( + C, + S, + b, + x, + o, + s, + c, + l, + d, + f, + r + ); +}; +OrientedBoundingBox.fromTransformation = function(e, t) { + return defined(t) || (t = new OrientedBoundingBox()), t.center = Matrix4.getTranslation(e, t.center), t.halfAxes = Matrix4.getMatrix3(e, t.halfAxes), t.halfAxes = Matrix3.multiplyByScalar( + t.halfAxes, + 0.5, + t.halfAxes + ), t; +}; +OrientedBoundingBox.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (Cartesian3.clone(e.center, t.center), Matrix3.clone(e.halfAxes, t.halfAxes), t) : new OrientedBoundingBox(e.center, e.halfAxes); +}; +OrientedBoundingBox.intersectPlane = function(e, t) { + const n = e.center, i = t.normal, r = e.halfAxes, o = i.x, s = i.y, c = i.z, l = Math.abs( + o * r[Matrix3.COLUMN0ROW0] + s * r[Matrix3.COLUMN0ROW1] + c * r[Matrix3.COLUMN0ROW2] + ) + Math.abs( + o * r[Matrix3.COLUMN1ROW0] + s * r[Matrix3.COLUMN1ROW1] + c * r[Matrix3.COLUMN1ROW2] + ) + Math.abs( + o * r[Matrix3.COLUMN2ROW0] + s * r[Matrix3.COLUMN2ROW1] + c * r[Matrix3.COLUMN2ROW2] + ), d = Cartesian3.dot(i, n) + t.distance; + return d <= -l ? Intersect$1.OUTSIDE : d >= l ? Intersect$1.INSIDE : Intersect$1.INTERSECTING; +}; +const scratchCartesianU = new Cartesian3(), scratchCartesianV = new Cartesian3(), scratchCartesianW = new Cartesian3(), scratchValidAxis2 = new Cartesian3(), scratchValidAxis3 = new Cartesian3(), scratchPPrime = new Cartesian3(); +OrientedBoundingBox.distanceSquaredTo = function(e, t) { + const n = Cartesian3.subtract(t, e.center, scratchOffset), i = e.halfAxes; + let r = Matrix3.getColumn(i, 0, scratchCartesianU), o = Matrix3.getColumn(i, 1, scratchCartesianV), s = Matrix3.getColumn(i, 2, scratchCartesianW); + const c = Cartesian3.magnitude(r), l = Cartesian3.magnitude(o), d = Cartesian3.magnitude(s); + let f = !0, h = !0, p = !0; + c > 0 ? Cartesian3.divideByScalar(r, c, r) : f = !1, l > 0 ? Cartesian3.divideByScalar(o, l, o) : h = !1, d > 0 ? Cartesian3.divideByScalar(s, d, s) : p = !1; + const m = !f + !h + !p; + let _, y, C; + if (m === 1) { + let S = r; + _ = o, y = s, h ? p || (S = s, y = r) : (S = o, _ = r), C = Cartesian3.cross(_, y, scratchValidAxis3), S === r ? r = C : S === o ? o = C : S === s && (s = C); + } else if (m === 2) { + _ = r, h ? _ = o : p && (_ = s); + let S = Cartesian3.UNIT_Y; + S.equalsEpsilon(_, CesiumMath.EPSILON3) && (S = Cartesian3.UNIT_X), y = Cartesian3.cross(_, S, scratchValidAxis2), Cartesian3.normalize(y, y), C = Cartesian3.cross(_, y, scratchValidAxis3), Cartesian3.normalize(C, C), _ === r ? (o = y, s = C) : _ === o ? (s = y, r = C) : _ === s && (r = y, o = C); + } else m === 3 && (r = Cartesian3.UNIT_X, o = Cartesian3.UNIT_Y, s = Cartesian3.UNIT_Z); + const T = scratchPPrime; + T.x = Cartesian3.dot(n, r), T.y = Cartesian3.dot(n, o), T.z = Cartesian3.dot(n, s); + let x = 0, b; + return T.x < -c ? (b = T.x + c, x += b * b) : T.x > c && (b = T.x - c, x += b * b), T.y < -l ? (b = T.y + l, x += b * b) : T.y > l && (b = T.y - l, x += b * b), T.z < -d ? (b = T.z + d, x += b * b) : T.z > d && (b = T.z - d, x += b * b), x; +}; +const scratchCorner = new Cartesian3(), scratchToCenter$1 = new Cartesian3(); +OrientedBoundingBox.computePlaneDistances = function(e, t, n, i) { + defined(i) || (i = new Interval()); + let r = Number.POSITIVE_INFINITY, o = Number.NEGATIVE_INFINITY; + const s = e.center, c = e.halfAxes, l = Matrix3.getColumn(c, 0, scratchCartesianU), d = Matrix3.getColumn(c, 1, scratchCartesianV), f = Matrix3.getColumn(c, 2, scratchCartesianW), h = Cartesian3.add(l, d, scratchCorner); + Cartesian3.add(h, f, h), Cartesian3.add(h, s, h); + const p = Cartesian3.subtract(h, t, scratchToCenter$1); + let m = Cartesian3.dot(n, p); + return r = Math.min(m, r), o = Math.max(m, o), Cartesian3.add(s, l, h), Cartesian3.add(h, d, h), Cartesian3.subtract(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.add(s, l, h), Cartesian3.subtract(h, d, h), Cartesian3.add(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.add(s, l, h), Cartesian3.subtract(h, d, h), Cartesian3.subtract(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.subtract(s, l, h), Cartesian3.add(h, d, h), Cartesian3.add(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.subtract(s, l, h), Cartesian3.add(h, d, h), Cartesian3.subtract(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.subtract(s, l, h), Cartesian3.subtract(h, d, h), Cartesian3.add(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), Cartesian3.subtract(s, l, h), Cartesian3.subtract(h, d, h), Cartesian3.subtract(h, f, h), Cartesian3.subtract(h, t, p), m = Cartesian3.dot(n, p), r = Math.min(m, r), o = Math.max(m, o), i.start = r, i.stop = o, i; +}; +const scratchXAxis$1 = new Cartesian3(), scratchYAxis$1 = new Cartesian3(), scratchZAxis$1 = new Cartesian3(); +OrientedBoundingBox.computeCorners = function(e, t) { + defined(t) || (t = [ + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3() + ]); + const n = e.center, i = e.halfAxes, r = Matrix3.getColumn(i, 0, scratchXAxis$1), o = Matrix3.getColumn(i, 1, scratchYAxis$1), s = Matrix3.getColumn(i, 2, scratchZAxis$1); + return Cartesian3.clone(n, t[0]), Cartesian3.subtract(t[0], r, t[0]), Cartesian3.subtract(t[0], o, t[0]), Cartesian3.subtract(t[0], s, t[0]), Cartesian3.clone(n, t[1]), Cartesian3.subtract(t[1], r, t[1]), Cartesian3.subtract(t[1], o, t[1]), Cartesian3.add(t[1], s, t[1]), Cartesian3.clone(n, t[2]), Cartesian3.subtract(t[2], r, t[2]), Cartesian3.add(t[2], o, t[2]), Cartesian3.subtract(t[2], s, t[2]), Cartesian3.clone(n, t[3]), Cartesian3.subtract(t[3], r, t[3]), Cartesian3.add(t[3], o, t[3]), Cartesian3.add(t[3], s, t[3]), Cartesian3.clone(n, t[4]), Cartesian3.add(t[4], r, t[4]), Cartesian3.subtract(t[4], o, t[4]), Cartesian3.subtract(t[4], s, t[4]), Cartesian3.clone(n, t[5]), Cartesian3.add(t[5], r, t[5]), Cartesian3.subtract(t[5], o, t[5]), Cartesian3.add(t[5], s, t[5]), Cartesian3.clone(n, t[6]), Cartesian3.add(t[6], r, t[6]), Cartesian3.add(t[6], o, t[6]), Cartesian3.subtract(t[6], s, t[6]), Cartesian3.clone(n, t[7]), Cartesian3.add(t[7], r, t[7]), Cartesian3.add(t[7], o, t[7]), Cartesian3.add(t[7], s, t[7]), t; +}; +const scratchRotationScale$2 = new Matrix3(); +OrientedBoundingBox.computeTransformation = function(e, t) { + defined(t) || (t = new Matrix4()); + const n = e.center, i = Matrix3.multiplyByUniformScale( + e.halfAxes, + 2, + scratchRotationScale$2 + ); + return Matrix4.fromRotationTranslation(i, n, t); +}; +const scratchBoundingSphere$4 = new BoundingSphere(); +OrientedBoundingBox.isOccluded = function(e, t) { + const n = BoundingSphere.fromOrientedBoundingBox( + e, + scratchBoundingSphere$4 + ); + return !t.isBoundingSphereVisible(n); +}; +OrientedBoundingBox.prototype.intersectPlane = function(e) { + return OrientedBoundingBox.intersectPlane(this, e); +}; +OrientedBoundingBox.prototype.distanceSquaredTo = function(e) { + return OrientedBoundingBox.distanceSquaredTo(this, e); +}; +OrientedBoundingBox.prototype.computePlaneDistances = function(e, t, n) { + return OrientedBoundingBox.computePlaneDistances( + this, + e, + t, + n + ); +}; +OrientedBoundingBox.prototype.computeCorners = function(e) { + return OrientedBoundingBox.computeCorners(this, e); +}; +OrientedBoundingBox.prototype.computeTransformation = function(e) { + return OrientedBoundingBox.computeTransformation(this, e); +}; +OrientedBoundingBox.prototype.isOccluded = function(e) { + return OrientedBoundingBox.isOccluded(this, e); +}; +OrientedBoundingBox.equals = function(e, t) { + return e === t || defined(e) && defined(t) && Cartesian3.equals(e.center, t.center) && Matrix3.equals(e.halfAxes, t.halfAxes); +}; +OrientedBoundingBox.prototype.clone = function(e) { + return OrientedBoundingBox.clone(this, e); +}; +OrientedBoundingBox.prototype.equals = function(e) { + return OrientedBoundingBox.equals(this, e); +}; +const VerticalExaggeration = {}; +VerticalExaggeration.getHeight = function(e, t, n) { + return (e - n) * t + n; +}; +const scratchCartographic$j = new Cartographic(); +VerticalExaggeration.getPosition = function(e, t, n, i, r) { + const o = t.cartesianToCartographic( + e, + scratchCartographic$j + ); + if (!defined(o)) + return Cartesian3.clone(e, r); + const s = VerticalExaggeration.getHeight( + o.height, + n, + i + ); + return Cartesian3.fromRadians( + o.longitude, + o.latitude, + s, + t, + r + ); +}; +const ShadowVolumeAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in float batchId; + +#ifdef EXTRUDED_GEOMETRY +in vec3 extrudeDirection; + +uniform float u_globeMinimumAltitude; +#endif // EXTRUDED_GEOMETRY + +#ifdef PER_INSTANCE_COLOR +out vec4 v_color; +#endif // PER_INSTANCE_COLOR + +#ifdef TEXTURE_COORDINATES +#ifdef SPHERICAL +out vec4 v_sphericalExtents; +#else // SPHERICAL +out vec2 v_inversePlaneExtents; +out vec4 v_westPlane; +out vec4 v_southPlane; +#endif // SPHERICAL +out vec3 v_uvMinAndSphericalLongitudeRotation; +out vec3 v_uMaxAndInverseDistance; +out vec3 v_vMaxAndInverseDistance; +#endif // TEXTURE_COORDINATES + +void main() +{ + vec4 position = czm_computePosition(); + +#ifdef EXTRUDED_GEOMETRY + float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverMeter * length(position.xyz)); + delta *= czm_sceneMode == czm_sceneMode3D ? 1.0 : 0.0; + + //extrudeDirection is zero for the top layer + position = position + vec4(extrudeDirection * delta, 0.0); +#endif + +#ifdef TEXTURE_COORDINATES +#ifdef SPHERICAL + v_sphericalExtents = czm_batchTable_sphericalExtents(batchId); + v_uvMinAndSphericalLongitudeRotation.z = czm_batchTable_longitudeRotation(batchId); +#else // SPHERICAL +#ifdef COLUMBUS_VIEW_2D + vec4 planes2D_high = czm_batchTable_planes2D_HIGH(batchId); + vec4 planes2D_low = czm_batchTable_planes2D_LOW(batchId); + + // If the primitive is split across the IDL (planes2D_high.x > planes2D_high.w): + // - If this vertex is on the east side of the IDL (position3DLow.y > 0.0, comparison with position3DHigh may produce artifacts) + // - existing "east" is on the wrong side of the world, far away (planes2D_high/low.w) + // - so set "east" as beyond the eastmost extent of the projection (idlSplitNewPlaneHiLow) + vec2 idlSplitNewPlaneHiLow = vec2(EAST_MOST_X_HIGH - (WEST_MOST_X_HIGH - planes2D_high.w), EAST_MOST_X_LOW - (WEST_MOST_X_LOW - planes2D_low.w)); + bool idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y > 0.0; + planes2D_high.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.w); + planes2D_low.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.w); + + // - else, if this vertex is on the west side of the IDL (position3DLow.y < 0.0) + // - existing "west" is on the wrong side of the world, far away (planes2D_high/low.x) + // - so set "west" as beyond the westmost extent of the projection (idlSplitNewPlaneHiLow) + idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y < 0.0; + idlSplitNewPlaneHiLow = vec2(WEST_MOST_X_HIGH - (EAST_MOST_X_HIGH - planes2D_high.x), WEST_MOST_X_LOW - (EAST_MOST_X_LOW - planes2D_low.x)); + planes2D_high.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.x); + planes2D_low.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.x); + + vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.xy), vec3(0.0, planes2D_low.xy))).xyz; + vec3 northWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.x, planes2D_high.z), vec3(0.0, planes2D_low.x, planes2D_low.z))).xyz; + vec3 southEastCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.w, planes2D_high.y), vec3(0.0, planes2D_low.w, planes2D_low.y))).xyz; +#else // COLUMBUS_VIEW_2D + // 3D case has smaller "plane extents," so planes encoded as a 64 bit position and 2 vec3s for distances/direction + vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(czm_batchTable_southWest_HIGH(batchId), czm_batchTable_southWest_LOW(batchId))).xyz; + vec3 northWestCorner = czm_normal * czm_batchTable_northward(batchId) + southWestCorner; + vec3 southEastCorner = czm_normal * czm_batchTable_eastward(batchId) + southWestCorner; +#endif // COLUMBUS_VIEW_2D + + vec3 eastWard = southEastCorner - southWestCorner; + float eastExtent = length(eastWard); + eastWard /= eastExtent; + + vec3 northWard = northWestCorner - southWestCorner; + float northExtent = length(northWard); + northWard /= northExtent; + + v_westPlane = vec4(eastWard, -dot(eastWard, southWestCorner)); + v_southPlane = vec4(northWard, -dot(northWard, southWestCorner)); + v_inversePlaneExtents = vec2(1.0 / eastExtent, 1.0 / northExtent); +#endif // SPHERICAL + vec4 uvMinAndExtents = czm_batchTable_uvMinAndExtents(batchId); + vec4 uMaxVmax = czm_batchTable_uMaxVmax(batchId); + + v_uMaxAndInverseDistance = vec3(uMaxVmax.xy, uvMinAndExtents.z); + v_vMaxAndInverseDistance = vec3(uMaxVmax.zw, uvMinAndExtents.w); + v_uvMinAndSphericalLongitudeRotation.xy = uvMinAndExtents.xy; +#endif // TEXTURE_COORDINATES + +#ifdef PER_INSTANCE_COLOR + v_color = czm_batchTable_color(batchId); +#endif + + gl_Position = czm_depthClamp(czm_modelViewProjectionRelativeToEye * position); +} +`, ShadowVolumeFS = `#ifdef VECTOR_TILE +uniform vec4 u_highlightColor; +#endif + +void main(void) +{ +#ifdef VECTOR_TILE + out_FragColor = czm_gammaCorrect(u_highlightColor); +#else + out_FragColor = vec4(1.0); +#endif + czm_writeDepthClamp(); +} +`, ClassificationType = { + /** + * Only terrain will be classified. + * + * @type {number} + * @constant + */ + TERRAIN: 0, + /** + * Only 3D Tiles will be classified. + * + * @type {number} + * @constant + */ + CESIUM_3D_TILE: 1, + /** + * Both terrain and 3D Tiles will be classified. + * + * @type {number} + * @constant + */ + BOTH: 2 +}; +ClassificationType.NUMBER_OF_CLASSIFICATION_TYPES = 3; +const ClassificationType$1 = Object.freeze(ClassificationType), DepthFunction = { + /** + * The depth test never passes. + * + * @type {number} + * @constant + */ + NEVER: WebGLConstants$1.NEVER, + /** + * The depth test passes if the incoming depth is less than the stored depth. + * + * @type {number} + * @constant + */ + LESS: WebGLConstants$1.LESS, + /** + * The depth test passes if the incoming depth is equal to the stored depth. + * + * @type {number} + * @constant + */ + EQUAL: WebGLConstants$1.EQUAL, + /** + * The depth test passes if the incoming depth is less than or equal to the stored depth. + * + * @type {number} + * @constant + */ + LESS_OR_EQUAL: WebGLConstants$1.LEQUAL, + /** + * The depth test passes if the incoming depth is greater than the stored depth. + * + * @type {number} + * @constant + */ + GREATER: WebGLConstants$1.GREATER, + /** + * The depth test passes if the incoming depth is not equal to the stored depth. + * + * @type {number} + * @constant + */ + NOT_EQUAL: WebGLConstants$1.NOTEQUAL, + /** + * The depth test passes if the incoming depth is greater than or equal to the stored depth. + * + * @type {number} + * @constant + */ + GREATER_OR_EQUAL: WebGLConstants$1.GEQUAL, + /** + * The depth test always passes. + * + * @type {number} + * @constant + */ + ALWAYS: WebGLConstants$1.ALWAYS +}, DepthFunction$1 = Object.freeze(DepthFunction); +function subdivideArray(e, t) { + const n = [], i = e.length; + let r = 0; + for (; r < i; ) { + const o = Math.ceil((i - r) / t--); + n.push(e.slice(r, r + o)), r += o; + } + return n; +} +function BatchTable(e, t, n) { + if (this._attributes = t, this._numberOfInstances = n, t.length === 0) + return; + const i = getDatatype(t), r = e.floatingPointTexture, o = i === PixelDatatype$1.FLOAT && !r, s = createOffsets(t, o), c = getStride(s, t, o), l = Math.floor( + ContextLimits.maximumTextureSize / c + ), d = Math.min( + n, + l + ), f = c * d, h = Math.ceil(n / d), p = 1 / f, m = p * 0.5, _ = 1 / h, y = _ * 0.5; + this._textureDimensions = new Cartesian2(f, h), this._textureStep = new Cartesian4(p, m, _, y), this._pixelDatatype = o ? PixelDatatype$1.UNSIGNED_BYTE : i, this._packFloats = o, this._offsets = s, this._stride = c, this._texture = void 0; + const C = 4 * f * h; + this._batchValues = i === PixelDatatype$1.FLOAT && !o ? new Float32Array(C) : new Uint8Array(C), this._batchValuesDirty = !1; +} +Object.defineProperties(BatchTable.prototype, { + /** + * The attribute descriptions. + * @memberOf BatchTable.prototype + * @type {Object[]} + * @readonly + */ + attributes: { + get: function() { + return this._attributes; + } + }, + /** + * The number of instances. + * @memberOf BatchTable.prototype + * @type {number} + * @readonly + */ + numberOfInstances: { + get: function() { + return this._numberOfInstances; + } + } +}); +function getDatatype(e) { + let t = !1; + const n = e.length; + for (let i = 0; i < n; ++i) + if (e[i].componentDatatype !== ComponentDatatype$1.UNSIGNED_BYTE) { + t = !0; + break; + } + return t ? PixelDatatype$1.FLOAT : PixelDatatype$1.UNSIGNED_BYTE; +} +function getAttributeType(e, t) { + const n = e[t].componentsPerAttribute; + return n === 2 ? Cartesian2 : n === 3 ? Cartesian3 : n === 4 ? Cartesian4 : Number; +} +function createOffsets(e, t) { + const n = new Array(e.length); + let i = 0; + const r = e.length; + for (let o = 0; o < r; ++o) { + const c = e[o].componentDatatype; + n[o] = i, c !== ComponentDatatype$1.UNSIGNED_BYTE && t ? i += 4 : ++i; + } + return n; +} +function getStride(e, t, n) { + const i = e.length, r = e[i - 1]; + return t[i - 1].componentDatatype !== ComponentDatatype$1.UNSIGNED_BYTE && n ? r + 4 : r + 1; +} +const scratchPackedFloatCartesian4 = new Cartesian4(); +function getPackedFloat(e, t, n) { + let i = Cartesian4.unpack(e, t, scratchPackedFloatCartesian4); + const r = Cartesian4.unpackFloat(i); + i = Cartesian4.unpack(e, t + 4, scratchPackedFloatCartesian4); + const o = Cartesian4.unpackFloat(i); + i = Cartesian4.unpack(e, t + 8, scratchPackedFloatCartesian4); + const s = Cartesian4.unpackFloat(i); + i = Cartesian4.unpack(e, t + 12, scratchPackedFloatCartesian4); + const c = Cartesian4.unpackFloat(i); + return Cartesian4.fromElements(r, o, s, c, n); +} +function setPackedAttribute(e, t, n) { + let i = Cartesian4.packFloat(e.x, scratchPackedFloatCartesian4); + Cartesian4.pack(i, t, n), i = Cartesian4.packFloat(e.y, i), Cartesian4.pack(i, t, n + 4), i = Cartesian4.packFloat(e.z, i), Cartesian4.pack(i, t, n + 8), i = Cartesian4.packFloat(e.w, i), Cartesian4.pack(i, t, n + 12); +} +const scratchGetAttributeCartesian4$1 = new Cartesian4(); +BatchTable.prototype.getBatchedAttribute = function(e, t, n) { + const i = this._attributes, r = this._offsets[t], s = 4 * this._stride * e + 4 * r; + let c; + this._packFloats && i[t].componentDatatype !== PixelDatatype$1.UNSIGNED_BYTE ? c = getPackedFloat( + this._batchValues, + s, + scratchGetAttributeCartesian4$1 + ) : c = Cartesian4.unpack( + this._batchValues, + s, + scratchGetAttributeCartesian4$1 + ); + const l = getAttributeType(i, t); + return defined(l.fromCartesian4) ? l.fromCartesian4(c, n) : defined(l.clone) ? l.clone(c, n) : c.x; +}; +const setAttributeScratchValues = [ + void 0, + void 0, + new Cartesian2(), + new Cartesian3(), + new Cartesian4() +], setAttributeScratchCartesian4 = new Cartesian4(); +BatchTable.prototype.setBatchedAttribute = function(e, t, n) { + const i = this._attributes, r = setAttributeScratchValues[i[t].componentsPerAttribute], o = this.getBatchedAttribute( + e, + t, + r + ), s = getAttributeType(this._attributes, t); + if (defined(s.equals) ? s.equals(o, n) : o === n) + return; + const l = setAttributeScratchCartesian4; + l.x = defined(n.x) ? n.x : n, l.y = defined(n.y) ? n.y : 0, l.z = defined(n.z) ? n.z : 0, l.w = defined(n.w) ? n.w : 0; + const d = this._offsets[t], h = 4 * this._stride * e + 4 * d; + this._packFloats && i[t].componentDatatype !== PixelDatatype$1.UNSIGNED_BYTE ? setPackedAttribute(l, this._batchValues, h) : Cartesian4.pack(l, this._batchValues, h), this._batchValuesDirty = !0; +}; +function createTexture$3(e, t) { + const n = e._textureDimensions; + e._texture = new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: e._pixelDatatype, + width: n.x, + height: n.y, + sampler: Sampler.NEAREST, + flipY: !1 + }); +} +function updateTexture(e) { + const t = e._textureDimensions; + e._texture.copyFrom({ + source: { + width: t.x, + height: t.y, + arrayBufferView: e._batchValues + } + }); +} +BatchTable.prototype.update = function(e) { + defined(this._texture) && !this._batchValuesDirty || this._attributes.length === 0 || (this._batchValuesDirty = !1, defined(this._texture) || createTexture$3(this, e.context), updateTexture(this)); +}; +BatchTable.prototype.getUniformMapCallback = function() { + const e = this; + return function(t) { + return e._attributes.length === 0 ? t : combine$2(t, { + batchTexture: function() { + return e._texture; + }, + batchTextureDimensions: function() { + return e._textureDimensions; + }, + batchTextureStep: function() { + return e._textureStep; + } + }); + }; +}; +function getGlslComputeSt$1(e) { + const t = e._stride; + return e._textureDimensions.y === 1 ? `uniform vec4 batchTextureStep; +vec2 computeSt(float batchId) +{ + float stepX = batchTextureStep.x; + float centerX = batchTextureStep.y; + float numberOfAttributes = float(${t}); + return vec2(centerX + (batchId * numberOfAttributes * stepX), 0.5); +} +` : `uniform vec4 batchTextureStep; +uniform vec2 batchTextureDimensions; +vec2 computeSt(float batchId) +{ + float stepX = batchTextureStep.x; + float centerX = batchTextureStep.y; + float stepY = batchTextureStep.z; + float centerY = batchTextureStep.w; + float numberOfAttributes = float(${t}); + float xId = mod(batchId * numberOfAttributes, batchTextureDimensions.x); + float yId = floor(batchId * numberOfAttributes / batchTextureDimensions.x); + return vec2(centerX + (xId * stepX), centerY + (yId * stepY)); +} +`; +} +function getComponentType(e) { + return e === 1 ? "float" : `vec${e}`; +} +function getComponentSwizzle(e) { + return e === 1 ? ".x" : e === 2 ? ".xy" : e === 3 ? ".xyz" : ""; +} +function getGlslAttributeFunction(e, t) { + const i = e._attributes[t], r = i.componentsPerAttribute, o = i.functionName, s = getComponentType(r), c = getComponentSwizzle(r), l = e._offsets[t]; + let d = `${s} ${o}(float batchId) +{ + vec2 st = computeSt(batchId); + st.x += batchTextureStep.x * float(${l}); +`; + return e._packFloats && i.componentDatatype !== PixelDatatype$1.UNSIGNED_BYTE ? d += `vec4 textureValue; +textureValue.x = czm_unpackFloat(texture(batchTexture, st)); +textureValue.y = czm_unpackFloat(texture(batchTexture, st + vec2(batchTextureStep.x, 0.0))); +textureValue.z = czm_unpackFloat(texture(batchTexture, st + vec2(batchTextureStep.x * 2.0, 0.0))); +textureValue.w = czm_unpackFloat(texture(batchTexture, st + vec2(batchTextureStep.x * 3.0, 0.0))); +` : d += ` vec4 textureValue = texture(batchTexture, st); +`, d += ` ${s} value = textureValue${c}; +`, e._pixelDatatype === PixelDatatype$1.UNSIGNED_BYTE && i.componentDatatype === ComponentDatatype$1.UNSIGNED_BYTE && !i.normalize ? d += `value *= 255.0; +` : e._pixelDatatype === PixelDatatype$1.FLOAT && i.componentDatatype === ComponentDatatype$1.UNSIGNED_BYTE && i.normalize && (d += `value /= 255.0; +`), d += ` return value; +} +`, d; +} +BatchTable.prototype.getVertexShaderCallback = function() { + const e = this._attributes; + if (e.length === 0) + return function(i) { + return i; + }; + let t = `uniform highp sampler2D batchTexture; +`; + t += `${getGlslComputeSt$1(this)} +`; + const n = e.length; + for (let i = 0; i < n; ++i) + t += getGlslAttributeFunction(this, i); + return function(i) { + const r = i.indexOf("void main"), o = i.substring(0, r), s = i.substring(r); + return `${o} +${t} +${s}`; + }; +}; +BatchTable.prototype.isDestroyed = function() { + return !1; +}; +BatchTable.prototype.destroy = function() { + return this._texture = this._texture && this._texture.destroy(), destroyObject(this); +}; +const AttributeType = { + /** + * The attribute is a single component. + * + * @type {string} + * @constant + */ + SCALAR: "SCALAR", + /** + * The attribute is a two-component vector. + * + * @type {string} + * @constant + */ + VEC2: "VEC2", + /** + * The attribute is a three-component vector. + * + * @type {string} + * @constant + */ + VEC3: "VEC3", + /** + * The attribute is a four-component vector. + * + * @type {string} + * @constant + */ + VEC4: "VEC4", + /** + * The attribute is a 2x2 matrix. + * + * @type {string} + * @constant + */ + MAT2: "MAT2", + /** + * The attribute is a 3x3 matrix. + * + * @type {string} + * @constant + */ + MAT3: "MAT3", + /** + * The attribute is a 4x4 matrix. + * + * @type {string} + * @constant + */ + MAT4: "MAT4" +}; +AttributeType.getMathType = function(e) { + switch (e) { + case AttributeType.SCALAR: + return Number; + case AttributeType.VEC2: + return Cartesian2; + case AttributeType.VEC3: + return Cartesian3; + case AttributeType.VEC4: + return Cartesian4; + case AttributeType.MAT2: + return Matrix2; + case AttributeType.MAT3: + return Matrix3; + case AttributeType.MAT4: + return Matrix4; + } +}; +AttributeType.getNumberOfComponents = function(e) { + switch (e) { + case AttributeType.SCALAR: + return 1; + case AttributeType.VEC2: + return 2; + case AttributeType.VEC3: + return 3; + case AttributeType.VEC4: + case AttributeType.MAT2: + return 4; + case AttributeType.MAT3: + return 9; + case AttributeType.MAT4: + return 16; + } +}; +AttributeType.getAttributeLocationCount = function(e) { + switch (e) { + case AttributeType.SCALAR: + case AttributeType.VEC2: + case AttributeType.VEC3: + case AttributeType.VEC4: + return 1; + case AttributeType.MAT2: + return 2; + case AttributeType.MAT3: + return 3; + case AttributeType.MAT4: + return 4; + } +}; +AttributeType.getGlslType = function(e) { + switch (e) { + case AttributeType.SCALAR: + return "float"; + case AttributeType.VEC2: + return "vec2"; + case AttributeType.VEC3: + return "vec3"; + case AttributeType.VEC4: + return "vec4"; + case AttributeType.MAT2: + return "mat2"; + case AttributeType.MAT3: + return "mat3"; + case AttributeType.MAT4: + return "mat4"; + } +}; +const AttributeType$1 = Object.freeze(AttributeType), RIGHT_SHIFT = 1 / 256, LEFT_SHIFT = 256, AttributeCompression = {}; +AttributeCompression.octEncodeInRange = function(e, t, n) { + if (n.x = e.x / (Math.abs(e.x) + Math.abs(e.y) + Math.abs(e.z)), n.y = e.y / (Math.abs(e.x) + Math.abs(e.y) + Math.abs(e.z)), e.z < 0) { + const i = n.x, r = n.y; + n.x = (1 - Math.abs(r)) * CesiumMath.signNotZero(i), n.y = (1 - Math.abs(i)) * CesiumMath.signNotZero(r); + } + return n.x = CesiumMath.toSNorm(n.x, t), n.y = CesiumMath.toSNorm(n.y, t), n; +}; +AttributeCompression.octEncode = function(e, t) { + return AttributeCompression.octEncodeInRange(e, 255, t); +}; +const octEncodeScratch = new Cartesian2(), uint8ForceArray = new Uint8Array(1); +function forceUint8(e) { + return uint8ForceArray[0] = e, uint8ForceArray[0]; +} +AttributeCompression.octEncodeToCartesian4 = function(e, t) { + return AttributeCompression.octEncodeInRange(e, 65535, octEncodeScratch), t.x = forceUint8(octEncodeScratch.x * RIGHT_SHIFT), t.y = forceUint8(octEncodeScratch.x), t.z = forceUint8(octEncodeScratch.y * RIGHT_SHIFT), t.w = forceUint8(octEncodeScratch.y), t; +}; +AttributeCompression.octDecodeInRange = function(e, t, n, i) { + if (i.x = CesiumMath.fromSNorm(e, n), i.y = CesiumMath.fromSNorm(t, n), i.z = 1 - (Math.abs(i.x) + Math.abs(i.y)), i.z < 0) { + const r = i.x; + i.x = (1 - Math.abs(i.y)) * CesiumMath.signNotZero(r), i.y = (1 - Math.abs(r)) * CesiumMath.signNotZero(i.y); + } + return Cartesian3.normalize(i, i); +}; +AttributeCompression.octDecode = function(e, t, n) { + return AttributeCompression.octDecodeInRange(e, t, 255, n); +}; +AttributeCompression.octDecodeFromCartesian4 = function(e, t) { + const n = e.x, i = e.y, r = e.z, o = e.w, s = n * LEFT_SHIFT + i, c = r * LEFT_SHIFT + o; + return AttributeCompression.octDecodeInRange(s, c, 65535, t); +}; +AttributeCompression.octPackFloat = function(e) { + return 256 * e.x + e.y; +}; +const scratchEncodeCart2 = new Cartesian2(); +AttributeCompression.octEncodeFloat = function(e) { + return AttributeCompression.octEncode(e, scratchEncodeCart2), AttributeCompression.octPackFloat(scratchEncodeCart2); +}; +AttributeCompression.octDecodeFloat = function(e, t) { + const n = e / 256, i = Math.floor(n), r = (n - i) * 256; + return AttributeCompression.octDecode(i, r, t); +}; +AttributeCompression.octPack = function(e, t, n, i) { + const r = AttributeCompression.octEncodeFloat(e), o = AttributeCompression.octEncodeFloat(t), s = AttributeCompression.octEncode(n, scratchEncodeCart2); + return i.x = 65536 * s.x + r, i.y = 65536 * s.y + o, i; +}; +AttributeCompression.octUnpack = function(e, t, n, i) { + let r = e.x / 65536; + const o = Math.floor(r), s = (r - o) * 65536; + r = e.y / 65536; + const c = Math.floor(r), l = (r - c) * 65536; + AttributeCompression.octDecodeFloat(s, t), AttributeCompression.octDecodeFloat(l, n), AttributeCompression.octDecode(o, c, i); +}; +AttributeCompression.compressTextureCoordinates = function(e) { + const t = e.x * 4095 | 0, n = e.y * 4095 | 0; + return 4096 * t + n; +}; +AttributeCompression.decompressTextureCoordinates = function(e, t) { + const n = e / 4096, i = Math.floor(n); + return t.x = i / 4095, t.y = (e - i * 4096) / 4095, t; +}; +function zigZagDecode(e) { + return e >> 1 ^ -(e & 1); +} +AttributeCompression.zigZagDeltaDecode = function(e, t, n) { + const i = e.length; + let r = 0, o = 0, s = 0; + for (let c = 0; c < i; ++c) + r += zigZagDecode(e[c]), o += zigZagDecode(t[c]), e[c] = r, t[c] = o, defined(n) && (s += zigZagDecode(n[c]), n[c] = s); +}; +AttributeCompression.dequantize = function(e, t, n, i) { + const r = AttributeType$1.getNumberOfComponents(n); + let o; + switch (t) { + case ComponentDatatype$1.BYTE: + o = 127; + break; + case ComponentDatatype$1.UNSIGNED_BYTE: + o = 255; + break; + case ComponentDatatype$1.SHORT: + o = 32767; + break; + case ComponentDatatype$1.UNSIGNED_SHORT: + o = 65535; + break; + case ComponentDatatype$1.INT: + o = 2147483647; + break; + case ComponentDatatype$1.UNSIGNED_INT: + o = 4294967295; + break; + } + const s = new Float32Array( + i * r + ); + for (let c = 0; c < i; c++) + for (let l = 0; l < r; l++) { + const d = c * r + l; + s[d] = Math.max( + e[d] / o, + -1 + ); + } + return s; +}; +AttributeCompression.decodeRGB565 = function(e, t) { + const n = e.length; + defined(t) || (t = new Float32Array(n * 3)); + const i = 31, r = 63, o = 1 / 31, s = 1 / 63; + for (let c = 0; c < n; c++) { + const l = e[c], d = l >> 11, f = l >> 5 & r, h = l & i, p = 3 * c; + t[p] = d * o, t[p + 1] = f * s, t[p + 2] = h * o; + } + return t; +}; +const scratchCartesian1$8 = new Cartesian3(), scratchCartesian2$b = new Cartesian3(), scratchCartesian3$c = new Cartesian3(); +function barycentricCoordinates(e, t, n, i, r) { + defined(r) || (r = new Cartesian3()); + let o, s, c, l, d, f, h, p; + if (defined(t.z)) { + if (Cartesian3.equalsEpsilon(e, t, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_X, r); + if (Cartesian3.equalsEpsilon(e, n, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_Y, r); + if (Cartesian3.equalsEpsilon(e, i, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_Z, r); + o = Cartesian3.subtract(n, t, scratchCartesian1$8), s = Cartesian3.subtract(i, t, scratchCartesian2$b), c = Cartesian3.subtract(e, t, scratchCartesian3$c), l = Cartesian3.dot(o, o), d = Cartesian3.dot(o, s), f = Cartesian3.dot(o, c), h = Cartesian3.dot(s, s), p = Cartesian3.dot(s, c); + } else { + if (Cartesian2.equalsEpsilon(e, t, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_X, r); + if (Cartesian2.equalsEpsilon(e, n, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_Y, r); + if (Cartesian2.equalsEpsilon(e, i, CesiumMath.EPSILON14)) + return Cartesian3.clone(Cartesian3.UNIT_Z, r); + o = Cartesian2.subtract(n, t, scratchCartesian1$8), s = Cartesian2.subtract(i, t, scratchCartesian2$b), c = Cartesian2.subtract(e, t, scratchCartesian3$c), l = Cartesian2.dot(o, o), d = Cartesian2.dot(o, s), f = Cartesian2.dot(o, c), h = Cartesian2.dot(s, s), p = Cartesian2.dot(s, c); + } + r.y = h * f - d * p, r.z = l * p - d * f; + const m = l * h - d * d; + if (m !== 0) + return r.y /= m, r.z /= m, r.x = 1 - r.y - r.z, r; +} +const Tipsify = {}; +Tipsify.calculateACMR = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.indices; + let n = e.maximumIndex; + const i = defaultValue(e.cacheSize, 24), r = t.length; + if (!defined(n)) { + n = 0; + let c = 0, l = t[c]; + for (; c < r; ) + l > n && (n = l), ++c, l = t[c]; + } + const o = []; + for (let c = 0; c < n + 1; c++) + o[c] = 0; + let s = i + 1; + for (let c = 0; c < r; ++c) + s - o[t[c]] > i && (o[t[c]] = s, ++s); + return (s - i + 1) / (r / 3); +}; +Tipsify.tipsify = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.indices, n = e.maximumIndex, i = defaultValue(e.cacheSize, 24); + let r; + function o(R, L, g, w) { + for (; L.length >= 1; ) { + const O = L[L.length - 1]; + if (L.splice(L.length - 1, 1), R[O].numLiveTriangles > 0) + return O; + } + for (; r < w; ) { + if (R[r].numLiveTriangles > 0) + return ++r, r - 1; + ++r; + } + return -1; + } + function s(R, L, g, w, O, N, F) { + let B = -1, V, U = -1, k = 0; + for (; k < g.length; ) { + const $ = g[k]; + w[$].numLiveTriangles && (V = 0, O - w[$].timeStamp + 2 * w[$].numLiveTriangles <= L && (V = O - w[$].timeStamp), (V > U || U === -1) && (U = V, B = $)), ++k; + } + return B === -1 ? o(w, N, R, F) : B; + } + const c = t.length; + let l = 0, d = 0, f = t[d]; + const h = c; + if (defined(n)) + l = n + 1; + else { + for (; d < h; ) + f > l && (l = f), ++d, f = t[d]; + if (l === -1) + return 0; + ++l; + } + const p = []; + let m; + for (m = 0; m < l; m++) + p[m] = { + numLiveTriangles: 0, + timeStamp: 0, + vertexTriangles: [] + }; + d = 0; + let _ = 0; + for (; d < h; ) + p[t[d]].vertexTriangles.push(_), ++p[t[d]].numLiveTriangles, p[t[d + 1]].vertexTriangles.push(_), ++p[t[d + 1]].numLiveTriangles, p[t[d + 2]].vertexTriangles.push(_), ++p[t[d + 2]].numLiveTriangles, ++_, d += 3; + let y = 0, C = i + 1; + r = 1; + let T = []; + const x = []; + let b, S, E = 0; + const A = [], D = c / 3, P = []; + for (m = 0; m < D; m++) + P[m] = !1; + let I, M; + for (; y !== -1; ) { + T = [], S = p[y], M = S.vertexTriangles.length; + for (let R = 0; R < M; ++R) + if (_ = S.vertexTriangles[R], !P[_]) { + P[_] = !0, d = _ + _ + _; + for (let L = 0; L < 3; ++L) + I = t[d], T.push(I), x.push(I), A[E] = I, ++E, b = p[I], --b.numLiveTriangles, C - b.timeStamp > i && (b.timeStamp = C, ++C), ++d; + } + y = s( + t, + i, + T, + p, + C, + x, + l + ); + } + return A; +}; +const GeometryPipeline = {}; +function addTriangle(e, t, n, i, r) { + e[t++] = n, e[t++] = i, e[t++] = i, e[t++] = r, e[t++] = r, e[t] = n; +} +function trianglesToLines(e) { + const t = e.length, n = t / 3 * 6, i = IndexDatatype$1.createTypedArray(t, n); + let r = 0; + for (let o = 0; o < t; o += 3, r += 6) + addTriangle(i, r, e[o], e[o + 1], e[o + 2]); + return i; +} +function triangleStripToLines(e) { + const t = e.length; + if (t >= 3) { + const n = (t - 2) * 6, i = IndexDatatype$1.createTypedArray(t, n); + addTriangle(i, 0, e[0], e[1], e[2]); + let r = 6; + for (let o = 3; o < t; ++o, r += 6) + addTriangle( + i, + r, + e[o - 1], + e[o], + e[o - 2] + ); + return i; + } + return new Uint16Array(); +} +function triangleFanToLines(e) { + if (e.length > 0) { + const t = e.length - 1, n = (t - 1) * 6, i = IndexDatatype$1.createTypedArray(t, n), r = e[0]; + let o = 0; + for (let s = 1; s < t; ++s, o += 6) + addTriangle(i, o, r, e[s], e[s + 1]); + return i; + } + return new Uint16Array(); +} +GeometryPipeline.toWireframe = function(e) { + const t = e.indices; + if (defined(t)) { + switch (e.primitiveType) { + case PrimitiveType$1.TRIANGLES: + e.indices = trianglesToLines(t); + break; + case PrimitiveType$1.TRIANGLE_STRIP: + e.indices = triangleStripToLines(t); + break; + case PrimitiveType$1.TRIANGLE_FAN: + e.indices = triangleFanToLines(t); + break; + } + e.primitiveType = PrimitiveType$1.LINES; + } + return e; +}; +GeometryPipeline.createLineSegmentsForVectors = function(e, t, n) { + t = defaultValue(t, "normal"), n = defaultValue(n, 1e4); + const i = e.attributes.position.values, r = e.attributes[t].values, o = i.length, s = new Float64Array(2 * o); + let c = 0; + for (let f = 0; f < o; f += 3) + s[c++] = i[f], s[c++] = i[f + 1], s[c++] = i[f + 2], s[c++] = i[f] + r[f] * n, s[c++] = i[f + 1] + r[f + 1] * n, s[c++] = i[f + 2] + r[f + 2] * n; + let l; + const d = e.boundingSphere; + return defined(d) && (l = new BoundingSphere(d.center, d.radius + n)), new Geometry({ + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: s + }) + }, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: l + }); +}; +GeometryPipeline.createAttributeLocations = function(e) { + const t = [ + "position", + "positionHigh", + "positionLow", + // From VertexFormat.position - after 2D projection and high-precision encoding + "position3DHigh", + "position3DLow", + "position2DHigh", + "position2DLow", + // From Primitive + "pickColor", + // From VertexFormat + "normal", + "st", + "tangent", + "bitangent", + // For shadow volumes + "extrudeDirection", + // From compressing texture coordinates and normals + "compressedAttributes" + ], n = e.attributes, i = {}; + let r = 0, o; + const s = t.length; + for (o = 0; o < s; ++o) { + const c = t[o]; + defined(n[c]) && (i[c] = r++); + } + for (const c in n) + n.hasOwnProperty(c) && !defined(i[c]) && (i[c] = r++); + return i; +}; +GeometryPipeline.reorderForPreVertexCache = function(e) { + const t = Geometry.computeNumberOfVertices(e), n = e.indices; + if (defined(n)) { + const i = new Int32Array(t); + for (let p = 0; p < t; p++) + i[p] = -1; + const r = n, o = r.length, s = IndexDatatype$1.createTypedArray(t, o); + let c = 0, l = 0, d = 0, f; + for (; c < o; ) + f = i[r[c]], f !== -1 ? s[l] = f : (f = r[c], i[f] = d, s[l] = d, ++d), ++c, ++l; + e.indices = s; + const h = e.attributes; + for (const p in h) + if (h.hasOwnProperty(p) && defined(h[p]) && defined(h[p].values)) { + const m = h[p], _ = m.values; + let y = 0; + const C = m.componentsPerAttribute, T = ComponentDatatype$1.createTypedArray( + m.componentDatatype, + d * C + ); + for (; y < t; ) { + const x = i[y]; + if (x !== -1) + for (let b = 0; b < C; b++) + T[C * x + b] = _[C * y + b]; + ++y; + } + m.values = T; + } + } + return e; +}; +GeometryPipeline.reorderForPostVertexCache = function(e, t) { + const n = e.indices; + if (e.primitiveType === PrimitiveType$1.TRIANGLES && defined(n)) { + const i = n.length; + let r = 0; + for (let o = 0; o < i; o++) + n[o] > r && (r = n[o]); + e.indices = Tipsify.tipsify({ + indices: n, + maximumIndex: r, + cacheSize: t + }); + } + return e; +}; +function copyAttributesDescriptions(e) { + const t = {}; + for (const n in e) + if (e.hasOwnProperty(n) && defined(e[n]) && defined(e[n].values)) { + const i = e[n]; + t[n] = new GeometryAttribute({ + componentDatatype: i.componentDatatype, + componentsPerAttribute: i.componentsPerAttribute, + normalize: i.normalize, + values: [] + }); + } + return t; +} +function copyVertex(e, t, n) { + for (const i in t) + if (t.hasOwnProperty(i) && defined(t[i]) && defined(t[i].values)) { + const r = t[i]; + for (let o = 0; o < r.componentsPerAttribute; ++o) + e[i].values.push( + r.values[n * r.componentsPerAttribute + o] + ); + } +} +GeometryPipeline.fitToUnsignedShortIndices = function(e) { + const t = [], n = Geometry.computeNumberOfVertices(e); + if (defined(e.indices) && n >= CesiumMath.SIXTY_FOUR_KILOBYTES) { + let i = [], r = [], o = 0, s = copyAttributesDescriptions(e.attributes); + const c = e.indices, l = c.length; + let d; + e.primitiveType === PrimitiveType$1.TRIANGLES ? d = 3 : e.primitiveType === PrimitiveType$1.LINES ? d = 2 : e.primitiveType === PrimitiveType$1.POINTS && (d = 1); + for (let f = 0; f < l; f += d) { + for (let h = 0; h < d; ++h) { + const p = c[f + h]; + let m = i[p]; + defined(m) || (m = o++, i[p] = m, copyVertex(s, e.attributes, p)), r.push(m); + } + o + d >= CesiumMath.SIXTY_FOUR_KILOBYTES && (t.push( + new Geometry({ + attributes: s, + indices: r, + primitiveType: e.primitiveType, + boundingSphere: e.boundingSphere, + boundingSphereCV: e.boundingSphereCV + }) + ), i = [], r = [], o = 0, s = copyAttributesDescriptions(e.attributes)); + } + r.length !== 0 && t.push( + new Geometry({ + attributes: s, + indices: r, + primitiveType: e.primitiveType, + boundingSphere: e.boundingSphere, + boundingSphereCV: e.boundingSphereCV + }) + ); + } else + t.push(e); + return t; +}; +const scratchProjectTo2DCartesian3 = new Cartesian3(), scratchProjectTo2DCartographic = new Cartographic(); +GeometryPipeline.projectTo2D = function(e, t, n, i, r) { + const o = e.attributes[t]; + r = defined(r) ? r : new GeographicProjection(); + const s = r.ellipsoid, c = o.values, l = new Float64Array(c.length); + let d = 0; + for (let f = 0; f < c.length; f += 3) { + const h = Cartesian3.fromArray( + c, + f, + scratchProjectTo2DCartesian3 + ), p = s.cartesianToCartographic( + h, + scratchProjectTo2DCartographic + ), m = r.project( + p, + scratchProjectTo2DCartesian3 + ); + l[d++] = m.x, l[d++] = m.y, l[d++] = m.z; + } + return e.attributes[n] = o, e.attributes[i] = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: l + }), delete e.attributes[t], e; +}; +const encodedResult = { + high: 0, + low: 0 +}; +GeometryPipeline.encodeAttribute = function(e, t, n, i) { + const r = e.attributes[t], o = r.values, s = o.length, c = new Float32Array(s), l = new Float32Array(s); + for (let f = 0; f < s; ++f) + EncodedCartesian3.encode(o[f], encodedResult), c[f] = encodedResult.high, l[f] = encodedResult.low; + const d = r.componentsPerAttribute; + return e.attributes[n] = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: d, + values: c + }), e.attributes[i] = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: d, + values: l + }), delete e.attributes[t], e; +}; +let scratchCartesian3$b = new Cartesian3(); +function transformPoint(e, t) { + if (defined(t)) { + const n = t.values, i = n.length; + for (let r = 0; r < i; r += 3) + Cartesian3.unpack(n, r, scratchCartesian3$b), Matrix4.multiplyByPoint(e, scratchCartesian3$b, scratchCartesian3$b), Cartesian3.pack(scratchCartesian3$b, n, r); + } +} +function transformVector(e, t) { + if (defined(t)) { + const n = t.values, i = n.length; + for (let r = 0; r < i; r += 3) + Cartesian3.unpack(n, r, scratchCartesian3$b), Matrix3.multiplyByVector(e, scratchCartesian3$b, scratchCartesian3$b), scratchCartesian3$b = Cartesian3.normalize( + scratchCartesian3$b, + scratchCartesian3$b + ), Cartesian3.pack(scratchCartesian3$b, n, r); + } +} +const inverseTranspose = new Matrix4(), normalMatrix = new Matrix3(); +GeometryPipeline.transformToWorldCoordinates = function(e) { + const t = e.modelMatrix; + if (Matrix4.equals(t, Matrix4.IDENTITY)) + return e; + const n = e.geometry.attributes; + transformPoint(t, n.position), transformPoint(t, n.prevPosition), transformPoint(t, n.nextPosition), (defined(n.normal) || defined(n.tangent) || defined(n.bitangent)) && (Matrix4.inverse(t, inverseTranspose), Matrix4.transpose(inverseTranspose, inverseTranspose), Matrix4.getMatrix3(inverseTranspose, normalMatrix), transformVector(normalMatrix, n.normal), transformVector(normalMatrix, n.tangent), transformVector(normalMatrix, n.bitangent)); + const i = e.geometry.boundingSphere; + return defined(i) && (e.geometry.boundingSphere = BoundingSphere.transform( + i, + t, + i + )), e.modelMatrix = Matrix4.clone(Matrix4.IDENTITY), e; +}; +function findAttributesInAllGeometries(e, t) { + const n = e.length, i = {}, r = e[0][t].attributes; + let o; + for (o in r) + if (r.hasOwnProperty(o) && defined(r[o]) && defined(r[o].values)) { + const s = r[o]; + let c = s.values.length, l = !0; + for (let d = 1; d < n; ++d) { + const f = e[d][t].attributes[o]; + if (!defined(f) || s.componentDatatype !== f.componentDatatype || s.componentsPerAttribute !== f.componentsPerAttribute || s.normalize !== f.normalize) { + l = !1; + break; + } + c += f.values.length; + } + l && (i[o] = new GeometryAttribute({ + componentDatatype: s.componentDatatype, + componentsPerAttribute: s.componentsPerAttribute, + normalize: s.normalize, + values: ComponentDatatype$1.createTypedArray( + s.componentDatatype, + c + ) + })); + } + return i; +} +const tempScratch$1 = new Cartesian3(); +function combineGeometries(e, t) { + const n = e.length; + let i, r, o, s; + e[0].modelMatrix; + const c = defined(e[0][t].indices), l = e[0][t].primitiveType, d = findAttributesInAllGeometries(e, t); + let f, h, p; + for (i in d) + if (d.hasOwnProperty(i)) + for (f = d[i].values, s = 0, r = 0; r < n; ++r) + for (h = e[r][t].attributes[i].values, p = h.length, o = 0; o < p; ++o) + f[s++] = h[o]; + let m; + if (c) { + let T = 0; + for (r = 0; r < n; ++r) + T += e[r][t].indices.length; + const x = Geometry.computeNumberOfVertices( + new Geometry({ + attributes: d, + primitiveType: PrimitiveType$1.POINTS + }) + ), b = IndexDatatype$1.createTypedArray( + x, + T + ); + let S = 0, E = 0; + for (r = 0; r < n; ++r) { + const A = e[r][t].indices, D = A.length; + for (s = 0; s < D; ++s) + b[S++] = E + A[s]; + E += Geometry.computeNumberOfVertices(e[r][t]); + } + m = b; + } + let _ = new Cartesian3(), y = 0, C; + for (r = 0; r < n; ++r) { + if (C = e[r][t].boundingSphere, !defined(C)) { + _ = void 0; + break; + } + Cartesian3.add(C.center, _, _); + } + if (defined(_)) + for (Cartesian3.divideByScalar(_, n, _), r = 0; r < n; ++r) { + C = e[r][t].boundingSphere; + const T = Cartesian3.magnitude( + Cartesian3.subtract(C.center, _, tempScratch$1) + ) + C.radius; + T > y && (y = T); + } + return new Geometry({ + attributes: d, + indices: m, + primitiveType: l, + boundingSphere: defined(_) ? new BoundingSphere(_, y) : void 0 + }); +} +GeometryPipeline.combineInstances = function(e) { + const t = [], n = [], i = e.length; + for (let o = 0; o < i; ++o) { + const s = e[o]; + defined(s.geometry) ? t.push(s) : defined(s.westHemisphereGeometry) && defined(s.eastHemisphereGeometry) && n.push(s); + } + const r = []; + return t.length > 0 && r.push(combineGeometries(t, "geometry")), n.length > 0 && (r.push( + combineGeometries(n, "westHemisphereGeometry") + ), r.push( + combineGeometries(n, "eastHemisphereGeometry") + )), r; +}; +const normal = new Cartesian3(), v0 = new Cartesian3(), v1 = new Cartesian3(), v2 = new Cartesian3(); +GeometryPipeline.computeNormal = function(e) { + const t = e.indices, n = e.attributes, i = n.position.values, r = n.position.values.length / 3, o = t.length, s = new Array(r), c = new Array(o / 3), l = new Array(o); + let d; + for (d = 0; d < r; d++) + s[d] = { + indexOffset: 0, + count: 0, + currentCount: 0 + }; + let f = 0; + for (d = 0; d < o; d += 3) { + const _ = t[d], y = t[d + 1], C = t[d + 2], T = _ * 3, x = y * 3, b = C * 3; + v0.x = i[T], v0.y = i[T + 1], v0.z = i[T + 2], v1.x = i[x], v1.y = i[x + 1], v1.z = i[x + 2], v2.x = i[b], v2.y = i[b + 1], v2.z = i[b + 2], s[_].count++, s[y].count++, s[C].count++, Cartesian3.subtract(v1, v0, v1), Cartesian3.subtract(v2, v0, v2), c[f] = Cartesian3.cross(v1, v2, new Cartesian3()), f++; + } + let h = 0; + for (d = 0; d < r; d++) + s[d].indexOffset += h, h += s[d].count; + f = 0; + let p; + for (d = 0; d < o; d += 3) { + p = s[t[d]]; + let _ = p.indexOffset + p.currentCount; + l[_] = f, p.currentCount++, p = s[t[d + 1]], _ = p.indexOffset + p.currentCount, l[_] = f, p.currentCount++, p = s[t[d + 2]], _ = p.indexOffset + p.currentCount, l[_] = f, p.currentCount++, f++; + } + const m = new Float32Array(r * 3); + for (d = 0; d < r; d++) { + const _ = d * 3; + if (p = s[d], Cartesian3.clone(Cartesian3.ZERO, normal), p.count > 0) { + for (f = 0; f < p.count; f++) + Cartesian3.add( + normal, + c[l[p.indexOffset + f]], + normal + ); + Cartesian3.equalsEpsilon(Cartesian3.ZERO, normal, CesiumMath.EPSILON10) && Cartesian3.clone( + c[l[p.indexOffset]], + normal + ); + } + Cartesian3.equalsEpsilon(Cartesian3.ZERO, normal, CesiumMath.EPSILON10) && (normal.z = 1), Cartesian3.normalize(normal, normal), m[_] = normal.x, m[_ + 1] = normal.y, m[_ + 2] = normal.z; + } + return e.attributes.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + }), e; +}; +const normalScratch$4 = new Cartesian3(), normalScale = new Cartesian3(), tScratch = new Cartesian3(); +GeometryPipeline.computeTangentAndBitangent = function(e) { + e.attributes; + const t = e.indices, n = e.attributes.position.values, i = e.attributes.normal.values, r = e.attributes.st.values, o = e.attributes.position.values.length / 3, s = t.length, c = new Array(o * 3); + let l; + for (l = 0; l < c.length; l++) + c[l] = 0; + let d, f, h; + for (l = 0; l < s; l += 3) { + const _ = t[l], y = t[l + 1], C = t[l + 2]; + d = _ * 3, f = y * 3, h = C * 3; + const T = _ * 2, x = y * 2, b = C * 2, S = n[d], E = n[d + 1], A = n[d + 2], D = r[T], P = r[T + 1], I = r[x + 1] - P, M = r[b + 1] - P, R = 1 / ((r[x] - D) * M - (r[b] - D) * I), L = (M * (n[f] - S) - I * (n[h] - S)) * R, g = (M * (n[f + 1] - E) - I * (n[h + 1] - E)) * R, w = (M * (n[f + 2] - A) - I * (n[h + 2] - A)) * R; + c[d] += L, c[d + 1] += g, c[d + 2] += w, c[f] += L, c[f + 1] += g, c[f + 2] += w, c[h] += L, c[h + 1] += g, c[h + 2] += w; + } + const p = new Float32Array(o * 3), m = new Float32Array(o * 3); + for (l = 0; l < o; l++) { + d = l * 3, f = d + 1, h = d + 2; + const _ = Cartesian3.fromArray(i, d, normalScratch$4), y = Cartesian3.fromArray(c, d, tScratch), C = Cartesian3.dot(_, y); + Cartesian3.multiplyByScalar(_, C, normalScale), Cartesian3.normalize(Cartesian3.subtract(y, normalScale, y), y), p[d] = y.x, p[f] = y.y, p[h] = y.z, Cartesian3.normalize(Cartesian3.cross(_, y, y), y), m[d] = y.x, m[f] = y.y, m[h] = y.z; + } + return e.attributes.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: p + }), e.attributes.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + }), e; +}; +const scratchCartesian2$a = new Cartesian2(), toEncode1 = new Cartesian3(), toEncode2 = new Cartesian3(), toEncode3 = new Cartesian3(); +let encodeResult2 = new Cartesian2(); +GeometryPipeline.compressVertices = function(e) { + const t = e.attributes.extrudeDirection; + let n, i; + if (defined(t)) { + const A = t.values; + i = A.length / 3; + const D = new Float32Array(i * 2); + let P = 0; + for (n = 0; n < i; ++n) { + if (Cartesian3.fromArray(A, n * 3, toEncode1), Cartesian3.equals(toEncode1, Cartesian3.ZERO)) { + P += 2; + continue; + } + encodeResult2 = AttributeCompression.octEncodeInRange( + toEncode1, + 65535, + encodeResult2 + ), D[P++] = encodeResult2.x, D[P++] = encodeResult2.y; + } + return e.attributes.compressedAttributes = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: D + }), delete e.attributes.extrudeDirection, e; + } + const r = e.attributes.normal, o = e.attributes.st, s = defined(r), c = defined(o); + if (!s && !c) + return e; + const l = e.attributes.tangent, d = e.attributes.bitangent, f = defined(l), h = defined(d); + let p, m, _, y; + s && (p = r.values), c && (m = o.values), f && (_ = l.values), h && (y = d.values), i = (s ? p.length : m.length) / (s ? 3 : 2); + let x = i, b = c && s ? 2 : 1; + b += f || h ? 1 : 0, x *= b; + const S = new Float32Array(x); + let E = 0; + for (n = 0; n < i; ++n) { + c && (Cartesian2.fromArray(m, n * 2, scratchCartesian2$a), S[E++] = AttributeCompression.compressTextureCoordinates(scratchCartesian2$a)); + const A = n * 3; + s && defined(_) && defined(y) ? (Cartesian3.fromArray(p, A, toEncode1), Cartesian3.fromArray(_, A, toEncode2), Cartesian3.fromArray(y, A, toEncode3), AttributeCompression.octPack( + toEncode1, + toEncode2, + toEncode3, + scratchCartesian2$a + ), S[E++] = scratchCartesian2$a.x, S[E++] = scratchCartesian2$a.y) : (s && (Cartesian3.fromArray(p, A, toEncode1), S[E++] = AttributeCompression.octEncodeFloat(toEncode1)), f && (Cartesian3.fromArray(_, A, toEncode1), S[E++] = AttributeCompression.octEncodeFloat(toEncode1)), h && (Cartesian3.fromArray(y, A, toEncode1), S[E++] = AttributeCompression.octEncodeFloat(toEncode1))); + } + return e.attributes.compressedAttributes = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: b, + values: S + }), s && delete e.attributes.normal, c && delete e.attributes.st, h && delete e.attributes.bitangent, f && delete e.attributes.tangent, e; +}; +function indexTriangles(e) { + if (defined(e.indices)) + return e; + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + t + ); + for (let i = 0; i < t; ++i) + n[i] = i; + return e.indices = n, e; +} +function indexTriangleFan(e) { + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + (t - 2) * 3 + ); + n[0] = 1, n[1] = 0, n[2] = 2; + let i = 3; + for (let r = 3; r < t; ++r) + n[i++] = r - 1, n[i++] = 0, n[i++] = r; + return e.indices = n, e.primitiveType = PrimitiveType$1.TRIANGLES, e; +} +function indexTriangleStrip(e) { + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + (t - 2) * 3 + ); + n[0] = 0, n[1] = 1, n[2] = 2, t > 3 && (n[3] = 0, n[4] = 2, n[5] = 3); + let i = 6; + for (let r = 3; r < t - 1; r += 2) + n[i++] = r, n[i++] = r - 1, n[i++] = r + 1, r + 2 < t && (n[i++] = r, n[i++] = r + 1, n[i++] = r + 2); + return e.indices = n, e.primitiveType = PrimitiveType$1.TRIANGLES, e; +} +function indexLines(e) { + if (defined(e.indices)) + return e; + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + t + ); + for (let i = 0; i < t; ++i) + n[i] = i; + return e.indices = n, e; +} +function indexLineStrip(e) { + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + (t - 1) * 2 + ); + n[0] = 0, n[1] = 1; + let i = 2; + for (let r = 2; r < t; ++r) + n[i++] = r - 1, n[i++] = r; + return e.indices = n, e.primitiveType = PrimitiveType$1.LINES, e; +} +function indexLineLoop(e) { + const t = Geometry.computeNumberOfVertices(e), n = IndexDatatype$1.createTypedArray( + t, + t * 2 + ); + n[0] = 0, n[1] = 1; + let i = 2; + for (let r = 2; r < t; ++r) + n[i++] = r - 1, n[i++] = r; + return n[i++] = t - 1, n[i] = 0, e.indices = n, e.primitiveType = PrimitiveType$1.LINES, e; +} +function indexPrimitive(e) { + switch (e.primitiveType) { + case PrimitiveType$1.TRIANGLE_FAN: + return indexTriangleFan(e); + case PrimitiveType$1.TRIANGLE_STRIP: + return indexTriangleStrip(e); + case PrimitiveType$1.TRIANGLES: + return indexTriangles(e); + case PrimitiveType$1.LINE_STRIP: + return indexLineStrip(e); + case PrimitiveType$1.LINE_LOOP: + return indexLineLoop(e); + case PrimitiveType$1.LINES: + return indexLines(e); + } + return e; +} +function offsetPointFromXZPlane(e, t) { + Math.abs(e.y) < CesiumMath.EPSILON6 && (t ? e.y = -CesiumMath.EPSILON6 : e.y = CesiumMath.EPSILON6); +} +function offsetTriangleFromXZPlane(e, t, n) { + if (e.y !== 0 && t.y !== 0 && n.y !== 0) { + offsetPointFromXZPlane(e, e.y < 0), offsetPointFromXZPlane(t, t.y < 0), offsetPointFromXZPlane(n, n.y < 0); + return; + } + const i = Math.abs(e.y), r = Math.abs(t.y), o = Math.abs(n.y); + let s; + i > r ? i > o ? s = CesiumMath.sign(e.y) : s = CesiumMath.sign(n.y) : r > o ? s = CesiumMath.sign(t.y) : s = CesiumMath.sign(n.y); + const c = s < 0; + offsetPointFromXZPlane(e, c), offsetPointFromXZPlane(t, c), offsetPointFromXZPlane(n, c); +} +const c3$1 = new Cartesian3(); +function getXZIntersectionOffsetPoints(e, t, n, i) { + Cartesian3.add( + e, + Cartesian3.multiplyByScalar( + Cartesian3.subtract(t, e, c3$1), + e.y / (e.y - t.y), + c3$1 + ), + n + ), Cartesian3.clone(n, i), offsetPointFromXZPlane(n, !0), offsetPointFromXZPlane(i, !1); +} +const u1 = new Cartesian3(), u2 = new Cartesian3(), q1 = new Cartesian3(), q2 = new Cartesian3(), splitTriangleResult = { + positions: new Array(7), + indices: new Array(3 * 3) +}; +function splitTriangle(e, t, n) { + if (e.x >= 0 || t.x >= 0 || n.x >= 0) + return; + offsetTriangleFromXZPlane(e, t, n); + const i = e.y < 0, r = t.y < 0, o = n.y < 0; + let s = 0; + s += i ? 1 : 0, s += r ? 1 : 0, s += o ? 1 : 0; + const c = splitTriangleResult.indices; + s === 1 ? (c[1] = 3, c[2] = 4, c[5] = 6, c[7] = 6, c[8] = 5, i ? (getXZIntersectionOffsetPoints(e, t, u1, q1), getXZIntersectionOffsetPoints(e, n, u2, q2), c[0] = 0, c[3] = 1, c[4] = 2, c[6] = 1) : r ? (getXZIntersectionOffsetPoints(t, n, u1, q1), getXZIntersectionOffsetPoints(t, e, u2, q2), c[0] = 1, c[3] = 2, c[4] = 0, c[6] = 2) : o && (getXZIntersectionOffsetPoints(n, e, u1, q1), getXZIntersectionOffsetPoints(n, t, u2, q2), c[0] = 2, c[3] = 0, c[4] = 1, c[6] = 0)) : s === 2 && (c[2] = 4, c[4] = 4, c[5] = 3, c[7] = 5, c[8] = 6, i ? r ? o || (getXZIntersectionOffsetPoints(n, e, u1, q1), getXZIntersectionOffsetPoints(n, t, u2, q2), c[0] = 0, c[1] = 1, c[3] = 0, c[6] = 2) : (getXZIntersectionOffsetPoints(t, n, u1, q1), getXZIntersectionOffsetPoints(t, e, u2, q2), c[0] = 2, c[1] = 0, c[3] = 2, c[6] = 1) : (getXZIntersectionOffsetPoints(e, t, u1, q1), getXZIntersectionOffsetPoints(e, n, u2, q2), c[0] = 1, c[1] = 2, c[3] = 1, c[6] = 0)); + const l = splitTriangleResult.positions; + return l[0] = e, l[1] = t, l[2] = n, l.length = 3, (s === 1 || s === 2) && (l[3] = u1, l[4] = u2, l[5] = q1, l[6] = q2, l.length = 7), splitTriangleResult; +} +function updateGeometryAfterSplit(e, t) { + const n = e.attributes; + if (n.position.values.length === 0) + return; + for (const r in n) + if (n.hasOwnProperty(r) && defined(n[r]) && defined(n[r].values)) { + const o = n[r]; + o.values = ComponentDatatype$1.createTypedArray( + o.componentDatatype, + o.values + ); + } + const i = Geometry.computeNumberOfVertices(e); + return e.indices = IndexDatatype$1.createTypedArray( + i, + e.indices + ), t && (e.boundingSphere = BoundingSphere.fromVertices( + n.position.values + )), e; +} +function copyGeometryForSplit(e) { + const t = e.attributes, n = {}; + for (const i in t) + if (t.hasOwnProperty(i) && defined(t[i]) && defined(t[i].values)) { + const r = t[i]; + n[i] = new GeometryAttribute({ + componentDatatype: r.componentDatatype, + componentsPerAttribute: r.componentsPerAttribute, + normalize: r.normalize, + values: [] + }); + } + return new Geometry({ + attributes: n, + indices: [], + primitiveType: e.primitiveType + }); +} +function updateInstanceAfterSplit(e, t, n) { + const i = defined(e.geometry.boundingSphere); + t = updateGeometryAfterSplit(t, i), n = updateGeometryAfterSplit(n, i), defined(n) && !defined(t) ? e.geometry = n : !defined(n) && defined(t) ? e.geometry = t : (e.westHemisphereGeometry = t, e.eastHemisphereGeometry = n, e.geometry = void 0); +} +function generateBarycentricInterpolateFunction(e, t) { + const n = new e(), i = new e(), r = new e(); + return function(o, s, c, l, d, f, h, p) { + const m = e.fromArray( + d, + o * t, + n + ), _ = e.fromArray( + d, + s * t, + i + ), y = e.fromArray( + d, + c * t, + r + ); + e.multiplyByScalar(m, l.x, m), e.multiplyByScalar(_, l.y, _), e.multiplyByScalar(y, l.z, y); + const C = e.add(m, _, m); + e.add(C, y, C), p && e.normalize(C, C), e.pack( + C, + f, + h * t + ); + }; +} +const interpolateAndPackCartesian4 = generateBarycentricInterpolateFunction( + Cartesian4, + 4 +), interpolateAndPackCartesian3 = generateBarycentricInterpolateFunction( + Cartesian3, + 3 +), interpolateAndPackCartesian2 = generateBarycentricInterpolateFunction( + Cartesian2, + 2 +), interpolateAndPackBoolean = function(e, t, n, i, r, o, s) { + const c = r[e] * i.x, l = r[t] * i.y, d = r[n] * i.z; + o[s] = c + l + d > CesiumMath.EPSILON6 ? 1 : 0; +}, p0Scratch = new Cartesian3(), p1Scratch$2 = new Cartesian3(), p2Scratch$2 = new Cartesian3(), barycentricScratch = new Cartesian3(); +function computeTriangleAttributes(e, t, n, i, r, o, s, c, l, d, f, h, p, m, _, y) { + if (!defined(o) && !defined(s) && !defined(c) && !defined(l) && !defined(d) && m === 0) + return; + const C = Cartesian3.fromArray(r, e * 3, p0Scratch), T = Cartesian3.fromArray(r, t * 3, p1Scratch$2), x = Cartesian3.fromArray(r, n * 3, p2Scratch$2), b = barycentricCoordinates(i, C, T, x, barycentricScratch); + if (defined(b)) { + if (defined(o) && interpolateAndPackCartesian3( + e, + t, + n, + b, + o, + h.normal.values, + y, + !0 + ), defined(d)) { + const S = Cartesian3.fromArray(d, e * 3, p0Scratch), E = Cartesian3.fromArray(d, t * 3, p1Scratch$2), A = Cartesian3.fromArray(d, n * 3, p2Scratch$2); + Cartesian3.multiplyByScalar(S, b.x, S), Cartesian3.multiplyByScalar(E, b.y, E), Cartesian3.multiplyByScalar(A, b.z, A); + let D; + !Cartesian3.equals(S, Cartesian3.ZERO) || !Cartesian3.equals(E, Cartesian3.ZERO) || !Cartesian3.equals(A, Cartesian3.ZERO) ? (D = Cartesian3.add(S, E, S), Cartesian3.add(D, A, D), Cartesian3.normalize(D, D)) : (D = p0Scratch, D.x = 0, D.y = 0, D.z = 0), Cartesian3.pack( + D, + h.extrudeDirection.values, + y * 3 + ); + } + if (defined(f) && interpolateAndPackBoolean( + e, + t, + n, + b, + f, + h.applyOffset.values, + y + ), defined(s) && interpolateAndPackCartesian3( + e, + t, + n, + b, + s, + h.tangent.values, + y, + !0 + ), defined(c) && interpolateAndPackCartesian3( + e, + t, + n, + b, + c, + h.bitangent.values, + y, + !0 + ), defined(l) && interpolateAndPackCartesian2( + e, + t, + n, + b, + l, + h.st.values, + y + ), m > 0) + for (let S = 0; S < m; S++) { + const E = p[S]; + genericInterpolate( + e, + t, + n, + b, + y, + _[E], + h[E] + ); + } + } +} +function genericInterpolate(e, t, n, i, r, o, s) { + const c = o.componentsPerAttribute, l = o.values, d = s.values; + switch (c) { + case 4: + interpolateAndPackCartesian4( + e, + t, + n, + i, + l, + d, + r, + !1 + ); + break; + case 3: + interpolateAndPackCartesian3( + e, + t, + n, + i, + l, + d, + r, + !1 + ); + break; + case 2: + interpolateAndPackCartesian2( + e, + t, + n, + i, + l, + d, + r, + !1 + ); + break; + default: + d[r] = l[e] * i.x + l[t] * i.y + l[n] * i.z; + } +} +function insertSplitPoint(e, t, n, i, r, o) { + const s = e.position.values.length / 3; + if (r !== -1) { + const c = i[r], l = n[c]; + return l === -1 ? (n[c] = s, e.position.values.push(o.x, o.y, o.z), t.push(s), s) : (t.push(l), l); + } + return e.position.values.push(o.x, o.y, o.z), t.push(s), s; +} +const NAMED_ATTRIBUTES = { + position: !0, + normal: !0, + bitangent: !0, + tangent: !0, + st: !0, + extrudeDirection: !0, + applyOffset: !0 +}; +function splitLongitudeTriangles(e) { + const t = e.geometry, n = t.attributes, i = n.position.values, r = defined(n.normal) ? n.normal.values : void 0, o = defined(n.bitangent) ? n.bitangent.values : void 0, s = defined(n.tangent) ? n.tangent.values : void 0, c = defined(n.st) ? n.st.values : void 0, l = defined(n.extrudeDirection) ? n.extrudeDirection.values : void 0, d = defined(n.applyOffset) ? n.applyOffset.values : void 0, f = t.indices, h = []; + for (const D in n) + n.hasOwnProperty(D) && !NAMED_ATTRIBUTES[D] && defined(n[D]) && h.push(D); + const p = h.length, m = copyGeometryForSplit(t), _ = copyGeometryForSplit(t); + let y, C, T, x, b; + const S = []; + S.length = i.length / 3; + const E = []; + for (E.length = i.length / 3, b = 0; b < S.length; ++b) + S[b] = -1, E[b] = -1; + const A = f.length; + for (b = 0; b < A; b += 3) { + const D = f[b], P = f[b + 1], I = f[b + 2]; + let M = Cartesian3.fromArray(i, D * 3), R = Cartesian3.fromArray(i, P * 3), L = Cartesian3.fromArray(i, I * 3); + const g = splitTriangle(M, R, L); + if (defined(g) && g.positions.length > 3) { + const w = g.positions, O = g.indices, N = O.length; + for (let F = 0; F < N; ++F) { + const B = O[F], V = w[B]; + V.y < 0 ? (y = _.attributes, C = _.indices, T = S) : (y = m.attributes, C = m.indices, T = E), x = insertSplitPoint( + y, + C, + T, + f, + B < 3 ? b + B : -1, + V + ), computeTriangleAttributes( + D, + P, + I, + V, + i, + r, + s, + o, + c, + l, + d, + y, + h, + p, + n, + x + ); + } + } else + defined(g) && (M = g.positions[0], R = g.positions[1], L = g.positions[2]), M.y < 0 ? (y = _.attributes, C = _.indices, T = S) : (y = m.attributes, C = m.indices, T = E), x = insertSplitPoint( + y, + C, + T, + f, + b, + M + ), computeTriangleAttributes( + D, + P, + I, + M, + i, + r, + s, + o, + c, + l, + d, + y, + h, + p, + n, + x + ), x = insertSplitPoint( + y, + C, + T, + f, + b + 1, + R + ), computeTriangleAttributes( + D, + P, + I, + R, + i, + r, + s, + o, + c, + l, + d, + y, + h, + p, + n, + x + ), x = insertSplitPoint( + y, + C, + T, + f, + b + 2, + L + ), computeTriangleAttributes( + D, + P, + I, + L, + i, + r, + s, + o, + c, + l, + d, + y, + h, + p, + n, + x + ); + } + updateInstanceAfterSplit(e, _, m); +} +const xzPlane = Plane.fromPointNormal(Cartesian3.ZERO, Cartesian3.UNIT_Y), offsetScratch$c = new Cartesian3(), offsetPointScratch = new Cartesian3(); +function computeLineAttributes(e, t, n, i, r, o, s) { + if (!defined(s)) + return; + const c = Cartesian3.fromArray(i, e * 3, p0Scratch); + Cartesian3.equalsEpsilon(c, n, CesiumMath.EPSILON10) ? o.applyOffset.values[r] = s[e] : o.applyOffset.values[r] = s[t]; +} +function splitLongitudeLines(e) { + const t = e.geometry, n = t.attributes, i = n.position.values, r = defined(n.applyOffset) ? n.applyOffset.values : void 0, o = t.indices, s = copyGeometryForSplit(t), c = copyGeometryForSplit(t); + let l; + const d = o.length, f = []; + f.length = i.length / 3; + const h = []; + for (h.length = i.length / 3, l = 0; l < f.length; ++l) + f[l] = -1, h[l] = -1; + for (l = 0; l < d; l += 2) { + const p = o[l], m = o[l + 1], _ = Cartesian3.fromArray(i, p * 3, p0Scratch), y = Cartesian3.fromArray(i, m * 3, p1Scratch$2); + let C; + Math.abs(_.y) < CesiumMath.EPSILON6 && (_.y < 0 ? _.y = -CesiumMath.EPSILON6 : _.y = CesiumMath.EPSILON6), Math.abs(y.y) < CesiumMath.EPSILON6 && (y.y < 0 ? y.y = -CesiumMath.EPSILON6 : y.y = CesiumMath.EPSILON6); + let T = s.attributes, x = s.indices, b = h, S = c.attributes, E = c.indices, A = f; + const D = IntersectionTests.lineSegmentPlane( + _, + y, + xzPlane, + p2Scratch$2 + ); + if (defined(D)) { + const P = Cartesian3.multiplyByScalar( + Cartesian3.UNIT_Y, + 5 * CesiumMath.EPSILON9, + offsetScratch$c + ); + _.y < 0 && (Cartesian3.negate(P, P), T = c.attributes, x = c.indices, b = f, S = s.attributes, E = s.indices, A = h); + const I = Cartesian3.add( + D, + P, + offsetPointScratch + ); + C = insertSplitPoint( + T, + x, + b, + o, + l, + _ + ), computeLineAttributes( + p, + m, + _, + i, + C, + T, + r + ), C = insertSplitPoint( + T, + x, + b, + o, + -1, + I + ), computeLineAttributes( + p, + m, + I, + i, + C, + T, + r + ), Cartesian3.negate(P, P), Cartesian3.add(D, P, I), C = insertSplitPoint( + S, + E, + A, + o, + -1, + I + ), computeLineAttributes( + p, + m, + I, + i, + C, + S, + r + ), C = insertSplitPoint( + S, + E, + A, + o, + l + 1, + y + ), computeLineAttributes( + p, + m, + y, + i, + C, + S, + r + ); + } else { + let P, I, M; + _.y < 0 ? (P = c.attributes, I = c.indices, M = f) : (P = s.attributes, I = s.indices, M = h), C = insertSplitPoint( + P, + I, + M, + o, + l, + _ + ), computeLineAttributes( + p, + m, + _, + i, + C, + P, + r + ), C = insertSplitPoint( + P, + I, + M, + o, + l + 1, + y + ), computeLineAttributes( + p, + m, + y, + i, + C, + P, + r + ); + } + } + updateInstanceAfterSplit(e, c, s); +} +const cartesian2Scratch0 = new Cartesian2(), cartesian2Scratch1 = new Cartesian2(), cartesian3Scratch0 = new Cartesian3(), cartesian3Scratch2$1 = new Cartesian3(), cartesian3Scratch3$1 = new Cartesian3(), cartesian3Scratch4 = new Cartesian3(), cartesian3Scratch5 = new Cartesian3(), cartesian3Scratch6 = new Cartesian3(), cartesian4Scratch0 = new Cartesian4(); +function updateAdjacencyAfterSplit(e) { + const t = e.attributes, n = t.position.values, i = t.prevPosition.values, r = t.nextPosition.values, o = n.length; + for (let s = 0; s < o; s += 3) { + const c = Cartesian3.unpack(n, s, cartesian3Scratch0); + if (c.x > 0) + continue; + const l = Cartesian3.unpack( + i, + s, + cartesian3Scratch2$1 + ); + (c.y < 0 && l.y > 0 || c.y > 0 && l.y < 0) && (s - 3 > 0 ? (i[s] = n[s - 3], i[s + 1] = n[s - 2], i[s + 2] = n[s - 1]) : Cartesian3.pack(c, i, s)); + const d = Cartesian3.unpack( + r, + s, + cartesian3Scratch3$1 + ); + (c.y < 0 && d.y > 0 || c.y > 0 && d.y < 0) && (s + 3 < o ? (r[s] = n[s + 3], r[s + 1] = n[s + 4], r[s + 2] = n[s + 5]) : Cartesian3.pack(c, r, s)); + } +} +const offsetScalar = 5 * CesiumMath.EPSILON9, coplanarOffset = CesiumMath.EPSILON6; +function splitLongitudePolyline(e) { + const t = e.geometry, n = t.attributes, i = n.position.values, r = n.prevPosition.values, o = n.nextPosition.values, s = n.expandAndWidth.values, c = defined(n.st) ? n.st.values : void 0, l = defined(n.color) ? n.color.values : void 0, d = copyGeometryForSplit(t), f = copyGeometryForSplit(t); + let h, p, m, _ = !1; + const y = i.length / 3; + for (h = 0; h < y; h += 4) { + const C = h, T = h + 2, x = Cartesian3.fromArray(i, C * 3, cartesian3Scratch0), b = Cartesian3.fromArray(i, T * 3, cartesian3Scratch2$1); + if (Math.abs(x.y) < coplanarOffset) + for (x.y = coplanarOffset * (b.y < 0 ? -1 : 1), i[h * 3 + 1] = x.y, i[(h + 1) * 3 + 1] = x.y, p = C * 3; p < C * 3 + 4 * 3; p += 3) + r[p] = i[h * 3], r[p + 1] = i[h * 3 + 1], r[p + 2] = i[h * 3 + 2]; + if (Math.abs(b.y) < coplanarOffset) + for (b.y = coplanarOffset * (x.y < 0 ? -1 : 1), i[(h + 2) * 3 + 1] = b.y, i[(h + 3) * 3 + 1] = b.y, p = C * 3; p < C * 3 + 4 * 3; p += 3) + o[p] = i[(h + 2) * 3], o[p + 1] = i[(h + 2) * 3 + 1], o[p + 2] = i[(h + 2) * 3 + 2]; + let S = d.attributes, E = d.indices, A = f.attributes, D = f.indices; + const P = IntersectionTests.lineSegmentPlane( + x, + b, + xzPlane, + cartesian3Scratch4 + ); + if (defined(P)) { + _ = !0; + const I = Cartesian3.multiplyByScalar( + Cartesian3.UNIT_Y, + offsetScalar, + cartesian3Scratch5 + ); + x.y < 0 && (Cartesian3.negate(I, I), S = f.attributes, E = f.indices, A = d.attributes, D = d.indices); + const M = Cartesian3.add( + P, + I, + cartesian3Scratch6 + ); + S.position.values.push(x.x, x.y, x.z, x.x, x.y, x.z), S.position.values.push( + M.x, + M.y, + M.z + ), S.position.values.push( + M.x, + M.y, + M.z + ), S.prevPosition.values.push( + r[C * 3], + r[C * 3 + 1], + r[C * 3 + 2] + ), S.prevPosition.values.push( + r[C * 3 + 3], + r[C * 3 + 4], + r[C * 3 + 5] + ), S.prevPosition.values.push(x.x, x.y, x.z, x.x, x.y, x.z), S.nextPosition.values.push( + M.x, + M.y, + M.z + ), S.nextPosition.values.push( + M.x, + M.y, + M.z + ), S.nextPosition.values.push( + M.x, + M.y, + M.z + ), S.nextPosition.values.push( + M.x, + M.y, + M.z + ), Cartesian3.negate(I, I), Cartesian3.add(P, I, M), A.position.values.push( + M.x, + M.y, + M.z + ), A.position.values.push( + M.x, + M.y, + M.z + ), A.position.values.push(b.x, b.y, b.z, b.x, b.y, b.z), A.prevPosition.values.push( + M.x, + M.y, + M.z + ), A.prevPosition.values.push( + M.x, + M.y, + M.z + ), A.prevPosition.values.push( + M.x, + M.y, + M.z + ), A.prevPosition.values.push( + M.x, + M.y, + M.z + ), A.nextPosition.values.push(b.x, b.y, b.z, b.x, b.y, b.z), A.nextPosition.values.push( + o[T * 3], + o[T * 3 + 1], + o[T * 3 + 2] + ), A.nextPosition.values.push( + o[T * 3 + 3], + o[T * 3 + 4], + o[T * 3 + 5] + ); + const R = Cartesian2.fromArray( + s, + C * 2, + cartesian2Scratch0 + ), L = Math.abs(R.y); + S.expandAndWidth.values.push(-1, L, 1, L), S.expandAndWidth.values.push(-1, -L, 1, -L), A.expandAndWidth.values.push(-1, L, 1, L), A.expandAndWidth.values.push(-1, -L, 1, -L); + let g = Cartesian3.magnitudeSquared( + Cartesian3.subtract(P, x, cartesian3Scratch3$1) + ); + if (g /= Cartesian3.magnitudeSquared( + Cartesian3.subtract(b, x, cartesian3Scratch3$1) + ), defined(l)) { + const w = Cartesian4.fromArray(l, C * 4, cartesian4Scratch0), O = Cartesian4.fromArray(l, T * 4, cartesian4Scratch0), N = CesiumMath.lerp(w.x, O.x, g), F = CesiumMath.lerp(w.y, O.y, g), B = CesiumMath.lerp(w.z, O.z, g), V = CesiumMath.lerp(w.w, O.w, g); + for (p = C * 4; p < C * 4 + 2 * 4; ++p) + S.color.values.push(l[p]); + for (S.color.values.push(N, F, B, V), S.color.values.push(N, F, B, V), A.color.values.push(N, F, B, V), A.color.values.push(N, F, B, V), p = T * 4; p < T * 4 + 2 * 4; ++p) + A.color.values.push(l[p]); + } + if (defined(c)) { + const w = Cartesian2.fromArray(c, C * 2, cartesian2Scratch0), O = Cartesian2.fromArray( + c, + (h + 3) * 2, + cartesian2Scratch1 + ), N = CesiumMath.lerp(w.x, O.x, g); + for (p = C * 2; p < C * 2 + 2 * 2; ++p) + S.st.values.push(c[p]); + for (S.st.values.push(N, w.y), S.st.values.push(N, O.y), A.st.values.push(N, w.y), A.st.values.push(N, O.y), p = T * 2; p < T * 2 + 2 * 2; ++p) + A.st.values.push(c[p]); + } + m = S.position.values.length / 3 - 4, E.push(m, m + 2, m + 1), E.push(m + 1, m + 2, m + 3), m = A.position.values.length / 3 - 4, D.push(m, m + 2, m + 1), D.push(m + 1, m + 2, m + 3); + } else { + let I, M; + for (x.y < 0 ? (I = f.attributes, M = f.indices) : (I = d.attributes, M = d.indices), I.position.values.push(x.x, x.y, x.z), I.position.values.push(x.x, x.y, x.z), I.position.values.push(b.x, b.y, b.z), I.position.values.push(b.x, b.y, b.z), p = h * 3; p < h * 3 + 4 * 3; ++p) + I.prevPosition.values.push(r[p]), I.nextPosition.values.push(o[p]); + for (p = h * 2; p < h * 2 + 4 * 2; ++p) + I.expandAndWidth.values.push(s[p]), defined(c) && I.st.values.push(c[p]); + if (defined(l)) + for (p = h * 4; p < h * 4 + 4 * 4; ++p) + I.color.values.push(l[p]); + m = I.position.values.length / 3 - 4, M.push(m, m + 2, m + 1), M.push(m + 1, m + 2, m + 3); + } + } + _ && (updateAdjacencyAfterSplit(f), updateAdjacencyAfterSplit(d)), updateInstanceAfterSplit(e, f, d); +} +GeometryPipeline.splitLongitude = function(e) { + const t = e.geometry, n = t.boundingSphere; + if (defined(n) && (n.center.x - n.radius > 0 || BoundingSphere.intersectPlane(n, Plane.ORIGIN_ZX_PLANE) !== Intersect$1.INTERSECTING)) + return e; + if (t.geometryType !== GeometryType$1.NONE) + switch (t.geometryType) { + case GeometryType$1.POLYLINES: + splitLongitudePolyline(e); + break; + case GeometryType$1.TRIANGLES: + splitLongitudeTriangles(e); + break; + case GeometryType$1.LINES: + splitLongitudeLines(e); + break; + } + else + indexPrimitive(t), t.primitiveType === PrimitiveType$1.TRIANGLES ? splitLongitudeTriangles(e) : t.primitiveType === PrimitiveType$1.LINES && splitLongitudeLines(e); + return e; +}; +function WebMercatorProjection(e) { + this._ellipsoid = defaultValue(e, Ellipsoid.WGS84), this._semimajorAxis = this._ellipsoid.maximumRadius, this._oneOverSemimajorAxis = 1 / this._semimajorAxis; +} +Object.defineProperties(WebMercatorProjection.prototype, { + /** + * Gets the {@link Ellipsoid}. + * + * @memberof WebMercatorProjection.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +WebMercatorProjection.mercatorAngleToGeodeticLatitude = function(e) { + return CesiumMath.PI_OVER_TWO - 2 * Math.atan(Math.exp(-e)); +}; +WebMercatorProjection.geodeticLatitudeToMercatorAngle = function(e) { + e > WebMercatorProjection.MaximumLatitude ? e = WebMercatorProjection.MaximumLatitude : e < -WebMercatorProjection.MaximumLatitude && (e = -WebMercatorProjection.MaximumLatitude); + const t = Math.sin(e); + return 0.5 * Math.log((1 + t) / (1 - t)); +}; +WebMercatorProjection.MaximumLatitude = WebMercatorProjection.mercatorAngleToGeodeticLatitude( + Math.PI +); +WebMercatorProjection.prototype.project = function(e, t) { + const n = this._semimajorAxis, i = e.longitude * n, r = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + e.latitude + ) * n, o = e.height; + return defined(t) ? (t.x = i, t.y = r, t.z = o, t) : new Cartesian3(i, r, o); +}; +WebMercatorProjection.prototype.unproject = function(e, t) { + const n = this._oneOverSemimajorAxis, i = e.x * n, r = WebMercatorProjection.mercatorAngleToGeodeticLatitude( + e.y * n + ), o = e.z; + return defined(t) ? (t.longitude = i, t.latitude = r, t.height = o, t) : new Cartographic(i, r, o); +}; +function transformToWorldCoordinates(e, t, n) { + let i = !n; + const r = e.length; + let o; + if (!i && r > 1) { + const s = e[0].modelMatrix; + for (o = 1; o < r; ++o) + if (!Matrix4.equals(s, e[o].modelMatrix)) { + i = !0; + break; + } + } + if (i) + for (o = 0; o < r; ++o) + defined(e[o].geometry) && GeometryPipeline.transformToWorldCoordinates(e[o]); + else + Matrix4.multiplyTransformation( + t, + e[0].modelMatrix, + t + ); +} +function addGeometryBatchId(e, t) { + const n = e.attributes, i = n.position, r = i.values.length / i.componentsPerAttribute; + n.batchId = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 1, + values: new Float32Array(r) + }); + const o = n.batchId.values; + for (let s = 0; s < r; ++s) + o[s] = t; +} +function addBatchIds(e) { + const t = e.length; + for (let n = 0; n < t; ++n) { + const i = e[n]; + defined(i.geometry) ? addGeometryBatchId(i.geometry, n) : defined(i.westHemisphereGeometry) && defined(i.eastHemisphereGeometry) && (addGeometryBatchId(i.westHemisphereGeometry, n), addGeometryBatchId(i.eastHemisphereGeometry, n)); + } +} +function geometryPipeline(e) { + const t = e.instances, n = e.projection, i = e.elementIndexUintSupported, r = e.scene3DOnly, o = e.vertexCacheOptimize, s = e.compressVertices, c = e.modelMatrix; + let l, d, f = t.length; + for (l = 0; l < f; ++l) + if (defined(t[l].geometry)) { + t[l].geometry.primitiveType; + break; + } + if (transformToWorldCoordinates(t, c, r), !r) + for (l = 0; l < f; ++l) + defined(t[l].geometry) && GeometryPipeline.splitLongitude(t[l]); + if (addBatchIds(t), o) + for (l = 0; l < f; ++l) { + const p = t[l]; + defined(p.geometry) ? (GeometryPipeline.reorderForPostVertexCache(p.geometry), GeometryPipeline.reorderForPreVertexCache(p.geometry)) : defined(p.westHemisphereGeometry) && defined(p.eastHemisphereGeometry) && (GeometryPipeline.reorderForPostVertexCache( + p.westHemisphereGeometry + ), GeometryPipeline.reorderForPreVertexCache( + p.westHemisphereGeometry + ), GeometryPipeline.reorderForPostVertexCache( + p.eastHemisphereGeometry + ), GeometryPipeline.reorderForPreVertexCache( + p.eastHemisphereGeometry + )); + } + let h = GeometryPipeline.combineInstances(t); + for (f = h.length, l = 0; l < f; ++l) { + d = h[l]; + const p = d.attributes; + if (r) + for (const m in p) + p.hasOwnProperty(m) && p[m].componentDatatype === ComponentDatatype$1.DOUBLE && GeometryPipeline.encodeAttribute( + d, + m, + `${m}3DHigh`, + `${m}3DLow` + ); + else + for (const m in p) + if (p.hasOwnProperty(m) && p[m].componentDatatype === ComponentDatatype$1.DOUBLE) { + const _ = `${m}3D`, y = `${m}2D`; + GeometryPipeline.projectTo2D( + d, + m, + _, + y, + n + ), defined(d.boundingSphere) && m === "position" && (d.boundingSphereCV = BoundingSphere.fromVertices( + d.attributes.position2D.values + )), GeometryPipeline.encodeAttribute( + d, + _, + `${_}High`, + `${_}Low` + ), GeometryPipeline.encodeAttribute( + d, + y, + `${y}High`, + `${y}Low` + ); + } + s && GeometryPipeline.compressVertices(d); + } + if (!i) { + let p = []; + for (f = h.length, l = 0; l < f; ++l) + d = h[l], p = p.concat( + GeometryPipeline.fitToUnsignedShortIndices(d) + ); + h = p; + } + return h; +} +function createPickOffsets(e, t, n, i) { + let r, o, s; + const c = i.length - 1; + if (c >= 0) { + const d = i[c]; + r = d.offset + d.count, s = d.index, o = n[s].indices.length; + } else + r = 0, s = 0, o = n[s].indices.length; + const l = e.length; + for (let d = 0; d < l; ++d) { + const h = e[d][t]; + if (!defined(h)) + continue; + const p = h.indices.length; + r + p > o && (r = 0, o = n[++s].indices.length), i.push({ + index: s, + offset: r, + count: p + }), r += p; + } +} +function createInstancePickOffsets(e, t) { + const n = []; + return createPickOffsets(e, "geometry", t, n), createPickOffsets( + e, + "westHemisphereGeometry", + t, + n + ), createPickOffsets( + e, + "eastHemisphereGeometry", + t, + n + ), n; +} +const PrimitivePipeline = {}; +PrimitivePipeline.combineGeometry = function(e) { + let t, n; + const i = e.instances, r = i.length; + let o, s, c = !1; + r > 0 && (t = geometryPipeline(e), t.length > 0 && (n = GeometryPipeline.createAttributeLocations( + t[0] + ), e.createPickOffsets && (o = createInstancePickOffsets(i, t))), defined(i[0].attributes) && defined(i[0].attributes.offset) && (s = new Array(r), c = !0)); + const l = new Array(r), d = new Array(r); + for (let f = 0; f < r; ++f) { + const h = i[f], p = h.geometry; + defined(p) && (l[f] = p.boundingSphere, d[f] = p.boundingSphereCV, c && (s[f] = h.geometry.offsetAttribute)); + const m = h.eastHemisphereGeometry, _ = h.westHemisphereGeometry; + defined(m) && defined(_) && (defined(m.boundingSphere) && defined(_.boundingSphere) && (l[f] = BoundingSphere.union( + m.boundingSphere, + _.boundingSphere + )), defined(m.boundingSphereCV) && defined(_.boundingSphereCV) && (d[f] = BoundingSphere.union( + m.boundingSphereCV, + _.boundingSphereCV + ))); + } + return { + geometries: t, + modelMatrix: e.modelMatrix, + attributeLocations: n, + pickOffsets: o, + offsetInstanceExtend: s, + boundingSpheres: l, + boundingSpheresCV: d + }; +}; +function transferGeometry(e, t) { + const n = e.attributes; + for (const i in n) + if (n.hasOwnProperty(i)) { + const r = n[i]; + defined(r) && defined(r.values) && t.push(r.values.buffer); + } + defined(e.indices) && t.push(e.indices.buffer); +} +function transferGeometries(e, t) { + const n = e.length; + for (let i = 0; i < n; ++i) + transferGeometry(e[i], t); +} +function countCreateGeometryResults(e) { + let t = 1; + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i]; + if (++t, !defined(r)) + continue; + const o = r.attributes; + t += 7 + 2 * BoundingSphere.packedLength + (defined(r.indices) ? r.indices.length : 0); + for (const s in o) + if (o.hasOwnProperty(s) && defined(o[s])) { + const c = o[s]; + t += 5 + c.values.length; + } + } + return t; +} +PrimitivePipeline.packCreateGeometryResults = function(e, t) { + const n = new Float64Array(countCreateGeometryResults(e)), i = [], r = {}, o = e.length; + let s = 0; + n[s++] = o; + for (let c = 0; c < o; c++) { + const l = e[c], d = defined(l); + if (n[s++] = d ? 1 : 0, !d) + continue; + n[s++] = l.primitiveType, n[s++] = l.geometryType, n[s++] = defaultValue(l.offsetAttribute, -1); + const f = defined(l.boundingSphere) ? 1 : 0; + n[s++] = f, f && BoundingSphere.pack(l.boundingSphere, n, s), s += BoundingSphere.packedLength; + const h = defined(l.boundingSphereCV) ? 1 : 0; + n[s++] = h, h && BoundingSphere.pack(l.boundingSphereCV, n, s), s += BoundingSphere.packedLength; + const p = l.attributes, m = []; + for (const y in p) + p.hasOwnProperty(y) && defined(p[y]) && (m.push(y), defined(r[y]) || (r[y] = i.length, i.push(y))); + n[s++] = m.length; + for (let y = 0; y < m.length; y++) { + const C = m[y], T = p[C]; + n[s++] = r[C], n[s++] = T.componentDatatype, n[s++] = T.componentsPerAttribute, n[s++] = T.normalize ? 1 : 0, n[s++] = T.values.length, n.set(T.values, s), s += T.values.length; + } + const _ = defined(l.indices) ? l.indices.length : 0; + n[s++] = _, _ > 0 && (n.set(l.indices, s), s += _); + } + return t.push(n.buffer), { + stringTable: i, + packedData: n + }; +}; +PrimitivePipeline.unpackCreateGeometryResults = function(e) { + const t = e.stringTable, n = e.packedData; + let i; + const r = new Array(n[0]); + let o = 0, s = 1; + for (; s < n.length; ) { + if (!(n[s++] === 1)) { + r[o++] = void 0; + continue; + } + const l = n[s++], d = n[s++]; + let f = n[s++]; + f === -1 && (f = void 0); + let h, p; + n[s++] === 1 && (h = BoundingSphere.unpack( + n, + s + )), s += BoundingSphere.packedLength, n[s++] === 1 && (p = BoundingSphere.unpack( + n, + s + )), s += BoundingSphere.packedLength; + let y, C, T; + const x = new GeometryAttributes(), b = n[s++]; + for (i = 0; i < b; i++) { + const E = t[n[s++]], A = n[s++]; + T = n[s++]; + const D = n[s++] !== 0; + y = n[s++], C = ComponentDatatype$1.createTypedArray(A, y); + for (let P = 0; P < y; P++) + C[P] = n[s++]; + x[E] = new GeometryAttribute({ + componentDatatype: A, + componentsPerAttribute: T, + normalize: D, + values: C + }); + } + let S; + if (y = n[s++], y > 0) { + const E = C.length / T; + for (S = IndexDatatype$1.createTypedArray(E, y), i = 0; i < y; i++) + S[i] = n[s++]; + } + r[o++] = new Geometry({ + primitiveType: l, + geometryType: d, + boundingSphere: h, + boundingSphereCV: p, + indices: S, + attributes: x, + offsetAttribute: f + }); + } + return r; +}; +function packInstancesForCombine(e, t) { + const n = e.length, i = new Float64Array(1 + n * 19); + let r = 0; + i[r++] = n; + for (let o = 0; o < n; o++) { + const s = e[o]; + if (Matrix4.pack(s.modelMatrix, i, r), r += Matrix4.packedLength, defined(s.attributes) && defined(s.attributes.offset)) { + const c = s.attributes.offset.value; + i[r] = c[0], i[r + 1] = c[1], i[r + 2] = c[2]; + } + r += 3; + } + return t.push(i.buffer), i; +} +function unpackInstancesForCombine(e) { + const t = e, n = new Array(t[0]); + let i = 0, r = 1; + for (; r < t.length; ) { + const o = Matrix4.unpack(t, r); + let s; + r += Matrix4.packedLength, defined(t[r]) && (s = { + offset: new OffsetGeometryInstanceAttribute( + t[r], + t[r + 1], + t[r + 2] + ) + }), r += 3, n[i++] = { + modelMatrix: o, + attributes: s + }; + } + return n; +} +PrimitivePipeline.packCombineGeometryParameters = function(e, t) { + const n = e.createGeometryResults, i = n.length; + for (let r = 0; r < i; r++) + t.push(n[r].packedData.buffer); + return { + createGeometryResults: e.createGeometryResults, + packedInstances: packInstancesForCombine( + e.instances, + t + ), + ellipsoid: e.ellipsoid, + isGeographic: e.projection instanceof GeographicProjection, + elementIndexUintSupported: e.elementIndexUintSupported, + scene3DOnly: e.scene3DOnly, + vertexCacheOptimize: e.vertexCacheOptimize, + compressVertices: e.compressVertices, + modelMatrix: e.modelMatrix, + createPickOffsets: e.createPickOffsets + }; +}; +PrimitivePipeline.unpackCombineGeometryParameters = function(e) { + const t = unpackInstancesForCombine(e.packedInstances), n = e.createGeometryResults, i = n.length; + let r = 0; + for (let c = 0; c < i; c++) { + const l = PrimitivePipeline.unpackCreateGeometryResults( + n[c] + ), d = l.length; + for (let f = 0; f < d; f++) { + const h = l[f], p = t[r]; + p.geometry = h, ++r; + } + } + const o = Ellipsoid.clone(e.ellipsoid), s = e.isGeographic ? new GeographicProjection(o) : new WebMercatorProjection(o); + return { + instances: t, + ellipsoid: o, + projection: s, + elementIndexUintSupported: e.elementIndexUintSupported, + scene3DOnly: e.scene3DOnly, + vertexCacheOptimize: e.vertexCacheOptimize, + compressVertices: e.compressVertices, + modelMatrix: Matrix4.clone(e.modelMatrix), + createPickOffsets: e.createPickOffsets + }; +}; +function packBoundingSpheres(e) { + const t = e.length, n = 1 + (BoundingSphere.packedLength + 1) * t, i = new Float32Array(n); + let r = 0; + i[r++] = t; + for (let o = 0; o < t; ++o) { + const s = e[o]; + defined(s) ? (i[r++] = 1, BoundingSphere.pack(e[o], i, r)) : i[r++] = 0, r += BoundingSphere.packedLength; + } + return i; +} +function unpackBoundingSpheres(e) { + const t = new Array(e[0]); + let n = 0, i = 1; + for (; i < e.length; ) + e[i++] === 1 && (t[n] = BoundingSphere.unpack(e, i)), ++n, i += BoundingSphere.packedLength; + return t; +} +PrimitivePipeline.packCombineGeometryResults = function(e, t) { + defined(e.geometries) && transferGeometries(e.geometries, t); + const n = packBoundingSpheres(e.boundingSpheres), i = packBoundingSpheres( + e.boundingSpheresCV + ); + return t.push( + n.buffer, + i.buffer + ), { + geometries: e.geometries, + attributeLocations: e.attributeLocations, + modelMatrix: e.modelMatrix, + pickOffsets: e.pickOffsets, + offsetInstanceExtend: e.offsetInstanceExtend, + boundingSpheres: n, + boundingSpheresCV: i + }; +}; +PrimitivePipeline.unpackCombineGeometryResults = function(e) { + return { + geometries: e.geometries, + attributeLocations: e.attributeLocations, + modelMatrix: e.modelMatrix, + pickOffsets: e.pickOffsets, + offsetInstanceExtend: e.offsetInstanceExtend, + boundingSpheres: unpackBoundingSpheres(e.boundingSpheres), + boundingSpheresCV: unpackBoundingSpheres(e.boundingSpheresCV) + }; +}; +const PrimitiveState = { + READY: 0, + CREATING: 1, + CREATED: 2, + COMBINING: 3, + COMBINED: 4, + COMPLETE: 5, + FAILED: 6 +}, PrimitiveState$1 = Object.freeze(PrimitiveState), ShadowMode = { + /** + * The object does not cast or receive shadows. + * + * @type {number} + * @constant + */ + DISABLED: 0, + /** + * The object casts and receives shadows. + * + * @type {number} + * @constant + */ + ENABLED: 1, + /** + * The object casts shadows only. + * + * @type {number} + * @constant + */ + CAST_ONLY: 2, + /** + * The object receives shadows only. + * + * @type {number} + * @constant + */ + RECEIVE_ONLY: 3 +}; +ShadowMode.NUMBER_OF_SHADOW_MODES = 4; +ShadowMode.castShadows = function(e) { + return e === ShadowMode.ENABLED || e === ShadowMode.CAST_ONLY; +}; +ShadowMode.receiveShadows = function(e) { + return e === ShadowMode.ENABLED || e === ShadowMode.RECEIVE_ONLY; +}; +ShadowMode.fromCastReceive = function(e, t) { + return e && t ? ShadowMode.ENABLED : e ? ShadowMode.CAST_ONLY : t ? ShadowMode.RECEIVE_ONLY : ShadowMode.DISABLED; +}; +const ShadowMode$1 = Object.freeze(ShadowMode); +function Primitive$3(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.geometryInstances = e.geometryInstances, this.appearance = e.appearance, this._appearance = void 0, this._material = void 0, this.depthFailAppearance = e.depthFailAppearance, this._depthFailAppearance = void 0, this._depthFailMaterial = void 0, this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = new Matrix4(), this.show = defaultValue(e.show, !0), this._vertexCacheOptimize = defaultValue(e.vertexCacheOptimize, !1), this._interleave = defaultValue(e.interleave, !1), this._releaseGeometryInstances = defaultValue( + e.releaseGeometryInstances, + !0 + ), this._allowPicking = defaultValue(e.allowPicking, !0), this._asynchronous = defaultValue(e.asynchronous, !0), this._compressVertices = defaultValue(e.compressVertices, !0), this.cull = defaultValue(e.cull, !0), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.rtcCenter = e.rtcCenter, this.shadows = defaultValue(e.shadows, ShadowMode$1.DISABLED), this._translucent = void 0, this._state = PrimitiveState$1.READY, this._geometries = [], this._error = void 0, this._numberOfInstances = 0, this._boundingSpheres = [], this._boundingSphereWC = [], this._boundingSphereCV = [], this._boundingSphere2D = [], this._boundingSphereMorph = [], this._perInstanceAttributeCache = /* @__PURE__ */ new Map(), this._instanceIds = [], this._lastPerInstanceAttributeIndex = 0, this._va = [], this._attributeLocations = void 0, this._primitiveType = void 0, this._frontFaceRS = void 0, this._backFaceRS = void 0, this._sp = void 0, this._depthFailAppearance = void 0, this._spDepthFail = void 0, this._frontFaceDepthFailRS = void 0, this._backFaceDepthFailRS = void 0, this._pickIds = [], this._colorCommands = [], this._pickCommands = [], this._createBoundingVolumeFunction = e._createBoundingVolumeFunction, this._createRenderStatesFunction = e._createRenderStatesFunction, this._createShaderProgramFunction = e._createShaderProgramFunction, this._createCommandsFunction = e._createCommandsFunction, this._updateAndQueueCommandsFunction = e._updateAndQueueCommandsFunction, this._createPickOffsets = e._createPickOffsets, this._pickOffsets = void 0, this._createGeometryResults = void 0, this._ready = !1, this._batchTable = void 0, this._batchTableAttributeIndices = void 0, this._offsetInstanceExtend = void 0, this._batchTableOffsetAttribute2DIndex = void 0, this._batchTableOffsetsUpdated = !1, this._instanceBoundingSpheres = void 0, this._instanceBoundingSpheresCV = void 0, this._tempBoundingSpheres = void 0, this._recomputeBoundingSpheres = !1, this._batchTableBoundingSpheresUpdated = !1, this._batchTableBoundingSphereAttributeIndices = void 0; +} +Object.defineProperties(Primitive$3.prototype, { + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + vertexCacheOptimize: { + get: function() { + return this._vertexCacheOptimize; + } + }, + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + interleave: { + get: function() { + return this._interleave; + } + }, + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + releaseGeometryInstances: { + get: function() { + return this._releaseGeometryInstances; + } + }, + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. * + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + allowPicking: { + get: function() { + return this._allowPicking; + } + }, + /** + * Determines if the geometry instances will be created and batched on a web worker. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + asynchronous: { + get: function() { + return this._asynchronous; + } + }, + /** + * When true, geometry vertices are compressed, which will save memory. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + compressVertices: { + get: function() { + return this._compressVertices; + } + }, + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link Primitive#update} + * is called. + * + * @memberof Primitive.prototype + * + * @type {boolean} + * @readonly + * + * @example + * // Wait for a primitive to become ready before accessing attributes + * const removeListener = scene.postRender.addEventListener(() => { + * if (!frustumPrimitive.ready) { + * return; + * } + * + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * + * removeListener(); + * }); + */ + ready: { + get: function() { + return this._ready; + } + } +}); +function getCommonPerInstanceAttributeNames(e) { + const t = e.length, n = [], i = e[0].attributes; + let r; + for (r in i) + if (i.hasOwnProperty(r) && defined(i[r])) { + const o = i[r]; + let s = !0; + for (let c = 1; c < t; ++c) { + const l = e[c].attributes[r]; + if (!defined(l) || o.componentDatatype !== l.componentDatatype || o.componentsPerAttribute !== l.componentsPerAttribute || o.normalize !== l.normalize) { + s = !1; + break; + } + } + s && n.push(r); + } + return n; +} +const scratchGetAttributeCartesian2 = new Cartesian2(), scratchGetAttributeCartesian3 = new Cartesian3(), scratchGetAttributeCartesian4 = new Cartesian4(); +function getAttributeValue(e) { + const t = e.length; + if (t === 1) + return e[0]; + if (t === 2) + return Cartesian2.unpack(e, 0, scratchGetAttributeCartesian2); + if (t === 3) + return Cartesian3.unpack(e, 0, scratchGetAttributeCartesian3); + if (t === 4) + return Cartesian4.unpack(e, 0, scratchGetAttributeCartesian4); +} +function createBatchTable$1(e, t) { + const n = e.geometryInstances, i = Array.isArray(n) ? n : [n], r = i.length; + if (r === 0) + return; + const o = getCommonPerInstanceAttributeNames(i), s = o.length, c = [], l = {}, d = {}; + let f, p = i[0].attributes, m, _, y; + for (m = 0; m < s; ++m) + _ = o[m], y = p[_], l[_] = m, c.push({ + functionName: `czm_batchTable_${_}`, + componentDatatype: y.componentDatatype, + componentsPerAttribute: y.componentsPerAttribute, + normalize: y.normalize + }); + o.indexOf("distanceDisplayCondition") !== -1 && (c.push( + { + functionName: "czm_batchTable_boundingSphereCenter3DHigh", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + functionName: "czm_batchTable_boundingSphereCenter3DLow", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + functionName: "czm_batchTable_boundingSphereCenter2DHigh", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + functionName: "czm_batchTable_boundingSphereCenter2DLow", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + functionName: "czm_batchTable_boundingSphereRadius", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 1 + } + ), d.center3DHigh = c.length - 5, d.center3DLow = c.length - 4, d.center2DHigh = c.length - 3, d.center2DLow = c.length - 2, d.radius = c.length - 1), o.indexOf("offset") !== -1 && (c.push({ + functionName: "czm_batchTable_offset2D", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }), f = c.length - 1), c.push({ + functionName: "czm_batchTable_pickColor", + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 4, + normalize: !0 + }); + const C = c.length, T = new BatchTable(t, c, r); + for (m = 0; m < r; ++m) { + const x = i[m]; + p = x.attributes; + for (let D = 0; D < s; ++D) { + _ = o[D], y = p[_]; + const P = getAttributeValue(y.value), I = l[_]; + T.setBatchedAttribute(m, I, P); + } + const b = { + primitive: defaultValue(x.pickPrimitive, e) + }; + defined(x.id) && (b.id = x.id); + const S = t.createPickId(b); + e._pickIds.push(S); + const E = S.color, A = scratchGetAttributeCartesian4; + A.x = Color.floatToByte(E.red), A.y = Color.floatToByte(E.green), A.z = Color.floatToByte(E.blue), A.w = Color.floatToByte(E.alpha), T.setBatchedAttribute(m, C - 1, A); + } + e._batchTable = T, e._batchTableAttributeIndices = l, e._batchTableBoundingSphereAttributeIndices = d, e._batchTableOffsetAttribute2DIndex = f; +} +function cloneAttribute(e) { + let t; + return Array.isArray(e.values) ? t = e.values.slice(0) : t = new e.values.constructor(e.values), new GeometryAttribute({ + componentDatatype: e.componentDatatype, + componentsPerAttribute: e.componentsPerAttribute, + normalize: e.normalize, + values: t + }); +} +function cloneGeometry(e) { + const t = e.attributes, n = new GeometryAttributes(); + for (const r in t) + t.hasOwnProperty(r) && defined(t[r]) && (n[r] = cloneAttribute(t[r])); + let i; + if (defined(e.indices)) { + const r = e.indices; + Array.isArray(r) ? i = r.slice(0) : i = new r.constructor(r); + } + return new Geometry({ + attributes: n, + indices: i, + primitiveType: e.primitiveType, + boundingSphere: BoundingSphere.clone(e.boundingSphere) + }); +} +function cloneInstance(e, t) { + return { + geometry: t, + attributes: e.attributes, + modelMatrix: Matrix4.clone(e.modelMatrix), + pickPrimitive: e.pickPrimitive, + id: e.id + }; +} +const positionRegex = /in\s+vec(?:3|4)\s+(.*)3DHigh;/g; +Primitive$3._modifyShaderPosition = function(e, t, n) { + let i, r = "", o = "", s = ""; + for (; (i = positionRegex.exec(t)) !== null; ) { + const c = i[1], l = `vec4 czm_compute${c[0].toUpperCase()}${c.substr( + 1 + )}()`; + l !== "vec4 czm_computePosition()" && (r += `${l}; +`), defined(e.rtcCenter) ? (t = t.replace( + /in\s+vec(?:3|4)\s+position3DHigh;/g, + "" + ), t = t.replace( + /in\s+vec(?:3|4)\s+position3DLow;/g, + "" + ), r += `uniform mat4 u_modifiedModelView; +`, o += `in vec4 position; +`, s += `${l} +{ + return u_modifiedModelView * position; +} + +`, t = t.replace( + /czm_modelViewRelativeToEye\s+\*\s+/g, + "" + ), t = t.replace( + /czm_modelViewProjectionRelativeToEye/g, + "czm_projection" + )) : n ? s += `${l} +{ + return czm_translateRelativeToEye(${c}3DHigh, ${c}3DLow); +} + +` : (o += `in vec3 ${c}2DHigh; +in vec3 ${c}2DLow; +`, s += `${l} +{ + vec4 p; + if (czm_morphTime == 1.0) + { + p = czm_translateRelativeToEye(${c}3DHigh, ${c}3DLow); + } + else if (czm_morphTime == 0.0) + { + p = czm_translateRelativeToEye(${c}2DHigh.zxy, ${c}2DLow.zxy); + } + else + { + p = czm_columbusViewMorph( + czm_translateRelativeToEye(${c}2DHigh.zxy, ${c}2DLow.zxy), + czm_translateRelativeToEye(${c}3DHigh, ${c}3DLow), + czm_morphTime); + } + return p; +} + +`); + } + return [r, o, t, s].join( + ` +` + ); +}; +Primitive$3._appendShowToShader = function(e, t) { + return defined(e._batchTableAttributeIndices.show) ? `${ShaderSource.replaceMain( + t, + "czm_non_show_main" + )} +void main() +{ + czm_non_show_main(); + gl_Position *= czm_batchTable_show(batchId); +}` : t; +}; +Primitive$3._updateColorAttribute = function(e, t, n) { + if (!defined(e._batchTableAttributeIndices.color) && !defined(e._batchTableAttributeIndices.depthFailColor) || t.search(/in\s+vec4\s+color;/g) === -1) + return t; + let i = t; + return i = i.replace(/in\s+vec4\s+color;/g, ""), n ? i = i.replace( + /(\b)color(\b)/g, + "$1czm_batchTable_depthFailColor(batchId)$2" + ) : i = i.replace( + /(\b)color(\b)/g, + "$1czm_batchTable_color(batchId)$2" + ), i; +}; +function appendPickToVertexShader(e) { + return `${ShaderSource.replaceMain(e, "czm_non_pick_main")} +out vec4 v_pickColor; +void main() +{ + czm_non_pick_main(); + v_pickColor = czm_batchTable_pickColor(batchId); +}`; +} +function appendPickToFragmentShader(e) { + return `in vec4 v_pickColor; +${e}`; +} +Primitive$3._updatePickColorAttribute = function(e) { + let t = e.replace(/in\s+vec4\s+pickColor;/g, ""); + return t = t.replace( + /(\b)pickColor(\b)/g, + "$1czm_batchTable_pickColor(batchId)$2" + ), t; +}; +Primitive$3._appendOffsetToShader = function(e, t) { + if (!defined(e._batchTableAttributeIndices.offset)) + return t; + let n = `in float batchId; +`; + n += "in float applyOffset;"; + let i = t.replace( + /in\s+float\s+batchId;/g, + n + ), r = `vec4 $1 = czm_computePosition(); +`; + return r += ` if (czm_sceneMode == czm_sceneMode3D) +`, r += ` { +`, r += " $1 = $1 + vec4(czm_batchTable_offset(batchId) * applyOffset, 0.0);", r += ` } +`, r += ` else +`, r += ` { +`, r += " $1 = $1 + vec4(czm_batchTable_offset2D(batchId) * applyOffset, 0.0);", r += ` } +`, i = i.replace( + /vec4\s+([A-Za-z0-9_]+)\s+=\s+czm_computePosition\(\);/g, + r + ), i; +}; +Primitive$3._appendDistanceDisplayConditionToShader = function(e, t, n) { + if (!defined(e._batchTableAttributeIndices.distanceDisplayCondition)) + return t; + const i = ShaderSource.replaceMain( + t, + "czm_non_distanceDisplayCondition_main" + ); + let r = `void main() +{ + czm_non_distanceDisplayCondition_main(); + vec2 distanceDisplayCondition = czm_batchTable_distanceDisplayCondition(batchId); + vec3 boundingSphereCenter3DHigh = czm_batchTable_boundingSphereCenter3DHigh(batchId); + vec3 boundingSphereCenter3DLow = czm_batchTable_boundingSphereCenter3DLow(batchId); + float boundingSphereRadius = czm_batchTable_boundingSphereRadius(batchId); +`; + return n ? r += ` vec4 centerRTE = czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow); +` : r += ` vec3 boundingSphereCenter2DHigh = czm_batchTable_boundingSphereCenter2DHigh(batchId); + vec3 boundingSphereCenter2DLow = czm_batchTable_boundingSphereCenter2DLow(batchId); + vec4 centerRTE; + if (czm_morphTime == 1.0) + { + centerRTE = czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow); + } + else if (czm_morphTime == 0.0) + { + centerRTE = czm_translateRelativeToEye(boundingSphereCenter2DHigh.zxy, boundingSphereCenter2DLow.zxy); + } + else + { + centerRTE = czm_columbusViewMorph( + czm_translateRelativeToEye(boundingSphereCenter2DHigh.zxy, boundingSphereCenter2DLow.zxy), + czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow), + czm_morphTime); + } +`, r += ` float radiusSq = boundingSphereRadius * boundingSphereRadius; + float distanceSq; + if (czm_sceneMode == czm_sceneMode2D) + { + distanceSq = czm_eyeHeight2D.y - radiusSq; + } + else + { + distanceSq = dot(centerRTE.xyz, centerRTE.xyz) - radiusSq; + } + distanceSq = max(distanceSq, 0.0); + float nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x; + float farSq = distanceDisplayCondition.y * distanceDisplayCondition.y; + float show = (distanceSq >= nearSq && distanceSq <= farSq) ? 1.0 : 0.0; + gl_Position *= show; +}`, `${i} +${r}`; +}; +function modifyForEncodedNormals$1(e, t) { + if (!e.compressVertices) + return t; + const n = t.search(/in\s+vec3\s+normal;/g) !== -1, i = t.search(/in\s+vec2\s+st;/g) !== -1; + if (!n && !i) + return t; + const r = t.search(/in\s+vec3\s+tangent;/g) !== -1, o = t.search(/in\s+vec3\s+bitangent;/g) !== -1; + let s = i && n ? 2 : 1; + s += r || o ? 1 : 0; + const c = s > 1 ? `vec${s}` : "float", l = "compressedAttributes", d = `in ${c} ${l};`; + let f = "", h = ""; + if (i) { + f += `vec2 st; +`; + const _ = s > 1 ? `${l}.x` : l; + h += ` st = czm_decompressTextureCoordinates(${_}); +`; + } + n && r && o ? (f += `vec3 normal; +vec3 tangent; +vec3 bitangent; +`, h += ` czm_octDecode(${l}.${i ? "yz" : "xy"}, normal, tangent, bitangent); +`) : (n && (f += `vec3 normal; +`, h += ` normal = czm_octDecode(${l}${s > 1 ? `.${i ? "y" : "x"}` : ""}); +`), r && (f += `vec3 tangent; +`, h += ` tangent = czm_octDecode(${l}.${i && n ? "z" : "y"}); +`), o && (f += `vec3 bitangent; +`, h += ` bitangent = czm_octDecode(${l}.${i && n ? "z" : "y"}); +`)); + let p = t; + p = p.replace(/in\s+vec3\s+normal;/g, ""), p = p.replace(/in\s+vec2\s+st;/g, ""), p = p.replace(/in\s+vec3\s+tangent;/g, ""), p = p.replace(/in\s+vec3\s+bitangent;/g, ""), p = ShaderSource.replaceMain(p, "czm_non_compressed_main"); + const m = `void main() +{ +${h} czm_non_compressed_main(); +}`; + return [d, f, p, m].join(` +`); +} +function depthClampVS(e) { + let t = ShaderSource.replaceMain( + e, + "czm_non_depth_clamp_main" + ); + return t += `void main() { + czm_non_depth_clamp_main(); + gl_Position = czm_depthClamp(gl_Position);} +`, t; +} +function depthClampFS(e) { + let t = ShaderSource.replaceMain( + e, + "czm_non_depth_clamp_main" + ); + return t += `void main() { + czm_non_depth_clamp_main(); + #if defined(LOG_DEPTH) + czm_writeLogDepth(); + #else + czm_writeDepthClamp(); + #endif +} +`, t; +} +function validateShaderMatching(e, t) { + e.vertexAttributes; +} +function getUniformFunction(e, t) { + return function() { + return e[t]; + }; +} +const numberOfCreationWorkers = Math.max( + FeatureDetection.hardwareConcurrency - 1, + 1 +); +let createGeometryTaskProcessors; +const combineGeometryTaskProcessor = new TaskProcessor("combineGeometry"); +function loadAsynchronous(e, t) { + let n, i, r, o; + const s = e._instanceIds; + if (e._state === PrimitiveState$1.READY) { + n = Array.isArray(e.geometryInstances) ? e.geometryInstances : [e.geometryInstances]; + const c = e._numberOfInstances = n.length, l = []; + let d = []; + for (r = 0; r < c; ++r) + i = n[r].geometry, s.push(n[r].id), d.push({ + moduleName: i._workerName, + modulePath: i._workerPath, + geometry: i + }); + if (!defined(createGeometryTaskProcessors)) + for (createGeometryTaskProcessors = new Array(numberOfCreationWorkers), r = 0; r < numberOfCreationWorkers; r++) + createGeometryTaskProcessors[r] = new TaskProcessor("createGeometry"); + let f; + for (d = subdivideArray(d, numberOfCreationWorkers), r = 0; r < d.length; r++) { + let h = 0; + const p = d[r], m = p.length; + for (o = 0; o < m; ++o) + f = p[o], i = f.geometry, defined(i.constructor.pack) && (f.offset = h, h += defaultValue( + i.constructor.packedLength, + i.packedLength + )); + let _; + if (h > 0) { + const y = new Float64Array(h); + for (_ = [y.buffer], o = 0; o < m; ++o) + f = p[o], i = f.geometry, defined(i.constructor.pack) && (i.constructor.pack(i, y, f.offset), f.geometry = y); + } + l.push( + createGeometryTaskProcessors[r].scheduleTask( + { + subTasks: d[r] + }, + _ + ) + ); + } + e._state = PrimitiveState$1.CREATING, Promise.all(l).then(function(h) { + e._createGeometryResults = h, e._state = PrimitiveState$1.CREATED; + }).catch(function(h) { + setReady(e, t, PrimitiveState$1.FAILED, h); + }); + } else if (e._state === PrimitiveState$1.CREATED) { + const c = []; + n = Array.isArray(e.geometryInstances) ? e.geometryInstances : [e.geometryInstances]; + const l = t.scene3DOnly, d = t.mapProjection, f = combineGeometryTaskProcessor.scheduleTask( + PrimitivePipeline.packCombineGeometryParameters( + { + createGeometryResults: e._createGeometryResults, + instances: n, + ellipsoid: d.ellipsoid, + projection: d, + elementIndexUintSupported: t.context.elementIndexUint, + scene3DOnly: l, + vertexCacheOptimize: e.vertexCacheOptimize, + compressVertices: e.compressVertices, + modelMatrix: e.modelMatrix, + createPickOffsets: e._createPickOffsets + }, + c + ), + c + ); + e._createGeometryResults = void 0, e._state = PrimitiveState$1.COMBINING, Promise.resolve(f).then(function(h) { + const p = PrimitivePipeline.unpackCombineGeometryResults( + h + ); + e._geometries = p.geometries, e._attributeLocations = p.attributeLocations, e.modelMatrix = Matrix4.clone( + p.modelMatrix, + e.modelMatrix + ), e._pickOffsets = p.pickOffsets, e._offsetInstanceExtend = p.offsetInstanceExtend, e._instanceBoundingSpheres = p.boundingSpheres, e._instanceBoundingSpheresCV = p.boundingSpheresCV, defined(e._geometries) && e._geometries.length > 0 ? (e._recomputeBoundingSpheres = !0, e._state = PrimitiveState$1.COMBINED) : setReady(e, t, PrimitiveState$1.FAILED, void 0); + }).catch(function(h) { + setReady(e, t, PrimitiveState$1.FAILED, h); + }); + } +} +function loadSynchronous(e, t) { + const n = Array.isArray(e.geometryInstances) ? e.geometryInstances : [e.geometryInstances], i = e._numberOfInstances = n.length, r = new Array(i), o = e._instanceIds; + let s, c, l = 0; + for (c = 0; c < i; c++) { + s = n[c]; + const p = s.geometry; + let m; + defined(p.attributes) && defined(p.primitiveType) ? m = cloneGeometry(p) : m = p.constructor.createGeometry(p), r[l++] = cloneInstance(s, m), o.push(s.id); + } + r.length = l; + const d = t.scene3DOnly, f = t.mapProjection, h = PrimitivePipeline.combineGeometry({ + instances: r, + ellipsoid: f.ellipsoid, + projection: f, + elementIndexUintSupported: t.context.elementIndexUint, + scene3DOnly: d, + vertexCacheOptimize: e.vertexCacheOptimize, + compressVertices: e.compressVertices, + modelMatrix: e.modelMatrix, + createPickOffsets: e._createPickOffsets + }); + e._geometries = h.geometries, e._attributeLocations = h.attributeLocations, e.modelMatrix = Matrix4.clone( + h.modelMatrix, + e.modelMatrix + ), e._pickOffsets = h.pickOffsets, e._offsetInstanceExtend = h.offsetInstanceExtend, e._instanceBoundingSpheres = h.boundingSpheres, e._instanceBoundingSpheresCV = h.boundingSpheresCV, defined(e._geometries) && e._geometries.length > 0 ? (e._recomputeBoundingSpheres = !0, e._state = PrimitiveState$1.COMBINED) : setReady(e, t, PrimitiveState$1.FAILED, void 0); +} +function recomputeBoundingSpheres(e, t) { + const n = e._batchTableAttributeIndices.offset; + if (!e._recomputeBoundingSpheres || !defined(n)) { + e._recomputeBoundingSpheres = !1; + return; + } + let i; + const r = e._offsetInstanceExtend, o = e._instanceBoundingSpheres, s = o.length; + let c = e._tempBoundingSpheres; + if (!defined(c)) { + for (c = new Array(s), i = 0; i < s; i++) + c[i] = new BoundingSphere(); + e._tempBoundingSpheres = c; + } + for (i = 0; i < s; ++i) { + let y = c[i]; + const C = e._batchTable.getBatchedAttribute( + i, + n, + new Cartesian3() + ); + y = o[i].clone(y), transformBoundingSphere(y, C, r[i]); + } + const l = [], d = [], f = []; + for (i = 0; i < s; ++i) { + const y = c[i]; + y.center.x - y.radius > 0 || BoundingSphere.intersectPlane(y, Plane.ORIGIN_ZX_PLANE) !== Intersect$1.INTERSECTING ? l.push(y) : (d.push(y), f.push(y)); + } + let h = l[0], p = f[0], m = d[0]; + for (i = 1; i < l.length; i++) + h = BoundingSphere.union(h, l[i]); + for (i = 1; i < f.length; i++) + p = BoundingSphere.union(p, f[i]); + for (i = 1; i < d.length; i++) + m = BoundingSphere.union(m, d[i]); + const _ = []; + for (defined(h) && _.push(h), defined(p) && _.push(p), defined(m) && _.push(m), i = 0; i < _.length; i++) { + const y = _[i].clone(e._boundingSpheres[i]); + e._boundingSpheres[i] = y, e._boundingSphereCV[i] = BoundingSphere.projectTo2D( + y, + t.mapProjection, + e._boundingSphereCV[i] + ); + } + Primitive$3._updateBoundingVolumes( + e, + t, + e.modelMatrix, + !0 + ), e._recomputeBoundingSpheres = !1; +} +const scratchBoundingSphereCenterEncoded = new EncodedCartesian3(), scratchBoundingSphereCartographic = new Cartographic(), scratchBoundingSphereCenter2D = new Cartesian3(), scratchBoundingSphere$3 = new BoundingSphere(); +function updateBatchTableBoundingSpheres(e, t) { + if (!defined( + e._batchTableAttributeIndices.distanceDisplayCondition + ) || e._batchTableBoundingSpheresUpdated) + return; + const i = e._batchTableBoundingSphereAttributeIndices, r = i.center3DHigh, o = i.center3DLow, s = i.center2DHigh, c = i.center2DLow, l = i.radius, d = t.mapProjection, f = d.ellipsoid, h = e._batchTable, p = e._instanceBoundingSpheres, m = p.length; + for (let _ = 0; _ < m; ++_) { + let y = p[_]; + if (!defined(y)) + continue; + const C = e.modelMatrix; + defined(C) && (y = BoundingSphere.transform( + y, + C, + scratchBoundingSphere$3 + )); + const T = y.center, x = y.radius; + let b = EncodedCartesian3.fromCartesian( + T, + scratchBoundingSphereCenterEncoded + ); + if (h.setBatchedAttribute(_, r, b.high), h.setBatchedAttribute(_, o, b.low), !t.scene3DOnly) { + const S = f.cartesianToCartographic( + T, + scratchBoundingSphereCartographic + ), E = d.project( + S, + scratchBoundingSphereCenter2D + ); + b = EncodedCartesian3.fromCartesian( + E, + scratchBoundingSphereCenterEncoded + ), h.setBatchedAttribute(_, s, b.high), h.setBatchedAttribute(_, c, b.low); + } + h.setBatchedAttribute(_, l, x); + } + e._batchTableBoundingSpheresUpdated = !0; +} +const offsetScratchCartesian = new Cartesian3(), offsetCenterScratch = new Cartesian3(); +function updateBatchTableOffsets(e, t) { + if (!defined(e._batchTableAttributeIndices.offset) || e._batchTableOffsetsUpdated || t.scene3DOnly) + return; + const i = e._batchTableOffsetAttribute2DIndex, r = t.mapProjection, o = r.ellipsoid, s = e._batchTable, c = e._instanceBoundingSpheres, l = c.length; + for (let d = 0; d < l; ++d) { + let f = c[d]; + if (!defined(f)) + continue; + const h = s.getBatchedAttribute( + d, + e._batchTableAttributeIndices.offset + ); + if (Cartesian3.equals(h, Cartesian3.ZERO)) { + s.setBatchedAttribute(d, i, Cartesian3.ZERO); + continue; + } + const p = e.modelMatrix; + defined(p) && (f = BoundingSphere.transform( + f, + p, + scratchBoundingSphere$3 + )); + let m = f.center; + m = o.scaleToGeodeticSurface(m, offsetCenterScratch); + let _ = o.cartesianToCartographic( + m, + scratchBoundingSphereCartographic + ); + const y = r.project( + _, + scratchBoundingSphereCenter2D + ), C = Cartesian3.add(h, m, offsetScratchCartesian); + _ = o.cartesianToCartographic(C, _); + const T = r.project( + _, + offsetScratchCartesian + ), x = Cartesian3.subtract( + T, + y, + offsetScratchCartesian + ), b = x.x; + x.x = x.z, x.z = x.y, x.y = b, s.setBatchedAttribute(d, i, x); + } + e._batchTableOffsetsUpdated = !0; +} +function createVertexArray$4(e, t) { + const n = e._attributeLocations, i = e._geometries, r = t.scene3DOnly, o = t.context, s = [], c = i.length; + for (let l = 0; l < c; ++l) { + const d = i[l]; + if (s.push( + VertexArray.fromGeometry({ + context: o, + geometry: d, + attributeLocations: n, + bufferUsage: BufferUsage$1.STATIC_DRAW, + interleave: e._interleave + }) + ), defined(e._createBoundingVolumeFunction)) + e._createBoundingVolumeFunction(t, d); + else if (e._boundingSpheres.push( + BoundingSphere.clone(d.boundingSphere) + ), e._boundingSphereWC.push(new BoundingSphere()), !r) { + const f = d.boundingSphereCV.center, h = f.x, p = f.y, m = f.z; + f.x = m, f.y = h, f.z = p, e._boundingSphereCV.push( + BoundingSphere.clone(d.boundingSphereCV) + ), e._boundingSphere2D.push(new BoundingSphere()), e._boundingSphereMorph.push(new BoundingSphere()); + } + } + e._va = s, e._primitiveType = i[0].primitiveType, e.releaseGeometryInstances && (e.geometryInstances = void 0), e._geometries = void 0, setReady(e, t, PrimitiveState$1.COMPLETE, void 0); +} +function createRenderStates$5(e, t, n, i) { + let r = n.getRenderState(), o; + i ? (o = clone$1(r, !1), o.cull = { + enabled: !0, + face: CullFace$1.BACK + }, e._frontFaceRS = RenderState.fromCache(o), o.cull.face = CullFace$1.FRONT, e._backFaceRS = RenderState.fromCache(o)) : (e._frontFaceRS = RenderState.fromCache(r), e._backFaceRS = e._frontFaceRS), o = clone$1(r, !1), defined(e._depthFailAppearance) && (o.depthTest.enabled = !1), defined(e._depthFailAppearance) && (r = e._depthFailAppearance.getRenderState(), o = clone$1(r, !1), o.depthTest.func = DepthFunction$1.GREATER, i ? (o.cull = { + enabled: !0, + face: CullFace$1.BACK + }, e._frontFaceDepthFailRS = RenderState.fromCache(o), o.cull.face = CullFace$1.FRONT, e._backFaceDepthFailRS = RenderState.fromCache(o)) : (e._frontFaceDepthFailRS = RenderState.fromCache(o), e._backFaceDepthFailRS = e._frontFaceRS)); +} +function createShaderProgram$3(e, t, n) { + const i = t.context, r = e._attributeLocations; + let o = e._batchTable.getVertexShaderCallback()( + n.vertexShaderSource + ); + o = Primitive$3._appendOffsetToShader(e, o), o = Primitive$3._appendShowToShader(e, o), o = Primitive$3._appendDistanceDisplayConditionToShader( + e, + o, + t.scene3DOnly + ), o = appendPickToVertexShader(o), o = Primitive$3._updateColorAttribute(e, o, !1), o = modifyForEncodedNormals$1(e, o), o = Primitive$3._modifyShaderPosition(e, o, t.scene3DOnly); + let s = n.getFragmentShaderSource(); + s = appendPickToFragmentShader(s), e._sp = ShaderProgram.replaceCache({ + context: i, + shaderProgram: e._sp, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: r + }), validateShaderMatching(e._sp), defined(e._depthFailAppearance) && (o = e._batchTable.getVertexShaderCallback()( + e._depthFailAppearance.vertexShaderSource + ), o = Primitive$3._appendShowToShader(e, o), o = Primitive$3._appendDistanceDisplayConditionToShader( + e, + o, + t.scene3DOnly + ), o = appendPickToVertexShader(o), o = Primitive$3._updateColorAttribute(e, o, !0), o = modifyForEncodedNormals$1(e, o), o = Primitive$3._modifyShaderPosition(e, o, t.scene3DOnly), o = depthClampVS(o), s = e._depthFailAppearance.getFragmentShaderSource(), s = appendPickToFragmentShader(s), s = depthClampFS(s), e._spDepthFail = ShaderProgram.replaceCache({ + context: i, + shaderProgram: e._spDepthFail, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: r + }), validateShaderMatching(e._spDepthFail)); +} +const modifiedModelViewScratch$4 = new Matrix4(), rtcScratch$4 = new Cartesian3(); +function getUniforms(e, t, n, i) { + const r = defined(n) ? n._uniforms : void 0, o = {}, s = t.uniforms; + if (defined(s)) + for (const l in s) + s.hasOwnProperty(l) && (o[l] = getUniformFunction( + s, + l + )); + let c = combine$2(o, r); + return c = e._batchTable.getUniformMapCallback()(c), defined(e.rtcCenter) && (c.u_modifiedModelView = function() { + const l = i.context.uniformState.view; + return Matrix4.multiply( + l, + e._modelMatrix, + modifiedModelViewScratch$4 + ), Matrix4.multiplyByPoint( + modifiedModelViewScratch$4, + e.rtcCenter, + rtcScratch$4 + ), Matrix4.setTranslation( + modifiedModelViewScratch$4, + rtcScratch$4, + modifiedModelViewScratch$4 + ), modifiedModelViewScratch$4; + }), c; +} +function createCommands$4(e, t, n, i, r, o, s, c) { + const l = getUniforms(e, t, n, c); + let d; + defined(e._depthFailAppearance) && (d = getUniforms( + e, + e._depthFailAppearance, + e._depthFailAppearance.material, + c + )); + const f = i ? Pass$1.TRANSLUCENT : Pass$1.OPAQUE; + let h = r ? 2 : 1; + h *= defined(e._depthFailAppearance) ? 2 : 1, o.length = e._va.length * h; + const p = o.length; + let m = 0; + for (let _ = 0; _ < p; ++_) { + let y; + r && (y = o[_], defined(y) || (y = o[_] = new DrawCommand({ + owner: e, + primitiveType: e._primitiveType + })), y.vertexArray = e._va[m], y.renderState = e._backFaceRS, y.shaderProgram = e._sp, y.uniformMap = l, y.pass = f, ++_), y = o[_], defined(y) || (y = o[_] = new DrawCommand({ + owner: e, + primitiveType: e._primitiveType + })), y.vertexArray = e._va[m], y.renderState = e._frontFaceRS, y.shaderProgram = e._sp, y.uniformMap = l, y.pass = f, defined(e._depthFailAppearance) && (r && (++_, y = o[_], defined(y) || (y = o[_] = new DrawCommand({ + owner: e, + primitiveType: e._primitiveType + })), y.vertexArray = e._va[m], y.renderState = e._backFaceDepthFailRS, y.shaderProgram = e._spDepthFail, y.uniformMap = d, y.pass = f), ++_, y = o[_], defined(y) || (y = o[_] = new DrawCommand({ + owner: e, + primitiveType: e._primitiveType + })), y.vertexArray = e._va[m], y.renderState = e._frontFaceDepthFailRS, y.shaderProgram = e._spDepthFail, y.uniformMap = d, y.pass = f), ++m; + } +} +Primitive$3._updateBoundingVolumes = function(e, t, n, i) { + let r, o, s; + if (i || !Matrix4.equals(n, e._modelMatrix)) + for (Matrix4.clone(n, e._modelMatrix), o = e._boundingSpheres.length, r = 0; r < o; ++r) + s = e._boundingSpheres[r], defined(s) && (e._boundingSphereWC[r] = BoundingSphere.transform( + s, + n, + e._boundingSphereWC[r] + ), t.scene3DOnly || (e._boundingSphere2D[r] = BoundingSphere.clone( + e._boundingSphereCV[r], + e._boundingSphere2D[r] + ), e._boundingSphere2D[r].center.x = 0, e._boundingSphereMorph[r] = BoundingSphere.union( + e._boundingSphereWC[r], + e._boundingSphereCV[r] + ))); + const c = e.appearance.pixelSize; + if (defined(c)) + for (o = e._boundingSpheres.length, r = 0; r < o; ++r) { + s = e._boundingSpheres[r]; + const l = e._boundingSphereWC[r], f = t.camera.getPixelSize( + s, + t.context.drawingBufferWidth, + t.context.drawingBufferHeight + ) * c; + l.radius = s.radius + f; + } +}; +function updateAndQueueCommands$3(e, t, n, i, r, o, s, c) { + Primitive$3._updateBoundingVolumes(e, t, r); + let l; + t.mode === SceneMode$1.SCENE3D ? l = e._boundingSphereWC : t.mode === SceneMode$1.COLUMBUS_VIEW ? l = e._boundingSphereCV : t.mode === SceneMode$1.SCENE2D && defined(e._boundingSphere2D) ? l = e._boundingSphere2D : defined(e._boundingSphereMorph) && (l = e._boundingSphereMorph); + const d = t.commandList, f = t.passes; + if (f.render || f.pick) { + const h = e.allowPicking, p = ShadowMode$1.castShadows(e.shadows), m = ShadowMode$1.receiveShadows(e.shadows), _ = n.length; + let y = c ? 2 : 1; + y *= defined(e._depthFailAppearance) ? 2 : 1; + for (let C = 0; C < _; ++C) { + const T = Math.floor(C / y), x = n[C]; + x.modelMatrix = r, x.boundingVolume = l[T], x.cull = o, x.debugShowBoundingVolume = s, x.castShadows = p, x.receiveShadows = m, h ? x.pickId = "v_pickColor" : x.pickId = void 0, d.push(x); + } + } +} +Primitive$3.prototype.update = function(e) { + if (!defined(this.geometryInstances) && this._va.length === 0 || defined(this.geometryInstances) && Array.isArray(this.geometryInstances) && this.geometryInstances.length === 0 || !defined(this.appearance) || e.mode !== SceneMode$1.SCENE3D && e.scene3DOnly || !e.passes.render && !e.passes.pick) + return; + if (defined(this._error)) + throw this._error; + if (this._state === PrimitiveState$1.FAILED) + return; + const t = e.context; + if (defined(this._batchTable) || createBatchTable$1(this, t), this._batchTable.attributes.length > 0) { + if (ContextLimits.maximumVertexTextureImageUnits === 0) + throw new RuntimeError( + "Vertex texture fetch support is required to render primitives with per-instance attributes. The maximum number of vertex texture image units must be greater than zero." + ); + this._batchTable.update(e); + } + if (this._state !== PrimitiveState$1.COMPLETE && this._state !== PrimitiveState$1.COMBINED && (this.asynchronous ? loadAsynchronous(this, e) : loadSynchronous(this, e)), this._state === PrimitiveState$1.COMBINED && (updateBatchTableBoundingSpheres(this, e), updateBatchTableOffsets(this, e), createVertexArray$4(this, e)), !this.show || this._state !== PrimitiveState$1.COMPLETE) + return; + this._batchTableOffsetsUpdated || updateBatchTableOffsets(this, e), this._recomputeBoundingSpheres && recomputeBoundingSpheres(this, e); + const n = this.appearance, i = n.material; + let r = !1, o = !1; + this._appearance !== n ? (this._appearance = n, this._material = i, r = !0, o = !0) : this._material !== i && (this._material = i, o = !0); + const s = this.depthFailAppearance, c = defined(s) ? s.material : void 0; + this._depthFailAppearance !== s ? (this._depthFailAppearance = s, this._depthFailMaterial = c, r = !0, o = !0) : this._depthFailMaterial !== c && (this._depthFailMaterial = c, o = !0); + const l = this._appearance.isTranslucent(); + this._translucent !== l && (this._translucent = l, r = !0), defined(this._material) && this._material.update(t); + const d = n.closed && l; + r && defaultValue( + this._createRenderStatesFunction, + createRenderStates$5 + )(this, t, n, d), o && defaultValue( + this._createShaderProgramFunction, + createShaderProgram$3 + )(this, e, n), (r || o) && defaultValue( + this._createCommandsFunction, + createCommands$4 + )( + this, + n, + i, + l, + d, + this._colorCommands, + this._pickCommands, + e + ), defaultValue( + this._updateAndQueueCommandsFunction, + updateAndQueueCommands$3 + )( + this, + e, + this._colorCommands, + this._pickCommands, + this.modelMatrix, + this.cull, + this.debugShowBoundingVolume, + d + ); +}; +const offsetBoundingSphereScratch1 = new BoundingSphere(), offsetBoundingSphereScratch2 = new BoundingSphere(); +function transformBoundingSphere(e, t, n) { + if (n === GeometryOffsetAttribute$1.TOP) { + const i = BoundingSphere.clone( + e, + offsetBoundingSphereScratch1 + ), r = BoundingSphere.clone( + e, + offsetBoundingSphereScratch2 + ); + r.center = Cartesian3.add(r.center, t, r.center), e = BoundingSphere.union(i, r, e); + } else n === GeometryOffsetAttribute$1.ALL && (e.center = Cartesian3.add( + e.center, + t, + e.center + )); + return e; +} +function createGetFunction(e, t, n) { + return function() { + const i = e.getBatchedAttribute( + t, + n + ), r = e.attributes[n], o = r.componentsPerAttribute, s = ComponentDatatype$1.createTypedArray( + r.componentDatatype, + o + ); + return defined(i.constructor.pack) ? i.constructor.pack(i, s, 0) : s[0] = i, s; + }; +} +function createSetFunction(e, t, n, i, r) { + return function(o) { + const s = getAttributeValue(o); + e.setBatchedAttribute( + t, + n, + s + ), r === "offset" && (i._recomputeBoundingSpheres = !0, i._batchTableOffsetsUpdated = !1); + }; +} +const offsetScratch$b = new Cartesian3(); +function createBoundingSphereProperties(e, t, n) { + t.boundingSphere = { + get: function() { + let i = e._instanceBoundingSpheres[n]; + if (defined(i)) { + i = i.clone(); + const r = e.modelMatrix, o = t.offset; + defined(o) && transformBoundingSphere( + i, + Cartesian3.fromArray(o.get(), 0, offsetScratch$b), + e._offsetInstanceExtend[n] + ), defined(r) && (i = BoundingSphere.transform( + i, + r + )); + } + return i; + } + }, t.boundingSphereCV = { + get: function() { + return e._instanceBoundingSpheresCV[n]; + } + }; +} +function createPickIdProperty(e, t, n) { + t.pickId = { + get: function() { + return e._pickIds[n]; + } + }; +} +Primitive$3.prototype.getGeometryInstanceAttributes = function(e) { + let t = this._perInstanceAttributeCache.get(e); + if (defined(t)) + return t; + let n = -1; + const i = this._lastPerInstanceAttributeIndex, r = this._instanceIds, o = r.length; + for (let d = 0; d < o; ++d) { + const f = (i + d) % o; + if (e === r[f]) { + n = f; + break; + } + } + if (n === -1) + return; + const s = this._batchTable, c = this._batchTableAttributeIndices; + t = {}; + const l = {}; + for (const d in c) + if (c.hasOwnProperty(d)) { + const f = c[d]; + l[d] = { + get: createGetFunction(s, n, f), + set: createSetFunction(s, n, f, this, d) + }; + } + return createBoundingSphereProperties(this, l, n), createPickIdProperty(this, l, n), Object.defineProperties(t, l), this._lastPerInstanceAttributeIndex = n, this._perInstanceAttributeCache.set(e, t), t; +}; +Primitive$3.prototype.isDestroyed = function() { + return !1; +}; +Primitive$3.prototype.destroy = function() { + let e, t; + this._sp = this._sp && this._sp.destroy(), this._spDepthFail = this._spDepthFail && this._spDepthFail.destroy(); + const n = this._va; + for (e = n.length, t = 0; t < e; ++t) + n[t].destroy(); + this._va = void 0; + const i = this._pickIds; + for (e = i.length, t = 0; t < e; ++t) + i[t].destroy(); + return this._pickIds = void 0, this._batchTable = this._batchTable && this._batchTable.destroy(), this._instanceIds = void 0, this._perInstanceAttributeCache = void 0, this._attributeLocations = void 0, destroyObject(this); +}; +function setReady(e, t, n, i) { + e._error = i, e._state = n, t.afterRender.push(function() { + e._ready = e._state === PrimitiveState$1.COMPLETE || e._state === PrimitiveState$1.FAILED; + }); +} +function GeometryInstanceAttribute(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.componentDatatype = e.componentDatatype, this.componentsPerAttribute = e.componentsPerAttribute, this.normalize = defaultValue(e.normalize, !1), this.value = e.value; +} +const ShadowVolumeAppearanceFS = `#ifdef TEXTURE_COORDINATES +#ifdef SPHERICAL +in vec4 v_sphericalExtents; +#else // SPHERICAL +in vec2 v_inversePlaneExtents; +in vec4 v_westPlane; +in vec4 v_southPlane; +#endif // SPHERICAL +in vec3 v_uvMinAndSphericalLongitudeRotation; +in vec3 v_uMaxAndInverseDistance; +in vec3 v_vMaxAndInverseDistance; +#endif // TEXTURE_COORDINATES + +#ifdef PER_INSTANCE_COLOR +in vec4 v_color; +#endif + +#ifdef NORMAL_EC +vec3 getEyeCoordinate3FromWindowCoordinate(vec2 fragCoord, float logDepthOrDepth) { + vec4 eyeCoordinate = czm_windowToEyeCoordinates(fragCoord, logDepthOrDepth); + return eyeCoordinate.xyz / eyeCoordinate.w; +} + +vec3 vectorFromOffset(vec4 eyeCoordinate, vec2 positiveOffset) { + vec2 glFragCoordXY = gl_FragCoord.xy; + // Sample depths at both offset and negative offset + float upOrRightLogDepth = czm_unpackDepth(texture(czm_globeDepthTexture, (glFragCoordXY + positiveOffset) / czm_viewport.zw)); + float downOrLeftLogDepth = czm_unpackDepth(texture(czm_globeDepthTexture, (glFragCoordXY - positiveOffset) / czm_viewport.zw)); + // Explicitly evaluate both paths + // Necessary for multifrustum and for edges of the screen + bvec2 upOrRightInBounds = lessThan(glFragCoordXY + positiveOffset, czm_viewport.zw); + float useUpOrRight = float(upOrRightLogDepth > 0.0 && upOrRightInBounds.x && upOrRightInBounds.y); + float useDownOrLeft = float(useUpOrRight == 0.0); + vec3 upOrRightEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY + positiveOffset, upOrRightLogDepth); + vec3 downOrLeftEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY - positiveOffset, downOrLeftLogDepth); + return (upOrRightEC - (eyeCoordinate.xyz / eyeCoordinate.w)) * useUpOrRight + ((eyeCoordinate.xyz / eyeCoordinate.w) - downOrLeftEC) * useDownOrLeft; +} +#endif // NORMAL_EC + +void main(void) +{ +#ifdef REQUIRES_EC + float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw)); + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); +#endif + +#ifdef REQUIRES_WC + vec4 worldCoordinate4 = czm_inverseView * eyeCoordinate; + vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w; +#endif + +#ifdef TEXTURE_COORDINATES + vec2 uv; +#ifdef SPHERICAL + // Treat world coords as a sphere normal for spherical coordinates + vec2 sphericalLatLong = czm_approximateSphericalCoordinates(worldCoordinate); + sphericalLatLong.y += v_uvMinAndSphericalLongitudeRotation.z; + sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); + uv.x = (sphericalLatLong.y - v_sphericalExtents.y) * v_sphericalExtents.w; + uv.y = (sphericalLatLong.x - v_sphericalExtents.x) * v_sphericalExtents.z; +#else // SPHERICAL + // Unpack planes and transform to eye space + uv.x = czm_planeDistance(v_westPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.x; + uv.y = czm_planeDistance(v_southPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.y; +#endif // SPHERICAL +#endif // TEXTURE_COORDINATES + +#ifdef PICK +#ifdef CULL_FRAGMENTS + // When classifying translucent geometry, logDepthOrDepth == 0.0 + // indicates a region that should not be classified, possibly due to there + // being opaque pixels there in another buffer. + // Check for logDepthOrDepth != 0.0 to make sure this should be classified. + if (0.0 <= uv.x && uv.x <= 1.0 && 0.0 <= uv.y && uv.y <= 1.0 || logDepthOrDepth != 0.0) { + out_FragColor.a = 1.0; // 0.0 alpha leads to discard from ShaderSource.createPickFragmentShaderSource + czm_writeDepthClamp(); + } +#else // CULL_FRAGMENTS + out_FragColor.a = 1.0; +#endif // CULL_FRAGMENTS +#else // PICK + +#ifdef CULL_FRAGMENTS + // When classifying translucent geometry, logDepthOrDepth == 0.0 + // indicates a region that should not be classified, possibly due to there + // being opaque pixels there in another buffer. + if (uv.x <= 0.0 || 1.0 <= uv.x || uv.y <= 0.0 || 1.0 <= uv.y || logDepthOrDepth == 0.0) { + discard; + } +#endif + +#ifdef NORMAL_EC + // Compute normal by sampling adjacent pixels in 2x2 block in screen space + vec3 downUp = vectorFromOffset(eyeCoordinate, vec2(0.0, 1.0)); + vec3 leftRight = vectorFromOffset(eyeCoordinate, vec2(1.0, 0.0)); + vec3 normalEC = normalize(cross(leftRight, downUp)); +#endif + + +#ifdef PER_INSTANCE_COLOR + + vec4 color = czm_gammaCorrect(v_color); +#ifdef FLAT + out_FragColor = color; +#else // FLAT + czm_materialInput materialInput; + materialInput.normalEC = normalEC; + materialInput.positionToEyeEC = -eyeCoordinate.xyz; + czm_material material = czm_getDefaultMaterial(materialInput); + material.diffuse = color.rgb; + material.alpha = color.a; + + out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); +#endif // FLAT + + // Premultiply alpha. Required for classification primitives on translucent globe. + out_FragColor.rgb *= out_FragColor.a; + +#else // PER_INSTANCE_COLOR + + // Material support. + // USES_ is distinct from REQUIRES_, because some things are dependencies of each other or + // dependencies for culling but might not actually be used by the material. + + czm_materialInput materialInput; + +#ifdef USES_NORMAL_EC + materialInput.normalEC = normalEC; +#endif + +#ifdef USES_POSITION_TO_EYE_EC + materialInput.positionToEyeEC = -eyeCoordinate.xyz; +#endif + +#ifdef USES_TANGENT_TO_EYE + materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(worldCoordinate, normalEC); +#endif + +#ifdef USES_ST + // Remap texture coordinates from computed (approximately aligned with cartographic space) to the desired + // texture coordinate system, which typically forms a tight oriented bounding box around the geometry. + // Shader is provided a set of reference points for remapping. + materialInput.st.x = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_uMaxAndInverseDistance.xy, uv) * v_uMaxAndInverseDistance.z; + materialInput.st.y = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_vMaxAndInverseDistance.xy, uv) * v_vMaxAndInverseDistance.z; +#endif + + czm_material material = czm_getMaterial(materialInput); + +#ifdef FLAT + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#else // FLAT + out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); +#endif // FLAT + + // Premultiply alpha. Required for classification primitives on translucent globe. + out_FragColor.rgb *= out_FragColor.a; + +#endif // PER_INSTANCE_COLOR + czm_writeDepthClamp(); +#endif // PICK +} +`; +function ShadowVolumeAppearance(e, t, n) { + this._projectionExtentDefines = { + eastMostYhighDefine: "", + eastMostYlowDefine: "", + westMostYhighDefine: "", + westMostYlowDefine: "" + }; + const i = new ShaderDependencies(); + i.requiresTextureCoordinates = e, i.requiresEC = !n.flat; + const r = new ShaderDependencies(); + if (r.requiresTextureCoordinates = e, n instanceof PerInstanceColorAppearance) + i.requiresNormalEC = !n.flat; + else { + const o = `${n.material.shaderSource} +${n.fragmentShaderSource}`; + i.normalEC = o.indexOf("materialInput.normalEC") !== -1 || o.indexOf("czm_getDefaultMaterial") !== -1, i.positionToEyeEC = o.indexOf("materialInput.positionToEyeEC") !== -1, i.tangentToEyeMatrix = o.indexOf("materialInput.tangentToEyeMatrix") !== -1, i.st = o.indexOf("materialInput.st") !== -1; + } + this._colorShaderDependencies = i, this._pickShaderDependencies = r, this._appearance = n, this._extentsCulling = e, this._planarExtents = t; +} +ShadowVolumeAppearance.prototype.createFragmentShader = function(e) { + const t = this._appearance, n = this._colorShaderDependencies, i = []; + !e && !this._planarExtents && i.push("SPHERICAL"), n.requiresEC && i.push("REQUIRES_EC"), n.requiresWC && i.push("REQUIRES_WC"), n.requiresTextureCoordinates && i.push("TEXTURE_COORDINATES"), this._extentsCulling && i.push("CULL_FRAGMENTS"), n.requiresNormalEC && i.push("NORMAL_EC"), t instanceof PerInstanceColorAppearance && i.push("PER_INSTANCE_COLOR"), n.normalEC && i.push("USES_NORMAL_EC"), n.positionToEyeEC && i.push("USES_POSITION_TO_EYE_EC"), n.tangentToEyeMatrix && i.push("USES_TANGENT_TO_EYE"), n.st && i.push("USES_ST"), t.flat && i.push("FLAT"); + let r = ""; + return t instanceof PerInstanceColorAppearance || (r = t.material.shaderSource), new ShaderSource({ + defines: i, + sources: [r, ShadowVolumeAppearanceFS] + }); +}; +ShadowVolumeAppearance.prototype.createPickFragmentShader = function(e) { + const t = this._pickShaderDependencies, n = ["PICK"]; + return !e && !this._planarExtents && n.push("SPHERICAL"), t.requiresEC && n.push("REQUIRES_EC"), t.requiresWC && n.push("REQUIRES_WC"), t.requiresTextureCoordinates && n.push("TEXTURE_COORDINATES"), this._extentsCulling && n.push("CULL_FRAGMENTS"), new ShaderSource({ + defines: n, + sources: [ShadowVolumeAppearanceFS], + pickColorQualifier: "in" + }); +}; +ShadowVolumeAppearance.prototype.createVertexShader = function(e, t, n, i) { + return createShadowVolumeAppearanceVS( + this._colorShaderDependencies, + this._planarExtents, + n, + e, + t, + this._appearance, + i, + this._projectionExtentDefines + ); +}; +ShadowVolumeAppearance.prototype.createPickVertexShader = function(e, t, n, i) { + return createShadowVolumeAppearanceVS( + this._pickShaderDependencies, + this._planarExtents, + n, + e, + t, + void 0, + i, + this._projectionExtentDefines + ); +}; +const longitudeExtentsCartesianScratch = new Cartesian3(), longitudeExtentsCartographicScratch = new Cartographic(), longitudeExtentsEncodeScratch = { + high: 0, + low: 0 +}; +function createShadowVolumeAppearanceVS(e, t, n, i, r, o, s, c) { + const l = i.slice(); + if (c.eastMostYhighDefine === "") { + const d = longitudeExtentsCartographicScratch; + d.longitude = CesiumMath.PI, d.latitude = 0, d.height = 0; + const f = s.project( + d, + longitudeExtentsCartesianScratch + ); + let h = EncodedCartesian3.encode( + f.x, + longitudeExtentsEncodeScratch + ); + c.eastMostYhighDefine = `EAST_MOST_X_HIGH ${h.high.toFixed( + `${h.high}`.length + 1 + )}`, c.eastMostYlowDefine = `EAST_MOST_X_LOW ${h.low.toFixed( + `${h.low}`.length + 1 + )}`; + const p = longitudeExtentsCartographicScratch; + p.longitude = -CesiumMath.PI, p.latitude = 0, p.height = 0; + const m = s.project( + p, + longitudeExtentsCartesianScratch + ); + h = EncodedCartesian3.encode( + m.x, + longitudeExtentsEncodeScratch + ), c.westMostYhighDefine = `WEST_MOST_X_HIGH ${h.high.toFixed( + `${h.high}`.length + 1 + )}`, c.westMostYlowDefine = `WEST_MOST_X_LOW ${h.low.toFixed( + `${h.low}`.length + 1 + )}`; + } + return n && (l.push(c.eastMostYhighDefine), l.push(c.eastMostYlowDefine), l.push(c.westMostYhighDefine), l.push(c.westMostYlowDefine)), defined(o) && o instanceof PerInstanceColorAppearance && l.push("PER_INSTANCE_COLOR"), e.requiresTextureCoordinates && (l.push("TEXTURE_COORDINATES"), t || n || l.push("SPHERICAL"), n && l.push("COLUMBUS_VIEW_2D")), new ShaderSource({ + defines: l, + sources: [r] + }); +} +function ShaderDependencies() { + this._requiresEC = !1, this._requiresWC = !1, this._requiresNormalEC = !1, this._requiresTextureCoordinates = !1, this._usesNormalEC = !1, this._usesPositionToEyeEC = !1, this._usesTangentToEyeMat = !1, this._usesSt = !1; +} +Object.defineProperties(ShaderDependencies.prototype, { + // Set when assessing final shading (flat vs. phong) and culling using computed texture coordinates + requiresEC: { + get: function() { + return this._requiresEC; + }, + set: function(e) { + this._requiresEC = e || this._requiresEC; + } + }, + requiresWC: { + get: function() { + return this._requiresWC; + }, + set: function(e) { + this._requiresWC = e || this._requiresWC, this.requiresEC = this._requiresWC; + } + }, + requiresNormalEC: { + get: function() { + return this._requiresNormalEC; + }, + set: function(e) { + this._requiresNormalEC = e || this._requiresNormalEC, this.requiresEC = this._requiresNormalEC; + } + }, + requiresTextureCoordinates: { + get: function() { + return this._requiresTextureCoordinates; + }, + set: function(e) { + this._requiresTextureCoordinates = e || this._requiresTextureCoordinates, this.requiresWC = this._requiresTextureCoordinates; + } + }, + // Get/Set when assessing material hookups + normalEC: { + set: function(e) { + this.requiresNormalEC = e, this._usesNormalEC = e; + }, + get: function() { + return this._usesNormalEC; + } + }, + tangentToEyeMatrix: { + set: function(e) { + this.requiresWC = e, this.requiresNormalEC = e, this._usesTangentToEyeMat = e; + }, + get: function() { + return this._usesTangentToEyeMat; + } + }, + positionToEyeEC: { + set: function(e) { + this.requiresEC = e, this._usesPositionToEyeEC = e; + }, + get: function() { + return this._usesPositionToEyeEC; + } + }, + st: { + set: function(e) { + this.requiresTextureCoordinates = e, this._usesSt = e; + }, + get: function() { + return this._usesSt; + } + } +}); +function pointLineDistance(e, t, n) { + return Math.abs( + (t.y - e.y) * n.x - (t.x - e.x) * n.y + t.x * e.y - t.y * e.x + ) / Cartesian2.distance(t, e); +} +const points2DScratch$1 = [ + new Cartesian2(), + new Cartesian2(), + new Cartesian2(), + new Cartesian2() +]; +function addTextureCoordinateRotationAttributes(e, t) { + const n = points2DScratch$1, i = Cartesian2.unpack( + t, + 0, + n[0] + ), r = Cartesian2.unpack( + t, + 2, + n[1] + ), o = Cartesian2.unpack( + t, + 4, + n[2] + ); + e.uMaxVmax = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + value: [r.x, r.y, o.x, o.y] + }); + const s = 1 / pointLineDistance(i, r, o), c = 1 / pointLineDistance(i, o, r); + e.uvMinAndExtents = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + value: [i.x, i.y, s, c] + }); +} +const cartographicScratch$4 = new Cartographic(), cornerScratch = new Cartesian3(), northWestScratch = new Cartesian3(), southEastScratch = new Cartesian3(), highLowScratch = { high: 0, low: 0 }; +function add2DTextureCoordinateAttributes(e, t, n) { + const i = cartographicScratch$4; + i.height = 0, i.longitude = e.west, i.latitude = e.south; + const r = t.project(i, cornerScratch); + i.latitude = e.north; + const o = t.project(i, northWestScratch); + i.longitude = e.east, i.latitude = e.south; + const s = t.project(i, southEastScratch), c = [0, 0, 0, 0], l = [0, 0, 0, 0]; + let d = EncodedCartesian3.encode(r.x, highLowScratch); + c[0] = d.high, l[0] = d.low, d = EncodedCartesian3.encode(r.y, highLowScratch), c[1] = d.high, l[1] = d.low, d = EncodedCartesian3.encode(o.y, highLowScratch), c[2] = d.high, l[2] = d.low, d = EncodedCartesian3.encode(s.x, highLowScratch), c[3] = d.high, l[3] = d.low, n.planes2D_HIGH = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + value: c + }), n.planes2D_LOW = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + value: l + }); +} +const enuMatrixScratch = new Matrix4(), inverseEnuScratch = new Matrix4(), rectanglePointCartesianScratch = new Cartesian3(), rectangleCenterScratch$2 = new Cartographic(), pointsCartographicScratch = [ + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic() +]; +function computeRectangleBounds(e, t, n, i, r, o) { + const s = Rectangle.center( + e, + rectangleCenterScratch$2 + ); + s.height = n; + const c = Cartographic.toCartesian( + s, + t, + rectanglePointCartesianScratch + ), l = Transforms.eastNorthUpToFixedFrame( + c, + t, + enuMatrixScratch + ), d = Matrix4.inverse(l, inverseEnuScratch), f = e.west, h = e.east, p = e.north, m = e.south, _ = pointsCartographicScratch; + _[0].latitude = m, _[0].longitude = f, _[1].latitude = p, _[1].longitude = f, _[2].latitude = p, _[2].longitude = h, _[3].latitude = m, _[3].longitude = h; + const y = (f + h) * 0.5, C = (p + m) * 0.5; + _[4].latitude = m, _[4].longitude = y, _[5].latitude = p, _[5].longitude = y, _[6].latitude = C, _[6].longitude = f, _[7].latitude = C, _[7].longitude = h; + let T = Number.POSITIVE_INFINITY, x = Number.NEGATIVE_INFINITY, b = Number.POSITIVE_INFINITY, S = Number.NEGATIVE_INFINITY; + for (let P = 0; P < 8; P++) { + _[P].height = n; + const I = Cartographic.toCartesian( + _[P], + t, + rectanglePointCartesianScratch + ); + Matrix4.multiplyByPoint(d, I, I), I.z = 0, T = Math.min(T, I.x), x = Math.max(x, I.x), b = Math.min(b, I.y), S = Math.max(S, I.y); + } + const E = i; + E.x = T, E.y = b, E.z = 0, Matrix4.multiplyByPoint(l, E, E); + const A = r; + A.x = x, A.y = b, A.z = 0, Matrix4.multiplyByPoint(l, A, A), Cartesian3.subtract(A, E, r); + const D = o; + D.x = T, D.y = S, D.z = 0, Matrix4.multiplyByPoint(l, D, D), Cartesian3.subtract(D, E, o); +} +const eastwardScratch = new Cartesian3(), northwardScratch = new Cartesian3(), encodeScratch$1 = new EncodedCartesian3(); +ShadowVolumeAppearance.getPlanarTextureCoordinateAttributes = function(e, t, n, i, r) { + const o = cornerScratch, s = eastwardScratch, c = northwardScratch; + computeRectangleBounds( + e, + n, + defaultValue(r, 0), + o, + s, + c + ); + const l = {}; + addTextureCoordinateRotationAttributes( + l, + t + ); + const d = EncodedCartesian3.fromCartesian(o, encodeScratch$1); + return l.southWest_HIGH = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + normalize: !1, + value: Cartesian3.pack(d.high, [0, 0, 0]) + }), l.southWest_LOW = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + normalize: !1, + value: Cartesian3.pack(d.low, [0, 0, 0]) + }), l.eastward = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + normalize: !1, + value: Cartesian3.pack(s, [0, 0, 0]) + }), l.northward = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + normalize: !1, + value: Cartesian3.pack(c, [0, 0, 0]) + }), add2DTextureCoordinateAttributes(e, i, l), l; +}; +const spherePointScratch$1 = new Cartesian3(); +function latLongToSpherical(e, t, n, i) { + const r = cartographicScratch$4; + r.latitude = e, r.longitude = t, r.height = 0; + const o = Cartographic.toCartesian( + r, + n, + spherePointScratch$1 + ), s = Math.sqrt( + o.x * o.x + o.y * o.y + ), c = CesiumMath.fastApproximateAtan2(s, o.z), l = CesiumMath.fastApproximateAtan2( + o.x, + o.y + ); + return i.x = c, i.y = l, i; +} +const sphericalScratch = new Cartesian2(); +ShadowVolumeAppearance.getSphericalExtentGeometryInstanceAttributes = function(e, t, n, i) { + const r = latLongToSpherical( + e.south, + e.west, + n, + sphericalScratch + ); + let o = r.x, s = r.y; + const c = latLongToSpherical( + e.north, + e.east, + n, + sphericalScratch + ); + let l = c.x, d = c.y, f = 0; + s > d && (f = CesiumMath.PI - s, s = -CesiumMath.PI, d += f), o -= CesiumMath.EPSILON5, s -= CesiumMath.EPSILON5, l += CesiumMath.EPSILON5, d += CesiumMath.EPSILON5; + const h = 1 / (d - s), p = 1 / (l - o), m = { + sphericalExtents: new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + value: [o, s, p, h] + }), + longitudeRotation: new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 1, + normalize: !1, + value: [f] + }) + }; + return addTextureCoordinateRotationAttributes( + m, + t + ), add2DTextureCoordinateAttributes(e, i, m), m; +}; +ShadowVolumeAppearance.hasAttributesForTextureCoordinatePlanes = function(e) { + return defined(e.southWest_HIGH) && defined(e.southWest_LOW) && defined(e.northward) && defined(e.eastward) && defined(e.planes2D_HIGH) && defined(e.planes2D_LOW) && defined(e.uMaxVmax) && defined(e.uvMinAndExtents); +}; +ShadowVolumeAppearance.hasAttributesForSphericalExtents = function(e) { + return defined(e.sphericalExtents) && defined(e.longitudeRotation) && defined(e.planes2D_HIGH) && defined(e.planes2D_LOW) && defined(e.uMaxVmax) && defined(e.uvMinAndExtents); +}; +function shouldUseSpherical(e) { + return Math.max(e.width, e.height) > ShadowVolumeAppearance.MAX_WIDTH_FOR_PLANAR_EXTENTS; +} +ShadowVolumeAppearance.shouldUseSphericalCoordinates = function(e) { + return shouldUseSpherical(e); +}; +ShadowVolumeAppearance.MAX_WIDTH_FOR_PLANAR_EXTENTS = CesiumMath.toRadians(1); +const StencilFunction = { + /** + * The stencil test never passes. + * + * @type {number} + * @constant + */ + NEVER: WebGLConstants$1.NEVER, + /** + * The stencil test passes when the masked reference value is less than the masked stencil value. + * + * @type {number} + * @constant + */ + LESS: WebGLConstants$1.LESS, + /** + * The stencil test passes when the masked reference value is equal to the masked stencil value. + * + * @type {number} + * @constant + */ + EQUAL: WebGLConstants$1.EQUAL, + /** + * The stencil test passes when the masked reference value is less than or equal to the masked stencil value. + * + * @type {number} + * @constant + */ + LESS_OR_EQUAL: WebGLConstants$1.LEQUAL, + /** + * The stencil test passes when the masked reference value is greater than the masked stencil value. + * + * @type {number} + * @constant + */ + GREATER: WebGLConstants$1.GREATER, + /** + * The stencil test passes when the masked reference value is not equal to the masked stencil value. + * + * @type {number} + * @constant + */ + NOT_EQUAL: WebGLConstants$1.NOTEQUAL, + /** + * The stencil test passes when the masked reference value is greater than or equal to the masked stencil value. + * + * @type {number} + * @constant + */ + GREATER_OR_EQUAL: WebGLConstants$1.GEQUAL, + /** + * The stencil test always passes. + * + * @type {number} + * @constant + */ + ALWAYS: WebGLConstants$1.ALWAYS +}, StencilFunction$1 = Object.freeze(StencilFunction), StencilOperation = { + /** + * Sets the stencil buffer value to zero. + * + * @type {number} + * @constant + */ + ZERO: WebGLConstants$1.ZERO, + /** + * Does not change the stencil buffer. + * + * @type {number} + * @constant + */ + KEEP: WebGLConstants$1.KEEP, + /** + * Replaces the stencil buffer value with the reference value. + * + * @type {number} + * @constant + */ + REPLACE: WebGLConstants$1.REPLACE, + /** + * Increments the stencil buffer value, clamping to unsigned byte. + * + * @type {number} + * @constant + */ + INCREMENT: WebGLConstants$1.INCR, + /** + * Decrements the stencil buffer value, clamping to zero. + * + * @type {number} + * @constant + */ + DECREMENT: WebGLConstants$1.DECR, + /** + * Bitwise inverts the existing stencil buffer value. + * + * @type {number} + * @constant + */ + INVERT: WebGLConstants$1.INVERT, + /** + * Increments the stencil buffer value, wrapping to zero when exceeding the unsigned byte range. + * + * @type {number} + * @constant + */ + INCREMENT_WRAP: WebGLConstants$1.INCR_WRAP, + /** + * Decrements the stencil buffer value, wrapping to the maximum unsigned byte instead of going below zero. + * + * @type {number} + * @constant + */ + DECREMENT_WRAP: WebGLConstants$1.DECR_WRAP +}, StencilOperation$1 = Object.freeze(StencilOperation), StencilConstants = { + CESIUM_3D_TILE_MASK: 128, + SKIP_LOD_MASK: 112, + SKIP_LOD_BIT_SHIFT: 4, + CLASSIFICATION_MASK: 15 +}; +StencilConstants.setCesium3DTileBit = function() { + return { + enabled: !0, + frontFunction: StencilFunction$1.ALWAYS, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.REPLACE + }, + backFunction: StencilFunction$1.ALWAYS, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.REPLACE + }, + reference: StencilConstants.CESIUM_3D_TILE_MASK, + mask: StencilConstants.CESIUM_3D_TILE_MASK + }; +}; +const StencilConstants$1 = Object.freeze(StencilConstants); +function ClassificationPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.geometryInstances; + this.geometryInstances = t, this.show = defaultValue(e.show, !0), this.classificationType = defaultValue( + e.classificationType, + ClassificationType$1.BOTH + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.debugShowShadowVolume = defaultValue( + e.debugShowShadowVolume, + !1 + ), this._debugShowShadowVolume = !1, this._extruded = defaultValue(e._extruded, !1), this._uniformMap = e._uniformMap, this._sp = void 0, this._spStencil = void 0, this._spPick = void 0, this._spColor = void 0, this._spPick2D = void 0, this._spColor2D = void 0, this._rsStencilDepthPass = void 0, this._rsStencilDepthPass3DTiles = void 0, this._rsColorPass = void 0, this._rsPickPass = void 0, this._commandsIgnoreShow = [], this._ready = !1, this._primitive = void 0, this._pickPrimitive = e._pickPrimitive, this._hasSphericalExtentsAttribute = !1, this._hasPlanarExtentsAttributes = !1, this._hasPerColorAttribute = !1, this.appearance = e.appearance, this._createBoundingVolumeFunction = e._createBoundingVolumeFunction, this._updateAndQueueCommandsFunction = e._updateAndQueueCommandsFunction, this._usePickOffsets = !1, this._primitiveOptions = { + geometryInstances: void 0, + appearance: void 0, + vertexCacheOptimize: defaultValue(e.vertexCacheOptimize, !1), + interleave: defaultValue(e.interleave, !1), + releaseGeometryInstances: defaultValue( + e.releaseGeometryInstances, + !0 + ), + allowPicking: defaultValue(e.allowPicking, !0), + asynchronous: defaultValue(e.asynchronous, !0), + compressVertices: defaultValue(e.compressVertices, !0), + _createBoundingVolumeFunction: void 0, + _createRenderStatesFunction: void 0, + _createShaderProgramFunction: void 0, + _createCommandsFunction: void 0, + _updateAndQueueCommandsFunction: void 0, + _createPickOffsets: !0 + }; +} +Object.defineProperties(ClassificationPrimitive.prototype, { + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + vertexCacheOptimize: { + get: function() { + return this._primitiveOptions.vertexCacheOptimize; + } + }, + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + interleave: { + get: function() { + return this._primitiveOptions.interleave; + } + }, + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + releaseGeometryInstances: { + get: function() { + return this._primitiveOptions.releaseGeometryInstances; + } + }, + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + allowPicking: { + get: function() { + return this._primitiveOptions.allowPicking; + } + }, + /** + * Determines if the geometry instances will be created and batched on a web worker. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + asynchronous: { + get: function() { + return this._primitiveOptions.asynchronous; + } + }, + /** + * When true, geometry vertices are compressed, which will save memory. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + compressVertices: { + get: function() { + return this._primitiveOptions.compressVertices; + } + }, + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link ClassificationPrimitive#update} + * is called. + * + * @memberof ClassificationPrimitive.prototype + * + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * Returns true if the ClassificationPrimitive needs a separate shader and commands for 2D. + * This is because texture coordinates on ClassificationPrimitives are computed differently, + * and are used for culling when multiple GeometryInstances are batched in one ClassificationPrimitive. + * @memberof ClassificationPrimitive.prototype + * @type {boolean} + * @readonly + * @private + */ + _needs2DShader: { + get: function() { + return this._hasPlanarExtentsAttributes || this._hasSphericalExtentsAttribute; + } + } +}); +ClassificationPrimitive.isSupported = function(e) { + return e.context.stencilBuffer; +}; +function getStencilDepthRenderState$2(e, t) { + const n = t ? StencilFunction$1.EQUAL : StencilFunction$1.ALWAYS; + return { + colorMask: { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, + stencilTest: { + enabled: e, + frontFunction: n, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.DECREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + backFunction: n, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.INCREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS_OR_EQUAL + }, + depthMask: !1 + }; +} +function getColorRenderState(e) { + return { + stencilTest: { + enabled: e, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND + }; +} +const pickRenderState$2 = { + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1 +}; +function createRenderStates$4(e, t, n, i) { + if (defined(e._rsStencilDepthPass)) + return; + const r = !e.debugShowShadowVolume; + e._rsStencilDepthPass = RenderState.fromCache( + getStencilDepthRenderState$2(r, !1) + ), e._rsStencilDepthPass3DTiles = RenderState.fromCache( + getStencilDepthRenderState$2(r, !0) + ), e._rsColorPass = RenderState.fromCache( + getColorRenderState(r) + ), e._rsPickPass = RenderState.fromCache(pickRenderState$2); +} +function modifyForEncodedNormals(e, t) { + if (!e.compressVertices) + return t; + if (t.search(/in\s+vec3\s+extrudeDirection;/g) !== -1) { + const n = "compressedAttributes", i = `in vec2 ${n};`, r = `vec3 extrudeDirection; +`, o = ` extrudeDirection = czm_octDecode(${n}, 65535.0); +`; + let s = t; + s = s.replace(/in\s+vec3\s+extrudeDirection;/g, ""), s = ShaderSource.replaceMain( + s, + "czm_non_compressed_main" + ); + const c = `void main() +{ +${o} czm_non_compressed_main(); +}`; + return [i, r, s, c].join(` +`); + } +} +function createShaderProgram$2(e, t) { + const n = t.context, i = e._primitive; + let r = ShadowVolumeAppearanceVS; + r = e._primitive._batchTable.getVertexShaderCallback()( + r + ), r = Primitive$3._appendDistanceDisplayConditionToShader(i, r), r = Primitive$3._modifyShaderPosition( + e, + r, + t.scene3DOnly + ), r = Primitive$3._updateColorAttribute(i, r); + const o = e._hasPlanarExtentsAttributes, s = o || e._hasSphericalExtentsAttribute; + e._extruded && (r = modifyForEncodedNormals(i, r)); + const c = e._extruded ? "EXTRUDED_GEOMETRY" : ""; + let l = new ShaderSource({ + defines: [c], + sources: [r] + }); + const d = new ShaderSource({ + sources: [ShadowVolumeFS] + }), f = e._primitive._attributeLocations, h = new ShadowVolumeAppearance( + s, + o, + e.appearance + ); + if (e._spStencil = ShaderProgram.replaceCache({ + context: n, + shaderProgram: e._spStencil, + vertexShaderSource: l, + fragmentShaderSource: d, + attributeLocations: f + }), e._primitive.allowPicking) { + let _ = ShaderSource.createPickVertexShaderSource(r); + _ = Primitive$3._appendShowToShader(i, _), _ = Primitive$3._updatePickColorAttribute(_); + const y = h.createPickFragmentShader(!1), C = h.createPickVertexShader( + [c], + _, + !1, + t.mapProjection + ); + if (e._spPick = ShaderProgram.replaceCache({ + context: n, + shaderProgram: e._spPick, + vertexShaderSource: C, + fragmentShaderSource: y, + attributeLocations: f + }), s) { + let T = n.shaderCache.getDerivedShaderProgram( + e._spPick, + "2dPick" + ); + if (!defined(T)) { + const x = h.createPickFragmentShader(!0), b = h.createPickVertexShader( + [c], + _, + !0, + t.mapProjection + ); + T = n.shaderCache.createDerivedShaderProgram( + e._spPick, + "2dPick", + { + vertexShaderSource: b, + fragmentShaderSource: x, + attributeLocations: f + } + ); + } + e._spPick2D = T; + } + } else + e._spPick = ShaderProgram.fromCache({ + context: n, + vertexShaderSource: l, + fragmentShaderSource: d, + attributeLocations: f + }); + r = Primitive$3._appendShowToShader(i, r), l = new ShaderSource({ + defines: [c], + sources: [r] + }), e._sp = ShaderProgram.replaceCache({ + context: n, + shaderProgram: e._sp, + vertexShaderSource: l, + fragmentShaderSource: d, + attributeLocations: f + }); + const p = h.createFragmentShader(!1), m = h.createVertexShader( + [c], + r, + !1, + t.mapProjection + ); + if (e._spColor = ShaderProgram.replaceCache({ + context: n, + shaderProgram: e._spColor, + vertexShaderSource: m, + fragmentShaderSource: p, + attributeLocations: f + }), s) { + let _ = n.shaderCache.getDerivedShaderProgram( + e._spColor, + "2dColor" + ); + if (!defined(_)) { + const y = h.createFragmentShader(!0), C = h.createVertexShader( + [c], + r, + !0, + t.mapProjection + ); + _ = n.shaderCache.createDerivedShaderProgram( + e._spColor, + "2dColor", + { + vertexShaderSource: C, + fragmentShaderSource: y, + attributeLocations: f + } + ); + } + e._spColor2D = _; + } +} +function createColorCommands$1(e, t) { + const n = e._primitive; + let i = n._va.length * 2; + t.length = i; + let r, o, s, c = 0, l = n._batchTable.getUniformMapCallback()( + e._uniformMap + ); + const d = e._needs2DShader; + for (r = 0; r < i; r += 2) { + const m = n._va[c++]; + o = t[r], defined(o) || (o = t[r] = new DrawCommand({ + owner: e, + primitiveType: n._primitiveType + })), o.vertexArray = m, o.renderState = e._rsStencilDepthPass, o.shaderProgram = e._sp, o.uniformMap = l, o.pass = Pass$1.TERRAIN_CLASSIFICATION, s = DrawCommand.shallowClone( + o, + o.derivedCommands.tileset + ), s.renderState = e._rsStencilDepthPass3DTiles, s.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, o.derivedCommands.tileset = s, o = t[r + 1], defined(o) || (o = t[r + 1] = new DrawCommand({ + owner: e, + primitiveType: n._primitiveType + })), o.vertexArray = m, o.renderState = e._rsColorPass, o.shaderProgram = e._spColor, o.pass = Pass$1.TERRAIN_CLASSIFICATION; + const y = e.appearance.material; + if (defined(y) && (l = combine$2(l, y._uniforms)), o.uniformMap = l, s = DrawCommand.shallowClone( + o, + o.derivedCommands.tileset + ), s.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, o.derivedCommands.tileset = s, d) { + let C = DrawCommand.shallowClone( + o, + o.derivedCommands.appearance2D + ); + C.shaderProgram = e._spColor2D, o.derivedCommands.appearance2D = C, C = DrawCommand.shallowClone( + s, + s.derivedCommands.appearance2D + ), C.shaderProgram = e._spColor2D, s.derivedCommands.appearance2D = C; + } + } + const f = e._commandsIgnoreShow, h = e._spStencil; + let p = 0; + i = f.length = i / 2; + for (let m = 0; m < i; ++m) { + const _ = f[m] = DrawCommand.shallowClone( + t[p], + f[m] + ); + _.shaderProgram = h, _.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW, p += 2; + } +} +function createPickCommands$2(e, t) { + const n = e._usePickOffsets, i = e._primitive; + let r = i._va.length * 2, o, s = 0, c; + n && (o = i._pickOffsets, r = o.length * 2), t.length = r; + let l, d, f, h = 0; + const p = i._batchTable.getUniformMapCallback()( + e._uniformMap + ), m = e._needs2DShader; + for (l = 0; l < r; l += 2) { + let _ = i._va[h++]; + if (n && (c = o[s++], _ = i._va[c.index]), d = t[l], defined(d) || (d = t[l] = new DrawCommand({ + owner: e, + primitiveType: i._primitiveType, + pickOnly: !0 + })), d.vertexArray = _, d.renderState = e._rsStencilDepthPass, d.shaderProgram = e._sp, d.uniformMap = p, d.pass = Pass$1.TERRAIN_CLASSIFICATION, n && (d.offset = c.offset, d.count = c.count), f = DrawCommand.shallowClone( + d, + d.derivedCommands.tileset + ), f.renderState = e._rsStencilDepthPass3DTiles, f.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, d.derivedCommands.tileset = f, d = t[l + 1], defined(d) || (d = t[l + 1] = new DrawCommand({ + owner: e, + primitiveType: i._primitiveType, + pickOnly: !0 + })), d.vertexArray = _, d.renderState = e._rsPickPass, d.shaderProgram = e._spPick, d.uniformMap = p, d.pass = Pass$1.TERRAIN_CLASSIFICATION, n && (d.offset = c.offset, d.count = c.count), f = DrawCommand.shallowClone( + d, + d.derivedCommands.tileset + ), f.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, d.derivedCommands.tileset = f, m) { + let y = DrawCommand.shallowClone( + d, + d.derivedCommands.pick2D + ); + y.shaderProgram = e._spPick2D, d.derivedCommands.pick2D = y, y = DrawCommand.shallowClone( + f, + f.derivedCommands.pick2D + ), y.shaderProgram = e._spPick2D, f.derivedCommands.pick2D = y; + } + } +} +function createCommands$3(e, t, n, i, r, o, s) { + createColorCommands$1(e, o), createPickCommands$2(e, s); +} +function boundingVolumeIndex$1(e, t) { + return Math.floor(e % t / 2); +} +function updateAndQueueRenderCommand$1(e, t, n, i, r, o) { + e.modelMatrix = n, e.boundingVolume = r, e.cull = i, e.debugShowBoundingVolume = o, t.commandList.push(e); +} +function updateAndQueuePickCommand$1(e, t, n, i, r) { + e.modelMatrix = n, e.boundingVolume = r, e.cull = i, t.commandList.push(e); +} +function updateAndQueueCommands$2(e, t, n, i, r, o, s, c) { + const l = e._primitive; + Primitive$3._updateBoundingVolumes(l, t, r); + let d; + t.mode === SceneMode$1.SCENE3D ? d = l._boundingSphereWC : t.mode === SceneMode$1.COLUMBUS_VIEW ? d = l._boundingSphereCV : t.mode === SceneMode$1.SCENE2D && defined(l._boundingSphere2D) ? d = l._boundingSphere2D : defined(l._boundingSphereMorph) && (d = l._boundingSphereMorph); + const f = e.classificationType, h = f !== ClassificationType$1.CESIUM_3D_TILE, p = f !== ClassificationType$1.TERRAIN, m = t.passes; + let _, y, C; + if (m.render) { + const T = n.length; + for (_ = 0; _ < T; ++_) + y = d[boundingVolumeIndex$1(_, T)], h && (C = n[_], updateAndQueueRenderCommand$1( + C, + t, + r, + o, + y, + s + )), p && (C = n[_].derivedCommands.tileset, updateAndQueueRenderCommand$1( + C, + t, + r, + o, + y, + s + )); + if (t.invertClassification) { + const x = e._commandsIgnoreShow, b = x.length; + for (_ = 0; _ < b; ++_) + y = d[_], C = x[_], updateAndQueueRenderCommand$1( + C, + t, + r, + o, + y, + s + ); + } + } + if (m.pick) { + const T = i.length, x = l._pickOffsets; + for (_ = 0; _ < T; ++_) { + const b = x[boundingVolumeIndex$1(_, T)]; + y = d[b.index], h && (C = i[_], updateAndQueuePickCommand$1( + C, + t, + r, + o, + y + )), p && (C = i[_].derivedCommands.tileset, updateAndQueuePickCommand$1( + C, + t, + r, + o, + y + )); + } + } +} +ClassificationPrimitive.prototype.update = function(e) { + if (!defined(this._primitive) && !defined(this.geometryInstances)) + return; + let t = this.appearance; + defined(t) && defined(t.material) && t.material.update(e.context); + const n = this, i = this._primitiveOptions; + if (!defined(this._primitive)) { + const r = Array.isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances], o = r.length; + let s, c, l, d = !1, f = !0, h, p = !1, m = !1; + for (o > 0 && (l = r[0].attributes, p = ShadowVolumeAppearance.hasAttributesForSphericalExtents( + l + ), m = ShadowVolumeAppearance.hasAttributesForTextureCoordinatePlanes( + l + ), h = l.color), s = 0; s < o; s++) { + c = r[s]; + const y = c.attributes.color; + defined(y) && (d = !0), f = f && defined(y) && ColorGeometryInstanceAttribute.equals(h, y); + } + if (!f && !p && !m) + throw new DeveloperError( + "All GeometryInstances must have the same color attribute except via GroundPrimitives" + ); + d && !defined(t) && (t = new PerInstanceColorAppearance({ + flat: !0 + }), this.appearance = t), this._usePickOffsets = !p && !m, this._hasSphericalExtentsAttribute = p, this._hasPlanarExtentsAttributes = m, this._hasPerColorAttribute = d; + const _ = new Array(o); + for (s = 0; s < o; ++s) + c = r[s], _[s] = new GeometryInstance({ + geometry: c.geometry, + attributes: c.attributes, + modelMatrix: c.modelMatrix, + id: c.id, + pickPrimitive: defaultValue(this._pickPrimitive, n) + }); + i.appearance = t, i.geometryInstances = _, defined(this._createBoundingVolumeFunction) && (i._createBoundingVolumeFunction = function(y, C) { + n._createBoundingVolumeFunction(y, C); + }), i._createRenderStatesFunction = function(y, C, T, x) { + createRenderStates$4(n); + }, i._createShaderProgramFunction = function(y, C, T) { + createShaderProgram$2(n, C); + }, i._createCommandsFunction = function(y, C, T, x, b, S, E) { + createCommands$3( + n, + void 0, + void 0, + !0, + !1, + S, + E + ); + }, defined(this._updateAndQueueCommandsFunction) ? i._updateAndQueueCommandsFunction = function(y, C, T, x, b, S, E, A) { + n._updateAndQueueCommandsFunction( + y, + C, + T, + x, + b, + S, + E, + A + ); + } : i._updateAndQueueCommandsFunction = function(y, C, T, x, b, S, E, A) { + updateAndQueueCommands$2( + n, + C, + T, + x, + b, + S, + E + ); + }, this._primitive = new Primitive$3(i); + } + this.debugShowShadowVolume && !this._debugShowShadowVolume && this._ready ? (this._debugShowShadowVolume = !0, this._rsStencilDepthPass = RenderState.fromCache( + getStencilDepthRenderState$2(!1, !1) + ), this._rsStencilDepthPass3DTiles = RenderState.fromCache( + getStencilDepthRenderState$2(!1, !0) + ), this._rsColorPass = RenderState.fromCache(getColorRenderState(!1))) : !this.debugShowShadowVolume && this._debugShowShadowVolume && (this._debugShowShadowVolume = !1, this._rsStencilDepthPass = RenderState.fromCache( + getStencilDepthRenderState$2(!0, !1) + ), this._rsStencilDepthPass3DTiles = RenderState.fromCache( + getStencilDepthRenderState$2(!0, !0) + ), this._rsColorPass = RenderState.fromCache(getColorRenderState(!0))), this._primitive.appearance !== t && (this._primitive.appearance = t), this._primitive.show = this.show, this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume, this._primitive.update(e), e.afterRender.push(() => { + defined(this._primitive) && this._primitive.ready && (this._ready = !0, this.releaseGeometryInstances && (this.geometryInstances = void 0)); + }); +}; +ClassificationPrimitive.prototype.getGeometryInstanceAttributes = function(e) { + return this._primitive.getGeometryInstanceAttributes(e); +}; +ClassificationPrimitive.prototype.isDestroyed = function() { + return !1; +}; +ClassificationPrimitive.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), this._sp = this._sp && this._sp.destroy(), this._spPick = this._spPick && this._spPick.destroy(), this._spColor = this._spColor && this._spColor.destroy(), this._spPick2D = void 0, this._spColor2D = void 0, destroyObject(this); +}; +const GroundPrimitiveUniformMap = { + u_globeMinimumAltitude: function() { + return 55e3; + } +}; +function GroundPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = e.appearance; + const n = e.geometryInstances; + if (!defined(t) && defined(n)) { + const r = Array.isArray(n) ? n : [n], o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s].attributes; + if (defined(c) && defined(c.color)) { + t = new PerInstanceColorAppearance({ + flat: !0 + }); + break; + } + } + } + this.appearance = t, this.geometryInstances = e.geometryInstances, this.show = defaultValue(e.show, !0), this.classificationType = defaultValue( + e.classificationType, + ClassificationType$1.BOTH + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.debugShowShadowVolume = defaultValue( + e.debugShowShadowVolume, + !1 + ), this._boundingVolumes = [], this._boundingVolumes2D = [], this._ready = !1, this._primitive = void 0, this._maxHeight = void 0, this._minHeight = void 0, this._maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight, this._minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight, this._boundingSpheresKeys = [], this._boundingSpheres = [], this._useFragmentCulling = !1, this._zIndex = void 0; + const i = this; + this._classificationPrimitiveOptions = { + geometryInstances: void 0, + appearance: void 0, + vertexCacheOptimize: defaultValue(e.vertexCacheOptimize, !1), + interleave: defaultValue(e.interleave, !1), + releaseGeometryInstances: defaultValue( + e.releaseGeometryInstances, + !0 + ), + allowPicking: defaultValue(e.allowPicking, !0), + asynchronous: defaultValue(e.asynchronous, !0), + compressVertices: defaultValue(e.compressVertices, !0), + _createBoundingVolumeFunction: void 0, + _updateAndQueueCommandsFunction: void 0, + _pickPrimitive: i, + _extruded: !0, + _uniformMap: GroundPrimitiveUniformMap + }; +} +Object.defineProperties(GroundPrimitive.prototype, { + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + vertexCacheOptimize: { + get: function() { + return this._classificationPrimitiveOptions.vertexCacheOptimize; + } + }, + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + interleave: { + get: function() { + return this._classificationPrimitiveOptions.interleave; + } + }, + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + releaseGeometryInstances: { + get: function() { + return this._classificationPrimitiveOptions.releaseGeometryInstances; + } + }, + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + allowPicking: { + get: function() { + return this._classificationPrimitiveOptions.allowPicking; + } + }, + /** + * Determines if the geometry instances will be created and batched on a web worker. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + asynchronous: { + get: function() { + return this._classificationPrimitiveOptions.asynchronous; + } + }, + /** + * When true, geometry vertices are compressed, which will save memory. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + compressVertices: { + get: function() { + return this._classificationPrimitiveOptions.compressVertices; + } + }, + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPrimitive#update} + * is called. + * + * @memberof GroundPrimitive.prototype + * + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + } +}); +GroundPrimitive.isSupported = ClassificationPrimitive.isSupported; +function getComputeMaximumHeightFunction(e) { + return function(t, n) { + const i = n.maximumRadius, r = i / Math.cos(t * 0.5) - i; + return e._maxHeight + r; + }; +} +function getComputeMinimumHeightFunction(e) { + return function(t, n) { + return e._minHeight; + }; +} +const scratchBVCartesianHigh = new Cartesian3(), scratchBVCartesianLow = new Cartesian3(), scratchBVCartesian = new Cartesian3(), scratchBVCartographic$1 = new Cartographic(), scratchBVRectangle = new Rectangle(); +function getRectangle(e, t) { + const n = e.mapProjection.ellipsoid; + if (!defined(t.attributes) || !defined(t.attributes.position3DHigh)) + return defined(t.rectangle) ? t.rectangle : void 0; + const i = t.attributes.position3DHigh.values, r = t.attributes.position3DLow.values, o = i.length; + let s = Number.POSITIVE_INFINITY, c = Number.POSITIVE_INFINITY, l = Number.NEGATIVE_INFINITY, d = Number.NEGATIVE_INFINITY; + for (let h = 0; h < o; h += 3) { + const p = Cartesian3.unpack( + i, + h, + scratchBVCartesianHigh + ), m = Cartesian3.unpack( + r, + h, + scratchBVCartesianLow + ), _ = Cartesian3.add( + p, + m, + scratchBVCartesian + ), y = n.cartesianToCartographic( + _, + scratchBVCartographic$1 + ), C = y.latitude, T = y.longitude; + s = Math.min(s, C), c = Math.min(c, T), l = Math.max(l, C), d = Math.max(d, T); + } + const f = scratchBVRectangle; + return f.north = l, f.south = s, f.east = d, f.west = c, f; +} +function setMinMaxTerrainHeights(e, t, n) { + const i = ApproximateTerrainHeights.getMinimumMaximumHeights( + t, + n + ); + e._minTerrainHeight = i.minimumTerrainHeight, e._maxTerrainHeight = i.maximumTerrainHeight; +} +function createBoundingVolume(e, t, n) { + const i = t.mapProjection.ellipsoid, r = getRectangle(t, n), o = OrientedBoundingBox.fromRectangle( + r, + e._minHeight, + e._maxHeight, + i + ); + if (e._boundingVolumes.push(o), !t.scene3DOnly) { + const s = t.mapProjection, c = BoundingSphere.fromRectangleWithHeights2D( + r, + s, + e._maxHeight, + e._minHeight + ); + Cartesian3.fromElements( + c.center.z, + c.center.x, + c.center.y, + c.center + ), e._boundingVolumes2D.push(c); + } +} +function boundingVolumeIndex(e, t) { + return Math.floor(e % t / 2); +} +function updateAndQueueRenderCommand(e, t, n, i, r, o, s) { + const c = e._primitive; + n.mode !== SceneMode$1.SCENE3D && t.shaderProgram === c._spColor && c._needs2DShader && (t = t.derivedCommands.appearance2D), t.owner = e, t.modelMatrix = i, t.boundingVolume = o, t.cull = r, t.debugShowBoundingVolume = s, n.commandList.push(t); +} +function updateAndQueuePickCommand(e, t, n, i, r, o) { + const s = e._primitive; + n.mode !== SceneMode$1.SCENE3D && t.shaderProgram === s._spPick && s._needs2DShader && (t = t.derivedCommands.pick2D), t.owner = e, t.modelMatrix = i, t.boundingVolume = o, t.cull = r, n.commandList.push(t); +} +function updateAndQueueCommands$1(e, t, n, i, r, o, s, c) { + let l; + t.mode === SceneMode$1.SCENE3D ? l = e._boundingVolumes : l = e._boundingVolumes2D; + const d = e.classificationType, f = d !== ClassificationType$1.CESIUM_3D_TILE, h = d !== ClassificationType$1.TERRAIN, p = t.passes, m = e._primitive; + let _, y, C; + if (p.render) { + const T = n.length; + for (_ = 0; _ < T; ++_) + y = l[boundingVolumeIndex(_, T)], f && (C = n[_], updateAndQueueRenderCommand( + e, + C, + t, + r, + o, + y, + s + )), h && (C = n[_].derivedCommands.tileset, updateAndQueueRenderCommand( + e, + C, + t, + r, + o, + y, + s + )); + if (t.invertClassification) { + const x = m._commandsIgnoreShow, b = x.length; + for (_ = 0; _ < b; ++_) + y = l[_], C = x[_], updateAndQueueRenderCommand( + e, + C, + t, + r, + o, + y, + s + ); + } + } + if (p.pick) { + const T = i.length; + let x; + for (e._useFragmentCulling || (x = m._primitive._pickOffsets), _ = 0; _ < T; ++_) { + if (y = l[boundingVolumeIndex(_, T)], !e._useFragmentCulling) { + const b = x[boundingVolumeIndex(_, T)]; + y = l[b.index]; + } + f && (C = i[_], updateAndQueuePickCommand( + e, + C, + t, + r, + o, + y + )), h && (C = i[_].derivedCommands.tileset, updateAndQueuePickCommand( + e, + C, + t, + r, + o, + y + )); + } + } +} +GroundPrimitive.initializeTerrainHeights = function() { + return ApproximateTerrainHeights.initialize(); +}; +GroundPrimitive.prototype.update = function(e) { + if (!defined(this._primitive) && !defined(this.geometryInstances)) + return; + if (!ApproximateTerrainHeights.initialized) { + GroundPrimitive.initializeTerrainHeights(); + return; + } + const t = this, n = this._classificationPrimitiveOptions; + if (!defined(this._primitive)) { + const i = e.mapProjection.ellipsoid; + let r, o, s; + const c = Array.isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances], l = c.length, d = new Array(l); + let f, h; + for (f = 0; f < l; ++f) { + r = c[f], o = r.geometry; + const y = getRectangle(e, o); + defined(h) ? defined(y) && Rectangle.union(h, y, h) : h = Rectangle.clone(y); + const C = r.id; + if (defined(C) && defined(y)) { + const T = ApproximateTerrainHeights.getBoundingSphere( + y, + i + ); + this._boundingSpheresKeys.push(C), this._boundingSpheres.push(T); + } + s = o.constructor, !defined(s) || defined(s.createShadowVolume); + } + setMinMaxTerrainHeights(this, h, i); + const p = e.verticalExaggeration, m = e.verticalExaggerationRelativeHeight; + this._minHeight = VerticalExaggeration.getHeight( + this._minTerrainHeight, + p, + m + ), this._maxHeight = VerticalExaggeration.getHeight( + this._maxTerrainHeight, + p, + m + ); + const _ = GroundPrimitive._supportsMaterials( + e.context + ); + if (this._useFragmentCulling = _, _) { + let y, C = !0; + for (f = 0; f < l; ++f) + if (r = c[f], o = r.geometry, h = getRectangle(e, o), ShadowVolumeAppearance.shouldUseSphericalCoordinates(h)) { + C = !1; + break; + } + for (f = 0; f < l; ++f) { + r = c[f], o = r.geometry, s = o.constructor; + const T = getRectangle(e, o), x = o.textureCoordinateRotationPoints; + C ? y = ShadowVolumeAppearance.getPlanarTextureCoordinateAttributes( + T, + x, + i, + e.mapProjection, + this._maxHeight + ) : y = ShadowVolumeAppearance.getSphericalExtentGeometryInstanceAttributes( + T, + x, + i, + e.mapProjection + ); + const b = r.attributes; + for (const S in b) + b.hasOwnProperty(S) && (y[S] = b[S]); + d[f] = new GeometryInstance({ + geometry: s.createShadowVolume( + o, + getComputeMinimumHeightFunction(this), + getComputeMaximumHeightFunction(this) + ), + attributes: y, + id: r.id + }); + } + } else + for (f = 0; f < l; ++f) + r = c[f], o = r.geometry, s = o.constructor, d[f] = new GeometryInstance({ + geometry: s.createShadowVolume( + o, + getComputeMinimumHeightFunction(this), + getComputeMaximumHeightFunction(this) + ), + attributes: r.attributes, + id: r.id + }); + n.geometryInstances = d, n.appearance = this.appearance, n._createBoundingVolumeFunction = function(y, C) { + createBoundingVolume(t, y, C); + }, n._updateAndQueueCommandsFunction = function(y, C, T, x, b, S, E, A) { + updateAndQueueCommands$1( + t, + C, + T, + x, + b, + S, + E + ); + }, this._primitive = new ClassificationPrimitive(n); + } + this._primitive.appearance = this.appearance, this._primitive.show = this.show, this._primitive.debugShowShadowVolume = this.debugShowShadowVolume, this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume, this._primitive.update(e), e.afterRender.push(() => { + !this._ready && defined(this._primitive) && this._primitive.ready && (this._ready = !0, this.releaseGeometryInstances && (this.geometryInstances = void 0)); + }); +}; +GroundPrimitive.prototype.getBoundingSphere = function(e) { + const t = this._boundingSpheresKeys.indexOf(e); + if (t !== -1) + return this._boundingSpheres[t]; +}; +GroundPrimitive.prototype.getGeometryInstanceAttributes = function(e) { + return this._primitive.getGeometryInstanceAttributes(e); +}; +GroundPrimitive.prototype.isDestroyed = function() { + return !1; +}; +GroundPrimitive.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), destroyObject(this); +}; +GroundPrimitive._supportsMaterials = function(e) { + return e.depthTexture; +}; +GroundPrimitive.supportsMaterials = function(e) { + return GroundPrimitive._supportsMaterials(e.frameState.context); +}; +function MaterialProperty() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(MaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof MaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof MaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: DeveloperError.throwInstantiationError + } +}); +MaterialProperty.prototype.getType = DeveloperError.throwInstantiationError; +MaterialProperty.prototype.getValue = DeveloperError.throwInstantiationError; +MaterialProperty.prototype.equals = DeveloperError.throwInstantiationError; +const timeScratch$q = new JulianDate(); +MaterialProperty.getValue = function(e, t, n) { + let i; + return defined(e) || (e = JulianDate.now(timeScratch$q)), defined(t) && (i = t.getType(e), defined(i)) ? ((!defined(n) || n.type !== i) && (n = Material$4.fromType(i)), t.getValue(e, n.uniforms), n) : ((!defined(n) || n.type !== Material$4.ColorType) && (n = Material$4.fromType(Material$4.ColorType)), Color.clone(Color.WHITE, n.uniforms.color), n); +}; +function DynamicGeometryUpdater$1(e, t, n) { + this._primitives = t, this._orderedGroundPrimitives = n, this._primitive = void 0, this._outlinePrimitive = void 0, this._geometryUpdater = e, this._options = e._options, this._entity = e._entity, this._material = void 0; +} +DynamicGeometryUpdater$1.prototype._isHidden = function(e, t, n) { + return !e.isShowing || !e.isAvailable(n) || !Property.getValueOrDefault(t.show, n, !0); +}; +DynamicGeometryUpdater$1.prototype._setOptions = DeveloperError.throwInstantiationError; +DynamicGeometryUpdater$1.prototype.update = function(e) { + const t = this._geometryUpdater, n = t._onTerrain, i = this._primitives, r = this._orderedGroundPrimitives; + n ? r.remove(this._primitive) : (i.removeAndDestroy(this._primitive), i.removeAndDestroy(this._outlinePrimitive), this._outlinePrimitive = void 0), this._primitive = void 0; + const o = this._entity, s = o[this._geometryUpdater._geometryPropertyName]; + if (this._setOptions(o, s, e), this._isHidden(o, s, e)) + return; + const c = this._geometryUpdater.shadowsProperty.getValue(e), l = this._options; + if (!defined(s.fill) || s.fill.getValue(e)) { + const d = t.fillMaterialProperty, f = d instanceof ColorMaterialProperty; + let h; + const p = t._getIsClosed(l); + if (f) + h = new PerInstanceColorAppearance({ + closed: p, + flat: n && !t._supportsMaterialsforEntitiesOnTerrain + }); + else { + const m = MaterialProperty.getValue( + e, + d, + this._material + ); + this._material = m, h = new MaterialAppearance({ + material: m, + translucent: m.isTranslucent(), + closed: p + }); + } + if (n) + l.vertexFormat = PerInstanceColorAppearance.VERTEX_FORMAT, this._primitive = r.add( + new GroundPrimitive({ + geometryInstances: this._geometryUpdater.createFillGeometryInstance( + e + ), + appearance: h, + asynchronous: !1, + shadows: c, + classificationType: this._geometryUpdater.classificationTypeProperty.getValue( + e + ) + }), + Property.getValueOrUndefined(this._geometryUpdater.zIndex, e) + ); + else { + l.vertexFormat = h.vertexFormat; + const m = this._geometryUpdater.createFillGeometryInstance( + e + ); + f && (h.translucent = m.attributes.color.value[3] !== 255), this._primitive = i.add( + new Primitive$3({ + geometryInstances: m, + appearance: h, + asynchronous: !1, + shadows: c + }) + ); + } + } + if (!n && defined(s.outline) && s.outline.getValue(e)) { + const d = this._geometryUpdater.createOutlineGeometryInstance( + e + ), f = Property.getValueOrDefault( + s.outlineWidth, + e, + 1 + ); + this._outlinePrimitive = i.add( + new Primitive$3({ + geometryInstances: d, + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: d.attributes.color.value[3] !== 255, + renderState: { + lineWidth: t._scene.clampLineWidth(f) + } + }), + asynchronous: !1, + shadows: c + }) + ); + } +}; +DynamicGeometryUpdater$1.prototype.getBoundingSphere = function(e) { + const t = this._entity, n = this._primitive, i = this._outlinePrimitive; + let r; + return defined(n) && n.show && n.ready && (r = n.getGeometryInstanceAttributes(t), defined(r) && defined(r.boundingSphere)) || defined(i) && i.show && i.ready && (r = i.getGeometryInstanceAttributes(t), defined(r) && defined(r.boundingSphere)) ? (BoundingSphere.clone(r.boundingSphere, e), BoundingSphereState$1.DONE) : defined(n) && !n.ready || defined(i) && !i.ready ? BoundingSphereState$1.PENDING : BoundingSphereState$1.FAILED; +}; +DynamicGeometryUpdater$1.prototype.isDestroyed = function() { + return !1; +}; +DynamicGeometryUpdater$1.prototype.destroy = function() { + const e = this._primitives, t = this._orderedGroundPrimitives; + this._geometryUpdater._onTerrain ? t.remove(this._primitive) : e.removeAndDestroy(this._primitive), e.removeAndDestroy(this._outlinePrimitive), destroyObject(this); +}; +const ArcType = { + /** + * Straight line that does not conform to the surface of the ellipsoid. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * Follow geodesic path. + * + * @type {number} + * @constant + */ + GEODESIC: 1, + /** + * Follow rhumb or loxodrome path. + * + * @type {number} + * @constant + */ + RHUMB: 2 +}, ArcType$1 = Object.freeze(ArcType), removeDuplicatesEpsilon = CesiumMath.EPSILON10; +function arrayRemoveDuplicates(e, t, n, i) { + if (!defined(e)) + return; + n = defaultValue(n, !1); + const r = defined(i), o = e.length; + if (o < 2) + return e; + let s, c = e[0], l, d, f = 0, h = -1; + for (s = 1; s < o; ++s) + l = e[s], t(c, l, removeDuplicatesEpsilon) ? (defined(d) || (d = e.slice(0, s), f = s - 1, h = 0), r && i.push(s)) : (defined(d) && (d.push(l), f = s, r && (h = i.length)), c = l); + return n && t(e[0], e[o - 1], removeDuplicatesEpsilon) && (r && (defined(d) ? i.splice(h, 0, f) : i.push(o - 1)), defined(d) ? d.length -= 1 : d = e.slice(0, -1)), defined(d) ? d : e; +} +function setConstants(e) { + const t = e._uSquared, n = e._ellipsoid.maximumRadius, i = e._ellipsoid.minimumRadius, r = (n - i) / n, o = Math.cos(e._startHeading), s = Math.sin(e._startHeading), c = (1 - r) * Math.tan(e._start.latitude), l = 1 / Math.sqrt(1 + c * c), d = l * c, f = Math.atan2(c, o), h = l * s, p = h * h, m = 1 - p, _ = Math.sqrt(m), y = t / 4, C = y * y, T = C * y, x = C * C, b = 1 + y - 3 * C / 4 + 5 * T / 4 - 175 * x / 64, S = 1 - y + 15 * C / 8 - 35 * T / 8, E = 1 - 3 * y + 35 * C / 4, A = 1 - 5 * y, D = b * f - S * Math.sin(2 * f) * y / 2 - E * Math.sin(4 * f) * C / 16 - A * Math.sin(6 * f) * T / 48 - Math.sin(8 * f) * 5 * x / 512, P = e._constants; + P.a = n, P.b = i, P.f = r, P.cosineHeading = o, P.sineHeading = s, P.tanU = c, P.cosineU = l, P.sineU = d, P.sigma = f, P.sineAlpha = h, P.sineSquaredAlpha = p, P.cosineSquaredAlpha = m, P.cosineAlpha = _, P.u2Over4 = y, P.u4Over16 = C, P.u6Over64 = T, P.u8Over256 = x, P.a0 = b, P.a1 = S, P.a2 = E, P.a3 = A, P.distanceRatio = D; +} +function computeC(e, t) { + return e * t * (4 + e * (4 - 3 * t)) / 16; +} +function computeDeltaLambda(e, t, n, i, r, o, s) { + const c = computeC(e, n); + return (1 - c) * e * t * (i + c * r * (s + c * o * (2 * s * s - 1))); +} +function vincentyInverseFormula(e, t, n, i, r, o, s) { + const c = (t - n) / t, l = o - i, d = Math.atan((1 - c) * Math.tan(r)), f = Math.atan((1 - c) * Math.tan(s)), h = Math.cos(d), p = Math.sin(d), m = Math.cos(f), _ = Math.sin(f), y = h * m, C = h * _, T = p * _, x = p * m; + let b = l, S = CesiumMath.TWO_PI, E = Math.cos(b), A = Math.sin(b), D, P, I, M, R; + do { + E = Math.cos(b), A = Math.sin(b); + const U = C - x * E; + I = Math.sqrt( + m * m * A * A + U * U + ), P = T + y * E, D = Math.atan2(I, P); + let k; + I === 0 ? (k = 0, M = 1) : (k = y * A / I, M = 1 - k * k), S = b, R = P - 2 * T / M, isFinite(R) || (R = 0), b = l + computeDeltaLambda( + c, + k, + M, + D, + I, + P, + R + ); + } while (Math.abs(b - S) > CesiumMath.EPSILON12); + const L = M * (t * t - n * n) / (n * n), g = 1 + L * (4096 + L * (L * (320 - 175 * L) - 768)) / 16384, w = L * (256 + L * (L * (74 - 47 * L) - 128)) / 1024, O = R * R, N = w * I * (R + w * (P * (2 * O - 1) - w * R * (4 * I * I - 3) * (4 * O - 3) / 6) / 4), F = n * g * (D - N), B = Math.atan2( + m * A, + C - x * E + ), V = Math.atan2(h * A, C * E - x); + e._distance = F, e._startHeading = B, e._endHeading = V, e._uSquared = L; +} +const scratchCart1$1 = new Cartesian3(), scratchCart2$2 = new Cartesian3(); +function computeProperties$1(e, t, n, i) { + Cartesian3.normalize( + i.cartographicToCartesian(t, scratchCart2$2), + scratchCart1$1 + ), Cartesian3.normalize( + i.cartographicToCartesian(n, scratchCart2$2), + scratchCart2$2 + ), vincentyInverseFormula( + e, + i.maximumRadius, + i.minimumRadius, + t.longitude, + t.latitude, + n.longitude, + n.latitude + ), e._start = Cartographic.clone( + t, + e._start + ), e._end = Cartographic.clone(n, e._end), e._start.height = 0, e._end.height = 0, setConstants(e); +} +function EllipsoidGeodesic(e, t, n) { + const i = defaultValue(n, Ellipsoid.default); + this._ellipsoid = i, this._start = new Cartographic(), this._end = new Cartographic(), this._constants = {}, this._startHeading = void 0, this._endHeading = void 0, this._distance = void 0, this._uSquared = void 0, defined(e) && defined(t) && computeProperties$1(this, e, t, i); +} +Object.defineProperties(EllipsoidGeodesic.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidGeodesic.prototype + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the surface distance between the start and end point + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + surfaceDistance: { + get: function() { + return this._distance; + } + }, + /** + * Gets the initial planetodetic point on the path. + * @memberof EllipsoidGeodesic.prototype + * @type {Cartographic} + * @readonly + */ + start: { + get: function() { + return this._start; + } + }, + /** + * Gets the final planetodetic point on the path. + * @memberof EllipsoidGeodesic.prototype + * @type {Cartographic} + * @readonly + */ + end: { + get: function() { + return this._end; + } + }, + /** + * Gets the heading at the initial point. + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + startHeading: { + get: function() { + return this._startHeading; + } + }, + /** + * Gets the heading at the final point. + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + endHeading: { + get: function() { + return this._endHeading; + } + } +}); +EllipsoidGeodesic.prototype.setEndPoints = function(e, t) { + computeProperties$1(this, e, t, this._ellipsoid); +}; +EllipsoidGeodesic.prototype.interpolateUsingFraction = function(e, t) { + return this.interpolateUsingSurfaceDistance( + this._distance * e, + t + ); +}; +EllipsoidGeodesic.prototype.interpolateUsingSurfaceDistance = function(e, t) { + const n = this._constants, i = n.distanceRatio + e / n.b, r = Math.cos(2 * i), o = Math.cos(4 * i), s = Math.cos(6 * i), c = Math.sin(2 * i), l = Math.sin(4 * i), d = Math.sin(6 * i), f = Math.sin(8 * i), h = i * i, p = i * h, m = n.u8Over256, _ = n.u2Over4, y = n.u6Over64, C = n.u4Over16; + let T = 2 * p * m * r / 3 + i * (1 - _ + 7 * C / 4 - 15 * y / 4 + 579 * m / 64 - (C - 15 * y / 4 + 187 * m / 16) * r - (5 * y / 4 - 115 * m / 16) * o - 29 * m * s / 16) + (_ / 2 - C + 71 * y / 32 - 85 * m / 16) * c + (5 * C / 16 - 5 * y / 4 + 383 * m / 96) * l - h * ((y - 11 * m / 2) * c + 5 * m * l / 2) + (29 * y / 96 - 29 * m / 16) * d + 539 * m * f / 1536; + const x = Math.asin(Math.sin(T) * n.cosineAlpha), b = Math.atan(n.a / n.b * Math.tan(x)); + T = T - n.sigma; + const S = Math.cos(2 * n.sigma + T), E = Math.sin(T), A = Math.cos(T), D = n.cosineU * A, P = n.sineU * E, M = Math.atan2( + E * n.sineHeading, + D - P * n.cosineHeading + ) - computeDeltaLambda( + n.f, + n.sineAlpha, + n.cosineSquaredAlpha, + T, + E, + A, + S + ); + return defined(t) ? (t.longitude = this._start.longitude + M, t.latitude = b, t.height = 0, t) : new Cartographic(this._start.longitude + M, b, 0); +}; +function calculateM(e, t, n) { + if (e === 0) + return t * n; + const i = e * e, r = i * i, o = r * i, s = o * i, c = s * i, l = c * i, d = n, f = Math.sin(2 * d), h = Math.sin(4 * d), p = Math.sin(6 * d), m = Math.sin(8 * d), _ = Math.sin(10 * d), y = Math.sin(12 * d); + return t * ((1 - i / 4 - 3 * r / 64 - 5 * o / 256 - 175 * s / 16384 - 441 * c / 65536 - 4851 * l / 1048576) * d - (3 * i / 8 + 3 * r / 32 + 45 * o / 1024 + 105 * s / 4096 + 2205 * c / 131072 + 6237 * l / 524288) * f + (15 * r / 256 + 45 * o / 1024 + 525 * s / 16384 + 1575 * c / 65536 + 155925 * l / 8388608) * h - (35 * o / 3072 + 175 * s / 12288 + 3675 * c / 262144 + 13475 * l / 1048576) * p + (315 * s / 131072 + 2205 * c / 524288 + 43659 * l / 8388608) * m - (693 * c / 1310720 + 6237 * l / 5242880) * _ + 1001 * l / 8388608 * y); +} +function calculateInverseM(e, t, n) { + const i = e / n; + if (t === 0) + return i; + const r = i * i, o = r * i, s = o * i, c = t, l = c * c, d = l * l, f = d * l, h = f * l, p = h * l, m = p * l, _ = Math.sin(2 * i), y = Math.cos(2 * i), C = Math.sin(4 * i), T = Math.cos(4 * i), x = Math.sin(6 * i), b = Math.cos(6 * i), S = Math.sin(8 * i), E = Math.cos(8 * i), A = Math.sin(10 * i), D = Math.cos(10 * i), P = Math.sin(12 * i); + return i + i * l / 4 + 7 * i * d / 64 + 15 * i * f / 256 + 579 * i * h / 16384 + 1515 * i * p / 65536 + 16837 * i * m / 1048576 + (3 * i * d / 16 + 45 * i * f / 256 - i * (32 * r - 561) * h / 4096 - i * (232 * r - 1677) * p / 16384 + i * (399985 - 90560 * r + 512 * s) * m / 5242880) * y + (21 * i * f / 256 + 483 * i * h / 4096 - i * (224 * r - 1969) * p / 16384 - i * (33152 * r - 112599) * m / 1048576) * T + (151 * i * h / 4096 + 4681 * i * p / 65536 + 1479 * i * m / 16384 - 453 * o * m / 32768) * b + (1097 * i * p / 65536 + 42783 * i * m / 1048576) * E + 8011 * i * m / 1048576 * D + (3 * l / 8 + 3 * d / 16 + 213 * f / 2048 - 3 * r * f / 64 + 255 * h / 4096 - 33 * r * h / 512 + 20861 * p / 524288 - 33 * r * p / 512 + s * p / 1024 + 28273 * m / 1048576 - 471 * r * m / 8192 + 9 * s * m / 4096) * _ + (21 * d / 256 + 21 * f / 256 + 533 * h / 8192 - 21 * r * h / 512 + 197 * p / 4096 - 315 * r * p / 4096 + 584039 * m / 16777216 - 12517 * r * m / 131072 + 7 * s * m / 2048) * C + (151 * f / 6144 + 151 * h / 4096 + 5019 * p / 131072 - 453 * r * p / 16384 + 26965 * m / 786432 - 8607 * r * m / 131072) * x + (1097 * h / 131072 + 1097 * p / 65536 + 225797 * m / 10485760 - 1097 * r * m / 65536) * S + (8011 * p / 2621440 + 8011 * m / 1048576) * A + 293393 * m / 251658240 * P; +} +function calculateSigma(e, t) { + if (e === 0) + return Math.log(Math.tan(0.5 * (CesiumMath.PI_OVER_TWO + t))); + const n = e * Math.sin(t); + return Math.log(Math.tan(0.5 * (CesiumMath.PI_OVER_TWO + t))) - e / 2 * Math.log((1 + n) / (1 - n)); +} +function calculateHeading(e, t, n, i, r) { + const o = calculateSigma(e._ellipticity, n), s = calculateSigma( + e._ellipticity, + r + ); + return Math.atan2( + CesiumMath.negativePiToPi(i - t), + s - o + ); +} +function calculateArcLength(e, t, n, i, r, o, s) { + const c = e._heading, l = o - i; + let d = 0; + if (CesiumMath.equalsEpsilon( + Math.abs(c), + CesiumMath.PI_OVER_TWO, + CesiumMath.EPSILON8 + )) + if (t === n) + d = t * Math.cos(r) * CesiumMath.negativePiToPi(l); + else { + const f = Math.sin(r); + d = t * Math.cos(r) * CesiumMath.negativePiToPi(l) / Math.sqrt(1 - e._ellipticitySquared * f * f); + } + else { + const f = calculateM( + e._ellipticity, + t, + r + ); + d = (calculateM( + e._ellipticity, + t, + s + ) - f) / Math.cos(c); + } + return Math.abs(d); +} +const scratchCart1 = new Cartesian3(), scratchCart2$1 = new Cartesian3(); +function computeProperties(e, t, n, i) { + Cartesian3.normalize( + i.cartographicToCartesian(t, scratchCart2$1), + scratchCart1 + ), Cartesian3.normalize( + i.cartographicToCartesian(n, scratchCart2$1), + scratchCart2$1 + ); + const r = i.maximumRadius, o = i.minimumRadius, s = r * r, c = o * o; + e._ellipticitySquared = (s - c) / s, e._ellipticity = Math.sqrt( + e._ellipticitySquared + ), e._start = Cartographic.clone( + t, + e._start + ), e._start.height = 0, e._end = Cartographic.clone(n, e._end), e._end.height = 0, e._heading = calculateHeading( + e, + t.longitude, + t.latitude, + n.longitude, + n.latitude + ), e._distance = calculateArcLength( + e, + i.maximumRadius, + i.minimumRadius, + t.longitude, + t.latitude, + n.longitude, + n.latitude + ); +} +function interpolateUsingSurfaceDistance(e, t, n, i, r, o) { + if (n === 0) + return Cartographic.clone(e, o); + const s = r * r; + let c, l, d; + if (Math.abs(CesiumMath.PI_OVER_TWO - Math.abs(t)) > CesiumMath.EPSILON8) { + const f = calculateM(r, i, e.latitude), h = n * Math.cos(t), p = f + h; + if (l = calculateInverseM(p, r, i), Math.abs(t) < CesiumMath.EPSILON10) + c = CesiumMath.negativePiToPi(e.longitude); + else { + const m = calculateSigma(r, e.latitude), _ = calculateSigma(r, l); + d = Math.tan(t) * (_ - m), c = CesiumMath.negativePiToPi(e.longitude + d); + } + } else { + l = e.latitude; + let f; + if (r === 0) + f = i * Math.cos(e.latitude); + else { + const h = Math.sin(e.latitude); + f = i * Math.cos(e.latitude) / Math.sqrt(1 - s * h * h); + } + d = n / f, t > 0 ? c = CesiumMath.negativePiToPi(e.longitude + d) : c = CesiumMath.negativePiToPi(e.longitude - d); + } + return defined(o) ? (o.longitude = c, o.latitude = l, o.height = 0, o) : new Cartographic(c, l, 0); +} +function EllipsoidRhumbLine(e, t, n) { + const i = defaultValue(n, Ellipsoid.default); + this._ellipsoid = i, this._start = new Cartographic(), this._end = new Cartographic(), this._heading = void 0, this._distance = void 0, this._ellipticity = void 0, this._ellipticitySquared = void 0, defined(e) && defined(t) && computeProperties(this, e, t, i); +} +Object.defineProperties(EllipsoidRhumbLine.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidRhumbLine.prototype + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the surface distance between the start and end point + * @memberof EllipsoidRhumbLine.prototype + * @type {number} + * @readonly + */ + surfaceDistance: { + get: function() { + return this._distance; + } + }, + /** + * Gets the initial planetodetic point on the path. + * @memberof EllipsoidRhumbLine.prototype + * @type {Cartographic} + * @readonly + */ + start: { + get: function() { + return this._start; + } + }, + /** + * Gets the final planetodetic point on the path. + * @memberof EllipsoidRhumbLine.prototype + * @type {Cartographic} + * @readonly + */ + end: { + get: function() { + return this._end; + } + }, + /** + * Gets the heading from the start point to the end point. + * @memberof EllipsoidRhumbLine.prototype + * @type {number} + * @readonly + */ + heading: { + get: function() { + return this._heading; + } + } +}); +EllipsoidRhumbLine.fromStartHeadingDistance = function(e, t, n, i, r) { + const o = defaultValue(i, Ellipsoid.default), s = o.maximumRadius, c = o.minimumRadius, l = s * s, d = c * c, f = Math.sqrt((l - d) / l); + t = CesiumMath.negativePiToPi(t); + const h = interpolateUsingSurfaceDistance( + e, + t, + n, + o.maximumRadius, + f + ); + return !defined(r) || defined(i) && !i.equals(r.ellipsoid) ? new EllipsoidRhumbLine(e, h, o) : (r.setEndPoints(e, h), r); +}; +EllipsoidRhumbLine.prototype.setEndPoints = function(e, t) { + computeProperties(this, e, t, this._ellipsoid); +}; +EllipsoidRhumbLine.prototype.interpolateUsingFraction = function(e, t) { + return this.interpolateUsingSurfaceDistance( + e * this._distance, + t + ); +}; +EllipsoidRhumbLine.prototype.interpolateUsingSurfaceDistance = function(e, t) { + return interpolateUsingSurfaceDistance( + this._start, + this._heading, + e, + this._ellipsoid.maximumRadius, + this._ellipticity, + t + ); +}; +EllipsoidRhumbLine.prototype.findIntersectionWithLongitude = function(e, t) { + const n = this._ellipticity, i = this._heading, r = Math.abs(i), o = this._start; + if (e = CesiumMath.negativePiToPi(e), CesiumMath.equalsEpsilon( + Math.abs(e), + Math.PI, + CesiumMath.EPSILON14 + ) && (e = CesiumMath.sign(o.longitude) * Math.PI), defined(t) || (t = new Cartographic()), Math.abs(CesiumMath.PI_OVER_TWO - r) <= CesiumMath.EPSILON8) + return t.longitude = e, t.latitude = o.latitude, t.height = 0, t; + if (CesiumMath.equalsEpsilon( + Math.abs(CesiumMath.PI_OVER_TWO - r), + CesiumMath.PI_OVER_TWO, + CesiumMath.EPSILON8 + )) + return CesiumMath.equalsEpsilon( + e, + o.longitude, + CesiumMath.EPSILON12 + ) ? void 0 : (t.longitude = e, t.latitude = CesiumMath.PI_OVER_TWO * CesiumMath.sign(CesiumMath.PI_OVER_TWO - i), t.height = 0, t); + const s = o.latitude, c = n * Math.sin(s), l = Math.tan(0.5 * (CesiumMath.PI_OVER_TWO + s)) * Math.exp((e - o.longitude) / Math.tan(i)), d = (1 + c) / (1 - c); + let f = o.latitude, h; + do { + h = f; + const p = n * Math.sin(h), m = (1 + p) / (1 - p); + f = 2 * Math.atan( + l * Math.pow(m / d, n / 2) + ) - CesiumMath.PI_OVER_TWO; + } while (!CesiumMath.equalsEpsilon(f, h, CesiumMath.EPSILON12)); + return t.longitude = e, t.latitude = f, t.height = 0, t; +}; +EllipsoidRhumbLine.prototype.findIntersectionWithLatitude = function(e, t) { + const n = this._ellipticity, i = this._heading, r = this._start; + if (CesiumMath.equalsEpsilon( + Math.abs(i), + CesiumMath.PI_OVER_TWO, + CesiumMath.EPSILON8 + )) + return; + const o = calculateSigma(n, r.latitude), s = calculateSigma(n, e), c = Math.tan(i) * (s - o), l = CesiumMath.negativePiToPi(r.longitude + c); + return defined(t) ? (t.longitude = l, t.latitude = e, t.height = 0, t) : new Cartographic(l, e, 0); +}; +const PROJECTIONS = [GeographicProjection, WebMercatorProjection], PROJECTION_COUNT = PROJECTIONS.length, MITER_BREAK_SMALL = Math.cos(CesiumMath.toRadians(30)), MITER_BREAK_LARGE = Math.cos(CesiumMath.toRadians(150)), WALL_INITIAL_MIN_HEIGHT = 0, WALL_INITIAL_MAX_HEIGHT = 1e3; +function GroundPolylineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions; + this.width = defaultValue(e.width, 1), this._positions = t, this.granularity = defaultValue(e.granularity, 9999), this.loop = defaultValue(e.loop, !1), this.arcType = defaultValue(e.arcType, ArcType$1.GEODESIC), this._ellipsoid = Ellipsoid.default, this._projectionIndex = 0, this._workerName = "createGroundPolylineGeometry", this._scene3DOnly = !1; +} +Object.defineProperties(GroundPolylineGeometry.prototype, { + /** + * The number of elements used to pack the object into an array. + * @memberof GroundPolylineGeometry.prototype + * @type {number} + * @readonly + * @private + */ + packedLength: { + get: function() { + return 1 + this._positions.length * 3 + 1 + 1 + 1 + Ellipsoid.packedLength + 1 + 1; + } + } +}); +GroundPolylineGeometry.setProjectionAndEllipsoid = function(e, t) { + let n = 0; + for (let i = 0; i < PROJECTION_COUNT; i++) + if (t instanceof PROJECTIONS[i]) { + n = i; + break; + } + e._projectionIndex = n, e._ellipsoid = t.ellipsoid; +}; +const cart3Scratch1 = new Cartesian3(), cart3Scratch2 = new Cartesian3(), cart3Scratch3 = new Cartesian3(); +function computeRightNormal(e, t, n, i, r) { + const o = getPosition$2(i, e, 0, cart3Scratch1), s = getPosition$2(i, e, n, cart3Scratch2), c = getPosition$2(i, t, 0, cart3Scratch3), l = direction(s, o, cart3Scratch2), d = direction(c, o, cart3Scratch3); + return Cartesian3.cross(d, l, r), Cartesian3.normalize(r, r); +} +const interpolatedCartographicScratch = new Cartographic(), interpolatedBottomScratch = new Cartesian3(), interpolatedTopScratch = new Cartesian3(), interpolatedNormalScratch = new Cartesian3(); +function interpolateSegment(e, t, n, i, r, o, s, c, l, d, f) { + if (r === 0) + return; + let h; + o === ArcType$1.GEODESIC ? h = new EllipsoidGeodesic(e, t, s) : o === ArcType$1.RHUMB && (h = new EllipsoidRhumbLine(e, t, s)); + const p = h.surfaceDistance; + if (p < r) + return; + const m = computeRightNormal( + e, + t, + i, + s, + interpolatedNormalScratch + ), _ = Math.ceil(p / r), y = p / _; + let C = y; + const T = _ - 1; + let x = c.length; + for (let b = 0; b < T; b++) { + const S = h.interpolateUsingSurfaceDistance( + C, + interpolatedCartographicScratch + ), E = getPosition$2( + s, + S, + n, + interpolatedBottomScratch + ), A = getPosition$2( + s, + S, + i, + interpolatedTopScratch + ); + Cartesian3.pack(m, c, x), Cartesian3.pack(E, l, x), Cartesian3.pack(A, d, x), f.push(S.latitude), f.push(S.longitude), x += 3, C += y; + } +} +const heightlessCartographicScratch = new Cartographic(); +function getPosition$2(e, t, n, i) { + return Cartographic.clone(t, heightlessCartographicScratch), heightlessCartographicScratch.height = n, Cartographic.toCartesian( + heightlessCartographicScratch, + e, + i + ); +} +GroundPolylineGeometry.pack = function(e, t, n) { + let i = defaultValue(n, 0); + const r = e._positions, o = r.length; + t[i++] = o; + for (let s = 0; s < o; ++s) { + const c = r[s]; + Cartesian3.pack(c, t, i), i += 3; + } + return t[i++] = e.granularity, t[i++] = e.loop ? 1 : 0, t[i++] = e.arcType, Ellipsoid.pack(e._ellipsoid, t, i), i += Ellipsoid.packedLength, t[i++] = e._projectionIndex, t[i++] = e._scene3DOnly ? 1 : 0, t; +}; +GroundPolylineGeometry.unpack = function(e, t, n) { + let i = defaultValue(t, 0); + const r = e[i++], o = new Array(r); + for (let p = 0; p < r; p++) + o[p] = Cartesian3.unpack(e, i), i += 3; + const s = e[i++], c = e[i++] === 1, l = e[i++], d = Ellipsoid.unpack(e, i); + i += Ellipsoid.packedLength; + const f = e[i++], h = e[i++] === 1; + return defined(n) || (n = new GroundPolylineGeometry({ + positions: o + })), n._positions = o, n.granularity = s, n.loop = c, n.arcType = l, n._ellipsoid = d, n._projectionIndex = f, n._scene3DOnly = h, n; +}; +function direction(e, t, n) { + return Cartesian3.subtract(e, t, n), Cartesian3.normalize(n, n), n; +} +function tangentDirection(e, t, n, i) { + return i = direction(e, t, i), i = Cartesian3.cross(i, n, i), i = Cartesian3.normalize(i, i), i = Cartesian3.cross(n, i, i), i; +} +const toPreviousScratch = new Cartesian3(), toNextScratch = new Cartesian3(), forwardScratch = new Cartesian3(), vertexUpScratch = new Cartesian3(), cosine90 = 0, cosine180 = -1; +function computeVertexMiterNormal(e, t, n, i, r) { + const o = direction(n, t, vertexUpScratch), s = tangentDirection( + e, + t, + o, + toPreviousScratch + ), c = tangentDirection(i, t, o, toNextScratch); + if (CesiumMath.equalsEpsilon( + Cartesian3.dot(s, c), + cosine180, + CesiumMath.EPSILON5 + )) + return r = Cartesian3.cross(o, s, r), r = Cartesian3.normalize(r, r), r; + r = Cartesian3.add(c, s, r), r = Cartesian3.normalize(r, r); + const l = Cartesian3.cross(o, r, forwardScratch); + return Cartesian3.dot(c, l) < cosine90 && (r = Cartesian3.negate(r, r)), r; +} +const XZ_PLANE = Plane.fromPointNormal(Cartesian3.ZERO, Cartesian3.UNIT_Y), previousBottomScratch = new Cartesian3(), vertexBottomScratch = new Cartesian3(), vertexTopScratch = new Cartesian3(), nextBottomScratch = new Cartesian3(), vertexNormalScratch = new Cartesian3(), intersectionScratch$1 = new Cartesian3(), cartographicScratch0 = new Cartographic(), cartographicScratch1 = new Cartographic(), cartographicIntersectionScratch = new Cartographic(); +GroundPolylineGeometry.createGeometry = function(e) { + const t = !e._scene3DOnly; + let n = e.loop; + const i = e._ellipsoid, r = e.granularity, o = e.arcType, s = new PROJECTIONS[e._projectionIndex]( + i + ), c = WALL_INITIAL_MIN_HEIGHT, l = WALL_INITIAL_MAX_HEIGHT; + let d, f; + const h = e._positions, p = h.length; + p === 2 && (n = !1); + let m, _, y, C; + const T = new EllipsoidRhumbLine(void 0, void 0, i); + let x, b, S; + const E = [h[0]]; + for (f = 0; f < p - 1; f++) + m = h[f], _ = h[f + 1], x = IntersectionTests.lineSegmentPlane( + m, + _, + XZ_PLANE, + intersectionScratch$1 + ), defined(x) && !Cartesian3.equalsEpsilon(x, m, CesiumMath.EPSILON7) && !Cartesian3.equalsEpsilon(x, _, CesiumMath.EPSILON7) && (e.arcType === ArcType$1.GEODESIC ? E.push(Cartesian3.clone(x)) : e.arcType === ArcType$1.RHUMB && (S = i.cartesianToCartographic( + x, + cartographicScratch0 + ).longitude, y = i.cartesianToCartographic(m, cartographicScratch0), C = i.cartesianToCartographic(_, cartographicScratch1), T.setEndPoints(y, C), b = T.findIntersectionWithLongitude( + S, + cartographicIntersectionScratch + ), x = i.cartographicToCartesian( + b, + intersectionScratch$1 + ), defined(x) && !Cartesian3.equalsEpsilon(x, m, CesiumMath.EPSILON7) && !Cartesian3.equalsEpsilon(x, _, CesiumMath.EPSILON7) && E.push(Cartesian3.clone(x)))), E.push(_); + n && (m = h[p - 1], _ = h[0], x = IntersectionTests.lineSegmentPlane( + m, + _, + XZ_PLANE, + intersectionScratch$1 + ), defined(x) && !Cartesian3.equalsEpsilon(x, m, CesiumMath.EPSILON7) && !Cartesian3.equalsEpsilon(x, _, CesiumMath.EPSILON7) && (e.arcType === ArcType$1.GEODESIC ? E.push(Cartesian3.clone(x)) : e.arcType === ArcType$1.RHUMB && (S = i.cartesianToCartographic( + x, + cartographicScratch0 + ).longitude, y = i.cartesianToCartographic(m, cartographicScratch0), C = i.cartesianToCartographic(_, cartographicScratch1), T.setEndPoints(y, C), b = T.findIntersectionWithLongitude( + S, + cartographicIntersectionScratch + ), x = i.cartographicToCartesian( + b, + intersectionScratch$1 + ), defined(x) && !Cartesian3.equalsEpsilon(x, m, CesiumMath.EPSILON7) && !Cartesian3.equalsEpsilon(x, _, CesiumMath.EPSILON7) && E.push(Cartesian3.clone(x))))); + let A = E.length, D = new Array(A); + for (f = 0; f < A; f++) { + const $ = Cartographic.fromCartesian( + E[f], + i + ); + $.height = 0, D[f] = $; + } + if (D = arrayRemoveDuplicates( + D, + Cartographic.equalsEpsilon + ), A = D.length, A < 2) + return; + const P = [], I = [], M = [], R = []; + let L = previousBottomScratch, g = vertexBottomScratch, w = vertexTopScratch, O = nextBottomScratch, N = vertexNormalScratch; + const F = D[0], B = D[1], V = D[A - 1]; + for (L = getPosition$2( + i, + V, + c, + L + ), O = getPosition$2(i, B, c, O), g = getPosition$2( + i, + F, + c, + g + ), w = getPosition$2(i, F, l, w), n ? N = computeVertexMiterNormal( + L, + g, + w, + O, + N + ) : N = computeRightNormal( + F, + B, + l, + i, + N + ), Cartesian3.pack(N, I, 0), Cartesian3.pack(g, M, 0), Cartesian3.pack(w, R, 0), P.push(F.latitude), P.push(F.longitude), interpolateSegment( + F, + B, + c, + l, + r, + o, + i, + I, + M, + R, + P + ), f = 1; f < A - 1; ++f) { + L = Cartesian3.clone(g, L), g = Cartesian3.clone(O, g); + const $ = D[f]; + getPosition$2(i, $, l, w), getPosition$2(i, D[f + 1], c, O), computeVertexMiterNormal( + L, + g, + w, + O, + N + ), d = I.length, Cartesian3.pack(N, I, d), Cartesian3.pack(g, M, d), Cartesian3.pack(w, R, d), P.push($.latitude), P.push($.longitude), interpolateSegment( + D[f], + D[f + 1], + c, + l, + r, + o, + i, + I, + M, + R, + P + ); + } + const U = D[A - 1], k = D[A - 2]; + if (g = getPosition$2( + i, + U, + c, + g + ), w = getPosition$2(i, U, l, w), n) { + const $ = D[0]; + L = getPosition$2( + i, + k, + c, + L + ), O = getPosition$2( + i, + $, + c, + O + ), N = computeVertexMiterNormal( + L, + g, + w, + O, + N + ); + } else + N = computeRightNormal( + k, + U, + l, + i, + N + ); + if (d = I.length, Cartesian3.pack(N, I, d), Cartesian3.pack(g, M, d), Cartesian3.pack(w, R, d), P.push(U.latitude), P.push(U.longitude), n) { + for (interpolateSegment( + U, + F, + c, + l, + r, + o, + i, + I, + M, + R, + P + ), d = I.length, f = 0; f < 3; ++f) + I[d + f] = I[f], M[d + f] = M[f], R[d + f] = R[f]; + P.push(F.latitude), P.push(F.longitude); + } + return generateGeometryAttributes( + n, + s, + M, + R, + I, + P, + t + ); +}; +const lineDirectionScratch = new Cartesian3(), matrix3Scratch$1 = new Matrix3(), quaternionScratch$3 = new Quaternion(); +function breakMiter(e, t, n, i) { + const r = direction(n, t, lineDirectionScratch), o = Cartesian3.dot(r, e); + if (o > MITER_BREAK_SMALL || o < MITER_BREAK_LARGE) { + const s = direction(i, n, vertexUpScratch), c = o < MITER_BREAK_LARGE ? CesiumMath.PI_OVER_TWO : -CesiumMath.PI_OVER_TWO, l = Quaternion.fromAxisAngle( + s, + c, + quaternionScratch$3 + ), d = Matrix3.fromQuaternion(l, matrix3Scratch$1); + return Matrix3.multiplyByVector( + d, + e, + e + ), !0; + } + return !1; +} +const endPosCartographicScratch = new Cartographic(), normalStartpointScratch = new Cartesian3(), normalEndpointScratch = new Cartesian3(); +function projectNormal(e, t, n, i, r) { + const o = Cartographic.toCartesian( + t, + e._ellipsoid, + normalStartpointScratch + ); + let s = Cartesian3.add(o, n, normalEndpointScratch), c = !1; + const l = e._ellipsoid; + let d = l.cartesianToCartographic( + s, + endPosCartographicScratch + ); + Math.abs(t.longitude - d.longitude) > CesiumMath.PI_OVER_TWO && (c = !0, s = Cartesian3.subtract( + o, + n, + normalEndpointScratch + ), d = l.cartesianToCartographic( + s, + endPosCartographicScratch + )), d.height = 0; + const f = e.project( + d, + r + ); + return r = Cartesian3.subtract( + f, + i, + r + ), r.z = 0, r = Cartesian3.normalize(r, r), c && Cartesian3.negate(r, r), r; +} +const adjustHeightNormalScratch = new Cartesian3(), adjustHeightOffsetScratch = new Cartesian3(); +function adjustHeights(e, t, n, i, r, o) { + const s = Cartesian3.subtract( + t, + e, + adjustHeightNormalScratch + ); + Cartesian3.normalize(s, s); + const c = n - WALL_INITIAL_MIN_HEIGHT; + let l = Cartesian3.multiplyByScalar( + s, + c, + adjustHeightOffsetScratch + ); + Cartesian3.add(e, l, r); + const d = i - WALL_INITIAL_MAX_HEIGHT; + l = Cartesian3.multiplyByScalar( + s, + d, + adjustHeightOffsetScratch + ), Cartesian3.add(t, l, o); +} +const nudgeDirectionScratch = new Cartesian3(); +function nudgeXZ(e, t) { + const n = Plane.getPointDistance(XZ_PLANE, e), i = Plane.getPointDistance(XZ_PLANE, t); + let r = nudgeDirectionScratch; + CesiumMath.equalsEpsilon(n, 0, CesiumMath.EPSILON2) ? (r = direction(t, e, r), Cartesian3.multiplyByScalar(r, CesiumMath.EPSILON2, r), Cartesian3.add(e, r, e)) : CesiumMath.equalsEpsilon(i, 0, CesiumMath.EPSILON2) && (r = direction(e, t, r), Cartesian3.multiplyByScalar(r, CesiumMath.EPSILON2, r), Cartesian3.add(t, r, t)); +} +function nudgeCartographic(e, t) { + const n = Math.abs(e.longitude), i = Math.abs(t.longitude); + if (CesiumMath.equalsEpsilon(n, CesiumMath.PI, CesiumMath.EPSILON11)) { + const r = CesiumMath.sign(t.longitude); + return e.longitude = r * (n - CesiumMath.EPSILON11), 1; + } else if (CesiumMath.equalsEpsilon(i, CesiumMath.PI, CesiumMath.EPSILON11)) { + const r = CesiumMath.sign(e.longitude); + return t.longitude = r * (i - CesiumMath.EPSILON11), 2; + } + return 0; +} +const startCartographicScratch = new Cartographic(), endCartographicScratch = new Cartographic(), segmentStartTopScratch = new Cartesian3(), segmentEndTopScratch = new Cartesian3(), segmentStartBottomScratch = new Cartesian3(), segmentEndBottomScratch = new Cartesian3(), segmentStartNormalScratch = new Cartesian3(), segmentEndNormalScratch = new Cartesian3(), getHeightCartographics = [ + startCartographicScratch, + endCartographicScratch +], getHeightRectangleScratch = new Rectangle(), adjustHeightStartTopScratch = new Cartesian3(), adjustHeightEndTopScratch = new Cartesian3(), adjustHeightStartBottomScratch = new Cartesian3(), adjustHeightEndBottomScratch = new Cartesian3(), segmentStart2DScratch = new Cartesian3(), segmentEnd2DScratch = new Cartesian3(), segmentStartNormal2DScratch = new Cartesian3(), segmentEndNormal2DScratch = new Cartesian3(), offsetScratch$a = new Cartesian3(), startUpScratch = new Cartesian3(), endUpScratch = new Cartesian3(), rightScratch = new Cartesian3(), startPlaneNormalScratch = new Cartesian3(), endPlaneNormalScratch = new Cartesian3(), encodeScratch = new EncodedCartesian3(), encodeScratch2D = new EncodedCartesian3(), forwardOffset2DScratch = new Cartesian3(), right2DScratch = new Cartesian3(), normalNudgeScratch = new Cartesian3(), scratchBoundingSpheres = [new BoundingSphere(), new BoundingSphere()], REFERENCE_INDICES = [ + 0, + 2, + 1, + 0, + 3, + 2, + // right + 0, + 7, + 3, + 0, + 4, + 7, + // start + 0, + 5, + 4, + 0, + 1, + 5, + // bottom + 5, + 7, + 4, + 5, + 6, + 7, + // left + 5, + 2, + 6, + 5, + 1, + 2, + // end + 3, + 6, + 2, + 3, + 7, + 6 + // top +], REFERENCE_INDICES_LENGTH = REFERENCE_INDICES.length; +function generateGeometryAttributes(e, t, n, i, r, o, s) { + let c, l; + const d = t._ellipsoid, f = n.length / 3 - 1, h = f * 8, p = h * 4, m = f * 36, _ = h > 65535 ? new Uint32Array(m) : new Uint16Array(m), y = new Float64Array(h * 3), C = new Float32Array(p), T = new Float32Array(p), x = new Float32Array(p), b = new Float32Array( + p + ), S = new Float32Array( + p + ); + let E, A, D, P; + s && (E = new Float32Array(p), A = new Float32Array(p), D = new Float32Array(p), P = new Float32Array(h * 2)); + const I = o.length / 2; + let M = 0; + const R = startCartographicScratch; + R.height = 0; + const L = endCartographicScratch; + L.height = 0; + let g = segmentStartTopScratch, w = segmentEndTopScratch; + if (s) + for (l = 0, c = 1; c < I; c++) + R.latitude = o[l], R.longitude = o[l + 1], L.latitude = o[l + 2], L.longitude = o[l + 3], g = t.project( + R, + g + ), w = t.project( + L, + w + ), M += Cartesian3.distance( + g, + w + ), l += 2; + const O = i.length / 3; + w = Cartesian3.unpack( + i, + 0, + w + ); + let N = 0; + for (l = 3, c = 1; c < O; c++) + g = Cartesian3.clone( + w, + g + ), w = Cartesian3.unpack( + i, + l, + w + ), N += Cartesian3.distance(g, w), l += 3; + let F; + l = 3; + let B = 0, V = 0, U = 0, k = 0, $ = !1, G = Cartesian3.unpack( + n, + 0, + segmentEndBottomScratch + ), q = Cartesian3.unpack(i, 0, segmentEndTopScratch), z = Cartesian3.unpack( + r, + 0, + segmentEndNormalScratch + ); + if (e) { + const X = Cartesian3.unpack( + n, + n.length - 6, + segmentStartBottomScratch + ); + breakMiter(z, X, G, q) && (z = Cartesian3.negate( + z, + z + )); + } + let H = 0, Q = 0, ne = 0; + for (c = 0; c < f; c++) { + const X = Cartesian3.clone(G, segmentStartBottomScratch), fe = Cartesian3.clone(q, segmentStartTopScratch); + let de = Cartesian3.clone( + z, + segmentStartNormalScratch + ); + $ && (de = Cartesian3.negate( + de, + de + )), G = Cartesian3.unpack( + n, + l, + segmentEndBottomScratch + ), q = Cartesian3.unpack(i, l, segmentEndTopScratch), z = Cartesian3.unpack( + r, + l, + segmentEndNormalScratch + ), $ = breakMiter(z, X, G, q), R.latitude = o[B], R.longitude = o[B + 1], L.latitude = o[B + 2], L.longitude = o[B + 3]; + let ce, ye, ge, re; + if (s) { + const Ae = nudgeCartographic(R, L); + ce = t.project(R, segmentStart2DScratch), ye = t.project(L, segmentEnd2DScratch); + const ke = direction(ye, ce, forwardOffset2DScratch); + ke.y = Math.abs(ke.y), ge = segmentStartNormal2DScratch, re = segmentEndNormal2DScratch, Ae === 0 || Cartesian3.dot(ke, Cartesian3.UNIT_Y) > MITER_BREAK_SMALL ? (ge = projectNormal( + t, + R, + de, + ce, + segmentStartNormal2DScratch + ), re = projectNormal( + t, + L, + z, + ye, + segmentEndNormal2DScratch + )) : Ae === 1 ? (re = projectNormal( + t, + L, + z, + ye, + segmentEndNormal2DScratch + ), ge.x = 0, ge.y = CesiumMath.sign( + R.longitude - Math.abs(L.longitude) + ), ge.z = 0) : (ge = projectNormal( + t, + R, + de, + ce, + segmentStartNormal2DScratch + ), re.x = 0, re.y = CesiumMath.sign( + R.longitude - L.longitude + ), re.z = 0); + } + const be = Cartesian3.distance(fe, q), pe = EncodedCartesian3.fromCartesian( + X, + encodeScratch + ), Te = Cartesian3.subtract( + G, + X, + offsetScratch$a + ), xe = Cartesian3.normalize(Te, rightScratch); + let W = Cartesian3.subtract(fe, X, startUpScratch); + W = Cartesian3.normalize(W, W); + let j = Cartesian3.cross(xe, W, rightScratch); + j = Cartesian3.normalize(j, j); + let se = Cartesian3.cross( + W, + de, + startPlaneNormalScratch + ); + se = Cartesian3.normalize(se, se); + let Pe = Cartesian3.subtract(q, G, endUpScratch); + Pe = Cartesian3.normalize(Pe, Pe); + let le = Cartesian3.cross( + z, + Pe, + endPlaneNormalScratch + ); + le = Cartesian3.normalize(le, le); + const De = be / N, Me = H / N; + let He = 0, Oe, $e, J, ae = 0, te = 0; + if (s) { + He = Cartesian3.distance(ce, ye), Oe = EncodedCartesian3.fromCartesian( + ce, + encodeScratch2D + ), $e = Cartesian3.subtract( + ye, + ce, + forwardOffset2DScratch + ), J = Cartesian3.normalize($e, right2DScratch); + const Ae = J.x; + J.x = J.y, J.y = -Ae, ae = He / M, te = Q / M; + } + for (F = 0; F < 8; F++) { + const Ae = k + F * 4, ke = V + F * 2, Fe = Ae + 3, Je = F < 4 ? 1 : -1, ve = F === 2 || F === 3 || F === 6 || F === 7 ? 1 : -1; + Cartesian3.pack(pe.high, C, Ae), C[Fe] = Te.x, Cartesian3.pack(pe.low, T, Ae), T[Fe] = Te.y, Cartesian3.pack( + se, + x, + Ae + ), x[Fe] = Te.z, Cartesian3.pack( + le, + b, + Ae + ), b[Fe] = De * Je, Cartesian3.pack( + j, + S, + Ae + ); + let Le = Me * ve; + Le === 0 && ve < 0 && (Le = 9), S[Fe] = Le, s && (E[Ae] = Oe.high.x, E[Ae + 1] = Oe.high.y, E[Ae + 2] = Oe.low.x, E[Ae + 3] = Oe.low.y, D[Ae] = -ge.y, D[Ae + 1] = ge.x, D[Ae + 2] = re.y, D[Ae + 3] = -re.x, A[Ae] = $e.x, A[Ae + 1] = $e.y, A[Ae + 2] = J.x, A[Ae + 3] = J.y, P[ke] = ae * Je, Le = te * ve, Le === 0 && ve < 0 && (Le = 9), P[ke + 1] = Le); + } + const ie = adjustHeightStartBottomScratch, ue = adjustHeightEndBottomScratch, me = adjustHeightStartTopScratch, Se = adjustHeightEndTopScratch, we = Rectangle.fromCartographicArray( + getHeightCartographics, + getHeightRectangleScratch + ), Ee = ApproximateTerrainHeights.getMinimumMaximumHeights( + we, + d + ), Ve = Ee.minimumTerrainHeight, We = Ee.maximumTerrainHeight; + ne += Math.abs(Ve), ne += Math.abs(We), adjustHeights( + X, + fe, + Ve, + We, + ie, + me + ), adjustHeights( + G, + q, + Ve, + We, + ue, + Se + ); + let Ne = Cartesian3.multiplyByScalar( + j, + CesiumMath.EPSILON5, + normalNudgeScratch + ); + Cartesian3.add( + ie, + Ne, + ie + ), Cartesian3.add(ue, Ne, ue), Cartesian3.add(me, Ne, me), Cartesian3.add(Se, Ne, Se), nudgeXZ(ie, ue), nudgeXZ(me, Se), Cartesian3.pack(ie, y, U), Cartesian3.pack(ue, y, U + 3), Cartesian3.pack(Se, y, U + 6), Cartesian3.pack(me, y, U + 9), Ne = Cartesian3.multiplyByScalar( + j, + -2 * CesiumMath.EPSILON5, + normalNudgeScratch + ), Cartesian3.add( + ie, + Ne, + ie + ), Cartesian3.add(ue, Ne, ue), Cartesian3.add(me, Ne, me), Cartesian3.add(Se, Ne, Se), nudgeXZ(ie, ue), nudgeXZ(me, Se), Cartesian3.pack( + ie, + y, + U + 12 + ), Cartesian3.pack( + ue, + y, + U + 15 + ), Cartesian3.pack(Se, y, U + 18), Cartesian3.pack(me, y, U + 21), B += 2, l += 3, V += 16, U += 24, k += 32, H += be, Q += He; + } + l = 0; + let K = 0; + for (c = 0; c < f; c++) { + for (F = 0; F < REFERENCE_INDICES_LENGTH; F++) + _[l + F] = REFERENCE_INDICES[F] + K; + K += 8, l += REFERENCE_INDICES_LENGTH; + } + const Z = scratchBoundingSpheres; + BoundingSphere.fromVertices( + n, + Cartesian3.ZERO, + 3, + Z[0] + ), BoundingSphere.fromVertices( + i, + Cartesian3.ZERO, + 3, + Z[1] + ); + const ee = BoundingSphere.fromBoundingSpheres(Z); + ee.radius += ne / (f * 2); + const oe = { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + normalize: !1, + values: y + }), + startHiAndForwardOffsetX: getVec4GeometryAttribute( + C + ), + startLoAndForwardOffsetY: getVec4GeometryAttribute( + T + ), + startNormalAndForwardOffsetZ: getVec4GeometryAttribute( + x + ), + endNormalAndTextureCoordinateNormalizationX: getVec4GeometryAttribute( + b + ), + rightNormalAndTextureCoordinateNormalizationY: getVec4GeometryAttribute( + S + ) + }; + return s && (oe.startHiLo2D = getVec4GeometryAttribute(E), oe.offsetAndRight2D = getVec4GeometryAttribute(A), oe.startEndNormals2D = getVec4GeometryAttribute(D), oe.texcoordNormalization2D = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + normalize: !1, + values: P + })), new Geometry({ + attributes: oe, + indices: _, + boundingSphere: ee + }); +} +function getVec4GeometryAttribute(e) { + return new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4, + normalize: !1, + values: e + }); +} +GroundPolylineGeometry._projectNormal = projectNormal; +const PolylineShadowVolumeFS = `in vec4 v_startPlaneNormalEcAndHalfWidth; +in vec4 v_endPlaneNormalEcAndBatchId; +in vec4 v_rightPlaneEC; // Technically can compute distance for this here +in vec4 v_endEcAndStartEcX; +in vec4 v_texcoordNormalizationAndStartEcYZ; + +#ifdef PER_INSTANCE_COLOR +in vec4 v_color; +#endif + +void main(void) +{ + float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw))); + vec3 ecStart = vec3(v_endEcAndStartEcX.w, v_texcoordNormalizationAndStartEcYZ.zw); + + // Discard for sky + if (logDepthOrDepth == 0.0) { +#ifdef DEBUG_SHOW_VOLUME + out_FragColor = vec4(1.0, 0.0, 0.0, 0.5); + return; +#else // DEBUG_SHOW_VOLUME + discard; +#endif // DEBUG_SHOW_VOLUME + } + + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); + eyeCoordinate /= eyeCoordinate.w; + + float halfMaxWidth = v_startPlaneNormalEcAndHalfWidth.w * czm_metersPerPixel(eyeCoordinate); + // Check distance of the eye coordinate against the right-facing plane + float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz); + + // Check eye coordinate against the mitering planes + float distanceFromStart = czm_planeDistance(v_startPlaneNormalEcAndHalfWidth.xyz, -dot(ecStart, v_startPlaneNormalEcAndHalfWidth.xyz), eyeCoordinate.xyz); + float distanceFromEnd = czm_planeDistance(v_endPlaneNormalEcAndBatchId.xyz, -dot(v_endEcAndStartEcX.xyz, v_endPlaneNormalEcAndBatchId.xyz), eyeCoordinate.xyz); + + if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { +#ifdef DEBUG_SHOW_VOLUME + out_FragColor = vec4(1.0, 0.0, 0.0, 0.5); + return; +#else // DEBUG_SHOW_VOLUME + discard; +#endif // DEBUG_SHOW_VOLUME + } + + // Check distance of the eye coordinate against start and end planes with normals in the right plane. + // For computing unskewed lengthwise texture coordinate. + // Can also be used for clipping extremely pointy miters, but in practice unnecessary because of miter breaking. + + // aligned plane: cross the right plane normal with miter plane normal, then cross the result with right again to point it more "forward" + vec3 alignedPlaneNormal; + + // start aligned plane + alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_startPlaneNormalEcAndHalfWidth.xyz); + alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); + distanceFromStart = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, ecStart), eyeCoordinate.xyz); + + // end aligned plane + alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_endPlaneNormalEcAndBatchId.xyz); + alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); + distanceFromEnd = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, v_endEcAndStartEcX.xyz), eyeCoordinate.xyz); + +#ifdef PER_INSTANCE_COLOR + out_FragColor = czm_gammaCorrect(v_color); +#else // PER_INSTANCE_COLOR + // Clamp - distance to aligned planes may be negative due to mitering, + // so fragment texture coordinate might be out-of-bounds. + float s = clamp(distanceFromStart / (distanceFromStart + distanceFromEnd), 0.0, 1.0); + s = (s * v_texcoordNormalizationAndStartEcYZ.x) + v_texcoordNormalizationAndStartEcYZ.y; + float t = (widthwiseDistance + halfMaxWidth) / (2.0 * halfMaxWidth); + + czm_materialInput materialInput; + + materialInput.s = s; + materialInput.st = vec2(s, t); + materialInput.str = vec3(s, t, 0.0); + + czm_material material = czm_getMaterial(materialInput); + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#endif // PER_INSTANCE_COLOR + + // Premultiply alpha. Required for classification primitives on translucent globe. + out_FragColor.rgb *= out_FragColor.a; + + czm_writeDepthClamp(); +} +`, PolylineShadowVolumeMorphFS = `in vec3 v_forwardDirectionEC; +in vec3 v_texcoordNormalizationAndHalfWidth; +in float v_batchId; + +#ifdef PER_INSTANCE_COLOR +in vec4 v_color; +#else +in vec2 v_alignedPlaneDistances; +in float v_texcoordT; +#endif + +float rayPlaneDistanceUnsafe(vec3 origin, vec3 direction, vec3 planeNormal, float planeDistance) { + // We don't expect the ray to ever be parallel to the plane + return (-planeDistance - dot(planeNormal, origin)) / dot(planeNormal, direction); +} + +void main(void) +{ + vec4 eyeCoordinate = gl_FragCoord; + eyeCoordinate /= eyeCoordinate.w; + +#ifdef PER_INSTANCE_COLOR + out_FragColor = czm_gammaCorrect(v_color); +#else // PER_INSTANCE_COLOR + // Use distances for planes aligned with segment to prevent skew in dashing + float distanceFromStart = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, -v_forwardDirectionEC, v_forwardDirectionEC.xyz, v_alignedPlaneDistances.x); + float distanceFromEnd = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, v_forwardDirectionEC, -v_forwardDirectionEC.xyz, v_alignedPlaneDistances.y); + + // Clamp - distance to aligned planes may be negative due to mitering + distanceFromStart = max(0.0, distanceFromStart); + distanceFromEnd = max(0.0, distanceFromEnd); + + float s = distanceFromStart / (distanceFromStart + distanceFromEnd); + s = (s * v_texcoordNormalizationAndHalfWidth.x) + v_texcoordNormalizationAndHalfWidth.y; + + czm_materialInput materialInput; + + materialInput.s = s; + materialInput.st = vec2(s, v_texcoordT); + materialInput.str = vec3(s, v_texcoordT, 0.0); + + czm_material material = czm_getMaterial(materialInput); + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#endif // PER_INSTANCE_COLOR +} +`, PolylineShadowVolumeMorphVS = `in vec3 position3DHigh; +in vec3 position3DLow; + +in vec4 startHiAndForwardOffsetX; +in vec4 startLoAndForwardOffsetY; +in vec4 startNormalAndForwardOffsetZ; +in vec4 endNormalAndTextureCoordinateNormalizationX; +in vec4 rightNormalAndTextureCoordinateNormalizationY; +in vec4 startHiLo2D; +in vec4 offsetAndRight2D; +in vec4 startEndNormals2D; +in vec2 texcoordNormalization2D; + +in float batchId; + +out vec3 v_forwardDirectionEC; +out vec3 v_texcoordNormalizationAndHalfWidth; +out float v_batchId; + +// For materials +#ifdef WIDTH_VARYING +out float v_width; +#endif +#ifdef ANGLE_VARYING +out float v_polylineAngle; +#endif + +#ifdef PER_INSTANCE_COLOR +out vec4 v_color; +#else +out vec2 v_alignedPlaneDistances; +out float v_texcoordT; +#endif + +// Morphing planes using SLERP or NLERP doesn't seem to work, so instead draw the material directly on the shadow volume. +// Morph views are from very far away and aren't meant to be used precisely, so this should be sufficient. +void main() +{ + v_batchId = batchId; + + // Start position + vec4 posRelativeToEye2D = czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw)); + vec4 posRelativeToEye3D = czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz); + vec4 posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); + vec3 posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; + vec3 posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; + vec3 startEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; + + // Start plane + vec4 startPlane2D; + vec4 startPlane3D; + startPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); + startPlane3D.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; + startPlane2D.w = -dot(startPlane2D.xyz, posEc2D); + startPlane3D.w = -dot(startPlane3D.xyz, posEc3D); + + // Right plane + vec4 rightPlane2D; + vec4 rightPlane3D; + rightPlane2D.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); + rightPlane3D.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; + rightPlane2D.w = -dot(rightPlane2D.xyz, posEc2D); + rightPlane3D.w = -dot(rightPlane3D.xyz, posEc3D); + + // End position + posRelativeToEye2D = posRelativeToEye2D + vec4(0.0, offsetAndRight2D.xy, 0.0); + posRelativeToEye3D = posRelativeToEye3D + vec4(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w, 0.0); + posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); + posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; + posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; + vec3 endEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; + vec3 forwardEc3D = czm_normal * normalize(vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w)); + vec3 forwardEc2D = czm_normal * normalize(vec3(0.0, offsetAndRight2D.xy)); + + // End plane + vec4 endPlane2D; + vec4 endPlane3D; + endPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); + endPlane3D.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; + endPlane2D.w = -dot(endPlane2D.xyz, posEc2D); + endPlane3D.w = -dot(endPlane3D.xyz, posEc3D); + + // Forward direction + v_forwardDirectionEC = normalize(endEC - startEC); + + vec2 cleanTexcoordNormalization2D; + cleanTexcoordNormalization2D.x = abs(texcoordNormalization2D.x); + cleanTexcoordNormalization2D.y = czm_branchFreeTernary(texcoordNormalization2D.y > 1.0, 0.0, abs(texcoordNormalization2D.y)); + vec2 cleanTexcoordNormalization3D; + cleanTexcoordNormalization3D.x = abs(endNormalAndTextureCoordinateNormalizationX.w); + cleanTexcoordNormalization3D.y = rightNormalAndTextureCoordinateNormalizationY.w; + cleanTexcoordNormalization3D.y = czm_branchFreeTernary(cleanTexcoordNormalization3D.y > 1.0, 0.0, abs(cleanTexcoordNormalization3D.y)); + + v_texcoordNormalizationAndHalfWidth.xy = mix(cleanTexcoordNormalization2D, cleanTexcoordNormalization3D, czm_morphTime); + +#ifdef PER_INSTANCE_COLOR + v_color = czm_batchTable_color(batchId); +#else // PER_INSTANCE_COLOR + // For computing texture coordinates + + v_alignedPlaneDistances.x = -dot(v_forwardDirectionEC, startEC); + v_alignedPlaneDistances.y = -dot(-v_forwardDirectionEC, endEC); +#endif // PER_INSTANCE_COLOR + +#ifdef WIDTH_VARYING + float width = czm_batchTable_width(batchId); + float halfWidth = width * 0.5; + v_width = width; + v_texcoordNormalizationAndHalfWidth.z = halfWidth; +#else + float halfWidth = 0.5 * czm_batchTable_width(batchId); + v_texcoordNormalizationAndHalfWidth.z = halfWidth; +#endif + + // Compute a normal along which to "push" the position out, extending the miter depending on view distance. + // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. + // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. + // Since this is morphing, compute both 3D and 2D positions and then blend. + + // ****** 3D ****** + // Check distance to the end plane and start plane, pick the plane that is closer + vec4 positionEc3D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position3DHigh, position3DLow); // w = 1.0, see czm_computePosition + float absStartPlaneDistance = abs(czm_planeDistance(startPlane3D, positionEc3D.xyz)); + float absEndPlaneDistance = abs(czm_planeDistance(endPlane3D, positionEc3D.xyz)); + vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane3D.xyz, endPlane3D.xyz); + vec3 upOrDown = normalize(cross(rightPlane3D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. + vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. + + // Nudge the top vertex upwards to prevent flickering + vec3 geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc3D)); + geodeticSurfaceNormal *= float(0.0 <= rightNormalAndTextureCoordinateNormalizationY.w && rightNormalAndTextureCoordinateNormalizationY.w <= 1.0); + geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; + positionEc3D.xyz += geodeticSurfaceNormal; + + // Determine if this vertex is on the "left" or "right" + normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); + + // A "perfect" implementation would push along normals according to the angle against forward. + // In practice, just pushing the normal out by halfWidth is sufficient for morph views. + positionEc3D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc3D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) + + // ****** 2D ****** + // Check distance to the end plane and start plane, pick the plane that is closer + vec4 positionEc2D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); // w = 1.0, see czm_computePosition + absStartPlaneDistance = abs(czm_planeDistance(startPlane2D, positionEc2D.xyz)); + absEndPlaneDistance = abs(czm_planeDistance(endPlane2D, positionEc2D.xyz)); + planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane2D.xyz, endPlane2D.xyz); + upOrDown = normalize(cross(rightPlane2D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. + normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. + + // Nudge the top vertex upwards to prevent flickering + geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc2D)); + geodeticSurfaceNormal *= float(0.0 <= texcoordNormalization2D.y && texcoordNormalization2D.y <= 1.0); + geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; + positionEc2D.xyz += geodeticSurfaceNormal; + + // Determine if this vertex is on the "left" or "right" + normalEC *= sign(texcoordNormalization2D.x); +#ifndef PER_INSTANCE_COLOR + // Use vertex's sidedness to compute its texture coordinate. + v_texcoordT = clamp(sign(texcoordNormalization2D.x), 0.0, 1.0); +#endif + + // A "perfect" implementation would push along normals according to the angle against forward. + // In practice, just pushing the normal out by halfWidth is sufficient for morph views. + positionEc2D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc2D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) + + // Blend for actual position + gl_Position = czm_projection * mix(positionEc2D, positionEc3D, czm_morphTime); + +#ifdef ANGLE_VARYING + // Approximate relative screen space direction of the line. + vec2 approxLineDirection = normalize(vec2(v_forwardDirectionEC.x, -v_forwardDirectionEC.y)); + approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); + v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); +#endif +} +`, PolylineShadowVolumeVS = `in vec3 position3DHigh; +in vec3 position3DLow; + +// In 2D and in 3D, texture coordinate normalization component signs encodes: +// * X sign - sidedness relative to right plane +// * Y sign - is negative OR magnitude is greater than 1.0 if vertex is on bottom of volume +#ifndef COLUMBUS_VIEW_2D +in vec4 startHiAndForwardOffsetX; +in vec4 startLoAndForwardOffsetY; +in vec4 startNormalAndForwardOffsetZ; +in vec4 endNormalAndTextureCoordinateNormalizationX; +in vec4 rightNormalAndTextureCoordinateNormalizationY; +#else +in vec4 startHiLo2D; +in vec4 offsetAndRight2D; +in vec4 startEndNormals2D; +in vec2 texcoordNormalization2D; +#endif + +in float batchId; + +out vec4 v_startPlaneNormalEcAndHalfWidth; +out vec4 v_endPlaneNormalEcAndBatchId; +out vec4 v_rightPlaneEC; +out vec4 v_endEcAndStartEcX; +out vec4 v_texcoordNormalizationAndStartEcYZ; + +// For materials +#ifdef WIDTH_VARYING +out float v_width; +#endif +#ifdef ANGLE_VARYING +out float v_polylineAngle; +#endif + +#ifdef PER_INSTANCE_COLOR +out vec4 v_color; +#endif + +void main() +{ +#ifdef COLUMBUS_VIEW_2D + vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw))).xyz; + + vec3 forwardDirectionEC = czm_normal * vec3(0.0, offsetAndRight2D.xy); + vec3 ecEnd = forwardDirectionEC + ecStart; + forwardDirectionEC = normalize(forwardDirectionEC); + + // Right plane + v_rightPlaneEC.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); + v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); + + // start plane + vec4 startPlaneEC; + startPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); + startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); + + // end plane + vec4 endPlaneEC; + endPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); + endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); + + v_texcoordNormalizationAndStartEcYZ.x = abs(texcoordNormalization2D.x); + v_texcoordNormalizationAndStartEcYZ.y = texcoordNormalization2D.y; + +#else // COLUMBUS_VIEW_2D + vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz)).xyz; + vec3 offset = czm_normal * vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w); + vec3 ecEnd = ecStart + offset; + + vec3 forwardDirectionEC = normalize(offset); + + // start plane + vec4 startPlaneEC; + startPlaneEC.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; + startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); + + // end plane + vec4 endPlaneEC; + endPlaneEC.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; + endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); + + // Right plane + v_rightPlaneEC.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; + v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); + + v_texcoordNormalizationAndStartEcYZ.x = abs(endNormalAndTextureCoordinateNormalizationX.w); + v_texcoordNormalizationAndStartEcYZ.y = rightNormalAndTextureCoordinateNormalizationY.w; + +#endif // COLUMBUS_VIEW_2D + + v_endEcAndStartEcX.xyz = ecEnd; + v_endEcAndStartEcX.w = ecStart.x; + v_texcoordNormalizationAndStartEcYZ.zw = ecStart.yz; + +#ifdef PER_INSTANCE_COLOR + v_color = czm_batchTable_color(batchId); +#endif // PER_INSTANCE_COLOR + + // Compute a normal along which to "push" the position out, extending the miter depending on view distance. + // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. + // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. + vec4 positionRelativeToEye = czm_computePosition(); + + // Check distance to the end plane and start plane, pick the plane that is closer + vec4 positionEC = czm_modelViewRelativeToEye * positionRelativeToEye; // w = 1.0, see czm_computePosition + float absStartPlaneDistance = abs(czm_planeDistance(startPlaneEC, positionEC.xyz)); + float absEndPlaneDistance = abs(czm_planeDistance(endPlaneEC, positionEC.xyz)); + vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlaneEC.xyz, endPlaneEC.xyz); + vec3 upOrDown = normalize(cross(v_rightPlaneEC.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. + vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. + + // Extrude bottom vertices downward for far view distances, like for GroundPrimitives + upOrDown = cross(forwardDirectionEC, normalEC); + upOrDown = float(czm_sceneMode == czm_sceneMode3D) * upOrDown; + upOrDown = float(v_texcoordNormalizationAndStartEcYZ.y > 1.0 || v_texcoordNormalizationAndStartEcYZ.y < 0.0) * upOrDown; + upOrDown = min(GLOBE_MINIMUM_ALTITUDE, czm_geometricToleranceOverMeter * length(positionRelativeToEye.xyz)) * upOrDown; + positionEC.xyz += upOrDown; + + v_texcoordNormalizationAndStartEcYZ.y = czm_branchFreeTernary(v_texcoordNormalizationAndStartEcYZ.y > 1.0, 0.0, abs(v_texcoordNormalizationAndStartEcYZ.y)); + + // Determine distance along normalEC to push for a volume of appropriate width. + // Make volumes about double pixel width for a conservative fit - in practice the + // extra cost here is minimal compared to the loose volume heights. + // + // N = normalEC (guaranteed "right-facing") + // R = rightEC + // p = angle between N and R + // w = distance to push along R if R == N + // d = distance to push along N + // + // N R + // { p| } * cos(p) = dot(N, R) = w / d + // d | |w * d = w / dot(N, R) + // { | } + // o---------- polyline segment ----> + // + float width = czm_batchTable_width(batchId); +#ifdef WIDTH_VARYING + v_width = width; +#endif + + v_startPlaneNormalEcAndHalfWidth.xyz = startPlaneEC.xyz; + v_startPlaneNormalEcAndHalfWidth.w = width * 0.5; + + v_endPlaneNormalEcAndBatchId.xyz = endPlaneEC.xyz; + v_endPlaneNormalEcAndBatchId.w = batchId; + + width = width * max(0.0, czm_metersPerPixel(positionEC)); // width = distance to push along R + width = width / dot(normalEC, v_rightPlaneEC.xyz); // width = distance to push along N + + // Determine if this vertex is on the "left" or "right" +#ifdef COLUMBUS_VIEW_2D + normalEC *= sign(texcoordNormalization2D.x); +#else + normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); +#endif + + positionEC.xyz += width * normalEC; + gl_Position = czm_depthClamp(czm_projection * positionEC); + +#ifdef ANGLE_VARYING + // Approximate relative screen space direction of the line. + vec2 approxLineDirection = normalize(vec2(forwardDirectionEC.x, -forwardDirectionEC.y)); + approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); + v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); +#endif +} +`, PolylineColorAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 prevPosition3DHigh; +in vec3 prevPosition3DLow; +in vec3 nextPosition3DHigh; +in vec3 nextPosition3DLow; +in vec2 expandAndWidth; +in vec4 color; +in float batchId; + +out vec4 v_color; + +void main() +{ + float expandDir = expandAndWidth.x; + float width = abs(expandAndWidth.y) + 0.5; + bool usePrev = expandAndWidth.y < 0.0; + + vec4 p = czm_computePosition(); + vec4 prev = czm_computePrevPosition(); + vec4 next = czm_computeNextPosition(); + + float angle; + vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); + gl_Position = czm_viewportOrthographic * positionWC; + + v_color = color; +} +`, PolylineCommon = `void clipLineSegmentToNearPlane( + vec3 p0, + vec3 p1, + out vec4 positionWC, + out bool clipped, + out bool culledByNearPlane, + out vec4 clippedPositionEC) +{ + culledByNearPlane = false; + clipped = false; + + vec3 p0ToP1 = p1 - p0; + float magnitude = length(p0ToP1); + vec3 direction = normalize(p0ToP1); + + // Distance that p0 is behind the near plane. Negative means p0 is + // in front of the near plane. + float endPoint0Distance = czm_currentFrustum.x + p0.z; + + // Camera looks down -Z. + // When moving a point along +Z: LESS VISIBLE + // * Points in front of the camera move closer to the camera. + // * Points behind the camrea move farther away from the camera. + // When moving a point along -Z: MORE VISIBLE + // * Points in front of the camera move farther away from the camera. + // * Points behind the camera move closer to the camera. + + // Positive denominator: -Z, becoming more visible + // Negative denominator: +Z, becoming less visible + // Nearly zero: parallel to near plane + float denominator = -direction.z; + + if (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7) + { + // p0 is behind the near plane and the line to p1 is nearly parallel to + // the near plane, so cull the segment completely. + culledByNearPlane = true; + } + else if (endPoint0Distance > 0.0) + { + // p0 is behind the near plane, and the line to p1 is moving distinctly + // toward or away from it. + + // t = (-plane distance - dot(plane normal, ray origin)) / dot(plane normal, ray direction) + float t = endPoint0Distance / denominator; + if (t < 0.0 || t > magnitude) + { + // Near plane intersection is not between the two points. + // We already confirmed p0 is behind the naer plane, so now + // we know the entire segment is behind it. + culledByNearPlane = true; + } + else + { + // Segment crosses the near plane, update p0 to lie exactly on it. + p0 = p0 + t * direction; + + // Numerical noise might put us a bit on the wrong side of the near plane. + // Don't let that happen. + p0.z = min(p0.z, -czm_currentFrustum.x); + + clipped = true; + } + } + + clippedPositionEC = vec4(p0, 1.0); + positionWC = czm_eyeToWindowCoordinates(clippedPositionEC); +} + +vec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle) +{ + // expandDirection +1 is to the _left_ when looking from positionEC toward nextEC. + +#ifdef POLYLINE_DASH + // Compute the window coordinates of the points. + vec4 positionWindow = czm_eyeToWindowCoordinates(positionEC); + vec4 previousWindow = czm_eyeToWindowCoordinates(prevEC); + vec4 nextWindow = czm_eyeToWindowCoordinates(nextEC); + + // Determine the relative screen space direction of the line. + vec2 lineDir; + if (usePrevious) { + lineDir = normalize(positionWindow.xy - previousWindow.xy); + } + else { + lineDir = normalize(nextWindow.xy - positionWindow.xy); + } + angle = atan(lineDir.x, lineDir.y) - 1.570796327; // precomputed atan(1,0) + + // Quantize the angle so it doesn't change rapidly between segments. + angle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour; +#endif + + vec4 clippedPrevWC, clippedPrevEC; + bool prevSegmentClipped, prevSegmentCulled; + clipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC); + + vec4 clippedNextWC, clippedNextEC; + bool nextSegmentClipped, nextSegmentCulled; + clipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC); + + bool segmentClipped, segmentCulled; + vec4 clippedPositionWC, clippedPositionEC; + clipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC); + + if (segmentCulled) + { + return vec4(0.0, 0.0, 0.0, 1.0); + } + + vec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy); + vec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy); + + // If a segment was culled, we can't use the corresponding direction + // computed above. We should never see both of these be true without + // \`segmentCulled\` above also being true. + if (prevSegmentCulled) + { + directionToPrevWC = -directionToNextWC; + } + else if (nextSegmentCulled) + { + directionToNextWC = -directionToPrevWC; + } + + vec2 thisSegmentForwardWC, otherSegmentForwardWC; + if (usePrevious) + { + thisSegmentForwardWC = -directionToPrevWC; + otherSegmentForwardWC = directionToNextWC; + } + else + { + thisSegmentForwardWC = directionToNextWC; + otherSegmentForwardWC = -directionToPrevWC; + } + + vec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x); + + vec2 leftWC = thisSegmentLeftWC; + float expandWidth = width * 0.5; + + // When lines are split at the anti-meridian, the position may be at the + // same location as the next or previous position, and we need to handle + // that to avoid producing NaNs. + if (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1)) + { + vec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x); + + vec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC; + float leftSumLength = length(leftSumWC); + leftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength); + + // The sine of the angle between the two vectors is given by the formula + // |a x b| = |a||b|sin(theta) + // which is + // float sinAngle = length(cross(vec3(leftWC, 0.0), vec3(-thisSegmentForwardWC, 0.0))); + // Because the z components of both vectors are zero, the x and y coordinate will be zero. + // Therefore, the sine of the angle is just the z component of the cross product. + vec2 u = -thisSegmentForwardWC; + vec2 v = leftWC; + float sinAngle = abs(u.x * v.y - u.y * v.x); + expandWidth = clamp(expandWidth / sinAngle, 0.0, width * 2.0); + } + + vec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio; + return vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w; +} + +vec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle) +{ + vec4 positionEC = czm_modelViewRelativeToEye * position; + vec4 prevEC = czm_modelViewRelativeToEye * previous; + vec4 nextEC = czm_modelViewRelativeToEye * next; + return getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle); +} +`; +let defaultVertexShaderSource$1 = `${PolylineCommon} +${PolylineColorAppearanceVS}`; +const defaultFragmentShaderSource$1 = PerInstanceFlatColorAppearanceFS; +FeatureDetection.isInternetExplorer() || (defaultVertexShaderSource$1 = `#define CLIP_POLYLINE +${defaultVertexShaderSource$1}`); +function PolylineColorAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.translucent, !0), n = !1, i = PolylineColorAppearance.VERTEX_FORMAT; + this.material = void 0, this.translucent = t, this._vertexShaderSource = defaultValue( + e.vertexShaderSource, + defaultVertexShaderSource$1 + ), this._fragmentShaderSource = defaultValue( + e.fragmentShaderSource, + defaultFragmentShaderSource$1 + ), this._renderState = Appearance.getDefaultRenderState( + t, + n, + e.renderState + ), this._closed = n, this._vertexFormat = i; +} +Object.defineProperties(PolylineColorAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof PolylineColorAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. + * + * @memberof PolylineColorAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PolylineColorAppearance} + * instance, or it is set implicitly via {@link PolylineColorAppearance#translucent}. + *

+ * + * @memberof PolylineColorAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When true, the geometry is expected to be closed so + * {@link PolylineColorAppearance#renderState} has backface culling enabled. + * This is always false for PolylineColorAppearance. + * + * @memberof PolylineColorAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + * + * @memberof PolylineColorAppearance.prototype + * + * @type VertexFormat + * @readonly + * + * @default {@link PolylineColorAppearance.VERTEX_FORMAT} + */ + vertexFormat: { + get: function() { + return this._vertexFormat; + } + } +}); +PolylineColorAppearance.VERTEX_FORMAT = VertexFormat.POSITION_ONLY; +PolylineColorAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +PolylineColorAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +PolylineColorAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +const PolylineMaterialAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 prevPosition3DHigh; +in vec3 prevPosition3DLow; +in vec3 nextPosition3DHigh; +in vec3 nextPosition3DLow; +in vec2 expandAndWidth; +in vec2 st; +in float batchId; + +out float v_width; +out vec2 v_st; +out float v_polylineAngle; + +void main() +{ + float expandDir = expandAndWidth.x; + float width = abs(expandAndWidth.y) + 0.5; + bool usePrev = expandAndWidth.y < 0.0; + + vec4 p = czm_computePosition(); + vec4 prev = czm_computePrevPosition(); + vec4 next = czm_computeNextPosition(); + + float angle; + vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); + gl_Position = czm_viewportOrthographic * positionWC; + + v_width = width; + v_st.s = st.s; + v_st.t = czm_writeNonPerspective(st.t, gl_Position.w); + v_polylineAngle = angle; +} +`, PolylineFS$1 = `#ifdef VECTOR_TILE +uniform vec4 u_highlightColor; +#endif + +in vec2 v_st; + +void main() +{ + czm_materialInput materialInput; + + vec2 st = v_st; + st.t = czm_readNonPerspective(st.t, gl_FragCoord.w); + + materialInput.s = st.s; + materialInput.st = st; + materialInput.str = vec3(st, 0.0); + + czm_material material = czm_getMaterial(materialInput); + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#ifdef VECTOR_TILE + out_FragColor *= u_highlightColor; +#endif + + czm_writeLogDepth(); +} +`; +let defaultVertexShaderSource = `${PolylineCommon} +${PolylineMaterialAppearanceVS}`; +const defaultFragmentShaderSource = PolylineFS$1; +FeatureDetection.isInternetExplorer() || (defaultVertexShaderSource = `#define CLIP_POLYLINE +${defaultVertexShaderSource}`); +function PolylineMaterialAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.translucent, !0), n = !1, i = PolylineMaterialAppearance.VERTEX_FORMAT; + this.material = defined(e.material) ? e.material : Material$4.fromType(Material$4.ColorType), this.translucent = t, this._vertexShaderSource = defaultValue( + e.vertexShaderSource, + defaultVertexShaderSource + ), this._fragmentShaderSource = defaultValue( + e.fragmentShaderSource, + defaultFragmentShaderSource + ), this._renderState = Appearance.getDefaultRenderState( + t, + n, + e.renderState + ), this._closed = n, this._vertexFormat = i; +} +Object.defineProperties(PolylineMaterialAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof PolylineMaterialAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + let e = this._vertexShaderSource; + return this.material.shaderSource.search(/in\s+float\s+v_polylineAngle;/g) !== -1 && (e = `#define POLYLINE_DASH +${e}`), e; + } + }, + /** + * The GLSL source code for the fragment shader. + * + * @memberof PolylineMaterialAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PolylineMaterialAppearance} + * instance, or it is set implicitly via {@link PolylineMaterialAppearance#translucent} + * and {@link PolylineMaterialAppearance#closed}. + *

+ * + * @memberof PolylineMaterialAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When true, the geometry is expected to be closed so + * {@link PolylineMaterialAppearance#renderState} has backface culling enabled. + * This is always false for PolylineMaterialAppearance. + * + * @memberof PolylineMaterialAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + * + * @memberof PolylineMaterialAppearance.prototype + * + * @type VertexFormat + * @readonly + * + * @default {@link PolylineMaterialAppearance.VERTEX_FORMAT} + */ + vertexFormat: { + get: function() { + return this._vertexFormat; + } + } +}); +PolylineMaterialAppearance.VERTEX_FORMAT = VertexFormat.POSITION_AND_ST; +PolylineMaterialAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +PolylineMaterialAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +PolylineMaterialAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +function GroundPolylinePrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.geometryInstances = e.geometryInstances, this._hasPerInstanceColors = !0; + let t = e.appearance; + defined(t) || (t = new PolylineMaterialAppearance()), this.appearance = t, this.show = defaultValue(e.show, !0), this.classificationType = defaultValue( + e.classificationType, + ClassificationType$1.BOTH + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this._debugShowShadowVolume = defaultValue( + e.debugShowShadowVolume, + !1 + ), this._primitiveOptions = { + geometryInstances: void 0, + appearance: void 0, + vertexCacheOptimize: !1, + interleave: defaultValue(e.interleave, !1), + releaseGeometryInstances: defaultValue( + e.releaseGeometryInstances, + !0 + ), + allowPicking: defaultValue(e.allowPicking, !0), + asynchronous: defaultValue(e.asynchronous, !0), + compressVertices: !1, + _createShaderProgramFunction: void 0, + _createCommandsFunction: void 0, + _updateAndQueueCommandsFunction: void 0 + }, this._zIndex = void 0, this._ready = !1, this._primitive = void 0, this._sp = void 0, this._sp2D = void 0, this._spMorph = void 0, this._renderState = getRenderState$1(!1), this._renderState3DTiles = getRenderState$1(!0), this._renderStateMorph = RenderState.fromCache({ + cull: { + enabled: !0, + face: CullFace$1.FRONT + // Geometry is "inverted," so cull front when materials on volume instead of on terrain (morph) + }, + depthTest: { + enabled: !0 + }, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND, + depthMask: !1 + }); +} +Object.defineProperties(GroundPolylinePrimitive.prototype, { + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + interleave: { + get: function() { + return this._primitiveOptions.interleave; + } + }, + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + releaseGeometryInstances: { + get: function() { + return this._primitiveOptions.releaseGeometryInstances; + } + }, + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + allowPicking: { + get: function() { + return this._primitiveOptions.allowPicking; + } + }, + /** + * Determines if the geometry instances will be created and batched on a web worker. + * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + asynchronous: { + get: function() { + return this._primitiveOptions.asynchronous; + } + }, + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPolylinePrimitive#update} + * is called. + * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * If true, draws the shadow volume for each geometry in the primitive. + *

+ * + * @memberof GroundPolylinePrimitive.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + debugShowShadowVolume: { + get: function() { + return this._debugShowShadowVolume; + } + } +}); +GroundPolylinePrimitive.initializeTerrainHeights = function() { + return ApproximateTerrainHeights.initialize(); +}; +function createShaderProgram$1(e, t, n) { + const i = t.context, r = e._primitive, o = r._attributeLocations; + let s = r._batchTable.getVertexShaderCallback()( + PolylineShadowVolumeVS + ); + s = Primitive$3._appendShowToShader(r, s), s = Primitive$3._appendDistanceDisplayConditionToShader(r, s), s = Primitive$3._modifyShaderPosition( + e, + s, + t.scene3DOnly + ); + let c = r._batchTable.getVertexShaderCallback()( + PolylineShadowVolumeMorphVS + ); + c = Primitive$3._appendShowToShader(r, c), c = Primitive$3._appendDistanceDisplayConditionToShader( + r, + c + ), c = Primitive$3._modifyShaderPosition( + e, + c, + t.scene3DOnly + ); + let l = r._batchTable.getVertexShaderCallback()( + PolylineShadowVolumeFS + ); + const d = [ + `GLOBE_MINIMUM_ALTITUDE ${t.mapProjection.ellipsoid.minimumRadius.toFixed( + 1 + )}` + ]; + let f = "", h = ""; + defined(n.material) ? (h = defined(n.material) ? n.material.shaderSource : "", h.search(/in\s+float\s+v_polylineAngle;/g) !== -1 && d.push("ANGLE_VARYING"), h.search(/in\s+float\s+v_width;/g) !== -1 && d.push("WIDTH_VARYING")) : f = "PER_INSTANCE_COLOR", d.push(f); + const p = e.debugShowShadowVolume ? ["DEBUG_SHOW_VOLUME", f] : [f], m = new ShaderSource({ + defines: d, + sources: [s] + }), _ = new ShaderSource({ + defines: p, + sources: [h, l] + }); + e._sp = ShaderProgram.replaceCache({ + context: i, + shaderProgram: r._sp, + vertexShaderSource: m, + fragmentShaderSource: _, + attributeLocations: o + }); + let y = i.shaderCache.getDerivedShaderProgram( + e._sp, + "2dColor" + ); + if (!defined(y)) { + const T = new ShaderSource({ + defines: d.concat(["COLUMBUS_VIEW_2D"]), + sources: [s] + }); + y = i.shaderCache.createDerivedShaderProgram( + e._sp, + "2dColor", + { + context: i, + shaderProgram: e._sp2D, + vertexShaderSource: T, + fragmentShaderSource: _, + attributeLocations: o + } + ); + } + e._sp2D = y; + let C = i.shaderCache.getDerivedShaderProgram( + e._sp, + "MorphColor" + ); + if (!defined(C)) { + const T = new ShaderSource({ + defines: d.concat([ + `MAX_TERRAIN_HEIGHT ${ApproximateTerrainHeights._defaultMaxTerrainHeight.toFixed( + 1 + )}` + ]), + sources: [c] + }); + l = r._batchTable.getVertexShaderCallback()( + PolylineShadowVolumeMorphFS + ); + const x = new ShaderSource({ + defines: p, + sources: [h, l] + }); + C = i.shaderCache.createDerivedShaderProgram( + e._sp, + "MorphColor", + { + context: i, + shaderProgram: e._spMorph, + vertexShaderSource: T, + fragmentShaderSource: x, + attributeLocations: o + } + ); + } + e._spMorph = C; +} +function getRenderState$1(e) { + return RenderState.fromCache({ + cull: { + enabled: !0 + // prevent double-draw. Geometry is "inverted" (reversed winding order) so we're drawing backfaces. + }, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND, + depthMask: !1, + stencilTest: { + enabled: e, + frontFunction: StencilFunction$1.EQUAL, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + backFunction: StencilFunction$1.EQUAL, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + } + }); +} +function createCommands$2(e, t, n, i, r, o) { + const s = e._primitive, c = s._va.length; + r.length = c, o.length = c; + const d = t instanceof PolylineColorAppearance ? {} : n._uniforms, f = s._batchTable.getUniformMapCallback()( + d + ); + for (let h = 0; h < c; h++) { + const p = s._va[h]; + let m = r[h]; + defined(m) || (m = r[h] = new DrawCommand({ + owner: e, + primitiveType: s._primitiveType + })), m.vertexArray = p, m.renderState = e._renderState, m.shaderProgram = e._sp, m.uniformMap = f, m.pass = Pass$1.TERRAIN_CLASSIFICATION, m.pickId = "czm_batchTable_pickColor(v_endPlaneNormalEcAndBatchId.w)"; + const _ = DrawCommand.shallowClone( + m, + m.derivedCommands.tileset + ); + _.renderState = e._renderState3DTiles, _.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, m.derivedCommands.tileset = _; + const y = DrawCommand.shallowClone( + m, + m.derivedCommands.color2D + ); + y.shaderProgram = e._sp2D, m.derivedCommands.color2D = y; + const C = DrawCommand.shallowClone( + _, + _.derivedCommands.color2D + ); + C.shaderProgram = e._sp2D, _.derivedCommands.color2D = C; + const T = DrawCommand.shallowClone( + m, + m.derivedCommands.colorMorph + ); + T.renderState = e._renderStateMorph, T.shaderProgram = e._spMorph, T.pickId = "czm_batchTable_pickColor(v_batchId)", m.derivedCommands.colorMorph = T; + } +} +function updateAndQueueCommand(e, t, n, i, r, o, s) { + n.mode === SceneMode$1.MORPHING ? t = t.derivedCommands.colorMorph : n.mode !== SceneMode$1.SCENE3D && (t = t.derivedCommands.color2D), t.modelMatrix = i, t.boundingVolume = o, t.cull = r, t.debugShowBoundingVolume = s, n.commandList.push(t); +} +function updateAndQueueCommands(e, t, n, i, r, o, s) { + const c = e._primitive; + Primitive$3._updateBoundingVolumes(c, t, r); + let l; + t.mode === SceneMode$1.SCENE3D ? l = c._boundingSphereWC : t.mode === SceneMode$1.COLUMBUS_VIEW ? l = c._boundingSphereCV : t.mode === SceneMode$1.SCENE2D && defined(c._boundingSphere2D) ? l = c._boundingSphere2D : defined(c._boundingSphereMorph) && (l = c._boundingSphereMorph); + const d = t.mode === SceneMode$1.MORPHING, f = e.classificationType, h = f !== ClassificationType$1.CESIUM_3D_TILE, p = f !== ClassificationType$1.TERRAIN && !d; + let m; + const _ = t.passes; + if (_.render || _.pick && c.allowPicking) { + const y = n.length; + for (let C = 0; C < y; ++C) { + const T = l[C]; + h && (m = n[C], updateAndQueueCommand( + e, + m, + t, + r, + o, + T, + s + )), p && (m = n[C].derivedCommands.tileset, updateAndQueueCommand( + e, + m, + t, + r, + o, + T, + s + )); + } + } +} +GroundPolylinePrimitive.prototype.update = function(e) { + if (!defined(this._primitive) && !defined(this.geometryInstances)) + return; + if (!ApproximateTerrainHeights.initialized) { + GroundPolylinePrimitive.initializeTerrainHeights(); + return; + } + let t; + const n = this, i = this._primitiveOptions; + if (!defined(this._primitive)) { + const r = Array.isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances], o = r.length, s = new Array(o); + let c; + for (t = 0; t < o; ++t) + if (c = r[t].attributes, !defined(c) || !defined(c.color)) { + this._hasPerInstanceColors = !1; + break; + } + for (t = 0; t < o; ++t) { + const l = r[t]; + c = {}; + const d = l.attributes; + for (const f in d) + d.hasOwnProperty(f) && (c[f] = d[f]); + defined(c.width) || (c.width = new GeometryInstanceAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + value: [l.geometry.width] + })), l.geometry._scene3DOnly = e.scene3DOnly, GroundPolylineGeometry.setProjectionAndEllipsoid( + l.geometry, + e.mapProjection + ), s[t] = new GeometryInstance({ + geometry: l.geometry, + attributes: c, + id: l.id, + pickPrimitive: n + }); + } + i.geometryInstances = s, i.appearance = this.appearance, i._createShaderProgramFunction = function(l, d, f) { + createShaderProgram$1(n, d, f); + }, i._createCommandsFunction = function(l, d, f, h, p, m, _) { + createCommands$2( + n, + d, + f, + h, + m, + _ + ); + }, i._updateAndQueueCommandsFunction = function(l, d, f, h, p, m, _, y) { + updateAndQueueCommands( + n, + d, + f, + h, + p, + m, + _ + ); + }, this._primitive = new Primitive$3(i); + } + if (this.appearance instanceof PolylineColorAppearance && !this._hasPerInstanceColors) + throw new DeveloperError( + "All GeometryInstances must have color attributes to use PolylineColorAppearance with GroundPolylinePrimitive." + ); + this._primitive.appearance = this.appearance, this._primitive.show = this.show, this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume, this._primitive.update(e), e.afterRender.push(() => { + !this._ready && defined(this._primitive) && this._primitive.ready && (this._ready = !0, this.releaseGeometryInstances && (this.geometryInstances = void 0)); + }); +}; +GroundPolylinePrimitive.prototype.getGeometryInstanceAttributes = function(e) { + return this._primitive.getGeometryInstanceAttributes(e); +}; +GroundPolylinePrimitive.isSupported = function(e) { + return e.frameState.context.depthTexture; +}; +GroundPolylinePrimitive.prototype.isDestroyed = function() { + return !1; +}; +GroundPolylinePrimitive.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), this._sp = this._sp && this._sp.destroy(), this._sp2D = void 0, this._spMorph = void 0, destroyObject(this); +}; +const defaultRepeat$2 = new Cartesian2(1, 1), defaultTransparent = !1, defaultColor$7 = Color.WHITE; +function ImageMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._image = void 0, this._imageSubscription = void 0, this._repeat = void 0, this._repeatSubscription = void 0, this._color = void 0, this._colorSubscription = void 0, this._transparent = void 0, this._transparentSubscription = void 0, this.image = e.image, this.repeat = e.repeat, this.color = e.color, this.transparent = e.transparent; +} +Object.defineProperties(ImageMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof ImageMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._image) && Property.isConstant(this._repeat); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof ImageMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying Image, URL, Canvas, or Video to use. + * @memberof ImageMaterialProperty.prototype + * @type {Property|undefined} + */ + image: createPropertyDescriptor("image"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of times the image repeats in each direction. + * @memberof ImageMaterialProperty.prototype + * @type {Property|undefined} + * @default new Cartesian2(1, 1) + */ + repeat: createPropertyDescriptor("repeat"), + /** + * Gets or sets the Color Property specifying the desired color applied to the image. + * @memberof ImageMaterialProperty.prototype + * @type {Property|undefined} + * @default 1.0 + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the Boolean Property specifying whether the image has transparency + * @memberof ImageMaterialProperty.prototype + * @type {Property|undefined} + * @default 1.0 + */ + transparent: createPropertyDescriptor("transparent") +}); +ImageMaterialProperty.prototype.getType = function(e) { + return "Image"; +}; +const timeScratch$p = new JulianDate(); +ImageMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$p)), defined(t) || (t = {}), t.image = Property.getValueOrUndefined(this._image, e), t.repeat = Property.getValueOrClonedDefault( + this._repeat, + e, + defaultRepeat$2, + t.repeat + ), t.color = Property.getValueOrClonedDefault( + this._color, + e, + defaultColor$7, + t.color + ), Property.getValueOrDefault(this._transparent, e, defaultTransparent) && (t.color.alpha = Math.min(0.99, t.color.alpha)), t; +}; +ImageMaterialProperty.prototype.equals = function(e) { + return this === e || e instanceof ImageMaterialProperty && Property.equals(this._image, e._image) && Property.equals(this._repeat, e._repeat) && Property.equals(this._color, e._color) && Property.equals(this._transparent, e._transparent); +}; +function createMaterialProperty(e) { + if (e instanceof Color) + return new ColorMaterialProperty(e); + if (typeof e == "string" || e instanceof Resource || e instanceof HTMLCanvasElement || e instanceof HTMLVideoElement) { + const t = new ImageMaterialProperty(); + return t.image = e, t; + } +} +function createMaterialPropertyDescriptor(e, t) { + return createPropertyDescriptor(e, t, createMaterialProperty); +} +function BoxGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._dimensions = void 0, this._dimensionsSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(BoxGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof BoxGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the box. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets {@link Cartesian3} Property property specifying the length, width, and height of the box. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + */ + dimensions: createPropertyDescriptor("dimensions"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the boolean Property specifying whether the box is filled with the provided material. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the material used to fill the box. + * @memberof BoxGraphics.prototype + * @type {MaterialProperty|undefined} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the box is outlined. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the box + * casts or receives shadows from light sources. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this box will be displayed. + * @memberof BoxGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +BoxGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.dimensions = this.dimensions, e.heightReference = this.heightReference, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new BoxGraphics(this); +}; +BoxGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.dimensions = defaultValue(this.dimensions, e.dimensions), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +const ReferenceFrame = { + /** + * The fixed frame. + * + * @type {number} + * @constant + */ + FIXED: 0, + /** + * The inertial frame. + * + * @type {number} + * @constant + */ + INERTIAL: 1 +}, ReferenceFrame$1 = Object.freeze(ReferenceFrame); +function PositionProperty() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(PositionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof PositionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof PositionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the reference frame that the position is defined in. + * @memberof PositionProperty.prototype + * @type {ReferenceFrame} + */ + referenceFrame: { + get: DeveloperError.throwInstantiationError + } +}); +PositionProperty.prototype.getValue = DeveloperError.throwInstantiationError; +PositionProperty.prototype.getValueInReferenceFrame = DeveloperError.throwInstantiationError; +PositionProperty.prototype.equals = DeveloperError.throwInstantiationError; +const scratchMatrix3$2 = new Matrix3(); +PositionProperty.convertToReferenceFrame = function(e, t, n, i, r) { + if (!defined(t)) + return t; + if (defined(r) || (r = new Cartesian3()), n === i) + return Cartesian3.clone(t, r); + const o = Transforms.computeIcrfToCentralBodyFixedMatrix( + e, + scratchMatrix3$2 + ); + if (n === ReferenceFrame$1.INERTIAL) + return Matrix3.multiplyByVector(o, t, r); + if (n === ReferenceFrame$1.FIXED) + return Matrix3.multiplyByVector( + Matrix3.transpose(o, scratchMatrix3$2), + t, + r + ); +}; +function ConstantPositionProperty(e, t) { + this._definitionChanged = new Event(), this._value = Cartesian3.clone(e), this._referenceFrame = defaultValue(t, ReferenceFrame$1.FIXED); +} +Object.defineProperties(ConstantPositionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof ConstantPositionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return !defined(this._value) || this._referenceFrame === ReferenceFrame$1.FIXED; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof ConstantPositionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the reference frame in which the position is defined. + * @memberof ConstantPositionProperty.prototype + * @type {ReferenceFrame} + * @default ReferenceFrame.FIXED; + */ + referenceFrame: { + get: function() { + return this._referenceFrame; + } + } +}); +const timeScratch$o = new JulianDate(); +ConstantPositionProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$o)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +ConstantPositionProperty.prototype.setValue = function(e, t) { + let n = !1; + Cartesian3.equals(this._value, e) || (n = !0, this._value = Cartesian3.clone(e)), defined(t) && this._referenceFrame !== t && (n = !0, this._referenceFrame = t), n && this._definitionChanged.raiseEvent(this); +}; +ConstantPositionProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + return PositionProperty.convertToReferenceFrame( + e, + this._value, + this._referenceFrame, + t, + n + ); +}; +ConstantPositionProperty.prototype.equals = function(e) { + return this === e || e instanceof ConstantPositionProperty && Cartesian3.equals(this._value, e._value) && this._referenceFrame === e._referenceFrame; +}; +function CorridorGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._positions = void 0, this._positionsSubscription = void 0, this._width = void 0, this._widthSubscription = void 0, this._height = void 0, this._heightSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._extrudedHeight = void 0, this._extrudedHeightSubscription = void 0, this._extrudedHeightReference = void 0, this._extrudedHeightReferenceSubscription = void 0, this._cornerType = void 0, this._cornerTypeSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._classificationType = void 0, this._classificationTypeSubscription = void 0, this._zIndex = void 0, this._zIndexSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(CorridorGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof CorridorGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the corridor. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets a Property specifying the array of {@link Cartesian3} positions that define the centerline of the corridor. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + */ + positions: createPropertyDescriptor("positions"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + */ + width: createPropertyDescriptor("width"), + /** + * Gets or sets the numeric Property specifying the altitude of the corridor. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + height: createPropertyDescriptor("height"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the numeric Property specifying the altitude of the corridor extrusion. + * Setting this property creates a corridor shaped volume starting at height and ending + * at this altitude. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + */ + extrudedHeight: createPropertyDescriptor("extrudedHeight"), + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + extrudedHeightReference: createPropertyDescriptor("extrudedHeightReference"), + /** + * Gets or sets the {@link CornerType} Property specifying how corners are styled. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default CornerType.ROUNDED + */ + cornerType: createPropertyDescriptor("cornerType"), + /** + * Gets or sets the numeric Property specifying the sampling distance between each latitude and longitude point. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the corridor is filled with the provided material. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the corridor. + * @memberof CorridorGraphics.prototype + * @type {MaterialProperty|undefined} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the corridor is outlined. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the corridor + * casts or receives shadows from light sources. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this corridor will be displayed. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this corridor will classify terrain, 3D Tiles, or both when on the ground. + * @memberof CorridorGraphics.prototype + * @type {Property|undefined} + * @default ClassificationType.BOTH + */ + classificationType: createPropertyDescriptor("classificationType"), + /** + * Gets or sets the zIndex Property specifying the ordering of the corridor. Only has an effect if the coridor is static and neither height or exturdedHeight are specified. + * @memberof CorridorGraphics.prototype + * @type {ConstantProperty|undefined} + * @default 0 + */ + zIndex: createPropertyDescriptor("zIndex") +}); +CorridorGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.positions = this.positions, e.width = this.width, e.height = this.height, e.heightReference = this.heightReference, e.extrudedHeight = this.extrudedHeight, e.extrudedHeightReference = this.extrudedHeightReference, e.cornerType = this.cornerType, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e.classificationType = this.classificationType, e.zIndex = this.zIndex, e) : new CorridorGraphics(this); +}; +CorridorGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.positions = defaultValue(this.positions, e.positions), this.width = defaultValue(this.width, e.width), this.height = defaultValue(this.height, e.height), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.extrudedHeight = defaultValue( + this.extrudedHeight, + e.extrudedHeight + ), this.extrudedHeightReference = defaultValue( + this.extrudedHeightReference, + e.extrudedHeightReference + ), this.cornerType = defaultValue(this.cornerType, e.cornerType), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.classificationType = defaultValue( + this.classificationType, + e.classificationType + ), this.zIndex = defaultValue(this.zIndex, e.zIndex); +}; +function createRawProperty(e) { + return e; +} +function createRawPropertyDescriptor(e, t) { + return createPropertyDescriptor(e, t, createRawProperty); +} +function CylinderGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._length = void 0, this._lengthSubscription = void 0, this._topRadius = void 0, this._topRadiusSubscription = void 0, this._bottomRadius = void 0, this._bottomRadiusSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._numberOfVerticalLines = void 0, this._numberOfVerticalLinesSubscription = void 0, this._slices = void 0, this._slicesSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(CylinderGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof CylinderGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the cylinder. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the numeric Property specifying the length of the cylinder. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + */ + length: createPropertyDescriptor("length"), + /** + * Gets or sets the numeric Property specifying the radius of the top of the cylinder. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + */ + topRadius: createPropertyDescriptor("topRadius"), + /** + * Gets or sets the numeric Property specifying the radius of the bottom of the cylinder. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + */ + bottomRadius: createPropertyDescriptor("bottomRadius"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the boolean Property specifying whether the cylinder is filled with the provided material. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the cylinder. + * @memberof CylinderGraphics.prototype + * @type {MaterialProperty|undefined} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the boolean Property specifying whether the cylinder is outlined. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets the Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default 16 + */ + numberOfVerticalLines: createPropertyDescriptor("numberOfVerticalLines"), + /** + * Gets or sets the Property specifying the number of edges around the perimeter of the cylinder. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default 128 + */ + slices: createPropertyDescriptor("slices"), + /** + * Get or sets the enum Property specifying whether the cylinder + * casts or receives shadows from light sources. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this cylinder will be displayed. + * @memberof CylinderGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +CylinderGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.length = this.length, e.topRadius = this.topRadius, e.bottomRadius = this.bottomRadius, e.heightReference = this.heightReference, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.numberOfVerticalLines = this.numberOfVerticalLines, e.slices = this.slices, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new CylinderGraphics(this); +}; +CylinderGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.length = defaultValue(this.length, e.length), this.topRadius = defaultValue(this.topRadius, e.topRadius), this.bottomRadius = defaultValue(this.bottomRadius, e.bottomRadius), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.numberOfVerticalLines = defaultValue( + this.numberOfVerticalLines, + e.numberOfVerticalLines + ), this.slices = defaultValue(this.slices, e.slices), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +function EllipseGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._semiMajorAxis = void 0, this._semiMajorAxisSubscription = void 0, this._semiMinorAxis = void 0, this._semiMinorAxisSubscription = void 0, this._height = void 0, this._heightSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._extrudedHeight = void 0, this._extrudedHeightSubscription = void 0, this._extrudedHeightReference = void 0, this._extrudedHeightReferenceSubscription = void 0, this._rotation = void 0, this._rotationSubscription = void 0, this._stRotation = void 0, this._stRotationSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._numberOfVerticalLines = void 0, this._numberOfVerticalLinesSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._classificationType = void 0, this._classificationTypeSubscription = void 0, this._zIndex = void 0, this._zIndexSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(EllipseGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof EllipseGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the ellipse. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the numeric Property specifying the semi-major axis. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + */ + semiMajorAxis: createPropertyDescriptor("semiMajorAxis"), + /** + * Gets or sets the numeric Property specifying the semi-minor axis. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + */ + semiMinorAxis: createPropertyDescriptor("semiMinorAxis"), + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + height: createPropertyDescriptor("height"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + */ + extrudedHeight: createPropertyDescriptor("extrudedHeight"), + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + extrudedHeightReference: createPropertyDescriptor("extrudedHeightReference"), + /** + * Gets or sets the numeric property specifying the rotation of the ellipse counter-clockwise from north. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + rotation: createPropertyDescriptor("rotation"), + /** + * Gets or sets the numeric property specifying the rotation of the ellipse texture counter-clockwise from north. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + stRotation: createPropertyDescriptor("stRotation"), + /** + * Gets or sets the numeric Property specifying the angular distance between points on the ellipse. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the ellipse is filled with the provided material. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the ellipse. + * @memberof EllipseGraphics.prototype + * @type {MaterialProperty|undefined} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the ellipse is outlined. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets the numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default 16 + */ + numberOfVerticalLines: createPropertyDescriptor("numberOfVerticalLines"), + /** + * Get or sets the enum Property specifying whether the ellipse + * casts or receives shadows from light sources. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipse will be displayed. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this ellipse will classify terrain, 3D Tiles, or both when on the ground. + * @memberof EllipseGraphics.prototype + * @type {Property|undefined} + * @default ClassificationType.BOTH + */ + classificationType: createPropertyDescriptor("classificationType"), + /** + * Gets or sets the zIndex Property specifying the ellipse ordering. Only has an effect if the ellipse is constant and neither height or extrudedHeight are specified + * @memberof EllipseGraphics.prototype + * @type {ConstantProperty|undefined} + * @default 0 + */ + zIndex: createPropertyDescriptor("zIndex") +}); +EllipseGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.semiMajorAxis = this.semiMajorAxis, e.semiMinorAxis = this.semiMinorAxis, e.height = this.height, e.heightReference = this.heightReference, e.extrudedHeight = this.extrudedHeight, e.extrudedHeightReference = this.extrudedHeightReference, e.rotation = this.rotation, e.stRotation = this.stRotation, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.numberOfVerticalLines = this.numberOfVerticalLines, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e.classificationType = this.classificationType, e.zIndex = this.zIndex, e) : new EllipseGraphics(this); +}; +EllipseGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.semiMajorAxis = defaultValue(this.semiMajorAxis, e.semiMajorAxis), this.semiMinorAxis = defaultValue(this.semiMinorAxis, e.semiMinorAxis), this.height = defaultValue(this.height, e.height), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.extrudedHeight = defaultValue( + this.extrudedHeight, + e.extrudedHeight + ), this.extrudedHeightReference = defaultValue( + this.extrudedHeightReference, + e.extrudedHeightReference + ), this.rotation = defaultValue(this.rotation, e.rotation), this.stRotation = defaultValue(this.stRotation, e.stRotation), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.numberOfVerticalLines = defaultValue( + this.numberOfVerticalLines, + e.numberOfVerticalLines + ), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.classificationType = defaultValue( + this.classificationType, + e.classificationType + ), this.zIndex = defaultValue(this.zIndex, e.zIndex); +}; +function EllipsoidGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._radii = void 0, this._radiiSubscription = void 0, this._innerRadii = void 0, this._innerRadiiSubscription = void 0, this._minimumClock = void 0, this._minimumClockSubscription = void 0, this._maximumClock = void 0, this._maximumClockSubscription = void 0, this._minimumCone = void 0, this._minimumConeSubscription = void 0, this._maximumCone = void 0, this._maximumConeSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._stackPartitions = void 0, this._stackPartitionsSubscription = void 0, this._slicePartitions = void 0, this._slicePartitionsSubscription = void 0, this._subdivisions = void 0, this._subdivisionsSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(EllipsoidGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof EllipsoidGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the radii of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + */ + radii: createPropertyDescriptor("radii"), + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the inner radii of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default radii + */ + innerRadii: createPropertyDescriptor("innerRadii"), + /** + * Gets or sets the Property specifying the minimum clock angle of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + minimumClock: createPropertyDescriptor("minimumClock"), + /** + * Gets or sets the Property specifying the maximum clock angle of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 2*PI + */ + maximumClock: createPropertyDescriptor("maximumClock"), + /** + * Gets or sets the Property specifying the minimum cone angle of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + minimumCone: createPropertyDescriptor("minimumCone"), + /** + * Gets or sets the Property specifying the maximum cone angle of the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default PI + */ + maximumCone: createPropertyDescriptor("maximumCone"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the boolean Property specifying whether the ellipsoid is filled with the provided material. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the ellipsoid. + * @memberof EllipsoidGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the ellipsoid is outlined. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets the Property specifying the number of stacks. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 64 + */ + stackPartitions: createPropertyDescriptor("stackPartitions"), + /** + * Gets or sets the Property specifying the number of radial slices per 360 degrees. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 64 + */ + slicePartitions: createPropertyDescriptor("slicePartitions"), + /** + * Gets or sets the Property specifying the number of samples per outline ring, determining the granularity of the curvature. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default 128 + */ + subdivisions: createPropertyDescriptor("subdivisions"), + /** + * Get or sets the enum Property specifying whether the ellipsoid + * casts or receives shadows from light sources. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipsoid will be displayed. + * @memberof EllipsoidGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +EllipsoidGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.radii = this.radii, e.innerRadii = this.innerRadii, e.minimumClock = this.minimumClock, e.maximumClock = this.maximumClock, e.minimumCone = this.minimumCone, e.maximumCone = this.maximumCone, e.heightReference = this.heightReference, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.stackPartitions = this.stackPartitions, e.slicePartitions = this.slicePartitions, e.subdivisions = this.subdivisions, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new EllipsoidGraphics(this); +}; +EllipsoidGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.radii = defaultValue(this.radii, e.radii), this.innerRadii = defaultValue(this.innerRadii, e.innerRadii), this.minimumClock = defaultValue(this.minimumClock, e.minimumClock), this.maximumClock = defaultValue(this.maximumClock, e.maximumClock), this.minimumCone = defaultValue(this.minimumCone, e.minimumCone), this.maximumCone = defaultValue(this.maximumCone, e.maximumCone), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.stackPartitions = defaultValue( + this.stackPartitions, + e.stackPartitions + ), this.slicePartitions = defaultValue( + this.slicePartitions, + e.slicePartitions + ), this.subdivisions = defaultValue(this.subdivisions, e.subdivisions), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +function LabelGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._text = void 0, this._textSubscription = void 0, this._font = void 0, this._fontSubscription = void 0, this._style = void 0, this._styleSubscription = void 0, this._scale = void 0, this._scaleSubscription = void 0, this._showBackground = void 0, this._showBackgroundSubscription = void 0, this._backgroundColor = void 0, this._backgroundColorSubscription = void 0, this._backgroundPadding = void 0, this._backgroundPaddingSubscription = void 0, this._pixelOffset = void 0, this._pixelOffsetSubscription = void 0, this._eyeOffset = void 0, this._eyeOffsetSubscription = void 0, this._horizontalOrigin = void 0, this._horizontalOriginSubscription = void 0, this._verticalOrigin = void 0, this._verticalOriginSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._fillColor = void 0, this._fillColorSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._translucencyByDistance = void 0, this._translucencyByDistanceSubscription = void 0, this._pixelOffsetScaleByDistance = void 0, this._pixelOffsetScaleByDistanceSubscription = void 0, this._scaleByDistance = void 0, this._scaleByDistanceSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._disableDepthTestDistance = void 0, this._disableDepthTestDistanceSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(LabelGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof LabelGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the label. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the string Property specifying the text of the label. + * Explicit newlines '\n' are supported. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + text: createPropertyDescriptor("text"), + /** + * Gets or sets the string Property specifying the font in CSS syntax. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/font|CSS font on MDN} + */ + font: createPropertyDescriptor("font"), + /** + * Gets or sets the Property specifying the {@link LabelStyle}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + style: createPropertyDescriptor("style"), + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the label while a scale less than 1.0 shrinks it. + *

+ *

+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ *

+ * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + scale: createPropertyDescriptor("scale"), + /** + * Gets or sets the boolean Property specifying the visibility of the background behind the label. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default false + */ + showBackground: createPropertyDescriptor("showBackground"), + /** + * Gets or sets the Property specifying the background {@link Color}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default new Color(0.165, 0.165, 0.165, 0.8) + */ + backgroundColor: createPropertyDescriptor("backgroundColor"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's horizontal and vertical + * background padding in pixels. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default new Cartesian2(7, 5) + */ + backgroundPadding: createPropertyDescriptor("backgroundPadding"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's pixel offset in screen space + * from the origin of this label. This is commonly used to align multiple labels and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

+ *

+ * + * + * + *
default
l.pixeloffset = new Cartesian2(25, 75);
+ * The label's origin is indicated by the yellow point. + *
+ *

+ * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default Cartesian2.ZERO + */ + pixelOffset: createPropertyDescriptor("pixelOffset"), + /** + * Gets or sets the {@link Cartesian3} Property specifying the label's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

+ * An eye offset is commonly used to arrange multiple labels or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

+ * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *

+ * + * + * + *
+ * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ *

+ * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default Cartesian3.ZERO + */ + eyeOffset: createPropertyDescriptor("eyeOffset"), + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + horizontalOrigin: createPropertyDescriptor("horizontalOrigin"), + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + verticalOrigin: createPropertyDescriptor("verticalOrigin"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the Property specifying the fill {@link Color}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + fillColor: createPropertyDescriptor("fillColor"), + /** + * Gets or sets the Property specifying the outline {@link Color}. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the outline width. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the label based on the distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + translucencyByDistance: createPropertyDescriptor("translucencyByDistance"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the label based on the distance from the camera. + * A label's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset remains clamped to the nearest bound. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + pixelOffsetScaleByDistance: createPropertyDescriptor( + "pixelOffsetScaleByDistance" + ), + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + scaleByDistance: createPropertyDescriptor("scaleByDistance"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this label will be displayed. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof LabelGraphics.prototype + * @type {Property|undefined} + */ + disableDepthTestDistance: createPropertyDescriptor( + "disableDepthTestDistance" + ) +}); +LabelGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.text = this.text, e.font = this.font, e.style = this.style, e.scale = this.scale, e.showBackground = this.showBackground, e.backgroundColor = this.backgroundColor, e.backgroundPadding = this.backgroundPadding, e.pixelOffset = this.pixelOffset, e.eyeOffset = this.eyeOffset, e.horizontalOrigin = this.horizontalOrigin, e.verticalOrigin = this.verticalOrigin, e.heightReference = this.heightReference, e.fillColor = this.fillColor, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.translucencyByDistance = this.translucencyByDistance, e.pixelOffsetScaleByDistance = this.pixelOffsetScaleByDistance, e.scaleByDistance = this.scaleByDistance, e.distanceDisplayCondition = this.distanceDisplayCondition, e.disableDepthTestDistance = this.disableDepthTestDistance, e) : new LabelGraphics(this); +}; +LabelGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.text = defaultValue(this.text, e.text), this.font = defaultValue(this.font, e.font), this.style = defaultValue(this.style, e.style), this.scale = defaultValue(this.scale, e.scale), this.showBackground = defaultValue( + this.showBackground, + e.showBackground + ), this.backgroundColor = defaultValue( + this.backgroundColor, + e.backgroundColor + ), this.backgroundPadding = defaultValue( + this.backgroundPadding, + e.backgroundPadding + ), this.pixelOffset = defaultValue(this.pixelOffset, e.pixelOffset), this.eyeOffset = defaultValue(this.eyeOffset, e.eyeOffset), this.horizontalOrigin = defaultValue( + this.horizontalOrigin, + e.horizontalOrigin + ), this.verticalOrigin = defaultValue( + this.verticalOrigin, + e.verticalOrigin + ), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.fillColor = defaultValue(this.fillColor, e.fillColor), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.translucencyByDistance = defaultValue( + this.translucencyByDistance, + e.translucencyByDistance + ), this.pixelOffsetScaleByDistance = defaultValue( + this.pixelOffsetScaleByDistance, + e.pixelOffsetScaleByDistance + ), this.scaleByDistance = defaultValue( + this.scaleByDistance, + e.scaleByDistance + ), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.disableDepthTestDistance = defaultValue( + this.disableDepthTestDistance, + e.disableDepthTestDistance + ); +}; +const defaultScale$3 = new Cartesian3(1, 1, 1), defaultTranslation = Cartesian3.ZERO, defaultRotation = Quaternion.IDENTITY; +function TranslationRotationScale(e, t, n) { + this.translation = Cartesian3.clone( + defaultValue(e, defaultTranslation) + ), this.rotation = Quaternion.clone(defaultValue(t, defaultRotation)), this.scale = Cartesian3.clone(defaultValue(n, defaultScale$3)); +} +TranslationRotationScale.prototype.equals = function(e) { + return this === e || defined(e) && Cartesian3.equals(this.translation, e.translation) && Quaternion.equals(this.rotation, e.rotation) && Cartesian3.equals(this.scale, e.scale); +}; +const defaultNodeTransformation = new TranslationRotationScale(); +function NodeTransformationProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._translation = void 0, this._translationSubscription = void 0, this._rotation = void 0, this._rotationSubscription = void 0, this._scale = void 0, this._scaleSubscription = void 0, this.translation = e.translation, this.rotation = e.rotation, this.scale = e.scale; +} +Object.defineProperties(NodeTransformationProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof NodeTransformationProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._translation) && Property.isConstant(this._rotation) && Property.isConstant(this._scale); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof NodeTransformationProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) translation to apply to the node. + * @memberof NodeTransformationProperty.prototype + * @type {Property|undefined} + * @default Cartesian3.ZERO + */ + translation: createPropertyDescriptor("translation"), + /** + * Gets or sets the {@link Quaternion} Property specifying the (x, y, z, w) rotation to apply to the node. + * @memberof NodeTransformationProperty.prototype + * @type {Property|undefined} + * @default Quaternion.IDENTITY + */ + rotation: createPropertyDescriptor("rotation"), + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) scaling to apply to the node. + * @memberof NodeTransformationProperty.prototype + * @type {Property|undefined} + * @default new Cartesian3(1.0, 1.0, 1.0) + */ + scale: createPropertyDescriptor("scale") +}); +const timeScratch$n = new JulianDate(); +NodeTransformationProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$n)), defined(t) || (t = new TranslationRotationScale()), t.translation = Property.getValueOrClonedDefault( + this._translation, + e, + defaultNodeTransformation.translation, + t.translation + ), t.rotation = Property.getValueOrClonedDefault( + this._rotation, + e, + defaultNodeTransformation.rotation, + t.rotation + ), t.scale = Property.getValueOrClonedDefault( + this._scale, + e, + defaultNodeTransformation.scale, + t.scale + ), t; +}; +NodeTransformationProperty.prototype.equals = function(e) { + return this === e || e instanceof NodeTransformationProperty && Property.equals(this._translation, e._translation) && Property.equals(this._rotation, e._rotation) && Property.equals(this._scale, e._scale); +}; +function PropertyBag(e, t) { + this._propertyNames = [], this._definitionChanged = new Event(), defined(e) && this.merge(e, t); +} +Object.defineProperties(PropertyBag.prototype, { + /** + * Gets the names of all properties registered on this instance. + * @memberof PropertyBag.prototype + * @type {Array} + */ + propertyNames: { + get: function() { + return this._propertyNames; + } + }, + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in this object are constant. + * @memberof PropertyBag.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + const e = this._propertyNames; + for (let t = 0, n = e.length; t < n; t++) + if (!Property.isConstant(this[e[t]])) + return !1; + return !0; + } + }, + /** + * Gets the event that is raised whenever the set of properties contained in this + * object changes, or one of the properties itself changes. + * + * @memberof PropertyBag.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +PropertyBag.prototype.hasProperty = function(e) { + return this._propertyNames.indexOf(e) !== -1; +}; +function createConstantProperty(e) { + return new ConstantProperty(e); +} +PropertyBag.prototype.addProperty = function(e, t, n) { + this._propertyNames.push(e), Object.defineProperty( + this, + e, + createPropertyDescriptor( + e, + !0, + defaultValue(n, createConstantProperty) + ) + ), defined(t) && (this[e] = t), this._definitionChanged.raiseEvent(this); +}; +PropertyBag.prototype.removeProperty = function(e) { + const n = this._propertyNames.indexOf(e); + this._propertyNames.splice(n, 1), delete this[e], this._definitionChanged.raiseEvent(this); +}; +const timeScratch$m = new JulianDate(); +PropertyBag.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$m)), defined(t) || (t = {}); + const n = this._propertyNames; + for (let i = 0, r = n.length; i < r; i++) { + const o = n[i]; + t[o] = Property.getValueOrUndefined( + this[o], + e, + t[o] + ); + } + return t; +}; +PropertyBag.prototype.merge = function(e, t) { + const n = this._propertyNames, i = defined(e._propertyNames) ? e._propertyNames : Object.keys(e); + for (let r = 0, o = i.length; r < o; r++) { + const s = i[r], c = this[s], l = e[s]; + c === void 0 && n.indexOf(s) === -1 && this.addProperty(s, void 0, t), l !== void 0 && (c !== void 0 ? defined(c) && defined(c.merge) && c.merge(l) : defined(l) && defined(l.merge) && defined(l.clone) ? this[s] = l.clone() : this[s] = l); + } +}; +function propertiesEqual(e, t) { + const n = e._propertyNames, i = t._propertyNames, r = n.length; + if (r !== i.length) + return !1; + for (let o = 0; o < r; ++o) { + const s = n[o]; + if (i.indexOf(s) === -1 || !Property.equals(e[s], t[s])) + return !1; + } + return !0; +} +PropertyBag.prototype.equals = function(e) { + return this === e || // + e instanceof PropertyBag && // + propertiesEqual(this, e); +}; +function createNodeTransformationProperty(e) { + return new NodeTransformationProperty(e); +} +function createNodeTransformationPropertyBag(e) { + return new PropertyBag(e, createNodeTransformationProperty); +} +function createArticulationStagePropertyBag(e) { + return new PropertyBag(e); +} +function ModelGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._uri = void 0, this._uriSubscription = void 0, this._scale = void 0, this._scaleSubscription = void 0, this._minimumPixelSize = void 0, this._minimumPixelSizeSubscription = void 0, this._maximumScale = void 0, this._maximumScaleSubscription = void 0, this._incrementallyLoadTextures = void 0, this._incrementallyLoadTexturesSubscription = void 0, this._runAnimations = void 0, this._runAnimationsSubscription = void 0, this._clampAnimations = void 0, this._clampAnimationsSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._silhouetteColor = void 0, this._silhouetteColorSubscription = void 0, this._silhouetteSize = void 0, this._silhouetteSizeSubscription = void 0, this._color = void 0, this._colorSubscription = void 0, this._colorBlendMode = void 0, this._colorBlendModeSubscription = void 0, this._colorBlendAmount = void 0, this._colorBlendAmountSubscription = void 0, this._imageBasedLightingFactor = void 0, this._imageBasedLightingFactorSubscription = void 0, this._lightColor = void 0, this._lightColorSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._nodeTransformations = void 0, this._nodeTransformationsSubscription = void 0, this._articulations = void 0, this._articulationsSubscription = void 0, this._clippingPlanes = void 0, this._clippingPlanesSubscription = void 0, this._customShader = void 0, this._customShaderSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(ModelGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof ModelGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the model. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + uri: createPropertyDescriptor("uri"), + /** + * Gets or sets the numeric Property specifying a uniform linear scale + * for this model. Values greater than 1.0 increase the size of the model while + * values less than 1.0 decrease it. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + scale: createPropertyDescriptor("scale"), + /** + * Gets or sets the numeric Property specifying the approximate minimum + * pixel size of the model regardless of zoom. This can be used to ensure that + * a model is visible even when the viewer zooms out. When 0.0, + * no minimum size is enforced. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + minimumPixelSize: createPropertyDescriptor("minimumPixelSize"), + /** + * Gets or sets the numeric Property specifying the maximum scale + * size of a model. This property is used as an upper limit for + * {@link ModelGraphics#minimumPixelSize}. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + maximumScale: createPropertyDescriptor("maximumScale"), + /** + * Get or sets the boolean Property specifying whether textures + * may continue to stream in after the model is loaded. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + incrementallyLoadTextures: createPropertyDescriptor( + "incrementallyLoadTextures" + ), + /** + * Gets or sets the boolean Property specifying if glTF animations should be run. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default true + */ + runAnimations: createPropertyDescriptor("runAnimations"), + /** + * Gets or sets the boolean Property specifying if glTF animations should hold the last pose for time durations with no keyframes. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default true + */ + clampAnimations: createPropertyDescriptor("clampAnimations"), + /** + * Get or sets the enum Property specifying whether the model + * casts or receives shadows from light sources. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.ENABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the Property specifying the {@link Color} of the silhouette. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default Color.RED + */ + silhouetteColor: createPropertyDescriptor("silhouetteColor"), + /** + * Gets or sets the numeric Property specifying the size of the silhouette in pixels. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + silhouetteSize: createPropertyDescriptor("silhouetteSize"), + /** + * Gets or sets the Property specifying the {@link Color} that blends with the model's rendered color. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the enum Property specifying how the color blends with the model. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default ColorBlendMode.HIGHLIGHT + */ + colorBlendMode: createPropertyDescriptor("colorBlendMode"), + /** + * A numeric Property specifying the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + * @default 0.5 + */ + colorBlendAmount: createPropertyDescriptor("colorBlendAmount"), + /** + * A property specifying the {@link Cartesian2} used to scale the diffuse and specular image-based lighting contribution to the final color. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + imageBasedLightingFactor: createPropertyDescriptor( + "imageBasedLightingFactor" + ), + /** + * A property specifying the {@link Cartesian3} light color when shading the model. When undefined the scene's light color is used instead. + * @memberOf ModelGraphics.prototype + * @type {Property|undefined} + */ + lightColor: createPropertyDescriptor("lightColor"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this model will be displayed. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the set of node transformations to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. + * The transformation is applied after the node's existing transformation as specified in the glTF, and does not replace the node's existing transformation. + * @memberof ModelGraphics.prototype + * @type {PropertyBag} + */ + nodeTransformations: createPropertyDescriptor( + "nodeTransformations", + void 0, + createNodeTransformationPropertyBag + ), + /** + * Gets or sets the set of articulation values to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * composed as the name of the articulation, a single space, and the name of the stage. + * @memberof ModelGraphics.prototype + * @type {PropertyBag} + */ + articulations: createPropertyDescriptor( + "articulations", + void 0, + createArticulationStagePropertyBag + ), + /** + * A property specifying the {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + clippingPlanes: createPropertyDescriptor("clippingPlanes"), + /** + * Gets or sets the {@link CustomShader} to apply to this model. When undefined, no custom shader code is used. + * @memberof ModelGraphics.prototype + * @type {Property|undefined} + */ + customShader: createPropertyDescriptor("customShader") +}); +ModelGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.uri = this.uri, e.scale = this.scale, e.minimumPixelSize = this.minimumPixelSize, e.maximumScale = this.maximumScale, e.incrementallyLoadTextures = this.incrementallyLoadTextures, e.runAnimations = this.runAnimations, e.clampAnimations = this.clampAnimations, e.heightReference = this._heightReference, e.silhouetteColor = this.silhouetteColor, e.silhouetteSize = this.silhouetteSize, e.color = this.color, e.colorBlendMode = this.colorBlendMode, e.colorBlendAmount = this.colorBlendAmount, e.imageBasedLightingFactor = this.imageBasedLightingFactor, e.lightColor = this.lightColor, e.distanceDisplayCondition = this.distanceDisplayCondition, e.nodeTransformations = this.nodeTransformations, e.articulations = this.articulations, e.clippingPlanes = this.clippingPlanes, e.customShader = this.customShader, e) : new ModelGraphics(this); +}; +ModelGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.uri = defaultValue(this.uri, e.uri), this.scale = defaultValue(this.scale, e.scale), this.minimumPixelSize = defaultValue( + this.minimumPixelSize, + e.minimumPixelSize + ), this.maximumScale = defaultValue(this.maximumScale, e.maximumScale), this.incrementallyLoadTextures = defaultValue( + this.incrementallyLoadTextures, + e.incrementallyLoadTextures + ), this.runAnimations = defaultValue(this.runAnimations, e.runAnimations), this.clampAnimations = defaultValue( + this.clampAnimations, + e.clampAnimations + ), this.shadows = defaultValue(this.shadows, e.shadows), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.silhouetteColor = defaultValue( + this.silhouetteColor, + e.silhouetteColor + ), this.silhouetteSize = defaultValue( + this.silhouetteSize, + e.silhouetteSize + ), this.color = defaultValue(this.color, e.color), this.colorBlendMode = defaultValue( + this.colorBlendMode, + e.colorBlendMode + ), this.colorBlendAmount = defaultValue( + this.colorBlendAmount, + e.colorBlendAmount + ), this.imageBasedLightingFactor = defaultValue( + this.imageBasedLightingFactor, + e.imageBasedLightingFactor + ), this.lightColor = defaultValue(this.lightColor, e.lightColor), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.clippingPlanes = defaultValue( + this.clippingPlanes, + e.clippingPlanes + ), this.customShader = defaultValue(this.customShader, e.customShader); + const t = e.nodeTransformations; + if (defined(t)) { + const i = this.nodeTransformations; + defined(i) ? i.merge(t) : this.nodeTransformations = new PropertyBag( + t, + createNodeTransformationProperty + ); + } + const n = e.articulations; + if (defined(n)) { + const i = this.articulations; + defined(i) ? i.merge(n) : this.articulations = new PropertyBag(n); + } +}; +function Cesium3DTilesetGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._uri = void 0, this._uriSubscription = void 0, this._maximumScreenSpaceError = void 0, this._maximumScreenSpaceErrorSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(Cesium3DTilesetGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof Cesium3DTilesetGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the model. + * @memberof Cesium3DTilesetGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + * @memberof Cesium3DTilesetGraphics.prototype + * @type {Property|undefined} + */ + uri: createPropertyDescriptor("uri"), + /** + * Gets or sets the maximum screen space error used to drive level of detail refinement. + * @memberof Cesium3DTilesetGraphics.prototype + * @type {Property|undefined} + */ + maximumScreenSpaceError: createPropertyDescriptor("maximumScreenSpaceError") +}); +Cesium3DTilesetGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.uri = this.uri, e.maximumScreenSpaceError = this.maximumScreenSpaceError, e) : new Cesium3DTilesetGraphics(this); +}; +Cesium3DTilesetGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.uri = defaultValue(this.uri, e.uri), this.maximumScreenSpaceError = defaultValue( + this.maximumScreenSpaceError, + e.maximumScreenSpaceError + ); +}; +function PathGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._leadTime = void 0, this._leadTimeSubscription = void 0, this._trailTime = void 0, this._trailTimeSubscription = void 0, this._width = void 0, this._widthSubscription = void 0, this._resolution = void 0, this._resolutionSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PathGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PathGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the path. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the number of seconds in front of the object to show. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + */ + leadTime: createPropertyDescriptor("leadTime"), + /** + * Gets or sets the Property specifying the number of seconds behind the object to show. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + */ + trailTime: createPropertyDescriptor("trailTime"), + /** + * Gets or sets the numeric Property specifying the width in pixels. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + width: createPropertyDescriptor("width"), + /** + * Gets or sets the Property specifying the maximum number of seconds to step when sampling the position. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + * @default 60 + */ + resolution: createPropertyDescriptor("resolution"), + /** + * Gets or sets the Property specifying the material used to draw the path. + * @memberof PathGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this path will be displayed. + * @memberof PathGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +PathGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.leadTime = this.leadTime, e.trailTime = this.trailTime, e.width = this.width, e.resolution = this.resolution, e.material = this.material, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new PathGraphics(this); +}; +PathGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.leadTime = defaultValue(this.leadTime, e.leadTime), this.trailTime = defaultValue(this.trailTime, e.trailTime), this.width = defaultValue(this.width, e.width), this.resolution = defaultValue(this.resolution, e.resolution), this.material = defaultValue(this.material, e.material), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +function PlaneGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._plane = void 0, this._planeSubscription = void 0, this._dimensions = void 0, this._dimensionsSubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PlaneGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PlaneGraphics.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the plane. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the {@link Plane} Property specifying the normal and distance of the plane. + * + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + */ + plane: createPropertyDescriptor("plane"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the width and height of the plane. + * + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + */ + dimensions: createPropertyDescriptor("dimensions"), + /** + * Gets or sets the boolean Property specifying whether the plane is filled with the provided material. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the material used to fill the plane. + * @memberof PlaneGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the plane is outlined. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the plane + * casts or receives shadows from light sources. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this plane will be displayed. + * @memberof PlaneGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +PlaneGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.plane = this.plane, e.dimensions = this.dimensions, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new PlaneGraphics(this); +}; +PlaneGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.plane = defaultValue(this.plane, e.plane), this.dimensions = defaultValue(this.dimensions, e.dimensions), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +function PointGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._pixelSize = void 0, this._pixelSizeSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._color = void 0, this._colorSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._scaleByDistance = void 0, this._scaleByDistanceSubscription = void 0, this._translucencyByDistance = void 0, this._translucencyByDistanceSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._disableDepthTestDistance = void 0, this._disableDepthTestDistanceSubscription = void 0, this._splitDirection = void 0, this._splitDirectionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PointGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PointGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the point. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the numeric Property specifying the size in pixels. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default 1 + */ + pixelSize: createPropertyDescriptor("pixelSize"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the Property specifying the {@link Color} of the point. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the the outline width in pixels. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets the {@link NearFarScalar} Property used to scale the point based on distance. + * If undefined, a constant size is used. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + */ + scaleByDistance: createPropertyDescriptor("scaleByDistance"), + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the point based on the distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the points's translucency remains clamped to the nearest bound. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + */ + translucencyByDistance: createPropertyDescriptor("translucencyByDistance"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this point will be displayed. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + */ + disableDepthTestDistance: createPropertyDescriptor( + "disableDepthTestDistance" + ), + /** + * Gets or sets the Property specifying the {@link SplitDirection} of this point. + * @memberof PointGraphics.prototype + * @type {Property|undefined} + * @default SplitDirection.NONE + */ + splitDirection: createPropertyDescriptor("splitDirection") +}); +PointGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.pixelSize = this.pixelSize, e.heightReference = this.heightReference, e.color = this.color, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.scaleByDistance = this.scaleByDistance, e.translucencyByDistance = this._translucencyByDistance, e.distanceDisplayCondition = this.distanceDisplayCondition, e.disableDepthTestDistance = this.disableDepthTestDistance, e.splitDirection = this.splitDirection, e) : new PointGraphics(this); +}; +PointGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.pixelSize = defaultValue(this.pixelSize, e.pixelSize), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.color = defaultValue(this.color, e.color), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.scaleByDistance = defaultValue( + this.scaleByDistance, + e.scaleByDistance + ), this.translucencyByDistance = defaultValue( + this._translucencyByDistance, + e.translucencyByDistance + ), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.disableDepthTestDistance = defaultValue( + this.disableDepthTestDistance, + e.disableDepthTestDistance + ), this.splitDirection = defaultValue( + this.splitDirection, + e.splitDirection + ); +}; +function PolygonHierarchy(e, t) { + this.positions = defined(e) ? e : [], this.holes = defined(t) ? t : []; +} +function createPolygonHierarchyProperty(e) { + return Array.isArray(e) && (e = new PolygonHierarchy(e)), new ConstantProperty(e); +} +function PolygonGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._hierarchy = void 0, this._hierarchySubscription = void 0, this._height = void 0, this._heightSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._extrudedHeight = void 0, this._extrudedHeightSubscription = void 0, this._extrudedHeightReference = void 0, this._extrudedHeightReferenceSubscription = void 0, this._stRotation = void 0, this._stRotationSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._perPositionHeight = void 0, this._perPositionHeightSubscription = void 0, this._closeTop = void 0, this._closeTopSubscription = void 0, this._closeBottom = void 0, this._closeBottomSubscription = void 0, this._arcType = void 0, this._arcTypeSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._classificationType = void 0, this._classificationTypeSubscription = void 0, this._zIndex = void 0, this._zIndexSubscription = void 0, this._textureCoordinates = void 0, this._textureCoordinatesSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PolygonGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PolygonGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the polygon. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the {@link PolygonHierarchy}. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + hierarchy: createPropertyDescriptor( + "hierarchy", + void 0, + createPolygonHierarchyProperty + ), + /** + * Gets or sets the numeric Property specifying the constant altitude of the polygon. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + height: createPropertyDescriptor("height"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the numeric Property specifying the altitude of the polygon extrusion. + * If {@link PolygonGraphics#perPositionHeight} is false, the volume starts at {@link PolygonGraphics#height} and ends at this altitude. + * If {@link PolygonGraphics#perPositionHeight} is true, the volume starts at the height of each {@link PolygonGraphics#hierarchy} position and ends at this altitude. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + extrudedHeight: createPropertyDescriptor("extrudedHeight"), + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + extrudedHeightReference: createPropertyDescriptor("extrudedHeightReference"), + /** + * Gets or sets the numeric property specifying the rotation of the polygon texture counter-clockwise from north. Only has an effect if textureCoordinates is not defined. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + stRotation: createPropertyDescriptor("stRotation"), + /** + * Gets or sets the numeric Property specifying the angular distance between points on the polygon. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the polygon is filled with the provided material. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the polygon. + * @memberof PolygonGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the polygon is outlined. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Gets or sets the boolean specifying whether or not the the height of each position is used. + * If true, the shape will have non-uniform altitude defined by the height of each {@link PolygonGraphics#hierarchy} position. + * If false, the shape will have a constant altitude as specified by {@link PolygonGraphics#height}. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + perPositionHeight: createPropertyDescriptor("perPositionHeight"), + /** + * Gets or sets a boolean specifying whether or not the top of an extruded polygon is included. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + closeTop: createPropertyDescriptor("closeTop"), + /** + * Gets or sets a boolean specifying whether or not the bottom of an extruded polygon is included. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + closeBottom: createPropertyDescriptor("closeBottom"), + /** + * Gets or sets the {@link ArcType} Property specifying the type of lines the polygon edges use. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default ArcType.GEODESIC + */ + arcType: createPropertyDescriptor("arcType"), + /** + * Get or sets the enum Property specifying whether the polygon + * casts or receives shadows from light sources. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polygon will be displayed. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polygon will classify terrain, 3D Tiles, or both when on the ground. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + * @default ClassificationType.BOTH + */ + classificationType: createPropertyDescriptor("classificationType"), + /** + * Gets or sets the zIndex Prperty specifying the ordering of ground geometry. Only has an effect if the polygon is constant and neither height or extrudedHeight are specified. + * @memberof PolygonGraphics.prototype + * @type {ConstantProperty|undefined} + * @default 0 + */ + zIndex: createPropertyDescriptor("zIndex"), + /** + * A Property specifying texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. Has no effect for ground primitives. + * @memberof PolygonGraphics.prototype + * @type {Property|undefined} + */ + textureCoordinates: createPropertyDescriptor("textureCoordinates") +}); +PolygonGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.hierarchy = this.hierarchy, e.height = this.height, e.heightReference = this.heightReference, e.extrudedHeight = this.extrudedHeight, e.extrudedHeightReference = this.extrudedHeightReference, e.stRotation = this.stRotation, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.perPositionHeight = this.perPositionHeight, e.closeTop = this.closeTop, e.closeBottom = this.closeBottom, e.arcType = this.arcType, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e.classificationType = this.classificationType, e.zIndex = this.zIndex, e.textureCoordinates = this.textureCoordinates, e) : new PolygonGraphics(this); +}; +PolygonGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.hierarchy = defaultValue(this.hierarchy, e.hierarchy), this.height = defaultValue(this.height, e.height), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.extrudedHeight = defaultValue( + this.extrudedHeight, + e.extrudedHeight + ), this.extrudedHeightReference = defaultValue( + this.extrudedHeightReference, + e.extrudedHeightReference + ), this.stRotation = defaultValue(this.stRotation, e.stRotation), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.perPositionHeight = defaultValue( + this.perPositionHeight, + e.perPositionHeight + ), this.closeTop = defaultValue(this.closeTop, e.closeTop), this.closeBottom = defaultValue(this.closeBottom, e.closeBottom), this.arcType = defaultValue(this.arcType, e.arcType), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.classificationType = defaultValue( + this.classificationType, + e.classificationType + ), this.zIndex = defaultValue(this.zIndex, e.zIndex), this.textureCoordinates = defaultValue( + this.textureCoordinates, + e.textureCoordinates + ); +}; +function PolylineGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._positions = void 0, this._positionsSubscription = void 0, this._width = void 0, this._widthSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._depthFailMaterial = void 0, this._depthFailMaterialSubscription = void 0, this._arcType = void 0, this._arcTypeSubscription = void 0, this._clampToGround = void 0, this._clampToGroundSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this._classificationType = void 0, this._classificationTypeSubscription = void 0, this._zIndex = void 0, this._zIndexSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PolylineGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PolylineGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the polyline. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} + * positions that define the line strip. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + */ + positions: createPropertyDescriptor("positions"), + /** + * Gets or sets the numeric Property specifying the width in pixels. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + width: createPropertyDescriptor("width"), + /** + * Gets or sets the numeric Property specifying the angular distance between each latitude and longitude if arcType is not ArcType.NONE and clampToGround is false. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default Cesium.Math.RADIANS_PER_DEGREE + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the Property specifying the material used to draw the polyline. + * @memberof PolylineGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying the material used to draw the polyline when it fails the depth test. + *

+ * Requires the EXT_frag_depth WebGL extension to render properly. If the extension is not supported, + * there may be artifacts. + *

+ * @memberof PolylineGraphics.prototype + * @type {MaterialProperty} + * @default undefined + */ + depthFailMaterial: createMaterialPropertyDescriptor("depthFailMaterial"), + /** + * Gets or sets the {@link ArcType} Property specifying whether the line segments should be great arcs, rhumb lines or linearly connected. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default ArcType.GEODESIC + */ + arcType: createPropertyDescriptor("arcType"), + /** + * Gets or sets the boolean Property specifying whether the polyline + * should be clamped to the ground. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default false + */ + clampToGround: createPropertyDescriptor("clampToGround"), + /** + * Get or sets the enum Property specifying whether the polyline + * casts or receives shadows from light sources. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polyline will be displayed. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polyline will classify terrain, 3D Tiles, or both when on the ground. + * @memberof PolylineGraphics.prototype + * @type {Property|undefined} + * @default ClassificationType.BOTH + */ + classificationType: createPropertyDescriptor("classificationType"), + /** + * Gets or sets the zIndex Property specifying the ordering of the polyline. Only has an effect if `clampToGround` is true and polylines on terrain is supported. + * @memberof PolylineGraphics.prototype + * @type {ConstantProperty|undefined} + * @default 0 + */ + zIndex: createPropertyDescriptor("zIndex") +}); +PolylineGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.positions = this.positions, e.width = this.width, e.granularity = this.granularity, e.material = this.material, e.depthFailMaterial = this.depthFailMaterial, e.arcType = this.arcType, e.clampToGround = this.clampToGround, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e.classificationType = this.classificationType, e.zIndex = this.zIndex, e) : new PolylineGraphics(this); +}; +PolylineGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.positions = defaultValue(this.positions, e.positions), this.width = defaultValue(this.width, e.width), this.granularity = defaultValue(this.granularity, e.granularity), this.material = defaultValue(this.material, e.material), this.depthFailMaterial = defaultValue( + this.depthFailMaterial, + e.depthFailMaterial + ), this.arcType = defaultValue(this.arcType, e.arcType), this.clampToGround = defaultValue(this.clampToGround, e.clampToGround), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.classificationType = defaultValue( + this.classificationType, + e.classificationType + ), this.zIndex = defaultValue(this.zIndex, e.zIndex); +}; +function PolylineVolumeGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._positions = void 0, this._positionsSubscription = void 0, this._shape = void 0, this._shapeSubscription = void 0, this._cornerType = void 0, this._cornerTypeSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubsription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(PolylineVolumeGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof PolylineVolumeGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the volume. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the line strip. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + */ + positions: createPropertyDescriptor("positions"), + /** + * Gets or sets the Property specifying the array of {@link Cartesian2} positions which define the shape to be extruded. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + */ + shape: createPropertyDescriptor("shape"), + /** + * Gets or sets the {@link CornerType} Property specifying the style of the corners. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default CornerType.ROUNDED + */ + cornerType: createPropertyDescriptor("cornerType"), + /** + * Gets or sets the numeric Property specifying the angular distance between points on the volume. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the volume is filled with the provided material. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the volume. + * @memberof PolylineVolumeGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the volume is outlined. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the volume + * casts or receives shadows from light sources. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this volume will be displayed. + * @memberof PolylineVolumeGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +PolylineVolumeGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.positions = this.positions, e.shape = this.shape, e.cornerType = this.cornerType, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new PolylineVolumeGraphics(this); +}; +PolylineVolumeGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.positions = defaultValue(this.positions, e.positions), this.shape = defaultValue(this.shape, e.shape), this.cornerType = defaultValue(this.cornerType, e.cornerType), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +function RectangleGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._coordinates = void 0, this._coordinatesSubscription = void 0, this._height = void 0, this._heightSubscription = void 0, this._heightReference = void 0, this._heightReferenceSubscription = void 0, this._extrudedHeight = void 0, this._extrudedHeightSubscription = void 0, this._extrudedHeightReference = void 0, this._extrudedHeightReferenceSubscription = void 0, this._rotation = void 0, this._rotationSubscription = void 0, this._stRotation = void 0, this._stRotationSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distancedisplayConditionSubscription = void 0, this._classificationType = void 0, this._classificationTypeSubscription = void 0, this._zIndex = void 0, this._zIndexSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(RectangleGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof RectangleGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the rectangle. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the {@link Rectangle}. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + */ + coordinates: createPropertyDescriptor("coordinates"), + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default 0.0 + */ + height: createPropertyDescriptor("height"), + /** + * Gets or sets the Property specifying the {@link HeightReference}. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + heightReference: createPropertyDescriptor("heightReference"), + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + */ + extrudedHeight: createPropertyDescriptor("extrudedHeight"), + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default HeightReference.NONE + */ + extrudedHeightReference: createPropertyDescriptor("extrudedHeightReference"), + /** + * Gets or sets the numeric property specifying the rotation of the rectangle clockwise from north. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + rotation: createPropertyDescriptor("rotation"), + /** + * Gets or sets the numeric property specifying the rotation of the rectangle texture counter-clockwise from north. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default 0 + */ + stRotation: createPropertyDescriptor("stRotation"), + /** + * Gets or sets the numeric Property specifying the angular distance between points on the rectangle. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the rectangle is filled with the provided material. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the rectangle. + * @memberof RectangleGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the rectangle is outlined. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the rectangle + * casts or receives shadows from light sources. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this rectangle will be displayed. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ), + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this rectangle will classify terrain, 3D Tiles, or both when on the ground. + * @memberof RectangleGraphics.prototype + * @type {Property|undefined} + * @default ClassificationType.BOTH + */ + classificationType: createPropertyDescriptor("classificationType"), + /** + * Gets or sets the zIndex Property specifying the ordering of the rectangle. Only has an effect if the rectangle is constant and neither height or extrudedHeight are specified. + * @memberof RectangleGraphics.prototype + * @type {ConstantProperty|undefined} + * @default 0 + */ + zIndex: createPropertyDescriptor("zIndex") +}); +RectangleGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.coordinates = this.coordinates, e.height = this.height, e.heightReference = this.heightReference, e.extrudedHeight = this.extrudedHeight, e.extrudedHeightReference = this.extrudedHeightReference, e.rotation = this.rotation, e.stRotation = this.stRotation, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e.classificationType = this.classificationType, e.zIndex = this.zIndex, e) : new RectangleGraphics(this); +}; +RectangleGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.coordinates = defaultValue(this.coordinates, e.coordinates), this.height = defaultValue(this.height, e.height), this.heightReference = defaultValue( + this.heightReference, + e.heightReference + ), this.extrudedHeight = defaultValue( + this.extrudedHeight, + e.extrudedHeight + ), this.extrudedHeightReference = defaultValue( + this.extrudedHeightReference, + e.extrudedHeightReference + ), this.rotation = defaultValue(this.rotation, e.rotation), this.stRotation = defaultValue(this.stRotation, e.stRotation), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ), this.classificationType = defaultValue( + this.classificationType, + e.classificationType + ), this.zIndex = defaultValue(this.zIndex, e.zIndex); +}; +function WallGraphics(e) { + this._definitionChanged = new Event(), this._show = void 0, this._showSubscription = void 0, this._positions = void 0, this._positionsSubscription = void 0, this._minimumHeights = void 0, this._minimumHeightsSubscription = void 0, this._maximumHeights = void 0, this._maximumHeightsSubscription = void 0, this._granularity = void 0, this._granularitySubscription = void 0, this._fill = void 0, this._fillSubscription = void 0, this._material = void 0, this._materialSubscription = void 0, this._outline = void 0, this._outlineSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this._shadows = void 0, this._shadowsSubscription = void 0, this._distanceDisplayCondition = void 0, this._distanceDisplayConditionSubscription = void 0, this.merge(defaultValue(e, defaultValue.EMPTY_OBJECT)); +} +Object.defineProperties(WallGraphics.prototype, { + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof WallGraphics.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the boolean Property specifying the visibility of the wall. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default true + */ + show: createPropertyDescriptor("show"), + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the top of the wall. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + */ + positions: createPropertyDescriptor("positions"), + /** + * Gets or sets the Property specifying an array of heights to be used for the bottom of the wall instead of the surface of the globe. + * If defined, the array must be the same length as {@link Wall#positions}. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + */ + minimumHeights: createPropertyDescriptor("minimumHeights"), + /** + * Gets or sets the Property specifying an array of heights to be used for the top of the wall instead of the height of each position. + * If defined, the array must be the same length as {@link Wall#positions}. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + */ + maximumHeights: createPropertyDescriptor("maximumHeights"), + /** + * Gets or sets the numeric Property specifying the angular distance between points on the wall. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default {CesiumMath.RADIANS_PER_DEGREE} + */ + granularity: createPropertyDescriptor("granularity"), + /** + * Gets or sets the boolean Property specifying whether the wall is filled with the provided material. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default true + */ + fill: createPropertyDescriptor("fill"), + /** + * Gets or sets the Property specifying the material used to fill the wall. + * @memberof WallGraphics.prototype + * @type {MaterialProperty} + * @default Color.WHITE + */ + material: createMaterialPropertyDescriptor("material"), + /** + * Gets or sets the Property specifying whether the wall is outlined. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default false + */ + outline: createPropertyDescriptor("outline"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth"), + /** + * Get or sets the enum Property specifying whether the wall + * casts or receives shadows from light sources. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + * @default ShadowMode.DISABLED + */ + shadows: createPropertyDescriptor("shadows"), + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this wall will be displayed. + * @memberof WallGraphics.prototype + * @type {Property|undefined} + */ + distanceDisplayCondition: createPropertyDescriptor( + "distanceDisplayCondition" + ) +}); +WallGraphics.prototype.clone = function(e) { + return defined(e) ? (e.show = this.show, e.positions = this.positions, e.minimumHeights = this.minimumHeights, e.maximumHeights = this.maximumHeights, e.granularity = this.granularity, e.fill = this.fill, e.material = this.material, e.outline = this.outline, e.outlineColor = this.outlineColor, e.outlineWidth = this.outlineWidth, e.shadows = this.shadows, e.distanceDisplayCondition = this.distanceDisplayCondition, e) : new WallGraphics(this); +}; +WallGraphics.prototype.merge = function(e) { + this.show = defaultValue(this.show, e.show), this.positions = defaultValue(this.positions, e.positions), this.minimumHeights = defaultValue( + this.minimumHeights, + e.minimumHeights + ), this.maximumHeights = defaultValue( + this.maximumHeights, + e.maximumHeights + ), this.granularity = defaultValue(this.granularity, e.granularity), this.fill = defaultValue(this.fill, e.fill), this.material = defaultValue(this.material, e.material), this.outline = defaultValue(this.outline, e.outline), this.outlineColor = defaultValue(this.outlineColor, e.outlineColor), this.outlineWidth = defaultValue(this.outlineWidth, e.outlineWidth), this.shadows = defaultValue(this.shadows, e.shadows), this.distanceDisplayCondition = defaultValue( + this.distanceDisplayCondition, + e.distanceDisplayCondition + ); +}; +const cartoScratch$2 = new Cartographic(), ExtraPropertyNames = []; +function createConstantPositionProperty(e) { + return new ConstantPositionProperty(e); +} +function createPositionPropertyDescriptor(e) { + return createPropertyDescriptor( + e, + void 0, + createConstantPositionProperty + ); +} +function createPropertyTypeDescriptor(e, t) { + return createPropertyDescriptor(e, void 0, function(n) { + return n instanceof t ? n : new t(n); + }); +} +function Entity(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = e.id; + defined(t) || (t = createGuid()), this._availability = void 0, this._id = t, this._definitionChanged = new Event(), this._name = e.name, this._show = defaultValue(e.show, !0), this._parent = void 0, this._propertyNames = [ + "billboard", + "box", + "corridor", + "cylinder", + "description", + "ellipse", + "ellipsoid", + "label", + "model", + "tileset", + "orientation", + "path", + "plane", + "point", + "polygon", + "polyline", + "polylineVolume", + "position", + "properties", + "rectangle", + "viewFrom", + "wall", + ...ExtraPropertyNames + ], this._billboard = void 0, this._billboardSubscription = void 0, this._box = void 0, this._boxSubscription = void 0, this._corridor = void 0, this._corridorSubscription = void 0, this._cylinder = void 0, this._cylinderSubscription = void 0, this._description = void 0, this._descriptionSubscription = void 0, this._ellipse = void 0, this._ellipseSubscription = void 0, this._ellipsoid = void 0, this._ellipsoidSubscription = void 0, this._label = void 0, this._labelSubscription = void 0, this._model = void 0, this._modelSubscription = void 0, this._tileset = void 0, this._tilesetSubscription = void 0, this._orientation = void 0, this._orientationSubscription = void 0, this._path = void 0, this._pathSubscription = void 0, this._plane = void 0, this._planeSubscription = void 0, this._point = void 0, this._pointSubscription = void 0, this._polygon = void 0, this._polygonSubscription = void 0, this._polyline = void 0, this._polylineSubscription = void 0, this._polylineVolume = void 0, this._polylineVolumeSubscription = void 0, this._position = void 0, this._positionSubscription = void 0, this._properties = void 0, this._propertiesSubscription = void 0, this._rectangle = void 0, this._rectangleSubscription = void 0, this._viewFrom = void 0, this._viewFromSubscription = void 0, this._wall = void 0, this._wallSubscription = void 0, this._children = [], this.entityCollection = void 0, this.parent = e.parent, this.merge(e); +} +function updateShow(e, t, n) { + const i = t.length; + for (let r = 0; r < i; r++) { + const o = t[r], s = o._show; + (!n && s) !== (n && s) && updateShow(o, o._children, n); + } + e._definitionChanged.raiseEvent( + e, + "isShowing", + n, + !n + ); +} +Object.defineProperties(Entity.prototype, { + /** + * The availability, if any, associated with this object. + * If availability is undefined, it is assumed that this object's + * other properties will return valid data for any provided time. + * If availability exists, the objects other properties will only + * provide valid data if queried within the given interval. + * @memberof Entity.prototype + * @type {TimeIntervalCollection|undefined} + */ + availability: createRawPropertyDescriptor("availability"), + /** + * Gets the unique ID associated with this object. + * @memberof Entity.prototype + * @type {string} + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + * @memberof Entity.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the name of the object. The name is intended for end-user + * consumption and does not need to be unique. + * @memberof Entity.prototype + * @type {string|undefined} + */ + name: createRawPropertyDescriptor("name"), + /** + * Gets or sets whether this entity should be displayed. When set to true, + * the entity is only displayed if the parent entity's show property is also true. + * @memberof Entity.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + if (e === this._show) + return; + const t = this.isShowing; + this._show = e; + const n = this.isShowing; + t !== n && updateShow(this, this._children, n), this._definitionChanged.raiseEvent(this, "show", e, !e); + } + }, + /** + * Gets whether this entity is being displayed, taking into account + * the visibility of any ancestor entities. + * @memberof Entity.prototype + * @type {boolean} + */ + isShowing: { + get: function() { + return this._show && (!defined(this.entityCollection) || this.entityCollection.show) && (!defined(this._parent) || this._parent.isShowing); + } + }, + /** + * Gets or sets the parent object. + * @memberof Entity.prototype + * @type {Entity|undefined} + */ + parent: { + get: function() { + return this._parent; + }, + set: function(e) { + const t = this._parent; + if (t === e) + return; + const n = this.isShowing; + if (defined(t)) { + const r = t._children.indexOf(this); + t._children.splice(r, 1); + } + this._parent = e, defined(e) && e._children.push(this); + const i = this.isShowing; + n !== i && updateShow(this, this._children, i), this._definitionChanged.raiseEvent(this, "parent", e, t); + } + }, + /** + * Gets the names of all properties registered on this instance. + * @memberof Entity.prototype + * @type {string[]} + */ + propertyNames: { + get: function() { + return this._propertyNames; + } + }, + /** + * Gets or sets the billboard. + * @memberof Entity.prototype + * @type {BillboardGraphics|undefined} + */ + billboard: createPropertyTypeDescriptor("billboard", BillboardGraphics), + /** + * Gets or sets the box. + * @memberof Entity.prototype + * @type {BoxGraphics|undefined} + */ + box: createPropertyTypeDescriptor("box", BoxGraphics), + /** + * Gets or sets the corridor. + * @memberof Entity.prototype + * @type {CorridorGraphics|undefined} + */ + corridor: createPropertyTypeDescriptor("corridor", CorridorGraphics), + /** + * Gets or sets the cylinder. + * @memberof Entity.prototype + * @type {CylinderGraphics|undefined} + */ + cylinder: createPropertyTypeDescriptor("cylinder", CylinderGraphics), + /** + * Gets or sets the description. + * @memberof Entity.prototype + * @type {Property|undefined} + */ + description: createPropertyDescriptor("description"), + /** + * Gets or sets the ellipse. + * @memberof Entity.prototype + * @type {EllipseGraphics|undefined} + */ + ellipse: createPropertyTypeDescriptor("ellipse", EllipseGraphics), + /** + * Gets or sets the ellipsoid. + * @memberof Entity.prototype + * @type {EllipsoidGraphics|undefined} + */ + ellipsoid: createPropertyTypeDescriptor("ellipsoid", EllipsoidGraphics), + /** + * Gets or sets the label. + * @memberof Entity.prototype + * @type {LabelGraphics|undefined} + */ + label: createPropertyTypeDescriptor("label", LabelGraphics), + /** + * Gets or sets the model. + * @memberof Entity.prototype + * @type {ModelGraphics|undefined} + */ + model: createPropertyTypeDescriptor("model", ModelGraphics), + /** + * Gets or sets the tileset. + * @memberof Entity.prototype + * @type {Cesium3DTilesetGraphics|undefined} + */ + tileset: createPropertyTypeDescriptor("tileset", Cesium3DTilesetGraphics), + /** + * Gets or sets the orientation in respect to Earth-fixed-Earth-centered (ECEF). + * Defaults to east-north-up at entity position. + * @memberof Entity.prototype + * @type {Property|undefined} + */ + orientation: createPropertyDescriptor("orientation"), + /** + * Gets or sets the path. + * @memberof Entity.prototype + * @type {PathGraphics|undefined} + */ + path: createPropertyTypeDescriptor("path", PathGraphics), + /** + * Gets or sets the plane. + * @memberof Entity.prototype + * @type {PlaneGraphics|undefined} + */ + plane: createPropertyTypeDescriptor("plane", PlaneGraphics), + /** + * Gets or sets the point graphic. + * @memberof Entity.prototype + * @type {PointGraphics|undefined} + */ + point: createPropertyTypeDescriptor("point", PointGraphics), + /** + * Gets or sets the polygon. + * @memberof Entity.prototype + * @type {PolygonGraphics|undefined} + */ + polygon: createPropertyTypeDescriptor("polygon", PolygonGraphics), + /** + * Gets or sets the polyline. + * @memberof Entity.prototype + * @type {PolylineGraphics|undefined} + */ + polyline: createPropertyTypeDescriptor("polyline", PolylineGraphics), + /** + * Gets or sets the polyline volume. + * @memberof Entity.prototype + * @type {PolylineVolumeGraphics|undefined} + */ + polylineVolume: createPropertyTypeDescriptor( + "polylineVolume", + PolylineVolumeGraphics + ), + /** + * Gets or sets the bag of arbitrary properties associated with this entity. + * @memberof Entity.prototype + * @type {PropertyBag|undefined} + */ + properties: createPropertyTypeDescriptor("properties", PropertyBag), + /** + * Gets or sets the position. + * @memberof Entity.prototype + * @type {PositionProperty|undefined} + */ + position: createPositionPropertyDescriptor("position"), + /** + * Gets or sets the rectangle. + * @memberof Entity.prototype + * @type {RectangleGraphics|undefined} + */ + rectangle: createPropertyTypeDescriptor("rectangle", RectangleGraphics), + /** + * Gets or sets the suggested initial offset when tracking this object. + * The offset is typically defined in the east-north-up reference frame, + * but may be another frame depending on the object's velocity. + * @memberof Entity.prototype + * @type {Property|undefined} + */ + viewFrom: createPropertyDescriptor("viewFrom"), + /** + * Gets or sets the wall. + * @memberof Entity.prototype + * @type {WallGraphics|undefined} + */ + wall: createPropertyTypeDescriptor("wall", WallGraphics) +}); +Entity.registerEntityType = function(e, t) { + Object.defineProperties(Entity.prototype, { + [e]: createPropertyTypeDescriptor(e, t) + }), ExtraPropertyNames.includes(e) || ExtraPropertyNames.push(e); +}; +Entity.prototype.isAvailable = function(e) { + const t = this._availability; + return !defined(t) || t.contains(e); +}; +Entity.prototype.addProperty = function(e) { + this._propertyNames.push(e), Object.defineProperty( + this, + e, + createRawPropertyDescriptor(e, !0) + ); +}; +Entity.prototype.removeProperty = function(e) { + const n = this._propertyNames.indexOf(e); + this._propertyNames.splice(n, 1), delete this[e]; +}; +Entity.prototype.merge = function(e) { + this.name = defaultValue(this.name, e.name), this.availability = defaultValue(this.availability, e.availability); + const t = this._propertyNames, n = defined(e._propertyNames) ? e._propertyNames : Object.keys(e), i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + if (o === "parent" || o === "name" || o === "availability" || o === "children") + continue; + const s = this[o], c = e[o]; + !defined(s) && t.indexOf(o) === -1 && this.addProperty(o), defined(c) && (defined(s) ? defined(s.merge) && s.merge(c) : defined(c.merge) && defined(c.clone) ? this[o] = c.clone() : this[o] = c); + } +}; +const matrix3Scratch = new Matrix3(), positionScratch$c = new Cartesian3(), orientationScratch = new Quaternion(); +Entity.prototype.computeModelMatrix = function(e, t) { + const n = Property.getValueOrUndefined( + this._position, + e, + positionScratch$c + ); + if (!defined(n)) + return; + const i = Property.getValueOrUndefined( + this._orientation, + e, + orientationScratch + ); + return defined(i) ? t = Matrix4.fromRotationTranslation( + Matrix3.fromQuaternion(i, matrix3Scratch), + n, + t + ) : t = Transforms.eastNorthUpToFixedFrame(n, void 0, t), t; +}; +Entity.prototype.computeModelMatrixForHeightReference = function(e, t, n, i, r) { + const o = Property.getValueOrDefault( + t, + e, + HeightReference$1.NONE + ); + let s = Property.getValueOrUndefined( + this._position, + e, + positionScratch$c + ); + if (o === HeightReference$1.NONE || !defined(s) || Cartesian3.equalsEpsilon(s, Cartesian3.ZERO, CesiumMath.EPSILON8)) + return this.computeModelMatrix(e, r); + const c = i.cartesianToCartographic(s, cartoScratch$2); + isHeightReferenceClamp(o) ? c.height = n : c.height += n, s = i.cartographicToCartesian(c, s); + const l = Property.getValueOrUndefined( + this._orientation, + e, + orientationScratch + ); + return defined(l) ? r = Matrix4.fromRotationTranslation( + Matrix3.fromQuaternion(l, matrix3Scratch), + s, + r + ) : r = Transforms.eastNorthUpToFixedFrame(s, void 0, r), r; +}; +Entity.supportsMaterialsforEntitiesOnTerrain = function(e) { + return GroundPrimitive.supportsMaterials(e); +}; +Entity.supportsPolylinesOnTerrain = function(e) { + return GroundPolylinePrimitive.isSupported(e); +}; +const defaultMaterial$2 = new ColorMaterialProperty(Color.WHITE), defaultShow$1 = new ConstantProperty(!0), defaultFill$1 = new ConstantProperty(!0), defaultOutline = new ConstantProperty(!1), defaultOutlineColor$3 = new ConstantProperty(Color.BLACK), defaultShadows$2 = new ConstantProperty(ShadowMode$1.DISABLED), defaultDistanceDisplayCondition$7 = new ConstantProperty( + new DistanceDisplayCondition() +), defaultClassificationType$1 = new ConstantProperty(ClassificationType$1.BOTH); +function GeometryUpdater(e) { + const t = e.entity, n = e.geometryPropertyName; + this._entity = t, this._scene = e.scene, this._fillEnabled = !1, this._isClosed = !1, this._onTerrain = !1, this._dynamic = !1, this._outlineEnabled = !1, this._geometryChanged = new Event(), this._showProperty = void 0, this._materialProperty = void 0, this._showOutlineProperty = void 0, this._outlineColorProperty = void 0, this._outlineWidth = 1, this._shadowsProperty = void 0, this._distanceDisplayConditionProperty = void 0, this._classificationTypeProperty = void 0, this._options = e.geometryOptions, this._geometryPropertyName = n, this._id = `${n}-${t.id}`, this._observedPropertyNames = e.observedPropertyNames, this._supportsMaterialsforEntitiesOnTerrain = Entity.supportsMaterialsforEntitiesOnTerrain( + e.scene + ); +} +Object.defineProperties(GeometryUpdater.prototype, { + /** + * Gets the unique ID associated with this updater + * @memberof GeometryUpdater.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets the entity associated with this geometry. + * @memberof GeometryUpdater.prototype + * + * @type {Entity} + * @readonly + */ + entity: { + get: function() { + return this._entity; + } + }, + /** + * Gets a value indicating if the geometry has a fill component. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + fillEnabled: { + get: function() { + return this._fillEnabled; + } + }, + /** + * Gets a value indicating if fill visibility varies with simulation time. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + hasConstantFill: { + get: function() { + return !this._fillEnabled || !defined(this._entity.availability) && Property.isConstant(this._showProperty) && Property.isConstant(this._fillProperty); + } + }, + /** + * Gets the material property used to fill the geometry. + * @memberof GeometryUpdater.prototype + * + * @type {MaterialProperty} + * @readonly + */ + fillMaterialProperty: { + get: function() { + return this._materialProperty; + } + }, + /** + * Gets a value indicating if the geometry has an outline component. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + outlineEnabled: { + get: function() { + return this._outlineEnabled; + } + }, + /** + * Gets a value indicating if the geometry has an outline component. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + hasConstantOutline: { + get: function() { + return !this._outlineEnabled || !defined(this._entity.availability) && Property.isConstant(this._showProperty) && Property.isConstant(this._showOutlineProperty); + } + }, + /** + * Gets the {@link Color} property for the geometry outline. + * @memberof GeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + outlineColorProperty: { + get: function() { + return this._outlineColorProperty; + } + }, + /** + * Gets the constant with of the geometry outline, in pixels. + * This value is only valid if isDynamic is false. + * @memberof GeometryUpdater.prototype + * + * @type {number} + * @readonly + */ + outlineWidth: { + get: function() { + return this._outlineWidth; + } + }, + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + * @memberof GeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + shadowsProperty: { + get: function() { + return this._shadowsProperty; + } + }, + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + * @memberof GeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + distanceDisplayConditionProperty: { + get: function() { + return this._distanceDisplayConditionProperty; + } + }, + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + * @memberof GeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + classificationTypeProperty: { + get: function() { + return this._classificationTypeProperty; + } + }, + /** + * Gets a value indicating if the geometry is time-varying. + * + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + isDynamic: { + get: function() { + return this._dynamic; + } + }, + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + isClosed: { + get: function() { + return this._isClosed; + } + }, + /** + * Gets a value indicating if the geometry should be drawn on terrain. + * @memberof EllipseGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + onTerrain: { + get: function() { + return this._onTerrain; + } + }, + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + * @memberof GeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + geometryChanged: { + get: function() { + return this._geometryChanged; + } + } +}); +GeometryUpdater.prototype.isOutlineVisible = function(e) { + const t = this._entity, n = this._outlineEnabled && t.isAvailable(e) && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e); + return defaultValue(n, !1); +}; +GeometryUpdater.prototype.isFilled = function(e) { + const t = this._entity, n = this._fillEnabled && t.isAvailable(e) && this._showProperty.getValue(e) && this._fillProperty.getValue(e); + return defaultValue(n, !1); +}; +GeometryUpdater.prototype.createFillGeometryInstance = DeveloperError.throwInstantiationError; +GeometryUpdater.prototype.createOutlineGeometryInstance = DeveloperError.throwInstantiationError; +GeometryUpdater.prototype.isDestroyed = function() { + return !1; +}; +GeometryUpdater.prototype.destroy = function() { + destroyObject(this); +}; +GeometryUpdater.prototype._isHidden = function(e, t) { + const n = t.show; + return defined(n) && n.isConstant && !n.getValue(Iso8601.MINIMUM_VALUE); +}; +GeometryUpdater.prototype._isOnTerrain = function(e, t) { + return !1; +}; +GeometryUpdater.prototype._getIsClosed = function(e) { + return !0; +}; +GeometryUpdater.prototype._isDynamic = DeveloperError.throwInstantiationError; +GeometryUpdater.prototype._setStaticOptions = DeveloperError.throwInstantiationError; +GeometryUpdater.prototype._onEntityPropertyChanged = function(e, t, n, i) { + if (this._observedPropertyNames.indexOf(t) === -1) + return; + const r = this._entity[this._geometryPropertyName]; + if (!defined(r)) { + (this._fillEnabled || this._outlineEnabled) && (this._fillEnabled = !1, this._outlineEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + const o = r.fill, s = defined(o) && o.isConstant ? o.getValue(Iso8601.MINIMUM_VALUE) : !0, c = r.outline; + let l = defined(c); + if (l && c.isConstant && (l = c.getValue(Iso8601.MINIMUM_VALUE)), !s && !l) { + (this._fillEnabled || this._outlineEnabled) && (this._fillEnabled = !1, this._outlineEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + const d = r.show; + if (this._isHidden(e, r)) { + (this._fillEnabled || this._outlineEnabled) && (this._fillEnabled = !1, this._outlineEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + this._materialProperty = defaultValue(r.material, defaultMaterial$2), this._fillProperty = defaultValue(o, defaultFill$1), this._showProperty = defaultValue(d, defaultShow$1), this._showOutlineProperty = defaultValue(r.outline, defaultOutline), this._outlineColorProperty = l ? defaultValue(r.outlineColor, defaultOutlineColor$3) : void 0, this._shadowsProperty = defaultValue(r.shadows, defaultShadows$2), this._distanceDisplayConditionProperty = defaultValue( + r.distanceDisplayCondition, + defaultDistanceDisplayCondition$7 + ), this._classificationTypeProperty = defaultValue( + r.classificationType, + defaultClassificationType$1 + ), this._fillEnabled = s; + const f = this._isOnTerrain(e, r) && (this._supportsMaterialsforEntitiesOnTerrain || this._materialProperty instanceof ColorMaterialProperty); + if (l && f && (oneTimeWarning(oneTimeWarning.geometryOutlines), l = !1), this._onTerrain = f, this._outlineEnabled = l, this._isDynamic(e, r)) + this._dynamic || (this._dynamic = !0, this._geometryChanged.raiseEvent(this)); + else { + this._setStaticOptions(e, r), this._isClosed = this._getIsClosed(this._options); + const h = r.outlineWidth; + this._outlineWidth = defined(h) ? h.getValue(Iso8601.MINIMUM_VALUE) : 1, this._dynamic = !1, this._geometryChanged.raiseEvent(this); + } +}; +GeometryUpdater.prototype.createDynamicUpdater = function(e, t) { + return new this.constructor.DynamicGeometryUpdater( + this, + e, + t + ); +}; +function CallbackProperty(e, t) { + this._callback = void 0, this._isConstant = void 0, this._definitionChanged = new Event(), this.setCallback(e, t); +} +Object.defineProperties(CallbackProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * @memberof CallbackProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._isConstant; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setCallback is called. + * @memberof CallbackProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +const timeScratch$l = new JulianDate(); +CallbackProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$l)), this._callback(e, t); +}; +CallbackProperty.prototype.setCallback = function(e, t) { + const n = this._callback !== e || this._isConstant !== t; + this._callback = e, this._isConstant = t, n && this._definitionChanged.raiseEvent(this); +}; +CallbackProperty.prototype.equals = function(e) { + return this === e || e instanceof CallbackProperty && this._callback === e._callback && this._isConstant === e._isConstant; +}; +const scratchPosition$e = new Cartesian3(); +function TerrainOffsetProperty(e, t, n, i) { + this._scene = e, this._heightReference = n, this._extrudedHeightReference = i, this._positionProperty = t, this._position = new Cartesian3(), this._cartographicPosition = new Cartographic(), this._normal = new Cartesian3(), this._definitionChanged = new Event(), this._terrainHeight = 0, this._removeCallbackFunc = void 0, this._removeEventListener = void 0, this._removeModeListener = void 0; + const r = this; + if (defined(e.globe) && (this._removeEventListener = e.terrainProviderChanged.addEventListener( + function() { + r._updateClamping(); + } + ), this._removeModeListener = e.morphComplete.addEventListener( + function() { + r._updateClamping(); + } + )), t.isConstant) { + const o = t.getValue( + Iso8601.MINIMUM_VALUE, + scratchPosition$e + ); + if (!defined(o) || Cartesian3.equals(o, Cartesian3.ZERO) || !defined(e.globe)) + return; + this._position = Cartesian3.clone(o, this._position), this._updateClamping(), this._normal = e.ellipsoid.geodeticSurfaceNormal( + o, + this._normal + ); + } +} +Object.defineProperties(TerrainOffsetProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * @memberof TerrainOffsetProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return !1; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * @memberof TerrainOffsetProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +TerrainOffsetProperty.prototype._updateClamping = function() { + defined(this._removeCallbackFunc) && this._removeCallbackFunc(); + const e = this._scene, t = this._position; + if (Cartesian3.equals(t, Cartesian3.ZERO)) { + this._terrainHeight = 0; + return; + } + const i = e.ellipsoid.cartesianToCartographic( + t, + this._cartographicPosition + ), r = e.getHeight(i, this._heightReference); + defined(r) ? this._terrainHeight = r : this._terrainHeight = 0; + const o = (s) => { + this._terrainHeight = s.height, this.definitionChanged.raiseEvent(); + }; + this._removeCallbackFunc = e.updateHeight( + i, + o, + this._heightReference + ); +}; +const timeScratch$k = new JulianDate(); +TerrainOffsetProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$k)); + const n = Property.getValueOrDefault( + this._heightReference, + e, + HeightReference$1.NONE + ), i = Property.getValueOrDefault( + this._extrudedHeightReference, + e, + HeightReference$1.NONE + ); + if (n === HeightReference$1.NONE && !isHeightReferenceRelative(i)) + return this._position = Cartesian3.clone(Cartesian3.ZERO, this._position), Cartesian3.clone(Cartesian3.ZERO, t); + if (this._positionProperty.isConstant) + return Cartesian3.multiplyByScalar( + this._normal, + this._terrainHeight, + t + ); + const r = this._scene, o = this._positionProperty.getValue(e, scratchPosition$e); + if (!defined(o) || Cartesian3.equals(o, Cartesian3.ZERO) || !defined(r.globe)) + return Cartesian3.clone(Cartesian3.ZERO, t); + if (Cartesian3.equalsEpsilon(this._position, o, CesiumMath.EPSILON10)) + return Cartesian3.multiplyByScalar( + this._normal, + this._terrainHeight, + t + ); + this._position = Cartesian3.clone(o, this._position), this._updateClamping(); + const s = r.ellipsoid.geodeticSurfaceNormal(o, this._normal); + return Cartesian3.multiplyByScalar(s, this._terrainHeight, t); +}; +TerrainOffsetProperty.prototype.isDestroyed = function() { + return !1; +}; +TerrainOffsetProperty.prototype.destroy = function() { + return defined(this._removeEventListener) && this._removeEventListener(), defined(this._removeModeListener) && this._removeModeListener(), defined(this._removeCallbackFunc) && this._removeCallbackFunc(), destroyObject(this); +}; +function heightReferenceOnEntityPropertyChanged(e, t, n, i) { + if (GeometryUpdater.prototype._onEntityPropertyChanged.call( + this, + e, + t, + n, + i + ), this._observedPropertyNames.indexOf(t) === -1) + return; + const r = this._entity[this._geometryPropertyName]; + if (!defined(r)) + return; + defined(this._terrainOffsetProperty) && (this._terrainOffsetProperty.destroy(), this._terrainOffsetProperty = void 0); + const o = r.heightReference; + if (defined(o)) { + const s = new CallbackProperty( + this._computeCenter.bind(this), + !this._dynamic + ); + this._terrainOffsetProperty = new TerrainOffsetProperty( + this._scene, + s, + o + ); + } +} +const defaultOffset$a = Cartesian3.ZERO, offsetScratch$9 = new Cartesian3(), positionScratch$b = new Cartesian3(), scratchColor$p = new Color(); +function BoxGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.dimensions = void 0, this.offsetAttribute = void 0; +} +function BoxGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new BoxGeometryOptions(e), + geometryPropertyName: "box", + observedPropertyNames: ["availability", "position", "orientation", "box"] + }), this._onEntityPropertyChanged(e, "box", e.box, void 0); +} +defined(Object.create) && (BoxGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), BoxGeometryUpdater.prototype.constructor = BoxGeometryUpdater); +Object.defineProperties(BoxGeometryUpdater.prototype, { + /** + * Gets the terrain offset property + * @type {TerrainOffsetProperty} + * @memberof BoxGeometryUpdater.prototype + * @readonly + * @private + */ + terrainOffsetProperty: { + get: function() { + return this._terrainOffsetProperty; + } + } +}); +BoxGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), s = { + show: i, + distanceDisplayCondition: o, + color: void 0, + offset: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let c; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (c = this._materialProperty.color.getValue(e, scratchColor$p)), defined(c) || (c = Color.WHITE), s.color = ColorGeometryInstanceAttribute.fromColor(c); + } + return defined(this._options.offsetAttribute) && (s.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$a, + offsetScratch$9 + ) + )), new GeometryInstance({ + id: t, + geometry: BoxGeometry.fromDimensions(this._options), + modelMatrix: t.computeModelMatrixForHeightReference( + e, + t.box.heightReference, + this._options.dimensions.z * 0.5, + this._scene.ellipsoid + ), + attributes: s + }); +}; +BoxGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$p + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (o.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$a, + offsetScratch$9 + ) + )), new GeometryInstance({ + id: t, + geometry: BoxOutlineGeometry.fromDimensions(this._options), + modelMatrix: t.computeModelMatrixForHeightReference( + e, + t.box.heightReference, + this._options.dimensions.z * 0.5, + this._scene.ellipsoid + ), + attributes: o + }); +}; +BoxGeometryUpdater.prototype._computeCenter = function(e, t) { + return Property.getValueOrUndefined(this._entity.position, e, t); +}; +BoxGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.dimensions) || !defined(e.position) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +BoxGeometryUpdater.prototype._isDynamic = function(e, t) { + return !e.position.isConstant || !Property.isConstant(e.orientation) || !t.dimensions.isConstant || !Property.isConstant(t.outlineWidth); +}; +BoxGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ), i = this._options; + i.vertexFormat = this._materialProperty instanceof ColorMaterialProperty ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, i.dimensions = t.dimensions.getValue( + Iso8601.MINIMUM_VALUE, + i.dimensions + ), i.offsetAttribute = n !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0; +}; +BoxGeometryUpdater.prototype._onEntityPropertyChanged = heightReferenceOnEntityPropertyChanged; +BoxGeometryUpdater.DynamicGeometryUpdater = DynamicBoxGeometryUpdater; +function DynamicBoxGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicBoxGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicBoxGeometryUpdater.prototype.constructor = DynamicBoxGeometryUpdater); +DynamicBoxGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = Property.getValueOrUndefined( + e.position, + n, + positionScratch$b + ), r = this._options.dimensions; + return !defined(i) || !defined(r) || DynamicGeometryUpdater$1.prototype._isHidden.call(this, e, t, n); +}; +DynamicBoxGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ), r = this._options; + r.dimensions = Property.getValueOrUndefined( + t.dimensions, + n, + r.dimensions + ), r.offsetAttribute = i !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0; +}; +/*! @license DOMPurify 3.1.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.6/LICENSE */ +const { + entries, + setPrototypeOf, + isFrozen, + getPrototypeOf, + getOwnPropertyDescriptor +} = Object; +let { + freeze, + seal, + create +} = Object, { + apply, + construct +} = typeof Reflect < "u" && Reflect; +freeze || (freeze = function(t) { + return t; +}); +seal || (seal = function(t) { + return t; +}); +apply || (apply = function(t, n, i) { + return t.apply(n, i); +}); +construct || (construct = function(t, n) { + return new t(...n); +}); +const arrayForEach = unapply(Array.prototype.forEach), arrayPop = unapply(Array.prototype.pop), arrayPush = unapply(Array.prototype.push), stringToLowerCase = unapply(String.prototype.toLowerCase), stringToString = unapply(String.prototype.toString), stringMatch = unapply(String.prototype.match), stringReplace = unapply(String.prototype.replace), stringIndexOf = unapply(String.prototype.indexOf), stringTrim = unapply(String.prototype.trim), objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty), regExpTest = unapply(RegExp.prototype.test), typeErrorCreate = unconstruct(TypeError); +function unapply(e) { + return function(t) { + for (var n = arguments.length, i = new Array(n > 1 ? n - 1 : 0), r = 1; r < n; r++) + i[r - 1] = arguments[r]; + return apply(e, t, i); + }; +} +function unconstruct(e) { + return function() { + for (var t = arguments.length, n = new Array(t), i = 0; i < t; i++) + n[i] = arguments[i]; + return construct(e, n); + }; +} +function addToSet(e, t) { + let n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase; + setPrototypeOf && setPrototypeOf(e, null); + let i = t.length; + for (; i--; ) { + let r = t[i]; + if (typeof r == "string") { + const o = n(r); + o !== r && (isFrozen(t) || (t[i] = o), r = o); + } + e[r] = !0; + } + return e; +} +function cleanArray(e) { + for (let t = 0; t < e.length; t++) + objectHasOwnProperty(e, t) || (e[t] = null); + return e; +} +function clone(e) { + const t = create(null); + for (const [n, i] of entries(e)) + objectHasOwnProperty(e, n) && (Array.isArray(i) ? t[n] = cleanArray(i) : i && typeof i == "object" && i.constructor === Object ? t[n] = clone(i) : t[n] = i); + return t; +} +function lookupGetter(e, t) { + for (; e !== null; ) { + const i = getOwnPropertyDescriptor(e, t); + if (i) { + if (i.get) + return unapply(i.get); + if (typeof i.value == "function") + return unapply(i.value); + } + e = getPrototypeOf(e); + } + function n() { + return null; + } + return n; +} +const html$1 = freeze(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]), svg$1 = freeze(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]), svgFilters = freeze(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]), svgDisallowed = freeze(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]), mathMl$1 = freeze(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]), mathMlDisallowed = freeze(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]), text = freeze(["#text"]), html = freeze(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns", "slot"]), svg = freeze(["accent-height", "accumulate", "additive", "alignment-baseline", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]), mathMl = freeze(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]), xml = freeze(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]), MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm), ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm), TMPLIT_EXPR = seal(/\${[\w\W]*}/gm), DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/), ARIA_ATTR = seal(/^aria-[\-\w]+$/), IS_ALLOWED_URI = seal( + /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i + // eslint-disable-line no-useless-escape +), IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i), ATTR_WHITESPACE = seal( + /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g + // eslint-disable-line no-control-regex +), DOCTYPE_NAME = seal(/^html$/i), CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i); +var EXPRESSIONS = /* @__PURE__ */ Object.freeze({ + __proto__: null, + MUSTACHE_EXPR, + ERB_EXPR, + TMPLIT_EXPR, + DATA_ATTR, + ARIA_ATTR, + IS_ALLOWED_URI, + IS_SCRIPT_OR_DATA, + ATTR_WHITESPACE, + DOCTYPE_NAME, + CUSTOM_ELEMENT +}); +const NODE_TYPE = { + element: 1, + attribute: 2, + text: 3, + cdataSection: 4, + entityReference: 5, + // Deprecated + entityNode: 6, + // Deprecated + progressingInstruction: 7, + comment: 8, + document: 9, + documentType: 10, + documentFragment: 11, + notation: 12 + // Deprecated +}, getGlobal = function() { + return typeof window > "u" ? null : window; +}, _createTrustedTypesPolicy = function(t, n) { + if (typeof t != "object" || typeof t.createPolicy != "function") + return null; + let i = null; + const r = "data-tt-policy-suffix"; + n && n.hasAttribute(r) && (i = n.getAttribute(r)); + const o = "dompurify" + (i ? "#" + i : ""); + try { + return t.createPolicy(o, { + createHTML(s) { + return s; + }, + createScriptURL(s) { + return s; + } + }); + } catch { + return console.warn("TrustedTypes policy " + o + " could not be created."), null; + } +}; +function createDOMPurify() { + let e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal(); + const t = (_e) => createDOMPurify(_e); + if (t.version = "3.1.6", t.removed = [], !e || !e.document || e.document.nodeType !== NODE_TYPE.document) + return t.isSupported = !1, t; + let { + document: n + } = e; + const i = n, r = i.currentScript, { + DocumentFragment: o, + HTMLTemplateElement: s, + Node: c, + Element: l, + NodeFilter: d, + NamedNodeMap: f = e.NamedNodeMap || e.MozNamedAttrMap, + HTMLFormElement: h, + DOMParser: p, + trustedTypes: m + } = e, _ = l.prototype, y = lookupGetter(_, "cloneNode"), C = lookupGetter(_, "remove"), T = lookupGetter(_, "nextSibling"), x = lookupGetter(_, "childNodes"), b = lookupGetter(_, "parentNode"); + if (typeof s == "function") { + const _e = n.createElement("template"); + _e.content && _e.content.ownerDocument && (n = _e.content.ownerDocument); + } + let S, E = ""; + const { + implementation: A, + createNodeIterator: D, + createDocumentFragment: P, + getElementsByTagName: I + } = n, { + importNode: M + } = i; + let R = {}; + t.isSupported = typeof entries == "function" && typeof b == "function" && A && A.createHTMLDocument !== void 0; + const { + MUSTACHE_EXPR: L, + ERB_EXPR: g, + TMPLIT_EXPR: w, + DATA_ATTR: O, + ARIA_ATTR: N, + IS_SCRIPT_OR_DATA: F, + ATTR_WHITESPACE: B, + CUSTOM_ELEMENT: V + } = EXPRESSIONS; + let { + IS_ALLOWED_URI: U + } = EXPRESSIONS, k = null; + const $ = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); + let G = null; + const q = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); + let z = Object.seal(create(null, { + tagNameCheck: { + writable: !0, + configurable: !1, + enumerable: !0, + value: null + }, + attributeNameCheck: { + writable: !0, + configurable: !1, + enumerable: !0, + value: null + }, + allowCustomizedBuiltInElements: { + writable: !0, + configurable: !1, + enumerable: !0, + value: !1 + } + })), H = null, Q = null, ne = !0, K = !0, Z = !1, ee = !0, oe = !1, X = !0, fe = !1, de = !1, ce = !1, ye = !1, ge = !1, re = !1, be = !0, pe = !1; + const Te = "user-content-"; + let xe = !0, W = !1, j = {}, se = null; + const Pe = addToSet({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]); + let le = null; + const De = addToSet({}, ["audio", "video", "img", "source", "image", "track"]); + let Me = null; + const He = addToSet({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]), Oe = "http://www.w3.org/1998/Math/MathML", $e = "http://www.w3.org/2000/svg", J = "http://www.w3.org/1999/xhtml"; + let ae = J, te = !1, ie = null; + const ue = addToSet({}, [Oe, $e, J], stringToString); + let me = null; + const Se = ["application/xhtml+xml", "text/html"], we = "text/html"; + let Ee = null, Ve = null; + const We = n.createElement("form"), Ne = function(Y) { + return Y instanceof RegExp || Y instanceof Function; + }, Ae = function() { + let Y = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + if (!(Ve && Ve === Y)) { + if ((!Y || typeof Y != "object") && (Y = {}), Y = clone(Y), me = // eslint-disable-next-line unicorn/prefer-includes + Se.indexOf(Y.PARSER_MEDIA_TYPE) === -1 ? we : Y.PARSER_MEDIA_TYPE, Ee = me === "application/xhtml+xml" ? stringToString : stringToLowerCase, k = objectHasOwnProperty(Y, "ALLOWED_TAGS") ? addToSet({}, Y.ALLOWED_TAGS, Ee) : $, G = objectHasOwnProperty(Y, "ALLOWED_ATTR") ? addToSet({}, Y.ALLOWED_ATTR, Ee) : q, ie = objectHasOwnProperty(Y, "ALLOWED_NAMESPACES") ? addToSet({}, Y.ALLOWED_NAMESPACES, stringToString) : ue, Me = objectHasOwnProperty(Y, "ADD_URI_SAFE_ATTR") ? addToSet( + clone(He), + // eslint-disable-line indent + Y.ADD_URI_SAFE_ATTR, + // eslint-disable-line indent + Ee + // eslint-disable-line indent + ) : He, le = objectHasOwnProperty(Y, "ADD_DATA_URI_TAGS") ? addToSet( + clone(De), + // eslint-disable-line indent + Y.ADD_DATA_URI_TAGS, + // eslint-disable-line indent + Ee + // eslint-disable-line indent + ) : De, se = objectHasOwnProperty(Y, "FORBID_CONTENTS") ? addToSet({}, Y.FORBID_CONTENTS, Ee) : Pe, H = objectHasOwnProperty(Y, "FORBID_TAGS") ? addToSet({}, Y.FORBID_TAGS, Ee) : {}, Q = objectHasOwnProperty(Y, "FORBID_ATTR") ? addToSet({}, Y.FORBID_ATTR, Ee) : {}, j = objectHasOwnProperty(Y, "USE_PROFILES") ? Y.USE_PROFILES : !1, ne = Y.ALLOW_ARIA_ATTR !== !1, K = Y.ALLOW_DATA_ATTR !== !1, Z = Y.ALLOW_UNKNOWN_PROTOCOLS || !1, ee = Y.ALLOW_SELF_CLOSE_IN_ATTR !== !1, oe = Y.SAFE_FOR_TEMPLATES || !1, X = Y.SAFE_FOR_XML !== !1, fe = Y.WHOLE_DOCUMENT || !1, ye = Y.RETURN_DOM || !1, ge = Y.RETURN_DOM_FRAGMENT || !1, re = Y.RETURN_TRUSTED_TYPE || !1, ce = Y.FORCE_BODY || !1, be = Y.SANITIZE_DOM !== !1, pe = Y.SANITIZE_NAMED_PROPS || !1, xe = Y.KEEP_CONTENT !== !1, W = Y.IN_PLACE || !1, U = Y.ALLOWED_URI_REGEXP || IS_ALLOWED_URI, ae = Y.NAMESPACE || J, z = Y.CUSTOM_ELEMENT_HANDLING || {}, Y.CUSTOM_ELEMENT_HANDLING && Ne(Y.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && (z.tagNameCheck = Y.CUSTOM_ELEMENT_HANDLING.tagNameCheck), Y.CUSTOM_ELEMENT_HANDLING && Ne(Y.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && (z.attributeNameCheck = Y.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), Y.CUSTOM_ELEMENT_HANDLING && typeof Y.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements == "boolean" && (z.allowCustomizedBuiltInElements = Y.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), oe && (K = !1), ge && (ye = !0), j && (k = addToSet({}, text), G = [], j.html === !0 && (addToSet(k, html$1), addToSet(G, html)), j.svg === !0 && (addToSet(k, svg$1), addToSet(G, svg), addToSet(G, xml)), j.svgFilters === !0 && (addToSet(k, svgFilters), addToSet(G, svg), addToSet(G, xml)), j.mathMl === !0 && (addToSet(k, mathMl$1), addToSet(G, mathMl), addToSet(G, xml))), Y.ADD_TAGS && (k === $ && (k = clone(k)), addToSet(k, Y.ADD_TAGS, Ee)), Y.ADD_ATTR && (G === q && (G = clone(G)), addToSet(G, Y.ADD_ATTR, Ee)), Y.ADD_URI_SAFE_ATTR && addToSet(Me, Y.ADD_URI_SAFE_ATTR, Ee), Y.FORBID_CONTENTS && (se === Pe && (se = clone(se)), addToSet(se, Y.FORBID_CONTENTS, Ee)), xe && (k["#text"] = !0), fe && addToSet(k, ["html", "head", "body"]), k.table && (addToSet(k, ["tbody"]), delete H.tbody), Y.TRUSTED_TYPES_POLICY) { + if (typeof Y.TRUSTED_TYPES_POLICY.createHTML != "function") + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + if (typeof Y.TRUSTED_TYPES_POLICY.createScriptURL != "function") + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + S = Y.TRUSTED_TYPES_POLICY, E = S.createHTML(""); + } else + S === void 0 && (S = _createTrustedTypesPolicy(m, r)), S !== null && typeof E == "string" && (E = S.createHTML("")); + freeze && freeze(Y), Ve = Y; + } + }, ke = addToSet({}, ["mi", "mo", "mn", "ms", "mtext"]), Fe = addToSet({}, ["foreignobject", "annotation-xml"]), Je = addToSet({}, ["title", "style", "font", "a", "script"]), ve = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]), Le = addToSet({}, [...mathMl$1, ...mathMlDisallowed]), rt = function(Y) { + let he = b(Y); + (!he || !he.tagName) && (he = { + namespaceURI: ae, + tagName: "template" + }); + const Ce = stringToLowerCase(Y.tagName), Re = stringToLowerCase(he.tagName); + return ie[Y.namespaceURI] ? Y.namespaceURI === $e ? he.namespaceURI === J ? Ce === "svg" : he.namespaceURI === Oe ? Ce === "svg" && (Re === "annotation-xml" || ke[Re]) : !!ve[Ce] : Y.namespaceURI === Oe ? he.namespaceURI === J ? Ce === "math" : he.namespaceURI === $e ? Ce === "math" && Fe[Re] : !!Le[Ce] : Y.namespaceURI === J ? he.namespaceURI === $e && !Fe[Re] || he.namespaceURI === Oe && !ke[Re] ? !1 : !Le[Ce] && (Je[Ce] || !ve[Ce]) : !!(me === "application/xhtml+xml" && ie[Y.namespaceURI]) : !1; + }, Be = function(Y) { + arrayPush(t.removed, { + element: Y + }); + try { + b(Y).removeChild(Y); + } catch { + C(Y); + } + }, Ze = function(Y, he) { + try { + arrayPush(t.removed, { + attribute: he.getAttributeNode(Y), + from: he + }); + } catch { + arrayPush(t.removed, { + attribute: null, + from: he + }); + } + if (he.removeAttribute(Y), Y === "is" && !G[Y]) + if (ye || ge) + try { + Be(he); + } catch { + } + else + try { + he.setAttribute(Y, ""); + } catch { + } + }, je = function(Y) { + let he = null, Ce = null; + if (ce) + Y = "" + Y; + else { + const Ge = stringMatch(Y, /^[\r\n\t ]+/); + Ce = Ge && Ge[0]; + } + me === "application/xhtml+xml" && ae === J && (Y = '' + Y + ""); + const Re = S ? S.createHTML(Y) : Y; + if (ae === J) + try { + he = new p().parseFromString(Re, me); + } catch { + } + if (!he || !he.documentElement) { + he = A.createDocument(ae, "template", null); + try { + he.documentElement.innerHTML = te ? E : Re; + } catch { + } + } + const qe = he.body || he.documentElement; + return Y && Ce && qe.insertBefore(n.createTextNode(Ce), qe.childNodes[0] || null), ae === J ? I.call(he, fe ? "html" : "body")[0] : fe ? he.documentElement : qe; + }, at = function(Y) { + return D.call( + Y.ownerDocument || Y, + Y, + // eslint-disable-next-line no-bitwise + d.SHOW_ELEMENT | d.SHOW_COMMENT | d.SHOW_TEXT | d.SHOW_PROCESSING_INSTRUCTION | d.SHOW_CDATA_SECTION, + null + ); + }, ze = function(Y) { + return Y instanceof h && (typeof Y.nodeName != "string" || typeof Y.textContent != "string" || typeof Y.removeChild != "function" || !(Y.attributes instanceof f) || typeof Y.removeAttribute != "function" || typeof Y.setAttribute != "function" || typeof Y.namespaceURI != "string" || typeof Y.insertBefore != "function" || typeof Y.hasChildNodes != "function"); + }, Ke = function(Y) { + return typeof c == "function" && Y instanceof c; + }, Ye = function(Y, he, Ce) { + R[Y] && arrayForEach(R[Y], (Re) => { + Re.call(t, he, Ce, Ve); + }); + }, Ue = function(Y) { + let he = null; + if (Ye("beforeSanitizeElements", Y, null), ze(Y)) + return Be(Y), !0; + const Ce = Ee(Y.nodeName); + if (Ye("uponSanitizeElement", Y, { + tagName: Ce, + allowedTags: k + }), Y.hasChildNodes() && !Ke(Y.firstElementChild) && regExpTest(/<[/\w]/g, Y.innerHTML) && regExpTest(/<[/\w]/g, Y.textContent) || Y.nodeType === NODE_TYPE.progressingInstruction || X && Y.nodeType === NODE_TYPE.comment && regExpTest(/<[/\w]/g, Y.data)) + return Be(Y), !0; + if (!k[Ce] || H[Ce]) { + if (!H[Ce] && tt(Ce) && (z.tagNameCheck instanceof RegExp && regExpTest(z.tagNameCheck, Ce) || z.tagNameCheck instanceof Function && z.tagNameCheck(Ce))) + return !1; + if (xe && !se[Ce]) { + const Re = b(Y) || Y.parentNode, qe = x(Y) || Y.childNodes; + if (qe && Re) { + const Ge = qe.length; + for (let Qe = Ge - 1; Qe >= 0; --Qe) { + const it = y(qe[Qe], !0); + it.__removalCount = (Y.__removalCount || 0) + 1, Re.insertBefore(it, T(Y)); + } + } + } + return Be(Y), !0; + } + return Y instanceof l && !rt(Y) || (Ce === "noscript" || Ce === "noembed" || Ce === "noframes") && regExpTest(/<\/no(script|embed|frames)/i, Y.innerHTML) ? (Be(Y), !0) : (oe && Y.nodeType === NODE_TYPE.text && (he = Y.textContent, arrayForEach([L, g, w], (Re) => { + he = stringReplace(he, Re, " "); + }), Y.textContent !== he && (arrayPush(t.removed, { + element: Y.cloneNode() + }), Y.textContent = he)), Ye("afterSanitizeElements", Y, null), !1); + }, et = function(Y, he, Ce) { + if (be && (he === "id" || he === "name") && (Ce in n || Ce in We)) + return !1; + if (!(K && !Q[he] && regExpTest(O, he))) { + if (!(ne && regExpTest(N, he))) { + if (!G[he] || Q[he]) { + if ( + // First condition does a very basic check if a) it's basically a valid custom element tagname AND + // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck + !(tt(Y) && (z.tagNameCheck instanceof RegExp && regExpTest(z.tagNameCheck, Y) || z.tagNameCheck instanceof Function && z.tagNameCheck(Y)) && (z.attributeNameCheck instanceof RegExp && regExpTest(z.attributeNameCheck, he) || z.attributeNameCheck instanceof Function && z.attributeNameCheck(he)) || // Alternative, second condition checks if it's an `is`-attribute, AND + // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + he === "is" && z.allowCustomizedBuiltInElements && (z.tagNameCheck instanceof RegExp && regExpTest(z.tagNameCheck, Ce) || z.tagNameCheck instanceof Function && z.tagNameCheck(Ce))) + ) return !1; + } else if (!Me[he]) { + if (!regExpTest(U, stringReplace(Ce, B, ""))) { + if (!((he === "src" || he === "xlink:href" || he === "href") && Y !== "script" && stringIndexOf(Ce, "data:") === 0 && le[Y])) { + if (!(Z && !regExpTest(F, stringReplace(Ce, B, "")))) { + if (Ce) + return !1; + } + } + } + } + } + } + return !0; + }, tt = function(Y) { + return Y !== "annotation-xml" && stringMatch(Y, V); + }, nt = function(Y) { + Ye("beforeSanitizeAttributes", Y, null); + const { + attributes: he + } = Y; + if (!he) + return; + const Ce = { + attrName: "", + attrValue: "", + keepAttr: !0, + allowedAttributes: G + }; + let Re = he.length; + for (; Re--; ) { + const qe = he[Re], { + name: Ge, + namespaceURI: Qe, + value: it + } = qe, ot = Ee(Ge); + let Xe = Ge === "value" ? it : stringTrim(it); + if (Ce.attrName = ot, Ce.attrValue = Xe, Ce.keepAttr = !0, Ce.forceKeepAttr = void 0, Ye("uponSanitizeAttribute", Y, Ce), Xe = Ce.attrValue, X && regExpTest(/((--!?|])>)|<\/(style|title)/i, Xe)) { + Ze(Ge, Y); + continue; + } + if (Ce.forceKeepAttr || (Ze(Ge, Y), !Ce.keepAttr)) + continue; + if (!ee && regExpTest(/\/>/i, Xe)) { + Ze(Ge, Y); + continue; + } + oe && arrayForEach([L, g, w], (ct) => { + Xe = stringReplace(Xe, ct, " "); + }); + const st = Ee(Y.nodeName); + if (et(st, ot, Xe)) { + if (pe && (ot === "id" || ot === "name") && (Ze(Ge, Y), Xe = Te + Xe), S && typeof m == "object" && typeof m.getAttributeType == "function" && !Qe) + switch (m.getAttributeType(st, ot)) { + case "TrustedHTML": { + Xe = S.createHTML(Xe); + break; + } + case "TrustedScriptURL": { + Xe = S.createScriptURL(Xe); + break; + } + } + try { + Qe ? Y.setAttributeNS(Qe, Ge, Xe) : Y.setAttribute(Ge, Xe), ze(Y) ? Be(Y) : arrayPop(t.removed); + } catch { + } + } + } + Ye("afterSanitizeAttributes", Y, null); + }, Ie = function _e(Y) { + let he = null; + const Ce = at(Y); + for (Ye("beforeSanitizeShadowDOM", Y, null); he = Ce.nextNode(); ) + Ye("uponSanitizeShadowNode", he, null), !Ue(he) && (he.content instanceof o && _e(he.content), nt(he)); + Ye("afterSanitizeShadowDOM", Y, null); + }; + return t.sanitize = function(_e) { + let Y = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, he = null, Ce = null, Re = null, qe = null; + if (te = !_e, te && (_e = ""), typeof _e != "string" && !Ke(_e)) + if (typeof _e.toString == "function") { + if (_e = _e.toString(), typeof _e != "string") + throw typeErrorCreate("dirty is not a string, aborting"); + } else + throw typeErrorCreate("toString is not a function"); + if (!t.isSupported) + return _e; + if (de || Ae(Y), t.removed = [], typeof _e == "string" && (W = !1), W) { + if (_e.nodeName) { + const it = Ee(_e.nodeName); + if (!k[it] || H[it]) + throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place"); + } + } else if (_e instanceof c) + he = je(""), Ce = he.ownerDocument.importNode(_e, !0), Ce.nodeType === NODE_TYPE.element && Ce.nodeName === "BODY" || Ce.nodeName === "HTML" ? he = Ce : he.appendChild(Ce); + else { + if (!ye && !oe && !fe && // eslint-disable-next-line unicorn/prefer-includes + _e.indexOf("<") === -1) + return S && re ? S.createHTML(_e) : _e; + if (he = je(_e), !he) + return ye ? null : re ? E : ""; + } + he && ce && Be(he.firstChild); + const Ge = at(W ? _e : he); + for (; Re = Ge.nextNode(); ) + Ue(Re) || (Re.content instanceof o && Ie(Re.content), nt(Re)); + if (W) + return _e; + if (ye) { + if (ge) + for (qe = P.call(he.ownerDocument); he.firstChild; ) + qe.appendChild(he.firstChild); + else + qe = he; + return (G.shadowroot || G.shadowrootmode) && (qe = M.call(i, qe, !0)), qe; + } + let Qe = fe ? he.outerHTML : he.innerHTML; + return fe && k["!doctype"] && he.ownerDocument && he.ownerDocument.doctype && he.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, he.ownerDocument.doctype.name) && (Qe = " +` + Qe), oe && arrayForEach([L, g, w], (it) => { + Qe = stringReplace(Qe, it, " "); + }), S && re ? S.createHTML(Qe) : Qe; + }, t.setConfig = function() { + let _e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + Ae(_e), de = !0; + }, t.clearConfig = function() { + Ve = null, de = !1; + }, t.isValidAttribute = function(_e, Y, he) { + Ve || Ae({}); + const Ce = Ee(_e), Re = Ee(Y); + return et(Ce, Re, he); + }, t.addHook = function(_e, Y) { + typeof Y == "function" && (R[_e] = R[_e] || [], arrayPush(R[_e], Y)); + }, t.removeHook = function(_e) { + if (R[_e]) + return arrayPop(R[_e]); + }, t.removeHooks = function(_e) { + R[_e] && (R[_e] = []); + }, t.removeAllHooks = function() { + R = {}; + }, t; +} +var purify = createDOMPurify(); +let nextCreditId = 0; +const creditToId = {}; +function Credit(e, t) { + let n; + const i = e; + defined(creditToId[i]) ? n = creditToId[i] : (n = nextCreditId++, creditToId[i] = n), t = defaultValue(t, !1), this._id = n, this._html = e, this._showOnScreen = t, this._element = void 0; +} +Object.defineProperties(Credit.prototype, { + /** + * The credit content + * @memberof Credit.prototype + * @type {string} + * @readonly + */ + html: { + get: function() { + return this._html; + } + }, + /** + * @memberof Credit.prototype + * @type {number} + * @readonly + * + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Whether the credit should be displayed on screen or in a lightbox + * @memberof Credit.prototype + * @type {boolean} + */ + showOnScreen: { + get: function() { + return this._showOnScreen; + }, + set: function(e) { + this._showOnScreen = e; + } + }, + /** + * Gets the credit element + * @memberof Credit.prototype + * @type {HTMLElement} + * @readonly + */ + element: { + get: function() { + if (!defined(this._element)) { + const e = purify.sanitize(this._html), t = document.createElement("div"); + t.className = "cesium-credit-wrapper", t._creditId = this._id, t.style.display = "inline", t.innerHTML = e; + const n = t.querySelectorAll("a"); + for (let i = 0; i < n.length; i++) + n[i].setAttribute("target", "_blank"); + this._element = t; + } + return this._element; + } + } +}); +Credit.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e._id === t._id && e._showOnScreen === t._showOnScreen; +}; +Credit.prototype.equals = function(e) { + return Credit.equals(this, e); +}; +Credit.prototype.isIon = function() { + return this.html.indexOf("ion-credit.png") !== -1; +}; +Credit.getIonCredit = function(e) { + const t = defined(e.collapsible) && !e.collapsible; + return new Credit(e.html, t); +}; +Credit.clone = function(e) { + if (defined(e)) + return new Credit(e.html, e.showOnScreen); +}; +function SpecularEnvironmentCubeMap(e) { + this._url = e, this._cubeMapBuffers = void 0, this._texture = void 0, this._maximumMipmapLevel = void 0, this._loading = !1, this._ready = !1, this._errorEvent = new Event(); +} +Object.defineProperties(SpecularEnvironmentCubeMap.prototype, { + /** + * The url to the KTX2 file containing the specular environment map and convoluted mipmaps. + * @memberof SpecularEnvironmentCubeMap.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._url; + } + }, + /** + * Gets an event that is raised when encountering an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. + * @memberof SpecularEnvironmentCubeMap.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * A texture containing all the packed convolutions. + * @memberof SpecularEnvironmentCubeMap.prototype + * @type {Texture} + * @readonly + */ + texture: { + get: function() { + return this._texture; + } + }, + /** + * The maximum number of mip levels with valid environment map data. + * This may differ from the number of mips in the WebGL cubemap. + * The data loaded at maximumMipmapLevel is suitable for + * PBR rendering of a material with maximum roughness (1.0). + * @memberOf SpecularEnvironmentCubeMap.prototype + * @type {number} + * @readonly + */ + maximumMipmapLevel: { + get: function() { + return this._maximumMipmapLevel; + } + }, + /** + * Determines if the cube map is complete and ready to use. + * @memberof SpecularEnvironmentCubeMap.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + } +}); +SpecularEnvironmentCubeMap.isSupported = function(e) { + return (e.colorBufferHalfFloat && e.halfFloatingPointTexture || e.floatingPointTexture && e.colorBufferFloat) && e.supportsTextureLod; +}; +function cleanupResources(e) { + e._cubeMapBuffers = void 0; +} +SpecularEnvironmentCubeMap.prototype.update = function(e) { + const { context: t } = e; + if (!SpecularEnvironmentCubeMap.isSupported(t)) + return; + if (defined(this._texture)) { + cleanupResources(this); + return; + } + if (!defined(this._texture) && !this._loading) { + const f = t.textureCache.getTexture(this._url); + defined(f) && (cleanupResources(this), this._texture = f, this._maximumMipmapLevel = this._texture.maximumMipmapLevel, this._ready = !0); + } + const n = this._cubeMapBuffers; + if (!defined(n) && !this._loading) { + const f = this; + loadKTX2(this._url).then(function(h) { + f._cubeMapBuffers = h, f._loading = !1; + }).catch(function(h) { + f.isDestroyed() || f._errorEvent.raiseEvent(h); + }), this._loading = !0; + } + if (!defined(this._cubeMapBuffers)) + return; + let { pixelDatatype: i } = n[0].positiveX; + defined(i) || (i = t.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT); + const r = PixelFormat$1.RGBA, o = n.length; + this._maximumMipmapLevel = o - 1; + const s = n[0].positiveX.width, c = Math.log2(s) + 1; + if (o !== c) { + const f = {}; + Object.values(CubeMap.FaceName).forEach((h) => { + f[h] = void 0; + }); + for (let h = o; h < c; h++) + n.push(f); + } + const l = new Sampler({ + minificationFilter: TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR + }), d = new CubeMap({ + context: t, + source: n[0], + flipY: !1, + pixelDatatype: i, + pixelFormat: r, + sampler: l + }); + d.loadMipmaps(n.slice(1)), this._texture = d, this._texture.maximumMipmapLevel = this._maximumMipmapLevel, t.textureCache.addTexture(this._url, this._texture), this._ready = !0; +}; +SpecularEnvironmentCubeMap.prototype.isDestroyed = function() { + return !1; +}; +SpecularEnvironmentCubeMap.prototype.destroy = function() { + return cleanupResources(this), this._texture = this._texture && this._texture.destroy(), destroyObject(this); +}; +function ImageBasedLighting(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defined(e.imageBasedLightingFactor) ? Cartesian2.clone(e.imageBasedLightingFactor) : new Cartesian2(1, 1); + this._imageBasedLightingFactor = t; + const n = defaultValue(e.luminanceAtZenith, 0.2); + this._luminanceAtZenith = n; + const i = e.sphericalHarmonicCoefficients; + this._sphericalHarmonicCoefficients = i, this._specularEnvironmentMaps = e.specularEnvironmentMaps, this._specularEnvironmentCubeMap = void 0, this._specularEnvironmentCubeMapDirty = !0, this._specularEnvironmentMapLoaded = !1, this._previousSpecularEnvironmentMapLoaded = !1, this._useDefaultSpecularMaps = !1, this._useDefaultSphericalHarmonics = !1, this._shouldRegenerateShaders = !1, this._previousFrameNumber = void 0, this._previousImageBasedLightingFactor = Cartesian2.clone( + t + ), this._previousLuminanceAtZenith = n, this._previousSphericalHarmonicCoefficients = i, this._removeErrorListener = void 0; +} +Object.defineProperties(ImageBasedLighting.prototype, { + /** + * Cesium adds lighting from the earth, sky, atmosphere, and star skybox. + * This cartesian is used to scale the final diffuse and specular lighting + * contribution from those sources to the final color. A value of 0.0 will + * disable those light sources. + * + * @memberof ImageBasedLighting.prototype + * + * @type {Cartesian2} + * @default Cartesian2(1.0, 1.0) + */ + imageBasedLightingFactor: { + get: function() { + return this._imageBasedLightingFactor; + }, + set: function(e) { + this._previousImageBasedLightingFactor = Cartesian2.clone( + this._imageBasedLightingFactor, + this._previousImageBasedLightingFactor + ), this._imageBasedLightingFactor = Cartesian2.clone( + e, + this._imageBasedLightingFactor + ); + } + }, + /** + * The sun's luminance at the zenith in kilo candela per meter squared + * to use for this model's procedural environment map. This is used when + * {@link ImageBasedLighting#specularEnvironmentMaps} and {@link ImageBasedLighting#sphericalHarmonicCoefficients} + * are not defined. + * + * @memberof ImageBasedLighting.prototype + * + * @type {number} + * @default 0.2 + */ + luminanceAtZenith: { + get: function() { + return this._luminanceAtZenith; + }, + set: function(e) { + this._previousLuminanceAtZenith = this._luminanceAtZenith, this._luminanceAtZenith = e; + } + }, + /** + * The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. When undefined, a diffuse irradiance + * computed from the atmosphere color is used. + *

+ * There are nine Cartesian3 coefficients. + * The order of the coefficients is: L0,0, L1,-1, L1,0, L1,1, L2,-2, L2,-1, L2,0, L2,1, L2,2 + *

+ * + * These values can be obtained by preprocessing the environment map using the cmgen tool of + * {@link https://github.com/google/filament/releases|Google's Filament project}. + * Be sure to use the --no-mirror option in cmgen. + * + * @memberof ImageBasedLighting.prototype + * + * @type {Cartesian3[]} + * @demo {@link https://sandcastle.cesium.com/index.html?src=Image-Based Lighting.html|Sandcastle Image Based Lighting Demo} + * @see {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf|An Efficient Representation for Irradiance Environment Maps} + */ + sphericalHarmonicCoefficients: { + get: function() { + return this._sphericalHarmonicCoefficients; + }, + set: function(e) { + this._previousSphericalHarmonicCoefficients = this._sphericalHarmonicCoefficients, this._sphericalHarmonicCoefficients = e; + } + }, + /** + * A URL to a KTX2 file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + * + * @memberof ImageBasedLighting.prototype + * @demo {@link https://sandcastle.cesium.com/index.html?src=Image-Based Lighting.html|Sandcastle Image Based Lighting Demo} + * @type {string} + * @see ImageBasedLighting#sphericalHarmonicCoefficients + */ + specularEnvironmentMaps: { + get: function() { + return this._specularEnvironmentMaps; + }, + set: function(e) { + e !== this._specularEnvironmentMaps && (this._specularEnvironmentCubeMapDirty = this._specularEnvironmentCubeMapDirty || e !== this._specularEnvironmentMaps, this._specularEnvironmentMapLoaded = !1), this._specularEnvironmentMaps = e; + } + }, + /** + * Whether or not image-based lighting is enabled. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + enabled: { + get: function() { + return this._imageBasedLightingFactor.x > 0 || this._imageBasedLightingFactor.y > 0; + } + }, + /** + * Whether or not the models that use this lighting should regenerate their shaders, + * based on the properties and resources have changed. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + shouldRegenerateShaders: { + get: function() { + return this._shouldRegenerateShaders; + } + }, + /** + * Whether or not to use the default spherical harmonic coefficients. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + useDefaultSphericalHarmonics: { + get: function() { + return this._useDefaultSphericalHarmonics; + } + }, + /** + * Whether or not the image-based lighting settings use spherical harmonic coefficients. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + useSphericalHarmonicCoefficients: { + get: function() { + return defined(this._sphericalHarmonicCoefficients) || this._useDefaultSphericalHarmonics; + } + }, + /** + * The cube map for the specular environment maps. + * + * @memberof ImageBasedLighting.prototype + * @type {SpecularEnvironmentCubeMap} + * + * @private + */ + specularEnvironmentCubeMap: { + get: function() { + return this._specularEnvironmentCubeMap; + } + }, + /** + * Whether or not to use the default specular environment maps. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + useDefaultSpecularMaps: { + get: function() { + return this._useDefaultSpecularMaps; + } + }, + /** + * Whether or not the image-based lighting settings use specular environment maps. + * + * @memberof ImageBasedLighting.prototype + * @type {boolean} + * + * @private + */ + useSpecularEnvironmentMaps: { + get: function() { + return defined(this._specularEnvironmentCubeMap) && this._specularEnvironmentCubeMap.ready || this._useDefaultSpecularMaps; + } + } +}); +function createSpecularEnvironmentCubeMap(e, t) { + if (SpecularEnvironmentCubeMap.isSupported(t)) { + if (e._specularEnvironmentCubeMap = e._specularEnvironmentCubeMap && e._specularEnvironmentCubeMap.destroy(), defined(e._specularEnvironmentMaps)) { + const n = new SpecularEnvironmentCubeMap( + e._specularEnvironmentMaps + ); + e._specularEnvironmentCubeMap = n, e._removeErrorListener = n.errorEvent.addEventListener( + (i) => { + console.error(`Error loading specularEnvironmentMaps: ${i}`); + } + ); + } + e._shouldRegenerateShaders = !0; + } +} +ImageBasedLighting.prototype.update = function(e) { + if (e.frameNumber === this._previousFrameNumber) + return; + this._previousFrameNumber = e.frameNumber; + const t = e.context; + e.brdfLutGenerator.update(e), this._shouldRegenerateShaders = !1; + const n = this._imageBasedLightingFactor, i = this._previousImageBasedLightingFactor; + Cartesian2.equals(n, i) || (this._shouldRegenerateShaders = n.x > 0 && i.x === 0 || n.x === 0 && i.x > 0, this._shouldRegenerateShaders = this._shouldRegenerateShaders || n.y > 0 && i.y === 0 || n.y === 0 && i.y > 0, this._previousImageBasedLightingFactor = Cartesian2.clone( + this._imageBasedLightingFactor, + this._previousImageBasedLightingFactor + )), this._luminanceAtZenith !== this._previousLuminanceAtZenith && (this._shouldRegenerateShaders = this._shouldRegenerateShaders || defined(this._luminanceAtZenith) !== defined(this._previousLuminanceAtZenith), this._previousLuminanceAtZenith = this._luminanceAtZenith), this._previousSphericalHarmonicCoefficients !== this._sphericalHarmonicCoefficients && (this._shouldRegenerateShaders = this._shouldRegenerateShaders || defined(this._previousSphericalHarmonicCoefficients) !== defined(this._sphericalHarmonicCoefficients), this._previousSphericalHarmonicCoefficients = this._sphericalHarmonicCoefficients), this._shouldRegenerateShaders = this._shouldRegenerateShaders || this._previousSpecularEnvironmentMapLoaded !== this._specularEnvironmentMapLoaded, this._previousSpecularEnvironmentMapLoaded = this._specularEnvironmentMapLoaded, this._specularEnvironmentCubeMapDirty && (createSpecularEnvironmentCubeMap(this, t), this._specularEnvironmentCubeMapDirty = !1), defined(this._specularEnvironmentCubeMap) && (this._specularEnvironmentCubeMap.update(e), this._specularEnvironmentCubeMap.ready && (this._specularEnvironmentMapLoaded = !0)); + const r = !defined(this._specularEnvironmentCubeMap) && defined(e.specularEnvironmentMaps) && !this._useDefaultSpecularMaps, o = !defined(e.specularEnvironmentMaps) && this._useDefaultSpecularMaps, s = !defined(this._sphericalHarmonicCoefficients) && defined(e.sphericalHarmonicCoefficients) && !this._useDefaultSphericalHarmonics, c = !defined(e.sphericalHarmonicCoefficients) && this._useDefaultSphericalHarmonics; + this._shouldRegenerateShaders = this._shouldRegenerateShaders || r || o || s || c, this._useDefaultSpecularMaps = !defined(this._specularEnvironmentCubeMap) && defined(e.specularEnvironmentMaps), this._useDefaultSphericalHarmonics = !defined(this._sphericalHarmonicCoefficients) && defined(e.sphericalHarmonicCoefficients); +}; +ImageBasedLighting.prototype.isDestroyed = function() { + return !1; +}; +ImageBasedLighting.prototype.destroy = function() { + return this._specularEnvironmentCubeMap = this._specularEnvironmentCubeMap && this._specularEnvironmentCubeMap.destroy(), this._removeErrorListener = this._removeErrorListener && this._removeErrorListener(), destroyObject(this); +}; +let defaultTokenCredit$1; +const defaultAccessToken$1 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxMjY5YWQzZS04ZGIyLTRlMjEtYjcwNS1iYmY0NDNmN2E3ZjAiLCJpZCI6MjU5LCJpYXQiOjE3MjUzNzYwMzZ9.L0mzOLcquvnxOpG5DnqWQmivpRCwePDt3WAgzb8VlVA", Ion = {}; +Ion.defaultAccessToken = defaultAccessToken$1; +Ion.defaultServer = new Resource({ url: "https://api.cesium.com/" }); +Ion.getDefaultTokenCredit = function(e) { + if (e === defaultAccessToken$1) { + if (!defined(defaultTokenCredit$1)) { + const t = ` This application is using Cesium's default ion access token. Please assign Cesium.Ion.defaultAccessToken with an access token from your ion account before making any Cesium API calls. You can sign up for a free ion account at
https://cesium.com.`; + defaultTokenCredit$1 = new Credit(t, !0); + } + return defaultTokenCredit$1; + } +}; +function IonResource(e, t) { + let n; + const i = e.externalType, r = defined(i); + if (!r) + n = { + url: e.url, + retryAttempts: 1, + retryCallback + }; + else if (i === "3DTILES" || i === "STK_TERRAIN_SERVER") + n = { url: e.options.url }; + else + throw new RuntimeError( + "Ion.createResource does not support external imagery assets; use IonImageryProvider instead." + ); + Resource.call(this, n), this._ionEndpoint = e, this._ionEndpointDomain = r ? void 0 : new Uri(e.url).authority(), this._ionEndpointResource = t, this._ionRoot = void 0, this._pendingPromise = void 0, this._credits = void 0, this._isExternal = r; +} +defined(Object.create) && (IonResource.prototype = Object.create(Resource.prototype), IonResource.prototype.constructor = IonResource); +IonResource.fromAssetId = function(e, t) { + const n = IonResource._createEndpointResource( + e, + t + ); + return n.fetchJson().then(function(i) { + return new IonResource(i, n); + }); +}; +Object.defineProperties(IonResource.prototype, { + /** + * Gets the credits required for attribution of the asset. + * + * @memberof IonResource.prototype + * @type {Credit[]} + * @readonly + */ + credits: { + get: function() { + return defined(this._ionRoot) ? this._ionRoot.credits : defined(this._credits) ? this._credits : (this._credits = IonResource.getCreditsFromEndpoint( + this._ionEndpoint, + this._ionEndpointResource + ), this._credits); + } + } +}); +IonResource.getCreditsFromEndpoint = function(e, t) { + const n = e.attributions.map(Credit.getIonCredit), i = Ion.getDefaultTokenCredit( + t.queryParameters.access_token + ); + return defined(i) && n.push(Credit.clone(i)), n; +}; +IonResource.prototype.clone = function(e) { + const t = defaultValue(this._ionRoot, this); + return defined(e) || (e = new IonResource( + t._ionEndpoint, + t._ionEndpointResource + )), e = Resource.prototype.clone.call(this, e), e._ionRoot = t, e._isExternal = this._isExternal, e; +}; +IonResource.prototype.fetchImage = function(e) { + if (!this._isExternal) { + const t = e; + e = { + preferBlob: !0 + }, defined(t) && (e.flipY = t.flipY, e.preferImageBitmap = t.preferImageBitmap); + } + return Resource.prototype.fetchImage.call(this, e); +}; +IonResource.prototype._makeRequest = function(e) { + return this._isExternal || new Uri(this.url).authority() !== this._ionEndpointDomain ? Resource.prototype._makeRequest.call(this, e) : (defined(e.headers) || (e.headers = {}), e.headers.Authorization = `Bearer ${this._ionEndpoint.accessToken}`, e.headers["X-Cesium-Client"] = "CesiumJS", typeof CESIUM_VERSION < "u" && (e.headers["X-Cesium-Client-Version"] = CESIUM_VERSION), Resource.prototype._makeRequest.call(this, e)); +}; +IonResource._createEndpointResource = function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + let n = defaultValue(t.server, Ion.defaultServer); + const i = defaultValue(t.accessToken, Ion.defaultAccessToken); + n = Resource.createIfNeeded(n); + const r = { + url: `v1/assets/${e}/endpoint` + }; + return defined(i) && (r.queryParameters = { access_token: i }), n.getDerivedResource(r); +}; +function retryCallback(e, t) { + const n = defaultValue(e._ionRoot, e), i = n._ionEndpointResource, r = typeof Image < "u"; + return !defined(t) || t.statusCode !== 401 && !(r && t.target instanceof Image) ? Promise.resolve(!1) : (defined(n._pendingPromise) || (n._pendingPromise = i.fetchJson().then(function(o) { + return n._ionEndpoint = o, o; + }).finally(function(o) { + return n._pendingPromise = void 0, o; + })), n._pendingPromise.then(function(o) { + return e._ionEndpoint = o, !0; + })); +} +function ManagedArray(e) { + e = defaultValue(e, 0), this._array = new Array(e), this._length = e; +} +Object.defineProperties(ManagedArray.prototype, { + /** + * Gets or sets the length of the array. + * If the set length is greater than the length of the internal array, the internal array is resized. + * + * @memberof ManagedArray.prototype + * @type {number} + */ + length: { + get: function() { + return this._length; + }, + set: function(e) { + const t = this._array, n = this._length; + if (e < n) + for (let i = e; i < n; ++i) + t[i] = void 0; + else e > t.length && (t.length = e); + this._length = e; + } + }, + /** + * Gets the internal array. + * + * @memberof ManagedArray.prototype + * @type {Array} + * @readonly + */ + values: { + get: function() { + return this._array; + } + } +}); +ManagedArray.prototype.get = function(e) { + return this._array[e]; +}; +ManagedArray.prototype.set = function(e, t) { + e >= this._length && (this.length = e + 1), this._array[e] = t; +}; +ManagedArray.prototype.peek = function() { + return this._array[this._length - 1]; +}; +ManagedArray.prototype.push = function(e) { + const t = this.length++; + this._array[t] = e; +}; +ManagedArray.prototype.pop = function() { + if (this._length === 0) + return; + const e = this._array[this._length - 1]; + return --this.length, e; +}; +ManagedArray.prototype.reserve = function(e) { + e > this._array.length && (this._array.length = e); +}; +ManagedArray.prototype.resize = function(e) { + this.length = e; +}; +ManagedArray.prototype.trim = function(e) { + e = defaultValue(e, this._length), this._array.length = e; +}; +const Axis = { + /** + * Denotes the x-axis. + * + * @type {number} + * @constant + */ + X: 0, + /** + * Denotes the y-axis. + * + * @type {number} + * @constant + */ + Y: 1, + /** + * Denotes the z-axis. + * + * @type {number} + * @constant + */ + Z: 2 +}; +Axis.Y_UP_TO_Z_UP = Matrix4.fromRotationTranslation( + // Rotation about PI/2 around the X-axis + Matrix3.fromArray([1, 0, 0, 0, 0, 1, 0, -1, 0]) +); +Axis.Z_UP_TO_Y_UP = Matrix4.fromRotationTranslation( + // Rotation about -PI/2 around the X-axis + Matrix3.fromArray([1, 0, 0, 0, 0, -1, 0, 1, 0]) +); +Axis.X_UP_TO_Z_UP = Matrix4.fromRotationTranslation( + // Rotation about -PI/2 around the Y-axis + Matrix3.fromArray([0, 0, 1, 0, 1, 0, -1, 0, 0]) +); +Axis.Z_UP_TO_X_UP = Matrix4.fromRotationTranslation( + // Rotation about PI/2 around the Y-axis + Matrix3.fromArray([0, 0, -1, 0, 1, 0, 1, 0, 0]) +); +Axis.X_UP_TO_Y_UP = Matrix4.fromRotationTranslation( + // Rotation about PI/2 around the Z-axis + Matrix3.fromArray([0, 1, 0, -1, 0, 0, 0, 0, 1]) +); +Axis.Y_UP_TO_X_UP = Matrix4.fromRotationTranslation( + // Rotation about -PI/2 around the Z-axis + Matrix3.fromArray([0, -1, 0, 1, 0, 0, 0, 0, 1]) +); +Axis.fromName = function(e) { + return Axis[e]; +}; +const Axis$1 = Object.freeze(Axis); +function Cesium3DContentGroup(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._metadata = e.metadata; +} +Object.defineProperties(Cesium3DContentGroup.prototype, { + /** + * Get the metadata for this group + * + * @memberof Cesium3DContentGroup.prototype + * + * @type {GroupMetadata} + * + * @readonly + */ + metadata: { + get: function() { + return this._metadata; + } + } +}); +function getStringFromTypedArray(e, t, n) { + return t = defaultValue(t, 0), n = defaultValue(n, e.byteLength - t), e = e.subarray(t, t + n), getStringFromTypedArray.decode(e); +} +getStringFromTypedArray.decodeWithTextDecoder = function(e) { + return new TextDecoder("utf-8").decode(e); +}; +getStringFromTypedArray.decodeWithFromCharCode = function(e) { + let t = ""; + const n = utf8Handler(e), i = n.length; + for (let r = 0; r < i; ++r) { + let o = n[r]; + o <= 65535 ? t += String.fromCharCode(o) : (o -= 65536, t += String.fromCharCode((o >> 10) + 55296, (o & 1023) + 56320)); + } + return t; +}; +function inRange(e, t, n) { + return t <= e && e <= n; +} +function utf8Handler(e) { + let t = 0, n = 0, i = 0, r = 128, o = 191; + const s = [], c = e.length; + for (let l = 0; l < c; ++l) { + const d = e[l]; + if (i === 0) { + if (inRange(d, 0, 127)) { + s.push(d); + continue; + } + if (inRange(d, 194, 223)) { + i = 1, t = d & 31; + continue; + } + if (inRange(d, 224, 239)) { + d === 224 && (r = 160), d === 237 && (o = 159), i = 2, t = d & 15; + continue; + } + if (inRange(d, 240, 244)) { + d === 240 && (r = 144), d === 244 && (o = 143), i = 3, t = d & 7; + continue; + } + throw new RuntimeError("String decoding failed."); + } + if (!inRange(d, r, o)) { + t = i = n = 0, r = 128, o = 191, --l; + continue; + } + r = 128, o = 191, t = t << 6 | d & 63, ++n, n === i && (s.push(t), t = i = n = 0); + } + return s; +} +typeof TextDecoder < "u" ? getStringFromTypedArray.decode = getStringFromTypedArray.decodeWithTextDecoder : getStringFromTypedArray.decode = getStringFromTypedArray.decodeWithFromCharCode; +function getMagic(e, t) { + return t = defaultValue(t, 0), getStringFromTypedArray( + e, + t, + Math.min(4, e.length) + ); +} +function Composite3DTileContent(e, t, n, i) { + this._tileset = e, this._tile = t, this._resource = n, defined(i) || (i = []), this._contents = i, this._metadata = void 0, this._group = void 0, this._ready = !1; +} +Object.defineProperties(Composite3DTileContent.prototype, { + featurePropertiesDirty: { + get: function() { + const e = this._contents, t = e.length; + for (let n = 0; n < t; ++n) + if (e[n].featurePropertiesDirty) + return !0; + return !1; + }, + set: function(e) { + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].featurePropertiesDirty = e; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call featuresLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + featuresLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call pointsLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + pointsLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call trianglesLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + trianglesLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call geometryByteLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + geometryByteLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call texturesByteLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + texturesByteLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns 0. Instead call batchTableByteLength for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + batchTableByteLength: { + get: function() { + return 0; + } + }, + innerContents: { + get: function() { + return this._contents; + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Composite3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._resource.getUrlComponent(!0); + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * both stores the content metadata and propagates the content metadata to all of its children. + * @memberof Composite3DTileContent.prototype + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + metadata: { + get: function() { + return this._metadata; + }, + set: function(e) { + this._metadata = e; + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].metadata = e; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns undefined. Instead call batchTable for a tile in the composite. + * @memberof Composite3DTileContent.prototype + */ + batchTable: { + get: function() { + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * both stores the group metadata and propagates the group metadata to all of its children. + * @memberof Composite3DTileContent.prototype + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].group = e; + } + } +}); +const sizeOfUint32$7 = Uint32Array.BYTES_PER_ELEMENT; +Composite3DTileContent.fromTileType = async function(e, t, n, i, r, o) { + r = defaultValue(r, 0); + const s = new Uint8Array(i), c = new DataView(i); + r += sizeOfUint32$7; + const l = c.getUint32(r, !0); + if (l !== 1) + throw new RuntimeError( + `Only Composite Tile version 1 is supported. Version ${l} is not.` + ); + r += sizeOfUint32$7, r += sizeOfUint32$7; + const d = c.getUint32(r, !0); + r += sizeOfUint32$7; + let f = n.queryParameters.compositeIndex; + defined(f) ? f = `${f}_` : f = ""; + const h = []; + h.length = d; + for (let _ = 0; _ < d; ++_) { + const y = getMagic(s, r), C = c.getUint32(r + sizeOfUint32$7 * 2, !0), T = o[y], x = `${f}${_}`, b = n.getDerivedResource({ + queryParameters: { + compositeIndex: x + } + }); + if (defined(T)) + h[_] = Promise.resolve( + T(e, t, b, i, r) + ); + else + throw new RuntimeError( + `Unknown tile content type, ${y}, inside Composite tile` + ); + r += C; + } + const p = await Promise.all(h); + return new Composite3DTileContent( + e, + t, + n, + p + ); +}; +Composite3DTileContent.prototype.hasProperty = function(e, t) { + return !1; +}; +Composite3DTileContent.prototype.getFeature = function(e) { +}; +Composite3DTileContent.prototype.applyDebugSettings = function(e, t) { + const n = this._contents, i = n.length; + for (let r = 0; r < i; ++r) + n[r].applyDebugSettings(e, t); +}; +Composite3DTileContent.prototype.applyStyle = function(e) { + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].applyStyle(e); +}; +Composite3DTileContent.prototype.update = function(e, t) { + const n = this._contents, i = n.length; + let r = !0; + for (let o = 0; o < i; ++o) + n[o].update(e, t), r = r && n[o].ready; + !this._ready && r && (this._ready = !0); +}; +Composite3DTileContent.prototype.pick = function(e, t, n) { + if (!this._ready) + return; + let i, r = Number.POSITIVE_INFINITY; + const o = this._contents, s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c].pick(e, t, n); + if (!defined(l)) + continue; + const d = Cartesian3.distance(e.origin, l); + d < r && (i = l, r = d); + } + if (defined(i)) + return n; +}; +Composite3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Composite3DTileContent.prototype.destroy = function() { + const e = this._contents, t = e.length; + for (let n = 0; n < t; ++n) + e[n].destroy(); + return destroyObject(this); +}; +function getJsonFromTypedArray(e, t, n) { + return JSON.parse( + getStringFromTypedArray(e, t, n) + ); +} +function BatchTexture(e) { + this._id = createGuid(); + const t = e.featuresLength; + this._showAlphaProperties = void 0, this._batchValues = void 0, this._batchValuesDirty = !1, this._batchTexture = void 0, this._defaultTexture = void 0, this._pickTexture = void 0, this._pickIds = []; + let n, i; + if (t > 0) { + const r = Math.min(t, ContextLimits.maximumTextureSize), o = Math.ceil(t / ContextLimits.maximumTextureSize), s = 1 / r, c = s * 0.5, l = 1 / o, d = l * 0.5; + n = new Cartesian2(r, o), i = new Cartesian4(s, c, l, d); + } + this._translucentFeaturesLength = 0, this._featuresLength = t, this._textureDimensions = n, this._textureStep = i, this._owner = e.owner, this._statistics = e.statistics, this._colorChangedCallback = e.colorChangedCallback; +} +Object.defineProperties(BatchTexture.prototype, { + /** + * Number of features that are translucent + * + * @memberof BatchTexture.prototype + * @type {number} + * @readonly + * @private + */ + translucentFeaturesLength: { + get: function() { + return this._translucentFeaturesLength; + } + }, + /** + * Total size of all GPU resources used by this batch texture. + * + * @memberof BatchTexture.prototype + * @type {number} + * @readonly + * @private + */ + byteLength: { + get: function() { + let e = 0; + return defined(this._pickTexture) && (e += this._pickTexture.sizeInBytes), defined(this._batchTexture) && (e += this._batchTexture.sizeInBytes), e; + } + }, + /** + * Dimensions of the underlying batch texture. + * + * @memberof BatchTexture.prototype + * @type {Cartesian2} + * @readonly + * @private + */ + textureDimensions: { + get: function() { + return this._textureDimensions; + } + }, + /** + * Size of each texture and distance from side to center of a texel in + * each direction. Stored as (stepX, centerX, stepY, centerY) + * + * @memberof BatchTexture.prototype + * @type {Cartesian4} + * @readonly + * @private + */ + textureStep: { + get: function() { + return this._textureStep; + } + }, + /** + * The underlying texture used for styling. The texels are accessed + * by batch ID, and the value is the color of this feature after accounting + * for show/hide settings. + * + * @memberof BatchTexture.prototype + * @type {Texture} + * @readonly + * @private + */ + batchTexture: { + get: function() { + return this._batchTexture; + } + }, + /** + * The default texture to use when there are no batch values + * + * @memberof BatchTexture.prototype + * @type {Texture} + * @readonly + * @private + */ + defaultTexture: { + get: function() { + return this._defaultTexture; + } + }, + /** + * The underlying texture used for picking. The texels are accessed by + * batch ID, and the value is the pick color. + * + * @memberof BatchTexture.prototype + * @type {Texture} + * @readonly + * @private + */ + pickTexture: { + get: function() { + return this._pickTexture; + } + } +}); +BatchTexture.DEFAULT_COLOR_VALUE = Color.WHITE; +BatchTexture.DEFAULT_SHOW_VALUE = !0; +function getByteLength(e) { + const t = e._textureDimensions; + return t.x * t.y * 4; +} +function getBatchValues(e) { + if (!defined(e._batchValues)) { + const t = getByteLength(e), n = new Uint8Array(t).fill(255); + e._batchValues = n; + } + return e._batchValues; +} +function getShowAlphaProperties(e) { + if (!defined(e._showAlphaProperties)) { + const t = 2 * e._featuresLength, n = new Uint8Array(t).fill(255); + e._showAlphaProperties = n; + } + return e._showAlphaProperties; +} +BatchTexture.prototype.setShow = function(e, t) { + if (t && !defined(this._showAlphaProperties)) + return; + const n = getShowAlphaProperties(this), i = e * 2, r = t ? 255 : 0; + if (n[i] !== r) { + n[i] = r; + const o = getBatchValues(this), s = e * 4 + 3; + o[s] = t ? n[i + 1] : 0, this._batchValuesDirty = !0; + } +}; +BatchTexture.prototype.setAllShow = function(e) { + const t = this._featuresLength; + for (let n = 0; n < t; ++n) + this.setShow(n, e); +}; +BatchTexture.prototype.getShow = function(e) { + if (!defined(this._showAlphaProperties)) + return !0; + const t = e * 2; + return this._showAlphaProperties[t] === 255; +}; +const scratchColorBytes$1 = new Array(4); +BatchTexture.prototype.setColor = function(e, t) { + if (Color.equals(t, BatchTexture.DEFAULT_COLOR_VALUE) && !defined(this._batchValues)) + return; + const n = t.toBytes(scratchColorBytes$1), i = n[3], r = getBatchValues(this), o = e * 4, s = getShowAlphaProperties(this), c = e * 2; + if (r[o] !== n[0] || r[o + 1] !== n[1] || r[o + 2] !== n[2] || s[c + 1] !== i) { + r[o] = n[0], r[o + 1] = n[1], r[o + 2] = n[2]; + const l = s[c + 1] !== 255, d = s[c] !== 0; + r[o + 3] = d ? i : 0, s[c + 1] = i; + const f = i !== 255; + f && !l ? ++this._translucentFeaturesLength : !f && l && --this._translucentFeaturesLength, this._batchValuesDirty = !0, defined(this._colorChangedCallback) && this._colorChangedCallback(e, t); + } +}; +BatchTexture.prototype.setAllColor = function(e) { + const t = this._featuresLength; + for (let n = 0; n < t; ++n) + this.setColor(n, e); +}; +BatchTexture.prototype.getColor = function(e, t) { + if (!defined(this._batchValues)) + return Color.clone(BatchTexture.DEFAULT_COLOR_VALUE, t); + const n = this._batchValues, i = e * 4, r = this._showAlphaProperties, o = e * 2; + return Color.fromBytes( + n[i], + n[i + 1], + n[i + 2], + r[o + 1], + t + ); +}; +BatchTexture.prototype.getPickColor = function(e) { + return this._pickIds[e]; +}; +function createTexture$2(e, t, n) { + const i = e._textureDimensions; + return new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + width: i.x, + height: i.y, + arrayBufferView: n + }, + flipY: !1, + sampler: Sampler.NEAREST + }); +} +function createPickTexture(e, t) { + const n = e._featuresLength; + if (!defined(e._pickTexture) && n > 0) { + const i = e._pickIds, r = getByteLength(e), o = new Uint8Array(r), s = e._owner, c = e._statistics; + for (let l = 0; l < n; ++l) { + const d = t.createPickId(s.getFeature(l)); + i.push(d); + const f = d.color, h = l * 4; + o[h] = Color.floatToByte(f.red), o[h + 1] = Color.floatToByte(f.green), o[h + 2] = Color.floatToByte(f.blue), o[h + 3] = Color.floatToByte(f.alpha); + } + e._pickTexture = createTexture$2(e, t, o), defined(c) && (c.batchTableByteLength += e._pickTexture.sizeInBytes); + } +} +function updateBatchTexture(e) { + const t = e._textureDimensions; + e._batchTexture.copyFrom({ + source: { + width: t.x, + height: t.y, + arrayBufferView: e._batchValues + } + }); +} +BatchTexture.prototype.update = function(e, t) { + const n = t.context; + this._defaultTexture = n.defaultTexture; + const i = t.passes; + (i.pick || i.postProcess) && createPickTexture(this, n), this._batchValuesDirty && (this._batchValuesDirty = !1, defined(this._batchTexture) || (this._batchTexture = createTexture$2(this, n, this._batchValues), defined(this._statistics) && (this._statistics.batchTableByteLength += this._batchTexture.sizeInBytes)), updateBatchTexture(this)); +}; +BatchTexture.prototype.isDestroyed = function() { + return !1; +}; +BatchTexture.prototype.destroy = function() { + this._batchTexture = this._batchTexture && this._batchTexture.destroy(), this._pickTexture = this._pickTexture && this._pickTexture.destroy(); + const e = this._pickIds, t = e.length; + for (let n = 0; n < t; ++n) + e[n].destroy(); + return destroyObject(this); +}; +const ComponentsPerAttribute = { + SCALAR: 1, + VEC2: 2, + VEC3: 3, + VEC4: 4, + MAT2: 4, + MAT3: 9, + MAT4: 16 +}, ClassPerType = { + SCALAR: void 0, + VEC2: Cartesian2, + VEC3: Cartesian3, + VEC4: Cartesian4, + MAT2: Matrix2, + MAT3: Matrix3, + MAT4: Matrix4 +}; +function getBinaryAccessor(e) { + const t = e.componentType; + let n; + typeof t == "string" ? n = ComponentDatatype$1.fromName(t) : n = t; + const i = ComponentsPerAttribute[e.type], r = ClassPerType[e.type]; + return { + componentsPerAttribute: i, + classType: r, + createArrayBufferView: function(o, s, c) { + return ComponentDatatype$1.createArrayBufferView( + n, + o, + s, + i * c + ); + } + }; +} +function BatchTableHierarchy(e) { + this._classes = void 0, this._classIds = void 0, this._classIndexes = void 0, this._parentCounts = void 0, this._parentIndexes = void 0, this._parentIds = void 0, this._byteLength = 0, initialize$f(this, e.extension, e.binaryBody); +} +Object.defineProperties(BatchTableHierarchy.prototype, { + byteLength: { + get: function() { + return this._byteLength; + } + } +}); +function initialize$f(e, t, n) { + let i, r, o; + const s = t.instancesLength, c = t.classes; + let l = t.classIds, d = t.parentCounts, f = t.parentIds, h = s, p = 0; + defined(l.byteOffset) && (l.componentType = defaultValue( + l.componentType, + ComponentDatatype$1.UNSIGNED_SHORT + ), l.type = AttributeType$1.SCALAR, o = getBinaryAccessor(l), l = o.createArrayBufferView( + n.buffer, + n.byteOffset + l.byteOffset, + s + ), p += l.byteLength); + let m; + if (defined(d)) { + for (defined(d.byteOffset) && (d.componentType = defaultValue( + d.componentType, + ComponentDatatype$1.UNSIGNED_SHORT + ), d.type = AttributeType$1.SCALAR, o = getBinaryAccessor(d), d = o.createArrayBufferView( + n.buffer, + n.byteOffset + d.byteOffset, + s + ), p += d.byteLength), m = new Uint16Array(s), h = 0, i = 0; i < s; ++i) + m[i] = h, h += d[i]; + p += m.byteLength; + } + defined(f) && defined(f.byteOffset) && (f.componentType = defaultValue( + f.componentType, + ComponentDatatype$1.UNSIGNED_SHORT + ), f.type = AttributeType$1.SCALAR, o = getBinaryAccessor(f), f = o.createArrayBufferView( + n.buffer, + n.byteOffset + f.byteOffset, + h + ), p += f.byteLength); + const _ = c.length; + for (i = 0; i < _; ++i) { + const T = c[i].length, x = c[i].instances, b = getBinaryProperties$1( + T, + x, + n + ); + p += countBinaryPropertyMemory$1(b), c[i].instances = combine$2(b, x); + } + const y = new Array(_).fill(0), C = new Uint16Array(s); + for (i = 0; i < s; ++i) + r = l[i], C[i] = y[r], ++y[r]; + p += C.byteLength, e._classes = c, e._classIds = l, e._classIndexes = C, e._parentCounts = d, e._parentIndexes = m, e._parentIds = f, e._byteLength = p; +} +function getBinaryProperties$1(e, t, n) { + let i; + for (const r in t) + if (t.hasOwnProperty(r)) { + const o = t[r], s = o.byteOffset; + if (defined(s)) { + const c = o.componentType, l = o.type; + if (!defined(c)) + throw new RuntimeError("componentType is required."); + if (!defined(l)) + throw new RuntimeError("type is required."); + if (!defined(n)) + throw new RuntimeError( + `Property ${r} requires a batch table binary.` + ); + const d = getBinaryAccessor(o), f = d.componentsPerAttribute, h = d.classType, p = d.createArrayBufferView( + n.buffer, + n.byteOffset + s, + e + ); + defined(i) || (i = {}), i[r] = { + typedArray: p, + componentCount: f, + type: h + }; + } + } + return i; +} +function countBinaryPropertyMemory$1(e) { + let t = 0; + for (const n in e) + e.hasOwnProperty(n) && (t += e[n].typedArray.byteLength); + return t; +} +const scratchVisited = [], scratchStack$1 = []; +let marker = 0; +function traverseHierarchyMultipleParents(e, t, n) { + const i = e._classIds, r = e._parentCounts, o = e._parentIds, s = e._parentIndexes, c = i.length, l = scratchVisited; + l.length = Math.max(l.length, c); + const d = ++marker, f = scratchStack$1; + for (f.length = 0, f.push(t); f.length > 0; ) { + if (t = f.pop(), l[t] === d) + continue; + l[t] = d; + const h = n(e, t); + if (defined(h)) + return h; + const p = r[t], m = s[t]; + for (let _ = 0; _ < p; ++_) { + const y = o[m + _]; + y !== t && f.push(y); + } + } +} +function traverseHierarchySingleParent(e, t, n) { + let i = !0; + for (; i; ) { + const r = n(e, t); + if (defined(r)) + return r; + const o = e._parentIds[t]; + i = o !== t, t = o; + } +} +function traverseHierarchy(e, t, n) { + const i = e._parentCounts, r = e._parentIds; + if (defined(r)) { + if (defined(i)) + return traverseHierarchyMultipleParents( + e, + t, + n + ); + } else return n(e, t); + return traverseHierarchySingleParent( + e, + t, + n + ); +} +BatchTableHierarchy.prototype.hasProperty = function(e, t) { + const n = traverseHierarchy(this, e, function(i, r) { + const o = i._classIds[r], s = i._classes[o].instances; + if (defined(s[t])) + return !0; + }); + return defined(n); +}; +BatchTableHierarchy.prototype.propertyExists = function(e) { + const t = this._classes, n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i].instances; + if (defined(r[e])) + return !0; + } + return !1; +}; +BatchTableHierarchy.prototype.getPropertyIds = function(e, t) { + return t = defined(t) ? t : [], t.length = 0, traverseHierarchy(this, e, function(n, i) { + const r = n._classIds[i], o = n._classes[r].instances; + for (const s in o) + o.hasOwnProperty(s) && t.indexOf(s) === -1 && t.push(s); + }), t; +}; +BatchTableHierarchy.prototype.getProperty = function(e, t) { + return traverseHierarchy(this, e, function(n, i) { + const r = n._classIds[i], o = n._classes[r], s = n._classIndexes[i], c = o.instances[t]; + if (defined(c)) + return defined(c.typedArray) ? getBinaryProperty$1(c, s) : clone$1(c[s], !0); + }); +}; +function getBinaryProperty$1(e, t) { + const n = e.typedArray, i = e.componentCount; + return i === 1 ? n[t] : e.type.unpack(n, t * i); +} +BatchTableHierarchy.prototype.setProperty = function(e, t, n) { + const i = traverseHierarchy(this, e, function(r, o) { + const s = r._classIds[o], c = r._classes[s], l = r._classIndexes[o], d = c.instances[t]; + if (defined(d)) + return defined(d.typedArray) ? setBinaryProperty$1(d, l, n) : d[l] = clone$1(n, !0), !0; + }); + return defined(i); +}; +function setBinaryProperty$1(e, t, n) { + const i = e.typedArray, r = e.componentCount; + r === 1 ? i[t] = n : e.type.pack(n, i, t * r); +} +BatchTableHierarchy.prototype.isClass = function(e, t) { + const n = traverseHierarchy(this, e, function(i, r) { + const o = i._classIds[r]; + if (i._classes[o].name === t) + return !0; + }); + return defined(n); +}; +BatchTableHierarchy.prototype.getClassName = function(e) { + const t = this._classIds[e]; + return this._classes[t].name; +}; +const Cesium3DTileColorBlendMode = { + /** + * Multiplies the source color by the feature color. + * + * @type {number} + * @constant + */ + HIGHLIGHT: 0, + /** + * Replaces the source color with the feature color. + * + * @type {number} + * @constant + */ + REPLACE: 1, + /** + * Blends the source color and feature color together. + * + * @type {number} + * @constant + */ + MIX: 2 +}, Cesium3DTileColorBlendMode$1 = Object.freeze(Cesium3DTileColorBlendMode), DEFAULT_COLOR_VALUE$3 = BatchTexture.DEFAULT_COLOR_VALUE, DEFAULT_SHOW_VALUE$3 = BatchTexture.DEFAULT_SHOW_VALUE; +function Cesium3DTileBatchTable(e, t, n, i, r) { + this.featuresLength = t; + let o; + defined(n) && (o = n.extensions), this._extensions = defaultValue(o, {}); + const s = initializeProperties(n); + this._properties = s, this._batchTableHierarchy = initializeHierarchy( + this, + n, + i + ); + const c = getBinaryProperties( + t, + s, + i + ); + this._binaryPropertiesByteLength = countBinaryPropertyMemory( + c + ), this._batchTableBinaryProperties = c, this._content = e, this._batchTexture = new BatchTexture({ + featuresLength: t, + colorChangedCallback: r, + owner: e, + statistics: e.tileset.statistics + }); +} +Cesium3DTileBatchTable._deprecationWarning = deprecationWarning; +Object.defineProperties(Cesium3DTileBatchTable.prototype, { + /** + * Size of the batch table, including the batch table hierarchy's binary + * buffers and any binary properties. JSON data is not counted. + * + * @memberof Cesium3DTileBatchTable.prototype + * @type {number} + * @readonly + * @private + */ + batchTableByteLength: { + get: function() { + let e = this._binaryPropertiesByteLength; + return defined(this._batchTableHierarchy) && (e += this._batchTableHierarchy.byteLength), e += this._batchTexture.byteLength, e; + } + } +}); +function initializeProperties(e) { + const t = {}; + if (!defined(e)) + return t; + for (const n in e) + e.hasOwnProperty(n) && n !== "HIERARCHY" && // Deprecated HIERARCHY property + n !== "extensions" && n !== "extras" && (t[n] = clone$1(e[n], !0)); + return t; +} +function initializeHierarchy(e, t, n) { + if (!defined(t)) + return; + let i = e._extensions["3DTILES_batch_table_hierarchy"]; + const r = t.HIERARCHY; + if (defined(r) && (Cesium3DTileBatchTable._deprecationWarning( + "batchTableHierarchyExtension", + "The batch table HIERARCHY property has been moved to an extension. Use extensions.3DTILES_batch_table_hierarchy instead." + ), e._extensions["3DTILES_batch_table_hierarchy"] = r, i = r), !!defined(i)) + return new BatchTableHierarchy({ + extension: i, + binaryBody: n + }); +} +function getBinaryProperties(e, t, n) { + let i; + for (const r in t) + if (t.hasOwnProperty(r)) { + const o = t[r], s = o.byteOffset; + if (defined(s)) { + const c = o.componentType, l = o.type; + if (!defined(c)) + throw new RuntimeError("componentType is required."); + if (!defined(l)) + throw new RuntimeError("type is required."); + if (!defined(n)) + throw new RuntimeError( + `Property ${r} requires a batch table binary.` + ); + const d = getBinaryAccessor(o), f = d.componentsPerAttribute, h = d.classType, p = d.createArrayBufferView( + n.buffer, + n.byteOffset + s, + e + ); + defined(i) || (i = {}), i[r] = { + typedArray: p, + componentCount: f, + type: h + }; + } + } + return i; +} +function countBinaryPropertyMemory(e) { + if (!defined(e)) + return 0; + let t = 0; + for (const n in e) + e.hasOwnProperty(n) && (t += e[n].typedArray.byteLength); + return t; +} +Cesium3DTileBatchTable.getBinaryProperties = function(e, t, n) { + return getBinaryProperties(e, t, n); +}; +Cesium3DTileBatchTable.prototype.setShow = function(e, t) { + this._batchTexture.setShow(e, t); +}; +Cesium3DTileBatchTable.prototype.setAllShow = function(e) { + this._batchTexture.setAllShow(e); +}; +Cesium3DTileBatchTable.prototype.getShow = function(e) { + return this._batchTexture.getShow(e); +}; +Cesium3DTileBatchTable.prototype.setColor = function(e, t) { + this._batchTexture.setColor(e, t); +}; +Cesium3DTileBatchTable.prototype.setAllColor = function(e) { + this._batchTexture.setAllColor(e); +}; +Cesium3DTileBatchTable.prototype.getColor = function(e, t) { + return this._batchTexture.getColor(e, t); +}; +Cesium3DTileBatchTable.prototype.getPickColor = function(e) { + return this._batchTexture.getPickColor(e); +}; +const scratchColor$o = new Color(); +Cesium3DTileBatchTable.prototype.applyStyle = function(e) { + if (!defined(e)) { + this.setAllColor(DEFAULT_COLOR_VALUE$3), this.setAllShow(DEFAULT_SHOW_VALUE$3); + return; + } + const t = this._content, n = this.featuresLength; + for (let i = 0; i < n; ++i) { + const r = t.getFeature(i), o = defined(e.color) ? defaultValue( + e.color.evaluateColor(r, scratchColor$o), + DEFAULT_COLOR_VALUE$3 + ) : DEFAULT_COLOR_VALUE$3, s = defined(e.show) ? defaultValue(e.show.evaluate(r), DEFAULT_SHOW_VALUE$3) : DEFAULT_SHOW_VALUE$3; + this.setColor(i, o), this.setShow(i, s); + } +}; +function getBinaryProperty(e, t) { + const n = e.typedArray, i = e.componentCount; + return i === 1 ? n[t] : e.type.unpack(n, t * i); +} +function setBinaryProperty(e, t, n) { + const i = e.typedArray, r = e.componentCount; + r === 1 ? i[t] = n : e.type.pack(n, i, t * r); +} +Cesium3DTileBatchTable.prototype.isClass = function(e, t) { + const n = this._batchTableHierarchy; + return defined(n) ? n.isClass(e, t) : !1; +}; +Cesium3DTileBatchTable.prototype.isExactClass = function(e, t) { + return this.getExactClassName(e) === t; +}; +Cesium3DTileBatchTable.prototype.getExactClassName = function(e) { + const t = this._batchTableHierarchy; + if (defined(t)) + return t.getClassName(e); +}; +Cesium3DTileBatchTable.prototype.hasProperty = function(e, t) { + return defined(this._properties[t]) || defined(this._batchTableHierarchy) && this._batchTableHierarchy.hasProperty(e, t); +}; +Cesium3DTileBatchTable.prototype.hasPropertyBySemantic = function() { + return !1; +}; +Cesium3DTileBatchTable.prototype.getPropertyIds = function(e, t) { + t = defined(t) ? t : [], t.length = 0; + const n = Object.keys(this._properties); + return t.push.apply(t, n), defined(this._batchTableHierarchy) && t.push.apply( + t, + this._batchTableHierarchy.getPropertyIds(e, n) + ), t; +}; +Cesium3DTileBatchTable.prototype.getPropertyBySemantic = function(e, t) { +}; +Cesium3DTileBatchTable.prototype.getProperty = function(e, t) { + if (defined(this._batchTableBinaryProperties)) { + const i = this._batchTableBinaryProperties[t]; + if (defined(i)) + return getBinaryProperty(i, e); + } + const n = this._properties[t]; + if (defined(n)) + return clone$1(n[e], !0); + if (defined(this._batchTableHierarchy)) { + const i = this._batchTableHierarchy.getProperty( + e, + t + ); + if (defined(i)) + return i; + } +}; +Cesium3DTileBatchTable.prototype.setProperty = function(e, t, n) { + const i = this.featuresLength; + if (defined(this._batchTableBinaryProperties)) { + const o = this._batchTableBinaryProperties[t]; + if (defined(o)) { + setBinaryProperty(o, e, n); + return; + } + } + if (defined(this._batchTableHierarchy) && this._batchTableHierarchy.setProperty(e, t, n)) + return; + let r = this._properties[t]; + defined(r) || (this._properties[t] = new Array(i), r = this._properties[t]), r[e] = clone$1(n, !0); +}; +function getGlslComputeSt(e) { + return e._batchTexture.textureDimensions.y === 1 ? `uniform vec4 tile_textureStep; +vec2 computeSt(float batchId) +{ + float stepX = tile_textureStep.x; + float centerX = tile_textureStep.y; + return vec2(centerX + (batchId * stepX), 0.5); +} +` : `uniform vec4 tile_textureStep; +uniform vec2 tile_textureDimensions; +vec2 computeSt(float batchId) +{ + float stepX = tile_textureStep.x; + float centerX = tile_textureStep.y; + float stepY = tile_textureStep.z; + float centerY = tile_textureStep.w; + float xId = mod(batchId, tile_textureDimensions.x); + float yId = floor(batchId / tile_textureDimensions.x); + return vec2(centerX + (xId * stepX), centerY + (yId * stepY)); +} +`; +} +Cesium3DTileBatchTable.prototype.getVertexShaderCallback = function(e, t, n) { + if (this.featuresLength === 0) + return; + const i = this; + return function(r) { + const o = modifyDiffuse( + r, + n, + !1 + ); + let s; + return ContextLimits.maximumVertexTextureImageUnits > 0 ? (s = "", e && (s += `uniform bool tile_translucentCommand; +`), s += `uniform sampler2D tile_batchTexture; +out vec4 tile_featureColor; +out vec2 tile_featureSt; +void main() +{ + vec2 st = computeSt(${t}); + vec4 featureProperties = texture(tile_batchTexture, st); + tile_color(featureProperties); + float show = ceil(featureProperties.a); + gl_Position *= show; +`, e && (s += ` bool isStyleTranslucent = (featureProperties.a != 1.0); + if (czm_pass == czm_passTranslucent) + { + if (!isStyleTranslucent && !tile_translucentCommand) + { + gl_Position *= 0.0; + } + } + else + { + if (isStyleTranslucent) + { + gl_Position *= 0.0; + } + } +`), s += ` tile_featureColor = featureProperties; + tile_featureSt = st; +}`) : s = `out vec2 tile_featureSt; +void main() +{ + tile_color(vec4(1.0)); + tile_featureSt = computeSt(${t}); +}`, `${o} +${getGlslComputeSt(i)}${s}`; + }; +}; +function getDefaultShader(e, t) { + return e = ShaderSource.replaceMain(e, "tile_main"), t ? `${e}uniform float tile_colorBlend; +void tile_color(vec4 tile_featureColor) +{ + tile_main(); + tile_featureColor = czm_gammaCorrect(tile_featureColor); + out_FragColor.a *= tile_featureColor.a; + float highlight = ceil(tile_colorBlend); + out_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); +} +` : `${e}void tile_color(vec4 tile_featureColor) +{ + tile_main(); +} +`; +} +function replaceDiffuseTextureCalls(e, t) { + const n = `texture(${t}`; + let i = 0, r = e.indexOf(n, i), o; + for (; r > -1; ) { + let s = 0; + for (let d = r; d < e.length; ++d) { + const f = e.charAt(d); + if (f === "(") + ++s; + else if (f === ")" && (--s, s === 0)) { + o = d + 1; + break; + } + } + const l = `tile_diffuse_final(${e.slice(r, o)}, tile_diffuse)`; + e = e.slice(0, r) + l + e.slice(o), i = r + l.length, r = e.indexOf(n, i); + } + return e; +} +function modifyDiffuse(e, t, n) { + if (!defined(t)) + return getDefaultShader(e, n); + let i = new RegExp( + `(uniform|attribute|in)\\s+(vec[34]|sampler2D)\\s+${t};` + ); + const r = e.match(i); + if (!defined(r)) + return getDefaultShader(e, n); + const o = r[0], s = r[2]; + e = ShaderSource.replaceMain(e, "tile_main"), e = e.replace(o, ""); + const c = `bool isWhite(vec3 color) +{ + return all(greaterThan(color, vec3(1.0 - czm_epsilon3))); +} +vec4 tile_diffuse_final(vec4 sourceDiffuse, vec4 tileDiffuse) +{ + vec4 blendDiffuse = mix(sourceDiffuse, tileDiffuse, tile_colorBlend); + vec4 diffuse = isWhite(tileDiffuse.rgb) ? sourceDiffuse : blendDiffuse; + return vec4(diffuse.rgb, sourceDiffuse.a); +} +`, l = ` tile_featureColor = czm_gammaCorrect(tile_featureColor); + out_FragColor.a *= tile_featureColor.a; + float highlight = ceil(tile_colorBlend); + out_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); +`; + let d; + if (s === "vec3" || s === "vec4") { + const f = s === "vec3" ? `vec4(${t}, 1.0)` : t, h = s === "vec3" ? "tile_diffuse.xyz" : "tile_diffuse"; + i = new RegExp(t, "g"), e = e.replace(i, h), d = ` vec4 source = ${f}; + tile_diffuse = tile_diffuse_final(source, tile_featureColor); + tile_main(); +`; + } else s === "sampler2D" && (e = replaceDiffuseTextureCalls(e, t), d = ` tile_diffuse = tile_featureColor; + tile_main(); +`); + return e = `uniform float tile_colorBlend; +vec4 tile_diffuse = vec4(1.0); +${c}${o} +${e} +void tile_color(vec4 tile_featureColor) +{ +${d}`, n && (e += l), e += `} +`, e; +} +Cesium3DTileBatchTable.prototype.getFragmentShaderCallback = function(e, t, n) { + if (this.featuresLength !== 0) + return function(i) { + return i = modifyDiffuse(i, t, !0), ContextLimits.maximumVertexTextureImageUnits > 0 ? (i += `uniform sampler2D tile_pickTexture; +in vec2 tile_featureSt; +in vec4 tile_featureColor; +void main() +{ + tile_color(tile_featureColor); +`, n && (i += ` out_FragColor.rgb *= out_FragColor.a; +`), i += "}") : (e && (i += `uniform bool tile_translucentCommand; +`), i += `uniform sampler2D tile_pickTexture; +uniform sampler2D tile_batchTexture; +in vec2 tile_featureSt; +void main() +{ + vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); + if (featureProperties.a == 0.0) { + discard; + } +`, e && (i += ` bool isStyleTranslucent = (featureProperties.a != 1.0); + if (czm_pass == czm_passTranslucent) + { + if (!isStyleTranslucent && !tile_translucentCommand) + { + discard; + } + } + else + { + if (isStyleTranslucent) + { + discard; + } + } +`), i += ` tile_color(featureProperties); +`, n && (i += ` out_FragColor.rgb *= out_FragColor.a; +`), i += `} +`), i; + }; +}; +Cesium3DTileBatchTable.prototype.getClassificationFragmentShaderCallback = function() { + if (this.featuresLength !== 0) + return function(e) { + return e = ShaderSource.replaceMain(e, "tile_main"), ContextLimits.maximumVertexTextureImageUnits > 0 ? e += `uniform sampler2D tile_pickTexture; +in vec2 tile_featureSt; +in vec4 tile_featureColor; +void main() +{ + tile_main(); + out_FragColor = tile_featureColor; + out_FragColor.rgb *= out_FragColor.a; +}` : e += `uniform sampler2D tile_batchTexture; +uniform sampler2D tile_pickTexture; +in vec2 tile_featureSt; +void main() +{ + tile_main(); + vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); + if (featureProperties.a == 0.0) { + discard; + } + out_FragColor = featureProperties; + out_FragColor.rgb *= out_FragColor.a; +} +`, e; + }; +}; +function getColorBlend(e) { + const t = e._content.tileset, n = t.colorBlendMode, i = t.colorBlendAmount; + if (n === Cesium3DTileColorBlendMode$1.HIGHLIGHT) + return 0; + if (n === Cesium3DTileColorBlendMode$1.REPLACE) + return 1; + if (n === Cesium3DTileColorBlendMode$1.MIX) + return CesiumMath.clamp(i, CesiumMath.EPSILON4, 1); +} +Cesium3DTileBatchTable.prototype.getUniformMapCallback = function() { + if (this.featuresLength === 0) + return; + const e = this; + return function(t) { + return combine$2(t, { + tile_batchTexture: function() { + return defaultValue( + e._batchTexture.batchTexture, + e._batchTexture.defaultTexture + ); + }, + tile_textureDimensions: function() { + return e._batchTexture.textureDimensions; + }, + tile_textureStep: function() { + return e._batchTexture.textureStep; + }, + tile_colorBlend: function() { + return getColorBlend(e); + }, + tile_pickTexture: function() { + return e._batchTexture.pickTexture; + } + }); + }; +}; +Cesium3DTileBatchTable.prototype.getPickId = function() { + return "texture(tile_pickTexture, tile_featureSt)"; +}; +const StyleCommandsNeeded$2 = { + ALL_OPAQUE: 0, + ALL_TRANSLUCENT: 1, + OPAQUE_AND_TRANSLUCENT: 2 +}; +Cesium3DTileBatchTable.prototype.addDerivedCommands = function(e, t) { + const n = e.commandList, i = n.length, r = this._content._tile, o = r._finalResolution, s = r.tileset, c = s.isSkippingLevelOfDetail && s.hasMixedContent && e.context.stencilBuffer, l = getStyleCommandsNeeded(this); + for (let d = t; d < i; ++d) { + const f = n[d]; + if (f.pass === Pass$1.COMPUTE) + continue; + let h = f.derivedCommands.tileset; + (!defined(h) || f.dirty) && (h = {}, f.derivedCommands.tileset = h, h.originalCommand = deriveCommand(f), f.dirty = !1); + const p = h.originalCommand; + l !== StyleCommandsNeeded$2.ALL_OPAQUE && f.pass !== Pass$1.TRANSLUCENT && (defined(h.translucent) || (h.translucent = deriveTranslucentCommand$1(p))), l !== StyleCommandsNeeded$2.ALL_TRANSLUCENT && f.pass !== Pass$1.TRANSLUCENT && (defined(h.opaque) || (h.opaque = deriveOpaqueCommand(p)), c && (o || (defined(h.zback) || (h.zback = deriveZBackfaceCommand( + e.context, + p + )), s._backfaceCommands.push(h.zback)), (!defined(h.stencil) || r._selectionDepth !== getLastSelectionDepth$1(h.stencil)) && (f.renderState.depthMask ? h.stencil = deriveStencilCommand( + p, + r._selectionDepth + ) : h.stencil = h.opaque))); + const m = c ? h.stencil : h.opaque, _ = h.translucent; + f.pass !== Pass$1.TRANSLUCENT ? (l === StyleCommandsNeeded$2.ALL_OPAQUE && (n[d] = m), l === StyleCommandsNeeded$2.ALL_TRANSLUCENT && (n[d] = _), l === StyleCommandsNeeded$2.OPAQUE_AND_TRANSLUCENT && (n[d] = m, n.push(_))) : n[d] = p; + } +}; +function getStyleCommandsNeeded(e) { + const t = e._batchTexture.translucentFeaturesLength; + return t === 0 ? StyleCommandsNeeded$2.ALL_OPAQUE : t === e.featuresLength ? StyleCommandsNeeded$2.ALL_TRANSLUCENT : StyleCommandsNeeded$2.OPAQUE_AND_TRANSLUCENT; +} +function deriveCommand(e) { + const t = DrawCommand.shallowClone(e), n = t.pass === Pass$1.TRANSLUCENT; + return t.uniformMap = defined(t.uniformMap) ? t.uniformMap : {}, t.uniformMap.tile_translucentCommand = function() { + return n; + }, t; +} +function deriveTranslucentCommand$1(e) { + const t = DrawCommand.shallowClone(e); + return t.pass = Pass$1.TRANSLUCENT, t.renderState = getTranslucentRenderState$1(e.renderState), t; +} +function deriveOpaqueCommand(e) { + const t = DrawCommand.shallowClone(e); + return t.renderState = getOpaqueRenderState(e.renderState), t; +} +function getLogDepthPolygonOffsetFragmentShaderProgram(e, t) { + let n = e.shaderCache.getDerivedShaderProgram( + t, + "zBackfaceLogDepth" + ); + if (!defined(n)) { + const i = t.fragmentShaderSource.clone(); + i.defines = defined(i.defines) ? i.defines.slice(0) : [], i.defines.push("POLYGON_OFFSET"), n = e.shaderCache.createDerivedShaderProgram( + t, + "zBackfaceLogDepth", + { + vertexShaderSource: t.vertexShaderSource, + fragmentShaderSource: i, + attributeLocations: t._attributeLocations + } + ); + } + return n; +} +function deriveZBackfaceCommand(e, t) { + const n = DrawCommand.shallowClone(t), i = clone$1(n.renderState, !0); + i.cull.enabled = !0, i.cull.face = CullFace$1.FRONT, i.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, i.polygonOffset = { + enabled: !0, + factor: 5, + units: 5 + }, i.stencilTest = StencilConstants$1.setCesium3DTileBit(), i.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK, n.renderState = RenderState.fromCache(i), n.castShadows = !1, n.receiveShadows = !1, n.uniformMap = clone$1(t.uniformMap); + const r = new Cartesian2(5, 5); + return n.uniformMap.u_polygonOffset = function() { + return r; + }, n.shaderProgram = getLogDepthPolygonOffsetFragmentShaderProgram( + e, + t.shaderProgram + ), n; +} +function deriveStencilCommand(e, t) { + const n = DrawCommand.shallowClone(e), i = clone$1(n.renderState, !0); + return i.stencilTest.enabled = !0, i.stencilTest.mask = StencilConstants$1.SKIP_LOD_MASK, i.stencilTest.reference = StencilConstants$1.CESIUM_3D_TILE_MASK | t << StencilConstants$1.SKIP_LOD_BIT_SHIFT, i.stencilTest.frontFunction = StencilFunction$1.GREATER_OR_EQUAL, i.stencilTest.frontOperation.zPass = StencilOperation$1.REPLACE, i.stencilTest.backFunction = StencilFunction$1.GREATER_OR_EQUAL, i.stencilTest.backOperation.zPass = StencilOperation$1.REPLACE, i.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK | StencilConstants$1.SKIP_LOD_MASK, n.renderState = RenderState.fromCache(i), n; +} +function getLastSelectionDepth$1(e) { + return (e.renderState.stencilTest.reference & StencilConstants$1.SKIP_LOD_MASK) >>> StencilConstants$1.SKIP_LOD_BIT_SHIFT; +} +function getTranslucentRenderState$1(e) { + const t = clone$1(e, !0); + return t.cull.enabled = !1, t.depthTest.enabled = !0, t.depthMask = !1, t.blending = BlendingState$1.ALPHA_BLEND, t.stencilTest = StencilConstants$1.setCesium3DTileBit(), t.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK, RenderState.fromCache(t); +} +function getOpaqueRenderState(e) { + const t = clone$1(e, !0); + return t.stencilTest = StencilConstants$1.setCesium3DTileBit(), t.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK, RenderState.fromCache(t); +} +Cesium3DTileBatchTable.prototype.update = function(e, t) { + this._batchTexture.update(e, t); +}; +Cesium3DTileBatchTable.prototype.isDestroyed = function() { + return !1; +}; +Cesium3DTileBatchTable.prototype.destroy = function() { + return this._batchTexture = this._batchTexture && this._batchTexture.destroy(), destroyObject(this); +}; +function Vector3DTileBatch(e) { + this.offset = e.offset, this.count = e.count, this.color = e.color, this.batchIds = e.batchIds; +} +const VectorTileVS = `in vec3 position; +in float a_batchId; + +uniform mat4 u_modifiedModelViewProjection; + +void main() +{ + gl_Position = czm_depthClamp(u_modifiedModelViewProjection * vec4(position, 1.0)); +} +`; +function Cesium3DTileFeature(e, t) { + this._content = e, this._batchId = t, this._color = void 0; +} +Object.defineProperties(Cesium3DTileFeature.prototype, { + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {boolean} + * + * @default true + */ + show: { + get: function() { + return this._content.batchTable.getShow(this._batchId); + }, + set: function(e) { + this._content.batchTable.setShow(this._batchId, e); + } + }, + /** + * Gets or sets the highlight color multiplied with the feature's color. When + * this is white, the feature's color is not changed. This is set for all features + * when a style's color is evaluated. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {Color} + * + * @default {@link Color.WHITE} + */ + color: { + get: function() { + return defined(this._color) || (this._color = new Color()), this._content.batchTable.getColor(this._batchId, this._color); + }, + set: function(e) { + this._content.batchTable.setColor(this._batchId, e); + } + }, + /** + * Gets a typed array containing the ECEF positions of the polyline. + * Returns undefined if {@link Cesium3DTileset#vectorKeepDecodedPositions} is false + * or the feature is not a polyline in a vector tile. + * + * @memberof Cesium3DTileFeature.prototype + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @type {Float64Array} + */ + polylinePositions: { + get: function() { + if (defined(this._content.getPolylinePositions)) + return this._content.getPolylinePositions(this._batchId); + } + }, + /** + * Gets the content of the tile containing the feature. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {Cesium3DTileContent} + * + * @readonly + * @private + */ + content: { + get: function() { + return this._content; + } + }, + /** + * Gets the tileset containing the feature. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {Cesium3DTileset} + * + * @readonly + */ + tileset: { + get: function() { + return this._content.tileset; + } + }, + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {Cesium3DTileset} + * + * @readonly + */ + primitive: { + get: function() { + return this._content.tileset; + } + }, + /** + * Get the feature ID associated with this feature. For 3D Tiles 1.0, the + * batch ID is returned. For EXT_mesh_features, this is the feature ID from + * the selected feature ID set. + * + * @memberof Cesium3DTileFeature.prototype + * + * @type {number} + * + * @readonly + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + featureId: { + get: function() { + return this._batchId; + } + }, + /** + * @private + */ + pickId: { + get: function() { + return this._content.batchTable.getPickColor(this._batchId); + } + } +}); +Cesium3DTileFeature.prototype.hasProperty = function(e) { + return this._content.batchTable.hasProperty(this._batchId, e); +}; +Cesium3DTileFeature.prototype.getPropertyIds = function(e) { + return this._content.batchTable.getPropertyIds(this._batchId, e); +}; +Cesium3DTileFeature.prototype.getProperty = function(e) { + return this._content.batchTable.getProperty(this._batchId, e); +}; +Cesium3DTileFeature.getPropertyInherited = function(e, t, n) { + const i = e.batchTable; + if (defined(i)) { + if (i.hasPropertyBySemantic(t, n)) + return i.getPropertyBySemantic(t, n); + if (i.hasProperty(t, n)) + return i.getProperty(t, n); + } + const r = e.metadata; + if (defined(r)) { + if (r.hasPropertyBySemantic(n)) + return r.getPropertyBySemantic(n); + if (r.hasProperty(n)) + return r.getProperty(n); + } + const o = e.tile, s = o.metadata; + if (defined(s)) { + if (s.hasPropertyBySemantic(n)) + return s.getPropertyBySemantic(n); + if (s.hasProperty(n)) + return s.getProperty(n); + } + let c; + if (defined(o.implicitSubtree) && (c = o.implicitSubtree.metadata), defined(c)) { + if (c.hasPropertyBySemantic(n)) + return c.getPropertyBySemantic(n); + if (c.hasProperty(n)) + return c.getProperty(n); + } + const l = defined(e.group) ? e.group.metadata : void 0; + if (defined(l)) { + if (l.hasPropertyBySemantic(n)) + return l.getPropertyBySemantic(n); + if (l.hasProperty(n)) + return l.getProperty(n); + } + const d = e.tileset.metadata; + if (defined(d)) { + if (d.hasPropertyBySemantic(n)) + return d.getPropertyBySemantic(n); + if (d.hasProperty(n)) + return d.getProperty(n); + } +}; +Cesium3DTileFeature.prototype.getPropertyInherited = function(e) { + return Cesium3DTileFeature.getPropertyInherited( + this._content, + this._batchId, + e + ); +}; +Cesium3DTileFeature.prototype.setProperty = function(e, t) { + this._content.batchTable.setProperty(this._batchId, e, t), this._content.featurePropertiesDirty = !0; +}; +Cesium3DTileFeature.prototype.isExactClass = function(e) { + return this._content.batchTable.isExactClass(this._batchId, e); +}; +Cesium3DTileFeature.prototype.isClass = function(e) { + return this._content.batchTable.isClass(this._batchId, e); +}; +Cesium3DTileFeature.prototype.getExactClassName = function() { + return this._content.batchTable.getExactClassName(this._batchId); +}; +class Hooks { + /** + * @callback HookCallback + * @this {*|Jsep} this + * @param {Jsep} env + * @returns: void + */ + /** + * Adds the given callback to the list of callbacks for the given hook. + * + * The callback will be invoked when the hook it is registered for is run. + * + * One callback function can be registered to multiple hooks and the same hook multiple times. + * + * @param {string|object} name The name of the hook, or an object of callbacks keyed by name + * @param {HookCallback|boolean} callback The callback function which is given environment variables. + * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom) + * @public + */ + add(t, n, i) { + if (typeof arguments[0] != "string") + for (let r in arguments[0]) + this.add(r, arguments[0][r], arguments[1]); + else + (Array.isArray(t) ? t : [t]).forEach(function(r) { + this[r] = this[r] || [], n && this[r][i ? "unshift" : "push"](n); + }, this); + } + /** + * Runs a hook invoking all registered callbacks with the given environment variables. + * + * Callbacks will be invoked synchronously and in the order in which they were registered. + * + * @param {string} name The name of the hook. + * @param {Object} env The environment variables of the hook passed to all callbacks registered. + * @public + */ + run(t, n) { + this[t] = this[t] || [], this[t].forEach(function(i) { + i.call(n && n.context ? n.context : n, n); + }); + } +} +class Plugins { + constructor(t) { + this.jsep = t, this.registered = {}; + } + /** + * @callback PluginSetup + * @this {Jsep} jsep + * @returns: void + */ + /** + * Adds the given plugin(s) to the registry + * + * @param {object} plugins + * @param {string} plugins.name The name of the plugin + * @param {PluginSetup} plugins.init The init function + * @public + */ + register(...t) { + t.forEach((n) => { + if (typeof n != "object" || !n.name || !n.init) + throw new Error("Invalid JSEP plugin format"); + this.registered[n.name] || (n.init(this.jsep), this.registered[n.name] = n); + }); + } +} +class Jsep { + /** + * @returns {string} + */ + static get version() { + return "1.3.8"; + } + /** + * @returns {string} + */ + static toString() { + return "JavaScript Expression Parser (JSEP) v" + Jsep.version; + } + // ==================== CONFIG ================================ + /** + * @method addUnaryOp + * @param {string} op_name The name of the unary op to add + * @returns {Jsep} + */ + static addUnaryOp(t) { + return Jsep.max_unop_len = Math.max(t.length, Jsep.max_unop_len), Jsep.unary_ops[t] = 1, Jsep; + } + /** + * @method jsep.addBinaryOp + * @param {string} op_name The name of the binary op to add + * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence + * @param {boolean} [isRightAssociative=false] whether operator is right-associative + * @returns {Jsep} + */ + static addBinaryOp(t, n, i) { + return Jsep.max_binop_len = Math.max(t.length, Jsep.max_binop_len), Jsep.binary_ops[t] = n, i ? Jsep.right_associative.add(t) : Jsep.right_associative.delete(t), Jsep; + } + /** + * @method addIdentifierChar + * @param {string} char The additional character to treat as a valid part of an identifier + * @returns {Jsep} + */ + static addIdentifierChar(t) { + return Jsep.additional_identifier_chars.add(t), Jsep; + } + /** + * @method addLiteral + * @param {string} literal_name The name of the literal to add + * @param {*} literal_value The value of the literal + * @returns {Jsep} + */ + static addLiteral(t, n) { + return Jsep.literals[t] = n, Jsep; + } + /** + * @method removeUnaryOp + * @param {string} op_name The name of the unary op to remove + * @returns {Jsep} + */ + static removeUnaryOp(t) { + return delete Jsep.unary_ops[t], t.length === Jsep.max_unop_len && (Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops)), Jsep; + } + /** + * @method removeAllUnaryOps + * @returns {Jsep} + */ + static removeAllUnaryOps() { + return Jsep.unary_ops = {}, Jsep.max_unop_len = 0, Jsep; + } + /** + * @method removeIdentifierChar + * @param {string} char The additional character to stop treating as a valid part of an identifier + * @returns {Jsep} + */ + static removeIdentifierChar(t) { + return Jsep.additional_identifier_chars.delete(t), Jsep; + } + /** + * @method removeBinaryOp + * @param {string} op_name The name of the binary op to remove + * @returns {Jsep} + */ + static removeBinaryOp(t) { + return delete Jsep.binary_ops[t], t.length === Jsep.max_binop_len && (Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops)), Jsep.right_associative.delete(t), Jsep; + } + /** + * @method removeAllBinaryOps + * @returns {Jsep} + */ + static removeAllBinaryOps() { + return Jsep.binary_ops = {}, Jsep.max_binop_len = 0, Jsep; + } + /** + * @method removeLiteral + * @param {string} literal_name The name of the literal to remove + * @returns {Jsep} + */ + static removeLiteral(t) { + return delete Jsep.literals[t], Jsep; + } + /** + * @method removeAllLiterals + * @returns {Jsep} + */ + static removeAllLiterals() { + return Jsep.literals = {}, Jsep; + } + // ==================== END CONFIG ============================ + /** + * @returns {string} + */ + get char() { + return this.expr.charAt(this.index); + } + /** + * @returns {number} + */ + get code() { + return this.expr.charCodeAt(this.index); + } + /** + * @param {string} expr a string with the passed in express + * @returns Jsep + */ + constructor(t) { + this.expr = t, this.index = 0; + } + /** + * static top-level parser + * @returns {jsep.Expression} + */ + static parse(t) { + return new Jsep(t).parse(); + } + /** + * Get the longest key length of any object + * @param {object} obj + * @returns {number} + */ + static getMaxKeyLen(t) { + return Math.max(0, ...Object.keys(t).map((n) => n.length)); + } + /** + * `ch` is a character code in the next three functions + * @param {number} ch + * @returns {boolean} + */ + static isDecimalDigit(t) { + return t >= 48 && t <= 57; + } + /** + * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float. + * @param {string} op_val + * @returns {number} + */ + static binaryPrecedence(t) { + return Jsep.binary_ops[t] || 0; + } + /** + * Looks for start of identifier + * @param {number} ch + * @returns {boolean} + */ + static isIdentifierStart(t) { + return t >= 65 && t <= 90 || // A...Z + t >= 97 && t <= 122 || // a...z + t >= 128 && !Jsep.binary_ops[String.fromCharCode(t)] || // any non-ASCII that is not an operator + Jsep.additional_identifier_chars.has(String.fromCharCode(t)); + } + /** + * @param {number} ch + * @returns {boolean} + */ + static isIdentifierPart(t) { + return Jsep.isIdentifierStart(t) || Jsep.isDecimalDigit(t); + } + /** + * throw error at index of the expression + * @param {string} message + * @throws + */ + throwError(t) { + const n = new Error(t + " at character " + this.index); + throw n.index = this.index, n.description = t, n; + } + /** + * Run a given hook + * @param {string} name + * @param {jsep.Expression|false} [node] + * @returns {?jsep.Expression} + */ + runHook(t, n) { + if (Jsep.hooks[t]) { + const i = { context: this, node: n }; + return Jsep.hooks.run(t, i), i.node; + } + return n; + } + /** + * Runs a given hook until one returns a node + * @param {string} name + * @returns {?jsep.Expression} + */ + searchHook(t) { + if (Jsep.hooks[t]) { + const n = { context: this }; + return Jsep.hooks[t].find(function(i) { + return i.call(n.context, n), n.node; + }), n.node; + } + } + /** + * Push `index` up to the next non-space character + */ + gobbleSpaces() { + let t = this.code; + for (; t === Jsep.SPACE_CODE || t === Jsep.TAB_CODE || t === Jsep.LF_CODE || t === Jsep.CR_CODE; ) + t = this.expr.charCodeAt(++this.index); + this.runHook("gobble-spaces"); + } + /** + * Top-level method to parse all expressions and returns compound or single node + * @returns {jsep.Expression} + */ + parse() { + this.runHook("before-all"); + const t = this.gobbleExpressions(), n = t.length === 1 ? t[0] : { + type: Jsep.COMPOUND, + body: t + }; + return this.runHook("after-all", n); + } + /** + * top-level parser (but can be reused within as well) + * @param {number} [untilICode] + * @returns {jsep.Expression[]} + */ + gobbleExpressions(t) { + let n = [], i, r; + for (; this.index < this.expr.length; ) + if (i = this.code, i === Jsep.SEMCOL_CODE || i === Jsep.COMMA_CODE) + this.index++; + else if (r = this.gobbleExpression()) + n.push(r); + else if (this.index < this.expr.length) { + if (i === t) + break; + this.throwError('Unexpected "' + this.char + '"'); + } + return n; + } + /** + * The main parsing function. + * @returns {?jsep.Expression} + */ + gobbleExpression() { + const t = this.searchHook("gobble-expression") || this.gobbleBinaryExpression(); + return this.gobbleSpaces(), this.runHook("after-expression", t); + } + /** + * Search for the operation portion of the string (e.g. `+`, `===`) + * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`) + * and move down from 3 to 2 to 1 character until a matching binary operation is found + * then, return that binary operation + * @returns {string|boolean} + */ + gobbleBinaryOp() { + this.gobbleSpaces(); + let t = this.expr.substr(this.index, Jsep.max_binop_len), n = t.length; + for (; n > 0; ) { + if (Jsep.binary_ops.hasOwnProperty(t) && (!Jsep.isIdentifierStart(this.code) || this.index + t.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + t.length)))) + return this.index += n, t; + t = t.substr(0, --n); + } + return !1; + } + /** + * This function is responsible for gobbling an individual expression, + * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)` + * @returns {?jsep.BinaryExpression} + */ + gobbleBinaryExpression() { + let t, n, i, r, o, s, c, l, d; + if (s = this.gobbleToken(), !s || (n = this.gobbleBinaryOp(), !n)) + return s; + for (o = { value: n, prec: Jsep.binaryPrecedence(n), right_a: Jsep.right_associative.has(n) }, c = this.gobbleToken(), c || this.throwError("Expected expression after " + n), r = [s, o, c]; n = this.gobbleBinaryOp(); ) { + if (i = Jsep.binaryPrecedence(n), i === 0) { + this.index -= n.length; + break; + } + o = { value: n, prec: i, right_a: Jsep.right_associative.has(n) }, d = n; + const f = (h) => o.right_a && h.right_a ? i > h.prec : i <= h.prec; + for (; r.length > 2 && f(r[r.length - 2]); ) + c = r.pop(), n = r.pop().value, s = r.pop(), t = { + type: Jsep.BINARY_EXP, + operator: n, + left: s, + right: c + }, r.push(t); + t = this.gobbleToken(), t || this.throwError("Expected expression after " + d), r.push(o, t); + } + for (l = r.length - 1, t = r[l]; l > 1; ) + t = { + type: Jsep.BINARY_EXP, + operator: r[l - 1].value, + left: r[l - 2], + right: t + }, l -= 2; + return t; + } + /** + * An individual part of a binary expression: + * e.g. `foo.bar(baz)`, `1`, `"abc"`, `(a % 2)` (because it's in parenthesis) + * @returns {boolean|jsep.Expression} + */ + gobbleToken() { + let t, n, i, r; + if (this.gobbleSpaces(), r = this.searchHook("gobble-token"), r) + return this.runHook("after-token", r); + if (t = this.code, Jsep.isDecimalDigit(t) || t === Jsep.PERIOD_CODE) + return this.gobbleNumericLiteral(); + if (t === Jsep.SQUOTE_CODE || t === Jsep.DQUOTE_CODE) + r = this.gobbleStringLiteral(); + else if (t === Jsep.OBRACK_CODE) + r = this.gobbleArray(); + else { + for (n = this.expr.substr(this.index, Jsep.max_unop_len), i = n.length; i > 0; ) { + if (Jsep.unary_ops.hasOwnProperty(n) && (!Jsep.isIdentifierStart(this.code) || this.index + n.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + n.length)))) { + this.index += i; + const o = this.gobbleToken(); + return o || this.throwError("missing unaryOp argument"), this.runHook("after-token", { + type: Jsep.UNARY_EXP, + operator: n, + argument: o, + prefix: !0 + }); + } + n = n.substr(0, --i); + } + Jsep.isIdentifierStart(t) ? (r = this.gobbleIdentifier(), Jsep.literals.hasOwnProperty(r.name) ? r = { + type: Jsep.LITERAL, + value: Jsep.literals[r.name], + raw: r.name + } : r.name === Jsep.this_str && (r = { type: Jsep.THIS_EXP })) : t === Jsep.OPAREN_CODE && (r = this.gobbleGroup()); + } + return r ? (r = this.gobbleTokenProperty(r), this.runHook("after-token", r)) : this.runHook("after-token", !1); + } + /** + * Gobble properties of of identifiers/strings/arrays/groups. + * e.g. `foo`, `bar.baz`, `foo['bar'].baz` + * It also gobbles function calls: + * e.g. `Math.acos(obj.angle)` + * @param {jsep.Expression} node + * @returns {jsep.Expression} + */ + gobbleTokenProperty(t) { + this.gobbleSpaces(); + let n = this.code; + for (; n === Jsep.PERIOD_CODE || n === Jsep.OBRACK_CODE || n === Jsep.OPAREN_CODE || n === Jsep.QUMARK_CODE; ) { + let i; + if (n === Jsep.QUMARK_CODE) { + if (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) + break; + i = !0, this.index += 2, this.gobbleSpaces(), n = this.code; + } + this.index++, n === Jsep.OBRACK_CODE ? (t = { + type: Jsep.MEMBER_EXP, + computed: !0, + object: t, + property: this.gobbleExpression() + }, this.gobbleSpaces(), n = this.code, n !== Jsep.CBRACK_CODE && this.throwError("Unclosed ["), this.index++) : n === Jsep.OPAREN_CODE ? t = { + type: Jsep.CALL_EXP, + arguments: this.gobbleArguments(Jsep.CPAREN_CODE), + callee: t + } : (n === Jsep.PERIOD_CODE || i) && (i && this.index--, this.gobbleSpaces(), t = { + type: Jsep.MEMBER_EXP, + computed: !1, + object: t, + property: this.gobbleIdentifier() + }), i && (t.optional = !0), this.gobbleSpaces(), n = this.code; + } + return t; + } + /** + * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to + * keep track of everything in the numeric literal and then calling `parseFloat` on that string + * @returns {jsep.Literal} + */ + gobbleNumericLiteral() { + let t = "", n, i; + for (; Jsep.isDecimalDigit(this.code); ) + t += this.expr.charAt(this.index++); + if (this.code === Jsep.PERIOD_CODE) + for (t += this.expr.charAt(this.index++); Jsep.isDecimalDigit(this.code); ) + t += this.expr.charAt(this.index++); + if (n = this.char, n === "e" || n === "E") { + for (t += this.expr.charAt(this.index++), n = this.char, (n === "+" || n === "-") && (t += this.expr.charAt(this.index++)); Jsep.isDecimalDigit(this.code); ) + t += this.expr.charAt(this.index++); + Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) || this.throwError("Expected exponent (" + t + this.char + ")"); + } + return i = this.code, Jsep.isIdentifierStart(i) ? this.throwError("Variable names cannot start with a number (" + t + this.char + ")") : (i === Jsep.PERIOD_CODE || t.length === 1 && t.charCodeAt(0) === Jsep.PERIOD_CODE) && this.throwError("Unexpected period"), { + type: Jsep.LITERAL, + value: parseFloat(t), + raw: t + }; + } + /** + * Parses a string literal, staring with single or double quotes with basic support for escape codes + * e.g. `"hello world"`, `'this is\nJSEP'` + * @returns {jsep.Literal} + */ + gobbleStringLiteral() { + let t = ""; + const n = this.index, i = this.expr.charAt(this.index++); + let r = !1; + for (; this.index < this.expr.length; ) { + let o = this.expr.charAt(this.index++); + if (o === i) { + r = !0; + break; + } else if (o === "\\") + switch (o = this.expr.charAt(this.index++), o) { + case "n": + t += ` +`; + break; + case "r": + t += "\r"; + break; + case "t": + t += " "; + break; + case "b": + t += "\b"; + break; + case "f": + t += "\f"; + break; + case "v": + t += "\v"; + break; + default: + t += o; + } + else + t += o; + } + return r || this.throwError('Unclosed quote after "' + t + '"'), { + type: Jsep.LITERAL, + value: t, + raw: this.expr.substring(n, this.index) + }; + } + /** + * Gobbles only identifiers + * e.g.: `foo`, `_value`, `$x1` + * Also, this function checks if that identifier is a literal: + * (e.g. `true`, `false`, `null`) or `this` + * @returns {jsep.Identifier} + */ + gobbleIdentifier() { + let t = this.code, n = this.index; + for (Jsep.isIdentifierStart(t) ? this.index++ : this.throwError("Unexpected " + this.char); this.index < this.expr.length && (t = this.code, Jsep.isIdentifierPart(t)); ) + this.index++; + return { + type: Jsep.IDENTIFIER, + name: this.expr.slice(n, this.index) + }; + } + /** + * Gobbles a list of arguments within the context of a function call + * or array literal. This function also assumes that the opening character + * `(` or `[` has already been gobbled, and gobbles expressions and commas + * until the terminator character `)` or `]` is encountered. + * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]` + * @param {number} termination + * @returns {jsep.Expression[]} + */ + gobbleArguments(t) { + const n = []; + let i = !1, r = 0; + for (; this.index < this.expr.length; ) { + this.gobbleSpaces(); + let o = this.code; + if (o === t) { + i = !0, this.index++, t === Jsep.CPAREN_CODE && r && r >= n.length && this.throwError("Unexpected token " + String.fromCharCode(t)); + break; + } else if (o === Jsep.COMMA_CODE) { + if (this.index++, r++, r !== n.length) { + if (t === Jsep.CPAREN_CODE) + this.throwError("Unexpected token ,"); + else if (t === Jsep.CBRACK_CODE) + for (let s = n.length; s < r; s++) + n.push(null); + } + } else if (n.length !== r && r !== 0) + this.throwError("Expected comma"); + else { + const s = this.gobbleExpression(); + (!s || s.type === Jsep.COMPOUND) && this.throwError("Expected comma"), n.push(s); + } + } + return i || this.throwError("Expected " + String.fromCharCode(t)), n; + } + /** + * Responsible for parsing a group of things within parentheses `()` + * that have no identifier in front (so not a function call) + * This function assumes that it needs to gobble the opening parenthesis + * and then tries to gobble everything within that parenthesis, assuming + * that the next thing it should see is the close parenthesis. If not, + * then the expression probably doesn't have a `)` + * @returns {boolean|jsep.Expression} + */ + gobbleGroup() { + this.index++; + let t = this.gobbleExpressions(Jsep.CPAREN_CODE); + if (this.code === Jsep.CPAREN_CODE) + return this.index++, t.length === 1 ? t[0] : t.length ? { + type: Jsep.SEQUENCE_EXP, + expressions: t + } : !1; + this.throwError("Unclosed ("); + } + /** + * Responsible for parsing Array literals `[1, 2, 3]` + * This function assumes that it needs to gobble the opening bracket + * and then tries to gobble the expressions as arguments. + * @returns {jsep.ArrayExpression} + */ + gobbleArray() { + return this.index++, { + type: Jsep.ARRAY_EXP, + elements: this.gobbleArguments(Jsep.CBRACK_CODE) + }; + } +} +const hooks = new Hooks(); +Object.assign(Jsep, { + hooks, + plugins: new Plugins(Jsep), + // Node Types + // ---------- + // This is the full set of types that any JSEP node can be. + // Store them here to save space when minified + COMPOUND: "Compound", + SEQUENCE_EXP: "SequenceExpression", + IDENTIFIER: "Identifier", + MEMBER_EXP: "MemberExpression", + LITERAL: "Literal", + THIS_EXP: "ThisExpression", + CALL_EXP: "CallExpression", + UNARY_EXP: "UnaryExpression", + BINARY_EXP: "BinaryExpression", + ARRAY_EXP: "ArrayExpression", + TAB_CODE: 9, + LF_CODE: 10, + CR_CODE: 13, + SPACE_CODE: 32, + PERIOD_CODE: 46, + // '.' + COMMA_CODE: 44, + // ',' + SQUOTE_CODE: 39, + // single quote + DQUOTE_CODE: 34, + // double quotes + OPAREN_CODE: 40, + // ( + CPAREN_CODE: 41, + // ) + OBRACK_CODE: 91, + // [ + CBRACK_CODE: 93, + // ] + QUMARK_CODE: 63, + // ? + SEMCOL_CODE: 59, + // ; + COLON_CODE: 58, + // : + // Operations + // ---------- + // Use a quickly-accessible map to store all of the unary operators + // Values are set to `1` (it really doesn't matter) + unary_ops: { + "-": 1, + "!": 1, + "~": 1, + "+": 1 + }, + // Also use a map for the binary operations but set their values to their + // binary precedence for quick reference (higher number = higher precedence) + // see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence) + binary_ops: { + "||": 1, + "&&": 2, + "|": 3, + "^": 4, + "&": 5, + "==": 6, + "!=": 6, + "===": 6, + "!==": 6, + "<": 7, + ">": 7, + "<=": 7, + ">=": 7, + "<<": 8, + ">>": 8, + ">>>": 8, + "+": 9, + "-": 9, + "*": 10, + "/": 10, + "%": 10 + }, + // sets specific binary_ops as right-associative + right_associative: /* @__PURE__ */ new Set(), + // Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char) + additional_identifier_chars: /* @__PURE__ */ new Set(["$", "_"]), + // Literals + // ---------- + // Store the values to return for the various literals we may encounter + literals: { + true: !0, + false: !1, + null: null + }, + // Except for `this`, which is special. This could be changed to something like `'self'` as well + this_str: "this" +}); +Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops); +Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops); +const jsep = (e) => new Jsep(e).parse(), staticMethods = Object.getOwnPropertyNames(Jsep); +staticMethods.forEach((e) => { + jsep[e] === void 0 && e !== "prototype" && (jsep[e] = Jsep[e]); +}); +jsep.Jsep = Jsep; +const CONDITIONAL_EXP = "ConditionalExpression"; +var ternary = { + name: "ternary", + init(e) { + e.hooks.add("after-expression", function(n) { + if (n.node && this.code === e.QUMARK_CODE) { + this.index++; + const i = n.node, r = this.gobbleExpression(); + if (r || this.throwError("Expected expression"), this.gobbleSpaces(), this.code === e.COLON_CODE) { + this.index++; + const o = this.gobbleExpression(); + if (o || this.throwError("Expected expression"), n.node = { + type: CONDITIONAL_EXP, + test: i, + consequent: r, + alternate: o + }, i.operator && e.binary_ops[i.operator] <= 0.9) { + let s = i; + for (; s.right.operator && e.binary_ops[s.right.operator] <= 0.9; ) + s = s.right; + n.node.test = s.right, s.right = n.node, n.node = i; + } + } else + this.throwError("Expected :"); + } + }); + } +}; +jsep.plugins.register(ternary); +const ExpressionNodeType = { + VARIABLE: 0, + UNARY: 1, + BINARY: 2, + TERNARY: 3, + CONDITIONAL: 4, + MEMBER: 5, + FUNCTION_CALL: 6, + ARRAY: 7, + REGEX: 8, + VARIABLE_IN_STRING: 9, + LITERAL_NULL: 10, + LITERAL_BOOLEAN: 11, + LITERAL_NUMBER: 12, + LITERAL_STRING: 13, + LITERAL_COLOR: 14, + LITERAL_VECTOR: 15, + LITERAL_REGEX: 16, + LITERAL_UNDEFINED: 17, + BUILTIN_VARIABLE: 18 +}, ExpressionNodeType$1 = Object.freeze(ExpressionNodeType); +function Expression(e, t) { + this._expression = e, e = replaceDefines(e, t), e = replaceVariables(removeBackslashes(e)), jsep.addBinaryOp("=~", 0), jsep.addBinaryOp("!~", 0); + let n; + try { + n = jsep(e); + } catch (i) { + throw new RuntimeError(i); + } + this._runtimeAst = createRuntimeAst(this, n); +} +Object.defineProperties(Expression.prototype, { + /** + * Gets the expression defined in the 3D Tiles Styling language. + * + * @memberof Expression.prototype + * + * @type {string} + * @readonly + * + * @default undefined + */ + expression: { + get: function() { + return this._expression; + } + } +}); +const scratchStorage = { + arrayIndex: 0, + arrayArray: [[]], + cartesian2Index: 0, + cartesian3Index: 0, + cartesian4Index: 0, + cartesian2Array: [new Cartesian2()], + cartesian3Array: [new Cartesian3()], + cartesian4Array: [new Cartesian4()], + reset: function() { + this.arrayIndex = 0, this.cartesian2Index = 0, this.cartesian3Index = 0, this.cartesian4Index = 0; + }, + getArray: function() { + this.arrayIndex >= this.arrayArray.length && this.arrayArray.push([]); + const e = this.arrayArray[this.arrayIndex++]; + return e.length = 0, e; + }, + getCartesian2: function() { + return this.cartesian2Index >= this.cartesian2Array.length && this.cartesian2Array.push(new Cartesian2()), this.cartesian2Array[this.cartesian2Index++]; + }, + getCartesian3: function() { + return this.cartesian3Index >= this.cartesian3Array.length && this.cartesian3Array.push(new Cartesian3()), this.cartesian3Array[this.cartesian3Index++]; + }, + getCartesian4: function() { + return this.cartesian4Index >= this.cartesian4Array.length && this.cartesian4Array.push(new Cartesian4()), this.cartesian4Array[this.cartesian4Index++]; + } +}; +Expression.prototype.evaluate = function(e, t) { + scratchStorage.reset(); + const n = this._runtimeAst.evaluate(e); + return t instanceof Color && n instanceof Cartesian4 ? Color.fromCartesian4(n, t) : n instanceof Cartesian2 || n instanceof Cartesian3 || n instanceof Cartesian4 ? n.clone(t) : n; +}; +Expression.prototype.evaluateColor = function(e, t) { + scratchStorage.reset(); + const n = this._runtimeAst.evaluate(e); + return Color.fromCartesian4(n, t); +}; +Expression.prototype.getShaderFunction = function(e, t, n, i) { + let r = this.getShaderExpression( + t, + n + ); + return r = `${i} ${e} +{ + return ${r}; +} +`, r; +}; +Expression.prototype.getShaderExpression = function(e, t) { + return this._runtimeAst.getShaderExpression( + e, + t + ); +}; +Expression.prototype.getVariables = function() { + let e = []; + return this._runtimeAst.getVariables(e), e = e.filter(function(t, n, i) { + return i.indexOf(t) === n; + }), e; +}; +const unaryOperators = ["!", "-", "+"], binaryOperators = [ + "+", + "-", + "*", + "/", + "%", + "===", + "!==", + ">", + ">=", + "<", + "<=", + "&&", + "||", + "!~", + "=~" +], variableRegex = /\${(.*?)}/g, backslashRegex = /\\/g, backslashReplacement = "@#%", replacementRegex = /@#%/g, scratchColor$n = new Color(), unaryFunctions = { + abs: getEvaluateUnaryComponentwise(Math.abs), + sqrt: getEvaluateUnaryComponentwise(Math.sqrt), + cos: getEvaluateUnaryComponentwise(Math.cos), + sin: getEvaluateUnaryComponentwise(Math.sin), + tan: getEvaluateUnaryComponentwise(Math.tan), + acos: getEvaluateUnaryComponentwise(Math.acos), + asin: getEvaluateUnaryComponentwise(Math.asin), + atan: getEvaluateUnaryComponentwise(Math.atan), + radians: getEvaluateUnaryComponentwise(CesiumMath.toRadians), + degrees: getEvaluateUnaryComponentwise(CesiumMath.toDegrees), + sign: getEvaluateUnaryComponentwise(CesiumMath.sign), + floor: getEvaluateUnaryComponentwise(Math.floor), + ceil: getEvaluateUnaryComponentwise(Math.ceil), + round: getEvaluateUnaryComponentwise(Math.round), + exp: getEvaluateUnaryComponentwise(Math.exp), + exp2: getEvaluateUnaryComponentwise(exp2), + log: getEvaluateUnaryComponentwise(Math.log), + log2: getEvaluateUnaryComponentwise(log2), + fract: getEvaluateUnaryComponentwise(fract), + length, + normalize +}, binaryFunctions = { + atan2: getEvaluateBinaryComponentwise(Math.atan2, !1), + pow: getEvaluateBinaryComponentwise(Math.pow, !1), + min: getEvaluateBinaryComponentwise(Math.min, !0), + max: getEvaluateBinaryComponentwise(Math.max, !0), + distance, + dot, + cross +}, ternaryFunctions = { + clamp: getEvaluateTernaryComponentwise(CesiumMath.clamp), + mix: getEvaluateTernaryComponentwise(CesiumMath.lerp) +}; +function fract(e) { + return e - Math.floor(e); +} +function exp2(e) { + return Math.pow(2, e); +} +function log2(e) { + return CesiumMath.log2(e); +} +function getEvaluateUnaryComponentwise(e) { + return function(t, n) { + if (typeof n == "number") + return e(n); + if (n instanceof Cartesian2) + return Cartesian2.fromElements( + e(n.x), + e(n.y), + scratchStorage.getCartesian2() + ); + if (n instanceof Cartesian3) + return Cartesian3.fromElements( + e(n.x), + e(n.y), + e(n.z), + scratchStorage.getCartesian3() + ); + if (n instanceof Cartesian4) + return Cartesian4.fromElements( + e(n.x), + e(n.y), + e(n.z), + e(n.w), + scratchStorage.getCartesian4() + ); + throw new RuntimeError( + `Function "${t}" requires a vector or number argument. Argument is ${n}.` + ); + }; +} +function getEvaluateBinaryComponentwise(e, t) { + return function(n, i, r) { + if (t && typeof r == "number") { + if (typeof i == "number") + return e(i, r); + if (i instanceof Cartesian2) + return Cartesian2.fromElements( + e(i.x, r), + e(i.y, r), + scratchStorage.getCartesian2() + ); + if (i instanceof Cartesian3) + return Cartesian3.fromElements( + e(i.x, r), + e(i.y, r), + e(i.z, r), + scratchStorage.getCartesian3() + ); + if (i instanceof Cartesian4) + return Cartesian4.fromElements( + e(i.x, r), + e(i.y, r), + e(i.z, r), + e(i.w, r), + scratchStorage.getCartesian4() + ); + } + if (typeof i == "number" && typeof r == "number") + return e(i, r); + if (i instanceof Cartesian2 && r instanceof Cartesian2) + return Cartesian2.fromElements( + e(i.x, r.x), + e(i.y, r.y), + scratchStorage.getCartesian2() + ); + if (i instanceof Cartesian3 && r instanceof Cartesian3) + return Cartesian3.fromElements( + e(i.x, r.x), + e(i.y, r.y), + e(i.z, r.z), + scratchStorage.getCartesian3() + ); + if (i instanceof Cartesian4 && r instanceof Cartesian4) + return Cartesian4.fromElements( + e(i.x, r.x), + e(i.y, r.y), + e(i.z, r.z), + e(i.w, r.w), + scratchStorage.getCartesian4() + ); + throw new RuntimeError( + `Function "${n}" requires vector or number arguments of matching types. Arguments are ${i} and ${r}.` + ); + }; +} +function getEvaluateTernaryComponentwise(e, t) { + return function(n, i, r, o) { + if (typeof o == "number") { + if (typeof i == "number" && typeof r == "number") + return e(i, r, o); + if (i instanceof Cartesian2 && r instanceof Cartesian2) + return Cartesian2.fromElements( + e(i.x, r.x, o), + e(i.y, r.y, o), + scratchStorage.getCartesian2() + ); + if (i instanceof Cartesian3 && r instanceof Cartesian3) + return Cartesian3.fromElements( + e(i.x, r.x, o), + e(i.y, r.y, o), + e(i.z, r.z, o), + scratchStorage.getCartesian3() + ); + if (i instanceof Cartesian4 && r instanceof Cartesian4) + return Cartesian4.fromElements( + e(i.x, r.x, o), + e(i.y, r.y, o), + e(i.z, r.z, o), + e(i.w, r.w, o), + scratchStorage.getCartesian4() + ); + } + if (typeof i == "number" && typeof r == "number" && typeof o == "number") + return e(i, r, o); + if (i instanceof Cartesian2 && r instanceof Cartesian2 && o instanceof Cartesian2) + return Cartesian2.fromElements( + e(i.x, r.x, o.x), + e(i.y, r.y, o.y), + scratchStorage.getCartesian2() + ); + if (i instanceof Cartesian3 && r instanceof Cartesian3 && o instanceof Cartesian3) + return Cartesian3.fromElements( + e(i.x, r.x, o.x), + e(i.y, r.y, o.y), + e(i.z, r.z, o.z), + scratchStorage.getCartesian3() + ); + if (i instanceof Cartesian4 && r instanceof Cartesian4 && o instanceof Cartesian4) + return Cartesian4.fromElements( + e(i.x, r.x, o.x), + e(i.y, r.y, o.y), + e(i.z, r.z, o.z), + e(i.w, r.w, o.w), + scratchStorage.getCartesian4() + ); + throw new RuntimeError( + `Function "${n}" requires vector or number arguments of matching types. Arguments are ${i}, ${r}, and ${o}.` + ); + }; +} +function length(e, t) { + if (typeof t == "number") + return Math.abs(t); + if (t instanceof Cartesian2) + return Cartesian2.magnitude(t); + if (t instanceof Cartesian3) + return Cartesian3.magnitude(t); + if (t instanceof Cartesian4) + return Cartesian4.magnitude(t); + throw new RuntimeError( + `Function "${e}" requires a vector or number argument. Argument is ${t}.` + ); +} +function normalize(e, t) { + if (typeof t == "number") + return 1; + if (t instanceof Cartesian2) + return Cartesian2.normalize(t, scratchStorage.getCartesian2()); + if (t instanceof Cartesian3) + return Cartesian3.normalize(t, scratchStorage.getCartesian3()); + if (t instanceof Cartesian4) + return Cartesian4.normalize(t, scratchStorage.getCartesian4()); + throw new RuntimeError( + `Function "${e}" requires a vector or number argument. Argument is ${t}.` + ); +} +function distance(e, t, n) { + if (typeof t == "number" && typeof n == "number") + return Math.abs(t - n); + if (t instanceof Cartesian2 && n instanceof Cartesian2) + return Cartesian2.distance(t, n); + if (t instanceof Cartesian3 && n instanceof Cartesian3) + return Cartesian3.distance(t, n); + if (t instanceof Cartesian4 && n instanceof Cartesian4) + return Cartesian4.distance(t, n); + throw new RuntimeError( + `Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.` + ); +} +function dot(e, t, n) { + if (typeof t == "number" && typeof n == "number") + return t * n; + if (t instanceof Cartesian2 && n instanceof Cartesian2) + return Cartesian2.dot(t, n); + if (t instanceof Cartesian3 && n instanceof Cartesian3) + return Cartesian3.dot(t, n); + if (t instanceof Cartesian4 && n instanceof Cartesian4) + return Cartesian4.dot(t, n); + throw new RuntimeError( + `Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.` + ); +} +function cross(e, t, n) { + if (t instanceof Cartesian3 && n instanceof Cartesian3) + return Cartesian3.cross(t, n, scratchStorage.getCartesian3()); + throw new RuntimeError( + `Function "${e}" requires vec3 arguments. Arguments are ${t} and ${n}.` + ); +} +function Node$4(e, t, n, i, r) { + this._type = e, this._value = t, this._left = n, this._right = i, this._test = r, this.evaluate = void 0, setEvaluateFunction(this); +} +function replaceDefines(e, t) { + if (!defined(t)) + return e; + for (const n in t) + if (t.hasOwnProperty(n)) { + const i = new RegExp(`\\$\\{${n}\\}`, "g"), r = `(${t[n]})`; + defined(r) && (e = e.replace(i, r)); + } + return e; +} +function removeBackslashes(e) { + return e.replace(backslashRegex, backslashReplacement); +} +function replaceBackslashes(e) { + return e.replace(replacementRegex, "\\"); +} +function replaceVariables(e) { + let t = e, n = "", i = t.indexOf("${"); + for (; i >= 0; ) { + const r = t.indexOf("'"), o = t.indexOf('"'); + let s; + if (r >= 0 && r < i) + s = t.indexOf("'", r + 1), n += t.substr(0, s + 1), t = t.substr(s + 1), i = t.indexOf("${"); + else if (o >= 0 && o < i) + s = t.indexOf('"', o + 1), n += t.substr(0, s + 1), t = t.substr(s + 1), i = t.indexOf("${"); + else { + n += t.substr(0, i); + const c = t.indexOf("}"); + if (c < 0) + throw new RuntimeError("Unmatched {."); + n += `czm_${t.substr(i + 2, c - (i + 2))}`, t = t.substr(c + 1), i = t.indexOf("${"); + } + } + return n += t, n; +} +function parseLiteral(e) { + const t = typeof e.value; + if (e.value === null) + return new Node$4(ExpressionNodeType$1.LITERAL_NULL, null); + if (t === "boolean") + return new Node$4(ExpressionNodeType$1.LITERAL_BOOLEAN, e.value); + if (t === "number") + return new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, e.value); + if (t === "string") + return e.value.indexOf("${") >= 0 ? new Node$4(ExpressionNodeType$1.VARIABLE_IN_STRING, e.value) : new Node$4( + ExpressionNodeType$1.LITERAL_STRING, + replaceBackslashes(e.value) + ); +} +function parseCall(e, t) { + const n = t.arguments, i = n.length; + let r, o, s, c; + if (t.callee.type === "MemberExpression") { + r = t.callee.property.name; + const l = t.callee.object; + if (r === "test" || r === "exec") { + if (!defined(l.callee) || l.callee.name !== "regExp") + throw new RuntimeError(`${r} is not a function.`); + return i === 0 ? r === "test" ? new Node$4(ExpressionNodeType$1.LITERAL_BOOLEAN, !1) : new Node$4(ExpressionNodeType$1.LITERAL_NULL, null) : (s = createRuntimeAst(e, l), c = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.FUNCTION_CALL, r, s, c)); + } else if (r === "toString") + return o = createRuntimeAst(e, l), new Node$4(ExpressionNodeType$1.FUNCTION_CALL, r, o); + throw new RuntimeError(`Unexpected function call "${r}".`); + } + if (r = t.callee.name, r === "color") { + if (i === 0) + return new Node$4(ExpressionNodeType$1.LITERAL_COLOR, r); + if (o = createRuntimeAst(e, n[0]), defined(n[1])) { + const l = createRuntimeAst(e, n[1]); + return new Node$4(ExpressionNodeType$1.LITERAL_COLOR, r, [o, l]); + } + return new Node$4(ExpressionNodeType$1.LITERAL_COLOR, r, [o]); + } else if (r === "rgb" || r === "hsl") { + if (i < 3) + throw new RuntimeError(`${r} requires three arguments.`); + return o = [ + createRuntimeAst(e, n[0]), + createRuntimeAst(e, n[1]), + createRuntimeAst(e, n[2]) + ], new Node$4(ExpressionNodeType$1.LITERAL_COLOR, r, o); + } else if (r === "rgba" || r === "hsla") { + if (i < 4) + throw new RuntimeError(`${r} requires four arguments.`); + return o = [ + createRuntimeAst(e, n[0]), + createRuntimeAst(e, n[1]), + createRuntimeAst(e, n[2]), + createRuntimeAst(e, n[3]) + ], new Node$4(ExpressionNodeType$1.LITERAL_COLOR, r, o); + } else if (r === "vec2" || r === "vec3" || r === "vec4") { + o = new Array(i); + for (let l = 0; l < i; ++l) + o[l] = createRuntimeAst(e, n[l]); + return new Node$4(ExpressionNodeType$1.LITERAL_VECTOR, r, o); + } else { + if (r === "isNaN" || r === "isFinite") + return i === 0 ? r === "isNaN" ? new Node$4(ExpressionNodeType$1.LITERAL_BOOLEAN, !0) : new Node$4(ExpressionNodeType$1.LITERAL_BOOLEAN, !1) : (o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o)); + if (r === "isExactClass" || r === "isClass") { + if (i < 1 || i > 1) + throw new RuntimeError(`${r} requires exactly one argument.`); + return o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o); + } else if (r === "getExactClassName") { + if (i > 0) + throw new RuntimeError(`${r} does not take any argument.`); + return new Node$4(ExpressionNodeType$1.UNARY, r); + } else if (defined(unaryFunctions[r])) { + if (i !== 1) + throw new RuntimeError(`${r} requires exactly one argument.`); + return o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o); + } else if (defined(binaryFunctions[r])) { + if (i !== 2) + throw new RuntimeError(`${r} requires exactly two arguments.`); + return s = createRuntimeAst(e, n[0]), c = createRuntimeAst(e, n[1]), new Node$4(ExpressionNodeType$1.BINARY, r, s, c); + } else if (defined(ternaryFunctions[r])) { + if (i !== 3) + throw new RuntimeError(`${r} requires exactly three arguments.`); + s = createRuntimeAst(e, n[0]), c = createRuntimeAst(e, n[1]); + const l = createRuntimeAst(e, n[2]); + return new Node$4(ExpressionNodeType$1.TERNARY, r, s, c, l); + } else { + if (r === "Boolean") + return i === 0 ? new Node$4(ExpressionNodeType$1.LITERAL_BOOLEAN, !1) : (o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o)); + if (r === "Number") + return i === 0 ? new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, 0) : (o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o)); + if (r === "String") + return i === 0 ? new Node$4(ExpressionNodeType$1.LITERAL_STRING, "") : (o = createRuntimeAst(e, n[0]), new Node$4(ExpressionNodeType$1.UNARY, r, o)); + if (r === "regExp") + return parseRegex(e, t); + } + } + throw new RuntimeError(`Unexpected function call "${r}".`); +} +function parseRegex(e, t) { + const n = t.arguments; + if (n.length === 0) + return new Node$4(ExpressionNodeType$1.LITERAL_REGEX, new RegExp()); + const i = createRuntimeAst(e, n[0]); + let r; + if (n.length > 1) { + const o = createRuntimeAst(e, n[1]); + if (isLiteralType(i) && isLiteralType(o)) { + try { + r = new RegExp( + replaceBackslashes(String(i._value)), + o._value + ); + } catch (s) { + throw new RuntimeError(s); + } + return new Node$4(ExpressionNodeType$1.LITERAL_REGEX, r); + } + return new Node$4(ExpressionNodeType$1.REGEX, i, o); + } + if (isLiteralType(i)) { + try { + r = new RegExp(replaceBackslashes(String(i._value))); + } catch (o) { + throw new RuntimeError(o); + } + return new Node$4(ExpressionNodeType$1.LITERAL_REGEX, r); + } + return new Node$4(ExpressionNodeType$1.REGEX, i); +} +function parseKeywordsAndVariables(e) { + if (isVariable(e.name)) { + const t = getPropertyName(e.name); + return t.substr(0, 8) === "tiles3d_" ? new Node$4(ExpressionNodeType$1.BUILTIN_VARIABLE, t) : new Node$4(ExpressionNodeType$1.VARIABLE, t); + } else { + if (e.name === "NaN") + return new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, NaN); + if (e.name === "Infinity") + return new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, 1 / 0); + if (e.name === "undefined") + return new Node$4(ExpressionNodeType$1.LITERAL_UNDEFINED, void 0); + } + throw new RuntimeError(`${e.name} is not defined.`); +} +function parseMathConstant(e) { + const t = e.property.name; + if (t === "PI") + return new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, Math.PI); + if (t === "E") + return new Node$4(ExpressionNodeType$1.LITERAL_NUMBER, Math.E); +} +function parseNumberConstant(e) { + if (e.property.name === "POSITIVE_INFINITY") + return new Node$4( + ExpressionNodeType$1.LITERAL_NUMBER, + Number.POSITIVE_INFINITY + ); +} +function parseMemberExpression(e, t) { + if (t.object.name === "Math") + return parseMathConstant(t); + if (t.object.name === "Number") + return parseNumberConstant(t); + let n; + const i = createRuntimeAst(e, t.object); + return t.computed ? (n = createRuntimeAst(e, t.property), new Node$4(ExpressionNodeType$1.MEMBER, "brackets", i, n)) : (n = new Node$4(ExpressionNodeType$1.LITERAL_STRING, t.property.name), new Node$4(ExpressionNodeType$1.MEMBER, "dot", i, n)); +} +function isLiteralType(e) { + return e._type >= ExpressionNodeType$1.LITERAL_NULL; +} +function isVariable(e) { + return e.substr(0, 4) === "czm_"; +} +function getPropertyName(e) { + return e.substr(4); +} +function createRuntimeAst(e, t) { + let n, i, r, o; + if (t.type === "Literal") + n = parseLiteral(t); + else if (t.type === "CallExpression") + n = parseCall(e, t); + else if (t.type === "Identifier") + n = parseKeywordsAndVariables(t); + else if (t.type === "UnaryExpression") { + i = t.operator; + const s = createRuntimeAst(e, t.argument); + if (unaryOperators.indexOf(i) > -1) + n = new Node$4(ExpressionNodeType$1.UNARY, i, s); + else + throw new RuntimeError(`Unexpected operator "${i}".`); + } else if (t.type === "BinaryExpression") + if (i = t.operator, r = createRuntimeAst(e, t.left), o = createRuntimeAst(e, t.right), binaryOperators.indexOf(i) > -1) + n = new Node$4(ExpressionNodeType$1.BINARY, i, r, o); + else + throw new RuntimeError(`Unexpected operator "${i}".`); + else if (t.type === "LogicalExpression") + i = t.operator, r = createRuntimeAst(e, t.left), o = createRuntimeAst(e, t.right), binaryOperators.indexOf(i) > -1 && (n = new Node$4(ExpressionNodeType$1.BINARY, i, r, o)); + else if (t.type === "ConditionalExpression") { + const s = createRuntimeAst(e, t.test); + r = createRuntimeAst(e, t.consequent), o = createRuntimeAst(e, t.alternate), n = new Node$4(ExpressionNodeType$1.CONDITIONAL, "?", r, o, s); + } else if (t.type === "MemberExpression") + n = parseMemberExpression(e, t); + else if (t.type === "ArrayExpression") { + const s = []; + for (let c = 0; c < t.elements.length; c++) + s[c] = createRuntimeAst(e, t.elements[c]); + n = new Node$4(ExpressionNodeType$1.ARRAY, s); + } else throw t.type === "Compound" ? new RuntimeError("Provide exactly one expression.") : new RuntimeError("Cannot parse expression."); + return n; +} +function setEvaluateFunction(e) { + e._type === ExpressionNodeType$1.CONDITIONAL ? e.evaluate = e._evaluateConditional : e._type === ExpressionNodeType$1.FUNCTION_CALL ? e._value === "test" ? e.evaluate = e._evaluateRegExpTest : e._value === "exec" ? e.evaluate = e._evaluateRegExpExec : e._value === "toString" && (e.evaluate = e._evaluateToString) : e._type === ExpressionNodeType$1.UNARY ? e._value === "!" ? e.evaluate = e._evaluateNot : e._value === "-" ? e.evaluate = e._evaluateNegative : e._value === "+" ? e.evaluate = e._evaluatePositive : e._value === "isNaN" ? e.evaluate = e._evaluateNaN : e._value === "isFinite" ? e.evaluate = e._evaluateIsFinite : e._value === "isExactClass" ? e.evaluate = e._evaluateIsExactClass : e._value === "isClass" ? e.evaluate = e._evaluateIsClass : e._value === "getExactClassName" ? e.evaluate = e._evaluateGetExactClassName : e._value === "Boolean" ? e.evaluate = e._evaluateBooleanConversion : e._value === "Number" ? e.evaluate = e._evaluateNumberConversion : e._value === "String" ? e.evaluate = e._evaluateStringConversion : defined(unaryFunctions[e._value]) && (e.evaluate = getEvaluateUnaryFunction(e._value)) : e._type === ExpressionNodeType$1.BINARY ? e._value === "+" ? e.evaluate = e._evaluatePlus : e._value === "-" ? e.evaluate = e._evaluateMinus : e._value === "*" ? e.evaluate = e._evaluateTimes : e._value === "/" ? e.evaluate = e._evaluateDivide : e._value === "%" ? e.evaluate = e._evaluateMod : e._value === "===" ? e.evaluate = e._evaluateEqualsStrict : e._value === "!==" ? e.evaluate = e._evaluateNotEqualsStrict : e._value === "<" ? e.evaluate = e._evaluateLessThan : e._value === "<=" ? e.evaluate = e._evaluateLessThanOrEquals : e._value === ">" ? e.evaluate = e._evaluateGreaterThan : e._value === ">=" ? e.evaluate = e._evaluateGreaterThanOrEquals : e._value === "&&" ? e.evaluate = e._evaluateAnd : e._value === "||" ? e.evaluate = e._evaluateOr : e._value === "=~" ? e.evaluate = e._evaluateRegExpMatch : e._value === "!~" ? e.evaluate = e._evaluateRegExpNotMatch : defined(binaryFunctions[e._value]) && (e.evaluate = getEvaluateBinaryFunction(e._value)) : e._type === ExpressionNodeType$1.TERNARY ? e.evaluate = getEvaluateTernaryFunction(e._value) : e._type === ExpressionNodeType$1.MEMBER ? e._value === "brackets" ? e.evaluate = e._evaluateMemberBrackets : e.evaluate = e._evaluateMemberDot : e._type === ExpressionNodeType$1.ARRAY ? e.evaluate = e._evaluateArray : e._type === ExpressionNodeType$1.VARIABLE ? e.evaluate = e._evaluateVariable : e._type === ExpressionNodeType$1.VARIABLE_IN_STRING ? e.evaluate = e._evaluateVariableString : e._type === ExpressionNodeType$1.LITERAL_COLOR ? e.evaluate = e._evaluateLiteralColor : e._type === ExpressionNodeType$1.LITERAL_VECTOR ? e.evaluate = e._evaluateLiteralVector : e._type === ExpressionNodeType$1.LITERAL_STRING ? e.evaluate = e._evaluateLiteralString : e._type === ExpressionNodeType$1.REGEX ? e.evaluate = e._evaluateRegExp : e._type === ExpressionNodeType$1.BUILTIN_VARIABLE ? e._value === "tiles3d_tileset_time" && (e.evaluate = evaluateTilesetTime) : e.evaluate = e._evaluateLiteral; +} +function evaluateTilesetTime(e) { + return defined(e) ? e.content.tileset.timeSinceLoad : 0; +} +function getEvaluateUnaryFunction(e) { + const t = unaryFunctions[e]; + return function(n) { + const i = this._left.evaluate(n); + return t(e, i); + }; +} +function getEvaluateBinaryFunction(e) { + const t = binaryFunctions[e]; + return function(n) { + const i = this._left.evaluate(n), r = this._right.evaluate(n); + return t(e, i, r); + }; +} +function getEvaluateTernaryFunction(e) { + const t = ternaryFunctions[e]; + return function(n) { + const i = this._left.evaluate(n), r = this._right.evaluate(n), o = this._test.evaluate(n); + return t(e, i, r, o); + }; +} +function getFeatureProperty(e, t) { + if (defined(e)) + return e.getPropertyInherited(t); +} +Node$4.prototype._evaluateLiteral = function() { + return this._value; +}; +Node$4.prototype._evaluateLiteralColor = function(e) { + const t = scratchColor$n, n = this._left; + if (this._value === "color") + defined(n) ? n.length > 1 ? (Color.fromCssColorString(n[0].evaluate(e), t), t.alpha = n[1].evaluate(e)) : Color.fromCssColorString(n[0].evaluate(e), t) : Color.fromBytes(255, 255, 255, 255, t); + else if (this._value === "rgb") + Color.fromBytes( + n[0].evaluate(e), + n[1].evaluate(e), + n[2].evaluate(e), + 255, + t + ); + else if (this._value === "rgba") { + const i = n[3].evaluate(e) * 255; + Color.fromBytes( + n[0].evaluate(e), + n[1].evaluate(e), + n[2].evaluate(e), + i, + t + ); + } else this._value === "hsl" ? Color.fromHsl( + n[0].evaluate(e), + n[1].evaluate(e), + n[2].evaluate(e), + 1, + t + ) : this._value === "hsla" && Color.fromHsl( + n[0].evaluate(e), + n[1].evaluate(e), + n[2].evaluate(e), + n[3].evaluate(e), + t + ); + return Cartesian4.fromColor(t, scratchStorage.getCartesian4()); +}; +Node$4.prototype._evaluateLiteralVector = function(e) { + const t = scratchStorage.getArray(), n = this._value, i = this._left, r = i.length; + for (let c = 0; c < r; ++c) { + const l = i[c].evaluate(e); + if (typeof l == "number") + t.push(l); + else if (l instanceof Cartesian2) + t.push(l.x, l.y); + else if (l instanceof Cartesian3) + t.push(l.x, l.y, l.z); + else if (l instanceof Cartesian4) + t.push(l.x, l.y, l.z, l.w); + else + throw new RuntimeError( + `${n} argument must be a vector or number. Argument is ${l}.` + ); + } + const o = t.length, s = parseInt(n.charAt(3)); + if (o === 0) + throw new RuntimeError(`Invalid ${n} constructor. No valid arguments.`); + if (o < s && o > 1) + throw new RuntimeError( + `Invalid ${n} constructor. Not enough arguments.` + ); + if (o > s && r > 1) + throw new RuntimeError(`Invalid ${n} constructor. Too many arguments.`); + if (o === 1) { + const c = t[0]; + t.push(c, c, c); + } + if (n === "vec2") + return Cartesian2.fromArray(t, 0, scratchStorage.getCartesian2()); + if (n === "vec3") + return Cartesian3.fromArray(t, 0, scratchStorage.getCartesian3()); + if (n === "vec4") + return Cartesian4.fromArray(t, 0, scratchStorage.getCartesian4()); +}; +Node$4.prototype._evaluateLiteralString = function() { + return this._value; +}; +Node$4.prototype._evaluateVariableString = function(e) { + let t = this._value, n = variableRegex.exec(t); + for (; n !== null; ) { + const i = n[0], r = n[1]; + let o = getFeatureProperty(e, r); + defined(o) || (o = ""), t = t.replace(i, o), n = variableRegex.exec(t); + } + return t; +}; +Node$4.prototype._evaluateVariable = function(e) { + return getFeatureProperty(e, this._value); +}; +function checkFeature(e) { + return e._value === "feature"; +} +Node$4.prototype._evaluateMemberDot = function(e) { + if (checkFeature(this._left)) + return getFeatureProperty(e, this._right.evaluate(e)); + const t = this._left.evaluate(e); + if (!defined(t)) + return; + const n = this._right.evaluate(e); + if (t instanceof Cartesian2 || t instanceof Cartesian3 || t instanceof Cartesian4) { + if (n === "r") + return t.x; + if (n === "g") + return t.y; + if (n === "b") + return t.z; + if (n === "a") + return t.w; + } + return t[n]; +}; +Node$4.prototype._evaluateMemberBrackets = function(e) { + if (checkFeature(this._left)) + return getFeatureProperty(e, this._right.evaluate(e)); + const t = this._left.evaluate(e); + if (!defined(t)) + return; + const n = this._right.evaluate(e); + if (t instanceof Cartesian2 || t instanceof Cartesian3 || t instanceof Cartesian4) { + if (n === 0 || n === "r") + return t.x; + if (n === 1 || n === "g") + return t.y; + if (n === 2 || n === "b") + return t.z; + if (n === 3 || n === "a") + return t.w; + } + return t[n]; +}; +Node$4.prototype._evaluateArray = function(e) { + const t = []; + for (let n = 0; n < this._value.length; n++) + t[n] = this._value[n].evaluate(e); + return t; +}; +Node$4.prototype._evaluateNot = function(e) { + const t = this._left.evaluate(e); + if (typeof t != "boolean") + throw new RuntimeError( + `Operator "!" requires a boolean argument. Argument is ${t}.` + ); + return !t; +}; +Node$4.prototype._evaluateNegative = function(e) { + const t = this._left.evaluate(e); + if (t instanceof Cartesian2) + return Cartesian2.negate(t, scratchStorage.getCartesian2()); + if (t instanceof Cartesian3) + return Cartesian3.negate(t, scratchStorage.getCartesian3()); + if (t instanceof Cartesian4) + return Cartesian4.negate(t, scratchStorage.getCartesian4()); + if (typeof t == "number") + return -t; + throw new RuntimeError( + `Operator "-" requires a vector or number argument. Argument is ${t}.` + ); +}; +Node$4.prototype._evaluatePositive = function(e) { + const t = this._left.evaluate(e); + if (!(t instanceof Cartesian2 || t instanceof Cartesian3 || t instanceof Cartesian4 || typeof t == "number")) + throw new RuntimeError( + `Operator "+" requires a vector or number argument. Argument is ${t}.` + ); + return t; +}; +Node$4.prototype._evaluateLessThan = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (typeof t != "number" || typeof n != "number") + throw new RuntimeError( + `Operator "<" requires number arguments. Arguments are ${t} and ${n}.` + ); + return t < n; +}; +Node$4.prototype._evaluateLessThanOrEquals = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (typeof t != "number" || typeof n != "number") + throw new RuntimeError( + `Operator "<=" requires number arguments. Arguments are ${t} and ${n}.` + ); + return t <= n; +}; +Node$4.prototype._evaluateGreaterThan = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (typeof t != "number" || typeof n != "number") + throw new RuntimeError( + `Operator ">" requires number arguments. Arguments are ${t} and ${n}.` + ); + return t > n; +}; +Node$4.prototype._evaluateGreaterThanOrEquals = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (typeof t != "number" || typeof n != "number") + throw new RuntimeError( + `Operator ">=" requires number arguments. Arguments are ${t} and ${n}.` + ); + return t >= n; +}; +Node$4.prototype._evaluateOr = function(e) { + const t = this._left.evaluate(e); + if (typeof t != "boolean") + throw new RuntimeError( + `Operator "||" requires boolean arguments. First argument is ${t}.` + ); + if (t) + return !0; + const n = this._right.evaluate(e); + if (typeof n != "boolean") + throw new RuntimeError( + `Operator "||" requires boolean arguments. Second argument is ${n}.` + ); + return t || n; +}; +Node$4.prototype._evaluateAnd = function(e) { + const t = this._left.evaluate(e); + if (typeof t != "boolean") + throw new RuntimeError( + `Operator "&&" requires boolean arguments. First argument is ${t}.` + ); + if (!t) + return !1; + const n = this._right.evaluate(e); + if (typeof n != "boolean") + throw new RuntimeError( + `Operator "&&" requires boolean arguments. Second argument is ${n}.` + ); + return t && n; +}; +Node$4.prototype._evaluatePlus = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (n instanceof Cartesian2 && t instanceof Cartesian2) + return Cartesian2.add(t, n, scratchStorage.getCartesian2()); + if (n instanceof Cartesian3 && t instanceof Cartesian3) + return Cartesian3.add(t, n, scratchStorage.getCartesian3()); + if (n instanceof Cartesian4 && t instanceof Cartesian4) + return Cartesian4.add(t, n, scratchStorage.getCartesian4()); + if (typeof t == "string" || typeof n == "string") + return t + n; + if (typeof t == "number" && typeof n == "number") + return t + n; + throw new RuntimeError( + `Operator "+" requires vector or number arguments of matching types, or at least one string argument. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateMinus = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (n instanceof Cartesian2 && t instanceof Cartesian2) + return Cartesian2.subtract(t, n, scratchStorage.getCartesian2()); + if (n instanceof Cartesian3 && t instanceof Cartesian3) + return Cartesian3.subtract(t, n, scratchStorage.getCartesian3()); + if (n instanceof Cartesian4 && t instanceof Cartesian4) + return Cartesian4.subtract(t, n, scratchStorage.getCartesian4()); + if (typeof t == "number" && typeof n == "number") + return t - n; + throw new RuntimeError( + `Operator "-" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateTimes = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (n instanceof Cartesian2 && t instanceof Cartesian2) + return Cartesian2.multiplyComponents( + t, + n, + scratchStorage.getCartesian2() + ); + if (n instanceof Cartesian2 && typeof t == "number") + return Cartesian2.multiplyByScalar( + n, + t, + scratchStorage.getCartesian2() + ); + if (t instanceof Cartesian2 && typeof n == "number") + return Cartesian2.multiplyByScalar( + t, + n, + scratchStorage.getCartesian2() + ); + if (n instanceof Cartesian3 && t instanceof Cartesian3) + return Cartesian3.multiplyComponents( + t, + n, + scratchStorage.getCartesian3() + ); + if (n instanceof Cartesian3 && typeof t == "number") + return Cartesian3.multiplyByScalar( + n, + t, + scratchStorage.getCartesian3() + ); + if (t instanceof Cartesian3 && typeof n == "number") + return Cartesian3.multiplyByScalar( + t, + n, + scratchStorage.getCartesian3() + ); + if (n instanceof Cartesian4 && t instanceof Cartesian4) + return Cartesian4.multiplyComponents( + t, + n, + scratchStorage.getCartesian4() + ); + if (n instanceof Cartesian4 && typeof t == "number") + return Cartesian4.multiplyByScalar( + n, + t, + scratchStorage.getCartesian4() + ); + if (t instanceof Cartesian4 && typeof n == "number") + return Cartesian4.multiplyByScalar( + t, + n, + scratchStorage.getCartesian4() + ); + if (typeof t == "number" && typeof n == "number") + return t * n; + throw new RuntimeError( + `Operator "*" requires vector or number arguments. If both arguments are vectors they must be matching types. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateDivide = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (n instanceof Cartesian2 && t instanceof Cartesian2) + return Cartesian2.divideComponents( + t, + n, + scratchStorage.getCartesian2() + ); + if (t instanceof Cartesian2 && typeof n == "number") + return Cartesian2.divideByScalar( + t, + n, + scratchStorage.getCartesian2() + ); + if (n instanceof Cartesian3 && t instanceof Cartesian3) + return Cartesian3.divideComponents( + t, + n, + scratchStorage.getCartesian3() + ); + if (t instanceof Cartesian3 && typeof n == "number") + return Cartesian3.divideByScalar( + t, + n, + scratchStorage.getCartesian3() + ); + if (n instanceof Cartesian4 && t instanceof Cartesian4) + return Cartesian4.divideComponents( + t, + n, + scratchStorage.getCartesian4() + ); + if (t instanceof Cartesian4 && typeof n == "number") + return Cartesian4.divideByScalar( + t, + n, + scratchStorage.getCartesian4() + ); + if (typeof t == "number" && typeof n == "number") + return t / n; + throw new RuntimeError( + `Operator "/" requires vector or number arguments of matching types, or a number as the second argument. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateMod = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (n instanceof Cartesian2 && t instanceof Cartesian2) + return Cartesian2.fromElements( + t.x % n.x, + t.y % n.y, + scratchStorage.getCartesian2() + ); + if (n instanceof Cartesian3 && t instanceof Cartesian3) + return Cartesian3.fromElements( + t.x % n.x, + t.y % n.y, + t.z % n.z, + scratchStorage.getCartesian3() + ); + if (n instanceof Cartesian4 && t instanceof Cartesian4) + return Cartesian4.fromElements( + t.x % n.x, + t.y % n.y, + t.z % n.z, + t.w % n.w, + scratchStorage.getCartesian4() + ); + if (typeof t == "number" && typeof n == "number") + return t % n; + throw new RuntimeError( + `Operator "%" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateEqualsStrict = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + return n instanceof Cartesian2 && t instanceof Cartesian2 || n instanceof Cartesian3 && t instanceof Cartesian3 || n instanceof Cartesian4 && t instanceof Cartesian4 ? t.equals(n) : t === n; +}; +Node$4.prototype._evaluateNotEqualsStrict = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + return n instanceof Cartesian2 && t instanceof Cartesian2 || n instanceof Cartesian3 && t instanceof Cartesian3 || n instanceof Cartesian4 && t instanceof Cartesian4 ? !t.equals(n) : t !== n; +}; +Node$4.prototype._evaluateConditional = function(e) { + const t = this._test.evaluate(e); + if (typeof t != "boolean") + throw new RuntimeError( + `Conditional argument of conditional expression must be a boolean. Argument is ${t}.` + ); + return t ? this._left.evaluate(e) : this._right.evaluate(e); +}; +Node$4.prototype._evaluateNaN = function(e) { + return isNaN(this._left.evaluate(e)); +}; +Node$4.prototype._evaluateIsFinite = function(e) { + return isFinite(this._left.evaluate(e)); +}; +Node$4.prototype._evaluateIsExactClass = function(e) { + return defined(e) ? e.isExactClass(this._left.evaluate(e)) : !1; +}; +Node$4.prototype._evaluateIsClass = function(e) { + return defined(e) ? e.isClass(this._left.evaluate(e)) : !1; +}; +Node$4.prototype._evaluateGetExactClassName = function(e) { + if (defined(e)) + return e.getExactClassName(); +}; +Node$4.prototype._evaluateBooleanConversion = function(e) { + return !!this._left.evaluate(e); +}; +Node$4.prototype._evaluateNumberConversion = function(e) { + return Number(this._left.evaluate(e)); +}; +Node$4.prototype._evaluateStringConversion = function(e) { + return String(this._left.evaluate(e)); +}; +Node$4.prototype._evaluateRegExp = function(e) { + const t = this._value.evaluate(e); + let n = ""; + defined(this._left) && (n = this._left.evaluate(e)); + let i; + try { + i = new RegExp(t, n); + } catch (r) { + throw new RuntimeError(r); + } + return i; +}; +Node$4.prototype._evaluateRegExpTest = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (!(t instanceof RegExp && typeof n == "string")) + throw new RuntimeError( + `RegExp.test requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.` + ); + return t.test(n); +}; +Node$4.prototype._evaluateRegExpMatch = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (t instanceof RegExp && typeof n == "string") + return t.test(n); + if (n instanceof RegExp && typeof t == "string") + return n.test(t); + throw new RuntimeError( + `Operator "=~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateRegExpNotMatch = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (t instanceof RegExp && typeof n == "string") + return !t.test(n); + if (n instanceof RegExp && typeof t == "string") + return !n.test(t); + throw new RuntimeError( + `Operator "!~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.` + ); +}; +Node$4.prototype._evaluateRegExpExec = function(e) { + const t = this._left.evaluate(e), n = this._right.evaluate(e); + if (!(t instanceof RegExp && typeof n == "string")) + throw new RuntimeError( + `RegExp.exec requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.` + ); + const i = t.exec(n); + return defined(i) ? i[1] : null; +}; +Node$4.prototype._evaluateToString = function(e) { + const t = this._left.evaluate(e); + if (t instanceof RegExp || t instanceof Cartesian2 || t instanceof Cartesian3 || t instanceof Cartesian4) + return String(t); + throw new RuntimeError(`Unexpected function call "${this._value}".`); +}; +function convertHSLToRGB(e) { + const t = e._left, n = t.length; + for (let c = 0; c < n; ++c) + if (t[c]._type !== ExpressionNodeType$1.LITERAL_NUMBER) + return; + const i = t[0]._value, r = t[1]._value, o = t[2]._value, s = n === 4 ? t[3]._value : 1; + return Color.fromHsl(i, r, o, s, scratchColor$n); +} +function convertRGBToColor(e) { + const t = e._left, n = t.length; + for (let r = 0; r < n; ++r) + if (t[r]._type !== ExpressionNodeType$1.LITERAL_NUMBER) + return; + const i = scratchColor$n; + return i.red = t[0]._value / 255, i.green = t[1]._value / 255, i.blue = t[2]._value / 255, i.alpha = n === 4 ? t[3]._value : 1, i; +} +function numberToString(e) { + return e % 1 === 0 ? e.toFixed(1) : e.toString(); +} +function colorToVec3(e) { + const t = numberToString(e.red), n = numberToString(e.green), i = numberToString(e.blue); + return `vec3(${t}, ${n}, ${i})`; +} +function colorToVec4(e) { + const t = numberToString(e.red), n = numberToString(e.green), i = numberToString(e.blue), r = numberToString(e.alpha); + return `vec4(${t}, ${n}, ${i}, ${r})`; +} +function getExpressionArray(e, t, n, i) { + const r = e.length, o = new Array(r); + for (let s = 0; s < r; ++s) + o[s] = e[s].getShaderExpression( + t, + n, + i + ); + return o; +} +function getVariableName(e, t) { + return defined(t[e]) ? t[e] : Expression.NULL_SENTINEL; +} +Expression.NULL_SENTINEL = "czm_infinity"; +Node$4.prototype.getShaderExpression = function(e, t, n) { + let i, r, o, s; + const c = this._type; + let l = this._value; + defined(this._left) && (Array.isArray(this._left) ? r = getExpressionArray( + this._left, + e, + t, + this + ) : r = this._left.getShaderExpression( + e, + t, + this + )), defined(this._right) && (o = this._right.getShaderExpression( + e, + t, + this + )), defined(this._test) && (s = this._test.getShaderExpression( + e, + t, + this + )), Array.isArray(this._value) && (l = getExpressionArray( + this._value, + e, + t, + this + )); + let d, f, h; + switch (c) { + case ExpressionNodeType$1.VARIABLE: + return checkFeature(this) ? void 0 : getVariableName(l, e); + case ExpressionNodeType$1.UNARY: + if (l === "Boolean") + return `bool(${r})`; + if (l === "Number") + return `float(${r})`; + if (l === "round") + return `floor(${r} + 0.5)`; + if (defined(unaryFunctions[l])) + return `${l}(${r})`; + if (l === "isNaN") + return `(${r} != ${r})`; + if (l === "isFinite") + return `(abs(${r}) < czm_infinity)`; + if (l === "String" || l === "isExactClass" || l === "isClass" || l === "getExactClassName") + throw new RuntimeError( + `Error generating style shader: "${l}" is not supported.` + ); + return l + r; + case ExpressionNodeType$1.BINARY: + return l === "%" ? `mod(${r}, ${o})` : l === "===" ? `(${r} == ${o})` : l === "!==" ? `(${r} != ${o})` : l === "atan2" ? `atan(${r}, ${o})` : defined(binaryFunctions[l]) ? `${l}(${r}, ${o})` : `(${r} ${l} ${o})`; + case ExpressionNodeType$1.TERNARY: + if (defined(ternaryFunctions[l])) + return `${l}(${r}, ${o}, ${s})`; + break; + case ExpressionNodeType$1.CONDITIONAL: + return `(${s} ? ${r} : ${o})`; + case ExpressionNodeType$1.MEMBER: + return checkFeature(this._left) ? getVariableName(o, e) : o === "r" || o === "x" || o === "0.0" ? `${r}[0]` : o === "g" || o === "y" || o === "1.0" ? `${r}[1]` : o === "b" || o === "z" || o === "2.0" ? `${r}[2]` : o === "a" || o === "w" || o === "3.0" ? `${r}[3]` : `${r}[int(${o})]`; + case ExpressionNodeType$1.FUNCTION_CALL: + throw new RuntimeError( + `Error generating style shader: "${l}" is not supported.` + ); + case ExpressionNodeType$1.ARRAY: + if (l.length === 4) + return `vec4(${l[0]}, ${l[1]}, ${l[2]}, ${l[3]})`; + if (l.length === 3) + return `vec3(${l[0]}, ${l[1]}, ${l[2]})`; + if (l.length === 2) + return `vec2(${l[0]}, ${l[1]})`; + throw new RuntimeError( + "Error generating style shader: Invalid array length. Array length should be 2, 3, or 4." + ); + case ExpressionNodeType$1.REGEX: + throw new RuntimeError( + "Error generating style shader: Regular expressions are not supported." + ); + case ExpressionNodeType$1.VARIABLE_IN_STRING: + throw new RuntimeError( + "Error generating style shader: Converting a variable to a string is not supported." + ); + case ExpressionNodeType$1.LITERAL_NULL: + return Expression.NULL_SENTINEL; + case ExpressionNodeType$1.LITERAL_BOOLEAN: + return l ? "true" : "false"; + case ExpressionNodeType$1.LITERAL_NUMBER: + return numberToString(l); + case ExpressionNodeType$1.LITERAL_STRING: + if (defined(n) && n._type === ExpressionNodeType$1.MEMBER && (l === "r" || l === "g" || l === "b" || l === "a" || l === "x" || l === "y" || l === "z" || l === "w" || checkFeature(n._left))) + return l; + if (i = Color.fromCssColorString(l, scratchColor$n), defined(i)) + return colorToVec3(i); + throw new RuntimeError( + "Error generating style shader: String literals are not supported." + ); + case ExpressionNodeType$1.LITERAL_COLOR: + if (d = r, l === "color") { + if (defined(d)) { + if (d.length > 1) { + const p = d[0], m = d[1]; + return m !== "1.0" && (t.translucent = !0), `vec4(${p}, ${m})`; + } + } else return "vec4(1.0)"; + return `vec4(${d[0]}, 1.0)`; + } else { + if (l === "rgb") + return i = convertRGBToColor(this), defined(i) ? colorToVec4(i) : `vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, 1.0)`; + if (l === "rgba") + return d[3] !== "1.0" && (t.translucent = !0), i = convertRGBToColor(this), defined(i) ? colorToVec4(i) : `vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, ${d[3]})`; + if (l === "hsl") + return i = convertHSLToRGB(this), defined(i) ? colorToVec4(i) : `vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), 1.0)`; + if (l === "hsla") + return i = convertHSLToRGB(this), defined(i) ? (i.alpha !== 1 && (t.translucent = !0), colorToVec4(i)) : (d[3] !== "1.0" && (t.translucent = !0), `vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), ${d[3]})`); + } + break; + case ExpressionNodeType$1.LITERAL_VECTOR: + f = r.length, h = `${l}(`; + for (let p = 0; p < f; ++p) + h += r[p], p < f - 1 && (h += ", "); + return h += ")", h; + case ExpressionNodeType$1.LITERAL_REGEX: + throw new RuntimeError( + "Error generating style shader: Regular expressions are not supported." + ); + case ExpressionNodeType$1.LITERAL_UNDEFINED: + return Expression.NULL_SENTINEL; + case ExpressionNodeType$1.BUILTIN_VARIABLE: + if (l === "tiles3d_tileset_time") + return l; + } +}; +Node$4.prototype.getVariables = function(e, t) { + let n, i, r; + const o = this._type, s = this._value; + if (defined(this._left)) + if (Array.isArray(this._left)) + for (n = this._left, i = n.length, r = 0; r < i; ++r) + n[r].getVariables(e, this); + else + this._left.getVariables(e, this); + if (defined(this._right) && this._right.getVariables(e, this), defined(this._test) && this._test.getVariables(e, this), Array.isArray(this._value)) + for (n = this._value, i = n.length, r = 0; r < i; ++r) + n[r].getVariables(e, this); + let c; + switch (o) { + case ExpressionNodeType$1.VARIABLE: + checkFeature(this) || e.push(s); + break; + case ExpressionNodeType$1.VARIABLE_IN_STRING: + for (c = variableRegex.exec(s); c !== null; ) + e.push(c[1]), c = variableRegex.exec(s); + break; + case ExpressionNodeType$1.LITERAL_STRING: + defined(t) && t._type === ExpressionNodeType$1.MEMBER && checkFeature(t._left) && e.push(s); + break; + } +}; +function Vector3DTilePrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._batchTable = e.batchTable, this._batchIds = e.batchIds, this._positions = e.positions, this._vertexBatchIds = e.vertexBatchIds, this._indices = e.indices, this._indexCounts = e.indexCounts, this._indexOffsets = e.indexOffsets, this._batchedIndices = e.batchedIndices, this._boundingVolume = e.boundingVolume, this._boundingVolumes = e.boundingVolumes, this._center = defaultValue(e.center, Cartesian3.ZERO), this._va = void 0, this._sp = void 0, this._spStencil = void 0, this._spPick = void 0, this._uniformMap = void 0, this._vaSwap = void 0, this._rsStencilDepthPass = void 0, this._rsStencilDepthPass3DTiles = void 0, this._rsColorPass = void 0, this._rsPickPass = void 0, this._rsWireframe = void 0, this._commands = [], this._commandsIgnoreShow = [], this._pickCommands = [], this._constantColor = Color.clone(Color.WHITE), this._highlightColor = this._constantColor, this._batchDirty = !0, this._pickCommandsDirty = !0, this._framesSinceLastRebatch = 0, this._updatingAllCommands = !1, this._trianglesLength = this._indices.length / 3, this._geometryByteLength = this._indices.byteLength + this._positions.byteLength + this._vertexBatchIds.byteLength, this.debugWireframe = !1, this._debugWireframe = this.debugWireframe, this._wireframeDirty = !1, this.forceRebatch = !1, this.classificationType = defaultValue( + e.classificationType, + ClassificationType$1.BOTH + ), this._vertexShaderSource = e._vertexShaderSource, this._fragmentShaderSource = e._fragmentShaderSource, this._attributeLocations = e._attributeLocations, this._uniformMap = e._uniformMap, this._pickId = e._pickId, this._modelMatrix = e._modelMatrix, this._boundingSphere = e._boundingSphere, this._batchIdLookUp = {}; + const t = this._batchIds.length; + for (let n = 0; n < t; ++n) { + const i = this._batchIds[n]; + this._batchIdLookUp[i] = n; + } +} +Object.defineProperties(Vector3DTilePrimitive.prototype, { + /** + * Gets the number of triangles. + * + * @memberof Vector3DTilePrimitive.prototype + * + * @type {number} + * @readonly + */ + trianglesLength: { + get: function() { + return this._trianglesLength; + } + }, + /** + * Gets the geometry memory in bytes. + * + * @memberof Vector3DTilePrimitive.prototype + * + * @type {number} + * @readonly + */ + geometryByteLength: { + get: function() { + return this._geometryByteLength; + } + } +}); +const defaultAttributeLocations = { + position: 0, + a_batchId: 1 +}; +function createVertexArray$3(e, t) { + if (defined(e._va)) + return; + const n = Buffer.createVertexBuffer({ + context: t, + typedArray: e._positions, + usage: BufferUsage$1.STATIC_DRAW + }), i = Buffer.createVertexBuffer({ + context: t, + typedArray: e._vertexBatchIds, + usage: BufferUsage$1.STATIC_DRAW + }), r = Buffer.createIndexBuffer({ + context: t, + typedArray: e._indices, + usage: BufferUsage$1.DYNAMIC_DRAW, + indexDatatype: e._indices.BYTES_PER_ELEMENT === 2 ? IndexDatatype$1.UNSIGNED_SHORT : IndexDatatype$1.UNSIGNED_INT + }), o = [ + { + index: 0, + vertexBuffer: n, + componentDatatype: ComponentDatatype$1.fromTypedArray(e._positions), + componentsPerAttribute: 3 + }, + { + index: 1, + vertexBuffer: i, + componentDatatype: ComponentDatatype$1.fromTypedArray( + e._vertexBatchIds + ), + componentsPerAttribute: 1 + } + ]; + e._va = new VertexArray({ + context: t, + attributes: o, + indexBuffer: r + }), t.webgl2 && (e._vaSwap = new VertexArray({ + context: t, + attributes: o, + indexBuffer: Buffer.createIndexBuffer({ + context: t, + sizeInBytes: r.sizeInBytes, + usage: BufferUsage$1.DYNAMIC_DRAW, + indexDatatype: r.indexDatatype + }) + })), e._batchedPositions = void 0, e._transferrableBatchIds = void 0, e._vertexBatchIds = void 0; +} +function createShaders$3(e, t) { + if (defined(e._sp)) + return; + const n = e._batchTable, i = defaultValue( + e._attributeLocations, + defaultAttributeLocations + ); + let r = e._pickId; + const o = e._vertexShaderSource; + let s = e._fragmentShaderSource; + if (defined(o)) { + e._sp = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: i + }), e._spStencil = e._sp, s = ShaderSource.replaceMain( + s, + "czm_non_pick_main" + ), s = `${s}void main() +{ + czm_non_pick_main(); + out_FragColor = ${r}; +} +`, e._spPick = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: i + }); + return; + } + const c = n.getVertexShaderCallback( + !1, + "a_batchId", + void 0 + )(VectorTileVS); + let l = n.getFragmentShaderCallback( + !1, + void 0, + !0 + )(ShadowVolumeFS); + r = n.getPickId(); + let d = new ShaderSource({ + sources: [c] + }), f = new ShaderSource({ + defines: ["VECTOR_TILE"], + sources: [l] + }); + e._sp = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: d, + fragmentShaderSource: f, + attributeLocations: i + }), d = new ShaderSource({ + sources: [VectorTileVS] + }), f = new ShaderSource({ + defines: ["VECTOR_TILE"], + sources: [ShadowVolumeFS] + }), e._spStencil = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: d, + fragmentShaderSource: f, + attributeLocations: i + }), l = ShaderSource.replaceMain(l, "czm_non_pick_main"), l = `${l} +void main() +{ + czm_non_pick_main(); + out_FragColor = ${r}; +} +`; + const h = new ShaderSource({ + sources: [c] + }), p = new ShaderSource({ + defines: ["VECTOR_TILE"], + sources: [l] + }); + e._spPick = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: h, + fragmentShaderSource: p, + attributeLocations: i + }); +} +function getStencilDepthRenderState$1(e) { + const t = e ? StencilFunction$1.EQUAL : StencilFunction$1.ALWAYS; + return { + colorMask: { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, + stencilTest: { + enabled: !0, + frontFunction: t, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.DECREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + backFunction: t, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.INCREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS_OR_EQUAL + }, + depthMask: !1 + }; +} +const colorRenderState$1 = { + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND +}, pickRenderState$1 = { + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1 +}; +function createRenderStates$3(e) { + defined(e._rsStencilDepthPass) || (e._rsStencilDepthPass = RenderState.fromCache( + getStencilDepthRenderState$1(!1) + ), e._rsStencilDepthPass3DTiles = RenderState.fromCache( + getStencilDepthRenderState$1(!0) + ), e._rsColorPass = RenderState.fromCache(colorRenderState$1), e._rsPickPass = RenderState.fromCache(pickRenderState$1)); +} +const modifiedModelViewScratch$3 = new Matrix4(), rtcScratch$3 = new Cartesian3(); +function createUniformMap$5(e, t) { + if (defined(e._uniformMap)) + return; + const n = { + u_modifiedModelViewProjection: function() { + const i = t.uniformState.view, r = t.uniformState.projection; + return Matrix4.clone(i, modifiedModelViewScratch$3), Matrix4.multiplyByPoint( + modifiedModelViewScratch$3, + e._center, + rtcScratch$3 + ), Matrix4.setTranslation( + modifiedModelViewScratch$3, + rtcScratch$3, + modifiedModelViewScratch$3 + ), Matrix4.multiply( + r, + modifiedModelViewScratch$3, + modifiedModelViewScratch$3 + ), modifiedModelViewScratch$3; + }, + u_highlightColor: function() { + return e._highlightColor; + } + }; + e._uniformMap = e._batchTable.getUniformMapCallback()( + n + ); +} +function copyIndicesCPU(e, t, n, i, r, o, s) { + const c = e.constructor.BYTES_PER_ELEMENT, l = o.length; + for (let d = 0; d < l; ++d) { + const f = o[d], h = s[f], p = i[h], m = r[h], _ = new e.constructor( + e.buffer, + c * p, + m + ); + t.set(_, n), i[h] = n, n += m; + } + return n; +} +function rebatchCPU(e, t) { + const n = e._indices, i = e._indexOffsets, r = e._indexCounts, o = e._batchIdLookUp, s = new n.constructor(n.length); + let c = t.pop(); + const l = [c]; + let d = copyIndicesCPU( + n, + s, + 0, + i, + r, + c.batchIds, + o + ); + for (c.offset = 0, c.count = d; t.length > 0; ) { + const f = t.pop(); + if (Color.equals(f.color, c.color)) + d = copyIndicesCPU( + n, + s, + d, + i, + r, + f.batchIds, + o + ), c.batchIds = c.batchIds.concat(f.batchIds), c.count = d - c.offset; + else { + const h = d; + d = copyIndicesCPU( + n, + s, + d, + i, + r, + f.batchIds, + o + ), f.offset = h, f.count = d - h, l.push(f), c = f; + } + } + e._va.indexBuffer.copyFromArrayView(s), e._indices = s, e._batchedIndices = l; +} +function copyIndicesGPU(e, t, n, i, r, o, s) { + const c = e.bytesPerIndex, l = o.length; + for (let d = 0; d < l; ++d) { + const f = o[d], h = s[f], p = i[h], m = r[h]; + t.copyFromBuffer( + e, + p * c, + n * c, + m * c + ), i[h] = n, n += m; + } + return n; +} +function rebatchGPU(e, t) { + const n = e._indexOffsets, i = e._indexCounts, r = e._batchIdLookUp; + let o = t.pop(); + const s = [o], c = e._va.indexBuffer, l = e._vaSwap.indexBuffer; + let d = copyIndicesGPU( + c, + l, + 0, + n, + i, + o.batchIds, + r + ); + for (o.offset = 0, o.count = d; t.length > 0; ) { + const h = t.pop(); + if (Color.equals(h.color, o.color)) + d = copyIndicesGPU( + c, + l, + d, + n, + i, + h.batchIds, + r + ), o.batchIds = o.batchIds.concat(h.batchIds), o.count = d - o.offset; + else { + const p = d; + d = copyIndicesGPU( + c, + l, + d, + n, + i, + h.batchIds, + r + ), h.offset = p, h.count = d - p, s.push(h), o = h; + } + } + const f = e._va; + e._va = e._vaSwap, e._vaSwap = f, e._batchedIndices = s; +} +function compareColors(e, t) { + return t.color.toRgba() - e.color.toRgba(); +} +function rebatchCommands(e, t) { + if (!e._batchDirty) + return !1; + const n = e._batchedIndices, i = n.length; + let r = !1; + const o = {}; + for (let s = 0; s < i; ++s) { + const l = n[s].color.toRgba(); + if (defined(o[l])) { + r = !0; + break; + } else + o[l] = !0; + } + if (!r || defined(e._lastRebatchCount) && Math.abs(e._lastRebatchCount - i) < 10) + return e._batchDirty = !1, !1; + if (r && !e.forceRebatch && e._framesSinceLastRebatch < 120) { + ++e._framesSinceLastRebatch; + return; + } + return n.sort(compareColors), t.webgl2 ? rebatchGPU(e, n) : rebatchCPU(e, n), e._lastRebatchCount = e._batchedIndices.length, e._framesSinceLastRebatch = 0, e._batchDirty = !1, e._pickCommandsDirty = !0, e._wireframeDirty = !0, !0; +} +function createColorCommands(e, t) { + const n = rebatchCommands(e, t), i = e._commands, r = e._batchedIndices, o = r.length, s = o * 2; + if (defined(i) && !n && i.length === s) + return; + i.length = s; + const c = e._va, l = e._sp, d = defaultValue(e._modelMatrix, Matrix4.IDENTITY), f = e._uniformMap, h = e._boundingVolume; + for (let p = 0; p < o; ++p) { + const m = r[p].offset, _ = r[p].count; + let y = i[p * 2]; + defined(y) || (y = i[p * 2] = new DrawCommand({ + owner: e + })), y.vertexArray = c, y.modelMatrix = d, y.offset = m, y.count = _, y.renderState = e._rsStencilDepthPass, y.shaderProgram = l, y.uniformMap = f, y.boundingVolume = h, y.cull = !1, y.pass = Pass$1.TERRAIN_CLASSIFICATION; + const C = DrawCommand.shallowClone( + y, + y.derivedCommands.tileset + ); + C.renderState = e._rsStencilDepthPass3DTiles, C.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, y.derivedCommands.tileset = C; + let T = i[p * 2 + 1]; + defined(T) || (T = i[p * 2 + 1] = new DrawCommand({ + owner: e + })), T.vertexArray = c, T.modelMatrix = d, T.offset = m, T.count = _, T.renderState = e._rsColorPass, T.shaderProgram = l, T.uniformMap = f, T.boundingVolume = h, T.cull = !1, T.pass = Pass$1.TERRAIN_CLASSIFICATION; + const x = DrawCommand.shallowClone( + T, + T.derivedCommands.tileset + ); + x.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, T.derivedCommands.tileset = x; + } + e._commandsDirty = !0; +} +function createColorCommandsIgnoreShow(e, t) { + if (e.classificationType === ClassificationType$1.TERRAIN || !t.invertClassification || defined(e._commandsIgnoreShow) && !e._commandsDirty) + return; + const n = e._commands, i = e._commandsIgnoreShow, r = e._spStencil, o = n.length, s = i.length = o / 2; + let c = 0; + for (let l = 0; l < s; ++l) { + const d = i[l] = DrawCommand.shallowClone( + n[c], + i[l] + ); + d.shaderProgram = r, d.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW, c += 2; + } + e._commandsDirty = !1; +} +function createPickCommands$1(e) { + if (!e._pickCommandsDirty) + return; + const t = e._indexOffsets.length, n = e._pickCommands; + n.length = t * 2; + const i = e._va, r = e._spStencil, o = e._spPick, s = defaultValue(e._modelMatrix, Matrix4.IDENTITY), c = e._uniformMap; + for (let l = 0; l < t; ++l) { + const d = e._indexOffsets[l], f = e._indexCounts[l], h = defined(e._boundingVolumes) ? e._boundingVolumes[l] : e.boundingVolume; + let p = n[l * 2]; + defined(p) || (p = n[l * 2] = new DrawCommand({ + owner: e, + pickOnly: !0 + })), p.vertexArray = i, p.modelMatrix = s, p.offset = d, p.count = f, p.renderState = e._rsStencilDepthPass, p.shaderProgram = r, p.uniformMap = c, p.boundingVolume = h, p.pass = Pass$1.TERRAIN_CLASSIFICATION; + const m = DrawCommand.shallowClone( + p, + p.derivedCommands.tileset + ); + m.renderState = e._rsStencilDepthPass3DTiles, m.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, p.derivedCommands.tileset = m; + let _ = n[l * 2 + 1]; + defined(_) || (_ = n[l * 2 + 1] = new DrawCommand({ + owner: e, + pickOnly: !0 + })), _.vertexArray = i, _.modelMatrix = s, _.offset = d, _.count = f, _.renderState = e._rsPickPass, _.shaderProgram = o, _.uniformMap = c, _.boundingVolume = h, _.pass = Pass$1.TERRAIN_CLASSIFICATION; + const y = DrawCommand.shallowClone( + _, + _.derivedCommands.tileset + ); + y.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, _.derivedCommands.tileset = y; + } + e._pickCommandsDirty = !1; +} +Vector3DTilePrimitive.prototype.createFeatures = function(e, t) { + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + t[o] = new Cesium3DTileFeature(e, o); + } +}; +Vector3DTilePrimitive.prototype.applyDebugSettings = function(e, t) { + this._highlightColor = e ? t : this._constantColor; +}; +function clearStyle$3(e, t) { + e._updatingAllCommands = !0; + const n = e._batchIds; + let i = n.length, r; + for (r = 0; r < i; ++r) { + const s = n[r], c = t[s]; + c.show = !0, c.color = Color.WHITE; + } + const o = e._batchedIndices; + for (i = o.length, r = 0; r < i; ++r) + o[r].color = Color.clone(Color.WHITE); + e._updatingAllCommands = !1, e._batchDirty = !0; +} +const scratchColor$m = new Color(), DEFAULT_COLOR_VALUE$2 = Color.WHITE, DEFAULT_SHOW_VALUE$2 = !0, complexExpressionReg = /\$/; +Vector3DTilePrimitive.prototype.applyStyle = function(e, t) { + if (!defined(e)) { + clearStyle$3(this, t); + return; + } + const n = e.color, i = n instanceof Expression && !complexExpressionReg.test(n.expression); + this._updatingAllCommands = i; + const r = this._batchIds; + let o = r.length, s; + for (s = 0; s < o; ++s) { + const c = r[s], l = t[c]; + l.color = defined(e.color) ? e.color.evaluateColor(l, scratchColor$m) : DEFAULT_COLOR_VALUE$2, l.show = defined(e.show) ? e.show.evaluate(l) : DEFAULT_SHOW_VALUE$2; + } + if (i) { + const c = this._batchedIndices; + for (o = c.length, s = 0; s < o; ++s) + c[s].color = Color.clone(Color.WHITE); + this._updatingAllCommands = !1, this._batchDirty = !0; + } +}; +Vector3DTilePrimitive.prototype.updateCommands = function(e, t) { + if (this._updatingAllCommands) + return; + const n = this._batchIdLookUp, i = n[e]; + if (!defined(i)) + return; + const r = this._indexOffsets, o = this._indexCounts, s = r[i], c = o[i], l = this._batchedIndices, d = l.length; + let f; + for (f = 0; f < d; ++f) { + const y = l[f].offset, C = l[f].count; + if (s >= y && s < y + C) + break; + } + l.push( + new Vector3DTileBatch({ + color: Color.clone(t), + offset: s, + count: c, + batchIds: [e] + }) + ); + const h = [], p = [], m = l[f].batchIds, _ = m.length; + for (let y = 0; y < _; ++y) { + const C = m[y]; + if (C === e) + continue; + const T = n[C]; + r[T] < s ? h.push(C) : p.push(C); + } + p.length !== 0 && l.push( + new Vector3DTileBatch({ + color: Color.clone(l[f].color), + offset: s + c, + count: l[f].offset + l[f].count - (s + c), + batchIds: p + }) + ), h.length !== 0 ? (l[f].count = s - l[f].offset, l[f].batchIds = h) : l.splice(f, 1), this._batchDirty = !0; +}; +function queueCommands$2(e, t, n, i) { + const r = e.classificationType, o = r !== ClassificationType$1.CESIUM_3D_TILE, s = r !== ClassificationType$1.TERRAIN, c = t.commandList; + let l = n.length, d, f; + for (f = 0; f < l; ++f) + o && (d = n[f], d.pass = Pass$1.TERRAIN_CLASSIFICATION, c.push(d)), s && (d = n[f].derivedCommands.tileset, d.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, c.push(d)); + if (!(!t.invertClassification || !defined(i))) + for (l = i.length, f = 0; f < l; ++f) + c.push(i[f]); +} +function queueWireframeCommands(e, t) { + const n = e.commandList, i = t.length; + for (let r = 0; r < i; r += 2) { + const o = t[r + 1]; + o.pass = Pass$1.OPAQUE, n.push(o); + } +} +function updateWireframe(e) { + let t = e.debugWireframe === e._debugWireframe; + if (t = t && !(e.debugWireframe && e._wireframeDirty), t) + return; + defined(e._rsWireframe) || (e._rsWireframe = RenderState.fromCache({})); + let n, i; + e.debugWireframe ? (n = e._rsWireframe, i = PrimitiveType$1.LINES) : (n = e._rsColorPass, i = PrimitiveType$1.TRIANGLES); + const r = e._commands, o = r.length; + for (let s = 0; s < o; s += 2) { + const c = r[s + 1]; + c.renderState = n, c.primitiveType = i; + } + e._debugWireframe = e.debugWireframe, e._wireframeDirty = !1; +} +Vector3DTilePrimitive.prototype.update = function(e) { + const t = e.context; + createVertexArray$3(this, t), createShaders$3(this, t), createRenderStates$3(this), createUniformMap$5(this, t); + const n = e.passes; + n.render && (createColorCommands(this, t), createColorCommandsIgnoreShow(this, e), updateWireframe(this), this._debugWireframe ? queueWireframeCommands(e, this._commands) : queueCommands$2(this, e, this._commands, this._commandsIgnoreShow)), n.pick && (createPickCommands$1(this), queueCommands$2(this, e, this._pickCommands)); +}; +Vector3DTilePrimitive.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTilePrimitive.prototype.destroy = function() { + return this._va = this._va && this._va.destroy(), this._sp = this._sp && this._sp.destroy(), this._spPick = this._spPick && this._spPick.destroy(), this._vaSwap = this._vaSwap && this._vaSwap.destroy(), destroyObject(this); +}; +function Vector3DTileGeometry(e) { + this._boxes = e.boxes, this._boxBatchIds = e.boxBatchIds, this._cylinders = e.cylinders, this._cylinderBatchIds = e.cylinderBatchIds, this._ellipsoids = e.ellipsoids, this._ellipsoidBatchIds = e.ellipsoidBatchIds, this._spheres = e.spheres, this._sphereBatchIds = e.sphereBatchIds, this._modelMatrix = e.modelMatrix, this._batchTable = e.batchTable, this._boundingVolume = e.boundingVolume, this._center = e.center, defined(this._center) || (defined(this._boundingVolume) ? this._center = Cartesian3.clone(this._boundingVolume.center) : this._center = Cartesian3.clone(Cartesian3.ZERO)), this._boundingVolumes = void 0, this._batchedIndices = void 0, this._indices = void 0, this._indexOffsets = void 0, this._indexCounts = void 0, this._positions = void 0, this._vertexBatchIds = void 0, this._batchIds = void 0, this._batchTableColors = void 0, this._packedBuffer = void 0, this._ready = !1, this._promise = void 0, this._error = void 0, this._verticesPromise = void 0, this._primitive = void 0, this.debugWireframe = !1, this.forceRebatch = !1, this.classificationType = ClassificationType$1.BOTH; +} +Object.defineProperties(Vector3DTileGeometry.prototype, { + /** + * Gets the number of triangles. + * + * @memberof Vector3DTileGeometry.prototype + * + * @type {number} + * @readonly + * @private + */ + trianglesLength: { + get: function() { + return defined(this._primitive) ? this._primitive.trianglesLength : 0; + } + }, + /** + * Gets the geometry memory in bytes. + * + * @memberof Vector3DTileGeometry.prototype + * + * @type {number} + * @readonly + * @private + */ + geometryByteLength: { + get: function() { + return defined(this._primitive) ? this._primitive.geometryByteLength : 0; + } + }, + /** + * Return true when the primitive is ready to render. + * @memberof Vector3DTileGeometry.prototype + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + } +}); +Vector3DTileGeometry.packedBoxLength = Matrix4.packedLength + Cartesian3.packedLength; +Vector3DTileGeometry.packedCylinderLength = Matrix4.packedLength + 2; +Vector3DTileGeometry.packedEllipsoidLength = Matrix4.packedLength + Cartesian3.packedLength; +Vector3DTileGeometry.packedSphereLength = Cartesian3.packedLength + 1; +function packBuffer$4(e) { + const t = new Float64Array( + Matrix4.packedLength + Cartesian3.packedLength + ); + let n = 0; + return Cartesian3.pack(e._center, t, n), n += Cartesian3.packedLength, Matrix4.pack(e._modelMatrix, t, n), t; +} +function unpackBuffer$1(e, t) { + let n = 0; + const i = t[n++], r = t[n++], o = e._boundingVolumes = new Array(r); + for (let l = 0; l < r; ++l) + o[l] = BoundingSphere.unpack(t, n), n += BoundingSphere.packedLength; + const s = t[n++], c = e._batchedIndices = new Array(s); + for (let l = 0; l < s; ++l) { + const d = Color.unpack(t, n); + n += Color.packedLength; + const f = t[n++], h = t[n++], p = t[n++], m = new Array(p); + for (let _ = 0; _ < p; ++_) + m[_] = t[n++]; + c[l] = new Vector3DTileBatch({ + color: d, + offset: f, + count: h, + batchIds: m + }); + } + return i; +} +const createVerticesTaskProcessor$4 = new TaskProcessor( + "createVectorTileGeometries", + 5 +), scratchColor$l = new Color(); +function createPrimitive$1(e) { + if (!defined(e._primitive) && !defined(e._verticesPromise)) { + let t = e._boxes, n = e._boxBatchIds, i = e._cylinders, r = e._cylinderBatchIds, o = e._ellipsoids, s = e._ellipsoidBatchIds, c = e._spheres, l = e._sphereBatchIds, d = e._batchTableColors, f = e._packedBuffer; + if (!defined(d)) { + let _ = 0; + defined(e._boxes) && (t = e._boxes = t.slice(), n = e._boxBatchIds = n.slice(), _ += n.length), defined(e._cylinders) && (i = e._cylinders = i.slice(), r = e._cylinderBatchIds = r.slice(), _ += r.length), defined(e._ellipsoids) && (o = e._ellipsoids = o.slice(), s = e._ellipsoidBatchIds = s.slice(), _ += s.length), defined(e._spheres) && (c = e._sphere = c.slice(), l = e._sphereBatchIds = l.slice(), _ += l.length), d = e._batchTableColors = new Uint32Array(_); + const y = e._batchTable; + for (let C = 0; C < _; ++C) { + const T = y.getColor(C, scratchColor$l); + d[C] = T.toRgba(); + } + f = e._packedBuffer = packBuffer$4(e); + } + const h = []; + defined(t) && h.push(t.buffer, n.buffer), defined(i) && h.push(i.buffer, r.buffer), defined(o) && h.push(o.buffer, s.buffer), defined(c) && h.push(c.buffer, l.buffer), h.push(d.buffer, f.buffer); + const p = { + boxes: defined(t) ? t.buffer : void 0, + boxBatchIds: defined(t) ? n.buffer : void 0, + cylinders: defined(i) ? i.buffer : void 0, + cylinderBatchIds: defined(i) ? r.buffer : void 0, + ellipsoids: defined(o) ? o.buffer : void 0, + ellipsoidBatchIds: defined(o) ? s.buffer : void 0, + spheres: defined(c) ? c.buffer : void 0, + sphereBatchIds: defined(c) ? l.buffer : void 0, + batchTableColors: d.buffer, + packedBuffer: f.buffer + }, m = e._verticesPromise = createVerticesTaskProcessor$4.scheduleTask( + p, + h + ); + return defined(m) ? m.then(function(_) { + if (e.isDestroyed()) + return; + const y = new Float64Array(_.packedBuffer); + unpackBuffer$1(e, y) === 2 ? e._indices = new Uint16Array(_.indices) : e._indices = new Uint32Array(_.indices), e._indexOffsets = new Uint32Array(_.indexOffsets), e._indexCounts = new Uint32Array(_.indexCounts), e._positions = new Float32Array(_.positions), e._vertexBatchIds = new Uint16Array(_.vertexBatchIds), e._batchIds = new Uint16Array(_.batchIds), finishPrimitive$1(e), e._ready = !0; + }).catch((_) => { + e.isDestroyed() || (e._error = _); + }) : void 0; + } +} +function finishPrimitive$1(e) { + defined(e._primitive) || (e._primitive = new Vector3DTilePrimitive({ + batchTable: e._batchTable, + positions: e._positions, + batchIds: e._batchIds, + vertexBatchIds: e._vertexBatchIds, + indices: e._indices, + indexOffsets: e._indexOffsets, + indexCounts: e._indexCounts, + batchedIndices: e._batchedIndices, + boundingVolume: e._boundingVolume, + boundingVolumes: e._boundingVolumes, + center: e._center, + pickObject: defaultValue(e._pickObject, e) + }), e._boxes = void 0, e._boxBatchIds = void 0, e._cylinders = void 0, e._cylinderBatchIds = void 0, e._ellipsoids = void 0, e._ellipsoidBatchIds = void 0, e._spheres = void 0, e._sphereBatchIds = void 0, e._center = void 0, e._modelMatrix = void 0, e._batchTable = void 0, e._boundingVolume = void 0, e._boundingVolumes = void 0, e._batchedIndices = void 0, e._indices = void 0, e._indexOffsets = void 0, e._indexCounts = void 0, e._positions = void 0, e._vertexBatchIds = void 0, e._batchIds = void 0, e._batchTableColors = void 0, e._packedBuffer = void 0, e._verticesPromise = void 0); +} +Vector3DTileGeometry.prototype.createFeatures = function(e, t) { + this._primitive.createFeatures(e, t); +}; +Vector3DTileGeometry.prototype.applyDebugSettings = function(e, t) { + this._primitive.applyDebugSettings(e, t); +}; +Vector3DTileGeometry.prototype.applyStyle = function(e, t) { + this._primitive.applyStyle(e, t); +}; +Vector3DTileGeometry.prototype.updateCommands = function(e, t) { + this._primitive.updateCommands(e, t); +}; +Vector3DTileGeometry.prototype.update = function(e) { + if (!this._ready) { + if (defined(this._promise) || (this._promise = createPrimitive$1(this)), defined(this._error)) { + const t = this._error; + throw this._error = void 0, t; + } + return; + } + this._primitive.debugWireframe = this.debugWireframe, this._primitive.forceRebatch = this.forceRebatch, this._primitive.classificationType = this.classificationType, this._primitive.update(e); +}; +Vector3DTileGeometry.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTileGeometry.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), destroyObject(this); +}; +function Geometry3DTileContent(e, t, n, i, r) { + this._tileset = e, this._tile = t, this._resource = n, this._geometries = void 0, this._metadata = void 0, this._batchTable = void 0, this._features = void 0, this.featurePropertiesDirty = !1, this._group = void 0, this._ready = !1, initialize$e(this, i, r); +} +Object.defineProperties(Geometry3DTileContent.prototype, { + featuresLength: { + get: function() { + return defined(this._batchTable) ? this._batchTable.featuresLength : 0; + } + }, + pointsLength: { + get: function() { + return 0; + } + }, + trianglesLength: { + get: function() { + return defined(this._geometries) ? this._geometries.trianglesLength : 0; + } + }, + geometryByteLength: { + get: function() { + return defined(this._geometries) ? this._geometries.geometryByteLength : 0; + } + }, + texturesByteLength: { + get: function() { + return 0; + } + }, + batchTableByteLength: { + get: function() { + return defined(this._batchTable) ? this._batchTable.batchTableByteLength : 0; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Geometry3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._resource.getUrlComponent(!0); + } + }, + metadata: { + get: function() { + return this._metadata; + }, + set: function(e) { + this._metadata = e; + } + }, + batchTable: { + get: function() { + return this._batchTable; + } + }, + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + } + } +}); +function createColorChangedCallback$1(e) { + return function(t, n) { + defined(e._geometries) && e._geometries.updateCommands(t, n); + }; +} +function getBatchIds$1(e, t) { + let n, i, r, o, s; + const c = defaultValue(e.BOXES_LENGTH, 0), l = defaultValue(e.CYLINDERS_LENGTH, 0), d = defaultValue( + e.ELLIPSOIDS_LENGTH, + 0 + ), f = defaultValue(e.SPHERES_LENGTH, 0); + if (c > 0 && defined(e.BOX_BATCH_IDS)) { + const _ = t.byteOffset + e.BOX_BATCH_IDS.byteOffset; + n = new Uint16Array( + t.buffer, + _, + c + ); + } + if (l > 0 && defined(e.CYLINDER_BATCH_IDS)) { + const _ = t.byteOffset + e.CYLINDER_BATCH_IDS.byteOffset; + i = new Uint16Array( + t.buffer, + _, + l + ); + } + if (d > 0 && defined(e.ELLIPSOID_BATCH_IDS)) { + const _ = t.byteOffset + e.ELLIPSOID_BATCH_IDS.byteOffset; + r = new Uint16Array( + t.buffer, + _, + d + ); + } + if (f > 0 && defined(e.SPHERE_BATCH_IDS)) { + const _ = t.byteOffset + e.SPHERE_BATCH_IDS.byteOffset; + o = new Uint16Array( + t.buffer, + _, + f + ); + } + const h = defined(n) || defined(i) || defined(r) || defined(o), p = c > 0 && !defined(n) || l > 0 && !defined(i) || d > 0 && !defined(r) || f > 0 && !defined(o); + if (h && p) + throw new RuntimeError( + "If one group of batch ids is defined, then all batch ids must be defined" + ); + if (!defined(n) && !defined(i) && !defined(r) && !defined(o)) { + let _ = 0; + if (!defined(n) && c > 0) + for (n = new Uint16Array(c), s = 0; s < c; ++s) + n[s] = _++; + if (!defined(i) && l > 0) + for (i = new Uint16Array(l), s = 0; s < l; ++s) + i[s] = _++; + if (!defined(r) && d > 0) + for (r = new Uint16Array(d), s = 0; s < d; ++s) + r[s] = _++; + if (!defined(o) && f > 0) + for (o = new Uint16Array(f), s = 0; s < f; ++s) + o[s] = _++; + } + return { + boxes: n, + cylinders: i, + ellipsoids: r, + spheres: o + }; +} +const sizeOfUint32$6 = Uint32Array.BYTES_PER_ELEMENT; +function initialize$e(e, t, n) { + n = defaultValue(n, 0); + const i = new Uint8Array(t), r = new DataView(t); + n += sizeOfUint32$6; + const o = r.getUint32(n, !0); + if (o !== 1) + throw new RuntimeError( + `Only Geometry tile version 1 is supported. Version ${o} is not.` + ); + n += sizeOfUint32$6; + const s = r.getUint32(n, !0); + if (n += sizeOfUint32$6, s === 0) { + e._ready = !0; + return; + } + const c = r.getUint32(n, !0); + if (n += sizeOfUint32$6, c === 0) + throw new RuntimeError( + "Feature table must have a byte length greater than zero" + ); + const l = r.getUint32(n, !0); + n += sizeOfUint32$6; + const d = r.getUint32(n, !0); + n += sizeOfUint32$6; + const f = r.getUint32(n, !0); + n += sizeOfUint32$6; + const h = getJsonFromTypedArray( + i, + n, + c + ); + n += c; + const p = new Uint8Array( + t, + n, + l + ); + n += l; + let m, _; + d > 0 && (m = getJsonFromTypedArray( + i, + n, + d + ), n += d, f > 0 && (_ = new Uint8Array( + t, + n, + f + ), _ = new Uint8Array(_))); + const y = defaultValue(h.BOXES_LENGTH, 0), C = defaultValue(h.CYLINDERS_LENGTH, 0), T = defaultValue( + h.ELLIPSOIDS_LENGTH, + 0 + ), x = defaultValue(h.SPHERES_LENGTH, 0), b = y + C + T + x, S = new Cesium3DTileBatchTable( + e, + b, + m, + _, + createColorChangedCallback$1(e) + ); + if (e._batchTable = S, b === 0) + return; + const E = e.tile.computedTransform; + let A; + defined(h.RTC_CENTER) && (A = Cartesian3.unpack(h.RTC_CENTER), Matrix4.multiplyByPoint(E, A, A)); + const D = getBatchIds$1(h, p); + if (y > 0 || C > 0 || T > 0 || x > 0) { + let P, I, M, R; + if (y > 0) { + const L = p.byteOffset + h.BOXES.byteOffset; + P = new Float32Array( + p.buffer, + L, + Vector3DTileGeometry.packedBoxLength * y + ); + } + if (C > 0) { + const L = p.byteOffset + h.CYLINDERS.byteOffset; + I = new Float32Array( + p.buffer, + L, + Vector3DTileGeometry.packedCylinderLength * C + ); + } + if (T > 0) { + const L = p.byteOffset + h.ELLIPSOIDS.byteOffset; + M = new Float32Array( + p.buffer, + L, + Vector3DTileGeometry.packedEllipsoidLength * T + ); + } + if (x > 0) { + const L = p.byteOffset + h.SPHERES.byteOffset; + R = new Float32Array( + p.buffer, + L, + Vector3DTileGeometry.packedSphereLength * x + ); + } + return e._geometries = new Vector3DTileGeometry({ + boxes: P, + boxBatchIds: D.boxes, + cylinders: I, + cylinderBatchIds: D.cylinders, + ellipsoids: M, + ellipsoidBatchIds: D.ellipsoids, + spheres: R, + sphereBatchIds: D.spheres, + center: A, + modelMatrix: E, + batchTable: S, + boundingVolume: e.tile.boundingVolume.boundingVolume + }), e; + } + return Promise.resolve(e); +} +function createFeatures$1(e) { + const t = e.featuresLength; + if (!defined(e._features) && t > 0) { + const n = new Array(t); + defined(e._geometries) && e._geometries.createFeatures(e, n), e._features = n; + } +} +Geometry3DTileContent.prototype.hasProperty = function(e, t) { + return this._batchTable.hasProperty(e, t); +}; +Geometry3DTileContent.prototype.getFeature = function(e) { + return createFeatures$1(this), this._features[e]; +}; +Geometry3DTileContent.prototype.applyDebugSettings = function(e, t) { + defined(this._geometries) && this._geometries.applyDebugSettings(e, t); +}; +Geometry3DTileContent.prototype.applyStyle = function(e) { + createFeatures$1(this), defined(this._geometries) && this._geometries.applyStyle(e, this._features); +}; +Geometry3DTileContent.prototype.update = function(e, t) { + defined(this._geometries) && (this._geometries.classificationType = this._tileset.classificationType, this._geometries.debugWireframe = this._tileset.debugWireframe, this._geometries.update(t)), defined(this._batchTable) && this._geometries.ready && (this._batchTable.update(e, t), this._ready = !0); +}; +Geometry3DTileContent.prototype.pick = function(e, t, n) { +}; +Geometry3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Geometry3DTileContent.prototype.destroy = function() { + return this._geometries = this._geometries && this._geometries.destroy(), this._batchTable = this._batchTable && this._batchTable.destroy(), destroyObject(this); +}; +const HilbertOrder = {}; +HilbertOrder.encode2D = function(e, t, n) { + const i = Math.pow(2, e), r = { + x: t, + y: n + }; + let o, s, c, l = BigInt(0); + for (c = i / 2; c > 0; c /= 2) + o = (r.x & c) > 0 ? 1 : 0, s = (r.y & c) > 0 ? 1 : 0, l += BigInt((3 * o ^ s) * c * c), rotate$1(i, r, o, s); + return l; +}; +HilbertOrder.decode2D = function(e, t) { + const n = Math.pow(2, e), i = { + x: 0, + y: 0 + }; + let r, o, s, c; + for (s = 1, c = t; s < n; s *= 2) + r = 1 & Number(c / BigInt(2)), o = 1 & Number(c ^ BigInt(r)), rotate$1(s, i, r, o), i.x += s * r, i.y += s * o, c /= BigInt(4); + return [i.x, i.y]; +}; +function rotate$1(e, t, n, i) { + if (i !== 0) + return; + n === 1 && (t.x = e - 1 - t.x, t.y = e - 1 - t.y); + const r = t.x; + t.x = t.y, t.y = r; +} +const S2_MAX_LEVEL = 30, S2_LIMIT_IJ = 1 << S2_MAX_LEVEL, S2_MAX_SITI = 1 << S2_MAX_LEVEL + 1 >>> 0, S2_POSITION_BITS = 2 * S2_MAX_LEVEL + 1, S2_LOOKUP_BITS = 4, S2_LOOKUP_POSITIONS = [], S2_LOOKUP_IJ = [], S2_POSITION_TO_IJ = [ + [0, 1, 3, 2], + // 0: Normal order, no swap or invert + [0, 2, 3, 1], + // 1: Swap bit set, swap I and J bits + [3, 2, 0, 1], + // 2: Invert bit set, invert bits + [3, 1, 0, 2] + // 3: Swap and invert bits set +], S2_SWAP_MASK = 1, S2_INVERT_MASK = 2, S2_POSITION_TO_ORIENTATION_MASK = [ + S2_SWAP_MASK, + 0, + 0, + S2_SWAP_MASK | S2_INVERT_MASK +]; +function S2Cell(e) { + if (!FeatureDetection.supportsBigInt()) + throw new RuntimeError("S2 required BigInt support"); + this._cellId = e, this._level = S2Cell.getLevel(e); +} +S2Cell.fromToken = function(e) { + return new S2Cell(S2Cell.getIdFromToken(e)); +}; +S2Cell.isValidId = function(e) { + return !(e <= 0 || e >> BigInt(S2_POSITION_BITS) > 5 || !(e & ~e + BigInt(1) & BigInt("0x1555555555555555"))); +}; +S2Cell.isValidToken = function(e) { + return /^[0-9a-fA-F]{1,16}$/.test(e) ? S2Cell.isValidId(S2Cell.getIdFromToken(e)) : !1; +}; +S2Cell.getIdFromToken = function(e) { + return BigInt("0x" + e + "0".repeat(16 - e.length)); +}; +S2Cell.getTokenFromId = function(e) { + const t = Math.floor(countTrailingZeroBits(e) / 4), n = e.toString(16).replace(/0*$/, ""); + return Array(17 - t - n.length).join( + "0" + ) + n; +}; +S2Cell.getLevel = function(e) { + let t = 0; + for (; e !== BigInt(0) && !(e & BigInt(1)); ) + t++, e = e >> BigInt(1); + return S2_MAX_LEVEL - (t >> 1); +}; +S2Cell.prototype.getChild = function(e) { + const t = lsb(this._cellId) >> BigInt(2), n = this._cellId + BigInt(2 * e + 1 - 4) * t; + return new S2Cell(n); +}; +S2Cell.prototype.getParent = function() { + const e = lsb(this._cellId) << BigInt(2); + return new S2Cell(this._cellId & ~e + BigInt(1) | e); +}; +S2Cell.prototype.getParentAtLevel = function(e) { + const t = lsbForLevel(e); + return new S2Cell(this._cellId & -t | t); +}; +S2Cell.prototype.getCenter = function(e) { + e = defaultValue(e, Ellipsoid.WGS84); + let t = getS2Center(this._cellId, this._level); + t = Cartesian3.normalize(t, t); + const n = new Cartographic.fromCartesian( + t, + Ellipsoid.UNIT_SPHERE + ); + return Cartographic.toCartesian(n, e, new Cartesian3()); +}; +S2Cell.prototype.getVertex = function(e, t) { + t = defaultValue(t, Ellipsoid.WGS84); + let n = getS2Vertex(this._cellId, this._level, e); + n = Cartesian3.normalize(n, n); + const i = new Cartographic.fromCartesian( + n, + Ellipsoid.UNIT_SPHERE + ); + return Cartographic.toCartesian(i, t, new Cartesian3()); +}; +S2Cell.fromFacePositionLevel = function(e, t, n) { + const i = (e < 4 ? "0" : "") + (e < 2 ? "0" : "") + e.toString(2), r = t.toString(2), o = Array( + 2 * n - r.length + 1 + ).join("0"), s = Array(S2_POSITION_BITS - 2 * n).join("0"), c = BigInt( + `0b${i}${o}${r}1${// Adding the sentinel bit that always follows the position bits. + s}` + ); + return new S2Cell(c); +}; +function getS2Center(e, t) { + const n = convertCellIdToFaceSiTi(e, t); + return convertFaceSiTitoXYZ(n[0], n[1], n[2]); +} +function getS2Vertex(e, t, n) { + const i = convertCellIdToFaceIJ(e), r = convertIJLeveltoBoundUV([i[1], i[2]], t), o = n >> 1 & 1; + return convertFaceUVtoXYZ(i[0], r[0][o ^ n & 1], r[1][o]); +} +function convertCellIdToFaceSiTi(e, t) { + const n = convertCellIdToFaceIJ(e), i = n[0], r = n[1], o = n[2], s = t === 30, c = !s && (BigInt(r) ^ e >> BigInt(2)) & BigInt(1), l = s ? 1 : c ? 2 : 0, d = (r << 1) + l, f = (o << 1) + l; + return [i, d, f]; +} +function convertCellIdToFaceIJ(e) { + S2_LOOKUP_POSITIONS.length === 0 && generateLookupTable(); + const t = Number(e >> BigInt(S2_POSITION_BITS)); + let n = t & S2_SWAP_MASK; + const i = (1 << S2_LOOKUP_BITS) - 1; + let r = 0, o = 0; + for (let s = 7; s >= 0; s--) { + const l = (1 << 2 * (s === 7 ? S2_MAX_LEVEL - 7 * S2_LOOKUP_BITS : S2_LOOKUP_BITS)) - 1; + n += Number( + e >> BigInt(s * 2 * S2_LOOKUP_BITS + 1) & BigInt(l) + // eslint-disable-line + ) << 2, n = S2_LOOKUP_IJ[n]; + const d = s * S2_LOOKUP_BITS; + r += n >> S2_LOOKUP_BITS + 2 << d, o += (n >> 2 & i) << d, n &= S2_SWAP_MASK | S2_INVERT_MASK; + } + return [t, r, o]; +} +function convertFaceSiTitoXYZ(e, t, n) { + const i = convertSiTitoST(t), r = convertSiTitoST(n), o = convertSTtoUV(i), s = convertSTtoUV(r); + return convertFaceUVtoXYZ(e, o, s); +} +function convertFaceUVtoXYZ(e, t, n) { + switch (e) { + case 0: + return new Cartesian3(1, t, n); + case 1: + return new Cartesian3(-t, 1, n); + case 2: + return new Cartesian3(-t, -n, 1); + case 3: + return new Cartesian3(-1, -n, -t); + case 4: + return new Cartesian3(n, -1, -t); + default: + return new Cartesian3(n, t, -1); + } +} +function convertSTtoUV(e) { + return e >= 0.5 ? 1 / 3 * (4 * e * e - 1) : 1 / 3 * (1 - 4 * (1 - e) * (1 - e)); +} +function convertSiTitoST(e) { + return 1 / S2_MAX_SITI * e; +} +function convertIJLeveltoBoundUV(e, t) { + const n = [[], []], i = getSizeIJ(t); + for (let r = 0; r < 2; ++r) { + const o = e[r] & -i, s = o + i; + n[r][0] = convertSTtoUV(convertIJtoSTMinimum(o)), n[r][1] = convertSTtoUV(convertIJtoSTMinimum(s)); + } + return n; +} +function getSizeIJ(e) { + return 1 << S2_MAX_LEVEL - e >>> 0; +} +function convertIJtoSTMinimum(e) { + return 1 / S2_LIMIT_IJ * e; +} +function generateLookupCell(e, t, n, i, r, o) { + if (e === S2_LOOKUP_BITS) { + const s = (t << S2_LOOKUP_BITS) + n; + S2_LOOKUP_POSITIONS[(s << 2) + i] = (r << 2) + o, S2_LOOKUP_IJ[(r << 2) + i] = (s << 2) + o; + } else { + e++, t <<= 1, n <<= 1, r <<= 2; + const s = S2_POSITION_TO_IJ[o]; + generateLookupCell( + e, + t + (s[0] >> 1), + n + (s[0] & 1), + i, + r, + o ^ S2_POSITION_TO_ORIENTATION_MASK[0] + ), generateLookupCell( + e, + t + (s[1] >> 1), + n + (s[1] & 1), + i, + r + 1, + o ^ S2_POSITION_TO_ORIENTATION_MASK[1] + ), generateLookupCell( + e, + t + (s[2] >> 1), + n + (s[2] & 1), + i, + r + 2, + o ^ S2_POSITION_TO_ORIENTATION_MASK[2] + ), generateLookupCell( + e, + t + (s[3] >> 1), + n + (s[3] & 1), + i, + r + 3, + o ^ S2_POSITION_TO_ORIENTATION_MASK[3] + ); + } +} +function generateLookupTable() { + generateLookupCell(0, 0, 0, 0, 0, 0), generateLookupCell(0, 0, 0, S2_SWAP_MASK, 0, S2_SWAP_MASK), generateLookupCell(0, 0, 0, S2_INVERT_MASK, 0, S2_INVERT_MASK), generateLookupCell( + 0, + 0, + 0, + S2_SWAP_MASK | S2_INVERT_MASK, + 0, + S2_SWAP_MASK | S2_INVERT_MASK + ); +} +function lsb(e) { + return e & ~e + BigInt(1); +} +function lsbForLevel(e) { + return BigInt(1) << BigInt(2 * (S2_MAX_LEVEL - e)); +} +const Mod67BitPosition = [ + 64, + 0, + 1, + 39, + 2, + 15, + 40, + 23, + 3, + 12, + 16, + 59, + 41, + 19, + 24, + 54, + 4, + 64, + 13, + 10, + 17, + 62, + 60, + 28, + 42, + 30, + 20, + 51, + 25, + 44, + 55, + 47, + 5, + 32, + 65, + 38, + 14, + 22, + 11, + 58, + 18, + 53, + 63, + 9, + 61, + 27, + 29, + 50, + 43, + 46, + 31, + 37, + 21, + 57, + 52, + 8, + 26, + 49, + 45, + 36, + 56, + 7, + 48, + 35, + 6, + 34, + 33, + 0 +]; +function countTrailingZeroBits(e) { + return Mod67BitPosition[(-e & e) % BigInt(67)]; +} +function hasExtension(e, t) { + return defined(e) && defined(e.extensions) && defined(e.extensions[t]); +} +function ImplicitAvailabilityBitstream(e) { + const t = e.lengthBits; + let n = e.availableCount; + const i = e.constant, r = e.bitstream; + if (defined(i)) + n = t; + else { + const o = Math.ceil(t / 8); + if (r.length !== o) + throw new RuntimeError( + `Availability bitstream must be exactly ${o} bytes long to store ${t} bits. Actual bitstream was ${r.length} bytes long.` + ); + const s = defaultValue( + e.computeAvailableCountEnabled, + !1 + ); + !defined(n) && s && (n = count1Bits(r, t)); + } + this._lengthBits = t, this._availableCount = n, this._constant = i, this._bitstream = r; +} +function count1Bits(e, t) { + let n = 0; + for (let i = 0; i < t; i++) { + const r = i >> 3, o = i % 8; + n += e[r] >> o & 1; + } + return n; +} +Object.defineProperties(ImplicitAvailabilityBitstream.prototype, { + /** + * The length of the bitstream in bits. + * + * @memberof ImplicitAvailabilityBitstream.prototype + * + * @type {number} + * @readonly + * @private + */ + lengthBits: { + get: function() { + return this._lengthBits; + } + }, + /** + * The number of bits in the bitstream with value 1. + * + * @memberof ImplicitAvailabilityBitstream.prototype + * + * @type {number} + * @readonly + * @private + */ + availableCount: { + get: function() { + return this._availableCount; + } + } +}); +ImplicitAvailabilityBitstream.prototype.getBit = function(e) { + if (defined(this._constant)) + return this._constant; + const t = e >> 3, n = e % 8; + return (this._bitstream[t] >> n & 1) === 1; +}; +function ImplicitMetadataView(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.metadataTable, n = e.class, i = e.entityId, r = e.propertyTableJson; + this._class = n, this._metadataTable = t, this._entityId = i, this._extensions = r.extensions, this._extras = r.extras; +} +Object.defineProperties(ImplicitMetadataView.prototype, { + /** + * The class that properties conform to. + * + * @memberof ImplicitMetadataView.prototype + * @type {MetadataClass} + * @readonly + */ + class: { + get: function() { + return this._class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof ImplicitMetadataView.prototype + * @type {object} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof ImplicitMetadataView.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +ImplicitMetadataView.prototype.hasProperty = function(e) { + return this._metadataTable.hasProperty(e); +}; +ImplicitMetadataView.prototype.hasPropertyBySemantic = function(e) { + return this._metadataTable.hasPropertyBySemantic(e); +}; +ImplicitMetadataView.prototype.getPropertyIds = function(e) { + return this._metadataTable.getPropertyIds(e); +}; +ImplicitMetadataView.prototype.getProperty = function(e) { + return this._metadataTable.getProperty(this._entityId, e); +}; +ImplicitMetadataView.prototype.setProperty = function(e, t) { + return this._metadataTable.setProperty(this._entityId, e, t); +}; +ImplicitMetadataView.prototype.getPropertyBySemantic = function(e) { + return this._metadataTable.getPropertyBySemantic(this._entityId, e); +}; +ImplicitMetadataView.prototype.setPropertyBySemantic = function(e, t) { + return this._metadataTable.setPropertyBySemantic( + this._entityId, + e, + t + ); +}; +const ImplicitSubdivisionScheme = { + /** + * A quadtree divides a parent tile into four children, split at the midpoint + * of the x and y dimensions of the bounding box + * @type {string} + * @constant + * @private + */ + QUADTREE: "QUADTREE", + /** + * An octree divides a parent tile into eight children, split at the midpoint + * of the x, y, and z dimensions of the bounding box. + * @type {string} + * @constant + * @private + */ + OCTREE: "OCTREE" +}; +ImplicitSubdivisionScheme.getBranchingFactor = function(e) { + switch (e) { + case ImplicitSubdivisionScheme.OCTREE: + return 8; + case ImplicitSubdivisionScheme.QUADTREE: + return 4; + } +}; +const ImplicitSubdivisionScheme$1 = Object.freeze(ImplicitSubdivisionScheme); +function MetadataEntity() { +} +Object.defineProperties(MetadataEntity.prototype, { + /** + * The class that properties conform to. + * + * @memberof MetadataEntity.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + } +}); +MetadataEntity.prototype.hasProperty = function(e) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.hasPropertyBySemantic = function(e) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.getPropertyIds = function(e) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.getProperty = function(e) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.setProperty = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.getPropertyBySemantic = function(e) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.prototype.setPropertyBySemantic = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +MetadataEntity.hasProperty = function(e, t, n) { + if (defined(t[e])) + return !0; + const i = n.properties; + if (!defined(i)) + return !1; + const r = i[e]; + return !!(defined(r) && defined(r.default)); +}; +MetadataEntity.hasPropertyBySemantic = function(e, t, n) { + const i = n.propertiesBySemantic; + if (!defined(i)) + return !1; + const r = i[e]; + return defined(r); +}; +MetadataEntity.getPropertyIds = function(e, t, n) { + n = defined(n) ? n : [], n.length = 0; + for (const r in e) + e.hasOwnProperty(r) && defined(e[r]) && n.push(r); + const i = t.properties; + if (defined(i)) + for (const r in i) + i.hasOwnProperty(r) && !defined(e[r]) && defined(i[r].default) && n.push(r); + return n; +}; +MetadataEntity.getProperty = function(e, t, n) { + const i = n.properties[e]; + let r = t[e]; + Array.isArray(r) && (r = r.slice()); + const o = !0; + if (r = i.handleNoData(r), !defined(r) && defined(i.default)) + return r = clone$1(i.default, !0), i.unpackVectorAndMatrixTypes(r, o); + if (defined(r)) + return r = i.normalize(r), r = i.applyValueTransform(r), i.unpackVectorAndMatrixTypes(r, o); +}; +MetadataEntity.setProperty = function(e, t, n, i) { + if (!defined(n[e])) + return !1; + Array.isArray(t) && (t = t.slice()); + let r; + const o = i.properties; + return defined(o) && (r = o[e]), defined(r) && (t = r.packVectorAndMatrixTypes(t, !0), t = r.unapplyValueTransform(t), t = r.unnormalize(t)), n[e] = t, !0; +}; +MetadataEntity.getPropertyBySemantic = function(e, t, n) { + const i = n.propertiesBySemantic; + if (!defined(i)) + return; + const r = i[e]; + if (defined(r)) + return MetadataEntity.getProperty(r.id, t, n); +}; +MetadataEntity.setPropertyBySemantic = function(e, t, n, i) { + const r = i.propertiesBySemantic; + if (!defined(r)) + return !1; + const o = i.propertiesBySemantic[e]; + return defined(o) ? MetadataEntity.setProperty( + o.id, + t, + n, + i + ) : !1; +}; +function ImplicitSubtreeMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.subtreeMetadata, n = e.class, i = defined(t.properties) ? t.properties : {}; + this._class = n, this._properties = i, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(ImplicitSubtreeMetadata.prototype, { + /** + * The class that properties conform to. + * + * @memberof ImplicitSubtreeMetadata.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof ImplicitSubtreeMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof ImplicitSubtreeMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +ImplicitSubtreeMetadata.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +ImplicitSubtreeMetadata.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +ImplicitSubtreeMetadata.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +ImplicitSubtreeMetadata.prototype.getProperty = function(e) { + return MetadataEntity.getProperty(e, this._properties, this._class); +}; +ImplicitSubtreeMetadata.prototype.setProperty = function(e, t) { + return MetadataEntity.setProperty( + e, + t, + this._properties, + this._class + ); +}; +ImplicitSubtreeMetadata.prototype.getPropertyBySemantic = function(e) { + return MetadataEntity.getPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +ImplicitSubtreeMetadata.prototype.setPropertyBySemantic = function(e, t) { + return MetadataEntity.setPropertyBySemantic( + e, + t, + this._properties, + this._class + ); +}; +const MetadataComponentType = { + /** + * An 8-bit signed integer + * + * @type {string} + * @constant + */ + INT8: "INT8", + /** + * An 8-bit unsigned integer + * + * @type {string} + * @constant + */ + UINT8: "UINT8", + /** + * A 16-bit signed integer + * + * @type {string} + * @constant + */ + INT16: "INT16", + /** + * A 16-bit unsigned integer + * + * @type {string} + * @constant + */ + UINT16: "UINT16", + /** + * A 32-bit signed integer + * + * @type {string} + * @constant + */ + INT32: "INT32", + /** + * A 32-bit unsigned integer + * + * @type {string} + * @constant + */ + UINT32: "UINT32", + /** + * A 64-bit signed integer. This type requires BigInt support. + * + * @see FeatureDetection.supportsBigInt + * + * @type {string} + * @constant + */ + INT64: "INT64", + /** + * A 64-bit signed integer. This type requires BigInt support + * + * @see FeatureDetection.supportsBigInt + * + * @type {string} + * @constant + */ + UINT64: "UINT64", + /** + * A 32-bit (single precision) floating point number + * + * @type {string} + * @constant + */ + FLOAT32: "FLOAT32", + /** + * A 64-bit (double precision) floating point number + * + * @type {string} + * @constant + */ + FLOAT64: "FLOAT64" +}; +MetadataComponentType.getMinimum = function(e) { + switch (e) { + case MetadataComponentType.INT8: + return -128; + case MetadataComponentType.UINT8: + return 0; + case MetadataComponentType.INT16: + return -32768; + case MetadataComponentType.UINT16: + return 0; + case MetadataComponentType.INT32: + return -2147483648; + case MetadataComponentType.UINT32: + return 0; + case MetadataComponentType.INT64: + return FeatureDetection.supportsBigInt() ? BigInt("-9223372036854775808") : -Math.pow(2, 63); + case MetadataComponentType.UINT64: + return FeatureDetection.supportsBigInt() ? BigInt(0) : 0; + case MetadataComponentType.FLOAT32: + return -34028234663852886e22; + case MetadataComponentType.FLOAT64: + return -Number.MAX_VALUE; + } +}; +MetadataComponentType.getMaximum = function(e) { + switch (e) { + case MetadataComponentType.INT8: + return 127; + case MetadataComponentType.UINT8: + return 255; + case MetadataComponentType.INT16: + return 32767; + case MetadataComponentType.UINT16: + return 65535; + case MetadataComponentType.INT32: + return 2147483647; + case MetadataComponentType.UINT32: + return 4294967295; + case MetadataComponentType.INT64: + return FeatureDetection.supportsBigInt() ? BigInt("9223372036854775807") : Math.pow(2, 63) - 1; + case MetadataComponentType.UINT64: + return FeatureDetection.supportsBigInt() ? BigInt("18446744073709551615") : Math.pow(2, 64) - 1; + case MetadataComponentType.FLOAT32: + return 34028234663852886e22; + case MetadataComponentType.FLOAT64: + return Number.MAX_VALUE; + } +}; +MetadataComponentType.isIntegerType = function(e) { + switch (e) { + case MetadataComponentType.INT8: + case MetadataComponentType.UINT8: + case MetadataComponentType.INT16: + case MetadataComponentType.UINT16: + case MetadataComponentType.INT32: + case MetadataComponentType.UINT32: + case MetadataComponentType.INT64: + case MetadataComponentType.UINT64: + return !0; + default: + return !1; + } +}; +MetadataComponentType.isUnsignedIntegerType = function(e) { + switch (e) { + case MetadataComponentType.UINT8: + case MetadataComponentType.UINT16: + case MetadataComponentType.UINT32: + case MetadataComponentType.UINT64: + return !0; + default: + return !1; + } +}; +MetadataComponentType.isVectorCompatible = function(e) { + switch (e) { + case MetadataComponentType.INT8: + case MetadataComponentType.UINT8: + case MetadataComponentType.INT16: + case MetadataComponentType.UINT16: + case MetadataComponentType.INT32: + case MetadataComponentType.UINT32: + case MetadataComponentType.FLOAT32: + case MetadataComponentType.FLOAT64: + return !0; + default: + return !1; + } +}; +MetadataComponentType.normalize = function(e, t) { + return Math.max( + Number(e) / Number(MetadataComponentType.getMaximum(t)), + -1 + ); +}; +MetadataComponentType.unnormalize = function(e, t) { + const n = MetadataComponentType.getMaximum(t), i = MetadataComponentType.isUnsignedIntegerType(t) ? 0 : -n; + return e = CesiumMath.sign(e) * Math.round(Math.abs(e) * Number(n)), (t === MetadataComponentType.INT64 || t === MetadataComponentType.UINT64) && FeatureDetection.supportsBigInt() && (e = BigInt(e)), e > n ? n : e < i ? i : e; +}; +MetadataComponentType.applyValueTransform = function(e, t, n) { + return n * e + t; +}; +MetadataComponentType.unapplyValueTransform = function(e, t, n) { + return n === 0 ? 0 : (e - t) / n; +}; +MetadataComponentType.getSizeInBytes = function(e) { + switch (e) { + case MetadataComponentType.INT8: + case MetadataComponentType.UINT8: + return 1; + case MetadataComponentType.INT16: + case MetadataComponentType.UINT16: + return 2; + case MetadataComponentType.INT32: + case MetadataComponentType.UINT32: + return 4; + case MetadataComponentType.INT64: + case MetadataComponentType.UINT64: + return 8; + case MetadataComponentType.FLOAT32: + return 4; + case MetadataComponentType.FLOAT64: + return 8; + } +}; +MetadataComponentType.fromComponentDatatype = function(e) { + switch (e) { + case ComponentDatatype$1.BYTE: + return MetadataComponentType.INT8; + case ComponentDatatype$1.UNSIGNED_BYTE: + return MetadataComponentType.UINT8; + case ComponentDatatype$1.SHORT: + return MetadataComponentType.INT16; + case ComponentDatatype$1.UNSIGNED_SHORT: + return MetadataComponentType.UINT16; + case ComponentDatatype$1.INT: + return MetadataComponentType.INT32; + case ComponentDatatype$1.UNSIGNED_INT: + return MetadataComponentType.UINT32; + case ComponentDatatype$1.FLOAT: + return MetadataComponentType.FLOAT32; + case ComponentDatatype$1.DOUBLE: + return MetadataComponentType.FLOAT64; + } +}; +MetadataComponentType.toComponentDatatype = function(e) { + switch (e) { + case MetadataComponentType.INT8: + return ComponentDatatype$1.BYTE; + case MetadataComponentType.UINT8: + return ComponentDatatype$1.UNSIGNED_BYTE; + case MetadataComponentType.INT16: + return ComponentDatatype$1.SHORT; + case MetadataComponentType.UINT16: + return ComponentDatatype$1.UNSIGNED_SHORT; + case MetadataComponentType.INT32: + return ComponentDatatype$1.INT; + case MetadataComponentType.UINT32: + return ComponentDatatype$1.UNSIGNED_INT; + case MetadataComponentType.FLOAT32: + return ComponentDatatype$1.FLOAT; + case MetadataComponentType.FLOAT64: + return ComponentDatatype$1.DOUBLE; + } +}; +const MetadataComponentType$1 = Object.freeze(MetadataComponentType), MetadataType = { + /** + * A single component + * + * @type {string} + * @constant + */ + SCALAR: "SCALAR", + /** + * A vector with two components + * + * @type {string} + * @constant + */ + VEC2: "VEC2", + /** + * A vector with three components + * + * @type {string} + * @constant + */ + VEC3: "VEC3", + /** + * A vector with four components + * + * @type {string} + * @constant + */ + VEC4: "VEC4", + /** + * A 2x2 matrix, stored in column-major format. + * + * @type {string} + * @constant + */ + MAT2: "MAT2", + /** + * A 3x3 matrix, stored in column-major format. + * + * @type {string} + * @constant + */ + MAT3: "MAT3", + /** + * A 4x4 matrix, stored in column-major format. + * + * @type {string} + * @constant + */ + MAT4: "MAT4", + /** + * A boolean (true/false) value + * + * @type {string} + * @constant + */ + BOOLEAN: "BOOLEAN", + /** + * A UTF-8 encoded string value + * + * @type {string} + * @constant + */ + STRING: "STRING", + /** + * An enumerated value. This type is used in conjunction with a {@link MetadataEnum} to describe the valid values. + * + * @see MetadataEnum + * + * @type {string} + * @constant + */ + ENUM: "ENUM" +}; +MetadataType.isVectorType = function(e) { + switch (e) { + case MetadataType.VEC2: + case MetadataType.VEC3: + case MetadataType.VEC4: + return !0; + default: + return !1; + } +}; +MetadataType.isMatrixType = function(e) { + switch (e) { + case MetadataType.MAT2: + case MetadataType.MAT3: + case MetadataType.MAT4: + return !0; + default: + return !1; + } +}; +MetadataType.getComponentCount = function(e) { + switch (e) { + case MetadataType.SCALAR: + case MetadataType.STRING: + case MetadataType.ENUM: + case MetadataType.BOOLEAN: + return 1; + case MetadataType.VEC2: + return 2; + case MetadataType.VEC3: + return 3; + case MetadataType.VEC4: + return 4; + case MetadataType.MAT2: + return 4; + case MetadataType.MAT3: + return 9; + case MetadataType.MAT4: + return 16; + } +}; +MetadataType.getMathType = function(e) { + switch (e) { + case MetadataType.VEC2: + return Cartesian2; + case MetadataType.VEC3: + return Cartesian3; + case MetadataType.VEC4: + return Cartesian4; + case MetadataType.MAT2: + return Matrix2; + case MetadataType.MAT3: + return Matrix3; + case MetadataType.MAT4: + return Matrix4; + default: + return; + } +}; +const MetadataType$1 = Object.freeze(MetadataType); +function MetadataClassProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.type, i = e.componentType, r = e.enumType, o = defined(i) && MetadataComponentType$1.isIntegerType(i) && defaultValue(e.normalized, !1); + this._id = t, this._name = e.name, this._description = e.description, this._semantic = e.semantic, this._isLegacyExtension = e.isLegacyExtension, this._type = n, this._componentType = i, this._enumType = r, this._valueType = defined(r) ? r.valueType : i, this._isArray = defaultValue(e.isArray, !1), this._isVariableLengthArray = defaultValue( + e.isVariableLengthArray, + !1 + ), this._arrayLength = e.arrayLength, this._min = clone$1(e.min, !0), this._max = clone$1(e.max, !0), this._normalized = o; + let s = clone$1(e.offset, !0), c = clone$1(e.scale, !0); + const l = defined(s) || defined(c), d = !0; + defined(s) || (s = this.expandConstant(0, d)), defined(c) || (c = this.expandConstant(1, d)), this._offset = s, this._scale = c, this._hasValueTransform = l, this._noData = clone$1(e.noData, !0), this._default = clone$1(e.default, !0), this._required = defaultValue(e.required, !0), this._extras = clone$1(e.extras, !0), this._extensions = clone$1(e.extensions, !0); +} +MetadataClassProperty.fromJson = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.property, i = isLegacy(n), r = parseType(n, e.enums); + let o; + return defined(i) ? i ? o = defined(n.optional) ? !n.optional : !0 : o = defaultValue(n.required, !1) : o = !1, new MetadataClassProperty({ + id: t, + type: r.type, + componentType: r.componentType, + enumType: r.enumType, + isArray: r.isArray, + isVariableLengthArray: r.isVariableLengthArray, + arrayLength: r.arrayLength, + normalized: n.normalized, + min: n.min, + max: n.max, + offset: n.offset, + scale: n.scale, + noData: n.noData, + default: n.default, + required: o, + name: n.name, + description: n.description, + semantic: n.semantic, + extras: n.extras, + extensions: n.extensions, + isLegacyExtension: i + }); +}; +Object.defineProperties(MetadataClassProperty.prototype, { + /** + * The ID of the property. + * + * @memberof MetadataClassProperty.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The name of the property. + * + * @memberof MetadataClassProperty.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The description of the property. + * + * @memberof MetadataClassProperty.prototype + * @type {string} + * @readonly + */ + description: { + get: function() { + return this._description; + } + }, + /** + * The type of the property such as SCALAR, VEC2, VEC3 + * + * @memberof MetadataClassProperty.prototype + * @type {MetadataType} + * @readonly + */ + type: { + get: function() { + return this._type; + } + }, + /** + * The enum type of the property. Only defined when type is ENUM. + * + * @memberof MetadataClassProperty.prototype + * @type {MetadataEnum} + * @readonly + */ + enumType: { + get: function() { + return this._enumType; + } + }, + /** + * The component type of the property. This includes integer + * (e.g. INT8 or UINT16), and floating point (FLOAT32 and FLOAT64) values + * + * @memberof MetadataClassProperty.prototype + * @type {MetadataComponentType} + * @readonly + */ + componentType: { + get: function() { + return this._componentType; + } + }, + /** + * The datatype used for storing each component of the property. This + * is usually the same as componentType except for ENUM, where this + * returns an integer type + * + * @memberof MetadataClassProperty.prototype + * @type {MetadataComponentType} + * @readonly + * @private + */ + valueType: { + get: function() { + return this._valueType; + } + }, + /** + * True if a property is an array (either fixed length or variable length), + * false otherwise. + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + */ + isArray: { + get: function() { + return this._isArray; + } + }, + /** + * True if a property is a variable length array, false otherwise. + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + */ + isVariableLengthArray: { + get: function() { + return this._isVariableLengthArray; + } + }, + /** + * The number of array elements. Only defined for fixed-size + * arrays. + * + * @memberof MetadataClassProperty.prototype + * @type {number} + * @readonly + */ + arrayLength: { + get: function() { + return this._arrayLength; + } + }, + /** + * Whether the property is normalized. + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + */ + normalized: { + get: function() { + return this._normalized; + } + }, + /** + * A number or an array of numbers storing the maximum allowable value of this property. Only defined when type is a numeric type. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + */ + max: { + get: function() { + return this._max; + } + }, + /** + * A number or an array of numbers storing the minimum allowable value of this property. Only defined when type is a numeric type. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + */ + min: { + get: function() { + return this._min; + } + }, + /** + * The no-data sentinel value that represents null values + * + * @memberof MetadataClassProperty.prototype + * @type {boolean|number|string|Array} + * @readonly + */ + noData: { + get: function() { + return this._noData; + } + }, + /** + * A default value to use when an entity's property value is not defined. + * + * @memberof MetadataClassProperty.prototype + * @type {boolean|number|string|Array} + * @readonly + */ + default: { + get: function() { + return this._default; + } + }, + /** + * Whether the property is required. + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + */ + required: { + get: function() { + return this._required; + } + }, + /** + * An identifier that describes how this property should be interpreted. + * + * @memberof MetadataClassProperty.prototype + * @type {string} + * @readonly + */ + semantic: { + get: function() { + return this._semantic; + } + }, + /** + * True if offset/scale should be applied. If both offset/scale were + * undefined, they default to identity so this property is set false + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + * @private + */ + hasValueTransform: { + get: function() { + return this._hasValueTransform; + } + }, + /** + * The offset to be added to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + */ + offset: { + get: function() { + return this._offset; + } + }, + /** + * The scale to be multiplied to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + */ + scale: { + get: function() { + return this._scale; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataClassProperty.prototype + * @type {*} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataClassProperty.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +function isLegacy(e) { + if (e.type === "ARRAY") + return !0; + const t = e.type; + if (t === MetadataType$1.SCALAR || MetadataType$1.isMatrixType(t) || MetadataType$1.isVectorType(t)) + return !1; + if (defined(MetadataComponentType$1[t])) + return !0; + if (defined(e.noData) || defined(e.scale) || defined(e.offset) || defined(e.required) || defined(e.count) || defined(e.array) || defined(e.optional)) + return !1; +} +function parseType(e, t) { + const n = e.type, i = e.componentType, r = n === "ARRAY"; + let o, s, c; + r ? (o = !0, s = e.componentCount, c = !defined(s)) : e.array ? (o = !0, s = e.count, c = !defined(e.count)) : (o = !1, s = void 0, c = !1); + let l; + if (defined(e.enumType) && (l = t[e.enumType]), n === MetadataType$1.ENUM) + return { + type: n, + componentType: void 0, + enumType: l, + valueType: l.valueType, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (r && i === MetadataType$1.ENUM) + return { + type: i, + componentType: void 0, + enumType: l, + valueType: l.valueType, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (n === MetadataType$1.SCALAR || MetadataType$1.isMatrixType(n) || MetadataType$1.isVectorType(n)) + return { + type: n, + componentType: i, + enumType: void 0, + valueType: i, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (n === MetadataType$1.BOOLEAN || n === MetadataType$1.STRING) + return { + type: n, + componentType: void 0, + enumType: void 0, + valueType: void 0, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (r && (i === MetadataType$1.BOOLEAN || i === MetadataType$1.STRING)) + return { + type: i, + componentType: void 0, + enumType: void 0, + valueType: void 0, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (defined(i) && defined(MetadataComponentType$1[i])) + return { + type: MetadataType$1.SCALAR, + componentType: i, + enumType: void 0, + valueType: i, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; + if (defined(MetadataComponentType$1[n])) + return { + type: MetadataType$1.SCALAR, + componentType: n, + enumType: void 0, + valueType: n, + isArray: o, + isVariableLengthArray: c, + arrayLength: s + }; +} +MetadataClassProperty.prototype.normalize = function(e) { + return this._normalized ? normalizeInPlace( + e, + this._valueType, + MetadataComponentType$1.normalize + ) : e; +}; +MetadataClassProperty.prototype.unnormalize = function(e) { + return this._normalized ? normalizeInPlace( + e, + this._valueType, + MetadataComponentType$1.unnormalize + ) : e; +}; +MetadataClassProperty.prototype.applyValueTransform = function(e) { + return !this._hasValueTransform || this._isVariableLengthArray ? e : MetadataClassProperty.valueTransformInPlace( + e, + this._offset, + this._scale, + MetadataComponentType$1.applyValueTransform + ); +}; +MetadataClassProperty.prototype.unapplyValueTransform = function(e) { + return !this._hasValueTransform || this._isVariableLengthArray ? e : MetadataClassProperty.valueTransformInPlace( + e, + this._offset, + this._scale, + MetadataComponentType$1.unapplyValueTransform + ); +}; +MetadataClassProperty.prototype.expandConstant = function(e, t) { + t = defaultValue(t, !1); + const n = this._isArray, i = this._arrayLength, r = MetadataType$1.getComponentCount(this._type), o = n && r > 1; + if (!n && r === 1) + return e; + if (!n) + return new Array(r).fill(e); + if (!o) + return new Array(i).fill(e); + if (!t) + return new Array(this._arrayLength * r).fill(e); + const s = new Array(r).fill(e); + return new Array(this._arrayLength).fill(s); +}; +MetadataClassProperty.prototype.handleNoData = function(e) { + const t = this._noData; + if (!defined(t)) + return e; + if (!arrayEquals(e, t)) + return e; +}; +function arrayEquals(e, t) { + if (!Array.isArray(e)) + return e === t; + if (!Array.isArray(t) || e.length !== t.length) + return !1; + for (let n = 0; n < e.length; n++) + if (!arrayEquals(e[n], t[n])) + return !1; + return !0; +} +MetadataClassProperty.prototype.unpackVectorAndMatrixTypes = function(e, t) { + t = defaultValue(t, !1); + const n = MetadataType$1.getMathType(this._type), i = this._isArray, r = MetadataType$1.getComponentCount(this._type), o = i && r > 1; + return defined(n) ? t && o ? e.map(function(s) { + return n.unpack(s); + }) : i ? n.unpackArray(e) : n.unpack(e) : e; +}; +MetadataClassProperty.prototype.packVectorAndMatrixTypes = function(e, t) { + t = defaultValue(t, !1); + const n = MetadataType$1.getMathType(this._type), i = this._isArray, r = MetadataType$1.getComponentCount(this._type), o = i && r > 1; + return defined(n) ? t && o ? e.map(function(s) { + return n.pack(s, []); + }) : i ? n.packArray(e, []) : n.pack(e, []) : e; +}; +MetadataClassProperty.prototype.validate = function(e) { + if (!(!defined(e) && defined(this._default))) + return this._required && !defined(e) ? "required property must have a value" : this._isArray ? validateArray(this, e) : validateSingleValue(this, e); +}; +function validateArray(e, t) { + if (!Array.isArray(t)) + return `value ${t} must be an array`; + const n = t.length; + if (!e._isVariableLengthArray && n !== e._arrayLength) + return "Array length does not match property.arrayLength"; + for (let i = 0; i < n; i++) { + const r = validateSingleValue(e, t[i]); + if (defined(r)) + return r; + } +} +function validateSingleValue(e, t) { + const n = e._type, i = e._componentType, r = e._enumType, o = e._normalized; + return MetadataType$1.isVectorType(n) ? validateVector(t, n, i) : MetadataType$1.isMatrixType(n) ? validateMatrix(t, n, i) : n === MetadataType$1.STRING ? validateString(t) : n === MetadataType$1.BOOLEAN ? validateBoolean(t) : n === MetadataType$1.ENUM ? validateEnum(t, r) : validateScalar(t, i, o); +} +function validateVector(e, t, n) { + if (!MetadataComponentType$1.isVectorCompatible(n)) + return `componentType ${n} is incompatible with vector type ${t}`; + if (t === MetadataType$1.VEC2 && !(e instanceof Cartesian2)) + return `vector value ${e} must be a Cartesian2`; + if (t === MetadataType$1.VEC3 && !(e instanceof Cartesian3)) + return `vector value ${e} must be a Cartesian3`; + if (t === MetadataType$1.VEC4 && !(e instanceof Cartesian4)) + return `vector value ${e} must be a Cartesian4`; +} +function validateMatrix(e, t, n) { + if (!MetadataComponentType$1.isVectorCompatible(n)) + return `componentType ${n} is incompatible with matrix type ${t}`; + if (t === MetadataType$1.MAT2 && !(e instanceof Matrix2)) + return `matrix value ${e} must be a Matrix2`; + if (t === MetadataType$1.MAT3 && !(e instanceof Matrix3)) + return `matrix value ${e} must be a Matrix3`; + if (t === MetadataType$1.MAT4 && !(e instanceof Matrix4)) + return `matrix value ${e} must be a Matrix4`; +} +function validateString(e) { + if (typeof e != "string") + return getTypeErrorMessage(e, MetadataType$1.STRING); +} +function validateBoolean(e) { + if (typeof e != "boolean") + return getTypeErrorMessage(e, MetadataType$1.BOOLEAN); +} +function validateEnum(e, t) { + const n = typeof e; + if (defined(t)) + return n !== "string" || !defined(t.valuesByName[e]) ? `value ${e} is not a valid enum name for ${t.id}` : void 0; +} +function validateScalar(e, t, n) { + const i = typeof e; + switch (t) { + case MetadataComponentType$1.INT8: + case MetadataComponentType$1.UINT8: + case MetadataComponentType$1.INT16: + case MetadataComponentType$1.UINT16: + case MetadataComponentType$1.INT32: + case MetadataComponentType$1.UINT32: + case MetadataComponentType$1.FLOAT32: + case MetadataComponentType$1.FLOAT64: + return i !== "number" ? getTypeErrorMessage(e, t) : isFinite(e) ? checkInRange(e, t, n) : getNonFiniteErrorMessage(e, t); + case MetadataComponentType$1.INT64: + case MetadataComponentType$1.UINT64: + return i !== "number" && i !== "bigint" ? getTypeErrorMessage(e, t) : i === "number" && !isFinite(e) ? getNonFiniteErrorMessage(e, t) : checkInRange(e, t, n); + } +} +function getTypeErrorMessage(e, t) { + return `value ${e} does not match type ${t}`; +} +function getOutOfRangeErrorMessage(e, t, n) { + let i = `value ${e} is out of range for type ${t}`; + return n && (i += " (normalized)"), i; +} +function checkInRange(e, t, n) { + if (n) { + const i = MetadataComponentType$1.isUnsignedIntegerType(t) ? 0 : -1; + return e < i || e > 1 ? getOutOfRangeErrorMessage(e, t, n) : void 0; + } + if (e < MetadataComponentType$1.getMinimum(t) || e > MetadataComponentType$1.getMaximum(t)) + return getOutOfRangeErrorMessage(e, t, n); +} +function getNonFiniteErrorMessage(e, t) { + return `value ${e} of type ${t} must be finite`; +} +function normalizeInPlace(e, t, n) { + if (!Array.isArray(e)) + return n(e, t); + for (let i = 0; i < e.length; i++) + e[i] = normalizeInPlace(e[i], t, n); + return e; +} +MetadataClassProperty.valueTransformInPlace = function(e, t, n, i) { + if (!Array.isArray(e)) + return i(e, t, n); + for (let r = 0; r < e.length; r++) + e[r] = MetadataClassProperty.valueTransformInPlace( + e[r], + t[r], + n[r], + i + ); + return e; +}; +function MetadataTableProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.count, n = e.property, i = e.classProperty, r = e.bufferViews, o = i.type, s = i.isArray, c = i.isVariableLengthArray; + let l = i.valueType; + const d = i.enumType, f = o === MetadataType$1.STRING, h = o === MetadataType$1.BOOLEAN; + let p = 0, m; + if (c) { + let R = defaultValue( + n.arrayOffsetType, + n.offsetType + ); + R = defaultValue( + MetadataComponentType$1[R], + MetadataComponentType$1.UINT32 + ); + const L = defaultValue( + n.arrayOffsets, + n.arrayOffsetBufferView + ); + m = new BufferView( + r[L], + R, + t + 1 + ), p += m.typedArray.byteLength; + } + const _ = MetadataType$1.getComponentCount(o); + let y; + c ? y = m.get(t) - m.get(0) : s ? y = t * i.arrayLength : y = t; + const C = _ * y; + let T; + if (f) { + let R = defaultValue( + n.stringOffsetType, + n.offsetType + ); + R = defaultValue( + MetadataComponentType$1[R], + MetadataComponentType$1.UINT32 + ); + const L = defaultValue( + n.stringOffsets, + n.stringOffsetBufferView + ); + T = new BufferView( + r[L], + R, + C + 1 + ), p += T.typedArray.byteLength; + } + (f || h) && (l = MetadataComponentType$1.UINT8); + let x; + f ? x = T.get(C) - T.get(0) : h ? x = Math.ceil(C / 8) : x = C; + const b = defaultValue(n.values, n.bufferView), S = new BufferView( + r[b], + l, + x + ); + p += S.typedArray.byteLength; + let E = n.offset, A = n.scale; + const D = i.hasValueTransform || defined(E) || defined(A); + E = defaultValue(E, i.offset), A = defaultValue(A, i.scale), E = flatten(E), A = flatten(A); + let P, I; + const M = this; + f ? P = function(R) { + return getString(R, M._values, M._stringOffsets); + } : h ? (P = function(R) { + return getBoolean(R, M._values); + }, I = function(R, L) { + setBoolean(R, M._values, L); + }) : defined(d) ? (P = function(R) { + const L = M._values.get(R); + return d.namesByValue[L]; + }, I = function(R, L) { + const g = d.valuesByName[L]; + M._values.set(R, g); + }) : (P = function(R) { + return M._values.get(R); + }, I = function(R, L) { + M._values.set(R, L); + }), this._arrayOffsets = m, this._stringOffsets = T, this._values = S, this._classProperty = i, this._count = t, this._vectorComponentCount = _, this._min = n.min, this._max = n.max, this._offset = E, this._scale = A, this._hasValueTransform = D, this._getValue = P, this._setValue = I, this._unpackedValues = void 0, this._extras = n.extras, this._extensions = n.extensions, this._byteLength = p; +} +Object.defineProperties(MetadataTableProperty.prototype, { + /** + * True if offset/scale should be applied. If both offset/scale were + * undefined, they default to identity so this property is set false + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + * @private + */ + hasValueTransform: { + get: function() { + return this._hasValueTransform; + } + }, + /** + * The offset to be added to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + * @private + */ + offset: { + get: function() { + return this._offset; + } + }, + /** + * The scale to be multiplied to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|number[]|number[][]} + * @readonly + * @private + */ + scale: { + get: function() { + return this._scale; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataTableProperty.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataTableProperty.prototype + * @type {*} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + }, + /** + * Size of all typed arrays used by this table property + * + * @memberof MetadataTableProperty.prototype + * @type {Normal} + * @readonly + * @private + */ + byteLength: { + get: function() { + return this._byteLength; + } + } +}); +MetadataTableProperty.prototype.get = function(e) { + let t = get(this, e); + return t = this._classProperty.handleNoData(t), defined(t) ? (t = this._classProperty.normalize(t), t = applyValueTransform(this, t), this._classProperty.unpackVectorAndMatrixTypes(t)) : (t = this._classProperty.default, this._classProperty.unpackVectorAndMatrixTypes(t)); +}; +MetadataTableProperty.prototype.set = function(e, t) { + const n = this._classProperty; + t = n.packVectorAndMatrixTypes(t), t = unapplyValueTransform(this, t), t = n.unnormalize(t), set(this, e, t); +}; +MetadataTableProperty.prototype.getTypedArray = function() { + if (defined(this._values)) + return this._values.typedArray; +}; +function flatten(e) { + if (!Array.isArray(e)) + return e; + const t = []; + for (let n = 0; n < e.length; n++) { + const i = e[n]; + Array.isArray(i) ? t.push.apply(t, i) : t.push(i); + } + return t; +} +function get(e, t) { + requiresUnpackForGet(e) && unpackProperty(e); + const n = e._classProperty, i = n.isArray, r = n.type, o = MetadataType$1.getComponentCount(r); + if (defined(e._unpackedValues)) { + const s = e._unpackedValues[t]; + return i ? clone$1(s, !0) : s; + } + return !i && o === 1 ? e._getValue(t) : getArrayValues(e, n, t); +} +function getArrayValues(e, t, n) { + let i, r; + if (t.isVariableLengthArray) { + i = e._arrayOffsets.get(n), r = e._arrayOffsets.get(n + 1) - i; + const s = MetadataType$1.getComponentCount(t.type); + i *= s, r *= s; + } else { + const c = defaultValue(t.arrayLength, 1) * e._vectorComponentCount; + i = n * c, r = c; + } + const o = new Array(r); + for (let s = 0; s < r; s++) + o[s] = e._getValue(i + s); + return o; +} +function set(e, t, n) { + requiresUnpackForSet(e, t, n) && unpackProperty(e); + const i = e._classProperty, r = i.isArray, o = i.type, s = MetadataType$1.getComponentCount(o); + if (defined(e._unpackedValues)) { + i.isArray && (n = clone$1(n, !0)), e._unpackedValues[t] = n; + return; + } + if (!r && s === 1) { + e._setValue(t, n); + return; + } + let c, l; + if (i.isVariableLengthArray) + c = e._arrayOffsets.get(t), l = e._arrayOffsets.get(t + 1) - c; + else { + const f = defaultValue(i.arrayLength, 1) * e._vectorComponentCount; + c = t * f, l = f; + } + for (let d = 0; d < l; ++d) + e._setValue(c + d, n[d]); +} +function getString(e, t, n) { + const i = n.get(e), r = n.get(e + 1) - i; + return getStringFromTypedArray( + t.typedArray, + i, + r + ); +} +function getBoolean(e, t) { + const n = e >> 3, i = e % 8; + return (t.typedArray[n] >> i & 1) === 1; +} +function setBoolean(e, t, n) { + const i = e >> 3, r = e % 8; + n ? t.typedArray[i] |= 1 << r : t.typedArray[i] &= ~(1 << r); +} +function getInt64NumberFallback(e, t) { + const n = t.dataView, i = e * 8; + let r = 0; + const o = (n.getUint8(i + 7) & 128) > 0; + let s = !0; + for (let c = 0; c < 8; ++c) { + let l = n.getUint8(i + c); + o && (s ? l !== 0 && (l = ~(l - 1) & 255, s = !1) : l = ~l & 255), r += l * Math.pow(256, c); + } + return o && (r = -r), r; +} +function getInt64BigIntFallback(e, t) { + const n = t.dataView, i = e * 8; + let r = BigInt(0); + const o = (n.getUint8(i + 7) & 128) > 0; + let s = !0; + for (let c = 0; c < 8; ++c) { + let l = n.getUint8(i + c); + o && (s ? l !== 0 && (l = ~(l - 1) & 255, s = !1) : l = ~l & 255), r += BigInt(l) * (BigInt(1) << BigInt(c * 8)); + } + return o && (r = -r), r; +} +function getUint64NumberFallback(e, t) { + const n = t.dataView, i = e * 8, r = n.getUint32(i, !0), o = n.getUint32(i + 4, !0); + return r + 4294967296 * o; +} +function getUint64BigIntFallback(e, t) { + const n = t.dataView, i = e * 8, r = BigInt(n.getUint32(i, !0)), o = BigInt(n.getUint32(i + 4, !0)); + return r + BigInt(4294967296) * o; +} +function getComponentDatatype(e) { + switch (e) { + case MetadataComponentType$1.INT8: + return ComponentDatatype$1.BYTE; + case MetadataComponentType$1.UINT8: + return ComponentDatatype$1.UNSIGNED_BYTE; + case MetadataComponentType$1.INT16: + return ComponentDatatype$1.SHORT; + case MetadataComponentType$1.UINT16: + return ComponentDatatype$1.UNSIGNED_SHORT; + case MetadataComponentType$1.INT32: + return ComponentDatatype$1.INT; + case MetadataComponentType$1.UINT32: + return ComponentDatatype$1.UNSIGNED_INT; + case MetadataComponentType$1.FLOAT32: + return ComponentDatatype$1.FLOAT; + case MetadataComponentType$1.FLOAT64: + return ComponentDatatype$1.DOUBLE; + } +} +function requiresUnpackForGet(e) { + if (defined(e._unpackedValues)) + return !1; + const t = e._classProperty, n = t.type, i = t.valueType; + return n === MetadataType$1.STRING || i === MetadataComponentType$1.INT64 && !FeatureDetection.supportsBigInt64Array() || i === MetadataComponentType$1.UINT64 && !FeatureDetection.supportsBigUint64Array(); +} +function requiresUnpackForSet(e, t, n) { + if (requiresUnpackForGet(e)) + return !0; + const i = e._arrayOffsets; + if (defined(i)) { + const r = i.get(t + 1) - i.get(t), o = n.length; + if (r !== o) + return !0; + } + return !1; +} +function unpackProperty(e) { + e._unpackedValues = unpackValues(e), e._arrayOffsets = void 0, e._stringOffsets = void 0, e._values = void 0; +} +function unpackValues(e) { + const t = e._count, n = new Array(t), i = e._classProperty, r = i.isArray, o = i.type, s = MetadataType$1.getComponentCount(o); + if (!r && s === 1) { + for (let c = 0; c < t; ++c) + n[c] = e._getValue(c); + return n; + } + for (let c = 0; c < t; c++) + n[c] = getArrayValues(e, i, c); + return n; +} +function applyValueTransform(e, t) { + const i = e._classProperty.isVariableLengthArray; + return !e._hasValueTransform || i ? t : MetadataClassProperty.valueTransformInPlace( + t, + e._offset, + e._scale, + MetadataComponentType$1.applyValueTransform + ); +} +function unapplyValueTransform(e, t) { + const i = e._classProperty.isVariableLengthArray; + return !e._hasValueTransform || i ? t : MetadataClassProperty.valueTransformInPlace( + t, + e._offset, + e._scale, + MetadataComponentType$1.unapplyValueTransform + ); +} +function BufferView(e, t, n) { + const i = this; + let r, o, s; + if (t === MetadataComponentType$1.INT64) + FeatureDetection.supportsBigInt() ? FeatureDetection.supportsBigInt64Array() ? (r = new BigInt64Array( + e.buffer, + e.byteOffset, + n + ), s = function(c, l) { + i.typedArray[c] = BigInt(l); + }) : (r = new Uint8Array( + e.buffer, + e.byteOffset, + n * 8 + ), o = function(c) { + return getInt64BigIntFallback(c, i); + }) : (oneTimeWarning( + "INT64 type is not fully supported on this platform. Values greater than 2^53 - 1 or less than -(2^53 - 1) may lose precision when read." + ), r = new Uint8Array( + e.buffer, + e.byteOffset, + n * 8 + ), o = function(c) { + return getInt64NumberFallback(c, i); + }); + else if (t === MetadataComponentType$1.UINT64) + FeatureDetection.supportsBigInt() ? FeatureDetection.supportsBigUint64Array() ? (r = new BigUint64Array( + e.buffer, + e.byteOffset, + n + ), s = function(c, l) { + i.typedArray[c] = BigInt(l); + }) : (r = new Uint8Array( + e.buffer, + e.byteOffset, + n * 8 + ), o = function(c) { + return getUint64BigIntFallback(c, i); + }) : (oneTimeWarning( + "UINT64 type is not fully supported on this platform. Values greater than 2^53 - 1 may lose precision when read." + ), r = new Uint8Array( + e.buffer, + e.byteOffset, + n * 8 + ), o = function(c) { + return getUint64NumberFallback(c, i); + }); + else { + const c = getComponentDatatype(t); + r = ComponentDatatype$1.createArrayBufferView( + c, + e.buffer, + e.byteOffset, + n + ), s = function(l, d) { + i.typedArray[l] = d; + }; + } + defined(o) || (o = function(c) { + return i.typedArray[c]; + }), this.typedArray = r, this.dataView = new DataView(r.buffer, r.byteOffset), this.get = o, this.set = s, this._componentType = t; +} +function MetadataTable(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.count, n = e.class; + let i = 0; + const r = {}; + if (defined(e.properties)) { + for (const o in e.properties) + if (e.properties.hasOwnProperty(o)) { + const s = new MetadataTableProperty({ + count: t, + property: e.properties[o], + classProperty: n.properties[o], + bufferViews: e.bufferViews + }); + r[o] = s, i += s.byteLength; + } + } + this._count = t, this._class = n, this._properties = r, this._byteLength = i; +} +Object.defineProperties(MetadataTable.prototype, { + /** + * The number of entities in the table. + * + * @memberof MetadataTable.prototype + * @type {number} + * @readonly + * @private + */ + count: { + get: function() { + return this._count; + } + }, + /** + * The class that properties conform to. + * + * @memberof MetadataTable.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * The size of all typed arrays used in this table. + * + * @memberof MetadataTable.prototype + * @type {number} + * @readonly + * @private + */ + byteLength: { + get: function() { + return this._byteLength; + } + } +}); +MetadataTable.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +MetadataTable.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +MetadataTable.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +MetadataTable.prototype.getProperty = function(e, t) { + const n = this._properties[t]; + let i; + return defined(n) ? i = n.get(e) : i = getDefault$1(this._class, t), i; +}; +MetadataTable.prototype.setProperty = function(e, t, n) { + const i = this._properties[t]; + return defined(i) ? (i.set(e, n), !0) : !1; +}; +MetadataTable.prototype.getPropertyBySemantic = function(e, t) { + let n; + const i = this._class.propertiesBySemantic; + if (defined(i) && (n = i[t]), defined(n)) + return this.getProperty(e, n.id); +}; +MetadataTable.prototype.setPropertyBySemantic = function(e, t, n) { + let i; + const r = this._class.propertiesBySemantic; + return defined(r) && (i = r[t]), defined(i) ? this.setProperty(e, i.id, n) : !1; +}; +MetadataTable.prototype.getPropertyTypedArray = function(e) { + const t = this._properties[e]; + if (defined(t)) + return t.getTypedArray(); +}; +MetadataTable.prototype.getPropertyTypedArrayBySemantic = function(e) { + let t; + const n = this._class.propertiesBySemantic; + if (defined(n) && (t = n[e]), defined(t)) + return this.getPropertyTypedArray(t.id); +}; +function getDefault$1(e, t) { + const n = e.properties; + if (!defined(n)) + return; + const i = n[t]; + if (defined(i) && defined(i.default)) { + let r = i.default; + return i.isArray && (r = clone$1(r, !0)), r = i.normalize(r), i.unpackVectorAndMatrixTypes(r); + } +} +function ResourceLoader() { +} +Object.defineProperties(ResourceLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof ResourceLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + } +}); +ResourceLoader.prototype.load = function() { + DeveloperError.throwInstantiationError(); +}; +ResourceLoader.prototype.unload = function() { +}; +ResourceLoader.prototype.process = function(e) { + return !1; +}; +ResourceLoader.prototype.getError = function(e, t) { + defined(t) && defined(t.message) && (e += ` +${t.message}`); + const n = new RuntimeError(e); + return defined(t) && (n.stack = `Original stack: +${t.stack} +Handler stack: +${n.stack}`), n; +}; +ResourceLoader.prototype.isDestroyed = function() { + return !1; +}; +ResourceLoader.prototype.destroy = function() { + return this.unload(), destroyObject(this); +}; +const ResourceLoaderState = { + /** + * The resource has not yet been loaded. + * + * @type {number} + * @constant + * @private + */ + UNLOADED: 0, + /** + * The resource is loading. In this state, external resources are fetched as needed. + * + * @type {number} + * @constant + * @private + */ + LOADING: 1, + /** + * The resource has finished loading, but requires further processing. + * + * @type {number} + * @constant + * @private + */ + LOADED: 2, + /** + * The resource is processing. GPU resources are allocated in this state as needed. + * + * @type {Number} + * @constant + * @private + */ + PROCESSING: 3, + /** + * The resource has finished loading and processing; the results are ready to be used. + * + * @type {number} + * @constant + * @private + */ + READY: 4, + /** + * The resource loading or processing has failed due to an error. + * + * @type {number} + * @constant + * @private + */ + FAILED: 5 +}, ResourceLoaderState$1 = Object.freeze(ResourceLoaderState); +function BufferLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.typedArray, n = e.resource, i = e.cacheKey; + this._typedArray = t, this._resource = n, this._cacheKey = i, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (BufferLoader.prototype = Object.create(ResourceLoader.prototype), BufferLoader.prototype.constructor = BufferLoader); +Object.defineProperties(BufferLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof BufferLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The typed array containing the embedded buffer contents. + * + * @memberof BufferLoader.prototype + * + * @type {Uint8Array} + * @readonly + * @private + */ + typedArray: { + get: function() { + return this._typedArray; + } + } +}); +BufferLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : defined(this._typedArray) ? (this._promise = Promise.resolve(this), this._promise) : (this._promise = loadExternalBuffer(this), this._promise); +}; +async function loadExternalBuffer(e) { + const t = e._resource; + e._state = ResourceLoaderState$1.LOADING; + try { + const n = await BufferLoader._fetchArrayBuffer(t); + return e.isDestroyed() ? void 0 : (e._typedArray = new Uint8Array(n), e._state = ResourceLoaderState$1.READY, e); + } catch (n) { + if (e.isDestroyed()) + return; + e._state = ResourceLoaderState$1.FAILED; + const i = `Failed to load external buffer: ${t.url}`; + throw e.getError(i, n); + } +} +BufferLoader._fetchArrayBuffer = function(e) { + return e.fetchArrayBuffer(); +}; +BufferLoader.prototype.unload = function() { + this._typedArray = void 0; +}; +(function() { + var e = "b9H79TebbbeJq9Geueu9Geub9Gbb9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiKLdilevlevlooroowwvwbDDbelve9Weiiviebeoweuec:G;kekr;RiOo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbe8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbdE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UbiY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbl8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbv8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UboE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbra9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbwL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbDK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbqL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbkE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbPa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9Wbsa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbzK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbHl79IV9RbODwebcekdQXq;C9oLdbk;GqeKu8Jjjjjbcjo9Rgv8Kjjjjbcbhodnalcefae0mbabcbRbN:kjjbc:GeV86bbavcjdfcbcjdzNjjjb8AdnaiTmbavcjdfadalz:tjjjb8Akabaefhrabcefhwavalfcbcbcjdal9RalcFe0EzNjjjb8Aavavcjdfalz:tjjjbhDcj;abal9Uc;WFbGgecjdaecjd6Ehqcbhkindndnaiak9nmbaDcjlfcbcjdzNjjjb8Aaqaiak9Rakaqfai6Egxcsfgecl4cifcd4hmadakal2fhPdndndnaec9WGgsTmbcbhzaPhHawhOxekdnaxmbalheinaraw9Ram6miawcbamzNjjjbamfhwaecufgembxvkkcbhAaPhOinaDaAfRbbhCaDcjlfheaOhoaxhXinaeaoRbbgQaC9RgCcetaC;acr4786bbaoalfhoaecefheaQhCaXcufgXmbkaraw9Ram6mdaOcefhOawcbamzNjjjbamfhwaAcefgAal9hmbxlkkindnaxTmbaDazfRbbhCaDcjlfheaHhoaxhXinaeaoRbbgQaC9RgCcetaC;acr4786bbaoalfhoaecefheaQhCaXcufgXmbkkaraO9Ram6mearaOcbamzNjjjbgLamfgw9RcK6mecbhKaDcjlfhOinaDcjlfaKfhYcwhAczhQceheindndnaegXce9hmbcuhoaYRbbmecbhodninaogecsSmeaecefhoaOaefcefRbbTmbkkcucbaecs6EhoxekaXcethocuaXtc;:bGcFb7hCcbheinaoaCaOaefRbb9nfhoaecefgecz9hmbkkaoaQaoaQ6geEhQaXaAaeEhAaXcetheaXcl6mbkdndndndnaAcufPdiebkaLaKco4fgeaeRbbcdciaAclSEaKci4coGtV86bbaAcw9hmeawaY8Pbb83bbawcwfaYcwf8Pbb83bbawczfhwxdkaLaKco4fgeaeRbbceaKci4coGtV86bbkdncwaA9Tg8Ambinawcb86bbawcefhwxbkkcuaAtcu7hYcbhEaOh3ina3hea8AhCcbhoinaeRbbgQaYcFeGgXaQaX6EaoaAtVhoaecefheaCcufgCmbkawao86bba3a8Afh3awcefhwaEa8AfgEcz6mbkcbheindnaOaefRbbgoaX6mbawao86bbawcefhwkaecefgecz9hmbkkdnaKczfgKas9pmbaOczfhOaraw9RcL0mekkaKas6meawTmeaHcefhHawhOazcefgzalSmixbkkcbhoxikcbhoaraw9Ralcaalca0E6mddnalc8F0mbawcbcaal9RgezNjjjbaefhwkawaDcjdfalz:tjjjbalfab9RhoxdkaDaPaxcufal2falz:tjjjb8Aaxakfhkawmbkcbhokavcjof8Kjjjjbaok9heeuaecaaeca0Eabcj;abae9Uc;WFbGgdcjdadcjd6Egdfcufad9Uae2adcl4cifcd4adV2fcefkmbcbabBdN:kjjbk:zse5u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd:e:kjjbgrc;GeV86bbalc;abfcFecjezNjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgLydbhKaLcwfydbhYaLclfydbh8AcbhEdndndninalc;abfavcsGcitfgoydlh3dndndnaoydbgoaK9hmba3a8ASmekdnaoa8A9hmba3aY9hmbaEcefhExekaoaY9hmea3aK9hmeaEcdfhEkaEc870mdaXcufhvaLaEciGcx2goc:y1jjbfydbcdtfydbh3aLaocN1jjbfydbcdtfydbh8AaLaoc:q1jjbfydbcdtfydbhKcbhodnindnalavcsGcdtfydba39hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaOa3aOSgvaYce9iaYaH9oVgoGfhOdndndncbcsavEaYaoEgvcs9hmbarce9imba3a3aAa3cefaASgvEgAcefSmecmcsavEhvkasavaEcdtc;WeGV86bbavcs9hmea3aA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbka3hAxvkcPhvasaEcdtcPV86bba3hAkavTmiavaH9omicdhocehEaQhYxlkavcufhvaEclfgEc;ab9hmbkkdnaLceaYaOSceta8AaOSEcx2gvc:q1jjbfydbcdtfydbgKTaLavcN1jjbfydbcdtfydbg8AceSGaLavc:y1jjbfydbcdtfydbg3cdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhYxdkcuhYaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydba39hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaKaOSg8EfhLdndnaYcm0mbaYcefhYxekcbcsa8AaLSgvEhYaLavfhLkdndnaEcm0mbaEcefhExekcbcsa3aLSgvEhEaLavfhLkc9:cua8EEh8FcbhvaEaYcltVgacFeGhodndndninavcj1jjbfRbbaoSmeavcefgvcz9hmbxdkka5aKaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeaa86bbaecefhekdna8EmbaKaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaKhAkdnaYcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmba3aA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka3hAkalaXcdtfaKBdbaXcefcsGhvdndnaYPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfa3BdbavcefcsGhvkcihoalc;abfaQcitfgEaKBdlaEa8ABdbaQcefcsGhYcdhEavhXaLhOxekcdhoalaXcdtfa3BdbcehEaXcefcsGhXaQhYkalc;abfaYcitfgva8ABdlava3Bdbalc;abfaQaEfcsGcitfgva3BdlavaKBdbascefhsaQaofcsGhQaCcifgCai6mbkkcbhvaeaP0mbcbhvinaeavfavcj1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd:e:kjjbk:ydewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb:e:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkcbhvaoar0mbaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:bvli99dui99ludnaeTmbcuadcetcuftcu7:Yhvdndncuaicuftcu7:YgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhrdndnakJbbbb9GTmbaxhqxekJbbjZar:l:tgqaq:maxJbbbb9GEhqJbbjZax:l:tgxax:marJbbbb9GEhrkdndnalcxfIdbgxJbbj:;axJbbj:;9GEgkJbbjZakJbbjZ9FEavNJbbbZJbbb:;axJbbbb9GEMgx:lJbbb9p9DTmbax:Ohmxekcjjjj94hmkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEaoNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;hlld99eud99eudnaeTmbdndncuaicuftcu7:YgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoalaicd7cdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNaoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk:dvdxue998Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6meaohwarhDinawc:CuBdbawclfhwaDcufgDmbkaeTmiadcl6mdarcdthqalhkcbhxinaohwakhDarhminawawydbgPaDydbgscL4cFeGc:cufcbasEgsaPas9kEBdbaDclfhDawclfhwamcufgmmbkakaqfhkaxcefgxaeSmixbkkaeTmdxekaeTmekavcb9hadcl6gqVhzarcdthxavce9hhHcbhdindndndnaHmbaqmdc:CuhDalhwarhminaDawydbgPcL4cFeGc:cufcbaPEgPaDaP9kEhDawclfhwamcufgmmbxdkkc:CuhDazmbaohwalhmarhPinawamydbgscL4cFeGgkc8Aakc8A9kEc:cufcbasEBdbamclfhmawclfhwaPcufgPmbkkaqmbcbhwarhPinaDhmdnavceSmbaoawfydbhmkdndnalawfIdbgOcjjj;8iamai9RcefgmcLt9R::NJbbbZJbbb:;aOJbbbb9GEMgO:lJbbb9p9DTmbaO:Ohsxekcjjjj94hskabawfascFFFrGamcKtVBdbawclfhwaPcufgPmbkkabaxfhbalaxfhladcefgdae9hmbkkaocjdf8Kjjjjbk;HqdCui998Jjjjjbc:qd9Rgv8Kjjjjbavc:Sefcbc;KbzNjjjb8AcbhodnadTmbcbhoaiTmbdnabae9hmbavcuadcdtgradcFFFFi0Ecbyd:m:kjjbHjjjjbbgeBd:SeavceBd:mdaeabarz:tjjjb8Akavc:GefcwfcbBdbav9cb83i:Geavc:Gefaeadaiavc:Sefz:njjjbavyd:Gehwadci9UgDcbyd:m:kjjbHjjjjbbhravc:Sefavyd:mdgqcdtfarBdbavaqcefgkBd:mdarcbaDzNjjjbhxavc:SefakcdtfcuaicdtaicFFFFi0Ecbyd:m:kjjbHjjjjbbgmBdbavaqcdfgPBd:mdawhramhkinakalIdbalarydbgscwascw6Ecdtfc;ebfIdbMUdbarclfhrakclfhkaicufgimbkavc:SefaPcdtfcuaDcdtadcFFFF970Ecbyd:m:kjjbHjjjjbbgPBdbdnadci6mbaehraPhkaDhiinakamarydbcdtfIdbamarclfydbcdtfIdbMamarcwfydbcdtfIdbMUdbarcxfhrakclfhkaicufgimbkkaqcifhoavc;qbfhzavhravyd:KehHavyd:OehOcbhscbhkcbhAcehCinarhXcihQaeakci2gLcdtfgrydbhdarclfydbhqabaAcx2fgicwfarcwfydbgKBdbaiclfaqBdbaiadBdbaxakfce86bbazaKBdwazaqBdlazadBdbaPakcdtfcbBdbdnasTmbcihQaXhiinazaQcdtfaiydbgrBdbaQaraK9harad9haraq9hGGfhQaiclfhiascufgsmbkkaAcefhAcbhsinaOaHaeasaLfcdtfydbcdtgifydbcdtfgKhrawaifgqydbgdhidnadTmbdninarydbakSmearclfhraicufgiTmdxbkkaraKadcdtfc98fydbBdbaqaqydbcufBdbkascefgsci9hmbkdndnaQTmbcuhkJbbbbhYcbhqavyd:KehKavyd:OehLindndnawazaqcdtfydbcdtgsfydbgrmbaqcefhqxekaqcs0hiamasfgdIdbh8AadalcbaqcefgqaiEcdtfIdbalarcwarcw6Ecdtfc;ebfIdbMgEUdbaEa8A:thEarcdthiaLaKasfydbcdtfhrinaParydbgscdtfgdaEadIdbMg8AUdba8AaYaYa8A9DgdEhYasakadEhkarclfhraic98fgimbkkaqaQ9hmbkakcu9hmekaCaD9pmdindnaxaCfRbbmbaChkxdkaDaCcefgC9hmbxikkaQczaQcz6EhsazhraXhzakcu9hmbkkaocdtavc:Seffc98fhrdninaoTmearydbcbyd1:kjjbH:bjjjbbarc98fhraocufhoxbkkavc:qdf8Kjjjjbk;IlevucuaicdtgvaicFFFFi0Egocbyd:m:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd:m:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd:m:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavzNjjjb8Aadci9UhDdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic:01jjbz:mjjjbkQbabaeadaic:C:jjjbz:mjjjbk9DeeuabcFeaicdtzNjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk;Wkivuo99lu8Jjjjjbc;W;Gb9Rgl8Kjjjjbcbhvalcj;Gbfcbc;KbzNjjjb8AalcuadcdtadcFFFFi0Egocbyd:m:kjjbHjjjjbbgrBdj9GalceBd;G9GalcFFF;7rBdwal9cFFF;7;3FF:;Fb83dbalcFFF97Bd;S9Gal9cFFF;7FFF:;u83d;K9Gaicd4hwdndnadmbJFFuFhDJFFuuhqJFFuuhkJFFuFhxJFFuuhmJFFuFhPxekawcdthsaehzincbhiinalaifgHazaifIdbgDaHIdbgxaxaD9EEUdbalc;K;GbfaifgHaDaHIdbgxaxaD9DEUdbaiclfgicx9hmbkazasfhzavcefgvad9hmbkalIdwhqalId;S9GhDalIdlhkalId;O9GhxalIdbhmalId;K9GhPkdndnadTmbJbbbbJbbjZJbbbbaPam:tgPaPJbbbb9DEgPaxak:tgxaxaP9DEgxaDaq:tgDaDax9DEgD:vaDJbbbb9BEhDawcdthsarhHadhzindndnaDaeIdbam:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcv2c;j:KM;jbGhvdndnaDaeclfIdbak:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcq2cM;j:KMeGavVhvdndnaDaecwfIdbaq:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaHavaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcC2c:KM;j:KdGVBdbaeasfheaHclfhHazcufgzmbkalcbcj;GbzNjjjbhiarhHadheinaiaHydbgzcFrGcx2fgvavydbcefBdbaiazcq4cFrGcx2fgvavydlcefBdlaiazcC4cFrGcx2fgzazydwcefBdwaHclfhHaecufgembxdkkalcbcj;GbzNjjjb8AkcbhHcbhzcbhecbhvinalaHfgiydbhsaiazBdbaicwfgwydbhOawavBdbaiclfgiydbhwaiaeBdbasazfhzaOavfhvawaefheaHcxfgHcj;Gb9hmbkcbhHalaocbyd:m:kjjbHjjjjbbgiBd:e9GdnadTmbabhzinazaHBdbazclfhzadaHcefgH9hmbkabhHadhzinalaraHydbgecdtfydbcFrGcx2fgvavydbgvcefBdbaiavcdtfaeBdbaHclfhHazcufgzmbkaihHadhzinalaraHydbgecdtfydbcq4cFrGcx2fgvavydlgvcefBdlabavcdtfaeBdbaHclfhHazcufgzmbkabhHadhzinalaraHydbgecdtfydbcC4cFrGcx2fgvavydwgvcefBdwaiavcdtfaeBdbaHclfhHazcufgzmbkcbhHinabaiydbcdtfaHBdbaiclfhiadaHcefgH9hmbkkclhidninaic98Smealcj;Gbfaifydbcbyd1:kjjbH:bjjjbbaic98fhixbkkalc;W;Gbf8Kjjjjbk9teiucbcbyd:q:kjjbgeabcifc98GfgbBd:q:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:kjjbgeabcrfc94GfgbBd:q:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:kjjbfgdBd:q:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk:Iddbcjwk:edb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:bc:eqkzebbbebbbdbbbaWbb", t = new Uint8Array([32, 0, 65, 2, 1, 106, 34, 33, 3, 128, 11, 4, 13, 64, 6, 253, 10, 7, 15, 116, 127, 5, 8, 12, 40, 16, 19, 54, 20, 9, 27, 255, 113, 17, 42, 67, 24, 23, 146, 148, 18, 14, 22, 45, 70, 69, 56, 114, 101, 21, 25, 63, 75, 136, 108, 28, 118, 29, 73, 115]); + if (typeof WebAssembly != "object") + return { + supported: !1 + }; + var n, i = WebAssembly.instantiate(r(e), {}).then(function(m) { + n = m.instance, n.exports.__wasm_call_ctors(), n.exports.meshopt_encodeVertexVersion(0), n.exports.meshopt_encodeIndexVersion(1); + }); + function r(m) { + for (var _ = new Uint8Array(m.length), y = 0; y < m.length; ++y) { + var C = m.charCodeAt(y); + _[y] = C > 96 ? C - 97 : C > 64 ? C - 39 : C + 4; + } + for (var T = 0, y = 0; y < m.length; ++y) + _[T++] = _[y] < 60 ? t[_[y]] : (_[y] - 60) * 64 + _[++y]; + return _.buffer.slice(0, T); + } + function o(m) { + if (!m) + throw new Error("Assertion failed"); + } + function s(m) { + return new Uint8Array(m.buffer, m.byteOffset, m.byteLength); + } + function c(m, _, y, C) { + var T = n.exports.sbrk, x = T(_.length * 4), b = T(y * 4), S = new Uint8Array(n.exports.memory.buffer), E = s(_); + S.set(E, x), C && C(x, x, _.length, y); + var A = m(b, x, _.length, y); + S = new Uint8Array(n.exports.memory.buffer); + var D = new Uint32Array(y); + new Uint8Array(D.buffer).set(S.subarray(b, b + y * 4)), E.set(S.subarray(x, x + _.length * 4)), T(x - T(0)); + for (var P = 0; P < _.length; ++P) + _[P] = D[_[P]]; + return [D, A]; + } + function l(m, _, y, C) { + var T = n.exports.sbrk, x = T(y * 4), b = T(y * C), S = new Uint8Array(n.exports.memory.buffer); + S.set(s(_), b), m(x, b, y, C), S = new Uint8Array(n.exports.memory.buffer); + var E = new Uint32Array(y); + return new Uint8Array(E.buffer).set(S.subarray(x, x + y * 4)), T(x - T(0)), E; + } + function d(m, _, y, C, T) { + var x = n.exports.sbrk, b = x(_), S = x(C * T), E = new Uint8Array(n.exports.memory.buffer); + E.set(s(y), S); + var A = m(b, _, S, C, T), D = new Uint8Array(A); + return D.set(E.subarray(b, b + A)), x(b - x(0)), D; + } + function f(m) { + for (var _ = 0, y = 0; y < m.length; ++y) { + var C = m[y]; + _ = _ < C ? C : _; + } + return _; + } + function h(m, _) { + if (o(_ == 2 || _ == 4), _ == 4) + return new Uint32Array(m.buffer, m.byteOffset, m.byteLength / 4); + var y = new Uint16Array(m.buffer, m.byteOffset, m.byteLength / 2); + return new Uint32Array(y); + } + function p(m, _, y, C, T, x, b) { + var S = n.exports.sbrk, E = S(y * C), A = S(y * x), D = new Uint8Array(n.exports.memory.buffer); + D.set(s(_), A), m(E, y, C, T, A, b); + var P = new Uint8Array(y * C); + return P.set(D.subarray(E, E + y * C)), S(E - S(0)), P; + } + return { + ready: i, + supported: !0, + reorderMesh: function(m, _, y) { + var C = _ ? y ? n.exports.meshopt_optimizeVertexCacheStrip : n.exports.meshopt_optimizeVertexCache : void 0; + return c(n.exports.meshopt_optimizeVertexFetchRemap, m, f(m) + 1, C); + }, + reorderPoints: function(m, _) { + return o(m instanceof Float32Array), o(m.length % _ == 0), o(_ >= 3), l(n.exports.meshopt_spatialSortRemap, m, m.length / _, _ * 4); + }, + encodeVertexBuffer: function(m, _, y) { + o(y > 0 && y <= 256), o(y % 4 == 0); + var C = n.exports.meshopt_encodeVertexBufferBound(_, y); + return d(n.exports.meshopt_encodeVertexBuffer, C, m, _, y); + }, + encodeIndexBuffer: function(m, _, y) { + o(y == 2 || y == 4), o(_ % 3 == 0); + var C = h(m, y), T = n.exports.meshopt_encodeIndexBufferBound(_, f(C) + 1); + return d(n.exports.meshopt_encodeIndexBuffer, T, C, _, 4); + }, + encodeIndexSequence: function(m, _, y) { + o(y == 2 || y == 4); + var C = h(m, y), T = n.exports.meshopt_encodeIndexSequenceBound(_, f(C) + 1); + return d(n.exports.meshopt_encodeIndexSequence, T, C, _, 4); + }, + encodeGltfBuffer: function(m, _, y, C) { + var T = { + ATTRIBUTES: this.encodeVertexBuffer, + TRIANGLES: this.encodeIndexBuffer, + INDICES: this.encodeIndexSequence + }; + return o(T[C]), T[C](m, _, y); + }, + encodeFilterOct: function(m, _, y, C) { + return o(y == 4 || y == 8), o(C >= 1 && C <= 16), p(n.exports.meshopt_encodeFilterOct, m, _, y, C, 16); + }, + encodeFilterQuat: function(m, _, y, C) { + return o(y == 8), o(C >= 4 && C <= 16), p(n.exports.meshopt_encodeFilterQuat, m, _, y, C, 16); + }, + encodeFilterExp: function(m, _, y, C, T) { + o(y > 0 && y % 4 == 0), o(C >= 1 && C <= 24); + var x = { + Separate: 0, + SharedVector: 1, + SharedComponent: 2 + }; + return p(n.exports.meshopt_encodeFilterExp, m, _, y, C, y, T ? x[T] : 1); + } + }; +})(); +var MeshoptDecoder = function() { + var e = "b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;w8Wqdbk;esezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9Uc;WFbGgocjdaocjd6EhDaicefhocbhqdnindndndnaeaq9nmbaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxalc9WGgmTmecbhPawcjdfhsaohzinaraz9Rax6mvarazaxfgo9RcK6mvczhlcbhHinalgic9WfgOawcj;cbffhldndndndndnazaOco4fRbbaHcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgOco4gAaAciSgAE86bbawcj;cbfaifglcGfaoclfaAfgARbbaOcl4ciGgCaCciSgCE86bbalcVfaAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc7faAaCfgARbbaOciGgOaOciSgOE86bbalctfaAaOfgARbbaoRbegOco4gCaCciSgCE86bbalc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbalc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc93faAaCfgARbbaOciGgOaOciSgOE86bbalc94faAaOfgARbbaoRbdgOco4gCaCciSgCE86bbalc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbalc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc97faAaCfgARbbaOciGgOaOciSgOE86bbalc98faAaOfgORbbaoRbigoco4gAaAciSgAE86bbalc99faOaAfgORbbaocl4ciGgAaAciSgAE86bbalc9:faOaAfgORbbaocd4ciGgAaAciSgAE86bbalcufaOaAfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgOcl4gAaAcsSgAE86bbawcj;cbfaifglcGfaocwfaAfgARbbaOcsGgOaOcsSgOE86bbalcVfaAaOfgORbbaoRbegAcl4gCaCcsSgCE86bbalc7faOaCfgORbbaAcsGgAaAcsSgAE86bbalctfaOaAfgORbbaoRbdgAcl4gCaCcsSgCE86bbalc91faOaCfgORbbaAcsGgAaAcsSgAE86bbalc4faOaAfgORbbaoRbigAcl4gCaCcsSgCE86bbalc93faOaCfgORbbaAcsGgAaAcsSgAE86bbalc94faOaAfgORbbaoRblgAcl4gCaCcsSgCE86bbalc95faOaCfgORbbaAcsGgAaAcsSgAE86bbalc96faOaAfgORbbaoRbvgAcl4gCaCcsSgCE86bbalc97faOaCfgORbbaAcsGgAaAcsSgAE86bbalc98faOaAfgORbbaoRbogAcl4gCaCcsSgCE86bbalc99faOaCfgORbbaAcsGgAaAcsSgAE86bbalc9:faOaAfgORbbaoRbrgocl4gAaAcsSgAE86bbalcufaOaAfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaHcdfhHaiczfhlarao9RcL0mekkaiam6mvaoTmvdnakTmbawaPfRbbhHawcj;cbfhlashiakhOinaialRbbgzce4cbazceG9R7aHfgH86bbaiadfhialcefhlaOcufgOmbkkascefhsaohzaPcefgPad9hmbxikkcbc99arao9Radcaadca0ESEhoxlkaoaxad2fhCdnakmbadhlinaoTmlarao9Rax6mlaoaxfhoalcufglmbkaChoxekcbhmawcjdfhAinarao9Rax6miawamfRbbhHawcj;cbfhlaAhiakhOinaialRbbgzce4cbazceG9R7aHfgH86bbaiadfhialcefhlaOcufgOmbkaAcefhAaoaxfhoamcefgmad9hmbkaChokabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekc9:hokavcj;ebf8Kjjjjbaok;cseHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhDaicefgqarfhidnaeTmbcmcsawceSEhkcbhxcbhmcbhPcbhwcbhlindnaiaD9nmbc9:hoxikdndnaqRbbgoc;Ve0mbavc;abfalaocu7gscl4fcsGcitfgzydlhrazydbhzdnaocsGgHak9pmbavawasfcsGcdtfydbaxaHEhoaHThsdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkaxasfhxcdhHavawcdtfaoBdbawasfhwcehsalhOxdkdndnaHcsSmbaHc987aHamffcefhoxekaicefhoai8SbbgHcFeGhsdndnaHcu9mmbaohixekaicvfhiascFbGhscrhHdninao8SbbgOcFbGaHtasVhsaOcu9kmeaocefhoaHcrfgHc8J9hmbxdkkaocefhikasce4cbasceG9R7amfhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhHavawcdtfaoBdbcehsawcefhwalhOaohmxekdnaocpe0mbaxcefgHavawaDaocsGfRbbgocl49RcsGcdtfydbaocz6gzEhravawao9RcsGcdtfydbaHazfgAaocsGgHEhoaHThCdndnadcd9hmbabaPcetfgHax87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHaxBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfaxBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgOaxBdlaOarBdbavawazfgwcsGcdtfaoBdbalcefcsGhOawaCfhwaxhzaAaCfhxxekaxcbaiRbbgOEgzaoc;:eSgHfhraOcsGhCaOcl4hAdndnaOcs0mbarcefhoxekarhoavawaA9RcsGcdtfydbhrkdndnaCmbaocefhxxekaohxavawaO9RcsGcdtfydbhokdndnaHTmbaicefhHxekaicdfhHai8SbegscFeGhzdnascu9kmbaicofhXazcFbGhzcrhidninaH8SbbgscFbGaitazVhzascu9kmeaHcefhHaicrfgic8J9hmbkaXhHxekaHcefhHkazce4cbazceG9R7amfgmhzkdndnaAcsSmbaHhsxekaHcefhsaH8SbbgicFeGhrdnaicu9kmbaHcvfhXarcFbGhrcrhidninas8SbbgHcFbGaitarVhraHcu9kmeascefhsaicrfgic8J9hmbkaXhsxekascefhskarce4cbarceG9R7amfgmhrkdndnaCcsSmbashixekascefhias8SbbgocFeGhHdnaocu9kmbascvfhXaHcFbGhHcrhodninai8SbbgscFbGaotaHVhHascu9kmeaicefhiaocrfgoc8J9hmbkaXhixekaicefhikaHce4cbaHceG9R7amfgmhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfazBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgXazBdlaXarBdbavawaOcz6aAcsSVfgwcsGcdtfaoBdbawaCTaCcsSVfhwalcefcsGhOkaqcefhqavc;abfaOcitfgOarBdlaOaoBdbavc;abfalasfcsGcitfgraoBdlarazBdbawcsGhwalaHfcsGhlaPcifgPae6mbkkcbc99aiaDSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;oiliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:OhDxekcjjjj94hDkabaiavciGfgkcd7cetfaD87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:OhDxekcjjjj94hDkabaiavcufciGfcetfaD87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohvxekcjjjj94hvkabakcetfav87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb", t = "b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq:p9sqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk:N8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhlaicefhodnaeTmbadTmbalc;WFbGglcjdalcjd6EhwcbhDinawaeaD9RaDawfae6Egqcsfglc9WGgkci2hxakcethmalcl4cifcd4hPabaDad2fhsakc;ab6hzcbhHincbhOaohAdndninaraA9RaP6meavcj;cbfaOak2fhCaAaPfhocbhidnazmbarao9Rc;Gb6mbcbhlinaCalfhidndndndndnaAalco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklbaoczfhokdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklzaoczfhokdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklaaoczfhokdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WaoclfaYpQbfaXc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WaocwfaYpQbfaXc:q:yjjbfRbbfhoxekaiaopbbbpkl8Waoczfhokalc;abfhialcjefak0meaihlarao9Rc;Fb0mbkkdnaiak9pmbaici4hlinarao9RcK6miaCaifhXdndndndndnaAaico4fRbbalcoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpkbbxikaXaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkbbaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaXaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkbbaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaXaopbbbpkbbaoczfhokalcdfhlaiczfgiak6mbkkaoTmeaohAaOcefgOclSmdxbkkc9:hoxlkdnakTmbavcjdfaHfhiavaHfpbdbhYcbhXinaiavcj;cbfaXfglpblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLalakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEalamfpblbg3cep9Ta3aQp9op9Hp9rg3alaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfhiaXczfgXak6mbkkaHclfgHad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfgDae6mbkkcbc99arao9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk::seHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhDaicefgqarfhidnaeTmbcmcsawceSEhkcbhxcbhmcbhPcbhwcbhlindnaiaD9nmbc9:hoxikdndnaqRbbgoc;Ve0mbavc;abfalaocu7gscl4fcsGcitfgzydlhrazydbhzdnaocsGgHak9pmbavawasfcsGcdtfydbaxaHEhoaHThsdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkaxasfhxcdhHavawcdtfaoBdbawasfhwcehsalhOxdkdndnaHcsSmbaHc987aHamffcefhoxekaicefhoai8SbbgHcFeGhsdndnaHcu9mmbaohixekaicvfhiascFbGhscrhHdninao8SbbgOcFbGaHtasVhsaOcu9kmeaocefhoaHcrfgHc8J9hmbxdkkaocefhikasce4cbasceG9R7amfhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhHavawcdtfaoBdbcehsawcefhwalhOaohmxekdnaocpe0mbaxcefgHavawaDaocsGfRbbgocl49RcsGcdtfydbaocz6gzEhravawao9RcsGcdtfydbaHazfgAaocsGgHEhoaHThCdndnadcd9hmbabaPcetfgHax87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHaxBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfaxBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgOaxBdlaOarBdbavawazfgwcsGcdtfaoBdbalcefcsGhOawaCfhwaxhzaAaCfhxxekaxcbaiRbbgOEgzaoc;:eSgHfhraOcsGhCaOcl4hAdndnaOcs0mbarcefhoxekarhoavawaA9RcsGcdtfydbhrkdndnaCmbaocefhxxekaohxavawaO9RcsGcdtfydbhokdndnaHTmbaicefhHxekaicdfhHai8SbegscFeGhzdnascu9kmbaicofhXazcFbGhzcrhidninaH8SbbgscFbGaitazVhzascu9kmeaHcefhHaicrfgic8J9hmbkaXhHxekaHcefhHkazce4cbazceG9R7amfgmhzkdndnaAcsSmbaHhsxekaHcefhsaH8SbbgicFeGhrdnaicu9kmbaHcvfhXarcFbGhrcrhidninas8SbbgHcFbGaitarVhraHcu9kmeascefhsaicrfgic8J9hmbkaXhsxekascefhskarce4cbarceG9R7amfgmhrkdndnaCcsSmbashixekascefhias8SbbgocFeGhHdnaocu9kmbascvfhXaHcFbGhHcrhodninai8SbbgscFbGaotaHVhHascu9kmeaicefhiaocrfgoc8J9hmbkaXhixekaicefhikaHce4cbaHceG9R7amfgmhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfazBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgXazBdlaXarBdbavawaOcz6aAcsSVfgwcsGcdtfaoBdbawaCTaCcsSVfhwalcefcsGhOkaqcefhqavc;abfaOcitfgOarBdlaOaoBdbavc;abfalasfcsGcitfgraoBdlarazBdbawcsGhwalaHfcsGhlaPcifgPae6mbkkcbc99aiaDSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalaeSmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmbediwDqkzHOAKY8AEgwczp:Reczp:Sep;6egraDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eawczp:Sep;6egwp;Gearp;Gep;Kep;Legopxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegrpxb;:FSb;:FSb;:FSb;:FSararp;Meaoaop;Meawaqawamp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFFbbFFbbFFbbFFbbp9oaoawp;Meaqp;Keczp:Rep9qgoarawp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogrpmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oaoarpmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalaeSmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmbediwDqkzHOAKY8AEgwczp:Reczp:Sep;6egraDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eawczp:Sep;6egwp;Gearp;Gep;Kep;Legopxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegrpxb;:FSb;:FSb;:FSb;:FSararp;Meaoaop;Meawaqawamp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFFbbFFbbFFbbFFbbp9oaoawp;Meaqp;Keczp:Rep9qgoarawp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogrpmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oaoarpmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaDakp;Mearp;Keamp9oaqakp;Mearp;Keczp:Rep9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalaeSmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaDakp;Mearp;Keamp9oaqakp;Mearp;Keczp:Rep9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnavalSmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb", n = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 12, 1, 0, 10, 22, 2, 12, 0, 65, 0, 65, 0, 65, 0, 252, 10, 0, 0, 11, 7, 0, 65, 0, 253, 15, 26, 11]), i = new Uint8Array([32, 0, 65, 2, 1, 106, 34, 33, 3, 128, 11, 4, 13, 64, 6, 253, 10, 7, 15, 116, 127, 5, 8, 12, 40, 16, 19, 54, 20, 9, 27, 255, 113, 17, 42, 67, 24, 23, 146, 148, 18, 14, 22, 45, 70, 69, 56, 114, 101, 21, 25, 63, 75, 136, 108, 28, 118, 29, 73, 115]); + if (typeof WebAssembly != "object") + return { + supported: !1 + }; + var r = WebAssembly.validate(n) ? c(t) : c(e), o, s = WebAssembly.instantiate(r, {}).then(function(T) { + o = T.instance, o.exports.__wasm_call_ctors(); + }); + function c(T) { + for (var x = new Uint8Array(T.length), b = 0; b < T.length; ++b) { + var S = T.charCodeAt(b); + x[b] = S > 96 ? S - 97 : S > 64 ? S - 39 : S + 4; + } + for (var E = 0, b = 0; b < T.length; ++b) + x[E++] = x[b] < 60 ? i[x[b]] : (x[b] - 60) * 64 + x[++b]; + return x.buffer.slice(0, E); + } + function l(T, x, b, S, E, A, D) { + var P = T.exports.sbrk, I = S + 3 & -4, M = P(I * E), R = P(A.length), L = new Uint8Array(T.exports.memory.buffer); + L.set(A, R); + var g = x(M, S, E, R, A.length); + if (g == 0 && D && D(M, I, E), b.set(L.subarray(M, M + S * E)), P(M - P(0)), g != 0) + throw new Error("Malformed buffer data: " + g); + } + var d = { + NONE: "", + OCTAHEDRAL: "meshopt_decodeFilterOct", + QUATERNION: "meshopt_decodeFilterQuat", + EXPONENTIAL: "meshopt_decodeFilterExp" + }, f = { + ATTRIBUTES: "meshopt_decodeVertexBuffer", + TRIANGLES: "meshopt_decodeIndexBuffer", + INDICES: "meshopt_decodeIndexSequence" + }, h = [], p = 0; + function m(T) { + var x = { + object: new Worker(T), + pending: 0, + requests: {} + }; + return x.object.onmessage = function(b) { + var S = b.data; + x.pending -= S.count, x.requests[S.id][S.action](S.value), delete x.requests[S.id]; + }, x; + } + function _(T) { + for (var x = "self.ready = WebAssembly.instantiate(new Uint8Array([" + new Uint8Array(r) + "]), {}).then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });self.onmessage = " + C.name + ";" + l.toString() + C.toString(), b = new Blob([x], { type: "text/javascript" }), S = URL.createObjectURL(b), E = h.length; E < T; ++E) + h[E] = m(S); + for (var E = T; E < h.length; ++E) + h[E].object.postMessage({}); + h.length = T, URL.revokeObjectURL(S); + } + function y(T, x, b, S, E) { + for (var A = h[0], D = 1; D < h.length; ++D) + h[D].pending < A.pending && (A = h[D]); + return new Promise(function(P, I) { + var M = new Uint8Array(b), R = ++p; + A.pending += T, A.requests[R] = { resolve: P, reject: I }, A.object.postMessage({ id: R, count: T, size: x, source: M, mode: S, filter: E }, [M.buffer]); + }); + } + function C(T) { + var x = T.data; + if (!x.id) + return self.close(); + self.ready.then(function(b) { + try { + var S = new Uint8Array(x.count * x.size); + l(b, b.exports[x.mode], S, x.count, x.size, x.source, b.exports[x.filter]), self.postMessage({ id: x.id, count: x.count, action: "resolve", value: S }, [S.buffer]); + } catch (E) { + self.postMessage({ id: x.id, count: x.count, action: "reject", value: E }); + } + }); + } + return { + ready: s, + supported: !0, + useWorkers: function(T) { + _(T); + }, + decodeVertexBuffer: function(T, x, b, S, E) { + l(o, o.exports.meshopt_decodeVertexBuffer, T, x, b, S, o.exports[d[E]]); + }, + decodeIndexBuffer: function(T, x, b, S) { + l(o, o.exports.meshopt_decodeIndexBuffer, T, x, b, S); + }, + decodeIndexSequence: function(T, x, b, S) { + l(o, o.exports.meshopt_decodeIndexSequence, T, x, b, S); + }, + decodeGltfBuffer: function(T, x, b, S, E, A) { + l(o, o.exports[f[E]], T, x, b, S, o.exports[d[A]]); + }, + decodeGltfBufferAsync: function(T, x, b, S, E) { + return h.length > 0 ? y(T, x, b, f[S], d[E]) : s.then(function() { + var A = new Uint8Array(T * x); + return l(o, o.exports[f[S]], A, T, x, b, o.exports[d[E]]), A; + }); + } + }; +}(); +(function() { + var e = "b9H79Tebbbe9Hk9Geueu9Geub9Gbb9Gsuuuuuuuuuuuu99uueu9Gvuuuuub9Gvuuuuue999Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuecj;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdmxq:f97sdbk:39si8Au8A99zu8Jjjjjbc;W;ab9Rgs8Kjjjjbcbhzascxfcbc;Kbz:ljjjb8AdnabaeSmbabaeadcdtz:kjjjb8AkdndnamcdGmbcbhHxekasalcrfci4gecbyd;S1jjbHjjjjbbgOBdxasceBd2aOcbaez:ljjjbhAcbhlcbhednadTmbcbhlabheadhOinaAaeydbgCci4fgXaXRbbgXceaCcrGgCtV86bbaXcu7aC4ceGalfhlaeclfheaOcufgOmbkcualcdtalcFFFFi0Ehekasaecbyd;S1jjbHjjjjbbgHBdzascdBd2alcd4alfhCcehOinaOgecethOaeaC6mbkcdhzcbhQascuaecdtgOaecFFFFi0Ecbyd;S1jjbHjjjjbbgCBdCasciBd2aCcFeaOz:ljjjbhLdnadTmbaecufhXcbhKinabaQcdtfgYydbgAc:v;t;h;Ev2hCcbhedndninaLaCaXGgCcdtfg8AydbgOcuSmeaHaOcdtfydbaASmdaecefgeaCfhCaeaX9nmbxdkkaHaKcdtfaABdba8AaKBdbaKhOaKcefhKkaYaOBdbaQcefgQad9hmbkkaLcbyd;O1jjbH:bjjjbbascdBd2kascxfazcdtfcualcefgecdtaecFFFFi0Ecbyd;S1jjbHjjjjbbgEBdbasaEBdlasazceVgeBd2ascxfaecdtfcuadcitadcFFFFe0Ecbyd;S1jjbHjjjjbbg3Bdbasa3BdwasazcdfgeBd2asclfabadalcbz:cjjjbascxfaecdtfcualcdtg5alcFFFFi0Eg8Ecbyd;S1jjbHjjjjbbgOBdbasazcifgeBd2ascxfaecdtfa8Ecbyd;S1jjbHjjjjbbg8FBdbasazclVgaBd2alcd4alfhXcehCinaCgecethCaeaX6mbkcbhKascxfaacdtfghcuaecdtgCaecFFFFi0Ecbyd;S1jjbHjjjjbbgXBdbasazcvVggBd2aXcFeaCz:ljjjbhQdnalTmbavcd4hAaecufhCinaKhednaHTmbaHaKcdtfydbhekaiaeaA2cdtfgeydlgXcH4aX7c:F:b:DD2aeydbgXcH4aX7c;D;O:B8J27aeydwgecH4ae7c:3F;N8N27aCGheaKcdth8JdndndndndnaHTmbaHa8JfhYcbhXinaQaecdtfgLydbg8AcuSmlaiaHa8AcdtfydbaA2cdtfaiaYydbaA2cdtfcxz:ojjjbTmiaXcefgXaefaCGheaXaC9nmbxdkkaiaKaA2cdtfhYcbhXinaQaecdtfgLydbg8AcuSmiaia8AaA2cdtfaYcxz:ojjjbTmdaXcefgXaefaCGheaXaC9nmbkkcbhLkaLydbgecu9hmekaLaKBdbaKhekaOa8JfaeBdbaKcefgKal9hmbkcbhea8FhCinaCaeBdbaCclfhCalaecefge9hmbkcbheaOhCa8FhXindnaeaCydbgASmbaXa8FaAcdtfgAydbBdbaAaeBdbkaCclfhCaXclfhXalaecefge9hmbkkcbh8KaQcbyd;O1jjbH:bjjjbbasaaBd2ahalcbyd;S1jjbHjjjjbbgABdbasagBd2ascxfagcdtfa8Ecbyd;S1jjbHjjjjbbgeBdbasazcofgCBd2ascxfaCcdtfa8Ecbyd;S1jjbHjjjjbbgCBdbasazcrfg8LBd2aecFea5z:ljjjbh8MaCcFea5z:ljjjbh8NdnalTmba3cwfhyindnaEa8KgXcefg8Kcdtfydbg8AaEaXcdtgefydbgCSmba8AaC9Rh8Ja3aCcitfh5a8Naefhga8MaefhKcbhLindndna5aLcitfydbgQaX9hmbaKaXBdbagaXBdbxekdnaEaQcdtgafgeclfydbgCaeydbgeSmba3aecitg8AfydbaXSmeaCae9Rhhaecu7aCfhYaya8AfhCcbheinaYaeSmeaecefheaCydbh8AaCcwfhCa8AaX9hmbkaeah6meka8NaafgeaXaQaeydbcuSEBdbaKaQaXaKydbcuSEBdbkaLcefgLa8J9hmbkka8Kal9hmbkaOhCaHhLa8FhXa8Nh8Aa8MhQcbheindndnaeaCydbgY9hmbdnaqTmbaehYdnaHTmbaLydbhYkaqaYfRbbTmbaAaefcl86bbxdkdnaeaXydbgY9hmbaQydbhYdna8AydbgKcu9hmbaYcu9hmbaAaefcb86bbxikaAaefh8JdnaeaKSmbaeaYSmba8Jce86bbxika8Jcl86bbxdkdnaea8FaYcdtgKfydb9hmbdna8Aydbg8JcuSmbaea8JSmbaQydbg5cuSmbaea5Smba8NaKfydbgacuSmbaaaYSmba8MaKfydbgKcuSmbaKaYSmbdnaOa8JcdtfydbaOaKcdtfydb9hmbaOa5cdtfydbaOaacdtfydb9hmbaAaefcd86bbxlkaAaefcl86bbxikaAaefcl86bbxdkaAaefcl86bbxekaAaefaAaYfRbb86bbkaCclfhCaLclfhLaXclfhXa8Aclfh8AaQclfhQalaecefge9hmbkamceGTmbaAhealhCindnaeRbbce9hmbaecl86bbkaecefheaCcufgCmbkkascxfa8Lcdtfcualcx2alc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbggBdbasazcwVg8JBd2agaialavaHz:djjjbh8PdndnaDmbcbhvxekascxfa8JcdtfcualaD2gecdtaecFFFFi0Ecbyd;S1jjbHjjjjbbgvBdbasazcDVg8JBd2alTmbarcd4hYdnaHTmbaDcdthKcbhLavhQinaoaHaLcdtfydbaY2cdtfheawhCaQhXaDh8AinaXaeIdbaCIdbNUdbaeclfheaCclfhCaXclfhXa8Acufg8AmbkaQaKfhQaLcefgLal9hmbxdkkaYcdthYaDcdthKcbhQavhLinaoheawhCaLhXaDh8AinaXaeIdbaCIdbNUdbaeclfheaCclfhCaXclfhXa8Acufg8AmbkaoaYfhoaLaKfhLaQcefgQal9hmbkkascxfa8Jcdtfcualc8S2gealc;D;O;f8U0EgXcbyd;S1jjbHjjjjbbgCBdbasa8Jcefg8ABd2aCcbaez:ljjjbh8KdndndnaDTmbascxfa8AcdtfaXcbyd;S1jjbHjjjjbbgqBdbasa8JcdfgCBd2aqcbaez:ljjjb8AascxfaCcdtfcualaD2gecltgCaecFFFFb0Ecbyd;S1jjbHjjjjbbgwBdbasa8JcifBd2awcbaCz:ljjjb8AadmexdkcbhqcbhwadTmekcbhLabhCindnagaCclfydbgQcx2fgeIdbagaCydbgYcx2fgXIdbgI:tg8RagaCcwfydbgKcx2fg8AIdlaXIdlg8S:tgRNa8AIdbaI:tg8UaeIdla8S:tg8VN:tg8Wa8WNa8Va8AIdwaXIdwg8X:tg8YNaRaeIdwa8X:tg8VN:tgRaRNa8Va8UNa8Ya8RN:tg8Ra8RNMM:rg8UJbbbb9ETmba8Wa8U:vh8Wa8Ra8U:vh8RaRa8U:vhRka8KaOaYcdtfydbc8S2fgeaRa8U:rg8UaRNNg8VaeIdbMUdbaea8Ra8Ua8RNg8ZNg8YaeIdlMUdlaea8Wa8Ua8WNg80Ng81aeIdwMUdwaea8ZaRNg8ZaeIdxMUdxaea80aRNgBaeIdzMUdzaea80a8RNg80aeIdCMUdCaeaRa8Ua8Wa8XNaRaINa8Sa8RNMM:mg8SNgINgRaeIdKMUdKaea8RaINg8RaeId3MUd3aea8WaINg8WaeIdaMUdaaeaIa8SNgIaeId8KMUd8Kaea8UaeIdyMUdya8KaOaQcdtfydbc8S2fgea8VaeIdbMUdbaea8YaeIdlMUdlaea81aeIdwMUdwaea8ZaeIdxMUdxaeaBaeIdzMUdzaea80aeIdCMUdCaeaRaeIdKMUdKaea8RaeId3MUd3aea8WaeIdaMUdaaeaIaeId8KMUd8Kaea8UaeIdyMUdya8KaOaKcdtfydbc8S2fgea8VaeIdbMUdbaea8YaeIdlMUdlaea81aeIdwMUdwaea8ZaeIdxMUdxaeaBaeIdzMUdzaea80aeIdCMUdCaeaRaeIdKMUdKaea8RaeId3MUd3aea8WaeIdaMUdaaeaIaeId8KMUd8Kaea8UaeIdyMUdyaCcxfhCaLcifgLad6mbkcbh8JabhYinaba8JcdtfhQcbhCinaAaQaCcj1jjbfydbcdtfydbgXfRbbhedndnaAaYaCfydbg8AfRbbgLc99fcFeGcpe0mbaeceSmbaecd9hmekdnaLcufcFeGce0mba8Ma8AcdtfydbaX9hmekdnaecufcFeGce0mba8NaXcdtfydba8A9hmekdnaLcv2aefc:q1jjbfRbbTmbaOaXcdtfydbaOa8Acdtfydb0mekdnagaXcx2fgKIdwaga8Acx2fgiIdwg8S:tgRaRNaKIdbaiIdbg8X:tg8Ra8RNaKIdlaiIdlg8V:tg8Ua8UNMM:rgIJbbbb9ETmbaRaI:vhRa8UaI:vh8Ua8RaI:vh8RkJbbacJbbacJbbjZaeceSEaLceSEh80dnagaQaCc:e1jjbfydbcdtfydbcx2fgeIdwa8S:tg8WaRa8WaRNaeIdba8X:tg81a8RNa8UaeIdla8V:tg8ZNMMg8YN:tg8Wa8WNa81a8Ra8YN:tgRaRNa8Za8Ua8YN:tg8Ra8RNMM:rg8UJbbbb9ETmba8Wa8U:vh8Wa8Ra8U:vh8RaRa8U:vhRka8KaOa8Acdtfydbc8S2fgeaRa80aINg8UaRNNg8YaeIdbMUdbaea8Ra8Ua8RNg80Ng81aeIdlMUdlaea8Wa8Ua8WNgINg8ZaeIdwMUdwaea80aRNg80aeIdxMUdxaeaIaRNgBaeIdzMUdzaeaIa8RNg83aeIdCMUdCaeaRa8Ua8Wa8SNaRa8XNa8Va8RNMM:mg8SNgINgRaeIdKMUdKaea8RaINg8RaeId3MUd3aea8WaINg8WaeIdaMUdaaeaIa8SNgIaeId8KMUd8Kaea8UaeIdyMUdya8KaOaXcdtfydbc8S2fgea8YaeIdbMUdbaea81aeIdlMUdlaea8ZaeIdwMUdwaea80aeIdxMUdxaeaBaeIdzMUdzaea83aeIdCMUdCaeaRaeIdKMUdKaea8RaeId3MUd3aea8WaeIdaMUdaaeaIaeId8KMUd8Kaea8UaeIdyMUdykaCclfgCcx9hmbkaYcxfhYa8Jcifg8Jad6mbkaDTmbcbhYinJbbbbh8XagabaYcdtfgeclfydbgKcx2fgCIdwagaeydbgicx2fgXIdwg8Z:tg8Ra8RNaCIdbaXIdbgB:tg8Wa8WNaCIdlaXIdlg83:tg8Ua8UNMMg80agaecwfydbg8Jcx2fgeIdwa8Z:tgINa8Ra8RaINa8WaeIdbaB:tg8SNa8UaeIdla83:tg8VNMMgRN:tJbbbbJbbjZa80aIaINa8Sa8SNa8Va8VNMMg81NaRaRN:tg8Y:va8YJbbbb9BEg8YNhUa81a8RNaIaRN:ta8YNh85a80a8VNa8UaRN:ta8YNh86a81a8UNa8VaRN:ta8YNh87a80a8SNa8WaRN:ta8YNh88a81a8WNa8SaRN:ta8YNh89a8Wa8VNa8Sa8UN:tgRaRNa8UaINa8Va8RN:tgRaRNa8Ra8SNaIa8WN:tgRaRNMM:r:rhRavaiaD2cdtfhCava8JaD2cdtfhXavaKaD2cdtfh8Aa8Z:mh8:a83:mhZaB:mhncbhLaDhQJbbbbh8VJbbbbh8YJbbbbh80Jbbbbh81Jbbbbh8ZJbbbbhBJbbbbh83JbbbbhcJbbbbh9cinasc;WbfaLfgecwfaRa85a8AIdbaCIdbgI:tg8UNaUaXIdbaI:tg8SNMg8RNUdbaeclfaRa87a8UNa86a8SNMg8WNUdbaeaRa89a8UNa88a8SNMg8UNUdbaecxfaRa8:a8RNaZa8WNaIana8UNMMMgINUdbaRa8Ra8WNNa81Mh81aRa8Ra8UNNa8ZMh8ZaRa8Wa8UNNaBMhBaRaIaINNa8XMh8XaRa8RaINNa8VMh8VaRa8WaINNa8YMh8YaRa8UaINNa80Mh80aRa8Ra8RNNa83Mh83aRa8Wa8WNNacMhcaRa8Ua8UNNa9cMh9caCclfhCa8Aclfh8AaXclfhXaLczfhLaQcufgQmbkaqaOaicdtfydbgCc8S2fgea9caeIdbMUdbaeacaeIdlMUdlaea83aeIdwMUdwaeaBaeIdxMUdxaea8ZaeIdzMUdzaea81aeIdCMUdCaea80aeIdKMUdKaea8YaeId3MUd3aea8VaeIdaMUdaaea8XaeId8KMUd8KaeaRaeIdyMUdyaqaOaKcdtfydbgKc8S2fgea9caeIdbMUdbaeacaeIdlMUdlaea83aeIdwMUdwaeaBaeIdxMUdxaea8ZaeIdzMUdzaea81aeIdCMUdCaea80aeIdKMUdKaea8YaeId3MUd3aea8VaeIdaMUdaaea8XaeId8KMUd8KaeaRaeIdyMUdyaqaOa8Jcdtfydbgic8S2fgea9caeIdbMUdbaeacaeIdlMUdlaea83aeIdwMUdwaeaBaeIdxMUdxaea8ZaeIdzMUdzaea81aeIdCMUdCaea80aeIdKMUdKaea8YaeId3MUd3aea8VaeIdaMUdaaea8XaeId8KMUd8KaeaRaeIdyMUdyawaCaD2cltfhQcbhCaDh8AinaQaCfgeasc;WbfaCfgXIdbaeIdbMUdbaeclfgLaXclfIdbaLIdbMUdbaecwfgLaXcwfIdbaLIdbMUdbaecxfgeaXcxfIdbaeIdbMUdbaCczfhCa8Acufg8AmbkawaKaD2cltfhQcbhCaDh8AinaQaCfgeasc;WbfaCfgXIdbaeIdbMUdbaeclfgLaXclfIdbaLIdbMUdbaecwfgLaXcwfIdbaLIdbMUdbaecxfgeaXcxfIdbaeIdbMUdbaCczfhCa8Acufg8AmbkawaiaD2cltfhQcbhCaDh8AinaQaCfgeasc;WbfaCfgXIdbaeIdbMUdbaeclfgLaXclfIdbaLIdbMUdbaecwfgLaXcwfIdbaLIdbMUdbaecxfgeaXcxfIdbaeIdbMUdbaCczfhCa8Acufg8AmbkaYcifgYad6mbkkasydlhJcbhednalTmbaJclfheaJydbh8AaAhCalhLcbhXincbaeydbgQa8A9RaCRbbcpeGEaXfhXaCcefhCaeclfheaQh8AaLcufgLmbkaXce4hekcuadae9Rcifg8Lcx2a8Lc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbhhascxfasyd2gecdtfahBdbasaecefgCBd2ascxfaCcdtfcua8Lcdta8LcFFFFi0Ecbyd;S1jjbHjjjjbbgzBdbasaecdfgCBd2ascxfaCcdtfa8Ecbyd;S1jjbHjjjjbbg3BdbasaecifgCBd2ascxfaCcdtfalcbyd;S1jjbHjjjjbbg9eBdbasaeclfBd2a8PJbbjZamclGEhcJbbbbh83dnadak9nmbdna8Lci6mbaxaxNacacN:vhBaDclthTahcwfhSJbbbbh83inasclfabadgoalaOz:cjjjbabhicbhEcbhyinabaycdtfh8JcbheindnaOaiaefydbgXcdtgKfydbg8AaOa8Jaec:S1jjbfydbcdtfydbgCcdtfydbgLSmbaAaCfRbbgYcv2aAaXfRbbgQfc;a1jjbfRbbgaaQcv2aYfg5c;a1jjbfRbbgdVcFeGTmbdnaLa8A9nmba5c:q1jjbfRbbcFeGmekdnaQaY9hmbaQcufcFeGce0mba8MaKfydbaC9hmekahaEcx2fg8AaCaXadcFeGgLEBdla8AaXaCaLEBdba8AaLaaGcb9hBdwaEcefhEkaeclfgecx9hmbkdnaycifgyao9pmbaicxfhiaEcifa8L9nmekkdnaEmbaohdxikcbhYinJbbbbJbbjZa8KaOahaYcx2fg8AydlgLa8AydbgQa8AydwgCEgicdtfydbgac8S2gdfgeIdygR:vaRJbbbb9BEaeIdwagaQaLaCEgKcx2fgCIdwg8UNaeIdzaCIdbgINaeIdaMgRaRMMa8UNaeIdlaCIdlg8SNaeIdCa8UNaeId3MgRaRMMa8SNaeIdbaINaeIdxa8SNaeIdKMgRaRMMaINaeId8KMMM:lNh80JbbbbJbbjZa8KaOaQcdtfydbgyc8S2gXfgeIdygR:vaRJbbbb9BEaeIdwagaLcx2fgCIdwg8WNaeIdzaCIdbg8XNaeIdaMgRaRMMa8WNaeIdlaCIdlg8VNaeIdCa8WNaeId3MgRaRMMa8VNaeIdba8XNaeIdxa8VNaeIdKMgRaRMMa8XNaeId8KMMM:lNh81a8Acwfh8Ja8Aclfh5dnaDTmbaqaXfgXIdwa8WNaXIdza8XNaXIdaMgRaRMMa8WNaXIdla8VNaXIdCa8WNaXId3MgRaRMMa8VNaXIdba8XNaXIdxa8VNaXIdKMgRaRMMa8XNaXId8KMMMh8RavaLaD2cdtfhCawayaD2cltfheaXIdyh8YaDhXinaCIdbgRJbbb;aNaecxfIdba8WaecwfIdbNa8XaeIdbNa8VaeclfIdbNMMMNaRaRNa8YNa8RMMh8RaCclfhCaeczfheaXcufgXmbkaqadfgXIdwa8UNaXIdzaINaXIdaMgRaRMMa8UNaXIdla8SNaXIdCa8UNaXId3MgRaRMMa8SNaXIdbaINaXIdxa8SNaXIdKMgRaRMMaINaXId8KMMMh8WavaKaD2cdtfhCawaaaD2cltfheaXIdyh8XaDhXinaCIdbgRJbbb;aNaecxfIdba8UaecwfIdbNaIaeIdbNa8SaeclfIdbNMMMNaRaRNa8XNa8WMMh8WaCclfhCaeczfheaXcufgXmbka80a8W:lMh80a81a8R:lMh81ka5aLaKa81a809FgeEBdba8AaQaiaeEBdba8Ja81a80aeEUdbaYcefgYaE9hmbkasc;Wbfcbcj;abz:ljjjb8AaSheaEhCinasc;WbfaeydbcO4c;8ZGfgXaXydbcefBdbaecxfheaCcufgCmbkcbhecbhCinasc;WbfaefgXydbh8AaXaCBdba8AaCfhCaeclfgecj;ab9hmbkcbheaShCinasc;WbfaCydbcO4c;8ZGfgXaXydbgXcefBdbazaXcdtfaeBdbaCcxfhCaEaecefge9hmbkaoak9RgXci9Uh9hdnalTmbcbhea3hCinaCaeBdbaCclfhCalaecefge9hmbkkcbh9ia9ecbalz:ljjjbh6aXcO9Uh9ka9hce4h0asydwh9mcbhdcbh5dninahaza5cdtfydbcx2fg8JIdwg8RaB9Emeada9h9pmeJFFuuhRdna0aE9pmbahaza0cdtfydbcx2fIdwJbb;aZNhRkdna8RaR9ETmbada9k0mdkdna6aOa8Jydlg9ncdtg9ofydbg8Afg9pRbba6aOa8Jydbgicdtg9qfydbg9rfg9sRbbVmbdnaJa9rcdtfgeclfydbgCaeydbgeSmbaCae9RhQa9maecitfheaga8Acx2fgKcwfhyaKclfh8Eaga9rcx2fgacwfhmaaclfhrcbhCcehYdnindna3aeydbcdtfydbgXa8ASmba3aeclfydbcdtfydbgLa8ASmbaXaLSmbagaLcx2fgLIdbagaXcx2fgXIdbg8W:tgRarIdbaXIdlg8U:tg8XNaaIdba8W:tg8VaLIdla8U:tg8RN:tgIaRa8EIdba8U:tg8YNaKIdba8W:tg80a8RN:tg8UNa8RamIdbaXIdwg8S:tg81Na8XaLIdwa8S:tg8WN:tg8Xa8RayIdba8S:tg8ZNa8Ya8WN:tg8RNa8Wa8VNa81aRN:tg8Sa8Wa80Na8ZaRN:tgRNMMaIaINa8Xa8XNa8Sa8SNMMa8Ua8UNa8Ra8RNaRaRNMMN:rJbbj8:N9FmdkaecwfheaCcefgCaQ6hYaQaC9hmbkkaYceGTmba0cefh0xeka8Ka8Ac8S2gXfgea8Ka9rc8S2gLfgCIdbaeIdbMUdbaeaCIdlaeIdlMUdlaeaCIdwaeIdwMUdwaeaCIdxaeIdxMUdxaeaCIdzaeIdzMUdzaeaCIdCaeIdCMUdCaeaCIdKaeIdKMUdKaeaCId3aeId3MUd3aeaCIdaaeIdaMUdaaeaCId8KaeId8KMUd8KaeaCIdyaeIdyMUdydnaDTmbaqaXfgeaqaLfgCIdbaeIdbMUdbaeaCIdlaeIdlMUdlaeaCIdwaeIdwMUdwaeaCIdxaeIdxMUdxaeaCIdzaeIdzMUdzaeaCIdCaeIdCMUdCaeaCIdKaeIdKMUdKaeaCId3aeId3MUd3aeaCIdaaeIdaMUdaaeaCId8KaeId8KMUd8KaeaCIdyaeIdyMUdyaTa9r2hYaTa8A2hKawhCaDhLinaCaKfgeaCaYfgXIdbaeIdbMUdbaeclfgQaXclfIdbaQIdbMUdbaecwfgQaXcwfIdbaQIdbMUdbaecxfgeaXcxfIdbaeIdbMUdbaCczfhCaLcufgLmbkka8JcwfhCdndndndnaAaifgXRbbc9:fPdebdkaiheina3aecdtgefa8ABdba8Faefydbgeai9hmbxikka8Fa9ofydbhea8Fa9qfydbhia3a9qfa9nBdbaeh9nka3aicdtfa9nBdbka9sce86bba9pce86bbaCIdbgRa83a83aR9DEh83a9icefh9icecdaXRbbceSEadfhdka5cefg5aE9hmbkkdna9imbaohdxikdnalTmbcbhCa8MheindnaeydbgXcuSmbdnaCa3aXcdtg8AfydbgX9hmba8Ma8AfydbhXkaeaXBdbkaeclfhealaCcefgC9hmbkcbhCa8NheindnaeydbgXcuSmbdnaCa3aXcdtg8AfydbgX9hmba8Na8AfydbhXkaeaXBdbkaeclfhealaCcefgC9hmbkkcbhdabhecbhLindna3aeydbcdtfydbgCa3aeclfydbcdtfydbgXSmbaCa3aecwfydbcdtfydbg8ASmbaXa8ASmbabadcdtfgQaCBdbaQcwfa8ABdbaQclfaXBdbadcifhdkaecxfheaLcifgLao6mbkadak9nmdxbkkasclfabadalaOz:cjjjbkdnaHTmbadTmbadheinabaHabydbcdtfydbBdbabclfhbaecufgembkkdnaPTmbaPaca83:rNUdbkasyd2gecdtascxffc98fhOdninaeTmeaOydbcbyd;O1jjbH:bjjjbbaOc98fhOaecufhexbkkasc;W;abf8Kjjjjbadk;Yieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfhearcufgrmbkkabydbcbBdbk;Podvuv998Jjjjjbca9RgvcFFF;7rBd3av9cFFF;7;3FF:;Fb83dCavcFFF97Bdzav9cFFF;7FFF:;u83dwdnadTmbaicd4hodnabmbdnalTmbcbhrinaealarcdtfydbao2cdtfhwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkarcefgrad9hmbxikkaocdthrcbhwincbhiinavcCfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbxdkkdnalTmbcbhrinabarcx2fgiaealarcdtfydbao2cdtfgwIdbUdbaiawIdlUdlaiawIdwUdwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkarcefgrad9hmbxdkkaocdthlcbhraehwinabarcx2fgiaearao2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawalfhwarcefgrad9hmbkkJbbbbavIdwavIdCgk:tgqaqJbbbb9DEgqavIdxavIdKgx:tgmamaq9DEgqavIdzavId3gm:tgPaPaq9DEhPdnabTmbadTmbJbbbbJbbjZaP:vaPJbbbb9BEhqinabaqabIdbak:tNUdbabclfgvaqavIdbax:tNUdbabcwfgvaqavIdbam:tNUdbabcxfhbadcufgdmbkkaPk8MbabaeadaialavcbcbcbcbcbaoarawaDz:bjjjbk8MbabaeadaialavaoarawaDaqakaxamaPz:bjjjbk;3Aowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcxfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbgqBdxawceBd2aqaeadaicbz:djjjb8AawcuadcdtadcFFFFi0Egkcbyd;S1jjbHjjjjbbgxBdzawcdBd2adcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd;S1jjbHjjjjbbgsBdCawciBd2dndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd;S1jjbHjjjjbbg5BdKawclBd2dndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd;S1jjbHjjjjbbgeBd3awcvBd2aecbaiz:ljjjbhCavcd4hxdnadTmbdnalTmbaxcdthEa5hAalheaqhmadhOinaCaAydbc32fgiamIdbaiIdbMUdbaiamclfIdbaiIdlMUdlaiamcwfIdbaiIdwMUdwaiaeIdbaiIdxMUdxaiaeclfIdbaiIdzMUdzaiaecwfIdbaiIdCMUdCaiaiIdKJbbjZMUdKaAclfhAaeaEfheamcxfhmaOcufgOmbxdkka5hmaqheadhAinaCamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaiIdxJbbbbMUdxaiaiIdzJbbbbMUdzaiaiIdCJbbbbMUdCaiaiIdKJbbjZMUdKamclfhmaecxfheaAcufgAmbkkdnaDTmbaChiaDheinaiaiIdbJbbbbJbbjZaicKfIdbgH:vaHJbbbb9BEgHNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaicxfgmaHamIdbNUdbaiczfgmaHamIdbNUdbaicCfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd;S1jjbHjjjjbbgeBdaawcoBd2awaicbyd;S1jjbHjjjjbbgEBd8KaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;C1jjbalEgmIdwaCa5ydbgOc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aOcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcxffydbcbyd;O1jjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Odieui99iu8Jjjjjbca9RgicFFF;7rBd3ai9cFFF;7;3FF:;Fb83dCaicFFF97Bdzai9cFFF;7FFF:;u83dwdndnaembJbbjFhlJbbjFhvJbbjFhoxekadcd4cdthrcbhwincbhdinaicCfadfgDabadfIdbglaDIdbgvaval9EEUdbaicwfadfgDalaDIdbgvaval9DEUdbadclfgdcx9hmbkabarfhbawcefgwae9hmbkaiIdzaiId3:thoaiIdxaiIdK:thvaiIdwaiIdC:thlkJbbbbalalJbbbb9DEglavaval9DEglaoaoal9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd;W1jjbgeabcifc98GfgbBd;W1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd;W1jjbgeabcrfc94GfgbBd;W1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd;W1jjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd;W1jjbfgdBd;W1jjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:bedbcjwk9Oebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc;Owkxebbbdbbbj9Kbb", t = new Uint8Array([32, 0, 65, 2, 1, 106, 34, 33, 3, 128, 11, 4, 13, 64, 6, 253, 10, 7, 15, 116, 127, 5, 8, 12, 40, 16, 19, 54, 20, 9, 27, 255, 113, 17, 42, 67, 24, 23, 146, 148, 18, 14, 22, 45, 70, 69, 56, 114, 101, 21, 25, 63, 75, 136, 108, 28, 118, 29, 73, 115]); + if (typeof WebAssembly != "object") + return { + supported: !1 + }; + var n, i = WebAssembly.instantiate(r(e), {}).then(function(_) { + n = _.instance, n.exports.__wasm_call_ctors(); + }); + function r(_) { + for (var y = new Uint8Array(_.length), C = 0; C < _.length; ++C) { + var T = _.charCodeAt(C); + y[C] = T > 96 ? T - 97 : T > 64 ? T - 39 : T + 4; + } + for (var x = 0, C = 0; C < _.length; ++C) + y[x++] = y[C] < 60 ? t[y[C]] : (y[C] - 60) * 64 + y[++C]; + return y.buffer.slice(0, x); + } + function o(_) { + if (!_) + throw new Error("Assertion failed"); + } + function s(_) { + return new Uint8Array(_.buffer, _.byteOffset, _.byteLength); + } + function c(_, y, C) { + var T = n.exports.sbrk, x = T(y.length * 4), b = T(C * 4), S = new Uint8Array(n.exports.memory.buffer), E = s(y); + S.set(E, x); + var A = _(b, x, y.length, C); + S = new Uint8Array(n.exports.memory.buffer); + var D = new Uint32Array(C); + new Uint8Array(D.buffer).set(S.subarray(b, b + C * 4)), E.set(S.subarray(x, x + y.length * 4)), T(x - T(0)); + for (var P = 0; P < y.length; ++P) + y[P] = D[y[P]]; + return [D, A]; + } + function l(_) { + for (var y = 0, C = 0; C < _.length; ++C) { + var T = _[C]; + y = y < T ? T : y; + } + return y; + } + function d(_, y, C, T, x, b, S, E, A) { + var D = n.exports.sbrk, P = D(4), I = D(C * 4), M = D(x * b), R = D(C * 4), L = new Uint8Array(n.exports.memory.buffer); + L.set(s(T), M), L.set(s(y), R); + var g = _(I, R, C, M, x, b, S, E, A, P); + L = new Uint8Array(n.exports.memory.buffer); + var w = new Uint32Array(g); + s(w).set(L.subarray(I, I + g * 4)); + var O = new Float32Array(1); + return s(O).set(L.subarray(P, P + 4)), D(P - D(0)), [w, O[0]]; + } + function f(_, y, C, T, x, b, S, E, A, D, P, I, M) { + var R = n.exports.sbrk, L = R(4), g = R(C * 4), w = R(x * b), O = R(x * E), N = R(A.length * 4), F = R(C * 4), B = D ? R(x) : 0, V = new Uint8Array(n.exports.memory.buffer); + V.set(s(T), w), V.set(s(S), O), V.set(s(A), N), V.set(s(y), F), D && V.set(s(D), B); + var U = _(g, F, C, w, x, b, O, E, N, A.length, B, P, I, M, L); + V = new Uint8Array(n.exports.memory.buffer); + var k = new Uint32Array(U); + s(k).set(V.subarray(g, g + U * 4)); + var $ = new Float32Array(1); + return s($).set(V.subarray(L, L + 4)), R(L - R(0)), [k, $[0]]; + } + function h(_, y, C, T) { + var x = n.exports.sbrk, b = x(C * T), S = new Uint8Array(n.exports.memory.buffer); + S.set(s(y), b); + var E = _(b, C, T); + return x(b - x(0)), E; + } + function p(_, y, C, T, x, b, S, E) { + var A = n.exports.sbrk, D = A(E * 4), P = A(C * T), I = A(C * b), M = new Uint8Array(n.exports.memory.buffer); + M.set(s(y), P), x && M.set(s(x), I); + var R = _(D, P, C, T, I, b, S, E); + M = new Uint8Array(n.exports.memory.buffer); + var L = new Uint32Array(R); + return s(L).set(M.subarray(D, D + R * 4)), A(D - A(0)), L; + } + var m = { + LockBorder: 1, + Sparse: 2, + ErrorAbsolute: 4 + }; + return { + ready: i, + supported: !0, + // set this to true to be able to use simplifyPoints and simplifyWithAttributes + // note that these functions are experimental and may change interface/behavior in a way that will require revising calling code + useExperimentalFeatures: !1, + compactMesh: function(_) { + o(_ instanceof Uint32Array || _ instanceof Int32Array || _ instanceof Uint16Array || _ instanceof Int16Array), o(_.length % 3 == 0); + var y = _.BYTES_PER_ELEMENT == 4 ? _ : new Uint32Array(_); + return c(n.exports.meshopt_optimizeVertexFetchRemap, y, l(_) + 1); + }, + simplify: function(_, y, C, T, x, b) { + o(_ instanceof Uint32Array || _ instanceof Int32Array || _ instanceof Uint16Array || _ instanceof Int16Array), o(_.length % 3 == 0), o(y instanceof Float32Array), o(y.length % C == 0), o(C >= 3), o(T >= 0 && T <= _.length), o(T % 3 == 0), o(x >= 0); + for (var S = 0, E = 0; E < (b ? b.length : 0); ++E) + o(b[E] in m), S |= m[b[E]]; + var A = _.BYTES_PER_ELEMENT == 4 ? _ : new Uint32Array(_), D = d(n.exports.meshopt_simplify, A, _.length, y, y.length / C, C * 4, T, x, S); + return D[0] = _ instanceof Uint32Array ? D[0] : new _.constructor(D[0]), D; + }, + simplifyWithAttributes: function(_, y, C, T, x, b, S, E, A, D) { + o(this.useExperimentalFeatures), o(_ instanceof Uint32Array || _ instanceof Int32Array || _ instanceof Uint16Array || _ instanceof Int16Array), o(_.length % 3 == 0), o(y instanceof Float32Array), o(y.length % C == 0), o(C >= 3), o(T instanceof Float32Array), o(T.length % x == 0), o(x >= 0), o(S == null || S.length == y.length), o(E >= 0 && E <= _.length), o(E % 3 == 0), o(A >= 0), o(Array.isArray(b)), o(x >= b.length), o(b.length <= 16); + for (var P = 0, I = 0; I < (D ? D.length : 0); ++I) + o(D[I] in m), P |= m[D[I]]; + var M = _.BYTES_PER_ELEMENT == 4 ? _ : new Uint32Array(_), R = f(n.exports.meshopt_simplifyWithAttributes, M, _.length, y, y.length / C, C * 4, T, x * 4, new Float32Array(b), S ? new Uint8Array(S) : null, E, A, P); + return R[0] = _ instanceof Uint32Array ? R[0] : new _.constructor(R[0]), R; + }, + getScale: function(_, y) { + return o(_ instanceof Float32Array), o(_.length % y == 0), o(y >= 3), h(n.exports.meshopt_simplifyScale, _, _.length / y, y * 4); + }, + simplifyPoints: function(_, y, C, T, x, b) { + return o(this.useExperimentalFeatures), o(_ instanceof Float32Array), o(_.length % y == 0), o(y >= 3), o(C >= 0 && C <= _.length / y), T ? (o(T instanceof Float32Array), o(T.length % x == 0), o(x >= 3), o(_.length / y == T.length / x), p(n.exports.meshopt_simplifyPoints, _, _.length / y, y * 4, T, x * 4, b, C)) : p(n.exports.meshopt_simplifyPoints, _, _.length / y, y * 4, void 0, 0, 0, C); + } + }; +})(); +function GltfBufferViewLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.bufferViewId, r = e.gltfResource, o = e.baseResource, s = e.cacheKey, c = n.bufferViews[i]; + let l = c.buffer, d = c.byteOffset, f = c.byteLength, h = !1, p, m, _, y; + if (hasExtension(c, "EXT_meshopt_compression")) { + const T = c.extensions.EXT_meshopt_compression; + l = T.buffer, d = defaultValue(T.byteOffset, 0), f = T.byteLength, h = !0, p = T.byteStride, m = T.count, _ = T.mode, y = defaultValue(T.filter, "NONE"); + } + const C = n.buffers[l]; + this._hasMeshopt = h, this._meshoptByteStride = p, this._meshoptCount = m, this._meshoptMode = _, this._meshoptFilter = y, this._resourceCache = t, this._gltfResource = r, this._baseResource = o, this._buffer = C, this._bufferId = l, this._byteOffset = d, this._byteLength = f, this._cacheKey = s, this._bufferLoader = void 0, this._typedArray = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfBufferViewLoader.prototype = Object.create(ResourceLoader.prototype), GltfBufferViewLoader.prototype.constructor = GltfBufferViewLoader); +Object.defineProperties(GltfBufferViewLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfBufferViewLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The typed array containing buffer view data. + * + * @memberof GltfBufferViewLoader.prototype + * + * @type {Uint8Array} + * @readonly + * @private + */ + typedArray: { + get: function() { + return this._typedArray; + } + } +}); +async function loadResources$4(e) { + try { + const t = getBufferLoader(e); + if (e._bufferLoader = t, await t.load(), e.isDestroyed()) + return; + const n = t.typedArray, i = new Uint8Array( + n.buffer, + n.byteOffset + e._byteOffset, + e._byteLength + ); + if (e.unload(), e._typedArray = i, e._hasMeshopt) { + const r = e._meshoptCount, o = e._meshoptByteStride, s = new Uint8Array(r * o); + MeshoptDecoder.decodeGltfBuffer( + s, + r, + o, + e._typedArray, + e._meshoptMode, + e._meshoptFilter + ), e._typedArray = s; + } + return e._state = ResourceLoaderState$1.READY, e; + } catch (t) { + if (e.isDestroyed()) + return; + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load buffer view", t); + } +} +GltfBufferViewLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : (this._state = ResourceLoaderState$1.LOADING, this._promise = loadResources$4(this), this._promise); +}; +function getBufferLoader(e) { + const t = e._resourceCache, n = e._buffer; + if (defined(n.uri)) { + const r = e._baseResource.getDerivedResource({ + url: n.uri + }); + return t.getExternalBufferLoader({ + resource: r + }); + } + return t.getEmbeddedBufferLoader({ + parentResource: e._gltfResource, + bufferId: e._bufferId + }); +} +GltfBufferViewLoader.prototype.unload = function() { + defined(this._bufferLoader) && !this._bufferLoader.isDestroyed() && this._resourceCache.unload(this._bufferLoader), this._bufferLoader = void 0, this._typedArray = void 0; +}; +function DracoLoader() { +} +DracoLoader._maxDecodingConcurrency = Math.max( + FeatureDetection.hardwareConcurrency - 1, + 1 +); +DracoLoader._decoderTaskProcessor = void 0; +DracoLoader._taskProcessorReady = !1; +DracoLoader._error = void 0; +DracoLoader._getDecoderTaskProcessor = function() { + if (!defined(DracoLoader._decoderTaskProcessor)) { + const e = new TaskProcessor( + "decodeDraco", + DracoLoader._maxDecodingConcurrency + ); + e.initWebAssemblyModule({ + wasmBinaryFile: "ThirdParty/draco_decoder.wasm" + }).then(function(t) { + t ? DracoLoader._taskProcessorReady = !0 : DracoLoader._error = new RuntimeError( + "Draco decoder could not be initialized." + ); + }).catch((t) => { + DracoLoader._error = t; + }), DracoLoader._decoderTaskProcessor = e; + } + return DracoLoader._decoderTaskProcessor; +}; +DracoLoader.decodePointCloud = function(e) { + const t = DracoLoader._getDecoderTaskProcessor(); + if (defined(DracoLoader._error)) + throw DracoLoader._error; + if (DracoLoader._taskProcessorReady) + return t.scheduleTask(e, [ + e.buffer.buffer + ]); +}; +DracoLoader.decodeBufferView = function(e) { + const t = DracoLoader._getDecoderTaskProcessor(); + if (defined(DracoLoader._error)) + throw DracoLoader._error; + if (DracoLoader._taskProcessorReady) + return t.scheduleTask(e, [e.array.buffer]); +}; +function GltfDracoLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.draco, r = e.gltfResource, o = e.baseResource, s = e.cacheKey; + this._resourceCache = t, this._gltfResource = r, this._baseResource = o, this._gltf = n, this._draco = i, this._cacheKey = s, this._bufferViewLoader = void 0, this._bufferViewTypedArray = void 0, this._decodePromise = void 0, this._decodedData = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0, this._dracoError = void 0; +} +defined(Object.create) && (GltfDracoLoader.prototype = Object.create(ResourceLoader.prototype), GltfDracoLoader.prototype.constructor = GltfDracoLoader); +Object.defineProperties(GltfDracoLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfDracoLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The decoded data. + * + * @memberof GltfDracoLoader.prototype + * + * @type {object} + * @readonly + * @private + */ + decodedData: { + get: function() { + return this._decodedData; + } + } +}); +async function loadResources$3(e) { + const t = e._resourceCache; + try { + const n = t.getBufferViewLoader({ + gltf: e._gltf, + bufferViewId: e._draco.bufferView, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._bufferViewLoader = n, await n.load(), e.isDestroyed() ? void 0 : (e._bufferViewTypedArray = n.typedArray, e._state = ResourceLoaderState$1.PROCESSING, e); + } catch (n) { + if (e.isDestroyed()) + return; + handleError$a(e, n); + } +} +GltfDracoLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : (this._state = ResourceLoaderState$1.LOADING, this._promise = loadResources$3(this), this._promise); +}; +function handleError$a(e, t) { + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load Draco", t); +} +async function processDecode(e, t) { + try { + const n = await t; + return e.isDestroyed() ? void 0 : (e.unload(), e._decodedData = { + indices: n.indexArray, + vertexAttributes: n.attributeData + }, e._state = ResourceLoaderState$1.READY, e._baseResource); + } catch (n) { + if (e.isDestroyed()) + return; + e._dracoError = n; + } +} +GltfDracoLoader.prototype.process = function(e) { + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state !== ResourceLoaderState$1.PROCESSING || (defined(this._dracoError) && handleError$a(this, this._dracoError), !defined(this._bufferViewTypedArray)) || defined(this._decodePromise)) + return !1; + const t = this._draco, i = this._gltf.bufferViews, r = t.bufferView, o = i[r], s = t.attributes, c = { + // Need to make a copy of the typed array otherwise the underlying + // ArrayBuffer may be accessed on both the worker and the main thread. This + // leads to errors such as "ArrayBuffer at index 0 is already detached". + // PERFORMANCE_IDEA: Look into SharedArrayBuffer to get around this. + array: new Uint8Array(this._bufferViewTypedArray), + bufferView: o, + compressedAttributes: s, + dequantizeInShader: !0 + }, l = DracoLoader.decodeBufferView(c); + if (!defined(l)) + return !1; + this._decodePromise = processDecode(this, l); +}; +GltfDracoLoader.prototype.unload = function() { + defined(this._bufferViewLoader) && this._resourceCache.unload(this._bufferViewLoader), this._bufferViewLoader = void 0, this._bufferViewTypedArray = void 0, this._decodedData = void 0, this._gltf = void 0; +}; +function loadImageFromTypedArray(e) { + const t = e.uint8Array, n = e.format, i = e.request, r = defaultValue(e.flipY, !1), o = defaultValue( + e.skipColorSpaceConversion, + !1 + ), s = new Blob([t], { + type: n + }); + let c; + return Resource.supportsImageBitmapOptions().then(function(l) { + return l ? Promise.resolve( + Resource.createImageBitmapFromBlob(s, { + flipY: r, + premultiplyAlpha: !1, + skipColorSpaceConversion: o + }) + ) : (c = window.URL.createObjectURL(s), new Resource({ + url: c, + request: i + }).fetchImage({ + flipY: r, + skipColorSpaceConversion: o + })); + }).then(function(l) { + return defined(c) && window.URL.revokeObjectURL(c), l; + }).catch(function(l) { + return defined(c) && window.URL.revokeObjectURL(c), Promise.reject(l); + }); +} +function GltfImageLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.imageId, r = e.gltfResource, o = e.baseResource, s = e.cacheKey, c = n.images[i], l = c.bufferView, d = c.uri; + this._resourceCache = t, this._gltfResource = r, this._baseResource = o, this._gltf = n, this._bufferViewId = l, this._uri = d, this._cacheKey = s, this._bufferViewLoader = void 0, this._image = void 0, this._mipLevels = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfImageLoader.prototype = Object.create(ResourceLoader.prototype), GltfImageLoader.prototype.constructor = GltfImageLoader); +Object.defineProperties(GltfImageLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfImageLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The image. + * + * @memberof GltfImageLoader.prototype + * + * @type {Image|ImageBitmap|CompressedTextureBuffer} + * @readonly + * @private + */ + image: { + get: function() { + return this._image; + } + }, + /** + * The mip levels. Only defined for KTX2 files containing mip levels. + * + * @memberof GltfImageLoader.prototype + * + * @type {Uint8Array[]} + * @readonly + * @private + */ + mipLevels: { + get: function() { + return this._mipLevels; + } + } +}); +GltfImageLoader.prototype.load = function() { + return defined(this._promise) ? this._promise : defined(this._bufferViewId) ? (this._promise = loadFromBufferView$2(this), this._promise) : (this._promise = loadFromUri$1(this), this._promise); +}; +function getImageAndMipLevels(e) { + let t; + return Array.isArray(e) && (t = e.slice(1, e.length).map(function(n) { + return n.bufferView; + }), e = e[0]), { + image: e, + mipLevels: t + }; +} +async function loadFromBufferView$2(e) { + e._state = ResourceLoaderState$1.LOADING; + const t = e._resourceCache; + try { + const n = t.getBufferViewLoader({ + gltf: e._gltf, + bufferViewId: e._bufferViewId, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + if (e._bufferViewLoader = n, await n.load(), e.isDestroyed()) + return; + const i = n.typedArray, r = await loadImageFromBufferTypedArray(i); + if (e.isDestroyed()) + return; + const o = getImageAndMipLevels(r); + return e.unload(), e._image = o.image, e._mipLevels = o.mipLevels, e._state = ResourceLoaderState$1.READY, e; + } catch (n) { + return e.isDestroyed() ? void 0 : handleError$9(e, n, "Failed to load embedded image"); + } +} +async function loadFromUri$1(e) { + e._state = ResourceLoaderState$1.LOADING; + const t = e._baseResource, n = e._uri, i = t.getDerivedResource({ + url: n + }); + try { + const r = await loadImageFromUri(i); + if (e.isDestroyed()) + return; + const o = getImageAndMipLevels(r); + return e.unload(), e._image = o.image, e._mipLevels = o.mipLevels, e._state = ResourceLoaderState$1.READY, e; + } catch (r) { + return e.isDestroyed() ? void 0 : handleError$9(e, r, `Failed to load image: ${n}`); + } +} +function handleError$9(e, t, n) { + return e.unload(), e._state = ResourceLoaderState$1.FAILED, Promise.reject(e.getError(n, t)); +} +function getMimeTypeFromTypedArray(e) { + const t = e.subarray(0, 2), n = e.subarray(0, 4), i = e.subarray(8, 12); + if (t[0] === 255 && t[1] === 216) + return "image/jpeg"; + if (t[0] === 137 && t[1] === 80) + return "image/png"; + if (t[0] === 171 && t[1] === 75) + return "image/ktx2"; + if ( + // See https://developers.google.com/speed/webp/docs/riff_container#webp_file_header + n[0] === 82 && n[1] === 73 && n[2] === 70 && n[3] === 70 && i[0] === 87 && i[1] === 69 && i[2] === 66 && i[3] === 80 + ) + return "image/webp"; + throw new RuntimeError("Image format is not recognized"); +} +async function loadImageFromBufferTypedArray(e) { + const t = getMimeTypeFromTypedArray(e); + if (t === "image/ktx2") { + const n = new Uint8Array(e); + return loadKTX2(n); + } + return GltfImageLoader._loadImageFromTypedArray({ + uint8Array: e, + format: t, + flipY: !1, + skipColorSpaceConversion: !0 + }); +} +const ktx2Regex$1 = /(^data:image\/ktx2)|(\.ktx2$)/i; +function loadImageFromUri(e) { + const t = e.getUrlComponent(!1, !0); + return ktx2Regex$1.test(t) ? loadKTX2(e) : e.fetchImage({ + skipColorSpaceConversion: !0, + preferImageBitmap: !0 + }); +} +GltfImageLoader.prototype.unload = function() { + defined(this._bufferViewLoader) && !this._bufferViewLoader.isDestroyed() && this._resourceCache.unload(this._bufferViewLoader), this._bufferViewLoader = void 0, this._uri = void 0, this._image = void 0, this._mipLevels = void 0, this._gltf = void 0; +}; +GltfImageLoader._loadImageFromTypedArray = loadImageFromTypedArray; +const JobType = { + TEXTURE: 0, + PROGRAM: 1, + BUFFER: 2, + NUMBER_OF_JOB_TYPES: 3 +}, JobType$1 = Object.freeze(JobType); +function GltfIndexBufferLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.accessorId, r = e.gltfResource, o = e.baseResource, s = e.draco, c = e.cacheKey, l = defaultValue(e.asynchronous, !0), d = defaultValue(e.loadBuffer, !1), f = defaultValue(e.loadTypedArray, !1), h = n.accessors[i].componentType; + this._resourceCache = t, this._gltfResource = r, this._baseResource = o, this._gltf = n, this._accessorId = i, this._indexDatatype = h, this._draco = s, this._cacheKey = c, this._asynchronous = l, this._loadBuffer = d, this._loadTypedArray = f, this._bufferViewLoader = void 0, this._dracoLoader = void 0, this._typedArray = void 0, this._buffer = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfIndexBufferLoader.prototype = Object.create(ResourceLoader.prototype), GltfIndexBufferLoader.prototype.constructor = GltfIndexBufferLoader); +Object.defineProperties(GltfIndexBufferLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfIndexBufferLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The index buffer. This is only defined when loadBuffer is true. + * + * @memberof GltfIndexBufferLoader.prototype + * + * @type {Buffer} + * @readonly + * @private + */ + buffer: { + get: function() { + return this._buffer; + } + }, + /** + * The typed array containing indices. This is only defined when loadTypedArray is true. + * + * @memberof GltfIndexBufferLoader.prototype + * + * @type {Uint8Array|Uint16Array|Uint32Array} + * @readonly + * @private + */ + typedArray: { + get: function() { + return this._typedArray; + } + }, + /** + * The index datatype after decode. + * + * @memberof GltfIndexBufferLoader.prototype + * + * @type {IndexDatatype} + * @readonly + * @private + */ + indexDatatype: { + get: function() { + return this._indexDatatype; + } + } +}); +const scratchIndexBufferJob = new CreateIndexBufferJob(); +GltfIndexBufferLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : defined(this._draco) ? (this._promise = loadFromDraco$1(this), this._promise) : (this._promise = loadFromBufferView$1(this), this._promise); +}; +async function loadFromDraco$1(e) { + e._state = ResourceLoaderState$1.LOADING; + const t = e._resourceCache; + try { + const n = t.getDracoLoader({ + gltf: e._gltf, + draco: e._draco, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._dracoLoader = n, await n.load(), e.isDestroyed() ? void 0 : (e._state = ResourceLoaderState$1.LOADED, e); + } catch (n) { + if (e.isDestroyed()) + return; + handleError$8(e, n); + } +} +async function loadFromBufferView$1(e) { + const t = e._gltf, n = e._accessorId, r = t.accessors[n].bufferView; + e._state = ResourceLoaderState$1.LOADING; + const o = e._resourceCache; + try { + const s = o.getBufferViewLoader({ + gltf: t, + bufferViewId: r, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + if (e._bufferViewLoader = s, await s.load(), e.isDestroyed()) + return; + const c = s.typedArray; + return e._typedArray = createIndicesTypedArray( + e, + c + ), e._state = ResourceLoaderState$1.PROCESSING, e; + } catch (s) { + if (e.isDestroyed()) + return; + handleError$8(e, s); + } +} +function createIndicesTypedArray(e, t) { + const n = e._gltf, i = e._accessorId, r = n.accessors[i], o = r.count, s = r.componentType, c = IndexDatatype$1.getSizeInBytes(s); + let l = t.buffer, d = t.byteOffset + r.byteOffset; + if (d % c !== 0) { + const h = o * c, p = new Uint8Array(l, d, h); + l = new Uint8Array(p).buffer, d = 0, deprecationWarning( + "index-buffer-unaligned", + `The index array is not aligned to a ${c}-byte boundary.` + ); + } + let f; + return s === IndexDatatype$1.UNSIGNED_BYTE ? f = new Uint8Array(l, d, o) : s === IndexDatatype$1.UNSIGNED_SHORT ? f = new Uint16Array(l, d, o) : s === IndexDatatype$1.UNSIGNED_INT && (f = new Uint32Array(l, d, o)), f; +} +function handleError$8(e, t) { + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load index buffer", t); +} +function CreateIndexBufferJob() { + this.typedArray = void 0, this.indexDatatype = void 0, this.context = void 0, this.buffer = void 0; +} +CreateIndexBufferJob.prototype.set = function(e, t, n) { + this.typedArray = e, this.indexDatatype = t, this.context = n; +}; +CreateIndexBufferJob.prototype.execute = function() { + this.buffer = createIndexBuffer( + this.typedArray, + this.indexDatatype, + this.context + ); +}; +function createIndexBuffer(e, t, n) { + const i = Buffer.createIndexBuffer({ + typedArray: e, + context: n, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: t + }); + return i.vertexArrayDestroyable = !1, i; +} +GltfIndexBufferLoader.prototype.process = function(e) { + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state !== ResourceLoaderState$1.LOADED && this._state !== ResourceLoaderState$1.PROCESSING) + return !1; + let t = this._typedArray, n = this._indexDatatype; + if (defined(this._dracoLoader)) + try { + this._dracoLoader.process(e) && (t = this._dracoLoader.decodedData.indices.typedArray, this._typedArray = t, n = ComponentDatatype$1.fromTypedArray(t), this._indexDatatype = n); + } catch (r) { + handleError$8(this, r); + } + if (!defined(t)) + return !1; + let i; + if (this._loadBuffer && this._asynchronous) { + const r = scratchIndexBufferJob; + if (r.set(t, n, e.context), !e.jobScheduler.execute(r, JobType$1.BUFFER)) + return !1; + i = r.buffer; + } else this._loadBuffer && (i = createIndexBuffer(t, n, e.context)); + return this.unload(), this._buffer = i, this._typedArray = this._loadTypedArray ? t : void 0, this._state = ResourceLoaderState$1.READY, this._resourceCache.statistics.addGeometryLoader(this), !0; +}; +GltfIndexBufferLoader.prototype.unload = function() { + defined(this._buffer) && this._buffer.destroy(); + const e = this._resourceCache; + defined(this._bufferViewLoader) && !this._bufferViewLoader.isDestroyed() && e.unload(this._bufferViewLoader), defined(this._dracoLoader) && e.unload(this._dracoLoader), this._bufferViewLoader = void 0, this._dracoLoader = void 0, this._typedArray = void 0, this._buffer = void 0, this._gltf = void 0; +}; +function addToArray(e, t, n) { + if (n = defaultValue(n, !1), n) { + const i = e.indexOf(t); + if (i > -1) + return i; + } + return e.push(t), e.length - 1; +} +function usesExtension(e, t) { + return defined(e.extensionsUsed) && e.extensionsUsed.indexOf(t) >= 0; +} +function ForEach() { +} +ForEach.objectLegacy = function(e, t) { + if (defined(e)) { + for (const n in e) + if (Object.prototype.hasOwnProperty.call(e, n)) { + const i = e[n], r = t(i, n); + if (defined(r)) + return r; + } + } +}; +ForEach.object = function(e, t) { + if (defined(e)) { + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i], o = t(r, i); + if (defined(o)) + return o; + } + } +}; +ForEach.topLevel = function(e, t, n) { + const i = e[t]; + return defined(i) && !Array.isArray(i) ? ForEach.objectLegacy(i, n) : ForEach.object(i, n); +}; +ForEach.accessor = function(e, t) { + return ForEach.topLevel(e, "accessors", t); +}; +ForEach.accessorWithSemantic = function(e, t, n) { + const i = {}; + return ForEach.mesh(e, function(r) { + return ForEach.meshPrimitive(r, function(o) { + const s = ForEach.meshPrimitiveAttribute( + o, + function(c, l) { + if (l.indexOf(t) === 0 && !defined(i[c])) { + i[c] = !0; + const d = n(c); + if (defined(d)) + return d; + } + } + ); + return defined(s) ? s : ForEach.meshPrimitiveTarget(o, function(c) { + return ForEach.meshPrimitiveTargetAttribute( + c, + function(l, d) { + if (d.indexOf(t) === 0 && !defined(i[l])) { + i[l] = !0; + const f = n(l); + if (defined(f)) + return f; + } + } + ); + }); + }); + }); +}; +ForEach.accessorContainingVertexAttributeData = function(e, t) { + const n = {}; + return ForEach.mesh(e, function(i) { + return ForEach.meshPrimitive(i, function(r) { + const o = ForEach.meshPrimitiveAttribute( + r, + function(s) { + if (!defined(n[s])) { + n[s] = !0; + const c = t(s); + if (defined(c)) + return c; + } + } + ); + return defined(o) ? o : ForEach.meshPrimitiveTarget(r, function(s) { + return ForEach.meshPrimitiveTargetAttribute( + s, + function(c) { + if (!defined(n[c])) { + n[c] = !0; + const l = t(c); + if (defined(l)) + return l; + } + } + ); + }); + }); + }); +}; +ForEach.accessorContainingIndexData = function(e, t) { + const n = {}; + return ForEach.mesh(e, function(i) { + return ForEach.meshPrimitive(i, function(r) { + const o = r.indices; + if (defined(o) && !defined(n[o])) { + n[o] = !0; + const s = t(o); + if (defined(s)) + return s; + } + }); + }); +}; +ForEach.animation = function(e, t) { + return ForEach.topLevel(e, "animations", t); +}; +ForEach.animationChannel = function(e, t) { + const n = e.channels; + return ForEach.object(n, t); +}; +ForEach.animationSampler = function(e, t) { + const n = e.samplers; + return ForEach.object(n, t); +}; +ForEach.buffer = function(e, t) { + return ForEach.topLevel(e, "buffers", t); +}; +ForEach.bufferView = function(e, t) { + return ForEach.topLevel(e, "bufferViews", t); +}; +ForEach.camera = function(e, t) { + return ForEach.topLevel(e, "cameras", t); +}; +ForEach.image = function(e, t) { + return ForEach.topLevel(e, "images", t); +}; +ForEach.material = function(e, t) { + return ForEach.topLevel(e, "materials", t); +}; +ForEach.materialValue = function(e, t) { + let n = e.values; + defined(e.extensions) && defined(e.extensions.KHR_techniques_webgl) && (n = e.extensions.KHR_techniques_webgl.values); + for (const i in n) + if (Object.prototype.hasOwnProperty.call(n, i)) { + const r = t(n[i], i); + if (defined(r)) + return r; + } +}; +ForEach.mesh = function(e, t) { + return ForEach.topLevel(e, "meshes", t); +}; +ForEach.meshPrimitive = function(e, t) { + const n = e.primitives; + if (defined(n)) { + const i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r], s = t(o, r); + if (defined(s)) + return s; + } + } +}; +ForEach.meshPrimitiveAttribute = function(e, t) { + const n = e.attributes; + for (const i in n) + if (Object.prototype.hasOwnProperty.call(n, i)) { + const r = t(n[i], i); + if (defined(r)) + return r; + } +}; +ForEach.meshPrimitiveTarget = function(e, t) { + const n = e.targets; + if (defined(n)) { + const i = n.length; + for (let r = 0; r < i; ++r) { + const o = t(n[r], r); + if (defined(o)) + return o; + } + } +}; +ForEach.meshPrimitiveTargetAttribute = function(e, t) { + for (const n in e) + if (Object.prototype.hasOwnProperty.call(e, n)) { + const i = e[n], r = t(i, n); + if (defined(r)) + return r; + } +}; +ForEach.node = function(e, t) { + return ForEach.topLevel(e, "nodes", t); +}; +ForEach.nodeInTree = function(e, t, n) { + const i = e.nodes; + if (defined(i)) { + const r = t.length; + for (let o = 0; o < r; o++) { + const s = t[o], c = i[s]; + if (defined(c)) { + let l = n(c, s); + if (defined(l)) + return l; + const d = c.children; + if (defined(d) && (l = ForEach.nodeInTree(e, d, n), defined(l))) + return l; + } + } + } +}; +ForEach.nodeInScene = function(e, t, n) { + const i = t.nodes; + if (defined(i)) + return ForEach.nodeInTree(e, i, n); +}; +ForEach.program = function(e, t) { + return usesExtension(e, "KHR_techniques_webgl") ? ForEach.object( + e.extensions.KHR_techniques_webgl.programs, + t + ) : ForEach.topLevel(e, "programs", t); +}; +ForEach.sampler = function(e, t) { + return ForEach.topLevel(e, "samplers", t); +}; +ForEach.scene = function(e, t) { + return ForEach.topLevel(e, "scenes", t); +}; +ForEach.shader = function(e, t) { + return usesExtension(e, "KHR_techniques_webgl") ? ForEach.object( + e.extensions.KHR_techniques_webgl.shaders, + t + ) : ForEach.topLevel(e, "shaders", t); +}; +ForEach.skin = function(e, t) { + return ForEach.topLevel(e, "skins", t); +}; +ForEach.skinJoint = function(e, t) { + const n = e.joints; + if (defined(n)) { + const i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r], s = t(o); + if (defined(s)) + return s; + } + } +}; +ForEach.techniqueAttribute = function(e, t) { + const n = e.attributes; + for (const i in n) + if (Object.prototype.hasOwnProperty.call(n, i)) { + const r = t(n[i], i); + if (defined(r)) + return r; + } +}; +ForEach.techniqueUniform = function(e, t) { + const n = e.uniforms; + for (const i in n) + if (Object.prototype.hasOwnProperty.call(n, i)) { + const r = t(n[i], i); + if (defined(r)) + return r; + } +}; +ForEach.techniqueParameter = function(e, t) { + const n = e.parameters; + for (const i in n) + if (Object.prototype.hasOwnProperty.call(n, i)) { + const r = t(n[i], i); + if (defined(r)) + return r; + } +}; +ForEach.technique = function(e, t) { + return usesExtension(e, "KHR_techniques_webgl") ? ForEach.object( + e.extensions.KHR_techniques_webgl.techniques, + t + ) : ForEach.topLevel(e, "techniques", t); +}; +ForEach.texture = function(e, t) { + return ForEach.topLevel(e, "textures", t); +}; +function numberOfComponentsForType(e) { + switch (e) { + case "SCALAR": + return 1; + case "VEC2": + return 2; + case "VEC3": + return 3; + case "VEC4": + case "MAT2": + return 4; + case "MAT3": + return 9; + case "MAT4": + return 16; + } +} +function getAccessorByteStride(e, t) { + const n = t.bufferView; + if (defined(n)) { + const i = e.bufferViews[n]; + if (defined(i.byteStride) && i.byteStride > 0) + return i.byteStride; + } + return ComponentDatatype$1.getSizeInBytes(t.componentType) * numberOfComponentsForType(t.type); +} +function addDefaults(e) { + ForEach.accessor(e, function(n) { + defined(n.bufferView) && (n.byteOffset = defaultValue(n.byteOffset, 0)); + }), ForEach.bufferView(e, function(n) { + defined(n.buffer) && (n.byteOffset = defaultValue(n.byteOffset, 0)); + }), ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + if (i.mode = defaultValue(i.mode, WebGLConstants$1.TRIANGLES), !defined(i.material)) { + defined(e.materials) || (e.materials = []); + const r = { + name: "default" + }; + i.material = addToArray(e.materials, r); + } + }); + }), ForEach.accessorContainingVertexAttributeData(e, function(n) { + const i = e.accessors[n], r = i.bufferView; + if (i.normalized = defaultValue(i.normalized, !1), defined(r)) { + const o = e.bufferViews[r]; + o.byteStride = getAccessorByteStride(e, i), o.target = WebGLConstants$1.ARRAY_BUFFER; + } + }), ForEach.accessorContainingIndexData(e, function(n) { + const r = e.accessors[n].bufferView; + if (defined(r)) { + const o = e.bufferViews[r]; + o.target = WebGLConstants$1.ELEMENT_ARRAY_BUFFER; + } + }), ForEach.material(e, function(n) { + const i = defaultValue( + n.extensions, + defaultValue.EMPTY_OBJECT + ), r = i.KHR_materials_common; + if (defined(r)) { + const l = r.technique, d = defined(r.values) ? r.values : {}; + r.values = d, d.ambient = defined(d.ambient) ? d.ambient : [0, 0, 0, 1], d.emission = defined(d.emission) ? d.emission : [0, 0, 0, 1], d.transparency = defaultValue(d.transparency, 1), l !== "CONSTANT" && (d.diffuse = defined(d.diffuse) ? d.diffuse : [0, 0, 0, 1], l !== "LAMBERT" && (d.specular = defined(d.specular) ? d.specular : [0, 0, 0, 1], d.shininess = defaultValue(d.shininess, 0))), r.transparent = defaultValue( + r.transparent, + !1 + ), r.doubleSided = defaultValue( + r.doubleSided, + !1 + ); + return; + } + n.emissiveFactor = defaultValue( + n.emissiveFactor, + [0, 0, 0] + ), n.alphaMode = defaultValue(n.alphaMode, "OPAQUE"), n.doubleSided = defaultValue(n.doubleSided, !1), n.alphaMode === "MASK" && (n.alphaCutoff = defaultValue(n.alphaCutoff, 0.5)); + const o = i.KHR_techniques_webgl; + defined(o) && ForEach.materialValue(n, function(l) { + defined(l.index) && addTextureDefaults(l); + }), addTextureDefaults(n.emissiveTexture), addTextureDefaults(n.normalTexture), addTextureDefaults(n.occlusionTexture); + const s = n.pbrMetallicRoughness; + defined(s) && (s.baseColorFactor = defaultValue( + s.baseColorFactor, + [1, 1, 1, 1] + ), s.metallicFactor = defaultValue( + s.metallicFactor, + 1 + ), s.roughnessFactor = defaultValue( + s.roughnessFactor, + 1 + ), addTextureDefaults(s.baseColorTexture), addTextureDefaults(s.metallicRoughnessTexture)); + const c = i.KHR_materials_pbrSpecularGlossiness; + defined(c) && (c.diffuseFactor = defaultValue( + c.diffuseFactor, + [1, 1, 1, 1] + ), c.specularFactor = defaultValue( + c.specularFactor, + [1, 1, 1] + ), c.glossinessFactor = defaultValue( + c.glossinessFactor, + 1 + ), addTextureDefaults(c.specularGlossinessTexture)); + }), ForEach.animation(e, function(n) { + ForEach.animationSampler(n, function(i) { + i.interpolation = defaultValue(i.interpolation, "LINEAR"); + }); + }); + const t = getAnimatedNodes(e); + return ForEach.node(e, function(n, i) { + defined(t[i]) || defined(n.translation) || defined(n.rotation) || defined(n.scale) ? (n.translation = defaultValue(n.translation, [0, 0, 0]), n.rotation = defaultValue(n.rotation, [0, 0, 0, 1]), n.scale = defaultValue(n.scale, [1, 1, 1])) : n.matrix = defaultValue( + n.matrix, + [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ] + ); + }), ForEach.sampler(e, function(n) { + n.wrapS = defaultValue(n.wrapS, WebGLConstants$1.REPEAT), n.wrapT = defaultValue(n.wrapT, WebGLConstants$1.REPEAT); + }), defined(e.scenes) && !defined(e.scene) && (e.scene = 0), e; +} +function getAnimatedNodes(e) { + const t = {}; + return ForEach.animation(e, function(n) { + ForEach.animationChannel(n, function(i) { + const r = i.target, o = r.node, s = r.path; + (s === "translation" || s === "rotation" || s === "scale") && (t[o] = !0); + }); + }), t; +} +function addTextureDefaults(e) { + defined(e) && (e.texCoord = defaultValue(e.texCoord, 0)); +} +function addPipelineExtras(e) { + return ForEach.shader(e, function(t) { + addExtras(t); + }), ForEach.buffer(e, function(t) { + addExtras(t); + }), ForEach.image(e, function(t) { + addExtras(t); + }), addExtras(e), e; +} +function addExtras(e) { + e.extras = defined(e.extras) ? e.extras : {}, e.extras._pipeline = defined(e.extras._pipeline) ? e.extras._pipeline : {}; +} +function removeExtensionsRequired(e, t) { + const n = e.extensionsRequired; + if (defined(n)) { + const i = n.indexOf(t); + i >= 0 && n.splice(i, 1), n.length === 0 && delete e.extensionsRequired; + } +} +function removeExtensionsUsed(e, t) { + const n = e.extensionsUsed; + if (defined(n)) { + const i = n.indexOf(t); + i >= 0 && n.splice(i, 1), removeExtensionsRequired(e, t), n.length === 0 && delete e.extensionsUsed; + } +} +const sizeOfUint32$5 = 4; +function parseGlb(e) { + if (getMagic(e) !== "glTF") + throw new RuntimeError("File is not valid binary glTF"); + const n = readHeader(e, 0, 5), i = n[1]; + if (i !== 1 && i !== 2) + throw new RuntimeError("Binary glTF version is not 1 or 2"); + return i === 1 ? parseGlbVersion1(e, n) : parseGlbVersion2(e, n); +} +function readHeader(e, t, n) { + const i = new DataView(e.buffer), r = new Array(n); + for (let o = 0; o < n; ++o) + r[o] = i.getUint32( + e.byteOffset + t + o * sizeOfUint32$5, + !0 + ); + return r; +} +function parseGlbVersion1(e, t) { + const n = t[2], i = t[3]; + if (t[4] !== 0) + throw new RuntimeError("Binary glTF scene format is not JSON"); + const o = 20, s = o + i, c = getStringFromTypedArray(e, o, i), l = JSON.parse(c); + addPipelineExtras(l); + const d = e.subarray(s, n), f = l.buffers; + if (defined(f) && Object.keys(f).length > 0) { + const h = defaultValue( + f.binary_glTF, + f.KHR_binary_glTF + ); + defined(h) && (h.extras._pipeline.source = d, delete h.uri); + } + return removeExtensionsUsed(l, "KHR_binary_glTF"), l; +} +function parseGlbVersion2(e, t) { + const n = t[2]; + let i = 12, r, o; + for (; i < n; ) { + const s = readHeader(e, i, 2), c = s[0], l = s[1]; + i += 8; + const d = e.subarray(i, i + c); + if (i += c, l === 1313821514) { + const f = getStringFromTypedArray(d); + r = JSON.parse(f), addPipelineExtras(r); + } else l === 5130562 && (o = d); + } + if (defined(r) && defined(o)) { + const s = r.buffers; + if (defined(s) && s.length > 0) { + const c = s[0]; + c.extras._pipeline.source = o; + } + } + return r; +} +function removePipelineExtras(e) { + return ForEach.shader(e, function(t) { + removeExtras(t); + }), ForEach.buffer(e, function(t) { + removeExtras(t); + }), ForEach.image(e, function(t) { + removeExtras(t); + }), removeExtras(e), e; +} +function removeExtras(e) { + defined(e.extras) && (defined(e.extras._pipeline) && delete e.extras._pipeline, Object.keys(e.extras).length === 0 && delete e.extras); +} +function addExtensionsUsed(e, t) { + let n = e.extensionsUsed; + defined(n) || (n = [], e.extensionsUsed = n), addToArray(n, t, !0); +} +function getComponentReader(e) { + switch (e) { + case ComponentDatatype$1.BYTE: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getInt8( + n + s * r + ); + }; + case ComponentDatatype$1.UNSIGNED_BYTE: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getUint8( + n + s * r + ); + }; + case ComponentDatatype$1.SHORT: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getInt16( + n + s * r, + !0 + ); + }; + case ComponentDatatype$1.UNSIGNED_SHORT: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getUint16( + n + s * r, + !0 + ); + }; + case ComponentDatatype$1.INT: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getInt32( + n + s * r, + !0 + ); + }; + case ComponentDatatype$1.UNSIGNED_INT: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getUint32( + n + s * r, + !0 + ); + }; + case ComponentDatatype$1.FLOAT: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getFloat32( + n + s * r, + !0 + ); + }; + case ComponentDatatype$1.DOUBLE: + return function(t, n, i, r, o) { + for (let s = 0; s < i; ++s) + o[s] = t.getFloat64( + n + s * r, + !0 + ); + }; + } +} +function findAccessorMinMax(e, t) { + const n = e.bufferViews, i = e.buffers, r = t.bufferView, o = numberOfComponentsForType(t.type); + if (!defined(t.bufferView)) + return { + min: new Array(o).fill(0), + max: new Array(o).fill(0) + }; + const s = new Array(o).fill(Number.POSITIVE_INFINITY), c = new Array(o).fill(Number.NEGATIVE_INFINITY), l = n[r], d = l.buffer, h = i[d].extras._pipeline.source, p = t.count, m = getAccessorByteStride(e, t); + let _ = t.byteOffset + l.byteOffset + h.byteOffset; + const y = t.componentType, C = ComponentDatatype$1.getSizeInBytes(y), T = new DataView(h.buffer), x = new Array(o), b = getComponentReader(y); + for (let S = 0; S < p; S++) { + b( + T, + _, + o, + C, + x + ); + for (let E = 0; E < o; E++) { + const A = x[E]; + s[E] = Math.min(s[E], A), c[E] = Math.max(c[E], A); + } + _ += m; + } + return { + min: s, + max: c + }; +} +const defaultBlendEquation = [WebGLConstants$1.FUNC_ADD, WebGLConstants$1.FUNC_ADD], defaultBlendFactors = [ + WebGLConstants$1.ONE, + WebGLConstants$1.ZERO, + WebGLConstants$1.ONE, + WebGLConstants$1.ZERO +]; +function isStateEnabled(e, t) { + const n = e.enable; + return defined(n) ? n.indexOf(t) > -1 : !1; +} +const supportedBlendFactors = [ + WebGLConstants$1.ZERO, + WebGLConstants$1.ONE, + WebGLConstants$1.SRC_COLOR, + WebGLConstants$1.ONE_MINUS_SRC_COLOR, + WebGLConstants$1.SRC_ALPHA, + WebGLConstants$1.ONE_MINUS_SRC_ALPHA, + WebGLConstants$1.DST_ALPHA, + WebGLConstants$1.ONE_MINUS_DST_ALPHA, + WebGLConstants$1.DST_COLOR, + WebGLConstants$1.ONE_MINUS_DST_COLOR +]; +function getSupportedBlendFactors(e, t) { + if (!defined(e)) + return t; + for (let n = 0; n < 4; n++) + if (supportedBlendFactors.indexOf(e[n]) === -1) + return t; + return e; +} +function moveTechniqueRenderStates(e) { + const t = {}, n = {}, i = e.techniques; + return defined(i) && (ForEach.technique(e, function(r, o) { + const s = r.states; + if (defined(s)) { + const c = n[o] = {}; + if (isStateEnabled(s, WebGLConstants$1.BLEND)) { + c.alphaMode = "BLEND"; + const l = s.functions; + defined(l) && (defined(l.blendEquationSeparate) || defined(l.blendFuncSeparate)) && (t[o] = { + blendEquation: defaultValue( + l.blendEquationSeparate, + defaultBlendEquation + ), + blendFactors: getSupportedBlendFactors( + l.blendFuncSeparate, + defaultBlendFactors + ) + }); + } + isStateEnabled(s, WebGLConstants$1.CULL_FACE) || (c.doubleSided = !0), delete r.states; + } + }), Object.keys(t).length > 0 && (defined(e.extensions) || (e.extensions = {}), addExtensionsUsed(e, "KHR_blend")), ForEach.material(e, function(r) { + if (defined(r.technique)) { + const o = n[r.technique]; + ForEach.objectLegacy(o, function(c, l) { + r[l] = c; + }); + const s = t[r.technique]; + defined(s) && (defined(r.extensions) || (r.extensions = {}), r.extensions.KHR_blend = s); + } + })), e; +} +function addExtensionsRequired(e, t) { + let n = e.extensionsRequired; + defined(n) || (n = [], e.extensionsRequired = n), addToArray(n, t, !0), addExtensionsUsed(e, t); +} +function moveTechniquesToExtension(e) { + const t = e.techniques, n = {}, i = {}, r = {}; + if (defined(t)) { + const o = { + programs: [], + shaders: [], + techniques: [] + }, s = e.glExtensionsUsed; + delete e.glExtensionsUsed, ForEach.technique(e, function(c, l) { + const d = { + name: c.name, + program: void 0, + attributes: {}, + uniforms: {} + }; + let f; + if (ForEach.techniqueAttribute( + c, + function(h, p) { + f = c.parameters[h], d.attributes[p] = { + semantic: f.semantic + }; + } + ), ForEach.techniqueUniform( + c, + function(h, p) { + f = c.parameters[h], d.uniforms[p] = { + count: f.count, + node: f.node, + type: f.type, + semantic: f.semantic, + value: f.value + }, defined(n[l]) || (n[l] = {}), n[l][h] = p; + } + ), defined(r[c.program])) + d.program = r[c.program]; + else { + const h = e.programs[c.program], p = { + name: h.name, + fragmentShader: void 0, + vertexShader: void 0, + glExtensions: s + }, m = e.shaders[h.fragmentShader]; + p.fragmentShader = addToArray(o.shaders, m, !0); + const _ = e.shaders[h.vertexShader]; + p.vertexShader = addToArray(o.shaders, _, !0), d.program = addToArray(o.programs, p), r[c.program] = d.program; + } + i[l] = addToArray( + o.techniques, + d + ); + }), o.techniques.length > 0 && (defined(e.extensions) || (e.extensions = {}), e.extensions.KHR_techniques_webgl = o, addExtensionsUsed(e, "KHR_techniques_webgl"), addExtensionsRequired(e, "KHR_techniques_webgl")); + } + return ForEach.material(e, function(o) { + if (defined(o.technique)) { + const s = { + technique: i[o.technique] + }; + ForEach.objectLegacy(o.values, function(c, l) { + defined(s.values) || (s.values = {}); + const d = n[o.technique][l]; + defined(d) && (s.values[d] = c); + }), defined(o.extensions) || (o.extensions = {}), o.extensions.KHR_techniques_webgl = s; + } + delete o.technique, delete o.values; + }), delete e.techniques, delete e.programs, delete e.shaders, e; +} +function forEachTextureInMaterial(e, t) { + Check.typeOf.object("material", e), Check.defined("handler", t); + const n = e.pbrMetallicRoughness; + if (defined(n)) { + if (defined(n.baseColorTexture)) { + const o = n.baseColorTexture, s = t(o.index, o); + if (defined(s)) + return s; + } + if (defined(n.metallicRoughnessTexture)) { + const o = n.metallicRoughnessTexture, s = t(o.index, o); + if (defined(s)) + return s; + } + } + const { extensions: i } = e; + if (defined(i)) { + const o = i.KHR_materials_pbrSpecularGlossiness; + if (defined(o)) { + if (defined(o.diffuseTexture)) { + const l = o.diffuseTexture, d = t(l.index, l); + if (defined(d)) + return d; + } + if (defined(o.specularGlossinessTexture)) { + const l = o.specularGlossinessTexture, d = t(l.index, l); + if (defined(d)) + return d; + } + } + const s = i.KHR_materials_specular; + if (defined(s)) { + const { specularTexture: l, specularColorTexture: d } = s; + if (defined(l)) { + const f = t(l.index, l); + if (defined(f)) + return f; + } + if (defined(d)) { + const f = t(d.index, d); + if (defined(f)) + return f; + } + } + const c = i.KHR_materials_common; + if (defined(c) && defined(c.values)) { + const { diffuse: l, ambient: d, emission: f, specular: h } = c.values; + if (defined(l) && defined(l.index)) { + const p = t(l.index, l); + if (defined(p)) + return p; + } + if (defined(d) && defined(d.index)) { + const p = t(d.index, d); + if (defined(p)) + return p; + } + if (defined(f) && defined(f.index)) { + const p = t(f.index, f); + if (defined(p)) + return p; + } + if (defined(h) && defined(h.index)) { + const p = t(h.index, h); + if (defined(p)) + return p; + } + } + } + const r = ForEach.materialValue(e, function(o) { + if (defined(o.index)) { + const s = t(o.index, o); + if (defined(s)) + return s; + } + }); + if (defined(r)) + return r; + if (defined(e.emissiveTexture)) { + const o = e.emissiveTexture, s = t(o.index, o); + if (defined(s)) + return s; + } + if (defined(e.normalTexture)) { + const o = e.normalTexture, s = t(o.index, o); + if (defined(s)) + return s; + } + if (defined(e.occlusionTexture)) { + const o = e.occlusionTexture, s = t(o.index, o); + if (defined(s)) + return s; + } +} +const allElementTypes = [ + "mesh", + "node", + "material", + "accessor", + "bufferView", + "buffer", + "texture", + "sampler", + "image" +]; +function removeUnusedElements(e, t) { + return t = defaultValue(t, allElementTypes), allElementTypes.forEach(function(n) { + t.indexOf(n) > -1 && removeUnusedElementsByType(e, n); + }), e; +} +const TypeToGltfElementName = { + accessor: "accessors", + buffer: "buffers", + bufferView: "bufferViews", + image: "images", + node: "nodes", + material: "materials", + mesh: "meshes", + sampler: "samplers", + texture: "textures" +}; +function removeUnusedElementsByType(e, t) { + const n = TypeToGltfElementName[t], i = e[n]; + if (defined(i)) { + let r = 0; + const o = getListOfElementsIdsInUse[t](e), s = i.length; + for (let c = 0; c < s; ++c) + o[c] || (Remove[t](e, c - r), r++); + } +} +function Remove() { +} +Remove.accessor = function(e, t) { + e.accessors.splice(t, 1), ForEach.mesh(e, function(i) { + ForEach.meshPrimitive(i, function(r) { + ForEach.meshPrimitiveAttribute( + r, + function(c, l) { + c > t && r.attributes[l]--; + } + ), ForEach.meshPrimitiveTarget(r, function(c) { + ForEach.meshPrimitiveTargetAttribute( + c, + function(l, d) { + l > t && c[d]--; + } + ); + }); + const o = r.indices; + defined(o) && o > t && r.indices--; + const s = r.extensions; + defined(s) && defined(s.CESIUM_primitive_outline) && s.CESIUM_primitive_outline.indices > t && --s.CESIUM_primitive_outline.indices; + }); + }), ForEach.skin(e, function(i) { + defined(i.inverseBindMatrices) && i.inverseBindMatrices > t && i.inverseBindMatrices--; + }), ForEach.animation(e, function(i) { + ForEach.animationSampler(i, function(r) { + defined(r.input) && r.input > t && r.input--, defined(r.output) && r.output > t && r.output--; + }); + }); +}; +Remove.buffer = function(e, t) { + e.buffers.splice(t, 1), ForEach.bufferView(e, function(i) { + defined(i.buffer) && i.buffer > t && i.buffer--, defined(i.extensions) && defined(i.extensions.EXT_meshopt_compression) && i.extensions.EXT_meshopt_compression.buffer--; + }); +}; +Remove.bufferView = function(e, t) { + if (e.bufferViews.splice(t, 1), ForEach.accessor(e, function(i) { + defined(i.bufferView) && i.bufferView > t && i.bufferView--; + }), ForEach.shader(e, function(i) { + defined(i.bufferView) && i.bufferView > t && i.bufferView--; + }), ForEach.image(e, function(i) { + defined(i.bufferView) && i.bufferView > t && i.bufferView--; + }), usesExtension(e, "KHR_draco_mesh_compression") && ForEach.mesh(e, function(i) { + ForEach.meshPrimitive(i, function(r) { + defined(r.extensions) && defined(r.extensions.KHR_draco_mesh_compression) && r.extensions.KHR_draco_mesh_compression.bufferView > t && r.extensions.KHR_draco_mesh_compression.bufferView--; + }); + }), usesExtension(e, "EXT_feature_metadata")) { + const r = e.extensions.EXT_feature_metadata.featureTables; + for (const o in r) + if (r.hasOwnProperty(o)) { + const c = r[o].properties; + if (defined(c)) { + for (const l in c) + if (c.hasOwnProperty(l)) { + const d = c[l]; + defined(d.bufferView) && d.bufferView > t && d.bufferView--, defined(d.arrayOffsetBufferView) && d.arrayOffsetBufferView > t && d.arrayOffsetBufferView--, defined(d.stringOffsetBufferView) && d.stringOffsetBufferView > t && d.stringOffsetBufferView--; + } + } + } + } + if (usesExtension(e, "EXT_structural_metadata")) { + const r = e.extensions.EXT_structural_metadata.propertyTables; + if (defined(r)) { + const o = r.length; + for (let s = 0; s < o; ++s) { + const l = r[s].properties; + for (const d in l) + if (l.hasOwnProperty(d)) { + const f = l[d]; + defined(f.values) && f.values > t && f.values--, defined(f.arrayOffsets) && f.arrayOffsets > t && f.arrayOffsets--, defined(f.stringOffsets) && f.stringOffsets > t && f.stringOffsets--; + } + } + } + } +}; +Remove.image = function(e, t) { + e.images.splice(t, 1), ForEach.texture(e, function(i) { + defined(i.source) && i.source > t && --i.source; + const r = i.extensions; + defined(r) && defined(r.EXT_texture_webp) && r.EXT_texture_webp.source > t ? --i.extensions.EXT_texture_webp.source : defined(r) && defined(r.KHR_texture_basisu) && r.KHR_texture_basisu.source > t && --i.extensions.KHR_texture_basisu.source; + }); +}; +Remove.mesh = function(e, t) { + e.meshes.splice(t, 1), ForEach.node(e, function(i) { + defined(i.mesh) && (i.mesh > t ? i.mesh-- : i.mesh === t && delete i.mesh); + }); +}; +Remove.node = function(e, t) { + e.nodes.splice(t, 1), ForEach.skin(e, function(i) { + defined(i.skeleton) && i.skeleton > t && i.skeleton--, i.joints = i.joints.map(function(r) { + return r > t ? r - 1 : r; + }); + }), ForEach.animation(e, function(i) { + ForEach.animationChannel(i, function(r) { + defined(r.target) && defined(r.target.node) && r.target.node > t && r.target.node--; + }); + }), ForEach.technique(e, function(i) { + ForEach.techniqueUniform(i, function(r) { + defined(r.node) && r.node > t && r.node--; + }); + }), ForEach.node(e, function(i) { + defined(i.children) && (i.children = i.children.filter(function(r) { + return r !== t; + }).map(function(r) { + return r > t ? r - 1 : r; + })); + }), ForEach.scene(e, function(i) { + i.nodes = i.nodes.filter(function(r) { + return r !== t; + }).map(function(r) { + return r > t ? r - 1 : r; + }); + }); +}; +Remove.material = function(e, t) { + e.materials.splice(t, 1), ForEach.mesh(e, function(i) { + ForEach.meshPrimitive(i, function(r) { + defined(r.material) && r.material > t && r.material--; + }); + }); +}; +Remove.sampler = function(e, t) { + e.samplers.splice(t, 1), ForEach.texture(e, function(i) { + defined(i.sampler) && i.sampler > t && --i.sampler; + }); +}; +Remove.texture = function(e, t) { + if (e.textures.splice(t, 1), ForEach.material(e, function(i) { + forEachTextureInMaterial(i, function(r, o) { + o.index > t && --o.index; + }); + }), usesExtension(e, "EXT_feature_metadata")) { + ForEach.mesh(e, function(o) { + ForEach.meshPrimitive(o, function(s) { + const c = s.extensions; + if (defined(c) && defined(c.EXT_feature_metadata)) { + const d = c.EXT_feature_metadata.featureIdTextures; + if (defined(d)) { + const f = d.length; + for (let h = 0; h < f; ++h) { + const m = d[h].featureIds.texture; + m.index > t && --m.index; + } + } + } + }); + }); + const r = e.extensions.EXT_feature_metadata.featureTextures; + for (const o in r) + if (r.hasOwnProperty(o)) { + const c = r[o].properties; + if (defined(c)) { + for (const l in c) + if (c.hasOwnProperty(l)) { + const f = c[l].texture; + f.index > t && --f.index; + } + } + } + } + if (usesExtension(e, "EXT_mesh_features") && ForEach.mesh(e, function(i) { + ForEach.meshPrimitive(i, function(r) { + const o = r.extensions; + if (defined(o) && defined(o.EXT_mesh_features)) { + const c = o.EXT_mesh_features.featureIds; + if (defined(c)) { + const l = c.length; + for (let d = 0; d < l; ++d) { + const f = c[d]; + defined(f.texture) && f.texture.index > t && --f.texture.index; + } + } + } + }); + }), usesExtension(e, "EXT_structural_metadata")) { + const r = e.extensions.EXT_structural_metadata.propertyTextures; + if (defined(r)) { + const o = r.length; + for (let s = 0; s < o; ++s) { + const l = r[s].properties; + for (const d in l) + if (l.hasOwnProperty(d)) { + const f = l[d]; + f.index > t && --f.index; + } + } + } + } +}; +function getListOfElementsIdsInUse() { +} +getListOfElementsIdsInUse.accessor = function(e) { + const t = {}; + return ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + ForEach.meshPrimitiveAttribute(i, function(o) { + t[o] = !0; + }), ForEach.meshPrimitiveTarget(i, function(o) { + ForEach.meshPrimitiveTargetAttribute(o, function(s) { + t[s] = !0; + }); + }); + const r = i.indices; + defined(r) && (t[r] = !0); + }); + }), ForEach.skin(e, function(n) { + defined(n.inverseBindMatrices) && (t[n.inverseBindMatrices] = !0); + }), ForEach.animation(e, function(n) { + ForEach.animationSampler(n, function(i) { + defined(i.input) && (t[i.input] = !0), defined(i.output) && (t[i.output] = !0); + }); + }), usesExtension(e, "EXT_mesh_gpu_instancing") && ForEach.node(e, function(n) { + defined(n.extensions) && defined(n.extensions.EXT_mesh_gpu_instancing) && Object.keys(n.extensions.EXT_mesh_gpu_instancing.attributes).forEach( + function(i) { + const r = n.extensions.EXT_mesh_gpu_instancing.attributes[i]; + t[r] = !0; + } + ); + }), usesExtension(e, "CESIUM_primitive_outline") && ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + const r = i.extensions; + if (defined(r) && defined(r.CESIUM_primitive_outline)) { + const s = r.CESIUM_primitive_outline.indices; + defined(s) && (t[s] = !0); + } + }); + }), t; +}; +getListOfElementsIdsInUse.buffer = function(e) { + const t = {}; + return ForEach.bufferView(e, function(n) { + defined(n.buffer) && (t[n.buffer] = !0), defined(n.extensions) && defined(n.extensions.EXT_meshopt_compression) && (t[n.extensions.EXT_meshopt_compression.buffer] = !0); + }), t; +}; +getListOfElementsIdsInUse.bufferView = function(e) { + const t = {}; + if (ForEach.accessor(e, function(n) { + defined(n.bufferView) && (t[n.bufferView] = !0); + }), ForEach.shader(e, function(n) { + defined(n.bufferView) && (t[n.bufferView] = !0); + }), ForEach.image(e, function(n) { + defined(n.bufferView) && (t[n.bufferView] = !0); + }), usesExtension(e, "KHR_draco_mesh_compression") && ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + defined(i.extensions) && defined(i.extensions.KHR_draco_mesh_compression) && (t[i.extensions.KHR_draco_mesh_compression.bufferView] = !0); + }); + }), usesExtension(e, "EXT_feature_metadata")) { + const i = e.extensions.EXT_feature_metadata.featureTables; + for (const r in i) + if (i.hasOwnProperty(r)) { + const s = i[r].properties; + if (defined(s)) { + for (const c in s) + if (s.hasOwnProperty(c)) { + const l = s[c]; + defined(l.bufferView) && (t[l.bufferView] = !0), defined(l.arrayOffsetBufferView) && (t[l.arrayOffsetBufferView] = !0), defined(l.stringOffsetBufferView) && (t[l.stringOffsetBufferView] = !0); + } + } + } + } + if (usesExtension(e, "EXT_structural_metadata")) { + const i = e.extensions.EXT_structural_metadata.propertyTables; + if (defined(i)) { + const r = i.length; + for (let o = 0; o < r; ++o) { + const c = i[o].properties; + for (const l in c) + if (c.hasOwnProperty(l)) { + const d = c[l]; + defined(d.values) && (t[d.values] = !0), defined(d.arrayOffsets) && (t[d.arrayOffsets] = !0), defined(d.stringOffsets) && (t[d.stringOffsets] = !0); + } + } + } + } + return t; +}; +getListOfElementsIdsInUse.image = function(e) { + const t = {}; + return ForEach.texture(e, function(n) { + defined(n.source) && (t[n.source] = !0), defined(n.extensions) && defined(n.extensions.EXT_texture_webp) ? t[n.extensions.EXT_texture_webp.source] = !0 : defined(n.extensions) && defined(n.extensions.KHR_texture_basisu) && (t[n.extensions.KHR_texture_basisu.source] = !0); + }), t; +}; +getListOfElementsIdsInUse.mesh = function(e) { + const t = {}; + return ForEach.node(e, function(n) { + if (defined(n.mesh && defined(e.meshes))) { + const i = e.meshes[n.mesh]; + defined(i) && defined(i.primitives) && i.primitives.length > 0 && (t[n.mesh] = !0); + } + }), t; +}; +function nodeIsEmpty(e, t, n) { + const i = e.nodes[t]; + return defined(i.mesh) || defined(i.camera) || defined(i.skin) || defined(i.weights) || defined(i.extras) || defined(i.extensions) && Object.keys(i.extensions).length !== 0 || defined(n[t]) ? !1 : !defined(i.children) || i.children.filter(function(r) { + return !nodeIsEmpty(e, r, n); + }).length === 0; +} +getListOfElementsIdsInUse.node = function(e) { + const t = {}; + return ForEach.skin(e, function(n) { + defined(n.skeleton) && (t[n.skeleton] = !0), ForEach.skinJoint(n, function(i) { + t[i] = !0; + }); + }), ForEach.animation(e, function(n) { + ForEach.animationChannel(n, function(i) { + defined(i.target) && defined(i.target.node) && (t[i.target.node] = !0); + }); + }), ForEach.technique(e, function(n) { + ForEach.techniqueUniform(n, function(i) { + defined(i.node) && (t[i.node] = !0); + }); + }), ForEach.node(e, function(n, i) { + nodeIsEmpty(e, i, t) || (t[i] = !0); + }), t; +}; +getListOfElementsIdsInUse.material = function(e) { + const t = {}; + return ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + defined(i.material) && (t[i.material] = !0); + }); + }), t; +}; +getListOfElementsIdsInUse.texture = function(e) { + const t = {}; + if (ForEach.material(e, function(n) { + forEachTextureInMaterial(n, function(i) { + t[i] = !0; + }); + }), usesExtension(e, "EXT_feature_metadata")) { + ForEach.mesh(e, function(r) { + ForEach.meshPrimitive(r, function(o) { + const s = o.extensions; + if (defined(s) && defined(s.EXT_feature_metadata)) { + const l = s.EXT_feature_metadata.featureIdTextures; + if (defined(l)) { + const d = l.length; + for (let f = 0; f < d; ++f) { + const p = l[f].featureIds.texture; + t[p.index] = !0; + } + } + } + }); + }); + const i = e.extensions.EXT_feature_metadata.featureTextures; + for (const r in i) + if (i.hasOwnProperty(r)) { + const s = i[r].properties; + if (defined(s)) { + for (const c in s) + if (s.hasOwnProperty(c)) { + const d = s[c].texture; + t[d.index] = !0; + } + } + } + } + if (usesExtension(e, "EXT_mesh_features") && ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + const r = i.extensions; + if (defined(r) && defined(r.EXT_mesh_features)) { + const s = r.EXT_mesh_features.featureIds; + if (defined(s)) { + const c = s.length; + for (let l = 0; l < c; ++l) { + const d = s[l]; + defined(d.texture) && (t[d.texture.index] = !0); + } + } + } + }); + }), usesExtension(e, "EXT_structural_metadata")) { + const i = e.extensions.EXT_structural_metadata.propertyTextures; + if (defined(i)) { + const r = i.length; + for (let o = 0; o < r; ++o) { + const c = i[o].properties; + for (const l in c) + if (c.hasOwnProperty(l)) { + const d = c[l]; + t[d.index] = !0; + } + } + } + } + return t; +}; +getListOfElementsIdsInUse.sampler = function(e) { + const t = {}; + return ForEach.texture(e, function(n) { + defined(n.sampler) && (t[n.sampler] = !0); + }), t; +}; +function addBuffer(e, t) { + const n = { + byteLength: t.length, + extras: { + _pipeline: { + source: t + } + } + }, r = { + buffer: addToArray(e.buffers, n), + byteOffset: 0, + byteLength: t.length + }; + return addToArray(e.bufferViews, r); +} +function readAccessorPacked(e, t) { + const n = getAccessorByteStride(e, t), i = ComponentDatatype$1.getSizeInBytes( + t.componentType + ), r = numberOfComponentsForType(t.type), o = t.count, s = new Array(r * o); + if (!defined(t.bufferView)) + return s.fill(0); + const c = e.bufferViews[t.bufferView], l = e.buffers[c.buffer].extras._pipeline.source; + let d = t.byteOffset + c.byteOffset + l.byteOffset; + const f = new DataView(l.buffer), h = new Array(r), p = getComponentReader(t.componentType); + for (let m = 0; m < o; ++m) { + p( + f, + d, + r, + i, + h + ); + for (let _ = 0; _ < r; ++_) + s[m * r + _] = h[_]; + d += n; + } + return s; +} +function updateAccessorComponentTypes(e) { + let t; + return ForEach.accessorWithSemantic(e, "JOINTS_0", function(n) { + const i = e.accessors[n]; + t = i.componentType, t === WebGLConstants$1.BYTE ? convertType(e, i, ComponentDatatype$1.UNSIGNED_BYTE) : t !== WebGLConstants$1.UNSIGNED_BYTE && t !== WebGLConstants$1.UNSIGNED_SHORT && convertType(e, i, ComponentDatatype$1.UNSIGNED_SHORT); + }), ForEach.accessorWithSemantic(e, "WEIGHTS_0", function(n) { + const i = e.accessors[n]; + t = i.componentType, t === WebGLConstants$1.BYTE ? convertType(e, i, ComponentDatatype$1.UNSIGNED_BYTE) : t === WebGLConstants$1.SHORT && convertType(e, i, ComponentDatatype$1.UNSIGNED_SHORT); + }), e; +} +function convertType(e, t, n) { + const i = ComponentDatatype$1.createTypedArray( + n, + readAccessorPacked(e, t) + ), r = new Uint8Array(i.buffer); + t.bufferView = addBuffer(e, r), t.componentType = n, t.byteOffset = 0; +} +function removeExtension(e, t) { + return removeExtensionsUsed(e, t), t === "CESIUM_RTC" && removeCesiumRTC(e), removeExtensionAndTraverse(e, t); +} +function removeCesiumRTC(e) { + ForEach.technique(e, function(t) { + ForEach.techniqueUniform(t, function(n) { + n.semantic === "CESIUM_RTC_MODELVIEW" && (n.semantic = "MODELVIEW"); + }); + }); +} +function removeExtensionAndTraverse(e, t) { + if (Array.isArray(e)) { + const n = e.length; + for (let i = 0; i < n; ++i) + removeExtensionAndTraverse(e[i], t); + } else if (e !== null && typeof e == "object" && e.constructor === Object) { + const n = e.extensions; + let i; + defined(n) && (i = n[t], defined(i) && (delete n[t], Object.keys(n).length === 0 && delete e.extensions)); + for (const r in e) + Object.prototype.hasOwnProperty.call(e, r) && removeExtensionAndTraverse(e[r], t); + return i; + } +} +const updateFunctions = { + 0.8: glTF08to10, + "1.0": glTF10to20, + "2.0": void 0 +}; +function updateVersion(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = t.targetVersion; + let i = e.version; + e.asset = defaultValue(e.asset, { + version: "1.0" + }), e.asset.version = defaultValue(e.asset.version, "1.0"), i = defaultValue(i, e.asset.version).toString(), Object.prototype.hasOwnProperty.call(updateFunctions, i) || (defined(i) && (i = i.substring(0, 3)), Object.prototype.hasOwnProperty.call(updateFunctions, i) || (i = "1.0")); + let r = updateFunctions[i]; + for (; defined(r) && i !== n; ) + r(e, t), i = e.asset.version, r = updateFunctions[i]; + return t.keepLegacyExtensions || (convertTechniquesToPbr(e, t), convertMaterialsCommonToPbr(e)), e; +} +function updateInstanceTechniques(e) { + const t = e.materials; + for (const n in t) + if (Object.prototype.hasOwnProperty.call(t, n)) { + const i = t[n], r = i.instanceTechnique; + defined(r) && (i.technique = r.technique, i.values = r.values, delete i.instanceTechnique); + } +} +function setPrimitiveModes(e) { + const t = e.meshes; + for (const n in t) + if (Object.prototype.hasOwnProperty.call(t, n)) { + const r = t[n].primitives; + if (defined(r)) { + const o = r.length; + for (let s = 0; s < o; ++s) { + const c = r[s], l = defaultValue( + c.primitive, + WebGLConstants$1.TRIANGLES + ); + c.mode = defaultValue(c.mode, l), delete c.primitive; + } + } + } +} +function updateNodes(e) { + const t = e.nodes, n = new Cartesian3(), i = new Quaternion(); + for (const r in t) + if (Object.prototype.hasOwnProperty.call(t, r)) { + const o = t[r]; + if (defined(o.rotation)) { + const c = o.rotation; + Cartesian3.fromArray(c, 0, n), Quaternion.fromAxisAngle(n, c[3], i), o.rotation = [i.x, i.y, i.z, i.w]; + } + const s = o.instanceSkin; + defined(s) && (o.skeletons = s.skeletons, o.skin = s.skin, o.meshes = s.meshes, delete o.instanceSkin); + } +} +function updateAnimations(e) { + const t = e.animations, n = e.accessors, i = e.bufferViews, r = e.buffers, o = {}, s = new Cartesian3(), c = new Quaternion(); + for (const l in t) + if (Object.prototype.hasOwnProperty.call(t, l)) { + const d = t[l], f = d.channels, h = d.parameters, p = d.samplers; + if (defined(f)) { + const m = f.length; + for (let _ = 0; _ < m; ++_) { + const y = f[_]; + if (y.target.path === "rotation") { + const C = h[p[y.sampler].output]; + if (defined(o[C])) + continue; + o[C] = !0; + const T = n[C], x = i[T.bufferView], S = r[x.buffer].extras._pipeline.source, E = S.byteOffset + x.byteOffset + T.byteOffset, A = T.componentType, D = T.count, P = numberOfComponentsForType(T.type), I = T.count * P, M = ComponentDatatype$1.createArrayBufferView( + A, + S.buffer, + E, + I + ); + for (let R = 0; R < D; R++) { + const L = R * P; + Cartesian3.unpack(M, L, s); + const g = M[L + 3]; + Quaternion.fromAxisAngle(s, g, c), Quaternion.pack(c, M, L); + } + } + } + } + } +} +function removeTechniquePasses(e) { + const t = e.techniques; + for (const n in t) + if (Object.prototype.hasOwnProperty.call(t, n)) { + const i = t[n], r = i.passes; + if (defined(r)) { + const o = defaultValue(i.pass, "defaultPass"); + if (Object.prototype.hasOwnProperty.call(r, o)) { + const s = r[o], c = s.instanceProgram; + i.attributes = defaultValue( + i.attributes, + c.attributes + ), i.program = defaultValue( + i.program, + c.program + ), i.uniforms = defaultValue( + i.uniforms, + c.uniforms + ), i.states = defaultValue(i.states, s.states); + } + delete i.passes, delete i.pass; + } + } +} +function glTF08to10(e) { + defined(e.asset) || (e.asset = {}); + const t = e.asset; + if (t.version = "1.0", typeof t.profile == "string") { + const n = t.profile.split(" "); + t.profile = { + api: n[0], + version: n[1] + }; + } else + t.profile = {}; + if (defined(e.version) && delete e.version, updateInstanceTechniques(e), setPrimitiveModes(e), updateNodes(e), updateAnimations(e), removeTechniquePasses(e), defined(e.allExtensions) && (e.extensionsUsed = e.allExtensions, delete e.allExtensions), defined(e.lights)) { + const n = defaultValue(e.extensions, {}); + e.extensions = n; + const i = defaultValue(n.KHR_materials_common, {}); + n.KHR_materials_common = i, i.lights = e.lights, delete e.lights, addExtensionsUsed(e, "KHR_materials_common"); + } +} +function removeAnimationSamplersIndirection(e) { + const t = e.animations; + for (const n in t) + if (Object.prototype.hasOwnProperty.call(t, n)) { + const i = t[n], r = i.parameters; + if (defined(r)) { + const o = i.samplers; + for (const s in o) + if (Object.prototype.hasOwnProperty.call(o, s)) { + const c = o[s]; + c.input = r[c.input], c.output = r[c.output]; + } + delete i.parameters; + } + } +} +function objectToArray(e, t) { + const n = []; + for (const i in e) + if (Object.prototype.hasOwnProperty.call(e, i)) { + const r = e[i]; + t[i] = n.length, n.push(r), defined(r.name) || (r.name = i); + } + return n; +} +function objectsToArrays(e) { + let t; + const n = { + accessors: {}, + animations: {}, + buffers: {}, + bufferViews: {}, + cameras: {}, + images: {}, + materials: {}, + meshes: {}, + nodes: {}, + programs: {}, + samplers: {}, + scenes: {}, + shaders: {}, + skins: {}, + textures: {}, + techniques: {} + }; + let i; + const r = {}, o = e.nodes; + for (const s in o) + Object.prototype.hasOwnProperty.call(o, s) && (i = o[s].jointName, defined(i) && (r[i] = s)); + for (const s in e) + if (Object.prototype.hasOwnProperty.call(e, s) && defined(n[s])) { + const c = {}, l = e[s]; + e[s] = objectToArray(l, c), n[s] = c; + } + for (i in r) + Object.prototype.hasOwnProperty.call(r, i) && (r[i] = n.nodes[r[i]]); + defined(e.scene) && (e.scene = n.scenes[e.scene]), ForEach.bufferView(e, function(s) { + defined(s.buffer) && (s.buffer = n.buffers[s.buffer]); + }), ForEach.accessor(e, function(s) { + defined(s.bufferView) && (s.bufferView = n.bufferViews[s.bufferView]); + }), ForEach.shader(e, function(s) { + const c = s.extensions; + if (defined(c)) { + const l = c.KHR_binary_glTF; + defined(l) && (s.bufferView = n.bufferViews[l.bufferView], delete c.KHR_binary_glTF), Object.keys(c).length === 0 && delete s.extensions; + } + }), ForEach.program(e, function(s) { + defined(s.vertexShader) && (s.vertexShader = n.shaders[s.vertexShader]), defined(s.fragmentShader) && (s.fragmentShader = n.shaders[s.fragmentShader]); + }), ForEach.technique(e, function(s) { + defined(s.program) && (s.program = n.programs[s.program]), ForEach.techniqueParameter(s, function(c) { + defined(c.node) && (c.node = n.nodes[c.node]); + const l = c.value; + typeof l == "string" && (c.value = { + index: n.textures[l] + }); + }); + }), ForEach.mesh(e, function(s) { + ForEach.meshPrimitive(s, function(c) { + defined(c.indices) && (c.indices = n.accessors[c.indices]), ForEach.meshPrimitiveAttribute( + c, + function(l, d) { + c.attributes[d] = n.accessors[l]; + } + ), defined(c.material) && (c.material = n.materials[c.material]); + }); + }), ForEach.node(e, function(s) { + let c = s.children; + if (defined(c)) { + const l = c.length; + for (t = 0; t < l; ++t) + c[t] = n.nodes[c[t]]; + } + if (defined(s.meshes)) { + const l = s.meshes, d = l.length; + if (d > 0) + for (s.mesh = n.meshes[l[0]], t = 1; t < d; ++t) { + const f = { + mesh: n.meshes[l[t]] + }, h = addToArray(e.nodes, f); + defined(c) || (c = [], s.children = c), c.push(h); + } + delete s.meshes; + } + if (defined(s.camera) && (s.camera = n.cameras[s.camera]), defined(s.skin) && (s.skin = n.skins[s.skin]), defined(s.skeletons)) { + const l = s.skeletons; + if (l.length > 0 && defined(s.skin)) { + const f = e.skins[s.skin]; + f.skeleton = n.nodes[l[0]]; + } + delete s.skeletons; + } + defined(s.jointName) && delete s.jointName; + }), ForEach.skin(e, function(s) { + defined(s.inverseBindMatrices) && (s.inverseBindMatrices = n.accessors[s.inverseBindMatrices]); + const c = s.jointNames; + if (defined(c)) { + const l = [], d = c.length; + for (t = 0; t < d; ++t) + l[t] = r[c[t]]; + s.joints = l, delete s.jointNames; + } + }), ForEach.scene(e, function(s) { + const c = s.nodes; + if (defined(c)) { + const l = c.length; + for (t = 0; t < l; ++t) + c[t] = n.nodes[c[t]]; + } + }), ForEach.animation(e, function(s) { + const c = {}; + s.samplers = objectToArray(s.samplers, c), ForEach.animationSampler(s, function(l) { + l.input = n.accessors[l.input], l.output = n.accessors[l.output]; + }), ForEach.animationChannel(s, function(l) { + l.sampler = c[l.sampler]; + const d = l.target; + defined(d) && (d.node = n.nodes[d.id], delete d.id); + }); + }), ForEach.material(e, function(s) { + defined(s.technique) && (s.technique = n.techniques[s.technique]), ForEach.materialValue(s, function(l, d) { + typeof l == "string" && (s.values[d] = { + index: n.textures[l] + }); + }); + const c = s.extensions; + if (defined(c)) { + const l = c.KHR_materials_common; + defined(l) && defined(l.values) && ForEach.materialValue(l, function(d, f) { + typeof d == "string" && (l.values[f] = { + index: n.textures[d] + }); + }); + } + }), ForEach.image(e, function(s) { + const c = s.extensions; + if (defined(c)) { + const l = c.KHR_binary_glTF; + defined(l) && (s.bufferView = n.bufferViews[l.bufferView], s.mimeType = l.mimeType, delete c.KHR_binary_glTF), Object.keys(c).length === 0 && delete s.extensions; + } + }), ForEach.texture(e, function(s) { + defined(s.sampler) && (s.sampler = n.samplers[s.sampler]), defined(s.source) && (s.source = n.images[s.source]); + }); +} +function removeAnimationSamplerNames(e) { + ForEach.animation(e, function(t) { + ForEach.animationSampler(t, function(n) { + delete n.name; + }); + }); +} +function removeEmptyArrays(e) { + for (const t in e) + if (Object.prototype.hasOwnProperty.call(e, t)) { + const n = e[t]; + Array.isArray(n) && n.length === 0 && delete e[t]; + } + ForEach.node(e, function(t) { + defined(t.children) && t.children.length === 0 && delete t.children; + }); +} +function stripAsset(e) { + const t = e.asset; + delete t.profile, delete t.premultipliedAlpha; +} +const knownExtensions = { + CESIUM_RTC: !0, + KHR_materials_common: !0, + WEB3D_quantized_attributes: !0 +}; +function requireKnownExtensions(e) { + const t = e.extensionsUsed; + if (e.extensionsRequired = defaultValue(e.extensionsRequired, []), defined(t)) { + const n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i]; + defined(knownExtensions[r]) && e.extensionsRequired.push(r); + } + } +} +function removeBufferType(e) { + ForEach.buffer(e, function(t) { + delete t.type; + }); +} +function removeTextureProperties(e) { + ForEach.texture(e, function(t) { + delete t.format, delete t.internalFormat, delete t.target, delete t.type; + }); +} +function requireAttributeSetIndex(e) { + ForEach.mesh(e, function(t) { + ForEach.meshPrimitive(t, function(n) { + ForEach.meshPrimitiveAttribute( + n, + function(i, r) { + r === "TEXCOORD" ? n.attributes.TEXCOORD_0 = i : r === "COLOR" && (n.attributes.COLOR_0 = i); + } + ), delete n.attributes.TEXCOORD, delete n.attributes.COLOR; + }); + }), ForEach.technique(e, function(t) { + ForEach.techniqueParameter(t, function(n) { + const i = n.semantic; + defined(i) && (i === "TEXCOORD" ? n.semantic = "TEXCOORD_0" : i === "COLOR" && (n.semantic = "COLOR_0")); + }); + }); +} +const knownSemantics = { + POSITION: !0, + NORMAL: !0, + TANGENT: !0 +}, indexedSemantics = { + COLOR: "COLOR", + JOINT: "JOINTS", + JOINTS: "JOINTS", + TEXCOORD: "TEXCOORD", + WEIGHT: "WEIGHTS", + WEIGHTS: "WEIGHTS" +}; +function underscoreApplicationSpecificSemantics(e) { + const t = {}; + ForEach.mesh(e, function(n) { + ForEach.meshPrimitive(n, function(i) { + ForEach.meshPrimitiveAttribute( + i, + function(r, o) { + if (o.charAt(0) !== "_") { + const s = o.search(/_[0-9]+/g); + let c = o, l = "_0"; + s >= 0 && (c = o.substring(0, s), l = o.substring(s)); + let d; + const f = indexedSemantics[c]; + defined(f) ? (d = f + l, t[o] = d) : defined(knownSemantics[c]) || (d = `_${o}`, t[o] = d); + } + } + ); + for (const r in t) + if (Object.prototype.hasOwnProperty.call(t, r)) { + const o = t[r], s = i.attributes[r]; + defined(s) && (delete i.attributes[r], i.attributes[o] = s); + } + }); + }), ForEach.technique(e, function(n) { + ForEach.techniqueParameter(n, function(i) { + const r = t[i.semantic]; + defined(r) && (i.semantic = r); + }); + }); +} +function clampCameraParameters(e) { + ForEach.camera(e, function(t) { + const n = t.perspective; + if (defined(n)) { + const i = n.aspectRatio; + defined(i) && i === 0 && delete n.aspectRatio; + const r = n.yfov; + defined(r) && r === 0 && (n.yfov = 1); + } + }); +} +function computeAccessorByteStride(e, t) { + return defined(t.byteStride) && t.byteStride !== 0 ? t.byteStride : getAccessorByteStride(e, t); +} +function requireByteLength(e) { + ForEach.buffer(e, function(t) { + defined(t.byteLength) || (t.byteLength = t.extras._pipeline.source.length); + }), ForEach.accessor(e, function(t) { + const n = t.bufferView; + if (defined(n)) { + const i = e.bufferViews[n], r = computeAccessorByteStride(e, t), o = t.byteOffset + t.count * r; + i.byteLength = Math.max( + defaultValue(i.byteLength, 0), + o + ); + } + }); +} +function moveByteStrideToBufferView(e) { + let t, n, i; + const r = e.bufferViews, o = {}; + ForEach.accessorContainingVertexAttributeData(e, function(c) { + const l = e.accessors[c]; + defined(l.bufferView) && (o[l.bufferView] = !0); + }); + const s = {}; + ForEach.accessor(e, function(c) { + defined(c.bufferView) && (s[c.bufferView] = defaultValue( + s[c.bufferView], + [] + ), s[c.bufferView].push(c)); + }); + for (const c in s) + if (Object.prototype.hasOwnProperty.call(s, c)) { + i = r[c]; + const l = s[c]; + l.sort(function(p, m) { + return p.byteOffset - m.byteOffset; + }); + let d = 0, f = 0; + const h = l.length; + for (t = 0; t < h; ++t) { + let p = l[t]; + const m = computeAccessorByteStride(e, p), _ = p.byteOffset, y = p.count * m; + delete p.byteStride; + const C = t < h - 1, T = C ? computeAccessorByteStride(e, l[t + 1]) : void 0; + if (m !== T) { + const x = clone$1(i, !0); + o[c] && (x.byteStride = m), x.byteOffset += d, x.byteLength = _ + y - d; + const b = addToArray(r, x); + for (n = f; n <= t; ++n) + p = l[n], p.bufferView = b, p.byteOffset = p.byteOffset - d; + d = C ? l[t + 1].byteOffset : void 0, f = t + 1; + } + } + } + removeUnusedElements(e, ["accessor", "bufferView", "buffer"]); +} +function requirePositionAccessorMinMax(e) { + ForEach.accessorWithSemantic(e, "POSITION", function(t) { + const n = e.accessors[t]; + if (!defined(n.min) || !defined(n.max)) { + const i = findAccessorMinMax(e, n); + n.min = i.min, n.max = i.max; + } + }); +} +function isNodeEmpty(e) { + return (!defined(e.children) || e.children.length === 0) && (!defined(e.meshes) || e.meshes.length === 0) && !defined(e.camera) && !defined(e.skin) && !defined(e.skeletons) && !defined(e.jointName) && (!defined(e.translation) || Cartesian3.fromArray(e.translation).equals(Cartesian3.ZERO)) && (!defined(e.scale) || Cartesian3.fromArray(e.scale).equals(new Cartesian3(1, 1, 1))) && (!defined(e.rotation) || Cartesian4.fromArray(e.rotation).equals( + new Cartesian4(0, 0, 0, 1) + )) && (!defined(e.matrix) || Matrix4.fromColumnMajorArray(e.matrix).equals(Matrix4.IDENTITY)) && !defined(e.extensions) && !defined(e.extras); +} +function deleteNode(e, t) { + ForEach.scene(e, function(n) { + const i = n.nodes; + if (defined(i)) { + const r = i.length; + for (let o = r; o >= 0; --o) + if (i[o] === t) { + i.splice(o, 1); + return; + } + } + }), ForEach.node(e, function(n, i) { + if (defined(n.children)) { + const r = n.children.indexOf(t); + r > -1 && (n.children.splice(r, 1), isNodeEmpty(n) && deleteNode(e, i)); + } + }), delete e.nodes[t]; +} +function removeEmptyNodes(e) { + return ForEach.node(e, function(t, n) { + isNodeEmpty(t) && deleteNode(e, n); + }), e; +} +function requireAnimationAccessorMinMax(e) { + ForEach.animation(e, function(t) { + ForEach.animationSampler(t, function(n) { + const i = e.accessors[n.input]; + if (!defined(i.min) || !defined(i.max)) { + const r = findAccessorMinMax(e, i); + i.min = r.min, i.max = r.max; + } + }); + }); +} +function validatePresentAccessorMinMax(e) { + ForEach.accessor(e, function(t) { + if (defined(t.min) || defined(t.max)) { + const n = findAccessorMinMax(e, t); + defined(t.min) && (t.min = n.min), defined(t.max) && (t.max = n.max); + } + }); +} +function glTF10to20(e) { + e.asset = defaultValue(e.asset, {}), e.asset.version = "2.0", updateInstanceTechniques(e), removeAnimationSamplersIndirection(e), removeEmptyNodes(e), objectsToArrays(e), removeAnimationSamplerNames(e), stripAsset(e), requireKnownExtensions(e), requireByteLength(e), moveByteStrideToBufferView(e), requirePositionAccessorMinMax(e), requireAnimationAccessorMinMax(e), validatePresentAccessorMinMax(e), removeBufferType(e), removeTextureProperties(e), requireAttributeSetIndex(e), underscoreApplicationSpecificSemantics(e), updateAccessorComponentTypes(e), clampCameraParameters(e), moveTechniqueRenderStates(e), moveTechniquesToExtension(e), removeEmptyArrays(e); +} +const defaultBaseColorTextureNames = [ + "u_tex", + "u_diffuse", + "u_emission", + "u_diffuse_tex" +], defaultBaseColorFactorNames = ["u_diffuse", "u_diffuse_mat"]; +function initializePbrMaterial(e) { + e.pbrMetallicRoughness = defined(e.pbrMetallicRoughness) ? e.pbrMetallicRoughness : {}, e.pbrMetallicRoughness.roughnessFactor = 1, e.pbrMetallicRoughness.metallicFactor = 0; +} +function isTexture(e) { + return defined(e.index); +} +function isVec4(e) { + return Array.isArray(e) && e.length === 4; +} +function srgbToLinear$1(e) { + const t = new Array(4); + t[3] = e[3]; + for (let n = 0; n < 3; n++) { + const i = e[n]; + i <= 0.04045 ? t[n] = e[n] * 0.07739938080495357 : t[n] = Math.pow( + // eslint-disable-next-line no-loss-of-precision + (i + 0.055) * 0.9478672985781991, + 2.4 + ); + } + return t; +} +function convertTechniquesToPbr(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = defaultValue( + t.baseColorTextureNames, + defaultBaseColorTextureNames + ), i = defaultValue( + t.baseColorFactorNames, + defaultBaseColorFactorNames + ); + ForEach.material(e, function(r) { + ForEach.materialValue(r, function(o, s) { + n.indexOf(s) !== -1 && isTexture(o) ? (initializePbrMaterial(r), r.pbrMetallicRoughness.baseColorTexture = o) : i.indexOf(s) !== -1 && isVec4(o) && (initializePbrMaterial(r), r.pbrMetallicRoughness.baseColorFactor = srgbToLinear$1(o)); + }); + }), removeExtension(e, "KHR_techniques_webgl"), removeExtension(e, "KHR_blend"); +} +function assignAsBaseColor(e, t) { + defined(t) && (isVec4(t) ? e.pbrMetallicRoughness.baseColorFactor = srgbToLinear$1(t) : isTexture(t) && (e.pbrMetallicRoughness.baseColorTexture = t)); +} +function assignAsEmissive(e, t) { + defined(t) && (isVec4(t) ? e.emissiveFactor = t.slice(0, 3) : isTexture(t) && (e.emissiveTexture = t)); +} +function convertMaterialsCommonToPbr(e) { + ForEach.material(e, function(t) { + const n = defaultValue( + t.extensions, + defaultValue.EMPTY_OBJECT + ).KHR_materials_common; + if (!defined(n)) + return; + const i = defaultValue(n.values, {}), r = i.ambient, o = i.diffuse, s = i.emission, c = i.transparency, l = n.doubleSided, d = n.transparent; + initializePbrMaterial(t), n.technique === "CONSTANT" ? (addExtensionsUsed(e, "KHR_materials_unlit"), t.extensions = defined(t.extensions) ? t.extensions : {}, t.extensions.KHR_materials_unlit = {}, assignAsBaseColor(t, s), assignAsBaseColor(t, r)) : (assignAsBaseColor(t, o), assignAsEmissive(t, r), assignAsEmissive(t, s)), defined(l) && (t.doubleSided = l), defined(c) && (defined(t.pbrMetallicRoughness.baseColorFactor) ? t.pbrMetallicRoughness.baseColorFactor[3] *= c : t.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, c]), defined(d) && (t.alphaMode = d ? "BLEND" : "OPAQUE"); + }), removeExtension(e, "KHR_materials_common"); +} +const VertexAttributeSemantic = { + /** + * Per-vertex position. + * + * @type {string} + * @constant + */ + POSITION: "POSITION", + /** + * Per-vertex normal. + * + * @type {string} + * @constant + */ + NORMAL: "NORMAL", + /** + * Per-vertex tangent. + * + * @type {string} + * @constant + */ + TANGENT: "TANGENT", + /** + * Per-vertex texture coordinates. + * + * @type {string} + * @constant + */ + TEXCOORD: "TEXCOORD", + /** + * Per-vertex color. + * + * @type {string} + * @constant + */ + COLOR: "COLOR", + /** + * Per-vertex joint IDs for skinning. + * + * @type {string} + * @constant + */ + JOINTS: "JOINTS", + /** + * Per-vertex joint weights for skinning. + * + * @type {string} + * @constant + */ + WEIGHTS: "WEIGHTS", + /** + * Per-vertex feature ID. + * + * @type {string} + * @constant + */ + FEATURE_ID: "_FEATURE_ID" +}; +function semanticToVariableName(e) { + switch (e) { + case VertexAttributeSemantic.POSITION: + return "positionMC"; + case VertexAttributeSemantic.NORMAL: + return "normalMC"; + case VertexAttributeSemantic.TANGENT: + return "tangentMC"; + case VertexAttributeSemantic.TEXCOORD: + return "texCoord"; + case VertexAttributeSemantic.COLOR: + return "color"; + case VertexAttributeSemantic.JOINTS: + return "joints"; + case VertexAttributeSemantic.WEIGHTS: + return "weights"; + case VertexAttributeSemantic.FEATURE_ID: + return "featureId"; + } +} +VertexAttributeSemantic.hasSetIndex = function(e) { + switch (e) { + case VertexAttributeSemantic.POSITION: + case VertexAttributeSemantic.NORMAL: + case VertexAttributeSemantic.TANGENT: + return !1; + case VertexAttributeSemantic.TEXCOORD: + case VertexAttributeSemantic.COLOR: + case VertexAttributeSemantic.JOINTS: + case VertexAttributeSemantic.WEIGHTS: + case VertexAttributeSemantic.FEATURE_ID: + return !0; + } +}; +VertexAttributeSemantic.fromGltfSemantic = function(e) { + let t = e; + const i = /^(\w+)_\d+$/.exec(e); + switch (i !== null && (t = i[1]), t) { + case "POSITION": + return VertexAttributeSemantic.POSITION; + case "NORMAL": + return VertexAttributeSemantic.NORMAL; + case "TANGENT": + return VertexAttributeSemantic.TANGENT; + case "TEXCOORD": + return VertexAttributeSemantic.TEXCOORD; + case "COLOR": + return VertexAttributeSemantic.COLOR; + case "JOINTS": + return VertexAttributeSemantic.JOINTS; + case "WEIGHTS": + return VertexAttributeSemantic.WEIGHTS; + case "_FEATURE_ID": + return VertexAttributeSemantic.FEATURE_ID; + } +}; +VertexAttributeSemantic.fromPntsSemantic = function(e) { + switch (e) { + case "POSITION": + case "POSITION_QUANTIZED": + return VertexAttributeSemantic.POSITION; + case "RGBA": + case "RGB": + case "RGB565": + return VertexAttributeSemantic.COLOR; + case "NORMAL": + case "NORMAL_OCT16P": + return VertexAttributeSemantic.NORMAL; + case "BATCH_ID": + return VertexAttributeSemantic.FEATURE_ID; + } +}; +VertexAttributeSemantic.getGlslType = function(e) { + switch (e) { + case VertexAttributeSemantic.POSITION: + case VertexAttributeSemantic.NORMAL: + case VertexAttributeSemantic.TANGENT: + return "vec3"; + case VertexAttributeSemantic.TEXCOORD: + return "vec2"; + case VertexAttributeSemantic.COLOR: + return "vec4"; + case VertexAttributeSemantic.JOINTS: + return "ivec4"; + case VertexAttributeSemantic.WEIGHTS: + return "vec4"; + case VertexAttributeSemantic.FEATURE_ID: + return "int"; + } +}; +VertexAttributeSemantic.getVariableName = function(e, t) { + let n = semanticToVariableName(e); + return defined(t) && (n += `_${t}`), n; +}; +const VertexAttributeSemantic$1 = Object.freeze(VertexAttributeSemantic); +function ModelUtility() { +} +ModelUtility.getError = function(e, t, n) { + let i = `Failed to load ${e}: ${t}`; + defined(n) && defined(n.message) && (i += ` +${n.message}`); + const r = new RuntimeError(i); + return defined(n) && (r.stack = `Original stack: +${n.stack} +Handler stack: +${r.stack}`), r; +}; +ModelUtility.getNodeTransform = function(e) { + return defined(e.matrix) ? e.matrix : Matrix4.fromTranslationQuaternionRotationScale( + defined(e.translation) ? e.translation : Cartesian3.ZERO, + defined(e.rotation) ? e.rotation : Quaternion.IDENTITY, + defined(e.scale) ? e.scale : Cartesian3.ONE + ); +}; +ModelUtility.getAttributeBySemantic = function(e, t, n) { + const i = e.attributes, r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o], c = defined(n) ? s.setIndex === n : !0; + if (s.semantic === t && c) + return s; + } +}; +ModelUtility.getAttributeByName = function(e, t) { + const n = e.attributes, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + if (o.name === t) + return o; + } +}; +ModelUtility.getFeatureIdsByLabel = function(e, t) { + for (let n = 0; n < e.length; n++) { + const i = e[n]; + if (i.positionalLabel === t || i.label === t) + return i; + } +}; +ModelUtility.hasQuantizedAttributes = function(e) { + if (!defined(e)) + return !1; + for (let t = 0; t < e.length; t++) { + const n = e[t]; + if (defined(n.quantization)) + return !0; + } + return !1; +}; +ModelUtility.getAttributeInfo = function(e) { + const t = e.semantic, n = e.setIndex; + let i, r = !1; + defined(t) ? (i = VertexAttributeSemantic$1.getVariableName(t, n), r = !0) : (i = e.name, i = i.replace(/^_/, ""), i = i.toLowerCase()); + const o = /^color_\d+$/.test(i), s = e.type; + let c = AttributeType$1.getGlslType(s); + o && (c = "vec4"); + const l = defined(e.quantization); + let d; + return l && (d = o ? "vec4" : AttributeType$1.getGlslType(e.quantization.type)), { + attribute: e, + isQuantized: l, + variableName: i, + hasSemantic: r, + glslType: c, + quantizedGlslType: d + }; +}; +const cartesianMaxScratch = new Cartesian3(), cartesianMinScratch = new Cartesian3(); +ModelUtility.getPositionMinMax = function(e, t, n) { + const i = ModelUtility.getAttributeBySemantic( + e, + "POSITION" + ); + let r = i.max, o = i.min; + return defined(n) && defined(t) && (o = Cartesian3.add( + o, + t, + cartesianMinScratch + ), r = Cartesian3.add( + r, + n, + cartesianMaxScratch + )), { + min: o, + max: r + }; +}; +ModelUtility.getAxisCorrectionMatrix = function(e, t, n) { + return n = Matrix4.clone(Matrix4.IDENTITY, n), e === Axis$1.Y ? n = Matrix4.clone(Axis$1.Y_UP_TO_Z_UP, n) : e === Axis$1.X && (n = Matrix4.clone(Axis$1.X_UP_TO_Z_UP, n)), t === Axis$1.Z && (n = Matrix4.multiplyTransformation(n, Axis$1.Z_UP_TO_X_UP, n)), n; +}; +const scratchMatrix3$1 = new Matrix3(); +ModelUtility.getCullFace = function(e, t) { + if (!PrimitiveType$1.isTriangles(t)) + return CullFace$1.BACK; + const n = Matrix4.getMatrix3(e, scratchMatrix3$1); + return Matrix3.determinant(n) < 0 ? CullFace$1.FRONT : CullFace$1.BACK; +}; +ModelUtility.sanitizeGlslIdentifier = function(e) { + let t = e.replaceAll(/[^A-Za-z0-9]+/g, "_"); + return t = t.replace(/^gl_/, ""), /^\d/.test(t) && (t = `_${t}`), t; +}; +ModelUtility.supportedExtensions = { + AGI_articulations: !0, + CESIUM_primitive_outline: !0, + CESIUM_RTC: !0, + EXT_feature_metadata: !0, + EXT_instance_features: !0, + EXT_mesh_features: !0, + EXT_mesh_gpu_instancing: !0, + EXT_meshopt_compression: !0, + EXT_structural_metadata: !0, + EXT_texture_webp: !0, + KHR_blend: !0, + KHR_draco_mesh_compression: !0, + KHR_techniques_webgl: !0, + KHR_materials_common: !0, + KHR_materials_pbrSpecularGlossiness: !0, + KHR_materials_specular: !0, + KHR_materials_anisotropy: !0, + KHR_materials_clearcoat: !0, + KHR_materials_unlit: !0, + KHR_mesh_quantization: !0, + KHR_texture_basisu: !0, + KHR_texture_transform: !0, + WEB3D_quantized_attributes: !0 +}; +ModelUtility.checkSupportedExtensions = function(e) { + const t = e.length; + for (let n = 0; n < t; n++) { + const i = e[n]; + if (!ModelUtility.supportedExtensions[i]) + throw new RuntimeError(`Unsupported glTF Extension: ${i}`); + } +}; +function GltfJsonLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltfResource, i = e.baseResource, r = e.typedArray, o = e.gltfJson, s = e.cacheKey; + this._resourceCache = t, this._gltfResource = n, this._baseResource = i, this._typedArray = r, this._gltfJson = o, this._cacheKey = s, this._gltf = void 0, this._bufferLoaders = [], this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfJsonLoader.prototype = Object.create(ResourceLoader.prototype), GltfJsonLoader.prototype.constructor = GltfJsonLoader); +Object.defineProperties(GltfJsonLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfJsonLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The glTF JSON. + * + * @memberof GltfJsonLoader.prototype + * + * @type {object} + * @readonly + * @private + */ + gltf: { + get: function() { + return this._gltf; + } + } +}); +GltfJsonLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : (this._state = ResourceLoaderState$1.LOADING, defined(this._gltfJson) ? (this._promise = processGltfJson(this, this._gltfJson), this._promise) : defined(this._typedArray) ? (this._promise = processGltfTypedArray(this, this._typedArray), this._promise) : (this._promise = loadFromUri(this), this._promise)); +}; +async function loadFromUri(e) { + let t; + try { + const n = await e._fetchGltf(); + if (e.isDestroyed()) + return; + t = new Uint8Array(n); + } catch (n) { + if (e.isDestroyed()) + return; + handleError$7(e, n); + } + return processGltfTypedArray(e, t); +} +function handleError$7(e, t) { + e.unload(), e._state = ResourceLoaderState$1.FAILED; + const n = `Failed to load glTF: ${e._gltfResource.url}`; + throw e.getError(n, t); +} +async function upgradeVersion(e, t) { + if (defined(t.asset) && t.asset.version === "2.0" && !usesExtension(t, "KHR_techniques_webgl") && !usesExtension(t, "KHR_materials_common")) + return Promise.resolve(); + const n = []; + ForEach.buffer(t, function(i) { + if (!defined(i.extras._pipeline.source) && // Ignore uri if this buffer uses the glTF 1.0 KHR_binary_glTF extension + defined(i.uri)) { + const r = e._baseResource.getDerivedResource({ + url: i.uri + }), s = e._resourceCache.getExternalBufferLoader({ + resource: r + }); + e._bufferLoaders.push(s), n.push( + s.load().then(function() { + s.isDestroyed() || (i.extras._pipeline.source = s.typedArray); + }) + ); + } + }), await Promise.all(n), updateVersion(t); +} +function decodeDataUris(e) { + const t = []; + return ForEach.buffer(e, function(n) { + const i = n.uri; + !defined(n.extras._pipeline.source) && // Ignore uri if this buffer uses the glTF 1.0 KHR_binary_glTF extension + defined(i) && isDataUri(i) && (delete n.uri, t.push( + Resource.fetchArrayBuffer(i).then(function(r) { + n.extras._pipeline.source = new Uint8Array(r); + }) + )); + }), Promise.all(t); +} +function loadEmbeddedBuffers(e, t) { + const n = []; + return ForEach.buffer(t, function(i, r) { + const o = i.extras._pipeline.source; + if (defined(o) && !defined(i.uri)) { + const c = e._resourceCache.getEmbeddedBufferLoader({ + parentResource: e._gltfResource, + bufferId: r, + typedArray: o + }); + e._bufferLoaders.push(c), n.push(c.load()); + } + }), Promise.all(n); +} +async function processGltfJson(e, t) { + try { + addPipelineExtras(t), await decodeDataUris(t), await upgradeVersion(e, t), addDefaults(t), await loadEmbeddedBuffers(e, t), removePipelineExtras(t); + const n = t.asset.version; + if (n !== "1.0" && n !== "2.0") + throw new RuntimeError(`Unsupported glTF version: ${n}`); + const i = t.extensionsRequired; + return defined(i) && ModelUtility.checkSupportedExtensions(i), e._gltf = t, e._state = ResourceLoaderState$1.READY, e; + } catch (n) { + if (e.isDestroyed()) + return; + handleError$7(e, n); + } +} +async function processGltfTypedArray(e, t) { + let n; + try { + getMagic(t) === "glTF" ? n = parseGlb(t) : n = getJsonFromTypedArray(t); + } catch (i) { + if (e.isDestroyed()) + return; + handleError$7(e, i); + } + return processGltfJson(e, n); +} +GltfJsonLoader.prototype.unload = function() { + const e = this._bufferLoaders, t = e.length; + for (let n = 0; n < t; ++n) + e[n] = !e[n].isDestroyed() && this._resourceCache.unload(e[n]); + this._bufferLoaders.length = 0, this._gltf = void 0; +}; +GltfJsonLoader.prototype._fetchGltf = function() { + return this._gltfResource.fetchArrayBuffer(); +}; +const AlphaMode = { + /** + * The alpha value is ignored and the rendered output is fully opaque. + * + * @type {string} + * @constant + */ + OPAQUE: "OPAQUE", + /** + * The rendered output is either fully opaque or fully transparent depending on the alpha value and the specified alpha cutoff value. + * + * @type {string} + * @constant + */ + MASK: "MASK", + /** + * The rendered output is composited onto the destination with alpha blending. + * + * @type {string} + * @constant + */ + BLEND: "BLEND" +}, AlphaMode$1 = Object.freeze(AlphaMode), ModelComponents = {}; +function Quantization$1() { + this.octEncoded = !1, this.octEncodedZXY = !1, this.normalizationRange = void 0, this.quantizedVolumeOffset = void 0, this.quantizedVolumeDimensions = void 0, this.quantizedVolumeStepSize = void 0, this.componentDatatype = void 0, this.type = void 0; +} +function Attribute$3() { + this.name = void 0, this.semantic = void 0, this.setIndex = void 0, this.componentDatatype = void 0, this.type = void 0, this.normalized = !1, this.count = void 0, this.min = void 0, this.max = void 0, this.constant = void 0, this.quantization = void 0, this.typedArray = void 0, this.buffer = void 0, this.byteOffset = 0, this.byteStride = void 0; +} +function Indices$1() { + this.indexDatatype = void 0, this.count = void 0, this.buffer = void 0, this.typedArray = void 0; +} +function FeatureIdAttribute$4() { + this.featureCount = void 0, this.nullFeatureId = void 0, this.propertyTableId = void 0, this.setIndex = void 0, this.label = void 0, this.positionalLabel = void 0; +} +function FeatureIdImplicitRange$1() { + this.featureCount = void 0, this.nullFeatureId = void 0, this.propertyTableId = void 0, this.offset = 0, this.repeat = void 0, this.label = void 0, this.positionalLabel = void 0; +} +function FeatureIdTexture$1() { + this.featureCount = void 0, this.nullFeatureId = void 0, this.propertyTableId = void 0, this.textureReader = void 0, this.label = void 0, this.positionalLabel = void 0; +} +function MorphTarget$1() { + this.attributes = []; +} +function Primitive$2() { + this.attributes = [], this.morphTargets = [], this.indices = void 0, this.material = void 0, this.primitiveType = void 0, this.featureIds = [], this.propertyTextureIds = [], this.propertyAttributeIds = [], this.outlineCoordinates = void 0; +} +function Instances$2() { + this.attributes = [], this.featureIds = [], this.transformInWorldSpace = !1; +} +function Skin$1() { + this.index = void 0, this.joints = [], this.inverseBindMatrices = []; +} +function Node$3() { + this.name = void 0, this.index = void 0, this.children = [], this.primitives = [], this.instances = void 0, this.skin = void 0, this.matrix = void 0, this.translation = void 0, this.rotation = void 0, this.scale = void 0, this.morphWeights = [], this.articulationName = void 0; +} +function Scene$3() { + this.nodes = []; +} +const AnimatedPropertyType$2 = { + TRANSLATION: "translation", + ROTATION: "rotation", + SCALE: "scale", + WEIGHTS: "weights" +}; +function AnimationSampler$1() { + this.input = [], this.interpolation = void 0, this.output = []; +} +function AnimationTarget$1() { + this.node = void 0, this.path = void 0; +} +function AnimationChannel$1() { + this.sampler = void 0, this.target = void 0; +} +function Animation$1() { + this.name = void 0, this.samplers = [], this.channels = []; +} +function ArticulationStage$1() { + this.name = void 0, this.type = void 0, this.minimumValue = void 0, this.maximumValue = void 0, this.initialValue = void 0; +} +function Articulation$1() { + this.name = void 0, this.stages = []; +} +function Asset$1() { + this.credits = []; +} +function Components$2() { + this.asset = new Asset$1(), this.scene = void 0, this.nodes = [], this.skins = [], this.animations = [], this.articulations = [], this.structuralMetadata = void 0, this.upAxis = void 0, this.forwardAxis = void 0, this.transform = Matrix4.clone(Matrix4.IDENTITY); +} +function TextureReader() { + this.texture = void 0, this.index = void 0, this.texCoord = 0, this.transform = Matrix3.clone(Matrix3.IDENTITY), this.scale = 1, this.channels = void 0; +} +function MetallicRoughness$3() { + this.baseColorTexture = void 0, this.metallicRoughnessTexture = void 0, this.baseColorFactor = Cartesian4.clone( + MetallicRoughness$3.DEFAULT_BASE_COLOR_FACTOR + ), this.metallicFactor = MetallicRoughness$3.DEFAULT_METALLIC_FACTOR, this.roughnessFactor = MetallicRoughness$3.DEFAULT_ROUGHNESS_FACTOR; +} +MetallicRoughness$3.DEFAULT_BASE_COLOR_FACTOR = Cartesian4.ONE; +MetallicRoughness$3.DEFAULT_METALLIC_FACTOR = 1; +MetallicRoughness$3.DEFAULT_ROUGHNESS_FACTOR = 1; +function SpecularGlossiness$2() { + this.diffuseTexture = void 0, this.specularGlossinessTexture = void 0, this.diffuseFactor = Cartesian4.clone( + SpecularGlossiness$2.DEFAULT_DIFFUSE_FACTOR + ), this.specularFactor = Cartesian3.clone( + SpecularGlossiness$2.DEFAULT_SPECULAR_FACTOR + ), this.glossinessFactor = SpecularGlossiness$2.DEFAULT_GLOSSINESS_FACTOR; +} +SpecularGlossiness$2.DEFAULT_DIFFUSE_FACTOR = Cartesian4.ONE; +SpecularGlossiness$2.DEFAULT_SPECULAR_FACTOR = Cartesian3.ONE; +SpecularGlossiness$2.DEFAULT_GLOSSINESS_FACTOR = 1; +function Specular$2() { + this.specularFactor = Specular$2.DEFAULT_SPECULAR_FACTOR, this.specularTexture = void 0, this.specularColorFactor = Cartesian3.clone( + Specular$2.DEFAULT_SPECULAR_COLOR_FACTOR + ), this.specularColorTexture = void 0; +} +Specular$2.DEFAULT_SPECULAR_FACTOR = 1; +Specular$2.DEFAULT_SPECULAR_COLOR_FACTOR = Cartesian3.ONE; +function Anisotropy$1() { + this.anisotropyStrength = Anisotropy$1.DEFAULT_ANISOTROPY_STRENGTH, this.anisotropyRotation = Anisotropy$1.DEFAULT_ANISOTROPY_ROTATION, this.anisotropyTexture = void 0; +} +Anisotropy$1.DEFAULT_ANISOTROPY_STRENGTH = 0; +Anisotropy$1.DEFAULT_ANISOTROPY_ROTATION = 0; +function Clearcoat$2() { + this.clearcoatFactor = Clearcoat$2.DEFAULT_CLEARCOAT_FACTOR, this.clearcoatTexture = void 0, this.clearcoatRoughnessFactor = Clearcoat$2.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR, this.clearcoatRoughnessTexture = void 0, this.clearcoatNormalTexture = void 0; +} +Clearcoat$2.DEFAULT_CLEARCOAT_FACTOR = 0; +Clearcoat$2.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR = 0; +function Material$3() { + this.metallicRoughness = new MetallicRoughness$3(), this.specularGlossiness = void 0, this.specular = void 0, this.anisotropy = void 0, this.clearcoat = void 0, this.emissiveTexture = void 0, this.normalTexture = void 0, this.occlusionTexture = void 0, this.emissiveFactor = Cartesian3.clone(Material$3.DEFAULT_EMISSIVE_FACTOR), this.alphaMode = AlphaMode$1.OPAQUE, this.alphaCutoff = 0.5, this.doubleSided = !1, this.unlit = !1; +} +Material$3.DEFAULT_EMISSIVE_FACTOR = Cartesian3.ZERO; +ModelComponents.Quantization = Quantization$1; +ModelComponents.Attribute = Attribute$3; +ModelComponents.Indices = Indices$1; +ModelComponents.FeatureIdAttribute = FeatureIdAttribute$4; +ModelComponents.FeatureIdTexture = FeatureIdTexture$1; +ModelComponents.FeatureIdImplicitRange = FeatureIdImplicitRange$1; +ModelComponents.MorphTarget = MorphTarget$1; +ModelComponents.Primitive = Primitive$2; +ModelComponents.Instances = Instances$2; +ModelComponents.Skin = Skin$1; +ModelComponents.Node = Node$3; +ModelComponents.Scene = Scene$3; +ModelComponents.AnimatedPropertyType = Object.freeze(AnimatedPropertyType$2); +ModelComponents.AnimationSampler = AnimationSampler$1; +ModelComponents.AnimationTarget = AnimationTarget$1; +ModelComponents.AnimationChannel = AnimationChannel$1; +ModelComponents.Animation = Animation$1; +ModelComponents.ArticulationStage = ArticulationStage$1; +ModelComponents.Articulation = Articulation$1; +ModelComponents.Asset = Asset$1; +ModelComponents.Components = Components$2; +ModelComponents.TextureReader = TextureReader; +ModelComponents.MetallicRoughness = MetallicRoughness$3; +ModelComponents.SpecularGlossiness = SpecularGlossiness$2; +ModelComponents.Specular = Specular$2; +ModelComponents.Anisotropy = Anisotropy$1; +ModelComponents.Clearcoat = Clearcoat$2; +ModelComponents.Material = Material$3; +const GltfLoaderUtil = {}; +GltfLoaderUtil.getImageIdFromTexture = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, textureId: n, supportedImageFormats: i } = e, r = t.textures[n], o = r.extensions; + if (defined(o)) { + if (i.webp && defined(o.EXT_texture_webp)) + return o.EXT_texture_webp.source; + if (i.basis && defined(o.KHR_texture_basisu)) + return o.KHR_texture_basisu.source; + } + return r.source; +}; +GltfLoaderUtil.createSampler = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, textureInfo: n, compressedTextureNoMipmap: i = !1 } = e; + let r = TextureWrap$1.REPEAT, o = TextureWrap$1.REPEAT, s = TextureMinificationFilter$1.LINEAR, c = TextureMagnificationFilter$1.LINEAR; + const l = n.index, f = t.textures[l].sampler; + if (defined(f)) { + const h = t.samplers[f]; + r = defaultValue(h.wrapS, r), o = defaultValue(h.wrapT, o), s = defaultValue(h.minFilter, s), c = defaultValue(h.magFilter, c); + } + return i && s !== TextureMinificationFilter$1.LINEAR && s !== TextureMinificationFilter$1.NEAREST && (s === TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST || s === TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR ? s = TextureMinificationFilter$1.NEAREST : s = TextureMinificationFilter$1.LINEAR), new Sampler({ + wrapS: r, + wrapT: o, + minificationFilter: s, + magnificationFilter: c + }); +}; +const defaultScale$2 = new Cartesian2(1, 1); +GltfLoaderUtil.createModelTextureReader = function(e) { + var l; + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { textureInfo: t, channels: n, texture: i } = e; + let r = defaultValue(t.texCoord, 0), o; + const s = (l = t.extensions) == null ? void 0 : l.KHR_texture_transform; + if (defined(s)) { + r = defaultValue(s.texCoord, r); + const d = defined(s.offset) ? Cartesian2.unpack(s.offset) : Cartesian2.ZERO; + let f = defaultValue(s.rotation, 0); + const h = defined(s.scale) ? Cartesian2.unpack(s.scale) : defaultScale$2; + f = -f, o = new Matrix3( + Math.cos(f) * h.x, + -Math.sin(f) * h.y, + d.x, + Math.sin(f) * h.x, + Math.cos(f) * h.y, + d.y, + 0, + 0, + 1 + ); + } + const c = new ModelComponents.TextureReader(); + return c.index = t.index, c.texture = i, c.texCoord = r, c.scale = t.scale, c.transform = o, c.channels = n, c; +}; +function resizeImageToNextPowerOfTwo(e) { + const t = document.createElement("canvas"); + return t.width = CesiumMath.nextPowerOfTwo(e.width), t.height = CesiumMath.nextPowerOfTwo(e.height), t.getContext("2d").drawImage( + e, + 0, + 0, + e.width, + e.height, + 0, + 0, + t.width, + t.height + ), t; +} +function GltfTextureLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.textureInfo, r = e.gltfResource, o = e.baseResource, s = e.supportedImageFormats, c = e.cacheKey, l = defaultValue(e.asynchronous, !0), d = i.index, f = GltfLoaderUtil.getImageIdFromTexture({ + gltf: n, + textureId: d, + supportedImageFormats: s + }); + this._resourceCache = t, this._gltf = n, this._textureInfo = i, this._imageId = f, this._gltfResource = r, this._baseResource = o, this._cacheKey = c, this._asynchronous = l, this._imageLoader = void 0, this._image = void 0, this._mipLevels = void 0, this._texture = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfTextureLoader.prototype = Object.create(ResourceLoader.prototype), GltfTextureLoader.prototype.constructor = GltfTextureLoader); +Object.defineProperties(GltfTextureLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfTextureLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The texture. + * + * @memberof GltfTextureLoader.prototype + * + * @type {Texture} + * @readonly + * @private + */ + texture: { + get: function() { + return this._texture; + } + } +}); +const scratchTextureJob = new CreateTextureJob(); +async function loadResources$2(e) { + const t = e._resourceCache; + try { + const n = t.getImageLoader({ + gltf: e._gltf, + imageId: e._imageId, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._imageLoader = n, await n.load(), e.isDestroyed() ? void 0 : (e._image = n.image, e._mipLevels = n.mipLevels, e._state = ResourceLoaderState$1.LOADED, e); + } catch (n) { + if (e.isDestroyed()) + return; + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load texture", n); + } +} +GltfTextureLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : (this._state = ResourceLoaderState$1.LOADING, this._promise = loadResources$2(this), this._promise); +}; +function CreateTextureJob() { + this.gltf = void 0, this.textureInfo = void 0, this.image = void 0, this.context = void 0, this.texture = void 0; +} +CreateTextureJob.prototype.set = function(e, t, n, i, r) { + this.gltf = e, this.textureInfo = t, this.image = n, this.mipLevels = i, this.context = r; +}; +CreateTextureJob.prototype.execute = function() { + this.texture = createTexture$1( + this.gltf, + this.textureInfo, + this.image, + this.mipLevels, + this.context + ); +}; +function createTexture$1(e, t, n, i, r) { + const o = n.internalFormat; + let s = !1; + PixelFormat$1.isCompressedFormat(o) && !defined(i) && (s = !0); + const c = GltfLoaderUtil.createSampler({ + gltf: e, + textureInfo: t, + compressedTextureNoMipmap: s + }), l = c.minificationFilter, d = c.wrapS, f = c.wrapT, h = l === TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST || l === TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR || l === TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST || l === TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR, p = !defined(o) && h, m = p || d === TextureWrap$1.REPEAT || d === TextureWrap$1.MIRRORED_REPEAT || f === TextureWrap$1.REPEAT || f === TextureWrap$1.MIRRORED_REPEAT, _ = !CesiumMath.isPowerOfTwo(n.width) || !CesiumMath.isPowerOfTwo(n.height), y = m && _; + let C; + return defined(o) ? (!r.webgl2 && PixelFormat$1.isCompressedFormat(o) && _ && m && console.warn( + "Compressed texture uses REPEAT or MIRRORED_REPEAT texture wrap mode and dimensions are not powers of two. The texture may be rendered incorrectly." + ), C = Texture.create({ + context: r, + source: { + arrayBufferView: n.bufferView, + // Only defined for CompressedTextureBuffer + mipLevels: i + }, + width: n.width, + height: n.height, + pixelFormat: n.internalFormat, + // Only defined for CompressedTextureBuffer + sampler: c + })) : (y && (n = resizeImageToNextPowerOfTwo(n)), C = Texture.create({ + context: r, + source: n, + sampler: c, + flipY: !1, + skipColorSpaceConversion: !0 + })), p && C.generateMipmap(), C; +} +GltfTextureLoader.prototype.process = function(e) { + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state !== ResourceLoaderState$1.LOADED && this._state !== ResourceLoaderState$1.PROCESSING || defined(this._texture) || !defined(this._image)) + return !1; + this._state = ResourceLoaderState$1.PROCESSING; + let t; + if (this._asynchronous) { + const n = scratchTextureJob; + if (n.set( + this._gltf, + this._textureInfo, + this._image, + this._mipLevels, + e.context + ), !e.jobScheduler.execute(n, JobType$1.TEXTURE)) + return; + t = n.texture; + } else + t = createTexture$1( + this._gltf, + this._textureInfo, + this._image, + this._mipLevels, + e.context + ); + return this.unload(), this._texture = t, this._state = ResourceLoaderState$1.READY, this._resourceCache.statistics.addTextureLoader(this), !0; +}; +GltfTextureLoader.prototype.unload = function() { + defined(this._texture) && this._texture.destroy(), defined(this._imageLoader) && !this._imageLoader.isDestroyed() && this._resourceCache.unload(this._imageLoader), this._imageLoader = void 0, this._image = void 0, this._mipLevels = void 0, this._texture = void 0, this._gltf = void 0; +}; +function GltfVertexBufferLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.resourceCache, n = e.gltf, i = e.gltfResource, r = e.baseResource, o = e.bufferViewId, s = e.draco, c = e.attributeSemantic, l = e.accessorId, d = e.cacheKey, f = defaultValue(e.asynchronous, !0), h = defaultValue(e.loadBuffer, !1), p = defaultValue(e.loadTypedArray, !1); + this._resourceCache = t, this._gltfResource = i, this._baseResource = r, this._gltf = n, this._bufferViewId = o, this._draco = s, this._attributeSemantic = c, this._accessorId = l, this._cacheKey = d, this._asynchronous = f, this._loadBuffer = h, this._loadTypedArray = p, this._bufferViewLoader = void 0, this._dracoLoader = void 0, this._quantization = void 0, this._typedArray = void 0, this._buffer = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfVertexBufferLoader.prototype = Object.create(ResourceLoader.prototype), GltfVertexBufferLoader.prototype.constructor = GltfVertexBufferLoader); +Object.defineProperties(GltfVertexBufferLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfVertexBufferLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The vertex buffer. This is only defined when loadAsTypedArray is false. + * + * @memberof GltfVertexBufferLoader.prototype + * + * @type {Buffer} + * @readonly + * @private + */ + buffer: { + get: function() { + return this._buffer; + } + }, + /** + * The typed array containing vertex buffer data. This is only defined when loadAsTypedArray is true. + * + * @memberof GltfVertexBufferLoader.prototype + * + * @type {Uint8Array} + * @readonly + * @private + */ + typedArray: { + get: function() { + return this._typedArray; + } + }, + /** + * Information about the quantized vertex attribute after Draco decode. + * + * @memberof GltfVertexBufferLoader.prototype + * + * @type {ModelComponents.Quantization} + * @readonly + * @private + */ + quantization: { + get: function() { + return this._quantization; + } + } +}); +function hasDracoCompression(e, t) { + return defined(e) && defined(e.attributes) && defined(e.attributes[t]); +} +GltfVertexBufferLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : hasDracoCompression(this._draco, this._attributeSemantic) ? (this._promise = loadFromDraco(this), this._promise) : (this._promise = loadFromBufferView(this), this._promise); +}; +function getQuantizationInformation(e, t, n, i) { + const o = (1 << e.quantizationBits) - 1, s = 1 / o, c = new ModelComponents.Quantization(); + if (c.componentDatatype = t, c.octEncoded = e.octEncoded, c.octEncodedZXY = !0, c.type = i, c.octEncoded) + c.type = AttributeType$1.VEC2, c.normalizationRange = o; + else { + const l = AttributeType$1.getMathType(i); + if (l === Number) { + const d = e.range; + c.quantizedVolumeOffset = e.minValues[0], c.quantizedVolumeDimensions = d, c.normalizationRange = o, c.quantizedVolumeStepSize = d * s; + } else { + c.quantizedVolumeOffset = l.unpack( + e.minValues + ), c.normalizationRange = l.unpack( + new Array(n).fill(o) + ); + const d = new Array(n).fill( + e.range + ); + c.quantizedVolumeDimensions = l.unpack( + d + ); + const f = d.map(function(h) { + return h * s; + }); + c.quantizedVolumeStepSize = l.unpack(f); + } + } + return c; +} +async function loadFromDraco(e) { + e._state = ResourceLoaderState$1.LOADING; + const t = e._resourceCache; + try { + const n = t.getDracoLoader({ + gltf: e._gltf, + draco: e._draco, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._dracoLoader = n, await n.load(), e.isDestroyed() ? void 0 : (e._state = ResourceLoaderState$1.LOADED, e); + } catch { + if (e.isDestroyed()) + return; + handleError$6(e); + } +} +function processDraco(e) { + e._state = ResourceLoaderState$1.PROCESSING; + const n = e._dracoLoader.decodedData.vertexAttributes, i = e._attributeSemantic, r = n[i], o = e._accessorId, c = e._gltf.accessors[o].type, l = r.array, d = r.data.quantization; + defined(d) && (e._quantization = getQuantizationInformation( + d, + r.data.componentDatatype, + r.data.componentsPerAttribute, + c + )), e._typedArray = new Uint8Array( + l.buffer, + l.byteOffset, + l.byteLength + ); +} +async function loadFromBufferView(e) { + e._state = ResourceLoaderState$1.LOADING; + const t = e._resourceCache; + try { + const n = t.getBufferViewLoader({ + gltf: e._gltf, + bufferViewId: e._bufferViewId, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._bufferViewLoader = n, await n.load(), e.isDestroyed() ? void 0 : (e._typedArray = n.typedArray, e._state = ResourceLoaderState$1.PROCESSING, e); + } catch (n) { + if (e.isDestroyed()) + return; + handleError$6(e, n); + } +} +function handleError$6(e, t) { + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load vertex buffer", t); +} +function CreateVertexBufferJob() { + this.typedArray = void 0, this.context = void 0, this.buffer = void 0; +} +CreateVertexBufferJob.prototype.set = function(e, t) { + this.typedArray = e, this.context = t; +}; +CreateVertexBufferJob.prototype.execute = function() { + this.buffer = createVertexBuffer$1(this.typedArray, this.context); +}; +function createVertexBuffer$1(e, t) { + const n = Buffer.createVertexBuffer({ + typedArray: e, + context: t, + usage: BufferUsage$1.STATIC_DRAW + }); + return n.vertexArrayDestroyable = !1, n; +} +const scratchVertexBufferJob = new CreateVertexBufferJob(); +GltfVertexBufferLoader.prototype.process = function(e) { + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state !== ResourceLoaderState$1.LOADED && this._state !== ResourceLoaderState$1.PROCESSING) + return !1; + if (defined(this._dracoLoader)) { + try { + if (!this._dracoLoader.process(e)) + return !1; + } catch (i) { + handleError$6(this, i); + } + processDraco(this); + } + let t; + const n = this._typedArray; + if (this._loadBuffer && this._asynchronous) { + const i = scratchVertexBufferJob; + if (i.set(n, e.context), !e.jobScheduler.execute(i, JobType$1.BUFFER)) + return !1; + t = i.buffer; + } else this._loadBuffer && (t = createVertexBuffer$1(n, e.context)); + return this.unload(), this._buffer = t, this._typedArray = this._loadTypedArray ? n : void 0, this._state = ResourceLoaderState$1.READY, this._resourceCache.statistics.addGeometryLoader(this), !0; +}; +GltfVertexBufferLoader.prototype.unload = function() { + defined(this._buffer) && this._buffer.destroy(); + const e = this._resourceCache; + defined(this._bufferViewLoader) && !this._bufferViewLoader.isDestroyed() && e.unload(this._bufferViewLoader), defined(this._dracoLoader) && e.unload(this._dracoLoader), this._bufferViewLoader = void 0, this._dracoLoader = void 0, this._typedArray = void 0, this._buffer = void 0, this._gltf = void 0; +}; +function MetadataClass(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = defaultValue(e.properties, {}), i = {}; + for (const r in n) + if (n.hasOwnProperty(r)) { + const o = n[r]; + defined(o.semantic) && (i[o.semantic] = o); + } + this._id = t, this._name = e.name, this._description = e.description, this._properties = n, this._propertiesBySemantic = i, this._extras = clone$1(e.extras, !0), this._extensions = clone$1(e.extensions, !0); +} +MetadataClass.fromJson = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.class, i = {}; + for (const r in n.properties) + if (n.properties.hasOwnProperty(r)) { + const o = MetadataClassProperty.fromJson({ + id: r, + property: n.properties[r], + enums: e.enums + }); + i[r] = o; + } + return new MetadataClass({ + id: t, + name: n.name, + description: n.description, + properties: i, + extras: n.extras, + extensions: n.extensions + }); +}; +Object.defineProperties(MetadataClass.prototype, { + /** + * The class properties. + * + * @memberof MetadataClass.prototype + * @type {Object} + * @readonly + */ + properties: { + get: function() { + return this._properties; + } + }, + /** + * A dictionary mapping semantics to class properties. + * + * @memberof MetadataClass.prototype + * @type {Object} + * @readonly + * + * @private + */ + propertiesBySemantic: { + get: function() { + return this._propertiesBySemantic; + } + }, + /** + * The ID of the class. + * + * @memberof MetadataClass.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The name of the class. + * + * @memberof MetadataClass.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The description of the class. + * + * @memberof MetadataClass.prototype + * @type {string} + * @readonly + */ + description: { + get: function() { + return this._description; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataClass.prototype + * @type {*} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataClass.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +MetadataClass.BATCH_TABLE_CLASS_NAME = "_batchTable"; +function MetadataEnumValue(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.value, n = e.name; + this._value = t, this._name = n, this._description = e.description, this._extras = clone$1(e.extras, !0), this._extensions = clone$1(e.extensions, !0); +} +MetadataEnumValue.fromJson = function(e) { + return new MetadataEnumValue({ + value: e.value, + name: e.name, + description: e.description, + extras: e.extras, + extensions: e.extensions + }); +}; +Object.defineProperties(MetadataEnumValue.prototype, { + /** + * The integer value. + * + * @memberof MetadataEnumValue.prototype + * @type {number} + * @readonly + */ + value: { + get: function() { + return this._value; + } + }, + /** + * The name of the enum value. + * + * @memberof MetadataEnumValue.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The description of the enum value. + * + * @memberof MetadataEnumValue.prototype + * @type {string} + * @readonly + */ + description: { + get: function() { + return this._description; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataEnumValue.prototype + * @type {*} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataEnumValue.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +function MetadataEnum(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.values, i = {}, r = {}, o = n.length; + for (let c = 0; c < o; ++c) { + const l = n[c]; + i[l.value] = l.name, r[l.name] = l.value; + } + const s = defaultValue( + e.valueType, + MetadataComponentType$1.UINT16 + ); + this._values = n, this._namesByValue = i, this._valuesByName = r, this._valueType = s, this._id = t, this._name = e.name, this._description = e.description, this._extras = clone$1(e.extras, !0), this._extensions = clone$1(e.extensions, !0); +} +MetadataEnum.fromJson = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.enum, i = n.values.map(function(r) { + return MetadataEnumValue.fromJson(r); + }); + return new MetadataEnum({ + id: t, + values: i, + valueType: MetadataComponentType$1[n.valueType], + name: n.name, + description: n.description, + extras: n.extras, + extensions: n.extensions + }); +}; +Object.defineProperties(MetadataEnum.prototype, { + /** + * The enum values. + * + * @memberof MetadataEnum.prototype + * @type {MetadataEnumValue[]} + * @readonly + */ + values: { + get: function() { + return this._values; + } + }, + /** + * A dictionary mapping enum integer values to names. + * + * @memberof MetadataEnum.prototype + * @type {Object} + * @readonly + * + * @private + */ + namesByValue: { + get: function() { + return this._namesByValue; + } + }, + /** + * A dictionary mapping enum names to integer values. + * + * @memberof MetadataEnum.prototype + * @type {Object} + * @readonly + * + * @private + */ + valuesByName: { + get: function() { + return this._valuesByName; + } + }, + /** + * The enum value type. + * + * @memberof MetadataEnum.prototype + * @type {MetadataComponentType} + * @readonly + */ + valueType: { + get: function() { + return this._valueType; + } + }, + /** + * The ID of the enum. + * + * @memberof MetadataEnum.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The name of the enum. + * + * @memberof MetadataEnum.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The description of the enum. + * + * @memberof MetadataEnum.prototype + * @type {string} + * @readonly + */ + description: { + get: function() { + return this._description; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataEnum.prototype + * @type {*} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataEnum.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +function MetadataSchema(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.classes, {}), n = defaultValue(e.enums, {}); + this._classes = t, this._enums = n, this._id = e.id, this._name = e.name, this._description = e.description, this._version = e.version, this._extras = clone$1(e.extras, !0), this._extensions = clone$1(e.extensions, !0); +} +MetadataSchema.fromJson = function(e) { + const t = {}; + if (defined(e.enums)) + for (const i in e.enums) + e.enums.hasOwnProperty(i) && (t[i] = MetadataEnum.fromJson({ + id: i, + enum: e.enums[i] + })); + const n = {}; + if (defined(e.classes)) + for (const i in e.classes) + e.classes.hasOwnProperty(i) && (n[i] = MetadataClass.fromJson({ + id: i, + class: e.classes[i], + enums: t + })); + return new MetadataSchema({ + id: e.id, + name: e.name, + description: e.description, + version: e.version, + classes: n, + enums: t, + extras: e.extras, + extensions: e.extensions + }); +}; +Object.defineProperties(MetadataSchema.prototype, { + /** + * Classes defined in the schema. + * + * @memberof MetadataSchema.prototype + * @type {Object} + * @readonly + */ + classes: { + get: function() { + return this._classes; + } + }, + /** + * Enums defined in the schema. + * + * @memberof MetadataSchema.prototype + * @type {Object} + * @readonly + */ + enums: { + get: function() { + return this._enums; + } + }, + /** + * The ID of the schema. + * + * @memberof MetadataSchema.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The name of the schema. + * + * @memberof MetadataSchema.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The description of the schema. + * + * @memberof MetadataSchema.prototype + * @type {string} + * @readonly + */ + description: { + get: function() { + return this._description; + } + }, + /** + * The application-specific version of the schema. + * + * @memberof MetadataSchema.prototype + * @type {string} + * @readonly + */ + version: { + get: function() { + return this._version; + } + }, + /** + * Extra user-defined properties. + * + * @memberof MetadataSchema.prototype + * @type {*} + * @readonly + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof MetadataSchema.prototype + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +function MetadataSchemaLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.schema, n = e.resource, i = e.cacheKey; + this._schema = defined(t) ? MetadataSchema.fromJson(t) : void 0, this._resource = n, this._cacheKey = i, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (MetadataSchemaLoader.prototype = Object.create(ResourceLoader.prototype), MetadataSchemaLoader.prototype.constructor = MetadataSchemaLoader); +Object.defineProperties(MetadataSchemaLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof MetadataSchemaLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The metadata schema object. + * + * @memberof MetadataSchemaLoader.prototype + * + * @type {MetadataSchema} + * @readonly + * @private + */ + schema: { + get: function() { + return this._schema; + } + } +}); +MetadataSchemaLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : defined(this._schema) ? (this._promise = Promise.resolve(this), this._promise) : (this._promise = loadExternalSchema(this), this._promise); +}; +async function loadExternalSchema(e) { + const t = e._resource; + e._state = ResourceLoaderState$1.LOADING; + try { + const n = await t.fetchJson(); + return e.isDestroyed() ? void 0 : (e._schema = MetadataSchema.fromJson(n), e._state = ResourceLoaderState$1.READY, e); + } catch (n) { + if (e.isDestroyed()) + return; + e._state = ResourceLoaderState$1.FAILED; + const i = `Failed to load schema: ${t.url}`; + throw e.getError(i, n); + } +} +MetadataSchemaLoader.prototype.unload = function() { + this._schema = void 0; +}; +const ResourceCacheKey = {}; +function getExternalResourceCacheKey(e) { + return getAbsoluteUri(e.url); +} +function getBufferViewCacheKey(e) { + let { byteOffset: t, byteLength: n } = e; + if (hasExtension(e, "EXT_meshopt_compression")) { + const i = e.extensions.EXT_meshopt_compression; + t = defaultValue(i.byteOffset, 0), n = i.byteLength; + } + return `${t}-${t + n}`; +} +function getAccessorCacheKey(e, t) { + const n = t.byteOffset + e.byteOffset, { componentType: i, type: r, count: o } = e; + return `${n}-${i}-${r}-${o}`; +} +function getEmbeddedBufferCacheKey(e, t) { + return `${getExternalResourceCacheKey(e)}-buffer-id-${t}`; +} +function getBufferCacheKey(e, t, n, i) { + if (defined(e.uri)) { + const r = i.getDerivedResource({ + url: e.uri + }); + return getExternalResourceCacheKey(r); + } + return getEmbeddedBufferCacheKey(n, t); +} +function getDracoCacheKey(e, t, n, i) { + const r = t.bufferView, o = e.bufferViews[r], s = o.buffer, c = e.buffers[s], l = getBufferCacheKey( + c, + s, + n, + i + ), d = getBufferViewCacheKey(o); + return `${l}-range-${d}`; +} +function getImageCacheKey(e, t, n, i) { + const r = e.images[t], o = r.bufferView, s = r.uri; + if (defined(s)) { + const p = i.getDerivedResource({ + url: s + }); + return getExternalResourceCacheKey(p); + } + const c = e.bufferViews[o], l = c.buffer, d = e.buffers[l], f = getBufferCacheKey( + d, + l, + n, + i + ), h = getBufferViewCacheKey(c); + return `${f}-range-${h}`; +} +function getSamplerCacheKey(e, t) { + const n = GltfLoaderUtil.createSampler({ + gltf: e, + textureInfo: t + }); + return `${n.wrapS}-${n.wrapT}-${n.minificationFilter}-${n.magnificationFilter}`; +} +ResourceCacheKey.getSchemaCacheKey = function(e) { + const { schema: t, resource: n } = e; + return defined(t) ? `embedded-schema:${JSON.stringify(t)}` : `external-schema:${getExternalResourceCacheKey(n)}`; +}; +ResourceCacheKey.getExternalBufferCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { resource: t } = e; + return `external-buffer:${getExternalResourceCacheKey(t)}`; +}; +ResourceCacheKey.getEmbeddedBufferCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { parentResource: t, bufferId: n } = e; + return `embedded-buffer:${getEmbeddedBufferCacheKey( + t, + n + )}`; +}; +ResourceCacheKey.getGltfCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltfResource: t } = e; + return `gltf:${getExternalResourceCacheKey(t)}`; +}; +ResourceCacheKey.getBufferViewCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, bufferViewId: n, gltfResource: i, baseResource: r } = e, o = t.bufferViews[n]; + let s = o.buffer; + const c = t.buffers[s]; + hasExtension(o, "EXT_meshopt_compression") && (s = o.extensions.EXT_meshopt_compression.buffer); + const l = getBufferCacheKey( + c, + s, + i, + r + ), d = getBufferViewCacheKey(o); + return `buffer-view:${l}-range-${d}`; +}; +ResourceCacheKey.getDracoCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, draco: n, gltfResource: i, baseResource: r } = e; + return `draco:${getDracoCacheKey(t, n, i, r)}`; +}; +ResourceCacheKey.getVertexBufferCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + gltfResource: n, + baseResource: i, + frameState: r, + bufferViewId: o, + draco: s, + attributeSemantic: c, + dequantize: l = !1, + loadBuffer: d = !1, + loadTypedArray: f = !1 + } = e; + let h = ""; + if (l && (h += "-dequantize"), d && (h += "-buffer", h += `-context-${r.context.id}`), f && (h += "-typed-array"), defined(s)) + return `vertex-buffer:${getDracoCacheKey( + t, + s, + n, + i + )}-draco-${c}${h}`; + const p = t.bufferViews[o], m = p.buffer, _ = t.buffers[m], y = getBufferCacheKey( + _, + m, + n, + i + ), C = getBufferViewCacheKey(p); + return `vertex-buffer:${y}-range-${C}${h}`; +}; +ResourceCacheKey.getIndexBufferCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + accessorId: n, + gltfResource: i, + baseResource: r, + frameState: o, + draco: s, + loadBuffer: c = !1, + loadTypedArray: l = !1 + } = e; + let d = ""; + if (c && (d += "-buffer", d += `-context-${o.context.id}`), l && (d += "-typed-array"), defined(s)) + return `index-buffer:${getDracoCacheKey( + t, + s, + i, + r + )}-draco${d}`; + const f = t.accessors[n], h = f.bufferView, p = t.bufferViews[h], m = p.buffer, _ = t.buffers[m], y = getBufferCacheKey( + _, + m, + i, + r + ), C = getAccessorCacheKey(f, p); + return `index-buffer:${y}-accessor-${C}${d}`; +}; +ResourceCacheKey.getImageCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, imageId: n, gltfResource: i, baseResource: r } = e; + return `image:${getImageCacheKey( + t, + n, + i, + r + )}`; +}; +ResourceCacheKey.getTextureCacheKey = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + textureInfo: n, + gltfResource: i, + baseResource: r, + supportedImageFormats: o, + frameState: s + } = e, c = n.index, l = GltfLoaderUtil.getImageIdFromTexture({ + gltf: t, + textureId: c, + supportedImageFormats: o + }), d = getImageCacheKey( + t, + l, + i, + r + ), f = getSamplerCacheKey(t, n); + return `texture:${d}-sampler-${f}-context-${s.context.id}`; +}; +function ResourceCacheStatistics() { + this.geometryByteLength = 0, this.texturesByteLength = 0, this._geometrySizes = {}, this._textureSizes = {}; +} +ResourceCacheStatistics.prototype.clear = function() { + this.geometryByteLength = 0, this.texturesByteLength = 0, this._geometrySizes = {}, this._textureSizes = {}; +}; +ResourceCacheStatistics.prototype.addGeometryLoader = function(e) { + const t = e.cacheKey; + if (this._geometrySizes.hasOwnProperty(t)) + return; + this._geometrySizes[t] = 0; + const n = e.buffer, i = e.typedArray; + let r = 0; + defined(n) && (r += n.sizeInBytes), defined(i) && (r += i.byteLength), this.geometryByteLength += r, this._geometrySizes[t] = r; +}; +ResourceCacheStatistics.prototype.addTextureLoader = function(e) { + const t = e.cacheKey; + if (this._textureSizes.hasOwnProperty(t)) + return; + this._textureSizes[t] = 0; + const n = e.texture.sizeInBytes; + this.texturesByteLength += e.texture.sizeInBytes, this._textureSizes[t] = n; +}; +ResourceCacheStatistics.prototype.removeLoader = function(e) { + const t = e.cacheKey, n = this._geometrySizes[t]; + delete this._geometrySizes[t], defined(n) && (this.geometryByteLength -= n); + const i = this._textureSizes[t]; + delete this._textureSizes[t], defined(i) && (this.texturesByteLength -= i); +}; +function ResourceCache() { +} +ResourceCache.cacheEntries = {}; +ResourceCache.statistics = new ResourceCacheStatistics(); +function CacheEntry(e) { + this.referenceCount = 1, this.resourceLoader = e, this._statisticsPromise = void 0; +} +ResourceCache.get = function(e) { + const t = ResourceCache.cacheEntries[e]; + if (defined(t)) + return ++t.referenceCount, t.resourceLoader; +}; +ResourceCache.add = function(e) { + const t = e.cacheKey; + return ResourceCache.cacheEntries[t] = new CacheEntry(e), e; +}; +ResourceCache.unload = function(e) { + const t = e.cacheKey, n = ResourceCache.cacheEntries[t]; + --n.referenceCount, n.referenceCount === 0 && (ResourceCache.statistics.removeLoader(e), e.destroy(), delete ResourceCache.cacheEntries[t]); +}; +ResourceCache.getSchemaLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { schema: t, resource: n } = e, i = ResourceCacheKey.getSchemaCacheKey({ + schema: t, + resource: n + }); + let r = ResourceCache.get(i); + return defined(r) ? r : (r = new MetadataSchemaLoader({ + schema: t, + resource: n, + cacheKey: i + }), ResourceCache.add(r)); +}; +ResourceCache.getEmbeddedBufferLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { parentResource: t, bufferId: n, typedArray: i } = e, r = ResourceCacheKey.getEmbeddedBufferCacheKey({ + parentResource: t, + bufferId: n + }); + let o = ResourceCache.get(r); + return defined(o) ? o : (o = new BufferLoader({ + typedArray: i, + cacheKey: r + }), ResourceCache.add(o)); +}; +ResourceCache.getExternalBufferLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { resource: t } = e, n = ResourceCacheKey.getExternalBufferCacheKey({ + resource: t + }); + let i = ResourceCache.get(n); + return defined(i) ? i : (i = new BufferLoader({ + resource: t, + cacheKey: n + }), ResourceCache.add(i)); +}; +ResourceCache.getGltfJsonLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltfResource: t, baseResource: n, typedArray: i, gltfJson: r } = e, o = ResourceCacheKey.getGltfCacheKey({ + gltfResource: t + }); + let s = ResourceCache.get(o); + return defined(s) ? s : (s = new GltfJsonLoader({ + resourceCache: ResourceCache, + gltfResource: t, + baseResource: n, + typedArray: i, + gltfJson: r, + cacheKey: o + }), ResourceCache.add(s)); +}; +ResourceCache.getBufferViewLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, bufferViewId: n, gltfResource: i, baseResource: r } = e, o = ResourceCacheKey.getBufferViewCacheKey({ + gltf: t, + bufferViewId: n, + gltfResource: i, + baseResource: r + }); + let s = ResourceCache.get(o); + return defined(s) ? s : (s = new GltfBufferViewLoader({ + resourceCache: ResourceCache, + gltf: t, + bufferViewId: n, + gltfResource: i, + baseResource: r, + cacheKey: o + }), ResourceCache.add(s)); +}; +ResourceCache.getDracoLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, draco: n, gltfResource: i, baseResource: r } = e, o = ResourceCacheKey.getDracoCacheKey({ + gltf: t, + draco: n, + gltfResource: i, + baseResource: r + }); + let s = ResourceCache.get(o); + return defined(s) ? s : (s = new GltfDracoLoader({ + resourceCache: ResourceCache, + gltf: t, + draco: n, + gltfResource: i, + baseResource: r, + cacheKey: o + }), ResourceCache.add(s)); +}; +ResourceCache.getVertexBufferLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + gltfResource: n, + baseResource: i, + frameState: r, + bufferViewId: o, + draco: s, + attributeSemantic: c, + accessorId: l, + asynchronous: d = !0, + dequantize: f = !1, + loadBuffer: h = !1, + loadTypedArray: p = !1 + } = e, m = ResourceCacheKey.getVertexBufferCacheKey({ + gltf: t, + gltfResource: n, + baseResource: i, + frameState: r, + bufferViewId: o, + draco: s, + attributeSemantic: c, + dequantize: f, + loadBuffer: h, + loadTypedArray: p + }); + let _ = ResourceCache.get(m); + return defined(_) ? _ : (_ = new GltfVertexBufferLoader({ + resourceCache: ResourceCache, + gltf: t, + gltfResource: n, + baseResource: i, + bufferViewId: o, + draco: s, + attributeSemantic: c, + accessorId: l, + cacheKey: m, + asynchronous: d, + dequantize: f, + loadBuffer: h, + loadTypedArray: p + }), ResourceCache.add(_)); +}; +ResourceCache.getIndexBufferLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + accessorId: n, + gltfResource: i, + baseResource: r, + frameState: o, + draco: s, + asynchronous: c = !0, + loadBuffer: l = !1, + loadTypedArray: d = !1 + } = e, f = ResourceCacheKey.getIndexBufferCacheKey({ + gltf: t, + accessorId: n, + gltfResource: i, + baseResource: r, + frameState: o, + draco: s, + loadBuffer: l, + loadTypedArray: d + }); + let h = ResourceCache.get(f); + return defined(h) ? h : (h = new GltfIndexBufferLoader({ + resourceCache: ResourceCache, + gltf: t, + accessorId: n, + gltfResource: i, + baseResource: r, + draco: s, + cacheKey: f, + asynchronous: c, + loadBuffer: l, + loadTypedArray: d + }), ResourceCache.add(h)); +}; +ResourceCache.getImageLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { gltf: t, imageId: n, gltfResource: i, baseResource: r } = e, o = ResourceCacheKey.getImageCacheKey({ + gltf: t, + imageId: n, + gltfResource: i, + baseResource: r + }); + let s = ResourceCache.get(o); + return defined(s) ? s : (s = new GltfImageLoader({ + resourceCache: ResourceCache, + gltf: t, + imageId: n, + gltfResource: i, + baseResource: r, + cacheKey: o + }), ResourceCache.add(s)); +}; +ResourceCache.getTextureLoader = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + textureInfo: n, + gltfResource: i, + baseResource: r, + supportedImageFormats: o, + frameState: s, + asynchronous: c = !0 + } = e, l = ResourceCacheKey.getTextureCacheKey({ + gltf: t, + textureInfo: n, + gltfResource: i, + baseResource: r, + supportedImageFormats: o, + frameState: s + }); + let d = ResourceCache.get(l); + return defined(d) ? d : (d = new GltfTextureLoader({ + resourceCache: ResourceCache, + gltf: t, + textureInfo: n, + gltfResource: i, + baseResource: r, + supportedImageFormats: o, + cacheKey: l, + asynchronous: c + }), ResourceCache.add(d)); +}; +ResourceCache.clearForSpecs = function() { + const e = [ + GltfVertexBufferLoader, + GltfIndexBufferLoader, + GltfDracoLoader, + GltfTextureLoader, + GltfImageLoader, + GltfBufferViewLoader, + BufferLoader, + MetadataSchemaLoader, + GltfJsonLoader + ]; + let t; + const n = ResourceCache.cacheEntries, i = []; + for (t in n) + n.hasOwnProperty(t) && i.push(n[t]); + i.sort(function(o, s) { + const c = e.indexOf(o.resourceLoader.constructor), l = e.indexOf(s.resourceLoader.constructor); + return c - l; + }); + const r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o]; + t = s.resourceLoader.cacheKey, defined(n[t]) && (s.resourceLoader.destroy(), delete n[t]); + } + ResourceCache.statistics.clear(); +}; +function ImplicitSubtree(e, t, n) { + this._resource = e, this._subtreeJson = void 0, this._bufferLoader = void 0, this._tileAvailability = void 0, this._contentAvailabilityBitstreams = [], this._childSubtreeAvailability = void 0, this._implicitCoordinates = n, this._subtreeLevels = t.subtreeLevels, this._subdivisionScheme = t.subdivisionScheme, this._branchingFactor = t.branchingFactor, this._metadata = void 0, this._tileMetadataTable = void 0, this._tilePropertyTableJson = void 0, this._contentMetadataTables = [], this._contentPropertyTableJsons = [], this._tileJumpBuffer = void 0, this._contentJumpBuffers = [], this._ready = !1; +} +Object.defineProperties(ImplicitSubtree.prototype, { + /** + * Returns true once all necessary availability buffers + * are loaded. + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * When subtree metadata is present (3D Tiles 1.1), this property stores an {@link ImplicitSubtreeMetadata} instance + * + * @type {ImplicitSubtreeMetadata} + * @readonly + * @private + */ + metadata: { + get: function() { + return this._metadata; + } + }, + /** + * When tile metadata is present (3D Tiles 1.1) or the 3DTILES_metadata extension is used, + * this property stores a {@link MetadataTable} instance for the tiles in the subtree. + * + * @type {MetadataTable} + * @readonly + * @private + */ + tileMetadataTable: { + get: function() { + return this._tileMetadataTable; + } + }, + /** + * When tile metadata is present (3D Tiles 1.1) or the 3DTILES_metadata extension is used, + * this property stores the JSON from the extension. This is used by {@link TileMetadata} + * to get the extras and extensions for the tiles in the subtree. + * + * @type {object} + * @readonly + * @private + */ + tilePropertyTableJson: { + get: function() { + return this._tilePropertyTableJson; + } + }, + /** + * When content metadata is present (3D Tiles 1.1), this property stores + * an array of {@link MetadataTable} instances for the contents in the subtree. + * + * @type {Array} + * @readonly + * @private + */ + contentMetadataTables: { + get: function() { + return this._contentMetadataTables; + } + }, + /** + * When content metadata is present (3D Tiles 1.1), this property + * an array of the JSONs from the extension. This is used to get the extras + * and extensions for the contents in the subtree. + * + * @type {Array} + * @readonly + * @private + */ + contentPropertyTableJsons: { + get: function() { + return this._contentPropertyTableJsons; + } + }, + /** + * Gets the implicit tile coordinates for the root of the subtree. + * + * @type {ImplicitTileCoordinates} + * @readonly + * @private + */ + implicitCoordinates: { + get: function() { + return this._implicitCoordinates; + } + } +}); +ImplicitSubtree.prototype.tileIsAvailableAtIndex = function(e) { + return this._tileAvailability.getBit(e); +}; +ImplicitSubtree.prototype.tileIsAvailableAtCoordinates = function(e) { + const t = this.getTileIndex(e); + return this.tileIsAvailableAtIndex(t); +}; +ImplicitSubtree.prototype.contentIsAvailableAtIndex = function(e, t) { + return t = defaultValue(t, 0), this._contentAvailabilityBitstreams[t].getBit(e); +}; +ImplicitSubtree.prototype.contentIsAvailableAtCoordinates = function(e, t) { + const n = this.getTileIndex(e); + return this.contentIsAvailableAtIndex(n, t); +}; +ImplicitSubtree.prototype.childSubtreeIsAvailableAtIndex = function(e) { + return this._childSubtreeAvailability.getBit(e); +}; +ImplicitSubtree.prototype.childSubtreeIsAvailableAtCoordinates = function(e) { + const t = this.getChildSubtreeIndex(e); + return this.childSubtreeIsAvailableAtIndex(t); +}; +ImplicitSubtree.prototype.getLevelOffset = function(e) { + const t = this._branchingFactor; + return (Math.pow(t, e) - 1) / (t - 1); +}; +ImplicitSubtree.prototype.getParentMortonIndex = function(e) { + let t = 2; + return this._subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE && (t = 3), e >> t; +}; +ImplicitSubtree.fromSubtreeJson = async function(e, t, n, i, r) { + const o = new ImplicitSubtree( + e, + i, + r + ); + let s; + defined(t) ? s = { + json: t, + binary: void 0 + } : s = parseSubtreeChunks(n); + const c = s.json; + o._subtreeJson = c; + let l; + if (hasExtension(c, "3DTILES_metadata")) + l = c.extensions["3DTILES_metadata"]; + else if (defined(c.tileMetadata)) { + const x = c.tileMetadata; + l = c.propertyTables[x]; + } + const d = []; + if (defined(c.contentMetadata)) { + const x = c.contentMetadata.length; + for (let b = 0; b < x; b++) { + const S = c.contentMetadata[b]; + d.push( + c.propertyTables[S] + ); + } + } + let f; + const h = i.metadataSchema, p = c.subtreeMetadata; + if (defined(p)) { + const x = p.class, b = h.classes[x]; + f = new ImplicitSubtreeMetadata({ + subtreeMetadata: p, + class: b + }); + } + o._metadata = f, o._tilePropertyTableJson = l, o._contentPropertyTableJsons = d; + const m = { + constant: 0 + }; + c.contentAvailabilityHeaders = [], hasExtension(c, "3DTILES_multiple_contents") ? c.contentAvailabilityHeaders = c.extensions["3DTILES_multiple_contents"].contentAvailability : Array.isArray(c.contentAvailability) ? c.contentAvailabilityHeaders = c.contentAvailability : c.contentAvailabilityHeaders.push( + defaultValue(c.contentAvailability, m) + ); + const _ = preprocessBuffers(c.buffers), y = preprocessBufferViews( + c.bufferViews, + _ + ); + markActiveBufferViews(c, y), defined(l) && markActiveMetadataBufferViews(l, y); + for (let x = 0; x < d.length; x++) { + const b = d[x]; + markActiveMetadataBufferViews(b, y); + } + const C = await requestActiveBuffers( + o, + _, + s.binary + ), T = parseActiveBufferViews(y, C); + return parseAvailability(o, c, i, T), defined(l) && (parseTileMetadataTable(o, i, T), makeTileJumpBuffer(o)), parseContentMetadataTables(o, i, T), makeContentJumpBuffers(o), o._ready = !0, o; +}; +function parseSubtreeChunks(e) { + const n = new DataView( + e.buffer, + e.byteOffset + ); + let i = 8; + const r = n.getUint32(i, !0); + i += 8; + const o = n.getUint32(i, !0); + i += 8; + const s = getJsonFromTypedArray( + e, + i, + r + ); + i += r; + const c = e.subarray( + i, + i + o + ); + return { + json: s, + binary: c + }; +} +function preprocessBuffers(e) { + e = defined(e) ? e : []; + for (let t = 0; t < e.length; t++) { + const n = e[t]; + n.isExternal = defined(n.uri), n.isActive = !1; + } + return e; +} +function preprocessBufferViews(e, t) { + e = defined(e) ? e : []; + for (let n = 0; n < e.length; n++) { + const i = e[n], r = t[i.buffer]; + i.bufferHeader = r, i.isActive = !1; + } + return e; +} +function markActiveBufferViews(e, t) { + let n; + const i = e.tileAvailability; + defined(i.bitstream) ? n = t[i.bitstream] : defined(i.bufferView) && (n = t[i.bufferView]), defined(n) && (n.isActive = !0, n.bufferHeader.isActive = !0); + const r = e.contentAvailabilityHeaders; + for (let s = 0; s < r.length; s++) + n = void 0, defined(r[s].bitstream) ? n = t[r[s].bitstream] : defined(r[s].bufferView) && (n = t[r[s].bufferView]), defined(n) && (n.isActive = !0, n.bufferHeader.isActive = !0); + n = void 0; + const o = e.childSubtreeAvailability; + defined(o.bitstream) ? n = t[o.bitstream] : defined(o.bufferView) && (n = t[o.bufferView]), defined(n) && (n.isActive = !0, n.bufferHeader.isActive = !0); +} +function markActiveMetadataBufferViews(e, t) { + const n = e.properties; + let i; + for (const r in n) + if (n.hasOwnProperty(r)) { + const o = n[r], s = defaultValue( + o.values, + o.bufferView + ); + i = t[s], i.isActive = !0, i.bufferHeader.isActive = !0; + const c = defaultValue( + o.stringOffsets, + o.stringOffsetBufferView + ); + defined(c) && (i = t[c], i.isActive = !0, i.bufferHeader.isActive = !0); + const l = defaultValue( + o.arrayOffsets, + o.arrayOffsetBufferView + ); + defined(l) && (i = t[l], i.isActive = !0, i.bufferHeader.isActive = !0); + } +} +function requestActiveBuffers(e, t, n) { + const i = []; + for (let r = 0; r < t.length; r++) { + const o = t[r]; + if (!o.isActive) + i.push(Promise.resolve(void 0)); + else if (o.isExternal) { + const s = requestExternalBuffer(e, o); + i.push(s); + } else + i.push(Promise.resolve(n)); + } + return Promise.all(i).then(function(r) { + const o = {}; + for (let s = 0; s < r.length; s++) { + const c = r[s]; + defined(c) && (o[s] = c); + } + return o; + }); +} +async function requestExternalBuffer(e, t) { + const i = e._resource.getDerivedResource({ + url: t.uri + }), r = ResourceCache.getExternalBufferLoader({ + resource: i + }); + e._bufferLoader = r; + try { + await r.load(); + } catch (o) { + if (r.isDestroyed()) + return; + throw o; + } + return r.typedArray; +} +function parseActiveBufferViews(e, t) { + const n = {}; + for (let i = 0; i < e.length; i++) { + const r = e[i]; + if (!r.isActive) + continue; + const o = r.byteOffset, s = o + r.byteLength, l = t[r.buffer].subarray(o, s); + n[i] = l; + } + return n; +} +function parseAvailability(e, t, n, i) { + const r = n.branchingFactor, o = n.subtreeLevels, s = (Math.pow(r, o) - 1) / (r - 1), c = Math.pow(r, o), l = hasExtension(t, "3DTILES_metadata"), d = defined(e._tilePropertyTableJson); + let f = l || d; + e._tileAvailability = parseAvailabilityBitstream( + t.tileAvailability, + i, + s, + f + ); + const h = e._contentPropertyTableJsons.length > 0; + f = f || h; + for (let p = 0; p < t.contentAvailabilityHeaders.length; p++) { + const m = parseAvailabilityBitstream( + t.contentAvailabilityHeaders[p], + i, + // content availability has the same length as tile availability. + s, + f + ); + e._contentAvailabilityBitstreams.push(m); + } + e._childSubtreeAvailability = parseAvailabilityBitstream( + t.childSubtreeAvailability, + i, + c + ); +} +function parseAvailabilityBitstream(e, t, n, i) { + if (defined(e.constant)) + return new ImplicitAvailabilityBitstream({ + constant: !!e.constant, + lengthBits: n, + availableCount: e.availableCount + }); + let r; + return defined(e.bitstream) ? r = t[e.bitstream] : defined(e.bufferView) && (r = t[e.bufferView]), new ImplicitAvailabilityBitstream({ + bitstream: r, + lengthBits: n, + availableCount: e.availableCount, + computeAvailableCountEnabled: i + }); +} +function parseTileMetadataTable(e, t, n) { + const i = e._tilePropertyTableJson, r = e._tileAvailability.availableCount, o = t.metadataSchema, s = i.class, c = o.classes[s]; + e._tileMetadataTable = new MetadataTable({ + class: c, + count: r, + properties: i.properties, + bufferViews: n + }); +} +function parseContentMetadataTables(e, t, n) { + const i = e._contentPropertyTableJsons, r = e._contentAvailabilityBitstreams, o = t.metadataSchema, s = e._contentMetadataTables; + for (let c = 0; c < i.length; c++) { + const l = i[c], f = r[c].availableCount, h = l.class, p = o.classes[h], m = new MetadataTable({ + class: p, + count: f, + properties: l.properties, + bufferViews: n + }); + s.push(m); + } +} +function makeJumpBuffer(e) { + let t = 0; + const n = e.lengthBits, i = e.availableCount; + let r; + i < 256 ? r = new Uint8Array(n) : i < 65536 ? r = new Uint16Array(n) : r = new Uint32Array(n); + for (let o = 0; o < e.lengthBits; o++) + e.getBit(o) && (r[o] = t, t++); + return r; +} +function makeTileJumpBuffer(e) { + const t = makeJumpBuffer(e._tileAvailability); + e._tileJumpBuffer = t; +} +function makeContentJumpBuffers(e) { + const t = e._contentJumpBuffers, n = e._contentAvailabilityBitstreams; + for (let i = 0; i < n.length; i++) { + const r = n[i], o = makeJumpBuffer(r); + t.push(o); + } +} +ImplicitSubtree.prototype.getTileIndex = function(e) { + const t = e.level - this._implicitCoordinates.level; + if (t < 0 || this._subtreeLevels <= t) + throw new RuntimeError("level is out of bounds for this subtree"); + return e.getSubtreeCoordinates().getOffsetCoordinates( + e + ).tileIndex; +}; +ImplicitSubtree.prototype.getChildSubtreeIndex = function(e) { + if (e.level - this._implicitCoordinates.level !== this._implicitCoordinates.subtreeLevels) + throw new RuntimeError("level is out of bounds for this subtree"); + return e.getParentSubtreeCoordinates().getOffsetCoordinates( + e + ).mortonIndex; +}; +function getTileEntityId(e, t) { + if (!defined(e._tileMetadataTable)) + return; + const n = e.getTileIndex(t); + if (e._tileAvailability.getBit(n)) + return e._tileJumpBuffer[n]; +} +function getContentEntityId(e, t, n) { + const i = e._contentMetadataTables; + if (!defined(i)) + return; + const r = i[n]; + if (!defined(r)) + return; + const o = e._contentAvailabilityBitstreams[n], s = e.getTileIndex(t); + if (o.getBit(s)) + return e._contentJumpBuffers[n][s]; +} +ImplicitSubtree.prototype.getTileMetadataView = function(e) { + const t = getTileEntityId(this, e); + if (!defined(t)) + return; + const n = this._tileMetadataTable; + return new ImplicitMetadataView({ + class: n.class, + metadataTable: n, + entityId: t, + propertyTableJson: this._tilePropertyTableJson + }); +}; +ImplicitSubtree.prototype.getContentMetadataView = function(e, t) { + const n = getContentEntityId(this, e, t); + if (!defined(n)) + return; + const i = this._contentMetadataTables[t], r = this._contentPropertyTableJsons[t]; + return new ImplicitMetadataView({ + class: i.class, + metadataTable: i, + entityId: n, + contentIndex: t, + propertyTableJson: r + }); +}; +ImplicitSubtree.prototype.isDestroyed = function() { + return !1; +}; +ImplicitSubtree.prototype.destroy = function() { + return defined(this._bufferLoader) && ResourceCache.unload(this._bufferLoader), destroyObject(this); +}; +const MetadataSemantic = { + /** + * A unique identifier, stored as a STRING. + * + * @type {string} + * @constant + * @private + */ + ID: "ID", + /** + * A name, stored as a STRING. This does not have to be unique. + * + * @type {string} + * @constant + * @private + */ + NAME: "NAME", + /** + * A description, stored as a STRING. + * + * @type {string} + * @constant + * @private + */ + DESCRIPTION: "DESCRIPTION", + /** + * The number of tiles in a tileset, stored as a UINT64. + * + * @type {string} + * @constant + * @private + */ + TILESET_TILE_COUNT: "TILESET_TILE_COUNT", + /** + * A bounding box for a tile, stored as an array of 12 FLOAT32 or FLOAT64 components. The components are the same format as for boundingVolume.box in 3D Tiles 1.0. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_BOUNDING_BOX: "TILE_BOUNDING_BOX", + /** + * A bounding region for a tile, stored as an array of 6 FLOAT64 components. The components are [west, south, east, north, minimumHeight, maximumHeight]. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_BOUNDING_REGION: "TILE_BOUNDING_REGION", + /** + * A bounding sphere for a tile, stored as an array of 4 FLOAT32 or FLOAT64 components. The components are [centerX, centerY, centerZ, radius]. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_BOUNDING_SPHERE: "TILE_BOUNDING_SPHERE", + /** + * The minimum height of a tile above (or below) the ellipsoid, stored as a FLOAT32 or a FLOAT64. This semantic is used to tighten bounding regions implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_MINIMUM_HEIGHT: "TILE_MINIMUM_HEIGHT", + /** + * The maximum height of a tile above (or below) the ellipsoid, stored as a FLOAT32 or a FLOAT64. This semantic is used to tighten bounding regions implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_MAXIMUM_HEIGHT: "TILE_MAXIMUM_HEIGHT", + /** + * The horizon occlusion point for a tile, stored as an VEC3 of FLOAT32 or FLOAT64 components. + * + * @see {@link https://cesium.com/blog/2013/04/25/horizon-culling/|Horizon Culling} + * + * @type {string} + * @constant + * @private + */ + TILE_HORIZON_OCCLUSION_POINT: "TILE_HORIZON_OCCLUSION_POINT", + /** + * The geometric error for a tile, stored as a FLOAT32 or a FLOAT64. This semantic is used to override the geometric error implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + TILE_GEOMETRIC_ERROR: "TILE_GEOMETRIC_ERROR", + /** + * A bounding box for the content of a tile, stored as an array of 12 FLOAT32 or FLOAT64 components. The components are the same format as for boundingVolume.box in 3D Tiles 1.0. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + CONTENT_BOUNDING_BOX: "CONTENT_BOUNDING_BOX", + /** + * A bounding region for the content of a tile, stored as an array of 6 FLOAT64 components. The components are [west, south, east, north, minimumHeight, maximumHeight]. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + CONTENT_BOUNDING_REGION: "CONTENT_BOUNDING_REGION", + /** + * A bounding sphere for the content of a tile, stored as an array of 4 FLOAT32 or FLOAT64 components. The components are [centerX, centerY, centerZ, radius]. This semantic is used to provide a tighter bounding volume than the one implicitly calculated in implicit tiling. + * + * @type {string} + * @constant + * @private + */ + CONTENT_BOUNDING_SPHERE: "CONTENT_BOUNDING_SPHERE", + /** + * The minimum height of the content of a tile above (or below) the ellipsoid, stored as a FLOAT32 or a FLOAT64 + * + * @type {string} + * @constant + * @private + */ + CONTENT_MINIMUM_HEIGHT: "CONTENT_MINIMUM_HEIGHT", + /** + * The maximum height of the content of a tile above (or below) the ellipsoid, stored as a FLOAT32 or a FLOAT64 + * + * @type {string} + * @constant + * @private + */ + CONTENT_MAXIMUM_HEIGHT: "CONTENT_MAXIMUM_HEIGHT", + /** + * The horizon occlusion point for the content of a tile, stored as an VEC3 of FLOAT32 or FLOAT64 components. + * + * @see {@link https://cesium.com/blog/2013/04/25/horizon-culling/|Horizon Culling} + * + * @type {string} + * @constant + * @private + */ + CONTENT_HORIZON_OCCLUSION_POINT: "CONTENT_HORIZON_OCCLUSION_POINT" +}, MetadataSemantic$1 = Object.freeze(MetadataSemantic), BoundingVolumeSemantics = {}; +BoundingVolumeSemantics.parseAllBoundingVolumeSemantics = function(e) { + return { + tile: { + boundingVolume: BoundingVolumeSemantics.parseBoundingVolumeSemantic( + "TILE", + e + ), + minimumHeight: BoundingVolumeSemantics._parseMinimumHeight( + "TILE", + e + ), + maximumHeight: BoundingVolumeSemantics._parseMaximumHeight( + "TILE", + e + ) + }, + content: { + boundingVolume: BoundingVolumeSemantics.parseBoundingVolumeSemantic( + "CONTENT", + e + ), + minimumHeight: BoundingVolumeSemantics._parseMinimumHeight( + "CONTENT", + e + ), + maximumHeight: BoundingVolumeSemantics._parseMaximumHeight( + "CONTENT", + e + ) + } + }; +}; +BoundingVolumeSemantics.parseBoundingVolumeSemantic = function(e, t) { + const n = `${e}_BOUNDING_BOX`, i = t.getPropertyBySemantic(n); + if (defined(i)) + return { + box: i + }; + const r = `${e}_BOUNDING_REGION`, o = t.getPropertyBySemantic( + r + ); + if (defined(o)) + return { + region: o + }; + const s = `${e}_BOUNDING_SPHERE`, c = t.getPropertyBySemantic( + s + ); + if (defined(c)) + return { + sphere: c + }; +}; +BoundingVolumeSemantics._parseMinimumHeight = function(e, t) { + const n = `${e}_MINIMUM_HEIGHT`; + return t.getPropertyBySemantic(n); +}; +BoundingVolumeSemantics._parseMaximumHeight = function(e, t) { + const n = `${e}_MAXIMUM_HEIGHT`; + return t.getPropertyBySemantic(n); +}; +function Implicit3DTileContent(e, t, n) { + const i = t.implicitTileset, r = t.implicitCoordinates; + this._implicitTileset = i, this._implicitCoordinates = r, this._implicitSubtree = void 0, this._tileset = e, this._tile = t, this._resource = n, this._metadata = void 0, this.featurePropertiesDirty = !1, this._group = void 0; + const o = r.getTemplateValues(), s = i.subtreeUriTemplate.getDerivedResource( + { + templateValues: o + } + ); + this._url = s.getUrlComponent(!0), this._ready = !1; +} +Object.defineProperties(Implicit3DTileContent.prototype, { + featuresLength: { + get: function() { + return 0; + } + }, + pointsLength: { + get: function() { + return 0; + } + }, + trianglesLength: { + get: function() { + return 0; + } + }, + geometryByteLength: { + get: function() { + return 0; + } + }, + texturesByteLength: { + get: function() { + return 0; + } + }, + batchTableByteLength: { + get: function() { + return 0; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Implicit3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._url; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Implicit3DTileContent + * always returns undefined. Only transcoded tiles have content metadata. + * @memberof Implicit3DTileContent.prototype + * @private + */ + metadata: { + get: function() { + }, + set: function() { + } + }, + batchTable: { + get: function() { + } + }, + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + } + } +}); +Implicit3DTileContent.fromSubtreeJson = async function(e, t, n, i, r, o) { + o = defaultValue(o, 0); + let s; + defined(r) && (s = new Uint8Array(r, o)); + const c = t.implicitTileset, l = t.implicitCoordinates, d = await ImplicitSubtree.fromSubtreeJson( + n, + i, + s, + c, + l + ), f = new Implicit3DTileContent(e, t, n); + return f._implicitSubtree = d, expandSubtree(f, d), f._ready = !0, f; +}; +function expandSubtree(e, t) { + const n = e._tile, i = e._implicitCoordinates.childIndex, r = transcodeSubtreeTiles( + e, + t, + n, + i + ), o = e._tileset.statistics; + n.children.push(r.rootTile), o.numberOfTilesTotal++; + const s = listChildSubtrees(e, t, r.bottomRow); + for (let c = 0; c < s.length; c++) { + const l = s[c], d = l.tile, f = makePlaceholderChildSubtree( + e, + d, + l.childIndex + ); + d.children.push(f), o.numberOfTilesTotal++; + } +} +function listChildSubtrees(e, t, n) { + const i = [], r = e._implicitTileset.branchingFactor; + for (let o = 0; o < n.length; o++) { + const s = n[o]; + if (defined(s)) + for (let c = 0; c < r; c++) { + const l = o * r + c; + t.childSubtreeIsAvailableAtIndex(l) && i.push({ + tile: s, + childIndex: c + }); + } + } + return i; +} +function transcodeSubtreeTiles(e, t, n, i) { + const s = deriveChildTile( + e, + t, + n, + i, + 0, + !0 + ), c = e._tileset.statistics; + let l = [s], d = []; + const f = e._implicitTileset; + for (let h = 1; h < f.subtreeLevels; h++) { + const p = t.getLevelOffset(h), m = f.branchingFactor * l.length; + for (let _ = 0; _ < m; _++) { + const y = p + _; + if (!t.tileIsAvailableAtIndex(y)) { + d.push(void 0); + continue; + } + const C = t.getParentMortonIndex(_), T = l[C], x = _ % f.branchingFactor, b = deriveChildTile( + e, + t, + T, + x, + y + ); + T.children.push(b), c.numberOfTilesTotal++, d.push(b); + } + l = d, d = []; + } + return { + rootTile: s, + // At the end of the last loop, bottomRow was moved to parentRow + bottomRow: l + }; +} +function getGeometricError$2(e, t, n) { + const i = MetadataSemantic$1.TILE_GEOMETRIC_ERROR; + return defined(e) && e.hasPropertyBySemantic(i) ? e.getPropertyBySemantic(i) : t.geometricError / Math.pow(2, n.level); +} +function deriveChildTile(e, t, n, i, r, o) { + const s = e._implicitTileset; + let c; + defaultValue(o, !1) ? c = n.implicitCoordinates : c = n.implicitCoordinates.getChildCoordinates( + i + ); + let l, d, f; + if (defined(t.tilePropertyTableJson)) { + l = t.getTileMetadataView(c); + const A = BoundingVolumeSemantics.parseAllBoundingVolumeSemantics( + l + ); + d = A.tile, f = A.content; + } + const p = t.contentPropertyTableJsons.length; + let m = !1; + for (let A = 0; A < p; A++) + if (t.contentIsAvailableAtCoordinates(c, A)) { + m = !0; + break; + } + const _ = getTileBoundingVolume( + s, + c, + i, + o, + n, + d + ), y = []; + for (let A = 0; A < s.contentCount; A++) { + if (!t.contentIsAvailableAtIndex(r, A)) + continue; + const I = { + uri: s.contentUriTemplates[A].getDerivedResource({ + templateValues: c.getTemplateValues() + }).url + }, M = getContentBoundingVolume$1( + _, + f + ); + defined(M) && (I.boundingVolume = M), y.push(combine$2(I, s.contentHeaders[A])); + } + const C = getGeometricError$2( + l, + s, + c + ), T = { + boundingVolume: _, + geometricError: C, + refine: s.refine, + contents: y + }, x = !0, b = clone$1(s.tileHeader, x); + delete b.boundingVolume, delete b.transform, delete b.metadata; + const S = combine$2(T, b, x), E = makeTile$1( + e, + s.baseResource, + S, + n + ); + return E.implicitCoordinates = c, E.implicitSubtree = t, E.metadata = l, E.hasImplicitContentMetadata = m, E; +} +function canUpdateHeights(e, t) { + return defined(e) && defined(t) && (defined(t.minimumHeight) || defined(t.maximumHeight)) && (hasExtension(e, "3DTILES_bounding_volume_S2") || defined(e.region)); +} +function updateHeights$1(e, t) { + defined(t) && (hasExtension(e, "3DTILES_bounding_volume_S2") ? updateS2CellHeights( + e.extensions["3DTILES_bounding_volume_S2"], + t.minimumHeight, + t.maximumHeight + ) : defined(e.region) && updateRegionHeights( + e.region, + t.minimumHeight, + t.maximumHeight + )); +} +function updateRegionHeights(e, t, n) { + defined(t) && (e[4] = t), defined(n) && (e[5] = n); +} +function updateS2CellHeights(e, t, n) { + defined(t) && (e.minimumHeight = t), defined(n) && (e.maximumHeight = n); +} +function getTileBoundingVolume(e, t, n, i, r, o) { + let s; + return !defined(o) || !defined(o.boundingVolume) || !canUpdateHeights(o.boundingVolume, o) && canUpdateHeights(e.boundingVolume, o) ? s = deriveBoundingVolume( + e, + t, + n, + defaultValue(i, !1), + r + ) : s = o.boundingVolume, updateHeights$1(s, o), s; +} +function getContentBoundingVolume$1(e, t) { + let n; + return defined(t) && (n = t.boundingVolume), canUpdateHeights(n, t) ? updateHeights$1(n, t) : canUpdateHeights(e, t) && (n = clone$1(e, !0), updateHeights$1(n, t)), n; +} +function deriveBoundingVolume(e, t, n, i, r) { + const o = e.boundingVolume; + return hasExtension(o, "3DTILES_bounding_volume_S2") ? deriveBoundingVolumeS2( + i, + r, + n, + t.level, + t.x, + t.y, + t.z + ) : defined(o.region) ? { + region: deriveBoundingRegion( + o.region, + t.level, + t.x, + t.y, + t.z + ) + } : { + box: deriveBoundingBox( + o.box, + t.level, + t.x, + t.y, + t.z + ) + }; +} +function deriveBoundingVolumeS2(e, t, n, i, r, o, s) { + const c = t._boundingVolume; + if (e) + return { + extensions: { + "3DTILES_bounding_volume_S2": { + token: S2Cell.getTokenFromId(c.s2Cell._cellId), + minimumHeight: c.minimumHeight, + maximumHeight: c.maximumHeight + } + } + }; + const l = Number(t._boundingVolume.s2Cell._cellId >> BigInt(61)), d = l % 2 === 0 ? HilbertOrder.encode2D(i, r, o) : HilbertOrder.encode2D(i, o, r), f = S2Cell.fromFacePositionLevel(l, BigInt(d), i); + let h, p; + if (defined(s)) { + const m = (c.maximumHeight + c.minimumHeight) / 2; + h = n < 4 ? c.minimumHeight : m, p = n < 4 ? m : c.maximumHeight; + } else + h = c.minimumHeight, p = c.maximumHeight; + return { + extensions: { + "3DTILES_bounding_volume_S2": { + token: S2Cell.getTokenFromId(f._cellId), + minimumHeight: h, + maximumHeight: p + } + } + }; +} +const scratchScaleFactors = new Cartesian3(), scratchRootCenter = new Cartesian3(), scratchCenter$9 = new Cartesian3(), scratchHalfAxes$1 = new Matrix3(); +function deriveBoundingBox(e, t, n, i, r) { + if (t === 0) + return e; + const o = Cartesian3.unpack(e, 0, scratchRootCenter), s = Matrix3.unpack(e, 3, scratchHalfAxes$1), c = Math.pow(2, -t), l = -1 + (2 * n + 1) * c, d = -1 + (2 * i + 1) * c; + let f = 0; + const h = Cartesian3.fromElements( + c, + c, + 1, + scratchScaleFactors + ); + defined(r) && (f = -1 + (2 * r + 1) * c, h.z = c); + let p = Cartesian3.fromElements( + l, + d, + f, + scratchCenter$9 + ); + p = Matrix3.multiplyByVector(s, p, scratchCenter$9), p = Cartesian3.add(p, o, scratchCenter$9); + let m = Matrix3.clone(s); + m = Matrix3.multiplyByScale(m, h, m); + const _ = new Array(12); + return Cartesian3.pack(p, _), Matrix3.pack(m, _, 3), _; +} +const scratchRectangle$b = new Rectangle(); +function deriveBoundingRegion(e, t, n, i, r) { + if (t === 0) + return e.slice(); + const o = Rectangle.unpack(e, 0, scratchRectangle$b), s = e[4], c = e[5], l = Math.pow(2, -t), d = l * o.width, f = CesiumMath.negativePiToPi(o.west + n * d), h = CesiumMath.negativePiToPi(f + d), p = l * o.height, m = CesiumMath.negativePiToPi(o.south + i * p), _ = CesiumMath.negativePiToPi(m + p); + let y = s, C = c; + if (defined(r)) { + const T = l * (c - s); + y += r * T, C = y + T; + } + return [f, m, h, _, y, C]; +} +function makePlaceholderChildSubtree(e, t, n) { + const i = e._implicitTileset, r = t.implicitCoordinates.getChildCoordinates( + n + ), o = deriveBoundingVolume( + i, + r, + n, + !1, + t + ), s = getGeometricError$2( + void 0, + i, + r + ), c = i.subtreeUriTemplate.getDerivedResource( + { + templateValues: r.getTemplateValues() + } + ).url, l = { + boundingVolume: o, + geometricError: s, + refine: i.refine, + contents: [ + { + uri: c + } + ] + }, d = makeTile$1( + e, + i.baseResource, + l, + t + ); + return d.implicitTileset = i, d.implicitCoordinates = r, d; +} +function makeTile$1(e, t, n, i) { + const r = e._tile.constructor; + return new r(e._tileset, t, n, i); +} +Implicit3DTileContent.prototype.hasProperty = function(e, t) { + return !1; +}; +Implicit3DTileContent.prototype.getFeature = function(e) { +}; +Implicit3DTileContent.prototype.applyDebugSettings = function(e, t) { +}; +Implicit3DTileContent.prototype.applyStyle = function(e) { +}; +Implicit3DTileContent.prototype.update = function(e, t) { +}; +Implicit3DTileContent.prototype.pick = function(e, t, n) { +}; +Implicit3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Implicit3DTileContent.prototype.destroy = function() { + return this._implicitSubtree = this._implicitSubtree && this._implicitSubtree.destroy(), destroyObject(this); +}; +Implicit3DTileContent._deriveBoundingBox = deriveBoundingBox; +Implicit3DTileContent._deriveBoundingRegion = deriveBoundingRegion; +Implicit3DTileContent._deriveBoundingVolumeS2 = deriveBoundingVolumeS2; +const ModelAnimationLoop = { + /** + * Play the animation once; do not loop it. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * Loop the animation playing it from the start immediately after it stops. + * + * @type {number} + * @constant + */ + REPEAT: 1, + /** + * Loop the animation. First, playing it forward, then in reverse, then forward, and so on. + * + * @type {number} + * @constant + */ + MIRRORED_REPEAT: 2 +}, ModelAnimationLoop$1 = Object.freeze(ModelAnimationLoop); +function ClippingPlane(e, t) { + this._distance = t, this._normal = new UpdateChangedCartesian3(e, this), this.onChangeCallback = void 0, this.index = -1; +} +Object.defineProperties(ClippingPlane.prototype, { + /** + * The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + * + * @type {number} + * @memberof ClippingPlane.prototype + */ + distance: { + get: function() { + return this._distance; + }, + set: function(e) { + defined(this.onChangeCallback) && e !== this._distance && this.onChangeCallback(this.index), this._distance = e; + } + }, + /** + * The plane's normal. + * + * @type {Cartesian3} + * @memberof ClippingPlane.prototype + */ + normal: { + get: function() { + return this._normal; + }, + set: function(e) { + defined(this.onChangeCallback) && !Cartesian3.equals(this._normal._cartesian3, e) && this.onChangeCallback(this.index), Cartesian3.clone(e, this._normal._cartesian3); + } + } +}); +ClippingPlane.fromPlane = function(e, t) { + return defined(t) ? (t.normal = e.normal, t.distance = e.distance) : t = new ClippingPlane(e.normal, e.distance), t; +}; +ClippingPlane.clone = function(e, t) { + return defined(t) ? (t.normal = e.normal, t.distance = e.distance, t) : new ClippingPlane(e.normal, e.distance); +}; +function UpdateChangedCartesian3(e, t) { + this._clippingPlane = t, this._cartesian3 = Cartesian3.clone(e); +} +Object.defineProperties(UpdateChangedCartesian3.prototype, { + x: { + get: function() { + return this._cartesian3.x; + }, + set: function(e) { + defined(this._clippingPlane.onChangeCallback) && e !== this._cartesian3.x && this._clippingPlane.onChangeCallback(this._clippingPlane.index), this._cartesian3.x = e; + } + }, + y: { + get: function() { + return this._cartesian3.y; + }, + set: function(e) { + defined(this._clippingPlane.onChangeCallback) && e !== this._cartesian3.y && this._clippingPlane.onChangeCallback(this._clippingPlane.index), this._cartesian3.y = e; + } + }, + z: { + get: function() { + return this._cartesian3.z; + }, + set: function(e) { + defined(this._clippingPlane.onChangeCallback) && e !== this._cartesian3.z && this._clippingPlane.onChangeCallback(this._clippingPlane.index), this._cartesian3.z = e; + } + } +}); +function ClippingPlaneCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._planes = [], this._dirtyIndex = -1, this._multipleDirtyPlanes = !1, this._enabled = defaultValue(e.enabled, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this.edgeColor = Color.clone(defaultValue(e.edgeColor, Color.WHITE)), this.edgeWidth = defaultValue(e.edgeWidth, 0), this.planeAdded = new Event(), this.planeRemoved = new Event(), this._owner = void 0; + const t = defaultValue( + e.unionClippingRegions, + !1 + ); + this._unionClippingRegions = t, this._testIntersection = t ? unionIntersectFunction : defaultIntersectFunction, this._uint8View = void 0, this._float32View = void 0, this._clippingPlanesTexture = void 0; + const n = e.planes; + if (defined(n)) { + const i = n.length; + for (let r = 0; r < i; ++r) + this.add(n[r]); + } +} +function unionIntersectFunction(e) { + return e === Intersect$1.OUTSIDE; +} +function defaultIntersectFunction(e) { + return e === Intersect$1.INSIDE; +} +Object.defineProperties(ClippingPlaneCollection.prototype, { + /** + * Returns the number of planes in this collection. This is commonly used with + * {@link ClippingPlaneCollection#get} to iterate over all the planes + * in the collection. + * + * @memberof ClippingPlaneCollection.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._planes.length; + } + }, + /** + * If true, a region will be clipped if it is on the outside of any plane in the + * collection. Otherwise, a region will only be clipped if it is on the + * outside of every plane. + * + * @memberof ClippingPlaneCollection.prototype + * @type {boolean} + * @default false + */ + unionClippingRegions: { + get: function() { + return this._unionClippingRegions; + }, + set: function(e) { + this._unionClippingRegions !== e && (this._unionClippingRegions = e, this._testIntersection = e ? unionIntersectFunction : defaultIntersectFunction); + } + }, + /** + * If true, clipping will be enabled. + * + * @memberof ClippingPlaneCollection.prototype + * @type {boolean} + * @default true + */ + enabled: { + get: function() { + return this._enabled; + }, + set: function(e) { + this._enabled !== e && (this._enabled = e); + } + }, + /** + * Returns a texture containing packed, untransformed clipping planes. + * + * @memberof ClippingPlaneCollection.prototype + * @type {Texture} + * @readonly + * @private + */ + texture: { + get: function() { + return this._clippingPlanesTexture; + } + }, + /** + * A reference to the ClippingPlaneCollection's owner, if any. + * + * @memberof ClippingPlaneCollection.prototype + * @readonly + * @private + */ + owner: { + get: function() { + return this._owner; + } + }, + /** + * Returns a Number encapsulating the state for this ClippingPlaneCollection. + * + * Clipping mode is encoded in the sign of the number, which is just the plane count. + * If this value changes, then shader regeneration is necessary. + * + * @memberof ClippingPlaneCollection.prototype + * @returns {number} A Number that describes the ClippingPlaneCollection's state. + * @readonly + * @private + */ + clippingPlanesState: { + get: function() { + return this._unionClippingRegions ? this._planes.length : -this._planes.length; + } + } +}); +function setIndexDirty(e, t) { + e._multipleDirtyPlanes = e._multipleDirtyPlanes || e._dirtyIndex !== -1 && e._dirtyIndex !== t, e._dirtyIndex = t; +} +ClippingPlaneCollection.prototype.add = function(e) { + const t = this._planes.length, n = this; + e.onChangeCallback = function(i) { + setIndexDirty(n, i); + }, e.index = t, setIndexDirty(this, t), this._planes.push(e), this.planeAdded.raiseEvent(e, t); +}; +ClippingPlaneCollection.prototype.get = function(e) { + return this._planes[e]; +}; +function indexOf(e, t) { + const n = e.length; + for (let i = 0; i < n; ++i) + if (Plane.equals(e[i], t)) + return i; + return -1; +} +ClippingPlaneCollection.prototype.contains = function(e) { + return indexOf(this._planes, e) !== -1; +}; +ClippingPlaneCollection.prototype.remove = function(e) { + const t = this._planes, n = indexOf(t, e); + if (n === -1) + return !1; + e instanceof ClippingPlane && (e.onChangeCallback = void 0, e.index = -1); + const i = t.length - 1; + for (let r = n; r < i; ++r) { + const o = t[r + 1]; + t[r] = o, o instanceof ClippingPlane && (o.index = r); + } + return this._multipleDirtyPlanes = !0, t.length = i, this.planeRemoved.raiseEvent(e, n), !0; +}; +ClippingPlaneCollection.prototype.removeAll = function() { + const e = this._planes, t = e.length; + for (let n = 0; n < t; ++n) { + const i = e[n]; + i instanceof ClippingPlane && (i.onChangeCallback = void 0, i.index = -1), this.planeRemoved.raiseEvent(i, n); + } + this._multipleDirtyPlanes = !0, this._planes = []; +}; +const distanceEncodeScratch = new Cartesian4(), oct32EncodeScratch = new Cartesian4(); +function packPlanesAsUint8(e, t, n) { + const i = e._uint8View, r = e._planes; + let o = 0; + for (let s = t; s < n; ++s) { + const c = r[s], l = AttributeCompression.octEncodeToCartesian4( + c.normal, + oct32EncodeScratch + ); + i[o] = l.x, i[o + 1] = l.y, i[o + 2] = l.z, i[o + 3] = l.w; + const d = Cartesian4.packFloat( + c.distance, + distanceEncodeScratch + ); + i[o + 4] = d.x, i[o + 5] = d.y, i[o + 6] = d.z, i[o + 7] = d.w, o += 8; + } +} +function packPlanesAsFloats(e, t, n) { + const i = e._float32View, r = e._planes; + let o = 0; + for (let s = t; s < n; ++s) { + const c = r[s], l = c.normal; + i[o] = l.x, i[o + 1] = l.y, i[o + 2] = l.z, i[o + 3] = c.distance, o += 4; + } +} +function computeTextureResolution(e, t) { + const n = ContextLimits.maximumTextureSize; + return t.x = Math.min(e, n), t.y = Math.ceil(e / t.x), t; +} +const textureResolutionScratch$3 = new Cartesian2(); +ClippingPlaneCollection.prototype.update = function(e) { + let t = this._clippingPlanesTexture; + const n = e.context, i = ClippingPlaneCollection.useFloatTexture(n), r = i ? this.length : this.length * 2; + if (defined(t)) { + const s = t.width * t.height; + (s < r || r < 0.25 * s) && (t.destroy(), t = void 0, this._clippingPlanesTexture = void 0); + } + if (this.length === 0) + return; + if (!defined(t)) { + const s = computeTextureResolution( + r, + textureResolutionScratch$3 + ); + s.y *= 2, i ? (t = new Texture({ + context: n, + width: s.x, + height: s.y, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.FLOAT, + sampler: Sampler.NEAREST, + flipY: !1 + }), this._float32View = new Float32Array( + s.x * s.y * 4 + )) : (t = new Texture({ + context: n, + width: s.x, + height: s.y, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + sampler: Sampler.NEAREST, + flipY: !1 + }), this._uint8View = new Uint8Array( + s.x * s.y * 4 + )), this._clippingPlanesTexture = t, this._multipleDirtyPlanes = !0; + } + const o = this._dirtyIndex; + if (!(!this._multipleDirtyPlanes && o === -1)) { + if (this._multipleDirtyPlanes) + i ? (packPlanesAsFloats(this, 0, this._planes.length), t.copyFrom({ + source: { + width: t.width, + height: t.height, + arrayBufferView: this._float32View + } + })) : (packPlanesAsUint8(this, 0, this._planes.length), t.copyFrom({ + source: { + width: t.width, + height: t.height, + arrayBufferView: this._uint8View + } + })); + else { + let s = 0, c = 0; + i ? (c = Math.floor(o / t.width), s = Math.floor(o - c * t.width), packPlanesAsFloats(this, o, o + 1), t.copyFrom({ + source: { + width: 1, + height: 1, + arrayBufferView: this._float32View + }, + xOffset: s, + yOffset: c + })) : (c = Math.floor(o * 2 / t.width), s = Math.floor( + o * 2 - c * t.width + ), packPlanesAsUint8(this, o, o + 1), t.copyFrom({ + source: { + width: 2, + height: 1, + arrayBufferView: this._uint8View + }, + xOffset: s, + yOffset: c + })); + } + this._multipleDirtyPlanes = !1, this._dirtyIndex = -1; + } +}; +const scratchMatrix$4 = new Matrix4(), scratchPlane = new Plane(Cartesian3.UNIT_X, 0); +ClippingPlaneCollection.prototype.computeIntersectionWithBoundingVolume = function(e, t) { + const n = this._planes, i = n.length; + let r = this.modelMatrix; + defined(t) && (r = Matrix4.multiply(t, r, scratchMatrix$4)); + let o = Intersect$1.INSIDE; + !this.unionClippingRegions && i > 0 && (o = Intersect$1.OUTSIDE); + for (let s = 0; s < i; ++s) { + const c = n[s]; + Plane.transform(c, r, scratchPlane); + const l = e.intersectPlane(scratchPlane); + if (l === Intersect$1.INTERSECTING) + o = l; + else if (this._testIntersection(l)) + return l; + } + return o; +}; +ClippingPlaneCollection.setOwner = function(e, t, n) { + e !== t[n] && (t[n] = t[n] && t[n].destroy(), defined(e) && (e._owner = t, t[n] = e)); +}; +ClippingPlaneCollection.useFloatTexture = function(e) { + return e.floatingPointTexture; +}; +ClippingPlaneCollection.getTextureResolution = function(e, t, n) { + const i = e.texture; + if (defined(i)) + return n.x = i.width, n.y = i.height, n; + const r = ClippingPlaneCollection.useFloatTexture(t) ? e.length : e.length * 2, o = computeTextureResolution(r, n); + return o.y *= 2, o; +}; +ClippingPlaneCollection.prototype.isDestroyed = function() { + return !1; +}; +ClippingPlaneCollection.prototype.destroy = function() { + return this._clippingPlanesTexture = this._clippingPlanesTexture && this._clippingPlanesTexture.destroy(), destroyObject(this); +}; +function earcut(e, t, n = 2) { + const i = t && t.length, r = i ? t[0] * n : e.length; + let o = linkedList(e, 0, r, n, !0); + const s = []; + if (!o || o.next === o.prev) return s; + let c, l, d; + if (i && (o = eliminateHoles(e, t, o, n)), e.length > 80 * n) { + c = 1 / 0, l = 1 / 0; + let f = -1 / 0, h = -1 / 0; + for (let p = n; p < r; p += n) { + const m = e[p], _ = e[p + 1]; + m < c && (c = m), _ < l && (l = _), m > f && (f = m), _ > h && (h = _); + } + d = Math.max(f - c, h - l), d = d !== 0 ? 32767 / d : 0; + } + return earcutLinked(o, s, n, c, l, d, 0), s; +} +function linkedList(e, t, n, i, r) { + let o; + if (r === signedArea(e, t, n, i) > 0) + for (let s = t; s < n; s += i) o = insertNode(s / i | 0, e[s], e[s + 1], o); + else + for (let s = n - i; s >= t; s -= i) o = insertNode(s / i | 0, e[s], e[s + 1], o); + return o && equals(o, o.next) && (removeNode(o), o = o.next), o; +} +function filterPoints(e, t) { + if (!e) return e; + t || (t = e); + let n = e, i; + do + if (i = !1, !n.steiner && (equals(n, n.next) || area(n.prev, n, n.next) === 0)) { + if (removeNode(n), n = t = n.prev, n === n.next) break; + i = !0; + } else + n = n.next; + while (i || n !== t); + return t; +} +function earcutLinked(e, t, n, i, r, o, s) { + if (!e) return; + !s && o && indexCurve(e, i, r, o); + let c = e; + for (; e.prev !== e.next; ) { + const l = e.prev, d = e.next; + if (o ? isEarHashed(e, i, r, o) : isEar(e)) { + t.push(l.i, e.i, d.i), removeNode(e), e = d.next, c = d.next; + continue; + } + if (e = d, e === c) { + s ? s === 1 ? (e = cureLocalIntersections(filterPoints(e), t), earcutLinked(e, t, n, i, r, o, 2)) : s === 2 && splitEarcut(e, t, n, i, r, o) : earcutLinked(filterPoints(e), t, n, i, r, o, 1); + break; + } + } +} +function isEar(e) { + const t = e.prev, n = e, i = e.next; + if (area(t, n, i) >= 0) return !1; + const r = t.x, o = n.x, s = i.x, c = t.y, l = n.y, d = i.y, f = r < o ? r < s ? r : s : o < s ? o : s, h = c < l ? c < d ? c : d : l < d ? l : d, p = r > o ? r > s ? r : s : o > s ? o : s, m = c > l ? c > d ? c : d : l > d ? l : d; + let _ = i.next; + for (; _ !== t; ) { + if (_.x >= f && _.x <= p && _.y >= h && _.y <= m && pointInTriangle(r, c, o, l, s, d, _.x, _.y) && area(_.prev, _, _.next) >= 0) return !1; + _ = _.next; + } + return !0; +} +function isEarHashed(e, t, n, i) { + const r = e.prev, o = e, s = e.next; + if (area(r, o, s) >= 0) return !1; + const c = r.x, l = o.x, d = s.x, f = r.y, h = o.y, p = s.y, m = c < l ? c < d ? c : d : l < d ? l : d, _ = f < h ? f < p ? f : p : h < p ? h : p, y = c > l ? c > d ? c : d : l > d ? l : d, C = f > h ? f > p ? f : p : h > p ? h : p, T = zOrder(m, _, t, n, i), x = zOrder(y, C, t, n, i); + let b = e.prevZ, S = e.nextZ; + for (; b && b.z >= T && S && S.z <= x; ) { + if (b.x >= m && b.x <= y && b.y >= _ && b.y <= C && b !== r && b !== s && pointInTriangle(c, f, l, h, d, p, b.x, b.y) && area(b.prev, b, b.next) >= 0 || (b = b.prevZ, S.x >= m && S.x <= y && S.y >= _ && S.y <= C && S !== r && S !== s && pointInTriangle(c, f, l, h, d, p, S.x, S.y) && area(S.prev, S, S.next) >= 0)) return !1; + S = S.nextZ; + } + for (; b && b.z >= T; ) { + if (b.x >= m && b.x <= y && b.y >= _ && b.y <= C && b !== r && b !== s && pointInTriangle(c, f, l, h, d, p, b.x, b.y) && area(b.prev, b, b.next) >= 0) return !1; + b = b.prevZ; + } + for (; S && S.z <= x; ) { + if (S.x >= m && S.x <= y && S.y >= _ && S.y <= C && S !== r && S !== s && pointInTriangle(c, f, l, h, d, p, S.x, S.y) && area(S.prev, S, S.next) >= 0) return !1; + S = S.nextZ; + } + return !0; +} +function cureLocalIntersections(e, t) { + let n = e; + do { + const i = n.prev, r = n.next.next; + !equals(i, r) && intersects$1(i, n, n.next, r) && locallyInside(i, r) && locallyInside(r, i) && (t.push(i.i, n.i, r.i), removeNode(n), removeNode(n.next), n = e = r), n = n.next; + } while (n !== e); + return filterPoints(n); +} +function splitEarcut(e, t, n, i, r, o) { + let s = e; + do { + let c = s.next.next; + for (; c !== s.prev; ) { + if (s.i !== c.i && isValidDiagonal(s, c)) { + let l = splitPolygon(s, c); + s = filterPoints(s, s.next), l = filterPoints(l, l.next), earcutLinked(s, t, n, i, r, o, 0), earcutLinked(l, t, n, i, r, o, 0); + return; + } + c = c.next; + } + s = s.next; + } while (s !== e); +} +function eliminateHoles(e, t, n, i) { + const r = []; + for (let o = 0, s = t.length; o < s; o++) { + const c = t[o] * i, l = o < s - 1 ? t[o + 1] * i : e.length, d = linkedList(e, c, l, i, !1); + d === d.next && (d.steiner = !0), r.push(getLeftmost(d)); + } + r.sort(compareX); + for (let o = 0; o < r.length; o++) + n = eliminateHole(r[o], n); + return n; +} +function compareX(e, t) { + return e.x - t.x; +} +function eliminateHole(e, t) { + const n = findHoleBridge(e, t); + if (!n) + return t; + const i = splitPolygon(n, e); + return filterPoints(i, i.next), filterPoints(n, n.next); +} +function findHoleBridge(e, t) { + let n = t; + const i = e.x, r = e.y; + let o = -1 / 0, s; + do { + if (r <= n.y && r >= n.next.y && n.next.y !== n.y) { + const h = n.x + (r - n.y) * (n.next.x - n.x) / (n.next.y - n.y); + if (h <= i && h > o && (o = h, s = n.x < n.next.x ? n : n.next, h === i)) + return s; + } + n = n.next; + } while (n !== t); + if (!s) return null; + const c = s, l = s.x, d = s.y; + let f = 1 / 0; + n = s; + do { + if (i >= n.x && n.x >= l && i !== n.x && pointInTriangle(r < d ? i : o, r, l, d, r < d ? o : i, r, n.x, n.y)) { + const h = Math.abs(r - n.y) / (i - n.x); + locallyInside(n, e) && (h < f || h === f && (n.x > s.x || n.x === s.x && sectorContainsSector(s, n))) && (s = n, f = h); + } + n = n.next; + } while (n !== c); + return s; +} +function sectorContainsSector(e, t) { + return area(e.prev, e, t.prev) < 0 && area(t.next, e, e.next) < 0; +} +function indexCurve(e, t, n, i) { + let r = e; + do + r.z === 0 && (r.z = zOrder(r.x, r.y, t, n, i)), r.prevZ = r.prev, r.nextZ = r.next, r = r.next; + while (r !== e); + r.prevZ.nextZ = null, r.prevZ = null, sortLinked(r); +} +function sortLinked(e) { + let t, n = 1; + do { + let i = e, r; + e = null; + let o = null; + for (t = 0; i; ) { + t++; + let s = i, c = 0; + for (let d = 0; d < n && (c++, s = s.nextZ, !!s); d++) + ; + let l = n; + for (; c > 0 || l > 0 && s; ) + c !== 0 && (l === 0 || !s || i.z <= s.z) ? (r = i, i = i.nextZ, c--) : (r = s, s = s.nextZ, l--), o ? o.nextZ = r : e = r, r.prevZ = o, o = r; + i = s; + } + o.nextZ = null, n *= 2; + } while (t > 1); + return e; +} +function zOrder(e, t, n, i, r) { + return e = (e - n) * r | 0, t = (t - i) * r | 0, e = (e | e << 8) & 16711935, e = (e | e << 4) & 252645135, e = (e | e << 2) & 858993459, e = (e | e << 1) & 1431655765, t = (t | t << 8) & 16711935, t = (t | t << 4) & 252645135, t = (t | t << 2) & 858993459, t = (t | t << 1) & 1431655765, e | t << 1; +} +function getLeftmost(e) { + let t = e, n = e; + do + (t.x < n.x || t.x === n.x && t.y < n.y) && (n = t), t = t.next; + while (t !== e); + return n; +} +function pointInTriangle(e, t, n, i, r, o, s, c) { + return (r - s) * (t - c) >= (e - s) * (o - c) && (e - s) * (i - c) >= (n - s) * (t - c) && (n - s) * (o - c) >= (r - s) * (i - c); +} +function isValidDiagonal(e, t) { + return e.next.i !== t.i && e.prev.i !== t.i && !intersectsPolygon(e, t) && // dones't intersect other edges + (locallyInside(e, t) && locallyInside(t, e) && middleInside(e, t) && // locally visible + (area(e.prev, e, t.prev) || area(e, t.prev, t)) || // does not create opposite-facing sectors + equals(e, t) && area(e.prev, e, e.next) > 0 && area(t.prev, t, t.next) > 0); +} +function area(e, t, n) { + return (t.y - e.y) * (n.x - t.x) - (t.x - e.x) * (n.y - t.y); +} +function equals(e, t) { + return e.x === t.x && e.y === t.y; +} +function intersects$1(e, t, n, i) { + const r = sign(area(e, t, n)), o = sign(area(e, t, i)), s = sign(area(n, i, e)), c = sign(area(n, i, t)); + return !!(r !== o && s !== c || r === 0 && onSegment(e, n, t) || o === 0 && onSegment(e, i, t) || s === 0 && onSegment(n, e, i) || c === 0 && onSegment(n, t, i)); +} +function onSegment(e, t, n) { + return t.x <= Math.max(e.x, n.x) && t.x >= Math.min(e.x, n.x) && t.y <= Math.max(e.y, n.y) && t.y >= Math.min(e.y, n.y); +} +function sign(e) { + return e > 0 ? 1 : e < 0 ? -1 : 0; +} +function intersectsPolygon(e, t) { + let n = e; + do { + if (n.i !== e.i && n.next.i !== e.i && n.i !== t.i && n.next.i !== t.i && intersects$1(n, n.next, e, t)) return !0; + n = n.next; + } while (n !== e); + return !1; +} +function locallyInside(e, t) { + return area(e.prev, e, e.next) < 0 ? area(e, t, e.next) >= 0 && area(e, e.prev, t) >= 0 : area(e, t, e.prev) < 0 || area(e, e.next, t) < 0; +} +function middleInside(e, t) { + let n = e, i = !1; + const r = (e.x + t.x) / 2, o = (e.y + t.y) / 2; + do + n.y > o != n.next.y > o && n.next.y !== n.y && r < (n.next.x - n.x) * (o - n.y) / (n.next.y - n.y) + n.x && (i = !i), n = n.next; + while (n !== e); + return i; +} +function splitPolygon(e, t) { + const n = createNode$1(e.i, e.x, e.y), i = createNode$1(t.i, t.x, t.y), r = e.next, o = t.prev; + return e.next = t, t.prev = e, n.next = r, r.prev = n, i.next = n, n.prev = i, o.next = i, i.prev = o, i; +} +function insertNode(e, t, n, i) { + const r = createNode$1(e, t, n); + return i ? (r.next = i.next, r.prev = i, i.next.prev = r, i.next = r) : (r.prev = r, r.next = r), r; +} +function removeNode(e) { + e.next.prev = e.prev, e.prev.next = e.next, e.prevZ && (e.prevZ.nextZ = e.nextZ), e.nextZ && (e.nextZ.prevZ = e.prevZ); +} +function createNode$1(e, t, n) { + return { + i: e, + // vertex index in coordinates array + x: t, + y: n, + // vertex coordinates + prev: null, + // previous and next vertex nodes in a polygon ring + next: null, + z: 0, + // z-order curve value + prevZ: null, + // previous and next nodes in z-order + nextZ: null, + steiner: !1 + // indicates whether this is a steiner point + }; +} +function signedArea(e, t, n, i) { + let r = 0; + for (let o = t, s = n - i; o < n; o += i) + r += (e[s] - e[o]) * (e[o + 1] + e[s + 1]), s = o; + return r; +} +const scaleToGeodeticHeightN = new Cartesian3(), scaleToGeodeticHeightP = new Cartesian3(), PolygonPipeline = {}; +PolygonPipeline.computeArea2D = function(e) { + const t = e.length; + let n = 0; + for (let i = t - 1, r = 0; r < t; i = r++) { + const o = e[i], s = e[r]; + n += o.x * s.y - s.x * o.y; + } + return n * 0.5; +}; +PolygonPipeline.computeWindingOrder2D = function(e) { + return PolygonPipeline.computeArea2D(e) > 0 ? WindingOrder$1.COUNTER_CLOCKWISE : WindingOrder$1.CLOCKWISE; +}; +PolygonPipeline.triangulate = function(e, t) { + const n = Cartesian2.packArray(e); + return earcut(n, t, 2); +}; +const subdivisionV0Scratch = new Cartesian3(), subdivisionV1Scratch = new Cartesian3(), subdivisionV2Scratch = new Cartesian3(), subdivisionS0Scratch = new Cartesian3(), subdivisionS1Scratch = new Cartesian3(), subdivisionS2Scratch = new Cartesian3(), subdivisionMidScratch = new Cartesian3(), subdivisionT0Scratch = new Cartesian2(), subdivisionT1Scratch = new Cartesian2(), subdivisionT2Scratch = new Cartesian2(), subdivisionTexcoordMidScratch = new Cartesian2(); +PolygonPipeline.computeSubdivision = function(e, t, n, i, r) { + r = defaultValue(r, CesiumMath.RADIANS_PER_DEGREE); + const o = defined(i), s = n.slice(0); + let c; + const l = t.length, d = new Array(l * 3), f = new Array(l * 2); + let h = 0, p = 0; + for (c = 0; c < l; c++) { + const b = t[c]; + if (d[h++] = b.x, d[h++] = b.y, d[h++] = b.z, o) { + const S = i[c]; + f[p++] = S.x, f[p++] = S.y; + } + } + const m = [], _ = {}, y = e.maximumRadius, C = CesiumMath.chordLength(r, y), T = C * C; + for (; s.length > 0; ) { + const b = s.pop(), S = s.pop(), E = s.pop(), A = Cartesian3.fromArray( + d, + E * 3, + subdivisionV0Scratch + ), D = Cartesian3.fromArray( + d, + S * 3, + subdivisionV1Scratch + ), P = Cartesian3.fromArray( + d, + b * 3, + subdivisionV2Scratch + ); + let I, M, R; + o && (I = Cartesian2.fromArray( + f, + E * 2, + subdivisionT0Scratch + ), M = Cartesian2.fromArray( + f, + S * 2, + subdivisionT1Scratch + ), R = Cartesian2.fromArray( + f, + b * 2, + subdivisionT2Scratch + )); + const L = Cartesian3.multiplyByScalar( + Cartesian3.normalize(A, subdivisionS0Scratch), + y, + subdivisionS0Scratch + ), g = Cartesian3.multiplyByScalar( + Cartesian3.normalize(D, subdivisionS1Scratch), + y, + subdivisionS1Scratch + ), w = Cartesian3.multiplyByScalar( + Cartesian3.normalize(P, subdivisionS2Scratch), + y, + subdivisionS2Scratch + ), O = Cartesian3.magnitudeSquared( + Cartesian3.subtract(L, g, subdivisionMidScratch) + ), N = Cartesian3.magnitudeSquared( + Cartesian3.subtract(g, w, subdivisionMidScratch) + ), F = Cartesian3.magnitudeSquared( + Cartesian3.subtract(w, L, subdivisionMidScratch) + ), B = Math.max(O, N, F); + let V, U, k; + B > T ? O === B ? (V = `${Math.min(E, S)} ${Math.max(E, S)}`, c = _[V], defined(c) || (U = Cartesian3.add(A, D, subdivisionMidScratch), Cartesian3.multiplyByScalar(U, 0.5, U), d.push(U.x, U.y, U.z), c = d.length / 3 - 1, _[V] = c, o && (k = Cartesian2.add(I, M, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(k, 0.5, k), f.push(k.x, k.y))), s.push(E, c, b), s.push(c, S, b)) : N === B ? (V = `${Math.min(S, b)} ${Math.max(S, b)}`, c = _[V], defined(c) || (U = Cartesian3.add(D, P, subdivisionMidScratch), Cartesian3.multiplyByScalar(U, 0.5, U), d.push(U.x, U.y, U.z), c = d.length / 3 - 1, _[V] = c, o && (k = Cartesian2.add(M, R, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(k, 0.5, k), f.push(k.x, k.y))), s.push(S, c, E), s.push(c, b, E)) : F === B && (V = `${Math.min(b, E)} ${Math.max(b, E)}`, c = _[V], defined(c) || (U = Cartesian3.add(P, A, subdivisionMidScratch), Cartesian3.multiplyByScalar(U, 0.5, U), d.push(U.x, U.y, U.z), c = d.length / 3 - 1, _[V] = c, o && (k = Cartesian2.add(R, I, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(k, 0.5, k), f.push(k.x, k.y))), s.push(b, c, S), s.push(c, E, S)) : (m.push(E), m.push(S), m.push(b)); + } + const x = { + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: d + }) + }, + indices: m, + primitiveType: PrimitiveType$1.TRIANGLES + }; + return o && (x.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: f + })), new Geometry(x); +}; +const subdivisionC0Scratch = new Cartographic(), subdivisionC1Scratch = new Cartographic(), subdivisionC2Scratch = new Cartographic(), subdivisionCartographicScratch = new Cartographic(); +PolygonPipeline.computeRhumbLineSubdivision = function(e, t, n, i, r) { + r = defaultValue(r, CesiumMath.RADIANS_PER_DEGREE); + const o = defined(i), s = n.slice(0); + let c; + const l = t.length, d = new Array(l * 3), f = new Array(l * 2); + let h = 0, p = 0; + for (c = 0; c < l; c++) { + const E = t[c]; + if (d[h++] = E.x, d[h++] = E.y, d[h++] = E.z, o) { + const A = i[c]; + f[p++] = A.x, f[p++] = A.y; + } + } + const m = [], _ = {}, y = e.maximumRadius, C = CesiumMath.chordLength(r, y), T = new EllipsoidRhumbLine(void 0, void 0, e), x = new EllipsoidRhumbLine(void 0, void 0, e), b = new EllipsoidRhumbLine(void 0, void 0, e); + for (; s.length > 0; ) { + const E = s.pop(), A = s.pop(), D = s.pop(), P = Cartesian3.fromArray( + d, + D * 3, + subdivisionV0Scratch + ), I = Cartesian3.fromArray( + d, + A * 3, + subdivisionV1Scratch + ), M = Cartesian3.fromArray( + d, + E * 3, + subdivisionV2Scratch + ); + let R, L, g; + o && (R = Cartesian2.fromArray( + f, + D * 2, + subdivisionT0Scratch + ), L = Cartesian2.fromArray( + f, + A * 2, + subdivisionT1Scratch + ), g = Cartesian2.fromArray( + f, + E * 2, + subdivisionT2Scratch + )); + const w = e.cartesianToCartographic(P, subdivisionC0Scratch), O = e.cartesianToCartographic(I, subdivisionC1Scratch), N = e.cartesianToCartographic(M, subdivisionC2Scratch); + T.setEndPoints(w, O); + const F = T.surfaceDistance; + x.setEndPoints(O, N); + const B = x.surfaceDistance; + b.setEndPoints(N, w); + const V = b.surfaceDistance, U = Math.max(F, B, V); + let k, $, G, q, z; + U > C ? F === U ? (k = `${Math.min(D, A)} ${Math.max(D, A)}`, c = _[k], defined(c) || ($ = T.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ), G = (w.height + O.height) * 0.5, q = Cartesian3.fromRadians( + $.longitude, + $.latitude, + G, + e, + subdivisionMidScratch + ), d.push( + q.x, + q.y, + q.z + ), c = d.length / 3 - 1, _[k] = c, o && (z = Cartesian2.add(R, L, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(z, 0.5, z), f.push(z.x, z.y))), s.push(D, c, E), s.push(c, A, E)) : B === U ? (k = `${Math.min(A, E)} ${Math.max(A, E)}`, c = _[k], defined(c) || ($ = x.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ), G = (O.height + N.height) * 0.5, q = Cartesian3.fromRadians( + $.longitude, + $.latitude, + G, + e, + subdivisionMidScratch + ), d.push( + q.x, + q.y, + q.z + ), c = d.length / 3 - 1, _[k] = c, o && (z = Cartesian2.add(L, g, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(z, 0.5, z), f.push(z.x, z.y))), s.push(A, c, D), s.push(c, E, D)) : V === U && (k = `${Math.min(E, D)} ${Math.max(E, D)}`, c = _[k], defined(c) || ($ = b.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ), G = (N.height + w.height) * 0.5, q = Cartesian3.fromRadians( + $.longitude, + $.latitude, + G, + e, + subdivisionMidScratch + ), d.push( + q.x, + q.y, + q.z + ), c = d.length / 3 - 1, _[k] = c, o && (z = Cartesian2.add(g, R, subdivisionTexcoordMidScratch), Cartesian2.multiplyByScalar(z, 0.5, z), f.push(z.x, z.y))), s.push(E, c, A), s.push(c, D, A)) : (m.push(D), m.push(A), m.push(E)); + } + const S = { + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: d + }) + }, + indices: m, + primitiveType: PrimitiveType$1.TRIANGLES + }; + return o && (S.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: f + })), new Geometry(S); +}; +PolygonPipeline.scaleToGeodeticHeight = function(e, t, n, i) { + n = defaultValue(n, Ellipsoid.default); + let r = scaleToGeodeticHeightN, o = scaleToGeodeticHeightP; + if (t = defaultValue(t, 0), i = defaultValue(i, !0), defined(e)) { + const s = e.length; + for (let c = 0; c < s; c += 3) + Cartesian3.fromArray(e, c, o), i && (o = n.scaleToGeodeticSurface(o, o)), t !== 0 && (r = n.geodeticSurfaceNormal(o, r), Cartesian3.multiplyByScalar(r, t, r), Cartesian3.add(o, r, o)), e[c] = o.x, e[c + 1] = o.y, e[c + 2] = o.z; + } + return e; +}; +function Queue() { + this._array = [], this._offset = 0, this._length = 0; +} +Object.defineProperties(Queue.prototype, { + /** + * The length of the queue. + * + * @memberof Queue.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + } +}); +Queue.prototype.enqueue = function(e) { + this._array.push(e), this._length++; +}; +Queue.prototype.dequeue = function() { + if (this._length === 0) + return; + const e = this._array; + let t = this._offset; + const n = e[t]; + return e[t] = void 0, t++, t > 10 && t * 2 > e.length && (this._array = e.slice(t), t = 0), this._offset = t, this._length--, n; +}; +Queue.prototype.peek = function() { + if (this._length !== 0) + return this._array[this._offset]; +}; +Queue.prototype.contains = function(e) { + return this._array.indexOf(e) !== -1; +}; +Queue.prototype.clear = function() { + this._array.length = this._offset = this._length = 0; +}; +Queue.prototype.sort = function(e) { + this._offset > 0 && (this._array = this._array.slice(this._offset), this._offset = 0), this._array.sort(e); +}; +const PolygonGeometryLibrary = {}; +PolygonGeometryLibrary.computeHierarchyPackedLength = function(e, t) { + let n = 0; + const i = [e]; + for (; i.length > 0; ) { + const r = i.pop(); + if (!defined(r)) + continue; + n += 2; + const o = r.positions, s = r.holes; + if (defined(o) && o.length > 0 && (n += o.length * t.packedLength), defined(s)) { + const c = s.length; + for (let l = 0; l < c; ++l) + i.push(s[l]); + } + } + return n; +}; +PolygonGeometryLibrary.packPolygonHierarchy = function(e, t, n, i) { + const r = [e]; + for (; r.length > 0; ) { + const o = r.pop(); + if (!defined(o)) + continue; + const s = o.positions, c = o.holes; + if (t[n++] = defined(s) ? s.length : 0, t[n++] = defined(c) ? c.length : 0, defined(s)) { + const l = s.length; + for (let d = 0; d < l; ++d, n += i.packedLength) + i.pack(s[d], t, n); + } + if (defined(c)) { + const l = c.length; + for (let d = 0; d < l; ++d) + r.push(c[d]); + } + } + return n; +}; +PolygonGeometryLibrary.unpackPolygonHierarchy = function(e, t, n) { + const i = e[t++], r = e[t++], o = new Array(i), s = r > 0 ? new Array(r) : void 0; + for (let c = 0; c < i; ++c, t += n.packedLength) + o[c] = n.unpack(e, t); + for (let c = 0; c < r; ++c) + s[c] = PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + n + ), t = s[c].startingIndex, delete s[c].startingIndex; + return { + positions: o, + holes: s, + startingIndex: t + }; +}; +const distance2DScratch = new Cartesian2(); +function getPointAtDistance2D(e, t, n, i) { + return Cartesian2.subtract(t, e, distance2DScratch), Cartesian2.multiplyByScalar( + distance2DScratch, + n / i, + distance2DScratch + ), Cartesian2.add(e, distance2DScratch, distance2DScratch), [distance2DScratch.x, distance2DScratch.y]; +} +const distanceScratch = new Cartesian3(); +function getPointAtDistance(e, t, n, i) { + return Cartesian3.subtract(t, e, distanceScratch), Cartesian3.multiplyByScalar( + distanceScratch, + n / i, + distanceScratch + ), Cartesian3.add(e, distanceScratch, distanceScratch), [distanceScratch.x, distanceScratch.y, distanceScratch.z]; +} +PolygonGeometryLibrary.subdivideLineCount = function(e, t, n) { + const r = Cartesian3.distance(e, t) / n, o = Math.max(0, Math.ceil(CesiumMath.log2(r))); + return Math.pow(2, o); +}; +const scratchCartographic0$1 = new Cartographic(), scratchCartographic1$2 = new Cartographic(), scratchCartographic2$1 = new Cartographic(), scratchCartesian0$1 = new Cartesian3(), scratchRhumbLine = new EllipsoidRhumbLine(); +PolygonGeometryLibrary.subdivideRhumbLineCount = function(e, t, n, i) { + const r = e.cartesianToCartographic(t, scratchCartographic0$1), o = e.cartesianToCartographic(n, scratchCartographic1$2), c = new EllipsoidRhumbLine(r, o, e).surfaceDistance / i, l = Math.max(0, Math.ceil(CesiumMath.log2(c))); + return Math.pow(2, l); +}; +PolygonGeometryLibrary.subdivideTexcoordLine = function(e, t, n, i, r, o) { + const s = PolygonGeometryLibrary.subdivideLineCount( + n, + i, + r + ), c = Cartesian2.distance(e, t), l = c / s, d = o; + d.length = s * 2; + let f = 0; + for (let h = 0; h < s; h++) { + const p = getPointAtDistance2D(e, t, h * l, c); + d[f++] = p[0], d[f++] = p[1]; + } + return d; +}; +PolygonGeometryLibrary.subdivideLine = function(e, t, n, i) { + const r = PolygonGeometryLibrary.subdivideLineCount( + e, + t, + n + ), o = Cartesian3.distance(e, t), s = o / r; + defined(i) || (i = []); + const c = i; + c.length = r * 3; + let l = 0; + for (let d = 0; d < r; d++) { + const f = getPointAtDistance(e, t, d * s, o); + c[l++] = f[0], c[l++] = f[1], c[l++] = f[2]; + } + return c; +}; +PolygonGeometryLibrary.subdivideTexcoordRhumbLine = function(e, t, n, i, r, o, s) { + const c = n.cartesianToCartographic(i, scratchCartographic0$1), l = n.cartesianToCartographic(r, scratchCartographic1$2); + scratchRhumbLine.setEndPoints(c, l); + const d = scratchRhumbLine.surfaceDistance / o, f = Math.max(0, Math.ceil(CesiumMath.log2(d))), h = Math.pow(2, f), p = Cartesian2.distance(e, t), m = p / h, _ = s; + _.length = h * 2; + let y = 0; + for (let C = 0; C < h; C++) { + const T = getPointAtDistance2D(e, t, C * m, p); + _[y++] = T[0], _[y++] = T[1]; + } + return _; +}; +PolygonGeometryLibrary.subdivideRhumbLine = function(e, t, n, i, r) { + const o = e.cartesianToCartographic(t, scratchCartographic0$1), s = e.cartesianToCartographic(n, scratchCartographic1$2), c = new EllipsoidRhumbLine(o, s, e), l = c.surfaceDistance / i, d = Math.max(0, Math.ceil(CesiumMath.log2(l))), f = Math.pow(2, d), h = c.surfaceDistance / f; + defined(r) || (r = []); + const p = r; + p.length = f * 3; + let m = 0; + for (let _ = 0; _ < f; _++) { + const y = c.interpolateUsingSurfaceDistance( + _ * h, + scratchCartographic2$1 + ), C = e.cartographicToCartesian(y, scratchCartesian0$1); + p[m++] = C.x, p[m++] = C.y, p[m++] = C.z; + } + return p; +}; +const scaleToGeodeticHeightN1 = new Cartesian3(), scaleToGeodeticHeightN2 = new Cartesian3(), scaleToGeodeticHeightP1 = new Cartesian3(), scaleToGeodeticHeightP2 = new Cartesian3(); +PolygonGeometryLibrary.scaleToGeodeticHeightExtruded = function(e, t, n, i, r) { + i = defaultValue(i, Ellipsoid.default); + const o = scaleToGeodeticHeightN1; + let s = scaleToGeodeticHeightN2; + const c = scaleToGeodeticHeightP1; + let l = scaleToGeodeticHeightP2; + if (defined(e) && defined(e.attributes) && defined(e.attributes.position)) { + const d = e.attributes.position.values, f = d.length / 2; + for (let h = 0; h < f; h += 3) + Cartesian3.fromArray(d, h, c), i.geodeticSurfaceNormal(c, o), l = i.scaleToGeodeticSurface(c, l), s = Cartesian3.multiplyByScalar(o, n, s), s = Cartesian3.add(l, s, s), d[h + f] = s.x, d[h + 1 + f] = s.y, d[h + 2 + f] = s.z, r && (l = Cartesian3.clone(c, l)), s = Cartesian3.multiplyByScalar(o, t, s), s = Cartesian3.add(l, s, s), d[h] = s.x, d[h + 1] = s.y, d[h + 2] = s.z; + } + return e; +}; +PolygonGeometryLibrary.polygonOutlinesFromHierarchy = function(e, t, n) { + const i = [], r = new Queue(); + r.enqueue(e); + let o, s, c; + for (; r.length !== 0; ) { + const l = r.dequeue(); + let d = l.positions; + if (t) + for (c = d.length, o = 0; o < c; o++) + n.scaleToGeodeticSurface(d[o], d[o]); + if (d = arrayRemoveDuplicates( + d, + Cartesian3.equalsEpsilon, + !0 + ), d.length < 3) + continue; + const f = l.holes ? l.holes.length : 0; + for (o = 0; o < f; o++) { + const h = l.holes[o]; + let p = h.positions; + if (t) + for (c = p.length, s = 0; s < c; ++s) + n.scaleToGeodeticSurface(p[s], p[s]); + if (p = arrayRemoveDuplicates( + p, + Cartesian3.equalsEpsilon, + !0 + ), p.length < 3) + continue; + i.push(p); + let m = 0; + for (defined(h.holes) && (m = h.holes.length), s = 0; s < m; s++) + r.enqueue(h.holes[s]); + } + i.push(d); + } + return i; +}; +const scratchRhumbIntersection = new Cartographic(); +function computeEquatorIntersectionRhumb(e, t, n) { + const i = n.cartesianToCartographic(e, scratchCartographic0$1), r = n.cartesianToCartographic(t, scratchCartographic1$2); + if (Math.sign(i.latitude) === Math.sign(r.latitude)) + return; + scratchRhumbLine.setEndPoints(i, r); + const o = scratchRhumbLine.findIntersectionWithLatitude( + 0, + scratchRhumbIntersection + ); + if (!defined(o)) + return; + let s = Math.min(i.longitude, r.longitude), c = Math.max(i.longitude, r.longitude); + if (Math.abs(c - s) > CesiumMath.PI) { + const l = s; + s = c, c = l; + } + if (!(o.longitude < s || o.longitude > c)) + return n.cartographicToCartesian(o); +} +function computeEquatorIntersection(e, t, n, i) { + if (i === ArcType$1.RHUMB) + return computeEquatorIntersectionRhumb(e, t, n); + const r = IntersectionTests.lineSegmentPlane( + e, + t, + Plane.ORIGIN_XY_PLANE + ); + if (defined(r)) + return n.scaleToGeodeticSurface(r, r); +} +const scratchCartographic$i = new Cartographic(); +function computeEdgesOnPlane(e, t, n) { + const i = []; + let r, o, s, c, l, d = 0; + for (; d < e.length; ) { + r = e[d], o = e[(d + 1) % e.length], s = CesiumMath.sign(r.z), c = CesiumMath.sign(o.z); + const f = (h) => t.cartesianToCartographic( + h, + scratchCartographic$i + ).longitude; + if (s === 0) + i.push({ + position: d, + type: s, + visited: !1, + next: c, + theta: f(r) + }); + else if (c !== 0) { + if (l = computeEquatorIntersection( + r, + o, + t, + n + ), ++d, !defined(l)) + continue; + e.splice(d, 0, l), i.push({ + position: d, + type: s, + visited: !1, + next: c, + theta: f(l) + }); + } + ++d; + } + return i; +} +function wirePolygon(e, t, n, i, r, o, s) { + const c = []; + let l = o; + const d = (h) => (p) => p.position === h, f = []; + do { + const h = n[l]; + c.push(h); + const p = i.findIndex(d(l)), m = i[p]; + if (!defined(m)) { + ++l; + continue; + } + const { visited: _, type: y, next: C } = m; + if (m.visited = !0, y === 0) { + if (C === 0) { + const S = i[p - (s ? 1 : -1)]; + if ((S == null ? void 0 : S.position) === l + 1) + S.visited = !0; + else { + ++l; + continue; + } + } + if (!_ && s && C > 0 || o === l && !s && C < 0) { + ++l; + continue; + } + } + if (!(s ? y >= 0 : y <= 0)) { + ++l; + continue; + } + _ || f.push(l); + const x = p + (s ? 1 : -1), b = i[x]; + if (!defined(b)) { + ++l; + continue; + } + l = b.position; + } while (l < n.length && l >= 0 && l !== o && c.length < n.length); + e.splice(t, r, c); + for (const h of f) + t = wirePolygon( + e, + ++t, + n, + i, + 0, + h, + !s + ); + return t; +} +PolygonGeometryLibrary.splitPolygonsOnEquator = function(e, t, n, i) { + defined(i) || (i = []), i.splice(0, 0, ...e), i.length = e.length; + let r = 0; + for (; r < i.length; ) { + const o = i[r], s = o.slice(); + if (o.length < 3) { + i[r] = s, ++r; + continue; + } + const c = computeEdgesOnPlane(s, t, n); + if (s.length === o.length || c.length <= 1) { + i[r] = s, ++r; + continue; + } + c.sort((d, f) => d.theta - f.theta); + const l = s[0].z >= 0; + r = wirePolygon( + i, + r, + s, + c, + 1, + 0, + l + ); + } + return i; +}; +PolygonGeometryLibrary.polygonsFromHierarchy = function(e, t, n, i, r, o) { + const s = [], c = [], l = new Queue(); + l.enqueue(e); + let d = defined(o); + for (; l.length !== 0; ) { + const f = l.dequeue(); + let h = f.positions; + const p = f.holes; + let m, _; + if (i) + for (_ = h.length, m = 0; m < _; m++) + r.scaleToGeodeticSurface(h[m], h[m]); + if (t || (h = arrayRemoveDuplicates( + h, + Cartesian3.equalsEpsilon, + !0 + )), h.length < 3) + continue; + let y = n(h); + if (!defined(y)) + continue; + const C = []; + let T = PolygonPipeline.computeWindingOrder2D( + y + ); + if (T === WindingOrder$1.CLOCKWISE && (y.reverse(), h = h.slice().reverse()), d) { + d = !1; + let A = [h]; + if (A = o(A, A), A.length > 1) { + for (const D of A) + l.enqueue(new PolygonHierarchy(D, p)); + continue; + } + } + let x = h.slice(); + const b = defined(p) ? p.length : 0, S = []; + let E; + for (m = 0; m < b; m++) { + const A = p[m]; + let D = A.positions; + if (i) + for (_ = D.length, E = 0; E < _; ++E) + r.scaleToGeodeticSurface(D[E], D[E]); + if (t || (D = arrayRemoveDuplicates( + D, + Cartesian3.equalsEpsilon, + !0 + )), D.length < 3) + continue; + const P = n(D); + if (!defined(P)) + continue; + T = PolygonPipeline.computeWindingOrder2D( + P + ), T === WindingOrder$1.CLOCKWISE && (P.reverse(), D = D.slice().reverse()), S.push(D), C.push(x.length), x = x.concat(D), y = y.concat(P); + let I = 0; + for (defined(A.holes) && (I = A.holes.length), E = 0; E < I; E++) + l.enqueue(A.holes[E]); + } + s.push({ + outerRing: h, + holes: S + }), c.push({ + positions: x, + positions2D: y, + holes: C + }); + } + return { + hierarchy: s, + polygons: c + }; +}; +const computeBoundingRectangleCartesian2 = new Cartesian2(), computeBoundingRectangleCartesian3 = new Cartesian3(), computeBoundingRectangleQuaternion = new Quaternion(), computeBoundingRectangleMatrix3 = new Matrix3(); +PolygonGeometryLibrary.computeBoundingRectangle = function(e, t, n, i, r) { + const o = Quaternion.fromAxisAngle( + e, + i, + computeBoundingRectangleQuaternion + ), s = Matrix3.fromQuaternion( + o, + computeBoundingRectangleMatrix3 + ); + let c = Number.POSITIVE_INFINITY, l = Number.NEGATIVE_INFINITY, d = Number.POSITIVE_INFINITY, f = Number.NEGATIVE_INFINITY; + const h = n.length; + for (let p = 0; p < h; ++p) { + const m = Cartesian3.clone( + n[p], + computeBoundingRectangleCartesian3 + ); + Matrix3.multiplyByVector(s, m, m); + const _ = t(m, computeBoundingRectangleCartesian2); + defined(_) && (c = Math.min(c, _.x), l = Math.max(l, _.x), d = Math.min(d, _.y), f = Math.max(f, _.y)); + } + return r.x = c, r.y = d, r.width = l - c, r.height = f - d, r; +}; +PolygonGeometryLibrary.createGeometryFromPositions = function(e, t, n, i, r, o, s) { + let c = PolygonPipeline.triangulate(t.positions2D, t.holes); + c.length < 3 && (c = [0, 1, 2]); + const l = t.positions, d = defined(n), f = d ? n.positions : void 0; + if (r) { + const h = l.length, p = new Array(h * 3); + let m = 0; + for (let C = 0; C < h; C++) { + const T = l[C]; + p[m++] = T.x, p[m++] = T.y, p[m++] = T.z; + } + const _ = { + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: p + }) + }, + indices: c, + primitiveType: PrimitiveType$1.TRIANGLES + }; + d && (_.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: Cartesian2.packArray(f) + })); + const y = new Geometry(_); + return o.normal ? GeometryPipeline.computeNormal(y) : y; + } + if (s === ArcType$1.GEODESIC) + return PolygonPipeline.computeSubdivision( + e, + l, + c, + f, + i + ); + if (s === ArcType$1.RHUMB) + return PolygonPipeline.computeRhumbLineSubdivision( + e, + l, + c, + f, + i + ); +}; +const computeWallTexcoordsSubdivided = [], computeWallIndicesSubdivided = [], p1Scratch$1 = new Cartesian3(), p2Scratch$1 = new Cartesian3(); +PolygonGeometryLibrary.computeWallGeometry = function(e, t, n, i, r, o) { + let s, c, l, d, f, h, p, m, _, y = e.length, C = 0, T = 0; + const x = defined(t), b = x ? t.positions : void 0; + if (r) + for (c = y * 3 * 2, s = new Array(c * 2), x && (_ = y * 2 * 2, m = new Array(_ * 2)), l = 0; l < y; l++) + d = e[l], f = e[(l + 1) % y], s[C] = s[C + c] = d.x, ++C, s[C] = s[C + c] = d.y, ++C, s[C] = s[C + c] = d.z, ++C, s[C] = s[C + c] = f.x, ++C, s[C] = s[C + c] = f.y, ++C, s[C] = s[C + c] = f.z, ++C, x && (h = b[l], p = b[(l + 1) % y], m[T] = m[T + _] = h.x, ++T, m[T] = m[T + _] = h.y, ++T, m[T] = m[T + _] = p.x, ++T, m[T] = m[T + _] = p.y, ++T); + else { + const P = CesiumMath.chordLength( + i, + n.maximumRadius + ); + let I = 0; + if (o === ArcType$1.GEODESIC) + for (l = 0; l < y; l++) + I += PolygonGeometryLibrary.subdivideLineCount( + e[l], + e[(l + 1) % y], + P + ); + else if (o === ArcType$1.RHUMB) + for (l = 0; l < y; l++) + I += PolygonGeometryLibrary.subdivideRhumbLineCount( + n, + e[l], + e[(l + 1) % y], + P + ); + for (c = (I + y) * 3, s = new Array(c * 2), x && (_ = (I + y) * 2, m = new Array(_ * 2)), l = 0; l < y; l++) { + d = e[l], f = e[(l + 1) % y]; + let M, R; + x && (h = b[l], p = b[(l + 1) % y]), o === ArcType$1.GEODESIC ? (M = PolygonGeometryLibrary.subdivideLine( + d, + f, + P, + computeWallIndicesSubdivided + ), x && (R = PolygonGeometryLibrary.subdivideTexcoordLine( + h, + p, + d, + f, + P, + computeWallTexcoordsSubdivided + ))) : o === ArcType$1.RHUMB && (M = PolygonGeometryLibrary.subdivideRhumbLine( + n, + d, + f, + P, + computeWallIndicesSubdivided + ), x && (R = PolygonGeometryLibrary.subdivideTexcoordRhumbLine( + h, + p, + n, + d, + f, + P, + computeWallTexcoordsSubdivided + ))); + const L = M.length; + for (let g = 0; g < L; ++g, ++C) + s[C] = M[g], s[C + c] = M[g]; + if (s[C] = f.x, s[C + c] = f.x, ++C, s[C] = f.y, s[C + c] = f.y, ++C, s[C] = f.z, s[C + c] = f.z, ++C, x) { + const g = R.length; + for (let w = 0; w < g; ++w, ++T) + m[T] = R[w], m[T + _] = R[w]; + m[T] = p.x, m[T + _] = p.x, ++T, m[T] = p.y, m[T + _] = p.y, ++T; + } + } + } + y = s.length; + const S = IndexDatatype$1.createTypedArray( + y / 3, + y - e.length * 6 + ); + let E = 0; + for (y /= 6, l = 0; l < y; l++) { + const P = l, I = P + 1, M = P + y, R = M + 1; + d = Cartesian3.fromArray(s, P * 3, p1Scratch$1), f = Cartesian3.fromArray(s, I * 3, p2Scratch$1), !Cartesian3.equalsEpsilon( + d, + f, + CesiumMath.EPSILON10, + CesiumMath.EPSILON10 + ) && (S[E++] = P, S[E++] = M, S[E++] = I, S[E++] = I, S[E++] = M, S[E++] = R); + } + const A = { + attributes: new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: s + }) + }), + indices: S, + primitiveType: PrimitiveType$1.TRIANGLES + }; + return x && (A.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: m + })), new Geometry(A); +}; +function Stereographic(e, t) { + this.position = e, defined(this.position) || (this.position = new Cartesian2()), this.tangentPlane = t, defined(this.tangentPlane) || (this.tangentPlane = Stereographic.NORTH_POLE_TANGENT_PLANE); +} +Object.defineProperties(Stereographic.prototype, { + /** + * Gets the ellipsoid. + * @memberof Stereographic.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this.tangentPlane.ellipsoid; + } + }, + /** + * Gets the x coordinate + * @memberof Stereographic.prototype + * @type {number} + */ + x: { + get: function() { + return this.position.x; + } + }, + /** + * Gets the y coordinate + * @memberof Stereographic.prototype + * @type {number} + */ + y: { + get: function() { + return this.position.y; + } + }, + /** + * Computes the conformal latitude, or the ellipsoidal latitude projected onto an arbitrary sphere. + * @memberof Stereographic.prototype + * @type {number} + */ + conformalLatitude: { + get: function() { + const e = Cartesian2.magnitude(this.position), t = 2 * this.ellipsoid.maximumRadius; + return this.tangentPlane.plane.normal.z * (CesiumMath.PI_OVER_TWO - 2 * Math.atan2(e, t)); + } + }, + /** + * Computes the longitude + * @memberof Stereographic.prototype + * @type {number} + */ + longitude: { + get: function() { + let e = CesiumMath.PI_OVER_TWO + Math.atan2(this.y, this.x); + return e > Math.PI && (e -= CesiumMath.TWO_PI), e; + } + } +}); +const scratchCartographic$h = new Cartographic(), scratchCartesian$a = new Cartesian3(); +Stereographic.prototype.getLatitude = function(e) { + defined(e) || (e = Ellipsoid.default), scratchCartographic$h.latitude = this.conformalLatitude, scratchCartographic$h.longitude = this.longitude, scratchCartographic$h.height = 0; + const t = this.ellipsoid.cartographicToCartesian( + scratchCartographic$h, + scratchCartesian$a + ); + return e.cartesianToCartographic(t, scratchCartographic$h), scratchCartographic$h.latitude; +}; +const scratchProjectPointOntoPlaneRay = new Ray(), scratchProjectPointOntoPlaneRayDirection = new Cartesian3(), scratchProjectPointOntoPlaneCartesian3 = new Cartesian3(); +Stereographic.fromCartesian = function(e, t) { + const n = CesiumMath.signNotZero(e.z); + let i = Stereographic.NORTH_POLE_TANGENT_PLANE, r = Stereographic.SOUTH_POLE; + n < 0 && (i = Stereographic.SOUTH_POLE_TANGENT_PLANE, r = Stereographic.NORTH_POLE); + const o = scratchProjectPointOntoPlaneRay; + o.origin = i.ellipsoid.scaleToGeocentricSurface( + e, + o.origin + ), o.direction = Cartesian3.subtract( + o.origin, + r, + scratchProjectPointOntoPlaneRayDirection + ), Cartesian3.normalize(o.direction, o.direction); + const s = IntersectionTests.rayPlane( + o, + i.plane, + scratchProjectPointOntoPlaneCartesian3 + ), c = Cartesian3.subtract(s, r, s), l = Cartesian3.dot(i.xAxis, c), d = n * Cartesian3.dot(i.yAxis, c); + return defined(t) ? (t.position = new Cartesian2(l, d), t.tangentPlane = i, t) : new Stereographic(new Cartesian2(l, d), i); +}; +Stereographic.fromCartesianArray = function(e, t) { + const n = e.length; + defined(t) ? t.length = n : t = new Array(n); + for (let i = 0; i < n; i++) + t[i] = Stereographic.fromCartesian(e[i], t[i]); + return t; +}; +Stereographic.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.position = e.position, t.tangentPlane = e.tangentPlane, t) : new Stereographic( + e.position, + e.tangentPlane + ); +}; +Stereographic.HALF_UNIT_SPHERE = Object.freeze(new Ellipsoid(0.5, 0.5, 0.5)); +Stereographic.NORTH_POLE = Object.freeze(new Cartesian3(0, 0, 0.5)); +Stereographic.SOUTH_POLE = Object.freeze(new Cartesian3(0, 0, -0.5)); +Stereographic.NORTH_POLE_TANGENT_PLANE = Object.freeze( + new EllipsoidTangentPlane( + Stereographic.NORTH_POLE, + Stereographic.HALF_UNIT_SPHERE + ) +); +Stereographic.SOUTH_POLE_TANGENT_PLANE = Object.freeze( + new EllipsoidTangentPlane( + Stereographic.SOUTH_POLE, + Stereographic.HALF_UNIT_SPHERE + ) +); +const scratchCarto1 = new Cartographic(), scratchCarto2 = new Cartographic(); +function adjustPosHeightsForNormal(e, t, n, i) { + const o = i.cartesianToCartographic(e, scratchCarto1).height, s = i.cartesianToCartographic(t, scratchCarto2); + s.height = o, i.cartographicToCartesian(s, t); + const c = i.cartesianToCartographic(n, scratchCarto2); + c.height = o - 100, i.cartographicToCartesian(c, n); +} +const scratchBoundingRectangle = new BoundingRectangle(), scratchPosition$d = new Cartesian3(), scratchNormal$7 = new Cartesian3(), scratchTangent$4 = new Cartesian3(), scratchBitangent$4 = new Cartesian3(), p1Scratch = new Cartesian3(), p2Scratch = new Cartesian3(); +let scratchPerPosNormal = new Cartesian3(), scratchPerPosTangent = new Cartesian3(), scratchPerPosBitangent = new Cartesian3(); +const appendTextureCoordinatesOrigin = new Cartesian2(), appendTextureCoordinatesCartesian2 = new Cartesian2(), appendTextureCoordinatesCartesian3 = new Cartesian3(), appendTextureCoordinatesQuaternion = new Quaternion(), appendTextureCoordinatesMatrix3 = new Matrix3(), tangentMatrixScratch$1 = new Matrix3(); +function computeAttributes$2(e) { + const t = e.vertexFormat, n = e.geometry, i = e.shadowVolume, r = n.attributes.position.values, o = defined(n.attributes.st) ? n.attributes.st.values : void 0; + let s = r.length; + const c = e.wall, l = e.top || c, d = e.bottom || c; + if (t.st || t.normal || t.tangent || t.bitangent || i) { + const f = e.boundingRectangle, h = e.rotationAxis, p = e.projectTo2d, m = e.ellipsoid, _ = e.stRotation, y = e.perPositionHeight, C = appendTextureCoordinatesOrigin; + C.x = f.x, C.y = f.y; + const T = t.st ? new Float32Array(2 * (s / 3)) : void 0; + let x; + t.normal && (y && l && !c ? x = n.attributes.normal.values : x = new Float32Array(s)); + const b = t.tangent ? new Float32Array(s) : void 0, S = t.bitangent ? new Float32Array(s) : void 0, E = i ? new Float32Array(s) : void 0; + let A = 0, D = 0, P = scratchNormal$7, I = scratchTangent$4, M = scratchBitangent$4, R = !0, L = appendTextureCoordinatesMatrix3, g = tangentMatrixScratch$1; + if (_ !== 0) { + let N = Quaternion.fromAxisAngle( + h, + _, + appendTextureCoordinatesQuaternion + ); + L = Matrix3.fromQuaternion(N, L), N = Quaternion.fromAxisAngle( + h, + -_, + appendTextureCoordinatesQuaternion + ), g = Matrix3.fromQuaternion( + N, + g + ); + } else + L = Matrix3.clone(Matrix3.IDENTITY, L), g = Matrix3.clone( + Matrix3.IDENTITY, + g + ); + let w = 0, O = 0; + l && d && (w = s / 2, O = s / 3, s /= 2); + for (let N = 0; N < s; N += 3) { + const F = Cartesian3.fromArray( + r, + N, + appendTextureCoordinatesCartesian3 + ); + if (t.st && !defined(o)) { + let B = Matrix3.multiplyByVector( + L, + F, + scratchPosition$d + ); + B = m.scaleToGeodeticSurface(B, B); + const V = p([B], appendTextureCoordinatesCartesian2)[0]; + Cartesian2.subtract(V, C, V); + const U = CesiumMath.clamp(V.x / f.width, 0, 1), k = CesiumMath.clamp(V.y / f.height, 0, 1); + d && (T[A + O] = U, T[A + 1 + O] = k), l && (T[A] = U, T[A + 1] = k), A += 2; + } + if (t.normal || t.tangent || t.bitangent || i) { + const B = D + 1, V = D + 2; + if (c) { + if (N + 3 < s) { + const U = Cartesian3.fromArray(r, N + 3, p1Scratch); + if (R) { + const k = Cartesian3.fromArray( + r, + N + s, + p2Scratch + ); + y && adjustPosHeightsForNormal(F, U, k, m), Cartesian3.subtract(U, F, U), Cartesian3.subtract(k, F, k), P = Cartesian3.normalize( + Cartesian3.cross(k, U, P), + P + ), R = !1; + } + Cartesian3.equalsEpsilon(U, F, CesiumMath.EPSILON10) && (R = !0); + } + (t.tangent || t.bitangent) && (M = m.geodeticSurfaceNormal(F, M), t.tangent && (I = Cartesian3.normalize( + Cartesian3.cross(M, P, I), + I + ))); + } else + P = m.geodeticSurfaceNormal(F, P), (t.tangent || t.bitangent) && (y && (scratchPerPosNormal = Cartesian3.fromArray( + x, + D, + scratchPerPosNormal + ), scratchPerPosTangent = Cartesian3.cross( + Cartesian3.UNIT_Z, + scratchPerPosNormal, + scratchPerPosTangent + ), scratchPerPosTangent = Cartesian3.normalize( + Matrix3.multiplyByVector( + g, + scratchPerPosTangent, + scratchPerPosTangent + ), + scratchPerPosTangent + ), t.bitangent && (scratchPerPosBitangent = Cartesian3.normalize( + Cartesian3.cross( + scratchPerPosNormal, + scratchPerPosTangent, + scratchPerPosBitangent + ), + scratchPerPosBitangent + ))), I = Cartesian3.cross(Cartesian3.UNIT_Z, P, I), I = Cartesian3.normalize( + Matrix3.multiplyByVector(g, I, I), + I + ), t.bitangent && (M = Cartesian3.normalize( + Cartesian3.cross(P, I, M), + M + ))); + t.normal && (e.wall ? (x[D + w] = P.x, x[B + w] = P.y, x[V + w] = P.z) : d && (x[D + w] = -P.x, x[B + w] = -P.y, x[V + w] = -P.z), (l && !y || c) && (x[D] = P.x, x[B] = P.y, x[V] = P.z)), i && (c && (P = m.geodeticSurfaceNormal(F, P)), E[D + w] = -P.x, E[B + w] = -P.y, E[V + w] = -P.z), t.tangent && (e.wall ? (b[D + w] = I.x, b[B + w] = I.y, b[V + w] = I.z) : d && (b[D + w] = -I.x, b[B + w] = -I.y, b[V + w] = -I.z), l && (y ? (b[D] = scratchPerPosTangent.x, b[B] = scratchPerPosTangent.y, b[V] = scratchPerPosTangent.z) : (b[D] = I.x, b[B] = I.y, b[V] = I.z))), t.bitangent && (d && (S[D + w] = M.x, S[B + w] = M.y, S[V + w] = M.z), l && (y ? (S[D] = scratchPerPosBitangent.x, S[B] = scratchPerPosBitangent.y, S[V] = scratchPerPosBitangent.z) : (S[D] = M.x, S[B] = M.y, S[V] = M.z))), D += 3; + } + } + t.st && !defined(o) && (n.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: T + })), t.normal && (n.attributes.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: x + })), t.tangent && (n.attributes.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: b + })), t.bitangent && (n.attributes.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: S + })), i && (n.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: E + })); + } + if (e.extrude && defined(e.offsetAttribute)) { + const f = r.length / 3; + let h = new Uint8Array(f); + if (e.offsetAttribute === GeometryOffsetAttribute$1.TOP) + l && d || c ? h = h.fill(1, 0, f / 2) : l && (h = h.fill(1)); + else { + const p = e.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + h = h.fill(p); + } + n.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: h + }); + } + return n; +} +const createGeometryFromPositionsExtrudedPositions = []; +function createGeometryFromPositionsExtruded$1(e, t, n, i, r, o, s, c, l, d) { + const f = { + walls: [] + }; + let h; + if (s || c) { + const x = PolygonGeometryLibrary.createGeometryFromPositions( + e, + t, + n, + i, + o, + l, + d + ), b = x.attributes.position.values, S = x.indices; + let E, A; + if (s && c) { + const D = b.concat(b); + E = D.length / 3, A = IndexDatatype$1.createTypedArray( + E, + S.length * 2 + ), A.set(S); + const P = S.length, I = E / 2; + for (h = 0; h < P; h += 3) { + const M = A[h] + I, R = A[h + 1] + I, L = A[h + 2] + I; + A[h + P] = L, A[h + 1 + P] = R, A[h + 2 + P] = M; + } + if (x.attributes.position.values = D, o && l.normal) { + const M = x.attributes.normal.values; + x.attributes.normal.values = new Float32Array( + D.length + ), x.attributes.normal.values.set(M); + } + if (l.st && defined(n)) { + const M = x.attributes.st.values; + x.attributes.st.values = new Float32Array(E * 2), x.attributes.st.values = M.concat(M); + } + x.indices = A; + } else if (c) { + for (E = b.length / 3, A = IndexDatatype$1.createTypedArray(E, S.length), h = 0; h < S.length; h += 3) + A[h] = S[h + 2], A[h + 1] = S[h + 1], A[h + 2] = S[h]; + x.indices = A; + } + f.topAndBottom = new GeometryInstance({ + geometry: x + }); + } + let p = r.outerRing; + const m = EllipsoidTangentPlane.fromPoints(p, e); + let _ = m.projectPointsOntoPlane( + p, + createGeometryFromPositionsExtrudedPositions + ), y = PolygonPipeline.computeWindingOrder2D(_); + y === WindingOrder$1.CLOCKWISE && (p = p.slice().reverse()); + let C = PolygonGeometryLibrary.computeWallGeometry( + p, + n, + e, + i, + o, + d + ); + f.walls.push( + new GeometryInstance({ + geometry: C + }) + ); + const T = r.holes; + for (h = 0; h < T.length; h++) { + let x = T[h]; + _ = m.projectPointsOntoPlane( + x, + createGeometryFromPositionsExtrudedPositions + ), y = PolygonPipeline.computeWindingOrder2D(_), y === WindingOrder$1.COUNTER_CLOCKWISE && (x = x.slice().reverse()), C = PolygonGeometryLibrary.computeWallGeometry( + x, + n, + e, + i, + o, + d + ), f.walls.push( + new GeometryInstance({ + geometry: C + }) + ); + } + return f; +} +function PolygonGeometry(e) { + const t = e.polygonHierarchy, n = defaultValue(e.vertexFormat, VertexFormat.DEFAULT), i = defaultValue(e.ellipsoid, Ellipsoid.default), r = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), o = defaultValue(e.stRotation, 0), s = e.textureCoordinates, c = defaultValue(e.perPositionHeight, !1), l = c && defined(e.extrudedHeight); + let d = defaultValue(e.height, 0), f = defaultValue(e.extrudedHeight, d); + if (!l) { + const h = Math.max(d, f); + f = Math.min(d, f), d = h; + } + this._vertexFormat = VertexFormat.clone(n), this._ellipsoid = Ellipsoid.clone(i), this._granularity = r, this._stRotation = o, this._height = d, this._extrudedHeight = f, this._closeTop = defaultValue(e.closeTop, !0), this._closeBottom = defaultValue(e.closeBottom, !0), this._polygonHierarchy = t, this._perPositionHeight = c, this._perPositionHeightExtrude = l, this._shadowVolume = defaultValue(e.shadowVolume, !1), this._workerName = "createPolygonGeometry", this._offsetAttribute = e.offsetAttribute, this._arcType = defaultValue(e.arcType, ArcType$1.GEODESIC), this._rectangle = void 0, this._textureCoordinateRotationPoints = void 0, this._textureCoordinates = s, this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength( + t, + Cartesian3 + ) + Ellipsoid.packedLength + VertexFormat.packedLength + (s ? PolygonGeometryLibrary.computeHierarchyPackedLength( + s, + Cartesian2 + ) : 1) + 12; +} +PolygonGeometry.fromPositions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = { + polygonHierarchy: { + positions: e.positions + }, + height: e.height, + extrudedHeight: e.extrudedHeight, + vertexFormat: e.vertexFormat, + stRotation: e.stRotation, + ellipsoid: e.ellipsoid, + granularity: e.granularity, + perPositionHeight: e.perPositionHeight, + closeTop: e.closeTop, + closeBottom: e.closeBottom, + offsetAttribute: e.offsetAttribute, + arcType: e.arcType, + textureCoordinates: e.textureCoordinates + }; + return new PolygonGeometry(t); +}; +PolygonGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), n = PolygonGeometryLibrary.packPolygonHierarchy( + e._polygonHierarchy, + t, + n, + Cartesian3 + ), Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._height, t[n++] = e._extrudedHeight, t[n++] = e._granularity, t[n++] = e._stRotation, t[n++] = e._perPositionHeightExtrude ? 1 : 0, t[n++] = e._perPositionHeight ? 1 : 0, t[n++] = e._closeTop ? 1 : 0, t[n++] = e._closeBottom ? 1 : 0, t[n++] = e._shadowVolume ? 1 : 0, t[n++] = defaultValue(e._offsetAttribute, -1), t[n++] = e._arcType, defined(e._textureCoordinates) ? n = PolygonGeometryLibrary.packPolygonHierarchy( + e._textureCoordinates, + t, + n, + Cartesian2 + ) : t[n++] = -1, t[n++] = e.packedLength, t; +}; +const scratchEllipsoid$e = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$b = new VertexFormat(), dummyOptions$1 = { + polygonHierarchy: {} +}; +PolygonGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian3 + ); + t = i.startingIndex, delete i.startingIndex; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$e); + t += Ellipsoid.packedLength; + const o = VertexFormat.unpack( + e, + t, + scratchVertexFormat$b + ); + t += VertexFormat.packedLength; + const s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++] === 1, h = e[t++] === 1, p = e[t++] === 1, m = e[t++] === 1, _ = e[t++] === 1, y = e[t++], C = e[t++], T = e[t] === -1 ? void 0 : PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian2 + ); + defined(T) ? (t = T.startingIndex, delete T.startingIndex) : t++; + const x = e[t++]; + return defined(n) || (n = new PolygonGeometry(dummyOptions$1)), n._polygonHierarchy = i, n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._height = s, n._extrudedHeight = c, n._granularity = l, n._stRotation = d, n._perPositionHeightExtrude = f, n._perPositionHeight = h, n._closeTop = p, n._closeBottom = m, n._shadowVolume = _, n._offsetAttribute = y === -1 ? void 0 : y, n._arcType = C, n._textureCoordinates = T, n.packedLength = x, n; +}; +const scratchCartesian0 = new Cartesian2(), scratchCartesian1$7 = new Cartesian2(), scratchPolarClosest = new Stereographic(); +function expandRectangle(e, t, n, i, r, o) { + const s = e.longitude, c = s >= 0 ? s : s + CesiumMath.TWO_PI; + r.westOverIdl = Math.min(r.westOverIdl, c), r.eastOverIdl = Math.max(r.eastOverIdl, c), o.west = Math.min(o.west, s), o.east = Math.max(o.east, s); + const l = e.getLatitude(n); + let d = l; + if (o.south = Math.min(o.south, l), o.north = Math.max(o.north, l), i !== ArcType$1.RHUMB) { + const p = Cartesian2.subtract( + t.position, + e.position, + scratchCartesian0 + ), m = Cartesian2.dot(t.position, p) / Cartesian2.dot(p, p); + if (m > 0 && m < 1) { + const _ = Cartesian2.add( + t.position, + Cartesian2.multiplyByScalar(p, -m, p), + scratchCartesian1$7 + ), y = Stereographic.clone(t, scratchPolarClosest); + y.position = _; + const C = y.getLatitude(n); + o.south = Math.min(o.south, C), o.north = Math.max(o.north, C), Math.abs(l) > Math.abs(C) && (d = C); + } + } + const f = t.x * e.y - e.x * t.y; + let h = Math.sign(f); + h !== 0 && (h *= Cartesian2.angleBetween(t.position, e.position)), d >= 0 && (r.northAngle += h), d <= 0 && (r.southAngle += h); +} +const scratchPolar = new Stereographic(), scratchPolarPrevious = new Stereographic(), polygon = { + northAngle: 0, + southAngle: 0, + westOverIdl: 0, + eastOverIdl: 0 +}; +PolygonGeometry.computeRectangleFromPositions = function(e, t, n, i) { + if (defined(i) || (i = new Rectangle()), e.length < 3) + return i; + i.west = Number.POSITIVE_INFINITY, i.east = Number.NEGATIVE_INFINITY, i.south = Number.POSITIVE_INFINITY, i.north = Number.NEGATIVE_INFINITY, polygon.northAngle = 0, polygon.southAngle = 0, polygon.westOverIdl = Number.POSITIVE_INFINITY, polygon.eastOverIdl = Number.NEGATIVE_INFINITY; + const r = e.length; + let o = Stereographic.fromCartesian( + e[0], + scratchPolarPrevious + ); + for (let s = 1; s < r; s++) { + const c = Stereographic.fromCartesian( + e[s], + scratchPolar + ); + expandRectangle( + c, + o, + t, + n, + polygon, + i + ), o = Stereographic.clone(c, o); + } + return expandRectangle( + Stereographic.fromCartesian(e[0], scratchPolar), + o, + t, + n, + polygon, + i + ), i.east - i.west > polygon.eastOverIdl - polygon.westOverIdl && (i.west = polygon.westOverIdl, i.east = polygon.eastOverIdl, i.east > CesiumMath.PI && (i.east = i.east - CesiumMath.TWO_PI), i.west > CesiumMath.PI && (i.west = i.west - CesiumMath.TWO_PI)), CesiumMath.equalsEpsilon( + Math.abs(polygon.northAngle), + CesiumMath.TWO_PI, + CesiumMath.EPSILON10 + ) && (i.north = CesiumMath.PI_OVER_TWO, i.east = CesiumMath.PI, i.west = -CesiumMath.PI), CesiumMath.equalsEpsilon( + Math.abs(polygon.southAngle), + CesiumMath.TWO_PI, + CesiumMath.EPSILON10 + ) && (i.south = -CesiumMath.PI_OVER_TWO, i.east = CesiumMath.PI, i.west = -CesiumMath.PI), i; +}; +const scratchPolarForPlane = new Stereographic(); +function getTangentPlane(e, t, n) { + return e.height >= CesiumMath.PI || e.width >= CesiumMath.PI ? Stereographic.fromCartesian( + t[0], + scratchPolarForPlane + ).tangentPlane : EllipsoidTangentPlane.fromPoints(t, n); +} +const scratchCartographicCyllindrical = new Cartographic(); +function createProjectTo2d(e, t, n) { + return (i, r) => { + if (e.height >= CesiumMath.PI || e.width >= CesiumMath.PI) { + if (e.south < 0 && e.north > 0) { + defined(r) || (r = []); + for (let s = 0; s < i.length; ++s) { + const c = n.cartesianToCartographic( + i[s], + scratchCartographicCyllindrical + ); + r[s] = new Cartesian2( + c.longitude / CesiumMath.PI, + c.latitude / CesiumMath.PI_OVER_TWO + ); + } + return r.length = i.length, r; + } + return Stereographic.fromCartesianArray(i, r); + } + return EllipsoidTangentPlane.fromPoints( + t, + n + ).projectPointsOntoPlane(i, r); + }; +} +function createProjectPositionTo2d(e, t, n) { + if (e.height >= CesiumMath.PI || e.width >= CesiumMath.PI) + return (r, o) => { + if (e.south < 0 && e.north > 0) { + const s = n.cartesianToCartographic( + r, + scratchCartographicCyllindrical + ); + return defined(o) || (o = new Cartesian2()), o.x = s.longitude / CesiumMath.PI, o.y = s.latitude / CesiumMath.PI_OVER_TWO, o; + } + return Stereographic.fromCartesian(r, o); + }; + const i = EllipsoidTangentPlane.fromPoints(t, n); + return (r, o) => i.projectPointsOntoPlane(r, o); +} +function createSplitPolygons(e, t, n, i) { + return (r, o) => !i && (e.height >= CesiumMath.PI_OVER_TWO || e.width >= 2 * CesiumMath.PI_OVER_THREE) ? PolygonGeometryLibrary.splitPolygonsOnEquator( + r, + t, + n, + o + ) : r; +} +function computeBoundingRectangle(e, t, n, i) { + if (t.height >= CesiumMath.PI || t.width >= CesiumMath.PI) + return BoundingRectangle.fromRectangle( + t, + void 0, + scratchBoundingRectangle + ); + const r = e, o = EllipsoidTangentPlane.fromPoints( + r, + n + ); + return PolygonGeometryLibrary.computeBoundingRectangle( + o.plane.normal, + o.projectPointOntoPlane.bind(o), + r, + i, + scratchBoundingRectangle + ); +} +PolygonGeometry.createGeometry = function(e) { + const t = e._vertexFormat, n = e._ellipsoid, i = e._granularity, r = e._stRotation, o = e._polygonHierarchy, s = e._perPositionHeight, c = e._closeTop, l = e._closeBottom, d = e._arcType, f = e._textureCoordinates, h = defined(f), p = o.positions; + if (p.length < 3) + return; + const m = e.rectangle, _ = PolygonGeometryLibrary.polygonsFromHierarchy( + o, + h, + createProjectTo2d(m, p, n), + !s, + n, + createSplitPolygons(m, n, d, s) + ), y = _.hierarchy, C = _.polygons, T = function(w) { + return w; + }, x = h ? PolygonGeometryLibrary.polygonsFromHierarchy( + f, + !0, + T, + !1, + n + ).polygons : void 0; + if (y.length === 0) + return; + const b = y[0].outerRing, S = computeBoundingRectangle( + b, + m, + n, + r + ), E = [], A = e._height, D = e._extrudedHeight, P = e._perPositionHeightExtrude || !CesiumMath.equalsEpsilon(A, D, 0, CesiumMath.EPSILON2), I = { + perPositionHeight: s, + vertexFormat: t, + geometry: void 0, + rotationAxis: getTangentPlane(m, b, n).plane.normal, + projectTo2d: createProjectPositionTo2d(m, b, n), + boundingRectangle: S, + ellipsoid: n, + stRotation: r, + textureCoordinates: void 0, + bottom: !1, + top: !0, + wall: !1, + extrude: !1, + arcType: d + }; + let M; + if (P) + for (I.extrude = !0, I.top = c, I.bottom = l, I.shadowVolume = e._shadowVolume, I.offsetAttribute = e._offsetAttribute, M = 0; M < C.length; M++) { + const w = createGeometryFromPositionsExtruded$1( + n, + C[M], + h ? x[M] : void 0, + i, + y[M], + s, + c, + l, + t, + d + ); + let O; + c && l ? (O = w.topAndBottom, I.geometry = PolygonGeometryLibrary.scaleToGeodeticHeightExtruded( + O.geometry, + A, + D, + n, + s + )) : c ? (O = w.topAndBottom, O.geometry.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + O.geometry.attributes.position.values, + A, + n, + !s + ), I.geometry = O.geometry) : l && (O = w.topAndBottom, O.geometry.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + O.geometry.attributes.position.values, + D, + n, + !0 + ), I.geometry = O.geometry), (c || l) && (I.wall = !1, O.geometry = computeAttributes$2(I), E.push(O)); + const N = w.walls; + I.wall = !0; + for (let F = 0; F < N.length; F++) { + const B = N[F]; + I.geometry = PolygonGeometryLibrary.scaleToGeodeticHeightExtruded( + B.geometry, + A, + D, + n, + s + ), B.geometry = computeAttributes$2(I), E.push(B); + } + } + else + for (M = 0; M < C.length; M++) { + const w = new GeometryInstance({ + geometry: PolygonGeometryLibrary.createGeometryFromPositions( + n, + C[M], + h ? x[M] : void 0, + i, + s, + t, + d + ) + }); + if (w.geometry.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + w.geometry.attributes.position.values, + A, + n, + !s + ), I.geometry = w.geometry, w.geometry = computeAttributes$2(I), defined(e._offsetAttribute)) { + const O = w.geometry.attributes.position.values.length, N = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, F = new Uint8Array(O / 3).fill(N); + w.geometry.attributes.applyOffset = new GeometryAttribute( + { + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: F + } + ); + } + E.push(w); + } + const R = GeometryPipeline.combineInstances(E)[0]; + R.attributes.position.values = new Float64Array( + R.attributes.position.values + ), R.indices = IndexDatatype$1.createTypedArray( + R.attributes.position.values.length / 3, + R.indices + ); + const L = R.attributes, g = BoundingSphere.fromVertices( + L.position.values + ); + return t.position || delete L.position, new Geometry({ + attributes: L, + indices: R.indices, + primitiveType: R.primitiveType, + boundingSphere: g, + offsetAttribute: e._offsetAttribute + }); +}; +PolygonGeometry.createShadowVolume = function(e, t, n) { + const i = e._granularity, r = e._ellipsoid, o = t(i, r), s = n(i, r); + return new PolygonGeometry({ + polygonHierarchy: e._polygonHierarchy, + ellipsoid: r, + stRotation: e._stRotation, + granularity: i, + perPositionHeight: !1, + extrudedHeight: o, + height: s, + vertexFormat: VertexFormat.POSITION_ONLY, + shadowVolume: !0, + arcType: e._arcType + }); +}; +function textureCoordinateRotationPoints$2(e) { + const t = -e._stRotation; + if (t === 0) + return [0, 0, 0, 1, 1, 0]; + const n = e._ellipsoid, i = e._polygonHierarchy.positions, r = e.rectangle; + return Geometry._textureCoordinateRotationPoints( + i, + t, + n, + r + ); +} +Object.defineProperties(PolygonGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + if (!defined(this._rectangle)) { + const e = this._polygonHierarchy.positions; + this._rectangle = PolygonGeometry.computeRectangleFromPositions( + e, + this._ellipsoid, + this._arcType + ); + } + return this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering PolygonGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return defined(this._textureCoordinateRotationPoints) || (this._textureCoordinateRotationPoints = textureCoordinateRotationPoints$2( + this + )), this._textureCoordinateRotationPoints; + } + } +}); +function ClippingPolygon(e) { + this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this._positions = [...e.positions]; +} +Object.defineProperties(ClippingPolygon.prototype, { + /** + * Returns the total number of positions in the polygon, include any holes. + * + * @memberof ClippingPolygon.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._positions.length; + } + }, + /** + * Returns the outer ring of positions. + * + * @memberof ClippingPolygon.prototype + * @type {Cartesian3[]} + * @readonly + */ + positions: { + get: function() { + return this._positions; + } + }, + /** + * Returns the ellipsoid used to project the polygon onto surfaces when clipping. + * + * @memberof ClippingPolygon.prototype + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +ClippingPolygon.clone = function(e, t) { + return defined(t) ? (t._ellipsoid = e.ellipsoid, t._positions.length = 0, t._positions.push(...e.positions), t) : new ClippingPolygon({ + positions: e.positions, + ellipsoid: e.ellipsoid + }); +}; +ClippingPolygon.equals = function(e, t) { + return e.ellipsoid.equals(t.ellipsoid) && e.positions === t.positions; +}; +ClippingPolygon.prototype.computeRectangle = function(e) { + return PolygonGeometry.computeRectangleFromPositions( + this.positions, + this.ellipsoid, + void 0, + e + ); +}; +const scratchRectangle$a = new Rectangle(), spherePointScratch = new Cartesian3(); +ClippingPolygon.prototype.computeSphericalExtents = function(e) { + defined(e) || (e = new Rectangle()); + const t = this.computeRectangle(scratchRectangle$a); + let n = Cartographic.toCartesian( + Rectangle.southwest(t), + this.ellipsoid, + spherePointScratch + ), i = Math.sqrt( + n.x * n.x + n.y * n.y + ), r = CesiumMath.fastApproximateAtan2(i, n.z), o = CesiumMath.fastApproximateAtan2( + n.x, + n.y + ); + return e.south = r, e.west = o, n = Cartographic.toCartesian( + Rectangle.northeast(t), + this.ellipsoid, + spherePointScratch + ), i = Math.sqrt( + n.x * n.x + n.y * n.y + ), r = CesiumMath.fastApproximateAtan2(i, n.z), o = CesiumMath.fastApproximateAtan2( + n.x, + n.y + ), e.north = r, e.east = o, e; +}; +const PolygonSignedDistanceFS = `in vec2 v_textureCoordinates; + +uniform int u_polygonsLength; +uniform int u_extentsLength; +uniform highp sampler2D u_polygonTexture; +uniform highp sampler2D u_extentsTexture; + +int getPolygonIndex(float dimension, vec2 coord) { + vec2 uv = coord.xy * dimension; + return int(floor(uv.y) * dimension + floor(uv.x)); +} + +vec2 getLookupUv(ivec2 dimensions, int i) { + int pixY = i / dimensions.x; + int pixX = i - (pixY * dimensions.x); + float pixelWidth = 1.0 / float(dimensions.x); + float pixelHeight = 1.0 / float(dimensions.y); + float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel + float v = (float(pixY) + 0.5) * pixelHeight; + return vec2(u, v); +} + +vec4 getExtents(int i) { + return texture(u_extentsTexture, getLookupUv(textureSize(u_extentsTexture, 0), i)); +} + +ivec2 getPositionsLengthAndExtentsIndex(int i) { + vec2 uv = getLookupUv(textureSize(u_polygonTexture, 0), i); + vec4 value = texture(u_polygonTexture, uv); + return ivec2(int(value.x), int(value.y)); +} + +vec2 getPolygonPosition(int i) { + vec2 uv = getLookupUv(textureSize(u_polygonTexture, 0), i); + return texture(u_polygonTexture, uv).xy; +} + +vec2 getCoordinates(vec2 textureCoordinates, vec4 extents) { + float latitude = mix(extents.x, extents.x + 1.0 / extents.z, textureCoordinates.y); + float longitude = mix(extents.y, extents.y + 1.0 / extents.w, textureCoordinates.x); + return vec2(latitude, longitude); +} + +void main() { + int lastPolygonIndex = 0; + out_FragColor = vec4(1.0); + + // Get the relevant region of the texture + float dimension = float(u_extentsLength); + if (u_extentsLength > 2) { + dimension = ceil(log2(float(u_extentsLength))); + } + int regionIndex = getPolygonIndex(dimension, v_textureCoordinates); + + for (int polygonIndex = 0; polygonIndex < u_polygonsLength; polygonIndex++) { + ivec2 positionsLengthAndExtents = getPositionsLengthAndExtentsIndex(lastPolygonIndex); + int positionsLength = positionsLengthAndExtents.x; + int polygonExtentsIndex = positionsLengthAndExtents.y; + lastPolygonIndex += 1; + + // Only compute signed distance for the relevant part of the atlas + if (polygonExtentsIndex == regionIndex) { + float clipAmount = czm_infinity; + vec4 extents = getExtents(polygonExtentsIndex); + vec2 textureOffset = vec2(mod(float(polygonExtentsIndex), dimension), floor(float(polygonExtentsIndex) / dimension)) / dimension; + vec2 p = getCoordinates((v_textureCoordinates - textureOffset) * dimension, extents); + float s = 1.0; + + // Check each edge for absolute distance + for (int i = 0, j = positionsLength - 1; i < positionsLength; j = i, i++) { + vec2 a = getPolygonPosition(lastPolygonIndex + i); + vec2 b = getPolygonPosition(lastPolygonIndex + j); + + vec2 ab = b - a; + vec2 pa = p - a; + float t = dot(pa, ab) / dot(ab, ab); + t = clamp(t, 0.0, 1.0); + + vec2 pq = pa - t * ab; + float d = length(pq); + + // Inside / outside computation to determine sign + bvec3 cond = bvec3(p.y >= a.y, + p.y < b.y, + ab.x * pa.y > ab.y * pa.x); + if (all(cond) || all(not(cond))) s = -s; + if (abs(d) < abs(clipAmount)) { + clipAmount = d; + } + } + + // Normalize the range to [0,1] + vec4 result = (s * vec4(clipAmount * length(extents.zw))) / 2.0 + 0.5; + // In the case where we've iterated through multiple polygons, take the minimum + out_FragColor = min(out_FragColor, result); + } + + lastPolygonIndex += positionsLength; + } +}`; +function ClippingPolygonCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._polygons = [], this._totalPositions = 0, this.enabled = defaultValue(e.enabled, !0), this.inverse = defaultValue(e.inverse, !1), this.polygonAdded = new Event(), this.polygonRemoved = new Event(), this._owner = void 0, this._float32View = void 0, this._extentsFloat32View = void 0, this._extentsCount = 0, this._polygonsTexture = void 0, this._extentsTexture = void 0, this._signedDistanceTexture = void 0, this._signedDistanceComputeCommand = void 0; + const t = e.polygons; + if (defined(t)) { + const n = t.length; + for (let i = 0; i < n; ++i) + this._polygons.push(t[i]); + } +} +Object.defineProperties(ClippingPolygonCollection.prototype, { + /** + * Returns the number of polygons in this collection. This is commonly used with + * {@link ClippingPolygonCollection#get} to iterate over all the polygons + * in the collection. + * + * @memberof ClippingPolygonCollection.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._polygons.length; + } + }, + /** + * Returns the total number of positions in all polygons in the collection. + * + * @memberof ClippingPolygonCollection.prototype + * @type {number} + * @readonly + * @private + */ + totalPositions: { + get: function() { + return this._totalPositions; + } + }, + /** + * Returns a texture containing the packed computed spherical extents for each polygon + * + * @memberof ClippingPolygonCollection.prototype + * @type {Texture} + * @readonly + * @private + */ + extentsTexture: { + get: function() { + return this._extentsTexture; + } + }, + /** + * Returns the number of packed extents, which can be fewer than the number of polygons. + * + * @memberof ClippingPolygonCollection.prototype + * @type {number} + * @readonly + * @private + */ + extentsCount: { + get: function() { + return this._extentsCount; + } + }, + /** + * Returns the number of pixels needed in the texture containing the packed computed spherical extents for each polygon. + * + * @memberof ClippingPolygonCollection.prototype + * @type {number} + * @readonly + * @private + */ + pixelsNeededForExtents: { + get: function() { + return this.length; + } + }, + /** + * Returns the number of pixels needed in the texture containing the packed polygon positions. + * + * @memberof ClippingPolygonCollection.prototype + * @type {number} + * @readonly + * @private + */ + pixelsNeededForPolygonPositions: { + get: function() { + return this.totalPositions + this.length; + } + }, + /** + * Returns a texture containing the computed signed distance of each polygon. + * + * @memberof ClippingPolygonCollection.prototype + * @type {Texture} + * @readonly + * @private + */ + clippingTexture: { + get: function() { + return this._signedDistanceTexture; + } + }, + /** + * A reference to the ClippingPolygonCollection's owner, if any. + * + * @memberof ClippingPolygonCollection.prototype + * @readonly + * @private + */ + owner: { + get: function() { + return this._owner; + } + }, + /** + * Returns a number encapsulating the state for this ClippingPolygonCollection. + * + * Clipping mode is encoded in the sign of the number, which is just the total position count. + * If this value changes, then shader regeneration is necessary. + * + * @memberof ClippingPolygonCollection.prototype + * @returns {number} A Number that describes the ClippingPolygonCollection's state. + * @readonly + * @private + */ + clippingPolygonsState: { + get: function() { + return this.inverse ? -this.extentsCount : this.extentsCount; + } + } +}); +ClippingPolygonCollection.prototype.add = function(e) { + const t = this._polygons.length; + return this._polygons.push(e), this.polygonAdded.raiseEvent(e, t), e; +}; +ClippingPolygonCollection.prototype.get = function(e) { + return this._polygons[e]; +}; +ClippingPolygonCollection.prototype.contains = function(e) { + return this._polygons.some((t) => ClippingPolygon.equals(t, e)); +}; +ClippingPolygonCollection.prototype.remove = function(e) { + const t = this._polygons, n = t.findIndex((i) => ClippingPolygon.equals(i, e)); + return n === -1 ? !1 : (t.splice(n, 1), this.polygonRemoved.raiseEvent(e, n), !0); +}; +const scratchRectangle$9 = new Rectangle(); +function getExtents(e) { + const t = [], n = [], i = e.length; + for (let o = 0; o < i; ++o) { + const c = e[o].computeSphericalExtents(); + let l = Math.max(c.height * 2.5, 1e-3), d = Math.max(c.width * 2.5, 1e-3), f = Rectangle.clone(c); + f.south -= l, f.west -= d, f.north += l, f.east += d, f.south = Math.max(f.south, -Math.PI), f.west = Math.max(f.west, -Math.PI), f.north = Math.min(f.north, Math.PI), f.east = Math.min(f.east, Math.PI); + const h = [o]; + for (let p = 0; p < t.length; ++p) { + const m = t[p]; + if (defined(m) && defined(Rectangle.simpleIntersection(m, f)) && !Rectangle.equals(m, f)) { + const _ = n[p]; + h.push(..._), _.reduce( + (y, C) => Rectangle.union( + e[C].computeSphericalExtents(scratchRectangle$9), + y, + y + ), + c + ), t[p] = void 0, n[p] = void 0, l = Math.max(c.height * 2.5, 1e-3), d = Math.max(c.width * 2.5, 1e-3), f = Rectangle.clone(c, f), f.south -= l, f.west -= d, f.north += l, f.east += d, f.south = Math.max(f.south, -Math.PI), f.west = Math.max(f.west, -Math.PI), f.north = Math.min(f.north, Math.PI), f.east = Math.min(f.east, Math.PI), p = -1; + } + } + t.push(f), n.push(h); + } + const r = /* @__PURE__ */ new Map(); + return n.filter(defined).forEach( + (o, s) => o.forEach((c) => r.set(c, s)) + ), { + extentsList: t.filter(defined), + extentsIndexByPolygon: r + }; +} +ClippingPolygonCollection.prototype.removeAll = function() { + const e = this._polygons, t = e.length; + for (let n = 0; n < t; ++n) { + const i = e[n]; + this.polygonRemoved.raiseEvent(i, n); + } + this._polygons = []; +}; +function packPolygonsAsFloats(e) { + const t = e._float32View, n = e._extentsFloat32View, i = e._polygons, { extentsList: r, extentsIndexByPolygon: o } = getExtents(i); + let s = 0; + for (const [l, d] of i.entries()) { + const f = d.length; + t[s++] = f, t[s++] = o.get(l); + for (let h = 0; h < f; ++h) { + const p = d.positions[h], m = Math.hypot(p.x, p.y), _ = CesiumMath.fastApproximateAtan2( + m, + p.z + ), y = CesiumMath.fastApproximateAtan2( + p.x, + p.y + ); + t[s++] = _, t[s++] = y; + } + } + let c = 0; + for (const l of r) { + const d = 1 / (l.east - l.west), f = 1 / (l.north - l.south); + n[c++] = l.south, n[c++] = l.west, n[c++] = f, n[c++] = d; + } + e._extentsCount = r.length; +} +const textureResolutionScratch$2 = new Cartesian2(); +ClippingPolygonCollection.prototype.update = function(e) { + const t = e.context; + if (!ClippingPolygonCollection.isSupported(e)) + throw new RuntimeError( + "ClippingPolygonCollections are only supported for WebGL 2." + ); + const n = this._polygons.reduce( + (s, c) => s + c.length, + 0 + ); + if (n === this.totalPositions || (this._totalPositions = n, this.length === 0)) + return; + defined(this._signedDistanceComputeCommand) && (this._signedDistanceComputeCommand.canceled = !0, this._signedDistanceComputeCommand = void 0); + let i = this._polygonsTexture, r = this._extentsTexture, o = this._signedDistanceTexture; + if (defined(i)) { + const s = i.width * i.height; + (s < this.pixelsNeededForPolygonPositions || this.pixelsNeededForPolygonPositions < 0.25 * s) && (i.destroy(), i = void 0, this._polygonsTexture = void 0); + } + if (!defined(i)) { + const s = ClippingPolygonCollection.getTextureResolution( + i, + this.pixelsNeededForPolygonPositions, + textureResolutionScratch$2 + ); + i = new Texture({ + context: t, + width: s.x, + height: s.y, + pixelFormat: PixelFormat$1.RG, + pixelDatatype: PixelDatatype$1.FLOAT, + sampler: Sampler.NEAREST, + flipY: !1 + }), this._float32View = new Float32Array( + s.x * s.y * 2 + ), this._polygonsTexture = i; + } + if (defined(r)) { + const s = r.width * r.height; + (s < this.pixelsNeededForExtents || this.pixelsNeededForExtents < 0.25 * s) && (r.destroy(), r = void 0, this._extentsTexture = void 0); + } + if (!defined(r)) { + const s = ClippingPolygonCollection.getTextureResolution( + r, + this.pixelsNeededForExtents, + textureResolutionScratch$2 + ); + r = new Texture({ + context: t, + width: s.x, + height: s.y, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.FLOAT, + sampler: Sampler.NEAREST, + flipY: !1 + }), this._extentsFloat32View = new Float32Array( + s.x * s.y * 4 + ), this._extentsTexture = r; + } + if (packPolygonsAsFloats(this), r.copyFrom({ + source: { + width: r.width, + height: r.height, + arrayBufferView: this._extentsFloat32View + } + }), i.copyFrom({ + source: { + width: i.width, + height: i.height, + arrayBufferView: this._float32View + } + }), !defined(o)) { + const s = ClippingPolygonCollection.getClippingDistanceTextureResolution( + this, + textureResolutionScratch$2 + ); + o = new Texture({ + context: t, + width: s.x, + height: s.y, + pixelFormat: t.webgl2 ? PixelFormat$1.RED : PixelFormat$1.LUMINANCE, + pixelDatatype: PixelDatatype$1.FLOAT, + sampler: new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }), + flipY: !1 + }), this._signedDistanceTexture = o; + } + this._signedDistanceComputeCommand = createSignedDistanceTextureCommand(this); +}; +ClippingPolygonCollection.prototype.queueCommands = function(e) { + defined(this._signedDistanceComputeCommand) && e.commandList.push(this._signedDistanceComputeCommand); +}; +function createSignedDistanceTextureCommand(e) { + const t = e._polygonsTexture, n = e._extentsTexture; + return new ComputeCommand({ + fragmentShaderSource: PolygonSignedDistanceFS, + outputTexture: e._signedDistanceTexture, + uniformMap: { + u_polygonsLength: function() { + return e.length; + }, + u_extentsLength: function() { + return e.extentsCount; + }, + u_extentsTexture: function() { + return n; + }, + u_polygonTexture: function() { + return t; + } + }, + persists: !1, + owner: e, + postExecute: () => { + e._signedDistanceComputeCommand = void 0; + } + }); +} +const scratchRectangleTile = new Rectangle(), scratchRectangleIntersection = new Rectangle(); +ClippingPolygonCollection.prototype.computeIntersectionWithBoundingVolume = function(e, t) { + var o; + const n = this._polygons, i = n.length; + let r = Intersect$1.OUTSIDE; + this.inverse && (r = Intersect$1.INSIDE); + for (let s = 0; s < i; ++s) { + const l = n[s].computeRectangle(); + let d = e.rectangle; + if (!defined(d) && defined((o = e.boundingVolume) == null ? void 0 : o.computeCorners)) { + const h = e.boundingVolume.computeCorners(); + d = Rectangle.fromCartesianArray( + h, + t, + scratchRectangleTile + ); + } + defined(d) || (d = Rectangle.fromBoundingSphere( + e.boundingSphere, + t, + scratchRectangleTile + )); + const f = Rectangle.simpleIntersection( + d, + l, + scratchRectangleIntersection + ); + defined(f) && (r = Intersect$1.INTERSECTING); + } + return r; +}; +ClippingPolygonCollection.setOwner = function(e, t, n) { + e !== t[n] && (t[n] = t[n] && t[n].destroy(), defined(e) && (e._owner = t, t[n] = e)); +}; +ClippingPolygonCollection.isSupported = function(e) { + return e == null ? void 0 : e.context.webgl2; +}; +ClippingPolygonCollection.getTextureResolution = function(e, t, n) { + if (defined(e)) + return n.x = e.width, n.y = e.height, n; + const i = ContextLimits.maximumTextureSize; + return n.x = Math.min(t, i), n.y = Math.ceil(t / n.x), n.y *= 2, n; +}; +ClippingPolygonCollection.getClippingDistanceTextureResolution = function(e, t) { + const n = e.signedDistanceTexture; + return defined(n) ? (t.x = n.width, t.y = n.height, t) : (t.x = Math.min(ContextLimits.maximumTextureSize, 4096), t.y = Math.min(ContextLimits.maximumTextureSize, 4096), t); +}; +ClippingPolygonCollection.getClippingExtentsTextureResolution = function(e, t) { + const n = e.extentsTexture; + return defined(n) ? (t.x = n.width, t.y = n.height, t) : ClippingPolygonCollection.getTextureResolution( + n, + e.pixelsNeededForExtents, + t + ); +}; +ClippingPolygonCollection.prototype.isDestroyed = function() { + return !1; +}; +ClippingPolygonCollection.prototype.destroy = function() { + return defined(this._signedDistanceComputeCommand) && (this._signedDistanceComputeCommand.canceled = !0), this._polygonsTexture = this._polygonsTexture && this._polygonsTexture.destroy(), this._extentsTexture = this._extentsTexture && this._extentsTexture.destroy(), this._signedDistanceTexture = this._signedDistanceTexture && this._signedDistanceTexture.destroy(), destroyObject(this); +}; +const ColorBlendMode = { + HIGHLIGHT: 0, + REPLACE: 1, + MIX: 2 +}; +ColorBlendMode.getColorBlend = function(e, t) { + if (e === ColorBlendMode.HIGHLIGHT) + return 0; + if (e === ColorBlendMode.REPLACE) + return 1; + if (e === ColorBlendMode.MIX) + return CesiumMath.clamp(t, CesiumMath.EPSILON4, 1); +}; +const ColorBlendMode$1 = Object.freeze(ColorBlendMode), ArticulationStageType = { + XTRANSLATE: "xTranslate", + YTRANSLATE: "yTranslate", + ZTRANSLATE: "zTranslate", + XROTATE: "xRotate", + YROTATE: "yRotate", + ZROTATE: "zRotate", + XSCALE: "xScale", + YSCALE: "yScale", + ZSCALE: "zScale", + UNIFORMSCALE: "uniformScale" +}, ArticulationStageType$1 = Object.freeze(ArticulationStageType), InterpolationType = { + STEP: 0, + LINEAR: 1, + CUBICSPLINE: 2 +}, InterpolationType$1 = Object.freeze(InterpolationType), emptyClass = {}; +function JsonMetadataTable(e) { + this._count = e.count, this._properties = clone$1(e.properties, !0); +} +JsonMetadataTable.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, emptyClass); +}; +JsonMetadataTable.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, emptyClass, e); +}; +JsonMetadataTable.prototype.getProperty = function(e, t) { + const n = this._properties[t]; + if (defined(n)) + return clone$1(n[e], !0); +}; +JsonMetadataTable.prototype.setProperty = function(e, t, n) { + let i = this._properties[t]; + defined(i) || (i = new Array(this._count), this._properties[t] = i), i[e] = clone$1(n, !0); +}; +function PropertyTable(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._name = e.name, this._id = e.id, this._count = e.count, this._extras = e.extras, this._extensions = e.extensions, this._metadataTable = e.metadataTable, this._jsonMetadataTable = e.jsonMetadataTable, this._batchTableHierarchy = e.batchTableHierarchy; +} +Object.defineProperties(PropertyTable.prototype, { + /** + * A human-readable name for this table + * + * @memberof PropertyTable.prototype + * @type {string} + * @readonly + * @private + */ + name: { + get: function() { + return this._name; + } + }, + /** + * An identifier for this table. Useful for debugging. + * + * @memberof PropertyTable.prototype + * @type {string|number} + * @readonly + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The number of features in the table. + * + * @memberof PropertyTable.prototype + * @type {number} + * @readonly + * @private + */ + count: { + get: function() { + return this._count; + } + }, + /** + * The class that properties conform to. + * + * @memberof PropertyTable.prototype + * @type {MetadataClass} + * @readonly + */ + class: { + get: function() { + if (defined(this._metadataTable)) + return this._metadataTable.class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof PropertyTable.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof PropertyTable.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + }, + /** + * Get the total amount of binary metadata stored in memory. This does + * not include JSON metadata + * + * @memberof PropertyTable.prototype + * @type {number} + * @readonly + * @private + */ + byteLength: { + get: function() { + let e = 0; + return defined(this._metadataTable) && (e += this._metadataTable.byteLength), defined(this._batchTableHierarchy) && (e += this._batchTableHierarchy.byteLength), e; + } + } +}); +PropertyTable.prototype.hasProperty = function(e, t) { + return !!(defined(this._metadataTable) && this._metadataTable.hasProperty(t) || defined(this._batchTableHierarchy) && this._batchTableHierarchy.hasProperty(e, t) || defined(this._jsonMetadataTable) && this._jsonMetadataTable.hasProperty(t)); +}; +PropertyTable.prototype.hasPropertyBySemantic = function(e, t) { + return defined(this._metadataTable) ? this._metadataTable.hasPropertyBySemantic(t) : !1; +}; +PropertyTable.prototype.propertyExists = function(e) { + return !!(defined(this._metadataTable) && this._metadataTable.hasProperty(e) || defined(this._batchTableHierarchy) && this._batchTableHierarchy.propertyExists(e) || defined(this._jsonMetadataTable) && this._jsonMetadataTable.hasProperty(e)); +}; +PropertyTable.prototype.propertyExistsBySemantic = function(e) { + return defined(this._metadataTable) ? this._metadataTable.hasPropertyBySemantic(e) : !1; +}; +const scratchResults = []; +PropertyTable.prototype.getPropertyIds = function(e, t) { + return t = defined(t) ? t : [], t.length = 0, defined(this._metadataTable) && t.push.apply( + t, + this._metadataTable.getPropertyIds(scratchResults) + ), defined(this._batchTableHierarchy) && t.push.apply( + t, + this._batchTableHierarchy.getPropertyIds(e, scratchResults) + ), defined(this._jsonMetadataTable) && t.push.apply( + t, + this._jsonMetadataTable.getPropertyIds(scratchResults) + ), t; +}; +PropertyTable.prototype.getProperty = function(e, t) { + let n; + if (defined(this._metadataTable) && (n = this._metadataTable.getProperty(e, t), defined(n)) || defined(this._batchTableHierarchy) && (n = this._batchTableHierarchy.getProperty(e, t), defined(n)) || defined(this._jsonMetadataTable) && (n = this._jsonMetadataTable.getProperty(e, t), defined(n))) + return n; +}; +PropertyTable.prototype.setProperty = function(e, t, n) { + defined(this._metadataTable) && this._metadataTable.setProperty(e, t, n) || defined(this._batchTableHierarchy) && this._batchTableHierarchy.setProperty(e, t, n) || (defined(this._jsonMetadataTable) || (this._jsonMetadataTable = new JsonMetadataTable({ + count: this._count, + properties: {} + })), this._jsonMetadataTable.setProperty(e, t, n)); +}; +PropertyTable.prototype.getPropertyBySemantic = function(e, t) { + if (defined(this._metadataTable)) + return this._metadataTable.getPropertyBySemantic(e, t); +}; +PropertyTable.prototype.setPropertyBySemantic = function(e, t, n) { + return defined(this._metadataTable) ? this._metadataTable.setPropertyBySemantic(e, t, n) : !1; +}; +PropertyTable.prototype.getPropertyTypedArray = function(e) { + if (defined(this._metadataTable)) + return this._metadataTable.getPropertyTypedArray(e); +}; +PropertyTable.prototype.getPropertyTypedArrayBySemantic = function(e) { + if (defined(this._metadataTable)) + return this._metadataTable.getPropertyTypedArrayBySemantic(e); +}; +PropertyTable.prototype.isClass = function(e, t) { + const n = this._batchTableHierarchy; + return defined(n) ? n.isClass(e, t) : !1; +}; +PropertyTable.prototype.isExactClass = function(e, t) { + return this.getExactClassName(e) === t; +}; +PropertyTable.prototype.getExactClassName = function(e) { + const t = this._batchTableHierarchy; + if (defined(t)) + return t.getClassName(e); +}; +function PropertyTextureProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.property, n = e.classProperty, i = e.textures, r = defined(t.channels) ? t.channels : [0], o = t, s = GltfLoaderUtil.createModelTextureReader({ + textureInfo: o, + channels: reformatChannels$1(r), + texture: i[o.index] + }); + this._min = t.min, this._max = t.max; + let c = t.offset, l = t.scale; + const d = n.hasValueTransform || defined(c) || defined(l); + c = defaultValue(c, n.offset), l = defaultValue(l, n.scale), c = n.unpackVectorAndMatrixTypes(c), l = n.unpackVectorAndMatrixTypes(l), this._offset = c, this._scale = l, this._hasValueTransform = d, this._textureReader = s, this._classProperty = n, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(PropertyTextureProperty.prototype, { + /** + * The texture reader. + * + * @memberof PropertyTextureProperty.prototype + * @type {ModelComponents.TextureReader} + * @readonly + * @private + */ + textureReader: { + get: function() { + return this._textureReader; + } + }, + /** + * True if offset/scale should be applied. If both offset/scale were + * undefined, they default to identity so this property is set false + * + * @memberof PropertyTextureProperty.prototype + * @type {boolean} + * @readonly + * @private + */ + hasValueTransform: { + get: function() { + return this._hasValueTransform; + } + }, + /** + * The offset to be added to property values as part of the value transform. + * + * @memberof PropertyTextureProperty.prototype + * @type {number|Cartesian2|Cartesian3|Cartesian4|Matrix2|Matrix3|Matrix4} + * @readonly + * @private + */ + offset: { + get: function() { + return this._offset; + } + }, + /** + * The scale to be multiplied to property values as part of the value transform. + * + * @memberof PropertyTextureProperty.prototype + * @type {number|Cartesian2|Cartesian3|Cartesian4|Matrix2|Matrix3|Matrix4} + * @readonly + * @private + */ + scale: { + get: function() { + return this._scale; + } + }, + /** + * The properties inherited from this property's class + * + * @memberof PropertyTextureProperty.prototype + * @type {MetadataClassProperty} + * @readonly + * @private + */ + classProperty: { + get: function() { + return this._classProperty; + } + }, + /** + * Extra user-defined properties. + * + * @memberof PropertyTextureProperty.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof PropertyTextureProperty.prototype + * @type {*} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +PropertyTextureProperty.prototype.isGpuCompatible = function() { + const e = this._classProperty, t = e.type, n = e.componentType; + return e.isArray ? !e.isVariableLengthArray && e.arrayLength <= 4 && t === MetadataType$1.SCALAR && n === MetadataComponentType$1.UINT8 : MetadataType$1.isVectorType(t) || t === MetadataType$1.SCALAR ? n === MetadataComponentType$1.UINT8 : !1; +}; +const floatTypesByComponentCount = [void 0, "float", "vec2", "vec3", "vec4"], integerTypesByComponentCount = [ + void 0, + "int", + "ivec2", + "ivec3", + "ivec4" +]; +PropertyTextureProperty.prototype.getGlslType = function() { + const e = this._classProperty; + let t = MetadataType$1.getComponentCount(e.type); + return e.isArray && (t = e.arrayLength), e.normalized ? floatTypesByComponentCount[t] : integerTypesByComponentCount[t]; +}; +PropertyTextureProperty.prototype.unpackInShader = function(e) { + return this._classProperty.normalized ? e : `${this.getGlslType()}(255.0 * ${e})`; +}; +function reformatChannels$1(e) { + return e.map(function(t) { + return "rgba".charAt(t); + }).join(""); +} +function PropertyTexture(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.propertyTexture, n = e.class, i = e.textures, r = t.extensions, o = t.extras, s = {}; + if (defined(t.properties)) + for (const c in t.properties) + t.properties.hasOwnProperty(c) && (s[c] = new PropertyTextureProperty({ + property: t.properties[c], + classProperty: n.properties[c], + textures: i + })); + this._name = e.name, this._id = e.id, this._class = n, this._properties = s, this._extras = o, this._extensions = r; +} +Object.defineProperties(PropertyTexture.prototype, { + /** + * A human-readable name for this texture + * + * @memberof PropertyTexture.prototype + * @type {string} + * @readonly + * @private + */ + name: { + get: function() { + return this._name; + } + }, + /** + * An identifier for this texture. Useful for debugging. + * + * @memberof PropertyTexture.prototype + * @type {string|number} + * @readonly + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The class that properties conform to. + * + * @memberof PropertyTexture.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * The properties in this property texture. + * + * @memberof PropertyTexture.prototype + * + * @type {PropertyTextureProperty} + * @readonly + * @private + */ + properties: { + get: function() { + return this._properties; + } + }, + /** + * Extra user-defined properties. + * + * @memberof PropertyTexture.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof PropertyTexture.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +PropertyTexture.prototype.getProperty = function(e) { + return this._properties[e]; +}; +function PropertyAttributeProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.property, n = e.classProperty; + this._attribute = t.attribute, this._classProperty = n, this._min = t.min, this._max = t.max; + let i = t.offset, r = t.scale; + const o = n.hasValueTransform || defined(i) || defined(r); + i = defaultValue(i, n.offset), r = defaultValue(r, n.scale), i = n.unpackVectorAndMatrixTypes(i), r = n.unpackVectorAndMatrixTypes(r), this._offset = i, this._scale = r, this._hasValueTransform = o, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(PropertyAttributeProperty.prototype, { + /** + * The attribute semantic + * + * @memberof PropertyAttributeProperty.prototype + * @type {string} + * @readonly + * @private + */ + attribute: { + get: function() { + return this._attribute; + } + }, + /** + * True if offset/scale should be applied. If both offset/scale were + * undefined, they default to identity so this property is set false + * + * @memberof MetadataClassProperty.prototype + * @type {boolean} + * @readonly + * @private + */ + hasValueTransform: { + get: function() { + return this._hasValueTransform; + } + }, + /** + * The offset to be added to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|Cartesian2|Cartesian3|Cartesian4|Matrix2|Matrix3|Matrix4} + * @readonly + * @private + */ + offset: { + get: function() { + return this._offset; + } + }, + /** + * The scale to be multiplied to property values as part of the value transform. + * + * @memberof MetadataClassProperty.prototype + * @type {number|Cartesian2|Cartesian3|Cartesian4|Matrix2|Matrix3|Matrix4} + * @readonly + * @private + */ + scale: { + get: function() { + return this._scale; + } + }, + /** + * The properties inherited from this property's class + * + * @memberof PropertyAttributeProperty.prototype + * @type {MetadataClassProperty} + * @readonly + * @private + */ + classProperty: { + get: function() { + return this._classProperty; + } + }, + /** + * Extra user-defined properties. + * + * @memberof PropertyAttributeProperty.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof PropertyAttributeProperty.prototype + * @type {*} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +function PropertyAttribute(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.propertyAttribute, n = e.class, i = {}; + if (defined(t.properties)) + for (const r in t.properties) + t.properties.hasOwnProperty(r) && (i[r] = new PropertyAttributeProperty({ + property: t.properties[r], + classProperty: n.properties[r] + })); + this._name = e.name, this._id = e.id, this._class = n, this._properties = i, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(PropertyAttribute.prototype, { + /** + * A human-readable name for this attribute + * + * @memberof PropertyAttribute.prototype + * + * @type {string} + * @readonly + * @private + */ + name: { + get: function() { + return this._name; + } + }, + /** + * An identifier for this attribute. Useful for debugging. + * + * @memberof PropertyAttribute.prototype + * + * @type {string|number} + * @readonly + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * The class that properties conform to. + * + * @memberof PropertyAttribute.prototype + * + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * The properties in this property attribute. + * + * @memberof PropertyAttribute.prototype + * + * @type {Object} + * @readonly + * @private + */ + properties: { + get: function() { + return this._properties; + } + }, + /** + * Extra user-defined properties. + * + * @memberof PropertyAttribute.prototype + * + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof PropertyAttribute.prototype + * + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +PropertyAttribute.prototype.getProperty = function(e) { + return this._properties[e]; +}; +function StructuralMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._schema = e.schema; + const t = e.propertyTables; + this._propertyTableCount = defined(t) ? t.length : 0, this._propertyTables = t, this._propertyTextures = e.propertyTextures, this._propertyAttributes = e.propertyAttributes, this._statistics = e.statistics, this._extras = e.extras, this._extensions = e.extensions; +} +Object.defineProperties(StructuralMetadata.prototype, { + /** + * Schema containing classes and enums. + * + * @memberof StructuralMetadata.prototype + * @type {MetadataSchema} + * @readonly + * @private + */ + schema: { + get: function() { + return this._schema; + } + }, + /** + * Statistics about the metadata. + *

+ * See the {@link https://github.com/CesiumGS/glTF/blob/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata/schema/statistics.schema.json|statistics schema reference} for the full set of properties. + *

+ * + * @memberof StructuralMetadata.prototype + * @type {object} + * @readonly + * @private + */ + statistics: { + get: function() { + return this._statistics; + } + }, + /** + * Extra user-defined properties. + * + * @memberof StructuralMetadata.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof StructuralMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + }, + /** + * Number of property tables in the metadata. + * + * @memberof StructuralMetadata.prototype + * @type {number} + * @readonly + * @private + */ + propertyTableCount: { + get: function() { + return this._propertyTableCount; + } + }, + /** + * The property tables in the metadata. + * + * @memberof StructuralMetadata.prototype + * @type {PropertyTable[]} + * @readonly + * @private + */ + propertyTables: { + get: function() { + return this._propertyTables; + } + }, + /** + * The property textures in the metadata. + * + * @memberof StructuralMetadata.prototype + * @type {PropertyTexture[]} + * @readonly + * @private + */ + propertyTextures: { + get: function() { + return this._propertyTextures; + } + }, + /** + * The property attributes from the structural metadata extension + * + * @memberof StructuralMetadata.prototype + * @type {PropertyAttribute[]} + * @readonly + * @private + */ + propertyAttributes: { + get: function() { + return this._propertyAttributes; + } + }, + /** + * Total size in bytes across all property tables + * + * @memberof StructuralMetadata.prototype + * @type {number} + * @readonly + * @private + */ + propertyTablesByteLength: { + get: function() { + if (!defined(this._propertyTables)) + return 0; + let e = 0; + const t = this._propertyTables.length; + for (let n = 0; n < t; n++) + e += this._propertyTables[n].byteLength; + return e; + } + } +}); +StructuralMetadata.prototype.getPropertyTable = function(e) { + return this._propertyTables[e]; +}; +StructuralMetadata.prototype.getPropertyTexture = function(e) { + return this._propertyTextures[e]; +}; +StructuralMetadata.prototype.getPropertyAttribute = function(e) { + return this._propertyAttributes[e]; +}; +function parseStructuralMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.extension, n = e.schema, i = []; + if (defined(t.propertyTables)) + for (let s = 0; s < t.propertyTables.length; s++) { + const c = t.propertyTables[s], l = n.classes[c.class], d = new MetadataTable({ + count: c.count, + properties: c.properties, + class: l, + bufferViews: e.bufferViews + }); + i.push( + new PropertyTable({ + id: s, + name: c.name, + count: c.count, + metadataTable: d, + extras: c.extras, + extensions: c.extensions + }) + ); + } + const r = []; + if (defined(t.propertyTextures)) + for (let s = 0; s < t.propertyTextures.length; s++) { + const c = t.propertyTextures[s]; + r.push( + new PropertyTexture({ + id: s, + name: c.name, + propertyTexture: c, + class: n.classes[c.class], + textures: e.textures + }) + ); + } + const o = []; + if (defined(t.propertyAttributes)) + for (let s = 0; s < t.propertyAttributes.length; s++) { + const c = t.propertyAttributes[s]; + o.push( + new PropertyAttribute({ + id: s, + name: c.name, + class: n.classes[c.class], + propertyAttribute: c + }) + ); + } + return new StructuralMetadata({ + schema: n, + propertyTables: i, + propertyTextures: r, + propertyAttributes: o, + statistics: t.statistics, + extras: t.extras, + extensions: t.extensions + }); +} +function parseFeatureMetadataLegacy(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.extension, n = e.schema; + let i; + const r = []; + let o; + if (defined(t.featureTables)) + for (o = Object.keys(t.featureTables).sort(), i = 0; i < o.length; i++) { + const c = o[i], l = t.featureTables[c], d = n.classes[l.class], f = new MetadataTable({ + count: l.count, + properties: l.properties, + class: d, + bufferViews: e.bufferViews + }); + r.push( + new PropertyTable({ + id: c, + count: l.count, + metadataTable: f, + extras: l.extras, + extensions: l.extensions + }) + ); + } + const s = []; + if (defined(t.featureTextures)) + for (o = Object.keys(t.featureTextures).sort(), i = 0; i < o.length; i++) { + const c = o[i], l = t.featureTextures[c]; + s.push( + new PropertyTexture({ + id: c, + propertyTexture: transcodeToPropertyTexture(l), + class: n.classes[l.class], + textures: e.textures + }) + ); + } + return new StructuralMetadata({ + schema: n, + propertyTables: r, + propertyTextures: s, + statistics: t.statistics, + extras: t.extras, + extensions: t.extensions + }); +} +function transcodeToPropertyTexture(e) { + const t = { + class: e.class, + properties: {} + }, n = e.properties; + for (const i in n) + if (n.hasOwnProperty(i)) { + const r = n[i], o = { + // EXT_structural_metadata uses numeric channel indices instead of + // a string of channel letters like "rgba". + channels: reformatChannels(r.channels), + extras: r.extras, + extensions: r.extensions + }; + t.properties[i] = combine$2( + r.texture, + o, + !0 + ); + } + return t; +} +function reformatChannels(e) { + const t = e.length, n = new Array(t); + for (let i = 0; i < t; i++) + n[i] = "rgba".indexOf(e[i]); + return n; +} +function GltfStructuralMetadataLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltf: t, + extension: n, + extensionLegacy: i, + gltfResource: r, + baseResource: o, + supportedImageFormats: s, + frameState: c, + cacheKey: l, + asynchronous: d = !0 + } = e; + this._gltfResource = r, this._baseResource = o, this._gltf = t, this._extension = n, this._extensionLegacy = i, this._supportedImageFormats = s, this._frameState = c, this._cacheKey = l, this._asynchronous = d, this._bufferViewLoaders = [], this._bufferViewIds = [], this._textureLoaders = [], this._textureIds = [], this._schemaLoader = void 0, this._structuralMetadata = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._promise = void 0; +} +defined(Object.create) && (GltfStructuralMetadataLoader.prototype = Object.create( + ResourceLoader.prototype +), GltfStructuralMetadataLoader.prototype.constructor = GltfStructuralMetadataLoader); +Object.defineProperties(GltfStructuralMetadataLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfStructuralMetadataLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + return this._cacheKey; + } + }, + /** + * The parsed structural metadata + * + * @memberof GltfStructuralMetadataLoader.prototype + * + * @type {StructuralMetadata} + * @readonly + * @private + */ + structuralMetadata: { + get: function() { + return this._structuralMetadata; + } + } +}); +async function loadResources$1(e) { + try { + const t = loadBufferViews(e), n = loadTextures(e), i = loadSchema(e); + return await Promise.all([t, n, i]), e.isDestroyed() ? void 0 : (e._gltf = void 0, e._state = ResourceLoaderState$1.LOADED, e); + } catch (t) { + if (e.isDestroyed()) + return; + throw e.unload(), e._state = ResourceLoaderState$1.FAILED, e.getError("Failed to load structural metadata", t); + } +} +GltfStructuralMetadataLoader.prototype.load = function() { + return defined(this._promise) ? this._promise : (this._state = ResourceLoaderState$1.LOADING, this._promise = loadResources$1(this), this._promise); +}; +function gatherBufferViewIdsFromProperties(e, t) { + for (const n in e) + if (e.hasOwnProperty(n)) { + const i = e[n], r = i.values, o = i.arrayOffsets, s = i.stringOffsets; + defined(r) && (t[r] = !0), defined(o) && (t[o] = !0), defined(s) && (t[s] = !0); + } +} +function gatherBufferViewIdsFromPropertiesLegacy(e, t) { + for (const n in e) + if (e.hasOwnProperty(n)) { + const i = e[n], r = i.bufferView, o = i.arrayOffsetBufferView, s = i.stringOffsetBufferView; + defined(r) && (t[r] = !0), defined(o) && (t[o] = !0), defined(s) && (t[s] = !0); + } +} +function gatherUsedBufferViewIds(e) { + const t = e.propertyTables, n = {}; + if (defined(t)) + for (let i = 0; i < t.length; i++) { + const r = t[i]; + gatherBufferViewIdsFromProperties( + r.properties, + n + ); + } + return n; +} +function gatherUsedBufferViewIdsLegacy(e) { + const t = e.featureTables, n = {}; + if (defined(t)) { + for (const i in t) + if (t.hasOwnProperty(i)) { + const o = t[i].properties; + defined(o) && gatherBufferViewIdsFromPropertiesLegacy(o, n); + } + } + return n; +} +async function loadBufferViews(e) { + let t; + defined(e._extension) ? t = gatherUsedBufferViewIds( + e._extension + ) : t = gatherUsedBufferViewIdsLegacy( + e._extensionLegacy + ); + const n = []; + for (const i in t) + if (t.hasOwnProperty(i)) { + const r = ResourceCache.getBufferViewLoader({ + gltf: e._gltf, + bufferViewId: parseInt(i), + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + e._bufferViewLoaders.push(r), e._bufferViewIds.push(i), n.push(r.load()); + } + return Promise.all(n); +} +function gatherUsedTextureIds(e) { + const t = {}, n = e.propertyTextures; + if (defined(n)) + for (let i = 0; i < n.length; i++) { + const o = n[i].properties; + defined(o) && gatherTextureIdsFromProperties(o, t); + } + return t; +} +function gatherTextureIdsFromProperties(e, t) { + for (const n in e) + if (e.hasOwnProperty(n)) { + const i = e[n]; + t[i.index] = i; + } +} +function gatherUsedTextureIdsLegacy(e) { + const t = {}, n = e.featureTextures; + if (defined(n)) { + for (const i in n) + if (n.hasOwnProperty(i)) { + const o = n[i].properties; + defined(o) && gatherTextureIdsFromPropertiesLegacy(o, t); + } + } + return t; +} +function gatherTextureIdsFromPropertiesLegacy(e, t) { + for (const n in e) + if (e.hasOwnProperty(n)) { + const r = e[n].texture; + t[r.index] = r; + } +} +function loadTextures(e) { + let t; + defined(e._extension) ? t = gatherUsedTextureIds(e._extension) : t = gatherUsedTextureIdsLegacy( + e._extensionLegacy + ); + const n = e._gltf, i = e._gltfResource, r = e._baseResource, o = e._supportedImageFormats, s = e._frameState, c = e._asynchronous, l = []; + for (const d in t) + if (t.hasOwnProperty(d)) { + const f = ResourceCache.getTextureLoader({ + gltf: n, + textureInfo: t[d], + gltfResource: i, + baseResource: r, + supportedImageFormats: o, + frameState: s, + asynchronous: c + }); + e._textureLoaders.push(f), e._textureIds.push(d), l.push(f.load()); + } + return Promise.all(l); +} +async function loadSchema(e) { + const t = defaultValue( + e._extension, + e._extensionLegacy + ); + let n; + if (defined(t.schemaUri)) { + const i = e._baseResource.getDerivedResource({ + url: t.schemaUri + }); + n = ResourceCache.getSchemaLoader({ + resource: i + }); + } else + n = ResourceCache.getSchemaLoader({ + schema: t.schema + }); + if (e._schemaLoader = n, await n.load(), !n.isDestroyed()) + return n.schema; +} +GltfStructuralMetadataLoader.prototype.process = function(e) { + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state !== ResourceLoaderState$1.LOADED) + return !1; + const t = this._textureLoaders, n = t.length; + let i = !0; + for (let c = 0; c < n; ++c) { + const d = t[c].process(e); + i = i && d; + } + if (!i) + return !1; + const r = this._schemaLoader.schema, o = {}; + for (let c = 0; c < this._bufferViewIds.length; ++c) { + const l = this._bufferViewIds[c], d = this._bufferViewLoaders[c]; + if (!d.isDestroyed()) { + const f = new Uint8Array(d.typedArray); + o[l] = f; + } + } + const s = {}; + for (let c = 0; c < this._textureIds.length; ++c) { + const l = this._textureIds[c], d = t[c]; + d.isDestroyed() || (s[l] = d.texture); + } + return defined(this._extension) ? this._structuralMetadata = parseStructuralMetadata({ + extension: this._extension, + schema: r, + bufferViews: o, + textures: s + }) : this._structuralMetadata = parseFeatureMetadataLegacy({ + extension: this._extensionLegacy, + schema: r, + bufferViews: o, + textures: s + }), unloadBufferViews(this), this._state = ResourceLoaderState$1.READY, !0; +}; +function unloadBufferViews(e) { + const t = e._bufferViewLoaders, n = t.length; + for (let i = 0; i < n; ++i) + ResourceCache.unload(t[i]); + e._bufferViewLoaders.length = 0, e._bufferViewIds.length = 0; +} +function unloadTextures$1(e) { + const t = e._textureLoaders, n = t.length; + for (let i = 0; i < n; ++i) + ResourceCache.unload(t[i]); + e._textureLoaders.length = 0, e._textureIds.length = 0; +} +GltfStructuralMetadataLoader.prototype.unload = function() { + unloadBufferViews(this), unloadTextures$1(this), defined(this._schemaLoader) && ResourceCache.unload(this._schemaLoader), this._schemaLoader = void 0, this._structuralMetadata = void 0; +}; +const InstanceAttributeSemantic = { + /** + * Per-instance translation. + * + * @type {string} + * @constant + */ + TRANSLATION: "TRANSLATION", + /** + * Per-instance rotation. + * + * @type {string} + * @constant + */ + ROTATION: "ROTATION", + /** + * Per-instance scale. + * + * @type {string} + * @constant + */ + SCALE: "SCALE", + /** + * Per-instance feature ID. + * + * @type {string} + * @constant + */ + FEATURE_ID: "_FEATURE_ID" +}; +InstanceAttributeSemantic.fromGltfSemantic = function(e) { + let t = e; + const i = /^(\w+)_\d+$/.exec(e); + switch (i !== null && (t = i[1]), t) { + case "TRANSLATION": + return InstanceAttributeSemantic.TRANSLATION; + case "ROTATION": + return InstanceAttributeSemantic.ROTATION; + case "SCALE": + return InstanceAttributeSemantic.SCALE; + case "_FEATURE_ID": + return InstanceAttributeSemantic.FEATURE_ID; + } +}; +const InstanceAttributeSemantic$1 = Object.freeze(InstanceAttributeSemantic), MAX_GLTF_UINT16_INDEX = 65534, MAX_GLTF_UINT8_INDEX = 255; +function PrimitiveOutlineGenerator(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.triangleIndices, n = e.outlineIndices, i = e.originalVertexCount; + this._triangleIndices = t, this._originalVertexCount = i, this._edges = new EdgeSet(n, i), this._outlineCoordinatesTypedArray = void 0, this._extraVertices = [], initialize$d(this); +} +Object.defineProperties(PrimitiveOutlineGenerator.prototype, { + /** + * The updated triangle indices after generating outlines. The caller is for + * responsible for updating the primitive's indices to use this array. + * + * @memberof PrimitiveOutlineGenerator.prototype + * + * @type {Uint8Array|Uint16Array|Uint32Array} + * @readonly + * + * @private + */ + updatedTriangleIndices: { + get: function() { + return this._triangleIndices; + } + }, + /** + * The computed outline coordinates. The caller is responsible for + * turning this into a vec3 attribute for rendering. + * + * @memberof PrimitiveOutlineGenerator.prototype + * + * @type {Float32Array} + * @readonly + * + * @private + */ + outlineCoordinates: { + get: function() { + return this._outlineCoordinatesTypedArray; + } + } +}); +function initialize$d(e) { + let t = e._triangleIndices; + const n = e._edges, i = [], r = e._extraVertices, o = e._originalVertexCount, s = {}; + for (let c = 0; c < t.length; c += 3) { + let l = t[c], d = t[c + 1], f = t[c + 2]; + const h = n.hasEdge(l, d), p = n.hasEdge(d, f), m = n.hasEdge(f, l); + let _ = matchAndStoreCoordinates( + i, + l, + d, + f, + h, + p, + m + ); + for (; defined(_); ) { + let y = s[_]; + if (!defined(y)) { + y = o + r.length; + let C = _; + for (; C >= o; ) + C = r[C - o]; + r.push(C), s[_] = y; + } + y > MAX_GLTF_UINT16_INDEX && (t instanceof Uint16Array || t instanceof Uint8Array) ? t = new Uint32Array(t) : y > MAX_GLTF_UINT8_INDEX && t instanceof Uint8Array && (t = new Uint16Array(t)), _ === l ? (l = y, t[c] = y) : _ === d ? (d = y, t[c + 1] = y) : (f = y, t[c + 2] = y), _ = matchAndStoreCoordinates( + i, + l, + d, + f, + h, + p, + m + ); + } + } + e._triangleIndices = t, e._outlineCoordinatesTypedArray = new Float32Array( + i + ); +} +function matchAndStoreCoordinates(e, t, n, i, r, o, s) { + const c = s ? 1 : 0, l = r ? 1 : 0, d = 0, f = computeOrderMask(e, t, c, l, d); + if (f === 0) + return t; + const h = 0, p = r ? 1 : 0, m = o ? 1 : 0, _ = computeOrderMask(e, n, h, p, m); + if (_ === 0) + return n; + const y = s ? 1 : 0, C = 0, T = o ? 1 : 0, x = computeOrderMask(e, i, y, C, T); + if (x === 0) + return i; + const b = f & _ & x; + let S, E, A; + if (b & 1) + S = 0, E = 1, A = 2; + else if (b & 2) + S = 0, A = 1, E = 2; + else if (b & 4) + E = 0, S = 1, A = 2; + else if (b & 8) + E = 0, A = 1, S = 2; + else if (b & 16) + A = 0, S = 1, E = 2; + else if (b & 32) + A = 0, E = 1, S = 2; + else { + const M = popcount6Bit(f), R = popcount6Bit(_), L = popcount6Bit(x); + return M < R && M < L ? t : R < L ? n : i; + } + const D = t * 3; + e[D + S] = c, e[D + E] = l, e[D + A] = d; + const P = n * 3; + e[P + S] = h, e[P + E] = p, e[P + A] = m; + const I = i * 3; + e[I + S] = y, e[I + E] = C, e[I + A] = T; +} +function computeOrderMask(e, t, n, i, r) { + const o = t * 3, s = e[o], c = e[o + 1], l = e[o + 2]; + return defined(s) ? (s === n && c === i && l === r) << 0 | (s === n && c === r && l === i) << 1 | (s === i && c === n && l === r) << 2 | (s === i && c === r && l === n) << 3 | (s === r && c === n && l === i) << 4 | (s === r && c === i && l === n) << 5 : 63; +} +function popcount6Bit(e) { + return (e & 1) + (e >> 1 & 1) + (e >> 2 & 1) + (e >> 3 & 1) + (e >> 4 & 1) + (e >> 5 & 1); +} +PrimitiveOutlineGenerator.prototype.updateAttribute = function(e) { + const t = this._extraVertices, n = e.length, i = n / this._originalVertexCount, r = t.length, o = e.constructor, s = new o( + e.length + r * i + ); + s.set(e); + for (let c = 0; c < r; c++) { + const l = t[c] * i, d = n + c * i; + for (let f = 0; f < i; f++) + s[d + f] = s[l + f]; + } + return s; +}; +PrimitiveOutlineGenerator.createTexture = function(e) { + let t = e.cache.modelOutliningCache; + if (defined(t) || (t = e.cache.modelOutliningCache = {}), defined(t.outlineTexture)) + return t.outlineTexture; + const n = Math.min(4096, ContextLimits.maximumTextureSize); + let i = n; + const r = createMipLevel(i), o = []; + for (; i > 1; ) + i >>= 1, o.push(createMipLevel(i)); + const s = new Texture({ + context: e, + source: { + arrayBufferView: r, + mipLevels: o + }, + width: n, + height: 1, + pixelFormat: PixelFormat$1.LUMINANCE, + sampler: new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }) + }); + return t.outlineTexture = s, s; +}; +function createMipLevel(e) { + const t = new Uint8Array(e); + return t[e - 1] = 192, e === 8 ? t[e - 1] = 96 : e === 4 ? t[e - 1] = 48 : e === 2 ? t[e - 1] = 24 : e === 1 && (t[e - 1] = 12), t; +} +function EdgeSet(e, t) { + this._originalVertexCount = t, this._edges = /* @__PURE__ */ new Set(); + for (let n = 0; n < e.length; n += 2) { + const i = e[n], r = e[n + 1], o = Math.min(i, r), s = Math.max(i, r), c = o * this._originalVertexCount + s; + this._edges.add(c); + } +} +EdgeSet.prototype.hasEdge = function(e, t) { + const n = Math.min(e, t), i = Math.max(e, t), r = n * this._originalVertexCount + i; + return this._edges.has(r); +}; +function AttributeLoadPlan(e) { + this.attribute = e, this.loadBuffer = !1, this.loadTypedArray = !1; +} +function IndicesLoadPlan(e) { + this.indices = e, this.loadBuffer = !1, this.loadTypedArray = !1; +} +function PrimitiveLoadPlan(e) { + this.primitive = e, this.attributePlans = [], this.indicesPlan = void 0, this.needsOutlines = !1, this.outlineIndices = void 0; +} +PrimitiveLoadPlan.prototype.postProcess = function(e) { + this.needsOutlines && (generateOutlines(this), generateBuffers(this, e)); +}; +function generateOutlines(e) { + const t = e.primitive, n = t.indices, i = t.attributes[0].count, r = new PrimitiveOutlineGenerator({ + triangleIndices: n.typedArray, + outlineIndices: e.outlineIndices, + originalVertexCount: i + }); + n.typedArray = r.updatedTriangleIndices, n.indexDatatype = IndexDatatype$1.fromTypedArray(n.typedArray); + const o = makeOutlineCoordinatesAttribute( + r.outlineCoordinates + ), s = new AttributeLoadPlan(o); + s.loadBuffer = !0, s.loadTypedArray = !1, e.attributePlans.push(s), t.outlineCoordinates = s.attribute; + const c = e.attributePlans, l = e.attributePlans.length; + for (let d = 0; d < l; d++) { + const f = c[d].attribute; + f.typedArray = r.updateAttribute(f.typedArray); + } +} +function makeOutlineCoordinatesAttribute(e) { + const t = new ModelComponents.Attribute(); + return t.name = "_OUTLINE_COORDINATES", t.typedArray = e, t.componentDatatype = ComponentDatatype$1.FLOAT, t.type = AttributeType$1.VEC3, t.normalized = !1, t.count = e.length / 3, t; +} +function generateBuffers(e, t) { + generateAttributeBuffers(e.attributePlans, t), defined(e.indicesPlan) && generateIndexBuffers(e.indicesPlan, t); +} +function generateAttributeBuffers(e, t) { + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i], o = r.attribute, s = o.typedArray; + if (r.loadBuffer) { + const c = Buffer.createVertexBuffer({ + typedArray: s, + context: t, + usage: BufferUsage$1.STATIC_DRAW + }); + c.vertexArrayDestroyable = !1, o.buffer = c; + } + r.loadTypedArray || (o.typedArray = void 0); + } +} +function generateIndexBuffers(e, t) { + const n = e.indices; + if (e.loadBuffer) { + const i = Buffer.createIndexBuffer({ + typedArray: n.typedArray, + context: t, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: n.indexDatatype + }); + n.buffer = i, i.vertexArrayDestroyable = !1; + } + e.loadTypedArray || (n.typedArray = void 0); +} +PrimitiveLoadPlan.AttributeLoadPlan = AttributeLoadPlan; +PrimitiveLoadPlan.IndicesLoadPlan = IndicesLoadPlan; +function SupportedImageFormats(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.webp = defaultValue(e.webp, !1), this.basis = defaultValue(e.basis, !1); +} +const { + Attribute: Attribute$2, + Indices, + FeatureIdAttribute: FeatureIdAttribute$3, + FeatureIdTexture, + FeatureIdImplicitRange, + MorphTarget, + Primitive: Primitive$1, + Instances: Instances$1, + Skin, + Node: Node$2, + AnimatedPropertyType: AnimatedPropertyType$1, + AnimationSampler, + AnimationTarget, + AnimationChannel, + Animation, + ArticulationStage, + Articulation, + Asset, + Scene: Scene$2, + Components: Components$1, + MetallicRoughness: MetallicRoughness$2, + SpecularGlossiness: SpecularGlossiness$1, + Specular: Specular$1, + Anisotropy, + Clearcoat: Clearcoat$1, + Material: Material$2 +} = ModelComponents, GltfLoaderState = { + /** + * The initial state of the glTF loader before load() is called. + * + * @type {number} + * @constant + * + * @private + */ + NOT_LOADED: 0, + /** + * The state of the loader while waiting for the glTF JSON loader promise + * to resolve. + * + * @type {number} + * @constant + * + * @private + */ + LOADING: 1, + /** + * The state of the loader once the glTF JSON is loaded but before + * process() is called. + * + * @type {number} + * @constant + * + * @private + */ + LOADED: 2, + /** + * The state of the loader while parsing the glTF and creating GPU resources + * as needed. + * + * @type {number} + * @constant + * + * @private + */ + PROCESSING: 3, + /** + * For some features like handling CESIUM_primitive_outlines, the geometry + * must be modified after it is loaded. The post-processing state handles + * any geometry modification (if needed). + *

+ * This state is not used for asynchronous texture loading. + *

+ * + * @type {number} + * @constant + * + * @private + */ + POST_PROCESSING: 4, + /** + * Once the processing/post-processing states are finished, the loader + * enters the processed state (sometimes from a promise chain). The next + * call to process() will advance to the ready state. + * + * @type {number} + * @constant + * + * @private + */ + PROCESSED: 5, + /** + * When the loader reaches the ready state, the loaders' promise will be + * resolved. + * + * @type {number} + * @constant + * + * @private + */ + READY: 6, + /** + * If an error occurs at any point, the loader switches to the failed state. + * + * @type {number} + * @constant + * + * @private + */ + FAILED: 7, + /** + * If unload() is called, the loader switches to the unloaded state. + * + * @type {number} + * @constant + * + * @private + */ + UNLOADED: 8 +}; +function GltfLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const { + gltfResource: t, + typedArray: n, + releaseGltfJson: i = !1, + asynchronous: r = !0, + incrementallyLoadTextures: o = !0, + upAxis: s = Axis$1.Y, + forwardAxis: c = Axis$1.Z, + loadAttributesAsTypedArray: l = !1, + loadAttributesFor2D: d = !1, + enablePick: f = !1, + loadIndicesForWireframe: h = !1, + loadPrimitiveOutline: p = !0, + loadForClassification: m = !1, + renameBatchIdSemantic: _ = !1 + } = e, { baseResource: y = t.clone() } = e; + this._gltfJson = e.gltfJson, this._gltfResource = t, this._baseResource = y, this._typedArray = n, this._releaseGltfJson = i, this._asynchronous = r, this._incrementallyLoadTextures = o, this._upAxis = s, this._forwardAxis = c, this._loadAttributesAsTypedArray = l, this._loadAttributesFor2D = d, this._enablePick = f, this._loadIndicesForWireframe = h, this._loadPrimitiveOutline = p, this._loadForClassification = m, this._renameBatchIdSemantic = _, this._sortedPropertyTableIds = void 0, this._sortedFeatureTextureIds = void 0, this._gltfJsonLoader = void 0, this._state = GltfLoaderState.NOT_LOADED, this._textureState = GltfLoaderState.NOT_LOADED, this._promise = void 0, this._processError = void 0, this._textureErrors = [], this._primitiveLoadPlans = [], this._loaderPromises = [], this._textureLoaders = [], this._texturesPromises = [], this._textureCallbacks = [], this._bufferViewLoaders = [], this._geometryLoaders = [], this._geometryCallbacks = [], this._structuralMetadataLoader = void 0, this._loadResourcesPromise = void 0, this._resourcesLoaded = !1, this._texturesLoaded = !1, this._supportedImageFormats = void 0, this._postProcessBuffers = [], this._components = void 0; +} +defined(Object.create) && (GltfLoader.prototype = Object.create(ResourceLoader.prototype), GltfLoader.prototype.constructor = GltfLoader); +Object.defineProperties(GltfLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GltfLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + } + }, + /** + * The loaded components. + * + * @memberof GltfLoader.prototype + * + * @type {ModelComponents.Components} + * @readonly + * @private + */ + components: { + get: function() { + return this._components; + } + }, + /** + * The loaded glTF json. + * + * @memberof GltfLoader.prototype + * + * @type {object} + * @readonly + * @private + */ + gltfJson: { + get: function() { + return defined(this._gltfJsonLoader) ? this._gltfJsonLoader.gltf : this._gltfJson; + } + }, + /** + * Returns true if textures are loaded separately from the other glTF resources. + * + * @memberof GltfLoader.prototype + * + * @type {boolean} + * @readonly + * @private + */ + incrementallyLoadTextures: { + get: function() { + return this._incrementallyLoadTextures; + } + }, + /** + * true if textures are loaded, useful when incrementallyLoadTextures is true + * + * @memberof GltfLoader.prototype + * + * @type {boolean} + * @readonly + * @private + */ + texturesLoaded: { + get: function() { + return this._texturesLoaded; + } + } +}); +async function loadGltfJson(e) { + e._state = GltfLoaderState.LOADING, e._textureState = GltfLoaderState.LOADING; + try { + const t = ResourceCache.getGltfJsonLoader({ + gltfResource: e._gltfResource, + baseResource: e._baseResource, + typedArray: e._typedArray, + gltfJson: e._gltfJson + }); + return e._gltfJsonLoader = t, await t.load(), e.isDestroyed() || e.isUnloaded() || t.isDestroyed() ? void 0 : (e._state = GltfLoaderState.LOADED, e._textureState = GltfLoaderState.LOADED, e); + } catch (t) { + if (e.isDestroyed()) + return; + e._state = GltfLoaderState.FAILED, e._textureState = GltfLoaderState.FAILED, handleError$5(e, t); + } +} +async function loadResources(e, t) { + FeatureDetection.supportsWebP.initialized || await FeatureDetection.supportsWebP.initialize(), e._supportedImageFormats = new SupportedImageFormats({ + webp: FeatureDetection.supportsWebP(), + basis: t.context.supportsBasis + }); + const n = parse$1(e, t); + return e._state = GltfLoaderState.PROCESSING, e._textureState = GltfLoaderState.PROCESSING, defined(e._gltfJsonLoader) && e._releaseGltfJson && (ResourceCache.unload(e._gltfJsonLoader), e._gltfJsonLoader = void 0), n; +} +GltfLoader.prototype.load = async function() { + return defined(this._promise) ? this._promise : (this._promise = loadGltfJson(this), this._promise); +}; +function handleError$5(e, t) { + throw e.unload(), e.getError("Failed to load glTF", t); +} +function processLoaders(e, t) { + let n = !0; + const i = e._geometryLoaders; + for (let o = 0; o < i.length; ++o) { + const s = i[o].process(t); + s && defined(e._geometryCallbacks[o]) && (e._geometryCallbacks[o](), e._geometryCallbacks[o] = void 0), n = n && s; + } + const r = e._structuralMetadataLoader; + if (defined(r)) { + const o = r.process(t); + o && (e._components.structuralMetadata = r.structuralMetadata), n = n && o; + } + n && (e._state = GltfLoaderState.POST_PROCESSING); +} +function postProcessGeometry(e, t) { + const n = e._primitiveLoadPlans; + for (let i = 0; i < n.length; i++) { + const r = n[i]; + r.postProcess(t), r.needsOutlines && gatherPostProcessBuffers(e, r); + } +} +function gatherPostProcessBuffers(e, t) { + const n = e._postProcessBuffers, i = t.primitive, r = i.outlineCoordinates; + defined(r) && n.push(r.buffer); + const o = i.attributes; + for (let c = 0; c < o.length; c++) { + const l = o[c]; + defined(l.buffer) && n.push(l.buffer); + } + const s = i.indices; + defined(s) && defined(s.buffer) && n.push(s.buffer); +} +GltfLoader.prototype._process = function(e) { + return this._state === GltfLoaderState.READY ? !0 : (this._state === GltfLoaderState.PROCESSING && processLoaders(this, e), this._resourcesLoaded && this._state === GltfLoaderState.POST_PROCESSING && (postProcessGeometry(this, e.context), this._state = GltfLoaderState.PROCESSED), this._resourcesLoaded && this._state === GltfLoaderState.PROCESSED ? (unloadBufferViewLoaders(this), this._typedArray = void 0, this._state = GltfLoaderState.READY, !0) : !1); +}; +GltfLoader.prototype._processTextures = function(e) { + if (this._textureState === GltfLoaderState.READY) + return !0; + if (this._textureState !== GltfLoaderState.PROCESSING) + return !1; + let t = !0; + const n = this._textureLoaders; + for (let i = 0; i < n.length; ++i) { + const r = n[i].process(e); + r && defined(this._textureCallbacks[i]) && (this._textureCallbacks[i](), this._textureCallbacks[i] = void 0), t = t && r; + } + return t ? (this._textureState = GltfLoaderState.READY, this._texturesLoaded = !0, !0) : !1; +}; +GltfLoader.prototype.process = function(e) { + if (this._state === GltfLoaderState.LOADED && !defined(this._loadResourcesPromise) && (this._loadResourcesPromise = loadResources(this, e).then(() => { + this._resourcesLoaded = !0; + }).catch((r) => { + this._processError = r; + })), defined(this._processError)) { + this._state = GltfLoaderState.FAILED; + const r = this._processError; + this._processError = void 0, handleError$5(this, r); + } + const t = this._textureErrors.pop(); + if (defined(t)) { + const r = this.getError("Failed to load glTF texture", t); + throw r.name = "TextureError", r; + } + if (this._state === GltfLoaderState.FAILED) + return !1; + let n = !1; + try { + n = this._process(e); + } catch (r) { + this._state = GltfLoaderState.FAILED, handleError$5(this, r); + } + let i = !1; + try { + i = this._processTextures(e); + } catch (r) { + this._textureState = GltfLoaderState.FAILED, handleError$5(this, r); + } + return this._incrementallyLoadTextures ? n : n && i; +}; +function getVertexBufferLoader(e, t, n, i, r, o, s) { + const c = e.gltfJson, d = c.accessors[t].bufferView; + return ResourceCache.getVertexBufferLoader({ + gltf: c, + gltfResource: e._gltfResource, + baseResource: e._baseResource, + frameState: s, + bufferViewId: d, + draco: i, + attributeSemantic: n, + accessorId: t, + asynchronous: e._asynchronous, + loadBuffer: r, + loadTypedArray: o + }); +} +function getIndexBufferLoader(e, t, n, i, r, o) { + return ResourceCache.getIndexBufferLoader({ + gltf: e.gltfJson, + accessorId: t, + gltfResource: e._gltfResource, + baseResource: e._baseResource, + frameState: o, + draco: n, + asynchronous: e._asynchronous, + loadBuffer: i, + loadTypedArray: r + }); +} +function getBufferViewLoader(e, t) { + const n = ResourceCache.getBufferViewLoader({ + gltf: e.gltfJson, + bufferViewId: t, + gltfResource: e._gltfResource, + baseResource: e._baseResource + }); + return e._bufferViewLoaders.push(n), n; +} +function getPackedTypedArray(e, t, n) { + let i = t.byteOffset; + const r = getAccessorByteStride(e, t), o = t.count, s = numberOfComponentsForType(t.type), c = t.componentType, l = ComponentDatatype$1.getSizeInBytes(c), d = l * s, f = o * s; + if (r === d) + return n = new Uint8Array(n), ComponentDatatype$1.createArrayBufferView( + c, + n.buffer, + n.byteOffset + i, + f + ); + const h = ComponentDatatype$1.createTypedArray( + c, + f + ), p = new DataView(n.buffer), m = new Array(s), _ = getComponentReader(t.componentType); + i = n.byteOffset + i; + for (let y = 0; y < o; ++y) { + _( + p, + i, + s, + l, + m + ); + for (let C = 0; C < s; ++C) + h[y * s + C] = m[C]; + i += r; + } + return h; +} +function loadDefaultAccessorValues(e, t) { + const n = e.type; + if (n === AttributeType$1.SCALAR) + return t.fill(0); + const i = AttributeType$1.getMathType(n); + return t.fill(i.clone(i.ZERO)); +} +function loadAccessorValues(e, t, n, i) { + const r = e.type, o = e.count; + if (r === AttributeType$1.SCALAR) + for (let s = 0; s < o; s++) + n[s] = t[s]; + else if (r === AttributeType$1.VEC4 && i) + for (let s = 0; s < o; s++) + n[s] = Quaternion.unpack(t, s * 4); + else { + const s = AttributeType$1.getMathType(r), c = AttributeType$1.getNumberOfComponents( + r + ); + for (let l = 0; l < o; l++) + n[l] = s.unpack(t, l * c); + } + return n; +} +async function loadAccessorBufferView(e, t, n, i, r) { + const { gltfJson: o } = e; + if (await t.load(), e.isDestroyed()) + return; + const s = getPackedTypedArray( + o, + n, + t.typedArray + ); + i = defaultValue(i, !1), loadAccessorValues(n, s, r, i); +} +function loadAccessor(e, t, n) { + const i = new Array(t.count), r = t.bufferView; + if (defined(r)) { + const o = getBufferViewLoader(e, r), s = loadAccessorBufferView( + e, + o, + t, + n, + i + ); + return e._loaderPromises.push(s), i; + } + return loadDefaultAccessorValues(t, i); +} +function fromArray(e, t) { + if (defined(t)) + return e === Number ? t[0] : e.unpack(t); +} +function getDefault(e) { + return e === Number ? 0 : new e(); +} +function getQuantizationDivisor(e) { + switch (e) { + case ComponentDatatype$1.BYTE: + return 127; + case ComponentDatatype$1.UNSIGNED_BYTE: + return 255; + case ComponentDatatype$1.SHORT: + return 32767; + case ComponentDatatype$1.UNSIGNED_SHORT: + return 65535; + default: + return 1; + } +} +const minimumBoundsByType = { + VEC2: new Cartesian2(-1, -1), + VEC3: new Cartesian3(-1, -1, -1), + VEC4: new Cartesian4(-1, -1, -1, -1) +}; +function dequantizeMinMax(e, t) { + const n = getQuantizationDivisor(e.componentDatatype), i = minimumBoundsByType[e.type]; + let r = e.min; + defined(r) && (r = t.divideByScalar(r, n, r), r = t.maximumByComponent(r, i, r)); + let o = e.max; + defined(o) && (o = t.divideByScalar(o, n, o), o = t.maximumByComponent(o, i, o)), e.min = r, e.max = o; +} +function setQuantizationFromWeb3dQuantizedAttributes(e, t, n) { + const i = e.decodeMatrix, r = fromArray(n, e.decodedMin), o = fromArray(n, e.decodedMax); + defined(r) && defined(o) && (t.min = r, t.max = o); + const s = new ModelComponents.Quantization(); + s.componentDatatype = t.componentDatatype, s.type = t.type, i.length === 4 ? (s.quantizedVolumeOffset = i[2], s.quantizedVolumeStepSize = i[0]) : i.length === 9 ? (s.quantizedVolumeOffset = new Cartesian2( + i[6], + i[7] + ), s.quantizedVolumeStepSize = new Cartesian2( + i[0], + i[4] + )) : i.length === 16 ? (s.quantizedVolumeOffset = new Cartesian3( + i[12], + i[13], + i[14] + ), s.quantizedVolumeStepSize = new Cartesian3( + i[0], + i[5], + i[10] + )) : i.length === 25 && (s.quantizedVolumeOffset = new Cartesian4( + i[20], + i[21], + i[22], + i[23] + ), s.quantizedVolumeStepSize = new Cartesian4( + i[0], + i[6], + i[12], + i[18] + )), t.quantization = s; +} +function createAttribute(e, t, n, i, r) { + var h; + const o = e.accessors[t], s = AttributeType$1.getMathType(o.type), c = defaultValue(o.normalized, !1), l = new Attribute$2(); + l.name = n, l.semantic = i, l.setIndex = r, l.constant = getDefault(s), l.componentDatatype = o.componentType, l.normalized = c, l.count = o.count, l.type = o.type, l.min = fromArray(s, o.min), l.max = fromArray(s, o.max), l.byteOffset = o.byteOffset, l.byteStride = getAccessorByteStride(e, o), hasExtension(o, "WEB3D_quantized_attributes") && setQuantizationFromWeb3dQuantizedAttributes( + o.extensions.WEB3D_quantized_attributes, + l, + s + ); + const d = l.semantic === VertexAttributeSemantic$1.POSITION || l.semantic === VertexAttributeSemantic$1.NORMAL || l.semantic === VertexAttributeSemantic$1.TANGENT || l.semantic === VertexAttributeSemantic$1.TEXCOORD; + return ((h = e.extensionsRequired) == null ? void 0 : h.includes( + "KHR_mesh_quantization" + )) && c && d && dequantizeMinMax(l, s), l; +} +function getSetIndex(e) { + const n = /^\w+_(\d+)$/.exec(e); + if (n !== null) + return parseInt(n[1]); +} +const scratchSemanticInfo = { + gltfSemantic: void 0, + renamedSemantic: void 0, + modelSemantic: void 0 +}; +function getSemanticInfo(e, t, n) { + let i = n; + e._renameBatchIdSemantic && (n === "_BATCHID" || n === "BATCHID") && (i = "_FEATURE_ID_0"); + const r = t.fromGltfSemantic(i), o = scratchSemanticInfo; + return o.gltfSemantic = n, o.renamedSemantic = i, o.modelSemantic = r, o; +} +function isClassificationAttribute(e) { + const t = e === VertexAttributeSemantic$1.POSITION, n = e === VertexAttributeSemantic$1.FEATURE_ID, i = e === VertexAttributeSemantic$1.TEXCOORD; + return t || n || i; +} +function finalizeDracoAttribute(e, t, n, i) { + if (e.byteOffset = 0, e.byteStride = void 0, e.quantization = t.quantization, n && (e.buffer = t.buffer), i) { + const r = defined(t.quantization) ? t.quantization.componentDatatype : e.componentDatatype; + e.typedArray = ComponentDatatype$1.createArrayBufferView( + r, + t.typedArray.buffer + ); + } +} +function finalizeAttribute(e, t, n, i, r, o) { + if (r && (n.buffer = i.buffer), o) { + const s = i.typedArray; + n.typedArray = getPackedTypedArray( + e, + t, + s + ), r || (n.byteOffset = 0, n.byteStride = void 0); + } +} +function loadAttribute(e, t, n, i, r, o, s) { + const c = e.gltfJson, l = c.accessors[t], d = l.bufferView, f = n.gltfSemantic, h = n.renamedSemantic, p = n.modelSemantic, m = defined(p) ? getSetIndex(h) : void 0, y = createAttribute( + c, + t, + f, + p, + m + ); + if (!defined(i) && !defined(d)) + return y; + const C = getVertexBufferLoader( + e, + t, + f, + i, + r, + o, + s + ), T = e._geometryLoaders.length; + e._geometryLoaders.push(C); + const x = C.load(); + return e._loaderPromises.push(x), e._geometryCallbacks[T] = () => { + defined(i) && defined(i.attributes) && defined(i.attributes[f]) ? finalizeDracoAttribute( + y, + C, + r, + o + ) : finalizeAttribute( + c, + l, + y, + C, + r, + o + ); + }, y; +} +function loadVertexAttribute(e, t, n, i, r, o, s) { + const c = n.modelSemantic, l = c === VertexAttributeSemantic$1.POSITION, d = c === VertexAttributeSemantic$1.FEATURE_ID, f = l && !r && e._loadAttributesFor2D && !s.scene3DOnly, h = l && e._enablePick && !s.context.webgl2, p = e._loadForClassification && d, m = e._loadAttributesAsTypedArray, _ = !m, y = m || f || h || p, x = loadAttribute( + e, + t, + n, + i, + o ? !1 : _, + o ? !0 : y, + s + ), b = new PrimitiveLoadPlan.AttributeLoadPlan(x); + return b.loadBuffer = _, b.loadTypedArray = y, b; +} +function loadInstancedAttribute(e, t, n, i, r) { + const o = e.gltfJson.accessors, s = defined(n.ROTATION), c = defined(n.TRANSLATION) && defined(o[n.TRANSLATION].min) && defined(o[n.TRANSLATION].max), l = getSemanticInfo( + e, + InstanceAttributeSemantic$1, + i + ), d = l.modelSemantic, f = d === InstanceAttributeSemantic$1.TRANSLATION || d === InstanceAttributeSemantic$1.ROTATION || d === InstanceAttributeSemantic$1.SCALE, h = d === InstanceAttributeSemantic$1.TRANSLATION, p = e._loadAttributesAsTypedArray || s && f || !r.context.instancedArrays, m = e._enablePick && !r.context.webgl2, _ = !p, y = e._loadAttributesFor2D && !r.scene3DOnly; + return loadAttribute( + e, + t, + l, + void 0, + _, + p || h && (!c || y || m), + r + ); +} +function loadIndices(e, t, n, i, r, o) { + const s = e.gltfJson.accessors[t], c = s.bufferView; + if (!defined(n) && !defined(c)) + return; + const l = new Indices(); + l.count = s.count; + const d = e._loadAttributesAsTypedArray, f = (e._loadIndicesForWireframe || e._enablePick) && !o.context.webgl2, h = e._loadForClassification && i, m = !d, _ = d || f || h, T = getIndexBufferLoader( + e, + t, + n, + r ? !1 : m, + r ? !0 : _, + o + ), x = e._geometryLoaders.length; + e._geometryLoaders.push(T); + const b = T.load(); + e._loaderPromises.push(b), e._geometryCallbacks[x] = () => { + l.indexDatatype = T.indexDatatype, l.buffer = T.buffer, l.typedArray = T.typedArray; + }; + const S = new PrimitiveLoadPlan.IndicesLoadPlan(l); + return S.loadBuffer = m, S.loadTypedArray = _, S; +} +function loadTexture(e, t, n, i) { + const r = e.gltfJson, o = GltfLoaderUtil.getImageIdFromTexture({ + gltf: r, + textureId: t.index, + supportedImageFormats: e._supportedImageFormats + }); + if (!defined(o)) + return; + const s = ResourceCache.getTextureLoader({ + gltf: r, + textureInfo: t, + gltfResource: e._gltfResource, + baseResource: e._baseResource, + supportedImageFormats: e._supportedImageFormats, + frameState: n, + asynchronous: e._asynchronous + }), c = GltfLoaderUtil.createModelTextureReader({ + textureInfo: t + }), l = e._textureLoaders.length; + e._textureLoaders.push(s); + const d = s.load().catch((f) => { + if (!e.isDestroyed()) { + if (!e._incrementallyLoadTextures) + throw f; + e._textureState = GltfLoaderState.FAILED, e._textureErrors.push(f); + } + }); + return e._texturesPromises.push(d), e._textureCallbacks[l] = () => { + c.texture = s.texture, defined(i) && (c.texture.sampler = i); + }, c; +} +function loadSpecularGlossiness(e, t, n) { + const { + diffuseTexture: i, + specularGlossinessTexture: r, + diffuseFactor: o, + specularFactor: s, + glossinessFactor: c + } = t, l = new SpecularGlossiness$1(); + return defined(i) && (l.diffuseTexture = loadTexture( + e, + i, + n + )), defined(r) && (l.specularGlossinessTexture = loadTexture( + e, + r, + n + )), l.diffuseFactor = fromArray(Cartesian4, o), l.specularFactor = fromArray(Cartesian3, s), l.glossinessFactor = c, l; +} +function loadMetallicRoughness(e, t, n) { + const { + baseColorTexture: i, + metallicRoughnessTexture: r, + baseColorFactor: o, + metallicFactor: s, + roughnessFactor: c + } = t, l = new MetallicRoughness$2(); + return defined(i) && (l.baseColorTexture = loadTexture( + e, + i, + n + )), defined(r) && (l.metallicRoughnessTexture = loadTexture( + e, + r, + n + )), l.baseColorFactor = fromArray(Cartesian4, o), l.metallicFactor = s, l.roughnessFactor = c, l; +} +function loadSpecular(e, t, n) { + const { + specularFactor: i, + specularTexture: r, + specularColorFactor: o, + specularColorTexture: s + } = t, c = new Specular$1(); + return defined(r) && (c.specularTexture = loadTexture(e, r, n)), defined(s) && (c.specularColorTexture = loadTexture( + e, + s, + n + )), c.specularFactor = i, c.specularColorFactor = fromArray(Cartesian3, o), c; +} +function loadAnisotropy(e, t, n) { + const { + anisotropyStrength: i = Anisotropy.DEFAULT_ANISOTROPY_STRENGTH, + anisotropyRotation: r = Anisotropy.DEFAULT_ANISOTROPY_ROTATION, + anisotropyTexture: o + } = t, s = new Anisotropy(); + return defined(o) && (s.anisotropyTexture = loadTexture( + e, + o, + n + )), s.anisotropyStrength = i, s.anisotropyRotation = r, s; +} +function loadClearcoat(e, t, n) { + const { + clearcoatFactor: i = Clearcoat$1.DEFAULT_CLEARCOAT_FACTOR, + clearcoatTexture: r, + clearcoatRoughnessFactor: o = Clearcoat$1.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR, + clearcoatRoughnessTexture: s, + clearcoatNormalTexture: c + } = t, l = new Clearcoat$1(); + return defined(r) && (l.clearcoatTexture = loadTexture( + e, + r, + n + )), defined(s) && (l.clearcoatRoughnessTexture = loadTexture( + e, + s, + n + )), defined(c) && (l.clearcoatNormalTexture = loadTexture( + e, + c, + n + )), l.clearcoatFactor = i, l.clearcoatRoughnessFactor = o, l; +} +function loadMaterial(e, t, n) { + const i = new Material$2(), r = defaultValue( + t.extensions, + defaultValue.EMPTY_OBJECT + ), o = r.KHR_materials_pbrSpecularGlossiness, s = r.KHR_materials_specular, c = r.KHR_materials_anisotropy, l = r.KHR_materials_clearcoat, d = t.pbrMetallicRoughness; + return i.unlit = defined(r.KHR_materials_unlit), defined(o) ? i.specularGlossiness = loadSpecularGlossiness( + e, + o, + n + ) : (defined(d) && (i.metallicRoughness = loadMetallicRoughness( + e, + d, + n + )), defined(s) && !i.unlit && (i.specular = loadSpecular(e, s, n)), defined(c) && !i.unlit && (i.anisotropy = loadAnisotropy(e, c, n)), defined(l) && !i.unlit && (i.clearcoat = loadClearcoat(e, l, n))), defined(t.emissiveTexture) && (i.emissiveTexture = loadTexture( + e, + t.emissiveTexture, + n + )), defined(t.normalTexture) && !e._loadForClassification && (i.normalTexture = loadTexture( + e, + t.normalTexture, + n + )), defined(t.occlusionTexture) && (i.occlusionTexture = loadTexture( + e, + t.occlusionTexture, + n + )), i.emissiveFactor = fromArray(Cartesian3, t.emissiveFactor), i.alphaMode = t.alphaMode, i.alphaCutoff = t.alphaCutoff, i.doubleSided = t.doubleSided, i; +} +function loadFeatureIdAttribute(e, t) { + const n = new FeatureIdAttribute$3(); + return n.featureCount = e.featureCount, n.nullFeatureId = e.nullFeatureId, n.propertyTableId = e.propertyTable, n.setIndex = e.attribute, n.label = e.label, n.positionalLabel = t, n; +} +function loadFeatureIdAttributeLegacy(e, t, n, i) { + const r = new FeatureIdAttribute$3(), o = e.featureIds; + return r.featureCount = n, r.propertyTableId = t, r.setIndex = getSetIndex(o.attribute), r.positionalLabel = i, r; +} +function loadDefaultFeatureIds(e, t) { + const n = new FeatureIdImplicitRange(); + return n.propertyTableId = e.propertyTable, n.featureCount = e.featureCount, n.nullFeatureId = e.nullFeatureId, n.label = e.label, n.positionalLabel = t, n.offset = 0, n.repeat = 1, n; +} +function loadFeatureIdImplicitRangeLegacy(e, t, n, i) { + const r = new FeatureIdImplicitRange(), o = e.featureIds; + r.propertyTableId = t, r.featureCount = n, r.offset = defaultValue(o.constant, 0); + const s = defaultValue(o.divisor, 0); + return r.repeat = s === 0 ? void 0 : s, r.positionalLabel = i, r; +} +function loadFeatureIdTexture(e, t, n, i) { + const r = new FeatureIdTexture(); + r.featureCount = t.featureCount, r.nullFeatureId = t.nullFeatureId, r.propertyTableId = t.propertyTable, r.label = t.label, r.positionalLabel = i; + const o = t.texture; + r.textureReader = loadTexture( + e, + o, + n, + Sampler.NEAREST + // Feature ID textures require nearest sampling + ); + const c = (defined(o.channels) ? o.channels : [0]).map(function(l) { + return "rgba".charAt(l); + }).join(""); + return r.textureReader.channels = c, r; +} +function loadFeatureIdTextureLegacy(e, t, n, i, r, o) { + const s = new FeatureIdTexture(), c = t.featureIds, l = c.texture; + return s.featureCount = r, s.propertyTableId = n, s.textureReader = loadTexture( + e, + l, + i, + Sampler.NEAREST + // Feature ID textures require nearest sampling + ), s.textureReader.channels = c.channels, s.positionalLabel = o, s; +} +function loadMorphTarget(e, t, n, i, r) { + const o = new MorphTarget(), s = void 0, c = !1; + for (const l in t) { + if (!t.hasOwnProperty(l)) + continue; + const d = t[l], f = getSemanticInfo( + e, + VertexAttributeSemantic$1, + l + ), h = loadVertexAttribute( + e, + d, + f, + s, + c, + n, + r + ); + o.attributes.push(h.attribute), i.attributePlans.push(h); + } + return o; +} +function loadPrimitive(e, t, n, i) { + const r = new Primitive$1(), o = new PrimitiveLoadPlan(r); + e._primitiveLoadPlans.push(o); + const s = t.material; + defined(s) && (r.material = loadMaterial( + e, + e.gltfJson.materials[s], + i + )); + const c = defaultValue( + t.extensions, + defaultValue.EMPTY_OBJECT + ); + let l = !1; + const d = c.CESIUM_primitive_outline; + e._loadPrimitiveOutline && defined(d) && (l = !0, o.needsOutlines = !0, o.outlineIndices = loadPrimitiveOutline( + e, + d + )); + const f = e._loadForClassification, h = c.KHR_draco_mesh_compression; + let p = !1; + const m = t.attributes; + if (defined(m)) + for (const E in m) { + if (!m.hasOwnProperty(E)) + continue; + const A = m[E], D = getSemanticInfo( + e, + VertexAttributeSemantic$1, + E + ), P = D.modelSemantic; + if (f && !isClassificationAttribute(P)) + continue; + P === VertexAttributeSemantic$1.FEATURE_ID && (p = !0); + const I = loadVertexAttribute( + e, + A, + D, + h, + n, + l, + i + ); + o.attributePlans.push(I), r.attributes.push(I.attribute); + } + const _ = t.targets; + if (defined(_) && !f) + for (let E = 0; E < _.length; ++E) + r.morphTargets.push( + loadMorphTarget( + e, + _[E], + l, + o, + i + ) + ); + const y = t.indices; + if (defined(y)) { + const E = loadIndices( + e, + y, + h, + p, + l, + i + ); + defined(E) && (o.indicesPlan = E, r.indices = E.indices); + } + const C = c.EXT_structural_metadata, T = c.EXT_mesh_features, x = c.EXT_feature_metadata, b = defined(x); + defined(T) ? loadPrimitiveFeatures(e, r, T, i) : b && loadPrimitiveFeaturesLegacy( + e, + r, + x, + i + ), defined(C) ? loadPrimitiveMetadata(r, C) : b && loadPrimitiveMetadataLegacy(e, r, x); + const S = t.mode; + if (f && S !== PrimitiveType$1.TRIANGLES) + throw new RuntimeError( + "Only triangle meshes can be used for classification." + ); + return r.primitiveType = S, r; +} +function loadPrimitiveOutline(e, t) { + const n = t.indices, i = e.gltfJson.accessors[n]; + return loadAccessor(e, i, !1); +} +function loadPrimitiveFeatures(e, t, n, i) { + let r; + defined(n) && defined(n.featureIds) ? r = n.featureIds : r = []; + for (let o = 0; o < r.length; o++) { + const s = r[o], c = `featureId_${o}`; + let l; + defined(s.texture) ? l = loadFeatureIdTexture( + e, + s, + i, + c + ) : defined(s.attribute) ? l = loadFeatureIdAttribute(s, c) : l = loadDefaultFeatureIds(s, c), t.featureIds.push(l); + } +} +function loadPrimitiveFeaturesLegacy(e, t, n, i) { + const { featureTables: r } = e.gltfJson.extensions.EXT_feature_metadata; + let o = 0; + const s = n.featureIdAttributes; + if (defined(s)) + for (let l = 0; l < s.length; ++l) { + const d = s[l], f = d.featureTable, h = e._sortedPropertyTableIds.indexOf( + f + ), p = r[f].count, m = `featureId_${o}`; + o++; + let _; + defined(d.featureIds.attribute) ? _ = loadFeatureIdAttributeLegacy( + d, + h, + p, + m + ) : _ = loadFeatureIdImplicitRangeLegacy( + d, + h, + p, + m + ), t.featureIds.push(_); + } + const c = n.featureIdTextures; + if (defined(c)) + for (let l = 0; l < c.length; ++l) { + const d = c[l], f = d.featureTable, h = e._sortedPropertyTableIds.indexOf( + f + ), p = r[f].count, m = `featureId_${o}`; + o++; + const _ = loadFeatureIdTextureLegacy( + e, + d, + h, + i, + p, + m + ); + t.featureIds.push(_); + } +} +function loadPrimitiveMetadata(e, t) { + defined(t) && (defined(t.propertyTextures) && (e.propertyTextureIds = t.propertyTextures), defined(t.propertyAttributes) && (e.propertyAttributeIds = t.propertyAttributes)); +} +function loadPrimitiveMetadataLegacy(e, t, n) { + defined(n.featureTextures) && (t.propertyTextureIds = n.featureTextures.map( + function(i) { + return e._sortedFeatureTextureIds.indexOf(i); + } + )); +} +function loadInstances(e, t, n) { + const i = t.EXT_mesh_gpu_instancing, r = new Instances$1(), o = i.attributes; + if (defined(o)) + for (const d in o) { + if (!o.hasOwnProperty(d)) + continue; + const f = o[d]; + r.attributes.push( + loadInstancedAttribute( + e, + f, + o, + d, + n + ) + ); + } + const s = defaultValue( + i.extensions, + defaultValue.EMPTY_OBJECT + ), c = t.EXT_instance_features, l = s.EXT_feature_metadata; + return defined(c) ? loadInstanceFeatures(r, c) : defined(l) && loadInstanceFeaturesLegacy( + e.gltfJson, + r, + l, + e._sortedPropertyTableIds + ), r; +} +function loadInstanceFeatures(e, t) { + const n = t.featureIds; + for (let i = 0; i < n.length; i++) { + const r = n[i], o = `instanceFeatureId_${i}`; + let s; + defined(r.attribute) ? s = loadFeatureIdAttribute(r, o) : s = loadDefaultFeatureIds(r, o), e.featureIds.push(s); + } +} +function loadInstanceFeaturesLegacy(e, t, n, i) { + const r = e.extensions.EXT_feature_metadata.featureTables, o = n.featureIdAttributes; + if (defined(o)) + for (let s = 0; s < o.length; ++s) { + const c = o[s], l = c.featureTable, d = i.indexOf(l), f = r[l].count, h = `instanceFeatureId_${s}`; + let p; + defined(c.featureIds.attribute) ? p = loadFeatureIdAttributeLegacy( + c, + d, + f, + h + ) : p = loadFeatureIdImplicitRangeLegacy( + c, + d, + f, + h + ), t.featureIds.push(p); + } +} +function loadNode(e, t, n) { + const i = new Node$2(); + i.name = t.name, i.matrix = fromArray(Matrix4, t.matrix), i.translation = fromArray(Cartesian3, t.translation), i.rotation = fromArray(Quaternion, t.rotation), i.scale = fromArray(Cartesian3, t.scale); + const r = defaultValue( + t.extensions, + defaultValue.EMPTY_OBJECT + ), o = r.EXT_mesh_gpu_instancing, s = r.AGI_articulations; + if (defined(o)) { + if (e._loadForClassification) + throw new RuntimeError( + "Models with the EXT_mesh_gpu_instancing extension cannot be used for classification." + ); + i.instances = loadInstances(e, r, n); + } + defined(s) && (i.articulationName = s.articulationName); + const c = t.mesh; + if (defined(c)) { + const l = e.gltfJson.meshes[c], d = l.primitives; + for (let p = 0; p < d.length; ++p) + i.primitives.push( + loadPrimitive( + e, + d[p], + defined(i.instances), + n + ) + ); + const f = defaultValue(t.weights, l.weights), h = i.primitives[0].morphTargets; + i.morphWeights = defined(f) ? f.slice() : new Array(h.length).fill(0); + } + return i; +} +function loadNodes(e, t) { + const n = e.gltfJson.nodes; + if (!defined(n)) + return []; + const i = n.map(function(r, o) { + const s = loadNode(e, r, t); + return s.index = o, s; + }); + for (let r = 0; r < i.length; ++r) { + const o = n[r].children; + if (defined(o)) + for (let s = 0; s < o.length; ++s) + i[r].children.push(i[o[s]]); + } + return i; +} +function loadSkin(e, t, n) { + const i = new Skin(), r = t.joints; + i.joints = r.map((s) => n[s]); + const o = t.inverseBindMatrices; + if (defined(o)) { + const s = e.gltfJson.accessors[o]; + i.inverseBindMatrices = loadAccessor(e, s); + } else + i.inverseBindMatrices = new Array(r.length).fill( + Matrix4.IDENTITY + ); + return i; +} +function loadSkins(e, t) { + const n = e.gltfJson.skins; + if (e._loadForClassification || !defined(n)) + return []; + const i = n.map(function(o, s) { + const c = loadSkin(e, o, t); + return c.index = s, c; + }), r = e.gltfJson.nodes; + for (let o = 0; o < t.length; ++o) { + const s = r[o].skin; + defined(s) && (t[o].skin = i[s]); + } + return i; +} +async function loadStructuralMetadata(e, t, n, i) { + const r = new GltfStructuralMetadataLoader({ + gltf: e.gltfJson, + extension: t, + extensionLegacy: n, + gltfResource: e._gltfResource, + baseResource: e._baseResource, + supportedImageFormats: e._supportedImageFormats, + frameState: i, + asynchronous: e._asynchronous + }); + return e._structuralMetadataLoader = r, r.load(); +} +function loadAnimationSampler(e, t) { + const n = new AnimationSampler(), i = e.gltfJson.accessors, r = i[t.input]; + n.input = loadAccessor(e, r); + const o = t.interpolation; + n.interpolation = defaultValue( + InterpolationType$1[o], + InterpolationType$1.LINEAR + ); + const s = i[t.output]; + return n.output = loadAccessor(e, s, !0), n; +} +function loadAnimationTarget(e, t) { + const n = new AnimationTarget(), i = e.node; + if (!defined(i)) + return; + n.node = t[i]; + const r = e.path.toUpperCase(); + return n.path = AnimatedPropertyType$1[r], n; +} +function loadAnimationChannel(e, t, n) { + const i = new AnimationChannel(), r = e.sampler; + return i.sampler = t[r], i.target = loadAnimationTarget(e.target, n), i; +} +function loadAnimation(e, t, n) { + const i = new Animation(); + i.name = t.name; + const r = t.samplers.map(function(s, c) { + const l = loadAnimationSampler(e, s); + return l.index = c, l; + }), o = t.channels.map(function(s) { + return loadAnimationChannel(s, r, n); + }); + return i.samplers = r, i.channels = o, i; +} +function loadAnimations(e, t) { + const n = e.gltfJson.animations; + return e._loadForClassification || !defined(n) ? [] : n.map(function(r, o) { + const s = loadAnimation(e, r, t); + return s.index = o, s; + }); +} +function loadArticulationStage(e) { + const t = new ArticulationStage(); + t.name = e.name; + const n = e.type.toUpperCase(); + return t.type = ArticulationStageType$1[n], t.minimumValue = e.minimumValue, t.maximumValue = e.maximumValue, t.initialValue = e.initialValue, t; +} +function loadArticulation(e) { + const t = new Articulation(); + return t.name = e.name, t.stages = e.stages.map(loadArticulationStage), t; +} +function loadArticulations(e) { + var i; + const n = (i = defaultValue(e.extensions, defaultValue.EMPTY_OBJECT).AGI_articulations) == null ? void 0 : i.articulations; + return defined(n) ? n.map(loadArticulation) : []; +} +function getSceneNodeIds(e) { + let t; + return defined(e.scenes) && defined(e.scene) && (t = e.scenes[e.scene].nodes), t = defaultValue(t, e.nodes), t = defined(t) ? t : [], t; +} +function loadScene(e, t) { + const n = new Scene$2(), i = getSceneNodeIds(e); + return n.nodes = i.map(function(r) { + return t[r]; + }), n; +} +const scratchCenter$8 = new Cartesian3(); +function parse$1(e, t) { + const n = e.gltfJson, i = defaultValue(n.extensions, defaultValue.EMPTY_OBJECT), r = i.EXT_structural_metadata, o = i.EXT_feature_metadata, s = i.CESIUM_RTC; + if (defined(o)) { + const C = o.featureTables, T = o.featureTextures, x = defined(C) ? C : [], b = defined(T) ? T : []; + e._sortedPropertyTableIds = Object.keys(x).sort(), e._sortedFeatureTextureIds = Object.keys(b).sort(); + } + const c = loadNodes(e, t), l = loadSkins(e, c), d = loadAnimations(e, c), f = loadArticulations(n), h = loadScene(n, c), p = new Components$1(), m = new Asset(), _ = n.asset.copyright; + if (defined(_)) { + const C = _.split(";").map(function(T) { + return new Credit(T.trim()); + }); + m.credits = C; + } + if (p.asset = m, p.scene = h, p.nodes = c, p.skins = l, p.animations = d, p.articulations = f, p.upAxis = e._upAxis, p.forwardAxis = e._forwardAxis, defined(s)) { + const C = Cartesian3.fromArray( + s.center, + 0, + scratchCenter$8 + ); + p.transform = Matrix4.fromTranslation( + C, + p.transform + ); + } + if (e._components = p, defined(r) || defined(o)) { + const C = loadStructuralMetadata( + e, + r, + o, + t + ); + e._loaderPromises.push(C); + } + const y = []; + return y.push.apply(y, e._loaderPromises), e._incrementallyLoadTextures || y.push.apply(y, e._texturesPromises), Promise.all(y); +} +function unloadTextures(e) { + const t = e._textureLoaders; + for (let n = 0; n < t.length; ++n) + t[n] = !t[n].isDestroyed() && ResourceCache.unload(t[n]); + e._textureLoaders.length = 0; +} +function unloadBufferViewLoaders(e) { + const t = e._bufferViewLoaders; + for (let n = 0; n < t.length; ++n) + t[n] = !t[n].isDestroyed() && ResourceCache.unload(t[n]); + e._bufferViewLoaders.length = 0; +} +function unloadGeometry(e) { + const t = e._geometryLoaders; + for (let n = 0; n < t.length; ++n) + t[n] = !t[n].isDestroyed() && ResourceCache.unload(t[n]); + e._geometryLoaders.length = 0; +} +function unloadGeneratedAttributes(e) { + const t = e._postProcessBuffers; + for (let n = 0; n < t.length; n++) { + const i = t[n]; + i.isDestroyed() || i.destroy(); + } + t.length = 0; +} +function unloadStructuralMetadata(e) { + defined(e._structuralMetadataLoader) && !e._structuralMetadataLoader.isDestroyed() && (e._structuralMetadataLoader.destroy(), e._structuralMetadataLoader = void 0); +} +GltfLoader.prototype.isUnloaded = function() { + return this._state === GltfLoaderState.UNLOADED; +}; +GltfLoader.prototype.unload = function() { + defined(this._gltfJsonLoader) && !this._gltfJsonLoader.isDestroyed() && ResourceCache.unload(this._gltfJsonLoader), this._gltfJsonLoader = void 0, unloadTextures(this), unloadBufferViewLoaders(this), unloadGeometry(this), unloadGeneratedAttributes(this), unloadStructuralMetadata(this), this._components = void 0, this._typedArray = void 0, this._state = GltfLoaderState.UNLOADED; +}; +const PointCloudEyeDomeLightingShader = `uniform sampler2D u_pointCloud_colorGBuffer; +uniform sampler2D u_pointCloud_depthGBuffer; +uniform vec2 u_distanceAndEdlStrength; +in vec2 v_textureCoordinates; + +vec2 neighborContribution(float log2Depth, vec2 offset) +{ + float dist = u_distanceAndEdlStrength.x; + vec2 texCoordOrig = v_textureCoordinates + offset * dist; + vec2 texCoord0 = v_textureCoordinates + offset * floor(dist); + vec2 texCoord1 = v_textureCoordinates + offset * ceil(dist); + + float depthOrLogDepth0 = czm_unpackDepth(texture(u_pointCloud_depthGBuffer, texCoord0)); + float depthOrLogDepth1 = czm_unpackDepth(texture(u_pointCloud_depthGBuffer, texCoord1)); + + // ignore depth values that are the clear depth + if (depthOrLogDepth0 == 0.0 || depthOrLogDepth1 == 0.0) { + return vec2(0.0); + } + + // interpolate the two adjacent depth values + float depthMix = mix(depthOrLogDepth0, depthOrLogDepth1, fract(dist)); + vec4 eyeCoordinate = czm_windowToEyeCoordinates(texCoordOrig, depthMix); + return vec2(max(0.0, log2Depth - log2(-eyeCoordinate.z / eyeCoordinate.w)), 1.0); +} + +void main() +{ + float depthOrLogDepth = czm_unpackDepth(texture(u_pointCloud_depthGBuffer, v_textureCoordinates)); + + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depthOrLogDepth); + eyeCoordinate /= eyeCoordinate.w; + + float log2Depth = log2(-eyeCoordinate.z); + + if (depthOrLogDepth == 0.0) // 0.0 is the clear value for the gbuffer + { + discard; + } + + vec4 color = texture(u_pointCloud_colorGBuffer, v_textureCoordinates); + + // sample from neighbors left, right, down, up + vec2 texelSize = 1.0 / czm_viewport.zw; + + vec2 responseAndCount = vec2(0.0); + + responseAndCount += neighborContribution(log2Depth, vec2(-texelSize.x, 0.0)); + responseAndCount += neighborContribution(log2Depth, vec2(+texelSize.x, 0.0)); + responseAndCount += neighborContribution(log2Depth, vec2(0.0, -texelSize.y)); + responseAndCount += neighborContribution(log2Depth, vec2(0.0, +texelSize.y)); + + float response = responseAndCount.x / responseAndCount.y; + float strength = u_distanceAndEdlStrength.y; + float shade = exp(-response * 300.0 * strength); + color.rgb *= shade; + out_FragColor = vec4(color); + + // Input and output depth are the same. + gl_FragDepth = depthOrLogDepth; +} +`; +function PointCloudEyeDomeLighting() { + this._framebuffer = new FramebufferManager({ + colorAttachmentsLength: 2, + depth: !0, + supportsDepthTexture: !0 + }), this._drawCommand = void 0, this._clearCommand = void 0, this._strength = 1, this._radius = 1; +} +Object.defineProperties(PointCloudEyeDomeLighting.prototype, { + framebuffer: { + get: function() { + return this._framebuffer.framebuffer; + } + }, + colorGBuffer: { + get: function() { + return this._framebuffer.getColorTexture(0); + } + }, + depthGBuffer: { + get: function() { + return this._framebuffer.getColorTexture(1); + } + } +}); +function destroyFramebuffer$1(e) { + e._framebuffer.destroy(), e._drawCommand = void 0, e._clearCommand = void 0; +} +const distanceAndEdlStrengthScratch = new Cartesian2(); +function createCommands$1(e, t) { + const n = new ShaderSource({ + defines: ["LOG_DEPTH_WRITE"], + sources: [PointCloudEyeDomeLightingShader] + }), i = { + u_pointCloud_colorGBuffer: function() { + return e.colorGBuffer; + }, + u_pointCloud_depthGBuffer: function() { + return e.depthGBuffer; + }, + u_distanceAndEdlStrength: function() { + return distanceAndEdlStrengthScratch.x = e._radius, distanceAndEdlStrengthScratch.y = e._strength, distanceAndEdlStrengthScratch; + } + }, r = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND, + depthMask: !0, + depthTest: { + enabled: !0 + }, + stencilTest: StencilConstants$1.setCesium3DTileBit(), + stencilMask: StencilConstants$1.CESIUM_3D_TILE_MASK + }); + e._drawCommand = t.createViewportQuadCommand(n, { + uniformMap: i, + renderState: r, + pass: Pass$1.CESIUM_3D_TILE, + owner: e + }), e._clearCommand = new ClearCommand({ + framebuffer: e.framebuffer, + color: new Color(0, 0, 0, 0), + depth: 1, + renderState: RenderState.fromCache(), + pass: Pass$1.CESIUM_3D_TILE, + owner: e + }); +} +function createResources$3(e, t) { + const n = t.drawingBufferWidth, i = t.drawingBufferHeight; + e._framebuffer.update(t, n, i), createCommands$1(e, t); +} +function isSupported(e) { + return e.drawBuffers && e.fragmentDepth; +} +PointCloudEyeDomeLighting.isSupported = isSupported; +function getECShaderProgram(e, t) { + let n = e.shaderCache.getDerivedShaderProgram(t, "EC"); + if (!defined(n)) { + const i = t._attributeLocations, r = t.fragmentShaderSource.clone(); + r.sources.splice( + 0, + 0, + `layout (location = 0) out vec4 out_FragData_0; +layout (location = 1) out vec4 out_FragData_1;` + ), r.sources = r.sources.map(function(o) { + return o = ShaderSource.replaceMain( + o, + "czm_point_cloud_post_process_main" + ), o = o.replaceAll(/out_FragColor/g, "out_FragData_0"), o; + }), r.sources.push( + `void main() +{ + czm_point_cloud_post_process_main(); +#ifdef LOG_DEPTH + czm_writeLogDepth(); + out_FragData_1 = czm_packDepth(gl_FragDepth); +#else + out_FragData_1 = czm_packDepth(gl_FragCoord.z); +#endif +}` + ), n = e.shaderCache.createDerivedShaderProgram( + t, + "EC", + { + vertexShaderSource: t.vertexShaderSource, + fragmentShaderSource: r, + attributeLocations: i + } + ); + } + return n; +} +PointCloudEyeDomeLighting.prototype.update = function(e, t, n, i) { + if (!isSupported(e.context)) + return; + this._strength = n.eyeDomeLightingStrength, this._radius = n.eyeDomeLightingRadius * e.pixelRatio, createResources$3(this, e.context); + let r; + const o = e.commandList, s = o.length; + for (r = t; r < s; ++r) { + const d = o[r]; + if (d.primitiveType !== PrimitiveType$1.POINTS || d.pass === Pass$1.TRANSLUCENT) + continue; + let f, h, p = d.derivedCommands.pointCloudProcessor; + defined(p) && (f = p.command, h = p.originalShaderProgram), (!defined(f) || d.dirty || h !== d.shaderProgram || f.framebuffer !== this.framebuffer) && (f = DrawCommand.shallowClone(d, f), f.framebuffer = this.framebuffer, f.shaderProgram = getECShaderProgram( + e.context, + d.shaderProgram + ), f.castShadows = !1, f.receiveShadows = !1, defined(p) || (p = { + command: f, + originalShaderProgram: d.shaderProgram + }, d.derivedCommands.pointCloudProcessor = p), p.originalShaderProgram = d.shaderProgram), o[r] = f; + } + const c = this._clearCommand, l = this._drawCommand; + l.boundingVolume = i, o.push(l), o.push(c); +}; +PointCloudEyeDomeLighting.prototype.isDestroyed = function() { + return !1; +}; +PointCloudEyeDomeLighting.prototype.destroy = function() { + return destroyFramebuffer$1(this), destroyObject(this); +}; +function PointCloudShading(e) { + const t = defaultValue(e, {}); + this.attenuation = defaultValue(t.attenuation, !1), this.geometricErrorScale = defaultValue( + t.geometricErrorScale, + 1 + ), this.maximumAttenuation = t.maximumAttenuation, this.baseResolution = t.baseResolution, this.eyeDomeLighting = defaultValue(t.eyeDomeLighting, !0), this.eyeDomeLightingStrength = defaultValue( + t.eyeDomeLightingStrength, + 1 + ), this.eyeDomeLightingRadius = defaultValue( + t.eyeDomeLightingRadius, + 1 + ), this.backFaceCulling = defaultValue(t.backFaceCulling, !1), this.normalShading = defaultValue(t.normalShading, !0); +} +PointCloudShading.isSupported = function(e) { + return PointCloudEyeDomeLighting.isSupported(e.context); +}; +const SceneTransforms = {}, actualPositionScratch = new Cartesian4(0, 0, 0, 1); +let positionCC = new Cartesian4(); +const scratchViewport$1 = new BoundingRectangle(), scratchWindowCoord0 = new Cartesian2(), scratchWindowCoord1 = new Cartesian2(); +SceneTransforms.worldToWindowCoordinates = function(e, t, n) { + return SceneTransforms.worldWithEyeOffsetToWindowCoordinates( + e, + t, + Cartesian3.ZERO, + n + ); +}; +const scratchCartesian4$5 = new Cartesian4(), scratchEyeOffset = new Cartesian3(); +function worldToClip(e, t, n, i) { + const r = n.viewMatrix, o = Matrix4.multiplyByVector( + r, + Cartesian4.fromElements( + e.x, + e.y, + e.z, + 1, + scratchCartesian4$5 + ), + scratchCartesian4$5 + ), s = Cartesian3.multiplyComponents( + t, + Cartesian3.normalize(o, scratchEyeOffset), + scratchEyeOffset + ); + return o.x += t.x + s.x, o.y += t.y + s.y, o.z += s.z, Matrix4.multiplyByVector( + n.frustum.projectionMatrix, + o, + i + ); +} +const scratchMaxCartographic = new Cartographic( + Math.PI, + CesiumMath.PI_OVER_TWO +), scratchProjectedCartesian = new Cartesian3(), scratchCameraPosition$1 = new Cartesian3(); +SceneTransforms.worldWithEyeOffsetToWindowCoordinates = function(e, t, n, i) { + const r = e.frameState, o = SceneTransforms.computeActualEllipsoidPosition( + r, + t, + actualPositionScratch + ); + if (!defined(o)) + return; + const s = e.canvas, c = scratchViewport$1; + c.x = 0, c.y = 0, c.width = s.clientWidth, c.height = s.clientHeight; + const l = e.camera; + let d = !1; + if (r.mode === SceneMode$1.SCENE2D) { + const f = e.mapProjection, h = scratchMaxCartographic, p = f.project( + h, + scratchProjectedCartesian + ), m = Cartesian3.clone( + l.position, + scratchCameraPosition$1 + ), _ = l.frustum.clone(), y = Matrix4.computeViewportTransformation( + c, + 0, + 1, + new Matrix4() + ), C = l.frustum.projectionMatrix, T = l.positionWC.y, x = Cartesian3.fromElements( + CesiumMath.sign(T) * p.x - T, + 0, + -l.positionWC.x + ), b = Transforms.pointToGLWindowCoordinates( + C, + y, + x + ); + if (T === 0 || b.x <= 0 || b.x >= s.clientWidth) + d = !0; + else { + if (b.x > s.clientWidth * 0.5) { + c.width = b.x, l.frustum.right = p.x - T, positionCC = worldToClip(o, n, l, positionCC), SceneTransforms.clipToGLWindowCoordinates( + c, + positionCC, + scratchWindowCoord0 + ), c.x += b.x, l.position.x = -l.position.x; + const S = l.frustum.right; + l.frustum.right = -l.frustum.left, l.frustum.left = -S, positionCC = worldToClip(o, n, l, positionCC), SceneTransforms.clipToGLWindowCoordinates( + c, + positionCC, + scratchWindowCoord1 + ); + } else { + c.x += b.x, c.width -= b.x, l.frustum.left = -p.x - T, positionCC = worldToClip(o, n, l, positionCC), SceneTransforms.clipToGLWindowCoordinates( + c, + positionCC, + scratchWindowCoord0 + ), c.x = c.x - c.width, l.position.x = -l.position.x; + const S = l.frustum.left; + l.frustum.left = -l.frustum.right, l.frustum.right = -S, positionCC = worldToClip(o, n, l, positionCC), SceneTransforms.clipToGLWindowCoordinates( + c, + positionCC, + scratchWindowCoord1 + ); + } + Cartesian3.clone(m, l.position), l.frustum = _.clone(), i = Cartesian2.clone(scratchWindowCoord0, i), (i.x < 0 || i.x > s.clientWidth) && (i.x = scratchWindowCoord1.x); + } + } + if (r.mode !== SceneMode$1.SCENE2D || d) { + if (positionCC = worldToClip(o, n, l, positionCC), positionCC.z < 0 && !(l.frustum instanceof OrthographicFrustum) && !(l.frustum instanceof OrthographicOffCenterFrustum)) + return; + i = SceneTransforms.clipToGLWindowCoordinates( + c, + positionCC, + i + ); + } + return i.y = s.clientHeight - i.y, i; +}; +SceneTransforms.worldToDrawingBufferCoordinates = function(e, t, n) { + if (n = SceneTransforms.worldToWindowCoordinates(e, t, n), !!defined(n)) + return SceneTransforms.transformWindowToDrawingBuffer(e, n, n); +}; +const projectedPosition = new Cartesian3(), positionInCartographic = new Cartographic(); +SceneTransforms.computeActualEllipsoidPosition = function(e, t, n) { + const i = e.mode; + if (i === SceneMode$1.SCENE3D) + return Cartesian3.clone(t, n); + const r = e.mapProjection, o = r.ellipsoid.cartesianToCartographic( + t, + positionInCartographic + ); + if (!defined(o)) + return; + if (r.project(o, projectedPosition), i === SceneMode$1.COLUMBUS_VIEW) + return Cartesian3.fromElements( + projectedPosition.z, + projectedPosition.x, + projectedPosition.y, + n + ); + if (i === SceneMode$1.SCENE2D) + return Cartesian3.fromElements( + 0, + projectedPosition.x, + projectedPosition.y, + n + ); + const s = e.morphTime; + return Cartesian3.fromElements( + CesiumMath.lerp(projectedPosition.z, t.x, s), + CesiumMath.lerp(projectedPosition.x, t.y, s), + CesiumMath.lerp(projectedPosition.y, t.z, s), + n + ); +}; +const positionNDC = new Cartesian3(), positionWC = new Cartesian3(), viewportTransform = new Matrix4(); +SceneTransforms.clipToGLWindowCoordinates = function(e, t, n) { + return Cartesian3.divideByScalar(t, t.w, positionNDC), Matrix4.computeViewportTransformation(e, 0, 1, viewportTransform), Matrix4.multiplyByPoint(viewportTransform, positionNDC, positionWC), Cartesian2.fromCartesian3(positionWC, n); +}; +SceneTransforms.transformWindowToDrawingBuffer = function(e, t, n) { + const i = e.canvas, r = e.drawingBufferWidth / i.clientWidth, o = e.drawingBufferHeight / i.clientHeight; + return Cartesian2.fromElements( + t.x * r, + t.y * o, + n + ); +}; +const scratchNDC = new Cartesian4(), scratchWorldCoords = new Cartesian4(); +SceneTransforms.drawingBufferToWorldCoordinates = function(e, t, n, i) { + const o = e.context.uniformState, s = o.currentFrustum, c = s.x, l = s.y; + if (e.frameState.useLogDepth) { + const m = n * o.log2FarDepthFromNearPlusOne, _ = Math.pow(2, m) - 1; + n = l * (1 - c / (_ + c)) / (l - c); + } + const d = e.view.passState.viewport, f = Cartesian4.clone(Cartesian4.UNIT_W, scratchNDC); + f.x = (t.x - d.x) / d.width * 2 - 1, f.y = (t.y - d.y) / d.height * 2 - 1, f.z = n * 2 - 1, f.w = 1; + let h, p = e.camera.frustum; + if (defined(p.fovy)) { + h = Matrix4.multiplyByVector( + o.inverseViewProjection, + f, + scratchWorldCoords + ); + const m = 1 / h.w; + Cartesian3.multiplyByScalar(h, m, h); + } else { + const m = p.offCenterFrustum; + defined(m) && (p = m), h = scratchWorldCoords, h.x = (f.x * (p.right - p.left) + p.left + p.right) * 0.5, h.y = (f.y * (p.top - p.bottom) + p.bottom + p.top) * 0.5, h.z = (f.z * (c - l) - c - l) * 0.5, h.w = 1, h = Matrix4.multiplyByVector( + o.inverseView, + h, + h + ); + } + return Cartesian3.fromCartesian4(h, i); +}; +const B3dmParser = {}; +B3dmParser._deprecationWarning = deprecationWarning; +const sizeOfUint32$4 = Uint32Array.BYTES_PER_ELEMENT; +B3dmParser.parse = function(e, t) { + const n = defaultValue(t, 0); + t = n; + const i = new Uint8Array(e), r = new DataView(e); + t += sizeOfUint32$4; + const o = r.getUint32(t, !0); + if (o !== 1) + throw new RuntimeError( + `Only Batched 3D Model version 1 is supported. Version ${o} is not.` + ); + t += sizeOfUint32$4; + const s = r.getUint32(t, !0); + t += sizeOfUint32$4; + let c = r.getUint32(t, !0); + t += sizeOfUint32$4; + let l = r.getUint32(t, !0); + t += sizeOfUint32$4; + let d = r.getUint32(t, !0); + t += sizeOfUint32$4; + let f = r.getUint32(t, !0); + t += sizeOfUint32$4; + let h; + d >= 570425344 ? (t -= sizeOfUint32$4 * 2, h = c, d = l, f = 0, c = 0, l = 0, B3dmParser._deprecationWarning( + "b3dm-legacy-header", + "This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel." + )) : f >= 570425344 && (t -= sizeOfUint32$4, h = d, d = c, f = l, c = 0, l = 0, B3dmParser._deprecationWarning( + "b3dm-legacy-header", + "This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel." + )); + let p; + c === 0 ? p = { + BATCH_LENGTH: defaultValue(h, 0) + } : (p = getJsonFromTypedArray( + i, + t, + c + ), t += c); + const m = new Uint8Array( + e, + t, + l + ); + t += l; + let _, y; + d > 0 && (_ = getJsonFromTypedArray( + i, + t, + d + ), t += d, f > 0 && (y = new Uint8Array( + e, + t, + f + ), y = new Uint8Array(y), t += f)); + const C = n + s - t; + if (C === 0) + throw new RuntimeError("glTF byte length must be greater than 0."); + let T; + return t % 4 === 0 ? T = new Uint8Array(e, t, C) : (B3dmParser._deprecationWarning( + "b3dm-glb-unaligned", + "The embedded glb is not aligned to a 4-byte boundary." + ), T = new Uint8Array( + i.subarray(t, t + C) + )), { + batchLength: h, + featureTableJson: p, + featureTableBinary: m, + batchTableJson: _, + batchTableBinary: y, + gltf: T + }; +}; +function Cesium3DTileFeatureTable(e, t) { + this.json = e, this.buffer = t, this._cachedTypedArrays = {}, this.featuresLength = 0; +} +function getTypedArrayFromBinary(e, t, n, i, r, o) { + const s = e._cachedTypedArrays; + let c = s[t]; + return defined(c) || (c = ComponentDatatype$1.createArrayBufferView( + n, + e.buffer.buffer, + e.buffer.byteOffset + o, + r * i + ), s[t] = c), c; +} +function getTypedArrayFromArray(e, t, n, i) { + const r = e._cachedTypedArrays; + let o = r[t]; + return defined(o) || (o = ComponentDatatype$1.createTypedArray(n, i), r[t] = o), o; +} +Cesium3DTileFeatureTable.prototype.getGlobalProperty = function(e, t, n) { + const i = this.json[e]; + if (defined(i)) + return defined(i.byteOffset) ? (t = defaultValue(t, ComponentDatatype$1.UNSIGNED_INT), n = defaultValue(n, 1), getTypedArrayFromBinary( + this, + e, + t, + n, + 1, + i.byteOffset + )) : i; +}; +Cesium3DTileFeatureTable.prototype.hasProperty = function(e) { + return defined(this.json[e]); +}; +Cesium3DTileFeatureTable.prototype.getPropertyArray = function(e, t, n) { + const i = this.json[e]; + if (defined(i)) + return defined(i.byteOffset) ? (defined(i.componentType) && (t = ComponentDatatype$1.fromName(i.componentType)), getTypedArrayFromBinary( + this, + e, + t, + n, + this.featuresLength, + i.byteOffset + )) : getTypedArrayFromArray(this, e, t, i); +}; +Cesium3DTileFeatureTable.prototype.getProperty = function(e, t, n, i, r) { + const o = this.json[e]; + if (!defined(o)) + return; + const s = this.getPropertyArray( + e, + t, + n + ); + if (n === 1) + return s[i]; + for (let c = 0; c < n; ++c) + r[c] = s[n * i + c]; + return r; +}; +function parseBatchTable(e) { + const t = e.count, n = e.batchTable, i = e.binaryBody, r = defaultValue( + e.parseAsPropertyAttributes, + !1 + ), o = e.customAttributeOutput, s = partitionProperties(n); + let c; + defined(s.jsonProperties) && (c = new JsonMetadataTable({ + count: t, + properties: s.jsonProperties + })); + let l; + defined(s.hierarchy) && (l = new BatchTableHierarchy({ + extension: s.hierarchy, + binaryBody: i + })); + const d = MetadataClass.BATCH_TABLE_CLASS_NAME, f = s.binaryProperties; + let h, p, m; + if (r) { + const C = transcodeBinaryPropertiesAsPropertyAttributes( + t, + d, + f, + i, + o + ); + m = C.transcodedSchema, p = [new PropertyAttribute({ + propertyAttribute: C.propertyAttributeJson, + class: C.transcodedClass + })]; + } else { + const C = transcodeBinaryProperties( + t, + d, + f, + i + ); + m = C.transcodedSchema; + const T = C.featureTableJson; + h = new MetadataTable({ + count: T.count, + properties: T.properties, + class: C.transcodedClass, + bufferViews: C.bufferViewsTypedArrays + }), p = []; + } + const _ = []; + if (defined(h) || defined(c) || defined(l)) { + const C = new PropertyTable({ + id: 0, + name: "Batch Table", + count: t, + metadataTable: h, + jsonMetadataTable: c, + batchTableHierarchy: l + }); + _.push(C); + } + const y = { + schema: m, + propertyTables: _, + propertyAttributes: p, + extensions: s.extensions, + extras: s.extras + }; + return new StructuralMetadata(y); +} +function partitionProperties(e) { + const t = e.HIERARCHY, n = e.extras, i = e.extensions; + let r; + defined(t) ? (parseBatchTable._deprecationWarning( + "batchTableHierarchyExtension", + "The batch table HIERARCHY property has been moved to an extension. Use extensions.3DTILES_batch_table_hierarchy instead." + ), r = t) : defined(i) && (r = i["3DTILES_batch_table_hierarchy"]); + let o; + const s = {}; + for (const c in e) { + if (!e.hasOwnProperty(c) || // these cases were handled above; + c === "HIERARCHY" || c === "extensions" || c === "extras") + continue; + const l = e[c]; + Array.isArray(l) ? (o = defined(o) ? o : {}, o[c] = l) : s[c] = l; + } + return { + binaryProperties: s, + jsonProperties: o, + hierarchy: r, + extras: n, + extensions: i + }; +} +function transcodeBinaryProperties(e, t, n, i) { + const r = {}, o = {}, s = {}; + let c = 0; + for (const h in n) { + if (!n.hasOwnProperty(h)) + continue; + if (!defined(i)) + throw new RuntimeError( + `Property ${h} requires a batch table binary.` + ); + const p = n[h], m = getBinaryAccessor(p); + o[h] = { + bufferView: c + }, r[h] = transcodePropertyType(p), s[c] = m.createArrayBufferView( + i.buffer, + i.byteOffset + p.byteOffset, + e + ), c++; + } + const l = { + classes: {} + }; + l.classes[t] = { + properties: r + }; + const d = MetadataSchema.fromJson(l); + return { + featureTableJson: { + class: t, + count: e, + properties: o + }, + bufferViewsTypedArrays: s, + transcodedSchema: d, + transcodedClass: d.classes[t] + }; +} +function transcodeBinaryPropertiesAsPropertyAttributes(e, t, n, i, r) { + const o = {}, s = {}; + let c = 0; + for (const h in n) { + if (!n.hasOwnProperty(h)) + continue; + const p = n[h]; + if (!defined(i) && !defined(p.typedArray)) + throw new RuntimeError( + `Property ${h} requires a batch table binary.` + ); + let m = ModelUtility.sanitizeGlslIdentifier(h); + (m === "" || o.hasOwnProperty(m)) && (m = `property_${c}`, c++); + const _ = transcodePropertyType(p); + _.name = h, o[m] = _; + let y = m.toUpperCase(); + y.startsWith("_") || (y = `_${y}`); + let C = p.typedArray; + defined(C) || (C = getBinaryAccessor(p).createArrayBufferView( + i.buffer, + i.byteOffset + p.byteOffset, + e + )); + const T = new ModelComponents.Attribute(); + T.name = y, T.count = e, T.type = p.type; + const x = ComponentDatatype$1.fromTypedArray( + C + ); + (x === ComponentDatatype$1.INT || x === ComponentDatatype$1.UNSIGNED_INT || x === ComponentDatatype$1.DOUBLE) && (parseBatchTable._oneTimeWarning( + "Cast pnts property to floats", + `Point cloud property "${y}" will be cast to a float array because INT, UNSIGNED_INT, and DOUBLE are not valid WebGL vertex attribute types. Some precision may be lost.` + ), C = new Float32Array(C)), T.componentDatatype = ComponentDatatype$1.fromTypedArray( + C + ), T.typedArray = C, r.push(T), s[m] = { + attribute: y + }; + } + const l = { + classes: {} + }; + l.classes[t] = { + properties: o + }; + const d = MetadataSchema.fromJson(l); + return { + class: t, + propertyAttributeJson: { + properties: s + }, + transcodedSchema: d, + transcodedClass: d.classes[t] + }; +} +function transcodePropertyType(e) { + const t = transcodeComponentType$1(e.componentType); + return { + type: e.type, + componentType: t + }; +} +function transcodeComponentType$1(e) { + switch (e) { + case "BYTE": + return "INT8"; + case "UNSIGNED_BYTE": + return "UINT8"; + case "SHORT": + return "INT16"; + case "UNSIGNED_SHORT": + return "UINT16"; + case "INT": + return "INT32"; + case "UNSIGNED_INT": + return "UINT32"; + case "FLOAT": + return "FLOAT32"; + case "DOUBLE": + return "FLOAT64"; + } +} +parseBatchTable._deprecationWarning = deprecationWarning; +parseBatchTable._oneTimeWarning = oneTimeWarning; +const B3dmLoaderState = { + UNLOADED: 0, + LOADING: 1, + PROCESSING: 2, + READY: 3, + FAILED: 4 +}, FeatureIdAttribute$2 = ModelComponents.FeatureIdAttribute; +function B3dmLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.b3dmResource; + let n = e.baseResource; + const i = e.arrayBuffer, r = defaultValue(e.byteOffset, 0), o = defaultValue(e.releaseGltfJson, !1), s = defaultValue(e.asynchronous, !0), c = defaultValue( + e.incrementallyLoadTextures, + !0 + ), l = defaultValue(e.upAxis, Axis$1.Y), d = defaultValue(e.forwardAxis, Axis$1.X), f = defaultValue( + e.loadAttributesAsTypedArray, + !1 + ), h = defaultValue(e.loadAttributesFor2D, !1), p = defaultValue(e.enablePick, !1), m = defaultValue( + e.loadIndicesForWireframe, + !1 + ), _ = defaultValue(e.loadPrimitiveOutline, !0), y = defaultValue( + e.loadForClassification, + !1 + ); + n = defined(n) ? n : t.clone(), this._b3dmResource = t, this._baseResource = n, this._arrayBuffer = i, this._byteOffset = r, this._releaseGltfJson = o, this._asynchronous = s, this._incrementallyLoadTextures = c, this._upAxis = l, this._forwardAxis = d, this._loadAttributesAsTypedArray = f, this._loadAttributesFor2D = h, this._enablePick = p, this._loadIndicesForWireframe = m, this._loadPrimitiveOutline = _, this._loadForClassification = y, this._state = B3dmLoaderState.UNLOADED, this._promise = void 0, this._gltfLoader = void 0, this._batchLength = 0, this._propertyTable = void 0, this._batchTable = void 0, this._components = void 0, this._transform = Matrix4.IDENTITY; +} +defined(Object.create) && (B3dmLoader.prototype = Object.create(ResourceLoader.prototype), B3dmLoader.prototype.constructor = B3dmLoader); +Object.defineProperties(B3dmLoader.prototype, { + /** + * true if textures are loaded, useful when incrementallyLoadTextures is true + * + * @memberof B3dmLoader.prototype + * + * @type {boolean} + * @readonly + * @private + */ + texturesLoaded: { + get: function() { + var e; + return (e = this._gltfLoader) == null ? void 0 : e.texturesLoaded; + } + }, + /** + * The cache key of the resource + * + * @memberof B3dmLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + } + }, + /** + * The loaded components. + * + * @memberof B3dmLoader.prototype + * + * @type {ModelComponents.Components} + * @readonly + * @private + */ + components: { + get: function() { + return this._components; + } + } +}); +B3dmLoader.prototype.load = function() { + if (defined(this._promise)) + return this._promise; + const e = B3dmParser.parse(this._arrayBuffer, this._byteOffset); + let t = e.batchLength; + const n = e.featureTableJson, i = e.featureTableBinary, r = e.batchTableJson, o = e.batchTableBinary, s = new Cesium3DTileFeatureTable( + n, + i + ); + t = s.getGlobalProperty("BATCH_LENGTH"), this._batchLength = t; + const c = s.getGlobalProperty( + "RTC_CENTER", + ComponentDatatype$1.FLOAT, + 3 + ); + defined(c) && (this._transform = Matrix4.fromTranslation(Cartesian3.fromArray(c))), this._batchTable = { + json: r, + binary: o + }; + const l = new GltfLoader({ + typedArray: e.gltf, + upAxis: this._upAxis, + forwardAxis: this._forwardAxis, + gltfResource: this._b3dmResource, + baseResource: this._baseResource, + releaseGltfJson: this._releaseGltfJson, + incrementallyLoadTextures: this._incrementallyLoadTextures, + loadAttributesAsTypedArray: this._loadAttributesAsTypedArray, + loadAttributesFor2D: this._loadAttributesFor2D, + enablePick: this._enablePick, + loadIndicesForWireframe: this._loadIndicesForWireframe, + loadPrimitiveOutline: this._loadPrimitiveOutline, + loadForClassification: this._loadForClassification, + renameBatchIdSemantic: !0 + }); + this._gltfLoader = l, this._state = B3dmLoaderState.LOADING; + const d = this; + return this._promise = l.load().then(function() { + if (!d.isDestroyed()) + return d._state = B3dmLoaderState.PROCESSING, d; + }).catch(function(f) { + if (!d.isDestroyed()) + return handleError$4(d, f); + }), this._promise; +}; +function handleError$4(e, t) { + return e.unload(), e._state = B3dmLoaderState.FAILED, t = e.getError("Failed to load b3dm", t), Promise.reject(t); +} +B3dmLoader.prototype.process = function(e) { + if (this._state === B3dmLoaderState.READY) + return !0; + if (this._state !== B3dmLoaderState.PROCESSING || !this._gltfLoader.process(e)) + return !1; + const n = this._gltfLoader.components; + return n.transform = Matrix4.multiplyTransformation( + this._transform, + n.transform, + n.transform + ), createStructuralMetadata$1(this, n), this._components = n, this._arrayBuffer = void 0, this._state = B3dmLoaderState.READY, !0; +}; +function createStructuralMetadata$1(e, t) { + const n = e._batchTable, i = e._batchLength; + if (i === 0) + return; + let r; + if (defined(n.json)) + r = parseBatchTable({ + count: i, + batchTable: n.json, + binaryBody: n.binary + }); + else { + const c = new PropertyTable({ + name: MetadataClass.BATCH_TABLE_CLASS_NAME, + count: i + }); + r = new StructuralMetadata({ + schema: {}, + propertyTables: [c] + }); + } + const o = t.scene.nodes, s = o.length; + for (let c = 0; c < s; c++) + processNode(o[c]); + t.structuralMetadata = r; +} +function processNode(e) { + const t = e.children.length; + for (let i = 0; i < t; i++) + processNode(e.children[i]); + const n = e.primitives.length; + for (let i = 0; i < n; i++) { + const r = e.primitives[i], o = ModelUtility.getAttributeBySemantic( + r, + VertexAttributeSemantic$1.FEATURE_ID + ); + if (defined(o)) { + o.setIndex = 0; + const s = new FeatureIdAttribute$2(); + s.propertyTableId = 0, s.setIndex = 0, s.positionalLabel = "featureId_0", r.featureIds.push(s); + } + } +} +B3dmLoader.prototype.unload = function() { + defined(this._gltfLoader) && !this._gltfLoader.isDestroyed() && this._gltfLoader.unload(), this._components = void 0, this._arrayBuffer = void 0; +}; +function GeoJsonLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._geoJson = e.geoJson, this._components = void 0; +} +defined(Object.create) && (GeoJsonLoader.prototype = Object.create(ResourceLoader.prototype), GeoJsonLoader.prototype.constructor = GeoJsonLoader); +Object.defineProperties(GeoJsonLoader.prototype, { + /** + * The cache key of the resource. + * + * @memberof GeoJsonLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + } + }, + /** + * The loaded components. + * + * @memberof GeoJsonLoader.prototype + * + * @type {ModelComponents.Components} + * @readonly + * @private + */ + components: { + get: function() { + return this._components; + } + } +}); +GeoJsonLoader.prototype.load = function() { + return Promise.resolve(this); +}; +GeoJsonLoader.prototype.process = function(e) { + return defined(this._components) || (this._components = parse(this._geoJson, e), this._geoJson = void 0), !0; +}; +function ParsedFeature() { + this.lines = void 0, this.points = void 0, this.properties = void 0; +} +function ParseResult() { + this.features = []; +} +function parsePosition(e) { + const t = e[0], n = e[1], i = defaultValue(e[2], 0); + return new Cartesian3(t, n, i); +} +function parseLineString(e) { + const t = e.length, n = new Array(t); + for (let r = 0; r < t; r++) + n[r] = parsePosition(e[r]); + return [n]; +} +function parseMultiLineString(e) { + const t = e.length, n = new Array(t); + for (let i = 0; i < t; i++) + n[i] = parseLineString(e[i])[0]; + return n; +} +function parsePolygon(e) { + const t = e.length, n = new Array(t); + for (let i = 0; i < t; i++) + n[i] = parseLineString(e[i])[0]; + return n; +} +function parseMultiPolygon(e) { + const t = e.length, n = []; + for (let i = 0; i < t; i++) + Array.prototype.push.apply(n, parsePolygon(e[i])); + return n; +} +function parsePoint(e) { + return [parsePosition(e)]; +} +function parseMultiPoint(e) { + const t = e.length, n = new Array(t); + for (let i = 0; i < t; i++) + n[i] = parsePosition(e[i]); + return n; +} +const geometryTypes$2 = { + LineString: parseLineString, + MultiLineString: parseMultiLineString, + MultiPolygon: parseMultiPolygon, + Polygon: parsePolygon, + MultiPoint: parseMultiPoint, + Point: parsePoint +}, primitiveTypes = { + LineString: PrimitiveType$1.LINES, + MultiLineString: PrimitiveType$1.LINES, + MultiPolygon: PrimitiveType$1.LINES, + Polygon: PrimitiveType$1.LINES, + MultiPoint: PrimitiveType$1.POINTS, + Point: PrimitiveType$1.POINTS +}; +function parseFeature(e, t) { + if (!defined(e.geometry)) + return; + const n = e.geometry.type, i = geometryTypes$2[n], r = primitiveTypes[n], o = e.geometry.coordinates; + if (!defined(i) || !defined(o)) + return; + const s = new ParsedFeature(); + r === PrimitiveType$1.LINES ? s.lines = i(o) : r === PrimitiveType$1.POINTS && (s.points = i(o)), s.properties = e.properties, t.features.push(s); +} +function parseFeatureCollection(e, t) { + const n = e.features, i = n.length; + for (let r = 0; r < i; r++) + parseFeature(n[r], t); +} +const geoJsonObjectTypes$1 = { + FeatureCollection: parseFeatureCollection, + Feature: parseFeature +}, scratchCartesian$9 = new Cartesian3(); +function createLinesPrimitive(e, t, n) { + let i = 0, r = 0; + const o = e.length; + for (let I = 0; I < o; I++) { + const M = e[I]; + if (defined(M.lines)) { + const R = M.lines.length; + for (let L = 0; L < R; L++) { + const g = M.lines[L]; + i += g.length, r += (g.length - 1) * 2; + } + } + } + const s = new Float32Array(i * 3), c = new Float32Array(i), l = IndexDatatype$1.createTypedArray( + i, + r + ), d = IndexDatatype$1.fromTypedArray(l), f = new Cartesian3( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY + ), h = new Cartesian3( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY + ); + let p = 0, m = 0; + for (let I = 0; I < o; I++) { + const M = e[I]; + if (!defined(M.lines)) + continue; + const R = M.lines.length; + for (let L = 0; L < R; L++) { + const g = M.lines[L], w = g.length; + for (let O = 0; O < w; O++) { + const N = g[O], F = Cartesian3.fromDegrees( + N.x, + N.y, + N.z, + Ellipsoid.WGS84, + scratchCartesian$9 + ), B = Matrix4.multiplyByPoint( + t, + F, + scratchCartesian$9 + ); + Cartesian3.minimumByComponent(f, B, f), Cartesian3.maximumByComponent(h, B, h), Cartesian3.pack(B, s, p * 3), c[p] = I, O < w - 1 && (l[m * 2] = p, l[m * 2 + 1] = p + 1, m++), p++; + } + } + } + const _ = Buffer.createVertexBuffer({ + typedArray: s, + context: n.context, + usage: BufferUsage$1.STATIC_DRAW + }); + _.vertexArrayDestroyable = !1; + const y = Buffer.createVertexBuffer({ + typedArray: c, + context: n.context, + usage: BufferUsage$1.STATIC_DRAW + }); + y.vertexArrayDestroyable = !1; + const C = Buffer.createIndexBuffer({ + typedArray: l, + context: n.context, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: d + }); + C.vertexArrayDestroyable = !1; + const T = new ModelComponents.Attribute(); + T.semantic = VertexAttributeSemantic$1.POSITION, T.componentDatatype = ComponentDatatype$1.FLOAT, T.type = AttributeType$1.VEC3, T.count = i, T.min = f, T.max = h, T.buffer = _; + const x = new ModelComponents.Attribute(); + x.semantic = VertexAttributeSemantic$1.FEATURE_ID, x.setIndex = 0, x.componentDatatype = ComponentDatatype$1.FLOAT, x.type = AttributeType$1.SCALAR, x.count = i, x.buffer = y; + const b = [T, x], S = new ModelComponents.Material(); + S.unlit = !0; + const E = new ModelComponents.Indices(); + E.indexDatatype = d, E.count = l.length, E.buffer = C; + const A = new ModelComponents.FeatureIdAttribute(); + A.featureCount = o, A.propertyTableId = 0, A.setIndex = 0, A.positionalLabel = "featureId_0"; + const D = [A], P = new ModelComponents.Primitive(); + return P.attributes = b, P.indices = E, P.featureIds = D, P.primitiveType = PrimitiveType$1.LINES, P.material = S, P; +} +function createPointsPrimitive(e, t, n) { + let i = 0; + const r = e.length; + for (let b = 0; b < r; b++) { + const S = e[b]; + defined(S.points) && (i += S.points.length); + } + const o = new Float32Array(i * 3), s = new Float32Array(i), c = new Cartesian3( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY + ), l = new Cartesian3( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY + ); + let d = 0; + for (let b = 0; b < r; b++) { + const S = e[b]; + if (!defined(S.points)) + continue; + const E = S.points.length; + for (let A = 0; A < E; A++) { + const D = S.points[A], P = Cartesian3.fromDegrees( + D.x, + D.y, + D.z, + Ellipsoid.WGS84, + scratchCartesian$9 + ), I = Matrix4.multiplyByPoint( + t, + P, + scratchCartesian$9 + ); + Cartesian3.minimumByComponent(c, I, c), Cartesian3.maximumByComponent(l, I, l), Cartesian3.pack(I, o, d * 3), s[d] = b, d++; + } + } + const f = Buffer.createVertexBuffer({ + typedArray: o, + context: n.context, + usage: BufferUsage$1.STATIC_DRAW + }); + f.vertexArrayDestroyable = !1; + const h = Buffer.createVertexBuffer({ + typedArray: s, + context: n.context, + usage: BufferUsage$1.STATIC_DRAW + }); + h.vertexArrayDestroyable = !1; + const p = new ModelComponents.Attribute(); + p.semantic = VertexAttributeSemantic$1.POSITION, p.componentDatatype = ComponentDatatype$1.FLOAT, p.type = AttributeType$1.VEC3, p.count = i, p.min = c, p.max = l, p.buffer = f; + const m = new ModelComponents.Attribute(); + m.semantic = VertexAttributeSemantic$1.FEATURE_ID, m.setIndex = 0, m.componentDatatype = ComponentDatatype$1.FLOAT, m.type = AttributeType$1.SCALAR, m.count = i, m.buffer = h; + const _ = [p, m], y = new ModelComponents.Material(); + y.unlit = !0; + const C = new ModelComponents.FeatureIdAttribute(); + C.featureCount = r, C.propertyTableId = 0, C.setIndex = 0, C.positionalLabel = "featureId_0"; + const T = [C], x = new ModelComponents.Primitive(); + return x.attributes = _, x.featureIds = T, x.primitiveType = PrimitiveType$1.POINTS, x.material = y, x; +} +function parse(e, t) { + const n = new ParseResult(), i = geoJsonObjectTypes$1[e.type]; + defined(i) && i(e, n); + const r = n.features, o = r.length; + if (o === 0) + throw new RuntimeError("GeoJSON must have at least one feature"); + const s = {}; + for (let I = 0; I < o; I++) { + const M = r[I], R = defaultValue( + M.properties, + defaultValue.EMPTY_OBJECT + ); + for (const L in R) + R.hasOwnProperty(L) && (defined(s[L]) || (s[L] = new Array(o))); + } + for (let I = 0; I < o; I++) { + const M = r[I]; + for (const R in s) + if (s.hasOwnProperty(R)) { + const L = defaultValue(M.properties[R], ""); + s[R][I] = L; + } + } + const c = new JsonMetadataTable({ + count: o, + properties: s + }), d = [new PropertyTable({ + id: 0, + count: o, + jsonMetadataTable: c + })], f = MetadataSchema.fromJson({}), h = new StructuralMetadata({ + schema: f, + propertyTables: d + }), p = new Cartesian3( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY + ), m = new Cartesian3( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY + ); + let _ = !1, y = !1; + for (let I = 0; I < o; I++) { + const M = r[I]; + if (defined(M.lines)) { + _ = !0; + const R = M.lines.length; + for (let L = 0; L < R; L++) { + const g = M.lines[L], w = g.length; + for (let O = 0; O < w; O++) + Cartesian3.minimumByComponent( + p, + g[O], + p + ), Cartesian3.maximumByComponent( + m, + g[O], + m + ); + } + } + if (defined(M.points)) { + y = !0; + const R = M.points.length; + for (let L = 0; L < R; L++) { + const g = M.points[L]; + Cartesian3.minimumByComponent(p, g, p), Cartesian3.maximumByComponent(m, g, m); + } + } + } + const C = Cartesian3.midpoint( + p, + m, + new Cartesian3() + ), T = Cartesian3.fromDegrees( + C.x, + C.y, + C.z, + Ellipsoid.WGS84, + new Cartesian3() + ), x = Transforms.eastNorthUpToFixedFrame( + T, + Ellipsoid.WGS84, + new Matrix4() + ), b = Matrix4.inverseTransformation(x, new Matrix4()), S = []; + _ && S.push(createLinesPrimitive(r, b, t)), y && S.push(createPointsPrimitive(r, b, t)); + const E = new ModelComponents.Node(); + E.index = 0, E.primitives = S; + const A = [E], D = new ModelComponents.Scene(); + D.nodes = A; + const P = new ModelComponents.Components(); + return P.scene = D, P.nodes = A, P.transform = x, P.structuralMetadata = h, P; +} +GeoJsonLoader.prototype.unload = function() { + this._components = void 0; +}; +const I3dmParser = {}; +I3dmParser._deprecationWarning = deprecationWarning; +const sizeOfUint32$3 = Uint32Array.BYTES_PER_ELEMENT; +I3dmParser.parse = function(e, t) { + const n = defaultValue(t, 0); + t = n; + const i = new Uint8Array(e), r = new DataView(e); + t += sizeOfUint32$3; + const o = r.getUint32(t, !0); + if (o !== 1) + throw new RuntimeError( + `Only Instanced 3D Model version 1 is supported. Version ${o} is not.` + ); + t += sizeOfUint32$3; + const s = r.getUint32(t, !0); + t += sizeOfUint32$3; + const c = r.getUint32(t, !0); + if (c === 0) + throw new RuntimeError( + "featureTableJsonByteLength is zero, the feature table must be defined." + ); + t += sizeOfUint32$3; + const l = r.getUint32(t, !0); + t += sizeOfUint32$3; + const d = r.getUint32(t, !0); + t += sizeOfUint32$3; + const f = r.getUint32(t, !0); + t += sizeOfUint32$3; + const h = r.getUint32(t, !0); + if (h !== 1 && h !== 0) + throw new RuntimeError( + `Only glTF format 0 (uri) or 1 (embedded) are supported. Format ${h} is not.` + ); + t += sizeOfUint32$3; + const p = getJsonFromTypedArray( + i, + t, + c + ); + t += c; + const m = new Uint8Array( + e, + t, + l + ); + t += l; + let _, y; + d > 0 && (_ = getJsonFromTypedArray( + i, + t, + d + ), t += d, f > 0 && (y = new Uint8Array( + e, + t, + f + ), y = new Uint8Array(y), t += f)); + const C = n + s - t; + if (C === 0) + throw new RuntimeError("glTF byte length must be greater than 0."); + let T; + return t % 4 === 0 ? T = new Uint8Array(e, t, C) : (I3dmParser._deprecationWarning( + "i3dm-glb-unaligned", + "The embedded glb is not aligned to a 4-byte boundary." + ), T = new Uint8Array( + i.subarray(t, t + C) + )), { + gltfFormat: h, + featureTableJson: p, + featureTableBinary: m, + batchTableJson: _, + batchTableBinary: y, + gltf: T + }; +}; +const I3dmLoaderState = { + NOT_LOADED: 0, + LOADING: 1, + PROCESSING: 2, + POST_PROCESSING: 3, + READY: 4, + FAILED: 5, + UNLOADED: 6 +}, Attribute$1 = ModelComponents.Attribute, FeatureIdAttribute$1 = ModelComponents.FeatureIdAttribute, Instances = ModelComponents.Instances; +function I3dmLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.i3dmResource, n = e.arrayBuffer; + let i = e.baseResource; + const r = defaultValue(e.byteOffset, 0), o = defaultValue(e.releaseGltfJson, !1), s = defaultValue(e.asynchronous, !0), c = defaultValue( + e.incrementallyLoadTextures, + !0 + ), l = defaultValue(e.upAxis, Axis$1.Y), d = defaultValue(e.forwardAxis, Axis$1.X), f = defaultValue( + e.loadAttributesAsTypedArray, + !1 + ), h = defaultValue( + e.loadIndicesForWireframe, + !1 + ), p = defaultValue(e.loadPrimitiveOutline, !0), m = defaultValue(e.enablePick, !1); + i = defined(i) ? i : t.clone(), this._i3dmResource = t, this._baseResource = i, this._arrayBuffer = n, this._byteOffset = r, this._releaseGltfJson = o, this._asynchronous = s, this._incrementallyLoadTextures = c, this._upAxis = l, this._forwardAxis = d, this._loadAttributesAsTypedArray = f, this._loadIndicesForWireframe = h, this._loadPrimitiveOutline = p, this._enablePick = m, this._state = I3dmLoaderState.NOT_LOADED, this._promise = void 0, this._gltfLoader = void 0, this._buffers = [], this._components = void 0, this._transform = Matrix4.IDENTITY, this._batchTable = void 0, this._featureTable = void 0, this._instancesLength = 0; +} +defined(Object.create) && (I3dmLoader.prototype = Object.create(ResourceLoader.prototype), I3dmLoader.prototype.constructor = I3dmLoader); +Object.defineProperties(I3dmLoader.prototype, { + /** + * true if textures are loaded, useful when incrementallyLoadTextures is true + * + * @memberof I3dmLoader.prototype + * + * @type {boolean} + * @readonly + * @private + */ + texturesLoaded: { + get: function() { + var e; + return (e = this._gltfLoader) == null ? void 0 : e.texturesLoaded; + } + }, + /** + * The cache key of the resource + * + * @memberof I3dmLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + } + }, + /** + * The loaded components. + * + * @memberof I3dmLoader.prototype + * + * @type {ModelComponents.Components} + * @default {@link Matrix4.IDENTITY} + * @readonly + * @private + */ + components: { + get: function() { + return this._components; + } + } +}); +I3dmLoader.prototype.load = function() { + if (defined(this._promise)) + return this._promise; + const e = I3dmParser.parse(this._arrayBuffer, this._byteOffset), t = e.featureTableJson, n = e.featureTableBinary, i = e.batchTableJson, r = e.batchTableBinary, o = e.gltfFormat, s = new Cesium3DTileFeatureTable( + t, + n + ); + this._featureTable = s; + const c = s.getGlobalProperty("INSTANCES_LENGTH"); + if (s.featuresLength = c, !defined(c)) + throw new RuntimeError( + "Feature table global property: INSTANCES_LENGTH must be defined" + ); + this._instancesLength = c; + const l = s.getGlobalProperty( + "RTC_CENTER", + ComponentDatatype$1.FLOAT, + 3 + ); + defined(l) && (this._transform = Matrix4.fromTranslation(Cartesian3.fromArray(l))), this._batchTable = { + json: i, + binary: r + }; + const d = { + upAxis: this._upAxis, + forwardAxis: this._forwardAxis, + releaseGltfJson: this._releaseGltfJson, + incrementallyLoadTextures: this._incrementallyLoadTextures, + loadAttributesAsTypedArray: this._loadAttributesAsTypedArray, + enablePick: this._enablePick, + loadIndicesForWireframe: this._loadIndicesForWireframe, + loadPrimitiveOutline: this._loadPrimitiveOutline + }; + if (o === 0) { + let h = getStringFromTypedArray(e.gltf); + h = h.replace(/[\s\0]+$/, ""); + const p = this._baseResource.getDerivedResource({ + url: h + }); + d.gltfResource = p, d.baseResource = p; + } else + d.gltfResource = this._i3dmResource, d.typedArray = e.gltf; + const f = new GltfLoader(d); + return this._gltfLoader = f, this._state = I3dmLoaderState.LOADING, this._promise = f.load().then(() => { + if (!this.isDestroyed()) + return this._state = I3dmLoaderState.PROCESSING, this; + }).catch((h) => { + if (!this.isDestroyed()) + throw handleError$3(this, h); + }), this._promise; +}; +function handleError$3(e, t) { + return e.unload(), e._state = I3dmLoaderState.FAILED, e.getError("Failed to load i3dm", t); +} +I3dmLoader.prototype.process = function(e) { + if (this._state === I3dmLoaderState.READY) + return !0; + const t = this._gltfLoader; + let n = !1; + if (this._state === I3dmLoaderState.PROCESSING && (n = t.process(e)), !n) + return !1; + const i = t.components; + return i.transform = Matrix4.multiplyTransformation( + this._transform, + i.transform, + i.transform + ), createInstances(this, i, e), createStructuralMetadata(this, i), this._components = i, this._arrayBuffer = void 0, this._state = I3dmLoaderState.READY, !0; +}; +function createStructuralMetadata(e, t) { + const n = e._batchTable, i = e._instancesLength; + if (i === 0) + return; + let r; + if (defined(n.json)) + r = parseBatchTable({ + count: i, + batchTable: n.json, + binaryBody: n.binary + }); + else { + const o = new PropertyTable({ + name: MetadataClass.BATCH_TABLE_CLASS_NAME, + count: i + }); + r = new StructuralMetadata({ + schema: {}, + propertyTables: [o] + }); + } + t.structuralMetadata = r; +} +const positionScratch$a = new Cartesian3(), propertyScratch1 = new Array(4), transformScratch$1 = new Matrix4(); +function createInstances(e, t, n) { + let i; + const r = e._featureTable, o = e._instancesLength; + if (o === 0) + return; + const s = r.getGlobalProperty( + "RTC_CENTER", + ComponentDatatype$1.FLOAT, + 3 + ), c = r.getGlobalProperty("EAST_NORTH_UP"), l = r.hasProperty("NORMAL_UP") || r.hasProperty("NORMAL_UP_OCT32P") || c, d = r.hasProperty("SCALE") || r.hasProperty("SCALE_NON_UNIFORM"), f = getPositions(r); + let h; + l && (h = new Float32Array(4 * o)); + let p; + d && (p = new Float32Array(3 * o)); + const m = new Float32Array(o), _ = Cartesian3.unpackArray(f); + let y = new Cartesian3(); + const C = new Cartesian3(), T = new Cartesian3(), x = new Cartesian3(), b = new Matrix3(), S = new Quaternion(), E = new Array(4), A = new Cartesian3(), D = new Array(3), P = new Matrix4(); + if (!defined(s) || Cartesian3.equals(Cartesian3.unpack(s), Cartesian3.ZERO)) { + const B = BoundingSphere.fromPoints(_); + for (i = 0; i < _.length; i++) + Cartesian3.subtract( + _[i], + B.center, + positionScratch$a + ), f[3 * i + 0] = positionScratch$a.x, f[3 * i + 1] = positionScratch$a.y, f[3 * i + 2] = positionScratch$a.z; + const V = Matrix4.fromTranslation( + B.center, + transformScratch$1 + ); + t.transform = Matrix4.multiplyTransformation( + V, + t.transform, + t.transform + ); + } + for (i = 0; i < o; i++) { + y = Cartesian3.clone(_[i]), defined(s) && Cartesian3.add( + y, + Cartesian3.unpack(s), + y + ), l && (processRotation( + r, + c, + i, + S, + y, + T, + C, + x, + b, + P + ), Quaternion.pack(S, E, 0), h[4 * i + 0] = E[0], h[4 * i + 1] = E[1], h[4 * i + 2] = E[2], h[4 * i + 3] = E[3]), d && (processScale(r, i, A), Cartesian3.pack(A, D, 0), p[3 * i + 0] = D[0], p[3 * i + 1] = D[1], p[3 * i + 2] = D[2]); + let B = r.getProperty( + "BATCH_ID", + ComponentDatatype$1.UNSIGNED_SHORT, + 1, + i + ); + defined(B) || (B = i), m[i] = B; + } + const I = new Instances(); + I.transformInWorldSpace = !0; + const M = e._buffers, R = new Attribute$1(); + if (R.name = "Instance Translation", R.semantic = InstanceAttributeSemantic$1.TRANSLATION, R.componentDatatype = ComponentDatatype$1.FLOAT, R.type = AttributeType$1.VEC3, R.count = o, R.typedArray = f, !l) { + const B = Buffer.createVertexBuffer({ + context: n.context, + typedArray: f, + usage: BufferUsage$1.STATIC_DRAW + }); + B.vertexArrayDestroyable = !1, M.push(B), R.buffer = B; + } + if (I.attributes.push(R), l) { + const B = new Attribute$1(); + B.name = "Instance Rotation", B.semantic = InstanceAttributeSemantic$1.ROTATION, B.componentDatatype = ComponentDatatype$1.FLOAT, B.type = AttributeType$1.VEC4, B.count = o, B.typedArray = h, I.attributes.push(B); + } + if (d) { + const B = new Attribute$1(); + if (B.name = "Instance Scale", B.semantic = InstanceAttributeSemantic$1.SCALE, B.componentDatatype = ComponentDatatype$1.FLOAT, B.type = AttributeType$1.VEC3, B.count = o, l) + B.typedArray = p; + else { + const V = Buffer.createVertexBuffer({ + context: n.context, + typedArray: p, + usage: BufferUsage$1.STATIC_DRAW + }); + V.vertexArrayDestroyable = !1, M.push(V), B.buffer = V; + } + I.attributes.push(B); + } + const L = new Attribute$1(); + L.name = "Instance Feature ID", L.setIndex = 0, L.semantic = InstanceAttributeSemantic$1.FEATURE_ID, L.componentDatatype = ComponentDatatype$1.FLOAT, L.type = AttributeType$1.SCALAR, L.count = o; + const g = Buffer.createVertexBuffer({ + context: n.context, + typedArray: m, + usage: BufferUsage$1.STATIC_DRAW + }); + g.vertexArrayDestroyable = !1, M.push(g), L.buffer = g, I.attributes.push(L); + const w = new FeatureIdAttribute$1(); + w.propertyTableId = 0, w.setIndex = 0, w.positionalLabel = "instanceFeatureId_0", I.featureIds.push(w); + const O = t.nodes, N = O.length; + let F = !1; + for (i = 0; i < N; i++) { + const B = O[i]; + B.primitives.length > 0 && (B.instances = F ? createInstancesCopy(I) : I, F = !0); + } +} +function createInstancesCopy(e) { + const t = new Instances(); + t.transformInWorldSpace = e.transformInWorldSpace; + const n = e.attributes, i = n.length; + for (let r = 0; r < i; r++) { + const o = clone$1(n[r], !1); + t.attributes.push(o); + } + return t.featureIds = e.featureIds, t; +} +function getPositions(e, t) { + if (e.hasProperty("POSITION")) + return e.getPropertyArray( + "POSITION", + ComponentDatatype$1.FLOAT, + 3 + ); + if (e.hasProperty("POSITION_QUANTIZED")) { + const n = e.getPropertyArray( + "POSITION_QUANTIZED", + ComponentDatatype$1.UNSIGNED_SHORT, + 3 + ), i = e.getGlobalProperty( + "QUANTIZED_VOLUME_OFFSET", + ComponentDatatype$1.FLOAT, + 3 + ); + if (!defined(i)) + throw new RuntimeError( + "Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions." + ); + const r = e.getGlobalProperty( + "QUANTIZED_VOLUME_SCALE", + ComponentDatatype$1.FLOAT, + 3 + ); + if (!defined(r)) + throw new RuntimeError( + "Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions." + ); + const o = new Float32Array(n.length); + for (let s = 0; s < n.length / 3; s++) + for (let c = 0; c < 3; c++) { + const l = 3 * s + c; + o[l] = n[l] / 65535 * r[c] + i[c]; + } + return o; + } else + throw new RuntimeError( + "Either POSITION or POSITION_QUANTIZED must be defined for each instance." + ); +} +const propertyScratch2 = new Array(4); +function processRotation(e, t, n, i, r, o, s, c, l, d) { + const f = e.getProperty( + "NORMAL_UP", + ComponentDatatype$1.FLOAT, + 3, + n, + propertyScratch1 + ), h = e.getProperty( + "NORMAL_RIGHT", + ComponentDatatype$1.FLOAT, + 3, + n, + propertyScratch2 + ); + let p = !1; + if (defined(f)) { + if (!defined(h)) + throw new RuntimeError( + "To define a custom orientation, both NORMAL_UP and NORMAL_RIGHT must be defined." + ); + Cartesian3.unpack(f, 0, o), Cartesian3.unpack(h, 0, s), p = !0; + } else { + const m = e.getProperty( + "NORMAL_UP_OCT32P", + ComponentDatatype$1.UNSIGNED_SHORT, + 2, + n, + propertyScratch1 + ), _ = e.getProperty( + "NORMAL_RIGHT_OCT32P", + ComponentDatatype$1.UNSIGNED_SHORT, + 2, + n, + propertyScratch2 + ); + if (defined(m)) { + if (!defined(_)) + throw new RuntimeError( + "To define a custom orientation with oct-encoded vectors, both NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P must be defined." + ); + AttributeCompression.octDecodeInRange( + m[0], + m[1], + 65535, + o + ), AttributeCompression.octDecodeInRange( + _[0], + _[1], + 65535, + s + ), p = !0; + } else t ? (Transforms.eastNorthUpToFixedFrame( + r, + Ellipsoid.WGS84, + d + ), Matrix4.getMatrix3(d, l)) : Matrix3.clone(Matrix3.IDENTITY, l); + } + p && (Cartesian3.cross( + s, + o, + c + ), Cartesian3.normalize(c, c), Matrix3.setColumn( + l, + 0, + s, + l + ), Matrix3.setColumn(l, 1, o, l), Matrix3.setColumn( + l, + 2, + c, + l + )), Quaternion.fromRotationMatrix(l, i); +} +function processScale(e, t, n) { + n = Cartesian3.fromElements(1, 1, 1, n); + const i = e.getProperty( + "SCALE", + ComponentDatatype$1.FLOAT, + 1, + t + ); + defined(i) && Cartesian3.multiplyByScalar(n, i, n); + const r = e.getProperty( + "SCALE_NON_UNIFORM", + ComponentDatatype$1.FLOAT, + 3, + t, + propertyScratch1 + ); + defined(r) && (n.x *= r[0], n.y *= r[1], n.z *= r[2]); +} +function unloadBuffers(e) { + const t = e._buffers, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i]; + r.isDestroyed() || r.destroy(); + } + t.length = 0; +} +I3dmLoader.prototype.isUnloaded = function() { + return this._state === I3dmLoaderState.UNLOADED; +}; +I3dmLoader.prototype.unload = function() { + defined(this._gltfLoader) && !this._gltfLoader.isDestroyed() && this._gltfLoader.unload(), unloadBuffers(this), this._components = void 0, this._arrayBuffer = void 0, this._state = I3dmLoaderState.UNLOADED; +}; +const ModelAnimationState = { + STOPPED: 0, + ANIMATING: 1 +}, ModelAnimationState$1 = Object.freeze(ModelAnimationState); +function Spline() { + this.times = void 0, this.points = void 0, DeveloperError.throwInstantiationError(); +} +Spline.getPointType = function(e) { + if (typeof e == "number") + return Number; + if (e instanceof Cartesian3) + return Cartesian3; + if (e instanceof Quaternion) + return Quaternion; +}; +Spline.prototype.evaluate = DeveloperError.throwInstantiationError; +Spline.prototype.findTimeInterval = function(e, t) { + const n = this.times, i = n.length; + if (t = defaultValue(t, 0), e >= n[t]) { + if (t + 1 < i && e < n[t + 1]) + return t; + if (t + 2 < i && e < n[t + 2]) + return t + 1; + } else if (t - 1 >= 0 && e >= n[t - 1]) + return t - 1; + let r; + if (e > n[t]) + for (r = t; r < i - 1 && !(e >= n[r] && e < n[r + 1]); ++r) + ; + else + for (r = t - 1; r >= 0 && !(e >= n[r] && e < n[r + 1]); --r) + ; + return r === i - 1 && (r = i - 2), r; +}; +Spline.prototype.wrapTime = function(e) { + const t = this.times, n = t[t.length - 1], i = t[0], r = n - i; + let o; + return e < i && (o = Math.floor((i - e) / r) + 1, e += o * r), e > n && (o = Math.floor((e - n) / r) + 1, e -= o * r), e; +}; +Spline.prototype.clampTime = function(e) { + const t = this.times; + return CesiumMath.clamp(e, t[0], t[t.length - 1]); +}; +function ConstantSpline(e) { + this._value = e, this._valueType = Spline.getPointType(e); +} +Object.defineProperties(ConstantSpline.prototype, { + /** + * The constant value that the spline evaluates to. + * + * @memberof ConstantSpline.prototype + * + * @type {number|Cartesian3|Quaternion} + * @readonly + */ + value: { + get: function() { + return this._value; + } + } +}); +ConstantSpline.prototype.findTimeInterval = function(e) { +}; +ConstantSpline.prototype.wrapTime = function(e) { + return 0; +}; +ConstantSpline.prototype.clampTime = function(e) { + return 0; +}; +ConstantSpline.prototype.evaluate = function(e, t) { + const n = this._value, i = this._valueType; + return i === Number ? n : i.clone(n, t); +}; +function LinearSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.points, n = e.times; + this._times = n, this._points = t, this._pointType = Spline.getPointType(t[0]), this._lastTimeIndex = 0; +} +Object.defineProperties(LinearSpline.prototype, { + /** + * An array of times for the control points. + * + * @memberof LinearSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of {@link Cartesian3} control points. + * + * @memberof LinearSpline.prototype + * + * @type {number[]|Cartesian3[]} + * @readonly + */ + points: { + get: function() { + return this._points; + } + } +}); +LinearSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +LinearSpline.prototype.wrapTime = Spline.prototype.wrapTime; +LinearSpline.prototype.clampTime = Spline.prototype.clampTime; +LinearSpline.prototype.evaluate = function(e, t) { + const n = this.points, i = this.times, r = this._lastTimeIndex = this.findTimeInterval( + e, + this._lastTimeIndex + ), o = (e - i[r]) / (i[r + 1] - i[r]); + return this._pointType === Number ? (1 - o) * n[r] + o * n[r + 1] : (defined(t) || (t = new Cartesian3()), Cartesian3.lerp(n[r], n[r + 1], o, t)); +}; +const TridiagonalSystemSolver = {}; +TridiagonalSystemSolver.solve = function(e, t, n, i) { + const r = new Array(n.length), o = new Array(i.length), s = new Array(i.length); + let c; + for (c = 0; c < o.length; c++) + o[c] = new Cartesian3(), s[c] = new Cartesian3(); + r[0] = n[0] / t[0], o[0] = Cartesian3.multiplyByScalar(i[0], 1 / t[0], o[0]); + let l; + for (c = 1; c < r.length; ++c) + l = 1 / (t[c] - r[c - 1] * e[c - 1]), r[c] = n[c] * l, o[c] = Cartesian3.subtract( + i[c], + Cartesian3.multiplyByScalar(o[c - 1], e[c - 1], o[c]), + o[c] + ), o[c] = Cartesian3.multiplyByScalar(o[c], l, o[c]); + for (l = 1 / (t[c] - r[c - 1] * e[c - 1]), o[c] = Cartesian3.subtract( + i[c], + Cartesian3.multiplyByScalar(o[c - 1], e[c - 1], o[c]), + o[c] + ), o[c] = Cartesian3.multiplyByScalar(o[c], l, o[c]), s[s.length - 1] = o[o.length - 1], c = s.length - 2; c >= 0; --c) + s[c] = Cartesian3.subtract( + o[c], + Cartesian3.multiplyByScalar(s[c + 1], r[c], s[c]), + s[c] + ); + return s; +}; +const scratchLower = [], scratchDiagonal = [], scratchUpper = [], scratchRight$3 = []; +function generateClamped(e, t, n) { + const i = scratchLower, r = scratchUpper, o = scratchDiagonal, s = scratchRight$3; + i.length = r.length = e.length - 1, o.length = s.length = e.length; + let c; + i[0] = o[0] = 1, r[0] = 0; + let l = s[0]; + for (defined(l) || (l = s[0] = new Cartesian3()), Cartesian3.clone(t, l), c = 1; c < i.length - 1; ++c) + i[c] = r[c] = 1, o[c] = 4, l = s[c], defined(l) || (l = s[c] = new Cartesian3()), Cartesian3.subtract(e[c + 1], e[c - 1], l), Cartesian3.multiplyByScalar(l, 3, l); + return i[c] = 0, r[c] = 1, o[c] = 4, l = s[c], defined(l) || (l = s[c] = new Cartesian3()), Cartesian3.subtract(e[c + 1], e[c - 1], l), Cartesian3.multiplyByScalar(l, 3, l), o[c + 1] = 1, l = s[c + 1], defined(l) || (l = s[c + 1] = new Cartesian3()), Cartesian3.clone(n, l), TridiagonalSystemSolver.solve(i, o, r, s); +} +function generateNatural(e) { + const t = scratchLower, n = scratchUpper, i = scratchDiagonal, r = scratchRight$3; + t.length = n.length = e.length - 1, i.length = r.length = e.length; + let o; + t[0] = n[0] = 1, i[0] = 2; + let s = r[0]; + for (defined(s) || (s = r[0] = new Cartesian3()), Cartesian3.subtract(e[1], e[0], s), Cartesian3.multiplyByScalar(s, 3, s), o = 1; o < t.length; ++o) + t[o] = n[o] = 1, i[o] = 4, s = r[o], defined(s) || (s = r[o] = new Cartesian3()), Cartesian3.subtract(e[o + 1], e[o - 1], s), Cartesian3.multiplyByScalar(s, 3, s); + return i[o] = 2, s = r[o], defined(s) || (s = r[o] = new Cartesian3()), Cartesian3.subtract(e[o], e[o - 1], s), Cartesian3.multiplyByScalar(s, 3, s), TridiagonalSystemSolver.solve(t, i, n, r); +} +function HermiteSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.points, n = e.times, i = e.inTangents, r = e.outTangents; + this._times = n, this._points = t, this._pointType = Spline.getPointType(t[0]), this._inTangents = i, this._outTangents = r, this._lastTimeIndex = 0; +} +Object.defineProperties(HermiteSpline.prototype, { + /** + * An array of times for the control points. + * + * @memberof HermiteSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of control points. + * + * @memberof HermiteSpline.prototype + * + * @type {Cartesian3[]} + * @readonly + */ + points: { + get: function() { + return this._points; + } + }, + /** + * An array of incoming tangents at each control point. + * + * @memberof HermiteSpline.prototype + * + * @type {Cartesian3[]} + * @readonly + */ + inTangents: { + get: function() { + return this._inTangents; + } + }, + /** + * An array of outgoing tangents at each control point. + * + * @memberof HermiteSpline.prototype + * + * @type {Cartesian3[]} + * @readonly + */ + outTangents: { + get: function() { + return this._outTangents; + } + } +}); +HermiteSpline.createC1 = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.times, n = e.points, i = e.tangents, r = i.slice(0, i.length - 1), o = i.slice(1, i.length); + return new HermiteSpline({ + times: t, + points: n, + inTangents: o, + outTangents: r + }); +}; +HermiteSpline.createNaturalCubic = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.times, n = e.points; + if (n.length < 3) + return new LinearSpline({ + points: n, + times: t + }); + const i = generateNatural(n), r = i.slice(0, i.length - 1), o = i.slice(1, i.length); + return new HermiteSpline({ + times: t, + points: n, + inTangents: o, + outTangents: r + }); +}; +HermiteSpline.createClampedCubic = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.times, n = e.points, i = e.firstTangent, r = e.lastTangent; + if (Spline.getPointType(n[0]), n.length < 3) + return new LinearSpline({ + points: n, + times: t + }); + const o = generateClamped(n, i, r), s = o.slice(0, o.length - 1), c = o.slice(1, o.length); + return new HermiteSpline({ + times: t, + points: n, + inTangents: c, + outTangents: s + }); +}; +HermiteSpline.hermiteCoefficientMatrix = new Matrix4( + 2, + -3, + 0, + 1, + -2, + 3, + 0, + 0, + 1, + -2, + 1, + 0, + 1, + -1, + 0, + 0 +); +HermiteSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +const scratchTimeVec$1 = new Cartesian4(), scratchTemp = new Cartesian3(); +HermiteSpline.prototype.wrapTime = Spline.prototype.wrapTime; +HermiteSpline.prototype.clampTime = Spline.prototype.clampTime; +HermiteSpline.prototype.evaluate = function(e, t) { + const n = this.points, i = this.times, r = this.inTangents, o = this.outTangents; + this._lastTimeIndex = this.findTimeInterval(e, this._lastTimeIndex); + const s = this._lastTimeIndex, c = i[s + 1] - i[s], l = (e - i[s]) / c, d = scratchTimeVec$1; + d.z = l, d.y = l * l, d.x = d.y * l, d.w = 1; + const f = Matrix4.multiplyByVector( + HermiteSpline.hermiteCoefficientMatrix, + d, + d + ); + f.z *= c, f.w *= c; + const h = this._pointType; + return h === Number ? n[s] * f.x + n[s + 1] * f.y + o[s] * f.z + r[s] * f.w : (defined(t) || (t = new h()), t = h.multiplyByScalar(n[s], f.x, t), h.multiplyByScalar(n[s + 1], f.y, scratchTemp), h.add(t, scratchTemp, t), h.multiplyByScalar(o[s], f.z, scratchTemp), h.add(t, scratchTemp, t), h.multiplyByScalar(r[s], f.w, scratchTemp), h.add(t, scratchTemp, t)); +}; +function SteppedSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.points, n = e.times; + this._times = n, this._points = t, this._pointType = Spline.getPointType(t[0]), this._lastTimeIndex = 0; +} +Object.defineProperties(SteppedSpline.prototype, { + /** + * An array of times for the control points. + * + * @memberof SteppedSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of control points. + * + * @memberof SteppedSpline.prototype + * + * @type {number[]|Cartesian3[]|Quaternion[]} + * @readonly + */ + points: { + get: function() { + return this._points; + } + } +}); +SteppedSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +SteppedSpline.prototype.wrapTime = Spline.prototype.wrapTime; +SteppedSpline.prototype.clampTime = Spline.prototype.clampTime; +SteppedSpline.prototype.evaluate = function(e, t) { + const n = this.points; + this._lastTimeIndex = this.findTimeInterval(e, this._lastTimeIndex); + const i = this._lastTimeIndex, r = this._pointType; + return r === Number ? n[i] : (defined(t) || (t = new r()), r.clone(n[i], t)); +}; +function createEvaluateFunction$1(e) { + const t = e.points, n = e.times; + return function(i, r) { + defined(r) || (r = new Quaternion()); + const o = e._lastTimeIndex = e.findTimeInterval( + i, + e._lastTimeIndex + ), s = (i - n[o]) / (n[o + 1] - n[o]), c = t[o], l = t[o + 1]; + return Quaternion.fastSlerp(c, l, s, r); + }; +} +function QuaternionSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.points, n = e.times; + this._times = n, this._points = t, this._evaluateFunction = createEvaluateFunction$1(this), this._lastTimeIndex = 0; +} +Object.defineProperties(QuaternionSpline.prototype, { + /** + * An array of times for the control points. + * + * @memberof QuaternionSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of {@link Quaternion} control points. + * + * @memberof QuaternionSpline.prototype + * + * @type {Quaternion[]} + * @readonly + */ + points: { + get: function() { + return this._points; + } + } +}); +QuaternionSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +QuaternionSpline.prototype.wrapTime = Spline.prototype.wrapTime; +QuaternionSpline.prototype.clampTime = Spline.prototype.clampTime; +QuaternionSpline.prototype.evaluate = function(e, t) { + return this._evaluateFunction(e, t); +}; +const AnimatedPropertyType = ModelComponents.AnimatedPropertyType; +function ModelAnimationChannel(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.channel, n = e.runtimeAnimation, i = e.runtimeNode; + this._channel = t, this._runtimeAnimation = n, this._runtimeNode = i, this._splines = [], this._path = void 0, initialize$c(this); +} +Object.defineProperties(ModelAnimationChannel.prototype, { + /** + * The glTF animation channel. + * + * @memberof ModelAnimationChannel.prototype + * + * @type {ModelComponents.AnimationChannel} + * @readonly + * + * @private + */ + channel: { + get: function() { + return this._channel; + } + }, + /** + * The runtime animation that owns this channel. + * + * @memberof ModelAnimationChannel.prototype + * + * @type {ModelAnimation} + * @readonly + * + * @private + */ + runtimeAnimation: { + get: function() { + return this._runtimeAnimation; + } + }, + /** + * The runtime node that this channel animates. + * + * @memberof ModelAnimationChannel.prototype + * + * @type {ModelRuntimeNode} + * @readonly + * + * @private + */ + runtimeNode: { + get: function() { + return this._runtimeNode; + } + }, + /** + * The splines used to evaluate this animation channel. + * + * @memberof ModelAnimationChannel.prototype + * + * @type {Spline[]} + * @readonly + * + * @private + */ + splines: { + get: function() { + return this._splines; + } + } +}); +function createCubicSpline(e, t) { + const n = [], i = [], r = [], o = t.length; + for (let s = 0; s < o; s += 3) + i.push(t[s]), n.push(t[s + 1]), r.push(t[s + 2]); + return i.splice(0, 1), r.length = r.length - 1, new HermiteSpline({ + times: e, + points: n, + inTangents: i, + outTangents: r + }); +} +function createSpline(e, t, n, i) { + if (e.length === 1 && t.length === 1) + return new ConstantSpline(t[0]); + switch (n) { + case InterpolationType$1.STEP: + return new SteppedSpline({ + times: e, + points: t + }); + case InterpolationType$1.CUBICSPLINE: + return createCubicSpline(e, t); + case InterpolationType$1.LINEAR: + return i === AnimatedPropertyType.ROTATION ? new QuaternionSpline({ + times: e, + points: t + }) : new LinearSpline({ + times: e, + points: t + }); + } +} +function createSplines(e, t, n, i, r) { + const o = []; + if (i === AnimatedPropertyType.WEIGHTS) { + const c = t.length / r; + let l, d; + for (l = 0; l < r; l++) { + const f = new Array(c); + let h = l; + if (n === InterpolationType$1.CUBICSPLINE) + for (d = 0; d < c; d += 3) + f[d] = t[h], f[d + 1] = t[h + r], f[d + 2] = t[h + 2 * r], h += r * 3; + else + for (d = 0; d < c; d++) + f[d] = t[h], h += r; + o.push(createSpline(e, f, n, i)); + } + } else + o.push(createSpline(e, t, n, i)); + return o; +} +const scratchCartesian3$a = new Cartesian3(), scratchQuaternion$1 = new Quaternion(); +function initialize$c(e) { + const t = e._channel, n = t.sampler, i = n.input, r = n.output, o = n.interpolation, c = t.target.path, l = e._runtimeNode, d = defined(l.morphWeights) ? l.morphWeights.length : 1, f = createSplines(i, r, o, c, d); + e._splines = f, e._path = c; +} +ModelAnimationChannel.prototype.animate = function(e) { + const t = this._splines, n = this._path, i = this._runtimeAnimation.model, r = this._runtimeNode; + if (n === AnimatedPropertyType.WEIGHTS) { + const o = r.morphWeights, s = o.length; + for (let c = 0; c < s; c++) { + const l = t[c], d = i.clampAnimations ? l.clampTime(e) : l.wrapTime(e); + o[c] = l.evaluate(d); + } + } else { + if (r.userAnimated) + return; + { + const o = t[0], s = i.clampAnimations ? o.clampTime(e) : o.wrapTime(e); + n === AnimatedPropertyType.TRANSLATION || n === AnimatedPropertyType.SCALE ? r[n] = o.evaluate( + s, + scratchCartesian3$a + ) : n === AnimatedPropertyType.ROTATION && (r[n] = o.evaluate( + s, + scratchQuaternion$1 + )); + } + } +}; +function ModelAnimation(e, t, n) { + this._animation = t, this._name = t.name, this._runtimeChannels = void 0, this._startTime = JulianDate.clone(n.startTime), this._delay = defaultValue(n.delay, 0), this._stopTime = JulianDate.clone(n.stopTime), this.removeOnStop = defaultValue(n.removeOnStop, !1), this._multiplier = defaultValue(n.multiplier, 1), this._reverse = defaultValue(n.reverse, !1), this._loop = defaultValue(n.loop, ModelAnimationLoop$1.NONE), this._animationTime = n.animationTime, this._prevAnimationDelta = void 0, this.start = new Event(), this.update = new Event(), this.stop = new Event(), this._state = ModelAnimationState$1.STOPPED, this._computedStartTime = void 0, this._duration = void 0; + const i = this; + this._raiseStartEvent = function() { + i.start.raiseEvent(e, i); + }, this._updateEventTime = 0, this._raiseUpdateEvent = function() { + i.update.raiseEvent(e, i, i._updateEventTime); + }, this._raiseStopEvent = function() { + i.stop.raiseEvent(e, i); + }, this._model = e, this._localStartTime = void 0, this._localStopTime = void 0, initialize$b(this); +} +Object.defineProperties(ModelAnimation.prototype, { + /** + * The glTF animation. + * + * @memberof ModelAnimation.prototype + * + * @type {ModelComponents.Animation} + * @readonly + * + * @private + */ + animation: { + get: function() { + return this._animation; + } + }, + /** + * The name that identifies this animation in the model, if it exists. + * + * @memberof ModelAnimation.prototype + * + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The runtime animation channels for this animation. + * + * @memberof ModelAnimation.prototype + * + * @type {ModelAnimationChannel[]} + * @readonly + * + * @private + */ + runtimeChannels: { + get: function() { + return this._runtimeChannels; + } + }, + /** + * The {@link Model} that owns this animation. + * + * @memberof ModelAnimation.prototype + * + * @type {Model} + * @readonly + * + * @private + */ + model: { + get: function() { + return this._model; + } + }, + /** + * The starting point of the animation in local animation time. This is the minimum + * time value across all of the keyframes belonging to this animation. + * + * @memberof ModelAnimation.prototype + * + * @type {number} + * @readonly + * + * @private + */ + localStartTime: { + get: function() { + return this._localStartTime; + } + }, + /** + * The stopping point of the animation in local animation time. This is the maximum + * time value across all of the keyframes belonging to this animation. + * + * @memberof ModelAnimation.prototype + * + * @type {number} + * @readonly + * + * @private + */ + localStopTime: { + get: function() { + return this._localStopTime; + } + }, + /** + * The scene time to start playing this animation. When this is undefined, + * the animation starts at the next frame. + * + * @memberof ModelAnimation.prototype + * + * @type {JulianDate} + * @readonly + * + * @default undefined + */ + startTime: { + get: function() { + return this._startTime; + } + }, + /** + * The delay, in seconds, from {@link ModelAnimation#startTime} to start playing. + * + * @memberof ModelAnimation.prototype + * + * @type {number} + * @readonly + * + * @default undefined + */ + delay: { + get: function() { + return this._delay; + } + }, + /** + * The scene time to stop playing this animation. When this is undefined, + * the animation is played for its full duration and perhaps repeated depending on + * {@link ModelAnimation#loop}. + * + * @memberof ModelAnimation.prototype + * + * @type {JulianDate} + * @readonly + * + * @default undefined + */ + stopTime: { + get: function() { + return this._stopTime; + } + }, + /** + * Values greater than 1.0 increase the speed that the animation is played relative + * to the scene clock speed; values less than 1.0 decrease the speed. A value of + * 1.0 plays the animation at the speed in the glTF animation mapped to the scene + * clock speed. For example, if the scene is played at 2x real-time, a two-second glTF animation + * will play in one second even if multiplier is 1.0. + * + * @memberof ModelAnimation.prototype + * + * @type {number} + * @readonly + * + * @default 1.0 + */ + multiplier: { + get: function() { + return this._multiplier; + } + }, + /** + * When true, the animation is played in reverse. + * + * @memberof ModelAnimation.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + reverse: { + get: function() { + return this._reverse; + } + }, + /** + * Determines if and how the animation is looped. + * + * @memberof ModelAnimation.prototype + * + * @type {ModelAnimationLoop} + * @readonly + * + * @default {@link ModelAnimationLoop.NONE} + */ + loop: { + get: function() { + return this._loop; + } + }, + /** + * If this is defined, it will be used to compute the local animation time + * instead of the scene's time. + * + * @memberof ModelAnimation.prototype + * + * @type {ModelAnimation.AnimationTimeCallback} + * @default undefined + */ + animationTime: { + get: function() { + return this._animationTime; + } + } +}); +function initialize$b(e) { + let t = Number.MAX_VALUE, n = -Number.MAX_VALUE; + const i = e._model.sceneGraph, o = e._animation.channels, s = o.length, c = []; + for (let l = 0; l < s; l++) { + const d = o[l], f = d.target; + if (!defined(f)) + continue; + const h = f.node.index, p = i._runtimeNodes[h], m = new ModelAnimationChannel({ + channel: d, + runtimeAnimation: e, + runtimeNode: p + }), _ = d.sampler.input; + t = Math.min(t, _[0]), n = Math.max(n, _[_.length - 1]), c.push(m); + } + e._runtimeChannels = c, e._localStartTime = t, e._localStopTime = n; +} +ModelAnimation.prototype.animate = function(e) { + const t = this._runtimeChannels, n = t.length; + for (let i = 0; i < n; i++) + t[i].animate(e); +}; +function ModelAnimationCollection(e) { + this.animationAdded = new Event(), this.animationRemoved = new Event(), this.animateWhilePaused = !1, this._model = e, this._runtimeAnimations = [], this._previousTime = void 0; +} +Object.defineProperties(ModelAnimationCollection.prototype, { + /** + * The number of animations in the collection. + * + * @memberof ModelAnimationCollection.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._runtimeAnimations.length; + } + }, + /** + * The model that owns this animation collection. + * + * @memberof ModelAnimationCollection.prototype + * + * @type {Model} + * @readonly + */ + model: { + get: function() { + return this._model; + } + } +}); +function addAnimation(e, t, n) { + const i = e._model, r = new ModelAnimation(i, t, n); + return e._runtimeAnimations.push(r), e.animationAdded.raiseEvent(i, r), r; +} +ModelAnimationCollection.prototype.add = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = this._model.sceneGraph.components.animations; + let i = e.index; + if (defined(i)) + return addAnimation(this, n[i], e); + const r = n.length; + for (let o = 0; o < r; ++o) + if (n[o].name === e.name) { + i = o; + break; + } + return addAnimation(this, n[i], e); +}; +ModelAnimationCollection.prototype.addAll = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = this._model.sceneGraph.components.animations, i = [], r = n.length; + for (let o = 0; o < r; ++o) { + const s = addAnimation(this, n[o], e); + i.push(s); + } + return i; +}; +ModelAnimationCollection.prototype.remove = function(e) { + if (!defined(e)) + return !1; + const t = this._runtimeAnimations, n = t.indexOf(e); + return n !== -1 ? (t.splice(n, 1), this.animationRemoved.raiseEvent(this._model, e), !0) : !1; +}; +ModelAnimationCollection.prototype.removeAll = function() { + const e = this._model, t = this._runtimeAnimations, n = t.length; + this._runtimeAnimations.length = 0; + for (let i = 0; i < n; ++i) + this.animationRemoved.raiseEvent(e, t[i]); +}; +ModelAnimationCollection.prototype.contains = function(e) { + return defined(e) ? this._runtimeAnimations.indexOf(e) !== -1 : !1; +}; +ModelAnimationCollection.prototype.get = function(e) { + return this._runtimeAnimations[e]; +}; +const animationsToRemove = []; +function createAnimationRemovedFunction(e, t, n) { + return function() { + e.animationRemoved.raiseEvent(t, n); + }; +} +ModelAnimationCollection.prototype.update = function(e) { + const t = this._runtimeAnimations; + let n = t.length; + if (n === 0) + return this._previousTime = void 0, !1; + if (!this.animateWhilePaused && JulianDate.equals(e.time, this._previousTime)) + return !1; + this._previousTime = JulianDate.clone(e.time, this._previousTime); + let i = !1; + const r = e.time, o = this._model; + for (let s = 0; s < n; ++s) { + const c = t[s]; + defined(c._computedStartTime) || (c._computedStartTime = JulianDate.addSeconds( + defaultValue(c.startTime, r), + c.delay, + new JulianDate() + )), defined(c._duration) || (c._duration = c.localStopTime * (1 / c.multiplier)); + const l = c._computedStartTime, d = c._duration, f = c.stopTime, h = JulianDate.lessThanOrEquals(l, r), p = defined(f) && JulianDate.greaterThan(r, f); + let m = 0; + if (d !== 0) { + const C = JulianDate.secondsDifference( + p ? f : r, + l + ); + m = defined(c._animationTime) ? c._animationTime(d, C) : C / d; + } + const _ = c.loop === ModelAnimationLoop$1.REPEAT || c.loop === ModelAnimationLoop$1.MIRRORED_REPEAT, y = (h || _ && !defined(c.startTime)) && (m <= 1 || _) && !p; + if (m === c._prevAnimationDelta) { + const C = c._state === ModelAnimationState$1.STOPPED; + if (y !== C) + continue; + } + if (c._prevAnimationDelta = m, y || c._state === ModelAnimationState$1.ANIMATING) { + if (y && c._state === ModelAnimationState$1.STOPPED && (c._state = ModelAnimationState$1.ANIMATING, c.start.numberOfListeners > 0 && e.afterRender.push(c._raiseStartEvent)), c.loop === ModelAnimationLoop$1.REPEAT) + m = m - Math.floor(m); + else if (c.loop === ModelAnimationLoop$1.MIRRORED_REPEAT) { + const T = Math.floor(m), x = m - T; + m = T % 2 === 1 ? 1 - x : x; + } + c.reverse && (m = 1 - m); + let C = m * d * c.multiplier; + C = CesiumMath.clamp( + C, + c.localStartTime, + c.localStopTime + ), c.animate(C), c.update.numberOfListeners > 0 && (c._updateEventTime = C, e.afterRender.push(c._raiseUpdateEvent)), i = !0, y || (c._state = ModelAnimationState$1.STOPPED, c.stop.numberOfListeners > 0 && e.afterRender.push(c._raiseStopEvent), c.removeOnStop && animationsToRemove.push(c)); + } + } + n = animationsToRemove.length; + for (let s = 0; s < n; ++s) { + const c = animationsToRemove[s]; + t.splice(t.indexOf(c), 1), e.afterRender.push( + createAnimationRemovedFunction(this, o, c) + ); + } + return animationsToRemove.length = 0, i; +}; +function ModelFeature(e) { + this._model = e.model, this._featureTable = e.featureTable, this._featureId = e.featureId, this._color = void 0; +} +Object.defineProperties(ModelFeature.prototype, { + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + * + * @memberof ModelFeature.prototype + * + * @type {boolean} + * + * @default true + */ + show: { + get: function() { + return this._featureTable.getShow(this._featureId); + }, + set: function(e) { + this._featureTable.setShow(this._featureId, e); + } + }, + /** + * Gets or sets the highlight color multiplied with the feature's color. When + * this is white, the feature's color is not changed. This is set for all features + * when a style's color is evaluated. + * + * @memberof ModelFeature.prototype + * + * @type {Color} + * + * @default {@link Color.WHITE} + */ + color: { + get: function() { + return defined(this._color) || (this._color = new Color()), this._featureTable.getColor(this._featureId, this._color); + }, + set: function(e) { + this._featureTable.setColor(this._featureId, e); + } + }, + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the model containing the feature. + * + * @memberof ModelFeature.prototype + * + * @type {Model} + * + * @readonly + * @private + */ + primitive: { + get: function() { + return this._model; + } + }, + /** + * The {@link ModelFeatureTable} that this feature belongs to. + * + * @memberof ModelFeature.prototype + * + * @type {ModelFeatureTable} + * + * @readonly + * @private + */ + featureTable: { + get: function() { + return this._featureTable; + } + }, + /** + * Get the feature ID associated with this feature. For 3D Tiles 1.0, the + * batch ID is returned. For EXT_mesh_features, this is the feature ID from + * the selected feature ID set. + * + * @memberof ModelFeature.prototype + * + * @type {number} + * + * @readonly + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + featureId: { + get: function() { + return this._featureId; + } + } +}); +ModelFeature.prototype.hasProperty = function(e) { + return this._featureTable.hasProperty(this._featureId, e); +}; +ModelFeature.prototype.getProperty = function(e) { + return this._featureTable.getProperty(this._featureId, e); +}; +ModelFeature.prototype.getPropertyInherited = function(e) { + return this._featureTable.hasPropertyBySemantic(this._featureId, e) ? this._featureTable.getPropertyBySemantic(this._featureId, e) : this._featureTable.getProperty(this._featureId, e); +}; +ModelFeature.prototype.getPropertyIds = function(e) { + return this._featureTable.getPropertyIds(e); +}; +ModelFeature.prototype.setProperty = function(e, t) { + return this._featureTable.setProperty(this._featureId, e, t); +}; +const StyleCommandsNeeded = { + ALL_OPAQUE: 0, + ALL_TRANSLUCENT: 1, + OPAQUE_AND_TRANSLUCENT: 2 +}; +StyleCommandsNeeded.getStyleCommandsNeeded = function(e, t) { + return t === 0 ? StyleCommandsNeeded.ALL_OPAQUE : t === e ? StyleCommandsNeeded.ALL_TRANSLUCENT : StyleCommandsNeeded.OPAQUE_AND_TRANSLUCENT; +}; +const StyleCommandsNeeded$1 = Object.freeze(StyleCommandsNeeded), ModelType = { + /** + * An individual glTF model. + *

+ * Not to be confused with {@link ModelType.TILE_GLTF} + * which is for 3D Tiles + *

+ * + * @type {string} + * @constant + */ + GLTF: "GLTF", + /** + * A glTF model used as tile content in a 3D Tileset via + * 3DTILES_content_gltf. + *

+ * Not to be confused with {@link ModelType.GLTF} + * which is for individual models + *

+ * + * @type {string} + * @constant + */ + TILE_GLTF: "TILE_GLTF", + /** + * A 3D Tiles 1.0 Batched 3D Model + * + * @type {string} + * @constant + */ + TILE_B3DM: "B3DM", + /** + * A 3D Tiles 1.0 Instanced 3D Model + * + * @type {string} + * @constant + */ + TILE_I3DM: "I3DM", + /** + * A 3D Tiles 1.0 Point Cloud + * + * @type {string} + * @constant + */ + TILE_PNTS: "PNTS", + /** + * GeoJSON content for MAXAR_content_geojson extension + * + * @type {string} + * @constant + */ + TILE_GEOJSON: "TILE_GEOJSON" +}; +ModelType.is3DTiles = function(e) { + switch (e) { + case ModelType.TILE_GLTF: + case ModelType.TILE_B3DM: + case ModelType.TILE_I3DM: + case ModelType.TILE_PNTS: + case ModelType.TILE_GEOJSON: + return !0; + case ModelType.GLTF: + return !1; + } +}; +const ModelType$1 = Object.freeze(ModelType); +function ModelFeatureTable(e) { + const t = e.model, n = e.propertyTable; + this._propertyTable = n, this._model = t, this._features = void 0, this._featuresLength = 0, this._batchTexture = void 0, this._styleCommandsNeededDirty = !1, this._styleCommandsNeeded = StyleCommandsNeeded$1.ALL_OPAQUE, initialize$a(this); +} +Object.defineProperties(ModelFeatureTable.prototype, { + /** + * The batch texture created for the features in this table. + * + * @memberof ModelFeatureTable.prototype + * + * @type {BatchTexture} + * @readonly + * + * @private + */ + batchTexture: { + get: function() { + return this._batchTexture; + } + }, + /** + * The number of features in this table. + * + * @memberof ModelFeatureTable.prototype + * + * @type {number} + * @readonly + * + * @private + */ + featuresLength: { + get: function() { + return this._featuresLength; + } + }, + /** + * Size of the batch texture. This does not count the property table size + * as that is counted separately through StructuralMetadata. + * + * @memberof ModelFeatureTable.prototype + * + * @type {number} + * @readonly + * + * @private + */ + batchTextureByteLength: { + get: function() { + return defined(this._batchTexture) ? this._batchTexture.byteLength : 0; + } + }, + /** + * A flag to indicate whether or not the types of style commands needed by this feature table have changed. + * + * @memberof ModelFeatureTable.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + styleCommandsNeededDirty: { + get: function() { + return this._styleCommandsNeededDirty; + } + } +}); +function initialize$a(e) { + const t = e._model, n = ModelType$1.is3DTiles(t.type), i = e._propertyTable.count; + if (i === 0) + return; + let r; + const o = new Array(i); + if (n) { + const s = t.content; + for (r = 0; r < i; r++) + o[r] = new Cesium3DTileFeature(s, r); + } else + for (r = 0; r < i; r++) + o[r] = new ModelFeature({ + model: t, + featureId: r, + featureTable: e + }); + e._features = o, e._featuresLength = i, e._batchTexture = new BatchTexture({ + featuresLength: i, + owner: e, + statistics: n ? t.content.tileset.statistics : void 0 + }); +} +ModelFeatureTable.prototype.update = function(e) { + this._styleCommandsNeededDirty = !1, this._batchTexture.update(void 0, e); + const t = StyleCommandsNeeded$1.getStyleCommandsNeeded( + this._featuresLength, + this._batchTexture.translucentFeaturesLength + ); + this._styleCommandsNeeded !== t && (this._styleCommandsNeededDirty = !0, this._styleCommandsNeeded = t); +}; +ModelFeatureTable.prototype.setShow = function(e, t) { + this._batchTexture.setShow(e, t); +}; +ModelFeatureTable.prototype.setAllShow = function(e) { + this._batchTexture.setAllShow(e); +}; +ModelFeatureTable.prototype.getShow = function(e) { + return this._batchTexture.getShow(e); +}; +ModelFeatureTable.prototype.setColor = function(e, t) { + this._batchTexture.setColor(e, t); +}; +ModelFeatureTable.prototype.setAllColor = function(e) { + this._batchTexture.setAllColor(e); +}; +ModelFeatureTable.prototype.getColor = function(e, t) { + return this._batchTexture.getColor(e, t); +}; +ModelFeatureTable.prototype.getPickColor = function(e) { + return this._batchTexture.getPickColor(e); +}; +ModelFeatureTable.prototype.getFeature = function(e) { + return this._features[e]; +}; +ModelFeatureTable.prototype.hasProperty = function(e, t) { + return this._propertyTable.hasProperty(e, t); +}; +ModelFeatureTable.prototype.hasPropertyBySemantic = function(e, t) { + return this._propertyTable.hasPropertyBySemantic(e, t); +}; +ModelFeatureTable.prototype.getProperty = function(e, t) { + return this._propertyTable.getProperty(e, t); +}; +ModelFeatureTable.prototype.getPropertyBySemantic = function(e, t) { + return this._propertyTable.getPropertyBySemantic(e, t); +}; +ModelFeatureTable.prototype.getPropertyIds = function(e) { + return this._propertyTable.getPropertyIds(e); +}; +ModelFeatureTable.prototype.setProperty = function(e, t, n) { + return this._propertyTable.setProperty(e, t, n); +}; +ModelFeatureTable.prototype.isClass = function(e, t) { + return this._propertyTable.isClass(e, t); +}; +ModelFeatureTable.prototype.isExactClass = function(e, t) { + return this._propertyTable.isExactClass(e, t); +}; +ModelFeatureTable.prototype.getExactClassName = function(e) { + return this._propertyTable.getExactClassName(e); +}; +const scratchColor$k = new Color(); +ModelFeatureTable.prototype.applyStyle = function(e) { + if (!defined(e)) { + this.setAllColor(BatchTexture.DEFAULT_COLOR_VALUE), this.setAllShow(BatchTexture.DEFAULT_SHOW_VALUE); + return; + } + for (let t = 0; t < this._featuresLength; t++) { + const n = this.getFeature(t), i = defined(e.color) ? defaultValue( + e.color.evaluateColor(n, scratchColor$k), + BatchTexture.DEFAULT_COLOR_VALUE + ) : BatchTexture.DEFAULT_COLOR_VALUE, r = defined(e.show) ? defaultValue( + e.show.evaluate(n), + BatchTexture.DEFAULT_SHOW_VALUE + ) : BatchTexture.DEFAULT_SHOW_VALUE; + this.setColor(t, i), this.setShow(t, r); + } +}; +ModelFeatureTable.prototype.isDestroyed = function() { + return !1; +}; +ModelFeatureTable.prototype.destroy = function(e) { + this._batchTexture = this._batchTexture && this._batchTexture.destroy(), destroyObject(this); +}; +const ModelFS = ` +precision highp float; +czm_modelMaterial defaultModelMaterial() +{ + czm_modelMaterial material; + material.diffuse = vec3(0.0); + material.specular = vec3(1.0); + material.roughness = 1.0; + material.occlusion = 1.0; + material.normalEC = vec3(0.0, 0.0, 1.0); + material.emissive = vec3(0.0); + material.alpha = 1.0; + return material; +} + +vec4 handleAlpha(vec3 color, float alpha) +{ + #ifdef ALPHA_MODE_MASK + if (alpha < u_alphaCutoff) { + discard; + } + #endif + + return vec4(color, alpha); +} + +SelectedFeature selectedFeature; + +void main() +{ + #ifdef HAS_MODEL_SPLITTER + modelSplitterStage(); + #endif + + czm_modelMaterial material = defaultModelMaterial(); + + ProcessedAttributes attributes; + geometryStage(attributes); + + FeatureIds featureIds; + featureIdStage(featureIds, attributes); + + Metadata metadata; + MetadataClass metadataClass; + MetadataStatistics metadataStatistics; + metadataStage(metadata, metadataClass, metadataStatistics, attributes); + + #ifdef HAS_SELECTED_FEATURE_ID + selectedFeatureIdStage(selectedFeature, featureIds); + #endif + + #ifndef CUSTOM_SHADER_REPLACE_MATERIAL + materialStage(material, attributes, selectedFeature); + #endif + + #ifdef HAS_CUSTOM_FRAGMENT_SHADER + customShaderStage(material, attributes, featureIds, metadata, metadataClass, metadataStatistics); + #endif + + lightingStage(material, attributes); + + #ifdef HAS_SELECTED_FEATURE_ID + cpuStylingStage(material, selectedFeature); + #endif + + #ifdef HAS_MODEL_COLOR + modelColorStage(material); + #endif + + #ifdef HAS_PRIMITIVE_OUTLINE + primitiveOutlineStage(material); + #endif + + vec4 color = handleAlpha(material.diffuse, material.alpha); + + #ifdef HAS_CLIPPING_PLANES + modelClippingPlanesStage(color); + #endif + + #ifdef ENABLE_CLIPPING_POLYGONS + modelClippingPolygonsStage(); + #endif + + #if defined(HAS_SILHOUETTE) && defined(HAS_NORMALS) + silhouetteStage(color); + #endif + + #ifdef HAS_ATMOSPHERE + atmosphereStage(color, attributes); + #endif + + out_FragColor = color; +} +`, ModelVS = `precision highp float; + +czm_modelVertexOutput defaultVertexOutput(vec3 positionMC) { + czm_modelVertexOutput vsOutput; + vsOutput.positionMC = positionMC; + vsOutput.pointSize = 1.0; + return vsOutput; +} + +void main() +{ + // Initialize the attributes struct with all + // attributes except quantized ones. + ProcessedAttributes attributes; + initializeAttributes(attributes); + + // Dequantize the quantized ones and add them to the + // attributes struct. + #ifdef USE_DEQUANTIZATION + dequantizationStage(attributes); + #endif + + #ifdef HAS_MORPH_TARGETS + morphTargetsStage(attributes); + #endif + + #ifdef HAS_SKINNING + skinningStage(attributes); + #endif + + #ifdef HAS_PRIMITIVE_OUTLINE + primitiveOutlineStage(); + #endif + + // Compute the bitangent according to the formula in the glTF spec. + // Normal and tangents can be affected by morphing and skinning, so + // the bitangent should not be computed until their values are finalized. + #ifdef HAS_BITANGENTS + attributes.bitangentMC = normalize(cross(attributes.normalMC, attributes.tangentMC) * attributes.tangentSignMC); + #endif + + FeatureIds featureIds; + featureIdStage(featureIds, attributes); + + #ifdef HAS_SELECTED_FEATURE_ID + SelectedFeature feature; + selectedFeatureIdStage(feature, featureIds); + // Handle any show properties that come from the style. + cpuStylingStage(attributes.positionMC, feature); + #endif + + #if defined(USE_2D_POSITIONS) || defined(USE_2D_INSTANCING) + // The scene mode 2D pipeline stage and instancing stage add a different + // model view matrix to accurately project the model to 2D. However, the + // output positions and normals should be transformed by the 3D matrices + // to keep the data the same for the fragment shader. + mat4 modelView = czm_modelView3D; + mat3 normal = czm_normal3D; + #else + // These are used for individual model projection because they will + // automatically change based on the scene mode. + mat4 modelView = czm_modelView; + mat3 normal = czm_normal; + #endif + + // Update the position for this instance in place + #ifdef HAS_INSTANCING + + // The legacy instance stage is used when rendering i3dm models that + // encode instances transforms in world space, as opposed to glTF models + // that use EXT_mesh_gpu_instancing, where instance transforms are encoded + // in object space. + #ifdef USE_LEGACY_INSTANCING + mat4 instanceModelView; + mat3 instanceModelViewInverseTranspose; + + legacyInstancingStage(attributes, instanceModelView, instanceModelViewInverseTranspose); + + modelView = instanceModelView; + normal = instanceModelViewInverseTranspose; + #else + instancingStage(attributes); + #endif + + #ifdef USE_PICKING + v_pickColor = a_pickColor; + #endif + + #endif + + Metadata metadata; + MetadataClass metadataClass; + MetadataStatistics metadataStatistics; + metadataStage(metadata, metadataClass, metadataStatistics, attributes); + + #ifdef HAS_VERTICAL_EXAGGERATION + verticalExaggerationStage(attributes); + #endif + + #ifdef HAS_CUSTOM_VERTEX_SHADER + czm_modelVertexOutput vsOutput = defaultVertexOutput(attributes.positionMC); + customShaderStage(vsOutput, attributes, featureIds, metadata, metadataClass, metadataStatistics); + #endif + + // Compute the final position in each coordinate system needed. + // This returns the value that will be assigned to gl_Position. + vec4 positionClip = geometryStage(attributes, modelView, normal); + + // This must go after the geometry stage as it needs v_positionWC + #ifdef HAS_ATMOSPHERE + atmosphereStage(attributes); + #endif + + #ifdef ENABLE_CLIPPING_POLYGONS + modelClippingPolygonsStage(attributes); + #endif + + #ifdef HAS_SILHOUETTE + silhouetteStage(attributes, positionClip); + #endif + + #ifdef HAS_POINT_CLOUD_SHOW_STYLE + float show = pointCloudShowStylingStage(attributes, metadata); + #else + float show = 1.0; + #endif + + #ifdef HAS_POINT_CLOUD_BACK_FACE_CULLING + show *= pointCloudBackFaceCullingStage(); + #endif + + #ifdef HAS_POINT_CLOUD_COLOR_STYLE + v_pointCloudColor = pointCloudColorStylingStage(attributes, metadata); + #endif + + #ifdef PRIMITIVE_TYPE_POINTS + #ifdef HAS_CUSTOM_VERTEX_SHADER + gl_PointSize = vsOutput.pointSize; + #elif defined(HAS_POINT_CLOUD_POINT_SIZE_STYLE) || defined(HAS_POINT_CLOUD_ATTENUATION) + gl_PointSize = pointCloudPointSizeStylingStage(attributes, metadata); + #else + gl_PointSize = 1.0; + #endif + + gl_PointSize *= show; + #endif + + gl_Position = show * positionClip; +} +`; +function ClassificationModelDrawCommand(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.command, n = e.primitiveRenderResources, i = n.model; + this._command = t, this._model = i, this._runtimePrimitive = n.runtimePrimitive, this._modelMatrix = t.modelMatrix, this._boundingVolume = t.boundingVolume, this._cullFace = t.renderState.cull.face; + const r = i.classificationType; + this._classificationType = r, this._classifiesTerrain = r !== ClassificationType$1.CESIUM_3D_TILE, this._classifies3DTiles = r !== ClassificationType$1.TERRAIN, this._useDebugWireframe = i._enableDebugWireframe && i.debugWireframe, this._pickId = n.pickId, this._commandListTerrain = [], this._commandList3DTiles = [], this._commandListIgnoreShow = [], this._commandListDebugWireframe = [], this._commandListTerrainPicking = [], this._commandList3DTilesPicking = [], initialize$9(this); +} +function getStencilDepthRenderState(e) { + return { + colorMask: { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, + stencilTest: { + enabled: !0, + frontFunction: e, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.DECREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + backFunction: e, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.INCREMENT_WRAP, + zPass: StencilOperation$1.KEEP + }, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS_OR_EQUAL + }, + depthMask: !1 + }; +} +const colorRenderState = { + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND +}, pickRenderState = { + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + backFunction: StencilFunction$1.NOT_EQUAL, + backOperation: { + fail: StencilOperation$1.ZERO, + zFail: StencilOperation$1.ZERO, + zPass: StencilOperation$1.ZERO + }, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + stencilMask: StencilConstants$1.CLASSIFICATION_MASK, + depthTest: { + enabled: !1 + }, + depthMask: !1 +}, scratchDerivedCommands = []; +function initialize$9(e) { + const t = e._command, n = scratchDerivedCommands; + if (e._useDebugWireframe) { + t.pass = Pass$1.OPAQUE, n.length = 0, n.push(t), e._commandListDebugWireframe = createBatchCommands( + e, + n, + e._commandListDebugWireframe + ); + const o = e._commandListDebugWireframe, s = o.length; + for (let c = 0; c < s; c++) { + const l = o[c]; + l.count *= 2, l.offset *= 2; + } + return; + } + const r = e.model.allowPicking; + if (e._classifiesTerrain) { + const o = Pass$1.TERRAIN_CLASSIFICATION, s = deriveStencilDepthCommand(t, o), c = deriveColorCommand(t, o); + n.length = 0, n.push(s, c), e._commandListTerrain = createBatchCommands( + e, + n, + e._commandListTerrain + ), r && (e._commandListTerrainPicking = createPickCommands( + e, + n, + e._commandListTerrainPicking + )); + } + if (e._classifies3DTiles) { + const o = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, s = deriveStencilDepthCommand(t, o), c = deriveColorCommand(t, o); + n.length = 0, n.push(s, c), e._commandList3DTiles = createBatchCommands( + e, + n, + e._commandList3DTiles + ), r && (e._commandList3DTilesPicking = createPickCommands( + e, + n, + e._commandList3DTilesPicking + )); + } +} +function createBatchCommands(e, t, n) { + const i = e._runtimePrimitive, r = i.batchLengths, o = i.batchOffsets, s = r.length, c = t.length; + for (let l = 0; l < s; l++) { + const d = r[l], f = o[l]; + for (let h = 0; h < c; h++) { + const p = t[h], m = DrawCommand.shallowClone(p); + m.count = d, m.offset = f, n.push(m); + } + } + return n; +} +function deriveStencilDepthCommand(e, t) { + const n = DrawCommand.shallowClone(e); + n.cull = !1, n.pass = t; + const i = t === Pass$1.TERRAIN_CLASSIFICATION ? StencilFunction$1.ALWAYS : StencilFunction$1.EQUAL, r = getStencilDepthRenderState(i); + return n.renderState = RenderState.fromCache(r), n; +} +function deriveColorCommand(e, t) { + const n = DrawCommand.shallowClone(e); + return n.cull = !1, n.pass = t, n.renderState = RenderState.fromCache(colorRenderState), n; +} +const scratchPickCommands = []; +function createPickCommands(e, t, n) { + const i = RenderState.fromCache(pickRenderState), r = t[0], o = t[1], s = DrawCommand.shallowClone(r); + s.cull = !0, s.pickOnly = !0; + const c = DrawCommand.shallowClone(o); + c.cull = !0, c.pickOnly = !0, c.renderState = i, c.pickId = e._pickId; + const l = scratchPickCommands; + return l.length = 0, l.push(s, c), createBatchCommands(e, l, n); +} +Object.defineProperties(ClassificationModelDrawCommand.prototype, { + /** + * The main draw command that the other commands are derived from. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {DrawCommand} + * + * @readonly + * @private + */ + command: { + get: function() { + return this._command; + } + }, + /** + * The runtime primitive that the draw command belongs to. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {ModelRuntimePrimitive} + * + * @readonly + * @private + */ + runtimePrimitive: { + get: function() { + return this._runtimePrimitive; + } + }, + /** + * The batch lengths used to generate multiple draw commands. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {number[]} + * + * @readonly + * @private + */ + batchLengths: { + get: function() { + return this._runtimePrimitive.batchLengths; + } + }, + /** + * The batch offsets used to generate multiple draw commands. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {number[]} + * + * @readonly + * @private + */ + batchOffsets: { + get: function() { + return this._runtimePrimitive.batchOffsets; + } + }, + /** + * The model that the draw command belongs to. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {Model} + * + * @readonly + * @private + */ + model: { + get: function() { + return this._model; + } + }, + /** + * The classification type of the model that this draw command belongs to. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {ClassificationType} + * + * @readonly + * @private + */ + classificationType: { + get: function() { + return this._classificationType; + } + }, + /** + * The current model matrix applied to the draw commands. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {Matrix4} + * + * @readonly + * @private + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._modelMatrix = Matrix4.clone(e, this._modelMatrix); + const t = this._runtimePrimitive.boundingSphere; + this._boundingVolume = BoundingSphere.transform( + t, + this._modelMatrix, + this._boundingVolume + ); + } + }, + /** + * The bounding volume of the main draw command. This is equivalent + * to the primitive's bounding sphere transformed by the draw + * command's model matrix. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {BoundingSphere} + * + * @readonly + * @private + */ + boundingVolume: { + get: function() { + return this._boundingVolume; + } + }, + /** + * Culling is disabled for classification models, so this has no effect on + * how the model renders. This only exists to match the interface of + * {@link ModelDrawCommand}. + * + * @memberof ClassificationModelDrawCommand.prototype + * @type {CullFace} + * + * @private + */ + cullFace: { + get: function() { + return this._cullFace; + }, + set: function(e) { + this._cullFace = e; + } + } +}); +ClassificationModelDrawCommand.prototype.pushCommands = function(e, t) { + const n = e.passes; + if (n.render) { + if (this._useDebugWireframe) { + t.push.apply(t, this._commandListDebugWireframe); + return; + } + if (this._classifiesTerrain && t.push.apply(t, this._commandListTerrain), this._classifies3DTiles && t.push.apply(t, this._commandList3DTiles), e.invertClassification && this._classifies3DTiles) { + if (this._commandListIgnoreShow.length === 0) { + const r = Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW, o = deriveStencilDepthCommand(this._command, r), s = scratchDerivedCommands; + s.length = 0, s.push(o), this._commandListIgnoreShow = createBatchCommands( + this, + s, + this._commandListIgnoreShow + ); + } + t.push.apply(t, this._commandListIgnoreShow); + } + } + return n.pick && (this._classifiesTerrain && t.push.apply(t, this._commandListTerrainPicking), this._classifies3DTiles && t.push.apply(t, this._commandList3DTilesPicking)), t; +}; +function ModelDrawCommand(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.command, n = e.primitiveRenderResources, i = n.model; + this._model = i; + const r = n.runtimePrimitive; + this._runtimePrimitive = r; + const o = t.pass === Pass$1.TRANSLUCENT, c = !r.primitive.material.doubleSided && !o, l = n.hasSilhouette, d = !o && !l, f = n.hasSkipLevelOfDetail && !o, h = l; + this._command = t, this._modelMatrix = Matrix4.clone(t.modelMatrix), this._boundingVolume = BoundingSphere.clone(t.boundingVolume), this._modelMatrix2D = new Matrix4(), this._boundingVolume2D = new BoundingSphere(), this._modelMatrix2DDirty = !1, this._backFaceCulling = t.renderState.cull.enabled, this._cullFace = t.renderState.cull.face, this._shadows = i.shadows, this._debugShowBoundingVolume = t.debugShowBoundingVolume, this._usesBackFaceCulling = c, this._needsTranslucentCommand = d, this._needsSkipLevelOfDetailCommands = f, this._needsSilhouetteCommands = h, this._originalCommand = void 0, this._translucentCommand = void 0, this._skipLodBackfaceCommand = void 0, this._skipLodStencilCommand = void 0, this._silhouetteModelCommand = void 0, this._silhouetteColorCommand = void 0, this._derivedCommands = [], this._has2DCommands = !1, initialize$8(this); +} +function ModelDerivedCommand(e) { + this.command = e.command, this.updateShadows = e.updateShadows, this.updateBackFaceCulling = e.updateBackFaceCulling, this.updateCullFace = e.updateCullFace, this.updateDebugShowBoundingVolume = e.updateDebugShowBoundingVolume, this.is2D = defaultValue(e.is2D, !1), this.derivedCommand2D = void 0; +} +ModelDerivedCommand.clone = function(e) { + return new ModelDerivedCommand({ + command: e.command, + updateShadows: e.updateShadows, + updateBackFaceCulling: e.updateBackFaceCulling, + updateCullFace: e.updateCullFace, + updateDebugShowBoundingVolume: e.updateDebugShowBoundingVolume, + is2D: e.is2D, + derivedCommand2D: e.derivedCommand2D + }); +}; +function initialize$8(e) { + const t = e._command; + t.modelMatrix = e._modelMatrix, t.boundingVolume = e._boundingVolume; + const n = e._model, i = e._usesBackFaceCulling, r = e._derivedCommands; + e._originalCommand = new ModelDerivedCommand({ + command: t, + updateShadows: !0, + updateBackFaceCulling: i, + updateCullFace: i, + updateDebugShowBoundingVolume: !0, + is2D: !1 + }), r.push(e._originalCommand), e._needsTranslucentCommand && (e._translucentCommand = new ModelDerivedCommand({ + command: deriveTranslucentCommand(t), + updateShadows: !0, + updateBackFaceCulling: !1, + updateCullFace: !1, + updateDebugShowBoundingVolume: !0 + }), r.push(e._translucentCommand)), e._needsSkipLevelOfDetailCommands && (e._skipLodBackfaceCommand = new ModelDerivedCommand({ + command: deriveSkipLodBackfaceCommand(t), + updateShadows: !1, + updateBackFaceCulling: !1, + updateCullFace: i, + updateDebugShowBoundingVolume: !1 + }), e._skipLodStencilCommand = new ModelDerivedCommand({ + command: deriveSkipLodStencilCommand(t), + updateShadows: !0, + updateBackFaceCulling: i, + updateCullFace: i, + updateDebugShowBoundingVolume: !0 + }), r.push(e._skipLodBackfaceCommand), r.push(e._skipLodStencilCommand)), e._needsSilhouetteCommands && (e._silhouetteModelCommand = new ModelDerivedCommand({ + command: deriveSilhouetteModelCommand(t, n), + updateShadows: !0, + updateBackFaceCulling: i, + updateCullFace: i, + updateDebugShowBoundingVolume: !0 + }), e._silhouetteColorCommand = new ModelDerivedCommand({ + command: deriveSilhouetteColorCommand(t, n), + updateShadows: !1, + updateBackFaceCulling: !1, + updateCullFace: !1, + updateDebugShowBoundingVolume: !1 + }), r.push(e._silhouetteModelCommand), r.push(e._silhouetteColorCommand)); +} +Object.defineProperties(ModelDrawCommand.prototype, { + /** + * The main draw command that the other commands are derived from. + * + * @memberof ModelDrawCommand.prototype + * @type {DrawCommand} + * + * @readonly + * @private + */ + command: { + get: function() { + return this._command; + } + }, + /** + * The runtime primitive that the draw command belongs to. + * + * @memberof ModelDrawCommand.prototype + * @type {ModelRuntimePrimitive} + * + * @readonly + * @private + */ + runtimePrimitive: { + get: function() { + return this._runtimePrimitive; + } + }, + /** + * The model that the draw command belongs to. + * + * @memberof ModelDrawCommand.prototype + * @type {Model} + * + * @readonly + * @private + */ + model: { + get: function() { + return this._model; + } + }, + /** + * The primitive type of the draw command. + * + * @memberof ModelDrawCommand.prototype + * @type {PrimitiveType} + * + * @readonly + * @private + */ + primitiveType: { + get: function() { + return this._command.primitiveType; + } + }, + /** + * The current model matrix applied to the draw commands. If there are + * 2D draw commands, their model matrix will be derived from the 3D one. + * + * @memberof ModelDrawCommand.prototype + * @type {Matrix4} + * + * @readonly + * @private + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._modelMatrix = Matrix4.clone(e, this._modelMatrix), this._modelMatrix2DDirty = !0, this._boundingVolume = BoundingSphere.transform( + this.runtimePrimitive.boundingSphere, + this._modelMatrix, + this._boundingVolume + ); + } + }, + /** + * The bounding volume of the main draw command. This is equivalent + * to the primitive's bounding sphere transformed by the draw + * command's model matrix. + * + * @memberof ModelDrawCommand.prototype + * @type {BoundingSphere} + * + * @readonly + * @private + */ + boundingVolume: { + get: function() { + return this._boundingVolume; + } + }, + /** + * Whether the geometry casts or receives shadows from light sources. + * + * @memberof ModelDrawCommand.prototype + * @type {ShadowMode} + * + * @private + */ + shadows: { + get: function() { + return this._shadows; + }, + set: function(e) { + this._shadows = e, updateShadows(this); + } + }, + /** + * Whether to cull back-facing geometry. When true, back face culling is + * determined by the material's doubleSided property; when false, back face + * culling is disabled. Back faces are not culled if the command is + * translucent. + * + * @memberof ModelDrawCommand.prototype + * @type {boolean} + * + * @private + */ + backFaceCulling: { + get: function() { + return this._backFaceCulling; + }, + set: function(e) { + this._backFaceCulling !== e && (this._backFaceCulling = e, updateBackFaceCulling(this)); + } + }, + /** + * Determines which faces to cull, if culling is enabled. + * + * @memberof ModelDrawCommand.prototype + * @type {CullFace} + * + * @private + */ + cullFace: { + get: function() { + return this._cullFace; + }, + set: function(e) { + this._cullFace !== e && (this._cullFace = e, updateCullFace(this)); + } + }, + /** + * Whether to draw the bounding sphere associated with this draw command. + * + * @memberof ModelDrawCommand.prototype + * @type {boolean} + * + * @private + */ + debugShowBoundingVolume: { + get: function() { + return this._debugShowBoundingVolume; + }, + set: function(e) { + this._debugShowBoundingVolume !== e && (this._debugShowBoundingVolume = e, updateDebugShowBoundingVolume(this)); + } + } +}); +function updateModelMatrix2D(e, t) { + const n = e._modelMatrix; + e._modelMatrix2D = Matrix4.clone( + n, + e._modelMatrix2D + ), e._modelMatrix2D[13] -= CesiumMath.sign(n[13]) * 2 * CesiumMath.PI * t.mapProjection.ellipsoid.maximumRadius, e._boundingVolume2D = BoundingSphere.transform( + e.runtimePrimitive.boundingSphere, + e._modelMatrix2D, + e._boundingVolume2D + ); +} +function updateShadows(e) { + const t = e.shadows, n = ShadowMode$1.castShadows(t), i = ShadowMode$1.receiveShadows(t), r = e._derivedCommands; + for (let o = 0; o < r.length; ++o) { + const s = r[o]; + if (s.updateShadows) { + const c = s.command; + c.castShadows = n, c.receiveShadows = i; + } + } +} +function updateBackFaceCulling(e) { + const t = e.backFaceCulling, n = e._derivedCommands; + for (let i = 0; i < n.length; ++i) { + const r = n[i]; + if (r.updateBackFaceCulling) { + const o = r.command, s = clone$1(o.renderState, !0); + s.cull.enabled = t, o.renderState = RenderState.fromCache(s); + } + } +} +function updateCullFace(e) { + const t = e.cullFace, n = e._derivedCommands; + for (let i = 0; i < n.length; ++i) { + const r = n[i]; + if (r.updateCullFace) { + const o = r.command, s = clone$1(o.renderState, !0); + s.cull.face = t, o.renderState = RenderState.fromCache(s); + } + } +} +function updateDebugShowBoundingVolume(e) { + const t = e.debugShowBoundingVolume, n = e._derivedCommands; + for (let i = 0; i < n.length; ++i) { + const r = n[i]; + if (r.updateDebugShowBoundingVolume) { + const o = r.command; + o.debugShowBoundingVolume = t; + } + } +} +ModelDrawCommand.prototype.pushCommands = function(e, t) { + const n = shouldUse2DCommands(this, e); + n && !this._has2DCommands && (derive2DCommands(this), this._has2DCommands = !0, this._modelMatrix2DDirty = !0), this._modelMatrix2DDirty && (updateModelMatrix2D(this, e), this._modelMatrix2DDirty = !1); + const i = this.model.styleCommandsNeeded; + if (!(this._needsTranslucentCommand && defined(i) && (i !== StyleCommandsNeeded$1.ALL_OPAQUE && pushCommand$1(t, this._translucentCommand, n), i === StyleCommandsNeeded$1.ALL_TRANSLUCENT))) { + if (this._needsSkipLevelOfDetailCommands) { + const { tileset: r, tile: o } = this._model.content; + if (r.hasMixedContent) { + o._finalResolution || pushCommand$1( + r._backfaceCommands, + this._skipLodBackfaceCommand, + n + ), updateSkipLodStencilCommand(this, o, n), pushCommand$1(t, this._skipLodStencilCommand, n); + return; + } + } + if (this._needsSilhouetteCommands) { + pushCommand$1(t, this._silhouetteModelCommand, n); + return; + } + return pushCommand$1(t, this._originalCommand, n), t; + } +}; +ModelDrawCommand.prototype.pushSilhouetteCommands = function(e, t) { + const n = shouldUse2DCommands(this, e); + return pushCommand$1(t, this._silhouetteColorCommand, n), t; +}; +function pushCommand$1(e, t, n) { + e.push(t.command), n && e.push(t.derivedCommand2D.command); +} +function shouldUse2DCommands(e, t) { + if (t.mode !== SceneMode$1.SCENE2D || e.model._projectTo2D) + return !1; + const i = e.model.sceneGraph._boundingSphere2D, r = i.center.y - i.radius, o = i.center.y + i.radius, s = t.mapProjection.ellipsoid.maximumRadius * CesiumMath.PI; + return r < s && o > s || r < -s && o > -s; +} +function derive2DCommand(e, t) { + if (!defined(t)) + return; + const n = ModelDerivedCommand.clone(t), i = DrawCommand.shallowClone(t.command); + return i.modelMatrix = e._modelMatrix2D, i.boundingVolume = e._boundingVolume2D, n.command = i, n.updateShadows = !1, n.is2D = !0, t.derivedCommand2D = n, e._derivedCommands.push(n), n; +} +function derive2DCommands(e) { + derive2DCommand(e, e._originalCommand), derive2DCommand(e, e._translucentCommand), derive2DCommand(e, e._skipLodBackfaceCommand), derive2DCommand(e, e._skipLodStencilCommand), derive2DCommand(e, e._silhouetteModelCommand), derive2DCommand(e, e._silhouetteColorCommand); +} +function deriveTranslucentCommand(e) { + const t = DrawCommand.shallowClone(e); + t.pass = Pass$1.TRANSLUCENT; + const n = clone$1(e.renderState, !0); + return n.cull.enabled = !1, n.depthMask = !1, n.blending = BlendingState$1.ALPHA_BLEND, t.renderState = RenderState.fromCache(n), t; +} +function deriveSilhouetteModelCommand(e, t) { + const n = t._silhouetteId % 255, i = DrawCommand.shallowClone(e), r = clone$1(e.renderState, !0); + return r.stencilTest = { + enabled: !0, + frontFunction: WebGLConstants$1.ALWAYS, + backFunction: WebGLConstants$1.ALWAYS, + reference: n, + mask: -1, + frontOperation: { + fail: WebGLConstants$1.KEEP, + zFail: WebGLConstants$1.KEEP, + zPass: WebGLConstants$1.REPLACE + }, + backOperation: { + fail: WebGLConstants$1.KEEP, + zFail: WebGLConstants$1.KEEP, + zPass: WebGLConstants$1.REPLACE + } + }, t.isInvisible() && (r.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }), i.renderState = RenderState.fromCache(r), i; +} +function deriveSilhouetteColorCommand(e, t) { + const n = t._silhouetteId % 255, i = DrawCommand.shallowClone(e), r = clone$1(e.renderState, !0); + r.cull.enabled = !1, (e.pass === Pass$1.TRANSLUCENT || t.silhouetteColor.alpha < 1) && (i.pass = Pass$1.TRANSLUCENT, r.depthMask = !1, r.blending = BlendingState$1.ALPHA_BLEND), r.stencilTest = { + enabled: !0, + frontFunction: WebGLConstants$1.NOTEQUAL, + backFunction: WebGLConstants$1.NOTEQUAL, + reference: n, + mask: -1, + frontOperation: { + fail: WebGLConstants$1.KEEP, + zFail: WebGLConstants$1.KEEP, + zPass: WebGLConstants$1.KEEP + }, + backOperation: { + fail: WebGLConstants$1.KEEP, + zFail: WebGLConstants$1.KEEP, + zPass: WebGLConstants$1.KEEP + } + }; + const s = clone$1(e.uniformMap); + return s.model_silhouettePass = function() { + return !0; + }, i.renderState = RenderState.fromCache(r), i.uniformMap = s, i.castShadows = !1, i.receiveShadows = !1, i; +} +function updateSkipLodStencilCommand(e, t, n) { + const i = e._skipLodStencilCommand, r = i.command, o = t._selectionDepth, s = getLastSelectionDepth(r); + if (o !== s) { + const c = getStencilReference(o), l = clone$1(r.renderState, !0); + l.stencilTest.reference = c, r.renderState = RenderState.fromCache(l), n && (i.derivedCommand2D.renderState = l); + } +} +function getLastSelectionDepth(e) { + return (e.renderState.stencilTest.reference & StencilConstants$1.SKIP_LOD_MASK) >>> StencilConstants$1.SKIP_LOD_BIT_SHIFT; +} +function getStencilReference(e) { + return StencilConstants$1.CESIUM_3D_TILE_MASK | e << StencilConstants$1.SKIP_LOD_BIT_SHIFT; +} +function deriveSkipLodBackfaceCommand(e) { + const t = DrawCommand.shallowClone(e), n = clone$1(e.renderState, !0); + n.cull.enabled = !0, n.cull.face = CullFace$1.FRONT, n.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, n.polygonOffset = { + enabled: !0, + factor: 5, + units: 5 + }; + const i = clone$1(t.uniformMap), r = new Cartesian2(5, 5); + return i.u_polygonOffset = function() { + return r; + }, t.renderState = RenderState.fromCache(n), t.uniformMap = i, t.castShadows = !1, t.receiveShadows = !1, t; +} +function deriveSkipLodStencilCommand(e) { + const t = DrawCommand.shallowClone(e), n = clone$1(e.renderState, !0), { stencilTest: i } = n; + return i.enabled = !0, i.mask = StencilConstants$1.SKIP_LOD_MASK, i.reference = StencilConstants$1.CESIUM_3D_TILE_MASK, i.frontFunction = StencilFunction$1.GREATER_OR_EQUAL, i.frontOperation.zPass = StencilOperation$1.REPLACE, i.backFunction = StencilFunction$1.GREATER_OR_EQUAL, i.backOperation.zPass = StencilOperation$1.REPLACE, n.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK | StencilConstants$1.SKIP_LOD_MASK, t.renderState = RenderState.fromCache(n), t; +} +function buildDrawCommand(e, t) { + const n = e.shaderBuilder; + n.addVertexLines(ModelVS), n.addFragmentLines(ModelFS); + const i = getIndexBuffer$2(e), r = new VertexArray({ + context: t.context, + indexBuffer: i, + attributes: e.attributes + }), o = e.model; + o._pipelineResources.push(r); + const s = n.buildShaderProgram(t.context); + o._pipelineResources.push(s); + const c = e.alphaOptions.pass, l = o.sceneGraph, d = t.mode === SceneMode$1.SCENE3D; + let f, h; + if (!d && !t.scene3DOnly && o._projectTo2D) + f = Matrix4.multiplyTransformation( + l._computedModelMatrix, + e.runtimeNode.computedTransform, + new Matrix4() + ), h = e.runtimePrimitive.boundingSphere2D; + else { + const x = d ? l._computedModelMatrix : l._computedModelMatrix2D; + f = Matrix4.multiplyTransformation( + x, + e.runtimeNode.computedTransform, + new Matrix4() + ), h = BoundingSphere.transform( + e.boundingSphere, + f, + e.boundingSphere + ); + } + let p = clone$1( + RenderState.fromCache(e.renderStateOptions), + !0 + ); + p.cull.face = ModelUtility.getCullFace( + f, + e.primitiveType + ), p = RenderState.fromCache(p); + const m = defined(o.classificationType), _ = m ? !1 : ShadowMode$1.castShadows(o.shadows), y = m ? !1 : ShadowMode$1.receiveShadows(o.shadows), C = m ? void 0 : e.pickId, T = new DrawCommand({ + boundingVolume: h, + modelMatrix: f, + uniformMap: e.uniformMap, + renderState: p, + vertexArray: r, + shaderProgram: s, + cull: o.cull, + pass: c, + count: e.count, + owner: o, + pickId: C, + instanceCount: e.instanceCount, + primitiveType: e.primitiveType, + debugShowBoundingVolume: o.debugShowBoundingVolume, + castShadows: _, + receiveShadows: y + }); + return m ? new ClassificationModelDrawCommand({ + primitiveRenderResources: e, + command: T + }) : new ModelDrawCommand({ + primitiveRenderResources: e, + command: T + }); +} +function getIndexBuffer$2(e) { + const t = e.wireframeIndexBuffer; + if (defined(t)) + return t; + const n = e.indices; + if (defined(n)) + return n.buffer; +} +const TilesetPipelineStage = { + name: "TilesetPipelineStage" + // Helps with debugging +}; +TilesetPipelineStage.process = function(e, t, n) { + if (t.hasSkipLevelOfDetail(n)) { + e.shaderBuilder.addDefine( + "POLYGON_OFFSET", + void 0, + ShaderDestination$1.FRAGMENT + ); + const o = { + u_polygonOffset: function() { + return Cartesian2.ZERO; + } + }; + e.uniformMap = combine$2( + o, + e.uniformMap + ), e.hasSkipLevelOfDetail = !0; + } + const i = e.renderStateOptions; + i.stencilTest = StencilConstants$1.setCesium3DTileBit(), i.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK; +}; +const AtmosphereStageFS = `// robust iterative solution without trig functions +// https://github.com/0xfaded/ellipse_demo/issues/1 +// https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse +// +// This version uses only a single iteration for best performance. For fog +// rendering, the difference is negligible. +vec2 nearestPointOnEllipseFast(vec2 pos, vec2 radii) { + vec2 p = abs(pos); + vec2 inverseRadii = 1.0 / radii; + vec2 evoluteScale = (radii.x * radii.x - radii.y * radii.y) * vec2(1.0, -1.0) * inverseRadii; + + // We describe the ellipse parametrically: v = radii * vec2(cos(t), sin(t)) + // but store the cos and sin of t in a vec2 for efficiency. + // Initial guess: t = cos(pi/4) + vec2 tTrigs = vec2(0.70710678118); + vec2 v = radii * tTrigs; + + // Find the evolute of the ellipse (center of curvature) at v. + vec2 evolute = evoluteScale * tTrigs * tTrigs * tTrigs; + // Find the (approximate) intersection of p - evolute with the ellipsoid. + vec2 q = normalize(p - evolute) * length(v - evolute); + // Update the estimate of t. + tTrigs = (q + evolute) * inverseRadii; + tTrigs = normalize(clamp(tTrigs, 0.0, 1.0)); + v = radii * tTrigs; + + return v * sign(pos); +} + +vec3 computeEllipsoidPositionWC(vec3 positionMC) { + // Get the world-space position and project onto a meridian plane of + // the ellipsoid + vec3 positionWC = (czm_model * vec4(positionMC, 1.0)).xyz; + + vec2 positionEllipse = vec2(length(positionWC.xy), positionWC.z); + vec2 nearestPoint = nearestPointOnEllipseFast(positionEllipse, czm_ellipsoidRadii.xz); + + // Reconstruct a 3D point in world space + return vec3(nearestPoint.x * normalize(positionWC.xy), nearestPoint.y); +} + +void applyFog(inout vec4 color, vec4 groundAtmosphereColor, vec3 lightDirection, float distanceToCamera) { + + vec3 fogColor = groundAtmosphereColor.rgb; + + // If there is dynamic lighting, apply that to the fog. + const float NONE = 0.0; + if (czm_atmosphereDynamicLighting != NONE) { + float darken = clamp(dot(normalize(czm_viewerPositionWC), lightDirection), czm_fogMinimumBrightness, 1.0); + fogColor *= darken; + } + + // Tonemap if HDR rendering is disabled + #ifndef HDR + fogColor.rgb = czm_pbrNeutralTonemapping(fogColor.rgb); + fogColor.rgb = czm_inverseGamma(fogColor.rgb); + #endif + + // Matches the constant in GlobeFS.glsl. This makes the fog falloff + // more gradual. + const float fogModifier = 0.15; + vec3 withFog = czm_fog(distanceToCamera, color.rgb, fogColor, fogModifier); + color = vec4(withFog, color.a); +} + +void atmosphereStage(inout vec4 color, in ProcessedAttributes attributes) { + vec3 rayleighColor; + vec3 mieColor; + float opacity; + + vec3 positionWC; + vec3 lightDirection; + + // When the camera is in space, compute the position per-fragment for + // more accurate ground atmosphere. All other cases will use + // + // The if condition will be added in https://github.com/CesiumGS/cesium/issues/11717 + if (false) { + positionWC = computeEllipsoidPositionWC(attributes.positionMC); + lightDirection = czm_getDynamicAtmosphereLightDirection(positionWC, czm_atmosphereDynamicLighting); + + // The fog color is derived from the ground atmosphere color + czm_computeGroundAtmosphereScattering( + positionWC, + lightDirection, + rayleighColor, + mieColor, + opacity + ); + } else { + positionWC = attributes.positionWC; + lightDirection = czm_getDynamicAtmosphereLightDirection(positionWC, czm_atmosphereDynamicLighting); + rayleighColor = v_atmosphereRayleighColor; + mieColor = v_atmosphereMieColor; + opacity = v_atmosphereOpacity; + } + + //color correct rayleigh and mie colors + const bool ignoreBlackPixels = true; + rayleighColor = czm_applyHSBShift(rayleighColor, czm_atmosphereHsbShift, ignoreBlackPixels); + mieColor = czm_applyHSBShift(mieColor, czm_atmosphereHsbShift, ignoreBlackPixels); + + vec4 groundAtmosphereColor = czm_computeAtmosphereColor(positionWC, lightDirection, rayleighColor, mieColor, opacity); + + if (u_isInFog) { + float distanceToCamera = length(attributes.positionEC); + applyFog(color, groundAtmosphereColor, lightDirection, distanceToCamera); + } else { + // Ground atmosphere + } +} +`, AtmosphereStageVS = `void atmosphereStage(ProcessedAttributes attributes) { + vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(v_positionWC, czm_atmosphereDynamicLighting); + + czm_computeGroundAtmosphereScattering( + // This assumes the geometry stage came before this. + v_positionWC, + lightDirection, + v_atmosphereRayleighColor, + v_atmosphereMieColor, + v_atmosphereOpacity + ); +} +`, AtmospherePipelineStage = { + name: "AtmospherePipelineStage" + // Helps with debugging +}; +AtmospherePipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder; + i.addDefine("HAS_ATMOSPHERE", void 0, ShaderDestination$1.BOTH), i.addDefine( + "COMPUTE_POSITION_WC_ATMOSPHERE", + void 0, + ShaderDestination$1.BOTH + ), i.addVarying("vec3", "v_atmosphereRayleighColor"), i.addVarying("vec3", "v_atmosphereMieColor"), i.addVarying("float", "v_atmosphereOpacity"), i.addVertexLines([AtmosphereStageVS]), i.addFragmentLines([AtmosphereStageFS]), i.addUniform("bool", "u_isInFog", ShaderDestination$1.FRAGMENT), e.uniformMap.u_isInFog = function() { + const r = Cartesian3.distance( + n.camera.positionWC, + t.boundingSphere.center + ); + return CesiumMath.fog(r, n.fog.density) > CesiumMath.EPSILON3; + }; +}; +const ImageBasedLightingStageFS = `/** + * Compute some metrics for a procedural sky lighting model + * + * @param {vec3} positionWC The position of the fragment in world coordinates. + * @param {vec3} reflectionWC A unit vector in the direction of the reflection, in world coordinates. + * @return {vec3} The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. + */ +vec3 getProceduralSkyMetrics(vec3 positionWC, vec3 reflectionWC) +{ + // Figure out if the reflection vector hits the ellipsoid + float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoidRadii.x / length(positionWC)); + float reflectionDotNadir = dot(reflectionWC, normalize(positionWC)); + float atmosphereHeight = 0.05; + float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir); + return vec3(horizonDotNadir, reflectionDotNadir, smoothstepHeight); +} + +/** + * Compute the diffuse irradiance for a procedural sky lighting model. + * + * @param {vec3} skyMetrics The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. + * @return {vec3} The computed diffuse irradiance. + */ +vec3 getProceduralDiffuseIrradiance(vec3 skyMetrics) +{ + vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9); + float diffuseIrradianceFromEarth = (1.0 - skyMetrics.x) * (skyMetrics.y * 0.25 + 0.75) * skyMetrics.z; + float diffuseIrradianceFromSky = (1.0 - skyMetrics.z) * (1.0 - (skyMetrics.y * 0.25 + 0.25)); + return blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0); +} + +/** + * Compute the specular irradiance for a procedural sky lighting model. + * + * @param {vec3} reflectionWC The reflection vector in world coordinates. + * @param {vec3} skyMetrics The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. + * @param {float} roughness The roughness of the material. + * @return {vec3} The computed specular irradiance. + */ +vec3 getProceduralSpecularIrradiance(vec3 reflectionWC, vec3 skyMetrics, float roughness) +{ + // Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z. + reflectionWC.x = -reflectionWC.x; + reflectionWC = -normalize(czm_temeToPseudoFixed * reflectionWC); + reflectionWC.x = -reflectionWC.x; + + float inverseRoughness = 1.0 - roughness; + inverseRoughness *= inverseRoughness; + vec3 sceneSkyBox = czm_textureCube(czm_environmentMap, reflectionWC).rgb * inverseRoughness; + + // Compute colors at different angles relative to the horizon + vec3 belowHorizonColor = mix(vec3(0.1, 0.15, 0.25), vec3(0.4, 0.7, 0.9), skyMetrics.z); + vec3 nadirColor = belowHorizonColor * 0.5; + vec3 aboveHorizonColor = mix(vec3(0.9, 1.0, 1.2), belowHorizonColor, roughness * 0.5); + vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, skyMetrics.y * inverseRoughness * 0.5 + 0.75); + vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, skyMetrics.z); + + // Compute blend zones + float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - skyMetrics.x); + float blendRegionOffset = roughness * -1.0; + float farAboveHorizon = clamp(skyMetrics.x - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999); + float aroundHorizon = clamp(skyMetrics.x + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999); + float farBelowHorizon = clamp(skyMetrics.x + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999); + + // Blend colors + float notDistantRough = (1.0 - skyMetrics.x * roughness * 0.8); + vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, skyMetrics.y) * notDistantRough); + specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, skyMetrics.y) * inverseRoughness); + specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, skyMetrics.y) * inverseRoughness); + + return specularIrradiance; +} + +#ifdef USE_SUN_LUMINANCE +float clampedDot(vec3 x, vec3 y) +{ + return clamp(dot(x, y), 0.001, 1.0); +} +/** + * Sun luminance following the "CIE Clear Sky Model" + * See page 40 of https://3dvar.com/Green2003Spherical.pdf + * + * @param {vec3} positionWC The position of the fragment in world coordinates. + * @param {vec3} normalEC The surface normal in eye coordinates. + * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. + * @return {float} The computed sun luminance. + */ +float getSunLuminance(vec3 positionWC, vec3 normalEC, vec3 lightDirectionEC) +{ + vec3 normalWC = normalize(czm_inverseViewRotation * normalEC); + vec3 lightDirectionWC = normalize(czm_inverseViewRotation * lightDirectionEC); + vec3 vWC = -normalize(positionWC); + + // Angle between sun and zenith. + float LdotZenith = clampedDot(lightDirectionWC, vWC); + float S = acos(LdotZenith); + // Angle between zenith and current pixel + float NdotZenith = clampedDot(normalWC, vWC); + // Angle between sun and current pixel + float NdotL = clampedDot(normalEC, lightDirectionEC); + float gamma = acos(NdotL); + + float numerator = ((0.91 + 10.0 * exp(-3.0 * gamma) + 0.45 * NdotL * NdotL) * (1.0 - exp(-0.32 / NdotZenith))); + float denominator = (0.91 + 10.0 * exp(-3.0 * S) + 0.45 * LdotZenith * LdotZenith) * (1.0 - exp(-0.32)); + return model_luminanceAtZenith * (numerator / denominator); +} +#endif + +/** + * Compute the light contribution from a procedural sky model + * + * @param {vec3} positionEC The position of the fragment in eye coordinates. + * @param {vec3} normalEC The surface normal in eye coordinates. + * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. + * @param {czm_modelMaterial} The material properties. + * @return {vec3} The computed HDR color + */ + vec3 proceduralIBL( + vec3 positionEC, + vec3 normalEC, + vec3 lightDirectionEC, + czm_modelMaterial material +) { + vec3 viewDirectionEC = -normalize(positionEC); + vec3 positionWC = vec3(czm_inverseView * vec4(positionEC, 1.0)); + vec3 reflectionWC = normalize(czm_inverseViewRotation * reflect(viewDirectionEC, normalEC)); + vec3 skyMetrics = getProceduralSkyMetrics(positionWC, reflectionWC); + + float roughness = material.roughness; + vec3 f0 = material.specular; + + vec3 specularIrradiance = getProceduralSpecularIrradiance(reflectionWC, skyMetrics, roughness); + float NdotV = abs(dot(normalEC, viewDirectionEC)) + 0.001; + vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; + vec3 specularColor = czm_srgbToLinear(f0 * brdfLut.x + brdfLut.y); + vec3 specularContribution = specularIrradiance * specularColor * model_iblFactor.y; + #ifdef USE_SPECULAR + specularContribution *= material.specularWeight; + #endif + + vec3 diffuseIrradiance = getProceduralDiffuseIrradiance(skyMetrics); + vec3 diffuseColor = material.diffuse; + vec3 diffuseContribution = diffuseIrradiance * diffuseColor * model_iblFactor.x; + + vec3 iblColor = specularContribution + diffuseContribution; + + #ifdef USE_SUN_LUMINANCE + iblColor *= getSunLuminance(positionWC, normalEC, lightDirectionEC); + #endif + + return iblColor; +} + +#ifdef DIFFUSE_IBL +vec3 sampleDiffuseEnvironment(vec3 cubeDir) +{ + #ifdef CUSTOM_SPHERICAL_HARMONICS + return czm_sphericalHarmonics(cubeDir, model_sphericalHarmonicCoefficients); + #else + return czm_sphericalHarmonics(cubeDir, czm_sphericalHarmonicCoefficients); + #endif +} +#endif + +#ifdef SPECULAR_IBL +vec3 sampleSpecularEnvironment(vec3 cubeDir, float roughness) +{ + #ifdef CUSTOM_SPECULAR_IBL + float lod = roughness * model_specularEnvironmentMapsMaximumLOD; + return czm_textureCube(model_specularEnvironmentMaps, cubeDir, lod).rgb; + #else + float lod = roughness * czm_specularEnvironmentMapsMaximumLOD; + return czm_textureCube(czm_specularEnvironmentMaps, cubeDir, lod).rgb; + #endif +} +vec3 computeSpecularIBL(vec3 cubeDir, float NdotV, vec3 f0, float roughness) +{ + // see https://bruop.github.io/ibl/ at Single Scattering Results + // Roughness dependent fresnel, from Fdez-Aguera + vec3 f90 = max(vec3(1.0 - roughness), f0); + vec3 F = fresnelSchlick2(f0, f90, NdotV); + + vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; + vec3 specularSample = sampleSpecularEnvironment(cubeDir, roughness); + + return specularSample * (F * brdfLut.x + brdfLut.y); +} +#endif + +#if defined(DIFFUSE_IBL) || defined(SPECULAR_IBL) +/** + * Compute the light contributions from environment maps and spherical harmonic coefficients. + * See Fdez-Aguera, https://www.jcgt.org/published/0008/01/03/paper.pdf, for explanation + * of the single- and multi-scattering terms. + * + * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position. + * @param {vec3} normalEC The surface normal in eye coordinates. + * @param {czm_modelMaterial} The material properties. + * @return {vec3} The computed HDR color. + */ +vec3 textureIBL(vec3 viewDirectionEC, vec3 normalEC, czm_modelMaterial material) { + vec3 f0 = material.specular; + float roughness = material.roughness; + float specularWeight = 1.0; + #ifdef USE_SPECULAR + specularWeight = material.specularWeight; + #endif + float NdotV = clamp(dot(normalEC, viewDirectionEC), 0.0, 1.0); + + // see https://bruop.github.io/ibl/ at Single Scattering Results + // Roughness dependent fresnel, from Fdez-Aguera + vec3 f90 = max(vec3(1.0 - roughness), f0); + vec3 singleScatterFresnel = fresnelSchlick2(f0, f90, NdotV); + + vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; + vec3 FssEss = specularWeight * (singleScatterFresnel * brdfLut.x + brdfLut.y); + + #ifdef DIFFUSE_IBL + vec3 normalMC = normalize(model_iblReferenceFrameMatrix * normalEC); + vec3 irradiance = sampleDiffuseEnvironment(normalMC); + + vec3 averageFresnel = f0 + (1.0 - f0) / 21.0; + float Ems = specularWeight * (1.0 - brdfLut.x - brdfLut.y); + vec3 FmsEms = FssEss * averageFresnel * Ems / (1.0 - averageFresnel * Ems); + vec3 dielectricScattering = (1.0 - FssEss - FmsEms) * material.diffuse; + vec3 diffuseContribution = irradiance * (FmsEms + dielectricScattering); + #else + vec3 diffuseContribution = vec3(0.0); + #endif + + #ifdef USE_ANISOTROPY + // Bend normal to account for anisotropic distortion of specular reflection + vec3 anisotropyDirection = material.anisotropicB; + vec3 anisotropicTangent = cross(anisotropyDirection, viewDirectionEC); + vec3 anisotropicNormal = cross(anisotropicTangent, anisotropyDirection); + float bendFactor = 1.0 - material.anisotropyStrength * (1.0 - roughness); + float bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor; + vec3 bentNormal = normalize(mix(anisotropicNormal, normalEC, bendFactorPow4)); + vec3 reflectEC = reflect(-viewDirectionEC, bentNormal); + #else + vec3 reflectEC = reflect(-viewDirectionEC, normalEC); + #endif + + #ifdef SPECULAR_IBL + vec3 reflectMC = normalize(model_iblReferenceFrameMatrix * reflectEC); + vec3 radiance = sampleSpecularEnvironment(reflectMC, roughness); + vec3 specularContribution = radiance * FssEss; + #else + vec3 specularContribution = vec3(0.0); + #endif + + return diffuseContribution + specularContribution; +} +#endif +`, ImageBasedLightingPipelineStage = { + name: "ImageBasedLightingPipelineStage" + // Helps with debugging +}; +ImageBasedLightingPipelineStage.process = function(e, t, n) { + const i = t.imageBasedLighting, r = e.shaderBuilder; + r.addDefine( + "USE_IBL_LIGHTING", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "vec2", + "model_iblFactor", + ShaderDestination$1.FRAGMENT + ), SpecularEnvironmentCubeMap.isSupported(n.context) && ((i.useSphericalHarmonics || i.useSpecularEnvironmentMaps || i.enabled) && r.addUniform( + "mat3", + "model_iblReferenceFrameMatrix", + ShaderDestination$1.FRAGMENT + ), defined(i.sphericalHarmonicCoefficients) ? (r.addDefine( + "DIFFUSE_IBL", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addDefine( + "CUSTOM_SPHERICAL_HARMONICS", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "vec3", + "model_sphericalHarmonicCoefficients[9]", + ShaderDestination$1.FRAGMENT + )) : i.useDefaultSphericalHarmonics && r.addDefine( + "DIFFUSE_IBL", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(i.specularEnvironmentCubeMap) && i.specularEnvironmentCubeMap.ready ? (r.addDefine( + "SPECULAR_IBL", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addDefine( + "CUSTOM_SPECULAR_IBL", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "samplerCube", + "model_specularEnvironmentMaps", + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "float", + "model_specularEnvironmentMapsMaximumLOD", + ShaderDestination$1.FRAGMENT + )) : t.useDefaultSpecularMaps && r.addDefine( + "SPECULAR_IBL", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(i.luminanceAtZenith) && (r.addDefine( + "USE_SUN_LUMINANCE", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "float", + "model_luminanceAtZenith", + ShaderDestination$1.FRAGMENT + )), r.addFragmentLines(ImageBasedLightingStageFS); + const o = { + model_iblFactor: function() { + return i.imageBasedLightingFactor; + }, + model_iblReferenceFrameMatrix: function() { + return t._iblReferenceFrameMatrix; + }, + model_luminanceAtZenith: function() { + return i.luminanceAtZenith; + }, + model_sphericalHarmonicCoefficients: function() { + return i.sphericalHarmonicCoefficients; + }, + model_specularEnvironmentMaps: function() { + return i.specularEnvironmentCubeMap.texture; + }, + model_specularEnvironmentMapsMaximumLOD: function() { + return i.specularEnvironmentCubeMap.maximumMipmapLevel; + } + }; + e.uniformMap = combine$2(o, e.uniformMap); +}; +const articulationEpsilon = CesiumMath.EPSILON16; +function ModelArticulationStage(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.stage, n = e.runtimeArticulation; + this._stage = t, this._runtimeArticulation = n, this._name = t.name, this._type = t.type, this._minimumValue = t.minimumValue, this._maximumValue = t.maximumValue, this._currentValue = t.initialValue; +} +Object.defineProperties(ModelArticulationStage.prototype, { + /** + * The internal articulation stage that this runtime stage represents. + * + * @memberof ModelArticulationStage.prototype + * @type {ModelComponents.ArticulationStage} + * @readonly + * + * @private + */ + stage: { + get: function() { + return this._stage; + } + }, + /** + * The runtime articulation that this stage belongs to. + * + * @memberof ModelArticulationStage.prototype + * @type {ModelArticulation} + * @readonly + * + * @private + */ + runtimeArticulation: { + get: function() { + return this._runtimeArticulation; + } + }, + /** + * The name of this articulation stage. + * + * @memberof ModelArticulationStage.prototype + * @type {string} + * @readonly + * + * @private + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The type of this articulation stage. This specifies which of the + * node's properties is modified by the stage's value. + * + * @memberof ModelArticulationStage.prototype + * @type {ArticulationStageType} + * @readonly + * + * @private + */ + type: { + get: function() { + return this._type; + } + }, + /** + * The minimum value of this articulation stage. + * + * @memberof ModelArticulationStage.prototype + * @type {number} + * @readonly + * + * @private + */ + minimumValue: { + get: function() { + return this._minimumValue; + } + }, + /** + * The maximum value of this articulation stage. + * + * @memberof ModelArticulationStage.prototype + * @type {number} + * @readonly + * + * @private + */ + maximumValue: { + get: function() { + return this._maximumValue; + } + }, + /** + * The current value of this articulation stage. + * + * @memberof ModelArticulationStage.prototype + * @type {number} + * + * @private + */ + currentValue: { + get: function() { + return this._currentValue; + }, + set: function(e) { + e = CesiumMath.clamp(e, this.minimumValue, this.maximumValue), CesiumMath.equalsEpsilon( + this._currentValue, + e, + articulationEpsilon + ) || (this._currentValue = e, this.runtimeArticulation._dirty = !0); + } + } +}); +const scratchArticulationCartesian = new Cartesian3(), scratchArticulationRotation = new Matrix3(); +ModelArticulationStage.prototype.applyStageToMatrix = function(e) { + const t = this.type, n = this.currentValue, i = scratchArticulationCartesian; + let r; + switch (t) { + case ArticulationStageType$1.XROTATE: + r = Matrix3.fromRotationX( + CesiumMath.toRadians(n), + scratchArticulationRotation + ), e = Matrix4.multiplyByMatrix3(e, r, e); + break; + case ArticulationStageType$1.YROTATE: + r = Matrix3.fromRotationY( + CesiumMath.toRadians(n), + scratchArticulationRotation + ), e = Matrix4.multiplyByMatrix3(e, r, e); + break; + case ArticulationStageType$1.ZROTATE: + r = Matrix3.fromRotationZ( + CesiumMath.toRadians(n), + scratchArticulationRotation + ), e = Matrix4.multiplyByMatrix3(e, r, e); + break; + case ArticulationStageType$1.XTRANSLATE: + i.x = n, i.y = 0, i.z = 0, e = Matrix4.multiplyByTranslation(e, i, e); + break; + case ArticulationStageType$1.YTRANSLATE: + i.x = 0, i.y = n, i.z = 0, e = Matrix4.multiplyByTranslation(e, i, e); + break; + case ArticulationStageType$1.ZTRANSLATE: + i.x = 0, i.y = 0, i.z = n, e = Matrix4.multiplyByTranslation(e, i, e); + break; + case ArticulationStageType$1.XSCALE: + i.x = n, i.y = 1, i.z = 1, e = Matrix4.multiplyByScale(e, i, e); + break; + case ArticulationStageType$1.YSCALE: + i.x = 1, i.y = n, i.z = 1, e = Matrix4.multiplyByScale(e, i, e); + break; + case ArticulationStageType$1.ZSCALE: + i.x = 1, i.y = 1, i.z = n, e = Matrix4.multiplyByScale(e, i, e); + break; + case ArticulationStageType$1.UNIFORMSCALE: + e = Matrix4.multiplyByUniformScale(e, n, e); + break; + } + return e; +}; +function ModelArticulation(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.articulation, n = e.sceneGraph; + this._articulation = t, this._sceneGraph = n, this._name = t.name, this._runtimeStages = [], this._runtimeStagesByName = {}, this._runtimeNodes = [], this._dirty = !0, initialize$7(this); +} +Object.defineProperties(ModelArticulation.prototype, { + /** + * The internal articulation that this runtime articulation represents. + * + * @memberof ModelArticulation.prototype + * @type {ModelComponents.Articulation} + * @readonly + * + * @private + */ + articulation: { + get: function() { + return this._articulation; + } + }, + /** + * The scene graph that this articulation belongs to. + * + * @memberof ModelArticulation.prototype + * @type {ModelSceneGraph} + * @readonly + * + * @private + */ + sceneGraph: { + get: function() { + return this._sceneGraph; + } + }, + /** + * The name of this articulation. + * + * @memberof ModelArticulation.prototype + * @type {string} + * @readonly + * + * @private + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The runtime stages that belong to this articulation. + * + * @memberof ModelArticulation.prototype + * @type {ModelArticulationStage[]} + * @readonly + * + * @private + */ + runtimeStages: { + get: function() { + return this._runtimeStages; + } + }, + /** + * The runtime nodes that are affected by this articulation. + * + * @memberof ModelArticulation.prototype + * @type {ModelRuntimeNode[]} + * @readonly + * + * @private + */ + runtimeNodes: { + get: function() { + return this._runtimeNodes; + } + } +}); +function initialize$7(e) { + const n = e.articulation.stages, i = n.length, r = e._runtimeStages, o = e._runtimeStagesByName; + for (let s = 0; s < i; s++) { + const c = n[s], l = new ModelArticulationStage({ + stage: c, + runtimeArticulation: e + }); + r.push(l); + const d = c.name; + o[d] = l; + } +} +ModelArticulation.prototype.setArticulationStage = function(e, t) { + const n = this._runtimeStagesByName[e]; + defined(n) && (n.currentValue = t); +}; +const scratchArticulationMatrix = new Matrix4(), scratchNodeMatrix = new Matrix4(); +ModelArticulation.prototype.apply = function() { + if (!this._dirty) + return; + this._dirty = !1; + let e = Matrix4.clone( + Matrix4.IDENTITY, + scratchArticulationMatrix + ), t; + const n = this._runtimeStages, i = n.length; + for (t = 0; t < i; t++) + e = n[t].applyStageToMatrix(e); + const r = this._runtimeNodes, o = r.length; + for (t = 0; t < o; t++) { + const s = r[t], c = Matrix4.multiplyTransformation( + s.originalTransform, + e, + scratchNodeMatrix + ); + s.transform = c; + } +}; +const ModelColorStageFS = `void modelColorStage(inout czm_modelMaterial material) +{ + material.diffuse = mix(material.diffuse, model_color.rgb, model_colorBlend); + float highlight = ceil(model_colorBlend); + material.diffuse *= mix(model_color.rgb, vec3(1.0), highlight); + material.alpha *= model_color.a; +} +`, ModelColorPipelineStage = { + name: "ModelColorPipelineStage", + // Helps with debugging + COLOR_UNIFORM_NAME: "model_color", + COLOR_BLEND_UNIFORM_NAME: "model_colorBlend" +}; +ModelColorPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder; + i.addDefine( + "HAS_MODEL_COLOR", + void 0, + ShaderDestination$1.FRAGMENT + ), i.addFragmentLines(ModelColorStageFS); + const r = {}, o = t.color; + o.alpha === 0 && !t.hasSilhouette(n) && (e.renderStateOptions.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }), o.alpha < 1 && (e.alphaOptions.pass = Pass$1.TRANSLUCENT), i.addUniform( + "vec4", + ModelColorPipelineStage.COLOR_UNIFORM_NAME, + ShaderDestination$1.FRAGMENT + ), r[ModelColorPipelineStage.COLOR_UNIFORM_NAME] = function() { + return t.color; + }, i.addUniform( + "float", + ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME, + ShaderDestination$1.FRAGMENT + ), r[ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME] = function() { + return ColorBlendMode$1.getColorBlend( + t.colorBlendMode, + t.colorBlendAmount + ); + }, e.uniformMap = combine$2( + r, + e.uniformMap + ); +}; +const ModelClippingPlanesStageFS = `#ifdef USE_CLIPPING_PLANES_FLOAT_TEXTURE +vec4 getClippingPlane( + highp sampler2D packedClippingPlanes, + int clippingPlaneNumber, + mat4 transform +) { + int pixY = clippingPlaneNumber / CLIPPING_PLANES_TEXTURE_WIDTH; + int pixX = clippingPlaneNumber - (pixY * CLIPPING_PLANES_TEXTURE_WIDTH); + float pixelWidth = 1.0 / float(CLIPPING_PLANES_TEXTURE_WIDTH); + float pixelHeight = 1.0 / float(CLIPPING_PLANES_TEXTURE_HEIGHT); + float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel + float v = (float(pixY) + 0.5) * pixelHeight; + vec4 plane = texture(packedClippingPlanes, vec2(u, v)); + return czm_transformPlane(plane, transform); +} +#else +// Handle uint8 clipping texture instead +vec4 getClippingPlane( + highp sampler2D packedClippingPlanes, + int clippingPlaneNumber, + mat4 transform +) { + int clippingPlaneStartIndex = clippingPlaneNumber * 2; // clipping planes are two pixels each + int pixY = clippingPlaneStartIndex / CLIPPING_PLANES_TEXTURE_WIDTH; + int pixX = clippingPlaneStartIndex - (pixY * CLIPPING_PLANES_TEXTURE_WIDTH); + float pixelWidth = 1.0 / float(CLIPPING_PLANES_TEXTURE_WIDTH); + float pixelHeight = 1.0 / float(CLIPPING_PLANES_TEXTURE_HEIGHT); + float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel + float v = (float(pixY) + 0.5) * pixelHeight; + vec4 oct32 = texture(packedClippingPlanes, vec2(u, v)) * 255.0; + vec2 oct = vec2(oct32.x * 256.0 + oct32.y, oct32.z * 256.0 + oct32.w); + vec4 plane; + plane.xyz = czm_octDecode(oct, 65535.0); + plane.w = czm_unpackFloat(texture(packedClippingPlanes, vec2(u + pixelWidth, v))); + return czm_transformPlane(plane, transform); +} +#endif + +float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) { + vec4 position = czm_windowToEyeCoordinates(fragCoord); + vec3 clipNormal = vec3(0.0); + vec3 clipPosition = vec3(0.0); + float pixelWidth = czm_metersPerPixel(position); + + #ifdef UNION_CLIPPING_REGIONS + float clipAmount; // For union planes, we want to get the min distance. So we set the initial value to the first plane distance in the loop below. + #else + float clipAmount = 0.0; + bool clipped = true; + #endif + + for (int i = 0; i < CLIPPING_PLANES_LENGTH; ++i) { + vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); + clipNormal = clippingPlane.xyz; + clipPosition = -clippingPlane.w * clipNormal; + float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; + + #ifdef UNION_CLIPPING_REGIONS + clipAmount = czm_branchFreeTernary(i == 0, amount, min(amount, clipAmount)); + if (amount <= 0.0) { + discard; + } + #else + clipAmount = max(amount, clipAmount); + clipped = clipped && (amount <= 0.0); + #endif + } + + #ifndef UNION_CLIPPING_REGIONS + if (clipped) { + discard; + } + #endif + + return clipAmount; +} + +void modelClippingPlanesStage(inout vec4 color) +{ + float clipDistance = clip(gl_FragCoord, model_clippingPlanes, model_clippingPlanesMatrix); + vec4 clippingPlanesEdgeColor = vec4(1.0); + clippingPlanesEdgeColor.rgb = model_clippingPlanesEdgeStyle.rgb; + float clippingPlanesEdgeWidth = model_clippingPlanesEdgeStyle.a; + + if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) { + color = clippingPlanesEdgeColor; + } +} +`, ModelClippingPlanesPipelineStage = { + name: "ModelClippingPlanesPipelineStage" + // Helps with debugging +}, textureResolutionScratch$1 = new Cartesian2(); +ModelClippingPlanesPipelineStage.process = function(e, t, n) { + const i = t.clippingPlanes, r = n.context, o = e.shaderBuilder; + o.addDefine( + "HAS_CLIPPING_PLANES", + void 0, + ShaderDestination$1.FRAGMENT + ), o.addDefine( + "CLIPPING_PLANES_LENGTH", + i.length, + ShaderDestination$1.FRAGMENT + ), i.unionClippingRegions && o.addDefine( + "UNION_CLIPPING_REGIONS", + void 0, + ShaderDestination$1.FRAGMENT + ), ClippingPlaneCollection.useFloatTexture(r) && o.addDefine( + "USE_CLIPPING_PLANES_FLOAT_TEXTURE", + void 0, + ShaderDestination$1.FRAGMENT + ); + const s = ClippingPlaneCollection.getTextureResolution( + i, + r, + textureResolutionScratch$1 + ); + o.addDefine( + "CLIPPING_PLANES_TEXTURE_WIDTH", + s.x, + ShaderDestination$1.FRAGMENT + ), o.addDefine( + "CLIPPING_PLANES_TEXTURE_HEIGHT", + s.y, + ShaderDestination$1.FRAGMENT + ), o.addUniform( + "sampler2D", + "model_clippingPlanes", + ShaderDestination$1.FRAGMENT + ), o.addUniform( + "vec4", + "model_clippingPlanesEdgeStyle", + ShaderDestination$1.FRAGMENT + ), o.addUniform( + "mat4", + "model_clippingPlanesMatrix", + ShaderDestination$1.FRAGMENT + ), o.addFragmentLines(ModelClippingPlanesStageFS); + const c = { + model_clippingPlanes: function() { + return i.texture; + }, + model_clippingPlanesEdgeStyle: function() { + const l = Color.clone(i.edgeColor); + return l.alpha = i.edgeWidth, l; + }, + model_clippingPlanesMatrix: function() { + return t._clippingPlanesMatrix; + } + }; + e.uniformMap = combine$2(c, e.uniformMap); +}; +const ModelClippingPolygonsStageVS = `void modelClippingPolygonsStage(ProcessedAttributes attributes) +{ + vec2 sphericalLatLong = czm_approximateSphericalCoordinates(v_positionWC); + sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); + + vec2 minDistance = vec2(czm_infinity); + v_regionIndex = -1; + v_clippingPosition = vec2(czm_infinity); + + for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { + vec4 extents = czm_unpackClippingExtents(model_clippingExtents, regionIndex); + vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; + + vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); + vec2 distance = abs(rectUv - clamped) * extents.wz; + + if (minDistance.x > distance.x || minDistance.y > distance.y) { + minDistance = distance; + v_clippingPosition = rectUv; + } + + float threshold = 0.01; + if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { + v_regionIndex = regionIndex; + } + } +} +`, ModelClippingPolygonsStageFS = `void modelClippingPolygonsStage() +{ + vec2 clippingPosition = v_clippingPosition; + int regionIndex = v_regionIndex; + czm_clipPolygons(model_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); +} +`, ModelClippingPolygonsPipelineStage = { + name: "ModelClippingPolygonsPipelineStage" + // Helps with debugging +}; +ModelClippingPolygonsPipelineStage.process = function(e, t, n) { + const i = t.clippingPolygons, r = e.shaderBuilder; + r.addDefine( + "ENABLE_CLIPPING_POLYGONS", + void 0, + ShaderDestination$1.BOTH + ), i.inverse && r.addDefine( + "CLIPPING_INVERSE", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addDefine( + "CLIPPING_POLYGON_REGIONS_LENGTH", + i.extentsCount, + ShaderDestination$1.BOTH + ), r.addUniform( + "sampler2D", + "model_clippingDistance", + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "sampler2D", + "model_clippingExtents", + ShaderDestination$1.VERTEX + ), r.addVarying("vec2", "v_clippingPosition"), r.addVarying("int", "v_regionIndex", "flat"), r.addVertexLines(ModelClippingPolygonsStageVS), r.addFragmentLines(ModelClippingPolygonsStageFS); + const o = { + model_clippingDistance: function() { + return i.clippingTexture; + }, + model_clippingExtents: function() { + return i.extentsTexture; + } + }; + e.uniformMap = combine$2(o, e.uniformMap); +}; +function ModelNode(e, t) { + this._model = e, this._runtimeNode = t; +} +Object.defineProperties(ModelNode.prototype, { + /** + * The value of the name property of this node. + * + * @memberof ModelNode.prototype + * + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._runtimeNode._name; + } + }, + /** + * The index of the node in the glTF. + * + * @memberof ModelNode.prototype + * + * @type {number} + * @readonly + */ + id: { + get: function() { + return this._runtimeNode._id; + } + }, + /** + * Determines if this node and its children will be shown. + * + * @memberof ModelNode.prototype + * @type {boolean} + * + * @default true + */ + show: { + get: function() { + return this._runtimeNode.show; + }, + set: function(e) { + this._runtimeNode.show = e; + } + }, + /** + * The node's 4x4 matrix transform from its local coordinates to + * its parent's. Setting the matrix to undefined will restore the + * node's original transform, and allow the node to be animated by + * any animations in the model again. + *

+ * For changes to take effect, this property must be assigned to; + * setting individual elements of the matrix will not work. + *

+ * + * @memberof ModelNode.prototype + * @type {Matrix4} + */ + matrix: { + get: function() { + return this._runtimeNode.transform; + }, + set: function(e) { + defined(e) ? (this._runtimeNode.transform = e, this._runtimeNode.userAnimated = !0, this._model._userAnimationDirty = !0) : (this._runtimeNode.transform = this.originalMatrix, this._runtimeNode.userAnimated = !1); + } + }, + /** + * Gets the node's original 4x4 matrix transform from its local + * coordinates to its parent's, without any node transformations + * or articulations applied. + * + * @memberof ModelNode.prototype + * @type {Matrix4} + */ + originalMatrix: { + get: function() { + return this._runtimeNode.originalTransform; + } + } +}); +const InstancingStageCommon = `mat4 getInstancingTransform() +{ + mat4 instancingTransform; + + #ifdef HAS_INSTANCE_MATRICES + instancingTransform = mat4( + a_instancingTransformRow0.x, a_instancingTransformRow1.x, a_instancingTransformRow2.x, 0.0, // Column 1 + a_instancingTransformRow0.y, a_instancingTransformRow1.y, a_instancingTransformRow2.y, 0.0, // Column 2 + a_instancingTransformRow0.z, a_instancingTransformRow1.z, a_instancingTransformRow2.z, 0.0, // Column 3 + a_instancingTransformRow0.w, a_instancingTransformRow1.w, a_instancingTransformRow2.w, 1.0 // Column 4 + ); + #else + vec3 translation = vec3(0.0, 0.0, 0.0); + vec3 scale = vec3(1.0, 1.0, 1.0); + + #ifdef HAS_INSTANCE_TRANSLATION + translation = a_instanceTranslation; + #endif + #ifdef HAS_INSTANCE_SCALE + scale = a_instanceScale; + #endif + + instancingTransform = mat4( + scale.x, 0.0, 0.0, 0.0, + 0.0, scale.y, 0.0, 0.0, + 0.0, 0.0, scale.z, 0.0, + translation.x, translation.y, translation.z, 1.0 + ); + #endif + + return instancingTransform; +} + +#ifdef USE_2D_INSTANCING +mat4 getInstancingTransform2D() +{ + mat4 instancingTransform2D; + + #ifdef HAS_INSTANCE_MATRICES + instancingTransform2D = mat4( + a_instancingTransform2DRow0.x, a_instancingTransform2DRow1.x, a_instancingTransform2DRow2.x, 0.0, // Column 1 + a_instancingTransform2DRow0.y, a_instancingTransform2DRow1.y, a_instancingTransform2DRow2.y, 0.0, // Column 2 + a_instancingTransform2DRow0.z, a_instancingTransform2DRow1.z, a_instancingTransform2DRow2.z, 0.0, // Column 3 + a_instancingTransform2DRow0.w, a_instancingTransform2DRow1.w, a_instancingTransform2DRow2.w, 1.0 // Column 4 + ); + #else + vec3 translation2D = vec3(0.0, 0.0, 0.0); + vec3 scale = vec3(1.0, 1.0, 1.0); + + #ifdef HAS_INSTANCE_TRANSLATION + translation2D = a_instanceTranslation2D; + #endif + #ifdef HAS_INSTANCE_SCALE + scale = a_instanceScale; + #endif + + instancingTransform2D = mat4( + scale.x, 0.0, 0.0, 0.0, + 0.0, scale.y, 0.0, 0.0, + 0.0, 0.0, scale.z, 0.0, + translation2D.x, translation2D.y, translation2D.z, 1.0 + ); + #endif + + return instancingTransform2D; +} +#endif +`, InstancingStageVS = `void instancingStage(inout ProcessedAttributes attributes) +{ + vec3 positionMC = attributes.positionMC; + + mat4 instancingTransform = getInstancingTransform(); + + attributes.positionMC = (instancingTransform * vec4(positionMC, 1.0)).xyz; + + #ifdef HAS_NORMALS + vec3 normalMC = attributes.normalMC; + attributes.normalMC = (instancingTransform * vec4(normalMC, 0.0)).xyz; + #endif + + #ifdef USE_2D_INSTANCING + mat4 instancingTransform2D = getInstancingTransform2D(); + attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; + #endif +} +`, LegacyInstancingStageVS = `void legacyInstancingStage( + inout ProcessedAttributes attributes, + out mat4 instanceModelView, + out mat3 instanceModelViewInverseTranspose) +{ + vec3 positionMC = attributes.positionMC; + + mat4 instancingTransform = getInstancingTransform(); + + mat4 instanceModel = instancingTransform * u_instance_nodeTransform; + instanceModelView = u_instance_modifiedModelView; + instanceModelViewInverseTranspose = mat3(u_instance_modifiedModelView * instanceModel); + + attributes.positionMC = (instanceModel * vec4(positionMC, 1.0)).xyz; + + #ifdef USE_2D_INSTANCING + mat4 instancingTransform2D = getInstancingTransform2D(); + attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; + #endif +} +`, modelViewScratch = new Matrix4(), nodeTransformScratch = new Matrix4(), modelView2DScratch = new Matrix4(), InstancingPipelineStage = { + name: "InstancingPipelineStage", + // Helps with debugging + // Expose some methods for testing + _getInstanceTransformsAsMatrices: getInstanceTransformsAsMatrices, + _transformsToTypedArray: transformsToTypedArray +}; +InstancingPipelineStage.process = function(e, t, n) { + const i = t.instances, r = i.attributes[0].count, o = e.shaderBuilder; + o.addDefine("HAS_INSTANCING"), o.addVertexLines(InstancingStageCommon); + const s = e.model, c = s.sceneGraph, l = e.runtimeNode, d = n.mode !== SceneMode$1.SCENE3D && !n.scene3DOnly && s._projectTo2D, f = s._enablePick && !n.context.webgl2, h = []; + processTransformAttributes( + e, + n, + i, + h, + d, + f + ), processFeatureIdAttributes( + e, + n, + i, + h + ); + const p = {}; + if (i.transformInWorldSpace ? (o.addDefine( + "USE_LEGACY_INSTANCING", + void 0, + ShaderDestination$1.VERTEX + ), o.addUniform( + "mat4", + "u_instance_modifiedModelView", + ShaderDestination$1.VERTEX + ), o.addUniform( + "mat4", + "u_instance_nodeTransform", + ShaderDestination$1.VERTEX + ), p.u_instance_modifiedModelView = function() { + let m = Matrix4.multiplyTransformation( + // For 3D Tiles, model.modelMatrix is the computed tile + // transform (which includes tileset.modelMatrix). This always applies + // for i3dm, since such models are always part of a tileset. + s.modelMatrix, + // For i3dm models, components.transform contains the RTC_CENTER + // translation. + c.components.transform, + modelViewScratch + ); + return d ? Matrix4.multiplyTransformation( + n.context.uniformState.view3D, + m, + modelViewScratch + ) : (n.mode !== SceneMode$1.SCENE3D && (m = Transforms.basisTo2D( + n.mapProjection, + m, + modelViewScratch + )), Matrix4.multiplyTransformation( + n.context.uniformState.view, + m, + modelViewScratch + )); + }, p.u_instance_nodeTransform = function() { + return Matrix4.multiplyTransformation( + // glTF y-up to 3D Tiles z-up + c.axisCorrectionMatrix, + // This transforms from the node's coordinate system to the root + // of the node hierarchy + l.computedTransform, + nodeTransformScratch + ); + }, o.addVertexLines(LegacyInstancingStageVS)) : o.addVertexLines(InstancingStageVS), d) { + o.addDefine( + "USE_2D_INSTANCING", + void 0, + ShaderDestination$1.VERTEX + ), o.addUniform("mat4", "u_modelView2D", ShaderDestination$1.VERTEX); + const m = n.context, _ = Matrix4.fromTranslation( + l.instancingReferencePoint2D, + new Matrix4() + ); + p.u_modelView2D = function() { + return Matrix4.multiplyTransformation( + m.uniformState.view, + _, + modelView2DScratch + ); + }; + } + e.uniformMap = combine$2(p, e.uniformMap), e.instanceCount = r, e.attributes.push.apply( + e.attributes, + h + ); +}; +const projectedTransformScratch = new Matrix4(), projectedPositionScratch = new Cartesian3(); +function projectTransformTo2D(e, t, n, i, r) { + let o = Matrix4.multiplyTransformation( + t, + e, + projectedTransformScratch + ); + return o = Matrix4.multiplyTransformation( + o, + n, + projectedTransformScratch + ), r = Transforms.basisTo2D( + i.mapProjection, + o, + r + ), r; +} +function projectPositionTo2D(e, t, n, i, r) { + const o = Matrix4.fromTranslation( + e, + projectedTransformScratch + ); + let s = Matrix4.multiplyTransformation( + t, + o, + projectedTransformScratch + ); + s = Matrix4.multiplyTransformation( + s, + n, + projectedTransformScratch + ); + const c = Matrix4.getTranslation( + s, + projectedPositionScratch + ); + return r = SceneTransforms.computeActualEllipsoidPosition( + i, + c, + r + ), r; +} +function getModelMatrixAndNodeTransform(e, t, n) { + const i = e.model, r = i.sceneGraph; + e.runtimeNode.node.instances.transformInWorldSpace ? (t = Matrix4.multiplyTransformation( + i.modelMatrix, + r.components.transform, + t + ), n = Matrix4.multiplyTransformation( + r.axisCorrectionMatrix, + e.runtimeNode.computedTransform, + n + )) : (t = Matrix4.clone(r.computedModelMatrix, t), t = Matrix4.multiplyTransformation( + t, + e.runtimeNode.computedTransform, + t + ), n = Matrix4.clone( + Matrix4.IDENTITY, + n + )); +} +const modelMatrixScratch$2 = new Matrix4(), nodeComputedTransformScratch = new Matrix4(), transformScratch = new Matrix4(), positionScratch$9 = new Cartesian3(); +function projectTransformsTo2D(e, t, n, i) { + const r = modelMatrixScratch$2, o = nodeComputedTransformScratch; + getModelMatrixAndNodeTransform( + t, + r, + o + ); + const c = t.runtimeNode.instancingReferencePoint2D, l = e.length; + for (let d = 0; d < l; d++) { + const f = e[d], h = projectTransformTo2D( + f, + r, + o, + n, + transformScratch + ), p = Matrix4.getTranslation( + h, + positionScratch$9 + ), m = Cartesian3.subtract( + p, + c, + p + ); + i[d] = Matrix4.setTranslation( + h, + m, + i[d] + ); + } + return i; +} +function projectTranslationsTo2D(e, t, n, i) { + const r = modelMatrixScratch$2, o = nodeComputedTransformScratch; + getModelMatrixAndNodeTransform( + t, + r, + o + ); + const c = t.runtimeNode.instancingReferencePoint2D, l = e.length; + for (let d = 0; d < l; d++) { + const f = e[d], h = projectPositionTo2D( + f, + r, + o, + n, + f + ); + i[d] = Cartesian3.subtract( + h, + c, + i[d] + ); + } + return i; +} +const scratchProjectedMin$1 = new Cartesian3(), scratchProjectedMax$1 = new Cartesian3(); +function computeReferencePoint2D(e, t) { + const n = e.runtimeNode, i = e.model.sceneGraph.computedModelMatrix, r = Matrix4.multiplyByPoint( + i, + n.instancingTranslationMin, + scratchProjectedMin$1 + ), o = SceneTransforms.computeActualEllipsoidPosition( + t, + r, + r + ), s = Matrix4.multiplyByPoint( + i, + n.instancingTranslationMax, + scratchProjectedMax$1 + ), c = SceneTransforms.computeActualEllipsoidPosition( + t, + s, + s + ); + n.instancingReferencePoint2D = Cartesian3.lerp( + o, + c, + 0.5, + new Cartesian3() + ); +} +function transformsToTypedArray(e) { + const n = e.length, i = new Float32Array(n * 12); + for (let r = 0; r < n; r++) { + const o = e[r], s = 12 * r; + i[s + 0] = o[0], i[s + 1] = o[4], i[s + 2] = o[8], i[s + 3] = o[12], i[s + 4] = o[1], i[s + 5] = o[5], i[s + 6] = o[9], i[s + 7] = o[13], i[s + 8] = o[2], i[s + 9] = o[6], i[s + 10] = o[10], i[s + 11] = o[14]; + } + return i; +} +function translationsToTypedArray(e) { + const n = e.length, i = new Float32Array(n * 3); + for (let r = 0; r < n; r++) { + const o = e[r], s = 3 * r; + i[s + 0] = o[0], i[s + 1] = o[4], i[s + 2] = o[8]; + } + return i; +} +function getInstanceTransformsAsMatrices(e, t, n) { + const i = new Array(t), r = ModelUtility.getAttributeBySemantic( + e, + InstanceAttributeSemantic$1.TRANSLATION + ), o = ModelUtility.getAttributeBySemantic( + e, + InstanceAttributeSemantic$1.ROTATION + ), s = ModelUtility.getAttributeBySemantic( + e, + InstanceAttributeSemantic$1.SCALE + ), c = new Cartesian3( + -Number.MAX_VALUE, + -Number.MAX_VALUE, + -Number.MAX_VALUE + ), l = new Cartesian3( + Number.MAX_VALUE, + Number.MAX_VALUE, + Number.MAX_VALUE + ), d = defined(r), f = defined(o), h = defined(s), p = d ? r.typedArray : new Float32Array(t * 3); + let m = f ? o.typedArray : new Float32Array(t * 4); + f && o.normalized && (m = AttributeCompression.dequantize( + m, + o.componentDatatype, + o.type, + t + )); + let _; + h ? _ = s.typedArray : (_ = new Float32Array(t * 3), _.fill(1)); + for (let C = 0; C < t; C++) { + const T = new Cartesian3( + p[C * 3], + p[C * 3 + 1], + p[C * 3 + 2] + ); + Cartesian3.maximumByComponent( + c, + T, + c + ), Cartesian3.minimumByComponent( + l, + T, + l + ); + const x = new Quaternion( + m[C * 4], + m[C * 4 + 1], + m[C * 4 + 2], + f ? m[C * 4 + 3] : 1 + ), b = new Cartesian3( + _[C * 3], + _[C * 3 + 1], + _[C * 3 + 2] + ), S = Matrix4.fromTranslationQuaternionRotationScale( + T, + x, + b, + new Matrix4() + ); + i[C] = S; + } + const y = n.runtimeNode; + return y.instancingTranslationMin = l, y.instancingTranslationMax = c, d && (r.typedArray = void 0), f && (o.typedArray = void 0), h && (s.typedArray = void 0), i; +} +function getInstanceTranslationsAsCartesian3s(e, t, n) { + const i = new Array(t), r = e.typedArray, o = new Cartesian3( + Number.MAX_VALUE, + Number.MAX_VALUE, + Number.MAX_VALUE + ), s = new Cartesian3( + -Number.MAX_VALUE, + -Number.MAX_VALUE, + -Number.MAX_VALUE + ); + for (let l = 0; l < t; l++) { + const d = new Cartesian3( + r[l * 3], + r[l * 3 + 1], + r[l * 3 + 2] + ); + i[l] = d, Cartesian3.minimumByComponent( + o, + d, + o + ), Cartesian3.maximumByComponent( + s, + d, + s + ); + } + const c = n.runtimeNode; + return c.instancingTranslationMin = o, c.instancingTranslationMax = s, e.typedArray = void 0, i; +} +function createVertexBuffer(e, t) { + const n = Buffer.createVertexBuffer({ + context: t.context, + typedArray: e, + usage: BufferUsage$1.STATIC_DRAW + }); + return n.vertexArrayDestroyable = !1, n; +} +function processTransformAttributes(e, t, n, i, r, o) { + const s = ModelUtility.getAttributeBySemantic( + n, + InstanceAttributeSemantic$1.ROTATION + ); + defined(s) ? processTransformMatrixAttributes( + e, + n, + i, + t, + r, + o + ) : processTransformVec3Attributes( + e, + n, + i, + t, + r + ); +} +function processTransformMatrixAttributes(e, t, n, i, r, o) { + const s = e.shaderBuilder, c = t.attributes[0].count, l = e.model, d = e.runtimeNode; + s.addDefine("HAS_INSTANCE_MATRICES"); + const f = "Transform"; + let h, p = d.instancingTransformsBuffer; + if (!defined(p)) { + h = getInstanceTransformsAsMatrices( + t, + c, + e + ); + const C = transformsToTypedArray(h); + p = createVertexBuffer(C, i), l._modelResources.push(p), o && (d.transformsTypedArray = C), d.instancingTransformsBuffer = p; + } + if (processMatrixAttributes( + e, + p, + n, + f + ), !r) + return; + const m = clone$1(i); + m.mode = SceneMode$1.COLUMBUS_VIEW, computeReferencePoint2D(e, m); + let _ = d.instancingTransformsBuffer2D; + if (!defined(_)) { + const C = projectTransformsTo2D( + h, + e, + m, + h + ), T = transformsToTypedArray(C); + _ = createVertexBuffer(T, i), l._modelResources.push(_), d.instancingTransformsBuffer2D = _; + } + processMatrixAttributes( + e, + _, + n, + "Transform2D" + ); +} +function processTransformVec3Attributes(e, t, n, i, r, o) { + const s = e.shaderBuilder, c = e.runtimeNode, l = ModelUtility.getAttributeBySemantic( + t, + InstanceAttributeSemantic$1.TRANSLATION + ), d = ModelUtility.getAttributeBySemantic( + t, + InstanceAttributeSemantic$1.SCALE + ); + if (defined(d) && (s.addDefine("HAS_INSTANCE_SCALE"), processVec3Attribute( + e, + d.buffer, + d.byteOffset, + d.byteStride, + n, + "Scale" + )), !defined(l)) + return; + let f; + const h = l.typedArray; + if (defined(h) ? f = getInstanceTranslationsAsCartesian3s( + l, + l.count, + e + ) : defined(c.instancingTranslationMin) || (c.instancingTranslationMin = l.min, c.instancingTranslationMax = l.max), s.addDefine("HAS_INSTANCE_TRANSLATION"), processVec3Attribute( + e, + l.buffer, + l.byteOffset, + l.byteStride, + n, + "Translation" + ), !r && !o) + return; + const m = clone$1(i); + m.mode = SceneMode$1.COLUMBUS_VIEW, computeReferencePoint2D(e, m); + let _ = c.instancingTranslationBuffer2D; + if (!defined(_)) { + const x = projectTranslationsTo2D( + f, + e, + m, + f + ), b = translationsToTypedArray(x); + _ = createVertexBuffer(b, i), e.model._modelResources.push(_), c.instancingTranslationBuffer2D = _; + } + if (!r) + return; + processVec3Attribute( + e, + _, + 0, + void 0, + n, + "Translation2D" + ); +} +function processMatrixAttributes(e, t, n, i) { + const o = ComponentDatatype$1.getSizeInBytes( + ComponentDatatype$1.FLOAT + ), s = o * 12, c = [ + { + index: e.attributeIndex++, + vertexBuffer: t, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + normalize: !1, + offsetInBytes: 0, + strideInBytes: s, + instanceDivisor: 1 + }, + { + index: e.attributeIndex++, + vertexBuffer: t, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + normalize: !1, + offsetInBytes: o * 4, + strideInBytes: s, + instanceDivisor: 1 + }, + { + index: e.attributeIndex++, + vertexBuffer: t, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + normalize: !1, + offsetInBytes: o * 8, + strideInBytes: s, + instanceDivisor: 1 + } + ], l = e.shaderBuilder; + l.addAttribute("vec4", `a_instancing${i}Row0`), l.addAttribute("vec4", `a_instancing${i}Row1`), l.addAttribute("vec4", `a_instancing${i}Row2`), n.push.apply( + n, + c + ); +} +function processVec3Attribute(e, t, n, i, r, o) { + r.push({ + index: e.attributeIndex++, + vertexBuffer: t, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + normalize: !1, + offsetInBytes: n, + strideInBytes: i, + instanceDivisor: 1 + }), e.shaderBuilder.addAttribute("vec3", `a_instance${o}`); +} +function processFeatureIdAttributes(e, t, n, i) { + const r = n.attributes, o = e.shaderBuilder; + for (let s = 0; s < r.length; s++) { + const c = r[s]; + c.semantic === InstanceAttributeSemantic$1.FEATURE_ID && (c.setIndex >= e.featureIdVertexAttributeSetIndex && (e.featureIdVertexAttributeSetIndex = c.setIndex + 1), i.push({ + index: e.attributeIndex++, + vertexBuffer: c.buffer, + componentsPerAttribute: AttributeType$1.getNumberOfComponents( + c.type + ), + componentDatatype: c.componentDatatype, + normalize: !1, + offsetInBytes: c.byteOffset, + strideInBytes: c.byteStride, + instanceDivisor: 1 + }), o.addAttribute( + "float", + `a_instanceFeatureId_${c.setIndex}` + )); + } +} +const ModelMatrixUpdateStage = {}; +ModelMatrixUpdateStage.name = "ModelMatrixUpdateStage"; +ModelMatrixUpdateStage.update = function(e, t, n) { + const i = n.mode !== SceneMode$1.SCENE3D; + if (!(i && t._model._projectTo2D) && e._transformDirty) { + const r = i ? t._computedModelMatrix2D : t._computedModelMatrix; + updateRuntimeNode( + e, + t, + r, + e.transformToRoot + ), e._transformDirty = !1; + } +}; +function updateRuntimeNode(e, t, n, i) { + let r; + i = Matrix4.multiplyTransformation( + i, + e.transform, + new Matrix4() + ), e.updateComputedTransform(); + const o = e.runtimePrimitives.length; + for (r = 0; r < o; r++) { + const l = e.runtimePrimitives[r].drawCommand; + l.modelMatrix = Matrix4.multiplyTransformation( + n, + i, + l.modelMatrix + ), l.cullFace = ModelUtility.getCullFace( + l.modelMatrix, + l.primitiveType + ); + } + const s = e.children.length; + for (r = 0; r < s; r++) { + const c = t._runtimeNodes[e.children[r]]; + c._transformToRoot = Matrix4.clone( + i, + c._transformToRoot + ), updateRuntimeNode( + c, + t, + n, + i + ), c._transformDirty = !1; + } +} +const NodeStatisticsPipelineStage = { + name: "NodeStatisticsPipelineStage", + // Helps with debugging + // Expose some methods for testing + _countInstancingAttributes: countInstancingAttributes, + _countGeneratedBuffers: countGeneratedBuffers +}; +NodeStatisticsPipelineStage.process = function(e, t, n) { + const i = e.model.statistics, r = t.instances, o = e.runtimeNode; + countInstancingAttributes(i, r), countGeneratedBuffers(i, o); +}; +function countInstancingAttributes(e, t) { + if (!defined(t)) + return; + const n = t.attributes, i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + defined(o.buffer) && e.addBuffer(o.buffer, !1); + } +} +function countGeneratedBuffers(e, t) { + defined(t.instancingTransformsBuffer) && e.addBuffer(t.instancingTransformsBuffer, !1), defined(t.instancingTransformsBuffer2D) && e.addBuffer(t.instancingTransformsBuffer2D, !1), defined(t.instancingTranslationBuffer2D) && e.addBuffer(t.instancingTranslationBuffer2D, !1); +} +function ModelRuntimeNode(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.node, n = e.transform, i = e.transformToRoot, r = e.sceneGraph, o = e.children; + this._node = t, this._name = t.name, this._id = t.index, this._sceneGraph = r, this._children = o, this._originalTransform = Matrix4.clone(n, this._originalTransform), this._transform = Matrix4.clone(n, this._transform), this._transformToRoot = Matrix4.clone(i, this._transformToRoot), this._computedTransform = new Matrix4(), this._transformDirty = !1, this._transformParameters = void 0, this._morphWeights = [], this._runtimeSkin = void 0, this._computedJointMatrices = [], this.show = !0, this.userAnimated = !1, this.pipelineStages = [], this.runtimePrimitives = [], this.updateStages = [], this.instancingTranslationMin = void 0, this.instancingTranslationMax = void 0, this.instancingTransformsBuffer = void 0, this.instancingTransformsBuffer2D = void 0, this.instancingTranslationBuffer2D = void 0, this.instancingReferencePoint2D = void 0, initialize$6(this); +} +Object.defineProperties(ModelRuntimeNode.prototype, { + /** + * The internal node this runtime node represents. + * + * @memberof ModelRuntimeNode.prototype + * @type {ModelComponents.Node} + * @readonly + * + * @private + */ + node: { + get: function() { + return this._node; + } + }, + /** + * The scene graph this node belongs to. + * + * @memberof ModelRuntimeNode.prototype + * @type {ModelSceneGraph} + * @readonly + * + * @private + */ + sceneGraph: { + get: function() { + return this._sceneGraph; + } + }, + /** + * The indices of the children of this node in the scene graph. + * + * @memberof ModelRuntimeNode.prototype + * @type {number[]} + * @readonly + * + * @private + */ + children: { + get: function() { + return this._children; + } + }, + /** + * The node's local space transform. This can be changed externally via + * the corresponding {@link ModelNode}, such that animation can be + * driven by another source, not just an animation in the model's asset. + * + * @memberof ModelRuntimeNode.prototype + * @type {Matrix4} + * + * @private + */ + transform: { + get: function() { + return this._transform; + }, + set: function(e) { + this._transformDirty = !0, this._transform = Matrix4.clone(e, this._transform); + } + }, + /** + * The transforms of all the node's ancestors, not including this node's + * transform. + * + * @see ModelRuntimeNode#computedTransform + * + * @memberof ModelRuntimeNode.prototype + * @type {Matrix4} + * @readonly + * + * @private + */ + transformToRoot: { + get: function() { + return this._transformToRoot; + } + }, + /** + * A transform from the node's local space to the model's scene graph space. + * This is the product of transformToRoot * transform. + * + * @memberof ModelRuntimeNode.prototype + * @type {Matrix4} + * @readonly + * + * @private + */ + computedTransform: { + get: function() { + return this._computedTransform; + } + }, + /** + * The node's original transform, as specified in the model. + * Does not include transformations from the node's ancestors. + * + * @memberof ModelRuntimeNode.prototype + * @type {Matrix4} + * @readonly + * + * @private + */ + originalTransform: { + get: function() { + return this._originalTransform; + } + }, + /** + * The node's local space translation. This is used internally to allow + * animations in the model's asset to affect the node's properties. + * + * If the node's transformation was originally described using a matrix + * in the model, then this will return undefined. + * + * @memberof ModelRuntimeNode.prototype + * @type {Cartesian3} + * + * @exception {DeveloperError} The translation of a node cannot be set if it was defined using a matrix in the model's asset. + * + * @private + */ + translation: { + get: function() { + return defined(this._transformParameters) ? this._transformParameters.translation : void 0; + }, + set: function(e) { + const t = this._transformParameters, n = t.translation; + Cartesian3.equals(n, e) || (t.translation = Cartesian3.clone( + e, + t.translation + ), updateTransformFromParameters(this, t)); + } + }, + /** + * The node's local space rotation. This is used internally to allow + * animations in the model's asset to affect the node's properties. + * + * If the node's transformation was originally described using a matrix + * in the model, then this will return undefined. + * + * @memberof ModelRuntimeNode.prototype + * @type {Quaternion} + * + * @exception {DeveloperError} The rotation of a node cannot be set if it was defined using a matrix in the model's asset. + * + * @private + */ + rotation: { + get: function() { + return defined(this._transformParameters) ? this._transformParameters.rotation : void 0; + }, + set: function(e) { + const t = this._transformParameters, n = t.rotation; + Quaternion.equals(n, e) || (t.rotation = Quaternion.clone( + e, + t.rotation + ), updateTransformFromParameters(this, t)); + } + }, + /** + * The node's local space scale. This is used internally to allow + * animations in the model's asset to affect the node's properties. + * + * If the node's transformation was originally described using a matrix + * in the model, then this will return undefined. + * + * @memberof ModelRuntimeNode.prototype + * @type {Cartesian3} + * + * @exception {DeveloperError} The scale of a node cannot be set if it was defined using a matrix in the model's asset. + * @private + */ + scale: { + get: function() { + return defined(this._transformParameters) ? this._transformParameters.scale : void 0; + }, + set: function(e) { + const t = this._transformParameters, n = t.scale; + Cartesian3.equals(n, e) || (t.scale = Cartesian3.clone( + e, + t.scale + ), updateTransformFromParameters(this, t)); + } + }, + /** + * The node's morph weights. This is used internally to allow animations + * in the model's asset to affect the node's properties. + * + * @memberof ModelRuntimeNode.prototype + * @type {number[]} + * + * @private + */ + morphWeights: { + get: function() { + return this._morphWeights; + }, + set: function(e) { + const t = e.length; + for (let n = 0; n < t; n++) + this._morphWeights[n] = e[n]; + } + }, + /** + * The skin applied to this node, if it exists. + * + * @memberof ModelRuntimeNode.prototype + * @type {ModelSkin} + * @readonly + * + * @private + */ + runtimeSkin: { + get: function() { + return this._runtimeSkin; + } + }, + /** + * The computed joint matrices of this node, derived from its skin. + * + * @memberof ModelRuntimeNode.prototype + * @type {Matrix4[]} + * @readonly + * + * @private + */ + computedJointMatrices: { + get: function() { + return this._computedJointMatrices; + } + } +}); +function initialize$6(e) { + const t = e.transform, n = e.transformToRoot, i = e._computedTransform; + e._computedTransform = Matrix4.multiply( + n, + t, + i + ); + const r = e.node; + defined(r.matrix) || (e._transformParameters = new TranslationRotationScale( + r.translation, + r.rotation, + r.scale + )), defined(r.morphWeights) && (e._morphWeights = r.morphWeights.slice()); + const o = r.articulationName; + if (defined(o)) { + const l = e.sceneGraph._runtimeArticulations[o]; + defined(l) && l.runtimeNodes.push(e); + } +} +function updateTransformFromParameters(e, t) { + e._transformDirty = !0, e._transform = Matrix4.fromTranslationRotationScale( + t, + e._transform + ); +} +ModelRuntimeNode.prototype.getChild = function(e) { + return this.sceneGraph._runtimeNodes[this.children[e]]; +}; +ModelRuntimeNode.prototype.configurePipeline = function() { + const e = this.node, t = this.pipelineStages; + t.length = 0; + const n = this.updateStages; + n.length = 0, defined(e.instances) && t.push(InstancingPipelineStage), t.push(NodeStatisticsPipelineStage), n.push(ModelMatrixUpdateStage); +}; +ModelRuntimeNode.prototype.updateComputedTransform = function() { + this._computedTransform = Matrix4.multiply( + this._transformToRoot, + this._transform, + this._computedTransform + ); +}; +ModelRuntimeNode.prototype.updateJointMatrices = function() { + const e = this._runtimeSkin; + if (!defined(e)) + return; + e.updateJointMatrices(); + const t = this._computedJointMatrices, n = e.jointMatrices, i = n.length; + for (let r = 0; r < i; r++) { + defined(t[r]) || (t[r] = new Matrix4()); + const o = Matrix4.multiplyTransformation( + this.transformToRoot, + this.transform, + t[r] + ), s = Matrix4.inverseTransformation( + o, + t[r] + ); + t[r] = Matrix4.multiplyTransformation( + s, + n[r], + t[r] + ); + } +}; +const AlphaPipelineStage = { + name: "AlphaPipelineStage" + // Helps with debugging +}; +AlphaPipelineStage.process = function(e, t, n) { + const i = e.alphaOptions, r = e.model; + i.pass = defaultValue(i.pass, r.opaquePass); + const o = e.renderStateOptions; + i.pass === Pass$1.TRANSLUCENT && (o.cull.enabled = !1, o.depthMask = !1, o.blending = BlendingState$1.ALPHA_BLEND); + const s = e.shaderBuilder, c = e.uniformMap; + defined(i.alphaCutoff) && (s.addDefine( + "ALPHA_MODE_MASK", + void 0, + ShaderDestination$1.FRAGMENT + ), s.addUniform( + "float", + "u_alphaCutoff", + ShaderDestination$1.FRAGMENT + ), c.u_alphaCutoff = function() { + return i.alphaCutoff; + }); +}; +const BatchTexturePipelineStage = { + name: "BatchTexturePipelineStage" + // Helps with debugging +}; +BatchTexturePipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder, r = {}, o = e.model, s = o.featureTables[o.featureTableId], c = s.featuresLength; + i.addUniform("int", "model_featuresLength"), r.model_featuresLength = function() { + return c; + }; + const l = s.batchTexture; + i.addUniform("sampler2D", "model_batchTexture"), r.model_batchTexture = function() { + return defaultValue(l.batchTexture, l.defaultTexture); + }, i.addUniform("vec4", "model_textureStep"), r.model_textureStep = function() { + return l.textureStep; + }, l.textureDimensions.y > 1 && (i.addDefine("MULTILINE_BATCH_TEXTURE"), i.addUniform("vec2", "model_textureDimensions"), r.model_textureDimensions = function() { + return l.textureDimensions; + }), e.uniformMap = combine$2( + r, + e.uniformMap + ); +}; +const ClassificationPipelineStage = { + name: "ClassificationPipelineStage" + // Helps with debugging +}; +ClassificationPipelineStage.process = function(e, t, n) { + e.shaderBuilder.addDefine( + "HAS_CLASSIFICATION", + void 0, + ShaderDestination$1.BOTH + ); + const r = e.runtimePrimitive; + defined(r.batchLengths) || createClassificationBatches(t, r); +}; +function createClassificationBatches(e, t) { + const n = ModelUtility.getAttributeBySemantic( + e, + VertexAttributeSemantic$1.POSITION + ); + if (!defined(n)) + throw new RuntimeError( + "Primitives must have a position attribute to be used for classification." + ); + let i; + const r = e.indices, o = defined(r); + o && (i = r.typedArray, r.typedArray = void 0); + const s = o ? r.count : n.count, c = ModelUtility.getAttributeBySemantic( + e, + VertexAttributeSemantic$1.FEATURE_ID, + 0 + ); + if (!defined(c)) { + t.batchLengths = [s], t.batchOffsets = [0]; + return; + } + const l = c.typedArray; + c.typedArray = void 0; + const d = [], f = [0], h = o ? i[0] : 0; + let p = l[h], m = 0; + for (let y = 1; y < s; y++) { + const C = o ? i[y] : y, T = l[C]; + if (T !== p) { + const x = y - m, b = y; + d.push(x), f.push(b), m = b, p = T; + } + } + const _ = s - m; + d.push(_), t.batchLengths = d, t.batchOffsets = f; +} +const CPUStylingStageVS = `void filterByPassType(inout vec3 positionMC, vec4 featureColor) +{ + bool styleTranslucent = (featureColor.a != 1.0); + // Only render translucent features in the translucent pass (if the style or the original command has translucency). + if (czm_pass == czm_passTranslucent && !styleTranslucent && !model_commandTranslucent) + { + // If the model has a translucent silhouette, it needs to render during the silhouette color command, + // (i.e. the command where model_silhouettePass = true), even if the model isn't translucent. + #ifdef HAS_SILHOUETTE + positionMC *= float(model_silhouettePass); + #else + positionMC *= 0.0; + #endif + } + // If the current pass is not the translucent pass and the style is not translucent, don't render the feature. + else if (czm_pass != czm_passTranslucent && styleTranslucent) + { + positionMC *= 0.0; + } +} + +void cpuStylingStage(inout vec3 positionMC, inout SelectedFeature feature) +{ + float show = ceil(feature.color.a); + positionMC *= show; + + #if defined(HAS_SELECTED_FEATURE_ID_ATTRIBUTE) && !defined(HAS_CLASSIFICATION) + filterByPassType(positionMC, feature.color); + #endif +} +`, CPUStylingStageFS = `void filterByPassType(vec4 featureColor) +{ + bool styleTranslucent = (featureColor.a != 1.0); + // Only render translucent features in the translucent pass (if the style or the original command has translucency). + if (czm_pass == czm_passTranslucent && !styleTranslucent && !model_commandTranslucent) + { + // If the model has a translucent silhouette, it needs to render during the silhouette color command, + // (i.e. the command where model_silhouettePass = true), even if the model isn't translucent. + #ifdef HAS_SILHOUETTE + if(!model_silhouettePass) { + discard; + } + #else + discard; + #endif + } + // If the current pass is not the translucent pass and the style is not translucent, don't render the feature. + else if (czm_pass != czm_passTranslucent && styleTranslucent) + { + discard; + } +} + +void cpuStylingStage(inout czm_modelMaterial material, SelectedFeature feature) +{ + vec4 featureColor = feature.color; + if (featureColor.a == 0.0) + { + discard; + } + + // If a feature ID vertex attribute is used, the pass type filter is applied in the vertex shader. + // So, we only apply in in the fragment shader if the feature ID texture is used. + #if defined(HAS_SELECTED_FEATURE_ID_TEXTURE) && !defined(HAS_CLASSIFICATION) + filterByPassType(featureColor); + #endif + + featureColor = czm_gammaCorrect(featureColor); + + // Classification models compute the diffuse differently. + #ifdef HAS_CLASSIFICATION + material.diffuse = featureColor.rgb * featureColor.a; + #else + float highlight = ceil(model_colorBlend); + material.diffuse *= mix(featureColor.rgb, vec3(1.0), highlight); + #endif + + material.alpha *= featureColor.a; +} +`, CPUStylingPipelineStage = { + name: "CPUStylingPipelineStage" + // Helps with debugging +}; +CPUStylingPipelineStage.process = function(e, t, n) { + const i = e.model, r = e.shaderBuilder; + r.addVertexLines(CPUStylingStageVS), r.addFragmentLines(CPUStylingStageFS), r.addDefine("USE_CPU_STYLING", void 0, ShaderDestination$1.BOTH), defined(i.color) || (r.addUniform( + "float", + ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME, + ShaderDestination$1.FRAGMENT + ), e.uniformMap[ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME] = function() { + return ColorBlendMode$1.getColorBlend( + i.colorBlendMode, + i.colorBlendAmount + ); + }), r.addUniform( + "bool", + "model_commandTranslucent", + ShaderDestination$1.BOTH + ), e.uniformMap.model_commandTranslucent = function() { + return e.alphaOptions.pass === Pass$1.TRANSLUCENT; + }; +}; +const CustomShaderMode = { + /** + * The custom shader will be used to modify the results of the material stage + * before lighting is applied. + * + * @type {string} + * @constant + */ + MODIFY_MATERIAL: "MODIFY_MATERIAL", + /** + * The custom shader will be used instead of the material stage. This is a hint + * to optimize out the material processing code. + * + * @type {string} + * @constant + */ + REPLACE_MATERIAL: "REPLACE_MATERIAL" +}; +CustomShaderMode.getDefineName = function(e) { + return `CUSTOM_SHADER_${e}`; +}; +const CustomShaderMode$1 = Object.freeze(CustomShaderMode), CustomShaderStageVS = `void customShaderStage( + inout czm_modelVertexOutput vsOutput, + inout ProcessedAttributes attributes, + FeatureIds featureIds, + Metadata metadata, + MetadataClass metadataClass, + MetadataStatistics metadataStatistics +) { + // VertexInput and initializeInputStruct() are dynamically generated in JS, + // see CustomShaderPipelineStage.js + VertexInput vsInput; + initializeInputStruct(vsInput, attributes); + vsInput.featureIds = featureIds; + vsInput.metadata = metadata; + vsInput.metadataClass = metadataClass; + vsInput.metadataStatistics = metadataStatistics; + vertexMain(vsInput, vsOutput); + attributes.positionMC = vsOutput.positionMC; +} +`, CustomShaderStageFS = `void customShaderStage( + inout czm_modelMaterial material, + ProcessedAttributes attributes, + FeatureIds featureIds, + Metadata metadata, + MetadataClass metadataClass, + MetadataStatistics metadataStatistics +) { + // FragmentInput and initializeInputStruct() are dynamically generated in JS, + // see CustomShaderPipelineStage.js + FragmentInput fsInput; + initializeInputStruct(fsInput, attributes); + fsInput.featureIds = featureIds; + fsInput.metadata = metadata; + fsInput.metadataClass = metadataClass; + fsInput.metadataStatistics = metadataStatistics; + fragmentMain(fsInput, material); +} +`, FeatureIdStageFS = `void featureIdStage(out FeatureIds featureIds, ProcessedAttributes attributes) { + initializeFeatureIds(featureIds, attributes); + initializeFeatureIdAliases(featureIds); +} +`, FeatureIdStageVS = `void featureIdStage(out FeatureIds featureIds, ProcessedAttributes attributes) +{ + initializeFeatureIds(featureIds, attributes); + initializeFeatureIdAliases(featureIds); + setFeatureIdVaryings(); +} +`, FeatureIdPipelineStage = { + name: "FeatureIdPipelineStage", + // Helps with debugging + STRUCT_ID_FEATURE_IDS_VS: "FeatureIdsVS", + STRUCT_ID_FEATURE_IDS_FS: "FeatureIdsFS", + STRUCT_NAME_FEATURE_IDS: "FeatureIds", + FUNCTION_ID_INITIALIZE_FEATURE_IDS_VS: "initializeFeatureIdsVS", + FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS: "initializeFeatureIdsFS", + FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_VS: "initializeFeatureIdAliasesVS", + FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_FS: "initializeFeatureIdAliasesFS", + FUNCTION_SIGNATURE_INITIALIZE_FEATURE_IDS: "void initializeFeatureIds(out FeatureIds featureIds, ProcessedAttributes attributes)", + FUNCTION_SIGNATURE_INITIALIZE_FEATURE_ID_ALIASES: "void initializeFeatureIdAliases(inout FeatureIds featureIds)", + FUNCTION_ID_SET_FEATURE_ID_VARYINGS: "setFeatureIdVaryings", + FUNCTION_SIGNATURE_SET_FEATURE_ID_VARYINGS: "void setFeatureIdVaryings()" +}; +FeatureIdPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder; + declareStructsAndFunctions$1(i); + const r = e.runtimeNode.node.instances; + defined(r) && processInstanceFeatureIds(e, r, n), processPrimitiveFeatureIds(e, t, n), i.addVertexLines(FeatureIdStageVS), i.addFragmentLines(FeatureIdStageFS); +}; +function declareStructsAndFunctions$1(e) { + e.addStruct( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_VS, + FeatureIdPipelineStage.STRUCT_NAME_FEATURE_IDS, + ShaderDestination$1.VERTEX + ), e.addStruct( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + FeatureIdPipelineStage.STRUCT_NAME_FEATURE_IDS, + ShaderDestination$1.FRAGMENT + ), e.addFunction( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_VS, + FeatureIdPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_FEATURE_IDS, + ShaderDestination$1.VERTEX + ), e.addFunction( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS, + FeatureIdPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_FEATURE_IDS, + ShaderDestination$1.FRAGMENT + ), e.addFunction( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_VS, + FeatureIdPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_FEATURE_ID_ALIASES, + ShaderDestination$1.VERTEX + ), e.addFunction( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_FS, + FeatureIdPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_FEATURE_ID_ALIASES, + ShaderDestination$1.FRAGMENT + ), e.addFunction( + FeatureIdPipelineStage.FUNCTION_ID_SET_FEATURE_ID_VARYINGS, + FeatureIdPipelineStage.FUNCTION_SIGNATURE_SET_FEATURE_ID_VARYINGS, + ShaderDestination$1.VERTEX + ); +} +function processInstanceFeatureIds(e, t, n) { + const i = t.featureIds, r = t.attributes[0].count; + for (let o = 0; o < i.length; o++) { + const s = i[o], c = s.positionalLabel; + s instanceof ModelComponents.FeatureIdAttribute ? processInstanceAttribute(e, s, c) : processImplicitRange( + e, + s, + c, + r, + 1, + n + ); + const l = s.label; + defined(l) && addAlias(e, c, l, ShaderDestination$1.BOTH); + } +} +function processPrimitiveFeatureIds(e, t, n) { + const i = t.featureIds, o = ModelUtility.getAttributeBySemantic( + t, + VertexAttributeSemantic$1.POSITION + ).count; + for (let s = 0; s < i.length; s++) { + const c = i[s], l = c.positionalLabel; + let d = ShaderDestination$1.BOTH; + c instanceof ModelComponents.FeatureIdAttribute ? processAttribute$1(e, c, l) : c instanceof ModelComponents.FeatureIdImplicitRange ? processImplicitRange( + e, + c, + l, + o, + void 0, + n + ) : (processTexture$1(e, c, l, s, n), d = ShaderDestination$1.FRAGMENT); + const f = c.label; + defined(f) && addAlias(e, l, f, d); + } +} +function processInstanceAttribute(e, t, n) { + const i = e.shaderBuilder; + i.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_VS, + "int", + n + ), i.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + "int", + n + ); + const r = t.setIndex, o = n.replace(/_\d+$/, "_"), s = `a_${o}${r}`, c = `v_${o}${r}`, l = `featureIds.${n} = int(czm_round(${s}));`, d = `featureIds.${n} = int(czm_round(${c}));`; + i.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_VS, + [l] + ), i.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS, + [d] + ), i.addVarying("float", c), i.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_SET_FEATURE_ID_VARYINGS, + [`${c} = ${s};`] + ); +} +function processAttribute$1(e, t, n) { + const i = e.shaderBuilder; + i.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_VS, + "int", + n + ), i.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + "int", + n + ); + const r = t.setIndex, o = n.replace(/_\d+$/, "_"), s = [ + `featureIds.${n} = int(czm_round(attributes.${o}${r}));` + ]; + i.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_VS, + s + ), i.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS, + s + ); +} +function processImplicitRange(e, t, n, i, r, o) { + generateImplicitFeatureIdAttribute( + e, + t, + i, + r, + o + ); + const s = e.shaderBuilder, c = `a_implicit_${n}`; + s.addAttribute("float", c); + const l = `v_implicit_${n}`; + s.addVarying("float", l), s.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_VS, + "int", + n + ), s.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + "int", + n + ), s.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_SET_FEATURE_ID_VARYINGS, + [`${l} = ${c};`] + ), s.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_VS, + [`featureIds.${n} = int(czm_round(${c}));`] + ), s.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS, + [`featureIds.${n} = int(czm_round(${l}));`] + ); +} +function processTexture$1(e, t, n, i, r) { + const o = `u_featureIdTexture_${i}`, s = e.uniformMap, c = t.textureReader; + s[o] = function() { + return defaultValue( + c.texture, + r.context.defaultTexture + ); + }; + const l = c.channels, d = e.shaderBuilder; + d.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + "int", + n + ), d.addUniform( + "sampler2D", + o, + ShaderDestination$1.FRAGMENT + ); + const h = `v_texCoord_${c.texCoord}`; + let p = h; + const m = c.transform; + if (defined(m) && !Matrix3.equals(m, Matrix3.IDENTITY)) { + const C = `${o}Transform`; + d.addUniform( + "mat3", + C, + ShaderDestination$1.FRAGMENT + ), s[C] = function() { + return m; + }, p = `vec2(${C} * vec3(${h}, 1.0))`; + } + const _ = `texture(${o}, ${p}).${l}`, y = `featureIds.${n} = czm_unpackUint(${_});`; + d.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_IDS_FS, + [y] + ); +} +function addAlias(e, t, n, i) { + const r = e.shaderBuilder, o = ShaderDestination$1.includesVertexShader(i); + o && r.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_VS, + "int", + n + ), r.addStructField( + FeatureIdPipelineStage.STRUCT_ID_FEATURE_IDS_FS, + "int", + n + ); + const s = [ + `featureIds.${n} = featureIds.${t};` + ]; + o && r.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_VS, + s + ), r.addFunctionLines( + FeatureIdPipelineStage.FUNCTION_ID_INITIALIZE_FEATURE_ID_ALIASES_FS, + s + ); +} +function generateImplicitFeatureIdAttribute(e, t, n, i, r) { + const o = e.model; + let s, c; + if (defined(t.repeat)) { + const d = generateImplicitFeatureIdTypedArray( + t, + n + ); + s = Buffer.createVertexBuffer({ + context: r.context, + typedArray: d, + usage: BufferUsage$1.STATIC_DRAW + }), s.vertexArrayDestroyable = !1, o._pipelineResources.push(s), o.statistics.addBuffer(s, !1); + } else + c = [t.offset]; + const l = { + index: e.attributeIndex++, + instanceDivisor: i, + value: c, + vertexBuffer: s, + normalize: !1, + componentsPerAttribute: 1, + componentDatatype: ComponentDatatype$1.FLOAT, + strideInBytes: ComponentDatatype$1.getSizeInBytes(ComponentDatatype$1.FLOAT), + offsetInBytes: 0 + }; + e.attributes.push(l); +} +function generateImplicitFeatureIdTypedArray(e, t) { + const n = e.offset, i = e.repeat, r = new Float32Array(t); + for (let o = 0; o < t; o++) + r[o] = n + Math.floor(o / i); + return r; +} +const MetadataStageFS = `void metadataStage( + out Metadata metadata, + out MetadataClass metadataClass, + out MetadataStatistics metadataStatistics, + ProcessedAttributes attributes + ) +{ + initializeMetadata(metadata, metadataClass, metadataStatistics, attributes); +} +`, MetadataStageVS = `void metadataStage( + out Metadata metadata, + out MetadataClass metadataClass, + out MetadataStatistics metadataStatistics, + ProcessedAttributes attributes + ) +{ + initializeMetadata(metadata, metadataClass, metadataStatistics, attributes); + setMetadataVaryings(); +} +`, MetadataPipelineStage = { + name: "MetadataPipelineStage", + STRUCT_ID_METADATA_VS: "MetadataVS", + STRUCT_ID_METADATA_FS: "MetadataFS", + STRUCT_NAME_METADATA: "Metadata", + STRUCT_ID_METADATA_CLASS_VS: "MetadataClassVS", + STRUCT_ID_METADATA_CLASS_FS: "MetadataClassFS", + STRUCT_NAME_METADATA_CLASS: "MetadataClass", + STRUCT_ID_METADATA_STATISTICS_VS: "MetadataStatisticsVS", + STRUCT_ID_METADATA_STATISTICS_FS: "MetadataStatisticsFS", + STRUCT_NAME_METADATA_STATISTICS: "MetadataStatistics", + FUNCTION_ID_INITIALIZE_METADATA_VS: "initializeMetadataVS", + FUNCTION_ID_INITIALIZE_METADATA_FS: "initializeMetadataFS", + FUNCTION_SIGNATURE_INITIALIZE_METADATA: "void initializeMetadata(out Metadata metadata, out MetadataClass metadataClass, out MetadataStatistics metadataStatistics, ProcessedAttributes attributes)", + FUNCTION_ID_SET_METADATA_VARYINGS: "setMetadataVaryings", + FUNCTION_SIGNATURE_SET_METADATA_VARYINGS: "void setMetadataVaryings()", + // Metadata class and statistics fields: + // - some must be renamed to avoid reserved words + // - some always have float/vec values, even for integer/ivec property types + METADATA_CLASS_FIELDS: [ + { specName: "noData", shaderName: "noData" }, + { specName: "default", shaderName: "defaultValue" }, + { specName: "min", shaderName: "minValue" }, + { specName: "max", shaderName: "maxValue" } + ], + METADATA_STATISTICS_FIELDS: [ + { specName: "min", shaderName: "minValue" }, + { specName: "max", shaderName: "maxValue" }, + { specName: "mean", shaderName: "mean", type: "float" }, + { specName: "median", shaderName: "median" }, + { + specName: "standardDeviation", + shaderName: "standardDeviation", + type: "float" + }, + { specName: "variance", shaderName: "variance", type: "float" }, + { specName: "sum", shaderName: "sum" } + ] +}; +MetadataPipelineStage.process = function(e, t, n) { + var h; + const { shaderBuilder: i, model: r } = e, { structuralMetadata: o = {}, content: s } = r, c = (h = s == null ? void 0 : s.tileset.metadataExtension) == null ? void 0 : h.statistics, l = getPropertyAttributesInfo( + o.propertyAttributes, + t, + c + ), d = getPropertyTexturesInfo( + o.propertyTextures, + c + ), f = l.concat(d); + declareMetadataTypeStructs(i, f), declareStructsAndFunctions(i), i.addVertexLines(MetadataStageVS), i.addFragmentLines(MetadataStageFS); + for (let p = 0; p < l.length; p++) { + const m = l[p]; + processPropertyAttributeProperty(e, m); + } + for (let p = 0; p < d.length; p++) { + const m = d[p]; + processPropertyTextureProperty(e, m); + } +}; +function getPropertyAttributesInfo(e, t, n) { + return defined(e) ? e.flatMap( + (i) => getPropertyAttributeInfo(i, t, n) + ) : []; +} +function getPropertyAttributeInfo(e, t, n) { + const { + getAttributeByName: i, + getAttributeInfo: r, + sanitizeGlslIdentifier: o + } = ModelUtility, s = e.class.id, c = n == null ? void 0 : n.classes[s], l = Object.entries(e.properties), d = new Array(l.length); + for (let f = 0; f < l.length; f++) { + const [h, p] = l[f], m = i(t, p.attribute), { glslType: _, variableName: y } = r(m); + d[f] = { + metadataVariable: o(h), + property: p, + type: p.classProperty.type, + glslType: _, + variableName: y, + propertyStatistics: c == null ? void 0 : c.properties[h], + shaderDestination: ShaderDestination$1.BOTH + }; + } + return d; +} +function getPropertyTexturesInfo(e, t) { + return defined(e) ? e.flatMap( + (n) => getPropertyTextureInfo(n, t) + ) : []; +} +function getPropertyTextureInfo(e, t) { + const { sanitizeGlslIdentifier: n } = ModelUtility, i = e.class.id, r = t == null ? void 0 : t.classes[i], o = Object.entries( + e.properties + ).filter(([c, l]) => l.isGpuCompatible()), s = new Array(o.length); + for (let c = 0; c < o.length; c++) { + const [l, d] = o[c]; + s[c] = { + metadataVariable: n(l), + property: d, + type: d.classProperty.type, + glslType: d.getGlslType(), + propertyStatistics: r == null ? void 0 : r.properties[l], + shaderDestination: ShaderDestination$1.FRAGMENT + }; + } + return s; +} +function declareMetadataTypeStructs(e, t) { + const n = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(); + for (let c = 0; c < t.length; c++) { + const { type: l, glslType: d, propertyStatistics: f } = t[c]; + n.add(d), defined(f) && l !== MetadataType$1.ENUM && i.add(d); + } + const r = MetadataPipelineStage.METADATA_CLASS_FIELDS; + for (const c of n) { + const l = `${c}MetadataClass`; + s(l, c, r); + } + const o = MetadataPipelineStage.METADATA_STATISTICS_FIELDS; + for (const c of i) { + const l = `${c}MetadataStatistics`; + s(l, c, o); + } + function s(c, l, d) { + e.addStruct(c, c, ShaderDestination$1.BOTH); + for (let f = 0; f < d.length; f++) { + const { shaderName: h } = d[f], p = d[f].type === "float" ? convertToFloatComponents(l) : l; + e.addStructField(c, p, h); + } + } +} +const floatConversions = { + int: "float", + ivec2: "vec2", + ivec3: "vec3", + ivec4: "vec4" +}; +function convertToFloatComponents(e) { + const t = floatConversions[e]; + return defined(t) ? t : e; +} +function declareStructsAndFunctions(e) { + e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_VS, + MetadataPipelineStage.STRUCT_NAME_METADATA, + ShaderDestination$1.VERTEX + ), e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_FS, + MetadataPipelineStage.STRUCT_NAME_METADATA, + ShaderDestination$1.FRAGMENT + ), e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_CLASS_VS, + MetadataPipelineStage.STRUCT_NAME_METADATA_CLASS, + ShaderDestination$1.VERTEX + ), e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_CLASS_FS, + MetadataPipelineStage.STRUCT_NAME_METADATA_CLASS, + ShaderDestination$1.FRAGMENT + ), e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_STATISTICS_VS, + MetadataPipelineStage.STRUCT_NAME_METADATA_STATISTICS, + ShaderDestination$1.VERTEX + ), e.addStruct( + MetadataPipelineStage.STRUCT_ID_METADATA_STATISTICS_FS, + MetadataPipelineStage.STRUCT_NAME_METADATA_STATISTICS, + ShaderDestination$1.FRAGMENT + ), e.addFunction( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_VS, + MetadataPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_METADATA, + ShaderDestination$1.VERTEX + ), e.addFunction( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_FS, + MetadataPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_METADATA, + ShaderDestination$1.FRAGMENT + ), e.addFunction( + MetadataPipelineStage.FUNCTION_ID_SET_METADATA_VARYINGS, + MetadataPipelineStage.FUNCTION_SIGNATURE_SET_METADATA_VARYINGS, + ShaderDestination$1.VERTEX + ); +} +function processPropertyAttributeProperty(e, t) { + addPropertyAttributePropertyMetadata(e, t), addPropertyMetadataClass(e.shaderBuilder, t), addPropertyMetadataStatistics(e.shaderBuilder, t); +} +function addPropertyAttributePropertyMetadata(e, t) { + const { shaderBuilder: n } = e, { metadataVariable: i, property: r, glslType: o } = t, s = addValueTransformUniforms({ + valueExpression: `attributes.${t.variableName}`, + renderResources: e, + glslType: o, + metadataVariable: i, + shaderDestination: ShaderDestination$1.BOTH, + property: r + }); + n.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_VS, + o, + i + ), n.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_FS, + o, + i + ); + const c = `metadata.${i} = ${s};`; + n.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_VS, + [c] + ), n.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_FS, + [c] + ); +} +function processPropertyTextureProperty(e, t) { + addPropertyTexturePropertyMetadata(e, t), addPropertyMetadataClass(e.shaderBuilder, t), addPropertyMetadataStatistics(e.shaderBuilder, t); +} +function addPropertyTexturePropertyMetadata(e, t) { + const { shaderBuilder: n, uniformMap: i } = e, { metadataVariable: r, glslType: o, property: s } = t, { + texCoord: c, + channels: l, + index: d, + texture: f, + transform: h + } = s.textureReader, p = `u_propertyTexture_${d}`; + i.hasOwnProperty(p) || (n.addUniform( + "sampler2D", + p, + ShaderDestination$1.FRAGMENT + ), i[p] = () => f), n.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_FS, + o, + r + ); + const m = `attributes.texCoord_${c}`; + let _ = m; + if (defined(h) && !Matrix3.equals(h, Matrix3.IDENTITY)) { + const b = `${p}Transform`; + n.addUniform( + "mat3", + b, + ShaderDestination$1.FRAGMENT + ), i[b] = function() { + return h; + }, _ = `vec2(${b} * vec3(${m}, 1.0))`; + } + const y = `texture(${p}, ${_}).${l}`, C = s.unpackInShader(y), T = addValueTransformUniforms({ + valueExpression: C, + renderResources: e, + glslType: o, + metadataVariable: r, + shaderDestination: ShaderDestination$1.FRAGMENT, + property: s + }), x = `metadata.${r} = ${T};`; + n.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_FS, + [x] + ); +} +function addPropertyMetadataClass(e, t) { + const { classProperty: n } = t.property, { metadataVariable: i, glslType: r, shaderDestination: o } = t, s = getStructAssignments( + MetadataPipelineStage.METADATA_CLASS_FIELDS, + n, + `metadataClass.${i}`, + r + ), c = `${r}MetadataClass`; + e.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_CLASS_FS, + c, + i + ), e.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_FS, + s + ), ShaderDestination$1.includesVertexShader(o) && (e.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_CLASS_VS, + c, + i + ), e.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_VS, + s + )); +} +function addPropertyMetadataStatistics(e, t) { + const { propertyStatistics: n } = t; + if (!defined(n)) + return; + const { metadataVariable: i, type: r, glslType: o } = t; + if (r === MetadataType$1.ENUM) + return; + const s = MetadataPipelineStage.METADATA_STATISTICS_FIELDS, c = `metadataStatistics.${i}`, l = getStructAssignments( + s, + n, + c, + o + ), d = `${o}MetadataStatistics`; + e.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_STATISTICS_FS, + d, + i + ), e.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_FS, + l + ), ShaderDestination$1.includesVertexShader(t.shaderDestination) && (e.addStructField( + MetadataPipelineStage.STRUCT_ID_METADATA_STATISTICS_VS, + d, + i + ), e.addFunctionLines( + MetadataPipelineStage.FUNCTION_ID_INITIALIZE_METADATA_VS, + l + )); +} +function getStructAssignments(e, t, n, i) { + function r(o) { + const s = t[o.specName]; + if (defined(s)) + return `${n}.${o.shaderName} = ${i}(${s});`; + } + return defined(t) ? e.map(r).filter(defined) : []; +} +function addValueTransformUniforms(e) { + const { valueExpression: t, property: n } = e; + if (!n.hasValueTransform) + return t; + const i = e.metadataVariable, r = `u_${i}_offset`, o = `u_${i}_scale`, { shaderBuilder: s, uniformMap: c } = e.renderResources, { glslType: l, shaderDestination: d } = e; + s.addUniform(l, r, d), s.addUniform(l, o, d); + const { offset: f, scale: h } = n; + return c[r] = () => f, c[o] = () => h, `czm_valueTransform(${r}, ${o}, ${t})`; +} +const CustomShaderTranslucencyMode = { + /** + * Inherit translucency settings from the primitive's material. If the primitive used a + * translucent material, the custom shader will also be considered translucent. If the primitive + * used an opaque material, the custom shader will be considered opaque. + * + * @type {number} + * @constant + */ + INHERIT: 0, + /** + * Force the primitive to render the primitive as opaque, ignoring any material settings. + * + * @type {number} + * @constant + */ + OPAQUE: 1, + /** + * Force the primitive to render the primitive as translucent, ignoring any material settings. + * + * @type {number} + * @constant + */ + TRANSLUCENT: 2 +}, CustomShaderTranslucencyMode$1 = Object.freeze(CustomShaderTranslucencyMode), CustomShaderPipelineStage = { + name: "CustomShaderPipelineStage", + // Helps with debugging + STRUCT_ID_ATTRIBUTES_VS: "AttributesVS", + STRUCT_ID_ATTRIBUTES_FS: "AttributesFS", + STRUCT_NAME_ATTRIBUTES: "Attributes", + STRUCT_ID_VERTEX_INPUT: "VertexInput", + STRUCT_NAME_VERTEX_INPUT: "VertexInput", + STRUCT_ID_FRAGMENT_INPUT: "FragmentInput", + STRUCT_NAME_FRAGMENT_INPUT: "FragmentInput", + FUNCTION_ID_INITIALIZE_INPUT_STRUCT_VS: "initializeInputStructVS", + FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_VS: "void initializeInputStruct(out VertexInput vsInput, ProcessedAttributes attributes)", + FUNCTION_ID_INITIALIZE_INPUT_STRUCT_FS: "initializeInputStructFS", + FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_FS: "void initializeInputStruct(out FragmentInput fsInput, ProcessedAttributes attributes)", + // Expose method for testing. + _oneTimeWarning: oneTimeWarning +}; +CustomShaderPipelineStage.process = function(e, t, n) { + const { shaderBuilder: i, model: r, alphaOptions: o } = e, { customShader: s } = r, { lightingModel: c, translucencyMode: l } = s; + defined(c) && (e.lightingOptions.lightingModel = c), l === CustomShaderTranslucencyMode$1.TRANSLUCENT ? o.pass = Pass$1.TRANSLUCENT : l === CustomShaderTranslucencyMode$1.OPAQUE && (o.pass = void 0); + const d = generateShaderLines(s, t); + if (!d.customShaderEnabled) + return; + if (addLinesToShader(i, s, d), d.shouldComputePositionWC && i.addDefine( + "COMPUTE_POSITION_WC_CUSTOM_SHADER", + void 0, + ShaderDestination$1.BOTH + ), defined(s.vertexShaderText) && i.addDefine( + "HAS_CUSTOM_VERTEX_SHADER", + void 0, + ShaderDestination$1.VERTEX + ), defined(s.fragmentShaderText)) { + i.addDefine( + "HAS_CUSTOM_FRAGMENT_SHADER", + void 0, + ShaderDestination$1.FRAGMENT + ); + const p = CustomShaderMode$1.getDefineName(s.mode); + i.addDefine( + p, + void 0, + ShaderDestination$1.FRAGMENT + ); + } + const f = s.uniforms; + for (const p in f) + if (f.hasOwnProperty(p)) { + const m = f[p]; + i.addUniform(m.type, p); + } + const h = s.varyings; + for (const p in h) + if (h.hasOwnProperty(p)) { + const m = h[p]; + i.addVarying(m, p); + } + e.uniformMap = combine$2( + e.uniformMap, + s.uniformMap + ); +}; +function getAttributesByName(e) { + const t = {}; + for (let n = 0; n < e.length; n++) { + const i = ModelUtility.getAttributeInfo(e[n]); + t[i.variableName] = i; + } + return t; +} +const attributeTypeLUT = { + position: "vec3", + normal: "vec3", + tangent: "vec3", + bitangent: "vec3", + texCoord: "vec2", + color: "vec4", + joints: "ivec4", + weights: "vec4" +}, attributeDefaultValueLUT = { + position: "vec3(0.0)", + normal: "vec3(0.0, 0.0, 1.0)", + tangent: "vec3(1.0, 0.0, 0.0)", + bitangent: "vec3(0.0, 1.0, 0.0)", + texCoord: "vec2(0.0)", + color: "vec4(1.0)", + joints: "ivec4(0)", + weights: "vec4(0.0)" +}; +function inferAttributeDefaults(e) { + let t = e.replace(/_[0-9]+$/, ""); + t = t.replace(/(MC|EC)$/, ""); + const n = attributeTypeLUT[t], i = attributeDefaultValueLUT[t]; + if (defined(n)) + return { + attributeField: [n, e], + value: i + }; +} +function generateVertexShaderLines(e, t) { + if (!defined(e.vertexShaderText)) + return { enabled: !1 }; + const n = e.usedVariablesVertex.attributeSet, i = getPrimitiveAttributesUsedInShader( + t, + n, + !1 + ), r = getAttributesNeedingDefaults( + t, + n, + !1 + ); + let o; + const s = [], c = []; + for (const l in i) { + if (!i.hasOwnProperty(l)) + continue; + const f = [i[l].glslType, l]; + s.push(f), o = `vsInput.attributes.${l} = attributes.${l};`, c.push(o); + } + for (let l = 0; l < r.length; l++) { + const d = r[l], f = inferAttributeDefaults(d); + if (!defined(f)) + return CustomShaderPipelineStage._oneTimeWarning( + "CustomShaderPipelineStage.incompatiblePrimitiveVS", + `Primitive is missing attribute ${d}, disabling custom vertex shader` + ), { enabled: !1 }; + s.push(f.attributeField), o = `vsInput.attributes.${d} = ${f.value};`, c.push(o); + } + return { + enabled: !0, + attributeFields: s, + initializationLines: c + }; +} +function generatePositionBuiltins(e) { + const t = [], n = [], i = e.usedVariablesFragment.attributeSet; + return i.hasOwnProperty("positionWC") && (t.push(["vec3", "positionWC"]), n.push( + "fsInput.attributes.positionWC = attributes.positionWC;" + )), i.hasOwnProperty("positionEC") && (t.push(["vec3", "positionEC"]), n.push( + "fsInput.attributes.positionEC = attributes.positionEC;" + )), { + attributeFields: t, + initializationLines: n + }; +} +function generateFragmentShaderLines(e, t) { + if (!defined(e.fragmentShaderText)) + return { enabled: !1 }; + const n = e.usedVariablesFragment.attributeSet, i = getPrimitiveAttributesUsedInShader( + t, + n, + !0 + ), r = getAttributesNeedingDefaults( + t, + n, + !0 + ); + let o; + const s = [], c = []; + for (const d in i) { + if (!i.hasOwnProperty(d)) + continue; + const h = [i[d].glslType, d]; + s.push(h), o = `fsInput.attributes.${d} = attributes.${d};`, c.push(o); + } + for (let d = 0; d < r.length; d++) { + const f = r[d], h = inferAttributeDefaults(f); + if (!defined(h)) + return CustomShaderPipelineStage._oneTimeWarning( + "CustomShaderPipelineStage.incompatiblePrimitiveFS", + `Primitive is missing attribute ${f}, disabling custom fragment shader.` + ), { enabled: !1 }; + s.push(h.attributeField), o = `fsInput.attributes.${f} = ${h.value};`, c.push(o); + } + const l = generatePositionBuiltins(e); + return { + enabled: !0, + attributeFields: s.concat(l.attributeFields), + initializationLines: l.initializationLines.concat( + c + ) + }; +} +const builtinAttributes = { + positionWC: !0, + positionEC: !0 +}; +function getPrimitiveAttributesUsedInShader(e, t, n) { + const i = {}; + for (const r in e) { + if (!e.hasOwnProperty(r)) + continue; + const o = e[r]; + let s = r; + n && r === "normalMC" ? s = "normalEC" : n && r === "tangentMC" && (s = "tangentEC", o.glslType = "vec3"), t.hasOwnProperty(s) && (i[s] = o); + } + return i; +} +function getAttributesNeedingDefaults(e, t, n) { + const i = []; + for (const r in t) { + if (!t.hasOwnProperty(r) || builtinAttributes.hasOwnProperty(r)) + continue; + let o = r; + n && r === "normalEC" ? o = "normalMC" : n && r === "tangentEC" && (o = "tangentMC"), e.hasOwnProperty(o) || i.push(r); + } + return i; +} +function generateShaderLines(e, t) { + const n = getAttributesByName(t.attributes), i = generateVertexShaderLines(e, n), r = generateFragmentShaderLines( + e, + n + ), s = e.usedVariablesFragment.attributeSet.hasOwnProperty("positionWC") && r.enabled; + return { + vertexLines: i, + fragmentLines: r, + customShaderEnabled: i.enabled || r.enabled, + shouldComputePositionWC: s + }; +} +function addVertexLinesToShader(e, t) { + let n = CustomShaderPipelineStage.STRUCT_ID_ATTRIBUTES_VS; + e.addStruct( + n, + CustomShaderPipelineStage.STRUCT_NAME_ATTRIBUTES, + ShaderDestination$1.VERTEX + ); + const { attributeFields: i, initializationLines: r } = t; + for (let s = 0; s < i.length; s++) { + const [c, l] = i[s]; + e.addStructField(n, c, l); + } + n = CustomShaderPipelineStage.STRUCT_ID_VERTEX_INPUT, e.addStruct( + n, + CustomShaderPipelineStage.STRUCT_NAME_VERTEX_INPUT, + ShaderDestination$1.VERTEX + ), e.addStructField( + n, + CustomShaderPipelineStage.STRUCT_NAME_ATTRIBUTES, + "attributes" + ), e.addStructField( + n, + FeatureIdPipelineStage.STRUCT_NAME_FEATURE_IDS, + "featureIds" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA, + "metadata" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA_CLASS, + "metadataClass" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA_STATISTICS, + "metadataStatistics" + ); + const o = CustomShaderPipelineStage.FUNCTION_ID_INITIALIZE_INPUT_STRUCT_VS; + e.addFunction( + o, + CustomShaderPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_VS, + ShaderDestination$1.VERTEX + ), e.addFunctionLines(o, r); +} +function addFragmentLinesToShader(e, t) { + let n = CustomShaderPipelineStage.STRUCT_ID_ATTRIBUTES_FS; + e.addStruct( + n, + CustomShaderPipelineStage.STRUCT_NAME_ATTRIBUTES, + ShaderDestination$1.FRAGMENT + ); + const { attributeFields: i, initializationLines: r } = t; + for (let s = 0; s < i.length; s++) { + const [c, l] = i[s]; + e.addStructField(n, c, l); + } + n = CustomShaderPipelineStage.STRUCT_ID_FRAGMENT_INPUT, e.addStruct( + n, + CustomShaderPipelineStage.STRUCT_NAME_FRAGMENT_INPUT, + ShaderDestination$1.FRAGMENT + ), e.addStructField( + n, + CustomShaderPipelineStage.STRUCT_NAME_ATTRIBUTES, + "attributes" + ), e.addStructField( + n, + FeatureIdPipelineStage.STRUCT_NAME_FEATURE_IDS, + "featureIds" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA, + "metadata" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA_CLASS, + "metadataClass" + ), e.addStructField( + n, + MetadataPipelineStage.STRUCT_NAME_METADATA_STATISTICS, + "metadataStatistics" + ); + const o = CustomShaderPipelineStage.FUNCTION_ID_INITIALIZE_INPUT_STRUCT_FS; + e.addFunction( + o, + CustomShaderPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_FS, + ShaderDestination$1.FRAGMENT + ), e.addFunctionLines(o, r); +} +const scratchShaderLines = []; +function addLinesToShader(e, t, n) { + const { vertexLines: i, fragmentLines: r } = n, o = scratchShaderLines; + i.enabled && (addVertexLinesToShader(e, i), o.length = 0, o.push( + "#line 0", + t.vertexShaderText, + CustomShaderStageVS + ), e.addVertexLines(o)), r.enabled && (addFragmentLinesToShader(e, r), o.length = 0, o.push( + "#line 0", + t.fragmentShaderText, + CustomShaderStageFS + ), e.addFragmentLines(o)); +} +const DequantizationPipelineStage = { + name: "DequantizationPipelineStage", + // Helps with debugging + FUNCTION_ID_DEQUANTIZATION_STAGE_VS: "dequantizationStage", + FUNCTION_SIGNATURE_DEQUANTIZATION_STAGE_VS: "void dequantizationStage(inout ProcessedAttributes attributes)" +}; +DequantizationPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder, r = e.model, o = defined(r.classificationType); + i.addDefine( + "USE_DEQUANTIZATION", + void 0, + ShaderDestination$1.VERTEX + ), i.addFunction( + DequantizationPipelineStage.FUNCTION_ID_DEQUANTIZATION_STAGE_VS, + DequantizationPipelineStage.FUNCTION_SIGNATURE_DEQUANTIZATION_STAGE_VS, + ShaderDestination$1.VERTEX + ); + const s = t.attributes; + for (let c = 0; c < s.length; c++) { + const l = s[c], d = l.quantization; + if (!defined(d)) + continue; + const f = l.semantic === VertexAttributeSemantic$1.POSITION, h = l.semantic === VertexAttributeSemantic$1.TEXCOORD; + if (o && !f && !h) + continue; + const p = ModelUtility.getAttributeInfo(l); + updateDequantizationFunction(i, p), addDequantizationUniforms(e, p); + } +}; +function addDequantizationUniforms(e, t) { + const n = e.shaderBuilder, i = e.uniformMap, r = t.variableName, o = t.attribute.quantization; + if (o.octEncoded) { + const s = `model_normalizationRange_${r}`; + n.addUniform( + "float", + s, + ShaderDestination$1.VERTEX + ), i[s] = function() { + return o.normalizationRange; + }; + } else { + const s = `model_quantizedVolumeOffset_${r}`, c = `model_quantizedVolumeStepSize_${r}`, l = t.glslType; + n.addUniform(l, s, ShaderDestination$1.VERTEX), n.addUniform(l, c, ShaderDestination$1.VERTEX); + let d = o.quantizedVolumeOffset, f = o.quantizedVolumeStepSize; + /^color_\d+$/.test(r) && (d = promoteToVec4(d, 0), f = promoteToVec4(f, 1)), i[s] = function() { + return d; + }, i[c] = function() { + return f; + }; + } +} +function promoteToVec4(e, t) { + return e instanceof Cartesian4 ? e : new Cartesian4(e.x, e.y, e.z, t); +} +function updateDequantizationFunction(e, t) { + const n = t.variableName, i = t.attribute.quantization; + let r; + i.octEncoded ? r = generateOctDecodeLine(n, i) : r = generateDequantizeLine(n), e.addFunctionLines( + DequantizationPipelineStage.FUNCTION_ID_DEQUANTIZATION_STAGE_VS, + [r] + ); +} +function generateOctDecodeLine(e, t) { + const n = `attributes.${e}`, i = `a_quantized_${e}`, r = `model_normalizationRange_${e}`, o = t.octEncodedZXY ? ".zxy" : ".xyz"; + return `${n} = czm_octDecode(${i}, ${r})${o};`; +} +function generateDequantizeLine(e) { + const t = `attributes.${e}`, n = `a_quantized_${e}`, i = `model_quantizedVolumeOffset_${e}`, r = `model_quantizedVolumeStepSize_${e}`; + return `${t} = ${i} + ${n} * ${r};`; +} +const GeometryStageFS = `void geometryStage(out ProcessedAttributes attributes) +{ + attributes.positionMC = v_positionMC; + attributes.positionEC = v_positionEC; + + #if defined(COMPUTE_POSITION_WC_CUSTOM_SHADER) || defined(COMPUTE_POSITION_WC_STYLE) || defined(COMPUTE_POSITION_WC_ATMOSPHERE) + attributes.positionWC = v_positionWC; + #endif + + #ifdef HAS_NORMALS + // renormalize after interpolation + attributes.normalEC = normalize(v_normalEC); + #endif + + #ifdef HAS_TANGENTS + attributes.tangentEC = normalize(v_tangentEC); + #endif + + #ifdef HAS_BITANGENTS + attributes.bitangentEC = normalize(v_bitangentEC); + #endif + + // Everything else is dynamically generated in GeometryPipelineStage + setDynamicVaryings(attributes); +} +`, GeometryStageVS = `vec4 geometryStage(inout ProcessedAttributes attributes, mat4 modelView, mat3 normal) +{ + vec4 computedPosition; + + // Compute positions in different coordinate systems + vec3 positionMC = attributes.positionMC; + v_positionMC = positionMC; + v_positionEC = (modelView * vec4(positionMC, 1.0)).xyz; + + #if defined(USE_2D_POSITIONS) || defined(USE_2D_INSTANCING) + vec3 position2D = attributes.position2D; + vec3 positionEC = (u_modelView2D * vec4(position2D, 1.0)).xyz; + computedPosition = czm_projection * vec4(positionEC, 1.0); + #else + computedPosition = czm_projection * vec4(v_positionEC, 1.0); + #endif + + // Sometimes the custom shader and/or style needs this + #if defined(COMPUTE_POSITION_WC_CUSTOM_SHADER) || defined(COMPUTE_POSITION_WC_STYLE) || defined(COMPUTE_POSITION_WC_ATMOSPHERE) || defined(ENABLE_CLIPPING_POLYGONS) + // Note that this is a 32-bit position which may result in jitter on small + // scales. + v_positionWC = (czm_model * vec4(positionMC, 1.0)).xyz; + #endif + + #ifdef HAS_NORMALS + v_normalEC = normalize(normal * attributes.normalMC); + #endif + + #ifdef HAS_TANGENTS + v_tangentEC = normalize(normal * attributes.tangentMC); + #endif + + #ifdef HAS_BITANGENTS + v_bitangentEC = normalize(normal * attributes.bitangentMC); + #endif + + // All other varyings need to be dynamically generated in + // GeometryPipelineStage + setDynamicVaryings(attributes); + + return computedPosition; +} +`, SelectedFeatureIdStageCommon = `vec2 computeSt(float featureId) +{ + float stepX = model_textureStep.x; + float centerX = model_textureStep.y; + + #ifdef MULTILINE_BATCH_TEXTURE + float stepY = model_textureStep.z; + float centerY = model_textureStep.w; + + float xId = mod(featureId, model_textureDimensions.x); + float yId = floor(featureId / model_textureDimensions.x); + + return vec2(centerX + (xId * stepX), centerY + (yId * stepY)); + #else + return vec2(centerX + (featureId * stepX), 0.5); + #endif +} + +void selectedFeatureIdStage(out SelectedFeature feature, FeatureIds featureIds) +{ + int featureId = featureIds.SELECTED_FEATURE_ID; + + + if (featureId < model_featuresLength) + { + vec2 featureSt = computeSt(float(featureId)); + + feature.id = featureId; + feature.st = featureSt; + feature.color = texture(model_batchTexture, featureSt); + } + // Floating point comparisons can be unreliable in GLSL, so we + // increment the feature ID to make sure it's always greater + // then the model_featuresLength - a condition we check for in the + // pick ID, to avoid sampling the pick texture if the feature ID is + // greater than the number of features. + else + { + feature.id = model_featuresLength + 1; + feature.st = vec2(0.0); + feature.color = vec4(1.0); + } + + #ifdef HAS_NULL_FEATURE_ID + if (featureId == model_nullFeatureId) { + feature.id = featureId; + feature.st = vec2(0.0); + feature.color = vec4(1.0); + } + #endif +} +`, SelectedFeatureIdPipelineStage = { + name: "SelectedFeatureIdPipelineStage", + // Helps with debugging + STRUCT_ID_SELECTED_FEATURE: "SelectedFeature", + STRUCT_NAME_SELECTED_FEATURE: "SelectedFeature", + FUNCTION_ID_FEATURE_VARYINGS_VS: "updateFeatureStructVS", + FUNCTION_ID_FEATURE_VARYINGS_FS: "updateFeatureStructFS", + FUNCTION_SIGNATURE_UPDATE_FEATURE: "void updateFeatureStruct(inout SelectedFeature feature)" +}; +SelectedFeatureIdPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder; + e.hasPropertyTable = !0; + const r = e.model, o = e.runtimeNode.node, s = getSelectedFeatureIds(r, o, t), c = s.shaderDestination; + i.addDefine( + "HAS_SELECTED_FEATURE_ID", + void 0, + c + ), i.addDefine( + "SELECTED_FEATURE_ID", + s.variableName, + c + ), i.addDefine( + s.featureIdDefine, + void 0, + c + ), updateFeatureStruct(i); + const l = s.featureIds.nullFeatureId, d = e.uniformMap; + defined(l) && (i.addDefine( + "HAS_NULL_FEATURE_ID", + void 0, + c + ), i.addUniform("int", "model_nullFeatureId", c), d.model_nullFeatureId = function() { + return l; + }), s.shaderDestination === ShaderDestination$1.BOTH && i.addVertexLines(SelectedFeatureIdStageCommon), i.addFragmentLines(SelectedFeatureIdStageCommon); +}; +function getFeatureIdDefine(e) { + return e instanceof ModelComponents.FeatureIdTexture ? "HAS_SELECTED_FEATURE_ID_TEXTURE" : "HAS_SELECTED_FEATURE_ID_ATTRIBUTE"; +} +function getShaderDestination(e) { + return e instanceof ModelComponents.FeatureIdTexture ? ShaderDestination$1.FRAGMENT : ShaderDestination$1.BOTH; +} +function getSelectedFeatureIds(e, t, n) { + let i, r; + return defined(t.instances) && (r = ModelUtility.getFeatureIdsByLabel( + t.instances.featureIds, + e.instanceFeatureIdLabel + ), defined(r)) ? (i = defaultValue(r.label, r.positionalLabel), { + featureIds: r, + variableName: i, + shaderDestination: getShaderDestination(r), + featureIdDefine: getFeatureIdDefine(r) + }) : (r = ModelUtility.getFeatureIdsByLabel( + n.featureIds, + e.featureIdLabel + ), i = defaultValue(r.label, r.positionalLabel), { + featureIds: r, + variableName: i, + shaderDestination: getShaderDestination(r), + featureIdDefine: getFeatureIdDefine(r) + }); +} +function updateFeatureStruct(e) { + e.addStructField( + SelectedFeatureIdPipelineStage.STRUCT_ID_SELECTED_FEATURE, + "int", + "id" + ), e.addStructField( + SelectedFeatureIdPipelineStage.STRUCT_ID_SELECTED_FEATURE, + "vec2", + "st" + ), e.addStructField( + SelectedFeatureIdPipelineStage.STRUCT_ID_SELECTED_FEATURE, + "vec4", + "color" + ); +} +const GeometryPipelineStage = { + name: "GeometryPipelineStage", + // Helps with debugging + STRUCT_ID_PROCESSED_ATTRIBUTES_VS: "ProcessedAttributesVS", + STRUCT_ID_PROCESSED_ATTRIBUTES_FS: "ProcessedAttributesFS", + STRUCT_NAME_PROCESSED_ATTRIBUTES: "ProcessedAttributes", + FUNCTION_ID_INITIALIZE_ATTRIBUTES: "initializeAttributes", + FUNCTION_SIGNATURE_INITIALIZE_ATTRIBUTES: "void initializeAttributes(out ProcessedAttributes attributes)", + FUNCTION_ID_SET_DYNAMIC_VARYINGS_VS: "setDynamicVaryingsVS", + FUNCTION_ID_SET_DYNAMIC_VARYINGS_FS: "setDynamicVaryingsFS", + FUNCTION_SIGNATURE_SET_DYNAMIC_VARYINGS: "void setDynamicVaryings(inout ProcessedAttributes attributes)" +}; +GeometryPipelineStage.process = function(e, t, n) { + const { shaderBuilder: i, model: r } = e; + i.addStruct( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_VS, + "ProcessedAttributes", + ShaderDestination$1.VERTEX + ), i.addStruct( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_FS, + "ProcessedAttributes", + ShaderDestination$1.FRAGMENT + ), i.addStruct( + SelectedFeatureIdPipelineStage.STRUCT_ID_SELECTED_FEATURE, + SelectedFeatureIdPipelineStage.STRUCT_NAME_SELECTED_FEATURE, + ShaderDestination$1.BOTH + ), i.addFunction( + GeometryPipelineStage.FUNCTION_ID_INITIALIZE_ATTRIBUTES, + GeometryPipelineStage.FUNCTION_SIGNATURE_INITIALIZE_ATTRIBUTES, + ShaderDestination$1.VERTEX + ), i.addVarying("vec3", "v_positionWC"), i.addVarying("vec3", "v_positionEC"), i.addStructField( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_FS, + "vec3", + "positionWC" + ), i.addStructField( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_FS, + "vec3", + "positionEC" + ), i.addFunction( + GeometryPipelineStage.FUNCTION_ID_SET_DYNAMIC_VARYINGS_VS, + GeometryPipelineStage.FUNCTION_SIGNATURE_SET_DYNAMIC_VARYINGS, + ShaderDestination$1.VERTEX + ), i.addFunction( + GeometryPipelineStage.FUNCTION_ID_SET_DYNAMIC_VARYINGS_FS, + GeometryPipelineStage.FUNCTION_SIGNATURE_SET_DYNAMIC_VARYINGS, + ShaderDestination$1.FRAGMENT + ), r.type === ModelType$1.TILE_PNTS && i.addDefine( + "HAS_SRGB_COLOR", + void 0, + ShaderDestination$1.FRAGMENT + ), r.type !== ModelType$1.TILE_PNTS && r.useSRGBVertexColors && i.addDefine( + "USE_VCS_SRGB_VERTEX_COLORS", + void 0, + ShaderDestination$1.FRAGMENT + ), r.type !== ModelType$1.TILE_PNTS && r.useSRGBColorFactors && i.addDefine( + "USE_VCS_SRGB_COLOR_FACTORS", + void 0, + ShaderDestination$1.FRAGMENT + ); + const o = n.mode !== SceneMode$1.SCENE3D && !n.scene3DOnly && r._projectTo2D, s = defined(e.runtimeNode.node.instances), c = o && !s, l = t.attributes.length; + for (let d = 0; d < l; d++) { + const f = t.attributes[d], h = AttributeType$1.getAttributeLocationCount( + f.type + ), p = f.semantic === VertexAttributeSemantic$1.POSITION; + let m; + h > 1 ? (m = e.attributeIndex, e.attributeIndex += h) : p && !c ? m = 0 : m = e.attributeIndex++, processAttribute( + e, + f, + m, + h, + o, + s + ); + } + handleBitangents(i, t.attributes), t.primitiveType === PrimitiveType$1.POINTS && i.addDefine("PRIMITIVE_TYPE_POINTS"), i.addVertexLines(GeometryStageVS), i.addFragmentLines(GeometryStageFS); +}; +function processAttribute(e, t, n, i, r, o) { + const s = e.shaderBuilder, c = ModelUtility.getAttributeInfo(t), l = r && !o; + i > 1 ? addMatrixAttributeToRenderResources( + e, + t, + n, + i + ) : addAttributeToRenderResources( + e, + t, + n, + l + ), addAttributeDeclaration(s, c, l), addVaryingDeclaration(s, c), defined(t.semantic) && addSemanticDefine(s, t), updateAttributesStruct(s, c, r), updateInitializeAttributesFunction(s, c, l), updateSetDynamicVaryingsFunction(s, c); +} +function addSemanticDefine(e, t) { + const { semantic: n, setIndex: i } = t; + switch (n) { + case VertexAttributeSemantic$1.NORMAL: + e.addDefine("HAS_NORMALS"); + break; + case VertexAttributeSemantic$1.TANGENT: + e.addDefine("HAS_TANGENTS"); + break; + case VertexAttributeSemantic$1.FEATURE_ID: + e.addDefine(`HAS${n}_${i}`); + break; + case VertexAttributeSemantic$1.TEXCOORD: + case VertexAttributeSemantic$1.COLOR: + e.addDefine(`HAS_${n}_${i}`); + } +} +function addAttributeToRenderResources(e, t, n, i) { + const { quantization: r, semantic: o, setIndex: s } = t, { type: c, componentDatatype: l } = defined(r) ? r : t; + o === VertexAttributeSemantic$1.FEATURE_ID && s >= e.featureIdVertexAttributeSetIndex && (e.featureIdVertexAttributeSetIndex = s + 1); + const d = o === VertexAttributeSemantic$1.POSITION, f = d ? 0 : n, h = AttributeType$1.getNumberOfComponents(c), p = { + index: f, + value: defined(t.buffer) ? void 0 : t.constant, + vertexBuffer: t.buffer, + count: t.count, + componentsPerAttribute: h, + componentDatatype: l, + offsetInBytes: t.byteOffset, + strideInBytes: t.byteStride, + normalize: t.normalized + }; + if (e.attributes.push(p), !d || !i) + return; + const m = e.runtimePrimitive.positionBuffer2D, _ = { + index: n, + vertexBuffer: m, + count: t.count, + componentsPerAttribute: h, + componentDatatype: ComponentDatatype$1.FLOAT, + // Projected positions will always be floats. + offsetInBytes: 0, + strideInBytes: void 0, + normalize: t.normalized + }; + e.attributes.push(_); +} +function addMatrixAttributeToRenderResources(e, t, n, i) { + const { quantization: r, normalized: o } = t, { type: s, componentDatatype: c } = defined(r) ? r : t, d = AttributeType$1.getNumberOfComponents(s) / i, f = ComponentDatatype$1.getSizeInBytes( + c + ), h = d * f, p = t.byteStride; + for (let m = 0; m < i; m++) { + const _ = t.byteOffset + m * h, y = { + index: n + m, + vertexBuffer: t.buffer, + componentsPerAttribute: d, + componentDatatype: c, + offsetInBytes: _, + strideInBytes: p, + normalize: o + }; + e.attributes.push(y); + } +} +function addVaryingDeclaration(e, t) { + const n = t.variableName; + let i = `v_${n}`, r; + n === "normalMC" ? (i = "v_normalEC", r = t.glslType) : n === "tangentMC" ? (r = "vec3", i = "v_tangentEC") : r = t.glslType, e.addVarying(r, i); +} +function addAttributeDeclaration(e, t, n) { + const i = t.attribute.semantic, r = t.variableName; + let o, s; + t.isQuantized ? (o = `a_quantized_${r}`, s = t.quantizedGlslType) : (o = `a_${r}`, s = t.glslType); + const c = i === VertexAttributeSemantic$1.POSITION; + c ? e.setPositionAttribute(s, o) : e.addAttribute(s, o), c && n && e.addAttribute("vec3", "a_position2D"); +} +function updateAttributesStruct(e, t, n) { + const i = GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_VS, r = GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_FS, { variableName: o, glslType: s } = t; + o === "tangentMC" ? (e.addStructField(i, "vec3", "tangentMC"), e.addStructField(i, "float", "tangentSignMC"), e.addStructField(r, "vec3", "tangentEC")) : o === "normalMC" ? (e.addStructField(i, "vec3", "normalMC"), e.addStructField(r, "vec3", "normalEC")) : (e.addStructField(i, s, o), e.addStructField(r, s, o)), o === "positionMC" && n && e.addStructField(i, "vec3", "position2D"); +} +function updateInitializeAttributesFunction(e, t, n) { + const i = GeometryPipelineStage.FUNCTION_ID_INITIALIZE_ATTRIBUTES, r = t.variableName; + if (r === "positionMC" && n && e.addFunctionLines(i, ["attributes.position2D = a_position2D;"]), t.isQuantized) + return; + const s = []; + r === "tangentMC" ? (s.push("attributes.tangentMC = a_tangentMC.xyz;"), s.push("attributes.tangentSignMC = a_tangentMC.w;")) : s.push(`attributes.${r} = a_${r};`), e.addFunctionLines(i, s); +} +function updateSetDynamicVaryingsFunction(e, t) { + const { semantic: n, setIndex: i } = t.attribute; + if (defined(n) && !defined(i)) + return; + let r = GeometryPipelineStage.FUNCTION_ID_SET_DYNAMIC_VARYINGS_VS; + const o = t.variableName; + let s = `v_${o} = attributes.${o};`; + e.addFunctionLines(r, [s]), r = GeometryPipelineStage.FUNCTION_ID_SET_DYNAMIC_VARYINGS_FS, s = `attributes.${o} = v_${o};`, e.addFunctionLines(r, [s]); +} +function handleBitangents(e, t) { + let n = !1, i = !1; + for (let r = 0; r < t.length; r++) { + const o = t[r]; + o.semantic === VertexAttributeSemantic$1.NORMAL ? n = !0 : o.semantic === VertexAttributeSemantic$1.TANGENT && (i = !0); + } + !n || !i || (e.addDefine("HAS_BITANGENTS"), e.addVarying("vec3", "v_bitangentEC"), e.addStructField( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_VS, + "vec3", + "bitangentMC" + ), e.addStructField( + GeometryPipelineStage.STRUCT_ID_PROCESSED_ATTRIBUTES_FS, + "vec3", + "bitangentEC" + )); +} +const LightingStageFS = `#ifdef USE_IBL_LIGHTING +vec3 computeIBL(vec3 position, vec3 normal, vec3 lightDirection, vec3 lightColorHdr, czm_modelMaterial material) +{ + #if defined(DIFFUSE_IBL) || defined(SPECULAR_IBL) + // Environment maps were provided, use them for IBL + vec3 viewDirection = -normalize(position); + vec3 iblColor = textureIBL(viewDirection, normal, material); + #else + // Use procedural IBL if there are no environment maps + vec3 imageBasedLighting = proceduralIBL(position, normal, lightDirection, material); + float maximumComponent = czm_maximumComponent(lightColorHdr); + vec3 clampedLightColor = lightColorHdr / max(maximumComponent, 1.0); + vec3 iblColor = clampedLightColor * imageBasedLighting; + #endif + return iblColor * material.occlusion; +} +#endif + +#ifdef USE_CLEARCOAT +vec3 addClearcoatReflection(vec3 baseLayerColor, vec3 position, vec3 lightDirection, vec3 lightColorHdr, czm_modelMaterial material) +{ + vec3 viewDirection = -normalize(position); + vec3 halfwayDirection = normalize(viewDirection + lightDirection); + vec3 normal = material.clearcoatNormal; + float NdotL = clamp(dot(normal, lightDirection), 0.001, 1.0); + + // clearcoatF0 = vec3(pow((ior - 1.0) / (ior + 1.0), 2.0)), but without KHR_materials_ior, ior is a constant 1.5. + vec3 f0 = vec3(0.04); + vec3 f90 = vec3(1.0); + // Note: clearcoat Fresnel computed with dot(n, v) instead of dot(v, h). + // This is to make it energy conserving with a simple layering function. + float NdotV = clamp(dot(normal, viewDirection), 0.0, 1.0); + vec3 F = fresnelSchlick2(f0, f90, NdotV); + + // compute specular reflection from direct lighting + float roughness = material.clearcoatRoughness; + float alphaRoughness = roughness * roughness; + float directStrength = computeDirectSpecularStrength(normal, lightDirection, viewDirection, halfwayDirection, alphaRoughness); + vec3 directReflection = F * directStrength * NdotL; + vec3 color = lightColorHdr * directReflection; + + #ifdef SPECULAR_IBL + // Find the direction in which to sample the environment map + vec3 reflectMC = normalize(model_iblReferenceFrameMatrix * reflect(-viewDirection, normal)); + vec3 iblColor = computeSpecularIBL(reflectMC, NdotV, f0, roughness); + color += iblColor * material.occlusion; + #elif defined(USE_IBL_LIGHTING) + vec3 positionWC = vec3(czm_inverseView * vec4(position, 1.0)); + vec3 reflectionWC = normalize(czm_inverseViewRotation * reflect(viewDirection, normal)); + vec3 skyMetrics = getProceduralSkyMetrics(positionWC, reflectionWC); + + vec3 specularIrradiance = getProceduralSpecularIrradiance(reflectionWC, skyMetrics, roughness); + vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; + vec3 specularColor = czm_srgbToLinear(f0 * brdfLut.x + brdfLut.y); + vec3 iblColor = specularIrradiance * specularColor * model_iblFactor.y; + #ifdef USE_SUN_LUMINANCE + iblColor *= getSunLuminance(positionWC, normal, lightDirection); + #endif + float maximumComponent = czm_maximumComponent(lightColorHdr); + vec3 clampedLightColor = lightColorHdr / max(maximumComponent, 1.0); + color += clampedLightColor * iblColor * material.occlusion; + #endif + + float clearcoatFactor = material.clearcoatFactor; + vec3 clearcoatColor = color * clearcoatFactor; + + // Dim base layer based on transmission loss through clearcoat + return baseLayerColor * (1.0 - clearcoatFactor * F) + clearcoatColor; +} +#endif + +#if defined(LIGHTING_PBR) && defined(HAS_NORMALS) +vec3 computePbrLighting(in czm_modelMaterial material, in vec3 position) +{ + #ifdef USE_CUSTOM_LIGHT_COLOR + vec3 lightColorHdr = model_lightColorHdr; + #else + vec3 lightColorHdr = czm_lightColorHdr; + #endif + + vec3 viewDirection = -normalize(position); + vec3 normal = material.normalEC; + vec3 lightDirection = normalize(czm_lightDirectionEC); + + vec3 directColor = czm_pbrLighting(position, viewDirection, normal, lightDirection, material); + + // Accumulate colors from base layer + vec3 color = directColor + material.emissive; + #ifndef USE_VCS_CUSTOM_SHADING + #ifdef USE_IBL_LIGHTING + color += computeIBL(position, normal, lightDirection, lightColorHdr, material); + #endif + #endif + + #ifdef USE_CLEARCOAT + color = addClearcoatReflection(color, position, lightDirection, lightColorHdr, material); + #endif + + return color; +} +#endif + +/** + * Compute the material color under the current lighting conditions. + * All other material properties are passed through so further stages + * have access to them. + * + * @param {czm_modelMaterial} material The material properties from {@MaterialStageFS} + * @param {ProcessedAttributes} attributes + */ +void lightingStage(inout czm_modelMaterial material, ProcessedAttributes attributes) +{ + #ifdef LIGHTING_PBR + #ifdef HAS_NORMALS + vec3 color = computePbrLighting(material, attributes.positionEC); + #else + vec3 color = material.diffuse * material.occlusion + material.emissive; + #endif + // In HDR mode, the frame buffer is in linear color space. The + // post-processing stages (see PostProcessStageCollection) will handle + // tonemapping. However, if HDR is not enabled, we must tonemap else large + // values may be clamped to 1.0 + #ifndef HDR + #ifndef USE_VCS_CUSTOM_SHADING + // Custom VCS Shading, if VCS Shading is activated we do not do toneMapping for models, + color = czm_pbrNeutralTonemapping(color); + #endif + #endif + #else // unlit + vec3 color = material.diffuse; + #endif + + #ifdef HAS_POINT_CLOUD_COLOR_STYLE + // The colors resulting from point cloud styles are adjusted differently. + color = czm_gammaCorrect(color); + #elif !defined(HDR) + // If HDR is not enabled, the frame buffer stores sRGB colors rather than + // linear colors so the linear value must be converted. + color = czm_linearToSrgb(color); + #endif + + material.diffuse = color; +} +`, LightingModel = { + /** + * Use unlit shading, i.e. skip lighting calculations. The model's + * diffuse color (assumed to be linear RGB, not sRGB) is used directly + * when computing out_FragColor. The alpha mode is still + * applied. + * + * @type {number} + * @constant + */ + UNLIT: 0, + /** + * Use physically-based rendering lighting calculations. This includes + * both PBR metallic roughness and PBR specular glossiness. Image-based + * lighting is also applied when possible. + * + * @type {number} + * @constant + */ + PBR: 1 +}, LightingModel$1 = Object.freeze(LightingModel), LightingPipelineStage = { + name: "LightingPipelineStage" + // Helps with debugging +}; +LightingPipelineStage.process = function(e, t) { + const { model: n, lightingOptions: i, shaderBuilder: r } = e; + if (defined(n.lightColor)) { + r.addDefine( + "USE_CUSTOM_LIGHT_COLOR", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addUniform( + "vec3", + "model_lightColorHdr", + ShaderDestination$1.FRAGMENT + ); + const s = e.uniformMap; + s.model_lightColorHdr = function() { + return n.lightColor; + }; + } + const { lightingModel: o } = i; + o === LightingModel$1.PBR ? (r.addDefine( + "LIGHTING_PBR", + void 0, + ShaderDestination$1.FRAGMENT + ), typeof globalThis < "u" && globalThis.useVcsCustomShading && r.addDefine( + "USE_VCS_CUSTOM_SHADING", + void 0, + ShaderDestination$1.FRAGMENT + )) : r.addDefine( + "LIGHTING_UNLIT", + void 0, + ShaderDestination$1.FRAGMENT + ), r.addFragmentLines(LightingStageFS); +}; +const MaterialStageFS = `// If the style color is white, it implies the feature has not been styled. +bool isDefaultStyleColor(vec3 color) +{ + return all(greaterThan(color, vec3(1.0 - czm_epsilon3))); +} + +vec3 blend(vec3 sourceColor, vec3 styleColor, float styleColorBlend) +{ + vec3 blendColor = mix(sourceColor, styleColor, styleColorBlend); + vec3 color = isDefaultStyleColor(styleColor.rgb) ? sourceColor : blendColor; + return color; +} + +vec2 computeTextureTransform(vec2 texCoord, mat3 textureTransform) +{ + return vec2(textureTransform * vec3(texCoord, 1.0)); +} + +#ifdef HAS_NORMAL_TEXTURE +vec2 getNormalTexCoords() +{ + vec2 texCoord = TEXCOORD_NORMAL; + #ifdef HAS_NORMAL_TEXTURE_TRANSFORM + texCoord = vec2(u_normalTextureTransform * vec3(texCoord, 1.0)); + #endif + return texCoord; +} +#endif + +#if defined(HAS_NORMAL_TEXTURE) || defined(HAS_CLEARCOAT_NORMAL_TEXTURE) +vec3 computeTangent(in vec3 position, in vec2 normalTexCoords) +{ + vec2 tex_dx = dFdx(normalTexCoords); + vec2 tex_dy = dFdy(normalTexCoords); + float determinant = tex_dx.x * tex_dy.y - tex_dy.x * tex_dx.y; + vec3 tangent = tex_dy.t * dFdx(position) - tex_dx.t * dFdy(position); + return tangent / determinant; +} +#endif + +#ifdef USE_ANISOTROPY +struct NormalInfo { + vec3 tangent; + vec3 bitangent; + vec3 normal; + vec3 geometryNormal; +}; + +NormalInfo getNormalInfo(ProcessedAttributes attributes) +{ + vec3 geometryNormal = attributes.normalEC; + #ifdef HAS_NORMAL_TEXTURE + vec2 normalTexCoords = getNormalTexCoords(); + #endif + + #ifdef HAS_BITANGENTS + vec3 tangent = attributes.tangentEC; + vec3 bitangent = attributes.bitangentEC; + #else // Assume HAS_NORMAL_TEXTURE + vec3 tangent = computeTangent(attributes.positionEC, normalTexCoords); + tangent = normalize(tangent - geometryNormal * dot(geometryNormal, tangent)); + vec3 bitangent = normalize(cross(geometryNormal, tangent)); + #endif + + #ifdef HAS_NORMAL_TEXTURE + mat3 tbn = mat3(tangent, bitangent, geometryNormal); + vec3 normalSample = texture(u_normalTexture, normalTexCoords).rgb; + normalSample = 2.0 * normalSample - 1.0; + #ifdef HAS_NORMAL_TEXTURE_SCALE + normalSample.xy *= u_normalTextureScale; + #endif + vec3 normal = normalize(tbn * normalSample); + #else + vec3 normal = geometryNormal; + #endif + + #ifdef HAS_DOUBLE_SIDED_MATERIAL + if (czm_backFacing()) { + tangent *= -1.0; + bitangent *= -1.0; + normal *= -1.0; + geometryNormal *= -1.0; + } + #endif + + NormalInfo normalInfo; + normalInfo.tangent = tangent; + normalInfo.bitangent = bitangent; + normalInfo.normal = normal; + normalInfo.geometryNormal = geometryNormal; + + return normalInfo; +} +#endif + +#if defined(HAS_NORMAL_TEXTURE) && !defined(HAS_WIREFRAME) +vec3 getNormalFromTexture(ProcessedAttributes attributes, vec3 geometryNormal) +{ + vec2 normalTexCoords = getNormalTexCoords(); + + // If HAS_BITANGENTS is set, then HAS_TANGENTS is also set + #ifdef HAS_BITANGENTS + vec3 t = attributes.tangentEC; + vec3 b = attributes.bitangentEC; + #else + vec3 t = computeTangent(attributes.positionEC, normalTexCoords); + t = normalize(t - geometryNormal * dot(geometryNormal, t)); + vec3 b = normalize(cross(geometryNormal, t)); + #endif + + mat3 tbn = mat3(t, b, geometryNormal); + vec3 normalSample = texture(u_normalTexture, normalTexCoords).rgb; + normalSample = 2.0 * normalSample - 1.0; + #ifdef HAS_NORMAL_TEXTURE_SCALE + normalSample.xy *= u_normalTextureScale; + #endif + return normalize(tbn * normalSample); +} +#endif + +#ifdef HAS_CLEARCOAT_NORMAL_TEXTURE +vec3 getClearcoatNormalFromTexture(ProcessedAttributes attributes, vec3 geometryNormal) +{ + vec2 normalTexCoords = TEXCOORD_CLEARCOAT_NORMAL; + #ifdef HAS_CLEARCOAT_NORMAL_TEXTURE_TRANSFORM + normalTexCoords = vec2(u_clearcoatNormalTextureTransform * vec3(normalTexCoords, 1.0)); + #endif + + // If HAS_BITANGENTS is set, then HAS_TANGENTS is also set + #ifdef HAS_BITANGENTS + vec3 t = attributes.tangentEC; + vec3 b = attributes.bitangentEC; + #else + vec3 t = computeTangent(attributes.positionEC, normalTexCoords); + t = normalize(t - geometryNormal * dot(geometryNormal, t)); + vec3 b = normalize(cross(geometryNormal, t)); + #endif + + mat3 tbn = mat3(t, b, geometryNormal); + vec3 normalSample = texture(u_clearcoatNormalTexture, normalTexCoords).rgb; + normalSample = 2.0 * normalSample - 1.0; + #ifdef HAS_CLEARCOAT_NORMAL_TEXTURE_SCALE + normalSample.xy *= u_clearcoatNormalTextureScale; + #endif + return normalize(tbn * normalSample); +} +#endif + +#ifdef HAS_NORMALS +vec3 computeNormal(ProcessedAttributes attributes) +{ + // Geometry normal. This is already normalized + vec3 normal = attributes.normalEC; + + #if defined(HAS_NORMAL_TEXTURE) && !defined(HAS_WIREFRAME) + normal = getNormalFromTexture(attributes, normal); + #endif + + #ifdef HAS_DOUBLE_SIDED_MATERIAL + if (czm_backFacing()) { + normal = -normal; + } + #endif + + return normal; +} +#endif + +#ifdef HAS_BASE_COLOR_TEXTURE +vec4 getBaseColorFromTexture() +{ + vec2 baseColorTexCoords = TEXCOORD_BASE_COLOR; + #ifdef HAS_BASE_COLOR_TEXTURE_TRANSFORM + baseColorTexCoords = computeTextureTransform(baseColorTexCoords, u_baseColorTextureTransform); + #endif + + vec4 baseColorWithAlpha = czm_srgbToLinear(texture(u_baseColorTexture, baseColorTexCoords)); + + #ifdef HAS_BASE_COLOR_FACTOR + // Custom VCS Color Handling, if VCS Shader is activated and the model has useSRGBColorFactors set we + // handle the baseColorFactor as SRGB values instead of linear color + #ifdef USE_VCS_SRGB_COLOR_FACTORS + baseColorWithAlpha *= czm_srgbToLinear(u_baseColorFactor); + #else + baseColorWithAlpha *= u_baseColorFactor; + #endif + #endif + + return baseColorWithAlpha; +} +#endif + +#ifdef HAS_EMISSIVE_TEXTURE +vec3 getEmissiveFromTexture() +{ + vec2 emissiveTexCoords = TEXCOORD_EMISSIVE; + #ifdef HAS_EMISSIVE_TEXTURE_TRANSFORM + emissiveTexCoords = computeTextureTransform(emissiveTexCoords, u_emissiveTextureTransform); + #endif + + vec3 emissive = czm_srgbToLinear(texture(u_emissiveTexture, emissiveTexCoords).rgb); + #ifdef HAS_EMISSIVE_FACTOR + emissive *= u_emissiveFactor; + #endif + + return emissive; +} +#endif + +#if defined(LIGHTING_PBR) && defined(USE_SPECULAR_GLOSSINESS) +void setSpecularGlossiness(inout czm_modelMaterial material) +{ + #ifdef HAS_SPECULAR_GLOSSINESS_TEXTURE + vec2 specularGlossinessTexCoords = TEXCOORD_SPECULAR_GLOSSINESS; + #ifdef HAS_SPECULAR_GLOSSINESS_TEXTURE_TRANSFORM + specularGlossinessTexCoords = computeTextureTransform(specularGlossinessTexCoords, u_specularGlossinessTextureTransform); + #endif + + vec4 specularGlossiness = czm_srgbToLinear(texture(u_specularGlossinessTexture, specularGlossinessTexCoords)); + vec3 specular = specularGlossiness.rgb; + float glossiness = specularGlossiness.a; + #ifdef HAS_LEGACY_SPECULAR_FACTOR + specular *= u_legacySpecularFactor; + #endif + + #ifdef HAS_GLOSSINESS_FACTOR + glossiness *= u_glossinessFactor; + #endif + #else + #ifdef HAS_LEGACY_SPECULAR_FACTOR + vec3 specular = clamp(u_legacySpecularFactor, vec3(0.0), vec3(1.0)); + #else + vec3 specular = vec3(1.0); + #endif + + #ifdef HAS_GLOSSINESS_FACTOR + float glossiness = clamp(u_glossinessFactor, 0.0, 1.0); + #else + float glossiness = 1.0; + #endif + #endif + + #ifdef HAS_DIFFUSE_TEXTURE + vec2 diffuseTexCoords = TEXCOORD_DIFFUSE; + #ifdef HAS_DIFFUSE_TEXTURE_TRANSFORM + diffuseTexCoords = computeTextureTransform(diffuseTexCoords, u_diffuseTextureTransform); + #endif + + vec4 diffuse = czm_srgbToLinear(texture(u_diffuseTexture, diffuseTexCoords)); + #ifdef HAS_DIFFUSE_FACTOR + diffuse *= u_diffuseFactor; + #endif + #elif defined(HAS_DIFFUSE_FACTOR) + vec4 diffuse = clamp(u_diffuseFactor, vec4(0.0), vec4(1.0)); + #else + vec4 diffuse = vec4(1.0); + #endif + + material.diffuse = diffuse.rgb * (1.0 - czm_maximumComponent(specular)); + // the specular glossiness extension's alpha overrides anything set + // by the base material. + material.alpha = diffuse.a; + + material.specular = specular; + + // glossiness is the opposite of roughness, but easier for artists to use. + material.roughness = 1.0 - glossiness; +} +#elif defined(LIGHTING_PBR) +float setMetallicRoughness(inout czm_modelMaterial material) +{ + #ifdef HAS_METALLIC_ROUGHNESS_TEXTURE + vec2 metallicRoughnessTexCoords = TEXCOORD_METALLIC_ROUGHNESS; + #ifdef HAS_METALLIC_ROUGHNESS_TEXTURE_TRANSFORM + metallicRoughnessTexCoords = computeTextureTransform(metallicRoughnessTexCoords, u_metallicRoughnessTextureTransform); + #endif + + vec3 metallicRoughness = texture(u_metallicRoughnessTexture, metallicRoughnessTexCoords).rgb; + float metalness = clamp(metallicRoughness.b, 0.0, 1.0); + float roughness = clamp(metallicRoughness.g, 0.0, 1.0); + #ifdef HAS_METALLIC_FACTOR + metalness = clamp(metalness * u_metallicFactor, 0.0, 1.0); + #endif + + #ifdef HAS_ROUGHNESS_FACTOR + roughness = clamp(roughness * u_roughnessFactor, 0.0, 1.0); + #endif + #else + #ifdef HAS_METALLIC_FACTOR + float metalness = clamp(u_metallicFactor, 0.0, 1.0); + #else + float metalness = 1.0; + #endif + + #ifdef HAS_ROUGHNESS_FACTOR + float roughness = clamp(u_roughnessFactor, 0.0, 1.0); + #else + float roughness = 1.0; + #endif + #endif + + // dielectrics use f0 = 0.04, metals use albedo as f0 + const vec3 REFLECTANCE_DIELECTRIC = vec3(0.04); + vec3 f0 = mix(REFLECTANCE_DIELECTRIC, material.baseColor.rgb, metalness); + + material.specular = f0; + + // diffuse only applies to dielectrics. + material.diffuse = mix(material.baseColor.rgb, vec3(0.0), metalness); + + // This is perceptual roughness. The square of this value is used for direct lighting + material.roughness = roughness; + + return metalness; +} +#ifdef USE_SPECULAR +void setSpecular(inout czm_modelMaterial material, in float metalness) +{ + #ifdef HAS_SPECULAR_TEXTURE + vec2 specularTexCoords = TEXCOORD_SPECULAR; + #ifdef HAS_SPECULAR_TEXTURE_TRANSFORM + specularTexCoords = computeTextureTransform(specularTexCoords, u_specularTextureTransform); + #endif + float specularWeight = texture(u_specularTexture, specularTexCoords).a; + #ifdef HAS_SPECULAR_FACTOR + specularWeight *= u_specularFactor; + #endif + #else + #ifdef HAS_SPECULAR_FACTOR + float specularWeight = u_specularFactor; + #else + float specularWeight = 1.0; + #endif + #endif + + #ifdef HAS_SPECULAR_COLOR_TEXTURE + vec2 specularColorTexCoords = TEXCOORD_SPECULAR_COLOR; + #ifdef HAS_SPECULAR_COLOR_TEXTURE_TRANSFORM + specularColorTexCoords = computeTextureTransform(specularColorTexCoords, u_specularColorTextureTransform); + #endif + vec3 specularColorSample = texture(u_specularColorTexture, specularColorTexCoords).rgb; + vec3 specularColorFactor = czm_srgbToLinear(specularColorSample); + #ifdef HAS_SPECULAR_COLOR_FACTOR + specularColorFactor *= u_specularColorFactor; + #endif + #else + #ifdef HAS_SPECULAR_COLOR_FACTOR + vec3 specularColorFactor = u_specularColorFactor; + #else + vec3 specularColorFactor = vec3(1.0); + #endif + #endif + material.specularWeight = specularWeight; + vec3 f0 = material.specular; + vec3 dielectricSpecularF0 = min(f0 * specularColorFactor, vec3(1.0)); + material.specular = mix(dielectricSpecularF0, material.baseColor.rgb, metalness); +} +#endif +#ifdef USE_ANISOTROPY +void setAnisotropy(inout czm_modelMaterial material, in NormalInfo normalInfo) +{ + mat2 rotation = mat2(u_anisotropy.xy, -u_anisotropy.y, u_anisotropy.x); + float anisotropyStrength = u_anisotropy.z; + + vec2 direction = vec2(1.0, 0.0); + #ifdef HAS_ANISOTROPY_TEXTURE + vec2 anisotropyTexCoords = TEXCOORD_ANISOTROPY; + #ifdef HAS_ANISOTROPY_TEXTURE_TRANSFORM + anisotropyTexCoords = computeTextureTransform(anisotropyTexCoords, u_anisotropyTextureTransform); + #endif + vec3 anisotropySample = texture(u_anisotropyTexture, anisotropyTexCoords).rgb; + direction = anisotropySample.rg * 2.0 - vec2(1.0); + anisotropyStrength *= anisotropySample.b; + #endif + + direction = rotation * direction; + mat3 tbn = mat3(normalInfo.tangent, normalInfo.bitangent, normalInfo.normal); + vec3 anisotropicT = tbn * normalize(vec3(direction, 0.0)); + vec3 anisotropicB = cross(normalInfo.geometryNormal, anisotropicT); + + material.anisotropicT = anisotropicT; + material.anisotropicB = anisotropicB; + material.anisotropyStrength = anisotropyStrength; +} +#endif +#ifdef USE_CLEARCOAT +void setClearcoat(inout czm_modelMaterial material, in ProcessedAttributes attributes) +{ + #ifdef HAS_CLEARCOAT_TEXTURE + vec2 clearcoatTexCoords = TEXCOORD_CLEARCOAT; + #ifdef HAS_CLEARCOAT_TEXTURE_TRANSFORM + clearcoatTexCoords = computeTextureTransform(clearcoatTexCoords, u_clearcoatTextureTransform); + #endif + float clearcoatFactor = texture(u_clearcoatTexture, clearcoatTexCoords).r; + #ifdef HAS_CLEARCOAT_FACTOR + clearcoatFactor *= u_clearcoatFactor; + #endif + #else + #ifdef HAS_CLEARCOAT_FACTOR + float clearcoatFactor = u_clearcoatFactor; + #else + // PERFORMANCE_IDEA: this case should turn the whole extension off + float clearcoatFactor = 0.0; + #endif + #endif + + #ifdef HAS_CLEARCOAT_ROUGHNESS_TEXTURE + vec2 clearcoatRoughnessTexCoords = TEXCOORD_CLEARCOAT_ROUGHNESS; + #ifdef HAS_CLEARCOAT_ROUGHNESS_TEXTURE_TRANSFORM + clearcoatRoughnessTexCoords = computeTextureTransform(clearcoatRoughnessTexCoords, u_clearcoatRoughnessTextureTransform); + #endif + float clearcoatRoughness = texture(u_clearcoatRoughnessTexture, clearcoatRoughnessTexCoords).g; + #ifdef HAS_CLEARCOAT_ROUGHNESS_FACTOR + clearcoatRoughness *= u_clearcoatRoughnessFactor; + #endif + #else + #ifdef HAS_CLEARCOAT_ROUGHNESS_FACTOR + float clearcoatRoughness = u_clearcoatRoughnessFactor; + #else + float clearcoatRoughness = 0.0; + #endif + #endif + + material.clearcoatFactor = clearcoatFactor; + // This is perceptual roughness. The square of this value is used for direct lighting + material.clearcoatRoughness = clearcoatRoughness; + #ifdef HAS_CLEARCOAT_NORMAL_TEXTURE + material.clearcoatNormal = getClearcoatNormalFromTexture(attributes, attributes.normalEC); + #else + material.clearcoatNormal = attributes.normalEC; + #endif +} +#endif +#endif + +void materialStage(inout czm_modelMaterial material, ProcessedAttributes attributes, SelectedFeature feature) +{ + #ifdef USE_ANISOTROPY + NormalInfo normalInfo = getNormalInfo(attributes); + material.normalEC = normalInfo.normal; + #elif defined(HAS_NORMALS) + material.normalEC = computeNormal(attributes); + #endif + + vec4 baseColorWithAlpha = vec4(1.0); + // Regardless of whether we use PBR, set a base color + #ifdef HAS_BASE_COLOR_TEXTURE + baseColorWithAlpha = getBaseColorFromTexture(); + #elif defined(HAS_BASE_COLOR_FACTOR) + // Custom VCS Color Handling, if VCS Shader is activated and the model has useSRGBColorFactors set we + // handle the baseColorFactor as SRGB values instead of linear color + #ifdef USE_VCS_SRGB_COLOR_FACTORS + baseColorWithAlpha *= czm_srgbToLinear(u_baseColorFactor); + #else + baseColorWithAlpha *= u_baseColorFactor; + #endif + #endif + + #ifdef HAS_POINT_CLOUD_COLOR_STYLE + baseColorWithAlpha = v_pointCloudColor; + #elif defined(HAS_COLOR_0) + vec4 color = attributes.color_0; + // .pnts files store colors in the sRGB color space + #ifdef HAS_SRGB_COLOR + color = czm_srgbToLinear(color); + #elif defined(USE_VCS_SRGB_VERTEX_COLORS) + // Custom VCS Color Handling, if VCS Shader is activated and the model has useSRGBAVertexColor set we + // handle the baseColorFactor as SRGB values instead of linear color + color = czm_srgbToLinear(color); + #endif + baseColorWithAlpha *= color; + #endif + + #ifdef USE_CPU_STYLING + baseColorWithAlpha.rgb = blend(baseColorWithAlpha.rgb, feature.color.rgb, model_colorBlend); + #endif + material.baseColor = baseColorWithAlpha; + material.diffuse = baseColorWithAlpha.rgb; + material.alpha = baseColorWithAlpha.a; + + #ifdef HAS_OCCLUSION_TEXTURE + vec2 occlusionTexCoords = TEXCOORD_OCCLUSION; + #ifdef HAS_OCCLUSION_TEXTURE_TRANSFORM + occlusionTexCoords = computeTextureTransform(occlusionTexCoords, u_occlusionTextureTransform); + #endif + material.occlusion = texture(u_occlusionTexture, occlusionTexCoords).r; + #endif + + #ifdef HAS_EMISSIVE_TEXTURE + material.emissive = getEmissiveFromTexture(); + #elif defined(HAS_EMISSIVE_FACTOR) + material.emissive = u_emissiveFactor; + #endif + + #if defined(LIGHTING_PBR) && defined(USE_SPECULAR_GLOSSINESS) + setSpecularGlossiness(material); + #elif defined(LIGHTING_PBR) + float metalness = setMetallicRoughness(material); + #ifdef USE_SPECULAR + setSpecular(material, metalness); + #endif + #ifdef USE_ANISOTROPY + setAnisotropy(material, normalInfo); + #endif + #ifdef USE_CLEARCOAT + setClearcoat(material, attributes); + #endif + #endif +} +`, { + Material: Material$1, + MetallicRoughness: MetallicRoughness$1, + SpecularGlossiness, + Specular, + Clearcoat +} = ModelComponents, MaterialPipelineStage = { + name: "MaterialPipelineStage", + // Helps with debugging + // Expose some methods for testing + _processTexture: processTexture, + _processTextureTransform: processTextureTransform +}; +MaterialPipelineStage.process = function(e, t, n) { + const i = t.material, { model: r, uniformMap: o, shaderBuilder: s } = e, c = defined(r.classificationType), l = c, { + defaultTexture: d, + defaultNormalTexture: f, + defaultEmissiveTexture: h + } = n.context; + processMaterialUniforms( + i, + o, + s, + d, + f, + h, + l + ), defined(i.specularGlossiness) ? processSpecularGlossinessUniforms( + i.specularGlossiness, + o, + s, + d, + l + ) : (defined(i.specular) && ModelUtility.supportedExtensions.KHR_materials_specular && processSpecularUniforms( + i.specular, + o, + s, + d, + l + ), defined(i.anisotropy) && ModelUtility.supportedExtensions.KHR_materials_anisotropy && processAnisotropyUniforms( + i.anisotropy, + o, + s, + d, + l + ), defined(i.clearcoat) && ModelUtility.supportedExtensions.KHR_materials_clearcoat && processClearcoatUniforms( + i.clearcoat, + o, + s, + d, + l + ), processMetallicRoughnessUniforms( + i.metallicRoughness, + o, + s, + d, + l + )); + const p = ModelUtility.getAttributeBySemantic( + t, + VertexAttributeSemantic$1.NORMAL + ), m = e.lightingOptions; + i.unlit || !p || c ? m.lightingModel = LightingModel$1.UNLIT : m.lightingModel = LightingModel$1.PBR; + const _ = r.backFaceCulling && !i.doubleSided; + e.renderStateOptions.cull.enabled = _; + const y = e.alphaOptions; + i.alphaMode === AlphaMode$1.BLEND ? y.pass = Pass$1.TRANSLUCENT : i.alphaMode === AlphaMode$1.MASK && (y.alphaCutoff = i.alphaCutoff), s.addFragmentLines(MaterialStageFS), i.doubleSided && s.addDefine( + "HAS_DOUBLE_SIDED_MATERIAL", + void 0, + ShaderDestination$1.BOTH + ); +}; +function processTextureTransform(e, t, n, i, r) { + const o = `HAS_${r}_TEXTURE_TRANSFORM`; + e.addDefine( + o, + void 0, + ShaderDestination$1.FRAGMENT + ); + const s = `${i}Transform`; + e.addUniform( + "mat3", + s, + ShaderDestination$1.FRAGMENT + ), t[s] = function() { + return n.transform; + }; +} +function processTextureScale(e, t, n, i, r) { + const o = `HAS_${r}_TEXTURE_SCALE`; + e.addDefine( + o, + void 0, + ShaderDestination$1.FRAGMENT + ); + const s = `${i}Scale`; + e.addUniform( + "float", + s, + ShaderDestination$1.FRAGMENT + ), t[s] = function() { + return n.scale; + }; +} +function processTexture(e, t, n, i, r, o) { + e.addUniform( + "sampler2D", + i, + ShaderDestination$1.FRAGMENT + ), t[i] = function() { + return defaultValue(n.texture, o); + }; + const s = `HAS_${r}_TEXTURE`; + e.addDefine(s, void 0, ShaderDestination$1.FRAGMENT); + const l = `v_texCoord_${n.texCoord}`, d = `TEXCOORD_${r}`; + e.addDefine( + d, + l, + ShaderDestination$1.FRAGMENT + ); + const f = n.transform; + defined(f) && !Matrix3.equals(f, Matrix3.IDENTITY) && processTextureTransform( + e, + t, + n, + i, + r + ); + const { scale: h } = n; + defined(h) && h !== 1 && processTextureScale( + e, + t, + n, + i, + r + ); +} +function processMaterialUniforms(e, t, n, i, r, o, s) { + const { + emissiveFactor: c, + emissiveTexture: l, + normalTexture: d, + occlusionTexture: f + } = e; + defined(c) && !Cartesian3.equals(c, Material$1.DEFAULT_EMISSIVE_FACTOR) && (n.addUniform( + "vec3", + "u_emissiveFactor", + ShaderDestination$1.FRAGMENT + ), t.u_emissiveFactor = function() { + return e.emissiveFactor; + }, n.addDefine( + "HAS_EMISSIVE_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(l) && !s && processTexture( + n, + t, + l, + "u_emissiveTexture", + "EMISSIVE", + o + )), defined(d) && !s && processTexture( + n, + t, + d, + "u_normalTexture", + "NORMAL", + r + ), defined(f) && !s && processTexture( + n, + t, + f, + "u_occlusionTexture", + "OCCLUSION", + i + ); +} +function processSpecularGlossinessUniforms(e, t, n, i, r) { + const { + diffuseTexture: o, + diffuseFactor: s, + specularGlossinessTexture: c, + specularFactor: l, + glossinessFactor: d + } = e; + n.addDefine( + "USE_SPECULAR_GLOSSINESS", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(o) && !r && processTexture( + n, + t, + o, + "u_diffuseTexture", + "DIFFUSE", + i + ), defined(s) && !Cartesian4.equals(s, SpecularGlossiness.DEFAULT_DIFFUSE_FACTOR) && (n.addUniform( + "vec4", + "u_diffuseFactor", + ShaderDestination$1.FRAGMENT + ), t.u_diffuseFactor = function() { + return e.diffuseFactor; + }, n.addDefine( + "HAS_DIFFUSE_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(c) && !r && processTexture( + n, + t, + c, + "u_specularGlossinessTexture", + "SPECULAR_GLOSSINESS", + i + ), defined(l) && !Cartesian3.equals( + l, + SpecularGlossiness.DEFAULT_SPECULAR_FACTOR + ) && (n.addUniform( + "vec3", + "u_legacySpecularFactor", + ShaderDestination$1.FRAGMENT + ), t.u_legacySpecularFactor = function() { + return e.specularFactor; + }, n.addDefine( + "HAS_LEGACY_SPECULAR_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(d) && d !== SpecularGlossiness.DEFAULT_GLOSSINESS_FACTOR && (n.addUniform( + "float", + "u_glossinessFactor", + ShaderDestination$1.FRAGMENT + ), t.u_glossinessFactor = function() { + return e.glossinessFactor; + }, n.addDefine( + "HAS_GLOSSINESS_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )); +} +function processSpecularUniforms(e, t, n, i, r) { + const { + specularTexture: o, + specularFactor: s, + specularColorTexture: c, + specularColorFactor: l + } = e; + n.addDefine( + "USE_SPECULAR", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(o) && !r && processTexture( + n, + t, + o, + "u_specularTexture", + "SPECULAR", + i + ), defined(s) && s !== Specular.DEFAULT_SPECULAR_FACTOR && (n.addUniform( + "float", + "u_specularFactor", + ShaderDestination$1.FRAGMENT + ), t.u_specularFactor = function() { + return e.specularFactor; + }, n.addDefine( + "HAS_SPECULAR_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(c) && !r && processTexture( + n, + t, + c, + "u_specularColorTexture", + "SPECULAR_COLOR", + i + ), defined(l) && !Cartesian3.equals( + l, + Specular.DEFAULT_SPECULAR_COLOR_FACTOR + ) && (n.addUniform( + "vec3", + "u_specularColorFactor", + ShaderDestination$1.FRAGMENT + ), t.u_specularColorFactor = function() { + return e.specularColorFactor; + }, n.addDefine( + "HAS_SPECULAR_COLOR_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )); +} +const scratchAnisotropy = new Cartesian3(); +function processAnisotropyUniforms(e, t, n, i, r) { + const { + anisotropyStrength: o, + anisotropyRotation: s, + anisotropyTexture: c + } = e; + n.addDefine( + "USE_ANISOTROPY", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(c) && !r && processTexture( + n, + t, + c, + "u_anisotropyTexture", + "ANISOTROPY", + i + ); + const l = Math.cos(s), d = Math.sin(s); + n.addUniform("vec3", "u_anisotropy", ShaderDestination$1.FRAGMENT), t.u_anisotropy = function() { + return Cartesian3.fromElements( + l, + d, + o, + scratchAnisotropy + ); + }; +} +function processClearcoatUniforms(e, t, n, i, r) { + const { + clearcoatFactor: o, + clearcoatTexture: s, + clearcoatRoughnessFactor: c, + clearcoatRoughnessTexture: l, + clearcoatNormalTexture: d + } = e; + n.addDefine( + "USE_CLEARCOAT", + void 0, + ShaderDestination$1.FRAGMENT + ), defined(o) && o !== Clearcoat.DEFAULT_CLEARCOAT_FACTOR && (n.addUniform( + "float", + "u_clearcoatFactor", + ShaderDestination$1.FRAGMENT + ), t.u_clearcoatFactor = function() { + return e.clearcoatFactor; + }, n.addDefine( + "HAS_CLEARCOAT_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(s) && !r && processTexture( + n, + t, + s, + "u_clearcoatTexture", + "CLEARCOAT", + i + ), defined(c) && o !== Clearcoat.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR && (n.addUniform( + "float", + "u_clearcoatRoughnessFactor", + ShaderDestination$1.FRAGMENT + ), t.u_clearcoatRoughnessFactor = function() { + return e.clearcoatRoughnessFactor; + }, n.addDefine( + "HAS_CLEARCOAT_ROUGHNESS_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )), defined(l) && !r && processTexture( + n, + t, + l, + "u_clearcoatRoughnessTexture", + "CLEARCOAT_ROUGHNESS", + i + ), defined(d) && !r && processTexture( + n, + t, + d, + "u_clearcoatNormalTexture", + "CLEARCOAT_NORMAL", + i + ); +} +function processMetallicRoughnessUniforms(e, t, n, i, r) { + n.addDefine( + "USE_METALLIC_ROUGHNESS", + void 0, + ShaderDestination$1.FRAGMENT + ); + const o = e.baseColorTexture; + defined(o) && !r && processTexture( + n, + t, + o, + "u_baseColorTexture", + "BASE_COLOR", + i + ); + const s = e.baseColorFactor; + defined(s) && !Cartesian4.equals( + s, + MetallicRoughness$1.DEFAULT_BASE_COLOR_FACTOR + ) && (n.addUniform( + "vec4", + "u_baseColorFactor", + ShaderDestination$1.FRAGMENT + ), t.u_baseColorFactor = function() { + return e.baseColorFactor; + }, n.addDefine( + "HAS_BASE_COLOR_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )); + const c = e.metallicRoughnessTexture; + defined(c) && !r && processTexture( + n, + t, + c, + "u_metallicRoughnessTexture", + "METALLIC_ROUGHNESS", + i + ); + const l = e.metallicFactor; + defined(l) && l !== MetallicRoughness$1.DEFAULT_METALLIC_FACTOR && (n.addUniform( + "float", + "u_metallicFactor", + ShaderDestination$1.FRAGMENT + ), t.u_metallicFactor = function() { + return e.metallicFactor; + }, n.addDefine( + "HAS_METALLIC_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )); + const d = e.roughnessFactor; + defined(d) && d !== MetallicRoughness$1.DEFAULT_ROUGHNESS_FACTOR && (n.addUniform( + "float", + "u_roughnessFactor", + ShaderDestination$1.FRAGMENT + ), t.u_roughnessFactor = function() { + return e.roughnessFactor; + }, n.addDefine( + "HAS_ROUGHNESS_FACTOR", + void 0, + ShaderDestination$1.FRAGMENT + )); +} +const MorphTargetsStageVS = `void morphTargetsStage(inout ProcessedAttributes attributes) +{ + vec3 positionMC = attributes.positionMC; + attributes.positionMC = getMorphedPosition(positionMC); + + #ifdef HAS_NORMALS + vec3 normalMC = attributes.normalMC; + attributes.normalMC = getMorphedNormal(normalMC); + #endif + + #ifdef HAS_TANGENTS + vec3 tangentMC = attributes.tangentMC; + attributes.tangentMC = getMorphedTangent(tangentMC); + #endif +}`, MorphTargetsPipelineStage = { + name: "MorphTargetsPipelineStage", + // Helps with debugging + FUNCTION_ID_GET_MORPHED_POSITION: "getMorphedPosition", + FUNCTION_SIGNATURE_GET_MORPHED_POSITION: "vec3 getMorphedPosition(in vec3 position)", + FUNCTION_ID_GET_MORPHED_NORMAL: "getMorphedNormal", + FUNCTION_SIGNATURE_GET_MORPHED_NORMAL: "vec3 getMorphedNormal(in vec3 normal)", + FUNCTION_ID_GET_MORPHED_TANGENT: "getMorphedTangent", + FUNCTION_SIGNATURE_GET_MORPHED_TANGENT: "vec3 getMorphedTangent(in vec3 tangent)" +}; +MorphTargetsPipelineStage.process = function(e, t) { + const n = e.shaderBuilder; + n.addDefine( + "HAS_MORPH_TARGETS", + void 0, + ShaderDestination$1.VERTEX + ), addGetMorphedAttributeFunctionDeclarations(n); + const i = t.morphTargets.length; + for (let c = 0; c < i; c++) { + const l = t.morphTargets[c].attributes, d = l.length; + for (let f = 0; f < d; f++) { + const h = l[f], p = h.semantic; + p !== VertexAttributeSemantic$1.POSITION && p !== VertexAttributeSemantic$1.NORMAL && p !== VertexAttributeSemantic$1.TANGENT || (processMorphTargetAttribute( + e, + h, + e.attributeIndex, + c + ), e.attributeIndex++); + } + } + addGetMorphedAttributeFunctionReturns(n); + const o = e.runtimeNode.morphWeights.length; + n.addUniform( + "float", + `u_morphWeights[${o}]`, + ShaderDestination$1.VERTEX + ), n.addVertexLines(MorphTargetsStageVS); + const s = { + u_morphWeights: function() { + return e.runtimeNode.morphWeights; + } + }; + e.uniformMap = combine$2(s, e.uniformMap); +}; +const scratchAttributeInfo = { + attributeString: void 0, + functionId: void 0 +}; +function processMorphTargetAttribute(e, t, n, i) { + const r = e.shaderBuilder; + addMorphTargetAttributeToRenderResources( + e, + t, + n + ); + const o = getMorphTargetAttributeInfo( + t, + scratchAttributeInfo + ); + addMorphTargetAttributeDeclarationAndFunctionLine( + r, + o, + i + ); +} +function addMorphTargetAttributeToRenderResources(e, t, n) { + const i = { + index: n, + value: defined(t.buffer) ? void 0 : t.constant, + vertexBuffer: t.buffer, + componentsPerAttribute: AttributeType$1.getNumberOfComponents(t.type), + componentDatatype: t.componentDatatype, + offsetInBytes: t.byteOffset, + strideInBytes: t.byteStride, + normalize: t.normalized + }; + e.attributes.push(i); +} +function getMorphTargetAttributeInfo(e, t) { + switch (e.semantic) { + case VertexAttributeSemantic$1.POSITION: + t.attributeString = "Position", t.functionId = MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_POSITION; + break; + case VertexAttributeSemantic$1.NORMAL: + t.attributeString = "Normal", t.functionId = MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_NORMAL; + break; + case VertexAttributeSemantic$1.TANGENT: + t.attributeString = "Tangent", t.functionId = MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_TANGENT; + break; + } + return t; +} +function addMorphTargetAttributeDeclarationAndFunctionLine(e, t, n) { + const i = t.attributeString, r = `a_target${i}_${n}`, o = `morphed${i} += u_morphWeights[${n}] * a_target${i}_${n};`; + e.addAttribute("vec3", r), e.addFunctionLines(t.functionId, [o]); +} +function addGetMorphedAttributeFunctionDeclarations(e) { + e.addFunction( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_POSITION, + MorphTargetsPipelineStage.FUNCTION_SIGNATURE_GET_MORPHED_POSITION, + ShaderDestination$1.VERTEX + ), e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_POSITION, + ["vec3 morphedPosition = position;"] + ), e.addFunction( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_NORMAL, + MorphTargetsPipelineStage.FUNCTION_SIGNATURE_GET_MORPHED_NORMAL, + ShaderDestination$1.VERTEX + ), e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_NORMAL, + ["vec3 morphedNormal = normal;"] + ), e.addFunction( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_TANGENT, + MorphTargetsPipelineStage.FUNCTION_SIGNATURE_GET_MORPHED_TANGENT, + ShaderDestination$1.VERTEX + ), e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_TANGENT, + ["vec3 morphedTangent = tangent;"] + ); +} +function addGetMorphedAttributeFunctionReturns(e) { + e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_POSITION, + ["return morphedPosition;"] + ), e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_NORMAL, + ["return morphedNormal;"] + ), e.addFunctionLines( + MorphTargetsPipelineStage.FUNCTION_ID_GET_MORPHED_TANGENT, + ["return morphedTangent;"] + ); +} +const PickingPipelineStage = { + name: "PickingPipelineStage" + // Helps with debugging +}; +PickingPipelineStage.process = function(e, t, n) { + const i = n.context, r = e.runtimeNode, o = e.shaderBuilder, s = e.model, c = r.node.instances; + if (e.hasPropertyTable) + processPickTexture(e, t, c); + else if (defined(c)) + processInstancedPickIds(e, i); + else { + const l = buildPickObject(e), d = i.createPickId(l); + s._pipelineResources.push(d), s._pickIds.push(d), o.addUniform( + "vec4", + "czm_pickColor", + ShaderDestination$1.FRAGMENT + ); + const f = e.uniformMap; + f.czm_pickColor = function() { + return d.color; + }, e.pickId = "czm_pickColor"; + } +}; +function buildPickObject(e, t) { + const n = e.model; + if (defined(n.pickObject)) + return n.pickObject; + const i = { + model: n, + node: e.runtimeNode, + primitive: e.runtimePrimitive + }; + let r; + if (ModelType$1.is3DTiles(n.type)) { + const o = n.content; + r = { + content: o, + primitive: o.tileset, + detail: i + }; + } else + r = { + primitive: n, + detail: i + }; + return r.id = n.id, defined(t) && (r.instanceId = t), r; +} +function processPickTexture(e, t, n) { + const i = e.model; + let r, o; + const s = i.featureIdLabel, c = i.instanceFeatureIdLabel; + defined(i.featureTableId) ? r = i.featureTableId : defined(n) ? (o = ModelUtility.getFeatureIdsByLabel( + n.featureIds, + c + ), r = o.propertyTableId) : (o = ModelUtility.getFeatureIdsByLabel( + t.featureIds, + s + ), r = o.propertyTableId); + const l = i.featureTables[r]; + e.shaderBuilder.addUniform( + "sampler2D", + "model_pickTexture", + ShaderDestination$1.FRAGMENT + ); + const f = l.batchTexture; + e.uniformMap.model_pickTexture = function() { + return defaultValue(f.pickTexture, f.defaultTexture); + }, e.pickId = "((selectedFeature.id < int(model_featuresLength)) ? texture(model_pickTexture, selectedFeature.st) : vec4(0.0))"; +} +function processInstancedPickIds(e, t) { + const n = e.instanceCount, i = new Array(n), r = new Uint8Array(n * 4), o = e.model, s = o._pipelineResources; + for (let h = 0; h < n; h++) { + const p = buildPickObject(e, h), m = t.createPickId(p); + s.push(m), i[h] = m; + const _ = m.color; + r[h * 4 + 0] = Color.floatToByte(_.red), r[h * 4 + 1] = Color.floatToByte(_.green), r[h * 4 + 2] = Color.floatToByte(_.blue), r[h * 4 + 3] = Color.floatToByte(_.alpha); + } + o._pickIds = i; + const c = Buffer.createVertexBuffer({ + context: t, + typedArray: r, + usage: BufferUsage$1.STATIC_DRAW + }); + c.vertexArrayDestroyable = !1, o.statistics.addBuffer(c, !1), s.push(c); + const d = { + index: e.attributeIndex++, + vertexBuffer: c, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + normalize: !0, + offsetInBytes: 0, + strideInBytes: 0, + instanceDivisor: 1 + }; + e.attributes.push(d); + const f = e.shaderBuilder; + f.addDefine("USE_PICKING", void 0, ShaderDestination$1.BOTH), f.addAttribute("vec4", "a_pickColor"), f.addVarying("vec4", "v_pickColor"), e.pickId = "v_pickColor"; +} +const Cesium3DTileRefine = { + /** + * Render this tile and, if it doesn't meet the screen space error, also refine to its children. + * + * @type {number} + * @constant + */ + ADD: 0, + /** + * Render this tile or, if it doesn't meet the screen space error, refine to its descendants instead. + * + * @type {number} + * @constant + */ + REPLACE: 1 +}, Cesium3DTileRefine$1 = Object.freeze(Cesium3DTileRefine), PointCloudStylingStageVS = `float getPointSizeFromAttenuation(vec3 positionEC) { + // Variables are packed into a single vector to minimize gl.uniformXXX() calls + float pointSize = model_pointCloudParameters.x; + float geometricError = model_pointCloudParameters.y; + float depthMultiplier = model_pointCloudParameters.z; + + float depth = -positionEC.z; + return min((geometricError / depth) * depthMultiplier, pointSize); +} + +#ifdef HAS_POINT_CLOUD_SHOW_STYLE +float pointCloudShowStylingStage(in ProcessedAttributes attributes, in Metadata metadata) { + float tiles3d_tileset_time = model_pointCloudParameters.w; + return float(getShowFromStyle(attributes, metadata, tiles3d_tileset_time)); +} +#endif + +#ifdef HAS_POINT_CLOUD_COLOR_STYLE +vec4 pointCloudColorStylingStage(in ProcessedAttributes attributes, in Metadata metadata) { + float tiles3d_tileset_time = model_pointCloudParameters.w; + return getColorFromStyle(attributes, metadata, tiles3d_tileset_time); +} +#endif + +#ifdef HAS_POINT_CLOUD_POINT_SIZE_STYLE +float pointCloudPointSizeStylingStage(in ProcessedAttributes attributes, in Metadata metadata) { + float tiles3d_tileset_time = model_pointCloudParameters.w; + return float(getPointSizeFromStyle(attributes, metadata, tiles3d_tileset_time)); +} +#elif defined(HAS_POINT_CLOUD_ATTENUATION) +float pointCloudPointSizeStylingStage(in ProcessedAttributes attributes, in Metadata metadata) { + return getPointSizeFromAttenuation(v_positionEC); +} +#endif + +#ifdef HAS_POINT_CLOUD_BACK_FACE_CULLING +float pointCloudBackFaceCullingStage() { + #if defined(HAS_NORMALS) && !defined(HAS_DOUBLE_SIDED_MATERIAL) + // This needs to be computed in eye coordinates so we can't use attributes.normalMC + return step(-v_normalEC.z, 0.0); + #else + return 1.0; + #endif +} +#endif`, scratchUniform = new Cartesian4(), PointCloudStylingPipelineStage = { + name: "PointCloudStylingPipelineStage" + // Helps with debugging +}; +PointCloudStylingPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder, r = e.model, o = r.style, s = r.structuralMetadata, c = defined(s) ? s.propertyAttributes : void 0, l = defined(r.featureTableId) && r.featureTables[r.featureTableId].featuresLength > 0, d = !defined(c) && l; + if (defined(o) && !d) { + const y = getVariableSubstitutionMap( + c + ), C = getStyleShaderFunctionInfo( + o, + y + ); + addShaderFunctionsAndDefines(i, C); + const x = getPropertyNames(C).indexOf("normalMC") >= 0, b = ModelUtility.getAttributeBySemantic( + t, + VertexAttributeSemantic$1.NORMAL + ); + if (x && !b) + throw new RuntimeError( + "Style references the NORMAL semantic but the point cloud does not have normals" + ); + i.addDefine( + "COMPUTE_POSITION_WC_STYLE", + void 0, + ShaderDestination$1.VERTEX + ), C.styleTranslucent && (e.alphaOptions.pass = Pass$1.TRANSLUCENT); + } + const f = r.pointCloudShading; + f.attenuation && i.addDefine( + "HAS_POINT_CLOUD_ATTENUATION", + void 0, + ShaderDestination$1.VERTEX + ), f.backFaceCulling && i.addDefine( + "HAS_POINT_CLOUD_BACK_FACE_CULLING", + void 0, + ShaderDestination$1.VERTEX + ); + let h, p, m; + ModelType$1.is3DTiles(r.type) && (p = !0, h = r.content, m = h.tile.refine === Cesium3DTileRefine$1.ADD), i.addUniform( + "vec4", + "model_pointCloudParameters", + ShaderDestination$1.VERTEX + ), i.addVertexLines(PointCloudStylingStageVS); + const _ = e.uniformMap; + _.model_pointCloudParameters = function() { + const y = scratchUniform; + let C = 1; + p && (C = m ? 5 : h.tileset.memoryAdjustedScreenSpaceError), y.x = defaultValue( + f.maximumAttenuation, + C + ), y.x *= n.pixelRatio; + const T = getGeometricError$1( + e, + t, + f, + h + ); + y.y = T * f.geometricErrorScale; + const x = n.context, b = n.camera.frustum; + let S; + return n.mode === SceneMode$1.SCENE2D || b instanceof OrthographicFrustum ? S = Number.POSITIVE_INFINITY : S = x.drawingBufferHeight / n.camera.frustum.sseDenominator, y.z = S, p && (y.w = h.tileset.timeSinceLoad), y; + }; +}; +const scratchDimensions$1 = new Cartesian3(); +function getGeometricError$1(e, t, n, i) { + if (defined(i)) { + const f = i.tile.geometricError; + if (f > 0) + return f; + } + if (defined(n.baseResolution)) + return n.baseResolution; + const r = ModelUtility.getAttributeBySemantic( + t, + VertexAttributeSemantic$1.POSITION + ), o = r.count, s = e.runtimeNode.transform; + let c = Cartesian3.subtract( + r.max, + r.min, + scratchDimensions$1 + ); + c = Matrix4.multiplyByPointAsVector( + s, + c, + scratchDimensions$1 + ); + const l = c.x * c.y * c.z; + return CesiumMath.cbrt(l / o); +} +const scratchShaderFunctionInfo = { + colorStyleFunction: void 0, + showStyleFunction: void 0, + pointSizeStyleFunction: void 0, + styleTranslucent: !1 +}, builtinVariableSubstitutionMap$1 = { + POSITION: "attributes.positionMC", + POSITION_ABSOLUTE: "v_positionWC", + COLOR: "attributes.color_0", + NORMAL: "attributes.normalMC" +}; +function getVariableSubstitutionMap(e) { + const t = clone$1(builtinVariableSubstitutionMap$1); + if (!defined(e)) + return t; + for (let n = 0; n < e.length; n++) { + const r = e[n].properties; + for (const o in r) + r.hasOwnProperty(o) && (t[o] = `metadata.${o}`); + } + return t; +} +const parameterList = "ProcessedAttributes attributes, Metadata metadata, float tiles3d_tileset_time"; +function getStyleShaderFunctionInfo(e, t) { + const n = scratchShaderFunctionInfo, i = { + translucent: !1 + }; + return n.colorStyleFunction = e.getColorShaderFunction( + `getColorFromStyle(${parameterList})`, + t, + i + ), n.showStyleFunction = e.getShowShaderFunction( + `getShowFromStyle(${parameterList})`, + t, + i + ), n.pointSizeStyleFunction = e.getPointSizeShaderFunction( + `getPointSizeFromStyle(${parameterList})`, + t, + i + ), n.styleTranslucent = defined(n.colorStyleFunction) && i.translucent, n; +} +function addShaderFunctionsAndDefines(e, t) { + const n = t.colorStyleFunction; + defined(n) && (e.addDefine( + "HAS_POINT_CLOUD_COLOR_STYLE", + void 0, + ShaderDestination$1.BOTH + ), e.addVertexLines(n), e.addVarying("vec4", "v_pointCloudColor")); + const i = t.showStyleFunction; + defined(i) && (e.addDefine( + "HAS_POINT_CLOUD_SHOW_STYLE", + void 0, + ShaderDestination$1.VERTEX + ), e.addVertexLines(i)); + const r = t.pointSizeStyleFunction; + defined(r) && (e.addDefine( + "HAS_POINT_CLOUD_POINT_SIZE_STYLE", + void 0, + ShaderDestination$1.VERTEX + ), e.addVertexLines(r)); +} +function getBuiltinPropertyNames$1(e, t) { + const n = /attributes\.(\w+)/g; + let i = n.exec(e); + for (; i !== null; ) { + const r = i[1]; + t.indexOf(r) === -1 && t.push(r), i = n.exec(e); + } +} +function getPropertyNames(e) { + const t = e.colorStyleFunction, n = e.showStyleFunction, i = e.pointSizeStyleFunction, r = []; + return defined(t) && getBuiltinPropertyNames$1(t, r), defined(n) && getBuiltinPropertyNames$1(n, r), defined(i) && getBuiltinPropertyNames$1(i, r), r; +} +const PrimitiveOutlineStageVS = `void primitiveOutlineStage() { + v_outlineCoordinates = a_outlineCoordinates; +} +`, PrimitiveOutlineStageFS = `void primitiveOutlineStage(inout czm_modelMaterial material) { + if (!model_showOutline) { + return; + } + + float outlineX = + texture(model_outlineTexture, vec2(v_outlineCoordinates.x, 0.5)).r; + float outlineY = + texture(model_outlineTexture, vec2(v_outlineCoordinates.y, 0.5)).r; + float outlineZ = + texture(model_outlineTexture, vec2(v_outlineCoordinates.z, 0.5)).r; + float outlineness = max(outlineX, max(outlineY, outlineZ)); + + material.diffuse = mix(material.diffuse, model_outlineColor.rgb, model_outlineColor.a * outlineness); +} + +`, PrimitiveOutlinePipelineStage = { + name: "PrimitiveOutlinePipelineStage" + // Helps with debugging +}; +PrimitiveOutlinePipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder, r = e.uniformMap; + i.addDefine( + "HAS_PRIMITIVE_OUTLINE", + void 0, + ShaderDestination$1.BOTH + ), i.addAttribute("vec3", "a_outlineCoordinates"), i.addVarying("vec3", "v_outlineCoordinates"); + const o = t.outlineCoordinates, s = { + index: e.attributeIndex++, + vertexBuffer: o.buffer, + componentsPerAttribute: AttributeType$1.getNumberOfComponents( + o.type + ), + componentDatatype: o.componentDatatype, + offsetInBytes: o.byteOffset, + strideInBytes: o.byteStride, + normalize: o.normalized + }; + e.attributes.push(s), i.addUniform( + "sampler2D", + "model_outlineTexture", + ShaderDestination$1.FRAGMENT + ); + const c = PrimitiveOutlineGenerator.createTexture( + n.context + ); + r.model_outlineTexture = function() { + return c; + }; + const l = e.model; + i.addUniform( + "vec4", + "model_outlineColor", + ShaderDestination$1.FRAGMENT + ), r.model_outlineColor = function() { + return l.outlineColor; + }, i.addUniform( + "bool", + "model_showOutline", + ShaderDestination$1.FRAGMENT + ), r.model_showOutline = function() { + return l.showOutline; + }, i.addVertexLines(PrimitiveOutlineStageVS), i.addFragmentLines(PrimitiveOutlineStageFS); +}; +const PrimitiveStatisticsPipelineStage = { + name: "PrimitiveStatisticsPipelineStage", + // Helps with debugging + // Expose some methods for testing + _countGeometry: countGeometry, + _count2DPositions: count2DPositions, + _countMorphTargetAttributes: countMorphTargetAttributes, + _countMaterialTextures: countMaterialTextures, + _countFeatureIdTextures: countFeatureIdTextures, + _countBinaryMetadata: countBinaryMetadata +}; +PrimitiveStatisticsPipelineStage.process = function(e, t, n) { + const i = e.model, r = i.statistics; + countGeometry(r, t), count2DPositions(r, e.runtimePrimitive), countMorphTargetAttributes(r, t), countMaterialTextures(r, t.material), countFeatureIdTextures(r, t.featureIds), countBinaryMetadata(r, i); +}; +function countGeometry(e, t) { + const n = defined(t.indices) ? t.indices.count : ModelUtility.getAttributeBySemantic(t, "POSITION").count, i = t.primitiveType; + i === PrimitiveType$1.POINTS ? e.pointsLength += n : PrimitiveType$1.isTriangles(i) && (e.trianglesLength += countTriangles(i, n)); + const r = t.attributes, o = r.length; + for (let l = 0; l < o; l++) { + const d = r[l]; + if (defined(d.buffer)) { + const f = defined(d.typedArray); + e.addBuffer(d.buffer, f); + } + } + const s = t.outlineCoordinates; + defined(s) && defined(s.buffer) && e.addBuffer(s.buffer, !1); + const c = t.indices; + if (defined(c) && defined(c.buffer)) { + const l = defined(c.typedArray); + e.addBuffer(c.buffer, l); + } +} +function countTriangles(e, t) { + switch (e) { + case PrimitiveType$1.TRIANGLES: + return t / 3; + case PrimitiveType$1.TRIANGLE_STRIP: + case PrimitiveType$1.TRIANGLE_FAN: + return Math.max(t - 2, 0); + default: + return 0; + } +} +function count2DPositions(e, t) { + const n = t.positionBuffer2D; + defined(n) && e.addBuffer(n, !0); +} +function countMorphTargetAttributes(e, t) { + const n = t.morphTargets; + if (!defined(n)) + return; + const i = !1, r = n.length; + for (let o = 0; o < r; o++) { + const s = n[o].attributes, c = s.length; + for (let l = 0; l < c; l++) { + const d = s[l]; + defined(d.buffer) && e.addBuffer(d.buffer, i); + } + } +} +function countMaterialTextures(e, t) { + const n = getAllTextureReaders(t), i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + defined(o) && defined(o.texture) && e.addTexture(o.texture); + } +} +function getAllTextureReaders(e) { + const t = e.metallicRoughness, n = [ + e.emissiveTexture, + e.normalTexture, + e.occlusionTexture, + t.baseColorTexture, + t.metallicRoughnessTexture + ], i = e.specularGlossiness; + return defined(i) && (n.push(i.diffuseTexture), n.push(i.specularGlossinessTexture)), n; +} +function countFeatureIdTextures(e, t) { + const n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i]; + if (r instanceof ModelComponents.FeatureIdTexture) { + const o = r.textureReader; + defined(o.texture) && e.addTexture(o.texture); + } + } +} +function countBinaryMetadata(e, t) { + const n = t.structuralMetadata; + defined(n) && (countPropertyTextures(e, n), e.propertyTablesByteLength += n.propertyTablesByteLength); + const i = t.featureTables; + if (!defined(i)) + return; + const r = i.length; + for (let o = 0; o < r; o++) { + const s = i[o]; + e.addBatchTexture(s.batchTexture); + } +} +function countPropertyTextures(e, t) { + const n = t.propertyTextures; + if (!defined(n)) + return; + const i = n.length; + for (let r = 0; r < i; r++) { + const s = n[r].properties; + for (const c in s) + if (s.hasOwnProperty(c)) { + const d = s[c].textureReader; + defined(d.texture) && e.addTexture(d.texture); + } + } +} +const scratchModelMatrix$3 = new Matrix4(), scratchModelView2D = new Matrix4(), SceneMode2DPipelineStage = { + name: "SceneMode2DPipelineStage" + // Helps with debugging +}; +SceneMode2DPipelineStage.process = function(e, t, n) { + const i = ModelUtility.getAttributeBySemantic( + t, + VertexAttributeSemantic$1.POSITION + ), r = e.shaderBuilder, o = e.model, s = o.sceneGraph.computedModelMatrix, c = e.runtimeNode.computedTransform, l = Matrix4.multiplyTransformation( + s, + c, + scratchModelMatrix$3 + ), d = computeBoundingSphere2D( + e, + l, + n + ), f = e.runtimePrimitive; + f.boundingSphere2D = d; + const h = e.runtimeNode.node.instances; + if (defined(h)) + return; + if (defined(i.typedArray)) { + const y = createPositionBufferFor2D( + i, + l, + d, + n + ); + f.positionBuffer2D = y, o._modelResources.push(y), i.typedArray = void 0; + } + r.addDefine( + "USE_2D_POSITIONS", + void 0, + ShaderDestination$1.VERTEX + ), r.addUniform("mat4", "u_modelView2D", ShaderDestination$1.VERTEX); + const p = Matrix4.fromTranslation( + d.center, + new Matrix4() + ), m = n.context, _ = { + u_modelView2D: function() { + return Matrix4.multiplyTransformation( + m.uniformState.view, + p, + scratchModelView2D + ); + } + }; + e.uniformMap = combine$2(_, e.uniformMap); +}; +const scratchProjectedMin = new Cartesian3(), scratchProjectedMax = new Cartesian3(); +function computeBoundingSphere2D(e, t, n) { + const i = Matrix4.multiplyByPoint( + t, + e.positionMin, + scratchProjectedMin + ), r = SceneTransforms.computeActualEllipsoidPosition( + n, + i, + i + ), o = Matrix4.multiplyByPoint( + t, + e.positionMax, + scratchProjectedMax + ), s = SceneTransforms.computeActualEllipsoidPosition( + n, + o, + o + ); + return BoundingSphere.fromCornerPoints( + r, + s, + new BoundingSphere() + ); +} +const scratchPosition$c = new Cartesian3(); +function dequantizePositionsTypedArray(e, t) { + const n = e.length, i = new Float32Array(n), r = t.quantizedVolumeOffset, o = t.quantizedVolumeStepSize; + for (let s = 0; s < n; s += 3) { + const c = Cartesian3.fromArray( + e, + s, + scratchPosition$c + ), l = Cartesian3.multiplyComponents( + c, + o, + c + ), d = Cartesian3.add( + l, + r, + l + ); + i[s] = d.x, i[s + 1] = d.y, i[s + 2] = d.z; + } + return i; +} +function createPositionsTypedArrayFor2D(e, t, n, i) { + let r; + defined(e.quantization) ? r = dequantizePositionsTypedArray( + e.typedArray, + e.quantization + ) : r = e.typedArray.slice(); + const o = e.byteOffset / Float32Array.BYTES_PER_ELEMENT, s = r.length, c = defined(e.byteStride) ? e.byteStride / Float32Array.BYTES_PER_ELEMENT : 3; + for (let l = o; l < s; l += c) { + const d = Cartesian3.fromArray(r, l, scratchPosition$c); + if (isNaN(d.x) || isNaN(d.y) || isNaN(d.z)) + continue; + const f = Matrix4.multiplyByPoint( + t, + d, + d + ), h = SceneTransforms.computeActualEllipsoidPosition( + i, + f, + f + ), p = Cartesian3.subtract( + h, + n, + h + ); + r[l] = p.x, r[l + 1] = p.y, r[l + 2] = p.z; + } + return r; +} +function createPositionBufferFor2D(e, t, n, i) { + const r = clone$1(i); + r.mode = SceneMode$1.COLUMBUS_VIEW; + const o = n.center, s = createPositionsTypedArrayFor2D( + e, + t, + o, + r + ), c = Buffer.createVertexBuffer({ + context: i.context, + typedArray: s, + usage: BufferUsage$1.STATIC_DRAW + }); + return c.vertexArrayDestroyable = !1, c; +} +const SkinningStageVS = `void skinningStage(inout ProcessedAttributes attributes) +{ + mat4 skinningMatrix = getSkinningMatrix(); + mat3 skinningMatrixMat3 = mat3(skinningMatrix); + + vec4 positionMC = vec4(attributes.positionMC, 1.0); + attributes.positionMC = vec3(skinningMatrix * positionMC); + + #ifdef HAS_NORMALS + vec3 normalMC = attributes.normalMC; + attributes.normalMC = skinningMatrixMat3 * normalMC; + #endif + + #ifdef HAS_TANGENTS + vec3 tangentMC = attributes.tangentMC; + attributes.tangentMC = skinningMatrixMat3 * tangentMC; + #endif +}`, SkinningPipelineStage = { + name: "SkinningPipelineStage", + // Helps with debugging + FUNCTION_ID_GET_SKINNING_MATRIX: "getSkinningMatrix", + FUNCTION_SIGNATURE_GET_SKINNING_MATRIX: "mat4 getSkinningMatrix()" +}; +SkinningPipelineStage.process = function(e, t) { + const n = e.shaderBuilder; + n.addDefine("HAS_SKINNING", void 0, ShaderDestination$1.VERTEX), addGetSkinningMatrixFunction(n, t); + const i = e.runtimeNode, r = i.computedJointMatrices; + n.addUniform( + "mat4", + `u_jointMatrices[${r.length}]`, + ShaderDestination$1.VERTEX + ), n.addVertexLines(SkinningStageVS); + const o = { + u_jointMatrices: function() { + return i.computedJointMatrices; + } + }; + e.uniformMap = combine$2(o, e.uniformMap); +}; +function getMaximumAttributeSetIndex(e) { + let t = -1; + const n = e.attributes, i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + (o.semantic === VertexAttributeSemantic$1.JOINTS || o.semantic === VertexAttributeSemantic$1.WEIGHTS) && (t = Math.max(t, o.setIndex)); + } + return t; +} +function addGetSkinningMatrixFunction(e, t) { + e.addFunction( + SkinningPipelineStage.FUNCTION_ID_GET_SKINNING_MATRIX, + SkinningPipelineStage.FUNCTION_SIGNATURE_GET_SKINNING_MATRIX, + ShaderDestination$1.VERTEX + ), e.addFunctionLines( + SkinningPipelineStage.FUNCTION_ID_GET_SKINNING_MATRIX, + ["mat4 skinnedMatrix = mat4(0);"] + ); + let i, r; + const o = ["x", "y", "z", "w"], s = getMaximumAttributeSetIndex(t); + for (i = 0; i <= s; i++) + for (r = 0; r <= 3; r++) { + const l = o[r], d = `skinnedMatrix += a_weights_${i}.${l} * u_jointMatrices[int(a_joints_${i}.${l})];`; + e.addFunctionLines( + SkinningPipelineStage.FUNCTION_ID_GET_SKINNING_MATRIX, + [d] + ); + } + e.addFunctionLines( + SkinningPipelineStage.FUNCTION_ID_GET_SKINNING_MATRIX, + ["return skinnedMatrix;"] + ); +} +const VerticalExaggerationStageVS = `void verticalExaggerationStage( + inout ProcessedAttributes attributes +) { + // Compute the distance from the camera to the local center of curvature. + vec4 vertexPositionENU = czm_modelToEnu * vec4(attributes.positionMC, 1.0); + vec2 vertexAzimuth = normalize(vertexPositionENU.xy); + // Curvature = 1 / radius of curvature. + float azimuthalCurvature = dot(vertexAzimuth * vertexAzimuth, czm_eyeEllipsoidCurvature); + float eyeToCenter = 1.0 / azimuthalCurvature + czm_eyeHeight; + + // Compute the approximate ellipsoid normal at the vertex position. + // Uses a circular approximation for the Earth curvature along the geodesic. + vec3 vertexPositionEC = (czm_modelView * vec4(attributes.positionMC, 1.0)).xyz; + vec3 centerToVertex = eyeToCenter * czm_eyeEllipsoidNormalEC + vertexPositionEC; + vec3 vertexNormal = normalize(centerToVertex); + + // Estimate the (sine of the) angle between the camera direction and the vertex normal + float verticalDistance = dot(vertexPositionEC, czm_eyeEllipsoidNormalEC); + float horizontalDistance = length(vertexPositionEC - verticalDistance * czm_eyeEllipsoidNormalEC); + float sinTheta = horizontalDistance / (eyeToCenter + verticalDistance); + bool isSmallAngle = clamp(sinTheta, 0.0, 0.05) == sinTheta; + + // Approximate the change in height above the ellipsoid, from camera to vertex position. + float exactVersine = 1.0 - dot(czm_eyeEllipsoidNormalEC, vertexNormal); + float smallAngleVersine = 0.5 * sinTheta * sinTheta; + float versine = isSmallAngle ? smallAngleVersine : exactVersine; + float dHeight = dot(vertexPositionEC, vertexNormal) - eyeToCenter * versine; + float vertexHeight = czm_eyeHeight + dHeight; + + // Transform the approximate vertex normal to model coordinates. + vec3 vertexNormalMC = (czm_inverseModelView * vec4(vertexNormal, 0.0)).xyz; + vertexNormalMC = normalize(vertexNormalMC); + + // Compute the exaggeration and apply it along the approximate vertex normal. + float stretch = u_verticalExaggerationAndRelativeHeight.x; + float shift = u_verticalExaggerationAndRelativeHeight.y; + float exaggeration = (vertexHeight - shift) * (stretch - 1.0); + attributes.positionMC += exaggeration * vertexNormalMC; +} +`, VerticalExaggerationPipelineStage = { + name: "VerticalExaggerationPipelineStage" + // Helps with debugging +}, scratchExaggerationUniform = new Cartesian2(); +VerticalExaggerationPipelineStage.process = function(e, t, n) { + const { shaderBuilder: i, uniformMap: r } = e; + i.addVertexLines(VerticalExaggerationStageVS), i.addDefine( + "HAS_VERTICAL_EXAGGERATION", + void 0, + ShaderDestination$1.VERTEX + ), i.addUniform( + "vec2", + "u_verticalExaggerationAndRelativeHeight", + ShaderDestination$1.VERTEX + ), r.u_verticalExaggerationAndRelativeHeight = function() { + return Cartesian2.fromElements( + n.verticalExaggeration, + n.verticalExaggerationRelativeHeight, + scratchExaggerationUniform + ); + }; +}; +const WireframeIndexGenerator = {}; +function createWireframeFromTriangles(e) { + const t = IndexDatatype$1.createTypedArray( + e, + e * 2 + ), n = e; + let i = 0; + for (let r = 0; r < n; r += 3) + t[i++] = r, t[i++] = r + 1, t[i++] = r + 1, t[i++] = r + 2, t[i++] = r + 2, t[i++] = r; + return t; +} +function createWireframeFromTriangleIndices(e, t) { + const n = t.length, i = IndexDatatype$1.createTypedArray( + e, + n * 2 + ); + let r = 0; + for (let o = 0; o < n; o += 3) { + const s = t[o], c = t[o + 1], l = t[o + 2]; + i[r++] = s, i[r++] = c, i[r++] = c, i[r++] = l, i[r++] = l, i[r++] = s; + } + return i; +} +function createWireframeFromTriangleStrip(e) { + const t = e - 2, n = 2 + t * 4, i = IndexDatatype$1.createTypedArray( + e, + n + ); + let r = 0; + i[r++] = 0, i[r++] = 1; + for (let o = 0; o < t; o++) + i[r++] = o + 1, i[r++] = o + 2, i[r++] = o + 2, i[r++] = o; + return i; +} +function createWireframeFromTriangleStripIndices(e, t) { + const i = t.length - 2, r = 2 + i * 4, o = IndexDatatype$1.createTypedArray( + e, + r + ); + let s = 0; + o[s++] = t[0], o[s++] = t[1]; + for (let c = 0; c < i; c++) { + const l = t[c], d = t[c + 1], f = t[c + 2]; + o[s++] = d, o[s++] = f, o[s++] = f, o[s++] = l; + } + return o; +} +function createWireframeFromTriangleFan(e) { + const t = e - 2, n = 2 + t * 4, i = IndexDatatype$1.createTypedArray( + e, + n + ); + let r = 0; + i[r++] = 0, i[r++] = 1; + for (let o = 0; o < t; o++) + i[r++] = o + 1, i[r++] = o + 2, i[r++] = o + 2, i[r++] = 0; + return i; +} +function createWireframeFromTriangleFanIndices(e, t) { + const i = t.length - 2, r = 2 + i * 4, o = IndexDatatype$1.createTypedArray( + e, + r + ); + let s = 0; + const c = t[0]; + o[s++] = c, o[s++] = t[1]; + for (let l = 0; l < i; l++) { + const d = t[l + 1], f = t[l + 2]; + o[s++] = d, o[s++] = f, o[s++] = f, o[s++] = c; + } + return o; +} +WireframeIndexGenerator.createWireframeIndices = function(e, t, n) { + const i = defined(n); + if (e === PrimitiveType$1.TRIANGLES) + return i ? createWireframeFromTriangleIndices(t, n) : createWireframeFromTriangles(t); + if (e === PrimitiveType$1.TRIANGLE_STRIP) + return i ? createWireframeFromTriangleStripIndices(t, n) : createWireframeFromTriangleStrip(t); + if (e === PrimitiveType$1.TRIANGLE_FAN) + return i ? createWireframeFromTriangleFanIndices(t, n) : createWireframeFromTriangleFan(t); +}; +WireframeIndexGenerator.getWireframeIndicesCount = function(e, t) { + return e === PrimitiveType$1.TRIANGLES ? t * 2 : e === PrimitiveType$1.TRIANGLE_STRIP || e === PrimitiveType$1.TRIANGLE_FAN ? 2 + (t - 2) * 4 : t; +}; +const WireframePipelineStage = { + name: "WireframePipelineStage" + // Helps with debugging +}; +WireframePipelineStage.process = function(e, t, n) { + e.shaderBuilder.addDefine( + "HAS_WIREFRAME", + void 0, + ShaderDestination$1.FRAGMENT + ); + const r = e.model, o = createWireframeIndexBuffer( + t, + e.indices, + n + ); + r._pipelineResources.push(o), e.wireframeIndexBuffer = o, r.statistics.addBuffer(o, !1); + const c = e.primitiveType, l = e.count; + e.primitiveType = PrimitiveType$1.LINES, e.count = WireframeIndexGenerator.getWireframeIndicesCount( + c, + l + ); +}; +function createWireframeIndexBuffer(e, t, n) { + const r = ModelUtility.getAttributeBySemantic( + e, + VertexAttributeSemantic$1.POSITION + ).count, o = n.context.webgl2; + let s; + if (defined(t)) { + const f = t.buffer, h = t.count; + defined(f) && o ? (s = f.sizeInBytes === h ? new Uint8Array(h) : IndexDatatype$1.createTypedArray(r, h), f.getBufferData(s)) : s = t.typedArray; + } + const c = e.primitiveType, l = WireframeIndexGenerator.createWireframeIndices( + c, + r, + s + ), d = IndexDatatype$1.fromSizeInBytes( + l.BYTES_PER_ELEMENT + ); + return Buffer.createIndexBuffer({ + context: n.context, + typedArray: l, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: d + }); +} +function ModelRuntimePrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.primitive, n = e.node, i = e.model; + this.primitive = t, this.node = n, this.model = i, this.pipelineStages = [], this.drawCommand = void 0, this.boundingSphere = void 0, this.boundingSphere2D = void 0, this.positionBuffer2D = void 0, this.batchLengths = void 0, this.batchOffsets = void 0, this.updateStages = []; +} +ModelRuntimePrimitive.prototype.configurePipeline = function(e) { + const t = this.pipelineStages; + t.length = 0; + const n = this.primitive, i = this.node, r = this.model, o = r.customShader, s = r.style, c = e.context.webgl2, d = e.mode !== SceneMode$1.SCENE3D && !e.scene3DOnly && r._projectTo2D, f = e.verticalExaggeration !== 1, h = defined(n.morphTargets) && n.morphTargets.length > 0, p = defined(i.skin), m = defined(o), y = !(m && defined(o.fragmentShaderText)) || o.mode !== CustomShaderMode$1.REPLACE_MATERIAL, C = ModelUtility.hasQuantizedAttributes( + n.attributes + ), T = r.debugWireframe && PrimitiveType$1.isTriangles(n.primitiveType) && // Generating index buffers for wireframes is always possible in WebGL2. + // However, this will only work in WebGL1 if the model was constructed with + // enableDebugWireframe set to true. + (r._enableDebugWireframe || c), x = r.pointCloudShading, b = defined(x) && x.attenuation, S = defined(x) && x.backFaceCulling, E = n.primitiveType === PrimitiveType$1.POINTS && (defined(s) || b || S), A = r._enableShowOutline && defined(n.outlineCoordinates), D = inspectFeatureIds(r, i, n), P = defined(r.classificationType); + d && t.push(SceneMode2DPipelineStage), t.push(GeometryPipelineStage), T && t.push(WireframePipelineStage), P && t.push(ClassificationPipelineStage), h && t.push(MorphTargetsPipelineStage), p && t.push(SkinningPipelineStage), E && t.push(PointCloudStylingPipelineStage), C && t.push(DequantizationPipelineStage), y && t.push(MaterialPipelineStage), t.push(FeatureIdPipelineStage), t.push(MetadataPipelineStage), D.hasPropertyTable && (t.push(SelectedFeatureIdPipelineStage), t.push(BatchTexturePipelineStage), t.push(CPUStylingPipelineStage)), f && t.push(VerticalExaggerationPipelineStage), m && t.push(CustomShaderPipelineStage), t.push(LightingPipelineStage), r.allowPicking && t.push(PickingPipelineStage), A && t.push(PrimitiveOutlinePipelineStage), t.push(AlphaPipelineStage), t.push(PrimitiveStatisticsPipelineStage); +}; +function inspectFeatureIds(e, t, n) { + let i; + return defined(t.instances) && (i = ModelUtility.getFeatureIdsByLabel( + t.instances.featureIds, + e.instanceFeatureIdLabel + ), defined(i)) ? { + hasFeatureIds: !0, + hasPropertyTable: defined(i.propertyTableId) + } : (i = ModelUtility.getFeatureIdsByLabel( + n.featureIds, + e.featureIdLabel + ), defined(i) ? { + hasFeatureIds: !0, + hasPropertyTable: defined(i.propertyTableId) + } : { + hasFeatureIds: !1, + hasPropertyTable: !1 + }); +} +function ModelSkin(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._sceneGraph = e.sceneGraph; + const t = e.skin; + this._skin = t, this._inverseBindMatrices = void 0, this._joints = [], this._jointMatrices = [], initialize$5(this); +} +Object.defineProperties(ModelSkin.prototype, { + /** + * The internal skin this runtime skin represents. + * + * @memberof ModelSkin.prototype + * @type {ModelComponents.Skin} + * @readonly + * + * @private + */ + skin: { + get: function() { + return this._skin; + } + }, + /** + * The scene graph this skin belongs to. + * + * @memberof ModelSkin.prototype + * @type {ModelSceneGraph} + * @readonly + * + * @private + */ + sceneGraph: { + get: function() { + return this._sceneGraph; + } + }, + /** + * The inverse bind matrices of the skin. + * + * @memberof ModelSkin.prototype + * @type {Matrix4[]} + * @readonly + * + * @private + */ + inverseBindMatrices: { + get: function() { + return this._inverseBindMatrices; + } + }, + /** + * The joints of the skin. + * + * @memberof ModelSkin.prototype + * @type {ModelRuntimeNode[]} + * @readonly + * + * @private + */ + joints: { + get: function() { + return this._joints; + } + }, + /** + * The joint matrices for the skin, where each joint matrix is computed as + * jointMatrix = jointWorldTransform * inverseBindMatrix. + * + * Each node that references this skin is responsible for pre-multiplying its inverse + * world transform to the joint matrices for its own use. + * + * @memberof ModelSkin.prototype + * @type {Matrix4[]} + * @readonly + * + * @private + */ + jointMatrices: { + get: function() { + return this._jointMatrices; + } + } +}); +function initialize$5(e) { + const t = e.skin, n = t.inverseBindMatrices; + e._inverseBindMatrices = n; + const i = t.joints, r = i.length, o = e.sceneGraph._runtimeNodes, s = e.joints, c = e._jointMatrices; + for (let l = 0; l < r; l++) { + const d = i[l].index, f = o[d]; + s.push(f); + const h = n[l], p = computeJointMatrix( + f, + h, + new Matrix4() + ); + c.push(p); + } +} +function computeJointMatrix(e, t, n) { + const i = Matrix4.multiplyTransformation( + e.transformToRoot, + e.transform, + n + ); + return n = Matrix4.multiplyTransformation( + i, + t, + n + ), n; +} +ModelSkin.prototype.updateJointMatrices = function() { + const e = this._jointMatrices, t = e.length; + for (let n = 0; n < t; n++) { + const i = this.joints[n], r = this.inverseBindMatrices[n]; + e[n] = computeJointMatrix( + i, + r, + e[n] + ); + } +}; +function ModelAlphaOptions() { + this.pass = void 0, this.alphaCutoff = void 0; +} +function ModelRenderResources(e) { + this.shaderBuilder = new ShaderBuilder(), this.model = e, this.uniformMap = {}, this.alphaOptions = new ModelAlphaOptions(), this.renderStateOptions = RenderState.getState( + RenderState.fromCache({ + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS_OR_EQUAL + } + }) + ), this.hasSilhouette = !1, this.hasSkipLevelOfDetail = !1; +} +const ModelSilhouetteStageFS = `void silhouetteStage(inout vec4 color) { + if(model_silhouettePass) { + color = czm_gammaCorrect(model_silhouetteColor); + } +}`, ModelSilhouetteStageVS = `void silhouetteStage(in ProcessedAttributes attributes, inout vec4 positionClip) { + #ifdef HAS_NORMALS + if(model_silhouettePass) { + vec3 normal = normalize(czm_normal3D * attributes.normalMC); + normal.x *= czm_projection[0][0]; + normal.y *= czm_projection[1][1]; + positionClip.xy += normal.xy * positionClip.w * model_silhouetteSize * czm_pixelRatio / czm_viewport.z; + } + #endif +} +`, ModelSilhouettePipelineStage = { + name: "ModelSilhouettePipelineStage" + // Helps with debugging +}; +ModelSilhouettePipelineStage.silhouettesLength = 0; +ModelSilhouettePipelineStage.process = function(e, t, n) { + defined(t._silhouetteId) || (t._silhouetteId = ++ModelSilhouettePipelineStage.silhouettesLength); + const i = e.shaderBuilder; + i.addDefine("HAS_SILHOUETTE", void 0, ShaderDestination$1.BOTH), i.addVertexLines(ModelSilhouetteStageVS), i.addFragmentLines(ModelSilhouetteStageFS), i.addUniform( + "vec4", + "model_silhouetteColor", + ShaderDestination$1.FRAGMENT + ), i.addUniform( + "float", + "model_silhouetteSize", + ShaderDestination$1.VERTEX + ), i.addUniform( + "bool", + "model_silhouettePass", + ShaderDestination$1.BOTH + ); + const r = { + model_silhouetteColor: function() { + return t.silhouetteColor; + }, + model_silhouetteSize: function() { + return t.silhouetteSize; + }, + model_silhouettePass: function() { + return !1; + } + }; + e.uniformMap = combine$2(r, e.uniformMap), e.hasSilhouette = !0; +}; +const ModelSplitterStageFS = `void modelSplitterStage() +{ + // Don't split when rendering the shadow map, because it is rendered from + // the perspective of a totally different camera. +#ifndef SHADOW_MAP + if (model_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; + if (model_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; +#endif +} +`, ModelSplitterPipelineStage = { + name: "ModelSplitterPipelineStage", + // Helps with debugging + SPLIT_DIRECTION_UNIFORM_NAME: "model_splitDirection" +}; +ModelSplitterPipelineStage.process = function(e, t, n) { + const i = e.shaderBuilder; + i.addDefine( + "HAS_MODEL_SPLITTER", + void 0, + ShaderDestination$1.FRAGMENT + ), i.addFragmentLines(ModelSplitterStageFS); + const r = {}; + i.addUniform( + "float", + ModelSplitterPipelineStage.SPLIT_DIRECTION_UNIFORM_NAME, + ShaderDestination$1.FRAGMENT + ), r[ModelSplitterPipelineStage.SPLIT_DIRECTION_UNIFORM_NAME] = function() { + return t.splitDirection; + }, e.uniformMap = combine$2( + r, + e.uniformMap + ); +}; +function NodeRenderResources(e, t) { + this.model = e.model, this.shaderBuilder = e.shaderBuilder.clone(), this.uniformMap = clone$1(e.uniformMap), this.alphaOptions = clone$1(e.alphaOptions), this.renderStateOptions = clone$1( + e.renderStateOptions, + !0 + ), this.hasSilhouette = e.hasSilhouette, this.hasSkipLevelOfDetail = e.hasSkipLevelOfDetail, this.runtimeNode = t, this.attributes = [], this.attributeIndex = 1, this.featureIdVertexAttributeSetIndex = 0, this.instanceCount = 0; +} +function ModelLightingOptions(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.lightingModel = defaultValue(e.lightingModel, LightingModel$1.UNLIT); +} +function PrimitiveRenderResources(e, t) { + this.model = e.model, this.runtimeNode = e.runtimeNode, this.attributes = e.attributes.slice(), this.attributeIndex = e.attributeIndex, this.featureIdVertexAttributeSetIndex = e.featureIdVertexAttributeSetIndex, this.uniformMap = clone$1(e.uniformMap), this.alphaOptions = clone$1(e.alphaOptions), this.renderStateOptions = clone$1(e.renderStateOptions, !0), this.hasSilhouette = e.hasSilhouette, this.hasSkipLevelOfDetail = e.hasSkipLevelOfDetail, this.shaderBuilder = e.shaderBuilder.clone(), this.instanceCount = e.instanceCount, this.runtimePrimitive = t; + const n = t.primitive; + this.count = defined(n.indices) ? n.indices.count : ModelUtility.getAttributeBySemantic(n, "POSITION").count, this.hasPropertyTable = !1, this.indices = n.indices, this.wireframeIndexBuffer = void 0, this.primitiveType = n.primitiveType; + const i = ModelUtility.getPositionMinMax( + n, + this.runtimeNode.instancingTranslationMin, + this.runtimeNode.instancingTranslationMax + ); + this.positionMin = Cartesian3.clone(i.min, new Cartesian3()), this.positionMax = Cartesian3.clone(i.max, new Cartesian3()), this.boundingSphere = BoundingSphere.fromCornerPoints( + this.positionMin, + this.positionMax, + new BoundingSphere() + ), this.lightingOptions = new ModelLightingOptions(), this.pickId = void 0; +} +function ModelSceneGraph(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.modelComponents; + this._model = e.model, this._components = t, this._pipelineStages = [], this._updateStages = [], this._runtimeNodes = [], this._rootNodes = [], this._skinnedNodes = [], this._runtimeSkins = [], this.modelPipelineStages = [], this._boundingSphere = void 0, this._boundingSphere2D = void 0, this._computedModelMatrix = Matrix4.clone(Matrix4.IDENTITY), this._computedModelMatrix2D = Matrix4.clone(Matrix4.IDENTITY), this._axisCorrectionMatrix = ModelUtility.getAxisCorrectionMatrix( + t.upAxis, + t.forwardAxis, + new Matrix4() + ), this._runtimeArticulations = {}, initialize$4(this); +} +Object.defineProperties(ModelSceneGraph.prototype, { + /** + * The model components this scene graph represents. + * + * @type {ModelComponents} + * @readonly + * + * @private + */ + components: { + get: function() { + return this._components; + } + }, + /** + * The axis-corrected model matrix. + * + * @type {Matrix4} + * @readonly + * + * @private + */ + computedModelMatrix: { + get: function() { + return this._computedModelMatrix; + } + }, + /** + * A matrix to correct from y-up in some model formats (e.g. glTF) to the + * z-up coordinate system Cesium uses. + * + * @type {Matrix4} + * @readonly + * + * @private + */ + axisCorrectionMatrix: { + get: function() { + return this._axisCorrectionMatrix; + } + }, + /** + * The bounding sphere containing all the primitives in the scene graph + * in model space. + * + * @type {BoundingSphere} + * @readonly + * + * @private + */ + boundingSphere: { + get: function() { + return this._boundingSphere; + } + } +}); +function initialize$4(e) { + const t = e._components, n = t.scene, r = e._model.modelMatrix; + computeModelMatrix(e, r); + const o = t.articulations, s = o.length, c = e._runtimeArticulations; + for (let x = 0; x < s; x++) { + const b = o[x], S = new ModelArticulation({ + articulation: b, + sceneGraph: e + }), E = S.name; + c[E] = S; + } + const l = t.nodes, d = l.length; + e._runtimeNodes = new Array(d); + const h = n.nodes.length, p = Matrix4.IDENTITY; + for (let x = 0; x < h; x++) { + const b = n.nodes[x], S = traverseAndCreateSceneGraph( + e, + b, + p + ); + e._rootNodes.push(S); + } + const m = t.skins, _ = e._runtimeSkins, y = m.length; + for (let x = 0; x < y; x++) { + const b = m[x]; + _.push( + new ModelSkin({ + skin: b, + sceneGraph: e + }) + ); + } + const C = e._skinnedNodes, T = C.length; + for (let x = 0; x < T; x++) { + const b = C[x], S = e._runtimeNodes[b], A = l[b].skin.index; + S._runtimeSkin = _[A], S.updateJointMatrices(); + } + e.applyArticulations(); +} +function computeModelMatrix(e, t) { + const n = e._components, i = e._model; + e._computedModelMatrix = Matrix4.multiplyTransformation( + t, + n.transform, + e._computedModelMatrix + ), e._computedModelMatrix = Matrix4.multiplyTransformation( + e._computedModelMatrix, + e._axisCorrectionMatrix, + e._computedModelMatrix + ), e._computedModelMatrix = Matrix4.multiplyByUniformScale( + e._computedModelMatrix, + i.computedScale, + e._computedModelMatrix + ); +} +const scratchComputedTranslation$1 = new Cartesian3(); +function computeModelMatrix2D(e, t) { + const n = e._computedModelMatrix, i = Matrix4.getTranslation( + n, + scratchComputedTranslation$1 + ); + if (!Cartesian3.equals(i, Cartesian3.ZERO)) + e._computedModelMatrix2D = Transforms.basisTo2D( + t.mapProjection, + n, + e._computedModelMatrix2D + ); + else { + const r = e.boundingSphere.center, o = Transforms.ellipsoidTo2DModelMatrix( + t.mapProjection, + r, + e._computedModelMatrix2D + ); + e._computedModelMatrix2D = Matrix4.multiply( + o, + n, + e._computedModelMatrix2D + ); + } + e._boundingSphere2D = BoundingSphere.transform( + e._boundingSphere, + e._computedModelMatrix2D, + e._boundingSphere2D + ); +} +function traverseAndCreateSceneGraph(e, t, n) { + const i = [], r = ModelUtility.getNodeTransform(t), o = t.children.length; + for (let f = 0; f < o; f++) { + const h = t.children[f], p = Matrix4.multiplyTransformation( + n, + r, + new Matrix4() + ), m = traverseAndCreateSceneGraph( + e, + h, + p + ); + i.push(m); + } + const s = new ModelRuntimeNode({ + node: t, + transform: r, + transformToRoot: n, + children: i, + sceneGraph: e + }), c = t.primitives.length; + for (let f = 0; f < c; f++) + s.runtimePrimitives.push( + new ModelRuntimePrimitive({ + primitive: t.primitives[f], + node: t, + model: e._model + }) + ); + const l = t.index; + e._runtimeNodes[l] = s, defined(t.skin) && e._skinnedNodes.push(l); + const d = t.name; + if (defined(d)) { + const f = e._model, h = new ModelNode(f, s); + f._nodesByName[d] = h; + } + return l; +} +const scratchModelPositionMin = new Cartesian3(), scratchModelPositionMax = new Cartesian3(), scratchPrimitivePositionMin = new Cartesian3(), scratchPrimitivePositionMax = new Cartesian3(); +ModelSceneGraph.prototype.buildDrawCommands = function(e) { + const t = this._model, n = new ModelRenderResources(t); + t.statistics.clear(), this.configurePipeline(e); + const i = this.modelPipelineStages; + let r, o, s; + for (r = 0; r < i.length; r++) + i[r].process(n, t, e); + const c = Cartesian3.fromElements( + Number.MAX_VALUE, + Number.MAX_VALUE, + Number.MAX_VALUE, + scratchModelPositionMin + ), l = Cartesian3.fromElements( + -Number.MAX_VALUE, + -Number.MAX_VALUE, + -Number.MAX_VALUE, + scratchModelPositionMax + ); + for (r = 0; r < this._runtimeNodes.length; r++) { + const d = this._runtimeNodes[r]; + if (!defined(d)) + continue; + d.configurePipeline(); + const f = d.pipelineStages, h = new NodeRenderResources( + n, + d + ); + for (o = 0; o < f.length; o++) + f[o].process( + h, + d.node, + e + ); + const p = d.computedTransform; + for (o = 0; o < d.runtimePrimitives.length; o++) { + const m = d.runtimePrimitives[o]; + m.configurePipeline(e); + const _ = m.pipelineStages, y = new PrimitiveRenderResources( + h, + m + ); + for (s = 0; s < _.length; s++) + _[s].process( + y, + m.primitive, + e + ); + m.boundingSphere = BoundingSphere.clone( + y.boundingSphere, + new BoundingSphere() + ); + const C = Matrix4.multiplyByPoint( + p, + y.positionMin, + scratchPrimitivePositionMin + ), T = Matrix4.multiplyByPoint( + p, + y.positionMax, + scratchPrimitivePositionMax + ); + Cartesian3.minimumByComponent( + c, + C, + c + ), Cartesian3.maximumByComponent( + l, + T, + l + ); + const x = buildDrawCommand( + y, + e + ); + m.drawCommand = x; + } + } + this._boundingSphere = BoundingSphere.fromCornerPoints( + c, + l, + new BoundingSphere() + ), this._boundingSphere = BoundingSphere.transformWithoutScale( + this._boundingSphere, + this._axisCorrectionMatrix, + this._boundingSphere + ), this._boundingSphere = BoundingSphere.transform( + this._boundingSphere, + this._components.transform, + this._boundingSphere + ), t._boundingSphere = BoundingSphere.transform( + this._boundingSphere, + t.modelMatrix, + t._boundingSphere + ), t._initialRadius = t._boundingSphere.radius, t._boundingSphere.radius *= t._clampedScale; +}; +ModelSceneGraph.prototype.configurePipeline = function(e) { + const t = this.modelPipelineStages; + t.length = 0; + const n = this._model, i = e.fog.enabled && e.fog.renderable; + defined(n.color) && t.push(ModelColorPipelineStage), !defined(n.classificationType) && (typeof globalThis < "u" && globalThis.useVcsCustomShading || n.imageBasedLighting.enabled && t.push(ImageBasedLightingPipelineStage), n.isClippingEnabled() && t.push(ModelClippingPlanesPipelineStage), n.isClippingPolygonsEnabled() && t.push(ModelClippingPolygonsPipelineStage), n.hasSilhouette(e) && t.push(ModelSilhouettePipelineStage), defined(n.splitDirection) && n.splitDirection !== SplitDirection$1.NONE && t.push(ModelSplitterPipelineStage), ModelType$1.is3DTiles(n.type) && t.push(TilesetPipelineStage), i && t.push(AtmospherePipelineStage)); +}; +ModelSceneGraph.prototype.update = function(e, t) { + let n, i, r; + for (n = 0; n < this._runtimeNodes.length; n++) { + const o = this._runtimeNodes[n]; + if (!defined(o)) + continue; + for (i = 0; i < o.updateStages.length; i++) + o.updateStages[i].update(o, this, e); + const s = e.mode !== SceneMode$1.SCENE3D && this._model._projectTo2D; + for (t && !s && this.updateJointMatrices(), i = 0; i < o.runtimePrimitives.length; i++) { + const c = o.runtimePrimitives[i]; + for (r = 0; r < c.updateStages.length; r++) + c.updateStages[r].update(c, this); + } + } +}; +ModelSceneGraph.prototype.updateModelMatrix = function(e, t) { + computeModelMatrix(this, e), t.mode !== SceneMode$1.SCENE3D && computeModelMatrix2D(this, t); + const n = this._rootNodes; + for (let i = 0; i < n.length; i++) { + const r = this._runtimeNodes[n[i]]; + r._transformDirty = !0; + } +}; +ModelSceneGraph.prototype.updateJointMatrices = function() { + const e = this._skinnedNodes, t = e.length; + for (let n = 0; n < t; n++) { + const i = e[n]; + this._runtimeNodes[i].updateJointMatrices(); + } +}; +function traverseSceneGraph(e, t, n, i, r) { + if (n && !t.show) + return; + const o = t.children.length; + for (let l = 0; l < o; l++) { + const d = t.getChild(l); + traverseSceneGraph( + e, + d, + n, + i, + r + ); + } + const s = t.runtimePrimitives, c = s.length; + for (let l = 0; l < c; l++) { + const d = s[l]; + i(d, r); + } +} +function forEachRuntimePrimitive(e, t, n, i) { + const r = e._rootNodes, o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s], l = e._runtimeNodes[c]; + traverseSceneGraph( + e, + l, + t, + n, + i + ); + } +} +const scratchBackFaceCullingOptions = { + backFaceCulling: void 0 +}; +ModelSceneGraph.prototype.updateBackFaceCulling = function(e) { + const t = scratchBackFaceCullingOptions; + t.backFaceCulling = e, forEachRuntimePrimitive( + this, + !1, + updatePrimitiveBackFaceCulling, + t + ); +}; +function updatePrimitiveBackFaceCulling(e, t) { + const n = e.drawCommand; + n.backFaceCulling = t.backFaceCulling; +} +const scratchShadowOptions = { + shadowMode: void 0 +}; +ModelSceneGraph.prototype.updateShadows = function(e) { + const t = scratchShadowOptions; + t.shadowMode = e, forEachRuntimePrimitive(this, !1, updatePrimitiveShadows, t); +}; +function updatePrimitiveShadows(e, t) { + const n = e.drawCommand; + n.shadows = t.shadowMode; +} +const scratchShowBoundingVolumeOptions = { + debugShowBoundingVolume: void 0 +}; +ModelSceneGraph.prototype.updateShowBoundingVolume = function(e) { + const t = scratchShowBoundingVolumeOptions; + t.debugShowBoundingVolume = e, forEachRuntimePrimitive( + this, + !1, + updatePrimitiveShowBoundingVolume, + t + ); +}; +function updatePrimitiveShowBoundingVolume(e, t) { + const n = e.drawCommand; + n.debugShowBoundingVolume = t.debugShowBoundingVolume; +} +const scratchSilhouetteCommands = [], scratchPushDrawCommandOptions = { + frameState: void 0, + hasSilhouette: void 0 +}; +ModelSceneGraph.prototype.pushDrawCommands = function(e) { + const t = scratchSilhouetteCommands; + t.length = 0; + const n = scratchPushDrawCommandOptions; + n.hasSilhouette = this._model.hasSilhouette(e), n.frameState = e, forEachRuntimePrimitive( + this, + !0, + pushPrimitiveDrawCommands, + n + ), e.commandList.push.apply(e.commandList, t); +}; +function pushPrimitiveDrawCommands(e, t) { + const n = t.frameState, i = t.hasSilhouette, r = n.passes, o = scratchSilhouetteCommands, s = e.drawCommand; + s.pushCommands(n, n.commandList), i && !r.pick && s.pushSilhouetteCommands(n, o); +} +ModelSceneGraph.prototype.setArticulationStage = function(e, t) { + const n = e.split(" "); + if (n.length !== 2) + return; + const i = n[0], r = n[1], o = this._runtimeArticulations[i]; + defined(o) && o.setArticulationStage(r, t); +}; +ModelSceneGraph.prototype.applyArticulations = function() { + const e = this._runtimeArticulations; + for (const t in e) + e.hasOwnProperty(t) && e[t].apply(); +}; +function ModelStatistics() { + this.pointsLength = 0, this.trianglesLength = 0, this.geometryByteLength = 0, this.texturesByteLength = 0, this.propertyTablesByteLength = 0, this._bufferIdSet = {}, this._textureIdSet = {}, this._batchTextureIdMap = new AssociativeArray(); +} +Object.defineProperties(ModelStatistics.prototype, { + /** + * Total size of the batch textures used for picking and styling. + * Batch textures are created asynchronously, so this iterates + * over the textures to ensure their memory values are accurate. + * + * @memberof ModelStatistics.prototype + * + * @type {number} + * @readonly + * + * @private + */ + batchTexturesByteLength: { + get: function() { + const e = this._batchTextureIdMap.length, t = this._batchTextureIdMap.values; + let n = 0; + for (let i = 0; i < e; i++) + n += t[i].byteLength; + return n; + } + } +}); +ModelStatistics.prototype.clear = function() { + this.pointsLength = 0, this.trianglesLength = 0, this.geometryByteLength = 0, this.texturesByteLength = 0, this.propertyTablesByteLength = 0, this._bufferIdSet = {}, this._textureIdSet = {}, this._batchTextureIdMap.removeAll(); +}; +ModelStatistics.prototype.addBuffer = function(e, t) { + if (!this._bufferIdSet.hasOwnProperty(e._id)) { + const n = t ? 2 : 1; + this.geometryByteLength += e.sizeInBytes * n; + } + this._bufferIdSet[e._id] = !0; +}; +ModelStatistics.prototype.addTexture = function(e) { + this._textureIdSet.hasOwnProperty(e._id) || (this.texturesByteLength += e.sizeInBytes), this._textureIdSet[e._id] = !0; +}; +ModelStatistics.prototype.addBatchTexture = function(e) { + this._batchTextureIdMap.contains(e._id) || this._batchTextureIdMap.set(e._id, e); +}; +const PntsParser = {}, sizeOfUint32$2 = Uint32Array.BYTES_PER_ELEMENT; +PntsParser.parse = function(e, t) { + t = defaultValue(t, 0); + const n = new Uint8Array(e), i = new DataView(e); + t += sizeOfUint32$2; + const r = i.getUint32(t, !0); + if (r !== 1) + throw new RuntimeError( + `Only Point Cloud tile version 1 is supported. Version ${r} is not.` + ); + t += sizeOfUint32$2, t += sizeOfUint32$2; + const o = i.getUint32(t, !0); + if (o === 0) + throw new RuntimeError( + "Feature table must have a byte length greater than zero" + ); + t += sizeOfUint32$2; + const s = i.getUint32(t, !0); + t += sizeOfUint32$2; + const c = i.getUint32(t, !0); + t += sizeOfUint32$2; + const l = i.getUint32(t, !0); + t += sizeOfUint32$2; + const d = getJsonFromTypedArray( + n, + t, + o + ); + t += o; + const f = new Uint8Array( + e, + t, + s + ); + t += s; + let h, p; + c > 0 && (h = getJsonFromTypedArray( + n, + t, + c + ), t += c, l > 0 && (p = new Uint8Array( + e, + t, + l + ), t += l)); + const m = new Cesium3DTileFeatureTable( + d, + f + ), _ = m.getGlobalProperty("POINTS_LENGTH"); + if (m.featuresLength = _, !defined(_)) + throw new RuntimeError( + "Feature table global property: POINTS_LENGTH must be defined" + ); + let y = m.getGlobalProperty( + "RTC_CENTER", + ComponentDatatype$1.FLOAT, + 3 + ); + defined(y) && (y = Cartesian3.unpack(y)); + const C = parseDracoProperties(m, h); + if (C.rtcCenter = y, C.pointsLength = _, !C.hasPositions) { + const T = parsePositions(m); + C.positions = T, C.hasPositions = C.hasPositions || defined(T); + } + if (!C.hasPositions) + throw new RuntimeError( + "Either POSITION or POSITION_QUANTIZED must be defined." + ); + if (!C.hasNormals) { + const T = parseNormals(m); + C.normals = T, C.hasNormals = C.hasNormals || defined(T); + } + if (!C.hasColors) { + const T = parseColors(m); + C.colors = T, C.hasColors = C.hasColors || defined(T), C.hasConstantColor = defined(C.constantColor), C.isTranslucent = defined(T) && T.isTranslucent; + } + if (!C.hasBatchIds) { + const T = parseBatchIds(m); + C.batchIds = T, C.hasBatchIds = C.hasBatchIds || defined(T); + } + if (C.hasBatchIds) { + const T = m.getGlobalProperty("BATCH_LENGTH"); + if (!defined(T)) + throw new RuntimeError( + "Global property: BATCH_LENGTH must be defined when BATCH_ID is defined." + ); + C.batchLength = T; + } + return defined(p) && (p = new Uint8Array(p), C.batchTableJson = h, C.batchTableBinary = p), C; +}; +function parseDracoProperties(e, t) { + const n = e.json; + let i, r, o; + const s = defined(n.extensions) ? n.extensions["3DTILES_draco_point_compression"] : void 0, c = defined(t) && defined(t.extensions) ? t.extensions["3DTILES_draco_point_compression"] : void 0; + defined(c) && (o = c.properties); + let l, d, f, h, p; + if (defined(s)) { + r = s.properties; + const _ = s.byteOffset, y = s.byteLength; + if (!defined(r) || !defined(_) || !defined(y)) + throw new RuntimeError( + "Draco properties, byteOffset, and byteLength must be defined" + ); + i = e.buffer.slice( + _, + _ + y + ), l = defined(r.POSITION), d = defined(r.RGB) || defined(r.RGBA), f = defined(r.NORMAL), h = defined(r.BATCH_ID), p = defined(r.RGBA); + } + let m; + return defined(i) && (m = { + buffer: i, + featureTableProperties: r, + batchTableProperties: o, + properties: combine$2( + r, + o + ), + dequantizeInShader: !0 + }), { + draco: m, + hasPositions: l, + hasColors: d, + isTranslucent: p, + hasNormals: f, + hasBatchIds: h + }; +} +function parsePositions(e) { + const t = e.json; + let n; + if (defined(t.POSITION)) + return n = e.getPropertyArray( + "POSITION", + ComponentDatatype$1.FLOAT, + 3 + ), { + name: VertexAttributeSemantic$1.POSITION, + semantic: VertexAttributeSemantic$1.POSITION, + typedArray: n, + isQuantized: !1, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3 + }; + if (defined(t.POSITION_QUANTIZED)) { + n = e.getPropertyArray( + "POSITION_QUANTIZED", + ComponentDatatype$1.UNSIGNED_SHORT, + 3 + ); + const i = e.getGlobalProperty( + "QUANTIZED_VOLUME_SCALE", + ComponentDatatype$1.FLOAT, + 3 + ); + if (!defined(i)) + throw new RuntimeError( + "Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions." + ); + const r = 65535, o = e.getGlobalProperty( + "QUANTIZED_VOLUME_OFFSET", + ComponentDatatype$1.FLOAT, + 3 + ); + if (!defined(o)) + throw new RuntimeError( + "Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions." + ); + return { + name: VertexAttributeSemantic$1.POSITION, + semantic: VertexAttributeSemantic$1.POSITION, + typedArray: n, + isQuantized: !0, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3, + quantizedRange: r, + quantizedVolumeOffset: Cartesian3.unpack(o), + quantizedVolumeScale: Cartesian3.unpack(i), + quantizedComponentDatatype: ComponentDatatype$1.UNSIGNED_SHORT, + quantizedType: AttributeType$1.VEC3 + }; + } +} +function parseColors(e) { + const t = e.json; + let n; + if (defined(t.RGBA)) + return n = e.getPropertyArray( + "RGBA", + ComponentDatatype$1.UNSIGNED_BYTE, + 4 + ), { + name: VertexAttributeSemantic$1.COLOR, + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + typedArray: n, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + type: AttributeType$1.VEC4, + normalized: !0, + isRGB565: !1, + isTranslucent: !0 + }; + if (defined(t.RGB)) + return n = e.getPropertyArray( + "RGB", + ComponentDatatype$1.UNSIGNED_BYTE, + 3 + ), { + name: "COLOR", + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + typedArray: n, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + type: AttributeType$1.VEC3, + normalized: !0, + isRGB565: !1, + isTranslucent: !1 + }; + if (defined(t.RGB565)) + return n = e.getPropertyArray( + "RGB565", + ComponentDatatype$1.UNSIGNED_SHORT, + 1 + ), { + name: "COLOR", + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + typedArray: n, + // These settings are for the Model implementation + // which decodes on the CPU and uploads a VEC3 of float colors. + // PointCloud does the decoding on the GPU so uploads a + // UNSIGNED_SHORT instead. + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3, + normalized: !1, + isRGB565: !0, + isTranslucent: !1 + }; + if (defined(t.CONSTANT_RGBA)) { + const i = e.getGlobalProperty( + "CONSTANT_RGBA", + ComponentDatatype$1.UNSIGNED_BYTE, + 4 + ), r = i[3], o = Color.fromBytes( + i[0], + i[1], + i[2], + r + ), s = r < 255; + return { + name: VertexAttributeSemantic$1.COLOR, + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + constantColor: o, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC4, + isQuantized: !1, + isTranslucent: s + }; + } +} +function parseNormals(e) { + const t = e.json; + let n; + if (defined(t.NORMAL)) + return n = e.getPropertyArray( + "NORMAL", + ComponentDatatype$1.FLOAT, + 3 + ), { + name: VertexAttributeSemantic$1.NORMAL, + semantic: VertexAttributeSemantic$1.NORMAL, + typedArray: n, + octEncoded: !1, + octEncodedZXY: !1, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3 + }; + if (defined(t.NORMAL_OCT16P)) + return n = e.getPropertyArray( + "NORMAL_OCT16P", + ComponentDatatype$1.UNSIGNED_BYTE, + 2 + ), { + name: VertexAttributeSemantic$1.NORMAL, + semantic: VertexAttributeSemantic$1.NORMAL, + typedArray: n, + octEncoded: !0, + octEncodedZXY: !1, + quantizedRange: (1 << 8) - 1, + quantizedType: AttributeType$1.VEC2, + quantizedComponentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3 + }; +} +function parseBatchIds(e) { + const t = e.json; + if (defined(t.BATCH_ID)) { + const n = e.getPropertyArray( + "BATCH_ID", + ComponentDatatype$1.UNSIGNED_SHORT, + 1 + ); + return { + name: VertexAttributeSemantic$1.FEATURE_ID, + semantic: VertexAttributeSemantic$1.FEATURE_ID, + setIndex: 0, + typedArray: n, + componentDatatype: ComponentDatatype$1.fromTypedArray(n), + type: AttributeType$1.SCALAR + }; + } +} +const Components = ModelComponents.Components, Scene$1 = ModelComponents.Scene, Node$1 = ModelComponents.Node, Primitive = ModelComponents.Primitive, Attribute = ModelComponents.Attribute, Quantization = ModelComponents.Quantization, FeatureIdAttribute = ModelComponents.FeatureIdAttribute, Material = ModelComponents.Material, MetallicRoughness = ModelComponents.MetallicRoughness; +function PntsLoader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.arrayBuffer, n = defaultValue(e.byteOffset, 0); + this._arrayBuffer = t, this._byteOffset = n, this._loadAttributesFor2D = defaultValue(e.loadAttributesFor2D, !1), this._parsedContent = void 0, this._decodePromise = void 0, this._decodedAttributes = void 0, this._promise = void 0, this._error = void 0, this._state = ResourceLoaderState$1.UNLOADED, this._buffers = [], this._components = void 0, this._transform = Matrix4.IDENTITY; +} +defined(Object.create) && (PntsLoader.prototype = Object.create(ResourceLoader.prototype), PntsLoader.prototype.constructor = PntsLoader); +Object.defineProperties(PntsLoader.prototype, { + /** + * The cache key of the resource + * + * @memberof PntsLoader.prototype + * + * @type {string} + * @readonly + * @private + */ + cacheKey: { + get: function() { + } + }, + /** + * The loaded components. + * + * @memberof PntsLoader.prototype + * + * @type {ModelComponents.Components} + * @readonly + * @private + */ + components: { + get: function() { + return this._components; + } + }, + /** + * A world-space transform to apply to the primitives. + * See {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/PointCloud#global-semantics} + * + * @memberof PntsLoader.prototype + * + * @type {Matrix4} + * @readonly + * @private + */ + transform: { + get: function() { + return this._transform; + } + } +}); +PntsLoader.prototype.load = function() { + if (defined(this._promise)) + return this._promise; + this._parsedContent = PntsParser.parse(this._arrayBuffer, this._byteOffset), this._state = ResourceLoaderState$1.PROCESSING, this._promise = Promise.resolve(this); +}; +PntsLoader.prototype.process = function(e) { + if (defined(this._error)) { + const t = this._error; + throw this._error = void 0, t; + } + if (this._state === ResourceLoaderState$1.READY) + return !0; + if (this._state === ResourceLoaderState$1.PROCESSING) { + if (defined(this._decodePromise)) + return !1; + this._decodePromise = decodeDraco$1(this, e.context); + } + return !1; +}; +function decodeDraco$1(e, t) { + const i = e._parsedContent.draco; + let r; + if (defined(i) ? r = DracoLoader.decodePointCloud(i, t) : r = Promise.resolve(), !!defined(r)) + return e._decodePromise = r, r.then(function(o) { + if (!e.isDestroyed()) + return defined(o) && processDracoAttributes(e, i, o), makeComponents(e, t), e._state = ResourceLoaderState$1.READY, e; + }).catch(function(o) { + e.unload(), e._state = ResourceLoaderState$1.FAILED; + const s = "Failed to load Draco pnts"; + e._error = e.getError(s, o); + }); +} +function processDracoAttributes(e, t, n) { + e._state = ResourceLoaderState$1.READY; + const i = e._parsedContent; + let r; + if (defined(n.POSITION)) { + if (r = { + name: "POSITION", + semantic: VertexAttributeSemantic$1.POSITION, + typedArray: n.POSITION.array, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3, + isQuantized: !1 + }, defined(n.POSITION.data.quantization)) { + const c = n.POSITION.data.quantization, l = c.range, d = Cartesian3.fromElements(l, l, l), f = Cartesian3.unpack(c.minValues), h = (1 << c.quantizationBits) - 1; + r.isQuantized = !0, r.quantizedRange = h, r.quantizedVolumeOffset = f, r.quantizedVolumeScale = d, r.quantizedComponentDatatype = h <= 255 ? ComponentDatatype$1.UNSIGNED_BYTE : ComponentDatatype$1.UNSIGNED_SHORT, r.quantizedType = AttributeType$1.VEC3; + } + i.positions = r; + } + if (defined(n.NORMAL)) { + if (r = { + name: "NORMAL", + semantic: VertexAttributeSemantic$1.NORMAL, + typedArray: n.NORMAL.array, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC3, + isQuantized: !1, + octEncoded: !1, + octEncodedZXY: !1 + }, defined(n.NORMAL.data.quantization)) { + const c = (1 << n.NORMAL.data.quantization.quantizationBits) - 1; + r.quantizedRange = c, r.octEncoded = !0, r.octEncodedZXY = !0, r.quantizedComponentDatatype = ComponentDatatype$1.UNSIGNED_BYTE, r.quantizedType = AttributeType$1.VEC2; + } + i.normals = r; + } + if (defined(n.RGBA) ? i.colors = { + name: "COLOR", + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + typedArray: n.RGBA.array, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + type: AttributeType$1.VEC4, + normalized: !0, + isTranslucent: !0 + } : defined(n.RGB) && (i.colors = { + name: "COLOR", + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + typedArray: n.RGB.array, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + type: AttributeType$1.VEC3, + normalized: !0, + isTranslucent: !1 + }), defined(n.BATCH_ID)) { + const c = n.BATCH_ID.array; + i.batchIds = { + name: "_FEATURE_ID", + semantic: VertexAttributeSemantic$1.FEATURE_ID, + setIndex: 0, + typedArray: c, + componentDatatype: ComponentDatatype$1.fromTypedArray(c), + type: AttributeType$1.SCALAR + }; + } + let o = i.batchTableJson; + const s = t.batchTableProperties; + for (const c in s) + if (s.hasOwnProperty(c)) { + const l = n[c]; + defined(o) || (o = {}), i.hasDracoBatchTable = !0; + const d = l.data; + o[c] = { + byteOffset: d.byteOffset, + // Draco returns the results like glTF values, but here + // we want to transcode to a batch table. It's redundant + // but necessary to use parseBatchTable() + type: transcodeAttributeType(d.componentsPerAttribute), + componentType: transcodeComponentType(d.componentDatatype), + // Each property is stored as a separate typed array, so + // store it here. parseBatchTable() will check for this + // instead of the entire binary body. + typedArray: l.array + }; + } + i.batchTableJson = o; +} +function transcodeAttributeType(e) { + switch (e) { + case 1: + return "SCALAR"; + case 2: + return "VEC2"; + case 3: + return "VEC3"; + case 4: + return "VEC4"; + } +} +function transcodeComponentType(e) { + switch (e) { + case WebGLConstants$1.BYTE: + return "BYTE"; + case WebGLConstants$1.UNSIGNED_BYTE: + return "UNSIGNED_BYTE"; + case WebGLConstants$1.SHORT: + return "SHORT"; + case WebGLConstants$1.UNSIGNED_SHORT: + return "UNSIGNED_SHORT"; + case WebGLConstants$1.INT: + return "INT"; + case WebGLConstants$1.UNSIGNED_INT: + return "UNSIGNED_INT"; + case WebGLConstants$1.DOUBLE: + return "DOUBLE"; + case WebGLConstants$1.FLOAT: + return "FLOAT"; + } +} +function makeAttribute(e, t, n) { + let i = t.typedArray, r; + if (t.octEncoded && (r = new Quantization(), r.octEncoded = t.octEncoded, r.octEncodedZXY = t.octEncodedZXY, r.normalizationRange = t.quantizedRange, r.type = t.quantizedType, r.componentDatatype = t.quantizedComponentDatatype), t.isQuantized) { + r = new Quantization(); + const c = t.quantizedRange; + r.normalizationRange = c, r.quantizedVolumeOffset = Cartesian3.ZERO; + const l = t.quantizedVolumeScale; + r.quantizedVolumeDimensions = l, r.quantizedVolumeStepSize = Cartesian3.divideByScalar( + l, + c, + new Cartesian3() + ), r.componentDatatype = t.quantizedComponentDatatype, r.type = t.quantizedType; + } + const o = new Attribute(); + if (o.name = t.name, o.semantic = t.semantic, o.setIndex = t.setIndex, o.componentDatatype = t.componentDatatype, o.type = t.type, o.normalized = defaultValue(t.normalized, !1), o.min = t.min, o.max = t.max, o.quantization = r, t.isRGB565 && (i = AttributeCompression.decodeRGB565(i)), defined(t.constantColor)) { + const c = new Array(4); + o.constant = Color.pack(t.constantColor, c); + } else { + const c = Buffer.createVertexBuffer({ + typedArray: i, + context: n, + usage: BufferUsage$1.STATIC_DRAW + }); + c.vertexArrayDestroyable = !1, e._buffers.push(c), o.buffer = c; + } + const s = e._loadAttributesFor2D; + return o.semantic === VertexAttributeSemantic$1.POSITION && s && (o.typedArray = i), o; +} +let randomNumberGenerator$1, randomValues$1; +function getRandomValues$2(e) { + if (!defined(randomValues$1)) { + randomNumberGenerator$1 = new MersenneTwister$1(0), randomValues$1 = new Array(e); + for (let t = 0; t < e; ++t) + randomValues$1[t] = randomNumberGenerator$1.random(); + } + return randomValues$1; +} +const scratchMin$2 = new Cartesian3(), scratchMax$2 = new Cartesian3(), scratchPosition$b = new Cartesian3(); +function computeApproximateExtrema(e) { + const t = e.typedArray, n = 20, i = t.length / 3, r = Math.min(i, n), o = getRandomValues$2(n), s = Number.MAX_VALUE, c = -Number.MAX_VALUE; + let l = Cartesian3.fromElements(s, s, s, scratchMin$2), d = Cartesian3.fromElements(c, c, c, scratchMax$2), f, h, p; + if (e.isQuantized) + l = Cartesian3.ZERO, d = e.quantizedVolumeScale; + else + for (f = 0; f < r; ++f) + h = Math.floor(o[f] * i), p = Cartesian3.unpack(t, h * 3, scratchPosition$b), Cartesian3.minimumByComponent(l, p, l), Cartesian3.maximumByComponent(d, p, d); + e.min = Cartesian3.clone(l), e.max = Cartesian3.clone(d); +} +const defaultColorAttribute = { + name: VertexAttributeSemantic$1.COLOR, + semantic: VertexAttributeSemantic$1.COLOR, + setIndex: 0, + constantColor: Color.DARKGRAY, + componentDatatype: ComponentDatatype$1.FLOAT, + type: AttributeType$1.VEC4, + isQuantized: !1, + isTranslucent: !1 +}; +function makeAttributes(e, t, n) { + const i = []; + let r; + const o = t.positions; + return defined(o) && (computeApproximateExtrema(o), r = makeAttribute(e, o, n), r.count = t.pointsLength, i.push(r)), defined(t.normals) && (r = makeAttribute(e, t.normals, n), i.push(r)), defined(t.colors) ? (r = makeAttribute(e, t.colors, n), i.push(r)) : (r = makeAttribute(e, defaultColorAttribute, n), i.push(r)), defined(t.batchIds) && (r = makeAttribute(e, t.batchIds, n), i.push(r)), i; +} +function makeStructuralMetadata(e, t) { + const n = e.batchLength, i = e.pointsLength, r = e.batchTableBinary, o = !defined(e.batchIds); + if (defined(r) || e.hasDracoBatchTable) { + const s = defaultValue(n, i); + return parseBatchTable({ + count: s, + batchTable: e.batchTableJson, + binaryBody: r, + parseAsPropertyAttributes: o, + customAttributeOutput: t + }); + } + return new StructuralMetadata({ + schema: {}, + propertyTables: [] + }); +} +function makeComponents(e, t) { + const n = e._parsedContent, i = new MetallicRoughness(); + i.metallicFactor = 0, i.roughnessFactor = 0.9; + const r = new Material(); + r.metallicRoughness = i; + const o = n.colors; + defined(o) && o.isTranslucent && (r.alphaMode = AlphaMode$1.BLEND); + const s = !defined(n.normals); + r.unlit = s; + const c = new Primitive(); + if (c.attributes = makeAttributes(e, n, t), c.primitiveType = PrimitiveType$1.POINTS, c.material = r, defined(n.batchIds)) { + const m = new FeatureIdAttribute(); + m.propertyTableId = 0, m.setIndex = 0, m.positionalLabel = "featureId_0", c.featureIds.push(m); + } + const l = new Node$1(); + l.index = 0, l.primitives = [c]; + const d = new Scene$1(); + d.nodes = [l], d.upAxis = Axis$1.Z, d.forwardAxis = Axis$1.X; + const f = new Components(); + f.scene = d, f.nodes = [l]; + const h = []; + f.structuralMetadata = makeStructuralMetadata( + n, + h + ), h.length > 0 && addPropertyAttributesToPrimitive( + e, + c, + h, + t + ), defined(n.rtcCenter) && (f.transform = Matrix4.multiplyByTranslation( + f.transform, + n.rtcCenter, + f.transform + )); + const p = n.positions; + defined(p) && p.isQuantized && (f.transform = Matrix4.multiplyByTranslation( + f.transform, + p.quantizedVolumeOffset, + f.transform + )), e._components = f, e._parsedContent = void 0, e._arrayBuffer = void 0; +} +function addPropertyAttributesToPrimitive(e, t, n, i) { + const r = t.attributes, o = n.length; + for (let s = 0; s < o; s++) { + const c = n[s], l = Buffer.createVertexBuffer({ + typedArray: c.typedArray, + context: i, + usage: BufferUsage$1.STATIC_DRAW + }); + l.vertexArrayDestroyable = !1, e._buffers.push(l), c.buffer = l, c.typedArray = void 0, r.push(c); + } + t.propertyAttributeIds = [0]; +} +PntsLoader.prototype.unload = function() { + const e = this._buffers; + for (let t = 0; t < e.length; t++) + e[t].destroy(); + e.length = 0, this._components = void 0, this._parsedContent = void 0, this._arrayBuffer = void 0; +}; +const scratchV0$2 = new Cartesian3(), scratchV1$2 = new Cartesian3(), scratchV2$1 = new Cartesian3(), scratchNodeComputedTransform = new Matrix4(), scratchModelMatrix$2 = new Matrix4(), scratchcomputedModelMatrix = new Matrix4(), scratchPickCartographic = new Cartographic(), scratchBoundingSphere$2 = new BoundingSphere(); +function pickModel(e, t, n, i, r, o, s) { + if (!e._ready || n.mode === SceneMode$1.MORPHING) + return; + let c = Number.MAX_VALUE; + const l = e.sceneGraph, d = l._runtimeNodes; + for (let f = 0; f < d.length; f++) { + const h = d[f], p = h.node; + let m = Matrix4.clone( + h.computedTransform, + scratchNodeComputedTransform + ), _ = Matrix4.clone( + l.computedModelMatrix, + scratchModelMatrix$2 + ); + const y = p.instances; + defined(y) && y.transformInWorldSpace && (_ = Matrix4.multiplyTransformation( + e.modelMatrix, + l.components.transform, + _ + ), m = Matrix4.multiplyTransformation( + l.axisCorrectionMatrix, + h.computedTransform, + m + )); + let C = Matrix4.multiplyTransformation( + _, + m, + scratchcomputedModelMatrix + ); + n.mode !== SceneMode$1.SCENE3D && (C = Transforms.basisTo2D( + n.mapProjection, + C, + C + )); + const T = []; + if (defined(y)) { + const b = y.attributes[0].count, S = y.attributes[0].componentDatatype, E = 12; + let A = h.transformsTypedArray; + if (!defined(A)) { + const D = h.instancingTransformsBuffer; + defined(D) && n.context.webgl2 && (A = ComponentDatatype$1.createTypedArray( + S, + b * E + ), D.getBufferData(A)); + } + if (defined(A)) + for (let D = 0; D < b; D++) { + const P = D * E, I = new Matrix4( + A[P], + A[P + 1], + A[P + 2], + A[P + 3], + A[P + 4], + A[P + 5], + A[P + 6], + A[P + 7], + A[P + 8], + A[P + 9], + A[P + 10], + A[P + 11], + 0, + 0, + 0, + 1 + ); + y.transformInWorldSpace ? (Matrix4.multiplyTransformation( + I, + m, + I + ), Matrix4.multiplyTransformation(_, I, I)) : Matrix4.multiplyTransformation( + I, + C, + I + ), T.push(I); + } + } + T.length === 0 && T.push(C); + const x = h.runtimePrimitives.length; + for (let b = 0; b < x; b++) { + const S = h.runtimePrimitives[b], E = S.primitive; + if (defined(S.boundingSphere) && !defined(y)) { + const $ = BoundingSphere.transform( + S.boundingSphere, + C, + scratchBoundingSphere$2 + ), G = IntersectionTests.raySphere( + t, + $ + ); + if (!defined(G)) + continue; + } + const A = ModelUtility.getAttributeBySemantic( + E, + VertexAttributeSemantic$1.POSITION + ), D = A.byteOffset, P = A.byteStride, I = A.count; + if (!defined(E.indices)) + continue; + let M = E.indices.typedArray; + if (!defined(M)) { + const $ = E.indices.buffer, G = E.indices.count, q = E.indices.indexDatatype; + defined($) && n.context.webgl2 && (q === IndexDatatype$1.UNSIGNED_BYTE ? M = new Uint8Array(G) : q === IndexDatatype$1.UNSIGNED_SHORT ? M = new Uint16Array(G) : q === IndexDatatype$1.UNSIGNED_INT && (M = new Uint32Array(G)), $.getBufferData(M)); + } + let R = A.typedArray, L = A.componentDatatype, g = A.type; + const w = A.quantization; + defined(w) && (L = A.quantization.componentDatatype, g = A.quantization.type); + const O = AttributeType$1.getNumberOfComponents(g), N = ComponentDatatype$1.getSizeInBytes(L), F = !defined(R) && defined(P) && P !== O * N; + let B = O, V = 0; + F && (B = P / N, V = D / N); + const U = I * B; + if (!defined(R)) { + const $ = A.buffer; + defined($) && n.context.webgl2 && (R = ComponentDatatype$1.createTypedArray( + L, + U + ), $.getBufferData( + R, + F ? 0 : D, + 0, + U + )), w && A.normalized && (R = AttributeCompression.dequantize( + R, + L, + g, + I + )); + } + if (!defined(M) || !defined(R)) + return; + o = defaultValue(o, Ellipsoid.default), i = defaultValue(i, 1), r = defaultValue(r, 0); + const k = M.length; + for (let $ = 0; $ < k; $ += 3) { + const G = M[$], q = M[$ + 1], z = M[$ + 2]; + for (const H of T) { + const Q = getVertexPosition( + R, + G, + V, + B, + w, + H, + i, + r, + o, + scratchV0$2 + ), ne = getVertexPosition( + R, + q, + V, + B, + w, + H, + i, + r, + o, + scratchV1$2 + ), K = getVertexPosition( + R, + z, + V, + B, + w, + H, + i, + r, + o, + scratchV2$1 + ), Z = IntersectionTests.rayTriangleParametric( + t, + Q, + ne, + K, + defaultValue(e.backFaceCulling, !0) + ); + defined(Z) && Z < c && Z >= 0 && (c = Z); + } + } + } + } + if (c !== Number.MAX_VALUE) { + if (s = Ray.getPoint(t, c, s), n.mode !== SceneMode$1.SCENE3D) { + Cartesian3.fromElements(s.y, s.z, s.x, s); + const f = n.mapProjection, h = f.ellipsoid, p = f.unproject(s, scratchPickCartographic); + h.cartographicToCartesian(p, s); + } + return s; + } +} +function getVertexPosition(e, t, n, i, r, o, s, c, l, d) { + const f = n + t * i; + if (d.x = e[f], d.y = e[f + 1], d.z = e[f + 2], defined(r)) + if (r.octEncoded) { + if (d = AttributeCompression.octDecodeInRange( + d, + r.normalizationRange, + d + ), r.octEncodedZXY) { + const h = d.x; + d.x = d.z, d.z = d.y, d.y = h; + } + } else + d = Cartesian3.multiplyComponents( + d, + r.quantizedVolumeStepSize, + d + ), d = Cartesian3.add( + d, + r.quantizedVolumeOffset, + d + ); + return d = Matrix4.multiplyByPoint(o, d, d), s !== 1 && VerticalExaggeration.getPosition( + d, + l, + s, + c, + d + ), d; +} +function Model(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._loader = e.loader, this._resource = e.resource, this.type = defaultValue(e.type, ModelType$1.GLTF), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = Matrix4.clone(this.modelMatrix), this._scale = defaultValue(e.scale, 1), this._minimumPixelSize = defaultValue(e.minimumPixelSize, 0), this._maximumScale = e.maximumScale, this._clampedScale = defined(this._maximumScale) ? Math.min(this._scale, this._maximumScale) : this._scale, this._computedScale = this._clampedScale, this._updateModelMatrix = !1, this.referenceMatrix = void 0, this._iblReferenceFrameMatrix = Matrix3.clone(Matrix3.IDENTITY), this._resourcesLoaded = !1, this._drawCommandsBuilt = !1, this._ready = !1, this._customShader = e.customShader, this._content = e.content, this._texturesLoaded = !1, this._defaultTexture = void 0, this._activeAnimations = new ModelAnimationCollection(this), this._clampAnimations = defaultValue(e.clampAnimations, !0), this._userAnimationDirty = !1, this._id = e.id, this._idDirty = !1, this._color = Color.clone(e.color), this._colorBlendMode = defaultValue( + e.colorBlendMode, + ColorBlendMode$1.HIGHLIGHT + ), this._colorBlendAmount = defaultValue(e.colorBlendAmount, 0.5); + const t = defaultValue(e.silhouetteColor, Color.RED); + this._silhouetteColor = Color.clone(t), this._silhouetteSize = defaultValue(e.silhouetteSize, 0), this._silhouetteDirty = !1, this._silhouetteId = void 0, this._cull = defaultValue(e.cull, !0), this._opaquePass = defaultValue(e.opaquePass, Pass$1.OPAQUE), this._allowPicking = defaultValue(e.allowPicking, !0), this._show = defaultValue(e.show, !0), this._style = void 0, this._styleDirty = !1, this._styleCommandsNeeded = void 0; + let n = defaultValue(e.featureIdLabel, "featureId_0"); + typeof n == "number" && (n = `featureId_${n}`), this._featureIdLabel = n; + let i = defaultValue( + e.instanceFeatureIdLabel, + "instanceFeatureId_0" + ); + typeof i == "number" && (i = `instanceFeatureId_${i}`), this._instanceFeatureIdLabel = i, this._featureTables = [], this._featureTableId = void 0, this._featureTableIdDirty = !0, this._pipelineResources = [], this._modelResources = [], this._pickIds = [], this._boundingSphere = new BoundingSphere(), this._initialRadius = void 0, this._heightReference = defaultValue( + e.heightReference, + HeightReference$1.NONE + ), this._heightDirty = this._heightReference !== HeightReference$1.NONE, this._removeUpdateHeightCallback = void 0, this._verticalExaggerationOn = !1, this._clampedModelMatrix = void 0; + const r = e.scene; + defined(r) && defined(r.terrainProviderChanged) && (this._terrainProviderChangedCallback = r.terrainProviderChanged.addEventListener( + () => { + this._heightDirty = !0; + } + )), this._scene = r, this._distanceDisplayCondition = e.distanceDisplayCondition; + const o = new PointCloudShading(e.pointCloudShading); + this._pointCloudShading = o, this._attenuation = o.attenuation, this._pointCloudBackFaceCulling = o.backFaceCulling; + const s = e.clippingPlanes; + defined(s) && s.owner === void 0 ? ClippingPlaneCollection.setOwner(s, this, "_clippingPlanes") : this._clippingPlanes = s, this._clippingPlanesState = 0, this._clippingPlanesMatrix = Matrix4.clone(Matrix4.IDENTITY); + const c = e.clippingPolygons; + defined(c) && c.owner === void 0 ? ClippingPolygonCollection.setOwner( + c, + this, + "_clippingPolygons" + ) : this._clippingPolygons = c, this._clippingPolygonsState = 0, this._lightColor = Cartesian3.clone(e.lightColor), this._imageBasedLighting = defined(e.imageBasedLighting) ? e.imageBasedLighting : new ImageBasedLighting(), this._shouldDestroyImageBasedLighting = !defined(e.imageBasedLighting), this._backFaceCulling = defaultValue(e.backFaceCulling, !0), this._backFaceCullingDirty = !1, this._shadows = defaultValue(e.shadows, ShadowMode$1.ENABLED), this._shadowsDirty = !1, this._debugShowBoundingVolumeDirty = !1, this._debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this._enableDebugWireframe = defaultValue( + e.enableDebugWireframe, + !1 + ), this._enableShowOutline = defaultValue(e.enableShowOutline, !0), this._debugWireframe = defaultValue(e.debugWireframe, !1), this._debugWireframe === !0 && this._enableDebugWireframe === !1 && this.type === ModelType$1.GLTF && oneTimeWarning( + "model-debug-wireframe-ignored", + "enableDebugWireframe must be set to true in Model.fromGltf, otherwise debugWireframe will be ignored." + ); + let l = e.credit; + typeof l == "string" && (l = new Credit(l)), this._credits = [], this._credit = l, this._resourceCredits = [], this._gltfCredits = [], this._showCreditsOnScreen = defaultValue(e.showCreditsOnScreen, !1), this._showCreditsOnScreenDirty = !0, this._splitDirection = defaultValue( + e.splitDirection, + SplitDirection$1.NONE + ), this._enableShowOutline = defaultValue(e.enableShowOutline, !0), this.showOutline = defaultValue(e.showOutline, !0), this.outlineColor = defaultValue(e.outlineColor, Color.BLACK), this._classificationType = e.classificationType, this._statistics = new ModelStatistics(), this._sceneMode = void 0, this._projectTo2D = defaultValue(e.projectTo2D, !1), this._enablePick = defaultValue(e.enablePick, !1), this._fogRenderable = void 0, this._skipLevelOfDetail = !1, this._ignoreCommands = defaultValue(e.ignoreCommands, !1), this._errorEvent = new Event(), this._readyEvent = new Event(), this._texturesReadyEvent = new Event(), this._sceneGraph = void 0, this._nodesByName = {}, this.pickObject = e.pickObject, this.useSRGBVertexColors = defaultValue(e.useSRGBVertexColors, !1), this.useSRGBColorFactors = defaultValue(e.useSRGBColorFactors, !1); +} +function handleError$2(e, t) { + if (e._errorEvent.numberOfListeners > 0) { + e._errorEvent.raiseEvent(t); + return; + } + console.log(t); +} +function createModelFeatureTables(e, t) { + const n = e._featureTables, i = t.propertyTables, r = i.length; + for (let o = 0; o < r; o++) { + const s = i[o], c = new ModelFeatureTable({ + model: e, + propertyTable: s + }); + n.push(c); + } + return n; +} +function selectFeatureTableId(e, t) { + const n = t._featureIdLabel, i = t._instanceFeatureIdLabel; + let r, o, s, c; + for (r = 0; r < e.nodes.length; r++) + if (c = e.nodes[r], defined(c.instances) && (s = ModelUtility.getFeatureIdsByLabel( + c.instances.featureIds, + i + ), defined(s) && defined(s.propertyTableId))) + return s.propertyTableId; + for (r = 0; r < e.nodes.length; r++) + for (c = e.nodes[r], o = 0; o < c.primitives.length; o++) { + const l = c.primitives[o], d = ModelUtility.getFeatureIdsByLabel( + l.featureIds, + n + ); + if (defined(d)) + return d.propertyTableId; + } + if (t._featureTables.length === 1) + return 0; +} +function isColorAlphaDirty(e, t) { + if (!defined(e) && !defined(t)) + return !1; + if (defined(e) !== defined(t)) + return !0; + const n = e.alpha, i = t.alpha; + return Math.floor(n) !== Math.floor(i) || Math.ceil(n) !== Math.ceil(i); +} +Object.defineProperties(Model.prototype, { + /** + * When true, this model is ready to render, i.e., the external binary, image, + * and shader files were downloaded and the WebGL resources were created. + * + * @memberof Model.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * Gets an event that is raised when the model encounters an asynchronous rendering error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link ModelError}. + * @memberof Model.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets an event that is raised when the model is loaded and ready for rendering, i.e. when the external resources + * have been downloaded and the WebGL resources are created. Event listeners + * are passed an instance of the {@link Model}. + * + *

+ * If {@link Model.incrementallyLoadTextures} is true, this event will be raised before all textures are loaded and ready for rendering. Subscribe to {@link Model.texturesReadyEvent} to be notified when the textures are ready. + *

+ * + * @memberof Model.prototype + * @type {Event} + * @readonly + */ + readyEvent: { + get: function() { + return this._readyEvent; + } + }, + /** + * Returns true if textures are loaded separately from the other glTF resources. + * + * @memberof Model.prototype + * + * @type {boolean} + * @readonly + * @private + */ + incrementallyLoadTextures: { + get: function() { + return defaultValue(this._loader.incrementallyLoadTextures, !1); + } + }, + /** + * Gets an event that, if {@link Model.incrementallyLoadTextures} is true, is raised when the model textures are loaded and ready for rendering, i.e. when the external resources + * have been downloaded and the WebGL resources are created. Event listeners + * are passed an instance of the {@link Model}. + * + * @memberof Model.prototype + * @type {Event} + * @readonly + */ + texturesReadyEvent: { + get: function() { + return this._texturesReadyEvent; + } + }, + /** + * @private + */ + loader: { + get: function() { + return this._loader; + } + }, + /** + * Get the estimated memory usage statistics for this model. + * + * @memberof Model.prototype + * + * @type {ModelStatistics} + * @readonly + * + * @private + */ + statistics: { + get: function() { + return this._statistics; + } + }, + /** + * The currently playing glTF animations. + * + * @memberof Model.prototype + * + * @type {ModelAnimationCollection} + * @readonly + */ + activeAnimations: { + get: function() { + return this._activeAnimations; + } + }, + /** + * Determines if the model's animations should hold a pose over frames where no keyframes are specified. + * + * @memberof Model.prototype + * @type {boolean} + * + * @default true + */ + clampAnimations: { + get: function() { + return this._clampAnimations; + }, + set: function(e) { + this._clampAnimations = e; + } + }, + /** + * Whether or not to cull the model using frustum/horizon culling. If the model is part of a 3D Tiles tileset, this property + * will always be false, since the 3D Tiles culling system is used. + * + * @memberof Model.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + cull: { + get: function() { + return this._cull; + } + }, + /** + * The pass to use in the {@link DrawCommand} for the opaque portions of the model. + * + * @memberof Model.prototype + * + * @type {Pass} + * @readonly + * + * @private + */ + opaquePass: { + get: function() { + return this._opaquePass; + } + }, + /** + * Point cloud shading settings for controlling point cloud attenuation + * and lighting. For 3D Tiles, this is inherited from the + * {@link Cesium3DTileset}. + * + * @memberof Model.prototype + * + * @type {PointCloudShading} + */ + pointCloudShading: { + get: function() { + return this._pointCloudShading; + }, + set: function(e) { + e !== this._pointCloudShading && this.resetDrawCommands(), this._pointCloudShading = e; + } + }, + /** + * The model's custom shader, if it exists. Using custom shaders with a {@link Cesium3DTileStyle} + * may lead to undefined behavior. + * + * @memberof Model.prototype + * + * @type {CustomShader} + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + customShader: { + get: function() { + return this._customShader; + }, + set: function(e) { + e !== this._customShader && this.resetDrawCommands(), this._customShader = e; + } + }, + /** + * The scene graph of this model. + * + * @memberof Model.prototype + * + * @type {ModelSceneGraph} + * @private + */ + sceneGraph: { + get: function() { + return this._sceneGraph; + } + }, + /** + * The tile content this model belongs to, if it is loaded as part of a {@link Cesium3DTileset}. + * + * @memberof Model.prototype + * + * @type {Cesium3DTileContent} + * @readonly + * + * @private + */ + content: { + get: function() { + return this._content; + } + }, + /** + * The height reference of the model, which determines how the model is drawn + * relative to terrain. + * + * @memberof Model.prototype + * + * @type {HeightReference} + * @default {HeightReference.NONE} + * + */ + heightReference: { + get: function() { + return this._heightReference; + }, + set: function(e) { + e !== this._heightReference && (this._heightDirty = !0), this._heightReference = e; + } + }, + /** + * Gets or sets the distance display condition, which specifies at what distance + * from the camera this model will be displayed. + * + * @memberof Model.prototype + * + * @type {DistanceDisplayCondition} + * + * @default undefined + * + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + this._distanceDisplayCondition = DistanceDisplayCondition.clone( + e, + this._distanceDisplayCondition + ); + } + }, + /** + * The structural metadata from the EXT_structural_metadata extension + * + * @memberof Model.prototype + * + * @type {StructuralMetadata} + * @readonly + * + * @private + */ + structuralMetadata: { + get: function() { + return this._sceneGraph.components.structuralMetadata; + } + }, + /** + * The ID for the feature table to use for picking and styling in this model. + * + * @memberof Model.prototype + * + * @type {number} + * + * @private + */ + featureTableId: { + get: function() { + return this._featureTableId; + }, + set: function(e) { + this._featureTableId = e; + } + }, + /** + * The feature tables for this model. + * + * @memberof Model.prototype + * + * @type {Array} + * @readonly + * + * @private + */ + featureTables: { + get: function() { + return this._featureTables; + }, + set: function(e) { + this._featureTables = e; + } + }, + /** + * A user-defined object that is returned when the model is picked. + * + * @memberof Model.prototype + * + * @type {object} + * + * @default undefined + * + * @see Scene#pick + */ + id: { + get: function() { + return this._id; + }, + set: function(e) { + e !== this._id && (this._idDirty = !0), this._id = e; + } + }, + /** + * When true, each primitive is pickable with {@link Scene#pick}. When false, GPU memory is saved. + * + * @memberof Model.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + allowPicking: { + get: function() { + return this._allowPicking; + } + }, + /** + * The style to apply to the features in the model. Cannot be applied if a {@link CustomShader} is also applied. + * + * @memberof Model.prototype + * + * @type {Cesium3DTileStyle} + */ + style: { + get: function() { + return this._style; + }, + set: function(e) { + this._style = e, this._styleDirty = !0; + } + }, + /** + * The color to blend with the model's rendered color. + * + * @memberof Model.prototype + * + * @type {Color} + * + * @default undefined + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + isColorAlphaDirty(e, this._color) && this.resetDrawCommands(), this._color = Color.clone(e, this._color); + } + }, + /** + * Defines how the color blends with the model. + * + * @memberof Model.prototype + * + * @type {Cesium3DTileColorBlendMode|ColorBlendMode} + * + * @default ColorBlendMode.HIGHLIGHT + */ + colorBlendMode: { + get: function() { + return this._colorBlendMode; + }, + set: function(e) { + this._colorBlendMode = e; + } + }, + /** + * Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * + * @memberof Model.prototype + * + * @type {number} + * + * @default 0.5 + */ + colorBlendAmount: { + get: function() { + return this._colorBlendAmount; + }, + set: function(e) { + this._colorBlendAmount = e; + } + }, + /** + * The silhouette color. + * + * @memberof Model.prototype + * + * @type {Color} + * + * @default Color.RED + */ + silhouetteColor: { + get: function() { + return this._silhouetteColor; + }, + set: function(e) { + if (!Color.equals(e, this._silhouetteColor)) { + const t = isColorAlphaDirty(e, this._silhouetteColor); + this._silhouetteDirty = this._silhouetteDirty || t; + } + this._silhouetteColor = Color.clone(e, this._silhouetteColor); + } + }, + /** + * The size of the silhouette in pixels. + * + * @memberof Model.prototype + * + * @type {number} + * + * @default 0.0 + */ + silhouetteSize: { + get: function() { + return this._silhouetteSize; + }, + set: function(e) { + if (e !== this._silhouetteSize) { + const t = this._silhouetteSize, n = e > 0 && t === 0 || e === 0 && t > 0; + this._silhouetteDirty = this._silhouetteDirty || n, this._backFaceCullingDirty = this._backFaceCullingDirty || n; + } + this._silhouetteSize = e; + } + }, + /** + * Gets the model's bounding sphere in world space. This does not take into account + * glTF animations, skins, or morph targets. It also does not account for + * {@link Model#minimumPixelSize}. + * + * @memberof Model.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + const e = defined(this._clampedModelMatrix) ? this._clampedModelMatrix : this.modelMatrix; + return updateBoundingSphere(this, e), this._boundingSphere; + } + }, + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the model. + *

+ * + * @memberof Model.prototype + * + * @type {boolean} + * + * @default false + */ + debugShowBoundingVolume: { + get: function() { + return this._debugShowBoundingVolume; + }, + set: function(e) { + this._debugShowBoundingVolume !== e && (this._debugShowBoundingVolumeDirty = !0), this._debugShowBoundingVolume = e; + } + }, + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the model in wireframe. + *

+ * + * @memberof Model.prototype + * + * @type {boolean} + * + * @default false + */ + debugWireframe: { + get: function() { + return this._debugWireframe; + }, + set: function(e) { + this._debugWireframe !== e && this.resetDrawCommands(), this._debugWireframe = e, this._debugWireframe === !0 && this._enableDebugWireframe === !1 && this.type === ModelType$1.GLTF && oneTimeWarning( + "model-debug-wireframe-ignored", + "enableDebugWireframe must be set to true in Model.fromGltfAsync, otherwise debugWireframe will be ignored." + ); + } + }, + /** + * Whether or not to render the model. + * + * @memberof Model.prototype + * + * @type {boolean} + * + * @default true + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + this._show = e; + } + }, + /** + * Label of the feature ID set to use for picking and styling. + *

+ * For EXT_mesh_features, this is the feature ID's label property, or + * "featureId_N" (where N is the index in the featureIds array) when not + * specified. EXT_feature_metadata did not have a label field, so such + * feature ID sets are always labeled "featureId_N" where N is the index in + * the list of all feature Ids, where feature ID attributes are listed before + * feature ID textures. + *

+ *

+ * If featureIdLabel is set to an integer N, it is converted to + * the string "featureId_N" automatically. If both per-primitive and + * per-instance feature IDs are present, the instance feature IDs take + * priority. + *

+ * + * @memberof Model.prototype + * + * @type {string} + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + featureIdLabel: { + get: function() { + return this._featureIdLabel; + }, + set: function(e) { + typeof e == "number" && (e = `featureId_${e}`), e !== this._featureIdLabel && (this._featureTableIdDirty = !0), this._featureIdLabel = e; + } + }, + /** + * Label of the instance feature ID set used for picking and styling. + *

+ * If instanceFeatureIdLabel is set to an integer N, it is converted to + * the string "instanceFeatureId_N" automatically. + * If both per-primitive and per-instance feature IDs are present, the + * instance feature IDs take priority. + *

+ * + * @memberof Model.prototype + * + * @type {string} + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + instanceFeatureIdLabel: { + get: function() { + return this._instanceFeatureIdLabel; + }, + set: function(e) { + typeof e == "number" && (e = `instanceFeatureId_${e}`), e !== this._instanceFeatureIdLabel && (this._featureTableIdDirty = !0), this._instanceFeatureIdLabel = e; + } + }, + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * + * @memberof Model.prototype + * + * @type {ClippingPlaneCollection} + */ + clippingPlanes: { + get: function() { + return this._clippingPlanes; + }, + set: function(e) { + e !== this._clippingPlanes && (ClippingPlaneCollection.setOwner(e, this, "_clippingPlanes"), this.resetDrawCommands()); + } + }, + /** + * The {@link ClippingPolygonCollection} used to selectively disable rendering the model. + * + * @memberof Model.prototype + * + * @type {ClippingPolygonCollection} + */ + clippingPolygons: { + get: function() { + return this._clippingPolygons; + }, + set: function(e) { + e !== this._clippingPolygons && (ClippingPolygonCollection.setOwner(e, this, "_clippingPolygons"), this.resetDrawCommands()); + } + }, + /** + * The light color when shading the model. When undefined the scene's light color is used instead. + *

+ * Disabling additional light sources by setting + * model.imageBasedLighting.imageBasedLightingFactor = new Cartesian2(0.0, 0.0) + * will make the model much darker. Here, increasing the intensity of the light source will make the model brighter. + *

+ * @memberof Model.prototype + * + * @type {Cartesian3} + * + * @default undefined + */ + lightColor: { + get: function() { + return this._lightColor; + }, + set: function(e) { + defined(e) !== defined(this._lightColor) && this.resetDrawCommands(), this._lightColor = Cartesian3.clone(e, this._lightColor); + } + }, + /** + * The properties for managing image-based lighting on this model. + * + * @memberof Model.prototype + * + * @type {ImageBasedLighting} + */ + imageBasedLighting: { + get: function() { + return this._imageBasedLighting; + }, + set: function(e) { + e !== this._imageBasedLighting && (this._shouldDestroyImageBasedLighting && !this._imageBasedLighting.isDestroyed() && this._imageBasedLighting.destroy(), this._imageBasedLighting = e, this._shouldDestroyImageBasedLighting = !1, this.resetDrawCommands()); + } + }, + /** + * Whether to cull back-facing geometry. When true, back face culling is + * determined by the material's doubleSided property; when false, back face + * culling is disabled. Back faces are not culled if {@link Model#color} + * is translucent or {@link Model#silhouetteSize} is greater than 0.0. + * + * @memberof Model.prototype + * + * @type {boolean} + * + * @default true + */ + backFaceCulling: { + get: function() { + return this._backFaceCulling; + }, + set: function(e) { + e !== this._backFaceCulling && (this._backFaceCullingDirty = !0), this._backFaceCulling = e; + } + }, + /** + * A uniform scale applied to this model before the {@link Model#modelMatrix}. + * Values greater than 1.0 increase the size of the model; values + * less than 1.0 decrease. + * + * @memberof Model.prototype + * + * @type {number} + * + * @default 1.0 + */ + scale: { + get: function() { + return this._scale; + }, + set: function(e) { + e !== this._scale && (this._updateModelMatrix = !0), this._scale = e; + } + }, + /** + * The true scale of the model after being affected by the model's scale, + * minimum pixel size, and maximum scale parameters. + * + * @memberof Model.prototype + * + * @type {number} + * @readonly + * + * @private + */ + computedScale: { + get: function() { + return this._computedScale; + } + }, + /** + * The approximate minimum pixel size of the model regardless of zoom. + * This can be used to ensure that a model is visible even when the viewer + * zooms out. When 0.0, no minimum size is enforced. + * + * @memberof Model.prototype + * + * @type {number} + * + * @default 0.0 + */ + minimumPixelSize: { + get: function() { + return this._minimumPixelSize; + }, + set: function(e) { + e !== this._minimumPixelSize && (this._updateModelMatrix = !0), this._minimumPixelSize = e; + } + }, + /** + * The maximum scale size for a model. This can be used to give + * an upper limit to the {@link Model#minimumPixelSize}, ensuring that the model + * is never an unreasonable scale. + * + * @memberof Model.prototype + * + * @type {number} + */ + maximumScale: { + get: function() { + return this._maximumScale; + }, + set: function(e) { + e !== this._maximumScale && (this._updateModelMatrix = !0), this._maximumScale = e; + } + }, + /** + * Determines whether the model casts or receives shadows from light sources. + + * @memberof Model.prototype + * + * @type {ShadowMode} + * + * @default ShadowMode.ENABLED + */ + shadows: { + get: function() { + return this._shadows; + }, + set: function(e) { + e !== this._shadows && (this._shadowsDirty = !0), this._shadows = e; + } + }, + /** + * Gets the credit that will be displayed for the model. + * + * @memberof Model.prototype + * + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets or sets whether the credits of the model will be displayed + * on the screen. + * + * @memberof Model.prototype + * + * @type {boolean} + * + * @default false + */ + showCreditsOnScreen: { + get: function() { + return this._showCreditsOnScreen; + }, + set: function(e) { + this._showCreditsOnScreen !== e && (this._showCreditsOnScreenDirty = !0), this._showCreditsOnScreen = e; + } + }, + /** + * The {@link SplitDirection} to apply to this model. + * + * @memberof Model.prototype + * + * @type {SplitDirection} + * + * @default {@link SplitDirection.NONE} + */ + splitDirection: { + get: function() { + return this._splitDirection; + }, + set: function(e) { + this._splitDirection !== e && this.resetDrawCommands(), this._splitDirection = e; + } + }, + /** + * Gets the model's classification type. This determines whether terrain, + * 3D Tiles, or both will be classified by this model. + *

+ * Additionally, there are a few requirements/limitations: + *

    + *
  • The glTF cannot contain morph targets, skins, or animations.
  • + *
  • The glTF cannot contain the EXT_mesh_gpu_instancing extension.
  • + *
  • Only meshes with TRIANGLES can be used to classify other assets.
  • + *
  • The meshes must be watertight.
  • + *
  • The POSITION attribute is required.
  • + *
  • If feature IDs and an index buffer are both present, all indices with the same feature id must occupy contiguous sections of the index buffer.
  • + *
  • If feature IDs are present without an index buffer, all positions with the same feature id must occupy contiguous sections of the position buffer.
  • + *
+ *

+ *

+ * The 3D Tiles or terrain receiving the classification must be opaque. + *

+ * + * @memberof Model.prototype + * + * @type {ClassificationType} + * @default undefined + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * @readonly + */ + classificationType: { + get: function() { + return this._classificationType; + } + }, + /** + * Reference to the pick IDs. This is only used internally, e.g. for + * per-feature post-processing in {@link PostProcessStage}. + * + * @memberof Model.prototype + * + * @type {PickId[]} + * @readonly + * + * @private + */ + pickIds: { + get: function() { + return this._pickIds; + } + }, + /** + * The {@link StyleCommandsNeeded} for the style currently applied to + * the features in the model. This is used internally by the {@link ModelDrawCommand} + * when determining which commands to submit in an update. + * + * @memberof Model.prototype + * + * @type {StyleCommandsNeeded} + * @readonly + * + * @private + */ + styleCommandsNeeded: { + get: function() { + return this._styleCommandsNeeded; + } + } +}); +Model.prototype.getNode = function(e) { + return this._nodesByName[e]; +}; +Model.prototype.setArticulationStage = function(e, t) { + this._sceneGraph.setArticulationStage(e, t); +}; +Model.prototype.applyArticulations = function() { + this._sceneGraph.applyArticulations(); +}; +Model.prototype.makeStyleDirty = function() { + this._styleDirty = !0; +}; +Model.prototype.resetDrawCommands = function() { + this._drawCommandsBuilt = !1; +}; +const scratchIBLReferenceFrameMatrix4 = new Matrix4(), scratchIBLReferenceFrameMatrix3 = new Matrix3(), scratchClippingPlanesMatrix$2 = new Matrix4(); +Model.prototype.update = function(e) { + let t = !1; + try { + t = processLoader(this, e); + } catch (n) { + if (!this._loader.incrementallyLoadTextures && n.name === "TextureError") + handleError$2(this, n); + else { + const i = ModelUtility.getError( + "model", + this._resource, + n + ); + handleError$2(this, i); + } + } + if (updateCustomShader(this, e), updateImageBasedLighting(this, e), !this._resourcesLoaded && t) { + this._resourcesLoaded = !0; + const n = this._loader.components; + if (!defined(n)) { + if (this._loader.isUnloaded()) + return; + const o = ModelUtility.getError( + "model", + this._resource, + new RuntimeError("Failed to load model.") + ); + handleError$2(o), this._rejectLoad = this._rejectLoad && this._rejectLoad(o); + } + const i = n.structuralMetadata; + defined(i) && i.propertyTableCount > 0 && createModelFeatureTables(this, i); + const r = new ModelSceneGraph({ + model: this, + modelComponents: n + }); + this._sceneGraph = r, this._gltfCredits = r.components.asset.credits; + } + if (!(!this._resourcesLoaded || e.mode === SceneMode$1.MORPHING)) { + if (updateFeatureTableId(this), updateStyle(this), updateFeatureTables(this, e), updatePointCloudShading(this), updateSilhouette(this, e), updateSkipLevelOfDetail(this, e), updateClippingPlanes$2(this, e), updateClippingPolygons$1(this, e), updateSceneMode(this, e), updateFog(this, e), updateVerticalExaggeration$1(this, e), this._defaultTexture = e.context.defaultTexture, buildDrawCommands(this, e), updateModelMatrix(this), updateClamping(this), updateBoundingSphereAndScale(this, e), updateReferenceMatrices(this, e), !this._ready) { + e.afterRender.push(() => { + this._ready = !0, this._readyEvent.raiseEvent(this); + }); + return; + } + this._loader.incrementallyLoadTextures && !this._texturesLoaded && this._loader.texturesLoaded && (this.resetDrawCommands(), this._texturesLoaded = !0, this._texturesReadyEvent.raiseEvent(this)), updatePickIds(this), updateSceneGraph(this, e), updateShowCreditsOnScreen(this), submitDrawCommands(this, e); + } +}; +function processLoader(e, t) { + return !e._resourcesLoaded || e._loader.incrementallyLoadTextures && !e._texturesLoaded ? (t.afterRender.push(() => !0), e._loader.process(t)) : !0; +} +function updateCustomShader(e, t) { + defined(e._customShader) && e._customShader.update(t); +} +function updateImageBasedLighting(e, t) { + e._imageBasedLighting.update(t), e._imageBasedLighting.shouldRegenerateShaders && e.resetDrawCommands(); +} +function updateFeatureTableId(e) { + if (!e._featureTableIdDirty) + return; + e._featureTableIdDirty = !1; + const t = e._sceneGraph.components, n = t.structuralMetadata; + defined(n) && n.propertyTableCount > 0 && (e.featureTableId = selectFeatureTableId(t, e), e._styleDirty = !0, e.resetDrawCommands()); +} +function updateStyle(e) { + e._styleDirty && (e.applyStyle(e._style), e._styleDirty = !1); +} +function updateFeatureTables(e, t) { + const n = e._featureTables, i = n.length; + let r = !1; + for (let o = 0; o < i; o++) + n[o].update(t), n[o].styleCommandsNeededDirty && (r = !0); + r && updateStyleCommandsNeeded(e); +} +function updateStyleCommandsNeeded(e) { + const t = e.featureTables[e.featureTableId]; + e._styleCommandsNeeded = StyleCommandsNeeded$1.getStyleCommandsNeeded( + t.featuresLength, + t.batchTexture.translucentFeaturesLength + ); +} +function updatePointCloudShading(e) { + const t = e.pointCloudShading; + t.attenuation !== e._attenuation && (e.resetDrawCommands(), e._attenuation = t.attenuation), t.backFaceCulling !== e._pointCloudBackFaceCulling && (e.resetDrawCommands(), e._pointCloudBackFaceCulling = t.backFaceCulling); +} +function updateSilhouette(e, t) { + e._silhouetteDirty && (supportsSilhouettes(t) && e.resetDrawCommands(), e._silhouetteDirty = !1); +} +function updateSkipLevelOfDetail(e, t) { + const n = e.hasSkipLevelOfDetail(t); + n !== e._skipLevelOfDetail && (e.resetDrawCommands(), e._skipLevelOfDetail = n); +} +function updateClippingPlanes$2(e, t) { + let n = 0; + e.isClippingEnabled() && (e._clippingPlanes.owner === e && e._clippingPlanes.update(t), n = e._clippingPlanes.clippingPlanesState), n !== e._clippingPlanesState && (e.resetDrawCommands(), e._clippingPlanesState = n); +} +function updateClippingPolygons$1(e, t) { + let n = 0; + e.isClippingPolygonsEnabled() && (e._clippingPolygons.owner === e && (e._clippingPolygons.update(t), e._clippingPolygons.queueCommands(t)), n = e._clippingPolygons.clippingPolygonsState), n !== e._clippingPolygonsState && (e.resetDrawCommands(), e._clippingPolygonsState = n); +} +function updateSceneMode(e, t) { + t.mode !== e._sceneMode && (e._projectTo2D ? e.resetDrawCommands() : e._updateModelMatrix = !0, e._sceneMode = t.mode); +} +function updateFog(e, t) { + const n = t.fog.enabled && t.fog.renderable; + n !== e._fogRenderable && (e.resetDrawCommands(), e._fogRenderable = n); +} +function updateVerticalExaggeration$1(e, t) { + const n = t.verticalExaggeration !== 1; + e._verticalExaggerationOn !== n && (e.resetDrawCommands(), e._verticalExaggerationOn = n); +} +function buildDrawCommands(e, t) { + e._drawCommandsBuilt || (e.destroyPipelineResources(), e._sceneGraph.buildDrawCommands(t), e._drawCommandsBuilt = !0); +} +function updateModelMatrix(e, t) { + Matrix4.equals(e.modelMatrix, e._modelMatrix) || (e._updateModelMatrix = !0, e._modelMatrix = Matrix4.clone(e.modelMatrix, e._modelMatrix)); +} +const scratchPosition$a = new Cartesian3(), scratchCartographic$g = new Cartographic(); +function updateClamping(e) { + if (!e._updateModelMatrix && !e._heightDirty && e._minimumPixelSize === 0) + return; + defined(e._removeUpdateHeightCallback) && (e._removeUpdateHeightCallback(), e._removeUpdateHeightCallback = void 0); + const t = e._scene; + if (!defined(t) || e.heightReference === HeightReference$1.NONE) { + e._clampedModelMatrix = void 0; + return; + } + const n = defaultValue(t.ellipsoid, Ellipsoid.default), i = e.modelMatrix; + scratchPosition$a.x = i[12], scratchPosition$a.y = i[13], scratchPosition$a.z = i[14]; + const r = n.cartesianToCartographic(scratchPosition$a); + defined(e._clampedModelMatrix) || (e._clampedModelMatrix = Matrix4.clone(i, new Matrix4())), e._removeUpdateHeightCallback = t.updateHeight( + r, + getUpdateHeightCallback(e, n, r), + e.heightReference + ); + const o = t.getHeight(r, e.heightReference); + if (defined(o)) { + const s = getUpdateHeightCallback(e, n, r); + Cartographic.clone(r, scratchCartographic$g), scratchCartographic$g.height = o, s(scratchCartographic$g); + } + e._heightDirty = !1, e._updateModelMatrix = !0; +} +function updateBoundingSphereAndScale(e, t) { + if (!e._updateModelMatrix && e._minimumPixelSize === 0) + return; + const n = defined(e._clampedModelMatrix) ? e._clampedModelMatrix : e.modelMatrix; + updateBoundingSphere(e, n), updateComputedScale(e, n, t); +} +function updateBoundingSphere(e, t) { + e._clampedScale = defined(e._maximumScale) ? Math.min(e._scale, e._maximumScale) : e._scale, e._boundingSphere.center = Cartesian3.multiplyByScalar( + e._sceneGraph.boundingSphere.center, + e._clampedScale, + e._boundingSphere.center + ), e._boundingSphere.radius = e._initialRadius * e._clampedScale, e._boundingSphere = BoundingSphere.transform( + e._boundingSphere, + t, + e._boundingSphere + ); +} +function updateComputedScale(e, t, n) { + let i = e.scale; + if (e.minimumPixelSize !== 0 && !e._projectTo2D) { + const r = n.context, o = Math.max( + r.drawingBufferWidth, + r.drawingBufferHeight + ); + Matrix4.getTranslation(t, scratchPosition$a), e._sceneMode !== SceneMode$1.SCENE3D && SceneTransforms.computeActualEllipsoidPosition( + n, + scratchPosition$a, + scratchPosition$a + ); + const s = e._boundingSphere.radius, c = scaleInPixels(scratchPosition$a, s, n), l = 1 / c; + Math.min( + l * (2 * s), + o + ) < e.minimumPixelSize && (i = e.minimumPixelSize * c / (2 * e._initialRadius)); + } + e._computedScale = defined(e.maximumScale) ? Math.min(e.maximumScale, i) : i; +} +function updatePickIds(e) { + if (!e._idDirty) + return; + e._idDirty = !1; + const t = e._id, n = e._pickIds, i = n.length; + for (let r = 0; r < i; ++r) + n[r].object.id = t; +} +const yUpToZUp = new Matrix3(1, 0, 0, 0, 0, 1, 0, -1, 0); +function updateReferenceMatrices(e, t) { + const n = defined(e._clampedModelMatrix) ? e._clampedModelMatrix : e.modelMatrix, i = defaultValue(e.referenceMatrix, n), r = t.context, o = e._imageBasedLighting; + if (o.useSphericalHarmonicCoefficients || o.useSpecularEnvironmentMaps) { + let s = scratchIBLReferenceFrameMatrix3, c = scratchIBLReferenceFrameMatrix4; + c = Matrix4.multiply( + r.uniformState.view3D, + i, + c + ), s = Matrix4.getRotation( + c, + s + ), s = Matrix3.transpose( + s, + s + ), e._iblReferenceFrameMatrix = Matrix3.multiply( + yUpToZUp, + s, + e._iblReferenceFrameMatrix + ); + } + if (e.isClippingEnabled()) { + let s = scratchClippingPlanesMatrix$2; + s = Matrix4.multiply( + r.uniformState.view3D, + i, + s + ), s = Matrix4.multiply( + s, + e._clippingPlanes.modelMatrix, + s + ), e._clippingPlanesMatrix = Matrix4.inverseTranspose( + s, + e._clippingPlanesMatrix + ); + } +} +function updateSceneGraph(e, t) { + const n = e._sceneGraph; + if (e._updateModelMatrix || e._minimumPixelSize !== 0) { + const r = defined(e._clampedModelMatrix) ? e._clampedModelMatrix : e.modelMatrix; + n.updateModelMatrix(r, t), e._updateModelMatrix = !1; + } + e._backFaceCullingDirty && (n.updateBackFaceCulling(e._backFaceCulling), e._backFaceCullingDirty = !1), e._shadowsDirty && (n.updateShadows(e._shadows), e._shadowsDirty = !1), e._debugShowBoundingVolumeDirty && (n.updateShowBoundingVolume(e._debugShowBoundingVolume), e._debugShowBoundingVolumeDirty = !1); + let i = !1; + defined(e.classificationType) || (i = e._userAnimationDirty || e._activeAnimations.update(t)), n.update(t, i), e._userAnimationDirty = !1; +} +function updateShowCreditsOnScreen(e) { + if (!e._showCreditsOnScreenDirty) + return; + e._showCreditsOnScreenDirty = !1, e._credits.length = 0; + const t = e._showCreditsOnScreen; + if (defined(e._credit)) { + const s = Credit.clone(e._credit); + s.showOnScreen = s.showOnScreen || t, e._credits.push(s); + } + const n = e._resourceCredits, i = n.length; + for (let s = 0; s < i; s++) { + const c = Credit.clone(n[s]); + c.showOnScreen = c.showOnScreen || t, e._credits.push(c); + } + const r = e._gltfCredits, o = r.length; + for (let s = 0; s < o; s++) { + const c = Credit.clone(r[s]); + c.showOnScreen = c.showOnScreen || t, e._credits.push(c); + } +} +function submitDrawCommands(e, t) { + const n = passesDistanceDisplayCondition( + e, + t + ), i = e.isInvisible(), r = e.hasSilhouette(t), o = e._show && e._computedScale !== 0 && n && (!i || r), s = t.passes, c = s.render || s.pick && e.allowPicking; + o && !e._ignoreCommands && c && (addCreditsToCreditDisplay(e, t), e._sceneGraph.pushDrawCommands(t)); +} +const scratchBoundingSphere$1 = new BoundingSphere(); +function scaleInPixels(e, t, n) { + return scratchBoundingSphere$1.center = e, scratchBoundingSphere$1.radius = t, n.camera.getPixelSize( + scratchBoundingSphere$1, + n.context.drawingBufferWidth, + n.context.drawingBufferHeight + ); +} +const scratchUpdateHeightCartesian$1 = new Cartesian3(); +function getUpdateHeightCallback(e, t, n) { + return function(i) { + isHeightReferenceRelative(e.heightReference) && (i.height += n.height), t.cartographicToCartesian( + i, + scratchUpdateHeightCartesian$1 + ); + const r = e._clampedModelMatrix; + Matrix4.clone(e.modelMatrix, r), r[12] = scratchUpdateHeightCartesian$1.x, r[13] = scratchUpdateHeightCartesian$1.y, r[14] = scratchUpdateHeightCartesian$1.z, e._heightDirty = !0; + }; +} +const scratchDisplayConditionCartesian = new Cartesian3(); +function passesDistanceDisplayCondition(e, t) { + const n = e.distanceDisplayCondition; + if (!defined(n)) + return !0; + const i = n.near * n.near, r = n.far * n.far; + let o; + if (t.mode === SceneMode$1.SCENE2D) { + const c = (t.camera.frustum.right - t.camera.frustum.left) * 0.5; + o = c * c; + } else { + const s = Matrix4.getTranslation( + e.modelMatrix, + scratchDisplayConditionCartesian + ); + SceneTransforms.computeActualEllipsoidPosition( + t, + s, + s + ), o = Cartesian3.distanceSquared( + s, + t.camera.positionWC + ); + } + return o >= i && o <= r; +} +function addCreditsToCreditDisplay(e, t) { + const n = t.creditDisplay, i = e._credits, r = i.length; + for (let o = 0; o < r; o++) + n.addCreditToNextFrame(i[o]); +} +Model.prototype.isTranslucent = function() { + const e = this.color; + return defined(e) && e.alpha > 0 && e.alpha < 1; +}; +Model.prototype.isInvisible = function() { + const e = this.color; + return defined(e) && e.alpha === 0; +}; +function supportsSilhouettes(e) { + return e.context.stencilBuffer; +} +Model.prototype.hasSilhouette = function(e) { + return supportsSilhouettes(e) && this._silhouetteSize > 0 && this._silhouetteColor.alpha > 0 && !defined(this._classificationType); +}; +Model.prototype.hasSkipLevelOfDetail = function(e) { + if (!ModelType$1.is3DTiles(this.type)) + return !1; + const t = e.context.stencilBuffer, n = this._content.tileset; + return t && n.isSkippingLevelOfDetail; +}; +Model.prototype.isClippingEnabled = function() { + const e = this._clippingPlanes; + return defined(e) && e.enabled && e.length !== 0; +}; +Model.prototype.pick = function(e, t, n, i, r) { + return pickModel( + this, + e, + t, + n, + i, + r + ); +}; +Model.prototype.isClippingPolygonsEnabled = function() { + const e = this._clippingPolygons; + return defined(e) && e.enabled && e.length !== 0; +}; +Model.prototype.isDestroyed = function() { + return !1; +}; +Model.prototype.destroy = function() { + const e = this._loader; + defined(e) && e.destroy(); + const t = this._featureTables; + if (defined(t)) { + const r = t.length; + for (let o = 0; o < r; o++) + t[o].destroy(); + } + this.destroyPipelineResources(), this.destroyModelResources(), defined(this._removeUpdateHeightCallback) && (this._removeUpdateHeightCallback(), this._removeUpdateHeightCallback = void 0), defined(this._terrainProviderChangedCallback) && (this._terrainProviderChangedCallback(), this._terrainProviderChangedCallback = void 0); + const n = this._clippingPlanes; + defined(n) && !n.isDestroyed() && n.owner === this && n.destroy(), this._clippingPlanes = void 0; + const i = this._clippingPolygons; + defined(i) && !i.isDestroyed() && i.owner === this && i.destroy(), this._clippingPolygons = void 0, this._shouldDestroyImageBasedLighting && !this._imageBasedLighting.isDestroyed() && this._imageBasedLighting.destroy(), this._imageBasedLighting = void 0, destroyObject(this); +}; +Model.prototype.destroyPipelineResources = function() { + const e = this._pipelineResources; + for (let t = 0; t < e.length; t++) + e[t].destroy(); + this._pipelineResources.length = 0, this._pickIds.length = 0; +}; +Model.prototype.destroyModelResources = function() { + const e = this._modelResources; + for (let t = 0; t < e.length; t++) + e[t].destroy(); + this._modelResources.length = 0; +}; +Model.fromGltfAsync = async function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.url, e.gltf), n = { + releaseGltfJson: e.releaseGltfJson, + asynchronous: e.asynchronous, + incrementallyLoadTextures: e.incrementallyLoadTextures, + upAxis: e.upAxis, + forwardAxis: e.forwardAxis, + loadAttributesFor2D: e.projectTo2D, + enablePick: e.enablePick, + loadIndicesForWireframe: e.enableDebugWireframe, + loadPrimitiveOutline: e.enableShowOutline, + loadForClassification: defined(e.classificationType) + }, i = defaultValue(e.basePath, ""), r = Resource.createIfNeeded(i); + defined(t.asset) ? (n.gltfJson = t, n.baseResource = r, n.gltfResource = r) : t instanceof Uint8Array ? (n.typedArray = t, n.baseResource = r, n.gltfResource = r) : n.gltfResource = Resource.createIfNeeded(t); + const o = new GltfLoader(n), c = defined(e.content) ? ModelType$1.TILE_GLTF : ModelType$1.GLTF, l = n.gltfResource, d = makeModelOptions$1(o, c, e); + d.resource = l; + try { + await o.load(); + } catch (m) { + throw o.destroy(), ModelUtility.getError("model", l, m); + } + const f = e.gltfCallback; + defined(f) && f(o.gltfJson); + const h = new Model(d), p = h._resource.credits; + if (defined(p)) { + const m = p.length; + for (let _ = 0; _ < m; _++) + h._resourceCredits.push(Credit.clone(p[_])); + } + return h; +}; +Model.fromB3dm = async function(e) { + const t = { + b3dmResource: e.resource, + arrayBuffer: e.arrayBuffer, + byteOffset: e.byteOffset, + releaseGltfJson: e.releaseGltfJson, + asynchronous: e.asynchronous, + incrementallyLoadTextures: e.incrementallyLoadTextures, + upAxis: e.upAxis, + forwardAxis: e.forwardAxis, + loadAttributesFor2D: e.projectTo2D, + enablePick: e.enablePick, + loadIndicesForWireframe: e.enableDebugWireframe, + loadPrimitiveOutline: e.enableShowOutline, + loadForClassification: defined(e.classificationType) + }, n = new B3dmLoader(t); + try { + await n.load(); + const i = makeModelOptions$1(n, ModelType$1.TILE_B3DM, e); + return new Model(i); + } catch (i) { + throw n.destroy(), i; + } +}; +Model.fromPnts = async function(e) { + const t = { + arrayBuffer: e.arrayBuffer, + byteOffset: e.byteOffset, + loadAttributesFor2D: e.projectTo2D + }, n = new PntsLoader(t); + try { + await n.load(); + const i = makeModelOptions$1(n, ModelType$1.TILE_PNTS, e); + return new Model(i); + } catch (i) { + throw n.destroy(), i; + } +}; +Model.fromI3dm = async function(e) { + const t = { + i3dmResource: e.resource, + arrayBuffer: e.arrayBuffer, + byteOffset: e.byteOffset, + releaseGltfJson: e.releaseGltfJson, + asynchronous: e.asynchronous, + incrementallyLoadTextures: e.incrementallyLoadTextures, + upAxis: e.upAxis, + forwardAxis: e.forwardAxis, + loadAttributesFor2D: e.projectTo2D, + enablePick: e.enablePick, + loadIndicesForWireframe: e.enableDebugWireframe, + loadPrimitiveOutline: e.enableShowOutline + }, n = new I3dmLoader(t); + try { + await n.load(); + const i = makeModelOptions$1(n, ModelType$1.TILE_I3DM, e); + return new Model(i); + } catch (i) { + throw n.destroy(), i; + } +}; +Model.fromGeoJson = async function(e) { + const t = { + geoJson: e.geoJson + }, n = new GeoJsonLoader(t), i = makeModelOptions$1( + n, + ModelType$1.TILE_GEOJSON, + e + ); + return new Model(i); +}; +const scratchColor$j = new Color(); +Model.prototype.applyColorAndShow = function(e) { + const t = Color.clone(this._color, scratchColor$j), n = defined(e) && defined(e.color), i = defined(e) && defined(e.show); + this._color = n ? e.color.evaluateColor(void 0, this._color) : Color.clone(Color.WHITE, this._color), this._show = i ? e.show.evaluate(void 0) : !0, isColorAlphaDirty(t, this._color) && this.resetDrawCommands(); +}; +Model.prototype.applyStyle = function(e) { + const t = this.type === ModelType$1.TILE_PNTS, n = defined(this.featureTableId) && this.featureTables[this.featureTableId].featuresLength > 0, i = defined(this.structuralMetadata) ? this.structuralMetadata.propertyAttributes : void 0, r = defined(i) && defined(i[0]); + if (t && (!n || r)) { + this.resetDrawCommands(); + return; + } + n ? (this.featureTables[this.featureTableId].applyStyle(e), updateStyleCommandsNeeded(this)) : (this.applyColorAndShow(e), this._styleCommandsNeeded = void 0); +}; +function makeModelOptions$1(e, t, n) { + return { + loader: e, + type: t, + resource: n.resource, + show: n.show, + modelMatrix: n.modelMatrix, + scale: n.scale, + minimumPixelSize: n.minimumPixelSize, + maximumScale: n.maximumScale, + id: n.id, + allowPicking: n.allowPicking, + clampAnimations: n.clampAnimations, + shadows: n.shadows, + debugShowBoundingVolume: n.debugShowBoundingVolume, + enableDebugWireframe: n.enableDebugWireframe, + debugWireframe: n.debugWireframe, + cull: n.cull, + opaquePass: n.opaquePass, + customShader: n.customShader, + content: n.content, + heightReference: n.heightReference, + scene: n.scene, + distanceDisplayCondition: n.distanceDisplayCondition, + color: n.color, + colorBlendAmount: n.colorBlendAmount, + colorBlendMode: n.colorBlendMode, + silhouetteColor: n.silhouetteColor, + silhouetteSize: n.silhouetteSize, + enableShowOutline: n.enableShowOutline, + showOutline: n.showOutline, + outlineColor: n.outlineColor, + clippingPlanes: n.clippingPlanes, + clippingPolygons: n.clippingPolygons, + lightColor: n.lightColor, + imageBasedLighting: n.imageBasedLighting, + backFaceCulling: n.backFaceCulling, + credit: n.credit, + showCreditsOnScreen: n.showCreditsOnScreen, + splitDirection: n.splitDirection, + projectTo2D: n.projectTo2D, + enablePick: n.enablePick, + featureIdLabel: n.featureIdLabel, + instanceFeatureIdLabel: n.instanceFeatureIdLabel, + pointCloudShading: n.pointCloudShading, + classificationType: n.classificationType, + pickObject: n.pickObject, + useSRGBColorFactors: n.useSRGBColorFactors, + useSRGBVertexColors: n.useSRGBVertexColors + }; +} +function Model3DTileContent(e, t, n) { + this._tileset = e, this._tile = t, this._resource = n, this._model = void 0, this._metadata = void 0, this._group = void 0, this._ready = !1; +} +Object.defineProperties(Model3DTileContent.prototype, { + featuresLength: { + get: function() { + const e = this._model, t = e.featureTables, n = e.featureTableId; + return defined(t) && defined(t[n]) ? t[n].featuresLength : 0; + } + }, + pointsLength: { + get: function() { + return this._model.statistics.pointsLength; + } + }, + trianglesLength: { + get: function() { + return this._model.statistics.trianglesLength; + } + }, + geometryByteLength: { + get: function() { + return this._model.statistics.geometryByteLength; + } + }, + texturesByteLength: { + get: function() { + return this._model.statistics.texturesByteLength; + } + }, + batchTableByteLength: { + get: function() { + const e = this._model.statistics; + return e.propertyTablesByteLength + e.batchTexturesByteLength; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Model3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._resource.getUrlComponent(!0); + } + }, + batchTable: { + get: function() { + const e = this._model, t = e.featureTables, n = e.featureTableId; + if (defined(t) && defined(t[n])) + return t[n]; + } + }, + metadata: { + get: function() { + return this._metadata; + }, + set: function(e) { + this._metadata = e; + } + }, + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + } + } +}); +Model3DTileContent.prototype.getFeature = function(e) { + const t = this._model, n = t.featureTableId; + return t.featureTables[n].getFeature(e); +}; +Model3DTileContent.prototype.hasProperty = function(e, t) { + const n = this._model, i = n.featureTableId; + return defined(i) ? n.featureTables[i].hasProperty(e, t) : !1; +}; +Model3DTileContent.prototype.applyDebugSettings = function(e, t) { + t = e ? t : Color.WHITE, this.featuresLength === 0 ? this._model.color = t : defined(this.batchTable) && this.batchTable.setAllColor(t); +}; +Model3DTileContent.prototype.applyStyle = function(e) { + this._model.style = e; +}; +Model3DTileContent.prototype.update = function(e, t) { + const n = this._model, i = this._tile; + n.colorBlendAmount = e.colorBlendAmount, n.colorBlendMode = e.colorBlendMode, n.modelMatrix = i.computedTransform, n.customShader = e.customShader, n.featureIdLabel = e.featureIdLabel, n.instanceFeatureIdLabel = e.instanceFeatureIdLabel, n.lightColor = e.lightColor, n.imageBasedLighting = e.imageBasedLighting, n.backFaceCulling = e.backFaceCulling, n.shadows = e.shadows, n.showCreditsOnScreen = e.showCreditsOnScreen, n.splitDirection = e.splitDirection, n.debugWireframe = e.debugWireframe, n.showOutline = e.showOutline, n.outlineColor = e.outlineColor, n.pointCloudShading = e.pointCloudShading; + const r = e.clippingPlanes; + n.referenceMatrix = e.clippingPlanesOriginMatrix, defined(r) && i.clippingPlanesDirty && (n._clippingPlanes = r.enabled && i._isClipped ? r : void 0), defined(r) && defined(n._clippingPlanes) && n._clippingPlanes !== r && (n._clippingPlanes = r, n._clippingPlanesState = 0); + const o = e.clippingPolygons; + defined(o) && i.clippingPolygonsDirty && (n._clippingPolygons = o.enabled && i._isClippedByPolygon ? o : void 0), defined(o) && defined(n._clippingPolygons) && n._clippingPolygons !== o && (n._clippingPolygons = o, n._clippingPolygonsState = 0), n.update(t), !this._ready && n.ready && (n.activeAnimations.addAll({ + loop: ModelAnimationLoop$1.REPEAT + }), this._ready = !0); +}; +Model3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Model3DTileContent.prototype.destroy = function() { + return this._model = this._model && this._model.destroy(), destroyObject(this); +}; +Model3DTileContent.fromGltf = async function(e, t, n, i) { + const r = new Model3DTileContent(e, t, n), s = makeModelOptions( + e, + t, + r, + { + gltf: i, + basePath: n + } + ), c = e.vectorClassificationOnly ? void 0 : e.classificationType; + s.classificationType = c; + const l = await Model.fromGltfAsync(s); + return r._model = l, r; +}; +Model3DTileContent.fromB3dm = async function(e, t, n, i, r) { + const o = new Model3DTileContent(e, t, n), c = makeModelOptions( + e, + t, + o, + { + arrayBuffer: i, + byteOffset: r, + resource: n + } + ), l = e.vectorClassificationOnly ? void 0 : e.classificationType; + c.classificationType = l; + const d = await Model.fromB3dm(c); + return o._model = d, o; +}; +Model3DTileContent.fromI3dm = async function(e, t, n, i, r) { + const o = new Model3DTileContent(e, t, n), c = makeModelOptions( + e, + t, + o, + { + arrayBuffer: i, + byteOffset: r, + resource: n + } + ), l = await Model.fromI3dm(c); + return o._model = l, o; +}; +Model3DTileContent.fromPnts = async function(e, t, n, i, r) { + const o = new Model3DTileContent(e, t, n), c = makeModelOptions( + e, + t, + o, + { + arrayBuffer: i, + byteOffset: r, + resource: n + } + ), l = await Model.fromPnts(c); + return o._model = l, o; +}; +Model3DTileContent.fromGeoJson = async function(e, t, n, i) { + const r = new Model3DTileContent(e, t, n), s = makeModelOptions( + e, + t, + r, + { + geoJson: i, + resource: n + } + ), c = await Model.fromGeoJson(s); + return r._model = c, r; +}; +Model3DTileContent.prototype.pick = function(e, t, n) { + if (!defined(this._model) || !this._ready) + return; + const i = t.verticalExaggeration, r = t.verticalExaggerationRelativeHeight; + return this._model.pick( + e, + t, + i, + r, + Ellipsoid.WGS84, + n + ); +}; +function makeModelOptions(e, t, n, i) { + const r = { + cull: !1, + // The model is already culled by 3D Tiles + releaseGltfJson: !0, + // Models are unique and will not benefit from caching so save memory + opaquePass: Pass$1.CESIUM_3D_TILE, + // Draw opaque portions of the model during the 3D Tiles pass + modelMatrix: t.computedTransform, + upAxis: e._modelUpAxis, + forwardAxis: e._modelForwardAxis, + incrementallyLoadTextures: !1, + customShader: e.customShader, + content: n, + colorBlendMode: e.colorBlendMode, + colorBlendAmount: e.colorBlendAmount, + lightColor: e.lightColor, + imageBasedLighting: e.imageBasedLighting, + featureIdLabel: e.featureIdLabel, + instanceFeatureIdLabel: e.instanceFeatureIdLabel, + pointCloudShading: e.pointCloudShading, + clippingPlanes: e.clippingPlanes, + backFaceCulling: e.backFaceCulling, + shadows: e.shadows, + showCreditsOnScreen: e.showCreditsOnScreen, + splitDirection: e.splitDirection, + enableDebugWireframe: e._enableDebugWireframe, + debugWireframe: e.debugWireframe, + projectTo2D: e._projectTo2D, + enablePick: e._enablePick, + enableShowOutline: e._enableShowOutline, + showOutline: e.showOutline, + outlineColor: e.outlineColor, + useSRGBVertexColors: e.useSRGBVertexColors, + useSRGBColorFactors: e.useSRGBColorFactors + }; + return combine$2(i, r); +} +function Tileset3DTileContent(e, t, n) { + this._tileset = e, this._tile = t, this._resource = n, this.featurePropertiesDirty = !1, this._metadata = void 0, this._group = void 0, this._ready = !1; +} +Object.defineProperties(Tileset3DTileContent.prototype, { + featuresLength: { + get: function() { + return 0; + } + }, + pointsLength: { + get: function() { + return 0; + } + }, + trianglesLength: { + get: function() { + return 0; + } + }, + geometryByteLength: { + get: function() { + return 0; + } + }, + texturesByteLength: { + get: function() { + return 0; + } + }, + batchTableByteLength: { + get: function() { + return 0; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Tileset3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._resource.getUrlComponent(!0); + } + }, + batchTable: { + get: function() { + } + }, + metadata: { + get: function() { + return this._metadata; + }, + set: function(e) { + this._metadata = e; + } + }, + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + } + } +}); +Tileset3DTileContent.fromJson = function(e, t, n, i) { + const r = new Tileset3DTileContent(e, t, n); + return r._tileset.loadTileset(r._resource, i, r._tile), r._ready = !0, r; +}; +Tileset3DTileContent.prototype.hasProperty = function(e, t) { + return !1; +}; +Tileset3DTileContent.prototype.getFeature = function(e) { +}; +Tileset3DTileContent.prototype.applyDebugSettings = function(e, t) { +}; +Tileset3DTileContent.prototype.applyStyle = function(e) { +}; +Tileset3DTileContent.prototype.update = function(e, t) { +}; +Tileset3DTileContent.prototype.pick = function(e, t, n) { +}; +Tileset3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Tileset3DTileContent.prototype.destroy = function() { + return destroyObject(this); +}; +const BillboardCollectionFS = `uniform sampler2D u_atlas; + +#ifdef VECTOR_TILE +uniform vec4 u_highlightColor; +#endif + +in vec2 v_textureCoordinates; +in vec4 v_pickColor; +in vec4 v_color; +in float v_splitDirection; + +#ifdef SDF +in vec4 v_outlineColor; +in float v_outlineWidth; +#endif + +#ifdef FRAGMENT_DEPTH_CHECK +in vec4 v_textureCoordinateBounds; // the min and max x and y values for the texture coordinates +in vec4 v_originTextureCoordinateAndTranslate; // texture coordinate at the origin, billboard translate (used for label glyphs) +in vec4 v_compressed; // x: eyeDepth, y: applyTranslate & enableDepthCheck, z: dimensions, w: imageSize +in mat2 v_rotationMatrix; + +const float SHIFT_LEFT12 = 4096.0; +const float SHIFT_LEFT1 = 2.0; + +const float SHIFT_RIGHT12 = 1.0 / 4096.0; +const float SHIFT_RIGHT1 = 1.0 / 2.0; + +float getGlobeDepth(vec2 adjustedST, vec2 depthLookupST, bool applyTranslate, vec2 dimensions, vec2 imageSize) +{ + vec2 lookupVector = imageSize * (depthLookupST - adjustedST); + lookupVector = v_rotationMatrix * lookupVector; + vec2 labelOffset = (dimensions - imageSize) * (depthLookupST - vec2(0.0, v_originTextureCoordinateAndTranslate.y)); // aligns label glyph with bounding rectangle. Will be zero for billboards because dimensions and imageSize will be equal + + vec2 translation = v_originTextureCoordinateAndTranslate.zw; + + if (applyTranslate) + { + // this is only needed for labels where the horizontal origin is not LEFT + // it moves the label back to where the "origin" should be since all label glyphs are set to HorizontalOrigin.LEFT + translation += (dimensions * v_originTextureCoordinateAndTranslate.xy * vec2(1.0, 0.0)); + } + + vec2 st = ((lookupVector - translation + labelOffset) + gl_FragCoord.xy) / czm_viewport.zw; + float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, st)); + + if (logDepthOrDepth == 0.0) + { + return 0.0; // not on the globe + } + + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); + return eyeCoordinate.z / eyeCoordinate.w; +} +#endif + + +#ifdef SDF + +// Get the distance from the edge of a glyph at a given position sampling an SDF texture. +float getDistance(vec2 position) +{ + return texture(u_atlas, position).r; +} + +// Samples the sdf texture at the given position and produces a color based on the fill color and the outline. +vec4 getSDFColor(vec2 position, float outlineWidth, vec4 outlineColor, float smoothing) +{ + float distance = getDistance(position); + + if (outlineWidth > 0.0) + { + // Don't get the outline edge exceed the SDF_EDGE + float outlineEdge = clamp(SDF_EDGE - outlineWidth, 0.0, SDF_EDGE); + float outlineFactor = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); + vec4 sdfColor = mix(outlineColor, v_color, outlineFactor); + float alpha = smoothstep(outlineEdge - smoothing, outlineEdge + smoothing, distance); + return vec4(sdfColor.rgb, sdfColor.a * alpha); + } + else + { + float alpha = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); + return vec4(v_color.rgb, v_color.a * alpha); + } +} +#endif + +void main() +{ + if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; + if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; + + vec4 color = texture(u_atlas, v_textureCoordinates); + +#ifdef SDF + float outlineWidth = v_outlineWidth; + vec4 outlineColor = v_outlineColor; + + // Get the current distance + float distance = getDistance(v_textureCoordinates); + +#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) + float smoothing = fwidth(distance); + // Get an offset that is approximately half the distance to the neighbor pixels + // 0.354 is approximately half of 1/sqrt(2) + vec2 sampleOffset = 0.354 * vec2(dFdx(v_textureCoordinates) + dFdy(v_textureCoordinates)); + + // Sample the center point + vec4 center = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); + + // Sample the 4 neighbors + vec4 color1 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); + vec4 color2 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); + vec4 color3 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); + vec4 color4 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); + + // Equally weight the center sample and the 4 neighboring samples + color = (center + color1 + color2 + color3 + color4)/5.0; +#else + // If no derivatives available (IE 10?), just do a single sample + float smoothing = 1.0/32.0; + color = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); +#endif + + color = czm_gammaCorrect(color); +#else + color = czm_gammaCorrect(color); + color *= czm_gammaCorrect(v_color); +#endif + +// Fully transparent parts of the billboard are not pickable. +#if !defined(OPAQUE) && !defined(TRANSLUCENT) + if (color.a < 0.005) // matches 0/255 and 1/255 + { + discard; + } +#else +// The billboard is rendered twice. The opaque pass discards translucent fragments +// and the translucent pass discards opaque fragments. +#ifdef OPAQUE + if (color.a < 0.995) // matches < 254/255 + { + discard; + } +#else + if (color.a >= 0.995) // matches 254/255 and 255/255 + { + discard; + } +#endif +#endif + +#ifdef VECTOR_TILE + color *= u_highlightColor; +#endif + out_FragColor = color; + +#ifdef LOG_DEPTH + czm_writeLogDepth(); +#endif + +#ifdef FRAGMENT_DEPTH_CHECK + float temp = v_compressed.y; + + temp = temp * SHIFT_RIGHT1; + + float temp2 = (temp - floor(temp)) * SHIFT_LEFT1; + bool enableDepthTest = temp2 != 0.0; + bool applyTranslate = floor(temp) != 0.0; + + if (enableDepthTest) { + temp = v_compressed.z; + temp = temp * SHIFT_RIGHT12; + + vec2 dimensions; + dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; + dimensions.x = floor(temp); + + temp = v_compressed.w; + temp = temp * SHIFT_RIGHT12; + + vec2 imageSize; + imageSize.y = (temp - floor(temp)) * SHIFT_LEFT12; + imageSize.x = floor(temp); + + vec2 adjustedST = v_textureCoordinates - v_textureCoordinateBounds.xy; + adjustedST = adjustedST / vec2(v_textureCoordinateBounds.z - v_textureCoordinateBounds.x, v_textureCoordinateBounds.w - v_textureCoordinateBounds.y); + + float epsilonEyeDepth = v_compressed.x + czm_epsilon1; + float globeDepth1 = getGlobeDepth(adjustedST, v_originTextureCoordinateAndTranslate.xy, applyTranslate, dimensions, imageSize); + + // negative values go into the screen + if (globeDepth1 != 0.0 && globeDepth1 > epsilonEyeDepth) + { + float globeDepth2 = getGlobeDepth(adjustedST, vec2(0.0, 1.0), applyTranslate, dimensions, imageSize); // top left corner + if (globeDepth2 != 0.0 && globeDepth2 > epsilonEyeDepth) + { + float globeDepth3 = getGlobeDepth(adjustedST, vec2(1.0, 1.0), applyTranslate, dimensions, imageSize); // top right corner + if (globeDepth3 != 0.0 && globeDepth3 > epsilonEyeDepth) + { + discard; + } + } + } + } +#endif + +} +`, BillboardCollectionVS = `#ifdef INSTANCED +in vec2 direction; +#endif +in vec4 positionHighAndScale; +in vec4 positionLowAndRotation; +in vec4 compressedAttribute0; // pixel offset, translate, horizontal origin, vertical origin, show, direction, texture coordinates (texture offset) +in vec4 compressedAttribute1; // aligned axis, translucency by distance, image width +in vec4 compressedAttribute2; // label horizontal origin, image height, color, pick color, size in meters, valid aligned axis, 13 bits free +in vec4 eyeOffset; // eye offset in meters, 4 bytes free (texture range) +in vec4 scaleByDistance; // near, nearScale, far, farScale +in vec4 pixelOffsetScaleByDistance; // near, nearScale, far, farScale +in vec4 compressedAttribute3; // distance display condition near, far, disableDepthTestDistance, dimensions +in vec2 sdf; // sdf outline color (rgb) and width (w) +in float splitDirection; // splitDirection +#if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) +in vec4 textureCoordinateBoundsOrLabelTranslate; // the min and max x and y values for the texture coordinates +#endif +#ifdef VECTOR_TILE +in float a_batchId; +#endif + +out vec2 v_textureCoordinates; +#ifdef FRAGMENT_DEPTH_CHECK +out vec4 v_textureCoordinateBounds; +out vec4 v_originTextureCoordinateAndTranslate; +out vec4 v_compressed; // x: eyeDepth, y: applyTranslate & enableDepthCheck, z: dimensions, w: imageSize +out mat2 v_rotationMatrix; +#endif + +out vec4 v_pickColor; +out vec4 v_color; +out float v_splitDirection; +#ifdef SDF +out vec4 v_outlineColor; +out float v_outlineWidth; +#endif + +const float UPPER_BOUND = 32768.0; + +const float SHIFT_LEFT16 = 65536.0; +const float SHIFT_LEFT12 = 4096.0; +const float SHIFT_LEFT8 = 256.0; +const float SHIFT_LEFT7 = 128.0; +const float SHIFT_LEFT5 = 32.0; +const float SHIFT_LEFT3 = 8.0; +const float SHIFT_LEFT2 = 4.0; +const float SHIFT_LEFT1 = 2.0; + +const float SHIFT_RIGHT12 = 1.0 / 4096.0; +const float SHIFT_RIGHT8 = 1.0 / 256.0; +const float SHIFT_RIGHT7 = 1.0 / 128.0; +const float SHIFT_RIGHT5 = 1.0 / 32.0; +const float SHIFT_RIGHT3 = 1.0 / 8.0; +const float SHIFT_RIGHT2 = 1.0 / 4.0; +const float SHIFT_RIGHT1 = 1.0 / 2.0; + +vec4 addScreenSpaceOffset(vec4 positionEC, vec2 imageSize, float scale, vec2 direction, vec2 origin, vec2 translate, vec2 pixelOffset, vec3 alignedAxis, bool validAlignedAxis, float rotation, bool sizeInMeters, out mat2 rotationMatrix, out float mpp) +{ + // Note the halfSize cannot be computed in JavaScript because it is sent via + // compressed vertex attributes that coerce it to an integer. + vec2 halfSize = imageSize * scale * 0.5; + halfSize *= ((direction * 2.0) - 1.0); + + vec2 originTranslate = origin * abs(halfSize); + +#if defined(ROTATION) || defined(ALIGNED_AXIS) + if (validAlignedAxis || rotation != 0.0) + { + float angle = rotation; + if (validAlignedAxis) + { + vec4 projectedAlignedAxis = czm_modelView3D * vec4(alignedAxis, 0.0); + angle += sign(-projectedAlignedAxis.x) * acos(sign(projectedAlignedAxis.y) * (projectedAlignedAxis.y * projectedAlignedAxis.y) / + (projectedAlignedAxis.x * projectedAlignedAxis.x + projectedAlignedAxis.y * projectedAlignedAxis.y)); + } + + float cosTheta = cos(angle); + float sinTheta = sin(angle); + rotationMatrix = mat2(cosTheta, sinTheta, -sinTheta, cosTheta); + halfSize = rotationMatrix * halfSize; + } + else + { + rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); + } +#endif + + mpp = czm_metersPerPixel(positionEC); + positionEC.xy += (originTranslate + halfSize) * czm_branchFreeTernary(sizeInMeters, 1.0, mpp); + positionEC.xy += (translate + pixelOffset) * mpp; + + return positionEC; +} + +#ifdef VERTEX_DEPTH_CHECK +float getGlobeDepth(vec4 positionEC) +{ + vec4 posWC = czm_eyeToWindowCoordinates(positionEC); + + float globeDepth = czm_unpackDepth(texture(czm_globeDepthTexture, posWC.xy / czm_viewport.zw)); + + if (globeDepth == 0.0) + { + return 0.0; // not on the globe + } + + vec4 eyeCoordinate = czm_windowToEyeCoordinates(posWC.xy, globeDepth); + return eyeCoordinate.z / eyeCoordinate.w; +} +#endif +void main() +{ + // Modifying this shader may also require modifications to Billboard._computeScreenSpacePosition + + // unpack attributes + vec3 positionHigh = positionHighAndScale.xyz; + vec3 positionLow = positionLowAndRotation.xyz; + float scale = positionHighAndScale.w; + +#if defined(ROTATION) || defined(ALIGNED_AXIS) + float rotation = positionLowAndRotation.w; +#else + float rotation = 0.0; +#endif + + float compressed = compressedAttribute0.x; + + vec2 pixelOffset; + pixelOffset.x = floor(compressed * SHIFT_RIGHT7); + compressed -= pixelOffset.x * SHIFT_LEFT7; + pixelOffset.x -= UPPER_BOUND; + + vec2 origin; + origin.x = floor(compressed * SHIFT_RIGHT5); + compressed -= origin.x * SHIFT_LEFT5; + + origin.y = floor(compressed * SHIFT_RIGHT3); + compressed -= origin.y * SHIFT_LEFT3; + +#ifdef FRAGMENT_DEPTH_CHECK + vec2 depthOrigin = origin.xy; +#endif + origin -= vec2(1.0); + + float show = floor(compressed * SHIFT_RIGHT2); + compressed -= show * SHIFT_LEFT2; + +#ifdef INSTANCED + vec2 textureCoordinatesBottomLeft = czm_decompressTextureCoordinates(compressedAttribute0.w); + vec2 textureCoordinatesRange = czm_decompressTextureCoordinates(eyeOffset.w); + vec2 textureCoordinates = textureCoordinatesBottomLeft + direction * textureCoordinatesRange; +#else + vec2 direction; + direction.x = floor(compressed * SHIFT_RIGHT1); + direction.y = compressed - direction.x * SHIFT_LEFT1; + + vec2 textureCoordinates = czm_decompressTextureCoordinates(compressedAttribute0.w); +#endif + + float temp = compressedAttribute0.y * SHIFT_RIGHT8; + pixelOffset.y = -(floor(temp) - UPPER_BOUND); + + vec2 translate; + translate.y = (temp - floor(temp)) * SHIFT_LEFT16; + + temp = compressedAttribute0.z * SHIFT_RIGHT8; + translate.x = floor(temp) - UPPER_BOUND; + + translate.y += (temp - floor(temp)) * SHIFT_LEFT8; + translate.y -= UPPER_BOUND; + + temp = compressedAttribute1.x * SHIFT_RIGHT8; + float temp2 = floor(compressedAttribute2.w * SHIFT_RIGHT2); + + vec2 imageSize = vec2(floor(temp), temp2); + +#ifdef FRAGMENT_DEPTH_CHECK + float labelHorizontalOrigin = floor(compressedAttribute2.w - (temp2 * SHIFT_LEFT2)); + float applyTranslate = 0.0; + if (labelHorizontalOrigin != 0.0) // is a billboard, so set apply translate to false + { + applyTranslate = 1.0; + labelHorizontalOrigin -= 2.0; + depthOrigin.x = labelHorizontalOrigin + 1.0; + } + + depthOrigin = vec2(1.0) - (depthOrigin * 0.5); +#endif + +#ifdef EYE_DISTANCE_TRANSLUCENCY + vec4 translucencyByDistance; + translucencyByDistance.x = compressedAttribute1.z; + translucencyByDistance.z = compressedAttribute1.w; + + translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; + + temp = compressedAttribute1.y * SHIFT_RIGHT8; + translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; +#endif + +#if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) + temp = compressedAttribute3.w; + temp = temp * SHIFT_RIGHT12; + + vec2 dimensions; + dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; + dimensions.x = floor(temp); +#endif + +#ifdef ALIGNED_AXIS + vec3 alignedAxis = czm_octDecode(floor(compressedAttribute1.y * SHIFT_RIGHT8)); + temp = compressedAttribute2.z * SHIFT_RIGHT5; + bool validAlignedAxis = (temp - floor(temp)) * SHIFT_LEFT1 > 0.0; +#else + vec3 alignedAxis = vec3(0.0); + bool validAlignedAxis = false; +#endif + + vec4 pickColor; + vec4 color; + + temp = compressedAttribute2.y; + temp = temp * SHIFT_RIGHT8; + pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; + pickColor.r = floor(temp); + + temp = compressedAttribute2.x; + temp = temp * SHIFT_RIGHT8; + color.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + color.g = (temp - floor(temp)) * SHIFT_LEFT8; + color.r = floor(temp); + + temp = compressedAttribute2.z * SHIFT_RIGHT8; + bool sizeInMeters = floor((temp - floor(temp)) * SHIFT_LEFT7) > 0.0; + temp = floor(temp) * SHIFT_RIGHT8; + + pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; + pickColor /= 255.0; + + color.a = floor(temp); + color /= 255.0; + + /////////////////////////////////////////////////////////////////////////// + + vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + vec4 positionEC = czm_modelViewRelativeToEye * p; + +#if defined(FRAGMENT_DEPTH_CHECK) || defined(VERTEX_DEPTH_CHECK) + float eyeDepth = positionEC.z; +#endif + + positionEC = czm_eyeOffset(positionEC, eyeOffset.xyz); + positionEC.xyz *= show; + + /////////////////////////////////////////////////////////////////////////// + +#if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(EYE_DISTANCE_PIXEL_OFFSET) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) + float lengthSq; + if (czm_sceneMode == czm_sceneMode2D) + { + // 2D camera distance is a special case + // treat all billboards as flattened to the z=0.0 plane + lengthSq = czm_eyeHeight2D.y; + } + else + { + lengthSq = dot(positionEC.xyz, positionEC.xyz); + } +#endif + +#ifdef EYE_DISTANCE_SCALING + float distanceScale = czm_nearFarScalar(scaleByDistance, lengthSq); + scale *= distanceScale; + translate *= distanceScale; + // push vertex behind near plane for clipping + if (scale == 0.0) + { + positionEC.xyz = vec3(0.0); + } +#endif + + float translucency = 1.0; +#ifdef EYE_DISTANCE_TRANSLUCENCY + translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); + // push vertex behind near plane for clipping + if (translucency == 0.0) + { + positionEC.xyz = vec3(0.0); + } +#endif + +#ifdef EYE_DISTANCE_PIXEL_OFFSET + float pixelOffsetScale = czm_nearFarScalar(pixelOffsetScaleByDistance, lengthSq); + pixelOffset *= pixelOffsetScale; +#endif + +#ifdef DISTANCE_DISPLAY_CONDITION + float nearSq = compressedAttribute3.x; + float farSq = compressedAttribute3.y; + if (lengthSq < nearSq || lengthSq > farSq) + { + positionEC.xyz = vec3(0.0); + } +#endif + + mat2 rotationMatrix; + float mpp; + +#ifdef DISABLE_DEPTH_DISTANCE + float disableDepthTestDistance = compressedAttribute3.z; +#endif + +#ifdef VERTEX_DEPTH_CHECK +if (lengthSq < disableDepthTestDistance) { + float depthsilon = 10.0; + + vec2 labelTranslate = textureCoordinateBoundsOrLabelTranslate.xy; + vec4 pEC1 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); + float globeDepth1 = getGlobeDepth(pEC1); + + if (globeDepth1 != 0.0 && pEC1.z + depthsilon < globeDepth1) + { + vec4 pEC2 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0, 1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); + float globeDepth2 = getGlobeDepth(pEC2); + + if (globeDepth2 != 0.0 && pEC2.z + depthsilon < globeDepth2) + { + vec4 pEC3 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); + float globeDepth3 = getGlobeDepth(pEC3); + if (globeDepth3 != 0.0 && pEC3.z + depthsilon < globeDepth3) + { + positionEC.xyz = vec3(0.0); + } + } + } +} +#endif + + positionEC = addScreenSpaceOffset(positionEC, imageSize, scale, direction, origin, translate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); + gl_Position = czm_projection * positionEC; + v_textureCoordinates = textureCoordinates; + +#ifdef LOG_DEPTH + czm_vertexLogDepth(); +#endif + +#ifdef DISABLE_DEPTH_DISTANCE + if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) + { + disableDepthTestDistance = czm_minimumDisableDepthTestDistance; + } + + if (disableDepthTestDistance != 0.0) + { + // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. + float zclip = gl_Position.z / gl_Position.w; + bool clipped = (zclip < -1.0 || zclip > 1.0); + if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) + { + // Position z on the near plane. + gl_Position.z = -gl_Position.w; +#ifdef LOG_DEPTH + v_depthFromNearPlusOne = 1.0; +#endif + } + } +#endif + +#ifdef FRAGMENT_DEPTH_CHECK + if (sizeInMeters) { + translate /= mpp; + dimensions /= mpp; + imageSize /= mpp; + } + +#if defined(ROTATION) || defined(ALIGNED_AXIS) + v_rotationMatrix = rotationMatrix; +#else + v_rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); +#endif + + float enableDepthCheck = 0.0; + if (lengthSq < disableDepthTestDistance) + { + enableDepthCheck = 1.0; + } + + float dw = floor(clamp(dimensions.x, 0.0, SHIFT_LEFT12)); + float dh = floor(clamp(dimensions.y, 0.0, SHIFT_LEFT12)); + + float iw = floor(clamp(imageSize.x, 0.0, SHIFT_LEFT12)); + float ih = floor(clamp(imageSize.y, 0.0, SHIFT_LEFT12)); + + v_compressed.x = eyeDepth; + v_compressed.y = applyTranslate * SHIFT_LEFT1 + enableDepthCheck; + v_compressed.z = dw * SHIFT_LEFT12 + dh; + v_compressed.w = iw * SHIFT_LEFT12 + ih; + v_originTextureCoordinateAndTranslate.xy = depthOrigin; + v_originTextureCoordinateAndTranslate.zw = translate; + v_textureCoordinateBounds = textureCoordinateBoundsOrLabelTranslate; + +#endif + +#ifdef SDF + vec4 outlineColor; + float outlineWidth; + + temp = sdf.x; + temp = temp * SHIFT_RIGHT8; + outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; + outlineColor.r = floor(temp); + + temp = sdf.y; + temp = temp * SHIFT_RIGHT8; + float temp3 = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + outlineWidth = (temp - floor(temp)) * SHIFT_LEFT8; + outlineColor.a = floor(temp); + outlineColor /= 255.0; + + v_outlineWidth = outlineWidth / 255.0; + v_outlineColor = outlineColor; + v_outlineColor.a *= translucency; +#endif + + v_pickColor = pickColor; + + v_color = color; + v_color.a *= translucency; + v_splitDirection = splitDirection; +} +`; +function Billboard(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let n = e.translucencyByDistance, i = e.pixelOffsetScaleByDistance, r = e.scaleByDistance, o = e.distanceDisplayCondition; + defined(n) && (n = NearFarScalar.clone(n)), defined(i) && (i = NearFarScalar.clone( + i + )), defined(r) && (r = NearFarScalar.clone(r)), defined(o) && (o = DistanceDisplayCondition.clone( + o + )), this._show = defaultValue(e.show, !0), this._position = Cartesian3.clone( + defaultValue(e.position, Cartesian3.ZERO) + ), this._actualPosition = Cartesian3.clone(this._position), this._pixelOffset = Cartesian2.clone( + defaultValue(e.pixelOffset, Cartesian2.ZERO) + ), this._translate = new Cartesian2(0, 0), this._eyeOffset = Cartesian3.clone( + defaultValue(e.eyeOffset, Cartesian3.ZERO) + ), this._heightReference = defaultValue( + e.heightReference, + HeightReference$1.NONE + ), this._verticalOrigin = defaultValue( + e.verticalOrigin, + VerticalOrigin$1.CENTER + ), this._horizontalOrigin = defaultValue( + e.horizontalOrigin, + HorizontalOrigin$1.CENTER + ), this._scale = defaultValue(e.scale, 1), this._color = Color.clone(defaultValue(e.color, Color.WHITE)), this._rotation = defaultValue(e.rotation, 0), this._alignedAxis = Cartesian3.clone( + defaultValue(e.alignedAxis, Cartesian3.ZERO) + ), this._width = e.width, this._height = e.height, this._scaleByDistance = r, this._translucencyByDistance = n, this._pixelOffsetScaleByDistance = i, this._sizeInMeters = defaultValue(e.sizeInMeters, !1), this._distanceDisplayCondition = o, this._disableDepthTestDistance = e.disableDepthTestDistance, this._id = e.id, this._collection = defaultValue(e.collection, t), this._pickId = void 0, this._pickPrimitive = defaultValue(e._pickPrimitive, this), this._billboardCollection = t, this._dirty = !1, this._index = -1, this._batchIndex = void 0, this._imageIndex = -1, this._imageIndexPromise = void 0, this._imageId = void 0, this._image = void 0, this._imageSubRegion = void 0, this._imageWidth = void 0, this._imageHeight = void 0, this._labelDimensions = void 0, this._labelHorizontalOrigin = void 0, this._labelTranslate = void 0; + const s = e.image; + let c = e.imageId; + defined(s) && (defined(c) || (typeof s == "string" ? c = s : defined(s.src) ? c = s.src : c = createGuid()), this._imageId = c, this._image = s), defined(e.imageSubRegion) && (this._imageId = c, this._imageSubRegion = e.imageSubRegion), defined(this._billboardCollection._textureAtlas) && this._loadImage(), this._actualClampedPosition = void 0, this._removeCallbackFunc = void 0, this._mode = SceneMode$1.SCENE3D, this._clusterShow = !0, this._outlineColor = Color.clone( + defaultValue(e.outlineColor, Color.BLACK) + ), this._outlineWidth = defaultValue(e.outlineWidth, 0), this._updateClamping(), this._splitDirection = defaultValue( + e.splitDirection, + SplitDirection$1.NONE + ); +} +const SHOW_INDEX$7 = Billboard.SHOW_INDEX = 0, POSITION_INDEX$7 = Billboard.POSITION_INDEX = 1, PIXEL_OFFSET_INDEX$1 = Billboard.PIXEL_OFFSET_INDEX = 2, EYE_OFFSET_INDEX$1 = Billboard.EYE_OFFSET_INDEX = 3, HORIZONTAL_ORIGIN_INDEX$1 = Billboard.HORIZONTAL_ORIGIN_INDEX = 4, VERTICAL_ORIGIN_INDEX$1 = Billboard.VERTICAL_ORIGIN_INDEX = 5, SCALE_INDEX$3 = Billboard.SCALE_INDEX = 6, IMAGE_INDEX_INDEX$1 = Billboard.IMAGE_INDEX_INDEX = 7, COLOR_INDEX$5 = Billboard.COLOR_INDEX = 8, ROTATION_INDEX$1 = Billboard.ROTATION_INDEX = 9, ALIGNED_AXIS_INDEX$1 = Billboard.ALIGNED_AXIS_INDEX = 10, SCALE_BY_DISTANCE_INDEX$3 = Billboard.SCALE_BY_DISTANCE_INDEX = 11, TRANSLUCENCY_BY_DISTANCE_INDEX$3 = Billboard.TRANSLUCENCY_BY_DISTANCE_INDEX = 12, PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX$1 = Billboard.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX = 13, DISTANCE_DISPLAY_CONDITION$2 = Billboard.DISTANCE_DISPLAY_CONDITION = 14, DISABLE_DEPTH_DISTANCE$1 = Billboard.DISABLE_DEPTH_DISTANCE = 15; +Billboard.TEXTURE_COORDINATE_BOUNDS = 16; +const SDF_INDEX$1 = Billboard.SDF_INDEX = 17, SPLIT_DIRECTION_INDEX$3 = Billboard.SPLIT_DIRECTION_INDEX = 18; +Billboard.NUMBER_OF_PROPERTIES = 19; +function makeDirty$3(e, t) { + const n = e._billboardCollection; + defined(n) && (n._updateBillboard(e, t), e._dirty = !0); +} +Object.defineProperties(Billboard.prototype, { + /** + * Determines if this billboard will be shown. Use this to hide or show a billboard, instead + * of removing it and re-adding it to the collection. + * @memberof Billboard.prototype + * @type {boolean} + * @default true + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + this._show !== e && (this._show = e, makeDirty$3(this, SHOW_INDEX$7)); + } + }, + /** + * Gets or sets the Cartesian position of this billboard. + * @memberof Billboard.prototype + * @type {Cartesian3} + */ + position: { + get: function() { + return this._position; + }, + set: function(e) { + const t = this._position; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), Cartesian3.clone(e, this._actualPosition), this._updateClamping(), makeDirty$3(this, POSITION_INDEX$7)); + } + }, + /** + * Gets or sets the height reference of this billboard. + * @memberof Billboard.prototype + * @type {HeightReference} + * @default HeightReference.NONE + */ + heightReference: { + get: function() { + return this._heightReference; + }, + set: function(e) { + const t = this._heightReference; + e !== t && (this._heightReference = e, this._updateClamping(), makeDirty$3(this, POSITION_INDEX$7)); + } + }, + /** + * Gets or sets the pixel offset in screen space from the origin of this billboard. This is commonly used + * to align multiple billboards and labels at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

+ *
+ * + * + * + *
default
b.pixeloffset = new Cartesian2(50, 25);
+ * The billboard's origin is indicated by the yellow point. + *
+ * @memberof Billboard.prototype + * @type {Cartesian2} + */ + pixelOffset: { + get: function() { + return this._pixelOffset; + }, + set: function(e) { + const t = this._pixelOffset; + Cartesian2.equals(t, e) || (Cartesian2.clone(e, t), makeDirty$3(this, PIXEL_OFFSET_INDEX$1)); + } + }, + /** + * Gets or sets near and far scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @memberof Billboard.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a billboard's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable scaling by distance + * b.scaleByDistance = undefined; + */ + scaleByDistance: { + get: function() { + return this._scaleByDistance; + }, + set: function(e) { + const t = this._scaleByDistance; + NearFarScalar.equals(t, e) || (this._scaleByDistance = NearFarScalar.clone(e, t), makeDirty$3(this, SCALE_BY_DISTANCE_INDEX$3)); + } + }, + /** + * Gets or sets near and far translucency properties of a Billboard based on the billboard's distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @memberof Billboard.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a billboard's translucency to 1.0 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable translucency by distance + * b.translucencyByDistance = undefined; + */ + translucencyByDistance: { + get: function() { + return this._translucencyByDistance; + }, + set: function(e) { + const t = this._translucencyByDistance; + NearFarScalar.equals(t, e) || (this._translucencyByDistance = NearFarScalar.clone( + e, + t + ), makeDirty$3(this, TRANSLUCENCY_BY_DISTANCE_INDEX$3)); + } + }, + /** + * Gets or sets near and far pixel offset scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset scale remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @memberof Billboard.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a billboard's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the billboard and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * b.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * b.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * + * @example + * // Example 2. + * // disable pixel offset by distance + * b.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: { + get: function() { + return this._pixelOffsetScaleByDistance; + }, + set: function(e) { + const t = this._pixelOffsetScaleByDistance; + NearFarScalar.equals(t, e) || (this._pixelOffsetScaleByDistance = NearFarScalar.clone( + e, + t + ), makeDirty$3(this, PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX$1)); + } + }, + /** + * Gets or sets the 3D Cartesian offset applied to this billboard in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

+ * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

+ * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *
+ * + * + * + *
+ * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ * @memberof Billboard.prototype + * @type {Cartesian3} + */ + eyeOffset: { + get: function() { + return this._eyeOffset; + }, + set: function(e) { + const t = this._eyeOffset; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), makeDirty$3(this, EYE_OFFSET_INDEX$1)); + } + }, + /** + * Gets or sets the horizontal origin of this billboard, which determines if the billboard is + * to the left, center, or right of its anchor position. + *

+ *
+ *
+ *
+ * @memberof Billboard.prototype + * @type {HorizontalOrigin} + * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + horizontalOrigin: { + get: function() { + return this._horizontalOrigin; + }, + set: function(e) { + this._horizontalOrigin !== e && (this._horizontalOrigin = e, makeDirty$3(this, HORIZONTAL_ORIGIN_INDEX$1)); + } + }, + /** + * Gets or sets the vertical origin of this billboard, which determines if the billboard is + * to the above, below, or at the center of its anchor position. + *

+ *
+ *
+ *
+ * @memberof Billboard.prototype + * @type {VerticalOrigin} + * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + verticalOrigin: { + get: function() { + return this._verticalOrigin; + }, + set: function(e) { + this._verticalOrigin !== e && (this._verticalOrigin = e, makeDirty$3(this, VERTICAL_ORIGIN_INDEX$1)); + } + }, + /** + * Gets or sets the uniform scale that is multiplied with the billboard's image size in pixels. + * A scale of 1.0 does not change the size of the billboard; a scale greater than + * 1.0 enlarges the billboard; a positive scale less than 1.0 shrinks + * the billboard. + *

+ *
+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ * @memberof Billboard.prototype + * @type {number} + */ + scale: { + get: function() { + return this._scale; + }, + set: function(e) { + this._scale !== e && (this._scale = e, makeDirty$3(this, SCALE_INDEX$3)); + } + }, + /** + * Gets or sets the color that is multiplied with the billboard's texture. This has two common use cases. First, + * the same white texture may be used by many different billboards, each with a different color, to create + * colored billboards. Second, the color's alpha component can be used to make the billboard translucent as shown below. + * An alpha of 0.0 makes the billboard transparent, and 1.0 makes the billboard opaque. + *

+ *
+ * + * + * + *
default
alpha : 0.5
+ *
+ *
+ * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @memberof Billboard.prototype + * @type {Color} + * + * @example + * // Example 1. Assign yellow. + * b.color = Cesium.Color.YELLOW; + * + * @example + * // Example 2. Make a billboard 50% translucent. + * b.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + const t = this._color; + Color.equals(t, e) || (Color.clone(e, t), makeDirty$3(this, COLOR_INDEX$5)); + } + }, + /** + * Gets or sets the rotation angle in radians. + * @memberof Billboard.prototype + * @type {number} + */ + rotation: { + get: function() { + return this._rotation; + }, + set: function(e) { + this._rotation !== e && (this._rotation = e, makeDirty$3(this, ROTATION_INDEX$1)); + } + }, + /** + * Gets or sets the aligned axis in world space. The aligned axis is the unit vector that the billboard up vector points towards. + * The default is the zero vector, which means the billboard is aligned to the screen up vector. + * @memberof Billboard.prototype + * @type {Cartesian3} + * @example + * // Example 1. + * // Have the billboard up vector point north + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * + * @example + * // Example 2. + * // Have the billboard point east. + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * billboard.rotation = -Cesium.Math.PI_OVER_TWO; + * + * @example + * // Example 3. + * // Reset the aligned axis + * billboard.alignedAxis = Cesium.Cartesian3.ZERO; + */ + alignedAxis: { + get: function() { + return this._alignedAxis; + }, + set: function(e) { + const t = this._alignedAxis; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), makeDirty$3(this, ALIGNED_AXIS_INDEX$1)); + } + }, + /** + * Gets or sets a width for the billboard. If undefined, the image width will be used. + * @memberof Billboard.prototype + * @type {number} + */ + width: { + get: function() { + return defaultValue(this._width, this._imageWidth); + }, + set: function(e) { + this._width !== e && (this._width = e, makeDirty$3(this, IMAGE_INDEX_INDEX$1)); + } + }, + /** + * Gets or sets a height for the billboard. If undefined, the image height will be used. + * @memberof Billboard.prototype + * @type {number} + */ + height: { + get: function() { + return defaultValue(this._height, this._imageHeight); + }, + set: function(e) { + this._height !== e && (this._height = e, makeDirty$3(this, IMAGE_INDEX_INDEX$1)); + } + }, + /** + * Gets or sets if the billboard size is in meters or pixels. true to size the billboard in meters; + * otherwise, the size is in pixels. + * @memberof Billboard.prototype + * @type {boolean} + * @default false + */ + sizeInMeters: { + get: function() { + return this._sizeInMeters; + }, + set: function(e) { + this._sizeInMeters !== e && (this._sizeInMeters = e, makeDirty$3(this, COLOR_INDEX$5)); + } + }, + /** + * Gets or sets the condition specifying at what distance from the camera that this billboard will be displayed. + * @memberof Billboard.prototype + * @type {DistanceDisplayCondition} + * @default undefined + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + DistanceDisplayCondition.equals(e, this._distanceDisplayCondition) || (this._distanceDisplayCondition = DistanceDisplayCondition.clone( + e, + this._distanceDisplayCondition + ), makeDirty$3(this, DISTANCE_DISPLAY_CONDITION$2)); + } + }, + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof Billboard.prototype + * @type {number} + */ + disableDepthTestDistance: { + get: function() { + return this._disableDepthTestDistance; + }, + set: function(e) { + this._disableDepthTestDistance !== e && (this._disableDepthTestDistance = e, makeDirty$3(this, DISABLE_DEPTH_DISTANCE$1)); + } + }, + /** + * Gets or sets the user-defined object returned when the billboard is picked. + * @memberof Billboard.prototype + * @type {*} + */ + id: { + get: function() { + return this._id; + }, + set: function(e) { + this._id = e, defined(this._pickId) && (this._pickId.object.id = e); + } + }, + /** + * The primitive to return when picking this billboard. + * @memberof Billboard.prototype + * @private + */ + pickPrimitive: { + get: function() { + return this._pickPrimitive; + }, + set: function(e) { + this._pickPrimitive = e, defined(this._pickId) && (this._pickId.object.primitive = e); + } + }, + /** + * @private + */ + pickId: { + get: function() { + return this._pickId; + } + }, + /** + *

+ * Gets or sets the image to be used for this billboard. If a texture has already been created for the + * given image, the existing texture is used. + *

+ *

+ * This property can be set to a loaded Image, a URL which will be loaded as an Image automatically, + * a canvas, or another billboard's image property (from the same billboard collection). + *

+ * + * @memberof Billboard.prototype + * @type {string} + * @example + * // load an image from a URL + * b.image = 'some/image/url.png'; + * + * // assuming b1 and b2 are billboards in the same billboard collection, + * // use the same image for both billboards. + * b2.image = b1.image; + */ + image: { + get: function() { + return this._imageId; + }, + set: function(e) { + defined(e) ? typeof e == "string" ? this.setImage(e, e) : e instanceof Resource ? this.setImage(e.url, e) : defined(e.src) ? this.setImage(e.src, e) : defined(e.id) && e.id !== "" ? this.setImage(e.id, e) : this.setImage(createGuid(), e) : (this._imageIndex = -1, this._imageSubRegion = void 0, this._imageId = void 0, this._image = void 0, this._imageIndexPromise = void 0, makeDirty$3(this, IMAGE_INDEX_INDEX$1)); + } + }, + /** + * When true, this billboard is ready to render, i.e., the image + * has been downloaded and the WebGL resources are created. + * + * @memberof Billboard.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + ready: { + get: function() { + return this._imageIndex !== -1; + } + }, + /** + * Keeps track of the position of the billboard based on the height reference. + * @memberof Billboard.prototype + * @type {Cartesian3} + * @private + */ + _clampedPosition: { + get: function() { + return this._actualClampedPosition; + }, + set: function(e) { + this._actualClampedPosition = Cartesian3.clone( + e, + this._actualClampedPosition + ), makeDirty$3(this, POSITION_INDEX$7); + } + }, + /** + * Determines whether or not this billboard will be shown or hidden because it was clustered. + * @memberof Billboard.prototype + * @type {boolean} + * @private + */ + clusterShow: { + get: function() { + return this._clusterShow; + }, + set: function(e) { + this._clusterShow !== e && (this._clusterShow = e, makeDirty$3(this, SHOW_INDEX$7)); + } + }, + /** + * The outline color of this Billboard. Effective only for SDF billboards like Label glyphs. + * @memberof Billboard.prototype + * @type {Color} + * @private + */ + outlineColor: { + get: function() { + return this._outlineColor; + }, + set: function(e) { + const t = this._outlineColor; + Color.equals(t, e) || (Color.clone(e, t), makeDirty$3(this, SDF_INDEX$1)); + } + }, + /** + * The outline width of this Billboard in pixels. Effective only for SDF billboards like Label glyphs. + * @memberof Billboard.prototype + * @type {number} + * @private + */ + outlineWidth: { + get: function() { + return this._outlineWidth; + }, + set: function(e) { + this._outlineWidth !== e && (this._outlineWidth = e, makeDirty$3(this, SDF_INDEX$1)); + } + }, + /** + * Gets or sets the {@link SplitDirection} of this billboard. + * @memberof Billboard.prototype + * @type {SplitDirection} + * @default {@link SplitDirection.NONE} + */ + splitDirection: { + get: function() { + return this._splitDirection; + }, + set: function(e) { + this._splitDirection !== e && (this._splitDirection = e, makeDirty$3(this, SPLIT_DIRECTION_INDEX$3)); + } + } +}); +Billboard.prototype.getPickId = function(e) { + return defined(this._pickId) || (this._pickId = e.createPickId({ + primitive: this._pickPrimitive, + collection: this._collection, + id: this._id + })), this._pickId; +}; +Billboard.prototype._updateClamping = function() { + Billboard._updateClamping(this._billboardCollection, this); +}; +const scratchCartographic$f = new Cartographic(); +Billboard._updateClamping = function(e, t) { + const n = e._scene; + if (!defined(n)) + return; + const i = defaultValue(n.ellipsoid, Ellipsoid.default), r = n.frameState.mode, o = r !== t._mode; + if (t._mode = r, (t._heightReference === HeightReference$1.NONE || o) && defined(t._removeCallbackFunc) && (t._removeCallbackFunc(), t._removeCallbackFunc = void 0, t._clampedPosition = void 0), t._heightReference === HeightReference$1.NONE || !defined(t._position)) + return; + defined(t._removeCallbackFunc) && t._removeCallbackFunc(); + const s = i.cartesianToCartographic(t._position); + if (!defined(s)) { + t._actualClampedPosition = void 0; + return; + } + function c(d) { + const f = i.cartographicToCartesian( + d, + t._clampedPosition + ); + isHeightReferenceRelative(t._heightReference) && (t._mode === SceneMode$1.SCENE3D ? (d.height += s.height, i.cartographicToCartesian( + d, + f + )) : f.x += s.height), t._clampedPosition = f; + } + t._removeCallbackFunc = n.updateHeight( + s, + c, + t._heightReference + ), Cartographic.clone(s, scratchCartographic$f); + const l = n.getHeight(s, t._heightReference); + defined(l) && (scratchCartographic$f.height = l), c(scratchCartographic$f); +}; +Billboard.prototype._loadImage = function() { + const e = this._billboardCollection._textureAtlas, t = this._imageId, n = this._image, i = this._imageSubRegion; + let r; + const o = this; + function s(l) { + if (o._imageId !== t || o._image !== n || !BoundingRectangle.equals(o._imageSubRegion, i)) + return; + const d = e.textureCoordinates[l]; + o._imageWidth = e.texture.width * d.width, o._imageHeight = e.texture.height * d.height, o._imageIndex = l, o._ready = !0, o._image = void 0, o._imageIndexPromise = void 0, makeDirty$3(o, IMAGE_INDEX_INDEX$1); + const f = o._billboardCollection._scene; + defined(f) && f.frameState.afterRender.push(() => !0); + } + if (defined(n) && (r = e.addImage(t, n)), defined(i) && (r = e.addSubRegion(t, i)), this._imageIndexPromise = r, !defined(r)) + return; + const c = e.getImageIndex(t); + if (defined(c) && !defined(i)) { + s(c); + return; + } + r.then(s).catch(function(l) { + console.error(`Error loading image for billboard: ${l}`), o._imageIndexPromise = void 0; + }); +}; +Billboard.prototype.setImage = function(e, t) { + this._imageId !== e && (this._imageIndex = -1, this._imageSubRegion = void 0, this._imageId = e, this._image = t, defined(this._billboardCollection._textureAtlas) && this._loadImage()); +}; +Billboard.prototype.setImageSubRegion = function(e, t) { + this._imageId === e && BoundingRectangle.equals(this._imageSubRegion, t) || (this._imageIndex = -1, this._imageId = e, this._imageSubRegion = BoundingRectangle.clone(t), defined(this._billboardCollection._textureAtlas) && this._loadImage()); +}; +Billboard.prototype._setTranslate = function(e) { + const t = this._translate; + Cartesian2.equals(t, e) || (Cartesian2.clone(e, t), makeDirty$3(this, PIXEL_OFFSET_INDEX$1)); +}; +Billboard.prototype._getActualPosition = function() { + return defined(this._clampedPosition) ? this._clampedPosition : this._actualPosition; +}; +Billboard.prototype._setActualPosition = function(e) { + defined(this._clampedPosition) || Cartesian3.clone(e, this._actualPosition), makeDirty$3(this, POSITION_INDEX$7); +}; +const tempCartesian3$1 = new Cartesian4(); +Billboard._computeActualPosition = function(e, t, n, i) { + return defined(e._clampedPosition) ? (n.mode !== e._mode && e._updateClamping(), e._clampedPosition) : n.mode === SceneMode$1.SCENE3D ? t : (Matrix4.multiplyByPoint(i, t, tempCartesian3$1), SceneTransforms.computeActualEllipsoidPosition( + n, + tempCartesian3$1 + )); +}; +const scratchCartesian3$9 = new Cartesian3(); +Billboard._computeScreenSpacePosition = function(e, t, n, i, r, o) { + const s = Matrix4.multiplyByPoint( + e, + t, + scratchCartesian3$9 + ), c = SceneTransforms.worldWithEyeOffsetToWindowCoordinates( + r, + s, + n, + o + ); + if (defined(c)) + return Cartesian2.add(c, i, c), c; +}; +const scratchPixelOffset = new Cartesian2(0, 0); +Billboard.prototype.computeScreenSpacePosition = function(e, t) { + const n = this._billboardCollection; + defined(t) || (t = new Cartesian2()), Cartesian2.clone(this._pixelOffset, scratchPixelOffset), Cartesian2.add(scratchPixelOffset, this._translate, scratchPixelOffset); + let i = n.modelMatrix, r = this._position; + if (defined(this._clampedPosition) && (r = this._clampedPosition, e.mode !== SceneMode$1.SCENE3D)) { + const s = e.mapProjection, c = s.ellipsoid, l = s.unproject(r, scratchCartographic$f); + r = c.cartographicToCartesian(l, scratchCartesian3$9), i = Matrix4.IDENTITY; + } + return Billboard._computeScreenSpacePosition( + i, + r, + this._eyeOffset, + scratchPixelOffset, + e, + t + ); +}; +Billboard.getScreenSpaceBoundingBox = function(e, t, n) { + let i = e.width, r = e.height; + const o = e.scale; + i *= o, r *= o; + let s = t.x; + e.horizontalOrigin === HorizontalOrigin$1.RIGHT ? s -= i : e.horizontalOrigin === HorizontalOrigin$1.CENTER && (s -= i * 0.5); + let c = t.y; + return e.verticalOrigin === VerticalOrigin$1.BOTTOM || e.verticalOrigin === VerticalOrigin$1.BASELINE ? c -= r : e.verticalOrigin === VerticalOrigin$1.CENTER && (c -= r * 0.5), defined(n) || (n = new BoundingRectangle()), n.x = s, n.y = c, n.width = i, n.height = r, n; +}; +Billboard.prototype.equals = function(e) { + return this === e || defined(e) && this._id === e._id && Cartesian3.equals(this._position, e._position) && this._imageId === e._imageId && this._show === e._show && this._scale === e._scale && this._verticalOrigin === e._verticalOrigin && this._horizontalOrigin === e._horizontalOrigin && this._heightReference === e._heightReference && BoundingRectangle.equals(this._imageSubRegion, e._imageSubRegion) && Color.equals(this._color, e._color) && Cartesian2.equals(this._pixelOffset, e._pixelOffset) && Cartesian2.equals(this._translate, e._translate) && Cartesian3.equals(this._eyeOffset, e._eyeOffset) && NearFarScalar.equals(this._scaleByDistance, e._scaleByDistance) && NearFarScalar.equals( + this._translucencyByDistance, + e._translucencyByDistance + ) && NearFarScalar.equals( + this._pixelOffsetScaleByDistance, + e._pixelOffsetScaleByDistance + ) && DistanceDisplayCondition.equals( + this._distanceDisplayCondition, + e._distanceDisplayCondition + ) && this._disableDepthTestDistance === e._disableDepthTestDistance && this._splitDirection === e._splitDirection; +}; +Billboard.prototype._destroy = function() { + defined(this._customData) && (this._billboardCollection._scene.globe._surface.removeTileCustomData( + this._customData + ), this._customData = void 0), defined(this._removeCallbackFunc) && (this._removeCallbackFunc(), this._removeCallbackFunc = void 0), this.image = void 0, this._pickId = this._pickId && this._pickId.destroy(), this._billboardCollection = void 0; +}; +const BlendOption = { + /** + * The billboards, points, or labels in the collection are completely opaque. + * @type {number} + * @constant + */ + OPAQUE: 0, + /** + * The billboards, points, or labels in the collection are completely translucent. + * @type {number} + * @constant + */ + TRANSLUCENT: 1, + /** + * The billboards, points, or labels in the collection are both opaque and translucent. + * @type {number} + * @constant + */ + OPAQUE_AND_TRANSLUCENT: 2 +}, BlendOption$1 = Object.freeze(BlendOption), SDFSettings = { + /** + * The font size in pixels + * + * @type {number} + * @constant + */ + FONT_SIZE: 48, + /** + * Whitespace padding around glyphs. + * + * @type {number} + * @constant + */ + PADDING: 10, + /** + * How many pixels around the glyph shape to use for encoding distance + * + * @type {number} + * @constant + */ + RADIUS: 8, + /** + * How much of the radius (relative) is used for the inside part the glyph. + * + * @type {number} + * @constant + */ + CUTOFF: 0.25 +}, SDFSettings$1 = Object.freeze(SDFSettings); +function TextureAtlasNode(e, t, n, i, r) { + this.bottomLeft = defaultValue(e, Cartesian2.ZERO), this.topRight = defaultValue(t, Cartesian2.ZERO), this.childNode1 = n, this.childNode2 = i, this.imageIndex = r; +} +const defaultInitialSize = new Cartesian2(16, 16); +function TextureAtlas(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.borderWidthInPixels, 1), n = defaultValue(e.initialSize, defaultInitialSize); + this._context = e.context, this._pixelFormat = defaultValue(e.pixelFormat, PixelFormat$1.RGBA), this._borderWidthInPixels = t, this._textureCoordinates = [], this._guid = createGuid(), this._idHash = {}, this._indexHash = {}, this._initialSize = n, this._root = void 0; +} +Object.defineProperties(TextureAtlas.prototype, { + /** + * The amount of spacing between adjacent images in pixels. + * @memberof TextureAtlas.prototype + * @type {number} + */ + borderWidthInPixels: { + get: function() { + return this._borderWidthInPixels; + } + }, + /** + * An array of {@link BoundingRectangle} texture coordinate regions for all the images in the texture atlas. + * The x and y values of the rectangle correspond to the bottom-left corner of the texture coordinate. + * The coordinates are in the order that the corresponding images were added to the atlas. + * @memberof TextureAtlas.prototype + * @type {BoundingRectangle[]} + */ + textureCoordinates: { + get: function() { + return this._textureCoordinates; + } + }, + /** + * The texture that all of the images are being written to. + * @memberof TextureAtlas.prototype + * @type {Texture} + */ + texture: { + get: function() { + return defined(this._texture) || (this._texture = new Texture({ + context: this._context, + width: this._initialSize.x, + height: this._initialSize.y, + pixelFormat: this._pixelFormat + })), this._texture; + } + }, + /** + * The number of images in the texture atlas. This value increases + * every time addImage or addImages is called. + * Texture coordinates are subject to change if the texture atlas resizes, so it is + * important to check {@link TextureAtlas#getGUID} before using old values. + * @memberof TextureAtlas.prototype + * @type {number} + */ + numberOfImages: { + get: function() { + return this._textureCoordinates.length; + } + }, + /** + * The atlas' globally unique identifier (GUID). + * The GUID changes whenever the texture atlas is modified. + * Classes that use a texture atlas should check if the GUID + * has changed before processing the atlas data. + * @memberof TextureAtlas.prototype + * @type {string} + */ + guid: { + get: function() { + return this._guid; + } + } +}); +function resizeAtlas(e, t) { + const n = e._context, i = e.numberOfImages, r = 2, o = e._borderWidthInPixels; + if (i > 0) { + const s = e._texture.width, c = e._texture.height, l = r * (s + t.width + o), d = r * (c + t.height + o), f = s / l, h = c / d, p = new TextureAtlasNode( + new Cartesian2(s + o, o), + new Cartesian2(l, c) + ), m = new TextureAtlasNode( + new Cartesian2(), + new Cartesian2(l, c), + e._root, + p + ), _ = new TextureAtlasNode( + new Cartesian2(o, c + o), + new Cartesian2(l, d) + ), y = new TextureAtlasNode( + new Cartesian2(), + new Cartesian2(l, d), + m, + _ + ); + for (let x = 0; x < e._textureCoordinates.length; x++) { + const b = e._textureCoordinates[x]; + defined(b) && (b.x *= f, b.y *= h, b.width *= f, b.height *= h); + } + const C = new Texture({ + context: e._context, + width: l, + height: d, + pixelFormat: e._pixelFormat + }), T = new Framebuffer({ + context: n, + colorTextures: [e._texture], + destroyAttachments: !1 + }); + T._bind(), C.copyFromFramebuffer(0, 0, 0, 0, l, d), T._unBind(), T.destroy(), e._texture = e._texture && e._texture.destroy(), e._texture = C, e._root = y; + } else { + let s = r * (t.width + 2 * o), c = r * (t.height + 2 * o); + s < e._initialSize.x && (s = e._initialSize.x), c < e._initialSize.y && (c = e._initialSize.y), e._texture = e._texture && e._texture.destroy(), e._texture = new Texture({ + context: e._context, + width: s, + height: c, + pixelFormat: e._pixelFormat + }), e._root = new TextureAtlasNode( + new Cartesian2(o, o), + new Cartesian2(s, c) + ); + } +} +function findNode$1(e, t, n) { + if (defined(t)) { + if (!defined(t.childNode1) && !defined(t.childNode2)) { + if (defined(t.imageIndex)) + return; + const i = t.topRight.x - t.bottomLeft.x, r = t.topRight.y - t.bottomLeft.y, o = i - n.width, s = r - n.height; + if (o < 0 || s < 0) + return; + if (o === 0 && s === 0) + return t; + if (o > s) { + t.childNode1 = new TextureAtlasNode( + new Cartesian2(t.bottomLeft.x, t.bottomLeft.y), + new Cartesian2(t.bottomLeft.x + n.width, t.topRight.y) + ); + const c = t.bottomLeft.x + n.width + e._borderWidthInPixels; + c < t.topRight.x && (t.childNode2 = new TextureAtlasNode( + new Cartesian2(c, t.bottomLeft.y), + new Cartesian2(t.topRight.x, t.topRight.y) + )); + } else { + t.childNode1 = new TextureAtlasNode( + new Cartesian2(t.bottomLeft.x, t.bottomLeft.y), + new Cartesian2(t.topRight.x, t.bottomLeft.y + n.height) + ); + const c = t.bottomLeft.y + n.height + e._borderWidthInPixels; + c < t.topRight.y && (t.childNode2 = new TextureAtlasNode( + new Cartesian2(t.bottomLeft.x, c), + new Cartesian2(t.topRight.x, t.topRight.y) + )); + } + return findNode$1(e, t.childNode1, n); + } + return findNode$1(e, t.childNode1, n) || findNode$1(e, t.childNode2, n); + } +} +function addImage(e, t, n) { + const i = findNode$1(e, e._root, t); + if (defined(i)) { + i.imageIndex = n; + const r = e._texture.width, o = e._texture.height, s = i.topRight.x - i.bottomLeft.x, c = i.topRight.y - i.bottomLeft.y, l = i.bottomLeft.x / r, d = i.bottomLeft.y / o, f = s / r, h = c / o; + e._textureCoordinates[n] = new BoundingRectangle(l, d, f, h), e._texture.copyFrom({ + source: t, + xOffset: i.bottomLeft.x, + yOffset: i.bottomLeft.y + }); + } else + resizeAtlas(e, t), addImage(e, t, n); + e._guid = createGuid(); +} +function getIndex$1(e, t) { + if (!defined(e) || e.isDestroyed()) + return -1; + const n = e.numberOfImages; + return addImage(e, t, n), n; +} +TextureAtlas.prototype.getImageIndex = function(e) { + return this._indexHash[e]; +}; +TextureAtlas.prototype.addImageSync = function(e, t) { + let n = this._indexHash[e]; + return defined(n) || (n = getIndex$1(this, t), this._idHash[e] = Promise.resolve(n), this._indexHash[e] = n), n; +}; +TextureAtlas.prototype.addImage = function(e, t) { + let n = this._idHash[e]; + if (defined(n)) + return n; + typeof t == "function" ? t = t(e) : (typeof t == "string" || t instanceof Resource) && (t = Resource.createIfNeeded(t).fetchImage()); + const i = this; + return n = Promise.resolve(t).then(function(r) { + const o = getIndex$1(i, r); + return i._indexHash[e] = o, o; + }), this._idHash[e] = n, n; +}; +TextureAtlas.prototype.addSubRegion = function(e, t) { + const n = this._idHash[e]; + if (!defined(n)) + throw new RuntimeError(`image with id "${e}" not found in the atlas.`); + const i = this; + return Promise.resolve(n).then(function(r) { + if (r === -1) + return -1; + const o = i._texture.width, s = i._texture.height, c = i._textureCoordinates[r], l = c.x + t.x / o, d = c.y + t.y / s, f = t.width / o, h = t.height / s, p = i._textureCoordinates.push(new BoundingRectangle(l, d, f, h)) - 1; + return i._indexHash[e] = p, i._guid = createGuid(), p; + }); +}; +TextureAtlas.prototype.isDestroyed = function() { + return !1; +}; +TextureAtlas.prototype.destroy = function() { + return this._texture = this._texture && this._texture.destroy(), destroyObject(this); +}; +const SHOW_INDEX$6 = Billboard.SHOW_INDEX, POSITION_INDEX$6 = Billboard.POSITION_INDEX, PIXEL_OFFSET_INDEX = Billboard.PIXEL_OFFSET_INDEX, EYE_OFFSET_INDEX = Billboard.EYE_OFFSET_INDEX, HORIZONTAL_ORIGIN_INDEX = Billboard.HORIZONTAL_ORIGIN_INDEX, VERTICAL_ORIGIN_INDEX = Billboard.VERTICAL_ORIGIN_INDEX, SCALE_INDEX$2 = Billboard.SCALE_INDEX, IMAGE_INDEX_INDEX = Billboard.IMAGE_INDEX_INDEX, COLOR_INDEX$4 = Billboard.COLOR_INDEX, ROTATION_INDEX = Billboard.ROTATION_INDEX, ALIGNED_AXIS_INDEX = Billboard.ALIGNED_AXIS_INDEX, SCALE_BY_DISTANCE_INDEX$2 = Billboard.SCALE_BY_DISTANCE_INDEX, TRANSLUCENCY_BY_DISTANCE_INDEX$2 = Billboard.TRANSLUCENCY_BY_DISTANCE_INDEX, PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX = Billboard.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX, DISTANCE_DISPLAY_CONDITION_INDEX$2 = Billboard.DISTANCE_DISPLAY_CONDITION, DISABLE_DEPTH_DISTANCE = Billboard.DISABLE_DEPTH_DISTANCE, TEXTURE_COORDINATE_BOUNDS = Billboard.TEXTURE_COORDINATE_BOUNDS, SDF_INDEX = Billboard.SDF_INDEX, SPLIT_DIRECTION_INDEX$2 = Billboard.SPLIT_DIRECTION_INDEX, NUMBER_OF_PROPERTIES$4 = Billboard.NUMBER_OF_PROPERTIES; +let attributeLocations$6; +const attributeLocationsBatched$1 = { + positionHighAndScale: 0, + positionLowAndRotation: 1, + compressedAttribute0: 2, + // pixel offset, translate, horizontal origin, vertical origin, show, direction, texture coordinates + compressedAttribute1: 3, + // aligned axis, translucency by distance, image width + compressedAttribute2: 4, + // image height, color, pick color, size in meters, valid aligned axis, 13 bits free + eyeOffset: 5, + // 4 bytes free + scaleByDistance: 6, + pixelOffsetScaleByDistance: 7, + compressedAttribute3: 8, + textureCoordinateBoundsOrLabelTranslate: 9, + a_batchId: 10, + sdf: 11, + splitDirection: 12 +}, attributeLocationsInstanced$1 = { + direction: 0, + positionHighAndScale: 1, + positionLowAndRotation: 2, + // texture offset in w + compressedAttribute0: 3, + compressedAttribute1: 4, + compressedAttribute2: 5, + eyeOffset: 6, + // texture range in w + scaleByDistance: 7, + pixelOffsetScaleByDistance: 8, + compressedAttribute3: 9, + textureCoordinateBoundsOrLabelTranslate: 10, + a_batchId: 11, + sdf: 12, + splitDirection: 13 +}; +function BillboardCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._scene = e.scene, this._batchTable = e.batchTable, this._textureAtlas = void 0, this._textureAtlasGUID = void 0, this._destroyTextureAtlas = !0, this._sp = void 0, this._spTranslucent = void 0, this._rsOpaque = void 0, this._rsTranslucent = void 0, this._vaf = void 0, this._billboards = [], this._billboardsToUpdate = [], this._billboardsToUpdateIndex = 0, this._billboardsRemoved = !1, this._createVertexArray = !1, this._shaderRotation = !1, this._compiledShaderRotation = !1, this._shaderAlignedAxis = !1, this._compiledShaderAlignedAxis = !1, this._shaderScaleByDistance = !1, this._compiledShaderScaleByDistance = !1, this._shaderTranslucencyByDistance = !1, this._compiledShaderTranslucencyByDistance = !1, this._shaderPixelOffsetScaleByDistance = !1, this._compiledShaderPixelOffsetScaleByDistance = !1, this._shaderDistanceDisplayCondition = !1, this._compiledShaderDistanceDisplayCondition = !1, this._shaderDisableDepthDistance = !1, this._compiledShaderDisableDepthDistance = !1, this._shaderClampToGround = !1, this._compiledShaderClampToGround = !1, this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES$4), this._maxSize = 0, this._maxEyeOffset = 0, this._maxScale = 1, this._maxPixelOffset = 0, this._allHorizontalCenter = !0, this._allVerticalCenter = !0, this._allSizedInMeters = !0, this._baseVolume = new BoundingSphere(), this._baseVolumeWC = new BoundingSphere(), this._baseVolume2D = new BoundingSphere(), this._boundingVolume = new BoundingSphere(), this._boundingVolumeDirty = !1, this._colorCommands = [], this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.debugShowTextureAtlas = defaultValue( + e.debugShowTextureAtlas, + !1 + ), this.blendOption = defaultValue( + e.blendOption, + BlendOption$1.OPAQUE_AND_TRANSLUCENT + ), this._blendOption = void 0, this._mode = SceneMode$1.SCENE3D, this._buffersUsage = [ + BufferUsage$1.STATIC_DRAW, + // SHOW_INDEX + BufferUsage$1.STATIC_DRAW, + // POSITION_INDEX + BufferUsage$1.STATIC_DRAW, + // PIXEL_OFFSET_INDEX + BufferUsage$1.STATIC_DRAW, + // EYE_OFFSET_INDEX + BufferUsage$1.STATIC_DRAW, + // HORIZONTAL_ORIGIN_INDEX + BufferUsage$1.STATIC_DRAW, + // VERTICAL_ORIGIN_INDEX + BufferUsage$1.STATIC_DRAW, + // SCALE_INDEX + BufferUsage$1.STATIC_DRAW, + // IMAGE_INDEX_INDEX + BufferUsage$1.STATIC_DRAW, + // COLOR_INDEX + BufferUsage$1.STATIC_DRAW, + // ROTATION_INDEX + BufferUsage$1.STATIC_DRAW, + // ALIGNED_AXIS_INDEX + BufferUsage$1.STATIC_DRAW, + // SCALE_BY_DISTANCE_INDEX + BufferUsage$1.STATIC_DRAW, + // TRANSLUCENCY_BY_DISTANCE_INDEX + BufferUsage$1.STATIC_DRAW, + // PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX + BufferUsage$1.STATIC_DRAW, + // DISTANCE_DISPLAY_CONDITION_INDEX + BufferUsage$1.STATIC_DRAW, + // TEXTURE_COORDINATE_BOUNDS + BufferUsage$1.STATIC_DRAW + // SPLIT_DIRECTION_INDEX + ], this._highlightColor = Color.clone(Color.WHITE); + const t = this; + this._uniforms = { + u_atlas: function() { + return t._textureAtlas.texture; + }, + u_highlightColor: function() { + return t._highlightColor; + } + }; + const n = this._scene; + defined(n) && defined(n.terrainProviderChanged) && (this._removeCallbackFunc = n.terrainProviderChanged.addEventListener( + function() { + const i = this._billboards, r = i.length; + for (let o = 0; o < r; ++o) + defined(i[o]) && i[o]._updateClamping(); + }, + this + )); +} +Object.defineProperties(BillboardCollection.prototype, { + /** + * Returns the number of billboards in this collection. This is commonly used with + * {@link BillboardCollection#get} to iterate over all the billboards + * in the collection. + * @memberof BillboardCollection.prototype + * @type {number} + */ + length: { + get: function() { + return removeBillboards(this), this._billboards.length; + } + }, + /** + * Gets or sets the textureAtlas. + * @memberof BillboardCollection.prototype + * @type {TextureAtlas} + * @private + */ + textureAtlas: { + get: function() { + return this._textureAtlas; + }, + set: function(e) { + this._textureAtlas !== e && (this._textureAtlas = this._destroyTextureAtlas && this._textureAtlas && this._textureAtlas.destroy(), this._textureAtlas = e, this._createVertexArray = !0); + } + }, + /** + * Gets or sets a value which determines if the texture atlas is + * destroyed when the collection is destroyed. + * + * If the texture atlas is used by more than one collection, set this to false, + * and explicitly destroy the atlas to avoid attempting to destroy it multiple times. + * + * @memberof BillboardCollection.prototype + * @type {boolean} + * @private + * + * @example + * // Set destroyTextureAtlas + * // Destroy a billboard collection but not its texture atlas. + * + * const atlas = new TextureAtlas({ + * scene : scene, + * images : images + * }); + * billboards.textureAtlas = atlas; + * billboards.destroyTextureAtlas = false; + * billboards = billboards.destroy(); + * console.log(atlas.isDestroyed()); // False + */ + destroyTextureAtlas: { + get: function() { + return this._destroyTextureAtlas; + }, + set: function(e) { + this._destroyTextureAtlas = e; + } + } +}); +function destroyBillboards(e) { + const t = e.length; + for (let n = 0; n < t; ++n) + e[n] && e[n]._destroy(); +} +BillboardCollection.prototype.add = function(e) { + const t = new Billboard(e, this); + return t._index = this._billboards.length, this._billboards.push(t), this._createVertexArray = !0, t; +}; +BillboardCollection.prototype.remove = function(e) { + return this.contains(e) ? (this._billboards[e._index] = void 0, this._billboardsRemoved = !0, this._createVertexArray = !0, e._destroy(), !0) : !1; +}; +BillboardCollection.prototype.removeAll = function() { + destroyBillboards(this._billboards), this._billboards = [], this._billboardsToUpdate = [], this._billboardsToUpdateIndex = 0, this._billboardsRemoved = !1, this._createVertexArray = !0; +}; +function removeBillboards(e) { + if (e._billboardsRemoved) { + e._billboardsRemoved = !1; + const t = [], n = e._billboards, i = n.length; + for (let r = 0, o = 0; r < i; ++r) { + const s = n[r]; + defined(s) && (s._index = o++, t.push(s)); + } + e._billboards = t; + } +} +BillboardCollection.prototype._updateBillboard = function(e, t) { + e._dirty || (this._billboardsToUpdate[this._billboardsToUpdateIndex++] = e), ++this._propertiesChanged[t]; +}; +BillboardCollection.prototype.contains = function(e) { + return defined(e) && e._billboardCollection === this; +}; +BillboardCollection.prototype.get = function(e) { + return removeBillboards(this), this._billboards[e]; +}; +let getIndexBuffer$1; +function getIndexBufferBatched$1(e) { + let n = e.cache.billboardCollection_indexBufferBatched; + if (defined(n)) + return n; + const i = 16384 * 6 - 6, r = new Uint16Array(i); + for (let o = 0, s = 0; o < i; o += 6, s += 4) + r[o] = s, r[o + 1] = s + 1, r[o + 2] = s + 2, r[o + 3] = s + 0, r[o + 4] = s + 2, r[o + 5] = s + 3; + return n = Buffer.createIndexBuffer({ + context: e, + typedArray: r, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }), n.vertexArrayDestroyable = !1, e.cache.billboardCollection_indexBufferBatched = n, n; +} +function getIndexBufferInstanced$1(e) { + let t = e.cache.billboardCollection_indexBufferInstanced; + return defined(t) || (t = Buffer.createIndexBuffer({ + context: e, + typedArray: new Uint16Array([0, 1, 2, 0, 2, 3]), + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }), t.vertexArrayDestroyable = !1, e.cache.billboardCollection_indexBufferInstanced = t), t; +} +function getVertexBufferInstanced$1(e) { + let t = e.cache.billboardCollection_vertexBufferInstanced; + return defined(t) || (t = Buffer.createVertexBuffer({ + context: e, + typedArray: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]), + usage: BufferUsage$1.STATIC_DRAW + }), t.vertexArrayDestroyable = !1, e.cache.billboardCollection_vertexBufferInstanced = t), t; +} +BillboardCollection.prototype.computeNewBuffersUsage = function() { + const e = this._buffersUsage; + let t = !1; + const n = this._propertiesChanged; + for (let i = 0; i < NUMBER_OF_PROPERTIES$4; ++i) { + const r = n[i] === 0 ? BufferUsage$1.STATIC_DRAW : BufferUsage$1.STREAM_DRAW; + t = t || e[i] !== r, e[i] = r; + } + return t; +}; +function createVAF$2(e, t, n, i, r, o) { + const s = [ + { + index: attributeLocations$6.positionHighAndScale, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[POSITION_INDEX$6] + }, + { + index: attributeLocations$6.positionLowAndRotation, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[POSITION_INDEX$6] + }, + { + index: attributeLocations$6.compressedAttribute0, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[PIXEL_OFFSET_INDEX] + }, + { + index: attributeLocations$6.compressedAttribute1, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[TRANSLUCENCY_BY_DISTANCE_INDEX$2] + }, + { + index: attributeLocations$6.compressedAttribute2, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[COLOR_INDEX$4] + }, + { + index: attributeLocations$6.eyeOffset, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[EYE_OFFSET_INDEX] + }, + { + index: attributeLocations$6.scaleByDistance, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[SCALE_BY_DISTANCE_INDEX$2] + }, + { + index: attributeLocations$6.pixelOffsetScaleByDistance, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX] + }, + { + index: attributeLocations$6.compressedAttribute3, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[DISTANCE_DISPLAY_CONDITION_INDEX$2] + }, + { + index: attributeLocations$6.textureCoordinateBoundsOrLabelTranslate, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[TEXTURE_COORDINATE_BOUNDS] + }, + { + index: attributeLocations$6.splitDirection, + componentsPerAttribute: 1, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[SPLIT_DIRECTION_INDEX$2] + } + ]; + i && s.push({ + index: attributeLocations$6.direction, + componentsPerAttribute: 2, + componentDatatype: ComponentDatatype$1.FLOAT, + vertexBuffer: getVertexBufferInstanced$1(e) + }), defined(r) && s.push({ + index: attributeLocations$6.a_batchId, + componentsPerAttribute: 1, + componentDatatype: ComponentDatatype$1.FLOAT, + bufferUsage: BufferUsage$1.STATIC_DRAW + }), o && s.push({ + index: attributeLocations$6.sdf, + componentsPerAttribute: 2, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[SDF_INDEX] + }); + const c = i ? t : 4 * t; + return new VertexArrayFacade(e, s, c, i); +} +const writePositionScratch$2 = new EncodedCartesian3(); +function writePositionScaleAndRotation(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.positionHighAndScale], c = i[attributeLocations$6.positionLowAndRotation], l = r._getActualPosition(); + e._mode === SceneMode$1.SCENE3D && (BoundingSphere.expand( + e._baseVolume, + l, + e._baseVolume + ), e._boundingVolumeDirty = !0), EncodedCartesian3.fromCartesian(l, writePositionScratch$2); + const d = r.scale, f = r.rotation; + f !== 0 && (e._shaderRotation = !0), e._maxScale = Math.max( + e._maxScale, + d + ); + const h = writePositionScratch$2.high, p = writePositionScratch$2.low; + e._instanced ? (o = r._index, s(o, h.x, h.y, h.z, d), c(o, p.x, p.y, p.z, f)) : (o = r._index * 4, s(o + 0, h.x, h.y, h.z, d), s(o + 1, h.x, h.y, h.z, d), s(o + 2, h.x, h.y, h.z, d), s(o + 3, h.x, h.y, h.z, d), c(o + 0, p.x, p.y, p.z, f), c(o + 1, p.x, p.y, p.z, f), c(o + 2, p.x, p.y, p.z, f), c(o + 3, p.x, p.y, p.z, f)); +} +const scratchCartesian2$9 = new Cartesian2(), UPPER_BOUND = 32768, LEFT_SHIFT16$1 = 65536, LEFT_SHIFT12 = 4096, LEFT_SHIFT8$1 = 256, LEFT_SHIFT7 = 128, LEFT_SHIFT5 = 32, LEFT_SHIFT3 = 8, LEFT_SHIFT2 = 4, RIGHT_SHIFT8 = 1 / 256, LOWER_LEFT = 0, LOWER_RIGHT = 2, UPPER_RIGHT = 3, UPPER_LEFT = 1; +function writeCompressedAttrib0$1(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.compressedAttribute0], c = r.pixelOffset, l = c.x, d = c.y, f = r._translate, h = f.x, p = f.y; + e._maxPixelOffset = Math.max( + e._maxPixelOffset, + Math.abs(l + h), + Math.abs(-d + p) + ); + const m = r.horizontalOrigin; + let _ = r._verticalOrigin, y = r.show && r.clusterShow; + r.color.alpha === 0 && (y = !1), _ === VerticalOrigin$1.BASELINE && (_ = VerticalOrigin$1.BOTTOM), e._allHorizontalCenter = e._allHorizontalCenter && m === HorizontalOrigin$1.CENTER, e._allVerticalCenter = e._allVerticalCenter && _ === VerticalOrigin$1.CENTER; + let C = 0, T = 0, x = 0, b = 0; + const S = r._imageIndex; + if (S !== -1) { + const F = n[S]; + C = F.x, T = F.y, x = F.width, b = F.height; + } + const E = C + x, A = T + b; + let D = Math.floor( + CesiumMath.clamp(l, -UPPER_BOUND, UPPER_BOUND) + UPPER_BOUND + ) * LEFT_SHIFT7; + D += (m + 1) * LEFT_SHIFT5, D += (_ + 1) * LEFT_SHIFT3, D += (y ? 1 : 0) * LEFT_SHIFT2; + let P = Math.floor( + CesiumMath.clamp(d, -UPPER_BOUND, UPPER_BOUND) + UPPER_BOUND + ) * LEFT_SHIFT8$1, I = Math.floor( + CesiumMath.clamp(h, -UPPER_BOUND, UPPER_BOUND) + UPPER_BOUND + ) * LEFT_SHIFT8$1; + const M = (CesiumMath.clamp(p, -UPPER_BOUND, UPPER_BOUND) + UPPER_BOUND) * RIGHT_SHIFT8, R = Math.floor(M), L = Math.floor( + (M - R) * LEFT_SHIFT8$1 + ); + P += R, I += L, scratchCartesian2$9.x = C, scratchCartesian2$9.y = T; + const g = AttributeCompression.compressTextureCoordinates( + scratchCartesian2$9 + ); + scratchCartesian2$9.x = E; + const w = AttributeCompression.compressTextureCoordinates( + scratchCartesian2$9 + ); + scratchCartesian2$9.y = A; + const O = AttributeCompression.compressTextureCoordinates( + scratchCartesian2$9 + ); + scratchCartesian2$9.x = C; + const N = AttributeCompression.compressTextureCoordinates( + scratchCartesian2$9 + ); + e._instanced ? (o = r._index, s(o, D, P, I, g)) : (o = r._index * 4, s( + o + 0, + D + LOWER_LEFT, + P, + I, + g + ), s( + o + 1, + D + LOWER_RIGHT, + P, + I, + w + ), s( + o + 2, + D + UPPER_RIGHT, + P, + I, + O + ), s( + o + 3, + D + UPPER_LEFT, + P, + I, + N + )); +} +function writeCompressedAttrib1$1(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.compressedAttribute1], c = r.alignedAxis; + Cartesian3.equals(c, Cartesian3.ZERO) || (e._shaderAlignedAxis = !0); + let l = 0, d = 1, f = 1, h = 1; + const p = r.translucencyByDistance; + defined(p) && (l = p.near, d = p.nearValue, f = p.far, h = p.farValue, (d !== 1 || h !== 1) && (e._shaderTranslucencyByDistance = !0)); + let m = 0; + const _ = r._imageIndex; + _ !== -1 && (m = n[_].width); + const y = e._textureAtlas.texture.width, C = Math.round( + defaultValue(r.width, y * m) + ); + e._maxSize = Math.max( + e._maxSize, + C + ); + let T = CesiumMath.clamp(C, 0, LEFT_SHIFT16$1), x = 0; + Math.abs(Cartesian3.magnitudeSquared(c) - 1) < CesiumMath.EPSILON6 && (x = AttributeCompression.octEncodeFloat(c)), d = CesiumMath.clamp(d, 0, 1), d = d === 1 ? 255 : d * 255 | 0, T = T * LEFT_SHIFT8$1 + d, h = CesiumMath.clamp(h, 0, 1), h = h === 1 ? 255 : h * 255 | 0, x = x * LEFT_SHIFT8$1 + h, e._instanced ? (o = r._index, s(o, T, x, l, f)) : (o = r._index * 4, s(o + 0, T, x, l, f), s(o + 1, T, x, l, f), s(o + 2, T, x, l, f), s(o + 3, T, x, l, f)); +} +function writeCompressedAttrib2(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.compressedAttribute2], c = r.color, l = defined(e._batchTable) ? Color.WHITE : r.getPickId(t.context).color, d = r.sizeInMeters ? 1 : 0, f = Math.abs(Cartesian3.magnitudeSquared(r.alignedAxis) - 1) < CesiumMath.EPSILON6 ? 1 : 0; + e._allSizedInMeters = e._allSizedInMeters && d === 1; + let h = 0; + const p = r._imageIndex; + p !== -1 && (h = n[p].height); + const m = e._textureAtlas.texture.dimensions, _ = Math.round( + defaultValue(r.height, m.y * h) + ); + e._maxSize = Math.max( + e._maxSize, + _ + ); + let y = defaultValue( + r._labelHorizontalOrigin, + -2 + ); + y += 2; + const C = _ * LEFT_SHIFT2 + y; + let T = Color.floatToByte(c.red), x = Color.floatToByte(c.green), b = Color.floatToByte(c.blue); + const S = T * LEFT_SHIFT16$1 + x * LEFT_SHIFT8$1 + b; + T = Color.floatToByte(l.red), x = Color.floatToByte(l.green), b = Color.floatToByte(l.blue); + const E = T * LEFT_SHIFT16$1 + x * LEFT_SHIFT8$1 + b; + let A = Color.floatToByte(c.alpha) * LEFT_SHIFT16$1 + Color.floatToByte(l.alpha) * LEFT_SHIFT8$1; + A += d * 2 + f, e._instanced ? (o = r._index, s(o, S, E, A, C)) : (o = r._index * 4, s(o + 0, S, E, A, C), s(o + 1, S, E, A, C), s(o + 2, S, E, A, C), s(o + 3, S, E, A, C)); +} +function writeEyeOffset(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.eyeOffset], c = r.eyeOffset; + let l = c.z; + if (r._heightReference !== HeightReference$1.NONE && (l *= 1.005), e._maxEyeOffset = Math.max( + e._maxEyeOffset, + Math.abs(c.x), + Math.abs(c.y), + Math.abs(l) + ), e._instanced) { + let d = 0, f = 0; + const h = r._imageIndex; + if (h !== -1) { + const m = n[h]; + d = m.width, f = m.height; + } + scratchCartesian2$9.x = d, scratchCartesian2$9.y = f; + const p = AttributeCompression.compressTextureCoordinates( + scratchCartesian2$9 + ); + o = r._index, s(o, c.x, c.y, l, p); + } else + o = r._index * 4, s(o + 0, c.x, c.y, l, 0), s(o + 1, c.x, c.y, l, 0), s(o + 2, c.x, c.y, l, 0), s(o + 3, c.x, c.y, l, 0); +} +function writeScaleByDistance$1(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.scaleByDistance]; + let c = 0, l = 1, d = 1, f = 1; + const h = r.scaleByDistance; + defined(h) && (c = h.near, l = h.nearValue, d = h.far, f = h.farValue, (l !== 1 || f !== 1) && (e._shaderScaleByDistance = !0)), e._instanced ? (o = r._index, s(o, c, l, d, f)) : (o = r._index * 4, s(o + 0, c, l, d, f), s(o + 1, c, l, d, f), s(o + 2, c, l, d, f), s(o + 3, c, l, d, f)); +} +function writePixelOffsetScaleByDistance(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.pixelOffsetScaleByDistance]; + let c = 0, l = 1, d = 1, f = 1; + const h = r.pixelOffsetScaleByDistance; + defined(h) && (c = h.near, l = h.nearValue, d = h.far, f = h.farValue, (l !== 1 || f !== 1) && (e._shaderPixelOffsetScaleByDistance = !0)), e._instanced ? (o = r._index, s(o, c, l, d, f)) : (o = r._index * 4, s(o + 0, c, l, d, f), s(o + 1, c, l, d, f), s(o + 2, c, l, d, f), s(o + 3, c, l, d, f)); +} +function writeCompressedAttribute3(e, t, n, i, r) { + let o; + const s = i[attributeLocations$6.compressedAttribute3]; + let c = 0, l = Number.MAX_VALUE; + const d = r.distanceDisplayCondition; + defined(d) && (c = d.near, l = d.far, c *= c, l *= l, e._shaderDistanceDisplayCondition = !0); + let f = r.disableDepthTestDistance; + const h = isHeightReferenceClamp(r.heightReference) && t.context.depthTexture; + defined(f) || (f = h ? 5e3 : 0), f *= f, (h || f > 0) && (e._shaderDisableDepthDistance = !0, f === Number.POSITIVE_INFINITY && (f = -1)); + let p, m; + if (defined(r._labelDimensions)) + m = r._labelDimensions.x, p = r._labelDimensions.y; + else { + let T = 0, x = 0; + const b = r._imageIndex; + if (b !== -1) { + const E = n[b]; + T = E.height, x = E.width; + } + p = Math.round( + defaultValue( + r.height, + e._textureAtlas.texture.dimensions.y * T + ) + ); + const S = e._textureAtlas.texture.width; + m = Math.round( + defaultValue(r.width, S * x) + ); + } + const _ = Math.floor(CesiumMath.clamp(m, 0, LEFT_SHIFT12)), y = Math.floor(CesiumMath.clamp(p, 0, LEFT_SHIFT12)), C = _ * LEFT_SHIFT12 + y; + e._instanced ? (o = r._index, s(o, c, l, f, C)) : (o = r._index * 4, s(o + 0, c, l, f, C), s(o + 1, c, l, f, C), s(o + 2, c, l, f, C), s(o + 3, c, l, f, C)); +} +function writeTextureCoordinateBoundsOrLabelTranslate(e, t, n, i, r) { + if (isHeightReferenceClamp(r.heightReference)) { + const _ = e._scene, y = t.context, C = t.globeTranslucencyState.translucent, T = defined(_.globe) && _.globe.depthTestAgainstTerrain; + e._shaderClampToGround = y.depthTexture && !C && T; + } + let o; + const s = i[attributeLocations$6.textureCoordinateBoundsOrLabelTranslate]; + if (ContextLimits.maximumVertexTextureImageUnits > 0) { + let _ = 0, y = 0; + defined(r._labelTranslate) && (_ = r._labelTranslate.x, y = r._labelTranslate.y), e._instanced ? (o = r._index, s(o, _, y, 0, 0)) : (o = r._index * 4, s(o + 0, _, y, 0, 0), s(o + 1, _, y, 0, 0), s(o + 2, _, y, 0, 0), s(o + 3, _, y, 0, 0)); + return; + } + let c = 0, l = 0, d = 0, f = 0; + const h = r._imageIndex; + if (h !== -1) { + const _ = n[h]; + c = _.x, l = _.y, d = _.width, f = _.height; + } + const p = c + d, m = l + f; + e._instanced ? (o = r._index, s(o, c, l, p, m)) : (o = r._index * 4, s(o + 0, c, l, p, m), s(o + 1, c, l, p, m), s(o + 2, c, l, p, m), s(o + 3, c, l, p, m)); +} +function writeBatchId(e, t, n, i, r) { + if (!defined(e._batchTable)) + return; + const o = i[attributeLocations$6.a_batchId], s = r._batchIndex; + let c; + e._instanced ? (c = r._index, o(c, s)) : (c = r._index * 4, o(c + 0, s), o(c + 1, s), o(c + 2, s), o(c + 3, s)); +} +function writeSDF(e, t, n, i, r) { + if (!e._sdf) + return; + let o; + const s = i[attributeLocations$6.sdf], c = r.outlineColor, l = r.outlineWidth, d = Color.floatToByte(c.red), f = Color.floatToByte(c.green), h = Color.floatToByte(c.blue), p = d * LEFT_SHIFT16$1 + f * LEFT_SHIFT8$1 + h, m = l / SDFSettings$1.RADIUS, _ = Color.floatToByte(c.alpha) * LEFT_SHIFT16$1 + Color.floatToByte(m) * LEFT_SHIFT8$1; + e._instanced ? (o = r._index, s(o, p, _)) : (o = r._index * 4, s(o + 0, p + LOWER_LEFT, _), s(o + 1, p + LOWER_RIGHT, _), s(o + 2, p + UPPER_RIGHT, _), s(o + 3, p + UPPER_LEFT, _)); +} +function writeSplitDirection(e, t, n, i, r) { + const o = i[attributeLocations$6.splitDirection]; + let s = 0; + const c = r.splitDirection; + defined(c) && (s = c); + let l; + e._instanced ? (l = r._index, o(l, s)) : (l = r._index * 4, o(l + 0, s), o(l + 1, s), o(l + 2, s), o(l + 3, s)); +} +function writeBillboard(e, t, n, i, r) { + writePositionScaleAndRotation( + e, + t, + n, + i, + r + ), writeCompressedAttrib0$1( + e, + t, + n, + i, + r + ), writeCompressedAttrib1$1( + e, + t, + n, + i, + r + ), writeCompressedAttrib2( + e, + t, + n, + i, + r + ), writeEyeOffset( + e, + t, + n, + i, + r + ), writeScaleByDistance$1( + e, + t, + n, + i, + r + ), writePixelOffsetScaleByDistance( + e, + t, + n, + i, + r + ), writeCompressedAttribute3( + e, + t, + n, + i, + r + ), writeTextureCoordinateBoundsOrLabelTranslate( + e, + t, + n, + i, + r + ), writeBatchId( + e, + t, + n, + i, + r + ), writeSDF( + e, + t, + n, + i, + r + ), writeSplitDirection( + e, + t, + n, + i, + r + ); +} +function recomputeActualPositions$1(e, t, n, i, r, o) { + let s; + i.mode === SceneMode$1.SCENE3D ? (s = e._baseVolume, e._boundingVolumeDirty = !0) : s = e._baseVolume2D; + const c = []; + for (let l = 0; l < n; ++l) { + const d = t[l], f = d.position, h = Billboard._computeActualPosition( + d, + f, + i, + r + ); + defined(h) && (d._setActualPosition(h), o ? c.push(h) : BoundingSphere.expand(s, h, s)); + } + o && BoundingSphere.fromPoints(c, s); +} +function updateMode$2(e, t) { + const n = t.mode, i = e._billboards, r = e._billboardsToUpdate, o = e._modelMatrix; + e._createVertexArray || e._mode !== n || n !== SceneMode$1.SCENE3D && !Matrix4.equals(o, e.modelMatrix) ? (e._mode = n, Matrix4.clone(e.modelMatrix, o), e._createVertexArray = !0, (n === SceneMode$1.SCENE3D || n === SceneMode$1.SCENE2D || n === SceneMode$1.COLUMBUS_VIEW) && recomputeActualPositions$1( + e, + i, + i.length, + t, + o, + !0 + )) : n === SceneMode$1.MORPHING ? recomputeActualPositions$1( + e, + i, + i.length, + t, + o, + !0 + ) : (n === SceneMode$1.SCENE2D || n === SceneMode$1.COLUMBUS_VIEW) && recomputeActualPositions$1( + e, + r, + e._billboardsToUpdateIndex, + t, + o, + !1 + ); +} +function updateBoundingVolume$1(e, t, n) { + let i = 1; + (!e._allSizedInMeters || e._maxPixelOffset !== 0) && (i = t.camera.getPixelSize( + n, + t.context.drawingBufferWidth, + t.context.drawingBufferHeight + )); + let r = i * e._maxScale * e._maxSize * 2; + e._allHorizontalCenter && e._allVerticalCenter && (r *= 0.5); + const o = i * e._maxPixelOffset + e._maxEyeOffset; + n.radius += r + o; +} +function createDebugCommand(e, t) { + const i = t.createViewportQuadCommand(`uniform sampler2D billboard_texture; +in vec2 v_textureCoordinates; +void main() +{ + out_FragColor = texture(billboard_texture, v_textureCoordinates); +} +`, { + uniformMap: { + billboard_texture: function() { + return e._textureAtlas.texture; + } + } + }); + return i.pass = Pass$1.OVERLAY, i; +} +const scratchWriterArray$2 = []; +BillboardCollection.prototype.update = function(e) { + if (removeBillboards(this), !this.show) + return; + let t = this._billboards, n = t.length; + const i = e.context; + this._instanced = i.instancedArrays, attributeLocations$6 = this._instanced ? attributeLocationsInstanced$1 : attributeLocationsBatched$1, getIndexBuffer$1 = this._instanced ? getIndexBufferInstanced$1 : getIndexBufferBatched$1; + let r = this._textureAtlas; + if (!defined(r)) { + r = this._textureAtlas = new TextureAtlas({ + context: i + }); + for (let P = 0; P < n; ++P) + t[P]._loadImage(); + } + const o = r.textureCoordinates; + if (o.length === 0) + return; + updateMode$2(this, e), t = this._billboards, n = t.length; + const s = this._billboardsToUpdate, c = this._billboardsToUpdateIndex, l = this._propertiesChanged, d = r.guid, f = this._createVertexArray || this._textureAtlasGUID !== d; + this._textureAtlasGUID = d; + let h; + const p = e.passes, m = p.pick; + if (f || !m && this.computeNewBuffersUsage()) { + this._createVertexArray = !1; + for (let P = 0; P < NUMBER_OF_PROPERTIES$4; ++P) + l[P] = 0; + if (this._vaf = this._vaf && this._vaf.destroy(), n > 0) { + this._vaf = createVAF$2( + i, + n, + this._buffersUsage, + this._instanced, + this._batchTable, + this._sdf + ), h = this._vaf.writers; + for (let P = 0; P < n; ++P) { + const I = this._billboards[P]; + I._dirty = !1, writeBillboard( + this, + e, + o, + h, + I + ); + } + this._vaf.commit(getIndexBuffer$1(i)); + } + this._billboardsToUpdateIndex = 0; + } else if (c > 0) { + const P = scratchWriterArray$2; + P.length = 0, (l[POSITION_INDEX$6] || l[ROTATION_INDEX] || l[SCALE_INDEX$2]) && P.push(writePositionScaleAndRotation), (l[IMAGE_INDEX_INDEX] || l[PIXEL_OFFSET_INDEX] || l[HORIZONTAL_ORIGIN_INDEX] || l[VERTICAL_ORIGIN_INDEX] || l[SHOW_INDEX$6]) && (P.push(writeCompressedAttrib0$1), this._instanced && P.push(writeEyeOffset)), (l[IMAGE_INDEX_INDEX] || l[ALIGNED_AXIS_INDEX] || l[TRANSLUCENCY_BY_DISTANCE_INDEX$2]) && (P.push(writeCompressedAttrib1$1), P.push(writeCompressedAttrib2)), (l[IMAGE_INDEX_INDEX] || l[COLOR_INDEX$4]) && P.push(writeCompressedAttrib2), l[EYE_OFFSET_INDEX] && P.push(writeEyeOffset), l[SCALE_BY_DISTANCE_INDEX$2] && P.push(writeScaleByDistance$1), l[PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX] && P.push(writePixelOffsetScaleByDistance), (l[DISTANCE_DISPLAY_CONDITION_INDEX$2] || l[DISABLE_DEPTH_DISTANCE] || l[IMAGE_INDEX_INDEX] || l[POSITION_INDEX$6]) && P.push(writeCompressedAttribute3), (l[IMAGE_INDEX_INDEX] || l[POSITION_INDEX$6]) && P.push(writeTextureCoordinateBoundsOrLabelTranslate), l[SDF_INDEX] && P.push(writeSDF), l[SPLIT_DIRECTION_INDEX$2] && P.push(writeSplitDirection); + const I = P.length; + if (h = this._vaf.writers, c / n > 0.1) { + for (let M = 0; M < c; ++M) { + const R = s[M]; + R._dirty = !1; + for (let L = 0; L < I; ++L) + P[L](this, e, o, h, R); + } + this._vaf.commit(getIndexBuffer$1(i)); + } else { + for (let M = 0; M < c; ++M) { + const R = s[M]; + R._dirty = !1; + for (let L = 0; L < I; ++L) + P[L](this, e, o, h, R); + this._instanced ? this._vaf.subCommit(R._index, 1) : this._vaf.subCommit(R._index * 4, 4); + } + this._vaf.endSubCommits(); + } + this._billboardsToUpdateIndex = 0; + } + if (c > n * 1.5 && (s.length = n), !defined(this._vaf) || !defined(this._vaf.va)) + return; + this._boundingVolumeDirty && (this._boundingVolumeDirty = !1, BoundingSphere.transform( + this._baseVolume, + this.modelMatrix, + this._baseVolumeWC + )); + let _, y = Matrix4.IDENTITY; + e.mode === SceneMode$1.SCENE3D ? (y = this.modelMatrix, _ = BoundingSphere.clone( + this._baseVolumeWC, + this._boundingVolume + )) : _ = BoundingSphere.clone( + this._baseVolume2D, + this._boundingVolume + ), updateBoundingVolume$1(this, e, _); + const C = this._blendOption !== this.blendOption; + if (this._blendOption = this.blendOption, C) { + this._blendOption === BlendOption$1.OPAQUE || this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT ? this._rsOpaque = RenderState.fromCache({ + depthTest: { + enabled: !0, + func: WebGLConstants$1.LESS + }, + depthMask: !0 + }) : this._rsOpaque = void 0; + const P = this._blendOption === BlendOption$1.TRANSLUCENT; + this._blendOption === BlendOption$1.TRANSLUCENT || this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT ? this._rsTranslucent = RenderState.fromCache({ + depthTest: { + enabled: !0, + func: P ? WebGLConstants$1.LEQUAL : WebGLConstants$1.LESS + }, + depthMask: P, + blending: BlendingState$1.ALPHA_BLEND + }) : this._rsTranslucent = void 0; + } + this._shaderDisableDepthDistance = this._shaderDisableDepthDistance || e.minimumDisableDepthTestDistance !== 0; + let T, x, b, S, E; + const A = ContextLimits.maximumVertexTextureImageUnits > 0; + if (C || this._shaderRotation !== this._compiledShaderRotation || this._shaderAlignedAxis !== this._compiledShaderAlignedAxis || this._shaderScaleByDistance !== this._compiledShaderScaleByDistance || this._shaderTranslucencyByDistance !== this._compiledShaderTranslucencyByDistance || this._shaderPixelOffsetScaleByDistance !== this._compiledShaderPixelOffsetScaleByDistance || this._shaderDistanceDisplayCondition !== this._compiledShaderDistanceDisplayCondition || this._shaderDisableDepthDistance !== this._compiledShaderDisableDepthDistance || this._shaderClampToGround !== this._compiledShaderClampToGround || this._sdf !== this._compiledSDF) { + T = BillboardCollectionVS, x = BillboardCollectionFS, E = [], defined(this._batchTable) && (E.push("VECTOR_TILE"), T = this._batchTable.getVertexShaderCallback( + !1, + "a_batchId", + void 0 + )(T), x = this._batchTable.getFragmentShaderCallback( + !1, + void 0 + )(x)), b = new ShaderSource({ + defines: E, + sources: [T] + }), this._instanced && b.defines.push("INSTANCED"), this._shaderRotation && b.defines.push("ROTATION"), this._shaderAlignedAxis && b.defines.push("ALIGNED_AXIS"), this._shaderScaleByDistance && b.defines.push("EYE_DISTANCE_SCALING"), this._shaderTranslucencyByDistance && b.defines.push("EYE_DISTANCE_TRANSLUCENCY"), this._shaderPixelOffsetScaleByDistance && b.defines.push("EYE_DISTANCE_PIXEL_OFFSET"), this._shaderDistanceDisplayCondition && b.defines.push("DISTANCE_DISPLAY_CONDITION"), this._shaderDisableDepthDistance && b.defines.push("DISABLE_DEPTH_DISTANCE"), this._shaderClampToGround && (A ? b.defines.push("VERTEX_DEPTH_CHECK") : b.defines.push("FRAGMENT_DEPTH_CHECK")); + const P = 1 - SDFSettings$1.CUTOFF; + this._sdf && b.defines.push("SDF"); + const I = defined(this._batchTable) ? "VECTOR_TILE" : ""; + this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT && (S = new ShaderSource({ + defines: ["OPAQUE", I], + sources: [x] + }), this._shaderClampToGround && (A ? S.defines.push("VERTEX_DEPTH_CHECK") : S.defines.push("FRAGMENT_DEPTH_CHECK")), this._sdf && (S.defines.push("SDF"), S.defines.push(`SDF_EDGE ${P}`)), this._sp = ShaderProgram.replaceCache({ + context: i, + shaderProgram: this._sp, + vertexShaderSource: b, + fragmentShaderSource: S, + attributeLocations: attributeLocations$6 + }), S = new ShaderSource({ + defines: ["TRANSLUCENT", I], + sources: [x] + }), this._shaderClampToGround && (A ? S.defines.push("VERTEX_DEPTH_CHECK") : S.defines.push("FRAGMENT_DEPTH_CHECK")), this._sdf && (S.defines.push("SDF"), S.defines.push(`SDF_EDGE ${P}`)), this._spTranslucent = ShaderProgram.replaceCache({ + context: i, + shaderProgram: this._spTranslucent, + vertexShaderSource: b, + fragmentShaderSource: S, + attributeLocations: attributeLocations$6 + })), this._blendOption === BlendOption$1.OPAQUE && (S = new ShaderSource({ + defines: [I], + sources: [x] + }), this._shaderClampToGround && (A ? S.defines.push("VERTEX_DEPTH_CHECK") : S.defines.push("FRAGMENT_DEPTH_CHECK")), this._sdf && (S.defines.push("SDF"), S.defines.push(`SDF_EDGE ${P}`)), this._sp = ShaderProgram.replaceCache({ + context: i, + shaderProgram: this._sp, + vertexShaderSource: b, + fragmentShaderSource: S, + attributeLocations: attributeLocations$6 + })), this._blendOption === BlendOption$1.TRANSLUCENT && (S = new ShaderSource({ + defines: [I], + sources: [x] + }), this._shaderClampToGround && (A ? S.defines.push("VERTEX_DEPTH_CHECK") : S.defines.push("FRAGMENT_DEPTH_CHECK")), this._sdf && (S.defines.push("SDF"), S.defines.push(`SDF_EDGE ${P}`)), this._spTranslucent = ShaderProgram.replaceCache({ + context: i, + shaderProgram: this._spTranslucent, + vertexShaderSource: b, + fragmentShaderSource: S, + attributeLocations: attributeLocations$6 + })), this._compiledShaderRotation = this._shaderRotation, this._compiledShaderAlignedAxis = this._shaderAlignedAxis, this._compiledShaderScaleByDistance = this._shaderScaleByDistance, this._compiledShaderTranslucencyByDistance = this._shaderTranslucencyByDistance, this._compiledShaderPixelOffsetScaleByDistance = this._shaderPixelOffsetScaleByDistance, this._compiledShaderDistanceDisplayCondition = this._shaderDistanceDisplayCondition, this._compiledShaderDisableDepthDistance = this._shaderDisableDepthDistance, this._compiledShaderClampToGround = this._shaderClampToGround, this._compiledSDF = this._sdf; + } + const D = e.commandList; + if (p.render || p.pick) { + const P = this._colorCommands, I = this._blendOption === BlendOption$1.OPAQUE, M = this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT, R = this._vaf.va, L = R.length; + let g = this._uniforms, w; + defined(this._batchTable) ? (g = this._batchTable.getUniformMapCallback()(g), w = this._batchTable.getPickId()) : w = "v_pickColor", P.length = L; + const O = M ? L * 2 : L; + for (let N = 0; N < O; ++N) { + let F = P[N]; + defined(F) || (F = P[N] = new DrawCommand()); + const B = I || M && N % 2 === 0; + F.pass = B || !M ? Pass$1.OPAQUE : Pass$1.TRANSLUCENT, F.owner = this; + const V = M ? Math.floor(N / 2) : N; + F.boundingVolume = _, F.modelMatrix = y, F.count = R[V].indicesCount, F.shaderProgram = B ? this._sp : this._spTranslucent, F.uniformMap = g, F.vertexArray = R[V].va, F.renderState = B ? this._rsOpaque : this._rsTranslucent, F.debugShowBoundingVolume = this.debugShowBoundingVolume, F.pickId = w, this._instanced && (F.count = 6, F.instanceCount = n), D.push(F); + } + this.debugShowTextureAtlas && (defined(this.debugCommand) || (this.debugCommand = createDebugCommand(this, e.context)), D.push(this.debugCommand)); + } +}; +BillboardCollection.prototype.isDestroyed = function() { + return !1; +}; +BillboardCollection.prototype.destroy = function() { + return defined(this._removeCallbackFunc) && (this._removeCallbackFunc(), this._removeCallbackFunc = void 0), this._textureAtlas = this._destroyTextureAtlas && this._textureAtlas && this._textureAtlas.destroy(), this._sp = this._sp && this._sp.destroy(), this._spTranslucent = this._spTranslucent && this._spTranslucent.destroy(), this._vaf = this._vaf && this._vaf.destroy(), destroyBillboards(this._billboards), destroyObject(this); +}; +function createBillboardPointCallback(e, t, n, i, r) { + return function() { + const o = document.createElement("canvas"), s = r + 2 * i; + o.height = o.width = s; + const c = o.getContext("2d"); + return c.clearRect(0, 0, s, s), i !== 0 && (c.beginPath(), c.arc(s / 2, s / 2, s / 2, 0, 2 * Math.PI, !0), c.closePath(), c.fillStyle = n, c.fill(), e < 1 && (c.save(), c.globalCompositeOperation = "destination-out", c.beginPath(), c.arc( + s / 2, + s / 2, + r / 2, + 0, + 2 * Math.PI, + !0 + ), c.closePath(), c.fillStyle = "black", c.fill(), c.restore())), c.beginPath(), c.arc(s / 2, s / 2, r / 2, 0, 2 * Math.PI, !0), c.closePath(), c.fillStyle = t, c.fill(), o; + }; +} +function Cesium3DTilePointFeature(e, t, n, i, r) { + this._content = e, this._billboard = n, this._label = i, this._polyline = r, this._batchId = t, this._billboardImage = void 0, this._billboardColor = void 0, this._billboardOutlineColor = void 0, this._billboardOutlineWidth = void 0, this._billboardSize = void 0, this._pointSize = void 0, this._color = void 0, this._pointSize = void 0, this._pointOutlineColor = void 0, this._pointOutlineWidth = void 0, this._heightOffset = void 0, this._pickIds = new Array(3), setBillboardImage(this); +} +const scratchCartographic$e = new Cartographic(); +Object.defineProperties(Cesium3DTilePointFeature.prototype, { + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {boolean} + * + * @default true + */ + show: { + get: function() { + return this._label.show; + }, + set: function(e) { + this._label.show = e, this._billboard.show = e, this._polyline.show = e; + } + }, + /** + * Gets or sets the color of the point of this feature. + *

+ * Only applied when image is undefined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + this._color = Color.clone(e, this._color), setBillboardImage(this); + } + }, + /** + * Gets or sets the point size of this feature. + *

+ * Only applied when image is undefined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + pointSize: { + get: function() { + return this._pointSize; + }, + set: function(e) { + this._pointSize = e, setBillboardImage(this); + } + }, + /** + * Gets or sets the point outline color of this feature. + *

+ * Only applied when image is undefined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + pointOutlineColor: { + get: function() { + return this._pointOutlineColor; + }, + set: function(e) { + this._pointOutlineColor = Color.clone(e, this._pointOutlineColor), setBillboardImage(this); + } + }, + /** + * Gets or sets the point outline width in pixels of this feature. + *

+ * Only applied when image is undefined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + pointOutlineWidth: { + get: function() { + return this._pointOutlineWidth; + }, + set: function(e) { + this._pointOutlineWidth = e, setBillboardImage(this); + } + }, + /** + * Gets or sets the label color of this feature. + *

+ * The color will be applied to the label if labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + labelColor: { + get: function() { + return this._label.fillColor; + }, + set: function(e) { + this._label.fillColor = e, this._polyline.show = this._label.show && e.alpha > 0; + } + }, + /** + * Gets or sets the label outline color of this feature. + *

+ * The outline color will be applied to the label if labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + labelOutlineColor: { + get: function() { + return this._label.outlineColor; + }, + set: function(e) { + this._label.outlineColor = e; + } + }, + /** + * Gets or sets the outline width in pixels of this feature. + *

+ * The outline width will be applied to the point if labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + labelOutlineWidth: { + get: function() { + return this._label.outlineWidth; + }, + set: function(e) { + this._label.outlineWidth = e; + } + }, + /** + * Gets or sets the font of this feature. + *

+ * Only applied when the labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {string} + */ + font: { + get: function() { + return this._label.font; + }, + set: function(e) { + this._label.font = e; + } + }, + /** + * Gets or sets the fill and outline style of this feature. + *

+ * Only applied when labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {LabelStyle} + */ + labelStyle: { + get: function() { + return this._label.style; + }, + set: function(e) { + this._label.style = e; + } + }, + /** + * Gets or sets the text for this feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {string} + */ + labelText: { + get: function() { + return this._label.text; + }, + set: function(e) { + defined(e) || (e = ""), this._label.text = e; + } + }, + /** + * Gets or sets the background color of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + backgroundColor: { + get: function() { + return this._label.backgroundColor; + }, + set: function(e) { + this._label.backgroundColor = e; + } + }, + /** + * Gets or sets the background padding of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Cartesian2} + */ + backgroundPadding: { + get: function() { + return this._label.backgroundPadding; + }, + set: function(e) { + this._label.backgroundPadding = e; + } + }, + /** + * Gets or sets whether to display the background of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {boolean} + */ + backgroundEnabled: { + get: function() { + return this._label.showBackground; + }, + set: function(e) { + this._label.showBackground = e; + } + }, + /** + * Gets or sets the near and far scaling properties for this feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {NearFarScalar} + */ + scaleByDistance: { + get: function() { + return this._label.scaleByDistance; + }, + set: function(e) { + this._label.scaleByDistance = e, this._billboard.scaleByDistance = e; + } + }, + /** + * Gets or sets the scale for this feature. + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + scale: { + get: function() { + return this._billboard.scale; + }, + set: function(e) { + this._label.scale = e, this._billboard.scale = e; + } + }, + /** + * Gets or sets the near and far translucency properties for this feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {NearFarScalar} + */ + translucencyByDistance: { + get: function() { + return this._label.translucencyByDistance; + }, + set: function(e) { + this._label.translucencyByDistance = e, this._billboard.translucencyByDistance = e; + } + }, + /** + * Gets or sets the condition specifying at what distance from the camera that this feature will be displayed. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {DistanceDisplayCondition} + */ + distanceDisplayCondition: { + get: function() { + return this._label.distanceDisplayCondition; + }, + set: function(e) { + this._label.distanceDisplayCondition = e, this._polyline.distanceDisplayCondition = e, this._billboard.distanceDisplayCondition = e; + } + }, + /** + * Gets or sets the height offset in meters of this feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + heightOffset: { + get: function() { + return this._heightOffset; + }, + set: function(e) { + const t = defaultValue(this._heightOffset, 0), n = this._content.tileset.ellipsoid, i = n.cartesianToCartographic( + this._billboard.position, + scratchCartographic$e + ); + i.height = i.height - t + e; + const r = n.cartographicToCartesian(i); + this._billboard.position = r, this._label.position = this._billboard.position, this._polyline.positions = [this._polyline.positions[0], r], this._heightOffset = e; + } + }, + /** + * Gets or sets whether the anchor line is displayed. + *

+ * Only applied when heightOffset is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {boolean} + */ + anchorLineEnabled: { + get: function() { + return this._polyline.show; + }, + set: function(e) { + this._polyline.show = e; + } + }, + /** + * Gets or sets the color for the anchor line. + *

+ * Only applied when heightOffset is defined. + *

+ * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Color} + */ + anchorLineColor: { + get: function() { + return this._polyline.material.uniforms.color; + }, + set: function(e) { + this._polyline.material.uniforms.color = Color.clone( + e, + this._polyline.material.uniforms.color + ); + } + }, + /** + * Gets or sets the image of this feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {string} + */ + image: { + get: function() { + return this._billboardImage; + }, + set: function(e) { + const t = this._billboardImage !== e; + this._billboardImage = e, t && setBillboardImage(this); + } + }, + /** + * Gets or sets the distance where depth testing will be disabled. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {number} + */ + disableDepthTestDistance: { + get: function() { + return this._label.disableDepthTestDistance; + }, + set: function(e) { + this._label.disableDepthTestDistance = e, this._billboard.disableDepthTestDistance = e; + } + }, + /** + * Gets or sets the horizontal origin of this point, which determines if the point is + * to the left, center, or right of its anchor position. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {HorizontalOrigin} + */ + horizontalOrigin: { + get: function() { + return this._billboard.horizontalOrigin; + }, + set: function(e) { + this._billboard.horizontalOrigin = e; + } + }, + /** + * Gets or sets the vertical origin of this point, which determines if the point is + * to the bottom, center, or top of its anchor position. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {VerticalOrigin} + */ + verticalOrigin: { + get: function() { + return this._billboard.verticalOrigin; + }, + set: function(e) { + this._billboard.verticalOrigin = e; + } + }, + /** + * Gets or sets the horizontal origin of this point's text, which determines if the point's text is + * to the left, center, or right of its anchor position. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {HorizontalOrigin} + */ + labelHorizontalOrigin: { + get: function() { + return this._label.horizontalOrigin; + }, + set: function(e) { + this._label.horizontalOrigin = e; + } + }, + /** + * Get or sets the vertical origin of this point's text, which determines if the point's text is + * to the bottom, center, top, or baseline of it's anchor point. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {VerticalOrigin} + */ + labelVerticalOrigin: { + get: function() { + return this._label.verticalOrigin; + }, + set: function(e) { + this._label.verticalOrigin = e; + } + }, + /** + * Gets the content of the tile containing the feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Cesium3DTileContent} + * + * @readonly + * @private + */ + content: { + get: function() { + return this._content; + } + }, + /** + * Gets the tileset containing the feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Cesium3DTileset} + * + * @readonly + */ + tileset: { + get: function() { + return this._content.tileset; + } + }, + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + * + * @memberof Cesium3DTilePointFeature.prototype + * + * @type {Cesium3DTileset} + * + * @readonly + */ + primitive: { + get: function() { + return this._content.tileset; + } + }, + /** + * @private + */ + pickIds: { + get: function() { + const e = this._pickIds; + return e[0] = this._billboard.pickId, e[1] = this._label.pickId, e[2] = this._polyline.pickId, e; + } + } +}); +Cesium3DTilePointFeature.defaultColor = Color.WHITE; +Cesium3DTilePointFeature.defaultPointOutlineColor = Color.BLACK; +Cesium3DTilePointFeature.defaultPointOutlineWidth = 0; +Cesium3DTilePointFeature.defaultPointSize = 8; +function setBillboardImage(e) { + const t = e._billboard; + if (defined(e._billboardImage) && e._billboardImage !== t.image) { + t.image = e._billboardImage; + return; + } + if (defined(e._billboardImage)) + return; + const n = defaultValue( + e._color, + Cesium3DTilePointFeature.defaultColor + ), i = defaultValue( + e._pointOutlineColor, + Cesium3DTilePointFeature.defaultPointOutlineColor + ), r = defaultValue( + e._pointOutlineWidth, + Cesium3DTilePointFeature.defaultPointOutlineWidth + ), o = defaultValue( + e._pointSize, + Cesium3DTilePointFeature.defaultPointSize + ), s = e._billboardColor, c = e._billboardOutlineColor, l = e._billboardOutlineWidth, d = e._billboardSize; + if (Color.equals(n, s) && Color.equals(i, c) && r === l && o === d) + return; + e._billboardColor = Color.clone(n, e._billboardColor), e._billboardOutlineColor = Color.clone( + i, + e._billboardOutlineColor + ), e._billboardOutlineWidth = r, e._billboardSize = o; + const f = n.alpha, h = n.toCssColorString(), p = i.toCssColorString(), m = JSON.stringify([ + h, + o, + p, + r + ]); + t.setImage( + m, + createBillboardPointCallback( + f, + h, + p, + r, + o + ) + ); +} +Cesium3DTilePointFeature.prototype.hasProperty = function(e) { + return this._content.batchTable.hasProperty(this._batchId, e); +}; +Cesium3DTilePointFeature.prototype.getPropertyIds = function(e) { + return this._content.batchTable.getPropertyIds(this._batchId, e); +}; +Cesium3DTilePointFeature.prototype.getProperty = function(e) { + return this._content.batchTable.getProperty(this._batchId, e); +}; +Cesium3DTilePointFeature.prototype.getPropertyInherited = function(e) { + return Cesium3DTileFeature.getPropertyInherited( + this._content, + this._batchId, + e + ); +}; +Cesium3DTilePointFeature.prototype.setProperty = function(e, t) { + this._content.batchTable.setProperty(this._batchId, e, t), this._content.featurePropertiesDirty = !0; +}; +Cesium3DTilePointFeature.prototype.isExactClass = function(e) { + return this._content.batchTable.isExactClass(this._batchId, e); +}; +Cesium3DTilePointFeature.prototype.isClass = function(e) { + return this._content.batchTable.isClass(this._batchId, e); +}; +Cesium3DTilePointFeature.prototype.getExactClassName = function() { + return this._content.batchTable.getExactClassName(this._batchId); +}; +function measureText(e, t, n, i, r) { + const o = e.measureText(t); + if (!!/\S/.test(t)) { + const c = document.defaultView.getComputedStyle(e.canvas).getPropertyValue("font-size").replace("px", ""), l = document.createElement("canvas"), d = 100, f = o.width + d | 0, h = 3 * c, p = h / 2; + l.width = f, l.height = h; + const m = l.getContext("2d"); + m.font = n, m.fillStyle = "white", m.fillRect(0, 0, l.width + 1, l.height + 1), i && (m.strokeStyle = "black", m.lineWidth = e.lineWidth, m.strokeText(t, d / 2, p)), r && (m.fillStyle = "black", m.fillText(t, d / 2, p)); + const _ = m.getImageData(0, 0, f, h).data, y = _.length, C = f * 4; + let T, x, b, S; + for (T = 0; T < y; ++T) + if (_[T] !== 255) { + b = T / C | 0; + break; + } + for (T = y - 1; T >= 0; --T) + if (_[T] !== 255) { + S = T / C | 0; + break; + } + let E = -1; + for (T = 0; T < f && E === -1; ++T) + for (x = 0; x < h; ++x) { + const A = T * 4 + x * C; + if (_[A] !== 255 || _[A + 1] !== 255 || _[A + 2] !== 255 || _[A + 3] !== 255) { + E = T; + break; + } + } + return { + width: o.width, + height: S - b, + ascent: p - b, + descent: S - p, + minx: E - d / 2 + }; + } + return { + width: o.width, + height: 0, + ascent: 0, + descent: 0, + minx: 0 + }; +} +let imageSmoothingEnabledName; +function writeTextToCanvas(e, t) { + if (e === "") + return; + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = defaultValue(t.font, "10px sans-serif"), i = defaultValue(t.stroke, !1), r = defaultValue(t.fill, !0), o = defaultValue(t.strokeWidth, 1), s = defaultValue( + t.backgroundColor, + Color.TRANSPARENT + ), c = defaultValue(t.padding, 0), l = c * 2, d = document.createElement("canvas"); + d.width = 1, d.height = 1, d.style.font = n; + const f = d.getContext("2d", { willReadFrequently: !0 }); + defined(imageSmoothingEnabledName) || (defined(f.imageSmoothingEnabled) ? imageSmoothingEnabledName = "imageSmoothingEnabled" : defined(f.mozImageSmoothingEnabled) ? imageSmoothingEnabledName = "mozImageSmoothingEnabled" : defined(f.webkitImageSmoothingEnabled) ? imageSmoothingEnabledName = "webkitImageSmoothingEnabled" : defined(f.msImageSmoothingEnabled) && (imageSmoothingEnabledName = "msImageSmoothingEnabled")), f.font = n, f.lineJoin = "round", f.lineWidth = o, f[imageSmoothingEnabledName] = !1, d.style.visibility = "hidden", document.body.appendChild(d); + const h = measureText(f, e, n, i, r); + d.dimensions = h, document.body.removeChild(d), d.style.visibility = ""; + const p = -h.minx, m = Math.ceil(h.width) + p + l, _ = h.height + l, y = _ - h.ascent + c, C = _ - y + l; + if (d.width = m, d.height = _, f.font = n, f.lineJoin = "round", f.lineWidth = o, f[imageSmoothingEnabledName] = !1, s !== Color.TRANSPARENT && (f.fillStyle = s.toCssColorString(), f.fillRect(0, 0, d.width, d.height)), i) { + const T = defaultValue(t.strokeColor, Color.BLACK); + f.strokeStyle = T.toCssColorString(), f.strokeText(e, p + c, C); + } + if (r) { + const T = defaultValue(t.fillColor, Color.WHITE); + f.fillStyle = T.toCssColorString(), f.fillText(e, p + c, C); + } + return d; +} +var bitmapSdf = calcSDF, INF = 1e20; +function calcSDF(e, t) { + t || (t = {}); + var n = t.cutoff == null ? 0.25 : t.cutoff, i = t.radius == null ? 8 : t.radius, r = t.channel || 0, o, s, c, l, d, f, h, p, m, _, y; + if (ArrayBuffer.isView(e) || Array.isArray(e)) { + if (!t.width || !t.height) throw Error("For raw data width and height should be provided by options"); + o = t.width, s = t.height, l = e, t.stride ? f = t.stride : f = Math.floor(e.length / o / s); + } else + window.HTMLCanvasElement && e instanceof window.HTMLCanvasElement ? (p = e, h = p.getContext("2d"), o = p.width, s = p.height, m = h.getImageData(0, 0, o, s), l = m.data, f = 4) : window.CanvasRenderingContext2D && e instanceof window.CanvasRenderingContext2D ? (p = e.canvas, h = e, o = p.width, s = p.height, m = h.getImageData(0, 0, o, s), l = m.data, f = 4) : window.ImageData && e instanceof window.ImageData && (m = e, o = e.width, s = e.height, l = m.data, f = 4); + if (c = Math.max(o, s), window.Uint8ClampedArray && l instanceof window.Uint8ClampedArray || window.Uint8Array && l instanceof window.Uint8Array) + for (d = l, l = Array(o * s), _ = 0, y = Math.floor(d.length / f); _ < y; _++) + l[_] = d[_ * f + r] / 255; + else if (f !== 1) throw Error("Raw data can have only 1 value per pixel"); + var C = Array(o * s), T = Array(o * s), x = Array(c), b = Array(c), S = Array(c + 1), E = Array(c); + for (_ = 0, y = o * s; _ < y; _++) { + var A = l[_]; + C[_] = A === 1 ? 0 : A === 0 ? INF : Math.pow(Math.max(0, 0.5 - A), 2), T[_] = A === 1 ? INF : A === 0 ? 0 : Math.pow(Math.max(0, A - 0.5), 2); + } + edt(C, o, s, x, b, E, S), edt(T, o, s, x, b, E, S); + var D = window.Float32Array ? new Float32Array(o * s) : new Array(o * s); + for (_ = 0, y = o * s; _ < y; _++) + D[_] = Math.min(Math.max(1 - ((C[_] - T[_]) / i + n), 0), 1); + return D; +} +function edt(e, t, n, i, r, o, s) { + for (var c = 0; c < t; c++) { + for (var l = 0; l < n; l++) + i[l] = e[l * t + c]; + for (edt1d(i, r, o, s, n), l = 0; l < n; l++) + e[l * t + c] = r[l]; + } + for (l = 0; l < n; l++) { + for (c = 0; c < t; c++) + i[c] = e[l * t + c]; + for (edt1d(i, r, o, s, t), c = 0; c < t; c++) + e[l * t + c] = Math.sqrt(r[c]); + } +} +function edt1d(e, t, n, i, r) { + n[0] = 0, i[0] = -INF, i[1] = +INF; + for (var o = 1, s = 0; o < r; o++) { + for (var c = (e[o] + o * o - (e[n[s]] + n[s] * n[s])) / (2 * o - 2 * n[s]); c <= i[s]; ) + s--, c = (e[o] + o * o - (e[n[s]] + n[s] * n[s])) / (2 * o - 2 * n[s]); + s++, n[s] = o, i[s] = c, i[s + 1] = +INF; + } + for (o = 0, s = 0; o < r; o++) { + for (; i[s + 1] < o; ) s++; + t[o] = (o - n[s]) * (o - n[s]) + e[n[s]]; + } +} +const bitmapSDF = /* @__PURE__ */ getDefaultExportFromCjs(bitmapSdf), LabelStyle = { + /** + * Fill the text of the label, but do not outline. + * + * @type {number} + * @constant + */ + FILL: 0, + /** + * Outline the text of the label, but do not fill. + * + * @type {number} + * @constant + */ + OUTLINE: 1, + /** + * Fill and outline the text of the label. + * + * @type {number} + * @constant + */ + FILL_AND_OUTLINE: 2 +}, LabelStyle$1 = Object.freeze(LabelStyle), fontInfoCache = {}; +let fontInfoCacheLength = 0; +const fontInfoCacheMaxSize = 256, defaultBackgroundColor$2 = new Color(0.165, 0.165, 0.165, 0.8), defaultBackgroundPadding$1 = new Cartesian2(7, 5), textTypes = Object.freeze({ + LTR: 0, + RTL: 1, + WEAK: 2, + BRACKETS: 3 +}); +function rebindAllGlyphs$1(e) { + !e._rebindAllGlyphs && !e._repositionAllGlyphs && e._labelCollection._labelsToUpdate.push(e), e._rebindAllGlyphs = !0; +} +function repositionAllGlyphs$1(e) { + !e._rebindAllGlyphs && !e._repositionAllGlyphs && e._labelCollection._labelsToUpdate.push(e), e._repositionAllGlyphs = !0; +} +function getCSSValue(e, t) { + return document.defaultView.getComputedStyle(e, null).getPropertyValue(t); +} +function parseFont(e) { + let t = fontInfoCache[e._font]; + if (!defined(t)) { + const n = document.createElement("div"); + n.style.position = "absolute", n.style.opacity = 0, n.style.font = e._font, document.body.appendChild(n); + let i = parseFloat(getCSSValue(n, "line-height")); + isNaN(i) && (i = void 0), t = { + family: getCSSValue(n, "font-family"), + size: getCSSValue(n, "font-size").replace("px", ""), + style: getCSSValue(n, "font-style"), + weight: getCSSValue(n, "font-weight"), + lineHeight: i + }, document.body.removeChild(n), fontInfoCacheLength < fontInfoCacheMaxSize && (fontInfoCache[e._font] = t, fontInfoCacheLength++); + } + e._fontFamily = t.family, e._fontSize = t.size, e._fontStyle = t.style, e._fontWeight = t.weight, e._lineHeight = t.lineHeight; +} +function Label(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let n = e.translucencyByDistance, i = e.pixelOffsetScaleByDistance, r = e.scaleByDistance, o = e.distanceDisplayCondition; + defined(n) && (n = NearFarScalar.clone(n)), defined(i) && (i = NearFarScalar.clone( + i + )), defined(r) && (r = NearFarScalar.clone(r)), defined(o) && (o = DistanceDisplayCondition.clone( + o + )), this._renderedText = void 0, this._text = void 0, this._show = defaultValue(e.show, !0), this._font = defaultValue(e.font, "30px sans-serif"), this._fillColor = Color.clone(defaultValue(e.fillColor, Color.WHITE)), this._outlineColor = Color.clone( + defaultValue(e.outlineColor, Color.BLACK) + ), this._outlineWidth = defaultValue(e.outlineWidth, 1), this._showBackground = defaultValue(e.showBackground, !1), this._backgroundColor = Color.clone( + defaultValue(e.backgroundColor, defaultBackgroundColor$2) + ), this._backgroundPadding = Cartesian2.clone( + defaultValue(e.backgroundPadding, defaultBackgroundPadding$1) + ), this._style = defaultValue(e.style, LabelStyle$1.FILL), this._verticalOrigin = defaultValue( + e.verticalOrigin, + VerticalOrigin$1.BASELINE + ), this._horizontalOrigin = defaultValue( + e.horizontalOrigin, + HorizontalOrigin$1.LEFT + ), this._pixelOffset = Cartesian2.clone( + defaultValue(e.pixelOffset, Cartesian2.ZERO) + ), this._eyeOffset = Cartesian3.clone( + defaultValue(e.eyeOffset, Cartesian3.ZERO) + ), this._position = Cartesian3.clone( + defaultValue(e.position, Cartesian3.ZERO) + ), this._scale = defaultValue(e.scale, 1), this._id = e.id, this._translucencyByDistance = n, this._pixelOffsetScaleByDistance = i, this._scaleByDistance = r, this._heightReference = defaultValue( + e.heightReference, + HeightReference$1.NONE + ), this._distanceDisplayCondition = o, this._disableDepthTestDistance = e.disableDepthTestDistance, this._labelCollection = t, this._glyphs = [], this._backgroundBillboard = void 0, this._batchIndex = void 0, this._rebindAllGlyphs = !0, this._repositionAllGlyphs = !0, this._actualClampedPosition = void 0, this._removeCallbackFunc = void 0, this._mode = void 0, this._clusterShow = !0, this.text = defaultValue(e.text, ""), this._relativeSize = 1, parseFont(this), this._updateClamping(); +} +Object.defineProperties(Label.prototype, { + /** + * Determines if this label will be shown. Use this to hide or show a label, instead + * of removing it and re-adding it to the collection. + * @memberof Label.prototype + * @type {boolean} + * @default true + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + if (this._show !== e) { + this._show = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i].billboard; + defined(o) && (o.show = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.show = e); + } + } + }, + /** + * Gets or sets the Cartesian position of this label. + * @memberof Label.prototype + * @type {Cartesian3} + */ + position: { + get: function() { + return this._position; + }, + set: function(e) { + const t = this._position; + if (!Cartesian3.equals(t, e)) { + Cartesian3.clone(e, t); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r].billboard; + defined(s) && (s.position = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.position = e), this._updateClamping(); + } + } + }, + /** + * Gets or sets the height reference of this billboard. + * @memberof Label.prototype + * @type {HeightReference} + * @default HeightReference.NONE + */ + heightReference: { + get: function() { + return this._heightReference; + }, + set: function(e) { + if (e !== this._heightReference) { + this._heightReference = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i].billboard; + defined(o) && (o.heightReference = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.heightReference = e), repositionAllGlyphs$1(this), this._updateClamping(); + } + } + }, + /** + * Gets or sets the text of this label. + * @memberof Label.prototype + * @type {string} + */ + text: { + get: function() { + return this._text; + }, + set: function(e) { + if (this._text !== e) { + this._text = e; + const t = e.replace(/\u00ad/g, ""); + this._renderedText = Label.enableRightToLeftDetection ? reverseRtl(t) : t, rebindAllGlyphs$1(this); + } + } + }, + /** + * Gets or sets the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. + * @memberof Label.prototype + * @type {string} + * @default '30px sans-serif' + * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles|HTML canvas 2D context text styles} + */ + font: { + get: function() { + return this._font; + }, + set: function(e) { + this._font !== e && (this._font = e, rebindAllGlyphs$1(this), parseFont(this)); + } + }, + /** + * Gets or sets the fill color of this label. + * @memberof Label.prototype + * @type {Color} + * @default Color.WHITE + * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} + */ + fillColor: { + get: function() { + return this._fillColor; + }, + set: function(e) { + const t = this._fillColor; + Color.equals(t, e) || (Color.clone(e, t), rebindAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the outline color of this label. + * @memberof Label.prototype + * @type {Color} + * @default Color.BLACK + * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} + */ + outlineColor: { + get: function() { + return this._outlineColor; + }, + set: function(e) { + const t = this._outlineColor; + Color.equals(t, e) || (Color.clone(e, t), rebindAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the outline width of this label. + * @memberof Label.prototype + * @type {number} + * @default 1.0 + * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} + */ + outlineWidth: { + get: function() { + return this._outlineWidth; + }, + set: function(e) { + this._outlineWidth !== e && (this._outlineWidth = e, rebindAllGlyphs$1(this)); + } + }, + /** + * Determines if a background behind this label will be shown. + * @memberof Label.prototype + * @default false + * @type {boolean} + */ + showBackground: { + get: function() { + return this._showBackground; + }, + set: function(e) { + this._showBackground !== e && (this._showBackground = e, rebindAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the background color of this label. + * @memberof Label.prototype + * @type {Color} + * @default new Color(0.165, 0.165, 0.165, 0.8) + */ + backgroundColor: { + get: function() { + return this._backgroundColor; + }, + set: function(e) { + const t = this._backgroundColor; + if (!Color.equals(t, e)) { + Color.clone(e, t); + const n = this._backgroundBillboard; + defined(n) && (n.color = t); + } + } + }, + /** + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. + * @memberof Label.prototype + * @type {Cartesian2} + * @default new Cartesian2(7, 5) + */ + backgroundPadding: { + get: function() { + return this._backgroundPadding; + }, + set: function(e) { + const t = this._backgroundPadding; + Cartesian2.equals(t, e) || (Cartesian2.clone(e, t), repositionAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the style of this label. + * @memberof Label.prototype + * @type {LabelStyle} + * @default LabelStyle.FILL + */ + style: { + get: function() { + return this._style; + }, + set: function(e) { + this._style !== e && (this._style = e, rebindAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the pixel offset in screen space from the origin of this label. This is commonly used + * to align multiple labels and billboards at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

+ *
+ * + * + * + *
default
l.pixeloffset = new Cartesian2(25, 75);
+ * The label's origin is indicated by the yellow point. + *
+ * @memberof Label.prototype + * @type {Cartesian2} + * @default Cartesian2.ZERO + */ + pixelOffset: { + get: function() { + return this._pixelOffset; + }, + set: function(e) { + const t = this._pixelOffset; + if (!Cartesian2.equals(t, e)) { + Cartesian2.clone(e, t); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r]; + defined(s.billboard) && (s.billboard.pixelOffset = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.pixelOffset = e); + } + } + }, + /** + * Gets or sets near and far translucency properties of a Label based on the Label's distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @memberof Label.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a label's translucencyByDistance to 1.0 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * text.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable translucency by distance + * text.translucencyByDistance = undefined; + */ + translucencyByDistance: { + get: function() { + return this._translucencyByDistance; + }, + set: function(e) { + const t = this._translucencyByDistance; + if (!NearFarScalar.equals(t, e)) { + this._translucencyByDistance = NearFarScalar.clone( + e, + t + ); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r]; + defined(s.billboard) && (s.billboard.translucencyByDistance = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.translucencyByDistance = e); + } + } + }, + /** + * Gets or sets near and far pixel offset scaling properties of a Label based on the Label's distance from the camera. + * A label's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset scaling remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @memberof Label.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a label's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the label and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * text.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * text.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * + * @example + * // Example 2. + * // disable pixel offset by distance + * text.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: { + get: function() { + return this._pixelOffsetScaleByDistance; + }, + set: function(e) { + const t = this._pixelOffsetScaleByDistance; + if (!NearFarScalar.equals(t, e)) { + this._pixelOffsetScaleByDistance = NearFarScalar.clone( + e, + t + ); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r]; + defined(s.billboard) && (s.billboard.pixelOffsetScaleByDistance = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.pixelOffsetScaleByDistance = e); + } + } + }, + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @memberof Label.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a label's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * label.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable scaling by distance + * label.scaleByDistance = undefined; + */ + scaleByDistance: { + get: function() { + return this._scaleByDistance; + }, + set: function(e) { + const t = this._scaleByDistance; + if (!NearFarScalar.equals(t, e)) { + this._scaleByDistance = NearFarScalar.clone(e, t); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r]; + defined(s.billboard) && (s.billboard.scaleByDistance = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.scaleByDistance = e); + } + } + }, + /** + * Gets and sets the 3D Cartesian offset applied to this label in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

+ * An eye offset is commonly used to arrange multiple label or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

+ * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *
+ * + * + * + *
+ * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ * @memberof Label.prototype + * @type {Cartesian3} + * @default Cartesian3.ZERO + */ + eyeOffset: { + get: function() { + return this._eyeOffset; + }, + set: function(e) { + const t = this._eyeOffset; + if (!Cartesian3.equals(t, e)) { + Cartesian3.clone(e, t); + const n = this._glyphs; + for (let r = 0, o = n.length; r < o; r++) { + const s = n[r]; + defined(s.billboard) && (s.billboard.eyeOffset = e); + } + const i = this._backgroundBillboard; + defined(i) && (i.eyeOffset = e); + } + } + }, + /** + * Gets or sets the horizontal origin of this label, which determines if the label is drawn + * to the left, center, or right of its anchor position. + *

+ *
+ *
+ *
+ * @memberof Label.prototype + * @type {HorizontalOrigin} + * @default HorizontalOrigin.LEFT + * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + horizontalOrigin: { + get: function() { + return this._horizontalOrigin; + }, + set: function(e) { + this._horizontalOrigin !== e && (this._horizontalOrigin = e, repositionAllGlyphs$1(this)); + } + }, + /** + * Gets or sets the vertical origin of this label, which determines if the label is + * to the above, below, or at the center of its anchor position. + *

+ *
+ *
+ *
+ * @memberof Label.prototype + * @type {VerticalOrigin} + * @default VerticalOrigin.BASELINE + * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + verticalOrigin: { + get: function() { + return this._verticalOrigin; + }, + set: function(e) { + if (this._verticalOrigin !== e) { + this._verticalOrigin = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.verticalOrigin = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.verticalOrigin = e), repositionAllGlyphs$1(this); + } + } + }, + /** + * Gets or sets the uniform scale that is multiplied with the label's size in pixels. + * A scale of 1.0 does not change the size of the label; a scale greater than + * 1.0 enlarges the label; a positive scale less than 1.0 shrinks + * the label. + *

+ * Applying a large scale value may pixelate the label. To make text larger without pixelation, + * use a larger font size when calling {@link Label#font} instead. + *

+ *
+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ * @memberof Label.prototype + * @type {number} + * @default 1.0 + */ + scale: { + get: function() { + return this._scale; + }, + set: function(e) { + if (this._scale !== e) { + this._scale = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.scale = e * this._relativeSize); + } + const n = this._backgroundBillboard; + defined(n) && (n.scale = e * this._relativeSize), repositionAllGlyphs$1(this); + } + } + }, + /** + * Gets the total scale of the label, which is the label's scale multiplied by the computed relative size + * of the desired font compared to the generated glyph size. + * @memberof Label.prototype + * @type {number} + * @default 1.0 + */ + totalScale: { + get: function() { + return this._scale * this._relativeSize; + } + }, + /** + * Gets or sets the condition specifying at what distance from the camera that this label will be displayed. + * @memberof Label.prototype + * @type {DistanceDisplayCondition} + * @default undefined + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + if (!DistanceDisplayCondition.equals(e, this._distanceDisplayCondition)) { + this._distanceDisplayCondition = DistanceDisplayCondition.clone( + e, + this._distanceDisplayCondition + ); + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.distanceDisplayCondition = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.distanceDisplayCondition = e); + } + } + }, + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof Label.prototype + * @type {number} + */ + disableDepthTestDistance: { + get: function() { + return this._disableDepthTestDistance; + }, + set: function(e) { + if (this._disableDepthTestDistance !== e) { + this._disableDepthTestDistance = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.disableDepthTestDistance = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.disableDepthTestDistance = e); + } + } + }, + /** + * Gets or sets the user-defined value returned when the label is picked. + * @memberof Label.prototype + * @type {*} + */ + id: { + get: function() { + return this._id; + }, + set: function(e) { + if (this._id !== e) { + this._id = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.id = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.id = e); + } + } + }, + /** + * @private + */ + pickId: { + get: function() { + if (!(this._glyphs.length === 0 || !defined(this._glyphs[0].billboard))) + return this._glyphs[0].billboard.pickId; + } + }, + /** + * Keeps track of the position of the label based on the height reference. + * @memberof Label.prototype + * @type {Cartesian3} + * @private + */ + _clampedPosition: { + get: function() { + return this._actualClampedPosition; + }, + set: function(e) { + this._actualClampedPosition = Cartesian3.clone( + e, + this._actualClampedPosition + ); + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard._clampedPosition = e); + } + const n = this._backgroundBillboard; + defined(n) && (n._clampedPosition = e); + } + }, + /** + * Determines whether or not this label will be shown or hidden because it was clustered. + * @memberof Label.prototype + * @type {boolean} + * @default true + * @private + */ + clusterShow: { + get: function() { + return this._clusterShow; + }, + set: function(e) { + if (this._clusterShow !== e) { + this._clusterShow = e; + const t = this._glyphs; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i]; + defined(o.billboard) && (o.billboard.clusterShow = e); + } + const n = this._backgroundBillboard; + defined(n) && (n.clusterShow = e); + } + } + } +}); +Label.prototype._updateClamping = function() { + Billboard._updateClamping(this._labelCollection, this); +}; +Label.prototype.computeScreenSpacePosition = function(e, t) { + defined(t) || (t = new Cartesian2()); + const i = this._labelCollection.modelMatrix, r = defined(this._actualClampedPosition) ? this._actualClampedPosition : this._position; + return Billboard._computeScreenSpacePosition( + i, + r, + this._eyeOffset, + this._pixelOffset, + e, + t + ); +}; +Label.getScreenSpaceBoundingBox = function(e, t, n) { + let i = 0, r = 0, o = 0, s = 0; + const c = e.totalScale, l = e._backgroundBillboard; + if (defined(l)) + i = t.x + l._translate.x, r = t.y - l._translate.y, o = l.width * c, s = l.height * c, e.verticalOrigin === VerticalOrigin$1.BOTTOM || e.verticalOrigin === VerticalOrigin$1.BASELINE ? r -= s : e.verticalOrigin === VerticalOrigin$1.CENTER && (r -= s * 0.5); + else { + i = Number.POSITIVE_INFINITY, r = Number.POSITIVE_INFINITY; + let d = 0, f = 0; + const h = e._glyphs, p = h.length; + for (let m = 0; m < p; ++m) { + const _ = h[m], y = _.billboard; + if (!defined(y)) + continue; + const C = t.x + y._translate.x; + let T = t.y - y._translate.y; + const x = _.dimensions.width * c, b = _.dimensions.height * c; + e.verticalOrigin === VerticalOrigin$1.BOTTOM || e.verticalOrigin === VerticalOrigin$1.BASELINE ? T -= b : e.verticalOrigin === VerticalOrigin$1.CENTER && (T -= b * 0.5), e._verticalOrigin === VerticalOrigin$1.TOP ? T += SDFSettings$1.PADDING * c : (e._verticalOrigin === VerticalOrigin$1.BOTTOM || e._verticalOrigin === VerticalOrigin$1.BASELINE) && (T -= SDFSettings$1.PADDING * c), i = Math.min(i, C), r = Math.min(r, T), d = Math.max(d, C + x), f = Math.max(f, T + b); + } + o = d - i, s = f - r; + } + return defined(n) || (n = new BoundingRectangle()), n.x = i, n.y = r, n.width = o, n.height = s, n; +}; +Label.prototype.equals = function(e) { + return this === e || defined(e) && this._show === e._show && this._scale === e._scale && this._outlineWidth === e._outlineWidth && this._showBackground === e._showBackground && this._style === e._style && this._verticalOrigin === e._verticalOrigin && this._horizontalOrigin === e._horizontalOrigin && this._heightReference === e._heightReference && this._renderedText === e._renderedText && this._font === e._font && Cartesian3.equals(this._position, e._position) && Color.equals(this._fillColor, e._fillColor) && Color.equals(this._outlineColor, e._outlineColor) && Color.equals(this._backgroundColor, e._backgroundColor) && Cartesian2.equals(this._backgroundPadding, e._backgroundPadding) && Cartesian2.equals(this._pixelOffset, e._pixelOffset) && Cartesian3.equals(this._eyeOffset, e._eyeOffset) && NearFarScalar.equals( + this._translucencyByDistance, + e._translucencyByDistance + ) && NearFarScalar.equals( + this._pixelOffsetScaleByDistance, + e._pixelOffsetScaleByDistance + ) && NearFarScalar.equals(this._scaleByDistance, e._scaleByDistance) && DistanceDisplayCondition.equals( + this._distanceDisplayCondition, + e._distanceDisplayCondition + ) && this._disableDepthTestDistance === e._disableDepthTestDistance && this._id === e._id; +}; +Label.prototype.isDestroyed = function() { + return !1; +}; +Label.enableRightToLeftDetection = !1; +function convertTextToTypes(e, t) { + const n = /[a-zA-Z0-9]/, i = /[()[\]{}<>]/, r = []; + let o = "", s = textTypes.LTR, c = ""; + const l = e.length; + for (let d = 0; d < l; ++d) { + const f = e.charAt(d); + t.test(f) ? c = textTypes.RTL : n.test(f) ? c = textTypes.LTR : i.test(f) ? c = textTypes.BRACKETS : c = textTypes.WEAK, d === 0 && (s = c), s === c && c !== textTypes.BRACKETS ? o += f : (o !== "" && r.push({ Type: s, Word: o }), s = c, o = f); + } + return r.push({ Type: c, Word: o }), r; +} +function reverseWord(e) { + return e.split("").reverse().join(""); +} +function spliceWord(e, t, n) { + return e.slice(0, t) + n + e.slice(t); +} +function reverseBrackets(e) { + switch (e) { + case "(": + return ")"; + case ")": + return "("; + case "[": + return "]"; + case "]": + return "["; + case "{": + return "}"; + case "}": + return "{"; + case "<": + return ">"; + case ">": + return "<"; + } +} +const hebrew = "א-ת", arabic = "؀-ۿݐ-ݿࢠ-ࣿ", rtlChars = new RegExp(`[${hebrew}${arabic}]`); +function reverseRtl(e) { + const t = e.split(` +`); + let n = ""; + for (let i = 0; i < t.length; i++) { + const r = t[i], o = rtlChars.test(r.charAt(0)), s = convertTextToTypes(r, rtlChars); + let c = 0, l = ""; + for (let d = 0; d < s.length; ++d) { + const f = s[d], h = f.Type === textTypes.BRACKETS ? reverseBrackets(f.Word) : reverseWord(f.Word); + o ? f.Type === textTypes.RTL ? (l = h + l, c = 0) : f.Type === textTypes.LTR ? (l = spliceWord(l, c, f.Word), c += f.Word.length) : (f.Type === textTypes.WEAK || f.Type === textTypes.BRACKETS) && (f.Type === textTypes.WEAK && s[d - 1].Type === textTypes.BRACKETS ? l = h + l : s[d - 1].Type === textTypes.RTL ? (l = h + l, c = 0) : s.length > d + 1 ? s[d + 1].Type === textTypes.RTL ? (l = h + l, c = 0) : (l = spliceWord(l, c, f.Word), c += f.Word.length) : l = spliceWord(l, 0, h)) : f.Type === textTypes.RTL ? l = spliceWord(l, c, h) : f.Type === textTypes.LTR ? (l += f.Word, c = l.length) : (f.Type === textTypes.WEAK || f.Type === textTypes.BRACKETS) && (d > 0 && s[d - 1].Type === textTypes.RTL ? s.length > d + 1 ? s[d + 1].Type === textTypes.RTL ? l = spliceWord(l, c, h) : (l += f.Word, c = l.length) : l += f.Word : (l += f.Word, c = l.length)); + } + n += l, i < t.length - 1 && (n += ` +`); + } + return n; +} +var graphemeSplitter = { exports: {} }; +(function(e) { + function t() { + var n = 0, i = 1, r = 2, o = 3, s = 4, c = 5, l = 6, d = 7, f = 8, h = 9, p = 10, m = 11, _ = 12, y = 13, C = 14, T = 15, x = 16, b = 17, S = 0, E = 1, A = 2, D = 3, P = 4; + function I(g, w) { + return 55296 <= g.charCodeAt(w) && g.charCodeAt(w) <= 56319 && 56320 <= g.charCodeAt(w + 1) && g.charCodeAt(w + 1) <= 57343; + } + function M(g, w) { + w === void 0 && (w = 0); + var O = g.charCodeAt(w); + if (55296 <= O && O <= 56319 && w < g.length - 1) { + var N = O, F = g.charCodeAt(w + 1); + return 56320 <= F && F <= 57343 ? (N - 55296) * 1024 + (F - 56320) + 65536 : N; + } + if (56320 <= O && O <= 57343 && w >= 1) { + var N = g.charCodeAt(w - 1), F = O; + return 55296 <= N && N <= 56319 ? (N - 55296) * 1024 + (F - 56320) + 65536 : F; + } + return O; + } + function R(g, w, O) { + var N = [g].concat(w).concat([O]), F = N[N.length - 2], B = O, V = N.lastIndexOf(C); + if (V > 1 && N.slice(1, V).every(function($) { + return $ == o; + }) && [o, y, b].indexOf(g) == -1) + return A; + var U = N.lastIndexOf(s); + if (U > 0 && N.slice(1, U).every(function($) { + return $ == s; + }) && [_, s].indexOf(F) == -1) + return N.filter(function($) { + return $ == s; + }).length % 2 == 1 ? D : P; + if (F == n && B == i) + return S; + if (F == r || F == n || F == i) + return B == C && w.every(function($) { + return $ == o; + }) ? A : E; + if (B == r || B == n || B == i) + return E; + if (F == l && (B == l || B == d || B == h || B == p)) + return S; + if ((F == h || F == d) && (B == d || B == f)) + return S; + if ((F == p || F == f) && B == f) + return S; + if (B == o || B == T) + return S; + if (B == c) + return S; + if (F == _) + return S; + var k = N.indexOf(o) != -1 ? N.lastIndexOf(o) - 1 : N.length - 2; + return [y, b].indexOf(N[k]) != -1 && N.slice(k + 1, -1).every(function($) { + return $ == o; + }) && B == C || F == T && [x, b].indexOf(B) != -1 ? S : w.indexOf(s) != -1 ? A : F == s && B == s ? S : E; + } + this.nextBreak = function(g, w) { + if (w === void 0 && (w = 0), w < 0) + return 0; + if (w >= g.length - 1) + return g.length; + for (var O = L(M(g, w)), N = [], F = w + 1; F < g.length; F++) + if (!I(g, F - 1)) { + var B = L(M(g, F)); + if (R(O, N, B)) + return F; + N.push(B); + } + return g.length; + }, this.splitGraphemes = function(g) { + for (var w = [], O = 0, N; (N = this.nextBreak(g, O)) < g.length; ) + w.push(g.slice(O, N)), O = N; + return O < g.length && w.push(g.slice(O)), w; + }, this.iterateGraphemes = function(g) { + var w = 0, O = { + next: (function() { + var N, F; + return (F = this.nextBreak(g, w)) < g.length ? (N = g.slice(w, F), w = F, { value: N, done: !1 }) : w < g.length ? (N = g.slice(w), w = g.length, { value: N, done: !1 }) : { value: void 0, done: !0 }; + }).bind(this) + }; + return typeof Symbol < "u" && Symbol.iterator && (O[Symbol.iterator] = function() { + return O; + }), O; + }, this.countGraphemes = function(g) { + for (var w = 0, O = 0, N; (N = this.nextBreak(g, O)) < g.length; ) + O = N, w++; + return O < g.length && w++, w; + }; + function L(g) { + return 1536 <= g && g <= 1541 || // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + g == 1757 || // Cf ARABIC END OF AYAH + g == 1807 || // Cf SYRIAC ABBREVIATION MARK + g == 2274 || // Cf ARABIC DISPUTED END OF AYAH + g == 3406 || // Lo MALAYALAM LETTER DOT REPH + g == 69821 || // Cf KAITHI NUMBER SIGN + 70082 <= g && g <= 70083 || // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA + g == 72250 || // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + 72326 <= g && g <= 72329 || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA + g == 73030 ? _ : g == 13 ? n : g == 10 ? i : 0 <= g && g <= 9 || // Cc [10] .. + 11 <= g && g <= 12 || // Cc [2] .. + 14 <= g && g <= 31 || // Cc [18] .. + 127 <= g && g <= 159 || // Cc [33] .. + g == 173 || // Cf SOFT HYPHEN + g == 1564 || // Cf ARABIC LETTER MARK + g == 6158 || // Cf MONGOLIAN VOWEL SEPARATOR + g == 8203 || // Cf ZERO WIDTH SPACE + 8206 <= g && g <= 8207 || // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + g == 8232 || // Zl LINE SEPARATOR + g == 8233 || // Zp PARAGRAPH SEPARATOR + 8234 <= g && g <= 8238 || // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + 8288 <= g && g <= 8292 || // Cf [5] WORD JOINER..INVISIBLE PLUS + g == 8293 || // Cn + 8294 <= g && g <= 8303 || // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + 55296 <= g && g <= 57343 || // Cs [2048] .. + g == 65279 || // Cf ZERO WIDTH NO-BREAK SPACE + 65520 <= g && g <= 65528 || // Cn [9] .. + 65529 <= g && g <= 65531 || // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + 113824 <= g && g <= 113827 || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + 119155 <= g && g <= 119162 || // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + g == 917504 || // Cn + g == 917505 || // Cf LANGUAGE TAG + 917506 <= g && g <= 917535 || // Cn [30] .. + 917632 <= g && g <= 917759 || // Cn [128] .. + 918e3 <= g && g <= 921599 ? r : 768 <= g && g <= 879 || // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + 1155 <= g && g <= 1159 || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + 1160 <= g && g <= 1161 || // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + 1425 <= g && g <= 1469 || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + g == 1471 || // Mn HEBREW POINT RAFE + 1473 <= g && g <= 1474 || // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + 1476 <= g && g <= 1477 || // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + g == 1479 || // Mn HEBREW POINT QAMATS QATAN + 1552 <= g && g <= 1562 || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + 1611 <= g && g <= 1631 || // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + g == 1648 || // Mn ARABIC LETTER SUPERSCRIPT ALEF + 1750 <= g && g <= 1756 || // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + 1759 <= g && g <= 1764 || // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + 1767 <= g && g <= 1768 || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + 1770 <= g && g <= 1773 || // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + g == 1809 || // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + 1840 <= g && g <= 1866 || // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + 1958 <= g && g <= 1968 || // Mn [11] THAANA ABAFILI..THAANA SUKUN + 2027 <= g && g <= 2035 || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + 2070 <= g && g <= 2073 || // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + 2075 <= g && g <= 2083 || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + 2085 <= g && g <= 2087 || // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + 2089 <= g && g <= 2093 || // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + 2137 <= g && g <= 2139 || // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + 2260 <= g && g <= 2273 || // Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA + 2275 <= g && g <= 2306 || // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + g == 2362 || // Mn DEVANAGARI VOWEL SIGN OE + g == 2364 || // Mn DEVANAGARI SIGN NUKTA + 2369 <= g && g <= 2376 || // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + g == 2381 || // Mn DEVANAGARI SIGN VIRAMA + 2385 <= g && g <= 2391 || // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + 2402 <= g && g <= 2403 || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + g == 2433 || // Mn BENGALI SIGN CANDRABINDU + g == 2492 || // Mn BENGALI SIGN NUKTA + g == 2494 || // Mc BENGALI VOWEL SIGN AA + 2497 <= g && g <= 2500 || // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + g == 2509 || // Mn BENGALI SIGN VIRAMA + g == 2519 || // Mc BENGALI AU LENGTH MARK + 2530 <= g && g <= 2531 || // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + 2561 <= g && g <= 2562 || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + g == 2620 || // Mn GURMUKHI SIGN NUKTA + 2625 <= g && g <= 2626 || // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + 2631 <= g && g <= 2632 || // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + 2635 <= g && g <= 2637 || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + g == 2641 || // Mn GURMUKHI SIGN UDAAT + 2672 <= g && g <= 2673 || // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + g == 2677 || // Mn GURMUKHI SIGN YAKASH + 2689 <= g && g <= 2690 || // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + g == 2748 || // Mn GUJARATI SIGN NUKTA + 2753 <= g && g <= 2757 || // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + 2759 <= g && g <= 2760 || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + g == 2765 || // Mn GUJARATI SIGN VIRAMA + 2786 <= g && g <= 2787 || // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + 2810 <= g && g <= 2815 || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + g == 2817 || // Mn ORIYA SIGN CANDRABINDU + g == 2876 || // Mn ORIYA SIGN NUKTA + g == 2878 || // Mc ORIYA VOWEL SIGN AA + g == 2879 || // Mn ORIYA VOWEL SIGN I + 2881 <= g && g <= 2884 || // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + g == 2893 || // Mn ORIYA SIGN VIRAMA + g == 2902 || // Mn ORIYA AI LENGTH MARK + g == 2903 || // Mc ORIYA AU LENGTH MARK + 2914 <= g && g <= 2915 || // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + g == 2946 || // Mn TAMIL SIGN ANUSVARA + g == 3006 || // Mc TAMIL VOWEL SIGN AA + g == 3008 || // Mn TAMIL VOWEL SIGN II + g == 3021 || // Mn TAMIL SIGN VIRAMA + g == 3031 || // Mc TAMIL AU LENGTH MARK + g == 3072 || // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + 3134 <= g && g <= 3136 || // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + 3142 <= g && g <= 3144 || // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + 3146 <= g && g <= 3149 || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + 3157 <= g && g <= 3158 || // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + 3170 <= g && g <= 3171 || // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + g == 3201 || // Mn KANNADA SIGN CANDRABINDU + g == 3260 || // Mn KANNADA SIGN NUKTA + g == 3263 || // Mn KANNADA VOWEL SIGN I + g == 3266 || // Mc KANNADA VOWEL SIGN UU + g == 3270 || // Mn KANNADA VOWEL SIGN E + 3276 <= g && g <= 3277 || // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + 3285 <= g && g <= 3286 || // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + 3298 <= g && g <= 3299 || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + 3328 <= g && g <= 3329 || // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + 3387 <= g && g <= 3388 || // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + g == 3390 || // Mc MALAYALAM VOWEL SIGN AA + 3393 <= g && g <= 3396 || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + g == 3405 || // Mn MALAYALAM SIGN VIRAMA + g == 3415 || // Mc MALAYALAM AU LENGTH MARK + 3426 <= g && g <= 3427 || // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + g == 3530 || // Mn SINHALA SIGN AL-LAKUNA + g == 3535 || // Mc SINHALA VOWEL SIGN AELA-PILLA + 3538 <= g && g <= 3540 || // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + g == 3542 || // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + g == 3551 || // Mc SINHALA VOWEL SIGN GAYANUKITTA + g == 3633 || // Mn THAI CHARACTER MAI HAN-AKAT + 3636 <= g && g <= 3642 || // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + 3655 <= g && g <= 3662 || // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + g == 3761 || // Mn LAO VOWEL SIGN MAI KAN + 3764 <= g && g <= 3769 || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU + 3771 <= g && g <= 3772 || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO + 3784 <= g && g <= 3789 || // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + 3864 <= g && g <= 3865 || // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + g == 3893 || // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + g == 3895 || // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + g == 3897 || // Mn TIBETAN MARK TSA -PHRU + 3953 <= g && g <= 3966 || // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + 3968 <= g && g <= 3972 || // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + 3974 <= g && g <= 3975 || // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + 3981 <= g && g <= 3991 || // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + 3993 <= g && g <= 4028 || // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + g == 4038 || // Mn TIBETAN SYMBOL PADMA GDAN + 4141 <= g && g <= 4144 || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + 4146 <= g && g <= 4151 || // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + 4153 <= g && g <= 4154 || // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + 4157 <= g && g <= 4158 || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + 4184 <= g && g <= 4185 || // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + 4190 <= g && g <= 4192 || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + 4209 <= g && g <= 4212 || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + g == 4226 || // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + 4229 <= g && g <= 4230 || // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + g == 4237 || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + g == 4253 || // Mn MYANMAR VOWEL SIGN AITON AI + 4957 <= g && g <= 4959 || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + 5906 <= g && g <= 5908 || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + 5938 <= g && g <= 5940 || // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD + 5970 <= g && g <= 5971 || // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + 6002 <= g && g <= 6003 || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + 6068 <= g && g <= 6069 || // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + 6071 <= g && g <= 6077 || // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + g == 6086 || // Mn KHMER SIGN NIKAHIT + 6089 <= g && g <= 6099 || // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + g == 6109 || // Mn KHMER SIGN ATTHACAN + 6155 <= g && g <= 6157 || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + 6277 <= g && g <= 6278 || // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + g == 6313 || // Mn MONGOLIAN LETTER ALI GALI DAGALGA + 6432 <= g && g <= 6434 || // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + 6439 <= g && g <= 6440 || // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + g == 6450 || // Mn LIMBU SMALL LETTER ANUSVARA + 6457 <= g && g <= 6459 || // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + 6679 <= g && g <= 6680 || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + g == 6683 || // Mn BUGINESE VOWEL SIGN AE + g == 6742 || // Mn TAI THAM CONSONANT SIGN MEDIAL LA + 6744 <= g && g <= 6750 || // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + g == 6752 || // Mn TAI THAM SIGN SAKOT + g == 6754 || // Mn TAI THAM VOWEL SIGN MAI SAT + 6757 <= g && g <= 6764 || // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + 6771 <= g && g <= 6780 || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + g == 6783 || // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + 6832 <= g && g <= 6845 || // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + g == 6846 || // Me COMBINING PARENTHESES OVERLAY + 6912 <= g && g <= 6915 || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + g == 6964 || // Mn BALINESE SIGN REREKAN + 6966 <= g && g <= 6970 || // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + g == 6972 || // Mn BALINESE VOWEL SIGN LA LENGA + g == 6978 || // Mn BALINESE VOWEL SIGN PEPET + 7019 <= g && g <= 7027 || // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + 7040 <= g && g <= 7041 || // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + 7074 <= g && g <= 7077 || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + 7080 <= g && g <= 7081 || // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + 7083 <= g && g <= 7085 || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + g == 7142 || // Mn BATAK SIGN TOMPI + 7144 <= g && g <= 7145 || // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + g == 7149 || // Mn BATAK VOWEL SIGN KARO O + 7151 <= g && g <= 7153 || // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + 7212 <= g && g <= 7219 || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + 7222 <= g && g <= 7223 || // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + 7376 <= g && g <= 7378 || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + 7380 <= g && g <= 7392 || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + 7394 <= g && g <= 7400 || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + g == 7405 || // Mn VEDIC SIGN TIRYAK + g == 7412 || // Mn VEDIC TONE CANDRA ABOVE + 7416 <= g && g <= 7417 || // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + 7616 <= g && g <= 7673 || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW + 7675 <= g && g <= 7679 || // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + g == 8204 || // Cf ZERO WIDTH NON-JOINER + 8400 <= g && g <= 8412 || // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + 8413 <= g && g <= 8416 || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + g == 8417 || // Mn COMBINING LEFT RIGHT ARROW ABOVE + 8418 <= g && g <= 8420 || // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + 8421 <= g && g <= 8432 || // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + 11503 <= g && g <= 11505 || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + g == 11647 || // Mn TIFINAGH CONSONANT JOINER + 11744 <= g && g <= 11775 || // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + 12330 <= g && g <= 12333 || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + 12334 <= g && g <= 12335 || // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + 12441 <= g && g <= 12442 || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + g == 42607 || // Mn COMBINING CYRILLIC VZMET + 42608 <= g && g <= 42610 || // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + 42612 <= g && g <= 42621 || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + 42654 <= g && g <= 42655 || // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + 42736 <= g && g <= 42737 || // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + g == 43010 || // Mn SYLOTI NAGRI SIGN DVISVARA + g == 43014 || // Mn SYLOTI NAGRI SIGN HASANTA + g == 43019 || // Mn SYLOTI NAGRI SIGN ANUSVARA + 43045 <= g && g <= 43046 || // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + 43204 <= g && g <= 43205 || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + 43232 <= g && g <= 43249 || // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + 43302 <= g && g <= 43309 || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + 43335 <= g && g <= 43345 || // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + 43392 <= g && g <= 43394 || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + g == 43443 || // Mn JAVANESE SIGN CECAK TELU + 43446 <= g && g <= 43449 || // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + g == 43452 || // Mn JAVANESE VOWEL SIGN PEPET + g == 43493 || // Mn MYANMAR SIGN SHAN SAW + 43561 <= g && g <= 43566 || // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + 43569 <= g && g <= 43570 || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + 43573 <= g && g <= 43574 || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + g == 43587 || // Mn CHAM CONSONANT SIGN FINAL NG + g == 43596 || // Mn CHAM CONSONANT SIGN FINAL M + g == 43644 || // Mn MYANMAR SIGN TAI LAING TONE-2 + g == 43696 || // Mn TAI VIET MAI KANG + 43698 <= g && g <= 43700 || // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + 43703 <= g && g <= 43704 || // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + 43710 <= g && g <= 43711 || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + g == 43713 || // Mn TAI VIET TONE MAI THO + 43756 <= g && g <= 43757 || // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + g == 43766 || // Mn MEETEI MAYEK VIRAMA + g == 44005 || // Mn MEETEI MAYEK VOWEL SIGN ANAP + g == 44008 || // Mn MEETEI MAYEK VOWEL SIGN UNAP + g == 44013 || // Mn MEETEI MAYEK APUN IYEK + g == 64286 || // Mn HEBREW POINT JUDEO-SPANISH VARIKA + 65024 <= g && g <= 65039 || // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + 65056 <= g && g <= 65071 || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + 65438 <= g && g <= 65439 || // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + g == 66045 || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + g == 66272 || // Mn COPTIC EPACT THOUSANDS MARK + 66422 <= g && g <= 66426 || // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + 68097 <= g && g <= 68099 || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + 68101 <= g && g <= 68102 || // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + 68108 <= g && g <= 68111 || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + 68152 <= g && g <= 68154 || // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + g == 68159 || // Mn KHAROSHTHI VIRAMA + 68325 <= g && g <= 68326 || // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + g == 69633 || // Mn BRAHMI SIGN ANUSVARA + 69688 <= g && g <= 69702 || // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + 69759 <= g && g <= 69761 || // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + 69811 <= g && g <= 69814 || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + 69817 <= g && g <= 69818 || // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + 69888 <= g && g <= 69890 || // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + 69927 <= g && g <= 69931 || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + 69933 <= g && g <= 69940 || // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + g == 70003 || // Mn MAHAJANI SIGN NUKTA + 70016 <= g && g <= 70017 || // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + 70070 <= g && g <= 70078 || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + 70090 <= g && g <= 70092 || // Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK + 70191 <= g && g <= 70193 || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + g == 70196 || // Mn KHOJKI SIGN ANUSVARA + 70198 <= g && g <= 70199 || // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + g == 70206 || // Mn KHOJKI SIGN SUKUN + g == 70367 || // Mn KHUDAWADI SIGN ANUSVARA + 70371 <= g && g <= 70378 || // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + 70400 <= g && g <= 70401 || // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + g == 70460 || // Mn GRANTHA SIGN NUKTA + g == 70462 || // Mc GRANTHA VOWEL SIGN AA + g == 70464 || // Mn GRANTHA VOWEL SIGN II + g == 70487 || // Mc GRANTHA AU LENGTH MARK + 70502 <= g && g <= 70508 || // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + 70512 <= g && g <= 70516 || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + 70712 <= g && g <= 70719 || // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + 70722 <= g && g <= 70724 || // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + g == 70726 || // Mn NEWA SIGN NUKTA + g == 70832 || // Mc TIRHUTA VOWEL SIGN AA + 70835 <= g && g <= 70840 || // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + g == 70842 || // Mn TIRHUTA VOWEL SIGN SHORT E + g == 70845 || // Mc TIRHUTA VOWEL SIGN SHORT O + 70847 <= g && g <= 70848 || // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + 70850 <= g && g <= 70851 || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + g == 71087 || // Mc SIDDHAM VOWEL SIGN AA + 71090 <= g && g <= 71093 || // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + 71100 <= g && g <= 71101 || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + 71103 <= g && g <= 71104 || // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + 71132 <= g && g <= 71133 || // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + 71219 <= g && g <= 71226 || // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + g == 71229 || // Mn MODI SIGN ANUSVARA + 71231 <= g && g <= 71232 || // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + g == 71339 || // Mn TAKRI SIGN ANUSVARA + g == 71341 || // Mn TAKRI VOWEL SIGN AA + 71344 <= g && g <= 71349 || // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + g == 71351 || // Mn TAKRI SIGN NUKTA + 71453 <= g && g <= 71455 || // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + 71458 <= g && g <= 71461 || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + 71463 <= g && g <= 71467 || // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + 72193 <= g && g <= 72198 || // Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O + 72201 <= g && g <= 72202 || // Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK + 72243 <= g && g <= 72248 || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + 72251 <= g && g <= 72254 || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + g == 72263 || // Mn ZANABAZAR SQUARE SUBJOINER + 72273 <= g && g <= 72278 || // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + 72281 <= g && g <= 72283 || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + 72330 <= g && g <= 72342 || // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + 72344 <= g && g <= 72345 || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + 72752 <= g && g <= 72758 || // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + 72760 <= g && g <= 72765 || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + g == 72767 || // Mn BHAIKSUKI SIGN VIRAMA + 72850 <= g && g <= 72871 || // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + 72874 <= g && g <= 72880 || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + 72882 <= g && g <= 72883 || // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + 72885 <= g && g <= 72886 || // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + 73009 <= g && g <= 73014 || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + g == 73018 || // Mn MASARAM GONDI VOWEL SIGN E + 73020 <= g && g <= 73021 || // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + 73023 <= g && g <= 73029 || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + g == 73031 || // Mn MASARAM GONDI RA-KARA + 92912 <= g && g <= 92916 || // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + 92976 <= g && g <= 92982 || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + 94095 <= g && g <= 94098 || // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + 113821 <= g && g <= 113822 || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + g == 119141 || // Mc MUSICAL SYMBOL COMBINING STEM + 119143 <= g && g <= 119145 || // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + 119150 <= g && g <= 119154 || // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 + 119163 <= g && g <= 119170 || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + 119173 <= g && g <= 119179 || // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + 119210 <= g && g <= 119213 || // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + 119362 <= g && g <= 119364 || // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + 121344 <= g && g <= 121398 || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + 121403 <= g && g <= 121452 || // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + g == 121461 || // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + g == 121476 || // Mn SIGNWRITING LOCATION HEAD NECK + 121499 <= g && g <= 121503 || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + 121505 <= g && g <= 121519 || // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + 122880 <= g && g <= 122886 || // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + 122888 <= g && g <= 122904 || // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + 122907 <= g && g <= 122913 || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + 122915 <= g && g <= 122916 || // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + 122918 <= g && g <= 122922 || // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + 125136 <= g && g <= 125142 || // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + 125252 <= g && g <= 125258 || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + 917536 <= g && g <= 917631 || // Cf [96] TAG SPACE..CANCEL TAG + 917760 <= g && g <= 917999 ? o : 127462 <= g && g <= 127487 ? s : g == 2307 || // Mc DEVANAGARI SIGN VISARGA + g == 2363 || // Mc DEVANAGARI VOWEL SIGN OOE + 2366 <= g && g <= 2368 || // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + 2377 <= g && g <= 2380 || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + 2382 <= g && g <= 2383 || // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + 2434 <= g && g <= 2435 || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + 2495 <= g && g <= 2496 || // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II + 2503 <= g && g <= 2504 || // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + 2507 <= g && g <= 2508 || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + g == 2563 || // Mc GURMUKHI SIGN VISARGA + 2622 <= g && g <= 2624 || // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + g == 2691 || // Mc GUJARATI SIGN VISARGA + 2750 <= g && g <= 2752 || // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + g == 2761 || // Mc GUJARATI VOWEL SIGN CANDRA O + 2763 <= g && g <= 2764 || // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + 2818 <= g && g <= 2819 || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + g == 2880 || // Mc ORIYA VOWEL SIGN II + 2887 <= g && g <= 2888 || // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + 2891 <= g && g <= 2892 || // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + g == 3007 || // Mc TAMIL VOWEL SIGN I + 3009 <= g && g <= 3010 || // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + 3014 <= g && g <= 3016 || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + 3018 <= g && g <= 3020 || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + 3073 <= g && g <= 3075 || // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + 3137 <= g && g <= 3140 || // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + 3202 <= g && g <= 3203 || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + g == 3262 || // Mc KANNADA VOWEL SIGN AA + 3264 <= g && g <= 3265 || // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U + 3267 <= g && g <= 3268 || // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR + 3271 <= g && g <= 3272 || // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + 3274 <= g && g <= 3275 || // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + 3330 <= g && g <= 3331 || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + 3391 <= g && g <= 3392 || // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II + 3398 <= g && g <= 3400 || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + 3402 <= g && g <= 3404 || // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + 3458 <= g && g <= 3459 || // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + 3536 <= g && g <= 3537 || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + 3544 <= g && g <= 3550 || // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + 3570 <= g && g <= 3571 || // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + g == 3635 || // Lo THAI CHARACTER SARA AM + g == 3763 || // Lo LAO VOWEL SIGN AM + 3902 <= g && g <= 3903 || // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + g == 3967 || // Mc TIBETAN SIGN RNAM BCAD + g == 4145 || // Mc MYANMAR VOWEL SIGN E + 4155 <= g && g <= 4156 || // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + 4182 <= g && g <= 4183 || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + g == 4228 || // Mc MYANMAR VOWEL SIGN SHAN E + g == 6070 || // Mc KHMER VOWEL SIGN AA + 6078 <= g && g <= 6085 || // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + 6087 <= g && g <= 6088 || // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + 6435 <= g && g <= 6438 || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + 6441 <= g && g <= 6443 || // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + 6448 <= g && g <= 6449 || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + 6451 <= g && g <= 6456 || // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + 6681 <= g && g <= 6682 || // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + g == 6741 || // Mc TAI THAM CONSONANT SIGN MEDIAL RA + g == 6743 || // Mc TAI THAM CONSONANT SIGN LA TANG LAI + 6765 <= g && g <= 6770 || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + g == 6916 || // Mc BALINESE SIGN BISAH + g == 6965 || // Mc BALINESE VOWEL SIGN TEDUNG + g == 6971 || // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + 6973 <= g && g <= 6977 || // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + 6979 <= g && g <= 6980 || // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + g == 7042 || // Mc SUNDANESE SIGN PANGWISAD + g == 7073 || // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + 7078 <= g && g <= 7079 || // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + g == 7082 || // Mc SUNDANESE SIGN PAMAAEH + g == 7143 || // Mc BATAK VOWEL SIGN E + 7146 <= g && g <= 7148 || // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + g == 7150 || // Mc BATAK VOWEL SIGN U + 7154 <= g && g <= 7155 || // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + 7204 <= g && g <= 7211 || // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + 7220 <= g && g <= 7221 || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + g == 7393 || // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + 7410 <= g && g <= 7411 || // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA + g == 7415 || // Mc VEDIC SIGN ATIKRAMA + 43043 <= g && g <= 43044 || // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + g == 43047 || // Mc SYLOTI NAGRI VOWEL SIGN OO + 43136 <= g && g <= 43137 || // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + 43188 <= g && g <= 43203 || // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + 43346 <= g && g <= 43347 || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + g == 43395 || // Mc JAVANESE SIGN WIGNYAN + 43444 <= g && g <= 43445 || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + 43450 <= g && g <= 43451 || // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + 43453 <= g && g <= 43456 || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON + 43567 <= g && g <= 43568 || // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + 43571 <= g && g <= 43572 || // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + g == 43597 || // Mc CHAM CONSONANT SIGN FINAL H + g == 43755 || // Mc MEETEI MAYEK VOWEL SIGN II + 43758 <= g && g <= 43759 || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + g == 43765 || // Mc MEETEI MAYEK VOWEL SIGN VISARGA + 44003 <= g && g <= 44004 || // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + 44006 <= g && g <= 44007 || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + 44009 <= g && g <= 44010 || // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + g == 44012 || // Mc MEETEI MAYEK LUM IYEK + g == 69632 || // Mc BRAHMI SIGN CANDRABINDU + g == 69634 || // Mc BRAHMI SIGN VISARGA + g == 69762 || // Mc KAITHI SIGN VISARGA + 69808 <= g && g <= 69810 || // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + 69815 <= g && g <= 69816 || // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + g == 69932 || // Mc CHAKMA VOWEL SIGN E + g == 70018 || // Mc SHARADA SIGN VISARGA + 70067 <= g && g <= 70069 || // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + 70079 <= g && g <= 70080 || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + 70188 <= g && g <= 70190 || // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + 70194 <= g && g <= 70195 || // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + g == 70197 || // Mc KHOJKI SIGN VIRAMA + 70368 <= g && g <= 70370 || // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + 70402 <= g && g <= 70403 || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + g == 70463 || // Mc GRANTHA VOWEL SIGN I + 70465 <= g && g <= 70468 || // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + 70471 <= g && g <= 70472 || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + 70475 <= g && g <= 70477 || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + 70498 <= g && g <= 70499 || // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + 70709 <= g && g <= 70711 || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + 70720 <= g && g <= 70721 || // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + g == 70725 || // Mc NEWA SIGN VISARGA + 70833 <= g && g <= 70834 || // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II + g == 70841 || // Mc TIRHUTA VOWEL SIGN E + 70843 <= g && g <= 70844 || // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O + g == 70846 || // Mc TIRHUTA VOWEL SIGN AU + g == 70849 || // Mc TIRHUTA SIGN VISARGA + 71088 <= g && g <= 71089 || // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II + 71096 <= g && g <= 71099 || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + g == 71102 || // Mc SIDDHAM SIGN VISARGA + 71216 <= g && g <= 71218 || // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + 71227 <= g && g <= 71228 || // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + g == 71230 || // Mc MODI SIGN VISARGA + g == 71340 || // Mc TAKRI SIGN VISARGA + 71342 <= g && g <= 71343 || // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + g == 71350 || // Mc TAKRI SIGN VIRAMA + 71456 <= g && g <= 71457 || // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + g == 71462 || // Mc AHOM VOWEL SIGN E + 72199 <= g && g <= 72200 || // Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU + g == 72249 || // Mc ZANABAZAR SQUARE SIGN VISARGA + 72279 <= g && g <= 72280 || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + g == 72343 || // Mc SOYOMBO SIGN VISARGA + g == 72751 || // Mc BHAIKSUKI VOWEL SIGN AA + g == 72766 || // Mc BHAIKSUKI SIGN VISARGA + g == 72873 || // Mc MARCHEN SUBJOINED LETTER YA + g == 72881 || // Mc MARCHEN VOWEL SIGN I + g == 72884 || // Mc MARCHEN VOWEL SIGN O + 94033 <= g && g <= 94078 || // Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG + g == 119142 || // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + g == 119149 ? c : 4352 <= g && g <= 4447 || // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + 43360 <= g && g <= 43388 ? l : 4448 <= g && g <= 4519 || // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE + 55216 <= g && g <= 55238 ? d : 4520 <= g && g <= 4607 || // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN + 55243 <= g && g <= 55291 ? f : g == 44032 || // Lo HANGUL SYLLABLE GA + g == 44060 || // Lo HANGUL SYLLABLE GAE + g == 44088 || // Lo HANGUL SYLLABLE GYA + g == 44116 || // Lo HANGUL SYLLABLE GYAE + g == 44144 || // Lo HANGUL SYLLABLE GEO + g == 44172 || // Lo HANGUL SYLLABLE GE + g == 44200 || // Lo HANGUL SYLLABLE GYEO + g == 44228 || // Lo HANGUL SYLLABLE GYE + g == 44256 || // Lo HANGUL SYLLABLE GO + g == 44284 || // Lo HANGUL SYLLABLE GWA + g == 44312 || // Lo HANGUL SYLLABLE GWAE + g == 44340 || // Lo HANGUL SYLLABLE GOE + g == 44368 || // Lo HANGUL SYLLABLE GYO + g == 44396 || // Lo HANGUL SYLLABLE GU + g == 44424 || // Lo HANGUL SYLLABLE GWEO + g == 44452 || // Lo HANGUL SYLLABLE GWE + g == 44480 || // Lo HANGUL SYLLABLE GWI + g == 44508 || // Lo HANGUL SYLLABLE GYU + g == 44536 || // Lo HANGUL SYLLABLE GEU + g == 44564 || // Lo HANGUL SYLLABLE GYI + g == 44592 || // Lo HANGUL SYLLABLE GI + g == 44620 || // Lo HANGUL SYLLABLE GGA + g == 44648 || // Lo HANGUL SYLLABLE GGAE + g == 44676 || // Lo HANGUL SYLLABLE GGYA + g == 44704 || // Lo HANGUL SYLLABLE GGYAE + g == 44732 || // Lo HANGUL SYLLABLE GGEO + g == 44760 || // Lo HANGUL SYLLABLE GGE + g == 44788 || // Lo HANGUL SYLLABLE GGYEO + g == 44816 || // Lo HANGUL SYLLABLE GGYE + g == 44844 || // Lo HANGUL SYLLABLE GGO + g == 44872 || // Lo HANGUL SYLLABLE GGWA + g == 44900 || // Lo HANGUL SYLLABLE GGWAE + g == 44928 || // Lo HANGUL SYLLABLE GGOE + g == 44956 || // Lo HANGUL SYLLABLE GGYO + g == 44984 || // Lo HANGUL SYLLABLE GGU + g == 45012 || // Lo HANGUL SYLLABLE GGWEO + g == 45040 || // Lo HANGUL SYLLABLE GGWE + g == 45068 || // Lo HANGUL SYLLABLE GGWI + g == 45096 || // Lo HANGUL SYLLABLE GGYU + g == 45124 || // Lo HANGUL SYLLABLE GGEU + g == 45152 || // Lo HANGUL SYLLABLE GGYI + g == 45180 || // Lo HANGUL SYLLABLE GGI + g == 45208 || // Lo HANGUL SYLLABLE NA + g == 45236 || // Lo HANGUL SYLLABLE NAE + g == 45264 || // Lo HANGUL SYLLABLE NYA + g == 45292 || // Lo HANGUL SYLLABLE NYAE + g == 45320 || // Lo HANGUL SYLLABLE NEO + g == 45348 || // Lo HANGUL SYLLABLE NE + g == 45376 || // Lo HANGUL SYLLABLE NYEO + g == 45404 || // Lo HANGUL SYLLABLE NYE + g == 45432 || // Lo HANGUL SYLLABLE NO + g == 45460 || // Lo HANGUL SYLLABLE NWA + g == 45488 || // Lo HANGUL SYLLABLE NWAE + g == 45516 || // Lo HANGUL SYLLABLE NOE + g == 45544 || // Lo HANGUL SYLLABLE NYO + g == 45572 || // Lo HANGUL SYLLABLE NU + g == 45600 || // Lo HANGUL SYLLABLE NWEO + g == 45628 || // Lo HANGUL SYLLABLE NWE + g == 45656 || // Lo HANGUL SYLLABLE NWI + g == 45684 || // Lo HANGUL SYLLABLE NYU + g == 45712 || // Lo HANGUL SYLLABLE NEU + g == 45740 || // Lo HANGUL SYLLABLE NYI + g == 45768 || // Lo HANGUL SYLLABLE NI + g == 45796 || // Lo HANGUL SYLLABLE DA + g == 45824 || // Lo HANGUL SYLLABLE DAE + g == 45852 || // Lo HANGUL SYLLABLE DYA + g == 45880 || // Lo HANGUL SYLLABLE DYAE + g == 45908 || // Lo HANGUL SYLLABLE DEO + g == 45936 || // Lo HANGUL SYLLABLE DE + g == 45964 || // Lo HANGUL SYLLABLE DYEO + g == 45992 || // Lo HANGUL SYLLABLE DYE + g == 46020 || // Lo HANGUL SYLLABLE DO + g == 46048 || // Lo HANGUL SYLLABLE DWA + g == 46076 || // Lo HANGUL SYLLABLE DWAE + g == 46104 || // Lo HANGUL SYLLABLE DOE + g == 46132 || // Lo HANGUL SYLLABLE DYO + g == 46160 || // Lo HANGUL SYLLABLE DU + g == 46188 || // Lo HANGUL SYLLABLE DWEO + g == 46216 || // Lo HANGUL SYLLABLE DWE + g == 46244 || // Lo HANGUL SYLLABLE DWI + g == 46272 || // Lo HANGUL SYLLABLE DYU + g == 46300 || // Lo HANGUL SYLLABLE DEU + g == 46328 || // Lo HANGUL SYLLABLE DYI + g == 46356 || // Lo HANGUL SYLLABLE DI + g == 46384 || // Lo HANGUL SYLLABLE DDA + g == 46412 || // Lo HANGUL SYLLABLE DDAE + g == 46440 || // Lo HANGUL SYLLABLE DDYA + g == 46468 || // Lo HANGUL SYLLABLE DDYAE + g == 46496 || // Lo HANGUL SYLLABLE DDEO + g == 46524 || // Lo HANGUL SYLLABLE DDE + g == 46552 || // Lo HANGUL SYLLABLE DDYEO + g == 46580 || // Lo HANGUL SYLLABLE DDYE + g == 46608 || // Lo HANGUL SYLLABLE DDO + g == 46636 || // Lo HANGUL SYLLABLE DDWA + g == 46664 || // Lo HANGUL SYLLABLE DDWAE + g == 46692 || // Lo HANGUL SYLLABLE DDOE + g == 46720 || // Lo HANGUL SYLLABLE DDYO + g == 46748 || // Lo HANGUL SYLLABLE DDU + g == 46776 || // Lo HANGUL SYLLABLE DDWEO + g == 46804 || // Lo HANGUL SYLLABLE DDWE + g == 46832 || // Lo HANGUL SYLLABLE DDWI + g == 46860 || // Lo HANGUL SYLLABLE DDYU + g == 46888 || // Lo HANGUL SYLLABLE DDEU + g == 46916 || // Lo HANGUL SYLLABLE DDYI + g == 46944 || // Lo HANGUL SYLLABLE DDI + g == 46972 || // Lo HANGUL SYLLABLE RA + g == 47e3 || // Lo HANGUL SYLLABLE RAE + g == 47028 || // Lo HANGUL SYLLABLE RYA + g == 47056 || // Lo HANGUL SYLLABLE RYAE + g == 47084 || // Lo HANGUL SYLLABLE REO + g == 47112 || // Lo HANGUL SYLLABLE RE + g == 47140 || // Lo HANGUL SYLLABLE RYEO + g == 47168 || // Lo HANGUL SYLLABLE RYE + g == 47196 || // Lo HANGUL SYLLABLE RO + g == 47224 || // Lo HANGUL SYLLABLE RWA + g == 47252 || // Lo HANGUL SYLLABLE RWAE + g == 47280 || // Lo HANGUL SYLLABLE ROE + g == 47308 || // Lo HANGUL SYLLABLE RYO + g == 47336 || // Lo HANGUL SYLLABLE RU + g == 47364 || // Lo HANGUL SYLLABLE RWEO + g == 47392 || // Lo HANGUL SYLLABLE RWE + g == 47420 || // Lo HANGUL SYLLABLE RWI + g == 47448 || // Lo HANGUL SYLLABLE RYU + g == 47476 || // Lo HANGUL SYLLABLE REU + g == 47504 || // Lo HANGUL SYLLABLE RYI + g == 47532 || // Lo HANGUL SYLLABLE RI + g == 47560 || // Lo HANGUL SYLLABLE MA + g == 47588 || // Lo HANGUL SYLLABLE MAE + g == 47616 || // Lo HANGUL SYLLABLE MYA + g == 47644 || // Lo HANGUL SYLLABLE MYAE + g == 47672 || // Lo HANGUL SYLLABLE MEO + g == 47700 || // Lo HANGUL SYLLABLE ME + g == 47728 || // Lo HANGUL SYLLABLE MYEO + g == 47756 || // Lo HANGUL SYLLABLE MYE + g == 47784 || // Lo HANGUL SYLLABLE MO + g == 47812 || // Lo HANGUL SYLLABLE MWA + g == 47840 || // Lo HANGUL SYLLABLE MWAE + g == 47868 || // Lo HANGUL SYLLABLE MOE + g == 47896 || // Lo HANGUL SYLLABLE MYO + g == 47924 || // Lo HANGUL SYLLABLE MU + g == 47952 || // Lo HANGUL SYLLABLE MWEO + g == 47980 || // Lo HANGUL SYLLABLE MWE + g == 48008 || // Lo HANGUL SYLLABLE MWI + g == 48036 || // Lo HANGUL SYLLABLE MYU + g == 48064 || // Lo HANGUL SYLLABLE MEU + g == 48092 || // Lo HANGUL SYLLABLE MYI + g == 48120 || // Lo HANGUL SYLLABLE MI + g == 48148 || // Lo HANGUL SYLLABLE BA + g == 48176 || // Lo HANGUL SYLLABLE BAE + g == 48204 || // Lo HANGUL SYLLABLE BYA + g == 48232 || // Lo HANGUL SYLLABLE BYAE + g == 48260 || // Lo HANGUL SYLLABLE BEO + g == 48288 || // Lo HANGUL SYLLABLE BE + g == 48316 || // Lo HANGUL SYLLABLE BYEO + g == 48344 || // Lo HANGUL SYLLABLE BYE + g == 48372 || // Lo HANGUL SYLLABLE BO + g == 48400 || // Lo HANGUL SYLLABLE BWA + g == 48428 || // Lo HANGUL SYLLABLE BWAE + g == 48456 || // Lo HANGUL SYLLABLE BOE + g == 48484 || // Lo HANGUL SYLLABLE BYO + g == 48512 || // Lo HANGUL SYLLABLE BU + g == 48540 || // Lo HANGUL SYLLABLE BWEO + g == 48568 || // Lo HANGUL SYLLABLE BWE + g == 48596 || // Lo HANGUL SYLLABLE BWI + g == 48624 || // Lo HANGUL SYLLABLE BYU + g == 48652 || // Lo HANGUL SYLLABLE BEU + g == 48680 || // Lo HANGUL SYLLABLE BYI + g == 48708 || // Lo HANGUL SYLLABLE BI + g == 48736 || // Lo HANGUL SYLLABLE BBA + g == 48764 || // Lo HANGUL SYLLABLE BBAE + g == 48792 || // Lo HANGUL SYLLABLE BBYA + g == 48820 || // Lo HANGUL SYLLABLE BBYAE + g == 48848 || // Lo HANGUL SYLLABLE BBEO + g == 48876 || // Lo HANGUL SYLLABLE BBE + g == 48904 || // Lo HANGUL SYLLABLE BBYEO + g == 48932 || // Lo HANGUL SYLLABLE BBYE + g == 48960 || // Lo HANGUL SYLLABLE BBO + g == 48988 || // Lo HANGUL SYLLABLE BBWA + g == 49016 || // Lo HANGUL SYLLABLE BBWAE + g == 49044 || // Lo HANGUL SYLLABLE BBOE + g == 49072 || // Lo HANGUL SYLLABLE BBYO + g == 49100 || // Lo HANGUL SYLLABLE BBU + g == 49128 || // Lo HANGUL SYLLABLE BBWEO + g == 49156 || // Lo HANGUL SYLLABLE BBWE + g == 49184 || // Lo HANGUL SYLLABLE BBWI + g == 49212 || // Lo HANGUL SYLLABLE BBYU + g == 49240 || // Lo HANGUL SYLLABLE BBEU + g == 49268 || // Lo HANGUL SYLLABLE BBYI + g == 49296 || // Lo HANGUL SYLLABLE BBI + g == 49324 || // Lo HANGUL SYLLABLE SA + g == 49352 || // Lo HANGUL SYLLABLE SAE + g == 49380 || // Lo HANGUL SYLLABLE SYA + g == 49408 || // Lo HANGUL SYLLABLE SYAE + g == 49436 || // Lo HANGUL SYLLABLE SEO + g == 49464 || // Lo HANGUL SYLLABLE SE + g == 49492 || // Lo HANGUL SYLLABLE SYEO + g == 49520 || // Lo HANGUL SYLLABLE SYE + g == 49548 || // Lo HANGUL SYLLABLE SO + g == 49576 || // Lo HANGUL SYLLABLE SWA + g == 49604 || // Lo HANGUL SYLLABLE SWAE + g == 49632 || // Lo HANGUL SYLLABLE SOE + g == 49660 || // Lo HANGUL SYLLABLE SYO + g == 49688 || // Lo HANGUL SYLLABLE SU + g == 49716 || // Lo HANGUL SYLLABLE SWEO + g == 49744 || // Lo HANGUL SYLLABLE SWE + g == 49772 || // Lo HANGUL SYLLABLE SWI + g == 49800 || // Lo HANGUL SYLLABLE SYU + g == 49828 || // Lo HANGUL SYLLABLE SEU + g == 49856 || // Lo HANGUL SYLLABLE SYI + g == 49884 || // Lo HANGUL SYLLABLE SI + g == 49912 || // Lo HANGUL SYLLABLE SSA + g == 49940 || // Lo HANGUL SYLLABLE SSAE + g == 49968 || // Lo HANGUL SYLLABLE SSYA + g == 49996 || // Lo HANGUL SYLLABLE SSYAE + g == 50024 || // Lo HANGUL SYLLABLE SSEO + g == 50052 || // Lo HANGUL SYLLABLE SSE + g == 50080 || // Lo HANGUL SYLLABLE SSYEO + g == 50108 || // Lo HANGUL SYLLABLE SSYE + g == 50136 || // Lo HANGUL SYLLABLE SSO + g == 50164 || // Lo HANGUL SYLLABLE SSWA + g == 50192 || // Lo HANGUL SYLLABLE SSWAE + g == 50220 || // Lo HANGUL SYLLABLE SSOE + g == 50248 || // Lo HANGUL SYLLABLE SSYO + g == 50276 || // Lo HANGUL SYLLABLE SSU + g == 50304 || // Lo HANGUL SYLLABLE SSWEO + g == 50332 || // Lo HANGUL SYLLABLE SSWE + g == 50360 || // Lo HANGUL SYLLABLE SSWI + g == 50388 || // Lo HANGUL SYLLABLE SSYU + g == 50416 || // Lo HANGUL SYLLABLE SSEU + g == 50444 || // Lo HANGUL SYLLABLE SSYI + g == 50472 || // Lo HANGUL SYLLABLE SSI + g == 50500 || // Lo HANGUL SYLLABLE A + g == 50528 || // Lo HANGUL SYLLABLE AE + g == 50556 || // Lo HANGUL SYLLABLE YA + g == 50584 || // Lo HANGUL SYLLABLE YAE + g == 50612 || // Lo HANGUL SYLLABLE EO + g == 50640 || // Lo HANGUL SYLLABLE E + g == 50668 || // Lo HANGUL SYLLABLE YEO + g == 50696 || // Lo HANGUL SYLLABLE YE + g == 50724 || // Lo HANGUL SYLLABLE O + g == 50752 || // Lo HANGUL SYLLABLE WA + g == 50780 || // Lo HANGUL SYLLABLE WAE + g == 50808 || // Lo HANGUL SYLLABLE OE + g == 50836 || // Lo HANGUL SYLLABLE YO + g == 50864 || // Lo HANGUL SYLLABLE U + g == 50892 || // Lo HANGUL SYLLABLE WEO + g == 50920 || // Lo HANGUL SYLLABLE WE + g == 50948 || // Lo HANGUL SYLLABLE WI + g == 50976 || // Lo HANGUL SYLLABLE YU + g == 51004 || // Lo HANGUL SYLLABLE EU + g == 51032 || // Lo HANGUL SYLLABLE YI + g == 51060 || // Lo HANGUL SYLLABLE I + g == 51088 || // Lo HANGUL SYLLABLE JA + g == 51116 || // Lo HANGUL SYLLABLE JAE + g == 51144 || // Lo HANGUL SYLLABLE JYA + g == 51172 || // Lo HANGUL SYLLABLE JYAE + g == 51200 || // Lo HANGUL SYLLABLE JEO + g == 51228 || // Lo HANGUL SYLLABLE JE + g == 51256 || // Lo HANGUL SYLLABLE JYEO + g == 51284 || // Lo HANGUL SYLLABLE JYE + g == 51312 || // Lo HANGUL SYLLABLE JO + g == 51340 || // Lo HANGUL SYLLABLE JWA + g == 51368 || // Lo HANGUL SYLLABLE JWAE + g == 51396 || // Lo HANGUL SYLLABLE JOE + g == 51424 || // Lo HANGUL SYLLABLE JYO + g == 51452 || // Lo HANGUL SYLLABLE JU + g == 51480 || // Lo HANGUL SYLLABLE JWEO + g == 51508 || // Lo HANGUL SYLLABLE JWE + g == 51536 || // Lo HANGUL SYLLABLE JWI + g == 51564 || // Lo HANGUL SYLLABLE JYU + g == 51592 || // Lo HANGUL SYLLABLE JEU + g == 51620 || // Lo HANGUL SYLLABLE JYI + g == 51648 || // Lo HANGUL SYLLABLE JI + g == 51676 || // Lo HANGUL SYLLABLE JJA + g == 51704 || // Lo HANGUL SYLLABLE JJAE + g == 51732 || // Lo HANGUL SYLLABLE JJYA + g == 51760 || // Lo HANGUL SYLLABLE JJYAE + g == 51788 || // Lo HANGUL SYLLABLE JJEO + g == 51816 || // Lo HANGUL SYLLABLE JJE + g == 51844 || // Lo HANGUL SYLLABLE JJYEO + g == 51872 || // Lo HANGUL SYLLABLE JJYE + g == 51900 || // Lo HANGUL SYLLABLE JJO + g == 51928 || // Lo HANGUL SYLLABLE JJWA + g == 51956 || // Lo HANGUL SYLLABLE JJWAE + g == 51984 || // Lo HANGUL SYLLABLE JJOE + g == 52012 || // Lo HANGUL SYLLABLE JJYO + g == 52040 || // Lo HANGUL SYLLABLE JJU + g == 52068 || // Lo HANGUL SYLLABLE JJWEO + g == 52096 || // Lo HANGUL SYLLABLE JJWE + g == 52124 || // Lo HANGUL SYLLABLE JJWI + g == 52152 || // Lo HANGUL SYLLABLE JJYU + g == 52180 || // Lo HANGUL SYLLABLE JJEU + g == 52208 || // Lo HANGUL SYLLABLE JJYI + g == 52236 || // Lo HANGUL SYLLABLE JJI + g == 52264 || // Lo HANGUL SYLLABLE CA + g == 52292 || // Lo HANGUL SYLLABLE CAE + g == 52320 || // Lo HANGUL SYLLABLE CYA + g == 52348 || // Lo HANGUL SYLLABLE CYAE + g == 52376 || // Lo HANGUL SYLLABLE CEO + g == 52404 || // Lo HANGUL SYLLABLE CE + g == 52432 || // Lo HANGUL SYLLABLE CYEO + g == 52460 || // Lo HANGUL SYLLABLE CYE + g == 52488 || // Lo HANGUL SYLLABLE CO + g == 52516 || // Lo HANGUL SYLLABLE CWA + g == 52544 || // Lo HANGUL SYLLABLE CWAE + g == 52572 || // Lo HANGUL SYLLABLE COE + g == 52600 || // Lo HANGUL SYLLABLE CYO + g == 52628 || // Lo HANGUL SYLLABLE CU + g == 52656 || // Lo HANGUL SYLLABLE CWEO + g == 52684 || // Lo HANGUL SYLLABLE CWE + g == 52712 || // Lo HANGUL SYLLABLE CWI + g == 52740 || // Lo HANGUL SYLLABLE CYU + g == 52768 || // Lo HANGUL SYLLABLE CEU + g == 52796 || // Lo HANGUL SYLLABLE CYI + g == 52824 || // Lo HANGUL SYLLABLE CI + g == 52852 || // Lo HANGUL SYLLABLE KA + g == 52880 || // Lo HANGUL SYLLABLE KAE + g == 52908 || // Lo HANGUL SYLLABLE KYA + g == 52936 || // Lo HANGUL SYLLABLE KYAE + g == 52964 || // Lo HANGUL SYLLABLE KEO + g == 52992 || // Lo HANGUL SYLLABLE KE + g == 53020 || // Lo HANGUL SYLLABLE KYEO + g == 53048 || // Lo HANGUL SYLLABLE KYE + g == 53076 || // Lo HANGUL SYLLABLE KO + g == 53104 || // Lo HANGUL SYLLABLE KWA + g == 53132 || // Lo HANGUL SYLLABLE KWAE + g == 53160 || // Lo HANGUL SYLLABLE KOE + g == 53188 || // Lo HANGUL SYLLABLE KYO + g == 53216 || // Lo HANGUL SYLLABLE KU + g == 53244 || // Lo HANGUL SYLLABLE KWEO + g == 53272 || // Lo HANGUL SYLLABLE KWE + g == 53300 || // Lo HANGUL SYLLABLE KWI + g == 53328 || // Lo HANGUL SYLLABLE KYU + g == 53356 || // Lo HANGUL SYLLABLE KEU + g == 53384 || // Lo HANGUL SYLLABLE KYI + g == 53412 || // Lo HANGUL SYLLABLE KI + g == 53440 || // Lo HANGUL SYLLABLE TA + g == 53468 || // Lo HANGUL SYLLABLE TAE + g == 53496 || // Lo HANGUL SYLLABLE TYA + g == 53524 || // Lo HANGUL SYLLABLE TYAE + g == 53552 || // Lo HANGUL SYLLABLE TEO + g == 53580 || // Lo HANGUL SYLLABLE TE + g == 53608 || // Lo HANGUL SYLLABLE TYEO + g == 53636 || // Lo HANGUL SYLLABLE TYE + g == 53664 || // Lo HANGUL SYLLABLE TO + g == 53692 || // Lo HANGUL SYLLABLE TWA + g == 53720 || // Lo HANGUL SYLLABLE TWAE + g == 53748 || // Lo HANGUL SYLLABLE TOE + g == 53776 || // Lo HANGUL SYLLABLE TYO + g == 53804 || // Lo HANGUL SYLLABLE TU + g == 53832 || // Lo HANGUL SYLLABLE TWEO + g == 53860 || // Lo HANGUL SYLLABLE TWE + g == 53888 || // Lo HANGUL SYLLABLE TWI + g == 53916 || // Lo HANGUL SYLLABLE TYU + g == 53944 || // Lo HANGUL SYLLABLE TEU + g == 53972 || // Lo HANGUL SYLLABLE TYI + g == 54e3 || // Lo HANGUL SYLLABLE TI + g == 54028 || // Lo HANGUL SYLLABLE PA + g == 54056 || // Lo HANGUL SYLLABLE PAE + g == 54084 || // Lo HANGUL SYLLABLE PYA + g == 54112 || // Lo HANGUL SYLLABLE PYAE + g == 54140 || // Lo HANGUL SYLLABLE PEO + g == 54168 || // Lo HANGUL SYLLABLE PE + g == 54196 || // Lo HANGUL SYLLABLE PYEO + g == 54224 || // Lo HANGUL SYLLABLE PYE + g == 54252 || // Lo HANGUL SYLLABLE PO + g == 54280 || // Lo HANGUL SYLLABLE PWA + g == 54308 || // Lo HANGUL SYLLABLE PWAE + g == 54336 || // Lo HANGUL SYLLABLE POE + g == 54364 || // Lo HANGUL SYLLABLE PYO + g == 54392 || // Lo HANGUL SYLLABLE PU + g == 54420 || // Lo HANGUL SYLLABLE PWEO + g == 54448 || // Lo HANGUL SYLLABLE PWE + g == 54476 || // Lo HANGUL SYLLABLE PWI + g == 54504 || // Lo HANGUL SYLLABLE PYU + g == 54532 || // Lo HANGUL SYLLABLE PEU + g == 54560 || // Lo HANGUL SYLLABLE PYI + g == 54588 || // Lo HANGUL SYLLABLE PI + g == 54616 || // Lo HANGUL SYLLABLE HA + g == 54644 || // Lo HANGUL SYLLABLE HAE + g == 54672 || // Lo HANGUL SYLLABLE HYA + g == 54700 || // Lo HANGUL SYLLABLE HYAE + g == 54728 || // Lo HANGUL SYLLABLE HEO + g == 54756 || // Lo HANGUL SYLLABLE HE + g == 54784 || // Lo HANGUL SYLLABLE HYEO + g == 54812 || // Lo HANGUL SYLLABLE HYE + g == 54840 || // Lo HANGUL SYLLABLE HO + g == 54868 || // Lo HANGUL SYLLABLE HWA + g == 54896 || // Lo HANGUL SYLLABLE HWAE + g == 54924 || // Lo HANGUL SYLLABLE HOE + g == 54952 || // Lo HANGUL SYLLABLE HYO + g == 54980 || // Lo HANGUL SYLLABLE HU + g == 55008 || // Lo HANGUL SYLLABLE HWEO + g == 55036 || // Lo HANGUL SYLLABLE HWE + g == 55064 || // Lo HANGUL SYLLABLE HWI + g == 55092 || // Lo HANGUL SYLLABLE HYU + g == 55120 || // Lo HANGUL SYLLABLE HEU + g == 55148 || // Lo HANGUL SYLLABLE HYI + g == 55176 ? h : 44033 <= g && g <= 44059 || // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH + 44061 <= g && g <= 44087 || // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH + 44089 <= g && g <= 44115 || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH + 44117 <= g && g <= 44143 || // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH + 44145 <= g && g <= 44171 || // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH + 44173 <= g && g <= 44199 || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH + 44201 <= g && g <= 44227 || // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH + 44229 <= g && g <= 44255 || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH + 44257 <= g && g <= 44283 || // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH + 44285 <= g && g <= 44311 || // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH + 44313 <= g && g <= 44339 || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH + 44341 <= g && g <= 44367 || // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH + 44369 <= g && g <= 44395 || // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH + 44397 <= g && g <= 44423 || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH + 44425 <= g && g <= 44451 || // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH + 44453 <= g && g <= 44479 || // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH + 44481 <= g && g <= 44507 || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH + 44509 <= g && g <= 44535 || // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH + 44537 <= g && g <= 44563 || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH + 44565 <= g && g <= 44591 || // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH + 44593 <= g && g <= 44619 || // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH + 44621 <= g && g <= 44647 || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH + 44649 <= g && g <= 44675 || // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH + 44677 <= g && g <= 44703 || // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH + 44705 <= g && g <= 44731 || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH + 44733 <= g && g <= 44759 || // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH + 44761 <= g && g <= 44787 || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH + 44789 <= g && g <= 44815 || // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH + 44817 <= g && g <= 44843 || // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH + 44845 <= g && g <= 44871 || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH + 44873 <= g && g <= 44899 || // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH + 44901 <= g && g <= 44927 || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH + 44929 <= g && g <= 44955 || // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH + 44957 <= g && g <= 44983 || // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH + 44985 <= g && g <= 45011 || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH + 45013 <= g && g <= 45039 || // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH + 45041 <= g && g <= 45067 || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH + 45069 <= g && g <= 45095 || // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH + 45097 <= g && g <= 45123 || // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH + 45125 <= g && g <= 45151 || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH + 45153 <= g && g <= 45179 || // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH + 45181 <= g && g <= 45207 || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH + 45209 <= g && g <= 45235 || // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH + 45237 <= g && g <= 45263 || // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH + 45265 <= g && g <= 45291 || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH + 45293 <= g && g <= 45319 || // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH + 45321 <= g && g <= 45347 || // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH + 45349 <= g && g <= 45375 || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH + 45377 <= g && g <= 45403 || // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH + 45405 <= g && g <= 45431 || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH + 45433 <= g && g <= 45459 || // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH + 45461 <= g && g <= 45487 || // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH + 45489 <= g && g <= 45515 || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH + 45517 <= g && g <= 45543 || // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH + 45545 <= g && g <= 45571 || // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH + 45573 <= g && g <= 45599 || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH + 45601 <= g && g <= 45627 || // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH + 45629 <= g && g <= 45655 || // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH + 45657 <= g && g <= 45683 || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH + 45685 <= g && g <= 45711 || // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH + 45713 <= g && g <= 45739 || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH + 45741 <= g && g <= 45767 || // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH + 45769 <= g && g <= 45795 || // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH + 45797 <= g && g <= 45823 || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH + 45825 <= g && g <= 45851 || // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH + 45853 <= g && g <= 45879 || // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH + 45881 <= g && g <= 45907 || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH + 45909 <= g && g <= 45935 || // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH + 45937 <= g && g <= 45963 || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH + 45965 <= g && g <= 45991 || // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH + 45993 <= g && g <= 46019 || // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH + 46021 <= g && g <= 46047 || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH + 46049 <= g && g <= 46075 || // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH + 46077 <= g && g <= 46103 || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH + 46105 <= g && g <= 46131 || // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH + 46133 <= g && g <= 46159 || // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH + 46161 <= g && g <= 46187 || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH + 46189 <= g && g <= 46215 || // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH + 46217 <= g && g <= 46243 || // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH + 46245 <= g && g <= 46271 || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH + 46273 <= g && g <= 46299 || // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH + 46301 <= g && g <= 46327 || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH + 46329 <= g && g <= 46355 || // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH + 46357 <= g && g <= 46383 || // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH + 46385 <= g && g <= 46411 || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH + 46413 <= g && g <= 46439 || // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH + 46441 <= g && g <= 46467 || // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH + 46469 <= g && g <= 46495 || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH + 46497 <= g && g <= 46523 || // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH + 46525 <= g && g <= 46551 || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH + 46553 <= g && g <= 46579 || // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH + 46581 <= g && g <= 46607 || // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH + 46609 <= g && g <= 46635 || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH + 46637 <= g && g <= 46663 || // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH + 46665 <= g && g <= 46691 || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH + 46693 <= g && g <= 46719 || // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH + 46721 <= g && g <= 46747 || // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH + 46749 <= g && g <= 46775 || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH + 46777 <= g && g <= 46803 || // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH + 46805 <= g && g <= 46831 || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH + 46833 <= g && g <= 46859 || // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH + 46861 <= g && g <= 46887 || // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH + 46889 <= g && g <= 46915 || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH + 46917 <= g && g <= 46943 || // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH + 46945 <= g && g <= 46971 || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH + 46973 <= g && g <= 46999 || // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH + 47001 <= g && g <= 47027 || // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH + 47029 <= g && g <= 47055 || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH + 47057 <= g && g <= 47083 || // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH + 47085 <= g && g <= 47111 || // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH + 47113 <= g && g <= 47139 || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH + 47141 <= g && g <= 47167 || // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH + 47169 <= g && g <= 47195 || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH + 47197 <= g && g <= 47223 || // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH + 47225 <= g && g <= 47251 || // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH + 47253 <= g && g <= 47279 || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH + 47281 <= g && g <= 47307 || // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH + 47309 <= g && g <= 47335 || // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH + 47337 <= g && g <= 47363 || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH + 47365 <= g && g <= 47391 || // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH + 47393 <= g && g <= 47419 || // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH + 47421 <= g && g <= 47447 || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH + 47449 <= g && g <= 47475 || // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH + 47477 <= g && g <= 47503 || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH + 47505 <= g && g <= 47531 || // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH + 47533 <= g && g <= 47559 || // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH + 47561 <= g && g <= 47587 || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH + 47589 <= g && g <= 47615 || // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH + 47617 <= g && g <= 47643 || // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH + 47645 <= g && g <= 47671 || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH + 47673 <= g && g <= 47699 || // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH + 47701 <= g && g <= 47727 || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH + 47729 <= g && g <= 47755 || // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH + 47757 <= g && g <= 47783 || // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH + 47785 <= g && g <= 47811 || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH + 47813 <= g && g <= 47839 || // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH + 47841 <= g && g <= 47867 || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH + 47869 <= g && g <= 47895 || // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH + 47897 <= g && g <= 47923 || // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH + 47925 <= g && g <= 47951 || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH + 47953 <= g && g <= 47979 || // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH + 47981 <= g && g <= 48007 || // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH + 48009 <= g && g <= 48035 || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH + 48037 <= g && g <= 48063 || // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH + 48065 <= g && g <= 48091 || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH + 48093 <= g && g <= 48119 || // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH + 48121 <= g && g <= 48147 || // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH + 48149 <= g && g <= 48175 || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH + 48177 <= g && g <= 48203 || // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH + 48205 <= g && g <= 48231 || // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH + 48233 <= g && g <= 48259 || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH + 48261 <= g && g <= 48287 || // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH + 48289 <= g && g <= 48315 || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH + 48317 <= g && g <= 48343 || // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH + 48345 <= g && g <= 48371 || // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH + 48373 <= g && g <= 48399 || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH + 48401 <= g && g <= 48427 || // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH + 48429 <= g && g <= 48455 || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH + 48457 <= g && g <= 48483 || // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH + 48485 <= g && g <= 48511 || // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH + 48513 <= g && g <= 48539 || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH + 48541 <= g && g <= 48567 || // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH + 48569 <= g && g <= 48595 || // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH + 48597 <= g && g <= 48623 || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH + 48625 <= g && g <= 48651 || // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH + 48653 <= g && g <= 48679 || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH + 48681 <= g && g <= 48707 || // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH + 48709 <= g && g <= 48735 || // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH + 48737 <= g && g <= 48763 || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH + 48765 <= g && g <= 48791 || // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH + 48793 <= g && g <= 48819 || // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH + 48821 <= g && g <= 48847 || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH + 48849 <= g && g <= 48875 || // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH + 48877 <= g && g <= 48903 || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH + 48905 <= g && g <= 48931 || // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH + 48933 <= g && g <= 48959 || // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH + 48961 <= g && g <= 48987 || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH + 48989 <= g && g <= 49015 || // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH + 49017 <= g && g <= 49043 || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH + 49045 <= g && g <= 49071 || // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH + 49073 <= g && g <= 49099 || // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH + 49101 <= g && g <= 49127 || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH + 49129 <= g && g <= 49155 || // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH + 49157 <= g && g <= 49183 || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH + 49185 <= g && g <= 49211 || // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH + 49213 <= g && g <= 49239 || // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH + 49241 <= g && g <= 49267 || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH + 49269 <= g && g <= 49295 || // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH + 49297 <= g && g <= 49323 || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH + 49325 <= g && g <= 49351 || // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH + 49353 <= g && g <= 49379 || // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH + 49381 <= g && g <= 49407 || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH + 49409 <= g && g <= 49435 || // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH + 49437 <= g && g <= 49463 || // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH + 49465 <= g && g <= 49491 || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH + 49493 <= g && g <= 49519 || // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH + 49521 <= g && g <= 49547 || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH + 49549 <= g && g <= 49575 || // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH + 49577 <= g && g <= 49603 || // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH + 49605 <= g && g <= 49631 || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH + 49633 <= g && g <= 49659 || // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH + 49661 <= g && g <= 49687 || // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH + 49689 <= g && g <= 49715 || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH + 49717 <= g && g <= 49743 || // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH + 49745 <= g && g <= 49771 || // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH + 49773 <= g && g <= 49799 || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH + 49801 <= g && g <= 49827 || // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH + 49829 <= g && g <= 49855 || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH + 49857 <= g && g <= 49883 || // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH + 49885 <= g && g <= 49911 || // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH + 49913 <= g && g <= 49939 || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH + 49941 <= g && g <= 49967 || // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH + 49969 <= g && g <= 49995 || // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH + 49997 <= g && g <= 50023 || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH + 50025 <= g && g <= 50051 || // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH + 50053 <= g && g <= 50079 || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH + 50081 <= g && g <= 50107 || // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH + 50109 <= g && g <= 50135 || // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH + 50137 <= g && g <= 50163 || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH + 50165 <= g && g <= 50191 || // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH + 50193 <= g && g <= 50219 || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH + 50221 <= g && g <= 50247 || // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH + 50249 <= g && g <= 50275 || // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH + 50277 <= g && g <= 50303 || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH + 50305 <= g && g <= 50331 || // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH + 50333 <= g && g <= 50359 || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH + 50361 <= g && g <= 50387 || // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH + 50389 <= g && g <= 50415 || // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH + 50417 <= g && g <= 50443 || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH + 50445 <= g && g <= 50471 || // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH + 50473 <= g && g <= 50499 || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH + 50501 <= g && g <= 50527 || // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH + 50529 <= g && g <= 50555 || // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH + 50557 <= g && g <= 50583 || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH + 50585 <= g && g <= 50611 || // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH + 50613 <= g && g <= 50639 || // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH + 50641 <= g && g <= 50667 || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH + 50669 <= g && g <= 50695 || // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH + 50697 <= g && g <= 50723 || // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH + 50725 <= g && g <= 50751 || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH + 50753 <= g && g <= 50779 || // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH + 50781 <= g && g <= 50807 || // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH + 50809 <= g && g <= 50835 || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH + 50837 <= g && g <= 50863 || // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH + 50865 <= g && g <= 50891 || // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH + 50893 <= g && g <= 50919 || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH + 50921 <= g && g <= 50947 || // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH + 50949 <= g && g <= 50975 || // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH + 50977 <= g && g <= 51003 || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH + 51005 <= g && g <= 51031 || // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH + 51033 <= g && g <= 51059 || // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH + 51061 <= g && g <= 51087 || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH + 51089 <= g && g <= 51115 || // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH + 51117 <= g && g <= 51143 || // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH + 51145 <= g && g <= 51171 || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH + 51173 <= g && g <= 51199 || // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH + 51201 <= g && g <= 51227 || // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH + 51229 <= g && g <= 51255 || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH + 51257 <= g && g <= 51283 || // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH + 51285 <= g && g <= 51311 || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH + 51313 <= g && g <= 51339 || // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH + 51341 <= g && g <= 51367 || // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH + 51369 <= g && g <= 51395 || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH + 51397 <= g && g <= 51423 || // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH + 51425 <= g && g <= 51451 || // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH + 51453 <= g && g <= 51479 || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH + 51481 <= g && g <= 51507 || // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH + 51509 <= g && g <= 51535 || // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH + 51537 <= g && g <= 51563 || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH + 51565 <= g && g <= 51591 || // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH + 51593 <= g && g <= 51619 || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH + 51621 <= g && g <= 51647 || // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH + 51649 <= g && g <= 51675 || // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH + 51677 <= g && g <= 51703 || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH + 51705 <= g && g <= 51731 || // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH + 51733 <= g && g <= 51759 || // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH + 51761 <= g && g <= 51787 || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH + 51789 <= g && g <= 51815 || // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH + 51817 <= g && g <= 51843 || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH + 51845 <= g && g <= 51871 || // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH + 51873 <= g && g <= 51899 || // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH + 51901 <= g && g <= 51927 || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH + 51929 <= g && g <= 51955 || // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH + 51957 <= g && g <= 51983 || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH + 51985 <= g && g <= 52011 || // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH + 52013 <= g && g <= 52039 || // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH + 52041 <= g && g <= 52067 || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH + 52069 <= g && g <= 52095 || // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH + 52097 <= g && g <= 52123 || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH + 52125 <= g && g <= 52151 || // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH + 52153 <= g && g <= 52179 || // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH + 52181 <= g && g <= 52207 || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH + 52209 <= g && g <= 52235 || // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH + 52237 <= g && g <= 52263 || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH + 52265 <= g && g <= 52291 || // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH + 52293 <= g && g <= 52319 || // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH + 52321 <= g && g <= 52347 || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH + 52349 <= g && g <= 52375 || // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH + 52377 <= g && g <= 52403 || // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH + 52405 <= g && g <= 52431 || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH + 52433 <= g && g <= 52459 || // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH + 52461 <= g && g <= 52487 || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH + 52489 <= g && g <= 52515 || // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH + 52517 <= g && g <= 52543 || // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH + 52545 <= g && g <= 52571 || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH + 52573 <= g && g <= 52599 || // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH + 52601 <= g && g <= 52627 || // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH + 52629 <= g && g <= 52655 || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH + 52657 <= g && g <= 52683 || // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH + 52685 <= g && g <= 52711 || // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH + 52713 <= g && g <= 52739 || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH + 52741 <= g && g <= 52767 || // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH + 52769 <= g && g <= 52795 || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH + 52797 <= g && g <= 52823 || // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH + 52825 <= g && g <= 52851 || // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH + 52853 <= g && g <= 52879 || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH + 52881 <= g && g <= 52907 || // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH + 52909 <= g && g <= 52935 || // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH + 52937 <= g && g <= 52963 || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH + 52965 <= g && g <= 52991 || // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH + 52993 <= g && g <= 53019 || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH + 53021 <= g && g <= 53047 || // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH + 53049 <= g && g <= 53075 || // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH + 53077 <= g && g <= 53103 || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH + 53105 <= g && g <= 53131 || // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH + 53133 <= g && g <= 53159 || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH + 53161 <= g && g <= 53187 || // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH + 53189 <= g && g <= 53215 || // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH + 53217 <= g && g <= 53243 || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH + 53245 <= g && g <= 53271 || // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH + 53273 <= g && g <= 53299 || // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH + 53301 <= g && g <= 53327 || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH + 53329 <= g && g <= 53355 || // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH + 53357 <= g && g <= 53383 || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH + 53385 <= g && g <= 53411 || // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH + 53413 <= g && g <= 53439 || // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH + 53441 <= g && g <= 53467 || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH + 53469 <= g && g <= 53495 || // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH + 53497 <= g && g <= 53523 || // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH + 53525 <= g && g <= 53551 || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH + 53553 <= g && g <= 53579 || // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH + 53581 <= g && g <= 53607 || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH + 53609 <= g && g <= 53635 || // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH + 53637 <= g && g <= 53663 || // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH + 53665 <= g && g <= 53691 || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH + 53693 <= g && g <= 53719 || // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH + 53721 <= g && g <= 53747 || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH + 53749 <= g && g <= 53775 || // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH + 53777 <= g && g <= 53803 || // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH + 53805 <= g && g <= 53831 || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH + 53833 <= g && g <= 53859 || // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH + 53861 <= g && g <= 53887 || // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH + 53889 <= g && g <= 53915 || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH + 53917 <= g && g <= 53943 || // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH + 53945 <= g && g <= 53971 || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH + 53973 <= g && g <= 53999 || // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH + 54001 <= g && g <= 54027 || // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH + 54029 <= g && g <= 54055 || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH + 54057 <= g && g <= 54083 || // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH + 54085 <= g && g <= 54111 || // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH + 54113 <= g && g <= 54139 || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH + 54141 <= g && g <= 54167 || // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH + 54169 <= g && g <= 54195 || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH + 54197 <= g && g <= 54223 || // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH + 54225 <= g && g <= 54251 || // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH + 54253 <= g && g <= 54279 || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH + 54281 <= g && g <= 54307 || // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH + 54309 <= g && g <= 54335 || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH + 54337 <= g && g <= 54363 || // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH + 54365 <= g && g <= 54391 || // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH + 54393 <= g && g <= 54419 || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH + 54421 <= g && g <= 54447 || // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH + 54449 <= g && g <= 54475 || // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH + 54477 <= g && g <= 54503 || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH + 54505 <= g && g <= 54531 || // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH + 54533 <= g && g <= 54559 || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH + 54561 <= g && g <= 54587 || // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH + 54589 <= g && g <= 54615 || // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH + 54617 <= g && g <= 54643 || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH + 54645 <= g && g <= 54671 || // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH + 54673 <= g && g <= 54699 || // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH + 54701 <= g && g <= 54727 || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH + 54729 <= g && g <= 54755 || // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH + 54757 <= g && g <= 54783 || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH + 54785 <= g && g <= 54811 || // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH + 54813 <= g && g <= 54839 || // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH + 54841 <= g && g <= 54867 || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH + 54869 <= g && g <= 54895 || // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH + 54897 <= g && g <= 54923 || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH + 54925 <= g && g <= 54951 || // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH + 54953 <= g && g <= 54979 || // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH + 54981 <= g && g <= 55007 || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH + 55009 <= g && g <= 55035 || // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH + 55037 <= g && g <= 55063 || // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH + 55065 <= g && g <= 55091 || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH + 55093 <= g && g <= 55119 || // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH + 55121 <= g && g <= 55147 || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH + 55149 <= g && g <= 55175 || // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH + 55177 <= g && g <= 55203 ? p : g == 9757 || // So WHITE UP POINTING INDEX + g == 9977 || // So PERSON WITH BALL + 9994 <= g && g <= 9997 || // So [4] RAISED FIST..WRITING HAND + g == 127877 || // So FATHER CHRISTMAS + 127938 <= g && g <= 127940 || // So [3] SNOWBOARDER..SURFER + g == 127943 || // So HORSE RACING + 127946 <= g && g <= 127948 || // So [3] SWIMMER..GOLFER + 128066 <= g && g <= 128067 || // So [2] EAR..NOSE + 128070 <= g && g <= 128080 || // So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN + g == 128110 || // So POLICE OFFICER + 128112 <= g && g <= 128120 || // So [9] BRIDE WITH VEIL..PRINCESS + g == 128124 || // So BABY ANGEL + 128129 <= g && g <= 128131 || // So [3] INFORMATION DESK PERSON..DANCER + 128133 <= g && g <= 128135 || // So [3] NAIL POLISH..HAIRCUT + g == 128170 || // So FLEXED BICEPS + 128372 <= g && g <= 128373 || // So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY + g == 128378 || // So MAN DANCING + g == 128400 || // So RAISED HAND WITH FINGERS SPLAYED + 128405 <= g && g <= 128406 || // So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS + 128581 <= g && g <= 128583 || // So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY + 128587 <= g && g <= 128591 || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS + g == 128675 || // So ROWBOAT + 128692 <= g && g <= 128694 || // So [3] BICYCLIST..PEDESTRIAN + g == 128704 || // So BATH + g == 128716 || // So SLEEPING ACCOMMODATION + 129304 <= g && g <= 129308 || // So [5] SIGN OF THE HORNS..RIGHT-FACING FIST + 129310 <= g && g <= 129311 || // So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN + g == 129318 || // So FACE PALM + 129328 <= g && g <= 129337 || // So [10] PREGNANT WOMAN..JUGGLING + 129341 <= g && g <= 129342 || // So [2] WATER POLO..HANDBALL + 129489 <= g && g <= 129501 ? y : 127995 <= g && g <= 127999 ? C : g == 8205 ? T : g == 9792 || // So FEMALE SIGN + g == 9794 || // So MALE SIGN + 9877 <= g && g <= 9878 || // So [2] STAFF OF AESCULAPIUS..SCALES + g == 9992 || // So AIRPLANE + g == 10084 || // So HEAVY BLACK HEART + g == 127752 || // So RAINBOW + g == 127806 || // So EAR OF RICE + g == 127859 || // So COOKING + g == 127891 || // So GRADUATION CAP + g == 127908 || // So MICROPHONE + g == 127912 || // So ARTIST PALETTE + g == 127979 || // So SCHOOL + g == 127981 || // So FACTORY + g == 128139 || // So KISS MARK + 128187 <= g && g <= 128188 || // So [2] PERSONAL COMPUTER..BRIEFCASE + g == 128295 || // So WRENCH + g == 128300 || // So MICROSCOPE + g == 128488 || // So LEFT SPEECH BUBBLE + g == 128640 || // So ROCKET + g == 128658 ? x : 128102 <= g && g <= 128105 ? b : m; + } + return this; + } + e.exports && (e.exports = t); +})(graphemeSplitter); +var graphemeSplitterExports = graphemeSplitter.exports; +const GraphemeSplitter = /* @__PURE__ */ getDefaultExportFromCjs(graphemeSplitterExports); +function Glyph() { + this.textureInfo = void 0, this.dimensions = void 0, this.billboard = void 0; +} +function GlyphTextureInfo(e, t, n) { + this.labelCollection = e, this.index = t, this.dimensions = n; +} +const defaultLineSpacingPercent = 1.2, whitePixelCanvasId = "ID_WHITE_PIXEL", whitePixelSize = new Cartesian2(4, 4), whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); +function addWhitePixelCanvas(e) { + const t = document.createElement("canvas"); + t.width = whitePixelSize.x, t.height = whitePixelSize.y; + const n = t.getContext("2d"); + return n.fillStyle = "#fff", n.fillRect(0, 0, t.width, t.height), e.addImage(whitePixelCanvasId, t); +} +const writeTextToCanvasParameters = {}; +function createGlyphCanvas(e, t, n, i, r, o, s) { + return writeTextToCanvasParameters.font = t, writeTextToCanvasParameters.fillColor = n, writeTextToCanvasParameters.strokeColor = i, writeTextToCanvasParameters.strokeWidth = r, writeTextToCanvasParameters.padding = SDFSettings$1.PADDING, s === VerticalOrigin$1.CENTER ? writeTextToCanvasParameters.textBaseline = "middle" : s === VerticalOrigin$1.TOP ? writeTextToCanvasParameters.textBaseline = "top" : writeTextToCanvasParameters.textBaseline = "bottom", writeTextToCanvasParameters.fill = o === LabelStyle$1.FILL || o === LabelStyle$1.FILL_AND_OUTLINE, writeTextToCanvasParameters.stroke = o === LabelStyle$1.OUTLINE || o === LabelStyle$1.FILL_AND_OUTLINE, writeTextToCanvasParameters.backgroundColor = Color.BLACK, writeTextToCanvas(e, writeTextToCanvasParameters); +} +function unbindGlyph(e, t) { + t.textureInfo = void 0, t.dimensions = void 0; + const n = t.billboard; + defined(n) && (n.show = !1, n.image = void 0, defined(n._removeCallbackFunc) && (n._removeCallbackFunc(), n._removeCallbackFunc = void 0), e._spareBillboards.push(n), t.billboard = void 0); +} +function addGlyphToTextureAtlas(e, t, n, i) { + i.index = e.addImageSync(t, n); +} +const splitter = new GraphemeSplitter(); +function rebindAllGlyphs(e, t) { + const n = t._renderedText, i = splitter.splitGraphemes(n), r = i.length, o = t._glyphs, s = o.length; + let c, l, d; + if (t._relativeSize = t._fontSize / SDFSettings$1.FONT_SIZE, r < s) + for (l = r; l < s; ++l) + unbindGlyph(e, o[l]); + o.length = r; + const f = t.show && t._showBackground && n.split(` +`).join("").length > 0; + let h = t._backgroundBillboard; + const p = e._backgroundBillboardCollection; + f ? (defined(h) || (h = p.add({ + collection: e, + image: whitePixelCanvasId, + imageSubRegion: whitePixelBoundingRegion + }), t._backgroundBillboard = h), h.color = t._backgroundColor, h.show = t._show, h.position = t._position, h.eyeOffset = t._eyeOffset, h.pixelOffset = t._pixelOffset, h.horizontalOrigin = HorizontalOrigin$1.LEFT, h.verticalOrigin = t._verticalOrigin, h.heightReference = t._heightReference, h.scale = t.totalScale, h.pickPrimitive = t, h.id = t._id, h.translucencyByDistance = t._translucencyByDistance, h.pixelOffsetScaleByDistance = t._pixelOffsetScaleByDistance, h.scaleByDistance = t._scaleByDistance, h.distanceDisplayCondition = t._distanceDisplayCondition, h.disableDepthTestDistance = t._disableDepthTestDistance, h.clusterShow = t.clusterShow) : defined(h) && (p.remove(h), t._backgroundBillboard = h = void 0); + const m = e._glyphTextureCache; + for (d = 0; d < r; ++d) { + const _ = i[d], y = t._verticalOrigin, C = JSON.stringify([ + _, + t._fontFamily, + t._fontStyle, + t._fontWeight, + +y + ]); + let T = m[C]; + if (!defined(T)) { + const x = `${t._fontStyle} ${t._fontWeight} ${SDFSettings$1.FONT_SIZE}px ${t._fontFamily}`, b = createGlyphCanvas( + _, + x, + Color.WHITE, + Color.WHITE, + 0, + LabelStyle$1.FILL, + y + ); + if (T = new GlyphTextureInfo( + e, + -1, + b.dimensions + ), m[C] = T, b.width > 0 && b.height > 0) { + const S = bitmapSDF(b, { + cutoff: SDFSettings$1.CUTOFF, + radius: SDFSettings$1.RADIUS + }), E = b.getContext("2d"), A = b.width, D = b.height, P = E.getImageData(0, 0, A, D); + for (let I = 0; I < A; I++) + for (let M = 0; M < D; M++) { + const R = M * A + I, L = S[R] * 255, g = R * 4; + P.data[g + 0] = L, P.data[g + 1] = L, P.data[g + 2] = L, P.data[g + 3] = L; + } + E.putImageData(P, 0, 0), _ !== " " && addGlyphToTextureAtlas( + e._textureAtlas, + C, + b, + T + ); + } + } + if (c = o[d], defined(c) ? T.index === -1 ? unbindGlyph(e, c) : defined(c.textureInfo) && (c.textureInfo = void 0) : (c = new Glyph(), o[d] = c), c.textureInfo = T, c.dimensions = T.dimensions, T.index !== -1) { + let x = c.billboard; + const b = e._spareBillboards; + defined(x) || (b.length > 0 ? x = b.pop() : (x = e._billboardCollection.add({ + collection: e + }), x._labelDimensions = new Cartesian2(), x._labelTranslate = new Cartesian2()), c.billboard = x), x.show = t._show, x.position = t._position, x.eyeOffset = t._eyeOffset, x.pixelOffset = t._pixelOffset, x.horizontalOrigin = HorizontalOrigin$1.LEFT, x.verticalOrigin = t._verticalOrigin, x.heightReference = t._heightReference, x.scale = t.totalScale, x.pickPrimitive = t, x.id = t._id, x.image = C, x.translucencyByDistance = t._translucencyByDistance, x.pixelOffsetScaleByDistance = t._pixelOffsetScaleByDistance, x.scaleByDistance = t._scaleByDistance, x.distanceDisplayCondition = t._distanceDisplayCondition, x.disableDepthTestDistance = t._disableDepthTestDistance, x._batchIndex = t._batchIndex, x.outlineColor = t.outlineColor, t.style === LabelStyle$1.FILL_AND_OUTLINE ? (x.color = t._fillColor, x.outlineWidth = t.outlineWidth) : t.style === LabelStyle$1.FILL ? (x.color = t._fillColor, x.outlineWidth = 0) : t.style === LabelStyle$1.OUTLINE && (x.color = Color.TRANSPARENT, x.outlineWidth = t.outlineWidth); + } + } + t._repositionAllGlyphs = !0; +} +function calculateWidthOffset(e, t, n) { + return t === HorizontalOrigin$1.CENTER ? -e / 2 : t === HorizontalOrigin$1.RIGHT ? -(e + n.x) : n.x; +} +const glyphPixelOffset = new Cartesian2(), scratchBackgroundPadding = new Cartesian2(); +function repositionAllGlyphs(e) { + const t = e._glyphs, n = e._renderedText; + let i, r, o = 0, s = 0; + const c = []; + let l = Number.NEGATIVE_INFINITY, d = 0, f = 1, h; + const p = t.length, m = e._backgroundBillboard, _ = Cartesian2.clone( + defined(m) ? e._backgroundPadding : Cartesian2.ZERO, + scratchBackgroundPadding + ); + for (_.x /= e._relativeSize, _.y /= e._relativeSize, h = 0; h < p; ++h) + n.charAt(h) === ` +` ? (c.push(o), ++f, o = 0) : (i = t[h], r = i.dimensions, d = Math.max(d, r.height - r.descent), l = Math.max(l, r.descent), o += r.width - r.minx, h < p - 1 && (o += t[h + 1].dimensions.minx), s = Math.max(s, o)); + c.push(o); + const y = d + l, C = e.totalScale, T = e._horizontalOrigin, x = e._verticalOrigin; + let b = 0, S = c[b], E = calculateWidthOffset( + S, + T, + _ + ); + const A = (defined(e._lineHeight) ? e._lineHeight : defaultLineSpacingPercent * e._fontSize) / e._relativeSize, D = A * (f - 1); + let P = s, I = y + D; + defined(m) && (P += _.x * 2, I += _.y * 2, m._labelHorizontalOrigin = T), glyphPixelOffset.x = E * C, glyphPixelOffset.y = 0; + let M = !0, R = 0; + for (h = 0; h < p; ++h) + if (n.charAt(h) === ` +`) + ++b, R += A, S = c[b], E = calculateWidthOffset( + S, + T, + _ + ), glyphPixelOffset.x = E * C, M = !0; + else if (i = t[h], r = i.dimensions, x === VerticalOrigin$1.TOP ? (glyphPixelOffset.y = r.height - d - _.y, glyphPixelOffset.y += SDFSettings$1.PADDING) : x === VerticalOrigin$1.CENTER ? glyphPixelOffset.y = (D + r.height - d) / 2 : x === VerticalOrigin$1.BASELINE ? (glyphPixelOffset.y = D, glyphPixelOffset.y -= SDFSettings$1.PADDING) : (glyphPixelOffset.y = D + l + _.y, glyphPixelOffset.y -= SDFSettings$1.PADDING), glyphPixelOffset.y = (glyphPixelOffset.y - r.descent - R) * C, M && (glyphPixelOffset.x -= SDFSettings$1.PADDING * C, M = !1), defined(i.billboard) && (i.billboard._setTranslate(glyphPixelOffset), i.billboard._labelDimensions.x = P, i.billboard._labelDimensions.y = I, i.billboard._labelHorizontalOrigin = T), h < p - 1) { + const L = t[h + 1]; + glyphPixelOffset.x += (r.width - r.minx + L.dimensions.minx) * C; + } + if (defined(m) && n.split(` +`).join("").length > 0 && (T === HorizontalOrigin$1.CENTER ? E = -s / 2 - _.x : T === HorizontalOrigin$1.RIGHT ? E = -(s + _.x * 2) : E = 0, glyphPixelOffset.x = E * C, x === VerticalOrigin$1.TOP ? glyphPixelOffset.y = y - d - l : x === VerticalOrigin$1.CENTER ? glyphPixelOffset.y = (y - d) / 2 - l : x === VerticalOrigin$1.BASELINE ? glyphPixelOffset.y = -_.y - l : glyphPixelOffset.y = 0, glyphPixelOffset.y = glyphPixelOffset.y * C, m.width = P, m.height = I, m._setTranslate(glyphPixelOffset), m._labelTranslate = Cartesian2.clone( + glyphPixelOffset, + m._labelTranslate + )), isHeightReferenceClamp(e.heightReference)) + for (h = 0; h < p; ++h) { + i = t[h]; + const L = i.billboard; + defined(L) && (L._labelTranslate = Cartesian2.clone( + glyphPixelOffset, + L._labelTranslate + )); + } +} +function destroyLabel(e, t) { + const n = t._glyphs; + for (let i = 0, r = n.length; i < r; ++i) + unbindGlyph(e, n[i]); + defined(t._backgroundBillboard) && (e._backgroundBillboardCollection.remove( + t._backgroundBillboard + ), t._backgroundBillboard = void 0), t._labelCollection = void 0, defined(t._removeCallbackFunc) && t._removeCallbackFunc(), destroyObject(t); +} +function LabelCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._scene = e.scene, this._batchTable = e.batchTable, this._textureAtlas = void 0, this._backgroundTextureAtlas = void 0, this._backgroundBillboardCollection = new BillboardCollection({ + scene: this._scene + }), this._backgroundBillboardCollection.destroyTextureAtlas = !1, this._billboardCollection = new BillboardCollection({ + scene: this._scene, + batchTable: this._batchTable + }), this._billboardCollection.destroyTextureAtlas = !1, this._billboardCollection._sdf = !0, this._spareBillboards = [], this._glyphTextureCache = {}, this._labels = [], this._labelsToUpdate = [], this._totalGlyphCount = 0, this._highlightColor = Color.clone(Color.WHITE), this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.blendOption = defaultValue( + e.blendOption, + BlendOption$1.OPAQUE_AND_TRANSLUCENT + ); +} +Object.defineProperties(LabelCollection.prototype, { + /** + * Returns the number of labels in this collection. This is commonly used with + * {@link LabelCollection#get} to iterate over all the labels + * in the collection. + * @memberof LabelCollection.prototype + * @type {number} + */ + length: { + get: function() { + return this._labels.length; + } + } +}); +LabelCollection.prototype.add = function(e) { + const t = new Label(e, this); + return this._labels.push(t), this._labelsToUpdate.push(t), t; +}; +LabelCollection.prototype.remove = function(e) { + if (defined(e) && e._labelCollection === this) { + const t = this._labels.indexOf(e); + if (t !== -1) + return this._labels.splice(t, 1), destroyLabel(this, e), !0; + } + return !1; +}; +LabelCollection.prototype.removeAll = function() { + const e = this._labels; + for (let t = 0, n = e.length; t < n; ++t) + destroyLabel(this, e[t]); + e.length = 0; +}; +LabelCollection.prototype.contains = function(e) { + return defined(e) && e._labelCollection === this; +}; +LabelCollection.prototype.get = function(e) { + return this._labels[e]; +}; +LabelCollection.prototype.update = function(e) { + if (!this.show) + return; + const t = this._billboardCollection, n = this._backgroundBillboardCollection; + t.modelMatrix = this.modelMatrix, t.debugShowBoundingVolume = this.debugShowBoundingVolume, n.modelMatrix = this.modelMatrix, n.debugShowBoundingVolume = this.debugShowBoundingVolume; + const i = e.context; + defined(this._textureAtlas) || (this._textureAtlas = new TextureAtlas({ + context: i + }), t.textureAtlas = this._textureAtlas), defined(this._backgroundTextureAtlas) || (this._backgroundTextureAtlas = new TextureAtlas({ + context: i, + initialSize: whitePixelSize + }), n.textureAtlas = this._backgroundTextureAtlas, addWhitePixelCanvas(this._backgroundTextureAtlas)); + const r = this._labelsToUpdate.length; + for (let s = 0; s < r; ++s) { + const c = this._labelsToUpdate[s]; + if (c.isDestroyed()) + continue; + const l = c._glyphs.length; + c._rebindAllGlyphs && (rebindAllGlyphs(this, c), c._rebindAllGlyphs = !1), c._repositionAllGlyphs && (repositionAllGlyphs(c), c._repositionAllGlyphs = !1); + const d = c._glyphs.length - l; + this._totalGlyphCount += d; + } + const o = n.length > 0 ? BlendOption$1.TRANSLUCENT : this.blendOption; + t.blendOption = o, n.blendOption = o, t._highlightColor = this._highlightColor, n._highlightColor = this._highlightColor, this._labelsToUpdate.length = 0, n.update(e), t.update(e); +}; +LabelCollection.prototype.isDestroyed = function() { + return !1; +}; +LabelCollection.prototype.destroy = function() { + return this.removeAll(), this._billboardCollection = this._billboardCollection.destroy(), this._textureAtlas = this._textureAtlas && this._textureAtlas.destroy(), this._backgroundBillboardCollection = this._backgroundBillboardCollection.destroy(), this._backgroundTextureAtlas = this._backgroundTextureAtlas && this._backgroundTextureAtlas.destroy(), destroyObject(this); +}; +const PolylineVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec3 position2DHigh; +in vec3 position2DLow; +in vec3 prevPosition3DHigh; +in vec3 prevPosition3DLow; +in vec3 prevPosition2DHigh; +in vec3 prevPosition2DLow; +in vec3 nextPosition3DHigh; +in vec3 nextPosition3DLow; +in vec3 nextPosition2DHigh; +in vec3 nextPosition2DLow; +in vec4 texCoordExpandAndBatchIndex; + +out vec2 v_st; +out float v_width; +out vec4 v_pickColor; +out float v_polylineAngle; + +void main() +{ + float texCoord = texCoordExpandAndBatchIndex.x; + float expandDir = texCoordExpandAndBatchIndex.y; + bool usePrev = texCoordExpandAndBatchIndex.z < 0.0; + float batchTableIndex = texCoordExpandAndBatchIndex.w; + + vec2 widthAndShow = batchTable_getWidthAndShow(batchTableIndex); + float width = widthAndShow.x + 0.5; + float show = widthAndShow.y; + + if (width < 1.0) + { + show = 0.0; + } + + vec4 pickColor = batchTable_getPickColor(batchTableIndex); + + vec4 p, prev, next; + if (czm_morphTime == 1.0) + { + p = czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz); + prev = czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz); + next = czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz); + } + else if (czm_morphTime == 0.0) + { + p = czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); + prev = czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy); + next = czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy); + } + else + { + p = czm_columbusViewMorph( + czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy), + czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz), + czm_morphTime); + prev = czm_columbusViewMorph( + czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy), + czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz), + czm_morphTime); + next = czm_columbusViewMorph( + czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy), + czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz), + czm_morphTime); + } + + #ifdef DISTANCE_DISPLAY_CONDITION + vec3 centerHigh = batchTable_getCenterHigh(batchTableIndex); + vec4 centerLowAndRadius = batchTable_getCenterLowAndRadius(batchTableIndex); + vec3 centerLow = centerLowAndRadius.xyz; + float radius = centerLowAndRadius.w; + vec2 distanceDisplayCondition = batchTable_getDistanceDisplayCondition(batchTableIndex); + + float lengthSq; + if (czm_sceneMode == czm_sceneMode2D) + { + lengthSq = czm_eyeHeight2D.y; + } + else + { + vec4 center = czm_translateRelativeToEye(centerHigh.xyz, centerLow.xyz); + lengthSq = max(0.0, dot(center.xyz, center.xyz) - radius * radius); + } + + float nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x; + float farSq = distanceDisplayCondition.y * distanceDisplayCondition.y; + if (lengthSq < nearSq || lengthSq > farSq) + { + show = 0.0; + } + #endif + + float polylineAngle; + vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, polylineAngle); + gl_Position = czm_viewportOrthographic * positionWC * show; + + v_st.s = texCoord; + v_st.t = czm_writeNonPerspective(clamp(expandDir, 0.0, 1.0), gl_Position.w); + + v_width = width; + v_pickColor = pickColor; + v_polylineAngle = polylineAngle; +} +`, PolylinePipeline = {}; +PolylinePipeline.numberOfPoints = function(e, t, n) { + const i = Cartesian3.distance(e, t); + return Math.ceil(i / n); +}; +PolylinePipeline.numberOfPointsRhumbLine = function(e, t, n) { + const i = Math.pow(e.longitude - t.longitude, 2) + Math.pow(e.latitude - t.latitude, 2); + return Math.max( + 1, + Math.ceil(Math.sqrt(i / (n * n))) + ); +}; +const cartoScratch$1 = new Cartographic(); +PolylinePipeline.extractHeights = function(e, t) { + const n = e.length, i = new Array(n); + for (let r = 0; r < n; r++) { + const o = e[r]; + i[r] = t.cartesianToCartographic(o, cartoScratch$1).height; + } + return i; +}; +const wrapLongitudeInversMatrix = new Matrix4(), wrapLongitudeOrigin = new Cartesian3(), wrapLongitudeXZNormal = new Cartesian3(), wrapLongitudeXZPlane = new Plane(Cartesian3.UNIT_X, 0), wrapLongitudeYZNormal = new Cartesian3(), wrapLongitudeYZPlane = new Plane(Cartesian3.UNIT_X, 0), wrapLongitudeIntersection = new Cartesian3(), wrapLongitudeOffset = new Cartesian3(), subdivideHeightsScratchArray = []; +function subdivideHeights$1(e, t, n) { + const i = subdivideHeightsScratchArray; + i.length = e; + let r; + if (t === n) { + for (r = 0; r < e; r++) + i[r] = t; + return i; + } + const s = (n - t) / e; + for (r = 0; r < e; r++) { + const c = t + r * s; + i[r] = c; + } + return i; +} +const carto1 = new Cartographic(), carto2 = new Cartographic(), cartesian = new Cartesian3(), scaleFirst = new Cartesian3(), scaleLast = new Cartesian3(), ellipsoidGeodesic = new EllipsoidGeodesic(); +let ellipsoidRhumb = new EllipsoidRhumbLine(); +function generateCartesianArc(e, t, n, i, r, o, s, c) { + const l = i.scaleToGeodeticSurface(e, scaleFirst), d = i.scaleToGeodeticSurface(t, scaleLast), f = PolylinePipeline.numberOfPoints(e, t, n), h = i.cartesianToCartographic(l, carto1), p = i.cartesianToCartographic(d, carto2), m = subdivideHeights$1(f, r, o); + ellipsoidGeodesic.setEndPoints(h, p); + const _ = ellipsoidGeodesic.surfaceDistance / f; + let y = c; + h.height = r; + let C = i.cartographicToCartesian(h, cartesian); + Cartesian3.pack(C, s, y), y += 3; + for (let T = 1; T < f; T++) { + const x = ellipsoidGeodesic.interpolateUsingSurfaceDistance( + T * _, + carto2 + ); + x.height = m[T], C = i.cartographicToCartesian(x, cartesian), Cartesian3.pack(C, s, y), y += 3; + } + return y; +} +function generateCartesianRhumbArc(e, t, n, i, r, o, s, c) { + const l = i.cartesianToCartographic(e, carto1), d = i.cartesianToCartographic(t, carto2), f = PolylinePipeline.numberOfPointsRhumbLine( + l, + d, + n + ); + l.height = 0, d.height = 0; + const h = subdivideHeights$1(f, r, o); + ellipsoidRhumb.ellipsoid.equals(i) || (ellipsoidRhumb = new EllipsoidRhumbLine(void 0, void 0, i)), ellipsoidRhumb.setEndPoints(l, d); + const p = ellipsoidRhumb.surfaceDistance / f; + let m = c; + l.height = r; + let _ = i.cartographicToCartesian(l, cartesian); + Cartesian3.pack(_, s, m), m += 3; + for (let y = 1; y < f; y++) { + const C = ellipsoidRhumb.interpolateUsingSurfaceDistance( + y * p, + carto2 + ); + C.height = h[y], _ = i.cartographicToCartesian(C, cartesian), Cartesian3.pack(_, s, m), m += 3; + } + return m; +} +PolylinePipeline.wrapLongitude = function(e, t) { + const n = [], i = []; + if (defined(e) && e.length > 0) { + t = defaultValue(t, Matrix4.IDENTITY); + const r = Matrix4.inverseTransformation( + t, + wrapLongitudeInversMatrix + ), o = Matrix4.multiplyByPoint( + r, + Cartesian3.ZERO, + wrapLongitudeOrigin + ), s = Cartesian3.normalize( + Matrix4.multiplyByPointAsVector( + r, + Cartesian3.UNIT_Y, + wrapLongitudeXZNormal + ), + wrapLongitudeXZNormal + ), c = Plane.fromPointNormal( + o, + s, + wrapLongitudeXZPlane + ), l = Cartesian3.normalize( + Matrix4.multiplyByPointAsVector( + r, + Cartesian3.UNIT_X, + wrapLongitudeYZNormal + ), + wrapLongitudeYZNormal + ), d = Plane.fromPointNormal( + o, + l, + wrapLongitudeYZPlane + ); + let f = 1; + n.push(Cartesian3.clone(e[0])); + let h = n[0]; + const p = e.length; + for (let m = 1; m < p; ++m) { + const _ = e[m]; + if (Plane.getPointDistance(d, h) < 0 || Plane.getPointDistance(d, _) < 0) { + const y = IntersectionTests.lineSegmentPlane( + h, + _, + c, + wrapLongitudeIntersection + ); + if (defined(y)) { + const C = Cartesian3.multiplyByScalar( + s, + 5e-9, + wrapLongitudeOffset + ); + Plane.getPointDistance(c, h) < 0 && Cartesian3.negate(C, C), n.push( + Cartesian3.add(y, C, new Cartesian3()) + ), i.push(f + 1), Cartesian3.negate(C, C), n.push( + Cartesian3.add(y, C, new Cartesian3()) + ), f = 1; + } + } + n.push(Cartesian3.clone(e[m])), f++, h = _; + } + i.push(f); + } + return { + positions: n, + lengths: i + }; +}; +PolylinePipeline.generateArc = function(e) { + defined(e) || (e = {}); + const t = e.positions, n = t.length, i = defaultValue(e.ellipsoid, Ellipsoid.default); + let r = defaultValue(e.height, 0); + const o = Array.isArray(r); + if (n < 1) + return []; + if (n === 1) { + const y = i.scaleToGeodeticSurface(t[0], scaleFirst); + if (r = o ? r[0] : r, r !== 0) { + const C = i.geodeticSurfaceNormal(y, cartesian); + Cartesian3.multiplyByScalar(C, r, C), Cartesian3.add(y, C, y); + } + return [y.x, y.y, y.z]; + } + let s = e.minDistance; + if (!defined(s)) { + const y = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ); + s = CesiumMath.chordLength(y, i.maximumRadius); + } + let c = 0, l; + for (l = 0; l < n - 1; l++) + c += PolylinePipeline.numberOfPoints( + t[l], + t[l + 1], + s + ); + const d = (c + 1) * 3, f = new Array(d); + let h = 0; + for (l = 0; l < n - 1; l++) { + const y = t[l], C = t[l + 1], T = o ? r[l] : r, x = o ? r[l + 1] : r; + h = generateCartesianArc( + y, + C, + s, + i, + T, + x, + f, + h + ); + } + subdivideHeightsScratchArray.length = 0; + const p = t[n - 1], m = i.cartesianToCartographic(p, carto1); + m.height = o ? r[n - 1] : r; + const _ = i.cartographicToCartesian(m, cartesian); + return Cartesian3.pack(_, f, d - 3), f; +}; +const scratchCartographic0 = new Cartographic(), scratchCartographic1$1 = new Cartographic(); +PolylinePipeline.generateRhumbArc = function(e) { + defined(e) || (e = {}); + const t = e.positions, n = t.length, i = defaultValue(e.ellipsoid, Ellipsoid.default); + let r = defaultValue(e.height, 0); + const o = Array.isArray(r); + if (n < 1) + return []; + if (n === 1) { + const T = i.scaleToGeodeticSurface(t[0], scaleFirst); + if (r = o ? r[0] : r, r !== 0) { + const x = i.geodeticSurfaceNormal(T, cartesian); + Cartesian3.multiplyByScalar(x, r, x), Cartesian3.add(T, x, T); + } + return [T.x, T.y, T.z]; + } + const s = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ); + let c = 0, l, d = i.cartesianToCartographic( + t[0], + scratchCartographic0 + ), f; + for (l = 0; l < n - 1; l++) + f = i.cartesianToCartographic( + t[l + 1], + scratchCartographic1$1 + ), c += PolylinePipeline.numberOfPointsRhumbLine(d, f, s), d = Cartographic.clone(f, scratchCartographic0); + const h = (c + 1) * 3, p = new Array(h); + let m = 0; + for (l = 0; l < n - 1; l++) { + const T = t[l], x = t[l + 1], b = o ? r[l] : r, S = o ? r[l + 1] : r; + m = generateCartesianRhumbArc( + T, + x, + s, + i, + b, + S, + p, + m + ); + } + subdivideHeightsScratchArray.length = 0; + const _ = t[n - 1], y = i.cartesianToCartographic(_, carto1); + y.height = o ? r[n - 1] : r; + const C = i.cartographicToCartesian(y, cartesian); + return Cartesian3.pack(C, p, h - 3), p; +}; +PolylinePipeline.generateCartesianArc = function(e) { + const t = PolylinePipeline.generateArc(e), n = t.length / 3, i = new Array(n); + for (let r = 0; r < n; r++) + i[r] = Cartesian3.unpack(t, r * 3); + return i; +}; +PolylinePipeline.generateCartesianRhumbArc = function(e) { + const t = PolylinePipeline.generateRhumbArc(e), n = t.length / 3, i = new Array(n); + for (let r = 0; r < n; r++) + i[r] = Cartesian3.unpack(t, r * 3); + return i; +}; +function Polyline(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._show = defaultValue(e.show, !0), this._width = defaultValue(e.width, 1), this._loop = defaultValue(e.loop, !1), this._distanceDisplayCondition = e.distanceDisplayCondition, this._material = e.material, defined(this._material) || (this._material = Material$4.fromType(Material$4.ColorType, { + color: new Color(1, 1, 1, 1) + })); + let n = e.positions; + defined(n) || (n = []), this._positions = n, this._actualPositions = arrayRemoveDuplicates( + n, + Cartesian3.equalsEpsilon + ), this._loop && this._actualPositions.length > 2 && (this._actualPositions === this._positions && (this._actualPositions = n.slice()), this._actualPositions.push(Cartesian3.clone(this._actualPositions[0]))), this._length = this._actualPositions.length, this._id = e.id; + let i; + defined(t) && (i = Matrix4.clone(t.modelMatrix)), this._modelMatrix = i, this._segments = PolylinePipeline.wrapLongitude( + this._actualPositions, + i + ), this._actualLength = void 0, this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES$3), this._polylineCollection = t, this._dirty = !1, this._pickId = void 0, this._boundingVolume = BoundingSphere.fromPoints(this._actualPositions), this._boundingVolumeWC = BoundingSphere.transform( + this._boundingVolume, + this._modelMatrix + ), this._boundingVolume2D = new BoundingSphere(); +} +const POSITION_INDEX$5 = Polyline.POSITION_INDEX = 0, SHOW_INDEX$5 = Polyline.SHOW_INDEX = 1, WIDTH_INDEX$1 = Polyline.WIDTH_INDEX = 2, MATERIAL_INDEX$1 = Polyline.MATERIAL_INDEX = 3, POSITION_SIZE_INDEX$1 = Polyline.POSITION_SIZE_INDEX = 4, DISTANCE_DISPLAY_CONDITION$1 = Polyline.DISTANCE_DISPLAY_CONDITION = 5, NUMBER_OF_PROPERTIES$3 = Polyline.NUMBER_OF_PROPERTIES = 6; +function makeDirty$2(e, t) { + ++e._propertiesChanged[t]; + const n = e._polylineCollection; + defined(n) && (n._updatePolyline(e, t), e._dirty = !0); +} +Object.defineProperties(Polyline.prototype, { + /** + * Determines if this polyline will be shown. Use this to hide or show a polyline, instead + * of removing it and re-adding it to the collection. + * @memberof Polyline.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + e !== this._show && (this._show = e, makeDirty$2(this, SHOW_INDEX$5)); + } + }, + /** + * Gets or sets the positions of the polyline. + * @memberof Polyline.prototype + * @type {Cartesian3[]} + * @example + * polyline.positions = Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 10.0, 0.0, + * 0.0, 20.0 + * ]); + */ + positions: { + get: function() { + return this._positions; + }, + set: function(e) { + let t = arrayRemoveDuplicates(e, Cartesian3.equalsEpsilon); + this._loop && t.length > 2 && (t === e && (t = e.slice()), t.push(Cartesian3.clone(t[0]))), (this._actualPositions.length !== t.length || this._actualPositions.length !== this._length) && makeDirty$2(this, POSITION_SIZE_INDEX$1), this._positions = e, this._actualPositions = t, this._length = t.length, this._boundingVolume = BoundingSphere.fromPoints( + this._actualPositions, + this._boundingVolume + ), this._boundingVolumeWC = BoundingSphere.transform( + this._boundingVolume, + this._modelMatrix, + this._boundingVolumeWC + ), makeDirty$2(this, POSITION_INDEX$5), this.update(); + } + }, + /** + * Gets or sets the surface appearance of the polyline. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + * @memberof Polyline.prototype + * @type {Material} + */ + material: { + get: function() { + return this._material; + }, + set: function(e) { + this._material !== e && (this._material = e, makeDirty$2(this, MATERIAL_INDEX$1)); + } + }, + /** + * Gets or sets the width of the polyline. + * @memberof Polyline.prototype + * @type {number} + */ + width: { + get: function() { + return this._width; + }, + set: function(e) { + const t = this._width; + e !== t && (this._width = e, makeDirty$2(this, WIDTH_INDEX$1)); + } + }, + /** + * Gets or sets whether a line segment will be added between the first and last polyline positions. + * @memberof Polyline.prototype + * @type {boolean} + */ + loop: { + get: function() { + return this._loop; + }, + set: function(e) { + if (e !== this._loop) { + let t = this._actualPositions; + e ? t.length > 2 && !Cartesian3.equals(t[0], t[t.length - 1]) && (t.length === this._positions.length && (this._actualPositions = t = this._positions.slice()), t.push(Cartesian3.clone(t[0]))) : t.length > 2 && Cartesian3.equals(t[0], t[t.length - 1]) && (t.length - 1 === this._positions.length ? this._actualPositions = this._positions : t.pop()), this._loop = e, makeDirty$2(this, POSITION_SIZE_INDEX$1); + } + } + }, + /** + * Gets or sets the user-defined value returned when the polyline is picked. + * @memberof Polyline.prototype + * @type {*} + */ + id: { + get: function() { + return this._id; + }, + set: function(e) { + this._id = e, defined(this._pickId) && (this._pickId.object.id = e); + } + }, + /** + * @private + */ + pickId: { + get: function() { + return this._pickId; + } + }, + /** + * Gets the destruction status of this polyline + * @memberof Polyline.prototype + * @type {boolean} + * @default false + * @private + */ + isDestroyed: { + get: function() { + return !defined(this._polylineCollection); + } + }, + /** + * Gets or sets the condition specifying at what distance from the camera that this polyline will be displayed. + * @memberof Polyline.prototype + * @type {DistanceDisplayCondition} + * @default undefined + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + DistanceDisplayCondition.equals(e, this._distanceDisplayCondition) || (this._distanceDisplayCondition = DistanceDisplayCondition.clone( + e, + this._distanceDisplayCondition + ), makeDirty$2(this, DISTANCE_DISPLAY_CONDITION$1)); + } + } +}); +Polyline.prototype.update = function() { + let e = Matrix4.IDENTITY; + defined(this._polylineCollection) && (e = this._polylineCollection.modelMatrix); + const t = this._segments.positions.length, n = this._segments.lengths, i = this._propertiesChanged[POSITION_INDEX$5] > 0 || this._propertiesChanged[POSITION_SIZE_INDEX$1] > 0; + if ((!Matrix4.equals(e, this._modelMatrix) || i) && (this._segments = PolylinePipeline.wrapLongitude( + this._actualPositions, + e + ), this._boundingVolumeWC = BoundingSphere.transform( + this._boundingVolume, + e, + this._boundingVolumeWC + )), this._modelMatrix = Matrix4.clone(e, this._modelMatrix), this._segments.positions.length !== t) + makeDirty$2(this, POSITION_SIZE_INDEX$1); + else { + const r = n.length; + for (let o = 0; o < r; ++o) + if (n[o] !== this._segments.lengths[o]) { + makeDirty$2(this, POSITION_SIZE_INDEX$1); + break; + } + } +}; +Polyline.prototype.getPickId = function(e) { + return defined(this._pickId) || (this._pickId = e.createPickId({ + primitive: this, + collection: this._polylineCollection, + id: this._id + })), this._pickId; +}; +Polyline.prototype._clean = function() { + this._dirty = !1; + const e = this._propertiesChanged; + for (let t = 0; t < NUMBER_OF_PROPERTIES$3 - 1; ++t) + e[t] = 0; +}; +Polyline.prototype._destroy = function() { + this._pickId = this._pickId && this._pickId.destroy(), this._material = this._material && this._material.destroy(), this._polylineCollection = void 0; +}; +const SHOW_INDEX$4 = Polyline.SHOW_INDEX, WIDTH_INDEX = Polyline.WIDTH_INDEX, POSITION_INDEX$4 = Polyline.POSITION_INDEX, MATERIAL_INDEX = Polyline.MATERIAL_INDEX, POSITION_SIZE_INDEX = Polyline.POSITION_SIZE_INDEX, DISTANCE_DISPLAY_CONDITION = Polyline.DISTANCE_DISPLAY_CONDITION, NUMBER_OF_PROPERTIES$2 = Polyline.NUMBER_OF_PROPERTIES, attributeLocations$5 = { + texCoordExpandAndBatchIndex: 0, + position3DHigh: 1, + position3DLow: 2, + position2DHigh: 3, + position2DLow: 4, + prevPosition3DHigh: 5, + prevPosition3DLow: 6, + prevPosition2DHigh: 7, + prevPosition2DLow: 8, + nextPosition3DHigh: 9, + nextPosition3DLow: 10, + nextPosition2DHigh: 11, + nextPosition2DLow: 12 +}; +function PolylineCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this._opaqueRS = void 0, this._translucentRS = void 0, this._colorCommands = [], this._polylinesUpdated = !1, this._polylinesRemoved = !1, this._createVertexArray = !1, this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES$2), this._polylines = [], this._polylineBuckets = {}, this._positionBufferUsage = { + bufferUsage: BufferUsage$1.STATIC_DRAW, + frameCount: 0 + }, this._mode = void 0, this._polylinesToUpdate = [], this._vertexArrays = [], this._positionBuffer = void 0, this._texCoordExpandAndBatchIndexBuffer = void 0, this._batchTable = void 0, this._createBatchTable = !1, this._useHighlightColor = !1, this._highlightColor = Color.clone(Color.WHITE); + const t = this; + this._uniformMap = { + u_highlightColor: function() { + return t._highlightColor; + } + }; +} +Object.defineProperties(PolylineCollection.prototype, { + /** + * Returns the number of polylines in this collection. This is commonly used with + * {@link PolylineCollection#get} to iterate over all the polylines + * in the collection. + * @memberof PolylineCollection.prototype + * @type {number} + */ + length: { + get: function() { + return removePolylines(this), this._polylines.length; + } + } +}); +PolylineCollection.prototype.add = function(e) { + const t = new Polyline(e, this); + return t._index = this._polylines.length, this._polylines.push(t), this._createVertexArray = !0, this._createBatchTable = !0, t; +}; +PolylineCollection.prototype.remove = function(e) { + if (this.contains(e)) { + if (this._polylinesRemoved = !0, this._createVertexArray = !0, this._createBatchTable = !0, defined(e._bucket)) { + const t = e._bucket; + t.shaderProgram = t.shaderProgram && t.shaderProgram.destroy(); + } + return e._destroy(), !0; + } + return !1; +}; +PolylineCollection.prototype.removeAll = function() { + releaseShaders(this), destroyPolylines(this), this._polylineBuckets = {}, this._polylinesRemoved = !1, this._polylines.length = 0, this._polylinesToUpdate.length = 0, this._createVertexArray = !0; +}; +PolylineCollection.prototype.contains = function(e) { + return defined(e) && e._polylineCollection === this; +}; +PolylineCollection.prototype.get = function(e) { + return removePolylines(this), this._polylines[e]; +}; +function createBatchTable(e, t) { + defined(e._batchTable) && e._batchTable.destroy(); + const n = [ + { + functionName: "batchTable_getWidthAndShow", + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 2 + }, + { + functionName: "batchTable_getPickColor", + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 4, + normalize: !0 + }, + { + functionName: "batchTable_getCenterHigh", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + functionName: "batchTable_getCenterLowAndRadius", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4 + }, + { + functionName: "batchTable_getDistanceDisplayCondition", + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2 + } + ]; + e._batchTable = new BatchTable( + t, + n, + e._polylines.length + ); +} +const scratchUpdatePolylineEncodedCartesian = new EncodedCartesian3(), scratchUpdatePolylineCartesian4 = new Cartesian4(), scratchNearFarCartesian2 = new Cartesian2(); +PolylineCollection.prototype.update = function(e) { + if (removePolylines(this), this._polylines.length === 0 || !this.show) + return; + updateMode$1(this, e); + const t = e.context, n = e.mapProjection; + let i, r = this._propertiesChanged; + if (this._createBatchTable) { + if (ContextLimits.maximumVertexTextureImageUnits === 0) + throw new RuntimeError( + "Vertex texture fetch support is required to render polylines. The maximum number of vertex texture image units must be greater than zero." + ); + createBatchTable(this, t), this._createBatchTable = !1; + } + if (this._createVertexArray || computeNewBuffersUsage(this)) + createVertexArrays(this, t, n); + else if (this._polylinesUpdated) { + const l = this._polylinesToUpdate; + if (this._mode !== SceneMode$1.SCENE3D) { + const d = l.length; + for (let f = 0; f < d; ++f) + i = l[f], i.update(); + } + if (r[POSITION_SIZE_INDEX] || r[MATERIAL_INDEX]) + createVertexArrays(this, t, n); + else { + const d = l.length, f = this._polylineBuckets; + for (let h = 0; h < d; ++h) { + i = l[h], r = i._propertiesChanged; + const p = i._bucket; + let m = 0; + for (const _ in f) + if (f.hasOwnProperty(_)) { + if (f[_] === p) { + r[POSITION_INDEX$4] && p.writeUpdate( + m, + i, + this._positionBuffer, + n + ); + break; + } + m += f[_].lengthOfPositions; + } + if ((r[SHOW_INDEX$4] || r[WIDTH_INDEX]) && this._batchTable.setBatchedAttribute( + i._index, + 0, + new Cartesian2(i._width, i._show) + ), this._batchTable.attributes.length > 2) { + if (r[POSITION_INDEX$4] || r[POSITION_SIZE_INDEX]) { + const _ = e.mode === SceneMode$1.SCENE2D ? i._boundingVolume2D : i._boundingVolumeWC, y = EncodedCartesian3.fromCartesian( + _.center, + scratchUpdatePolylineEncodedCartesian + ), C = Cartesian4.fromElements( + y.low.x, + y.low.y, + y.low.z, + _.radius, + scratchUpdatePolylineCartesian4 + ); + this._batchTable.setBatchedAttribute( + i._index, + 2, + y.high + ), this._batchTable.setBatchedAttribute(i._index, 3, C); + } + if (r[DISTANCE_DISPLAY_CONDITION]) { + const _ = scratchNearFarCartesian2; + _.x = 0, _.y = Number.MAX_VALUE; + const y = i.distanceDisplayCondition; + defined(y) && (_.x = y.near, _.y = y.far), this._batchTable.setBatchedAttribute( + i._index, + 4, + _ + ); + } + } + i._clean(); + } + } + l.length = 0, this._polylinesUpdated = !1; + } + r = this._propertiesChanged; + for (let l = 0; l < NUMBER_OF_PROPERTIES$2; ++l) + r[l] = 0; + let o = Matrix4.IDENTITY; + e.mode === SceneMode$1.SCENE3D && (o = this.modelMatrix); + const s = e.passes, c = e.morphTime !== 0; + if ((!defined(this._opaqueRS) || this._opaqueRS.depthTest.enabled !== c) && (this._opaqueRS = RenderState.fromCache({ + depthMask: c, + depthTest: { + enabled: c + } + })), (!defined(this._translucentRS) || this._translucentRS.depthTest.enabled !== c) && (this._translucentRS = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND, + depthMask: !c, + depthTest: { + enabled: c + } + })), this._batchTable.update(e), s.render || s.pick) { + const l = this._colorCommands; + createCommandLists(this, e, l, o); + } +}; +const boundingSphereScratch$1 = new BoundingSphere(), boundingSphereScratch2 = new BoundingSphere(); +function createCommandLists(e, t, n, i) { + const r = t.context, o = t.commandList, s = n.length; + let c = 0, l = !0; + const d = e._vertexArrays, f = e.debugShowBoundingVolume, p = e._batchTable.getUniformMapCallback(), m = d.length; + for (let _ = 0; _ < m; ++_) { + const y = d[_], C = y.buckets, T = C.length; + for (let x = 0; x < T; ++x) { + const b = C[x]; + let S = b.offset; + const E = b.bucket.shaderProgram, A = b.bucket.polylines, D = A.length; + let P, I, M = 0, R, L; + for (let g = 0; g < D; ++g) { + const w = A[g], O = createMaterialId(w._material); + if (O !== P) { + if (defined(P) && M > 0) { + const V = I.isTranslucent(); + c >= s ? (R = new DrawCommand({ + owner: e + }), n.push(R)) : R = n[c], ++c, L = combine$2( + p(I._uniforms), + e._uniformMap + ), R.boundingVolume = BoundingSphere.clone( + boundingSphereScratch$1, + R.boundingVolume + ), R.modelMatrix = i, R.shaderProgram = E, R.vertexArray = y.va, R.renderState = V ? e._translucentRS : e._opaqueRS, R.pass = V ? Pass$1.TRANSLUCENT : Pass$1.OPAQUE, R.debugShowBoundingVolume = f, R.pickId = "v_pickColor", R.uniformMap = L, R.count = M, R.offset = S, S += M, M = 0, l = !0, o.push(R); + } + I = w._material, I.update(r), P = O; + } + const N = w._locatorBuckets, F = N.length; + for (let V = 0; V < F; ++V) { + const U = N[V]; + U.locator === b && (M += U.count); + } + let B; + t.mode === SceneMode$1.SCENE3D ? B = w._boundingVolumeWC : t.mode === SceneMode$1.COLUMBUS_VIEW ? B = w._boundingVolume2D : t.mode === SceneMode$1.SCENE2D ? defined(w._boundingVolume2D) && (B = BoundingSphere.clone( + w._boundingVolume2D, + boundingSphereScratch2 + ), B.center.x = 0) : defined(w._boundingVolumeWC) && defined(w._boundingVolume2D) && (B = BoundingSphere.union( + w._boundingVolumeWC, + w._boundingVolume2D, + boundingSphereScratch2 + )), l ? (l = !1, BoundingSphere.clone(B, boundingSphereScratch$1)) : BoundingSphere.union( + B, + boundingSphereScratch$1, + boundingSphereScratch$1 + ); + } + defined(P) && M > 0 && (c >= s ? (R = new DrawCommand({ + owner: e + }), n.push(R)) : R = n[c], ++c, L = combine$2( + p(I._uniforms), + e._uniformMap + ), R.boundingVolume = BoundingSphere.clone( + boundingSphereScratch$1, + R.boundingVolume + ), R.modelMatrix = i, R.shaderProgram = E, R.vertexArray = y.va, R.renderState = I.isTranslucent() ? e._translucentRS : e._opaqueRS, R.pass = I.isTranslucent() ? Pass$1.TRANSLUCENT : Pass$1.OPAQUE, R.debugShowBoundingVolume = f, R.pickId = "v_pickColor", R.uniformMap = L, R.count = M, R.offset = S, l = !0, o.push(R)), P = void 0; + } + } + n.length = c; +} +PolylineCollection.prototype.isDestroyed = function() { + return !1; +}; +PolylineCollection.prototype.destroy = function() { + return destroyVertexArrays(this), releaseShaders(this), destroyPolylines(this), this._batchTable = this._batchTable && this._batchTable.destroy(), destroyObject(this); +}; +function computeNewBuffersUsage(e) { + let t = !1; + const n = e._propertiesChanged, i = e._positionBufferUsage; + return n[POSITION_INDEX$4] ? (i.bufferUsage !== BufferUsage$1.STREAM_DRAW && (t = !0, i.bufferUsage = BufferUsage$1.STREAM_DRAW), i.frameCount = 100) : i.bufferUsage !== BufferUsage$1.STATIC_DRAW && (i.frameCount === 0 ? (t = !0, i.bufferUsage = BufferUsage$1.STATIC_DRAW) : i.frameCount--), t; +} +const emptyVertexBuffer = [0, 0, 0]; +function createVertexArrays(e, t, n) { + e._createVertexArray = !1, releaseShaders(e), destroyVertexArrays(e), sortPolylinesIntoBuckets(e); + const i = [[]]; + let r = i[0]; + const o = e._batchTable, s = e._useHighlightColor, c = [0]; + let l = 0; + const d = [[]]; + let f = 0; + const h = e._polylineBuckets; + let p, m; + for (p in h) + h.hasOwnProperty(p) && (m = h[p], m.updateShader(t, o, s), f += m.lengthOfPositions); + if (f > 0) { + const _ = e._mode, y = new Float32Array(6 * f * 3), C = new Float32Array(f * 4); + let T, x = 0, b = 0, S = 0; + for (p in h) + if (h.hasOwnProperty(p)) { + m = h[p], m.write( + y, + C, + x, + b, + S, + o, + t, + n + ), _ === SceneMode$1.MORPHING && (defined(T) || (T = new Float32Array(6 * f * 3)), m.writeForMorph(T, x)); + const L = m.lengthOfPositions; + x += 6 * L * 3, b += L * 4, S += L * 4, l = m.updateIndices( + i, + c, + d, + l + ); + } + const E = e._positionBufferUsage.bufferUsage, A = BufferUsage$1.STATIC_DRAW; + e._positionBuffer = Buffer.createVertexBuffer({ + context: t, + typedArray: y, + usage: E + }); + let D; + defined(T) && (D = Buffer.createVertexBuffer({ + context: t, + typedArray: T, + usage: E + })), e._texCoordExpandAndBatchIndexBuffer = Buffer.createVertexBuffer({ + context: t, + typedArray: C, + usage: A + }); + const P = 3 * Float32Array.BYTES_PER_ELEMENT, I = 4 * Float32Array.BYTES_PER_ELEMENT; + let M = 0; + const R = i.length; + for (let L = 0; L < R; ++L) + if (r = i[L], r.length > 0) { + const g = new Uint16Array(r), w = Buffer.createIndexBuffer({ + context: t, + typedArray: g, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }); + M += c[L]; + const O = 6 * (L * (P * CesiumMath.SIXTY_FOUR_KILOBYTES) - M * P), N = P + O, F = P + N, B = P + F, V = P + B, U = P + V, k = L * (I * CesiumMath.SIXTY_FOUR_KILOBYTES) - M * I, $ = [ + { + index: attributeLocations$5.position3DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: O, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.position3DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: N, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.position2DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: O, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.position2DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: N, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.prevPosition3DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: F, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.prevPosition3DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: B, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.prevPosition2DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: F, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.prevPosition2DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: B, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.nextPosition3DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: V, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.nextPosition3DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: U, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.nextPosition2DHigh, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: V, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.nextPosition2DLow, + componentsPerAttribute: 3, + componentDatatype: ComponentDatatype$1.FLOAT, + offsetInBytes: U, + strideInBytes: 6 * P + }, + { + index: attributeLocations$5.texCoordExpandAndBatchIndex, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + vertexBuffer: e._texCoordExpandAndBatchIndexBuffer, + offsetInBytes: k + } + ]; + let G, q, z, H; + _ === SceneMode$1.SCENE3D ? (q = e._positionBuffer, G = "vertexBuffer", z = emptyVertexBuffer, H = "value") : _ === SceneMode$1.SCENE2D || _ === SceneMode$1.COLUMBUS_VIEW ? (q = emptyVertexBuffer, G = "value", z = e._positionBuffer, H = "vertexBuffer") : (q = D, G = "vertexBuffer", z = e._positionBuffer, H = "vertexBuffer"), $[0][G] = q, $[1][G] = q, $[2][H] = z, $[3][H] = z, $[4][G] = q, $[5][G] = q, $[6][H] = z, $[7][H] = z, $[8][G] = q, $[9][G] = q, $[10][H] = z, $[11][H] = z; + const Q = new VertexArray({ + context: t, + attributes: $, + indexBuffer: w + }); + e._vertexArrays.push({ + va: Q, + buckets: d[L] + }); + } + } +} +function replacer(e, t) { + return t instanceof Texture ? t.id : t; +} +const scratchUniformArray = []; +function createMaterialId(e) { + const t = Material$4._uniformList[e.type], n = t.length; + scratchUniformArray.length = 2 * n; + let i = 0; + for (let r = 0; r < n; ++r) { + const o = t[r]; + scratchUniformArray[i] = o, scratchUniformArray[i + 1] = e._uniforms[o](), i += 2; + } + return `${e.type}:${JSON.stringify(scratchUniformArray, replacer)}`; +} +function sortPolylinesIntoBuckets(e) { + const t = e._mode, n = e._modelMatrix, i = e._polylineBuckets = {}, r = e._polylines, o = r.length; + for (let s = 0; s < o; ++s) { + const c = r[s]; + if (c._actualPositions.length > 1) { + c.update(); + const l = c.material; + let d = i[l.type]; + defined(d) || (d = i[l.type] = new PolylineBucket( + l, + t, + n + )), d.addPolyline(c); + } + } +} +function updateMode$1(e, t) { + const n = t.mode; + (e._mode !== n || !Matrix4.equals(e._modelMatrix, e.modelMatrix)) && (e._mode = n, e._modelMatrix = Matrix4.clone(e.modelMatrix), e._createVertexArray = !0); +} +function removePolylines(e) { + if (e._polylinesRemoved) { + e._polylinesRemoved = !1; + const t = [], n = []; + let i = 0, r; + const o = e._polylines.length; + for (let s = 0; s < o; ++s) + r = e._polylines[s], r.isDestroyed || (r._index = i++, n.push(r), t.push(r)); + e._polylines = t, e._polylinesToUpdate = n; + } +} +function releaseShaders(e) { + const t = e._polylines, n = t.length; + for (let i = 0; i < n; ++i) + if (!t[i].isDestroyed) { + const r = t[i]._bucket; + defined(r) && (r.shaderProgram = r.shaderProgram && r.shaderProgram.destroy()); + } +} +function destroyVertexArrays(e) { + const t = e._vertexArrays.length; + for (let n = 0; n < t; ++n) + e._vertexArrays[n].va.destroy(); + e._vertexArrays.length = 0; +} +PolylineCollection.prototype._updatePolyline = function(e, t) { + this._polylinesUpdated = !0, e._dirty || this._polylinesToUpdate.push(e), ++this._propertiesChanged[t]; +}; +function destroyPolylines(e) { + const t = e._polylines, n = t.length; + for (let i = 0; i < n; ++i) + t[i].isDestroyed || t[i]._destroy(); +} +function VertexArrayBucketLocator(e, t, n) { + this.count = e, this.offset = t, this.bucket = n; +} +function PolylineBucket(e, t, n) { + this.polylines = [], this.lengthOfPositions = 0, this.material = e, this.shaderProgram = void 0, this.mode = t, this.modelMatrix = n; +} +PolylineBucket.prototype.addPolyline = function(e) { + this.polylines.push(e), e._actualLength = this.getPolylinePositionsLength(e), this.lengthOfPositions += e._actualLength, e._bucket = this; +}; +PolylineBucket.prototype.updateShader = function(e, t, n) { + if (defined(this.shaderProgram)) + return; + const i = ["DISTANCE_DISPLAY_CONDITION"]; + n && i.push("VECTOR_TILE"), this.material.shaderSource.search(/in\s+float\s+v_polylineAngle;/g) !== -1 && i.push("POLYLINE_DASH"), FeatureDetection.isInternetExplorer() || i.push("CLIP_POLYLINE"); + const r = new ShaderSource({ + defines: i, + sources: [`in vec4 v_pickColor; +`, this.material.shaderSource, PolylineFS$1] + }), o = t.getVertexShaderCallback()(PolylineVS), s = new ShaderSource({ + defines: i, + sources: [PolylineCommon, o] + }); + this.shaderProgram = ShaderProgram.fromCache({ + context: e, + vertexShaderSource: s, + fragmentShaderSource: r, + attributeLocations: attributeLocations$5 + }); +}; +function intersectsIDL(e) { + return Cartesian3.dot(Cartesian3.UNIT_X, e._boundingVolume.center) < 0 || e._boundingVolume.intersectPlane(Plane.ORIGIN_ZX_PLANE) === Intersect$1.INTERSECTING; +} +PolylineBucket.prototype.getPolylinePositionsLength = function(e) { + let t; + if (this.mode === SceneMode$1.SCENE3D || !intersectsIDL(e)) + return t = e._actualPositions.length, t * 4 - 4; + let n = 0; + const i = e._segments.lengths; + t = i.length; + for (let r = 0; r < t; ++r) + n += i[r] * 4 - 4; + return n; +}; +const scratchWritePosition = new Cartesian3(), scratchWritePrevPosition = new Cartesian3(), scratchWriteNextPosition = new Cartesian3(), scratchWriteVector = new Cartesian3(), scratchPickColorCartesian = new Cartesian4(), scratchWidthShowCartesian = new Cartesian2(); +PolylineBucket.prototype.write = function(e, t, n, i, r, o, s, c) { + const l = this.mode, d = c.ellipsoid.maximumRadius * CesiumMath.PI, f = this.polylines, h = f.length; + for (let p = 0; p < h; ++p) { + const m = f[p], _ = m.width, y = m.show && _ > 0, C = m._index, T = this.getSegments(m, c), x = T.positions, b = T.lengths, S = x.length, E = m.getPickId(s).color; + let A = 0, D = 0, P; + for (let F = 0; F < S; ++F) { + F === 0 ? m._loop ? P = x[S - 2] : (P = scratchWriteVector, Cartesian3.subtract(x[0], x[1], P), Cartesian3.add(x[0], P, P)) : P = x[F - 1], Cartesian3.clone(P, scratchWritePrevPosition), Cartesian3.clone(x[F], scratchWritePosition), F === S - 1 ? m._loop ? P = x[1] : (P = scratchWriteVector, Cartesian3.subtract( + x[S - 1], + x[S - 2], + P + ), Cartesian3.add(x[S - 1], P, P)) : P = x[F + 1], Cartesian3.clone(P, scratchWriteNextPosition); + const B = b[A]; + F === D + B && (D += B, ++A); + const V = F - D === 0, U = F === D + b[A] - 1; + l === SceneMode$1.SCENE2D && (scratchWritePrevPosition.z = 0, scratchWritePosition.z = 0, scratchWriteNextPosition.z = 0), (l === SceneMode$1.SCENE2D || l === SceneMode$1.MORPHING) && (V || U) && d - Math.abs(scratchWritePosition.x) < 1 && ((scratchWritePosition.x < 0 && scratchWritePrevPosition.x > 0 || scratchWritePosition.x > 0 && scratchWritePrevPosition.x < 0) && Cartesian3.clone(scratchWritePosition, scratchWritePrevPosition), (scratchWritePosition.x < 0 && scratchWriteNextPosition.x > 0 || scratchWritePosition.x > 0 && scratchWriteNextPosition.x < 0) && Cartesian3.clone(scratchWritePosition, scratchWriteNextPosition)); + const k = V ? 2 : 0, $ = U ? 2 : 4; + for (let G = k; G < $; ++G) { + EncodedCartesian3.writeElements( + scratchWritePosition, + e, + n + ), EncodedCartesian3.writeElements( + scratchWritePrevPosition, + e, + n + 6 + ), EncodedCartesian3.writeElements( + scratchWriteNextPosition, + e, + n + 12 + ); + const q = G - 2 < 0 ? -1 : 1; + t[r] = F / (S - 1), t[r + 1] = 2 * (G % 2) - 1, t[r + 2] = q, t[r + 3] = C, n += 6 * 3, r += 4; + } + } + const I = scratchPickColorCartesian; + I.x = Color.floatToByte(E.red), I.y = Color.floatToByte(E.green), I.z = Color.floatToByte(E.blue), I.w = Color.floatToByte(E.alpha); + const M = scratchWidthShowCartesian; + M.x = _, M.y = y ? 1 : 0; + const R = l === SceneMode$1.SCENE2D ? m._boundingVolume2D : m._boundingVolumeWC, L = EncodedCartesian3.fromCartesian( + R.center, + scratchUpdatePolylineEncodedCartesian + ), g = L.high, w = Cartesian4.fromElements( + L.low.x, + L.low.y, + L.low.z, + R.radius, + scratchUpdatePolylineCartesian4 + ), O = scratchNearFarCartesian2; + O.x = 0, O.y = Number.MAX_VALUE; + const N = m.distanceDisplayCondition; + defined(N) && (O.x = N.near, O.y = N.far), o.setBatchedAttribute(C, 0, M), o.setBatchedAttribute(C, 1, I), o.attributes.length > 2 && (o.setBatchedAttribute(C, 2, g), o.setBatchedAttribute(C, 3, w), o.setBatchedAttribute(C, 4, O)); + } +}; +const morphPositionScratch = new Cartesian3(), morphPrevPositionScratch = new Cartesian3(), morphNextPositionScratch = new Cartesian3(), morphVectorScratch = new Cartesian3(); +PolylineBucket.prototype.writeForMorph = function(e, t) { + const n = this.modelMatrix, i = this.polylines, r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o], c = s._segments.positions, l = s._segments.lengths, d = c.length; + let f = 0, h = 0; + for (let p = 0; p < d; ++p) { + let m; + p === 0 ? s._loop ? m = c[d - 2] : (m = morphVectorScratch, Cartesian3.subtract(c[0], c[1], m), Cartesian3.add(c[0], m, m)) : m = c[p - 1], m = Matrix4.multiplyByPoint( + n, + m, + morphPrevPositionScratch + ); + const _ = Matrix4.multiplyByPoint( + n, + c[p], + morphPositionScratch + ); + let y; + p === d - 1 ? s._loop ? y = c[1] : (y = morphVectorScratch, Cartesian3.subtract( + c[d - 1], + c[d - 2], + y + ), Cartesian3.add( + c[d - 1], + y, + y + )) : y = c[p + 1], y = Matrix4.multiplyByPoint( + n, + y, + morphNextPositionScratch + ); + const C = l[f]; + p === h + C && (h += C, ++f); + const T = p - h === 0, x = p === h + l[f] - 1, b = T ? 2 : 0, S = x ? 2 : 4; + for (let E = b; E < S; ++E) + EncodedCartesian3.writeElements(_, e, t), EncodedCartesian3.writeElements( + m, + e, + t + 6 + ), EncodedCartesian3.writeElements( + y, + e, + t + 12 + ), t += 6 * 3; + } + } +}; +const scratchSegmentLengths = new Array(1); +PolylineBucket.prototype.updateIndices = function(e, t, n, i) { + let r = n.length - 1, o = new VertexArrayBucketLocator(0, i, this); + n[r].push(o); + let s = 0, c = e[e.length - 1], l = 0; + c.length > 0 && (l = c[c.length - 1] + 1); + const d = this.polylines, f = d.length; + for (let h = 0; h < f; ++h) { + const p = d[h]; + p._locatorBuckets = []; + let m; + if (this.mode === SceneMode$1.SCENE3D) { + m = scratchSegmentLengths; + const y = p._actualPositions.length; + if (y > 0) + m[0] = y; + else + continue; + } else + m = p._segments.lengths; + const _ = m.length; + if (_ > 0) { + let y = 0; + for (let C = 0; C < _; ++C) { + const T = m[C] - 1; + for (let x = 0; x < T; ++x) + l + 4 > CesiumMath.SIXTY_FOUR_KILOBYTES && (p._locatorBuckets.push({ + locator: o, + count: y + }), y = 0, t.push(4), c = [], e.push(c), l = 0, o.count = s, s = 0, i = 0, o = new VertexArrayBucketLocator(0, 0, this), n[++r] = [o]), c.push(l, l + 2, l + 1), c.push(l + 1, l + 2, l + 3), y += 6, s += 6, i += 6, l += 4; + } + p._locatorBuckets.push({ + locator: o, + count: y + }), l + 4 > CesiumMath.SIXTY_FOUR_KILOBYTES && (t.push(0), c = [], e.push(c), l = 0, o.count = s, i = 0, s = 0, o = new VertexArrayBucketLocator(0, 0, this), n[++r] = [o]); + } + p._clean(); + } + return o.count = s, i; +}; +PolylineBucket.prototype.getPolylineStartIndex = function(e) { + const t = this.polylines; + let n = 0; + const i = t.length; + for (let r = 0; r < i; ++r) { + const o = t[r]; + if (o === e) + break; + n += o._actualLength; + } + return n; +}; +const scratchSegments = { + positions: void 0, + lengths: void 0 +}, scratchLengths = new Array(1), pscratch = new Cartesian3(), scratchCartographic$d = new Cartographic(); +PolylineBucket.prototype.getSegments = function(e, t) { + let n = e._actualPositions; + if (this.mode === SceneMode$1.SCENE3D) + return scratchLengths[0] = n.length, scratchSegments.positions = n, scratchSegments.lengths = scratchLengths, scratchSegments; + intersectsIDL(e) && (n = e._segments.positions); + const i = t.ellipsoid, r = [], o = this.modelMatrix, s = n.length; + let c, l = pscratch; + for (let d = 0; d < s; ++d) + c = n[d], l = Matrix4.multiplyByPoint(o, c, l), r.push( + t.project( + i.cartesianToCartographic(l, scratchCartographic$d) + ) + ); + if (r.length > 0) { + e._boundingVolume2D = BoundingSphere.fromPoints( + r, + e._boundingVolume2D + ); + const d = e._boundingVolume2D.center; + e._boundingVolume2D.center = new Cartesian3( + d.z, + d.x, + d.y + ); + } + return scratchSegments.positions = r, scratchSegments.lengths = e._segments.lengths, scratchSegments; +}; +let scratchPositionsArray; +PolylineBucket.prototype.writeUpdate = function(e, t, n, i) { + const r = this.mode, o = i.ellipsoid.maximumRadius * CesiumMath.PI; + let s = t._actualLength; + if (s) { + e += this.getPolylineStartIndex(t); + let c = scratchPositionsArray; + const l = 6 * s * 3; + !defined(c) || c.length < l ? c = scratchPositionsArray = new Float32Array( + l + ) : c.length > l && (c = new Float32Array( + c.buffer, + 0, + l + )); + const d = this.getSegments(t, i), f = d.positions, h = d.lengths; + let p = 0, m = 0, _ = 0, y; + s = f.length; + for (let C = 0; C < s; ++C) { + C === 0 ? t._loop ? y = f[s - 2] : (y = scratchWriteVector, Cartesian3.subtract(f[0], f[1], y), Cartesian3.add(f[0], y, y)) : y = f[C - 1], Cartesian3.clone(y, scratchWritePrevPosition), Cartesian3.clone(f[C], scratchWritePosition), C === s - 1 ? t._loop ? y = f[1] : (y = scratchWriteVector, Cartesian3.subtract( + f[s - 1], + f[s - 2], + y + ), Cartesian3.add(f[s - 1], y, y)) : y = f[C + 1], Cartesian3.clone(y, scratchWriteNextPosition); + const T = h[m]; + C === _ + T && (_ += T, ++m); + const x = C - _ === 0, b = C === _ + h[m] - 1; + r === SceneMode$1.SCENE2D && (scratchWritePrevPosition.z = 0, scratchWritePosition.z = 0, scratchWriteNextPosition.z = 0), (r === SceneMode$1.SCENE2D || r === SceneMode$1.MORPHING) && (x || b) && o - Math.abs(scratchWritePosition.x) < 1 && ((scratchWritePosition.x < 0 && scratchWritePrevPosition.x > 0 || scratchWritePosition.x > 0 && scratchWritePrevPosition.x < 0) && Cartesian3.clone(scratchWritePosition, scratchWritePrevPosition), (scratchWritePosition.x < 0 && scratchWriteNextPosition.x > 0 || scratchWritePosition.x > 0 && scratchWriteNextPosition.x < 0) && Cartesian3.clone(scratchWritePosition, scratchWriteNextPosition)); + const S = x ? 2 : 0, E = b ? 2 : 4; + for (let A = S; A < E; ++A) + EncodedCartesian3.writeElements( + scratchWritePosition, + c, + p + ), EncodedCartesian3.writeElements( + scratchWritePrevPosition, + c, + p + 6 + ), EncodedCartesian3.writeElements( + scratchWriteNextPosition, + c, + p + 12 + ), p += 6 * 3; + } + n.copyFromArrayView( + c, + 6 * 3 * Float32Array.BYTES_PER_ELEMENT * e + ); + } +}; +function Vector3DTilePoints(e) { + this._positions = e.positions, this._batchTable = e.batchTable, this._batchIds = e.batchIds, this._rectangle = e.rectangle, this._minHeight = e.minimumHeight, this._maxHeight = e.maximumHeight, this._billboardCollection = new BillboardCollection({ + batchTable: e.batchTable + }), this._labelCollection = new LabelCollection({ + batchTable: e.batchTable + }), this._polylineCollection = new PolylineCollection(), this._polylineCollection._useHighlightColor = !0, this._packedBuffer = void 0, this._ready = !1, this._promise = void 0, this._error = void 0; +} +Object.defineProperties(Vector3DTilePoints.prototype, { + /** + * Returns true if the points are ready to render + * + * @memberof Vector3DTilePoints.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * Gets the number of points. + * + * @memberof Vector3DTilePoints.prototype + * + * @type {number} + * @readonly + * @private + */ + pointsLength: { + get: function() { + return this._billboardCollection.length; + } + }, + /** + * Gets the texture atlas memory in bytes. + * + * @memberof Vector3DTilePoints.prototype + * + * @type {number} + * @readonly + * @private + */ + texturesByteLength: { + get: function() { + const e = this._billboardCollection.textureAtlas.texture.sizeInBytes, t = this._labelCollection._textureAtlas.texture.sizeInBytes; + return e + t; + } + } +}); +function packBuffer$3(e, t) { + const n = e._rectangle, i = e._minHeight, r = e._maxHeight, o = 2 + Rectangle.packedLength + Ellipsoid.packedLength, s = new Float64Array(o); + let c = 0; + return s[c++] = i, s[c++] = r, Rectangle.pack(n, s, c), c += Rectangle.packedLength, Ellipsoid.pack(t, s, c), s; +} +const createVerticesTaskProcessor$3 = new TaskProcessor( + "createVectorTilePoints", + 5 +), scratchPosition$9 = new Cartesian3(); +function createPoints(e, t) { + let n = e._positions, i = e._packedBuffer; + defined(i) || (n = e._positions = n.slice(), e._batchIds = e._batchIds.slice(), i = e._packedBuffer = packBuffer$3(e, t)); + const r = [n.buffer, i.buffer], o = { + positions: n.buffer, + packedBuffer: i.buffer + }, s = createVerticesTaskProcessor$3.scheduleTask( + o, + r + ); + if (defined(s)) + return s.then((c) => { + if (e.isDestroyed()) + return; + e._positions = new Float64Array(c.positions); + const l = e._billboardCollection, d = e._labelCollection, f = e._polylineCollection; + n = e._positions; + const h = e._batchIds, p = n.length / 3, m = new Cartesian2(0, -15); + for (let _ = 0; _ < p; ++_) { + const y = h[_], C = Cartesian3.unpack(n, _ * 3, scratchPosition$9), T = l.add(); + T.position = C, T._batchIndex = y; + const x = d.add(); + x.text = " ", x.position = C, x._batchIndex = y, x.pixelOffset = m; + const b = f.add(); + b.positions = [Cartesian3.clone(C), Cartesian3.clone(C)]; + } + e._positions = void 0, e._packedBuffer = void 0, e._ready = !0; + }).catch((c) => { + e.isDestroyed() || (e._error = c); + }); +} +Vector3DTilePoints.prototype.createFeatures = function(e, t) { + const n = this._billboardCollection, i = this._labelCollection, r = this._polylineCollection, o = this._batchIds, s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c], d = n.get(c), f = i.get(c), h = r.get(c); + t[l] = new Cesium3DTilePointFeature( + e, + l, + d, + f, + h + ); + } +}; +Vector3DTilePoints.prototype.applyDebugSettings = function(e, t) { + e ? (Color.clone(t, this._billboardCollection._highlightColor), Color.clone(t, this._labelCollection._highlightColor), Color.clone(t, this._polylineCollection._highlightColor)) : (Color.clone(Color.WHITE, this._billboardCollection._highlightColor), Color.clone(Color.WHITE, this._labelCollection._highlightColor), Color.clone(Color.WHITE, this._polylineCollection._highlightColor)); +}; +function clearStyle$2(e, t) { + const n = e._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + s.show = !0, s.pointSize = Cesium3DTilePointFeature.defaultPointSize, s.color = Cesium3DTilePointFeature.defaultColor, s.pointOutlineColor = Cesium3DTilePointFeature.defaultPointOutlineColor, s.pointOutlineWidth = Cesium3DTilePointFeature.defaultPointOutlineWidth, s.labelColor = Color.WHITE, s.labelOutlineColor = Color.WHITE, s.labelOutlineWidth = 1, s.font = "30px sans-serif", s.labelStyle = LabelStyle$1.FILL, s.labelText = void 0, s.backgroundColor = new Color(0.165, 0.165, 0.165, 0.8), s.backgroundPadding = new Cartesian2(7, 5), s.backgroundEnabled = !1, s.scaleByDistance = void 0, s.scale = 1, s.translucencyByDistance = void 0, s.distanceDisplayCondition = void 0, s.heightOffset = 0, s.anchorLineEnabled = !1, s.anchorLineColor = Color.WHITE, s.image = void 0, s.disableDepthTestDistance = 0, s.horizontalOrigin = HorizontalOrigin$1.CENTER, s.verticalOrigin = VerticalOrigin$1.CENTER, s.labelHorizontalOrigin = HorizontalOrigin$1.LEFT, s.labelVerticalOrigin = VerticalOrigin$1.BASELINE; + } +} +const scratchColor$i = new Color(), scratchColor2 = new Color(), scratchColor3 = new Color(), scratchColor4 = new Color(), scratchColor5 = new Color(), scratchColor6 = new Color(), scratchScaleByDistance = new NearFarScalar(), scratchTranslucencyByDistance = new NearFarScalar(), scratchDistanceDisplayCondition = new DistanceDisplayCondition(); +Vector3DTilePoints.prototype.applyStyle = function(e, t) { + if (!defined(e)) { + clearStyle$2(this, t); + return; + } + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + if (defined(e.show) ? s.show = e.show.evaluate(s) : s.show = !0, s.show) { + if (defined(e.pointSize) ? s.pointSize = e.pointSize.evaluate(s) : s.pointSize = Cesium3DTilePointFeature.defaultPointSize, defined(e.color) ? s.color = e.color.evaluateColor(s, scratchColor$i) : s.color = Cesium3DTilePointFeature.defaultColor, defined(e.pointOutlineColor) ? s.pointOutlineColor = e.pointOutlineColor.evaluateColor( + s, + scratchColor2 + ) : s.pointOutlineColor = Cesium3DTilePointFeature.defaultPointOutlineColor, defined(e.pointOutlineWidth) ? s.pointOutlineWidth = e.pointOutlineWidth.evaluate(s) : s.pointOutlineWidth = Cesium3DTilePointFeature.defaultPointOutlineWidth, defined(e.labelColor) ? s.labelColor = e.labelColor.evaluateColor( + s, + scratchColor3 + ) : s.labelColor = Color.WHITE, defined(e.labelOutlineColor) ? s.labelOutlineColor = e.labelOutlineColor.evaluateColor( + s, + scratchColor4 + ) : s.labelOutlineColor = Color.WHITE, defined(e.labelOutlineWidth) ? s.labelOutlineWidth = e.labelOutlineWidth.evaluate(s) : s.labelOutlineWidth = 1, defined(e.font) ? s.font = e.font.evaluate(s) : s.font = "30px sans-serif", defined(e.labelStyle) ? s.labelStyle = e.labelStyle.evaluate(s) : s.labelStyle = LabelStyle$1.FILL, defined(e.labelText) ? s.labelText = e.labelText.evaluate(s) : s.labelText = void 0, defined(e.backgroundColor) ? s.backgroundColor = e.backgroundColor.evaluateColor( + s, + scratchColor5 + ) : s.backgroundColor = new Color(0.165, 0.165, 0.165, 0.8), defined(e.backgroundPadding) ? s.backgroundPadding = e.backgroundPadding.evaluate(s) : s.backgroundPadding = new Cartesian2(7, 5), defined(e.backgroundEnabled) ? s.backgroundEnabled = e.backgroundEnabled.evaluate(s) : s.backgroundEnabled = !1, defined(e.scaleByDistance)) { + const c = e.scaleByDistance.evaluate(s); + defined(c) ? (scratchScaleByDistance.near = c.x, scratchScaleByDistance.nearValue = c.y, scratchScaleByDistance.far = c.z, scratchScaleByDistance.farValue = c.w, s.scaleByDistance = scratchScaleByDistance) : s.scaleByDistance = void 0; + } else + s.scaleByDistance = void 0; + if (defined(e.scale) ? s.scale = e.scale.evaluate(s) : s.scale = 1, defined(e.translucencyByDistance)) { + const c = e.translucencyByDistance.evaluate( + s + ); + defined(c) ? (scratchTranslucencyByDistance.near = c.x, scratchTranslucencyByDistance.nearValue = c.y, scratchTranslucencyByDistance.far = c.z, scratchTranslucencyByDistance.farValue = c.w, s.translucencyByDistance = scratchTranslucencyByDistance) : s.translucencyByDistance = void 0; + } else + s.translucencyByDistance = void 0; + if (defined(e.distanceDisplayCondition)) { + const c = e.distanceDisplayCondition.evaluate( + s + ); + defined(c) ? (scratchDistanceDisplayCondition.near = c.x, scratchDistanceDisplayCondition.far = c.y, s.distanceDisplayCondition = scratchDistanceDisplayCondition) : s.distanceDisplayCondition = void 0; + } else + s.distanceDisplayCondition = void 0; + defined(e.heightOffset) ? s.heightOffset = e.heightOffset.evaluate(s) : s.heightOffset = 0, defined(e.anchorLineEnabled) ? s.anchorLineEnabled = e.anchorLineEnabled.evaluate(s) : s.anchorLineEnabled = !1, defined(e.anchorLineColor) ? s.anchorLineColor = e.anchorLineColor.evaluateColor( + s, + scratchColor6 + ) : s.anchorLineColor = Color.WHITE, defined(e.image) ? s.image = e.image.evaluate(s) : s.image = void 0, defined(e.disableDepthTestDistance) ? s.disableDepthTestDistance = e.disableDepthTestDistance.evaluate( + s + ) : s.disableDepthTestDistance = 0, defined(e.horizontalOrigin) ? s.horizontalOrigin = e.horizontalOrigin.evaluate(s) : s.horizontalOrigin = HorizontalOrigin$1.CENTER, defined(e.verticalOrigin) ? s.verticalOrigin = e.verticalOrigin.evaluate(s) : s.verticalOrigin = VerticalOrigin$1.CENTER, defined(e.labelHorizontalOrigin) ? s.labelHorizontalOrigin = e.labelHorizontalOrigin.evaluate( + s + ) : s.labelHorizontalOrigin = HorizontalOrigin$1.LEFT, defined(e.labelVerticalOrigin) ? s.labelVerticalOrigin = e.labelVerticalOrigin.evaluate( + s + ) : s.labelVerticalOrigin = VerticalOrigin$1.BASELINE; + } + } +}; +Vector3DTilePoints.prototype.update = function(e) { + if (!this._ready) { + if (defined(this._promise) || (this._promise = createPoints(this, e.mapProjection.ellipsoid)), defined(this._error)) { + const t = this._error; + throw this._error = void 0, t; + } + return; + } + this._polylineCollection.update(e), this._billboardCollection.update(e), this._labelCollection.update(e); +}; +Vector3DTilePoints.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTilePoints.prototype.destroy = function() { + return this._billboardCollection = this._billboardCollection && this._billboardCollection.destroy(), this._labelCollection = this._labelCollection && this._labelCollection.destroy(), this._polylineCollection = this._polylineCollection && this._polylineCollection.destroy(), destroyObject(this); +}; +function Vector3DTilePolygons(e) { + this._batchTable = e.batchTable, this._batchIds = e.batchIds, this._positions = e.positions, this._counts = e.counts, this._indices = e.indices, this._indexCounts = e.indexCounts, this._indexOffsets = void 0, this._batchTableColors = void 0, this._packedBuffer = void 0, this._batchedPositions = void 0, this._transferrableBatchIds = void 0, this._vertexBatchIds = void 0, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.WGS84), this._minimumHeight = e.minimumHeight, this._maximumHeight = e.maximumHeight, this._polygonMinimumHeights = e.polygonMinimumHeights, this._polygonMaximumHeights = e.polygonMaximumHeights, this._center = defaultValue(e.center, Cartesian3.ZERO), this._rectangle = e.rectangle, this._center = void 0, this._boundingVolume = e.boundingVolume, this._boundingVolumes = void 0, this._batchedIndices = void 0, this._ready = !1, this._promise = void 0, this._error = void 0, this._primitive = void 0, this.debugWireframe = !1, this.forceRebatch = !1, this.classificationType = ClassificationType$1.BOTH; +} +Object.defineProperties(Vector3DTilePolygons.prototype, { + /** + * Gets the number of triangles. + * + * @memberof Vector3DTilePolygons.prototype + * + * @type {number} + * @readonly + * @private + */ + trianglesLength: { + get: function() { + return defined(this._primitive) ? this._primitive.trianglesLength : 0; + } + }, + /** + * Gets the geometry memory in bytes. + * + * @memberof Vector3DTilePolygons.prototype + * + * @type {number} + * @readonly + * @private + */ + geometryByteLength: { + get: function() { + return defined(this._primitive) ? this._primitive.geometryByteLength : 0; + } + }, + /** + * Returns true when the primitive is ready to render. + * @memberof Vector3DTilePolygons.prototype + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + } +}); +function packBuffer$2(e) { + const t = new Float64Array( + 3 + Cartesian3.packedLength + Ellipsoid.packedLength + Rectangle.packedLength + ); + let n = 0; + return t[n++] = e._indices.BYTES_PER_ELEMENT, t[n++] = e._minimumHeight, t[n++] = e._maximumHeight, Cartesian3.pack(e._center, t, n), n += Cartesian3.packedLength, Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, Rectangle.pack(e._rectangle, t, n), t; +} +function unpackBuffer(e, t) { + let n = 1; + const i = t[n++], r = e._boundingVolumes = new Array(i); + for (let c = 0; c < i; ++c) + r[c] = OrientedBoundingBox.unpack(t, n), n += OrientedBoundingBox.packedLength; + const o = t[n++], s = e._batchedIndices = new Array(o); + for (let c = 0; c < o; ++c) { + const l = Color.unpack(t, n); + n += Color.packedLength; + const d = t[n++], f = t[n++], h = t[n++], p = new Array(h); + for (let m = 0; m < h; ++m) + p[m] = t[n++]; + s[c] = new Vector3DTileBatch({ + color: l, + offset: d, + count: f, + batchIds: p + }); + } +} +const createVerticesTaskProcessor$2 = new TaskProcessor( + "createVectorTilePolygons", + 5 +), scratchColor$h = new Color(); +function createPrimitive(e) { + if (defined(e._primitive)) + return; + let t = e._positions, n = e._counts, i = e._indexCounts, r = e._indices, o = e._transferrableBatchIds, s = e._batchTableColors, c = e._packedBuffer; + if (!defined(s)) { + t = e._positions = e._positions.slice(), n = e._counts = e._counts.slice(), i = e._indexCounts = e._indexCounts.slice(), r = e._indices = e._indices.slice(), e._center = e._ellipsoid.cartographicToCartesian( + Rectangle.center(e._rectangle) + ), o = e._transferrableBatchIds = new Uint32Array( + e._batchIds + ), s = e._batchTableColors = new Uint32Array( + o.length + ); + const m = e._batchTable, _ = s.length; + for (let y = 0; y < _; ++y) { + const C = m.getColor(y, scratchColor$h); + s[y] = C.toRgba(); + } + c = e._packedBuffer = packBuffer$2(e); + } + const l = [ + t.buffer, + n.buffer, + i.buffer, + r.buffer, + o.buffer, + s.buffer, + c.buffer + ], d = { + packedBuffer: c.buffer, + positions: t.buffer, + counts: n.buffer, + indexCounts: i.buffer, + indices: r.buffer, + batchIds: o.buffer, + batchTableColors: s.buffer + }; + let f = e._polygonMinimumHeights, h = e._polygonMaximumHeights; + defined(f) && defined(h) && (f = f.slice(), h = h.slice(), l.push(f.buffer, h.buffer), d.minimumHeights = f, d.maximumHeights = h); + const p = createVerticesTaskProcessor$2.scheduleTask( + d, + l + ); + if (defined(p)) + return p.then((m) => { + if (e.isDestroyed()) + return; + e._positions = void 0, e._counts = void 0, e._polygonMinimumHeights = void 0, e._polygonMaximumHeights = void 0; + const _ = new Float64Array(m.packedBuffer), y = _[0]; + unpackBuffer(e, _), e._indices = IndexDatatype$1.getSizeInBytes(y) === 2 ? new Uint16Array(m.indices) : new Uint32Array(m.indices), e._indexOffsets = new Uint32Array(m.indexOffsets), e._indexCounts = new Uint32Array(m.indexCounts), e._batchedPositions = new Float32Array(m.positions), e._vertexBatchIds = new Uint16Array(m.batchIds), finishPrimitive(e), e._ready = !0; + }).catch((m) => { + e.isDestroyed() || (e._error = m); + }); +} +function finishPrimitive(e) { + defined(e._primitive) || (e._primitive = new Vector3DTilePrimitive({ + batchTable: e._batchTable, + positions: e._batchedPositions, + batchIds: e._batchIds, + vertexBatchIds: e._vertexBatchIds, + indices: e._indices, + indexOffsets: e._indexOffsets, + indexCounts: e._indexCounts, + batchedIndices: e._batchedIndices, + boundingVolume: e._boundingVolume, + boundingVolumes: e._boundingVolumes, + center: e._center + }), e._batchTable = void 0, e._batchIds = void 0, e._positions = void 0, e._counts = void 0, e._indices = void 0, e._indexCounts = void 0, e._indexOffsets = void 0, e._batchTableColors = void 0, e._packedBuffer = void 0, e._batchedPositions = void 0, e._transferrableBatchIds = void 0, e._vertexBatchIds = void 0, e._ellipsoid = void 0, e._minimumHeight = void 0, e._maximumHeight = void 0, e._polygonMinimumHeights = void 0, e._polygonMaximumHeights = void 0, e._center = void 0, e._rectangle = void 0, e._boundingVolume = void 0, e._boundingVolumes = void 0, e._batchedIndices = void 0); +} +Vector3DTilePolygons.prototype.createFeatures = function(e, t) { + this._primitive.createFeatures(e, t); +}; +Vector3DTilePolygons.prototype.applyDebugSettings = function(e, t) { + this._primitive.applyDebugSettings(e, t); +}; +Vector3DTilePolygons.prototype.applyStyle = function(e, t) { + this._primitive.applyStyle(e, t); +}; +Vector3DTilePolygons.prototype.updateCommands = function(e, t) { + this._primitive.updateCommands(e, t); +}; +Vector3DTilePolygons.prototype.update = function(e) { + if (!this._ready) { + if (defined(this._promise) || (this._promise = createPrimitive(this)), defined(this._error)) { + const t = this._error; + throw this._error = void 0, t; + } + return; + } + this._primitive.debugWireframe = this.debugWireframe, this._primitive.forceRebatch = this.forceRebatch, this._primitive.classificationType = this.classificationType, this._primitive.update(e); +}; +Vector3DTilePolygons.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTilePolygons.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), destroyObject(this); +}; +const Vector3DTilePolylinesVS = `in vec4 currentPosition; +in vec4 previousPosition; +in vec4 nextPosition; +in vec2 expandAndWidth; +in float a_batchId; + +uniform mat4 u_modifiedModelView; + +void main() +{ + float expandDir = expandAndWidth.x; + float width = abs(expandAndWidth.y) + 0.5; + bool usePrev = expandAndWidth.y < 0.0; + + vec4 p = u_modifiedModelView * currentPosition; + vec4 prev = u_modifiedModelView * previousPosition; + vec4 next = u_modifiedModelView * nextPosition; + + float angle; + vec4 positionWC = getPolylineWindowCoordinatesEC(p, prev, next, expandDir, width, usePrev, angle); + gl_Position = czm_viewportOrthographic * positionWC; +} +`; +function Vector3DTilePolylines(e) { + this._positions = e.positions, this._widths = e.widths, this._counts = e.counts, this._batchIds = e.batchIds, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.WGS84), this._minimumHeight = e.minimumHeight, this._maximumHeight = e.maximumHeight, this._center = e.center, this._rectangle = e.rectangle, this._boundingVolume = e.boundingVolume, this._batchTable = e.batchTable, this._va = void 0, this._sp = void 0, this._rs = void 0, this._uniformMap = void 0, this._command = void 0, this._transferrableBatchIds = void 0, this._packedBuffer = void 0, this._keepDecodedPositions = e.keepDecodedPositions, this._decodedPositions = void 0, this._decodedPositionOffsets = void 0, this._currentPositions = void 0, this._previousPositions = void 0, this._nextPositions = void 0, this._expandAndWidth = void 0, this._vertexBatchIds = void 0, this._indices = void 0, this._constantColor = Color.clone(Color.WHITE), this._highlightColor = this._constantColor, this._trianglesLength = 0, this._geometryByteLength = 0, this._ready = !1, this._promise = void 0, this._error = void 0; +} +Object.defineProperties(Vector3DTilePolylines.prototype, { + /** + * Gets the number of triangles. + * + * @memberof Vector3DTilePolylines.prototype + * + * @type {number} + * @readonly + * @private + */ + trianglesLength: { + get: function() { + return this._trianglesLength; + } + }, + /** + * Gets the geometry memory in bytes. + * + * @memberof Vector3DTilePolylines.prototype + * + * @type {number} + * @readonly + * @private + */ + geometryByteLength: { + get: function() { + return this._geometryByteLength; + } + }, + /** + * Returns true when the primitive is ready to render. + * @memberof Vector3DTilePolylines.prototype + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + } +}); +function packBuffer$1(e) { + const t = e._rectangle, n = e._minimumHeight, i = e._maximumHeight, r = e._ellipsoid, o = e._center, s = 2 + Rectangle.packedLength + Ellipsoid.packedLength + Cartesian3.packedLength, c = new Float64Array(s); + let l = 0; + return c[l++] = n, c[l++] = i, Rectangle.pack(t, c, l), l += Rectangle.packedLength, Ellipsoid.pack(r, c, l), l += Ellipsoid.packedLength, Cartesian3.pack(o, c, l), c; +} +const createVerticesTaskProcessor$1 = new TaskProcessor( + "createVectorTilePolylines", + 5 +), attributeLocations$4 = { + previousPosition: 0, + currentPosition: 1, + nextPosition: 2, + expandAndWidth: 3, + a_batchId: 4 +}; +function createVertexArray$2(e, t) { + if (defined(e._va)) + return; + let n = e._positions, i = e._widths, r = e._counts, o = e._transferrableBatchIds, s = e._packedBuffer; + defined(s) || (n = e._positions = n.slice(), i = e._widths = i.slice(), r = e._counts = r.slice(), o = e._transferrableBatchIds = e._batchIds.slice(), s = e._packedBuffer = packBuffer$1(e)); + const c = [ + n.buffer, + i.buffer, + r.buffer, + o.buffer, + s.buffer + ], l = { + positions: n.buffer, + widths: i.buffer, + counts: r.buffer, + batchIds: o.buffer, + packedBuffer: s.buffer, + keepDecodedPositions: e._keepDecodedPositions + }, d = createVerticesTaskProcessor$1.scheduleTask( + l, + c + ); + if (defined(d)) + return d.then(function(f) { + if (e.isDestroyed()) + return; + e._keepDecodedPositions && (e._decodedPositions = new Float64Array(f.decodedPositions), e._decodedPositionOffsets = new Uint32Array( + f.decodedPositionOffsets + )), e._currentPositions = new Float32Array(f.currentPositions), e._previousPositions = new Float32Array(f.previousPositions), e._nextPositions = new Float32Array(f.nextPositions), e._expandAndWidth = new Float32Array(f.expandAndWidth), e._vertexBatchIds = new Uint16Array(f.batchIds); + const h = f.indexDatatype; + e._indices = h === IndexDatatype$1.UNSIGNED_SHORT ? new Uint16Array(f.indices) : new Uint32Array(f.indices), finishVertexArray$1(e, t), e._ready = !0; + }).catch((f) => { + e.isDestroyed() || (e._error = f); + }); +} +function finishVertexArray$1(e, t) { + if (!defined(e._va)) { + const n = e._currentPositions, i = e._previousPositions, r = e._nextPositions, o = e._expandAndWidth, s = e._vertexBatchIds, c = e._indices; + let l = i.byteLength + n.byteLength + r.byteLength; + l += o.byteLength + s.byteLength + c.byteLength, e._trianglesLength = c.length / 3, e._geometryByteLength = l; + const d = Buffer.createVertexBuffer({ + context: t, + typedArray: i, + usage: BufferUsage$1.STATIC_DRAW + }), f = Buffer.createVertexBuffer({ + context: t, + typedArray: n, + usage: BufferUsage$1.STATIC_DRAW + }), h = Buffer.createVertexBuffer({ + context: t, + typedArray: r, + usage: BufferUsage$1.STATIC_DRAW + }), p = Buffer.createVertexBuffer({ + context: t, + typedArray: o, + usage: BufferUsage$1.STATIC_DRAW + }), m = Buffer.createVertexBuffer({ + context: t, + typedArray: s, + usage: BufferUsage$1.STATIC_DRAW + }), _ = Buffer.createIndexBuffer({ + context: t, + typedArray: c, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: c.BYTES_PER_ELEMENT === 2 ? IndexDatatype$1.UNSIGNED_SHORT : IndexDatatype$1.UNSIGNED_INT + }), y = [ + { + index: attributeLocations$4.previousPosition, + vertexBuffer: d, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + index: attributeLocations$4.currentPosition, + vertexBuffer: f, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + index: attributeLocations$4.nextPosition, + vertexBuffer: h, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + index: attributeLocations$4.expandAndWidth, + vertexBuffer: p, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2 + }, + { + index: attributeLocations$4.a_batchId, + vertexBuffer: m, + componentDatatype: ComponentDatatype$1.UNSIGNED_SHORT, + componentsPerAttribute: 1 + } + ]; + e._va = new VertexArray({ + context: t, + attributes: y, + indexBuffer: _ + }), e._positions = void 0, e._widths = void 0, e._counts = void 0, e._ellipsoid = void 0, e._minimumHeight = void 0, e._maximumHeight = void 0, e._rectangle = void 0, e._transferrableBatchIds = void 0, e._packedBuffer = void 0, e._currentPositions = void 0, e._previousPositions = void 0, e._nextPositions = void 0, e._expandAndWidth = void 0, e._vertexBatchIds = void 0, e._indices = void 0; + } +} +const modifiedModelViewScratch$2 = new Matrix4(), rtcScratch$2 = new Cartesian3(); +function createUniformMap$4(e, t) { + defined(e._uniformMap) || (e._uniformMap = { + u_modifiedModelView: function() { + const n = t.uniformState.view; + return Matrix4.clone(n, modifiedModelViewScratch$2), Matrix4.multiplyByPoint( + modifiedModelViewScratch$2, + e._center, + rtcScratch$2 + ), Matrix4.setTranslation( + modifiedModelViewScratch$2, + rtcScratch$2, + modifiedModelViewScratch$2 + ), modifiedModelViewScratch$2; + }, + u_highlightColor: function() { + return e._highlightColor; + } + }); +} +function createRenderStates$2(e) { + if (defined(e._rs)) + return; + const t = { + enabled: !0, + factor: -5, + units: -5 + }; + e._rs = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND, + depthMask: !1, + depthTest: { + enabled: !0 + }, + polygonOffset: t + }); +} +const PolylineFS = `uniform vec4 u_highlightColor; +void main() +{ + out_FragColor = u_highlightColor; +} +`; +function createShaders$2(e, t) { + if (defined(e._sp)) + return; + const n = e._batchTable, i = n.getVertexShaderCallback( + !1, + "a_batchId", + void 0 + )(Vector3DTilePolylinesVS), r = n.getFragmentShaderCallback( + !1, + void 0, + !1 + )(PolylineFS), o = new ShaderSource({ + defines: [ + "VECTOR_TILE", + FeatureDetection.isInternetExplorer() ? "" : "CLIP_POLYLINE" + ], + sources: [PolylineCommon, i] + }), s = new ShaderSource({ + defines: ["VECTOR_TILE"], + sources: [r] + }); + e._sp = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: attributeLocations$4 + }); +} +function queueCommands$1(e, t) { + if (!defined(e._command)) { + const n = e._batchTable.getUniformMapCallback()( + e._uniformMap + ); + e._command = new DrawCommand({ + owner: e, + vertexArray: e._va, + renderState: e._rs, + shaderProgram: e._sp, + uniformMap: n, + boundingVolume: e._boundingVolume, + pass: Pass$1.TRANSLUCENT, + pickId: e._batchTable.getPickId() + }); + } + t.commandList.push(e._command); +} +Vector3DTilePolylines.getPolylinePositions = function(e, t) { + const n = e._batchIds, i = e._decodedPositions, r = e._decodedPositionOffsets; + if (!defined(n) || !defined(i)) + return; + let o, s; + const c = n.length; + let l = 0, d = 0; + for (o = 0; o < c; ++o) + n[o] === t && (l += r[o + 1] - r[o]); + if (l === 0) + return; + const f = new Float64Array(l * 3); + for (o = 0; o < c; ++o) + if (n[o] === t) { + const h = r[o], p = r[o + 1] - h; + for (s = 0; s < p; ++s) { + const m = (h + s) * 3; + f[d++] = i[m], f[d++] = i[m + 1], f[d++] = i[m + 2]; + } + } + return f; +}; +Vector3DTilePolylines.prototype.getPositions = function(e) { + return Vector3DTilePolylines.getPolylinePositions(this, e); +}; +Vector3DTilePolylines.prototype.createFeatures = function(e, t) { + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + t[o] = new Cesium3DTileFeature(e, o); + } +}; +Vector3DTilePolylines.prototype.applyDebugSettings = function(e, t) { + this._highlightColor = e ? t : this._constantColor; +}; +function clearStyle$1(e, t) { + const n = e._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + s.show = !0, s.color = Color.WHITE; + } +} +const scratchColor$g = new Color(), DEFAULT_COLOR_VALUE$1 = Color.WHITE, DEFAULT_SHOW_VALUE$1 = !0; +Vector3DTilePolylines.prototype.applyStyle = function(e, t) { + if (!defined(e)) { + clearStyle$1(this, t); + return; + } + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + s.color = defined(e.color) ? e.color.evaluateColor(s, scratchColor$g) : DEFAULT_COLOR_VALUE$1, s.show = defined(e.show) ? e.show.evaluate(s) : DEFAULT_SHOW_VALUE$1; + } +}; +Vector3DTilePolylines.prototype.update = function(e) { + const t = e.context; + if (!this._ready) { + if (defined(this._promise) || (this._promise = createVertexArray$2(this, t)), defined(this._error)) { + const i = this._error; + throw this._error = void 0, i; + } + return; + } + createUniformMap$4(this, t), createShaders$2(this, t), createRenderStates$2(this); + const n = e.passes; + (n.render || n.pick) && queueCommands$1(this, e); +}; +Vector3DTilePolylines.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTilePolylines.prototype.destroy = function() { + return this._va = this._va && this._va.destroy(), this._sp = this._sp && this._sp.destroy(), destroyObject(this); +}; +const Vector3DTileClampedPolylinesVS = `in vec3 startEllipsoidNormal; +in vec3 endEllipsoidNormal; +in vec4 startPositionAndHeight; +in vec4 endPositionAndHeight; +in vec4 startFaceNormalAndVertexCorner; +in vec4 endFaceNormalAndHalfWidth; +in float a_batchId; + +uniform mat4 u_modifiedModelView; +uniform vec2 u_minimumMaximumVectorHeights; + +out vec4 v_startPlaneEC; +out vec4 v_endPlaneEC; +out vec4 v_rightPlaneEC; +out float v_halfWidth; +out vec3 v_volumeUpEC; + +void main() +{ + // vertex corner IDs + // 3-----------7 + // /| left /| + // / | 1 / | + // 2-----------6 5 end + // | / | / + // start |/ right |/ + // 0-----------4 + // + float isEnd = floor(startFaceNormalAndVertexCorner.w * 0.251); // 0 for front, 1 for end + float isTop = floor(startFaceNormalAndVertexCorner.w * mix(0.51, 0.19, isEnd)); // 0 for bottom, 1 for top + + vec3 forward = endPositionAndHeight.xyz - startPositionAndHeight.xyz; + vec3 right = normalize(cross(forward, startEllipsoidNormal)); + + vec4 position = vec4(startPositionAndHeight.xyz, 1.0); + position.xyz += forward * isEnd; + + v_volumeUpEC = czm_normal * normalize(cross(right, forward)); + + // Push for volume height + float offset; + vec3 ellipsoidNormal = mix(startEllipsoidNormal, endEllipsoidNormal, isEnd); + + // offset height to create volume + offset = mix(startPositionAndHeight.w, endPositionAndHeight.w, isEnd); + offset = mix(u_minimumMaximumVectorHeights.y, u_minimumMaximumVectorHeights.x, isTop) - offset; + position.xyz += offset * ellipsoidNormal; + + // move from RTC to EC + position = u_modifiedModelView * position; + right = czm_normal * right; + + // Push for width in a direction that is in the start or end plane and in a plane with right + // N = normalEC ("right-facing" direction for push) + // R = right + // p = angle between N and R + // w = distance to push along R if R == N + // d = distance to push along N + // + // N R + // { p| } * cos(p) = dot(N, R) = w / d + // d | |w * d = w / dot(N, R) + // { | } + // o---------- polyline segment ----> + // + vec3 scratchNormal = mix(-startFaceNormalAndVertexCorner.xyz, endFaceNormalAndHalfWidth.xyz, isEnd); + scratchNormal = cross(scratchNormal, mix(startEllipsoidNormal, endEllipsoidNormal, isEnd)); + vec3 miterPushNormal = czm_normal * normalize(scratchNormal); + + offset = 2.0 * endFaceNormalAndHalfWidth.w * max(0.0, czm_metersPerPixel(position)); // offset = widthEC + offset = offset / dot(miterPushNormal, right); + position.xyz += miterPushNormal * (offset * sign(0.5 - mod(startFaceNormalAndVertexCorner.w, 2.0))); + + gl_Position = czm_depthClamp(czm_projection * position); + + position = u_modifiedModelView * vec4(startPositionAndHeight.xyz, 1.0); + vec3 startNormalEC = czm_normal * startFaceNormalAndVertexCorner.xyz; + v_startPlaneEC = vec4(startNormalEC, -dot(startNormalEC, position.xyz)); + v_rightPlaneEC = vec4(right, -dot(right, position.xyz)); + + position = u_modifiedModelView * vec4(endPositionAndHeight.xyz, 1.0); + vec3 endNormalEC = czm_normal * endFaceNormalAndHalfWidth.xyz; + v_endPlaneEC = vec4(endNormalEC, -dot(endNormalEC, position.xyz)); + v_halfWidth = endFaceNormalAndHalfWidth.w; +} +`, Vector3DTileClampedPolylinesFS = `in vec4 v_startPlaneEC; +in vec4 v_endPlaneEC; +in vec4 v_rightPlaneEC; +in float v_halfWidth; +in vec3 v_volumeUpEC; + +uniform vec4 u_highlightColor; +void main() +{ + float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw))); + + // Discard for sky + if (logDepthOrDepth == 0.0) { +#ifdef DEBUG_SHOW_VOLUME + out_FragColor = vec4(0.0, 0.0, 1.0, 0.5); + return; +#else // DEBUG_SHOW_VOLUME + discard; +#endif // DEBUG_SHOW_VOLUME + } + + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); + eyeCoordinate /= eyeCoordinate.w; + + float halfMaxWidth = v_halfWidth * czm_metersPerPixel(eyeCoordinate); + + // Expand halfMaxWidth if direction to camera is almost perpendicular with the volume's up direction + halfMaxWidth += halfMaxWidth * (1.0 - dot(-normalize(eyeCoordinate.xyz), v_volumeUpEC)); + + // Check distance of the eye coordinate against the right-facing plane + float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz); + + // Check eye coordinate against the mitering planes + float distanceFromStart = czm_planeDistance(v_startPlaneEC, eyeCoordinate.xyz); + float distanceFromEnd = czm_planeDistance(v_endPlaneEC, eyeCoordinate.xyz); + + if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { +#ifdef DEBUG_SHOW_VOLUME + out_FragColor = vec4(logDepthOrDepth, 0.0, 0.0, 0.5); + return; +#else // DEBUG_SHOW_VOLUME + discard; +#endif // DEBUG_SHOW_VOLUME + } + out_FragColor = u_highlightColor; + + czm_writeDepthClamp(); +} +`; +function Vector3DTileClampedPolylines(e) { + this._positions = e.positions, this._widths = e.widths, this._counts = e.counts, this._batchIds = e.batchIds, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.WGS84), this._minimumHeight = e.minimumHeight, this._maximumHeight = e.maximumHeight, this._center = e.center, this._rectangle = e.rectangle, this._batchTable = e.batchTable, this._va = void 0, this._sp = void 0, this._rs = void 0, this._uniformMap = void 0, this._command = void 0, this._transferrableBatchIds = void 0, this._packedBuffer = void 0, this._minimumMaximumVectorHeights = new Cartesian2( + ApproximateTerrainHeights._defaultMinTerrainHeight, + ApproximateTerrainHeights._defaultMaxTerrainHeight + ), this._boundingVolume = OrientedBoundingBox.fromRectangle( + e.rectangle, + ApproximateTerrainHeights._defaultMinTerrainHeight, + ApproximateTerrainHeights._defaultMaxTerrainHeight, + this._ellipsoid + ), this._classificationType = e.classificationType, this._keepDecodedPositions = e.keepDecodedPositions, this._decodedPositions = void 0, this._decodedPositionOffsets = void 0, this._startEllipsoidNormals = void 0, this._endEllipsoidNormals = void 0, this._startPositionAndHeights = void 0, this._startFaceNormalAndVertexCornerIds = void 0, this._endPositionAndHeights = void 0, this._endFaceNormalAndHalfWidths = void 0, this._vertexBatchIds = void 0, this._indices = void 0, this._constantColor = Color.clone(Color.WHITE), this._highlightColor = this._constantColor, this._trianglesLength = 0, this._geometryByteLength = 0, this._ready = !1, this._promise = void 0, this._error = void 0; +} +Object.defineProperties(Vector3DTileClampedPolylines.prototype, { + /** + * Gets the number of triangles. + * + * @memberof Vector3DTileClampedPolylines.prototype + * + * @type {number} + * @readonly + */ + trianglesLength: { + get: function() { + return this._trianglesLength; + } + }, + /** + * Gets the geometry memory in bytes. + * + * @memberof Vector3DTileClampedPolylines.prototype + * + * @type {number} + * @readonly + */ + geometryByteLength: { + get: function() { + return this._geometryByteLength; + } + }, + /** + * Returns true when the primitive is ready to render. + * @memberof Vector3DTileClampedPolylines.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + } +}); +function updateMinimumMaximumHeights(e, t, n) { + const i = ApproximateTerrainHeights.getMinimumMaximumHeights( + t, + n + ), r = i.minimumTerrainHeight, o = i.maximumTerrainHeight, s = e._minimumMaximumVectorHeights; + s.x = r, s.y = o; + const c = e._boundingVolume, l = e._rectangle; + OrientedBoundingBox.fromRectangle(l, r, o, n, c); +} +function packBuffer(e) { + const t = e._rectangle, n = e._minimumHeight, i = e._maximumHeight, r = e._ellipsoid, o = e._center, s = 2 + Rectangle.packedLength + Ellipsoid.packedLength + Cartesian3.packedLength, c = new Float64Array(s); + let l = 0; + return c[l++] = n, c[l++] = i, Rectangle.pack(t, c, l), l += Rectangle.packedLength, Ellipsoid.pack(r, c, l), l += Ellipsoid.packedLength, Cartesian3.pack(o, c, l), c; +} +const createVerticesTaskProcessor = new TaskProcessor( + "createVectorTileClampedPolylines" +), attributeLocations$3 = { + startEllipsoidNormal: 0, + endEllipsoidNormal: 1, + startPositionAndHeight: 2, + endPositionAndHeight: 3, + startFaceNormalAndVertexCorner: 4, + endFaceNormalAndHalfWidth: 5, + a_batchId: 6 +}; +function createVertexArray$1(e, t) { + if (defined(e._va)) + return; + let n = e._positions, i = e._widths, r = e._counts, o = e._transferrableBatchIds, s = e._packedBuffer; + defined(s) || (n = e._positions = n.slice(), i = e._widths = i.slice(), r = e._counts = r.slice(), o = e._transferrableBatchIds = e._batchIds.slice(), s = e._packedBuffer = packBuffer(e)); + const c = [ + n.buffer, + i.buffer, + r.buffer, + o.buffer, + s.buffer + ], l = { + positions: n.buffer, + widths: i.buffer, + counts: r.buffer, + batchIds: o.buffer, + packedBuffer: s.buffer, + keepDecodedPositions: e._keepDecodedPositions + }, d = createVerticesTaskProcessor.scheduleTask( + l, + c + ); + if (defined(d)) + return d.then(function(f) { + if (e.isDestroyed()) + return; + e._keepDecodedPositions && (e._decodedPositions = new Float64Array(f.decodedPositions), e._decodedPositionOffsets = new Uint32Array( + f.decodedPositionOffsets + )), e._startEllipsoidNormals = new Float32Array( + f.startEllipsoidNormals + ), e._endEllipsoidNormals = new Float32Array( + f.endEllipsoidNormals + ), e._startPositionAndHeights = new Float32Array( + f.startPositionAndHeights + ), e._startFaceNormalAndVertexCornerIds = new Float32Array( + f.startFaceNormalAndVertexCornerIds + ), e._endPositionAndHeights = new Float32Array( + f.endPositionAndHeights + ), e._endFaceNormalAndHalfWidths = new Float32Array( + f.endFaceNormalAndHalfWidths + ), e._vertexBatchIds = new Uint16Array(f.vertexBatchIds); + const h = f.indexDatatype; + e._indices = h === IndexDatatype$1.UNSIGNED_SHORT ? new Uint16Array(f.indices) : new Uint32Array(f.indices), finishVertexArray(e, t), e._ready = !0; + }).catch((f) => { + e.isDestroyed() || (e._error = f); + }); +} +function finishVertexArray(e, t) { + if (!defined(e._va)) { + const n = e._startEllipsoidNormals, i = e._endEllipsoidNormals, r = e._startPositionAndHeights, o = e._endPositionAndHeights, s = e._startFaceNormalAndVertexCornerIds, c = e._endFaceNormalAndHalfWidths, l = e._vertexBatchIds, d = e._indices; + let f = n.byteLength + i.byteLength; + f += r.byteLength + o.byteLength, f += s.byteLength + c.byteLength, f += l.byteLength + d.byteLength, e._trianglesLength = d.length / 3, e._geometryByteLength = f; + const h = Buffer.createVertexBuffer({ + context: t, + typedArray: n, + usage: BufferUsage$1.STATIC_DRAW + }), p = Buffer.createVertexBuffer({ + context: t, + typedArray: i, + usage: BufferUsage$1.STATIC_DRAW + }), m = Buffer.createVertexBuffer({ + context: t, + typedArray: r, + usage: BufferUsage$1.STATIC_DRAW + }), _ = Buffer.createVertexBuffer({ + context: t, + typedArray: o, + usage: BufferUsage$1.STATIC_DRAW + }), y = Buffer.createVertexBuffer({ + context: t, + typedArray: s, + usage: BufferUsage$1.STATIC_DRAW + }), C = Buffer.createVertexBuffer({ + context: t, + typedArray: c, + usage: BufferUsage$1.STATIC_DRAW + }), T = Buffer.createVertexBuffer({ + context: t, + typedArray: l, + usage: BufferUsage$1.STATIC_DRAW + }), x = Buffer.createIndexBuffer({ + context: t, + typedArray: d, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: d.BYTES_PER_ELEMENT === 2 ? IndexDatatype$1.UNSIGNED_SHORT : IndexDatatype$1.UNSIGNED_INT + }), b = [ + { + index: attributeLocations$3.startEllipsoidNormal, + vertexBuffer: h, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + index: attributeLocations$3.endEllipsoidNormal, + vertexBuffer: p, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3 + }, + { + index: attributeLocations$3.startPositionAndHeight, + vertexBuffer: m, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4 + }, + { + index: attributeLocations$3.endPositionAndHeight, + vertexBuffer: _, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4 + }, + { + index: attributeLocations$3.startFaceNormalAndVertexCorner, + vertexBuffer: y, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4 + }, + { + index: attributeLocations$3.endFaceNormalAndHalfWidth, + vertexBuffer: C, + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 4 + }, + { + index: attributeLocations$3.a_batchId, + vertexBuffer: T, + componentDatatype: ComponentDatatype$1.UNSIGNED_SHORT, + componentsPerAttribute: 1 + } + ]; + e._va = new VertexArray({ + context: t, + attributes: b, + indexBuffer: x + }), e._positions = void 0, e._widths = void 0, e._counts = void 0, e._ellipsoid = void 0, e._minimumHeight = void 0, e._maximumHeight = void 0, e._rectangle = void 0, e._transferrableBatchIds = void 0, e._packedBuffer = void 0, e._startEllipsoidNormals = void 0, e._endEllipsoidNormals = void 0, e._startPositionAndHeights = void 0, e._startFaceNormalAndVertexCornerIds = void 0, e._endPositionAndHeights = void 0, e._endFaceNormalAndHalfWidths = void 0, e._vertexBatchIds = void 0, e._indices = void 0; + } +} +const modifiedModelViewScratch$1 = new Matrix4(), rtcScratch$1 = new Cartesian3(); +function createUniformMap$3(e, t) { + defined(e._uniformMap) || (e._uniformMap = { + u_modifiedModelView: function() { + const n = t.uniformState.view; + return Matrix4.clone(n, modifiedModelViewScratch$1), Matrix4.multiplyByPoint( + modifiedModelViewScratch$1, + e._center, + rtcScratch$1 + ), Matrix4.setTranslation( + modifiedModelViewScratch$1, + rtcScratch$1, + modifiedModelViewScratch$1 + ), modifiedModelViewScratch$1; + }, + u_highlightColor: function() { + return e._highlightColor; + }, + u_minimumMaximumVectorHeights: function() { + return e._minimumMaximumVectorHeights; + } + }); +} +function getRenderState(e) { + return RenderState.fromCache({ + cull: { + enabled: !0, + face: CullFace$1.FRONT + }, + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND, + depthMask: !1, + stencilTest: { + enabled: e, + frontFunction: StencilFunction$1.EQUAL, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + backFunction: StencilFunction$1.EQUAL, + backOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + } + }); +} +function createRenderStates$1(e) { + defined(e._rs) || (e._rs = getRenderState(!1), e._rs3DTiles = getRenderState(!0)); +} +function createShaders$1(e, t) { + if (defined(e._sp)) + return; + const n = e._batchTable, i = n.getVertexShaderCallback( + !1, + "a_batchId", + void 0 + )(Vector3DTileClampedPolylinesVS), r = n.getFragmentShaderCallback( + !1, + void 0, + !0 + )(Vector3DTileClampedPolylinesFS), o = new ShaderSource({ + defines: [ + "VECTOR_TILE", + FeatureDetection.isInternetExplorer() ? "" : "CLIP_POLYLINE" + ], + sources: [PolylineCommon, i] + }), s = new ShaderSource({ + defines: ["VECTOR_TILE"], + sources: [r] + }); + e._sp = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: attributeLocations$3 + }); +} +function queueCommands(e, t) { + let n = e._command; + if (!defined(e._command)) { + const r = e._batchTable.getUniformMapCallback()( + e._uniformMap + ); + n = e._command = new DrawCommand({ + owner: e, + vertexArray: e._va, + renderState: e._rs, + shaderProgram: e._sp, + uniformMap: r, + boundingVolume: e._boundingVolume, + pass: Pass$1.TERRAIN_CLASSIFICATION, + pickId: e._batchTable.getPickId() + }); + const o = DrawCommand.shallowClone( + n, + n.derivedCommands.tileset + ); + o.renderState = e._rs3DTiles, o.pass = Pass$1.CESIUM_3D_TILE_CLASSIFICATION, n.derivedCommands.tileset = o; + } + const i = e._classificationType; + (i === ClassificationType$1.TERRAIN || i === ClassificationType$1.BOTH) && t.commandList.push(n), (i === ClassificationType$1.CESIUM_3D_TILE || i === ClassificationType$1.BOTH) && t.commandList.push(n.derivedCommands.tileset); +} +Vector3DTileClampedPolylines.prototype.getPositions = function(e) { + return Vector3DTilePolylines.getPolylinePositions(this, e); +}; +Vector3DTileClampedPolylines.prototype.createFeatures = function(e, t) { + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + t[o] = new Cesium3DTileFeature(e, o); + } +}; +Vector3DTileClampedPolylines.prototype.applyDebugSettings = function(e, t) { + this._highlightColor = e ? t : this._constantColor; +}; +function clearStyle(e, t) { + const n = e._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + s.show = !0, s.color = Color.WHITE; + } +} +const scratchColor$f = new Color(), DEFAULT_COLOR_VALUE = Color.WHITE, DEFAULT_SHOW_VALUE = !0; +Vector3DTileClampedPolylines.prototype.applyStyle = function(e, t) { + if (!defined(e)) { + clearStyle(this, t); + return; + } + const n = this._batchIds, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r], s = t[o]; + s.color = defined(e.color) ? e.color.evaluateColor(s, scratchColor$f) : DEFAULT_COLOR_VALUE, s.show = defined(e.show) ? e.show.evaluate(s) : DEFAULT_SHOW_VALUE; + } +}; +function initialize$3(e) { + return ApproximateTerrainHeights.initialize().then(function() { + updateMinimumMaximumHeights( + e, + e._rectangle, + e._ellipsoid + ); + }).catch((t) => { + e.isDestroyed() || (e._error = t); + }); +} +Vector3DTileClampedPolylines.prototype.update = function(e) { + const t = e.context; + if (!this._ready) { + if (defined(this._promise) || (this._promise = initialize$3(this).then(createVertexArray$1(this, t))), defined(this._error)) { + const i = this._error; + throw this._error = void 0, i; + } + return; + } + createUniformMap$3(this, t), createShaders$1(this, t), createRenderStates$1(this); + const n = e.passes; + (n.render || n.pick) && queueCommands(this, e); +}; +Vector3DTileClampedPolylines.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTileClampedPolylines.prototype.destroy = function() { + return this._va = this._va && this._va.destroy(), this._sp = this._sp && this._sp.destroy(), destroyObject(this); +}; +const maxShort$1 = 32767, scratchBVCartographic = new Cartographic(), scratchEncodedPosition = new Cartesian3(); +function decodeVectorPolylinePositions(e, t, n, i, r) { + const o = e.length / 3, s = e.subarray(0, o), c = e.subarray(o, 2 * o), l = e.subarray( + 2 * o, + 3 * o + ); + AttributeCompression.zigZagDeltaDecode(s, c, l); + const d = new Float64Array(e.length); + for (let f = 0; f < o; ++f) { + const h = s[f], p = c[f], m = l[f], _ = CesiumMath.lerp(t.west, t.east, h / maxShort$1), y = CesiumMath.lerp(t.south, t.north, p / maxShort$1), C = CesiumMath.lerp(n, i, m / maxShort$1), T = Cartographic.fromRadians( + _, + y, + C, + scratchBVCartographic + ), x = r.cartographicToCartesian( + T, + scratchEncodedPosition + ); + Cartesian3.pack(x, d, f * 3); + } + return d; +} +function Vector3DTileContent(e, t, n, i, r) { + this._tileset = e, this._tile = t, this._resource = n, this._polygons = void 0, this._polylines = void 0, this._points = void 0, this._metadata = void 0, this._batchTable = void 0, this._features = void 0, this.featurePropertiesDirty = !1, this._group = void 0, this._ready = !1, initialize$2(this, i, r); +} +Object.defineProperties(Vector3DTileContent.prototype, { + featuresLength: { + get: function() { + return defined(this._batchTable) ? this._batchTable.featuresLength : 0; + } + }, + pointsLength: { + get: function() { + return defined(this._points) ? this._points.pointsLength : 0; + } + }, + trianglesLength: { + get: function() { + let e = 0; + return defined(this._polygons) && (e += this._polygons.trianglesLength), defined(this._polylines) && (e += this._polylines.trianglesLength), e; + } + }, + geometryByteLength: { + get: function() { + let e = 0; + return defined(this._polygons) && (e += this._polygons.geometryByteLength), defined(this._polylines) && (e += this._polylines.geometryByteLength), e; + } + }, + texturesByteLength: { + get: function() { + return defined(this._points) ? this._points.texturesByteLength : 0; + } + }, + batchTableByteLength: { + get: function() { + return defined(this._batchTable) ? this._batchTable.batchTableByteLength : 0; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Vector3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._ready; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + return this._resource.getUrlComponent(!0); + } + }, + metadata: { + get: function() { + return this._metadata; + }, + set: function(e) { + this._metadata = e; + } + }, + batchTable: { + get: function() { + return this._batchTable; + } + }, + group: { + get: function() { + return this._group; + }, + set: function(e) { + this._group = e; + } + } +}); +function createColorChangedCallback(e) { + return function(t, n) { + defined(e._polygons) && e._polygons.updateCommands(t, n); + }; +} +function getBatchIds(e, t) { + let n, i, r, o; + const s = defaultValue(e.POLYGONS_LENGTH, 0), c = defaultValue(e.POLYLINES_LENGTH, 0), l = defaultValue(e.POINTS_LENGTH, 0); + if (s > 0 && defined(e.POLYGON_BATCH_IDS)) { + const p = t.byteOffset + e.POLYGON_BATCH_IDS.byteOffset; + n = new Uint16Array( + t.buffer, + p, + s + ); + } + if (c > 0 && defined(e.POLYLINE_BATCH_IDS)) { + const p = t.byteOffset + e.POLYLINE_BATCH_IDS.byteOffset; + i = new Uint16Array( + t.buffer, + p, + c + ); + } + if (l > 0 && defined(e.POINT_BATCH_IDS)) { + const p = t.byteOffset + e.POINT_BATCH_IDS.byteOffset; + r = new Uint16Array( + t.buffer, + p, + l + ); + } + const d = defined(n) || defined(i) || defined(r), f = s > 0 && !defined(n) || c > 0 && !defined(i) || l > 0 && !defined(r); + if (d && f) + throw new RuntimeError( + "If one group of batch ids is defined, then all batch ids must be defined" + ); + if (!defined(n) && !defined(i) && !defined(r)) { + let p = 0; + if (!defined(n) && s > 0) + for (n = new Uint16Array(s), o = 0; o < s; ++o) + n[o] = p++; + if (!defined(i) && c > 0) + for (i = new Uint16Array(c), o = 0; o < c; ++o) + i[o] = p++; + if (!defined(r) && l > 0) + for (r = new Uint16Array(l), o = 0; o < l; ++o) + r[o] = p++; + } + return { + polygons: n, + polylines: i, + points: r + }; +} +const sizeOfUint32$1 = Uint32Array.BYTES_PER_ELEMENT; +function createFloatingPolylines(e) { + return new Vector3DTilePolylines(e); +} +function createClampedPolylines(e) { + return new Vector3DTileClampedPolylines(e); +} +function initialize$2(e, t, n) { + n = defaultValue(n, 0); + const i = new Uint8Array(t), r = new DataView(t); + n += sizeOfUint32$1; + const o = r.getUint32(n, !0); + if (o !== 1) + throw new RuntimeError( + `Only Vector tile version 1 is supported. Version ${o} is not.` + ); + n += sizeOfUint32$1; + const s = r.getUint32(n, !0); + if (n += sizeOfUint32$1, s === 0) { + e._ready = !0; + return; + } + const c = r.getUint32(n, !0); + if (n += sizeOfUint32$1, c === 0) + throw new RuntimeError( + "Feature table must have a byte length greater than zero" + ); + const l = r.getUint32(n, !0); + n += sizeOfUint32$1; + const d = r.getUint32(n, !0); + n += sizeOfUint32$1; + const f = r.getUint32(n, !0); + n += sizeOfUint32$1; + const h = r.getUint32(n, !0); + n += sizeOfUint32$1; + const p = r.getUint32(n, !0); + n += sizeOfUint32$1; + const m = r.getUint32(n, !0); + n += sizeOfUint32$1; + const _ = r.getUint32(n, !0); + n += sizeOfUint32$1; + const y = getJsonFromTypedArray( + i, + n, + c + ); + n += c; + const C = new Uint8Array( + t, + n, + l + ); + n += l; + let T, x; + d > 0 && (T = getJsonFromTypedArray( + i, + n, + d + ), n += d, f > 0 && (x = new Uint8Array( + t, + n, + f + ), x = new Uint8Array(x), n += f)); + const b = defaultValue(y.POLYGONS_LENGTH, 0), S = defaultValue(y.POLYLINES_LENGTH, 0), E = defaultValue(y.POINTS_LENGTH, 0), A = b + S + E, D = new Cesium3DTileBatchTable( + e, + A, + T, + x, + createColorChangedCallback(e) + ); + if (e._batchTable = D, A === 0) + return; + const P = new Cesium3DTileFeatureTable( + y, + C + ), I = P.getGlobalProperty("REGION"); + if (!defined(I)) + throw new RuntimeError( + "Feature table global property: REGION must be defined" + ); + const M = Rectangle.unpack(I), R = I[4], L = I[5], g = e._tile.computedTransform; + let w = P.getGlobalProperty( + "RTC_CENTER", + ComponentDatatype$1.FLOAT, + 3 + ); + defined(w) ? (w = Cartesian3.unpack(w), Matrix4.multiplyByPoint(g, w, w)) : (w = Rectangle.center(M), w.height = CesiumMath.lerp(R, L, 0.5), w = Ellipsoid.WGS84.cartographicToCartesian(w)); + const O = getBatchIds(y, C); + if (n += (4 - n % 4) % 4, b > 0) { + P.featuresLength = b; + const N = defaultValue( + P.getPropertyArray( + "POLYGON_COUNTS", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ), + P.getPropertyArray( + "POLYGON_COUNT", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ) + // Workaround for old vector tilesets using the non-plural name + ); + if (!defined(N)) + throw new RuntimeError( + "Feature table property: POLYGON_COUNTS must be defined when POLYGONS_LENGTH is greater than 0" + ); + const F = defaultValue( + P.getPropertyArray( + "POLYGON_INDEX_COUNTS", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ), + P.getPropertyArray( + "POLYGON_INDEX_COUNT", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ) + // Workaround for old vector tilesets using the non-plural name + ); + if (!defined(F)) + throw new RuntimeError( + "Feature table property: POLYGON_INDEX_COUNTS must be defined when POLYGONS_LENGTH is greater than 0" + ); + const B = N.reduce(function(q, z) { + return q + z * 2; + }, 0), V = F.reduce( + function(q, z) { + return q + z; + }, + 0 + ), U = new Uint32Array(t, n, V); + n += h; + const k = new Uint16Array( + t, + n, + B + ); + n += p; + let $, G; + defined(y.POLYGON_MINIMUM_HEIGHTS) && defined(y.POLYGON_MAXIMUM_HEIGHTS) && ($ = P.getPropertyArray( + "POLYGON_MINIMUM_HEIGHTS", + ComponentDatatype$1.FLOAT, + 1 + ), G = P.getPropertyArray( + "POLYGON_MAXIMUM_HEIGHTS", + ComponentDatatype$1.FLOAT, + 1 + )), e._polygons = new Vector3DTilePolygons({ + positions: k, + counts: N, + indexCounts: F, + indices: U, + minimumHeight: R, + maximumHeight: L, + polygonMinimumHeights: $, + polygonMaximumHeights: G, + center: w, + rectangle: M, + boundingVolume: e.tile.boundingVolume.boundingVolume, + batchTable: D, + batchIds: O.polygons, + modelMatrix: g + }); + } + if (S > 0) { + P.featuresLength = S; + const N = defaultValue( + P.getPropertyArray( + "POLYLINE_COUNTS", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ), + P.getPropertyArray( + "POLYLINE_COUNT", + ComponentDatatype$1.UNSIGNED_INT, + 1 + ) + // Workaround for old vector tilesets using the non-plural name + ); + if (!defined(N)) + throw new RuntimeError( + "Feature table property: POLYLINE_COUNTS must be defined when POLYLINES_LENGTH is greater than 0" + ); + let F = P.getPropertyArray( + "POLYLINE_WIDTHS", + ComponentDatatype$1.UNSIGNED_SHORT, + 1 + ); + if (!defined(F)) { + F = new Uint16Array(S); + for (let G = 0; G < S; ++G) + F[G] = 2; + } + const B = N.reduce(function(G, q) { + return G + q * 3; + }, 0), V = new Uint16Array( + t, + n, + B + ); + n += m; + const U = e._tileset, k = U.examineVectorLinesFunction; + if (defined(k)) { + const G = decodeVectorPolylinePositions( + new Uint16Array(V), + M, + R, + L, + Ellipsoid.WGS84 + ); + examineVectorLines( + G, + N, + O.polylines, + D, + e.url, + k + ); + } + let $ = createFloatingPolylines; + defined(U.classificationType) && ($ = createClampedPolylines), e._polylines = $({ + positions: V, + widths: F, + counts: N, + batchIds: O.polylines, + minimumHeight: R, + maximumHeight: L, + center: w, + rectangle: M, + boundingVolume: e.tile.boundingVolume.boundingVolume, + batchTable: D, + classificationType: U.classificationType, + keepDecodedPositions: U.vectorKeepDecodedPositions + }); + } + if (E > 0) { + const N = new Uint16Array( + t, + n, + E * 3 + ); + n += _, e._points = new Vector3DTilePoints({ + positions: N, + batchIds: O.points, + minimumHeight: R, + maximumHeight: L, + rectangle: M, + batchTable: D + }); + } +} +function createFeatures(e) { + const t = e.featuresLength; + if (!defined(e._features) && t > 0) { + const n = new Array(t); + defined(e._polygons) && e._polygons.createFeatures(e, n), defined(e._polylines) && e._polylines.createFeatures(e, n), defined(e._points) && e._points.createFeatures(e, n), e._features = n; + } +} +Vector3DTileContent.prototype.hasProperty = function(e, t) { + return this._batchTable.hasProperty(e, t); +}; +Vector3DTileContent.prototype.getFeature = function(e) { + return defined(this._features) || createFeatures(this), this._features[e]; +}; +Vector3DTileContent.prototype.applyDebugSettings = function(e, t) { + defined(this._polygons) && this._polygons.applyDebugSettings(e, t), defined(this._polylines) && this._polylines.applyDebugSettings(e, t), defined(this._points) && this._points.applyDebugSettings(e, t); +}; +Vector3DTileContent.prototype.applyStyle = function(e) { + defined(this._features) || createFeatures(this), defined(this._polygons) && this._polygons.applyStyle(e, this._features), defined(this._polylines) && this._polylines.applyStyle(e, this._features), defined(this._points) && this._points.applyStyle(e, this._features); +}; +Vector3DTileContent.prototype.update = function(e, t) { + let n = !0; + defined(this._polygons) && (this._polygons.classificationType = this._tileset.classificationType, this._polygons.debugWireframe = this._tileset.debugWireframe, this._polygons.update(t), n = n && this._polygons.ready), defined(this._polylines) && (this._polylines.update(t), n = n && this._polylines.ready), defined(this._points) && (this._points.update(t), n = n && this._points.ready), defined(this._batchTable) && n && (defined(this._features) || createFeatures(this), this._batchTable.update(e, t), this._ready = !0); +}; +Vector3DTileContent.prototype.pick = function(e, t, n) { +}; +Vector3DTileContent.prototype.getPolylinePositions = function(e) { + const t = this._polylines; + if (defined(t)) + return t.getPositions(e); +}; +Vector3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Vector3DTileContent.prototype.destroy = function() { + return this._polygons = this._polygons && this._polygons.destroy(), this._polylines = this._polylines && this._polylines.destroy(), this._points = this._points && this._points.destroy(), this._batchTable = this._batchTable && this._batchTable.destroy(), destroyObject(this); +}; +function examineVectorLines(e, t, n, i, r, o) { + const s = t.length; + let c = 0; + for (let l = 0; l < s; l++) { + const d = t[l] * 3, f = e.slice(c, c + d); + c += d, o(f, n[l], r, i); + } +} +const Cesium3DTileContentFactory = { + b3dm: function(e, t, n, i, r) { + return Model3DTileContent.fromB3dm( + e, + t, + n, + i, + r + ); + }, + pnts: function(e, t, n, i, r) { + return Model3DTileContent.fromPnts( + e, + t, + n, + i, + r + ); + }, + i3dm: function(e, t, n, i, r) { + return Model3DTileContent.fromI3dm( + e, + t, + n, + i, + r + ); + }, + cmpt: function(e, t, n, i, r) { + return Composite3DTileContent.fromTileType( + e, + t, + n, + i, + r, + Cesium3DTileContentFactory + ); + }, + externalTileset: function(e, t, n, i) { + return Tileset3DTileContent.fromJson(e, t, n, i); + }, + geom: function(e, t, n, i, r) { + return new Geometry3DTileContent( + e, + t, + n, + i, + r + ); + }, + vctr: function(e, t, n, i, r) { + return new Vector3DTileContent( + e, + t, + n, + i, + r + ); + }, + subt: function(e, t, n, i, r) { + return Implicit3DTileContent.fromSubtreeJson( + e, + t, + n, + void 0, + i, + r + ); + }, + subtreeJson: function(e, t, n, i) { + return Implicit3DTileContent.fromSubtreeJson(e, t, n, i); + }, + glb: function(e, t, n, i, r) { + if (i.byteLength < 12) + throw new RuntimeError("Invalid glb content"); + const c = new DataView(i, r).getUint32(8, !0), l = new Uint8Array(i, r, c); + return Model3DTileContent.fromGltf(e, t, n, l); + }, + gltf: function(e, t, n, i) { + return Model3DTileContent.fromGltf(e, t, n, i); + }, + geoJson: function(e, t, n, i) { + return Model3DTileContent.fromGeoJson(e, t, n, i); + } +}, Cesium3DTileContentState = { + UNLOADED: 0, + // Has never been requested + LOADING: 1, + // Is waiting on a pending request + PROCESSING: 2, + // Request received. Contents are being processed for rendering. Depending on the content, it might make its own requests for external data. + READY: 3, + // Ready to render. + EXPIRED: 4, + // Is expired and will be unloaded once new content is loaded. + FAILED: 5 + // Request failed. +}, Cesium3DTileContentState$1 = Object.freeze(Cesium3DTileContentState), Cesium3DTileContentType = { + /** + * A Batched 3D Model. This is a binary format with + * magic number b3dm + * + * @type {string} + * @constant + * @private + */ + BATCHED_3D_MODEL: "b3dm", + /** + * An Instanced 3D Model. This is a binary format with magic number + * i3dm + * + * @type {string} + * @constant + * @private + */ + INSTANCED_3D_MODEL: "i3dm", + /** + * A Composite model. This is a binary format with magic number + * cmpt + * + * @type {string} + * @constant + * @private + */ + COMPOSITE: "cmpt", + /** + * A Point Cloud model. This is a binary format with magic number + * pnts + * + * @type {string} + * @constant + * @private + */ + POINT_CLOUD: "pnts", + /** + * Vector tiles. This is a binary format with magic number + * vctr + * + * @type {string} + * @constant + * @private + */ + VECTOR: "vctr", + /** + * Geometry tiles. This is a binary format with magic number + * geom + * + * @type {string} + * @constant + * @private + */ + GEOMETRY: "geom", + /** + * A glTF model in JSON + external BIN form. This is treated + * as a JSON format. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + GLTF: "gltf", + /** + * The binary form of a glTF file. Internally, the magic number is + * changed from glTF to glb to distinguish it from + * the JSON glTF format. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + GLTF_BINARY: "glb", + /** + * For implicit tiling, availability bitstreams are stored in binary subtree files. + * The magic number is subt + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + IMPLICIT_SUBTREE: "subt", + /** + * For implicit tiling. Subtrees can also be represented as JSON files. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + IMPLICIT_SUBTREE_JSON: "subtreeJson", + /** + * Contents can reference another tileset.json to use + * as an external tileset. This is a JSON-based format. + * + * @type {string} + * @constant + * @private + */ + EXTERNAL_TILESET: "externalTileset", + /** + * Multiple contents are handled separately from the other content types + * due to differences in request scheduling. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + MULTIPLE_CONTENT: "multipleContent", + /** + * GeoJSON content for MAXAR_content_geojson extension. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + GEOJSON: "geoJson", + /** + * Binary voxel content for 3DTILES_content_voxels extension. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + VOXEL_BINARY: "voxl", + /** + * Binary voxel content for 3DTILES_content_voxels extension. + * + * @type {string} + * @constant + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + VOXEL_JSON: "voxelJson" +}; +Cesium3DTileContentType.isBinaryFormat = function(e) { + switch (e) { + case Cesium3DTileContentType.BATCHED_3D_MODEL: + case Cesium3DTileContentType.INSTANCED_3D_MODEL: + case Cesium3DTileContentType.COMPOSITE: + case Cesium3DTileContentType.POINT_CLOUD: + case Cesium3DTileContentType.VECTOR: + case Cesium3DTileContentType.GEOMETRY: + case Cesium3DTileContentType.IMPLICIT_SUBTREE: + case Cesium3DTileContentType.VOXEL_BINARY: + case Cesium3DTileContentType.GLTF_BINARY: + return !0; + default: + return !1; + } +}; +const Cesium3DTileContentType$1 = Object.freeze(Cesium3DTileContentType), Cesium3DTileOptimizationHint = { + NOT_COMPUTED: -1, + USE_OPTIMIZATION: 1, + SKIP_OPTIMIZATION: 0 +}, Cesium3DTileOptimizationHint$1 = Object.freeze(Cesium3DTileOptimizationHint), Cesium3DTilePass = { + RENDER: 0, + PICK: 1, + SHADOW: 2, + PRELOAD: 3, + PRELOAD_FLIGHT: 4, + REQUEST_RENDER_MODE_DEFER_CHECK: 5, + MOST_DETAILED_PRELOAD: 6, + MOST_DETAILED_PICK: 7, + NUMBER_OF_PASSES: 8 +}, passOptions = new Array(Cesium3DTilePass.NUMBER_OF_PASSES); +passOptions[Cesium3DTilePass.RENDER] = Object.freeze({ + pass: Cesium3DTilePass.RENDER, + isRender: !0, + requestTiles: !0, + ignoreCommands: !1 +}); +passOptions[Cesium3DTilePass.PICK] = Object.freeze({ + pass: Cesium3DTilePass.PICK, + isRender: !1, + requestTiles: !1, + ignoreCommands: !1 +}); +passOptions[Cesium3DTilePass.SHADOW] = Object.freeze({ + pass: Cesium3DTilePass.SHADOW, + isRender: !1, + requestTiles: !0, + ignoreCommands: !1 +}); +passOptions[Cesium3DTilePass.PRELOAD] = Object.freeze({ + pass: Cesium3DTilePass.PRELOAD, + isRender: !1, + requestTiles: !0, + ignoreCommands: !0 +}); +passOptions[Cesium3DTilePass.PRELOAD_FLIGHT] = Object.freeze({ + pass: Cesium3DTilePass.PRELOAD_FLIGHT, + isRender: !1, + requestTiles: !0, + ignoreCommands: !0 +}); +passOptions[Cesium3DTilePass.REQUEST_RENDER_MODE_DEFER_CHECK] = Object.freeze({ + pass: Cesium3DTilePass.REQUEST_RENDER_MODE_DEFER_CHECK, + isRender: !1, + requestTiles: !0, + ignoreCommands: !0 +}); +passOptions[Cesium3DTilePass.MOST_DETAILED_PRELOAD] = Object.freeze({ + pass: Cesium3DTilePass.MOST_DETAILED_PRELOAD, + isRender: !1, + requestTiles: !0, + ignoreCommands: !0 +}); +passOptions[Cesium3DTilePass.MOST_DETAILED_PICK] = Object.freeze({ + pass: Cesium3DTilePass.MOST_DETAILED_PICK, + isRender: !1, + requestTiles: !1, + ignoreCommands: !1 +}); +Cesium3DTilePass.getPassOptions = function(e) { + return passOptions[e]; +}; +const Cesium3DTilePass$1 = Object.freeze(Cesium3DTilePass); +function Empty3DTileContent(e, t) { + this._tileset = e, this._tile = t, this.featurePropertiesDirty = !1; +} +Object.defineProperties(Empty3DTileContent.prototype, { + featuresLength: { + get: function() { + return 0; + } + }, + pointsLength: { + get: function() { + return 0; + } + }, + trianglesLength: { + get: function() { + return 0; + } + }, + geometryByteLength: { + get: function() { + return 0; + } + }, + texturesByteLength: { + get: function() { + return 0; + } + }, + batchTableByteLength: { + get: function() { + return 0; + } + }, + innerContents: { + get: function() { + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Empty3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return !0; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + url: { + get: function() { + } + }, + metadata: { + get: function() { + }, + set: function(e) { + } + }, + batchTable: { + get: function() { + } + }, + group: { + get: function() { + }, + set: function(e) { + } + } +}); +Empty3DTileContent.prototype.hasProperty = function(e, t) { + return !1; +}; +Empty3DTileContent.prototype.getFeature = function(e) { +}; +Empty3DTileContent.prototype.applyDebugSettings = function(e, t) { +}; +Empty3DTileContent.prototype.applyStyle = function(e) { +}; +Empty3DTileContent.prototype.update = function(e, t) { +}; +Empty3DTileContent.prototype.pick = function(e, t, n) { +}; +Empty3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Empty3DTileContent.prototype.destroy = function() { + return destroyObject(this); +}; +function ContentMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.content, n = e.class; + this._class = n, this._properties = t.properties, this._extensions = t.extensions, this._extras = t.extras; +} +Object.defineProperties(ContentMetadata.prototype, { + /** + * The class that properties conform to. + * + * @memberof ContentMetadata.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof ContentMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof ContentMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +ContentMetadata.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +ContentMetadata.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +ContentMetadata.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +ContentMetadata.prototype.getProperty = function(e) { + return MetadataEntity.getProperty(e, this._properties, this._class); +}; +ContentMetadata.prototype.setProperty = function(e, t) { + return MetadataEntity.setProperty( + e, + t, + this._properties, + this._class + ); +}; +ContentMetadata.prototype.getPropertyBySemantic = function(e) { + return MetadataEntity.getPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +ContentMetadata.prototype.setPropertyBySemantic = function(e, t) { + return MetadataEntity.setPropertyBySemantic( + e, + t, + this._properties, + this._class + ); +}; +function findContentMetadata(e, t) { + const n = hasExtension(t, "3DTILES_metadata") ? t.extensions["3DTILES_metadata"] : t.metadata; + if (!defined(n)) + return; + if (!defined(e.schema)) { + findContentMetadata._oneTimeWarning( + "findContentMetadata-missing-root-schema", + "Could not find a metadata schema for content metadata. For tilesets that contain external tilesets, make sure the schema is added to the root tileset.json." + ); + return; + } + const i = defaultValue( + e.schema.classes, + defaultValue.EMPTY_OBJECT + ); + if (defined(n.class)) { + const r = i[n.class]; + return new ContentMetadata({ + content: n, + class: r + }); + } +} +findContentMetadata._oneTimeWarning = oneTimeWarning; +function findGroupMetadata(e, t) { + const n = e.metadataExtension; + if (!defined(n)) + return; + const i = n.groups, r = hasExtension(t, "3DTILES_metadata") ? t.extensions["3DTILES_metadata"].group : t.group; + if (typeof r == "number") + return i[r]; + const o = n.groupIds.findIndex(function(s) { + return s === r; + }); + return o >= 0 ? i[o] : void 0; +} +function TileMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.tile, n = e.class; + this._class = n, this._properties = t.properties, this._extensions = t.extensions, this._extras = t.extras; +} +Object.defineProperties(TileMetadata.prototype, { + /** + * The class that properties conform to. + * + * @memberof TileMetadata.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof TileMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof TileMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +TileMetadata.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +TileMetadata.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +TileMetadata.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +TileMetadata.prototype.getProperty = function(e) { + return MetadataEntity.getProperty(e, this._properties, this._class); +}; +TileMetadata.prototype.setProperty = function(e, t) { + return MetadataEntity.setProperty( + e, + t, + this._properties, + this._class + ); +}; +TileMetadata.prototype.getPropertyBySemantic = function(e) { + return MetadataEntity.getPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +TileMetadata.prototype.setPropertyBySemantic = function(e, t) { + return MetadataEntity.setPropertyBySemantic( + e, + t, + this._properties, + this._class + ); +}; +function findTileMetadata(e, t) { + const n = hasExtension(t, "3DTILES_metadata") ? t.extensions["3DTILES_metadata"] : t.metadata; + if (!defined(n)) + return; + if (!defined(e.schema)) { + findTileMetadata._oneTimeWarning( + "findTileMetadata-missing-root-schema", + "Could not find a metadata schema for tile metadata. For tilesets that contain external tilesets, make sure the schema is added to the root tileset.json." + ); + return; + } + const i = defaultValue( + e.schema.classes, + defaultValue.EMPTY_OBJECT + ); + if (defined(n.class)) { + const r = i[n.class]; + return new TileMetadata({ + tile: n, + class: r + }); + } +} +findTileMetadata._oneTimeWarning = oneTimeWarning; +function preprocess3DTileContent(e) { + const t = new Uint8Array(e); + let n = getMagic(t); + if (n === "glTF" && (n = "glb"), Cesium3DTileContentType$1.isBinaryFormat(n)) + return { + // For binary files, the enum value is the magic number + contentType: n, + binaryPayload: t + }; + const i = getJsonContent(t); + if (defined(i.root)) + return { + contentType: Cesium3DTileContentType$1.EXTERNAL_TILESET, + jsonPayload: i + }; + if (defined(i.asset)) + return { + contentType: Cesium3DTileContentType$1.GLTF, + jsonPayload: i + }; + if (defined(i.tileAvailability)) + return { + contentType: Cesium3DTileContentType$1.IMPLICIT_SUBTREE_JSON, + jsonPayload: i + }; + if (defined(i.type)) + return { + contentType: Cesium3DTileContentType$1.GEOJSON, + jsonPayload: i + }; + if (defined(i.voxelTable)) + return { + contentType: Cesium3DTileContentType$1.VOXEL_JSON, + jsonPayload: i + }; + throw new RuntimeError("Invalid tile content."); +} +function getJsonContent(e) { + let t; + try { + t = getJsonFromTypedArray(e); + } catch { + throw new RuntimeError("Invalid tile content."); + } + return t; +} +function Multiple3DTileContent(e, t, n, i) { + this._tileset = e, this._tile = t, this._tilesetResource = n, this._contents = [], this._contentsCreated = !1; + const r = defined(i.contents) ? i.contents : i.content; + this._innerContentHeaders = r, this._requestsInFlight = 0, this._cancelCount = 0; + const o = this._innerContentHeaders.length; + this._arrayFetchPromises = new Array(o), this._requests = new Array(o), this._ready = !1, this._innerContentResources = new Array(o), this._serverKeys = new Array(o); + for (let s = 0; s < o; s++) { + const c = n.getDerivedResource({ + url: r[s].uri + }), l = RequestScheduler.getServerKey( + c.getUrlComponent() + ); + this._innerContentResources[s] = c, this._serverKeys[s] = l; + } +} +Object.defineProperties(Multiple3DTileContent.prototype, { + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent checks if any of the inner contents have dirty featurePropertiesDirty. + * @memberof Multiple3DTileContent.prototype + * + * @type {boolean} + * + * @private + */ + featurePropertiesDirty: { + get: function() { + const e = this._contents, t = e.length; + for (let n = 0; n < t; ++n) + if (e[n].featurePropertiesDirty) + return !0; + return !1; + }, + set: function(e) { + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].featurePropertiesDirty = e; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead call featuresLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + featuresLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead, call pointsLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + pointsLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead call trianglesLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + trianglesLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead call geometryByteLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + geometryByteLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead call texturesByteLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + texturesByteLength: { + get: function() { + return 0; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns 0. Instead call batchTableByteLength for a specific inner content. + * + * @memberof Multiple3DTileContent.prototype + * + * @type {number} + * @readonly + * + * @private + */ + batchTableByteLength: { + get: function() { + return 0; + } + }, + innerContents: { + get: function() { + return this._contents; + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Multiple3DTileContent.prototype + * + * @type {boolean} + * @readonly + * @private + */ + ready: { + get: function() { + return this._contentsCreated ? this._ready : !1; + } + }, + tileset: { + get: function() { + return this._tileset; + } + }, + tile: { + get: function() { + return this._tile; + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. + * Unlike other content types, Multiple3DTileContent does not + * have a single URL, so this returns undefined. + * @memberof Multiple3DTileContent.prototype + * + * @type {string} + * @readonly + * @private + */ + url: { + get: function() { + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns undefined. Instead call metadata for a specific inner content. + * @memberof Multiple3DTileContent.prototype + * @private + */ + metadata: { + get: function() { + }, + set: function() { + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns undefined. Instead call batchTable for a specific inner content. + * @memberof Multiple3DTileContent.prototype + * @private + */ + batchTable: { + get: function() { + } + }, + /** + * Part of the {@link Cesium3DTileContent} interface. Multiple3DTileContent + * always returns undefined. Instead call group for a specific inner content. + * @memberof Multiple3DTileContent.prototype + * @private + */ + group: { + get: function() { + }, + set: function() { + } + }, + /** + * Get an array of the inner content URLs, regardless of whether they've + * been fetched or not. This is intended for use with + * {@link Cesium3DTileset#debugShowUrl}. + * @memberof Multiple3DTileContent.prototype + * + * @type {string[]} + * @readonly + * @private + */ + innerContentUrls: { + get: function() { + return this._innerContentHeaders.map(function(e) { + return e.uri; + }); + } + } +}); +function updatePendingRequests(e, t) { + e._requestsInFlight += t, e.tileset.statistics.numberOfPendingRequests += t; +} +function cancelPendingRequests(e, t) { + e._cancelCount++, e._tile._contentState = t; + const n = e.tileset.statistics; + n.numberOfPendingRequests -= e._requestsInFlight, n.numberOfAttemptedRequests += e._requestsInFlight, e._requestsInFlight = 0; + const i = e._innerContentHeaders.length; + e._arrayFetchPromises = new Array(i); +} +Multiple3DTileContent.prototype.requestInnerContents = function() { + if (!canScheduleAllRequests(this._serverKeys)) { + this.tileset.statistics.numberOfAttemptedRequests += this._serverKeys.length; + return; + } + const e = this._innerContentHeaders; + updatePendingRequests(this, e.length); + const t = this._cancelCount; + for (let n = 0; n < e.length; n++) + this._arrayFetchPromises[n] = requestInnerContent( + this, + n, + t, + this._tile._contentState + ); + return createInnerContents(this); +}; +function canScheduleAllRequests(e) { + const t = {}; + for (let n = 0; n < e.length; n++) { + const i = e[n]; + defined(t[i]) ? t[i]++ : t[i] = 1; + } + for (const n in t) + if (t.hasOwnProperty(n) && !RequestScheduler.serverHasOpenSlots(n, t[n])) + return !1; + return RequestScheduler.heapHasOpenSlots(e.length); +} +function requestInnerContent(e, t, n, i) { + const r = e._innerContentResources[t].clone(), o = e.tile, s = function() { + return o._priority; + }, c = e._serverKeys[t], l = new Request({ + throttle: !0, + throttleByServer: !0, + type: RequestType$1.TILES3D, + priorityFunction: s, + serverKey: c + }); + r.request = l, e._requests[t] = l; + const d = r.fetchArrayBuffer(); + if (defined(d)) + return d.then(function(f) { + if (!(n < e._cancelCount)) { + if (r.request.cancelled || r.request.state === RequestState$1.CANCELLED) { + cancelPendingRequests(e, i); + return; + } + return updatePendingRequests(e, -1), f; + } + }).catch(function(f) { + if (!(n < e._cancelCount)) { + if (r.request.cancelled || r.request.state === RequestState$1.CANCELLED) { + cancelPendingRequests(e, i); + return; + } + updatePendingRequests(e, -1), handleInnerContentFailed(e, t, f); + } + }); +} +async function createInnerContents(e) { + const t = e._cancelCount, n = await Promise.all(e._arrayFetchPromises); + if (t < e._cancelCount) + return; + const i = n.map( + (o, s) => createInnerContent(e, o, s) + ), r = await Promise.all(i); + return e._contentsCreated = !0, e._contents = r.filter(defined), r; +} +async function createInnerContent(e, t, n) { + if (defined(t)) + try { + const i = preprocess3DTileContent(t); + if (i.contentType === Cesium3DTileContentType$1.EXTERNAL_TILESET) + throw new RuntimeError( + "External tilesets are disallowed inside multiple contents" + ); + e._disableSkipLevelOfDetail = e._disableSkipLevelOfDetail || i.contentType === Cesium3DTileContentType$1.GEOMETRY || i.contentType === Cesium3DTileContentType$1.VECTOR; + const r = e._tileset, o = e._innerContentResources[n], s = e._tile; + let c; + const l = Cesium3DTileContentFactory[i.contentType]; + defined(i.binaryPayload) ? c = await Promise.resolve( + l( + r, + s, + o, + i.binaryPayload.buffer, + 0 + ) + ) : c = await Promise.resolve( + l(r, s, o, i.jsonPayload) + ); + const d = e._innerContentHeaders[n]; + if (s.hasImplicitContentMetadata) { + const h = s.implicitSubtree, p = s.implicitCoordinates; + c.metadata = h.getContentMetadataView(p, n); + } else s.hasImplicitContent || (c.metadata = findContentMetadata(r, d)); + const f = findGroupMetadata(r, d); + return defined(f) && (c.group = new Cesium3DContentGroup({ + metadata: f + })), c; + } catch (i) { + handleInnerContentFailed(e, n, i); + } +} +function handleInnerContentFailed(e, t, n) { + const i = e._tileset, r = e._innerContentResources[t].url, o = defined(n.message) ? n.message : n.toString(); + i.tileFailed.numberOfListeners > 0 ? i.tileFailed.raiseEvent({ + url: r, + message: o + }) : (console.log(`A content failed to load: ${r}`), console.log(`Error: ${o}`)); +} +Multiple3DTileContent.prototype.cancelRequests = function() { + for (let e = 0; e < this._requests.length; e++) { + const t = this._requests[e]; + defined(t) && t.cancel(); + } +}; +Multiple3DTileContent.prototype.hasProperty = function(e, t) { + return !1; +}; +Multiple3DTileContent.prototype.getFeature = function(e) { +}; +Multiple3DTileContent.prototype.applyDebugSettings = function(e, t) { + const n = this._contents, i = n.length; + for (let r = 0; r < i; ++r) + n[r].applyDebugSettings(e, t); +}; +Multiple3DTileContent.prototype.applyStyle = function(e) { + const t = this._contents, n = t.length; + for (let i = 0; i < n; ++i) + t[i].applyStyle(e); +}; +Multiple3DTileContent.prototype.update = function(e, t) { + const n = this._contents, i = n.length; + let r = !0; + for (let o = 0; o < i; ++o) + n[o].update(e, t), r = r && n[o].ready; + !this._ready && r && (this._ready = !0); +}; +Multiple3DTileContent.prototype.pick = function(e, t, n) { + if (!this._ready) + return; + let i, r = Number.POSITIVE_INFINITY; + const o = this._contents, s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c].pick(e, t, n); + if (!defined(l)) + continue; + const d = Cartesian3.distance(e.origin, l); + d < r && (i = l, r = d); + } + if (defined(i)) + return n; +}; +Multiple3DTileContent.prototype.isDestroyed = function() { + return !1; +}; +Multiple3DTileContent.prototype.destroy = function() { + const e = this._contents, t = e.length; + for (let n = 0; n < t; ++n) + e[n].destroy(); + return destroyObject(this); +}; +const cos$2 = Math.cos, sin$2 = Math.sin, sqrt = Math.sqrt, RectangleGeometryLibrary = {}; +RectangleGeometryLibrary.computePosition = function(e, t, n, i, r, o, s) { + const c = t.radiiSquared, l = e.nwCorner, d = e.boundingRectangle; + let f = l.latitude - e.granYCos * i + r * e.granXSin; + const h = cos$2(f), p = sin$2(f), m = c.z * p; + let _ = l.longitude + i * e.granYSin + r * e.granXCos; + const y = h * cos$2(_), C = h * sin$2(_), T = c.x * y, x = c.y * C, b = sqrt(T * y + x * C + m * p); + if (o.x = T / b, o.y = x / b, o.z = m / b, n) { + const S = e.stNwCorner; + defined(S) ? (f = S.latitude - e.stGranYCos * i + r * e.stGranXSin, _ = S.longitude + i * e.stGranYSin + r * e.stGranXCos, s.x = (_ - e.stWest) * e.lonScalar, s.y = (f - e.stSouth) * e.latScalar) : (s.x = (_ - d.west) * e.lonScalar, s.y = (f - d.south) * e.latScalar); + } +}; +const rotationMatrixScratch = new Matrix2(); +let nwCartesian = new Cartesian3(); +const centerScratch$5 = new Cartographic(); +let centerCartesian = new Cartesian3(); +const proj = new GeographicProjection(); +function getRotationOptions(e, t, n, i, r, o, s) { + const c = Math.cos(t), l = i * c, d = n * c, f = Math.sin(t), h = i * f, p = n * f; + proj._ellipsoid = Ellipsoid.default, nwCartesian = proj.project(e, nwCartesian), nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); + const m = Matrix2.fromRotation(t, rotationMatrixScratch); + nwCartesian = Matrix2.multiplyByVector( + m, + nwCartesian, + nwCartesian + ), nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian), e = proj.unproject(nwCartesian, e), o -= 1, s -= 1; + const _ = e.latitude, y = _ + o * p, C = _ - l * s, T = _ - l * s + o * p, x = Math.max(_, y, C, T), b = Math.min(_, y, C, T), S = e.longitude, E = S + o * d, A = S + s * h, D = S + s * h + o * d, P = Math.max(S, E, A, D), I = Math.min(S, E, A, D); + return { + north: x, + south: b, + east: P, + west: I, + granYCos: l, + granYSin: h, + granXCos: d, + granXSin: p, + nwCorner: e + }; +} +RectangleGeometryLibrary.computeOptions = function(e, t, n, i, r, o, s) { + let c = e.east, l = e.west, d = e.north, f = e.south, h = !1, p = !1; + d === CesiumMath.PI_OVER_TWO && (h = !0), f === -CesiumMath.PI_OVER_TWO && (p = !0); + let m; + const _ = d - f; + l > c ? m = CesiumMath.TWO_PI - l + c : m = c - l; + const y = Math.ceil(m / t) + 1, C = Math.ceil(_ / t) + 1, T = m / (y - 1), x = _ / (C - 1), b = Rectangle.northwest(e, o), S = Rectangle.center(e, centerScratch$5); + (n !== 0 || i !== 0) && (S.longitude < b.longitude && (S.longitude += CesiumMath.TWO_PI), proj._ellipsoid = Ellipsoid.default, centerCartesian = proj.project(S, centerCartesian)); + const E = x, A = T, D = 0, P = 0, I = Rectangle.clone( + e, + r + ), M = { + granYCos: E, + granYSin: D, + granXCos: A, + granXSin: P, + nwCorner: b, + boundingRectangle: I, + width: y, + height: C, + northCap: h, + southCap: p + }; + if (n !== 0) { + const R = getRotationOptions( + b, + n, + T, + x, + S, + y, + C + ); + d = R.north, f = R.south, c = R.east, l = R.west, M.granYCos = R.granYCos, M.granYSin = R.granYSin, M.granXCos = R.granXCos, M.granXSin = R.granXSin, I.north = d, I.south = f, I.east = c, I.west = l; + } + if (i !== 0) { + n = n - i; + const R = Rectangle.northwest(I, s), L = getRotationOptions( + R, + n, + T, + x, + S, + y, + C + ); + M.stGranYCos = L.granYCos, M.stGranXCos = L.granXCos, M.stGranYSin = L.granYSin, M.stGranXSin = L.granXSin, M.stNwCorner = R, M.stWest = L.west, M.stSouth = L.south; + } + return M; +}; +const bottomBoundingSphere$3 = new BoundingSphere(), topBoundingSphere$3 = new BoundingSphere(), positionScratch$8 = new Cartesian3(), rectangleScratch$6 = new Rectangle(); +function constructRectangle$1(e, t) { + const n = e._ellipsoid, i = t.height, r = t.width, o = t.northCap, s = t.southCap; + let c = i, l = 2, d = 0, f = 4; + o && (l -= 1, c -= 1, d += 1, f -= 2), s && (l -= 1, c -= 1, d += 1, f -= 2), d += l * r + 2 * c - f; + const h = new Float64Array(d * 3); + let p = 0, m = 0, _; + const y = positionScratch$8; + if (o) + RectangleGeometryLibrary.computePosition( + t, + n, + !1, + m, + 0, + y + ), h[p++] = y.x, h[p++] = y.y, h[p++] = y.z; + else + for (_ = 0; _ < r; _++) + RectangleGeometryLibrary.computePosition( + t, + n, + !1, + m, + _, + y + ), h[p++] = y.x, h[p++] = y.y, h[p++] = y.z; + for (_ = r - 1, m = 1; m < i; m++) + RectangleGeometryLibrary.computePosition( + t, + n, + !1, + m, + _, + y + ), h[p++] = y.x, h[p++] = y.y, h[p++] = y.z; + if (m = i - 1, !s) + for (_ = r - 2; _ >= 0; _--) + RectangleGeometryLibrary.computePosition( + t, + n, + !1, + m, + _, + y + ), h[p++] = y.x, h[p++] = y.y, h[p++] = y.z; + for (_ = 0, m = i - 2; m > 0; m--) + RectangleGeometryLibrary.computePosition( + t, + n, + !1, + m, + _, + y + ), h[p++] = y.x, h[p++] = y.y, h[p++] = y.z; + const C = h.length / 3 * 2, T = IndexDatatype$1.createTypedArray( + h.length / 3, + C + ); + let x = 0; + for (let S = 0; S < h.length / 3 - 1; S++) + T[x++] = S, T[x++] = S + 1; + T[x++] = h.length / 3 - 1, T[x++] = 0; + const b = new Geometry({ + attributes: new GeometryAttributes(), + primitiveType: PrimitiveType$1.LINES + }); + return b.attributes.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: h + }), b.indices = T, b; +} +function constructExtrudedRectangle$1(e, t) { + const n = e._surfaceHeight, i = e._extrudedHeight, r = e._ellipsoid, o = constructRectangle$1(e, t), s = t.height, c = t.width, l = PolygonPipeline.scaleToGeodeticHeight( + o.attributes.position.values, + n, + r, + !1 + ); + let d = l.length; + const f = new Float64Array(d * 2); + f.set(l); + const h = PolygonPipeline.scaleToGeodeticHeight( + o.attributes.position.values, + i, + r + ); + f.set(h, d), o.attributes.position.values = f; + const p = t.northCap, m = t.southCap; + let _ = 4; + p && (_ -= 1), m && (_ -= 1); + const y = (f.length / 3 + _) * 2, C = IndexDatatype$1.createTypedArray( + f.length / 3, + y + ); + d = f.length / 6; + let T = 0; + for (let b = 0; b < d - 1; b++) + C[T++] = b, C[T++] = b + 1, C[T++] = b + d, C[T++] = b + d + 1; + C[T++] = d - 1, C[T++] = 0, C[T++] = d + d - 1, C[T++] = d, C[T++] = 0, C[T++] = d; + let x; + if (p) + x = s - 1; + else { + const b = c - 1; + C[T++] = b, C[T++] = b + d, x = c + s - 2; + } + if (C[T++] = x, C[T++] = x + d, !m) { + const b = c + x - 1; + C[T++] = b, C[T] = b + d; + } + return o.indices = C, o; +} +function RectangleOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.rectangle, n = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), i = defaultValue(e.ellipsoid, Ellipsoid.default), r = defaultValue(e.rotation, 0), o = defaultValue(e.height, 0), s = defaultValue(e.extrudedHeight, o); + this._rectangle = Rectangle.clone(t), this._granularity = n, this._ellipsoid = i, this._surfaceHeight = Math.max(o, s), this._rotation = r, this._extrudedHeight = Math.min(o, s), this._offsetAttribute = e.offsetAttribute, this._workerName = "createRectangleOutlineGeometry"; +} +RectangleOutlineGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + 5; +RectangleOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Rectangle.pack(e._rectangle, t, n), n += Rectangle.packedLength, Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._granularity, t[n++] = e._surfaceHeight, t[n++] = e._rotation, t[n++] = e._extrudedHeight, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchRectangle$8 = new Rectangle(), scratchEllipsoid$d = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchOptions$l = { + rectangle: scratchRectangle$8, + ellipsoid: scratchEllipsoid$d, + granularity: void 0, + height: void 0, + rotation: void 0, + extrudedHeight: void 0, + offsetAttribute: void 0 +}; +RectangleOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Rectangle.unpack(e, t, scratchRectangle$8); + t += Rectangle.packedLength; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$d); + t += Ellipsoid.packedLength; + const o = e[t++], s = e[t++], c = e[t++], l = e[t++], d = e[t]; + return defined(n) ? (n._rectangle = Rectangle.clone(i, n._rectangle), n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._surfaceHeight = s, n._rotation = c, n._extrudedHeight = l, n._offsetAttribute = d === -1 ? void 0 : d, n) : (scratchOptions$l.granularity = o, scratchOptions$l.height = s, scratchOptions$l.rotation = c, scratchOptions$l.extrudedHeight = l, scratchOptions$l.offsetAttribute = d === -1 ? void 0 : d, new RectangleOutlineGeometry(scratchOptions$l)); +}; +const nwScratch$1 = new Cartographic(); +RectangleOutlineGeometry.createGeometry = function(e) { + const t = e._rectangle, n = e._ellipsoid, i = RectangleGeometryLibrary.computeOptions( + t, + e._granularity, + e._rotation, + 0, + rectangleScratch$6, + nwScratch$1 + ); + let r, o; + if (CesiumMath.equalsEpsilon( + t.north, + t.south, + CesiumMath.EPSILON10 + ) || CesiumMath.equalsEpsilon( + t.east, + t.west, + CesiumMath.EPSILON10 + )) + return; + const s = e._surfaceHeight, c = e._extrudedHeight, l = !CesiumMath.equalsEpsilon( + s, + c, + 0, + CesiumMath.EPSILON2 + ); + let d; + if (l) { + if (r = constructExtrudedRectangle$1(e, i), defined(e._offsetAttribute)) { + const p = r.attributes.position.values.length / 3; + let m = new Uint8Array(p); + e._offsetAttribute === GeometryOffsetAttribute$1.TOP ? m = m.fill(1, 0, p / 2) : (d = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, m = m.fill(d)), r.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: m + }); + } + const f = BoundingSphere.fromRectangle3D( + t, + n, + s, + topBoundingSphere$3 + ), h = BoundingSphere.fromRectangle3D( + t, + n, + c, + bottomBoundingSphere$3 + ); + o = BoundingSphere.union(f, h); + } else { + if (r = constructRectangle$1(e, i), r.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + r.attributes.position.values, + s, + n, + !1 + ), defined(e._offsetAttribute)) { + const f = r.attributes.position.values.length; + d = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + const h = new Uint8Array(f / 3).fill(d); + r.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: h + }); + } + o = BoundingSphere.fromRectangle3D( + t, + n, + s + ); + } + return new Geometry({ + attributes: r.attributes, + indices: r.indices, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: o, + offsetAttribute: e._offsetAttribute + }); +}; +function TileBoundingRegion(e) { + this.rectangle = Rectangle.clone(e.rectangle), this.minimumHeight = defaultValue(e.minimumHeight, 0), this.maximumHeight = defaultValue(e.maximumHeight, 0), this.southwestCornerCartesian = new Cartesian3(), this.northeastCornerCartesian = new Cartesian3(), this.westNormal = new Cartesian3(), this.southNormal = new Cartesian3(), this.eastNormal = new Cartesian3(), this.northNormal = new Cartesian3(); + const t = defaultValue(e.ellipsoid, Ellipsoid.WGS84); + computeBox(this, e.rectangle, t), this._orientedBoundingBox = void 0, this._boundingSphere = void 0, defaultValue(e.computeBoundingVolumes, !0) && this.computeBoundingVolumes(t); +} +Object.defineProperties(TileBoundingRegion.prototype, { + /** + * The underlying bounding volume + * + * @memberof TileBoundingRegion.prototype + * + * @type {object} + * @readonly + */ + boundingVolume: { + get: function() { + return this._orientedBoundingBox; + } + }, + /** + * The underlying bounding sphere + * + * @memberof TileBoundingRegion.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._boundingSphere; + } + } +}); +TileBoundingRegion.prototype.computeBoundingVolumes = function(e) { + this._orientedBoundingBox = OrientedBoundingBox.fromRectangle( + this.rectangle, + this.minimumHeight, + this.maximumHeight, + e + ), this._boundingSphere = BoundingSphere.fromOrientedBoundingBox( + this._orientedBoundingBox + ); +}; +const cartesian3Scratch$2 = new Cartesian3(), cartesian3Scratch2 = new Cartesian3(), cartesian3Scratch3 = new Cartesian3(), westNormalScratch = new Cartesian3(), eastWestNormalScratch = new Cartesian3(), westernMidpointScratch = new Cartesian3(), easternMidpointScratch = new Cartesian3(), cartographicScratch$3 = new Cartographic(), planeScratch = new Plane(Cartesian3.UNIT_X, 0), rayScratch = new Ray(); +function computeBox(e, t, n) { + n.cartographicToCartesian( + Rectangle.southwest(t), + e.southwestCornerCartesian + ), n.cartographicToCartesian( + Rectangle.northeast(t), + e.northeastCornerCartesian + ), cartographicScratch$3.longitude = t.west, cartographicScratch$3.latitude = (t.south + t.north) * 0.5, cartographicScratch$3.height = 0; + const i = n.cartographicToCartesian( + cartographicScratch$3, + westernMidpointScratch + ), r = Cartesian3.cross( + i, + Cartesian3.UNIT_Z, + westNormalScratch + ); + Cartesian3.normalize(r, e.westNormal), cartographicScratch$3.longitude = t.east; + const o = n.cartographicToCartesian( + cartographicScratch$3, + easternMidpointScratch + ), s = Cartesian3.cross( + Cartesian3.UNIT_Z, + o, + cartesian3Scratch$2 + ); + Cartesian3.normalize(s, e.eastNormal); + let c = Cartesian3.subtract( + i, + o, + cartesian3Scratch$2 + ); + Cartesian3.magnitude(c) === 0 && (c = Cartesian3.clone(r, c)); + const l = Cartesian3.normalize( + c, + eastWestNormalScratch + ), d = t.south; + let f; + if (d > 0) { + cartographicScratch$3.longitude = (t.west + t.east) * 0.5, cartographicScratch$3.latitude = d; + const y = n.cartographicToCartesian( + cartographicScratch$3, + rayScratch.origin + ); + Cartesian3.clone(l, rayScratch.direction); + const C = Plane.fromPointNormal( + e.southwestCornerCartesian, + e.westNormal, + planeScratch + ); + IntersectionTests.rayPlane( + rayScratch, + C, + e.southwestCornerCartesian + ), f = n.geodeticSurfaceNormal( + y, + cartesian3Scratch2 + ); + } else + f = n.geodeticSurfaceNormalCartographic( + Rectangle.southeast(t), + cartesian3Scratch2 + ); + const h = Cartesian3.cross( + f, + c, + cartesian3Scratch3 + ); + Cartesian3.normalize(h, e.southNormal); + const p = t.north; + let m; + if (p < 0) { + cartographicScratch$3.longitude = (t.west + t.east) * 0.5, cartographicScratch$3.latitude = p; + const y = n.cartographicToCartesian( + cartographicScratch$3, + rayScratch.origin + ); + Cartesian3.negate(l, rayScratch.direction); + const C = Plane.fromPointNormal( + e.northeastCornerCartesian, + e.eastNormal, + planeScratch + ); + IntersectionTests.rayPlane( + rayScratch, + C, + e.northeastCornerCartesian + ), m = n.geodeticSurfaceNormal( + y, + cartesian3Scratch2 + ); + } else + m = n.geodeticSurfaceNormalCartographic( + Rectangle.northwest(t), + cartesian3Scratch2 + ); + const _ = Cartesian3.cross( + c, + m, + cartesian3Scratch3 + ); + Cartesian3.normalize(_, e.northNormal); +} +const southwestCornerScratch = new Cartesian3(), northeastCornerScratch = new Cartesian3(), negativeUnitY = new Cartesian3(0, -1, 0), negativeUnitZ = new Cartesian3(0, 0, -1), vectorScratch = new Cartesian3(); +function distanceToCameraRegion(e, t) { + const n = t.camera, i = n.positionWC, r = n.positionCartographic; + let o = 0; + if (!Rectangle.contains(e.rectangle, r)) { + let d = e.southwestCornerCartesian, f = e.northeastCornerCartesian, h = e.westNormal, p = e.southNormal, m = e.eastNormal, _ = e.northNormal; + t.mode !== SceneMode$1.SCENE3D && (d = t.mapProjection.project( + Rectangle.southwest(e.rectangle), + southwestCornerScratch + ), d.z = d.y, d.y = d.x, d.x = 0, f = t.mapProjection.project( + Rectangle.northeast(e.rectangle), + northeastCornerScratch + ), f.z = f.y, f.y = f.x, f.x = 0, h = negativeUnitY, m = Cartesian3.UNIT_Y, p = negativeUnitZ, _ = Cartesian3.UNIT_Z); + const y = Cartesian3.subtract( + i, + d, + vectorScratch + ), C = Cartesian3.dot( + y, + h + ), T = Cartesian3.dot( + y, + p + ), x = Cartesian3.subtract( + i, + f, + vectorScratch + ), b = Cartesian3.dot( + x, + m + ), S = Cartesian3.dot( + x, + _ + ); + C > 0 ? o += C * C : b > 0 && (o += b * b), T > 0 ? o += T * T : S > 0 && (o += S * S); + } + let s, c, l; + if (t.mode === SceneMode$1.SCENE3D ? (s = r.height, c = e.minimumHeight, l = e.maximumHeight) : (s = i.x, c = 0, l = 0), s > l) { + const d = s - l; + o += d * d; + } else if (s < c) { + const d = c - s; + o += d * d; + } + return Math.sqrt(o); +} +TileBoundingRegion.prototype.distanceToCamera = function(e) { + const t = distanceToCameraRegion(this, e); + if (e.mode === SceneMode$1.SCENE3D && defined(this._orientedBoundingBox)) { + const n = Math.sqrt( + this._orientedBoundingBox.distanceSquaredTo(e.camera.positionWC) + ); + return Math.max(t, n); + } + return t; +}; +TileBoundingRegion.prototype.intersectPlane = function(e) { + return this._orientedBoundingBox.intersectPlane(e); +}; +TileBoundingRegion.prototype.createDebugVolume = function(e) { + const t = new Matrix4.clone(Matrix4.IDENTITY), n = new RectangleOutlineGeometry({ + rectangle: this.rectangle, + height: this.minimumHeight, + extrudedHeight: this.maximumHeight + }), i = new GeometryInstance({ + geometry: n, + id: "outline", + modelMatrix: t, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }); + return new Primitive$3({ + geometryInstances: i, + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); +}; +const CoplanarPolygonGeometryLibrary = {}, scratchIntersectionPoint = new Cartesian3(), scratchXAxis = new Cartesian3(), scratchYAxis = new Cartesian3(), scratchZAxis = new Cartesian3(), obbScratch = new OrientedBoundingBox(); +CoplanarPolygonGeometryLibrary.validOutline = function(e) { + const n = OrientedBoundingBox.fromPoints( + e, + obbScratch + ).halfAxes, i = Matrix3.getColumn(n, 0, scratchXAxis), r = Matrix3.getColumn(n, 1, scratchYAxis), o = Matrix3.getColumn(n, 2, scratchZAxis), s = Cartesian3.magnitude(i), c = Cartesian3.magnitude(r), l = Cartesian3.magnitude(o); + return !(s === 0 && (c === 0 || l === 0) || c === 0 && l === 0); +}; +CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments = function(e, t, n, i) { + const r = OrientedBoundingBox.fromPoints( + e, + obbScratch + ), o = r.halfAxes, s = Matrix3.getColumn(o, 0, scratchXAxis), c = Matrix3.getColumn(o, 1, scratchYAxis), l = Matrix3.getColumn(o, 2, scratchZAxis), d = Cartesian3.magnitude(s), f = Cartesian3.magnitude(c), h = Cartesian3.magnitude(l), p = Math.min(d, f, h); + if (d === 0 && (f === 0 || h === 0) || f === 0 && h === 0) + return !1; + let m, _; + return (p === f || p === h) && (m = s), p === d ? m = c : p === h && (_ = c), (p === d || p === f) && (_ = l), Cartesian3.normalize(m, n), Cartesian3.normalize(_, i), Cartesian3.clone(r.center, t), !0; +}; +function projectTo2D(e, t, n, i, r) { + const o = Cartesian3.subtract(e, t, scratchIntersectionPoint), s = Cartesian3.dot(n, o), c = Cartesian3.dot(i, o); + return Cartesian2.fromElements(s, c, r); +} +CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction = function(e, t, n) { + return function(i) { + const r = new Array(i.length); + for (let o = 0; o < i.length; o++) + r[o] = projectTo2D(i[o], e, t, n); + return r; + }; +}; +CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction = function(e, t, n) { + return function(i, r) { + return projectTo2D(i, e, t, n, r); + }; +}; +function createGeometryFromPositions$1(e) { + const t = e.length, n = new Float64Array(t * 3), i = IndexDatatype$1.createTypedArray(t, t * 2); + let r = 0, o = 0; + for (let c = 0; c < t; c++) { + const l = e[c]; + n[r++] = l.x, n[r++] = l.y, n[r++] = l.z, i[o++] = c, i[o++] = (c + 1) % t; + } + const s = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: n + }) + }); + return new Geometry({ + attributes: s, + indices: i, + primitiveType: PrimitiveType$1.LINES + }); +} +function CoplanarPolygonOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.polygonHierarchy; + this._polygonHierarchy = t, this._workerName = "createCoplanarPolygonOutlineGeometry", this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength( + t, + Cartesian3 + ) + 1; +} +CoplanarPolygonOutlineGeometry.fromPositions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = { + polygonHierarchy: { + positions: e.positions + } + }; + return new CoplanarPolygonOutlineGeometry(t); +}; +CoplanarPolygonOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), n = PolygonGeometryLibrary.packPolygonHierarchy( + e._polygonHierarchy, + t, + n, + Cartesian3 + ), t[n] = e.packedLength, t; +}; +const scratchOptions$k = { + polygonHierarchy: {} +}; +CoplanarPolygonOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian3 + ); + t = i.startingIndex, delete i.startingIndex; + const r = e[t]; + return defined(n) || (n = new CoplanarPolygonOutlineGeometry(scratchOptions$k)), n._polygonHierarchy = i, n.packedLength = r, n; +}; +CoplanarPolygonOutlineGeometry.createGeometry = function(e) { + const t = e._polygonHierarchy; + let n = t.positions; + if (n = arrayRemoveDuplicates( + n, + Cartesian3.equalsEpsilon, + !0 + ), n.length < 3 || !CoplanarPolygonGeometryLibrary.validOutline(n)) + return; + const r = PolygonGeometryLibrary.polygonOutlinesFromHierarchy( + t, + !1 + ); + if (r.length === 0) + return; + const o = []; + for (let l = 0; l < r.length; l++) { + const d = new GeometryInstance({ + geometry: createGeometryFromPositions$1(r[l]) + }); + o.push(d); + } + const s = GeometryPipeline.combineInstances(o)[0], c = BoundingSphere.fromPoints(t.positions); + return new Geometry({ + attributes: s.attributes, + indices: s.indices, + primitiveType: s.primitiveType, + boundingSphere: c + }); +}; +let centerCartographicScratch$1 = new Cartographic(); +function TileBoundingS2Cell(e) { + const t = S2Cell.fromToken(e.token), n = defaultValue(e.minimumHeight, 0), i = defaultValue(e.maximumHeight, 0), r = defaultValue(e.ellipsoid, Ellipsoid.WGS84); + this.s2Cell = t, this.minimumHeight = n, this.maximumHeight = i, this.ellipsoid = r; + const o = computeBoundingPlanes( + t, + n, + i, + r + ); + this._boundingPlanes = o; + const s = computeVertices(o); + this._vertices = s, this._edgeNormals = new Array(6), this._edgeNormals[0] = computeEdgeNormals( + o[0], + s.slice(0, 4) + ); + let c; + for (c = 0; c < 4; c++) + this._edgeNormals[0][c] = Cartesian3.negate( + this._edgeNormals[0][c], + this._edgeNormals[0][c] + ); + for (this._edgeNormals[1] = computeEdgeNormals( + o[1], + s.slice(4, 8) + ), c = 0; c < 4; c++) + this._edgeNormals[2 + c] = computeEdgeNormals(o[2 + c], [ + s[c % 4], + s[(c + 1) % 4], + s[4 + (c + 1) % 4], + s[4 + c] + ]); + for (this._planeVertices = [ + this._vertices.slice(0, 4), + this._vertices.slice(4, 8) + ], c = 0; c < 4; c++) + this._planeVertices.push([ + this._vertices[c % 4], + this._vertices[(c + 1) % 4], + this._vertices[4 + (c + 1) % 4], + this._vertices[4 + c] + ]); + const l = t.getCenter(); + centerCartographicScratch$1 = r.cartesianToCartographic( + l, + centerCartographicScratch$1 + ), centerCartographicScratch$1.height = (i + n) / 2, this.center = r.cartographicToCartesian( + centerCartographicScratch$1, + l + ), this._boundingSphere = BoundingSphere.fromPoints(s); +} +const centerGeodeticNormalScratch = new Cartesian3(), topCartographicScratch = new Cartographic(), topScratch = new Cartesian3(), vertexCartographicScratch = new Cartographic(), vertexScratch = new Cartesian3(), vertexGeodeticNormalScratch = new Cartesian3(), sideNormalScratch = new Cartesian3(), sideScratch = new Cartesian3(); +function computeBoundingPlanes(e, t, n, i) { + const r = new Array(6), o = e.getCenter(), s = i.geodeticSurfaceNormal( + o, + centerGeodeticNormalScratch + ), c = i.cartesianToCartographic( + o, + topCartographicScratch + ); + c.height = n; + const l = i.cartographicToCartesian(c, topScratch), d = Plane.fromPointNormal(l, s); + r[0] = d; + let f = 0, h; + const p = []; + let m, _; + for (h = 0; h < 4; h++) { + m = e.getVertex(h), p[h] = m, _ = i.cartesianToCartographic( + m, + vertexCartographicScratch + ), _.height = t; + const C = Plane.getPointDistance( + d, + i.cartographicToCartesian(_, vertexScratch) + ); + C < f && (f = C); + } + const y = Plane.clone(d); + for (y.normal = Cartesian3.negate( + y.normal, + y.normal + ), y.distance = y.distance * -1 + f, r[1] = y, h = 0; h < 4; h++) { + m = p[h]; + const C = p[(h + 1) % 4], T = i.geodeticSurfaceNormal( + m, + vertexGeodeticNormalScratch + ), x = Cartesian3.subtract(C, m, sideScratch); + let b = Cartesian3.cross(x, T, sideNormalScratch); + b = Cartesian3.normalize(b, b), r[2 + h] = Plane.fromPointNormal(m, b); + } + return r; +} +let n0Scratch = new Cartesian3(), n1Scratch = new Cartesian3(), n2Scratch = new Cartesian3(), x0Scratch = new Cartesian3(), x1Scratch = new Cartesian3(), x2Scratch = new Cartesian3(); +const t0Scratch = new Cartesian3(), t1Scratch = new Cartesian3(), t2Scratch = new Cartesian3(); +let f0Scratch = new Cartesian3(), f1Scratch = new Cartesian3(), f2Scratch = new Cartesian3(), sScratch = new Cartesian3(); +const matrixScratch = new Matrix3(); +function computeIntersection(e, t, n) { + n0Scratch = e.normal, n1Scratch = t.normal, n2Scratch = n.normal, x0Scratch = Cartesian3.multiplyByScalar(e.normal, -e.distance, x0Scratch), x1Scratch = Cartesian3.multiplyByScalar(t.normal, -t.distance, x1Scratch), x2Scratch = Cartesian3.multiplyByScalar(n.normal, -n.distance, x2Scratch), f0Scratch = Cartesian3.multiplyByScalar( + Cartesian3.cross(n1Scratch, n2Scratch, t0Scratch), + Cartesian3.dot(x0Scratch, n0Scratch), + f0Scratch + ), f1Scratch = Cartesian3.multiplyByScalar( + Cartesian3.cross(n2Scratch, n0Scratch, t1Scratch), + Cartesian3.dot(x1Scratch, n1Scratch), + f1Scratch + ), f2Scratch = Cartesian3.multiplyByScalar( + Cartesian3.cross(n0Scratch, n1Scratch, t2Scratch), + Cartesian3.dot(x2Scratch, n2Scratch), + f2Scratch + ), matrixScratch[0] = n0Scratch.x, matrixScratch[1] = n1Scratch.x, matrixScratch[2] = n2Scratch.x, matrixScratch[3] = n0Scratch.y, matrixScratch[4] = n1Scratch.y, matrixScratch[5] = n2Scratch.y, matrixScratch[6] = n0Scratch.z, matrixScratch[7] = n1Scratch.z, matrixScratch[8] = n2Scratch.z; + const i = Matrix3.determinant(matrixScratch); + return sScratch = Cartesian3.add(f0Scratch, f1Scratch, sScratch), sScratch = Cartesian3.add(sScratch, f2Scratch, sScratch), new Cartesian3( + sScratch.x / i, + sScratch.y / i, + sScratch.z / i + ); +} +function computeVertices(e) { + const t = new Array(8); + for (let n = 0; n < 4; n++) + t[n] = computeIntersection( + e[0], + e[2 + (n + 3) % 4], + e[2 + n % 4] + ), t[n + 4] = computeIntersection( + e[1], + e[2 + (n + 3) % 4], + e[2 + n % 4] + ); + return t; +} +let edgeScratch = new Cartesian3(), edgeNormalScratch = new Cartesian3(); +function computeEdgeNormals(e, t) { + const n = []; + for (let i = 0; i < 4; i++) + edgeScratch = Cartesian3.subtract( + t[(i + 1) % 4], + t[i], + edgeScratch + ), edgeNormalScratch = Cartesian3.cross( + e.normal, + edgeScratch, + edgeNormalScratch + ), edgeNormalScratch = Cartesian3.normalize( + edgeNormalScratch, + edgeNormalScratch + ), n[i] = Cartesian3.clone(edgeNormalScratch); + return n; +} +Object.defineProperties(TileBoundingS2Cell.prototype, { + /** + * The underlying bounding volume. + * + * @memberof TileBoundingS2Cell.prototype + * + * @type {object} + * @readonly + */ + boundingVolume: { + get: function() { + return this; + } + }, + /** + * The underlying bounding sphere. + * + * @memberof TileBoundingS2Cell.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._boundingSphere; + } + } +}); +const facePointScratch = new Cartesian3(); +TileBoundingS2Cell.prototype.distanceToCamera = function(e) { + const t = e.camera.positionWC, n = [], i = []; + let r; + Plane.getPointDistance(this._boundingPlanes[0], t) > 0 ? (n.push(0), i.push(this._planeVertices[0]), r = this._edgeNormals[0]) : Plane.getPointDistance(this._boundingPlanes[1], t) > 0 && (n.push(1), i.push(this._planeVertices[1]), r = this._edgeNormals[1]); + let o, s; + for (o = 0; o < 4; o++) + s = 2 + o, Plane.getPointDistance(this._boundingPlanes[s], t) > 0 && (n.push(s), i.push(this._planeVertices[s]), r = this._edgeNormals[s]); + if (n.length === 0) + return 0; + let c, l; + if (n.length === 1) + return l = this._boundingPlanes[n[0]], c = closestPointPolygon( + Plane.projectPointOntoPlane(l, t, facePointScratch), + i[0], + l, + r + ), Cartesian3.distance(c, t); + if (n.length === 2) { + if (n[0] === 0) { + const p = [ + this._vertices[4 * n[0] + (n[1] - 2)], + this._vertices[4 * n[0] + (n[1] - 2 + 1) % 4] + ]; + return c = closestPointLineSegment(t, p[0], p[1]), Cartesian3.distance(c, t); + } + let f = Number.MAX_VALUE, h; + for (o = 0; o < 2; o++) + l = this._boundingPlanes[n[o]], c = closestPointPolygon( + Plane.projectPointOntoPlane(l, t, facePointScratch), + i[o], + l, + this._edgeNormals[n[o]] + ), h = Cartesian3.distanceSquared(c, t), h < f && (f = h); + return Math.sqrt(f); + } else if (n.length > 3) + return c = closestPointPolygon( + Plane.projectPointOntoPlane( + this._boundingPlanes[1], + t, + facePointScratch + ), + this._planeVertices[1], + this._boundingPlanes[1], + this._edgeNormals[1] + ), Cartesian3.distance(c, t); + const d = n[1] === 2 && n[2] === 5 ? 0 : 1; + return n[0] === 0 ? Cartesian3.distance( + t, + this._vertices[(n[1] - 2 + d) % 4] + ) : Cartesian3.distance( + t, + this._vertices[4 + (n[1] - 2 + d) % 4] + ); +}; +const dScratch = new Cartesian3(), pL0Scratch = new Cartesian3(); +function closestPointLineSegment(e, t, n) { + const i = Cartesian3.subtract(n, t, dScratch), r = Cartesian3.subtract(e, t, pL0Scratch); + let o = Cartesian3.dot(i, r); + if (o <= 0) + return t; + const s = Cartesian3.dot(i, i); + return o >= s ? n : (o = o / s, new Cartesian3( + (1 - o) * t.x + o * n.x, + (1 - o) * t.y + o * n.y, + (1 - o) * t.z + o * n.z + )); +} +const edgePlaneScratch = new Plane(Cartesian3.UNIT_X, 0); +function closestPointPolygon(e, t, n, i) { + let r = Number.MAX_VALUE, o, s, c; + for (let l = 0; l < t.length; l++) { + const d = Plane.fromPointNormal( + t[l], + i[l], + edgePlaneScratch + ); + Plane.getPointDistance(d, e) < 0 || (c = closestPointLineSegment( + e, + t[l], + t[(l + 1) % 4] + ), o = Cartesian3.distance(e, c), o < r && (r = o, s = c)); + } + return defined(s) ? s : e; +} +TileBoundingS2Cell.prototype.intersectPlane = function(e) { + let t = 0, n = 0; + for (let i = 0; i < this._vertices.length; i++) + Cartesian3.dot(e.normal, this._vertices[i]) + e.distance < 0 ? n++ : t++; + return t === this._vertices.length ? Intersect$1.INSIDE : n === this._vertices.length ? Intersect$1.OUTSIDE : Intersect$1.INTERSECTING; +}; +TileBoundingS2Cell.prototype.createDebugVolume = function(e) { + const t = new Matrix4.clone(Matrix4.IDENTITY), n = new CoplanarPolygonOutlineGeometry({ + polygonHierarchy: { + positions: this._planeVertices[0] + } + }), i = CoplanarPolygonOutlineGeometry.createGeometry( + n + ), r = new GeometryInstance({ + geometry: i, + id: "outline", + modelMatrix: t, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }), o = new CoplanarPolygonOutlineGeometry({ + polygonHierarchy: { + positions: this._planeVertices[1] + } + }), s = CoplanarPolygonOutlineGeometry.createGeometry( + o + ), c = new GeometryInstance({ + geometry: s, + id: "outline", + modelMatrix: t, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }), l = []; + for (let d = 0; d < 4; d++) { + const f = new CoplanarPolygonOutlineGeometry({ + polygonHierarchy: { + positions: this._planeVertices[2 + d] + } + }), h = CoplanarPolygonOutlineGeometry.createGeometry( + f + ); + l[d] = new GeometryInstance({ + geometry: h, + id: "outline", + modelMatrix: t, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }); + } + return new Primitive$3({ + geometryInstances: [ + l[0], + l[1], + l[2], + l[3], + c, + r + ], + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); +}; +const defaultRadii$1 = new Cartesian3(1, 1, 1), cos$1 = Math.cos, sin$1 = Math.sin; +function EllipsoidOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.radii, defaultRadii$1), n = defaultValue(e.innerRadii, t), i = defaultValue(e.minimumClock, 0), r = defaultValue(e.maximumClock, CesiumMath.TWO_PI), o = defaultValue(e.minimumCone, 0), s = defaultValue(e.maximumCone, CesiumMath.PI), c = Math.round(defaultValue(e.stackPartitions, 10)), l = Math.round(defaultValue(e.slicePartitions, 8)), d = Math.round(defaultValue(e.subdivisions, 128)); + this._radii = Cartesian3.clone(t), this._innerRadii = Cartesian3.clone(n), this._minimumClock = i, this._maximumClock = r, this._minimumCone = o, this._maximumCone = s, this._stackPartitions = c, this._slicePartitions = l, this._subdivisions = d, this._offsetAttribute = e.offsetAttribute, this._workerName = "createEllipsoidOutlineGeometry"; +} +EllipsoidOutlineGeometry.packedLength = 2 * Cartesian3.packedLength + 8; +EllipsoidOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._radii, t, n), n += Cartesian3.packedLength, Cartesian3.pack(e._innerRadii, t, n), n += Cartesian3.packedLength, t[n++] = e._minimumClock, t[n++] = e._maximumClock, t[n++] = e._minimumCone, t[n++] = e._maximumCone, t[n++] = e._stackPartitions, t[n++] = e._slicePartitions, t[n++] = e._subdivisions, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchRadii$2 = new Cartesian3(), scratchInnerRadii$1 = new Cartesian3(), scratchOptions$j = { + radii: scratchRadii$2, + innerRadii: scratchInnerRadii$1, + minimumClock: void 0, + maximumClock: void 0, + minimumCone: void 0, + maximumCone: void 0, + stackPartitions: void 0, + slicePartitions: void 0, + subdivisions: void 0, + offsetAttribute: void 0 +}; +EllipsoidOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchRadii$2); + t += Cartesian3.packedLength; + const r = Cartesian3.unpack(e, t, scratchInnerRadii$1); + t += Cartesian3.packedLength; + const o = e[t++], s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++], p = e[t]; + return defined(n) ? (n._radii = Cartesian3.clone(i, n._radii), n._innerRadii = Cartesian3.clone(r, n._innerRadii), n._minimumClock = o, n._maximumClock = s, n._minimumCone = c, n._maximumCone = l, n._stackPartitions = d, n._slicePartitions = f, n._subdivisions = h, n._offsetAttribute = p === -1 ? void 0 : p, n) : (scratchOptions$j.minimumClock = o, scratchOptions$j.maximumClock = s, scratchOptions$j.minimumCone = c, scratchOptions$j.maximumCone = l, scratchOptions$j.stackPartitions = d, scratchOptions$j.slicePartitions = f, scratchOptions$j.subdivisions = h, scratchOptions$j.offsetAttribute = p === -1 ? void 0 : p, new EllipsoidOutlineGeometry(scratchOptions$j)); +}; +EllipsoidOutlineGeometry.createGeometry = function(e) { + const t = e._radii; + if (t.x <= 0 || t.y <= 0 || t.z <= 0) + return; + const n = e._innerRadii; + if (n.x <= 0 || n.y <= 0 || n.z <= 0) + return; + const i = e._minimumClock, r = e._maximumClock, o = e._minimumCone, s = e._maximumCone, c = e._subdivisions, l = Ellipsoid.fromCartesian3(t); + let d = e._slicePartitions + 1, f = e._stackPartitions + 1; + d = Math.round( + d * Math.abs(r - i) / CesiumMath.TWO_PI + ), f = Math.round( + f * Math.abs(s - o) / CesiumMath.PI + ), d < 2 && (d = 2), f < 2 && (f = 2); + let h = 0, p = 1; + const m = n.x !== t.x || n.y !== t.y || n.z !== t.z; + let _ = !1, y = !1; + m && (p = 2, o > 0 && (_ = !0, h += d), s < Math.PI && (y = !0, h += d)); + const C = c * p * (f + d), T = new Float64Array(C * 3), x = 2 * (C + h - (d + f) * p), b = IndexDatatype$1.createTypedArray(C, x); + let S, E, A, D, P = 0; + const I = new Array(f), M = new Array(f); + for (S = 0; S < f; S++) + D = o + S * (s - o) / (f - 1), I[S] = sin$1(D), M[S] = cos$1(D); + const R = new Array(c), L = new Array(c); + for (S = 0; S < c; S++) + A = i + S * (r - i) / (c - 1), R[S] = sin$1(A), L[S] = cos$1(A); + for (S = 0; S < f; S++) + for (E = 0; E < c; E++) + T[P++] = t.x * I[S] * L[E], T[P++] = t.y * I[S] * R[E], T[P++] = t.z * M[S]; + if (m) + for (S = 0; S < f; S++) + for (E = 0; E < c; E++) + T[P++] = n.x * I[S] * L[E], T[P++] = n.y * I[S] * R[E], T[P++] = n.z * M[S]; + for (I.length = c, M.length = c, S = 0; S < c; S++) + D = o + S * (s - o) / (c - 1), I[S] = sin$1(D), M[S] = cos$1(D); + for (R.length = d, L.length = d, S = 0; S < d; S++) + A = i + S * (r - i) / (d - 1), R[S] = sin$1(A), L[S] = cos$1(A); + for (S = 0; S < c; S++) + for (E = 0; E < d; E++) + T[P++] = t.x * I[S] * L[E], T[P++] = t.y * I[S] * R[E], T[P++] = t.z * M[S]; + if (m) + for (S = 0; S < c; S++) + for (E = 0; E < d; E++) + T[P++] = n.x * I[S] * L[E], T[P++] = n.y * I[S] * R[E], T[P++] = n.z * M[S]; + for (P = 0, S = 0; S < f * p; S++) { + const O = S * c; + for (E = 0; E < c - 1; E++) + b[P++] = O + E, b[P++] = O + E + 1; + } + let g = f * c * p; + for (S = 0; S < d; S++) + for (E = 0; E < c - 1; E++) + b[P++] = g + S + E * d, b[P++] = g + S + (E + 1) * d; + if (m) + for (g = f * c * p + d * c, S = 0; S < d; S++) + for (E = 0; E < c - 1; E++) + b[P++] = g + S + E * d, b[P++] = g + S + (E + 1) * d; + if (m) { + let O = f * c * p, N = O + c * d; + if (_) + for (S = 0; S < d; S++) + b[P++] = O + S, b[P++] = N + S; + if (y) + for (O += c * d - d, N += c * d - d, S = 0; S < d; S++) + b[P++] = O + S, b[P++] = N + S; + } + const w = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: T + }) + }); + if (defined(e._offsetAttribute)) { + const O = T.length, N = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, F = new Uint8Array(O / 3).fill(N); + w.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: F + }); + } + return new Geometry({ + attributes: w, + indices: b, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: BoundingSphere.fromEllipsoid(l), + offsetAttribute: e._offsetAttribute + }); +}; +function SphereOutlineGeometry(e) { + const t = defaultValue(e.radius, 1), i = { + radii: new Cartesian3(t, t, t), + stackPartitions: e.stackPartitions, + slicePartitions: e.slicePartitions, + subdivisions: e.subdivisions + }; + this._ellipsoidGeometry = new EllipsoidOutlineGeometry(i), this._workerName = "createSphereOutlineGeometry"; +} +SphereOutlineGeometry.packedLength = EllipsoidOutlineGeometry.packedLength; +SphereOutlineGeometry.pack = function(e, t, n) { + return EllipsoidOutlineGeometry.pack( + e._ellipsoidGeometry, + t, + n + ); +}; +const scratchEllipsoidGeometry$1 = new EllipsoidOutlineGeometry(), scratchOptions$i = { + radius: void 0, + radii: new Cartesian3(), + stackPartitions: void 0, + slicePartitions: void 0, + subdivisions: void 0 +}; +SphereOutlineGeometry.unpack = function(e, t, n) { + const i = EllipsoidOutlineGeometry.unpack( + e, + t, + scratchEllipsoidGeometry$1 + ); + return scratchOptions$i.stackPartitions = i._stackPartitions, scratchOptions$i.slicePartitions = i._slicePartitions, scratchOptions$i.subdivisions = i._subdivisions, defined(n) ? (Cartesian3.clone(i._radii, scratchOptions$i.radii), n._ellipsoidGeometry = new EllipsoidOutlineGeometry(scratchOptions$i), n) : (scratchOptions$i.radius = i._radii.x, new SphereOutlineGeometry(scratchOptions$i)); +}; +SphereOutlineGeometry.createGeometry = function(e) { + return EllipsoidOutlineGeometry.createGeometry( + e._ellipsoidGeometry + ); +}; +function TileBoundingSphere(e, t) { + t === 0 && (t = CesiumMath.EPSILON7), this._boundingSphere = new BoundingSphere(e, t); +} +Object.defineProperties(TileBoundingSphere.prototype, { + /** + * The center of the bounding sphere + * + * @memberof TileBoundingSphere.prototype + * + * @type {Cartesian3} + * @readonly + */ + center: { + get: function() { + return this._boundingSphere.center; + } + }, + /** + * The radius of the bounding sphere + * + * @memberof TileBoundingSphere.prototype + * + * @type {number} + * @readonly + */ + radius: { + get: function() { + return this._boundingSphere.radius; + } + }, + /** + * The underlying bounding volume + * + * @memberof TileBoundingSphere.prototype + * + * @type {object} + * @readonly + */ + boundingVolume: { + get: function() { + return this._boundingSphere; + } + }, + /** + * The underlying bounding sphere + * + * @memberof TileBoundingSphere.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._boundingSphere; + } + } +}); +TileBoundingSphere.prototype.distanceToCamera = function(e) { + const t = this._boundingSphere; + return Math.max( + 0, + Cartesian3.distance(t.center, e.camera.positionWC) - t.radius + ); +}; +TileBoundingSphere.prototype.intersectPlane = function(e) { + return BoundingSphere.intersectPlane(this._boundingSphere, e); +}; +TileBoundingSphere.prototype.update = function(e, t) { + Cartesian3.clone(e, this._boundingSphere.center), this._boundingSphere.radius = t; +}; +TileBoundingSphere.prototype.createDebugVolume = function(e) { + const t = new SphereOutlineGeometry({ + radius: this.radius + }), n = Matrix4.fromTranslation( + this.center, + new Matrix4.clone(Matrix4.IDENTITY) + ), i = new GeometryInstance({ + geometry: t, + id: "outline", + modelMatrix: n, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }); + return new Primitive$3({ + geometryInstances: i, + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); +}; +const scratchU = new Cartesian3(), scratchV = new Cartesian3(), scratchW = new Cartesian3(), scratchCartesian$8 = new Cartesian3(); +function computeMissingVector(e, t, n) { + n = Cartesian3.cross(e, t, n); + const i = Cartesian3.magnitude(n); + return Cartesian3.multiplyByScalar( + n, + CesiumMath.EPSILON7 / i, + n + ); +} +function findOrthogonalVector(e, t) { + const n = Cartesian3.normalize(e, scratchCartesian$8), i = Cartesian3.equalsEpsilon( + n, + Cartesian3.UNIT_X, + CesiumMath.EPSILON6 + ) ? Cartesian3.UNIT_Y : Cartesian3.UNIT_X; + return computeMissingVector(e, i, t); +} +function checkHalfAxes(e) { + let t = Matrix3.getColumn(e, 0, scratchU), n = Matrix3.getColumn(e, 1, scratchV), i = Matrix3.getColumn(e, 2, scratchW); + const r = Cartesian3.equals(t, Cartesian3.ZERO), o = Cartesian3.equals(n, Cartesian3.ZERO), s = Cartesian3.equals(i, Cartesian3.ZERO); + return !r && !o && !s ? e : r && o && s ? (e[0] = CesiumMath.EPSILON7, e[4] = CesiumMath.EPSILON7, e[8] = CesiumMath.EPSILON7, e) : (r && !o && !s ? t = computeMissingVector(n, i, t) : !r && o && !s ? n = computeMissingVector(t, i, n) : !r && !o && s ? i = computeMissingVector(n, t, i) : r ? o ? s || (t = findOrthogonalVector(i, t), n = computeMissingVector(i, t, n)) : (t = findOrthogonalVector(n, t), i = computeMissingVector(n, t, i)) : (n = findOrthogonalVector(t, n), i = computeMissingVector(n, t, i)), Matrix3.setColumn(e, 0, t, e), Matrix3.setColumn(e, 1, n, e), Matrix3.setColumn(e, 2, i, e), e); +} +function TileOrientedBoundingBox(e, t) { + t = checkHalfAxes(t), this._orientedBoundingBox = new OrientedBoundingBox(e, t), this._boundingSphere = BoundingSphere.fromOrientedBoundingBox( + this._orientedBoundingBox + ); +} +Object.defineProperties(TileOrientedBoundingBox.prototype, { + /** + * The underlying bounding volume. + * + * @memberof TileOrientedBoundingBox.prototype + * + * @type {OrientedBoundingBox} + * @readonly + */ + boundingVolume: { + get: function() { + return this._orientedBoundingBox; + } + }, + /** + * The underlying bounding sphere. + * + * @memberof TileOrientedBoundingBox.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._boundingSphere; + } + } +}); +TileOrientedBoundingBox.prototype.distanceToCamera = function(e) { + return Math.sqrt( + this._orientedBoundingBox.distanceSquaredTo(e.camera.positionWC) + ); +}; +TileOrientedBoundingBox.prototype.intersectPlane = function(e) { + return this._orientedBoundingBox.intersectPlane(e); +}; +TileOrientedBoundingBox.prototype.update = function(e, t) { + Cartesian3.clone(e, this._orientedBoundingBox.center), t = checkHalfAxes(t), Matrix3.clone(t, this._orientedBoundingBox.halfAxes), BoundingSphere.fromOrientedBoundingBox( + this._orientedBoundingBox, + this._boundingSphere + ); +}; +TileOrientedBoundingBox.prototype.createDebugVolume = function(e) { + const t = new BoxOutlineGeometry({ + // Make a 2x2x2 cube + minimum: new Cartesian3(-1, -1, -1), + maximum: new Cartesian3(1, 1, 1) + }), n = Matrix4.fromRotationTranslation( + this.boundingVolume.halfAxes, + this.boundingVolume.center + ), i = new GeometryInstance({ + geometry: t, + id: "outline", + modelMatrix: n, + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(e) + } + }); + return new Primitive$3({ + geometryInstances: i, + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); +}; +function Cesium3DTile(e, t, n, i) { + this._tileset = e, this._header = n; + const r = defined(n.contents), o = r && n.contents.length > 1 || hasExtension(n, "3DTILES_multiple_contents"), s = r && !o ? n.contents[0] : n.content; + this._contentHeader = s, this.transform = defined(n.transform) ? Matrix4.unpack(n.transform) : Matrix4.clone(Matrix4.IDENTITY); + const c = defined(i) ? i.computedTransform : e.modelMatrix, l = Matrix4.multiply( + c, + this.transform, + new Matrix4() + ), d = defined(i) ? i._initialTransform : Matrix4.IDENTITY; + this._initialTransform = Matrix4.multiply( + d, + this.transform, + new Matrix4() + ), this.computedTransform = l, this.metadata = findTileMetadata(e, n), this._verticalExaggeration = 1, this._verticalExaggerationRelativeHeight = 0, this._boundingVolume = this.createBoundingVolume( + n.boundingVolume, + l + ), this._boundingVolume2D = void 0; + let f; + defined(s) && defined(s.boundingVolume) && (f = this.createBoundingVolume( + s.boundingVolume, + l + )), this._contentBoundingVolume = f, this._contentBoundingVolume2D = void 0; + let h; + defined(n.viewerRequestVolume) && (h = this.createBoundingVolume( + n.viewerRequestVolume, + l + )), this._viewerRequestVolume = h, this.geometricError = n.geometricError, this._geometricError = n.geometricError, defined(this._geometricError) || (this._geometricError = defined(i) ? i._geometricError : e._geometricError, Cesium3DTile._deprecationWarning( + "geometricErrorUndefined", + "Required property geometricError is undefined for this tile. Using parent's geometric error instead." + )), this.updateGeometricErrorScale(); + let p; + defined(n.refine) ? ((n.refine === "replace" || n.refine === "add") && Cesium3DTile._deprecationWarning( + "lowercase-refine", + `This tile uses a lowercase refine "${n.refine}". Instead use "${n.refine.toUpperCase()}".` + ), p = n.refine.toUpperCase() === "REPLACE" ? Cesium3DTileRefine$1.REPLACE : Cesium3DTileRefine$1.ADD) : defined(i) ? p = i.refine : p = Cesium3DTileRefine$1.REPLACE, this.refine = p, this.children = [], this.parent = i; + let m, _ = !1, y, C, T; + if (t = Resource.createIfNeeded(t), o) + y = Cesium3DTileContentState$1.UNLOADED, C = t.clone(); + else if (defined(s)) { + let E = s.uri; + defined(s.url) && (Cesium3DTile._deprecationWarning( + "contentUrl", + 'This tileset JSON uses the "content.url" property which has been deprecated. Use "content.uri" instead.' + ), E = s.url), E === "" ? (Cesium3DTile._deprecationWarning( + "contentUriEmpty", + "content.uri property is an empty string, which creates a circular dependency, making this tileset invalid. Omit the content property instead" + ), m = new Empty3DTileContent(e, this), _ = !0, y = Cesium3DTileContentState$1.READY) : (y = Cesium3DTileContentState$1.UNLOADED, C = t.getDerivedResource({ + url: E + }), T = RequestScheduler.getServerKey( + C.getUrlComponent() + )); + } else + m = new Empty3DTileContent(e, this), _ = !0, y = Cesium3DTileContentState$1.READY; + this._content = m, this._contentResource = C, this._contentState = y, this._expiredContent = void 0, this._serverKey = T, this.hasEmptyContent = _, this.hasTilesetContent = !1, this.hasImplicitContent = !1, this.hasImplicitContentMetadata = !1, this.hasMultipleContents = o, this.cacheNode = void 0; + const x = n.expire; + let b, S; + defined(x) && (b = x.duration, defined(x.date) && (S = JulianDate.fromIso8601(x.date))), this.expireDuration = b, this.expireDate = S, this.lastStyleTime = 0, this._optimChildrenWithinParent = Cesium3DTileOptimizationHint$1.NOT_COMPUTED, this.clippingPlanesDirty = !1, this.clippingPolygonsDirty = !1, this.priorityDeferred = !1, this.implicitTileset = void 0, this.implicitCoordinates = void 0, this.implicitSubtree = void 0, this._distanceToCamera = 0, this._centerZDepth = 0, this._screenSpaceError = 0, this._screenSpaceErrorProgressiveResolution = 0, this._visibilityPlaneMask = 0, this._visible = !1, this._inRequestVolume = !1, this._finalResolution = !0, this._depth = 0, this._stackLength = 0, this._selectionDepth = 0, this._updatedVisibilityFrame = 0, this._touchedFrame = 0, this._visitedFrame = 0, this._selectedFrame = 0, this._wasSelectedLastFrame = !1, this._requestedFrame = 0, this._ancestorWithContent = void 0, this._ancestorWithContentAvailable = void 0, this._refines = !1, this._shouldSelect = !1, this._isClipped = !0, this._isClippedByPolygon = !1, this._clippingPlanesState = 0, this._clippingPolygonsState = 0, this._debugBoundingVolume = void 0, this._debugContentBoundingVolume = void 0, this._debugViewerRequestVolume = void 0, this._debugColor = Color.fromRandom({ alpha: 1 }), this._debugColorizeTiles = !1, this._priority = 0, this._priorityHolder = this, this._priorityProgressiveResolution = !1, this._priorityProgressiveResolutionScreenSpaceErrorLeaf = !1, this._priorityReverseScreenSpaceError = 0, this._foveatedFactor = 0, this._wasMinPriorityChild = !1, this._loadTimestamp = new JulianDate(), this._commandsLength = 0, this._color = void 0, this._colorDirty = !1, this._request = void 0; +} +Cesium3DTile._deprecationWarning = deprecationWarning; +Object.defineProperties(Cesium3DTile.prototype, { + /** + * The tileset containing this tile. + * + * @memberof Cesium3DTile.prototype + * + * @type {Cesium3DTileset} + * @readonly + */ + tileset: { + get: function() { + return this._tileset; + } + }, + /** + * The tile's content. This represents the actual tile's payload, + * not the content's metadata in the tileset JSON file. + * + * @memberof Cesium3DTile.prototype + * + * @type {Cesium3DTileContent} + * @readonly + */ + content: { + get: function() { + return this._content; + } + }, + /** + * Get the tile's bounding volume. + * + * @memberof Cesium3DTile.prototype + * + * @type {TileBoundingVolume} + * @readonly + * @private + */ + boundingVolume: { + get: function() { + return this._boundingVolume; + } + }, + /** + * Get the bounding volume of the tile's contents. This defaults to the + * tile's bounding volume when the content's bounding volume is + * undefined. + * + * @memberof Cesium3DTile.prototype + * + * @type {TileBoundingVolume} + * @readonly + * @private + */ + contentBoundingVolume: { + get: function() { + return defaultValue(this._contentBoundingVolume, this._boundingVolume); + } + }, + /** + * Get the bounding sphere derived from the tile's bounding volume. + * + * @memberof Cesium3DTile.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._boundingVolume.boundingSphere; + } + }, + /** + * Determines if the tile is visible within the current field of view + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + isVisible: { + get: function() { + return this._visible && this._inRequestVolume; + } + }, + /** + * Returns the extras property in the tileset JSON for this tile, which contains application specific metadata. + * Returns undefined if extras does not exist. + * + * @memberof Cesium3DTile.prototype + * + * @type {object} + * @readonly + * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#specifying-extensions-and-application-specific-extras|Extras in the 3D Tiles specification.} + */ + extras: { + get: function() { + return this._header.extras; + } + }, + /** + * Gets or sets the tile's highlight color. + * + * @memberof Cesium3DTile.prototype + * + * @type {Color} + * + * @default {@link Color.WHITE} + * + * @private + */ + color: { + get: function() { + return defined(this._color) || (this._color = new Color()), Color.clone(this._color); + }, + set: function(e) { + this._color = Color.clone(e, this._color), this._colorDirty = !0; + } + }, + /** + * Determines if the tile's content is renderable. false if the + * tile has empty content or if it points to an external tileset or implicit content + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + hasRenderableContent: { + get: function() { + return !this.hasEmptyContent && !this.hasTilesetContent && !this.hasImplicitContent; + } + }, + /** + * Determines if the tile has available content to render. true if the tile's + * content is ready or if it has expired content that renders while new content loads; otherwise, + * false. + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + contentAvailable: { + get: function() { + return this.contentReady && this.hasRenderableContent || defined(this._expiredContent) && !this.contentFailed; + } + }, + /** + * Determines if the tile's content is ready. This is automatically true for + * tile's with empty content. + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + contentReady: { + get: function() { + return this._contentState === Cesium3DTileContentState$1.READY; + } + }, + /** + * Determines if the tile's content has not be requested. true if tile's + * content has not be requested; otherwise, false. + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + contentUnloaded: { + get: function() { + return this._contentState === Cesium3DTileContentState$1.UNLOADED; + } + }, + /** + * Determines if the tile has renderable content which is unloaded + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + hasUnloadedRenderableContent: { + get: function() { + return this.hasRenderableContent && this.contentUnloaded; + } + }, + /** + * Determines if the tile's content is expired. true if tile's + * content is expired; otherwise, false. + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + contentExpired: { + get: function() { + return this._contentState === Cesium3DTileContentState$1.EXPIRED; + } + }, + /** + * Determines if the tile's content failed to load. true if the tile's + * content failed to load; otherwise, false. + * + * @memberof Cesium3DTile.prototype + * + * @type {boolean} + * @readonly + * + * @private + */ + contentFailed: { + get: function() { + return this._contentState === Cesium3DTileContentState$1.FAILED; + } + }, + /** + * Returns the number of draw commands used by this tile. + * + * @readonly + * + * @private + */ + commandsLength: { + get: function() { + return this._commandsLength; + } + } +}); +const scratchCartesian$7 = new Cartesian3(); +function isPriorityDeferred(e, t) { + const { tileset: n, boundingSphere: i } = e, { radius: r, center: o } = i, { camera: s } = t, c = Cartesian3.multiplyByScalar( + s.directionWC, + e._centerZDepth, + scratchCartesian$7 + ), l = Cartesian3.add( + s.positionWC, + c, + scratchCartesian$7 + ), d = Cartesian3.subtract( + l, + o, + scratchCartesian$7 + ); + if (Cartesian3.magnitude(d) > r) { + const S = Cartesian3.normalize(d, scratchCartesian$7), E = Cartesian3.multiplyByScalar( + S, + r, + scratchCartesian$7 + ), A = Cartesian3.add( + o, + E, + scratchCartesian$7 + ), D = Cartesian3.subtract( + A, + s.positionWC, + scratchCartesian$7 + ), P = Cartesian3.normalize( + D, + scratchCartesian$7 + ); + e._foveatedFactor = 1 - Math.abs(Cartesian3.dot(s.directionWC, P)); + } else + e._foveatedFactor = 0; + const p = e.refine === Cesium3DTileRefine$1.REPLACE, m = n.isSkippingLevelOfDetail; + if (p && !m || !n.foveatedScreenSpaceError || n.foveatedConeSize === 1 || e._priorityProgressiveResolution && p && m || n._pass === Cesium3DTilePass$1.PRELOAD_FLIGHT || n._pass === Cesium3DTilePass$1.PRELOAD) + return !1; + const _ = 1 - Math.cos(s.frustum.fov * 0.5), y = n.foveatedConeSize * _; + if (e._foveatedFactor <= y) + return !1; + const C = _ - y, T = CesiumMath.clamp( + (e._foveatedFactor - y) / C, + 0, + 1 + ), x = n.foveatedInterpolationCallback( + n.foveatedMinimumScreenSpaceErrorRelaxation, + n.memoryAdjustedScreenSpaceError, + T + ), b = e._screenSpaceError === 0 && defined(e.parent) ? e.parent._screenSpaceError * 0.5 : e._screenSpaceError; + return n.memoryAdjustedScreenSpaceError - x <= b; +} +const scratchJulianDate$2 = new JulianDate(); +Cesium3DTile.prototype.getScreenSpaceError = function(e, t, n) { + const i = this._tileset, r = defaultValue(n, 1), o = defined(this.parent) ? this.parent.geometricError : i._scaledGeometricError, s = t ? o : this.geometricError; + if (s === 0) + return 0; + const { camera: c, context: l } = e; + let d = c.frustum; + const f = l.drawingBufferWidth, h = l.drawingBufferHeight * r; + let p; + if (e.mode === SceneMode$1.SCENE2D || d instanceof OrthographicFrustum) { + const m = d.offCenterFrustum; + defined(m) && (d = m); + const _ = Math.max(d.top - d.bottom, d.right - d.left) / Math.max(f, h); + p = s / _; + } else { + const m = Math.max(this._distanceToCamera, CesiumMath.EPSILON7), _ = d.sseDenominator; + if (p = s * h / (m * _), i.dynamicScreenSpaceError) { + const y = i._dynamicScreenSpaceErrorComputedDensity, C = i.dynamicScreenSpaceErrorFactor, T = CesiumMath.fog(m, y) * C; + p -= T; + } + } + return p /= e.pixelRatio, p; +}; +function isPriorityProgressiveResolution(e, t) { + if (e.progressiveResolutionHeightFraction <= 0 || e.progressiveResolutionHeightFraction > 0.5) + return !1; + const n = e.memoryAdjustedScreenSpaceError; + let i = t._screenSpaceErrorProgressiveResolution > n; + t._priorityProgressiveResolutionScreenSpaceErrorLeaf = !1; + const r = t.parent, o = t._screenSpaceErrorProgressiveResolution <= n, s = defined(r) && r._screenSpaceErrorProgressiveResolution > n; + return o && s && (t._priorityProgressiveResolutionScreenSpaceErrorLeaf = !0, i = !0), i; +} +function getPriorityReverseScreenSpaceError(e, t) { + const n = t.parent, r = defined(n) && (!e.isSkippingLevelOfDetail || t._screenSpaceError === 0 || n.hasTilesetContent || n.hasImplicitContent) ? n._screenSpaceError : t._screenSpaceError; + return e.root._screenSpaceError - r; +} +Cesium3DTile.prototype.updateVisibility = function(e) { + const { parent: t, tileset: n } = this; + if (this._updatedVisibilityFrame === n._updatedVisibilityFrame) + return; + const i = defined(t) ? t.computedTransform : n.modelMatrix, r = defined(t) ? t._visibilityPlaneMask : CullingVolume.MASK_INDETERMINATE; + this.updateTransform(i, e), this._distanceToCamera = this.distanceToTile(e), this._centerZDepth = this.distanceToTileCenter(e), this._screenSpaceError = this.getScreenSpaceError(e, !1), this._screenSpaceErrorProgressiveResolution = this.getScreenSpaceError( + e, + !1, + n.progressiveResolutionHeightFraction + ), this._visibilityPlaneMask = this.visibility( + e, + r + ), this._visible = this._visibilityPlaneMask !== CullingVolume.MASK_OUTSIDE, this._inRequestVolume = this.insideViewerRequestVolume(e), this._priorityReverseScreenSpaceError = getPriorityReverseScreenSpaceError( + n, + this + ), this._priorityProgressiveResolution = isPriorityProgressiveResolution( + n, + this + ), this.priorityDeferred = isPriorityDeferred(this, e), this._updatedVisibilityFrame = n._updatedVisibilityFrame; +}; +Cesium3DTile.prototype.updateExpiration = function() { + if (defined(this.expireDate) && this.contentReady && !this.hasEmptyContent && !this.hasMultipleContents) { + const e = JulianDate.now(scratchJulianDate$2); + JulianDate.lessThan(this.expireDate, e) && (this._contentState = Cesium3DTileContentState$1.EXPIRED, this._expiredContent = this._content); + } +}; +function updateExpireDate(e) { + if (!defined(e.expireDuration)) + return; + const t = JulianDate.now(scratchJulianDate$2); + JulianDate.addSeconds( + t, + e.expireDuration, + t + ), defined(e.expireDate) ? JulianDate.lessThan(e.expireDate, t) && JulianDate.clone(t, e.expireDate) : e.expireDate = JulianDate.clone(t); +} +function createPriorityFunction(e) { + return function() { + return e._priority; + }; +} +Cesium3DTile.prototype.requestContent = function() { + if (!this.hasEmptyContent) + return this.hasMultipleContents ? requestMultipleContents(this) : requestSingleContent(this); +}; +function requestMultipleContents(e) { + let t = e._content; + const n = e._tileset; + if (!defined(t)) { + const r = hasExtension(e._header, "3DTILES_multiple_contents") ? e._header.extensions["3DTILES_multiple_contents"] : e._header; + t = new Multiple3DTileContent( + n, + e, + e._contentResource.clone(), + r + ), e._content = t; + } + const i = t.requestInnerContents(); + if (defined(i)) + return e._contentState = Cesium3DTileContentState$1.LOADING, i.then((r) => { + if (!e.isDestroyed() && defined(r)) + return e._contentState = Cesium3DTileContentState$1.PROCESSING, t; + }).catch((r) => { + if (!e.isDestroyed()) + throw e._contentState = Cesium3DTileContentState$1.FAILED, r; + }); +} +async function processArrayBuffer(e, t, n, i, r) { + const o = e._contentState; + e._contentState = Cesium3DTileContentState$1.LOADING, ++t.statistics.numberOfPendingRequests; + let s; + try { + s = await r; + } catch (c) { + if (--t.statistics.numberOfPendingRequests, e.isDestroyed()) + return; + if (n.cancelled || n.state === RequestState$1.CANCELLED) { + e._contentState = o, ++t.statistics.numberOfAttemptedRequests; + return; + } + throw e._contentState = Cesium3DTileContentState$1.FAILED, c; + } + if (e.isDestroyed()) { + --t.statistics.numberOfPendingRequests; + return; + } + if (n.cancelled || n.state === RequestState$1.CANCELLED) { + e._contentState = o, --t.statistics.numberOfPendingRequests, ++t.statistics.numberOfAttemptedRequests; + return; + } + try { + const c = await makeContent(e, s); + return --t.statistics.numberOfPendingRequests, e.isDestroyed() ? void 0 : (i && (e.expireDate = void 0), e._content = c, e._contentState = Cesium3DTileContentState$1.PROCESSING, c); + } catch (c) { + if (--t.statistics.numberOfPendingRequests, e.isDestroyed()) + return; + throw e._contentState = Cesium3DTileContentState$1.FAILED, c; + } +} +function requestSingleContent(e) { + const t = e._contentResource.clone(), n = e.contentExpired; + n && t.setQueryParameters({ + expired: e.expireDate.toString() + }); + const i = new Request({ + throttle: !0, + throttleByServer: !0, + type: RequestType$1.TILES3D, + priorityFunction: createPriorityFunction(e), + serverKey: e._serverKey + }); + e._request = i, t.request = i; + const r = e._tileset, o = t.fetchArrayBuffer(); + if (!defined(o)) { + ++r.statistics.numberOfAttemptedRequests; + return; + } + return processArrayBuffer(e, r, i, n, o); +} +async function makeContent(e, t) { + const n = preprocess3DTileContent(t), i = e._tileset; + i._disableSkipLevelOfDetail = i._disableSkipLevelOfDetail || n.contentType === Cesium3DTileContentType$1.GEOMETRY || n.contentType === Cesium3DTileContentType$1.VECTOR, (n.contentType === Cesium3DTileContentType$1.IMPLICIT_SUBTREE || n.contentType === Cesium3DTileContentType$1.IMPLICIT_SUBTREE_JSON) && (e.hasImplicitContent = !0), n.contentType === Cesium3DTileContentType$1.EXTERNAL_TILESET && (e.hasTilesetContent = !0); + let r; + const o = Cesium3DTileContentFactory[n.contentType]; + if (e.isDestroyed()) + return; + defined(n.binaryPayload) ? r = await Promise.resolve( + o( + i, + e, + e._contentResource, + n.binaryPayload.buffer, + 0 + ) + ) : r = await Promise.resolve( + o( + i, + e, + e._contentResource, + n.jsonPayload + ) + ); + const s = e._contentHeader; + if (e.hasImplicitContentMetadata) { + const l = e.implicitSubtree, d = e.implicitCoordinates; + r.metadata = l.getContentMetadataView(d, 0); + } else e.hasImplicitContent || (r.metadata = findContentMetadata(i, s)); + const c = findGroupMetadata(i, s); + return defined(c) && (r.group = new Cesium3DContentGroup({ + metadata: c + })), r; +} +Cesium3DTile.prototype.cancelRequests = function() { + this.hasMultipleContents ? this._content.cancelRequests() : this._request.cancel(); +}; +Cesium3DTile.prototype.unloadContent = function() { + this.hasRenderableContent && (this._content = this._content && this._content.destroy(), this._contentState = Cesium3DTileContentState$1.UNLOADED, this.lastStyleTime = 0, this.clippingPlanesDirty = this._clippingPlanesState === 0, this._clippingPlanesState = 0, this.clippingPolygonsDirty = this._clippingPolygonsState === 0, this._clippingPolygonsState = 0, this._debugColorizeTiles = !1, this._debugBoundingVolume = this._debugBoundingVolume && this._debugBoundingVolume.destroy(), this._debugContentBoundingVolume = this._debugContentBoundingVolume && this._debugContentBoundingVolume.destroy(), this._debugViewerRequestVolume = this._debugViewerRequestVolume && this._debugViewerRequestVolume.destroy()); +}; +const scratchProjectedBoundingSphere = new BoundingSphere(); +function getBoundingVolume(e, t) { + if (t.mode !== SceneMode$1.SCENE3D && !defined(e._boundingVolume2D)) { + const n = e._boundingVolume.boundingSphere, i = BoundingSphere.projectTo2D( + n, + t.mapProjection, + scratchProjectedBoundingSphere + ); + e._boundingVolume2D = new TileBoundingSphere( + i.center, + i.radius + ); + } + return t.mode !== SceneMode$1.SCENE3D ? e._boundingVolume2D : e._boundingVolume; +} +function getContentBoundingVolume(e, t) { + if (t.mode !== SceneMode$1.SCENE3D && !defined(e._contentBoundingVolume2D)) { + const n = e._contentBoundingVolume.boundingSphere, i = BoundingSphere.projectTo2D( + n, + t.mapProjection, + scratchProjectedBoundingSphere + ); + e._contentBoundingVolume2D = new TileBoundingSphere( + i.center, + i.radius + ); + } + return t.mode !== SceneMode$1.SCENE3D ? e._contentBoundingVolume2D : e._contentBoundingVolume; +} +Cesium3DTile.prototype.visibility = function(e, t) { + const n = e.cullingVolume, i = getBoundingVolume(this, e), r = this._tileset, o = r.clippingPlanes; + if (defined(o) && o.enabled) { + const c = o.computeIntersectionWithBoundingVolume( + i, + r.clippingPlanesOriginMatrix + ); + if (this._isClipped = c !== Intersect$1.INSIDE, c === Intersect$1.OUTSIDE) + return CullingVolume.MASK_OUTSIDE; + } + const s = r.clippingPolygons; + if (defined(s) && s.enabled) { + const c = s.computeIntersectionWithBoundingVolume( + i + ); + this._isClippedByPolygon = c !== Intersect$1.OUTSIDE; + } + return n.computeVisibilityWithPlaneMask( + i, + t + ); +}; +Cesium3DTile.prototype.contentVisibility = function(e) { + if (!defined(this._contentBoundingVolume) || this._visibilityPlaneMask === CullingVolume.MASK_INSIDE) + return Intersect$1.INSIDE; + const t = e.cullingVolume, n = getContentBoundingVolume(this, e), i = this._tileset, r = i.clippingPlanes; + if (defined(r) && r.enabled) { + const s = r.computeIntersectionWithBoundingVolume( + n, + i.clippingPlanesOriginMatrix + ); + if (this._isClipped = s !== Intersect$1.INSIDE, s === Intersect$1.OUTSIDE) + return Intersect$1.OUTSIDE; + } + const o = i.clippingPolygons; + if (defined(o) && o.enabled) { + const s = o.computeIntersectionWithBoundingVolume( + n + ); + if (this._isClippedByPolygon = s !== Intersect$1.OUTSIDE, s === Intersect$1.INSIDE) + return Intersect$1.OUTSIDE; + } + return t.computeVisibility(n); +}; +Cesium3DTile.prototype.distanceToTile = function(e) { + return getBoundingVolume(this, e).distanceToCamera(e); +}; +const scratchToTileCenter = new Cartesian3(); +Cesium3DTile.prototype.distanceToTileCenter = function(e) { + const n = getBoundingVolume(this, e).boundingVolume, i = Cartesian3.subtract( + n.center, + e.camera.positionWC, + scratchToTileCenter + ); + return Cartesian3.dot(e.camera.directionWC, i); +}; +Cesium3DTile.prototype.insideViewerRequestVolume = function(e) { + const t = this._viewerRequestVolume; + return !defined(t) || t.distanceToCamera(e) === 0; +}; +const scratchMatrix$3 = new Matrix3(), scratchScale$7 = new Cartesian3(), scratchHalfAxes = new Matrix3(), scratchCenter$7 = new Cartesian3(), scratchRectangle$7 = new Rectangle(), scratchOrientedBoundingBox = new OrientedBoundingBox(), scratchTransform = new Matrix4(); +function createBox(e, t, n) { + let i = Cartesian3.fromElements(e[0], e[1], e[2], scratchCenter$7), r = Matrix3.fromArray(e, 3, scratchHalfAxes); + i = Matrix4.multiplyByPoint(t, i, i); + const o = Matrix4.getMatrix3(t, scratchMatrix$3); + return r = Matrix3.multiply(o, r, r), defined(n) ? (n.update(i, r), n) : new TileOrientedBoundingBox(i, r); +} +function createBoxFromTransformedRegion(e, t, n, i) { + const r = Rectangle.unpack(e, 0, scratchRectangle$7), o = e[4], s = e[5], c = OrientedBoundingBox.fromRectangle( + r, + o, + s, + Ellipsoid.WGS84, + scratchOrientedBoundingBox + ); + let l = c.center, d = c.halfAxes; + t = Matrix4.multiplyTransformation( + t, + Matrix4.inverseTransformation(n, scratchTransform), + scratchTransform + ), l = Matrix4.multiplyByPoint(t, l, l); + const f = Matrix4.getMatrix3(t, scratchMatrix$3); + return d = Matrix3.multiply(f, d, d), defined(i) && i instanceof TileOrientedBoundingBox ? (i.update(l, d), i) : new TileOrientedBoundingBox(l, d); +} +function createRegion(e, t, n, i) { + if (!Matrix4.equalsEpsilon(t, n, CesiumMath.EPSILON8)) + return createBoxFromTransformedRegion( + e, + t, + n, + i + ); + const r = Rectangle.unpack(e, 0, scratchRectangle$7); + return defined(i) ? (i.rectangle = Rectangle.clone(r, i.rectangle), i.minimumHeight = e[4], i.maximumHeight = e[5], i.computeBoundingVolumes(Ellipsoid.WGS84), i) : new TileBoundingRegion({ + rectangle: r, + minimumHeight: e[4], + maximumHeight: e[5] + }); +} +function createSphere(e, t, n) { + let i = Cartesian3.fromElements( + e[0], + e[1], + e[2], + scratchCenter$7 + ), r = e[3]; + i = Matrix4.multiplyByPoint(t, i, i); + const o = Matrix4.getScale(t, scratchScale$7), s = Cartesian3.maximumComponent(o); + return r *= s, defined(n) ? (n.update(i, r), n) : new TileBoundingSphere(i, r); +} +Cesium3DTile.prototype.createBoundingVolume = function(e, t, n) { + const i = this.metadata; + let r; + if (defined(i) && (r = BoundingVolumeSemantics.parseBoundingVolumeSemantic( + "TILE", + i + )), defined(r) && (e = r), !defined(e)) + throw new RuntimeError("boundingVolume must be defined"); + if (hasExtension(e, "3DTILES_bounding_volume_S2")) + return new TileBoundingS2Cell( + e.extensions["3DTILES_bounding_volume_S2"] + ); + const { box: o, region: s, sphere: c } = e; + if (defined(o)) { + const l = createBox(o, t, n); + return this._verticalExaggeration !== 1 && exaggerateBoundingBox( + l, + this._verticalExaggeration, + this._verticalExaggerationRelativeHeight + ), l; + } + if (defined(s)) { + const l = createRegion( + s, + t, + this._initialTransform, + n + ); + return this._verticalExaggeration === 1 || (l instanceof TileOrientedBoundingBox ? exaggerateBoundingBox( + l, + this._verticalExaggeration, + this._verticalExaggerationRelativeHeight + ) : (l.minimumHeight = VerticalExaggeration.getHeight( + l.minimumHeight, + this._verticalExaggeration, + this._verticalExaggerationRelativeHeight + ), l.maximumHeight = VerticalExaggeration.getHeight( + l.maximumHeight, + this._verticalExaggeration, + this._verticalExaggerationRelativeHeight + ), l.computeBoundingVolumes(Ellipsoid.WGS84))), l; + } + if (defined(c)) { + const l = createSphere(c, t, n); + if (this._verticalExaggeration !== 1) { + const d = VerticalExaggeration.getPosition( + l.center, + Ellipsoid.WGS84, + this._verticalExaggeration, + this._verticalExaggerationRelativeHeight, + scratchCenter$7 + ), f = l.radius * this._verticalExaggeration; + l.update(d, f); + } + return l; + } + throw new RuntimeError( + "boundingVolume must contain a sphere, region, or box" + ); +}; +const scratchExaggeratedCorners = Cartesian3.unpackArray( + new Array(8 * 3).fill(0) +); +function exaggerateBoundingBox(e, t, n) { + const i = e.boundingVolume.computeCorners(scratchExaggeratedCorners).map( + (o) => VerticalExaggeration.getPosition( + o, + Ellipsoid.WGS84, + t, + n, + o + ) + ), r = OrientedBoundingBox.fromPoints( + i, + scratchOrientedBoundingBox + ); + e.update( + r.center, + r.halfAxes + ); +} +Cesium3DTile.prototype.updateTransform = function(e, t) { + e = defaultValue(e, Matrix4.IDENTITY); + const n = Matrix4.multiplyTransformation( + e, + this.transform, + scratchTransform + ), i = !Matrix4.equals( + n, + this.computedTransform + ), r = defined(t) && (this._verticalExaggeration !== t.verticalExaggeration || this._verticalExaggerationRelativeHeight !== t.verticalExaggerationRelativeHeight); + if (!i && !r) + return; + i && Matrix4.clone(n, this.computedTransform), r && (this._verticalExaggeration = t.verticalExaggeration, this._verticalExaggerationRelativeHeight = t.verticalExaggerationRelativeHeight); + const o = this._header, s = this._contentHeader; + this._boundingVolume = this.createBoundingVolume( + o.boundingVolume, + this.computedTransform, + this._boundingVolume + ), defined(this._contentBoundingVolume) && (this._contentBoundingVolume = this.createBoundingVolume( + s.boundingVolume, + this.computedTransform, + this._contentBoundingVolume + )), defined(this._viewerRequestVolume) && (this._viewerRequestVolume = this.createBoundingVolume( + o.viewerRequestVolume, + this.computedTransform, + this._viewerRequestVolume + )), this.updateGeometricErrorScale(), this._debugBoundingVolume = this._debugBoundingVolume && this._debugBoundingVolume.destroy(), this._debugContentBoundingVolume = this._debugContentBoundingVolume && this._debugContentBoundingVolume.destroy(), this._debugViewerRequestVolume = this._debugViewerRequestVolume && this._debugViewerRequestVolume.destroy(); +}; +Cesium3DTile.prototype.updateGeometricErrorScale = function() { + const e = Matrix4.getScale(this.computedTransform, scratchScale$7), t = Cartesian3.maximumComponent(e); + if (this.geometricError = this._geometricError * t, !defined(this.parent)) { + const n = this._tileset; + n._scaledGeometricError = n._geometricError * t; + } +}; +function applyDebugSettings$1(e, t, n, i) { + if (!i.isRender) + return; + const r = defined(e._contentHeader) && defined(e._contentHeader.boundingVolume), o = t.debugShowBoundingVolume || t.debugShowContentBoundingVolume && !r; + if (o) { + let l; + e._finalResolution ? e.hasRenderableContent ? l = Color.WHITE : l = Color.DARKGRAY : l = Color.YELLOW, defined(e._debugBoundingVolume) || (e._debugBoundingVolume = e._boundingVolume.createDebugVolume(l)), e._debugBoundingVolume.update(n); + const d = e._debugBoundingVolume.getGeometryInstanceAttributes( + "outline" + ); + d.color = ColorGeometryInstanceAttribute.toValue( + l, + d.color + ); + } else !o && defined(e._debugBoundingVolume) && (e._debugBoundingVolume = e._debugBoundingVolume.destroy()); + t.debugShowContentBoundingVolume && r ? (defined(e._debugContentBoundingVolume) || (e._debugContentBoundingVolume = e._contentBoundingVolume.createDebugVolume( + Color.BLUE + )), e._debugContentBoundingVolume.update(n)) : !t.debugShowContentBoundingVolume && defined(e._debugContentBoundingVolume) && (e._debugContentBoundingVolume = e._debugContentBoundingVolume.destroy()), t.debugShowViewerRequestVolume && defined(e._viewerRequestVolume) ? (defined(e._debugViewerRequestVolume) || (e._debugViewerRequestVolume = e._viewerRequestVolume.createDebugVolume( + Color.YELLOW + )), e._debugViewerRequestVolume.update(n)) : !t.debugShowViewerRequestVolume && defined(e._debugViewerRequestVolume) && (e._debugViewerRequestVolume = e._debugViewerRequestVolume.destroy()); + const s = t.debugColorizeTiles && !e._debugColorizeTiles || defined(t._heatmap.tilePropertyName), c = !t.debugColorizeTiles && e._debugColorizeTiles; + s ? (t._heatmap.colorize(e, n), e._debugColorizeTiles = !0, e.color = e._debugColor) : c && (e._debugColorizeTiles = !1, e.color = Color.WHITE), e._colorDirty && (e._colorDirty = !1, e._content.applyDebugSettings(!0, e._color)), c && t.makeStyleDirty(); +} +function updateContent(e, t, n) { + const i = e._expiredContent; + if (!e.hasMultipleContents && defined(i)) { + if (!e.contentReady) { + try { + i.update(t, n); + } catch { + } + return; + } + e._expiredContent.destroy(), e._expiredContent = void 0; + } + if (defined(e.content)) + try { + e.content.update(t, n); + } catch (r) { + throw e._contentState = Cesium3DTileContentState$1.FAILED, r; + } +} +function updateClippingPlanes$1(e, t) { + const n = t.clippingPlanes; + let i = 0; + defined(n) && e._isClipped && n.enabled && (i = n.clippingPlanesState), i !== e._clippingPlanesState && (e._clippingPlanesState = i, e.clippingPlanesDirty = !0); +} +function updateClippingPolygons(e, t) { + const n = t.clippingPolygons; + let i = 0; + defined(n) && e._isClippedByPolygon && n.enabled && (i = n.clippingPolygonsState), i !== e._clippingPolygonsState && (e._clippingPolygonsState = i, e.clippingPolygonsDirty = !0); +} +Cesium3DTile.prototype.update = function(e, t, n) { + const { commandList: i } = t, r = i.length; + updateClippingPlanes$1(this, e), updateClippingPolygons(this, e), applyDebugSettings$1(this, e, t, n), updateContent(this, e, t); + const o = i.length; + this._commandsLength = o - r; + for (let s = r; s < o; ++s) { + const c = i[s], l = c.pass === Pass$1.TRANSLUCENT; + c.depthForTranslucentClassification = l; + } + this.clippingPlanesDirty = !1, this.clippingPolygonsDirty = !1; +}; +const scratchCommandList$1 = []; +Cesium3DTile.prototype.process = function(e, t) { + !this.contentExpired && !this.contentReady && this._content.ready && (updateExpireDate(this), this._selectedFrame = 0, this.lastStyleTime = 0, JulianDate.now(this._loadTimestamp), this._contentState = Cesium3DTileContentState$1.READY, !this.hasTilesetContent && !this.hasImplicitContent && (e._statistics.incrementLoadCounts(this.content), ++e._statistics.numberOfTilesWithContentReady, ++e._statistics.numberOfLoadedTilesTotal, e._cache.add(this))); + const n = t.commandList; + t.commandList = scratchCommandList$1; + try { + this._content.update(e, t); + } catch (i) { + throw this._contentState = Cesium3DTileContentState$1.FAILED, i; + } + scratchCommandList$1.length = 0, t.commandList = n; +}; +function isolateDigits(e, t, n) { + const i = e * Math.pow(10, t); + return parseInt(i) * Math.pow(10, n); +} +function priorityNormalizeAndClamp(e, t, n) { + return Math.max( + CesiumMath.normalize(e, t, n) - CesiumMath.EPSILON7, + 0 + ); +} +Cesium3DTile.prototype.updatePriority = function() { + const e = this.tileset, t = e.preferLeaves, n = e._minimumPriority, i = e._maximumPriority, r = 4, o = 1, s = 0, c = r, l = s + c, d = r, f = l + d, h = o, p = Math.pow( + 10, + f + ), m = f + h, _ = o, y = Math.pow(10, m), C = m + _, T = Math.pow(10, C); + let x = priorityNormalizeAndClamp( + this._depth, + n.depth, + i.depth + ); + x = t ? 1 - x : x; + const S = !e.isSkippingLevelOfDetail && this.refine === Cesium3DTileRefine$1.REPLACE ? priorityNormalizeAndClamp( + this._priorityHolder._distanceToCamera, + n.distance, + i.distance + ) : priorityNormalizeAndClamp( + this._priorityReverseScreenSpaceError, + n.reverseScreenSpaceError, + i.reverseScreenSpaceError + ), E = isolateDigits( + S, + c, + s + ), A = this._priorityProgressiveResolution ? 0 : p, D = priorityNormalizeAndClamp( + this._priorityHolder._foveatedFactor, + n.foveatedFactor, + i.foveatedFactor + ), P = isolateDigits( + D, + d, + l + ), I = this.priorityDeferred ? y : 0, M = e._pass === Cesium3DTilePass$1.PRELOAD_FLIGHT ? 0 : T; + this._priority = x + E + A + P + I + M; +}; +Cesium3DTile.prototype.isDestroyed = function() { + return !1; +}; +Cesium3DTile.prototype.destroy = function() { + return this._content = this._content && this._content.destroy(), this._expiredContent = this._expiredContent && !this._expiredContent.isDestroyed() && this._expiredContent.destroy(), this._debugBoundingVolume = this._debugBoundingVolume && this._debugBoundingVolume.destroy(), this._debugContentBoundingVolume = this._debugContentBoundingVolume && this._debugContentBoundingVolume.destroy(), this._debugViewerRequestVolume = this._debugViewerRequestVolume && this._debugViewerRequestVolume.destroy(), destroyObject(this); +}; +function GroupMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.id, n = e.group, i = e.class, r = defined(n.properties) ? n.properties : {}; + this._class = i, this._properties = r, this._id = t, this._extras = n.extras, this._extensions = n.extensions; +} +Object.defineProperties(GroupMetadata.prototype, { + /** + * The class that properties conform to. + * + * @memberof GroupMetadata.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * The ID of the group. + * + * @memberof GroupMetadata.prototype + * @type {string} + * @readonly + * @private + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Extra user-defined properties. + * + * @memberof GroupMetadata.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof GroupMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +GroupMetadata.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +GroupMetadata.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +GroupMetadata.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +GroupMetadata.prototype.getProperty = function(e) { + return MetadataEntity.getProperty(e, this._properties, this._class); +}; +GroupMetadata.prototype.setProperty = function(e, t) { + return MetadataEntity.setProperty( + e, + t, + this._properties, + this._class + ); +}; +GroupMetadata.prototype.getPropertyBySemantic = function(e) { + return MetadataEntity.getPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +GroupMetadata.prototype.setPropertyBySemantic = function(e, t) { + return MetadataEntity.setPropertyBySemantic( + e, + t, + this._properties, + this._class + ); +}; +function TilesetMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.tileset, n = e.class, i = defined(t.properties) ? t.properties : {}; + this._class = n, this._properties = i, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(TilesetMetadata.prototype, { + /** + * The class that properties conform to. + * + * @memberof TilesetMetadata.prototype + * @type {MetadataClass} + * @readonly + * @private + */ + class: { + get: function() { + return this._class; + } + }, + /** + * Extra user-defined properties. + * + * @memberof TilesetMetadata.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof TilesetMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +TilesetMetadata.prototype.hasProperty = function(e) { + return MetadataEntity.hasProperty(e, this._properties, this._class); +}; +TilesetMetadata.prototype.hasPropertyBySemantic = function(e) { + return MetadataEntity.hasPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +TilesetMetadata.prototype.getPropertyIds = function(e) { + return MetadataEntity.getPropertyIds(this._properties, this._class, e); +}; +TilesetMetadata.prototype.getProperty = function(e) { + return MetadataEntity.getProperty(e, this._properties, this._class); +}; +TilesetMetadata.prototype.setProperty = function(e, t) { + return MetadataEntity.setProperty( + e, + t, + this._properties, + this._class + ); +}; +TilesetMetadata.prototype.getPropertyBySemantic = function(e) { + return MetadataEntity.getPropertyBySemantic( + e, + this._properties, + this._class + ); +}; +TilesetMetadata.prototype.setPropertyBySemantic = function(e, t) { + return MetadataEntity.setPropertyBySemantic( + e, + t, + this._properties, + this._class + ); +}; +function Cesium3DTilesetMetadata(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.metadataJson, n = e.schema, i = defaultValue(t.metadata, t.tileset); + let r; + defined(i) && (r = new TilesetMetadata({ + tileset: i, + class: n.classes[i.class] + })); + let o = []; + const s = [], c = t.groups; + if (Array.isArray(c)) { + const l = c.length; + for (let d = 0; d < l; d++) { + const f = c[d]; + s.push( + new GroupMetadata({ + group: f, + class: n.classes[f.class] + }) + ); + } + } else if (defined(c)) { + o = Object.keys(c).sort(); + const l = o.length; + for (let d = 0; d < l; d++) { + const f = o[d]; + if (c.hasOwnProperty(f)) { + const h = c[f]; + s.push( + new GroupMetadata({ + id: f, + group: c[f], + class: n.classes[h.class] + }) + ); + } + } + } + this._schema = n, this._groups = s, this._groupIds = o, this._tileset = r, this._statistics = t.statistics, this._extras = t.extras, this._extensions = t.extensions; +} +Object.defineProperties(Cesium3DTilesetMetadata.prototype, { + /** + * Schema containing classes and enums. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {MetadataSchema} + * @readonly + * @private + */ + schema: { + get: function() { + return this._schema; + } + }, + /** + * Metadata about groups of content. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {GroupMetadata[]} + * @readonly + * @private + */ + groups: { + get: function() { + return this._groups; + } + }, + /** + * The IDs of the group metadata in the corresponding groups dictionary. + * Only populated if using the legacy schema. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {} + * @readonly + * @private + */ + groupIds: { + get: function() { + return this._groupIds; + } + }, + /** + * Metadata about the tileset as a whole. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {TilesetMetadata} + * @readonly + * @private + */ + tileset: { + get: function() { + return this._tileset; + } + }, + /** + * Statistics about the metadata. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/blob/main/extensions/3DTILES_metadata/schema/statistics.schema.json|statistics schema reference} + * in the 3D Tiles spec for the full set of properties. + *

+ * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {object} + * @readonly + * @private + */ + statistics: { + get: function() { + return this._statistics; + } + }, + /** + * Extra user-defined properties. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {*} + * @readonly + * @private + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * An object containing extensions. + * + * @memberof Cesium3DTilesetMetadata.prototype + * @type {object} + * @readonly + * @private + */ + extensions: { + get: function() { + return this._extensions; + } + } +}); +const Cesium3DTileOptimizations = {}, scratchAxis$1 = new Cartesian3(); +Cesium3DTileOptimizations.checkChildrenWithinParent = function(e) { + const t = e.children, n = t.length, i = e.boundingVolume; + if (i instanceof TileOrientedBoundingBox || i instanceof TileBoundingRegion) { + const r = i._orientedBoundingBox; + e._optimChildrenWithinParent = Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION; + for (let o = 0; o < n; ++o) { + const c = t[o].boundingVolume; + if (!(c instanceof TileOrientedBoundingBox || c instanceof TileBoundingRegion)) { + e._optimChildrenWithinParent = Cesium3DTileOptimizationHint$1.SKIP_OPTIMIZATION; + break; + } + const l = c._orientedBoundingBox, d = Cartesian3.subtract( + l.center, + r.center, + scratchAxis$1 + ), f = Cartesian3.magnitude(d); + Cartesian3.divideByScalar(d, f, d); + const h = Math.abs(r.halfAxes[0] * d.x) + Math.abs(r.halfAxes[1] * d.y) + Math.abs(r.halfAxes[2] * d.z) + Math.abs(r.halfAxes[3] * d.x) + Math.abs(r.halfAxes[4] * d.y) + Math.abs(r.halfAxes[5] * d.z) + Math.abs(r.halfAxes[6] * d.x) + Math.abs(r.halfAxes[7] * d.y) + Math.abs(r.halfAxes[8] * d.z), p = Math.abs(l.halfAxes[0] * d.x) + Math.abs(l.halfAxes[1] * d.y) + Math.abs(l.halfAxes[2] * d.z) + Math.abs(l.halfAxes[3] * d.x) + Math.abs(l.halfAxes[4] * d.y) + Math.abs(l.halfAxes[5] * d.z) + Math.abs(l.halfAxes[6] * d.x) + Math.abs(l.halfAxes[7] * d.y) + Math.abs(l.halfAxes[8] * d.z); + if (h <= p + f) { + e._optimChildrenWithinParent = Cesium3DTileOptimizationHint$1.SKIP_OPTIMIZATION; + break; + } + } + } + return e._optimChildrenWithinParent === Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION; +}; +function DoublyLinkedList() { + this.head = void 0, this.tail = void 0, this._length = 0; +} +Object.defineProperties(DoublyLinkedList.prototype, { + length: { + get: function() { + return this._length; + } + } +}); +function DoublyLinkedListNode(e, t, n) { + this.item = e, this.previous = t, this.next = n; +} +DoublyLinkedList.prototype.add = function(e) { + const t = new DoublyLinkedListNode(e, this.tail, void 0); + return defined(this.tail) ? (this.tail.next = t, this.tail = t) : (this.head = t, this.tail = t), ++this._length, t; +}; +function remove$2(e, t) { + defined(t.previous) && defined(t.next) ? (t.previous.next = t.next, t.next.previous = t.previous) : defined(t.previous) ? (t.previous.next = void 0, e.tail = t.previous) : defined(t.next) ? (t.next.previous = void 0, e.head = t.next) : (e.head = void 0, e.tail = void 0), t.next = void 0, t.previous = void 0; +} +DoublyLinkedList.prototype.remove = function(e) { + defined(e) && (remove$2(this, e), --this._length); +}; +DoublyLinkedList.prototype.splice = function(e, t) { + if (e === t) + return; + remove$2(this, t); + const n = e.next; + e.next = t, this.tail === e ? this.tail = t : n.previous = t, t.next = n, t.previous = e; +}; +function Cesium3DTilesetCache() { + this._list = new DoublyLinkedList(), this._sentinel = this._list.add(), this._trimTiles = !1; +} +Cesium3DTilesetCache.prototype.reset = function() { + this._list.splice(this._list.tail, this._sentinel); +}; +Cesium3DTilesetCache.prototype.touch = function(e) { + const t = e.cacheNode; + defined(t) && this._list.splice(this._sentinel, t); +}; +Cesium3DTilesetCache.prototype.add = function(e) { + defined(e.cacheNode) || (e.cacheNode = this._list.add(e)); +}; +Cesium3DTilesetCache.prototype.unloadTile = function(e, t, n) { + const i = t.cacheNode; + defined(i) && (this._list.remove(i), t.cacheNode = void 0, n(e, t)); +}; +Cesium3DTilesetCache.prototype.unloadTiles = function(e, t) { + const n = this._trimTiles; + this._trimTiles = !1; + const i = this._list, r = this._sentinel; + let o = i.head; + for (; o !== r && (e.totalMemoryUsageInBytes > e.cacheBytes || n); ) { + const s = o.item; + o = o.next, this.unloadTile(e, s, t); + } +}; +Cesium3DTilesetCache.prototype.trim = function() { + this._trimTiles = !0; +}; +function Cesium3DTilesetHeatmap(e) { + this.tilePropertyName = e, this._minimum = Number.MAX_VALUE, this._maximum = -Number.MAX_VALUE, this._previousMinimum = Number.MAX_VALUE, this._previousMaximum = -Number.MAX_VALUE, this._referenceMinimum = {}, this._referenceMaximum = {}; +} +function getHeatmapValue(e, t) { + let n; + return t === "_loadTimestamp" ? n = JulianDate.toDate(e).getTime() : n = e, n; +} +Cesium3DTilesetHeatmap.prototype.setReferenceMinimumMaximum = function(e, t, n) { + this._referenceMinimum[n] = getHeatmapValue( + e, + n + ), this._referenceMaximum[n] = getHeatmapValue( + t, + n + ); +}; +function getHeatmapValueAndUpdateMinimumMaximum(e, t) { + const n = e.tilePropertyName; + if (defined(n)) { + const i = getHeatmapValue( + t[n], + n + ); + return defined(i) ? (e._maximum = Math.max(i, e._maximum), e._minimum = Math.min(i, e._minimum), i) : (e.tilePropertyName = void 0, i); + } +} +const heatmapColors = [ + new Color(0.1, 0.1, 0.1, 1), + // Dark Gray + new Color(0.153, 0.278, 0.878, 1), + // Blue + new Color(0.827, 0.231, 0.49, 1), + // Pink + new Color(0.827, 0.188, 0.22, 1), + // Red + new Color(1, 0.592, 0.259, 1), + // Orange + new Color(1, 0.843, 0, 1) +]; +Cesium3DTilesetHeatmap.prototype.colorize = function(e, t) { + const n = this.tilePropertyName; + if (!defined(n) || !e.contentAvailable || e._selectedFrame !== t.frameNumber) + return; + const i = getHeatmapValueAndUpdateMinimumMaximum(this, e), r = this._previousMinimum, o = this._previousMaximum; + if (r === Number.MAX_VALUE || o === -Number.MAX_VALUE) + return; + const s = o - r + CesiumMath.EPSILON7, l = CesiumMath.clamp( + i - r, + 0, + s + ) / s, d = heatmapColors.length - 1, f = l * d, h = Math.floor(f), p = Math.ceil(f), m = f - h, _ = heatmapColors[h], y = heatmapColors[p], C = Color.clone(Color.WHITE); + C.red = CesiumMath.lerp(_.red, y.red, m), C.green = CesiumMath.lerp(_.green, y.green, m), C.blue = CesiumMath.lerp(_.blue, y.blue, m), e._debugColor = C; +}; +Cesium3DTilesetHeatmap.prototype.resetMinimumMaximum = function() { + const e = this.tilePropertyName; + if (defined(e)) { + const t = this._referenceMinimum[e], n = this._referenceMaximum[e], i = defined(t) && defined(n); + this._previousMinimum = i ? t : this._minimum, this._previousMaximum = i ? n : this._maximum, this._minimum = Number.MAX_VALUE, this._maximum = -Number.MAX_VALUE; + } +}; +function Cesium3DTilesetStatistics() { + this.selected = 0, this.visited = 0, this.numberOfCommands = 0, this.numberOfAttemptedRequests = 0, this.numberOfPendingRequests = 0, this.numberOfTilesProcessing = 0, this.numberOfTilesWithContentReady = 0, this.numberOfTilesTotal = 0, this.numberOfLoadedTilesTotal = 0, this.numberOfFeaturesSelected = 0, this.numberOfFeaturesLoaded = 0, this.numberOfPointsSelected = 0, this.numberOfPointsLoaded = 0, this.numberOfTrianglesSelected = 0, this.numberOfTilesStyled = 0, this.numberOfFeaturesStyled = 0, this.numberOfTilesCulledWithChildrenUnion = 0, this.geometryByteLength = 0, this.texturesByteLength = 0, this.batchTableByteLength = 0; +} +Cesium3DTilesetStatistics.prototype.clear = function() { + this.selected = 0, this.visited = 0, this.numberOfCommands = 0, this.numberOfAttemptedRequests = 0, this.numberOfFeaturesSelected = 0, this.numberOfPointsSelected = 0, this.numberOfTrianglesSelected = 0, this.numberOfTilesStyled = 0, this.numberOfFeaturesStyled = 0, this.numberOfTilesCulledWithChildrenUnion = 0; +}; +function updatePointAndFeatureCounts(e, t, n, i) { + const r = t.innerContents, o = t.pointsLength, s = t.trianglesLength, c = t.featuresLength, l = t.geometryByteLength, d = t.texturesByteLength, f = t.batchTableByteLength; + if (i ? (e.numberOfFeaturesLoaded += n ? -c : c, e.numberOfPointsLoaded += n ? -o : o, e.geometryByteLength += n ? -l : l, e.texturesByteLength += n ? -d : d, e.batchTableByteLength += n ? -f : f) : (e.numberOfFeaturesSelected += n ? -c : c, e.numberOfPointsSelected += n ? -o : o, e.numberOfTrianglesSelected += n ? -s : s), defined(r)) { + const h = r.length; + for (let p = 0; p < h; ++p) + updatePointAndFeatureCounts(e, r[p], n, i); + } +} +Cesium3DTilesetStatistics.prototype.incrementSelectionCounts = function(e) { + updatePointAndFeatureCounts(this, e, !1, !1); +}; +Cesium3DTilesetStatistics.prototype.incrementLoadCounts = function(e) { + updatePointAndFeatureCounts(this, e, !1, !0); +}; +Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function(e) { + updatePointAndFeatureCounts(this, e, !0, !0); +}; +Cesium3DTilesetStatistics.clone = function(e, t) { + t.selected = e.selected, t.visited = e.visited, t.numberOfCommands = e.numberOfCommands, t.selected = e.selected, t.numberOfAttemptedRequests = e.numberOfAttemptedRequests, t.numberOfPendingRequests = e.numberOfPendingRequests, t.numberOfTilesProcessing = e.numberOfTilesProcessing, t.numberOfTilesWithContentReady = e.numberOfTilesWithContentReady, t.numberOfTilesTotal = e.numberOfTilesTotal, t.numberOfFeaturesSelected = e.numberOfFeaturesSelected, t.numberOfFeaturesLoaded = e.numberOfFeaturesLoaded, t.numberOfPointsSelected = e.numberOfPointsSelected, t.numberOfPointsLoaded = e.numberOfPointsLoaded, t.numberOfTrianglesSelected = e.numberOfTrianglesSelected, t.numberOfTilesStyled = e.numberOfTilesStyled, t.numberOfFeaturesStyled = e.numberOfFeaturesStyled, t.numberOfTilesCulledWithChildrenUnion = e.numberOfTilesCulledWithChildrenUnion, t.geometryByteLength = e.geometryByteLength, t.texturesByteLength = e.texturesByteLength, t.batchTableByteLength = e.batchTableByteLength; +}; +function Cesium3DTileStyleEngine() { + this._style = void 0, this._styleDirty = !1, this._lastStyleTime = 0; +} +Object.defineProperties(Cesium3DTileStyleEngine.prototype, { + style: { + get: function() { + return this._style; + }, + set: function(e) { + e !== this._style && (this._style = e, this._styleDirty = !0); + } + } +}); +Cesium3DTileStyleEngine.prototype.makeDirty = function() { + this._styleDirty = !0; +}; +Cesium3DTileStyleEngine.prototype.resetDirty = function() { + this._styleDirty = !1; +}; +Cesium3DTileStyleEngine.prototype.applyStyle = function(e) { + if (!defined(e.root) || defined(this._style) && !this._style._ready) + return; + const t = this._styleDirty; + t && ++this._lastStyleTime; + const n = this._lastStyleTime, i = e._statistics, r = t ? e._selectedTiles : e._selectedTilesToStyle, o = r.length; + for (let s = 0; s < o; ++s) { + const c = r[s]; + if (c.lastStyleTime !== n) { + const l = c.content; + c.lastStyleTime = n, l.applyStyle(this._style), i.numberOfFeaturesStyled += l.featuresLength, ++i.numberOfTilesStyled; + } + } +}; +function ImplicitTileset(e, t, n) { + const i = hasExtension(t, "3DTILES_implicit_tiling") ? t.extensions["3DTILES_implicit_tiling"] : t.implicitTiling; + this.baseResource = e, this.geometricError = t.geometricError, this.metadataSchema = n; + const r = t.boundingVolume; + if (!defined(r.box) && !defined(r.region) && !hasExtension(r, "3DTILES_bounding_volume_S2") && !hasExtension(r, "3DTILES_bounding_volume_cylinder")) + throw new RuntimeError( + "Only box, region, 3DTILES_bounding_volume_S2, and 3DTILES_bounding_volume_cylinder are supported for implicit tiling" + ); + this.boundingVolume = r, this.refine = t.refine, this.subtreeUriTemplate = new Resource({ url: i.subtrees.uri }), this.contentUriTemplates = [], this.contentHeaders = []; + const o = gatherContentHeaders(t); + for (let s = 0; s < o.length; s++) { + const c = o[s]; + this.contentHeaders.push(clone$1(c, !0)); + const l = new Resource({ url: c.uri }); + this.contentUriTemplates.push(l); + } + this.contentCount = this.contentHeaders.length, this.tileHeader = makeTileHeaderTemplate(t), this.subdivisionScheme = ImplicitSubdivisionScheme$1[i.subdivisionScheme], this.branchingFactor = ImplicitSubdivisionScheme$1.getBranchingFactor( + this.subdivisionScheme + ), this.subtreeLevels = i.subtreeLevels, defined(i.availableLevels) ? this.availableLevels = i.availableLevels : this.availableLevels = i.maximumLevel + 1; +} +function gatherContentHeaders(e) { + if (hasExtension(e, "3DTILES_multiple_contents")) { + const t = e.extensions["3DTILES_multiple_contents"]; + return defined(t.contents) ? t.contents : t.content; + } + return defined(e.contents) ? e.contents : defined(e.content) ? [e.content] : []; +} +function makeTileHeaderTemplate(e) { + const t = clone$1(e, !0); + return defined(t.extensions) && (delete t.extensions["3DTILES_implicit_tiling"], delete t.extensions["3DTILES_multiple_contents"], Object.keys(t.extensions).length === 0 && delete t.extensions), delete t.implicitTiling, delete t.contents, delete t.content, t; +} +const MortonOrder = {}; +function insertOneSpacing(e) { + return e = (e ^ e << 8) & 16711935, e = (e ^ e << 4) & 252645135, e = (e ^ e << 2) & 858993459, e = (e ^ e << 1) & 1431655765, e; +} +function insertTwoSpacing(e) { + return e = (e ^ e << 16) & 50331903, e = (e ^ e << 8) & 50393103, e = (e ^ e << 4) & 51130563, e = (e ^ e << 2) & 153391689, e; +} +function removeOneSpacing(e) { + return e &= 1431655765, e = (e ^ e >> 1) & 858993459, e = (e ^ e >> 2) & 252645135, e = (e ^ e >> 4) & 16711935, e = (e ^ e >> 8) & 65535, e; +} +function removeTwoSpacing(e) { + return e &= 153391689, e = (e ^ e >> 2) & 51130563, e = (e ^ e >> 4) & 50393103, e = (e ^ e >> 8) & 4278190335, e = (e ^ e >> 16) & 1023, e; +} +MortonOrder.encode2D = function(e, t) { + return (insertOneSpacing(e) | insertOneSpacing(t) << 1) >>> 0; +}; +MortonOrder.decode2D = function(e, t) { + return defined(t) || (t = new Array(2)), t[0] = removeOneSpacing(e), t[1] = removeOneSpacing(e >> 1), t; +}; +MortonOrder.encode3D = function(e, t, n) { + return insertTwoSpacing(e) | insertTwoSpacing(t) << 1 | insertTwoSpacing(n) << 2; +}; +MortonOrder.decode3D = function(e, t) { + return defined(t) || (t = new Array(3)), t[0] = removeTwoSpacing(e), t[1] = removeTwoSpacing(e >> 1), t[2] = removeTwoSpacing(e >> 2), t; +}; +function ImplicitTileCoordinates(e) { + this.subdivisionScheme = e.subdivisionScheme, this.subtreeLevels = e.subtreeLevels, this.level = e.level, this.x = e.x, this.y = e.y, this.z = void 0, e.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE && (this.z = e.z); +} +Object.defineProperties(ImplicitTileCoordinates.prototype, { + /** + * An index in the range of [0, branchingFactor) that indicates + * which child of the parent cell these coordinates correspond to. + * This can be viewed as a morton index within the parent tile. + *

+ * This is the last 3 bits of the morton index of the tile, but it can + * be computed more directly by concatenating the bits [z0] y0 x0 + *

+ * + * @type {number} + * @readonly + * @private + */ + childIndex: { + get: function() { + let e = 0; + return e |= this.x & 1, e |= (this.y & 1) << 1, this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE && (e |= (this.z & 1) << 2), e; + } + }, + /** + * Get the Morton index for this tile within the current level by interleaving + * the bits of the x, y and z coordinates. + * + * @type {number} + * @readonly + * @private + */ + mortonIndex: { + get: function() { + return this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE ? MortonOrder.encode3D(this.x, this.y, this.z) : MortonOrder.encode2D(this.x, this.y); + } + }, + /** + * Get the tile index by adding the Morton index to the level offset + * + * @type {number} + * @readonly + * @private + */ + tileIndex: { + get: function() { + const e = this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE ? ( + // (8^N - 1) / (8-1) + ((1 << 3 * this.level) - 1) / 7 + ) : ( + // (4^N - 1) / (4-1) + ((1 << 2 * this.level) - 1) / 3 + ), t = this.mortonIndex; + return e + t; + } + } +}); +ImplicitTileCoordinates.prototype.getDescendantCoordinates = function(e) { + const t = this.level + e.level, n = (this.x << e.level) + e.x, i = (this.y << e.level) + e.y; + if (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE) { + const r = (this.z << e.level) + e.z; + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: n, + y: i, + z: r + }); + } + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: n, + y: i + }); +}; +ImplicitTileCoordinates.prototype.getAncestorCoordinates = function(e) { + const t = 1 << e, n = this.level - e, i = Math.floor(this.x / t), r = Math.floor(this.y / t); + if (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE) { + const o = Math.floor(this.z / t); + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: n, + x: i, + y: r, + z: o + }); + } + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: n, + x: i, + y: r + }); +}; +ImplicitTileCoordinates.prototype.getOffsetCoordinates = function(e) { + const t = e.level - this.level, n = 1 << t, i = e.x % n, r = e.y % n; + if (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE) { + const o = e.z % n; + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: i, + y: r, + z: o + }); + } + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: i, + y: r + }); +}; +ImplicitTileCoordinates.prototype.getChildCoordinates = function(e) { + const t = this.level + 1, n = 2 * this.x + e % 2, i = 2 * this.y + Math.floor(e / 2) % 2; + if (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE) { + const r = 2 * this.z + Math.floor(e / 4) % 2; + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: n, + y: i, + z: r + }); + } + return new ImplicitTileCoordinates({ + subdivisionScheme: this.subdivisionScheme, + subtreeLevels: this.subtreeLevels, + level: t, + x: n, + y: i + }); +}; +ImplicitTileCoordinates.prototype.getSubtreeCoordinates = function() { + return this.getAncestorCoordinates(this.level % this.subtreeLevels); +}; +ImplicitTileCoordinates.prototype.getParentSubtreeCoordinates = function() { + return this.getAncestorCoordinates( + this.level % this.subtreeLevels + this.subtreeLevels + ); +}; +ImplicitTileCoordinates.prototype.isAncestor = function(e) { + const t = e.level - this.level; + if (t <= 0) + return !1; + const n = e.x >> t, i = e.y >> t, r = this.x === n, o = this.y === i; + if (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE) { + const s = e.z >> t, c = this.z === s; + return r && o && c; + } + return r && o; +}; +ImplicitTileCoordinates.prototype.isEqual = function(e) { + return this.subdivisionScheme === e.subdivisionScheme && this.subtreeLevels === e.subtreeLevels && this.level === e.level && this.x === e.x && this.y === e.y && (this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE ? this.z === e.z : !0); +}; +ImplicitTileCoordinates.prototype.isImplicitTilesetRoot = function() { + return this.level === 0; +}; +ImplicitTileCoordinates.prototype.isSubtreeRoot = function() { + return this.level % this.subtreeLevels === 0; +}; +ImplicitTileCoordinates.prototype.isBottomOfSubtree = function() { + return this.level % this.subtreeLevels === this.subtreeLevels - 1; +}; +ImplicitTileCoordinates.prototype.getTemplateValues = function() { + const e = { + level: this.level, + x: this.x, + y: this.y + }; + return this.subdivisionScheme === ImplicitSubdivisionScheme$1.OCTREE && (e.z = this.z), e; +}; +const scratchCoordinatesArray = [0, 0, 0]; +ImplicitTileCoordinates.fromMortonIndex = function(e, t, n, i) { + let r; + return e === ImplicitSubdivisionScheme$1.OCTREE ? (r = MortonOrder.decode3D( + i, + scratchCoordinatesArray + ), new ImplicitTileCoordinates({ + subdivisionScheme: e, + subtreeLevels: t, + level: n, + x: r[0], + y: r[1], + z: r[2] + })) : (r = MortonOrder.decode2D(i, scratchCoordinatesArray), new ImplicitTileCoordinates({ + subdivisionScheme: e, + subtreeLevels: t, + level: n, + x: r[0], + y: r[1] + })); +}; +ImplicitTileCoordinates.fromTileIndex = function(e, t, n) { + let i, r, o; + return e === ImplicitSubdivisionScheme$1.OCTREE ? (i = Math.floor(CesiumMath.log2(7 * n + 1) / 3), r = ((1 << 3 * i) - 1) / 7, o = n - r) : (i = Math.floor(CesiumMath.log2(3 * n + 1) / 2), r = ((1 << 2 * i) - 1) / 3, o = n - r), ImplicitTileCoordinates.fromMortonIndex( + e, + t, + i, + o + ); +}; +function Cesium3DTilesetTraversal() { +} +Cesium3DTilesetTraversal.selectTiles = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTilesetTraversal.sortChildrenByDistanceToCamera = function(e, t) { + return t._distanceToCamera === 0 && e._distanceToCamera === 0 ? t._centerZDepth - e._centerZDepth : t._distanceToCamera - e._distanceToCamera; +}; +Cesium3DTilesetTraversal.canTraverse = function(e) { + return e.children.length === 0 ? !1 : e.hasTilesetContent || e.hasImplicitContent ? !e.contentExpired : e._screenSpaceError > e.tileset.memoryAdjustedScreenSpaceError; +}; +Cesium3DTilesetTraversal.selectTile = function(e, t) { + if (e.contentVisibility(t) === Intersect$1.OUTSIDE) + return; + e._wasSelectedLastFrame = !0; + const { content: n, tileset: i } = e; + n.featurePropertiesDirty ? (n.featurePropertiesDirty = !1, e.lastStyleTime = 0, i._selectedTilesToStyle.push(e)) : e._selectedFrame < t.frameNumber - 1 && (i._selectedTilesToStyle.push(e), e._wasSelectedLastFrame = !1), e._selectedFrame = t.frameNumber, i._selectedTiles.push(e); +}; +Cesium3DTilesetTraversal.visitTile = function(e, t) { + ++e.tileset._statistics.visited, e._visitedFrame = t.frameNumber; +}; +Cesium3DTilesetTraversal.touchTile = function(e, t) { + e._touchedFrame !== t.frameNumber && (e.tileset._cache.touch(e), e._touchedFrame = t.frameNumber); +}; +Cesium3DTilesetTraversal.loadTile = function(e, t) { + const { tileset: n } = e; + if (e._requestedFrame === t.frameNumber || !e.hasUnloadedRenderableContent && !e.contentExpired || !isOnScreenLongEnough(e, t)) + return; + const i = t.camera.timeSinceMoved < n.foveatedTimeDelay; + e.priorityDeferred && i || (e._requestedFrame = t.frameNumber, n._requestedTiles.push(e)); +}; +function isOnScreenLongEnough(e, t) { + const { tileset: n } = e; + if (!n._cullRequestsWhileMoving) + return !0; + const { + positionWCDeltaMagnitude: i, + positionWCDeltaMagnitudeLastFrame: r + } = t.camera, o = i !== 0 ? i : r, s = Math.max(e.boundingSphere.radius * 2, 1); + return n.cullRequestsWhileMovingMultiplier * o / s < 1; +} +Cesium3DTilesetTraversal.updateTile = function(e, t) { + updateTileVisibility(e, t), e.updateExpiration(), e._wasMinPriorityChild = !1, e._priorityHolder = e, updateMinimumMaximumPriority(e), e._shouldSelect = !1, e._finalResolution = !0; +}; +function updateTileVisibility(e, t) { + if (e.updateVisibility(t), !e.isVisible) + return; + const n = e.children.length > 0; + if ((e.hasTilesetContent || e.hasImplicitContent) && n) { + const o = e.children[0]; + updateTileVisibility(o, t), e._visible = o._visible; + return; + } + if (meetsScreenSpaceErrorEarly(e, t)) { + e._visible = !1; + return; + } + const i = e.refine === Cesium3DTileRefine$1.REPLACE, r = e._optimChildrenWithinParent === Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION; + if (i && r && n && !anyChildrenVisible(e, t)) { + ++e.tileset._statistics.numberOfTilesCulledWithChildrenUnion, e._visible = !1; + return; + } +} +function meetsScreenSpaceErrorEarly(e, t) { + const { parent: n, tileset: i } = e; + return !defined(n) || n.hasTilesetContent || n.hasImplicitContent || n.refine !== Cesium3DTileRefine$1.ADD ? !1 : e.getScreenSpaceError(t, !0) <= i.memoryAdjustedScreenSpaceError; +} +function anyChildrenVisible(e, t) { + let n = !1; + const i = e.children; + for (let r = 0; r < i.length; ++r) { + const o = i[r]; + o.updateVisibility(t), n = n || o.isVisible; + } + return n; +} +function updateMinimumMaximumPriority(e) { + const t = e.tileset._minimumPriority, n = e.tileset._maximumPriority, i = e._priorityHolder; + n.distance = Math.max( + i._distanceToCamera, + n.distance + ), t.distance = Math.min( + i._distanceToCamera, + t.distance + ), n.depth = Math.max(e._depth, n.depth), t.depth = Math.min(e._depth, t.depth), n.foveatedFactor = Math.max( + i._foveatedFactor, + n.foveatedFactor + ), t.foveatedFactor = Math.min( + i._foveatedFactor, + t.foveatedFactor + ), n.reverseScreenSpaceError = Math.max( + e._priorityReverseScreenSpaceError, + n.reverseScreenSpaceError + ), t.reverseScreenSpaceError = Math.min( + e._priorityReverseScreenSpaceError, + t.reverseScreenSpaceError + ); +} +function Cesium3DTilesetMostDetailedTraversal() { +} +const traversal$2 = { + stack: new ManagedArray(), + stackMaximumLength: 0 +}; +Cesium3DTilesetMostDetailedTraversal.selectTiles = function(e, t) { + e._selectedTiles.length = 0, e._requestedTiles.length = 0, e.hasMixedContent = !1; + let n = !0; + const i = e.root; + if (i.updateVisibility(t), !i.isVisible) + return n; + const { touchTile: r, visitTile: o } = Cesium3DTilesetTraversal, s = traversal$2.stack; + for (s.push(i); s.length > 0; ) { + traversal$2.stackMaximumLength = Math.max( + traversal$2.stackMaximumLength, + s.length + ); + const c = s.pop(), l = c.refine === Cesium3DTileRefine$1.ADD, d = c.refine === Cesium3DTileRefine$1.REPLACE, f = canTraverse(c); + f && updateAndPushChildren$2(c, s, t), (l || d && !f) && (loadTile(e, c), r(c, t), selectDesiredTile$2(c, t), c.hasRenderableContent && !c.contentAvailable && (n = !1)), o(c, t); + } + return traversal$2.stack.trim(traversal$2.stackMaximumLength), n; +}; +function canTraverse(e) { + return e.children.length === 0 ? !1 : e.hasTilesetContent || e.hasImplicitContent ? !e.contentExpired : (e.hasEmptyContent, !0); +} +function updateAndPushChildren$2(e, t, n) { + const { children: i } = e; + for (let r = 0; r < i.length; ++r) { + const o = i[r]; + o.updateVisibility(n), o.isVisible && t.push(o); + } +} +function loadTile(e, t) { + (t.hasUnloadedRenderableContent || t.contentExpired) && (t._priority = 0, e._requestedTiles.push(t)); +} +function selectDesiredTile$2(e, t) { + e.contentAvailable && e.contentVisibility(t) !== Intersect$1.OUTSIDE && e.tileset._selectedTiles.push(e); +} +function Cesium3DTilesetBaseTraversal() { +} +const traversal$1 = { + stack: new ManagedArray(), + stackMaximumLength: 0 +}, emptyTraversal = { + stack: new ManagedArray(), + stackMaximumLength: 0 +}; +Cesium3DTilesetBaseTraversal.selectTiles = function(e, t) { + if (e._requestedTiles.length = 0, e.debugFreezeFrame) + return; + e._selectedTiles.length = 0, e._selectedTilesToStyle.length = 0, e._emptyTiles.length = 0, e.hasMixedContent = !1; + const n = e.root; + if (Cesium3DTilesetTraversal.updateTile(n, t), !n.isVisible || n.getScreenSpaceError(t, !0) <= e.memoryAdjustedScreenSpaceError) + return; + executeTraversal$1(n, t), traversal$1.stack.trim(traversal$1.stackMaximumLength), emptyTraversal.stack.trim(emptyTraversal.stackMaximumLength); + const i = e._requestedTiles; + for (let r = 0; r < i.length; ++r) + i[r].updatePriority(); +}; +function selectDesiredTile$1(e, t) { + e.contentAvailable && Cesium3DTilesetTraversal.selectTile(e, t); +} +function updateAndPushChildren$1(e, t, n) { + const i = e.refine === Cesium3DTileRefine$1.REPLACE, { tileset: r, children: o } = e, { updateTile: s, loadTile: c, touchTile: l } = Cesium3DTilesetTraversal; + for (let _ = 0; _ < o.length; ++_) + s(o[_], n); + o.sort(Cesium3DTilesetTraversal.sortChildrenByDistanceToCamera); + const d = i && e.hasRenderableContent; + let f = !0, h = !1, p = -1, m = Number.MAX_VALUE; + for (let _ = 0; _ < o.length; ++_) { + const y = o[_]; + if (y.isVisible ? (t.push(y), y._foveatedFactor < m && (p = _, m = y._foveatedFactor), h = !0) : (d || r.loadSiblings) && (y._foveatedFactor < m && (p = _, m = y._foveatedFactor), c(y, n), l(y, n)), d) { + let C; + y._inRequestVolume ? y.hasRenderableContent ? C = y.contentAvailable : C = executeEmptyTraversal(y, n) : C = !1, f = f && C; + } + } + if (h || (f = !1), p !== -1 && i) { + const _ = o[p]; + _._wasMinPriorityChild = !0; + const y = (e._wasMinPriorityChild || e === r.root) && m <= e._priorityHolder._foveatedFactor ? e._priorityHolder : e; + y._foveatedFactor = Math.min( + _._foveatedFactor, + y._foveatedFactor + ), y._distanceToCamera = Math.min( + _._distanceToCamera, + y._distanceToCamera + ); + for (let C = 0; C < o.length; ++C) + o[C]._priorityHolder = y; + } + return f; +} +function executeTraversal$1(e, t) { + const { tileset: n } = e, { + canTraverse: i, + loadTile: r, + visitTile: o, + touchTile: s + } = Cesium3DTilesetTraversal, c = traversal$1.stack; + for (c.push(e); c.length > 0; ) { + traversal$1.stackMaximumLength = Math.max( + traversal$1.stackMaximumLength, + c.length + ); + const l = c.pop(), d = l.parent, f = !defined(d) || d._refines; + l._refines = i(l) ? updateAndPushChildren$1(l, c, t) && f : !1; + const h = !l._refines && f; + l.hasRenderableContent ? l.refine === Cesium3DTileRefine$1.ADD ? (selectDesiredTile$1(l, t), r(l, t)) : l.refine === Cesium3DTileRefine$1.REPLACE && (r(l, t), h && selectDesiredTile$1(l, t)) : (n._emptyTiles.push(l), r(l, t), h && selectDesiredTile$1(l, t)), o(l, t), s(l, t); + } +} +function executeEmptyTraversal(e, t) { + const { + canTraverse: n, + updateTile: i, + loadTile: r, + touchTile: o + } = Cesium3DTilesetTraversal; + let s = !0; + const c = emptyTraversal.stack; + for (c.push(e); c.length > 0; ) { + emptyTraversal.stackMaximumLength = Math.max( + emptyTraversal.stackMaximumLength, + c.length + ); + const l = c.pop(), d = l.children, f = d.length, h = !l.hasRenderableContent && n(l); + if (!h && !l.contentAvailable && (s = !1), i(l, t), l.isVisible || (r(l, t), o(l, t)), h) + for (let p = 0; p < f; ++p) { + const m = d[p]; + c.push(m); + } + } + return e.hasEmptyContent || s; +} +function Cesium3DTilesetSkipTraversal() { +} +const traversal = { + stack: new ManagedArray(), + stackMaximumLength: 0 +}, descendantTraversal = { + stack: new ManagedArray(), + stackMaximumLength: 0 +}, selectionTraversal = { + stack: new ManagedArray(), + stackMaximumLength: 0, + ancestorStack: new ManagedArray(), + ancestorStackMaximumLength: 0 +}, descendantSelectionDepth = 2; +Cesium3DTilesetSkipTraversal.selectTiles = function(e, t) { + if (e._requestedTiles.length = 0, e.debugFreezeFrame) + return; + e._selectedTiles.length = 0, e._selectedTilesToStyle.length = 0, e._emptyTiles.length = 0, e.hasMixedContent = !1; + const n = e.root; + if (Cesium3DTilesetTraversal.updateTile(n, t), !n.isVisible || n.getScreenSpaceError(t, !0) <= e.memoryAdjustedScreenSpaceError) + return; + executeTraversal(n, t), traverseAndSelect(n, t), traversal.stack.trim(traversal.stackMaximumLength), descendantTraversal.stack.trim(descendantTraversal.stackMaximumLength), selectionTraversal.stack.trim(selectionTraversal.stackMaximumLength), selectionTraversal.ancestorStack.trim( + selectionTraversal.ancestorStackMaximumLength + ); + const i = e._requestedTiles; + for (let r = 0; r < i.length; ++r) + i[r].updatePriority(); +}; +function selectDescendants(e, t) { + const { updateTile: n, touchTile: i, selectTile: r } = Cesium3DTilesetTraversal, o = descendantTraversal.stack; + for (o.push(e); o.length > 0; ) { + descendantTraversal.stackMaximumLength = Math.max( + descendantTraversal.stackMaximumLength, + o.length + ); + const c = o.pop().children; + for (let l = 0; l < c.length; ++l) { + const d = c[l]; + d.isVisible && (d.contentAvailable ? (n(d, t), i(d, t), r(d, t)) : d._depth - e._depth < descendantSelectionDepth && o.push(d)); + } + } +} +function selectDesiredTile(e, t) { + const n = e.contentAvailable ? e : e._ancestorWithContentAvailable; + defined(n) ? n._shouldSelect = !0 : selectDescendants(e, t); +} +function updateTileAncestorContentLinks(e, t) { + e._ancestorWithContent = void 0, e._ancestorWithContentAvailable = void 0; + const { parent: n } = e; + if (!defined(n)) + return; + const i = !n.hasUnloadedRenderableContent || n._requestedFrame === t.frameNumber; + e._ancestorWithContent = i ? n : n._ancestorWithContent, e._ancestorWithContentAvailable = n.contentAvailable ? n : n._ancestorWithContentAvailable; +} +function reachedSkippingThreshold(e, t) { + const n = t._ancestorWithContent; + return !e.immediatelyLoadDesiredLevelOfDetail && (t._priorityProgressiveResolutionScreenSpaceErrorLeaf || defined(n) && t._screenSpaceError < n._screenSpaceError / e.skipScreenSpaceErrorFactor && t._depth > n._depth + e.skipLevels); +} +function updateAndPushChildren(e, t, n) { + const { tileset: i, children: r } = e, { updateTile: o, loadTile: s, touchTile: c } = Cesium3DTilesetTraversal; + for (let d = 0; d < r.length; ++d) + o(r[d], n); + r.sort(Cesium3DTilesetTraversal.sortChildrenByDistanceToCamera); + let l = !1; + for (let d = 0; d < r.length; ++d) { + const f = r[d]; + f.isVisible ? (t.push(f), l = !0) : i.loadSiblings && (s(f, n), c(f, n)); + } + return l; +} +function inBaseTraversal(e, t) { + const { tileset: n } = e; + return n.immediatelyLoadDesiredLevelOfDetail ? !1 : defined(e._ancestorWithContent) ? e._screenSpaceError === 0 ? e.parent._screenSpaceError > t : e._screenSpaceError > t : !0; +} +function executeTraversal(e, t) { + const { tileset: n } = e, i = n.immediatelyLoadDesiredLevelOfDetail ? Number.MAX_VALUE : Math.max( + n.baseScreenSpaceError, + n.memoryAdjustedScreenSpaceError + ), { + canTraverse: r, + loadTile: o, + visitTile: s, + touchTile: c + } = Cesium3DTilesetTraversal, l = traversal.stack; + for (l.push(e); l.length > 0; ) { + traversal.stackMaximumLength = Math.max( + traversal.stackMaximumLength, + l.length + ); + const d = l.pop(); + updateTileAncestorContentLinks(d, t); + const f = d.parent, h = !defined(f) || f._refines; + d._refines = r(d) ? updateAndPushChildren(d, l, t) && h : !1; + const p = !d._refines && h; + d.hasRenderableContent ? d.refine === Cesium3DTileRefine$1.ADD ? (selectDesiredTile(d, t), o(d, t)) : d.refine === Cesium3DTileRefine$1.REPLACE && (inBaseTraversal(d, i) ? (o(d, t), p && selectDesiredTile(d, t)) : p ? (selectDesiredTile(d, t), o(d, t)) : reachedSkippingThreshold(n, d) && o(d, t)) : (n._emptyTiles.push(d), o(d, t), p && selectDesiredTile(d, t)), s(d, t), c(d, t); + } +} +function traverseAndSelect(e, t) { + const { selectTile: n, canTraverse: i } = Cesium3DTilesetTraversal, { stack: r, ancestorStack: o } = selectionTraversal; + let s; + for (r.push(e); r.length > 0 || o.length > 0; ) { + if (selectionTraversal.stackMaximumLength = Math.max( + selectionTraversal.stackMaximumLength, + r.length + ), selectionTraversal.ancestorStackMaximumLength = Math.max( + selectionTraversal.ancestorStackMaximumLength, + o.length + ), o.length > 0) { + const d = o.peek(); + if (d._stackLength === r.length) { + o.pop(), d !== s && (d._finalResolution = !1), n(d, t); + continue; + } + } + const c = r.pop(); + if (!defined(c)) + continue; + const l = i(c); + if (c._shouldSelect) + if (c.refine === Cesium3DTileRefine$1.ADD) + n(c, t); + else { + if (c._selectionDepth = o.length, c._selectionDepth > 0 && (c.tileset.hasMixedContent = !0), s = c, !l) { + n(c, t); + continue; + } + o.push(c), c._stackLength = r.length; + } + if (l) { + const d = c.children; + for (let f = 0; f < d.length; ++f) { + const h = d[f]; + h.isVisible && r.push(h); + } + } + } +} +function Cesium3DTileset(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._url = void 0, this._basePath = void 0, this._root = void 0, this._resource = void 0, this._asset = void 0, this._properties = void 0, this._geometricError = void 0, this._scaledGeometricError = void 0, this._extensionsUsed = void 0, this._extensions = void 0, this._modelUpAxis = void 0, this._modelForwardAxis = void 0, this._cache = new Cesium3DTilesetCache(), this._processingQueue = [], this._selectedTiles = [], this._emptyTiles = [], this._requestedTiles = [], this._selectedTilesToStyle = [], this._loadTimestamp = void 0, this._timeSinceLoad = 0, this._updatedVisibilityFrame = 0, this._updatedModelMatrixFrame = 0, this._modelMatrixChanged = !1, this._previousModelMatrix = void 0, this._extras = void 0, this._credits = void 0, this._showCreditsOnScreen = defaultValue(e.showCreditsOnScreen, !1), this._cullWithChildrenBounds = defaultValue( + e.cullWithChildrenBounds, + !0 + ), this._allTilesAdditive = !0, this._hasMixedContent = !1, this._stencilClearCommand = void 0, this._backfaceCommands = new ManagedArray(), this._maximumScreenSpaceError = defaultValue( + e.maximumScreenSpaceError, + 16 + ), this._memoryAdjustedScreenSpaceError = this._maximumScreenSpaceError, this._cacheBytes = defaultValue(e.cacheBytes, 512 * 1024 * 1024); + const t = defaultValue( + e.maximumCacheOverflowBytes, + 512 * 1024 * 1024 + ); + this._maximumCacheOverflowBytes = t, this._styleEngine = new Cesium3DTileStyleEngine(), this._styleApplied = !1, this._modelMatrix = defined(e.modelMatrix) ? Matrix4.clone(e.modelMatrix) : Matrix4.clone(Matrix4.IDENTITY), this._addHeightCallbacks = [], this._statistics = new Cesium3DTilesetStatistics(), this._statisticsLast = new Cesium3DTilesetStatistics(), this._statisticsPerPass = new Array(Cesium3DTilePass$1.NUMBER_OF_PASSES); + for (let r = 0; r < Cesium3DTilePass$1.NUMBER_OF_PASSES; ++r) + this._statisticsPerPass[r] = new Cesium3DTilesetStatistics(); + this._requestedTilesInFlight = [], this._maximumPriority = { + foveatedFactor: -Number.MAX_VALUE, + depth: -Number.MAX_VALUE, + distance: -Number.MAX_VALUE, + reverseScreenSpaceError: -Number.MAX_VALUE + }, this._minimumPriority = { + foveatedFactor: Number.MAX_VALUE, + depth: Number.MAX_VALUE, + distance: Number.MAX_VALUE, + reverseScreenSpaceError: Number.MAX_VALUE + }, this._heatmap = new Cesium3DTilesetHeatmap( + e.debugHeatmapTilePropertyName + ), this.cullRequestsWhileMoving = defaultValue( + e.cullRequestsWhileMoving, + !0 + ), this._cullRequestsWhileMoving = !1, this.cullRequestsWhileMovingMultiplier = defaultValue( + e.cullRequestsWhileMovingMultiplier, + 60 + ), this.progressiveResolutionHeightFraction = CesiumMath.clamp( + defaultValue(e.progressiveResolutionHeightFraction, 0.3), + 0, + 0.5 + ), this.preferLeaves = defaultValue(e.preferLeaves, !1), this._tilesLoaded = !1, this._initialTilesLoaded = !1, this._tileDebugLabels = void 0, this._classificationType = e.classificationType, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.WGS84), this._initialClippingPlanesOriginMatrix = Matrix4.IDENTITY, this._clippingPlanesOriginMatrix = void 0, this._clippingPlanesOriginMatrixDirty = !0, this._vectorClassificationOnly = defaultValue( + e.vectorClassificationOnly, + !1 + ), this._vectorKeepDecodedPositions = defaultValue( + e.vectorKeepDecodedPositions, + !1 + ), this.preloadWhenHidden = defaultValue(e.preloadWhenHidden, !1), this.preloadFlightDestinations = defaultValue( + e.preloadFlightDestinations, + !0 + ), this._pass = void 0, this.dynamicScreenSpaceError = defaultValue( + e.dynamicScreenSpaceError, + !0 + ), this.foveatedScreenSpaceError = defaultValue( + e.foveatedScreenSpaceError, + !0 + ), this._foveatedConeSize = defaultValue(e.foveatedConeSize, 0.1), this._foveatedMinimumScreenSpaceErrorRelaxation = defaultValue( + e.foveatedMinimumScreenSpaceErrorRelaxation, + 0 + ), this.foveatedInterpolationCallback = defaultValue( + e.foveatedInterpolationCallback, + CesiumMath.lerp + ), this.foveatedTimeDelay = defaultValue(e.foveatedTimeDelay, 0.2), this.dynamicScreenSpaceErrorDensity = defaultValue( + e.dynamicScreenSpaceErrorDensity, + 2e-4 + ), this.dynamicScreenSpaceErrorFactor = defaultValue( + e.dynamicScreenSpaceErrorFactor, + 24 + ), this.dynamicScreenSpaceErrorHeightFalloff = defaultValue( + e.dynamicScreenSpaceErrorHeightFalloff, + 0.25 + ), this._dynamicScreenSpaceErrorComputedDensity = 0, this.shadows = defaultValue(e.shadows, ShadowMode$1.ENABLED), this.show = defaultValue(e.show, !0), this.colorBlendMode = Cesium3DTileColorBlendMode$1.HIGHLIGHT, this.colorBlendAmount = 0.5, this._pointCloudShading = new PointCloudShading(e.pointCloudShading), this._pointCloudEyeDomeLighting = new PointCloudEyeDomeLighting(), this.loadProgress = new Event(), this.allTilesLoaded = new Event(), this.initialTilesLoaded = new Event(), this.tileLoad = new Event(), this.tileUnload = new Event(), this.tileFailed = new Event(), this.tileVisible = new Event(), this.skipLevelOfDetail = defaultValue(e.skipLevelOfDetail, !1), this._disableSkipLevelOfDetail = !1, this.baseScreenSpaceError = defaultValue(e.baseScreenSpaceError, 1024), this.skipScreenSpaceErrorFactor = defaultValue( + e.skipScreenSpaceErrorFactor, + 16 + ), this.skipLevels = defaultValue(e.skipLevels, 1), this.immediatelyLoadDesiredLevelOfDetail = defaultValue( + e.immediatelyLoadDesiredLevelOfDetail, + !1 + ), this.loadSiblings = defaultValue(e.loadSiblings, !1), this._clippingPlanes = void 0, defined(e.clippingPlanes) && ClippingPlaneCollection.setOwner( + e.clippingPlanes, + this, + "_clippingPlanes" + ), this._clippingPolygons = void 0, defined(e.clippingPolygons) && ClippingPolygonCollection.setOwner( + e.clippingPolygons, + this, + "_clippingPolygons" + ), defined(e.imageBasedLighting) ? (this._imageBasedLighting = e.imageBasedLighting, this._shouldDestroyImageBasedLighting = !1) : (this._imageBasedLighting = new ImageBasedLighting(), this._shouldDestroyImageBasedLighting = !0), this.lightColor = e.lightColor, this.backFaceCulling = defaultValue(e.backFaceCulling, !0), this._enableShowOutline = defaultValue(e.enableShowOutline, !0), this.showOutline = defaultValue(e.showOutline, !0), this.outlineColor = defaultValue(e.outlineColor, Color.BLACK), this.splitDirection = defaultValue( + e.splitDirection, + SplitDirection$1.NONE + ), this.enableCollision = defaultValue(e.enableCollision, !1), this._projectTo2D = defaultValue(e.projectTo2D, !1), this._enablePick = defaultValue(e.enablePick, !1), this.debugFreezeFrame = defaultValue(e.debugFreezeFrame, !1), this.debugColorizeTiles = defaultValue(e.debugColorizeTiles, !1), this._enableDebugWireframe = defaultValue( + e.enableDebugWireframe, + !1 + ), this.debugWireframe = defaultValue(e.debugWireframe, !1), this.debugWireframe === !0 && this._enableDebugWireframe === !1 && oneTimeWarning( + "tileset-debug-wireframe-ignored", + "enableDebugWireframe must be set to true in the Cesium3DTileset constructor, otherwise debugWireframe will be ignored." + ), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.debugShowContentBoundingVolume = defaultValue( + e.debugShowContentBoundingVolume, + !1 + ), this.debugShowViewerRequestVolume = defaultValue( + e.debugShowViewerRequestVolume, + !1 + ), this._tileDebugLabels = void 0, this.debugPickedTileLabelOnly = !1, this.debugPickedTile = void 0, this.debugPickPosition = void 0, this.debugShowGeometricError = defaultValue( + e.debugShowGeometricError, + !1 + ), this.debugShowRenderingStatistics = defaultValue( + e.debugShowRenderingStatistics, + !1 + ), this.debugShowMemoryUsage = defaultValue(e.debugShowMemoryUsage, !1), this.debugShowUrl = defaultValue(e.debugShowUrl, !1), this.examineVectorLinesFunction = void 0, this._metadataExtension = void 0, this._customShader = e.customShader; + let n = defaultValue(e.featureIdLabel, "featureId_0"); + typeof n == "number" && (n = `featureId_${n}`), this._featureIdLabel = n; + let i = defaultValue( + e.instanceFeatureIdLabel, + "instanceFeatureId_0" + ); + typeof i == "number" && (i = `instanceFeatureId_${i}`), this._instanceFeatureIdLabel = i, this.useSRGBVertexColors = defaultValue(e.useSRGBVertexColors, !1), this.useSRGBColorFactors = defaultValue(e.useSRGBColorFactors, !1); +} +Object.defineProperties(Cesium3DTileset.prototype, { + /** + * NOTE: This getter exists so that `Picking.js` can differentiate between + * PrimitiveCollection and Cesium3DTileset objects without inflating + * the size of the module via `instanceof Cesium3DTileset` + * @private + */ + isCesium3DTileset: { + get: function() { + return !0; + } + }, + /** + * Gets the tileset's asset object property, which contains metadata about the tileset. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-asset|asset schema reference} + * in the 3D Tiles spec for the full set of properties. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {object} + * @readonly + */ + asset: { + get: function() { + return this._asset; + } + }, + /** + * Gets the tileset's extensions object property. + * + * @memberof Cesium3DTileset.prototype + * + * @type {object} + * @readonly + */ + extensions: { + get: function() { + return this._extensions; + } + }, + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. + * + * @memberof Cesium3DTileset.prototype + * + * @type {ClippingPlaneCollection} + */ + clippingPlanes: { + get: function() { + return this._clippingPlanes; + }, + set: function(e) { + ClippingPlaneCollection.setOwner(e, this, "_clippingPlanes"); + } + }, + /** + * The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset. + * + * @memberof Cesium3DTileset.prototype + * + * @type {ClippingPolygonCollection} + */ + clippingPolygons: { + get: function() { + return this._clippingPolygons; + }, + set: function(e) { + ClippingPolygonCollection.setOwner(e, this, "_clippingPolygons"); + } + }, + /** + * Gets the tileset's properties dictionary object, which contains metadata about per-feature properties. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-properties|properties schema reference} + * in the 3D Tiles spec for the full set of properties. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {object} + * @readonly + * + * @example + * console.log(`Maximum building height: ${tileset.properties.height.maximum}`); + * console.log(`Minimum building height: ${tileset.properties.height.minimum}`); + * + * @see Cesium3DTileFeature#getProperty + * @see Cesium3DTileFeature#setProperty + */ + properties: { + get: function() { + return this._properties; + } + }, + /** + * When true, all tiles that meet the screen space error this frame are loaded. The tileset is + * completely loaded for this view. + * + * @memberof Cesium3DTileset.prototype + * + * @type {boolean} + * @readonly + * + * @default false + * + * @see Cesium3DTileset#allTilesLoaded + */ + tilesLoaded: { + get: function() { + return this._tilesLoaded; + } + }, + /** + * The resource used to fetch the tileset JSON file + * + * @memberof Cesium3DTileset.prototype + * + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * The base path that non-absolute paths in tileset JSON file are relative to. + * + * @memberof Cesium3DTileset.prototype + * + * @type {string} + * @readonly + * @deprecated + */ + basePath: { + get: function() { + return deprecationWarning( + "Cesium3DTileset.basePath", + "Cesium3DTileset.basePath has been deprecated. All tiles are relative to the url of the tileset JSON file that contains them. Use the url property instead." + ), this._basePath; + } + }, + /** + * The style, defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}, + * applied to each feature in the tileset. + *

+ * Assign undefined to remove the style, which will restore the visual + * appearance of the tileset to its default when no style was applied. + *

+ *

+ * The style is applied to a tile before the {@link Cesium3DTileset#tileVisible} + * event is raised, so code in tileVisible can manually set a feature's + * properties (e.g. color and show) after the style is applied. When + * a new style is assigned any manually set properties are overwritten. + *

+ *

+ * Use an always "true" condition to specify the Color for all objects that are not + * overridden by pre-existing conditions. Otherwise, the default color Cesium.Color.White + * will be used. Similarly, use an always "true" condition to specify the show property + * for all objects that are not overridden by pre-existing conditions. Otherwise, the + * default show value true will be used. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {Cesium3DTileStyle|undefined} + * + * @default undefined + * + * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Height} >= 100', 'color("purple", 0.5)'], + * ['${Height} >= 50', 'color("red")'], + * ['true', 'color("blue")'] + * ] + * }, + * show : '${Height} > 0', + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * + * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language} + */ + style: { + get: function() { + return this._styleEngine.style; + }, + set: function(e) { + this._styleEngine.style = e; + } + }, + /** + * A custom shader to apply to all tiles in the tileset. Only used for + * contents that use {@link Model}. Using custom shaders with a + * {@link Cesium3DTileStyle} may lead to undefined behavior. + * + * @memberof Cesium3DTileset.prototype + * + * @type {CustomShader|undefined} + * + * @default undefined + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + customShader: { + get: function() { + return this._customShader; + }, + set: function(e) { + this._customShader = e; + } + }, + /** + * Whether the tileset is rendering different levels of detail in the same view. + * Only relevant if {@link Cesium3DTileset.isSkippingLevelOfDetail} is true. + * + * @memberof Cesium3DTileset.prototype + * + * @type {boolean} + * @private + */ + hasMixedContent: { + get: function() { + return this._hasMixedContent; + }, + set: function(e) { + this._hasMixedContent = e; + } + }, + /** + * Whether this tileset is actually skipping levels of detail. + * The user option may have been disabled if all tiles are using additive refinement, + * or if some tiles have a content type for which rendering does not support skipping + * + * @memberof Cesium3DTileset.prototype + * + * @type {boolean} + * @private + * @readonly + */ + isSkippingLevelOfDetail: { + get: function() { + return this.skipLevelOfDetail && !defined(this._classificationType) && !this._disableSkipLevelOfDetail && !this._allTilesAdditive; + } + }, + /** + * The tileset's schema, groups, tileset metadata and other details from the + * 3DTILES_metadata extension or a 3D Tiles 1.1 tileset JSON. This getter is + * for internal use by other classes. + * + * @memberof Cesium3DTileset.prototype + * @type {Cesium3DTilesetMetadata} + * @private + * @readonly + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + metadataExtension: { + get: function() { + return this._metadataExtension; + } + }, + /** + * The metadata properties attached to the tileset as a whole. + * + * @memberof Cesium3DTileset.prototype + * + * @type {TilesetMetadata} + * @private + * @readonly + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + metadata: { + get: function() { + if (defined(this._metadataExtension)) + return this._metadataExtension.tileset; + } + }, + /** + * The metadata schema used in this tileset. Shorthand for + * tileset.metadataExtension.schema + * + * @memberof Cesium3DTileset.prototype + * + * @type {MetadataSchema} + * @private + * @readonly + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + schema: { + get: function() { + if (defined(this._metadataExtension)) + return this._metadataExtension.schema; + } + }, + /** + * The maximum screen space error used to drive level of detail refinement. This value helps determine when a tile + * refines to its descendants, and therefore plays a major role in balancing performance with visual quality. + *

+ * A tile's screen space error is roughly equivalent to the number of pixels wide that would be drawn if a sphere with a + * radius equal to the tile's geometric error were rendered at the tile's position. If this value exceeds + * maximumScreenSpaceError the tile refines to its descendants. + *

+ *

+ * Depending on the tileset, maximumScreenSpaceError may need to be tweaked to achieve the right balance. + * Higher values provide better performance but lower visual quality. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @default 16 + * + * @exception {DeveloperError} maximumScreenSpaceError must be greater than or equal to zero. + */ + maximumScreenSpaceError: { + get: function() { + return this._maximumScreenSpaceError; + }, + set: function(e) { + this._maximumScreenSpaceError = e, this._memoryAdjustedScreenSpaceError = e; + } + }, + /** + * The amount of GPU memory (in bytes) used to cache tiles. This memory usage is estimated from + * geometry, textures, and batch table textures of loaded tiles. For point clouds, this value also + * includes per-point metadata. + *

+ * Tiles not in view are unloaded to enforce this. + *

+ *

+ * If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. + *

+ *

+ * If tiles sized more than cacheBytes are needed to meet the + * desired screen space error, determined by {@link Cesium3DTileset#maximumScreenSpaceError}, + * for the current view, then the memory usage of the tiles loaded will exceed + * cacheBytes by up to maximumCacheOverflowBytes. + * For example, if cacheBytes is 500000, but 600000 bytes + * of tiles are needed to meet the screen space error, then 600000 bytes of tiles + * may be loaded (if maximumCacheOverflowBytes is at least 100000). + * When these tiles go out of view, they will be unloaded. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @default 536870912 + * + * @exception {DeveloperError} cacheBytes must be typeof 'number' and greater than or equal to 0 + * @see Cesium3DTileset#totalMemoryUsageInBytes + */ + cacheBytes: { + get: function() { + return this._cacheBytes; + }, + set: function(e) { + this._cacheBytes = e; + } + }, + /** + * The maximum additional amount of GPU memory (in bytes) that will be used to cache tiles. + *

+ * If tiles sized more than cacheBytes plus maximumCacheOverflowBytes + * are needed to meet the desired screen space error, determined by + * {@link Cesium3DTileset#maximumScreenSpaceError} for the current view, then + * {@link Cesium3DTileset#memoryAdjustedScreenSpaceError} will be adjusted + * until the tiles required to meet the adjusted screen space error use less + * than cacheBytes plus maximumCacheOverflowBytes. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @default 536870912 + * + * @exception {DeveloperError} maximumCacheOverflowBytes must be typeof 'number' and greater than or equal to 0 + * @see Cesium3DTileset#totalMemoryUsageInBytes + */ + maximumCacheOverflowBytes: { + get: function() { + return this._maximumCacheOverflowBytes; + }, + set: function(e) { + this._maximumCacheOverflowBytes = e; + } + }, + /** + * If loading the level of detail required by @{link Cesium3DTileset#maximumScreenSpaceError} + * results in the memory usage exceeding @{link Cesium3DTileset#cacheBytes} + * plus @{link Cesium3DTileset#maximumCacheOverflowBytes}, level of detail refinement + * will instead use this (larger) adjusted screen space error to achieve the + * best possible visual quality within the available memory + * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @readonly + * + * @private + */ + memoryAdjustedScreenSpaceError: { + get: function() { + return this._memoryAdjustedScreenSpaceError; + } + }, + /** + * Options for controlling point size based on geometric error and eye dome lighting. + * + * @memberof Cesium3DTileset.prototype + * + * @type {PointCloudShading} + */ + pointCloudShading: { + get: function() { + return this._pointCloudShading; + }, + set: function(e) { + this._pointCloudShading = e; + } + }, + /** + * The root tile. + * + * @memberOf Cesium3DTileset.prototype + * + * @type {Cesium3DTile} + * @readonly + */ + root: { + get: function() { + return this._root; + } + }, + /** + * The tileset's bounding sphere. + * + * @memberof Cesium3DTileset.prototype + * + * @type {BoundingSphere} + * @readonly + * + * @example + * const tileset = await Cesium.Cesium3DTileset.fromUrl("http://localhost:8002/tilesets/Seattle/tileset.json"); + * + * viewer.scene.primitives.add(tileset); + * + * // Set the camera to view the newly added tileset + * viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0)); + */ + boundingSphere: { + get: function() { + return this._root.updateTransform(this._modelMatrix), this._root.boundingSphere; + } + }, + /** + * A 4x4 transformation matrix that transforms the entire tileset. + * + * @memberof Cesium3DTileset.prototype + * + * @type {Matrix4} + * @default Matrix4.IDENTITY + * + * @example + * // Adjust a tileset's height from the globe's surface. + * const heightOffset = 20.0; + * const boundingSphere = tileset.boundingSphere; + * const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); + * const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); + * const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset); + * const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); + * tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._modelMatrix = Matrix4.clone(e, this._modelMatrix); + } + }, + /** + * Returns the time, in milliseconds, since the tileset was loaded and first updated. + * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @readonly + */ + timeSinceLoad: { + get: function() { + return this._timeSinceLoad; + } + }, + /** + * The total amount of GPU memory in bytes used by the tileset. This value is estimated from + * geometry, texture, batch table textures, and binary metadata of loaded tiles. + * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @readonly + * + * @see Cesium3DTileset#cacheBytes + */ + totalMemoryUsageInBytes: { + get: function() { + const e = this._statistics; + return e.texturesByteLength + e.geometryByteLength + e.batchTableByteLength; + } + }, + /** + * @private + */ + clippingPlanesOriginMatrix: { + get: function() { + return defined(this._clippingPlanesOriginMatrix) ? (this._clippingPlanesOriginMatrixDirty && (Matrix4.multiply( + this.root.computedTransform, + this._initialClippingPlanesOriginMatrix, + this._clippingPlanesOriginMatrix + ), this._clippingPlanesOriginMatrixDirty = !1), this._clippingPlanesOriginMatrix) : Matrix4.IDENTITY; + } + }, + /** + * @private + */ + styleEngine: { + get: function() { + return this._styleEngine; + } + }, + /** + * @private + */ + statistics: { + get: function() { + return this._statistics; + } + }, + /** + * Determines whether terrain, 3D Tiles, or both will be classified by this tileset. + *

+ * This option is only applied to tilesets containing batched 3D models, + * glTF content, geometry data, or vector data. Even when undefined, vector + * and geometry data must render as classifications and will default to + * rendering on both terrain and other 3D Tiles tilesets. + *

+ *

+ * When enabled for batched 3D model and glTF tilesets, there are a few + * requirements/limitations on the glTF: + *

    + *
  • The glTF cannot contain morph targets, skins, or animations.
  • + *
  • The glTF cannot contain the EXT_mesh_gpu_instancing extension.
  • + *
  • Only meshes with TRIANGLES can be used to classify other assets.
  • + *
  • The meshes must be watertight.
  • + *
  • The POSITION semantic is required.
  • + *
  • If _BATCHIDs and an index buffer are both present, all indices with the same batch id must occupy contiguous sections of the index buffer.
  • + *
  • If _BATCHIDs are present with no index buffer, all positions with the same batch id must occupy contiguous sections of the position buffer.
  • + *
+ *

+ *

+ * Additionally, classification is not supported for points or instanced 3D + * models. + *

+ *

+ * The 3D Tiles or terrain receiving the classification must be opaque. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {ClassificationType} + * @default undefined + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * @readonly + */ + classificationType: { + get: function() { + return this._classificationType; + } + }, + /** + * Gets an ellipsoid describing the shape of the globe. + * + * @memberof Cesium3DTileset.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. + * Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. + * Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, essentially disabling the effect. + * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @default 0.3 + */ + foveatedConeSize: { + get: function() { + return this._foveatedConeSize; + }, + set: function(e) { + this._foveatedConeSize = e; + } + }, + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. + * The screen space error will be raised starting with this value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. + * + * @memberof Cesium3DTileset.prototype + * + * @type {number} + * @default 0.0 + */ + foveatedMinimumScreenSpaceErrorRelaxation: { + get: function() { + return this._foveatedMinimumScreenSpaceErrorRelaxation; + }, + set: function(e) { + this._foveatedMinimumScreenSpaceErrorRelaxation = e; + } + }, + /** + * Returns the extras property at the top-level of the tileset JSON, which contains application specific metadata. + * Returns undefined if extras does not exist. + * + * @memberof Cesium3DTileset.prototype + * + * @type {*} + * @readonly + * + * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#specifying-extensions-and-application-specific-extras|Extras in the 3D Tiles specification.} + */ + extras: { + get: function() { + return this._extras; + } + }, + /** + * The properties for managing image-based lighting on this tileset. + * + * @memberof Cesium3DTileset.prototype + * + * @type {ImageBasedLighting} + */ + imageBasedLighting: { + get: function() { + return this._imageBasedLighting; + }, + set: function(e) { + e !== this._imageBasedLighting && (this._shouldDestroyImageBasedLighting && !this._imageBasedLighting.isDestroyed() && this._imageBasedLighting.destroy(), this._imageBasedLighting = e, this._shouldDestroyImageBasedLighting = !1); + } + }, + /** + * Indicates that only the tileset's vector tiles should be used for classification. + * + * @memberof Cesium3DTileset.prototype + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @type {boolean} + * @default false + */ + vectorClassificationOnly: { + get: function() { + return this._vectorClassificationOnly; + } + }, + /** + * Whether vector tiles should keep decoded positions in memory. + * This is used with {@link Cesium3DTileFeature.getPolylinePositions}. + * + * @memberof Cesium3DTileset.prototype + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @type {boolean} + * @default false + */ + vectorKeepDecodedPositions: { + get: function() { + return this._vectorKeepDecodedPositions; + } + }, + /** + * Determines whether the credits of the tileset will be displayed on the screen + * + * @memberof Cesium3DTileset.prototype + * + * @type {boolean} + * @default false + */ + showCreditsOnScreen: { + get: function() { + return this._showCreditsOnScreen; + }, + set: function(e) { + this._showCreditsOnScreen = e, createCredits(this); + } + }, + /** + * Label of the feature ID set to use for picking and styling. + *

+ * For EXT_mesh_features, this is the feature ID's label property, or + * "featureId_N" (where N is the index in the featureIds array) when not + * specified. EXT_feature_metadata did not have a label field, so such + * feature ID sets are always labeled "featureId_N" where N is the index in + * the list of all feature Ids, where feature ID attributes are listed before + * feature ID textures. + *

+ *

+ * If featureIdLabel is set to an integer N, it is converted to + * the string "featureId_N" automatically. If both per-primitive and + * per-instance feature IDs are present, the instance feature IDs take + * priority. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {string} + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + featureIdLabel: { + get: function() { + return this._featureIdLabel; + }, + set: function(e) { + typeof e == "number" && (e = `featureId_${e}`), this._featureIdLabel = e; + } + }, + /** + * Label of the instance feature ID set used for picking and styling. + *

+ * If instanceFeatureIdLabel is set to an integer N, it is converted to + * the string "instanceFeatureId_N" automatically. + * If both per-primitive and per-instance feature IDs are present, the + * instance feature IDs take priority. + *

+ * + * @memberof Cesium3DTileset.prototype + * + * @type {string} + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + instanceFeatureIdLabel: { + get: function() { + return this._instanceFeatureIdLabel; + }, + set: function(e) { + typeof e == "number" && (e = `instanceFeatureId_${e}`), this._instanceFeatureIdLabel = e; + } + } +}); +Cesium3DTileset.fromIonAssetId = async function(e, t) { + const n = await IonResource.fromAssetId(e); + return Cesium3DTileset.fromUrl(n, t); +}; +Cesium3DTileset.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = Resource.createIfNeeded(e); + let i; + n.extension === "json" ? i = n.getBaseUri(!0) : n.isDataUri && (i = ""); + const r = await Cesium3DTileset.loadJson(n), o = await processMetadataExtension( + n, + r + ), s = new Cesium3DTileset(t); + s._resource = n, s._url = n.url, s._basePath = i, s._metadataExtension = o, s._geometricError = r.geometricError, s._scaledGeometricError = r.geometricError; + const c = r.asset; + s._asset = c, s._extras = r.extras, createCredits(s); + const l = defined(r.asset.gltfUpAxis) ? Axis$1.fromName(r.asset.gltfUpAxis) : Axis$1.Y, d = defaultValue(t.modelUpAxis, l), f = defaultValue(t.modelForwardAxis, Axis$1.X); + s._properties = r.properties, s._extensionsUsed = r.extensionsUsed, s._extensions = r.extensions, s._modelUpAxis = d, s._modelForwardAxis = f, s._root = s.loadTileset(n, r); + const p = s._root.createBoundingVolume( + r.root.boundingVolume, + Matrix4.IDENTITY + ).boundingSphere.center, m = s._ellipsoid.cartesianToCartographic( + p + ); + return defined(m) && m.height > ApproximateTerrainHeights._defaultMinTerrainHeight && (s._initialClippingPlanesOriginMatrix = Transforms.eastNorthUpToFixedFrame( + p + )), s._clippingPlanesOriginMatrix = Matrix4.clone( + s._initialClippingPlanesOriginMatrix + ), s; +}; +Cesium3DTileset.loadJson = function(e) { + return Resource.createIfNeeded(e).fetchJson(); +}; +Cesium3DTileset.prototype.makeStyleDirty = function() { + this._styleEngine.makeDirty(); +}; +Cesium3DTileset.prototype.loadTileset = function(e, t, n) { + const i = t.asset; + if (!defined(i)) + throw new RuntimeError("Tileset must have an asset property."); + if (i.version !== "0.0" && i.version !== "1.0" && i.version !== "1.1") + throw new RuntimeError( + "The tileset must be 3D Tiles version 0.0, 1.0, or 1.1" + ); + defined(t.extensionsRequired) && Cesium3DTileset.checkSupportedExtensions(t.extensionsRequired); + const r = this._statistics, o = i.tilesetVersion; + defined(o) && (this._basePath += `?v=${o}`, e = e.clone(), e.setQueryParameters({ v: o })); + const s = makeTile(this, e, t.root, n); + defined(n) && (n.children.push(s), s._depth = n._depth + 1); + const c = []; + for (c.push(s); c.length > 0; ) { + const l = c.pop(); + ++r.numberOfTilesTotal, this._allTilesAdditive = this._allTilesAdditive && l.refine === Cesium3DTileRefine$1.ADD; + const d = l._header.children; + if (defined(d)) + for (let f = 0; f < d.length; ++f) { + const h = d[f], p = makeTile(this, e, h, l); + l.children.push(p), p._depth = l._depth + 1, c.push(p); + } + this._cullWithChildrenBounds && Cesium3DTileOptimizations.checkChildrenWithinParent(l); + } + return s; +}; +function makeTile(e, t, n, i) { + if (!(defined(n.implicitTiling) || hasExtension(n, "3DTILES_implicit_tiling"))) + return new Cesium3DTile(e, t, n, i); + const o = e.schema, s = new ImplicitTileset( + t, + n, + o + ), c = new ImplicitTileCoordinates({ + subdivisionScheme: s.subdivisionScheme, + subtreeLevels: s.subtreeLevels, + level: 0, + x: 0, + y: 0, + // The constructor will only use this for octrees. + z: 0 + }), l = s.subtreeUriTemplate.getDerivedResource({ + templateValues: c.getTemplateValues() + }).url, f = clone$1(n, !0); + f.contents = [ + { + uri: l + } + ], delete f.content, delete f.extensions; + const h = new Cesium3DTile(e, t, f, i); + return h.implicitTileset = s, h.implicitCoordinates = c, h; +} +async function processMetadataExtension(e, t) { + const n = hasExtension(t, "3DTILES_metadata") ? t.extensions["3DTILES_metadata"] : t; + let i; + if (defined(n.schemaUri)) + e = e.getDerivedResource({ + url: n.schemaUri + }), i = ResourceCache.getSchemaLoader({ + resource: e + }); + else if (defined(n.schema)) + i = ResourceCache.getSchemaLoader({ + schema: n.schema + }); + else + return; + await i.load(); + const r = new Cesium3DTilesetMetadata({ + schema: i.schema, + metadataJson: n + }); + return ResourceCache.unload(i), r; +} +const scratchPositionNormal$2 = new Cartesian3(), scratchCartographic$c = new Cartographic(), scratchMatrix$2 = new Matrix4(), scratchCenter$6 = new Cartesian3(), scratchPosition$8 = new Cartesian3(), scratchDirection$1 = new Cartesian3(), scratchHalfHeight = new Cartesian3(); +function updateDynamicScreenSpaceError(e, t) { + let n, i, r, o, s; + const c = t.camera, l = e._root, d = l.contentBoundingVolume; + if (d instanceof TileBoundingRegion) + n = Cartesian3.normalize(c.positionWC, scratchPositionNormal$2), i = c.directionWC, r = c.positionCartographic.height, o = d.minimumHeight, s = d.maximumHeight; + else { + const y = Matrix4.inverseTransformation( + l.computedTransform, + scratchMatrix$2 + ), C = t.mapProjection.ellipsoid, T = d.boundingVolume, x = Matrix4.multiplyByPoint( + y, + T.center, + scratchCenter$6 + ); + if (Cartesian3.magnitude(x) > C.minimumRadius) { + const b = Cartographic.fromCartesian( + x, + C, + scratchCartographic$c + ); + n = Cartesian3.normalize(c.positionWC, scratchPositionNormal$2), i = c.directionWC, r = c.positionCartographic.height, o = 0, s = b.height * 2; + } else { + const b = Matrix4.multiplyByPoint( + y, + c.positionWC, + scratchPosition$8 + ); + if (n = Cartesian3.UNIT_Z, i = Matrix4.multiplyByPointAsVector( + y, + c.directionWC, + scratchDirection$1 + ), i = Cartesian3.normalize(i, i), r = b.z, d instanceof TileOrientedBoundingBox) { + const S = Matrix3.getColumn( + T.halfAxes, + 2, + scratchHalfHeight + ), E = Cartesian3.magnitude(S); + o = x.z - E, s = x.z + E; + } else if (d instanceof TileBoundingSphere) { + const S = T.radius; + o = x.z - S, s = x.z + S; + } + } + } + const f = e.dynamicScreenSpaceErrorHeightFalloff, h = o + (s - o) * f, p = s, m = CesiumMath.clamp( + (r - h) / (p - h), + 0, + 1 + ); + let _ = 1 - Math.abs(Cartesian3.dot(i, n)); + _ = _ * (1 - m), e._dynamicScreenSpaceErrorComputedDensity = e.dynamicScreenSpaceErrorDensity * _; +} +function requestContent(e, t) { + if (t.hasEmptyContent) + return; + const { statistics: n } = e, i = t.contentExpired, r = t.requestContent(); + defined(r) && (r.then((o) => { + !defined(o) || t.isDestroyed() || e.isDestroyed() || (e._processingQueue.push(t), ++n.numberOfTilesProcessing); + }).catch((o) => { + handleTileFailure(o, e, t); + }), i && (t.hasTilesetContent || t.hasImplicitContent ? destroySubtree(e, t) : (n.decrementLoadCounts(t.content), --n.numberOfTilesWithContentReady)), e._requestedTilesInFlight.push(t)); +} +function sortTilesByPriority(e, t) { + return e._priority - t._priority; +} +Cesium3DTileset.prototype.postPassesUpdate = function(e) { + defined(this._root) && (cancelOutOfViewRequests(this, e), raiseLoadProgressEvent(this, e), this._cache.unloadTiles(this, unloadTile), this._styleApplied && this._styleEngine.resetDirty(), this._styleApplied = !1); +}; +Cesium3DTileset.prototype.prePassesUpdate = function(e) { + if (!defined(this._root)) + return; + processTiles(this, e); + const t = this._clippingPlanes; + this._clippingPlanesOriginMatrixDirty = !0, defined(t) && t.enabled && t.update(e); + const n = this._clippingPolygons; + defined(n) && n.enabled && n.update(e), defined(this._loadTimestamp) || (this._loadTimestamp = JulianDate.clone(e.time)), this._timeSinceLoad = Math.max( + JulianDate.secondsDifference(e.time, this._loadTimestamp) * 1e3, + 0 + ), this.dynamicScreenSpaceError && updateDynamicScreenSpaceError(this, e), e.newFrame && this._cache.reset(); +}; +function cancelOutOfViewRequests(e, t) { + const n = e._requestedTilesInFlight; + let i = 0; + for (let r = 0; r < n.length; ++r) { + const o = n[r], s = t.frameNumber - o._touchedFrame >= 1; + if (o._contentState !== Cesium3DTileContentState$1.LOADING) { + ++i; + continue; + } else if (s) { + o.cancelRequests(), ++i; + continue; + } + i > 0 && (n[r - i] = o); + } + n.length -= i; +} +function requestTiles(e) { + const t = e._requestedTiles; + t.sort(sortTilesByPriority); + for (let n = 0; n < t.length; ++n) + requestContent(e, t[n]); +} +function handleTileFailure(e, t, n) { + if (t.isDestroyed()) + return; + let i; + n.isDestroyed() || (i = n._contentResource.url); + const r = defined(e.message) ? e.message : e.toString(); + t.tileFailed.numberOfListeners > 0 ? t.tileFailed.raiseEvent({ + url: i, + message: r + }) : (console.log(`A 3D tile failed to load: ${i}`), console.log(`Error: ${r}`)); +} +function filterProcessingQueue(e) { + const t = e._processingQueue; + let n = 0; + for (let i = 0; i < t.length; ++i) { + const r = t[i]; + if (r.isDestroyed() || r._contentState !== Cesium3DTileContentState$1.PROCESSING) { + ++n; + continue; + } + n > 0 && (t[i - n] = r); + } + t.length -= n; +} +const scratchUpdateHeightCartographic = new Cartographic(), scratchUpdateHeightCartographic2 = new Cartographic(), scratchUpdateHeightCartesian = new Cartesian3(); +function processUpdateHeight(e, t, n) { + if (!e.enableCollision || !e.show) + return; + const i = e._addHeightCallbacks, r = t.boundingSphere; + for (const o of i) { + if (o.invoked || t._wasSelectedLastFrame) + continue; + const s = o.ellipsoid, c = Cartographic.clone( + o.positionCartographic, + scratchUpdateHeightCartographic + ), l = Cartographic.fromCartesian( + r.center, + s, + scratchUpdateHeightCartographic2 + ); + defined(l) && (c.height = l.height); + const d = Cartographic.toCartesian( + c, + s, + scratchUpdateHeightCartesian + ); + Cartesian3.distance(d, r.center) <= r.radius && (o.invoked = !0, n.afterRender.push(() => { + defined(o.callback) && o.callback(c), o.invoked = !1; + })); + } +} +function processTiles(e, t) { + filterProcessingQueue(e); + const n = e._processingQueue, { cacheBytes: i, maximumCacheOverflowBytes: r, statistics: o } = e, s = i + r; + let c = !1; + for (let l = 0; l < n.length; ++l) { + if (e.totalMemoryUsageInBytes > s) { + c = !0; + break; + } + const d = n[l]; + try { + d.process(e, t), d.contentReady && (--o.numberOfTilesProcessing, e.tileLoad.raiseEvent(d)); + } catch (f) { + --o.numberOfTilesProcessing, handleTileFailure(f, e, d); + } + } + e.totalMemoryUsageInBytes < i ? decreaseScreenSpaceError(e) : c && n.length > 0 && increaseScreenSpaceError(e); +} +function increaseScreenSpaceError(e) { + e._memoryAdjustedScreenSpaceError *= 1.02; + const t = e._processingQueue; + for (let n = 0; n < t.length; ++n) + t[n].updatePriority(); + t.sort(sortTilesByPriority); +} +function decreaseScreenSpaceError(e) { + e._memoryAdjustedScreenSpaceError = Math.max( + e.memoryAdjustedScreenSpaceError / 1.02, + e.maximumScreenSpaceError + ); +} +const scratchCartesian$6 = new Cartesian3(), stringOptions = { + maximumFractionDigits: 3 +}; +function formatMemoryString(e) { + const t = e / 1048576; + return t < 1 ? t.toLocaleString(void 0, stringOptions) : Math.round(t).toLocaleString(); +} +function computeTileLabelPosition(e) { + const { halfAxes: t, radius: n, center: i } = e.boundingVolume.boundingVolume; + let r = Cartesian3.clone(i, scratchCartesian$6); + if (defined(t)) + r.x += 0.75 * (t[0] + t[3] + t[6]), r.y += 0.75 * (t[1] + t[4] + t[7]), r.z += 0.75 * (t[2] + t[5] + t[8]); + else if (defined(n)) { + let o = Cartesian3.normalize(i, scratchCartesian$6); + o = Cartesian3.multiplyByScalar( + o, + 0.75 * n, + scratchCartesian$6 + ), r = Cartesian3.add(o, i, scratchCartesian$6); + } + return r; +} +function addTileDebugLabel(e, t, n) { + let i = "", r = 0; + if (t.debugShowGeometricError && (i += ` +Geometric error: ${e.geometricError}`, r++), t.debugShowRenderingStatistics && (i += ` +Commands: ${e.commandsLength}`, r++, e.content.pointsLength > 0 && (i += ` +Points: ${e.content.pointsLength}`, r++), e.content.trianglesLength > 0 && (i += ` +Triangles: ${e.content.trianglesLength}`, r++), i += ` +Features: ${e.content.featuresLength}`, r++), t.debugShowMemoryUsage && (i += ` +Texture Memory: ${formatMemoryString( + e.content.texturesByteLength + )}`, i += ` +Geometry Memory: ${formatMemoryString( + e.content.geometryByteLength + )}`, r += 2), t.debugShowUrl) + if (e.hasMultipleContents) { + i += ` +Urls:`; + const s = e.content.innerContentUrls; + for (let c = 0; c < s.length; c++) + i += ` +- ${s[c]}`; + r += s.length; + } else + i += ` +Url: ${e._contentHeader.uri}`, r++; + const o = { + text: i.substring(1), + position: n, + font: `${19 - r}px sans-serif`, + showBackground: !0, + disableDepthTestDistance: Number.POSITIVE_INFINITY + }; + return t._tileDebugLabels.add(o); +} +function updateTileDebugLabels(e, t) { + const n = e._selectedTiles, i = n.length, r = e._emptyTiles, o = r.length; + if (e._tileDebugLabels.removeAll(), e.debugPickedTileLabelOnly) { + if (defined(e.debugPickedTile)) { + const s = defined(e.debugPickPosition) ? e.debugPickPosition : computeTileLabelPosition(e.debugPickedTile), c = addTileDebugLabel( + e.debugPickedTile, + e, + s + ); + c.pixelOffset = new Cartesian2(15, -15); + } + } else { + for (let s = 0; s < i; ++s) { + const c = n[s]; + addTileDebugLabel(c, e, computeTileLabelPosition(c)); + } + for (let s = 0; s < o; ++s) { + const c = r[s]; + (c.hasTilesetContent || c.hasImplicitContent) && addTileDebugLabel(c, e, computeTileLabelPosition(c)); + } + } + e._tileDebugLabels.update(t); +} +function updateTiles(e, t, n) { + e._styleEngine.applyStyle(e), e._styleApplied = !0; + const { commandList: i, context: r } = t, o = i.length, s = e._selectedTiles, c = e.isSkippingLevelOfDetail && e._hasMixedContent && r.stencilBuffer && s.length > 0; + e._backfaceCommands.length = 0, c && (defined(e._stencilClearCommand) || (e._stencilClearCommand = new ClearCommand({ + stencil: 0, + pass: Pass$1.CESIUM_3D_TILE, + renderState: RenderState.fromCache({ + stencilMask: StencilConstants$1.SKIP_LOD_MASK + }) + })), i.push(e._stencilClearCommand)); + const { statistics: l, tileVisible: d } = e, f = n.isRender, h = i.length; + for (let _ = 0; _ < s.length; ++_) { + const y = s[_]; + f && d.raiseEvent(y), processUpdateHeight(e, y, t), y.update(e, t, n), l.incrementSelectionCounts(y.content), ++l.selected; + } + const p = e._emptyTiles; + for (let _ = 0; _ < p.length; ++_) + p[_].update(e, t, n); + let m = i.length - h; + if (e._backfaceCommands.trim(), c) { + const _ = e._backfaceCommands.values, y = _.length; + i.length += y; + for (let C = m - 1; C >= 0; --C) + i[h + y + C] = i[h + C]; + for (let C = 0; C < y; ++C) + i[h + C] = _[C]; + } + m = i.length - o, l.numberOfCommands = m, f && (e.pointCloudShading.attenuation && e.pointCloudShading.eyeDomeLighting && m > 0 && e._pointCloudEyeDomeLighting.update( + t, + o, + e.pointCloudShading, + e.boundingSphere + ), e.debugShowGeometricError || e.debugShowRenderingStatistics || e.debugShowMemoryUsage || e.debugShowUrl ? (defined(e._tileDebugLabels) || (e._tileDebugLabels = new LabelCollection()), updateTileDebugLabels(e, t)) : e._tileDebugLabels = e._tileDebugLabels && e._tileDebugLabels.destroy()); +} +const scratchStack = []; +function destroySubtree(e, t) { + const n = t, i = scratchStack; + for (i.push(t); i.length > 0; ) { + t = i.pop(); + const r = t.children; + for (let o = 0; o < r.length; ++o) + i.push(r[o]); + t !== n && (destroyTile(e, t), --e._statistics.numberOfTilesTotal); + } + n.children = []; +} +function unloadTile(e, t) { + e.tileUnload.raiseEvent(t), e._statistics.decrementLoadCounts(t.content), --e._statistics.numberOfTilesWithContentReady, t.unloadContent(); +} +function destroyTile(e, t) { + e._cache.unloadTile(e, t, unloadTile), t.destroy(); +} +Cesium3DTileset.prototype.trimLoadedTiles = function() { + this._cache.trim(); +}; +function raiseLoadProgressEvent(e, t) { + const n = e._statistics, i = e._statisticsLast, r = n.numberOfPendingRequests, o = n.numberOfTilesProcessing, s = i.numberOfPendingRequests, c = i.numberOfTilesProcessing; + Cesium3DTilesetStatistics.clone(n, i); + const l = r !== s || o !== c; + l && t.afterRender.push(function() { + return e.loadProgress.raiseEvent( + r, + o + ), !0; + }), e._tilesLoaded = n.numberOfPendingRequests === 0 && n.numberOfTilesProcessing === 0 && n.numberOfAttemptedRequests === 0, l && e._tilesLoaded && (t.afterRender.push(function() { + return e.allTilesLoaded.raiseEvent(), !0; + }), e._initialTilesLoaded || (e._initialTilesLoaded = !0, t.afterRender.push(function() { + return e.initialTilesLoaded.raiseEvent(), !0; + }))); +} +function resetMinimumMaximum(e) { + e._heatmap.resetMinimumMaximum(), e._minimumPriority.depth = Number.MAX_VALUE, e._maximumPriority.depth = -Number.MAX_VALUE, e._minimumPriority.foveatedFactor = Number.MAX_VALUE, e._maximumPriority.foveatedFactor = -Number.MAX_VALUE, e._minimumPriority.distance = Number.MAX_VALUE, e._maximumPriority.distance = -Number.MAX_VALUE, e._minimumPriority.reverseScreenSpaceError = Number.MAX_VALUE, e._maximumPriority.reverseScreenSpaceError = -Number.MAX_VALUE; +} +function detectModelMatrixChanged(e, t) { + t.frameNumber === e._updatedModelMatrixFrame && defined(e._previousModelMatrix) || (e._updatedModelMatrixFrame = t.frameNumber, e._modelMatrixChanged = !Matrix4.equals( + e.modelMatrix, + e._previousModelMatrix + ), e._modelMatrixChanged && (e._previousModelMatrix = Matrix4.clone( + e.modelMatrix, + e._previousModelMatrix + ))); +} +function update$3(e, t, n, i) { + if (t.mode === SceneMode$1.MORPHING || !defined(e._root)) + return !1; + const r = e._statistics; + r.clear(), ++e._updatedVisibilityFrame, resetMinimumMaximum(e), detectModelMatrixChanged(e, t), e._cullRequestsWhileMoving = e.cullRequestsWhileMoving && !e._modelMatrixChanged; + const o = e.getTraversal(i).selectTiles(e, t); + if (i.requestTiles && requestTiles(e), updateTiles(e, t, i), Cesium3DTilesetStatistics.clone(r, n), i.isRender) { + const s = e._credits; + if (defined(s) && r.selected !== 0) + for (let c = 0; c < s.length; ++c) { + const l = s[c]; + t.creditDisplay.addCreditToNextFrame(l); + } + } + return o; +} +function createCredits(e) { + let t = e._credits; + defined(t) || (t = []), t.length = 0, defined(e.resource.credits) && e.resource.credits.forEach((i) => { + t.push(Credit.clone(i)); + }); + const n = e.asset.extras; + if (defined(n) && defined(n.cesium) && defined(n.cesium.credits)) { + const i = n.cesium.credits; + for (let r = 0; r < i.length; ++r) { + const o = i[r]; + t.push(new Credit(o.html)); + } + } + t.forEach( + (i) => i.showOnScreen = i.showOnScreen || e._showCreditsOnScreen + ), e._credits = t; +} +Cesium3DTileset.prototype.getTraversal = function(e) { + const { pass: t } = e; + return t === Cesium3DTilePass$1.MOST_DETAILED_PRELOAD || t === Cesium3DTilePass$1.MOST_DETAILED_PICK ? Cesium3DTilesetMostDetailedTraversal : this.isSkippingLevelOfDetail ? Cesium3DTilesetSkipTraversal : Cesium3DTilesetBaseTraversal; +}; +Cesium3DTileset.prototype.update = function(e) { + this.updateForPass(e, e.tilesetPassState); +}; +Cesium3DTileset.prototype.updateForPass = function(e, t) { + const n = t.pass; + if (n === Cesium3DTilePass$1.PRELOAD && (!this.preloadWhenHidden || this.show) || n === Cesium3DTilePass$1.PRELOAD_FLIGHT && (!this.preloadFlightDestinations || !this.show && !this.preloadWhenHidden) || n === Cesium3DTilePass$1.REQUEST_RENDER_MODE_DEFER_CHECK && (!this._cullRequestsWhileMoving && this.foveatedTimeDelay <= 0 || !this.show)) + return; + const i = e.commandList, r = e.camera, o = e.cullingVolume; + t.ready = !1; + const s = Cesium3DTilePass$1.getPassOptions(n), c = s.ignoreCommands, l = defaultValue( + t.commandList, + i + ), d = l.length; + e.commandList = l, e.camera = defaultValue(t.camera, r), e.cullingVolume = defaultValue( + t.cullingVolume, + o + ); + const f = this._clippingPolygons; + defined(f) && f.enabled && f.queueCommands(e); + const h = this._statisticsPerPass[n]; + (this.show || c) && (this._pass = n, t.ready = update$3( + this, + e, + h, + s + )), c && (l.length = d), e.commandList = i, e.camera = r, e.cullingVolume = o; +}; +Cesium3DTileset.prototype.hasExtension = function(e) { + return defined(this._extensionsUsed) ? this._extensionsUsed.indexOf(e) > -1 : !1; +}; +Cesium3DTileset.prototype.isDestroyed = function() { + return !1; +}; +Cesium3DTileset.prototype.destroy = function() { + if (this._tileDebugLabels = this._tileDebugLabels && this._tileDebugLabels.destroy(), this._clippingPlanes = this._clippingPlanes && this._clippingPlanes.destroy(), this._clippingPolygons = this._clippingPolygons && this._clippingPolygons.destroy(), defined(this._root)) { + const e = scratchStack; + for (e.push(this._root); e.length > 0; ) { + const t = e.pop(); + t.destroy(); + const n = t.children; + for (let i = 0; i < n.length; ++i) + e.push(n[i]); + } + } + return this._root = void 0, this._shouldDestroyImageBasedLighting && !this._imageBasedLighting.isDestroyed() && this._imageBasedLighting.destroy(), this._imageBasedLighting = void 0, destroyObject(this); +}; +Cesium3DTileset.supportedExtensions = { + "3DTILES_metadata": !0, + "3DTILES_implicit_tiling": !0, + "3DTILES_content_gltf": !0, + "3DTILES_multiple_contents": !0, + "3DTILES_bounding_volume_S2": !0, + "3DTILES_batch_table_hierarchy": !0, + "3DTILES_draco_point_compression": !0, + MAXAR_content_geojson: !0 +}; +Cesium3DTileset.checkSupportedExtensions = function(e) { + for (let t = 0; t < e.length; t++) + if (!Cesium3DTileset.supportedExtensions[e[t]]) + throw new RuntimeError( + `Unsupported 3D Tiles Extension: ${e[t]}` + ); +}; +const scratchGetHeightRay$1 = new Ray(), scratchIntersection = new Cartesian3(), scratchGetHeightCartographic$1 = new Cartographic(); +Cesium3DTileset.prototype.getHeight = function(e, t) { + var s; + let n = t.ellipsoid; + defined(n) || (n = Ellipsoid.WGS84); + const i = scratchGetHeightRay$1, r = n.cartographicToCartesian( + e, + i.direction + ); + Cartesian3.normalize(i.direction, i.direction), i.direction = Cartesian3.normalize(r, i.direction), i.direction = Cartesian3.negate(r, i.direction), i.origin = Cartesian3.multiplyByScalar( + i.direction, + -2 * n.maximumRadius, + i.origin + ); + const o = this.pick(i, t.frameState, scratchIntersection); + if (defined(o)) + return (s = n.cartesianToCartographic( + o, + scratchGetHeightCartographic$1 + )) == null ? void 0 : s.height; +}; +Cesium3DTileset.prototype.updateHeight = function(e, t, n) { + n = defaultValue(n, Ellipsoid.WGS84); + const i = { + positionCartographic: e, + ellipsoid: n, + callback: t, + invoked: !1 + }, r = () => { + const o = this._addHeightCallbacks, s = o.length; + for (let c = 0; c < s; ++c) + if (o[c] === i) { + o.splice(c, 1); + break; + } + i.callback && (i.callback = void 0); + }; + return this._addHeightCallbacks.push(i), r; +}; +const scratchSphereIntersection = new Interval(), scratchPickIntersection = new Cartesian3(); +Cesium3DTileset.prototype.pick = function(e, t, n) { + if (!t.context.webgl2 && !this._enablePick) + return; + const i = this._selectedTiles, r = i.length, o = []; + for (let l = 0; l < r; ++l) { + const d = i[l], f = IntersectionTests.raySphere( + e, + d.contentBoundingVolume.boundingSphere, + scratchSphereIntersection + ); + !defined(f) || !defined(d.content) || o.push(d); + } + const s = o.length; + o.sort((l, d) => { + const f = BoundingSphere.distanceSquaredTo( + l.contentBoundingVolume.boundingSphere, + e.origin + ), h = BoundingSphere.distanceSquaredTo( + d.contentBoundingVolume.boundingSphere, + e.origin + ); + return f - h; + }); + let c; + for (let l = 0; l < s; ++l) { + const f = o[l].content.pick( + e, + t, + scratchPickIntersection + ); + if (defined(f)) + return c = Cartesian3.clone(f, n), c; + } +}; +const modelMatrixScratch$1 = new Matrix4(); +function Cesium3DTilesetVisualizer(e, t) { + t.collectionChanged.addEventListener( + Cesium3DTilesetVisualizer.prototype._onCollectionChanged, + this + ), this._scene = e, this._primitives = e.primitives, this._entityCollection = t, this._tilesetHash = {}, this._entitiesToVisualize = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +Cesium3DTilesetVisualizer.prototype.update = function(e) { + const t = this._entitiesToVisualize.values, n = this._tilesetHash, i = this._primitives; + for (let r = 0, o = t.length; r < o; r++) { + const s = t[r], c = s._tileset; + let l; + const d = n[s.id], f = s.isShowing && s.isAvailable(e) && Property.getValueOrDefault(c._show, e, !0); + let h; + f && (h = s.computeModelMatrix(e, modelMatrixScratch$1), l = Resource.createIfNeeded( + Property.getValueOrUndefined(c._uri, e) + )); + const p = defined(d) ? d.tilesetPrimitive : void 0; + if (!f) { + defined(p) && (p.show = !1); + continue; + } + (!defined(d) || l.url !== d.url) && (defined(p) && i.removeAndDestroy(p), delete n[s.id], createTileset(l, n, s, i)), defined(p) && (p.show = !0, defined(h) && (p.modelMatrix = h), p.maximumScreenSpaceError = Property.getValueOrDefault( + c.maximumScreenSpaceError, + e, + p.maximumScreenSpaceError + )); + } + return !0; +}; +Cesium3DTilesetVisualizer.prototype.isDestroyed = function() { + return !1; +}; +Cesium3DTilesetVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + Cesium3DTilesetVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._entitiesToVisualize.values, t = this._tilesetHash, n = this._primitives; + for (let i = e.length - 1; i > -1; i--) + removeTileset(this, e[i], t, n); + return destroyObject(this); +}; +Cesium3DTilesetVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = this._tilesetHash[e.id]; + if (!defined(n) || n.loadFail) + return BoundingSphereState$1.FAILED; + const i = n.tilesetPrimitive; + return defined(i) ? i.show ? (BoundingSphere.clone(i.boundingSphere, t), BoundingSphereState$1.DONE) : BoundingSphereState$1.FAILED : BoundingSphereState$1.PENDING; +}; +Cesium3DTilesetVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o; + const s = this._entitiesToVisualize, c = this._tilesetHash, l = this._primitives; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._tileset) && s.set(o.id, o); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._tileset) ? s.set(o.id, o) : (removeTileset(this, o, c, l), s.remove(o.id)); + for (r = n.length - 1; r > -1; r--) + o = n[r], removeTileset(this, o, c, l), s.remove(o.id); +}; +function removeTileset(e, t, n, i) { + const r = n[t.id]; + defined(r) && (defined(r.tilesetPrimitive) && i.removeAndDestroy(r.tilesetPrimitive), delete n[t.id]); +} +async function createTileset(e, t, n, i) { + t[n.id] = { + url: e.url, + loadFail: !1 + }; + try { + const r = await Cesium3DTileset.fromUrl(e); + if (r.id = n, i.add(r), !defined(t[n.id])) + return; + t[n.id].tilesetPrimitive = r; + } catch (r) { + console.error(r), t[n.id].loadFail = !0; + } +} +const defaultEvenColor$1 = Color.WHITE, defaultOddColor$1 = Color.BLACK, defaultRepeat$1 = new Cartesian2(2, 2); +function CheckerboardMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._evenColor = void 0, this._evenColorSubscription = void 0, this._oddColor = void 0, this._oddColorSubscription = void 0, this._repeat = void 0, this._repeatSubscription = void 0, this.evenColor = e.evenColor, this.oddColor = e.oddColor, this.repeat = e.repeat; +} +Object.defineProperties(CheckerboardMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof CheckerboardMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._evenColor) && // + Property.isConstant(this._oddColor) && // + Property.isConstant(this._repeat); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof CheckerboardMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the first {@link Color}. + * @memberof CheckerboardMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + evenColor: createPropertyDescriptor("evenColor"), + /** + * Gets or sets the Property specifying the second {@link Color}. + * @memberof CheckerboardMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + oddColor: createPropertyDescriptor("oddColor"), + /** + * Gets or sets the {@link Cartesian2} Property specifying how many times the tiles repeat in each direction. + * @memberof CheckerboardMaterialProperty.prototype + * @type {Property|undefined} + * @default new Cartesian2(2.0, 2.0) + */ + repeat: createPropertyDescriptor("repeat") +}); +CheckerboardMaterialProperty.prototype.getType = function(e) { + return "Checkerboard"; +}; +const timeScratch$j = new JulianDate(); +CheckerboardMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$j)), defined(t) || (t = {}), t.lightColor = Property.getValueOrClonedDefault( + this._evenColor, + e, + defaultEvenColor$1, + t.lightColor + ), t.darkColor = Property.getValueOrClonedDefault( + this._oddColor, + e, + defaultOddColor$1, + t.darkColor + ), t.repeat = Property.getValueOrDefault(this._repeat, e, defaultRepeat$1), t; +}; +CheckerboardMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof CheckerboardMaterialProperty && // + Property.equals(this._evenColor, e._evenColor) && // + Property.equals(this._oddColor, e._oddColor) && // + Property.equals(this._repeat, e._repeat); +}; +const entityOptionsScratch$1 = { + id: void 0 +}; +function fireChangedEvent(e) { + if (e._firing) { + e._refire = !0; + return; + } + if (e._suspendCount === 0) { + const t = e._addedEntities, n = e._removedEntities, i = e._changedEntities; + if (i.length !== 0 || t.length !== 0 || n.length !== 0) { + e._firing = !0; + do { + e._refire = !1; + const r = t.values.slice(0), o = n.values.slice(0), s = i.values.slice(0); + t.removeAll(), n.removeAll(), i.removeAll(), e._collectionChanged.raiseEvent( + e, + r, + o, + s + ); + } while (e._refire); + e._firing = !1; + } + } +} +function EntityCollection(e) { + this._owner = e, this._entities = new AssociativeArray(), this._addedEntities = new AssociativeArray(), this._removedEntities = new AssociativeArray(), this._changedEntities = new AssociativeArray(), this._suspendCount = 0, this._collectionChanged = new Event(), this._id = createGuid(), this._show = !0, this._firing = !1, this._refire = !1; +} +EntityCollection.prototype.suspendEvents = function() { + this._suspendCount++; +}; +EntityCollection.prototype.resumeEvents = function() { + this._suspendCount--, fireChangedEvent(this); +}; +Object.defineProperties(EntityCollection.prototype, { + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.CollectionChangedEventCallback}. + * @memberof EntityCollection.prototype + * @readonly + * @type {Event} + */ + collectionChanged: { + get: function() { + return this._collectionChanged; + } + }, + /** + * Gets a globally unique identifier for this collection. + * @memberof EntityCollection.prototype + * @readonly + * @type {string} + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + * @memberof EntityCollection.prototype + * @readonly + * @type {Entity[]} + */ + values: { + get: function() { + return this._entities.values; + } + }, + /** + * Gets whether or not this entity collection should be + * displayed. When true, each entity is only displayed if + * its own show property is also true. + * @memberof EntityCollection.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + if (e === this._show) + return; + this.suspendEvents(); + let t; + const n = [], i = this._entities.values, r = i.length; + for (t = 0; t < r; t++) + n.push(i[t].isShowing); + for (this._show = e, t = 0; t < r; t++) { + const o = n[t], s = i[t]; + o !== s.isShowing && s.definitionChanged.raiseEvent( + s, + "isShowing", + s.isShowing, + o + ); + } + this.resumeEvents(); + } + }, + /** + * Gets the owner of this entity collection, ie. the data source or composite entity collection which created it. + * @memberof EntityCollection.prototype + * @readonly + * @type {DataSource|CompositeEntityCollection} + */ + owner: { + get: function() { + return this._owner; + } + } +}); +EntityCollection.prototype.computeAvailability = function() { + let e = Iso8601.MAXIMUM_VALUE, t = Iso8601.MINIMUM_VALUE; + const n = this._entities.values; + for (let i = 0, r = n.length; i < r; i++) { + const s = n[i].availability; + if (defined(s)) { + const c = s.start, l = s.stop; + JulianDate.lessThan(c, e) && !c.equals(Iso8601.MINIMUM_VALUE) && (e = c), JulianDate.greaterThan(l, t) && !l.equals(Iso8601.MAXIMUM_VALUE) && (t = l); + } + } + return Iso8601.MAXIMUM_VALUE.equals(e) && (e = Iso8601.MINIMUM_VALUE), Iso8601.MINIMUM_VALUE.equals(t) && (t = Iso8601.MAXIMUM_VALUE), new TimeInterval({ + start: e, + stop: t + }); +}; +EntityCollection.prototype.add = function(e) { + e instanceof Entity || (e = new Entity(e)); + const t = e.id, n = this._entities; + if (n.contains(t)) + throw new DeveloperError( + `An entity with id ${t} already exists in this collection.` + ); + return e.entityCollection = this, n.set(t, e), this._removedEntities.remove(t) || this._addedEntities.set(t, e), e.definitionChanged.addEventListener( + EntityCollection.prototype._onEntityDefinitionChanged, + this + ), fireChangedEvent(this), e; +}; +EntityCollection.prototype.remove = function(e) { + return defined(e) ? this.removeById(e.id) : !1; +}; +EntityCollection.prototype.contains = function(e) { + return this._entities.get(e.id) === e; +}; +EntityCollection.prototype.removeById = function(e) { + if (!defined(e)) + return !1; + const n = this._entities.get(e); + return this._entities.remove(e) ? (this._addedEntities.remove(e) || (this._removedEntities.set(e, n), this._changedEntities.remove(e)), this._entities.remove(e), n.definitionChanged.removeEventListener( + EntityCollection.prototype._onEntityDefinitionChanged, + this + ), fireChangedEvent(this), !0) : !1; +}; +EntityCollection.prototype.removeAll = function() { + const e = this._entities, t = e.length, n = e.values, i = this._addedEntities, r = this._removedEntities; + for (let o = 0; o < t; o++) { + const s = n[o], c = s.id, l = i.get(c); + defined(l) || (s.definitionChanged.removeEventListener( + EntityCollection.prototype._onEntityDefinitionChanged, + this + ), r.set(c, s)); + } + e.removeAll(), i.removeAll(), this._changedEntities.removeAll(), fireChangedEvent(this); +}; +EntityCollection.prototype.getById = function(e) { + return this._entities.get(e); +}; +EntityCollection.prototype.getOrCreateEntity = function(e) { + let t = this._entities.get(e); + return defined(t) || (entityOptionsScratch$1.id = e, t = new Entity(entityOptionsScratch$1), this.add(t)), t; +}; +EntityCollection.prototype._onEntityDefinitionChanged = function(e) { + const t = e.id; + this._addedEntities.contains(t) || this._changedEntities.set(t, e), fireChangedEvent(this); +}; +const entityOptionsScratch = { + id: void 0 +}, entityIdScratch = new Array(2); +function clean(e) { + const t = e.propertyNames, n = t.length; + for (let i = 0; i < n; i++) + e[t[i]] = void 0; + e._name = void 0, e._availability = void 0; +} +function subscribeToEntity(e, t, n, i) { + entityIdScratch[0] = n, entityIdScratch[1] = i.id, t[JSON.stringify(entityIdScratch)] = i.definitionChanged.addEventListener( + CompositeEntityCollection.prototype._onDefinitionChanged, + e + ); +} +function unsubscribeFromEntity(e, t, n, i) { + entityIdScratch[0] = n, entityIdScratch[1] = i.id; + const r = JSON.stringify(entityIdScratch); + t[r](), t[r] = void 0; +} +function recomposite(e) { + if (e._shouldRecomposite = !0, e._suspendCount !== 0) + return; + const t = e._collections, n = t.length, i = e._collectionsCopy, r = i.length; + let o, s, c, l, d; + const f = e._composite, h = new EntityCollection(e), p = e._eventHash; + let m; + for (o = 0; o < r; o++) + for (d = i[o], d.collectionChanged.removeEventListener( + CompositeEntityCollection.prototype._onCollectionChanged, + e + ), c = d.values, m = d.id, l = c.length - 1; l > -1; l--) + s = c[l], unsubscribeFromEntity(e, p, m, s); + for (o = n - 1; o >= 0; o--) + for (d = t[o], d.collectionChanged.addEventListener( + CompositeEntityCollection.prototype._onCollectionChanged, + e + ), c = d.values, m = d.id, l = c.length - 1; l > -1; l--) { + s = c[l], subscribeToEntity(e, p, m, s); + let y = h.getById(s.id); + defined(y) || (y = f.getById(s.id), defined(y) ? clean(y) : (entityOptionsScratch.id = s.id, y = new Entity(entityOptionsScratch)), h.add(y)), y.merge(s); + } + e._collectionsCopy = t.slice(0), f.suspendEvents(), f.removeAll(); + const _ = h.values; + for (o = 0; o < _.length; o++) + f.add(_[o]); + f.resumeEvents(); +} +function CompositeEntityCollection(e, t) { + this._owner = t, this._composite = new EntityCollection(this), this._suspendCount = 0, this._collections = defined(e) ? e.slice() : [], this._collectionsCopy = [], this._id = createGuid(), this._eventHash = {}, recomposite(this), this._shouldRecomposite = !1; +} +Object.defineProperties(CompositeEntityCollection.prototype, { + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.collectionChangedEventCallback}. + * @memberof CompositeEntityCollection.prototype + * @readonly + * @type {Event} + */ + collectionChanged: { + get: function() { + return this._composite._collectionChanged; + } + }, + /** + * Gets a globally unique identifier for this collection. + * @memberof CompositeEntityCollection.prototype + * @readonly + * @type {string} + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + * @memberof CompositeEntityCollection.prototype + * @readonly + * @type {Entity[]} + */ + values: { + get: function() { + return this._composite.values; + } + }, + /** + * Gets the owner of this composite entity collection, ie. the data source or composite entity collection which created it. + * @memberof CompositeEntityCollection.prototype + * @readonly + * @type {DataSource|CompositeEntityCollection} + */ + owner: { + get: function() { + return this._owner; + } + } +}); +CompositeEntityCollection.prototype.addCollection = function(e, t) { + defined(t) ? this._collections.splice(t, 0, e) : (t = this._collections.length, this._collections.push(e)), recomposite(this); +}; +CompositeEntityCollection.prototype.removeCollection = function(e) { + const t = this._collections.indexOf(e); + return t !== -1 ? (this._collections.splice(t, 1), recomposite(this), !0) : !1; +}; +CompositeEntityCollection.prototype.removeAllCollections = function() { + this._collections.length = 0, recomposite(this); +}; +CompositeEntityCollection.prototype.containsCollection = function(e) { + return this._collections.indexOf(e) !== -1; +}; +CompositeEntityCollection.prototype.contains = function(e) { + return this._composite.contains(e); +}; +CompositeEntityCollection.prototype.indexOfCollection = function(e) { + return this._collections.indexOf(e); +}; +CompositeEntityCollection.prototype.getCollection = function(e) { + return this._collections[e]; +}; +CompositeEntityCollection.prototype.getCollectionsLength = function() { + return this._collections.length; +}; +function getCollectionIndex(e, t) { + return e.indexOf(t); +} +function swapCollections(e, t, n) { + const i = e._collections; + if (t = CesiumMath.clamp(t, 0, i.length - 1), n = CesiumMath.clamp(n, 0, i.length - 1), t === n) + return; + const r = i[t]; + i[t] = i[n], i[n] = r, recomposite(e); +} +CompositeEntityCollection.prototype.raiseCollection = function(e) { + const t = getCollectionIndex(this._collections, e); + swapCollections(this, t, t + 1); +}; +CompositeEntityCollection.prototype.lowerCollection = function(e) { + const t = getCollectionIndex(this._collections, e); + swapCollections(this, t, t - 1); +}; +CompositeEntityCollection.prototype.raiseCollectionToTop = function(e) { + const t = getCollectionIndex(this._collections, e); + t !== this._collections.length - 1 && (this._collections.splice(t, 1), this._collections.push(e), recomposite(this)); +}; +CompositeEntityCollection.prototype.lowerCollectionToBottom = function(e) { + const t = getCollectionIndex(this._collections, e); + t !== 0 && (this._collections.splice(t, 1), this._collections.splice(0, 0, e), recomposite(this)); +}; +CompositeEntityCollection.prototype.suspendEvents = function() { + this._suspendCount++, this._composite.suspendEvents(); +}; +CompositeEntityCollection.prototype.resumeEvents = function() { + this._suspendCount--, this._shouldRecomposite && this._suspendCount === 0 && (recomposite(this), this._shouldRecomposite = !1), this._composite.resumeEvents(); +}; +CompositeEntityCollection.prototype.computeAvailability = function() { + return this._composite.computeAvailability(); +}; +CompositeEntityCollection.prototype.getById = function(e) { + return this._composite.getById(e); +}; +CompositeEntityCollection.prototype._onCollectionChanged = function(e, t, n) { + const i = this._collectionsCopy, r = i.length, o = this._composite; + o.suspendEvents(); + let s, c, l, d; + const f = n.length, h = this._eventHash, p = e.id; + for (s = 0; s < f; s++) { + const _ = n[s]; + unsubscribeFromEntity(this, h, p, _); + const y = _.id; + for (c = r - 1; c >= 0; c--) + l = i[c].getById(y), defined(l) && (defined(d) || (d = o.getById(y), clean(d)), d.merge(l)); + defined(d) || o.removeById(y), d = void 0; + } + const m = t.length; + for (s = 0; s < m; s++) { + const _ = t[s]; + subscribeToEntity(this, h, p, _); + const y = _.id; + for (c = r - 1; c >= 0; c--) + l = i[c].getById(y), defined(l) && (defined(d) || (d = o.getById(y), defined(d) ? clean(d) : (entityOptionsScratch.id = y, d = new Entity(entityOptionsScratch), o.add(d))), d.merge(l)); + d = void 0; + } + o.resumeEvents(); +}; +CompositeEntityCollection.prototype._onDefinitionChanged = function(e, t, n, i) { + const r = this._collections, o = this._composite, s = r.length, c = e.id, l = o.getById(c); + let d = l[t]; + const f = !defined(d); + let h = !0; + for (let p = s - 1; p >= 0; p--) { + const m = r[p].getById(e.id); + if (defined(m)) { + const _ = m[t]; + if (defined(_)) { + if (h) + if (h = !1, defined(_.merge) && defined(_.clone)) + d = _.clone(d); + else { + d = _; + break; + } + d.merge(_); + } + } + } + f && l.propertyNames.indexOf(t) === -1 && l.addProperty(t), l[t] = d; +}; +function EventHelper() { + this._removalFunctions = []; +} +EventHelper.prototype.add = function(e, t, n) { + const i = e.addEventListener(t, n); + this._removalFunctions.push(i); + const r = this; + return function() { + i(); + const o = r._removalFunctions; + o.splice(o.indexOf(i), 1); + }; +}; +EventHelper.prototype.removeAll = function() { + const e = this._removalFunctions; + for (let t = 0, n = e.length; t < n; ++t) + e[t](); + e.length = 0; +}; +function compareIntervalStartTimes(e, t) { + return JulianDate.compare(e.start, t.start); +} +function TimeIntervalCollection(e) { + if (this._intervals = [], this._changedEvent = new Event(), defined(e)) { + const t = e.length; + for (let n = 0; n < t; n++) + this.addInterval(e[n]); + } +} +Object.defineProperties(TimeIntervalCollection.prototype, { + /** + * Gets an event that is raised whenever the collection of intervals change. + * @memberof TimeIntervalCollection.prototype + * @type {Event} + * @readonly + */ + changedEvent: { + get: function() { + return this._changedEvent; + } + }, + /** + * Gets the start time of the collection. + * @memberof TimeIntervalCollection.prototype + * @type {JulianDate} + * @readonly + */ + start: { + get: function() { + const e = this._intervals; + return e.length === 0 ? void 0 : e[0].start; + } + }, + /** + * Gets whether or not the start time is included in the collection. + * @memberof TimeIntervalCollection.prototype + * @type {boolean} + * @readonly + */ + isStartIncluded: { + get: function() { + const e = this._intervals; + return e.length === 0 ? !1 : e[0].isStartIncluded; + } + }, + /** + * Gets the stop time of the collection. + * @memberof TimeIntervalCollection.prototype + * @type {JulianDate} + * @readonly + */ + stop: { + get: function() { + const e = this._intervals, t = e.length; + return t === 0 ? void 0 : e[t - 1].stop; + } + }, + /** + * Gets whether or not the stop time is included in the collection. + * @memberof TimeIntervalCollection.prototype + * @type {boolean} + * @readonly + */ + isStopIncluded: { + get: function() { + const e = this._intervals, t = e.length; + return t === 0 ? !1 : e[t - 1].isStopIncluded; + } + }, + /** + * Gets the number of intervals in the collection. + * @memberof TimeIntervalCollection.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._intervals.length; + } + }, + /** + * Gets whether or not the collection is empty. + * @memberof TimeIntervalCollection.prototype + * @type {boolean} + * @readonly + */ + isEmpty: { + get: function() { + return this._intervals.length === 0; + } + } +}); +TimeIntervalCollection.prototype.equals = function(e, t) { + if (this === e) + return !0; + if (!(e instanceof TimeIntervalCollection)) + return !1; + const n = this._intervals, i = e._intervals, r = n.length; + if (r !== i.length) + return !1; + for (let o = 0; o < r; o++) + if (!TimeInterval.equals(n[o], i[o], t)) + return !1; + return !0; +}; +TimeIntervalCollection.prototype.get = function(e) { + return this._intervals[e]; +}; +TimeIntervalCollection.prototype.removeAll = function() { + this._intervals.length > 0 && (this._intervals.length = 0, this._changedEvent.raiseEvent(this)); +}; +TimeIntervalCollection.prototype.findIntervalContainingDate = function(e) { + const t = this.indexOf(e); + return t >= 0 ? this._intervals[t] : void 0; +}; +TimeIntervalCollection.prototype.findDataForIntervalContainingDate = function(e) { + const t = this.indexOf(e); + return t >= 0 ? this._intervals[t].data : void 0; +}; +TimeIntervalCollection.prototype.contains = function(e) { + return this.indexOf(e) >= 0; +}; +const indexOfScratch = new TimeInterval(); +TimeIntervalCollection.prototype.indexOf = function(e) { + const t = this._intervals; + indexOfScratch.start = e, indexOfScratch.stop = e; + let n = binarySearch( + t, + indexOfScratch, + compareIntervalStartTimes + ); + return n >= 0 ? t[n].isStartIncluded ? n : n > 0 && t[n - 1].stop.equals(e) && t[n - 1].isStopIncluded ? n - 1 : ~n : (n = ~n, n > 0 && n - 1 < t.length && TimeInterval.contains(t[n - 1], e) ? n - 1 : ~n); +}; +TimeIntervalCollection.prototype.findInterval = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.start, n = e.stop, i = e.isStartIncluded, r = e.isStopIncluded, o = this._intervals; + for (let s = 0, c = o.length; s < c; s++) { + const l = o[s]; + if ((!defined(t) || l.start.equals(t)) && (!defined(n) || l.stop.equals(n)) && (!defined(i) || l.isStartIncluded === i) && (!defined(r) || l.isStopIncluded === r)) + return o[s]; + } +}; +TimeIntervalCollection.prototype.addInterval = function(e, t) { + if (e.isEmpty) + return; + const n = this._intervals; + if (n.length === 0 || JulianDate.greaterThan(e.start, n[n.length - 1].stop)) { + n.push(e), this._changedEvent.raiseEvent(this); + return; + } + let i = binarySearch(n, e, compareIntervalStartTimes); + i < 0 ? i = ~i : i > 0 && e.isStartIncluded && n[i - 1].isStartIncluded && n[i - 1].start.equals(e.start) ? --i : i < n.length && !e.isStartIncluded && n[i].isStartIncluded && n[i].start.equals(e.start) && ++i; + let r; + for (i > 0 && (r = JulianDate.compare(n[i - 1].stop, e.start), (r > 0 || r === 0 && (n[i - 1].isStopIncluded || e.isStartIncluded)) && ((defined(t) ? t(n[i - 1].data, e.data) : n[i - 1].data === e.data) ? (JulianDate.greaterThan(e.stop, n[i - 1].stop) ? e = new TimeInterval({ + start: n[i - 1].start, + stop: e.stop, + isStartIncluded: n[i - 1].isStartIncluded, + isStopIncluded: e.isStopIncluded, + data: e.data + }) : e = new TimeInterval({ + start: n[i - 1].start, + stop: n[i - 1].stop, + isStartIncluded: n[i - 1].isStartIncluded, + isStopIncluded: n[i - 1].isStopIncluded || e.stop.equals(n[i - 1].stop) && e.isStopIncluded, + data: e.data + }), n.splice(i - 1, 1), --i) : (r = JulianDate.compare( + n[i - 1].stop, + e.stop + ), (r > 0 || r === 0 && n[i - 1].isStopIncluded && !e.isStopIncluded) && n.splice( + i, + 0, + new TimeInterval({ + start: e.stop, + stop: n[i - 1].stop, + isStartIncluded: !e.isStopIncluded, + isStopIncluded: n[i - 1].isStopIncluded, + data: n[i - 1].data + }) + ), n[i - 1] = new TimeInterval({ + start: n[i - 1].start, + stop: e.start, + isStartIncluded: n[i - 1].isStartIncluded, + isStopIncluded: !e.isStartIncluded, + data: n[i - 1].data + })))); i < n.length && (r = JulianDate.compare(e.stop, n[i].start), r > 0 || r === 0 && (e.isStopIncluded || n[i].isStartIncluded)); ) + if (defined(t) ? t(n[i].data, e.data) : n[i].data === e.data) + e = new TimeInterval({ + start: e.start, + stop: JulianDate.greaterThan(n[i].stop, e.stop) ? n[i].stop : e.stop, + isStartIncluded: e.isStartIncluded, + isStopIncluded: JulianDate.greaterThan( + n[i].stop, + e.stop + ) ? n[i].isStopIncluded : e.isStopIncluded, + data: e.data + }), n.splice(i, 1); + else if (n[i] = new TimeInterval({ + start: e.stop, + stop: n[i].stop, + isStartIncluded: !e.isStopIncluded, + isStopIncluded: n[i].isStopIncluded, + data: n[i].data + }), n[i].isEmpty) + n.splice(i, 1); + else + break; + n.splice(i, 0, e), this._changedEvent.raiseEvent(this); +}; +TimeIntervalCollection.prototype.removeInterval = function(e) { + if (e.isEmpty) + return !1; + const t = this._intervals; + let n = binarySearch(t, e, compareIntervalStartTimes); + n < 0 && (n = ~n); + let i = !1; + for (n > 0 && (JulianDate.greaterThan(t[n - 1].stop, e.start) || t[n - 1].stop.equals(e.start) && t[n - 1].isStopIncluded && e.isStartIncluded) && (i = !0, (JulianDate.greaterThan(t[n - 1].stop, e.stop) || t[n - 1].isStopIncluded && !e.isStopIncluded && t[n - 1].stop.equals(e.stop)) && t.splice( + n, + 0, + new TimeInterval({ + start: e.stop, + stop: t[n - 1].stop, + isStartIncluded: !e.isStopIncluded, + isStopIncluded: t[n - 1].isStopIncluded, + data: t[n - 1].data + }) + ), t[n - 1] = new TimeInterval({ + start: t[n - 1].start, + stop: e.start, + isStartIncluded: t[n - 1].isStartIncluded, + isStopIncluded: !e.isStartIncluded, + data: t[n - 1].data + })), n < t.length && !e.isStartIncluded && t[n].isStartIncluded && e.start.equals(t[n].start) && (i = !0, t.splice( + n, + 0, + new TimeInterval({ + start: t[n].start, + stop: t[n].start, + isStartIncluded: !0, + isStopIncluded: !0, + data: t[n].data + }) + ), ++n); n < t.length && JulianDate.greaterThan(e.stop, t[n].stop); ) + i = !0, t.splice(n, 1); + return n < t.length && e.stop.equals(t[n].stop) && (i = !0, !e.isStopIncluded && t[n].isStopIncluded ? n + 1 < t.length && t[n + 1].start.equals(e.stop) && t[n].data === t[n + 1].data ? (t.splice(n, 1), t[n] = new TimeInterval({ + start: t[n].start, + stop: t[n].stop, + isStartIncluded: !0, + isStopIncluded: t[n].isStopIncluded, + data: t[n].data + })) : t[n] = new TimeInterval({ + start: e.stop, + stop: e.stop, + isStartIncluded: !0, + isStopIncluded: !0, + data: t[n].data + }) : t.splice(n, 1)), n < t.length && (JulianDate.greaterThan(e.stop, t[n].start) || e.stop.equals(t[n].start) && e.isStopIncluded && t[n].isStartIncluded) && (i = !0, t[n] = new TimeInterval({ + start: e.stop, + stop: t[n].stop, + isStartIncluded: !e.isStopIncluded, + isStopIncluded: t[n].isStopIncluded, + data: t[n].data + })), i && this._changedEvent.raiseEvent(this), i; +}; +TimeIntervalCollection.prototype.intersect = function(e, t, n) { + const i = new TimeIntervalCollection(); + let r = 0, o = 0; + const s = this._intervals, c = e._intervals; + for (; r < s.length && o < c.length; ) { + const l = s[r], d = c[o]; + if (JulianDate.lessThan(l.stop, d.start)) + ++r; + else if (JulianDate.lessThan(d.stop, l.start)) + ++o; + else { + if (defined(n) || defined(t) && t(l.data, d.data) || !defined(t) && d.data === l.data) { + const f = TimeInterval.intersect( + l, + d, + new TimeInterval(), + n + ); + f.isEmpty || i.addInterval(f, t); + } + JulianDate.lessThan(l.stop, d.stop) || l.stop.equals(d.stop) && !l.isStopIncluded && d.isStopIncluded ? ++r : ++o; + } + } + return i; +}; +TimeIntervalCollection.fromJulianDateArray = function(e, t) { + defined(t) || (t = new TimeIntervalCollection()); + const n = e.julianDates, i = n.length, r = e.dataCallback, o = defaultValue(e.isStartIncluded, !0), s = defaultValue(e.isStopIncluded, !0), c = defaultValue(e.leadingInterval, !1), l = defaultValue(e.trailingInterval, !1); + let d, f = 0; + c && (++f, d = new TimeInterval({ + start: Iso8601.MINIMUM_VALUE, + stop: n[0], + isStartIncluded: !0, + isStopIncluded: !o + }), d.data = defined(r) ? r(d, t.length) : t.length, t.addInterval(d)); + for (let h = 0; h < i - 1; ++h) { + let p = n[h]; + const m = n[h + 1]; + d = new TimeInterval({ + start: p, + stop: m, + isStartIncluded: t.length === f ? o : !0, + isStopIncluded: h === i - 2 ? s : !1 + }), d.data = defined(r) ? r(d, t.length) : t.length, t.addInterval(d), p = m; + } + return l && (d = new TimeInterval({ + start: n[i - 1], + stop: Iso8601.MAXIMUM_VALUE, + isStartIncluded: !s, + isStopIncluded: !0 + }), d.data = defined(r) ? r(d, t.length) : t.length, t.addInterval(d)), t; +}; +const scratchGregorianDate = new GregorianDate(), monthLengths = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +function addToDate(e, t, n) { + defined(n) || (n = new JulianDate()), JulianDate.toGregorianDate(e, scratchGregorianDate); + let i = scratchGregorianDate.millisecond + t.millisecond, r = scratchGregorianDate.second + t.second, o = scratchGregorianDate.minute + t.minute, s = scratchGregorianDate.hour + t.hour, c = scratchGregorianDate.day + t.day, l = scratchGregorianDate.month + t.month, d = scratchGregorianDate.year + t.year; + for (i >= 1e3 && (r += Math.floor(i / 1e3), i = i % 1e3), r >= 60 && (o += Math.floor(r / 60), r = r % 60), o >= 60 && (s += Math.floor(o / 60), o = o % 60), s >= 24 && (c += Math.floor(s / 24), s = s % 24), monthLengths[2] = isLeapYear(d) ? 29 : 28; c > monthLengths[l] || l >= 13; ) + c > monthLengths[l] && (c -= monthLengths[l], ++l), l >= 13 && (--l, d += Math.floor(l / 12), l = l % 12, ++l), monthLengths[2] = isLeapYear(d) ? 29 : 28; + return scratchGregorianDate.millisecond = i, scratchGregorianDate.second = r, scratchGregorianDate.minute = o, scratchGregorianDate.hour = s, scratchGregorianDate.day = c, scratchGregorianDate.month = l, scratchGregorianDate.year = d, JulianDate.fromGregorianDate(scratchGregorianDate, n); +} +const scratchJulianDate$1 = new JulianDate(), durationRegex = /P(?:([\d.,]+)Y)?(?:([\d.,]+)M)?(?:([\d.,]+)W)?(?:([\d.,]+)D)?(?:T(?:([\d.,]+)H)?(?:([\d.,]+)M)?(?:([\d.,]+)S)?)?/; +function parseDuration(e, t) { + if (!defined(e) || e.length === 0) + return !1; + if (t.year = 0, t.month = 0, t.day = 0, t.hour = 0, t.minute = 0, t.second = 0, t.millisecond = 0, e[0] === "P") { + const n = e.match(durationRegex); + if (!defined(n)) + return !1; + if (defined(n[1]) && (t.year = Number(n[1].replace(",", "."))), defined(n[2]) && (t.month = Number(n[2].replace(",", "."))), defined(n[3]) && (t.day = Number(n[3].replace(",", ".")) * 7), defined(n[4]) && (t.day += Number(n[4].replace(",", "."))), defined(n[5]) && (t.hour = Number(n[5].replace(",", "."))), defined(n[6]) && (t.minute = Number(n[6].replace(",", "."))), defined(n[7])) { + const i = Number(n[7].replace(",", ".")); + t.second = Math.floor(i), t.millisecond = i % 1 * 1e3; + } + } else + e[e.length - 1] !== "Z" && (e += "Z"), JulianDate.toGregorianDate( + JulianDate.fromIso8601(e, scratchJulianDate$1), + t + ); + return t.year || t.month || t.day || t.hour || t.minute || t.second || t.millisecond; +} +const scratchDuration = new GregorianDate(); +TimeIntervalCollection.fromIso8601 = function(e, t) { + const n = e.iso8601.split("/"), i = JulianDate.fromIso8601(n[0]), r = JulianDate.fromIso8601(n[1]), o = []; + if (!parseDuration(n[2], scratchDuration)) + o.push(i, r); + else { + let s = JulianDate.clone(i); + for (o.push(s); JulianDate.compare(s, r) < 0; ) + s = addToDate(s, scratchDuration), JulianDate.compare(r, s) <= 0 && JulianDate.clone(r, s), o.push(s); + } + return TimeIntervalCollection.fromJulianDateArray( + { + julianDates: o, + isStartIncluded: e.isStartIncluded, + isStopIncluded: e.isStopIncluded, + leadingInterval: e.leadingInterval, + trailingInterval: e.trailingInterval, + dataCallback: e.dataCallback + }, + t + ); +}; +TimeIntervalCollection.fromIso8601DateArray = function(e, t) { + return TimeIntervalCollection.fromJulianDateArray( + { + julianDates: e.iso8601Dates.map(function(n) { + return JulianDate.fromIso8601(n); + }), + isStartIncluded: e.isStartIncluded, + isStopIncluded: e.isStopIncluded, + leadingInterval: e.leadingInterval, + trailingInterval: e.trailingInterval, + dataCallback: e.dataCallback + }, + t + ); +}; +TimeIntervalCollection.fromIso8601DurationArray = function(e, t) { + const n = e.epoch, i = e.iso8601Durations, r = defaultValue(e.relativeToPrevious, !1), o = []; + let s, c; + const l = i.length; + for (let d = 0; d < l; ++d) + (parseDuration(i[d], scratchDuration) || d === 0) && (r && defined(c) ? s = addToDate(c, scratchDuration) : s = addToDate(n, scratchDuration), o.push(s), c = s); + return TimeIntervalCollection.fromJulianDateArray( + { + julianDates: o, + isStartIncluded: e.isStartIncluded, + isStopIncluded: e.isStopIncluded, + leadingInterval: e.leadingInterval, + trailingInterval: e.trailingInterval, + dataCallback: e.dataCallback + }, + t + ); +}; +function subscribeAll(e, t, n, i) { + function r() { + n.raiseEvent(e); + } + const o = []; + t.removeAll(); + const s = i.length; + for (let c = 0; c < s; c++) { + const l = i.get(c); + defined(l.data) && o.indexOf(l.data) === -1 && t.add(l.data.definitionChanged, r); + } +} +function CompositeProperty() { + this._eventHelper = new EventHelper(), this._definitionChanged = new Event(), this._intervals = new TimeIntervalCollection(), this._intervals.changedEvent.addEventListener( + CompositeProperty.prototype._intervalsChanged, + this + ); +} +Object.defineProperties(CompositeProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof CompositeProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._intervals.isEmpty; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + * @memberof CompositeProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the interval collection. + * @memberof CompositeProperty.prototype + * + * @type {TimeIntervalCollection} + */ + intervals: { + get: function() { + return this._intervals; + } + } +}); +const timeScratch$i = new JulianDate(); +CompositeProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$i)); + const n = this._intervals.findDataForIntervalContainingDate(e); + if (defined(n)) + return n.getValue(e, t); +}; +CompositeProperty.prototype.equals = function(e) { + return this === e || // + e instanceof CompositeProperty && // + this._intervals.equals(e._intervals, Property.equals); +}; +CompositeProperty.prototype._intervalsChanged = function() { + subscribeAll( + this, + this._eventHelper, + this._definitionChanged, + this._intervals + ), this._definitionChanged.raiseEvent(this); +}; +function CompositeMaterialProperty() { + this._definitionChanged = new Event(), this._composite = new CompositeProperty(), this._composite.definitionChanged.addEventListener( + CompositeMaterialProperty.prototype._raiseDefinitionChanged, + this + ); +} +Object.defineProperties(CompositeMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof CompositeMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._composite.isConstant; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + * @memberof CompositeMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the interval collection. + * @memberof CompositeMaterialProperty.prototype + * + * @type {TimeIntervalCollection} + */ + intervals: { + get: function() { + return this._composite._intervals; + } + } +}); +CompositeMaterialProperty.prototype.getType = function(e) { + const t = this._composite._intervals.findDataForIntervalContainingDate( + e + ); + if (defined(t)) + return t.getType(e); +}; +const timeScratch$h = new JulianDate(); +CompositeMaterialProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$h)); + const n = this._composite._intervals.findDataForIntervalContainingDate( + e + ); + if (defined(n)) + return n.getValue(e, t); +}; +CompositeMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof CompositeMaterialProperty && // + this._composite.equals(e._composite, Property.equals); +}; +CompositeMaterialProperty.prototype._raiseDefinitionChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +function CompositePositionProperty(e) { + this._referenceFrame = defaultValue(e, ReferenceFrame$1.FIXED), this._definitionChanged = new Event(), this._composite = new CompositeProperty(), this._composite.definitionChanged.addEventListener( + CompositePositionProperty.prototype._raiseDefinitionChanged, + this + ); +} +Object.defineProperties(CompositePositionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof CompositePositionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._composite.isConstant; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + * @memberof CompositePositionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the interval collection. + * @memberof CompositePositionProperty.prototype + * + * @type {TimeIntervalCollection} + */ + intervals: { + get: function() { + return this._composite.intervals; + } + }, + /** + * Gets or sets the reference frame which this position presents itself as. + * Each PositionProperty making up this object has it's own reference frame, + * so this property merely exposes a "preferred" reference frame for clients + * to use. + * @memberof CompositePositionProperty.prototype + * + * @type {ReferenceFrame} + */ + referenceFrame: { + get: function() { + return this._referenceFrame; + }, + set: function(e) { + this._referenceFrame = e; + } + } +}); +const timeScratch$g = new JulianDate(); +CompositePositionProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$g)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +CompositePositionProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + const i = this._composite._intervals.findDataForIntervalContainingDate( + e + ); + if (defined(i)) + return i.getValueInReferenceFrame(e, t, n); +}; +CompositePositionProperty.prototype.equals = function(e) { + return this === e || // + e instanceof CompositePositionProperty && // + this._referenceFrame === e._referenceFrame && // + this._composite.equals(e._composite, Property.equals); +}; +CompositePositionProperty.prototype._raiseDefinitionChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +const CornerType = { + /** + * + * + * Corner has a smooth edge. + * @type {number} + * @constant + */ + ROUNDED: 0, + /** + * + * + * Corner point is the intersection of adjacent edges. + * @type {number} + * @constant + */ + MITERED: 1, + /** + * + * + * Corner is clipped. + * @type {number} + * @constant + */ + BEVELED: 2 +}, CornerType$1 = Object.freeze(CornerType), scratch2Array = [new Cartesian3(), new Cartesian3()], scratchCartesian1$6 = new Cartesian3(), scratchCartesian2$8 = new Cartesian3(), scratchCartesian3$8 = new Cartesian3(), scratchCartesian4$4 = new Cartesian3(), scratchCartesian5$1 = new Cartesian3(), scratchCartesian6 = new Cartesian3(), scratchCartesian7 = new Cartesian3(), scratchCartesian8 = new Cartesian3(), scratchCartesian9 = new Cartesian3(), scratch1$2 = new Cartesian3(), scratch2$2 = new Cartesian3(), PolylineVolumeGeometryLibrary = {}; +let cartographic = new Cartographic(); +function scaleToSurface$2(e, t) { + const n = new Array(e.length); + for (let i = 0; i < e.length; i++) { + const r = e[i]; + cartographic = t.cartesianToCartographic(r, cartographic), n[i] = cartographic.height, e[i] = t.scaleToGeodeticSurface(r, r); + } + return n; +} +function subdivideHeights(e, t, n, i) { + const r = e[0], o = e[1], s = Cartesian3.angleBetween(r, o), c = Math.ceil(s / i), l = new Array(c); + let d; + if (t === n) { + for (d = 0; d < c; d++) + l[d] = t; + return l.push(n), l; + } + const h = (n - t) / c; + for (d = 1; d < c; d++) { + const p = t + d * h; + l[d] = p; + } + return l[0] = t, l.push(n), l; +} +const nextScratch = new Cartesian3(), prevScratch = new Cartesian3(); +function computeRotationAngle(e, t, n, i) { + const r = new EllipsoidTangentPlane(n, i), o = r.projectPointOntoPlane( + Cartesian3.add(n, e, nextScratch), + nextScratch + ), s = r.projectPointOntoPlane( + Cartesian3.add(n, t, prevScratch), + prevScratch + ), c = Cartesian2.angleBetween(o, s); + return s.x * o.y - s.y * o.x >= 0 ? -c : c; +} +const negativeX = new Cartesian3(-1, 0, 0); +let transform$2 = new Matrix4(); +const translation = new Matrix4(); +let rotationZ = new Matrix3(); +const scaleMatrix = Matrix3.IDENTITY.clone(), westScratch$1 = new Cartesian3(), finalPosScratch = new Cartesian4(), heightCartesian = new Cartesian3(); +function addPosition(e, t, n, i, r, o, s, c) { + let l = westScratch$1, d = finalPosScratch; + transform$2 = Transforms.eastNorthUpToFixedFrame(e, r, transform$2), l = Matrix4.multiplyByPointAsVector(transform$2, negativeX, l), l = Cartesian3.normalize(l, l); + const f = computeRotationAngle(l, t, e, r); + rotationZ = Matrix3.fromRotationZ(f, rotationZ), heightCartesian.z = o, transform$2 = Matrix4.multiplyTransformation( + transform$2, + Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), + transform$2 + ); + const h = scaleMatrix; + h[0] = s; + for (let p = 0; p < c; p++) + for (let m = 0; m < n.length; m += 3) + d = Cartesian3.fromArray(n, m, d), d = Matrix3.multiplyByVector( + h, + d, + d + ), d = Matrix4.multiplyByPoint( + transform$2, + d, + d + ), i.push(d.x, d.y, d.z); + return i; +} +const centerScratch$4 = new Cartesian3(); +function addPositions(e, t, n, i, r, o, s) { + for (let c = 0; c < e.length; c += 3) { + const l = Cartesian3.fromArray(e, c, centerScratch$4); + i = addPosition( + l, + t, + n, + i, + r, + o[c / 3], + s, + 1 + ); + } + return i; +} +function convertShapeTo3DDuplicate(e, t) { + const n = e.length, i = new Array(n * 6); + let r = 0; + const o = t.x + t.width / 2, s = t.y + t.height / 2; + let c = e[0]; + i[r++] = c.x - o, i[r++] = 0, i[r++] = c.y - s; + for (let l = 1; l < n; l++) { + c = e[l]; + const d = c.x - o, f = c.y - s; + i[r++] = d, i[r++] = 0, i[r++] = f, i[r++] = d, i[r++] = 0, i[r++] = f; + } + return c = e[0], i[r++] = c.x - o, i[r++] = 0, i[r++] = c.y - s, i; +} +function convertShapeTo3D(e, t) { + const n = e.length, i = new Array(n * 3); + let r = 0; + const o = t.x + t.width / 2, s = t.y + t.height / 2; + for (let c = 0; c < n; c++) + i[r++] = e[c].x - o, i[r++] = 0, i[r++] = e[c].y - s; + return i; +} +const quaterion$1 = new Quaternion(), startPointScratch = new Cartesian3(), rotMatrix$1 = new Matrix3(); +function computeRoundCorner$1(e, t, n, i, r, o, s, c, l, d) { + const f = Cartesian3.angleBetween( + Cartesian3.subtract(t, e, scratch1$2), + Cartesian3.subtract(n, e, scratch2$2) + ), h = i === CornerType$1.BEVELED ? 0 : Math.ceil(f / CesiumMath.toRadians(5)); + let p; + r ? p = Matrix3.fromQuaternion( + Quaternion.fromAxisAngle( + Cartesian3.negate(e, scratch1$2), + f / (h + 1), + quaterion$1 + ), + rotMatrix$1 + ) : p = Matrix3.fromQuaternion( + Quaternion.fromAxisAngle(e, f / (h + 1), quaterion$1), + rotMatrix$1 + ); + let m, _; + if (t = Cartesian3.clone(t, startPointScratch), h > 0) { + const y = d ? 2 : 1; + for (let C = 0; C < h; C++) + t = Matrix3.multiplyByVector(p, t, t), m = Cartesian3.subtract(t, e, scratch1$2), m = Cartesian3.normalize(m, m), r || (m = Cartesian3.negate(m, m)), _ = o.scaleToGeodeticSurface(t, scratch2$2), s = addPosition( + _, + m, + c, + s, + o, + l, + 1, + y + ); + } else + m = Cartesian3.subtract(t, e, scratch1$2), m = Cartesian3.normalize(m, m), r || (m = Cartesian3.negate(m, m)), _ = o.scaleToGeodeticSurface(t, scratch2$2), s = addPosition( + _, + m, + c, + s, + o, + l, + 1, + 1 + ), n = Cartesian3.clone(n, startPointScratch), m = Cartesian3.subtract(n, e, scratch1$2), m = Cartesian3.normalize(m, m), r || (m = Cartesian3.negate(m, m)), _ = o.scaleToGeodeticSurface(n, scratch2$2), s = addPosition( + _, + m, + c, + s, + o, + l, + 1, + 1 + ); + return s; +} +PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(e) { + const t = e.length, n = []; + for (let i = t - 1, r = 0; r < t; i = r++) { + const o = e[i], s = e[r]; + Cartesian2.equals(o, s) || n.push(s); + } + return n; +}; +PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(e, t, n, i) { + const r = new EllipsoidTangentPlane(n, i), o = r.projectPointOntoPlane( + Cartesian3.add(n, e, nextScratch), + nextScratch + ), s = r.projectPointOntoPlane( + Cartesian3.add(n, t, prevScratch), + prevScratch + ); + return s.x * o.y - s.y * o.x >= 0; +}; +const scratchForwardProjection$1 = new Cartesian3(), scratchBackwardProjection$1 = new Cartesian3(); +PolylineVolumeGeometryLibrary.computePositions = function(e, t, n, i, r) { + const o = i._ellipsoid, s = scaleToSurface$2(e, o), c = i._granularity, l = i._cornerType, d = r ? convertShapeTo3DDuplicate(t, n) : convertShapeTo3D(t, n), f = r ? convertShapeTo3D(t, n) : void 0, h = n.height / 2, p = n.width / 2; + let m = e.length, _ = [], y = r ? [] : void 0, C = scratchCartesian1$6, T = scratchCartesian2$8, x = scratchCartesian3$8, b = scratchCartesian4$4, S = scratchCartesian5$1, E = scratchCartesian6, A = scratchCartesian7, D = scratchCartesian8, P = scratchCartesian9, I = e[0], M = e[1]; + b = o.geodeticSurfaceNormal(I, b), C = Cartesian3.subtract(M, I, C), C = Cartesian3.normalize(C, C), D = Cartesian3.cross(b, C, D), D = Cartesian3.normalize(D, D); + let R = s[0], L = s[1]; + r && (y = addPosition( + I, + D, + f, + y, + o, + R + h, + 1, + 1 + )), P = Cartesian3.clone(I, P), I = M, T = Cartesian3.negate(C, T); + let g, w; + for (let F = 1; F < m - 1; F++) { + const B = r ? 2 : 1; + if (M = e[F + 1], I.equals(M)) { + oneTimeWarning( + "Positions are too close and are considered equivalent with rounding error." + ); + continue; + } + C = Cartesian3.subtract(M, I, C), C = Cartesian3.normalize(C, C), x = Cartesian3.add(C, T, x), x = Cartesian3.normalize(x, x), b = o.geodeticSurfaceNormal(I, b); + const V = Cartesian3.multiplyByScalar( + b, + Cartesian3.dot(C, b), + scratchForwardProjection$1 + ); + Cartesian3.subtract(C, V, V), Cartesian3.normalize(V, V); + const U = Cartesian3.multiplyByScalar( + b, + Cartesian3.dot(T, b), + scratchBackwardProjection$1 + ); + if (Cartesian3.subtract(T, U, U), Cartesian3.normalize(U, U), !CesiumMath.equalsEpsilon( + Math.abs(Cartesian3.dot(V, U)), + 1, + CesiumMath.EPSILON7 + )) { + x = Cartesian3.cross( + x, + b, + x + ), x = Cartesian3.cross( + b, + x, + x + ), x = Cartesian3.normalize(x, x); + const $ = 1 / Math.max( + 0.25, + Cartesian3.magnitude( + Cartesian3.cross(x, T, scratch1$2) + ) + ), G = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi( + C, + T, + I, + o + ); + G ? (S = Cartesian3.add( + I, + Cartesian3.multiplyByScalar( + x, + $ * p, + x + ), + S + ), E = Cartesian3.add( + S, + Cartesian3.multiplyByScalar(D, p, E), + E + ), scratch2Array[0] = Cartesian3.clone(P, scratch2Array[0]), scratch2Array[1] = Cartesian3.clone(E, scratch2Array[1]), g = subdivideHeights( + scratch2Array, + R + h, + L + h, + c + ), w = PolylinePipeline.generateArc({ + positions: scratch2Array, + granularity: c, + ellipsoid: o + }), _ = addPositions( + w, + D, + d, + _, + o, + g, + 1 + ), D = Cartesian3.cross(b, C, D), D = Cartesian3.normalize(D, D), A = Cartesian3.add( + S, + Cartesian3.multiplyByScalar(D, p, A), + A + ), l === CornerType$1.ROUNDED || l === CornerType$1.BEVELED ? computeRoundCorner$1( + S, + E, + A, + l, + G, + o, + _, + d, + L + h, + r + ) : (x = Cartesian3.negate(x, x), _ = addPosition( + I, + x, + d, + _, + o, + L + h, + $, + B + )), P = Cartesian3.clone(A, P)) : (S = Cartesian3.add( + I, + Cartesian3.multiplyByScalar( + x, + $ * p, + x + ), + S + ), E = Cartesian3.add( + S, + Cartesian3.multiplyByScalar(D, -p, E), + E + ), scratch2Array[0] = Cartesian3.clone(P, scratch2Array[0]), scratch2Array[1] = Cartesian3.clone(E, scratch2Array[1]), g = subdivideHeights( + scratch2Array, + R + h, + L + h, + c + ), w = PolylinePipeline.generateArc({ + positions: scratch2Array, + granularity: c, + ellipsoid: o + }), _ = addPositions( + w, + D, + d, + _, + o, + g, + 1 + ), D = Cartesian3.cross(b, C, D), D = Cartesian3.normalize(D, D), A = Cartesian3.add( + S, + Cartesian3.multiplyByScalar(D, -p, A), + A + ), l === CornerType$1.ROUNDED || l === CornerType$1.BEVELED ? computeRoundCorner$1( + S, + E, + A, + l, + G, + o, + _, + d, + L + h, + r + ) : _ = addPosition( + I, + x, + d, + _, + o, + L + h, + $, + B + ), P = Cartesian3.clone(A, P)), T = Cartesian3.negate(C, T); + } else + _ = addPosition( + P, + D, + d, + _, + o, + R + h, + 1, + 1 + ), P = I; + R = L, L = s[F + 1], I = M; + } + scratch2Array[0] = Cartesian3.clone(P, scratch2Array[0]), scratch2Array[1] = Cartesian3.clone(I, scratch2Array[1]), g = subdivideHeights( + scratch2Array, + R + h, + L + h, + c + ), w = PolylinePipeline.generateArc({ + positions: scratch2Array, + granularity: c, + ellipsoid: o + }), _ = addPositions( + w, + D, + d, + _, + o, + g, + 1 + ), r && (y = addPosition( + I, + D, + f, + y, + o, + L + h, + 1, + 1 + )), m = _.length; + const O = r ? m + y.length : m, N = new Float64Array(O); + return N.set(_), r && N.set(y, m), N; +}; +const CorridorGeometryLibrary = {}, scratch1$1 = new Cartesian3(), scratch2$1 = new Cartesian3(), scratch3 = new Cartesian3(), scratch4 = new Cartesian3(), scaleArray2 = [new Cartesian3(), new Cartesian3()], cartesian1$2 = new Cartesian3(), cartesian2$2 = new Cartesian3(), cartesian3$2 = new Cartesian3(), cartesian4$1 = new Cartesian3(), cartesian5$1 = new Cartesian3(), cartesian6$1 = new Cartesian3(), cartesian7 = new Cartesian3(), cartesian8 = new Cartesian3(), cartesian9 = new Cartesian3(), cartesian10 = new Cartesian3(), quaterion = new Quaternion(), rotMatrix = new Matrix3(); +function computeRoundCorner(e, t, n, i, r) { + const o = Cartesian3.angleBetween( + Cartesian3.subtract(t, e, scratch1$1), + Cartesian3.subtract(n, e, scratch2$1) + ), s = i === CornerType$1.BEVELED ? 1 : Math.ceil(o / CesiumMath.toRadians(5)) + 1, c = s * 3, l = new Array(c); + l[c - 3] = n.x, l[c - 2] = n.y, l[c - 1] = n.z; + let d; + r ? d = Matrix3.fromQuaternion( + Quaternion.fromAxisAngle( + Cartesian3.negate(e, scratch1$1), + o / s, + quaterion + ), + rotMatrix + ) : d = Matrix3.fromQuaternion( + Quaternion.fromAxisAngle(e, o / s, quaterion), + rotMatrix + ); + let f = 0; + t = Cartesian3.clone(t, scratch1$1); + for (let h = 0; h < s; h++) + t = Matrix3.multiplyByVector(d, t, t), l[f++] = t.x, l[f++] = t.y, l[f++] = t.z; + return l; +} +function addEndCaps(e) { + let t = cartesian1$2, n = cartesian2$2, i = cartesian3$2, r = e[1]; + n = Cartesian3.fromArray( + e[1], + r.length - 3, + n + ), i = Cartesian3.fromArray(e[0], 0, i), t = Cartesian3.midpoint(n, i, t); + const o = computeRoundCorner( + t, + n, + i, + CornerType$1.ROUNDED, + !1 + ), s = e.length - 1, c = e[s - 1]; + r = e[s], n = Cartesian3.fromArray( + c, + c.length - 3, + n + ), i = Cartesian3.fromArray(r, 0, i), t = Cartesian3.midpoint(n, i, t); + const l = computeRoundCorner( + t, + n, + i, + CornerType$1.ROUNDED, + !1 + ); + return [o, l]; +} +function computeMiteredCorner(e, t, n, i) { + let r = scratch1$1; + return i || (t = Cartesian3.negate( + t, + t + )), r = Cartesian3.add(e, t, r), [ + r.x, + r.y, + r.z, + n.x, + n.y, + n.z + ]; +} +function addShiftedPositions(e, t, n, i) { + const r = new Array(e.length), o = new Array(e.length), s = Cartesian3.multiplyByScalar(t, n, scratch1$1), c = Cartesian3.negate(s, scratch2$1); + let l = 0, d = e.length - 1; + for (let f = 0; f < e.length; f += 3) { + const h = Cartesian3.fromArray(e, f, scratch3), p = Cartesian3.add(h, c, scratch4); + r[l++] = p.x, r[l++] = p.y, r[l++] = p.z; + const m = Cartesian3.add(h, s, scratch4); + o[d--] = m.z, o[d--] = m.y, o[d--] = m.x; + } + return i.push(r, o), i; +} +CorridorGeometryLibrary.addAttribute = function(e, t, n, i) { + const r = t.x, o = t.y, s = t.z; + defined(n) && (e[n] = r, e[n + 1] = o, e[n + 2] = s), defined(i) && (e[i] = s, e[i - 1] = o, e[i - 2] = r); +}; +const scratchForwardProjection = new Cartesian3(), scratchBackwardProjection = new Cartesian3(); +CorridorGeometryLibrary.computePositions = function(e) { + const t = e.granularity, n = e.positions, i = e.ellipsoid, r = e.width / 2, o = e.cornerType, s = e.saveAttributes; + let c = cartesian1$2, l = cartesian2$2, d = cartesian3$2, f = cartesian4$1, h = cartesian5$1, p = cartesian6$1, m = cartesian7, _ = cartesian8, y = cartesian9, C = cartesian10, T = []; + const x = s ? [] : void 0, b = s ? [] : void 0; + let S = n[0], E = n[1]; + l = Cartesian3.normalize( + Cartesian3.subtract(E, S, l), + l + ), c = i.geodeticSurfaceNormal(S, c), f = Cartesian3.normalize(Cartesian3.cross(c, l, f), f), s && (x.push(f.x, f.y, f.z), b.push(c.x, c.y, c.z)), m = Cartesian3.clone(S, m), S = E, d = Cartesian3.negate(l, d); + let A; + const D = []; + let P; + const I = n.length; + for (P = 1; P < I - 1; P++) { + c = i.geodeticSurfaceNormal(S, c), E = n[P + 1], l = Cartesian3.normalize( + Cartesian3.subtract(E, S, l), + l + ), h = Cartesian3.normalize( + Cartesian3.add(l, d, h), + h + ); + const R = Cartesian3.multiplyByScalar( + c, + Cartesian3.dot(l, c), + scratchForwardProjection + ); + Cartesian3.subtract(l, R, R), Cartesian3.normalize(R, R); + const L = Cartesian3.multiplyByScalar( + c, + Cartesian3.dot(d, c), + scratchBackwardProjection + ); + if (Cartesian3.subtract(d, L, L), Cartesian3.normalize(L, L), !CesiumMath.equalsEpsilon( + Math.abs(Cartesian3.dot(R, L)), + 1, + CesiumMath.EPSILON7 + )) { + h = Cartesian3.cross( + h, + c, + h + ), h = Cartesian3.cross( + c, + h, + h + ), h = Cartesian3.normalize(h, h); + const w = r / Math.max( + 0.25, + Cartesian3.magnitude( + Cartesian3.cross(h, d, scratch1$1) + ) + ), O = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi( + l, + d, + S, + i + ); + h = Cartesian3.multiplyByScalar( + h, + w, + h + ), O ? (_ = Cartesian3.add(S, h, _), C = Cartesian3.add( + _, + Cartesian3.multiplyByScalar(f, r, C), + C + ), y = Cartesian3.add( + _, + Cartesian3.multiplyByScalar(f, r * 2, y), + y + ), scaleArray2[0] = Cartesian3.clone(m, scaleArray2[0]), scaleArray2[1] = Cartesian3.clone(C, scaleArray2[1]), A = PolylinePipeline.generateArc({ + positions: scaleArray2, + granularity: t, + ellipsoid: i + }), T = addShiftedPositions( + A, + f, + r, + T + ), s && (x.push(f.x, f.y, f.z), b.push(c.x, c.y, c.z)), p = Cartesian3.clone(y, p), f = Cartesian3.normalize( + Cartesian3.cross(c, l, f), + f + ), y = Cartesian3.add( + _, + Cartesian3.multiplyByScalar(f, r * 2, y), + y + ), m = Cartesian3.add( + _, + Cartesian3.multiplyByScalar(f, r, m), + m + ), o === CornerType$1.ROUNDED || o === CornerType$1.BEVELED ? D.push({ + leftPositions: computeRoundCorner( + _, + p, + y, + o, + O + ) + }) : D.push({ + leftPositions: computeMiteredCorner( + S, + Cartesian3.negate(h, h), + y, + O + ) + })) : (y = Cartesian3.add(S, h, y), C = Cartesian3.add( + y, + Cartesian3.negate( + Cartesian3.multiplyByScalar(f, r, C), + C + ), + C + ), _ = Cartesian3.add( + y, + Cartesian3.negate( + Cartesian3.multiplyByScalar(f, r * 2, _), + _ + ), + _ + ), scaleArray2[0] = Cartesian3.clone(m, scaleArray2[0]), scaleArray2[1] = Cartesian3.clone(C, scaleArray2[1]), A = PolylinePipeline.generateArc({ + positions: scaleArray2, + granularity: t, + ellipsoid: i + }), T = addShiftedPositions( + A, + f, + r, + T + ), s && (x.push(f.x, f.y, f.z), b.push(c.x, c.y, c.z)), p = Cartesian3.clone(_, p), f = Cartesian3.normalize( + Cartesian3.cross(c, l, f), + f + ), _ = Cartesian3.add( + y, + Cartesian3.negate( + Cartesian3.multiplyByScalar(f, r * 2, _), + _ + ), + _ + ), m = Cartesian3.add( + y, + Cartesian3.negate( + Cartesian3.multiplyByScalar(f, r, m), + m + ), + m + ), o === CornerType$1.ROUNDED || o === CornerType$1.BEVELED ? D.push({ + rightPositions: computeRoundCorner( + y, + p, + _, + o, + O + ) + }) : D.push({ + rightPositions: computeMiteredCorner( + S, + h, + _, + O + ) + })), d = Cartesian3.negate(l, d); + } + S = E; + } + c = i.geodeticSurfaceNormal(S, c), scaleArray2[0] = Cartesian3.clone(m, scaleArray2[0]), scaleArray2[1] = Cartesian3.clone(S, scaleArray2[1]), A = PolylinePipeline.generateArc({ + positions: scaleArray2, + granularity: t, + ellipsoid: i + }), T = addShiftedPositions( + A, + f, + r, + T + ), s && (x.push(f.x, f.y, f.z), b.push(c.x, c.y, c.z)); + let M; + return o === CornerType$1.ROUNDED && (M = addEndCaps(T)), { + positions: T, + corners: D, + lefts: x, + normals: b, + endPositions: M + }; +}; +const cartesian1$1 = new Cartesian3(), cartesian2$1 = new Cartesian3(), cartesian3$1 = new Cartesian3(), cartesian4 = new Cartesian3(), cartesian5 = new Cartesian3(), cartesian6 = new Cartesian3(), scratch1 = new Cartesian3(), scratch2 = new Cartesian3(); +function scaleToSurface$1(e, t) { + for (let n = 0; n < e.length; n++) + e[n] = t.scaleToGeodeticSurface(e[n], e[n]); + return e; +} +function addNormals(e, t, n, i, r, o) { + const s = e.normals, c = e.tangents, l = e.bitangents, d = Cartesian3.normalize( + Cartesian3.cross(n, t, scratch1), + scratch1 + ); + o.normal && CorridorGeometryLibrary.addAttribute(s, t, i, r), o.tangent && CorridorGeometryLibrary.addAttribute(c, d, i, r), o.bitangent && CorridorGeometryLibrary.addAttribute(l, n, i, r); +} +function combine$1(e, t, n) { + const i = e.positions, r = e.corners, o = e.endPositions, s = e.lefts, c = e.normals, l = new GeometryAttributes(); + let d, f = 0, h = 0, p, m = 0, _; + for (p = 0; p < i.length; p += 2) + _ = i[p].length - 3, f += _, m += _ * 2, h += i[p + 1].length - 3; + for (f += 3, h += 3, p = 0; p < r.length; p++) { + d = r[p]; + const H = r[p].leftPositions; + defined(H) ? (_ = H.length, f += _, m += _) : (_ = r[p].rightPositions.length, h += _, m += _); + } + const y = defined(o); + let C; + y && (C = o[0].length - 3, f += C, h += C, C /= 3, m += C * 6); + const T = f + h, x = new Float64Array(T), b = t.normal ? new Float32Array(T) : void 0, S = t.tangent ? new Float32Array(T) : void 0, E = t.bitangent ? new Float32Array(T) : void 0, A = { + normals: b, + tangents: S, + bitangents: E + }; + let D = 0, P = T - 1, I, M, R, L, g = cartesian1$1, w = cartesian2$1, O, N; + const F = C / 2, B = IndexDatatype$1.createTypedArray(T / 3, m); + let V = 0; + if (y) { + N = cartesian3$1, O = cartesian4; + const H = o[0]; + for (g = Cartesian3.fromArray(c, 0, g), w = Cartesian3.fromArray(s, 0, w), p = 0; p < F; p++) + N = Cartesian3.fromArray( + H, + (F - 1 - p) * 3, + N + ), O = Cartesian3.fromArray( + H, + (F + p) * 3, + O + ), CorridorGeometryLibrary.addAttribute(x, O, D), CorridorGeometryLibrary.addAttribute( + x, + N, + void 0, + P + ), addNormals(A, g, w, D, P, t), M = D / 3, L = M + 1, I = (P - 2) / 3, R = I - 1, B[V++] = I, B[V++] = M, B[V++] = R, B[V++] = R, B[V++] = M, B[V++] = L, D += 3, P -= 3; + } + let U = 0, k = 0, $ = i[U++], G = i[U++]; + x.set($, D), x.set(G, P - G.length + 1), w = Cartesian3.fromArray(s, k, w); + let q, z; + for (_ = G.length - 3, p = 0; p < _; p += 3) + q = n.geodeticSurfaceNormal( + Cartesian3.fromArray($, p, scratch1), + scratch1 + ), z = n.geodeticSurfaceNormal( + Cartesian3.fromArray(G, _ - p, scratch2), + scratch2 + ), g = Cartesian3.normalize( + Cartesian3.add(q, z, g), + g + ), addNormals(A, g, w, D, P, t), M = D / 3, L = M + 1, I = (P - 2) / 3, R = I - 1, B[V++] = I, B[V++] = M, B[V++] = R, B[V++] = R, B[V++] = M, B[V++] = L, D += 3, P -= 3; + for (q = n.geodeticSurfaceNormal( + Cartesian3.fromArray($, _, scratch1), + scratch1 + ), z = n.geodeticSurfaceNormal( + Cartesian3.fromArray(G, _, scratch2), + scratch2 + ), g = Cartesian3.normalize( + Cartesian3.add(q, z, g), + g + ), k += 3, p = 0; p < r.length; p++) { + let H; + d = r[p]; + const Q = d.leftPositions, ne = d.rightPositions; + let K, Z, ee = cartesian6, oe = cartesian3$1, X = cartesian4; + if (g = Cartesian3.fromArray(c, k, g), defined(Q)) { + for (addNormals(A, g, w, void 0, P, t), P -= 3, K = L, Z = R, H = 0; H < Q.length / 3; H++) + ee = Cartesian3.fromArray(Q, H * 3, ee), B[V++] = K, B[V++] = Z - H - 1, B[V++] = Z - H, CorridorGeometryLibrary.addAttribute( + x, + ee, + void 0, + P + ), oe = Cartesian3.fromArray( + x, + (Z - H - 1) * 3, + oe + ), X = Cartesian3.fromArray(x, K * 3, X), w = Cartesian3.normalize( + Cartesian3.subtract(oe, X, w), + w + ), addNormals(A, g, w, void 0, P, t), P -= 3; + ee = Cartesian3.fromArray( + x, + K * 3, + ee + ), oe = Cartesian3.subtract( + Cartesian3.fromArray(x, Z * 3, oe), + ee, + oe + ), X = Cartesian3.subtract( + Cartesian3.fromArray(x, (Z - H) * 3, X), + ee, + X + ), w = Cartesian3.normalize( + Cartesian3.add(oe, X, w), + w + ), addNormals(A, g, w, D, void 0, t), D += 3; + } else { + for (addNormals(A, g, w, D, void 0, t), D += 3, K = R, Z = L, H = 0; H < ne.length / 3; H++) + ee = Cartesian3.fromArray(ne, H * 3, ee), B[V++] = K, B[V++] = Z + H, B[V++] = Z + H + 1, CorridorGeometryLibrary.addAttribute( + x, + ee, + D + ), oe = Cartesian3.fromArray( + x, + K * 3, + oe + ), X = Cartesian3.fromArray( + x, + (Z + H) * 3, + X + ), w = Cartesian3.normalize( + Cartesian3.subtract(oe, X, w), + w + ), addNormals(A, g, w, D, void 0, t), D += 3; + ee = Cartesian3.fromArray( + x, + K * 3, + ee + ), oe = Cartesian3.subtract( + Cartesian3.fromArray(x, (Z + H) * 3, oe), + ee, + oe + ), X = Cartesian3.subtract( + Cartesian3.fromArray(x, Z * 3, X), + ee, + X + ), w = Cartesian3.normalize( + Cartesian3.negate(Cartesian3.add(X, oe, w), w), + w + ), addNormals(A, g, w, void 0, P, t), P -= 3; + } + for ($ = i[U++], G = i[U++], $.splice(0, 3), G.splice(G.length - 3, 3), x.set($, D), x.set(G, P - G.length + 1), _ = G.length - 3, k += 3, w = Cartesian3.fromArray(s, k, w), H = 0; H < G.length; H += 3) + q = n.geodeticSurfaceNormal( + Cartesian3.fromArray($, H, scratch1), + scratch1 + ), z = n.geodeticSurfaceNormal( + Cartesian3.fromArray(G, _ - H, scratch2), + scratch2 + ), g = Cartesian3.normalize( + Cartesian3.add(q, z, g), + g + ), addNormals(A, g, w, D, P, t), L = D / 3, M = L - 1, R = (P - 2) / 3, I = R + 1, B[V++] = I, B[V++] = M, B[V++] = R, B[V++] = R, B[V++] = M, B[V++] = L, D += 3, P -= 3; + D -= 3, P += 3; + } + if (g = Cartesian3.fromArray( + c, + c.length - 3, + g + ), addNormals(A, g, w, D, P, t), y) { + D += 3, P -= 3, N = cartesian3$1, O = cartesian4; + const H = o[1]; + for (p = 0; p < F; p++) + N = Cartesian3.fromArray( + H, + (C - p - 1) * 3, + N + ), O = Cartesian3.fromArray(H, p * 3, O), CorridorGeometryLibrary.addAttribute( + x, + N, + void 0, + P + ), CorridorGeometryLibrary.addAttribute(x, O, D), addNormals(A, g, w, D, P, t), L = D / 3, M = L - 1, R = (P - 2) / 3, I = R + 1, B[V++] = I, B[V++] = M, B[V++] = R, B[V++] = R, B[V++] = M, B[V++] = L, D += 3, P -= 3; + } + if (l.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: x + }), t.st) { + const H = new Float32Array(T / 3 * 2); + let Q, ne, K = 0; + if (y) { + f /= 3, h /= 3; + const Z = Math.PI / (C + 1); + ne = 1 / (f - C + 1), Q = 1 / (h - C + 1); + let ee; + const oe = C / 2; + for (p = oe + 1; p < C + 1; p++) + ee = CesiumMath.PI_OVER_TWO + Z * p, H[K++] = Q * (1 + Math.cos(ee)), H[K++] = 0.5 * (1 + Math.sin(ee)); + for (p = 1; p < h - C + 1; p++) + H[K++] = p * Q, H[K++] = 0; + for (p = C; p > oe; p--) + ee = CesiumMath.PI_OVER_TWO - p * Z, H[K++] = 1 - Q * (1 + Math.cos(ee)), H[K++] = 0.5 * (1 + Math.sin(ee)); + for (p = oe; p > 0; p--) + ee = CesiumMath.PI_OVER_TWO - Z * p, H[K++] = 1 - ne * (1 + Math.cos(ee)), H[K++] = 0.5 * (1 + Math.sin(ee)); + for (p = f - C; p > 0; p--) + H[K++] = p * ne, H[K++] = 1; + for (p = 1; p < oe + 1; p++) + ee = CesiumMath.PI_OVER_TWO + Z * p, H[K++] = ne * (1 + Math.cos(ee)), H[K++] = 0.5 * (1 + Math.sin(ee)); + } else { + for (f /= 3, h /= 3, ne = 1 / (f - 1), Q = 1 / (h - 1), p = 0; p < h; p++) + H[K++] = p * Q, H[K++] = 0; + for (p = f; p > 0; p--) + H[K++] = (p - 1) * ne, H[K++] = 1; + } + l.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: H + }); + } + return t.normal && (l.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: A.normals + })), t.tangent && (l.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: A.tangents + })), t.bitangent && (l.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: A.bitangents + })), { + attributes: l, + indices: B + }; +} +function extrudedAttributes(e, t) { + if (!t.normal && !t.tangent && !t.bitangent && !t.st) + return e; + const n = e.position.values; + let i, r; + (t.normal || t.bitangent) && (i = e.normal.values, r = e.bitangent.values); + const o = e.position.values.length / 18, s = o * 3, c = o * 2, l = s * 2; + let d; + if (t.normal || t.bitangent || t.tangent) { + const f = t.normal ? new Float32Array(s * 6) : void 0, h = t.tangent ? new Float32Array(s * 6) : void 0, p = t.bitangent ? new Float32Array(s * 6) : void 0; + let m = cartesian1$1, _ = cartesian2$1, y = cartesian3$1, C = cartesian4, T = cartesian5, x = cartesian6, b = l; + for (d = 0; d < s; d += 3) { + const S = b + l; + m = Cartesian3.fromArray(n, d, m), _ = Cartesian3.fromArray( + n, + d + s, + _ + ), y = Cartesian3.fromArray( + n, + (d + 3) % s, + y + ), _ = Cartesian3.subtract( + _, + m, + _ + ), y = Cartesian3.subtract( + y, + m, + y + ), C = Cartesian3.normalize( + Cartesian3.cross(_, y, C), + C + ), t.normal && (CorridorGeometryLibrary.addAttribute(f, C, S), CorridorGeometryLibrary.addAttribute( + f, + C, + S + 3 + ), CorridorGeometryLibrary.addAttribute(f, C, b), CorridorGeometryLibrary.addAttribute(f, C, b + 3)), (t.tangent || t.bitangent) && (x = Cartesian3.fromArray(i, d, x), t.bitangent && (CorridorGeometryLibrary.addAttribute( + p, + x, + S + ), CorridorGeometryLibrary.addAttribute( + p, + x, + S + 3 + ), CorridorGeometryLibrary.addAttribute( + p, + x, + b + ), CorridorGeometryLibrary.addAttribute( + p, + x, + b + 3 + )), t.tangent && (T = Cartesian3.normalize( + Cartesian3.cross(x, C, T), + T + ), CorridorGeometryLibrary.addAttribute( + h, + T, + S + ), CorridorGeometryLibrary.addAttribute( + h, + T, + S + 3 + ), CorridorGeometryLibrary.addAttribute(h, T, b), CorridorGeometryLibrary.addAttribute( + h, + T, + b + 3 + ))), b += 6; + } + if (t.normal) { + for (f.set(i), d = 0; d < s; d += 3) + f[d + s] = -i[d], f[d + s + 1] = -i[d + 1], f[d + s + 2] = -i[d + 2]; + e.normal.values = f; + } else + e.normal = void 0; + if (t.bitangent ? (p.set(r), p.set(r, s), e.bitangent.values = p) : e.bitangent = void 0, t.tangent) { + const S = e.tangent.values; + h.set(S), h.set(S, s), e.tangent.values = h; + } + } + if (t.st) { + const f = e.st.values, h = new Float32Array(c * 6); + h.set(f), h.set(f, c); + let p = c * 2; + for (let m = 0; m < 2; m++) { + for (h[p++] = f[0], h[p++] = f[1], d = 2; d < c; d += 2) { + const _ = f[d], y = f[d + 1]; + h[p++] = _, h[p++] = y, h[p++] = _, h[p++] = y; + } + h[p++] = f[0], h[p++] = f[1]; + } + e.st.values = h; + } + return e; +} +function addWallPositions$1(e, t, n) { + n[t++] = e[0], n[t++] = e[1], n[t++] = e[2]; + for (let i = 3; i < e.length; i += 3) { + const r = e[i], o = e[i + 1], s = e[i + 2]; + n[t++] = r, n[t++] = o, n[t++] = s, n[t++] = r, n[t++] = o, n[t++] = s; + } + return n[t++] = e[0], n[t++] = e[1], n[t++] = e[2], n; +} +function computePositionsExtruded$1(e, t) { + const n = new VertexFormat({ + position: t.position, + normal: t.normal || t.bitangent || e.shadowVolume, + tangent: t.tangent, + bitangent: t.normal || t.bitangent, + st: t.st + }), i = e.ellipsoid, r = CorridorGeometryLibrary.computePositions(e), o = combine$1(r, n, i), s = e.height, c = e.extrudedHeight; + let l = o.attributes; + const d = o.indices; + let f = l.position.values, h = f.length; + const p = new Float64Array(h * 6); + let m = new Float64Array(h); + m.set(f); + let _ = new Float64Array(h * 4); + f = PolygonPipeline.scaleToGeodeticHeight( + f, + s, + i + ), _ = addWallPositions$1(f, 0, _), m = PolygonPipeline.scaleToGeodeticHeight( + m, + c, + i + ), _ = addWallPositions$1( + m, + h * 2, + _ + ), p.set(f), p.set(m, h), p.set(_, h * 2), l.position.values = p, l = extrudedAttributes(l, t); + let y; + const C = h / 3; + if (e.shadowVolume) { + const I = l.normal.values; + h = I.length; + let M = new Float32Array(h * 6); + for (y = 0; y < h; y++) + I[y] = -I[y]; + M.set(I, h), M = addWallPositions$1(I, h * 4, M), l.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: M + }), t.normal || (l.normal = void 0); + } + if (defined(e.offsetAttribute)) { + let I = new Uint8Array(C * 6); + if (e.offsetAttribute === GeometryOffsetAttribute$1.TOP) + I = I.fill(1, 0, C).fill(1, C * 2, C * 4); + else { + const M = e.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + I = I.fill(M); + } + l.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: I + }); + } + const T = d.length, x = C + C, b = IndexDatatype$1.createTypedArray( + p.length / 3, + T * 2 + x * 3 + ); + b.set(d); + let S = T; + for (y = 0; y < T; y += 3) { + const I = d[y], M = d[y + 1], R = d[y + 2]; + b[S++] = R + C, b[S++] = M + C, b[S++] = I + C; + } + let E, A, D, P; + for (y = 0; y < x; y += 2) + E = y + x, A = E + x, D = E + 1, P = A + 1, b[S++] = E, b[S++] = A, b[S++] = D, b[S++] = D, b[S++] = A, b[S++] = P; + return { + attributes: l, + indices: b + }; +} +const scratchCartesian1$5 = new Cartesian3(), scratchCartesian2$7 = new Cartesian3(), scratchCartographic$b = new Cartographic(); +function computeOffsetPoints(e, t, n, i, r, o) { + const s = Cartesian3.subtract( + t, + e, + scratchCartesian1$5 + ); + Cartesian3.normalize(s, s); + const c = n.geodeticSurfaceNormal(e, scratchCartesian2$7), l = Cartesian3.cross( + s, + c, + scratchCartesian1$5 + ); + Cartesian3.multiplyByScalar(l, i, l); + let d = r.latitude, f = r.longitude, h = o.latitude, p = o.longitude; + Cartesian3.add(e, l, scratchCartesian2$7), n.cartesianToCartographic(scratchCartesian2$7, scratchCartographic$b); + let m = scratchCartographic$b.latitude, _ = scratchCartographic$b.longitude; + d = Math.min(d, m), f = Math.min(f, _), h = Math.max(h, m), p = Math.max(p, _), Cartesian3.subtract(e, l, scratchCartesian2$7), n.cartesianToCartographic(scratchCartesian2$7, scratchCartographic$b), m = scratchCartographic$b.latitude, _ = scratchCartographic$b.longitude, d = Math.min(d, m), f = Math.min(f, _), h = Math.max(h, m), p = Math.max(p, _), r.latitude = d, r.longitude = f, o.latitude = h, o.longitude = p; +} +const scratchCartesianOffset = new Cartesian3(), scratchCartesianEnds = new Cartesian3(), scratchCartographicMin = new Cartographic(), scratchCartographicMax = new Cartographic(); +function computeRectangle$2(e, t, n, i, r) { + e = scaleToSurface$1(e, t); + const o = arrayRemoveDuplicates( + e, + Cartesian3.equalsEpsilon + ), s = o.length; + if (s < 2 || n <= 0) + return new Rectangle(); + const c = n * 0.5; + scratchCartographicMin.latitude = Number.POSITIVE_INFINITY, scratchCartographicMin.longitude = Number.POSITIVE_INFINITY, scratchCartographicMax.latitude = Number.NEGATIVE_INFINITY, scratchCartographicMax.longitude = Number.NEGATIVE_INFINITY; + let l, d; + if (i === CornerType$1.ROUNDED) { + const p = o[0]; + Cartesian3.subtract(p, o[1], scratchCartesianOffset), Cartesian3.normalize(scratchCartesianOffset, scratchCartesianOffset), Cartesian3.multiplyByScalar( + scratchCartesianOffset, + c, + scratchCartesianOffset + ), Cartesian3.add(p, scratchCartesianOffset, scratchCartesianEnds), t.cartesianToCartographic( + scratchCartesianEnds, + scratchCartographic$b + ), l = scratchCartographic$b.latitude, d = scratchCartographic$b.longitude, scratchCartographicMin.latitude = Math.min( + scratchCartographicMin.latitude, + l + ), scratchCartographicMin.longitude = Math.min( + scratchCartographicMin.longitude, + d + ), scratchCartographicMax.latitude = Math.max( + scratchCartographicMax.latitude, + l + ), scratchCartographicMax.longitude = Math.max( + scratchCartographicMax.longitude, + d + ); + } + for (let p = 0; p < s - 1; ++p) + computeOffsetPoints( + o[p], + o[p + 1], + t, + c, + scratchCartographicMin, + scratchCartographicMax + ); + const f = o[s - 1]; + Cartesian3.subtract(f, o[s - 2], scratchCartesianOffset), Cartesian3.normalize(scratchCartesianOffset, scratchCartesianOffset), Cartesian3.multiplyByScalar( + scratchCartesianOffset, + c, + scratchCartesianOffset + ), Cartesian3.add(f, scratchCartesianOffset, scratchCartesianEnds), computeOffsetPoints( + f, + scratchCartesianEnds, + t, + c, + scratchCartographicMin, + scratchCartographicMax + ), i === CornerType$1.ROUNDED && (t.cartesianToCartographic( + scratchCartesianEnds, + scratchCartographic$b + ), l = scratchCartographic$b.latitude, d = scratchCartographic$b.longitude, scratchCartographicMin.latitude = Math.min( + scratchCartographicMin.latitude, + l + ), scratchCartographicMin.longitude = Math.min( + scratchCartographicMin.longitude, + d + ), scratchCartographicMax.latitude = Math.max( + scratchCartographicMax.latitude, + l + ), scratchCartographicMax.longitude = Math.max( + scratchCartographicMax.longitude, + d + )); + const h = defined(r) ? r : new Rectangle(); + return h.north = scratchCartographicMax.latitude, h.south = scratchCartographicMin.latitude, h.east = scratchCartographicMax.longitude, h.west = scratchCartographicMin.longitude, h; +} +function CorridorGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.width, i = defaultValue(e.height, 0), r = defaultValue(e.extrudedHeight, i); + this._positions = t, this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._vertexFormat = VertexFormat.clone( + defaultValue(e.vertexFormat, VertexFormat.DEFAULT) + ), this._width = n, this._height = Math.max(i, r), this._extrudedHeight = Math.min(i, r), this._cornerType = defaultValue(e.cornerType, CornerType$1.ROUNDED), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._shadowVolume = defaultValue(e.shadowVolume, !1), this._workerName = "createCorridorGeometry", this._offsetAttribute = e.offsetAttribute, this._rectangle = void 0, this.packedLength = 1 + t.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + 7; +} +CorridorGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + const i = e._positions, r = i.length; + t[n++] = r; + for (let o = 0; o < r; ++o, n += Cartesian3.packedLength) + Cartesian3.pack(i[o], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._width, t[n++] = e._height, t[n++] = e._extrudedHeight, t[n++] = e._cornerType, t[n++] = e._granularity, t[n++] = e._shadowVolume ? 1 : 0, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchEllipsoid$c = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$a = new VertexFormat(), scratchOptions$h = { + positions: void 0, + ellipsoid: scratchEllipsoid$c, + vertexFormat: scratchVertexFormat$a, + width: void 0, + height: void 0, + extrudedHeight: void 0, + cornerType: void 0, + granularity: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +CorridorGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = e[t++], r = new Array(i); + for (let _ = 0; _ < i; ++_, t += Cartesian3.packedLength) + r[_] = Cartesian3.unpack(e, t); + const o = Ellipsoid.unpack(e, t, scratchEllipsoid$c); + t += Ellipsoid.packedLength; + const s = VertexFormat.unpack( + e, + t, + scratchVertexFormat$a + ); + t += VertexFormat.packedLength; + const c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++], p = e[t++] === 1, m = e[t]; + return defined(n) ? (n._positions = r, n._ellipsoid = Ellipsoid.clone(o, n._ellipsoid), n._vertexFormat = VertexFormat.clone(s, n._vertexFormat), n._width = c, n._height = l, n._extrudedHeight = d, n._cornerType = f, n._granularity = h, n._shadowVolume = p, n._offsetAttribute = m === -1 ? void 0 : m, n) : (scratchOptions$h.positions = r, scratchOptions$h.width = c, scratchOptions$h.height = l, scratchOptions$h.extrudedHeight = d, scratchOptions$h.cornerType = f, scratchOptions$h.granularity = h, scratchOptions$h.shadowVolume = p, scratchOptions$h.offsetAttribute = m === -1 ? void 0 : m, new CorridorGeometry(scratchOptions$h)); +}; +CorridorGeometry.computeRectangle = function(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.positions, i = e.width, r = defaultValue(e.ellipsoid, Ellipsoid.default), o = defaultValue(e.cornerType, CornerType$1.ROUNDED); + return computeRectangle$2(n, r, i, o, t); +}; +CorridorGeometry.createGeometry = function(e) { + let t = e._positions; + const n = e._width, i = e._ellipsoid; + t = scaleToSurface$1(t, i); + const r = arrayRemoveDuplicates( + t, + Cartesian3.equalsEpsilon + ); + if (r.length < 2 || n <= 0) + return; + const o = e._height, s = e._extrudedHeight, c = !CesiumMath.equalsEpsilon( + o, + s, + 0, + CesiumMath.EPSILON2 + ), l = e._vertexFormat, d = { + ellipsoid: i, + positions: r, + width: n, + cornerType: e._cornerType, + granularity: e._granularity, + saveAttributes: !0 + }; + let f; + if (c) + d.height = o, d.extrudedHeight = s, d.shadowVolume = e._shadowVolume, d.offsetAttribute = e._offsetAttribute, f = computePositionsExtruded$1(d, l); + else { + const m = CorridorGeometryLibrary.computePositions(d); + if (f = combine$1(m, l, i), f.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + f.attributes.position.values, + o, + i + ), defined(e._offsetAttribute)) { + const _ = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, y = f.attributes.position.values.length, C = new Uint8Array(y / 3).fill(_); + f.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: C + }); + } + } + const h = f.attributes, p = BoundingSphere.fromVertices( + h.position.values, + void 0, + 3 + ); + return l.position || (f.attributes.position.values = void 0), new Geometry({ + attributes: h, + indices: f.indices, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: p, + offsetAttribute: e._offsetAttribute + }); +}; +CorridorGeometry.createShadowVolume = function(e, t, n) { + const i = e._granularity, r = e._ellipsoid, o = t(i, r), s = n(i, r); + return new CorridorGeometry({ + positions: e._positions, + width: e._width, + cornerType: e._cornerType, + ellipsoid: r, + granularity: i, + extrudedHeight: o, + height: s, + vertexFormat: VertexFormat.POSITION_ONLY, + shadowVolume: !0 + }); +}; +Object.defineProperties(CorridorGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + return defined(this._rectangle) || (this._rectangle = computeRectangle$2( + this._positions, + this._ellipsoid, + this._width, + this._cornerType + )), this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering CorridorGeometries as GroundPrimitives. + * + * Corridors don't support stRotation, + * so just return the corners of the original system. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return [0, 0, 0, 1, 1, 0]; + } + } +}); +const cartesian1 = new Cartesian3(), cartesian2 = new Cartesian3(), cartesian3 = new Cartesian3(); +function scaleToSurface(e, t) { + for (let n = 0; n < e.length; n++) + e[n] = t.scaleToGeodeticSurface(e[n], e[n]); + return e; +} +function combine(e, t) { + const n = [], i = e.positions, r = e.corners, o = e.endPositions, s = new GeometryAttributes(); + let c, l = 0, d = 0, f, h = 0, p; + for (f = 0; f < i.length; f += 2) + p = i[f].length - 3, l += p, h += p / 3 * 4, d += i[f + 1].length - 3; + for (l += 3, d += 3, f = 0; f < r.length; f++) { + c = r[f]; + const O = r[f].leftPositions; + defined(O) ? (p = O.length, l += p, h += p / 3 * 2) : (p = r[f].rightPositions.length, d += p, h += p / 3 * 2); + } + const m = defined(o); + let _; + m && (_ = o[0].length - 3, l += _, d += _, _ /= 3, h += _ * 4); + const y = l + d, C = new Float64Array(y); + let T = 0, x = y - 1, b, S, E, A, D, P; + const I = _ / 2, M = IndexDatatype$1.createTypedArray(y / 3, h + 4); + let R = 0; + if (M[R++] = T / 3, M[R++] = (x - 2) / 3, m) { + n.push(T / 3), P = cartesian1, D = cartesian2; + const O = o[0]; + for (f = 0; f < I; f++) + P = Cartesian3.fromArray( + O, + (I - 1 - f) * 3, + P + ), D = Cartesian3.fromArray( + O, + (I + f) * 3, + D + ), CorridorGeometryLibrary.addAttribute(C, D, T), CorridorGeometryLibrary.addAttribute( + C, + P, + void 0, + x + ), S = T / 3, A = S + 1, b = (x - 2) / 3, E = b - 1, M[R++] = b, M[R++] = E, M[R++] = S, M[R++] = A, T += 3, x -= 3; + } + let L = 0, g = i[L++], w = i[L++]; + for (C.set(g, T), C.set(w, x - w.length + 1), p = w.length - 3, n.push(T / 3, (x - 2) / 3), f = 0; f < p; f += 3) + S = T / 3, A = S + 1, b = (x - 2) / 3, E = b - 1, M[R++] = b, M[R++] = E, M[R++] = S, M[R++] = A, T += 3, x -= 3; + for (f = 0; f < r.length; f++) { + let O; + c = r[f]; + const N = c.leftPositions, F = c.rightPositions; + let B, V = cartesian3; + if (defined(N)) { + for (x -= 3, B = E, n.push(A), O = 0; O < N.length / 3; O++) + V = Cartesian3.fromArray(N, O * 3, V), M[R++] = B - O - 1, M[R++] = B - O, CorridorGeometryLibrary.addAttribute( + C, + V, + void 0, + x + ), x -= 3; + n.push(B - Math.floor(N.length / 6)), t === CornerType$1.BEVELED && n.push((x - 2) / 3 + 1), T += 3; + } else { + for (T += 3, B = A, n.push(E), O = 0; O < F.length / 3; O++) + V = Cartesian3.fromArray(F, O * 3, V), M[R++] = B + O, M[R++] = B + O + 1, CorridorGeometryLibrary.addAttribute( + C, + V, + T + ), T += 3; + n.push(B + Math.floor(F.length / 6)), t === CornerType$1.BEVELED && n.push(T / 3 - 1), x -= 3; + } + for (g = i[L++], w = i[L++], g.splice(0, 3), w.splice(w.length - 3, 3), C.set(g, T), C.set(w, x - w.length + 1), p = w.length - 3, O = 0; O < w.length; O += 3) + A = T / 3, S = A - 1, E = (x - 2) / 3, b = E + 1, M[R++] = b, M[R++] = E, M[R++] = S, M[R++] = A, T += 3, x -= 3; + T -= 3, x += 3, n.push(T / 3, (x - 2) / 3); + } + if (m) { + T += 3, x -= 3, P = cartesian1, D = cartesian2; + const O = o[1]; + for (f = 0; f < I; f++) + P = Cartesian3.fromArray( + O, + (_ - f - 1) * 3, + P + ), D = Cartesian3.fromArray(O, f * 3, D), CorridorGeometryLibrary.addAttribute( + C, + P, + void 0, + x + ), CorridorGeometryLibrary.addAttribute(C, D, T), A = T / 3, S = A - 1, E = (x - 2) / 3, b = E + 1, M[R++] = b, M[R++] = E, M[R++] = S, M[R++] = A, T += 3, x -= 3; + n.push(T / 3); + } else + n.push(T / 3, (x - 2) / 3); + return M[R++] = T / 3, M[R++] = (x - 2) / 3, s.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: C + }), { + attributes: s, + indices: M, + wallIndices: n + }; +} +function computePositionsExtruded(e) { + const t = e.ellipsoid, n = CorridorGeometryLibrary.computePositions(e), i = combine(n, e.cornerType), r = i.wallIndices, o = e.height, s = e.extrudedHeight, c = i.attributes, l = i.indices; + let d = c.position.values, f = d.length, h = new Float64Array(f); + h.set(d); + const p = new Float64Array(f * 2); + if (d = PolygonPipeline.scaleToGeodeticHeight( + d, + o, + t + ), h = PolygonPipeline.scaleToGeodeticHeight( + h, + s, + t + ), p.set(d), p.set(h, f), c.position.values = p, f /= 3, defined(e.offsetAttribute)) { + let b = new Uint8Array(f * 2); + if (e.offsetAttribute === GeometryOffsetAttribute$1.TOP) + b = b.fill(1, 0, f); + else { + const S = e.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + b = b.fill(S); + } + c.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: b + }); + } + let m; + const _ = l.length, y = IndexDatatype$1.createTypedArray( + p.length / 3, + (_ + r.length) * 2 + ); + y.set(l); + let C = _; + for (m = 0; m < _; m += 2) { + const b = l[m], S = l[m + 1]; + y[C++] = b + f, y[C++] = S + f; + } + let T, x; + for (m = 0; m < r.length; m++) + T = r[m], x = T + f, y[C++] = T, y[C++] = x; + return { + attributes: c, + indices: y + }; +} +function CorridorOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.width, i = defaultValue(e.height, 0), r = defaultValue(e.extrudedHeight, i); + this._positions = t, this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._width = n, this._height = Math.max(i, r), this._extrudedHeight = Math.min(i, r), this._cornerType = defaultValue(e.cornerType, CornerType$1.ROUNDED), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._offsetAttribute = e.offsetAttribute, this._workerName = "createCorridorOutlineGeometry", this.packedLength = 1 + t.length * Cartesian3.packedLength + Ellipsoid.packedLength + 6; +} +CorridorOutlineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + const i = e._positions, r = i.length; + t[n++] = r; + for (let o = 0; o < r; ++o, n += Cartesian3.packedLength) + Cartesian3.pack(i[o], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._width, t[n++] = e._height, t[n++] = e._extrudedHeight, t[n++] = e._cornerType, t[n++] = e._granularity, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchEllipsoid$b = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchOptions$g = { + positions: void 0, + ellipsoid: scratchEllipsoid$b, + width: void 0, + height: void 0, + extrudedHeight: void 0, + cornerType: void 0, + granularity: void 0, + offsetAttribute: void 0 +}; +CorridorOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = e[t++], r = new Array(i); + for (let p = 0; p < i; ++p, t += Cartesian3.packedLength) + r[p] = Cartesian3.unpack(e, t); + const o = Ellipsoid.unpack(e, t, scratchEllipsoid$b); + t += Ellipsoid.packedLength; + const s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t]; + return defined(n) ? (n._positions = r, n._ellipsoid = Ellipsoid.clone(o, n._ellipsoid), n._width = s, n._height = c, n._extrudedHeight = l, n._cornerType = d, n._granularity = f, n._offsetAttribute = h === -1 ? void 0 : h, n) : (scratchOptions$g.positions = r, scratchOptions$g.width = s, scratchOptions$g.height = c, scratchOptions$g.extrudedHeight = l, scratchOptions$g.cornerType = d, scratchOptions$g.granularity = f, scratchOptions$g.offsetAttribute = h === -1 ? void 0 : h, new CorridorOutlineGeometry(scratchOptions$g)); +}; +CorridorOutlineGeometry.createGeometry = function(e) { + let t = e._positions; + const n = e._width, i = e._ellipsoid; + t = scaleToSurface(t, i); + const r = arrayRemoveDuplicates( + t, + Cartesian3.equalsEpsilon + ); + if (r.length < 2 || n <= 0) + return; + const o = e._height, s = e._extrudedHeight, c = !CesiumMath.equalsEpsilon( + o, + s, + 0, + CesiumMath.EPSILON2 + ), l = { + ellipsoid: i, + positions: r, + width: n, + cornerType: e._cornerType, + granularity: e._granularity, + saveAttributes: !1 + }; + let d; + if (c) + l.height = o, l.extrudedHeight = s, l.offsetAttribute = e._offsetAttribute, d = computePositionsExtruded(l); + else { + const p = CorridorGeometryLibrary.computePositions(l); + if (d = combine(p, l.cornerType), d.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + d.attributes.position.values, + o, + i + ), defined(e._offsetAttribute)) { + const m = d.attributes.position.values.length, _ = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, y = new Uint8Array(m / 3).fill(_); + d.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: y + }); + } + } + const f = d.attributes, h = BoundingSphere.fromVertices( + f.position.values, + void 0, + 3 + ); + return new Geometry({ + attributes: f, + indices: d.indices, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: h, + offsetAttribute: e._offsetAttribute + }); +}; +const defaultZIndex$1 = new ConstantProperty(0); +function GroundGeometryUpdater(e) { + GeometryUpdater.call(this, e), this._zIndex = 0, this._terrainOffsetProperty = void 0; +} +defined(Object.create) && (GroundGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), GroundGeometryUpdater.prototype.constructor = GroundGeometryUpdater); +Object.defineProperties(GroundGeometryUpdater.prototype, { + /** + * Gets the zindex + * @type {number} + * @memberof GroundGeometryUpdater.prototype + * @readonly + */ + zIndex: { + get: function() { + return this._zIndex; + } + }, + /** + * Gets the terrain offset property + * @type {TerrainOffsetProperty} + * @memberof GroundGeometryUpdater.prototype + * @readonly + * @private + */ + terrainOffsetProperty: { + get: function() { + return this._terrainOffsetProperty; + } + } +}); +GroundGeometryUpdater.prototype._isOnTerrain = function(e, t) { + return this._fillEnabled && !defined(t.height) && !defined(t.extrudedHeight) && GroundPrimitive.isSupported(this._scene); +}; +GroundGeometryUpdater.prototype._getIsClosed = function(e) { + const t = e.height, n = e.extrudedHeight; + return t === 0 || defined(n) && n !== t; +}; +GroundGeometryUpdater.prototype._computeCenter = DeveloperError.throwInstantiationError; +GroundGeometryUpdater.prototype._onEntityPropertyChanged = function(e, t, n, i) { + if (GeometryUpdater.prototype._onEntityPropertyChanged.call( + this, + e, + t, + n, + i + ), this._observedPropertyNames.indexOf(t) === -1) + return; + const r = this._entity[this._geometryPropertyName]; + if (!defined(r)) + return; + defined(r.zIndex) && (defined(r.height) || defined(r.extrudedHeight)) && oneTimeWarning(oneTimeWarning.geometryZIndex), this._zIndex = defaultValue(r.zIndex, defaultZIndex$1), defined(this._terrainOffsetProperty) && (this._terrainOffsetProperty.destroy(), this._terrainOffsetProperty = void 0); + const o = r.heightReference, s = r.extrudedHeightReference; + if (defined(o) || defined(s)) { + const c = new CallbackProperty( + this._computeCenter.bind(this), + !this._dynamic + ); + this._terrainOffsetProperty = new TerrainOffsetProperty( + this._scene, + c, + o, + s + ); + } +}; +GroundGeometryUpdater.prototype.destroy = function() { + defined(this._terrainOffsetProperty) && (this._terrainOffsetProperty.destroy(), this._terrainOffsetProperty = void 0), GeometryUpdater.prototype.destroy.call(this); +}; +GroundGeometryUpdater.getGeometryHeight = function(e, t) { + if (!defined(e)) { + t !== HeightReference$1.NONE && oneTimeWarning(oneTimeWarning.geometryHeightReference); + return; + } + return isHeightReferenceClamp(t) ? 0 : e; +}; +GroundGeometryUpdater.getGeometryExtrudedHeight = function(e, t) { + if (!defined(e)) { + t !== HeightReference$1.NONE && oneTimeWarning(oneTimeWarning.geometryExtrudedHeightReference); + return; + } + return isHeightReferenceClamp(t) ? GroundGeometryUpdater.CLAMP_TO_GROUND : e; +}; +GroundGeometryUpdater.CLAMP_TO_GROUND = "clamp"; +GroundGeometryUpdater.computeGeometryOffsetAttribute = function(e, t, n, i) { + (!defined(e) || !defined(t)) && (t = HeightReference$1.NONE), (!defined(n) || !defined(i)) && (i = HeightReference$1.NONE); + let r = 0; + if (t !== HeightReference$1.NONE && r++, i === HeightReference$1.RELATIVE_TO_GROUND && r++, r === 2) + return GeometryOffsetAttribute$1.ALL; + if (r === 1) + return GeometryOffsetAttribute$1.TOP; +}; +const scratchColor$e = new Color(), defaultOffset$9 = Cartesian3.ZERO, offsetScratch$8 = new Cartesian3(), scratchRectangle$6 = new Rectangle(); +function CorridorGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.positions = void 0, this.width = void 0, this.cornerType = void 0, this.height = void 0, this.extrudedHeight = void 0, this.granularity = void 0, this.offsetAttribute = void 0; +} +function CorridorGeometryUpdater(e, t) { + GroundGeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new CorridorGeometryOptions(e), + geometryPropertyName: "corridor", + observedPropertyNames: ["availability", "corridor"] + }), this._onEntityPropertyChanged(e, "corridor", e.corridor, void 0); +} +defined(Object.create) && (CorridorGeometryUpdater.prototype = Object.create( + GroundGeometryUpdater.prototype +), CorridorGeometryUpdater.prototype.constructor = CorridorGeometryUpdater); +CorridorGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + this._distanceDisplayConditionProperty.getValue(e) + ), + offset: void 0, + color: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let r; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (r = this._materialProperty.color.getValue(e, scratchColor$e)), defined(r) || (r = Color.WHITE), i.color = ColorGeometryInstanceAttribute.fromColor(r); + } + return defined(this._options.offsetAttribute) && (i.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$9, + offsetScratch$8 + ) + )), new GeometryInstance({ + id: t, + geometry: new CorridorGeometry(this._options), + attributes: i + }); +}; +CorridorGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$e + ), r = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + this._distanceDisplayConditionProperty.getValue(e) + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (r.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$9, + offsetScratch$8 + ) + )), new GeometryInstance({ + id: t, + geometry: new CorridorOutlineGeometry(this._options), + attributes: r + }); +}; +CorridorGeometryUpdater.prototype._computeCenter = function(e, t) { + const n = Property.getValueOrUndefined( + this._entity.corridor.positions, + e + ); + if (!(!defined(n) || n.length === 0)) + return Cartesian3.clone( + n[Math.floor(n.length / 2)], + t + ); +}; +CorridorGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.positions) || !defined(t.width) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +CorridorGeometryUpdater.prototype._isDynamic = function(e, t) { + return !t.positions.isConstant || // + !Property.isConstant(t.height) || // + !Property.isConstant(t.extrudedHeight) || // + !Property.isConstant(t.granularity) || // + !Property.isConstant(t.width) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.cornerType) || // + !Property.isConstant(t.zIndex) || // + this._onTerrain && !Property.isConstant(this._materialProperty) && !(this._materialProperty instanceof ColorMaterialProperty); +}; +CorridorGeometryUpdater.prototype._setStaticOptions = function(e, t) { + let n = Property.getValueOrUndefined( + t.height, + Iso8601.MINIMUM_VALUE + ); + const i = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + let r = Property.getValueOrUndefined( + t.extrudedHeight, + Iso8601.MINIMUM_VALUE + ); + const o = Property.getValueOrDefault( + t.extrudedHeightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + defined(r) && !defined(n) && (n = 0); + const s = this._options; + s.vertexFormat = this._materialProperty instanceof ColorMaterialProperty ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, s.positions = t.positions.getValue( + Iso8601.MINIMUM_VALUE, + s.positions + ), s.width = t.width.getValue(Iso8601.MINIMUM_VALUE), s.granularity = Property.getValueOrUndefined( + t.granularity, + Iso8601.MINIMUM_VALUE + ), s.cornerType = Property.getValueOrUndefined( + t.cornerType, + Iso8601.MINIMUM_VALUE + ), s.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + n, + i, + r, + o + ), s.height = GroundGeometryUpdater.getGeometryHeight( + n, + i + ), r = GroundGeometryUpdater.getGeometryExtrudedHeight( + r, + o + ), r === GroundGeometryUpdater.CLAMP_TO_GROUND && (r = ApproximateTerrainHeights.getMinimumMaximumHeights( + CorridorGeometry.computeRectangle(s, scratchRectangle$6) + ).minimumTerrainHeight), s.extrudedHeight = r; +}; +CorridorGeometryUpdater.DynamicGeometryUpdater = DynamicCorridorGeometryUpdater; +function DynamicCorridorGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicCorridorGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicCorridorGeometryUpdater.prototype.constructor = DynamicCorridorGeometryUpdater); +DynamicCorridorGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = this._options; + return !defined(i.positions) || !defined(i.width) || DynamicGeometryUpdater$1.prototype._isHidden.call( + this, + e, + t, + n + ); +}; +DynamicCorridorGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + let r = Property.getValueOrUndefined(t.height, n); + const o = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ); + let s = Property.getValueOrUndefined( + t.extrudedHeight, + n + ); + const c = Property.getValueOrDefault( + t.extrudedHeightReference, + n, + HeightReference$1.NONE + ); + defined(s) && !defined(r) && (r = 0), i.positions = Property.getValueOrUndefined(t.positions, n), i.width = Property.getValueOrUndefined(t.width, n), i.granularity = Property.getValueOrUndefined( + t.granularity, + n + ), i.cornerType = Property.getValueOrUndefined(t.cornerType, n), i.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + r, + o, + s, + c + ), i.height = GroundGeometryUpdater.getGeometryHeight( + r, + o + ), s = GroundGeometryUpdater.getGeometryExtrudedHeight( + s, + c + ), s === GroundGeometryUpdater.CLAMP_TO_GROUND && (s = ApproximateTerrainHeights.getMinimumMaximumHeights( + CorridorGeometry.computeRectangle(i, scratchRectangle$6) + ).minimumTerrainHeight), i.extrudedHeight = s; +}; +function DataSource() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(DataSource.prototype, { + /** + * Gets a human-readable name for this instance. + * @memberof DataSource.prototype + * @type {string} + */ + name: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the preferred clock settings for this data source. + * @memberof DataSource.prototype + * @type {DataSourceClock} + */ + clock: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof DataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets a value indicating if the data source is currently loading data. + * @memberof DataSource.prototype + * @type {boolean} + */ + isLoading: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof DataSource.prototype + * @type {Event} + */ + changedEvent: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof DataSource.prototype + * @type {Event} + */ + errorEvent: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an event that will be raised when the value of isLoading changes. + * @memberof DataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof DataSource.prototype + * @type {boolean} + */ + show: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof DataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: DeveloperError.throwInstantiationError + } +}); +DataSource.prototype.update = function(e) { + DeveloperError.throwInstantiationError(); +}; +DataSource.setLoading = function(e, t) { + e._isLoading !== t && (t ? e._entityCollection.suspendEvents() : e._entityCollection.resumeEvents(), e._isLoading = t, e._loading.raiseEvent(e, t)); +}; +function EllipsoidalOccluder(e, t) { + this._ellipsoid = e, this._cameraPosition = new Cartesian3(), this._cameraPositionInScaledSpace = new Cartesian3(), this._distanceToLimbInScaledSpaceSquared = 0, defined(t) && (this.cameraPosition = t); +} +Object.defineProperties(EllipsoidalOccluder.prototype, { + /** + * Gets the occluding ellipsoid. + * @memberof EllipsoidalOccluder.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets or sets the position of the camera. + * @memberof EllipsoidalOccluder.prototype + * @type {Cartesian3} + */ + cameraPosition: { + get: function() { + return this._cameraPosition; + }, + set: function(e) { + const n = this._ellipsoid.transformPositionToScaledSpace( + e, + this._cameraPositionInScaledSpace + ), i = Cartesian3.magnitudeSquared(n) - 1; + Cartesian3.clone(e, this._cameraPosition), this._cameraPositionInScaledSpace = n, this._distanceToLimbInScaledSpaceSquared = i; + } + } +}); +const scratchCartesian$5 = new Cartesian3(); +EllipsoidalOccluder.prototype.isPointVisible = function(e) { + const n = this._ellipsoid.transformPositionToScaledSpace( + e, + scratchCartesian$5 + ); + return isScaledSpacePointVisible( + n, + this._cameraPositionInScaledSpace, + this._distanceToLimbInScaledSpaceSquared + ); +}; +EllipsoidalOccluder.prototype.isScaledSpacePointVisible = function(e) { + return isScaledSpacePointVisible( + e, + this._cameraPositionInScaledSpace, + this._distanceToLimbInScaledSpaceSquared + ); +}; +const scratchCameraPositionInScaledSpaceShrunk = new Cartesian3(); +EllipsoidalOccluder.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid = function(e, t) { + const n = this._ellipsoid; + let i, r; + return defined(t) && t < 0 && n.minimumRadius > -t ? (r = scratchCameraPositionInScaledSpaceShrunk, r.x = this._cameraPosition.x / (n.radii.x + t), r.y = this._cameraPosition.y / (n.radii.y + t), r.z = this._cameraPosition.z / (n.radii.z + t), i = r.x * r.x + r.y * r.y + r.z * r.z - 1) : (r = this._cameraPositionInScaledSpace, i = this._distanceToLimbInScaledSpaceSquared), isScaledSpacePointVisible( + e, + r, + i + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPoint = function(e, t, n) { + return computeHorizonCullingPointFromPositions( + this._ellipsoid, + e, + t, + n + ); +}; +const scratchEllipsoidShrunk = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE); +EllipsoidalOccluder.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid = function(e, t, n, i) { + const r = getPossiblyShrunkEllipsoid( + this._ellipsoid, + n, + scratchEllipsoidShrunk + ); + return computeHorizonCullingPointFromPositions( + r, + e, + t, + i + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVertices = function(e, t, n, i, r) { + return computeHorizonCullingPointFromVertices( + this._ellipsoid, + e, + t, + n, + i, + r + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid = function(e, t, n, i, r, o) { + const s = getPossiblyShrunkEllipsoid( + this._ellipsoid, + r, + scratchEllipsoidShrunk + ); + return computeHorizonCullingPointFromVertices( + s, + e, + t, + n, + i, + o + ); +}; +const subsampleScratch = []; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromRectangle = function(e, t, n) { + const i = Rectangle.subsample( + e, + t, + 0, + subsampleScratch + ), r = BoundingSphere.fromPoints(i); + if (!(Cartesian3.magnitude(r.center) < 0.1 * t.minimumRadius)) + return this.computeHorizonCullingPoint(r.center, i, n); +}; +const scratchEllipsoidShrunkRadii = new Cartesian3(); +function getPossiblyShrunkEllipsoid(e, t, n) { + if (defined(t) && t < 0 && e.minimumRadius > -t) { + const i = Cartesian3.fromElements( + e.radii.x + t, + e.radii.y + t, + e.radii.z + t, + scratchEllipsoidShrunkRadii + ); + e = Ellipsoid.fromCartesian3(i, n); + } + return e; +} +function computeHorizonCullingPointFromPositions(e, t, n, i) { + defined(i) || (i = new Cartesian3()); + const r = computeScaledSpaceDirectionToPoint( + e, + t + ); + let o = 0; + for (let s = 0, c = n.length; s < c; ++s) { + const l = n[s], d = computeMagnitude( + e, + l, + r + ); + if (d < 0) + return; + o = Math.max(o, d); + } + return magnitudeToPoint(r, o, i); +} +const positionScratch$7 = new Cartesian3(); +function computeHorizonCullingPointFromVertices(e, t, n, i, r, o) { + defined(o) || (o = new Cartesian3()), i = defaultValue(i, 3), r = defaultValue(r, Cartesian3.ZERO); + const s = computeScaledSpaceDirectionToPoint( + e, + t + ); + let c = 0; + for (let l = 0, d = n.length; l < d; l += i) { + positionScratch$7.x = n[l] + r.x, positionScratch$7.y = n[l + 1] + r.y, positionScratch$7.z = n[l + 2] + r.z; + const f = computeMagnitude( + e, + positionScratch$7, + s + ); + if (f < 0) + return; + c = Math.max(c, f); + } + return magnitudeToPoint(s, c, o); +} +function isScaledSpacePointVisible(e, t, n) { + const i = t, r = n, o = Cartesian3.subtract( + e, + i, + scratchCartesian$5 + ), s = -Cartesian3.dot(o, i); + return !(r < 0 ? s > 0 : s > r && s * s / Cartesian3.magnitudeSquared(o) > r); +} +const scaledSpaceScratch = new Cartesian3(), directionScratch = new Cartesian3(); +function computeMagnitude(e, t, n) { + const i = e.transformPositionToScaledSpace( + t, + scaledSpaceScratch + ); + let r = Cartesian3.magnitudeSquared(i), o = Math.sqrt(r); + const s = Cartesian3.divideByScalar( + i, + o, + directionScratch + ); + r = Math.max(1, r), o = Math.max(1, o); + const c = Cartesian3.dot(s, n), l = Cartesian3.magnitude( + Cartesian3.cross(s, n, s) + ), d = 1 / o, f = Math.sqrt(r - 1) * d; + return 1 / (c * d - l * f); +} +function magnitudeToPoint(e, t, n) { + if (!(t <= 0 || t === 1 / 0 || t !== t)) + return Cartesian3.multiplyByScalar( + e, + t, + n + ); +} +const directionToPointScratch = new Cartesian3(); +function computeScaledSpaceDirectionToPoint(e, t) { + return Cartesian3.equals(t, Cartesian3.ZERO) ? t : (e.transformPositionToScaledSpace( + t, + directionToPointScratch + ), Cartesian3.normalize(directionToPointScratch, directionToPointScratch)); +} +function PointPrimitive(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let n = e.translucencyByDistance, i = e.scaleByDistance, r = e.distanceDisplayCondition; + defined(n) && (n = NearFarScalar.clone(n)), defined(i) && (i = NearFarScalar.clone(i)), defined(r) && (r = DistanceDisplayCondition.clone( + r + )), this._show = defaultValue(e.show, !0), this._position = Cartesian3.clone( + defaultValue(e.position, Cartesian3.ZERO) + ), this._actualPosition = Cartesian3.clone(this._position), this._color = Color.clone(defaultValue(e.color, Color.WHITE)), this._outlineColor = Color.clone( + defaultValue(e.outlineColor, Color.TRANSPARENT) + ), this._outlineWidth = defaultValue(e.outlineWidth, 0), this._pixelSize = defaultValue(e.pixelSize, 10), this._scaleByDistance = i, this._translucencyByDistance = n, this._distanceDisplayCondition = r, this._disableDepthTestDistance = defaultValue( + e.disableDepthTestDistance, + 0 + ), this._id = e.id, this._collection = defaultValue(e.collection, t), this._clusterShow = !0, this._pickId = void 0, this._pointPrimitiveCollection = t, this._dirty = !1, this._index = -1, this._splitDirection = defaultValue( + e.splitDirection, + SplitDirection$1.NONE + ); +} +const SHOW_INDEX$3 = PointPrimitive.SHOW_INDEX = 0, POSITION_INDEX$3 = PointPrimitive.POSITION_INDEX = 1, COLOR_INDEX$3 = PointPrimitive.COLOR_INDEX = 2, OUTLINE_COLOR_INDEX$1 = PointPrimitive.OUTLINE_COLOR_INDEX = 3, OUTLINE_WIDTH_INDEX$1 = PointPrimitive.OUTLINE_WIDTH_INDEX = 4, PIXEL_SIZE_INDEX$1 = PointPrimitive.PIXEL_SIZE_INDEX = 5, SCALE_BY_DISTANCE_INDEX$1 = PointPrimitive.SCALE_BY_DISTANCE_INDEX = 6, TRANSLUCENCY_BY_DISTANCE_INDEX$1 = PointPrimitive.TRANSLUCENCY_BY_DISTANCE_INDEX = 7, DISTANCE_DISPLAY_CONDITION_INDEX$1 = PointPrimitive.DISTANCE_DISPLAY_CONDITION_INDEX = 8, DISABLE_DEPTH_DISTANCE_INDEX$1 = PointPrimitive.DISABLE_DEPTH_DISTANCE_INDEX = 9, SPLIT_DIRECTION_INDEX$1 = PointPrimitive.SPLIT_DIRECTION_INDEX = 10; +PointPrimitive.NUMBER_OF_PROPERTIES = 11; +function makeDirty$1(e, t) { + const n = e._pointPrimitiveCollection; + defined(n) && (n._updatePointPrimitive( + e, + t + ), e._dirty = !0); +} +Object.defineProperties(PointPrimitive.prototype, { + /** + * Determines if this point will be shown. Use this to hide or show a point, instead + * of removing it and re-adding it to the collection. + * @memberof PointPrimitive.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + this._show !== e && (this._show = e, makeDirty$1(this, SHOW_INDEX$3)); + } + }, + /** + * Gets or sets the Cartesian position of this point. + * @memberof PointPrimitive.prototype + * @type {Cartesian3} + */ + position: { + get: function() { + return this._position; + }, + set: function(e) { + const t = this._position; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), Cartesian3.clone(e, this._actualPosition), makeDirty$1(this, POSITION_INDEX$3)); + } + }, + /** + * Gets or sets near and far scaling properties of a point based on the point's distance from the camera. + * A point's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's scale remains clamped to the nearest bound. This scale + * multiplies the pixelSize and outlineWidth to affect the total size of the point. If undefined, + * scaleByDistance will be disabled. + * @memberof PointPrimitive.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a pointPrimitive's scaleByDistance to scale to 15 when the + * // camera is 1500 meters from the pointPrimitive and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 15, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable scaling by distance + * p.scaleByDistance = undefined; + */ + scaleByDistance: { + get: function() { + return this._scaleByDistance; + }, + set: function(e) { + const t = this._scaleByDistance; + NearFarScalar.equals(t, e) || (this._scaleByDistance = NearFarScalar.clone(e, t), makeDirty$1(this, SCALE_BY_DISTANCE_INDEX$1)); + } + }, + /** + * Gets or sets near and far translucency properties of a point based on the point's distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @memberof PointPrimitive.prototype + * @type {NearFarScalar} + * + * @example + * // Example 1. + * // Set a point's translucency to 1.0 when the + * // camera is 1500 meters from the point and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * + * @example + * // Example 2. + * // disable translucency by distance + * p.translucencyByDistance = undefined; + */ + translucencyByDistance: { + get: function() { + return this._translucencyByDistance; + }, + set: function(e) { + const t = this._translucencyByDistance; + NearFarScalar.equals(t, e) || (this._translucencyByDistance = NearFarScalar.clone( + e, + t + ), makeDirty$1(this, TRANSLUCENCY_BY_DISTANCE_INDEX$1)); + } + }, + /** + * Gets or sets the inner size of the point in pixels. + * @memberof PointPrimitive.prototype + * @type {number} + */ + pixelSize: { + get: function() { + return this._pixelSize; + }, + set: function(e) { + this._pixelSize !== e && (this._pixelSize = e, makeDirty$1(this, PIXEL_SIZE_INDEX$1)); + } + }, + /** + * Gets or sets the inner color of the point. + * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @memberof PointPrimitive.prototype + * @type {Color} + * + * @example + * // Example 1. Assign yellow. + * p.color = Cesium.Color.YELLOW; + * + * @example + * // Example 2. Make a pointPrimitive 50% translucent. + * p.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + const t = this._color; + Color.equals(t, e) || (Color.clone(e, t), makeDirty$1(this, COLOR_INDEX$3)); + } + }, + /** + * Gets or sets the outline color of the point. + * @memberof PointPrimitive.prototype + * @type {Color} + */ + outlineColor: { + get: function() { + return this._outlineColor; + }, + set: function(e) { + const t = this._outlineColor; + Color.equals(t, e) || (Color.clone(e, t), makeDirty$1(this, OUTLINE_COLOR_INDEX$1)); + } + }, + /** + * Gets or sets the outline width in pixels. This width adds to pixelSize, + * increasing the total size of the point. + * @memberof PointPrimitive.prototype + * @type {number} + */ + outlineWidth: { + get: function() { + return this._outlineWidth; + }, + set: function(e) { + this._outlineWidth !== e && (this._outlineWidth = e, makeDirty$1(this, OUTLINE_WIDTH_INDEX$1)); + } + }, + /** + * Gets or sets the condition specifying at what distance from the camera that this point will be displayed. + * @memberof PointPrimitive.prototype + * @type {DistanceDisplayCondition} + * @default undefined + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + DistanceDisplayCondition.equals(this._distanceDisplayCondition, e) || (this._distanceDisplayCondition = DistanceDisplayCondition.clone( + e, + this._distanceDisplayCondition + ), makeDirty$1(this, DISTANCE_DISPLAY_CONDITION_INDEX$1)); + } + }, + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + * @memberof PointPrimitive.prototype + * @type {number} + * @default 0.0 + */ + disableDepthTestDistance: { + get: function() { + return this._disableDepthTestDistance; + }, + set: function(e) { + this._disableDepthTestDistance !== e && (this._disableDepthTestDistance = e, makeDirty$1(this, DISABLE_DEPTH_DISTANCE_INDEX$1)); + } + }, + /** + * Gets or sets the user-defined value returned when the point is picked. + * @memberof PointPrimitive.prototype + * @type {*} + */ + id: { + get: function() { + return this._id; + }, + set: function(e) { + this._id = e, defined(this._pickId) && (this._pickId.object.id = e); + } + }, + /** + * @private + */ + pickId: { + get: function() { + return this._pickId; + } + }, + /** + * Determines whether or not this point will be shown or hidden because it was clustered. + * @memberof PointPrimitive.prototype + * @type {boolean} + * @private + */ + clusterShow: { + get: function() { + return this._clusterShow; + }, + set: function(e) { + this._clusterShow !== e && (this._clusterShow = e, makeDirty$1(this, SHOW_INDEX$3)); + } + }, + /** + * The {@link SplitDirection} to apply to this point. + * @memberof PointPrimitive.prototype + * @type {SplitDirection} + * @default {@link SplitDirection.NONE} + */ + splitDirection: { + get: function() { + return this._splitDirection; + }, + set: function(e) { + this._splitDirection !== e && (this._splitDirection = e, makeDirty$1(this, SPLIT_DIRECTION_INDEX$1)); + } + } +}); +PointPrimitive.prototype.getPickId = function(e) { + return defined(this._pickId) || (this._pickId = e.createPickId({ + primitive: this, + collection: this._collection, + id: this._id + })), this._pickId; +}; +PointPrimitive.prototype._getActualPosition = function() { + return this._actualPosition; +}; +PointPrimitive.prototype._setActualPosition = function(e) { + Cartesian3.clone(e, this._actualPosition), makeDirty$1(this, POSITION_INDEX$3); +}; +const tempCartesian3 = new Cartesian4(); +PointPrimitive._computeActualPosition = function(e, t, n) { + return t.mode === SceneMode$1.SCENE3D ? e : (Matrix4.multiplyByPoint(n, e, tempCartesian3), SceneTransforms.computeActualEllipsoidPosition( + t, + tempCartesian3 + )); +}; +const scratchCartesian4$3 = new Cartesian4(); +PointPrimitive._computeScreenSpacePosition = function(e, t, n, i) { + const r = Matrix4.multiplyByVector( + e, + Cartesian4.fromElements( + t.x, + t.y, + t.z, + 1, + scratchCartesian4$3 + ), + scratchCartesian4$3 + ); + return SceneTransforms.worldToWindowCoordinates( + n, + r, + i + ); +}; +PointPrimitive.prototype.computeScreenSpacePosition = function(e, t) { + const n = this._pointPrimitiveCollection; + defined(t) || (t = new Cartesian2()); + const i = n.modelMatrix, r = PointPrimitive._computeScreenSpacePosition( + i, + this._actualPosition, + e, + t + ); + if (defined(r)) + return r.y = e.canvas.clientHeight - r.y, r; +}; +PointPrimitive.getScreenSpaceBoundingBox = function(e, t, n) { + const i = e.pixelSize, r = i * 0.5, o = t.x - r, s = t.y - r, c = i, l = i; + return defined(n) || (n = new BoundingRectangle()), n.x = o, n.y = s, n.width = c, n.height = l, n; +}; +PointPrimitive.prototype.equals = function(e) { + return this === e || defined(e) && this._id === e._id && Cartesian3.equals(this._position, e._position) && Color.equals(this._color, e._color) && this._pixelSize === e._pixelSize && this._outlineWidth === e._outlineWidth && this._show === e._show && Color.equals(this._outlineColor, e._outlineColor) && NearFarScalar.equals(this._scaleByDistance, e._scaleByDistance) && NearFarScalar.equals( + this._translucencyByDistance, + e._translucencyByDistance + ) && DistanceDisplayCondition.equals( + this._distanceDisplayCondition, + e._distanceDisplayCondition + ) && this._disableDepthTestDistance === e._disableDepthTestDistance && this._splitDirection === e._splitDirection; +}; +PointPrimitive.prototype._destroy = function() { + this._pickId = this._pickId && this._pickId.destroy(), this._pointPrimitiveCollection = void 0; +}; +const PointPrimitiveCollectionFS = `in vec4 v_color; +in vec4 v_outlineColor; +in float v_innerPercent; +in float v_pixelDistance; +in vec4 v_pickColor; +in float v_splitDirection; + +void main() +{ + if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; + if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; + + // The distance in UV space from this fragment to the center of the point, at most 0.5. + float distanceToCenter = length(gl_PointCoord - vec2(0.5)); + // The max distance stops one pixel shy of the edge to leave space for anti-aliasing. + float maxDistance = max(0.0, 0.5 - v_pixelDistance); + float wholeAlpha = 1.0 - smoothstep(maxDistance, 0.5, distanceToCenter); + float innerAlpha = 1.0 - smoothstep(maxDistance * v_innerPercent, 0.5 * v_innerPercent, distanceToCenter); + + vec4 color = mix(v_outlineColor, v_color, innerAlpha); + color.a *= wholeAlpha; + +// Fully transparent parts of the billboard are not pickable. +#if !defined(OPAQUE) && !defined(TRANSLUCENT) + if (color.a < 0.005) // matches 0/255 and 1/255 + { + discard; + } +#else +// The billboard is rendered twice. The opaque pass discards translucent fragments +// and the translucent pass discards opaque fragments. +#ifdef OPAQUE + if (color.a < 0.995) // matches < 254/255 + { + discard; + } +#else + if (color.a >= 0.995) // matches 254/255 and 255/255 + { + discard; + } +#endif +#endif + + out_FragColor = czm_gammaCorrect(color); + czm_writeLogDepth(); +} +`, PointPrimitiveCollectionVS = `uniform float u_maxTotalPointSize; + +in vec4 positionHighAndSize; +in vec4 positionLowAndOutline; +in vec4 compressedAttribute0; // color, outlineColor, pick color +in vec4 compressedAttribute1; // show, translucency by distance, some free space +in vec4 scaleByDistance; // near, nearScale, far, farScale +in vec4 distanceDisplayConditionAndDisableDepthAndSplitDirection; // near, far, disableDepthTestDistance, splitDirection + +out vec4 v_color; +out vec4 v_outlineColor; +out float v_innerPercent; +out float v_pixelDistance; +out vec4 v_pickColor; +out float v_splitDirection; + +const float SHIFT_LEFT8 = 256.0; +const float SHIFT_RIGHT8 = 1.0 / 256.0; + +void main() +{ + // Modifying this shader may also require modifications to PointPrimitive._computeScreenSpacePosition + + // unpack attributes + vec3 positionHigh = positionHighAndSize.xyz; + vec3 positionLow = positionLowAndOutline.xyz; + float outlineWidthBothSides = 2.0 * positionLowAndOutline.w; + float totalSize = positionHighAndSize.w + outlineWidthBothSides; + float outlinePercent = outlineWidthBothSides / totalSize; + // Scale in response to browser-zoom. + totalSize *= czm_pixelRatio; + + float temp = compressedAttribute1.x * SHIFT_RIGHT8; + float show = floor(temp); + +#ifdef EYE_DISTANCE_TRANSLUCENCY + vec4 translucencyByDistance; + translucencyByDistance.x = compressedAttribute1.z; + translucencyByDistance.z = compressedAttribute1.w; + + translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; + + temp = compressedAttribute1.y * SHIFT_RIGHT8; + translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; +#endif + + /////////////////////////////////////////////////////////////////////////// + + vec4 color; + vec4 outlineColor; + vec4 pickColor; + + // compressedAttribute0.z => pickColor.rgb + + temp = compressedAttribute0.z * SHIFT_RIGHT8; + pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; + pickColor.r = floor(temp); + + // compressedAttribute0.x => color.rgb + + temp = compressedAttribute0.x * SHIFT_RIGHT8; + color.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + color.g = (temp - floor(temp)) * SHIFT_LEFT8; + color.r = floor(temp); + + // compressedAttribute0.y => outlineColor.rgb + + temp = compressedAttribute0.y * SHIFT_RIGHT8; + outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; + temp = floor(temp) * SHIFT_RIGHT8; + outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; + outlineColor.r = floor(temp); + + // compressedAttribute0.w => color.a, outlineColor.a, pickColor.a + + temp = compressedAttribute0.w * SHIFT_RIGHT8; + pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; + pickColor = pickColor / 255.0; + + temp = floor(temp) * SHIFT_RIGHT8; + outlineColor.a = (temp - floor(temp)) * SHIFT_LEFT8; + outlineColor /= 255.0; + color.a = floor(temp); + color /= 255.0; + + /////////////////////////////////////////////////////////////////////////// + + vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + vec4 positionEC = czm_modelViewRelativeToEye * p; + + /////////////////////////////////////////////////////////////////////////// + +#if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) + float lengthSq; + if (czm_sceneMode == czm_sceneMode2D) + { + // 2D camera distance is a special case + // treat all billboards as flattened to the z=0.0 plane + lengthSq = czm_eyeHeight2D.y; + } + else + { + lengthSq = dot(positionEC.xyz, positionEC.xyz); + } +#endif + +#ifdef EYE_DISTANCE_SCALING + totalSize *= czm_nearFarScalar(scaleByDistance, lengthSq); +#endif + if (totalSize > 0.0) { + // Add padding for anti-aliasing on both sides. + totalSize += 3.0; + } + + // Clamp to max point size. + totalSize = min(totalSize, u_maxTotalPointSize); + // If size is too small, push vertex behind near plane for clipping. + // Note that context.minimumAliasedPointSize "will be at most 1.0". + if (totalSize < 1.0) + { + positionEC.xyz = vec3(0.0); + totalSize = 1.0; + } + + float translucency = 1.0; +#ifdef EYE_DISTANCE_TRANSLUCENCY + translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); + // push vertex behind near plane for clipping + if (translucency < 0.004) + { + positionEC.xyz = vec3(0.0); + } +#endif + +#ifdef DISTANCE_DISPLAY_CONDITION + float nearSq = distanceDisplayConditionAndDisableDepthAndSplitDirection.x; + float farSq = distanceDisplayConditionAndDisableDepthAndSplitDirection.y; + if (lengthSq < nearSq || lengthSq > farSq) { + // push vertex behind camera to force it to be clipped + positionEC.xyz = vec3(0.0, 0.0, 1.0); + } +#endif + + gl_Position = czm_projection * positionEC; + czm_vertexLogDepth(); + +#ifdef DISABLE_DEPTH_DISTANCE + float disableDepthTestDistance = distanceDisplayConditionAndDisableDepthAndSplitDirection.z; + if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) + { + disableDepthTestDistance = czm_minimumDisableDepthTestDistance; + } + + if (disableDepthTestDistance != 0.0) + { + // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. + float zclip = gl_Position.z / gl_Position.w; + bool clipped = (zclip < -1.0 || zclip > 1.0); + if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) + { + // Position z on the near plane. + gl_Position.z = -gl_Position.w; +#ifdef LOG_DEPTH + czm_vertexLogDepth(vec4(czm_currentFrustum.x)); +#endif + } + } +#endif + + v_color = color; + v_color.a *= translucency * show; + v_outlineColor = outlineColor; + v_outlineColor.a *= translucency * show; + + v_innerPercent = 1.0 - outlinePercent; + v_pixelDistance = 2.0 / totalSize; + gl_PointSize = totalSize * show; + gl_Position *= show; + + v_pickColor = pickColor; + v_splitDirection = distanceDisplayConditionAndDisableDepthAndSplitDirection.w; +} +`, SHOW_INDEX$2 = PointPrimitive.SHOW_INDEX, POSITION_INDEX$2 = PointPrimitive.POSITION_INDEX, COLOR_INDEX$2 = PointPrimitive.COLOR_INDEX, OUTLINE_COLOR_INDEX = PointPrimitive.OUTLINE_COLOR_INDEX, OUTLINE_WIDTH_INDEX = PointPrimitive.OUTLINE_WIDTH_INDEX, PIXEL_SIZE_INDEX = PointPrimitive.PIXEL_SIZE_INDEX, SCALE_BY_DISTANCE_INDEX = PointPrimitive.SCALE_BY_DISTANCE_INDEX, TRANSLUCENCY_BY_DISTANCE_INDEX = PointPrimitive.TRANSLUCENCY_BY_DISTANCE_INDEX, DISTANCE_DISPLAY_CONDITION_INDEX = PointPrimitive.DISTANCE_DISPLAY_CONDITION_INDEX, DISABLE_DEPTH_DISTANCE_INDEX = PointPrimitive.DISABLE_DEPTH_DISTANCE_INDEX, SPLIT_DIRECTION_INDEX = PointPrimitive.SPLIT_DIRECTION_INDEX, NUMBER_OF_PROPERTIES$1 = PointPrimitive.NUMBER_OF_PROPERTIES, attributeLocations$2 = { + positionHighAndSize: 0, + positionLowAndOutline: 1, + compressedAttribute0: 2, + // color, outlineColor, pick color + compressedAttribute1: 3, + // show, translucency by distance, some free space + scaleByDistance: 4, + distanceDisplayConditionAndDisableDepthAndSplitDirection: 5 +}; +function PointPrimitiveCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._sp = void 0, this._spTranslucent = void 0, this._rsOpaque = void 0, this._rsTranslucent = void 0, this._vaf = void 0, this._pointPrimitives = [], this._pointPrimitivesToUpdate = [], this._pointPrimitivesToUpdateIndex = 0, this._pointPrimitivesRemoved = !1, this._createVertexArray = !1, this._shaderScaleByDistance = !1, this._compiledShaderScaleByDistance = !1, this._shaderTranslucencyByDistance = !1, this._compiledShaderTranslucencyByDistance = !1, this._shaderDistanceDisplayCondition = !1, this._compiledShaderDistanceDisplayCondition = !1, this._shaderDisableDepthDistance = !1, this._compiledShaderDisableDepthDistance = !1, this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES$1), this._maxPixelSize = 1, this._baseVolume = new BoundingSphere(), this._baseVolumeWC = new BoundingSphere(), this._baseVolume2D = new BoundingSphere(), this._boundingVolume = new BoundingSphere(), this._boundingVolumeDirty = !1, this._colorCommands = [], this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY), this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.blendOption = defaultValue( + e.blendOption, + BlendOption$1.OPAQUE_AND_TRANSLUCENT + ), this._blendOption = void 0, this._mode = SceneMode$1.SCENE3D, this._maxTotalPointSize = 1, this._buffersUsage = [ + BufferUsage$1.STATIC_DRAW, + // SHOW_INDEX + BufferUsage$1.STATIC_DRAW, + // POSITION_INDEX + BufferUsage$1.STATIC_DRAW, + // COLOR_INDEX + BufferUsage$1.STATIC_DRAW, + // OUTLINE_COLOR_INDEX + BufferUsage$1.STATIC_DRAW, + // OUTLINE_WIDTH_INDEX + BufferUsage$1.STATIC_DRAW, + // PIXEL_SIZE_INDEX + BufferUsage$1.STATIC_DRAW, + // SCALE_BY_DISTANCE_INDEX + BufferUsage$1.STATIC_DRAW, + // TRANSLUCENCY_BY_DISTANCE_INDEX + BufferUsage$1.STATIC_DRAW + // DISTANCE_DISPLAY_CONDITION_INDEX + ]; + const t = this; + this._uniforms = { + u_maxTotalPointSize: function() { + return t._maxTotalPointSize; + } + }; +} +Object.defineProperties(PointPrimitiveCollection.prototype, { + /** + * Returns the number of points in this collection. This is commonly used with + * {@link PointPrimitiveCollection#get} to iterate over all the points + * in the collection. + * @memberof PointPrimitiveCollection.prototype + * @type {number} + */ + length: { + get: function() { + return removePointPrimitives(this), this._pointPrimitives.length; + } + } +}); +function destroyPointPrimitives(e) { + const t = e.length; + for (let n = 0; n < t; ++n) + e[n] && e[n]._destroy(); +} +PointPrimitiveCollection.prototype.add = function(e) { + const t = new PointPrimitive(e, this); + return t._index = this._pointPrimitives.length, this._pointPrimitives.push(t), this._createVertexArray = !0, t; +}; +PointPrimitiveCollection.prototype.remove = function(e) { + return this.contains(e) ? (this._pointPrimitives[e._index] = null, this._pointPrimitivesRemoved = !0, this._createVertexArray = !0, e._destroy(), !0) : !1; +}; +PointPrimitiveCollection.prototype.removeAll = function() { + destroyPointPrimitives(this._pointPrimitives), this._pointPrimitives = [], this._pointPrimitivesToUpdate = [], this._pointPrimitivesToUpdateIndex = 0, this._pointPrimitivesRemoved = !1, this._createVertexArray = !0; +}; +function removePointPrimitives(e) { + if (e._pointPrimitivesRemoved) { + e._pointPrimitivesRemoved = !1; + const t = [], n = e._pointPrimitives, i = n.length; + for (let r = 0, o = 0; r < i; ++r) { + const s = n[r]; + s && (s._index = o++, t.push(s)); + } + e._pointPrimitives = t; + } +} +PointPrimitiveCollection.prototype._updatePointPrimitive = function(e, t) { + e._dirty || (this._pointPrimitivesToUpdate[this._pointPrimitivesToUpdateIndex++] = e), ++this._propertiesChanged[t]; +}; +PointPrimitiveCollection.prototype.contains = function(e) { + return defined(e) && e._pointPrimitiveCollection === this; +}; +PointPrimitiveCollection.prototype.get = function(e) { + return removePointPrimitives(this), this._pointPrimitives[e]; +}; +PointPrimitiveCollection.prototype.computeNewBuffersUsage = function() { + const e = this._buffersUsage; + let t = !1; + const n = this._propertiesChanged; + for (let i = 0; i < NUMBER_OF_PROPERTIES$1; ++i) { + const r = n[i] === 0 ? BufferUsage$1.STATIC_DRAW : BufferUsage$1.STREAM_DRAW; + t = t || e[i] !== r, e[i] = r; + } + return t; +}; +function createVAF$1(e, t, n) { + return new VertexArrayFacade( + e, + [ + { + index: attributeLocations$2.positionHighAndSize, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[POSITION_INDEX$2] + }, + { + index: attributeLocations$2.positionLowAndShow, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[POSITION_INDEX$2] + }, + { + index: attributeLocations$2.compressedAttribute0, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[COLOR_INDEX$2] + }, + { + index: attributeLocations$2.compressedAttribute1, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[TRANSLUCENCY_BY_DISTANCE_INDEX] + }, + { + index: attributeLocations$2.scaleByDistance, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[SCALE_BY_DISTANCE_INDEX] + }, + { + index: attributeLocations$2.distanceDisplayConditionAndDisableDepthAndSplitDirection, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: n[DISTANCE_DISPLAY_CONDITION_INDEX] + } + ], + t + ); +} +const writePositionScratch$1 = new EncodedCartesian3(); +function writePositionSizeAndOutline(e, t, n, i) { + const r = i._index, o = i._getActualPosition(); + e._mode === SceneMode$1.SCENE3D && (BoundingSphere.expand( + e._baseVolume, + o, + e._baseVolume + ), e._boundingVolumeDirty = !0), EncodedCartesian3.fromCartesian(o, writePositionScratch$1); + const s = i.pixelSize, c = i.outlineWidth; + e._maxPixelSize = Math.max( + e._maxPixelSize, + s + c + ); + const l = n[attributeLocations$2.positionHighAndSize], d = writePositionScratch$1.high; + l(r, d.x, d.y, d.z, s); + const f = n[attributeLocations$2.positionLowAndOutline], h = writePositionScratch$1.low; + f(r, h.x, h.y, h.z, c); +} +const LEFT_SHIFT16 = 65536, LEFT_SHIFT8 = 256; +function writeCompressedAttrib0(e, t, n, i) { + const r = i._index, o = i.color, s = i.getPickId(t).color, c = i.outlineColor; + let l = Color.floatToByte(o.red), d = Color.floatToByte(o.green), f = Color.floatToByte(o.blue); + const h = l * LEFT_SHIFT16 + d * LEFT_SHIFT8 + f; + l = Color.floatToByte(c.red), d = Color.floatToByte(c.green), f = Color.floatToByte(c.blue); + const p = l * LEFT_SHIFT16 + d * LEFT_SHIFT8 + f; + l = Color.floatToByte(s.red), d = Color.floatToByte(s.green), f = Color.floatToByte(s.blue); + const m = l * LEFT_SHIFT16 + d * LEFT_SHIFT8 + f, _ = Color.floatToByte(o.alpha) * LEFT_SHIFT16 + Color.floatToByte(c.alpha) * LEFT_SHIFT8 + Color.floatToByte(s.alpha), y = n[attributeLocations$2.compressedAttribute0]; + y(r, h, p, m, _); +} +function writeCompressedAttrib1(e, t, n, i) { + const r = i._index; + let o = 0, s = 1, c = 1, l = 1; + const d = i.translucencyByDistance; + defined(d) && (o = d.near, s = d.nearValue, c = d.far, l = d.farValue, (s !== 1 || l !== 1) && (e._shaderTranslucencyByDistance = !0)); + let f = i.show && i.clusterShow; + i.color.alpha === 0 && i.outlineColor.alpha === 0 && (f = !1), s = CesiumMath.clamp(s, 0, 1), s = s === 1 ? 255 : s * 255 | 0; + const h = (f ? 1 : 0) * LEFT_SHIFT8 + s; + l = CesiumMath.clamp(l, 0, 1), l = l === 1 ? 255 : l * 255 | 0; + const p = l, m = n[attributeLocations$2.compressedAttribute1]; + m(r, h, p, o, c); +} +function writeScaleByDistance(e, t, n, i) { + const r = i._index, o = n[attributeLocations$2.scaleByDistance]; + let s = 0, c = 1, l = 1, d = 1; + const f = i.scaleByDistance; + defined(f) && (s = f.near, c = f.nearValue, l = f.far, d = f.farValue, (c !== 1 || d !== 1) && (e._shaderScaleByDistance = !0)), o(r, s, c, l, d); +} +function writeDistanceDisplayConditionAndDepthDisableAndSplitDirection(e, t, n, i) { + const r = i._index, o = n[attributeLocations$2.distanceDisplayConditionAndDisableDepthAndSplitDirection]; + let s = 0, c = Number.MAX_VALUE; + const l = i.distanceDisplayCondition; + defined(l) && (s = l.near, c = l.far, s *= s, c *= c, e._shaderDistanceDisplayCondition = !0); + let d = i.disableDepthTestDistance; + d *= d, d > 0 && (e._shaderDisableDepthDistance = !0, d === Number.POSITIVE_INFINITY && (d = -1)); + let f = 0; + const h = i.splitDirection; + defined(h) && (f = h), o(r, s, c, d, f); +} +function writePointPrimitive(e, t, n, i) { + writePositionSizeAndOutline( + e, + t, + n, + i + ), writeCompressedAttrib0( + e, + t, + n, + i + ), writeCompressedAttrib1( + e, + t, + n, + i + ), writeScaleByDistance( + e, + t, + n, + i + ), writeDistanceDisplayConditionAndDepthDisableAndSplitDirection( + e, + t, + n, + i + ); +} +function recomputeActualPositions(e, t, n, i, r, o) { + let s; + i.mode === SceneMode$1.SCENE3D ? (s = e._baseVolume, e._boundingVolumeDirty = !0) : s = e._baseVolume2D; + const c = []; + for (let l = 0; l < n; ++l) { + const d = t[l], f = d.position, h = PointPrimitive._computeActualPosition( + f, + i, + r + ); + defined(h) && (d._setActualPosition(h), o ? c.push(h) : BoundingSphere.expand(s, h, s)); + } + o && BoundingSphere.fromPoints(c, s); +} +function updateMode(e, t) { + const n = t.mode, i = e._pointPrimitives, r = e._pointPrimitivesToUpdate, o = e._modelMatrix; + e._createVertexArray || e._mode !== n || n !== SceneMode$1.SCENE3D && !Matrix4.equals(o, e.modelMatrix) ? (e._mode = n, Matrix4.clone(e.modelMatrix, o), e._createVertexArray = !0, (n === SceneMode$1.SCENE3D || n === SceneMode$1.SCENE2D || n === SceneMode$1.COLUMBUS_VIEW) && recomputeActualPositions( + e, + i, + i.length, + t, + o, + !0 + )) : n === SceneMode$1.MORPHING ? recomputeActualPositions( + e, + i, + i.length, + t, + o, + !0 + ) : (n === SceneMode$1.SCENE2D || n === SceneMode$1.COLUMBUS_VIEW) && recomputeActualPositions( + e, + r, + e._pointPrimitivesToUpdateIndex, + t, + o, + !1 + ); +} +function updateBoundingVolume(e, t, n) { + const r = t.camera.getPixelSize( + n, + t.context.drawingBufferWidth, + t.context.drawingBufferHeight + ) * e._maxPixelSize; + n.radius += r; +} +const scratchWriterArray$1 = []; +PointPrimitiveCollection.prototype.update = function(e) { + if (removePointPrimitives(this), !this.show) + return; + this._maxTotalPointSize = ContextLimits.maximumAliasedPointSize, updateMode(this, e); + const n = this._pointPrimitives.length, i = this._pointPrimitivesToUpdate, r = this._pointPrimitivesToUpdateIndex, o = this._propertiesChanged, s = this._createVertexArray; + let c; + const l = e.context, d = e.passes, f = d.pick; + if (s || !f && this.computeNewBuffersUsage()) { + this._createVertexArray = !1; + for (let E = 0; E < NUMBER_OF_PROPERTIES$1; ++E) + o[E] = 0; + if (this._vaf = this._vaf && this._vaf.destroy(), n > 0) { + this._vaf = createVAF$1(l, n, this._buffersUsage), c = this._vaf.writers; + for (let E = 0; E < n; ++E) { + const A = this._pointPrimitives[E]; + A._dirty = !1, writePointPrimitive(this, l, c, A); + } + this._vaf.commit(); + } + this._pointPrimitivesToUpdateIndex = 0; + } else if (r > 0) { + const E = scratchWriterArray$1; + E.length = 0, (o[POSITION_INDEX$2] || o[OUTLINE_WIDTH_INDEX] || o[PIXEL_SIZE_INDEX]) && E.push(writePositionSizeAndOutline), (o[COLOR_INDEX$2] || o[OUTLINE_COLOR_INDEX]) && E.push(writeCompressedAttrib0), (o[SHOW_INDEX$2] || o[TRANSLUCENCY_BY_DISTANCE_INDEX]) && E.push(writeCompressedAttrib1), o[SCALE_BY_DISTANCE_INDEX] && E.push(writeScaleByDistance), (o[DISTANCE_DISPLAY_CONDITION_INDEX] || o[DISABLE_DEPTH_DISTANCE_INDEX] || o[SPLIT_DIRECTION_INDEX]) && E.push( + writeDistanceDisplayConditionAndDepthDisableAndSplitDirection + ); + const A = E.length; + if (c = this._vaf.writers, r / n > 0.1) { + for (let D = 0; D < r; ++D) { + const P = i[D]; + P._dirty = !1; + for (let I = 0; I < A; ++I) + E[I](this, l, c, P); + } + this._vaf.commit(); + } else { + for (let D = 0; D < r; ++D) { + const P = i[D]; + P._dirty = !1; + for (let I = 0; I < A; ++I) + E[I](this, l, c, P); + this._vaf.subCommit(P._index, 1); + } + this._vaf.endSubCommits(); + } + this._pointPrimitivesToUpdateIndex = 0; + } + if (r > n * 1.5 && (i.length = n), !defined(this._vaf) || !defined(this._vaf.va)) + return; + this._boundingVolumeDirty && (this._boundingVolumeDirty = !1, BoundingSphere.transform( + this._baseVolume, + this.modelMatrix, + this._baseVolumeWC + )); + let h, p = Matrix4.IDENTITY; + e.mode === SceneMode$1.SCENE3D ? (p = this.modelMatrix, h = BoundingSphere.clone( + this._baseVolumeWC, + this._boundingVolume + )) : h = BoundingSphere.clone( + this._baseVolume2D, + this._boundingVolume + ), updateBoundingVolume(this, e, h); + const m = this._blendOption !== this.blendOption; + this._blendOption = this.blendOption, m && (this._blendOption === BlendOption$1.OPAQUE || this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT ? this._rsOpaque = RenderState.fromCache({ + depthTest: { + enabled: !0, + func: WebGLConstants$1.LEQUAL + }, + depthMask: !0 + }) : this._rsOpaque = void 0, this._blendOption === BlendOption$1.TRANSLUCENT || this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT ? this._rsTranslucent = RenderState.fromCache({ + depthTest: { + enabled: !0, + func: WebGLConstants$1.LEQUAL + }, + depthMask: !1, + blending: BlendingState$1.ALPHA_BLEND + }) : this._rsTranslucent = void 0), this._shaderDisableDepthDistance = this._shaderDisableDepthDistance || e.minimumDisableDepthTestDistance !== 0; + let _, y; + (m || this._shaderScaleByDistance && !this._compiledShaderScaleByDistance || this._shaderTranslucencyByDistance && !this._compiledShaderTranslucencyByDistance || this._shaderDistanceDisplayCondition && !this._compiledShaderDistanceDisplayCondition || this._shaderDisableDepthDistance !== this._compiledShaderDisableDepthDistance) && (_ = new ShaderSource({ + sources: [PointPrimitiveCollectionVS] + }), this._shaderScaleByDistance && _.defines.push("EYE_DISTANCE_SCALING"), this._shaderTranslucencyByDistance && _.defines.push("EYE_DISTANCE_TRANSLUCENCY"), this._shaderDistanceDisplayCondition && _.defines.push("DISTANCE_DISPLAY_CONDITION"), this._shaderDisableDepthDistance && _.defines.push("DISABLE_DEPTH_DISTANCE"), this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT && (y = new ShaderSource({ + defines: ["OPAQUE"], + sources: [PointPrimitiveCollectionFS] + }), this._sp = ShaderProgram.replaceCache({ + context: l, + shaderProgram: this._sp, + vertexShaderSource: _, + fragmentShaderSource: y, + attributeLocations: attributeLocations$2 + }), y = new ShaderSource({ + defines: ["TRANSLUCENT"], + sources: [PointPrimitiveCollectionFS] + }), this._spTranslucent = ShaderProgram.replaceCache({ + context: l, + shaderProgram: this._spTranslucent, + vertexShaderSource: _, + fragmentShaderSource: y, + attributeLocations: attributeLocations$2 + })), this._blendOption === BlendOption$1.OPAQUE && (y = new ShaderSource({ + sources: [PointPrimitiveCollectionFS] + }), this._sp = ShaderProgram.replaceCache({ + context: l, + shaderProgram: this._sp, + vertexShaderSource: _, + fragmentShaderSource: y, + attributeLocations: attributeLocations$2 + })), this._blendOption === BlendOption$1.TRANSLUCENT && (y = new ShaderSource({ + sources: [PointPrimitiveCollectionFS] + }), this._spTranslucent = ShaderProgram.replaceCache({ + context: l, + shaderProgram: this._spTranslucent, + vertexShaderSource: _, + fragmentShaderSource: y, + attributeLocations: attributeLocations$2 + })), this._compiledShaderScaleByDistance = this._shaderScaleByDistance, this._compiledShaderTranslucencyByDistance = this._shaderTranslucencyByDistance, this._compiledShaderDistanceDisplayCondition = this._shaderDistanceDisplayCondition, this._compiledShaderDisableDepthDistance = this._shaderDisableDepthDistance); + let C, T, x, b; + const S = e.commandList; + if (d.render || f) { + const E = this._colorCommands, A = this._blendOption === BlendOption$1.OPAQUE, D = this._blendOption === BlendOption$1.OPAQUE_AND_TRANSLUCENT; + C = this._vaf.va, T = C.length, E.length = T; + const P = D ? T * 2 : T; + for (b = 0; b < P; ++b) { + const I = A || D && b % 2 === 0; + x = E[b], defined(x) || (x = E[b] = new DrawCommand()), x.primitiveType = PrimitiveType$1.POINTS, x.pass = I || !D ? Pass$1.OPAQUE : Pass$1.TRANSLUCENT, x.owner = this; + const M = D ? Math.floor(b / 2) : b; + x.boundingVolume = h, x.modelMatrix = p, x.shaderProgram = I ? this._sp : this._spTranslucent, x.uniformMap = this._uniforms, x.vertexArray = C[M].va, x.renderState = I ? this._rsOpaque : this._rsTranslucent, x.debugShowBoundingVolume = this.debugShowBoundingVolume, x.pickId = "v_pickColor", S.push(x); + } + } +}; +PointPrimitiveCollection.prototype.isDestroyed = function() { + return !1; +}; +PointPrimitiveCollection.prototype.destroy = function() { + return this._sp = this._sp && this._sp.destroy(), this._spTranslucent = this._spTranslucent && this._spTranslucent.destroy(), this._spPick = this._spPick && this._spPick.destroy(), this._vaf = this._vaf && this._vaf.destroy(), destroyPointPrimitives(this._pointPrimitives), destroyObject(this); +}; +const ARRAY_TYPES = [ + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +], VERSION = 1, HEADER_SIZE = 8; +class KDBush { + /** + * Creates an index from raw `ArrayBuffer` data. + * @param {ArrayBuffer} data + */ + static from(t) { + if (!(t instanceof ArrayBuffer)) + throw new Error("Data must be an instance of ArrayBuffer."); + const [n, i] = new Uint8Array(t, 0, 2); + if (n !== 219) + throw new Error("Data does not appear to be in a KDBush format."); + const r = i >> 4; + if (r !== VERSION) + throw new Error(`Got v${r} data when expected v${VERSION}.`); + const o = ARRAY_TYPES[i & 15]; + if (!o) + throw new Error("Unrecognized array type."); + const [s] = new Uint16Array(t, 2, 1), [c] = new Uint32Array(t, 4, 1); + return new KDBush(c, s, o, t); + } + /** + * Creates an index that will hold a given number of items. + * @param {number} numItems + * @param {number} [nodeSize=64] Size of the KD-tree node (64 by default). + * @param {TypedArrayConstructor} [ArrayType=Float64Array] The array type used for coordinates storage (`Float64Array` by default). + * @param {ArrayBuffer} [data] (For internal use only) + */ + constructor(t, n = 64, i = Float64Array, r) { + if (isNaN(t) || t < 0) throw new Error(`Unpexpected numItems value: ${t}.`); + this.numItems = +t, this.nodeSize = Math.min(Math.max(+n, 2), 65535), this.ArrayType = i, this.IndexArrayType = t < 65536 ? Uint16Array : Uint32Array; + const o = ARRAY_TYPES.indexOf(this.ArrayType), s = t * 2 * this.ArrayType.BYTES_PER_ELEMENT, c = t * this.IndexArrayType.BYTES_PER_ELEMENT, l = (8 - c % 8) % 8; + if (o < 0) + throw new Error(`Unexpected typed array class: ${i}.`); + r && r instanceof ArrayBuffer ? (this.data = r, this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, t), this.coords = new this.ArrayType(this.data, HEADER_SIZE + c + l, t * 2), this._pos = t * 2, this._finished = !0) : (this.data = new ArrayBuffer(HEADER_SIZE + s + c + l), this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, t), this.coords = new this.ArrayType(this.data, HEADER_SIZE + c + l, t * 2), this._pos = 0, this._finished = !1, new Uint8Array(this.data, 0, 2).set([219, (VERSION << 4) + o]), new Uint16Array(this.data, 2, 1)[0] = n, new Uint32Array(this.data, 4, 1)[0] = t); + } + /** + * Add a point to the index. + * @param {number} x + * @param {number} y + * @returns {number} An incremental index associated with the added item (starting from `0`). + */ + add(t, n) { + const i = this._pos >> 1; + return this.ids[i] = i, this.coords[this._pos++] = t, this.coords[this._pos++] = n, i; + } + /** + * Perform indexing of the added points. + */ + finish() { + const t = this._pos >> 1; + if (t !== this.numItems) + throw new Error(`Added ${t} items when expected ${this.numItems}.`); + return sort$1(this.ids, this.coords, this.nodeSize, 0, this.numItems - 1, 0), this._finished = !0, this; + } + /** + * Search the index for items within a given bounding box. + * @param {number} minX + * @param {number} minY + * @param {number} maxX + * @param {number} maxY + * @returns {number[]} An array of indices correponding to the found items. + */ + range(t, n, i, r) { + if (!this._finished) throw new Error("Data not yet indexed - call index.finish()."); + const { ids: o, coords: s, nodeSize: c } = this, l = [0, o.length - 1, 0], d = []; + for (; l.length; ) { + const f = l.pop() || 0, h = l.pop() || 0, p = l.pop() || 0; + if (h - p <= c) { + for (let C = p; C <= h; C++) { + const T = s[2 * C], x = s[2 * C + 1]; + T >= t && T <= i && x >= n && x <= r && d.push(o[C]); + } + continue; + } + const m = p + h >> 1, _ = s[2 * m], y = s[2 * m + 1]; + _ >= t && _ <= i && y >= n && y <= r && d.push(o[m]), (f === 0 ? t <= _ : n <= y) && (l.push(p), l.push(m - 1), l.push(1 - f)), (f === 0 ? i >= _ : r >= y) && (l.push(m + 1), l.push(h), l.push(1 - f)); + } + return d; + } + /** + * Search the index for items within a given radius. + * @param {number} qx + * @param {number} qy + * @param {number} r Query radius. + * @returns {number[]} An array of indices correponding to the found items. + */ + within(t, n, i) { + if (!this._finished) throw new Error("Data not yet indexed - call index.finish()."); + const { ids: r, coords: o, nodeSize: s } = this, c = [0, r.length - 1, 0], l = [], d = i * i; + for (; c.length; ) { + const f = c.pop() || 0, h = c.pop() || 0, p = c.pop() || 0; + if (h - p <= s) { + for (let C = p; C <= h; C++) + sqDist(o[2 * C], o[2 * C + 1], t, n) <= d && l.push(r[C]); + continue; + } + const m = p + h >> 1, _ = o[2 * m], y = o[2 * m + 1]; + sqDist(_, y, t, n) <= d && l.push(r[m]), (f === 0 ? t - i <= _ : n - i <= y) && (c.push(p), c.push(m - 1), c.push(1 - f)), (f === 0 ? t + i >= _ : n + i >= y) && (c.push(m + 1), c.push(h), c.push(1 - f)); + } + return l; + } +} +function sort$1(e, t, n, i, r, o) { + if (r - i <= n) return; + const s = i + r >> 1; + select(e, t, s, i, r, o), sort$1(e, t, n, i, s - 1, 1 - o), sort$1(e, t, n, s + 1, r, 1 - o); +} +function select(e, t, n, i, r, o) { + for (; r > i; ) { + if (r - i > 600) { + const d = r - i + 1, f = n - i + 1, h = Math.log(d), p = 0.5 * Math.exp(2 * h / 3), m = 0.5 * Math.sqrt(h * p * (d - p) / d) * (f - d / 2 < 0 ? -1 : 1), _ = Math.max(i, Math.floor(n - f * p / d + m)), y = Math.min(r, Math.floor(n + (d - f) * p / d + m)); + select(e, t, n, _, y, o); + } + const s = t[2 * n + o]; + let c = i, l = r; + for (swapItem(e, t, i, n), t[2 * r + o] > s && swapItem(e, t, i, r); c < l; ) { + for (swapItem(e, t, c, l), c++, l--; t[2 * c + o] < s; ) c++; + for (; t[2 * l + o] > s; ) l--; + } + t[2 * i + o] === s ? swapItem(e, t, i, l) : (l++, swapItem(e, t, l, r)), l <= n && (i = l + 1), n <= l && (r = l - 1); + } +} +function swapItem(e, t, n, i) { + swap$2(e, n, i), swap$2(t, 2 * n, 2 * i), swap$2(t, 2 * n + 1, 2 * i + 1); +} +function swap$2(e, t, n) { + const i = e[t]; + e[t] = e[n], e[n] = i; +} +function sqDist(e, t, n, i) { + const r = e - n, o = t - i; + return r * r + o * o; +} +function EntityCluster(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._enabled = defaultValue(e.enabled, !1), this._pixelRange = defaultValue(e.pixelRange, 80), this._minimumClusterSize = defaultValue(e.minimumClusterSize, 2), this._clusterBillboards = defaultValue(e.clusterBillboards, !0), this._clusterLabels = defaultValue(e.clusterLabels, !0), this._clusterPoints = defaultValue(e.clusterPoints, !0), this._labelCollection = void 0, this._billboardCollection = void 0, this._pointCollection = void 0, this._clusterBillboardCollection = void 0, this._clusterLabelCollection = void 0, this._clusterPointCollection = void 0, this._collectionIndicesByEntity = {}, this._unusedLabelIndices = [], this._unusedBillboardIndices = [], this._unusedPointIndices = [], this._previousClusters = [], this._previousHeight = void 0, this._enabledDirty = !1, this._clusterDirty = !1, this._cluster = void 0, this._removeEventListener = void 0, this._clusterEvent = new Event(), this.show = defaultValue(e.show, !0); +} +function expandBoundingBox(e, t) { + e.x -= t, e.y -= t, e.width += t * 2, e.height += t * 2; +} +const labelBoundingBoxScratch = new BoundingRectangle(); +function getBoundingBox(e, t, n, i, r) { + if (defined(e._labelCollection) && i._clusterLabels ? r = Label.getScreenSpaceBoundingBox(e, t, r) : defined(e._billboardCollection) && i._clusterBillboards ? r = Billboard.getScreenSpaceBoundingBox(e, t, r) : defined(e._pointPrimitiveCollection) && i._clusterPoints && (r = PointPrimitive.getScreenSpaceBoundingBox(e, t, r)), expandBoundingBox(r, n), i._clusterLabels && !defined(e._labelCollection) && defined(e.id) && hasLabelIndex(i, e.id.id) && defined(e.id._label)) { + const o = i._collectionIndicesByEntity[e.id.id].labelIndex, s = i._labelCollection.get(o), c = Label.getScreenSpaceBoundingBox( + s, + t, + labelBoundingBoxScratch + ); + expandBoundingBox(c, n), r = BoundingRectangle.union(r, c, r); + } + return r; +} +function addNonClusteredItem(e, t) { + if (e.clusterShow = !0, !defined(e._labelCollection) && defined(e.id) && hasLabelIndex(t, e.id.id) && defined(e.id._label)) { + const n = t._collectionIndicesByEntity[e.id.id].labelIndex, i = t._labelCollection.get(n); + i.clusterShow = !0; + } +} +function addCluster(e, t, n, i) { + const r = { + billboard: i._clusterBillboardCollection.add(), + label: i._clusterLabelCollection.add(), + point: i._clusterPointCollection.add() + }; + r.billboard.show = !1, r.point.show = !1, r.label.show = !0, r.label.text = t.toLocaleString(), r.label.id = n, r.billboard.position = r.label.position = r.point.position = e, i._clusterEvent.raiseEvent(n, r); +} +function hasLabelIndex(e, t) { + return defined(e) && defined(e._collectionIndicesByEntity[t]) && defined(e._collectionIndicesByEntity[t].labelIndex); +} +function getScreenSpacePositions(e, t, n, i, r) { + if (!defined(e)) + return; + const o = e.length; + for (let s = 0; s < o; ++s) { + const c = e.get(s); + if (c.clusterShow = !1, !c.show || r._scene.mode === SceneMode$1.SCENE3D && !i.isPointVisible(c.position)) + continue; + const l = r._clusterLabels && defined(c._labelCollection), d = r._clusterBillboards && defined(c.id._billboard), f = r._clusterPoints && defined(c.id._point); + if (l && (f || d)) + continue; + const h = c.computeScreenSpacePosition(n); + defined(h) && t.push({ + index: s, + collection: e, + clustered: !1, + coord: h + }); + } +} +const pointBoundinRectangleScratch = new BoundingRectangle(), totalBoundingRectangleScratch = new BoundingRectangle(), neighborBoundingRectangleScratch = new BoundingRectangle(); +function createDeclutterCallback(e) { + return function(t) { + if (defined(t) && t < 0.05 || !e.enabled) + return; + const n = e._scene, i = e._labelCollection, r = e._billboardCollection, o = e._pointCollection; + if (!defined(i) && !defined(r) && !defined(o) || !e._clusterBillboards && !e._clusterLabels && !e._clusterPoints) + return; + let s = e._clusterLabelCollection, c = e._clusterBillboardCollection, l = e._clusterPointCollection; + defined(s) ? s.removeAll() : s = e._clusterLabelCollection = new LabelCollection( + { + scene: n + } + ), defined(c) ? c.removeAll() : c = e._clusterBillboardCollection = new BillboardCollection( + { + scene: n + } + ), defined(l) ? l.removeAll() : l = e._clusterPointCollection = new PointPrimitiveCollection(); + const d = e._pixelRange, f = e._minimumClusterSize, h = e._previousClusters, p = [], m = e._previousHeight, _ = n.camera.positionCartographic.height, y = n.ellipsoid, C = n.camera.positionWC, T = new EllipsoidalOccluder(y, C), x = []; + e._clusterLabels && getScreenSpacePositions( + i, + x, + n, + T, + e + ), e._clusterBillboards && getScreenSpacePositions( + r, + x, + n, + T, + e + ), e._clusterPoints && getScreenSpacePositions( + o, + x, + n, + T, + e + ); + let b, S, E, A, D, P, I, M, R, L, g, w; + if (x.length > 0) { + const O = new KDBush(x.length, 64, Uint32Array); + for (let N = 0; N < x.length; ++N) + O.add(x[N].coord.x, x[N].coord.y); + if (O.finish(), _ < m) + for (E = h.length, b = 0; b < E; ++b) { + const N = h[b]; + if (!T.isPointVisible(N.position)) + continue; + const F = Billboard._computeScreenSpacePosition( + Matrix4.IDENTITY, + N.position, + Cartesian3.ZERO, + Cartesian2.ZERO, + n + ); + if (!defined(F)) + continue; + const B = 1 - _ / m; + let V = N.width = N.width * B, U = N.height = N.height * B; + V = Math.max(V, N.minimumWidth), U = Math.max(U, N.minimumHeight); + const k = F.x - V * 0.5, $ = F.y - U * 0.5, G = F.x + V, q = F.y + U; + for (D = O.range(k, $, G, q), P = D.length, L = 0, R = [], S = 0; S < P; ++S) + I = D[S], M = x[I], M.clustered || (++L, g = M.collection, w = M.index, R.push(g.get(w).id)); + if (L >= f) + for (addCluster(N.position, L, R, e), p.push(N), S = 0; S < P; ++S) + x[D[S]].clustered = !0; + } + for (E = x.length, b = 0; b < E; ++b) { + const N = x[b]; + if (N.clustered) + continue; + N.clustered = !0, g = N.collection, w = N.index; + const F = g.get(w); + A = getBoundingBox( + F, + N.coord, + d, + e, + pointBoundinRectangleScratch + ); + const B = BoundingRectangle.clone( + A, + totalBoundingRectangleScratch + ); + D = O.range( + A.x, + A.y, + A.x + A.width, + A.y + A.height + ), P = D.length; + const V = Cartesian3.clone(F.position); + for (L = 1, R = [F.id], S = 0; S < P; ++S) + if (I = D[S], M = x[I], !M.clustered) { + const U = M.collection.get( + M.index + ), k = getBoundingBox( + U, + M.coord, + d, + e, + neighborBoundingRectangleScratch + ); + Cartesian3.add( + U.position, + V, + V + ), BoundingRectangle.union(B, k, B), ++L, R.push(U.id); + } + if (L >= f) { + const U = Cartesian3.multiplyByScalar( + V, + 1 / L, + V + ); + for (addCluster(U, L, R, e), p.push({ + position: U, + width: B.width, + height: B.height, + minimumWidth: A.width, + minimumHeight: A.height + }), S = 0; S < P; ++S) + x[D[S]].clustered = !0; + } else + addNonClusteredItem(F, e); + } + } + s.length === 0 && (s.destroy(), e._clusterLabelCollection = void 0), c.length === 0 && (c.destroy(), e._clusterBillboardCollection = void 0), l.length === 0 && (l.destroy(), e._clusterPointCollection = void 0), e._previousClusters = p, e._previousHeight = _; + }; +} +EntityCluster.prototype._initialize = function(e) { + this._scene = e; + const t = createDeclutterCallback(this); + this._cluster = t, this._removeEventListener = e.camera.changed.addEventListener(t); +}; +Object.defineProperties(EntityCluster.prototype, { + /** + * Gets or sets whether clustering is enabled. + * @memberof EntityCluster.prototype + * @type {boolean} + */ + enabled: { + get: function() { + return this._enabled; + }, + set: function(e) { + this._enabledDirty = e !== this._enabled, this._enabled = e; + } + }, + /** + * Gets or sets the pixel range to extend the screen space bounding box. + * @memberof EntityCluster.prototype + * @type {number} + */ + pixelRange: { + get: function() { + return this._pixelRange; + }, + set: function(e) { + this._clusterDirty = this._clusterDirty || e !== this._pixelRange, this._pixelRange = e; + } + }, + /** + * Gets or sets the minimum number of screen space objects that can be clustered. + * @memberof EntityCluster.prototype + * @type {number} + */ + minimumClusterSize: { + get: function() { + return this._minimumClusterSize; + }, + set: function(e) { + this._clusterDirty = this._clusterDirty || e !== this._minimumClusterSize, this._minimumClusterSize = e; + } + }, + /** + * Gets the event that will be raised when a new cluster will be displayed. The signature of the event listener is {@link EntityCluster.newClusterCallback}. + * @memberof EntityCluster.prototype + * @type {Event} + */ + clusterEvent: { + get: function() { + return this._clusterEvent; + } + }, + /** + * Gets or sets whether clustering billboard entities is enabled. + * @memberof EntityCluster.prototype + * @type {boolean} + */ + clusterBillboards: { + get: function() { + return this._clusterBillboards; + }, + set: function(e) { + this._clusterDirty = this._clusterDirty || e !== this._clusterBillboards, this._clusterBillboards = e; + } + }, + /** + * Gets or sets whether clustering labels entities is enabled. + * @memberof EntityCluster.prototype + * @type {boolean} + */ + clusterLabels: { + get: function() { + return this._clusterLabels; + }, + set: function(e) { + this._clusterDirty = this._clusterDirty || e !== this._clusterLabels, this._clusterLabels = e; + } + }, + /** + * Gets or sets whether clustering point entities is enabled. + * @memberof EntityCluster.prototype + * @type {boolean} + */ + clusterPoints: { + get: function() { + return this._clusterPoints; + }, + set: function(e) { + this._clusterDirty = this._clusterDirty || e !== this._clusterPoints, this._clusterPoints = e; + } + } +}); +function createGetEntity(e, t, n, i) { + return function(r) { + let o = this[e]; + defined(this._collectionIndicesByEntity) || (this._collectionIndicesByEntity = {}); + let s = this._collectionIndicesByEntity[r.id]; + if (defined(s) || (s = this._collectionIndicesByEntity[r.id] = { + billboardIndex: void 0, + labelIndex: void 0, + pointIndex: void 0 + }), defined(o) && defined(s[i])) + return o.get(s[i]); + defined(o) || (o = this[e] = new t({ + scene: this._scene + })); + let c, l; + const d = this[n]; + d.length > 0 ? (c = d.shift(), l = o.get(c)) : (l = o.add(), c = o.length - 1), s[i] = c; + const f = this; + return Promise.resolve().then(function() { + f._clusterDirty = !0; + }), l; + }; +} +function removeEntityIndicesIfUnused(e, t) { + const n = e._collectionIndicesByEntity[t]; + !defined(n.billboardIndex) && !defined(n.labelIndex) && !defined(n.pointIndex) && delete e._collectionIndicesByEntity[t]; +} +EntityCluster.prototype.getLabel = createGetEntity( + "_labelCollection", + LabelCollection, + "_unusedLabelIndices", + "labelIndex" +); +EntityCluster.prototype.removeLabel = function(e) { + const t = this._collectionIndicesByEntity && this._collectionIndicesByEntity[e.id]; + if (!defined(this._labelCollection) || !defined(t) || !defined(t.labelIndex)) + return; + const n = t.labelIndex; + t.labelIndex = void 0, removeEntityIndicesIfUnused(this, e.id); + const i = this._labelCollection.get(n); + i.show = !1, i.text = "", i.id = void 0, this._unusedLabelIndices.push(n), this._clusterDirty = !0; +}; +EntityCluster.prototype.getBillboard = createGetEntity( + "_billboardCollection", + BillboardCollection, + "_unusedBillboardIndices", + "billboardIndex" +); +EntityCluster.prototype.removeBillboard = function(e) { + const t = this._collectionIndicesByEntity && this._collectionIndicesByEntity[e.id]; + if (!defined(this._billboardCollection) || !defined(t) || !defined(t.billboardIndex)) + return; + const n = t.billboardIndex; + t.billboardIndex = void 0, removeEntityIndicesIfUnused(this, e.id); + const i = this._billboardCollection.get(n); + i.id = void 0, i.show = !1, i.image = void 0, this._unusedBillboardIndices.push(n), this._clusterDirty = !0; +}; +EntityCluster.prototype.getPoint = createGetEntity( + "_pointCollection", + PointPrimitiveCollection, + "_unusedPointIndices", + "pointIndex" +); +EntityCluster.prototype.removePoint = function(e) { + const t = this._collectionIndicesByEntity && this._collectionIndicesByEntity[e.id]; + if (!defined(this._pointCollection) || !defined(t) || !defined(t.pointIndex)) + return; + const n = t.pointIndex; + t.pointIndex = void 0, removeEntityIndicesIfUnused(this, e.id); + const i = this._pointCollection.get(n); + i.show = !1, i.id = void 0, this._unusedPointIndices.push(n), this._clusterDirty = !0; +}; +function disableCollectionClustering(e) { + if (!defined(e)) + return; + const t = e.length; + for (let n = 0; n < t; ++n) + e.get(n).clusterShow = !0; +} +function updateEnable(e) { + e.enabled || (defined(e._clusterLabelCollection) && e._clusterLabelCollection.destroy(), defined(e._clusterBillboardCollection) && e._clusterBillboardCollection.destroy(), defined(e._clusterPointCollection) && e._clusterPointCollection.destroy(), e._clusterLabelCollection = void 0, e._clusterBillboardCollection = void 0, e._clusterPointCollection = void 0, disableCollectionClustering(e._labelCollection), disableCollectionClustering(e._billboardCollection), disableCollectionClustering(e._pointCollection)); +} +EntityCluster.prototype.update = function(e) { + if (!this.show) + return; + let t; + defined(this._labelCollection) && this._labelCollection.length > 0 && this._labelCollection.get(0)._glyphs.length === 0 && (t = e.commandList, e.commandList = [], this._labelCollection.update(e), e.commandList = t), defined(this._billboardCollection) && this._billboardCollection.length > 0 && !defined(this._billboardCollection.get(0).width) && (t = e.commandList, e.commandList = [], this._billboardCollection.update(e), e.commandList = t), this._enabledDirty && (this._enabledDirty = !1, updateEnable(this), this._clusterDirty = !0), this._clusterDirty && (this._clusterDirty = !1, this._cluster()), defined(this._clusterLabelCollection) && this._clusterLabelCollection.update(e), defined(this._clusterBillboardCollection) && this._clusterBillboardCollection.update(e), defined(this._clusterPointCollection) && this._clusterPointCollection.update(e), defined(this._labelCollection) && this._labelCollection.update(e), defined(this._billboardCollection) && this._billboardCollection.update(e), defined(this._pointCollection) && this._pointCollection.update(e); +}; +EntityCluster.prototype.destroy = function() { + this._labelCollection = this._labelCollection && this._labelCollection.destroy(), this._billboardCollection = this._billboardCollection && this._billboardCollection.destroy(), this._pointCollection = this._pointCollection && this._pointCollection.destroy(), this._clusterLabelCollection = this._clusterLabelCollection && this._clusterLabelCollection.destroy(), this._clusterBillboardCollection = this._clusterBillboardCollection && this._clusterBillboardCollection.destroy(), this._clusterPointCollection = this._clusterPointCollection && this._clusterPointCollection.destroy(), defined(this._removeEventListener) && (this._removeEventListener(), this._removeEventListener = void 0), this._labelCollection = void 0, this._billboardCollection = void 0, this._pointCollection = void 0, this._clusterBillboardCollection = void 0, this._clusterLabelCollection = void 0, this._clusterPointCollection = void 0, this._collectionIndicesByEntity = void 0, this._unusedLabelIndices = [], this._unusedBillboardIndices = [], this._unusedPointIndices = [], this._previousClusters = [], this._previousHeight = void 0, this._enabledDirty = !1, this._pixelRangeDirty = !1, this._minimumClusterSizeDirty = !1; +}; +function CustomDataSource(e) { + this._name = e, this._clock = void 0, this._changed = new Event(), this._error = new Event(), this._isLoading = !1, this._loading = new Event(), this._entityCollection = new EntityCollection(this), this._entityCluster = new EntityCluster(); +} +Object.defineProperties(CustomDataSource.prototype, { + /** + * Gets or sets a human-readable name for this instance. + * @memberof CustomDataSource.prototype + * @type {string} + */ + name: { + get: function() { + return this._name; + }, + set: function(e) { + this._name !== e && (this._name = e, this._changed.raiseEvent(this)); + } + }, + /** + * Gets or sets the clock for this instance. + * @memberof CustomDataSource.prototype + * @type {DataSourceClock} + */ + clock: { + get: function() { + return this._clock; + }, + set: function(e) { + this._clock !== e && (this._clock = e, this._changed.raiseEvent(this)); + } + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof CustomDataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: function() { + return this._entityCollection; + } + }, + /** + * Gets or sets whether the data source is currently loading data. + * @memberof CustomDataSource.prototype + * @type {boolean} + */ + isLoading: { + get: function() { + return this._isLoading; + }, + set: function(e) { + DataSource.setLoading(this, e); + } + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof CustomDataSource.prototype + * @type {Event} + */ + changedEvent: { + get: function() { + return this._changed; + } + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof CustomDataSource.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._error; + } + }, + /** + * Gets an event that will be raised when the data source either starts or stops loading. + * @memberof CustomDataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: function() { + return this._loading; + } + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof CustomDataSource.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._entityCollection.show; + }, + set: function(e) { + this._entityCollection.show = e; + } + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof CustomDataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: function() { + return this._entityCluster; + }, + set: function(e) { + this._entityCluster = e; + } + } +}); +CustomDataSource.prototype.update = function(e) { + return !0; +}; +const CylinderGeometryLibrary = {}; +CylinderGeometryLibrary.computePositions = function(e, t, n, i, r) { + const o = e * 0.5, s = -o, c = i + i, l = r ? 2 * c : c, d = new Float64Array(l * 3); + let f, h = 0, p = 0; + const m = r ? c * 3 : 0, _ = r ? (c + i) * 3 : i * 3; + for (f = 0; f < i; f++) { + const y = f / i * CesiumMath.TWO_PI, C = Math.cos(y), T = Math.sin(y), x = C * n, b = T * n, S = C * t, E = T * t; + d[p + m] = x, d[p + m + 1] = b, d[p + m + 2] = s, d[p + _] = S, d[p + _ + 1] = E, d[p + _ + 2] = o, p += 3, r && (d[h++] = x, d[h++] = b, d[h++] = s, d[h++] = S, d[h++] = E, d[h++] = o); + } + return d; +}; +const radiusScratch$1 = new Cartesian2(), normalScratch$3 = new Cartesian3(), bitangentScratch$1 = new Cartesian3(), tangentScratch$1 = new Cartesian3(), positionScratch$6 = new Cartesian3(); +function CylinderGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.length, n = e.topRadius, i = e.bottomRadius, r = defaultValue(e.vertexFormat, VertexFormat.DEFAULT), o = defaultValue(e.slices, 128); + this._length = t, this._topRadius = n, this._bottomRadius = i, this._vertexFormat = VertexFormat.clone(r), this._slices = o, this._offsetAttribute = e.offsetAttribute, this._workerName = "createCylinderGeometry"; +} +CylinderGeometry.packedLength = VertexFormat.packedLength + 5; +CylinderGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._length, t[n++] = e._topRadius, t[n++] = e._bottomRadius, t[n++] = e._slices, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchVertexFormat$9 = new VertexFormat(), scratchOptions$f = { + vertexFormat: scratchVertexFormat$9, + length: void 0, + topRadius: void 0, + bottomRadius: void 0, + slices: void 0, + offsetAttribute: void 0 +}; +CylinderGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = VertexFormat.unpack( + e, + t, + scratchVertexFormat$9 + ); + t += VertexFormat.packedLength; + const r = e[t++], o = e[t++], s = e[t++], c = e[t++], l = e[t]; + return defined(n) ? (n._vertexFormat = VertexFormat.clone(i, n._vertexFormat), n._length = r, n._topRadius = o, n._bottomRadius = s, n._slices = c, n._offsetAttribute = l === -1 ? void 0 : l, n) : (scratchOptions$f.length = r, scratchOptions$f.topRadius = o, scratchOptions$f.bottomRadius = s, scratchOptions$f.slices = c, scratchOptions$f.offsetAttribute = l === -1 ? void 0 : l, new CylinderGeometry(scratchOptions$f)); +}; +CylinderGeometry.createGeometry = function(e) { + let t = e._length; + const n = e._topRadius, i = e._bottomRadius, r = e._vertexFormat, o = e._slices; + if (t <= 0 || n < 0 || i < 0 || n === 0 && i === 0) + return; + const s = o + o, c = o + s, l = s + s, d = CylinderGeometryLibrary.computePositions( + t, + n, + i, + o, + !0 + ), f = r.st ? new Float32Array(l * 2) : void 0, h = r.normal ? new Float32Array(l * 3) : void 0, p = r.tangent ? new Float32Array(l * 3) : void 0, m = r.bitangent ? new Float32Array(l * 3) : void 0; + let _; + const y = r.normal || r.tangent || r.bitangent; + if (y) { + const D = r.tangent || r.bitangent; + let P = 0, I = 0, M = 0; + const R = Math.atan2(i - n, t), L = normalScratch$3; + L.z = Math.sin(R); + const g = Math.cos(R); + let w = tangentScratch$1, O = bitangentScratch$1; + for (_ = 0; _ < o; _++) { + const N = _ / o * CesiumMath.TWO_PI, F = g * Math.cos(N), B = g * Math.sin(N); + y && (L.x = F, L.y = B, D && (w = Cartesian3.normalize( + Cartesian3.cross(Cartesian3.UNIT_Z, L, w), + w + )), r.normal && (h[P++] = L.x, h[P++] = L.y, h[P++] = L.z, h[P++] = L.x, h[P++] = L.y, h[P++] = L.z), r.tangent && (p[I++] = w.x, p[I++] = w.y, p[I++] = w.z, p[I++] = w.x, p[I++] = w.y, p[I++] = w.z), r.bitangent && (O = Cartesian3.normalize( + Cartesian3.cross(L, w, O), + O + ), m[M++] = O.x, m[M++] = O.y, m[M++] = O.z, m[M++] = O.x, m[M++] = O.y, m[M++] = O.z)); + } + for (_ = 0; _ < o; _++) + r.normal && (h[P++] = 0, h[P++] = 0, h[P++] = -1), r.tangent && (p[I++] = 1, p[I++] = 0, p[I++] = 0), r.bitangent && (m[M++] = 0, m[M++] = -1, m[M++] = 0); + for (_ = 0; _ < o; _++) + r.normal && (h[P++] = 0, h[P++] = 0, h[P++] = 1), r.tangent && (p[I++] = 1, p[I++] = 0, p[I++] = 0), r.bitangent && (m[M++] = 0, m[M++] = 1, m[M++] = 0); + } + const C = 12 * o - 12, T = IndexDatatype$1.createTypedArray(l, C); + let x = 0, b = 0; + for (_ = 0; _ < o - 1; _++) + T[x++] = b, T[x++] = b + 2, T[x++] = b + 3, T[x++] = b, T[x++] = b + 3, T[x++] = b + 1, b += 2; + for (T[x++] = s - 2, T[x++] = 0, T[x++] = 1, T[x++] = s - 2, T[x++] = 1, T[x++] = s - 1, _ = 1; _ < o - 1; _++) + T[x++] = s + _ + 1, T[x++] = s + _, T[x++] = s; + for (_ = 1; _ < o - 1; _++) + T[x++] = c, T[x++] = c + _, T[x++] = c + _ + 1; + let S = 0; + if (r.st) { + const D = Math.max(n, i); + for (_ = 0; _ < l; _++) { + const P = Cartesian3.fromArray(d, _ * 3, positionScratch$6); + f[S++] = (P.x + D) / (2 * D), f[S++] = (P.y + D) / (2 * D); + } + } + const E = new GeometryAttributes(); + r.position && (E.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: d + })), r.normal && (E.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: h + })), r.tangent && (E.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: p + })), r.bitangent && (E.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + })), r.st && (E.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: f + })), radiusScratch$1.x = t * 0.5, radiusScratch$1.y = Math.max(i, n); + const A = new BoundingSphere( + Cartesian3.ZERO, + Cartesian2.magnitude(radiusScratch$1) + ); + if (defined(e._offsetAttribute)) { + t = d.length; + const D = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, P = new Uint8Array(t / 3).fill(D); + E.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: P + }); + } + return new Geometry({ + attributes: E, + indices: T, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: A, + offsetAttribute: e._offsetAttribute + }); +}; +let unitCylinderGeometry; +CylinderGeometry.getUnitCylinder = function() { + return defined(unitCylinderGeometry) || (unitCylinderGeometry = CylinderGeometry.createGeometry( + new CylinderGeometry({ + topRadius: 1, + bottomRadius: 1, + length: 1, + vertexFormat: VertexFormat.POSITION_ONLY + }) + )), unitCylinderGeometry; +}; +const radiusScratch = new Cartesian2(); +function CylinderOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.length, n = e.topRadius, i = e.bottomRadius, r = defaultValue(e.slices, 128), o = Math.max( + defaultValue(e.numberOfVerticalLines, 16), + 0 + ); + this._length = t, this._topRadius = n, this._bottomRadius = i, this._slices = r, this._numberOfVerticalLines = o, this._offsetAttribute = e.offsetAttribute, this._workerName = "createCylinderOutlineGeometry"; +} +CylinderOutlineGeometry.packedLength = 6; +CylinderOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e._length, t[n++] = e._topRadius, t[n++] = e._bottomRadius, t[n++] = e._slices, t[n++] = e._numberOfVerticalLines, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchOptions$e = { + length: void 0, + topRadius: void 0, + bottomRadius: void 0, + slices: void 0, + numberOfVerticalLines: void 0, + offsetAttribute: void 0 +}; +CylinderOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = e[t++], r = e[t++], o = e[t++], s = e[t++], c = e[t++], l = e[t]; + return defined(n) ? (n._length = i, n._topRadius = r, n._bottomRadius = o, n._slices = s, n._numberOfVerticalLines = c, n._offsetAttribute = l === -1 ? void 0 : l, n) : (scratchOptions$e.length = i, scratchOptions$e.topRadius = r, scratchOptions$e.bottomRadius = o, scratchOptions$e.slices = s, scratchOptions$e.numberOfVerticalLines = c, scratchOptions$e.offsetAttribute = l === -1 ? void 0 : l, new CylinderOutlineGeometry(scratchOptions$e)); +}; +CylinderOutlineGeometry.createGeometry = function(e) { + let t = e._length; + const n = e._topRadius, i = e._bottomRadius, r = e._slices, o = e._numberOfVerticalLines; + if (t <= 0 || n < 0 || i < 0 || n === 0 && i === 0) + return; + const s = r * 2, c = CylinderGeometryLibrary.computePositions( + t, + n, + i, + r, + !1 + ); + let l = r * 2, d; + if (o > 0) { + const y = Math.min(o, r); + d = Math.round(r / y), l += y; + } + const f = IndexDatatype$1.createTypedArray(s, l * 2); + let h = 0, p; + for (p = 0; p < r - 1; p++) + f[h++] = p, f[h++] = p + 1, f[h++] = p + r, f[h++] = p + 1 + r; + if (f[h++] = r - 1, f[h++] = 0, f[h++] = r + r - 1, f[h++] = r, o > 0) + for (p = 0; p < r; p += d) + f[h++] = p, f[h++] = p + r; + const m = new GeometryAttributes(); + m.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: c + }), radiusScratch.x = t * 0.5, radiusScratch.y = Math.max(i, n); + const _ = new BoundingSphere( + Cartesian3.ZERO, + Cartesian2.magnitude(radiusScratch) + ); + if (defined(e._offsetAttribute)) { + t = c.length; + const y = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, C = new Uint8Array(t / 3).fill(y); + m.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: C + }); + } + return new Geometry({ + attributes: m, + indices: f, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: _, + offsetAttribute: e._offsetAttribute + }); +}; +const defaultOffset$8 = Cartesian3.ZERO, offsetScratch$7 = new Cartesian3(), positionScratch$5 = new Cartesian3(), scratchColor$d = new Color(); +function CylinderGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.length = void 0, this.topRadius = void 0, this.bottomRadius = void 0, this.slices = void 0, this.numberOfVerticalLines = void 0, this.offsetAttribute = void 0; +} +function CylinderGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new CylinderGeometryOptions(e), + geometryPropertyName: "cylinder", + observedPropertyNames: [ + "availability", + "position", + "orientation", + "cylinder" + ] + }), this._onEntityPropertyChanged(e, "cylinder", e.cylinder, void 0); +} +defined(Object.create) && (CylinderGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), CylinderGeometryUpdater.prototype.constructor = CylinderGeometryUpdater); +Object.defineProperties(CylinderGeometryUpdater.prototype, { + /** + * Gets the terrain offset property + * @type {TerrainOffsetProperty} + * @memberof CylinderGeometryUpdater.prototype + * @readonly + * @private + */ + terrainOffsetProperty: { + get: function() { + return this._terrainOffsetProperty; + } + } +}); +CylinderGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), s = { + show: i, + distanceDisplayCondition: o, + color: void 0, + offset: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let c; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (c = this._materialProperty.color.getValue(e, scratchColor$d)), defined(c) || (c = Color.WHITE), s.color = ColorGeometryInstanceAttribute.fromColor(c); + } + return defined(this._options.offsetAttribute) && (s.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$8, + offsetScratch$7 + ) + )), new GeometryInstance({ + id: t, + geometry: new CylinderGeometry(this._options), + modelMatrix: t.computeModelMatrixForHeightReference( + e, + t.cylinder.heightReference, + this._options.length * 0.5, + this._scene.ellipsoid + ), + attributes: s + }); +}; +CylinderGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$d + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (o.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$8, + offsetScratch$7 + ) + )), new GeometryInstance({ + id: t, + geometry: new CylinderOutlineGeometry(this._options), + modelMatrix: t.computeModelMatrixForHeightReference( + e, + t.cylinder.heightReference, + this._options.length * 0.5, + this._scene.ellipsoid + ), + attributes: o + }); +}; +CylinderGeometryUpdater.prototype._computeCenter = function(e, t) { + return Property.getValueOrUndefined(this._entity.position, e, t); +}; +CylinderGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(e.position) || !defined(t.length) || !defined(t.topRadius) || !defined(t.bottomRadius) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +CylinderGeometryUpdater.prototype._isDynamic = function(e, t) { + return !e.position.isConstant || // + !Property.isConstant(e.orientation) || // + !t.length.isConstant || // + !t.topRadius.isConstant || // + !t.bottomRadius.isConstant || // + !Property.isConstant(t.slices) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.numberOfVerticalLines); +}; +CylinderGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ), i = this._options; + i.vertexFormat = this._materialProperty instanceof ColorMaterialProperty ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, i.length = t.length.getValue(Iso8601.MINIMUM_VALUE), i.topRadius = t.topRadius.getValue(Iso8601.MINIMUM_VALUE), i.bottomRadius = t.bottomRadius.getValue(Iso8601.MINIMUM_VALUE), i.slices = Property.getValueOrUndefined( + t.slices, + Iso8601.MINIMUM_VALUE + ), i.numberOfVerticalLines = Property.getValueOrUndefined( + t.numberOfVerticalLines, + Iso8601.MINIMUM_VALUE + ), i.offsetAttribute = n !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0; +}; +CylinderGeometryUpdater.prototype._onEntityPropertyChanged = heightReferenceOnEntityPropertyChanged; +CylinderGeometryUpdater.DynamicGeometryUpdater = DynamicCylinderGeometryUpdater; +function DynamicCylinderGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicCylinderGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicCylinderGeometryUpdater.prototype.constructor = DynamicCylinderGeometryUpdater); +DynamicCylinderGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = this._options, r = Property.getValueOrUndefined( + e.position, + n, + positionScratch$5 + ); + return !defined(r) || !defined(i.length) || !defined(i.topRadius) || // + !defined(i.bottomRadius) || DynamicGeometryUpdater$1.prototype._isHidden.call( + this, + e, + t, + n + ); +}; +DynamicCylinderGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ), r = this._options; + r.length = Property.getValueOrUndefined(t.length, n), r.topRadius = Property.getValueOrUndefined(t.topRadius, n), r.bottomRadius = Property.getValueOrUndefined( + t.bottomRadius, + n + ), r.slices = Property.getValueOrUndefined(t.slices, n), r.numberOfVerticalLines = Property.getValueOrUndefined( + t.numberOfVerticalLines, + n + ), r.offsetAttribute = i !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0; +}; +const ClockRange = { + /** + * {@link Clock#tick} will always advances the clock in its current direction. + * + * @type {number} + * @constant + */ + UNBOUNDED: 0, + /** + * When {@link Clock#startTime} or {@link Clock#stopTime} is reached, + * {@link Clock#tick} will not advance {@link Clock#currentTime} any further. + * + * @type {number} + * @constant + */ + CLAMPED: 1, + /** + * When {@link Clock#stopTime} is reached, {@link Clock#tick} will advance + * {@link Clock#currentTime} to the opposite end of the interval. When + * time is moving backwards, {@link Clock#tick} will not advance past + * {@link Clock#startTime} + * + * @type {number} + * @constant + */ + LOOP_STOP: 2 +}, ClockRange$1 = Object.freeze(ClockRange), ClockStep = { + /** + * {@link Clock#tick} advances the current time by a fixed step, + * which is the number of seconds specified by {@link Clock#multiplier}. + * + * @type {number} + * @constant + */ + TICK_DEPENDENT: 0, + /** + * {@link Clock#tick} advances the current time by the amount of system + * time elapsed since the previous call multiplied by {@link Clock#multiplier}. + * + * @type {number} + * @constant + */ + SYSTEM_CLOCK_MULTIPLIER: 1, + /** + * {@link Clock#tick} sets the clock to the current system time; + * ignoring all other settings. + * + * @type {number} + * @constant + */ + SYSTEM_CLOCK: 2 +}, ClockStep$1 = Object.freeze(ClockStep), ExtrapolationType = { + /** + * No extrapolation occurs. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * The first or last value is used when outside the range of sample data. + * + * @type {number} + * @constant + */ + HOLD: 1, + /** + * The value is extrapolated. + * + * @type {number} + * @constant + */ + EXTRAPOLATE: 2 +}, ExtrapolationType$1 = Object.freeze(ExtrapolationType); +function getFilenameFromUri(e) { + const t = new Uri(e); + t.normalize(); + let n = t.path(); + const i = n.lastIndexOf("/"); + return i !== -1 && (n = n.substr(i + 1)), n; +} +const factorial = CesiumMath.factorial; +function calculateCoefficientTerm(e, t, n, i, r, o) { + let s = 0, c, l, d; + if (i > 0) { + for (l = 0; l < r; l++) { + for (c = !1, d = 0; d < o.length && !c; d++) + l === o[d] && (c = !0); + c || (o.push(l), s += calculateCoefficientTerm( + e, + t, + n, + i - 1, + r, + o + ), o.splice(o.length - 1, 1)); + } + return s; + } + for (s = 1, l = 0; l < r; l++) { + for (c = !1, d = 0; d < o.length && !c; d++) + l === o[d] && (c = !0); + c || (s *= e - n[t[l]]); + } + return s; +} +const HermitePolynomialApproximation = { + type: "Hermite" +}; +HermitePolynomialApproximation.getRequiredDataPoints = function(e, t) { + return t = defaultValue(t, 0), Math.max(Math.floor((e + 1) / (t + 1)), 2); +}; +HermitePolynomialApproximation.interpolateOrderZero = function(e, t, n, i, r) { + defined(r) || (r = new Array(i)); + let o, s, c, l, d, f; + const h = t.length, p = new Array(i); + for (o = 0; o < i; o++) { + r[o] = 0; + const C = new Array(h); + for (p[o] = C, s = 0; s < h; s++) + C[s] = []; + } + const m = h, _ = new Array(m); + for (o = 0; o < m; o++) + _[o] = o; + let y = h - 1; + for (l = 0; l < i; l++) { + for (s = 0; s < m; s++) + f = _[s] * i + l, p[l][0].push(n[f]); + for (o = 1; o < m; o++) { + let C = !1; + for (s = 0; s < m - o; s++) { + const T = t[_[s]], x = t[_[s + o]]; + let b; + x - T <= 0 ? (f = _[s] * i + i * o + l, b = n[f], p[l][o].push(b / factorial(o))) : (b = p[l][o - 1][s + 1] - p[l][o - 1][s], p[l][o].push(b / (x - T))), C = C || b !== 0; + } + C || (y = o - 1); + } + } + for (c = 0, d = 0; c <= d; c++) + for (o = c; o <= y; o++) { + const C = calculateCoefficientTerm(e, _, t, c, o, []); + for (l = 0; l < i; l++) { + const T = p[l][o][0]; + r[l + c * i] += T * C; + } + } + return r; +}; +const arrayScratch$1 = []; +HermitePolynomialApproximation.interpolate = function(e, t, n, i, r, o, s) { + const c = i * (o + 1); + defined(s) || (s = new Array(c)); + for (let T = 0; T < c; T++) + s[T] = 0; + const l = t.length, d = new Array(l * (r + 1)); + let f; + for (f = 0; f < l; f++) + for (let T = 0; T < r + 1; T++) + d[f * (r + 1) + T] = f; + const h = d.length, p = arrayScratch$1, m = fillCoefficientList( + p, + d, + t, + n, + i, + r + ), _ = [], y = h * (h + 1) / 2, C = Math.min(m, o); + for (let T = 0; T <= C; T++) + for (f = T; f <= m; f++) { + _.length = 0; + const x = calculateCoefficientTerm( + e, + d, + t, + T, + f, + _ + ), b = Math.floor(f * (1 - f) / 2) + h * f; + for (let S = 0; S < i; S++) { + const E = Math.floor(S * y), A = p[E + b]; + s[S + T * i] += A * x; + } + } + return s; +}; +function fillCoefficientList(e, t, n, i, r, o) { + let s, c, l = -1; + const d = t.length, f = d * (d + 1) / 2; + for (let h = 0; h < r; h++) { + const p = Math.floor(h * f); + for (s = 0; s < d; s++) + c = t[s] * r * (o + 1) + h, e[p + s] = i[c]; + for (let m = 1; m < d; m++) { + let _ = 0; + const y = Math.floor(m * (1 - m) / 2) + d * m; + let C = !1; + for (s = 0; s < d - m; s++) { + const T = n[t[s]], x = n[t[s + m]]; + let b, S; + if (x - T <= 0) + c = t[s] * r * (o + 1) + r * m + h, b = i[c], S = b / CesiumMath.factorial(m), e[p + y + _] = S, _++; + else { + const E = Math.floor((m - 1) * (2 - m) / 2) + d * (m - 1); + b = e[p + E + s + 1] - e[p + E + s], S = b / (x - T), e[p + y + _] = S, _++; + } + C = C || b !== 0; + } + C && (l = Math.max(l, m)); + } + } + return l; +} +const LagrangePolynomialApproximation = { + type: "Lagrange" +}; +LagrangePolynomialApproximation.getRequiredDataPoints = function(e) { + return Math.max(e + 1, 2); +}; +LagrangePolynomialApproximation.interpolateOrderZero = function(e, t, n, i, r) { + defined(r) || (r = new Array(i)); + let o, s; + const c = t.length; + for (o = 0; o < i; o++) + r[o] = 0; + for (o = 0; o < c; o++) { + let l = 1; + for (s = 0; s < c; s++) + if (s !== o) { + const d = t[o] - t[s]; + l *= (e - t[s]) / d; + } + for (s = 0; s < i; s++) + r[s] += l * n[o * i + s]; + } + return r; +}; +const LinearApproximation = { + type: "Linear" +}; +LinearApproximation.getRequiredDataPoints = function(e) { + return 2; +}; +LinearApproximation.interpolateOrderZero = function(e, t, n, i, r) { + defined(r) || (r = new Array(i)); + let o, s, c; + const l = t[0], d = t[1]; + for (o = 0; o < i; o++) + s = n[o], c = n[o + i], r[o] = ((c - s) * e + d * s - l * c) / (d - l); + return r; +}; +function Spherical(e, t, n) { + this.clock = defaultValue(e, 0), this.cone = defaultValue(t, 0), this.magnitude = defaultValue(n, 1); +} +Spherical.fromCartesian3 = function(e, t) { + const n = e.x, i = e.y, r = e.z, o = n * n + i * i; + return defined(t) || (t = new Spherical()), t.clock = Math.atan2(i, n), t.cone = Math.atan2(Math.sqrt(o), r), t.magnitude = Math.sqrt(o + r * r), t; +}; +Spherical.clone = function(e, t) { + if (defined(e)) + return defined(t) ? (t.clock = e.clock, t.cone = e.cone, t.magnitude = e.magnitude, t) : new Spherical(e.clock, e.cone, e.magnitude); +}; +Spherical.normalize = function(e, t) { + return defined(t) ? (t.clock = e.clock, t.cone = e.cone, t.magnitude = 1, t) : new Spherical(e.clock, e.cone, 1); +}; +Spherical.equals = function(e, t) { + return e === t || defined(e) && defined(t) && e.clock === t.clock && e.cone === t.cone && e.magnitude === t.magnitude; +}; +Spherical.equalsEpsilon = function(e, t, n) { + return n = defaultValue(n, 0), e === t || defined(e) && defined(t) && Math.abs(e.clock - t.clock) <= n && Math.abs(e.cone - t.cone) <= n && Math.abs(e.magnitude - t.magnitude) <= n; +}; +Spherical.prototype.equals = function(e) { + return Spherical.equals(this, e); +}; +Spherical.prototype.clone = function(e) { + return Spherical.clone(this, e); +}; +Spherical.prototype.equalsEpsilon = function(e, t) { + return Spherical.equalsEpsilon(this, e, t); +}; +Spherical.prototype.toString = function() { + return `(${this.clock}, ${this.cone}, ${this.magnitude})`; +}; +let getTimestamp; +typeof performance < "u" && typeof performance.now == "function" && isFinite(performance.now()) ? getTimestamp = function() { + return performance.now(); +} : getTimestamp = function() { + return Date.now(); +}; +const getTimestamp$1 = getTimestamp; +function Clock(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = e.currentTime, n = e.startTime, i = e.stopTime; + defined(t) ? t = JulianDate.clone(t) : defined(n) ? t = JulianDate.clone(n) : defined(i) ? t = JulianDate.addDays(i, -1, new JulianDate()) : t = JulianDate.now(), defined(n) ? n = JulianDate.clone(n) : n = JulianDate.clone(t), defined(i) ? i = JulianDate.clone(i) : i = JulianDate.addDays(n, 1, new JulianDate()), this.startTime = n, this.stopTime = i, this.clockRange = defaultValue(e.clockRange, ClockRange$1.UNBOUNDED), this.canAnimate = defaultValue(e.canAnimate, !0), this.onTick = new Event(), this.onStop = new Event(), this._currentTime = void 0, this._multiplier = void 0, this._clockStep = void 0, this._shouldAnimate = void 0, this._lastSystemTime = getTimestamp$1(), this.currentTime = t, this.multiplier = defaultValue(e.multiplier, 1), this.shouldAnimate = defaultValue(e.shouldAnimate, !1), this.clockStep = defaultValue( + e.clockStep, + ClockStep$1.SYSTEM_CLOCK_MULTIPLIER + ); +} +Object.defineProperties(Clock.prototype, { + /** + * The current time. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + * @memberof Clock.prototype + * @type {JulianDate} + */ + currentTime: { + get: function() { + return this._currentTime; + }, + set: function(e) { + JulianDate.equals(this._currentTime, e) || (this._clockStep === ClockStep$1.SYSTEM_CLOCK && (this._clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER), this._currentTime = e); + } + }, + /** + * Gets or sets how much time advances when {@link Clock#tick} is called. Negative values allow for advancing backwards. + * If {@link Clock#clockStep} is set to {@link ClockStep.TICK_DEPENDENT}, this is the number of seconds to advance. + * If {@link Clock#clockStep} is set to {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}, this value is multiplied by the + * elapsed system time since the last call to {@link Clock#tick}. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + * @memberof Clock.prototype + * @type {number} + * @default 1.0 + */ + multiplier: { + get: function() { + return this._multiplier; + }, + set: function(e) { + this._multiplier !== e && (this._clockStep === ClockStep$1.SYSTEM_CLOCK && (this._clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER), this._multiplier = e); + } + }, + /** + * Determines if calls to {@link Clock#tick} are frame dependent or system clock dependent. + * Changing this property to {@link ClockStep.SYSTEM_CLOCK} will set + * {@link Clock#multiplier} to 1.0, {@link Clock#shouldAnimate} to true, and + * {@link Clock#currentTime} to the current system clock time. + * @memberof Clock.prototype + * @type ClockStep + * @default {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER} + */ + clockStep: { + get: function() { + return this._clockStep; + }, + set: function(e) { + e === ClockStep$1.SYSTEM_CLOCK && (this._multiplier = 1, this._shouldAnimate = !0, this._currentTime = JulianDate.now()), this._clockStep = e; + } + }, + /** + * Indicates whether {@link Clock#tick} should attempt to advance time. + * The clock will only advance time when both + * {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + * @memberof Clock.prototype + * @type {boolean} + * @default false + */ + shouldAnimate: { + get: function() { + return this._shouldAnimate; + }, + set: function(e) { + this._shouldAnimate !== e && (this._clockStep === ClockStep$1.SYSTEM_CLOCK && (this._clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER), this._shouldAnimate = e); + } + } +}); +Clock.prototype.tick = function() { + const e = getTimestamp$1(); + let t = JulianDate.clone(this._currentTime); + if (this.canAnimate && this._shouldAnimate) { + const n = this._clockStep; + if (n === ClockStep$1.SYSTEM_CLOCK) + t = JulianDate.now(t); + else { + const i = this._multiplier; + if (n === ClockStep$1.TICK_DEPENDENT) + t = JulianDate.addSeconds( + t, + i, + t + ); + else { + const c = e - this._lastSystemTime; + t = JulianDate.addSeconds( + t, + i * (c / 1e3), + t + ); + } + const r = this.clockRange, o = this.startTime, s = this.stopTime; + if (r === ClockRange$1.CLAMPED) + JulianDate.lessThan(t, o) ? t = JulianDate.clone(o, t) : JulianDate.greaterThan(t, s) && (t = JulianDate.clone(s, t), this.onStop.raiseEvent(this)); + else if (r === ClockRange$1.LOOP_STOP) + for (JulianDate.lessThan(t, o) && (t = JulianDate.clone(o, t)); JulianDate.greaterThan(t, s); ) + t = JulianDate.addSeconds( + o, + JulianDate.secondsDifference(t, s), + t + ), this.onStop.raiseEvent(this); + } + } + return this._currentTime = t, this._lastSystemTime = e, this.onTick.raiseEvent(this), t; +}; +function DataSourceClock() { + this._definitionChanged = new Event(), this._startTime = void 0, this._stopTime = void 0, this._currentTime = void 0, this._clockRange = void 0, this._clockStep = void 0, this._multiplier = void 0; +} +Object.defineProperties(DataSourceClock.prototype, { + /** + * Gets the event that is raised whenever a new property is assigned. + * @memberof DataSourceClock.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the desired start time of the clock. + * See {@link Clock#startTime}. + * @memberof DataSourceClock.prototype + * @type {JulianDate} + */ + startTime: createRawPropertyDescriptor("startTime"), + /** + * Gets or sets the desired stop time of the clock. + * See {@link Clock#stopTime}. + * @memberof DataSourceClock.prototype + * @type {JulianDate} + */ + stopTime: createRawPropertyDescriptor("stopTime"), + /** + * Gets or sets the desired current time when this data source is loaded. + * See {@link Clock#currentTime}. + * @memberof DataSourceClock.prototype + * @type {JulianDate} + */ + currentTime: createRawPropertyDescriptor("currentTime"), + /** + * Gets or sets the desired clock range setting. + * See {@link Clock#clockRange}. + * @memberof DataSourceClock.prototype + * @type {ClockRange} + */ + clockRange: createRawPropertyDescriptor("clockRange"), + /** + * Gets or sets the desired clock step setting. + * See {@link Clock#clockStep}. + * @memberof DataSourceClock.prototype + * @type {ClockStep} + */ + clockStep: createRawPropertyDescriptor("clockStep"), + /** + * Gets or sets the desired clock multiplier. + * See {@link Clock#multiplier}. + * @memberof DataSourceClock.prototype + * @type {number} + */ + multiplier: createRawPropertyDescriptor("multiplier") +}); +DataSourceClock.prototype.clone = function(e) { + return defined(e) || (e = new DataSourceClock()), e.startTime = this.startTime, e.stopTime = this.stopTime, e.currentTime = this.currentTime, e.clockRange = this.clockRange, e.clockStep = this.clockStep, e.multiplier = this.multiplier, e; +}; +DataSourceClock.prototype.equals = function(e) { + return this === e || defined(e) && JulianDate.equals(this.startTime, e.startTime) && JulianDate.equals(this.stopTime, e.stopTime) && JulianDate.equals(this.currentTime, e.currentTime) && this.clockRange === e.clockRange && this.clockStep === e.clockStep && this.multiplier === e.multiplier; +}; +DataSourceClock.prototype.merge = function(e) { + this.startTime = defaultValue(this.startTime, e.startTime), this.stopTime = defaultValue(this.stopTime, e.stopTime), this.currentTime = defaultValue(this.currentTime, e.currentTime), this.clockRange = defaultValue(this.clockRange, e.clockRange), this.clockStep = defaultValue(this.clockStep, e.clockStep), this.multiplier = defaultValue(this.multiplier, e.multiplier); +}; +DataSourceClock.prototype.getValue = function(e) { + return defined(e) || (e = new Clock()), e.startTime = defaultValue(this.startTime, e.startTime), e.stopTime = defaultValue(this.stopTime, e.stopTime), e.currentTime = defaultValue(this.currentTime, e.currentTime), e.clockRange = defaultValue(this.clockRange, e.clockRange), e.multiplier = defaultValue(this.multiplier, e.multiplier), e.clockStep = defaultValue(this.clockStep, e.clockStep), e; +}; +const defaultColor$6 = Color.WHITE, defaultCellAlpha = 0.1, defaultLineCount = new Cartesian2(8, 8), defaultLineOffset = new Cartesian2(0, 0), defaultLineThickness = new Cartesian2(1, 1); +function GridMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this._cellAlpha = void 0, this._cellAlphaSubscription = void 0, this._lineCount = void 0, this._lineCountSubscription = void 0, this._lineThickness = void 0, this._lineThicknessSubscription = void 0, this._lineOffset = void 0, this._lineOffsetSubscription = void 0, this.color = e.color, this.cellAlpha = e.cellAlpha, this.lineCount = e.lineCount, this.lineThickness = e.lineThickness, this.lineOffset = e.lineOffset; +} +Object.defineProperties(GridMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof GridMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color) && Property.isConstant(this._cellAlpha) && Property.isConstant(this._lineCount) && Property.isConstant(this._lineThickness) && Property.isConstant(this._lineOffset); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof GridMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the grid {@link Color}. + * @memberof GridMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the numeric Property specifying cell alpha values. + * @memberof GridMaterialProperty.prototype + * @type {Property|undefined} + * @default 0.1 + */ + cellAlpha: createPropertyDescriptor("cellAlpha"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of grid lines along each axis. + * @memberof GridMaterialProperty.prototype + * @type {Property|undefined} + * @default new Cartesian2(8.0, 8.0) + */ + lineCount: createPropertyDescriptor("lineCount"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the thickness of grid lines along each axis. + * @memberof GridMaterialProperty.prototype + * @type {Property|undefined} + * @default new Cartesian2(1.0, 1.0) + */ + lineThickness: createPropertyDescriptor("lineThickness"), + /** + * Gets or sets the {@link Cartesian2} Property specifying the starting offset of grid lines along each axis. + * @memberof GridMaterialProperty.prototype + * @type {Property|undefined} + * @default new Cartesian2(0.0, 0.0) + */ + lineOffset: createPropertyDescriptor("lineOffset") +}); +GridMaterialProperty.prototype.getType = function(e) { + return "Grid"; +}; +const timeScratch$f = new JulianDate(); +GridMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$f)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + defaultColor$6, + t.color + ), t.cellAlpha = Property.getValueOrDefault( + this._cellAlpha, + e, + defaultCellAlpha + ), t.lineCount = Property.getValueOrClonedDefault( + this._lineCount, + e, + defaultLineCount, + t.lineCount + ), t.lineThickness = Property.getValueOrClonedDefault( + this._lineThickness, + e, + defaultLineThickness, + t.lineThickness + ), t.lineOffset = Property.getValueOrClonedDefault( + this._lineOffset, + e, + defaultLineOffset, + t.lineOffset + ), t; +}; +GridMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof GridMaterialProperty && // + Property.equals(this._color, e._color) && // + Property.equals(this._cellAlpha, e._cellAlpha) && // + Property.equals(this._lineCount, e._lineCount) && // + Property.equals(this._lineThickness, e._lineThickness) && // + Property.equals(this._lineOffset, e._lineOffset); +}; +function PolylineArrowMaterialProperty(e) { + this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this.color = e; +} +Object.defineProperties(PolylineArrowMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof PolylineArrowMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof PolylineArrowMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the {@link Color} {@link Property}. + * @memberof PolylineArrowMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color") +}); +PolylineArrowMaterialProperty.prototype.getType = function(e) { + return "PolylineArrow"; +}; +const timeScratch$e = new JulianDate(); +PolylineArrowMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$e)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + Color.WHITE, + t.color + ), t; +}; +PolylineArrowMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof PolylineArrowMaterialProperty && // + Property.equals(this._color, e._color); +}; +const defaultColor$5 = Color.WHITE, defaultGapColor = Color.TRANSPARENT, defaultDashLength = 16, defaultDashPattern = 255; +function PolylineDashMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this._gapColor = void 0, this._gapColorSubscription = void 0, this._dashLength = void 0, this._dashLengthSubscription = void 0, this._dashPattern = void 0, this._dashPatternSubscription = void 0, this.color = e.color, this.gapColor = e.gapColor, this.dashLength = e.dashLength, this.dashPattern = e.dashPattern; +} +Object.defineProperties(PolylineDashMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof PolylineDashMaterialProperty.prototype + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color) && Property.isConstant(this._gapColor) && Property.isConstant(this._dashLength) && Property.isConstant(this._dashPattern); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof PolylineDashMaterialProperty.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the {@link Color} of the line. + * @memberof PolylineDashMaterialProperty.prototype + * @type {Property|undefined} + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the Property specifying the {@link Color} of the gaps in the line. + * @memberof PolylineDashMaterialProperty.prototype + * @type {Property|undefined} + */ + gapColor: createPropertyDescriptor("gapColor"), + /** + * Gets or sets the numeric Property specifying the length of a dash cycle + * @memberof PolylineDashMaterialProperty.prototype + * @type {Property|undefined} + */ + dashLength: createPropertyDescriptor("dashLength"), + /** + * Gets or sets the numeric Property specifying a dash pattern + * @memberof PolylineDashMaterialProperty.prototype + * @type {Property|undefined} + */ + dashPattern: createPropertyDescriptor("dashPattern") +}); +PolylineDashMaterialProperty.prototype.getType = function(e) { + return "PolylineDash"; +}; +const timeScratch$d = new JulianDate(); +PolylineDashMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$d)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + defaultColor$5, + t.color + ), t.gapColor = Property.getValueOrClonedDefault( + this._gapColor, + e, + defaultGapColor, + t.gapColor + ), t.dashLength = Property.getValueOrDefault( + this._dashLength, + e, + defaultDashLength, + t.dashLength + ), t.dashPattern = Property.getValueOrDefault( + this._dashPattern, + e, + defaultDashPattern, + t.dashPattern + ), t; +}; +PolylineDashMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof PolylineDashMaterialProperty && Property.equals(this._color, e._color) && Property.equals(this._gapColor, e._gapColor) && Property.equals(this._dashLength, e._dashLength) && Property.equals(this._dashPattern, e._dashPattern); +}; +const defaultColor$4 = Color.WHITE, defaultGlowPower = 0.25, defaultTaperPower = 1; +function PolylineGlowMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this._glowPower = void 0, this._glowPowerSubscription = void 0, this._taperPower = void 0, this._taperPowerSubscription = void 0, this.color = e.color, this.glowPower = e.glowPower, this.taperPower = e.taperPower; +} +Object.defineProperties(PolylineGlowMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof PolylineGlowMaterialProperty.prototype + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color) && Property.isConstant(this._glow); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof PolylineGlowMaterialProperty.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the {@link Color} of the line. + * @memberof PolylineGlowMaterialProperty.prototype + * @type {Property|undefined} + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the numeric Property specifying the strength of the glow, as a percentage of the total line width (less than 1.0). + * @memberof PolylineGlowMaterialProperty.prototype + * @type {Property|undefined} + */ + glowPower: createPropertyDescriptor("glowPower"), + /** + * Gets or sets the numeric Property specifying the strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used. + * @memberof PolylineGlowMaterialProperty.prototype + * @type {Property|undefined} + */ + taperPower: createPropertyDescriptor("taperPower") +}); +PolylineGlowMaterialProperty.prototype.getType = function(e) { + return "PolylineGlow"; +}; +const timeScratch$c = new JulianDate(); +PolylineGlowMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$c)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + defaultColor$4, + t.color + ), t.glowPower = Property.getValueOrDefault( + this._glowPower, + e, + defaultGlowPower, + t.glowPower + ), t.taperPower = Property.getValueOrDefault( + this._taperPower, + e, + defaultTaperPower, + t.taperPower + ), t; +}; +PolylineGlowMaterialProperty.prototype.equals = function(e) { + return this === e || e instanceof PolylineGlowMaterialProperty && Property.equals(this._color, e._color) && Property.equals(this._glowPower, e._glowPower) && Property.equals(this._taperPower, e._taperPower); +}; +const defaultColor$3 = Color.WHITE, defaultOutlineColor$2 = Color.BLACK, defaultOutlineWidth$2 = 1; +function PolylineOutlineMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._color = void 0, this._colorSubscription = void 0, this._outlineColor = void 0, this._outlineColorSubscription = void 0, this._outlineWidth = void 0, this._outlineWidthSubscription = void 0, this.color = e.color, this.outlineColor = e.outlineColor, this.outlineWidth = e.outlineWidth; +} +Object.defineProperties(PolylineOutlineMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof PolylineOutlineMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._color) && Property.isConstant(this._outlineColor) && Property.isConstant(this._outlineWidth); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof PolylineOutlineMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the {@link Color} of the line. + * @memberof PolylineOutlineMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + color: createPropertyDescriptor("color"), + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + * @memberof PolylineOutlineMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + outlineColor: createPropertyDescriptor("outlineColor"), + /** + * Gets or sets the numeric Property specifying the width of the outline. + * @memberof PolylineOutlineMaterialProperty.prototype + * @type {Property|undefined} + * @default 1.0 + */ + outlineWidth: createPropertyDescriptor("outlineWidth") +}); +PolylineOutlineMaterialProperty.prototype.getType = function(e) { + return "PolylineOutline"; +}; +const timeScratch$b = new JulianDate(); +PolylineOutlineMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$b)), defined(t) || (t = {}), t.color = Property.getValueOrClonedDefault( + this._color, + e, + defaultColor$3, + t.color + ), t.outlineColor = Property.getValueOrClonedDefault( + this._outlineColor, + e, + defaultOutlineColor$2, + t.outlineColor + ), t.outlineWidth = Property.getValueOrDefault( + this._outlineWidth, + e, + defaultOutlineWidth$2 + ), t; +}; +PolylineOutlineMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof PolylineOutlineMaterialProperty && // + Property.equals(this._color, e._color) && // + Property.equals(this._outlineColor, e._outlineColor) && // + Property.equals(this._outlineWidth, e._outlineWidth); +}; +function PositionPropertyArray(e, t) { + this._value = void 0, this._definitionChanged = new Event(), this._eventHelper = new EventHelper(), this._referenceFrame = defaultValue(t, ReferenceFrame$1.FIXED), this.setValue(e); +} +Object.defineProperties(PositionPropertyArray.prototype, { + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + * @memberof PositionPropertyArray.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + const e = this._value; + if (!defined(e)) + return !0; + const t = e.length; + for (let n = 0; n < t; n++) + if (!Property.isConstant(e[n])) + return !1; + return !0; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + * @memberof PositionPropertyArray.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the reference frame in which the position is defined. + * @memberof PositionPropertyArray.prototype + * @type {ReferenceFrame} + * @default ReferenceFrame.FIXED; + */ + referenceFrame: { + get: function() { + return this._referenceFrame; + } + } +}); +const timeScratch$a = new JulianDate(); +PositionPropertyArray.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$a)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +PositionPropertyArray.prototype.getValueInReferenceFrame = function(e, t, n) { + const i = this._value; + if (!defined(i)) + return; + const r = i.length; + defined(n) || (n = new Array(r)); + let o = 0, s = 0; + for (; o < r; ) { + const l = i[o].getValueInReferenceFrame( + e, + t, + n[o] + ); + defined(l) && (n[s] = l, s++), o++; + } + return n.length = s, n; +}; +PositionPropertyArray.prototype.setValue = function(e) { + const t = this._eventHelper; + if (t.removeAll(), defined(e)) { + this._value = e.slice(); + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i]; + defined(r) && t.add( + r.definitionChanged, + PositionPropertyArray.prototype._raiseDefinitionChanged, + this + ); + } + } else + this._value = void 0; + this._definitionChanged.raiseEvent(this); +}; +PositionPropertyArray.prototype.equals = function(e) { + return this === e || // + e instanceof PositionPropertyArray && // + this._referenceFrame === e._referenceFrame && // + Property.arrayEquals(this._value, e._value); +}; +PositionPropertyArray.prototype._raiseDefinitionChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +function PropertyArray(e) { + this._value = void 0, this._definitionChanged = new Event(), this._eventHelper = new EventHelper(), this.setValue(e); +} +Object.defineProperties(PropertyArray.prototype, { + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + * @memberof PropertyArray.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + const e = this._value; + if (!defined(e)) + return !0; + const t = e.length; + for (let n = 0; n < t; n++) + if (!Property.isConstant(e[n])) + return !1; + return !0; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + * @memberof PropertyArray.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +const timeScratch$9 = new JulianDate(); +PropertyArray.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$9)); + const n = this._value; + if (!defined(n)) + return; + const i = n.length; + defined(t) || (t = new Array(i)); + let r = 0, o = 0; + for (; r < i; ) { + const c = this._value[r].getValue(e, t[r]); + defined(c) && (t[o] = c, o++), r++; + } + return t.length = o, t; +}; +PropertyArray.prototype.setValue = function(e) { + const t = this._eventHelper; + if (t.removeAll(), defined(e)) { + this._value = e.slice(); + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i]; + defined(r) && t.add( + r.definitionChanged, + PropertyArray.prototype._raiseDefinitionChanged, + this + ); + } + } else + this._value = void 0; + this._definitionChanged.raiseEvent(this); +}; +PropertyArray.prototype.equals = function(e) { + return this === e || // + e instanceof PropertyArray && // + Property.arrayEquals(this._value, e._value); +}; +PropertyArray.prototype._raiseDefinitionChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +function resolve(e) { + let t = e._targetProperty; + if (!defined(t)) { + let n = e._targetEntity; + if (!defined(n)) { + if (n = e._targetCollection.getById(e._targetId), !defined(n)) { + e._targetEntity = e._targetProperty = void 0; + return; + } + n.definitionChanged.addEventListener( + ReferenceProperty.prototype._onTargetEntityDefinitionChanged, + e + ), e._targetEntity = n; + } + const i = e._targetPropertyNames; + t = e._targetEntity; + for (let r = 0, o = i.length; r < o && defined(t); ++r) + t = t[i[r]]; + e._targetProperty = t; + } + return t; +} +function ReferenceProperty(e, t, n) { + this._targetCollection = e, this._targetId = t, this._targetPropertyNames = n, this._targetProperty = void 0, this._targetEntity = void 0, this._definitionChanged = new Event(), e.collectionChanged.addEventListener( + ReferenceProperty.prototype._onCollectionChanged, + this + ); +} +Object.defineProperties(ReferenceProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * @memberof ReferenceProperty.prototype + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(resolve(this)); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever the referenced property's definition is changed. + * @memberof ReferenceProperty.prototype + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the reference frame that the position is defined in. + * This property is only valid if the referenced property is a {@link PositionProperty}. + * @memberof ReferenceProperty.prototype + * @type {ReferenceFrame} + * @readonly + */ + referenceFrame: { + get: function() { + const e = resolve(this); + return defined(e) ? e.referenceFrame : void 0; + } + }, + /** + * Gets the id of the entity being referenced. + * @memberof ReferenceProperty.prototype + * @type {string} + * @readonly + */ + targetId: { + get: function() { + return this._targetId; + } + }, + /** + * Gets the collection containing the entity being referenced. + * @memberof ReferenceProperty.prototype + * @type {EntityCollection} + * @readonly + */ + targetCollection: { + get: function() { + return this._targetCollection; + } + }, + /** + * Gets the array of property names used to retrieve the referenced property. + * @memberof ReferenceProperty.prototype + * @type {} + * @readonly + */ + targetPropertyNames: { + get: function() { + return this._targetPropertyNames; + } + }, + /** + * Gets the resolved instance of the underlying referenced property. + * @memberof ReferenceProperty.prototype + * @type {Property|undefined} + * @readonly + */ + resolvedProperty: { + get: function() { + return resolve(this); + } + } +}); +ReferenceProperty.fromString = function(e, t) { + let n; + const i = []; + let r = !0, o = !1, s = ""; + for (let c = 0; c < t.length; ++c) { + const l = t.charAt(c); + o ? (s += l, o = !1) : l === "\\" ? o = !0 : r && l === "#" ? (n = s, r = !1, s = "") : !r && l === "." ? (i.push(s), s = "") : s += l; + } + return i.push(s), new ReferenceProperty(e, n, i); +}; +const timeScratch$8 = new JulianDate(); +ReferenceProperty.prototype.getValue = function(e, t) { + const n = resolve(this); + return defined(e) || (e = JulianDate.now(timeScratch$8)), defined(n) ? n.getValue(e, t) : void 0; +}; +ReferenceProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + const i = resolve(this); + return defined(i) ? i.getValueInReferenceFrame(e, t, n) : void 0; +}; +ReferenceProperty.prototype.getType = function(e) { + const t = resolve(this); + return defined(t) ? t.getType(e) : void 0; +}; +ReferenceProperty.prototype.equals = function(e) { + if (this === e) + return !0; + const t = this._targetPropertyNames, n = e._targetPropertyNames; + if (this._targetCollection !== e._targetCollection || // + this._targetId !== e._targetId || // + t.length !== n.length) + return !1; + const i = this._targetPropertyNames.length; + for (let r = 0; r < i; r++) + if (t[r] !== n[r]) + return !1; + return !0; +}; +ReferenceProperty.prototype._onTargetEntityDefinitionChanged = function(e, t, n, i) { + defined(this._targetProperty) && this._targetPropertyNames[0] === t && (this._targetProperty = void 0, this._definitionChanged.raiseEvent(this)); +}; +ReferenceProperty.prototype._onCollectionChanged = function(e, t, n) { + let i = this._targetEntity; + defined(i) && n.indexOf(i) !== -1 ? (i.definitionChanged.removeEventListener( + ReferenceProperty.prototype._onTargetEntityDefinitionChanged, + this + ), this._targetEntity = this._targetProperty = void 0) : defined(i) || (i = resolve(this), defined(i) && this._definitionChanged.raiseEvent(this)); +}; +const Rotation = { + /** + * The number of elements used to pack the object into an array. + * @type {number} + */ + packedLength: 1, + /** + * Stores the provided instance into the provided array. + * + * @param {Rotation} value The value to pack. + * @param {number[]} array The array to pack into. + * @param {number} [startingIndex=0] The index into the array at which to start packing the elements. + * + * @returns {number[]} The array that was packed into + */ + pack: function(e, t, n) { + return n = defaultValue(n, 0), t[n] = e, t; + }, + /** + * Retrieves an instance from a packed array. + * + * @param {number[]} array The packed array. + * @param {number} [startingIndex=0] The starting index of the element to be unpacked. + * @param {Rotation} [result] The object into which to store the result. + * @returns {Rotation} The modified result parameter or a new Rotation instance if one was not provided. + */ + unpack: function(e, t, n) { + return t = defaultValue(t, 0), e[t]; + }, + /** + * Converts a packed array into a form suitable for interpolation. + * + * @param {number[]} packedArray The packed array. + * @param {number} [startingIndex=0] The index of the first element to be converted. + * @param {number} [lastIndex=packedArray.length] The index of the last element to be converted. + * @param {number[]} [result] The object into which to store the result. + */ + convertPackedArrayForInterpolation: function(e, t, n, i) { + defined(i) || (i = []), t = defaultValue(t, 0), n = defaultValue(n, e.length); + let r; + for (let o = 0, s = n - t + 1; o < s; o++) { + const c = e[t + o]; + o === 0 || Math.abs(r - c) < Math.PI ? i[o] = c : i[o] = c - CesiumMath.TWO_PI, r = c; + } + }, + /** + * Retrieves an instance from a packed array converted with {@link Rotation.convertPackedArrayForInterpolation}. + * + * @param {number[]} array The array previously packed for interpolation. + * @param {number[]} sourceArray The original packed array. + * @param {number} [firstIndex=0] The firstIndex used to convert the array. + * @param {number} [lastIndex=packedArray.length] The lastIndex used to convert the array. + * @param {Rotation} [result] The object into which to store the result. + * @returns {Rotation} The modified result parameter or a new Rotation instance if one was not provided. + */ + unpackInterpolationResult: function(e, t, n, i, r) { + return r = e[0], r < 0 ? r + CesiumMath.TWO_PI : r; + } +}, PackableNumber = { + packedLength: 1, + pack: function(e, t, n) { + n = defaultValue(n, 0), t[n] = e; + }, + unpack: function(e, t, n) { + return t = defaultValue(t, 0), e[t]; + } +}; +function arrayInsert(e, t, n) { + let i; + const r = e.length, o = n.length, s = r + o; + if (e.length = s, r !== t) { + let c = r - 1; + for (i = s - 1; i >= t; i--) + e[i] = e[c--]; + } + for (i = 0; i < o; i++) + e[t++] = n[i]; +} +function convertDate(e, t) { + return e instanceof JulianDate ? e : typeof e == "string" ? JulianDate.fromIso8601(e) : JulianDate.addSeconds(t, e, new JulianDate()); +} +const timesSpliceArgs = [], valuesSpliceArgs = []; +function mergeNewSamples(e, t, n, i, r) { + let o = 0, s, c, l, d, f, h; + for (; o < i.length; ) { + f = convertDate(i[o], e), l = binarySearch(t, f, JulianDate.compare); + let p = 0, m = 0; + if (l < 0) { + for (l = ~l, d = l * r, c = void 0, h = t[l]; o < i.length && (f = convertDate(i[o], e), !(defined(c) && JulianDate.compare(c, f) >= 0 || defined(h) && JulianDate.compare(f, h) >= 0)); ) { + for (timesSpliceArgs[p++] = f, o = o + 1, s = 0; s < r; s++) + valuesSpliceArgs[m++] = i[o], o = o + 1; + c = f; + } + p > 0 && (valuesSpliceArgs.length = m, arrayInsert(n, d, valuesSpliceArgs), timesSpliceArgs.length = p, arrayInsert(t, l, timesSpliceArgs)); + } else { + for (s = 0; s < r; s++) + o++, n[l * r + s] = i[o]; + o++; + } + } +} +function SampledProperty(e, t) { + let n = e; + n === Number && (n = PackableNumber); + let i = n.packedLength, r = defaultValue( + n.packedInterpolationLength, + i + ), o = 0, s; + if (defined(t)) { + const c = t.length; + s = new Array(c); + for (let l = 0; l < c; l++) { + let d = t[l]; + d === Number && (d = PackableNumber); + const f = d.packedLength; + i += f, r += defaultValue( + d.packedInterpolationLength, + f + ), s[l] = d; + } + o = c; + } + this._type = e, this._innerType = n, this._interpolationDegree = 1, this._interpolationAlgorithm = LinearApproximation, this._numberOfPoints = 0, this._times = [], this._values = [], this._xTable = [], this._yTable = [], this._packedLength = i, this._packedInterpolationLength = r, this._updateTableLength = !0, this._interpolationResult = new Array(r), this._definitionChanged = new Event(), this._derivativeTypes = t, this._innerDerivativeTypes = s, this._inputOrder = o, this._forwardExtrapolationType = ExtrapolationType$1.NONE, this._forwardExtrapolationDuration = 0, this._backwardExtrapolationType = ExtrapolationType$1.NONE, this._backwardExtrapolationDuration = 0; +} +Object.defineProperties(SampledProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof SampledProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._values.length === 0; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof SampledProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the type of property. + * @memberof SampledProperty.prototype + * @type {*} + */ + type: { + get: function() { + return this._type; + } + }, + /** + * Gets the derivative types used by this property. + * @memberof SampledProperty.prototype + * @type {Packable[]} + */ + derivativeTypes: { + get: function() { + return this._derivativeTypes; + } + }, + /** + * Gets the degree of interpolation to perform when retrieving a value. + * @memberof SampledProperty.prototype + * @type {number} + * @default 1 + */ + interpolationDegree: { + get: function() { + return this._interpolationDegree; + } + }, + /** + * Gets the interpolation algorithm to use when retrieving a value. + * @memberof SampledProperty.prototype + * @type {InterpolationAlgorithm} + * @default LinearApproximation + */ + interpolationAlgorithm: { + get: function() { + return this._interpolationAlgorithm; + } + }, + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + * @memberof SampledProperty.prototype + * @type {ExtrapolationType} + * @default ExtrapolationType.NONE + */ + forwardExtrapolationType: { + get: function() { + return this._forwardExtrapolationType; + }, + set: function(e) { + this._forwardExtrapolationType !== e && (this._forwardExtrapolationType = e, this._definitionChanged.raiseEvent(this)); + } + }, + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + * @memberof SampledProperty.prototype + * @type {number} + * @default 0 + */ + forwardExtrapolationDuration: { + get: function() { + return this._forwardExtrapolationDuration; + }, + set: function(e) { + this._forwardExtrapolationDuration !== e && (this._forwardExtrapolationDuration = e, this._definitionChanged.raiseEvent(this)); + } + }, + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + * @memberof SampledProperty.prototype + * @type {ExtrapolationType} + * @default ExtrapolationType.NONE + */ + backwardExtrapolationType: { + get: function() { + return this._backwardExtrapolationType; + }, + set: function(e) { + this._backwardExtrapolationType !== e && (this._backwardExtrapolationType = e, this._definitionChanged.raiseEvent(this)); + } + }, + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + * @memberof SampledProperty.prototype + * @type {number} + * @default 0 + */ + backwardExtrapolationDuration: { + get: function() { + return this._backwardExtrapolationDuration; + }, + set: function(e) { + this._backwardExtrapolationDuration !== e && (this._backwardExtrapolationDuration = e, this._definitionChanged.raiseEvent(this)); + } + } +}); +const timeScratch$7 = new JulianDate(); +SampledProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$7)); + const n = this._times, i = n.length; + if (i === 0) + return; + let r; + const o = this._innerType, s = this._values; + let c = binarySearch(n, e, JulianDate.compare); + if (c < 0) { + if (c = ~c, c === 0) { + const S = n[c]; + if (r = this._backwardExtrapolationDuration, this._backwardExtrapolationType === ExtrapolationType$1.NONE || r !== 0 && JulianDate.secondsDifference(S, e) > r) + return; + if (this._backwardExtrapolationType === ExtrapolationType$1.HOLD) + return o.unpack(s, 0, t); + } + if (c >= i) { + c = i - 1; + const S = n[c]; + if (r = this._forwardExtrapolationDuration, this._forwardExtrapolationType === ExtrapolationType$1.NONE || r !== 0 && JulianDate.secondsDifference(e, S) > r) + return; + if (this._forwardExtrapolationType === ExtrapolationType$1.HOLD) + return c = i - 1, o.unpack(s, c * o.packedLength, t); + } + const l = this._xTable, d = this._yTable, f = this._interpolationAlgorithm, h = this._packedInterpolationLength, p = this._inputOrder; + if (this._updateTableLength) { + this._updateTableLength = !1; + const S = Math.min( + f.getRequiredDataPoints( + this._interpolationDegree, + p + ), + i + ); + S !== this._numberOfPoints && (this._numberOfPoints = S, l.length = S, d.length = S * h); + } + const m = this._numberOfPoints - 1; + if (m < 1) + return; + let _ = 0, y = i - 1; + if (y - _ + 1 >= m + 1) { + let S = c - (m / 2 | 0) - 1; + S < _ && (S = _); + let E = S + m; + E > y && (E = y, S = E - m, S < _ && (S = _)), _ = S, y = E; + } + const T = y - _ + 1; + for (let S = 0; S < T; ++S) + l[S] = JulianDate.secondsDifference( + n[_ + S], + n[y] + ); + if (defined(o.convertPackedArrayForInterpolation)) + o.convertPackedArrayForInterpolation( + s, + _, + y, + d + ); + else { + let S = 0; + const E = this._packedLength; + let A = _ * E; + const D = (y + 1) * E; + for (; A < D; ) + d[S] = s[A], A++, S++; + } + const x = JulianDate.secondsDifference(e, n[y]); + let b; + if (p === 0 || !defined(f.interpolate)) + b = f.interpolateOrderZero( + x, + l, + d, + h, + this._interpolationResult + ); + else { + const S = Math.floor(h / (p + 1)); + b = f.interpolate( + x, + l, + d, + S, + p, + p, + this._interpolationResult + ); + } + return defined(o.unpackInterpolationResult) ? o.unpackInterpolationResult( + b, + s, + _, + y, + t + ) : o.unpack(b, 0, t); + } + return o.unpack(s, c * this._packedLength, t); +}; +SampledProperty.prototype.setInterpolationOptions = function(e) { + if (!defined(e)) + return; + let t = !1; + const n = e.interpolationAlgorithm, i = e.interpolationDegree; + defined(n) && this._interpolationAlgorithm !== n && (this._interpolationAlgorithm = n, t = !0), defined(i) && this._interpolationDegree !== i && (this._interpolationDegree = i, t = !0), t && (this._updateTableLength = !0, this._definitionChanged.raiseEvent(this)); +}; +SampledProperty.prototype.addSample = function(e, t, n) { + const i = this._innerDerivativeTypes, r = defined(i), o = this._innerType, s = []; + if (s.push(e), o.pack(t, s, s.length), r) { + const c = i.length; + for (let l = 0; l < c; l++) + i[l].pack(n[l], s, s.length); + } + mergeNewSamples( + void 0, + this._times, + this._values, + s, + this._packedLength + ), this._updateTableLength = !0, this._definitionChanged.raiseEvent(this); +}; +SampledProperty.prototype.addSamples = function(e, t, n) { + const i = this._innerDerivativeTypes, r = defined(i), o = this._innerType, s = e.length, c = []; + for (let l = 0; l < s; l++) + if (c.push(e[l]), o.pack(t[l], c, c.length), r) { + const d = n[l], f = i.length; + for (let h = 0; h < f; h++) + i[h].pack(d[h], c, c.length); + } + mergeNewSamples( + void 0, + this._times, + this._values, + c, + this._packedLength + ), this._updateTableLength = !0, this._definitionChanged.raiseEvent(this); +}; +SampledProperty.prototype.addSamplesPackedArray = function(e, t) { + mergeNewSamples( + t, + this._times, + this._values, + e, + this._packedLength + ), this._updateTableLength = !0, this._definitionChanged.raiseEvent(this); +}; +SampledProperty.prototype.removeSample = function(e) { + const t = binarySearch(this._times, e, JulianDate.compare); + return t < 0 ? !1 : (removeSamples(this, t, 1), !0); +}; +function removeSamples(e, t, n) { + const i = e._packedLength; + e._times.splice(t, n), e._values.splice( + t * i, + n * i + ), e._updateTableLength = !0, e._definitionChanged.raiseEvent(e); +} +SampledProperty.prototype.removeSamples = function(e) { + const t = this._times; + let n = binarySearch(t, e.start, JulianDate.compare); + n < 0 ? n = ~n : e.isStartIncluded || ++n; + let i = binarySearch(t, e.stop, JulianDate.compare); + i < 0 ? i = ~i : e.isStopIncluded && ++i, removeSamples(this, n, i - n); +}; +SampledProperty.prototype.equals = function(e) { + if (this === e) + return !0; + if (!defined(e) || this._type !== e._type || // + this._interpolationDegree !== e._interpolationDegree || // + this._interpolationAlgorithm !== e._interpolationAlgorithm) + return !1; + const t = this._derivativeTypes, n = defined(t), i = e._derivativeTypes, r = defined(i); + if (n !== r) + return !1; + let o, s; + if (n) { + if (s = t.length, s !== i.length) + return !1; + for (o = 0; o < s; o++) + if (t[o] !== i[o]) + return !1; + } + const c = this._times, l = e._times; + if (s = c.length, s !== l.length) + return !1; + for (o = 0; o < s; o++) + if (!JulianDate.equals(c[o], l[o])) + return !1; + const d = this._values, f = e._values; + for (s = d.length, o = 0; o < s; o++) + if (d[o] !== f[o]) + return !1; + return !0; +}; +SampledProperty._mergeNewSamples = mergeNewSamples; +function SampledPositionProperty(e, t) { + t = defaultValue(t, 0); + let n; + if (t > 0) { + n = new Array(t); + for (let i = 0; i < t; i++) + n[i] = Cartesian3; + } + this._numberOfDerivatives = t, this._property = new SampledProperty(Cartesian3, n), this._definitionChanged = new Event(), this._referenceFrame = defaultValue(e, ReferenceFrame$1.FIXED), this._property._definitionChanged.addEventListener(function() { + this._definitionChanged.raiseEvent(this); + }, this); +} +Object.defineProperties(SampledPositionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof SampledPositionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._property.isConstant; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof SampledPositionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the reference frame in which the position is defined. + * @memberof SampledPositionProperty.prototype + * @type {ReferenceFrame} + * @default ReferenceFrame.FIXED; + */ + referenceFrame: { + get: function() { + return this._referenceFrame; + } + }, + /** + * Gets the degree of interpolation to perform when retrieving a value. Call setInterpolationOptions to set this. + * @memberof SampledPositionProperty.prototype + * + * @type {number} + * @default 1 + * @readonly + */ + interpolationDegree: { + get: function() { + return this._property.interpolationDegree; + } + }, + /** + * Gets the interpolation algorithm to use when retrieving a value. Call setInterpolationOptions to set this. + * @memberof SampledPositionProperty.prototype + * + * @type {InterpolationAlgorithm} + * @default LinearApproximation + * @readonly + */ + interpolationAlgorithm: { + get: function() { + return this._property.interpolationAlgorithm; + } + }, + /** + * The number of derivatives contained by this property; i.e. 0 for just position, 1 for velocity, etc. + * @memberof SampledPositionProperty.prototype + * + * @type {number} + * @default 0 + */ + numberOfDerivatives: { + get: function() { + return this._numberOfDerivatives; + } + }, + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + * @memberof SampledPositionProperty.prototype + * @type {ExtrapolationType} + * @default ExtrapolationType.NONE + */ + forwardExtrapolationType: { + get: function() { + return this._property.forwardExtrapolationType; + }, + set: function(e) { + this._property.forwardExtrapolationType = e; + } + }, + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + * @memberof SampledPositionProperty.prototype + * @type {number} + * @default 0 + */ + forwardExtrapolationDuration: { + get: function() { + return this._property.forwardExtrapolationDuration; + }, + set: function(e) { + this._property.forwardExtrapolationDuration = e; + } + }, + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + * @memberof SampledPositionProperty.prototype + * @type {ExtrapolationType} + * @default ExtrapolationType.NONE + */ + backwardExtrapolationType: { + get: function() { + return this._property.backwardExtrapolationType; + }, + set: function(e) { + this._property.backwardExtrapolationType = e; + } + }, + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + * @memberof SampledPositionProperty.prototype + * @type {number} + * @default 0 + */ + backwardExtrapolationDuration: { + get: function() { + return this._property.backwardExtrapolationDuration; + }, + set: function(e) { + this._property.backwardExtrapolationDuration = e; + } + } +}); +const timeScratch$6 = new JulianDate(); +SampledPositionProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$6)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +SampledPositionProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + if (n = this._property.getValue(e, n), defined(n)) + return PositionProperty.convertToReferenceFrame( + e, + n, + this._referenceFrame, + t, + n + ); +}; +SampledPositionProperty.prototype.setInterpolationOptions = function(e) { + this._property.setInterpolationOptions(e); +}; +SampledPositionProperty.prototype.addSample = function(e, t, n) { + this._numberOfDerivatives, this._property.addSample(e, t, n); +}; +SampledPositionProperty.prototype.addSamples = function(e, t, n) { + this._property.addSamples(e, t, n); +}; +SampledPositionProperty.prototype.addSamplesPackedArray = function(e, t) { + this._property.addSamplesPackedArray(e, t); +}; +SampledPositionProperty.prototype.removeSample = function(e) { + return this._property.removeSample(e); +}; +SampledPositionProperty.prototype.removeSamples = function(e) { + this._property.removeSamples(e); +}; +SampledPositionProperty.prototype.equals = function(e) { + return this === e || // + e instanceof SampledPositionProperty && Property.equals(this._property, e._property) && // + this._referenceFrame === e._referenceFrame; +}; +const StripeOrientation = { + /** + * Horizontal orientation. + * @type {number} + */ + HORIZONTAL: 0, + /** + * Vertical orientation. + * @type {number} + */ + VERTICAL: 1 +}, StripeOrientation$1 = Object.freeze(StripeOrientation), defaultOrientation = StripeOrientation$1.HORIZONTAL, defaultEvenColor = Color.WHITE, defaultOddColor = Color.BLACK, defaultOffset$7 = 0, defaultRepeat = 1; +function StripeMaterialProperty(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._definitionChanged = new Event(), this._orientation = void 0, this._orientationSubscription = void 0, this._evenColor = void 0, this._evenColorSubscription = void 0, this._oddColor = void 0, this._oddColorSubscription = void 0, this._offset = void 0, this._offsetSubscription = void 0, this._repeat = void 0, this._repeatSubscription = void 0, this.orientation = e.orientation, this.evenColor = e.evenColor, this.oddColor = e.oddColor, this.offset = e.offset, this.repeat = e.repeat; +} +Object.defineProperties(StripeMaterialProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof StripeMaterialProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._orientation) && // + Property.isConstant(this._evenColor) && // + Property.isConstant(this._oddColor) && // + Property.isConstant(this._offset) && // + Property.isConstant(this._repeat); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof StripeMaterialProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the Property specifying the {@link StripeOrientation}/ + * @memberof StripeMaterialProperty.prototype + * @type {Property|undefined} + * @default StripeOrientation.HORIZONTAL + */ + orientation: createPropertyDescriptor("orientation"), + /** + * Gets or sets the Property specifying the first {@link Color}. + * @memberof StripeMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.WHITE + */ + evenColor: createPropertyDescriptor("evenColor"), + /** + * Gets or sets the Property specifying the second {@link Color}. + * @memberof StripeMaterialProperty.prototype + * @type {Property|undefined} + * @default Color.BLACK + */ + oddColor: createPropertyDescriptor("oddColor"), + /** + * Gets or sets the numeric Property specifying the point into the pattern + * to begin drawing; with 0.0 being the beginning of the even color, 1.0 the beginning + * of the odd color, 2.0 being the even color again, and any multiple or fractional values + * being in between. + * @memberof StripeMaterialProperty.prototype + * @type {Property|undefined} + * @default 0.0 + */ + offset: createPropertyDescriptor("offset"), + /** + * Gets or sets the numeric Property specifying how many times the stripes repeat. + * @memberof StripeMaterialProperty.prototype + * @type {Property|undefined} + * @default 1.0 + */ + repeat: createPropertyDescriptor("repeat") +}); +StripeMaterialProperty.prototype.getType = function(e) { + return "Stripe"; +}; +const timeScratch$5 = new JulianDate(); +StripeMaterialProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$5)), defined(t) || (t = {}), t.horizontal = Property.getValueOrDefault(this._orientation, e, defaultOrientation) === StripeOrientation$1.HORIZONTAL, t.evenColor = Property.getValueOrClonedDefault( + this._evenColor, + e, + defaultEvenColor, + t.evenColor + ), t.oddColor = Property.getValueOrClonedDefault( + this._oddColor, + e, + defaultOddColor, + t.oddColor + ), t.offset = Property.getValueOrDefault(this._offset, e, defaultOffset$7), t.repeat = Property.getValueOrDefault(this._repeat, e, defaultRepeat), t; +}; +StripeMaterialProperty.prototype.equals = function(e) { + return this === e || // + e instanceof StripeMaterialProperty && // + Property.equals(this._orientation, e._orientation) && // + Property.equals(this._evenColor, e._evenColor) && // + Property.equals(this._oddColor, e._oddColor) && // + Property.equals(this._offset, e._offset) && // + Property.equals(this._repeat, e._repeat); +}; +function TimeIntervalCollectionPositionProperty(e) { + this._definitionChanged = new Event(), this._intervals = new TimeIntervalCollection(), this._intervals.changedEvent.addEventListener( + TimeIntervalCollectionPositionProperty.prototype._intervalsChanged, + this + ), this._referenceFrame = defaultValue(e, ReferenceFrame$1.FIXED); +} +Object.defineProperties(TimeIntervalCollectionPositionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof TimeIntervalCollectionPositionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._intervals.isEmpty; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + * @memberof TimeIntervalCollectionPositionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the interval collection. + * @memberof TimeIntervalCollectionPositionProperty.prototype + * @type {TimeIntervalCollection} + * @readonly + */ + intervals: { + get: function() { + return this._intervals; + } + }, + /** + * Gets the reference frame in which the position is defined. + * @memberof TimeIntervalCollectionPositionProperty.prototype + * @type {ReferenceFrame} + * @readonly + * @default ReferenceFrame.FIXED; + */ + referenceFrame: { + get: function() { + return this._referenceFrame; + } + } +}); +const timeScratch$4 = new JulianDate(); +TimeIntervalCollectionPositionProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch$4)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +TimeIntervalCollectionPositionProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + const i = this._intervals.findDataForIntervalContainingDate(e); + if (defined(i)) + return PositionProperty.convertToReferenceFrame( + e, + i, + this._referenceFrame, + t, + n + ); +}; +TimeIntervalCollectionPositionProperty.prototype.equals = function(e) { + return this === e || // + e instanceof TimeIntervalCollectionPositionProperty && // + this._intervals.equals(e._intervals, Property.equals) && // + this._referenceFrame === e._referenceFrame; +}; +TimeIntervalCollectionPositionProperty.prototype._intervalsChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +function TimeIntervalCollectionProperty() { + this._definitionChanged = new Event(), this._intervals = new TimeIntervalCollection(), this._intervals.changedEvent.addEventListener( + TimeIntervalCollectionProperty.prototype._intervalsChanged, + this + ); +} +Object.defineProperties(TimeIntervalCollectionProperty.prototype, { + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + * @memberof TimeIntervalCollectionProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return this._intervals.isEmpty; + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + * @memberof TimeIntervalCollectionProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets the interval collection. + * @memberof TimeIntervalCollectionProperty.prototype + * + * @type {TimeIntervalCollection} + * @readonly + */ + intervals: { + get: function() { + return this._intervals; + } + } +}); +const timeScratch$3 = new JulianDate(); +TimeIntervalCollectionProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$3)); + const n = this._intervals.findDataForIntervalContainingDate(e); + return defined(n) && typeof n.clone == "function" ? n.clone(t) : n; +}; +TimeIntervalCollectionProperty.prototype.equals = function(e) { + return this === e || // + e instanceof TimeIntervalCollectionProperty && // + this._intervals.equals(e._intervals, Property.equals); +}; +TimeIntervalCollectionProperty.prototype._intervalsChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +function VelocityVectorProperty(e, t) { + this._position = void 0, this._subscription = void 0, this._definitionChanged = new Event(), this._normalize = defaultValue(t, !0), this.position = e; +} +Object.defineProperties(VelocityVectorProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * @memberof VelocityVectorProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._position); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * @memberof VelocityVectorProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the position property used to compute the velocity vector. + * @memberof VelocityVectorProperty.prototype + * + * @type {Property|undefined} + */ + position: { + get: function() { + return this._position; + }, + set: function(e) { + const t = this._position; + t !== e && (defined(t) && this._subscription(), this._position = e, defined(e) && (this._subscription = e._definitionChanged.addEventListener( + function() { + this._definitionChanged.raiseEvent(this); + }, + this + )), this._definitionChanged.raiseEvent(this)); + } + }, + /** + * Gets or sets whether the vector produced by this property + * will be normalized or not. + * @memberof VelocityVectorProperty.prototype + * + * @type {boolean} + */ + normalize: { + get: function() { + return this._normalize; + }, + set: function(e) { + this._normalize !== e && (this._normalize = e, this._definitionChanged.raiseEvent(this)); + } + } +}); +const position1Scratch = new Cartesian3(), position2Scratch = new Cartesian3(), timeScratch$2 = new JulianDate(), timeNowScratch = new JulianDate(), step = 1 / 60; +VelocityVectorProperty.prototype.getValue = function(e, t) { + return this._getValue(e, t); +}; +VelocityVectorProperty.prototype._getValue = function(e, t, n) { + defined(e) || (e = JulianDate.now(timeNowScratch)), defined(t) || (t = new Cartesian3()); + const i = this._position; + if (Property.isConstant(i)) + return this._normalize ? void 0 : Cartesian3.clone(Cartesian3.ZERO, t); + let r = i.getValue(e, position1Scratch), o = i.getValue( + JulianDate.addSeconds(e, step, timeScratch$2), + position2Scratch + ); + if (!defined(r) || !defined(o) && (o = r, r = i.getValue( + JulianDate.addSeconds(e, -step, timeScratch$2), + position2Scratch + ), !defined(r))) + return; + if (Cartesian3.equals(r, o)) + return this._normalize ? void 0 : Cartesian3.clone(Cartesian3.ZERO, t); + defined(n) && r.clone(n); + const s = Cartesian3.subtract(o, r, t); + return this._normalize ? Cartesian3.normalize(s, t) : Cartesian3.divideByScalar(s, step, t); +}; +VelocityVectorProperty.prototype.equals = function(e) { + return this === e || // + e instanceof VelocityVectorProperty && Property.equals(this._position, e._position); +}; +function VelocityOrientationProperty(e, t) { + this._velocityVectorProperty = new VelocityVectorProperty(e, !0), this._subscription = void 0, this._ellipsoid = void 0, this._definitionChanged = new Event(), this.ellipsoid = defaultValue(t, Ellipsoid.default); + const n = this; + this._velocityVectorProperty.definitionChanged.addEventListener(function() { + n._definitionChanged.raiseEvent(n); + }); +} +Object.defineProperties(VelocityOrientationProperty.prototype, { + /** + * Gets a value indicating if this property is constant. + * @memberof VelocityOrientationProperty.prototype + * + * @type {boolean} + * @readonly + */ + isConstant: { + get: function() { + return Property.isConstant(this._velocityVectorProperty); + } + }, + /** + * Gets the event that is raised whenever the definition of this property changes. + * @memberof VelocityOrientationProperty.prototype + * + * @type {Event} + * @readonly + */ + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + /** + * Gets or sets the position property used to compute orientation. + * @memberof VelocityOrientationProperty.prototype + * + * @type {Property|undefined} + */ + position: { + get: function() { + return this._velocityVectorProperty.position; + }, + set: function(e) { + this._velocityVectorProperty.position = e; + } + }, + /** + * Gets or sets the ellipsoid used to determine which way is up. + * @memberof VelocityOrientationProperty.prototype + * + * @type {Property|undefined} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + }, + set: function(e) { + this._ellipsoid !== e && (this._ellipsoid = e, this._definitionChanged.raiseEvent(this)); + } + } +}); +const positionScratch$4 = new Cartesian3(), velocityScratch = new Cartesian3(), rotationScratch$1 = new Matrix3(), timeScratch$1 = new JulianDate(); +VelocityOrientationProperty.prototype.getValue = function(e, t) { + defined(e) || (e = JulianDate.now(timeScratch$1)); + const n = this._velocityVectorProperty._getValue( + e, + velocityScratch, + positionScratch$4 + ); + if (defined(n)) + return Transforms.rotationMatrixFromPositionVelocity( + positionScratch$4, + n, + this._ellipsoid, + rotationScratch$1 + ), Quaternion.fromRotationMatrix(rotationScratch$1, t); +}; +VelocityOrientationProperty.prototype.equals = function(e) { + return this === e || // + e instanceof VelocityOrientationProperty && Property.equals( + this._velocityVectorProperty, + e._velocityVectorProperty + ) && (this._ellipsoid === e._ellipsoid || this._ellipsoid.equals(e._ellipsoid)); +}; +const SensorVolumePortionToDisplay = { + /** + * 0x0000. Display the complete sensor volume. + * + * @type {Number} + * @constant + */ + COMPLETE: 0, + /** + * 0x0001. Display the portion of the sensor volume that lies below the true horizon of the ellipsoid. + * + * @type {Number} + * @constant + */ + BELOW_ELLIPSOID_HORIZON: 1, + /** + * 0x0002. Display the portion of the sensor volume that lies above the true horizon of the ellipsoid. + * + * @type {Number} + * @constant + */ + ABOVE_ELLIPSOID_HORIZON: 2 +}; +SensorVolumePortionToDisplay.validate = function(e) { + return e === SensorVolumePortionToDisplay.COMPLETE || e === SensorVolumePortionToDisplay.BELOW_ELLIPSOID_HORIZON || e === SensorVolumePortionToDisplay.ABOVE_ELLIPSOID_HORIZON; +}; +SensorVolumePortionToDisplay.toString = function(e) { + switch (e) { + case SensorVolumePortionToDisplay.COMPLETE: + return "COMPLETE"; + case SensorVolumePortionToDisplay.BELOW_ELLIPSOID_HORIZON: + return "BELOW_ELLIPSOID_HORIZON"; + case SensorVolumePortionToDisplay.ABOVE_ELLIPSOID_HORIZON: + return "ABOVE_ELLIPSOID_HORIZON"; + default: + throw new DeveloperError( + "SensorVolumePortionToDisplay value is not valid and cannot be converted to a String." + ); + } +}; +function UnitCartesian3() { +} +UnitCartesian3.packedLength = Cartesian3.packedLength; +UnitCartesian3.unpack = Cartesian3.unpack; +UnitCartesian3.pack = Cartesian3.pack; +let currentId; +function createReferenceProperty(e, t) { + return t[0] === "#" && (t = currentId + t), ReferenceProperty.fromString(e, t); +} +function createSpecializedProperty(e, t, n) { + if (defined(n.reference)) + return createReferenceProperty(t, n.reference); + if (defined(n.velocityReference)) { + const i = createReferenceProperty( + t, + n.velocityReference + ); + switch (e) { + case Cartesian3: + case UnitCartesian3: + return new VelocityVectorProperty( + i, + e === UnitCartesian3 + ); + case Quaternion: + return new VelocityOrientationProperty(i); + } + } + throw new RuntimeError(`${JSON.stringify(n)} is not valid CZML.`); +} +function createAdapterProperty(e, t) { + return new CallbackProperty(function(n, i) { + return t(e.getValue(n, i)); + }, e.isConstant); +} +const scratchCartesian$4 = new Cartesian3(), scratchSpherical = new Spherical(), scratchCartographic$a = new Cartographic(), scratchTimeInterval$1 = new TimeInterval(), scratchQuaternion = new Quaternion(); +function unwrapColorInterval(e) { + let t = e.rgbaf; + if (defined(t)) + return t; + const n = e.rgba; + if (!defined(n)) + return; + const i = n.length; + if (i === Color.packedLength) + return [ + Color.byteToFloat(n[0]), + Color.byteToFloat(n[1]), + Color.byteToFloat(n[2]), + Color.byteToFloat(n[3]) + ]; + t = new Array(i); + for (let r = 0; r < i; r += 5) + t[r] = n[r], t[r + 1] = Color.byteToFloat(n[r + 1]), t[r + 2] = Color.byteToFloat(n[r + 2]), t[r + 3] = Color.byteToFloat(n[r + 3]), t[r + 4] = Color.byteToFloat(n[r + 4]); + return t; +} +function unwrapUriInterval(e, t) { + const n = defaultValue(e.uri, e); + return defined(t) ? t.getDerivedResource({ + url: n + }) : Resource.createIfNeeded(n); +} +function unwrapRectangleInterval(e) { + let t = e.wsen; + if (defined(t)) + return t; + const n = e.wsenDegrees; + if (!defined(n)) + return; + const i = n.length; + if (i === Rectangle.packedLength) + return [ + CesiumMath.toRadians(n[0]), + CesiumMath.toRadians(n[1]), + CesiumMath.toRadians(n[2]), + CesiumMath.toRadians(n[3]) + ]; + t = new Array(i); + for (let r = 0; r < i; r += 5) + t[r] = n[r], t[r + 1] = CesiumMath.toRadians(n[r + 1]), t[r + 2] = CesiumMath.toRadians(n[r + 2]), t[r + 3] = CesiumMath.toRadians(n[r + 3]), t[r + 4] = CesiumMath.toRadians(n[r + 4]); + return t; +} +function convertUnitSphericalToCartesian(e) { + const t = e.length; + if (scratchSpherical.magnitude = 1, t === 2) + return scratchSpherical.clock = e[0], scratchSpherical.cone = e[1], Cartesian3.fromSpherical(scratchSpherical, scratchCartesian$4), [scratchCartesian$4.x, scratchCartesian$4.y, scratchCartesian$4.z]; + const n = new Array(t / 3 * 4); + for (let i = 0, r = 0; i < t; i += 3, r += 4) + n[r] = e[i], scratchSpherical.clock = e[i + 1], scratchSpherical.cone = e[i + 2], Cartesian3.fromSpherical(scratchSpherical, scratchCartesian$4), n[r + 1] = scratchCartesian$4.x, n[r + 2] = scratchCartesian$4.y, n[r + 3] = scratchCartesian$4.z; + return n; +} +function convertSphericalToCartesian(e) { + const t = e.length; + if (t === 3) + return scratchSpherical.clock = e[0], scratchSpherical.cone = e[1], scratchSpherical.magnitude = e[2], Cartesian3.fromSpherical(scratchSpherical, scratchCartesian$4), [scratchCartesian$4.x, scratchCartesian$4.y, scratchCartesian$4.z]; + const n = new Array(t); + for (let i = 0; i < t; i += 4) + n[i] = e[i], scratchSpherical.clock = e[i + 1], scratchSpherical.cone = e[i + 2], scratchSpherical.magnitude = e[i + 3], Cartesian3.fromSpherical(scratchSpherical, scratchCartesian$4), n[i + 1] = scratchCartesian$4.x, n[i + 2] = scratchCartesian$4.y, n[i + 3] = scratchCartesian$4.z; + return n; +} +function convertCartographicRadiansToCartesian(e) { + const t = e.length; + if (t === 3) + return scratchCartographic$a.longitude = e[0], scratchCartographic$a.latitude = e[1], scratchCartographic$a.height = e[2], Ellipsoid.default.cartographicToCartesian( + scratchCartographic$a, + scratchCartesian$4 + ), [scratchCartesian$4.x, scratchCartesian$4.y, scratchCartesian$4.z]; + const n = new Array(t); + for (let i = 0; i < t; i += 4) + n[i] = e[i], scratchCartographic$a.longitude = e[i + 1], scratchCartographic$a.latitude = e[i + 2], scratchCartographic$a.height = e[i + 3], Ellipsoid.default.cartographicToCartesian( + scratchCartographic$a, + scratchCartesian$4 + ), n[i + 1] = scratchCartesian$4.x, n[i + 2] = scratchCartesian$4.y, n[i + 3] = scratchCartesian$4.z; + return n; +} +function convertCartographicDegreesToCartesian(e) { + const t = e.length; + if (t === 3) + return scratchCartographic$a.longitude = CesiumMath.toRadians( + e[0] + ), scratchCartographic$a.latitude = CesiumMath.toRadians(e[1]), scratchCartographic$a.height = e[2], Ellipsoid.default.cartographicToCartesian( + scratchCartographic$a, + scratchCartesian$4 + ), [scratchCartesian$4.x, scratchCartesian$4.y, scratchCartesian$4.z]; + const n = new Array(t); + for (let i = 0; i < t; i += 4) + n[i] = e[i], scratchCartographic$a.longitude = CesiumMath.toRadians( + e[i + 1] + ), scratchCartographic$a.latitude = CesiumMath.toRadians( + e[i + 2] + ), scratchCartographic$a.height = e[i + 3], Ellipsoid.default.cartographicToCartesian( + scratchCartographic$a, + scratchCartesian$4 + ), n[i + 1] = scratchCartesian$4.x, n[i + 2] = scratchCartesian$4.y, n[i + 3] = scratchCartesian$4.z; + return n; +} +function unwrapCartesianInterval(e) { + const t = e.cartesian; + if (defined(t)) + return t; + const n = e.cartesianVelocity; + if (defined(n)) + return n; + const i = e.unitCartesian; + if (defined(i)) + return i; + const r = e.unitSpherical; + if (defined(r)) + return convertUnitSphericalToCartesian(r); + const o = e.spherical; + if (defined(o)) + return convertSphericalToCartesian(o); + const s = e.cartographicRadians; + if (defined(s)) + return convertCartographicRadiansToCartesian(s); + const c = e.cartographicDegrees; + if (defined(c)) + return convertCartographicDegreesToCartesian(c); + throw new RuntimeError( + `${JSON.stringify(e)} is not a valid CZML interval.` + ); +} +function normalizePackedCartesianArray(e, t) { + Cartesian3.unpack(e, t, scratchCartesian$4), Cartesian3.normalize(scratchCartesian$4, scratchCartesian$4), Cartesian3.pack(scratchCartesian$4, e, t); +} +function unwrapUnitCartesianInterval(e) { + const t = unwrapCartesianInterval(e); + if (t.length === 3) + return normalizePackedCartesianArray(t, 0), t; + for (let n = 1; n < t.length; n += 4) + normalizePackedCartesianArray(t, n); + return t; +} +function normalizePackedQuaternionArray(e, t) { + Quaternion.unpack(e, t, scratchQuaternion), Quaternion.normalize(scratchQuaternion, scratchQuaternion), Quaternion.pack(scratchQuaternion, e, t); +} +function unwrapQuaternionInterval(e) { + const t = e.unitQuaternion; + if (defined(t)) { + if (t.length === 4) + return normalizePackedQuaternionArray(t, 0), t; + for (let n = 1; n < t.length; n += 5) + normalizePackedQuaternionArray(t, n); + } + return t; +} +function getPropertyType(e) { + return typeof e == "boolean" ? Boolean : typeof e == "number" ? Number : typeof e == "string" ? String : e.hasOwnProperty("array") ? Array : e.hasOwnProperty("boolean") ? Boolean : e.hasOwnProperty("boundingRectangle") ? BoundingRectangle : e.hasOwnProperty("cartesian2") ? Cartesian2 : e.hasOwnProperty("cartesian") || e.hasOwnProperty("spherical") || e.hasOwnProperty("cartographicRadians") || e.hasOwnProperty("cartographicDegrees") ? Cartesian3 : e.hasOwnProperty("unitCartesian") || e.hasOwnProperty("unitSpherical") ? UnitCartesian3 : e.hasOwnProperty("rgba") || e.hasOwnProperty("rgbaf") ? Color : e.hasOwnProperty("arcType") ? ArcType$1 : e.hasOwnProperty("classificationType") ? ClassificationType$1 : e.hasOwnProperty("colorBlendMode") ? ColorBlendMode$1 : e.hasOwnProperty("cornerType") ? CornerType$1 : e.hasOwnProperty("heightReference") ? HeightReference$1 : e.hasOwnProperty("horizontalOrigin") ? HorizontalOrigin$1 : e.hasOwnProperty("date") ? JulianDate : e.hasOwnProperty("labelStyle") ? LabelStyle$1 : e.hasOwnProperty("number") ? Number : e.hasOwnProperty("nearFarScalar") ? NearFarScalar : e.hasOwnProperty("distanceDisplayCondition") ? DistanceDisplayCondition : e.hasOwnProperty("object") || e.hasOwnProperty("value") ? Object : e.hasOwnProperty("unitQuaternion") ? Quaternion : e.hasOwnProperty("shadowMode") ? ShadowMode$1 : e.hasOwnProperty("string") ? String : e.hasOwnProperty("stripeOrientation") ? StripeOrientation$1 : e.hasOwnProperty("wsen") || e.hasOwnProperty("wsenDegrees") ? Rectangle : e.hasOwnProperty("uri") ? Uri : e.hasOwnProperty("verticalOrigin") ? VerticalOrigin$1 : Object; +} +function unwrapInterval(e, t, n) { + switch (e) { + case ArcType$1: + return ArcType$1[defaultValue(t.arcType, t)]; + case Array: + return t.array; + case Boolean: + return defaultValue(t.boolean, t); + case BoundingRectangle: + return t.boundingRectangle; + case Cartesian2: + return t.cartesian2; + case Cartesian3: + return unwrapCartesianInterval(t); + case UnitCartesian3: + return unwrapUnitCartesianInterval(t); + case Color: + return unwrapColorInterval(t); + case ClassificationType$1: + return ClassificationType$1[defaultValue(t.classificationType, t)]; + case ColorBlendMode$1: + return ColorBlendMode$1[defaultValue(t.colorBlendMode, t)]; + case CornerType$1: + return CornerType$1[defaultValue(t.cornerType, t)]; + case HeightReference$1: + return HeightReference$1[defaultValue(t.heightReference, t)]; + case HorizontalOrigin$1: + return HorizontalOrigin$1[defaultValue(t.horizontalOrigin, t)]; + case Image: + return unwrapUriInterval(t, n); + case JulianDate: + return JulianDate.fromIso8601( + defaultValue(t.date, t) + ); + case LabelStyle$1: + return LabelStyle$1[defaultValue(t.labelStyle, t)]; + case Number: + return defaultValue(t.number, t); + case NearFarScalar: + return t.nearFarScalar; + case DistanceDisplayCondition: + return t.distanceDisplayCondition; + case Object: + return defaultValue( + defaultValue(t.object, t.value), + t + ); + case Quaternion: + return unwrapQuaternionInterval(t); + case Rotation: + return defaultValue(t.number, t); + case SensorVolumePortionToDisplay: + return SensorVolumePortionToDisplay[defaultValue(t.portionToDisplay, t)]; + case ShadowMode$1: + return ShadowMode$1[defaultValue( + defaultValue(t.shadowMode, t.shadows), + t + )]; + case String: + return defaultValue(t.string, t); + case StripeOrientation$1: + return StripeOrientation$1[defaultValue(t.stripeOrientation, t)]; + case Rectangle: + return unwrapRectangleInterval(t); + case Uri: + return unwrapUriInterval(t, n); + case VerticalOrigin$1: + return VerticalOrigin$1[defaultValue(t.verticalOrigin, t)]; + default: + throw new RuntimeError(`Unknown CzmlDataSource interval type: ${e}`); + } +} +const interpolators = { + HERMITE: HermitePolynomialApproximation, + LAGRANGE: LagrangePolynomialApproximation, + LINEAR: LinearApproximation +}; +function updateInterpolationSettings(e, t) { + const n = e.interpolationAlgorithm, i = e.interpolationDegree; + (defined(n) || defined(i)) && t.setInterpolationOptions({ + interpolationAlgorithm: interpolators[n], + interpolationDegree: i + }); + const r = e.forwardExtrapolationType; + defined(r) && (t.forwardExtrapolationType = ExtrapolationType$1[r]); + const o = e.forwardExtrapolationDuration; + defined(o) && (t.forwardExtrapolationDuration = o); + const s = e.backwardExtrapolationType; + defined(s) && (t.backwardExtrapolationType = ExtrapolationType$1[s]); + const c = e.backwardExtrapolationDuration; + defined(c) && (t.backwardExtrapolationDuration = c); +} +const iso8601Scratch = { + iso8601: void 0 +}; +function intervalFromString(e) { + if (defined(e)) + return iso8601Scratch.iso8601 = e, TimeInterval.fromIso8601(iso8601Scratch); +} +function wrapPropertyInInfiniteInterval(e) { + const t = Iso8601.MAXIMUM_INTERVAL.clone(); + return t.data = e, t; +} +function convertPropertyToComposite(e) { + const t = new CompositeProperty(); + return t.intervals.addInterval(wrapPropertyInInfiniteInterval(e)), t; +} +function convertPositionPropertyToComposite(e) { + const t = new CompositePositionProperty(e.referenceFrame); + return t.intervals.addInterval(wrapPropertyInInfiniteInterval(e)), t; +} +function processProperty(e, t, n, i, r, o, s) { + let c = intervalFromString(i.interval); + defined(r) && (defined(c) ? c = TimeInterval.intersect( + c, + r, + scratchTimeInterval$1 + ) : c = r); + let l, d, f; + const h = !defined(i.reference) && !defined(i.velocityReference), p = defined(c) && !c.equals(Iso8601.MAXIMUM_INTERVAL); + if (i.delete === !0) { + if (!p) { + t[n] = void 0; + return; + } + return removePropertyData(t[n], c); + } + let m = !1; + if (h) { + if (d = unwrapInterval(e, i, o), !defined(d)) + return; + l = defaultValue(e.packedLength, 1), f = defaultValue(d.length, 1), m = !defined(i.array) && typeof d != "string" && f > l && e !== Object; + } + const _ = typeof e.unpack == "function" && e !== Rotation; + if (!m && !p) { + h ? t[n] = new ConstantProperty( + _ ? e.unpack(d, 0) : d + ) : t[n] = createSpecializedProperty( + e, + s, + i + ); + return; + } + let y = t[n], C; + const T = i.epoch; + if (defined(T) && (C = JulianDate.fromIso8601(T)), m && !p) { + y instanceof SampledProperty || (t[n] = y = new SampledProperty(e)), y.addSamplesPackedArray(d, C), updateInterpolationSettings(i, y); + return; + } + let x; + if (!m && p) { + c = c.clone(), h ? c.data = _ ? e.unpack(d, 0) : d : c.data = createSpecializedProperty( + e, + s, + i + ), defined(y) || (t[n] = y = h ? new TimeIntervalCollectionProperty() : new CompositeProperty()), h && y instanceof TimeIntervalCollectionProperty ? y.intervals.addInterval(c) : y instanceof CompositeProperty ? (h && (c.data = new ConstantProperty(c.data)), y.intervals.addInterval(c)) : (t[n] = y = convertPropertyToComposite(y), h && (c.data = new ConstantProperty(c.data)), y.intervals.addInterval(c)); + return; + } + defined(y) || (t[n] = y = new CompositeProperty()), y instanceof CompositeProperty || (t[n] = y = convertPropertyToComposite(y)); + const b = y.intervals; + x = b.findInterval(c), (!defined(x) || !(x.data instanceof SampledProperty)) && (x = c.clone(), x.data = new SampledProperty(e), b.addInterval(x)), x.data.addSamplesPackedArray(d, C), updateInterpolationSettings(i, x.data); +} +function removePropertyData(e, t) { + if (e instanceof SampledProperty) { + e.removeSamples(t); + return; + } else if (e instanceof TimeIntervalCollectionProperty) { + e.intervals.removeInterval(t); + return; + } else if (e instanceof CompositeProperty) { + const n = e.intervals; + for (let i = 0; i < n.length; ++i) { + const r = TimeInterval.intersect( + n.get(i), + t, + scratchTimeInterval$1 + ); + r.isEmpty || removePropertyData(r.data, t); + } + n.removeInterval(t); + return; + } +} +function processPacketData(e, t, n, i, r, o, s) { + if (defined(i)) + if (Array.isArray(i)) + for (let c = 0, l = i.length; c < l; ++c) + processProperty( + e, + t, + n, + i[c], + r, + o, + s + ); + else + processProperty( + e, + t, + n, + i, + r, + o, + s + ); +} +function processPositionProperty(e, t, n, i, r, o) { + let s = intervalFromString(n.interval); + defined(i) && (defined(s) ? s = TimeInterval.intersect( + s, + i, + scratchTimeInterval$1 + ) : s = i); + const c = defined(n.cartesianVelocity) ? 1 : 0, l = Cartesian3.packedLength * (c + 1); + let d, f; + const h = !defined(n.reference), p = defined(s) && !s.equals(Iso8601.MAXIMUM_INTERVAL); + if (n.delete === !0) { + if (!p) { + e[t] = void 0; + return; + } + return removePositionPropertyData(e[t], s); + } + let m, _ = !1; + if (h && (defined(n.referenceFrame) && (m = ReferenceFrame$1[n.referenceFrame]), m = defaultValue(m, ReferenceFrame$1.FIXED), d = unwrapCartesianInterval(n), f = defaultValue(d.length, 1), _ = f > l), !_ && !p) { + h ? e[t] = new ConstantPositionProperty( + Cartesian3.unpack(d), + m + ) : e[t] = createReferenceProperty( + o, + n.reference + ); + return; + } + let y = e[t], C; + const T = n.epoch; + if (defined(T) && (C = JulianDate.fromIso8601(T)), _ && !p) { + (!(y instanceof SampledPositionProperty) || defined(m) && y.referenceFrame !== m) && (e[t] = y = new SampledPositionProperty( + m, + c + )), y.addSamplesPackedArray(d, C), updateInterpolationSettings(n, y); + return; + } + let x; + if (!_ && p) { + s = s.clone(), h ? s.data = Cartesian3.unpack(d) : s.data = createReferenceProperty( + o, + n.reference + ), defined(y) || (h ? y = new TimeIntervalCollectionPositionProperty(m) : y = new CompositePositionProperty(m), e[t] = y), h && y instanceof TimeIntervalCollectionPositionProperty && defined(m) && y.referenceFrame === m ? y.intervals.addInterval(s) : y instanceof CompositePositionProperty ? (h && (s.data = new ConstantPositionProperty( + s.data, + m + )), y.intervals.addInterval(s)) : (e[t] = y = convertPositionPropertyToComposite( + y + ), h && (s.data = new ConstantPositionProperty( + s.data, + m + )), y.intervals.addInterval(s)); + return; + } + defined(y) ? y instanceof CompositePositionProperty || (e[t] = y = convertPositionPropertyToComposite( + y + )) : e[t] = y = new CompositePositionProperty( + m + ); + const b = y.intervals; + x = b.findInterval(s), (!defined(x) || !(x.data instanceof SampledPositionProperty) || defined(m) && x.data.referenceFrame !== m) && (x = s.clone(), x.data = new SampledPositionProperty( + m, + c + ), b.addInterval(x)), x.data.addSamplesPackedArray(d, C), updateInterpolationSettings(n, x.data); +} +function removePositionPropertyData(e, t) { + if (e instanceof SampledPositionProperty) { + e.removeSamples(t); + return; + } else if (e instanceof TimeIntervalCollectionPositionProperty) { + e.intervals.removeInterval(t); + return; + } else if (e instanceof CompositePositionProperty) { + const n = e.intervals; + for (let i = 0; i < n.length; ++i) { + const r = TimeInterval.intersect( + n.get(i), + t, + scratchTimeInterval$1 + ); + r.isEmpty || removePositionPropertyData(r.data, t); + } + n.removeInterval(t); + return; + } +} +function processPositionPacketData(e, t, n, i, r, o) { + if (defined(n)) + if (Array.isArray(n)) + for (let s = 0, c = n.length; s < c; ++s) + processPositionProperty( + e, + t, + n[s], + i, + r, + o + ); + else + processPositionProperty( + e, + t, + n, + i, + r, + o + ); +} +function processShapePacketData(e, t, n, i) { + defined(n.references) ? processReferencesArrayPacketData( + e, + t, + n.references, + n.interval, + i, + PropertyArray, + CompositeProperty + ) : (defined(n.cartesian2) ? n.array = Cartesian2.unpackArray(n.cartesian2) : defined(n.cartesian) && (n.array = Cartesian2.unpackArray(n.cartesian)), defined(n.array) && processPacketData( + Array, + e, + t, + n, + void 0, + void 0, + i + )); +} +function processMaterialProperty(e, t, n, i, r, o) { + let s = intervalFromString(n.interval); + defined(i) && (defined(s) ? s = TimeInterval.intersect( + s, + i, + scratchTimeInterval$1 + ) : s = i); + let c = e[t], l, d; + if (defined(s)) { + c instanceof CompositeMaterialProperty || (c = new CompositeMaterialProperty(), e[t] = c); + const h = c.intervals; + d = h.findInterval({ + start: s.start, + stop: s.stop + }), defined(d) ? l = d.data : (d = s.clone(), h.addInterval(d)); + } else + l = c; + let f; + defined(n.solidColor) ? (l instanceof ColorMaterialProperty || (l = new ColorMaterialProperty()), f = n.solidColor, processPacketData( + Color, + l, + "color", + f.color, + void 0, + void 0, + o + )) : defined(n.grid) ? (l instanceof GridMaterialProperty || (l = new GridMaterialProperty()), f = n.grid, processPacketData( + Color, + l, + "color", + f.color, + void 0, + r, + o + ), processPacketData( + Number, + l, + "cellAlpha", + f.cellAlpha, + void 0, + r, + o + ), processPacketData( + Cartesian2, + l, + "lineCount", + f.lineCount, + void 0, + r, + o + ), processPacketData( + Cartesian2, + l, + "lineThickness", + f.lineThickness, + void 0, + r, + o + ), processPacketData( + Cartesian2, + l, + "lineOffset", + f.lineOffset, + void 0, + r, + o + )) : defined(n.image) ? (l instanceof ImageMaterialProperty || (l = new ImageMaterialProperty()), f = n.image, processPacketData( + Image, + l, + "image", + f.image, + void 0, + r, + o + ), processPacketData( + Cartesian2, + l, + "repeat", + f.repeat, + void 0, + r, + o + ), processPacketData( + Color, + l, + "color", + f.color, + void 0, + r, + o + ), processPacketData( + Boolean, + l, + "transparent", + f.transparent, + void 0, + r, + o + )) : defined(n.stripe) ? (l instanceof StripeMaterialProperty || (l = new StripeMaterialProperty()), f = n.stripe, processPacketData( + StripeOrientation$1, + l, + "orientation", + f.orientation, + void 0, + r, + o + ), processPacketData( + Color, + l, + "evenColor", + f.evenColor, + void 0, + r, + o + ), processPacketData( + Color, + l, + "oddColor", + f.oddColor, + void 0, + r, + o + ), processPacketData( + Number, + l, + "offset", + f.offset, + void 0, + r, + o + ), processPacketData( + Number, + l, + "repeat", + f.repeat, + void 0, + r, + o + )) : defined(n.polylineOutline) ? (l instanceof PolylineOutlineMaterialProperty || (l = new PolylineOutlineMaterialProperty()), f = n.polylineOutline, processPacketData( + Color, + l, + "color", + f.color, + void 0, + r, + o + ), processPacketData( + Color, + l, + "outlineColor", + f.outlineColor, + void 0, + r, + o + ), processPacketData( + Number, + l, + "outlineWidth", + f.outlineWidth, + void 0, + r, + o + )) : defined(n.polylineGlow) ? (l instanceof PolylineGlowMaterialProperty || (l = new PolylineGlowMaterialProperty()), f = n.polylineGlow, processPacketData( + Color, + l, + "color", + f.color, + void 0, + r, + o + ), processPacketData( + Number, + l, + "glowPower", + f.glowPower, + void 0, + r, + o + ), processPacketData( + Number, + l, + "taperPower", + f.taperPower, + void 0, + r, + o + )) : defined(n.polylineArrow) ? (l instanceof PolylineArrowMaterialProperty || (l = new PolylineArrowMaterialProperty()), f = n.polylineArrow, processPacketData( + Color, + l, + "color", + f.color, + void 0, + void 0, + o + )) : defined(n.polylineDash) ? (l instanceof PolylineDashMaterialProperty || (l = new PolylineDashMaterialProperty()), f = n.polylineDash, processPacketData( + Color, + l, + "color", + f.color, + void 0, + void 0, + o + ), processPacketData( + Color, + l, + "gapColor", + f.gapColor, + void 0, + void 0, + o + ), processPacketData( + Number, + l, + "dashLength", + f.dashLength, + void 0, + r, + o + ), processPacketData( + Number, + l, + "dashPattern", + f.dashPattern, + void 0, + r, + o + )) : defined(n.checkerboard) && (l instanceof CheckerboardMaterialProperty || (l = new CheckerboardMaterialProperty()), f = n.checkerboard, processPacketData( + Color, + l, + "evenColor", + f.evenColor, + void 0, + r, + o + ), processPacketData( + Color, + l, + "oddColor", + f.oddColor, + void 0, + r, + o + ), processPacketData( + Cartesian2, + l, + "repeat", + f.repeat, + void 0, + r, + o + )), defined(d) ? d.data = l : e[t] = l; +} +function processMaterialPacketData(e, t, n, i, r, o) { + if (defined(n)) + if (Array.isArray(n)) + for (let s = 0, c = n.length; s < c; ++s) + processMaterialProperty( + e, + t, + n[s], + i, + r, + o + ); + else + processMaterialProperty( + e, + t, + n, + i, + r, + o + ); +} +function processName(e, t, n, i) { + const r = t.name; + defined(r) && (e.name = t.name); +} +function processDescription$2(e, t, n, i) { + const r = t.description; + defined(r) && processPacketData( + String, + e, + "description", + r, + void 0, + i, + n + ); +} +function processPosition(e, t, n, i) { + const r = t.position; + defined(r) && processPositionPacketData( + e, + "position", + r, + void 0, + i, + n + ); +} +function processViewFrom(e, t, n, i) { + const r = t.viewFrom; + defined(r) && processPacketData( + Cartesian3, + e, + "viewFrom", + r, + void 0, + i, + n + ); +} +function processOrientation(e, t, n, i) { + const r = t.orientation; + defined(r) && processPacketData( + Quaternion, + e, + "orientation", + r, + void 0, + i, + n + ); +} +function processProperties(e, t, n, i) { + const r = t.properties; + if (defined(r)) { + defined(e.properties) || (e.properties = new PropertyBag()); + for (const o in r) + if (r.hasOwnProperty(o)) { + e.properties.hasProperty(o) || e.properties.addProperty(o); + const s = r[o]; + if (Array.isArray(s)) + for (let c = 0, l = s.length; c < l; ++c) + processProperty( + getPropertyType(s[c]), + e.properties, + o, + s[c], + void 0, + i, + n + ); + else + processProperty( + getPropertyType(s), + e.properties, + o, + s, + void 0, + i, + n + ); + } + } +} +function processReferencesArrayPacketData(e, t, n, i, r, o, s) { + const c = n.map(function(l) { + return createReferenceProperty(r, l); + }); + if (defined(i)) { + i = intervalFromString(i); + let l = e[t]; + if (!(l instanceof s)) { + const d = new s(); + d.intervals.addInterval(wrapPropertyInInfiniteInterval(l)), e[t] = l = d; + } + i.data = new o(c), l.intervals.addInterval(i); + } else + e[t] = new o(c); +} +function processArrayPacketData(e, t, n, i) { + const r = n.references; + defined(r) ? processReferencesArrayPacketData( + e, + t, + r, + n.interval, + i, + PropertyArray, + CompositeProperty + ) : processPacketData( + Array, + e, + t, + n, + void 0, + void 0, + i + ); +} +function processArray(e, t, n, i) { + if (defined(n)) + if (Array.isArray(n)) + for (let r = 0, o = n.length; r < o; ++r) + processArrayPacketData( + e, + t, + n[r], + i + ); + else + processArrayPacketData(e, t, n, i); +} +function processPositionArrayPacketData(e, t, n, i) { + const r = n.references; + defined(r) ? processReferencesArrayPacketData( + e, + t, + r, + n.interval, + i, + PositionPropertyArray, + CompositePositionProperty + ) : (defined(n.cartesian) ? n.array = Cartesian3.unpackArray(n.cartesian) : defined(n.cartographicRadians) ? n.array = Cartesian3.fromRadiansArrayHeights( + n.cartographicRadians, + Ellipsoid.default + ) : defined(n.cartographicDegrees) && (n.array = Cartesian3.fromDegreesArrayHeights( + n.cartographicDegrees, + Ellipsoid.default + )), defined(n.array) && processPacketData( + Array, + e, + t, + n, + void 0, + void 0, + i + )); +} +function processPositionArray(e, t, n, i) { + if (defined(n)) + if (Array.isArray(n)) + for (let r = 0, o = n.length; r < o; ++r) + processPositionArrayPacketData( + e, + t, + n[r], + i + ); + else + processPositionArrayPacketData( + e, + t, + n, + i + ); +} +function unpackCartesianArray(e) { + return Cartesian3.unpackArray(e); +} +function unpackCartographicRadiansArray(e) { + return Cartesian3.fromRadiansArrayHeights(e, Ellipsoid.default); +} +function unpackCartographicDegreesArray(e) { + return Cartesian3.fromDegreesArrayHeights(e, Ellipsoid.default); +} +function processPositionArrayOfArraysPacketData(e, t, n, i) { + const r = n.references; + if (defined(r)) { + const o = r.map(function(s) { + const c = {}; + return processReferencesArrayPacketData( + c, + "positions", + s, + n.interval, + i, + PositionPropertyArray, + CompositePositionProperty + ), c.positions; + }); + e[t] = new PositionPropertyArray(o); + } else + defined(n.cartesian) ? n.array = n.cartesian.map(unpackCartesianArray) : defined(n.cartographicRadians) ? n.array = n.cartographicRadians.map( + unpackCartographicRadiansArray + ) : defined(n.cartographicDegrees) && (n.array = n.cartographicDegrees.map( + unpackCartographicDegreesArray + )), defined(n.array) && processPacketData( + Array, + e, + t, + n, + void 0, + void 0, + i + ); +} +function processPositionArrayOfArrays(e, t, n, i) { + if (defined(n)) + if (Array.isArray(n)) + for (let r = 0, o = n.length; r < o; ++r) + processPositionArrayOfArraysPacketData( + e, + t, + n[r], + i + ); + else + processPositionArrayOfArraysPacketData( + e, + t, + n, + i + ); +} +function processShape(e, t, n, i) { + if (defined(n)) + if (Array.isArray(n)) + for (let r = 0, o = n.length; r < o; r++) + processShapePacketData( + e, + t, + n[r], + i + ); + else + processShapePacketData(e, t, n, i); +} +function processAvailability(e, t, n, i) { + const r = t.availability; + if (!defined(r)) + return; + let o; + if (Array.isArray(r)) + for (let s = 0, c = r.length; s < c; ++s) + defined(o) || (o = new TimeIntervalCollection()), o.addInterval(intervalFromString(r[s])); + else + o = new TimeIntervalCollection(), o.addInterval(intervalFromString(r)); + e.availability = o; +} +function processAlignedAxis(e, t, n, i, r) { + defined(t) && processPacketData( + UnitCartesian3, + e, + "alignedAxis", + t, + n, + i, + r + ); +} +function processBillboard(e, t, n, i) { + const r = t.billboard; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.billboard; + defined(s) || (e.billboard = s = new BillboardGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Image, + s, + "image", + r.image, + o, + i, + n + ), processPacketData( + Number, + s, + "scale", + r.scale, + o, + i, + n + ), processPacketData( + Cartesian2, + s, + "pixelOffset", + r.pixelOffset, + o, + i, + n + ), processPacketData( + Cartesian3, + s, + "eyeOffset", + r.eyeOffset, + o, + i, + n + ), processPacketData( + HorizontalOrigin$1, + s, + "horizontalOrigin", + r.horizontalOrigin, + o, + i, + n + ), processPacketData( + VerticalOrigin$1, + s, + "verticalOrigin", + r.verticalOrigin, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Color, + s, + "color", + r.color, + o, + i, + n + ), processPacketData( + Rotation, + s, + "rotation", + r.rotation, + o, + i, + n + ), processAlignedAxis( + s, + r.alignedAxis, + o, + i, + n + ), processPacketData( + Boolean, + s, + "sizeInMeters", + r.sizeInMeters, + o, + i, + n + ), processPacketData( + Number, + s, + "width", + r.width, + o, + i, + n + ), processPacketData( + Number, + s, + "height", + r.height, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "scaleByDistance", + r.scaleByDistance, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "translucencyByDistance", + r.translucencyByDistance, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "pixelOffsetScaleByDistance", + r.pixelOffsetScaleByDistance, + o, + i, + n + ), processPacketData( + BoundingRectangle, + s, + "imageSubRegion", + r.imageSubRegion, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + Number, + s, + "disableDepthTestDistance", + r.disableDepthTestDistance, + o, + i, + n + ); +} +function processBox(e, t, n, i) { + const r = t.box; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.box; + defined(s) || (e.box = s = new BoxGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Cartesian3, + s, + "dimensions", + r.dimensions, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processCorridor(e, t, n, i) { + const r = t.corridor; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.corridor; + defined(s) || (e.corridor = s = new CorridorGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPositionArray( + s, + "positions", + r.positions, + n + ), processPacketData( + Number, + s, + "width", + r.width, + o, + i, + n + ), processPacketData( + Number, + s, + "height", + r.height, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Number, + s, + "extrudedHeight", + r.extrudedHeight, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "extrudedHeightReference", + r.extrudedHeightReference, + o, + i, + n + ), processPacketData( + CornerType$1, + s, + "cornerType", + r.cornerType, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + ClassificationType$1, + s, + "classificationType", + r.classificationType, + o, + i, + n + ), processPacketData( + Number, + s, + "zIndex", + r.zIndex, + o, + i, + n + ); +} +function processCylinder(e, t, n, i) { + const r = t.cylinder; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.cylinder; + defined(s) || (e.cylinder = s = new CylinderGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Number, + s, + "length", + r.length, + o, + i, + n + ), processPacketData( + Number, + s, + "topRadius", + r.topRadius, + o, + i, + n + ), processPacketData( + Number, + s, + "bottomRadius", + r.bottomRadius, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + Number, + s, + "numberOfVerticalLines", + r.numberOfVerticalLines, + o, + i, + n + ), processPacketData( + Number, + s, + "slices", + r.slices, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processDocument$1(e, t) { + const n = e.version; + if (defined(n) && typeof n == "string") { + const o = n.split("."); + if (o.length === 2) { + if (o[0] !== "1") + throw new RuntimeError("Cesium only supports CZML version 1."); + t._version = n; + } + } + if (!defined(t._version)) + throw new RuntimeError( + "CZML version information invalid. It is expected to be a property on the document object in the . version format." + ); + const i = t._documentPacket; + defined(e.name) && (i.name = e.name); + const r = e.clock; + if (defined(r)) { + const o = i.clock; + defined(o) ? (o.interval = defaultValue(r.interval, o.interval), o.currentTime = defaultValue( + r.currentTime, + o.currentTime + ), o.range = defaultValue(r.range, o.range), o.step = defaultValue(r.step, o.step), o.multiplier = defaultValue(r.multiplier, o.multiplier)) : i.clock = { + interval: r.interval, + currentTime: r.currentTime, + range: r.range, + step: r.step, + multiplier: r.multiplier + }; + } +} +function processEllipse(e, t, n, i) { + const r = t.ellipse; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.ellipse; + defined(s) || (e.ellipse = s = new EllipseGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Number, + s, + "semiMajorAxis", + r.semiMajorAxis, + o, + i, + n + ), processPacketData( + Number, + s, + "semiMinorAxis", + r.semiMinorAxis, + o, + i, + n + ), processPacketData( + Number, + s, + "height", + r.height, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Number, + s, + "extrudedHeight", + r.extrudedHeight, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "extrudedHeightReference", + r.extrudedHeightReference, + o, + i, + n + ), processPacketData( + Rotation, + s, + "rotation", + r.rotation, + o, + i, + n + ), processPacketData( + Rotation, + s, + "stRotation", + r.stRotation, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + Number, + s, + "numberOfVerticalLines", + r.numberOfVerticalLines, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + ClassificationType$1, + s, + "classificationType", + r.classificationType, + o, + i, + n + ), processPacketData( + Number, + s, + "zIndex", + r.zIndex, + o, + i, + n + ); +} +function processEllipsoid(e, t, n, i) { + const r = t.ellipsoid; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.ellipsoid; + defined(s) || (e.ellipsoid = s = new EllipsoidGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Cartesian3, + s, + "radii", + r.radii, + o, + i, + n + ), processPacketData( + Cartesian3, + s, + "innerRadii", + r.innerRadii, + o, + i, + n + ), processPacketData( + Number, + s, + "minimumClock", + r.minimumClock, + o, + i, + n + ), processPacketData( + Number, + s, + "maximumClock", + r.maximumClock, + o, + i, + n + ), processPacketData( + Number, + s, + "minimumCone", + r.minimumCone, + o, + i, + n + ), processPacketData( + Number, + s, + "maximumCone", + r.maximumCone, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + Number, + s, + "stackPartitions", + r.stackPartitions, + o, + i, + n + ), processPacketData( + Number, + s, + "slicePartitions", + r.slicePartitions, + o, + i, + n + ), processPacketData( + Number, + s, + "subdivisions", + r.subdivisions, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processLabel(e, t, n, i) { + const r = t.label; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.label; + defined(s) || (e.label = s = new LabelGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + String, + s, + "text", + r.text, + o, + i, + n + ), processPacketData( + String, + s, + "font", + r.font, + o, + i, + n + ), processPacketData( + LabelStyle$1, + s, + "style", + r.style, + o, + i, + n + ), processPacketData( + Number, + s, + "scale", + r.scale, + o, + i, + n + ), processPacketData( + Boolean, + s, + "showBackground", + r.showBackground, + o, + i, + n + ), processPacketData( + Color, + s, + "backgroundColor", + r.backgroundColor, + o, + i, + n + ), processPacketData( + Cartesian2, + s, + "backgroundPadding", + r.backgroundPadding, + o, + i, + n + ), processPacketData( + Cartesian2, + s, + "pixelOffset", + r.pixelOffset, + o, + i, + n + ), processPacketData( + Cartesian3, + s, + "eyeOffset", + r.eyeOffset, + o, + i, + n + ), processPacketData( + HorizontalOrigin$1, + s, + "horizontalOrigin", + r.horizontalOrigin, + o, + i, + n + ), processPacketData( + VerticalOrigin$1, + s, + "verticalOrigin", + r.verticalOrigin, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Color, + s, + "fillColor", + r.fillColor, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "translucencyByDistance", + r.translucencyByDistance, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "pixelOffsetScaleByDistance", + r.pixelOffsetScaleByDistance, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "scaleByDistance", + r.scaleByDistance, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + Number, + s, + "disableDepthTestDistance", + r.disableDepthTestDistance, + o, + i, + n + ); +} +function processModel(e, t, n, i) { + const r = t.model; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.model; + defined(s) || (e.model = s = new ModelGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Uri, + s, + "uri", + r.gltf, + o, + i, + n + ), processPacketData( + Number, + s, + "scale", + r.scale, + o, + i, + n + ), processPacketData( + Number, + s, + "minimumPixelSize", + r.minimumPixelSize, + o, + i, + n + ), processPacketData( + Number, + s, + "maximumScale", + r.maximumScale, + o, + i, + n + ), processPacketData( + Boolean, + s, + "incrementallyLoadTextures", + r.incrementallyLoadTextures, + o, + i, + n + ), processPacketData( + Boolean, + s, + "runAnimations", + r.runAnimations, + o, + i, + n + ), processPacketData( + Boolean, + s, + "clampAnimations", + r.clampAnimations, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Color, + s, + "silhouetteColor", + r.silhouetteColor, + o, + i, + n + ), processPacketData( + Number, + s, + "silhouetteSize", + r.silhouetteSize, + o, + i, + n + ), processPacketData( + Color, + s, + "color", + r.color, + o, + i, + n + ), processPacketData( + ColorBlendMode$1, + s, + "colorBlendMode", + r.colorBlendMode, + o, + i, + n + ), processPacketData( + Number, + s, + "colorBlendAmount", + r.colorBlendAmount, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); + let c, l; + const d = r.nodeTransformations; + if (defined(d)) + if (Array.isArray(d)) + for (c = 0, l = d.length; c < l; ++c) + processNodeTransformations( + s, + d[c], + o, + i, + n + ); + else + processNodeTransformations( + s, + d, + o, + i, + n + ); + const f = r.articulations; + if (defined(f)) + if (Array.isArray(f)) + for (c = 0, l = f.length; c < l; ++c) + processArticulations( + s, + f[c], + o, + i, + n + ); + else + processArticulations( + s, + f, + o, + i, + n + ); +} +function processNodeTransformations(e, t, n, i, r) { + let o = intervalFromString(t.interval); + defined(n) && (defined(o) ? o = TimeInterval.intersect( + o, + n, + scratchTimeInterval$1 + ) : o = n); + let s = e.nodeTransformations; + const c = Object.keys(t); + for (let l = 0, d = c.length; l < d; ++l) { + const f = c[l]; + if (f === "interval") + continue; + const h = t[f]; + if (!defined(h)) + continue; + defined(s) || (e.nodeTransformations = s = new PropertyBag()), s.hasProperty(f) || s.addProperty(f); + let p = s[f]; + defined(p) || (s[f] = p = new NodeTransformationProperty()), processPacketData( + Cartesian3, + p, + "translation", + h.translation, + o, + i, + r + ), processPacketData( + Quaternion, + p, + "rotation", + h.rotation, + o, + i, + r + ), processPacketData( + Cartesian3, + p, + "scale", + h.scale, + o, + i, + r + ); + } +} +function processArticulations(e, t, n, i, r) { + let o = intervalFromString(t.interval); + defined(n) && (defined(o) ? o = TimeInterval.intersect( + o, + n, + scratchTimeInterval$1 + ) : o = n); + let s = e.articulations; + const c = Object.keys(t); + for (let l = 0, d = c.length; l < d; ++l) { + const f = c[l]; + if (f === "interval") + continue; + const h = t[f]; + defined(h) && (defined(s) || (e.articulations = s = new PropertyBag()), s.hasProperty(f) || s.addProperty(f), processPacketData( + Number, + s, + f, + h, + o, + i, + r + )); + } +} +function processPath(e, t, n, i) { + const r = t.path; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.path; + defined(s) || (e.path = s = new PathGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Number, + s, + "leadTime", + r.leadTime, + o, + i, + n + ), processPacketData( + Number, + s, + "trailTime", + r.trailTime, + o, + i, + n + ), processPacketData( + Number, + s, + "width", + r.width, + o, + i, + n + ), processPacketData( + Number, + s, + "resolution", + r.resolution, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processPoint$2(e, t, n, i) { + const r = t.point; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.point; + defined(s) || (e.point = s = new PointGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Number, + s, + "pixelSize", + r.pixelSize, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Color, + s, + "color", + r.color, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "scaleByDistance", + r.scaleByDistance, + o, + i, + n + ), processPacketData( + NearFarScalar, + s, + "translucencyByDistance", + r.translucencyByDistance, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + Number, + s, + "disableDepthTestDistance", + r.disableDepthTestDistance, + o, + i, + n + ); +} +function PolygonHierarchyProperty(e) { + this.polygon = e, this._definitionChanged = new Event(); +} +Object.defineProperties(PolygonHierarchyProperty.prototype, { + isConstant: { + get: function() { + const e = this.polygon._positions, t = this.polygon._holes; + return (!defined(e) || e.isConstant) && (!defined(t) || t.isConstant); + } + }, + definitionChanged: { + get: function() { + return this._definitionChanged; + } + } +}); +PolygonHierarchyProperty.prototype.getValue = function(e, t) { + let n; + defined(this.polygon._positions) && (n = this.polygon._positions.getValue(e)); + let i; + return defined(this.polygon._holes) && (i = this.polygon._holes.getValue(e), defined(i) && (i = i.map(function(r) { + return new PolygonHierarchy(r); + }))), defined(t) ? (t.positions = n, t.holes = i, t) : new PolygonHierarchy(n, i); +}; +PolygonHierarchyProperty.prototype.equals = function(e) { + return this === e || e instanceof PolygonHierarchyProperty && Property.equals(this.polygon._positions, e.polygon._positions) && Property.equals(this.polygon._holes, e.polygon._holes); +}; +function processPolygon$2(e, t, n, i) { + const r = t.polygon; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.polygon; + defined(s) || (e.polygon = s = new PolygonGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPositionArray( + s, + "_positions", + r.positions, + n + ), processPositionArrayOfArrays( + s, + "_holes", + r.holes, + n + ), (defined(s._positions) || defined(s._holes)) && (s.hierarchy = new PolygonHierarchyProperty(s)), processPacketData( + Number, + s, + "height", + r.height, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Number, + s, + "extrudedHeight", + r.extrudedHeight, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "extrudedHeightReference", + r.extrudedHeightReference, + o, + i, + n + ), processPacketData( + Rotation, + s, + "stRotation", + r.stRotation, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + Boolean, + s, + "perPositionHeight", + r.perPositionHeight, + o, + i, + n + ), processPacketData( + Boolean, + s, + "closeTop", + r.closeTop, + o, + i, + n + ), processPacketData( + Boolean, + s, + "closeBottom", + r.closeBottom, + o, + i, + n + ), processPacketData( + ArcType$1, + s, + "arcType", + r.arcType, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + ClassificationType$1, + s, + "classificationType", + r.classificationType, + o, + i, + n + ), processPacketData( + Number, + s, + "zIndex", + r.zIndex, + o, + i, + n + ); +} +function adaptFollowSurfaceToArcType(e) { + return e ? ArcType$1.GEODESIC : ArcType$1.NONE; +} +function processPolyline(e, t, n, i) { + const r = t.polyline; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.polyline; + if (defined(s) || (e.polyline = s = new PolylineGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPositionArray( + s, + "positions", + r.positions, + n + ), processPacketData( + Number, + s, + "width", + r.width, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processMaterialPacketData( + s, + "depthFailMaterial", + r.depthFailMaterial, + o, + i, + n + ), processPacketData( + ArcType$1, + s, + "arcType", + r.arcType, + o, + i, + n + ), processPacketData( + Boolean, + s, + "clampToGround", + r.clampToGround, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + ClassificationType$1, + s, + "classificationType", + r.classificationType, + o, + i, + n + ), processPacketData( + Number, + s, + "zIndex", + r.zIndex, + o, + i, + n + ), defined(r.followSurface) && !defined(r.arcType)) { + const c = {}; + processPacketData( + Boolean, + c, + "followSurface", + r.followSurface, + o, + i, + n + ), s.arcType = createAdapterProperty( + c.followSurface, + adaptFollowSurfaceToArcType + ); + } +} +function processPolylineVolume(e, t, n, i) { + const r = t.polylineVolume; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.polylineVolume; + defined(s) || (e.polylineVolume = s = new PolylineVolumeGraphics()), processPositionArray( + s, + "positions", + r.positions, + n + ), processShape( + s, + "shape", + r.shape, + n + ), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + CornerType$1, + s, + "cornerType", + r.cornerType, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processRectangle(e, t, n, i) { + const r = t.rectangle; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.rectangle; + defined(s) || (e.rectangle = s = new RectangleGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Rectangle, + s, + "coordinates", + r.coordinates, + o, + i, + n + ), processPacketData( + Number, + s, + "height", + r.height, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "heightReference", + r.heightReference, + o, + i, + n + ), processPacketData( + Number, + s, + "extrudedHeight", + r.extrudedHeight, + o, + i, + n + ), processPacketData( + HeightReference$1, + s, + "extrudedHeightReference", + r.extrudedHeightReference, + o, + i, + n + ), processPacketData( + Rotation, + s, + "rotation", + r.rotation, + o, + i, + n + ), processPacketData( + Rotation, + s, + "stRotation", + r.stRotation, + o, + i, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ), processPacketData( + ClassificationType$1, + s, + "classificationType", + r.classificationType, + o, + i, + n + ), processPacketData( + Number, + s, + "zIndex", + r.zIndex, + o, + i, + n + ); +} +function processTileset(e, t, n, i) { + const r = t.tileset; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.tileset; + defined(s) || (e.tileset = s = new Cesium3DTilesetGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPacketData( + Uri, + s, + "uri", + r.uri, + o, + i, + n + ), processPacketData( + Number, + s, + "maximumScreenSpaceError", + r.maximumScreenSpaceError, + o, + i, + n + ); +} +function processWall(e, t, n, i) { + const r = t.wall; + if (!defined(r)) + return; + const o = intervalFromString(r.interval); + let s = e.wall; + defined(s) || (e.wall = s = new WallGraphics()), processPacketData( + Boolean, + s, + "show", + r.show, + o, + i, + n + ), processPositionArray(s, "positions", r.positions, n), processArray( + s, + "minimumHeights", + r.minimumHeights, + n + ), processArray( + s, + "maximumHeights", + r.maximumHeights, + n + ), processPacketData( + Number, + s, + "granularity", + r.granularity, + o, + i, + n + ), processPacketData( + Boolean, + s, + "fill", + r.fill, + o, + i, + n + ), processMaterialPacketData( + s, + "material", + r.material, + o, + i, + n + ), processPacketData( + Boolean, + s, + "outline", + r.outline, + o, + i, + n + ), processPacketData( + Color, + s, + "outlineColor", + r.outlineColor, + o, + i, + n + ), processPacketData( + Number, + s, + "outlineWidth", + r.outlineWidth, + o, + i, + n + ), processPacketData( + ShadowMode$1, + s, + "shadows", + r.shadows, + o, + i, + n + ), processPacketData( + DistanceDisplayCondition, + s, + "distanceDisplayCondition", + r.distanceDisplayCondition, + o, + i, + n + ); +} +function processCzmlPacket(e, t, n, i, r) { + let o = e.id; + if (defined(o) || (o = createGuid()), currentId = o, !defined(r._version) && o !== "document") + throw new RuntimeError( + "The first CZML packet is required to be the document object." + ); + if (e.delete === !0) + t.removeById(o); + else if (o === "document") + processDocument$1(e, r); + else { + const s = t.getOrCreateEntity(o), c = e.parent; + defined(c) && (s.parent = t.getOrCreateEntity(c)); + for (let l = n.length - 1; l > -1; l--) + n[l](s, e, t, i); + } + currentId = void 0; +} +function updateClock(e) { + let t; + const n = e._documentPacket.clock; + if (!defined(n)) { + if (!defined(e._clock)) { + const r = e._entityCollection.computeAvailability(); + if (!r.start.equals(Iso8601.MINIMUM_VALUE)) { + const o = r.start, s = r.stop, c = JulianDate.secondsDifference(s, o), l = Math.round(c / 120); + return t = new DataSourceClock(), t.startTime = JulianDate.clone(o), t.stopTime = JulianDate.clone(s), t.clockRange = ClockRange$1.LOOP_STOP, t.multiplier = l, t.currentTime = JulianDate.clone(o), t.clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER, e._clock = t, !0; + } + } + return !1; + } + defined(e._clock) ? t = e._clock.clone() : (t = new DataSourceClock(), t.startTime = Iso8601.MINIMUM_VALUE.clone(), t.stopTime = Iso8601.MAXIMUM_VALUE.clone(), t.currentTime = Iso8601.MINIMUM_VALUE.clone(), t.clockRange = ClockRange$1.LOOP_STOP, t.clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER, t.multiplier = 1); + const i = intervalFromString(n.interval); + return defined(i) && (t.startTime = i.start, t.stopTime = i.stop), defined(n.currentTime) && (t.currentTime = JulianDate.fromIso8601(n.currentTime)), defined(n.range) && (t.clockRange = defaultValue( + ClockRange$1[n.range], + ClockRange$1.LOOP_STOP + )), defined(n.step) && (t.clockStep = defaultValue( + ClockStep$1[n.step], + ClockStep$1.SYSTEM_CLOCK_MULTIPLIER + )), defined(n.multiplier) && (t.multiplier = n.multiplier), t.equals(e._clock) ? !1 : (e._clock = t.clone(e._clock), !0); +} +function load$4(e, t, n, i) { + n = defaultValue(n, defaultValue.EMPTY_OBJECT); + let r = t, o = n.sourceUri, s = n.credit; + if (typeof s == "string" && (s = new Credit(s)), e._credit = s, typeof t == "string" || t instanceof Resource) { + t = Resource.createIfNeeded(t), r = t.fetchJson(), o = defaultValue(o, t.clone()); + const c = e._resourceCredits, l = t.credits; + if (defined(l)) { + const d = l.length; + for (let f = 0; f < d; f++) + c.push(l[f]); + } + } + return o = Resource.createIfNeeded(o), DataSource.setLoading(e, !0), Promise.resolve(r).then(function(c) { + return loadCzml(e, c, o, i); + }).catch(function(c) { + return DataSource.setLoading(e, !1), e._error.raiseEvent(e, c), console.log(c), Promise.reject(c); + }); +} +function loadCzml(e, t, n, i) { + DataSource.setLoading(e, !0); + const r = e._entityCollection; + i && (e._version = void 0, e._documentPacket = new DocumentPacket(), r.removeAll()), CzmlDataSource._processCzml( + t, + r, + n, + void 0, + e + ); + let o = updateClock(e); + const s = e._documentPacket; + return defined(s.name) && e._name !== s.name ? (e._name = s.name, o = !0) : !defined(e._name) && defined(n) && (e._name = getFilenameFromUri(n.getUrlComponent()), o = !0), DataSource.setLoading(e, !1), o && e._changed.raiseEvent(e), e; +} +function DocumentPacket() { + this.name = void 0, this.clock = void 0; +} +function CzmlDataSource(e) { + this._name = e, this._changed = new Event(), this._error = new Event(), this._isLoading = !1, this._loading = new Event(), this._clock = void 0, this._documentPacket = new DocumentPacket(), this._version = void 0, this._entityCollection = new EntityCollection(this), this._entityCluster = new EntityCluster(), this._credit = void 0, this._resourceCredits = []; +} +CzmlDataSource.load = function(e, t) { + return new CzmlDataSource().load(e, t); +}; +Object.defineProperties(CzmlDataSource.prototype, { + /** + * Gets a human-readable name for this instance. + * @memberof CzmlDataSource.prototype + * @type {string} + */ + name: { + get: function() { + return this._name; + } + }, + /** + * Gets the clock settings defined by the loaded CZML. If no clock is explicitly + * defined in the CZML, the combined availability of all objects is returned. If + * only static data exists, this value is undefined. + * @memberof CzmlDataSource.prototype + * @type {DataSourceClock} + */ + clock: { + get: function() { + return this._clock; + } + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof CzmlDataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: function() { + return this._entityCollection; + } + }, + /** + * Gets a value indicating if the data source is currently loading data. + * @memberof CzmlDataSource.prototype + * @type {boolean} + */ + isLoading: { + get: function() { + return this._isLoading; + } + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof CzmlDataSource.prototype + * @type {Event} + */ + changedEvent: { + get: function() { + return this._changed; + } + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof CzmlDataSource.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._error; + } + }, + /** + * Gets an event that will be raised when the data source either starts or stops loading. + * @memberof CzmlDataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: function() { + return this._loading; + } + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof CzmlDataSource.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._entityCollection.show; + }, + set: function(e) { + this._entityCollection.show = e; + } + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof CzmlDataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: function() { + return this._entityCluster; + }, + set: function(e) { + this._entityCluster = e; + } + }, + /** + * Gets the credit that will be displayed for the data source + * @memberof CzmlDataSource.prototype + * @type {Credit} + */ + credit: { + get: function() { + return this._credit; + } + } +}); +CzmlDataSource.updaters = [ + processBillboard, + processBox, + processCorridor, + processCylinder, + processEllipse, + processEllipsoid, + processLabel, + processModel, + processName, + processDescription$2, + processPath, + processPoint$2, + processPolygon$2, + processPolyline, + processPolylineVolume, + processProperties, + processRectangle, + processPosition, + processTileset, + processViewFrom, + processWall, + processOrientation, + processAvailability +]; +CzmlDataSource.registerUpdater = function(e) { + CzmlDataSource.updaters.includes(e) || CzmlDataSource.updaters.push(e); +}; +CzmlDataSource.unregisterUpdater = function(e) { + if (CzmlDataSource.updaters.includes(e)) { + const t = CzmlDataSource.updaters.indexOf(e); + CzmlDataSource.updaters.splice(t, 1); + } +}; +CzmlDataSource.prototype.process = function(e, t) { + return load$4(this, e, t, !1); +}; +CzmlDataSource.prototype.load = function(e, t) { + return load$4(this, e, t, !0); +}; +CzmlDataSource.prototype.update = function(e) { + return !0; +}; +CzmlDataSource.processPacketData = processPacketData; +CzmlDataSource.processPositionPacketData = processPositionPacketData; +CzmlDataSource.processMaterialPacketData = processMaterialPacketData; +CzmlDataSource._processCzml = function(e, t, n, i, r) { + if (i = defaultValue(i, CzmlDataSource.updaters), Array.isArray(e)) + for (let o = 0, s = e.length; o < s; ++o) + processCzmlPacket( + e[o], + t, + i, + n, + r + ); + else + processCzmlPacket( + e, + t, + i, + n, + r + ); +}; +function DataSourceCollection() { + this._dataSources = [], this._dataSourceAdded = new Event(), this._dataSourceRemoved = new Event(), this._dataSourceMoved = new Event(); +} +Object.defineProperties(DataSourceCollection.prototype, { + /** + * Gets the number of data sources in this collection. + * @memberof DataSourceCollection.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._dataSources.length; + } + }, + /** + * An event that is raised when a data source is added to the collection. + * Event handlers are passed the data source that was added. + * @memberof DataSourceCollection.prototype + * @type {Event} + * @readonly + */ + dataSourceAdded: { + get: function() { + return this._dataSourceAdded; + } + }, + /** + * An event that is raised when a data source is removed from the collection. + * Event handlers are passed the data source that was removed. + * @memberof DataSourceCollection.prototype + * @type {Event} + * @readonly + */ + dataSourceRemoved: { + get: function() { + return this._dataSourceRemoved; + } + }, + /** + * An event that is raised when a data source changes position in the collection. Event handlers are passed the data source + * that was moved, its new index after the move, and its old index prior to the move. + * @memberof DataSourceCollection.prototype + * @type {Event} + * @readonly + */ + dataSourceMoved: { + get: function() { + return this._dataSourceMoved; + } + } +}); +DataSourceCollection.prototype.add = function(e) { + const t = this, n = this._dataSources; + return Promise.resolve(e).then(function(i) { + return n === t._dataSources && (t._dataSources.push(i), t._dataSourceAdded.raiseEvent(t, i)), i; + }); +}; +DataSourceCollection.prototype.remove = function(e, t) { + t = defaultValue(t, !1); + const n = this._dataSources.indexOf(e); + return n !== -1 ? (this._dataSources.splice(n, 1), this._dataSourceRemoved.raiseEvent(this, e), t && typeof e.destroy == "function" && e.destroy(), !0) : !1; +}; +DataSourceCollection.prototype.removeAll = function(e) { + e = defaultValue(e, !1); + const t = this._dataSources; + for (let n = 0, i = t.length; n < i; ++n) { + const r = t[n]; + this._dataSourceRemoved.raiseEvent(this, r), e && typeof r.destroy == "function" && r.destroy(); + } + this._dataSources = []; +}; +DataSourceCollection.prototype.contains = function(e) { + return this.indexOf(e) !== -1; +}; +DataSourceCollection.prototype.indexOf = function(e) { + return this._dataSources.indexOf(e); +}; +DataSourceCollection.prototype.get = function(e) { + return this._dataSources[e]; +}; +DataSourceCollection.prototype.getByName = function(e) { + return this._dataSources.filter(function(t) { + return t.name === e; + }); +}; +function getIndex(e, t) { + return e.indexOf(t); +} +function swapDataSources(e, t, n) { + const i = e._dataSources, r = i.length - 1; + if (t = CesiumMath.clamp(t, 0, r), n = CesiumMath.clamp(n, 0, r), t === n) + return; + const o = i[t]; + i[t] = i[n], i[n] = o, e.dataSourceMoved.raiseEvent(o, n, t); +} +DataSourceCollection.prototype.raise = function(e) { + const t = getIndex(this._dataSources, e); + swapDataSources(this, t, t + 1); +}; +DataSourceCollection.prototype.lower = function(e) { + const t = getIndex(this._dataSources, e); + swapDataSources(this, t, t - 1); +}; +DataSourceCollection.prototype.raiseToTop = function(e) { + const t = getIndex(this._dataSources, e); + t !== this._dataSources.length - 1 && (this._dataSources.splice(t, 1), this._dataSources.push(e), this.dataSourceMoved.raiseEvent( + e, + this._dataSources.length - 1, + t + )); +}; +DataSourceCollection.prototype.lowerToBottom = function(e) { + const t = getIndex(this._dataSources, e); + t !== 0 && (this._dataSources.splice(t, 1), this._dataSources.splice(0, 0, e), this.dataSourceMoved.raiseEvent(e, 0, t)); +}; +DataSourceCollection.prototype.isDestroyed = function() { + return !1; +}; +DataSourceCollection.prototype.destroy = function() { + return this.removeAll(!0), destroyObject(this); +}; +function PrimitiveCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._primitives = [], this._guid = createGuid(), this._primitiveAdded = new Event(), this._primitiveRemoved = new Event(), this._zIndex = void 0, this.show = defaultValue(e.show, !0), this.destroyPrimitives = defaultValue(e.destroyPrimitives, !0); +} +Object.defineProperties(PrimitiveCollection.prototype, { + /** + * Gets the number of primitives in the collection. + * + * @memberof PrimitiveCollection.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._primitives.length; + } + }, + /** + * An event that is raised when a primitive is added to the collection. + * Event handlers are passed the primitive that was added. + * @memberof PrimitiveCollection.prototype + * @type {Event} + * @readonly + */ + primitiveAdded: { + get: function() { + return this._primitiveAdded; + } + }, + /** + * An event that is raised when a primitive is removed from the collection. + * Event handlers are passed the primitive that was removed. + *

+ * Note: Depending on the destroyPrimitives constructor option, the primitive may already be destroyed. + *

+ * @memberof PrimitiveCollection.prototype + * @type {Event} + * @readonly + */ + primitiveRemoved: { + get: function() { + return this._primitiveRemoved; + } + } +}); +PrimitiveCollection.prototype.add = function(e, t) { + const n = defined(t), i = e._external = e._external || {}, r = i._composites = i._composites || {}; + return r[this._guid] = { + collection: this + }, n ? this._primitives.splice(t, 0, e) : this._primitives.push(e), this._primitiveAdded.raiseEvent(e), e; +}; +PrimitiveCollection.prototype.remove = function(e) { + if (this.contains(e)) { + const t = this._primitives.indexOf(e); + if (t !== -1) + return this._primitives.splice(t, 1), delete e._external._composites[this._guid], this.destroyPrimitives && e.destroy(), this._primitiveRemoved.raiseEvent(e), !0; + } + return !1; +}; +PrimitiveCollection.prototype.removeAndDestroy = function(e) { + const t = this.remove(e); + return t && !this.destroyPrimitives && e.destroy(), t; +}; +PrimitiveCollection.prototype.removeAll = function() { + const e = this._primitives, t = e.length; + for (let n = 0; n < t; ++n) + delete e[n]._external._composites[this._guid], this.destroyPrimitives && e[n].destroy(), this._primitiveRemoved.raiseEvent(e[n]); + this._primitives = []; +}; +PrimitiveCollection.prototype.contains = function(e) { + return !!(defined(e) && e._external && e._external._composites && e._external._composites[this._guid]); +}; +function getPrimitiveIndex(e, t) { + return e._primitives.indexOf(t); +} +PrimitiveCollection.prototype.raise = function(e) { + if (defined(e)) { + const t = getPrimitiveIndex(this, e), n = this._primitives; + if (t !== n.length - 1) { + const i = n[t]; + n[t] = n[t + 1], n[t + 1] = i; + } + } +}; +PrimitiveCollection.prototype.raiseToTop = function(e) { + if (defined(e)) { + const t = getPrimitiveIndex(this, e), n = this._primitives; + t !== n.length - 1 && (n.splice(t, 1), n.push(e)); + } +}; +PrimitiveCollection.prototype.lower = function(e) { + if (defined(e)) { + const t = getPrimitiveIndex(this, e), n = this._primitives; + if (t !== 0) { + const i = n[t]; + n[t] = n[t - 1], n[t - 1] = i; + } + } +}; +PrimitiveCollection.prototype.lowerToBottom = function(e) { + if (defined(e)) { + const t = getPrimitiveIndex(this, e), n = this._primitives; + t !== 0 && (n.splice(t, 1), n.unshift(e)); + } +}; +PrimitiveCollection.prototype.get = function(e) { + return this._primitives[e]; +}; +PrimitiveCollection.prototype.update = function(e) { + if (!this.show) + return; + const t = this._primitives; + for (let n = 0; n < t.length; ++n) + t[n].update(e); +}; +PrimitiveCollection.prototype.prePassesUpdate = function(e) { + const t = this._primitives; + for (let n = 0; n < t.length; ++n) { + const i = t[n]; + defined(i.prePassesUpdate) && i.prePassesUpdate(e); + } +}; +PrimitiveCollection.prototype.updateForPass = function(e, t) { + const n = this._primitives; + for (let i = 0; i < n.length; ++i) { + const r = n[i]; + defined(r.updateForPass) && r.updateForPass(e, t); + } +}; +PrimitiveCollection.prototype.postPassesUpdate = function(e) { + const t = this._primitives; + for (let n = 0; n < t.length; ++n) { + const i = t[n]; + defined(i.postPassesUpdate) && i.postPassesUpdate(e); + } +}; +PrimitiveCollection.prototype.isDestroyed = function() { + return !1; +}; +PrimitiveCollection.prototype.destroy = function() { + return this.removeAll(), destroyObject(this); +}; +function OrderedGroundPrimitiveCollection() { + this._length = 0, this._collections = {}, this._collectionsArray = [], this.show = !0; +} +Object.defineProperties(OrderedGroundPrimitiveCollection.prototype, { + /** + * Gets the number of primitives in the collection. + * + * @memberof OrderedGroundPrimitiveCollection.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + } +}); +OrderedGroundPrimitiveCollection.prototype.add = function(e, t) { + t = defaultValue(t, 0); + let n = this._collections[t]; + if (!defined(n)) { + n = new PrimitiveCollection({ destroyPrimitives: !1 }), n._zIndex = t, this._collections[t] = n; + const i = this._collectionsArray; + let r = 0; + for (; r < i.length && i[r]._zIndex < t; ) + r++; + i.splice(r, 0, n); + } + return n.add(e), this._length++, e._zIndex = t, e; +}; +OrderedGroundPrimitiveCollection.prototype.set = function(e, t) { + return t === e._zIndex || (this.remove(e, !0), this.add(e, t)), e; +}; +OrderedGroundPrimitiveCollection.prototype.remove = function(e, t) { + if (this.contains(e)) { + const n = e._zIndex, i = this._collections[n]; + let r; + return t ? r = i.remove(e) : r = i.removeAndDestroy(e), r && this._length--, i.length === 0 && (this._collectionsArray.splice( + this._collectionsArray.indexOf(i), + 1 + ), this._collections[n] = void 0, i.destroy()), r; + } + return !1; +}; +OrderedGroundPrimitiveCollection.prototype.removeAll = function() { + const e = this._collectionsArray; + for (let t = 0; t < e.length; t++) { + const n = e[t]; + n.destroyPrimitives = !0, n.destroy(); + } + this._collections = {}, this._collectionsArray = [], this._length = 0; +}; +OrderedGroundPrimitiveCollection.prototype.contains = function(e) { + if (!defined(e)) + return !1; + const t = this._collections[e._zIndex]; + return defined(t) && t.contains(e); +}; +OrderedGroundPrimitiveCollection.prototype.update = function(e) { + if (!this.show) + return; + const t = this._collectionsArray; + for (let n = 0; n < t.length; n++) + t[n].update(e); +}; +OrderedGroundPrimitiveCollection.prototype.isDestroyed = function() { + return !1; +}; +OrderedGroundPrimitiveCollection.prototype.destroy = function() { + return this.removeAll(), destroyObject(this); +}; +function DynamicGeometryBatch(e, t) { + this._primitives = e, this._orderedGroundPrimitives = t, this._dynamicUpdaters = new AssociativeArray(); +} +DynamicGeometryBatch.prototype.add = function(e, t) { + this._dynamicUpdaters.set( + t.id, + t.createDynamicUpdater( + this._primitives, + this._orderedGroundPrimitives + ) + ); +}; +DynamicGeometryBatch.prototype.remove = function(e) { + const t = e.id, n = this._dynamicUpdaters.get(t); + defined(n) && (this._dynamicUpdaters.remove(t), n.destroy()); +}; +DynamicGeometryBatch.prototype.update = function(e) { + const t = this._dynamicUpdaters.values; + for (let n = 0, i = t.length; n < i; n++) + t[n].update(e); + return !0; +}; +DynamicGeometryBatch.prototype.removeAllPrimitives = function() { + const e = this._dynamicUpdaters.values; + for (let t = 0, n = e.length; t < n; t++) + e[t].destroy(); + this._dynamicUpdaters.removeAll(); +}; +DynamicGeometryBatch.prototype.getBoundingSphere = function(e, t) { + return e = this._dynamicUpdaters.get(e.id), defined(e) && defined(e.getBoundingSphere) ? e.getBoundingSphere(t) : BoundingSphereState$1.FAILED; +}; +const EllipseGeometryLibrary = {}, rotAxis = new Cartesian3(), tempVec = new Cartesian3(), unitQuat = new Quaternion(), rotMtx = new Matrix3(); +function pointOnEllipsoid(e, t, n, i, r, o, s, c, l, d) { + const f = e + t; + Cartesian3.multiplyByScalar(i, Math.cos(f), rotAxis), Cartesian3.multiplyByScalar(n, Math.sin(f), tempVec), Cartesian3.add(rotAxis, tempVec, rotAxis); + let h = Math.cos(e); + h = h * h; + let p = Math.sin(e); + p = p * p; + const _ = o / Math.sqrt(s * h + r * p) / c; + return Quaternion.fromAxisAngle(rotAxis, _, unitQuat), Matrix3.fromQuaternion(unitQuat, rotMtx), Matrix3.multiplyByVector(rotMtx, l, d), Cartesian3.normalize(d, d), Cartesian3.multiplyByScalar(d, c, d), d; +} +const scratchCartesian1$4 = new Cartesian3(), scratchCartesian2$6 = new Cartesian3(), scratchCartesian3$7 = new Cartesian3(), scratchNormal$6 = new Cartesian3(); +EllipseGeometryLibrary.raisePositionsToHeight = function(e, t, n) { + const i = t.ellipsoid, r = t.height, o = t.extrudedHeight, s = n ? e.length / 3 * 2 : e.length / 3, c = new Float64Array(s * 3), l = e.length, d = n ? l : 0; + for (let f = 0; f < l; f += 3) { + const h = f + 1, p = f + 2, m = Cartesian3.fromArray(e, f, scratchCartesian1$4); + i.scaleToGeodeticSurface(m, m); + const _ = Cartesian3.clone(m, scratchCartesian2$6), y = i.geodeticSurfaceNormal(m, scratchNormal$6), C = Cartesian3.multiplyByScalar( + y, + r, + scratchCartesian3$7 + ); + Cartesian3.add(m, C, m), n && (Cartesian3.multiplyByScalar(y, o, C), Cartesian3.add(_, C, _), c[f + d] = _.x, c[h + d] = _.y, c[p + d] = _.z), c[f] = m.x, c[h] = m.y, c[p] = m.z; + } + return c; +}; +const unitPosScratch = new Cartesian3(), eastVecScratch = new Cartesian3(), northVecScratch = new Cartesian3(); +EllipseGeometryLibrary.computeEllipsePositions = function(e, t, n) { + const i = e.semiMinorAxis, r = e.semiMajorAxis, o = e.rotation, s = e.center, c = e.granularity * 8, l = i * i, d = r * r, f = r * i, h = Cartesian3.magnitude(s), p = Cartesian3.normalize(s, unitPosScratch); + let m = Cartesian3.cross(Cartesian3.UNIT_Z, s, eastVecScratch); + m = Cartesian3.normalize(m, m); + const _ = Cartesian3.cross(p, m, northVecScratch); + let y = 1 + Math.ceil(CesiumMath.PI_OVER_TWO / c); + const C = CesiumMath.PI_OVER_TWO / (y - 1); + let T = CesiumMath.PI_OVER_TWO - y * C; + T < 0 && (y -= Math.ceil(Math.abs(T) / C)); + const x = 2 * (y * (y + 2)), b = t ? new Array(x * 3) : void 0; + let S = 0, E = scratchCartesian1$4, A = scratchCartesian2$6; + const D = y * 4 * 3; + let P = D - 1, I = 0; + const M = n ? new Array(D) : void 0; + let R, L, g, w, O; + for (T = CesiumMath.PI_OVER_TWO, E = pointOnEllipsoid( + T, + o, + _, + m, + l, + f, + d, + h, + p, + E + ), t && (b[S++] = E.x, b[S++] = E.y, b[S++] = E.z), n && (M[P--] = E.z, M[P--] = E.y, M[P--] = E.x), T = CesiumMath.PI_OVER_TWO - C, R = 1; R < y + 1; ++R) { + if (E = pointOnEllipsoid( + T, + o, + _, + m, + l, + f, + d, + h, + p, + E + ), A = pointOnEllipsoid( + Math.PI - T, + o, + _, + m, + l, + f, + d, + h, + p, + A + ), t) { + for (b[S++] = E.x, b[S++] = E.y, b[S++] = E.z, g = 2 * R + 2, L = 1; L < g - 1; ++L) + w = L / (g - 1), O = Cartesian3.lerp( + E, + A, + w, + scratchCartesian3$7 + ), b[S++] = O.x, b[S++] = O.y, b[S++] = O.z; + b[S++] = A.x, b[S++] = A.y, b[S++] = A.z; + } + n && (M[P--] = E.z, M[P--] = E.y, M[P--] = E.x, M[I++] = A.x, M[I++] = A.y, M[I++] = A.z), T = CesiumMath.PI_OVER_TWO - (R + 1) * C; + } + for (R = y; R > 1; --R) { + if (T = CesiumMath.PI_OVER_TWO - (R - 1) * C, E = pointOnEllipsoid( + -T, + o, + _, + m, + l, + f, + d, + h, + p, + E + ), A = pointOnEllipsoid( + T + Math.PI, + o, + _, + m, + l, + f, + d, + h, + p, + A + ), t) { + for (b[S++] = E.x, b[S++] = E.y, b[S++] = E.z, g = 2 * (R - 1) + 2, L = 1; L < g - 1; ++L) + w = L / (g - 1), O = Cartesian3.lerp( + E, + A, + w, + scratchCartesian3$7 + ), b[S++] = O.x, b[S++] = O.y, b[S++] = O.z; + b[S++] = A.x, b[S++] = A.y, b[S++] = A.z; + } + n && (M[P--] = E.z, M[P--] = E.y, M[P--] = E.x, M[I++] = A.x, M[I++] = A.y, M[I++] = A.z); + } + T = CesiumMath.PI_OVER_TWO, E = pointOnEllipsoid( + -T, + o, + _, + m, + l, + f, + d, + h, + p, + E + ); + const N = {}; + return t && (b[S++] = E.x, b[S++] = E.y, b[S++] = E.z, N.positions = b, N.numPts = y), n && (M[P--] = E.z, M[P--] = E.y, M[P--] = E.x, N.outerPositions = M), N; +}; +const scratchCartesian1$3 = new Cartesian3(), scratchCartesian2$5 = new Cartesian3(), scratchCartesian3$6 = new Cartesian3(), scratchCartesian4$2 = new Cartesian3(), texCoordScratch = new Cartesian2(), textureMatrixScratch$1 = new Matrix3(), tangentMatrixScratch = new Matrix3(), quaternionScratch$2 = new Quaternion(), scratchNormal$5 = new Cartesian3(), scratchTangent$3 = new Cartesian3(), scratchBitangent$3 = new Cartesian3(), scratchCartographic$9 = new Cartographic(), projectedCenterScratch = new Cartesian3(), scratchMinTexCoord = new Cartesian2(), scratchMaxTexCoord = new Cartesian2(); +function computeTopBottomAttributes(e, t, n) { + const i = t.vertexFormat, r = t.center, o = t.semiMajorAxis, s = t.semiMinorAxis, c = t.ellipsoid, l = t.stRotation, d = n ? e.length / 3 * 2 : e.length / 3, f = t.shadowVolume, h = i.st ? new Float32Array(d * 2) : void 0, p = i.normal ? new Float32Array(d * 3) : void 0, m = i.tangent ? new Float32Array(d * 3) : void 0, _ = i.bitangent ? new Float32Array(d * 3) : void 0, y = f ? new Float32Array(d * 3) : void 0; + let C = 0, T = scratchNormal$5, x = scratchTangent$3, b = scratchBitangent$3; + const S = new GeographicProjection(c), E = S.project( + c.cartesianToCartographic(r, scratchCartographic$9), + projectedCenterScratch + ), A = c.scaleToGeodeticSurface( + r, + scratchCartesian1$3 + ); + c.geodeticSurfaceNormal(A, A); + let D = textureMatrixScratch$1, P = tangentMatrixScratch; + if (l !== 0) { + let O = Quaternion.fromAxisAngle( + A, + l, + quaternionScratch$2 + ); + D = Matrix3.fromQuaternion(O, D), O = Quaternion.fromAxisAngle( + A, + -l, + quaternionScratch$2 + ), P = Matrix3.fromQuaternion(O, P); + } else + D = Matrix3.clone(Matrix3.IDENTITY, D), P = Matrix3.clone(Matrix3.IDENTITY, P); + const I = Cartesian2.fromElements( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + scratchMinTexCoord + ), M = Cartesian2.fromElements( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + scratchMaxTexCoord + ); + let R = e.length; + const L = n ? R : 0, g = L / 3 * 2; + for (let O = 0; O < R; O += 3) { + const N = O + 1, F = O + 2, B = Cartesian3.fromArray(e, O, scratchCartesian1$3); + if (i.st) { + const V = Matrix3.multiplyByVector( + D, + B, + scratchCartesian2$5 + ), U = S.project( + c.cartesianToCartographic(V, scratchCartographic$9), + scratchCartesian3$6 + ); + Cartesian3.subtract(U, E, U), texCoordScratch.x = (U.x + o) / (2 * o), texCoordScratch.y = (U.y + s) / (2 * s), I.x = Math.min(texCoordScratch.x, I.x), I.y = Math.min(texCoordScratch.y, I.y), M.x = Math.max(texCoordScratch.x, M.x), M.y = Math.max(texCoordScratch.y, M.y), n && (h[C + g] = texCoordScratch.x, h[C + 1 + g] = texCoordScratch.y), h[C++] = texCoordScratch.x, h[C++] = texCoordScratch.y; + } + (i.normal || i.tangent || i.bitangent || f) && (T = c.geodeticSurfaceNormal(B, T), f && (y[O + L] = -T.x, y[N + L] = -T.y, y[F + L] = -T.z), (i.normal || i.tangent || i.bitangent) && ((i.tangent || i.bitangent) && (x = Cartesian3.normalize( + Cartesian3.cross(Cartesian3.UNIT_Z, T, x), + x + ), Matrix3.multiplyByVector(P, x, x)), i.normal && (p[O] = T.x, p[N] = T.y, p[F] = T.z, n && (p[O + L] = -T.x, p[N + L] = -T.y, p[F + L] = -T.z)), i.tangent && (m[O] = x.x, m[N] = x.y, m[F] = x.z, n && (m[O + L] = -x.x, m[N + L] = -x.y, m[F + L] = -x.z)), i.bitangent && (b = Cartesian3.normalize( + Cartesian3.cross(T, x, b), + b + ), _[O] = b.x, _[N] = b.y, _[F] = b.z, n && (_[O + L] = b.x, _[N + L] = b.y, _[F + L] = b.z)))); + } + if (i.st) { + R = h.length; + for (let O = 0; O < R; O += 2) + h[O] = (h[O] - I.x) / (M.x - I.x), h[O + 1] = (h[O + 1] - I.y) / (M.y - I.y); + } + const w = new GeometryAttributes(); + if (i.position) { + const O = EllipseGeometryLibrary.raisePositionsToHeight( + e, + t, + n + ); + w.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: O + }); + } + if (i.st && (w.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: h + })), i.normal && (w.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: p + })), i.tangent && (w.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + })), i.bitangent && (w.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: _ + })), f && (w.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: y + })), n && defined(t.offsetAttribute)) { + let O = new Uint8Array(d); + if (t.offsetAttribute === GeometryOffsetAttribute$1.TOP) + O = O.fill(1, 0, d / 2); + else { + const N = t.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + O = O.fill(N); + } + w.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: O + }); + } + return w; +} +function topIndices(e) { + const t = new Array(12 * (e * (e + 1)) - 6); + let n = 0, i, r, o, s, c; + for (i = 0, o = 1, s = 0; s < 3; s++) + t[n++] = o++, t[n++] = i, t[n++] = o; + for (s = 2; s < e + 1; ++s) { + for (o = s * (s + 1) - 1, i = (s - 1) * s - 1, t[n++] = o++, t[n++] = i, t[n++] = o, r = 2 * s, c = 0; c < r - 1; ++c) + t[n++] = o, t[n++] = i++, t[n++] = i, t[n++] = o++, t[n++] = i, t[n++] = o; + t[n++] = o++, t[n++] = i, t[n++] = o; + } + for (r = e * 2, ++o, ++i, s = 0; s < r - 1; ++s) + t[n++] = o, t[n++] = i++, t[n++] = i, t[n++] = o++, t[n++] = i, t[n++] = o; + for (t[n++] = o, t[n++] = i++, t[n++] = i, t[n++] = o++, t[n++] = i++, t[n++] = i, ++i, s = e - 1; s > 1; --s) { + for (t[n++] = i++, t[n++] = i, t[n++] = o, r = 2 * s, c = 0; c < r - 1; ++c) + t[n++] = o, t[n++] = i++, t[n++] = i, t[n++] = o++, t[n++] = i, t[n++] = o; + t[n++] = i++, t[n++] = i++, t[n++] = o++; + } + for (s = 0; s < 3; s++) + t[n++] = i++, t[n++] = i, t[n++] = o; + return t; +} +let boundingSphereCenter$1 = new Cartesian3(); +function computeEllipse$1(e) { + const t = e.center; + boundingSphereCenter$1 = Cartesian3.multiplyByScalar( + e.ellipsoid.geodeticSurfaceNormal(t, boundingSphereCenter$1), + e.height, + boundingSphereCenter$1 + ), boundingSphereCenter$1 = Cartesian3.add( + t, + boundingSphereCenter$1, + boundingSphereCenter$1 + ); + const n = new BoundingSphere( + boundingSphereCenter$1, + e.semiMajorAxis + ), i = EllipseGeometryLibrary.computeEllipsePositions( + e, + !0, + !1 + ), r = i.positions, o = i.numPts, s = computeTopBottomAttributes(r, e, !1); + let c = topIndices(o); + return c = IndexDatatype$1.createTypedArray(r.length / 3, c), { + boundingSphere: n, + attributes: s, + indices: c + }; +} +function computeWallAttributes(e, t) { + const n = t.vertexFormat, i = t.center, r = t.semiMajorAxis, o = t.semiMinorAxis, s = t.ellipsoid, c = t.height, l = t.extrudedHeight, d = t.stRotation, f = e.length / 3 * 2, h = new Float64Array(f * 3), p = n.st ? new Float32Array(f * 2) : void 0, m = n.normal ? new Float32Array(f * 3) : void 0, _ = n.tangent ? new Float32Array(f * 3) : void 0, y = n.bitangent ? new Float32Array(f * 3) : void 0, C = t.shadowVolume, T = C ? new Float32Array(f * 3) : void 0; + let x = 0, b = scratchNormal$5, S = scratchTangent$3, E = scratchBitangent$3; + const A = new GeographicProjection(s), D = A.project( + s.cartesianToCartographic(i, scratchCartographic$9), + projectedCenterScratch + ), P = s.scaleToGeodeticSurface( + i, + scratchCartesian1$3 + ); + s.geodeticSurfaceNormal(P, P); + const I = Quaternion.fromAxisAngle( + P, + d, + quaternionScratch$2 + ), M = Matrix3.fromQuaternion(I, textureMatrixScratch$1), R = Cartesian2.fromElements( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + scratchMinTexCoord + ), L = Cartesian2.fromElements( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + scratchMaxTexCoord + ); + let g = e.length; + const w = g / 3 * 2; + for (let N = 0; N < g; N += 3) { + const F = N + 1, B = N + 2; + let V = Cartesian3.fromArray(e, N, scratchCartesian1$3), U; + if (n.st) { + const $ = Matrix3.multiplyByVector( + M, + V, + scratchCartesian2$5 + ), G = A.project( + s.cartesianToCartographic($, scratchCartographic$9), + scratchCartesian3$6 + ); + Cartesian3.subtract(G, D, G), texCoordScratch.x = (G.x + r) / (2 * r), texCoordScratch.y = (G.y + o) / (2 * o), R.x = Math.min(texCoordScratch.x, R.x), R.y = Math.min(texCoordScratch.y, R.y), L.x = Math.max(texCoordScratch.x, L.x), L.y = Math.max(texCoordScratch.y, L.y), p[x + w] = texCoordScratch.x, p[x + 1 + w] = texCoordScratch.y, p[x++] = texCoordScratch.x, p[x++] = texCoordScratch.y; + } + V = s.scaleToGeodeticSurface(V, V), U = Cartesian3.clone(V, scratchCartesian2$5), b = s.geodeticSurfaceNormal(V, b), C && (T[N + g] = -b.x, T[F + g] = -b.y, T[B + g] = -b.z); + let k = Cartesian3.multiplyByScalar( + b, + c, + scratchCartesian4$2 + ); + if (V = Cartesian3.add(V, k, V), k = Cartesian3.multiplyByScalar( + b, + l, + k + ), U = Cartesian3.add( + U, + k, + U + ), n.position && (h[N + g] = U.x, h[F + g] = U.y, h[B + g] = U.z, h[N] = V.x, h[F] = V.y, h[B] = V.z), n.normal || n.tangent || n.bitangent) { + E = Cartesian3.clone(b, E); + const $ = Cartesian3.fromArray( + e, + (N + 3) % g, + scratchCartesian4$2 + ); + Cartesian3.subtract($, V, $); + const G = Cartesian3.subtract( + U, + V, + scratchCartesian3$6 + ); + b = Cartesian3.normalize( + Cartesian3.cross(G, $, b), + b + ), n.normal && (m[N] = b.x, m[F] = b.y, m[B] = b.z, m[N + g] = b.x, m[F + g] = b.y, m[B + g] = b.z), n.tangent && (S = Cartesian3.normalize( + Cartesian3.cross(E, b, S), + S + ), _[N] = S.x, _[F] = S.y, _[B] = S.z, _[N + g] = S.x, _[N + 1 + g] = S.y, _[N + 2 + g] = S.z), n.bitangent && (y[N] = E.x, y[F] = E.y, y[B] = E.z, y[N + g] = E.x, y[F + g] = E.y, y[B + g] = E.z); + } + } + if (n.st) { + g = p.length; + for (let N = 0; N < g; N += 2) + p[N] = (p[N] - R.x) / (L.x - R.x), p[N + 1] = (p[N + 1] - R.y) / (L.y - R.y); + } + const O = new GeometryAttributes(); + if (n.position && (O.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: h + })), n.st && (O.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: p + })), n.normal && (O.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + })), n.tangent && (O.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: _ + })), n.bitangent && (O.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: y + })), C && (O.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: T + })), defined(t.offsetAttribute)) { + let N = new Uint8Array(f); + if (t.offsetAttribute === GeometryOffsetAttribute$1.TOP) + N = N.fill(1, 0, f / 2); + else { + const F = t.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + N = N.fill(F); + } + O.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: N + }); + } + return O; +} +function computeWallIndices(e) { + const t = e.length / 3, n = IndexDatatype$1.createTypedArray(t, t * 6); + let i = 0; + for (let r = 0; r < t; r++) { + const o = r, s = r + t, c = (o + 1) % t, l = c + t; + n[i++] = o, n[i++] = s, n[i++] = c, n[i++] = c, n[i++] = s, n[i++] = l; + } + return n; +} +const topBoundingSphere$2 = new BoundingSphere(), bottomBoundingSphere$2 = new BoundingSphere(); +function computeExtrudedEllipse$1(e) { + const t = e.center, n = e.ellipsoid, i = e.semiMajorAxis; + let r = Cartesian3.multiplyByScalar( + n.geodeticSurfaceNormal(t, scratchCartesian1$3), + e.height, + scratchCartesian1$3 + ); + topBoundingSphere$2.center = Cartesian3.add( + t, + r, + topBoundingSphere$2.center + ), topBoundingSphere$2.radius = i, r = Cartesian3.multiplyByScalar( + n.geodeticSurfaceNormal(t, r), + e.extrudedHeight, + r + ), bottomBoundingSphere$2.center = Cartesian3.add( + t, + r, + bottomBoundingSphere$2.center + ), bottomBoundingSphere$2.radius = i; + const o = EllipseGeometryLibrary.computeEllipsePositions( + e, + !0, + !0 + ), s = o.positions, c = o.numPts, l = o.outerPositions, d = BoundingSphere.union( + topBoundingSphere$2, + bottomBoundingSphere$2 + ), f = computeTopBottomAttributes( + s, + e, + !0 + ); + let h = topIndices(c); + const p = h.length; + h.length = p * 2; + const m = s.length / 3; + for (let S = 0; S < p; S += 3) + h[S + p] = h[S + 2] + m, h[S + 1 + p] = h[S + 1] + m, h[S + 2 + p] = h[S] + m; + const _ = IndexDatatype$1.createTypedArray( + m * 2 / 3, + h + ), y = new Geometry({ + attributes: f, + indices: _, + primitiveType: PrimitiveType$1.TRIANGLES + }), C = computeWallAttributes(l, e); + h = computeWallIndices(l); + const T = IndexDatatype$1.createTypedArray( + l.length * 2 / 3, + h + ), x = new Geometry({ + attributes: C, + indices: T, + primitiveType: PrimitiveType$1.TRIANGLES + }), b = GeometryPipeline.combineInstances([ + new GeometryInstance({ + geometry: y + }), + new GeometryInstance({ + geometry: x + }) + ]); + return { + boundingSphere: d, + attributes: b[0].attributes, + indices: b[0].indices + }; +} +function computeRectangle$1(e, t, n, i, r, o, s) { + const l = EllipseGeometryLibrary.computeEllipsePositions( + { + center: e, + semiMajorAxis: t, + semiMinorAxis: n, + rotation: i, + granularity: r + }, + !1, + !0 + ).outerPositions, d = l.length / 3, f = new Array(d); + for (let p = 0; p < d; ++p) + f[p] = Cartesian3.fromArray(l, p * 3); + const h = Rectangle.fromCartesianArray(f, o, s); + return h.width > CesiumMath.PI && (h.north = h.north > 0 ? CesiumMath.PI_OVER_TWO - CesiumMath.EPSILON7 : h.north, h.south = h.south < 0 ? CesiumMath.EPSILON7 - CesiumMath.PI_OVER_TWO : h.south, h.east = CesiumMath.PI, h.west = -CesiumMath.PI), h; +} +function EllipseGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.center, n = defaultValue(e.ellipsoid, Ellipsoid.default), i = e.semiMajorAxis, r = e.semiMinorAxis, o = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), s = defaultValue(e.vertexFormat, VertexFormat.DEFAULT), c = defaultValue(e.height, 0), l = defaultValue(e.extrudedHeight, c); + this._center = Cartesian3.clone(t), this._semiMajorAxis = i, this._semiMinorAxis = r, this._ellipsoid = Ellipsoid.clone(n), this._rotation = defaultValue(e.rotation, 0), this._stRotation = defaultValue(e.stRotation, 0), this._height = Math.max(l, c), this._granularity = o, this._vertexFormat = VertexFormat.clone(s), this._extrudedHeight = Math.min(l, c), this._shadowVolume = defaultValue(e.shadowVolume, !1), this._workerName = "createEllipseGeometry", this._offsetAttribute = e.offsetAttribute, this._rectangle = void 0, this._textureCoordinateRotationPoints = void 0; +} +EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + 9; +EllipseGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._center, t, n), n += Cartesian3.packedLength, Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._semiMajorAxis, t[n++] = e._semiMinorAxis, t[n++] = e._rotation, t[n++] = e._stRotation, t[n++] = e._height, t[n++] = e._granularity, t[n++] = e._extrudedHeight, t[n++] = e._shadowVolume ? 1 : 0, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchCenter$5 = new Cartesian3(), scratchEllipsoid$a = new Ellipsoid(), scratchVertexFormat$8 = new VertexFormat(), scratchOptions$d = { + center: scratchCenter$5, + ellipsoid: scratchEllipsoid$a, + vertexFormat: scratchVertexFormat$8, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + rotation: void 0, + stRotation: void 0, + height: void 0, + granularity: void 0, + extrudedHeight: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +EllipseGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchCenter$5); + t += Cartesian3.packedLength; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$a); + t += Ellipsoid.packedLength; + const o = VertexFormat.unpack( + e, + t, + scratchVertexFormat$8 + ); + t += VertexFormat.packedLength; + const s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++], p = e[t++], m = e[t++] === 1, _ = e[t]; + return defined(n) ? (n._center = Cartesian3.clone(i, n._center), n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._semiMajorAxis = s, n._semiMinorAxis = c, n._rotation = l, n._stRotation = d, n._height = f, n._granularity = h, n._extrudedHeight = p, n._shadowVolume = m, n._offsetAttribute = _ === -1 ? void 0 : _, n) : (scratchOptions$d.height = f, scratchOptions$d.extrudedHeight = p, scratchOptions$d.granularity = h, scratchOptions$d.stRotation = d, scratchOptions$d.rotation = l, scratchOptions$d.semiMajorAxis = s, scratchOptions$d.semiMinorAxis = c, scratchOptions$d.shadowVolume = m, scratchOptions$d.offsetAttribute = _ === -1 ? void 0 : _, new EllipseGeometry(scratchOptions$d)); +}; +EllipseGeometry.computeRectangle = function(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.center, i = defaultValue(e.ellipsoid, Ellipsoid.default), r = e.semiMajorAxis, o = e.semiMinorAxis, s = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), c = defaultValue(e.rotation, 0); + return computeRectangle$1( + n, + r, + o, + c, + s, + i, + t + ); +}; +EllipseGeometry.createGeometry = function(e) { + if (e._semiMajorAxis <= 0 || e._semiMinorAxis <= 0) + return; + const t = e._height, n = e._extrudedHeight, i = !CesiumMath.equalsEpsilon( + t, + n, + 0, + CesiumMath.EPSILON2 + ); + e._center = e._ellipsoid.scaleToGeodeticSurface( + e._center, + e._center + ); + const r = { + center: e._center, + semiMajorAxis: e._semiMajorAxis, + semiMinorAxis: e._semiMinorAxis, + ellipsoid: e._ellipsoid, + rotation: e._rotation, + height: t, + granularity: e._granularity, + vertexFormat: e._vertexFormat, + stRotation: e._stRotation + }; + let o; + if (i) + r.extrudedHeight = n, r.shadowVolume = e._shadowVolume, r.offsetAttribute = e._offsetAttribute, o = computeExtrudedEllipse$1(r); + else if (o = computeEllipse$1(r), defined(e._offsetAttribute)) { + const s = o.attributes.position.values.length, c = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, l = new Uint8Array(s / 3).fill(c); + o.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: l + }); + } + return new Geometry({ + attributes: o.attributes, + indices: o.indices, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: o.boundingSphere, + offsetAttribute: e._offsetAttribute + }); +}; +EllipseGeometry.createShadowVolume = function(e, t, n) { + const i = e._granularity, r = e._ellipsoid, o = t(i, r), s = n(i, r); + return new EllipseGeometry({ + center: e._center, + semiMajorAxis: e._semiMajorAxis, + semiMinorAxis: e._semiMinorAxis, + ellipsoid: r, + rotation: e._rotation, + stRotation: e._stRotation, + granularity: i, + extrudedHeight: o, + height: s, + vertexFormat: VertexFormat.POSITION_ONLY, + shadowVolume: !0 + }); +}; +function textureCoordinateRotationPoints$1(e) { + const t = -e._stRotation; + if (t === 0) + return [0, 0, 0, 1, 1, 0]; + const i = EllipseGeometryLibrary.computeEllipsePositions( + { + center: e._center, + semiMajorAxis: e._semiMajorAxis, + semiMinorAxis: e._semiMinorAxis, + rotation: e._rotation, + granularity: e._granularity + }, + !1, + !0 + ).outerPositions, r = i.length / 3, o = new Array(r); + for (let l = 0; l < r; ++l) + o[l] = Cartesian3.fromArray(i, l * 3); + const s = e._ellipsoid, c = e.rectangle; + return Geometry._textureCoordinateRotationPoints( + o, + t, + s, + c + ); +} +Object.defineProperties(EllipseGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + return defined(this._rectangle) || (this._rectangle = computeRectangle$1( + this._center, + this._semiMajorAxis, + this._semiMinorAxis, + this._rotation, + this._granularity, + this._ellipsoid + )), this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering EllipseGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return defined(this._textureCoordinateRotationPoints) || (this._textureCoordinateRotationPoints = textureCoordinateRotationPoints$1( + this + )), this._textureCoordinateRotationPoints; + } + } +}); +const scratchCartesian1$2 = new Cartesian3(); +let boundingSphereCenter = new Cartesian3(); +function computeEllipse(e) { + const t = e.center; + boundingSphereCenter = Cartesian3.multiplyByScalar( + e.ellipsoid.geodeticSurfaceNormal(t, boundingSphereCenter), + e.height, + boundingSphereCenter + ), boundingSphereCenter = Cartesian3.add( + t, + boundingSphereCenter, + boundingSphereCenter + ); + const n = new BoundingSphere( + boundingSphereCenter, + e.semiMajorAxis + ), i = EllipseGeometryLibrary.computeEllipsePositions( + e, + !1, + !0 + ).outerPositions, r = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: EllipseGeometryLibrary.raisePositionsToHeight( + i, + e, + !1 + ) + }) + }), o = i.length / 3, s = IndexDatatype$1.createTypedArray(o, o * 2); + let c = 0; + for (let l = 0; l < o; ++l) + s[c++] = l, s[c++] = (l + 1) % o; + return { + boundingSphere: n, + attributes: r, + indices: s + }; +} +const topBoundingSphere$1 = new BoundingSphere(), bottomBoundingSphere$1 = new BoundingSphere(); +function computeExtrudedEllipse(e) { + const t = e.center, n = e.ellipsoid, i = e.semiMajorAxis; + let r = Cartesian3.multiplyByScalar( + n.geodeticSurfaceNormal(t, scratchCartesian1$2), + e.height, + scratchCartesian1$2 + ); + topBoundingSphere$1.center = Cartesian3.add( + t, + r, + topBoundingSphere$1.center + ), topBoundingSphere$1.radius = i, r = Cartesian3.multiplyByScalar( + n.geodeticSurfaceNormal(t, r), + e.extrudedHeight, + r + ), bottomBoundingSphere$1.center = Cartesian3.add( + t, + r, + bottomBoundingSphere$1.center + ), bottomBoundingSphere$1.radius = i; + let o = EllipseGeometryLibrary.computeEllipsePositions( + e, + !1, + !0 + ).outerPositions; + const s = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: EllipseGeometryLibrary.raisePositionsToHeight( + o, + e, + !0 + ) + }) + }); + o = s.position.values; + const c = BoundingSphere.union( + topBoundingSphere$1, + bottomBoundingSphere$1 + ); + let l = o.length / 3; + if (defined(e.offsetAttribute)) { + let _ = new Uint8Array(l); + if (e.offsetAttribute === GeometryOffsetAttribute$1.TOP) + _ = _.fill(1, 0, l / 2); + else { + const y = e.offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + _ = _.fill(y); + } + s.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: _ + }); + } + let d = defaultValue(e.numberOfVerticalLines, 16); + d = CesiumMath.clamp( + d, + 0, + l / 2 + ); + const f = IndexDatatype$1.createTypedArray( + l, + l * 2 + d * 2 + ); + l /= 2; + let h = 0, p; + for (p = 0; p < l; ++p) + f[h++] = p, f[h++] = (p + 1) % l, f[h++] = p + l, f[h++] = (p + 1) % l + l; + let m; + if (d > 0) { + const _ = Math.min(d, l); + m = Math.round(l / _); + const y = Math.min(m * d, l); + for (p = 0; p < y; p += m) + f[h++] = p, f[h++] = p + l; + } + return { + boundingSphere: c, + attributes: s, + indices: f + }; +} +function EllipseOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.center, n = defaultValue(e.ellipsoid, Ellipsoid.default), i = e.semiMajorAxis, r = e.semiMinorAxis, o = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), s = defaultValue(e.height, 0), c = defaultValue(e.extrudedHeight, s); + this._center = Cartesian3.clone(t), this._semiMajorAxis = i, this._semiMinorAxis = r, this._ellipsoid = Ellipsoid.clone(n), this._rotation = defaultValue(e.rotation, 0), this._height = Math.max(c, s), this._granularity = o, this._extrudedHeight = Math.min(c, s), this._numberOfVerticalLines = Math.max( + defaultValue(e.numberOfVerticalLines, 16), + 0 + ), this._offsetAttribute = e.offsetAttribute, this._workerName = "createEllipseOutlineGeometry"; +} +EllipseOutlineGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + 8; +EllipseOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._center, t, n), n += Cartesian3.packedLength, Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._semiMajorAxis, t[n++] = e._semiMinorAxis, t[n++] = e._rotation, t[n++] = e._height, t[n++] = e._granularity, t[n++] = e._extrudedHeight, t[n++] = e._numberOfVerticalLines, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchCenter$4 = new Cartesian3(), scratchEllipsoid$9 = new Ellipsoid(), scratchOptions$c = { + center: scratchCenter$4, + ellipsoid: scratchEllipsoid$9, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + rotation: void 0, + height: void 0, + granularity: void 0, + extrudedHeight: void 0, + numberOfVerticalLines: void 0, + offsetAttribute: void 0 +}; +EllipseOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchCenter$4); + t += Cartesian3.packedLength; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$9); + t += Ellipsoid.packedLength; + const o = e[t++], s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++], p = e[t]; + return defined(n) ? (n._center = Cartesian3.clone(i, n._center), n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._semiMajorAxis = o, n._semiMinorAxis = s, n._rotation = c, n._height = l, n._granularity = d, n._extrudedHeight = f, n._numberOfVerticalLines = h, n._offsetAttribute = p === -1 ? void 0 : p, n) : (scratchOptions$c.height = l, scratchOptions$c.extrudedHeight = f, scratchOptions$c.granularity = d, scratchOptions$c.rotation = c, scratchOptions$c.semiMajorAxis = o, scratchOptions$c.semiMinorAxis = s, scratchOptions$c.numberOfVerticalLines = h, scratchOptions$c.offsetAttribute = p === -1 ? void 0 : p, new EllipseOutlineGeometry(scratchOptions$c)); +}; +EllipseOutlineGeometry.createGeometry = function(e) { + if (e._semiMajorAxis <= 0 || e._semiMinorAxis <= 0) + return; + const t = e._height, n = e._extrudedHeight, i = !CesiumMath.equalsEpsilon( + t, + n, + 0, + CesiumMath.EPSILON2 + ); + e._center = e._ellipsoid.scaleToGeodeticSurface( + e._center, + e._center + ); + const r = { + center: e._center, + semiMajorAxis: e._semiMajorAxis, + semiMinorAxis: e._semiMinorAxis, + ellipsoid: e._ellipsoid, + rotation: e._rotation, + height: t, + granularity: e._granularity, + numberOfVerticalLines: e._numberOfVerticalLines + }; + let o; + if (i) + r.extrudedHeight = n, r.offsetAttribute = e._offsetAttribute, o = computeExtrudedEllipse(r); + else if (o = computeEllipse(r), defined(e._offsetAttribute)) { + const s = o.attributes.position.values.length, c = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, l = new Uint8Array(s / 3).fill(c); + o.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: l + }); + } + return new Geometry({ + attributes: o.attributes, + indices: o.indices, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: o.boundingSphere, + offsetAttribute: e._offsetAttribute + }); +}; +const scratchColor$c = new Color(), defaultOffset$6 = Cartesian3.ZERO, offsetScratch$6 = new Cartesian3(), scratchRectangle$5 = new Rectangle(); +function EllipseGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.center = void 0, this.semiMajorAxis = void 0, this.semiMinorAxis = void 0, this.rotation = void 0, this.height = void 0, this.extrudedHeight = void 0, this.granularity = void 0, this.stRotation = void 0, this.numberOfVerticalLines = void 0, this.offsetAttribute = void 0; +} +function EllipseGeometryUpdater(e, t) { + GroundGeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new EllipseGeometryOptions(e), + geometryPropertyName: "ellipse", + observedPropertyNames: ["availability", "position", "ellipse"] + }), this._onEntityPropertyChanged(e, "ellipse", e.ellipse, void 0); +} +defined(Object.create) && (EllipseGeometryUpdater.prototype = Object.create( + GroundGeometryUpdater.prototype +), EllipseGeometryUpdater.prototype.constructor = EllipseGeometryUpdater); +EllipseGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + this._distanceDisplayConditionProperty.getValue(e) + ), + offset: void 0, + color: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let r; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (r = this._materialProperty.color.getValue(e, scratchColor$c)), defined(r) || (r = Color.WHITE), i.color = ColorGeometryInstanceAttribute.fromColor(r); + } + return defined(this._options.offsetAttribute) && (i.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$6, + offsetScratch$6 + ) + )), new GeometryInstance({ + id: t, + geometry: new EllipseGeometry(this._options), + attributes: i + }); +}; +EllipseGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$c + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (o.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$6, + offsetScratch$6 + ) + )), new GeometryInstance({ + id: t, + geometry: new EllipseOutlineGeometry(this._options), + attributes: o + }); +}; +EllipseGeometryUpdater.prototype._computeCenter = function(e, t) { + return Property.getValueOrUndefined(this._entity.position, e, t); +}; +EllipseGeometryUpdater.prototype._isHidden = function(e, t) { + const n = e.position; + return !defined(n) || !defined(t.semiMajorAxis) || !defined(t.semiMinorAxis) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +EllipseGeometryUpdater.prototype._isDynamic = function(e, t) { + return !e.position.isConstant || // + !t.semiMajorAxis.isConstant || // + !t.semiMinorAxis.isConstant || // + !Property.isConstant(t.rotation) || // + !Property.isConstant(t.height) || // + !Property.isConstant(t.extrudedHeight) || // + !Property.isConstant(t.granularity) || // + !Property.isConstant(t.stRotation) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.numberOfVerticalLines) || // + !Property.isConstant(t.zIndex) || // + this._onTerrain && !Property.isConstant(this._materialProperty) && !(this._materialProperty instanceof ColorMaterialProperty); +}; +EllipseGeometryUpdater.prototype._setStaticOptions = function(e, t) { + let n = Property.getValueOrUndefined( + t.height, + Iso8601.MINIMUM_VALUE + ); + const i = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + let r = Property.getValueOrUndefined( + t.extrudedHeight, + Iso8601.MINIMUM_VALUE + ); + const o = Property.getValueOrDefault( + t.extrudedHeightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + defined(r) && !defined(n) && (n = 0); + const s = this._options; + s.vertexFormat = this._materialProperty instanceof ColorMaterialProperty ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, s.center = e.position.getValue( + Iso8601.MINIMUM_VALUE, + s.center + ), s.semiMajorAxis = t.semiMajorAxis.getValue( + Iso8601.MINIMUM_VALUE, + s.semiMajorAxis + ), s.semiMinorAxis = t.semiMinorAxis.getValue( + Iso8601.MINIMUM_VALUE, + s.semiMinorAxis + ), s.rotation = Property.getValueOrUndefined( + t.rotation, + Iso8601.MINIMUM_VALUE + ), s.granularity = Property.getValueOrUndefined( + t.granularity, + Iso8601.MINIMUM_VALUE + ), s.stRotation = Property.getValueOrUndefined( + t.stRotation, + Iso8601.MINIMUM_VALUE + ), s.numberOfVerticalLines = Property.getValueOrUndefined( + t.numberOfVerticalLines, + Iso8601.MINIMUM_VALUE + ), s.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + n, + i, + r, + o + ), s.height = GroundGeometryUpdater.getGeometryHeight( + n, + i + ), r = GroundGeometryUpdater.getGeometryExtrudedHeight( + r, + o + ), r === GroundGeometryUpdater.CLAMP_TO_GROUND && (r = ApproximateTerrainHeights.getMinimumMaximumHeights( + EllipseGeometry.computeRectangle(s, scratchRectangle$5) + ).minimumTerrainHeight), s.extrudedHeight = r; +}; +EllipseGeometryUpdater.DynamicGeometryUpdater = DynamicEllipseGeometryUpdater; +function DynamicEllipseGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicEllipseGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicEllipseGeometryUpdater.prototype.constructor = DynamicEllipseGeometryUpdater); +DynamicEllipseGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = this._options; + return !defined(i.center) || !defined(i.semiMajorAxis) || !defined(i.semiMinorAxis) || DynamicGeometryUpdater$1.prototype._isHidden.call(this, e, t, n); +}; +DynamicEllipseGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + let r = Property.getValueOrUndefined(t.height, n); + const o = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ); + let s = Property.getValueOrUndefined( + t.extrudedHeight, + n + ); + const c = Property.getValueOrDefault( + t.extrudedHeightReference, + n, + HeightReference$1.NONE + ); + defined(s) && !defined(r) && (r = 0), i.center = Property.getValueOrUndefined( + e.position, + n, + i.center + ), i.semiMajorAxis = Property.getValueOrUndefined( + t.semiMajorAxis, + n + ), i.semiMinorAxis = Property.getValueOrUndefined( + t.semiMinorAxis, + n + ), i.rotation = Property.getValueOrUndefined(t.rotation, n), i.granularity = Property.getValueOrUndefined(t.granularity, n), i.stRotation = Property.getValueOrUndefined(t.stRotation, n), i.numberOfVerticalLines = Property.getValueOrUndefined( + t.numberOfVerticalLines, + n + ), i.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + r, + o, + s, + c + ), i.height = GroundGeometryUpdater.getGeometryHeight( + r, + o + ), s = GroundGeometryUpdater.getGeometryExtrudedHeight( + s, + c + ), s === GroundGeometryUpdater.CLAMP_TO_GROUND && (s = ApproximateTerrainHeights.getMinimumMaximumHeights( + EllipseGeometry.computeRectangle(i, scratchRectangle$5) + ).minimumTerrainHeight), i.extrudedHeight = s; +}; +const scratchPosition$7 = new Cartesian3(), scratchNormal$4 = new Cartesian3(), scratchTangent$2 = new Cartesian3(), scratchBitangent$2 = new Cartesian3(), scratchNormalST = new Cartesian3(), defaultRadii = new Cartesian3(1, 1, 1), cos = Math.cos, sin = Math.sin; +function EllipsoidGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.radii, defaultRadii), n = defaultValue(e.innerRadii, t), i = defaultValue(e.minimumClock, 0), r = defaultValue(e.maximumClock, CesiumMath.TWO_PI), o = defaultValue(e.minimumCone, 0), s = defaultValue(e.maximumCone, CesiumMath.PI), c = Math.round(defaultValue(e.stackPartitions, 64)), l = Math.round(defaultValue(e.slicePartitions, 64)), d = defaultValue(e.vertexFormat, VertexFormat.DEFAULT); + this._radii = Cartesian3.clone(t), this._innerRadii = Cartesian3.clone(n), this._minimumClock = i, this._maximumClock = r, this._minimumCone = o, this._maximumCone = s, this._stackPartitions = c, this._slicePartitions = l, this._vertexFormat = VertexFormat.clone(d), this._offsetAttribute = e.offsetAttribute, this._workerName = "createEllipsoidGeometry"; +} +EllipsoidGeometry.packedLength = 2 * Cartesian3.packedLength + VertexFormat.packedLength + 7; +EllipsoidGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Cartesian3.pack(e._radii, t, n), n += Cartesian3.packedLength, Cartesian3.pack(e._innerRadii, t, n), n += Cartesian3.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._minimumClock, t[n++] = e._maximumClock, t[n++] = e._minimumCone, t[n++] = e._maximumCone, t[n++] = e._stackPartitions, t[n++] = e._slicePartitions, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchRadii$1 = new Cartesian3(), scratchInnerRadii = new Cartesian3(), scratchVertexFormat$7 = new VertexFormat(), scratchOptions$b = { + radii: scratchRadii$1, + innerRadii: scratchInnerRadii, + vertexFormat: scratchVertexFormat$7, + minimumClock: void 0, + maximumClock: void 0, + minimumCone: void 0, + maximumCone: void 0, + stackPartitions: void 0, + slicePartitions: void 0, + offsetAttribute: void 0 +}; +EllipsoidGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Cartesian3.unpack(e, t, scratchRadii$1); + t += Cartesian3.packedLength; + const r = Cartesian3.unpack(e, t, scratchInnerRadii); + t += Cartesian3.packedLength; + const o = VertexFormat.unpack( + e, + t, + scratchVertexFormat$7 + ); + t += VertexFormat.packedLength; + const s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++], p = e[t]; + return defined(n) ? (n._radii = Cartesian3.clone(i, n._radii), n._innerRadii = Cartesian3.clone(r, n._innerRadii), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._minimumClock = s, n._maximumClock = c, n._minimumCone = l, n._maximumCone = d, n._stackPartitions = f, n._slicePartitions = h, n._offsetAttribute = p === -1 ? void 0 : p, n) : (scratchOptions$b.minimumClock = s, scratchOptions$b.maximumClock = c, scratchOptions$b.minimumCone = l, scratchOptions$b.maximumCone = d, scratchOptions$b.stackPartitions = f, scratchOptions$b.slicePartitions = h, scratchOptions$b.offsetAttribute = p === -1 ? void 0 : p, new EllipsoidGeometry(scratchOptions$b)); +}; +EllipsoidGeometry.createGeometry = function(e) { + const t = e._radii; + if (t.x <= 0 || t.y <= 0 || t.z <= 0) + return; + const n = e._innerRadii; + if (n.x <= 0 || n.y <= 0 || n.z <= 0) + return; + const i = e._minimumClock, r = e._maximumClock, o = e._minimumCone, s = e._maximumCone, c = e._vertexFormat; + let l = e._slicePartitions + 1, d = e._stackPartitions + 1; + l = Math.round( + l * Math.abs(r - i) / CesiumMath.TWO_PI + ), d = Math.round( + d * Math.abs(s - o) / CesiumMath.PI + ), l < 2 && (l = 2), d < 2 && (d = 2); + let f, h, p = 0; + const m = [o], _ = [i]; + for (f = 0; f < d; f++) + m.push( + o + f * (s - o) / (d - 1) + ); + for (m.push(s), h = 0; h < l; h++) + _.push( + i + h * (r - i) / (l - 1) + ); + _.push(r); + const y = m.length, C = _.length; + let T = 0, x = 1; + const b = n.x !== t.x || n.y !== t.y || n.z !== t.z; + let S = !1, E = !1, A = !1; + b && (x = 2, o > 0 && (S = !0, T += l - 1), s < Math.PI && (E = !0, T += l - 1), (r - i) % CesiumMath.TWO_PI ? (A = !0, T += (d - 1) * 2 + 1) : T += 1); + const D = C * y * x, P = new Float64Array(D * 3), I = new Array(D).fill(!1), M = new Array(D).fill(!1), R = l * d * x, L = 6 * (R + T + 1 - (l + d) * x), g = IndexDatatype$1.createTypedArray(R, L), w = c.normal ? new Float32Array(D * 3) : void 0, O = c.tangent ? new Float32Array(D * 3) : void 0, N = c.bitangent ? new Float32Array(D * 3) : void 0, F = c.st ? new Float32Array(D * 2) : void 0, B = new Array(y), V = new Array(y); + for (f = 0; f < y; f++) + B[f] = sin(m[f]), V[f] = cos(m[f]); + const U = new Array(C), k = new Array(C); + for (h = 0; h < C; h++) + k[h] = cos(_[h]), U[h] = sin(_[h]); + for (f = 0; f < y; f++) + for (h = 0; h < C; h++) + P[p++] = t.x * B[f] * k[h], P[p++] = t.y * B[f] * U[h], P[p++] = t.z * V[f]; + let $ = D / 2; + if (b) + for (f = 0; f < y; f++) + for (h = 0; h < C; h++) + P[p++] = n.x * B[f] * k[h], P[p++] = n.y * B[f] * U[h], P[p++] = n.z * V[f], I[$] = !0, f > 0 && f !== y - 1 && h !== 0 && h !== C - 1 && (M[$] = !0), $++; + p = 0; + let G, q; + for (f = 1; f < y - 2; f++) + for (G = f * C, q = (f + 1) * C, h = 1; h < C - 2; h++) + g[p++] = q + h, g[p++] = q + h + 1, g[p++] = G + h + 1, g[p++] = q + h, g[p++] = G + h + 1, g[p++] = G + h; + if (b) { + const ce = y * C; + for (f = 1; f < y - 2; f++) + for (G = ce + f * C, q = ce + (f + 1) * C, h = 1; h < C - 2; h++) + g[p++] = q + h, g[p++] = G + h, g[p++] = G + h + 1, g[p++] = q + h, g[p++] = G + h + 1, g[p++] = q + h + 1; + } + let z, H; + if (b) { + if (S) + for (H = y * C, f = 1; f < C - 2; f++) + g[p++] = f, g[p++] = f + 1, g[p++] = H + f + 1, g[p++] = f, g[p++] = H + f + 1, g[p++] = H + f; + if (E) + for (z = y * C - C, H = y * C * x - C, f = 1; f < C - 2; f++) + g[p++] = z + f + 1, g[p++] = z + f, g[p++] = H + f, g[p++] = z + f + 1, g[p++] = H + f, g[p++] = H + f + 1; + } + if (A) { + for (f = 1; f < y - 2; f++) + H = C * y + C * f, z = C * f, g[p++] = H, g[p++] = z + C, g[p++] = z, g[p++] = H, g[p++] = H + C, g[p++] = z + C; + for (f = 1; f < y - 2; f++) + H = C * y + C * (f + 1) - 1, z = C * (f + 1) - 1, g[p++] = z + C, g[p++] = H, g[p++] = z, g[p++] = z + C, g[p++] = H + C, g[p++] = H; + } + const Q = new GeometryAttributes(); + c.position && (Q.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: P + })); + let ne = 0, K = 0, Z = 0, ee = 0; + const oe = D / 2; + let X; + const fe = Ellipsoid.fromCartesian3(t), de = Ellipsoid.fromCartesian3(n); + if (c.st || c.normal || c.tangent || c.bitangent) { + for (f = 0; f < D; f++) { + X = I[f] ? de : fe; + const ce = Cartesian3.fromArray(P, f * 3, scratchPosition$7), ye = X.geodeticSurfaceNormal(ce, scratchNormal$4); + if (M[f] && Cartesian3.negate(ye, ye), c.st) { + const ge = Cartesian2.negate(ye, scratchNormalST); + F[ne++] = Math.atan2(ge.y, ge.x) / CesiumMath.TWO_PI + 0.5, F[ne++] = Math.asin(ye.z) / Math.PI + 0.5; + } + if (c.normal && (w[K++] = ye.x, w[K++] = ye.y, w[K++] = ye.z), c.tangent || c.bitangent) { + const ge = scratchTangent$2; + let re = 0, be; + if (I[f] && (re = oe), !S && f >= re && f < re + C * 2 ? be = Cartesian3.UNIT_X : be = Cartesian3.UNIT_Z, Cartesian3.cross(be, ye, ge), Cartesian3.normalize(ge, ge), c.tangent && (O[Z++] = ge.x, O[Z++] = ge.y, O[Z++] = ge.z), c.bitangent) { + const pe = Cartesian3.cross(ye, ge, scratchBitangent$2); + Cartesian3.normalize(pe, pe), N[ee++] = pe.x, N[ee++] = pe.y, N[ee++] = pe.z; + } + } + } + c.st && (Q.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: F + })), c.normal && (Q.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: w + })), c.tangent && (Q.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: O + })), c.bitangent && (Q.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: N + })); + } + if (defined(e._offsetAttribute)) { + const ce = P.length, ye = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, ge = new Uint8Array(ce / 3).fill(ye); + Q.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: ge + }); + } + return new Geometry({ + attributes: Q, + indices: g, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: BoundingSphere.fromEllipsoid(fe), + offsetAttribute: e._offsetAttribute + }); +}; +let unitEllipsoidGeometry; +EllipsoidGeometry.getUnitEllipsoid = function() { + return defined(unitEllipsoidGeometry) || (unitEllipsoidGeometry = EllipsoidGeometry.createGeometry( + new EllipsoidGeometry({ + radii: new Cartesian3(1, 1, 1), + vertexFormat: VertexFormat.POSITION_ONLY + }) + )), unitEllipsoidGeometry; +}; +const defaultMaterial$1 = new ColorMaterialProperty(Color.WHITE), defaultOffset$5 = Cartesian3.ZERO, offsetScratch$5 = new Cartesian3(), radiiScratch = new Cartesian3(), innerRadiiScratch = new Cartesian3(), scratchColor$b = new Color(), unitSphere = new Cartesian3(1, 1, 1); +function EllipsoidGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.radii = void 0, this.innerRadii = void 0, this.minimumClock = void 0, this.maximumClock = void 0, this.minimumCone = void 0, this.maximumCone = void 0, this.stackPartitions = void 0, this.slicePartitions = void 0, this.subdivisions = void 0, this.offsetAttribute = void 0; +} +function EllipsoidGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new EllipsoidGeometryOptions(e), + geometryPropertyName: "ellipsoid", + observedPropertyNames: [ + "availability", + "position", + "orientation", + "ellipsoid" + ] + }), this._onEntityPropertyChanged( + e, + "ellipsoid", + e.ellipsoid, + void 0 + ); +} +defined(Object.create) && (EllipsoidGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), EllipsoidGeometryUpdater.prototype.constructor = EllipsoidGeometryUpdater); +Object.defineProperties(EllipsoidGeometryUpdater.prototype, { + /** + * Gets the terrain offset property + * @type {TerrainOffsetProperty} + * @memberof EllipsoidGeometryUpdater.prototype + * @readonly + * @private + */ + terrainOffsetProperty: { + get: function() { + return this._terrainOffsetProperty; + } + } +}); +EllipsoidGeometryUpdater.prototype.createFillGeometryInstance = function(e, t, n) { + const i = this._entity, r = i.isAvailable(e); + let o; + const s = new ShowGeometryInstanceAttribute( + r && i.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), c = this._distanceDisplayConditionProperty.getValue( + e + ), l = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + c + ), d = { + show: s, + distanceDisplayCondition: l, + color: void 0, + offset: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let f; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || r) && (f = this._materialProperty.color.getValue(e, scratchColor$b)), defined(f) || (f = Color.WHITE), o = ColorGeometryInstanceAttribute.fromColor(f), d.color = o; + } + return defined(this._options.offsetAttribute) && (d.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$5, + offsetScratch$5 + ) + )), new GeometryInstance({ + id: i, + geometry: new EllipsoidGeometry(this._options), + modelMatrix: t ? void 0 : i.computeModelMatrixForHeightReference( + e, + i.ellipsoid.heightReference, + this._options.radii.z * 0.5, + this._scene.ellipsoid, + n + ), + attributes: d + }); +}; +EllipsoidGeometryUpdater.prototype.createOutlineGeometryInstance = function(e, t, n) { + const i = this._entity, r = i.isAvailable(e), o = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$b + ), s = this._distanceDisplayConditionProperty.getValue( + e + ), c = { + show: new ShowGeometryInstanceAttribute( + r && i.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(o), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + s + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (c.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$5, + offsetScratch$5 + ) + )), new GeometryInstance({ + id: i, + geometry: new EllipsoidOutlineGeometry(this._options), + modelMatrix: t ? void 0 : i.computeModelMatrixForHeightReference( + e, + i.ellipsoid.heightReference, + this._options.radii.z * 0.5, + this._scene.ellipsoid, + n + ), + attributes: c + }); +}; +EllipsoidGeometryUpdater.prototype._computeCenter = function(e, t) { + return Property.getValueOrUndefined(this._entity.position, e, t); +}; +EllipsoidGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(e.position) || !defined(t.radii) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +EllipsoidGeometryUpdater.prototype._isDynamic = function(e, t) { + return !e.position.isConstant || // + !Property.isConstant(e.orientation) || // + !t.radii.isConstant || // + !Property.isConstant(t.innerRadii) || // + !Property.isConstant(t.stackPartitions) || // + !Property.isConstant(t.slicePartitions) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.minimumClock) || // + !Property.isConstant(t.maximumClock) || // + !Property.isConstant(t.minimumCone) || // + !Property.isConstant(t.maximumCone) || // + !Property.isConstant(t.subdivisions); +}; +EllipsoidGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ), i = this._options; + i.vertexFormat = this._materialProperty instanceof ColorMaterialProperty ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, i.radii = t.radii.getValue( + Iso8601.MINIMUM_VALUE, + i.radii + ), i.innerRadii = Property.getValueOrUndefined( + t.innerRadii, + i.radii + ), i.minimumClock = Property.getValueOrUndefined( + t.minimumClock, + Iso8601.MINIMUM_VALUE + ), i.maximumClock = Property.getValueOrUndefined( + t.maximumClock, + Iso8601.MINIMUM_VALUE + ), i.minimumCone = Property.getValueOrUndefined( + t.minimumCone, + Iso8601.MINIMUM_VALUE + ), i.maximumCone = Property.getValueOrUndefined( + t.maximumCone, + Iso8601.MINIMUM_VALUE + ), i.stackPartitions = Property.getValueOrUndefined( + t.stackPartitions, + Iso8601.MINIMUM_VALUE + ), i.slicePartitions = Property.getValueOrUndefined( + t.slicePartitions, + Iso8601.MINIMUM_VALUE + ), i.subdivisions = Property.getValueOrUndefined( + t.subdivisions, + Iso8601.MINIMUM_VALUE + ), i.offsetAttribute = n !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0; +}; +EllipsoidGeometryUpdater.prototype._onEntityPropertyChanged = heightReferenceOnEntityPropertyChanged; +EllipsoidGeometryUpdater.DynamicGeometryUpdater = DynamicEllipsoidGeometryUpdater; +function DynamicEllipsoidGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ), this._scene = e._scene, this._modelMatrix = new Matrix4(), this._attributes = void 0, this._outlineAttributes = void 0, this._lastSceneMode = void 0, this._lastShow = void 0, this._lastOutlineShow = void 0, this._lastOutlineWidth = void 0, this._lastOutlineColor = void 0, this._lastOffset = new Cartesian3(), this._material = {}; +} +defined(Object.create) && (DynamicEllipsoidGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicEllipsoidGeometryUpdater.prototype.constructor = DynamicEllipsoidGeometryUpdater); +DynamicEllipsoidGeometryUpdater.prototype.update = function(e) { + const t = this._entity, n = t.ellipsoid; + if (!t.isShowing || !t.isAvailable(e) || !Property.getValueOrDefault(n.show, e, !0)) { + defined(this._primitive) && (this._primitive.show = !1), defined(this._outlinePrimitive) && (this._outlinePrimitive.show = !1); + return; + } + const i = Property.getValueOrUndefined( + n.radii, + e, + radiiScratch + ); + let r = defined(i) ? t.computeModelMatrixForHeightReference( + e, + n.heightReference, + i.z * 0.5, + this._scene.ellipsoid, + this._modelMatrix + ) : void 0; + if (!defined(r) || !defined(i)) { + defined(this._primitive) && (this._primitive.show = !1), defined(this._outlinePrimitive) && (this._outlinePrimitive.show = !1); + return; + } + const o = Property.getValueOrDefault(n.fill, e, !0), s = Property.getValueOrDefault( + n.outline, + e, + !1 + ), c = Property.getValueOrClonedDefault( + n.outlineColor, + e, + Color.BLACK, + scratchColor$b + ), l = MaterialProperty.getValue( + e, + defaultValue(n.material, defaultMaterial$1), + this._material + ), d = Property.getValueOrUndefined( + n.innerRadii, + e, + innerRadiiScratch + ), f = Property.getValueOrUndefined( + n.minimumClock, + e + ), h = Property.getValueOrUndefined( + n.maximumClock, + e + ), p = Property.getValueOrUndefined(n.minimumCone, e), m = Property.getValueOrUndefined(n.maximumCone, e), _ = Property.getValueOrUndefined( + n.stackPartitions, + e + ), y = Property.getValueOrUndefined( + n.slicePartitions, + e + ), C = Property.getValueOrUndefined( + n.subdivisions, + e + ), T = Property.getValueOrDefault( + n.outlineWidth, + e, + 1 + ), x = Property.getValueOrDefault( + n.heightReference, + e, + HeightReference$1.NONE + ), b = x !== HeightReference$1.NONE ? GeometryOffsetAttribute$1.ALL : void 0, S = this._scene.mode, E = S === SceneMode$1.SCENE3D && x === HeightReference$1.NONE, A = this._options, D = this._geometryUpdater.shadowsProperty.getValue(e), I = this._geometryUpdater.distanceDisplayConditionProperty.getValue( + e + ), M = Property.getValueOrDefault( + this._geometryUpdater.terrainOffsetProperty, + e, + defaultOffset$5, + offsetScratch$5 + ); + if (!E || this._lastSceneMode !== S || !defined(this._primitive) || // + A.stackPartitions !== _ || A.slicePartitions !== y || // + defined(d) && !Cartesian3.equals(A.innerRadii !== d) || A.minimumClock !== f || // + A.maximumClock !== h || A.minimumCone !== p || // + A.maximumCone !== m || A.subdivisions !== C || // + this._lastOutlineWidth !== T || A.offsetAttribute !== b) { + const L = this._primitives; + L.removeAndDestroy(this._primitive), L.removeAndDestroy(this._outlinePrimitive), this._primitive = void 0, this._outlinePrimitive = void 0, this._lastSceneMode = S, this._lastOutlineWidth = T, A.stackPartitions = _, A.slicePartitions = y, A.subdivisions = C, A.offsetAttribute = b, A.radii = Cartesian3.clone(E ? unitSphere : i, A.radii), defined(d) ? E ? A.innerRadii = Cartesian3.fromElements( + d.x / i.x, + d.y / i.y, + d.z / i.z, + A.innerRadii + ) : A.innerRadii = Cartesian3.clone(d, A.innerRadii) : A.innerRadii = void 0, A.minimumClock = f, A.maximumClock = h, A.minimumCone = p, A.maximumCone = m; + const g = new MaterialAppearance({ + material: l, + translucent: l.isTranslucent(), + closed: !0 + }); + A.vertexFormat = g.vertexFormat; + const w = this._geometryUpdater.createFillGeometryInstance( + e, + E, + this._modelMatrix + ); + this._primitive = L.add( + new Primitive$3({ + geometryInstances: w, + appearance: g, + asynchronous: !1, + shadows: D + }) + ); + const O = this._geometryUpdater.createOutlineGeometryInstance( + e, + E, + this._modelMatrix + ); + this._outlinePrimitive = L.add( + new Primitive$3({ + geometryInstances: O, + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: O.attributes.color.value[3] !== 255, + renderState: { + lineWidth: this._geometryUpdater._scene.clampLineWidth( + T + ) + } + }), + asynchronous: !1, + shadows: D + }) + ), this._lastShow = o, this._lastOutlineShow = s, this._lastOutlineColor = Color.clone(c, this._lastOutlineColor), this._lastDistanceDisplayCondition = I, this._lastOffset = Cartesian3.clone(M, this._lastOffset); + } else if (this._primitive.ready) { + const L = this._primitive, g = this._outlinePrimitive; + L.show = !0, g.show = !0, L.appearance.material = l; + let w = this._attributes; + defined(w) || (w = L.getGeometryInstanceAttributes(t), this._attributes = w), o !== this._lastShow && (w.show = ShowGeometryInstanceAttribute.toValue( + o, + w.show + ), this._lastShow = o); + let O = this._outlineAttributes; + defined(O) || (O = g.getGeometryInstanceAttributes( + t + ), this._outlineAttributes = O), s !== this._lastOutlineShow && (O.show = ShowGeometryInstanceAttribute.toValue( + s, + O.show + ), this._lastOutlineShow = s), Color.equals(c, this._lastOutlineColor) || (O.color = ColorGeometryInstanceAttribute.toValue( + c, + O.color + ), Color.clone(c, this._lastOutlineColor)), DistanceDisplayCondition.equals( + I, + this._lastDistanceDisplayCondition + ) || (w.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + I, + w.distanceDisplayCondition + ), O.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + I, + O.distanceDisplayCondition + ), DistanceDisplayCondition.clone( + I, + this._lastDistanceDisplayCondition + )), Cartesian3.equals(M, this._lastOffset) || (w.offset = OffsetGeometryInstanceAttribute.toValue( + M, + w.offset + ), O.offset = OffsetGeometryInstanceAttribute.toValue( + M, + w.offset + ), Cartesian3.clone(M, this._lastOffset)); + } + E && (i.x = Math.max(i.x, 1e-3), i.y = Math.max(i.y, 1e-3), i.z = Math.max(i.z, 1e-3), r = Matrix4.multiplyByScale(r, i, r), this._primitive.modelMatrix = r, this._outlinePrimitive.modelMatrix = r); +}; +function PlaneGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.vertexFormat, VertexFormat.DEFAULT); + this._vertexFormat = t, this._workerName = "createPlaneGeometry"; +} +PlaneGeometry.packedLength = VertexFormat.packedLength; +PlaneGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), VertexFormat.pack(e._vertexFormat, t, n), t; +}; +const scratchVertexFormat$6 = new VertexFormat(), scratchOptions$a = { + vertexFormat: scratchVertexFormat$6 +}; +PlaneGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = VertexFormat.unpack( + e, + t, + scratchVertexFormat$6 + ); + return defined(n) ? (n._vertexFormat = VertexFormat.clone(i, n._vertexFormat), n) : new PlaneGeometry(scratchOptions$a); +}; +const min$1 = new Cartesian3(-0.5, -0.5, 0), max$1 = new Cartesian3(0.5, 0.5, 0); +PlaneGeometry.createGeometry = function(e) { + const t = e._vertexFormat, n = new GeometryAttributes(); + let i, r; + if (t.position) { + if (r = new Float64Array(4 * 3), r[0] = min$1.x, r[1] = min$1.y, r[2] = 0, r[3] = max$1.x, r[4] = min$1.y, r[5] = 0, r[6] = max$1.x, r[7] = max$1.y, r[8] = 0, r[9] = min$1.x, r[10] = max$1.y, r[11] = 0, n.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: r + }), t.normal) { + const o = new Float32Array(12); + o[0] = 0, o[1] = 0, o[2] = 1, o[3] = 0, o[4] = 0, o[5] = 1, o[6] = 0, o[7] = 0, o[8] = 1, o[9] = 0, o[10] = 0, o[11] = 1, n.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: o + }); + } + if (t.st) { + const o = new Float32Array(8); + o[0] = 0, o[1] = 0, o[2] = 1, o[3] = 0, o[4] = 1, o[5] = 1, o[6] = 0, o[7] = 1, n.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: o + }); + } + if (t.tangent) { + const o = new Float32Array(12); + o[0] = 1, o[1] = 0, o[2] = 0, o[3] = 1, o[4] = 0, o[5] = 0, o[6] = 1, o[7] = 0, o[8] = 0, o[9] = 1, o[10] = 0, o[11] = 0, n.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: o + }); + } + if (t.bitangent) { + const o = new Float32Array(12); + o[0] = 0, o[1] = 1, o[2] = 0, o[3] = 0, o[4] = 1, o[5] = 0, o[6] = 0, o[7] = 1, o[8] = 0, o[9] = 0, o[10] = 1, o[11] = 0, n.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: o + }); + } + i = new Uint16Array(2 * 3), i[0] = 0, i[1] = 1, i[2] = 2, i[3] = 0, i[4] = 2, i[5] = 3; + } + return new Geometry({ + attributes: n, + indices: i, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: new BoundingSphere(Cartesian3.ZERO, Math.sqrt(2)) + }); +}; +function PlaneOutlineGeometry() { + this._workerName = "createPlaneOutlineGeometry"; +} +PlaneOutlineGeometry.packedLength = 0; +PlaneOutlineGeometry.pack = function(e, t) { + return t; +}; +PlaneOutlineGeometry.unpack = function(e, t, n) { + return defined(n) ? n : new PlaneOutlineGeometry(); +}; +const min = new Cartesian3(-0.5, -0.5, 0), max = new Cartesian3(0.5, 0.5, 0); +PlaneOutlineGeometry.createGeometry = function() { + const e = new GeometryAttributes(), t = new Uint16Array(4 * 2), n = new Float64Array(4 * 3); + return n[0] = min.x, n[1] = min.y, n[2] = min.z, n[3] = max.x, n[4] = min.y, n[5] = min.z, n[6] = max.x, n[7] = max.y, n[8] = min.z, n[9] = min.x, n[10] = max.y, n[11] = min.z, e.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: n + }), t[0] = 0, t[1] = 1, t[2] = 1, t[3] = 2, t[4] = 2, t[5] = 3, t[6] = 3, t[7] = 0, new Geometry({ + attributes: e, + indices: t, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: new BoundingSphere(Cartesian3.ZERO, Math.sqrt(2)) + }); +}; +const positionScratch$3 = new Cartesian3(), scratchColor$a = new Color(); +function PlaneGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.plane = void 0, this.dimensions = void 0; +} +function PlaneGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new PlaneGeometryOptions(e), + geometryPropertyName: "plane", + observedPropertyNames: ["availability", "position", "orientation", "plane"] + }), this._onEntityPropertyChanged(e, "plane", e.plane, void 0); +} +defined(Object.create) && (PlaneGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), PlaneGeometryUpdater.prototype.constructor = PlaneGeometryUpdater); +PlaneGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e); + let i, r; + const o = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), s = this._distanceDisplayConditionProperty.getValue( + e + ), c = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + s + ); + if (this._materialProperty instanceof ColorMaterialProperty) { + let m; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (m = this._materialProperty.color.getValue(e, scratchColor$a)), defined(m) || (m = Color.WHITE), r = ColorGeometryInstanceAttribute.fromColor(m), i = { + show: o, + distanceDisplayCondition: c, + color: r + }; + } else + i = { + show: o, + distanceDisplayCondition: c + }; + const l = t.plane, d = this._options; + let f = t.computeModelMatrix(e); + const h = Property.getValueOrDefault( + l.plane, + e, + d.plane + ), p = Property.getValueOrUndefined( + l.dimensions, + e, + d.dimensions + ); + return d.plane = h, d.dimensions = p, f = createPrimitiveMatrix( + h, + p, + f, + f + ), new GeometryInstance({ + id: t, + geometry: new PlaneGeometry(this._options), + modelMatrix: f, + attributes: i + }); +}; +PlaneGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$a + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = t.plane, s = this._options; + let c = t.computeModelMatrix(e); + const l = Property.getValueOrDefault( + o.plane, + e, + s.plane + ), d = Property.getValueOrUndefined( + o.dimensions, + e, + s.dimensions + ); + return s.plane = l, s.dimensions = d, c = createPrimitiveMatrix( + l, + d, + c, + c + ), new GeometryInstance({ + id: t, + geometry: new PlaneOutlineGeometry(), + modelMatrix: c, + attributes: { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ) + } + }); +}; +PlaneGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.plane) || !defined(t.dimensions) || !defined(e.position) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +PlaneGeometryUpdater.prototype._getIsClosed = function(e) { + return !1; +}; +PlaneGeometryUpdater.prototype._isDynamic = function(e, t) { + return !e.position.isConstant || // + !Property.isConstant(e.orientation) || // + !t.plane.isConstant || // + !t.dimensions.isConstant || // + !Property.isConstant(t.outlineWidth); +}; +PlaneGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = this._materialProperty instanceof ColorMaterialProperty, i = this._options; + i.vertexFormat = n ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, i.plane = t.plane.getValue(Iso8601.MINIMUM_VALUE, i.plane), i.dimensions = t.dimensions.getValue( + Iso8601.MINIMUM_VALUE, + i.dimensions + ); +}; +PlaneGeometryUpdater.DynamicGeometryUpdater = DynamicPlaneGeometryUpdater; +function DynamicPlaneGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicPlaneGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicPlaneGeometryUpdater.prototype.constructor = DynamicPlaneGeometryUpdater); +DynamicPlaneGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = this._options, r = Property.getValueOrUndefined( + e.position, + n, + positionScratch$3 + ); + return !defined(r) || !defined(i.plane) || !defined(i.dimensions) || DynamicGeometryUpdater$1.prototype._isHidden.call(this, e, t, n); +}; +DynamicPlaneGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + i.plane = Property.getValueOrDefault(t.plane, n, i.plane), i.dimensions = Property.getValueOrUndefined( + t.dimensions, + n, + i.dimensions + ); +}; +const scratchAxis = new Cartesian3(), scratchUp$2 = new Cartesian3(), scratchTranslation$2 = new Cartesian3(), scratchScale$6 = new Cartesian3(), scratchRotation$4 = new Matrix3(), scratchRotationScale$1 = new Matrix3(), scratchLocalTransform = new Matrix4(); +function createPrimitiveMatrix(e, t, n, i) { + const r = e.normal, o = e.distance, s = Cartesian3.multiplyByScalar( + r, + -o, + scratchTranslation$2 + ); + let c = Cartesian3.clone(Cartesian3.UNIT_Z, scratchUp$2); + CesiumMath.equalsEpsilon( + Math.abs(Cartesian3.dot(c, r)), + 1, + CesiumMath.EPSILON8 + ) && (c = Cartesian3.clone(Cartesian3.UNIT_Y, c)); + const l = Cartesian3.cross(c, r, scratchAxis); + c = Cartesian3.cross(r, l, c), Cartesian3.normalize(l, l), Cartesian3.normalize(c, c); + const d = scratchRotation$4; + Matrix3.setColumn(d, 0, l, d), Matrix3.setColumn(d, 1, c, d), Matrix3.setColumn(d, 2, r, d); + const f = Cartesian3.fromElements( + t.x, + t.y, + 1, + scratchScale$6 + ), h = Matrix3.multiplyByScale( + d, + f, + scratchRotationScale$1 + ), p = Matrix4.fromRotationTranslation( + h, + s, + scratchLocalTransform + ); + return Matrix4.multiplyTransformation(n, p, i); +} +PlaneGeometryUpdater.createPrimitiveMatrix = createPrimitiveMatrix; +const scratchPosition$6 = new Cartesian3(), scratchBR = new BoundingRectangle(), stScratch$1 = new Cartesian2(), textureCoordinatesOrigin = new Cartesian2(), scratchNormal$3 = new Cartesian3(), scratchTangent$1 = new Cartesian3(), scratchBitangent$1 = new Cartesian3(), centerScratch$3 = new Cartesian3(), axis1Scratch = new Cartesian3(), axis2Scratch = new Cartesian3(), quaternionScratch$1 = new Quaternion(), textureMatrixScratch = new Matrix3(), tangentRotationScratch = new Matrix3(), surfaceNormalScratch = new Cartesian3(); +function createGeometryFromPolygon(e, t, n, i, r, o, s, c, l) { + const d = e.positions; + let f = PolygonPipeline.triangulate(e.positions2D, e.holes); + f.length < 3 && (f = [0, 1, 2]); + const h = IndexDatatype$1.createTypedArray( + d.length, + f.length + ); + h.set(f); + let p = textureMatrixScratch; + if (i !== 0) { + let R = Quaternion.fromAxisAngle( + s, + i, + quaternionScratch$1 + ); + if (p = Matrix3.fromQuaternion(R, p), t.tangent || t.bitangent) { + R = Quaternion.fromAxisAngle( + s, + -i, + quaternionScratch$1 + ); + const L = Matrix3.fromQuaternion( + R, + tangentRotationScratch + ); + c = Cartesian3.normalize( + Matrix3.multiplyByVector(L, c, c), + c + ), t.bitangent && (l = Cartesian3.normalize( + Cartesian3.cross(s, c, l), + l + )); + } + } else + p = Matrix3.clone(Matrix3.IDENTITY, p); + const m = textureCoordinatesOrigin; + t.st && (m.x = n.x, m.y = n.y); + const _ = d.length, y = _ * 3, C = new Float64Array(y), T = t.normal ? new Float32Array(y) : void 0, x = t.tangent ? new Float32Array(y) : void 0, b = t.bitangent ? new Float32Array(y) : void 0, S = t.st ? new Float32Array(_ * 2) : void 0; + let E = 0, A = 0, D = 0, P = 0, I = 0; + for (let R = 0; R < _; R++) { + const L = d[R]; + if (C[E++] = L.x, C[E++] = L.y, C[E++] = L.z, t.st) + if (defined(r) && r.positions.length === _) + S[I++] = r.positions[R].x, S[I++] = r.positions[R].y; + else { + const g = Matrix3.multiplyByVector( + p, + L, + scratchPosition$6 + ), w = o(g, stScratch$1); + Cartesian2.subtract(w, m, w); + const O = CesiumMath.clamp(w.x / n.width, 0, 1), N = CesiumMath.clamp(w.y / n.height, 0, 1); + S[I++] = O, S[I++] = N; + } + t.normal && (T[A++] = s.x, T[A++] = s.y, T[A++] = s.z), t.tangent && (x[P++] = c.x, x[P++] = c.y, x[P++] = c.z), t.bitangent && (b[D++] = l.x, b[D++] = l.y, b[D++] = l.z); + } + const M = new GeometryAttributes(); + return t.position && (M.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: C + })), t.normal && (M.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: T + })), t.tangent && (M.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: x + })), t.bitangent && (M.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: b + })), t.st && (M.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: S + })), new Geometry({ + attributes: M, + indices: h, + primitiveType: PrimitiveType$1.TRIANGLES + }); +} +function CoplanarPolygonGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.polygonHierarchy, n = e.textureCoordinates, i = defaultValue(e.vertexFormat, VertexFormat.DEFAULT); + this._vertexFormat = VertexFormat.clone(i), this._polygonHierarchy = t, this._stRotation = defaultValue(e.stRotation, 0), this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._workerName = "createCoplanarPolygonGeometry", this._textureCoordinates = n, this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength( + t, + Cartesian3 + ) + VertexFormat.packedLength + Ellipsoid.packedLength + (defined(n) ? PolygonGeometryLibrary.computeHierarchyPackedLength( + n, + Cartesian2 + ) : 1) + 2; +} +CoplanarPolygonGeometry.fromPositions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = { + polygonHierarchy: { + positions: e.positions + }, + vertexFormat: e.vertexFormat, + stRotation: e.stRotation, + ellipsoid: e.ellipsoid, + textureCoordinates: e.textureCoordinates + }; + return new CoplanarPolygonGeometry(t); +}; +CoplanarPolygonGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), n = PolygonGeometryLibrary.packPolygonHierarchy( + e._polygonHierarchy, + t, + n, + Cartesian3 + ), Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._stRotation, defined(e._textureCoordinates) ? n = PolygonGeometryLibrary.packPolygonHierarchy( + e._textureCoordinates, + t, + n, + Cartesian2 + ) : t[n++] = -1, t[n++] = e.packedLength, t; +}; +const scratchEllipsoid$8 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$5 = new VertexFormat(), scratchOptions$9 = { + polygonHierarchy: {} +}; +CoplanarPolygonGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian3 + ); + t = i.startingIndex, delete i.startingIndex; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$8); + t += Ellipsoid.packedLength; + const o = VertexFormat.unpack( + e, + t, + scratchVertexFormat$5 + ); + t += VertexFormat.packedLength; + const s = e[t++], c = e[t] === -1 ? void 0 : PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian2 + ); + defined(c) ? (t = c.startingIndex, delete c.startingIndex) : t++; + const l = e[t++]; + return defined(n) || (n = new CoplanarPolygonGeometry(scratchOptions$9)), n._polygonHierarchy = i, n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._stRotation = s, n._textureCoordinates = c, n.packedLength = l, n; +}; +CoplanarPolygonGeometry.createGeometry = function(e) { + const t = e._vertexFormat, n = e._polygonHierarchy, i = e._stRotation, r = e._textureCoordinates, o = defined(r); + let s = n.positions; + if (s = arrayRemoveDuplicates( + s, + Cartesian3.equalsEpsilon, + !0 + ), s.length < 3) + return; + let c = scratchNormal$3, l = scratchTangent$1, d = scratchBitangent$1, f = axis1Scratch; + const h = axis2Scratch; + if (!CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments( + s, + centerScratch$3, + f, + h + )) + return; + if (c = Cartesian3.cross(f, h, c), c = Cartesian3.normalize(c, c), !Cartesian3.equalsEpsilon( + centerScratch$3, + Cartesian3.ZERO, + CesiumMath.EPSILON6 + )) { + const I = e._ellipsoid.geodeticSurfaceNormal( + centerScratch$3, + surfaceNormalScratch + ); + Cartesian3.dot(c, I) < 0 && (c = Cartesian3.negate(c, c), f = Cartesian3.negate(f, f)); + } + const m = CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction( + centerScratch$3, + f, + h + ), _ = CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction( + centerScratch$3, + f, + h + ); + t.tangent && (l = Cartesian3.clone(f, l)), t.bitangent && (d = Cartesian3.clone(h, d)); + const y = PolygonGeometryLibrary.polygonsFromHierarchy( + n, + o, + m, + !1 + ), C = y.hierarchy, T = y.polygons, x = function(I) { + return I; + }, b = o ? PolygonGeometryLibrary.polygonsFromHierarchy( + r, + !0, + x, + !1 + ).polygons : void 0; + if (C.length === 0) + return; + s = C[0].outerRing; + const S = BoundingSphere.fromPoints(s), E = PolygonGeometryLibrary.computeBoundingRectangle( + c, + _, + s, + i, + scratchBR + ), A = []; + for (let I = 0; I < T.length; I++) { + const M = new GeometryInstance({ + geometry: createGeometryFromPolygon( + T[I], + t, + E, + i, + o ? b[I] : void 0, + _, + c, + l, + d + ) + }); + A.push(M); + } + const D = GeometryPipeline.combineInstances(A)[0]; + D.attributes.position.values = new Float64Array( + D.attributes.position.values + ), D.indices = IndexDatatype$1.createTypedArray( + D.attributes.position.values.length / 3, + D.indices + ); + const P = D.attributes; + return t.position || delete P.position, new Geometry({ + attributes: P, + indices: D.indices, + primitiveType: D.primitiveType, + boundingSphere: S + }); +}; +const createGeometryFromPositionsPositions = [], createGeometryFromPositionsSubdivided = []; +function createGeometryFromPositions(e, t, n, i, r) { + const s = EllipsoidTangentPlane.fromPoints(t, e).projectPointsOntoPlane( + t, + createGeometryFromPositionsPositions + ); + PolygonPipeline.computeWindingOrder2D( + s + ) === WindingOrder$1.CLOCKWISE && (s.reverse(), t = t.slice().reverse()); + let l, d, f = t.length, h = 0; + if (i) + for (l = new Float64Array(f * 2 * 3), d = 0; d < f; d++) { + const _ = t[d], y = t[(d + 1) % f]; + l[h++] = _.x, l[h++] = _.y, l[h++] = _.z, l[h++] = y.x, l[h++] = y.y, l[h++] = y.z; + } + else { + let _ = 0; + if (r === ArcType$1.GEODESIC) + for (d = 0; d < f; d++) + _ += PolygonGeometryLibrary.subdivideLineCount( + t[d], + t[(d + 1) % f], + n + ); + else if (r === ArcType$1.RHUMB) + for (d = 0; d < f; d++) + _ += PolygonGeometryLibrary.subdivideRhumbLineCount( + e, + t[d], + t[(d + 1) % f], + n + ); + for (l = new Float64Array(_ * 3), d = 0; d < f; d++) { + let y; + r === ArcType$1.GEODESIC ? y = PolygonGeometryLibrary.subdivideLine( + t[d], + t[(d + 1) % f], + n, + createGeometryFromPositionsSubdivided + ) : r === ArcType$1.RHUMB && (y = PolygonGeometryLibrary.subdivideRhumbLine( + e, + t[d], + t[(d + 1) % f], + n, + createGeometryFromPositionsSubdivided + )); + const C = y.length; + for (let T = 0; T < C; ++T) + l[h++] = y[T]; + } + } + f = l.length / 3; + const p = f * 2, m = IndexDatatype$1.createTypedArray(f, p); + for (h = 0, d = 0; d < f - 1; d++) + m[h++] = d, m[h++] = d + 1; + return m[h++] = f - 1, m[h++] = 0, new GeometryInstance({ + geometry: new Geometry({ + attributes: new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: l + }) + }), + indices: m, + primitiveType: PrimitiveType$1.LINES + }) + }); +} +function createGeometryFromPositionsExtruded(e, t, n, i, r) { + const s = EllipsoidTangentPlane.fromPoints(t, e).projectPointsOntoPlane( + t, + createGeometryFromPositionsPositions + ); + PolygonPipeline.computeWindingOrder2D( + s + ) === WindingOrder$1.CLOCKWISE && (s.reverse(), t = t.slice().reverse()); + let l, d, f = t.length; + const h = new Array(f); + let p = 0; + if (i) + for (l = new Float64Array(f * 2 * 3 * 2), d = 0; d < f; ++d) { + h[d] = p / 3; + const C = t[d], T = t[(d + 1) % f]; + l[p++] = C.x, l[p++] = C.y, l[p++] = C.z, l[p++] = T.x, l[p++] = T.y, l[p++] = T.z; + } + else { + let C = 0; + if (r === ArcType$1.GEODESIC) + for (d = 0; d < f; d++) + C += PolygonGeometryLibrary.subdivideLineCount( + t[d], + t[(d + 1) % f], + n + ); + else if (r === ArcType$1.RHUMB) + for (d = 0; d < f; d++) + C += PolygonGeometryLibrary.subdivideRhumbLineCount( + e, + t[d], + t[(d + 1) % f], + n + ); + for (l = new Float64Array(C * 3 * 2), d = 0; d < f; ++d) { + h[d] = p / 3; + let T; + r === ArcType$1.GEODESIC ? T = PolygonGeometryLibrary.subdivideLine( + t[d], + t[(d + 1) % f], + n, + createGeometryFromPositionsSubdivided + ) : r === ArcType$1.RHUMB && (T = PolygonGeometryLibrary.subdivideRhumbLine( + e, + t[d], + t[(d + 1) % f], + n, + createGeometryFromPositionsSubdivided + )); + const x = T.length; + for (let b = 0; b < x; ++b) + l[p++] = T[b]; + } + } + f = l.length / (3 * 2); + const m = h.length, _ = (f * 2 + m) * 2, y = IndexDatatype$1.createTypedArray( + f + m, + _ + ); + for (p = 0, d = 0; d < f; ++d) + y[p++] = d, y[p++] = (d + 1) % f, y[p++] = d + f, y[p++] = (d + 1) % f + f; + for (d = 0; d < m; d++) { + const C = h[d]; + y[p++] = C, y[p++] = C + f; + } + return new GeometryInstance({ + geometry: new Geometry({ + attributes: new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: l + }) + }), + indices: y, + primitiveType: PrimitiveType$1.LINES + }) + }); +} +function PolygonOutlineGeometry(e) { + const t = e.polygonHierarchy, n = defaultValue(e.ellipsoid, Ellipsoid.default), i = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), r = defaultValue(e.perPositionHeight, !1), o = r && defined(e.extrudedHeight), s = defaultValue(e.arcType, ArcType$1.GEODESIC); + let c = defaultValue(e.height, 0), l = defaultValue(e.extrudedHeight, c); + if (!o) { + const d = Math.max(c, l); + l = Math.min(c, l), c = d; + } + this._ellipsoid = Ellipsoid.clone(n), this._granularity = i, this._height = c, this._extrudedHeight = l, this._arcType = s, this._polygonHierarchy = t, this._perPositionHeight = r, this._perPositionHeightExtrude = o, this._offsetAttribute = e.offsetAttribute, this._workerName = "createPolygonOutlineGeometry", this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength( + t, + Cartesian3 + ) + Ellipsoid.packedLength + 8; +} +PolygonOutlineGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), n = PolygonGeometryLibrary.packPolygonHierarchy( + e._polygonHierarchy, + t, + n, + Cartesian3 + ), Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._height, t[n++] = e._extrudedHeight, t[n++] = e._granularity, t[n++] = e._perPositionHeightExtrude ? 1 : 0, t[n++] = e._perPositionHeight ? 1 : 0, t[n++] = e._arcType, t[n++] = defaultValue(e._offsetAttribute, -1), t[n] = e.packedLength, t; +}; +const scratchEllipsoid$7 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), dummyOptions = { + polygonHierarchy: {} +}; +PolygonOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = PolygonGeometryLibrary.unpackPolygonHierarchy( + e, + t, + Cartesian3 + ); + t = i.startingIndex, delete i.startingIndex; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$7); + t += Ellipsoid.packedLength; + const o = e[t++], s = e[t++], c = e[t++], l = e[t++] === 1, d = e[t++] === 1, f = e[t++], h = e[t++], p = e[t]; + return defined(n) || (n = new PolygonOutlineGeometry(dummyOptions)), n._polygonHierarchy = i, n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._height = o, n._extrudedHeight = s, n._granularity = c, n._perPositionHeight = d, n._perPositionHeightExtrude = l, n._arcType = f, n._offsetAttribute = h === -1 ? void 0 : h, n.packedLength = p, n; +}; +PolygonOutlineGeometry.fromPositions = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = { + polygonHierarchy: { + positions: e.positions + }, + height: e.height, + extrudedHeight: e.extrudedHeight, + ellipsoid: e.ellipsoid, + granularity: e.granularity, + perPositionHeight: e.perPositionHeight, + arcType: e.arcType, + offsetAttribute: e.offsetAttribute + }; + return new PolygonOutlineGeometry(t); +}; +PolygonOutlineGeometry.createGeometry = function(e) { + const t = e._ellipsoid, n = e._granularity, i = e._polygonHierarchy, r = e._perPositionHeight, o = e._arcType, s = PolygonGeometryLibrary.polygonOutlinesFromHierarchy( + i, + !r, + t + ); + if (s.length === 0) + return; + let c; + const l = [], d = CesiumMath.chordLength( + n, + t.maximumRadius + ), f = e._height, h = e._extrudedHeight, p = e._perPositionHeightExtrude || !CesiumMath.equalsEpsilon(f, h, 0, CesiumMath.EPSILON2); + let m, _; + if (p) + for (_ = 0; _ < s.length; _++) { + if (c = createGeometryFromPositionsExtruded( + t, + s[_], + d, + r, + o + ), c.geometry = PolygonGeometryLibrary.scaleToGeodeticHeightExtruded( + c.geometry, + f, + h, + t, + r + ), defined(e._offsetAttribute)) { + const T = c.geometry.attributes.position.values.length / 3; + let x = new Uint8Array(T); + e._offsetAttribute === GeometryOffsetAttribute$1.TOP ? x = x.fill(1, 0, T / 2) : (m = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, x = x.fill(m)), c.geometry.attributes.applyOffset = new GeometryAttribute( + { + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: x + } + ); + } + l.push(c); + } + else + for (_ = 0; _ < s.length; _++) { + if (c = createGeometryFromPositions( + t, + s[_], + d, + r, + o + ), c.geometry.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + c.geometry.attributes.position.values, + f, + t, + !r + ), defined(e._offsetAttribute)) { + const T = c.geometry.attributes.position.values.length; + m = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1; + const x = new Uint8Array(T / 3).fill(m); + c.geometry.attributes.applyOffset = new GeometryAttribute( + { + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: x + } + ); + } + l.push(c); + } + const y = GeometryPipeline.combineInstances(l)[0], C = BoundingSphere.fromVertices( + y.attributes.position.values + ); + return new Geometry({ + attributes: y.attributes, + indices: y.indices, + primitiveType: y.primitiveType, + boundingSphere: C, + offsetAttribute: e._offsetAttribute + }); +}; +const heightAndPerPositionHeightWarning = "Entity polygons cannot have both height and perPositionHeight. height will be ignored", heightReferenceAndPerPositionHeightWarning = "heightReference is not supported for entity polygons with perPositionHeight. heightReference will be ignored", scratchColor$9 = new Color(), defaultOffset$4 = Cartesian3.ZERO, offsetScratch$4 = new Cartesian3(), scratchRectangle$4 = new Rectangle(), scratch2DPositions = [], cart2Scratch = new Cartesian2(); +function PolygonGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.polygonHierarchy = void 0, this.perPositionHeight = void 0, this.closeTop = void 0, this.closeBottom = void 0, this.height = void 0, this.extrudedHeight = void 0, this.granularity = void 0, this.stRotation = void 0, this.offsetAttribute = void 0, this.arcType = void 0, this.textureCoordinates = void 0; +} +function PolygonGeometryUpdater(e, t) { + GroundGeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new PolygonGeometryOptions(e), + geometryPropertyName: "polygon", + observedPropertyNames: ["availability", "polygon"] + }), this._onEntityPropertyChanged(e, "polygon", e.polygon, void 0); +} +defined(Object.create) && (PolygonGeometryUpdater.prototype = Object.create( + GroundGeometryUpdater.prototype +), PolygonGeometryUpdater.prototype.constructor = PolygonGeometryUpdater); +PolygonGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = this._options, r = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + this._distanceDisplayConditionProperty.getValue(e) + ), + offset: void 0, + color: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let s; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (s = this._materialProperty.color.getValue(e, scratchColor$9)), defined(s) || (s = Color.WHITE), r.color = ColorGeometryInstanceAttribute.fromColor(s); + } + defined(i.offsetAttribute) && (r.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$4, + offsetScratch$4 + ) + )); + let o; + return i.perPositionHeight && !defined(i.extrudedHeight) ? o = new CoplanarPolygonGeometry(i) : o = new PolygonGeometry(i), new GeometryInstance({ + id: t, + geometry: o, + attributes: r + }); +}; +PolygonGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = this._options, r = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$9 + ), o = this._distanceDisplayConditionProperty.getValue( + e + ), s = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(r), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + o + ), + offset: void 0 + }; + defined(i.offsetAttribute) && (s.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$4, + offsetScratch$4 + ) + )); + let c; + return i.perPositionHeight && !defined(i.extrudedHeight) ? c = new CoplanarPolygonOutlineGeometry(i) : c = new PolygonOutlineGeometry(i), new GeometryInstance({ + id: t, + geometry: c, + attributes: s + }); +}; +PolygonGeometryUpdater.prototype._computeCenter = function(e, t) { + const n = Property.getValueOrUndefined( + this._entity.polygon.hierarchy, + e + ); + if (!defined(n)) + return; + const i = n.positions; + if (i.length === 0) + return; + const r = this._scene.ellipsoid, o = EllipsoidTangentPlane.fromPoints(i, r), s = o.projectPointsOntoPlane( + i, + scratch2DPositions + ), c = s.length; + let l = 0, d = c - 1, f = new Cartesian2(); + for (let p = 0; p < c; d = p++) { + const m = s[p], _ = s[d], y = m.x * _.y - _.x * m.y; + let C = Cartesian2.add(m, _, cart2Scratch); + C = Cartesian2.multiplyByScalar(C, y, C), f = Cartesian2.add(f, C, f), l += y; + } + const h = 1 / (l * 3); + return f = Cartesian2.multiplyByScalar(f, h, f), o.projectPointOntoEllipsoid(f, t); +}; +PolygonGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.hierarchy) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +PolygonGeometryUpdater.prototype._isOnTerrain = function(e, t) { + const n = GroundGeometryUpdater.prototype._isOnTerrain.call( + this, + e, + t + ), i = t.perPositionHeight, r = defined(i) && (i.isConstant ? i.getValue(Iso8601.MINIMUM_VALUE) : !0); + return n && !r; +}; +PolygonGeometryUpdater.prototype._isDynamic = function(e, t) { + return !t.hierarchy.isConstant || // + !Property.isConstant(t.height) || // + !Property.isConstant(t.extrudedHeight) || // + !Property.isConstant(t.granularity) || // + !Property.isConstant(t.stRotation) || // + !Property.isConstant(t.textureCoordinates) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.perPositionHeight) || // + !Property.isConstant(t.closeTop) || // + !Property.isConstant(t.closeBottom) || // + !Property.isConstant(t.zIndex) || // + !Property.isConstant(t.arcType) || // + this._onTerrain && !Property.isConstant(this._materialProperty) && !(this._materialProperty instanceof ColorMaterialProperty); +}; +PolygonGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = this._materialProperty instanceof ColorMaterialProperty, i = this._options; + i.vertexFormat = n ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat; + const r = t.hierarchy.getValue(Iso8601.MINIMUM_VALUE); + let o = Property.getValueOrUndefined( + t.height, + Iso8601.MINIMUM_VALUE + ); + const s = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + let c = Property.getValueOrUndefined( + t.extrudedHeight, + Iso8601.MINIMUM_VALUE + ); + const l = Property.getValueOrDefault( + t.extrudedHeightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ), d = Property.getValueOrDefault( + t.perPositionHeight, + Iso8601.MINIMUM_VALUE, + !1 + ); + o = GroundGeometryUpdater.getGeometryHeight( + o, + s + ); + let f; + if (d ? (defined(o) && (o = void 0, oneTimeWarning(heightAndPerPositionHeightWarning)), s !== HeightReference$1.NONE && d && (o = void 0, oneTimeWarning(heightReferenceAndPerPositionHeightWarning))) : (defined(c) && !defined(o) && (o = 0), f = GroundGeometryUpdater.computeGeometryOffsetAttribute( + o, + s, + c, + l + )), i.polygonHierarchy = r, i.granularity = Property.getValueOrUndefined( + t.granularity, + Iso8601.MINIMUM_VALUE + ), i.stRotation = Property.getValueOrUndefined( + t.stRotation, + Iso8601.MINIMUM_VALUE + ), i.perPositionHeight = d, i.closeTop = Property.getValueOrDefault( + t.closeTop, + Iso8601.MINIMUM_VALUE, + !0 + ), i.closeBottom = Property.getValueOrDefault( + t.closeBottom, + Iso8601.MINIMUM_VALUE, + !0 + ), i.offsetAttribute = f, i.height = o, i.arcType = Property.getValueOrDefault( + t.arcType, + Iso8601.MINIMUM_VALUE, + ArcType$1.GEODESIC + ), i.textureCoordinates = Property.getValueOrUndefined( + t.textureCoordinates, + Iso8601.MINIMUM_VALUE + ), c = GroundGeometryUpdater.getGeometryExtrudedHeight( + c, + l + ), c === GroundGeometryUpdater.CLAMP_TO_GROUND) { + const h = PolygonGeometry.computeRectangleFromPositions( + i.polygonHierarchy.positions, + i.ellipsoid, + i.arcType, + scratchRectangle$4 + ); + c = ApproximateTerrainHeights.getMinimumMaximumHeights( + h + ).minimumTerrainHeight; + } + i.extrudedHeight = c; +}; +PolygonGeometryUpdater.prototype._getIsClosed = function(e) { + const t = e.height, n = e.extrudedHeight, i = defined(n) && n !== t; + return !e.perPositionHeight && (!i && t === 0 || i && e.closeTop && e.closeBottom); +}; +PolygonGeometryUpdater.DynamicGeometryUpdater = DyanmicPolygonGeometryUpdater; +function DyanmicPolygonGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DyanmicPolygonGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DyanmicPolygonGeometryUpdater.prototype.constructor = DyanmicPolygonGeometryUpdater); +DyanmicPolygonGeometryUpdater.prototype._isHidden = function(e, t, n) { + return !defined(this._options.polygonHierarchy) || DynamicGeometryUpdater$1.prototype._isHidden.call(this, e, t, n); +}; +DyanmicPolygonGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + i.polygonHierarchy = Property.getValueOrUndefined( + t.hierarchy, + n + ); + let r = Property.getValueOrUndefined(t.height, n); + const o = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ), s = Property.getValueOrDefault( + t.extrudedHeightReference, + n, + HeightReference$1.NONE + ); + let c = Property.getValueOrUndefined( + t.extrudedHeight, + n + ); + const l = Property.getValueOrUndefined( + t.perPositionHeight, + n + ); + r = GroundGeometryUpdater.getGeometryHeight( + r, + s + ); + let d; + if (l ? (defined(r) && (r = void 0, oneTimeWarning(heightAndPerPositionHeightWarning)), o !== HeightReference$1.NONE && l && (r = void 0, oneTimeWarning(heightReferenceAndPerPositionHeightWarning))) : (defined(c) && !defined(r) && (r = 0), d = GroundGeometryUpdater.computeGeometryOffsetAttribute( + r, + o, + c, + s + )), i.granularity = Property.getValueOrUndefined(t.granularity, n), i.stRotation = Property.getValueOrUndefined(t.stRotation, n), i.textureCoordinates = Property.getValueOrUndefined( + t.textureCoordinates, + n + ), i.perPositionHeight = Property.getValueOrUndefined( + t.perPositionHeight, + n + ), i.closeTop = Property.getValueOrDefault(t.closeTop, n, !0), i.closeBottom = Property.getValueOrDefault( + t.closeBottom, + n, + !0 + ), i.offsetAttribute = d, i.height = r, i.arcType = Property.getValueOrDefault( + t.arcType, + n, + ArcType$1.GEODESIC + ), c = GroundGeometryUpdater.getGeometryExtrudedHeight( + c, + s + ), c === GroundGeometryUpdater.CLAMP_TO_GROUND) { + const f = PolygonGeometry.computeRectangleFromPositions( + i.polygonHierarchy.positions, + i.ellipsoid, + i.arcType, + scratchRectangle$4 + ); + c = ApproximateTerrainHeights.getMinimumMaximumHeights( + f + ).minimumTerrainHeight; + } + i.extrudedHeight = c; +}; +function computeAttributes$1(e, t, n, i) { + const r = new GeometryAttributes(); + i.position && (r.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: e + })); + const o = t.length, s = e.length / 3, c = (s - o * 2) / (o * 2), l = PolygonPipeline.triangulate(t), d = (c - 1) * o * 6 + l.length * 2, f = IndexDatatype$1.createTypedArray(s, d); + let h, p, m, _, y, C; + const T = o * 2; + let x = 0; + for (h = 0; h < c - 1; h++) { + for (p = 0; p < o - 1; p++) + m = p * 2 + h * o * 2, C = m + T, _ = m + 1, y = _ + T, f[x++] = _, f[x++] = m, f[x++] = y, f[x++] = y, f[x++] = m, f[x++] = C; + m = o * 2 - 2 + h * o * 2, _ = m + 1, y = _ + T, C = m + T, f[x++] = _, f[x++] = m, f[x++] = y, f[x++] = y, f[x++] = m, f[x++] = C; + } + if (i.st || i.tangent || i.bitangent) { + const E = new Float32Array(s * 2), A = 1 / (c - 1), D = 1 / n.height, P = n.height / 2; + let I, M, R = 0; + for (h = 0; h < c; h++) { + for (I = h * A, M = D * (t[0].y + P), E[R++] = I, E[R++] = M, p = 1; p < o; p++) + M = D * (t[p].y + P), E[R++] = I, E[R++] = M, E[R++] = I, E[R++] = M; + M = D * (t[0].y + P), E[R++] = I, E[R++] = M; + } + for (p = 0; p < o; p++) + I = 0, M = D * (t[p].y + P), E[R++] = I, E[R++] = M; + for (p = 0; p < o; p++) + I = (c - 1) * A, M = D * (t[p].y + P), E[R++] = I, E[R++] = M; + r.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: new Float32Array(E) + }); + } + const b = s - o * 2; + for (h = 0; h < l.length; h += 3) { + const E = l[h] + b, A = l[h + 1] + b, D = l[h + 2] + b; + f[x++] = E, f[x++] = A, f[x++] = D, f[x++] = D + o, f[x++] = A + o, f[x++] = E + o; + } + let S = new Geometry({ + attributes: r, + indices: f, + boundingSphere: BoundingSphere.fromVertices(e), + primitiveType: PrimitiveType$1.TRIANGLES + }); + if (i.normal && (S = GeometryPipeline.computeNormal(S)), i.tangent || i.bitangent) { + try { + S = GeometryPipeline.computeTangentAndBitangent(S); + } catch { + oneTimeWarning( + "polyline-volume-tangent-bitangent", + "Unable to compute tangents and bitangents for polyline volume geometry" + ); + } + i.tangent || (S.attributes.tangent = void 0), i.bitangent || (S.attributes.bitangent = void 0), i.st || (S.attributes.st = void 0); + } + return S; +} +function PolylineVolumeGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.polylinePositions, n = e.shapePositions; + this._positions = t, this._shape = n, this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._cornerType = defaultValue(e.cornerType, CornerType$1.ROUNDED), this._vertexFormat = VertexFormat.clone( + defaultValue(e.vertexFormat, VertexFormat.DEFAULT) + ), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._workerName = "createPolylineVolumeGeometry"; + let i = 1 + t.length * Cartesian3.packedLength; + i += 1 + n.length * Cartesian2.packedLength, this.packedLength = i + Ellipsoid.packedLength + VertexFormat.packedLength + 2; +} +PolylineVolumeGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._shape; + for (o = s.length, t[n++] = o, i = 0; i < o; ++i, n += Cartesian2.packedLength) + Cartesian2.pack(s[i], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._cornerType, t[n] = e._granularity, t; +}; +const scratchEllipsoid$6 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$4 = new VertexFormat(), scratchOptions$8 = { + polylinePositions: void 0, + shapePositions: void 0, + ellipsoid: scratchEllipsoid$6, + vertexFormat: scratchVertexFormat$4, + cornerType: void 0, + granularity: void 0 +}; +PolylineVolumeGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + const s = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian2.packedLength) + s[i] = Cartesian2.unpack(e, t); + const c = Ellipsoid.unpack(e, t, scratchEllipsoid$6); + t += Ellipsoid.packedLength; + const l = VertexFormat.unpack( + e, + t, + scratchVertexFormat$4 + ); + t += VertexFormat.packedLength; + const d = e[t++], f = e[t]; + return defined(n) ? (n._positions = o, n._shape = s, n._ellipsoid = Ellipsoid.clone(c, n._ellipsoid), n._vertexFormat = VertexFormat.clone(l, n._vertexFormat), n._cornerType = d, n._granularity = f, n) : (scratchOptions$8.polylinePositions = o, scratchOptions$8.shapePositions = s, scratchOptions$8.cornerType = d, scratchOptions$8.granularity = f, new PolylineVolumeGeometry(scratchOptions$8)); +}; +const brScratch$1 = new BoundingRectangle(); +PolylineVolumeGeometry.createGeometry = function(e) { + const t = e._positions, n = arrayRemoveDuplicates( + t, + Cartesian3.equalsEpsilon + ); + let i = e._shape; + if (i = PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(i), n.length < 2 || i.length < 3) + return; + PolygonPipeline.computeWindingOrder2D(i) === WindingOrder$1.CLOCKWISE && i.reverse(); + const r = BoundingRectangle.fromPoints(i, brScratch$1), o = PolylineVolumeGeometryLibrary.computePositions( + n, + i, + r, + e, + !0 + ); + return computeAttributes$1( + o, + i, + r, + e._vertexFormat + ); +}; +function computeAttributes(e, t) { + const n = new GeometryAttributes(); + n.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: e + }); + const i = t.length, r = n.position.values.length / 3, s = e.length / 3 / i, c = IndexDatatype$1.createTypedArray( + r, + 2 * i * (s + 1) + ); + let l, d, f = 0; + l = 0; + let h = l * i; + for (d = 0; d < i - 1; d++) + c[f++] = d + h, c[f++] = d + h + 1; + for (c[f++] = i - 1 + h, c[f++] = h, l = s - 1, h = l * i, d = 0; d < i - 1; d++) + c[f++] = d + h, c[f++] = d + h + 1; + for (c[f++] = i - 1 + h, c[f++] = h, l = 0; l < s - 1; l++) { + const m = i * l, _ = m + i; + for (d = 0; d < i; d++) + c[f++] = d + m, c[f++] = d + _; + } + return new Geometry({ + attributes: n, + indices: IndexDatatype$1.createTypedArray(r, c), + boundingSphere: BoundingSphere.fromVertices(e), + primitiveType: PrimitiveType$1.LINES + }); +} +function PolylineVolumeOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.polylinePositions, n = e.shapePositions; + this._positions = t, this._shape = n, this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._cornerType = defaultValue(e.cornerType, CornerType$1.ROUNDED), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._workerName = "createPolylineVolumeOutlineGeometry"; + let i = 1 + t.length * Cartesian3.packedLength; + i += 1 + n.length * Cartesian2.packedLength, this.packedLength = i + Ellipsoid.packedLength + 2; +} +PolylineVolumeOutlineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._shape; + for (o = s.length, t[n++] = o, i = 0; i < o; ++i, n += Cartesian2.packedLength) + Cartesian2.pack(s[i], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._cornerType, t[n] = e._granularity, t; +}; +const scratchEllipsoid$5 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchOptions$7 = { + polylinePositions: void 0, + shapePositions: void 0, + ellipsoid: scratchEllipsoid$5, + height: void 0, + cornerType: void 0, + granularity: void 0 +}; +PolylineVolumeOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + const s = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian2.packedLength) + s[i] = Cartesian2.unpack(e, t); + const c = Ellipsoid.unpack(e, t, scratchEllipsoid$5); + t += Ellipsoid.packedLength; + const l = e[t++], d = e[t]; + return defined(n) ? (n._positions = o, n._shape = s, n._ellipsoid = Ellipsoid.clone(c, n._ellipsoid), n._cornerType = l, n._granularity = d, n) : (scratchOptions$7.polylinePositions = o, scratchOptions$7.shapePositions = s, scratchOptions$7.cornerType = l, scratchOptions$7.granularity = d, new PolylineVolumeOutlineGeometry(scratchOptions$7)); +}; +const brScratch = new BoundingRectangle(); +PolylineVolumeOutlineGeometry.createGeometry = function(e) { + const t = e._positions, n = arrayRemoveDuplicates( + t, + Cartesian3.equalsEpsilon + ); + let i = e._shape; + if (i = PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(i), n.length < 2 || i.length < 3) + return; + PolygonPipeline.computeWindingOrder2D(i) === WindingOrder$1.CLOCKWISE && i.reverse(); + const r = BoundingRectangle.fromPoints(i, brScratch), o = PolylineVolumeGeometryLibrary.computePositions( + n, + i, + r, + e, + !1 + ); + return computeAttributes(o, i); +}; +const scratchColor$8 = new Color(); +function PolylineVolumeGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.polylinePositions = void 0, this.shapePositions = void 0, this.cornerType = void 0, this.granularity = void 0; +} +function PolylineVolumeGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new PolylineVolumeGeometryOptions(e), + geometryPropertyName: "polylineVolume", + observedPropertyNames: ["availability", "polylineVolume"] + }), this._onEntityPropertyChanged( + e, + "polylineVolume", + e.polylineVolume, + void 0 + ); +} +defined(Object.create) && (PolylineVolumeGeometryUpdater.prototype = Object.create( + GeometryUpdater.prototype +), PolylineVolumeGeometryUpdater.prototype.constructor = PolylineVolumeGeometryUpdater); +PolylineVolumeGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e); + let i, r; + const o = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), s = this._distanceDisplayConditionProperty.getValue( + e + ), c = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + s + ); + if (this._materialProperty instanceof ColorMaterialProperty) { + let l; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (l = this._materialProperty.color.getValue(e, scratchColor$8)), defined(l) || (l = Color.WHITE), r = ColorGeometryInstanceAttribute.fromColor(l), i = { + show: o, + distanceDisplayCondition: c, + color: r + }; + } else + i = { + show: o, + distanceDisplayCondition: c + }; + return new GeometryInstance({ + id: t, + geometry: new PolylineVolumeGeometry(this._options), + attributes: i + }); +}; +PolylineVolumeGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$8 + ), r = this._distanceDisplayConditionProperty.getValue( + e + ); + return new GeometryInstance({ + id: t, + geometry: new PolylineVolumeOutlineGeometry(this._options), + attributes: { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ) + } + }); +}; +PolylineVolumeGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.positions) || !defined(t.shape) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +PolylineVolumeGeometryUpdater.prototype._isDynamic = function(e, t) { + return !t.positions.isConstant || // + !t.shape.isConstant || // + !Property.isConstant(t.granularity) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.cornerType); +}; +PolylineVolumeGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = t.granularity, i = t.cornerType, r = this._options, o = this._materialProperty instanceof ColorMaterialProperty; + r.vertexFormat = o ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, r.polylinePositions = t.positions.getValue( + Iso8601.MINIMUM_VALUE, + r.polylinePositions + ), r.shapePositions = t.shape.getValue( + Iso8601.MINIMUM_VALUE, + r.shape + ), r.granularity = defined(n) ? n.getValue(Iso8601.MINIMUM_VALUE) : void 0, r.cornerType = defined(i) ? i.getValue(Iso8601.MINIMUM_VALUE) : void 0; +}; +PolylineVolumeGeometryUpdater.DynamicGeometryUpdater = DynamicPolylineVolumeGeometryUpdater; +function DynamicPolylineVolumeGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicPolylineVolumeGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicPolylineVolumeGeometryUpdater.prototype.constructor = DynamicPolylineVolumeGeometryUpdater); +DynamicPolylineVolumeGeometryUpdater.prototype._isHidden = function(e, t, n) { + const i = this._options; + return !defined(i.polylinePositions) || !defined(i.shapePositions) || DynamicGeometryUpdater$1.prototype._isHidden.call( + this, + e, + t, + n + ); +}; +DynamicPolylineVolumeGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + i.polylinePositions = Property.getValueOrUndefined( + t.positions, + n, + i.polylinePositions + ), i.shapePositions = Property.getValueOrUndefined( + t.shape, + n + ), i.granularity = Property.getValueOrUndefined( + t.granularity, + n + ), i.cornerType = Property.getValueOrUndefined( + t.cornerType, + n + ); +}; +const positionScratch$2 = new Cartesian3(), normalScratch$2 = new Cartesian3(), tangentScratch = new Cartesian3(), bitangentScratch = new Cartesian3(), rectangleScratch$5 = new Rectangle(), stScratch = new Cartesian2(), bottomBoundingSphere = new BoundingSphere(), topBoundingSphere = new BoundingSphere(); +function createAttributes(e, t) { + const n = new Geometry({ + attributes: new GeometryAttributes(), + primitiveType: PrimitiveType$1.TRIANGLES + }); + return n.attributes.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: t.positions + }), e.normal && (n.attributes.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: t.normals + })), e.tangent && (n.attributes.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: t.tangents + })), e.bitangent && (n.attributes.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: t.bitangents + })), n; +} +function calculateAttributes(e, t, n, i) { + const r = e.length, o = t.normal ? new Float32Array(r) : void 0, s = t.tangent ? new Float32Array(r) : void 0, c = t.bitangent ? new Float32Array(r) : void 0; + let l = 0; + const d = bitangentScratch, f = tangentScratch; + let h = normalScratch$2; + if (t.normal || t.tangent || t.bitangent) + for (let p = 0; p < r; p += 3) { + const m = Cartesian3.fromArray(e, p, positionScratch$2), _ = l + 1, y = l + 2; + h = n.geodeticSurfaceNormal(m, h), (t.tangent || t.bitangent) && (Cartesian3.cross(Cartesian3.UNIT_Z, h, f), Matrix3.multiplyByVector(i, f, f), Cartesian3.normalize(f, f), t.bitangent && Cartesian3.normalize( + Cartesian3.cross(h, f, d), + d + )), t.normal && (o[l] = h.x, o[_] = h.y, o[y] = h.z), t.tangent && (s[l] = f.x, s[_] = f.y, s[y] = f.z), t.bitangent && (c[l] = d.x, c[_] = d.y, c[y] = d.z), l += 3; + } + return createAttributes(t, { + positions: e, + normals: o, + tangents: s, + bitangents: c + }); +} +const v1Scratch = new Cartesian3(), v2Scratch = new Cartesian3(); +function calculateAttributesWall(e, t, n) { + const i = e.length, r = t.normal ? new Float32Array(i) : void 0, o = t.tangent ? new Float32Array(i) : void 0, s = t.bitangent ? new Float32Array(i) : void 0; + let c = 0, l = 0, d = 0, f = !0, h = bitangentScratch, p = tangentScratch, m = normalScratch$2; + if (t.normal || t.tangent || t.bitangent) + for (let _ = 0; _ < i; _ += 6) { + const y = Cartesian3.fromArray(e, _, positionScratch$2), C = Cartesian3.fromArray(e, (_ + 6) % i, v1Scratch); + if (f) { + const T = Cartesian3.fromArray(e, (_ + 3) % i, v2Scratch); + Cartesian3.subtract(C, y, C), Cartesian3.subtract(T, y, T), m = Cartesian3.normalize(Cartesian3.cross(T, C, m), m), f = !1; + } + Cartesian3.equalsEpsilon(C, y, CesiumMath.EPSILON10) && (f = !0), (t.tangent || t.bitangent) && (h = n.geodeticSurfaceNormal(y, h), t.tangent && (p = Cartesian3.normalize( + Cartesian3.cross(h, m, p), + p + ))), t.normal && (r[c++] = m.x, r[c++] = m.y, r[c++] = m.z, r[c++] = m.x, r[c++] = m.y, r[c++] = m.z), t.tangent && (o[l++] = p.x, o[l++] = p.y, o[l++] = p.z, o[l++] = p.x, o[l++] = p.y, o[l++] = p.z), t.bitangent && (s[d++] = h.x, s[d++] = h.y, s[d++] = h.z, s[d++] = h.x, s[d++] = h.y, s[d++] = h.z); + } + return createAttributes(t, { + positions: e, + normals: r, + tangents: o, + bitangents: s + }); +} +function constructRectangle(e, t) { + const n = e._vertexFormat, i = e._ellipsoid, r = t.height, o = t.width, s = t.northCap, c = t.southCap; + let l = 0, d = r, f = r, h = 0; + s && (l = 1, f -= 1, h += 1), c && (d -= 1, f -= 1, h += 1), h += o * f; + const p = n.position ? new Float64Array(h * 3) : void 0, m = n.st ? new Float32Array(h * 2) : void 0; + let _ = 0, y = 0; + const C = positionScratch$2, T = stScratch; + let x = Number.MAX_VALUE, b = Number.MAX_VALUE, S = -Number.MAX_VALUE, E = -Number.MAX_VALUE; + for (let L = l; L < d; ++L) + for (let g = 0; g < o; ++g) + RectangleGeometryLibrary.computePosition( + t, + i, + n.st, + L, + g, + C, + T + ), p[_++] = C.x, p[_++] = C.y, p[_++] = C.z, n.st && (m[y++] = T.x, m[y++] = T.y, x = Math.min(x, T.x), b = Math.min(b, T.y), S = Math.max(S, T.x), E = Math.max(E, T.y)); + if (s && (RectangleGeometryLibrary.computePosition( + t, + i, + n.st, + 0, + 0, + C, + T + ), p[_++] = C.x, p[_++] = C.y, p[_++] = C.z, n.st && (m[y++] = T.x, m[y++] = T.y, x = T.x, b = T.y, S = T.x, E = T.y)), c && (RectangleGeometryLibrary.computePosition( + t, + i, + n.st, + r - 1, + 0, + C, + T + ), p[_++] = C.x, p[_++] = C.y, p[_] = C.z, n.st && (m[y++] = T.x, m[y] = T.y, x = Math.min(x, T.x), b = Math.min(b, T.y), S = Math.max(S, T.x), E = Math.max(E, T.y))), n.st && (x < 0 || b < 0 || S > 1 || E > 1)) + for (let L = 0; L < m.length; L += 2) + m[L] = (m[L] - x) / (S - x), m[L + 1] = (m[L + 1] - b) / (E - b); + const A = calculateAttributes( + p, + n, + i, + t.tangentRotationMatrix + ); + let D = 6 * (o - 1) * (f - 1); + s && (D += 3 * (o - 1)), c && (D += 3 * (o - 1)); + const P = IndexDatatype$1.createTypedArray(h, D); + let I = 0, M = 0, R; + for (R = 0; R < f - 1; ++R) { + for (let L = 0; L < o - 1; ++L) { + const g = I, w = g + o, O = w + 1, N = g + 1; + P[M++] = g, P[M++] = w, P[M++] = N, P[M++] = N, P[M++] = w, P[M++] = O, ++I; + } + ++I; + } + if (s || c) { + let L = h - 1; + const g = h - 1; + s && c && (L = h - 2); + let w, O; + if (I = 0, s) + for (R = 0; R < o - 1; R++) + w = I, O = w + 1, P[M++] = L, P[M++] = w, P[M++] = O, ++I; + if (c) + for (I = (f - 1) * o, R = 0; R < o - 1; R++) + w = I, O = w + 1, P[M++] = w, P[M++] = g, P[M++] = O, ++I; + } + return A.indices = P, n.st && (A.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: m + })), A; +} +function addWallPositions(e, t, n, i, r) { + return e[t++] = i[n], e[t++] = i[n + 1], e[t++] = i[n + 2], e[t++] = r[n], e[t++] = r[n + 1], e[t] = r[n + 2], e; +} +function addWallTextureCoordinates(e, t, n, i) { + return e[t++] = i[n], e[t++] = i[n + 1], e[t++] = i[n], e[t] = i[n + 1], e; +} +const scratchVertexFormat$3 = new VertexFormat(); +function constructExtrudedRectangle(e, t) { + const n = e._shadowVolume, i = e._offsetAttribute, r = e._vertexFormat, o = e._extrudedHeight, s = e._surfaceHeight, c = e._ellipsoid, l = t.height, d = t.width; + let f; + if (n) { + const re = VertexFormat.clone( + r, + scratchVertexFormat$3 + ); + re.normal = !0, e._vertexFormat = re; + } + const h = constructRectangle(e, t); + n && (e._vertexFormat = r); + let p = PolygonPipeline.scaleToGeodeticHeight( + h.attributes.position.values, + s, + c, + !1 + ); + p = new Float64Array(p); + let m = p.length; + const _ = m * 2, y = new Float64Array(_); + y.set(p); + const C = PolygonPipeline.scaleToGeodeticHeight( + h.attributes.position.values, + o, + c + ); + y.set(C, m), h.attributes.position.values = y; + const T = r.normal ? new Float32Array(_) : void 0, x = r.tangent ? new Float32Array(_) : void 0, b = r.bitangent ? new Float32Array(_) : void 0, S = r.st ? new Float32Array(_ / 3 * 2) : void 0; + let E, A; + if (r.normal) { + for (A = h.attributes.normal.values, T.set(A), f = 0; f < m; f++) + A[f] = -A[f]; + T.set(A, m), h.attributes.normal.values = T; + } + if (n) { + A = h.attributes.normal.values, r.normal || (h.attributes.normal = void 0); + const re = new Float32Array(_); + for (f = 0; f < m; f++) + A[f] = -A[f]; + re.set(A, m), h.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: re + }); + } + let D; + const P = defined(i); + if (P) { + const re = m / 3 * 2; + let be = new Uint8Array(re); + i === GeometryOffsetAttribute$1.TOP ? be = be.fill(1, 0, re / 2) : (D = i === GeometryOffsetAttribute$1.NONE ? 0 : 1, be = be.fill(D)), h.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: be + }); + } + if (r.tangent) { + const re = h.attributes.tangent.values; + for (x.set(re), f = 0; f < m; f++) + re[f] = -re[f]; + x.set(re, m), h.attributes.tangent.values = x; + } + if (r.bitangent) { + const re = h.attributes.bitangent.values; + b.set(re), b.set(re, m), h.attributes.bitangent.values = b; + } + r.st && (E = h.attributes.st.values, S.set(E), S.set(E, m / 3 * 2), h.attributes.st.values = S); + const I = h.indices, M = I.length, R = m / 3, L = IndexDatatype$1.createTypedArray( + _ / 3, + M * 2 + ); + for (L.set(I), f = 0; f < M; f += 3) + L[f + M] = I[f + 2] + R, L[f + 1 + M] = I[f + 1] + R, L[f + 2 + M] = I[f] + R; + h.indices = L; + const g = t.northCap, w = t.southCap; + let O = l, N = 2, F = 0, B = 4, V = 4; + g && (N -= 1, O -= 1, F += 1, B -= 2, V -= 1), w && (N -= 1, O -= 1, F += 1, B -= 2, V -= 1), F += N * d + 2 * O - B; + const U = (F + V) * 2; + let k = new Float64Array(U * 3); + const $ = n ? new Float32Array(U * 3) : void 0; + let G = P ? new Uint8Array(U) : void 0, q = r.st ? new Float32Array(U * 2) : void 0; + const z = i === GeometryOffsetAttribute$1.TOP; + P && !z && (D = i === GeometryOffsetAttribute$1.ALL ? 1 : 0, G = G.fill(D)); + let H = 0, Q = 0, ne = 0, K = 0; + const Z = d * O; + let ee; + for (f = 0; f < Z; f += d) + ee = f * 3, k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + f * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + if (w) { + const re = g ? Z + 1 : Z; + for (ee = re * 3, f = 0; f < 2; f++) + k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + re * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + } else + for (f = Z - d; f < Z; f++) + ee = f * 3, k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + f * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + for (f = Z - 1; f > 0; f -= d) + ee = f * 3, k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + f * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + if (g) { + const re = Z; + for (ee = re * 3, f = 0; f < 2; f++) + k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + re * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + } else + for (f = d - 1; f >= 0; f--) + ee = f * 3, k = addWallPositions( + k, + H, + ee, + p, + C + ), H += 6, r.st && (q = addWallTextureCoordinates( + q, + Q, + f * 2, + E + ), Q += 4), n && (ne += 3, $[ne++] = A[ee], $[ne++] = A[ee + 1], $[ne++] = A[ee + 2]), z && (G[K++] = 1, K += 1); + let oe = calculateAttributesWall(k, r, c); + r.st && (oe.attributes.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: q + })), n && (oe.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: $ + })), P && (oe.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: G + })); + const X = IndexDatatype$1.createTypedArray( + U, + F * 6 + ); + let fe, de, ce, ye; + m = k.length / 3; + let ge = 0; + for (f = 0; f < m - 1; f += 2) { + fe = f, ye = (fe + 2) % m; + const re = Cartesian3.fromArray(k, fe * 3, v1Scratch), be = Cartesian3.fromArray(k, ye * 3, v2Scratch); + Cartesian3.equalsEpsilon(re, be, CesiumMath.EPSILON10) || (de = (fe + 1) % m, ce = (de + 2) % m, X[ge++] = fe, X[ge++] = de, X[ge++] = ye, X[ge++] = ye, X[ge++] = de, X[ge++] = ce); + } + return oe.indices = X, oe = GeometryPipeline.combineInstances([ + new GeometryInstance({ + geometry: h + }), + new GeometryInstance({ + geometry: oe + }) + ]), oe[0]; +} +const scratchRectanglePoints = [ + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3() +], nwScratch = new Cartographic(), stNwScratch = new Cartographic(); +function computeRectangle(e, t, n, i, r) { + if (n === 0) + return Rectangle.clone(e, r); + const o = RectangleGeometryLibrary.computeOptions( + e, + t, + n, + 0, + rectangleScratch$5, + nwScratch + ), s = o.height, c = o.width, l = scratchRectanglePoints; + return RectangleGeometryLibrary.computePosition( + o, + i, + !1, + 0, + 0, + l[0] + ), RectangleGeometryLibrary.computePosition( + o, + i, + !1, + 0, + c - 1, + l[1] + ), RectangleGeometryLibrary.computePosition( + o, + i, + !1, + s - 1, + 0, + l[2] + ), RectangleGeometryLibrary.computePosition( + o, + i, + !1, + s - 1, + c - 1, + l[3] + ), Rectangle.fromCartesianArray(l, i, r); +} +function RectangleGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.rectangle, n = defaultValue(e.height, 0), i = defaultValue(e.extrudedHeight, n); + this._rectangle = Rectangle.clone(t), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._surfaceHeight = Math.max(n, i), this._rotation = defaultValue(e.rotation, 0), this._stRotation = defaultValue(e.stRotation, 0), this._vertexFormat = VertexFormat.clone( + defaultValue(e.vertexFormat, VertexFormat.DEFAULT) + ), this._extrudedHeight = Math.min(n, i), this._shadowVolume = defaultValue(e.shadowVolume, !1), this._workerName = "createRectangleGeometry", this._offsetAttribute = e.offsetAttribute, this._rotatedRectangle = void 0, this._textureCoordinateRotationPoints = void 0; +} +RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + 7; +RectangleGeometry.pack = function(e, t, n) { + return n = defaultValue(n, 0), Rectangle.pack(e._rectangle, t, n), n += Rectangle.packedLength, Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._granularity, t[n++] = e._surfaceHeight, t[n++] = e._rotation, t[n++] = e._stRotation, t[n++] = e._extrudedHeight, t[n++] = e._shadowVolume ? 1 : 0, t[n] = defaultValue(e._offsetAttribute, -1), t; +}; +const scratchRectangle$3 = new Rectangle(), scratchEllipsoid$4 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchOptions$6 = { + rectangle: scratchRectangle$3, + ellipsoid: scratchEllipsoid$4, + vertexFormat: scratchVertexFormat$3, + granularity: void 0, + height: void 0, + rotation: void 0, + stRotation: void 0, + extrudedHeight: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +RectangleGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = Rectangle.unpack(e, t, scratchRectangle$3); + t += Rectangle.packedLength; + const r = Ellipsoid.unpack(e, t, scratchEllipsoid$4); + t += Ellipsoid.packedLength; + const o = VertexFormat.unpack( + e, + t, + scratchVertexFormat$3 + ); + t += VertexFormat.packedLength; + const s = e[t++], c = e[t++], l = e[t++], d = e[t++], f = e[t++], h = e[t++] === 1, p = e[t]; + return defined(n) ? (n._rectangle = Rectangle.clone(i, n._rectangle), n._ellipsoid = Ellipsoid.clone(r, n._ellipsoid), n._vertexFormat = VertexFormat.clone(o, n._vertexFormat), n._granularity = s, n._surfaceHeight = c, n._rotation = l, n._stRotation = d, n._extrudedHeight = f, n._shadowVolume = h, n._offsetAttribute = p === -1 ? void 0 : p, n) : (scratchOptions$6.granularity = s, scratchOptions$6.height = c, scratchOptions$6.rotation = l, scratchOptions$6.stRotation = d, scratchOptions$6.extrudedHeight = f, scratchOptions$6.shadowVolume = h, scratchOptions$6.offsetAttribute = p === -1 ? void 0 : p, new RectangleGeometry(scratchOptions$6)); +}; +RectangleGeometry.computeRectangle = function(e, t) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.rectangle, i = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), r = defaultValue(e.ellipsoid, Ellipsoid.default), o = defaultValue(e.rotation, 0); + return computeRectangle(n, i, o, r, t); +}; +const tangentRotationMatrixScratch = new Matrix3(), quaternionScratch = new Quaternion(), centerScratch$2 = new Cartographic(); +RectangleGeometry.createGeometry = function(e) { + if (CesiumMath.equalsEpsilon( + e._rectangle.north, + e._rectangle.south, + CesiumMath.EPSILON10 + ) || CesiumMath.equalsEpsilon( + e._rectangle.east, + e._rectangle.west, + CesiumMath.EPSILON10 + )) + return; + let t = e._rectangle; + const n = e._ellipsoid, i = e._rotation, r = e._stRotation, o = e._vertexFormat, s = RectangleGeometryLibrary.computeOptions( + t, + e._granularity, + i, + r, + rectangleScratch$5, + nwScratch, + stNwScratch + ), c = tangentRotationMatrixScratch; + if (r !== 0 || i !== 0) { + const m = Rectangle.center(t, centerScratch$2), _ = n.geodeticSurfaceNormalCartographic(m, v1Scratch); + Quaternion.fromAxisAngle(_, -r, quaternionScratch), Matrix3.fromQuaternion(quaternionScratch, c); + } else + Matrix3.clone(Matrix3.IDENTITY, c); + const l = e._surfaceHeight, d = e._extrudedHeight, f = !CesiumMath.equalsEpsilon( + l, + d, + 0, + CesiumMath.EPSILON2 + ); + s.lonScalar = 1 / e._rectangle.width, s.latScalar = 1 / e._rectangle.height, s.tangentRotationMatrix = c; + let h, p; + if (t = e._rectangle, f) { + h = constructExtrudedRectangle(e, s); + const m = BoundingSphere.fromRectangle3D( + t, + n, + l, + topBoundingSphere + ), _ = BoundingSphere.fromRectangle3D( + t, + n, + d, + bottomBoundingSphere + ); + p = BoundingSphere.union(m, _); + } else { + if (h = constructRectangle(e, s), h.attributes.position.values = PolygonPipeline.scaleToGeodeticHeight( + h.attributes.position.values, + l, + n, + !1 + ), defined(e._offsetAttribute)) { + const m = h.attributes.position.values.length, _ = e._offsetAttribute === GeometryOffsetAttribute$1.NONE ? 0 : 1, y = new Uint8Array(m / 3).fill(_); + h.attributes.applyOffset = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: y + }); + } + p = BoundingSphere.fromRectangle3D( + t, + n, + l + ); + } + return o.position || delete h.attributes.position, new Geometry({ + attributes: h.attributes, + indices: h.indices, + primitiveType: h.primitiveType, + boundingSphere: p, + offsetAttribute: e._offsetAttribute + }); +}; +RectangleGeometry.createShadowVolume = function(e, t, n) { + const i = e._granularity, r = e._ellipsoid, o = t(i, r), s = n(i, r); + return new RectangleGeometry({ + rectangle: e._rectangle, + rotation: e._rotation, + ellipsoid: r, + stRotation: e._stRotation, + granularity: i, + extrudedHeight: s, + height: o, + vertexFormat: VertexFormat.POSITION_ONLY, + shadowVolume: !0 + }); +}; +const unrotatedTextureRectangleScratch = new Rectangle(), points2DScratch = [new Cartesian2(), new Cartesian2(), new Cartesian2()], rotation2DScratch = new Matrix2(), rectangleCenterScratch$1 = new Cartographic(); +function textureCoordinateRotationPoints(e) { + if (e._stRotation === 0) + return [0, 0, 0, 1, 1, 0]; + const t = Rectangle.clone( + e._rectangle, + unrotatedTextureRectangleScratch + ), n = e._granularity, i = e._ellipsoid, r = e._rotation - e._stRotation, o = computeRectangle( + t, + n, + r, + i, + unrotatedTextureRectangleScratch + ), s = points2DScratch; + s[0].x = o.west, s[0].y = o.south, s[1].x = o.west, s[1].y = o.north, s[2].x = o.east, s[2].y = o.south; + const c = e.rectangle, l = Matrix2.fromRotation( + e._stRotation, + rotation2DScratch + ), d = Rectangle.center( + c, + rectangleCenterScratch$1 + ); + for (let _ = 0; _ < 3; ++_) { + const y = s[_]; + y.x -= d.longitude, y.y -= d.latitude, Matrix2.multiplyByVector(l, y, y), y.x += d.longitude, y.y += d.latitude, y.x = (y.x - c.west) / c.width, y.y = (y.y - c.south) / c.height; + } + const f = s[0], h = s[1], p = s[2], m = new Array(6); + return Cartesian2.pack(f, m), Cartesian2.pack(h, m, 2), Cartesian2.pack(p, m, 4), m; +} +Object.defineProperties(RectangleGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + return defined(this._rotatedRectangle) || (this._rotatedRectangle = computeRectangle( + this._rectangle, + this._granularity, + this._rotation, + this._ellipsoid + )), this._rotatedRectangle; + } + }, + /** + * For remapping texture coordinates when rendering RectangleGeometries as GroundPrimitives. + * This version permits skew in textures by computing offsets directly in cartographic space and + * more accurately approximates rendering RectangleGeometries with height as standard Primitives. + * @see Geometry#_textureCoordinateRotationPoints + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return defined(this._textureCoordinateRotationPoints) || (this._textureCoordinateRotationPoints = textureCoordinateRotationPoints( + this + )), this._textureCoordinateRotationPoints; + } + } +}); +const scratchColor$7 = new Color(), defaultOffset$3 = Cartesian3.ZERO, offsetScratch$3 = new Cartesian3(), scratchRectangle$2 = new Rectangle(), scratchCenterRect = new Rectangle(), scratchCarto = new Cartographic(); +function RectangleGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.rectangle = void 0, this.height = void 0, this.extrudedHeight = void 0, this.granularity = void 0, this.stRotation = void 0, this.rotation = void 0, this.offsetAttribute = void 0; +} +function RectangleGeometryUpdater(e, t) { + GroundGeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new RectangleGeometryOptions(e), + geometryPropertyName: "rectangle", + observedPropertyNames: ["availability", "rectangle"] + }), this._onEntityPropertyChanged( + e, + "rectangle", + e.rectangle, + void 0 + ); +} +defined(Object.create) && (RectangleGeometryUpdater.prototype = Object.create( + GroundGeometryUpdater.prototype +), RectangleGeometryUpdater.prototype.constructor = RectangleGeometryUpdater); +RectangleGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + this._distanceDisplayConditionProperty.getValue(e) + ), + offset: void 0, + color: void 0 + }; + if (this._materialProperty instanceof ColorMaterialProperty) { + let r; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (r = this._materialProperty.color.getValue(e, scratchColor$7)), defined(r) || (r = Color.WHITE), i.color = ColorGeometryInstanceAttribute.fromColor(r); + } + return defined(this._options.offsetAttribute) && (i.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$3, + offsetScratch$3 + ) + )), new GeometryInstance({ + id: t, + geometry: new RectangleGeometry(this._options), + attributes: i + }); +}; +RectangleGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$7 + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), + offset: void 0 + }; + return defined(this._options.offsetAttribute) && (o.offset = OffsetGeometryInstanceAttribute.fromCartesian3( + Property.getValueOrDefault( + this._terrainOffsetProperty, + e, + defaultOffset$3, + offsetScratch$3 + ) + )), new GeometryInstance({ + id: t, + geometry: new RectangleOutlineGeometry(this._options), + attributes: o + }); +}; +RectangleGeometryUpdater.prototype._computeCenter = function(e, t) { + const n = Property.getValueOrUndefined( + this._entity.rectangle.coordinates, + e, + scratchCenterRect + ); + if (!defined(n)) + return; + const i = Rectangle.center(n, scratchCarto); + return Cartographic.toCartesian(i, Ellipsoid.default, t); +}; +RectangleGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.coordinates) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +RectangleGeometryUpdater.prototype._isDynamic = function(e, t) { + return !t.coordinates.isConstant || // + !Property.isConstant(t.height) || // + !Property.isConstant(t.extrudedHeight) || // + !Property.isConstant(t.granularity) || // + !Property.isConstant(t.stRotation) || // + !Property.isConstant(t.rotation) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.zIndex) || // + this._onTerrain && !Property.isConstant(this._materialProperty) && !(this._materialProperty instanceof ColorMaterialProperty); +}; +RectangleGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = this._materialProperty instanceof ColorMaterialProperty; + let i = Property.getValueOrUndefined( + t.height, + Iso8601.MINIMUM_VALUE + ); + const r = Property.getValueOrDefault( + t.heightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + let o = Property.getValueOrUndefined( + t.extrudedHeight, + Iso8601.MINIMUM_VALUE + ); + const s = Property.getValueOrDefault( + t.extrudedHeightReference, + Iso8601.MINIMUM_VALUE, + HeightReference$1.NONE + ); + defined(o) && !defined(i) && (i = 0); + const c = this._options; + c.vertexFormat = n ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, c.rectangle = t.coordinates.getValue( + Iso8601.MINIMUM_VALUE, + c.rectangle + ), c.granularity = Property.getValueOrUndefined( + t.granularity, + Iso8601.MINIMUM_VALUE + ), c.stRotation = Property.getValueOrUndefined( + t.stRotation, + Iso8601.MINIMUM_VALUE + ), c.rotation = Property.getValueOrUndefined( + t.rotation, + Iso8601.MINIMUM_VALUE + ), c.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + i, + r, + o, + s + ), c.height = GroundGeometryUpdater.getGeometryHeight( + i, + r + ), o = GroundGeometryUpdater.getGeometryExtrudedHeight( + o, + s + ), o === GroundGeometryUpdater.CLAMP_TO_GROUND && (o = ApproximateTerrainHeights.getMinimumMaximumHeights( + RectangleGeometry.computeRectangle(c, scratchRectangle$2) + ).minimumTerrainHeight), c.extrudedHeight = o; +}; +RectangleGeometryUpdater.DynamicGeometryUpdater = DynamicRectangleGeometryUpdater; +function DynamicRectangleGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicRectangleGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicRectangleGeometryUpdater.prototype.constructor = DynamicRectangleGeometryUpdater); +DynamicRectangleGeometryUpdater.prototype._isHidden = function(e, t, n) { + return !defined(this._options.rectangle) || DynamicGeometryUpdater$1.prototype._isHidden.call( + this, + e, + t, + n + ); +}; +DynamicRectangleGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + let r = Property.getValueOrUndefined(t.height, n); + const o = Property.getValueOrDefault( + t.heightReference, + n, + HeightReference$1.NONE + ); + let s = Property.getValueOrUndefined( + t.extrudedHeight, + n + ); + const c = Property.getValueOrDefault( + t.extrudedHeightReference, + n, + HeightReference$1.NONE + ); + defined(s) && !defined(r) && (r = 0), i.rectangle = Property.getValueOrUndefined( + t.coordinates, + n, + i.rectangle + ), i.granularity = Property.getValueOrUndefined( + t.granularity, + n + ), i.stRotation = Property.getValueOrUndefined(t.stRotation, n), i.rotation = Property.getValueOrUndefined(t.rotation, n), i.offsetAttribute = GroundGeometryUpdater.computeGeometryOffsetAttribute( + r, + o, + s, + c + ), i.height = GroundGeometryUpdater.getGeometryHeight( + r, + o + ), s = GroundGeometryUpdater.getGeometryExtrudedHeight( + s, + c + ), s === GroundGeometryUpdater.CLAMP_TO_GROUND && (s = ApproximateTerrainHeights.getMinimumMaximumHeights( + RectangleGeometry.computeRectangle(i, scratchRectangle$2) + ).minimumTerrainHeight), i.extrudedHeight = s; +}; +const WallGeometryLibrary = {}; +function latLonEquals(e, t) { + return CesiumMath.equalsEpsilon(e.latitude, t.latitude, CesiumMath.EPSILON10) && CesiumMath.equalsEpsilon(e.longitude, t.longitude, CesiumMath.EPSILON10); +} +const scratchCartographic1 = new Cartographic(), scratchCartographic2 = new Cartographic(); +function removeDuplicates$1(e, t, n, i) { + t = arrayRemoveDuplicates(t, Cartesian3.equalsEpsilon); + const r = t.length; + if (r < 2) + return; + const o = defined(i), s = defined(n), c = new Array(r), l = new Array(r), d = new Array(r), f = t[0]; + c[0] = f; + const h = e.cartesianToCartographic(f, scratchCartographic1); + s && (h.height = n[0]), l[0] = h.height, o ? d[0] = i[0] : d[0] = 0; + const p = l[0], m = d[0]; + let _ = p === m, y = 1; + for (let C = 1; C < r; ++C) { + const T = t[C], x = e.cartesianToCartographic(T, scratchCartographic2); + s && (x.height = n[C]), _ = _ && x.height === 0, latLonEquals(h, x) ? h.height < x.height && (l[y - 1] = x.height) : (c[y] = T, l[y] = x.height, o ? d[y] = i[C] : d[y] = 0, _ = _ && l[y] === d[y], Cartographic.clone(x, h), ++y); + } + if (!(_ || y < 2)) + return c.length = y, l.length = y, d.length = y, { + positions: c, + topHeights: l, + bottomHeights: d + }; +} +const positionsArrayScratch = new Array(2), heightsArrayScratch = new Array(2), generateArcOptionsScratch$1 = { + positions: void 0, + height: void 0, + granularity: void 0, + ellipsoid: void 0 +}; +WallGeometryLibrary.computePositions = function(e, t, n, i, r, o) { + const s = removeDuplicates$1( + e, + t, + n, + i + ); + if (!defined(s)) + return; + t = s.positions, n = s.topHeights, i = s.bottomHeights; + const c = t.length, l = c - 2; + let d, f; + const h = CesiumMath.chordLength( + r, + e.maximumRadius + ), p = generateArcOptionsScratch$1; + if (p.minDistance = h, p.ellipsoid = e, o) { + let m = 0, _; + for (_ = 0; _ < c - 1; _++) + m += PolylinePipeline.numberOfPoints( + t[_], + t[_ + 1], + h + ) + 1; + d = new Float64Array(m * 3), f = new Float64Array(m * 3); + const y = positionsArrayScratch, C = heightsArrayScratch; + p.positions = y, p.height = C; + let T = 0; + for (_ = 0; _ < c - 1; _++) { + y[0] = t[_], y[1] = t[_ + 1], C[0] = n[_], C[1] = n[_ + 1]; + const x = PolylinePipeline.generateArc(p); + d.set(x, T), C[0] = i[_], C[1] = i[_ + 1], f.set( + PolylinePipeline.generateArc(p), + T + ), T += x.length; + } + } else + p.positions = t, p.height = n, d = new Float64Array( + PolylinePipeline.generateArc(p) + ), p.height = i, f = new Float64Array( + PolylinePipeline.generateArc(p) + ); + return { + bottomPositions: f, + topPositions: d, + numCorners: l + }; +}; +const scratchCartesian3Position1$1 = new Cartesian3(), scratchCartesian3Position2$1 = new Cartesian3(), scratchCartesian3Position4 = new Cartesian3(), scratchCartesian3Position5 = new Cartesian3(), scratchBitangent = new Cartesian3(), scratchTangent = new Cartesian3(), scratchNormal$2 = new Cartesian3(); +function WallGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.maximumHeights, i = e.minimumHeights, r = defaultValue(e.vertexFormat, VertexFormat.DEFAULT), o = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), s = defaultValue(e.ellipsoid, Ellipsoid.default); + this._positions = t, this._minimumHeights = i, this._maximumHeights = n, this._vertexFormat = VertexFormat.clone(r), this._granularity = o, this._ellipsoid = Ellipsoid.clone(s), this._workerName = "createWallGeometry"; + let c = 1 + t.length * Cartesian3.packedLength + 2; + defined(i) && (c += i.length), defined(n) && (c += n.length), this.packedLength = c + Ellipsoid.packedLength + VertexFormat.packedLength + 1; +} +WallGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._minimumHeights; + if (o = defined(s) ? s.length : 0, t[n++] = o, defined(s)) + for (i = 0; i < o; ++i) + t[n++] = s[i]; + const c = e._maximumHeights; + if (o = defined(c) ? c.length : 0, t[n++] = o, defined(c)) + for (i = 0; i < o; ++i) + t[n++] = c[i]; + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n] = e._granularity, t; +}; +const scratchEllipsoid$3 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$2 = new VertexFormat(), scratchOptions$5 = { + positions: void 0, + minimumHeights: void 0, + maximumHeights: void 0, + ellipsoid: scratchEllipsoid$3, + vertexFormat: scratchVertexFormat$2, + granularity: void 0 +}; +WallGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + let s; + if (r > 0) + for (s = new Array(r), i = 0; i < r; ++i) + s[i] = e[t++]; + r = e[t++]; + let c; + if (r > 0) + for (c = new Array(r), i = 0; i < r; ++i) + c[i] = e[t++]; + const l = Ellipsoid.unpack(e, t, scratchEllipsoid$3); + t += Ellipsoid.packedLength; + const d = VertexFormat.unpack( + e, + t, + scratchVertexFormat$2 + ); + t += VertexFormat.packedLength; + const f = e[t]; + return defined(n) ? (n._positions = o, n._minimumHeights = s, n._maximumHeights = c, n._ellipsoid = Ellipsoid.clone(l, n._ellipsoid), n._vertexFormat = VertexFormat.clone(d, n._vertexFormat), n._granularity = f, n) : (scratchOptions$5.positions = o, scratchOptions$5.minimumHeights = s, scratchOptions$5.maximumHeights = c, scratchOptions$5.granularity = f, new WallGeometry(scratchOptions$5)); +}; +WallGeometry.fromConstantHeights = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions; + let n, i; + const r = e.minimumHeight, o = e.maximumHeight, s = defined(r), c = defined(o); + if (s || c) { + const d = t.length; + n = s ? new Array(d) : void 0, i = c ? new Array(d) : void 0; + for (let f = 0; f < d; ++f) + s && (n[f] = r), c && (i[f] = o); + } + const l = { + positions: t, + maximumHeights: i, + minimumHeights: n, + ellipsoid: e.ellipsoid, + vertexFormat: e.vertexFormat + }; + return new WallGeometry(l); +}; +WallGeometry.createGeometry = function(e) { + const t = e._positions, n = e._minimumHeights, i = e._maximumHeights, r = e._vertexFormat, o = e._granularity, s = e._ellipsoid, c = WallGeometryLibrary.computePositions( + s, + t, + i, + n, + o, + !0 + ); + if (!defined(c)) + return; + const l = c.bottomPositions, d = c.topPositions, f = c.numCorners; + let h = d.length, p = h * 2; + const m = r.position ? new Float64Array(p) : void 0, _ = r.normal ? new Float32Array(p) : void 0, y = r.tangent ? new Float32Array(p) : void 0, C = r.bitangent ? new Float32Array(p) : void 0, T = r.st ? new Float32Array(p / 3 * 2) : void 0; + let x = 0, b = 0, S = 0, E = 0, A = 0, D = scratchNormal$2, P = scratchTangent, I = scratchBitangent, M = !0; + h /= 3; + let R, L = 0; + const g = 1 / (h - f - 1); + for (R = 0; R < h; ++R) { + const B = R * 3, V = Cartesian3.fromArray( + d, + B, + scratchCartesian3Position1$1 + ), U = Cartesian3.fromArray( + l, + B, + scratchCartesian3Position2$1 + ); + if (r.position && (m[x++] = U.x, m[x++] = U.y, m[x++] = U.z, m[x++] = V.x, m[x++] = V.y, m[x++] = V.z), r.st && (T[A++] = L, T[A++] = 0, T[A++] = L, T[A++] = 1), r.normal || r.tangent || r.bitangent) { + let k = Cartesian3.clone( + Cartesian3.ZERO, + scratchCartesian3Position5 + ); + const $ = Cartesian3.subtract( + V, + s.geodeticSurfaceNormal( + V, + scratchCartesian3Position2$1 + ), + scratchCartesian3Position2$1 + ); + if (R + 1 < h && (k = Cartesian3.fromArray( + d, + B + 3, + scratchCartesian3Position5 + )), M) { + const G = Cartesian3.subtract( + k, + V, + scratchCartesian3Position4 + ), q = Cartesian3.subtract( + $, + V, + scratchCartesian3Position1$1 + ); + D = Cartesian3.normalize( + Cartesian3.cross(q, G, D), + D + ), M = !1; + } + Cartesian3.equalsEpsilon(V, k, CesiumMath.EPSILON10) ? M = !0 : (L += g, r.tangent && (P = Cartesian3.normalize( + Cartesian3.subtract(k, V, P), + P + )), r.bitangent && (I = Cartesian3.normalize( + Cartesian3.cross(D, P, I), + I + ))), r.normal && (_[b++] = D.x, _[b++] = D.y, _[b++] = D.z, _[b++] = D.x, _[b++] = D.y, _[b++] = D.z), r.tangent && (y[E++] = P.x, y[E++] = P.y, y[E++] = P.z, y[E++] = P.x, y[E++] = P.y, y[E++] = P.z), r.bitangent && (C[S++] = I.x, C[S++] = I.y, C[S++] = I.z, C[S++] = I.x, C[S++] = I.y, C[S++] = I.z); + } + } + const w = new GeometryAttributes(); + r.position && (w.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: m + })), r.normal && (w.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: _ + })), r.tangent && (w.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: y + })), r.bitangent && (w.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: C + })), r.st && (w.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: T + })); + const O = p / 3; + p -= 6 * (f + 1); + const N = IndexDatatype$1.createTypedArray(O, p); + let F = 0; + for (R = 0; R < O - 2; R += 2) { + const B = R, V = R + 2, U = Cartesian3.fromArray( + m, + B * 3, + scratchCartesian3Position1$1 + ), k = Cartesian3.fromArray( + m, + V * 3, + scratchCartesian3Position2$1 + ); + if (Cartesian3.equalsEpsilon(U, k, CesiumMath.EPSILON10)) + continue; + const $ = R + 1, G = R + 3; + N[F++] = $, N[F++] = B, N[F++] = G, N[F++] = G, N[F++] = B, N[F++] = V; + } + return new Geometry({ + attributes: w, + indices: N, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: new BoundingSphere.fromVertices(m) + }); +}; +const scratchCartesian3Position1 = new Cartesian3(), scratchCartesian3Position2 = new Cartesian3(); +function WallOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.maximumHeights, i = e.minimumHeights, r = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), o = defaultValue(e.ellipsoid, Ellipsoid.default); + this._positions = t, this._minimumHeights = i, this._maximumHeights = n, this._granularity = r, this._ellipsoid = Ellipsoid.clone(o), this._workerName = "createWallOutlineGeometry"; + let s = 1 + t.length * Cartesian3.packedLength + 2; + defined(i) && (s += i.length), defined(n) && (s += n.length), this.packedLength = s + Ellipsoid.packedLength + 1; +} +WallOutlineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._minimumHeights; + if (o = defined(s) ? s.length : 0, t[n++] = o, defined(s)) + for (i = 0; i < o; ++i) + t[n++] = s[i]; + const c = e._maximumHeights; + if (o = defined(c) ? c.length : 0, t[n++] = o, defined(c)) + for (i = 0; i < o; ++i) + t[n++] = c[i]; + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n] = e._granularity, t; +}; +const scratchEllipsoid$2 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchOptions$4 = { + positions: void 0, + minimumHeights: void 0, + maximumHeights: void 0, + ellipsoid: scratchEllipsoid$2, + granularity: void 0 +}; +WallOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + let s; + if (r > 0) + for (s = new Array(r), i = 0; i < r; ++i) + s[i] = e[t++]; + r = e[t++]; + let c; + if (r > 0) + for (c = new Array(r), i = 0; i < r; ++i) + c[i] = e[t++]; + const l = Ellipsoid.unpack(e, t, scratchEllipsoid$2); + t += Ellipsoid.packedLength; + const d = e[t]; + return defined(n) ? (n._positions = o, n._minimumHeights = s, n._maximumHeights = c, n._ellipsoid = Ellipsoid.clone(l, n._ellipsoid), n._granularity = d, n) : (scratchOptions$4.positions = o, scratchOptions$4.minimumHeights = s, scratchOptions$4.maximumHeights = c, scratchOptions$4.granularity = d, new WallOutlineGeometry(scratchOptions$4)); +}; +WallOutlineGeometry.fromConstantHeights = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions; + let n, i; + const r = e.minimumHeight, o = e.maximumHeight, s = defined(r), c = defined(o); + if (s || c) { + const d = t.length; + n = s ? new Array(d) : void 0, i = c ? new Array(d) : void 0; + for (let f = 0; f < d; ++f) + s && (n[f] = r), c && (i[f] = o); + } + const l = { + positions: t, + maximumHeights: i, + minimumHeights: n, + ellipsoid: e.ellipsoid + }; + return new WallOutlineGeometry(l); +}; +WallOutlineGeometry.createGeometry = function(e) { + const t = e._positions, n = e._minimumHeights, i = e._maximumHeights, r = e._granularity, o = e._ellipsoid, s = WallGeometryLibrary.computePositions( + o, + t, + i, + n, + r, + !1 + ); + if (!defined(s)) + return; + const c = s.bottomPositions, l = s.topPositions; + let d = l.length, f = d * 2; + const h = new Float64Array(f); + let p = 0; + d /= 3; + let m; + for (m = 0; m < d; ++m) { + const x = m * 3, b = Cartesian3.fromArray( + l, + x, + scratchCartesian3Position1 + ), S = Cartesian3.fromArray( + c, + x, + scratchCartesian3Position2 + ); + h[p++] = S.x, h[p++] = S.y, h[p++] = S.z, h[p++] = b.x, h[p++] = b.y, h[p++] = b.z; + } + const _ = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: h + }) + }), y = f / 3; + f = 2 * y - 4 + y; + const C = IndexDatatype$1.createTypedArray(y, f); + let T = 0; + for (m = 0; m < y - 2; m += 2) { + const x = m, b = m + 2, S = Cartesian3.fromArray( + h, + x * 3, + scratchCartesian3Position1 + ), E = Cartesian3.fromArray( + h, + b * 3, + scratchCartesian3Position2 + ); + if (Cartesian3.equalsEpsilon(S, E, CesiumMath.EPSILON10)) + continue; + const A = m + 1, D = m + 3; + C[T++] = A, C[T++] = x, C[T++] = A, C[T++] = D, C[T++] = x, C[T++] = b; + } + return C[T++] = y - 2, C[T++] = y - 1, new Geometry({ + attributes: _, + indices: C, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: new BoundingSphere.fromVertices(h) + }); +}; +const scratchColor$6 = new Color(); +function WallGeometryOptions(e) { + this.id = e, this.vertexFormat = void 0, this.positions = void 0, this.minimumHeights = void 0, this.maximumHeights = void 0, this.granularity = void 0; +} +function WallGeometryUpdater(e, t) { + GeometryUpdater.call(this, { + entity: e, + scene: t, + geometryOptions: new WallGeometryOptions(e), + geometryPropertyName: "wall", + observedPropertyNames: ["availability", "wall"] + }), this._onEntityPropertyChanged(e, "wall", e.wall, void 0); +} +defined(Object.create) && (WallGeometryUpdater.prototype = Object.create(GeometryUpdater.prototype), WallGeometryUpdater.prototype.constructor = WallGeometryUpdater); +WallGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e); + let i, r; + const o = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._fillProperty.getValue(e) + ), s = this._distanceDisplayConditionProperty.getValue( + e + ), c = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + s + ); + if (this._materialProperty instanceof ColorMaterialProperty) { + let l; + defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (l = this._materialProperty.color.getValue(e, scratchColor$6)), defined(l) || (l = Color.WHITE), r = ColorGeometryInstanceAttribute.fromColor(l), i = { + show: o, + distanceDisplayCondition: c, + color: r + }; + } else + i = { + show: o, + distanceDisplayCondition: c + }; + return new GeometryInstance({ + id: t, + geometry: new WallGeometry(this._options), + attributes: i + }); +}; +WallGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = Property.getValueOrDefault( + this._outlineColorProperty, + e, + Color.BLACK, + scratchColor$6 + ), r = this._distanceDisplayConditionProperty.getValue( + e + ); + return new GeometryInstance({ + id: t, + geometry: new WallOutlineGeometry(this._options), + attributes: { + show: new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) && this._showOutlineProperty.getValue(e) + ), + color: ColorGeometryInstanceAttribute.fromColor(i), + distanceDisplayCondition: DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ) + } + }); +}; +WallGeometryUpdater.prototype._isHidden = function(e, t) { + return !defined(t.positions) || GeometryUpdater.prototype._isHidden.call(this, e, t); +}; +WallGeometryUpdater.prototype._getIsClosed = function(e) { + return !1; +}; +WallGeometryUpdater.prototype._isDynamic = function(e, t) { + return !t.positions.isConstant || // + !Property.isConstant(t.minimumHeights) || // + !Property.isConstant(t.maximumHeights) || // + !Property.isConstant(t.outlineWidth) || // + !Property.isConstant(t.granularity); +}; +WallGeometryUpdater.prototype._setStaticOptions = function(e, t) { + const n = t.minimumHeights, i = t.maximumHeights, r = t.granularity, o = this._materialProperty instanceof ColorMaterialProperty, s = this._options; + s.vertexFormat = o ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat, s.positions = t.positions.getValue( + Iso8601.MINIMUM_VALUE, + s.positions + ), s.minimumHeights = defined(n) ? n.getValue(Iso8601.MINIMUM_VALUE, s.minimumHeights) : void 0, s.maximumHeights = defined(i) ? i.getValue(Iso8601.MINIMUM_VALUE, s.maximumHeights) : void 0, s.granularity = defined(r) ? r.getValue(Iso8601.MINIMUM_VALUE) : void 0; +}; +WallGeometryUpdater.DynamicGeometryUpdater = DynamicWallGeometryUpdater; +function DynamicWallGeometryUpdater(e, t, n) { + DynamicGeometryUpdater$1.call( + this, + e, + t, + n + ); +} +defined(Object.create) && (DynamicWallGeometryUpdater.prototype = Object.create( + DynamicGeometryUpdater$1.prototype +), DynamicWallGeometryUpdater.prototype.constructor = DynamicWallGeometryUpdater); +DynamicWallGeometryUpdater.prototype._isHidden = function(e, t, n) { + return !defined(this._options.positions) || DynamicGeometryUpdater$1.prototype._isHidden.call(this, e, t, n); +}; +DynamicWallGeometryUpdater.prototype._setOptions = function(e, t, n) { + const i = this._options; + i.positions = Property.getValueOrUndefined( + t.positions, + n, + i.positions + ), i.minimumHeights = Property.getValueOrUndefined( + t.minimumHeights, + n, + i.minimumHeights + ), i.maximumHeights = Property.getValueOrUndefined( + t.maximumHeights, + n, + i.maximumHeights + ), i.granularity = Property.getValueOrUndefined(t.granularity, n); +}; +const geometryUpdaters = [ + BoxGeometryUpdater, + CylinderGeometryUpdater, + CorridorGeometryUpdater, + EllipseGeometryUpdater, + EllipsoidGeometryUpdater, + PlaneGeometryUpdater, + PolygonGeometryUpdater, + PolylineVolumeGeometryUpdater, + RectangleGeometryUpdater, + WallGeometryUpdater +]; +function GeometryUpdaterSet(e, t) { + this.entity = e, this.scene = t; + const n = new Array(geometryUpdaters.length), i = new Event(), r = new EventHelper(); + for (let o = 0; o < n.length; o++) { + const s = new geometryUpdaters[o](e, t); + r.add(s.geometryChanged, (c) => { + i.raiseEvent(c); + }), n[o] = s; + } + this.updaters = n, this.geometryChanged = i, this.eventHelper = r, this._removeEntitySubscription = e.definitionChanged.addEventListener( + GeometryUpdaterSet.prototype._onEntityPropertyChanged, + this + ); +} +GeometryUpdaterSet.prototype._onEntityPropertyChanged = function(e, t, n, i) { + const r = this.updaters; + for (let o = 0; o < r.length; o++) + r[o]._onEntityPropertyChanged( + e, + t, + n, + i + ); +}; +GeometryUpdaterSet.prototype.forEach = function(e) { + const t = this.updaters; + for (let n = 0; n < t.length; n++) + e(t[n]); +}; +GeometryUpdaterSet.prototype.destroy = function() { + this.eventHelper.removeAll(); + const e = this.updaters; + for (let t = 0; t < e.length; t++) + e[t].destroy(); + this._removeEntitySubscription(), destroyObject(this); +}; +GeometryUpdaterSet.registerUpdater = function(e) { + geometryUpdaters.includes(e) || geometryUpdaters.push(e); +}; +GeometryUpdaterSet.unregisterUpdater = function(e) { + if (geometryUpdaters.includes(e)) { + const t = geometryUpdaters.indexOf(e); + geometryUpdaters.splice(t, 1); + } +}; +const colorScratch$6 = new Color(), distanceDisplayConditionScratch$7 = new DistanceDisplayCondition(), defaultDistanceDisplayCondition$6 = new DistanceDisplayCondition(), defaultOffset$2 = Cartesian3.ZERO, offsetScratch$2 = new Cartesian3(); +function Batch$5(e, t, n, i, r, o, s) { + this.translucent = t, this.appearanceType = n, this.depthFailAppearanceType = i, this.depthFailMaterialProperty = r, this.depthFailMaterial = void 0, this.closed = o, this.shadows = s, this.primitives = e, this.createPrimitive = !1, this.waitingOnCreate = !1, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.updaters = new AssociativeArray(), this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(), this.itemsToRemove = [], this.invalidated = !1; + let c; + defined(r) && (c = r.definitionChanged.addEventListener( + Batch$5.prototype.onMaterialChanged, + this + )), this.removeMaterialSubscription = c; +} +Batch$5.prototype.onMaterialChanged = function() { + this.invalidated = !0; +}; +Batch$5.prototype.isMaterial = function(e) { + const t = this.depthFailMaterialProperty, n = e.depthFailMaterialProperty; + return n === t ? !0 : defined(t) ? t.equals(n) : !1; +}; +Batch$5.prototype.add = function(e, t) { + const n = e.id; + if (this.createPrimitive = !0, this.geometry.set(n, t), this.updaters.set(n, e), !e.hasConstantFill || !e.fillMaterialProperty.isConstant || !Property.isConstant(e.distanceDisplayConditionProperty) || !Property.isConstant(e.terrainOffsetProperty)) + this.updatersWithAttributes.set(n, e); + else { + const i = this; + this.subscriptions.set( + n, + e.entity.definitionChanged.addEventListener(function(r, o, s, c) { + o === "isShowing" && i.showsUpdated.set(e.id, e); + }) + ); + } +}; +Batch$5.prototype.remove = function(e) { + const t = e.id; + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.updatersWithAttributes.remove(t); + const n = this.subscriptions.get(t); + return defined(n) && (n(), this.subscriptions.remove(t), this.showsUpdated.remove(t)), !0; + } + return !1; +}; +Batch$5.prototype.update = function(e) { + let t = !0, n = 0, i = this.primitive; + const r = this.primitives; + let o; + if (this.createPrimitive) { + const s = this.geometry.values; + if (s.length > 0) { + defined(i) && (defined(this.oldPrimitive) ? r.remove(i) : this.oldPrimitive = i); + let l; + defined(this.depthFailAppearanceType) && (defined(this.depthFailMaterialProperty) && (this.depthFailMaterial = MaterialProperty.getValue( + e, + this.depthFailMaterialProperty, + this.depthFailMaterial + )), l = new this.depthFailAppearanceType({ + material: this.depthFailMaterial, + translucent: this.translucent, + closed: this.closed + })), i = new Primitive$3({ + show: !1, + asynchronous: !0, + geometryInstances: s.slice(), + appearance: new this.appearanceType({ + translucent: this.translucent, + closed: this.closed + }), + depthFailAppearance: l, + shadows: this.shadows + }), r.add(i), t = !1; + } else { + defined(i) && (r.remove(i), i = void 0); + const l = this.oldPrimitive; + defined(l) && (r.remove(l), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = i, this.createPrimitive = !1, this.waitingOnCreate = !0; + } else if (defined(i) && i.ready) { + i.show = !0, defined(this.oldPrimitive) && (r.remove(this.oldPrimitive), this.oldPrimitive = void 0), defined(this.depthFailAppearanceType) && !(this.depthFailMaterialProperty instanceof ColorMaterialProperty) && (this.depthFailMaterial = MaterialProperty.getValue( + e, + this.depthFailMaterialProperty, + this.depthFailMaterial + ), this.primitive.depthFailAppearance.material = this.depthFailMaterial); + const s = this.updatersWithAttributes.values, c = s.length, l = this.waitingOnCreate; + for (o = 0; o < c; o++) { + const d = s[o], f = this.geometry.get(d.id); + let h = this.attributes.get(f.id.id); + if (defined(h) || (h = i.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)), !d.fillMaterialProperty.isConstant || l) { + const C = d.fillMaterialProperty.color, T = Property.getValueOrDefault( + C, + e, + Color.WHITE, + colorScratch$6 + ); + Color.equals(h._lastColor, T) || (h._lastColor = Color.clone( + T, + h._lastColor + ), h.color = ColorGeometryInstanceAttribute.toValue( + T, + h.color + ), (this.translucent && h.color[3] === 255 || !this.translucent && h.color[3] !== 255) && (this.itemsToRemove[n++] = d)); + } + if (defined(this.depthFailAppearanceType) && d.depthFailMaterialProperty instanceof ColorMaterialProperty && (!d.depthFailMaterialProperty.isConstant || l)) { + const C = d.depthFailMaterialProperty.color, T = Property.getValueOrDefault( + C, + e, + Color.WHITE, + colorScratch$6 + ); + Color.equals(h._lastDepthFailColor, T) || (h._lastDepthFailColor = Color.clone( + T, + h._lastDepthFailColor + ), h.depthFailColor = ColorGeometryInstanceAttribute.toValue( + T, + h.depthFailColor + )); + } + const p = d.entity.isShowing && (d.hasConstantFill || d.isFilled(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = d.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const C = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition$6, + distanceDisplayConditionScratch$7 + ); + DistanceDisplayCondition.equals( + C, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + C, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + C, + h.distanceDisplayCondition + )); + } + const y = d.terrainOffsetProperty; + if (!Property.isConstant(y)) { + const C = Property.getValueOrDefault( + y, + e, + defaultOffset$2, + offsetScratch$2 + ); + Cartesian3.equals(C, h._lastOffset) || (h._lastOffset = Cartesian3.clone( + C, + h._lastOffset + ), h.offset = OffsetGeometryInstanceAttribute.toValue( + C, + h.offset + )); + } + } + this.updateShows(i), this.waitingOnCreate = !1; + } else defined(i) && !i.ready && (t = !1); + return this.itemsToRemove.length = n, t; +}; +Batch$5.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = this.geometry.get(r.id); + let s = this.attributes.get(o.id.id); + defined(s) || (s = e.getGeometryInstanceAttributes(o.id), this.attributes.set(o.id.id, s)); + const c = r.entity.isShowing, l = s.show[0] === 1; + c !== l && (s.show = ShowGeometryInstanceAttribute.toValue( + c, + s.show + ), o.attributes.show.value[0] = s.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch$5.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch$5.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getGeometryInstanceAttributes(e.entity); + return !defined(i) || !defined(i.boundingSphere) || // + defined(i.show) && i.show[0] === 0 ? BoundingSphereState$1.FAILED : (i.boundingSphere.clone(t), BoundingSphereState$1.DONE); +}; +Batch$5.prototype.destroy = function() { + const e = this.primitive, t = this.primitives; + defined(e) && t.remove(e); + const n = this.oldPrimitive; + defined(n) && t.remove(n), defined(this.removeMaterialSubscription) && this.removeMaterialSubscription(); +}; +function StaticGeometryColorBatch(e, t, n, i, r) { + this._solidItems = [], this._translucentItems = [], this._primitives = e, this._appearanceType = t, this._depthFailAppearanceType = n, this._closed = i, this._shadows = r; +} +StaticGeometryColorBatch.prototype.add = function(e, t) { + let n, i; + const r = t.createFillGeometryInstance(e); + r.attributes.color.value[3] === 255 ? (n = this._solidItems, i = !1) : (n = this._translucentItems, i = !0); + const o = n.length; + for (let c = 0; c < o; c++) { + const l = n[c]; + if (l.isMaterial(t)) { + l.add(t, r); + return; + } + } + const s = new Batch$5( + this._primitives, + i, + this._appearanceType, + this._depthFailAppearanceType, + t.depthFailMaterialProperty, + this._closed, + this._shadows + ); + s.add(t, r), n.push(s); +}; +function removeItem(e, t) { + const n = e.length; + for (let i = n - 1; i >= 0; i--) { + const r = e[i]; + if (r.remove(t)) + return r.updaters.length === 0 && (e.splice(i, 1), r.destroy()), !0; + } + return !1; +} +StaticGeometryColorBatch.prototype.remove = function(e) { + removeItem(this._solidItems, e) || removeItem(this._translucentItems, e); +}; +function moveItems(e, t, n) { + let i = !1; + const r = t.length; + for (let o = 0; o < r; ++o) { + const s = t[o], c = s.itemsToRemove, l = c.length; + if (l > 0) + for (o = 0; o < l; o++) { + const d = c[o]; + s.remove(d), e.add(n, d), i = !0; + } + } + return i; +} +function updateItems(e, t, n, i) { + let r = t.length, o; + for (o = r - 1; o >= 0; o--) { + const s = t[o]; + if (s.invalidated) { + t.splice(o, 1); + const c = s.updaters.values, l = c.length; + for (let d = 0; d < l; d++) + e.add(n, c[d]); + s.destroy(); + } + } + for (r = t.length, o = 0; o < r; ++o) + i = t[o].update(n) && i; + return i; +} +StaticGeometryColorBatch.prototype.update = function(e) { + let t = updateItems(this, this._solidItems, e, !0); + t = updateItems(this, this._translucentItems, e, t) && t; + const n = moveItems(this, this._solidItems, e), i = moveItems(this, this._translucentItems, e); + return (n || i) && (t = updateItems(this, this._solidItems, e, t) && t, t = updateItems(this, this._translucentItems, e, t) && t), t; +}; +function getBoundingSphere(e, t, n) { + const i = e.length; + for (let r = 0; r < i; r++) { + const o = e[r]; + if (o.contains(t)) + return o.getBoundingSphere(t, n); + } + return BoundingSphereState$1.FAILED; +} +StaticGeometryColorBatch.prototype.getBoundingSphere = function(e, t) { + const n = getBoundingSphere(this._solidItems, e, t); + return n === BoundingSphereState$1.FAILED ? getBoundingSphere(this._translucentItems, e, t) : n; +}; +function removeAllPrimitives(e) { + const t = e.length; + for (let n = 0; n < t; n++) + e[n].destroy(); + e.length = 0; +} +StaticGeometryColorBatch.prototype.removeAllPrimitives = function() { + removeAllPrimitives(this._solidItems), removeAllPrimitives(this._translucentItems); +}; +const distanceDisplayConditionScratch$6 = new DistanceDisplayCondition(), defaultDistanceDisplayCondition$5 = new DistanceDisplayCondition(), defaultOffset$1 = Cartesian3.ZERO, offsetScratch$1 = new Cartesian3(); +function Batch$4(e, t, n, i, r, o, s) { + this.primitives = e, this.appearanceType = t, this.materialProperty = n, this.depthFailAppearanceType = i, this.depthFailMaterialProperty = r, this.closed = o, this.shadows = s, this.updaters = new AssociativeArray(), this.createPrimitive = !0, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.material = void 0, this.depthFailMaterial = void 0, this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.invalidated = !1, this.removeMaterialSubscription = n.definitionChanged.addEventListener( + Batch$4.prototype.onMaterialChanged, + this + ), this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(); +} +Batch$4.prototype.onMaterialChanged = function() { + this.invalidated = !0; +}; +Batch$4.prototype.isMaterial = function(e) { + const t = this.materialProperty, n = e.fillMaterialProperty, i = this.depthFailMaterialProperty, r = e.depthFailMaterialProperty; + if (n === t && r === i) + return !0; + let o = defined(t) && t.equals(n); + return o = (!defined(i) && !defined(r) || defined(i) && i.equals(r)) && o, o; +}; +Batch$4.prototype.add = function(e, t) { + const n = t.id; + if (this.updaters.set(n, t), this.geometry.set(n, t.createFillGeometryInstance(e)), !t.hasConstantFill || !t.fillMaterialProperty.isConstant || !Property.isConstant(t.distanceDisplayConditionProperty) || !Property.isConstant(t.terrainOffsetProperty)) + this.updatersWithAttributes.set(n, t); + else { + const i = this; + this.subscriptions.set( + n, + t.entity.definitionChanged.addEventListener(function(r, o, s, c) { + o === "isShowing" && i.showsUpdated.set(t.id, t); + }) + ); + } + this.createPrimitive = !0; +}; +Batch$4.prototype.remove = function(e) { + const t = e.id; + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.updatersWithAttributes.remove(t); + const n = this.subscriptions.get(t); + return defined(n) && (n(), this.subscriptions.remove(t), this.showsUpdated.remove(t)), !0; + } + return !1; +}; +const colorScratch$5 = new Color(); +Batch$4.prototype.update = function(e) { + let t = !0, n = this.primitive; + const i = this.primitives, r = this.geometry.values; + let o; + if (this.createPrimitive) { + if (r.length > 0) { + defined(n) && (defined(this.oldPrimitive) ? i.remove(n) : this.oldPrimitive = n), this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ); + let c; + defined(this.depthFailMaterialProperty) && (this.depthFailMaterial = MaterialProperty.getValue( + e, + this.depthFailMaterialProperty, + this.depthFailMaterial + ), c = new this.depthFailAppearanceType({ + material: this.depthFailMaterial, + translucent: this.depthFailMaterial.isTranslucent(), + closed: this.closed + })), n = new Primitive$3({ + show: !1, + asynchronous: !0, + geometryInstances: r.slice(), + appearance: new this.appearanceType({ + material: this.material, + translucent: this.material.isTranslucent(), + closed: this.closed + }), + depthFailAppearance: c, + shadows: this.shadows + }), i.add(n), t = !1; + } else { + defined(n) && (i.remove(n), n = void 0); + const c = this.oldPrimitive; + defined(c) && (i.remove(c), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = n, this.createPrimitive = !1; + } else if (defined(n) && n.ready) { + n.show = !0, defined(this.oldPrimitive) && (i.remove(this.oldPrimitive), this.oldPrimitive = void 0), this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ), this.primitive.appearance.material = this.material, defined(this.depthFailAppearanceType) && !(this.depthFailMaterialProperty instanceof ColorMaterialProperty) && (this.depthFailMaterial = MaterialProperty.getValue( + e, + this.depthFailMaterialProperty, + this.depthFailMaterial + ), this.primitive.depthFailAppearance.material = this.depthFailMaterial); + const s = this.updatersWithAttributes.values, c = s.length; + for (o = 0; o < c; o++) { + const l = s[o], d = l.entity, f = this.geometry.get(l.id); + let h = this.attributes.get(f.id.id); + if (defined(h) || (h = n.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)), defined(this.depthFailAppearanceType) && this.depthFailMaterialProperty instanceof ColorMaterialProperty && !l.depthFailMaterialProperty.isConstant) { + const C = l.depthFailMaterialProperty.color, T = Property.getValueOrDefault( + C, + e, + Color.WHITE, + colorScratch$5 + ); + Color.equals(h._lastDepthFailColor, T) || (h._lastDepthFailColor = Color.clone( + T, + h._lastDepthFailColor + ), h.depthFailColor = ColorGeometryInstanceAttribute.toValue( + T, + h.depthFailColor + )); + } + const p = d.isShowing && (l.hasConstantFill || l.isFilled(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = l.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const C = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition$5, + distanceDisplayConditionScratch$6 + ); + DistanceDisplayCondition.equals( + C, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + C, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + C, + h.distanceDisplayCondition + )); + } + const y = l.terrainOffsetProperty; + if (!Property.isConstant(y)) { + const C = Property.getValueOrDefault( + y, + e, + defaultOffset$1, + offsetScratch$1 + ); + Cartesian3.equals(C, h._lastOffset) || (h._lastOffset = Cartesian3.clone( + C, + h._lastOffset + ), h.offset = OffsetGeometryInstanceAttribute.toValue( + C, + h.offset + )); + } + } + this.updateShows(n); + } else defined(n) && !n.ready && (t = !1); + return t; +}; +Batch$4.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = r.entity, s = this.geometry.get(r.id); + let c = this.attributes.get(s.id.id); + defined(c) || (c = e.getGeometryInstanceAttributes(s.id), this.attributes.set(s.id.id, c)); + const l = o.isShowing, d = c.show[0] === 1; + l !== d && (c.show = ShowGeometryInstanceAttribute.toValue( + l, + c.show + ), s.attributes.show.value[0] = c.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch$4.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch$4.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getGeometryInstanceAttributes(e.entity); + return !defined(i) || !defined(i.boundingSphere) || defined(i.show) && i.show[0] === 0 ? BoundingSphereState$1.FAILED : (i.boundingSphere.clone(t), BoundingSphereState$1.DONE); +}; +Batch$4.prototype.destroy = function() { + const e = this.primitive, t = this.primitives; + defined(e) && t.remove(e); + const n = this.oldPrimitive; + defined(n) && t.remove(n), this.removeMaterialSubscription(); +}; +function StaticGeometryPerMaterialBatch(e, t, n, i, r) { + this._items = [], this._primitives = e, this._appearanceType = t, this._depthFailAppearanceType = n, this._closed = i, this._shadows = r; +} +StaticGeometryPerMaterialBatch.prototype.add = function(e, t) { + const n = this._items, i = n.length; + for (let o = 0; o < i; o++) { + const s = n[o]; + if (s.isMaterial(t)) { + s.add(e, t); + return; + } + } + const r = new Batch$4( + this._primitives, + this._appearanceType, + t.fillMaterialProperty, + this._depthFailAppearanceType, + t.depthFailMaterialProperty, + this._closed, + this._shadows + ); + r.add(e, t), n.push(r); +}; +StaticGeometryPerMaterialBatch.prototype.remove = function(e) { + const t = this._items, n = t.length; + for (let i = n - 1; i >= 0; i--) { + const r = t[i]; + if (r.remove(e)) { + r.updaters.length === 0 && (t.splice(i, 1), r.destroy()); + break; + } + } +}; +StaticGeometryPerMaterialBatch.prototype.update = function(e) { + let t; + const n = this._items, i = n.length; + for (t = i - 1; t >= 0; t--) { + const o = n[t]; + if (o.invalidated) { + n.splice(t, 1); + const s = o.updaters.values, c = s.length; + for (let l = 0; l < c; l++) + this.add(e, s[l]); + o.destroy(); + } + } + let r = !0; + for (t = 0; t < n.length; t++) + r = n[t].update(e) && r; + return r; +}; +StaticGeometryPerMaterialBatch.prototype.getBoundingSphere = function(e, t) { + const n = this._items, i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + if (o.contains(e)) + return o.getBoundingSphere(e, t); + } + return BoundingSphereState$1.FAILED; +}; +StaticGeometryPerMaterialBatch.prototype.removeAllPrimitives = function() { + const e = this._items, t = e.length; + for (let n = 0; n < t; n++) + e[n].destroy(); + this._items.length = 0; +}; +function quickselect(e, t, n = 0, i = e.length - 1, r = defaultCompare) { + for (; i > n; ) { + if (i - n > 600) { + const l = i - n + 1, d = t - n + 1, f = Math.log(l), h = 0.5 * Math.exp(2 * f / 3), p = 0.5 * Math.sqrt(f * h * (l - h) / l) * (d - l / 2 < 0 ? -1 : 1), m = Math.max(n, Math.floor(t - d * h / l + p)), _ = Math.min(i, Math.floor(t + (l - d) * h / l + p)); + quickselect(e, t, m, _, r); + } + const o = e[t]; + let s = n, c = i; + for (swap$1(e, n, t), r(e[i], o) > 0 && swap$1(e, n, i); s < c; ) { + for (swap$1(e, s, c), s++, c--; r(e[s], o) < 0; ) s++; + for (; r(e[c], o) > 0; ) c--; + } + r(e[n], o) === 0 ? swap$1(e, n, c) : (c++, swap$1(e, c, i)), c <= t && (n = c + 1), t <= c && (i = c - 1); + } +} +function swap$1(e, t, n) { + const i = e[t]; + e[t] = e[n], e[n] = i; +} +function defaultCompare(e, t) { + return e < t ? -1 : e > t ? 1 : 0; +} +class RBush { + constructor(t = 9) { + this._maxEntries = Math.max(4, t), this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)), this.clear(); + } + all() { + return this._all(this.data, []); + } + search(t) { + let n = this.data; + const i = []; + if (!intersects(t, n)) return i; + const r = this.toBBox, o = []; + for (; n; ) { + for (let s = 0; s < n.children.length; s++) { + const c = n.children[s], l = n.leaf ? r(c) : c; + intersects(t, l) && (n.leaf ? i.push(c) : contains$1(t, l) ? this._all(c, i) : o.push(c)); + } + n = o.pop(); + } + return i; + } + collides(t) { + let n = this.data; + if (!intersects(t, n)) return !1; + const i = []; + for (; n; ) { + for (let r = 0; r < n.children.length; r++) { + const o = n.children[r], s = n.leaf ? this.toBBox(o) : o; + if (intersects(t, s)) { + if (n.leaf || contains$1(t, s)) return !0; + i.push(o); + } + } + n = i.pop(); + } + return !1; + } + load(t) { + if (!(t && t.length)) return this; + if (t.length < this._minEntries) { + for (let i = 0; i < t.length; i++) + this.insert(t[i]); + return this; + } + let n = this._build(t.slice(), 0, t.length - 1, 0); + if (!this.data.children.length) + this.data = n; + else if (this.data.height === n.height) + this._splitRoot(this.data, n); + else { + if (this.data.height < n.height) { + const i = this.data; + this.data = n, n = i; + } + this._insert(n, this.data.height - n.height - 1, !0); + } + return this; + } + insert(t) { + return t && this._insert(t, this.data.height - 1), this; + } + clear() { + return this.data = createNode([]), this; + } + remove(t, n) { + if (!t) return this; + let i = this.data; + const r = this.toBBox(t), o = [], s = []; + let c, l, d; + for (; i || o.length; ) { + if (i || (i = o.pop(), l = o[o.length - 1], c = s.pop(), d = !0), i.leaf) { + const f = findItem(t, i.children, n); + if (f !== -1) + return i.children.splice(f, 1), o.push(i), this._condense(o), this; + } + !d && !i.leaf && contains$1(i, r) ? (o.push(i), s.push(c), c = 0, l = i, i = i.children[0]) : l ? (c++, i = l.children[c], d = !1) : i = null; + } + return this; + } + toBBox(t) { + return t; + } + compareMinX(t, n) { + return t.minX - n.minX; + } + compareMinY(t, n) { + return t.minY - n.minY; + } + toJSON() { + return this.data; + } + fromJSON(t) { + return this.data = t, this; + } + _all(t, n) { + const i = []; + for (; t; ) + t.leaf ? n.push(...t.children) : i.push(...t.children), t = i.pop(); + return n; + } + _build(t, n, i, r) { + const o = i - n + 1; + let s = this._maxEntries, c; + if (o <= s) + return c = createNode(t.slice(n, i + 1)), calcBBox(c, this.toBBox), c; + r || (r = Math.ceil(Math.log(o) / Math.log(s)), s = Math.ceil(o / Math.pow(s, r - 1))), c = createNode([]), c.leaf = !1, c.height = r; + const l = Math.ceil(o / s), d = l * Math.ceil(Math.sqrt(s)); + multiSelect(t, n, i, d, this.compareMinX); + for (let f = n; f <= i; f += d) { + const h = Math.min(f + d - 1, i); + multiSelect(t, f, h, l, this.compareMinY); + for (let p = f; p <= h; p += l) { + const m = Math.min(p + l - 1, h); + c.children.push(this._build(t, p, m, r - 1)); + } + } + return calcBBox(c, this.toBBox), c; + } + _chooseSubtree(t, n, i, r) { + for (; r.push(n), !(n.leaf || r.length - 1 === i); ) { + let o = 1 / 0, s = 1 / 0, c; + for (let l = 0; l < n.children.length; l++) { + const d = n.children[l], f = bboxArea(d), h = enlargedArea(t, d) - f; + h < s ? (s = h, o = f < o ? f : o, c = d) : h === s && f < o && (o = f, c = d); + } + n = c || n.children[0]; + } + return n; + } + _insert(t, n, i) { + const r = i ? t : this.toBBox(t), o = [], s = this._chooseSubtree(r, this.data, n, o); + for (s.children.push(t), extend(s, r); n >= 0 && o[n].children.length > this._maxEntries; ) + this._split(o, n), n--; + this._adjustParentBBoxes(r, o, n); + } + // split overflowed node into two + _split(t, n) { + const i = t[n], r = i.children.length, o = this._minEntries; + this._chooseSplitAxis(i, o, r); + const s = this._chooseSplitIndex(i, o, r), c = createNode(i.children.splice(s, i.children.length - s)); + c.height = i.height, c.leaf = i.leaf, calcBBox(i, this.toBBox), calcBBox(c, this.toBBox), n ? t[n - 1].children.push(c) : this._splitRoot(i, c); + } + _splitRoot(t, n) { + this.data = createNode([t, n]), this.data.height = t.height + 1, this.data.leaf = !1, calcBBox(this.data, this.toBBox); + } + _chooseSplitIndex(t, n, i) { + let r, o = 1 / 0, s = 1 / 0; + for (let c = n; c <= i - n; c++) { + const l = distBBox(t, 0, c, this.toBBox), d = distBBox(t, c, i, this.toBBox), f = intersectionArea(l, d), h = bboxArea(l) + bboxArea(d); + f < o ? (o = f, r = c, s = h < s ? h : s) : f === o && h < s && (s = h, r = c); + } + return r || i - n; + } + // sorts node children by the best axis for split + _chooseSplitAxis(t, n, i) { + const r = t.leaf ? this.compareMinX : compareNodeMinX, o = t.leaf ? this.compareMinY : compareNodeMinY, s = this._allDistMargin(t, n, i, r), c = this._allDistMargin(t, n, i, o); + s < c && t.children.sort(r); + } + // total margin of all possible split distributions where each node is at least m full + _allDistMargin(t, n, i, r) { + t.children.sort(r); + const o = this.toBBox, s = distBBox(t, 0, n, o), c = distBBox(t, i - n, i, o); + let l = bboxMargin(s) + bboxMargin(c); + for (let d = n; d < i - n; d++) { + const f = t.children[d]; + extend(s, t.leaf ? o(f) : f), l += bboxMargin(s); + } + for (let d = i - n - 1; d >= n; d--) { + const f = t.children[d]; + extend(c, t.leaf ? o(f) : f), l += bboxMargin(c); + } + return l; + } + _adjustParentBBoxes(t, n, i) { + for (let r = i; r >= 0; r--) + extend(n[r], t); + } + _condense(t) { + for (let n = t.length - 1, i; n >= 0; n--) + t[n].children.length === 0 ? n > 0 ? (i = t[n - 1].children, i.splice(i.indexOf(t[n]), 1)) : this.clear() : calcBBox(t[n], this.toBBox); + } +} +function findItem(e, t, n) { + if (!n) return t.indexOf(e); + for (let i = 0; i < t.length; i++) + if (n(e, t[i])) return i; + return -1; +} +function calcBBox(e, t) { + distBBox(e, 0, e.children.length, t, e); +} +function distBBox(e, t, n, i, r) { + r || (r = createNode(null)), r.minX = 1 / 0, r.minY = 1 / 0, r.maxX = -1 / 0, r.maxY = -1 / 0; + for (let o = t; o < n; o++) { + const s = e.children[o]; + extend(r, e.leaf ? i(s) : s); + } + return r; +} +function extend(e, t) { + return e.minX = Math.min(e.minX, t.minX), e.minY = Math.min(e.minY, t.minY), e.maxX = Math.max(e.maxX, t.maxX), e.maxY = Math.max(e.maxY, t.maxY), e; +} +function compareNodeMinX(e, t) { + return e.minX - t.minX; +} +function compareNodeMinY(e, t) { + return e.minY - t.minY; +} +function bboxArea(e) { + return (e.maxX - e.minX) * (e.maxY - e.minY); +} +function bboxMargin(e) { + return e.maxX - e.minX + (e.maxY - e.minY); +} +function enlargedArea(e, t) { + return (Math.max(t.maxX, e.maxX) - Math.min(t.minX, e.minX)) * (Math.max(t.maxY, e.maxY) - Math.min(t.minY, e.minY)); +} +function intersectionArea(e, t) { + const n = Math.max(e.minX, t.minX), i = Math.max(e.minY, t.minY), r = Math.min(e.maxX, t.maxX), o = Math.min(e.maxY, t.maxY); + return Math.max(0, r - n) * Math.max(0, o - i); +} +function contains$1(e, t) { + return e.minX <= t.minX && e.minY <= t.minY && t.maxX <= e.maxX && t.maxY <= e.maxY; +} +function intersects(e, t) { + return t.minX <= e.maxX && t.minY <= e.maxY && t.maxX >= e.minX && t.maxY >= e.minY; +} +function createNode(e) { + return { + children: e, + height: 1, + leaf: !0, + minX: 1 / 0, + minY: 1 / 0, + maxX: -1 / 0, + maxY: -1 / 0 + }; +} +function multiSelect(e, t, n, i, r) { + const o = [t, n]; + for (; o.length; ) { + if (n = o.pop(), t = o.pop(), n - t <= i) continue; + const s = t + Math.ceil((n - t) / i / 2) * i; + quickselect(e, s, t, n, r), o.push(t, s, s, n); + } +} +function RectangleCollisionChecker() { + this._tree = new RBush(); +} +function RectangleWithId() { + this.minX = 0, this.minY = 0, this.maxX = 0, this.maxY = 0, this.id = ""; +} +RectangleWithId.fromRectangleAndId = function(e, t, n) { + return n.minX = t.west, n.minY = t.south, n.maxX = t.east, n.maxY = t.north, n.id = e, n; +}; +RectangleCollisionChecker.prototype.insert = function(e, t) { + const n = RectangleWithId.fromRectangleAndId( + e, + t, + new RectangleWithId() + ); + this._tree.insert(n); +}; +function idCompare(e, t) { + return e.id === t.id; +} +const removalScratch = new RectangleWithId(); +RectangleCollisionChecker.prototype.remove = function(e, t) { + const n = RectangleWithId.fromRectangleAndId( + e, + t, + removalScratch + ); + this._tree.remove(n, idCompare); +}; +const collisionScratch = new RectangleWithId(); +RectangleCollisionChecker.prototype.collides = function(e) { + const t = RectangleWithId.fromRectangleAndId( + "", + e, + collisionScratch + ); + return this._tree.collides(t); +}; +const colorScratch$4 = new Color(), distanceDisplayConditionScratch$5 = new DistanceDisplayCondition(), defaultDistanceDisplayCondition$4 = new DistanceDisplayCondition(); +function Batch$3(e, t, n, i) { + this.primitives = e, this.zIndex = i, this.classificationType = t, this.color = n, this.createPrimitive = !1, this.waitingOnCreate = !1, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.updaters = new AssociativeArray(), this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(), this.itemsToRemove = [], this.isDirty = !1, this.rectangleCollisionCheck = new RectangleCollisionChecker(); +} +Batch$3.prototype.overlapping = function(e) { + return this.rectangleCollisionCheck.collides(e); +}; +Batch$3.prototype.add = function(e, t) { + const n = e.id; + if (this.createPrimitive = !0, this.geometry.set(n, t), this.updaters.set(n, e), this.rectangleCollisionCheck.insert(n, t.geometry.rectangle), !e.hasConstantFill || !e.fillMaterialProperty.isConstant || !Property.isConstant(e.distanceDisplayConditionProperty)) + this.updatersWithAttributes.set(n, e); + else { + const i = this; + this.subscriptions.set( + n, + e.entity.definitionChanged.addEventListener(function(r, o, s, c) { + o === "isShowing" && i.showsUpdated.set(e.id, e); + }) + ); + } +}; +Batch$3.prototype.remove = function(e) { + const t = e.id, n = this.geometry.get(t); + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.rectangleCollisionCheck.remove( + t, + n.geometry.rectangle + ), this.updatersWithAttributes.remove(t); + const i = this.subscriptions.get(t); + return defined(i) && (i(), this.subscriptions.remove(t), this.showsUpdated.remove(t)), !0; + } + return !1; +}; +Batch$3.prototype.update = function(e) { + let t = !0; + const n = 0; + let i = this.primitive; + const r = this.primitives; + let o; + if (this.createPrimitive) { + const s = this.geometry.values; + if (s.length > 0) + defined(i) && (defined(this.oldPrimitive) ? r.remove(i) : this.oldPrimitive = i), i = new GroundPrimitive({ + show: !1, + asynchronous: !0, + geometryInstances: s.slice(), + classificationType: this.classificationType + }), r.add(i, this.zIndex), t = !1; + else { + defined(i) && (r.remove(i), i = void 0); + const l = this.oldPrimitive; + defined(l) && (r.remove(l), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = i, this.createPrimitive = !1, this.waitingOnCreate = !0; + } else if (defined(i) && i.ready) { + i.show = !0, defined(this.oldPrimitive) && (r.remove(this.oldPrimitive), this.oldPrimitive = void 0); + const s = this.updatersWithAttributes.values, c = s.length, l = this.waitingOnCreate; + for (o = 0; o < c; o++) { + const d = s[o], f = this.geometry.get(d.id); + let h = this.attributes.get(f.id.id); + if (defined(h) || (h = i.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)), !d.fillMaterialProperty.isConstant || l) { + const y = d.fillMaterialProperty.color, C = Property.getValueOrDefault( + y, + e, + Color.WHITE, + colorScratch$4 + ); + Color.equals(h._lastColor, C) || (h._lastColor = Color.clone(C, h._lastColor), h.color = ColorGeometryInstanceAttribute.toValue( + C, + h.color + )); + } + const p = d.entity.isShowing && (d.hasConstantFill || d.isFilled(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = d.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const y = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition$4, + distanceDisplayConditionScratch$5 + ); + DistanceDisplayCondition.equals( + y, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + y, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + y, + h.distanceDisplayCondition + )); + } + } + this.updateShows(i), this.waitingOnCreate = !1; + } else defined(i) && !i.ready && (t = !1); + return this.itemsToRemove.length = n, t; +}; +Batch$3.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = this.geometry.get(r.id); + let s = this.attributes.get(o.id.id); + defined(s) || (s = e.getGeometryInstanceAttributes(o.id), this.attributes.set(o.id.id, s)); + const c = r.entity.isShowing, l = s.show[0] === 1; + c !== l && (s.show = ShowGeometryInstanceAttribute.toValue( + c, + s.show + ), o.attributes.show.value[0] = s.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch$3.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch$3.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getBoundingSphere(e.entity); + return defined(i) ? (i.clone(t), BoundingSphereState$1.DONE) : BoundingSphereState$1.FAILED; +}; +Batch$3.prototype.removeAllPrimitives = function() { + const e = this.primitives, t = this.primitive; + defined(t) && (e.remove(t), this.primitive = void 0, this.geometry.removeAll(), this.updaters.removeAll()); + const n = this.oldPrimitive; + defined(n) && (e.remove(n), this.oldPrimitive = void 0); +}; +function StaticGroundGeometryColorBatch(e, t) { + this._batches = [], this._primitives = e, this._classificationType = t; +} +StaticGroundGeometryColorBatch.prototype.add = function(e, t) { + const n = t.createFillGeometryInstance(e), i = this._batches, r = Property.getValueOrDefault(t.zIndex, 0); + let o; + const s = i.length; + for (let c = 0; c < s; ++c) { + const l = i[c]; + if (l.zIndex === r && !l.overlapping(n.geometry.rectangle)) { + o = l; + break; + } + } + return defined(o) || (o = new Batch$3( + this._primitives, + this._classificationType, + n.attributes.color.value, + r + ), i.push(o)), o.add(t, n), o; +}; +StaticGroundGeometryColorBatch.prototype.remove = function(e) { + const t = this._batches, n = t.length; + for (let i = 0; i < n; ++i) + if (t[i].remove(e)) + return; +}; +StaticGroundGeometryColorBatch.prototype.update = function(e) { + let t, n, i = !0; + const r = this._batches, o = r.length; + for (t = 0; t < o; ++t) + i = r[t].update(e) && i; + for (t = 0; t < o; ++t) { + const s = r[t], c = s.itemsToRemove, l = c.length; + for (let d = 0; d < l; d++) { + n = c[d], s.remove(n); + const f = this.add(e, n); + s.isDirty = !0, f.isDirty = !0; + } + } + for (t = o - 1; t >= 0; --t) { + const s = r[t]; + s.isDirty && (i = r[t].update(e) && i, s.isDirty = !1), s.geometry.length === 0 && r.splice(t, 1); + } + return i; +}; +StaticGroundGeometryColorBatch.prototype.getBoundingSphere = function(e, t) { + const n = this._batches, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + if (o.contains(e)) + return o.getBoundingSphere(e, t); + } + return BoundingSphereState$1.FAILED; +}; +StaticGroundGeometryColorBatch.prototype.removeAllPrimitives = function() { + const e = this._batches, t = e.length; + for (let n = 0; n < t; ++n) + e[n].removeAllPrimitives(); +}; +const distanceDisplayConditionScratch$4 = new DistanceDisplayCondition(), defaultDistanceDisplayCondition$3 = new DistanceDisplayCondition(); +function Batch$2(e, t, n, i, r, o) { + this.primitives = e, this.classificationType = t, this.appearanceType = n, this.materialProperty = i, this.updaters = new AssociativeArray(), this.createPrimitive = !0, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.material = void 0, this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.invalidated = !1, this.removeMaterialSubscription = i.definitionChanged.addEventListener( + Batch$2.prototype.onMaterialChanged, + this + ), this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(), this.usingSphericalTextureCoordinates = r, this.zIndex = o, this.rectangleCollisionCheck = new RectangleCollisionChecker(); +} +Batch$2.prototype.onMaterialChanged = function() { + this.invalidated = !0; +}; +Batch$2.prototype.overlapping = function(e) { + return this.rectangleCollisionCheck.collides(e); +}; +Batch$2.prototype.isMaterial = function(e) { + const t = this.materialProperty, n = e.fillMaterialProperty; + return n === t || n instanceof ColorMaterialProperty && t instanceof ColorMaterialProperty ? !0 : defined(t) && t.equals(n); +}; +Batch$2.prototype.add = function(e, t, n) { + const i = t.id; + if (this.updaters.set(i, t), this.geometry.set(i, n), this.rectangleCollisionCheck.insert(i, n.geometry.rectangle), !t.hasConstantFill || !t.fillMaterialProperty.isConstant || !Property.isConstant(t.distanceDisplayConditionProperty)) + this.updatersWithAttributes.set(i, t); + else { + const r = this; + this.subscriptions.set( + i, + t.entity.definitionChanged.addEventListener(function(o, s, c, l) { + s === "isShowing" && r.showsUpdated.set(t.id, t); + }) + ); + } + this.createPrimitive = !0; +}; +Batch$2.prototype.remove = function(e) { + const t = e.id, n = this.geometry.get(t); + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.rectangleCollisionCheck.remove( + t, + n.geometry.rectangle + ), this.updatersWithAttributes.remove(t); + const i = this.subscriptions.get(t); + return defined(i) && (i(), this.subscriptions.remove(t)), !0; + } + return !1; +}; +Batch$2.prototype.update = function(e) { + let t = !0, n = this.primitive; + const i = this.primitives, r = this.geometry.values; + let o; + if (this.createPrimitive) { + if (r.length > 0) + defined(n) && (defined(this.oldPrimitive) ? i.remove(n) : this.oldPrimitive = n), this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ), n = new GroundPrimitive({ + show: !1, + asynchronous: !0, + geometryInstances: r.slice(), + appearance: new this.appearanceType({ + material: this.material + // translucent and closed properties overridden + }), + classificationType: this.classificationType + }), i.add(n, this.zIndex), t = !1; + else { + defined(n) && (i.remove(n), n = void 0); + const c = this.oldPrimitive; + defined(c) && (i.remove(c), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = n, this.createPrimitive = !1; + } else if (defined(n) && n.ready) { + n.show = !0, defined(this.oldPrimitive) && (i.remove(this.oldPrimitive), this.oldPrimitive = void 0), this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ), this.primitive.appearance.material = this.material; + const s = this.updatersWithAttributes.values, c = s.length; + for (o = 0; o < c; o++) { + const l = s[o], d = l.entity, f = this.geometry.get(l.id); + let h = this.attributes.get(f.id.id); + defined(h) || (h = n.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)); + const p = d.isShowing && (l.hasConstantFill || l.isFilled(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = l.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const y = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition$3, + distanceDisplayConditionScratch$4 + ); + DistanceDisplayCondition.equals( + y, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + y, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + y, + h.distanceDisplayCondition + )); + } + } + this.updateShows(n); + } else defined(n) && !n.ready && (t = !1); + return t; +}; +Batch$2.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = r.entity, s = this.geometry.get(r.id); + let c = this.attributes.get(s.id.id); + defined(c) || (c = e.getGeometryInstanceAttributes(s.id), this.attributes.set(s.id.id, c)); + const l = o.isShowing, d = c.show[0] === 1; + l !== d && (c.show = ShowGeometryInstanceAttribute.toValue( + l, + c.show + ), s.attributes.show.value[0] = c.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch$2.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch$2.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getGeometryInstanceAttributes(e.entity); + return !defined(i) || !defined(i.boundingSphere) || defined(i.show) && i.show[0] === 0 ? BoundingSphereState$1.FAILED : (i.boundingSphere.clone(t), BoundingSphereState$1.DONE); +}; +Batch$2.prototype.destroy = function() { + const e = this.primitive, t = this.primitives; + defined(e) && t.remove(e); + const n = this.oldPrimitive; + defined(n) && t.remove(n), this.removeMaterialSubscription(); +}; +function StaticGroundGeometryPerMaterialBatch(e, t, n) { + this._items = [], this._primitives = e, this._classificationType = t, this._appearanceType = n; +} +StaticGroundGeometryPerMaterialBatch.prototype.add = function(e, t) { + const n = this._items, i = n.length, r = t.createFillGeometryInstance(e), o = ShadowVolumeAppearance.shouldUseSphericalCoordinates( + r.geometry.rectangle + ), s = Property.getValueOrDefault(t.zIndex, 0); + for (let l = 0; l < i; ++l) { + const d = n[l]; + if (d.isMaterial(t) && d.usingSphericalTextureCoordinates === o && d.zIndex === s && !d.overlapping(r.geometry.rectangle)) { + d.add(e, t, r); + return; + } + } + const c = new Batch$2( + this._primitives, + this._classificationType, + this._appearanceType, + t.fillMaterialProperty, + o, + s + ); + c.add(e, t, r), n.push(c); +}; +StaticGroundGeometryPerMaterialBatch.prototype.remove = function(e) { + const t = this._items, n = t.length; + for (let i = n - 1; i >= 0; i--) { + const r = t[i]; + if (r.remove(e)) { + r.updaters.length === 0 && (t.splice(i, 1), r.destroy()); + break; + } + } +}; +StaticGroundGeometryPerMaterialBatch.prototype.update = function(e) { + let t; + const n = this._items, i = n.length; + for (t = i - 1; t >= 0; t--) { + const o = n[t]; + if (o.invalidated) { + n.splice(t, 1); + const s = o.updaters.values, c = s.length; + for (let l = 0; l < c; l++) + this.add(e, s[l]); + o.destroy(); + } + } + let r = !0; + for (t = 0; t < n.length; t++) + r = n[t].update(e) && r; + return r; +}; +StaticGroundGeometryPerMaterialBatch.prototype.getBoundingSphere = function(e, t) { + const n = this._items, i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + if (o.contains(e)) + return o.getBoundingSphere(e, t); + } + return BoundingSphereState$1.FAILED; +}; +StaticGroundGeometryPerMaterialBatch.prototype.removeAllPrimitives = function() { + const e = this._items, t = e.length; + for (let n = 0; n < t; n++) + e[n].destroy(); + this._items.length = 0; +}; +const colorScratch$3 = new Color(), distanceDisplayConditionScratch$3 = new DistanceDisplayCondition(), defaultDistanceDisplayCondition$2 = new DistanceDisplayCondition(), defaultOffset = Cartesian3.ZERO, offsetScratch = new Cartesian3(); +function Batch$1(e, t, n, i) { + this.translucent = t, this.width = n, this.shadows = i, this.primitives = e, this.createPrimitive = !1, this.waitingOnCreate = !1, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.updaters = new AssociativeArray(), this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.itemsToRemove = [], this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(); +} +Batch$1.prototype.add = function(e, t) { + const n = e.id; + if (this.createPrimitive = !0, this.geometry.set(n, t), this.updaters.set(n, e), !e.hasConstantOutline || !e.outlineColorProperty.isConstant || !Property.isConstant(e.distanceDisplayConditionProperty) || !Property.isConstant(e.terrainOffsetProperty)) + this.updatersWithAttributes.set(n, e); + else { + const i = this; + this.subscriptions.set( + n, + e.entity.definitionChanged.addEventListener(function(r, o, s, c) { + o === "isShowing" && i.showsUpdated.set(e.id, e); + }) + ); + } +}; +Batch$1.prototype.remove = function(e) { + const t = e.id; + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.updatersWithAttributes.remove(t); + const n = this.subscriptions.get(t); + return defined(n) && (n(), this.subscriptions.remove(t), this.showsUpdated.remove(t)), !0; + } + return !1; +}; +Batch$1.prototype.update = function(e) { + let t = !0, n = 0, i = this.primitive; + const r = this.primitives; + let o; + if (this.createPrimitive) { + const s = this.geometry.values; + if (s.length > 0) + defined(i) && (defined(this.oldPrimitive) ? r.remove(i) : this.oldPrimitive = i), i = new Primitive$3({ + show: !1, + asynchronous: !0, + geometryInstances: s.slice(), + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: this.translucent, + renderState: { + lineWidth: this.width + } + }), + shadows: this.shadows + }), r.add(i), t = !1; + else { + defined(i) && (r.remove(i), i = void 0); + const l = this.oldPrimitive; + defined(l) && (r.remove(l), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = i, this.createPrimitive = !1, this.waitingOnCreate = !0; + } else if (defined(i) && i.ready) { + i.show = !0, defined(this.oldPrimitive) && (r.remove(this.oldPrimitive), this.oldPrimitive = void 0); + const s = this.updatersWithAttributes.values, c = s.length, l = this.waitingOnCreate; + for (o = 0; o < c; o++) { + const d = s[o], f = this.geometry.get(d.id); + let h = this.attributes.get(f.id.id); + if (defined(h) || (h = i.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)), !d.outlineColorProperty.isConstant || l) { + const C = d.outlineColorProperty, T = Property.getValueOrDefault( + C, + e, + Color.WHITE, + colorScratch$3 + ); + Color.equals(h._lastColor, T) || (h._lastColor = Color.clone( + T, + h._lastColor + ), h.color = ColorGeometryInstanceAttribute.toValue( + T, + h.color + ), (this.translucent && h.color[3] === 255 || !this.translucent && h.color[3] !== 255) && (this.itemsToRemove[n++] = d)); + } + const p = d.entity.isShowing && (d.hasConstantOutline || d.isOutlineVisible(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = d.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const C = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition$2, + distanceDisplayConditionScratch$3 + ); + DistanceDisplayCondition.equals( + C, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + C, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + C, + h.distanceDisplayCondition + )); + } + const y = d.terrainOffsetProperty; + if (!Property.isConstant(y)) { + const C = Property.getValueOrDefault( + y, + e, + defaultOffset, + offsetScratch + ); + Cartesian3.equals(C, h._lastOffset) || (h._lastOffset = Cartesian3.clone( + C, + h._lastOffset + ), h.offset = OffsetGeometryInstanceAttribute.toValue( + C, + h.offset + )); + } + } + this.updateShows(i), this.waitingOnCreate = !1; + } else defined(i) && !i.ready && (t = !1); + return this.itemsToRemove.length = n, t; +}; +Batch$1.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = this.geometry.get(r.id); + let s = this.attributes.get(o.id.id); + defined(s) || (s = e.getGeometryInstanceAttributes(o.id), this.attributes.set(o.id.id, s)); + const c = r.entity.isShowing, l = s.show[0] === 1; + c !== l && (s.show = ShowGeometryInstanceAttribute.toValue( + c, + s.show + ), o.attributes.show.value[0] = s.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch$1.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch$1.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getGeometryInstanceAttributes(e.entity); + return !defined(i) || !defined(i.boundingSphere) || // + defined(i.show) && i.show[0] === 0 ? BoundingSphereState$1.FAILED : (i.boundingSphere.clone(t), BoundingSphereState$1.DONE); +}; +Batch$1.prototype.removeAllPrimitives = function() { + const e = this.primitives, t = this.primitive; + defined(t) && (e.remove(t), this.primitive = void 0, this.geometry.removeAll(), this.updaters.removeAll()); + const n = this.oldPrimitive; + defined(n) && (e.remove(n), this.oldPrimitive = void 0); +}; +function StaticOutlineGeometryBatch(e, t, n) { + this._primitives = e, this._scene = t, this._shadows = n, this._solidBatches = new AssociativeArray(), this._translucentBatches = new AssociativeArray(); +} +StaticOutlineGeometryBatch.prototype.add = function(e, t) { + const n = t.createOutlineGeometryInstance(e), i = this._scene.clampLineWidth(t.outlineWidth); + let r, o; + n.attributes.color.value[3] === 255 ? (r = this._solidBatches, o = r.get(i), defined(o) || (o = new Batch$1(this._primitives, !1, i, this._shadows), r.set(i, o)), o.add(t, n)) : (r = this._translucentBatches, o = r.get(i), defined(o) || (o = new Batch$1(this._primitives, !0, i, this._shadows), r.set(i, o)), o.add(t, n)); +}; +StaticOutlineGeometryBatch.prototype.remove = function(e) { + let t; + const n = this._solidBatches.values, i = n.length; + for (t = 0; t < i; t++) + if (n[t].remove(e)) + return; + const r = this._translucentBatches.values, o = r.length; + for (t = 0; t < o; t++) + if (r[t].remove(e)) + return; +}; +StaticOutlineGeometryBatch.prototype.update = function(e) { + let t, n, i, r; + const o = this._solidBatches.values, s = o.length, c = this._translucentBatches.values, l = c.length; + let d, f = !0, h = !1; + do { + for (h = !1, n = 0; n < s; n++) { + r = o[n], f = r.update(e), d = r.itemsToRemove; + const p = d.length; + if (p > 0) + for (h = !0, t = 0; t < p; t++) + i = d[t], r.remove(i), this.add(e, i); + } + for (n = 0; n < l; n++) { + r = c[n], f = r.update(e), d = r.itemsToRemove; + const p = d.length; + if (p > 0) + for (h = !0, t = 0; t < p; t++) + i = d[t], r.remove(i), this.add(e, i); + } + } while (h); + return f; +}; +StaticOutlineGeometryBatch.prototype.getBoundingSphere = function(e, t) { + let n; + const i = this._solidBatches.values, r = i.length; + for (n = 0; n < r; n++) { + const c = i[n]; + if (c.contains(e)) + return c.getBoundingSphere(e, t); + } + const o = this._translucentBatches.values, s = o.length; + for (n = 0; n < s; n++) { + const c = o[n]; + if (c.contains(e)) + return c.getBoundingSphere(e, t); + } + return BoundingSphereState$1.FAILED; +}; +StaticOutlineGeometryBatch.prototype.removeAllPrimitives = function() { + let e; + const t = this._solidBatches.values, n = t.length; + for (e = 0; e < n; e++) + t[e].removeAllPrimitives(); + const i = this._translucentBatches.values, r = i.length; + for (e = 0; e < r; e++) + i[e].removeAllPrimitives(); +}; +const emptyArray$1 = []; +function GeometryVisualizer(e, t, n, i) { + n = defaultValue(n, e.primitives), i = defaultValue(i, e.groundPrimitives), this._scene = e, this._primitives = n, this._groundPrimitives = i, this._entityCollection = void 0, this._addedObjects = new AssociativeArray(), this._removedObjects = new AssociativeArray(), this._changedObjects = new AssociativeArray(); + const r = ShadowMode$1.NUMBER_OF_SHADOW_MODES; + this._outlineBatches = new Array(r * 2), this._closedColorBatches = new Array(r * 2), this._closedMaterialBatches = new Array(r * 2), this._openColorBatches = new Array(r * 2), this._openMaterialBatches = new Array(r * 2); + const o = Entity.supportsMaterialsforEntitiesOnTerrain( + e + ); + this._supportsMaterialsforEntitiesOnTerrain = o; + let s; + for (s = 0; s < r; ++s) + this._outlineBatches[s] = new StaticOutlineGeometryBatch( + n, + e, + s + ), this._outlineBatches[r + s] = new StaticOutlineGeometryBatch(n, e, s), this._closedColorBatches[s] = new StaticGeometryColorBatch( + n, + PerInstanceColorAppearance, + void 0, + !0, + s + ), this._closedColorBatches[r + s] = new StaticGeometryColorBatch( + n, + PerInstanceColorAppearance, + void 0, + !0, + s + ), this._closedMaterialBatches[s] = new StaticGeometryPerMaterialBatch( + n, + MaterialAppearance, + void 0, + !0, + s + ), this._closedMaterialBatches[r + s] = new StaticGeometryPerMaterialBatch( + n, + MaterialAppearance, + void 0, + !0, + s + ), this._openColorBatches[s] = new StaticGeometryColorBatch( + n, + PerInstanceColorAppearance, + void 0, + !1, + s + ), this._openColorBatches[r + s] = new StaticGeometryColorBatch( + n, + PerInstanceColorAppearance, + void 0, + !1, + s + ), this._openMaterialBatches[s] = new StaticGeometryPerMaterialBatch( + n, + MaterialAppearance, + void 0, + !1, + s + ), this._openMaterialBatches[r + s] = new StaticGeometryPerMaterialBatch( + n, + MaterialAppearance, + void 0, + !1, + s + ); + const c = ClassificationType$1.NUMBER_OF_CLASSIFICATION_TYPES, l = new Array(c), d = []; + if (o) + for (s = 0; s < c; ++s) + d.push( + new StaticGroundGeometryPerMaterialBatch( + i, + s, + MaterialAppearance + ) + ), l[s] = new StaticGroundGeometryColorBatch( + i, + s + ); + else + for (s = 0; s < c; ++s) + l[s] = new StaticGroundGeometryColorBatch( + i, + s + ); + this._groundColorBatches = l, this._groundMaterialBatches = d, this._dynamicBatch = new DynamicGeometryBatch(n, i), this._batches = this._outlineBatches.concat( + this._closedColorBatches, + this._closedMaterialBatches, + this._openColorBatches, + this._openMaterialBatches, + this._groundColorBatches, + this._groundMaterialBatches, + this._dynamicBatch + ), this._subscriptions = new AssociativeArray(), this._updaterSets = new AssociativeArray(), this._entityCollection = t, t.collectionChanged.addEventListener( + GeometryVisualizer.prototype._onCollectionChanged, + this + ), this._onCollectionChanged( + t, + t.values, + emptyArray$1 + ); +} +GeometryVisualizer.registerUpdater = function(e) { + GeometryUpdaterSet.registerUpdater(e); +}; +GeometryVisualizer.unregisterUpdater = function(e) { + GeometryUpdaterSet.unregisterUpdater(e); +}; +GeometryVisualizer.prototype.update = function(e) { + const t = this._addedObjects, n = t.values, i = this._removedObjects, r = i.values, o = this._changedObjects, s = o.values; + let c, l, d, f; + const h = this; + for (c = s.length - 1; c > -1; c--) + l = s[c], d = l.id, f = this._updaterSets.get(d), f.entity === l ? f.forEach(function(y) { + h._removeUpdater(y), h._insertUpdaterIntoBatch(e, y); + }) : (r.push(l), n.push(l)); + for (c = r.length - 1; c > -1; c--) + l = r[c], d = l.id, f = this._updaterSets.get(d), f.forEach(this._removeUpdater.bind(this)), f.destroy(), this._updaterSets.remove(d), this._subscriptions.get(d)(), this._subscriptions.remove(d); + for (c = n.length - 1; c > -1; c--) + l = n[c], d = l.id, f = new GeometryUpdaterSet(l, this._scene), this._updaterSets.set(d, f), f.forEach(function(y) { + h._insertUpdaterIntoBatch(e, y); + }), this._subscriptions.set( + d, + f.geometryChanged.addEventListener( + GeometryVisualizer._onGeometryChanged, + this + ) + ); + t.removeAll(), i.removeAll(), o.removeAll(); + let p = !0; + const m = this._batches, _ = m.length; + for (c = 0; c < _; c++) + p = m[c].update(e) && p; + return p; +}; +const getBoundingSphereArrayScratch$2 = [], getBoundingSphereBoundingSphereScratch$2 = new BoundingSphere(); +GeometryVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = getBoundingSphereArrayScratch$2, i = getBoundingSphereBoundingSphereScratch$2; + let r = 0, o = BoundingSphereState$1.DONE; + const s = this._batches, c = s.length, l = e.id, d = this._updaterSets.get(l).updaters; + for (let f = 0; f < d.length; f++) { + const h = d[f]; + for (let p = 0; p < c; p++) { + if (o = s[p].getBoundingSphere(h, i), o === BoundingSphereState$1.PENDING) + return BoundingSphereState$1.PENDING; + o === BoundingSphereState$1.DONE && (n[r] = BoundingSphere.clone( + i, + n[r] + ), r++); + } + } + return r === 0 ? BoundingSphereState$1.FAILED : (n.length = r, BoundingSphere.fromBoundingSpheres(n, t), BoundingSphereState$1.DONE); +}; +GeometryVisualizer.prototype.isDestroyed = function() { + return !1; +}; +GeometryVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + GeometryVisualizer.prototype._onCollectionChanged, + this + ), this._addedObjects.removeAll(), this._removedObjects.removeAll(); + let e; + const t = this._batches; + let n = t.length; + for (e = 0; e < n; e++) + t[e].removeAllPrimitives(); + const i = this._subscriptions.values; + for (n = i.length, e = 0; e < n; e++) + i[e](); + this._subscriptions.removeAll(); + const r = this._updaterSets.values; + for (n = r.length, e = 0; e < n; e++) + r[e].destroy(); + return this._updaterSets.removeAll(), destroyObject(this); +}; +GeometryVisualizer.prototype._removeUpdater = function(e) { + const t = this._batches, n = t.length; + for (let i = 0; i < n; i++) + t[i].remove(e); +}; +GeometryVisualizer.prototype._insertUpdaterIntoBatch = function(e, t) { + if (t.isDynamic) { + this._dynamicBatch.add(e, t); + return; + } + let n; + (t.outlineEnabled || t.fillEnabled) && (n = t.shadowsProperty.getValue(e)); + const i = ShadowMode$1.NUMBER_OF_SHADOW_MODES; + if (t.outlineEnabled && (defined(t.terrainOffsetProperty) ? this._outlineBatches[i + n].add(e, t) : this._outlineBatches[n].add(e, t)), t.fillEnabled) + if (t.onTerrain) { + const r = t.classificationTypeProperty.getValue( + e + ); + t.fillMaterialProperty instanceof ColorMaterialProperty ? this._groundColorBatches[r].add(e, t) : this._groundMaterialBatches[r].add(e, t); + } else t.isClosed ? t.fillMaterialProperty instanceof ColorMaterialProperty ? defined(t.terrainOffsetProperty) ? this._closedColorBatches[i + n].add( + e, + t + ) : this._closedColorBatches[n].add(e, t) : defined(t.terrainOffsetProperty) ? this._closedMaterialBatches[i + n].add( + e, + t + ) : this._closedMaterialBatches[n].add(e, t) : t.fillMaterialProperty instanceof ColorMaterialProperty ? defined(t.terrainOffsetProperty) ? this._openColorBatches[i + n].add( + e, + t + ) : this._openColorBatches[n].add(e, t) : defined(t.terrainOffsetProperty) ? this._openMaterialBatches[i + n].add( + e, + t + ) : this._openMaterialBatches[n].add(e, t); +}; +GeometryVisualizer._onGeometryChanged = function(e) { + const t = this._removedObjects, n = this._changedObjects, i = e.entity, r = i.id; + !defined(t.get(r)) && !defined(n.get(r)) && n.set(r, i); +}; +GeometryVisualizer.prototype._onCollectionChanged = function(e, t, n) { + const i = this._addedObjects, r = this._removedObjects, o = this._changedObjects; + let s, c, l; + for (s = n.length - 1; s > -1; s--) + l = n[s], c = l.id, i.remove(c) || (r.set(c, l), o.remove(c)); + for (s = t.length - 1; s > -1; s--) + l = t[s], c = l.id, r.remove(c) ? o.set(c, l) : i.set(c, l); +}; +const defaultScale$1 = 1, defaultFont = "30px sans-serif", defaultStyle = LabelStyle$1.FILL, defaultFillColor = Color.WHITE, defaultOutlineColor$1 = Color.BLACK, defaultOutlineWidth$1 = 1, defaultShowBackground = !1, defaultBackgroundColor$1 = new Color(0.165, 0.165, 0.165, 0.8), defaultBackgroundPadding = new Cartesian2(7, 5), defaultPixelOffset = Cartesian2.ZERO, defaultEyeOffset = Cartesian3.ZERO, defaultHeightReference$1 = HeightReference$1.NONE, defaultHorizontalOrigin = HorizontalOrigin$1.CENTER, defaultVerticalOrigin = VerticalOrigin$1.CENTER, positionScratch$1 = new Cartesian3(), fillColorScratch = new Color(), outlineColorScratch$1 = new Color(), backgroundColorScratch = new Color(), backgroundPaddingScratch = new Cartesian2(), eyeOffsetScratch = new Cartesian3(), pixelOffsetScratch = new Cartesian2(), translucencyByDistanceScratch$1 = new NearFarScalar(), pixelOffsetScaleByDistanceScratch = new NearFarScalar(), scaleByDistanceScratch$1 = new NearFarScalar(), distanceDisplayConditionScratch$2 = new DistanceDisplayCondition(); +function EntityData$2(e) { + this.entity = e, this.label = void 0, this.index = void 0; +} +function LabelVisualizer(e, t) { + t.collectionChanged.addEventListener( + LabelVisualizer.prototype._onCollectionChanged, + this + ), this._cluster = e, this._entityCollection = t, this._items = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +LabelVisualizer.prototype.update = function(e) { + const t = this._items.values, n = this._cluster; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i], s = o.entity, c = s._label; + let l, d = o.label, f = s.isShowing && s.isAvailable(e) && Property.getValueOrDefault(c._show, e, !0), h; + if (f && (h = Property.getValueOrUndefined( + s._position, + e, + positionScratch$1 + ), l = Property.getValueOrUndefined(c._text, e), f = defined(h) && defined(l)), !f) { + returnPrimitive$1(o, s, n); + continue; + } + Property.isConstant(s._position) || (n._clusterDirty = !0); + let p = !1; + const m = Property.getValueOrDefault( + c._heightReference, + e, + defaultHeightReference$1 + ); + defined(d) || (d = n.getLabel(s), d.id = s, o.label = d, p = Cartesian3.equals(d.position, h) && d.heightReference === m), d.show = !0, d.position = h, d.text = l, d.scale = Property.getValueOrDefault( + c._scale, + e, + defaultScale$1 + ), d.font = Property.getValueOrDefault( + c._font, + e, + defaultFont + ), d.style = Property.getValueOrDefault( + c._style, + e, + defaultStyle + ), d.fillColor = Property.getValueOrDefault( + c._fillColor, + e, + defaultFillColor, + fillColorScratch + ), d.outlineColor = Property.getValueOrDefault( + c._outlineColor, + e, + defaultOutlineColor$1, + outlineColorScratch$1 + ), d.outlineWidth = Property.getValueOrDefault( + c._outlineWidth, + e, + defaultOutlineWidth$1 + ), d.showBackground = Property.getValueOrDefault( + c._showBackground, + e, + defaultShowBackground + ), d.backgroundColor = Property.getValueOrDefault( + c._backgroundColor, + e, + defaultBackgroundColor$1, + backgroundColorScratch + ), d.backgroundPadding = Property.getValueOrDefault( + c._backgroundPadding, + e, + defaultBackgroundPadding, + backgroundPaddingScratch + ), d.pixelOffset = Property.getValueOrDefault( + c._pixelOffset, + e, + defaultPixelOffset, + pixelOffsetScratch + ), d.eyeOffset = Property.getValueOrDefault( + c._eyeOffset, + e, + defaultEyeOffset, + eyeOffsetScratch + ), d.heightReference = m, d.horizontalOrigin = Property.getValueOrDefault( + c._horizontalOrigin, + e, + defaultHorizontalOrigin + ), d.verticalOrigin = Property.getValueOrDefault( + c._verticalOrigin, + e, + defaultVerticalOrigin + ), d.translucencyByDistance = Property.getValueOrUndefined( + c._translucencyByDistance, + e, + translucencyByDistanceScratch$1 + ), d.pixelOffsetScaleByDistance = Property.getValueOrUndefined( + c._pixelOffsetScaleByDistance, + e, + pixelOffsetScaleByDistanceScratch + ), d.scaleByDistance = Property.getValueOrUndefined( + c._scaleByDistance, + e, + scaleByDistanceScratch$1 + ), d.distanceDisplayCondition = Property.getValueOrUndefined( + c._distanceDisplayCondition, + e, + distanceDisplayConditionScratch$2 + ), d.disableDepthTestDistance = Property.getValueOrUndefined( + c._disableDepthTestDistance, + e + ), p && d._updateClamping(); + } + return !0; +}; +LabelVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = this._items.get(e.id); + if (!defined(n) || !defined(n.label)) + return BoundingSphereState$1.FAILED; + const i = n.label; + return t.center = Cartesian3.clone( + defaultValue(i._clampedPosition, i.position), + t.center + ), t.radius = 0, BoundingSphereState$1.DONE; +}; +LabelVisualizer.prototype.isDestroyed = function() { + return !1; +}; +LabelVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + LabelVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._entityCollection.values; + for (let t = 0; t < e.length; t++) + this._cluster.removeLabel(e[t]); + return destroyObject(this); +}; +LabelVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o; + const s = this._items, c = this._cluster; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._label) && defined(o._position) && s.set(o.id, new EntityData$2(o)); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._label) && defined(o._position) ? s.contains(o.id) || s.set(o.id, new EntityData$2(o)) : (returnPrimitive$1(s.get(o.id), o, c), s.remove(o.id)); + for (r = n.length - 1; r > -1; r--) + o = n[r], returnPrimitive$1(s.get(o.id), o, c), s.remove(o.id); +}; +function returnPrimitive$1(e, t, n) { + defined(e) && (e.label = void 0, n.removeLabel(t)); +} +const defaultScale = 1, defaultMinimumPixelSize = 0, defaultIncrementallyLoadTextures = !0, defaultClampAnimations = !0, defaultShadows$1 = ShadowMode$1.ENABLED, defaultHeightReference = HeightReference$1.NONE, defaultSilhouetteColor = Color.RED, defaultSilhouetteSize = 0, defaultColor$2 = Color.WHITE, defaultColorBlendMode = ColorBlendMode$1.HIGHLIGHT, defaultColorBlendAmount = 0.5, defaultImageBasedLightingFactor = new Cartesian2(1, 1), modelMatrixScratch = new Matrix4(), nodeMatrixScratch = new Matrix4(), scratchColor$5 = new Color(), scratchArray$2 = new Array(4), scratchCartesian$3 = new Cartesian3(); +function ModelVisualizer(e, t) { + t.collectionChanged.addEventListener( + ModelVisualizer.prototype._onCollectionChanged, + this + ), this._scene = e, this._primitives = e.primitives, this._entityCollection = t, this._modelHash = {}, this._entitiesToVisualize = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +async function createModelPrimitive(e, t, n, i) { + const r = e._primitives, o = e._modelHash; + try { + const s = await Model.fromGltfAsync({ + url: n, + incrementallyLoadTextures: i, + scene: e._scene + }); + if (e.isDestroyed() || !defined(o[t.id])) + return; + s.id = t, r.add(s), o[t.id].modelPrimitive = s, s.errorEvent.addEventListener((c) => { + defined(o[t.id]) && (console.log(c), c.name !== "TextureError" && s.incrementallyLoadTextures && (o[t.id].loadFailed = !0)); + }); + } catch (s) { + if (e.isDestroyed() || !defined(o[t.id])) + return; + console.log(s), o[t.id].loadFailed = !0; + } +} +ModelVisualizer.prototype.update = function(e) { + const t = this._entitiesToVisualize.values, n = this._modelHash, i = this._primitives; + for (let r = 0, o = t.length; r < o; r++) { + const s = t[r], c = s._model; + let l, d = n[s.id], f = s.isShowing && s.isAvailable(e) && Property.getValueOrDefault(c._show, e, !0), h; + if (f && (h = s.computeModelMatrix(e, modelMatrixScratch), l = Resource.createIfNeeded( + Property.getValueOrUndefined(c._uri, e) + ), f = defined(h) && defined(l)), !f) { + defined(d) && d.modelPrimitive && (d.modelPrimitive.show = !1); + continue; + } + if (!defined(d) || l.url !== d.url) { + defined(d == null ? void 0 : d.modelPrimitive) && (i.removeAndDestroy(d.modelPrimitive), delete n[s.id]), d = { + modelPrimitive: void 0, + url: l.url, + animationsRunning: !1, + nodeTransformationsScratch: {}, + articulationsScratch: {}, + loadFailed: !1, + modelUpdated: !1 + }, n[s.id] = d; + const _ = Property.getValueOrDefault( + c._incrementallyLoadTextures, + e, + defaultIncrementallyLoadTextures + ); + createModelPrimitive(this, s, l, _); + } + const p = d.modelPrimitive; + if (!defined(p)) + continue; + p.show = !0, p.scale = Property.getValueOrDefault( + c._scale, + e, + defaultScale + ), p.minimumPixelSize = Property.getValueOrDefault( + c._minimumPixelSize, + e, + defaultMinimumPixelSize + ), p.maximumScale = Property.getValueOrUndefined( + c._maximumScale, + e + ), p.modelMatrix = Matrix4.clone(h, p.modelMatrix), p.shadows = Property.getValueOrDefault( + c._shadows, + e, + defaultShadows$1 + ), p.heightReference = Property.getValueOrDefault( + c._heightReference, + e, + defaultHeightReference + ), p.distanceDisplayCondition = Property.getValueOrUndefined( + c._distanceDisplayCondition, + e + ), p.silhouetteColor = Property.getValueOrDefault( + c._silhouetteColor, + e, + defaultSilhouetteColor, + scratchColor$5 + ), p.silhouetteSize = Property.getValueOrDefault( + c._silhouetteSize, + e, + defaultSilhouetteSize + ), p.color = Property.getValueOrDefault( + c._color, + e, + defaultColor$2, + scratchColor$5 + ), p.colorBlendMode = Property.getValueOrDefault( + c._colorBlendMode, + e, + defaultColorBlendMode + ), p.colorBlendAmount = Property.getValueOrDefault( + c._colorBlendAmount, + e, + defaultColorBlendAmount + ), p.clippingPlanes = Property.getValueOrUndefined( + c._clippingPlanes, + e + ), p.clampAnimations = Property.getValueOrDefault( + c._clampAnimations, + e, + defaultClampAnimations + ), p.imageBasedLighting.imageBasedLightingFactor = Property.getValueOrDefault( + c._imageBasedLightingFactor, + e, + defaultImageBasedLightingFactor + ); + let m = Property.getValueOrUndefined( + c._lightColor, + e + ); + if (defined(m) && (Color.pack(m, scratchArray$2, 0), m = Cartesian3.unpack(scratchArray$2, 0, scratchCartesian$3)), p.lightColor = m, p.customShader = Property.getValueOrUndefined( + c._customShader, + e + ), n[s.id].modelUpdated = !0, p.ready) { + const _ = Property.getValueOrDefault( + c._runAnimations, + e, + !0 + ); + d.animationsRunning !== _ && (_ ? p.activeAnimations.addAll({ + loop: ModelAnimationLoop$1.REPEAT + }) : p.activeAnimations.removeAll(), d.animationsRunning = _); + const y = Property.getValueOrUndefined( + c._nodeTransformations, + e, + d.nodeTransformationsScratch + ); + if (defined(y)) { + const x = Object.keys(y); + for (let b = 0, S = x.length; b < S; ++b) { + const E = x[b], A = y[E]; + if (!defined(A)) + continue; + const D = p.getNode(E); + if (!defined(D)) + continue; + const P = Matrix4.fromTranslationRotationScale( + A, + nodeMatrixScratch + ); + D.matrix = Matrix4.multiply( + D.originalMatrix, + P, + P + ); + } + } + let C = !1; + const T = Property.getValueOrUndefined( + c._articulations, + e, + d.articulationsScratch + ); + if (defined(T)) { + const x = Object.keys(T); + for (let b = 0, S = x.length; b < S; ++b) { + const E = x[b], A = T[E]; + defined(A) && (C = !0, p.setArticulationStage(E, A)); + } + } + C && p.applyArticulations(); + } + } + return !0; +}; +ModelVisualizer.prototype.isDestroyed = function() { + return !1; +}; +ModelVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + ModelVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._entitiesToVisualize.values, t = this._modelHash, n = this._primitives; + for (let i = e.length - 1; i > -1; i--) + removeModel(this, e[i], t, n); + return destroyObject(this); +}; +const scratchPosition$5 = new Cartesian3(), scratchCartographic$8 = new Cartographic(); +ModelVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = this._modelHash[e.id]; + if (!defined(n) || n.loadFailed) + return BoundingSphereState$1.FAILED; + const i = n.modelPrimitive; + if (!defined(i) || !i.show || !i.ready || !n.modelUpdated) + return BoundingSphereState$1.PENDING; + const r = this._scene, o = defaultValue(r.ellipsoid, Ellipsoid.default); + if (i.heightReference !== HeightReference$1.NONE) { + const c = i.modelMatrix; + scratchPosition$5.x = c[12], scratchPosition$5.y = c[13], scratchPosition$5.z = c[14]; + const l = o.cartesianToCartographic( + scratchPosition$5, + scratchCartographic$8 + ), d = r.getHeight(l, i.heightReference); + return defined(d) && (isHeightReferenceClamp(i.heightReference) ? l.height = d : l.height += d), BoundingSphere.clone(i.boundingSphere, t), t.center = o.cartographicToCartesian(l), BoundingSphereState$1.DONE; + } + return BoundingSphere.clone(i.boundingSphere, t), BoundingSphereState$1.DONE; +}; +ModelVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o; + const s = this._entitiesToVisualize, c = this._modelHash, l = this._primitives; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._model) && defined(o._position) && s.set(o.id, o); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._model) && defined(o._position) ? (clearNodeTransformationsArticulationsScratch(o, c), s.set(o.id, o)) : (removeModel(this, o, c, l), s.remove(o.id)); + for (r = n.length - 1; r > -1; r--) + o = n[r], removeModel(this, o, c, l), s.remove(o.id); +}; +function removeModel(e, t, n, i) { + const r = n[t.id]; + defined(r) && (i.removeAndDestroy(r.modelPrimitive), delete n[t.id]); +} +function clearNodeTransformationsArticulationsScratch(e, t) { + const n = t[e.id]; + defined(n) && (n.nodeTransformationsScratch = {}, n.articulationsScratch = {}); +} +function ScaledPositionProperty(e) { + this._definitionChanged = new Event(), this._value = void 0, this._removeSubscription = void 0, this.setValue(e); +} +Object.defineProperties(ScaledPositionProperty.prototype, { + isConstant: { + get: function() { + return Property.isConstant(this._value); + } + }, + definitionChanged: { + get: function() { + return this._definitionChanged; + } + }, + referenceFrame: { + get: function() { + return defined(this._value) ? this._value.referenceFrame : ReferenceFrame$1.FIXED; + } + } +}); +const timeScratch = new JulianDate(); +ScaledPositionProperty.prototype.getValue = function(e, t) { + return defined(e) || (e = JulianDate.now(timeScratch)), this.getValueInReferenceFrame(e, ReferenceFrame$1.FIXED, t); +}; +ScaledPositionProperty.prototype.setValue = function(e) { + this._value !== e && (this._value = e, defined(this._removeSubscription) && (this._removeSubscription(), this._removeSubscription = void 0), defined(e) && (this._removeSubscription = e.definitionChanged.addEventListener( + this._raiseDefinitionChanged, + this + )), this._definitionChanged.raiseEvent(this)); +}; +ScaledPositionProperty.prototype.getValueInReferenceFrame = function(e, t, n) { + if (defined(this._value)) + return n = this._value.getValueInReferenceFrame(e, t, n), defined(n) ? Ellipsoid.default.scaleToGeodeticSurface(n, n) : void 0; +}; +ScaledPositionProperty.prototype.equals = function(e) { + return this === e || e instanceof ScaledPositionProperty && this._value === e._value; +}; +ScaledPositionProperty.prototype._raiseDefinitionChanged = function() { + this._definitionChanged.raiseEvent(this); +}; +const defaultResolution = 60, defaultWidth = 1, scratchTimeInterval = new TimeInterval(), subSampleCompositePropertyScratch = new TimeInterval(), subSampleIntervalPropertyScratch = new TimeInterval(); +function EntityData$1(e) { + this.entity = e, this.polyline = void 0, this.index = void 0, this.updater = void 0; +} +function subSampleSampledProperty(e, t, n, i, r, o, s, c, l) { + let d = c, f; + f = e.getValueInReferenceFrame(t, o, l[d]), defined(f) && (l[d++] = f); + let h = !defined(r) || JulianDate.lessThanOrEquals(r, t) || JulianDate.greaterThanOrEquals(r, n), p = 0; + const m = i.length; + let _ = i[p]; + const y = n; + let C = !1, T, x, b; + for (; p < m; ) { + if (!h && JulianDate.greaterThanOrEquals(_, r) && (f = e.getValueInReferenceFrame( + r, + o, + l[d] + ), defined(f) && (l[d++] = f), h = !0), JulianDate.greaterThan(_, t) && JulianDate.lessThan(_, y) && !_.equals(r) && (f = e.getValueInReferenceFrame( + _, + o, + l[d] + ), defined(f) && (l[d++] = f)), p < m - 1) { + if (s > 0 && !C) { + const S = i[p + 1], E = JulianDate.secondsDifference(S, _); + C = E > s, C && (T = Math.ceil(E / s), x = 0, b = E / Math.max(T, 2), T = Math.max(T - 1, 1)); + } + if (C && x < T) { + _ = JulianDate.addSeconds( + _, + b, + new JulianDate() + ), x++; + continue; + } + } + C = !1, p++, _ = i[p]; + } + return f = e.getValueInReferenceFrame(n, o, l[d]), defined(f) && (l[d++] = f), d; +} +function subSampleGenericProperty(e, t, n, i, r, o, s, c) { + let l, d = 0, f = s, h = t; + const p = Math.max(o, 60); + let m = !defined(i) || JulianDate.lessThanOrEquals(i, t) || JulianDate.greaterThanOrEquals(i, n); + for (; JulianDate.lessThan(h, n); ) + !m && JulianDate.greaterThanOrEquals(h, i) && (m = !0, l = e.getValueInReferenceFrame( + i, + r, + c[f] + ), defined(l) && (c[f] = l, f++)), l = e.getValueInReferenceFrame( + h, + r, + c[f] + ), defined(l) && (c[f] = l, f++), d++, h = JulianDate.addSeconds(t, p * d, new JulianDate()); + return l = e.getValueInReferenceFrame(n, r, c[f]), defined(l) && (c[f] = l, f++), f; +} +function subSampleIntervalProperty(e, t, n, i, r, o, s, c) { + subSampleIntervalPropertyScratch.start = t, subSampleIntervalPropertyScratch.stop = n; + let l = s; + const d = e.intervals; + for (let f = 0; f < d.length; f++) { + const h = d.get(f); + if (!TimeInterval.intersect( + h, + subSampleIntervalPropertyScratch, + scratchTimeInterval + ).isEmpty) { + let p = h.start; + h.isStartIncluded || (h.isStopIncluded ? p = h.stop : p = JulianDate.addSeconds( + h.start, + JulianDate.secondsDifference(h.stop, h.start) / 2, + new JulianDate() + )); + const m = e.getValueInReferenceFrame( + p, + r, + c[l] + ); + defined(m) && (c[l] = m, l++); + } + } + return l; +} +function subSampleConstantProperty(e, t, n, i, r, o, s, c) { + const l = e.getValueInReferenceFrame( + t, + r, + c[s] + ); + return defined(l) && (c[s++] = l), s; +} +function subSampleCompositeProperty(e, t, n, i, r, o, s, c) { + subSampleCompositePropertyScratch.start = t, subSampleCompositePropertyScratch.stop = n; + let l = s; + const d = e.intervals; + for (let f = 0; f < d.length; f++) { + const h = d.get(f); + if (!TimeInterval.intersect( + h, + subSampleCompositePropertyScratch, + scratchTimeInterval + ).isEmpty) { + const p = h.start, m = h.stop; + let _ = t; + JulianDate.greaterThan(p, _) && (_ = p); + let y = n; + JulianDate.lessThan(m, y) && (y = m), l = reallySubSample( + h.data, + _, + y, + i, + r, + o, + l, + c + ); + } + } + return l; +} +function reallySubSample(e, t, n, i, r, o, s, c) { + for (; e instanceof ReferenceProperty; ) + e = e.resolvedProperty; + if (e instanceof SampledPositionProperty) { + const l = e._property._times; + s = subSampleSampledProperty( + e, + t, + n, + l, + i, + r, + o, + s, + c + ); + } else e instanceof CompositePositionProperty ? s = subSampleCompositeProperty( + e, + t, + n, + i, + r, + o, + s, + c + ) : e instanceof TimeIntervalCollectionPositionProperty ? s = subSampleIntervalProperty( + e, + t, + n, + i, + r, + o, + s, + c + ) : e instanceof ConstantPositionProperty || e instanceof ScaledPositionProperty && Property.isConstant(e) ? s = subSampleConstantProperty( + e, + t, + n, + i, + r, + o, + s, + c + ) : s = subSampleGenericProperty( + e, + t, + n, + i, + r, + o, + s, + c + ); + return s; +} +function subSample(e, t, n, i, r, o, s) { + defined(s) || (s = []); + const c = reallySubSample( + e, + t, + n, + i, + r, + o, + 0, + s + ); + return s.length = c, s; +} +const toFixedScratch = new Matrix3(); +function PolylineUpdater(e, t) { + this._unusedIndexes = [], this._polylineCollection = new PolylineCollection(), this._scene = e, this._referenceFrame = t, e.primitives.add(this._polylineCollection); +} +PolylineUpdater.prototype.update = function(e) { + if (this._referenceFrame === ReferenceFrame$1.INERTIAL) { + const t = Transforms.computeIcrfToCentralBodyFixedMatrix( + e, + toFixedScratch + ); + Matrix4.fromRotationTranslation( + t, + Cartesian3.ZERO, + this._polylineCollection.modelMatrix + ); + } +}; +PolylineUpdater.prototype.updateObject = function(e, t) { + const n = t.entity, i = n._path, r = n._position; + let o, s; + const c = i._show; + let l = t.polyline, d = n.isShowing && n.isAvailable(e) && (!defined(c) || c.getValue(e)); + if (d) { + const h = Property.getValueOrUndefined(i._leadTime, e), p = Property.getValueOrUndefined( + i._trailTime, + e + ), m = n._availability, _ = defined(m), y = defined(h), C = defined(p); + if (d = _ || y && C, d) { + if (C && (o = JulianDate.addSeconds(e, -p, new JulianDate())), y && (s = JulianDate.addSeconds(e, h, new JulianDate())), _) { + const T = m.start, x = m.stop; + (!C || JulianDate.greaterThan(T, o)) && (o = T), (!y || JulianDate.lessThan(x, s)) && (s = x); + } + d = JulianDate.lessThan(o, s); + } + } + if (!d) { + defined(l) && (this._unusedIndexes.push(t.index), t.polyline = void 0, l.show = !1, t.index = void 0); + return; + } + if (!defined(l)) { + const h = this._unusedIndexes; + if (h.length > 0) { + const m = h.pop(); + l = this._polylineCollection.get(m), t.index = m; + } else + t.index = this._polylineCollection.length, l = this._polylineCollection.add(); + l.id = n, t.polyline = l; + } + const f = Property.getValueOrDefault( + i._resolution, + e, + defaultResolution + ); + l.show = !0, l.positions = subSample( + r, + o, + s, + e, + this._referenceFrame, + f, + l.positions.slice() + ), l.material = MaterialProperty.getValue( + e, + i._material, + l.material + ), l.width = Property.getValueOrDefault( + i._width, + e, + defaultWidth + ), l.distanceDisplayCondition = Property.getValueOrUndefined( + i._distanceDisplayCondition, + e, + l.distanceDisplayCondition + ); +}; +PolylineUpdater.prototype.removeObject = function(e) { + const t = e.polyline; + defined(t) && (this._unusedIndexes.push(e.index), e.polyline = void 0, t.show = !1, t.id = void 0, e.index = void 0); +}; +PolylineUpdater.prototype.destroy = function() { + return this._scene.primitives.remove(this._polylineCollection), destroyObject(this); +}; +function PathVisualizer(e, t) { + t.collectionChanged.addEventListener( + PathVisualizer.prototype._onCollectionChanged, + this + ), this._scene = e, this._updaters = {}, this._entityCollection = t, this._items = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +PathVisualizer.prototype.update = function(e) { + const t = this._updaters; + for (const i in t) + t.hasOwnProperty(i) && t[i].update(e); + const n = this._items.values; + if (n.length === 0 && defined(this._updaters) && Object.keys(this._updaters).length > 0) { + for (const i in t) + t.hasOwnProperty(i) && t[i].destroy(); + this._updaters = {}; + } + for (let i = 0, r = n.length; i < r; i++) { + const o = n[i], c = o.entity._position, l = o.updater; + let d = ReferenceFrame$1.FIXED; + this._scene.mode === SceneMode$1.SCENE3D && (d = c.referenceFrame); + let f = this._updaters[d]; + if (l === f && defined(f)) { + f.updateObject(e, o); + continue; + } + defined(l) && l.removeObject(o), defined(f) || (f = new PolylineUpdater(this._scene, d), f.update(e), this._updaters[d] = f), o.updater = f, defined(f) && f.updateObject(e, o); + } + return !0; +}; +PathVisualizer.prototype.isDestroyed = function() { + return !1; +}; +PathVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + PathVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._updaters; + for (const t in e) + e.hasOwnProperty(t) && e[t].destroy(); + return destroyObject(this); +}; +PathVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o, s; + const c = this._items; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._path) && defined(o._position) && c.set(o.id, new EntityData$1(o)); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._path) && defined(o._position) ? c.contains(o.id) || c.set(o.id, new EntityData$1(o)) : (s = c.get(o.id), defined(s) && (defined(s.updater) && s.updater.removeObject(s), c.remove(o.id))); + for (r = n.length - 1; r > -1; r--) + o = n[r], s = c.get(o.id), defined(s) && (defined(s.updater) && s.updater.removeObject(s), c.remove(o.id)); +}; +PathVisualizer._subSample = subSample; +const defaultColor$1 = Color.WHITE, defaultOutlineColor = Color.BLACK, defaultOutlineWidth = 0, defaultPixelSize = 1, defaultDisableDepthTestDistance = 0, defaultSplitDirection = SplitDirection$1.NONE, colorScratch$2 = new Color(), positionScratch = new Cartesian3(), outlineColorScratch = new Color(), scaleByDistanceScratch = new NearFarScalar(), translucencyByDistanceScratch = new NearFarScalar(), distanceDisplayConditionScratch$1 = new DistanceDisplayCondition(); +function EntityData(e) { + this.entity = e, this.pointPrimitive = void 0, this.billboard = void 0, this.color = void 0, this.outlineColor = void 0, this.pixelSize = void 0, this.outlineWidth = void 0; +} +function PointVisualizer(e, t) { + t.collectionChanged.addEventListener( + PointVisualizer.prototype._onCollectionChanged, + this + ), this._cluster = e, this._entityCollection = t, this._items = new AssociativeArray(), this._onCollectionChanged(t, t.values, [], []); +} +PointVisualizer.prototype.update = function(e) { + const t = this._items.values, n = this._cluster; + for (let i = 0, r = t.length; i < r; i++) { + const o = t[i], s = o.entity, c = s._point; + let l = o.pointPrimitive, d = o.billboard; + const f = Property.getValueOrDefault( + c._heightReference, + e, + HeightReference$1.NONE + ); + let h = s.isShowing && s.isAvailable(e) && Property.getValueOrDefault(c._show, e, !0), p; + if (h && (p = Property.getValueOrUndefined( + s._position, + e, + positionScratch + ), h = defined(p)), !h) { + returnPrimitive(o, s, n); + continue; + } + Property.isConstant(s._position) || (n._clusterDirty = !0); + let m = !1, _ = !1; + if (f !== HeightReference$1.NONE && !defined(d) ? (defined(l) && (returnPrimitive(o, s, n), l = void 0), d = n.getBillboard(s), d.id = s, d.image = void 0, o.billboard = d, m = !0, _ = Cartesian3.equals(d.position, p) && d.heightReference === f) : f === HeightReference$1.NONE && !defined(l) && (defined(d) && (returnPrimitive(o, s, n), d = void 0), l = n.getPoint(s), l.id = s, o.pointPrimitive = l), defined(l)) + l.show = !0, l.position = p, l.scaleByDistance = Property.getValueOrUndefined( + c._scaleByDistance, + e, + scaleByDistanceScratch + ), l.translucencyByDistance = Property.getValueOrUndefined( + c._translucencyByDistance, + e, + translucencyByDistanceScratch + ), l.color = Property.getValueOrDefault( + c._color, + e, + defaultColor$1, + colorScratch$2 + ), l.outlineColor = Property.getValueOrDefault( + c._outlineColor, + e, + defaultOutlineColor, + outlineColorScratch + ), l.outlineWidth = Property.getValueOrDefault( + c._outlineWidth, + e, + defaultOutlineWidth + ), l.pixelSize = Property.getValueOrDefault( + c._pixelSize, + e, + defaultPixelSize + ), l.distanceDisplayCondition = Property.getValueOrUndefined( + c._distanceDisplayCondition, + e, + distanceDisplayConditionScratch$1 + ), l.disableDepthTestDistance = Property.getValueOrDefault( + c._disableDepthTestDistance, + e, + defaultDisableDepthTestDistance + ), l.splitDirection = Property.getValueOrDefault( + c._splitDirection, + e, + defaultSplitDirection + ); + else if (defined(d)) { + d.show = !0, d.position = p, d.scaleByDistance = Property.getValueOrUndefined( + c._scaleByDistance, + e, + scaleByDistanceScratch + ), d.translucencyByDistance = Property.getValueOrUndefined( + c._translucencyByDistance, + e, + translucencyByDistanceScratch + ), d.distanceDisplayCondition = Property.getValueOrUndefined( + c._distanceDisplayCondition, + e, + distanceDisplayConditionScratch$1 + ), d.disableDepthTestDistance = Property.getValueOrDefault( + c._disableDepthTestDistance, + e, + defaultDisableDepthTestDistance + ), d.splitDirection = Property.getValueOrDefault( + c._splitDirection, + e, + defaultSplitDirection + ), d.heightReference = f; + const y = Property.getValueOrDefault( + c._color, + e, + defaultColor$1, + colorScratch$2 + ), C = Property.getValueOrDefault( + c._outlineColor, + e, + defaultOutlineColor, + outlineColorScratch + ), T = Math.round( + Property.getValueOrDefault( + c._outlineWidth, + e, + defaultOutlineWidth + ) + ); + let x = Math.max( + 1, + Math.round( + Property.getValueOrDefault( + c._pixelSize, + e, + defaultPixelSize + ) + ) + ); + if (T > 0 ? (d.scale = 1, m = m || // + T !== o.outlineWidth || // + x !== o.pixelSize || // + !Color.equals(y, o.color) || // + !Color.equals(C, o.outlineColor)) : (d.scale = x / 50, x = 50, m = m || // + T !== o.outlineWidth || // + !Color.equals(y, o.color) || // + !Color.equals(C, o.outlineColor)), m) { + o.color = Color.clone(y, o.color), o.outlineColor = Color.clone(C, o.outlineColor), o.pixelSize = x, o.outlineWidth = T; + const b = y.alpha, S = y.toCssColorString(), E = C.toCssColorString(), A = JSON.stringify([ + S, + x, + E, + T + ]); + d.setImage( + A, + createBillboardPointCallback( + b, + S, + E, + T, + x + ) + ); + } + _ && d._updateClamping(); + } + } + return !0; +}; +PointVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = this._items.get(e.id); + if (!defined(n) || !(defined(n.pointPrimitive) || defined(n.billboard))) + return BoundingSphereState$1.FAILED; + if (defined(n.pointPrimitive)) + t.center = Cartesian3.clone( + n.pointPrimitive.position, + t.center + ); + else { + const i = n.billboard; + if (!defined(i._clampedPosition)) + return BoundingSphereState$1.PENDING; + t.center = Cartesian3.clone(i._clampedPosition, t.center); + } + return t.radius = 0, BoundingSphereState$1.DONE; +}; +PointVisualizer.prototype.isDestroyed = function() { + return !1; +}; +PointVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + PointVisualizer.prototype._onCollectionChanged, + this + ); + const e = this._entityCollection.values; + for (let t = 0; t < e.length; t++) + this._cluster.removePoint(e[t]); + return destroyObject(this); +}; +PointVisualizer.prototype._onCollectionChanged = function(e, t, n, i) { + let r, o; + const s = this._items, c = this._cluster; + for (r = t.length - 1; r > -1; r--) + o = t[r], defined(o._point) && defined(o._position) && s.set(o.id, new EntityData(o)); + for (r = i.length - 1; r > -1; r--) + o = i[r], defined(o._point) && defined(o._position) ? s.contains(o.id) || s.set(o.id, new EntityData(o)) : (returnPrimitive(s.get(o.id), o, c), s.remove(o.id)); + for (r = n.length - 1; r > -1; r--) + o = n[r], returnPrimitive(s.get(o.id), o, c), s.remove(o.id); +}; +function returnPrimitive(e, t, n) { + if (defined(e)) { + const i = e.pointPrimitive; + if (defined(i)) { + e.pointPrimitive = void 0, n.removePoint(t); + return; + } + const r = e.billboard; + defined(r) && (e.billboard = void 0, n.removeBillboard(t)); + } +} +const scratchInterpolateColorsArray = []; +function interpolateColors$1(e, t, n, i, r) { + const o = scratchInterpolateColorsArray; + o.length = r; + let s; + const c = n.red, l = n.green, d = n.blue, f = n.alpha, h = i.red, p = i.green, m = i.blue, _ = i.alpha; + if (Color.equals(n, i)) { + for (s = 0; s < r; s++) + o[s] = Color.clone(n); + return o; + } + const y = (h - c) / r, C = (p - l) / r, T = (m - d) / r, x = (_ - f) / r; + for (s = 0; s < r; s++) + o[s] = new Color( + c + s * y, + l + s * C, + d + s * T, + f + s * x + ); + return o; +} +function PolylineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.colors, i = defaultValue(e.width, 1), r = defaultValue(e.colorsPerVertex, !1); + this._positions = t, this._colors = n, this._width = i, this._colorsPerVertex = r, this._vertexFormat = VertexFormat.clone( + defaultValue(e.vertexFormat, VertexFormat.DEFAULT) + ), this._arcType = defaultValue(e.arcType, ArcType$1.GEODESIC), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._ellipsoid = Ellipsoid.clone( + defaultValue(e.ellipsoid, Ellipsoid.default) + ), this._workerName = "createPolylineGeometry"; + let o = 1 + t.length * Cartesian3.packedLength; + o += defined(n) ? 1 + n.length * Color.packedLength : 1, this.packedLength = o + Ellipsoid.packedLength + VertexFormat.packedLength + 4; +} +PolylineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._colors; + for (o = defined(s) ? s.length : 0, t[n++] = o, i = 0; i < o; ++i, n += Color.packedLength) + Color.pack(s[i], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n++] = e._width, t[n++] = e._colorsPerVertex ? 1 : 0, t[n++] = e._arcType, t[n] = e._granularity, t; +}; +const scratchEllipsoid$1 = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), scratchVertexFormat$1 = new VertexFormat(), scratchOptions$3 = { + positions: void 0, + colors: void 0, + ellipsoid: scratchEllipsoid$1, + vertexFormat: scratchVertexFormat$1, + width: void 0, + colorsPerVertex: void 0, + arcType: void 0, + granularity: void 0 +}; +PolylineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + const s = r > 0 ? new Array(r) : void 0; + for (i = 0; i < r; ++i, t += Color.packedLength) + s[i] = Color.unpack(e, t); + const c = Ellipsoid.unpack(e, t, scratchEllipsoid$1); + t += Ellipsoid.packedLength; + const l = VertexFormat.unpack( + e, + t, + scratchVertexFormat$1 + ); + t += VertexFormat.packedLength; + const d = e[t++], f = e[t++] === 1, h = e[t++], p = e[t]; + return defined(n) ? (n._positions = o, n._colors = s, n._ellipsoid = Ellipsoid.clone(c, n._ellipsoid), n._vertexFormat = VertexFormat.clone(l, n._vertexFormat), n._width = d, n._colorsPerVertex = f, n._arcType = h, n._granularity = p, n) : (scratchOptions$3.positions = o, scratchOptions$3.colors = s, scratchOptions$3.width = d, scratchOptions$3.colorsPerVertex = f, scratchOptions$3.arcType = h, scratchOptions$3.granularity = p, new PolylineGeometry(scratchOptions$3)); +}; +const scratchCartesian3$5 = new Cartesian3(), scratchPosition$4 = new Cartesian3(), scratchPrevPosition = new Cartesian3(), scratchNextPosition = new Cartesian3(); +PolylineGeometry.createGeometry = function(e) { + const t = e._width, n = e._vertexFormat; + let i = e._colors; + const r = e._colorsPerVertex, o = e._arcType, s = e._granularity, c = e._ellipsoid; + let l, d, f; + const h = []; + let p = arrayRemoveDuplicates( + e._positions, + Cartesian3.equalsEpsilon, + !1, + h + ); + if (defined(i) && h.length > 0) { + let O = 0, N = h[0]; + i = i.filter(function(F, B) { + let V = !1; + return r ? V = B === N || B === 0 && N === 1 : V = B + 1 === N, V ? (O++, N = h[O], !1) : !0; + }); + } + let m = p.length; + if (m < 2 || t <= 0) + return; + if (o === ArcType$1.GEODESIC || o === ArcType$1.RHUMB) { + let O, N; + o === ArcType$1.GEODESIC ? (O = CesiumMath.chordLength( + s, + c.maximumRadius + ), N = PolylinePipeline.numberOfPoints) : (O = s, N = PolylinePipeline.numberOfPointsRhumbLine); + const F = PolylinePipeline.extractHeights(p, c); + if (defined(i)) { + let B = 1; + for (l = 0; l < m - 1; ++l) + B += N( + p[l], + p[l + 1], + O + ); + const V = new Array(B); + let U = 0; + for (l = 0; l < m - 1; ++l) { + const k = p[l], $ = p[l + 1], G = i[l], q = N(k, $, O); + if (r && l < B) { + const z = i[l + 1], H = interpolateColors$1( + k, + $, + G, + z, + q + ), Q = H.length; + for (d = 0; d < Q; ++d) + V[U++] = H[d]; + } else + for (d = 0; d < q; ++d) + V[U++] = Color.clone(G); + } + V[U] = Color.clone(i[i.length - 1]), i = V, scratchInterpolateColorsArray.length = 0; + } + o === ArcType$1.GEODESIC ? p = PolylinePipeline.generateCartesianArc({ + positions: p, + minDistance: O, + ellipsoid: c, + height: F + }) : p = PolylinePipeline.generateCartesianRhumbArc({ + positions: p, + granularity: O, + ellipsoid: c, + height: F + }); + } + m = p.length; + const _ = m * 4 - 4, y = new Float64Array(_ * 3), C = new Float64Array(_ * 3), T = new Float64Array(_ * 3), x = new Float32Array(_ * 2), b = n.st ? new Float32Array(_ * 2) : void 0, S = defined(i) ? new Uint8Array(_ * 4) : void 0; + let E = 0, A = 0, D = 0, P = 0, I; + for (d = 0; d < m; ++d) { + d === 0 ? (I = scratchCartesian3$5, Cartesian3.subtract(p[0], p[1], I), Cartesian3.add(p[0], I, I)) : I = p[d - 1], Cartesian3.clone(I, scratchPrevPosition), Cartesian3.clone(p[d], scratchPosition$4), d === m - 1 ? (I = scratchCartesian3$5, Cartesian3.subtract( + p[m - 1], + p[m - 2], + I + ), Cartesian3.add(p[m - 1], I, I)) : I = p[d + 1], Cartesian3.clone(I, scratchNextPosition); + let O, N; + defined(S) && (d !== 0 && !r ? O = i[d - 1] : O = i[d], d !== m - 1 && (N = i[d])); + const F = d === 0 ? 2 : 0, B = d === m - 1 ? 2 : 4; + for (f = F; f < B; ++f) { + Cartesian3.pack(scratchPosition$4, y, E), Cartesian3.pack(scratchPrevPosition, C, E), Cartesian3.pack(scratchNextPosition, T, E), E += 3; + const V = f - 2 < 0 ? -1 : 1; + if (x[A++] = 2 * (f % 2) - 1, x[A++] = V * t, n.st && (b[D++] = d / (m - 1), b[D++] = Math.max(x[A - 2], 0)), defined(S)) { + const U = f < 2 ? O : N; + S[P++] = Color.floatToByte(U.red), S[P++] = Color.floatToByte(U.green), S[P++] = Color.floatToByte(U.blue), S[P++] = Color.floatToByte(U.alpha); + } + } + } + const M = new GeometryAttributes(); + M.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: y + }), M.prevPosition = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: C + }), M.nextPosition = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: T + }), M.expandAndWidth = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: x + }), n.st && (M.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: b + })), defined(S) && (M.color = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 4, + values: S, + normalize: !0 + })); + const R = IndexDatatype$1.createTypedArray(_, m * 6 - 6); + let L = 0, g = 0; + const w = m - 1; + for (d = 0; d < w; ++d) + R[g++] = L, R[g++] = L + 2, R[g++] = L + 1, R[g++] = L + 1, R[g++] = L + 2, R[g++] = L + 3, L += 4; + return new Geometry({ + attributes: M, + indices: R, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: BoundingSphere.fromPoints(p), + geometryType: GeometryType$1.POLYLINES + }); +}; +const defaultZIndex = new ConstantProperty(0), polylineCollections = {}, scratchColor$4 = new Color(), defaultMaterial = new ColorMaterialProperty(Color.WHITE), defaultShow = new ConstantProperty(!0), defaultShadows = new ConstantProperty(ShadowMode$1.DISABLED), defaultDistanceDisplayCondition$1 = new ConstantProperty( + new DistanceDisplayCondition() +), defaultClassificationType = new ConstantProperty(ClassificationType$1.BOTH); +function GeometryOptions() { + this.vertexFormat = void 0, this.positions = void 0, this.width = void 0, this.arcType = void 0, this.granularity = void 0; +} +function GroundGeometryOptions() { + this.positions = void 0, this.width = void 0, this.arcType = void 0, this.granularity = void 0; +} +function PolylineGeometryUpdater(e, t) { + this._entity = e, this._scene = t, this._entitySubscription = e.definitionChanged.addEventListener( + PolylineGeometryUpdater.prototype._onEntityPropertyChanged, + this + ), this._fillEnabled = !1, this._dynamic = !1, this._geometryChanged = new Event(), this._showProperty = void 0, this._materialProperty = void 0, this._shadowsProperty = void 0, this._distanceDisplayConditionProperty = void 0, this._classificationTypeProperty = void 0, this._depthFailMaterialProperty = void 0, this._geometryOptions = new GeometryOptions(), this._groundGeometryOptions = new GroundGeometryOptions(), this._id = `polyline-${e.id}`, this._clampToGround = !1, this._supportsPolylinesOnTerrain = Entity.supportsPolylinesOnTerrain(t), this._zIndex = 0, this._onEntityPropertyChanged(e, "polyline", e.polyline, void 0); +} +Object.defineProperties(PolylineGeometryUpdater.prototype, { + /** + * Gets the unique ID associated with this updater + * @memberof PolylineGeometryUpdater.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets the entity associated with this geometry. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {Entity} + * @readonly + */ + entity: { + get: function() { + return this._entity; + } + }, + /** + * Gets a value indicating if the geometry has a fill component. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + fillEnabled: { + get: function() { + return this._fillEnabled; + } + }, + /** + * Gets a value indicating if fill visibility varies with simulation time. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + hasConstantFill: { + get: function() { + return !this._fillEnabled || !defined(this._entity.availability) && Property.isConstant(this._showProperty); + } + }, + /** + * Gets the material property used to fill the geometry. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {MaterialProperty} + * @readonly + */ + fillMaterialProperty: { + get: function() { + return this._materialProperty; + } + }, + /** + * Gets the material property used to fill the geometry when it fails the depth test. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {MaterialProperty} + * @readonly + */ + depthFailMaterialProperty: { + get: function() { + return this._depthFailMaterialProperty; + } + }, + /** + * Gets a value indicating if the geometry has an outline component. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + outlineEnabled: { + value: !1 + }, + /** + * Gets a value indicating if outline visibility varies with simulation time. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + hasConstantOutline: { + value: !0 + }, + /** + * Gets the {@link Color} property for the geometry outline. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + outlineColorProperty: { + value: void 0 + }, + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + shadowsProperty: { + get: function() { + return this._shadowsProperty; + } + }, + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + distanceDisplayConditionProperty: { + get: function() { + return this._distanceDisplayConditionProperty; + } + }, + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {Property} + * @readonly + */ + classificationTypeProperty: { + get: function() { + return this._classificationTypeProperty; + } + }, + /** + * Gets a value indicating if the geometry is time-varying. + * + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + isDynamic: { + get: function() { + return this._dynamic; + } + }, + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + isClosed: { + value: !1 + }, + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + geometryChanged: { + get: function() { + return this._geometryChanged; + } + }, + /** + * Gets a value indicating if the path of the line. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {ArcType} + * @readonly + */ + arcType: { + get: function() { + return this._arcType; + } + }, + /** + * Gets a value indicating if the geometry is clamped to the ground. + * Returns false if polylines on terrain is not supported. + * @memberof PolylineGeometryUpdater.prototype + * + * @type {boolean} + * @readonly + */ + clampToGround: { + get: function() { + return this._clampToGround && this._supportsPolylinesOnTerrain; + } + }, + /** + * Gets the zindex + * @type {number} + * @memberof PolylineGeometryUpdater.prototype + * @readonly + */ + zIndex: { + get: function() { + return this._zIndex; + } + } +}); +PolylineGeometryUpdater.prototype.isOutlineVisible = function(e) { + return !1; +}; +PolylineGeometryUpdater.prototype.isFilled = function(e) { + const t = this._entity, n = this._fillEnabled && t.isAvailable(e) && this._showProperty.getValue(e); + return defaultValue(n, !1); +}; +PolylineGeometryUpdater.prototype.createFillGeometryInstance = function(e) { + const t = this._entity, n = t.isAvailable(e), i = new ShowGeometryInstanceAttribute( + n && t.isShowing && this._showProperty.getValue(e) + ), r = this._distanceDisplayConditionProperty.getValue( + e + ), o = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition( + r + ), s = { + show: i, + distanceDisplayCondition: o + }; + let c; + return this._materialProperty instanceof ColorMaterialProperty && (defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || n) && (c = this._materialProperty.color.getValue(e, scratchColor$4)), defined(c) || (c = Color.WHITE), s.color = ColorGeometryInstanceAttribute.fromColor(c)), this.clampToGround ? new GeometryInstance({ + id: t, + geometry: new GroundPolylineGeometry(this._groundGeometryOptions), + attributes: s + }) : (defined(this._depthFailMaterialProperty) && this._depthFailMaterialProperty instanceof ColorMaterialProperty && (defined(this._depthFailMaterialProperty.color) && (this._depthFailMaterialProperty.color.isConstant || n) && (c = this._depthFailMaterialProperty.color.getValue( + e, + scratchColor$4 + )), defined(c) || (c = Color.WHITE), s.depthFailColor = ColorGeometryInstanceAttribute.fromColor( + c + )), new GeometryInstance({ + id: t, + geometry: new PolylineGeometry(this._geometryOptions), + attributes: s + })); +}; +PolylineGeometryUpdater.prototype.createOutlineGeometryInstance = function(e) { +}; +PolylineGeometryUpdater.prototype.isDestroyed = function() { + return !1; +}; +PolylineGeometryUpdater.prototype.destroy = function() { + this._entitySubscription(), destroyObject(this); +}; +PolylineGeometryUpdater.prototype._onEntityPropertyChanged = function(e, t, n, i) { + if (!(t === "availability" || t === "polyline")) + return; + const r = this._entity.polyline; + if (!defined(r)) { + this._fillEnabled && (this._fillEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + const o = r.positions, s = r.show; + if (defined(s) && s.isConstant && !s.getValue(Iso8601.MINIMUM_VALUE) || // + !defined(o)) { + this._fillEnabled && (this._fillEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + const c = r.zIndex, l = defaultValue(r.material, defaultMaterial), d = l instanceof ColorMaterialProperty; + this._materialProperty = l, this._depthFailMaterialProperty = r.depthFailMaterial, this._showProperty = defaultValue(s, defaultShow), this._shadowsProperty = defaultValue(r.shadows, defaultShadows), this._distanceDisplayConditionProperty = defaultValue( + r.distanceDisplayCondition, + defaultDistanceDisplayCondition$1 + ), this._classificationTypeProperty = defaultValue( + r.classificationType, + defaultClassificationType + ), this._fillEnabled = !0, this._zIndex = defaultValue(c, defaultZIndex); + const f = r.width, h = r.arcType, p = r.clampToGround, m = r.granularity; + if (!o.isConstant || !Property.isConstant(f) || !Property.isConstant(h) || !Property.isConstant(m) || !Property.isConstant(p) || !Property.isConstant(c)) + this._dynamic || (this._dynamic = !0, this._geometryChanged.raiseEvent(this)); + else { + const _ = this._geometryOptions, y = o.getValue( + Iso8601.MINIMUM_VALUE, + _.positions + ); + if (!defined(y) || y.length < 2) { + this._fillEnabled && (this._fillEnabled = !1, this._geometryChanged.raiseEvent(this)); + return; + } + let C; + d && (!defined(this._depthFailMaterialProperty) || this._depthFailMaterialProperty instanceof ColorMaterialProperty) ? C = PolylineColorAppearance.VERTEX_FORMAT : C = PolylineMaterialAppearance.VERTEX_FORMAT, _.vertexFormat = C, _.positions = y, _.width = defined(f) ? f.getValue(Iso8601.MINIMUM_VALUE) : void 0, _.arcType = defined(h) ? h.getValue(Iso8601.MINIMUM_VALUE) : void 0, _.granularity = defined(m) ? m.getValue(Iso8601.MINIMUM_VALUE) : void 0; + const T = this._groundGeometryOptions; + T.positions = y, T.width = _.width, T.arcType = _.arcType, T.granularity = _.granularity, this._clampToGround = defined(p) ? p.getValue(Iso8601.MINIMUM_VALUE) : !1, !this._clampToGround && defined(c) && oneTimeWarning( + "Entity polylines must have clampToGround: true when using zIndex. zIndex will be ignored." + ), this._dynamic = !1, this._geometryChanged.raiseEvent(this); + } +}; +PolylineGeometryUpdater.prototype.createDynamicUpdater = function(e, t) { + return new DynamicGeometryUpdater(e, t, this); +}; +const generateCartesianArcOptions = { + positions: void 0, + granularity: void 0, + height: void 0, + ellipsoid: void 0 +}; +function DynamicGeometryUpdater(e, t, n) { + this._line = void 0, this._primitives = e, this._groundPrimitives = t, this._groundPolylinePrimitive = void 0, this._material = void 0, this._geometryUpdater = n, this._positions = []; +} +function getLine(e) { + if (defined(e._line)) + return e._line; + const t = e._primitives, n = e._geometryUpdater._scene.id + t._guid; + let i = polylineCollections[n]; + !defined(i) || i.isDestroyed() ? (i = new PolylineCollection(), polylineCollections[n] = i, t.add(i)) : t.contains(i) || t.add(i); + const r = i.add(); + return r.id = e._geometryUpdater._entity, e._line = r, r; +} +DynamicGeometryUpdater.prototype.update = function(e) { + const t = this._geometryUpdater, n = t._entity, i = n.polyline, r = i.positions; + let o = Property.getValueOrUndefined( + r, + e, + this._positions + ); + t._clampToGround = Property.getValueOrDefault( + i._clampToGround, + e, + !1 + ), t._groundGeometryOptions.positions = o, t._groundGeometryOptions.width = Property.getValueOrDefault( + i._width, + e, + 1 + ), t._groundGeometryOptions.arcType = Property.getValueOrDefault( + i._arcType, + e, + ArcType$1.GEODESIC + ), t._groundGeometryOptions.granularity = Property.getValueOrDefault( + i._granularity, + e, + 9999 + ); + const s = this._groundPrimitives; + if (defined(this._groundPolylinePrimitive) && (s.remove(this._groundPolylinePrimitive), this._groundPolylinePrimitive = void 0), t.clampToGround) { + if (!n.isShowing || !n.isAvailable(e) || !Property.getValueOrDefault(i._show, e, !0) || !defined(o) || o.length < 2) + return; + const h = t.fillMaterialProperty; + let p; + if (h instanceof ColorMaterialProperty) + p = new PolylineColorAppearance(); + else { + const m = MaterialProperty.getValue( + e, + h, + this._material + ); + p = new PolylineMaterialAppearance({ + material: m, + translucent: m.isTranslucent() + }), this._material = m; + } + this._groundPolylinePrimitive = s.add( + new GroundPolylinePrimitive({ + geometryInstances: t.createFillGeometryInstance(e), + appearance: p, + classificationType: t.classificationTypeProperty.getValue( + e + ), + asynchronous: !1 + }), + Property.getValueOrUndefined(t.zIndex, e) + ), defined(this._line) && (this._line.show = !1); + return; + } + const c = getLine(this); + if (!n.isShowing || !n.isAvailable(e) || !Property.getValueOrDefault(i._show, e, !0)) { + c.show = !1; + return; + } + if (!defined(o) || o.length < 2) { + c.show = !1; + return; + } + let l = ArcType$1.GEODESIC; + l = Property.getValueOrDefault(i._arcType, e, l); + const d = t._scene.globe, f = t._scene.ellipsoid; + l !== ArcType$1.NONE && defined(d) && (generateCartesianArcOptions.ellipsoid = f, generateCartesianArcOptions.positions = o, generateCartesianArcOptions.granularity = Property.getValueOrUndefined( + i._granularity, + e + ), generateCartesianArcOptions.height = PolylinePipeline.extractHeights( + o, + f + ), l === ArcType$1.GEODESIC ? o = PolylinePipeline.generateCartesianArc( + generateCartesianArcOptions + ) : o = PolylinePipeline.generateCartesianRhumbArc( + generateCartesianArcOptions + )), c.show = !0, c.positions = o.slice(), c.material = MaterialProperty.getValue( + e, + t.fillMaterialProperty, + c.material + ), c.width = Property.getValueOrDefault(i._width, e, 1), c.distanceDisplayCondition = Property.getValueOrUndefined( + i._distanceDisplayCondition, + e, + c.distanceDisplayCondition + ); +}; +DynamicGeometryUpdater.prototype.getBoundingSphere = function(e) { + if (this._geometryUpdater.clampToGround) { + const t = this._groundPolylinePrimitive; + if (defined(t) && t.show && t.ready) { + const n = t.getGeometryInstanceAttributes( + this._geometryUpdater._entity + ); + if (defined(n) && defined(n.boundingSphere)) + return BoundingSphere.clone(n.boundingSphere, e), BoundingSphereState$1.DONE; + } + return defined(t) && !t.ready ? BoundingSphereState$1.PENDING : BoundingSphereState$1.DONE; + } else { + const t = getLine(this); + if (t.show && t.positions.length > 0) + return BoundingSphere.fromPoints(t.positions, e), BoundingSphereState$1.DONE; + } + return BoundingSphereState$1.FAILED; +}; +DynamicGeometryUpdater.prototype.isDestroyed = function() { + return !1; +}; +DynamicGeometryUpdater.prototype.destroy = function() { + const t = this._geometryUpdater._scene.id + this._primitives._guid, n = polylineCollections[t]; + defined(n) && (n.remove(this._line), n.length === 0 && (this._primitives.removeAndDestroy(n), delete polylineCollections[t])), defined(this._groundPolylinePrimitive) && this._groundPrimitives.remove(this._groundPolylinePrimitive), destroyObject(this); +}; +const scratchColor$3 = new Color(), distanceDisplayConditionScratch = new DistanceDisplayCondition(), defaultDistanceDisplayCondition = new DistanceDisplayCondition(); +function Batch(e, t, n, i, r) { + let o; + n instanceof ColorMaterialProperty ? o = PolylineColorAppearance : o = PolylineMaterialAppearance, this.orderedGroundPrimitives = e, this.classificationType = t, this.appearanceType = o, this.materialProperty = n, this.updaters = new AssociativeArray(), this.createPrimitive = !0, this.primitive = void 0, this.oldPrimitive = void 0, this.geometry = new AssociativeArray(), this.material = void 0, this.updatersWithAttributes = new AssociativeArray(), this.attributes = new AssociativeArray(), this.invalidated = !1, this.removeMaterialSubscription = n.definitionChanged.addEventListener( + Batch.prototype.onMaterialChanged, + this + ), this.subscriptions = new AssociativeArray(), this.showsUpdated = new AssociativeArray(), this.zIndex = i, this._asynchronous = r; +} +Batch.prototype.onMaterialChanged = function() { + this.invalidated = !0; +}; +Batch.prototype.isMaterial = function(e) { + const t = this.materialProperty, n = e.fillMaterialProperty; + return n === t || n instanceof ColorMaterialProperty && t instanceof ColorMaterialProperty ? !0 : defined(t) && t.equals(n); +}; +Batch.prototype.add = function(e, t, n) { + const i = t.id; + if (this.updaters.set(i, t), this.geometry.set(i, n), !t.hasConstantFill || !t.fillMaterialProperty.isConstant || !Property.isConstant(t.distanceDisplayConditionProperty)) + this.updatersWithAttributes.set(i, t); + else { + const r = this; + this.subscriptions.set( + i, + t.entity.definitionChanged.addEventListener(function(o, s, c, l) { + s === "isShowing" && r.showsUpdated.set(t.id, t); + }) + ); + } + this.createPrimitive = !0; +}; +Batch.prototype.remove = function(e) { + const t = e.id; + if (this.createPrimitive = this.geometry.remove(t) || this.createPrimitive, this.updaters.remove(t)) { + this.updatersWithAttributes.remove(t); + const n = this.subscriptions.get(t); + return defined(n) && (n(), this.subscriptions.remove(t)), !0; + } + return !1; +}; +Batch.prototype.update = function(e) { + let t = !0, n = this.primitive; + const i = this.orderedGroundPrimitives, r = this.geometry.values; + let o; + if (this.createPrimitive) { + if (r.length > 0) + defined(n) && (defined(this.oldPrimitive) ? i.remove(n) : this.oldPrimitive = n), n = new GroundPolylinePrimitive({ + show: !1, + asynchronous: this._asynchronous, + geometryInstances: r.slice(), + appearance: new this.appearanceType(), + classificationType: this.classificationType + }), this.appearanceType === PolylineMaterialAppearance && (this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ), n.appearance.material = this.material), i.add(n, this.zIndex), t = !1; + else { + defined(n) && (i.remove(n), n = void 0); + const c = this.oldPrimitive; + defined(c) && (i.remove(c), this.oldPrimitive = void 0); + } + this.attributes.removeAll(), this.primitive = n, this.createPrimitive = !1; + } else if (defined(n) && n.ready) { + n.show = !0, defined(this.oldPrimitive) && (i.remove(this.oldPrimitive), this.oldPrimitive = void 0), this.appearanceType === PolylineMaterialAppearance && (this.material = MaterialProperty.getValue( + e, + this.materialProperty, + this.material + ), this.primitive.appearance.material = this.material); + const s = this.updatersWithAttributes.values, c = s.length; + for (o = 0; o < c; o++) { + const l = s[o], d = l.entity, f = this.geometry.get(l.id); + let h = this.attributes.get(f.id.id); + if (defined(h) || (h = n.getGeometryInstanceAttributes(f.id), this.attributes.set(f.id.id, h)), !l.fillMaterialProperty.isConstant) { + const y = l.fillMaterialProperty.color, C = Property.getValueOrDefault( + y, + e, + Color.WHITE, + scratchColor$3 + ); + Color.equals(h._lastColor, C) || (h._lastColor = Color.clone( + C, + h._lastColor + ), h.color = ColorGeometryInstanceAttribute.toValue( + C, + h.color + )); + } + const p = d.isShowing && (l.hasConstantFill || l.isFilled(e)), m = h.show[0] === 1; + p !== m && (h.show = ShowGeometryInstanceAttribute.toValue( + p, + h.show + )); + const _ = l.distanceDisplayConditionProperty; + if (!Property.isConstant(_)) { + const y = Property.getValueOrDefault( + _, + e, + defaultDistanceDisplayCondition, + distanceDisplayConditionScratch + ); + DistanceDisplayCondition.equals( + y, + h._lastDistanceDisplayCondition + ) || (h._lastDistanceDisplayCondition = DistanceDisplayCondition.clone( + y, + h._lastDistanceDisplayCondition + ), h.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue( + y, + h.distanceDisplayCondition + )); + } + } + this.updateShows(n); + } else defined(n) && !n.ready && (t = !1); + return t; +}; +Batch.prototype.updateShows = function(e) { + const t = this.showsUpdated.values, n = t.length; + for (let i = 0; i < n; i++) { + const r = t[i], o = r.entity, s = this.geometry.get(r.id); + let c = this.attributes.get(s.id.id); + defined(c) || (c = e.getGeometryInstanceAttributes(s.id), this.attributes.set(s.id.id, c)); + const l = o.isShowing, d = c.show[0] === 1; + l !== d && (c.show = ShowGeometryInstanceAttribute.toValue( + l, + c.show + ), s.attributes.show.value[0] = c.show[0]); + } + this.showsUpdated.removeAll(); +}; +Batch.prototype.contains = function(e) { + return this.updaters.contains(e.id); +}; +Batch.prototype.getBoundingSphere = function(e, t) { + const n = this.primitive; + if (!n.ready) + return BoundingSphereState$1.PENDING; + const i = n.getGeometryInstanceAttributes(e.entity); + return !defined(i) || !defined(i.boundingSphere) || defined(i.show) && i.show[0] === 0 ? BoundingSphereState$1.FAILED : (i.boundingSphere.clone(t), BoundingSphereState$1.DONE); +}; +Batch.prototype.destroy = function() { + const e = this.primitive, t = this.orderedGroundPrimitives; + defined(e) && t.remove(e); + const n = this.oldPrimitive; + defined(n) && t.remove(n), this.removeMaterialSubscription(); +}; +function StaticGroundPolylinePerMaterialBatch(e, t, n) { + this._items = [], this._orderedGroundPrimitives = e, this._classificationType = t, this._asynchronous = defaultValue(n, !0); +} +StaticGroundPolylinePerMaterialBatch.prototype.add = function(e, t) { + const n = this._items, i = n.length, r = t.createFillGeometryInstance(e), o = Property.getValueOrDefault(t.zIndex, 0); + for (let c = 0; c < i; ++c) { + const l = n[c]; + if (l.isMaterial(t) && l.zIndex === o) { + l.add(e, t, r); + return; + } + } + const s = new Batch( + this._orderedGroundPrimitives, + this._classificationType, + t.fillMaterialProperty, + o, + this._asynchronous + ); + s.add(e, t, r), n.push(s); +}; +StaticGroundPolylinePerMaterialBatch.prototype.remove = function(e) { + const t = this._items, n = t.length; + for (let i = n - 1; i >= 0; i--) { + const r = t[i]; + if (r.remove(e)) { + r.updaters.length === 0 && (t.splice(i, 1), r.destroy()); + break; + } + } +}; +StaticGroundPolylinePerMaterialBatch.prototype.update = function(e) { + let t; + const n = this._items, i = n.length; + for (t = i - 1; t >= 0; t--) { + const o = n[t]; + if (o.invalidated) { + n.splice(t, 1); + const s = o.updaters.values, c = s.length; + for (let l = 0; l < c; l++) + this.add(e, s[l]); + o.destroy(); + } + } + let r = !0; + for (t = 0; t < n.length; t++) + r = n[t].update(e) && r; + return r; +}; +StaticGroundPolylinePerMaterialBatch.prototype.getBoundingSphere = function(e, t) { + const n = this._items, i = n.length; + for (let r = 0; r < i; r++) { + const o = n[r]; + if (o.contains(e)) + return o.getBoundingSphere(e, t); + } + return BoundingSphereState$1.FAILED; +}; +StaticGroundPolylinePerMaterialBatch.prototype.removeAllPrimitives = function() { + const e = this._items, t = e.length; + for (let n = 0; n < t; n++) + e[n].destroy(); + this._items.length = 0; +}; +const emptyArray = []; +function removeUpdater(e, t) { + const n = e._batches, i = n.length; + for (let r = 0; r < i; r++) + n[r].remove(t); +} +function insertUpdaterIntoBatch(e, t, n) { + if (n.isDynamic) { + e._dynamicBatch.add(t, n); + return; + } + if (n.clampToGround && n.fillEnabled) { + const s = n.classificationTypeProperty.getValue( + t + ); + e._groundBatches[s].add(t, n); + return; + } + let i; + n.fillEnabled && (i = n.shadowsProperty.getValue(t)); + let r = 0; + defined(n.depthFailMaterialProperty) && (r = n.depthFailMaterialProperty instanceof ColorMaterialProperty ? 1 : 2); + let o; + defined(i) && (o = i + r * ShadowMode$1.NUMBER_OF_SHADOW_MODES), n.fillEnabled && (n.fillMaterialProperty instanceof ColorMaterialProperty ? e._colorBatches[o].add(t, n) : e._materialBatches[o].add(t, n)); +} +function PolylineVisualizer(e, t, n, i) { + i = defaultValue(i, e.groundPrimitives), n = defaultValue(n, e.primitives), this._scene = e, this._primitives = n, this._entityCollection = void 0, this._addedObjects = new AssociativeArray(), this._removedObjects = new AssociativeArray(), this._changedObjects = new AssociativeArray(); + let r; + const o = ShadowMode$1.NUMBER_OF_SHADOW_MODES; + for (this._colorBatches = new Array(o * 3), this._materialBatches = new Array(o * 3), r = 0; r < o; ++r) + this._colorBatches[r] = new StaticGeometryColorBatch( + n, + PolylineColorAppearance, + void 0, + !1, + r + ), this._materialBatches[r] = new StaticGeometryPerMaterialBatch( + n, + PolylineMaterialAppearance, + void 0, + !1, + r + ), this._colorBatches[r + o] = new StaticGeometryColorBatch( + n, + PolylineColorAppearance, + PolylineColorAppearance, + !1, + r + ), this._materialBatches[r + o] = new StaticGeometryPerMaterialBatch( + n, + PolylineMaterialAppearance, + PolylineColorAppearance, + !1, + r + ), this._colorBatches[r + o * 2] = new StaticGeometryColorBatch( + n, + PolylineColorAppearance, + PolylineMaterialAppearance, + !1, + r + ), this._materialBatches[r + o * 2] = new StaticGeometryPerMaterialBatch( + n, + PolylineMaterialAppearance, + PolylineMaterialAppearance, + !1, + r + ); + this._dynamicBatch = new DynamicGeometryBatch(n, i); + const s = ClassificationType$1.NUMBER_OF_CLASSIFICATION_TYPES; + for (this._groundBatches = new Array(s), r = 0; r < s; ++r) + this._groundBatches[r] = new StaticGroundPolylinePerMaterialBatch( + i, + r + ); + this._batches = this._colorBatches.concat( + this._materialBatches, + this._dynamicBatch, + this._groundBatches + ), this._subscriptions = new AssociativeArray(), this._updaters = new AssociativeArray(), this._entityCollection = t, t.collectionChanged.addEventListener( + PolylineVisualizer.prototype._onCollectionChanged, + this + ), this._onCollectionChanged( + t, + t.values, + emptyArray + ); +} +PolylineVisualizer.prototype.update = function(e) { + const t = this._addedObjects, n = t.values, i = this._removedObjects, r = i.values, o = this._changedObjects, s = o.values; + let c, l, d, f; + for (c = s.length - 1; c > -1; c--) + l = s[c], d = l.id, f = this._updaters.get(d), f.entity === l ? (removeUpdater(this, f), insertUpdaterIntoBatch(this, e, f)) : (r.push(l), n.push(l)); + for (c = r.length - 1; c > -1; c--) + l = r[c], d = l.id, f = this._updaters.get(d), removeUpdater(this, f), f.destroy(), this._updaters.remove(d), this._subscriptions.get(d)(), this._subscriptions.remove(d); + for (c = n.length - 1; c > -1; c--) + l = n[c], d = l.id, f = new PolylineGeometryUpdater(l, this._scene), this._updaters.set(d, f), insertUpdaterIntoBatch(this, e, f), this._subscriptions.set( + d, + f.geometryChanged.addEventListener( + PolylineVisualizer._onGeometryChanged, + this + ) + ); + t.removeAll(), i.removeAll(), o.removeAll(); + let h = !0; + const p = this._batches, m = p.length; + for (c = 0; c < m; c++) + h = p[c].update(e) && h; + return h; +}; +const getBoundingSphereArrayScratch$1 = [], getBoundingSphereBoundingSphereScratch$1 = new BoundingSphere(); +PolylineVisualizer.prototype.getBoundingSphere = function(e, t) { + const n = getBoundingSphereArrayScratch$1, i = getBoundingSphereBoundingSphereScratch$1; + let r = 0, o = BoundingSphereState$1.DONE; + const s = this._batches, c = s.length, l = this._updaters.get(e.id); + for (let d = 0; d < c; d++) { + if (o = s[d].getBoundingSphere(l, i), o === BoundingSphereState$1.PENDING) + return BoundingSphereState$1.PENDING; + o === BoundingSphereState$1.DONE && (n[r] = BoundingSphere.clone( + i, + n[r] + ), r++); + } + return r === 0 ? BoundingSphereState$1.FAILED : (n.length = r, BoundingSphere.fromBoundingSpheres(n, t), BoundingSphereState$1.DONE); +}; +PolylineVisualizer.prototype.isDestroyed = function() { + return !1; +}; +PolylineVisualizer.prototype.destroy = function() { + this._entityCollection.collectionChanged.removeEventListener( + PolylineVisualizer.prototype._onCollectionChanged, + this + ), this._addedObjects.removeAll(), this._removedObjects.removeAll(); + let e; + const t = this._batches; + let n = t.length; + for (e = 0; e < n; e++) + t[e].removeAllPrimitives(); + const i = this._subscriptions.values; + for (n = i.length, e = 0; e < n; e++) + i[e](); + return this._subscriptions.removeAll(), destroyObject(this); +}; +PolylineVisualizer._onGeometryChanged = function(e) { + const t = this._removedObjects, n = this._changedObjects, i = e.entity, r = i.id; + !defined(t.get(r)) && !defined(n.get(r)) && n.set(r, i); +}; +PolylineVisualizer.prototype._onCollectionChanged = function(e, t, n) { + const i = this._addedObjects, r = this._removedObjects, o = this._changedObjects; + let s, c, l; + for (s = n.length - 1; s > -1; s--) + l = n[s], c = l.id, i.remove(c) || (r.set(c, l), o.remove(c)); + for (s = t.length - 1; s > -1; s--) + l = t[s], c = l.id, r.remove(c) ? o.set(c, l) : i.set(c, l); +}; +function DataSourceDisplay(e) { + GroundPrimitive.initializeTerrainHeights(), GroundPolylinePrimitive.initializeTerrainHeights(); + const t = e.scene, n = e.dataSourceCollection; + this._eventHelper = new EventHelper(), this._eventHelper.add( + n.dataSourceAdded, + this._onDataSourceAdded, + this + ), this._eventHelper.add( + n.dataSourceRemoved, + this._onDataSourceRemoved, + this + ), this._eventHelper.add( + n.dataSourceMoved, + this._onDataSourceMoved, + this + ), this._eventHelper.add(t.postRender, this._postRender, this), this._dataSourceCollection = n, this._scene = t, this._visualizersCallback = defaultValue( + e.visualizersCallback, + DataSourceDisplay.defaultVisualizersCallback + ); + let i = !1; + const r = new PrimitiveCollection(), o = new PrimitiveCollection(); + n.length > 0 && (t.primitives.add(r), t.groundPrimitives.add(o), i = !0), this._primitives = r, this._groundPrimitives = o; + for (let d = 0, f = n.length; d < f; d++) + this._onDataSourceAdded(n, n.get(d)); + const s = new CustomDataSource(); + this._onDataSourceAdded(void 0, s), this._defaultDataSource = s; + let c, l; + if (!i) { + const d = this, f = function() { + t.primitives.add(r), t.groundPrimitives.add(o), c(), l(), d._removeDefaultDataSourceListener = void 0, d._removeDataSourceCollectionListener = void 0; + }; + c = s.entities.collectionChanged.addEventListener( + f + ), l = n.dataSourceAdded.addEventListener( + f + ); + } + this._removeDefaultDataSourceListener = c, this._removeDataSourceCollectionListener = l, this._ready = !1; +} +const ExtraVisualizers = []; +DataSourceDisplay.registerVisualizer = function(e) { + ExtraVisualizers.includes(e) || ExtraVisualizers.push(e); +}; +DataSourceDisplay.unregisterVisualizer = function(e) { + if (ExtraVisualizers.includes(e)) { + const t = ExtraVisualizers.indexOf(e); + ExtraVisualizers.splice(t, 1); + } +}; +DataSourceDisplay.defaultVisualizersCallback = function(e, t, n) { + const i = n.entities; + return [ + new BillboardVisualizer(t, i), + new GeometryVisualizer( + e, + i, + n._primitives, + n._groundPrimitives + ), + new LabelVisualizer(t, i), + new ModelVisualizer(e, i), + new Cesium3DTilesetVisualizer(e, i), + new PointVisualizer(t, i), + new PathVisualizer(e, i), + new PolylineVisualizer( + e, + i, + n._primitives, + n._groundPrimitives + ), + ...ExtraVisualizers.map( + (r) => new r(e, i) + ) + ]; +}; +Object.defineProperties(DataSourceDisplay.prototype, { + /** + * Gets the scene associated with this display. + * @memberof DataSourceDisplay.prototype + * @type {Scene} + */ + scene: { + get: function() { + return this._scene; + } + }, + /** + * Gets the collection of data sources to display. + * @memberof DataSourceDisplay.prototype + * @type {DataSourceCollection} + */ + dataSources: { + get: function() { + return this._dataSourceCollection; + } + }, + /** + * Gets the default data source instance which can be used to + * manually create and visualize entities not tied to + * a specific data source. This instance is always available + * and does not appear in the list dataSources collection. + * @memberof DataSourceDisplay.prototype + * @type {CustomDataSource} + */ + defaultDataSource: { + get: function() { + return this._defaultDataSource; + } + }, + /** + * Gets a value indicating whether or not all entities in the data source are ready + * @memberof DataSourceDisplay.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + } +}); +DataSourceDisplay.prototype.isDestroyed = function() { + return !1; +}; +DataSourceDisplay.prototype.destroy = function() { + this._eventHelper.removeAll(); + const e = this._dataSourceCollection; + for (let t = 0, n = e.length; t < n; ++t) + this._onDataSourceRemoved( + this._dataSourceCollection, + e.get(t) + ); + return this._onDataSourceRemoved(void 0, this._defaultDataSource), defined(this._removeDefaultDataSourceListener) ? (this._removeDefaultDataSourceListener(), this._removeDataSourceCollectionListener()) : (this._scene.primitives.remove(this._primitives), this._scene.groundPrimitives.remove(this._groundPrimitives)), destroyObject(this); +}; +DataSourceDisplay.prototype.update = function(e) { + if (!ApproximateTerrainHeights.initialized) + return this._ready = !1, !1; + let t = !0, n, i, r, o; + const s = this._dataSourceCollection, c = s.length; + for (n = 0; n < c; n++) { + const l = s.get(n); + for (defined(l.update) && (t = l.update(e) && t), r = l._visualizers, o = r.length, i = 0; i < o; i++) + t = r[i].update(e) && t; + } + for (r = this._defaultDataSource._visualizers, o = r.length, i = 0; i < o; i++) + t = r[i].update(e) && t; + return !this._ready && t && this._scene.requestRender(), this._ready = t, t; +}; +DataSourceDisplay.prototype._postRender = function() { + const e = this._scene.frameState, t = this._dataSourceCollection, n = t.length; + for (let i = 0; i < n; i++) { + const r = t.get(i), o = r.credit; + defined(o) && e.creditDisplay.addCreditToNextFrame(o); + const s = r._resourceCredits; + if (defined(s)) { + const c = s.length; + for (let l = 0; l < c; l++) + e.creditDisplay.addCreditToNextFrame(s[l]); + } + } +}; +const getBoundingSphereArrayScratch = [], getBoundingSphereBoundingSphereScratch = new BoundingSphere(); +DataSourceDisplay.prototype.getBoundingSphere = function(e, t, n) { + if (!this._ready) + return BoundingSphereState$1.PENDING; + let i, r, o = this._defaultDataSource; + if (!o.entities.contains(e)) { + o = void 0; + const p = this._dataSourceCollection; + for (r = p.length, i = 0; i < r; i++) { + const m = p.get(i); + if (m.entities.contains(e)) { + o = m; + break; + } + } + } + if (!defined(o)) + return BoundingSphereState$1.FAILED; + const s = getBoundingSphereArrayScratch, c = getBoundingSphereBoundingSphereScratch; + let l = 0, d = BoundingSphereState$1.DONE; + const f = o._visualizers, h = f.length; + for (i = 0; i < h; i++) { + const p = f[i]; + if (defined(p.getBoundingSphere)) { + if (d = f[i].getBoundingSphere(e, c), !t && d === BoundingSphereState$1.PENDING) + return BoundingSphereState$1.PENDING; + d === BoundingSphereState$1.DONE && (s[l] = BoundingSphere.clone( + c, + s[l] + ), l++); + } + } + return l === 0 ? BoundingSphereState$1.FAILED : (s.length = l, BoundingSphere.fromBoundingSpheres(s, n), BoundingSphereState$1.DONE); +}; +DataSourceDisplay.prototype._onDataSourceAdded = function(e, t) { + const n = this._scene, i = this._primitives, r = this._groundPrimitives, o = i.add(new PrimitiveCollection()), s = r.add( + new OrderedGroundPrimitiveCollection() + ); + t._primitives = o, t._groundPrimitives = s; + const c = t.clustering; + c._initialize(n), o.add(c), t._visualizers = this._visualizersCallback( + n, + c, + t + ); +}; +DataSourceDisplay.prototype._onDataSourceRemoved = function(e, t) { + const n = this._primitives, i = this._groundPrimitives, r = t._primitives, o = t._groundPrimitives, s = t.clustering; + r.remove(s); + const c = t._visualizers, l = c.length; + for (let d = 0; d < l; d++) + c[d].destroy(); + n.remove(r), i.remove(o), t._visualizers = void 0; +}; +DataSourceDisplay.prototype._onDataSourceMoved = function(e, t, n) { + const i = this._primitives, r = this._groundPrimitives, o = e._primitives, s = e._groundPrimitives; + t === n + 1 ? (i.raise(o), r.raise(s)) : t === n - 1 ? (i.lower(o), r.lower(s)) : t === 0 ? (i.lowerToBottom(o), r.lowerToBottom(s), i.raise(o), r.raise(s)) : (i.raiseToTop(o), r.raiseToTop(s)); +}; +function HeadingPitchRange(e, t, n) { + this.heading = defaultValue(e, 0), this.pitch = defaultValue(t, 0), this.range = defaultValue(n, 0); +} +HeadingPitchRange.clone = function(e, t) { + if (defined(e)) + return defined(t) || (t = new HeadingPitchRange()), t.heading = e.heading, t.pitch = e.pitch, t.range = e.range, t; +}; +const updateTransformMatrix3Scratch1 = new Matrix3(), updateTransformMatrix3Scratch2 = new Matrix3(), updateTransformMatrix3Scratch3 = new Matrix3(), updateTransformMatrix4Scratch = new Matrix4(), updateTransformCartesian3Scratch1 = new Cartesian3(), updateTransformCartesian3Scratch2 = new Cartesian3(), updateTransformCartesian3Scratch3 = new Cartesian3(), updateTransformCartesian3Scratch4 = new Cartesian3(), updateTransformCartesian3Scratch5 = new Cartesian3(), updateTransformCartesian3Scratch6 = new Cartesian3(), deltaTime = new JulianDate(), northUpAxisFactor = 1.25; +function updateTransform(e, t, n, i, r, o, s) { + const c = e.scene.mode; + let l = r.getValue(o, e._lastCartesian); + if (defined(l)) { + let d = !1, f = !1, h, p, m; + if (c === SceneMode$1.SCENE3D) { + JulianDate.addSeconds(o, 1e-3, deltaTime); + let x = r.getValue( + deltaTime, + updateTransformCartesian3Scratch1 + ); + if (defined(x) || (JulianDate.addSeconds(o, -1e-3, deltaTime), x = r.getValue( + deltaTime, + updateTransformCartesian3Scratch1 + ), f = !0), defined(x)) { + let b = Transforms.computeFixedToIcrfMatrix( + o, + updateTransformMatrix3Scratch1 + ), S = Transforms.computeFixedToIcrfMatrix( + deltaTime, + updateTransformMatrix3Scratch2 + ), E; + !defined(b) || !defined(S) ? (E = Transforms.computeTemeToPseudoFixedMatrix( + o, + updateTransformMatrix3Scratch3 + ), b = Matrix3.transpose( + E, + updateTransformMatrix3Scratch1 + ), S = Transforms.computeTemeToPseudoFixedMatrix( + deltaTime, + updateTransformMatrix3Scratch2 + ), Matrix3.transpose(S, S)) : E = Matrix3.transpose( + b, + updateTransformMatrix3Scratch3 + ); + const A = Matrix3.multiplyByVector( + b, + l, + updateTransformCartesian3Scratch5 + ), D = Matrix3.multiplyByVector( + S, + x, + updateTransformCartesian3Scratch6 + ); + Cartesian3.subtract( + A, + D, + updateTransformCartesian3Scratch4 + ); + const P = Cartesian3.magnitude(updateTransformCartesian3Scratch4) * 1e3, I = CesiumMath.GRAVITATIONALPARAMETER, M = -I / (P * P - 2 * I / Cartesian3.magnitude(A)); + M < 0 || M > northUpAxisFactor * s.maximumRadius ? (h = updateTransformCartesian3Scratch2, Cartesian3.normalize(l, h), Cartesian3.negate(h, h), m = Cartesian3.clone( + Cartesian3.UNIT_Z, + updateTransformCartesian3Scratch3 + ), p = Cartesian3.cross( + m, + h, + updateTransformCartesian3Scratch1 + ), Cartesian3.magnitude(p) > CesiumMath.EPSILON7 && (Cartesian3.normalize(h, h), Cartesian3.normalize(p, p), m = Cartesian3.cross( + h, + p, + updateTransformCartesian3Scratch3 + ), Cartesian3.normalize(m, m), d = !0)) : Cartesian3.equalsEpsilon( + l, + x, + CesiumMath.EPSILON7 + ) || (m = updateTransformCartesian3Scratch2, Cartesian3.normalize(A, m), Cartesian3.normalize(D, D), p = Cartesian3.cross( + m, + D, + updateTransformCartesian3Scratch3 + ), f && (p = Cartesian3.multiplyByScalar(p, -1, p)), Cartesian3.equalsEpsilon( + p, + Cartesian3.ZERO, + CesiumMath.EPSILON7 + ) || (h = Cartesian3.cross( + p, + m, + updateTransformCartesian3Scratch1 + ), Matrix3.multiplyByVector(E, h, h), Matrix3.multiplyByVector(E, p, p), Matrix3.multiplyByVector(E, m, m), Cartesian3.normalize(h, h), Cartesian3.normalize(p, p), Cartesian3.normalize(m, m), d = !0)); + } + } + defined(e.boundingSphere) && (l = e.boundingSphere.center); + let _, y, C; + i && (_ = Cartesian3.clone( + t.position, + updateTransformCartesian3Scratch4 + ), y = Cartesian3.clone( + t.direction, + updateTransformCartesian3Scratch5 + ), C = Cartesian3.clone(t.up, updateTransformCartesian3Scratch6)); + const T = updateTransformMatrix4Scratch; + d ? (T[0] = h.x, T[1] = h.y, T[2] = h.z, T[3] = 0, T[4] = p.x, T[5] = p.y, T[6] = p.z, T[7] = 0, T[8] = m.x, T[9] = m.y, T[10] = m.z, T[11] = 0, T[12] = l.x, T[13] = l.y, T[14] = l.z, T[15] = 0) : Transforms.eastNorthUpToFixedFrame(l, s, T), t._setTransform(T), i && (Cartesian3.clone(_, t.position), Cartesian3.clone(y, t.direction), Cartesian3.clone(C, t.up), Cartesian3.cross(y, C, t.right)); + } + if (n) { + const d = c === SceneMode$1.SCENE2D || Cartesian3.equals(e._offset3D, Cartesian3.ZERO) ? void 0 : e._offset3D; + t.lookAtTransform(t.transform, d); + } +} +function EntityView(e, t, n) { + this.entity = e, this.scene = t, this.ellipsoid = defaultValue(n, Ellipsoid.default), this.boundingSphere = void 0, this._lastEntity = void 0, this._mode = void 0, this._lastCartesian = new Cartesian3(), this._defaultOffset3D = void 0, this._offset3D = new Cartesian3(); +} +Object.defineProperties(EntityView, { + /** + * Gets or sets a camera offset that will be used to + * initialize subsequent EntityViews. + * @memberof EntityView + * @type {Cartesian3} + */ + defaultOffset3D: { + get: function() { + return this._defaultOffset3D; + }, + set: function(e) { + this._defaultOffset3D = Cartesian3.clone(e, new Cartesian3()); + } + } +}); +EntityView.defaultOffset3D = new Cartesian3(-14e3, 3500, 3500); +const scratchHeadingPitchRange = new HeadingPitchRange(), scratchCartesian$2 = new Cartesian3(); +EntityView.prototype.update = function(e, t) { + const n = this.scene, i = this.ellipsoid, r = n.mode; + if (r === SceneMode$1.MORPHING) + return; + const o = this.entity, s = o.position; + if (!defined(s)) + return; + const c = o !== this._lastEntity, l = r !== this._mode, d = n.camera; + let f = c || l, h = !0; + if (c) { + const p = o.viewFrom, m = defined(p); + if (!m && defined(t)) { + scratchHeadingPitchRange.pitch = -CesiumMath.PI_OVER_FOUR, scratchHeadingPitchRange.range = 0; + const _ = s.getValue(e, scratchCartesian$2); + if (defined(_)) { + const y = 2 - 1 / Math.max( + 1, + Cartesian3.magnitude(_) / i.maximumRadius + ); + scratchHeadingPitchRange.pitch *= y; + } + d.viewBoundingSphere(t, scratchHeadingPitchRange), this.boundingSphere = t, f = !1, h = !1; + } else (!m || !defined(p.getValue(e, this._offset3D))) && Cartesian3.clone(EntityView._defaultOffset3D, this._offset3D); + } else !l && this._mode !== SceneMode$1.SCENE2D && Cartesian3.clone(d.position, this._offset3D); + this._lastEntity = o, this._mode = r, updateTransform( + this, + d, + f, + h, + s, + e, + i + ); +}; +function PinBuilder() { + this._cache = {}; +} +PinBuilder.prototype.fromColor = function(e, t) { + return createPin(void 0, void 0, e, t, this._cache); +}; +PinBuilder.prototype.fromUrl = function(e, t, n) { + return createPin(e, void 0, t, n, this._cache); +}; +PinBuilder.prototype.fromMakiIconId = function(e, t, n) { + return createPin( + buildModuleUrl(`Assets/Textures/maki/${encodeURIComponent(e)}.png`), + void 0, + t, + n, + this._cache + ); +}; +PinBuilder.prototype.fromText = function(e, t, n) { + return createPin(void 0, e, t, n, this._cache); +}; +const colorScratch$1 = new Color(); +function drawPin(e, t, n) { + e.save(), e.scale(n / 24, n / 24), e.fillStyle = t.toCssColorString(), e.strokeStyle = t.brighten(0.6, colorScratch$1).toCssColorString(), e.lineWidth = 0.846, e.beginPath(), e.moveTo(6.72, 0.422), e.lineTo(17.28, 0.422), e.bezierCurveTo(18.553, 0.422, 19.577, 1.758, 19.577, 3.415), e.lineTo(19.577, 10.973), e.bezierCurveTo(19.577, 12.63, 18.553, 13.966, 17.282, 13.966), e.lineTo(14.386, 14.008), e.lineTo(11.826, 23.578), e.lineTo(9.614, 14.008), e.lineTo(6.719, 13.965), e.bezierCurveTo(5.446, 13.983, 4.422, 12.629, 4.422, 10.972), e.lineTo(4.422, 3.416), e.bezierCurveTo(4.423, 1.76, 5.447, 0.423, 6.718, 0.423), e.closePath(), e.fill(), e.stroke(), e.restore(); +} +function drawIcon(e, t, n) { + const i = n / 2.5; + let r = i, o = i; + t.width > t.height ? o = i * (t.height / t.width) : t.width < t.height && (r = i * (t.width / t.height)); + const s = Math.round((n - r) / 2), c = Math.round(7 / 24 * n - o / 2); + e.globalCompositeOperation = "destination-out", e.drawImage(t, s - 1, c, r, o), e.drawImage(t, s, c - 1, r, o), e.drawImage(t, s + 1, c, r, o), e.drawImage(t, s, c + 1, r, o), e.globalCompositeOperation = "destination-over", e.fillStyle = Color.BLACK.toCssColorString(), e.fillRect(s - 1, c - 1, r + 2, o + 2), e.globalCompositeOperation = "destination-out", e.drawImage(t, s, c, r, o), e.globalCompositeOperation = "destination-over", e.fillStyle = Color.WHITE.toCssColorString(), e.fillRect(s - 1, c - 2, r + 2, o + 2); +} +const stringifyScratch = new Array(4); +function createPin(e, t, n, i, r) { + stringifyScratch[0] = e, stringifyScratch[1] = t, stringifyScratch[2] = n, stringifyScratch[3] = i; + const o = JSON.stringify(stringifyScratch), s = r[o]; + if (defined(s)) + return s; + const c = document.createElement("canvas"); + c.width = i, c.height = i; + const l = c.getContext("2d"); + if (drawPin(l, n, i), defined(e)) { + const f = Resource.createIfNeeded(e).fetchImage().then(function(h) { + return drawIcon(l, h, i), r[o] = c, c; + }); + return r[o] = f, f; + } else if (defined(t)) { + const d = writeTextToCanvas(t, { + font: `bold ${i}px sans-serif` + }); + drawIcon(l, d, i); + } + return r[o] = c, c; +} +function identity(e) { + return e; +} +function transform$1(e) { + if (e == null) return identity; + var t, n, i = e.scale[0], r = e.scale[1], o = e.translate[0], s = e.translate[1]; + return function(c, l) { + l || (t = n = 0); + var d = 2, f = c.length, h = new Array(f); + for (h[0] = (t += c[0]) * i + o, h[1] = (n += c[1]) * r + s; d < f; ) h[d] = c[d], ++d; + return h; + }; +} +function reverse(e, t) { + for (var n, i = e.length, r = i - t; r < --i; ) n = e[r], e[r++] = e[i], e[i] = n; +} +function feature(e, t) { + return typeof t == "string" && (t = e.objects[t]), t.type === "GeometryCollection" ? { type: "FeatureCollection", features: t.geometries.map(function(n) { + return feature$1(e, n); + }) } : feature$1(e, t); +} +function feature$1(e, t) { + var n = t.id, i = t.bbox, r = t.properties == null ? {} : t.properties, o = object(e, t); + return n == null && i == null ? { type: "Feature", properties: r, geometry: o } : i == null ? { type: "Feature", id: n, properties: r, geometry: o } : { type: "Feature", id: n, bbox: i, properties: r, geometry: o }; +} +function object(e, t) { + var n = transform$1(e.transform), i = e.arcs; + function r(f, h) { + h.length && h.pop(); + for (var p = i[f < 0 ? ~f : f], m = 0, _ = p.length; m < _; ++m) + h.push(n(p[m], m)); + f < 0 && reverse(h, _); + } + function o(f) { + return n(f); + } + function s(f) { + for (var h = [], p = 0, m = f.length; p < m; ++p) r(f[p], h); + return h.length < 2 && h.push(h[0]), h; + } + function c(f) { + for (var h = s(f); h.length < 4; ) h.push(h[0]); + return h; + } + function l(f) { + return f.map(c); + } + function d(f) { + var h = f.type, p; + switch (h) { + case "GeometryCollection": + return { type: h, geometries: f.geometries.map(d) }; + case "Point": + p = o(f.coordinates); + break; + case "MultiPoint": + p = f.coordinates.map(o); + break; + case "LineString": + p = s(f.arcs); + break; + case "MultiLineString": + p = f.arcs.map(s); + break; + case "Polygon": + p = l(f.arcs); + break; + case "MultiPolygon": + p = f.arcs.map(l); + break; + default: + return null; + } + return { type: h, coordinates: p }; + } + return d(t); +} +function defaultCrsFunction(e) { + return Cartesian3.fromDegrees(e[0], e[1], e[2]); +} +const crsNames = { + "urn:ogc:def:crs:OGC:1.3:CRS84": defaultCrsFunction, + "EPSG:4326": defaultCrsFunction, + "urn:ogc:def:crs:EPSG::4326": defaultCrsFunction +}, crsLinkHrefs = {}, crsLinkTypes = {}; +let defaultMarkerSize = 48, defaultMarkerSymbol, defaultMarkerColor = Color.ROYALBLUE, defaultStroke = Color.YELLOW, defaultStrokeWidth = 2, defaultFill = Color.fromBytes(255, 255, 0, 100), defaultClampToGround = !1; +const sizes = { + small: 24, + medium: 48, + large: 64 +}, simpleStyleIdentifiers = [ + "title", + "description", + // + "marker-size", + "marker-symbol", + "marker-color", + "stroke", + // + "stroke-opacity", + "stroke-width", + "fill", + "fill-opacity" +]; +function defaultDescribe(e, t) { + let n = ""; + for (const i in e) + if (e.hasOwnProperty(i)) { + if (i === t || simpleStyleIdentifiers.indexOf(i) !== -1) + continue; + const r = e[i]; + defined(r) && (typeof r == "object" ? n += `${i}${defaultDescribe(r)}` : n += `${i}${r}`); + } + return n.length > 0 && (n = `${n}
`), n; +} +function createDescriptionCallback(e, t, n) { + let i; + return function(r, o) { + return defined(i) || (i = e(t, n)), i; + }; +} +function defaultDescribeProperty(e, t) { + return new CallbackProperty( + createDescriptionCallback(defaultDescribe, e, t), + !0 + ); +} +function createObject(e, t, n) { + let i = e.id; + if (!defined(i) || e.type !== "Feature") + i = createGuid(); + else { + let s = 2, c = i; + for (; defined(t.getById(c)); ) + c = `${i}_${s}`, s++; + i = c; + } + const r = t.getOrCreateEntity(i), o = e.properties; + if (defined(o)) { + r.properties = o; + let s; + const c = o.title; + if (defined(c)) + r.name = c, s = "title"; + else { + let d = Number.MAX_VALUE; + for (const f in o) + if (o.hasOwnProperty(f) && o[f]) { + const h = f.toLowerCase(); + if (d > 1 && h === "title") { + d = 1, s = f; + break; + } else d > 2 && h === "name" ? (d = 2, s = f) : d > 3 && /title/i.test(f) ? (d = 3, s = f) : d > 4 && /name/i.test(f) && (d = 4, s = f); + } + defined(s) && (r.name = o[s]); + } + const l = o.description; + l !== null && (r.description = defined(l) ? new ConstantProperty(l) : n(o, s)); + } + return r; +} +function coordinatesArrayToCartesianArray(e, t) { + const n = new Array(e.length); + for (let i = 0; i < e.length; i++) + n[i] = t(e[i]); + return n; +} +const geoJsonObjectTypes = { + Feature: processFeature$1, + FeatureCollection: processFeatureCollection, + GeometryCollection: processGeometryCollection, + LineString: processLineString, + MultiLineString: processMultiLineString, + MultiPoint: processMultiPoint, + MultiPolygon: processMultiPolygon, + Point: processPoint$1, + Polygon: processPolygon$1, + Topology: processTopology +}, geometryTypes$1 = { + GeometryCollection: processGeometryCollection, + LineString: processLineString, + MultiLineString: processMultiLineString, + MultiPoint: processMultiPoint, + MultiPolygon: processMultiPolygon, + Point: processPoint$1, + Polygon: processPolygon$1, + Topology: processTopology +}; +function processFeature$1(e, t, n, i, r) { + if (t.geometry === null) { + createObject(t, e._entityCollection, r.describe); + return; + } + if (!defined(t.geometry)) + throw new RuntimeError("feature.geometry is required."); + const o = t.geometry.type, s = geometryTypes$1[o]; + if (!defined(s)) + throw new RuntimeError(`Unknown geometry type: ${o}`); + s(e, t, t.geometry, i, r); +} +function processFeatureCollection(e, t, n, i, r) { + const o = t.features; + for (let s = 0, c = o.length; s < c; s++) + processFeature$1(e, o[s], void 0, i, r); +} +function processGeometryCollection(e, t, n, i, r) { + const o = n.geometries; + for (let s = 0, c = o.length; s < c; s++) { + const l = o[s], d = l.type, f = geometryTypes$1[d]; + if (!defined(f)) + throw new RuntimeError(`Unknown geometry type: ${d}`); + f(e, t, l, i, r); + } +} +function createPoint$1(e, t, n, i, r) { + let o = r.markerSymbol, s = r.markerColor, c = r.markerSize; + const l = t.properties; + if (defined(l)) { + const m = l["marker-color"]; + defined(m) && (s = Color.fromCssColorString(m)), c = defaultValue(sizes[l["marker-size"]], c); + const _ = l["marker-symbol"]; + defined(_) && (o = _); + } + let d; + defined(o) ? o.length === 1 ? d = e._pinBuilder.fromText( + o.toUpperCase(), + s, + c + ) : d = e._pinBuilder.fromMakiIconId( + o, + s, + c + ) : d = e._pinBuilder.fromColor(s, c); + const f = new BillboardGraphics(); + f.verticalOrigin = new ConstantProperty(VerticalOrigin$1.BOTTOM), i.length === 2 && r.clampToGround && (f.heightReference = HeightReference$1.CLAMP_TO_GROUND); + const h = createObject( + t, + e._entityCollection, + r.describe + ); + h.billboard = f, h.position = new ConstantPositionProperty(n(i)); + const p = Promise.resolve(d).then(function(m) { + f.image = new ConstantProperty(m); + }).catch(function() { + f.image = new ConstantProperty( + e._pinBuilder.fromColor(s, c) + ); + }); + e._promises.push(p); +} +function processPoint$1(e, t, n, i, r) { + createPoint$1(e, t, i, n.coordinates, r); +} +function processMultiPoint(e, t, n, i, r) { + const o = n.coordinates; + for (let s = 0; s < o.length; s++) + createPoint$1(e, t, i, o[s], r); +} +function createLineString$1(e, t, n, i, r) { + let o = r.strokeMaterialProperty, s = r.strokeWidthProperty; + const c = t.properties; + if (defined(c)) { + const f = c["stroke-width"]; + defined(f) && (s = new ConstantProperty(f)); + let h; + const p = c.stroke; + defined(p) && (h = Color.fromCssColorString(p)); + const m = c["stroke-opacity"]; + defined(m) && m !== 1 && (defined(h) || (h = o.color.getValue().clone()), h.alpha = m), defined(h) && (o = new ColorMaterialProperty(h)); + } + const l = createObject( + t, + e._entityCollection, + r.describe + ), d = new PolylineGraphics(); + l.polyline = d, d.clampToGround = r.clampToGround, d.material = o, d.width = s, d.positions = new ConstantProperty( + coordinatesArrayToCartesianArray(i, n) + ), d.arcType = ArcType$1.RHUMB; +} +function processLineString(e, t, n, i, r) { + createLineString$1( + e, + t, + i, + n.coordinates, + r + ); +} +function processMultiLineString(e, t, n, i, r) { + const o = n.coordinates; + for (let s = 0; s < o.length; s++) + createLineString$1(e, t, i, o[s], r); +} +function createPolygon$1(e, t, n, i, r) { + if (i.length === 0 || i[0].length === 0) + return; + let o = r.strokeMaterialProperty.color, s = r.fillMaterialProperty, c = r.strokeWidthProperty; + const l = t.properties; + if (defined(l)) { + const m = l["stroke-width"]; + defined(m) && (c = new ConstantProperty(m)); + let _; + const y = l.stroke; + defined(y) && (_ = Color.fromCssColorString(y)); + let C = l["stroke-opacity"]; + defined(C) && C !== 1 && (defined(_) || (_ = o.getValue().clone()), _.alpha = C), defined(_) && (o = new ConstantProperty(_)); + let T; + const x = l.fill, b = s.color.getValue(); + defined(x) && (T = Color.fromCssColorString(x), T.alpha = b.alpha), C = l["fill-opacity"], defined(C) && C !== b.alpha && (defined(T) || (T = b.clone()), T.alpha = C), defined(T) && (s = new ColorMaterialProperty(T)); + } + const d = new PolygonGraphics(); + d.outline = new ConstantProperty(!0), d.outlineColor = o, d.outlineWidth = c, d.material = s, d.arcType = ArcType$1.RHUMB; + const f = []; + for (let m = 1, _ = i.length; m < _; m++) + f.push( + new PolygonHierarchy( + coordinatesArrayToCartesianArray(i[m], n) + ) + ); + const h = i[0]; + d.hierarchy = new ConstantProperty( + new PolygonHierarchy( + coordinatesArrayToCartesianArray(h, n), + f + ) + ), h[0].length > 2 ? d.perPositionHeight = new ConstantProperty(!0) : r.clampToGround || (d.height = 0); + const p = createObject( + t, + e._entityCollection, + r.describe + ); + p.polygon = d; +} +function processPolygon$1(e, t, n, i, r) { + createPolygon$1( + e, + t, + i, + n.coordinates, + r + ); +} +function processMultiPolygon(e, t, n, i, r) { + const o = n.coordinates; + for (let s = 0; s < o.length; s++) + createPolygon$1(e, t, i, o[s], r); +} +function processTopology(e, t, n, i, r) { + for (const o in n.objects) + if (n.objects.hasOwnProperty(o)) { + const s = feature(n, n.objects[o]), c = geoJsonObjectTypes[s.type]; + c(e, s, s, i, r); + } +} +function GeoJsonDataSource(e) { + this._name = e, this._changed = new Event(), this._error = new Event(), this._isLoading = !1, this._loading = new Event(), this._entityCollection = new EntityCollection(this), this._promises = [], this._pinBuilder = new PinBuilder(), this._entityCluster = new EntityCluster(), this._credit = void 0, this._resourceCredits = []; +} +GeoJsonDataSource.load = function(e, t) { + return new GeoJsonDataSource().load(e, t); +}; +Object.defineProperties(GeoJsonDataSource, { + /** + * Gets or sets the default size of the map pin created for each point, in pixels. + * @memberof GeoJsonDataSource + * @type {number} + * @default 48 + */ + markerSize: { + get: function() { + return defaultMarkerSize; + }, + set: function(e) { + defaultMarkerSize = e; + } + }, + /** + * Gets or sets the default symbol of the map pin created for each point. + * This can be any valid {@link http://mapbox.com/maki/|Maki} identifier, any single character, + * or blank if no symbol is to be used. + * @memberof GeoJsonDataSource + * @type {string} + */ + markerSymbol: { + get: function() { + return defaultMarkerSymbol; + }, + set: function(e) { + defaultMarkerSymbol = e; + } + }, + /** + * Gets or sets the default color of the map pin created for each point. + * @memberof GeoJsonDataSource + * @type {Color} + * @default Color.ROYALBLUE + */ + markerColor: { + get: function() { + return defaultMarkerColor; + }, + set: function(e) { + defaultMarkerColor = e; + } + }, + /** + * Gets or sets the default color of polylines and polygon outlines. + * @memberof GeoJsonDataSource + * @type {Color} + * @default Color.BLACK + */ + stroke: { + get: function() { + return defaultStroke; + }, + set: function(e) { + defaultStroke = e; + } + }, + /** + * Gets or sets the default width of polylines and polygon outlines. + * @memberof GeoJsonDataSource + * @type {number} + * @default 2.0 + */ + strokeWidth: { + get: function() { + return defaultStrokeWidth; + }, + set: function(e) { + defaultStrokeWidth = e; + } + }, + /** + * Gets or sets default color for polygon interiors. + * @memberof GeoJsonDataSource + * @type {Color} + * @default Color.YELLOW + */ + fill: { + get: function() { + return defaultFill; + }, + set: function(e) { + defaultFill = e; + } + }, + /** + * Gets or sets default of whether to clamp to the ground. + * @memberof GeoJsonDataSource + * @type {boolean} + * @default false + */ + clampToGround: { + get: function() { + return defaultClampToGround; + }, + set: function(e) { + defaultClampToGround = e; + } + }, + /** + * Gets an object that maps the name of a crs to a callback function which takes a GeoJSON coordinate + * and transforms it into a WGS84 Earth-fixed Cartesian. Older versions of GeoJSON which + * supported the EPSG type can be added to this list as well, by specifying the complete EPSG name, + * for example 'EPSG:4326'. + * @memberof GeoJsonDataSource + * @type {object} + */ + crsNames: { + get: function() { + return crsNames; + } + }, + /** + * Gets an object that maps the href property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in this object take precedence over those defined in crsLinkHrefs, assuming + * the link has a type specified. + * @memberof GeoJsonDataSource + * @type {object} + */ + crsLinkHrefs: { + get: function() { + return crsLinkHrefs; + } + }, + /** + * Gets an object that maps the type property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in crsLinkHrefs take precedence over this object. + * @memberof GeoJsonDataSource + * @type {object} + */ + crsLinkTypes: { + get: function() { + return crsLinkTypes; + } + } +}); +Object.defineProperties(GeoJsonDataSource.prototype, { + /** + * Gets or sets a human-readable name for this instance. + * @memberof GeoJsonDataSource.prototype + * @type {string} + */ + name: { + get: function() { + return this._name; + }, + set: function(e) { + this._name !== e && (this._name = e, this._changed.raiseEvent(this)); + } + }, + /** + * This DataSource only defines static data, therefore this property is always undefined. + * @memberof GeoJsonDataSource.prototype + * @type {DataSourceClock} + */ + clock: { + value: void 0, + writable: !1 + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof GeoJsonDataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: function() { + return this._entityCollection; + } + }, + /** + * Gets a value indicating if the data source is currently loading data. + * @memberof GeoJsonDataSource.prototype + * @type {boolean} + */ + isLoading: { + get: function() { + return this._isLoading; + } + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof GeoJsonDataSource.prototype + * @type {Event} + */ + changedEvent: { + get: function() { + return this._changed; + } + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof GeoJsonDataSource.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._error; + } + }, + /** + * Gets an event that will be raised when the data source either starts or stops loading. + * @memberof GeoJsonDataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: function() { + return this._loading; + } + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof GeoJsonDataSource.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._entityCollection.show; + }, + set: function(e) { + this._entityCollection.show = e; + } + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof GeoJsonDataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: function() { + return this._entityCluster; + }, + set: function(e) { + this._entityCluster = e; + } + }, + /** + * Gets the credit that will be displayed for the data source + * @memberof GeoJsonDataSource.prototype + * @type {Credit} + */ + credit: { + get: function() { + return this._credit; + } + } +}); +GeoJsonDataSource.prototype.load = function(e, t) { + return preload(this, e, t, !0); +}; +GeoJsonDataSource.prototype.process = function(e, t) { + return preload(this, e, t, !1); +}; +function preload(e, t, n, i) { + DataSource.setLoading(e, !0), n = defaultValue(n, defaultValue.EMPTY_OBJECT); + let r = n.credit; + typeof r == "string" && (r = new Credit(r)), e._credit = r; + let o = t, s = n.sourceUri; + if (typeof t == "string" || t instanceof Resource) { + t = Resource.createIfNeeded(t), o = t.fetchJson(), s = defaultValue(s, t.getUrlComponent()); + const c = e._resourceCredits, l = t.credits; + if (defined(l)) { + const d = l.length; + for (let f = 0; f < d; f++) + c.push(l[f]); + } + } + return n = { + describe: defaultValue(n.describe, defaultDescribeProperty), + markerSize: defaultValue(n.markerSize, defaultMarkerSize), + markerSymbol: defaultValue(n.markerSymbol, defaultMarkerSymbol), + markerColor: defaultValue(n.markerColor, defaultMarkerColor), + strokeWidthProperty: new ConstantProperty( + defaultValue(n.strokeWidth, defaultStrokeWidth) + ), + strokeMaterialProperty: new ColorMaterialProperty( + defaultValue(n.stroke, defaultStroke) + ), + fillMaterialProperty: new ColorMaterialProperty( + defaultValue(n.fill, defaultFill) + ), + clampToGround: defaultValue(n.clampToGround, defaultClampToGround) + }, Promise.resolve(o).then(function(c) { + return load$3(e, c, n, s, i); + }).catch(function(c) { + throw DataSource.setLoading(e, !1), e._error.raiseEvent(e, c), c; + }); +} +GeoJsonDataSource.prototype.update = function(e) { + return !0; +}; +function load$3(e, t, n, i, r) { + let o; + defined(i) && (o = getFilenameFromUri(i)), defined(o) && e._name !== o && (e._name = o, e._changed.raiseEvent(e)); + const s = geoJsonObjectTypes[t.type]; + if (!defined(s)) + throw new RuntimeError(`Unsupported GeoJSON object type: ${t.type}`); + const c = t.crs; + let l = c !== null ? defaultCrsFunction : null; + if (defined(c)) { + if (!defined(c.properties)) + throw new RuntimeError("crs.properties is undefined."); + const d = c.properties; + if (c.type === "name") { + if (l = crsNames[d.name], !defined(l)) + throw new RuntimeError(`Unknown crs name: ${d.name}`); + } else if (c.type === "link") { + let f = crsLinkHrefs[d.href]; + if (defined(f) || (f = crsLinkTypes[d.type]), !defined(f)) + throw new RuntimeError( + `Unable to resolve crs link: ${JSON.stringify(d)}` + ); + l = f(d); + } else if (c.type === "EPSG") { + if (l = crsNames[`EPSG:${d.code}`], !defined(l)) + throw new RuntimeError(`Unknown crs EPSG code: ${d.code}`); + } else + throw new RuntimeError(`Unknown crs type: ${c.type}`); + } + return Promise.resolve(l).then(function(d) { + return r && e._entityCollection.removeAll(), d !== null && s(e, t, t, d, n), Promise.all(e._promises).then(function() { + return e._promises.length = 0, DataSource.setLoading(e, !1), e; + }); + }); +} +var version = "4.0.0"; +function isUndefined(e) { + return e === void 0; +} +function isBoolean(e) { + return typeof e == "boolean"; +} +function defaults(e, t) { + for (var n in t) + t.hasOwnProperty(n) && isUndefined(e[n]) && (e[n] = t[n]); + return e; +} +function ellipsis(e, t, n) { + var i; + return e.length > t && (n == null ? (n = "…", i = 3) : i = n.length, e = e.substring(0, t - i) + n), e; +} +function remove$1(e, t) { + for (var n = e.length - 1; n >= 0; n--) + e[n] === t && e.splice(n, 1); +} +function removeWithPredicate(e, t) { + for (var n = e.length - 1; n >= 0; n--) + t(e[n]) === !0 && e.splice(n, 1); +} +function assertNever(e) { + throw new Error("Unhandled case for value: '".concat(e, "'")); +} +var letterRe = /[A-Za-z]/, digitRe = /[\d]/, whitespaceRe = /\s/, quoteRe = /['"]/, controlCharsRe = /[\x00-\x1F\x7F]/, alphaCharsStr = /A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source, emojiStr = /\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source, marksStr = /\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source, alphaCharsAndMarksStr = alphaCharsStr + emojiStr + marksStr, decimalNumbersStr = /0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source, alphaNumericAndMarksCharsStr = alphaCharsAndMarksStr + decimalNumbersStr, alphaNumericAndMarksRe = new RegExp("[".concat(alphaNumericAndMarksCharsStr, "]")), HtmlTag = ( + /** @class */ + function() { + function e(t) { + t === void 0 && (t = {}), this.tagName = "", this.attrs = {}, this.innerHTML = "", this.tagName = t.tagName || "", this.attrs = t.attrs || {}, this.innerHTML = t.innerHtml || t.innerHTML || ""; + } + return e.prototype.setTagName = function(t) { + return this.tagName = t, this; + }, e.prototype.getTagName = function() { + return this.tagName || ""; + }, e.prototype.setAttr = function(t, n) { + var i = this.getAttrs(); + return i[t] = n, this; + }, e.prototype.getAttr = function(t) { + return this.getAttrs()[t]; + }, e.prototype.setAttrs = function(t) { + return Object.assign(this.getAttrs(), t), this; + }, e.prototype.getAttrs = function() { + return this.attrs || (this.attrs = {}); + }, e.prototype.setClass = function(t) { + return this.setAttr("class", t); + }, e.prototype.addClass = function(t) { + for (var n = this.getClass(), i = n ? n.split(whitespaceRe) : [], r = t.split(whitespaceRe), o; o = r.shift(); ) + i.indexOf(o) === -1 && i.push(o); + return this.getAttrs().class = i.join(" "), this; + }, e.prototype.removeClass = function(t) { + for (var n = this.getClass(), i = n ? n.split(whitespaceRe) : [], r = t.split(whitespaceRe), o; i.length && (o = r.shift()); ) { + var s = i.indexOf(o); + s !== -1 && i.splice(s, 1); + } + return this.getAttrs().class = i.join(" "), this; + }, e.prototype.getClass = function() { + return this.getAttrs().class || ""; + }, e.prototype.hasClass = function(t) { + return (" " + this.getClass() + " ").indexOf(" " + t + " ") !== -1; + }, e.prototype.setInnerHTML = function(t) { + return this.innerHTML = t, this; + }, e.prototype.setInnerHtml = function(t) { + return this.setInnerHTML(t); + }, e.prototype.getInnerHTML = function() { + return this.innerHTML || ""; + }, e.prototype.getInnerHtml = function() { + return this.getInnerHTML(); + }, e.prototype.toAnchorString = function() { + var t = this.getTagName(), n = this.buildAttrsStr(); + return n = n ? " " + n : "", ["<", t, n, ">", this.getInnerHtml(), ""].join(""); + }, e.prototype.buildAttrsStr = function() { + if (!this.attrs) + return ""; + var t = this.getAttrs(), n = []; + for (var i in t) + t.hasOwnProperty(i) && n.push(i + '="' + t[i] + '"'); + return n.join(" "); + }, e; + }() +); +function truncateSmart(e, t, n) { + var i, r; + n == null ? (n = "…", r = 3, i = 8) : (r = n.length, i = n.length); + var o = function(x) { + var b = {}, S = x, E = S.match(/^([a-z]+):\/\//i); + return E && (b.scheme = E[1], S = S.substr(E[0].length)), E = S.match(/^(.*?)(?=(\?|#|\/|$))/i), E && (b.host = E[1], S = S.substr(E[0].length)), E = S.match(/^\/(.*?)(?=(\?|#|$))/i), E && (b.path = E[1], S = S.substr(E[0].length)), E = S.match(/^\?(.*?)(?=(#|$))/i), E && (b.query = E[1], S = S.substr(E[0].length)), E = S.match(/^#(.*?)$/i), E && (b.fragment = E[1]), b; + }, s = function(x) { + var b = ""; + return x.scheme && x.host && (b += x.scheme + "://"), x.host && (b += x.host), x.path && (b += "/" + x.path), x.query && (b += "?" + x.query), x.fragment && (b += "#" + x.fragment), b; + }, c = function(x, b) { + var S = b / 2, E = Math.ceil(S), A = -1 * Math.floor(S), D = ""; + return A < 0 && (D = x.substr(A)), x.substr(0, E) + n + D; + }; + if (e.length <= t) + return e; + var l = t - r, d = o(e); + if (d.query) { + var f = d.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i); + f && (d.query = d.query.substr(0, f[1].length), e = s(d)); + } + if (e.length <= t || (d.host && (d.host = d.host.replace(/^www\./, ""), e = s(d)), e.length <= t)) + return e; + var h = ""; + if (d.host && (h += d.host), h.length >= l) + return d.host.length == t ? (d.host.substr(0, t - r) + n).substr(0, l + i) : c(h, l).substr(0, l + i); + var p = ""; + if (d.path && (p += "/" + d.path), d.query && (p += "?" + d.query), p) + if ((h + p).length >= l) { + if ((h + p).length == t) + return (h + p).substr(0, t); + var m = l - h.length; + return (h + c(p, m)).substr(0, l + i); + } else + h += p; + if (d.fragment) { + var _ = "#" + d.fragment; + if ((h + _).length >= l) { + if ((h + _).length == t) + return (h + _).substr(0, t); + var y = l - h.length; + return (h + c(_, y)).substr(0, l + i); + } else + h += _; + } + if (d.scheme && d.host) { + var C = d.scheme + "://"; + if ((h + C).length < l) + return (C + h).substr(0, t); + } + if (h.length <= t) + return h; + var T = ""; + return l > 0 && (T = h.substr(-1 * Math.floor(l / 2))), (h.substr(0, Math.ceil(l / 2)) + n + T).substr(0, l + i); +} +function truncateMiddle(e, t, n) { + if (e.length <= t) + return e; + var i, r; + n == null ? (n = "…", i = 8, r = 3) : (i = n.length, r = n.length); + var o = t - r, s = ""; + return o > 0 && (s = e.substr(-1 * Math.floor(o / 2))), (e.substr(0, Math.ceil(o / 2)) + n + s).substr(0, o + i); +} +function truncateEnd(e, t, n) { + return ellipsis(e, t, n); +} +var AnchorTagBuilder = ( + /** @class */ + function() { + function e(t) { + t === void 0 && (t = {}), this.newWindow = !1, this.truncate = {}, this.className = "", this.newWindow = t.newWindow || !1, this.truncate = t.truncate || {}, this.className = t.className || ""; + } + return e.prototype.build = function(t) { + return new HtmlTag({ + tagName: "a", + attrs: this.createAttrs(t), + innerHtml: this.processAnchorText(t.getAnchorText()) + }); + }, e.prototype.createAttrs = function(t) { + var n = { + href: t.getAnchorHref() + // we'll always have the `href` attribute + }, i = this.createCssClass(t); + return i && (n.class = i), this.newWindow && (n.target = "_blank", n.rel = "noopener noreferrer"), this.truncate && this.truncate.length && this.truncate.length < t.getAnchorText().length && (n.title = t.getAnchorHref()), n; + }, e.prototype.createCssClass = function(t) { + var n = this.className; + if (n) { + for (var i = [n], r = t.getCssClassSuffixes(), o = 0, s = r.length; o < s; o++) + i.push(n + "-" + r[o]); + return i.join(" "); + } else + return ""; + }, e.prototype.processAnchorText = function(t) { + return t = this.doTruncate(t), t; + }, e.prototype.doTruncate = function(t) { + var n = this.truncate; + if (!n || !n.length) + return t; + var i = n.length, r = n.location; + return r === "smart" ? truncateSmart(t, i) : r === "middle" ? truncateMiddle(t, i) : truncateEnd(t, i); + }, e; + }() +), extendStatics = function(e, t) { + return extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, i) { + n.__proto__ = i; + } || function(n, i) { + for (var r in i) Object.prototype.hasOwnProperty.call(i, r) && (n[r] = i[r]); + }, extendStatics(e, t); +}; +function __extends(e, t) { + if (typeof t != "function" && t !== null) + throw new TypeError("Class extends value " + String(t) + " is not a constructor or null"); + extendStatics(e, t); + function n() { + this.constructor = e; + } + e.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n()); +} +var __assign = function() { + return __assign = Object.assign || function(t) { + for (var n, i = 1, r = arguments.length; i < r; i++) { + n = arguments[i]; + for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (t[o] = n[o]); + } + return t; + }, __assign.apply(this, arguments); +}; +typeof SuppressedError == "function" && SuppressedError; +var AbstractMatch = ( + /** @class */ + function() { + function e(t) { + this._ = null, this.matchedText = "", this.offset = 0, this.tagBuilder = t.tagBuilder, this.matchedText = t.matchedText, this.offset = t.offset; + } + return e.prototype.getMatchedText = function() { + return this.matchedText; + }, e.prototype.setOffset = function(t) { + this.offset = t; + }, e.prototype.getOffset = function() { + return this.offset; + }, e.prototype.getCssClassSuffixes = function() { + return [this.type]; + }, e.prototype.buildTag = function() { + return this.tagBuilder.build(this); + }, e; + }() +), tldRegexStr = "(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbah1a3hjkrd|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--mgbcpq6gpa1a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq480n2rg|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|travelchannel|wolterskluwer|xn--cckwcxetd|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--4dbrk0ce|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nextdirect|properties|protection|prudential|realestate|republican|restaurant|schaeffler|tatamotors|technology|university|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--q7ce6a|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|institute|insurance|kuokgroup|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--qxa6a|xn--tckwe|xn--vhquv|yodobashi|موريتانيا|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|builders|business|capetown|catering|catholic|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|etisalat|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|training|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lanxess|lasalle|latrobe|leclerc|limited|lincoln|markets|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|singles|staples|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|البحرين|الجزائر|العليان|پاکستان|كاثوليك|இந்தியா|abarth|abbott|abbvie|africa|agency|airbus|airtel|alipay|alsace|alstom|amazon|anquan|aramco|author|bayern|beauty|berlin|bharti|bostik|boston|broker|camera|career|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|drive|dubai|earth|edeka|email|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|irish|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|loans|locus|lotte|lotto|macys|mango|media|miami|money|movie|music|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|ישראל|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kids|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|read|reit|rent|rest|rich|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|アマゾン|グーグル|クラウド|ポイント|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceo|cfa|cfd|com|cpa|crs|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gay|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|llp|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|spa|srl|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ລາວ|ストア|セール|みんな|中文网|亚马逊|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|ευ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|广东|微博|慈善|手机|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)", tldRegex = new RegExp("^" + tldRegexStr + "$"), urlSuffixStartCharsRe = /[\/?#]/, urlSuffixAllowedSpecialCharsRe = /[-+&@#/%=~_()|'$*\[\]{}\u2713]/, urlSuffixNotAllowedAsLastCharRe = /[?!:,.;^]/, httpSchemeRe = /https?:\/\//i, httpSchemePrefixRe = new RegExp("^" + httpSchemeRe.source, "i"), urlSuffixedCharsNotAllowedAtEndRe = new RegExp(urlSuffixNotAllowedAsLastCharRe.source + "$"), invalidSchemeRe = /^(javascript|vbscript):/i, schemeUrlRe = /^[A-Za-z][-.+A-Za-z0-9]*:(\/\/)?([^:/]*)/, tldUrlHostRe = /^(?:\/\/)?([^/#?:]+)/; +function isSchemeStartChar(e) { + return letterRe.test(e); +} +function isSchemeChar(e) { + return letterRe.test(e) || digitRe.test(e) || e === "+" || e === "-" || e === "."; +} +function isDomainLabelStartChar(e) { + return alphaNumericAndMarksRe.test(e); +} +function isDomainLabelChar(e) { + return e === "_" || isDomainLabelStartChar(e); +} +function isPathChar(e) { + return alphaNumericAndMarksRe.test(e) || urlSuffixAllowedSpecialCharsRe.test(e) || urlSuffixNotAllowedAsLastCharRe.test(e); +} +function isUrlSuffixStartChar(e) { + return urlSuffixStartCharsRe.test(e); +} +function isKnownTld(e) { + return tldRegex.test(e.toLowerCase()); +} +function isValidSchemeUrl(e) { + if (invalidSchemeRe.test(e)) + return !1; + var t = e.match(schemeUrlRe); + if (!t) + return !1; + var n = !!t[1], i = t[2]; + return n ? !0 : !(i.indexOf(".") === -1 || !letterRe.test(i)); +} +function isValidTldMatch(e) { + var t = e.match(tldUrlHostRe); + if (!t) + return !1; + var n = t[0], i = n.split("."); + if (i.length < 2) + return !1; + var r = i[i.length - 1]; + return !!isKnownTld(r); +} +var ipV4Re = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, ipV4PartRe = /[:/?#]/; +function isValidIpV4Address(e) { + var t = e.split(ipV4PartRe, 1)[0]; + return ipV4Re.test(t); +} +var wwwPrefixRegex = /^(https?:\/\/)?(www\.)?/i, protocolRelativeRegex = /^\/\//, UrlMatch = ( + /** @class */ + function(e) { + __extends(t, e); + function t(n) { + var i = e.call(this, n) || this; + return i.type = "url", i.url = "", i.urlMatchType = "scheme", i.protocolRelativeMatch = !1, i.stripPrefix = { + scheme: !0, + www: !0 + }, i.stripTrailingSlash = !0, i.decodePercentEncoding = !0, i.protocolPrepended = !1, i.urlMatchType = n.urlMatchType, i.url = n.url, i.protocolRelativeMatch = n.protocolRelativeMatch, i.stripPrefix = n.stripPrefix, i.stripTrailingSlash = n.stripTrailingSlash, i.decodePercentEncoding = n.decodePercentEncoding, i; + } + return t.prototype.getType = function() { + return "url"; + }, t.prototype.getUrlMatchType = function() { + return this.urlMatchType; + }, t.prototype.getUrl = function() { + var n = this.url; + return !this.protocolRelativeMatch && this.urlMatchType !== "scheme" && !this.protocolPrepended && (n = this.url = "http://" + n, this.protocolPrepended = !0), n; + }, t.prototype.getAnchorHref = function() { + var n = this.getUrl(); + return n.replace(/&/g, "&"); + }, t.prototype.getAnchorText = function() { + var n = this.getMatchedText(); + return this.protocolRelativeMatch && (n = stripProtocolRelativePrefix(n)), this.stripPrefix.scheme && (n = stripSchemePrefix(n)), this.stripPrefix.www && (n = stripWwwPrefix(n)), this.stripTrailingSlash && (n = removeTrailingSlash(n)), this.decodePercentEncoding && (n = removePercentEncoding(n)), n; + }, t; + }(AbstractMatch) +); +function stripSchemePrefix(e) { + return e.replace(httpSchemePrefixRe, ""); +} +function stripWwwPrefix(e) { + return e.replace(wwwPrefixRegex, "$1"); +} +function stripProtocolRelativePrefix(e) { + return e.replace(protocolRelativeRegex, ""); +} +function removeTrailingSlash(e) { + return e.charAt(e.length - 1) === "/" && (e = e.slice(0, -1)), e; +} +function removePercentEncoding(e) { + var t = e.replace(/%22/gi, """).replace(/%26/gi, "&").replace(/%27/gi, "'").replace(/%3C/gi, "<").replace(/%3E/gi, ">"); + try { + return decodeURIComponent(t); + } catch { + return t; + } +} +var mailtoSchemePrefixRe = /^mailto:/i, emailLocalPartCharRegex = new RegExp("[".concat(alphaNumericAndMarksCharsStr, "!#$%&'*+/=?^_`{|}~-]")); +function isEmailLocalPartStartChar(e) { + return alphaNumericAndMarksRe.test(e); +} +function isEmailLocalPartChar(e) { + return emailLocalPartCharRegex.test(e); +} +function isValidEmail(e) { + var t = e.split(".").pop() || ""; + return isKnownTld(t); +} +var EmailMatch = ( + /** @class */ + function(e) { + __extends(t, e); + function t(n) { + var i = e.call(this, n) || this; + return i.type = "email", i.email = "", i.email = n.email, i; + } + return t.prototype.getType = function() { + return "email"; + }, t.prototype.getEmail = function() { + return this.email; + }, t.prototype.getAnchorHref = function() { + return "mailto:" + this.email; + }, t.prototype.getAnchorText = function() { + return this.email; + }, t; + }(AbstractMatch) +); +function isHashtagTextChar(e) { + return e === "_" || alphaNumericAndMarksRe.test(e); +} +function isValidHashtag(e) { + return e.length <= 140; +} +var hashtagServices = ["twitter", "facebook", "instagram", "tiktok"], HashtagMatch = ( + /** @class */ + function(e) { + __extends(t, e); + function t(n) { + var i = e.call(this, n) || this; + return i.type = "hashtag", i.serviceName = "twitter", i.hashtag = "", i.serviceName = n.serviceName, i.hashtag = n.hashtag, i; + } + return t.prototype.getType = function() { + return "hashtag"; + }, t.prototype.getServiceName = function() { + return this.serviceName; + }, t.prototype.getHashtag = function() { + return this.hashtag; + }, t.prototype.getAnchorHref = function() { + var n = this.serviceName, i = this.hashtag; + switch (n) { + case "twitter": + return "https://twitter.com/hashtag/" + i; + case "facebook": + return "https://www.facebook.com/hashtag/" + i; + case "instagram": + return "https://instagram.com/explore/tags/" + i; + case "tiktok": + return "https://www.tiktok.com/tag/" + i; + default: + throw assertNever(n), new Error("Invalid hashtag service: ".concat(n)); + } + }, t.prototype.getAnchorText = function() { + return "#" + this.hashtag; + }, t.prototype.getCssClassSuffixes = function() { + var n = e.prototype.getCssClassSuffixes.call(this), i = this.getServiceName(); + return i && n.push(i), n; + }, t; + }(AbstractMatch) +), mentionRegexes = { + twitter: /^@\w{1,15}$/, + instagram: /^@[_\w]{1,30}$/, + soundcloud: /^@[-a-z0-9_]{3,25}$/, + // TikTok usernames are 1-24 characters containing letters, numbers, underscores + // and periods, but cannot end in a period: https://support.tiktok.com/en/getting-started/setting-up-your-profile/changing-your-username + tiktok: /^@[.\w]{1,23}[\w]$/ +}, mentionTextCharRe = /[-\w.]/; +function isMentionTextChar(e) { + return mentionTextCharRe.test(e); +} +function isValidMention(e, t) { + var n = mentionRegexes[t]; + return n.test(e); +} +var mentionServices = ["twitter", "instagram", "soundcloud", "tiktok"], MentionMatch = ( + /** @class */ + function(e) { + __extends(t, e); + function t(n) { + var i = e.call(this, n) || this; + return i.type = "mention", i.serviceName = "twitter", i.mention = "", i.mention = n.mention, i.serviceName = n.serviceName, i; + } + return t.prototype.getType = function() { + return "mention"; + }, t.prototype.getMention = function() { + return this.mention; + }, t.prototype.getServiceName = function() { + return this.serviceName; + }, t.prototype.getAnchorHref = function() { + switch (this.serviceName) { + case "twitter": + return "https://twitter.com/" + this.mention; + case "instagram": + return "https://instagram.com/" + this.mention; + case "soundcloud": + return "https://soundcloud.com/" + this.mention; + case "tiktok": + return "https://www.tiktok.com/@" + this.mention; + default: + throw new Error("Unknown service name to point mention to: " + this.serviceName); + } + }, t.prototype.getAnchorText = function() { + return "@" + this.mention; + }, t.prototype.getCssClassSuffixes = function() { + var n = e.prototype.getCssClassSuffixes.call(this), i = this.getServiceName(); + return i && n.push(i), n; + }, t; + }(AbstractMatch) +), separatorCharRe = /[-. ]/, hasDelimCharsRe = /[-. ()]/, controlCharRe = /[,;]/, mostPhoneNumbers = /(?:(?:(?:(\+)?\d{1,3}[-. ]?)?\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-. ]?(?:\d[-. ]?){6,12}\d+))([,;]+[0-9]+#?)*/, japanesePhoneRe = /(0([1-9]-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/, validPhoneNumberRe = new RegExp("^".concat(mostPhoneNumbers.source, "|").concat(japanesePhoneRe.source, "$")); +function isPhoneNumberSeparatorChar(e) { + return separatorCharRe.test(e); +} +function isPhoneNumberControlChar(e) { + return controlCharRe.test(e); +} +function isValidPhoneNumber(e) { + var t = e.charAt(0) === "+" || hasDelimCharsRe.test(e); + return t && validPhoneNumberRe.test(e); +} +var PhoneMatch = ( + /** @class */ + function(e) { + __extends(t, e); + function t(n) { + var i = e.call(this, n) || this; + return i.type = "phone", i.number = "", i.plusSign = !1, i.number = n.number, i.plusSign = n.plusSign, i; + } + return t.prototype.getType = function() { + return "phone"; + }, t.prototype.getPhoneNumber = function() { + return this.number; + }, t.prototype.getNumber = function() { + return this.getPhoneNumber(); + }, t.prototype.getAnchorHref = function() { + return "tel:" + (this.plusSign ? "+" : "") + this.number; + }, t.prototype.getAnchorText = function() { + return this.matchedText; + }, t; + }(AbstractMatch) +); +function parseMatches(e, t) { + for (var n = t.tagBuilder, i = t.stripPrefix, r = t.stripTrailingSlash, o = t.decodePercentEncoding, s = t.hashtagServiceName, c = t.mentionServiceName, l = [], d = e.length, f = [], h = 0; h < d; h++) { + var p = e.charAt(h); + if (f.length === 0) + C(p); + else + for (var m = f.length - 1; m >= 0; m--) { + var _ = f[m]; + switch (_.state) { + case 11: + A(_, p); + break; + case 12: + D(_, p); + break; + case 0: + T(_, p); + break; + case 1: + x(_, p); + break; + case 2: + b(_, p); + break; + case 3: + S(_, p); + break; + case 4: + E(_, p); + break; + case 5: + P(_, p); + break; + case 6: + I(_, p); + break; + case 7: + M(_, p); + break; + case 13: + R(_, p); + break; + case 14: + L(_, p); + break; + case 8: + g(_, p); + break; + case 9: + w(_, p); + break; + case 10: + O(_, p); + break; + case 15: + N(_, p); + break; + case 16: + F(_, p); + break; + case 17: + B(_, p); + break; + case 18: + V(_, p); + break; + case 19: + U(_, p); + break; + case 20: + k(_, p); + break; + case 21: + $(_, p); + break; + case 22: + G(_, p); + break; + case 23: + q(_, p); + break; + case 24: + z(_, p); + break; + case 25: + H(_, p); + break; + case 26: + Q(_, p); + break; + case 27: + ne(_, p); + break; + case 28: + K(_, p); + break; + case 29: + Z(_, p); + break; + case 30: + ee(_, p); + break; + case 31: + oe(_, p); + break; + case 32: + fe(_, p); + break; + case 33: + de(_, p); + break; + case 34: + ce(_, p); + break; + case 35: + ye(_, p); + break; + case 36: + ge(_, p); + break; + case 37: + X(_, p); + break; + case 38: + re(_, p); + break; + case 39: + be(_, p); + break; + case 40: + pe(_, p); + break; + case 41: + Te(_, p); + break; + default: + assertNever(_.state); + } + } + } + for (var y = f.length - 1; y >= 0; y--) + f.forEach(function(W) { + return xe(W); + }); + return l; + function C(W) { + if (W === "#") + f.push(createHashtagStateMachine( + h, + 28 + /* HashtagHashChar */ + )); + else if (W === "@") + f.push(createMentionStateMachine( + h, + 30 + /* MentionAtChar */ + )); + else if (W === "/") + f.push(createTldUrlStateMachine( + h, + 11 + /* ProtocolRelativeSlash1 */ + )); + else if (W === "+") + f.push(createPhoneNumberStateMachine( + h, + 37 + /* PhoneNumberPlus */ + )); + else if (W === "(") + f.push(createPhoneNumberStateMachine( + h, + 32 + /* PhoneNumberOpenParen */ + )); + else { + if (digitRe.test(W) && (f.push(createPhoneNumberStateMachine( + h, + 38 + /* PhoneNumberDigit */ + )), f.push(createIpV4UrlStateMachine( + h, + 13 + /* IpV4Digit */ + ))), isEmailLocalPartStartChar(W)) { + var j = W.toLowerCase() === "m" ? 15 : 22; + f.push(createEmailStateMachine(h, j)); + } + isSchemeStartChar(W) && f.push(createSchemeUrlStateMachine( + h, + 0 + /* SchemeChar */ + )), alphaNumericAndMarksRe.test(W) && f.push(createTldUrlStateMachine( + h, + 5 + /* DomainLabelChar */ + )); + } + } + function T(W, j) { + j === ":" ? W.state = 2 : j === "-" ? W.state = 1 : isSchemeChar(j) || remove$1(f, W); + } + function x(W, j) { + j === "-" || (j === "/" ? (remove$1(f, W), f.push(createTldUrlStateMachine( + h, + 11 + /* ProtocolRelativeSlash1 */ + ))) : isSchemeChar(j) ? W.state = 0 : remove$1(f, W)); + } + function b(W, j) { + j === "/" ? W.state = 3 : j === "." ? remove$1(f, W) : isDomainLabelStartChar(j) ? (W.state = 5, isSchemeStartChar(j) && f.push(createSchemeUrlStateMachine( + h, + 0 + /* SchemeChar */ + ))) : remove$1(f, W); + } + function S(W, j) { + j === "/" ? W.state = 4 : isPathChar(j) ? (W.state = 10, W.acceptStateReached = !0) : xe(W); + } + function E(W, j) { + j === "/" ? W.state = 10 : isDomainLabelStartChar(j) ? (W.state = 5, W.acceptStateReached = !0) : remove$1(f, W); + } + function A(W, j) { + j === "/" ? W.state = 12 : remove$1(f, W); + } + function D(W, j) { + isDomainLabelStartChar(j) ? W.state = 5 : remove$1(f, W); + } + function P(W, j) { + j === "." ? W.state = 7 : j === "-" ? W.state = 6 : j === ":" ? W.state = 8 : isUrlSuffixStartChar(j) ? W.state = 10 : isDomainLabelChar(j) || xe(W); + } + function I(W, j) { + j === "-" || (j === "." ? xe(W) : isDomainLabelStartChar(j) ? W.state = 5 : xe(W)); + } + function M(W, j) { + j === "." ? xe(W) : isDomainLabelStartChar(j) ? (W.state = 5, W.acceptStateReached = !0) : xe(W); + } + function R(W, j) { + j === "." ? W.state = 14 : j === ":" ? W.state = 8 : digitRe.test(j) || (isUrlSuffixStartChar(j) ? W.state = 10 : alphaNumericAndMarksRe.test(j) ? remove$1(f, W) : xe(W)); + } + function L(W, j) { + digitRe.test(j) ? (W.octetsEncountered++, W.octetsEncountered === 4 && (W.acceptStateReached = !0), W.state = 13) : xe(W); + } + function g(W, j) { + digitRe.test(j) ? W.state = 9 : xe(W); + } + function w(W, j) { + digitRe.test(j) || (isUrlSuffixStartChar(j) ? W.state = 10 : xe(W)); + } + function O(W, j) { + isPathChar(j) || xe(W); + } + function N(W, j) { + j.toLowerCase() === "a" ? W.state = 16 : G(W, j); + } + function F(W, j) { + j.toLowerCase() === "i" ? W.state = 17 : G(W, j); + } + function B(W, j) { + j.toLowerCase() === "l" ? W.state = 18 : G(W, j); + } + function V(W, j) { + j.toLowerCase() === "t" ? W.state = 19 : G(W, j); + } + function U(W, j) { + j.toLowerCase() === "o" ? W.state = 20 : G(W, j); + } + function k(W, j) { + j.toLowerCase() === ":" ? W.state = 21 : G(W, j); + } + function $(W, j) { + isEmailLocalPartChar(j) ? W.state = 22 : remove$1(f, W); + } + function G(W, j) { + j === "." ? W.state = 23 : j === "@" ? W.state = 24 : isEmailLocalPartChar(j) ? W.state = 22 : remove$1(f, W); + } + function q(W, j) { + j === "." || j === "@" ? remove$1(f, W) : isEmailLocalPartChar(j) ? W.state = 22 : remove$1(f, W); + } + function z(W, j) { + isDomainLabelStartChar(j) ? W.state = 25 : remove$1(f, W); + } + function H(W, j) { + j === "." ? W.state = 27 : j === "-" ? W.state = 26 : isDomainLabelChar(j) || xe(W); + } + function Q(W, j) { + j === "-" || j === "." ? xe(W) : isDomainLabelChar(j) ? W.state = 25 : xe(W); + } + function ne(W, j) { + j === "." || j === "-" ? xe(W) : isDomainLabelStartChar(j) ? (W.state = 25, W.acceptStateReached = !0) : xe(W); + } + function K(W, j) { + isHashtagTextChar(j) ? (W.state = 29, W.acceptStateReached = !0) : remove$1(f, W); + } + function Z(W, j) { + isHashtagTextChar(j) || xe(W); + } + function ee(W, j) { + isMentionTextChar(j) ? (W.state = 31, W.acceptStateReached = !0) : remove$1(f, W); + } + function oe(W, j) { + isMentionTextChar(j) || (alphaNumericAndMarksRe.test(j) ? remove$1(f, W) : xe(W)); + } + function X(W, j) { + digitRe.test(j) ? W.state = 38 : (remove$1(f, W), C(j)); + } + function fe(W, j) { + digitRe.test(j) ? W.state = 33 : remove$1(f, W), C(j); + } + function de(W, j) { + digitRe.test(j) ? W.state = 34 : remove$1(f, W); + } + function ce(W, j) { + digitRe.test(j) ? W.state = 35 : remove$1(f, W); + } + function ye(W, j) { + j === ")" ? W.state = 36 : remove$1(f, W); + } + function ge(W, j) { + digitRe.test(j) ? W.state = 38 : isPhoneNumberSeparatorChar(j) ? W.state = 39 : remove$1(f, W); + } + function re(W, j) { + W.acceptStateReached = !0, isPhoneNumberControlChar(j) ? W.state = 40 : j === "#" ? W.state = 41 : digitRe.test(j) || (j === "(" ? W.state = 32 : isPhoneNumberSeparatorChar(j) ? W.state = 39 : (xe(W), isSchemeStartChar(j) && f.push(createSchemeUrlStateMachine( + h, + 0 + /* SchemeChar */ + )))); + } + function be(W, j) { + digitRe.test(j) ? W.state = 38 : j === "(" ? W.state = 32 : (xe(W), C(j)); + } + function pe(W, j) { + isPhoneNumberControlChar(j) || (j === "#" ? W.state = 41 : digitRe.test(j) ? W.state = 38 : xe(W)); + } + function Te(W, j) { + isPhoneNumberControlChar(j) ? W.state = 40 : digitRe.test(j) ? remove$1(f, W) : xe(W); + } + function xe(W) { + if (remove$1(f, W), !!W.acceptStateReached) { + var j = W.startIdx, se = e.slice(W.startIdx, h); + if (se = excludeUnbalancedTrailingBracesAndPunctuation(se), W.type === "url") { + var Pe = e.charAt(W.startIdx - 1); + if (Pe === "@") + return; + var le = W.matchType; + if (le === "scheme") { + var De = httpSchemeRe.exec(se); + if (De && (j = j + De.index, se = se.slice(De.index)), !isValidSchemeUrl(se)) + return; + } else if (le === "tld") { + if (!isValidTldMatch(se)) + return; + } else if (le === "ipV4") { + if (!isValidIpV4Address(se)) + return; + } else + assertNever(le); + l.push(new UrlMatch({ + tagBuilder: n, + matchedText: se, + offset: j, + urlMatchType: le, + url: se, + protocolRelativeMatch: se.slice(0, 2) === "//", + // TODO: Do these settings need to be passed to the match, + // or should we handle them here in UrlMatcher? + stripPrefix: i, + stripTrailingSlash: r, + decodePercentEncoding: o + })); + } else if (W.type === "email") + isValidEmail(se) && l.push(new EmailMatch({ + tagBuilder: n, + matchedText: se, + offset: j, + email: se.replace(mailtoSchemePrefixRe, "") + })); + else if (W.type === "hashtag") + isValidHashtag(se) && l.push(new HashtagMatch({ + tagBuilder: n, + matchedText: se, + offset: j, + serviceName: s, + hashtag: se.slice(1) + })); + else if (W.type === "mention") + isValidMention(se, c) && l.push(new MentionMatch({ + tagBuilder: n, + matchedText: se, + offset: j, + serviceName: c, + mention: se.slice(1) + // strip off the '@' character at the beginning + })); + else if (W.type === "phone") { + if (se = se.replace(/ +$/g, ""), isValidPhoneNumber(se)) { + var Me = se.replace(/[^0-9,;#]/g, ""); + l.push(new PhoneMatch({ + tagBuilder: n, + matchedText: se, + offset: j, + number: Me, + plusSign: se.charAt(0) === "+" + })); + } + } else + assertNever(W); + } + } +} +var openBraceRe = /[\(\{\[]/, closeBraceRe = /[\)\}\]]/, oppositeBrace = { + ")": "(", + "}": "{", + "]": "[" +}; +function excludeUnbalancedTrailingBracesAndPunctuation(e) { + for (var t = { + "(": 0, + "{": 0, + "[": 0 + }, n = 0; n < e.length; n++) { + var i = e.charAt(n); + openBraceRe.test(i) ? t[i]++ : closeBraceRe.test(i) && t[oppositeBrace[i]]--; + } + for (var r = e.length - 1, o; r >= 0; ) + if (o = e.charAt(r), closeBraceRe.test(o)) { + var s = oppositeBrace[o]; + if (t[s] < 0) + t[s]++, r--; + else + break; + } else if (urlSuffixedCharsNotAllowedAtEndRe.test(o)) + r--; + else + break; + return e.slice(0, r + 1); +} +function createSchemeUrlStateMachine(e, t) { + return { + type: "url", + startIdx: e, + state: t, + acceptStateReached: !1, + matchType: "scheme" + }; +} +function createTldUrlStateMachine(e, t) { + return { + type: "url", + startIdx: e, + state: t, + acceptStateReached: !1, + matchType: "tld" + }; +} +function createIpV4UrlStateMachine(e, t) { + return { + type: "url", + startIdx: e, + state: t, + acceptStateReached: !1, + matchType: "ipV4", + octetsEncountered: 1 + // starts at 1 because we create this machine when encountering the first octet + }; +} +function createEmailStateMachine(e, t) { + return { + type: "email", + startIdx: e, + state: t, + acceptStateReached: !1 + }; +} +function createHashtagStateMachine(e, t) { + return { + type: "hashtag", + startIdx: e, + state: t, + acceptStateReached: !1 + }; +} +function createMentionStateMachine(e, t) { + return { + type: "mention", + startIdx: e, + state: t, + acceptStateReached: !1 + }; +} +function createPhoneNumberStateMachine(e, t) { + return { + type: "phone", + startIdx: e, + state: t, + acceptStateReached: !1 + }; +} +function parseHtml(e, t) { + for (var n = t.onOpenTag, i = t.onCloseTag, r = t.onText, o = t.onComment, s = t.onDoctype, c = new CurrentTag(), l = 0, d = e.length, f = 0, h = 0, p = c; l < d; ) { + var m = e.charAt(l); + switch (f) { + case 0: + _(m); + break; + case 1: + y(m); + break; + case 2: + T(m); + break; + case 3: + C(m); + break; + case 4: + x(m); + break; + case 5: + b(m); + break; + case 6: + S(m); + break; + case 7: + E(m); + break; + case 8: + A(m); + break; + case 9: + D(m); + break; + case 10: + P(m); + break; + case 11: + I(m); + break; + case 12: + M(m); + break; + case 13: + R(); + break; + case 14: + L(m); + break; + case 15: + g(m); + break; + case 16: + w(m); + break; + case 17: + O(m); + break; + case 18: + N(m); + break; + case 19: + F(m); + break; + case 20: + B(m); + break; + default: + assertNever(f); + } + l++; + } + h < l && $(); + function _(z) { + z === "<" && U(); + } + function y(z) { + z === "!" ? f = 13 : z === "/" ? (f = 2, p = new CurrentTag(__assign(__assign({}, p), { isClosing: !0 }))) : z === "<" ? U() : letterRe.test(z) ? (f = 3, p = new CurrentTag(__assign(__assign({}, p), { isOpening: !0 }))) : (f = 0, p = c); + } + function C(z) { + whitespaceRe.test(z) ? (p = new CurrentTag(__assign(__assign({}, p), { name: G() })), f = 4) : z === "<" ? U() : z === "/" ? (p = new CurrentTag(__assign(__assign({}, p), { name: G() })), f = 12) : z === ">" ? (p = new CurrentTag(__assign(__assign({}, p), { name: G() })), k()) : !letterRe.test(z) && !digitRe.test(z) && z !== ":" && V(); + } + function T(z) { + z === ">" ? V() : letterRe.test(z) ? f = 3 : V(); + } + function x(z) { + whitespaceRe.test(z) || (z === "/" ? f = 12 : z === ">" ? k() : z === "<" ? U() : z === "=" || quoteRe.test(z) || controlCharsRe.test(z) ? V() : f = 5); + } + function b(z) { + whitespaceRe.test(z) ? f = 6 : z === "/" ? f = 12 : z === "=" ? f = 7 : z === ">" ? k() : z === "<" ? U() : quoteRe.test(z) && V(); + } + function S(z) { + whitespaceRe.test(z) || (z === "/" ? f = 12 : z === "=" ? f = 7 : z === ">" ? k() : z === "<" ? U() : quoteRe.test(z) ? V() : f = 5); + } + function E(z) { + whitespaceRe.test(z) || (z === '"' ? f = 8 : z === "'" ? f = 9 : /[>=`]/.test(z) ? V() : z === "<" ? U() : f = 10); + } + function A(z) { + z === '"' && (f = 11); + } + function D(z) { + z === "'" && (f = 11); + } + function P(z) { + whitespaceRe.test(z) ? f = 4 : z === ">" ? k() : z === "<" && U(); + } + function I(z) { + whitespaceRe.test(z) ? f = 4 : z === "/" ? f = 12 : z === ">" ? k() : z === "<" ? U() : (f = 4, q()); + } + function M(z) { + z === ">" ? (p = new CurrentTag(__assign(__assign({}, p), { isClosing: !0 })), k()) : f = 4; + } + function R(z) { + e.substr(l, 2) === "--" ? (l += 2, p = new CurrentTag(__assign(__assign({}, p), { type: "comment" })), f = 14) : e.substr(l, 7).toUpperCase() === "DOCTYPE" ? (l += 7, p = new CurrentTag(__assign(__assign({}, p), { type: "doctype" })), f = 20) : V(); + } + function L(z) { + z === "-" ? f = 15 : z === ">" ? V() : f = 16; + } + function g(z) { + z === "-" ? f = 18 : z === ">" ? V() : f = 16; + } + function w(z) { + z === "-" && (f = 17); + } + function O(z) { + z === "-" ? f = 18 : f = 16; + } + function N(z) { + z === ">" ? k() : z === "!" ? f = 19 : z === "-" || (f = 16); + } + function F(z) { + z === "-" ? f = 17 : z === ">" ? k() : f = 16; + } + function B(z) { + z === ">" ? k() : z === "<" && U(); + } + function V() { + f = 0, p = c; + } + function U() { + f = 1, p = new CurrentTag({ idx: l }); + } + function k() { + var z = e.slice(h, p.idx); + z && r(z, h), p.type === "comment" ? o(p.idx) : p.type === "doctype" ? s(p.idx) : (p.isOpening && n(p.name, p.idx), p.isClosing && i(p.name, p.idx)), V(), h = l + 1; + } + function $() { + var z = e.slice(h, l); + r(z, h), h = l + 1; + } + function G() { + var z = p.idx + (p.isClosing ? 2 : 1); + return e.slice(z, l).toLowerCase(); + } + function q() { + l--; + } +} +var CurrentTag = ( + /** @class */ + /* @__PURE__ */ function() { + function e(t) { + t === void 0 && (t = {}), this.idx = t.idx !== void 0 ? t.idx : -1, this.type = t.type || "tag", this.name = t.name || "", this.isOpening = !!t.isOpening, this.isClosing = !!t.isClosing; + } + return e; + }() +), Autolinker = ( + /** @class */ + function() { + function e(t) { + t === void 0 && (t = {}), this.version = e.version, this.urls = {}, this.email = !0, this.phone = !0, this.hashtag = !1, this.mention = !1, this.newWindow = !0, this.stripPrefix = { + scheme: !0, + www: !0 + }, this.stripTrailingSlash = !0, this.decodePercentEncoding = !0, this.truncate = { + length: 0, + location: "end" + }, this.className = "", this.replaceFn = null, this.context = void 0, this.sanitizeHtml = !1, this.tagBuilder = null, this.urls = normalizeUrlsCfg(t.urls), this.email = isBoolean(t.email) ? t.email : this.email, this.phone = isBoolean(t.phone) ? t.phone : this.phone, this.hashtag = t.hashtag || this.hashtag, this.mention = t.mention || this.mention, this.newWindow = isBoolean(t.newWindow) ? t.newWindow : this.newWindow, this.stripPrefix = normalizeStripPrefixCfg(t.stripPrefix), this.stripTrailingSlash = isBoolean(t.stripTrailingSlash) ? t.stripTrailingSlash : this.stripTrailingSlash, this.decodePercentEncoding = isBoolean(t.decodePercentEncoding) ? t.decodePercentEncoding : this.decodePercentEncoding, this.sanitizeHtml = t.sanitizeHtml || !1; + var n = this.mention; + if (n !== !1 && mentionServices.indexOf(n) === -1) + throw new Error("invalid `mention` cfg '".concat(n, "' - see docs")); + var i = this.hashtag; + if (i !== !1 && hashtagServices.indexOf(i) === -1) + throw new Error("invalid `hashtag` cfg '".concat(i, "' - see docs")); + this.truncate = normalizeTruncateCfg(t.truncate), this.className = t.className || this.className, this.replaceFn = t.replaceFn || this.replaceFn, this.context = t.context || this; + } + return e.link = function(t, n) { + var i = new e(n); + return i.link(t); + }, e.parse = function(t, n) { + var i = new e(n); + return i.parse(t); + }, e.prototype.parse = function(t) { + var n = this, i = ["a", "style", "script"], r = 0, o = []; + return parseHtml(t, { + onOpenTag: function(s) { + i.indexOf(s) >= 0 && r++; + }, + onText: function(s, c) { + if (r === 0) { + var l = /( | |<|<|>|>|"|"|')/gi, d = s.split(l), f = c; + d.forEach(function(h, p) { + if (p % 2 === 0) { + var m = n.parseText(h, f); + o.push.apply(o, m); + } + f += h.length; + }); + } + }, + onCloseTag: function(s) { + i.indexOf(s) >= 0 && (r = Math.max(r - 1, 0)); + }, + onComment: function(s) { + }, + onDoctype: function(s) { + } + // no need to process doctype nodes + }), o = this.compactMatches(o), o = this.removeUnwantedMatches(o), o; + }, e.prototype.compactMatches = function(t) { + t.sort(function(l, d) { + return l.getOffset() - d.getOffset(); + }); + for (var n = 0; n < t.length - 1; ) { + var i = t[n], r = i.getOffset(), o = i.getMatchedText().length, s = r + o; + if (n + 1 < t.length) { + if (t[n + 1].getOffset() === r) { + var c = t[n + 1].getMatchedText().length > o ? n : n + 1; + t.splice(c, 1); + continue; + } + if (t[n + 1].getOffset() < s) { + t.splice(n + 1, 1); + continue; + } + } + n++; + } + return t; + }, e.prototype.removeUnwantedMatches = function(t) { + return this.hashtag || removeWithPredicate(t, function(n) { + return n.getType() === "hashtag"; + }), this.email || removeWithPredicate(t, function(n) { + return n.getType() === "email"; + }), this.phone || removeWithPredicate(t, function(n) { + return n.getType() === "phone"; + }), this.mention || removeWithPredicate(t, function(n) { + return n.getType() === "mention"; + }), this.urls.schemeMatches || removeWithPredicate(t, function(n) { + return n.getType() === "url" && n.getUrlMatchType() === "scheme"; + }), this.urls.tldMatches || removeWithPredicate(t, function(n) { + return n.getType() === "url" && n.getUrlMatchType() === "tld"; + }), this.urls.ipV4Matches || removeWithPredicate(t, function(n) { + return n.getType() === "url" && n.getUrlMatchType() === "ipV4"; + }), t; + }, e.prototype.parseText = function(t, n) { + n === void 0 && (n = 0), n = n || 0; + for (var i = parseMatches(t, { + tagBuilder: this.getTagBuilder(), + stripPrefix: this.stripPrefix, + stripTrailingSlash: this.stripTrailingSlash, + decodePercentEncoding: this.decodePercentEncoding, + hashtagServiceName: this.hashtag, + mentionServiceName: this.mention || "twitter" + }), r = 0, o = i.length; r < o; r++) + i[r].setOffset(n + i[r].getOffset()); + return i; + }, e.prototype.link = function(t) { + if (!t) + return ""; + this.sanitizeHtml && (t = t.replace(//g, ">")); + for (var n = this.parse(t), i = [], r = 0, o = 0, s = n.length; o < s; o++) { + var c = n[o]; + i.push(t.substring(r, c.getOffset())), i.push(this.createMatchReturnVal(c)), r = c.getOffset() + c.getMatchedText().length; + } + return i.push(t.substring(r)), i.join(""); + }, e.prototype.createMatchReturnVal = function(t) { + var n; + if (this.replaceFn && (n = this.replaceFn.call(this.context, t)), typeof n == "string") + return n; + if (n === !1) + return t.getMatchedText(); + if (n instanceof HtmlTag) + return n.toAnchorString(); + var i = t.buildTag(); + return i.toAnchorString(); + }, e.prototype.getTagBuilder = function() { + var t = this.tagBuilder; + return t || (t = this.tagBuilder = new AnchorTagBuilder({ + newWindow: this.newWindow, + truncate: this.truncate, + className: this.className + })), t; + }, e.version = version, e; + }() +); +function normalizeUrlsCfg(e) { + return e == null && (e = !0), isBoolean(e) ? { schemeMatches: e, tldMatches: e, ipV4Matches: e } : { + schemeMatches: isBoolean(e.schemeMatches) ? e.schemeMatches : !0, + tldMatches: isBoolean(e.tldMatches) ? e.tldMatches : !0, + ipV4Matches: isBoolean(e.ipV4Matches) ? e.ipV4Matches : !0 + }; +} +function normalizeStripPrefixCfg(e) { + return e == null && (e = !0), isBoolean(e) ? { scheme: e, www: e } : { + scheme: isBoolean(e.scheme) ? e.scheme : !0, + www: isBoolean(e.www) ? e.www : !0 + }; +} +function normalizeTruncateCfg(e) { + return typeof e == "number" ? { length: e, location: "end" } : defaults(e || {}, { + length: Number.POSITIVE_INFINITY, + location: "end" + }); +} +let parser$1; +typeof DOMParser < "u" && (parser$1 = new DOMParser()); +const autolinker$1 = new Autolinker({ + stripPrefix: !1, + email: !1, + replaceFn: function(e, t) { + return t.urlMatchType === "scheme" || t.urlMatchType === "www"; + } +}), BILLBOARD_SIZE$2 = 32, BILLBOARD_NEAR_DISTANCE$1 = 2414016, BILLBOARD_NEAR_RATIO$1 = 1, BILLBOARD_FAR_DISTANCE$1 = 16093e3, BILLBOARD_FAR_RATIO$1 = 0.1, gpxNamespaces = [null, void 0, "http://www.topografix.com/GPX/1/1"], namespaces$1 = { + gpx: gpxNamespaces +}; +function readBlobAsText$1(e) { + return new Promise((t, n) => { + const i = new FileReader(); + i.addEventListener("load", function() { + t(i.result); + }), i.addEventListener("error", function() { + n(i.error); + }), i.readAsText(e); + }); +} +function getOrCreateEntity(e, t) { + let n = queryStringAttribute$1(e, "id"); + return n = defined(n) ? n : createGuid(), t.getOrCreateEntity(n); +} +function readCoordinateFromNode(e) { + const t = queryNumericAttribute$1(e, "lon"), n = queryNumericAttribute$1(e, "lat"), i = queryNumericValue$1(e, "ele", namespaces$1.gpx); + return Cartesian3.fromDegrees(t, n, i); +} +function queryNumericAttribute$1(e, t) { + if (!defined(e)) + return; + const n = e.getAttribute(t); + if (n !== null) { + const i = parseFloat(n); + return isNaN(i) ? void 0 : i; + } +} +function queryStringAttribute$1(e, t) { + if (!defined(e)) + return; + const n = e.getAttribute(t); + return n !== null ? n : void 0; +} +function queryFirstNode$1(e, t, n) { + if (!defined(e)) + return; + const i = e.childNodes, r = i.length; + for (let o = 0; o < r; o++) { + const s = i[o]; + if (s.localName === t && n.indexOf(s.namespaceURI) !== -1) + return s; + } +} +function queryNodes$1(e, t, n) { + if (!defined(e)) + return; + const i = [], r = e.getElementsByTagName(t), o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s]; + c.localName === t && n.indexOf(c.namespaceURI) !== -1 && i.push(c); + } + return i; +} +function queryNumericValue$1(e, t, n) { + const i = queryFirstNode$1(e, t, n); + if (defined(i)) { + const r = parseFloat(i.textContent); + return isNaN(r) ? void 0 : r; + } +} +function queryStringValue$1(e, t, n) { + const i = queryFirstNode$1(e, t, n); + if (defined(i)) + return i.textContent.trim(); +} +function createDefaultBillboard$1(e) { + const t = new BillboardGraphics(); + return t.width = BILLBOARD_SIZE$2, t.height = BILLBOARD_SIZE$2, t.scaleByDistance = new NearFarScalar( + BILLBOARD_NEAR_DISTANCE$1, + BILLBOARD_NEAR_RATIO$1, + BILLBOARD_FAR_DISTANCE$1, + BILLBOARD_FAR_RATIO$1 + ), t.pixelOffsetScaleByDistance = new NearFarScalar( + BILLBOARD_NEAR_DISTANCE$1, + BILLBOARD_NEAR_RATIO$1, + BILLBOARD_FAR_DISTANCE$1, + BILLBOARD_FAR_RATIO$1 + ), t.verticalOrigin = new ConstantProperty(VerticalOrigin$1.BOTTOM), t.image = e, t; +} +function createDefaultLabel$1() { + const e = new LabelGraphics(); + return e.translucencyByDistance = new NearFarScalar(3e6, 1, 5e6, 0), e.pixelOffset = new Cartesian2(17, 0), e.horizontalOrigin = HorizontalOrigin$1.LEFT, e.font = "16px sans-serif", e.style = LabelStyle$1.FILL_AND_OUTLINE, e; +} +function createDefaultPolyline(e) { + const t = new PolylineGraphics(); + return t.width = 4, t.material = new PolylineOutlineMaterialProperty(), t.material.color = defined(e) ? e : Color.RED, t.material.outlineWidth = 2, t.material.outlineColor = Color.BLACK, t; +} +const descriptiveInfoTypes = { + time: { + text: "Time", + tag: "time" + }, + comment: { + text: "Comment", + tag: "cmt" + }, + description: { + text: "Description", + tag: "desc" + }, + source: { + text: "Source", + tag: "src" + }, + number: { + text: "GPS track/route number", + tag: "number" + }, + type: { + text: "Type", + tag: "type" + } +}; +let scratchDiv$1; +typeof document < "u" && (scratchDiv$1 = document.createElement("div")); +function processDescription$1(e, t) { + let n, i = ""; + const r = Object.keys(descriptiveInfoTypes), o = r.length; + for (n = 0; n < o; n++) { + const f = r[n], h = descriptiveInfoTypes[f]; + h.value = defaultValue( + queryStringValue$1(e, h.tag, namespaces$1.gpx), + "" + ), defined(h.value) && h.value !== "" && (i = `${i}

${h.text}: ${h.value}

`); + } + if (!defined(i) || i === "") + return; + i = autolinker$1.link(i), scratchDiv$1.innerHTML = i; + const s = scratchDiv$1.querySelectorAll("a"); + for (n = 0; n < s.length; n++) + s[n].setAttribute("target", "_blank"); + const c = Color.WHITE, l = Color.BLACK; + let d = '
`, scratchDiv$1.innerHTML = "", d; +} +function processWpt(e, t, n, i) { + const r = readCoordinateFromNode(t), o = getOrCreateEntity(t, n); + o.position = r; + const s = defined(i.waypointImage) ? i.waypointImage : e._pinBuilder.fromMakiIconId( + "marker", + Color.RED, + BILLBOARD_SIZE$2 + ); + o.billboard = createDefaultBillboard$1(s); + const c = queryStringValue$1(t, "name", namespaces$1.gpx); + o.name = c, o.label = createDefaultLabel$1(), o.label.text = c, o.description = processDescription$1(t), i.clampToGround && (o.billboard.heightReference = HeightReference$1.CLAMP_TO_GROUND, o.label.heightReference = HeightReference$1.CLAMP_TO_GROUND); +} +function processRte(e, t, n, i) { + const r = getOrCreateEntity(t, n); + r.description = processDescription$1(t); + const o = queryNodes$1(t, "rtept", namespaces$1.gpx), s = new Array(o.length); + for (let c = 0; c < o.length; c++) + processWpt(e, o[c], n, i), s[c] = readCoordinateFromNode(o[c]); + r.polyline = createDefaultPolyline(i.routeColor), i.clampToGround && (r.polyline.clampToGround = !0), r.polyline.positions = s; +} +function processTrk(e, t, n, i) { + const r = getOrCreateEntity(t, n); + r.description = processDescription$1(t); + const o = queryNodes$1(t, "trkseg", namespaces$1.gpx); + let s = [], c = [], l, d = !0; + const f = new SampledPositionProperty(); + for (let h = 0; h < o.length; h++) + l = processTrkSeg(o[h]), s = s.concat(l.positions), l.times.length > 0 ? (c = c.concat(l.times), f.addSamples(c, s), d = d && !0) : d = !1; + if (d) { + const h = defined(i.waypointImage) ? i.waypointImage : e._pinBuilder.fromMakiIconId( + "marker", + Color.RED, + BILLBOARD_SIZE$2 + ); + r.billboard = createDefaultBillboard$1(h), r.position = f, i.clampToGround && (r.billboard.heightReference = HeightReference$1.CLAMP_TO_GROUND), r.availability = new TimeIntervalCollection(), r.availability.addInterval( + new TimeInterval({ + start: c[0], + stop: c[c.length - 1] + }) + ); + } + r.polyline = createDefaultPolyline(i.trackColor), r.polyline.positions = s, i.clampToGround && (r.polyline.clampToGround = !0); +} +function processTrkSeg(e) { + const t = { + positions: [], + times: [] + }, n = queryNodes$1(e, "trkpt", namespaces$1.gpx); + let i; + for (let r = 0; r < n.length; r++) { + const o = readCoordinateFromNode(n[r]); + t.positions.push(o), i = queryStringValue$1(n[r], "time", namespaces$1.gpx), defined(i) && t.times.push(JulianDate.fromIso8601(i)); + } + return t; +} +function processMetadata(e) { + const t = queryFirstNode$1(e, "metadata", namespaces$1.gpx); + if (defined(t)) { + const n = { + name: queryStringValue$1(t, "name", namespaces$1.gpx), + desc: queryStringValue$1(t, "desc", namespaces$1.gpx), + author: getPerson(t), + copyright: getCopyright(t), + link: getLink(t), + time: queryStringValue$1(t, "time", namespaces$1.gpx), + keywords: queryStringValue$1(t, "keywords", namespaces$1.gpx), + bounds: getBounds(t) + }; + if (defined(n.name) || defined(n.desc) || defined(n.author) || defined(n.copyright) || defined(n.link) || defined(n.time) || defined(n.keywords) || defined(n.bounds)) + return n; + } +} +function getPerson(e) { + const t = queryFirstNode$1(e, "author", namespaces$1.gpx); + if (defined(t)) { + const n = { + name: queryStringValue$1(t, "name", namespaces$1.gpx), + email: getEmail(t), + link: getLink(t) + }; + if (defined(n.name) || defined(n.email) || defined(n.link)) + return n; + } +} +function getEmail(e) { + const t = queryFirstNode$1(e, "email", namespaces$1.gpx); + if (defined(t)) { + const n = queryStringValue$1(t, "id", namespaces$1.gpx), i = queryStringValue$1(t, "domain", namespaces$1.gpx); + return `${n}@${i}`; + } +} +function getLink(e) { + const t = queryFirstNode$1(e, "link", namespaces$1.gpx); + if (defined(t)) { + const n = { + href: queryStringAttribute$1(t, "href"), + text: queryStringValue$1(t, "text", namespaces$1.gpx), + mimeType: queryStringValue$1(t, "type", namespaces$1.gpx) + }; + if (defined(n.href) || defined(n.text) || defined(n.mimeType)) + return n; + } +} +function getCopyright(e) { + const t = queryFirstNode$1(e, "copyright", namespaces$1.gpx); + if (defined(t)) { + const n = { + author: queryStringAttribute$1(t, "author"), + year: queryStringValue$1(t, "year", namespaces$1.gpx), + license: queryStringValue$1(t, "license", namespaces$1.gpx) + }; + if (defined(n.author) || defined(n.year) || defined(n.license)) + return n; + } +} +function getBounds(e) { + const t = queryFirstNode$1(e, "bounds", namespaces$1.gpx); + if (defined(t)) { + const n = { + minLat: queryNumericValue$1(t, "minlat", namespaces$1.gpx), + maxLat: queryNumericValue$1(t, "maxlat", namespaces$1.gpx), + minLon: queryNumericValue$1(t, "minlon", namespaces$1.gpx), + maxLon: queryNumericValue$1(t, "maxlon", namespaces$1.gpx) + }; + if (defined(n.minLat) || defined(n.maxLat) || defined(n.minLon) || defined(n.maxLon)) + return n; + } +} +const complexTypes = { + wpt: processWpt, + rte: processRte, + trk: processTrk +}; +function processGpx(e, t, n, i) { + const r = Object.keys(complexTypes), o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s], l = complexTypes[c], d = t.childNodes, f = d.length; + for (let h = 0; h < f; h++) { + const p = d[h]; + p.localName === c && namespaces$1.gpx.indexOf(p.namespaceURI) !== -1 && l(e, p, n, i); + } + } +} +function loadGpx(e, t, n) { + const i = e._entityCollection; + i.removeAll(); + const r = t.documentElement, o = queryStringAttribute$1(r, "version"), s = queryStringAttribute$1(r, "creator"); + let c; + const l = processMetadata(r); + defined(l) && (c = l.name), r.localName === "gpx" ? processGpx(e, r, i, n) : console.log(`GPX - Unsupported node: ${r.localName}`); + let d; + const f = i.computeAvailability(); + let h = f.start, p = f.stop; + const m = JulianDate.equals(h, Iso8601.MINIMUM_VALUE), _ = JulianDate.equals(p, Iso8601.MAXIMUM_VALUE); + if (!m || !_) { + let C; + m && (C = /* @__PURE__ */ new Date(), C.setHours(0, 0, 0, 0), h = JulianDate.fromDate(C)), _ && (C = /* @__PURE__ */ new Date(), C.setHours(24, 0, 0, 0), p = JulianDate.fromDate(C)), d = new DataSourceClock(), d.startTime = h, d.stopTime = p, d.currentTime = JulianDate.clone(h), d.clockRange = ClockRange$1.LOOP_STOP, d.clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER, d.multiplier = Math.round( + Math.min( + Math.max(JulianDate.secondsDifference(p, h) / 60, 1), + 31556900 + ) + ); + } + let y = !1; + return e._name !== c && (e._name = c, y = !0), e._creator !== s && (e._creator = s, y = !0), metadataChanged(e._metadata, l) && (e._metadata = l, y = !0), e._version !== o && (e._version = o, y = !0), d !== e._clock && (y = !0, e._clock = d), y && e._changed.raiseEvent(e), DataSource.setLoading(e, !1), e; +} +function metadataChanged(e, t) { + return !defined(e) && !defined(t) ? !1 : defined(e) && defined(t) ? e.name !== t.name || e.dec !== t.desc || e.src !== t.src || e.author !== t.author || e.copyright !== t.copyright || e.link !== t.link || e.time !== t.time || e.bounds !== t.bounds : !0; +} +function load$2(e, t, n, i) { + i = defaultValue(i, defaultValue.EMPTY_OBJECT); + let r = n; + if (typeof n == "string" || n instanceof Resource) { + n = Resource.createIfNeeded(n), r = n.fetchBlob(); + const o = e._resourceCredits, s = n.credits; + if (defined(s)) { + const c = s.length; + for (let l = 0; l < c; l++) + o.push(s[l]); + } + } + return Promise.resolve(r).then(function(o) { + return o instanceof Blob ? readBlobAsText$1(o).then(function(s) { + let c, l; + try { + c = parser$1.parseFromString(s, "application/xml"); + } catch (d) { + l = d.toString(); + } + if (defined(l) || c.body || c.documentElement.tagName === "parsererror") { + let d = defined(l) ? l : c.documentElement.firstChild.nodeValue; + throw d || (d = c.body.innerText), new RuntimeError(d); + } + return loadGpx(e, c, i); + }) : loadGpx(e, o, i); + }).catch(function(o) { + return e._error.raiseEvent(e, o), console.log(o), Promise.reject(o); + }); +} +function GpxDataSource() { + this._changed = new Event(), this._error = new Event(), this._loading = new Event(), this._clock = void 0, this._entityCollection = new EntityCollection(this), this._entityCluster = new EntityCluster(), this._name = void 0, this._version = void 0, this._creator = void 0, this._metadata = void 0, this._isLoading = !1, this._pinBuilder = new PinBuilder(); +} +GpxDataSource.load = function(e, t) { + return new GpxDataSource().load(e, t); +}; +Object.defineProperties(GpxDataSource.prototype, { + /** + * Gets a human-readable name for this instance. + * This will be automatically be set to the GPX document name on load. + * @memberof GpxDataSource.prototype + * @type {string} + */ + name: { + get: function() { + return this._name; + } + }, + /** + * Gets the version of the GPX Schema in use. + * @memberof GpxDataSource.prototype + * @type {string} + */ + version: { + get: function() { + return this._version; + } + }, + /** + * Gets the creator of the GPX document. + * @memberof GpxDataSource.prototype + * @type {string} + */ + creator: { + get: function() { + return this._creator; + } + }, + /** + * Gets an object containing metadata about the GPX file. + * @memberof GpxDataSource.prototype + * @type {object} + */ + metadata: { + get: function() { + return this._metadata; + } + }, + /** + * Gets the clock settings defined by the loaded GPX. This represents the total + * availability interval for all time-dynamic data. If the GPX does not contain + * time-dynamic data, this value is undefined. + * @memberof GpxDataSource.prototype + * @type {DataSourceClock} + */ + clock: { + get: function() { + return this._clock; + } + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof GpxDataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: function() { + return this._entityCollection; + } + }, + /** + * Gets a value indicating if the data source is currently loading data. + * @memberof GpxDataSource.prototype + * @type {boolean} + */ + isLoading: { + get: function() { + return this._isLoading; + } + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof GpxDataSource.prototype + * @type {Event} + */ + changedEvent: { + get: function() { + return this._changed; + } + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof GpxDataSource.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._error; + } + }, + /** + * Gets an event that will be raised when the data source either starts or stops loading. + * @memberof GpxDataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: function() { + return this._loading; + } + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof GpxDataSource.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._entityCollection.show; + }, + set: function(e) { + this._entityCollection.show = e; + } + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof GpxDataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: function() { + return this._entityCluster; + }, + set: function(e) { + this._entityCluster = e; + } + } +}); +GpxDataSource.prototype.update = function(e) { + return !0; +}; +GpxDataSource.prototype.load = function(e, t) { + if (!defined(e)) + throw new DeveloperError("data is required."); + t = defaultValue(t, defaultValue.EMPTY_OBJECT), DataSource.setLoading(this, !0); + const n = this._name, i = this; + return load$2(this, this._entityCollection, e, t).then(function() { + let r; + const o = i._entityCollection.computeAvailability(); + let s = o.start, c = o.stop; + const l = JulianDate.equals(s, Iso8601.MINIMUM_VALUE), d = JulianDate.equals(c, Iso8601.MAXIMUM_VALUE); + if (!l || !d) { + let h; + l && (h = /* @__PURE__ */ new Date(), h.setHours(0, 0, 0, 0), s = JulianDate.fromDate(h)), d && (h = /* @__PURE__ */ new Date(), h.setHours(24, 0, 0, 0), c = JulianDate.fromDate(h)), r = new DataSourceClock(), r.startTime = s, r.stopTime = c, r.currentTime = JulianDate.clone(s), r.clockRange = ClockRange$1.LOOP_STOP, r.clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER, r.multiplier = Math.round( + Math.min( + Math.max(JulianDate.secondsDifference(c, s) / 60, 1), + 31556900 + ) + ); + } + let f = !1; + return r !== i._clock && (i._clock = r, f = !0), n !== i._name && (f = !0), f && i._changed.raiseEvent(i), DataSource.setLoading(i, !1), i; + }).catch(function(r) { + return DataSource.setLoading(i, !1), i._error.raiseEvent(i, r), console.log(r), Promise.reject(r); + }); +}; +function KmlCamera(e, t) { + this.position = e, this.headingPitchRoll = t; +} +const MAX_BITS$1 = 15, D_CODES = 30, BL_CODES = 19, LENGTH_CODES = 29, LITERALS = 256, L_CODES = LITERALS + 1 + LENGTH_CODES, HEAP_SIZE = 2 * L_CODES + 1, END_BLOCK = 256, MAX_BL_BITS = 7, REP_3_6 = 16, REPZ_3_10 = 17, REPZ_11_138 = 18, Buf_size = 8 * 2, Z_DEFAULT_COMPRESSION = -1, Z_FILTERED = 1, Z_HUFFMAN_ONLY = 2, Z_DEFAULT_STRATEGY = 0, Z_NO_FLUSH$1 = 0, Z_PARTIAL_FLUSH = 1, Z_FULL_FLUSH = 3, Z_FINISH$1 = 4, Z_OK$1 = 0, Z_STREAM_END$1 = 1, Z_NEED_DICT$1 = 2, Z_STREAM_ERROR$1 = -2, Z_DATA_ERROR$1 = -3, Z_BUF_ERROR$1 = -5; +function extractArray(e) { + return flatArray(e.map(([t, n]) => new Array(t).fill(n, 0, t))); +} +function flatArray(e) { + return e.reduce((t, n) => t.concat(Array.isArray(n) ? flatArray(n) : n), []); +} +const _dist_code = [0, 1, 2, 3].concat(...extractArray([ + [2, 4], + [2, 5], + [4, 6], + [4, 7], + [8, 8], + [8, 9], + [16, 10], + [16, 11], + [32, 12], + [32, 13], + [64, 14], + [64, 15], + [2, 0], + [1, 16], + [1, 17], + [2, 18], + [2, 19], + [4, 20], + [4, 21], + [8, 22], + [8, 23], + [16, 24], + [16, 25], + [32, 26], + [32, 27], + [64, 28], + [64, 29] +])); +function Tree() { + const e = this; + function t(r) { + const o = e.dyn_tree, s = e.stat_desc.static_tree, c = e.stat_desc.extra_bits, l = e.stat_desc.extra_base, d = e.stat_desc.max_length; + let f, h, p, m, _, y, C = 0; + for (m = 0; m <= MAX_BITS$1; m++) + r.bl_count[m] = 0; + for (o[r.heap[r.heap_max] * 2 + 1] = 0, f = r.heap_max + 1; f < HEAP_SIZE; f++) + h = r.heap[f], m = o[o[h * 2 + 1] * 2 + 1] + 1, m > d && (m = d, C++), o[h * 2 + 1] = m, !(h > e.max_code) && (r.bl_count[m]++, _ = 0, h >= l && (_ = c[h - l]), y = o[h * 2], r.opt_len += y * (m + _), s && (r.static_len += y * (s[h * 2 + 1] + _))); + if (C !== 0) { + do { + for (m = d - 1; r.bl_count[m] === 0; ) + m--; + r.bl_count[m]--, r.bl_count[m + 1] += 2, r.bl_count[d]--, C -= 2; + } while (C > 0); + for (m = d; m !== 0; m--) + for (h = r.bl_count[m]; h !== 0; ) + p = r.heap[--f], !(p > e.max_code) && (o[p * 2 + 1] != m && (r.opt_len += (m - o[p * 2 + 1]) * o[p * 2], o[p * 2 + 1] = m), h--); + } + } + function n(r, o) { + let s = 0; + do + s |= r & 1, r >>>= 1, s <<= 1; + while (--o > 0); + return s >>> 1; + } + function i(r, o, s) { + const c = []; + let l = 0, d, f, h; + for (d = 1; d <= MAX_BITS$1; d++) + c[d] = l = l + s[d - 1] << 1; + for (f = 0; f <= o; f++) + h = r[f * 2 + 1], h !== 0 && (r[f * 2] = n(c[h]++, h)); + } + e.build_tree = function(r) { + const o = e.dyn_tree, s = e.stat_desc.static_tree, c = e.stat_desc.elems; + let l, d, f = -1, h; + for (r.heap_len = 0, r.heap_max = HEAP_SIZE, l = 0; l < c; l++) + o[l * 2] !== 0 ? (r.heap[++r.heap_len] = f = l, r.depth[l] = 0) : o[l * 2 + 1] = 0; + for (; r.heap_len < 2; ) + h = r.heap[++r.heap_len] = f < 2 ? ++f : 0, o[h * 2] = 1, r.depth[h] = 0, r.opt_len--, s && (r.static_len -= s[h * 2 + 1]); + for (e.max_code = f, l = Math.floor(r.heap_len / 2); l >= 1; l--) + r.pqdownheap(o, l); + h = c; + do + l = r.heap[1], r.heap[1] = r.heap[r.heap_len--], r.pqdownheap(o, 1), d = r.heap[1], r.heap[--r.heap_max] = l, r.heap[--r.heap_max] = d, o[h * 2] = o[l * 2] + o[d * 2], r.depth[h] = Math.max(r.depth[l], r.depth[d]) + 1, o[l * 2 + 1] = o[d * 2 + 1] = h, r.heap[1] = h++, r.pqdownheap(o, 1); + while (r.heap_len >= 2); + r.heap[--r.heap_max] = r.heap[1], t(r), i(o, e.max_code, r.bl_count); + }; +} +Tree._length_code = [0, 1, 2, 3, 4, 5, 6, 7].concat(...extractArray([ + [2, 8], + [2, 9], + [2, 10], + [2, 11], + [4, 12], + [4, 13], + [4, 14], + [4, 15], + [8, 16], + [8, 17], + [8, 18], + [8, 19], + [16, 20], + [16, 21], + [16, 22], + [16, 23], + [32, 24], + [32, 25], + [32, 26], + [31, 27], + [1, 28] +])); +Tree.base_length = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0]; +Tree.base_dist = [ + 0, + 1, + 2, + 3, + 4, + 6, + 8, + 12, + 16, + 24, + 32, + 48, + 64, + 96, + 128, + 192, + 256, + 384, + 512, + 768, + 1024, + 1536, + 2048, + 3072, + 4096, + 6144, + 8192, + 12288, + 16384, + 24576 +]; +Tree.d_code = function(e) { + return e < 256 ? _dist_code[e] : _dist_code[256 + (e >>> 7)]; +}; +Tree.extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; +Tree.extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; +Tree.extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; +Tree.bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; +function StaticTree(e, t, n, i, r) { + const o = this; + o.static_tree = e, o.extra_bits = t, o.extra_base = n, o.elems = i, o.max_length = r; +} +const static_ltree2_first_part = [ + 12, + 140, + 76, + 204, + 44, + 172, + 108, + 236, + 28, + 156, + 92, + 220, + 60, + 188, + 124, + 252, + 2, + 130, + 66, + 194, + 34, + 162, + 98, + 226, + 18, + 146, + 82, + 210, + 50, + 178, + 114, + 242, + 10, + 138, + 74, + 202, + 42, + 170, + 106, + 234, + 26, + 154, + 90, + 218, + 58, + 186, + 122, + 250, + 6, + 134, + 70, + 198, + 38, + 166, + 102, + 230, + 22, + 150, + 86, + 214, + 54, + 182, + 118, + 246, + 14, + 142, + 78, + 206, + 46, + 174, + 110, + 238, + 30, + 158, + 94, + 222, + 62, + 190, + 126, + 254, + 1, + 129, + 65, + 193, + 33, + 161, + 97, + 225, + 17, + 145, + 81, + 209, + 49, + 177, + 113, + 241, + 9, + 137, + 73, + 201, + 41, + 169, + 105, + 233, + 25, + 153, + 89, + 217, + 57, + 185, + 121, + 249, + 5, + 133, + 69, + 197, + 37, + 165, + 101, + 229, + 21, + 149, + 85, + 213, + 53, + 181, + 117, + 245, + 13, + 141, + 77, + 205, + 45, + 173, + 109, + 237, + 29, + 157, + 93, + 221, + 61, + 189, + 125, + 253, + 19, + 275, + 147, + 403, + 83, + 339, + 211, + 467, + 51, + 307, + 179, + 435, + 115, + 371, + 243, + 499, + 11, + 267, + 139, + 395, + 75, + 331, + 203, + 459, + 43, + 299, + 171, + 427, + 107, + 363, + 235, + 491, + 27, + 283, + 155, + 411, + 91, + 347, + 219, + 475, + 59, + 315, + 187, + 443, + 123, + 379, + 251, + 507, + 7, + 263, + 135, + 391, + 71, + 327, + 199, + 455, + 39, + 295, + 167, + 423, + 103, + 359, + 231, + 487, + 23, + 279, + 151, + 407, + 87, + 343, + 215, + 471, + 55, + 311, + 183, + 439, + 119, + 375, + 247, + 503, + 15, + 271, + 143, + 399, + 79, + 335, + 207, + 463, + 47, + 303, + 175, + 431, + 111, + 367, + 239, + 495, + 31, + 287, + 159, + 415, + 95, + 351, + 223, + 479, + 63, + 319, + 191, + 447, + 127, + 383, + 255, + 511, + 0, + 64, + 32, + 96, + 16, + 80, + 48, + 112, + 8, + 72, + 40, + 104, + 24, + 88, + 56, + 120, + 4, + 68, + 36, + 100, + 20, + 84, + 52, + 116, + 3, + 131, + 67, + 195, + 35, + 163, + 99, + 227 +], static_ltree2_second_part = extractArray([[144, 8], [112, 9], [24, 7], [8, 8]]); +StaticTree.static_ltree = flatArray(static_ltree2_first_part.map((e, t) => [e, static_ltree2_second_part[t]])); +const static_dtree_first_part = [0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23], static_dtree_second_part = extractArray([[30, 5]]); +StaticTree.static_dtree = flatArray(static_dtree_first_part.map((e, t) => [e, static_dtree_second_part[t]])); +StaticTree.static_l_desc = new StaticTree(StaticTree.static_ltree, Tree.extra_lbits, LITERALS + 1, L_CODES, MAX_BITS$1); +StaticTree.static_d_desc = new StaticTree(StaticTree.static_dtree, Tree.extra_dbits, 0, D_CODES, MAX_BITS$1); +StaticTree.static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, BL_CODES, MAX_BL_BITS); +const MAX_MEM_LEVEL = 9, DEF_MEM_LEVEL = 8; +function Config(e, t, n, i, r) { + const o = this; + o.good_length = e, o.max_lazy = t, o.nice_length = n, o.max_chain = i, o.func = r; +} +const STORED$1 = 0, FAST = 1, SLOW = 2, config_table = [ + new Config(0, 0, 0, 0, STORED$1), + new Config(4, 4, 8, 4, FAST), + new Config(4, 5, 16, 8, FAST), + new Config(4, 6, 32, 32, FAST), + new Config(4, 4, 16, 16, SLOW), + new Config(8, 16, 32, 32, SLOW), + new Config(8, 16, 128, 128, SLOW), + new Config(8, 32, 128, 256, SLOW), + new Config(32, 128, 258, 1024, SLOW), + new Config(32, 258, 258, 4096, SLOW) +], z_errmsg = [ + "need dictionary", + // Z_NEED_DICT + // 2 + "stream end", + // Z_STREAM_END 1 + "", + // Z_OK 0 + "", + // Z_ERRNO (-1) + "stream error", + // Z_STREAM_ERROR (-2) + "data error", + // Z_DATA_ERROR (-3) + "", + // Z_MEM_ERROR (-4) + "buffer error", + // Z_BUF_ERROR (-5) + "", + // Z_VERSION_ERROR (-6) + "" +], NeedMore = 0, BlockDone = 1, FinishStarted = 2, FinishDone = 3, PRESET_DICT$1 = 32, INIT_STATE = 42, BUSY_STATE = 113, FINISH_STATE = 666, Z_DEFLATED$1 = 8, STORED_BLOCK = 0, STATIC_TREES = 1, DYN_TREES = 2, MIN_MATCH = 3, MAX_MATCH = 258, MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; +function smaller(e, t, n, i) { + const r = e[t * 2], o = e[n * 2]; + return r < o || r == o && i[t] <= i[n]; +} +function Deflate() { + const e = this; + let t, n, i, r, o, s, c, l, d, f, h, p, m, _, y, C, T, x, b, S, E, A, D, P, I, M, R, L, g, w, O, N, F; + const B = new Tree(), V = new Tree(), U = new Tree(); + e.depth = []; + let k, $, G, q, z, H; + e.bl_count = [], e.heap = [], O = [], N = [], F = []; + function Q() { + d = 2 * o, h[m - 1] = 0; + for (let J = 0; J < m - 1; J++) + h[J] = 0; + M = config_table[R].max_lazy, g = config_table[R].good_length, w = config_table[R].nice_length, I = config_table[R].max_chain, E = 0, T = 0, D = 0, x = P = MIN_MATCH - 1, S = 0, p = 0; + } + function ne() { + let J; + for (J = 0; J < L_CODES; J++) + O[J * 2] = 0; + for (J = 0; J < D_CODES; J++) + N[J * 2] = 0; + for (J = 0; J < BL_CODES; J++) + F[J * 2] = 0; + O[END_BLOCK * 2] = 1, e.opt_len = e.static_len = 0, $ = G = 0; + } + function K() { + B.dyn_tree = O, B.stat_desc = StaticTree.static_l_desc, V.dyn_tree = N, V.stat_desc = StaticTree.static_d_desc, U.dyn_tree = F, U.stat_desc = StaticTree.static_bl_desc, z = 0, H = 0, q = 8, ne(); + } + e.pqdownheap = function(J, ae) { + const te = e.heap, ie = te[ae]; + let ue = ae << 1; + for (; ue <= e.heap_len && (ue < e.heap_len && smaller(J, te[ue + 1], te[ue], e.depth) && ue++, !smaller(J, ie, te[ue], e.depth)); ) + te[ae] = te[ue], ae = ue, ue <<= 1; + te[ae] = ie; + }; + function Z(J, ae) { + let te = -1, ie, ue = J[0 * 2 + 1], me = 0, Se = 7, we = 4; + ue === 0 && (Se = 138, we = 3), J[(ae + 1) * 2 + 1] = 65535; + for (let Ee = 0; Ee <= ae; Ee++) + ie = ue, ue = J[(Ee + 1) * 2 + 1], !(++me < Se && ie == ue) && (me < we ? F[ie * 2] += me : ie !== 0 ? (ie != te && F[ie * 2]++, F[REP_3_6 * 2]++) : me <= 10 ? F[REPZ_3_10 * 2]++ : F[REPZ_11_138 * 2]++, me = 0, te = ie, ue === 0 ? (Se = 138, we = 3) : ie == ue ? (Se = 6, we = 3) : (Se = 7, we = 4)); + } + function ee() { + let J; + for (Z(O, B.max_code), Z(N, V.max_code), U.build_tree(e), J = BL_CODES - 1; J >= 3 && F[Tree.bl_order[J] * 2 + 1] === 0; J--) + ; + return e.opt_len += 3 * (J + 1) + 5 + 5 + 4, J; + } + function oe(J) { + e.pending_buf[e.pending++] = J; + } + function X(J) { + oe(J & 255), oe(J >>> 8 & 255); + } + function fe(J) { + oe(J >> 8 & 255), oe(J & 255 & 255); + } + function de(J, ae) { + let te; + const ie = ae; + H > Buf_size - ie ? (te = J, z |= te << H & 65535, X(z), z = te >>> Buf_size - H, H += ie - Buf_size) : (z |= J << H & 65535, H += ie); + } + function ce(J, ae) { + const te = J * 2; + de(ae[te] & 65535, ae[te + 1] & 65535); + } + function ye(J, ae) { + let te, ie = -1, ue, me = J[0 * 2 + 1], Se = 0, we = 7, Ee = 4; + for (me === 0 && (we = 138, Ee = 3), te = 0; te <= ae; te++) + if (ue = me, me = J[(te + 1) * 2 + 1], !(++Se < we && ue == me)) { + if (Se < Ee) + do + ce(ue, F); + while (--Se !== 0); + else ue !== 0 ? (ue != ie && (ce(ue, F), Se--), ce(REP_3_6, F), de(Se - 3, 2)) : Se <= 10 ? (ce(REPZ_3_10, F), de(Se - 3, 3)) : (ce(REPZ_11_138, F), de(Se - 11, 7)); + Se = 0, ie = ue, me === 0 ? (we = 138, Ee = 3) : ue == me ? (we = 6, Ee = 3) : (we = 7, Ee = 4); + } + } + function ge(J, ae, te) { + let ie; + for (de(J - 257, 5), de(ae - 1, 5), de(te - 4, 4), ie = 0; ie < te; ie++) + de(F[Tree.bl_order[ie] * 2 + 1], 3); + ye(O, J - 1), ye(N, ae - 1); + } + function re() { + H == 16 ? (X(z), z = 0, H = 0) : H >= 8 && (oe(z & 255), z >>>= 8, H -= 8); + } + function be() { + de(STATIC_TREES << 1, 3), ce(END_BLOCK, StaticTree.static_ltree), re(), 1 + q + 10 - H < 9 && (de(STATIC_TREES << 1, 3), ce(END_BLOCK, StaticTree.static_ltree), re()), q = 7; + } + function pe(J, ae) { + let te, ie, ue; + if (e.dist_buf[$] = J, e.lc_buf[$] = ae & 255, $++, J === 0 ? O[ae * 2]++ : (G++, J--, O[(Tree._length_code[ae] + LITERALS + 1) * 2]++, N[Tree.d_code(J) * 2]++), !($ & 8191) && R > 2) { + for (te = $ * 8, ie = E - T, ue = 0; ue < D_CODES; ue++) + te += N[ue * 2] * (5 + Tree.extra_dbits[ue]); + if (te >>>= 3, G < Math.floor($ / 2) && te < Math.floor(ie / 2)) + return !0; + } + return $ == k - 1; + } + function Te(J, ae) { + let te, ie, ue = 0, me, Se; + if ($ !== 0) + do + te = e.dist_buf[ue], ie = e.lc_buf[ue], ue++, te === 0 ? ce(ie, J) : (me = Tree._length_code[ie], ce(me + LITERALS + 1, J), Se = Tree.extra_lbits[me], Se !== 0 && (ie -= Tree.base_length[me], de(ie, Se)), te--, me = Tree.d_code(te), ce(me, ae), Se = Tree.extra_dbits[me], Se !== 0 && (te -= Tree.base_dist[me], de(te, Se))); + while (ue < $); + ce(END_BLOCK, J), q = J[END_BLOCK * 2 + 1]; + } + function xe() { + H > 8 ? X(z) : H > 0 && oe(z & 255), z = 0, H = 0; + } + function W(J, ae, te) { + xe(), q = 8, X(ae), X(~ae), e.pending_buf.set(l.subarray(J, J + ae), e.pending), e.pending += ae; + } + function j(J, ae, te) { + de((STORED_BLOCK << 1) + (te ? 1 : 0), 3), W(J, ae); + } + function se(J, ae, te) { + let ie, ue, me = 0; + R > 0 ? (B.build_tree(e), V.build_tree(e), me = ee(), ie = e.opt_len + 3 + 7 >>> 3, ue = e.static_len + 3 + 7 >>> 3, ue <= ie && (ie = ue)) : ie = ue = ae + 5, ae + 4 <= ie && J != -1 ? j(J, ae, te) : ue == ie ? (de((STATIC_TREES << 1) + (te ? 1 : 0), 3), Te(StaticTree.static_ltree, StaticTree.static_dtree)) : (de((DYN_TREES << 1) + (te ? 1 : 0), 3), ge(B.max_code + 1, V.max_code + 1, me + 1), Te(O, N)), ne(), te && xe(); + } + function Pe(J) { + se(T >= 0 ? T : -1, E - T, J), T = E, t.flush_pending(); + } + function le() { + let J, ae, te, ie; + do { + if (ie = d - D - E, ie === 0 && E === 0 && D === 0) + ie = o; + else if (ie == -1) + ie--; + else if (E >= o + o - MIN_LOOKAHEAD) { + l.set(l.subarray(o, o + o), 0), A -= o, E -= o, T -= o, J = m, te = J; + do + ae = h[--te] & 65535, h[te] = ae >= o ? ae - o : 0; + while (--J !== 0); + J = o, te = J; + do + ae = f[--te] & 65535, f[te] = ae >= o ? ae - o : 0; + while (--J !== 0); + ie += o; + } + if (t.avail_in === 0) + return; + J = t.read_buf(l, E + D, ie), D += J, D >= MIN_MATCH && (p = l[E] & 255, p = (p << C ^ l[E + 1] & 255) & y); + } while (D < MIN_LOOKAHEAD && t.avail_in !== 0); + } + function De(J) { + let ae = 65535, te; + for (ae > i - 5 && (ae = i - 5); ; ) { + if (D <= 1) { + if (le(), D === 0 && J == Z_NO_FLUSH$1) + return NeedMore; + if (D === 0) + break; + } + if (E += D, D = 0, te = T + ae, (E === 0 || E >= te) && (D = E - te, E = te, Pe(!1), t.avail_out === 0) || E - T >= o - MIN_LOOKAHEAD && (Pe(!1), t.avail_out === 0)) + return NeedMore; + } + return Pe(J == Z_FINISH$1), t.avail_out === 0 ? J == Z_FINISH$1 ? FinishStarted : NeedMore : J == Z_FINISH$1 ? FinishDone : BlockDone; + } + function Me(J) { + let ae = I, te = E, ie, ue, me = P; + const Se = E > o - MIN_LOOKAHEAD ? E - (o - MIN_LOOKAHEAD) : 0; + let we = w; + const Ee = c, Ve = E + MAX_MATCH; + let We = l[te + me - 1], Ne = l[te + me]; + P >= g && (ae >>= 2), we > D && (we = D); + do + if (ie = J, !(l[ie + me] != Ne || l[ie + me - 1] != We || l[ie] != l[te] || l[++ie] != l[te + 1])) { + te += 2, ie++; + do + ; + while (l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && l[++te] == l[++ie] && te < Ve); + if (ue = MAX_MATCH - (Ve - te), te = Ve - MAX_MATCH, ue > me) { + if (A = J, me = ue, ue >= we) + break; + We = l[te + me - 1], Ne = l[te + me]; + } + } + while ((J = f[J & Ee] & 65535) > Se && --ae !== 0); + return me <= D ? me : D; + } + function He(J) { + let ae = 0, te; + for (; ; ) { + if (D < MIN_LOOKAHEAD) { + if (le(), D < MIN_LOOKAHEAD && J == Z_NO_FLUSH$1) + return NeedMore; + if (D === 0) + break; + } + if (D >= MIN_MATCH && (p = (p << C ^ l[E + (MIN_MATCH - 1)] & 255) & y, ae = h[p] & 65535, f[E & c] = h[p], h[p] = E), ae !== 0 && (E - ae & 65535) <= o - MIN_LOOKAHEAD && L != Z_HUFFMAN_ONLY && (x = Me(ae)), x >= MIN_MATCH) + if (te = pe(E - A, x - MIN_MATCH), D -= x, x <= M && D >= MIN_MATCH) { + x--; + do + E++, p = (p << C ^ l[E + (MIN_MATCH - 1)] & 255) & y, ae = h[p] & 65535, f[E & c] = h[p], h[p] = E; + while (--x !== 0); + E++; + } else + E += x, x = 0, p = l[E] & 255, p = (p << C ^ l[E + 1] & 255) & y; + else + te = pe(0, l[E] & 255), D--, E++; + if (te && (Pe(!1), t.avail_out === 0)) + return NeedMore; + } + return Pe(J == Z_FINISH$1), t.avail_out === 0 ? J == Z_FINISH$1 ? FinishStarted : NeedMore : J == Z_FINISH$1 ? FinishDone : BlockDone; + } + function Oe(J) { + let ae = 0, te, ie; + for (; ; ) { + if (D < MIN_LOOKAHEAD) { + if (le(), D < MIN_LOOKAHEAD && J == Z_NO_FLUSH$1) + return NeedMore; + if (D === 0) + break; + } + if (D >= MIN_MATCH && (p = (p << C ^ l[E + (MIN_MATCH - 1)] & 255) & y, ae = h[p] & 65535, f[E & c] = h[p], h[p] = E), P = x, b = A, x = MIN_MATCH - 1, ae !== 0 && P < M && (E - ae & 65535) <= o - MIN_LOOKAHEAD && (L != Z_HUFFMAN_ONLY && (x = Me(ae)), x <= 5 && (L == Z_FILTERED || x == MIN_MATCH && E - A > 4096) && (x = MIN_MATCH - 1)), P >= MIN_MATCH && x <= P) { + ie = E + D - MIN_MATCH, te = pe(E - 1 - b, P - MIN_MATCH), D -= P - 1, P -= 2; + do + ++E <= ie && (p = (p << C ^ l[E + (MIN_MATCH - 1)] & 255) & y, ae = h[p] & 65535, f[E & c] = h[p], h[p] = E); + while (--P !== 0); + if (S = 0, x = MIN_MATCH - 1, E++, te && (Pe(!1), t.avail_out === 0)) + return NeedMore; + } else if (S !== 0) { + if (te = pe(0, l[E - 1] & 255), te && Pe(!1), E++, D--, t.avail_out === 0) + return NeedMore; + } else + S = 1, E++, D--; + } + return S !== 0 && (te = pe(0, l[E - 1] & 255), S = 0), Pe(J == Z_FINISH$1), t.avail_out === 0 ? J == Z_FINISH$1 ? FinishStarted : NeedMore : J == Z_FINISH$1 ? FinishDone : BlockDone; + } + function $e(J) { + return J.total_in = J.total_out = 0, J.msg = null, e.pending = 0, e.pending_out = 0, n = BUSY_STATE, r = Z_NO_FLUSH$1, K(), Q(), Z_OK$1; + } + e.deflateInit = function(J, ae, te, ie, ue, me) { + return ie || (ie = Z_DEFLATED$1), ue || (ue = DEF_MEM_LEVEL), me || (me = Z_DEFAULT_STRATEGY), J.msg = null, ae == Z_DEFAULT_COMPRESSION && (ae = 6), ue < 1 || ue > MAX_MEM_LEVEL || ie != Z_DEFLATED$1 || te < 9 || te > 15 || ae < 0 || ae > 9 || me < 0 || me > Z_HUFFMAN_ONLY ? Z_STREAM_ERROR$1 : (J.dstate = e, s = te, o = 1 << s, c = o - 1, _ = ue + 7, m = 1 << _, y = m - 1, C = Math.floor((_ + MIN_MATCH - 1) / MIN_MATCH), l = new Uint8Array(o * 2), f = [], h = [], k = 1 << ue + 6, e.pending_buf = new Uint8Array(k * 4), i = k * 4, e.dist_buf = new Uint16Array(k), e.lc_buf = new Uint8Array(k), R = ae, L = me, $e(J)); + }, e.deflateEnd = function() { + return n != INIT_STATE && n != BUSY_STATE && n != FINISH_STATE ? Z_STREAM_ERROR$1 : (e.lc_buf = null, e.dist_buf = null, e.pending_buf = null, h = null, f = null, l = null, e.dstate = null, n == BUSY_STATE ? Z_DATA_ERROR$1 : Z_OK$1); + }, e.deflateParams = function(J, ae, te) { + let ie = Z_OK$1; + return ae == Z_DEFAULT_COMPRESSION && (ae = 6), ae < 0 || ae > 9 || te < 0 || te > Z_HUFFMAN_ONLY ? Z_STREAM_ERROR$1 : (config_table[R].func != config_table[ae].func && J.total_in !== 0 && (ie = J.deflate(Z_PARTIAL_FLUSH)), R != ae && (R = ae, M = config_table[R].max_lazy, g = config_table[R].good_length, w = config_table[R].nice_length, I = config_table[R].max_chain), L = te, ie); + }, e.deflateSetDictionary = function(J, ae, te) { + let ie = te, ue, me = 0; + if (!ae || n != INIT_STATE) + return Z_STREAM_ERROR$1; + if (ie < MIN_MATCH) + return Z_OK$1; + for (ie > o - MIN_LOOKAHEAD && (ie = o - MIN_LOOKAHEAD, me = te - ie), l.set(ae.subarray(me, me + ie), 0), E = ie, T = ie, p = l[0] & 255, p = (p << C ^ l[1] & 255) & y, ue = 0; ue <= ie - MIN_MATCH; ue++) + p = (p << C ^ l[ue + (MIN_MATCH - 1)] & 255) & y, f[ue & c] = h[p], h[p] = ue; + return Z_OK$1; + }, e.deflate = function(J, ae) { + let te, ie, ue, me, Se; + if (ae > Z_FINISH$1 || ae < 0) + return Z_STREAM_ERROR$1; + if (!J.next_out || !J.next_in && J.avail_in !== 0 || n == FINISH_STATE && ae != Z_FINISH$1) + return J.msg = z_errmsg[Z_NEED_DICT$1 - Z_STREAM_ERROR$1], Z_STREAM_ERROR$1; + if (J.avail_out === 0) + return J.msg = z_errmsg[Z_NEED_DICT$1 - Z_BUF_ERROR$1], Z_BUF_ERROR$1; + if (t = J, me = r, r = ae, n == INIT_STATE && (ie = Z_DEFLATED$1 + (s - 8 << 4) << 8, ue = (R - 1 & 255) >> 1, ue > 3 && (ue = 3), ie |= ue << 6, E !== 0 && (ie |= PRESET_DICT$1), ie += 31 - ie % 31, n = BUSY_STATE, fe(ie)), e.pending !== 0) { + if (t.flush_pending(), t.avail_out === 0) + return r = -1, Z_OK$1; + } else if (t.avail_in === 0 && ae <= me && ae != Z_FINISH$1) + return t.msg = z_errmsg[Z_NEED_DICT$1 - Z_BUF_ERROR$1], Z_BUF_ERROR$1; + if (n == FINISH_STATE && t.avail_in !== 0) + return J.msg = z_errmsg[Z_NEED_DICT$1 - Z_BUF_ERROR$1], Z_BUF_ERROR$1; + if (t.avail_in !== 0 || D !== 0 || ae != Z_NO_FLUSH$1 && n != FINISH_STATE) { + switch (Se = -1, config_table[R].func) { + case STORED$1: + Se = De(ae); + break; + case FAST: + Se = He(ae); + break; + case SLOW: + Se = Oe(ae); + break; + } + if ((Se == FinishStarted || Se == FinishDone) && (n = FINISH_STATE), Se == NeedMore || Se == FinishStarted) + return t.avail_out === 0 && (r = -1), Z_OK$1; + if (Se == BlockDone) { + if (ae == Z_PARTIAL_FLUSH) + be(); + else if (j(0, 0, !1), ae == Z_FULL_FLUSH) + for (te = 0; te < m; te++) + h[te] = 0; + if (t.flush_pending(), t.avail_out === 0) + return r = -1, Z_OK$1; + } + } + return ae != Z_FINISH$1 ? Z_OK$1 : Z_STREAM_END$1; + }; +} +function ZStream$1() { + const e = this; + e.next_in_index = 0, e.next_out_index = 0, e.avail_in = 0, e.total_in = 0, e.avail_out = 0, e.total_out = 0; +} +ZStream$1.prototype = { + deflateInit(e, t) { + const n = this; + return n.dstate = new Deflate(), t || (t = MAX_BITS$1), n.dstate.deflateInit(n, e, t); + }, + deflate(e) { + const t = this; + return t.dstate ? t.dstate.deflate(t, e) : Z_STREAM_ERROR$1; + }, + deflateEnd() { + const e = this; + if (!e.dstate) + return Z_STREAM_ERROR$1; + const t = e.dstate.deflateEnd(); + return e.dstate = null, t; + }, + deflateParams(e, t) { + const n = this; + return n.dstate ? n.dstate.deflateParams(n, e, t) : Z_STREAM_ERROR$1; + }, + deflateSetDictionary(e, t) { + const n = this; + return n.dstate ? n.dstate.deflateSetDictionary(n, e, t) : Z_STREAM_ERROR$1; + }, + // Read a new buffer from the current input stream, update the + // total number of bytes read. All deflate() input goes through + // this function so some applications may wish to modify it to avoid + // allocating a large strm->next_in buffer and copying from it. + // (See also flush_pending()). + read_buf(e, t, n) { + const i = this; + let r = i.avail_in; + return r > n && (r = n), r === 0 ? 0 : (i.avail_in -= r, e.set(i.next_in.subarray(i.next_in_index, i.next_in_index + r), t), i.next_in_index += r, i.total_in += r, r); + }, + // Flush as much pending output as possible. All deflate() output goes + // through this function so some applications may wish to modify it + // to avoid allocating a large strm->next_out buffer and copying into it. + // (See also read_buf()). + flush_pending() { + const e = this; + let t = e.dstate.pending; + t > e.avail_out && (t = e.avail_out), t !== 0 && (e.next_out.set(e.dstate.pending_buf.subarray(e.dstate.pending_out, e.dstate.pending_out + t), e.next_out_index), e.next_out_index += t, e.dstate.pending_out += t, e.total_out += t, e.avail_out -= t, e.dstate.pending -= t, e.dstate.pending === 0 && (e.dstate.pending_out = 0)); + } +}; +function ZipDeflate(e) { + const t = this, n = new ZStream$1(), i = getMaximumCompressedSize$1(e && e.chunkSize ? e.chunkSize : 64 * 1024), r = Z_NO_FLUSH$1, o = new Uint8Array(i); + let s = e ? e.level : Z_DEFAULT_COMPRESSION; + typeof s > "u" && (s = Z_DEFAULT_COMPRESSION), n.deflateInit(s), n.next_out = o, t.append = function(c, l) { + let d, f, h = 0, p = 0, m = 0; + const _ = []; + if (c.length) { + n.next_in_index = 0, n.next_in = c, n.avail_in = c.length; + do { + if (n.next_out_index = 0, n.avail_out = i, d = n.deflate(r), d != Z_OK$1) + throw new Error("deflating: " + n.msg); + n.next_out_index && (n.next_out_index == i ? _.push(new Uint8Array(o)) : _.push(o.subarray(0, n.next_out_index))), m += n.next_out_index, l && n.next_in_index > 0 && n.next_in_index != h && (l(n.next_in_index), h = n.next_in_index); + } while (n.avail_in > 0 || n.avail_out === 0); + return _.length > 1 ? (f = new Uint8Array(m), _.forEach(function(y) { + f.set(y, p), p += y.length; + })) : f = _[0] ? new Uint8Array(_[0]) : new Uint8Array(), f; + } + }, t.flush = function() { + let c, l, d = 0, f = 0; + const h = []; + do { + if (n.next_out_index = 0, n.avail_out = i, c = n.deflate(Z_FINISH$1), c != Z_STREAM_END$1 && c != Z_OK$1) + throw new Error("deflating: " + n.msg); + i - n.avail_out > 0 && h.push(o.slice(0, n.next_out_index)), f += n.next_out_index; + } while (n.avail_in > 0 || n.avail_out === 0); + return n.deflateEnd(), l = new Uint8Array(f), h.forEach(function(p) { + l.set(p, d), d += p.length; + }), l; + }; +} +function getMaximumCompressedSize$1(e) { + return e + 5 * (Math.floor(e / 16383) + 1); +} +const MAX_BITS = 15, Z_OK = 0, Z_STREAM_END = 1, Z_NEED_DICT = 2, Z_STREAM_ERROR = -2, Z_DATA_ERROR = -3, Z_MEM_ERROR = -4, Z_BUF_ERROR = -5, inflate_mask = [ + 0, + 1, + 3, + 7, + 15, + 31, + 63, + 127, + 255, + 511, + 1023, + 2047, + 4095, + 8191, + 16383, + 32767, + 65535 +], MANY = 1440, Z_NO_FLUSH = 0, Z_FINISH = 4, fixed_bl = 9, fixed_bd = 5, fixed_tl = [ + 96, + 7, + 256, + 0, + 8, + 80, + 0, + 8, + 16, + 84, + 8, + 115, + 82, + 7, + 31, + 0, + 8, + 112, + 0, + 8, + 48, + 0, + 9, + 192, + 80, + 7, + 10, + 0, + 8, + 96, + 0, + 8, + 32, + 0, + 9, + 160, + 0, + 8, + 0, + 0, + 8, + 128, + 0, + 8, + 64, + 0, + 9, + 224, + 80, + 7, + 6, + 0, + 8, + 88, + 0, + 8, + 24, + 0, + 9, + 144, + 83, + 7, + 59, + 0, + 8, + 120, + 0, + 8, + 56, + 0, + 9, + 208, + 81, + 7, + 17, + 0, + 8, + 104, + 0, + 8, + 40, + 0, + 9, + 176, + 0, + 8, + 8, + 0, + 8, + 136, + 0, + 8, + 72, + 0, + 9, + 240, + 80, + 7, + 4, + 0, + 8, + 84, + 0, + 8, + 20, + 85, + 8, + 227, + 83, + 7, + 43, + 0, + 8, + 116, + 0, + 8, + 52, + 0, + 9, + 200, + 81, + 7, + 13, + 0, + 8, + 100, + 0, + 8, + 36, + 0, + 9, + 168, + 0, + 8, + 4, + 0, + 8, + 132, + 0, + 8, + 68, + 0, + 9, + 232, + 80, + 7, + 8, + 0, + 8, + 92, + 0, + 8, + 28, + 0, + 9, + 152, + 84, + 7, + 83, + 0, + 8, + 124, + 0, + 8, + 60, + 0, + 9, + 216, + 82, + 7, + 23, + 0, + 8, + 108, + 0, + 8, + 44, + 0, + 9, + 184, + 0, + 8, + 12, + 0, + 8, + 140, + 0, + 8, + 76, + 0, + 9, + 248, + 80, + 7, + 3, + 0, + 8, + 82, + 0, + 8, + 18, + 85, + 8, + 163, + 83, + 7, + 35, + 0, + 8, + 114, + 0, + 8, + 50, + 0, + 9, + 196, + 81, + 7, + 11, + 0, + 8, + 98, + 0, + 8, + 34, + 0, + 9, + 164, + 0, + 8, + 2, + 0, + 8, + 130, + 0, + 8, + 66, + 0, + 9, + 228, + 80, + 7, + 7, + 0, + 8, + 90, + 0, + 8, + 26, + 0, + 9, + 148, + 84, + 7, + 67, + 0, + 8, + 122, + 0, + 8, + 58, + 0, + 9, + 212, + 82, + 7, + 19, + 0, + 8, + 106, + 0, + 8, + 42, + 0, + 9, + 180, + 0, + 8, + 10, + 0, + 8, + 138, + 0, + 8, + 74, + 0, + 9, + 244, + 80, + 7, + 5, + 0, + 8, + 86, + 0, + 8, + 22, + 192, + 8, + 0, + 83, + 7, + 51, + 0, + 8, + 118, + 0, + 8, + 54, + 0, + 9, + 204, + 81, + 7, + 15, + 0, + 8, + 102, + 0, + 8, + 38, + 0, + 9, + 172, + 0, + 8, + 6, + 0, + 8, + 134, + 0, + 8, + 70, + 0, + 9, + 236, + 80, + 7, + 9, + 0, + 8, + 94, + 0, + 8, + 30, + 0, + 9, + 156, + 84, + 7, + 99, + 0, + 8, + 126, + 0, + 8, + 62, + 0, + 9, + 220, + 82, + 7, + 27, + 0, + 8, + 110, + 0, + 8, + 46, + 0, + 9, + 188, + 0, + 8, + 14, + 0, + 8, + 142, + 0, + 8, + 78, + 0, + 9, + 252, + 96, + 7, + 256, + 0, + 8, + 81, + 0, + 8, + 17, + 85, + 8, + 131, + 82, + 7, + 31, + 0, + 8, + 113, + 0, + 8, + 49, + 0, + 9, + 194, + 80, + 7, + 10, + 0, + 8, + 97, + 0, + 8, + 33, + 0, + 9, + 162, + 0, + 8, + 1, + 0, + 8, + 129, + 0, + 8, + 65, + 0, + 9, + 226, + 80, + 7, + 6, + 0, + 8, + 89, + 0, + 8, + 25, + 0, + 9, + 146, + 83, + 7, + 59, + 0, + 8, + 121, + 0, + 8, + 57, + 0, + 9, + 210, + 81, + 7, + 17, + 0, + 8, + 105, + 0, + 8, + 41, + 0, + 9, + 178, + 0, + 8, + 9, + 0, + 8, + 137, + 0, + 8, + 73, + 0, + 9, + 242, + 80, + 7, + 4, + 0, + 8, + 85, + 0, + 8, + 21, + 80, + 8, + 258, + 83, + 7, + 43, + 0, + 8, + 117, + 0, + 8, + 53, + 0, + 9, + 202, + 81, + 7, + 13, + 0, + 8, + 101, + 0, + 8, + 37, + 0, + 9, + 170, + 0, + 8, + 5, + 0, + 8, + 133, + 0, + 8, + 69, + 0, + 9, + 234, + 80, + 7, + 8, + 0, + 8, + 93, + 0, + 8, + 29, + 0, + 9, + 154, + 84, + 7, + 83, + 0, + 8, + 125, + 0, + 8, + 61, + 0, + 9, + 218, + 82, + 7, + 23, + 0, + 8, + 109, + 0, + 8, + 45, + 0, + 9, + 186, + 0, + 8, + 13, + 0, + 8, + 141, + 0, + 8, + 77, + 0, + 9, + 250, + 80, + 7, + 3, + 0, + 8, + 83, + 0, + 8, + 19, + 85, + 8, + 195, + 83, + 7, + 35, + 0, + 8, + 115, + 0, + 8, + 51, + 0, + 9, + 198, + 81, + 7, + 11, + 0, + 8, + 99, + 0, + 8, + 35, + 0, + 9, + 166, + 0, + 8, + 3, + 0, + 8, + 131, + 0, + 8, + 67, + 0, + 9, + 230, + 80, + 7, + 7, + 0, + 8, + 91, + 0, + 8, + 27, + 0, + 9, + 150, + 84, + 7, + 67, + 0, + 8, + 123, + 0, + 8, + 59, + 0, + 9, + 214, + 82, + 7, + 19, + 0, + 8, + 107, + 0, + 8, + 43, + 0, + 9, + 182, + 0, + 8, + 11, + 0, + 8, + 139, + 0, + 8, + 75, + 0, + 9, + 246, + 80, + 7, + 5, + 0, + 8, + 87, + 0, + 8, + 23, + 192, + 8, + 0, + 83, + 7, + 51, + 0, + 8, + 119, + 0, + 8, + 55, + 0, + 9, + 206, + 81, + 7, + 15, + 0, + 8, + 103, + 0, + 8, + 39, + 0, + 9, + 174, + 0, + 8, + 7, + 0, + 8, + 135, + 0, + 8, + 71, + 0, + 9, + 238, + 80, + 7, + 9, + 0, + 8, + 95, + 0, + 8, + 31, + 0, + 9, + 158, + 84, + 7, + 99, + 0, + 8, + 127, + 0, + 8, + 63, + 0, + 9, + 222, + 82, + 7, + 27, + 0, + 8, + 111, + 0, + 8, + 47, + 0, + 9, + 190, + 0, + 8, + 15, + 0, + 8, + 143, + 0, + 8, + 79, + 0, + 9, + 254, + 96, + 7, + 256, + 0, + 8, + 80, + 0, + 8, + 16, + 84, + 8, + 115, + 82, + 7, + 31, + 0, + 8, + 112, + 0, + 8, + 48, + 0, + 9, + 193, + 80, + 7, + 10, + 0, + 8, + 96, + 0, + 8, + 32, + 0, + 9, + 161, + 0, + 8, + 0, + 0, + 8, + 128, + 0, + 8, + 64, + 0, + 9, + 225, + 80, + 7, + 6, + 0, + 8, + 88, + 0, + 8, + 24, + 0, + 9, + 145, + 83, + 7, + 59, + 0, + 8, + 120, + 0, + 8, + 56, + 0, + 9, + 209, + 81, + 7, + 17, + 0, + 8, + 104, + 0, + 8, + 40, + 0, + 9, + 177, + 0, + 8, + 8, + 0, + 8, + 136, + 0, + 8, + 72, + 0, + 9, + 241, + 80, + 7, + 4, + 0, + 8, + 84, + 0, + 8, + 20, + 85, + 8, + 227, + 83, + 7, + 43, + 0, + 8, + 116, + 0, + 8, + 52, + 0, + 9, + 201, + 81, + 7, + 13, + 0, + 8, + 100, + 0, + 8, + 36, + 0, + 9, + 169, + 0, + 8, + 4, + 0, + 8, + 132, + 0, + 8, + 68, + 0, + 9, + 233, + 80, + 7, + 8, + 0, + 8, + 92, + 0, + 8, + 28, + 0, + 9, + 153, + 84, + 7, + 83, + 0, + 8, + 124, + 0, + 8, + 60, + 0, + 9, + 217, + 82, + 7, + 23, + 0, + 8, + 108, + 0, + 8, + 44, + 0, + 9, + 185, + 0, + 8, + 12, + 0, + 8, + 140, + 0, + 8, + 76, + 0, + 9, + 249, + 80, + 7, + 3, + 0, + 8, + 82, + 0, + 8, + 18, + 85, + 8, + 163, + 83, + 7, + 35, + 0, + 8, + 114, + 0, + 8, + 50, + 0, + 9, + 197, + 81, + 7, + 11, + 0, + 8, + 98, + 0, + 8, + 34, + 0, + 9, + 165, + 0, + 8, + 2, + 0, + 8, + 130, + 0, + 8, + 66, + 0, + 9, + 229, + 80, + 7, + 7, + 0, + 8, + 90, + 0, + 8, + 26, + 0, + 9, + 149, + 84, + 7, + 67, + 0, + 8, + 122, + 0, + 8, + 58, + 0, + 9, + 213, + 82, + 7, + 19, + 0, + 8, + 106, + 0, + 8, + 42, + 0, + 9, + 181, + 0, + 8, + 10, + 0, + 8, + 138, + 0, + 8, + 74, + 0, + 9, + 245, + 80, + 7, + 5, + 0, + 8, + 86, + 0, + 8, + 22, + 192, + 8, + 0, + 83, + 7, + 51, + 0, + 8, + 118, + 0, + 8, + 54, + 0, + 9, + 205, + 81, + 7, + 15, + 0, + 8, + 102, + 0, + 8, + 38, + 0, + 9, + 173, + 0, + 8, + 6, + 0, + 8, + 134, + 0, + 8, + 70, + 0, + 9, + 237, + 80, + 7, + 9, + 0, + 8, + 94, + 0, + 8, + 30, + 0, + 9, + 157, + 84, + 7, + 99, + 0, + 8, + 126, + 0, + 8, + 62, + 0, + 9, + 221, + 82, + 7, + 27, + 0, + 8, + 110, + 0, + 8, + 46, + 0, + 9, + 189, + 0, + 8, + 14, + 0, + 8, + 142, + 0, + 8, + 78, + 0, + 9, + 253, + 96, + 7, + 256, + 0, + 8, + 81, + 0, + 8, + 17, + 85, + 8, + 131, + 82, + 7, + 31, + 0, + 8, + 113, + 0, + 8, + 49, + 0, + 9, + 195, + 80, + 7, + 10, + 0, + 8, + 97, + 0, + 8, + 33, + 0, + 9, + 163, + 0, + 8, + 1, + 0, + 8, + 129, + 0, + 8, + 65, + 0, + 9, + 227, + 80, + 7, + 6, + 0, + 8, + 89, + 0, + 8, + 25, + 0, + 9, + 147, + 83, + 7, + 59, + 0, + 8, + 121, + 0, + 8, + 57, + 0, + 9, + 211, + 81, + 7, + 17, + 0, + 8, + 105, + 0, + 8, + 41, + 0, + 9, + 179, + 0, + 8, + 9, + 0, + 8, + 137, + 0, + 8, + 73, + 0, + 9, + 243, + 80, + 7, + 4, + 0, + 8, + 85, + 0, + 8, + 21, + 80, + 8, + 258, + 83, + 7, + 43, + 0, + 8, + 117, + 0, + 8, + 53, + 0, + 9, + 203, + 81, + 7, + 13, + 0, + 8, + 101, + 0, + 8, + 37, + 0, + 9, + 171, + 0, + 8, + 5, + 0, + 8, + 133, + 0, + 8, + 69, + 0, + 9, + 235, + 80, + 7, + 8, + 0, + 8, + 93, + 0, + 8, + 29, + 0, + 9, + 155, + 84, + 7, + 83, + 0, + 8, + 125, + 0, + 8, + 61, + 0, + 9, + 219, + 82, + 7, + 23, + 0, + 8, + 109, + 0, + 8, + 45, + 0, + 9, + 187, + 0, + 8, + 13, + 0, + 8, + 141, + 0, + 8, + 77, + 0, + 9, + 251, + 80, + 7, + 3, + 0, + 8, + 83, + 0, + 8, + 19, + 85, + 8, + 195, + 83, + 7, + 35, + 0, + 8, + 115, + 0, + 8, + 51, + 0, + 9, + 199, + 81, + 7, + 11, + 0, + 8, + 99, + 0, + 8, + 35, + 0, + 9, + 167, + 0, + 8, + 3, + 0, + 8, + 131, + 0, + 8, + 67, + 0, + 9, + 231, + 80, + 7, + 7, + 0, + 8, + 91, + 0, + 8, + 27, + 0, + 9, + 151, + 84, + 7, + 67, + 0, + 8, + 123, + 0, + 8, + 59, + 0, + 9, + 215, + 82, + 7, + 19, + 0, + 8, + 107, + 0, + 8, + 43, + 0, + 9, + 183, + 0, + 8, + 11, + 0, + 8, + 139, + 0, + 8, + 75, + 0, + 9, + 247, + 80, + 7, + 5, + 0, + 8, + 87, + 0, + 8, + 23, + 192, + 8, + 0, + 83, + 7, + 51, + 0, + 8, + 119, + 0, + 8, + 55, + 0, + 9, + 207, + 81, + 7, + 15, + 0, + 8, + 103, + 0, + 8, + 39, + 0, + 9, + 175, + 0, + 8, + 7, + 0, + 8, + 135, + 0, + 8, + 71, + 0, + 9, + 239, + 80, + 7, + 9, + 0, + 8, + 95, + 0, + 8, + 31, + 0, + 9, + 159, + 84, + 7, + 99, + 0, + 8, + 127, + 0, + 8, + 63, + 0, + 9, + 223, + 82, + 7, + 27, + 0, + 8, + 111, + 0, + 8, + 47, + 0, + 9, + 191, + 0, + 8, + 15, + 0, + 8, + 143, + 0, + 8, + 79, + 0, + 9, + 255 +], fixed_td = [ + 80, + 5, + 1, + 87, + 5, + 257, + 83, + 5, + 17, + 91, + 5, + 4097, + 81, + 5, + 5, + 89, + 5, + 1025, + 85, + 5, + 65, + 93, + 5, + 16385, + 80, + 5, + 3, + 88, + 5, + 513, + 84, + 5, + 33, + 92, + 5, + 8193, + 82, + 5, + 9, + 90, + 5, + 2049, + 86, + 5, + 129, + 192, + 5, + 24577, + 80, + 5, + 2, + 87, + 5, + 385, + 83, + 5, + 25, + 91, + 5, + 6145, + 81, + 5, + 7, + 89, + 5, + 1537, + 85, + 5, + 97, + 93, + 5, + 24577, + 80, + 5, + 4, + 88, + 5, + 769, + 84, + 5, + 49, + 92, + 5, + 12289, + 82, + 5, + 13, + 90, + 5, + 3073, + 86, + 5, + 193, + 192, + 5, + 24577 +], cplens = [ + // Copy lengths for literal codes 257..285 + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258, + 0, + 0 +], cplext = [ + // Extra bits for literal codes 257..285 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 5, + 5, + 5, + 5, + 0, + 112, + 112 + // 112==invalid +], cpdist = [ + // Copy offsets for distance codes 0..29 + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577 +], cpdext = [ + // Extra bits for distance codes + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 5, + 6, + 6, + 7, + 7, + 8, + 8, + 9, + 9, + 10, + 10, + 11, + 11, + 12, + 12, + 13, + 13 +], BMAX = 15; +function InfTree() { + const e = this; + let t, n, i, r, o, s; + function c(d, f, h, p, m, _, y, C, T, x, b) { + let S, E, A, D, P, I, M, R, L, g, w, O, N, F, B; + g = 0, P = h; + do + i[d[f + g]]++, g++, P--; + while (P !== 0); + if (i[0] == h) + return y[0] = -1, C[0] = 0, Z_OK; + for (R = C[0], I = 1; I <= BMAX && i[I] === 0; I++) + ; + for (M = I, R < I && (R = I), P = BMAX; P !== 0 && i[P] === 0; P--) + ; + for (A = P, R > P && (R = P), C[0] = R, F = 1 << I; I < P; I++, F <<= 1) + if ((F -= i[I]) < 0) + return Z_DATA_ERROR; + if ((F -= i[P]) < 0) + return Z_DATA_ERROR; + for (i[P] += F, s[1] = I = 0, g = 1, N = 2; --P !== 0; ) + s[N] = I += i[g], N++, g++; + P = 0, g = 0; + do + (I = d[f + g]) !== 0 && (b[s[I]++] = P), g++; + while (++P < h); + for (h = s[A], s[0] = P = 0, g = 0, D = -1, O = -R, o[0] = 0, w = 0, B = 0; M <= A; M++) + for (S = i[M]; S-- !== 0; ) { + for (; M > O + R; ) { + if (D++, O += R, B = A - O, B = B > R ? R : B, (E = 1 << (I = M - O)) > S + 1 && (E -= S + 1, N = M, I < B)) + for (; ++I < B && !((E <<= 1) <= i[++N]); ) + E -= i[N]; + if (B = 1 << I, x[0] + B > MANY) + return Z_DATA_ERROR; + o[D] = w = /* hp+ */ + x[0], x[0] += B, D !== 0 ? (s[D] = P, r[0] = /* (byte) */ + I, r[1] = /* (byte) */ + R, I = P >>> O - R, r[2] = /* (int) */ + w - o[D - 1] - I, T.set(r, (o[D - 1] + I) * 3)) : y[0] = w; + } + for (r[1] = /* (byte) */ + M - O, g >= h ? r[0] = 192 : b[g] < p ? (r[0] = /* (byte) */ + b[g] < 256 ? 0 : 96, r[2] = b[g++]) : (r[0] = /* (byte) */ + _[b[g] - p] + 16 + 64, r[2] = m[b[g++] - p]), E = 1 << M - O, I = P >>> O; I < B; I += E) + T.set(r, (w + I) * 3); + for (I = 1 << M - 1; P & I; I >>>= 1) + P ^= I; + for (P ^= I, L = (1 << O) - 1; (P & L) != s[D]; ) + D--, O -= R, L = (1 << O) - 1; + } + return F !== 0 && A != 1 ? Z_BUF_ERROR : Z_OK; + } + function l(d) { + let f; + for (t || (t = [], n = [], i = new Int32Array(BMAX + 1), r = [], o = new Int32Array(BMAX), s = new Int32Array(BMAX + 1)), n.length < d && (n = []), f = 0; f < d; f++) + n[f] = 0; + for (f = 0; f < BMAX + 1; f++) + i[f] = 0; + for (f = 0; f < 3; f++) + r[f] = 0; + o.set(i.subarray(0, BMAX), 0), s.set(i.subarray(0, BMAX + 1), 0); + } + e.inflate_trees_bits = function(d, f, h, p, m) { + let _; + return l(19), t[0] = 0, _ = c(d, 0, 19, 19, null, null, h, f, p, t, n), _ == Z_DATA_ERROR ? m.msg = "oversubscribed dynamic bit lengths tree" : (_ == Z_BUF_ERROR || f[0] === 0) && (m.msg = "incomplete dynamic bit lengths tree", _ = Z_DATA_ERROR), _; + }, e.inflate_trees_dynamic = function(d, f, h, p, m, _, y, C, T) { + let x; + return l(288), t[0] = 0, x = c(h, 0, d, 257, cplens, cplext, _, p, C, t, n), x != Z_OK || p[0] === 0 ? (x == Z_DATA_ERROR ? T.msg = "oversubscribed literal/length tree" : x != Z_MEM_ERROR && (T.msg = "incomplete literal/length tree", x = Z_DATA_ERROR), x) : (l(288), x = c(h, d, f, 0, cpdist, cpdext, y, m, C, t, n), x != Z_OK || m[0] === 0 && d > 257 ? (x == Z_DATA_ERROR ? T.msg = "oversubscribed distance tree" : x == Z_BUF_ERROR ? (T.msg = "incomplete distance tree", x = Z_DATA_ERROR) : x != Z_MEM_ERROR && (T.msg = "empty distance tree with lengths", x = Z_DATA_ERROR), x) : Z_OK); + }; +} +InfTree.inflate_trees_fixed = function(e, t, n, i) { + return e[0] = fixed_bl, t[0] = fixed_bd, n[0] = fixed_tl, i[0] = fixed_td, Z_OK; +}; +const START = 0, LEN = 1, LENEXT = 2, DIST = 3, DISTEXT = 4, COPY = 5, LIT = 6, WASH = 7, END = 8, BADCODE = 9; +function InfCodes() { + const e = this; + let t, n = 0, i, r = 0, o = 0, s = 0, c = 0, l = 0, d = 0, f = 0, h, p = 0, m, _ = 0; + function y(C, T, x, b, S, E, A, D) { + let P, I, M, R, L, g, w, O, N, F, B, V, U, k, $, G; + w = D.next_in_index, O = D.avail_in, L = A.bitb, g = A.bitk, N = A.write, F = N < A.read ? A.read - N - 1 : A.end - N, B = inflate_mask[C], V = inflate_mask[T]; + do { + for (; g < 20; ) + O--, L |= (D.read_byte(w++) & 255) << g, g += 8; + if (P = L & B, I = x, M = b, G = (M + P) * 3, (R = I[G]) === 0) { + L >>= I[G + 1], g -= I[G + 1], A.win[N++] = /* (byte) */ + I[G + 2], F--; + continue; + } + do { + if (L >>= I[G + 1], g -= I[G + 1], R & 16) { + for (R &= 15, U = I[G + 2] + /* (int) */ + (L & inflate_mask[R]), L >>= R, g -= R; g < 15; ) + O--, L |= (D.read_byte(w++) & 255) << g, g += 8; + P = L & V, I = S, M = E, G = (M + P) * 3, R = I[G]; + do + if (L >>= I[G + 1], g -= I[G + 1], R & 16) { + for (R &= 15; g < R; ) + O--, L |= (D.read_byte(w++) & 255) << g, g += 8; + if (k = I[G + 2] + (L & inflate_mask[R]), L >>= R, g -= R, F -= U, N >= k) + $ = N - k, N - $ > 0 && 2 > N - $ ? (A.win[N++] = A.win[$++], A.win[N++] = A.win[$++], U -= 2) : (A.win.set(A.win.subarray($, $ + 2), N), N += 2, $ += 2, U -= 2); + else { + $ = N - k; + do + $ += A.end; + while ($ < 0); + if (R = A.end - $, U > R) { + if (U -= R, N - $ > 0 && R > N - $) + do + A.win[N++] = A.win[$++]; + while (--R !== 0); + else + A.win.set(A.win.subarray($, $ + R), N), N += R, $ += R, R = 0; + $ = 0; + } + } + if (N - $ > 0 && U > N - $) + do + A.win[N++] = A.win[$++]; + while (--U !== 0); + else + A.win.set(A.win.subarray($, $ + U), N), N += U, $ += U, U = 0; + break; + } else if (!(R & 64)) + P += I[G + 2], P += L & inflate_mask[R], G = (M + P) * 3, R = I[G]; + else + return D.msg = "invalid distance code", U = D.avail_in - O, U = g >> 3 < U ? g >> 3 : U, O += U, w -= U, g -= U << 3, A.bitb = L, A.bitk = g, D.avail_in = O, D.total_in += w - D.next_in_index, D.next_in_index = w, A.write = N, Z_DATA_ERROR; + while (!0); + break; + } + if (R & 64) + return R & 32 ? (U = D.avail_in - O, U = g >> 3 < U ? g >> 3 : U, O += U, w -= U, g -= U << 3, A.bitb = L, A.bitk = g, D.avail_in = O, D.total_in += w - D.next_in_index, D.next_in_index = w, A.write = N, Z_STREAM_END) : (D.msg = "invalid literal/length code", U = D.avail_in - O, U = g >> 3 < U ? g >> 3 : U, O += U, w -= U, g -= U << 3, A.bitb = L, A.bitk = g, D.avail_in = O, D.total_in += w - D.next_in_index, D.next_in_index = w, A.write = N, Z_DATA_ERROR); + if (P += I[G + 2], P += L & inflate_mask[R], G = (M + P) * 3, (R = I[G]) === 0) { + L >>= I[G + 1], g -= I[G + 1], A.win[N++] = /* (byte) */ + I[G + 2], F--; + break; + } + } while (!0); + } while (F >= 258 && O >= 10); + return U = D.avail_in - O, U = g >> 3 < U ? g >> 3 : U, O += U, w -= U, g -= U << 3, A.bitb = L, A.bitk = g, D.avail_in = O, D.total_in += w - D.next_in_index, D.next_in_index = w, A.write = N, Z_OK; + } + e.init = function(C, T, x, b, S, E) { + t = START, d = /* (byte) */ + C, f = /* (byte) */ + T, h = x, p = b, m = S, _ = E, i = null; + }, e.proc = function(C, T, x) { + let b, S, E, A = 0, D = 0, P = 0, I, M, R, L; + for (P = T.next_in_index, I = T.avail_in, A = C.bitb, D = C.bitk, M = C.write, R = M < C.read ? C.read - M - 1 : C.end - M; ; ) + switch (t) { + case START: + if (R >= 258 && I >= 10 && (C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, x = y(d, f, h, p, m, _, C, T), P = T.next_in_index, I = T.avail_in, A = C.bitb, D = C.bitk, M = C.write, R = M < C.read ? C.read - M - 1 : C.end - M, x != Z_OK)) { + t = x == Z_STREAM_END ? WASH : BADCODE; + break; + } + o = d, i = h, r = p, t = LEN; + case LEN: + for (b = o; D < b; ) { + if (I !== 0) + x = Z_OK; + else + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + I--, A |= (T.read_byte(P++) & 255) << D, D += 8; + } + if (S = (r + (A & inflate_mask[b])) * 3, A >>>= i[S + 1], D -= i[S + 1], E = i[S], E === 0) { + s = i[S + 2], t = LIT; + break; + } + if (E & 16) { + c = E & 15, n = i[S + 2], t = LENEXT; + break; + } + if (!(E & 64)) { + o = E, r = S / 3 + i[S + 2]; + break; + } + if (E & 32) { + t = WASH; + break; + } + return t = BADCODE, T.msg = "invalid literal/length code", x = Z_DATA_ERROR, C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + case LENEXT: + for (b = c; D < b; ) { + if (I !== 0) + x = Z_OK; + else + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + I--, A |= (T.read_byte(P++) & 255) << D, D += 8; + } + n += A & inflate_mask[b], A >>= b, D -= b, o = f, i = m, r = _, t = DIST; + case DIST: + for (b = o; D < b; ) { + if (I !== 0) + x = Z_OK; + else + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + I--, A |= (T.read_byte(P++) & 255) << D, D += 8; + } + if (S = (r + (A & inflate_mask[b])) * 3, A >>= i[S + 1], D -= i[S + 1], E = i[S], E & 16) { + c = E & 15, l = i[S + 2], t = DISTEXT; + break; + } + if (!(E & 64)) { + o = E, r = S / 3 + i[S + 2]; + break; + } + return t = BADCODE, T.msg = "invalid distance code", x = Z_DATA_ERROR, C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + case DISTEXT: + for (b = c; D < b; ) { + if (I !== 0) + x = Z_OK; + else + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + I--, A |= (T.read_byte(P++) & 255) << D, D += 8; + } + l += A & inflate_mask[b], A >>= b, D -= b, t = COPY; + case COPY: + for (L = M - l; L < 0; ) + L += C.end; + for (; n !== 0; ) { + if (R === 0 && (M == C.end && C.read !== 0 && (M = 0, R = M < C.read ? C.read - M - 1 : C.end - M), R === 0 && (C.write = M, x = C.inflate_flush(T, x), M = C.write, R = M < C.read ? C.read - M - 1 : C.end - M, M == C.end && C.read !== 0 && (M = 0, R = M < C.read ? C.read - M - 1 : C.end - M), R === 0))) + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + C.win[M++] = C.win[L++], R--, L == C.end && (L = 0), n--; + } + t = START; + break; + case LIT: + if (R === 0 && (M == C.end && C.read !== 0 && (M = 0, R = M < C.read ? C.read - M - 1 : C.end - M), R === 0 && (C.write = M, x = C.inflate_flush(T, x), M = C.write, R = M < C.read ? C.read - M - 1 : C.end - M, M == C.end && C.read !== 0 && (M = 0, R = M < C.read ? C.read - M - 1 : C.end - M), R === 0))) + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + x = Z_OK, C.win[M++] = /* (byte) */ + s, R--, t = START; + break; + case WASH: + if (D > 7 && (D -= 8, I++, P--), C.write = M, x = C.inflate_flush(T, x), M = C.write, R = M < C.read ? C.read - M - 1 : C.end - M, C.read != C.write) + return C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + t = END; + case END: + return x = Z_STREAM_END, C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + case BADCODE: + return x = Z_DATA_ERROR, C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + default: + return x = Z_STREAM_ERROR, C.bitb = A, C.bitk = D, T.avail_in = I, T.total_in += P - T.next_in_index, T.next_in_index = P, C.write = M, C.inflate_flush(T, x); + } + }, e.free = function() { + }; +} +const border = [ + // Order of the bit length code lengths + 16, + 17, + 18, + 0, + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15 +], TYPE = 0, LENS = 1, STORED = 2, TABLE = 3, BTREE = 4, DTREE = 5, CODES = 6, DRY = 7, DONELOCKS = 8, BADBLOCKS = 9; +function InfBlocks(e, t) { + const n = this; + let i = TYPE, r = 0, o = 0, s = 0, c; + const l = [0], d = [0], f = new InfCodes(); + let h = 0, p = new Int32Array(MANY * 3); + const m = 0, _ = new InfTree(); + n.bitk = 0, n.bitb = 0, n.win = new Uint8Array(t), n.end = t, n.read = 0, n.write = 0, n.reset = function(y, C) { + C && (C[0] = m), i == CODES && f.free(y), i = TYPE, n.bitk = 0, n.bitb = 0, n.read = n.write = 0; + }, n.reset(e, null), n.inflate_flush = function(y, C) { + let T, x, b; + return x = y.next_out_index, b = n.read, T = /* (int) */ + (b <= n.write ? n.write : n.end) - b, T > y.avail_out && (T = y.avail_out), T !== 0 && C == Z_BUF_ERROR && (C = Z_OK), y.avail_out -= T, y.total_out += T, y.next_out.set(n.win.subarray(b, b + T), x), x += T, b += T, b == n.end && (b = 0, n.write == n.end && (n.write = 0), T = n.write - b, T > y.avail_out && (T = y.avail_out), T !== 0 && C == Z_BUF_ERROR && (C = Z_OK), y.avail_out -= T, y.total_out += T, y.next_out.set(n.win.subarray(b, b + T), x), x += T, b += T), y.next_out_index = x, n.read = b, C; + }, n.proc = function(y, C) { + let T, x, b, S, E, A, D, P; + for (S = y.next_in_index, E = y.avail_in, x = n.bitb, b = n.bitk, A = n.write, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A; ; ) { + let I, M, R, L, g, w, O, N; + switch (i) { + case TYPE: + for (; b < 3; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + switch (T = /* (int) */ + x & 7, h = T & 1, T >>> 1) { + case 0: + x >>>= 3, b -= 3, T = b & 7, x >>>= T, b -= T, i = LENS; + break; + case 1: + I = [], M = [], R = [[]], L = [[]], InfTree.inflate_trees_fixed(I, M, R, L), f.init(I[0], M[0], R[0], 0, L[0], 0), x >>>= 3, b -= 3, i = CODES; + break; + case 2: + x >>>= 3, b -= 3, i = TABLE; + break; + case 3: + return x >>>= 3, b -= 3, i = BADBLOCKS, y.msg = "invalid block type", C = Z_DATA_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + } + break; + case LENS: + for (; b < 32; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + if ((~x >>> 16 & 65535) != (x & 65535)) + return i = BADBLOCKS, y.msg = "invalid stored block lengths", C = Z_DATA_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + r = x & 65535, x = b = 0, i = r !== 0 ? STORED : h !== 0 ? DRY : TYPE; + break; + case STORED: + if (E === 0 || D === 0 && (A == n.end && n.read !== 0 && (A = 0, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A), D === 0 && (n.write = A, C = n.inflate_flush(y, C), A = n.write, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A, A == n.end && n.read !== 0 && (A = 0, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A), D === 0))) + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + if (C = Z_OK, T = r, T > E && (T = E), T > D && (T = D), n.win.set(y.read_buf(S, T), A), S += T, E -= T, A += T, D -= T, (r -= T) !== 0) + break; + i = h !== 0 ? DRY : TYPE; + break; + case TABLE: + for (; b < 14; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + if (o = T = x & 16383, (T & 31) > 29 || (T >> 5 & 31) > 29) + return i = BADBLOCKS, y.msg = "too many length or distance symbols", C = Z_DATA_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + if (T = 258 + (T & 31) + (T >> 5 & 31), !c || c.length < T) + c = []; + else + for (P = 0; P < T; P++) + c[P] = 0; + x >>>= 14, b -= 14, s = 0, i = BTREE; + case BTREE: + for (; s < 4 + (o >>> 10); ) { + for (; b < 3; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + c[border[s++]] = x & 7, x >>>= 3, b -= 3; + } + for (; s < 19; ) + c[border[s++]] = 0; + if (l[0] = 7, T = _.inflate_trees_bits(c, l, d, p, y), T != Z_OK) + return C = T, C == Z_DATA_ERROR && (c = null, i = BADBLOCKS), n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + s = 0, i = DTREE; + case DTREE: + for (; T = o, !(s >= 258 + (T & 31) + (T >> 5 & 31)); ) { + let F, B; + for (T = l[0]; b < T; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + if (T = p[(d[0] + (x & inflate_mask[T])) * 3 + 1], B = p[(d[0] + (x & inflate_mask[T])) * 3 + 2], B < 16) + x >>>= T, b -= T, c[s++] = B; + else { + for (P = B == 18 ? 7 : B - 14, F = B == 18 ? 11 : 3; b < T + P; ) { + if (E !== 0) + C = Z_OK; + else + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + E--, x |= (y.read_byte(S++) & 255) << b, b += 8; + } + if (x >>>= T, b -= T, F += x & inflate_mask[P], x >>>= P, b -= P, P = s, T = o, P + F > 258 + (T & 31) + (T >> 5 & 31) || B == 16 && P < 1) + return c = null, i = BADBLOCKS, y.msg = "invalid bit length repeat", C = Z_DATA_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + B = B == 16 ? c[P - 1] : 0; + do + c[P++] = B; + while (--F !== 0); + s = P; + } + } + if (d[0] = -1, g = [], w = [], O = [], N = [], g[0] = 9, w[0] = 6, T = o, T = _.inflate_trees_dynamic(257 + (T & 31), 1 + (T >> 5 & 31), c, g, w, O, N, p, y), T != Z_OK) + return T == Z_DATA_ERROR && (c = null, i = BADBLOCKS), C = T, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + f.init(g[0], w[0], p, O[0], p, N[0]), i = CODES; + case CODES: + if (n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, (C = f.proc(n, y, C)) != Z_STREAM_END) + return n.inflate_flush(y, C); + if (C = Z_OK, f.free(y), S = y.next_in_index, E = y.avail_in, x = n.bitb, b = n.bitk, A = n.write, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A, h === 0) { + i = TYPE; + break; + } + i = DRY; + case DRY: + if (n.write = A, C = n.inflate_flush(y, C), A = n.write, D = /* (int) */ + A < n.read ? n.read - A - 1 : n.end - A, n.read != n.write) + return n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + i = DONELOCKS; + case DONELOCKS: + return C = Z_STREAM_END, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + case BADBLOCKS: + return C = Z_DATA_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + default: + return C = Z_STREAM_ERROR, n.bitb = x, n.bitk = b, y.avail_in = E, y.total_in += S - y.next_in_index, y.next_in_index = S, n.write = A, n.inflate_flush(y, C); + } + } + }, n.free = function(y) { + n.reset(y, null), n.win = null, p = null; + }, n.set_dictionary = function(y, C, T) { + n.win.set(y.subarray(C, C + T), 0), n.read = n.write = T; + }, n.sync_point = function() { + return i == LENS ? 1 : 0; + }; +} +const PRESET_DICT = 32, Z_DEFLATED = 8, METHOD = 0, FLAG = 1, DICT4 = 2, DICT3 = 3, DICT2 = 4, DICT1 = 5, DICT0 = 6, BLOCKS = 7, DONE = 12, BAD = 13, mark = [0, 0, 255, 255]; +function Inflate() { + const e = this; + e.mode = 0, e.method = 0, e.was = [0], e.need = 0, e.marker = 0, e.wbits = 0; + function t(n) { + return !n || !n.istate ? Z_STREAM_ERROR : (n.total_in = n.total_out = 0, n.msg = null, n.istate.mode = BLOCKS, n.istate.blocks.reset(n, null), Z_OK); + } + e.inflateEnd = function(n) { + return e.blocks && e.blocks.free(n), e.blocks = null, Z_OK; + }, e.inflateInit = function(n, i) { + return n.msg = null, e.blocks = null, i < 8 || i > 15 ? (e.inflateEnd(n), Z_STREAM_ERROR) : (e.wbits = i, n.istate.blocks = new InfBlocks(n, 1 << i), t(n), Z_OK); + }, e.inflate = function(n, i) { + let r, o; + if (!n || !n.istate || !n.next_in) + return Z_STREAM_ERROR; + const s = n.istate; + for (i = i == Z_FINISH ? Z_BUF_ERROR : Z_OK, r = Z_BUF_ERROR; ; ) + switch (s.mode) { + case METHOD: + if (n.avail_in === 0) + return r; + if (r = i, n.avail_in--, n.total_in++, ((s.method = n.read_byte(n.next_in_index++)) & 15) != Z_DEFLATED) { + s.mode = BAD, n.msg = "unknown compression method", s.marker = 5; + break; + } + if ((s.method >> 4) + 8 > s.wbits) { + s.mode = BAD, n.msg = "invalid win size", s.marker = 5; + break; + } + s.mode = FLAG; + case FLAG: + if (n.avail_in === 0) + return r; + if (r = i, n.avail_in--, n.total_in++, o = n.read_byte(n.next_in_index++) & 255, ((s.method << 8) + o) % 31 !== 0) { + s.mode = BAD, n.msg = "incorrect header check", s.marker = 5; + break; + } + if (!(o & PRESET_DICT)) { + s.mode = BLOCKS; + break; + } + s.mode = DICT4; + case DICT4: + if (n.avail_in === 0) + return r; + r = i, n.avail_in--, n.total_in++, s.need = (n.read_byte(n.next_in_index++) & 255) << 24 & 4278190080, s.mode = DICT3; + case DICT3: + if (n.avail_in === 0) + return r; + r = i, n.avail_in--, n.total_in++, s.need += (n.read_byte(n.next_in_index++) & 255) << 16 & 16711680, s.mode = DICT2; + case DICT2: + if (n.avail_in === 0) + return r; + r = i, n.avail_in--, n.total_in++, s.need += (n.read_byte(n.next_in_index++) & 255) << 8 & 65280, s.mode = DICT1; + case DICT1: + return n.avail_in === 0 ? r : (r = i, n.avail_in--, n.total_in++, s.need += n.read_byte(n.next_in_index++) & 255, s.mode = DICT0, Z_NEED_DICT); + case DICT0: + return s.mode = BAD, n.msg = "need dictionary", s.marker = 0, Z_STREAM_ERROR; + case BLOCKS: + if (r = s.blocks.proc(n, r), r == Z_DATA_ERROR) { + s.mode = BAD, s.marker = 0; + break; + } + if (r == Z_OK && (r = i), r != Z_STREAM_END) + return r; + r = i, s.blocks.reset(n, s.was), s.mode = DONE; + case DONE: + return n.avail_in = 0, Z_STREAM_END; + case BAD: + return Z_DATA_ERROR; + default: + return Z_STREAM_ERROR; + } + }, e.inflateSetDictionary = function(n, i, r) { + let o = 0, s = r; + if (!n || !n.istate || n.istate.mode != DICT0) + return Z_STREAM_ERROR; + const c = n.istate; + return s >= 1 << c.wbits && (s = (1 << c.wbits) - 1, o = r - s), c.blocks.set_dictionary(i, o, s), c.mode = BLOCKS, Z_OK; + }, e.inflateSync = function(n) { + let i, r, o, s, c; + if (!n || !n.istate) + return Z_STREAM_ERROR; + const l = n.istate; + if (l.mode != BAD && (l.mode = BAD, l.marker = 0), (i = n.avail_in) === 0) + return Z_BUF_ERROR; + for (r = n.next_in_index, o = l.marker; i !== 0 && o < 4; ) + n.read_byte(r) == mark[o] ? o++ : n.read_byte(r) !== 0 ? o = 0 : o = 4 - o, r++, i--; + return n.total_in += r - n.next_in_index, n.next_in_index = r, n.avail_in = i, l.marker = o, o != 4 ? Z_DATA_ERROR : (s = n.total_in, c = n.total_out, t(n), n.total_in = s, n.total_out = c, l.mode = BLOCKS, Z_OK); + }, e.inflateSyncPoint = function(n) { + return !n || !n.istate || !n.istate.blocks ? Z_STREAM_ERROR : n.istate.blocks.sync_point(); + }; +} +function ZStream() { +} +ZStream.prototype = { + inflateInit(e) { + const t = this; + return t.istate = new Inflate(), e || (e = MAX_BITS), t.istate.inflateInit(t, e); + }, + inflate(e) { + const t = this; + return t.istate ? t.istate.inflate(t, e) : Z_STREAM_ERROR; + }, + inflateEnd() { + const e = this; + if (!e.istate) + return Z_STREAM_ERROR; + const t = e.istate.inflateEnd(e); + return e.istate = null, t; + }, + inflateSync() { + const e = this; + return e.istate ? e.istate.inflateSync(e) : Z_STREAM_ERROR; + }, + inflateSetDictionary(e, t) { + const n = this; + return n.istate ? n.istate.inflateSetDictionary(n, e, t) : Z_STREAM_ERROR; + }, + read_byte(e) { + return this.next_in[e]; + }, + read_buf(e, t) { + return this.next_in.subarray(e, e + t); + } +}; +function ZipInflate(e) { + const t = this, n = new ZStream(), i = e && e.chunkSize ? Math.floor(e.chunkSize * 2) : 128 * 1024, r = Z_NO_FLUSH, o = new Uint8Array(i); + let s = !1; + n.inflateInit(), n.next_out = o, t.append = function(c, l) { + const d = []; + let f, h, p = 0, m = 0, _ = 0; + if (c.length !== 0) { + n.next_in_index = 0, n.next_in = c, n.avail_in = c.length; + do { + if (n.next_out_index = 0, n.avail_out = i, n.avail_in === 0 && !s && (n.next_in_index = 0, s = !0), f = n.inflate(r), s && f === Z_BUF_ERROR) { + if (n.avail_in !== 0) + throw new Error("inflating: bad input"); + } else if (f !== Z_OK && f !== Z_STREAM_END) + throw new Error("inflating: " + n.msg); + if ((s || f === Z_STREAM_END) && n.avail_in === c.length) + throw new Error("inflating: bad input"); + n.next_out_index && (n.next_out_index === i ? d.push(new Uint8Array(o)) : d.push(o.subarray(0, n.next_out_index))), _ += n.next_out_index, l && n.next_in_index > 0 && n.next_in_index != p && (l(n.next_in_index), p = n.next_in_index); + } while (n.avail_in > 0 || n.avail_out === 0); + return d.length > 1 ? (h = new Uint8Array(_), d.forEach(function(y) { + h.set(y, m), m += y.length; + })) : h = d[0] ? new Uint8Array(d[0]) : new Uint8Array(), h; + } + }, t.flush = function() { + n.inflateEnd(); + }; +} +const MAX_32_BITS = 4294967295, MAX_16_BITS = 65535, COMPRESSION_METHOD_DEFLATE = 8, COMPRESSION_METHOD_STORE = 0, COMPRESSION_METHOD_AES = 99, LOCAL_FILE_HEADER_SIGNATURE = 67324752, SPLIT_ZIP_FILE_SIGNATURE = 134695760, DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE, CENTRAL_FILE_HEADER_SIGNATURE = 33639248, END_OF_CENTRAL_DIR_SIGNATURE = 101010256, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 101075792, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 117853008, END_OF_CENTRAL_DIR_LENGTH = 22, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20, ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56, ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LENGTH, EXTRAFIELD_TYPE_ZIP64 = 1, EXTRAFIELD_TYPE_AES = 39169, EXTRAFIELD_TYPE_NTFS = 10, EXTRAFIELD_TYPE_NTFS_TAG1 = 1, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP = 21589, EXTRAFIELD_TYPE_UNICODE_PATH = 28789, EXTRAFIELD_TYPE_UNICODE_COMMENT = 25461, EXTRAFIELD_TYPE_USDZ = 6534, BITFLAG_ENCRYPTED = 1, BITFLAG_LEVEL = 6, BITFLAG_DATA_DESCRIPTOR = 8, BITFLAG_LANG_ENCODING_FLAG = 2048, FILE_ATTR_MSDOS_DIR_MASK = 16, VERSION_DEFLATE = 20, VERSION_ZIP64 = 45, VERSION_AES = 51, DIRECTORY_SIGNATURE = "/", MAX_DATE = new Date(2107, 11, 31), MIN_DATE = new Date(1980, 0, 1), UNDEFINED_VALUE = void 0, UNDEFINED_TYPE = "undefined", FUNCTION_TYPE = "function"; +class StreamAdapter { + constructor(t) { + return class extends TransformStream { + constructor(n, i) { + const r = new t(i); + super({ + transform(o, s) { + s.enqueue(r.append(o)); + }, + flush(o) { + const s = r.flush(); + s && o.enqueue(s); + } + }); + } + }; + } +} +const MINIMUM_CHUNK_SIZE = 64; +let maxWorkers = 2; +try { + typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency && (maxWorkers = navigator.hardwareConcurrency); +} catch { +} +const DEFAULT_CONFIGURATION = { + chunkSize: 512 * 1024, + maxWorkers, + terminateWorkerTimeout: 5e3, + useWebWorkers: !0, + useCompressionStream: !0, + workerScripts: UNDEFINED_VALUE, + CompressionStreamNative: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream, + DecompressionStreamNative: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream +}, config = Object.assign({}, DEFAULT_CONFIGURATION); +function getConfiguration() { + return config; +} +function getChunkSize(e) { + return Math.max(e.chunkSize, MINIMUM_CHUNK_SIZE); +} +function configure(e) { + const { + baseURL: t, + chunkSize: n, + maxWorkers: i, + terminateWorkerTimeout: r, + useCompressionStream: o, + useWebWorkers: s, + Deflate: c, + Inflate: l, + CompressionStream: d, + DecompressionStream: f, + workerScripts: h + } = e; + if (setIfDefined("baseURL", t), setIfDefined("chunkSize", n), setIfDefined("maxWorkers", i), setIfDefined("terminateWorkerTimeout", r), setIfDefined("useCompressionStream", o), setIfDefined("useWebWorkers", s), c && (config.CompressionStream = new StreamAdapter(c)), l && (config.DecompressionStream = new StreamAdapter(l)), setIfDefined("CompressionStream", d), setIfDefined("DecompressionStream", f), h !== UNDEFINED_VALUE) { + const { deflate: p, inflate: m } = h; + if ((p || m) && (config.workerScripts || (config.workerScripts = {})), p) { + if (!Array.isArray(p)) + throw new Error("workerScripts.deflate must be an array"); + config.workerScripts.deflate = p; + } + if (m) { + if (!Array.isArray(m)) + throw new Error("workerScripts.inflate must be an array"); + config.workerScripts.inflate = m; + } + } +} +function setIfDefined(e, t) { + t !== UNDEFINED_VALUE && (config[e] = t); +} +const table = []; +for (let e = 0; e < 256; e++) { + let t = e; + for (let n = 0; n < 8; n++) + t & 1 ? t = t >>> 1 ^ 3988292384 : t = t >>> 1; + table[e] = t; +} +class Crc32 { + constructor(t) { + this.crc = t || -1; + } + append(t) { + let n = this.crc | 0; + for (let i = 0, r = t.length | 0; i < r; i++) + n = n >>> 8 ^ table[(n ^ t[i]) & 255]; + this.crc = n; + } + get() { + return ~this.crc; + } +} +class Crc32Stream extends TransformStream { + constructor() { + let t; + const n = new Crc32(); + super({ + transform(i, r) { + n.append(i), r.enqueue(i); + }, + flush() { + const i = new Uint8Array(4); + new DataView(i.buffer).setUint32(0, n.get()), t.value = i; + } + }), t = this; + } +} +function encodeText(e) { + if (typeof TextEncoder == UNDEFINED_TYPE) { + e = unescape(encodeURIComponent(e)); + const t = new Uint8Array(e.length); + for (let n = 0; n < t.length; n++) + t[n] = e.charCodeAt(n); + return t; + } else + return new TextEncoder().encode(e); +} +const bitArray = { + /** + * Concatenate two bit arrays. + * @param {bitArray} a1 The first array. + * @param {bitArray} a2 The second array. + * @return {bitArray} The concatenation of a1 and a2. + */ + concat(e, t) { + if (e.length === 0 || t.length === 0) + return e.concat(t); + const n = e[e.length - 1], i = bitArray.getPartial(n); + return i === 32 ? e.concat(t) : bitArray._shiftRight(t, i, n | 0, e.slice(0, e.length - 1)); + }, + /** + * Find the length of an array of bits. + * @param {bitArray} a The array. + * @return {Number} The length of a, in bits. + */ + bitLength(e) { + const t = e.length; + if (t === 0) + return 0; + const n = e[t - 1]; + return (t - 1) * 32 + bitArray.getPartial(n); + }, + /** + * Truncate an array. + * @param {bitArray} a The array. + * @param {Number} len The length to truncate to, in bits. + * @return {bitArray} A new array, truncated to len bits. + */ + clamp(e, t) { + if (e.length * 32 < t) + return e; + e = e.slice(0, Math.ceil(t / 32)); + const n = e.length; + return t = t & 31, n > 0 && t && (e[n - 1] = bitArray.partial(t, e[n - 1] & 2147483648 >> t - 1, 1)), e; + }, + /** + * Make a partial word for a bit array. + * @param {Number} len The number of bits in the word. + * @param {Number} x The bits. + * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side. + * @return {Number} The partial word. + */ + partial(e, t, n) { + return e === 32 ? t : (n ? t | 0 : t << 32 - e) + e * 1099511627776; + }, + /** + * Get the number of bits used by a partial word. + * @param {Number} x The partial word. + * @return {Number} The number of bits used by the partial word. + */ + getPartial(e) { + return Math.round(e / 1099511627776) || 32; + }, + /** Shift an array right. + * @param {bitArray} a The array to shift. + * @param {Number} shift The number of bits to shift. + * @param {Number} [carry=0] A byte to carry in + * @param {bitArray} [out=[]] An array to prepend to the output. + * @private + */ + _shiftRight(e, t, n, i) { + for (i === void 0 && (i = []); t >= 32; t -= 32) + i.push(n), n = 0; + if (t === 0) + return i.concat(e); + for (let s = 0; s < e.length; s++) + i.push(n | e[s] >>> t), n = e[s] << 32 - t; + const r = e.length ? e[e.length - 1] : 0, o = bitArray.getPartial(r); + return i.push(bitArray.partial(t + o & 31, t + o > 32 ? n : i.pop(), 1)), i; + } +}, codec = { + bytes: { + /** Convert from a bitArray to an array of bytes. */ + fromBits(e) { + const n = bitArray.bitLength(e) / 8, i = new Uint8Array(n); + let r; + for (let o = 0; o < n; o++) + o & 3 || (r = e[o / 4]), i[o] = r >>> 24, r <<= 8; + return i; + }, + /** Convert from an array of bytes to a bitArray. */ + toBits(e) { + const t = []; + let n, i = 0; + for (n = 0; n < e.length; n++) + i = i << 8 | e[n], (n & 3) === 3 && (t.push(i), i = 0); + return n & 3 && t.push(bitArray.partial(8 * (n & 3), i)), t; + } + } +}, hash = {}; +hash.sha1 = class { + constructor(e) { + const t = this; + t.blockSize = 512, t._init = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], t._key = [1518500249, 1859775393, 2400959708, 3395469782], e ? (t._h = e._h.slice(0), t._buffer = e._buffer.slice(0), t._length = e._length) : t.reset(); + } + /** + * Reset the hash state. + * @return this + */ + reset() { + const e = this; + return e._h = e._init.slice(0), e._buffer = [], e._length = 0, e; + } + /** + * Input several words to the hash. + * @param {bitArray|String} data the data to hash. + * @return this + */ + update(e) { + const t = this; + typeof e == "string" && (e = codec.utf8String.toBits(e)); + const n = t._buffer = bitArray.concat(t._buffer, e), i = t._length, r = t._length = i + bitArray.bitLength(e); + if (r > 9007199254740991) + throw new Error("Cannot hash more than 2^53 - 1 bits"); + const o = new Uint32Array(n); + let s = 0; + for (let c = t.blockSize + i - (t.blockSize + i & t.blockSize - 1); c <= r; c += t.blockSize) + t._block(o.subarray(16 * s, 16 * (s + 1))), s += 1; + return n.splice(0, 16 * s), t; + } + /** + * Complete hashing and output the hash value. + * @return {bitArray} The hash value, an array of 5 big-endian words. TODO + */ + finalize() { + const e = this; + let t = e._buffer; + const n = e._h; + t = bitArray.concat(t, [bitArray.partial(1, 1)]); + for (let i = t.length + 2; i & 15; i++) + t.push(0); + for (t.push(Math.floor(e._length / 4294967296)), t.push(e._length | 0); t.length; ) + e._block(t.splice(0, 16)); + return e.reset(), n; + } + /** + * The SHA-1 logical functions f(0), f(1), ..., f(79). + * @private + */ + _f(e, t, n, i) { + if (e <= 19) + return t & n | ~t & i; + if (e <= 39) + return t ^ n ^ i; + if (e <= 59) + return t & n | t & i | n & i; + if (e <= 79) + return t ^ n ^ i; + } + /** + * Circular left-shift operator. + * @private + */ + _S(e, t) { + return t << e | t >>> 32 - e; + } + /** + * Perform one cycle of SHA-1. + * @param {Uint32Array|bitArray} words one block of words. + * @private + */ + _block(e) { + const t = this, n = t._h, i = Array(80); + for (let d = 0; d < 16; d++) + i[d] = e[d]; + let r = n[0], o = n[1], s = n[2], c = n[3], l = n[4]; + for (let d = 0; d <= 79; d++) { + d >= 16 && (i[d] = t._S(1, i[d - 3] ^ i[d - 8] ^ i[d - 14] ^ i[d - 16])); + const f = t._S(5, r) + t._f(d, o, s, c) + l + i[d] + t._key[Math.floor(d / 20)] | 0; + l = c, c = s, s = t._S(30, o), o = r, r = f; + } + n[0] = n[0] + r | 0, n[1] = n[1] + o | 0, n[2] = n[2] + s | 0, n[3] = n[3] + c | 0, n[4] = n[4] + l | 0; + } +}; +const cipher = {}; +cipher.aes = class { + constructor(e) { + const t = this; + t._tables = [[[], [], [], [], []], [[], [], [], [], []]], t._tables[0][0][0] || t._precompute(); + const n = t._tables[0][4], i = t._tables[1], r = e.length; + let o, s, c, l = 1; + if (r !== 4 && r !== 6 && r !== 8) + throw new Error("invalid aes key size"); + for (t._key = [s = e.slice(0), c = []], o = r; o < 4 * r + 28; o++) { + let d = s[o - 1]; + (o % r === 0 || r === 8 && o % r === 4) && (d = n[d >>> 24] << 24 ^ n[d >> 16 & 255] << 16 ^ n[d >> 8 & 255] << 8 ^ n[d & 255], o % r === 0 && (d = d << 8 ^ d >>> 24 ^ l << 24, l = l << 1 ^ (l >> 7) * 283)), s[o] = s[o - r] ^ d; + } + for (let d = 0; o; d++, o--) { + const f = s[d & 3 ? o : o - 4]; + o <= 4 || d < 4 ? c[d] = f : c[d] = i[0][n[f >>> 24]] ^ i[1][n[f >> 16 & 255]] ^ i[2][n[f >> 8 & 255]] ^ i[3][n[f & 255]]; + } + } + // public + /* Something like this might appear here eventually + name: "AES", + blockSize: 4, + keySizes: [4,6,8], + */ + /** + * Encrypt an array of 4 big-endian words. + * @param {Array} data The plaintext. + * @return {Array} The ciphertext. + */ + encrypt(e) { + return this._crypt(e, 0); + } + /** + * Decrypt an array of 4 big-endian words. + * @param {Array} data The ciphertext. + * @return {Array} The plaintext. + */ + decrypt(e) { + return this._crypt(e, 1); + } + /** + * Expand the S-box tables. + * + * @private + */ + _precompute() { + const e = this._tables[0], t = this._tables[1], n = e[4], i = t[4], r = [], o = []; + let s, c, l, d; + for (let f = 0; f < 256; f++) + o[(r[f] = f << 1 ^ (f >> 7) * 283) ^ f] = f; + for (let f = s = 0; !n[f]; f ^= c || 1, s = o[s] || 1) { + let h = s ^ s << 1 ^ s << 2 ^ s << 3 ^ s << 4; + h = h >> 8 ^ h & 255 ^ 99, n[f] = h, i[h] = f, d = r[l = r[c = r[f]]]; + let p = d * 16843009 ^ l * 65537 ^ c * 257 ^ f * 16843008, m = r[h] * 257 ^ h * 16843008; + for (let _ = 0; _ < 4; _++) + e[_][f] = m = m << 24 ^ m >>> 8, t[_][h] = p = p << 24 ^ p >>> 8; + } + for (let f = 0; f < 5; f++) + e[f] = e[f].slice(0), t[f] = t[f].slice(0); + } + /** + * Encryption and decryption core. + * @param {Array} input Four words to be encrypted or decrypted. + * @param dir The direction, 0 for encrypt and 1 for decrypt. + * @return {Array} The four encrypted or decrypted words. + * @private + */ + _crypt(e, t) { + if (e.length !== 4) + throw new Error("invalid aes block size"); + const n = this._key[t], i = n.length / 4 - 2, r = [0, 0, 0, 0], o = this._tables[t], s = o[0], c = o[1], l = o[2], d = o[3], f = o[4]; + let h = e[0] ^ n[0], p = e[t ? 3 : 1] ^ n[1], m = e[2] ^ n[2], _ = e[t ? 1 : 3] ^ n[3], y = 4, C, T, x; + for (let b = 0; b < i; b++) + C = s[h >>> 24] ^ c[p >> 16 & 255] ^ l[m >> 8 & 255] ^ d[_ & 255] ^ n[y], T = s[p >>> 24] ^ c[m >> 16 & 255] ^ l[_ >> 8 & 255] ^ d[h & 255] ^ n[y + 1], x = s[m >>> 24] ^ c[_ >> 16 & 255] ^ l[h >> 8 & 255] ^ d[p & 255] ^ n[y + 2], _ = s[_ >>> 24] ^ c[h >> 16 & 255] ^ l[p >> 8 & 255] ^ d[m & 255] ^ n[y + 3], y += 4, h = C, p = T, m = x; + for (let b = 0; b < 4; b++) + r[t ? 3 & -b : b] = f[h >>> 24] << 24 ^ f[p >> 16 & 255] << 16 ^ f[m >> 8 & 255] << 8 ^ f[_ & 255] ^ n[y++], C = h, h = p, p = m, m = _, _ = C; + return r; + } +}; +const random = { + /** + * Generate random words with pure js, cryptographically not as strong & safe as native implementation. + * @param {TypedArray} typedArray The array to fill. + * @return {TypedArray} The random values. + */ + getRandomValues(e) { + const t = new Uint32Array(e.buffer), n = (i) => { + let r = 987654321; + const o = 4294967295; + return function() { + return r = 36969 * (r & 65535) + (r >> 16) & o, i = 18e3 * (i & 65535) + (i >> 16) & o, (((r << 16) + i & o) / 4294967296 + 0.5) * (Math.random() > 0.5 ? 1 : -1); + }; + }; + for (let i = 0, r; i < e.length; i += 4) { + const o = n((r || Math.random()) * 4294967296); + r = o() * 987654071, t[i / 4] = o() * 4294967296 | 0; + } + return e; + } +}, mode = {}; +mode.ctrGladman = class { + constructor(e, t) { + this._prf = e, this._initIv = t, this._iv = t; + } + reset() { + this._iv = this._initIv; + } + /** Input some data to calculate. + * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last. + */ + update(e) { + return this.calculate(this._prf, e, this._iv); + } + incWord(e) { + if ((e >> 24 & 255) === 255) { + let t = e >> 16 & 255, n = e >> 8 & 255, i = e & 255; + t === 255 ? (t = 0, n === 255 ? (n = 0, i === 255 ? i = 0 : ++i) : ++n) : ++t, e = 0, e += t << 16, e += n << 8, e += i; + } else + e += 1 << 24; + return e; + } + incCounter(e) { + (e[0] = this.incWord(e[0])) === 0 && (e[1] = this.incWord(e[1])); + } + calculate(e, t, n) { + let i; + if (!(i = t.length)) + return []; + const r = bitArray.bitLength(t); + for (let o = 0; o < i; o += 4) { + this.incCounter(n); + const s = e.encrypt(n); + t[o] ^= s[0], t[o + 1] ^= s[1], t[o + 2] ^= s[2], t[o + 3] ^= s[3]; + } + return bitArray.clamp(t, r); + } +}; +const misc = { + importKey(e) { + return new misc.hmacSha1(codec.bytes.toBits(e)); + }, + pbkdf2(e, t, n, i) { + if (n = n || 1e4, i < 0 || n < 0) + throw new Error("invalid params to pbkdf2"); + const r = (i >> 5) + 1 << 2; + let o, s, c, l, d; + const f = new ArrayBuffer(r), h = new DataView(f); + let p = 0; + const m = bitArray; + for (t = codec.bytes.toBits(t), d = 1; p < (r || 1); d++) { + for (o = s = e.encrypt(m.concat(t, [d])), c = 1; c < n; c++) + for (s = e.encrypt(s), l = 0; l < s.length; l++) + o[l] ^= s[l]; + for (c = 0; p < (r || 1) && c < o.length; c++) + h.setInt32(p, o[c]), p += 4; + } + return f.slice(0, i / 8); + } +}; +misc.hmacSha1 = class { + constructor(e) { + const t = this, n = t._hash = hash.sha1, i = [[], []]; + t._baseHash = [new n(), new n()]; + const r = t._baseHash[0].blockSize / 32; + e.length > r && (e = new n().update(e).finalize()); + for (let o = 0; o < r; o++) + i[0][o] = e[o] ^ 909522486, i[1][o] = e[o] ^ 1549556828; + t._baseHash[0].update(i[0]), t._baseHash[1].update(i[1]), t._resultHash = new n(t._baseHash[0]); + } + reset() { + const e = this; + e._resultHash = new e._hash(e._baseHash[0]), e._updated = !1; + } + update(e) { + const t = this; + t._updated = !0, t._resultHash.update(e); + } + digest() { + const e = this, t = e._resultHash.finalize(), n = new e._hash(e._baseHash[1]).update(t).finalize(); + return e.reset(), n; + } + encrypt(e) { + if (this._updated) + throw new Error("encrypt on already updated hmac called!"); + return this.update(e), this.digest(e); + } +}; +const GET_RANDOM_VALUES_SUPPORTED = typeof crypto != UNDEFINED_TYPE && typeof crypto.getRandomValues == FUNCTION_TYPE, ERR_INVALID_PASSWORD = "Invalid password", ERR_INVALID_SIGNATURE = "Invalid signature", ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password"; +function getRandomValues$1(e) { + return GET_RANDOM_VALUES_SUPPORTED ? crypto.getRandomValues(e) : random.getRandomValues(e); +} +const BLOCK_LENGTH = 16, RAW_FORMAT = "raw", PBKDF2_ALGORITHM = { name: "PBKDF2" }, HASH_ALGORITHM = { name: "HMAC" }, HASH_FUNCTION = "SHA-1", BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM), DERIVED_BITS_ALGORITHM = Object.assign({ iterations: 1e3, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM), DERIVED_BITS_USAGE = ["deriveBits"], SALT_LENGTH = [8, 12, 16], KEY_LENGTH = [16, 24, 32], SIGNATURE_LENGTH = 10, COUNTER_DEFAULT_VALUE = [0, 0, 0, 0], CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE, subtle = CRYPTO_API_SUPPORTED && crypto.subtle, SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE, codecBytes = codec.bytes, Aes = cipher.aes, CtrGladman = mode.ctrGladman, HmacSha1 = misc.hmacSha1; +let IMPORT_KEY_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE, DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.deriveBits == FUNCTION_TYPE; +class AESDecryptionStream extends TransformStream { + constructor({ password: t, rawPassword: n, signed: i, encryptionStrength: r, checkPasswordOnly: o }) { + super({ + start() { + Object.assign(this, { + ready: new Promise((s) => this.resolveReady = s), + password: encodePassword(t, n), + signed: i, + strength: r - 1, + pending: new Uint8Array() + }); + }, + async transform(s, c) { + const l = this, { + password: d, + strength: f, + resolveReady: h, + ready: p + } = l; + d ? (await createDecryptionKeys(l, f, d, subarray(s, 0, SALT_LENGTH[f] + 2)), s = subarray(s, SALT_LENGTH[f] + 2), o ? c.error(new Error(ERR_ABORT_CHECK_PASSWORD)) : h()) : await p; + const m = new Uint8Array(s.length - SIGNATURE_LENGTH - (s.length - SIGNATURE_LENGTH) % BLOCK_LENGTH); + c.enqueue(append(l, s, m, 0, SIGNATURE_LENGTH, !0)); + }, + async flush(s) { + const { + signed: c, + ctr: l, + hmac: d, + pending: f, + ready: h + } = this; + if (d && l) { + await h; + const p = subarray(f, 0, f.length - SIGNATURE_LENGTH), m = subarray(f, f.length - SIGNATURE_LENGTH); + let _ = new Uint8Array(); + if (p.length) { + const y = toBits(codecBytes, p); + d.update(y); + const C = l.update(y); + _ = fromBits(codecBytes, C); + } + if (c) { + const y = subarray(fromBits(codecBytes, d.digest()), 0, SIGNATURE_LENGTH); + for (let C = 0; C < SIGNATURE_LENGTH; C++) + if (y[C] != m[C]) + throw new Error(ERR_INVALID_SIGNATURE); + } + s.enqueue(_); + } + } + }); + } +} +class AESEncryptionStream extends TransformStream { + constructor({ password: t, rawPassword: n, encryptionStrength: i }) { + let r; + super({ + start() { + Object.assign(this, { + ready: new Promise((o) => this.resolveReady = o), + password: encodePassword(t, n), + strength: i - 1, + pending: new Uint8Array() + }); + }, + async transform(o, s) { + const c = this, { + password: l, + strength: d, + resolveReady: f, + ready: h + } = c; + let p = new Uint8Array(); + l ? (p = await createEncryptionKeys(c, d, l), f()) : await h; + const m = new Uint8Array(p.length + o.length - o.length % BLOCK_LENGTH); + m.set(p, 0), s.enqueue(append(c, o, m, p.length, 0)); + }, + async flush(o) { + const { + ctr: s, + hmac: c, + pending: l, + ready: d + } = this; + if (c && s) { + await d; + let f = new Uint8Array(); + if (l.length) { + const h = s.update(toBits(codecBytes, l)); + c.update(h), f = fromBits(codecBytes, h); + } + r.signature = fromBits(codecBytes, c.digest()).slice(0, SIGNATURE_LENGTH), o.enqueue(concat(f, r.signature)); + } + } + }), r = this; + } +} +function append(e, t, n, i, r, o) { + const { + ctr: s, + hmac: c, + pending: l + } = e, d = t.length - r; + l.length && (t = concat(l, t), n = expand(n, d - d % BLOCK_LENGTH)); + let f; + for (f = 0; f <= d - BLOCK_LENGTH; f += BLOCK_LENGTH) { + const h = toBits(codecBytes, subarray(t, f, f + BLOCK_LENGTH)); + o && c.update(h); + const p = s.update(h); + o || c.update(p), n.set(fromBits(codecBytes, p), f + i); + } + return e.pending = subarray(t, f), n; +} +async function createDecryptionKeys(e, t, n, i) { + const r = await createKeys$1(e, t, n, subarray(i, 0, SALT_LENGTH[t])), o = subarray(i, SALT_LENGTH[t]); + if (r[0] != o[0] || r[1] != o[1]) + throw new Error(ERR_INVALID_PASSWORD); +} +async function createEncryptionKeys(e, t, n) { + const i = getRandomValues$1(new Uint8Array(SALT_LENGTH[t])), r = await createKeys$1(e, t, n, i); + return concat(i, r); +} +async function createKeys$1(e, t, n, i) { + e.password = null; + const r = await importKey(RAW_FORMAT, n, BASE_KEY_ALGORITHM, !1, DERIVED_BITS_USAGE), o = await deriveBits(Object.assign({ salt: i }, DERIVED_BITS_ALGORITHM), r, 8 * (KEY_LENGTH[t] * 2 + 2)), s = new Uint8Array(o), c = toBits(codecBytes, subarray(s, 0, KEY_LENGTH[t])), l = toBits(codecBytes, subarray(s, KEY_LENGTH[t], KEY_LENGTH[t] * 2)), d = subarray(s, KEY_LENGTH[t] * 2); + return Object.assign(e, { + keys: { + key: c, + authentication: l, + passwordVerification: d + }, + ctr: new CtrGladman(new Aes(c), Array.from(COUNTER_DEFAULT_VALUE)), + hmac: new HmacSha1(l) + }), d; +} +async function importKey(e, t, n, i, r) { + if (IMPORT_KEY_SUPPORTED) + try { + return await subtle.importKey(e, t, n, i, r); + } catch { + return IMPORT_KEY_SUPPORTED = !1, misc.importKey(t); + } + else + return misc.importKey(t); +} +async function deriveBits(e, t, n) { + if (DERIVE_BITS_SUPPORTED) + try { + return await subtle.deriveBits(e, t, n); + } catch { + return DERIVE_BITS_SUPPORTED = !1, misc.pbkdf2(t, e.salt, DERIVED_BITS_ALGORITHM.iterations, n); + } + else + return misc.pbkdf2(t, e.salt, DERIVED_BITS_ALGORITHM.iterations, n); +} +function encodePassword(e, t) { + return t === UNDEFINED_VALUE ? encodeText(e) : t; +} +function concat(e, t) { + let n = e; + return e.length + t.length && (n = new Uint8Array(e.length + t.length), n.set(e, 0), n.set(t, e.length)), n; +} +function expand(e, t) { + if (t && t > e.length) { + const n = e; + e = new Uint8Array(t), e.set(n, 0); + } + return e; +} +function subarray(e, t, n) { + return e.subarray(t, n); +} +function fromBits(e, t) { + return e.fromBits(t); +} +function toBits(e, t) { + return e.toBits(t); +} +const HEADER_LENGTH = 12; +class ZipCryptoDecryptionStream extends TransformStream { + constructor({ password: t, passwordVerification: n, checkPasswordOnly: i }) { + super({ + start() { + Object.assign(this, { + password: t, + passwordVerification: n + }), createKeys(this, t); + }, + transform(r, o) { + const s = this; + if (s.password) { + const c = decrypt(s, r.subarray(0, HEADER_LENGTH)); + if (s.password = null, c[HEADER_LENGTH - 1] != s.passwordVerification) + throw new Error(ERR_INVALID_PASSWORD); + r = r.subarray(HEADER_LENGTH); + } + i ? o.error(new Error(ERR_ABORT_CHECK_PASSWORD)) : o.enqueue(decrypt(s, r)); + } + }); + } +} +class ZipCryptoEncryptionStream extends TransformStream { + constructor({ password: t, passwordVerification: n }) { + super({ + start() { + Object.assign(this, { + password: t, + passwordVerification: n + }), createKeys(this, t); + }, + transform(i, r) { + const o = this; + let s, c; + if (o.password) { + o.password = null; + const l = getRandomValues$1(new Uint8Array(HEADER_LENGTH)); + l[HEADER_LENGTH - 1] = o.passwordVerification, s = new Uint8Array(i.length + l.length), s.set(encrypt(o, l), 0), c = HEADER_LENGTH; + } else + s = new Uint8Array(i.length), c = 0; + s.set(encrypt(o, i), c), r.enqueue(s); + } + }); + } +} +function decrypt(e, t) { + const n = new Uint8Array(t.length); + for (let i = 0; i < t.length; i++) + n[i] = getByte(e) ^ t[i], updateKeys(e, n[i]); + return n; +} +function encrypt(e, t) { + const n = new Uint8Array(t.length); + for (let i = 0; i < t.length; i++) + n[i] = getByte(e) ^ t[i], updateKeys(e, t[i]); + return n; +} +function createKeys(e, t) { + const n = [305419896, 591751049, 878082192]; + Object.assign(e, { + keys: n, + crcKey0: new Crc32(n[0]), + crcKey2: new Crc32(n[2]) + }); + for (let i = 0; i < t.length; i++) + updateKeys(e, t.charCodeAt(i)); +} +function updateKeys(e, t) { + let [n, i, r] = e.keys; + e.crcKey0.append([t]), n = ~e.crcKey0.get(), i = getInt32(Math.imul(getInt32(i + getInt8(n)), 134775813) + 1), e.crcKey2.append([i >>> 24]), r = ~e.crcKey2.get(), e.keys = [n, i, r]; +} +function getByte(e) { + const t = e.keys[2] | 2; + return getInt8(Math.imul(t, t ^ 1) >>> 8); +} +function getInt8(e) { + return e & 255; +} +function getInt32(e) { + return e & 4294967295; +} +const COMPRESSION_FORMAT = "deflate-raw"; +class DeflateStream extends TransformStream { + constructor(t, { chunkSize: n, CompressionStream: i, CompressionStreamNative: r }) { + super({}); + const { compressed: o, encrypted: s, useCompressionStream: c, zipCrypto: l, signed: d, level: f } = t, h = this; + let p, m, _ = filterEmptyChunks(super.readable); + (!s || l) && d && (p = new Crc32Stream(), _ = pipeThrough(_, p)), o && (_ = pipeThroughCommpressionStream(_, c, { level: f, chunkSize: n }, r, i)), s && (l ? _ = pipeThrough(_, new ZipCryptoEncryptionStream(t)) : (m = new AESEncryptionStream(t), _ = pipeThrough(_, m))), setReadable(h, _, () => { + let y; + s && !l && (y = m.signature), (!s || l) && d && (y = new DataView(p.value.buffer).getUint32(0)), h.signature = y; + }); + } +} +class InflateStream extends TransformStream { + constructor(t, { chunkSize: n, DecompressionStream: i, DecompressionStreamNative: r }) { + super({}); + const { zipCrypto: o, encrypted: s, signed: c, signature: l, compressed: d, useCompressionStream: f } = t; + let h, p, m = filterEmptyChunks(super.readable); + s && (o ? m = pipeThrough(m, new ZipCryptoDecryptionStream(t)) : (p = new AESDecryptionStream(t), m = pipeThrough(m, p))), d && (m = pipeThroughCommpressionStream(m, f, { chunkSize: n }, r, i)), (!s || o) && c && (h = new Crc32Stream(), m = pipeThrough(m, h)), setReadable(this, m, () => { + if ((!s || o) && c) { + const _ = new DataView(h.value.buffer); + if (l != _.getUint32(0, !1)) + throw new Error(ERR_INVALID_SIGNATURE); + } + }); + } +} +function filterEmptyChunks(e) { + return pipeThrough(e, new TransformStream({ + transform(t, n) { + t && t.length && n.enqueue(t); + } + })); +} +function setReadable(e, t, n) { + t = pipeThrough(t, new TransformStream({ flush: n })), Object.defineProperty(e, "readable", { + get() { + return t; + } + }); +} +function pipeThroughCommpressionStream(e, t, n, i, r) { + try { + const o = t && i ? i : r; + e = pipeThrough(e, new o(COMPRESSION_FORMAT, n)); + } catch { + if (t) + try { + e = pipeThrough(e, new r(COMPRESSION_FORMAT, n)); + } catch { + return e; + } + else + return e; + } + return e; +} +function pipeThrough(e, t) { + return e.pipeThrough(t); +} +const MESSAGE_EVENT_TYPE = "message", MESSAGE_START = "start", MESSAGE_PULL = "pull", MESSAGE_DATA = "data", MESSAGE_ACK_DATA = "ack", MESSAGE_CLOSE = "close", CODEC_DEFLATE = "deflate", CODEC_INFLATE = "inflate"; +class CodecStream extends TransformStream { + constructor(t, n) { + super({}); + const i = this, { codecType: r } = t; + let o; + r.startsWith(CODEC_DEFLATE) ? o = DeflateStream : r.startsWith(CODEC_INFLATE) && (o = InflateStream); + let s = 0, c = 0; + const l = new o(t, n), d = super.readable, f = new TransformStream({ + transform(p, m) { + p && p.length && (c += p.length, m.enqueue(p)); + }, + flush() { + Object.assign(i, { + inputSize: c + }); + } + }), h = new TransformStream({ + transform(p, m) { + p && p.length && (s += p.length, m.enqueue(p)); + }, + flush() { + const { signature: p } = l; + Object.assign(i, { + signature: p, + outputSize: s, + inputSize: c + }); + } + }); + Object.defineProperty(i, "readable", { + get() { + return d.pipeThrough(f).pipeThrough(l).pipeThrough(h); + } + }); + } +} +class ChunkStream extends TransformStream { + constructor(t) { + let n; + super({ + transform: i, + flush(r) { + n && n.length && r.enqueue(n); + } + }); + function i(r, o) { + if (n) { + const s = new Uint8Array(n.length + r.length); + s.set(n), s.set(r, n.length), r = s, n = null; + } + r.length > t ? (o.enqueue(r.slice(0, t)), i(r.slice(t), o)) : n = r; + } + } +} +let WEB_WORKERS_SUPPORTED = typeof Worker != UNDEFINED_TYPE; +class CodecWorker { + constructor(t, { readable: n, writable: i }, { options: r, config: o, streamOptions: s, useWebWorkers: c, transferStreams: l, scripts: d }, f) { + const { signal: h } = s; + return Object.assign(t, { + busy: !0, + readable: n.pipeThrough(new ChunkStream(o.chunkSize)).pipeThrough(new ProgressWatcherStream(n, s), { signal: h }), + writable: i, + options: Object.assign({}, r), + scripts: d, + transferStreams: l, + terminate() { + return new Promise((p) => { + const { worker: m, busy: _ } = t; + m ? (_ ? t.resolveTerminated = p : (m.terminate(), p()), t.interface = null) : p(); + }); + }, + onTaskFinished() { + const { resolveTerminated: p } = t; + p && (t.resolveTerminated = null, t.terminated = !0, t.worker.terminate(), p()), t.busy = !1, f(t); + } + }), (c && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(t, o); + } +} +class ProgressWatcherStream extends TransformStream { + constructor(t, { onstart: n, onprogress: i, size: r, onend: o }) { + let s = 0; + super({ + async start() { + n && await callHandler(n, r); + }, + async transform(c, l) { + s += c.length, i && await callHandler(i, s, r), l.enqueue(c); + }, + async flush() { + t.size = s, o && await callHandler(o, s); + } + }); + } +} +async function callHandler(e, ...t) { + try { + await e(...t); + } catch { + } +} +function createWorkerInterface(e, t) { + return { + run: () => runWorker$1(e, t) + }; +} +function createWebWorkerInterface(e, t) { + const { baseURL: n, chunkSize: i } = t; + if (!e.interface) { + let r; + try { + r = getWebWorker(e.scripts[0], n, e); + } catch { + return WEB_WORKERS_SUPPORTED = !1, createWorkerInterface(e, t); + } + Object.assign(e, { + worker: r, + interface: { + run: () => runWebWorker(e, { chunkSize: i }) + } + }); + } + return e.interface; +} +async function runWorker$1({ options: e, readable: t, writable: n, onTaskFinished: i }, r) { + try { + const o = new CodecStream(e, r); + await t.pipeThrough(o).pipeTo(n, { preventClose: !0, preventAbort: !0 }); + const { + signature: s, + inputSize: c, + outputSize: l + } = o; + return { + signature: s, + inputSize: c, + outputSize: l + }; + } finally { + i(); + } +} +async function runWebWorker(e, t) { + let n, i; + const r = new Promise((p, m) => { + n = p, i = m; + }); + Object.assign(e, { + reader: null, + writer: null, + resolveResult: n, + rejectResult: i, + result: r + }); + const { readable: o, options: s, scripts: c } = e, { writable: l, closed: d } = watchClosedStream(e.writable), f = sendMessage({ + type: MESSAGE_START, + scripts: c.slice(1), + options: s, + config: t, + readable: o, + writable: l + }, e); + f || Object.assign(e, { + reader: o.getReader(), + writer: l.getWriter() + }); + const h = await r; + return f || await l.getWriter().close(), await d, h; +} +function watchClosedStream(e) { + let t; + const n = new Promise((r) => t = r); + return { writable: new WritableStream({ + async write(r) { + const o = e.getWriter(); + await o.ready, await o.write(r), o.releaseLock(); + }, + close() { + t(); + }, + abort(r) { + return e.getWriter().abort(r); + } + }), closed: n }; +} +let classicWorkersSupported = !0, transferStreamsSupported = !0; +function getWebWorker(e, t, n) { + const i = { type: "module" }; + let r, o; + typeof e == FUNCTION_TYPE && (e = e()); + try { + r = new URL(e, t); + } catch { + r = e; + } + if (classicWorkersSupported) + try { + o = new Worker(r); + } catch { + classicWorkersSupported = !1, o = new Worker(r, i); + } + else + o = new Worker(r, i); + return o.addEventListener(MESSAGE_EVENT_TYPE, (s) => onMessage(s, n)), o; +} +function sendMessage(e, { worker: t, writer: n, onTaskFinished: i, transferStreams: r }) { + try { + let { value: o, readable: s, writable: c } = e; + const l = []; + if (o && (o.byteLength < o.buffer.byteLength ? e.value = o.buffer.slice(0, o.byteLength) : e.value = o.buffer, l.push(e.value)), r && transferStreamsSupported ? (s && l.push(s), c && l.push(c)) : e.readable = e.writable = null, l.length) + try { + return t.postMessage(e, l), !0; + } catch { + transferStreamsSupported = !1, e.readable = e.writable = null, t.postMessage(e); + } + else + t.postMessage(e); + } catch (o) { + throw n && n.releaseLock(), i(), o; + } +} +async function onMessage({ data: e }, t) { + const { type: n, value: i, messageId: r, result: o, error: s } = e, { reader: c, writer: l, resolveResult: d, rejectResult: f, onTaskFinished: h } = t; + try { + if (s) { + const { message: m, stack: _, code: y, name: C } = s, T = new Error(m); + Object.assign(T, { stack: _, code: y, name: C }), p(T); + } else { + if (n == MESSAGE_PULL) { + const { value: m, done: _ } = await c.read(); + sendMessage({ type: MESSAGE_DATA, value: m, done: _, messageId: r }, t); + } + n == MESSAGE_DATA && (await l.ready, await l.write(new Uint8Array(i)), sendMessage({ type: MESSAGE_ACK_DATA, messageId: r }, t)), n == MESSAGE_CLOSE && p(null, o); + } + } catch (m) { + sendMessage({ type: MESSAGE_CLOSE, messageId: r }, t), p(m); + } + function p(m, _) { + m ? f(m) : d(_), l && l.releaseLock(), h(); + } +} +let pool = []; +const pendingRequests = []; +let indexWorker = 0; +async function runWorker(e, t) { + const { options: n, config: i } = t, { transferStreams: r, useWebWorkers: o, useCompressionStream: s, codecType: c, compressed: l, signed: d, encrypted: f } = n, { workerScripts: h, maxWorkers: p } = i; + t.transferStreams = r || r === UNDEFINED_VALUE; + const m = !l && !d && !f && !t.transferStreams; + return t.useWebWorkers = !m && (o || o === UNDEFINED_VALUE && i.useWebWorkers), t.scripts = t.useWebWorkers && h ? h[c] : [], n.useCompressionStream = s || s === UNDEFINED_VALUE && i.useCompressionStream, (await _()).run(); + async function _() { + const C = pool.find((T) => !T.busy); + if (C) + return clearTerminateTimeout(C), new CodecWorker(C, e, t, y); + if (pool.length < p) { + const T = { indexWorker }; + return indexWorker++, pool.push(T), new CodecWorker(T, e, t, y); + } else + return new Promise((T) => pendingRequests.push({ resolve: T, stream: e, workerOptions: t })); + } + function y(C) { + if (pendingRequests.length) { + const [{ resolve: T, stream: x, workerOptions: b }] = pendingRequests.splice(0, 1); + T(new CodecWorker(C, x, b, y)); + } else C.worker ? (clearTerminateTimeout(C), terminateWorker(C, t)) : pool = pool.filter((T) => T != C); + } +} +function terminateWorker(e, t) { + const { config: n } = t, { terminateWorkerTimeout: i } = n; + Number.isFinite(i) && i >= 0 && (e.terminated ? e.terminated = !1 : e.terminateTimeout = setTimeout(async () => { + pool = pool.filter((r) => r != e); + try { + await e.terminate(); + } catch { + } + }, i)); +} +function clearTerminateTimeout(e) { + const { terminateTimeout: t } = e; + t && (clearTimeout(t), e.terminateTimeout = null); +} +const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon", CONTENT_TYPE_TEXT_PLAIN = "text/plain", HTTP_HEADER_CONTENT_TYPE = "Content-Type", DEFAULT_CHUNK_SIZE = 64 * 1024, PROPERTY_NAME_WRITABLE = "writable"; +class Stream { + constructor() { + this.size = 0; + } + init() { + this.initialized = !0; + } +} +class Reader extends Stream { + get readable() { + const t = this, { chunkSize: n = DEFAULT_CHUNK_SIZE } = t, i = new ReadableStream({ + start() { + this.chunkOffset = 0; + }, + async pull(r) { + const { offset: o = 0, size: s, diskNumberStart: c } = i, { chunkOffset: l } = this; + r.enqueue(await readUint8Array(t, o + l, Math.min(n, s - l), c)), l + n > s ? r.close() : this.chunkOffset += n; + } + }); + return i; + } +} +class Writer extends Stream { + constructor() { + super(); + const t = this, n = new WritableStream({ + write(i) { + return t.writeUint8Array(i); + } + }); + Object.defineProperty(t, PROPERTY_NAME_WRITABLE, { + get() { + return n; + } + }); + } + writeUint8Array() { + } +} +class Data64URIWriter extends Writer { + constructor(t) { + super(), Object.assign(this, { + data: "data:" + (t || "") + ";base64,", + pending: [] + }); + } + writeUint8Array(t) { + const n = this; + let i = 0, r = n.pending; + const o = n.pending.length; + for (n.pending = "", i = 0; i < Math.floor((o + t.length) / 3) * 3 - o; i++) + r += String.fromCharCode(t[i]); + for (; i < t.length; i++) + n.pending += String.fromCharCode(t[i]); + r.length > 2 ? n.data += btoa(r) : n.pending = r; + } + getData() { + return this.data + btoa(this.pending); + } +} +class BlobReader extends Reader { + constructor(t) { + super(), Object.assign(this, { + blob: t, + size: t.size + }); + } + async readUint8Array(t, n) { + const i = this, r = t + n; + let s = await (t || r < i.size ? i.blob.slice(t, r) : i.blob).arrayBuffer(); + return s.byteLength > n && (s = s.slice(t, r)), new Uint8Array(s); + } +} +class BlobWriter extends Stream { + constructor(t) { + super(); + const n = this, i = new TransformStream(), r = []; + t && r.push([HTTP_HEADER_CONTENT_TYPE, t]), Object.defineProperty(n, PROPERTY_NAME_WRITABLE, { + get() { + return i.writable; + } + }), n.blob = new Response(i.readable, { headers: r }).blob(); + } + getData() { + return this.blob; + } +} +class TextReader extends BlobReader { + constructor(t) { + super(new Blob([t], { type: CONTENT_TYPE_TEXT_PLAIN })); + } +} +class TextWriter extends BlobWriter { + constructor(t) { + super(t), Object.assign(this, { + encoding: t, + utf8: !t || t.toLowerCase() == "utf-8" + }); + } + async getData() { + const { + encoding: t, + utf8: n + } = this, i = await super.getData(); + if (i.text && n) + return i.text(); + { + const r = new FileReader(); + return new Promise((o, s) => { + Object.assign(r, { + onload: ({ target: c }) => o(c.result), + onerror: () => s(r.error) + }), r.readAsText(i, t); + }); + } + } +} +class SplitDataReader extends Reader { + constructor(t) { + super(), this.readers = t; + } + async init() { + const t = this, { readers: n } = t; + t.lastDiskNumber = 0, t.lastDiskOffset = 0, await Promise.all(n.map(async (i, r) => { + await i.init(), r != n.length - 1 && (t.lastDiskOffset += i.size), t.size += i.size; + })), super.init(); + } + async readUint8Array(t, n, i = 0) { + const r = this, { readers: o } = this; + let s, c = i; + c == -1 && (c = o.length - 1); + let l = t; + for (; l >= o[c].size; ) + l -= o[c].size, c++; + const d = o[c], f = d.size; + if (l + n <= f) + s = await readUint8Array(d, l, n); + else { + const h = f - l; + s = new Uint8Array(n), s.set(await readUint8Array(d, l, h)), s.set(await r.readUint8Array(t + h, n - h, i), h); + } + return r.lastDiskNumber = Math.max(c, r.lastDiskNumber), s; + } +} +class SplitDataWriter extends Stream { + constructor(t, n = 4294967295) { + super(); + const i = this; + Object.assign(i, { + diskNumber: 0, + diskOffset: 0, + size: 0, + maxSize: n, + availableSize: n + }); + let r, o, s; + const c = new WritableStream({ + async write(f) { + const { availableSize: h } = i; + if (s) + f.length >= h ? (await l(f.slice(0, h)), await d(), i.diskOffset += r.size, i.diskNumber++, s = null, await this.write(f.slice(h))) : await l(f); + else { + const { value: p, done: m } = await t.next(); + if (m && !p) + throw new Error(ERR_ITERATOR_COMPLETED_TOO_SOON); + r = p, r.size = 0, r.maxSize && (i.maxSize = r.maxSize), i.availableSize = i.maxSize, await initStream(r), o = p.writable, s = o.getWriter(), await this.write(f); + } + }, + async close() { + await s.ready, await d(); + } + }); + Object.defineProperty(i, PROPERTY_NAME_WRITABLE, { + get() { + return c; + } + }); + async function l(f) { + const h = f.length; + h && (await s.ready, await s.write(f), r.size += h, i.size += h, i.availableSize -= h); + } + async function d() { + o.size = r.size, await s.close(); + } + } +} +async function initStream(e, t) { + if (e.init && !e.initialized) + await e.init(t); + else + return Promise.resolve(); +} +function initReader(e) { + return Array.isArray(e) && (e = new SplitDataReader(e)), e instanceof ReadableStream && (e = { + readable: e + }), e; +} +function initWriter(e) { + e.writable === UNDEFINED_VALUE && typeof e.next == FUNCTION_TYPE && (e = new SplitDataWriter(e)), e instanceof WritableStream && (e = { + writable: e + }); + const { writable: t } = e; + return t.size === UNDEFINED_VALUE && (t.size = 0), e instanceof SplitDataWriter || Object.assign(e, { + diskNumber: 0, + diskOffset: 0, + availableSize: 1 / 0, + maxSize: 1 / 0 + }), e; +} +function readUint8Array(e, t, n, i) { + return e.readUint8Array(t, n, i); +} +const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""), VALID_CP437 = CP437.length == 256; +function decodeCP437(e) { + if (VALID_CP437) { + let t = ""; + for (let n = 0; n < e.length; n++) + t += CP437[e[n]]; + return t; + } else + return new TextDecoder().decode(e); +} +function decodeText(e, t) { + return t && t.trim().toLowerCase() == "cp437" ? decodeCP437(e) : new TextDecoder(t).decode(e); +} +const PROPERTY_NAME_FILENAME = "filename", PROPERTY_NAME_RAW_FILENAME = "rawFilename", PROPERTY_NAME_COMMENT = "comment", PROPERTY_NAME_RAW_COMMENT = "rawComment", PROPERTY_NAME_UNCOMPPRESSED_SIZE = "uncompressedSize", PROPERTY_NAME_COMPPRESSED_SIZE = "compressedSize", PROPERTY_NAME_OFFSET = "offset", PROPERTY_NAME_DISK_NUMBER_START = "diskNumberStart", PROPERTY_NAME_LAST_MODIFICATION_DATE = "lastModDate", PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE = "rawLastModDate", PROPERTY_NAME_LAST_ACCESS_DATE = "lastAccessDate", PROPERTY_NAME_RAW_LAST_ACCESS_DATE = "rawLastAccessDate", PROPERTY_NAME_CREATION_DATE = "creationDate", PROPERTY_NAME_RAW_CREATION_DATE = "rawCreationDate", PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE = "internalFileAttribute", PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE = "externalFileAttribute", PROPERTY_NAME_MS_DOS_COMPATIBLE = "msDosCompatible", PROPERTY_NAME_ZIP64 = "zip64", PROPERTY_NAMES = [ + PROPERTY_NAME_FILENAME, + PROPERTY_NAME_RAW_FILENAME, + PROPERTY_NAME_COMPPRESSED_SIZE, + PROPERTY_NAME_UNCOMPPRESSED_SIZE, + PROPERTY_NAME_LAST_MODIFICATION_DATE, + PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE, + PROPERTY_NAME_COMMENT, + PROPERTY_NAME_RAW_COMMENT, + PROPERTY_NAME_LAST_ACCESS_DATE, + PROPERTY_NAME_CREATION_DATE, + PROPERTY_NAME_OFFSET, + PROPERTY_NAME_DISK_NUMBER_START, + PROPERTY_NAME_DISK_NUMBER_START, + PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE, + PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE, + PROPERTY_NAME_MS_DOS_COMPATIBLE, + PROPERTY_NAME_ZIP64, + "directory", + "bitFlag", + "encrypted", + "signature", + "filenameUTF8", + "commentUTF8", + "compressionMethod", + "version", + "versionMadeBy", + "extraField", + "rawExtraField", + "extraFieldZip64", + "extraFieldUnicodePath", + "extraFieldUnicodeComment", + "extraFieldAES", + "extraFieldNTFS", + "extraFieldExtendedTimestamp" +]; +class Entry { + constructor(t) { + PROPERTY_NAMES.forEach((n) => this[n] = t[n]); + } +} +const ERR_BAD_FORMAT = "File format is not recognized", ERR_EOCDR_NOT_FOUND = "End of central directory not found", ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = "End of Zip64 central directory locator not found", ERR_CENTRAL_DIRECTORY_NOT_FOUND = "Central directory header not found", ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found", ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found", ERR_ENCRYPTED = "File contains encrypted entry", ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported", ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported", ERR_SPLIT_ZIP_FILE = "Split zip file", CHARSET_UTF8 = "utf-8", CHARSET_CP437 = "cp437", ZIP64_PROPERTIES = [ + [PROPERTY_NAME_UNCOMPPRESSED_SIZE, MAX_32_BITS], + [PROPERTY_NAME_COMPPRESSED_SIZE, MAX_32_BITS], + [PROPERTY_NAME_OFFSET, MAX_32_BITS], + [PROPERTY_NAME_DISK_NUMBER_START, MAX_16_BITS] +], ZIP64_EXTRACTION = { + [MAX_16_BITS]: { + getValue: getUint32, + bytes: 4 + }, + [MAX_32_BITS]: { + getValue: getBigUint64, + bytes: 8 + } +}; +class ZipReader { + constructor(t, n = {}) { + Object.assign(this, { + reader: initReader(t), + options: n, + config: getConfiguration() + }); + } + async *getEntriesGenerator(t = {}) { + const n = this; + let { reader: i } = n; + const { config: r } = n; + if (await initStream(i), (i.size === UNDEFINED_VALUE || !i.readUint8Array) && (i = new BlobReader(await new Response(i.readable).blob()), await initStream(i)), i.size < END_OF_CENTRAL_DIR_LENGTH) + throw new Error(ERR_BAD_FORMAT); + i.chunkSize = getChunkSize(r); + const o = await seekSignature(i, END_OF_CENTRAL_DIR_SIGNATURE, i.size, END_OF_CENTRAL_DIR_LENGTH, MAX_16_BITS * 16); + if (!o) { + const M = await readUint8Array(i, 0, 4), R = getDataView$1(M); + throw getUint32(R) == SPLIT_ZIP_FILE_SIGNATURE ? new Error(ERR_SPLIT_ZIP_FILE) : new Error(ERR_EOCDR_NOT_FOUND); + } + const s = getDataView$1(o); + let c = getUint32(s, 12), l = getUint32(s, 16); + const d = o.offset, f = getUint16(s, 20), h = d + END_OF_CENTRAL_DIR_LENGTH + f; + let p = getUint16(s, 4); + const m = i.lastDiskNumber || 0; + let _ = getUint16(s, 6), y = getUint16(s, 8), C = 0, T = 0; + if (l == MAX_32_BITS || c == MAX_32_BITS || y == MAX_16_BITS || _ == MAX_16_BITS) { + const M = await readUint8Array(i, o.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH), R = getDataView$1(M); + if (getUint32(R, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) { + l = getBigUint64(R, 8); + let L = await readUint8Array(i, l, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1), g = getDataView$1(L); + const w = o.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH; + if (getUint32(g, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE && l != w) { + const O = l; + l = w, C = l - O, L = await readUint8Array(i, l, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1), g = getDataView$1(L); + } + if (getUint32(g, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) + throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND); + p == MAX_16_BITS && (p = getUint32(g, 16)), _ == MAX_16_BITS && (_ = getUint32(g, 20)), y == MAX_16_BITS && (y = getBigUint64(g, 32)), c == MAX_32_BITS && (c = getBigUint64(g, 40)), l -= c; + } + } + if (l >= i.size && (C = i.size - l - c - END_OF_CENTRAL_DIR_LENGTH, l = i.size - c - END_OF_CENTRAL_DIR_LENGTH), m != p) + throw new Error(ERR_SPLIT_ZIP_FILE); + if (l < 0) + throw new Error(ERR_BAD_FORMAT); + let x = 0, b = await readUint8Array(i, l, c, _), S = getDataView$1(b); + if (c) { + const M = o.offset - c; + if (getUint32(S, x) != CENTRAL_FILE_HEADER_SIGNATURE && l != M) { + const R = l; + l = M, C += l - R, b = await readUint8Array(i, l, c, _), S = getDataView$1(b); + } + } + const E = o.offset - l - (i.lastDiskOffset || 0); + if (c != E && E >= 0 && (c = E, b = await readUint8Array(i, l, c, _), S = getDataView$1(b)), l < 0 || l >= i.size) + throw new Error(ERR_BAD_FORMAT); + const A = getOptionValue$1(n, t, "filenameEncoding"), D = getOptionValue$1(n, t, "commentEncoding"); + for (let M = 0; M < y; M++) { + const R = new ZipEntry(i, r, n.options); + if (getUint32(S, x) != CENTRAL_FILE_HEADER_SIGNATURE) + throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND); + readCommonHeader(R, S, x + 6); + const L = !!R.bitFlag.languageEncodingFlag, g = x + 46, w = g + R.filenameLength, O = w + R.extraFieldLength, N = getUint16(S, x + 4), F = (N & 0) == 0, B = b.subarray(g, w), V = getUint16(S, x + 32), U = O + V, k = b.subarray(O, U), $ = L, G = L, q = F && (getUint8(S, x + 38) & FILE_ATTR_MSDOS_DIR_MASK) == FILE_ATTR_MSDOS_DIR_MASK, z = getUint32(S, x + 42) + C; + Object.assign(R, { + versionMadeBy: N, + msDosCompatible: F, + compressedSize: 0, + uncompressedSize: 0, + commentLength: V, + directory: q, + offset: z, + diskNumberStart: getUint16(S, x + 34), + internalFileAttribute: getUint16(S, x + 36), + externalFileAttribute: getUint32(S, x + 38), + rawFilename: B, + filenameUTF8: $, + commentUTF8: G, + rawExtraField: b.subarray(w, O) + }); + const H = getOptionValue$1(n, t, "decodeText") || decodeText, Q = $ ? CHARSET_UTF8 : A || CHARSET_CP437, ne = G ? CHARSET_UTF8 : D || CHARSET_CP437; + let K = H(B, Q); + K === UNDEFINED_VALUE && (K = decodeText(B, Q)); + let Z = H(k, ne); + Z === UNDEFINED_VALUE && (Z = decodeText(k, ne)), Object.assign(R, { + rawComment: k, + filename: K, + comment: Z, + directory: q || K.endsWith(DIRECTORY_SIGNATURE) + }), T = Math.max(z, T), await readCommonFooter(R, R, S, x + 6); + const ee = new Entry(R); + ee.getData = (X, fe) => R.getData(X, ee, fe), x = U; + const { onprogress: oe } = t; + if (oe) + try { + await oe(M + 1, y, new Entry(R)); + } catch { + } + yield ee; + } + const P = getOptionValue$1(n, t, "extractPrependedData"), I = getOptionValue$1(n, t, "extractAppendedData"); + return P && (n.prependedData = T > 0 ? await readUint8Array(i, 0, T) : new Uint8Array()), n.comment = f ? await readUint8Array(i, d + END_OF_CENTRAL_DIR_LENGTH, f) : new Uint8Array(), I && (n.appendedData = h < i.size ? await readUint8Array(i, h, i.size - h) : new Uint8Array()), !0; + } + async getEntries(t = {}) { + const n = []; + for await (const i of this.getEntriesGenerator(t)) + n.push(i); + return n; + } + async close() { + } +} +class ZipEntry { + constructor(t, n, i) { + Object.assign(this, { + reader: t, + config: n, + options: i + }); + } + async getData(t, n, i = {}) { + const r = this, { + reader: o, + offset: s, + diskNumberStart: c, + extraFieldAES: l, + compressionMethod: d, + config: f, + bitFlag: h, + signature: p, + rawLastModDate: m, + uncompressedSize: _, + compressedSize: y + } = r, C = n.localDirectory = {}, T = await readUint8Array(o, s, 30, c), x = getDataView$1(T); + let b = getOptionValue$1(r, i, "password"), S = getOptionValue$1(r, i, "rawPassword"); + if (b = b && b.length && b, S = S && S.length && S, l && l.originalCompressionMethod != COMPRESSION_METHOD_AES) + throw new Error(ERR_UNSUPPORTED_COMPRESSION); + if (d != COMPRESSION_METHOD_STORE && d != COMPRESSION_METHOD_DEFLATE) + throw new Error(ERR_UNSUPPORTED_COMPRESSION); + if (getUint32(x, 0) != LOCAL_FILE_HEADER_SIGNATURE) + throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND); + readCommonHeader(C, x, 4), C.rawExtraField = C.extraFieldLength ? await readUint8Array(o, s + 30 + C.filenameLength, C.extraFieldLength, c) : new Uint8Array(), await readCommonFooter(r, C, x, 4, !0), Object.assign(n, { + lastAccessDate: C.lastAccessDate, + creationDate: C.creationDate + }); + const E = r.encrypted && C.encrypted, A = E && !l; + if (E) { + if (!A && l.strength === UNDEFINED_VALUE) + throw new Error(ERR_UNSUPPORTED_ENCRYPTION); + if (!b && !S) + throw new Error(ERR_ENCRYPTED); + } + const D = s + 30 + C.filenameLength + C.extraFieldLength, P = y, I = o.readable; + Object.assign(I, { + diskNumberStart: c, + offset: D, + size: P + }); + const M = getOptionValue$1(r, i, "signal"), R = getOptionValue$1(r, i, "checkPasswordOnly"); + R && (t = new WritableStream()), t = initWriter(t), await initStream(t, _); + const { writable: L } = t, { onstart: g, onprogress: w, onend: O } = i, N = { + options: { + codecType: CODEC_INFLATE, + password: b, + rawPassword: S, + zipCrypto: A, + encryptionStrength: l && l.strength, + signed: getOptionValue$1(r, i, "checkSignature"), + passwordVerification: A && (h.dataDescriptor ? m >>> 8 & 255 : p >>> 24 & 255), + signature: p, + compressed: d != 0, + encrypted: E, + useWebWorkers: getOptionValue$1(r, i, "useWebWorkers"), + useCompressionStream: getOptionValue$1(r, i, "useCompressionStream"), + transferStreams: getOptionValue$1(r, i, "transferStreams"), + checkPasswordOnly: R + }, + config: f, + streamOptions: { signal: M, size: P, onstart: g, onprogress: w, onend: O } + }; + let F = 0; + try { + ({ outputSize: F } = await runWorker({ readable: I, writable: L }, N)); + } catch (B) { + if (!R || B.message != ERR_ABORT_CHECK_PASSWORD) + throw B; + } finally { + const B = getOptionValue$1(r, i, "preventClose"); + L.size += F, !B && !L.locked && await L.getWriter().close(); + } + return R ? UNDEFINED_VALUE : t.getData ? t.getData() : L; + } +} +function readCommonHeader(e, t, n) { + const i = e.rawBitFlag = getUint16(t, n + 2), r = (i & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED, o = getUint32(t, n + 6); + Object.assign(e, { + encrypted: r, + version: getUint16(t, n), + bitFlag: { + level: (i & BITFLAG_LEVEL) >> 1, + dataDescriptor: (i & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR, + languageEncodingFlag: (i & BITFLAG_LANG_ENCODING_FLAG) == BITFLAG_LANG_ENCODING_FLAG + }, + rawLastModDate: o, + lastModDate: getDate(o), + filenameLength: getUint16(t, n + 22), + extraFieldLength: getUint16(t, n + 24) + }); +} +async function readCommonFooter(e, t, n, i, r) { + const { rawExtraField: o } = t, s = t.extraField = /* @__PURE__ */ new Map(), c = getDataView$1(new Uint8Array(o)); + let l = 0; + try { + for (; l < o.length; ) { + const T = getUint16(c, l), x = getUint16(c, l + 2); + s.set(T, { + type: T, + data: o.slice(l + 4, l + 4 + x) + }), l += 4 + x; + } + } catch { + } + const d = getUint16(n, i + 4); + Object.assign(t, { + signature: getUint32(n, i + 10), + uncompressedSize: getUint32(n, i + 18), + compressedSize: getUint32(n, i + 14) + }); + const f = s.get(EXTRAFIELD_TYPE_ZIP64); + f && (readExtraFieldZip64(f, t), t.extraFieldZip64 = f); + const h = s.get(EXTRAFIELD_TYPE_UNICODE_PATH); + h && (await readExtraFieldUnicode(h, PROPERTY_NAME_FILENAME, PROPERTY_NAME_RAW_FILENAME, t, e), t.extraFieldUnicodePath = h); + const p = s.get(EXTRAFIELD_TYPE_UNICODE_COMMENT); + p && (await readExtraFieldUnicode(p, PROPERTY_NAME_COMMENT, PROPERTY_NAME_RAW_COMMENT, t, e), t.extraFieldUnicodeComment = p); + const m = s.get(EXTRAFIELD_TYPE_AES); + m ? (readExtraFieldAES(m, t, d), t.extraFieldAES = m) : t.compressionMethod = d; + const _ = s.get(EXTRAFIELD_TYPE_NTFS); + _ && (readExtraFieldNTFS(_, t), t.extraFieldNTFS = _); + const y = s.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP); + y && (readExtraFieldExtendedTimestamp(y, t, r), t.extraFieldExtendedTimestamp = y); + const C = s.get(EXTRAFIELD_TYPE_USDZ); + C && (t.extraFieldUSDZ = C); +} +function readExtraFieldZip64(e, t) { + t.zip64 = !0; + const n = getDataView$1(e.data), i = ZIP64_PROPERTIES.filter(([r, o]) => t[r] == o); + for (let r = 0, o = 0; r < i.length; r++) { + const [s, c] = i[r]; + if (t[s] == c) { + const l = ZIP64_EXTRACTION[c]; + t[s] = e[s] = l.getValue(n, o), o += l.bytes; + } else if (e[s]) + throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND); + } +} +async function readExtraFieldUnicode(e, t, n, i, r) { + const o = getDataView$1(e.data), s = new Crc32(); + s.append(r[n]); + const c = getDataView$1(new Uint8Array(4)); + c.setUint32(0, s.get(), !0); + const l = getUint32(o, 1); + Object.assign(e, { + version: getUint8(o, 0), + [t]: decodeText(e.data.subarray(5)), + valid: !r.bitFlag.languageEncodingFlag && l == getUint32(c, 0) + }), e.valid && (i[t] = e[t], i[t + "UTF8"] = !0); +} +function readExtraFieldAES(e, t, n) { + const i = getDataView$1(e.data), r = getUint8(i, 4); + Object.assign(e, { + vendorVersion: getUint8(i, 0), + vendorId: getUint8(i, 2), + strength: r, + originalCompressionMethod: n, + compressionMethod: getUint16(i, 5) + }), t.compressionMethod = e.compressionMethod; +} +function readExtraFieldNTFS(e, t) { + const n = getDataView$1(e.data); + let i = 4, r; + try { + for (; i < e.data.length && !r; ) { + const o = getUint16(n, i), s = getUint16(n, i + 2); + o == EXTRAFIELD_TYPE_NTFS_TAG1 && (r = e.data.slice(i + 4, i + 4 + s)), i += 4 + s; + } + } catch { + } + try { + if (r && r.length == 24) { + const o = getDataView$1(r), s = o.getBigUint64(0, !0), c = o.getBigUint64(8, !0), l = o.getBigUint64(16, !0); + Object.assign(e, { + rawLastModDate: s, + rawLastAccessDate: c, + rawCreationDate: l + }); + const d = getDateNTFS(s), f = getDateNTFS(c), h = getDateNTFS(l), p = { lastModDate: d, lastAccessDate: f, creationDate: h }; + Object.assign(e, p), Object.assign(t, p); + } + } catch { + } +} +function readExtraFieldExtendedTimestamp(e, t, n) { + const i = getDataView$1(e.data), r = getUint8(i, 0), o = [], s = []; + n ? ((r & 1) == 1 && (o.push(PROPERTY_NAME_LAST_MODIFICATION_DATE), s.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE)), (r & 2) == 2 && (o.push(PROPERTY_NAME_LAST_ACCESS_DATE), s.push(PROPERTY_NAME_RAW_LAST_ACCESS_DATE)), (r & 4) == 4 && (o.push(PROPERTY_NAME_CREATION_DATE), s.push(PROPERTY_NAME_RAW_CREATION_DATE))) : e.data.length >= 5 && (o.push(PROPERTY_NAME_LAST_MODIFICATION_DATE), s.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE)); + let c = 1; + o.forEach((l, d) => { + if (e.data.length >= c + 4) { + const f = getUint32(i, c); + t[l] = e[l] = new Date(f * 1e3); + const h = s[d]; + e[h] = f; + } + c += 4; + }); +} +async function seekSignature(e, t, n, i, r) { + const o = new Uint8Array(4), s = getDataView$1(o); + setUint32$1(s, 0, t); + const c = i + r; + return await l(i) || await l(Math.min(c, n)); + async function l(d) { + const f = n - d, h = await readUint8Array(e, f, d); + for (let p = h.length - i; p >= 0; p--) + if (h[p] == o[0] && h[p + 1] == o[1] && h[p + 2] == o[2] && h[p + 3] == o[3]) + return { + offset: f + p, + buffer: h.slice(p, p + i).buffer + }; + } +} +function getOptionValue$1(e, t, n) { + return t[n] === UNDEFINED_VALUE ? e.options[n] : t[n]; +} +function getDate(e) { + const t = (e & 4294901760) >> 16, n = e & 65535; + try { + return new Date(1980 + ((t & 65024) >> 9), ((t & 480) >> 5) - 1, t & 31, (n & 63488) >> 11, (n & 2016) >> 5, (n & 31) * 2, 0); + } catch { + } +} +function getDateNTFS(e) { + return new Date(Number(e / BigInt(1e4) - BigInt(116444736e5))); +} +function getUint8(e, t) { + return e.getUint8(t); +} +function getUint16(e, t) { + return e.getUint16(t, !0); +} +function getUint32(e, t) { + return e.getUint32(t, !0); +} +function getBigUint64(e, t) { + return Number(e.getBigUint64(t, !0)); +} +function setUint32$1(e, t, n) { + e.setUint32(t, n, !0); +} +function getDataView$1(e) { + return new DataView(e.buffer); +} +const ERR_DUPLICATED_NAME = "File already exists", ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB", ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB", ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB", ERR_INVALID_VERSION = "Version exceeds 65535", ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3", ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535", ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB", ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (make sure 'keepOrder' is set to 'true')", EXTRAFIELD_DATA_AES = new Uint8Array([7, 0, 2, 0, 65, 69, 3, 0, 0]); +let workers = 0; +const pendingEntries = []; +class ZipWriter { + constructor(t, n = {}) { + t = initWriter(t); + const i = t.availableSize !== UNDEFINED_VALUE && t.availableSize > 0 && t.availableSize !== 1 / 0 && t.maxSize !== UNDEFINED_VALUE && t.maxSize > 0 && t.maxSize !== 1 / 0; + Object.assign(this, { + writer: t, + addSplitZipSignature: i, + options: n, + config: getConfiguration(), + files: /* @__PURE__ */ new Map(), + filenames: /* @__PURE__ */ new Set(), + offset: t.writable.size, + pendingEntriesSize: 0, + pendingAddFileCalls: /* @__PURE__ */ new Set(), + bufferedWrites: 0 + }); + } + async add(t = "", n, i = {}) { + const r = this, { + pendingAddFileCalls: o, + config: s + } = r; + workers < s.maxWorkers ? workers++ : await new Promise((l) => pendingEntries.push(l)); + let c; + try { + if (t = t.trim(), r.filenames.has(t)) + throw new Error(ERR_DUPLICATED_NAME); + return r.filenames.add(t), c = addFile(r, t, n, i), o.add(c), await c; + } catch (l) { + throw r.filenames.delete(t), l; + } finally { + o.delete(c); + const l = pendingEntries.shift(); + l ? l() : workers--; + } + } + async close(t = new Uint8Array(), n = {}) { + const i = this, { pendingAddFileCalls: r, writer: o } = this, { writable: s } = o; + for (; r.size; ) + await Promise.allSettled(Array.from(r)); + return await closeFile(this, t, n), getOptionValue(i, n, "preventClose") || await s.getWriter().close(), o.getData ? o.getData() : s; + } +} +async function addFile(e, t, n, i) { + t = t.trim(), i.directory && !t.endsWith(DIRECTORY_SIGNATURE) ? t += DIRECTORY_SIGNATURE : i.directory = t.endsWith(DIRECTORY_SIGNATURE); + const r = getOptionValue(e, i, "encodeText", encodeText); + let o = r(t); + if (o === UNDEFINED_VALUE && (o = encodeText(t)), getLength(o) > MAX_16_BITS) + throw new Error(ERR_INVALID_ENTRY_NAME); + const s = i.comment || ""; + let c = r(s); + if (c === UNDEFINED_VALUE && (c = encodeText(s)), getLength(c) > MAX_16_BITS) + throw new Error(ERR_INVALID_ENTRY_COMMENT); + const l = getOptionValue(e, i, "version", VERSION_DEFLATE); + if (l > MAX_16_BITS) + throw new Error(ERR_INVALID_VERSION); + const d = getOptionValue(e, i, "versionMadeBy", 20); + if (d > MAX_16_BITS) + throw new Error(ERR_INVALID_VERSION); + const f = getOptionValue(e, i, PROPERTY_NAME_LAST_MODIFICATION_DATE, /* @__PURE__ */ new Date()), h = getOptionValue(e, i, PROPERTY_NAME_LAST_ACCESS_DATE), p = getOptionValue(e, i, PROPERTY_NAME_CREATION_DATE), m = getOptionValue(e, i, PROPERTY_NAME_MS_DOS_COMPATIBLE, !0), _ = getOptionValue(e, i, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE, 0), y = getOptionValue(e, i, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE, 0), C = getOptionValue(e, i, "password"), T = getOptionValue(e, i, "rawPassword"), x = getOptionValue(e, i, "encryptionStrength", 3), b = getOptionValue(e, i, "zipCrypto"), S = getOptionValue(e, i, "extendedTimestamp", !0), E = getOptionValue(e, i, "keepOrder", !0), A = getOptionValue(e, i, "level"), D = getOptionValue(e, i, "useWebWorkers"), P = getOptionValue(e, i, "bufferedWrite"), I = getOptionValue(e, i, "dataDescriptorSignature", !1), M = getOptionValue(e, i, "signal"), R = getOptionValue(e, i, "useCompressionStream"); + let L = getOptionValue(e, i, "dataDescriptor", !0), g = getOptionValue(e, i, PROPERTY_NAME_ZIP64); + if (C !== UNDEFINED_VALUE && x !== UNDEFINED_VALUE && (x < 1 || x > 3)) + throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH); + let w = new Uint8Array(); + const { extraField: O } = i; + if (O) { + let oe = 0, X = 0; + O.forEach((fe) => oe += 4 + getLength(fe)), w = new Uint8Array(oe), O.forEach((fe, de) => { + if (de > MAX_16_BITS) + throw new Error(ERR_INVALID_EXTRAFIELD_TYPE); + if (getLength(fe) > MAX_16_BITS) + throw new Error(ERR_INVALID_EXTRAFIELD_DATA); + arraySet(w, new Uint16Array([de]), X), arraySet(w, new Uint16Array([getLength(fe)]), X + 2), arraySet(w, fe, X + 4), X += 4 + getLength(fe); + }); + } + let N = 0, F = 0, B = 0; + const V = g === !0; + n && (n = initReader(n), await initStream(n), n.size === UNDEFINED_VALUE ? (L = !0, (g || g === UNDEFINED_VALUE) && (g = !0, B = N = MAX_32_BITS + 1)) : (B = n.size, N = getMaximumCompressedSize(B))); + const { diskOffset: U, diskNumber: k, maxSize: $ } = e.writer, G = V || B > MAX_32_BITS, q = V || N > MAX_32_BITS, z = V || e.offset + e.pendingEntriesSize - U > MAX_32_BITS, Q = getOptionValue(e, i, "supportZip64SplitFile", !0) && V || k + Math.ceil(e.pendingEntriesSize / $) > MAX_16_BITS; + if (z || G || q || Q) { + if (g === !1 || !E) + throw new Error(ERR_UNSUPPORTED_FORMAT); + g = !0; + } + g = g || !1, i = Object.assign({}, i, { + rawFilename: o, + rawComment: c, + version: l, + versionMadeBy: d, + lastModDate: f, + lastAccessDate: h, + creationDate: p, + rawExtraField: w, + zip64: g, + zip64UncompressedSize: G, + zip64CompressedSize: q, + zip64Offset: z, + zip64DiskNumberStart: Q, + password: C, + rawPassword: T, + level: !R && e.config.CompressionStream === UNDEFINED_VALUE && e.config.CompressionStreamNative === UNDEFINED_VALUE ? 0 : A, + useWebWorkers: D, + encryptionStrength: x, + extendedTimestamp: S, + zipCrypto: b, + bufferedWrite: P, + keepOrder: E, + dataDescriptor: L, + dataDescriptorSignature: I, + signal: M, + msDosCompatible: m, + internalFileAttribute: _, + externalFileAttribute: y, + useCompressionStream: R + }); + const ne = getHeaderInfo(i), K = getDataDescriptorInfo(i), Z = getLength(ne.localHeaderArray, K.dataDescriptorArray); + F = Z + N, e.options.usdz && (F += F + 64), e.pendingEntriesSize += F; + let ee; + try { + ee = await getFileEntry(e, t, n, { headerInfo: ne, dataDescriptorInfo: K, metadataSize: Z }, i); + } finally { + e.pendingEntriesSize -= F; + } + return Object.assign(ee, { name: t, comment: s, extraField: O }), new Entry(ee); +} +async function getFileEntry(e, t, n, i, r) { + const { + files: o, + writer: s + } = e, { + keepOrder: c, + dataDescriptor: l, + signal: d + } = r, { + headerInfo: f + } = i, { usdz: h } = e.options, p = Array.from(o.values()).pop(); + let m = {}, _, y, C, T, x, b, S; + o.set(t, m); + try { + let P; + c && (P = p && p.lock, E()), (r.bufferedWrite || e.writerLocked || e.bufferedWrites && c || !l) && !h ? (b = new TransformStream(), S = new Response(b.readable).blob(), b.writable.size = 0, _ = !0, e.bufferedWrites++, await initStream(s)) : (b = s, await A()), await initStream(b); + const { writable: I } = s; + let { diskOffset: M } = s; + if (e.addSplitZipSignature) { + delete e.addSplitZipSignature; + const L = new Uint8Array(4), g = getDataView(L); + setUint32(g, 0, SPLIT_ZIP_FILE_SIGNATURE), await writeData(I, L), e.offset += 4; + } + h && appendExtraFieldUSDZ(i, e.offset - M), _ || (await P, await D(I)); + const { diskNumber: R } = s; + if (x = !0, m.diskNumberStart = R, m = await createFileEntry(n, b, m, i, e.config, r), x = !1, o.set(t, m), m.filename = t, _) { + await b.writable.getWriter().close(); + let L = await S; + await P, await A(), T = !0, l || (L = await writeExtraHeaderInfo(m, L, I, r)), await D(I), m.diskNumberStart = s.diskNumber, M = s.diskOffset, await L.stream().pipeTo(I, { preventClose: !0, preventAbort: !0, signal: d }), I.size += L.size, T = !1; + } + if (m.offset = e.offset - M, m.zip64) + setZip64ExtraInfo(m, r); + else if (m.offset > MAX_32_BITS) + throw new Error(ERR_UNSUPPORTED_FORMAT); + return e.offset += m.size, m; + } catch (P) { + if (_ && T || !_ && x) { + if (e.hasCorruptedEntries = !0, P) + try { + P.corruptedEntry = !0; + } catch { + } + _ ? e.offset += b.writable.size : e.offset = b.writable.size; + } + throw o.delete(t), P; + } finally { + _ && e.bufferedWrites--, C && C(), y && y(); + } + function E() { + m.lock = new Promise((P) => C = P); + } + async function A() { + e.writerLocked = !0; + const { lockWriter: P } = e; + e.lockWriter = new Promise((I) => y = () => { + e.writerLocked = !1, I(); + }), await P; + } + async function D(P) { + getLength(f.localHeaderArray) > s.availableSize && (s.availableSize = 0, await writeData(P, new Uint8Array())); + } +} +async function createFileEntry(e, t, { diskNumberStart: n, lock: i }, r, o, s) { + const { + headerInfo: c, + dataDescriptorInfo: l, + metadataSize: d + } = r, { + localHeaderArray: f, + headerArray: h, + lastModDate: p, + rawLastModDate: m, + encrypted: _, + compressed: y, + version: C, + compressionMethod: T, + rawExtraFieldExtendedTimestamp: x, + extraFieldExtendedTimestampFlag: b, + rawExtraFieldNTFS: S, + rawExtraFieldAES: E + } = c, { dataDescriptorArray: A } = l, { + rawFilename: D, + lastAccessDate: P, + creationDate: I, + password: M, + rawPassword: R, + level: L, + zip64: g, + zip64UncompressedSize: w, + zip64CompressedSize: O, + zip64Offset: N, + zip64DiskNumberStart: F, + zipCrypto: B, + dataDescriptor: V, + directory: U, + versionMadeBy: k, + rawComment: $, + rawExtraField: G, + useWebWorkers: q, + onstart: z, + onprogress: H, + onend: Q, + signal: ne, + encryptionStrength: K, + extendedTimestamp: Z, + msDosCompatible: ee, + internalFileAttribute: oe, + externalFileAttribute: X, + useCompressionStream: fe + } = s, de = { + lock: i, + versionMadeBy: k, + zip64: g, + directory: !!U, + filenameUTF8: !0, + rawFilename: D, + commentUTF8: !0, + rawComment: $, + rawExtraFieldExtendedTimestamp: x, + rawExtraFieldNTFS: S, + rawExtraFieldAES: E, + rawExtraField: G, + extendedTimestamp: Z, + msDosCompatible: ee, + internalFileAttribute: oe, + externalFileAttribute: X, + diskNumberStart: n + }; + let ce = 0, ye = 0, ge; + const { writable: re } = t; + if (e) { + e.chunkSize = getChunkSize(o), await writeData(re, f); + const pe = e.readable, Te = pe.size = e.size, xe = { + options: { + codecType: CODEC_DEFLATE, + level: L, + rawPassword: R, + password: M, + encryptionStrength: K, + zipCrypto: _ && B, + passwordVerification: _ && B && m >> 8 & 255, + signed: !0, + compressed: y, + encrypted: _, + useWebWorkers: q, + useCompressionStream: fe, + transferStreams: !1 + }, + config: o, + streamOptions: { signal: ne, size: Te, onstart: z, onprogress: H, onend: Q } + }, W = await runWorker({ readable: pe, writable: re }, xe); + ye = W.inputSize, ce = W.outputSize, ge = W.signature, re.size += ye; + } else + await writeData(re, f); + let be; + if (g) { + let pe = 4; + w && (pe += 8), O && (pe += 8), N && (pe += 8), F && (pe += 4), be = new Uint8Array(pe); + } else + be = new Uint8Array(); + return setEntryInfo({ + signature: ge, + rawExtraFieldZip64: be, + compressedSize: ce, + uncompressedSize: ye, + headerInfo: c, + dataDescriptorInfo: l + }, s), V && await writeData(re, A), Object.assign(de, { + uncompressedSize: ye, + compressedSize: ce, + lastModDate: p, + rawLastModDate: m, + creationDate: I, + lastAccessDate: P, + encrypted: _, + size: d + ce, + compressionMethod: T, + version: C, + headerArray: h, + signature: ge, + rawExtraFieldZip64: be, + extraFieldExtendedTimestampFlag: b, + zip64UncompressedSize: w, + zip64CompressedSize: O, + zip64Offset: N, + zip64DiskNumberStart: F + }), de; +} +function getHeaderInfo(e) { + const { + rawFilename: t, + lastModDate: n, + lastAccessDate: i, + creationDate: r, + rawPassword: o, + password: s, + level: c, + zip64: l, + zipCrypto: d, + dataDescriptor: f, + directory: h, + rawExtraField: p, + encryptionStrength: m, + extendedTimestamp: _ + } = e, y = c !== 0 && !h, C = !!(s && getLength(s) || o && getLength(o)); + let T = e.version, x; + if (C && !d) { + x = new Uint8Array(getLength(EXTRAFIELD_DATA_AES) + 2); + const F = getDataView(x); + setUint16(F, 0, EXTRAFIELD_TYPE_AES), arraySet(x, EXTRAFIELD_DATA_AES, 2), setUint8(F, 8, m); + } else + x = new Uint8Array(); + let b, S, E; + if (_) { + S = new Uint8Array(9 + (i ? 4 : 0) + (r ? 4 : 0)); + const F = getDataView(S); + setUint16(F, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP), setUint16(F, 2, getLength(S) - 4), E = 1 + (i ? 2 : 0) + (r ? 4 : 0), setUint8(F, 4, E); + let B = 5; + setUint32(F, B, Math.floor(n.getTime() / 1e3)), B += 4, i && (setUint32(F, B, Math.floor(i.getTime() / 1e3)), B += 4), r && setUint32(F, B, Math.floor(r.getTime() / 1e3)); + try { + b = new Uint8Array(36); + const V = getDataView(b), U = getTimeNTFS(n); + setUint16(V, 0, EXTRAFIELD_TYPE_NTFS), setUint16(V, 2, 32), setUint16(V, 8, EXTRAFIELD_TYPE_NTFS_TAG1), setUint16(V, 10, 24), setBigUint64(V, 12, U), setBigUint64(V, 20, getTimeNTFS(i) || U), setBigUint64(V, 28, getTimeNTFS(r) || U); + } catch { + b = new Uint8Array(); + } + } else + b = S = new Uint8Array(); + let A = BITFLAG_LANG_ENCODING_FLAG; + f && (A = A | BITFLAG_DATA_DESCRIPTOR); + let D = COMPRESSION_METHOD_STORE; + y && (D = COMPRESSION_METHOD_DEFLATE), l && (T = T > VERSION_ZIP64 ? T : VERSION_ZIP64), C && (A = A | BITFLAG_ENCRYPTED, d || (T = T > VERSION_AES ? T : VERSION_AES, D = COMPRESSION_METHOD_AES, y && (x[9] = COMPRESSION_METHOD_DEFLATE))); + const P = new Uint8Array(26), I = getDataView(P); + setUint16(I, 0, T), setUint16(I, 2, A), setUint16(I, 4, D); + const M = new Uint32Array(1), R = getDataView(M); + let L; + n < MIN_DATE ? L = MIN_DATE : n > MAX_DATE ? L = MAX_DATE : L = n, setUint16(R, 0, (L.getHours() << 6 | L.getMinutes()) << 5 | L.getSeconds() / 2), setUint16(R, 2, (L.getFullYear() - 1980 << 4 | L.getMonth() + 1) << 5 | L.getDate()); + const g = M[0]; + setUint32(I, 6, g), setUint16(I, 22, getLength(t)); + const w = getLength(x, S, b, p); + setUint16(I, 24, w); + const O = new Uint8Array(30 + getLength(t) + w), N = getDataView(O); + return setUint32(N, 0, LOCAL_FILE_HEADER_SIGNATURE), arraySet(O, P, 4), arraySet(O, t, 30), arraySet(O, x, 30 + getLength(t)), arraySet(O, S, 30 + getLength(t, x)), arraySet(O, b, 30 + getLength(t, x, S)), arraySet(O, p, 30 + getLength(t, x, S, b)), { + localHeaderArray: O, + headerArray: P, + headerView: I, + lastModDate: n, + rawLastModDate: g, + encrypted: C, + compressed: y, + version: T, + compressionMethod: D, + extraFieldExtendedTimestampFlag: E, + rawExtraFieldExtendedTimestamp: S, + rawExtraFieldNTFS: b, + rawExtraFieldAES: x, + extraFieldLength: w + }; +} +function appendExtraFieldUSDZ(e, t) { + const { headerInfo: n } = e; + let { localHeaderArray: i, extraFieldLength: r } = n, o = getDataView(i), s = 64 - (t + getLength(i)) % 64; + s < 4 && (s += 64); + const c = new Uint8Array(s), l = getDataView(c); + setUint16(l, 0, EXTRAFIELD_TYPE_USDZ), setUint16(l, 2, s - 2); + const d = i; + n.localHeaderArray = i = new Uint8Array(getLength(d) + s), arraySet(i, d), arraySet(i, c, getLength(d)), o = getDataView(i), setUint16(o, 28, r + s), e.metadataSize += s; +} +function getDataDescriptorInfo(e) { + const { + zip64: t, + dataDescriptor: n, + dataDescriptorSignature: i + } = e; + let r = new Uint8Array(), o, s = 0; + return n && (r = new Uint8Array(t ? i ? 24 : 20 : i ? 16 : 12), o = getDataView(r), i && (s = 4, setUint32(o, 0, DATA_DESCRIPTOR_RECORD_SIGNATURE))), { + dataDescriptorArray: r, + dataDescriptorView: o, + dataDescriptorOffset: s + }; +} +function setEntryInfo(e, t) { + const { + signature: n, + rawExtraFieldZip64: i, + compressedSize: r, + uncompressedSize: o, + headerInfo: s, + dataDescriptorInfo: c + } = e, { + headerView: l, + encrypted: d + } = s, { + dataDescriptorView: f, + dataDescriptorOffset: h + } = c, { + zip64: p, + zip64UncompressedSize: m, + zip64CompressedSize: _, + zipCrypto: y, + dataDescriptor: C + } = t; + if ((!d || y) && n !== UNDEFINED_VALUE && (setUint32(l, 10, n), C && setUint32(f, h, n)), p) { + const T = getDataView(i); + setUint16(T, 0, EXTRAFIELD_TYPE_ZIP64), setUint16(T, 2, getLength(i) - 4); + let x = 4; + m && (setUint32(l, 18, MAX_32_BITS), setBigUint64(T, x, BigInt(o)), x += 8), _ && (setUint32(l, 14, MAX_32_BITS), setBigUint64(T, x, BigInt(r))), C && (setBigUint64(f, h + 4, BigInt(r)), setBigUint64(f, h + 12, BigInt(o))); + } else + setUint32(l, 14, r), setUint32(l, 18, o), C && (setUint32(f, h + 4, r), setUint32(f, h + 8, o)); +} +async function writeExtraHeaderInfo(e, t, n, { zipCrypto: i }) { + let r; + r = await t.slice(0, 26).arrayBuffer(), r.byteLength != 26 && (r = r.slice(0, 26)); + const o = new DataView(r); + return (!e.encrypted || i) && setUint32(o, 14, e.signature), e.zip64 ? (setUint32(o, 18, MAX_32_BITS), setUint32(o, 22, MAX_32_BITS)) : (setUint32(o, 18, e.compressedSize), setUint32(o, 22, e.uncompressedSize)), await writeData(n, new Uint8Array(r)), t.slice(r.byteLength); +} +function setZip64ExtraInfo(e, t) { + const { rawExtraFieldZip64: n, offset: i, diskNumberStart: r } = e, { zip64UncompressedSize: o, zip64CompressedSize: s, zip64Offset: c, zip64DiskNumberStart: l } = t, d = getDataView(n); + let f = 4; + o && (f += 8), s && (f += 8), c && (setBigUint64(d, f, BigInt(i)), f += 8), l && setUint32(d, f, r); +} +async function closeFile(e, t, n) { + const { files: i, writer: r } = e, { diskOffset: o, writable: s } = r; + let { diskNumber: c } = r, l = 0, d = 0, f = e.offset - o, h = i.size; + for (const [, E] of i) { + const { + rawFilename: A, + rawExtraFieldZip64: D, + rawExtraFieldAES: P, + rawComment: I, + rawExtraFieldNTFS: M, + rawExtraField: R, + extendedTimestamp: L, + extraFieldExtendedTimestampFlag: g, + lastModDate: w + } = E; + let O; + if (L) { + O = new Uint8Array(9); + const N = getDataView(O); + setUint16(N, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP), setUint16(N, 2, 5), setUint8(N, 4, g), setUint32(N, 5, Math.floor(w.getTime() / 1e3)); + } else + O = new Uint8Array(); + E.rawExtraFieldCDExtendedTimestamp = O, d += 46 + getLength( + A, + I, + D, + P, + M, + O, + R + ); + } + const p = new Uint8Array(d), m = getDataView(p); + await initStream(r); + let _ = 0; + for (const [E, A] of Array.from(i.values()).entries()) { + const { + offset: D, + rawFilename: P, + rawExtraFieldZip64: I, + rawExtraFieldAES: M, + rawExtraFieldCDExtendedTimestamp: R, + rawExtraFieldNTFS: L, + rawExtraField: g, + rawComment: w, + versionMadeBy: O, + headerArray: N, + directory: F, + zip64: B, + zip64UncompressedSize: V, + zip64CompressedSize: U, + zip64DiskNumberStart: k, + zip64Offset: $, + msDosCompatible: G, + internalFileAttribute: q, + externalFileAttribute: z, + diskNumberStart: H, + uncompressedSize: Q, + compressedSize: ne + } = A, K = getLength(I, M, R, L, g); + setUint32(m, l, CENTRAL_FILE_HEADER_SIGNATURE), setUint16(m, l + 4, O); + const Z = getDataView(N); + V || setUint32(Z, 18, Q), U || setUint32(Z, 14, ne), arraySet(p, N, l + 6), setUint16(m, l + 30, K), setUint16(m, l + 32, getLength(w)), setUint16(m, l + 34, B && k ? MAX_16_BITS : H), setUint16(m, l + 36, q), z ? setUint32(m, l + 38, z) : F && G && setUint8(m, l + 38, FILE_ATTR_MSDOS_DIR_MASK), setUint32(m, l + 42, B && $ ? MAX_32_BITS : D), arraySet(p, P, l + 46), arraySet(p, I, l + 46 + getLength(P)), arraySet(p, M, l + 46 + getLength(P, I)), arraySet(p, R, l + 46 + getLength(P, I, M)), arraySet(p, L, l + 46 + getLength(P, I, M, R)), arraySet(p, g, l + 46 + getLength(P, I, M, R, L)), arraySet(p, w, l + 46 + getLength(P) + K); + const ee = 46 + getLength(P, w) + K; + if (l - _ > r.availableSize && (r.availableSize = 0, await writeData(s, p.slice(_, l)), _ = l), l += ee, n.onprogress) + try { + await n.onprogress(E + 1, i.size, new Entry(A)); + } catch { + } + } + await writeData(s, _ ? p.slice(_) : p); + let y = r.diskNumber; + const { availableSize: C } = r; + C < END_OF_CENTRAL_DIR_LENGTH && y++; + let T = getOptionValue(e, n, "zip64"); + if (f > MAX_32_BITS || d > MAX_32_BITS || h > MAX_16_BITS || y > MAX_16_BITS) { + if (T === !1) + throw new Error(ERR_UNSUPPORTED_FORMAT); + T = !0; + } + const x = new Uint8Array(T ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH), b = getDataView(x); + l = 0, T && (setUint32(b, 0, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE), setBigUint64(b, 4, BigInt(44)), setUint16(b, 12, 45), setUint16(b, 14, 45), setUint32(b, 16, y), setUint32(b, 20, c), setBigUint64(b, 24, BigInt(h)), setBigUint64(b, 32, BigInt(h)), setBigUint64(b, 40, BigInt(d)), setBigUint64(b, 48, BigInt(f)), setUint32(b, 56, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE), setBigUint64(b, 64, BigInt(f) + BigInt(d)), setUint32(b, 72, y + 1), getOptionValue(e, n, "supportZip64SplitFile", !0) && (y = MAX_16_BITS, c = MAX_16_BITS), h = MAX_16_BITS, f = MAX_32_BITS, d = MAX_32_BITS, l += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH), setUint32(b, l, END_OF_CENTRAL_DIR_SIGNATURE), setUint16(b, l + 4, y), setUint16(b, l + 6, c), setUint16(b, l + 8, h), setUint16(b, l + 10, h), setUint32(b, l + 12, d), setUint32(b, l + 16, f); + const S = getLength(t); + if (S) + if (S <= MAX_16_BITS) + setUint16(b, l + 20, S); + else + throw new Error(ERR_INVALID_COMMENT); + await writeData(s, x), S && await writeData(s, t); +} +async function writeData(e, t) { + const n = e.getWriter(); + try { + await n.ready, e.size += getLength(t), await n.write(t); + } finally { + n.releaseLock(); + } +} +function getTimeNTFS(e) { + if (e) + return (BigInt(e.getTime()) + BigInt(116444736e5)) * BigInt(1e4); +} +function getOptionValue(e, t, n, i) { + const r = t[n] === UNDEFINED_VALUE ? e.options[n] : t[n]; + return r === UNDEFINED_VALUE ? i : r; +} +function getMaximumCompressedSize(e) { + return e + 5 * (Math.floor(e / 16383) + 1); +} +function setUint8(e, t, n) { + e.setUint8(t, n); +} +function setUint16(e, t, n) { + e.setUint16(t, n, !0); +} +function setUint32(e, t, n) { + e.setUint32(t, n, !0); +} +function setBigUint64(e, t, n) { + e.setBigUint64(t, n, !0); +} +function arraySet(e, t, n) { + e.set(t, n); +} +function getDataView(e) { + return new DataView(e.buffer); +} +function getLength(...e) { + let t = 0; + return e.forEach((n) => n && (t += n.length)), t; +} +configure({ Deflate: ZipDeflate, Inflate: ZipInflate }); +function getElement(e) { + return typeof e == "string" && (e = document.getElementById(e)), e; +} +function KmlLookAt(e, t) { + this.position = e, this.headingPitchRange = t; +} +function KmlTour(e, t) { + this.id = t, this.name = e, this.playlistIndex = 0, this.playlist = [], this.tourStart = new Event(), this.tourEnd = new Event(), this.entryStart = new Event(), this.entryEnd = new Event(), this._activeEntries = []; +} +KmlTour.prototype.addPlaylistEntry = function(e) { + this.playlist.push(e); +}; +KmlTour.prototype.play = function(e, t) { + this.tourStart.raiseEvent(); + const n = this; + playEntry.call(this, e, t, function(i) { + n.playlistIndex = 0, i || cancelAllEntries(n._activeEntries), n.tourEnd.raiseEvent(i); + }); +}; +KmlTour.prototype.stop = function() { + cancelAllEntries(this._activeEntries); +}; +function cancelAllEntries(e) { + for (let t = e.pop(); t !== void 0; t = e.pop()) + t.stop(); +} +function playEntry(e, t, n) { + const i = this.playlist[this.playlistIndex]; + if (i) { + const r = playNext.bind(this, e, t, n); + if (this._activeEntries.push(i), this.entryStart.raiseEvent(i), i.blocking) + i.play(r, e.scene.camera, t); + else { + const o = this; + i.play(function() { + o.entryEnd.raiseEvent(i); + const s = o._activeEntries.indexOf(i); + s >= 0 && o._activeEntries.splice(s, 1); + }), r(e, t, n); + } + } else defined(n) && n(!1); +} +function playNext(e, t, n, i) { + const r = this.playlist[this.playlistIndex]; + if (this.entryEnd.raiseEvent(r, i), i) + n(i); + else { + const o = this._activeEntries.indexOf(r); + o >= 0 && this._activeEntries.splice(o, 1), this.playlistIndex++, playEntry.call(this, e, t, n); + } +} +var Easing = Object.freeze({ + Linear: Object.freeze({ + None: function(e) { + return e; + }, + In: function(e) { + return e; + }, + Out: function(e) { + return e; + }, + InOut: function(e) { + return e; + } + }), + Quadratic: Object.freeze({ + In: function(e) { + return e * e; + }, + Out: function(e) { + return e * (2 - e); + }, + InOut: function(e) { + return (e *= 2) < 1 ? 0.5 * e * e : -0.5 * (--e * (e - 2) - 1); + } + }), + Cubic: Object.freeze({ + In: function(e) { + return e * e * e; + }, + Out: function(e) { + return --e * e * e + 1; + }, + InOut: function(e) { + return (e *= 2) < 1 ? 0.5 * e * e * e : 0.5 * ((e -= 2) * e * e + 2); + } + }), + Quartic: Object.freeze({ + In: function(e) { + return e * e * e * e; + }, + Out: function(e) { + return 1 - --e * e * e * e; + }, + InOut: function(e) { + return (e *= 2) < 1 ? 0.5 * e * e * e * e : -0.5 * ((e -= 2) * e * e * e - 2); + } + }), + Quintic: Object.freeze({ + In: function(e) { + return e * e * e * e * e; + }, + Out: function(e) { + return --e * e * e * e * e + 1; + }, + InOut: function(e) { + return (e *= 2) < 1 ? 0.5 * e * e * e * e * e : 0.5 * ((e -= 2) * e * e * e * e + 2); + } + }), + Sinusoidal: Object.freeze({ + In: function(e) { + return 1 - Math.sin((1 - e) * Math.PI / 2); + }, + Out: function(e) { + return Math.sin(e * Math.PI / 2); + }, + InOut: function(e) { + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - e))); + } + }), + Exponential: Object.freeze({ + In: function(e) { + return e === 0 ? 0 : Math.pow(1024, e - 1); + }, + Out: function(e) { + return e === 1 ? 1 : 1 - Math.pow(2, -10 * e); + }, + InOut: function(e) { + return e === 0 ? 0 : e === 1 ? 1 : (e *= 2) < 1 ? 0.5 * Math.pow(1024, e - 1) : 0.5 * (-Math.pow(2, -10 * (e - 1)) + 2); + } + }), + Circular: Object.freeze({ + In: function(e) { + return 1 - Math.sqrt(1 - e * e); + }, + Out: function(e) { + return Math.sqrt(1 - --e * e); + }, + InOut: function(e) { + return (e *= 2) < 1 ? -0.5 * (Math.sqrt(1 - e * e) - 1) : 0.5 * (Math.sqrt(1 - (e -= 2) * e) + 1); + } + }), + Elastic: Object.freeze({ + In: function(e) { + return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * (e - 1)) * Math.sin((e - 1.1) * 5 * Math.PI); + }, + Out: function(e) { + return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e - 0.1) * 5 * Math.PI) + 1; + }, + InOut: function(e) { + return e === 0 ? 0 : e === 1 ? 1 : (e *= 2, e < 1 ? -0.5 * Math.pow(2, 10 * (e - 1)) * Math.sin((e - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (e - 1)) * Math.sin((e - 1.1) * 5 * Math.PI) + 1); + } + }), + Back: Object.freeze({ + In: function(e) { + var t = 1.70158; + return e === 1 ? 1 : e * e * ((t + 1) * e - t); + }, + Out: function(e) { + var t = 1.70158; + return e === 0 ? 0 : --e * e * ((t + 1) * e + t) + 1; + }, + InOut: function(e) { + var t = 2.5949095; + return (e *= 2) < 1 ? 0.5 * (e * e * ((t + 1) * e - t)) : 0.5 * ((e -= 2) * e * ((t + 1) * e + t) + 2); + } + }), + Bounce: Object.freeze({ + In: function(e) { + return 1 - Easing.Bounce.Out(1 - e); + }, + Out: function(e) { + return e < 1 / 2.75 ? 7.5625 * e * e : e < 2 / 2.75 ? 7.5625 * (e -= 1.5 / 2.75) * e + 0.75 : e < 2.5 / 2.75 ? 7.5625 * (e -= 2.25 / 2.75) * e + 0.9375 : 7.5625 * (e -= 2.625 / 2.75) * e + 0.984375; + }, + InOut: function(e) { + return e < 0.5 ? Easing.Bounce.In(e * 2) * 0.5 : Easing.Bounce.Out(e * 2 - 1) * 0.5 + 0.5; + } + }), + generatePow: function(e) { + return e === void 0 && (e = 4), e = e < Number.EPSILON ? Number.EPSILON : e, e = e > 1e4 ? 1e4 : e, { + In: function(t) { + return Math.pow(t, e); + }, + Out: function(t) { + return 1 - Math.pow(1 - t, e); + }, + InOut: function(t) { + return t < 0.5 ? Math.pow(t * 2, e) / 2 : (1 - Math.pow(2 - t * 2, e)) / 2 + 0.5; + } + }; + } +}), now = function() { + return performance.now(); +}, Group = ( + /** @class */ + function() { + function e() { + for (var t = [], n = 0; n < arguments.length; n++) + t[n] = arguments[n]; + this._tweens = {}, this._tweensAddedDuringUpdate = {}, this.add.apply(this, t); + } + return e.prototype.getAll = function() { + var t = this; + return Object.keys(this._tweens).map(function(n) { + return t._tweens[n]; + }); + }, e.prototype.removeAll = function() { + this._tweens = {}; + }, e.prototype.add = function() { + for (var t, n = [], i = 0; i < arguments.length; i++) + n[i] = arguments[i]; + for (var r = 0, o = n; r < o.length; r++) { + var s = o[r]; + (t = s._group) === null || t === void 0 || t.remove(s), s._group = this, this._tweens[s.getId()] = s, this._tweensAddedDuringUpdate[s.getId()] = s; + } + }, e.prototype.remove = function() { + for (var t = [], n = 0; n < arguments.length; n++) + t[n] = arguments[n]; + for (var i = 0, r = t; i < r.length; i++) { + var o = r[i]; + o._group = void 0, delete this._tweens[o.getId()], delete this._tweensAddedDuringUpdate[o.getId()]; + } + }, e.prototype.allStopped = function() { + return this.getAll().every(function(t) { + return !t.isPlaying(); + }); + }, e.prototype.update = function(t, n) { + t === void 0 && (t = now()), n === void 0 && (n = !0); + var i = Object.keys(this._tweens); + if (i.length !== 0) + for (; i.length > 0; ) { + this._tweensAddedDuringUpdate = {}; + for (var r = 0; r < i.length; r++) { + var o = this._tweens[i[r]], s = !n; + o && o.update(t, s) === !1 && !n && this.remove(o); + } + i = Object.keys(this._tweensAddedDuringUpdate); + } + }, e; + }() +), Interpolation = { + Linear: function(e, t) { + var n = e.length - 1, i = n * t, r = Math.floor(i), o = Interpolation.Utils.Linear; + return t < 0 ? o(e[0], e[1], i) : t > 1 ? o(e[n], e[n - 1], n - i) : o(e[r], e[r + 1 > n ? n : r + 1], i - r); + }, + Bezier: function(e, t) { + for (var n = 0, i = e.length - 1, r = Math.pow, o = Interpolation.Utils.Bernstein, s = 0; s <= i; s++) + n += r(1 - t, i - s) * r(t, s) * e[s] * o(i, s); + return n; + }, + CatmullRom: function(e, t) { + var n = e.length - 1, i = n * t, r = Math.floor(i), o = Interpolation.Utils.CatmullRom; + return e[0] === e[n] ? (t < 0 && (r = Math.floor(i = n * (1 + t))), o(e[(r - 1 + n) % n], e[r], e[(r + 1) % n], e[(r + 2) % n], i - r)) : t < 0 ? e[0] - (o(e[0], e[0], e[1], e[1], -i) - e[0]) : t > 1 ? e[n] - (o(e[n], e[n], e[n - 1], e[n - 1], i - n) - e[n]) : o(e[r ? r - 1 : 0], e[r], e[n < r + 1 ? n : r + 1], e[n < r + 2 ? n : r + 2], i - r); + }, + Utils: { + Linear: function(e, t, n) { + return (t - e) * n + e; + }, + Bernstein: function(e, t) { + var n = Interpolation.Utils.Factorial; + return n(e) / n(t) / n(e - t); + }, + Factorial: /* @__PURE__ */ function() { + var e = [1]; + return function(t) { + var n = 1; + if (e[t]) + return e[t]; + for (var i = t; i > 1; i--) + n *= i; + return e[t] = n, n; + }; + }(), + CatmullRom: function(e, t, n, i, r) { + var o = (n - e) * 0.5, s = (i - t) * 0.5, c = r * r, l = r * c; + return (2 * t - 2 * n + o + s) * l + (-3 * t + 3 * n - 2 * o - s) * c + o * r + t; + } + } +}, Sequence = ( + /** @class */ + function() { + function e() { + } + return e.nextId = function() { + return e._nextId++; + }, e._nextId = 0, e; + }() +), mainGroup = new Group(), Tween$1 = ( + /** @class */ + function() { + function e(t, n) { + this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = Easing.Linear.None, this._interpolationFunction = Interpolation.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = Sequence.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1, this._object = t, typeof n == "object" ? (this._group = n, n.add(this)) : n === !0 && (this._group = mainGroup, mainGroup.add(this)); + } + return e.prototype.getId = function() { + return this._id; + }, e.prototype.isPlaying = function() { + return this._isPlaying; + }, e.prototype.isPaused = function() { + return this._isPaused; + }, e.prototype.getDuration = function() { + return this._duration; + }, e.prototype.to = function(t, n) { + if (n === void 0 && (n = 1e3), this._isPlaying) + throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first."); + return this._valuesEnd = t, this._propertiesAreSetUp = !1, this._duration = n < 0 ? 0 : n, this; + }, e.prototype.duration = function(t) { + return t === void 0 && (t = 1e3), this._duration = t < 0 ? 0 : t, this; + }, e.prototype.dynamic = function(t) { + return t === void 0 && (t = !1), this._isDynamic = t, this; + }, e.prototype.start = function(t, n) { + if (t === void 0 && (t = now()), n === void 0 && (n = !1), this._isPlaying) + return this; + if (this._repeat = this._initialRepeat, this._reversed) { + this._reversed = !1; + for (var i in this._valuesStartRepeat) + this._swapEndStartRepeatValues(i), this._valuesStart[i] = this._valuesStartRepeat[i]; + } + if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = t, this._startTime += this._delayTime, !this._propertiesAreSetUp || n) { + if (this._propertiesAreSetUp = !0, !this._isDynamic) { + var r = {}; + for (var o in this._valuesEnd) + r[o] = this._valuesEnd[o]; + this._valuesEnd = r; + } + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, n); + } + return this; + }, e.prototype.startFromCurrentValues = function(t) { + return this.start(t, !0); + }, e.prototype._setupProperties = function(t, n, i, r, o) { + for (var s in i) { + var c = t[s], l = Array.isArray(c), d = l ? "array" : typeof c, f = !l && Array.isArray(i[s]); + if (!(d === "undefined" || d === "function")) { + if (f) { + var h = i[s]; + if (h.length === 0) + continue; + for (var p = [c], m = 0, _ = h.length; m < _; m += 1) { + var y = this._handleRelativeValue(c, h[m]); + if (isNaN(y)) { + f = !1, console.warn("Found invalid interpolation list. Skipping."); + break; + } + p.push(y); + } + f && (i[s] = p); + } + if ((d === "object" || l) && c && !f) { + n[s] = l ? [] : {}; + var C = c; + for (var T in C) + n[s][T] = C[T]; + r[s] = l ? [] : {}; + var h = i[s]; + if (!this._isDynamic) { + var x = {}; + for (var T in h) + x[T] = h[T]; + i[s] = h = x; + } + this._setupProperties(C, n[s], h, r[s], o); + } else + (typeof n[s] > "u" || o) && (n[s] = c), l || (n[s] *= 1), f ? r[s] = i[s].slice().reverse() : r[s] = n[s] || 0; + } + } + }, e.prototype.stop = function() { + return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this; + }, e.prototype.end = function() { + return this._goToEnd = !0, this.update(this._startTime + this._duration), this; + }, e.prototype.pause = function(t) { + return t === void 0 && (t = now()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = t, this); + }, e.prototype.resume = function(t) { + return t === void 0 && (t = now()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += t - this._pauseStart, this._pauseStart = 0, this); + }, e.prototype.stopChainedTweens = function() { + for (var t = 0, n = this._chainedTweens.length; t < n; t++) + this._chainedTweens[t].stop(); + return this; + }, e.prototype.group = function(t) { + return t ? (t.add(this), this) : (console.warn("tween.group() without args has been removed, use group.add(tween) instead."), this); + }, e.prototype.remove = function() { + var t; + return (t = this._group) === null || t === void 0 || t.remove(this), this; + }, e.prototype.delay = function(t) { + return t === void 0 && (t = 0), this._delayTime = t, this; + }, e.prototype.repeat = function(t) { + return t === void 0 && (t = 0), this._initialRepeat = t, this._repeat = t, this; + }, e.prototype.repeatDelay = function(t) { + return this._repeatDelayTime = t, this; + }, e.prototype.yoyo = function(t) { + return t === void 0 && (t = !1), this._yoyo = t, this; + }, e.prototype.easing = function(t) { + return t === void 0 && (t = Easing.Linear.None), this._easingFunction = t, this; + }, e.prototype.interpolation = function(t) { + return t === void 0 && (t = Interpolation.Linear), this._interpolationFunction = t, this; + }, e.prototype.chain = function() { + for (var t = [], n = 0; n < arguments.length; n++) + t[n] = arguments[n]; + return this._chainedTweens = t, this; + }, e.prototype.onStart = function(t) { + return this._onStartCallback = t, this; + }, e.prototype.onEveryStart = function(t) { + return this._onEveryStartCallback = t, this; + }, e.prototype.onUpdate = function(t) { + return this._onUpdateCallback = t, this; + }, e.prototype.onRepeat = function(t) { + return this._onRepeatCallback = t, this; + }, e.prototype.onComplete = function(t) { + return this._onCompleteCallback = t, this; + }, e.prototype.onStop = function(t) { + return this._onStopCallback = t, this; + }, e.prototype.update = function(t, n) { + var i = this, r; + if (t === void 0 && (t = now()), n === void 0 && (n = e.autoStartOnUpdate), this._isPaused) + return !0; + var o; + if (!this._goToEnd && !this._isPlaying) + if (n) + this.start(t, !0); + else + return !1; + if (this._goToEnd = !1, t < this._startTime) + return !0; + this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0); + var s = t - this._startTime, c = this._duration + ((r = this._repeatDelayTime) !== null && r !== void 0 ? r : this._delayTime), l = this._duration + this._repeat * c, d = function() { + if (i._duration === 0 || s > l) + return 1; + var y = Math.trunc(s / c), C = s - y * c, T = Math.min(C / i._duration, 1); + return T === 0 && s === i._duration ? 1 : T; + }, f = d(), h = this._easingFunction(f); + if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, h), this._onUpdateCallback && this._onUpdateCallback(this._object, f), this._duration === 0 || s >= this._duration) + if (this._repeat > 0) { + var p = Math.min(Math.trunc((s - this._duration) / c) + 1, this._repeat); + isFinite(this._repeat) && (this._repeat -= p); + for (o in this._valuesStartRepeat) + !this._yoyo && typeof this._valuesEnd[o] == "string" && (this._valuesStartRepeat[o] = // eslint-disable-next-line + // @ts-ignore FIXME? + this._valuesStartRepeat[o] + parseFloat(this._valuesEnd[o])), this._yoyo && this._swapEndStartRepeatValues(o), this._valuesStart[o] = this._valuesStartRepeat[o]; + return this._yoyo && (this._reversed = !this._reversed), this._startTime += c * p, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0; + } else { + this._onCompleteCallback && this._onCompleteCallback(this._object); + for (var m = 0, _ = this._chainedTweens.length; m < _; m++) + this._chainedTweens[m].start(this._startTime + this._duration, !1); + return this._isPlaying = !1, !1; + } + return !0; + }, e.prototype._updateProperties = function(t, n, i, r) { + for (var o in i) + if (n[o] !== void 0) { + var s = n[o] || 0, c = i[o], l = Array.isArray(t[o]), d = Array.isArray(c), f = !l && d; + f ? t[o] = this._interpolationFunction(c, r) : typeof c == "object" && c ? this._updateProperties(t[o], s, c, r) : (c = this._handleRelativeValue(s, c), typeof c == "number" && (t[o] = s + (c - s) * r)); + } + }, e.prototype._handleRelativeValue = function(t, n) { + return typeof n != "string" ? n : n.charAt(0) === "+" || n.charAt(0) === "-" ? t + parseFloat(n) : parseFloat(n); + }, e.prototype._swapEndStartRepeatValues = function(t) { + var n = this._valuesStartRepeat[t], i = this._valuesEnd[t]; + typeof i == "string" ? this._valuesStartRepeat[t] = this._valuesStartRepeat[t] + parseFloat(i) : this._valuesStartRepeat[t] = this._valuesEnd[t], this._valuesEnd[t] = n; + }, e.autoStartOnUpdate = !1, e; + }() +), TWEEN = mainGroup; +TWEEN.getAll.bind(TWEEN); +TWEEN.removeAll.bind(TWEEN); +TWEEN.add.bind(TWEEN); +TWEEN.remove.bind(TWEEN); +TWEEN.update.bind(TWEEN); +const EasingFunction = { + /** + * Linear easing. + * + * @type {EasingFunction.Callback} + * @constant + */ + LINEAR_NONE: Easing.Linear.None, + /** + * Quadratic in. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUADRATIC_IN: Easing.Quadratic.In, + /** + * Quadratic out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUADRATIC_OUT: Easing.Quadratic.Out, + /** + * Quadratic in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUADRATIC_IN_OUT: Easing.Quadratic.InOut, + /** + * Cubic in. + * + * @type {EasingFunction.Callback} + * @constant + */ + CUBIC_IN: Easing.Cubic.In, + /** + * Cubic out. + * + * @type {EasingFunction.Callback} + * @constant + */ + CUBIC_OUT: Easing.Cubic.Out, + /** + * Cubic in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + CUBIC_IN_OUT: Easing.Cubic.InOut, + /** + * Quartic in. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUARTIC_IN: Easing.Quartic.In, + /** + * Quartic out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUARTIC_OUT: Easing.Quartic.Out, + /** + * Quartic in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUARTIC_IN_OUT: Easing.Quartic.InOut, + /** + * Quintic in. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUINTIC_IN: Easing.Quintic.In, + /** + * Quintic out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUINTIC_OUT: Easing.Quintic.Out, + /** + * Quintic in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + QUINTIC_IN_OUT: Easing.Quintic.InOut, + /** + * Sinusoidal in. + * + * @type {EasingFunction.Callback} + * @constant + */ + SINUSOIDAL_IN: Easing.Sinusoidal.In, + /** + * Sinusoidal out. + * + * @type {EasingFunction.Callback} + * @constant + */ + SINUSOIDAL_OUT: Easing.Sinusoidal.Out, + /** + * Sinusoidal in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + SINUSOIDAL_IN_OUT: Easing.Sinusoidal.InOut, + /** + * Exponential in. + * + * @type {EasingFunction.Callback} + * @constant + */ + EXPONENTIAL_IN: Easing.Exponential.In, + /** + * Exponential out. + * + * @type {EasingFunction.Callback} + * @constant + */ + EXPONENTIAL_OUT: Easing.Exponential.Out, + /** + * Exponential in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + EXPONENTIAL_IN_OUT: Easing.Exponential.InOut, + /** + * Circular in. + * + * @type {EasingFunction.Callback} + * @constant + */ + CIRCULAR_IN: Easing.Circular.In, + /** + * Circular out. + * + * @type {EasingFunction.Callback} + * @constant + */ + CIRCULAR_OUT: Easing.Circular.Out, + /** + * Circular in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + CIRCULAR_IN_OUT: Easing.Circular.InOut, + /** + * Elastic in. + * + * @type {EasingFunction.Callback} + * @constant + */ + ELASTIC_IN: Easing.Elastic.In, + /** + * Elastic out. + * + * @type {EasingFunction.Callback} + * @constant + */ + ELASTIC_OUT: Easing.Elastic.Out, + /** + * Elastic in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + ELASTIC_IN_OUT: Easing.Elastic.InOut, + /** + * Back in. + * + * @type {EasingFunction.Callback} + * @constant + */ + BACK_IN: Easing.Back.In, + /** + * Back out. + * + * @type {EasingFunction.Callback} + * @constant + */ + BACK_OUT: Easing.Back.Out, + /** + * Back in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + BACK_IN_OUT: Easing.Back.InOut, + /** + * Bounce in. + * + * @type {EasingFunction.Callback} + * @constant + */ + BOUNCE_IN: Easing.Bounce.In, + /** + * Bounce out. + * + * @type {EasingFunction.Callback} + * @constant + */ + BOUNCE_OUT: Easing.Bounce.Out, + /** + * Bounce in then out. + * + * @type {EasingFunction.Callback} + * @constant + */ + BOUNCE_IN_OUT: Easing.Bounce.InOut +}, EasingFunction$1 = Object.freeze(EasingFunction); +function KmlTourFlyTo(e, t, n) { + this.type = "KmlTourFlyTo", this.blocking = !0, this.activeCamera = null, this.activeCallback = null, this.duration = e, this.view = n, this.flyToMode = t; +} +KmlTourFlyTo.prototype.play = function(e, t, n) { + if (this.activeCamera = t, defined(e) && e !== null) { + const r = this; + this.activeCallback = function(o) { + delete r.activeCallback, delete r.activeCamera, e(defined(o) ? !1 : o); + }; + } + const i = this.getCameraOptions(n); + if (this.view.headingPitchRoll) + t.flyTo(i); + else if (this.view.headingPitchRange) { + const r = new BoundingSphere(this.view.position); + t.flyToBoundingSphere(r, i); + } +}; +KmlTourFlyTo.prototype.stop = function() { + defined(this.activeCamera) && this.activeCamera.cancelFlight(), defined(this.activeCallback) && this.activeCallback(!0); +}; +KmlTourFlyTo.prototype.getCameraOptions = function(e) { + let t = { + duration: this.duration + }; + return defined(this.activeCallback) && (t.complete = this.activeCallback), this.flyToMode === "smooth" && (t.easingFunction = EasingFunction$1.LINEAR_NONE), this.view.headingPitchRoll ? (t.destination = this.view.position, t.orientation = this.view.headingPitchRoll) : this.view.headingPitchRange && (t.offset = this.view.headingPitchRange), defined(e) && (t = combine$2(t, e)), t; +}; +function KmlTourWait(e) { + this.type = "KmlTourWait", this.blocking = !0, this.duration = e, this.timeout = null; +} +KmlTourWait.prototype.play = function(e) { + const t = this; + this.activeCallback = e, this.timeout = setTimeout(function() { + delete t.activeCallback, e(!1); + }, this.duration * 1e3); +}; +KmlTourWait.prototype.stop = function() { + clearTimeout(this.timeout), defined(this.activeCallback) && this.activeCallback(!0); +}; +const MimeTypes = { + avi: "video/x-msvideo", + bmp: "image/bmp", + bz2: "application/x-bzip2", + chm: "application/vnd.ms-htmlhelp", + css: "text/css", + csv: "text/csv", + doc: "application/msword", + dvi: "application/x-dvi", + eps: "application/postscript", + flv: "video/x-flv", + gif: "image/gif", + gz: "application/x-gzip", + htm: "text/html", + html: "text/html", + ico: "image/vnd.microsoft.icon", + jnlp: "application/x-java-jnlp-file", + jpeg: "image/jpeg", + jpg: "image/jpeg", + m3u: "audio/x-mpegurl", + m4v: "video/mp4", + mathml: "application/mathml+xml", + mid: "audio/midi", + midi: "audio/midi", + mov: "video/quicktime", + mp3: "audio/mpeg", + mp4: "video/mp4", + mp4v: "video/mp4", + mpeg: "video/mpeg", + mpg: "video/mpeg", + odp: "application/vnd.oasis.opendocument.presentation", + ods: "application/vnd.oasis.opendocument.spreadsheet", + odt: "application/vnd.oasis.opendocument.text", + ogg: "application/ogg", + pdf: "application/pdf", + png: "image/png", + pps: "application/vnd.ms-powerpoint", + ppt: "application/vnd.ms-powerpoint", + ps: "application/postscript", + qt: "video/quicktime", + rdf: "application/rdf+xml", + rss: "application/rss+xml", + rtf: "application/rtf", + svg: "image/svg+xml", + swf: "application/x-shockwave-flash", + text: "text/plain", + tif: "image/tiff", + tiff: "image/tiff", + txt: "text/plain", + wav: "audio/x-wav", + wma: "audio/x-ms-wma", + wmv: "video/x-ms-wmv", + xml: "application/xml", + zip: "application/zip", + detectFromFilename: function(e) { + let t = e.toLowerCase(); + return t = getExtensionFromUri(t), MimeTypes[t]; + } +}; +let parser; +typeof DOMParser < "u" && (parser = new DOMParser()); +const autolinker = new Autolinker({ + stripPrefix: !1, + email: !1, + replaceFn: function(e) { + return e.urlMatchType === "scheme" || e.urlMatchType === "www"; + } +}), BILLBOARD_SIZE$1 = 32, BILLBOARD_NEAR_DISTANCE = 2414016, BILLBOARD_NEAR_RATIO = 1, BILLBOARD_FAR_DISTANCE = 16093e3, BILLBOARD_FAR_RATIO = 0.1, kmlNamespaces = [ + null, + void 0, + "http://www.opengis.net/kml/2.2", + "http://earth.google.com/kml/2.2", + "http://earth.google.com/kml/2.1", + "http://earth.google.com/kml/2.0" +], gxNamespaces = ["http://www.google.com/kml/ext/2.2"], atomNamespaces = ["http://www.w3.org/2005/Atom"], namespaces = { + kml: kmlNamespaces, + gx: gxNamespaces, + atom: atomNamespaces, + kmlgx: kmlNamespaces.concat(gxNamespaces) +}, featureTypes = { + Document: processDocument, + Folder: processFolder, + Placemark: processPlacemark, + NetworkLink: processNetworkLink, + GroundOverlay: processGroundOverlay, + PhotoOverlay: processUnsupportedFeature, + ScreenOverlay: processScreenOverlay, + Tour: processTour +}; +function DeferredLoading(e) { + this._dataSource = e, this._deferred = defer(), this._stack = [], this._promises = [], this._timeoutSet = !1, this._used = !1, this._started = 0, this._timeThreshold = 1e3; +} +Object.defineProperties(DeferredLoading.prototype, { + dataSource: { + get: function() { + return this._dataSource; + } + } +}); +DeferredLoading.prototype.addNodes = function(e, t) { + this._stack.push({ + nodes: e, + index: 0, + processingData: t + }), this._used = !0; +}; +DeferredLoading.prototype.addPromise = function(e) { + this._promises.push(e); +}; +DeferredLoading.prototype.wait = function() { + const e = this._deferred; + return this._used || e.resolve(), Promise.all([e.promise, Promise.all(this._promises)]); +}; +DeferredLoading.prototype.process = function() { + const e = this._stack.length === 1; + return e && (this._started = KmlDataSource._getTimestamp()), this._process(e); +}; +DeferredLoading.prototype._giveUpTime = function() { + if (this._timeoutSet) + return; + this._timeoutSet = !0, this._timeThreshold = 50; + const e = this; + setTimeout(function() { + e._timeoutSet = !1, e._started = KmlDataSource._getTimestamp(), e._process(!0); + }, 0); +}; +DeferredLoading.prototype._nextNode = function() { + const e = this._stack, t = e[e.length - 1], n = t.index, i = t.nodes; + if (n !== i.length) + return ++t.index, i[n]; +}; +DeferredLoading.prototype._pop = function() { + const e = this._stack; + return e.pop(), e.length === 0 ? (this._deferred.resolve(), !1) : !0; +}; +DeferredLoading.prototype._process = function(e) { + const t = this.dataSource, n = this._stack[this._stack.length - 1].processingData; + let i = this._nextNode(); + for (; defined(i); ) { + const r = featureTypes[i.localName]; + if (defined(r) && (namespaces.kml.indexOf(i.namespaceURI) !== -1 || namespaces.gx.indexOf(i.namespaceURI) !== -1) && (r(t, i, n, this), this._timeoutSet || KmlDataSource._getTimestamp() > this._started + this._timeThreshold)) { + this._giveUpTime(); + return; + } + i = this._nextNode(); + } + this._pop() && e && this._process(!0); +}; +function isZipFile(e) { + const t = e.slice(0, Math.min(4, e.size)), n = defer(), i = new FileReader(); + return i.addEventListener("load", function() { + n.resolve( + new DataView(i.result).getUint32(0, !1) === 1347093252 + ); + }), i.addEventListener("error", function() { + n.reject(i.error); + }), i.readAsArrayBuffer(t), n.promise; +} +function readBlobAsText(e) { + const t = defer(), n = new FileReader(); + return n.addEventListener("load", function() { + t.resolve(n.result); + }), n.addEventListener("error", function() { + t.reject(n.error); + }), n.readAsText(e), t.promise; +} +function insertNamespaces(e) { + const t = { + xsi: "http://www.w3.org/2001/XMLSchema-instance" + }; + let n, i, r, o; + for (const s in t) + t.hasOwnProperty(s) && (r = RegExp(`[< ]${s}:`), o = `xmlns:${s}=`, r.test(e) && e.indexOf(o) === -1 && (defined(n) || (n = e.substr(0, e.indexOf("", t); + let i, r, o; + for (; t !== -1 && t < n; ) + i = e.slice(t, e.indexOf('"', t)), r = t, t = e.indexOf(i, t + 1), t !== -1 ? (o = e.indexOf('"', e.indexOf('"', t) + 1), e = e.slice(0, t - 1) + e.slice(o + 1, e.length), t = e.indexOf("xmlns:", r - 1)) : t = e.indexOf("xmlns:", r + 1); + return e; +} +function loadXmlFromZip(e, t) { + return Promise.resolve(e.getData(new TextWriter())).then(function(n) { + n = insertNamespaces(n), n = removeDuplicateNamespaces(n), t.kml = parser.parseFromString(n, "application/xml"); + }); +} +function loadDataUriFromZip(e, t) { + const n = defaultValue( + MimeTypes.detectFromFilename(e.filename), + "application/octet-stream" + ); + return Promise.resolve(e.getData(new Data64URIWriter(n))).then( + function(i) { + t[e.filename] = i; + } + ); +} +function embedDataUris(e, t, n, i) { + const r = i.keys, o = new Uri("."), s = e.querySelectorAll(t); + for (let c = 0; c < s.length; c++) { + const l = s[c], d = l.getAttribute(n); + if (defined(d)) { + const h = new Uri(d).absoluteTo(o).toString(), p = r.indexOf(h); + if (p !== -1) { + const m = r[p]; + l.setAttribute(n, i[m]), t === "a" && l.getAttribute("download") === null && l.setAttribute("download", m); + } + } + } +} +function applyBasePath(e, t, n, i) { + const r = e.querySelectorAll(t); + for (let o = 0; o < r.length; o++) { + const s = r[o], c = s.getAttribute(n), l = resolveHref(c, i); + defined(l) && s.setAttribute(n, l.url); + } +} +function createEntity(e, t, n) { + let i = queryStringAttribute(e, "id"); + i = defined(i) && i.length !== 0 ? i : createGuid(), defined(n) && (i = n + i); + let r = t.getById(i); + return defined(r) && (i = createGuid(), defined(n) && (i = n + i)), r = t.add(new Entity({ id: i })), defined(r.kml) || (r.addProperty("kml"), r.kml = new KmlFeatureData()), r; +} +function isExtrudable(e, t) { + return e === "absolute" || e === "relativeToGround" || t === "relativeToSeaFloor"; +} +function readCoordinate(e, t) { + if (!defined(e)) + return Cartesian3.fromDegrees(0, 0, 0, t); + const n = e.match(/[^\s,\n]+/g); + if (!defined(n)) + return Cartesian3.fromDegrees(0, 0, 0, t); + let i = parseFloat(n[0]), r = parseFloat(n[1]), o = parseFloat(n[2]); + return i = isNaN(i) ? 0 : i, r = isNaN(r) ? 0 : r, o = isNaN(o) ? 0 : o, Cartesian3.fromDegrees(i, r, o, t); +} +function readCoordinates(e, t) { + if (!defined(e)) + return; + const n = e.textContent.match(/[^\s\n]+/g); + if (!defined(n)) + return; + const i = n.length, r = new Array(i); + let o = 0; + for (let s = 0; s < i; s++) + r[o++] = readCoordinate(n[s], t); + return r; +} +function queryNumericAttribute(e, t) { + if (!defined(e)) + return; + const n = e.getAttribute(t); + if (n !== null) { + const i = parseFloat(n); + return isNaN(i) ? void 0 : i; + } +} +function queryStringAttribute(e, t) { + if (!defined(e)) + return; + const n = e.getAttribute(t); + return n !== null ? n : void 0; +} +function queryFirstNode(e, t, n) { + if (!defined(e)) + return; + const i = e.childNodes, r = i.length; + for (let o = 0; o < r; o++) { + const s = i[o]; + if (s.localName === t && n.indexOf(s.namespaceURI) !== -1) + return s; + } +} +function queryNodes(e, t, n) { + if (!defined(e)) + return; + const i = [], r = e.getElementsByTagNameNS("*", t), o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s]; + c.localName === t && n.indexOf(c.namespaceURI) !== -1 && i.push(c); + } + return i; +} +function queryChildNodes(e, t, n) { + if (!defined(e)) + return []; + const i = [], r = e.childNodes, o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s]; + c.localName === t && n.indexOf(c.namespaceURI) !== -1 && i.push(c); + } + return i; +} +function queryNumericValue(e, t, n) { + const i = queryFirstNode(e, t, n); + if (defined(i)) { + const r = parseFloat(i.textContent); + return isNaN(r) ? void 0 : r; + } +} +function queryStringValue(e, t, n) { + const i = queryFirstNode(e, t, n); + if (defined(i)) + return i.textContent.trim(); +} +function queryBooleanValue(e, t, n) { + const i = queryFirstNode(e, t, n); + if (defined(i)) { + const r = i.textContent.trim(); + return r === "1" || /^true$/i.test(r); + } +} +function resolveHref(e, t, n) { + if (!defined(e)) + return; + let i; + if (defined(n)) { + e = e.replace(/\\/g, "/"); + let r = n[e]; + if (defined(r)) + i = new Resource({ + url: r + }); + else { + const o = new Uri(t.getUrlComponent()), s = new Uri(e); + r = n[s.absoluteTo(o)], defined(r) && (i = new Resource({ + url: r + })); + } + } + return defined(i) || (i = t.getDerivedResource({ + url: e + })), i; +} +const colorOptions = { + maximumRed: void 0, + red: void 0, + maximumGreen: void 0, + green: void 0, + maximumBlue: void 0, + blue: void 0 +}; +function parseColorString(e, t) { + if (!defined(e) || /^\s*$/gm.test(e)) + return; + e[0] === "#" && (e = e.substring(1)); + const n = parseInt(e.substring(0, 2), 16) / 255, i = parseInt(e.substring(2, 4), 16) / 255, r = parseInt(e.substring(4, 6), 16) / 255, o = parseInt(e.substring(6, 8), 16) / 255; + return t ? (o > 0 ? (colorOptions.maximumRed = o, colorOptions.red = void 0) : (colorOptions.maximumRed = void 0, colorOptions.red = 0), r > 0 ? (colorOptions.maximumGreen = r, colorOptions.green = void 0) : (colorOptions.maximumGreen = void 0, colorOptions.green = 0), i > 0 ? (colorOptions.maximumBlue = i, colorOptions.blue = void 0) : (colorOptions.maximumBlue = void 0, colorOptions.blue = 0), colorOptions.alpha = n, Color.fromRandom(colorOptions)) : new Color(o, r, i, n); +} +function queryColorValue(e, t, n) { + const i = queryStringValue(e, t, n); + if (defined(i)) + return parseColorString( + i, + queryStringValue(e, "colorMode", n) === "random" + ); +} +function processTimeStamp(e) { + const t = queryFirstNode(e, "TimeStamp", namespaces.kmlgx), n = queryStringValue(t, "when", namespaces.kmlgx); + if (!defined(t) || !defined(n) || n.length === 0) + return; + const i = JulianDate.fromIso8601(n), r = new TimeIntervalCollection(); + return r.addInterval( + new TimeInterval({ + start: i, + stop: Iso8601.MAXIMUM_VALUE + }) + ), r; +} +function processTimeSpan(e) { + const t = queryFirstNode(e, "TimeSpan", namespaces.kmlgx); + if (!defined(t)) + return; + let n; + const i = queryFirstNode(t, "begin", namespaces.kmlgx); + let r = defined(i) ? JulianDate.fromIso8601(i.textContent) : void 0; + const o = queryFirstNode(t, "end", namespaces.kmlgx); + let s = defined(o) ? JulianDate.fromIso8601(o.textContent) : void 0; + if (defined(r) && defined(s)) { + if (JulianDate.lessThan(s, r)) { + const c = r; + r = s, s = c; + } + n = new TimeIntervalCollection(), n.addInterval( + new TimeInterval({ + start: r, + stop: s + }) + ); + } else defined(r) ? (n = new TimeIntervalCollection(), n.addInterval( + new TimeInterval({ + start: r, + stop: Iso8601.MAXIMUM_VALUE + }) + )) : defined(s) && (n = new TimeIntervalCollection(), n.addInterval( + new TimeInterval({ + start: Iso8601.MINIMUM_VALUE, + stop: s + }) + )); + return n; +} +function createDefaultBillboard() { + const e = new BillboardGraphics(); + return e.width = BILLBOARD_SIZE$1, e.height = BILLBOARD_SIZE$1, e.scaleByDistance = new NearFarScalar( + BILLBOARD_NEAR_DISTANCE, + BILLBOARD_NEAR_RATIO, + BILLBOARD_FAR_DISTANCE, + BILLBOARD_FAR_RATIO + ), e.pixelOffsetScaleByDistance = new NearFarScalar( + BILLBOARD_NEAR_DISTANCE, + BILLBOARD_NEAR_RATIO, + BILLBOARD_FAR_DISTANCE, + BILLBOARD_FAR_RATIO + ), e; +} +function createDefaultPolygon() { + const e = new PolygonGraphics(); + return e.outline = !0, e.outlineColor = Color.WHITE, e; +} +function createDefaultLabel() { + const e = new LabelGraphics(); + return e.translucencyByDistance = new NearFarScalar(3e6, 1, 5e6, 0), e.pixelOffset = new Cartesian2(17, 0), e.horizontalOrigin = HorizontalOrigin$1.LEFT, e.font = "16px sans-serif", e.style = LabelStyle$1.FILL_AND_OUTLINE, e; +} +function getIconHref(e, t, n, i, r) { + let o = queryStringValue(e, "href", namespaces.kml); + if (!defined(o) || o.length === 0) + return; + if (o.indexOf("root://icons/palette-") === 0) { + const c = o.charAt(21); + let l = defaultValue(queryNumericValue(e, "x", namespaces.gx), 0), d = defaultValue(queryNumericValue(e, "y", namespaces.gx), 0); + l = Math.min(l / 32, 7), d = 7 - Math.min(d / 32, 7); + const f = 8 * d + l; + o = `https://maps.google.com/mapfiles/kml/pal${c}/icon${f}.png`; + } + const s = resolveHref(o, n, i); + if (r) { + const c = queryStringValue( + e, + "refreshMode", + namespaces.kml + ), l = queryStringValue( + e, + "viewRefreshMode", + namespaces.kml + ); + c === "onInterval" || c === "onExpire" ? oneTimeWarning( + `kml-refreshMode-${c}`, + `KML - Unsupported Icon refreshMode: ${c}` + ) : (l === "onStop" || l === "onRegion") && oneTimeWarning( + `kml-refreshMode-${l}`, + `KML - Unsupported Icon viewRefreshMode: ${l}` + ); + const d = defaultValue( + queryStringValue(e, "viewBoundScale", namespaces.kml), + 1 + ), f = l === "onStop" ? "BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]" : "", h = defaultValue( + queryStringValue(e, "viewFormat", namespaces.kml), + f + ), p = queryStringValue(e, "httpQuery", namespaces.kml); + defined(h) && s.setQueryParameters(queryToObject(cleanupString(h))), defined(p) && s.setQueryParameters(queryToObject(cleanupString(p))); + const m = t._ellipsoid; + return processNetworkLinkQueryString( + s, + t.camera, + t.canvas, + d, + t._lastCameraView.bbox, + m + ), s; + } + return s; +} +function processBillboardIcon(e, t, n, i, r) { + let o = queryNumericValue(t, "scale", namespaces.kml); + const s = queryNumericValue(t, "heading", namespaces.kml), c = queryColorValue(t, "color", namespaces.kml), l = queryFirstNode(t, "Icon", namespaces.kml); + let d = getIconHref( + l, + e, + i, + r, + !1 + ); + defined(l) && !defined(d) && (d = !1); + const f = queryNumericValue(l, "x", namespaces.gx), h = queryNumericValue(l, "y", namespaces.gx), p = queryNumericValue(l, "w", namespaces.gx), m = queryNumericValue(l, "h", namespaces.gx), _ = queryFirstNode(t, "hotSpot", namespaces.kml), y = queryNumericAttribute(_, "x"), C = queryNumericAttribute(_, "y"), T = queryStringAttribute(_, "xunits"), x = queryStringAttribute(_, "yunits"); + let b = n.billboard; + defined(b) || (b = createDefaultBillboard(), n.billboard = b), b.image = d, b.scale = o, b.color = c, (defined(f) || defined(h) || defined(p) || defined(m)) && (b.imageSubRegion = new BoundingRectangle(f, h, p, m)), defined(s) && s !== 0 && (b.rotation = CesiumMath.toRadians(-s), b.alignedAxis = Cartesian3.UNIT_Z), o = defaultValue(o, 1); + let S, E; + defined(y) && (T === "pixels" ? S = -y * o : T === "insetPixels" ? S = (y - BILLBOARD_SIZE$1) * o : T === "fraction" && (S = -y * BILLBOARD_SIZE$1 * o), S += BILLBOARD_SIZE$1 * 0.5 * o), defined(C) && (x === "pixels" ? E = C * o : x === "insetPixels" ? E = (-C + BILLBOARD_SIZE$1) * o : x === "fraction" && (E = C * BILLBOARD_SIZE$1 * o), E -= BILLBOARD_SIZE$1 * 0.5 * o), (defined(S) || defined(E)) && (b.pixelOffset = new Cartesian2(S, E)); +} +function applyStyle(e, t, n, i, r) { + for (let o = 0, s = t.childNodes.length; o < s; o++) { + const c = t.childNodes.item(o); + if (c.localName === "IconStyle") + processBillboardIcon( + e, + c, + n, + i, + r + ); + else if (c.localName === "LabelStyle") { + let l = n.label; + defined(l) || (l = createDefaultLabel(), n.label = l), l.scale = defaultValue( + queryNumericValue(c, "scale", namespaces.kml), + l.scale + ), l.fillColor = defaultValue( + queryColorValue(c, "color", namespaces.kml), + l.fillColor + ), l.text = n.name; + } else if (c.localName === "LineStyle") { + let l = n.polyline; + defined(l) || (l = new PolylineGraphics(), n.polyline = l), l.width = queryNumericValue(c, "width", namespaces.kml), l.material = queryColorValue(c, "color", namespaces.kml), defined(queryColorValue(c, "outerColor", namespaces.gx)) && oneTimeWarning( + "kml-gx:outerColor", + "KML - gx:outerColor is not supported in a LineStyle" + ), defined(queryNumericValue(c, "outerWidth", namespaces.gx)) && oneTimeWarning( + "kml-gx:outerWidth", + "KML - gx:outerWidth is not supported in a LineStyle" + ), defined(queryNumericValue(c, "physicalWidth", namespaces.gx)) && oneTimeWarning( + "kml-gx:physicalWidth", + "KML - gx:physicalWidth is not supported in a LineStyle" + ), defined(queryBooleanValue(c, "labelVisibility", namespaces.gx)) && oneTimeWarning( + "kml-gx:labelVisibility", + "KML - gx:labelVisibility is not supported in a LineStyle" + ); + } else if (c.localName === "PolyStyle") { + let l = n.polygon; + defined(l) || (l = createDefaultPolygon(), n.polygon = l), l.material = defaultValue( + queryColorValue(c, "color", namespaces.kml), + l.material + ), l.fill = defaultValue( + queryBooleanValue(c, "fill", namespaces.kml), + l.fill + ), l.outline = defaultValue( + queryBooleanValue(c, "outline", namespaces.kml), + l.outline + ); + } else if (c.localName === "BalloonStyle") { + const l = defaultValue( + parseColorString(queryStringValue(c, "bgColor", namespaces.kml)), + Color.WHITE + ), d = defaultValue( + parseColorString(queryStringValue(c, "textColor", namespaces.kml)), + Color.BLACK + ), f = queryStringValue(c, "text", namespaces.kml); + n.addProperty("balloonStyle"), n.balloonStyle = { + bgColor: l, + textColor: d, + text: f + }; + } else if (c.localName === "ListStyle") { + const l = queryStringValue( + c, + "listItemType", + namespaces.kml + ); + (l === "radioFolder" || l === "checkOffOnly") && oneTimeWarning( + `kml-listStyle-${l}`, + `KML - Unsupported ListStyle with listItemType: ${l}` + ); + } + } +} +function computeFinalStyle(e, t, n, i, r) { + const o = new Entity(); + let s, c = -1; + const l = t.childNodes, d = l.length; + for (let h = 0; h < d; h++) { + const p = l[h]; + (p.localName === "Style" || p.localName === "StyleMap") && (c = h); + } + if (c !== -1) { + const h = l[c]; + if (h.localName === "Style") + applyStyle( + e, + h, + o, + i, + r + ); + else { + const p = queryChildNodes(h, "Pair", namespaces.kml); + for (let m = 0; m < p.length; m++) { + const _ = p[m], y = queryStringValue(_, "key", namespaces.kml); + if (y === "normal") { + const C = queryStringValue(_, "styleUrl", namespaces.kml); + if (defined(C)) + s = n.getById(C), defined(s) || (s = n.getById(`#${C}`)), defined(s) && o.merge(s); + else { + const T = queryFirstNode(_, "Style", namespaces.kml); + applyStyle(e, T, o, i, r); + } + } else + oneTimeWarning( + `kml-styleMap-${y}`, + `KML - Unsupported StyleMap key: ${y}` + ); + } + } + } + const f = queryStringValue(t, "styleUrl", namespaces.kml); + if (defined(f)) { + let h = f; + if (f[0] !== "#" && f.indexOf("#") !== -1) { + const p = f.split("#"), m = p[0]; + h = `${i.getDerivedResource({ + url: m + }).getUrlComponent()}#${p[1]}`; + } + s = n.getById(h), defined(s) || (s = n.getById(`#${h}`)), defined(s) && o.merge(s); + } + return o; +} +function processExternalStyles(e, t, n) { + return t.fetchXML().then(function(i) { + return processStyles(e, i, n, t, !0); + }); +} +function processStyles(e, t, n, i, r, o) { + let s, c, l, d; + const f = queryNodes(t, "Style", namespaces.kml); + if (defined(f)) { + const y = f.length; + for (s = 0; s < y; s++) + d = f[s], c = queryStringAttribute(d, "id"), defined(c) && (c = `#${c}`, r && defined(i) && (c = i.getUrlComponent() + c), defined(n.getById(c)) || (l = new Entity({ + id: c + }), n.add(l), applyStyle( + e, + d, + l, + i, + o + ))); + } + const h = queryNodes(t, "StyleMap", namespaces.kml); + if (defined(h)) { + const y = h.length; + for (s = 0; s < y; s++) { + const C = h[s]; + if (c = queryStringAttribute(C, "id"), defined(c)) { + const T = queryChildNodes(C, "Pair", namespaces.kml); + for (let x = 0; x < T.length; x++) { + const b = T[x], S = queryStringValue(b, "key", namespaces.kml); + if (S === "normal") { + if (c = `#${c}`, r && defined(i) && (c = i.getUrlComponent() + c), !defined(n.getById(c))) { + l = n.getOrCreateEntity(c); + let E = queryStringValue(b, "styleUrl", namespaces.kml); + if (defined(E)) { + E[0] !== "#" && (E = `#${E}`), r && defined(i) && (E = i.getUrlComponent() + E); + const A = n.getById(E); + defined(A) && l.merge(A); + } else + d = queryFirstNode(b, "Style", namespaces.kml), applyStyle( + e, + d, + l, + i, + o + ); + } + } else + oneTimeWarning( + `kml-styleMap-${S}`, + `KML - Unsupported StyleMap key: ${S}` + ); + } + } + } + } + const p = [], m = t.getElementsByTagName("styleUrl"), _ = m.length; + for (s = 0; s < _; s++) { + const y = m[s].textContent; + if (y[0] !== "#") { + const C = y.split("#"); + if (C.length === 2) { + const T = C[0], x = i.getDerivedResource({ + url: T + }); + p.push( + processExternalStyles(e, x, n) + ); + } + } + } + return p; +} +function createDropLine(e, t, n) { + const i = new ReferenceProperty(e, t.id, [ + "position" + ]), r = new ScaledPositionProperty(t.position); + t.polyline = defined(n.polyline) ? n.polyline.clone() : new PolylineGraphics(), t.polyline.positions = new PositionPropertyArray([ + i, + r + ]); +} +function heightReferenceFromAltitudeMode(e, t) { + return !defined(e) && !defined(t) || e === "clampToGround" ? HeightReference$1.CLAMP_TO_GROUND : e === "relativeToGround" ? HeightReference$1.RELATIVE_TO_GROUND : e === "absolute" ? HeightReference$1.NONE : t === "clampToSeaFloor" ? (oneTimeWarning( + "kml-gx:altitudeMode-clampToSeaFloor", + "KML - :clampToSeaFloor is currently not supported, using :clampToGround." + ), HeightReference$1.CLAMP_TO_GROUND) : t === "relativeToSeaFloor" ? (oneTimeWarning( + "kml-gx:altitudeMode-relativeToSeaFloor", + "KML - :relativeToSeaFloor is currently not supported, using :relativeToGround." + ), HeightReference$1.RELATIVE_TO_GROUND) : (defined(e) ? oneTimeWarning( + "kml-altitudeMode-unknown", + `KML - Unknown :${e}, using :CLAMP_TO_GROUND.` + ) : oneTimeWarning( + "kml-gx:altitudeMode-unknown", + `KML - Unknown :${t}, using :CLAMP_TO_GROUND.` + ), HeightReference$1.CLAMP_TO_GROUND); +} +function createPositionPropertyFromAltitudeMode(e, t, n) { + return n === "relativeToSeaFloor" || t === "absolute" || t === "relativeToGround" ? e : ((defined(t) && t !== "clampToGround" || // + defined(n) && n !== "clampToSeaFloor") && oneTimeWarning( + "kml-altitudeMode-unknown", + `KML - Unknown altitudeMode: ${defaultValue( + t, + n + )}` + ), new ScaledPositionProperty(e)); +} +function createPositionPropertyArrayFromAltitudeMode(e, t, n, i) { + if (!defined(e)) + return; + if (n === "relativeToSeaFloor" || t === "absolute" || t === "relativeToGround") + return e; + (defined(t) && t !== "clampToGround" || // + defined(n) && n !== "clampToSeaFloor") && oneTimeWarning( + "kml-altitudeMode-unknown", + `KML - Unknown altitudeMode: ${defaultValue( + t, + n + )}` + ); + const r = e.length; + for (let o = 0; o < r; o++) { + const s = e[o]; + i.scaleToGeodeticSurface(s, s); + } + return e; +} +function processPositionGraphics(e, t, n, i) { + let r = t.label; + defined(r) || (r = defined(n.label) ? n.label.clone() : createDefaultLabel(), t.label = r), r.text = t.name; + let o = t.billboard; + defined(o) || (o = defined(n.billboard) ? n.billboard.clone() : createDefaultBillboard(), t.billboard = o), defined(o.image) ? o.image.getValue() || (o.image = void 0) : o.image = e._pinBuilder.fromColor(Color.YELLOW, 64); + let s = 1; + defined(o.scale) && (s = o.scale.getValue(), s !== 0 ? r.pixelOffset = new Cartesian2(s * 16 + 1, 0) : (r.pixelOffset = void 0, r.horizontalOrigin = void 0)), defined(i) && e._clampToGround && (o.heightReference = i, r.heightReference = i); +} +function processPathGraphics(e, t) { + let n = e.path; + defined(n) || (n = new PathGraphics(), n.leadTime = 0, e.path = n); + const i = t.polyline; + defined(i) && (n.material = i.material, n.width = i.width); +} +function processPoint(e, t, n, i, r) { + const o = queryStringValue( + n, + "coordinates", + namespaces.kml + ), s = queryStringValue( + n, + "altitudeMode", + namespaces.kml + ), c = queryStringValue( + n, + "altitudeMode", + namespaces.gx + ), l = queryBooleanValue(n, "extrude", namespaces.kml), d = e._ellipsoid, f = readCoordinate(o, d); + return i.position = f, processPositionGraphics( + e, + i, + r, + heightReferenceFromAltitudeMode(s, c) + ), l && isExtrudable(s, c) && createDropLine(t, i, r), !0; +} +function processLineStringOrLinearRing(e, t, n, i, r) { + const o = queryFirstNode( + n, + "coordinates", + namespaces.kml + ), s = queryStringValue( + n, + "altitudeMode", + namespaces.kml + ), c = queryStringValue( + n, + "altitudeMode", + namespaces.gx + ), l = queryBooleanValue(n, "extrude", namespaces.kml), d = queryBooleanValue( + n, + "tessellate", + namespaces.kml + ), f = isExtrudable(s, c), h = queryNumericValue(n, "drawOrder", namespaces.gx), p = e._ellipsoid, m = readCoordinates(o, p); + let _ = r.polyline; + if (f && l) { + const y = new WallGraphics(); + i.wall = y, y.positions = m; + const C = r.polygon; + defined(C) && (y.fill = C.fill, y.material = C.material), y.outline = !0, defined(_) ? (y.outlineColor = defined(_.material) ? _.material.color : Color.WHITE, y.outlineWidth = _.width) : defined(C) && (y.outlineColor = defined(C.material) ? C.material.color : Color.WHITE); + } else if (e._clampToGround && !f && d) { + const y = new PolylineGraphics(); + y.clampToGround = !0, i.polyline = y, y.positions = m, defined(_) ? (y.material = defined(_.material) ? _.material.color.getValue(Iso8601.MINIMUM_VALUE) : Color.WHITE, y.width = defaultValue(_.width, 1)) : (y.material = Color.WHITE, y.width = 1), y.zIndex = h; + } else + defined(h) && oneTimeWarning( + "kml-gx:drawOrder", + "KML - gx:drawOrder is not supported in LineStrings when clampToGround is false" + ), e._clampToGround && !d && oneTimeWarning( + "kml-line-tesselate", + "Ignoring clampToGround for KML lines without the tessellate flag." + ), _ = defined(_) ? _.clone() : new PolylineGraphics(), i.polyline = _, _.positions = createPositionPropertyArrayFromAltitudeMode( + m, + s, + c, + p + ), (!d || f) && (_.arcType = ArcType$1.NONE); + return !0; +} +function processPolygon(e, t, n, i, r) { + const o = queryFirstNode( + n, + "outerBoundaryIs", + namespaces.kml + ); + let s = queryFirstNode( + o, + "LinearRing", + namespaces.kml + ), c = queryFirstNode( + s, + "coordinates", + namespaces.kml + ); + const l = e._ellipsoid; + let d = readCoordinates(c, l); + const f = queryBooleanValue(n, "extrude", namespaces.kml), h = queryStringValue( + n, + "altitudeMode", + namespaces.kml + ), p = queryStringValue( + n, + "altitudeMode", + namespaces.gx + ), m = isExtrudable(h, p), _ = defined(r.polygon) ? r.polygon.clone() : createDefaultPolygon(), y = r.polyline; + if (defined(y) && (_.outlineColor = defined(y.material) ? y.material.color : Color.WHITE, _.outlineWidth = y.width), i.polygon = _, m ? (_.perPositionHeight = !0, _.extrudedHeight = f ? 0 : void 0) : e._clampToGround || (_.height = 0), defined(d)) { + const C = new PolygonHierarchy(d), T = queryChildNodes( + n, + "innerBoundaryIs", + namespaces.kml + ); + for (let x = 0; x < T.length; x++) { + s = queryChildNodes( + T[x], + "LinearRing", + namespaces.kml + ); + for (let b = 0; b < s.length; b++) + c = queryFirstNode( + s[b], + "coordinates", + namespaces.kml + ), d = readCoordinates(c, l), defined(d) && C.holes.push(new PolygonHierarchy(d)); + } + _.hierarchy = C; + } + return !0; +} +function processTrack(e, t, n, i, r) { + const o = queryStringValue( + n, + "altitudeMode", + namespaces.kml + ), s = queryStringValue( + n, + "altitudeMode", + namespaces.gx + ), c = queryChildNodes(n, "coord", namespaces.gx), l = queryChildNodes(n, "angles", namespaces.gx), d = queryChildNodes(n, "when", namespaces.kml), f = queryBooleanValue(n, "extrude", namespaces.kml), h = isExtrudable(o, s), p = e._ellipsoid; + l.length > 0 && oneTimeWarning( + "kml-gx:angles", + "KML - gx:angles are not supported in gx:Tracks" + ); + const m = Math.min(c.length, d.length), _ = [], y = []; + for (let T = 0; T < m; T++) { + const x = readCoordinate(c[T].textContent, p); + _.push(x), y.push(JulianDate.fromIso8601(d[T].textContent)); + } + const C = new SampledPositionProperty(); + return C.addSamples(y, _), i.position = C, processPositionGraphics( + e, + i, + r, + heightReferenceFromAltitudeMode(o, s) + ), processPathGraphics(i, r), i.availability = new TimeIntervalCollection(), d.length > 0 && i.availability.addInterval( + new TimeInterval({ + start: y[0], + stop: y[y.length - 1] + }) + ), h && f && createDropLine(t, i, r), !0; +} +function addToMultiTrack(e, t, n, i, r, o, s, c, l) { + const d = e[0], f = e[e.length - 1], h = new SampledPositionProperty(); + h.addSamples(e, t), n.intervals.addInterval( + new TimeInterval({ + start: d, + stop: f, + isStartIncluded: l, + isStopIncluded: l, + data: createPositionPropertyFromAltitudeMode( + h, + s, + c + ) + }) + ), i.addInterval( + new TimeInterval({ + start: d, + stop: f, + isStartIncluded: l, + isStopIncluded: l + }) + ), r.intervals.addInterval( + new TimeInterval({ + start: d, + stop: f, + isStartIncluded: l, + isStopIncluded: l, + data: o + }) + ); +} +function processMultiTrack(e, t, n, i, r) { + const o = queryBooleanValue( + n, + "interpolate", + namespaces.gx + ), s = queryChildNodes(n, "Track", namespaces.gx); + let c, l, d, f = !1; + const h = new TimeIntervalCollectionProperty(), p = new TimeIntervalCollection(), m = new CompositePositionProperty(), _ = e._ellipsoid; + for (let y = 0, C = s.length; y < C; y++) { + const T = s[y], x = queryChildNodes(T, "when", namespaces.kml), b = queryChildNodes(T, "coord", namespaces.gx), S = queryStringValue( + T, + "altitudeMode", + namespaces.kml + ), E = queryStringValue( + T, + "altitudeMode", + namespaces.gx + ), A = isExtrudable(S, E), D = queryBooleanValue(T, "extrude", namespaces.kml), P = Math.min(b.length, x.length), I = []; + c = []; + for (let M = 0; M < P; M++) { + const R = readCoordinate(b[M].textContent, _); + I.push(R), c.push(JulianDate.fromIso8601(x[M].textContent)); + } + o && (defined(l) && addToMultiTrack( + [l, c[0]], + [d, I[0]], + m, + p, + h, + !1, + "absolute", + void 0, + !1 + ), l = c[P - 1], d = I[I.length - 1]), addToMultiTrack( + c, + I, + m, + p, + h, + A && D, + S, + E, + !0 + ), f = f || A && D; + } + return i.availability = p, i.position = m, processPositionGraphics(e, i, r), processPathGraphics(i, r), f && (createDropLine(t, i, r), i.polyline.show = h), !0; +} +const geometryTypes = { + Point: processPoint, + LineString: processLineStringOrLinearRing, + LinearRing: processLineStringOrLinearRing, + Polygon: processPolygon, + Track: processTrack, + MultiTrack: processMultiTrack, + MultiGeometry: processMultiGeometry, + Model: processUnsupportedGeometry +}; +function processMultiGeometry(e, t, n, i, r, o) { + const s = n.childNodes; + let c = !1; + for (let l = 0, d = s.length; l < d; l++) { + const f = s.item(l), h = geometryTypes[f.localName]; + if (defined(h)) { + const p = createEntity(f, t, o); + p.parent = i, p.name = i.name, p.availability = i.availability, p.description = i.description, p.kml = i.kml, h( + e, + t, + f, + p, + r + ) && (c = !0); + } + } + return c; +} +function processUnsupportedGeometry(e, t, n, i, r) { + return oneTimeWarning( + "kml-unsupportedGeometry", + `KML - Unsupported geometry: ${n.localName}` + ), !1; +} +function processExtendedData(e, t) { + const n = queryFirstNode(e, "ExtendedData", namespaces.kml); + if (!defined(n)) + return; + defined(queryFirstNode(n, "SchemaData", namespaces.kml)) && oneTimeWarning("kml-schemaData", "KML - SchemaData is unsupported"), defined(queryStringAttribute(n, "xmlns:prefix")) && oneTimeWarning( + "kml-extendedData", + "KML - ExtendedData with xmlns:prefix is unsupported" + ); + const i = {}, r = queryChildNodes(n, "Data", namespaces.kml); + if (defined(r)) { + const o = r.length; + for (let s = 0; s < o; s++) { + const c = r[s], l = queryStringAttribute(c, "name"); + defined(l) && (i[l] = { + displayName: queryStringValue( + c, + "displayName", + namespaces.kml + ), + value: queryStringValue(c, "value", namespaces.kml) + }); + } + } + t.kml.extendedData = i; +} +let scratchDiv; +typeof document < "u" && (scratchDiv = document.createElement("div")); +function processDescription(e, t, n, i, r) { + let o, s, c; + const l = t.kml, d = l.extendedData, f = queryStringValue(e, "description", namespaces.kml), h = defaultValue( + t.balloonStyle, + n.balloonStyle + ); + let p = Color.WHITE, m = Color.BLACK, _ = f; + defined(h) && (p = defaultValue(h.bgColor, Color.WHITE), m = defaultValue(h.textColor, Color.BLACK), _ = defaultValue(h.text, f)); + let y; + if (defined(_)) { + if (_ = _.replace("$[name]", defaultValue(t.name, "")), _ = _.replace("$[description]", defaultValue(f, "")), _ = _.replace("$[address]", defaultValue(l.address, "")), _ = _.replace("$[Snippet]", defaultValue(l.snippet, "")), _ = _.replace("$[id]", t.id), _ = _.replace("$[geDirections]", ""), defined(d)) { + const x = _.match(/\$\[.+?\]/g); + if (x !== null) + for (o = 0; o < x.length; o++) { + const b = x[o]; + let S = b.substr(2, b.length - 3); + const E = /\/displayName$/.test(S); + S = S.replace(/\/displayName$/, ""), y = d[S], defined(y) && (y = E ? y.displayName : y.value), defined(y) && (_ = _.replace(b, defaultValue(y, ""))); + } + } + } else if (defined(d) && (c = Object.keys(d), c.length > 0)) { + for (_ = '', o = 0; o < c.length; o++) + s = c[o], y = d[s], _ += ``; + _ += "
${defaultValue( + y.displayName, + s + )}${defaultValue(y.value, "")}
"; + } + if (!defined(_)) + return; + _ = autolinker.link(_), scratchDiv.innerHTML = _; + const C = scratchDiv.querySelectorAll("a"); + for (o = 0; o < C.length; o++) + C[o].setAttribute("target", "_blank"); + defined(i) && i.keys.length > 1 && (embedDataUris(scratchDiv, "a", "href", i), embedDataUris(scratchDiv, "link", "href", i), embedDataUris(scratchDiv, "area", "href", i), embedDataUris(scratchDiv, "img", "src", i), embedDataUris(scratchDiv, "iframe", "src", i), embedDataUris(scratchDiv, "video", "src", i), embedDataUris(scratchDiv, "audio", "src", i), embedDataUris(scratchDiv, "source", "src", i), embedDataUris(scratchDiv, "track", "src", i), embedDataUris(scratchDiv, "input", "src", i), embedDataUris(scratchDiv, "embed", "src", i), embedDataUris(scratchDiv, "script", "src", i), embedDataUris(scratchDiv, "video", "poster", i)), applyBasePath(scratchDiv, "a", "href", r), applyBasePath(scratchDiv, "link", "href", r), applyBasePath(scratchDiv, "area", "href", r), applyBasePath(scratchDiv, "img", "src", r), applyBasePath(scratchDiv, "iframe", "src", r), applyBasePath(scratchDiv, "video", "src", r), applyBasePath(scratchDiv, "audio", "src", r), applyBasePath(scratchDiv, "source", "src", r), applyBasePath(scratchDiv, "track", "src", r), applyBasePath(scratchDiv, "input", "src", r), applyBasePath(scratchDiv, "embed", "src", r), applyBasePath(scratchDiv, "script", "src", r), applyBasePath(scratchDiv, "video", "poster", r); + let T = '
`, scratchDiv.innerHTML = "", t.description = T; +} +function processFeature(e, t, n) { + const i = n.entityCollection, r = n.parentEntity, o = n.sourceResource, s = n.uriResolver, c = createEntity( + t, + i, + n.context + ), l = c.kml, d = computeFinalStyle( + e, + t, + n.styleCollection, + o, + s + ), f = queryStringValue(t, "name", namespaces.kml); + c.name = f, c.parent = r; + let h = processTimeSpan(t); + defined(h) || (h = processTimeStamp(t)), c.availability = h, mergeAvailabilityWithParent(c); + function p(b) { + return b ? b.show && p(b.parent) : !0; + } + const m = queryBooleanValue( + t, + "visibility", + namespaces.kml + ); + c.show = p(r) && defaultValue(m, !0); + const _ = queryFirstNode(t, "author", namespaces.atom), y = l.author; + y.name = queryStringValue(_, "name", namespaces.atom), y.uri = queryStringValue(_, "uri", namespaces.atom), y.email = queryStringValue(_, "email", namespaces.atom); + const C = queryFirstNode(t, "link", namespaces.atom), T = l.link; + T.href = queryStringAttribute(C, "href"), T.hreflang = queryStringAttribute(C, "hreflang"), T.rel = queryStringAttribute(C, "rel"), T.type = queryStringAttribute(C, "type"), T.title = queryStringAttribute(C, "title"), T.length = queryStringAttribute(C, "length"), l.address = queryStringValue(t, "address", namespaces.kml), l.phoneNumber = queryStringValue( + t, + "phoneNumber", + namespaces.kml + ), l.snippet = queryStringValue(t, "Snippet", namespaces.kml), processExtendedData(t, c), processDescription( + t, + c, + d, + s, + o + ); + const x = e._ellipsoid; + return processLookAt(t, c, x), processCamera(t, c, x), defined(queryFirstNode(t, "Region", namespaces.kml)) && oneTimeWarning("kml-region", "KML - Placemark Regions are unsupported"), { + entity: c, + styleEntity: d + }; +} +function processDocument(e, t, n, i) { + i.addNodes(t.childNodes, n), i.process(); +} +function processFolder(e, t, n, i) { + const r = processFeature(e, t, n), o = clone$1(n); + o.parentEntity = r.entity, processDocument(e, t, o, i); +} +function processPlacemark(e, t, n, i) { + const r = processFeature(e, t, n), o = r.entity, s = r.styleEntity; + let c = !1; + const l = t.childNodes; + for (let d = 0, f = l.length; d < f && !c; d++) { + const h = l.item(d), p = geometryTypes[h.localName]; + defined(p) && (p( + e, + n.entityCollection, + h, + o, + s, + o.id + ), c = !0); + } + c || (o.merge(s), processPositionGraphics(e, o, s)); +} +const playlistNodeProcessors = { + FlyTo: processTourFlyTo, + Wait: processTourWait, + SoundCue: processTourUnsupportedNode, + AnimatedUpdate: processTourUnsupportedNode, + TourControl: processTourUnsupportedNode +}; +function processTour(e, t, n, i) { + const r = queryStringValue(t, "name", namespaces.kml), o = queryStringAttribute(t, "id"), s = new KmlTour(r, o), c = queryFirstNode(t, "Playlist", namespaces.gx); + if (c) { + const l = e._ellipsoid, d = c.childNodes; + for (let f = 0; f < d.length; f++) { + const h = d[f]; + if (h.localName) { + const p = playlistNodeProcessors[h.localName]; + p ? p(s, h, l) : console.log( + `Unknown KML Tour playlist entry type ${h.localName}` + ); + } + } + } + e._kmlTours.push(s); +} +function processTourUnsupportedNode(e, t) { + oneTimeWarning(`KML Tour unsupported node ${t.localName}`); +} +function processTourWait(e, t) { + const n = queryNumericValue(t, "duration", namespaces.gx); + e.addPlaylistEntry(new KmlTourWait(n)); +} +function processTourFlyTo(e, t, n) { + const i = queryNumericValue(t, "duration", namespaces.gx), r = queryStringValue(t, "flyToMode", namespaces.gx), o = { kml: {} }; + processLookAt(t, o, n), processCamera(t, o, n); + const s = o.kml.lookAt || o.kml.camera, c = new KmlTourFlyTo(i, r, s); + e.addPlaylistEntry(c); +} +function processCamera(e, t, n) { + const i = queryFirstNode(e, "Camera", namespaces.kml); + if (defined(i)) { + const r = defaultValue( + queryNumericValue(i, "longitude", namespaces.kml), + 0 + ), o = defaultValue( + queryNumericValue(i, "latitude", namespaces.kml), + 0 + ), s = defaultValue( + queryNumericValue(i, "altitude", namespaces.kml), + 0 + ), c = defaultValue( + queryNumericValue(i, "heading", namespaces.kml), + 0 + ), l = defaultValue( + queryNumericValue(i, "tilt", namespaces.kml), + 0 + ), d = defaultValue( + queryNumericValue(i, "roll", namespaces.kml), + 0 + ), f = Cartesian3.fromDegrees(r, o, s, n), h = HeadingPitchRoll.fromDegrees(c, l - 90, d); + t.kml.camera = new KmlCamera(f, h); + } +} +function processLookAt(e, t, n) { + const i = queryFirstNode(e, "LookAt", namespaces.kml); + if (defined(i)) { + const r = defaultValue( + queryNumericValue(i, "longitude", namespaces.kml), + 0 + ), o = defaultValue( + queryNumericValue(i, "latitude", namespaces.kml), + 0 + ), s = defaultValue( + queryNumericValue(i, "altitude", namespaces.kml), + 0 + ); + let c = queryNumericValue(i, "heading", namespaces.kml), l = queryNumericValue(i, "tilt", namespaces.kml); + const d = defaultValue( + queryNumericValue(i, "range", namespaces.kml), + 0 + ); + l = CesiumMath.toRadians(defaultValue(l, 0)), c = CesiumMath.toRadians(defaultValue(c, 0)); + const f = new HeadingPitchRange( + c, + l - CesiumMath.PI_OVER_TWO, + d + ), h = Cartesian3.fromDegrees(r, o, s, n); + t.kml.lookAt = new KmlLookAt(h, f); + } +} +function processScreenOverlay(e, t, n, i) { + const r = n.screenOverlayContainer; + if (!defined(r)) + return; + const o = n.sourceResource, s = n.uriResolver, c = queryFirstNode(t, "Icon", namespaces.kml), l = getIconHref( + c, + e, + o, + s, + !1 + ); + if (!defined(l)) + return; + const d = document.createElement("img"); + e._screenOverlays.push(d), d.src = l.url, d.onload = function() { + const f = ["position: absolute"], h = queryFirstNode( + t, + "screenXY", + namespaces.kml + ), p = queryFirstNode( + t, + "overlayXY", + namespaces.kml + ), m = queryFirstNode(t, "size", namespaces.kml); + let _, y, C, T, x, b; + defined(m) && (_ = queryNumericAttribute(m, "x"), y = queryNumericAttribute(m, "y"), C = queryStringAttribute(m, "xunits"), T = queryStringAttribute(m, "yunits"), defined(_) && _ !== -1 && _ !== 0 && (C === "fraction" ? x = `width: ${Math.floor(_ * 100)}%` : C === "pixels" && (x = `width: ${_}px`), f.push(x)), defined(y) && y !== -1 && y !== 0 && (T === "fraction" ? b = `height: ${Math.floor(y * 100)}%` : T === "pixels" && (b = `height: ${y}px`), f.push(b))), d.style = f.join(";"); + let S = 0, E = d.height; + defined(p) && (_ = queryNumericAttribute(p, "x"), y = queryNumericAttribute(p, "y"), C = queryStringAttribute(p, "xunits"), T = queryStringAttribute(p, "yunits"), defined(_) && (C === "fraction" ? S = _ * d.width : (C === "pixels" || C === "insetPixels") && (S = _)), defined(y) && (T === "fraction" ? E = y * d.height : (T === "pixels" || T === "insetPixels") && (E = y))), defined(h) && (_ = queryNumericAttribute(h, "x"), y = queryNumericAttribute(h, "y"), C = queryStringAttribute(h, "xunits"), T = queryStringAttribute(h, "yunits"), defined(_) && (C === "fraction" ? x = `left: calc(${Math.floor( + _ * 100 + )}% - ${S}px)` : C === "pixels" ? x = `left: ${_ - S}px` : C === "insetPixels" && (x = `right: ${_ - S}px`), f.push(x)), defined(y) && (T === "fraction" ? b = `bottom: calc(${Math.floor( + y * 100 + )}% - ${E}px)` : T === "pixels" ? b = `bottom: ${y - E}px` : T === "insetPixels" && (b = `top: ${y - E}px`), f.push(b))), d.style = f.join(";"); + }, r.appendChild(d); +} +function processGroundOverlay(e, t, n, i) { + const o = processFeature(e, t, n).entity; + let s, c = !1; + const l = e._ellipsoid, d = readCoordinates( + queryFirstNode(t, "LatLonQuad", namespaces.gx), + l + ), f = queryNumericValue(t, "drawOrder", namespaces.kml); + if (defined(d)) + s = createDefaultPolygon(), s.hierarchy = new PolygonHierarchy(d), s.zIndex = f, o.polygon = s, c = !0; + else { + s = new RectangleGraphics(), s.zIndex = f, o.rectangle = s; + const _ = queryFirstNode( + t, + "LatLonBox", + namespaces.kml + ); + if (defined(_)) { + let y = queryNumericValue(_, "west", namespaces.kml), C = queryNumericValue(_, "south", namespaces.kml), T = queryNumericValue(_, "east", namespaces.kml), x = queryNumericValue(_, "north", namespaces.kml); + defined(y) && (y = CesiumMath.negativePiToPi(CesiumMath.toRadians(y))), defined(C) && (C = CesiumMath.clampToLatitudeRange(CesiumMath.toRadians(C))), defined(T) && (T = CesiumMath.negativePiToPi(CesiumMath.toRadians(T))), defined(x) && (x = CesiumMath.clampToLatitudeRange(CesiumMath.toRadians(x))), s.coordinates = new Rectangle(y, C, T, x); + const b = queryNumericValue(_, "rotation", namespaces.kml); + if (defined(b)) { + const S = CesiumMath.toRadians(b); + s.rotation = S, s.stRotation = S; + } + } + } + const h = queryFirstNode(t, "Icon", namespaces.kml), p = getIconHref( + h, + e, + n.sourceResource, + n.uriResolver, + !0 + ); + if (defined(p)) { + c && oneTimeWarning( + "kml-gx:LatLonQuad", + "KML - gx:LatLonQuad Icon does not support texture projection." + ); + const _ = queryNumericValue(h, "x", namespaces.gx), y = queryNumericValue(h, "y", namespaces.gx), C = queryNumericValue(h, "w", namespaces.gx), T = queryNumericValue(h, "h", namespaces.gx); + (defined(_) || defined(y) || defined(C) || defined(T)) && oneTimeWarning( + "kml-groundOverlay-xywh", + "KML - gx:x, gx:y, gx:w, gx:h aren't supported for GroundOverlays" + ), s.material = p, s.material.color = queryColorValue( + t, + "color", + namespaces.kml + ), s.material.transparent = !0; + } else + s.material = queryColorValue(t, "color", namespaces.kml); + let m = queryStringValue( + t, + "altitudeMode", + namespaces.kml + ); + defined(m) ? m === "absolute" ? (s.height = queryNumericValue( + t, + "altitude", + namespaces.kml + ), s.zIndex = void 0) : m !== "clampToGround" && oneTimeWarning( + "kml-altitudeMode-unknown", + `KML - Unknown altitudeMode: ${m}` + ) : (m = queryStringValue( + t, + "altitudeMode", + namespaces.gx + ), m === "relativeToSeaFloor" ? (oneTimeWarning( + "kml-altitudeMode-relativeToSeaFloor", + "KML - altitudeMode relativeToSeaFloor is currently not supported, treating as absolute." + ), s.height = queryNumericValue( + t, + "altitude", + namespaces.kml + ), s.zIndex = void 0) : m === "clampToSeaFloor" ? oneTimeWarning( + "kml-altitudeMode-clampToSeaFloor", + "KML - altitudeMode clampToSeaFloor is currently not supported, treating as clampToGround." + ) : defined(m) && oneTimeWarning( + "kml-altitudeMode-unknown", + `KML - Unknown altitudeMode: ${m}` + )); +} +function processUnsupportedFeature(e, t, n, i) { + e._unsupportedNode.raiseEvent( + e, + n.parentEntity, + t, + n.entityCollection, + n.styleCollection, + n.sourceResource, + n.uriResolver + ), oneTimeWarning( + `kml-unsupportedFeature-${t.nodeName}`, + `KML - Unsupported feature: ${t.nodeName}` + ); +} +const RefreshMode = { + INTERVAL: 0, + EXPIRE: 1, + STOP: 2 +}; +function cleanupString(e) { + if (!defined(e) || e.length === 0) + return ""; + const t = e[0]; + return (t === "&" || t === "?") && (e = e.substring(1)), e; +} +const zeroRectangle = new Rectangle(), scratchCartographic$7 = new Cartographic(), scratchCartesian2$4 = new Cartesian2(), scratchCartesian3$4 = new Cartesian3(); +function processNetworkLinkQueryString(e, t, n, i, r, o) { + function s(d) { + return d < -CesiumMath.PI_OVER_TWO ? -CesiumMath.PI_OVER_TWO : d > CesiumMath.PI_OVER_TWO ? CesiumMath.PI_OVER_TWO : d; + } + function c(d) { + return d > CesiumMath.PI ? d - CesiumMath.TWO_PI : d < -CesiumMath.PI ? d + CesiumMath.TWO_PI : d; + } + let l = objectToQuery(e.queryParameters); + if (l = l.replace(/%5B/g, "[").replace(/%5D/g, "]"), defined(t) && t._mode !== SceneMode$1.MORPHING) { + let d, f; + if (r = defaultValue(r, zeroRectangle), defined(n) && (scratchCartesian2$4.x = n.clientWidth * 0.5, scratchCartesian2$4.y = n.clientHeight * 0.5, d = t.pickEllipsoid( + scratchCartesian2$4, + o, + scratchCartesian3$4 + )), defined(d) ? f = o.cartesianToCartographic( + d, + scratchCartographic$7 + ) : (f = Rectangle.center(r, scratchCartographic$7), d = o.cartographicToCartesian(f)), defined(i) && !CesiumMath.equalsEpsilon(i, 1, CesiumMath.EPSILON9)) { + const T = r.width * i * 0.5, x = r.height * i * 0.5; + r = new Rectangle( + c(f.longitude - T), + s(f.latitude - x), + c(f.longitude + T), + s(f.latitude + x) + ); + } + l = l.replace( + "[bboxWest]", + CesiumMath.toDegrees(r.west).toString() + ), l = l.replace( + "[bboxSouth]", + CesiumMath.toDegrees(r.south).toString() + ), l = l.replace( + "[bboxEast]", + CesiumMath.toDegrees(r.east).toString() + ), l = l.replace( + "[bboxNorth]", + CesiumMath.toDegrees(r.north).toString() + ); + const h = CesiumMath.toDegrees(f.longitude).toString(), p = CesiumMath.toDegrees(f.latitude).toString(); + l = l.replace("[lookatLon]", h), l = l.replace("[lookatLat]", p), l = l.replace( + "[lookatTilt]", + CesiumMath.toDegrees(t.pitch).toString() + ), l = l.replace( + "[lookatHeading]", + CesiumMath.toDegrees(t.heading).toString() + ), l = l.replace( + "[lookatRange]", + Cartesian3.distance(t.positionWC, d) + ), l = l.replace("[lookatTerrainLon]", h), l = l.replace("[lookatTerrainLat]", p), l = l.replace( + "[lookatTerrainAlt]", + f.height.toString() + ), o.cartesianToCartographic(t.positionWC, scratchCartographic$7), l = l.replace( + "[cameraLon]", + CesiumMath.toDegrees(scratchCartographic$7.longitude).toString() + ), l = l.replace( + "[cameraLat]", + CesiumMath.toDegrees(scratchCartographic$7.latitude).toString() + ), l = l.replace( + "[cameraAlt]", + CesiumMath.toDegrees(scratchCartographic$7.height).toString() + ); + const m = t.frustum, _ = m.aspectRatio; + let y = "", C = ""; + if (defined(_)) { + const T = CesiumMath.toDegrees(m.fov); + _ > 1 ? (y = T, C = T / _) : (C = T, y = T * _); + } + l = l.replace("[horizFov]", y.toString()), l = l.replace("[vertFov]", C.toString()); + } else + l = l.replace("[bboxWest]", "-180"), l = l.replace("[bboxSouth]", "-90"), l = l.replace("[bboxEast]", "180"), l = l.replace("[bboxNorth]", "90"), l = l.replace("[lookatLon]", ""), l = l.replace("[lookatLat]", ""), l = l.replace("[lookatRange]", ""), l = l.replace("[lookatTilt]", ""), l = l.replace("[lookatHeading]", ""), l = l.replace("[lookatTerrainLon]", ""), l = l.replace("[lookatTerrainLat]", ""), l = l.replace("[lookatTerrainAlt]", ""), l = l.replace("[cameraLon]", ""), l = l.replace("[cameraLat]", ""), l = l.replace("[cameraAlt]", ""), l = l.replace("[horizFov]", ""), l = l.replace("[vertFov]", ""); + defined(n) ? (l = l.replace("[horizPixels]", n.clientWidth), l = l.replace("[vertPixels]", n.clientHeight)) : (l = l.replace("[horizPixels]", ""), l = l.replace("[vertPixels]", "")), l = l.replace("[terrainEnabled]", "1"), l = l.replace("[clientVersion]", "1"), l = l.replace("[kmlVersion]", "2.2"), l = l.replace("[clientName]", "Cesium"), l = l.replace("[language]", "English"), e.setQueryParameters(queryToObject(l)); +} +function processNetworkLink(e, t, n, i) { + const o = processFeature(e, t, n).entity, s = n.sourceResource, c = n.uriResolver; + let l = queryFirstNode(t, "Link", namespaces.kml); + if (defined(l) || (l = queryFirstNode(t, "Url", namespaces.kml)), defined(l)) { + let d = queryStringValue(l, "href", namespaces.kml), f, h; + if (defined(d)) { + let p = d; + if (d = resolveHref(d, s, n.uriResolver), /^data:/.test(d.getUrlComponent())) + /\.kmz/i.test(s.getUrlComponent()) || (p = s.getDerivedResource({ + url: p + })); + else { + if (p = d.clone(), f = queryStringValue( + l, + "viewRefreshMode", + namespaces.kml + ), f === "onRegion") { + oneTimeWarning( + "kml-refrehMode-onRegion", + "KML - Unsupported viewRefreshMode: onRegion" + ); + return; + } + h = defaultValue( + queryStringValue(l, "viewBoundScale", namespaces.kml), + 1 + ); + const C = f === "onStop" ? "BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]" : "", T = defaultValue( + queryStringValue(l, "viewFormat", namespaces.kml), + C + ), x = queryStringValue(l, "httpQuery", namespaces.kml); + defined(T) && d.setQueryParameters(queryToObject(cleanupString(T))), defined(x) && d.setQueryParameters(queryToObject(cleanupString(x))); + const b = e._ellipsoid; + processNetworkLinkQueryString( + d, + e.camera, + e.canvas, + h, + e._lastCameraView.bbox, + b + ); + } + const m = { + sourceUri: p, + uriResolver: c, + context: o.id, + screenOverlayContainer: n.screenOverlayContainer + }, _ = new EntityCollection(), y = load$1(e, _, d, m).then(function(C) { + const T = e._entityCollection, x = _.values; + T.suspendEvents(); + for (let E = 0; E < x.length; E++) { + const A = x[E]; + defined(A.parent) || (A.parent = o, mergeAvailabilityWithParent(A)), T.add(A); + } + T.resumeEvents(); + const b = queryStringValue( + l, + "refreshMode", + namespaces.kml + ); + let S = defaultValue( + queryNumericValue(l, "refreshInterval", namespaces.kml), + 0 + ); + if (b === "onInterval" && S > 0 || b === "onExpire" || f === "onStop") { + const E = queryFirstNode( + C, + "NetworkLinkControl", + namespaces.kml + ), A = defined(E), D = JulianDate.now(), P = { + id: createGuid(), + href: d, + cookie: {}, + lastUpdated: D, + updating: !1, + entity: o, + viewBoundScale: h, + needsUpdate: !1, + cameraUpdateTime: D + }; + let I = 0; + if (A && (P.cookie = queryToObject( + defaultValue( + queryStringValue( + E, + "cookie", + namespaces.kml + ), + "" + ) + ), I = defaultValue( + queryNumericValue( + E, + "minRefreshPeriod", + namespaces.kml + ), + 0 + )), b === "onInterval") + A && (S = Math.max(I, S)), P.refreshMode = RefreshMode.INTERVAL, P.time = S; + else if (b === "onExpire") { + let M; + if (A && (M = queryStringValue( + E, + "expires", + namespaces.kml + )), defined(M)) + try { + const R = JulianDate.fromIso8601(M), L = JulianDate.secondsDifference(R, D); + L > 0 && L < I && JulianDate.addSeconds(D, I, R), P.refreshMode = RefreshMode.EXPIRE, P.time = R; + } catch { + oneTimeWarning( + "kml-refreshMode-onInterval-onExpire", + "KML - NetworkLinkControl expires is not a valid date" + ); + } + else + oneTimeWarning( + "kml-refreshMode-onExpire", + "KML - refreshMode of onExpire requires the NetworkLinkControl to have an expires element" + ); + } else defined(e.camera) ? (P.refreshMode = RefreshMode.STOP, P.time = defaultValue( + queryNumericValue(l, "viewRefreshTime", namespaces.kml), + 0 + )) : oneTimeWarning( + "kml-refrehMode-onStop-noCamera", + "A NetworkLink with viewRefreshMode=onStop requires the `camera` property to be defined." + ); + defined(P.refreshMode) && e._networkLinks.set(P.id, P); + } + }).catch(function(C) { + oneTimeWarning(`An error occured during loading ${d.url}`), e._error.raiseEvent(e, C); + }); + i.addPromise(y); + } + } +} +function processFeatureNode(e, t, n, i) { + const r = featureTypes[t.localName]; + return defined(r) ? r(e, t, n, i) : processUnsupportedFeature( + e, + t, + n + ); +} +function loadKml(e, t, n, i, r, o, s) { + t.removeAll(); + const c = n.documentElement, l = c.localName === "Document" ? c : queryFirstNode(c, "Document", namespaces.kml); + let d = queryStringValue(l, "name", namespaces.kml); + defined(d) || (d = getFilenameFromUri(i.getUrlComponent())), defined(e._name) || (e._name = d); + const f = new KmlDataSource._DeferredLoading(e), h = new EntityCollection(e); + return Promise.all( + processStyles( + e, + n, + h, + i, + !1, + r + ) + ).then(function() { + let p = n.documentElement; + if (p.localName === "kml") { + const _ = p.childNodes; + for (let y = 0; y < _.length; y++) { + const C = _[y]; + if (defined(featureTypes[C.localName])) { + p = C; + break; + } + } + } + const m = { + parentEntity: void 0, + entityCollection: t, + styleCollection: h, + sourceResource: i, + uriResolver: r, + context: s, + screenOverlayContainer: o + }; + return t.suspendEvents(), processFeatureNode(e, p, m, f), t.resumeEvents(), f.wait().then(function() { + return n.documentElement; + }); + }); +} +function loadKmz(e, t, n, i, r) { + const o = buildModuleUrl("ThirdParty/Workers/z-worker-pako.js"); + configure({ + workerScripts: { + deflate: [o, "./pako_deflate.min.js"], + inflate: [o, "./pako_inflate.min.js"] + } + }); + const s = new ZipReader(new BlobReader(n)); + return Promise.resolve(s.getEntries()).then(function(c) { + const l = [], d = {}; + let f; + for (let h = 0; h < c.length; h++) { + const p = c[h]; + p.directory || (/\.kml$/i.test(p.filename) && (!defined(f) || !/\//i.test(p.filename)) ? (defined(f) && l.push(loadDataUriFromZip(f, d)), f = p) : l.push(loadDataUriFromZip(p, d))); + } + return defined(f) && l.push(loadXmlFromZip(f, d)), Promise.all(l).then(function() { + if (s.close(), !defined(d.kml)) + throw new RuntimeError("KMZ file does not contain a KML document."); + return d.keys = Object.keys(d), loadKml( + e, + t, + d.kml, + i, + d, + r + ); + }); + }); +} +function load$1(e, t, n, i) { + i = defaultValue(i, defaultValue.EMPTY_OBJECT); + let r = i.sourceUri; + const o = i.uriResolver, s = i.context; + let c = i.screenOverlayContainer, l = n; + if (typeof n == "string" || n instanceof Resource) { + n = Resource.createIfNeeded(n), l = n.fetchBlob(), r = defaultValue(r, n.clone()); + const d = e._resourceCredits, f = n.credits; + if (defined(f)) { + const h = f.length; + for (let p = 0; p < h; p++) + d.push(f[p]); + } + } else + r = defaultValue(r, Resource.DEFAULT.clone()); + return r = Resource.createIfNeeded(r), defined(c) && (c = getElement(c)), Promise.resolve(l).then(function(d) { + return d instanceof Blob ? isZipFile(d).then(function(f) { + return f ? loadKmz( + e, + t, + d, + r, + c + ) : readBlobAsText(d).then(function(h) { + h = insertNamespaces(h), h = removeDuplicateNamespaces(h); + let p, m; + try { + p = parser.parseFromString(h, "application/xml"); + } catch (_) { + m = _.toString(); + } + if (defined(m) || p.body || p.documentElement.tagName === "parsererror") { + let _ = defined(m) ? m : p.documentElement.firstChild.nodeValue; + throw _ || (_ = p.body.innerText), new RuntimeError(_); + } + return loadKml( + e, + t, + p, + r, + o, + c, + s + ); + }); + }) : loadKml( + e, + t, + d, + r, + o, + c, + s + ); + }).catch(function(d) { + return e._error.raiseEvent(e, d), console.log(d), Promise.reject(d); + }); +} +function KmlDataSource(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.camera, n = e.canvas; + this._changed = new Event(), this._error = new Event(), this._loading = new Event(), this._refresh = new Event(), this._unsupportedNode = new Event(), this._clock = void 0, this._entityCollection = new EntityCollection(this), this._name = void 0, this._isLoading = !1, this._pinBuilder = new PinBuilder(), this._networkLinks = new AssociativeArray(), this._entityCluster = new EntityCluster(), this.canvas = n, this.camera = t, this._lastCameraView = { + position: defined(t) ? Cartesian3.clone(t.positionWC) : void 0, + direction: defined(t) ? Cartesian3.clone(t.directionWC) : void 0, + up: defined(t) ? Cartesian3.clone(t.upWC) : void 0, + bbox: defined(t) ? t.computeViewRectangle() : Rectangle.clone(Rectangle.MAX_VALUE) + }, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default); + let i = e.credit; + typeof i == "string" && (i = new Credit(i)), this._credit = i, this._resourceCredits = [], this._kmlTours = [], this._screenOverlays = []; +} +KmlDataSource.load = function(e, t) { + return t = defaultValue(t, defaultValue.EMPTY_OBJECT), new KmlDataSource(t).load(e, t); +}; +Object.defineProperties(KmlDataSource.prototype, { + /** + * Gets or sets a human-readable name for this instance. + * This will be automatically be set to the KML document name on load. + * @memberof KmlDataSource.prototype + * @type {string} + */ + name: { + get: function() { + return this._name; + }, + set: function(e) { + this._name !== e && (this._name = e, this._changed.raiseEvent(this)); + } + }, + /** + * Gets the clock settings defined by the loaded KML. This represents the total + * availability interval for all time-dynamic data. If the KML does not contain + * time-dynamic data, this value is undefined. + * @memberof KmlDataSource.prototype + * @type {DataSourceClock} + */ + clock: { + get: function() { + return this._clock; + } + }, + /** + * Gets the collection of {@link Entity} instances. + * @memberof KmlDataSource.prototype + * @type {EntityCollection} + */ + entities: { + get: function() { + return this._entityCollection; + } + }, + /** + * Gets a value indicating if the data source is currently loading data. + * @memberof KmlDataSource.prototype + * @type {boolean} + */ + isLoading: { + get: function() { + return this._isLoading; + } + }, + /** + * Gets an event that will be raised when the underlying data changes. + * @memberof KmlDataSource.prototype + * @type {Event} + */ + changedEvent: { + get: function() { + return this._changed; + } + }, + /** + * Gets an event that will be raised if an error is encountered during processing. + * @memberof KmlDataSource.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._error; + } + }, + /** + * Gets an event that will be raised when the data source either starts or stops loading. + * @memberof KmlDataSource.prototype + * @type {Event} + */ + loadingEvent: { + get: function() { + return this._loading; + } + }, + /** + * Gets an event that will be raised when the data source refreshes a network link. + * @memberof KmlDataSource.prototype + * @type {Event} + */ + refreshEvent: { + get: function() { + return this._refresh; + } + }, + /** + * Gets an event that will be raised when the data source finds an unsupported node type. + * @memberof KmlDataSource.prototype + * @type {Event} + */ + unsupportedNodeEvent: { + get: function() { + return this._unsupportedNode; + } + }, + /** + * Gets whether or not this data source should be displayed. + * @memberof KmlDataSource.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._entityCollection.show; + }, + set: function(e) { + this._entityCollection.show = e; + } + }, + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + * + * @memberof KmlDataSource.prototype + * @type {EntityCluster} + */ + clustering: { + get: function() { + return this._entityCluster; + }, + set: function(e) { + this._entityCluster = e; + } + }, + /** + * Gets the credit that will be displayed for the data source + * @memberof KmlDataSource.prototype + * @type {Credit} + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets the KML Tours that are used to guide the camera to specified destinations on given time intervals. + * @memberof KmlDataSource.prototype + * @type {KmlTour[]} + */ + kmlTours: { + get: function() { + return this._kmlTours; + } + } +}); +KmlDataSource.prototype.load = function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT), DataSource.setLoading(this, !0); + const n = this._name; + this._name = void 0, this._clampToGround = defaultValue(t.clampToGround, !1); + const i = this; + return load$1(this, this._entityCollection, e, t).then(function() { + let r; + const o = i._entityCollection.computeAvailability(); + let s = o.start, c = o.stop; + const l = JulianDate.equals(s, Iso8601.MINIMUM_VALUE), d = JulianDate.equals(c, Iso8601.MAXIMUM_VALUE); + if (!l || !d) { + let h; + l && (h = /* @__PURE__ */ new Date(), h.setHours(0, 0, 0, 0), s = JulianDate.fromDate(h)), d && (h = /* @__PURE__ */ new Date(), h.setHours(24, 0, 0, 0), c = JulianDate.fromDate(h)), r = new DataSourceClock(), r.startTime = s, r.stopTime = c, r.currentTime = JulianDate.clone(s), r.clockRange = ClockRange$1.LOOP_STOP, r.clockStep = ClockStep$1.SYSTEM_CLOCK_MULTIPLIER, r.multiplier = Math.round( + Math.min( + Math.max(JulianDate.secondsDifference(c, s) / 60, 1), + 31556900 + ) + ); + } + let f = !1; + return r !== i._clock && (i._clock = r, f = !0), n !== i._name && (f = !0), f && i._changed.raiseEvent(i), DataSource.setLoading(i, !1), i; + }).catch(function(r) { + return DataSource.setLoading(i, !1), i._error.raiseEvent(i, r), console.log(r), Promise.reject(r); + }); +}; +KmlDataSource.prototype.destroy = function() { + for (; this._screenOverlays.length > 0; ) + this._screenOverlays.pop().remove(); +}; +function mergeAvailabilityWithParent(e) { + const t = e.parent; + if (defined(t)) { + const n = t.availability; + if (defined(n)) { + const i = e.availability; + defined(i) ? i.intersect(n) : e.availability = n; + } + } +} +function getNetworkLinkUpdateCallback(e, t, n, i, r) { + return function(o) { + if (!i.contains(t.id)) + return; + let s = !1; + const c = queryFirstNode( + o, + "NetworkLinkControl", + namespaces.kml + ), l = defined(c); + let d = 0; + if (l) { + if (defined(queryFirstNode(c, "Update", namespaces.kml))) { + oneTimeWarning( + "kml-networkLinkControl-update", + "KML - NetworkLinkControl updates aren't supported." + ), t.updating = !1, i.remove(t.id); + return; + } + t.cookie = queryToObject( + defaultValue( + queryStringValue(c, "cookie", namespaces.kml), + "" + ) + ), d = defaultValue( + queryNumericValue( + c, + "minRefreshPeriod", + namespaces.kml + ), + 0 + ); + } + const f = JulianDate.now(), h = t.refreshMode; + if (h === RefreshMode.INTERVAL) + defined(c) && (t.time = Math.max(d, t.time)); + else if (h === RefreshMode.EXPIRE) { + let D; + if (defined(c) && (D = queryStringValue( + c, + "expires", + namespaces.kml + )), defined(D)) + try { + const P = JulianDate.fromIso8601(D), I = JulianDate.secondsDifference(P, f); + I > 0 && I < d && JulianDate.addSeconds(f, d, P), t.time = P; + } catch { + oneTimeWarning( + "kml-networkLinkControl-expires", + "KML - NetworkLinkControl expires is not a valid date" + ), s = !0; + } + else + oneTimeWarning( + "kml-refreshMode-onExpire", + "KML - refreshMode of onExpire requires the NetworkLinkControl to have an expires element" + ), s = !0; + } + const p = t.entity, m = e._entityCollection, _ = n.values; + function y(D) { + m.remove(D); + const P = D._children, I = P.length; + for (let M = 0; M < I; ++M) + y(P[M]); + } + m.suspendEvents(); + const C = m.values.slice(); + let T; + for (T = 0; T < C.length; ++T) { + const D = C[T]; + D.parent === p && (D.parent = void 0, y(D)); + } + for (m.resumeEvents(), m.suspendEvents(), T = 0; T < _.length; T++) { + const D = _[T]; + defined(D.parent) || (D.parent = p, mergeAvailabilityWithParent(D)), m.add(D); + } + m.resumeEvents(), s ? i.remove(t.id) : t.lastUpdated = f; + const x = m.computeAvailability(), b = x.start, S = x.stop, E = JulianDate.equals(b, Iso8601.MINIMUM_VALUE), A = JulianDate.equals(S, Iso8601.MAXIMUM_VALUE); + if (!E || !A) { + const D = e._clock; + (D.startTime !== b || D.stopTime !== S) && (D.startTime = b, D.stopTime = S, e._changed.raiseEvent(e)); + } + t.updating = !1, t.needsUpdate = !1, e._refresh.raiseEvent( + e, + r.getUrlComponent(!0) + ); + }; +} +const entitiesToIgnore = new AssociativeArray(); +KmlDataSource.prototype.update = function(e) { + const t = this._networkLinks; + if (t.length === 0) + return !0; + const n = JulianDate.now(), i = this; + entitiesToIgnore.removeAll(); + function r(f) { + const h = f._children, p = h.length; + for (let m = 0; m < p; ++m) { + const _ = h[m]; + entitiesToIgnore.set(_.id, _), r(_); + } + } + let o = !1; + const s = this._lastCameraView, c = this.camera; + defined(c) && !(c.positionWC.equalsEpsilon( + s.position, + CesiumMath.EPSILON7 + ) && c.directionWC.equalsEpsilon( + s.direction, + CesiumMath.EPSILON7 + ) && c.upWC.equalsEpsilon(s.up, CesiumMath.EPSILON7)) && (s.position = Cartesian3.clone(c.positionWC), s.direction = Cartesian3.clone(c.directionWC), s.up = Cartesian3.clone(c.upWC), s.bbox = c.computeViewRectangle(), o = !0); + const l = new AssociativeArray(); + let d = !1; + return t.values.forEach(function(f) { + const h = f.entity; + if (!entitiesToIgnore.contains(h.id)) { + if (!f.updating) { + let p = !1; + if (f.refreshMode === RefreshMode.INTERVAL ? JulianDate.secondsDifference(n, f.lastUpdated) > f.time && (p = !0) : f.refreshMode === RefreshMode.EXPIRE ? JulianDate.greaterThan(n, f.time) && (p = !0) : f.refreshMode === RefreshMode.STOP && (o && (f.needsUpdate = !0, f.cameraUpdateTime = n), f.needsUpdate && JulianDate.secondsDifference(n, f.cameraUpdateTime) >= f.time && (p = !0)), p) { + r(h), f.updating = !0; + const m = new EntityCollection(), _ = f.href.clone(); + _.setQueryParameters(f.cookie); + const y = defaultValue(i._ellipsoid, Ellipsoid.default); + processNetworkLinkQueryString( + _, + i.camera, + i.canvas, + f.viewBoundScale, + s.bbox, + y + ), load$1(i, m, _, { + context: h.id + }).then( + getNetworkLinkUpdateCallback( + i, + f, + m, + l, + _ + ) + ).catch(function(C) { + const T = `NetworkLink ${f.href} refresh failed: ${C}`; + console.log(T), i._error.raiseEvent(i, T); + }), d = !0; + } + } + l.set(f.id, f); + } + }), d && (this._networkLinks = l, this._changed.raiseEvent(this)), !0; +}; +function KmlFeatureData() { + this.author = { + name: void 0, + uri: void 0, + email: void 0 + }, this.link = { + href: void 0, + hreflang: void 0, + rel: void 0, + type: void 0, + title: void 0, + length: void 0 + }, this.address = void 0, this.phoneNumber = void 0, this.snippet = void 0, this.extendedData = void 0; +} +KmlDataSource._DeferredLoading = DeferredLoading; +KmlDataSource._getTimestamp = getTimestamp$1; +function Visualizer() { + DeveloperError.throwInstantiationError(); +} +Visualizer.prototype.update = DeveloperError.throwInstantiationError; +Visualizer.prototype.getBoundingSphere = DeveloperError.throwInstantiationError; +Visualizer.prototype.isDestroyed = DeveloperError.throwInstantiationError; +Visualizer.prototype.destroy = DeveloperError.throwInstantiationError; +const BILLBOARD_SIZE = 32, kmlNamespace = "http://www.opengis.net/kml/2.2", gxNamespace = "http://www.google.com/kml/ext/2.2", xmlnsNamespace = "http://www.w3.org/2000/xmlns/"; +function ExternalFileHandler(e) { + this._files = {}, this._promises = [], this._count = 0, this._modelCallback = e; +} +const imageTypeRegex = /^data:image\/([^,;]+)/; +ExternalFileHandler.prototype.texture = function(e) { + const t = this; + let n; + if (typeof e == "string" || e instanceof Resource) { + if (e = Resource.createIfNeeded(e), !e.isDataUri) + return e.url; + const i = e.url.match(imageTypeRegex); + n = `texture_${++this._count}`, defined(i) && (n += `.${i[1]}`); + const r = e.fetchBlob().then(function(o) { + t._files[n] = o; + }); + return this._promises.push(r), n; + } + if (e instanceof HTMLCanvasElement) { + n = `texture_${++this._count}.png`; + const i = new Promise((r) => { + e.toBlob(function(o) { + t._files[n] = o, r(); + }); + }); + return this._promises.push(i), n; + } + return ""; +}; +function getModelBlobHander(e, t) { + return function(n) { + e._files[t] = n; + }; +} +ExternalFileHandler.prototype.model = function(e, t) { + const n = this._modelCallback; + if (!defined(n)) + throw new RuntimeError( + "Encountered a model entity while exporting to KML, but no model callback was supplied." + ); + const i = {}, r = n(e, t, i); + for (const o in i) + if (i.hasOwnProperty(o)) { + const s = Promise.resolve(i[o]); + this._promises.push(s), s.then(getModelBlobHander(this, o)); + } + return r; +}; +Object.defineProperties(ExternalFileHandler.prototype, { + promise: { + get: function() { + return Promise.all(this._promises); + } + }, + files: { + get: function() { + return this._files; + } + } +}); +function ValueGetter(e) { + this._time = e; +} +ValueGetter.prototype.get = function(e, t, n) { + let i; + return defined(e) && (i = defined(e.getValue) ? e.getValue(this._time, n) : e), defaultValue(i, t); +}; +ValueGetter.prototype.getColor = function(e, t) { + const n = this.get(e, t); + if (defined(n)) + return colorToString(n); +}; +ValueGetter.prototype.getMaterialType = function(e) { + if (defined(e)) + return e.getType(this._time); +}; +function StyleCache() { + this._ids = {}, this._styles = {}, this._count = 0; +} +StyleCache.prototype.get = function(e) { + const t = this._ids, n = e.innerHTML; + if (defined(t[n])) + return t[n]; + let i = `style-${++this._count}`; + return e.setAttribute("id", i), i = `#${i}`, t[n] = i, this._styles[n] = e, i; +}; +StyleCache.prototype.save = function(e) { + const t = this._styles, n = e.childNodes[0]; + for (const i in t) + t.hasOwnProperty(i) && e.insertBefore(t[i], n); +}; +function IdManager() { + this._ids = {}; +} +IdManager.prototype.get = function(e) { + if (!defined(e)) + return this.get(createGuid()); + const t = this._ids; + return defined(t[e]) ? `${e.toString()}-${++t[e]}` : (t[e] = 0, e); +}; +function exportKml(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.entities, n = defaultValue(e.kmz, !1), i = exportKml._createState(e), r = t.values.filter(function(d) { + return !defined(d.parent); + }), o = i.kmlDoc, s = o.documentElement; + s.setAttributeNS(xmlnsNamespace, "xmlns:gx", gxNamespace); + const c = o.createElement("Document"); + s.appendChild(c), recurseEntities(i, c, r), i.styleCache.save(c); + const l = i.externalFileHandler; + return l.promise.then(function() { + const f = new XMLSerializer().serializeToString(i.kmlDoc); + return n ? createKmz(f, l.files) : { + kml: f, + externalFiles: l.files + }; + }); +} +function createKmz(e, t) { + const n = buildModuleUrl("ThirdParty/Workers/z-worker-pako.js"); + configure({ + workerScripts: { + deflate: [n, "./pako_deflate.min.js"], + inflate: [n, "./pako_inflate.min.js"] + } + }); + const i = new BlobWriter(), r = new ZipWriter(i); + return r.add("doc.kml", new TextReader(e)).then(function() { + const o = Object.keys(t); + return addExternalFilesToZip(r, o, t, 0); + }).then(function() { + return r.close(); + }).then(function(o) { + return { + kmz: o + }; + }); +} +function addExternalFilesToZip(e, t, n, i) { + if (t.length === i) + return; + const r = t[i]; + return e.add(r, new BlobReader(n[r])).then(function() { + return addExternalFilesToZip(e, t, n, i + 1); + }); +} +exportKml._createState = function(e) { + const t = e.entities, n = new StyleCache(), i = t.computeAvailability(), r = defined(e.time) ? e.time : i.start; + let o = defaultValue( + e.defaultAvailability, + i + ); + const s = defaultValue(e.sampleDuration, 60); + o.start === Iso8601.MINIMUM_VALUE ? o.stop === Iso8601.MAXIMUM_VALUE ? o = new TimeInterval() : JulianDate.addSeconds( + o.stop, + -10 * s, + o.start + ) : o.stop === Iso8601.MAXIMUM_VALUE && JulianDate.addSeconds( + o.start, + 10 * s, + o.stop + ); + const c = new ExternalFileHandler(e.modelCallback); + return { + kmlDoc: document.implementation.createDocument(kmlNamespace, "kml"), + ellipsoid: defaultValue(e.ellipsoid, Ellipsoid.default), + idManager: new IdManager(), + styleCache: n, + externalFileHandler: c, + time: r, + valueGetter: new ValueGetter(r), + sampleDuration: s, + // Wrap it in a TimeIntervalCollection because that is what entity.availability is + defaultAvailability: new TimeIntervalCollection([o]) + }; +}; +function recurseEntities(e, t, n) { + const i = e.kmlDoc, r = e.styleCache, o = e.valueGetter, s = e.idManager, c = n.length; + let l, d, f; + for (let h = 0; h < c; ++h) { + const p = n[h]; + l = [], d = [], f = [], createPoint(e, p, d, f), createLineString(e, p.polyline, d, f), createPolygon(e, p.rectangle, d, f, l), createPolygon(e, p.polygon, d, f, l), createModel(e, p, p.model, d, f); + let m; + const _ = p.availability; + defined(_) && (m = i.createElement("TimeSpan"), JulianDate.equals(_.start, Iso8601.MINIMUM_VALUE) || m.appendChild( + createBasicElementWithText( + i, + "begin", + JulianDate.toIso8601(_.start) + ) + ), JulianDate.equals(_.stop, Iso8601.MAXIMUM_VALUE) || m.appendChild( + createBasicElementWithText( + i, + "end", + JulianDate.toIso8601(_.stop) + ) + )); + for (let T = 0; T < l.length; ++T) { + const x = l[T]; + x.setAttribute("id", s.get(p.id)), x.appendChild( + createBasicElementWithText(i, "name", p.name) + ), x.appendChild( + createBasicElementWithText(i, "visibility", p.show) + ), x.appendChild( + createBasicElementWithText(i, "description", p.description) + ), defined(m) && x.appendChild(m), t.appendChild(x); + } + const y = d.length; + if (y > 0) { + const T = i.createElement("Placemark"); + T.setAttribute("id", s.get(p.id)); + let x = p.name; + const b = p.label; + if (defined(b)) { + const E = i.createElement("LabelStyle"), A = o.get(b.text); + x = defined(A) && A.length > 0 ? A : x; + const D = o.getColor(b.fillColor); + defined(D) && (E.appendChild( + createBasicElementWithText(i, "color", D) + ), E.appendChild( + createBasicElementWithText(i, "colorMode", "normal") + )); + const P = o.get(b.scale); + defined(P) && E.appendChild( + createBasicElementWithText(i, "scale", P) + ), f.push(E); + } + T.appendChild(createBasicElementWithText(i, "name", x)), T.appendChild( + createBasicElementWithText(i, "visibility", p.show) + ), T.appendChild( + createBasicElementWithText(i, "description", p.description) + ), defined(m) && T.appendChild(m), t.appendChild(T); + const S = f.length; + if (S > 0) { + const E = i.createElement("Style"); + for (let A = 0; A < S; ++A) + E.appendChild(f[A]); + T.appendChild( + createBasicElementWithText(i, "styleUrl", r.get(E)) + ); + } + if (d.length === 1) + T.appendChild(d[0]); + else if (d.length > 1) { + const E = i.createElement("MultiGeometry"); + for (let A = 0; A < y; ++A) + E.appendChild(d[A]); + T.appendChild(E); + } + } + const C = p._children; + if (C.length > 0) { + const T = i.createElement("Folder"); + T.setAttribute("id", s.get(p.id)), T.appendChild( + createBasicElementWithText(i, "name", p.name) + ), T.appendChild( + createBasicElementWithText(i, "visibility", p.show) + ), T.appendChild( + createBasicElementWithText(i, "description", p.description) + ), t.appendChild(T), recurseEntities(e, T, C); + } + } +} +const scratchCartesian3$3 = new Cartesian3(), scratchCartographic$6 = new Cartographic(), scratchJulianDate = new JulianDate(); +function createPoint(e, t, n, i) { + const r = e.kmlDoc, o = e.ellipsoid, s = e.valueGetter, c = defaultValue(t.billboard, t.point); + if (!defined(c) && !defined(t.path)) + return; + const l = t.position; + if (!l.isConstant) { + createTracks(e, t, c, n, i); + return; + } + s.get(l, void 0, scratchCartesian3$3); + const d = createBasicElementWithText( + r, + "coordinates", + getCoordinates(scratchCartesian3$3, o) + ), f = r.createElement("Point"), h = r.createElement("altitudeMode"); + h.appendChild( + getAltitudeMode(e, c.heightReference) + ), f.appendChild(h), f.appendChild(d), n.push(f); + const p = c instanceof BillboardGraphics ? createIconStyleFromBillboard(e, c) : createIconStyleFromPoint(e, c); + i.push(p); +} +function createTracks(e, t, n, i, r) { + const o = e.kmlDoc, s = e.ellipsoid, c = e.valueGetter; + let l; + const d = t.position; + let f = !0; + d instanceof CompositePositionProperty ? (l = d.intervals, f = !1) : l = defaultValue(t.availability, e.defaultAvailability); + const h = n instanceof ModelGraphics; + let p, m, _; + const y = []; + for (p = 0; p < l.length; ++p) { + const T = l.get(p); + let x = f ? d : T.data; + const b = o.createElement("altitudeMode"); + x instanceof ScaledPositionProperty ? (x = x._value, b.appendChild( + getAltitudeMode(e, HeightReference$1.CLAMP_TO_GROUND) + )) : defined(n) ? b.appendChild( + getAltitudeMode(e, n.heightReference) + ) : b.appendChild( + getAltitudeMode(e, HeightReference$1.NONE) + ); + const S = [], E = []; + if (x.isConstant) { + c.get(x, void 0, scratchCartesian3$3); + const D = createBasicElementWithText( + o, + "coordinates", + getCoordinates(scratchCartesian3$3, s) + ); + S.push(JulianDate.toIso8601(T.start)), E.push(D), S.push(JulianDate.toIso8601(T.stop)), E.push(D); + } else if (x instanceof SampledPositionProperty) + for (_ = x._property._times, m = 0; m < _.length; ++m) + S.push(JulianDate.toIso8601(_[m])), x.getValueInReferenceFrame( + _[m], + ReferenceFrame$1.FIXED, + scratchCartesian3$3 + ), E.push(getCoordinates(scratchCartesian3$3, s)); + else if (x instanceof SampledProperty) { + _ = x._times; + const D = x._values; + for (m = 0; m < _.length; ++m) + S.push(JulianDate.toIso8601(_[m])), Cartesian3.fromArray(D, m * 3, scratchCartesian3$3), E.push(getCoordinates(scratchCartesian3$3, s)); + } else { + const D = e.sampleDuration; + T.start.clone(scratchJulianDate), T.isStartIncluded || JulianDate.addSeconds(scratchJulianDate, D, scratchJulianDate); + const P = T.stop; + for (; JulianDate.lessThan(scratchJulianDate, P); ) + x.getValue(scratchJulianDate, scratchCartesian3$3), S.push(JulianDate.toIso8601(scratchJulianDate)), E.push(getCoordinates(scratchCartesian3$3, s)), JulianDate.addSeconds(scratchJulianDate, D, scratchJulianDate); + T.isStopIncluded && JulianDate.equals(scratchJulianDate, P) && (x.getValue(scratchJulianDate, scratchCartesian3$3), S.push(JulianDate.toIso8601(scratchJulianDate)), E.push(getCoordinates(scratchCartesian3$3, s))); + } + const A = o.createElementNS(gxNamespace, "Track"); + A.appendChild(b); + for (let D = 0; D < S.length; ++D) { + const P = createBasicElementWithText(o, "when", S[D]), I = createBasicElementWithText( + o, + "coord", + E[D], + gxNamespace + ); + A.appendChild(P), A.appendChild(I); + } + h && A.appendChild(createModelGeometry(e, n)), y.push(A); + } + if (y.length === 1) + i.push(y[0]); + else if (y.length > 1) { + const T = o.createElementNS( + gxNamespace, + "MultiTrack" + ); + for (p = 0; p < y.length; ++p) + T.appendChild(y[p]); + i.push(T); + } + if (defined(n) && !h) { + const T = n instanceof BillboardGraphics ? createIconStyleFromBillboard(e, n) : createIconStyleFromPoint(e, n); + r.push(T); + } + const C = t.path; + if (defined(C)) { + const T = c.get(C.width), x = C.material; + if (defined(x) || defined(T)) { + const b = o.createElement("LineStyle"); + defined(T) && b.appendChild( + createBasicElementWithText(o, "width", T) + ), processMaterial(e, x, b), r.push(b); + } + } +} +function createIconStyleFromPoint(e, t) { + const n = e.kmlDoc, i = e.valueGetter, r = n.createElement("IconStyle"), o = i.getColor(t.color); + defined(o) && (r.appendChild(createBasicElementWithText(n, "color", o)), r.appendChild( + createBasicElementWithText(n, "colorMode", "normal") + )); + const s = i.get(t.pixelSize); + return defined(s) && r.appendChild( + createBasicElementWithText(n, "scale", s / BILLBOARD_SIZE) + ), r; +} +function createIconStyleFromBillboard(e, t) { + const n = e.kmlDoc, i = e.valueGetter, r = e.externalFileHandler, o = n.createElement("IconStyle"); + let s = i.get(t.image); + if (defined(s)) { + s = r.texture(s); + const p = n.createElement("Icon"); + p.appendChild(createBasicElementWithText(n, "href", s)); + const m = i.get(t.imageSubRegion); + defined(m) && (p.appendChild( + createBasicElementWithText(n, "x", m.x, gxNamespace) + ), p.appendChild( + createBasicElementWithText(n, "y", m.y, gxNamespace) + ), p.appendChild( + createBasicElementWithText( + n, + "w", + m.width, + gxNamespace + ) + ), p.appendChild( + createBasicElementWithText( + n, + "h", + m.height, + gxNamespace + ) + )), o.appendChild(p); + } + const c = i.getColor(t.color); + defined(c) && (o.appendChild(createBasicElementWithText(n, "color", c)), o.appendChild( + createBasicElementWithText(n, "colorMode", "normal") + )); + let l = i.get(t.scale); + defined(l) && o.appendChild(createBasicElementWithText(n, "scale", l)); + const d = i.get(t.pixelOffset); + if (defined(d)) { + l = defaultValue(l, 1), Cartesian2.divideByScalar(d, l, d); + const p = i.get(t.width, BILLBOARD_SIZE), m = i.get(t.height, BILLBOARD_SIZE), _ = i.get( + t.horizontalOrigin, + HorizontalOrigin$1.CENTER + ); + _ === HorizontalOrigin$1.CENTER ? d.x -= p * 0.5 : _ === HorizontalOrigin$1.RIGHT && (d.x -= p); + const y = i.get( + t.verticalOrigin, + VerticalOrigin$1.CENTER + ); + y === VerticalOrigin$1.TOP ? d.y += m : y === VerticalOrigin$1.CENTER && (d.y += m * 0.5); + const C = n.createElement("hotSpot"); + C.setAttribute("x", -d.x), C.setAttribute("y", d.y), C.setAttribute("xunits", "pixels"), C.setAttribute("yunits", "pixels"), o.appendChild(C); + } + let f = i.get(t.rotation); + const h = i.get(t.alignedAxis); + return defined(f) && Cartesian3.equals(Cartesian3.UNIT_Z, h) && (f = CesiumMath.toDegrees(-f), f === 0 && (f = 360), o.appendChild( + createBasicElementWithText(n, "heading", f) + )), o; +} +function createLineString(e, t, n, i) { + const r = e.kmlDoc, o = e.ellipsoid, s = e.valueGetter; + if (!defined(t)) + return; + const c = r.createElement("LineString"), l = r.createElement("altitudeMode"), d = s.get(t.clampToGround, !1); + let f; + d ? (c.appendChild( + createBasicElementWithText(r, "tessellate", !0) + ), f = r.createTextNode("clampToGround")) : f = r.createTextNode("absolute"), l.appendChild(f), c.appendChild(l); + const h = t.positions, p = s.get(h), m = createBasicElementWithText( + r, + "coordinates", + getCoordinates(p, o) + ); + c.appendChild(m); + const _ = s.get(t.zIndex); + d && defined(_) && c.appendChild( + createBasicElementWithText(r, "drawOrder", _, gxNamespace) + ), n.push(c); + const y = r.createElement("LineStyle"), C = s.get(t.width); + defined(C) && y.appendChild(createBasicElementWithText(r, "width", C)), processMaterial(e, t.material, y), i.push(y); +} +function getRectangleBoundaries(e, t, n) { + const i = e.kmlDoc, r = e.valueGetter; + let o = r.get(t.height, 0); + n > 0 && (o = n); + const s = t.coordinates, c = r.get(s), l = [], d = [ + Rectangle.northeast, + Rectangle.southeast, + Rectangle.southwest, + Rectangle.northwest + ]; + for (let m = 0; m < 4; ++m) + d[m](c, scratchCartographic$6), l.push( + `${CesiumMath.toDegrees( + scratchCartographic$6.longitude + )},${CesiumMath.toDegrees(scratchCartographic$6.latitude)},${o}` + ); + const f = createBasicElementWithText( + i, + "coordinates", + l.join(" ") + ), h = i.createElement("outerBoundaryIs"), p = i.createElement("LinearRing"); + return p.appendChild(f), h.appendChild(p), [h]; +} +function getLinearRing(e, t, n, i) { + const r = e.kmlDoc, o = e.ellipsoid, s = [], c = t.length; + for (let f = 0; f < c; ++f) + Cartographic.fromCartesian(t[f], o, scratchCartographic$6), s.push( + `${CesiumMath.toDegrees( + scratchCartographic$6.longitude + )},${CesiumMath.toDegrees(scratchCartographic$6.latitude)},${i ? scratchCartographic$6.height : n}` + ); + const l = createBasicElementWithText( + r, + "coordinates", + s.join(" ") + ), d = r.createElement("LinearRing"); + return d.appendChild(l), d; +} +function getPolygonBoundaries(e, t, n) { + const i = e.kmlDoc, r = e.valueGetter; + let o = r.get(t.height, 0); + const s = r.get( + t.perPositionHeight, + !1 + ); + !s && n > 0 && (o = n); + const c = [], l = t.hierarchy, d = r.get(l), f = Array.isArray(d) ? d : d.positions, h = i.createElement("outerBoundaryIs"); + h.appendChild( + getLinearRing(e, f, o, s) + ), c.push(h); + const p = d.holes; + if (defined(p)) { + const m = p.length; + for (let _ = 0; _ < m; ++_) { + const y = i.createElement("innerBoundaryIs"); + y.appendChild( + getLinearRing(e, p[_].positions, o, s) + ), c.push(y); + } + } + return c; +} +function createPolygon(e, t, n, i, r) { + const o = e.kmlDoc, s = e.valueGetter; + if (!defined(t)) + return; + const c = t instanceof RectangleGraphics; + if (c && s.getMaterialType(t.material) === "Image") { + createGroundOverlay(e, t, r); + return; + } + const l = o.createElement("Polygon"), d = s.get(t.extrudedHeight, 0); + d > 0 && l.appendChild( + createBasicElementWithText(o, "extrude", !0) + ); + const f = c ? getRectangleBoundaries(e, t, d) : getPolygonBoundaries(e, t, d), h = f.length; + for (let C = 0; C < h; ++C) + l.appendChild(f[C]); + const p = o.createElement("altitudeMode"); + p.appendChild(getAltitudeMode(e, t.heightReference)), l.appendChild(p), n.push(l); + const m = o.createElement("PolyStyle"), _ = s.get(t.fill, !1); + _ && m.appendChild(createBasicElementWithText(o, "fill", _)), processMaterial(e, t.material, m); + const y = s.get(t.outline, !1); + if (y) { + m.appendChild( + createBasicElementWithText(o, "outline", y) + ); + const C = o.createElement("LineStyle"), T = s.get(t.outlineWidth, 1); + C.appendChild( + createBasicElementWithText(o, "width", T) + ); + const x = s.getColor( + t.outlineColor, + Color.BLACK + ); + C.appendChild( + createBasicElementWithText(o, "color", x) + ), C.appendChild( + createBasicElementWithText(o, "colorMode", "normal") + ), i.push(C); + } + i.push(m); +} +function createGroundOverlay(e, t, n) { + const i = e.kmlDoc, r = e.valueGetter, o = e.externalFileHandler, s = i.createElement("GroundOverlay"), c = i.createElement("altitudeMode"); + c.appendChild( + getAltitudeMode(e, t.heightReference) + ), s.appendChild(c); + const l = r.get(t.height); + defined(l) && s.appendChild( + createBasicElementWithText(i, "altitude", l) + ); + const d = r.get(t.coordinates), f = i.createElement("LatLonBox"); + f.appendChild( + createBasicElementWithText( + i, + "north", + CesiumMath.toDegrees(d.north) + ) + ), f.appendChild( + createBasicElementWithText( + i, + "south", + CesiumMath.toDegrees(d.south) + ) + ), f.appendChild( + createBasicElementWithText( + i, + "east", + CesiumMath.toDegrees(d.east) + ) + ), f.appendChild( + createBasicElementWithText( + i, + "west", + CesiumMath.toDegrees(d.west) + ) + ), s.appendChild(f); + const h = r.get(t.material), p = o.texture(h.image), m = i.createElement("Icon"); + m.appendChild(createBasicElementWithText(i, "href", p)), s.appendChild(m); + const _ = h.color; + defined(_) && s.appendChild( + createBasicElementWithText(i, "color", colorToString(h.color)) + ), n.push(s); +} +function createModelGeometry(e, t) { + const n = e.kmlDoc, i = e.valueGetter, r = e.externalFileHandler, o = n.createElement("Model"), s = i.get(t.scale); + if (defined(s)) { + const d = n.createElement("scale"); + d.appendChild(createBasicElementWithText(n, "x", s)), d.appendChild(createBasicElementWithText(n, "y", s)), d.appendChild(createBasicElementWithText(n, "z", s)), o.appendChild(d); + } + const c = n.createElement("Link"), l = r.model(t, e.time); + return c.appendChild(createBasicElementWithText(n, "href", l)), o.appendChild(c), o; +} +function createModel(e, t, n, i, r) { + const o = e.kmlDoc, s = e.ellipsoid, c = e.valueGetter; + if (!defined(n)) + return; + const l = t.position; + if (!l.isConstant) { + createTracks(e, t, n, i, r); + return; + } + const d = createModelGeometry(e, n), f = o.createElement("altitudeMode"); + f.appendChild( + getAltitudeMode(e, n.heightReference) + ), d.appendChild(f), c.get(l, void 0, scratchCartesian3$3), Cartographic.fromCartesian(scratchCartesian3$3, s, scratchCartographic$6); + const h = o.createElement("Location"); + h.appendChild( + createBasicElementWithText( + o, + "longitude", + CesiumMath.toDegrees(scratchCartographic$6.longitude) + ) + ), h.appendChild( + createBasicElementWithText( + o, + "latitude", + CesiumMath.toDegrees(scratchCartographic$6.latitude) + ) + ), h.appendChild( + createBasicElementWithText(o, "altitude", scratchCartographic$6.height) + ), d.appendChild(h), i.push(d); +} +function processMaterial(e, t, n) { + const i = e.kmlDoc, r = e.valueGetter; + if (!defined(t)) + return; + const o = r.get(t); + if (!defined(o)) + return; + let s; + const c = r.getMaterialType(t); + let l, d; + switch (c) { + case "Image": + s = colorToString(Color.WHITE); + break; + case "Color": + case "Grid": + case "PolylineGlow": + case "PolylineArrow": + case "PolylineDash": + s = colorToString(o.color); + break; + case "PolylineOutline": + s = colorToString(o.color), l = colorToString(o.outlineColor), d = o.outlineWidth, n.appendChild( + createBasicElementWithText( + i, + "outerColor", + l, + gxNamespace + ) + ), n.appendChild( + createBasicElementWithText( + i, + "outerWidth", + d, + gxNamespace + ) + ); + break; + case "Stripe": + s = colorToString(o.oddColor); + break; + } + defined(s) && (n.appendChild(createBasicElementWithText(i, "color", s)), n.appendChild( + createBasicElementWithText(i, "colorMode", "normal") + )); +} +function getAltitudeMode(e, t) { + const n = e.kmlDoc, r = e.valueGetter.get( + t, + HeightReference$1.NONE + ); + let o; + switch (r) { + case HeightReference$1.NONE: + o = n.createTextNode("absolute"); + break; + case HeightReference$1.CLAMP_TO_GROUND: + o = n.createTextNode("clampToGround"); + break; + case HeightReference$1.RELATIVE_TO_GROUND: + o = n.createTextNode("relativeToGround"); + break; + } + return o; +} +function getCoordinates(e, t) { + Array.isArray(e) || (e = [e]); + const n = e.length, i = []; + for (let r = 0; r < n; ++r) + Cartographic.fromCartesian(e[r], t, scratchCartographic$6), i.push( + `${CesiumMath.toDegrees( + scratchCartographic$6.longitude + )},${CesiumMath.toDegrees(scratchCartographic$6.latitude)},${scratchCartographic$6.height}` + ); + return i.join(" "); +} +function createBasicElementWithText(e, t, n, i) { + n = defaultValue(n, ""), typeof n == "boolean" && (n = n ? "1" : "0"); + const r = defined(i) ? e.createElementNS(i, t) : e.createElement(t), o = n === "string" && n.indexOf("<") !== -1 ? e.createCDATASection(n) : e.createTextNode(n); + return r.appendChild(o), r; +} +function colorToString(e) { + let t = ""; + const n = e.toBytes(); + for (let i = 3; i >= 0; --i) + t += n[i] < 16 ? `0${n[i].toString(16)}` : n[i].toString(16); + return t; +} +const AdjustTranslucentFS = `#ifdef MRT +layout (location = 0) out vec4 out_FragData_0; +layout (location = 1) out vec4 out_FragData_1; +#else +layout (location = 0) out vec4 out_FragColor; +#endif + +uniform vec4 u_bgColor; +uniform sampler2D u_depthTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + if (texture(u_depthTexture, v_textureCoordinates).r < 1.0) + { +#ifdef MRT + out_FragData_0 = u_bgColor; + out_FragData_1 = vec4(u_bgColor.a); +#else + out_FragColor = u_bgColor; +#endif + return; + } + + discard; +} +`, AtmosphereCommon = `uniform vec3 u_radiiAndDynamicAtmosphereColor; + +uniform float u_atmosphereLightIntensity; +uniform float u_atmosphereRayleighScaleHeight; +uniform float u_atmosphereMieScaleHeight; +uniform float u_atmosphereMieAnisotropy; +uniform vec3 u_atmosphereRayleighCoefficient; +uniform vec3 u_atmosphereMieCoefficient; + +const float ATMOSPHERE_THICKNESS = 111e3; // The thickness of the atmosphere in meters. +const int PRIMARY_STEPS_MAX = 16; // Maximum number of times the ray from the camera to the world position (primary ray) is sampled. +const int LIGHT_STEPS_MAX = 4; // Maximum number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. + +/** + * This function computes the colors contributed by Rayliegh and Mie scattering on a given ray, as well as + * the transmittance value for the ray. + * + * @param {czm_ray} primaryRay The ray from the camera to the position. + * @param {float} primaryRayLength The length of the primary ray. + * @param {vec3} lightDirection The direction of the light to calculate the scattering from. + * @param {vec3} rayleighColor The variable the Rayleigh scattering will be written to. + * @param {vec3} mieColor The variable the Mie scattering will be written to. + * @param {float} opacity The variable the transmittance will be written to. + * @glslFunction + */ +void computeScattering( + czm_ray primaryRay, + float primaryRayLength, + vec3 lightDirection, + float atmosphereInnerRadius, + out vec3 rayleighColor, + out vec3 mieColor, + out float opacity +) { + + // Initialize the default scattering amounts to 0. + rayleighColor = vec3(0.0); + mieColor = vec3(0.0); + opacity = 0.0; + + float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; + + vec3 origin = vec3(0.0); + + // Calculate intersection from the camera to the outer ring of the atmosphere. + czm_raySegment primaryRayAtmosphereIntersect = czm_raySphereIntersectionInterval(primaryRay, origin, atmosphereOuterRadius); + + // Return empty colors if no intersection with the atmosphere geometry. + if (primaryRayAtmosphereIntersect == czm_emptyRaySegment) { + return; + } + + // To deal with smaller values of PRIMARY_STEPS (e.g. 4) + // we implement a split strategy: sky or horizon. + // For performance reasons, instead of a if/else branch + // a soft choice is implemented through a weight 0.0 <= w_stop_gt_lprl <= 1.0 + float x = 1e-7 * primaryRayAtmosphereIntersect.stop / length(primaryRayLength); + // Value close to 0.0: close to the horizon + // Value close to 1.0: above in the sky + float w_stop_gt_lprl = 0.5 * (1.0 + czm_approximateTanh(x)); + + // The ray should start from the first intersection with the outer atmopshere, or from the camera position, if it is inside the atmosphere. + float start_0 = primaryRayAtmosphereIntersect.start; + primaryRayAtmosphereIntersect.start = max(primaryRayAtmosphereIntersect.start, 0.0); + // The ray should end at the exit from the atmosphere or at the distance to the vertex, whichever is smaller. + primaryRayAtmosphereIntersect.stop = min(primaryRayAtmosphereIntersect.stop, length(primaryRayLength)); + + // For the number of ray steps, distinguish inside or outside atmosphere (outer space) + // (1) from outer space we have to use more ray steps to get a realistic rendering + // (2) within atmosphere we need fewer steps for faster rendering + float x_o_a = start_0 - ATMOSPHERE_THICKNESS; // ATMOSPHERE_THICKNESS used as an ad-hoc constant, no precise meaning here, only the order of magnitude matters + float w_inside_atmosphere = 1.0 - 0.5 * (1.0 + czm_approximateTanh(x_o_a)); + int PRIMARY_STEPS = PRIMARY_STEPS_MAX - int(w_inside_atmosphere * 12.0); // Number of times the ray from the camera to the world position (primary ray) is sampled. + int LIGHT_STEPS = LIGHT_STEPS_MAX - int(w_inside_atmosphere * 2.0); // Number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. + + // Setup for sampling positions along the ray - starting from the intersection with the outer ring of the atmosphere. + float rayPositionLength = primaryRayAtmosphereIntersect.start; + // (1) Outside the atmosphere: constant rayStepLength + // (2) Inside atmosphere: variable rayStepLength to compensate the rough rendering of the smaller number of ray steps + float totalRayLength = primaryRayAtmosphereIntersect.stop - rayPositionLength; + float rayStepLengthIncrease = w_inside_atmosphere * ((1.0 - w_stop_gt_lprl) * totalRayLength / (float(PRIMARY_STEPS * (PRIMARY_STEPS + 1)) / 2.0)); + float rayStepLength = max(1.0 - w_inside_atmosphere, w_stop_gt_lprl) * totalRayLength / max(7.0 * w_inside_atmosphere, float(PRIMARY_STEPS)); + + vec3 rayleighAccumulation = vec3(0.0); + vec3 mieAccumulation = vec3(0.0); + vec2 opticalDepth = vec2(0.0); + vec2 heightScale = vec2(u_atmosphereRayleighScaleHeight, u_atmosphereMieScaleHeight); + + // Sample positions on the primary ray. + for (int i = 0; i < PRIMARY_STEPS_MAX; ++i) { + + // The loop should be: for (int i = 0; i < PRIMARY_STEPS; ++i) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to break early instead + if (i >= PRIMARY_STEPS) { + break; + } + + // Calculate sample position along viewpoint ray. + vec3 samplePosition = primaryRay.origin + primaryRay.direction * (rayPositionLength + rayStepLength); + + // Calculate height of sample position above ellipsoid. + float sampleHeight = length(samplePosition) - atmosphereInnerRadius; + + // Calculate and accumulate density of particles at the sample position. + vec2 sampleDensity = exp(-sampleHeight / heightScale) * rayStepLength; + opticalDepth += sampleDensity; + + // Generate ray from the sample position segment to the light source, up to the outer ring of the atmosphere. + czm_ray lightRay = czm_ray(samplePosition, lightDirection); + czm_raySegment lightRayAtmosphereIntersect = czm_raySphereIntersectionInterval(lightRay, origin, atmosphereOuterRadius); + + float lightStepLength = lightRayAtmosphereIntersect.stop / float(LIGHT_STEPS); + float lightPositionLength = 0.0; + + vec2 lightOpticalDepth = vec2(0.0); + + // Sample positions along the light ray, to accumulate incidence of light on the latest sample segment. + for (int j = 0; j < LIGHT_STEPS_MAX; ++j) { + + // The loop should be: for (int j = 0; i < LIGHT_STEPS; ++j) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to break early instead + if (j >= LIGHT_STEPS) { + break; + } + + // Calculate sample position along light ray. + vec3 lightPosition = samplePosition + lightDirection * (lightPositionLength + lightStepLength * 0.5); + + // Calculate height of the light sample position above ellipsoid. + float lightHeight = length(lightPosition) - atmosphereInnerRadius; + + // Calculate density of photons at the light sample position. + lightOpticalDepth += exp(-lightHeight / heightScale) * lightStepLength; + + // Increment distance on light ray. + lightPositionLength += lightStepLength; + } + + // Compute attenuation via the primary ray and the light ray. + vec3 attenuation = exp(-((u_atmosphereMieCoefficient * (opticalDepth.y + lightOpticalDepth.y)) + (u_atmosphereRayleighCoefficient * (opticalDepth.x + lightOpticalDepth.x)))); + + // Accumulate the scattering. + rayleighAccumulation += sampleDensity.x * attenuation; + mieAccumulation += sampleDensity.y * attenuation; + + // Increment distance on primary ray. + rayPositionLength += (rayStepLength += rayStepLengthIncrease); + } + + // Compute the scattering amount. + rayleighColor = u_atmosphereRayleighCoefficient * rayleighAccumulation; + mieColor = u_atmosphereMieCoefficient * mieAccumulation; + + // Compute the transmittance i.e. how much light is passing through the atmosphere. + opacity = length(exp(-((u_atmosphereMieCoefficient * opticalDepth.y) + (u_atmosphereRayleighCoefficient * opticalDepth.x)))); +} + +vec4 computeAtmosphereColor( + vec3 positionWC, + vec3 lightDirection, + vec3 rayleighColor, + vec3 mieColor, + float opacity +) { + // Setup the primary ray: from the camera position to the vertex position. + vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; + vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); + + float cosAngle = dot(cameraToPositionWCDirection, lightDirection); + float cosAngleSq = cosAngle * cosAngle; + + float G = u_atmosphereMieAnisotropy; + float GSq = G * G; + + // The Rayleigh phase function. + float rayleighPhase = 3.0 / (50.2654824574) * (1.0 + cosAngleSq); + // The Mie phase function. + float miePhase = 3.0 / (25.1327412287) * ((1.0 - GSq) * (cosAngleSq + 1.0)) / (pow(1.0 + GSq - 2.0 * cosAngle * G, 1.5) * (2.0 + GSq)); + + // The final color is generated by combining the effects of the Rayleigh and Mie scattering. + vec3 rayleigh = rayleighPhase * rayleighColor; + vec3 mie = miePhase * mieColor; + + vec3 color = (rayleigh + mie) * u_atmosphereLightIntensity; + + return vec4(color, opacity); +} +`, BrdfLutGeneratorFS = `in vec2 v_textureCoordinates; +const float M_PI = 3.141592653589793; + +float vdcRadicalInverse(int i) +{ + float r; + float base = 2.0; + float value = 0.0; + float invBase = 1.0 / base; + float invBi = invBase; + for (int x = 0; x < 100; x++) + { + if (i <= 0) + { + break; + } + r = mod(float(i), base); + value += r * invBi; + invBi *= invBase; + i = int(float(i) * invBase); + } + return value; +} + +vec2 hammersley2D(int i, int N) +{ + return vec2(float(i) / float(N), vdcRadicalInverse(i)); +} + +vec3 importanceSampleGGX(vec2 xi, float alphaRoughness, vec3 N) +{ + float alphaRoughnessSquared = alphaRoughness * alphaRoughness; + float phi = 2.0 * M_PI * xi.x; + float cosTheta = sqrt((1.0 - xi.y) / (1.0 + (alphaRoughnessSquared - 1.0) * xi.y)); + float sinTheta = sqrt(1.0 - cosTheta * cosTheta); + vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); + vec3 upVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 tangentX = normalize(cross(upVector, N)); + vec3 tangentY = cross(N, tangentX); + return tangentX * H.x + tangentY * H.y + N * H.z; +} + +/** + * Estimate the geometric self-shadowing of the microfacets in a surface, + * using the Smith Joint GGX visibility function. + * Note: Vis = G / (4 * NdotL * NdotV) + * see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 + * see Real-Time Rendering. Page 331 to 336. + * see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) + * + * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. + * @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source. + * @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera. + */ +float smithVisibilityGGX(float alphaRoughness, float NdotL, float NdotV) +{ + float alphaRoughnessSq = alphaRoughness * alphaRoughness; + + float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + + float GGX = GGXV + GGXL; // 2.0 if NdotL = NdotV = 1.0 + if (GGX > 0.0) + { + return 0.5 / GGX; // 1/4 if NdotL = NdotV = 1.0 + } + return 0.0; +} + +vec2 integrateBrdf(float roughness, float NdotV) +{ + vec3 V = vec3(sqrt(1.0 - NdotV * NdotV), 0.0, NdotV); + float A = 0.0; + float B = 0.0; + const int NumSamples = 1024; + float alphaRoughness = roughness * roughness; + for (int i = 0; i < NumSamples; i++) + { + vec2 xi = hammersley2D(i, NumSamples); + vec3 H = importanceSampleGGX(xi, alphaRoughness, vec3(0.0, 0.0, 1.0)); + vec3 L = 2.0 * dot(V, H) * H - V; + float NdotL = clamp(L.z, 0.0, 1.0); + float NdotH = clamp(H.z, 0.0, 1.0); + float VdotH = clamp(dot(V, H), 0.0, 1.0); + if (NdotL > 0.0) + { + float G = smithVisibilityGGX(alphaRoughness, NdotL, NdotV); + float G_Vis = 4.0 * G * VdotH * NdotL / NdotH; + float Fc = pow(1.0 - VdotH, 5.0); + A += (1.0 - Fc) * G_Vis; + B += Fc * G_Vis; + } + } + return vec2(A, B) / float(NumSamples); +} + +void main() +{ + out_FragColor = vec4(integrateBrdf(v_textureCoordinates.y, v_textureCoordinates.x), 0.0, 1.0); +} +`, CloudCollectionFS = `uniform sampler2D u_noiseTexture; +uniform vec3 u_noiseTextureDimensions; +uniform float u_noiseDetail; +in vec2 v_offset; +in vec3 v_maximumSize; +in vec4 v_color; +in float v_slice; +in float v_brightness; + +float wrap(float value, float rangeLength) { + if(value < 0.0) { + float absValue = abs(value); + float modValue = mod(absValue, rangeLength); + return mod(rangeLength - modValue, rangeLength); + } + return mod(value, rangeLength); +} + +vec3 wrapVec(vec3 value, float rangeLength) { + return vec3(wrap(value.x, rangeLength), + wrap(value.y, rangeLength), + wrap(value.z, rangeLength)); +} + +vec2 voxelToUV(vec3 voxelIndex) { + float textureSliceWidth = u_noiseTextureDimensions.x; + float noiseTextureRows = u_noiseTextureDimensions.y; + float inverseNoiseTextureRows = u_noiseTextureDimensions.z; + + float textureSliceWidthSquared = textureSliceWidth * textureSliceWidth; + vec2 inverseNoiseTextureDimensions = vec2(noiseTextureRows / textureSliceWidthSquared, + inverseNoiseTextureRows / textureSliceWidth); + vec3 wrappedIndex = wrapVec(voxelIndex, textureSliceWidth); + float column = mod(wrappedIndex.z, textureSliceWidth * inverseNoiseTextureRows); + float row = floor(wrappedIndex.z / textureSliceWidth * noiseTextureRows); + + float xPixelCoord = wrappedIndex.x + column * textureSliceWidth; + float yPixelCoord = wrappedIndex.y + row * textureSliceWidth; + return vec2(xPixelCoord, yPixelCoord) * inverseNoiseTextureDimensions; +} + +// Interpolate a voxel with its neighbor (along the positive X-axis) +vec4 lerpSamplesX(vec3 voxelIndex, float x) { + vec2 uv0 = voxelToUV(voxelIndex); + vec2 uv1 = voxelToUV(voxelIndex + vec3(1.0, 0.0, 0.0)); + vec4 sample0 = texture(u_noiseTexture, uv0); + vec4 sample1 = texture(u_noiseTexture, uv1); + return mix(sample0, sample1, x); +} + +vec4 sampleNoiseTexture(vec3 position) { + float textureSliceWidth = u_noiseTextureDimensions.x; + vec3 recenteredPos = position + vec3(textureSliceWidth / 2.0); + vec3 lerpValue = fract(recenteredPos); + vec3 voxelIndex = floor(recenteredPos); + + vec4 xLerp00 = lerpSamplesX(voxelIndex, lerpValue.x); + vec4 xLerp01 = lerpSamplesX(voxelIndex + vec3(0.0, 0.0, 1.0), lerpValue.x); + vec4 xLerp10 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 0.0), lerpValue.x); + vec4 xLerp11 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 1.0), lerpValue.x); + + vec4 yLerp0 = mix(xLerp00, xLerp10, lerpValue.y); + vec4 yLerp1 = mix(xLerp01, xLerp11, lerpValue.y); + return mix(yLerp0, yLerp1, lerpValue.z); +} + +// Intersection with a unit sphere with radius 0.5 at center (0, 0, 0). +bool intersectSphere(vec3 origin, vec3 dir, float slice, + out vec3 point, out vec3 normal) { + float A = dot(dir, dir); + float B = dot(origin, dir); + float C = dot(origin, origin) - 0.25; + float discriminant = (B * B) - (A * C); + if(discriminant < 0.0) { + return false; + } + float root = sqrt(discriminant); + float t = (-B - root) / A; + if(t < 0.0) { + t = (-B + root) / A; + } + point = origin + t * dir; + + if(slice >= 0.0) { + point.z = (slice / 2.0) - 0.5; + if(length(point) > 0.5) { + return false; + } + } + + normal = normalize(point); + point -= czm_epsilon2 * normal; + return true; +} + +// Transforms the ray origin and direction into unit sphere space, +// then transforms the result back into the ellipsoid's space. +bool intersectEllipsoid(vec3 origin, vec3 dir, vec3 center, vec3 scale, float slice, + out vec3 point, out vec3 normal) { + if(scale.x <= 0.01 || scale.y < 0.01 || scale.z < 0.01) { + return false; + } + + vec3 o = (origin - center) / scale; + vec3 d = dir / scale; + vec3 p, n; + bool intersected = intersectSphere(o, d, slice, p, n); + if(intersected) { + point = (p * scale) + center; + normal = n; + } + return intersected; +} + +// Assume that if phase shift is being called for octave i, +// the frequency is of i - 1. This saves us from doing extra +// division / multiplication operations. +vec2 phaseShift2D(vec2 p, vec2 freq) { + return (czm_pi / 2.0) * sin(freq.yx * p.yx); +} + +vec2 phaseShift3D(vec3 p, vec2 freq) { + return phaseShift2D(p.xy, freq) + czm_pi * vec2(sin(freq.x * p.z)); +} + +// The cloud texture function derived from Gardner's 1985 paper, +// "Visual Simulation of Clouds." +// https://www.cs.drexel.edu/~david/Classes/Papers/p297-gardner.pdf +const float T0 = 0.6; // contrast of the texture pattern +const float k = 0.1; // computed to produce a maximum value of 1 +const float C0 = 0.8; // coefficient +const float FX0 = 0.6; // frequency X +const float FY0 = 0.6; // frequency Y +const int octaves = 5; + +float T(vec3 point) { + vec2 sum = vec2(0.0); + float Ci = C0; + vec2 FXY = vec2(FX0, FY0); + vec2 PXY = vec2(0.0); + for(int i = 1; i <= octaves; i++) { + PXY = phaseShift3D(point, FXY); + Ci *= 0.707; + FXY *= 2.0; + vec2 sinTerm = sin(FXY * point.xy + PXY); + sum += Ci * sinTerm + vec2(T0); + } + return k * sum.x * sum.y; +} + +const float a = 0.5; // fraction of surface reflection due to ambient or scattered light, +const float t = 0.4; // fraction of texture shading +const float s = 0.25; // fraction of specular reflection + +float I(float Id, float Is, float It) { + return (1.0 - a) * ((1.0 - t) * ((1.0 - s) * Id + s * Is) + t * It) + a; +} + +const vec3 lightDir = normalize(vec3(0.2, -1.0, 0.7)); + +vec4 drawCloud(vec3 rayOrigin, vec3 rayDir, vec3 cloudCenter, vec3 cloudScale, float cloudSlice, + float brightness) { + vec3 cloudPoint, cloudNormal; + if(!intersectEllipsoid(rayOrigin, rayDir, cloudCenter, cloudScale, cloudSlice, + cloudPoint, cloudNormal)) { + return vec4(0.0); + } + + float Id = clamp(dot(cloudNormal, -lightDir), 0.0, 1.0); // diffuse reflection + float Is = max(pow(dot(-lightDir, -rayDir), 2.0), 0.0); // specular reflection + float It = T(cloudPoint); // texture function + float intensity = I(Id, Is, It); + vec3 color = vec3(intensity * clamp(brightness, 0.1, 1.0)); + + vec4 noise = sampleNoiseTexture(u_noiseDetail * cloudPoint); + float W = noise.x; + float W2 = noise.y; + float W3 = noise.z; + + // The dot product between the cloud's normal and the ray's direction is greatest + // in the center of the ellipsoid's surface. It decreases towards the edge. + // Thus, it is used to blur the areas leading to the edges of the ellipsoid, + // so that no harsh lines appear. + + // The first (and biggest) layer of worley noise is then subtracted from this. + // The final result is scaled up so that the base cloud is not too translucent. + float ndDot = clamp(dot(cloudNormal, -rayDir), 0.0, 1.0); + float TR = pow(ndDot, 3.0) - W; // translucency + TR *= 1.3; + + // Subtracting the second and third layers of worley noise is more complicated. + // If these layers of noise were simply subtracted from the current translucency, + // the shape derived from the first layer of noise would be completely deleted. + // The erosion of this noise should thus be constricted to the edges of the cloud. + // However, because the edges of the ellipsoid were already blurred away, mapping + // the noise to (1.0 - ndDot) will have no impact on most of the cloud's appearance. + // The value of (0.5 - ndDot) provides the best compromise. + float minusDot = 0.5 - ndDot; + + // Even with the previous calculation, subtracting the second layer of wnoise + // erode too much of the cloud. The addition of it, however, will detailed + // volume to the cloud. As long as the noise is only added and not subtracted, + // the results are aesthetically pleasing. + + // The minusDot product is mapped in a way that it is larger at the edges of + // the ellipsoid, so a subtraction and min operation are used instead of + // an addition and max one. + TR -= min(minusDot * W2, 0.0); + + // The third level of worley noise is subtracted from the result, with some + // modifications. First, a scalar is added to minusDot so that the noise + // starts affecting the shape farther away from the center of the ellipsoid's + // surface. Then, it is scaled down so its impact is not too intense. + TR -= 0.8 * (minusDot + 0.25) * W3; + + // The texture function's shading does not correlate with the shape of the cloud + // produced by the layers of noise, so an extra shading scalar is calculated. + // The darkest areas of the cloud are assigned to be where the noise erodes + // the cloud the most. This is then interpolated based on the translucency + // and the diffuse shading term of that point in the cloud. + float shading = mix(1.0 - 0.8 * W * W, 1.0, Id * TR); + + // To avoid values that are too dark, this scalar is increased by a small amount + // and clamped so it never goes to zero. + shading = clamp(shading + 0.2, 0.3, 1.0); + + // Finally, the contrast of the cloud's color is increased. + vec3 finalColor = mix(vec3(0.5), shading * color, 1.15); + return vec4(finalColor, clamp(TR, 0.0, 1.0)) * v_color; +} + +void main() { +#ifdef DEBUG_BILLBOARDS + out_FragColor = vec4(0.0, 0.5, 0.5, 1.0); +#endif + // To avoid calculations with high values, + // we raycast from an arbitrarily smaller space. + vec2 coordinate = v_maximumSize.xy * v_offset; + + vec3 ellipsoidScale = 0.82 * v_maximumSize; + vec3 ellipsoidCenter = vec3(0.0); + + float zOffset = max(ellipsoidScale.z - 10.0, 0.0); + vec3 eye = vec3(0, 0, -10.0 - zOffset); + vec3 rayDir = normalize(vec3(coordinate, 1.0) - eye); + vec3 rayOrigin = eye; +#ifdef DEBUG_ELLIPSOIDS + vec3 point, normal; + if(intersectEllipsoid(rayOrigin, rayDir, ellipsoidCenter, ellipsoidScale, v_slice, + point, normal)) { + out_FragColor = v_brightness * v_color; + } +#else +#ifndef DEBUG_BILLBOARDS + vec4 cloud = drawCloud(rayOrigin, rayDir, + ellipsoidCenter, ellipsoidScale, v_slice, v_brightness); + if(cloud.w < 0.01) { + discard; + } + out_FragColor = cloud; +#endif +#endif +} +`, CloudCollectionVS = `#ifdef INSTANCED +in vec2 direction; +#endif +in vec4 positionHighAndScaleX; +in vec4 positionLowAndScaleY; +in vec4 packedAttribute0; +in vec4 packedAttribute1; +in vec4 color; + +out vec2 v_offset; +out vec3 v_maximumSize; +out vec4 v_color; +out float v_slice; +out float v_brightness; + +void main() { + // Unpack attributes. + vec3 positionHigh = positionHighAndScaleX.xyz; + vec3 positionLow = positionLowAndScaleY.xyz; + vec2 scale = vec2(positionHighAndScaleX.w, positionLowAndScaleY.w); + + float show = packedAttribute0.x; + float brightness = packedAttribute0.y; + vec2 coordinates = packedAttribute0.wz; + vec3 maximumSize = packedAttribute1.xyz; + float slice = packedAttribute1.w; + +#ifdef INSTANCED + vec2 dir = direction; +#else + vec2 dir = coordinates; +#endif + + vec2 offset = dir - vec2(0.5, 0.5); + vec2 scaledOffset = scale * offset; + vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); + vec4 positionEC = czm_modelViewRelativeToEye * p; + positionEC.xy += scaledOffset; + + positionEC.xyz *= show; + gl_Position = czm_projection * positionEC; + + v_offset = offset; + v_maximumSize = maximumSize; + v_color = color; + v_slice = slice; + v_brightness = brightness; +} +`, CloudNoiseFS = `uniform vec3 u_noiseTextureDimensions; +uniform float u_noiseDetail; +uniform vec3 u_noiseOffset; +in vec2 v_position; + +float wrap(float value, float rangeLength) { + if(value < 0.0) { + float absValue = abs(value); + float modValue = mod(absValue, rangeLength); + return mod(rangeLength - modValue, rangeLength); + } + return mod(value, rangeLength); +} + +vec3 wrapVec(vec3 value, float rangeLength) { + return vec3(wrap(value.x, rangeLength), + wrap(value.y, rangeLength), + wrap(value.z, rangeLength)); +} + +vec3 random3(vec3 p) { + float dot1 = dot(p, vec3(127.1, 311.7, 932.8)); + float dot2 = dot(p, vec3(269.5, 183.3, 421.4)); + return fract(vec3(sin(dot1 - dot2), cos(dot1 * dot2), dot1 * dot2)); +} + +// Frequency corresponds to cell size. +// The higher the frequency, the smaller the cell size. +vec3 getWorleyCellPoint(vec3 centerCell, vec3 offset, float freq) { + float textureSliceWidth = u_noiseTextureDimensions.x; + vec3 cell = centerCell + offset; + cell = wrapVec(cell, textureSliceWidth / u_noiseDetail); + cell += floor(u_noiseOffset / u_noiseDetail); + vec3 p = offset + random3(cell); + return p; +} + +float worleyNoise(vec3 p, float freq) { + vec3 centerCell = floor(p * freq); + vec3 pointInCell = fract(p * freq); + float shortestDistance = 1000.0; + + for(float z = -1.0; z <= 1.0; z++) { + for(float y = -1.0; y <= 1.0; y++) { + for(float x = -1.0; x <= 1.0; x++) { + vec3 offset = vec3(x, y, z); + vec3 point = getWorleyCellPoint(centerCell, offset, freq); + + float distance = length(pointInCell - point); + if(distance < shortestDistance) { + shortestDistance = distance; + } + } + } + } + + return shortestDistance; +} + +const float MAX_FBM_ITERATIONS = 10.0; + +float worleyFBMNoise(vec3 p, float octaves, float scale) { + float noise = 0.0; + float freq = 1.0; + float persistence = 0.625; + for(float i = 0.0; i < MAX_FBM_ITERATIONS; i++) { + if(i >= octaves) { + break; + } + + noise += worleyNoise(p * scale, freq * scale) * persistence; + persistence *= 0.5; + freq *= 2.0; + } + return noise; +} + +void main() { + float textureSliceWidth = u_noiseTextureDimensions.x; + float inverseNoiseTextureRows = u_noiseTextureDimensions.z; + float x = mod(v_position.x, textureSliceWidth); + float y = mod(v_position.y, textureSliceWidth); + float sliceRow = floor(v_position.y / textureSliceWidth); + float z = floor(v_position.x / textureSliceWidth) + sliceRow * inverseNoiseTextureRows * textureSliceWidth; + + vec3 position = vec3(x, y, z); + position /= u_noiseDetail; + float worley0 = clamp(worleyFBMNoise(position, 3.0, 1.0), 0.0, 1.0); + float worley1 = clamp(worleyFBMNoise(position, 3.0, 2.0), 0.0, 1.0); + float worley2 = clamp(worleyFBMNoise(position, 3.0, 3.0), 0.0, 1.0); + out_FragColor = vec4(worley0, worley1, worley2, 1.0); +} +`, CloudNoiseVS = `uniform vec3 u_noiseTextureDimensions; +in vec2 position; + +out vec2 v_position; + +void main() +{ + gl_Position = vec4(position, 0.1, 1.0); + + float textureSliceWidth = u_noiseTextureDimensions.x; + float noiseTextureRows = u_noiseTextureDimensions.y; + float inverseNoiseTextureRows = u_noiseTextureDimensions.z; + vec2 transformedPos = (position * 0.5) + vec2(0.5); + transformedPos *= textureSliceWidth; + transformedPos.x *= textureSliceWidth * inverseNoiseTextureRows; + transformedPos.y *= noiseTextureRows; + v_position = transformedPos; +} +`, CompareAndPackTranslucentDepth = `uniform sampler2D u_opaqueDepthTexture; +uniform sampler2D u_translucentDepthTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + float opaqueDepth = texture(u_opaqueDepthTexture, v_textureCoordinates).r; + float translucentDepth = texture(u_translucentDepthTexture, v_textureCoordinates).r; + translucentDepth = czm_branchFreeTernary(translucentDepth > opaqueDepth, 1.0, translucentDepth); + out_FragColor = czm_packDepth(translucentDepth); +} +`, CompositeOITFS = `/** + * Compositing for Weighted Blended Order-Independent Transparency. See: + * - http://jcgt.org/published/0002/02/09/ + * - http://casual-effects.blogspot.com/2014/03/weighted-blended-order-independent.html + */ + +uniform sampler2D u_opaque; +uniform sampler2D u_accumulation; +uniform sampler2D u_revealage; + +in vec2 v_textureCoordinates; + +void main() +{ + vec4 opaque = texture(u_opaque, v_textureCoordinates); + vec4 accum = texture(u_accumulation, v_textureCoordinates); + float r = texture(u_revealage, v_textureCoordinates).r; + +#ifdef MRT + vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a); +#else + vec4 transparent = vec4(accum.rgb / clamp(accum.a, 1e-4, 5e4), r); +#endif + + out_FragColor = (1.0 - transparent.a) * transparent + transparent.a * opaque; + + if (opaque != czm_backgroundColor) + { + out_FragColor.a = 1.0; + } +} +`, DepthPlaneFS = `in vec4 positionEC; + +void main() +{ + vec3 position; + vec3 direction; + if (czm_orthographicIn3D == 1.0) + { + vec2 uv = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; + vec2 minPlane = vec2(czm_frustumPlanes.z, czm_frustumPlanes.y); // left, bottom + vec2 maxPlane = vec2(czm_frustumPlanes.w, czm_frustumPlanes.x); // right, top + position = vec3(mix(minPlane, maxPlane, uv), 0.0); + direction = vec3(0.0, 0.0, -1.0); + } + else + { + position = vec3(0.0); + direction = normalize(positionEC.xyz); + } + + czm_ray ray = czm_ray(position, direction); + + vec3 ellipsoid_center = czm_view[3].xyz; + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); + if (!czm_isEmpty(intersection)) + { + out_FragColor = vec4(1.0, 1.0, 0.0, 1.0); + } + else + { + discard; + } + + czm_writeLogDepth(); +} +`, DepthPlaneVS = `in vec4 position; + +out vec4 positionEC; + +void main() +{ + positionEC = czm_modelView * position; + gl_Position = czm_projection * positionEC; + + czm_vertexLogDepth(); +} +`, EllipsoidFS = `uniform vec3 u_radii; +uniform vec3 u_oneOverEllipsoidRadiiSquared; + +in vec3 v_positionEC; + +vec4 computeEllipsoidColor(czm_ray ray, float intersection, float side) +{ + vec3 positionEC = czm_pointAlongRay(ray, intersection); + vec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz; + vec3 geodeticNormal = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), u_oneOverEllipsoidRadiiSquared)); + vec3 sphericalNormal = normalize(positionMC / u_radii); + vec3 normalMC = geodeticNormal * side; // normalized surface normal (always facing the viewer) in model coordinates + vec3 normalEC = normalize(czm_normal * normalMC); // normalized surface normal in eye coordinates + + vec2 st = czm_ellipsoidTextureCoordinates(sphericalNormal); + vec3 positionToEyeEC = -positionEC; + + czm_materialInput materialInput; + materialInput.s = st.s; + materialInput.st = st; + materialInput.str = (positionMC + u_radii) / u_radii; + materialInput.normalEC = normalEC; + materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(positionMC, normalEC); + materialInput.positionToEyeEC = positionToEyeEC; + czm_material material = czm_getMaterial(materialInput); + +#ifdef ONLY_SUN_LIGHTING + return czm_private_phong(normalize(positionToEyeEC), material, czm_sunDirectionEC); +#else + return czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +#endif +} + +void main() +{ + // PERFORMANCE_TODO: When dynamic branching is available, compute ratio of maximum and minimum radii + // in the vertex shader. Only when it is larger than some constant, march along the ray. + // Otherwise perform one intersection test which will be the common case. + + // Test if the ray intersects a sphere with the ellipsoid's maximum radius. + // For very oblate ellipsoids, using the ellipsoid's radii for an intersection test + // may cause false negatives. This will discard fragments before marching the ray forward. + float maxRadius = max(u_radii.x, max(u_radii.y, u_radii.z)) * 1.5; + vec3 direction = normalize(v_positionEC); + vec3 ellipsoidCenter = czm_modelView[3].xyz; + + float t1 = -1.0; + float t2 = -1.0; + + float b = -2.0 * dot(direction, ellipsoidCenter); + float c = dot(ellipsoidCenter, ellipsoidCenter) - maxRadius * maxRadius; + + float discriminant = b * b - 4.0 * c; + if (discriminant >= 0.0) { + t1 = (-b - sqrt(discriminant)) * 0.5; + t2 = (-b + sqrt(discriminant)) * 0.5; + } + + if (t1 < 0.0 && t2 < 0.0) { + discard; + } + + float t = min(t1, t2); + if (t < 0.0) { + t = 0.0; + } + + // March ray forward to intersection with larger sphere and find + czm_ray ray = czm_ray(t * direction, direction); + + vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z); + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii); + + if (czm_isEmpty(intersection)) + { + discard; + } + + // If the viewer is outside, compute outsideFaceColor, with normals facing outward. + vec4 outsideFaceColor = (intersection.start != 0.0) ? computeEllipsoidColor(ray, intersection.start, 1.0) : vec4(0.0); + + // If the viewer either is inside or can see inside, compute insideFaceColor, with normals facing inward. + vec4 insideFaceColor = (outsideFaceColor.a < 1.0) ? computeEllipsoidColor(ray, intersection.stop, -1.0) : vec4(0.0); + + out_FragColor = mix(insideFaceColor, outsideFaceColor, outsideFaceColor.a); + out_FragColor.a = 1.0 - (1.0 - insideFaceColor.a) * (1.0 - outsideFaceColor.a); + +#if (defined(WRITE_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) + t = (intersection.start != 0.0) ? intersection.start : intersection.stop; + vec3 positionEC = czm_pointAlongRay(ray, t); + vec4 positionCC = czm_projection * vec4(positionEC, 1.0); +#ifdef LOG_DEPTH + czm_writeLogDepth(1.0 + positionCC.w); +#else + float z = positionCC.z / positionCC.w; + + float n = czm_depthRange.near; + float f = czm_depthRange.far; + + gl_FragDepth = (z * (f - n) + f + n) * 0.5; +#endif +#endif +} +`, EllipsoidVS = `in vec3 position; + +uniform vec3 u_radii; + +out vec3 v_positionEC; + +void main() +{ + // In the vertex data, the cube goes from (-1.0, -1.0, -1.0) to (1.0, 1.0, 1.0) in model coordinates. + // Scale to consider the radii. We could also do this once on the CPU when using the BoxGeometry, + // but doing it here allows us to change the radii without rewriting the vertex data, and + // allows all ellipsoids to reuse the same vertex data. + vec4 p = vec4(u_radii * position, 1.0); + + v_positionEC = (czm_modelView * p).xyz; // position in eye coordinates + gl_Position = czm_modelViewProjection * p; // position in clip coordinates + + // With multi-frustum, when the ellipsoid primitive is positioned on the intersection of two frustums + // and close to terrain, the terrain (writes depth) in the closest frustum can overwrite part of the + // ellipsoid (does not write depth) that was rendered in the farther frustum. + // + // Here, we clamp the depth in the vertex shader to avoid being overwritten; however, this creates + // artifacts since some fragments can be alpha blended twice. This is solved by only rendering + // the ellipsoid in the closest frustum to the viewer. + gl_Position.z = clamp(gl_Position.z, czm_depthRange.near, czm_depthRange.far); + + czm_vertexLogDepth(); +} +`; +/** + * @license + * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of NVIDIA CORPORATION nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +const FXAA3_11 = `/** + * @license + * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of NVIDIA CORPORATION nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS \`\`AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// NVIDIA GameWorks Graphics Samples GitHub link: https://github.com/NVIDIAGameWorks/GraphicsSamples +// Original FXAA 3.11 shader link: https://github.com/NVIDIAGameWorks/GraphicsSamples/blob/master/samples/es3-kepler/FXAA/FXAA3_11.h + +// Steps used to integrate into Cesium: +// * The following defines are set: +// #define FXAA_PC 1 +// #define FXAA_WEBGL_1 1 +// #define FXAA_GREEN_AS_LUMA 1 +// #define FXAA_EARLY_EXIT 1 +// #define FXAA_GLSL_120 1 +// * All other preprocessor directives besides the FXAA_QUALITY__P* directives were removed. +// * Double underscores are invalid for preprocessor directives so replace them with a single underscore. Replace +// /FXAA_QUALITY__P(.*)/g with /FXAA_QUALITY__P$1/. +// * There are no implicit conversions from ivec* to vec* so replace: +// #define FxaaInt2 ivec2 +// with +// #define FxaaInt2 vec2 +// * The texture2DLod function is only available in vertex shaders so replace: +// #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0) +// #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0) +// with +// #define FxaaTexTop(t, p) texture(t, p) +// #define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) +// * FXAA_QUALITY_PRESET is prepended in the javascript code. We may want to expose that setting in the future. +// * The following parameters to FxaaPixelShader are unused and can be removed: +// fxaaConsolePosPos +// fxaaConsoleRcpFrameOpt +// fxaaConsoleRcpFrameOpt2 +// fxaaConsole360RcpFrameOpt2 +// fxaaConsoleEdgeSharpness +// fxaaConsoleEdgeThreshold +// fxaaConsoleEdgeThresholdMi +// fxaaConsole360ConstDir + +// +// Choose the quality preset. +// This needs to be compiled into the shader as it effects code. +// Best option to include multiple presets is to +// in each shader define the preset, then include this file. +// +// OPTIONS +// ----------------------------------------------------------------------- +// 10 to 15 - default medium dither (10=fastest, 15=highest quality) +// 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) +// 39 - no dither, very expensive +// +// NOTES +// ----------------------------------------------------------------------- +// 12 = slightly faster then FXAA 3.9 and higher edge quality (default) +// 13 = about same speed as FXAA 3.9 and better than 12 +// 23 = closest to FXAA 3.9 visually and performance wise +// _ = the lowest digit is directly related to performance +// _ = the highest digit is directly related to style +// +//#define FXAA_QUALITY_PRESET 12 + + +#if (FXAA_QUALITY_PRESET == 10) + #define FXAA_QUALITY_PS 3 + #define FXAA_QUALITY_P0 1.5 + #define FXAA_QUALITY_P1 3.0 + #define FXAA_QUALITY_P2 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 11) + #define FXAA_QUALITY_PS 4 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 3.0 + #define FXAA_QUALITY_P3 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 12) + #define FXAA_QUALITY_PS 5 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 4.0 + #define FXAA_QUALITY_P4 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 13) + #define FXAA_QUALITY_PS 6 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 4.0 + #define FXAA_QUALITY_P5 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 14) + #define FXAA_QUALITY_PS 7 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 4.0 + #define FXAA_QUALITY_P6 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 15) + #define FXAA_QUALITY_PS 8 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 4.0 + #define FXAA_QUALITY_P7 12.0 +#endif +#if (FXAA_QUALITY_PRESET == 20) + #define FXAA_QUALITY_PS 3 + #define FXAA_QUALITY_P0 1.5 + #define FXAA_QUALITY_P1 2.0 + #define FXAA_QUALITY_P2 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 21) + #define FXAA_QUALITY_PS 4 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 22) + #define FXAA_QUALITY_PS 5 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 23) + #define FXAA_QUALITY_PS 6 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 24) + #define FXAA_QUALITY_PS 7 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 3.0 + #define FXAA_QUALITY_P6 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 25) + #define FXAA_QUALITY_PS 8 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 4.0 + #define FXAA_QUALITY_P7 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 26) + #define FXAA_QUALITY_PS 9 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 2.0 + #define FXAA_QUALITY_P7 4.0 + #define FXAA_QUALITY_P8 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 27) + #define FXAA_QUALITY_PS 10 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 2.0 + #define FXAA_QUALITY_P7 2.0 + #define FXAA_QUALITY_P8 4.0 + #define FXAA_QUALITY_P9 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 28) + #define FXAA_QUALITY_PS 11 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 2.0 + #define FXAA_QUALITY_P7 2.0 + #define FXAA_QUALITY_P8 2.0 + #define FXAA_QUALITY_P9 4.0 + #define FXAA_QUALITY_P10 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 29) + #define FXAA_QUALITY_PS 12 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.5 + #define FXAA_QUALITY_P2 2.0 + #define FXAA_QUALITY_P3 2.0 + #define FXAA_QUALITY_P4 2.0 + #define FXAA_QUALITY_P5 2.0 + #define FXAA_QUALITY_P6 2.0 + #define FXAA_QUALITY_P7 2.0 + #define FXAA_QUALITY_P8 2.0 + #define FXAA_QUALITY_P9 2.0 + #define FXAA_QUALITY_P10 4.0 + #define FXAA_QUALITY_P11 8.0 +#endif +#if (FXAA_QUALITY_PRESET == 39) + #define FXAA_QUALITY_PS 12 + #define FXAA_QUALITY_P0 1.0 + #define FXAA_QUALITY_P1 1.0 + #define FXAA_QUALITY_P2 1.0 + #define FXAA_QUALITY_P3 1.0 + #define FXAA_QUALITY_P4 1.0 + #define FXAA_QUALITY_P5 1.5 + #define FXAA_QUALITY_P6 2.0 + #define FXAA_QUALITY_P7 2.0 + #define FXAA_QUALITY_P8 2.0 + #define FXAA_QUALITY_P9 2.0 + #define FXAA_QUALITY_P10 4.0 + #define FXAA_QUALITY_P11 8.0 +#endif + +#define FxaaBool bool +#define FxaaFloat float +#define FxaaFloat2 vec2 +#define FxaaFloat3 vec3 +#define FxaaFloat4 vec4 +#define FxaaHalf float +#define FxaaHalf2 vec2 +#define FxaaHalf3 vec3 +#define FxaaHalf4 vec4 +#define FxaaInt2 vec2 +#define FxaaTex sampler2D + +#define FxaaSat(x) clamp(x, 0.0, 1.0) +#define FxaaTexTop(t, p) texture(t, p) +#define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) + +FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; } + +FxaaFloat4 FxaaPixelShader( + // + // Use noperspective interpolation here (turn off perspective interpolation). + // {xy} = center of pixel + FxaaFloat2 pos, + // + // Input color texture. + // {rgb_} = color in linear or perceptual color space + // if (FXAA_GREEN_AS_LUMA == 0) + // {___a} = luma in perceptual color space (not linear) + FxaaTex tex, + // + // Only used on FXAA Quality. + // This must be from a constant/uniform. + // {x_} = 1.0/screenWidthInPixels + // {_y} = 1.0/screenHeightInPixels + FxaaFloat2 fxaaQualityRcpFrame, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY_SUBPIX define. + // It is here now to allow easier tuning. + // Choose the amount of sub-pixel aliasing removal. + // This can effect sharpness. + // 1.00 - upper limit (softer) + // 0.75 - default amount of filtering + // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) + // 0.25 - almost off + // 0.00 - completely off + FxaaFloat fxaaQualitySubpix, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define. + // It is here now to allow easier tuning. + // The minimum amount of local contrast required to apply algorithm. + // 0.333 - too little (faster) + // 0.250 - low quality + // 0.166 - default + // 0.125 - high quality + // 0.063 - overkill (slower) + FxaaFloat fxaaQualityEdgeThreshold, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define. + // It is here now to allow easier tuning. + // Trims the algorithm from processing darks. + // 0.0833 - upper limit (default, the start of visible unfiltered edges) + // 0.0625 - high quality (faster) + // 0.0312 - visible limit (slower) + // Special notes when using FXAA_GREEN_AS_LUMA, + // Likely want to set this to zero. + // As colors that are mostly not-green + // will appear very dark in the green channel! + // Tune by looking at mostly non-green content, + // then start at zero and increase until aliasing is a problem. + FxaaFloat fxaaQualityEdgeThresholdMin +) { +/*--------------------------------------------------------------------------*/ + FxaaFloat2 posM; + posM.x = pos.x; + posM.y = pos.y; + FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); + #define lumaM rgbyM.y + FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy)); +/*--------------------------------------------------------------------------*/ + FxaaFloat maxSM = max(lumaS, lumaM); + FxaaFloat minSM = min(lumaS, lumaM); + FxaaFloat maxESM = max(lumaE, maxSM); + FxaaFloat minESM = min(lumaE, minSM); + FxaaFloat maxWN = max(lumaN, lumaW); + FxaaFloat minWN = min(lumaN, lumaW); + FxaaFloat rangeMax = max(maxWN, maxESM); + FxaaFloat rangeMin = min(minWN, minESM); + FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; + FxaaFloat range = rangeMax - rangeMin; + FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); + FxaaBool earlyExit = range < rangeMaxClamped; +/*--------------------------------------------------------------------------*/ + if(earlyExit) + return rgbyM; +/*--------------------------------------------------------------------------*/ + FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); +/*--------------------------------------------------------------------------*/ + FxaaFloat lumaNS = lumaN + lumaS; + FxaaFloat lumaWE = lumaW + lumaE; + FxaaFloat subpixRcpRange = 1.0/range; + FxaaFloat subpixNSWE = lumaNS + lumaWE; + FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; + FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; +/*--------------------------------------------------------------------------*/ + FxaaFloat lumaNESE = lumaNE + lumaSE; + FxaaFloat lumaNWNE = lumaNW + lumaNE; + FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; + FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; +/*--------------------------------------------------------------------------*/ + FxaaFloat lumaNWSW = lumaNW + lumaSW; + FxaaFloat lumaSWSE = lumaSW + lumaSE; + FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); + FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); + FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; + FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; + FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; + FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; +/*--------------------------------------------------------------------------*/ + FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; + FxaaFloat lengthSign = fxaaQualityRcpFrame.x; + FxaaBool horzSpan = edgeHorz >= edgeVert; + FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; +/*--------------------------------------------------------------------------*/ + if(!horzSpan) lumaN = lumaW; + if(!horzSpan) lumaS = lumaE; + if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; + FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; +/*--------------------------------------------------------------------------*/ + FxaaFloat gradientN = lumaN - lumaM; + FxaaFloat gradientS = lumaS - lumaM; + FxaaFloat lumaNN = lumaN + lumaM; + FxaaFloat lumaSS = lumaS + lumaM; + FxaaBool pairN = abs(gradientN) >= abs(gradientS); + FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); + if(pairN) lengthSign = -lengthSign; + FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); +/*--------------------------------------------------------------------------*/ + FxaaFloat2 posB; + posB.x = posM.x; + posB.y = posM.y; + FxaaFloat2 offNP; + offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; + offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; + if(!horzSpan) posB.x += lengthSign * 0.5; + if( horzSpan) posB.y += lengthSign * 0.5; +/*--------------------------------------------------------------------------*/ + FxaaFloat2 posN; + posN.x = posB.x - offNP.x * FXAA_QUALITY_P0; + posN.y = posB.y - offNP.y * FXAA_QUALITY_P0; + FxaaFloat2 posP; + posP.x = posB.x + offNP.x * FXAA_QUALITY_P0; + posP.y = posB.y + offNP.y * FXAA_QUALITY_P0; + FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; + FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); + FxaaFloat subpixE = subpixC * subpixC; + FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); +/*--------------------------------------------------------------------------*/ + if(!pairN) lumaNN = lumaSS; + FxaaFloat gradientScaled = gradient * 1.0/4.0; + FxaaFloat lumaMM = lumaM - lumaNN * 0.5; + FxaaFloat subpixF = subpixD * subpixE; + FxaaBool lumaMLTZero = lumaMM < 0.0; +/*--------------------------------------------------------------------------*/ + lumaEndN -= lumaNN * 0.5; + lumaEndP -= lumaNN * 0.5; + FxaaBool doneN = abs(lumaEndN) >= gradientScaled; + FxaaBool doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1; + FxaaBool doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1; +/*--------------------------------------------------------------------------*/ + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 3) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 4) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 5) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 6) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 7) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 8) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 9) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 10) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 11) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11; +/*--------------------------------------------------------------------------*/ + #if (FXAA_QUALITY_PS > 12) + if(doneNP) { + if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12; + doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12; +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } + #endif +/*--------------------------------------------------------------------------*/ + } +/*--------------------------------------------------------------------------*/ + FxaaFloat dstN = posM.x - posN.x; + FxaaFloat dstP = posP.x - posM.x; + if(!horzSpan) dstN = posM.y - posN.y; + if(!horzSpan) dstP = posP.y - posM.y; +/*--------------------------------------------------------------------------*/ + FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; + FxaaFloat spanLength = (dstP + dstN); + FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; + FxaaFloat spanLengthRcp = 1.0/spanLength; +/*--------------------------------------------------------------------------*/ + FxaaBool directionN = dstN < dstP; + FxaaFloat dst = min(dstN, dstP); + FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; + FxaaFloat subpixG = subpixF * subpixF; + FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; + FxaaFloat subpixH = subpixG * fxaaQualitySubpix; +/*--------------------------------------------------------------------------*/ + FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; + FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); + if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; + if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; + return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); +} +`, GlobeFS = `uniform vec4 u_initialColor; + +#if TEXTURE_UNITS > 0 +uniform sampler2D u_dayTextures[TEXTURE_UNITS]; +uniform vec4 u_dayTextureTranslationAndScale[TEXTURE_UNITS]; +uniform bool u_dayTextureUseWebMercatorT[TEXTURE_UNITS]; + +#ifdef APPLY_ALPHA +uniform float u_dayTextureAlpha[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_DAY_NIGHT_ALPHA +uniform float u_dayTextureNightAlpha[TEXTURE_UNITS]; +uniform float u_dayTextureDayAlpha[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_SPLIT +uniform float u_dayTextureSplit[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_BRIGHTNESS +uniform float u_dayTextureBrightness[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_CONTRAST +uniform float u_dayTextureContrast[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_HUE +uniform float u_dayTextureHue[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_SATURATION +uniform float u_dayTextureSaturation[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_GAMMA +uniform float u_dayTextureOneOverGamma[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_IMAGERY_CUTOUT +uniform vec4 u_dayTextureCutoutRectangles[TEXTURE_UNITS]; +#endif + +#ifdef APPLY_COLOR_TO_ALPHA +uniform vec4 u_colorsToAlpha[TEXTURE_UNITS]; +#endif + +uniform vec4 u_dayTextureTexCoordsRectangle[TEXTURE_UNITS]; +#endif + +#if defined(HAS_WATER_MASK) && (defined(SHOW_REFLECTIVE_OCEAN) || defined(APPLY_MATERIAL)) +uniform sampler2D u_waterMask; +uniform vec4 u_waterMaskTranslationAndScale; +uniform float u_zoomedOutOceanSpecularIntensity; +#endif + +#ifdef SHOW_OCEAN_WAVES +uniform sampler2D u_oceanNormalMap; +#endif + +#if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) +uniform vec2 u_lightingFadeDistance; +#endif + +#ifdef TILE_LIMIT_RECTANGLE +uniform vec4 u_cartographicLimitRectangle; +#endif + +#ifdef GROUND_ATMOSPHERE +uniform vec2 u_nightFadeDistance; +#endif + +#ifdef ENABLE_CLIPPING_PLANES +uniform highp sampler2D u_clippingPlanes; +uniform mat4 u_clippingPlanesMatrix; +uniform vec4 u_clippingPlanesEdgeStyle; +#endif + +#ifdef ENABLE_CLIPPING_POLYGONS +uniform highp sampler2D u_clippingDistance; +in vec2 v_clippingPosition; +flat in int v_regionIndex; +#endif + +#if defined(GROUND_ATMOSPHERE) || defined(FOG) && defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) +uniform float u_minimumBrightness; +#endif + +#ifdef COLOR_CORRECT +uniform vec3 u_hsbShift; // Hue, saturation, brightness +#endif + +#ifdef HIGHLIGHT_FILL_TILE +uniform vec4 u_fillHighlightColor; +#endif + +#ifdef TRANSLUCENT +uniform vec4 u_frontFaceAlphaByDistance; +uniform vec4 u_backFaceAlphaByDistance; +uniform vec4 u_translucencyRectangle; +#endif + +#ifdef UNDERGROUND_COLOR +uniform vec4 u_undergroundColor; +uniform vec4 u_undergroundColorAlphaByDistance; +#endif + +#ifdef ENABLE_VERTEX_LIGHTING +uniform float u_lambertDiffuseMultiplier; +uniform float u_vertexShadowDarkness; +#endif + +in vec3 v_positionMC; +in vec3 v_positionEC; +in vec3 v_textureCoordinates; +in vec3 v_normalMC; +in vec3 v_normalEC; + +#ifdef APPLY_MATERIAL +in float v_height; +in float v_slope; +in float v_aspect; +#endif + +#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) +in float v_distance; +#endif + +#if defined(GROUND_ATMOSPHERE) || defined(FOG) +in vec3 v_atmosphereRayleighColor; +in vec3 v_atmosphereMieColor; +in float v_atmosphereOpacity; +#endif + +#if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) +float interpolateByDistance(vec4 nearFarScalar, float distance) +{ + float startDistance = nearFarScalar.x; + float startValue = nearFarScalar.y; + float endDistance = nearFarScalar.z; + float endValue = nearFarScalar.w; + float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); + return mix(startValue, endValue, t); +} +#endif + +#if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) || defined(APPLY_MATERIAL) +vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) +{ + return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); +} +#endif + +#ifdef TRANSLUCENT +bool inTranslucencyRectangle() +{ + return + v_textureCoordinates.x > u_translucencyRectangle.x && + v_textureCoordinates.x < u_translucencyRectangle.z && + v_textureCoordinates.y > u_translucencyRectangle.y && + v_textureCoordinates.y < u_translucencyRectangle.w; +} +#endif + +vec4 sampleAndBlend( + vec4 previousColor, + sampler2D textureToSample, + vec2 tileTextureCoordinates, + vec4 textureCoordinateRectangle, + vec4 textureCoordinateTranslationAndScale, + float textureAlpha, + float textureNightAlpha, + float textureDayAlpha, + float textureBrightness, + float textureContrast, + float textureHue, + float textureSaturation, + float textureOneOverGamma, + float split, + vec4 colorToAlpha, + float nightBlend) +{ + // This crazy step stuff sets the alpha to 0.0 if this following condition is true: + // tileTextureCoordinates.s < textureCoordinateRectangle.s || + // tileTextureCoordinates.s > textureCoordinateRectangle.p || + // tileTextureCoordinates.t < textureCoordinateRectangle.t || + // tileTextureCoordinates.t > textureCoordinateRectangle.q + // In other words, the alpha is zero if the fragment is outside the rectangle + // covered by this texture. Would an actual 'if' yield better performance? + vec2 alphaMultiplier = step(textureCoordinateRectangle.st, tileTextureCoordinates); + textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; + + alphaMultiplier = step(vec2(0.0), textureCoordinateRectangle.pq - tileTextureCoordinates); + textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; + +#if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) + textureAlpha *= mix(textureDayAlpha, textureNightAlpha, nightBlend); +#endif + + vec2 translation = textureCoordinateTranslationAndScale.xy; + vec2 scale = textureCoordinateTranslationAndScale.zw; + vec2 textureCoordinates = tileTextureCoordinates * scale + translation; + vec4 value = texture(textureToSample, textureCoordinates); + vec3 color = value.rgb; + float alpha = value.a; + + #ifdef USE_VCS_CUSTOM_SHADING + color = czm_srgbToLinear(color); + const vec3 REFLECTANCE_DIELECTRIC = vec3(0.04); + color *= (1.0 - REFLECTANCE_DIELECTRIC); + #endif + +#ifdef APPLY_COLOR_TO_ALPHA + vec3 colorDiff = abs(color.rgb - colorToAlpha.rgb); + colorDiff.r = czm_maximumComponent(colorDiff); + alpha = czm_branchFreeTernary(colorDiff.r < colorToAlpha.a, 0.0, alpha); +#endif + +#if !defined(APPLY_GAMMA) + vec4 tempColor = czm_gammaCorrect(vec4(color, alpha)); + color = tempColor.rgb; + alpha = tempColor.a; +#else + color = pow(color, vec3(textureOneOverGamma)); +#endif + +#ifdef APPLY_SPLIT + float splitPosition = czm_splitPosition; + // Split to the left + if (split < 0.0 && gl_FragCoord.x > splitPosition) { + alpha = 0.0; + } + // Split to the right + else if (split > 0.0 && gl_FragCoord.x < splitPosition) { + alpha = 0.0; + } +#endif + +#ifdef APPLY_BRIGHTNESS + color = mix(vec3(0.0), color, textureBrightness); +#endif + +#ifdef APPLY_CONTRAST + color = mix(vec3(0.5), color, textureContrast); +#endif + +#ifdef APPLY_HUE + color = czm_hue(color, textureHue); +#endif + +#ifdef APPLY_SATURATION + color = czm_saturation(color, textureSaturation); +#endif + + float sourceAlpha = alpha * textureAlpha; + float outAlpha = mix(previousColor.a, 1.0, sourceAlpha); + outAlpha += sign(outAlpha) - 1.0; + + vec3 outColor = mix(previousColor.rgb * previousColor.a, color, sourceAlpha) / outAlpha; + + // When rendering imagery for a tile in multiple passes, + // some GPU/WebGL implementation combinations will not blend fragments in + // additional passes correctly if their computation includes an unmasked + // divide-by-zero operation, + // even if it's not in the output or if the output has alpha zero. + // + // For example, without sanitization for outAlpha, + // this renders without artifacts: + // if (outAlpha == 0.0) { outColor = vec3(0.0); } + // + // but using czm_branchFreeTernary will cause portions of the tile that are + // alpha-zero in the additional pass to render as black instead of blending + // with the previous pass: + // outColor = czm_branchFreeTernary(outAlpha == 0.0, vec3(0.0), outColor); + // + // So instead, sanitize against divide-by-zero, + // store this state on the sign of outAlpha, and correct on return. + + return vec4(outColor, max(outAlpha, 0.0)); +} + +vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend); +vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float specularMapValue, float fade); + +const float fExposure = 2.0; + +vec3 computeEllipsoidPosition() +{ + float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0), 1.0); + vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0); + xy *= czm_viewport.zw * mpp * 0.5; + + vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x)); + czm_ray ray = czm_ray(vec3(0.0), direction); + + vec3 ellipsoid_center = czm_view[3].xyz; + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); + + vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start); + return (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz; +} + +void main() +{ +#ifdef TILE_LIMIT_RECTANGLE + if (v_textureCoordinates.x < u_cartographicLimitRectangle.x || u_cartographicLimitRectangle.z < v_textureCoordinates.x || + v_textureCoordinates.y < u_cartographicLimitRectangle.y || u_cartographicLimitRectangle.w < v_textureCoordinates.y) + { + discard; + } +#endif + +#ifdef ENABLE_CLIPPING_PLANES + float clipDistance = clip(gl_FragCoord, u_clippingPlanes, u_clippingPlanesMatrix); +#endif + +#if defined(SHOW_REFLECTIVE_OCEAN) || defined(ENABLE_DAYNIGHT_SHADING) || defined(HDR) + vec3 normalMC = czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)); // normalized surface normal in model coordinates + vec3 normalEC = czm_normal3D * normalMC; // normalized surface normal in eye coordinates +#endif + +#if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) + float nightBlend = 1.0 - clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0, 0.0, 1.0); +#else + float nightBlend = 0.0; +#endif + + // The clamp below works around an apparent bug in Chrome Canary v23.0.1241.0 + // where the fragment shader sees textures coordinates < 0.0 and > 1.0 for the + // fragments on the edges of tiles even though the vertex shader is outputting + // coordinates strictly in the 0-1 range. + vec4 color = computeDayColor(u_initialColor, clamp(v_textureCoordinates, 0.0, 1.0), nightBlend); + +#ifdef SHOW_TILE_BOUNDARIES + if (v_textureCoordinates.x < (1.0/256.0) || v_textureCoordinates.x > (255.0/256.0) || + v_textureCoordinates.y < (1.0/256.0) || v_textureCoordinates.y > (255.0/256.0)) + { + color = vec4(1.0, 0.0, 0.0, 1.0); + } +#endif + +#if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) + float cameraDist; + if (czm_sceneMode == czm_sceneMode2D) + { + cameraDist = max(czm_frustumPlanes.x - czm_frustumPlanes.y, czm_frustumPlanes.w - czm_frustumPlanes.z) * 0.5; + } + else if (czm_sceneMode == czm_sceneModeColumbusView) + { + cameraDist = -czm_view[3].z; + } + else + { + cameraDist = length(czm_view[3]); + } + float fadeOutDist = u_lightingFadeDistance.x; + float fadeInDist = u_lightingFadeDistance.y; + if (czm_sceneMode != czm_sceneMode3D) { + vec3 radii = czm_ellipsoidRadii; + float maxRadii = max(radii.x, max(radii.y, radii.z)); + fadeOutDist -= maxRadii; + fadeInDist -= maxRadii; + } + float fade = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.0, 1.0); +#else + float fade = 0.0; +#endif + +#if defined(HAS_WATER_MASK) && (defined(SHOW_REFLECTIVE_OCEAN) || defined(APPLY_MATERIAL)) + vec2 waterMaskTranslation = u_waterMaskTranslationAndScale.xy; + vec2 waterMaskScale = u_waterMaskTranslationAndScale.zw; + vec2 waterMaskTextureCoordinates = v_textureCoordinates.xy * waterMaskScale + waterMaskTranslation; + waterMaskTextureCoordinates.y = 1.0 - waterMaskTextureCoordinates.y; + + float mask = texture(u_waterMask, waterMaskTextureCoordinates).r; + + #ifdef SHOW_REFLECTIVE_OCEAN + if (mask > 0.0) + { + mat3 enuToEye = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalEC); + + vec2 ellipsoidTextureCoordinates = czm_ellipsoidTextureCoordinates(normalMC); + vec2 ellipsoidFlippedTextureCoordinates = czm_ellipsoidTextureCoordinates(normalMC.zyx); + + vec2 textureCoordinates = mix(ellipsoidTextureCoordinates, ellipsoidFlippedTextureCoordinates, czm_morphTime * smoothstep(0.9, 0.95, normalMC.z)); + + color = computeWaterColor(v_positionEC, textureCoordinates, enuToEye, color, mask, fade); + } + #endif +#endif + +#ifdef APPLY_MATERIAL + czm_materialInput materialInput; + materialInput.st = v_textureCoordinates.st; + materialInput.normalEC = normalize(v_normalEC); + materialInput.positionToEyeEC = -v_positionEC; + materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalize(v_normalEC)); + materialInput.slope = v_slope; + materialInput.height = v_height; + materialInput.aspect = v_aspect; + #ifdef HAS_WATER_MASK + materialInput.waterMask = mask; + #endif + + czm_material material = czm_getMaterial(materialInput); + vec4 materialColor = vec4(material.diffuse, material.alpha); + color = alphaBlend(materialColor, color); +#endif + +#ifdef ENABLE_VERTEX_LIGHTING + + #ifdef USE_VCS_CUSTOM_SHADING + + #ifdef USE_CUSTOM_LIGHT_COLOR + vec3 lightColorHdr = model_lightColorHdr; + #else + vec3 lightColorHdr = czm_lightColorHdr; + #endif + + + lightColorHdr *= 0.35; + + vec3 diffuseColor = vec3(color.rgb); + + // float u_lambertDiffuseMultiplier = 0.9; // default value + // float u_vertexShadowDarkness = 0.3; // default value + + float ambientLuminanceNight = 0.05; + float ambientLuminanceDay = (1.0 - ambientLuminanceNight) * u_vertexShadowDarkness + ambientLuminanceNight; + + vec3 l = normalize(czm_lightDirectionEC); + vec3 n = v_normalEC; + float NdotL = dot(n, l); + float NdotLclamped = clamp(NdotL, 0.0001, 1.0); + + vec3 positionWC = vec3(czm_inverseView * vec4(v_positionEC, 1.0)); + vec3 upWC = normalize(positionWC); + vec3 lWC = normalize(czm_inverseViewRotation * l); + vec3 nWC = normalize(czm_inverseViewRotation * n); + float LdotZ = dot(lWC, -upWC); + float NdotZ = dot(nWC, upWC); + float sunAboveHorizon = clamp(-200.0 * LdotZ, 0.0, 1.0); + + // beginning of nautical twilight at 12 degrees below horizon (in radiens) + float LdotZclamped = clamp(LdotZ, 0.0, 1.0); + float m = 0.209439510239; + float nn = (-LdotZclamped + m) / m; + float beta = smoothstep(0.0, 1.0, nn); + float ambientLightLuminance = mix(ambientLuminanceNight, ambientLuminanceDay, beta); + + + + //modify hue of sunlight + vec3 directLightColorHdr = lightColorHdr; + float gamma = clamp(-20.0 * LdotZ, 0.0, 1.0); + + float sun_minB = 0.5; //0.7; + float sun_minG = sun_minB * 0.5 + 0.5; + float sun_G = gamma*(1.0 - sun_minG) + sun_minG; + float sun_B = gamma*(1.0 - sun_minB) + sun_minB; + directLightColorHdr.g *= sun_G; + directLightColorHdr.b *= sun_B; + + //ambient diffuse light + float ambientModulationMinimum = 0.2; + float ambientModulation = ambientModulationMinimum + (NdotZ*0.5 + 0.5)*(NdotL*0.2 + 0.8)*(1.0 - ambientModulationMinimum); + vec3 ambientLightContribution = diffuseColor * lightColorHdr * ambientLightLuminance * ambientModulation; + + // direct light + vec3 directLightContribution = diffuseColor * directLightColorHdr * NdotLclamped * u_lambertDiffuseMultiplier * sunAboveHorizon; + + vec3 finalColorRGB = ambientLightContribution + directLightContribution; + + vec4 finalColor = vec4(finalColorRGB.rgb, color.a); + #else + float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalize(v_normalEC)) * u_lambertDiffuseMultiplier + u_vertexShadowDarkness, 0.0, 1.0); + vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); + #endif + +#elif defined(ENABLE_DAYNIGHT_SHADING) + float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0 + 0.3, 0.0, 1.0); + diffuseIntensity = mix(1.0, diffuseIntensity, fade); + vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); +#else + vec4 finalColor = color; +#endif + +#ifdef ENABLE_CLIPPING_PLANES + vec4 clippingPlanesEdgeColor = vec4(1.0); + clippingPlanesEdgeColor.rgb = u_clippingPlanesEdgeStyle.rgb; + float clippingPlanesEdgeWidth = u_clippingPlanesEdgeStyle.a; + + if (clipDistance < clippingPlanesEdgeWidth) + { + finalColor = clippingPlanesEdgeColor; + } +#endif + +#ifdef ENABLE_CLIPPING_POLYGONS + vec2 clippingPosition = v_clippingPosition; + int regionIndex = v_regionIndex; + clipPolygons(u_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); +#endif + +#ifdef HIGHLIGHT_FILL_TILE + finalColor = vec4(mix(finalColor.rgb, u_fillHighlightColor.rgb, u_fillHighlightColor.a), finalColor.a); +#endif + +#if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) + vec3 atmosphereLightDirection = czm_sunDirectionWC; +#else + vec3 atmosphereLightDirection = czm_lightDirectionWC; +#endif + +#if defined(GROUND_ATMOSPHERE) || defined(FOG) + if (!czm_backFacing()) + { + bool dynamicLighting = false; + #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) + dynamicLighting = true; + #endif + + vec3 rayleighColor; + vec3 mieColor; + float opacity; + + vec3 positionWC; + vec3 lightDirection; + + // When the camera is far away (camera distance > nightFadeOutDistance), the scattering is computed in the fragment shader. + // Otherwise, the scattering is computed in the vertex shader. + #ifdef PER_FRAGMENT_GROUND_ATMOSPHERE + positionWC = computeEllipsoidPosition(); + lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); + computeAtmosphereScattering( + positionWC, + lightDirection, + rayleighColor, + mieColor, + opacity + ); + #else + positionWC = v_positionMC; + lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); + rayleighColor = v_atmosphereRayleighColor; + mieColor = v_atmosphereMieColor; + opacity = v_atmosphereOpacity; + #endif + + #ifdef COLOR_CORRECT + const bool ignoreBlackPixels = true; + rayleighColor = czm_applyHSBShift(rayleighColor, u_hsbShift, ignoreBlackPixels); + mieColor = czm_applyHSBShift(mieColor, u_hsbShift, ignoreBlackPixels); + #endif + + vec4 groundAtmosphereColor = computeAtmosphereColor(positionWC, lightDirection, rayleighColor, mieColor, opacity); + + // Fog is applied to tiles selected for fog, close to the Earth. + #ifdef FOG + vec3 fogColor = groundAtmosphereColor.rgb; + + // If there is lighting, apply that to the fog. + #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) + float darken = clamp(dot(normalize(czm_viewerPositionWC), atmosphereLightDirection), u_minimumBrightness, 1.0); + fogColor *= darken; + #endif + + #ifndef HDR + fogColor.rgb = czm_pbrNeutralTonemapping(fogColor.rgb); + fogColor.rgb = czm_inverseGamma(fogColor.rgb); + #endif + + const float modifier = 0.15; + finalColor = vec4(czm_fog(v_distance, finalColor.rgb, fogColor.rgb, modifier), finalColor.a); + + #else + // Apply ground atmosphere. This happens when the camera is far away from the earth. + + // The transmittance is based on optical depth i.e. the length of segment of the ray inside the atmosphere. + // This value is larger near the "circumference", as it is further away from the camera. We use it to + // brighten up that area of the ground atmosphere. + const float transmittanceModifier = 0.5; + float transmittance = transmittanceModifier + clamp(1.0 - groundAtmosphereColor.a, 0.0, 1.0); + + vec3 finalAtmosphereColor = finalColor.rgb + groundAtmosphereColor.rgb * transmittance; + + #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) + float fadeInDist = u_nightFadeDistance.x; + float fadeOutDist = u_nightFadeDistance.y; + + float sunlitAtmosphereIntensity = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.05, 1.0); + float darken = clamp(dot(normalize(positionWC), atmosphereLightDirection), 0.0, 1.0); + vec3 darkenendGroundAtmosphereColor = mix(groundAtmosphereColor.rgb, finalAtmosphereColor.rgb, darken); + + finalAtmosphereColor = mix(darkenendGroundAtmosphereColor, finalAtmosphereColor, sunlitAtmosphereIntensity); + #endif + + #ifndef HDR + finalAtmosphereColor.rgb = vec3(1.0) - exp(-fExposure * finalAtmosphereColor.rgb); + #else + finalAtmosphereColor.rgb = czm_saturation(finalAtmosphereColor.rgb, 1.6); + #endif + + finalColor.rgb = mix(finalColor.rgb, finalAtmosphereColor.rgb, fade); + #endif + } +#endif + +#ifdef UNDERGROUND_COLOR + if (czm_backFacing()) + { + float distanceFromEllipsoid = max(czm_eyeHeight, 0.0); + float distance = max(v_distance - distanceFromEllipsoid, 0.0); + float blendAmount = interpolateByDistance(u_undergroundColorAlphaByDistance, distance); + vec4 undergroundColor = vec4(u_undergroundColor.rgb, u_undergroundColor.a * blendAmount); + finalColor = alphaBlend(undergroundColor, finalColor); + } +#endif + +#ifdef TRANSLUCENT + if (inTranslucencyRectangle()) + { + vec4 alphaByDistance = gl_FrontFacing ? u_frontFaceAlphaByDistance : u_backFaceAlphaByDistance; + finalColor.a *= interpolateByDistance(alphaByDistance, v_distance); + } +#endif + +#ifdef USE_VCS_CUSTOM_SHADING + #ifndef HDR + // If HDR is not enabled, the frame buffer stores sRGB colors rather than + // linear colors so the linear value must be converted. + finalColor = czm_linearToSrgb(finalColor); + #endif +#endif + out_FragColor = finalColor; +} + + +#ifdef SHOW_REFLECTIVE_OCEAN + +float waveFade(float edge0, float edge1, float x) +{ + float y = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); + return pow(1.0 - y, 5.0); +} + +float linearFade(float edge0, float edge1, float x) +{ + return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); +} + +// Based on water rendering by Jonas Wagner: +// http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog + +// low altitude wave settings +const float oceanFrequencyLowAltitude = 825000.0; +const float oceanAnimationSpeedLowAltitude = 0.004; +const float oceanOneOverAmplitudeLowAltitude = 1.0 / 2.0; +const float oceanSpecularIntensity = 0.5; + +// high altitude wave settings +const float oceanFrequencyHighAltitude = 125000.0; +const float oceanAnimationSpeedHighAltitude = 0.008; +const float oceanOneOverAmplitudeHighAltitude = 1.0 / 2.0; + +vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float maskValue, float fade) +{ + vec3 positionToEyeEC = -positionEyeCoordinates; + float positionToEyeECLength = length(positionToEyeEC); + + // The double normalize below works around a bug in Firefox on Android devices. + vec3 normalizedPositionToEyeEC = normalize(normalize(positionToEyeEC)); + + // Fade out the waves as the camera moves far from the surface. + float waveIntensity = waveFade(70000.0, 1000000.0, positionToEyeECLength); + +#ifdef SHOW_OCEAN_WAVES + // high altitude waves + float time = czm_frameNumber * oceanAnimationSpeedHighAltitude; + vec4 noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyHighAltitude, time, 0.0); + vec3 normalTangentSpaceHighAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeHighAltitude); + + // low altitude waves + time = czm_frameNumber * oceanAnimationSpeedLowAltitude; + noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyLowAltitude, time, 0.0); + vec3 normalTangentSpaceLowAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeLowAltitude); + + // blend the 2 wave layers based on distance to surface + float highAltitudeFade = linearFade(0.0, 60000.0, positionToEyeECLength); + float lowAltitudeFade = 1.0 - linearFade(20000.0, 60000.0, positionToEyeECLength); + vec3 normalTangentSpace = + (highAltitudeFade * normalTangentSpaceHighAltitude) + + (lowAltitudeFade * normalTangentSpaceLowAltitude); + normalTangentSpace = normalize(normalTangentSpace); + + // fade out the normal perturbation as we move farther from the water surface + normalTangentSpace.xy *= waveIntensity; + normalTangentSpace = normalize(normalTangentSpace); +#else + vec3 normalTangentSpace = vec3(0.0, 0.0, 1.0); +#endif + + vec3 normalEC = enuToEye * normalTangentSpace; + + const vec3 waveHighlightColor = vec3(0.3, 0.45, 0.6); + + // Use diffuse light to highlight the waves + float diffuseIntensity = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * maskValue; + vec3 diffuseHighlight = waveHighlightColor * diffuseIntensity * (1.0 - fade); + +#ifdef SHOW_OCEAN_WAVES + // Where diffuse light is low or non-existent, use wave highlights based solely on + // the wave bumpiness and no particular light direction. + float tsPerturbationRatio = normalTangentSpace.z; + vec3 nonDiffuseHighlight = mix(waveHighlightColor * 5.0 * (1.0 - tsPerturbationRatio), vec3(0.0), diffuseIntensity); +#else + vec3 nonDiffuseHighlight = vec3(0.0); +#endif + + // Add specular highlights in 3D, and in all modes when zoomed in. + float specularIntensity = czm_getSpecular(czm_lightDirectionEC, normalizedPositionToEyeEC, normalEC, 10.0); + float surfaceReflectance = mix(0.0, mix(u_zoomedOutOceanSpecularIntensity, oceanSpecularIntensity, waveIntensity), maskValue); + float specular = specularIntensity * surfaceReflectance; + +#ifdef HDR + specular *= 1.4; + + float e = 0.2; + float d = 3.3; + float c = 1.7; + + vec3 color = imageryColor.rgb + (c * (vec3(e) + imageryColor.rgb * d) * (diffuseHighlight + nonDiffuseHighlight + specular)); +#else + vec3 color = imageryColor.rgb + diffuseHighlight + nonDiffuseHighlight + specular; +#endif + + return vec4(color, imageryColor.a); +} + +#endif // #ifdef SHOW_REFLECTIVE_OCEAN +`, GlobeVS = `#ifdef QUANTIZATION_BITS12 +in vec4 compressed0; +in float compressed1; +#else +in vec4 position3DAndHeight; +in vec4 textureCoordAndEncodedNormals; +#endif + +#ifdef GEODETIC_SURFACE_NORMALS +in vec3 geodeticSurfaceNormal; +#endif + +#ifdef EXAGGERATION +uniform vec2 u_verticalExaggerationAndRelativeHeight; +#endif + +uniform vec3 u_center3D; +uniform mat4 u_modifiedModelView; +uniform mat4 u_modifiedModelViewProjection; +uniform vec4 u_tileRectangle; + +// Uniforms for 2D Mercator projection +uniform vec2 u_southAndNorthLatitude; +uniform vec2 u_southMercatorYAndOneOverHeight; + +out vec3 v_positionMC; +out vec3 v_positionEC; + +out vec3 v_textureCoordinates; +out vec3 v_normalMC; +out vec3 v_normalEC; + +#ifdef APPLY_MATERIAL +out float v_slope; +out float v_aspect; +out float v_height; +#endif + +#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) +out float v_distance; +#endif + +#if defined(FOG) || defined(GROUND_ATMOSPHERE) +out vec3 v_atmosphereRayleighColor; +out vec3 v_atmosphereMieColor; +out float v_atmosphereOpacity; +#endif + +#ifdef ENABLE_CLIPPING_POLYGONS +uniform highp sampler2D u_clippingExtents; +out vec2 v_clippingPosition; +flat out int v_regionIndex; +#endif + +// These functions are generated at runtime. +vec4 getPosition(vec3 position, float height, vec2 textureCoordinates); +float get2DYPositionFraction(vec2 textureCoordinates); + +vec4 getPosition3DMode(vec3 position, float height, vec2 textureCoordinates) +{ + return u_modifiedModelViewProjection * vec4(position, 1.0); +} + +float get2DMercatorYPositionFraction(vec2 textureCoordinates) +{ + // The width of a tile at level 11, in radians and assuming a single root tile, is + // 2.0 * czm_pi / pow(2.0, 11.0) + // We want to just linearly interpolate the 2D position from the texture coordinates + // when we're at this level or higher. The constant below is the expression + // above evaluated and then rounded up at the 4th significant digit. + const float maxTileWidth = 0.003068; + float positionFraction = textureCoordinates.y; + float southLatitude = u_southAndNorthLatitude.x; + float northLatitude = u_southAndNorthLatitude.y; + if (northLatitude - southLatitude > maxTileWidth) + { + float southMercatorY = u_southMercatorYAndOneOverHeight.x; + float oneOverMercatorHeight = u_southMercatorYAndOneOverHeight.y; + + float currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y); + currentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude); + positionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorY, oneOverMercatorHeight); + } + return positionFraction; +} + +float get2DGeographicYPositionFraction(vec2 textureCoordinates) +{ + return textureCoordinates.y; +} + +vec4 getPositionPlanarEarth(vec3 position, float height, vec2 textureCoordinates) +{ + float yPositionFraction = get2DYPositionFraction(textureCoordinates); + vec4 rtcPosition2D = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); + return u_modifiedModelViewProjection * rtcPosition2D; +} + +vec4 getPosition2DMode(vec3 position, float height, vec2 textureCoordinates) +{ + return getPositionPlanarEarth(position, 0.0, textureCoordinates); +} + +vec4 getPositionColumbusViewMode(vec3 position, float height, vec2 textureCoordinates) +{ + return getPositionPlanarEarth(position, height, textureCoordinates); +} + +vec4 getPositionMorphingMode(vec3 position, float height, vec2 textureCoordinates) +{ + // We do not do RTC while morphing, so there is potential for jitter. + // This is unlikely to be noticeable, though. + vec3 position3DWC = position + u_center3D; + float yPositionFraction = get2DYPositionFraction(textureCoordinates); + vec4 position2DWC = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); + vec4 morphPosition = czm_columbusViewMorph(position2DWC, vec4(position3DWC, 1.0), czm_morphTime); + return czm_modelViewProjection * morphPosition; +} + +#ifdef QUANTIZATION_BITS12 +uniform vec2 u_minMaxHeight; +uniform mat4 u_scaleAndBias; +#endif + +void main() +{ +#ifdef QUANTIZATION_BITS12 + vec2 xy = czm_decompressTextureCoordinates(compressed0.x); + vec2 zh = czm_decompressTextureCoordinates(compressed0.y); + vec3 position = vec3(xy, zh.x); + float height = zh.y; + vec2 textureCoordinates = czm_decompressTextureCoordinates(compressed0.z); + + height = height * (u_minMaxHeight.y - u_minMaxHeight.x) + u_minMaxHeight.x; + position = (u_scaleAndBias * vec4(position, 1.0)).xyz; + +#if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL)) && defined(INCLUDE_WEB_MERCATOR_Y) || defined(APPLY_MATERIAL) + float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; + float encodedNormal = compressed1; +#elif defined(INCLUDE_WEB_MERCATOR_Y) + float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; + float encodedNormal = 0.0; +#elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) + float webMercatorT = textureCoordinates.y; + float encodedNormal = compressed0.w; +#else + float webMercatorT = textureCoordinates.y; + float encodedNormal = 0.0; +#endif + +#else + // A single float per element + vec3 position = position3DAndHeight.xyz; + float height = position3DAndHeight.w; + vec2 textureCoordinates = textureCoordAndEncodedNormals.xy; + +#if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)) && defined(INCLUDE_WEB_MERCATOR_Y) + float webMercatorT = textureCoordAndEncodedNormals.z; + float encodedNormal = textureCoordAndEncodedNormals.w; +#elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) + float webMercatorT = textureCoordinates.y; + float encodedNormal = textureCoordAndEncodedNormals.z; +#elif defined(INCLUDE_WEB_MERCATOR_Y) + float webMercatorT = textureCoordAndEncodedNormals.z; + float encodedNormal = 0.0; +#else + float webMercatorT = textureCoordinates.y; + float encodedNormal = 0.0; +#endif + +#endif + + vec3 position3DWC = position + u_center3D; + +#ifdef GEODETIC_SURFACE_NORMALS + vec3 ellipsoidNormal = geodeticSurfaceNormal; +#else + vec3 ellipsoidNormal = normalize(position3DWC); +#endif + +#if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) + float exaggeration = u_verticalExaggerationAndRelativeHeight.x; + float relativeHeight = u_verticalExaggerationAndRelativeHeight.y; + float newHeight = (height - relativeHeight) * exaggeration + relativeHeight; + + // stop from going through center of earth + float minRadius = min(min(czm_ellipsoidRadii.x, czm_ellipsoidRadii.y), czm_ellipsoidRadii.z); + newHeight = max(newHeight, -minRadius); + + vec3 offset = ellipsoidNormal * (newHeight - height); + position += offset; + position3DWC += offset; + height = newHeight; +#endif + + gl_Position = getPosition(position, height, textureCoordinates); + + v_positionEC = (u_modifiedModelView * vec4(position, 1.0)).xyz; + v_positionMC = position3DWC; // position in model coordinates + + v_textureCoordinates = vec3(textureCoordinates, webMercatorT); + +#if defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) + vec3 normalMC = czm_octDecode(encodedNormal); + +#if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) + vec3 projection = dot(normalMC, ellipsoidNormal) * ellipsoidNormal; + vec3 rejection = normalMC - projection; + normalMC = normalize(projection + rejection * exaggeration); +#endif + + v_normalMC = normalMC; + v_normalEC = czm_normal3D * v_normalMC; +#endif + +#ifdef ENABLE_CLIPPING_POLYGONS + vec2 sphericalLatLong = czm_approximateSphericalCoordinates(position3DWC); + sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); + + vec2 minDistance = vec2(czm_infinity); + v_clippingPosition = vec2(czm_infinity); + v_regionIndex = -1; + + for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { + vec4 extents = unpackClippingExtents(u_clippingExtents, regionIndex); + vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; + + vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); + vec2 distance = abs(rectUv - clamped) * extents.wz; + + float threshold = 0.01; + if (minDistance.x > distance.x || minDistance.y > distance.y) { + minDistance = distance; + v_clippingPosition = rectUv; + if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { + v_regionIndex = regionIndex; + } + } + } +#endif + +#if defined(FOG) || (defined(GROUND_ATMOSPHERE) && !defined(PER_FRAGMENT_GROUND_ATMOSPHERE)) + + bool dynamicLighting = false; + + #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) + dynamicLighting = true; + #endif + +#if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) + vec3 atmosphereLightDirection = czm_sunDirectionWC; +#else + vec3 atmosphereLightDirection = czm_lightDirectionWC; +#endif + + vec3 lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(position3DWC)); + + computeAtmosphereScattering( + position3DWC, + lightDirection, + v_atmosphereRayleighColor, + v_atmosphereMieColor, + v_atmosphereOpacity + ); +#endif + +#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) + v_distance = length((czm_modelView3D * vec4(position3DWC, 1.0)).xyz); +#endif + +#ifdef APPLY_MATERIAL + float northPoleZ = czm_ellipsoidRadii.z; + vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ); + vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal)); + float dotProd = abs(dot(ellipsoidNormal, v_normalMC)); + v_slope = acos(dotProd); + vec3 normalRejected = ellipsoidNormal * dotProd; + vec3 normalProjected = v_normalMC - normalRejected; + vec3 aspectVector = normalize(normalProjected); + v_aspect = acos(dot(aspectVector, vectorEastMC)); + float determ = dot(cross(vectorEastMC, aspectVector), ellipsoidNormal); + v_aspect = czm_branchFreeTernary(determ < 0.0, 2.0 * czm_pi - v_aspect, v_aspect); + v_height = height; +#endif +} +`, GroundAtmosphere = `void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity) { + + vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; + vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); + czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); + + float atmosphereInnerRadius = length(positionWC); + + computeScattering( + primaryRay, + length(cameraToPositionWC), + lightDirection, + atmosphereInnerRadius, + rayleighColor, + mieColor, + opacity + ); +} +`, ReprojectWebMercatorFS = `uniform sampler2D u_texture; + +in vec2 v_textureCoordinates; + +void main() +{ + out_FragColor = texture(u_texture, v_textureCoordinates); +} +`, ReprojectWebMercatorVS = `in vec4 position; +in float webMercatorT; + +uniform vec2 u_textureDimensions; + +out vec2 v_textureCoordinates; + +void main() +{ + v_textureCoordinates = vec2(position.x, webMercatorT); + gl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0)); +} +`, SkyAtmosphereCommon = `float interpolateByDistance(vec4 nearFarScalar, float distance) +{ + float startDistance = nearFarScalar.x; + float startValue = nearFarScalar.y; + float endDistance = nearFarScalar.z; + float endValue = nearFarScalar.w; + float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); + return mix(startValue, endValue, t); +} + +void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity, out float underTranslucentGlobe) +{ + float ellipsoidRadiiDifference = czm_ellipsoidRadii.x - czm_ellipsoidRadii.z; + + // Adjustment to the atmosphere radius applied based on the camera height. + float distanceAdjustMin = czm_ellipsoidRadii.x / 4.0; + float distanceAdjustMax = czm_ellipsoidRadii.x; + float distanceAdjustModifier = ellipsoidRadiiDifference / 2.0; + float distanceAdjust = distanceAdjustModifier * clamp((czm_eyeHeight - distanceAdjustMin) / (distanceAdjustMax - distanceAdjustMin), 0.0, 1.0); + + // Since atmosphere scattering assumes the atmosphere is a spherical shell, we compute an inner radius of the atmosphere best fit + // for the position on the ellipsoid. + float radiusAdjust = (ellipsoidRadiiDifference / 4.0) + distanceAdjust; + float atmosphereInnerRadius = (length(czm_viewerPositionWC) - czm_eyeHeight) - radiusAdjust; + + // Setup the primary ray: from the camera position to the vertex position. + vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; + vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); + czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); + + underTranslucentGlobe = 0.0; + + // Brighten the sky atmosphere under the Earth's atmosphere when translucency is enabled. + #if defined(GLOBE_TRANSLUCENT) + + // Check for intersection with the inner radius of the atmopshere. + czm_raySegment primaryRayEarthIntersect = czm_raySphereIntersectionInterval(primaryRay, vec3(0.0), atmosphereInnerRadius + radiusAdjust); + if (primaryRayEarthIntersect.start > 0.0 && primaryRayEarthIntersect.stop > 0.0) { + + // Compute position on globe. + vec3 direction = normalize(positionWC); + czm_ray ellipsoidRay = czm_ray(positionWC, -direction); + czm_raySegment ellipsoidIntersection = czm_rayEllipsoidIntersectionInterval(ellipsoidRay, vec3(0.0), czm_ellipsoidInverseRadii); + vec3 onEarth = positionWC - (direction * ellipsoidIntersection.start); + + // Control the color using the camera angle. + float angle = dot(normalize(czm_viewerPositionWC), normalize(onEarth)); + + // Control the opacity using the distance from Earth. + opacity = interpolateByDistance(vec4(0.0, 1.0, czm_ellipsoidRadii.x, 0.0), length(czm_viewerPositionWC - onEarth)); + vec3 horizonColor = vec3(0.1, 0.2, 0.3); + vec3 nearColor = vec3(0.0); + + rayleighColor = mix(nearColor, horizonColor, exp(-angle) * opacity); + + // Set the traslucent flag to avoid alpha adjustment in computeFinalColor funciton. + underTranslucentGlobe = 1.0; + return; + } + #endif + + computeScattering( + primaryRay, + length(cameraToPositionWC), + lightDirection, + atmosphereInnerRadius, + rayleighColor, + mieColor, + opacity + ); + + // Alter the opacity based on how close the viewer is to the ground. + // (0.0 = At edge of atmosphere, 1.0 = On ground) + float cameraHeight = czm_eyeHeight + atmosphereInnerRadius; + float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; + opacity = clamp((atmosphereOuterRadius - cameraHeight) / (atmosphereOuterRadius - atmosphereInnerRadius), 0.0, 1.0); + + // Alter alpha based on time of day (0.0 = night , 1.0 = day) + float nightAlpha = (u_radiiAndDynamicAtmosphereColor.z != 0.0) ? clamp(dot(normalize(positionWC), lightDirection), 0.0, 1.0) : 1.0; + opacity *= pow(nightAlpha, 0.5); +} +`, SkyAtmosphereFS = `in vec3 v_outerPositionWC; + +uniform vec3 u_hsbShift; + +#ifndef PER_FRAGMENT_ATMOSPHERE +in vec3 v_mieColor; +in vec3 v_rayleighColor; +in float v_opacity; +in float v_translucent; +#endif + +void main (void) +{ + float lightEnum = u_radiiAndDynamicAtmosphereColor.z; + vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(v_outerPositionWC, lightEnum); + + vec3 mieColor; + vec3 rayleighColor; + float opacity; + float translucent; + + #ifdef PER_FRAGMENT_ATMOSPHERE + computeAtmosphereScattering( + v_outerPositionWC, + lightDirection, + rayleighColor, + mieColor, + opacity, + translucent + ); + #else + mieColor = v_mieColor; + rayleighColor = v_rayleighColor; + opacity = v_opacity; + translucent = v_translucent; + #endif + + vec4 color = computeAtmosphereColor(v_outerPositionWC, lightDirection, rayleighColor, mieColor, opacity); + + #ifndef HDR + color.rgb = czm_pbrNeutralTonemapping(color.rgb); + color.rgb = czm_inverseGamma(color.rgb); + #endif + + #ifdef COLOR_CORRECT + const bool ignoreBlackPixels = true; + color.rgb = czm_applyHSBShift(color.rgb, u_hsbShift, ignoreBlackPixels); + #endif + + // For the parts of the sky atmosphere that are not behind a translucent globe, + // we mix in the default opacity so that the sky atmosphere still appears at distance. + // This is needed because the opacity in the sky atmosphere is initially adjusted based + // on the camera height. + if (translucent == 0.0) { + color.a = mix(color.b, 1.0, color.a) * smoothstep(0.0, 1.0, czm_morphTime); + } + + out_FragColor = color; +} +`, SkyAtmosphereVS = `in vec4 position; + +out vec3 v_outerPositionWC; + +#ifndef PER_FRAGMENT_ATMOSPHERE +out vec3 v_mieColor; +out vec3 v_rayleighColor; +out float v_opacity; +out float v_translucent; +#endif + +void main(void) +{ + vec4 positionWC = czm_model * position; + float lightEnum = u_radiiAndDynamicAtmosphereColor.z; + vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(positionWC.xyz, lightEnum); + + #ifndef PER_FRAGMENT_ATMOSPHERE + computeAtmosphereScattering( + positionWC.xyz, + lightDirection, + v_rayleighColor, + v_mieColor, + v_opacity, + v_translucent + ); + #endif + + v_outerPositionWC = positionWC.xyz; + gl_Position = czm_modelViewProjection * position; +} +`, SkyBoxFS = `uniform samplerCube u_cubeMap; + +in vec3 v_texCoord; + +void main() +{ + vec4 color = czm_textureCube(u_cubeMap, normalize(v_texCoord)); + out_FragColor = vec4(czm_gammaCorrect(color).rgb, czm_morphTime); +} +`, SkyBoxVS = `in vec3 position; + +out vec3 v_texCoord; + +void main() +{ + vec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position)); + gl_Position = czm_projection * vec4(p, 1.0); + v_texCoord = position.xyz; +} +`, SunFS = `uniform sampler2D u_texture; + +in vec2 v_textureCoordinates; + +void main() +{ + vec4 color = texture(u_texture, v_textureCoordinates); + out_FragColor = czm_gammaCorrect(color); +} +`, SunTextureFS = `uniform float u_radiusTS; + +in vec2 v_textureCoordinates; + +vec2 rotate(vec2 p, vec2 direction) +{ + return vec2(p.x * direction.x - p.y * direction.y, p.x * direction.y + p.y * direction.x); +} + +vec4 addBurst(vec2 position, vec2 direction, float lengthScalar) +{ + vec2 rotatedPosition = rotate(position, direction) * vec2(25.0, 0.75); + float radius = length(rotatedPosition) * lengthScalar; + float burst = 1.0 - smoothstep(0.0, 0.55, radius); + return vec4(burst); +} + +void main() +{ + float lengthScalar = 2.0 / sqrt(2.0); + vec2 position = v_textureCoordinates - vec2(0.5); + float radius = length(position) * lengthScalar; + float surface = step(radius, u_radiusTS); + vec4 color = vec4(vec2(1.0), surface + 0.2, surface); + + float glow = 1.0 - smoothstep(0.0, 0.55, radius); + color.ba += mix(vec2(0.0), vec2(1.0), glow) * 0.75; + + vec4 burst = vec4(0.0); + + // The following loop has been manually unrolled for speed, to + // avoid sin() and cos(). + // + //for (float i = 0.4; i < 3.2; i += 1.047) { + // vec2 direction = vec2(sin(i), cos(i)); + // burst += 0.4 * addBurst(position, direction, lengthScalar); + // + // direction = vec2(sin(i - 0.08), cos(i - 0.08)); + // burst += 0.3 * addBurst(position, direction, lengthScalar); + //} + + burst += 0.4 * addBurst(position, vec2(0.38942, 0.92106), lengthScalar); // angle == 0.4 + burst += 0.4 * addBurst(position, vec2(0.99235, 0.12348), lengthScalar); // angle == 0.4 + 1.047 + burst += 0.4 * addBurst(position, vec2(0.60327, -0.79754), lengthScalar); // angle == 0.4 + 1.047 * 2.0 + + burst += 0.3 * addBurst(position, vec2(0.31457, 0.94924), lengthScalar); // angle == 0.4 - 0.08 + burst += 0.3 * addBurst(position, vec2(0.97931, 0.20239), lengthScalar); // angle == 0.4 + 1.047 - 0.08 + burst += 0.3 * addBurst(position, vec2(0.66507, -0.74678), lengthScalar); // angle == 0.4 + 1.047 * 2.0 - 0.08 + + // End of manual loop unrolling. + + color += clamp(burst, vec4(0.0), vec4(1.0)) * 0.15; + + out_FragColor = clamp(color, vec4(0.0), vec4(1.0)); +} +`, SunVS = `in vec2 direction; + +uniform float u_size; + +out vec2 v_textureCoordinates; + +void main() +{ + vec4 position; + if (czm_morphTime == 1.0) + { + position = vec4(czm_sunPositionWC, 1.0); + } + else + { + position = vec4(czm_sunPositionColumbusView.zxy, 1.0); + } + + vec4 positionEC = czm_view * position; + vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); + + vec2 halfSize = vec2(u_size * 0.5); + halfSize *= ((direction * 2.0) - 1.0); + + gl_Position = czm_viewportOrthographic * vec4(positionWC.xy + halfSize, -positionWC.z, 1.0); + + v_textureCoordinates = direction; +} +`, ViewportQuadFS = ` +in vec2 v_textureCoordinates; + +void main() +{ + czm_materialInput materialInput; + + materialInput.s = v_textureCoordinates.s; + materialInput.st = v_textureCoordinates; + materialInput.str = vec3(v_textureCoordinates, 0.0); + materialInput.normalEC = vec3(0.0, 0.0, -1.0); + + czm_material material = czm_getMaterial(materialInput); + + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +} +`; +function formatError(e) { + let t; + const n = e.name, i = e.message; + defined(n) && defined(i) ? t = `${n}: ${i}` : t = e.toString(); + const r = e.stack; + return defined(r) && (t += ` +${r}`), t; +} +const HeightmapEncoding = { + /** + * No encoding + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * LERC encoding + * + * @type {number} + * @constant + * + * @see {@link https://github.com/Esri/lerc|The LERC specification} + */ + LERC: 1 +}, HeightmapEncoding$1 = Object.freeze(HeightmapEncoding), TerrainQuantization = { + /** + * The vertices are not compressed. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * The vertices are compressed to 12 bits. + * + * @type {number} + * @constant + */ + BITS12: 1 +}, TerrainQuantization$1 = Object.freeze(TerrainQuantization), cartesian3Scratch$1 = new Cartesian3(), cartesian3DimScratch = new Cartesian3(), cartesian2Scratch = new Cartesian2(), matrix4Scratch$1 = new Matrix4(), matrix4Scratch2 = new Matrix4(), SHIFT_LEFT_12 = Math.pow(2, 12); +function TerrainEncoding(e, t, n, i, r, o, s, c, l, d) { + let f = TerrainQuantization$1.NONE, h, p; + if (defined(t) && defined(n) && defined(i) && defined(r)) { + const m = t.minimum, _ = t.maximum, y = Cartesian3.subtract( + _, + m, + cartesian3DimScratch + ), C = i - n; + Math.max(Cartesian3.maximumComponent(y), C) < SHIFT_LEFT_12 - 1 ? f = TerrainQuantization$1.BITS12 : f = TerrainQuantization$1.NONE, h = Matrix4.inverseTransformation(r, new Matrix4()); + const x = Cartesian3.negate(m, cartesian3Scratch$1); + Matrix4.multiply( + Matrix4.fromTranslation(x, matrix4Scratch$1), + h, + h + ); + const b = cartesian3Scratch$1; + b.x = 1 / y.x, b.y = 1 / y.y, b.z = 1 / y.z, Matrix4.multiply(Matrix4.fromScale(b, matrix4Scratch$1), h, h), p = Matrix4.clone(r), Matrix4.setTranslation(p, Cartesian3.ZERO, p), r = Matrix4.clone(r, new Matrix4()); + const S = Matrix4.fromTranslation(m, matrix4Scratch$1), E = Matrix4.fromScale(y, matrix4Scratch2), A = Matrix4.multiply(S, E, matrix4Scratch$1); + Matrix4.multiply(r, A, r), Matrix4.multiply(p, A, p); + } + this.quantization = f, this.minimumHeight = n, this.maximumHeight = i, this.center = Cartesian3.clone(e), this.toScaledENU = h, this.fromScaledENU = r, this.matrix = p, this.hasVertexNormals = o, this.hasWebMercatorT = defaultValue(s, !1), this.hasGeodeticSurfaceNormals = defaultValue( + c, + !1 + ), this.exaggeration = defaultValue(l, 1), this.exaggerationRelativeHeight = defaultValue( + d, + 0 + ), this.stride = 0, this._offsetGeodeticSurfaceNormal = 0, this._offsetVertexNormal = 0, this._calculateStrideAndOffsets(); +} +TerrainEncoding.prototype.encode = function(e, t, n, i, r, o, s, c) { + const l = i.x, d = i.y; + if (this.quantization === TerrainQuantization$1.BITS12) { + n = Matrix4.multiplyByPoint( + this.toScaledENU, + n, + cartesian3Scratch$1 + ), n.x = CesiumMath.clamp(n.x, 0, 1), n.y = CesiumMath.clamp(n.y, 0, 1), n.z = CesiumMath.clamp(n.z, 0, 1); + const f = this.maximumHeight - this.minimumHeight, h = CesiumMath.clamp((r - this.minimumHeight) / f, 0, 1); + Cartesian2.fromElements(n.x, n.y, cartesian2Scratch); + const p = AttributeCompression.compressTextureCoordinates( + cartesian2Scratch + ); + Cartesian2.fromElements(n.z, h, cartesian2Scratch); + const m = AttributeCompression.compressTextureCoordinates( + cartesian2Scratch + ); + Cartesian2.fromElements(l, d, cartesian2Scratch); + const _ = AttributeCompression.compressTextureCoordinates( + cartesian2Scratch + ); + if (e[t++] = p, e[t++] = m, e[t++] = _, this.hasWebMercatorT) { + Cartesian2.fromElements(s, 0, cartesian2Scratch); + const y = AttributeCompression.compressTextureCoordinates( + cartesian2Scratch + ); + e[t++] = y; + } + } else + Cartesian3.subtract(n, this.center, cartesian3Scratch$1), e[t++] = cartesian3Scratch$1.x, e[t++] = cartesian3Scratch$1.y, e[t++] = cartesian3Scratch$1.z, e[t++] = r, e[t++] = l, e[t++] = d, this.hasWebMercatorT && (e[t++] = s); + return this.hasVertexNormals && (e[t++] = AttributeCompression.octPackFloat( + o + )), this.hasGeodeticSurfaceNormals && (e[t++] = c.x, e[t++] = c.y, e[t++] = c.z), t; +}; +const scratchPosition$3 = new Cartesian3(), scratchGeodeticSurfaceNormal = new Cartesian3(); +TerrainEncoding.prototype.addGeodeticSurfaceNormals = function(e, t, n) { + if (this.hasGeodeticSurfaceNormals) + return; + const i = this.stride, r = e.length / i; + this.hasGeodeticSurfaceNormals = !0, this._calculateStrideAndOffsets(); + const o = this.stride; + for (let s = 0; s < r; s++) { + for (let f = 0; f < i; f++) { + const h = s * i + f, p = s * o + f; + t[p] = e[h]; + } + const c = this.decodePosition(t, s, scratchPosition$3), l = n.geodeticSurfaceNormal( + c, + scratchGeodeticSurfaceNormal + ), d = s * o + this._offsetGeodeticSurfaceNormal; + t[d] = l.x, t[d + 1] = l.y, t[d + 2] = l.z; + } +}; +TerrainEncoding.prototype.removeGeodeticSurfaceNormals = function(e, t) { + if (!this.hasGeodeticSurfaceNormals) + return; + const n = this.stride, i = e.length / n; + this.hasGeodeticSurfaceNormals = !1, this._calculateStrideAndOffsets(); + const r = this.stride; + for (let o = 0; o < i; o++) + for (let s = 0; s < r; s++) { + const c = o * n + s, l = o * r + s; + t[l] = e[c]; + } +}; +TerrainEncoding.prototype.decodePosition = function(e, t, n) { + if (defined(n) || (n = new Cartesian3()), t *= this.stride, this.quantization === TerrainQuantization$1.BITS12) { + const i = AttributeCompression.decompressTextureCoordinates( + e[t], + cartesian2Scratch + ); + n.x = i.x, n.y = i.y; + const r = AttributeCompression.decompressTextureCoordinates( + e[t + 1], + cartesian2Scratch + ); + return n.z = r.x, Matrix4.multiplyByPoint(this.fromScaledENU, n, n); + } + return n.x = e[t], n.y = e[t + 1], n.z = e[t + 2], Cartesian3.add(n, this.center, n); +}; +TerrainEncoding.prototype.getExaggeratedPosition = function(e, t, n) { + n = this.decodePosition(e, t, n); + const i = this.exaggeration, r = this.exaggerationRelativeHeight; + if (i !== 1 && this.hasGeodeticSurfaceNormals) { + const s = this.decodeGeodeticSurfaceNormal( + e, + t, + scratchGeodeticSurfaceNormal + ), c = this.decodeHeight(e, t), l = VerticalExaggeration.getHeight( + c, + i, + r + ) - c; + n.x += s.x * l, n.y += s.y * l, n.z += s.z * l; + } + return n; +}; +TerrainEncoding.prototype.decodeTextureCoordinates = function(e, t, n) { + return defined(n) || (n = new Cartesian2()), t *= this.stride, this.quantization === TerrainQuantization$1.BITS12 ? AttributeCompression.decompressTextureCoordinates( + e[t + 2], + n + ) : Cartesian2.fromElements(e[t + 4], e[t + 5], n); +}; +TerrainEncoding.prototype.decodeHeight = function(e, t) { + return t *= this.stride, this.quantization === TerrainQuantization$1.BITS12 ? AttributeCompression.decompressTextureCoordinates( + e[t + 1], + cartesian2Scratch + ).y * (this.maximumHeight - this.minimumHeight) + this.minimumHeight : e[t + 3]; +}; +TerrainEncoding.prototype.decodeWebMercatorT = function(e, t) { + return t *= this.stride, this.quantization === TerrainQuantization$1.BITS12 ? AttributeCompression.decompressTextureCoordinates( + e[t + 3], + cartesian2Scratch + ).x : e[t + 6]; +}; +TerrainEncoding.prototype.getOctEncodedNormal = function(e, t, n) { + t = t * this.stride + this._offsetVertexNormal; + const i = e[t] / 256, r = Math.floor(i), o = (i - r) * 256; + return Cartesian2.fromElements(r, o, n); +}; +TerrainEncoding.prototype.decodeGeodeticSurfaceNormal = function(e, t, n) { + return t = t * this.stride + this._offsetGeodeticSurfaceNormal, n.x = e[t], n.y = e[t + 1], n.z = e[t + 2], n; +}; +TerrainEncoding.prototype._calculateStrideAndOffsets = function() { + let e = 0; + switch (this.quantization) { + case TerrainQuantization$1.BITS12: + e += 3; + break; + default: + e += 6; + } + this.hasWebMercatorT && (e += 1), this.hasVertexNormals && (this._offsetVertexNormal = e, e += 1), this.hasGeodeticSurfaceNormals && (this._offsetGeodeticSurfaceNormal = e, e += 3), this.stride = e; +}; +const attributesIndicesNone = { + position3DAndHeight: 0, + textureCoordAndEncodedNormals: 1, + geodeticSurfaceNormal: 2 +}, attributesIndicesBits12 = { + compressed0: 0, + compressed1: 1, + geodeticSurfaceNormal: 2 +}; +TerrainEncoding.prototype.getAttributes = function(e) { + const t = ComponentDatatype$1.FLOAT, n = ComponentDatatype$1.getSizeInBytes(t), i = this.stride * n; + let r = 0; + const o = []; + function s(c, l) { + o.push({ + index: c, + vertexBuffer: e, + componentDatatype: t, + componentsPerAttribute: l, + offsetInBytes: r, + strideInBytes: i + }), r += l * n; + } + if (this.quantization === TerrainQuantization$1.NONE) { + s(attributesIndicesNone.position3DAndHeight, 4); + let c = 2; + c += this.hasWebMercatorT ? 1 : 0, c += this.hasVertexNormals ? 1 : 0, s( + attributesIndicesNone.textureCoordAndEncodedNormals, + c + ), this.hasGeodeticSurfaceNormals && s(attributesIndicesNone.geodeticSurfaceNormal, 3); + } else { + const c = this.hasWebMercatorT || this.hasVertexNormals, l = this.hasWebMercatorT && this.hasVertexNormals; + s( + attributesIndicesBits12.compressed0, + c ? 4 : 3 + ), l && s(attributesIndicesBits12.compressed1, 1), this.hasGeodeticSurfaceNormals && s(attributesIndicesBits12.geodeticSurfaceNormal, 3); + } + return o; +}; +TerrainEncoding.prototype.getAttributeLocations = function() { + return this.quantization === TerrainQuantization$1.NONE ? attributesIndicesNone : attributesIndicesBits12; +}; +TerrainEncoding.clone = function(e, t) { + if (defined(e)) + return defined(t) || (t = new TerrainEncoding()), t.quantization = e.quantization, t.minimumHeight = e.minimumHeight, t.maximumHeight = e.maximumHeight, t.center = Cartesian3.clone(e.center), t.toScaledENU = Matrix4.clone(e.toScaledENU), t.fromScaledENU = Matrix4.clone(e.fromScaledENU), t.matrix = Matrix4.clone(e.matrix), t.hasVertexNormals = e.hasVertexNormals, t.hasWebMercatorT = e.hasWebMercatorT, t.hasGeodeticSurfaceNormals = e.hasGeodeticSurfaceNormals, t.exaggeration = e.exaggeration, t.exaggerationRelativeHeight = e.exaggerationRelativeHeight, t._calculateStrideAndOffsets(), t; +}; +const HeightmapTessellator = {}; +HeightmapTessellator.DEFAULT_STRUCTURE = Object.freeze({ + heightScale: 1, + heightOffset: 0, + elementsPerHeight: 1, + stride: 1, + elementMultiplier: 256, + isBigEndian: !1 +}); +const cartesian3Scratch = new Cartesian3(), matrix4Scratch = new Matrix4(), minimumScratch = new Cartesian3(), maximumScratch = new Cartesian3(); +HeightmapTessellator.computeVertices = function(e) { + const t = Math.cos, n = Math.sin, i = Math.sqrt, r = Math.atan, o = Math.exp, s = CesiumMath.PI_OVER_TWO, c = CesiumMath.toRadians, l = e.heightmap, d = e.width, f = e.height, h = e.skirtHeight, p = h > 0, m = defaultValue(e.isGeographic, !0), _ = defaultValue(e.ellipsoid, Ellipsoid.default), y = 1 / _.maximumRadius, C = Rectangle.clone(e.nativeRectangle), T = Rectangle.clone(e.rectangle); + let x, b, S, E; + defined(T) ? (x = T.west, b = T.south, S = T.east, E = T.north) : m ? (x = c(C.west), b = c(C.south), S = c(C.east), E = c(C.north)) : (x = C.west * y, b = s - 2 * r(o(-C.south * y)), S = C.east * y, E = s - 2 * r(o(-C.north * y))); + let A = e.relativeToCenter; + const D = defined(A); + A = D ? A : Cartesian3.ZERO; + const P = defaultValue(e.includeWebMercatorT, !1), I = defaultValue(e.exaggeration, 1), M = defaultValue( + e.exaggerationRelativeHeight, + 0 + ), L = I !== 1, g = defaultValue( + e.structure, + HeightmapTessellator.DEFAULT_STRUCTURE + ), w = defaultValue( + g.heightScale, + HeightmapTessellator.DEFAULT_STRUCTURE.heightScale + ), O = defaultValue( + g.heightOffset, + HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset + ), N = defaultValue( + g.elementsPerHeight, + HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight + ), F = defaultValue( + g.stride, + HeightmapTessellator.DEFAULT_STRUCTURE.stride + ), B = defaultValue( + g.elementMultiplier, + HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier + ), V = defaultValue( + g.isBigEndian, + HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian + ); + let U = Rectangle.computeWidth(C), k = Rectangle.computeHeight(C); + const $ = U / (d - 1), G = k / (f - 1); + m || (U *= y, k *= y); + const q = _.radiiSquared, z = q.x, H = q.y, Q = q.z; + let ne = 65536, K = -65536; + const Z = Transforms.eastNorthUpToFixedFrame( + A, + _ + ), ee = Matrix4.inverseTransformation(Z, matrix4Scratch); + let oe, X; + P && (oe = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + b + ), X = 1 / (WebMercatorProjection.geodeticLatitudeToMercatorAngle(E) - oe)); + const fe = minimumScratch; + fe.x = Number.POSITIVE_INFINITY, fe.y = Number.POSITIVE_INFINITY, fe.z = Number.POSITIVE_INFINITY; + const de = maximumScratch; + de.x = Number.NEGATIVE_INFINITY, de.y = Number.NEGATIVE_INFINITY, de.z = Number.NEGATIVE_INFINITY; + let ce = Number.POSITIVE_INFINITY; + const ye = d * f, ge = h > 0 ? d * 2 + f * 2 : 0, re = ye + ge, be = new Array(re), pe = new Array(re), Te = new Array(re), xe = P ? new Array(re) : [], W = L ? new Array(re) : []; + let j = 0, se = f, Pe = 0, le = d; + p && (--j, ++se, --Pe, ++le); + const De = 1e-5; + for (let ie = j; ie < se; ++ie) { + let ue = ie; + ue < 0 && (ue = 0), ue >= f && (ue = f - 1); + let me = C.north - G * ue; + m ? me = c(me) : me = s - 2 * r(o(-me * y)); + let Se = (me - b) / (E - b); + Se = CesiumMath.clamp(Se, 0, 1); + const we = ie === j, Ee = ie === se - 1; + h > 0 && (we ? me += De * k : Ee && (me -= De * k)); + const Ve = t(me), We = n(me), Ne = Q * We; + let Ae; + P && (Ae = (WebMercatorProjection.geodeticLatitudeToMercatorAngle(me) - oe) * X); + for (let ke = Pe; ke < le; ++ke) { + let Fe = ke; + Fe < 0 && (Fe = 0), Fe >= d && (Fe = d - 1); + const Je = ue * (d * F) + Fe * F; + let ve; + if (N === 1) + ve = l[Je]; + else { + ve = 0; + let Ie; + if (V) + for (Ie = 0; Ie < N; ++Ie) + ve = ve * B + l[Je + Ie]; + else + for (Ie = N - 1; Ie >= 0; --Ie) + ve = ve * B + l[Je + Ie]; + } + ve = ve * w + O, K = Math.max(K, ve), ne = Math.min(ne, ve); + let Le = C.west + $ * Fe; + m ? Le = c(Le) : Le = Le * y; + let rt = (Le - x) / (S - x); + rt = CesiumMath.clamp(rt, 0, 1); + let Be = ue * d + Fe; + if (h > 0) { + const Ie = ke === Pe, _e = ke === le - 1, Y = we || Ee || Ie || _e; + if ((we || Ee) && (Ie || _e)) + continue; + Y && (ve -= h, Ie ? (Be = ye + (f - ue - 1), Le -= De * U) : Ee ? Be = ye + f + (d - Fe - 1) : _e ? (Be = ye + f + d + ue, Le += De * U) : we && (Be = ye + f + d + f + Fe)); + } + const Ze = Ve * t(Le), je = Ve * n(Le), at = z * Ze, ze = H * je, Ye = 1 / i(at * Ze + ze * je + Ne * We), Ue = at * Ye, et = ze * Ye, tt = Ne * Ye, nt = new Cartesian3(); + nt.x = Ue + Ze * ve, nt.y = et + je * ve, nt.z = tt + We * ve, Matrix4.multiplyByPoint(ee, nt, cartesian3Scratch), Cartesian3.minimumByComponent(cartesian3Scratch, fe, fe), Cartesian3.maximumByComponent(cartesian3Scratch, de, de), ce = Math.min(ce, ve), be[Be] = nt, Te[Be] = new Cartesian2(rt, Se), pe[Be] = ve, P && (xe[Be] = Ae), L && (W[Be] = _.geodeticSurfaceNormal( + nt + )); + } + } + const Me = BoundingSphere.fromPoints(be); + let He; + defined(T) && (He = OrientedBoundingBox.fromRectangle( + T, + ne, + K, + _ + )); + let Oe; + D && (Oe = new EllipsoidalOccluder(_).computeHorizonCullingPointPossiblyUnderEllipsoid( + A, + be, + ne + )); + const $e = new AxisAlignedBoundingBox(fe, de, A), J = new TerrainEncoding( + A, + $e, + ce, + K, + Z, + !1, + P, + L, + I, + M + ), ae = new Float32Array(re * J.stride); + let te = 0; + for (let ie = 0; ie < re; ++ie) + te = J.encode( + ae, + te, + be[ie], + Te[ie], + pe[ie], + void 0, + xe[ie], + W[ie] + ); + return { + vertices: ae, + maximumHeight: K, + minimumHeight: ne, + encoding: J, + boundingSphere3D: Me, + orientedBoundingBox: He, + occludeePointInScaledSpace: Oe + }; +}; +function TerrainData() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(TerrainData.prototype, { + /** + * An array of credits for this tile. + * @memberof TerrainData.prototype + * @type {Credit[]} + */ + credits: { + get: DeveloperError.throwInstantiationError + }, + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @memberof TerrainData.prototype + * @type {Uint8Array|HTMLImageElement|HTMLCanvasElement} + */ + waterMask: { + get: DeveloperError.throwInstantiationError + } +}); +TerrainData.prototype.interpolateHeight = DeveloperError.throwInstantiationError; +TerrainData.prototype.isChildAvailable = DeveloperError.throwInstantiationError; +TerrainData.prototype.createMesh = DeveloperError.throwInstantiationError; +TerrainData.prototype.upsample = DeveloperError.throwInstantiationError; +TerrainData.prototype.wasCreatedByUpsampling = DeveloperError.throwInstantiationError; +TerrainData.maximumAsynchronousTasks = 5; +function TerrainMesh(e, t, n, i, r, o, s, c, l, d, f, h, p, m, _, y) { + this.center = e, this.vertices = t, this.stride = defaultValue(d, 6), this.indices = n, this.indexCountWithoutSkirts = i, this.vertexCountWithoutSkirts = r, this.minimumHeight = o, this.maximumHeight = s, this.boundingSphere3D = c, this.occludeePointInScaledSpace = l, this.orientedBoundingBox = f, this.encoding = h, this.westIndicesSouthToNorth = p, this.southIndicesEastToWest = m, this.eastIndicesNorthToSouth = _, this.northIndicesWestToEast = y; +} +function TerrainProvider() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(TerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof TerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof TerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof TerrainProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof TerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof TerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof TerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: DeveloperError.throwInstantiationError + } +}); +const regularGridIndicesCache = []; +TerrainProvider.getRegularGridIndices = function(e, t) { + let n = regularGridIndicesCache[e]; + defined(n) || (regularGridIndicesCache[e] = n = []); + let i = n[t]; + return defined(i) || (e * t < CesiumMath.SIXTY_FOUR_KILOBYTES ? i = n[t] = new Uint16Array( + (e - 1) * (t - 1) * 6 + ) : i = n[t] = new Uint32Array( + (e - 1) * (t - 1) * 6 + ), addRegularGridIndices(e, t, i, 0)), i; +}; +const regularGridAndEdgeIndicesCache = []; +TerrainProvider.getRegularGridIndicesAndEdgeIndices = function(e, t) { + let n = regularGridAndEdgeIndicesCache[e]; + defined(n) || (regularGridAndEdgeIndicesCache[e] = n = []); + let i = n[t]; + if (!defined(i)) { + const r = TerrainProvider.getRegularGridIndices(e, t), o = getEdgeIndices(e, t), s = o.westIndicesSouthToNorth, c = o.southIndicesEastToWest, l = o.eastIndicesNorthToSouth, d = o.northIndicesWestToEast; + i = n[t] = { + indices: r, + westIndicesSouthToNorth: s, + southIndicesEastToWest: c, + eastIndicesNorthToSouth: l, + northIndicesWestToEast: d + }; + } + return i; +}; +const regularGridAndSkirtAndEdgeIndicesCache = []; +TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices = function(e, t) { + let n = regularGridAndSkirtAndEdgeIndicesCache[e]; + defined(n) || (regularGridAndSkirtAndEdgeIndicesCache[e] = n = []); + let i = n[t]; + if (!defined(i)) { + const r = e * t, o = (e - 1) * (t - 1) * 6, s = e * 2 + t * 2, c = Math.max(0, s - 4) * 6, l = r + s, d = o + c, f = getEdgeIndices(e, t), h = f.westIndicesSouthToNorth, p = f.southIndicesEastToWest, m = f.eastIndicesNorthToSouth, _ = f.northIndicesWestToEast, y = IndexDatatype$1.createTypedArray(l, d); + addRegularGridIndices(e, t, y, 0), TerrainProvider.addSkirtIndices( + h, + p, + m, + _, + r, + y, + o + ), i = n[t] = { + indices: y, + westIndicesSouthToNorth: h, + southIndicesEastToWest: p, + eastIndicesNorthToSouth: m, + northIndicesWestToEast: _, + indexCountWithoutSkirts: o + }; + } + return i; +}; +TerrainProvider.addSkirtIndices = function(e, t, n, i, r, o, s) { + let c = r; + s = addSkirtIndices( + e, + c, + o, + s + ), c += e.length, s = addSkirtIndices( + t, + c, + o, + s + ), c += t.length, s = addSkirtIndices( + n, + c, + o, + s + ), c += n.length, addSkirtIndices(i, c, o, s); +}; +function getEdgeIndices(e, t) { + const n = new Array(t), i = new Array(e), r = new Array(t), o = new Array(e); + let s; + for (s = 0; s < e; ++s) + o[s] = s, i[s] = e * t - 1 - s; + for (s = 0; s < t; ++s) + r[s] = (s + 1) * e - 1, n[s] = (t - s - 1) * e; + return { + westIndicesSouthToNorth: n, + southIndicesEastToWest: i, + eastIndicesNorthToSouth: r, + northIndicesWestToEast: o + }; +} +function addRegularGridIndices(e, t, n, i) { + let r = 0; + for (let o = 0; o < t - 1; ++o) { + for (let s = 0; s < e - 1; ++s) { + const c = r, l = c + e, d = l + 1, f = c + 1; + n[i++] = c, n[i++] = l, n[i++] = f, n[i++] = f, n[i++] = l, n[i++] = d, ++r; + } + ++r; + } +} +function addSkirtIndices(e, t, n, i) { + let r = e[0]; + const o = e.length; + for (let s = 1; s < o; ++s) { + const c = e[s]; + n[i++] = r, n[i++] = c, n[i++] = t, n[i++] = t, n[i++] = c, n[i++] = t + 1, r = c, ++t; + } + return i; +} +TerrainProvider.heightmapTerrainQuality = 0.25; +TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap = function(e, t, n) { + return e.maximumRadius * 2 * Math.PI * TerrainProvider.heightmapTerrainQuality / (t * n); +}; +TerrainProvider.prototype.requestTileGeometry = DeveloperError.throwInstantiationError; +TerrainProvider.prototype.getLevelMaximumGeometricError = DeveloperError.throwInstantiationError; +TerrainProvider.prototype.getTileDataAvailable = DeveloperError.throwInstantiationError; +TerrainProvider.prototype.loadTileDataAvailability = DeveloperError.throwInstantiationError; +function HeightmapTerrainData(e) { + this._buffer = e.buffer, this._width = e.width, this._height = e.height, this._childTileMask = defaultValue(e.childTileMask, 15), this._encoding = defaultValue(e.encoding, HeightmapEncoding$1.NONE); + const t = HeightmapTessellator.DEFAULT_STRUCTURE; + let n = e.structure; + defined(n) ? n !== t && (n.heightScale = defaultValue( + n.heightScale, + t.heightScale + ), n.heightOffset = defaultValue( + n.heightOffset, + t.heightOffset + ), n.elementsPerHeight = defaultValue( + n.elementsPerHeight, + t.elementsPerHeight + ), n.stride = defaultValue(n.stride, t.stride), n.elementMultiplier = defaultValue( + n.elementMultiplier, + t.elementMultiplier + ), n.isBigEndian = defaultValue( + n.isBigEndian, + t.isBigEndian + )) : n = t, this._structure = n, this._createdByUpsampling = defaultValue(e.createdByUpsampling, !1), this._waterMask = e.waterMask, this._skirtHeight = void 0, this._bufferType = this._encoding === HeightmapEncoding$1.LERC ? Float32Array : this._buffer.constructor, this._mesh = void 0; +} +Object.defineProperties(HeightmapTerrainData.prototype, { + /** + * An array of credits for this tile. + * @memberof HeightmapTerrainData.prototype + * @type {Credit[]} + */ + credits: { + get: function() { + } + }, + /** + * The water mask included in this terrain data, if any. A water mask is a square + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @memberof HeightmapTerrainData.prototype + * @type {Uint8Array|HTMLImageElement|HTMLCanvasElement} + */ + waterMask: { + get: function() { + return this._waterMask; + } + }, + childTileMask: { + get: function() { + return this._childTileMask; + } + } +}); +const createMeshTaskName$2 = "createVerticesFromHeightmap", createMeshTaskProcessorNoThrottle$2 = new TaskProcessor(createMeshTaskName$2), createMeshTaskProcessorThrottle$2 = new TaskProcessor( + createMeshTaskName$2, + TerrainData.maximumAsynchronousTasks +); +HeightmapTerrainData.prototype.createMesh = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.tilingScheme, n = e.x, i = e.y, r = e.level, o = defaultValue(e.exaggeration, 1), s = defaultValue( + e.exaggerationRelativeHeight, + 0 + ), c = defaultValue(e.throttle, !0), l = t.ellipsoid, d = t.tileXYToNativeRectangle(n, i, r), f = t.tileXYToRectangle(n, i, r), h = l.cartographicToCartesian(Rectangle.center(f)), p = this._structure, _ = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + l, + this._width, + t.getNumberOfXTilesAtLevel(0) + ) / (1 << r); + this._skirtHeight = Math.min(_ * 4, 1e3); + const C = (c ? createMeshTaskProcessorThrottle$2 : createMeshTaskProcessorNoThrottle$2).scheduleTask({ + heightmap: this._buffer, + structure: p, + includeWebMercatorT: !0, + width: this._width, + height: this._height, + nativeRectangle: d, + rectangle: f, + relativeToCenter: h, + ellipsoid: l, + skirtHeight: this._skirtHeight, + isGeographic: t.projection instanceof GeographicProjection, + exaggeration: o, + exaggerationRelativeHeight: s, + encoding: this._encoding + }); + if (!defined(C)) + return; + const T = this; + return Promise.resolve(C).then(function(x) { + let b; + T._skirtHeight > 0 ? b = TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices( + x.gridWidth, + x.gridHeight + ) : b = TerrainProvider.getRegularGridIndicesAndEdgeIndices( + x.gridWidth, + x.gridHeight + ); + const S = x.gridWidth * x.gridHeight; + return T._mesh = new TerrainMesh( + h, + new Float32Array(x.vertices), + b.indices, + b.indexCountWithoutSkirts, + S, + x.minimumHeight, + x.maximumHeight, + BoundingSphere.clone(x.boundingSphere3D), + Cartesian3.clone(x.occludeePointInScaledSpace), + x.numberOfAttributes, + OrientedBoundingBox.clone(x.orientedBoundingBox), + TerrainEncoding.clone(x.encoding), + b.westIndicesSouthToNorth, + b.southIndicesEastToWest, + b.eastIndicesNorthToSouth, + b.northIndicesWestToEast + ), T._buffer = void 0, T._mesh; + }); +}; +HeightmapTerrainData.prototype._createMeshSync = function(e) { + const t = e.tilingScheme, n = e.x, i = e.y, r = e.level, o = defaultValue(e.exaggeration, 1), s = defaultValue( + e.exaggerationRelativeHeight, + 0 + ), c = t.ellipsoid, l = t.tileXYToNativeRectangle(n, i, r), d = t.tileXYToRectangle(n, i, r), f = c.cartographicToCartesian(Rectangle.center(d)), h = this._structure, m = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + c, + this._width, + t.getNumberOfXTilesAtLevel(0) + ) / (1 << r); + this._skirtHeight = Math.min(m * 4, 1e3); + const _ = HeightmapTessellator.computeVertices({ + heightmap: this._buffer, + structure: h, + includeWebMercatorT: !0, + width: this._width, + height: this._height, + nativeRectangle: l, + rectangle: d, + relativeToCenter: f, + ellipsoid: c, + skirtHeight: this._skirtHeight, + isGeographic: t.projection instanceof GeographicProjection, + exaggeration: o, + exaggerationRelativeHeight: s + }); + this._buffer = void 0; + let y; + this._skirtHeight > 0 ? y = TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices( + this._width, + this._height + ) : y = TerrainProvider.getRegularGridIndicesAndEdgeIndices( + this._width, + this._height + ); + const C = _.gridWidth * _.gridHeight; + return this._mesh = new TerrainMesh( + f, + _.vertices, + y.indices, + y.indexCountWithoutSkirts, + C, + _.minimumHeight, + _.maximumHeight, + _.boundingSphere3D, + _.occludeePointInScaledSpace, + _.encoding.stride, + _.orientedBoundingBox, + _.encoding, + y.westIndicesSouthToNorth, + y.southIndicesEastToWest, + y.eastIndicesNorthToSouth, + y.northIndicesWestToEast + ), this._mesh; +}; +HeightmapTerrainData.prototype.interpolateHeight = function(e, t, n) { + const i = this._width, r = this._height, o = this._structure, s = o.stride, c = o.elementsPerHeight, l = o.elementMultiplier, d = o.isBigEndian, f = o.heightOffset, h = o.heightScale, p = defined(this._mesh), m = this._encoding === HeightmapEncoding$1.LERC; + if (!p && m) + return; + let y; + if (p) { + const C = this._mesh.vertices, T = this._mesh.encoding; + y = interpolateMeshHeight$2( + C, + T, + f, + h, + e, + i, + r, + t, + n + ); + } else + y = interpolateHeight$2( + this._buffer, + c, + l, + s, + d, + e, + i, + r, + t, + n + ), y = y * h + f; + return y; +}; +HeightmapTerrainData.prototype.upsample = function(e, t, n, i, r, o, s) { + const c = this._mesh; + if (!defined(c)) + return; + const l = this._width, d = this._height, f = this._structure, h = f.stride, p = new this._bufferType(l * d * h), m = c.vertices, _ = c.encoding, y = e.tileXYToRectangle( + t, + n, + i + ), C = e.tileXYToRectangle( + r, + o, + s + ), T = f.heightOffset, x = f.heightScale, b = f.elementsPerHeight, S = f.elementMultiplier, E = f.isBigEndian, A = Math.pow(S, b - 1); + for (let D = 0; D < d; ++D) { + const P = CesiumMath.lerp( + C.north, + C.south, + D / (d - 1) + ); + for (let I = 0; I < l; ++I) { + const M = CesiumMath.lerp( + C.west, + C.east, + I / (l - 1) + ); + let R = interpolateMeshHeight$2( + m, + _, + T, + x, + y, + l, + d, + M, + P + ); + R = R < f.lowestEncodedHeight ? f.lowestEncodedHeight : R, R = R > f.highestEncodedHeight ? f.highestEncodedHeight : R, setHeight( + p, + b, + S, + A, + h, + E, + D * l + I, + R + ); + } + } + return Promise.resolve( + new HeightmapTerrainData({ + buffer: p, + width: l, + height: d, + childTileMask: 0, + structure: this._structure, + createdByUpsampling: !0 + }) + ); +}; +HeightmapTerrainData.prototype.isChildAvailable = function(e, t, n, i) { + let r = 2; + return n !== e * 2 && ++r, i !== t * 2 && (r -= 2), (this._childTileMask & 1 << r) !== 0; +}; +HeightmapTerrainData.prototype.wasCreatedByUpsampling = function() { + return this._createdByUpsampling; +}; +function interpolateHeight$2(e, t, n, i, r, o, s, c, l, d) { + const f = (l - o.west) * (s - 1) / (o.east - o.west), h = (d - o.south) * (c - 1) / (o.north - o.south); + let p = f | 0, m = p + 1; + m >= s && (m = s - 1, p = s - 2); + let _ = h | 0, y = _ + 1; + y >= c && (y = c - 1, _ = c - 2); + const C = f - p, T = h - _; + _ = c - 1 - _, y = c - 1 - y; + const x = getHeight( + e, + t, + n, + i, + r, + _ * s + p + ), b = getHeight( + e, + t, + n, + i, + r, + _ * s + m + ), S = getHeight( + e, + t, + n, + i, + r, + y * s + p + ), E = getHeight( + e, + t, + n, + i, + r, + y * s + m + ); + return triangleInterpolateHeight( + C, + T, + x, + b, + S, + E + ); +} +function interpolateMeshHeight$2(e, t, n, i, r, o, s, c, l) { + const d = (c - r.west) * (o - 1) / (r.east - r.west), f = (l - r.south) * (s - 1) / (r.north - r.south); + let h = d | 0, p = h + 1; + p >= o && (p = o - 1, h = o - 2); + let m = f | 0, _ = m + 1; + _ >= s && (_ = s - 1, m = s - 2); + const y = d - h, C = f - m; + m = s - 1 - m, _ = s - 1 - _; + const T = (t.decodeHeight(e, m * o + h) - n) / i, x = (t.decodeHeight(e, m * o + p) - n) / i, b = (t.decodeHeight(e, _ * o + h) - n) / i, S = (t.decodeHeight(e, _ * o + p) - n) / i; + return triangleInterpolateHeight( + y, + C, + T, + x, + b, + S + ); +} +function triangleInterpolateHeight(e, t, n, i, r, o) { + return t < e ? n + e * (i - n) + t * (o - i) : n + e * (o - r) + t * (r - n); +} +function getHeight(e, t, n, i, r, o) { + o *= i; + let s = 0, c; + if (r) + for (c = 0; c < t; ++c) + s = s * n + e[o + c]; + else + for (c = t - 1; c >= 0; --c) + s = s * n + e[o + c]; + return s; +} +function setHeight(e, t, n, i, r, o, s, c) { + s *= r; + let l; + if (o) + for (l = 0; l < t - 1; ++l) + e[s + l] = c / i | 0, c -= e[s + l] * i, i /= n; + else + for (l = t - 1; l > 0; --l) + e[s + l] = c / i | 0, c -= e[s + l] * i, i /= n; + e[s + l] = c; +} +function EllipsoidTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._tilingScheme = e.tilingScheme, defined(this._tilingScheme) || (this._tilingScheme = new GeographicTilingScheme({ + ellipsoid: defaultValue(e.ellipsoid, Ellipsoid.default) + })), this._levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + this._tilingScheme.ellipsoid, + 64, + this._tilingScheme.getNumberOfXTilesAtLevel(0) + ), this._errorEvent = new Event(); +} +Object.defineProperties(EllipsoidTerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof EllipsoidTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof EllipsoidTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof EllipsoidTerrainProvider.prototype + * @type {GeographicTilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof EllipsoidTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return !1; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof EllipsoidTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return !1; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof EllipsoidTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + } + } +}); +EllipsoidTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + return Promise.resolve( + new HeightmapTerrainData({ + buffer: new Uint8Array(16 * 16), + width: 16, + height: 16 + }) + ); +}; +EllipsoidTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +EllipsoidTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { +}; +EllipsoidTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { +}; +const textureResolutionScratch = new Cartesian2(); +function getClippingFunction(e, t) { + const n = e.unionClippingRegions, i = e.length, r = ClippingPlaneCollection.useFloatTexture(t), o = ClippingPlaneCollection.getTextureResolution( + e, + t, + textureResolutionScratch + ), s = o.x, c = o.y; + let l = r ? getClippingPlaneFloat(s, c) : getClippingPlaneUint8(s, c); + return l += ` +`, l += n ? clippingFunctionUnion(i) : clippingFunctionIntersect(i), l; +} +function clippingFunctionUnion(e) { + return `float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) +{ + vec4 position = czm_windowToEyeCoordinates(fragCoord); + vec3 clipNormal = vec3(0.0); + vec3 clipPosition = vec3(0.0); + float clipAmount; + float pixelWidth = czm_metersPerPixel(position); + bool breakAndDiscard = false; + for (int i = 0; i < ${e}; ++i) + { + vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); + clipNormal = clippingPlane.xyz; + clipPosition = -clippingPlane.w * clipNormal; + float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; + clipAmount = czm_branchFreeTernary(i == 0, amount, min(amount, clipAmount)); + if (amount <= 0.0) + { + breakAndDiscard = true; + break; + } + } + if (breakAndDiscard) { + discard; + } + return clipAmount; +} +`; +} +function clippingFunctionIntersect(e) { + return `float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) +{ + bool clipped = true; + vec4 position = czm_windowToEyeCoordinates(fragCoord); + vec3 clipNormal = vec3(0.0); + vec3 clipPosition = vec3(0.0); + float clipAmount = 0.0; + float pixelWidth = czm_metersPerPixel(position); + for (int i = 0; i < ${e}; ++i) + { + vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); + clipNormal = clippingPlane.xyz; + clipPosition = -clippingPlane.w * clipNormal; + float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; + clipAmount = max(amount, clipAmount); + clipped = clipped && (amount <= 0.0); + } + if (clipped) + { + discard; + } + return clipAmount; +} +`; +} +function getClippingPlaneFloat(e, t) { + const n = 1 / e, i = 1 / t; + let r = `${n}`; + r.indexOf(".") === -1 && (r += ".0"); + let o = `${i}`; + return o.indexOf(".") === -1 && (o += ".0"), `vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) +{ + int pixY = clippingPlaneNumber / ${e}; + int pixX = clippingPlaneNumber - (pixY * ${e}); + float u = (float(pixX) + 0.5) * ${r}; + float v = (float(pixY) + 0.5) * ${o}; + vec4 plane = texture(packedClippingPlanes, vec2(u, v)); + return czm_transformPlane(plane, transform); +} +`; +} +function getClippingPlaneUint8(e, t) { + const n = 1 / e, i = 1 / t; + let r = `${n}`; + r.indexOf(".") === -1 && (r += ".0"); + let o = `${i}`; + return o.indexOf(".") === -1 && (o += ".0"), `vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) +{ + int clippingPlaneStartIndex = clippingPlaneNumber * 2; + int pixY = clippingPlaneStartIndex / ${e}; + int pixX = clippingPlaneStartIndex - (pixY * ${e}); + float u = (float(pixX) + 0.5) * ${r}; + float v = (float(pixY) + 0.5) * ${o}; + vec4 oct32 = texture(packedClippingPlanes, vec2(u, v)) * 255.0; + vec2 oct = vec2(oct32.x * 256.0 + oct32.y, oct32.z * 256.0 + oct32.w); + vec4 plane; + plane.xyz = czm_octDecode(oct, 65535.0); + plane.w = czm_unpackFloat(texture(packedClippingPlanes, vec2(u + ${r}, v))); + return czm_transformPlane(plane, transform); +} +`; +} +function GlobeSurfaceShader(e, t, n, i, r, o) { + this.numberOfDayTextures = e, this.flags = t, this.material = n, this.shaderProgram = i, this.clippingShaderState = r, this.clippingPolygonShaderState = o; +} +function GlobeSurfaceShaderSet() { + this.baseVertexShaderSource = void 0, this.baseFragmentShaderSource = void 0, this._shadersByTexturesFlags = [], this.material = void 0; +} +function getPositionMode(e) { + const t = "vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPosition3DMode(position, height, textureCoordinates); }", n = "vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionColumbusViewMode(position, height, textureCoordinates); }", i = "vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionMorphingMode(position, height, textureCoordinates); }"; + let r; + switch (e) { + case SceneMode$1.SCENE3D: + r = t; + break; + case SceneMode$1.SCENE2D: + case SceneMode$1.COLUMBUS_VIEW: + r = n; + break; + case SceneMode$1.MORPHING: + r = i; + break; + } + return r; +} +function getPolygonClippingFunction(e) { + return e.webgl2 ? `void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { + czm_clipPolygons(clippingDistance, regionsLength, clippingPosition, regionIndex); + }` : `void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { + }`; +} +function getUnpackClippingFunction(e) { + return e.webgl2 ? `vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { + return czm_unpackClippingExtents(extentsTexture, index); + }` : `vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { + return vec4(); + }`; +} +function get2DYPositionFraction(e) { + return e ? "float get2DYPositionFraction(vec2 textureCoordinates) { return get2DMercatorYPositionFraction(textureCoordinates); }" : "float get2DYPositionFraction(vec2 textureCoordinates) { return get2DGeographicYPositionFraction(textureCoordinates); }"; +} +GlobeSurfaceShaderSet.prototype.getShaderProgram = function(e) { + const t = e.frameState, n = e.surfaceTile, i = e.numberOfDayTextures, r = e.applyBrightness, o = e.applyContrast, s = e.applyHue, c = e.applySaturation, l = e.applyGamma, d = e.applyAlpha, f = e.applyDayNightAlpha, h = e.applySplit, p = e.hasWaterMask, m = e.showReflectiveOcean, _ = e.showOceanWaves, y = e.enableLighting, C = e.dynamicAtmosphereLighting, T = e.dynamicAtmosphereLightingFromSun, x = e.showGroundAtmosphere, b = e.perFragmentGroundAtmosphere, S = e.hasVertexNormals, E = e.useWebMercatorProjection, A = e.enableFog, D = e.enableClippingPlanes, P = e.clippingPlanes, I = e.enableClippingPolygons, M = e.clippingPolygons, R = e.clippedByBoundaries, L = e.hasImageryLayerCutout, g = e.colorCorrect, w = e.highlightFillTile, O = e.colorToAlpha, N = e.hasGeodeticSurfaceNormals, F = e.hasExaggeration, B = e.showUndergroundColor, V = e.translucent; + let U = 0, k = ""; + const G = n.renderedMesh.encoding; + G.quantization === TerrainQuantization$1.BITS12 && (U = 1, k = "QUANTIZATION_BITS12"); + let z = 0, H = ""; + R && (z = 1, H = "TILE_LIMIT_RECTANGLE"); + let Q = 0, ne = ""; + L && (Q = 1, ne = "APPLY_IMAGERY_CUTOUT"); + const K = t.mode, Z = K | r << 2 | o << 3 | s << 4 | c << 5 | l << 6 | d << 7 | p << 8 | m << 9 | _ << 10 | y << 11 | C << 12 | T << 13 | x << 14 | b << 15 | S << 16 | E << 17 | A << 18 | U << 19 | h << 20 | D << 21 | I << 22 | z << 23 | Q << 24 | g << 25 | w << 26 | O << 27 | N << 28 | F << 29 | B << 30 | V << 31 | f << 32; + let ee = 0; + defined(P) && P.length > 0 && (ee = D ? P.clippingPlanesState : 0); + let oe = 0; + defined(M) && M.length > 0 && (oe = I ? M.clippingPolygonsState : 0); + let X = n.surfaceShader; + if (defined(X) && X.numberOfDayTextures === i && X.flags === Z && X.material === this.material && X.clippingShaderState === ee && X.clippingPolygonShaderState === oe) + return X.shaderProgram; + let fe = this._shadersByTexturesFlags[i]; + if (defined(fe) || (fe = this._shadersByTexturesFlags[i] = []), X = fe[Z], !defined(X) || X.material !== this.material || X.clippingShaderState !== ee || X.clippingPolygonShaderState !== oe) { + const de = this.baseVertexShaderSource.clone(), ce = this.baseFragmentShaderSource.clone(); + ee !== 0 && ce.sources.unshift( + getClippingFunction(P, t.context) + ), oe !== 0 && (ce.sources.unshift(getPolygonClippingFunction(t.context)), de.sources.unshift(getUnpackClippingFunction(t.context))), de.defines.push(k), ce.defines.push( + `TEXTURE_UNITS ${i}`, + H, + ne + ), r && ce.defines.push("APPLY_BRIGHTNESS"), o && ce.defines.push("APPLY_CONTRAST"), s && ce.defines.push("APPLY_HUE"), c && ce.defines.push("APPLY_SATURATION"), l && ce.defines.push("APPLY_GAMMA"), d && ce.defines.push("APPLY_ALPHA"), f && ce.defines.push("APPLY_DAY_NIGHT_ALPHA"), p && ce.defines.push("HAS_WATER_MASK"), m && (ce.defines.push("SHOW_REFLECTIVE_OCEAN"), de.defines.push("SHOW_REFLECTIVE_OCEAN")), _ && ce.defines.push("SHOW_OCEAN_WAVES"), O && ce.defines.push("APPLY_COLOR_TO_ALPHA"), B && (de.defines.push("UNDERGROUND_COLOR"), ce.defines.push("UNDERGROUND_COLOR")), V && (de.defines.push("TRANSLUCENT"), ce.defines.push("TRANSLUCENT")), y && (S ? (de.defines.push("ENABLE_VERTEX_LIGHTING"), ce.defines.push("ENABLE_VERTEX_LIGHTING")) : (de.defines.push("ENABLE_DAYNIGHT_SHADING"), ce.defines.push("ENABLE_DAYNIGHT_SHADING"))), typeof globalThis < "u" && globalThis.useVcsCustomShading && ce.defines.push("USE_VCS_CUSTOM_SHADING"), C && (de.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"), ce.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"), T && (de.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"), ce.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"))), x && (de.defines.push("GROUND_ATMOSPHERE"), ce.defines.push("GROUND_ATMOSPHERE"), b && (de.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"), ce.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"))), de.defines.push("INCLUDE_WEB_MERCATOR_Y"), ce.defines.push("INCLUDE_WEB_MERCATOR_Y"), A && (de.defines.push("FOG"), ce.defines.push("FOG")), h && ce.defines.push("APPLY_SPLIT"), D && ce.defines.push("ENABLE_CLIPPING_PLANES"), I && (ce.defines.push("ENABLE_CLIPPING_POLYGONS"), de.defines.push("ENABLE_CLIPPING_POLYGONS"), M.inverse && ce.defines.push("CLIPPING_INVERSE"), ce.defines.push( + `CLIPPING_POLYGON_REGIONS_LENGTH ${M.extentsCount}` + ), de.defines.push( + `CLIPPING_POLYGON_REGIONS_LENGTH ${M.extentsCount}` + )), g && ce.defines.push("COLOR_CORRECT"), w && ce.defines.push("HIGHLIGHT_FILL_TILE"), N && de.defines.push("GEODETIC_SURFACE_NORMALS"), F && de.defines.push("EXAGGERATION"); + let ye = ` vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend) + { + vec4 color = initialColor; +`; + L && (ye += ` vec4 cutoutAndColorResult; + bool texelUnclipped; +`); + for (let re = 0; re < i; ++re) + L ? ye += ` cutoutAndColorResult = u_dayTextureCutoutRectangles[${re}]; + texelUnclipped = v_textureCoordinates.x < cutoutAndColorResult.x || cutoutAndColorResult.z < v_textureCoordinates.x || v_textureCoordinates.y < cutoutAndColorResult.y || cutoutAndColorResult.w < v_textureCoordinates.y; + cutoutAndColorResult = sampleAndBlend( +` : ye += ` color = sampleAndBlend( +`, ye += ` color, + u_dayTextures[${re}], + u_dayTextureUseWebMercatorT[${re}] ? textureCoordinates.xz : textureCoordinates.xy, + u_dayTextureTexCoordsRectangle[${re}], + u_dayTextureTranslationAndScale[${re}], + ${d ? `u_dayTextureAlpha[${re}]` : "1.0"}, + ${f ? `u_dayTextureNightAlpha[${re}]` : "1.0"}, +${f ? `u_dayTextureDayAlpha[${re}]` : "1.0"}, +${r ? `u_dayTextureBrightness[${re}]` : "0.0"}, + ${o ? `u_dayTextureContrast[${re}]` : "0.0"}, + ${s ? `u_dayTextureHue[${re}]` : "0.0"}, + ${c ? `u_dayTextureSaturation[${re}]` : "0.0"}, + ${l ? `u_dayTextureOneOverGamma[${re}]` : "0.0"}, + ${h ? `u_dayTextureSplit[${re}]` : "0.0"}, + ${O ? `u_colorsToAlpha[${re}]` : "vec4(0.0)"}, + nightBlend ); +`, L && (ye += ` color = czm_branchFreeTernary(texelUnclipped, cutoutAndColorResult, color); +`); + ye += ` return color; + }`, ce.sources.push(ye), de.sources.push(getPositionMode(K)), de.sources.push(get2DYPositionFraction(E)); + const ge = ShaderProgram.fromCache({ + context: t.context, + vertexShaderSource: de, + fragmentShaderSource: ce, + attributeLocations: G.getAttributeLocations() + }); + X = fe[Z] = new GlobeSurfaceShader( + i, + Z, + this.material, + ge, + ee, + oe + ); + } + return n.surfaceShader = X, X.shaderProgram; +}; +GlobeSurfaceShaderSet.prototype.destroy = function() { + let e, t; + const n = this._shadersByTexturesFlags; + for (const i in n) + if (n.hasOwnProperty(i)) { + const r = n[i]; + if (!defined(r)) + continue; + for (e in r) + r.hasOwnProperty(e) && (t = r[e], defined(t) && t.shaderProgram.destroy()); + } + return destroyObject(this); +}; +const Visibility = { + /** + * Represents that no part of an object is visible. + * + * @type {number} + * @constant + */ + NONE: -1, + /** + * Represents that part, but not all, of an object is visible + * + * @type {number} + * @constant + */ + PARTIAL: 0, + /** + * Represents that an object is visible in its entirety. + * + * @type {number} + * @constant + */ + FULL: 1 +}, Visibility$1 = Object.freeze(Visibility); +function TileProviderError(e, t, n, i, r, o, s) { + this.provider = e, this.message = t, this.x = n, this.y = i, this.level = r, this.timesRetried = defaultValue(o, 0), this.retry = !1, this.error = s; +} +TileProviderError.reportError = function(e, t, n, i, r, o, s, c) { + let l = e; + return defined(e) ? (l.provider = t, l.message = i, l.x = r, l.y = o, l.level = s, l.retry = !1, l.error = c, ++l.timesRetried) : l = new TileProviderError( + t, + i, + r, + o, + s, + 0, + c + ), defined(n) && n.numberOfListeners > 0 ? n.raiseEvent(l) : defined(t) && console.log( + `An error occurred in "${t.constructor.name}": ${formatError( + i + )}` + ), l; +}; +TileProviderError.reportSuccess = function(e) { + defined(e) && (e.timesRetried = -1); +}; +const ImageryState = { + UNLOADED: 0, + TRANSITIONING: 1, + RECEIVED: 2, + TEXTURE_LOADED: 3, + READY: 4, + FAILED: 5, + INVALID: 6, + PLACEHOLDER: 7 +}, ImageryState$1 = Object.freeze(ImageryState), QuadtreeTileLoadState = { + /** + * The tile is new and loading has not yet begun. + * @type QuadtreeTileLoadState + * @constant + * @default 0 + */ + START: 0, + /** + * Loading is in progress. + * @type QuadtreeTileLoadState + * @constant + * @default 1 + */ + LOADING: 1, + /** + * Loading is complete. + * @type QuadtreeTileLoadState + * @constant + * @default 2 + */ + DONE: 2, + /** + * The tile has failed to load. + * @type QuadtreeTileLoadState + * @constant + * @default 3 + */ + FAILED: 3 +}, QuadtreeTileLoadState$1 = Object.freeze(QuadtreeTileLoadState), TerrainState$1 = { + FAILED: 0, + UNLOADED: 1, + RECEIVING: 2, + RECEIVED: 3, + TRANSFORMING: 4, + TRANSFORMED: 5, + READY: 6 +}, TerrainState$2 = Object.freeze(TerrainState$1); +function GlobeSurfaceTile() { + this.imagery = [], this.waterMaskTexture = void 0, this.waterMaskTranslationAndScale = new Cartesian4(0, 0, 1, 1), this.terrainData = void 0, this.vertexArray = void 0, this.tileBoundingRegion = void 0, this.occludeePointInScaledSpace = new Cartesian3(), this.boundingVolumeSourceTile = void 0, this.boundingVolumeIsFromMesh = !1, this.terrainState = TerrainState$2.UNLOADED, this.mesh = void 0, this.fill = void 0, this.pickBoundingSphere = new BoundingSphere(), this.surfaceShader = void 0, this.isClipped = !0, this.clippedByBoundaries = !1; +} +Object.defineProperties(GlobeSurfaceTile.prototype, { + /** + * Gets a value indicating whether or not this tile is eligible to be unloaded. + * Typically, a tile is ineligible to be unloaded while an asynchronous operation, + * such as a request for data, is in progress on it. A tile will never be + * unloaded while it is needed for rendering, regardless of the value of this + * property. + * @memberof GlobeSurfaceTile.prototype + * @type {boolean} + */ + eligibleForUnloading: { + get: function() { + const e = this.terrainState; + let n = !(e === TerrainState$2.RECEIVING || e === TerrainState$2.TRANSFORMING); + const i = this.imagery; + for (let r = 0, o = i.length; n && r < o; ++r) { + const s = i[r]; + n = !defined(s.loadingImagery) || s.loadingImagery.state !== ImageryState$1.TRANSITIONING; + } + return n; + } + }, + /** + * Gets the {@link TerrainMesh} that is used for rendering this tile, if any. + * Returns the value of the {@link GlobeSurfaceTile#mesh} property if + * {@link GlobeSurfaceTile#vertexArray} is defined. Otherwise, It returns the + * {@link TerrainFillMesh#mesh} property of the {@link GlobeSurfaceTile#fill}. + * If there is no fill, it returns undefined. + * + * @memberof GlobeSurfaceTile.prototype + * @type {TerrainMesh} + */ + renderedMesh: { + get: function() { + if (defined(this.vertexArray)) + return this.mesh; + if (defined(this.fill)) + return this.fill.mesh; + } + } +}); +const scratchCartographic$5 = new Cartographic(); +function getPosition$1(e, t, n, i, r, o) { + let s = e.getExaggeratedPosition(i, r, o); + if (defined(t) && t !== SceneMode$1.SCENE3D) { + const l = n.ellipsoid.cartesianToCartographic( + s, + scratchCartographic$5 + ); + s = n.project(l, o), s = Cartesian3.fromElements( + s.z, + s.x, + s.y, + o + ); + } + return s; +} +const scratchV0$1 = new Cartesian3(), scratchV1$1 = new Cartesian3(), scratchV2 = new Cartesian3(); +GlobeSurfaceTile.prototype.pick = function(e, t, n, i, r) { + const o = this.renderedMesh; + if (!defined(o)) + return; + const s = o.vertices, c = o.indices, l = o.encoding, d = c.length; + let f = Number.MAX_VALUE; + for (let h = 0; h < d; h += 3) { + const p = c[h], m = c[h + 1], _ = c[h + 2], y = getPosition$1(l, t, n, s, p, scratchV0$1), C = getPosition$1(l, t, n, s, m, scratchV1$1), T = getPosition$1(l, t, n, s, _, scratchV2), x = IntersectionTests.rayTriangleParametric( + e, + y, + C, + T, + i + ); + defined(x) && x < f && x >= 0 && (f = x); + } + return f !== Number.MAX_VALUE ? Ray.getPoint(e, f, r) : void 0; +}; +GlobeSurfaceTile.prototype.freeResources = function() { + defined(this.waterMaskTexture) && (--this.waterMaskTexture.referenceCount, this.waterMaskTexture.referenceCount === 0 && this.waterMaskTexture.destroy(), this.waterMaskTexture = void 0), this.terrainData = void 0, this.terrainState = TerrainState$2.UNLOADED, this.mesh = void 0, this.fill = this.fill && this.fill.destroy(); + const e = this.imagery; + for (let t = 0, n = e.length; t < n; ++t) + e[t].freeResources(); + this.imagery.length = 0, this.freeVertexArray(); +}; +GlobeSurfaceTile.prototype.freeVertexArray = function() { + GlobeSurfaceTile._freeVertexArray(this.vertexArray), this.vertexArray = void 0, GlobeSurfaceTile._freeVertexArray(this.wireframeVertexArray), this.wireframeVertexArray = void 0; +}; +GlobeSurfaceTile.initialize = function(e, t, n) { + let i = e.data; + defined(i) || (i = e.data = new GlobeSurfaceTile()), e.state === QuadtreeTileLoadState$1.START && (prepareNewTile(e, t, n), e.state = QuadtreeTileLoadState$1.LOADING); +}; +GlobeSurfaceTile.processStateMachine = function(e, t, n, i, r, o, s) { + GlobeSurfaceTile.initialize(e, n, i); + const c = e.data; + if (e.state === QuadtreeTileLoadState$1.LOADING && processTerrainStateMachine( + e, + t, + n, + i, + r, + o + ), s) + return; + const l = e.renderable; + e.renderable = defined(c.vertexArray); + const d = c.terrainState === TerrainState$2.READY; + e.upsampledFromParent = defined(c.terrainData) && c.terrainData.wasCreatedByUpsampling(); + const f = c.processImagery( + e, + n, + t + ); + if (d && f) { + const h = e._loadedCallbacks, p = {}; + for (const m in h) + h.hasOwnProperty(m) && (h[m](e) || (p[m] = h[m])); + e._loadedCallbacks = p, e.state = QuadtreeTileLoadState$1.DONE; + } + l && (e.renderable = !0); +}; +GlobeSurfaceTile.prototype.processImagery = function(e, t, n, i) { + const r = e.data; + let o = e.upsampledFromParent, s = !1, c = !0; + const l = r.imagery; + let d, f; + for (d = 0, f = l.length; d < f; ++d) { + const h = l[d]; + if (!defined(h.loadingImagery)) { + o = !1; + continue; + } + if (h.loadingImagery.state === ImageryState$1.PLACEHOLDER) { + const m = h.loadingImagery.imageryLayer; + if (m.ready) { + h.freeResources(), l.splice(d, 1), m._createTileImagerySkeletons(e, t, d), --d, f = l.length; + continue; + } else + o = !1; + } + const p = h.processStateMachine( + e, + n, + i + ); + c = c && p, s = s || p || defined(h.readyImagery), o = o && defined(h.loadingImagery) && (h.loadingImagery.state === ImageryState$1.FAILED || h.loadingImagery.state === ImageryState$1.INVALID); + } + return e.upsampledFromParent = o, e.renderable = e.renderable && (s || c), c; +}; +function toggleGeodeticSurfaceNormals(e, t, n, i) { + const r = e.renderedMesh, o = r.vertices, s = r.encoding, c = o.length / s.stride; + let l = TerrainEncoding.clone(s); + l.hasGeodeticSurfaceNormals = t, l = TerrainEncoding.clone(l); + const d = l.stride, f = new Float32Array(c * d); + t ? s.addGeodeticSurfaceNormals( + o, + f, + n + ) : s.removeGeodeticSurfaceNormals(o, f), r.vertices = f, r.stride = d, r !== e.mesh ? (GlobeSurfaceTile._freeVertexArray(e.fill.vertexArray), e.fill.vertexArray = GlobeSurfaceTile._createVertexArrayForMesh( + i.context, + r + )) : (GlobeSurfaceTile._freeVertexArray(e.vertexArray), e.vertexArray = GlobeSurfaceTile._createVertexArrayForMesh( + i.context, + r + )), GlobeSurfaceTile._freeVertexArray(e.wireframeVertexArray), e.wireframeVertexArray = void 0; +} +GlobeSurfaceTile.prototype.addGeodeticSurfaceNormals = function(e, t) { + toggleGeodeticSurfaceNormals(this, !0, e, t); +}; +GlobeSurfaceTile.prototype.removeGeodeticSurfaceNormals = function(e) { + toggleGeodeticSurfaceNormals(this, !1, void 0, e); +}; +GlobeSurfaceTile.prototype.updateExaggeration = function(e, t, n) { + const i = this, r = i.renderedMesh; + if (r === void 0) + return; + const o = t.verticalExaggeration, s = t.verticalExaggerationRelativeHeight, c = o !== 1, l = r.encoding, d = l.exaggeration !== o, f = l.exaggerationRelativeHeight !== s; + if (d || f) { + if (d) + if (c && !l.hasGeodeticSurfaceNormals) { + const h = e.tilingScheme.ellipsoid; + i.addGeodeticSurfaceNormals(h, t); + } else !c && l.hasGeodeticSurfaceNormals && i.removeGeodeticSurfaceNormals(t); + if (l.exaggeration = o, l.exaggerationRelativeHeight = s, n !== void 0) { + n._tileToUpdateHeights.push(e); + const h = e.customData, p = h.length; + for (let m = 0; m < p; m++) { + const _ = h[m]; + _.level = -1; + } + } + } +}; +function prepareNewTile(e, t, n) { + let i = t.getTileDataAvailable( + e.x, + e.y, + e.level + ); + if (!defined(i) && defined(e.parent)) { + const r = e.parent, o = r.data; + defined(o) && defined(o.terrainData) && (i = o.terrainData.isChildAvailable( + r.x, + r.y, + e.x, + e.y + )); + } + i === !1 && (e.data.terrainState = TerrainState$2.FAILED); + for (let r = 0, o = n.length; r < o; ++r) { + const s = n.get(r); + s.show && s._createTileImagerySkeletons(e, t); + } +} +function processTerrainStateMachine(e, t, n, i, r, o) { + const s = e.data, c = e.parent; + if (s.terrainState === TerrainState$2.FAILED && c !== void 0 && (c.data !== void 0 && c.data.terrainData !== void 0 && c.data.terrainData.canUpsample !== !1 || GlobeSurfaceTile.processStateMachine( + c, + t, + n, + i, + r, + o, + !0 + )), s.terrainState === TerrainState$2.FAILED && upsample( + s, + e, + t, + n, + e.x, + e.y, + e.level + ), s.terrainState === TerrainState$2.UNLOADED && requestTileGeometry$1( + s, + n, + e.x, + e.y, + e.level + ), s.terrainState === TerrainState$2.RECEIVED && transform( + s, + t, + n, + e.x, + e.y, + e.level + ), s.terrainState === TerrainState$2.TRANSFORMED && (createResources$2( + s, + t.context, + n, + e.x, + e.y, + e.level, + o + ), s.updateExaggeration(e, t, r)), s.terrainState >= TerrainState$2.RECEIVED && s.waterMaskTexture === void 0 && n.hasWaterMask) + if (s.terrainData.waterMask !== void 0) + createWaterMaskTextureIfNeeded(t.context, s); + else { + const d = s._findAncestorTileWithTerrainData(e); + defined(d) && defined(d.data.waterMaskTexture) && (s.waterMaskTexture = d.data.waterMaskTexture, ++s.waterMaskTexture.referenceCount, s._computeWaterMaskTranslationAndScale( + e, + d, + s.waterMaskTranslationAndScale + )); + } +} +function upsample(e, t, n, i, r, o, s) { + const c = t.parent; + if (!c) { + t.state = QuadtreeTileLoadState$1.FAILED; + return; + } + const l = c.data.terrainData, d = c.x, f = c.y, h = c.level; + if (!defined(l)) + return; + const p = l.upsample( + i.tilingScheme, + d, + f, + h, + r, + o, + s + ); + defined(p) && (e.terrainState = TerrainState$2.RECEIVING, Promise.resolve(p).then(function(m) { + defined(m) && (e.terrainData = m, e.terrainState = TerrainState$2.RECEIVED); + }).catch(function() { + e.terrainState = TerrainState$2.FAILED; + })); +} +function requestTileGeometry$1(e, t, n, i, r) { + function o(l) { + if (!defined(l)) { + e.terrainState = TerrainState$2.UNLOADED, e.request = void 0; + return; + } + e.terrainData = l, e.terrainState = TerrainState$2.RECEIVED, e.request = void 0; + } + function s(l) { + if (e.request.state === RequestState$1.CANCELLED) { + e.terrainData = void 0, e.terrainState = TerrainState$2.UNLOADED, e.request = void 0; + return; + } + e.terrainState = TerrainState$2.FAILED, e.request = void 0; + const d = `Failed to obtain terrain tile X: ${n} Y: ${i} Level: ${r}. Error message: "${l}"`; + t._requestError = TileProviderError.reportError( + t._requestError, + t, + t.errorEvent, + d, + n, + i, + r + ), t._requestError.retry && c(); + } + function c() { + const l = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.TERRAIN + }); + e.request = l; + const d = t.requestTileGeometry( + n, + i, + r, + l + ); + defined(d) ? (e.terrainState = TerrainState$2.RECEIVING, Promise.resolve(d).then(function(f) { + o(f); + }).catch(function(f) { + s(f); + })) : (e.terrainState = TerrainState$2.UNLOADED, e.request = void 0); + } + c(); +} +const scratchCreateMeshOptions = { + tilingScheme: void 0, + x: 0, + y: 0, + level: 0, + exaggeration: 1, + exaggerationRelativeHeight: 0, + throttle: !0 +}; +function transform(e, t, n, i, r, o) { + const s = n.tilingScheme, c = scratchCreateMeshOptions; + c.tilingScheme = s, c.x = i, c.y = r, c.level = o, c.exaggeration = t.verticalExaggeration, c.exaggerationRelativeHeight = t.verticalExaggerationRelativeHeight, c.throttle = !0; + const d = e.terrainData.createMesh(c); + defined(d) && (e.terrainState = TerrainState$2.TRANSFORMING, Promise.resolve(d).then(function(f) { + e.mesh = f, e.terrainState = TerrainState$2.TRANSFORMED; + }).catch(function() { + e.terrainState = TerrainState$2.FAILED; + })); +} +GlobeSurfaceTile._createVertexArrayForMesh = function(e, t) { + const n = t.vertices, i = Buffer.createVertexBuffer({ + context: e, + typedArray: n, + usage: BufferUsage$1.STATIC_DRAW + }), r = t.encoding.getAttributes(i), o = t.indices.indexBuffers || {}; + let s = o[e.id]; + if (!defined(s) || s.isDestroyed()) { + const c = t.indices; + s = Buffer.createIndexBuffer({ + context: e, + typedArray: c, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.fromSizeInBytes(c.BYTES_PER_ELEMENT) + }), s.vertexArrayDestroyable = !1, s.referenceCount = 1, o[e.id] = s, t.indices.indexBuffers = o; + } else + ++s.referenceCount; + return new VertexArray({ + context: e, + attributes: r, + indexBuffer: s + }); +}; +GlobeSurfaceTile._freeVertexArray = function(e) { + if (defined(e)) { + const t = e.indexBuffer; + e.isDestroyed() || e.destroy(), defined(t) && !t.isDestroyed() && defined(t.referenceCount) && (--t.referenceCount, t.referenceCount === 0 && t.destroy()); + } +}; +function createResources$2(e, t, n, i, r, o, s) { + e.vertexArray = GlobeSurfaceTile._createVertexArrayForMesh( + t, + e.mesh + ), e.terrainState = TerrainState$2.READY, e.fill = e.fill && e.fill.destroy(s); +} +function getContextWaterMaskData(e) { + let t = e.cache.tile_waterMaskData; + if (!defined(t)) { + const n = Texture.create({ + context: e, + pixelFormat: PixelFormat$1.LUMINANCE, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + arrayBufferView: new Uint8Array([255]), + width: 1, + height: 1 + } + }); + n.referenceCount = 1; + const i = new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }); + t = { + allWaterTexture: n, + sampler: i, + destroy: function() { + this.allWaterTexture.destroy(); + } + }, e.cache.tile_waterMaskData = t; + } + return t; +} +function createWaterMaskTextureIfNeeded(e, t) { + const n = t.terrainData.waterMask, i = getContextWaterMaskData(e); + let r; + const o = n.length; + if (o === 1) + if (n[0] !== 0) + r = i.allWaterTexture; + else + return; + else { + const s = Math.sqrt(o); + r = Texture.create({ + context: e, + pixelFormat: PixelFormat$1.LUMINANCE, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + width: s, + height: s, + arrayBufferView: n + }, + sampler: i.sampler, + flipY: !1 + }), r.referenceCount = 0; + } + ++r.referenceCount, t.waterMaskTexture = r, Cartesian4.fromElements( + 0, + 0, + 1, + 1, + t.waterMaskTranslationAndScale + ); +} +GlobeSurfaceTile.prototype._findAncestorTileWithTerrainData = function(e) { + let t = e.parent; + for (; defined(t) && (!defined(t.data) || !defined(t.data.terrainData) || t.data.terrainData.wasCreatedByUpsampling()); ) + t = t.parent; + return t; +}; +GlobeSurfaceTile.prototype._computeWaterMaskTranslationAndScale = function(e, t, n) { + const i = t.rectangle, r = e.rectangle, o = r.width, s = r.height, c = o / i.width, l = s / i.height; + return n.x = c * (r.west - i.west) / o, n.y = l * (r.south - i.south) / s, n.z = c, n.w = l, n; +}; +function WebMercatorTilingScheme(e) { + if (e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this._numberOfLevelZeroTilesX = defaultValue( + e.numberOfLevelZeroTilesX, + 1 + ), this._numberOfLevelZeroTilesY = defaultValue( + e.numberOfLevelZeroTilesY, + 1 + ), this._projection = new WebMercatorProjection(this._ellipsoid), defined(e.rectangleSouthwestInMeters) && defined(e.rectangleNortheastInMeters)) + this._rectangleSouthwestInMeters = e.rectangleSouthwestInMeters, this._rectangleNortheastInMeters = e.rectangleNortheastInMeters; + else { + const i = this._ellipsoid.maximumRadius * Math.PI; + this._rectangleSouthwestInMeters = new Cartesian2( + -i, + -i + ), this._rectangleNortheastInMeters = new Cartesian2( + i, + i + ); + } + const t = this._projection.unproject( + this._rectangleSouthwestInMeters + ), n = this._projection.unproject( + this._rectangleNortheastInMeters + ); + this._rectangle = new Rectangle( + t.longitude, + t.latitude, + n.longitude, + n.latitude + ); +} +Object.defineProperties(WebMercatorTilingScheme.prototype, { + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + * @memberof WebMercatorTilingScheme.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + * @memberof WebMercatorTilingScheme.prototype + * @type {Rectangle} + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the map projection used by this tiling scheme. + * @memberof WebMercatorTilingScheme.prototype + * @type {MapProjection} + */ + projection: { + get: function() { + return this._projection; + } + } +}); +WebMercatorTilingScheme.prototype.getNumberOfXTilesAtLevel = function(e) { + return this._numberOfLevelZeroTilesX << e; +}; +WebMercatorTilingScheme.prototype.getNumberOfYTilesAtLevel = function(e) { + return this._numberOfLevelZeroTilesY << e; +}; +WebMercatorTilingScheme.prototype.rectangleToNativeRectangle = function(e, t) { + const n = this._projection, i = n.project(Rectangle.southwest(e)), r = n.project(Rectangle.northeast(e)); + return defined(t) ? (t.west = i.x, t.south = i.y, t.east = r.x, t.north = r.y, t) : new Rectangle(i.x, i.y, r.x, r.y); +}; +WebMercatorTilingScheme.prototype.tileXYToNativeRectangle = function(e, t, n, i) { + const r = this.getNumberOfXTilesAtLevel(n), o = this.getNumberOfYTilesAtLevel(n), s = (this._rectangleNortheastInMeters.x - this._rectangleSouthwestInMeters.x) / r, c = this._rectangleSouthwestInMeters.x + e * s, l = this._rectangleSouthwestInMeters.x + (e + 1) * s, d = (this._rectangleNortheastInMeters.y - this._rectangleSouthwestInMeters.y) / o, f = this._rectangleNortheastInMeters.y - t * d, h = this._rectangleNortheastInMeters.y - (t + 1) * d; + return defined(i) ? (i.west = c, i.south = h, i.east = l, i.north = f, i) : new Rectangle(c, h, l, f); +}; +WebMercatorTilingScheme.prototype.tileXYToRectangle = function(e, t, n, i) { + const r = this.tileXYToNativeRectangle(e, t, n, i), o = this._projection, s = o.unproject( + new Cartesian2(r.west, r.south) + ), c = o.unproject( + new Cartesian2(r.east, r.north) + ); + return r.west = s.longitude, r.south = s.latitude, r.east = c.longitude, r.north = c.latitude, r; +}; +WebMercatorTilingScheme.prototype.positionToTileXY = function(e, t, n) { + const i = this._rectangle; + if (!Rectangle.contains(i, e)) + return; + const r = this.getNumberOfXTilesAtLevel(t), o = this.getNumberOfYTilesAtLevel(t), c = (this._rectangleNortheastInMeters.x - this._rectangleSouthwestInMeters.x) / r, d = (this._rectangleNortheastInMeters.y - this._rectangleSouthwestInMeters.y) / o, h = this._projection.project(e), p = h.x - this._rectangleSouthwestInMeters.x, m = this._rectangleNortheastInMeters.y - h.y; + let _ = p / c | 0; + _ >= r && (_ = r - 1); + let y = m / d | 0; + return y >= o && (y = o - 1), defined(n) ? (n.x = _, n.y = y, n) : new Cartesian2(_, y); +}; +let defaultTokenCredit; +const defaultAccessToken = "AAPTxy8BH1VEsoebNVZXo8HurEOF051kAEKlhkOhBEc9BmSXu8_pRnGhnW6yZLct-ukUzbJaZRAVfnmUrxDcAu_FaFDIC3M57EwfRm_DuTw9D5oHdLBTYIMD3tpUeFsNDjHHqar5fb1FGIN9KIV1Gk64dNBmhHhuOHY8cq2IhI0XFLj2qnAlqtKnM-lLsO6JpHuHPVD799V1o9VFm9vMW6a66vEi8-e--2QzKQecPYiaq98.AT1_p4pHwb3n", ArcGisMapService = {}; +ArcGisMapService.defaultAccessToken = defaultAccessToken; +ArcGisMapService.defaultWorldImageryServer = new Resource({ + url: "https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer" +}); +ArcGisMapService.defaultWorldHillshadeServer = new Resource({ + url: "https://ibasemaps-api.arcgis.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer" +}); +ArcGisMapService.defaultWorldOceanServer = new Resource({ + url: "https://ibasemaps-api.arcgis.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer" +}); +ArcGisMapService.getDefaultTokenCredit = function(e) { + if (e === defaultAccessToken) { + if (!defined(defaultTokenCredit)) { + const t = ' This application is using a default ArcGIS access token. Please assign Cesium.ArcGisMapService.defaultAccessToken with an API key from your ArcGIS Developer account before using the ArcGIS tile services. You can sign up for a free ArcGIS Developer account at https://developers.arcgis.com/.'; + defaultTokenCredit = new Credit(t, !0); + } + return defaultTokenCredit; + } +}; +function DiscardMissingTileImagePolicy(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._pixelsToCheck = e.pixelsToCheck, this._missingImagePixels = void 0, this._missingImageByteLength = void 0, this._isReady = !1; + const t = Resource.createIfNeeded(e.missingImageUrl), n = this; + function i(o) { + defined(o.blob) && (n._missingImageByteLength = o.blob.size); + let s = getImagePixels(o); + if (e.disableCheckIfAllPixelsAreTransparent) { + let c = !0; + const l = o.width, d = e.pixelsToCheck; + for (let f = 0, h = d.length; c && f < h; ++f) { + const p = d[f], m = p.x * 4 + p.y * l; + s[m + 3] > 0 && (c = !1); + } + c && (s = void 0); + } + n._missingImagePixels = s, n._isReady = !0; + } + function r() { + n._missingImagePixels = void 0, n._isReady = !0; + } + t.fetchImage({ + preferBlob: !0, + preferImageBitmap: !0, + flipY: !0 + }).then(i).catch(r); +} +DiscardMissingTileImagePolicy.prototype.isReady = function() { + return this._isReady; +}; +DiscardMissingTileImagePolicy.prototype.shouldDiscardImage = function(e) { + const t = this._pixelsToCheck, n = this._missingImagePixels; + if (!defined(n) || defined(e.blob) && e.blob.size !== this._missingImageByteLength) + return !1; + const i = getImagePixels(e), r = e.width; + for (let o = 0, s = t.length; o < s; ++o) { + const c = t[o], l = c.x * 4 + c.y * r; + for (let d = 0; d < 4; ++d) { + const f = l + d; + if (i[f] !== n[f]) + return !1; + } + } + return !0; +}; +function ImageryLayerFeatureInfo() { + this.name = void 0, this.description = void 0, this.position = void 0, this.data = void 0, this.imageryLayer = void 0; +} +ImageryLayerFeatureInfo.prototype.configureNameFromProperties = function(e) { + let t = 10, n; + for (const i in e) + if (e.hasOwnProperty(i) && e[i]) { + const r = i.toLowerCase(); + t > 1 && r === "name" ? (t = 1, n = i) : t > 2 && r === "title" ? (t = 2, n = i) : t > 3 && /name/i.test(i) ? (t = 3, n = i) : t > 4 && /title/i.test(i) && (t = 4, n = i); + } + defined(n) && (this.name = e[n]); +}; +ImageryLayerFeatureInfo.prototype.configureDescriptionFromProperties = function(e) { + function t(n) { + let i = ''; + for (const r in n) + if (n.hasOwnProperty(r)) { + const o = n[r]; + defined(o) && (typeof o == "object" ? i += `` : i += ``); + } + return i += "
${r}${t(o)}
${r}${o}
", i; + } + this.description = t(e); +}; +function ImageryProvider() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(ImageryProvider.prototype, { + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + * @memberof ImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the width of each tile, in pixels. + * @memberof ImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the height of each tile, in pixels. + * @memberof ImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof ImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + * @memberof ImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof ImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof ImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof ImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof ImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the proxy used by this provider. + * @memberof ImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof ImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: DeveloperError.throwInstantiationError + } +}); +ImageryProvider.prototype.getTileCredits = function(e, t, n) { + DeveloperError.throwInstantiationError(); +}; +ImageryProvider.prototype.requestImage = function(e, t, n, i) { + DeveloperError.throwInstantiationError(); +}; +ImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + DeveloperError.throwInstantiationError(); +}; +const ktx2Regex = /\.ktx2$/i; +ImageryProvider.loadImage = function(e, t) { + const n = Resource.createIfNeeded(t); + return ktx2Regex.test(n.url) ? loadKTX2(n) : defined(e) && defined(e.tileDiscardPolicy) ? n.fetchImage({ + preferBlob: !0, + preferImageBitmap: !0, + flipY: !0 + }) : n.fetchImage({ + preferImageBitmap: !0, + flipY: !0 + }); +}; +const ArcGisBaseMapType = { + SATELLITE: 1, + OCEANS: 2, + HILLSHADE: 3 +}, ArcGisBaseMapType$1 = Object.freeze(ArcGisBaseMapType); +function ImageryProviderBuilder$2(e) { + this.useTiles = defaultValue(e.usePreCachedTilesIfAvailable, !0); + const t = e.ellipsoid; + this.tilingScheme = defaultValue( + e.tilingScheme, + new GeographicTilingScheme({ ellipsoid: t }) + ), this.rectangle = defaultValue(e.rectangle, this.tilingScheme.rectangle), this.ellipsoid = t; + let n = e.credit; + typeof n == "string" && (n = new Credit(n)), this.credit = n, this.tileCredits = void 0, this.tileDiscardPolicy = e.tileDiscardPolicy, this.tileWidth = defaultValue(e.tileWidth, 256), this.tileHeight = defaultValue(e.tileHeight, 256), this.maximumLevel = e.maximumLevel; +} +ImageryProviderBuilder$2.prototype.build = function(e) { + e._useTiles = this.useTiles, e._tilingScheme = this.tilingScheme, e._rectangle = this.rectangle, e._credit = this.credit, e._tileCredits = this.tileCredits, e._tileDiscardPolicy = this.tileDiscardPolicy, e._tileWidth = this.tileWidth, e._tileHeight = this.tileHeight, e._maximumLevel = this.maximumLevel, this.useTiles && !defined(this.tileDiscardPolicy) && (e._tileDiscardPolicy = new DiscardMissingTileImagePolicy({ + missingImageUrl: buildImageResource$3(e, 0, 0, this.maximumLevel).url, + pixelsToCheck: [ + new Cartesian2(0, 0), + new Cartesian2(200, 20), + new Cartesian2(20, 200), + new Cartesian2(80, 110), + new Cartesian2(160, 130) + ], + disableCheckIfAllPixelsAreTransparent: !0 + })); +}; +function metadataSuccess$4(e, t) { + const n = e.tileInfo; + if (!defined(n)) + t.useTiles = !1; + else { + if (t.tileWidth = n.rows, t.tileHeight = n.cols, n.spatialReference.wkid === 102100 || n.spatialReference.wkid === 102113) + t.tilingScheme = new WebMercatorTilingScheme({ + ellipsoid: t.ellipsoid + }); + else if (e.tileInfo.spatialReference.wkid === 4326) + t.tilingScheme = new GeographicTilingScheme({ + ellipsoid: t.ellipsoid + }); + else { + const i = `Tile spatial reference WKID ${e.tileInfo.spatialReference.wkid} is not supported.`; + throw new RuntimeError(i); + } + if (t.maximumLevel = e.tileInfo.lods.length - 1, defined(e.fullExtent)) { + if (defined(e.fullExtent.spatialReference) && defined(e.fullExtent.spatialReference.wkid)) + if (e.fullExtent.spatialReference.wkid === 102100 || e.fullExtent.spatialReference.wkid === 102113) { + const i = new WebMercatorProjection(), r = e.fullExtent, o = i.unproject( + new Cartesian3( + Math.max( + r.xmin, + -t.tilingScheme.ellipsoid.maximumRadius * Math.PI + ), + Math.max( + r.ymin, + -t.tilingScheme.ellipsoid.maximumRadius * Math.PI + ), + 0 + ) + ), s = i.unproject( + new Cartesian3( + Math.min( + r.xmax, + t.tilingScheme.ellipsoid.maximumRadius * Math.PI + ), + Math.min( + r.ymax, + t.tilingScheme.ellipsoid.maximumRadius * Math.PI + ), + 0 + ) + ); + t.rectangle = new Rectangle( + o.longitude, + o.latitude, + s.longitude, + s.latitude + ); + } else if (e.fullExtent.spatialReference.wkid === 4326) + t.rectangle = Rectangle.fromDegrees( + e.fullExtent.xmin, + e.fullExtent.ymin, + e.fullExtent.xmax, + e.fullExtent.ymax + ); + else { + const i = `fullExtent.spatialReference WKID ${e.fullExtent.spatialReference.wkid} is not supported.`; + throw new RuntimeError(i); + } + } else + t.rectangle = t.tilingScheme.rectangle; + t.useTiles = !0; + } + defined(e.copyrightText) && e.copyrightText.length > 0 && (defined(t.credit) ? t.tileCredits = [new Credit(e.copyrightText)] : t.credit = new Credit(e.copyrightText)); +} +function metadataFailure$3(e, t) { + let n = `An error occurred while accessing ${e.url}`; + throw defined(t) && defined(t.message) && (n += `: ${t.message}`), new RuntimeError(n); +} +async function requestMetadata$4(e, t) { + const n = e.getDerivedResource({ + queryParameters: { + f: "json" + } + }); + try { + const i = await n.fetchJson(); + metadataSuccess$4(i, t); + } catch (i) { + metadataFailure$3(e, i); + } +} +function ArcGisMapServerImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._tileDiscardPolicy = e.tileDiscardPolicy, this._tileWidth = defaultValue(e.tileWidth, 256), this._tileHeight = defaultValue(e.tileHeight, 256), this._maximumLevel = e.maximumLevel, this._tilingScheme = defaultValue( + e.tilingScheme, + new GeographicTilingScheme({ ellipsoid: e.ellipsoid }) + ), this._useTiles = defaultValue(e.usePreCachedTilesIfAvailable, !0), this._rectangle = defaultValue( + e.rectangle, + this._tilingScheme.rectangle + ), this._layers = e.layers, this._credit = e.credit, this._tileCredits = void 0; + let t = e.credit; + typeof t == "string" && (t = new Credit(t)), this.enablePickFeatures = defaultValue(e.enablePickFeatures, !0), this._errorEvent = new Event(); +} +ArcGisMapServerImageryProvider.fromBasemapType = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + let n, i, r; + switch (e) { + case ArcGisBaseMapType$1.SATELLITE: + { + n = defaultValue( + t.token, + ArcGisMapService.defaultAccessToken + ), i = Resource.createIfNeeded( + ArcGisMapService.defaultWorldImageryServer + ), i.appendForwardSlash(); + const o = ArcGisMapService.getDefaultTokenCredit( + n + ); + defined(o) && (r = Credit.clone(o)); + } + break; + case ArcGisBaseMapType$1.OCEANS: + { + n = defaultValue( + t.token, + ArcGisMapService.defaultAccessToken + ), i = Resource.createIfNeeded( + ArcGisMapService.defaultWorldOceanServer + ), i.appendForwardSlash(); + const o = ArcGisMapService.getDefaultTokenCredit( + n + ); + defined(o) && (r = Credit.clone(o)); + } + break; + case ArcGisBaseMapType$1.HILLSHADE: + { + n = defaultValue( + t.token, + ArcGisMapService.defaultAccessToken + ), i = Resource.createIfNeeded( + ArcGisMapService.defaultWorldHillshadeServer + ), i.appendForwardSlash(); + const o = ArcGisMapService.getDefaultTokenCredit( + n + ); + defined(o) && (r = Credit.clone(o)); + } + break; + } + return ArcGisMapServerImageryProvider.fromUrl(i, { + ...t, + token: n, + credit: r, + usePreCachedTilesIfAvailable: !0 + // ArcGIS Base Map Service Layers only support Tiled views + }); +}; +function buildImageResource$3(e, t, n, i, r) { + let o; + if (e._useTiles) + o = e._resource.getDerivedResource({ + url: `tile/${i}/${n}/${t}`, + request: r + }); + else { + const s = e._tilingScheme.tileXYToNativeRectangle( + t, + n, + i + ), l = { + bbox: `${s.west},${s.south},${s.east},${s.north}`, + size: `${e._tileWidth},${e._tileHeight}`, + format: "png32", + transparent: !0, + f: "image" + }; + e._tilingScheme.projection instanceof GeographicProjection ? (l.bboxSR = 4326, l.imageSR = 4326) : (l.bboxSR = 3857, l.imageSR = 3857), e.layers && (l.layers = `show:${e.layers}`), o = e._resource.getDerivedResource({ + url: "export", + request: r, + queryParameters: l + }); + } + return o; +} +Object.defineProperties(ArcGisMapServerImageryProvider.prototype, { + /** + * Gets the URL of the ArcGIS MapServer. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource._url; + } + }, + /** + * Gets the ArcGIS token used to authenticate with the ArcGis MapServer service. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {string} + * @readonly + */ + token: { + get: function() { + return this._resource.queryParameters.token; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether this imagery provider is using pre-cached tiles from the + * ArcGIS MapServer. + * @memberof ArcGisMapServerImageryProvider.prototype + * + * @type {boolean} + * @readonly + * @default true + */ + usingPrecachedTiles: { + get: function() { + return this._useTiles; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof ArcGisMapServerImageryProvider.prototype + * + * @type {boolean} + * @readonly + * @default true + */ + hasAlphaChannel: { + get: function() { + return !0; + } + }, + /** + * Gets the comma-separated list of layer IDs to show. + * @memberof ArcGisMapServerImageryProvider.prototype + * + * @type {string} + */ + layers: { + get: function() { + return this._layers; + } + } +}); +ArcGisMapServerImageryProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = Resource.createIfNeeded(e); + n.appendForwardSlash(), defined(t.token) && n.setQueryParameters({ + token: t.token + }); + const i = new ArcGisMapServerImageryProvider(t); + i._resource = n; + const r = new ImageryProviderBuilder$2(t); + return defaultValue(t.usePreCachedTilesIfAvailable, !0) && await requestMetadata$4(n, r), r.build(i), i; +}; +ArcGisMapServerImageryProvider.prototype.getTileCredits = function(e, t, n) { + return this._tileCredits; +}; +ArcGisMapServerImageryProvider.prototype.requestImage = function(e, t, n, i) { + return ImageryProvider.loadImage( + this, + buildImageResource$3(this, e, t, n, i) + ); +}; +ArcGisMapServerImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + if (!this.enablePickFeatures) + return; + const o = this._tilingScheme.tileXYToNativeRectangle(e, t, n); + let s, c, l; + if (this._tilingScheme.projection instanceof GeographicProjection) + s = CesiumMath.toDegrees(i), c = CesiumMath.toDegrees(r), l = "4326"; + else { + const p = this._tilingScheme.projection.project( + new Cartographic(i, r, 0) + ); + s = p.x, c = p.y, l = "3857"; + } + let d = "visible"; + defined(this._layers) && (d += `:${this._layers}`); + const f = { + f: "json", + tolerance: 2, + geometryType: "esriGeometryPoint", + geometry: `${s},${c}`, + mapExtent: `${o.west},${o.south},${o.east},${o.north}`, + imageDisplay: `${this._tileWidth},${this._tileHeight},96`, + sr: l, + layers: d + }; + return this._resource.getDerivedResource({ + url: "identify", + queryParameters: f + }).fetchJson().then(function(p) { + const m = [], _ = p.results; + if (!defined(_)) + return m; + for (let y = 0; y < _.length; ++y) { + const C = _[y], T = new ImageryLayerFeatureInfo(); + if (T.data = C, T.name = C.value, T.properties = C.attributes, T.configureDescriptionFromProperties(C.attributes), C.geometryType === "esriGeometryPoint" && C.geometry) { + const x = C.geometry.spatialReference && C.geometry.spatialReference.wkid ? C.geometry.spatialReference.wkid : 4326; + if (x === 4326 || x === 4283) + T.position = Cartographic.fromDegrees( + C.geometry.x, + C.geometry.y, + C.geometry.z + ); + else if (x === 102100 || x === 900913 || x === 3857) { + const b = new WebMercatorProjection(); + T.position = b.unproject( + new Cartesian3( + C.geometry.x, + C.geometry.y, + C.geometry.z + ) + ); + } + } + m.push(T); + } + return m; + }); +}; +ArcGisMapServerImageryProvider._metadataCache = {}; +const BingMapsStyle = { + /** + * Aerial imagery. + * + * @type {string} + * @constant + */ + AERIAL: "Aerial", + /** + * Aerial imagery with a road overlay. + * + * @type {string} + * @constant + * @deprecated See https://github.com/CesiumGS/cesium/issues/7128. + * Use `BingMapsStyle.AERIAL_WITH_LABELS_ON_DEMAND` instead + */ + AERIAL_WITH_LABELS: "AerialWithLabels", + /** + * Aerial imagery with a road overlay. + * + * @type {string} + * @constant + */ + AERIAL_WITH_LABELS_ON_DEMAND: "AerialWithLabelsOnDemand", + /** + * Roads without additional imagery. + * + * @type {string} + * @constant + * @deprecated See https://github.com/CesiumGS/cesium/issues/7128. + * Use `BingMapsStyle.ROAD_ON_DEMAND` instead + */ + ROAD: "Road", + /** + * Roads without additional imagery. + * + * @type {string} + * @constant + */ + ROAD_ON_DEMAND: "RoadOnDemand", + /** + * A dark version of the road maps. + * + * @type {string} + * @constant + */ + CANVAS_DARK: "CanvasDark", + /** + * A lighter version of the road maps. + * + * @type {string} + * @constant + */ + CANVAS_LIGHT: "CanvasLight", + /** + * A grayscale version of the road maps. + * + * @type {string} + * @constant + */ + CANVAS_GRAY: "CanvasGray", + /** + * Ordnance Survey imagery. This imagery is visible only for the London, UK area. + * + * @type {string} + * @constant + */ + ORDNANCE_SURVEY: "OrdnanceSurvey", + /** + * Collins Bart imagery. + * + * @type {string} + * @constant + */ + COLLINS_BART: "CollinsBart" +}, BingMapsStyle$1 = Object.freeze(BingMapsStyle); +function DiscardEmptyTileImagePolicy(e) { +} +DiscardEmptyTileImagePolicy.prototype.isReady = function() { + return !0; +}; +DiscardEmptyTileImagePolicy.prototype.shouldDiscardImage = function(e) { + return DiscardEmptyTileImagePolicy.EMPTY_IMAGE === e; +}; +let emptyImage; +Object.defineProperties(DiscardEmptyTileImagePolicy, { + /** + * Default value for representing an empty image. + * @type {HTMLImageElement} + * @readonly + * @memberof DiscardEmptyTileImagePolicy + */ + EMPTY_IMAGE: { + get: function() { + return defined(emptyImage) || (emptyImage = new Image(), emptyImage.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="), emptyImage; + } + } +}); +function ImageryProviderBuilder$1(e) { + this.tileWidth = void 0, this.tileHeight = void 0, this.maximumLevel = void 0, this.imageUrlSubdomains = void 0, this.imageUrlTemplate = void 0, this.attributionList = void 0; +} +ImageryProviderBuilder$1.prototype.build = function(e) { + e._tileWidth = this.tileWidth, e._tileHeight = this.tileHeight, e._maximumLevel = this.maximumLevel, e._imageUrlSubdomains = this.imageUrlSubdomains, e._imageUrlTemplate = this.imageUrlTemplate; + let t = e._attributionList = this.attributionList; + t || (t = []), e._attributionList = t; + for (let n = 0, i = t.length; n < i; ++n) { + const r = t[n]; + if (r.credit instanceof Credit) + break; + r.credit = new Credit(r.attribution); + const o = r.coverageAreas; + for (let s = 0, c = r.coverageAreas.length; s < c; ++s) { + const l = o[s], d = l.bbox; + l.bbox = new Rectangle( + CesiumMath.toRadians(d[1]), + CesiumMath.toRadians(d[0]), + CesiumMath.toRadians(d[3]), + CesiumMath.toRadians(d[2]) + ); + } + } +}; +function metadataSuccess$3(e, t) { + if (e.resourceSets.length !== 1) + throw new RuntimeError( + "metadata does not specify one resource in resourceSets" + ); + const n = e.resourceSets[0].resources[0]; + t.tileWidth = n.imageWidth, t.tileHeight = n.imageHeight, t.maximumLevel = n.zoomMax - 1, t.imageUrlSubdomains = n.imageUrlSubdomains, t.imageUrlTemplate = n.imageUrl; + let i = n.imageryProviders; + defined(n.imageryProviders) && (i = n.imageryProviders.filter( + (r) => { + var o; + return (o = r.coverageAreas) == null ? void 0 : o.some((s) => defined(s.bbox)); + } + )), t.attributionList = i; +} +function metadataFailure$2(e, t, n) { + let i = `An error occurred while accessing ${e.url}`; + throw defined(t) && defined(t.message) && (i += `: ${t.message}`), TileProviderError.reportError( + void 0, + n, + defined(n) ? n._errorEvent : void 0, + i, + void 0, + void 0, + void 0, + t + ), new RuntimeError(i); +} +async function requestMetadata$3(e, t, n) { + const i = e.url; + let r = BingMapsImageryProvider._metadataCache[i]; + defined(r) || (r = e.fetchJsonp("jsonp"), BingMapsImageryProvider._metadataCache[i] = r); + try { + const o = await r; + return metadataSuccess$3(o, t); + } catch (o) { + metadataFailure$2(e, o, n); + } +} +function BingMapsImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = 1, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._mapStyle = defaultValue(e.mapStyle, BingMapsStyle$1.AERIAL), this._mapLayer = e.mapLayer, this._culture = defaultValue(e.culture, ""), this._key = e.key, this._tileDiscardPolicy = e.tileDiscardPolicy, defined(this._tileDiscardPolicy) || (this._tileDiscardPolicy = new DiscardEmptyTileImagePolicy()), this._proxy = e.proxy, this._credit = new Credit( + `` + ), this._tilingScheme = new WebMercatorTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 2, + ellipsoid: e.ellipsoid + }), this._tileWidth = void 0, this._tileHeight = void 0, this._maximumLevel = void 0, this._imageUrlTemplate = void 0, this._imageUrlSubdomains = void 0, this._attributionList = void 0, this._errorEvent = new Event(); +} +Object.defineProperties(BingMapsImageryProvider.prototype, { + /** + * Gets the name of the BingMaps server url hosting the imagery. + * @memberof BingMapsImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof BingMapsImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the Bing Maps key. + * @memberof BingMapsImageryProvider.prototype + * @type {string} + * @readonly + */ + key: { + get: function() { + return this._key; + } + }, + /** + * Gets the type of Bing Maps imagery to load. + * @memberof BingMapsImageryProvider.prototype + * @type {BingMapsStyle} + * @readonly + */ + mapStyle: { + get: function() { + return this._mapStyle; + } + }, + /** + * Gets the additional map layer options as defined in {@link https://learn.microsoft.com/en-us/bingmaps/rest-services/imagery/get-imagery-metadata#template-parameters}/ + * @memberof BingMapsImageryProvider.prototype + * @type {string} + * @readonly + */ + mapLayer: { + get: function() { + return this._mapLayer; + } + }, + /** + * The culture to use when requesting Bing Maps imagery. Not + * all cultures are supported. See {@link http://msdn.microsoft.com/en-us/library/hh441729.aspx} + * for information on the supported cultures. + * @memberof BingMapsImageryProvider.prototype + * @type {string} + * @readonly + */ + culture: { + get: function() { + return this._culture; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof BingMapsImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof BingMapsImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof BingMapsImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof BingMapsImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof BingMapsImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof BingMapsImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof BingMapsImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof BingMapsImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof BingMapsImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + * @memberof BingMapsImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return defined(this.mapLayer); + } + } +}); +BingMapsImageryProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + let n = t.tileProtocol; + defined(n) ? n.length > 0 && n[n.length - 1] === ":" && (n = n.substr(0, n.length - 1)) : n = document.location.protocol === "http:" ? "http" : "https"; + const i = defaultValue(t.mapStyle, BingMapsStyle$1.AERIAL), r = Resource.createIfNeeded(e); + r.appendForwardSlash(); + const o = { + incl: "ImageryProviders", + key: t.key, + uriScheme: n + }; + defined(t.mapLayer) && (o.mapLayer = t.mapLayer), defined(t.culture) && (o.culture = t.culture); + const s = r.getDerivedResource({ + url: `REST/v1/Imagery/Metadata/${i}`, + queryParameters: o + }), c = new BingMapsImageryProvider(t); + c._resource = r; + const l = new ImageryProviderBuilder$1(); + return await requestMetadata$3(s, l), l.build(c), c; +}; +const rectangleScratch$4 = new Rectangle(); +BingMapsImageryProvider.prototype.getTileCredits = function(e, t, n) { + const i = this._tilingScheme.tileXYToRectangle( + e, + t, + n, + rectangleScratch$4 + ); + return getRectangleAttribution( + this._attributionList, + n, + i + ); +}; +BingMapsImageryProvider.prototype.requestImage = function(e, t, n, i) { + const r = ImageryProvider.loadImage( + this, + buildImageResource$2(this, e, t, n, i) + ); + if (defined(r)) + return r.catch(function(o) { + return defined(o.blob) && o.blob.size === 0 ? DiscardEmptyTileImagePolicy.EMPTY_IMAGE : Promise.reject(o); + }); +}; +BingMapsImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +BingMapsImageryProvider.tileXYToQuadKey = function(e, t, n) { + let i = ""; + for (let r = n; r >= 0; --r) { + const o = 1 << r; + let s = 0; + e & o && (s |= 1), t & o && (s |= 2), i += s; + } + return i; +}; +BingMapsImageryProvider.quadKeyToTileXY = function(e) { + let t = 0, n = 0; + const i = e.length - 1; + for (let r = i; r >= 0; --r) { + const o = 1 << r, s = +e[i - r]; + s & 1 && (t |= o), s & 2 && (n |= o); + } + return { + x: t, + y: n, + level: i + }; +}; +BingMapsImageryProvider._logoUrl = void 0; +Object.defineProperties(BingMapsImageryProvider, { + /** + * Gets or sets the URL to the Bing logo for display in the credit. + * @memberof BingMapsImageryProvider + * @type {string} + */ + logoUrl: { + get: function() { + return defined(BingMapsImageryProvider._logoUrl) || (BingMapsImageryProvider._logoUrl = buildModuleUrl( + "Assets/Images/bing_maps_credit.png" + )), BingMapsImageryProvider._logoUrl; + }, + set: function(e) { + BingMapsImageryProvider._logoUrl = e; + } + } +}); +function buildImageResource$2(e, t, n, i, r) { + const o = e._imageUrlTemplate, s = e._imageUrlSubdomains, c = (t + n + i) % s.length; + return e._resource.getDerivedResource({ + url: o, + request: r, + templateValues: { + quadkey: BingMapsImageryProvider.tileXYToQuadKey(t, n, i), + subdomain: s[c], + culture: e._culture + }, + queryParameters: { + // this parameter tells the Bing servers to send a zero-length response + // instead of a placeholder image for missing tiles. + n: "z" + } + }); +} +const intersectionScratch = new Rectangle(); +function getRectangleAttribution(e, t, n) { + ++t; + const i = []; + for (let r = 0, o = e.length; r < o; ++r) { + const s = e[r], c = s.coverageAreas; + let l = !1; + for (let d = 0, f = s.coverageAreas.length; !l && d < f; ++d) { + const h = c[d]; + if (t >= h.zoomMin && t <= h.zoomMax) { + const p = Rectangle.intersection( + n, + h.bbox, + intersectionScratch + ); + defined(p) && (l = !0); + } + } + l && i.push(s.credit); + } + return i; +} +BingMapsImageryProvider._metadataCache = {}; +const templateRegex = /{[^}]+}/g, tags = { + x: xTag, + y: yTag, + z: zTag, + s: sTag, + reverseX: reverseXTag, + reverseY: reverseYTag, + reverseZ: reverseZTag, + westDegrees: westDegreesTag, + southDegrees: southDegreesTag, + eastDegrees: eastDegreesTag, + northDegrees: northDegreesTag, + westProjected: westProjectedTag, + southProjected: southProjectedTag, + eastProjected: eastProjectedTag, + northProjected: northProjectedTag, + width: widthTag, + height: heightTag +}, pickFeaturesTags = combine$2(tags, { + i: iTag, + j: jTag, + reverseI: reverseITag, + reverseJ: reverseJTag, + longitudeDegrees: longitudeDegreesTag, + latitudeDegrees: latitudeDegreesTag, + longitudeProjected: longitudeProjectedTag, + latitudeProjected: latitudeProjectedTag, + format: formatTag +}); +function UrlTemplateImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._errorEvent = new Event(); + const t = Resource.createIfNeeded(e.url), n = Resource.createIfNeeded(e.pickFeaturesUrl); + this._resource = t, this._urlSchemeZeroPadding = e.urlSchemeZeroPadding, this._getFeatureInfoFormats = e.getFeatureInfoFormats, this._pickFeaturesResource = n; + let i = e.subdomains; + Array.isArray(i) ? i = i.slice() : defined(i) && i.length > 0 ? i = i.split("") : i = ["a", "b", "c"], this._subdomains = i, this._tileWidth = defaultValue(e.tileWidth, 256), this._tileHeight = defaultValue(e.tileHeight, 256), this._minimumLevel = defaultValue(e.minimumLevel, 0), this._maximumLevel = e.maximumLevel, this._tilingScheme = defaultValue( + e.tilingScheme, + new WebMercatorTilingScheme({ ellipsoid: e.ellipsoid }) + ), this._rectangle = defaultValue( + e.rectangle, + this._tilingScheme.rectangle + ), this._rectangle = Rectangle.intersection( + this._rectangle, + this._tilingScheme.rectangle + ), this._tileDiscardPolicy = e.tileDiscardPolicy; + let r = e.credit; + typeof r == "string" && (r = new Credit(r)), this._credit = r, this._hasAlphaChannel = defaultValue(e.hasAlphaChannel, !0); + const o = e.customTags, s = combine$2(tags, o), c = combine$2(pickFeaturesTags, o); + this._tags = s, this._pickFeaturesTags = c, this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this.enablePickFeatures = defaultValue(e.enablePickFeatures, !0); +} +Object.defineProperties(UrlTemplateImageryProvider.prototype, { + /** + * Gets the URL template to use to request tiles. It has the following keywords: + *
    + *
  • {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.
  • + *
  • {x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.
  • + *
  • {y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.
  • + *
  • {s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.
  • + *
  • {reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.
  • + *
  • {reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.
  • + *
  • {reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.
  • + *
  • {westDegrees}: The Western edge of the tile in geodetic degrees.
  • + *
  • {southDegrees}: The Southern edge of the tile in geodetic degrees.
  • + *
  • {eastDegrees}: The Eastern edge of the tile in geodetic degrees.
  • + *
  • {northDegrees}: The Northern edge of the tile in geodetic degrees.
  • + *
  • {westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {width}: The width of each tile in pixels.
  • + *
  • {height}: The height of each tile in pixels.
  • + *
+ * @memberof UrlTemplateImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource.url; + } + }, + /** + * Gets the URL scheme zero padding for each tile coordinate. The format is '000' where each coordinate will be padded on + * the left with zeros to match the width of the passed string of zeros. e.g. Setting: + * urlSchemeZeroPadding : { '{x}' : '0000'} + * will cause an 'x' value of 12 to return the string '0012' for {x} in the generated URL. + * It has the following keywords: + *
    + *
  • {z}: The zero padding for the level of the tile in the tiling scheme.
  • + *
  • {x}: The zero padding for the tile X coordinate in the tiling scheme.
  • + *
  • {y}: The zero padding for the the tile Y coordinate in the tiling scheme.
  • + *
  • {reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.
  • + *
  • {reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.
  • + *
  • {reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.
  • + *
+ * @memberof UrlTemplateImageryProvider.prototype + * @type {object} + * @readonly + */ + urlSchemeZeroPadding: { + get: function() { + return this._urlSchemeZeroPadding; + } + }, + /** + * Gets the URL template to use to use to pick features. If this property is not specified, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined, indicating no + * features picked. The URL template supports all of the keywords supported by the + * {@link UrlTemplateImageryProvider#url} property, plus the following: + *
    + *
  • {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.
  • + *
  • {j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.
  • + *
  • {reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.
  • + *
  • {reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.
  • + *
  • {longitudeDegrees}: The longitude of the picked position in degrees.
  • + *
  • {latitudeDegrees}: The latitude of the picked position in degrees.
  • + *
  • {longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
  • + *
+ * @memberof UrlTemplateImageryProvider.prototype + * @type {string} + * @readonly + */ + pickFeaturesUrl: { + get: function() { + return this._pickFeaturesResource.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof UrlTemplateImageryProvider.prototype + * @type {Proxy} + * @readonly + * @default undefined + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof UrlTemplateImageryProvider.prototype + * @type {number} + * @readonly + * @default 256 + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof UrlTemplateImageryProvider.prototype + * @type {number} + * @readonly + * @default 256 + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested, or undefined if there is no limit. + * @memberof UrlTemplateImageryProvider.prototype + * @type {number|undefined} + * @readonly + * @default undefined + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof UrlTemplateImageryProvider.prototype + * @type {number} + * @readonly + * @default 0 + */ + minimumLevel: { + get: function() { + return this._minimumLevel; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof UrlTemplateImageryProvider.prototype + * @type {TilingScheme} + * @readonly + * @default new WebMercatorTilingScheme() + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof UrlTemplateImageryProvider.prototype + * @type {Rectangle} + * @readonly + * @default tilingScheme.rectangle + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof UrlTemplateImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + * @default undefined + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof UrlTemplateImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof UrlTemplateImageryProvider.prototype + * @type {Credit} + * @readonly + * @default undefined + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof UrlTemplateImageryProvider.prototype + * @type {boolean} + * @readonly + * @default true + */ + hasAlphaChannel: { + get: function() { + return this._hasAlphaChannel; + } + } +}); +UrlTemplateImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +UrlTemplateImageryProvider.prototype.requestImage = function(e, t, n, i) { + return ImageryProvider.loadImage( + this, + buildImageResource$1(this, e, t, n, i) + ); +}; +UrlTemplateImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + if (!this.enablePickFeatures || !defined(this._pickFeaturesResource) || this._getFeatureInfoFormats.length === 0) + return; + let o = 0; + const s = this; + function c(d, f) { + return d.callback(f); + } + function l() { + if (o >= s._getFeatureInfoFormats.length) + return Promise.resolve([]); + const d = s._getFeatureInfoFormats[o], f = buildPickFeaturesResource( + s, + e, + t, + n, + i, + r, + d.format + ); + return ++o, d.type === "json" ? f.fetchJson().then(d.callback).catch(l) : d.type === "xml" ? f.fetchXML().then(d.callback).catch(l) : d.type === "text" || d.type === "html" ? f.fetchText().then(d.callback).catch(l) : f.fetch({ + responseType: d.format + }).then(c.bind(void 0, d)).catch(l); + } + return l(); +}; +let degreesScratchComputed = !1; +const degreesScratch = new Rectangle(); +let projectedScratchComputed = !1; +const projectedScratch = new Rectangle(); +function buildImageResource$1(e, t, n, i, r) { + degreesScratchComputed = !1, projectedScratchComputed = !1; + const o = e._resource, s = o.getUrlComponent(!0), c = e._tags, l = {}, d = s.match(templateRegex); + return defined(d) && d.forEach(function(f) { + const h = f.substring(1, f.length - 1); + defined(c[h]) && (l[h] = c[h](e, t, n, i)); + }), o.getDerivedResource({ + request: r, + templateValues: l + }); +} +let ijScratchComputed = !1; +const ijScratch = new Cartesian2(); +let longitudeLatitudeProjectedScratchComputed = !1; +function buildPickFeaturesResource(e, t, n, i, r, o, s) { + degreesScratchComputed = !1, projectedScratchComputed = !1, ijScratchComputed = !1, longitudeLatitudeProjectedScratchComputed = !1; + const c = e._pickFeaturesResource, l = c.getUrlComponent(!0), d = e._pickFeaturesTags, f = {}, h = l.match(templateRegex); + return defined(h) && h.forEach(function(p) { + const m = p.substring(1, p.length - 1); + defined(d[m]) && (f[m] = d[m]( + e, + t, + n, + i, + r, + o, + s + )); + }), c.getDerivedResource({ + templateValues: f + }); +} +function padWithZerosIfNecessary(e, t, n) { + if (e && e.urlSchemeZeroPadding && e.urlSchemeZeroPadding.hasOwnProperty(t)) { + const i = e.urlSchemeZeroPadding[t]; + if (typeof i == "string") { + const r = i.length; + r > 1 && (n = n.length >= r ? n : new Array( + r - n.toString().length + 1 + ).join("0") + n); + } + } + return n; +} +function xTag(e, t, n, i) { + return padWithZerosIfNecessary(e, "{x}", t); +} +function reverseXTag(e, t, n, i) { + const r = e.tilingScheme.getNumberOfXTilesAtLevel(i) - t - 1; + return padWithZerosIfNecessary(e, "{reverseX}", r); +} +function yTag(e, t, n, i) { + return padWithZerosIfNecessary(e, "{y}", n); +} +function reverseYTag(e, t, n, i) { + const r = e.tilingScheme.getNumberOfYTilesAtLevel(i) - n - 1; + return padWithZerosIfNecessary(e, "{reverseY}", r); +} +function reverseZTag(e, t, n, i) { + const r = e.maximumLevel, o = defined(r) && i < r ? r - i - 1 : i; + return padWithZerosIfNecessary(e, "{reverseZ}", o); +} +function zTag(e, t, n, i) { + return padWithZerosIfNecessary(e, "{z}", i); +} +function sTag(e, t, n, i) { + const r = (t + n + i) % e._subdomains.length; + return e._subdomains[r]; +} +function computeDegrees(e, t, n, i) { + degreesScratchComputed || (e.tilingScheme.tileXYToRectangle(t, n, i, degreesScratch), degreesScratch.west = CesiumMath.toDegrees(degreesScratch.west), degreesScratch.south = CesiumMath.toDegrees(degreesScratch.south), degreesScratch.east = CesiumMath.toDegrees(degreesScratch.east), degreesScratch.north = CesiumMath.toDegrees(degreesScratch.north), degreesScratchComputed = !0); +} +function westDegreesTag(e, t, n, i) { + return computeDegrees(e, t, n, i), degreesScratch.west; +} +function southDegreesTag(e, t, n, i) { + return computeDegrees(e, t, n, i), degreesScratch.south; +} +function eastDegreesTag(e, t, n, i) { + return computeDegrees(e, t, n, i), degreesScratch.east; +} +function northDegreesTag(e, t, n, i) { + return computeDegrees(e, t, n, i), degreesScratch.north; +} +function computeProjected(e, t, n, i) { + projectedScratchComputed || (e.tilingScheme.tileXYToNativeRectangle( + t, + n, + i, + projectedScratch + ), projectedScratchComputed = !0); +} +function westProjectedTag(e, t, n, i) { + return computeProjected(e, t, n, i), projectedScratch.west; +} +function southProjectedTag(e, t, n, i) { + return computeProjected(e, t, n, i), projectedScratch.south; +} +function eastProjectedTag(e, t, n, i) { + return computeProjected(e, t, n, i), projectedScratch.east; +} +function northProjectedTag(e, t, n, i) { + return computeProjected(e, t, n, i), projectedScratch.north; +} +function widthTag(e, t, n, i) { + return e.tileWidth; +} +function heightTag(e, t, n, i) { + return e.tileHeight; +} +function iTag(e, t, n, i, r, o, s) { + return computeIJ(e, t, n, i, r, o), ijScratch.x; +} +function jTag(e, t, n, i, r, o, s) { + return computeIJ(e, t, n, i, r, o), ijScratch.y; +} +function reverseITag(e, t, n, i, r, o, s) { + return computeIJ(e, t, n, i, r, o), e.tileWidth - ijScratch.x - 1; +} +function reverseJTag(e, t, n, i, r, o, s) { + return computeIJ(e, t, n, i, r, o), e.tileHeight - ijScratch.y - 1; +} +const rectangleScratch$3 = new Rectangle(), longitudeLatitudeProjectedScratch = new Cartesian3(); +function computeIJ(e, t, n, i, r, o, s) { + if (ijScratchComputed) + return; + computeLongitudeLatitudeProjected( + e, + t, + n, + i, + r, + o + ); + const c = longitudeLatitudeProjectedScratch, l = e.tilingScheme.tileXYToNativeRectangle( + t, + n, + i, + rectangleScratch$3 + ); + ijScratch.x = e.tileWidth * (c.x - l.west) / l.width | 0, ijScratch.y = e.tileHeight * (l.north - c.y) / l.height | 0, ijScratchComputed = !0; +} +function longitudeDegreesTag(e, t, n, i, r, o, s) { + return CesiumMath.toDegrees(r); +} +function latitudeDegreesTag(e, t, n, i, r, o, s) { + return CesiumMath.toDegrees(o); +} +function longitudeProjectedTag(e, t, n, i, r, o, s) { + return computeLongitudeLatitudeProjected( + e, + t, + n, + i, + r, + o + ), longitudeLatitudeProjectedScratch.x; +} +function latitudeProjectedTag(e, t, n, i, r, o, s) { + return computeLongitudeLatitudeProjected( + e, + t, + n, + i, + r, + o + ), longitudeLatitudeProjectedScratch.y; +} +const cartographicScratch$2 = new Cartographic(); +function computeLongitudeLatitudeProjected(e, t, n, i, r, o, s) { + if (!longitudeLatitudeProjectedScratchComputed) { + if (e.tilingScheme.projection instanceof GeographicProjection) + longitudeLatitudeProjectedScratch.x = CesiumMath.toDegrees(r), longitudeLatitudeProjectedScratch.y = CesiumMath.toDegrees(o); + else { + const c = cartographicScratch$2; + c.longitude = r, c.latitude = o, e.tilingScheme.projection.project( + c, + longitudeLatitudeProjectedScratch + ); + } + longitudeLatitudeProjectedScratchComputed = !0; + } +} +function formatTag(e, t, n, i, r, o, s) { + return s; +} +function TileMapServiceImageryProvider(e) { + UrlTemplateImageryProvider.call(this, e); +} +TileMapServiceImageryProvider._requestMetadata = async function(e, t, n, i) { + try { + const r = await n.fetchXML(); + return TileMapServiceImageryProvider._metadataSuccess( + r, + e, + t, + n, + i + ); + } catch (r) { + if (r instanceof RequestErrorEvent) + return TileMapServiceImageryProvider._metadataFailure( + e, + t + ); + throw r; + } +}; +TileMapServiceImageryProvider.fromUrl = async function(e, t) { + const n = Resource.createIfNeeded(e); + n.appendForwardSlash(); + const i = n, r = n.getDerivedResource({ + url: "tilemapresource.xml" + }); + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const o = await TileMapServiceImageryProvider._requestMetadata( + t, + i, + r + ); + return new TileMapServiceImageryProvider(o); +}; +defined(Object.create) && (TileMapServiceImageryProvider.prototype = Object.create( + UrlTemplateImageryProvider.prototype +), TileMapServiceImageryProvider.prototype.constructor = TileMapServiceImageryProvider); +function confineRectangleToTilingScheme(e, t) { + return e.west < t.rectangle.west && (e.west = t.rectangle.west), e.east > t.rectangle.east && (e.east = t.rectangle.east), e.south < t.rectangle.south && (e.south = t.rectangle.south), e.north > t.rectangle.north && (e.north = t.rectangle.north), e; +} +function calculateSafeMinimumDetailLevel(e, t, n) { + const i = e.positionToTileXY( + Rectangle.southwest(t), + n + ), r = e.positionToTileXY( + Rectangle.northeast(t), + n + ); + return (Math.abs(r.x - i.x) + 1) * (Math.abs(r.y - i.y) + 1) > 4 ? 0 : n; +} +TileMapServiceImageryProvider._metadataSuccess = function(e, t, n, i, r) { + const o = /tileformat/i, s = /tileset/i, c = /tilesets/i, l = /boundingbox/i; + let d, f, h; + const p = [], m = e.childNodes[0].childNodes; + for (let P = 0; P < m.length; P++) + if (o.test(m.item(P).nodeName)) + d = m.item(P); + else if (c.test(m.item(P).nodeName)) { + h = m.item(P); + const I = m.item(P).childNodes; + for (let M = 0; M < I.length; M++) + s.test(I.item(M).nodeName) && p.push(I.item(M)); + } else l.test(m.item(P).nodeName) && (f = m.item(P)); + let _; + if (!defined(h) || !defined(f)) + throw _ = `Unable to find expected tilesets or bbox attributes in ${i.url}.`, defined(r) && TileProviderError.reportError( + void 0, + r, + r.errorEvent, + _ + ), new RuntimeError(_); + const y = defaultValue( + t.fileExtension, + d.getAttribute("extension") + ), C = defaultValue( + t.tileWidth, + parseInt(d.getAttribute("width"), 10) + ), T = defaultValue( + t.tileHeight, + parseInt(d.getAttribute("height"), 10) + ); + let x = defaultValue( + t.minimumLevel, + parseInt(p[0].getAttribute("order"), 10) + ); + const b = defaultValue( + t.maximumLevel, + parseInt(p[p.length - 1].getAttribute("order"), 10) + ), S = h.getAttribute("profile"); + let E = t.tilingScheme; + if (!defined(E)) + if (S === "geodetic" || S === "global-geodetic") + E = new GeographicTilingScheme({ + ellipsoid: t.ellipsoid + }); + else if (S === "mercator" || S === "global-mercator") + E = new WebMercatorTilingScheme({ + ellipsoid: t.ellipsoid + }); + else + throw _ = `${i.url} specifies an unsupported profile attribute, ${S}.`, defined(r) && TileProviderError.reportError( + void 0, + r, + r.errorEvent, + _ + ), new RuntimeError(_); + let A = Rectangle.clone(t.rectangle); + if (!defined(A)) { + let P, I, M, R; + defaultValue(t.flipXY, !1) ? (M = new Cartesian2( + parseFloat(f.getAttribute("miny")), + parseFloat(f.getAttribute("minx")) + ), R = new Cartesian2( + parseFloat(f.getAttribute("maxy")), + parseFloat(f.getAttribute("maxx")) + )) : (M = new Cartesian2( + parseFloat(f.getAttribute("minx")), + parseFloat(f.getAttribute("miny")) + ), R = new Cartesian2( + parseFloat(f.getAttribute("maxx")), + parseFloat(f.getAttribute("maxy")) + )); + const g = S === "geodetic" || S === "mercator"; + if (E.projection instanceof GeographicProjection || g) + P = Cartographic.fromDegrees(M.x, M.y), I = Cartographic.fromDegrees(R.x, R.y); + else { + const w = E.projection; + P = w.unproject(M), I = w.unproject(R); + } + A = new Rectangle( + P.longitude, + P.latitude, + I.longitude, + I.latitude + ); + } + return A = confineRectangleToTilingScheme(A, E), x = calculateSafeMinimumDetailLevel( + E, + A, + x + ), { + url: n.getDerivedResource({ + url: `{z}/{x}/{reverseY}.${y}` + }), + tilingScheme: E, + rectangle: A, + tileWidth: C, + tileHeight: T, + minimumLevel: x, + maximumLevel: b, + tileDiscardPolicy: t.tileDiscardPolicy, + credit: t.credit + }; +}; +TileMapServiceImageryProvider._metadataFailure = function(e, t) { + const n = defaultValue(e.fileExtension, "png"), i = defaultValue(e.tileWidth, 256), r = defaultValue(e.tileHeight, 256), o = e.maximumLevel, s = defined(e.tilingScheme) ? e.tilingScheme : new WebMercatorTilingScheme({ ellipsoid: e.ellipsoid }); + let c = defaultValue(e.rectangle, s.rectangle); + c = confineRectangleToTilingScheme(c, s); + const l = calculateSafeMinimumDetailLevel( + s, + c, + e.minimumLevel + ); + return { + url: t.getDerivedResource({ + url: `{z}/{x}/{reverseY}.${n}` + }), + tilingScheme: s, + rectangle: c, + tileWidth: i, + tileHeight: r, + minimumLevel: l, + maximumLevel: o, + tileDiscardPolicy: e.tileDiscardPolicy, + credit: e.credit + }; +}; +function ImageryProviderBuilder(e) { + this.channel = e.channel, this.ellipsoid = e.ellipsoid, this.tilingScheme = void 0, this.version = void 0; +} +ImageryProviderBuilder.prototype.build = function(e) { + e._channel = this.channel, e._version = this.version, e._tilingScheme = this.tilingScheme; +}; +function metadataSuccess$2(e, t) { + let n; + try { + n = JSON.parse(e); + } catch { + n = JSON.parse( + e.replace(/([\[\{,])[\n\r ]*([A-Za-z0-9]+)[\n\r ]*:/g, '$1"$2":') + ); + } + let i; + for (let r = 0; r < n.layers.length; r++) + if (n.layers[r].id === t.channel) { + i = n.layers[r]; + break; + } + if (!defined(i)) { + const r = `Could not find layer with channel (id) of ${t.channel}.`; + throw new RuntimeError(r); + } + if (!defined(i.version)) { + const r = `Could not find a version in channel (id) ${t.channel}.`; + throw new RuntimeError(r); + } + if (t.version = i.version, defined(n.projection) && n.projection === "flat") + t.tilingScheme = new GeographicTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 2, + rectangle: new Rectangle(-Math.PI, -Math.PI, Math.PI, Math.PI), + ellipsoid: t.ellipsoid + }); + else if (!defined(n.projection) || n.projection === "mercator") + t.tilingScheme = new WebMercatorTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 2, + ellipsoid: t.ellipsoid + }); + else { + const r = `Unsupported projection ${n.projection}.`; + throw new RuntimeError(r); + } + return !0; +} +function metadataFailure$1(e, t, n) { + let i = `An error occurred while accessing ${t.url}.`; + throw defined(e) && defined(e.message) && (i += `: ${e.message}`), TileProviderError.reportError( + void 0, + n, + defined(n) ? n._errorEvent : void 0, + i + ), new RuntimeError(i); +} +async function requestMetadata$2(e, t, n) { + try { + const i = await e.fetchText(); + metadataSuccess$2(i, t); + } catch (i) { + metadataFailure$1(i, e, n); + } +} +function GoogleEarthEnterpriseMapsProvider(e) { + e = defaultValue(e, {}), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = 1.9, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._tileDiscardPolicy = e.tileDiscardPolicy, this._channel = e.channel, this._requestType = "ImageryMaps", this._credit = new Credit( + `` + ), this._tilingScheme = void 0, this._version = void 0, this._tileWidth = 256, this._tileHeight = 256, this._maximumLevel = e.maximumLevel, this._errorEvent = new Event(); +} +Object.defineProperties(GoogleEarthEnterpriseMapsProvider.prototype, { + /** + * Gets the URL of the Google Earth MapServer. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._url; + } + }, + /** + * Gets the url path of the data on the Google Earth server. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {string} + * @readonly + */ + path: { + get: function() { + return this._path; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the imagery channel (id) currently being used. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number} + * @readonly + */ + channel: { + get: function() { + return this._channel; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the version of the data used by this provider. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {number} + * @readonly + */ + version: { + get: function() { + return this._version; + } + }, + /** + * Gets the type of data that is being requested from the provider. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {string} + * @readonly + */ + requestType: { + get: function() { + return this._requestType; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof GoogleEarthEnterpriseMapsProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !0; + } + } +}); +GoogleEarthEnterpriseMapsProvider.fromUrl = async function(e, t, n) { + n = defaultValue(n, {}); + const i = defaultValue(n.path, "/default_map"), r = Resource.createIfNeeded(e).getDerivedResource({ + // We used to just append path to url, so now that we do proper URI resolution, removed the / + url: i[0] === "/" ? i.substring(1) : i + }); + r.appendForwardSlash(); + const o = r.getDerivedResource({ + url: "query", + queryParameters: { + request: "Json", + vars: "geeServerDefs", + is2d: "t" + } + }), s = new ImageryProviderBuilder(n); + s.channel = t, await requestMetadata$2(o, s); + const c = new GoogleEarthEnterpriseMapsProvider(n); + return s.build(c), c._resource = r, c._url = e, c._path = i, c; +}; +GoogleEarthEnterpriseMapsProvider.prototype.getTileCredits = function(e, t, n) { +}; +GoogleEarthEnterpriseMapsProvider.prototype.requestImage = function(e, t, n, i) { + const r = this._resource.getDerivedResource({ + url: "query", + request: i, + queryParameters: { + request: this._requestType, + channel: this._channel, + version: this._version, + x: e, + y: t, + z: n + 1 + // Google Earth starts with a zoom level of 1, not 0 + } + }); + return ImageryProvider.loadImage(this, r); +}; +GoogleEarthEnterpriseMapsProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +GoogleEarthEnterpriseMapsProvider._logoUrl = void 0; +Object.defineProperties(GoogleEarthEnterpriseMapsProvider, { + /** + * Gets or sets the URL to the Google Earth logo for display in the credit. + * @memberof GoogleEarthEnterpriseMapsProvider + * @type {string} + */ + logoUrl: { + get: function() { + return defined(GoogleEarthEnterpriseMapsProvider._logoUrl) || (GoogleEarthEnterpriseMapsProvider._logoUrl = buildModuleUrl( + "Assets/Images/google_earth_credit.png" + )), GoogleEarthEnterpriseMapsProvider._logoUrl; + }, + set: function(e) { + GoogleEarthEnterpriseMapsProvider._logoUrl = e; + } + } +}); +const trailingSlashRegex$1 = /\/$/, defaultCredit$3 = new Credit( + '© Mapbox © OpenStreetMap Improve this map' +); +function MapboxImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.mapId, n = e.accessToken; + this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0; + const i = Resource.createIfNeeded( + defaultValue(e.url, "https://{s}.tiles.mapbox.com/v4/") + ); + this._mapId = t, this._accessToken = n; + let r = defaultValue(e.format, "png"); + /\./.test(r) || (r = `.${r}`), this._format = r; + let o = i.getUrlComponent(); + trailingSlashRegex$1.test(o) || (o += "/"), o += `${t}/{z}/{x}/{y}${this._format}`, i.url = o, i.setQueryParameters({ + access_token: n + }); + let s; + defined(e.credit) ? (s = e.credit, typeof s == "string" && (s = new Credit(s))) : s = defaultCredit$3, this._resource = i, this._imageryProvider = new UrlTemplateImageryProvider({ + url: i, + credit: s, + ellipsoid: e.ellipsoid, + minimumLevel: e.minimumLevel, + maximumLevel: e.maximumLevel, + rectangle: e.rectangle + }); +} +Object.defineProperties(MapboxImageryProvider.prototype, { + /** + * Gets the URL of the Mapbox server. + * @memberof MapboxImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._imageryProvider.url; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + * @memberof MapboxImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._imageryProvider.rectangle; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof MapboxImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._imageryProvider.tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof MapboxImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._imageryProvider.tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof MapboxImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._imageryProvider.maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + * @memberof MapboxImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return this._imageryProvider.minimumLevel; + } + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof MapboxImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._imageryProvider.tilingScheme; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof MapboxImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._imageryProvider.tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof MapboxImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._imageryProvider.errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof MapboxImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._imageryProvider.credit; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof MapboxImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._imageryProvider.proxy; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof MapboxImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return this._imageryProvider.hasAlphaChannel; + } + } +}); +MapboxImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +MapboxImageryProvider.prototype.requestImage = function(e, t, n, i) { + return this._imageryProvider.requestImage(e, t, n, i); +}; +MapboxImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + return this._imageryProvider.pickFeatures(e, t, n, i, r); +}; +MapboxImageryProvider._defaultCredit = defaultCredit$3; +function SingleTileImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0; + const t = defaultValue(e.rectangle, Rectangle.MAX_VALUE), n = new GeographicTilingScheme({ + rectangle: t, + numberOfLevelZeroTilesX: 1, + numberOfLevelZeroTilesY: 1, + ellipsoid: e.ellipsoid + }); + this._tilingScheme = n, this._image = void 0, this._texture = void 0, this._hasError = !1, this._errorEvent = new Event(); + let i = e.credit; + typeof i == "string" && (i = new Credit(i)), this._credit = i; + const r = Resource.createIfNeeded(e.url); + this._resource = r, this._tileWidth = e.tileWidth, this._tileHeight = e.tileHeight; +} +Object.defineProperties(SingleTileImageryProvider.prototype, { + /** + * Gets the URL of the single, top-level imagery tile. + * @memberof SingleTileImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof SingleTileImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof SingleTileImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof SingleTileImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof SingleTileImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof SingleTileImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof SingleTileImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof SingleTileImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof SingleTileImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof SingleTileImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof SingleTileImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof SingleTileImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !0; + } + } +}); +function failure(e, t, n, i) { + let r = `Failed to load image ${e.url}`; + defined(t) && defined(t.message) && (r += `: ${t.message}`); + const o = TileProviderError.reportError( + i, + n, + defined(n) ? n._errorEvent : void 0, + r, + 0, + 0, + 0, + t + ); + if (o.retry) + return doRequest(e, n, o); + throw defined(n) && (n._hasError = !0), new RuntimeError(r); +} +async function doRequest(e, t, n) { + try { + return await ImageryProvider.loadImage(null, e); + } catch (i) { + return failure(e, i, t, n); + } +} +SingleTileImageryProvider.fromUrl = async function(e, t) { + const n = Resource.createIfNeeded(e), i = await doRequest(n); + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const r = new SingleTileImageryProvider({ + ...t, + url: e, + tileWidth: i.width, + tileHeight: i.height + }); + return r._image = i, r; +}; +SingleTileImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +SingleTileImageryProvider.prototype.requestImage = async function(e, t, n, i) { + if (!this._hasError && !defined(this._image)) { + const r = await doRequest(this._resource, this); + return this._image = r, TileProviderError.reportSuccess(this._errorEvent), r; + } + return this._image; +}; +SingleTileImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +function GetFeatureInfoFormat(e, t, n) { + this.type = e, defined(t) || (e === "json" ? t = "application/json" : e === "xml" ? t = "text/xml" : e === "html" ? t = "text/html" : e === "text" && (t = "text/plain")), this.format = t, defined(n) || (e === "json" ? n = geoJsonToFeatureInfo : e === "xml" ? n = xmlToFeatureInfo : (e === "html" || e === "text") && (n = textToFeatureInfo)), this.callback = n; +} +function geoJsonToFeatureInfo(e) { + const t = [], n = e.features; + for (let i = 0; i < n.length; ++i) { + const r = n[i], o = new ImageryLayerFeatureInfo(); + if (o.data = r, o.properties = r.properties, o.configureNameFromProperties(r.properties), o.configureDescriptionFromProperties(r.properties), defined(r.geometry) && r.geometry.type === "Point") { + const s = r.geometry.coordinates[0], c = r.geometry.coordinates[1]; + o.position = Cartographic.fromDegrees(s, c); + } + t.push(o); + } + return t; +} +const mapInfoMxpNamespace = "http://www.mapinfo.com/mxp", esriWmsNamespace = "http://www.esri.com/wms", wfsNamespace = "http://www.opengis.net/wfs", gmlNamespace = "http://www.opengis.net/gml"; +function xmlToFeatureInfo(e) { + const t = e.documentElement; + if (t.localName === "MultiFeatureCollection" && t.namespaceURI === mapInfoMxpNamespace) + return mapInfoXmlToFeatureInfo(e); + if (t.localName === "FeatureInfoResponse" && t.namespaceURI === esriWmsNamespace) + return esriXmlToFeatureInfo(e); + if (t.localName === "FeatureCollection" && t.namespaceURI === wfsNamespace) + return gmlToFeatureInfo(e); + if (t.localName === "ServiceExceptionReport") + throw new RuntimeError( + new XMLSerializer().serializeToString(t) + ); + return t.localName === "msGMLOutput" ? msGmlToFeatureInfo(e) : unknownXmlToFeatureInfo(e); +} +function mapInfoXmlToFeatureInfo(e) { + const t = [], i = e.documentElement.getElementsByTagNameNS( + mapInfoMxpNamespace, + "Feature" + ); + for (let r = 0; r < i.length; ++r) { + const o = i[r], s = {}, c = o.getElementsByTagNameNS( + mapInfoMxpNamespace, + "Val" + ); + for (let d = 0; d < c.length; ++d) { + const f = c[d]; + if (f.hasAttribute("ref")) { + const h = f.getAttribute("ref"), p = f.textContent.trim(); + s[h] = p; + } + } + const l = new ImageryLayerFeatureInfo(); + l.data = o, l.properties = s, l.configureNameFromProperties(s), l.configureDescriptionFromProperties(s), t.push(l); + } + return t; +} +function esriXmlToFeatureInfo(e) { + const t = e.documentElement, n = []; + let i; + const r = t.getElementsByTagNameNS("*", "FIELDS"); + if (r.length > 0) + for (let o = 0; o < r.length; ++o) { + const s = r[o]; + i = {}; + const c = s.attributes; + for (let l = 0; l < c.length; ++l) { + const d = c[l]; + i[d.name] = d.value; + } + n.push( + imageryLayerFeatureInfoFromDataAndProperties(s, i) + ); + } + else { + const o = t.getElementsByTagNameNS( + "*", + "FeatureInfo" + ); + for (let s = 0; s < o.length; ++s) { + const c = o[s]; + i = {}; + const l = c.childNodes; + for (let d = 0; d < l.length; ++d) { + const f = l[d]; + f.nodeType === Node.ELEMENT_NODE && (i[f.localName] = f.textContent); + } + n.push( + imageryLayerFeatureInfoFromDataAndProperties( + c, + i + ) + ); + } + } + return n; +} +function gmlToFeatureInfo(e) { + const t = [], i = e.documentElement.getElementsByTagNameNS( + gmlNamespace, + "featureMember" + ); + for (let r = 0; r < i.length; ++r) { + const o = i[r], s = {}; + getGmlPropertiesRecursively(o, s), t.push( + imageryLayerFeatureInfoFromDataAndProperties(o, s) + ); + } + return t; +} +function msGmlToFeatureInfo(e) { + const t = []; + let n; + const i = e.documentElement.childNodes; + for (let o = 0; o < i.length; o++) + if (i[o].nodeType === Node.ELEMENT_NODE) { + n = i[o]; + break; + } + if (!defined(n)) + throw new RuntimeError( + "Unable to find first child of the feature info xml document" + ); + const r = n.childNodes; + for (let o = 0; o < r.length; ++o) { + const s = r[o]; + if (s.nodeType === Node.ELEMENT_NODE) { + const c = {}; + getGmlPropertiesRecursively(s, c), t.push( + imageryLayerFeatureInfoFromDataAndProperties(s, c) + ); + } + } + return t; +} +function getGmlPropertiesRecursively(e, t) { + let n = !0; + for (let i = 0; i < e.childNodes.length; ++i) { + const r = e.childNodes[i]; + r.nodeType === Node.ELEMENT_NODE && (n = !1), !(r.localName === "Point" || r.localName === "LineString" || r.localName === "Polygon" || r.localName === "boundedBy") && r.hasChildNodes() && getGmlPropertiesRecursively(r, t) && (t[r.localName] = r.textContent); + } + return n; +} +function imageryLayerFeatureInfoFromDataAndProperties(e, t) { + const n = new ImageryLayerFeatureInfo(); + return n.data = e, n.properties = t, n.configureNameFromProperties(t), n.configureDescriptionFromProperties(t), n; +} +function unknownXmlToFeatureInfo(e) { + const t = new XMLSerializer().serializeToString(e), n = document.createElement("div"), i = document.createElement("pre"); + i.textContent = t, n.appendChild(i); + const r = new ImageryLayerFeatureInfo(); + return r.data = e, r.description = n.innerHTML, [r]; +} +const emptyBodyRegex = /\s*<\/body>/im, wmsServiceExceptionReportRegex = //im, titleRegex = /([\s\S]*)<\/title>/im; +function textToFeatureInfo(e) { + if (emptyBodyRegex.test(e) || wmsServiceExceptionReportRegex.test(e)) + return; + let t; + const n = titleRegex.exec(e); + n && n.length > 1 && (t = n[1]); + const i = new ImageryLayerFeatureInfo(); + return i.name = t, i.description = e, i.data = e, [i]; +} +function TimeDynamicImagery(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._tileCache = {}, this._tilesRequestedForInterval = []; + const t = this._clock = e.clock; + this._times = e.times, this._requestImageFunction = e.requestImageFunction, this._reloadFunction = e.reloadFunction, this._currentIntervalIndex = -1, t.onTick.addEventListener(this._clockOnTick, this), this._clockOnTick(t); +} +Object.defineProperties(TimeDynamicImagery.prototype, { + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + * @memberof TimeDynamicImagery.prototype + * @type {Clock} + */ + clock: { + get: function() { + return this._clock; + }, + set: function(e) { + this._clock !== e && (this._clock = e, this._clockOnTick(e), this._reloadFunction()); + } + }, + /** + * Gets or sets a time interval collection. + * @memberof TimeDynamicImagery.prototype + * @type {TimeIntervalCollection} + */ + times: { + get: function() { + return this._times; + }, + set: function(e) { + this._times !== e && (this._times = e, this._clockOnTick(this._clock), this._reloadFunction()); + } + }, + /** + * Gets the current interval. + * @memberof TimeDynamicImagery.prototype + * @type {TimeInterval} + */ + currentInterval: { + get: function() { + return this._times.get(this._currentIntervalIndex); + } + } +}); +TimeDynamicImagery.prototype.getFromCache = function(e, t, n, i) { + const r = getKey$1(e, t, n); + let o; + const s = this._tileCache[this._currentIntervalIndex]; + if (defined(s) && defined(s[r])) { + const c = s[r]; + o = c.promise.catch(function(l) { + throw i.state = c.request.state, l; + }), delete s[r]; + } + return o; +}; +TimeDynamicImagery.prototype.checkApproachingInterval = function(e, t, n, i) { + const r = getKey$1(e, t, n), o = this._tilesRequestedForInterval, s = getApproachingInterval(this), c = { + key: r, + // Determines priority based on camera distance to the tile. + // Since the imagery regardless of time will be attached to the same tile we can just steal it. + priorityFunction: i.priorityFunction + }; + (!defined(s) || !addToCache(this, c, s)) && o.push(c), o.length >= 512 && o.splice(0, 256); +}; +TimeDynamicImagery.prototype._clockOnTick = function(e) { + const t = e.currentTime, i = this._times.indexOf(t), r = this._currentIntervalIndex; + if (i !== r) { + const s = this._tileCache[r]; + for (const c in s) + s.hasOwnProperty(c) && s[c].request.cancel(); + delete this._tileCache[r], this._tilesRequestedForInterval = [], this._currentIntervalIndex = i, this._reloadFunction(); + return; + } + const o = getApproachingInterval(this); + if (defined(o)) { + const s = this._tilesRequestedForInterval; + let c = !0; + for (; c && s.length !== 0; ) { + const l = s.pop(); + c = addToCache(this, l, o), c || s.push(l); + } + } +}; +function getKey$1(e, t, n) { + return `${e}-${t}-${n}`; +} +function getKeyElements(e) { + const t = e.split("-"); + if (t.length === 3) + return { + x: Number(t[0]), + y: Number(t[1]), + level: Number(t[2]) + }; +} +function getApproachingInterval(e) { + const t = e._times; + if (!defined(t)) + return; + const n = e._clock, i = n.currentTime, r = n.canAnimate && n.shouldAnimate, o = n.multiplier; + if (!r && o !== 0) + return; + let s, c = t.indexOf(i); + if (c < 0) + return; + const l = t.get(c); + return o > 0 ? (s = JulianDate.secondsDifference(l.stop, i), ++c) : (s = JulianDate.secondsDifference(l.start, i), --c), s /= o, c >= 0 && s <= 5 ? t.get(c) : void 0; +} +function addToCache(e, t, n) { + const i = e._times.indexOf(n.start), r = e._tileCache; + let o = r[i]; + defined(o) || (o = r[i] = {}); + const s = t.key; + if (defined(o[s])) + return !0; + const c = getKeyElements(s), l = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.IMAGERY, + priorityFunction: t.priorityFunction + }), d = e._requestImageFunction( + c.x, + c.y, + c.level, + l, + n + ); + return defined(d) ? (o[s] = { + promise: d, + request: l + }, !0) : !1; +} +const includesReverseAxis = [ + 3034, + // ETRS89-extended / LCC Europe + 3035, + // ETRS89-extended / LAEA Europe + 3042, + // ETRS89 / UTM zone 30N (N-E) + 3043, + // ETRS89 / UTM zone 31N (N-E) + 3044 + // ETRS89 / UTM zone 32N (N-E) +], excludesReverseAxis = [ + 4471, + // Mayotte + 4559 + // French Antilles +]; +function WebMapServiceImageryProvider(e) { + if (e = defaultValue(e, defaultValue.EMPTY_OBJECT), defined(e.times) && !defined(e.clock)) + throw new DeveloperError( + "options.times was specified, so options.clock is required." + ); + this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._getFeatureInfoUrl = defaultValue( + e.getFeatureInfoUrl, + e.url + ); + const t = Resource.createIfNeeded(e.url), n = Resource.createIfNeeded(this._getFeatureInfoUrl); + t.setQueryParameters( + WebMapServiceImageryProvider.DefaultParameters, + !0 + ), n.setQueryParameters( + WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters, + !0 + ), defined(e.parameters) && t.setQueryParameters(objectToLowercase(e.parameters)), defined(e.getFeatureInfoParameters) && n.setQueryParameters( + objectToLowercase(e.getFeatureInfoParameters) + ); + const i = this; + this._reload = void 0, defined(e.times) && (this._timeDynamicImagery = new TimeDynamicImagery({ + clock: e.clock, + times: e.times, + requestImageFunction: function(s, c, l, d, f) { + return requestImage$1(i, s, c, l, d, f); + }, + reloadFunction: function() { + defined(i._reload) && i._reload(); + } + })); + const r = {}; + if (r.layers = e.layers, r.bbox = "{westProjected},{southProjected},{eastProjected},{northProjected}", r.width = "{width}", r.height = "{height}", parseFloat(t.queryParameters.version) >= 1.3) { + r.crs = defaultValue( + e.crs, + e.tilingScheme && e.tilingScheme.projection instanceof WebMercatorProjection ? "EPSG:3857" : "CRS:84" + ); + const s = r.crs.split(":"); + if (s[0] === "EPSG" && s.length === 2) { + const c = Number(s[1]); + (c >= 4e3 && c < 5e3 && !excludesReverseAxis.includes(c) || includesReverseAxis.includes(c)) && (r.bbox = "{southProjected},{westProjected},{northProjected},{eastProjected}"); + } + } else + r.srs = defaultValue( + e.srs, + e.tilingScheme && e.tilingScheme.projection instanceof WebMercatorProjection ? "EPSG:3857" : "EPSG:4326" + ); + t.setQueryParameters(r, !0), n.setQueryParameters(r, !0); + const o = { + query_layers: e.layers, + info_format: "{format}" + }; + parseFloat(n.queryParameters.version) >= 1.3 ? (o.i = "{i}", o.j = "{j}") : (o.x = "{i}", o.y = "{j}"), n.setQueryParameters(o, !0), this._resource = t, this._pickFeaturesResource = n, this._layers = e.layers, this._tileProvider = new UrlTemplateImageryProvider({ + url: t, + pickFeaturesUrl: n, + tilingScheme: defaultValue( + e.tilingScheme, + new GeographicTilingScheme({ ellipsoid: e.ellipsoid }) + ), + rectangle: e.rectangle, + tileWidth: e.tileWidth, + tileHeight: e.tileHeight, + minimumLevel: e.minimumLevel, + maximumLevel: e.maximumLevel, + subdomains: e.subdomains, + tileDiscardPolicy: e.tileDiscardPolicy, + credit: e.credit, + getFeatureInfoFormats: defaultValue( + e.getFeatureInfoFormats, + WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats + ), + enablePickFeatures: e.enablePickFeatures + }); +} +function requestImage$1(e, t, n, i, r, o) { + const s = defined(o) ? o.data : void 0, c = e._tileProvider; + return defined(s) && c._resource.setQueryParameters(s), c.requestImage(t, n, i, r); +} +function pickFeatures(e, t, n, i, r, o, s) { + const c = defined(s) ? s.data : void 0, l = e._tileProvider; + return defined(c) && l._pickFeaturesResource.setQueryParameters(c), l.pickFeatures(t, n, i, r, o); +} +Object.defineProperties(WebMapServiceImageryProvider.prototype, { + /** + * Gets the URL of the WMS server. + * @memberof WebMapServiceImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource._url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the names of the WMS layers, separated by commas. + * @memberof WebMapServiceImageryProvider.prototype + * @type {string} + * @readonly + */ + layers: { + get: function() { + return this._layers; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof WebMapServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileProvider.tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof WebMapServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileProvider.tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof WebMapServiceImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._tileProvider.maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof WebMapServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return this._tileProvider.minimumLevel; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof WebMapServiceImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tileProvider.tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tileProvider.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof WebMapServiceImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileProvider.tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._tileProvider.errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._tileProvider.credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof WebMapServiceImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return this._tileProvider.hasAlphaChannel; + } + }, + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link WebMapServiceImageryProvider#pickFeatures} will + * invoke the <code>GetFeatureInfo</code> service on the WMS server and attempt to interpret the features included in the response. If false, + * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. + * @memberof WebMapServiceImageryProvider.prototype + * @type {boolean} + * @default true + */ + enablePickFeatures: { + get: function() { + return this._tileProvider.enablePickFeatures; + }, + set: function(e) { + this._tileProvider.enablePickFeatures = e; + } + }, + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Clock} + */ + clock: { + get: function() { + return this._timeDynamicImagery.clock; + }, + set: function(e) { + this._timeDynamicImagery.clock = e; + } + }, + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + * @memberof WebMapServiceImageryProvider.prototype + * @type {TimeIntervalCollection} + */ + times: { + get: function() { + return this._timeDynamicImagery.times; + }, + set: function(e) { + this._timeDynamicImagery.times = e; + } + }, + /** + * Gets the getFeatureInfo URL of the WMS server. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Resource|string} + * @readonly + */ + getFeatureInfoUrl: { + get: function() { + return this._getFeatureInfoUrl; + } + } +}); +WebMapServiceImageryProvider.prototype.getTileCredits = function(e, t, n) { + return this._tileProvider.getTileCredits(e, t, n); +}; +WebMapServiceImageryProvider.prototype.requestImage = function(e, t, n, i) { + let r; + const o = this._timeDynamicImagery; + let s; + return defined(o) && (s = o.currentInterval, r = o.getFromCache(e, t, n, i)), defined(r) || (r = requestImage$1(this, e, t, n, i, s)), defined(r) && defined(o) && o.checkApproachingInterval(e, t, n, i), r; +}; +WebMapServiceImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + const o = this._timeDynamicImagery, s = defined(o) ? o.currentInterval : void 0; + return pickFeatures(this, e, t, n, i, r, s); +}; +WebMapServiceImageryProvider.DefaultParameters = Object.freeze({ + service: "WMS", + version: "1.1.1", + request: "GetMap", + styles: "", + format: "image/jpeg" +}); +WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters = Object.freeze({ + service: "WMS", + version: "1.1.1", + request: "GetFeatureInfo" +}); +WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats = Object.freeze([ + Object.freeze(new GetFeatureInfoFormat("json", "application/json")), + Object.freeze(new GetFeatureInfoFormat("xml", "text/xml")), + Object.freeze(new GetFeatureInfoFormat("text", "text/html")) +]); +function objectToLowercase(e) { + const t = {}; + for (const n in e) + e.hasOwnProperty(n) && (t[n.toLowerCase()] = e[n]); + return t; +} +const defaultParameters = Object.freeze({ + service: "WMTS", + version: "1.0.0", + request: "GetTile" +}); +function WebMapTileServiceImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0; + const t = Resource.createIfNeeded(e.url), n = e.style, i = e.tileMatrixSetID, r = t.url, o = r.match(/{/g); + if (!defined(o) || o.length === 1 && /{s}/.test(r)) + t.setQueryParameters(defaultParameters), this._useKvp = !0; + else { + const f = { + style: n, + Style: n, + TileMatrixSet: i + }; + t.setTemplateValues(f), this._useKvp = !1; + } + this._resource = t, this._layer = e.layer, this._style = n, this._tileMatrixSetID = i, this._tileMatrixLabels = e.tileMatrixLabels, this._format = defaultValue(e.format, "image/jpeg"), this._tileDiscardPolicy = e.tileDiscardPolicy, this._tilingScheme = defined(e.tilingScheme) ? e.tilingScheme : new WebMercatorTilingScheme({ ellipsoid: e.ellipsoid }), this._tileWidth = defaultValue(e.tileWidth, 256), this._tileHeight = defaultValue(e.tileHeight, 256), this._minimumLevel = defaultValue(e.minimumLevel, 0), this._maximumLevel = e.maximumLevel, this._rectangle = defaultValue( + e.rectangle, + this._tilingScheme.rectangle + ), this._dimensions = e.dimensions; + const s = this; + this._reload = void 0, defined(e.times) && (this._timeDynamicImagery = new TimeDynamicImagery({ + clock: e.clock, + times: e.times, + requestImageFunction: function(f, h, p, m, _) { + return requestImage(s, f, h, p, m, _); + }, + reloadFunction: function() { + defined(s._reload) && s._reload(); + } + })); + const c = this._tilingScheme.positionToTileXY( + Rectangle.southwest(this._rectangle), + this._minimumLevel + ), l = this._tilingScheme.positionToTileXY( + Rectangle.northeast(this._rectangle), + this._minimumLevel + ); + (Math.abs(l.x - c.x) + 1) * (Math.abs(l.y - c.y) + 1), this._errorEvent = new Event(); + const d = e.credit; + this._credit = typeof d == "string" ? new Credit(d) : d, this._subdomains = e.subdomains, Array.isArray(this._subdomains) ? this._subdomains = this._subdomains.slice() : defined(this._subdomains) && this._subdomains.length > 0 ? this._subdomains = this._subdomains.split("") : this._subdomains = ["a", "b", "c"]; +} +function requestImage(e, t, n, i, r, o) { + const s = e._tileMatrixLabels, c = defined(s) ? s[i] : i.toString(), l = e._subdomains, d = e._dimensions, f = defined(o) ? o.data : void 0; + let h, p; + if (!e._useKvp) + p = { + TileMatrix: c, + TileRow: n.toString(), + TileCol: t.toString(), + s: l[(t + n + i) % l.length] + }, h = e._resource.getDerivedResource({ + request: r + }), h.setTemplateValues(p), defined(d) && h.setTemplateValues(d), defined(f) && h.setTemplateValues(f); + else { + let m = {}; + m.tilematrix = c, m.layer = e._layer, m.style = e._style, m.tilerow = n, m.tilecol = t, m.tilematrixset = e._tileMatrixSetID, m.format = e._format, defined(d) && (m = combine$2(m, d)), defined(f) && (m = combine$2(m, f)), p = { + s: l[(t + n + i) % l.length] + }, h = e._resource.getDerivedResource({ + queryParameters: m, + request: r + }), h.setTemplateValues(p); + } + return ImageryProvider.loadImage(e, h); +} +Object.defineProperties(WebMapTileServiceImageryProvider.prototype, { + /** + * Gets the URL of the service hosting the imagery. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return this._minimumLevel; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the mime type of images returned by this imagery provider. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {string} + * @readonly + */ + format: { + get: function() { + return this._format; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !0; + } + }, + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Clock} + */ + clock: { + get: function() { + return this._timeDynamicImagery.clock; + }, + set: function(e) { + this._timeDynamicImagery.clock = e; + } + }, + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {TimeIntervalCollection} + */ + times: { + get: function() { + return this._timeDynamicImagery.times; + }, + set: function(e) { + this._timeDynamicImagery.times = e; + } + }, + /** + * Gets or sets an object that contains static dimensions and their values. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {object} + */ + dimensions: { + get: function() { + return this._dimensions; + }, + set: function(e) { + this._dimensions !== e && (this._dimensions = e, defined(this._reload) && this._reload()); + } + } +}); +WebMapTileServiceImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +WebMapTileServiceImageryProvider.prototype.requestImage = function(e, t, n, i) { + let r; + const o = this._timeDynamicImagery; + let s; + return defined(o) && (s = o.currentInterval, r = o.getFromCache(e, t, n, i)), defined(r) || (r = requestImage(this, e, t, n, i, s)), defined(r) && defined(o) && o.checkApproachingInterval(e, t, n, i), r; +}; +WebMapTileServiceImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +const ImageryProviderAsyncMapping = { + ARCGIS_MAPSERVER: ArcGisMapServerImageryProvider.fromUrl, + BING: async (e, t) => BingMapsImageryProvider.fromUrl(e, t), + GOOGLE_EARTH: async (e, t) => { + const n = t.channel; + return delete t.channel, GoogleEarthEnterpriseMapsProvider.fromUrl(e, n, t); + }, + MAPBOX: (e, t) => new MapboxImageryProvider({ + url: e, + ...t + }), + SINGLE_TILE: SingleTileImageryProvider.fromUrl, + TMS: TileMapServiceImageryProvider.fromUrl, + URL_TEMPLATE: (e, t) => new UrlTemplateImageryProvider({ + url: e, + ...t + }), + WMS: (e, t) => new WebMapServiceImageryProvider({ + url: e, + ...t + }), + WMTS: (e, t) => new WebMapTileServiceImageryProvider({ + url: e, + ...t + }) +}; +function IonImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._tileCredits = void 0, this._errorEvent = new Event(); +} +Object.defineProperties(IonImageryProvider.prototype, { + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + * @memberof IonImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._imageryProvider.rectangle; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof IonImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._imageryProvider.tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof IonImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._imageryProvider.tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof IonImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._imageryProvider.maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + * @memberof IonImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return this._imageryProvider.minimumLevel; + } + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof IonImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._imageryProvider.tilingScheme; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof IonImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._imageryProvider.tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof IonImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof IonImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._imageryProvider.credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof IonImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return this._imageryProvider.hasAlphaChannel; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof IonImageryProvider.prototype + * @type {Proxy} + * @readonly + * @default undefined + */ + proxy: { + get: function() { + } + } +}); +IonImageryProvider.fromAssetId = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = IonResource._createEndpointResource( + e, + t + ), i = e.toString() + t.accessToken + t.server; + let r = IonImageryProvider._endpointCache[i]; + defined(r) || (r = n.fetchJson(), IonImageryProvider._endpointCache[i] = r); + const o = await r; + if (o.type !== "IMAGERY") + throw new RuntimeError( + `Cesium ion asset ${e} is not an imagery asset.` + ); + let s; + const c = o.externalType; + if (!defined(c)) + s = await TileMapServiceImageryProvider.fromUrl( + new IonResource(o, n) + ); + else { + const d = ImageryProviderAsyncMapping[c]; + if (!defined(d)) + throw new RuntimeError( + `Unrecognized Cesium ion imagery type: ${c}` + ); + const f = { ...o.options }, h = f.url; + delete f.url, s = await d(h, f); + } + const l = new IonImageryProvider(t); + return s.errorEvent.addEventListener(function(d) { + d.provider = l, l._errorEvent.raiseEvent(d); + }), l._tileCredits = IonResource.getCreditsFromEndpoint( + o, + n + ), l._imageryProvider = s, l; +}; +IonImageryProvider.prototype.getTileCredits = function(e, t, n) { + const i = this._imageryProvider.getTileCredits(e, t, n); + return defined(i) ? this._tileCredits.concat(i) : this._tileCredits; +}; +IonImageryProvider.prototype.requestImage = function(e, t, n, i) { + return this._imageryProvider.requestImage(e, t, n, i); +}; +IonImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + return this._imageryProvider.pickFeatures(e, t, n, i, r); +}; +IonImageryProvider._endpointCache = {}; +const IonWorldImageryStyle = { + /** + * Aerial imagery. + * + * @type {number} + * @constant + */ + AERIAL: 2, + /** + * Aerial imagery with a road overlay. + * + * @type {number} + * @constant + */ + AERIAL_WITH_LABELS: 3, + /** + * Roads without additional imagery. + * + * @type {number} + * @constant + */ + ROAD: 4 +}, IonWorldImageryStyle$1 = Object.freeze(IonWorldImageryStyle); +function createWorldImageryAsync(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.style, IonWorldImageryStyle$1.AERIAL); + return IonImageryProvider.fromAssetId(t); +} +function Imagery(e, t, n, i, r) { + if (this.imageryLayer = e, this.x = t, this.y = n, this.level = i, this.request = void 0, i !== 0) { + const o = t / 2 | 0, s = n / 2 | 0, c = i - 1; + this.parent = e.getImageryFromCache( + o, + s, + c + ); + } + this.state = ImageryState$1.UNLOADED, this.imageUrl = void 0, this.image = void 0, this.texture = void 0, this.textureWebMercator = void 0, this.credits = void 0, this.referenceCount = 0, !defined(r) && e.ready && (r = e.imageryProvider.tilingScheme.tileXYToRectangle(t, n, i)), this.rectangle = r; +} +Imagery.createPlaceholder = function(e) { + const t = new Imagery(e, 0, 0, 0); + return t.addReference(), t.state = ImageryState$1.PLACEHOLDER, t; +}; +Imagery.prototype.addReference = function() { + ++this.referenceCount; +}; +Imagery.prototype.releaseReference = function() { + return --this.referenceCount, this.referenceCount === 0 ? (this.imageryLayer.removeImageryFromCache(this), defined(this.parent) && this.parent.releaseReference(), defined(this.image) && defined(this.image.destroy) && this.image.destroy(), defined(this.texture) && this.texture.destroy(), defined(this.textureWebMercator) && this.texture !== this.textureWebMercator && this.textureWebMercator.destroy(), destroyObject(this), 0) : this.referenceCount; +}; +Imagery.prototype.processStateMachine = function(e, t, n) { + this.state === ImageryState$1.UNLOADED && !n && (this.state = ImageryState$1.TRANSITIONING, this.imageryLayer._requestImagery(this)), this.state === ImageryState$1.RECEIVED && (this.state = ImageryState$1.TRANSITIONING, this.imageryLayer._createTexture(e.context, this)); + const i = this.state === ImageryState$1.READY && t && !this.texture; + (this.state === ImageryState$1.TEXTURE_LOADED || i) && (this.state = ImageryState$1.TRANSITIONING, this.imageryLayer._reprojectTexture( + e, + this, + t + )); +}; +function TileImagery(e, t, n) { + this.readyImagery = void 0, this.loadingImagery = e, this.textureCoordinateRectangle = t, this.textureTranslationAndScale = void 0, this.useWebMercatorT = n; +} +TileImagery.prototype.freeResources = function() { + defined(this.readyImagery) && this.readyImagery.releaseReference(), defined(this.loadingImagery) && this.loadingImagery.releaseReference(); +}; +TileImagery.prototype.processStateMachine = function(e, t, n) { + const i = this.loadingImagery, r = i.imageryLayer; + if (i.processStateMachine( + t, + !this.useWebMercatorT, + n + ), i.state === ImageryState$1.READY) + return defined(this.readyImagery) && this.readyImagery.releaseReference(), this.readyImagery = this.loadingImagery, this.loadingImagery = void 0, this.textureTranslationAndScale = r._calculateTextureTranslationAndScale( + e, + this + ), !0; + let o = i.parent, s; + for (; defined(o) && (o.state !== ImageryState$1.READY || !this.useWebMercatorT && !defined(o.texture)); ) + o.state !== ImageryState$1.FAILED && o.state !== ImageryState$1.INVALID && (s = s || o), o = o.parent; + return this.readyImagery !== o && (defined(this.readyImagery) && this.readyImagery.releaseReference(), this.readyImagery = o, defined(o) && (o.addReference(), this.textureTranslationAndScale = r._calculateTextureTranslationAndScale( + e, + this + ))), i.state === ImageryState$1.FAILED || i.state === ImageryState$1.INVALID ? defined(s) ? (s.processStateMachine( + t, + !this.useWebMercatorT, + n + ), !1) : !0 : !1; +}; +function ImageryLayer(e, t) { + this._imageryProvider = e, this._readyEvent = new Event(), this._errorEvent = new Event(), t = defaultValue(t, defaultValue.EMPTY_OBJECT), e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.alpha = defaultValue( + t.alpha, + defaultValue(e._defaultAlpha, 1) + ), this.nightAlpha = defaultValue( + t.nightAlpha, + defaultValue(e._defaultNightAlpha, 1) + ), this.dayAlpha = defaultValue( + t.dayAlpha, + defaultValue(e._defaultDayAlpha, 1) + ), this.brightness = defaultValue( + t.brightness, + defaultValue( + e._defaultBrightness, + ImageryLayer.DEFAULT_BRIGHTNESS + ) + ), this.contrast = defaultValue( + t.contrast, + defaultValue( + e._defaultContrast, + ImageryLayer.DEFAULT_CONTRAST + ) + ), this.hue = defaultValue( + t.hue, + defaultValue(e._defaultHue, ImageryLayer.DEFAULT_HUE) + ), this.saturation = defaultValue( + t.saturation, + defaultValue( + e._defaultSaturation, + ImageryLayer.DEFAULT_SATURATION + ) + ), this.gamma = defaultValue( + t.gamma, + defaultValue(e._defaultGamma, ImageryLayer.DEFAULT_GAMMA) + ), this.splitDirection = defaultValue( + t.splitDirection, + ImageryLayer.DEFAULT_SPLIT + ), this.minificationFilter = defaultValue( + t.minificationFilter, + defaultValue( + e._defaultMinificationFilter, + ImageryLayer.DEFAULT_MINIFICATION_FILTER + ) + ), this.magnificationFilter = defaultValue( + t.magnificationFilter, + defaultValue( + e._defaultMagnificationFilter, + ImageryLayer.DEFAULT_MAGNIFICATION_FILTER + ) + ), this.show = defaultValue(t.show, !0), this._minimumTerrainLevel = t.minimumTerrainLevel, this._maximumTerrainLevel = t.maximumTerrainLevel, this._rectangle = defaultValue(t.rectangle, Rectangle.MAX_VALUE), this._maximumAnisotropy = t.maximumAnisotropy, this._imageryCache = {}, this._skeletonPlaceholder = new TileImagery(Imagery.createPlaceholder(this)), this._show = !0, this._layerIndex = -1, this._isBaseLayer = !1, this._requestImageError = void 0, this._reprojectComputeCommands = [], this.cutoutRectangle = t.cutoutRectangle, this.colorToAlpha = t.colorToAlpha, this.colorToAlphaThreshold = defaultValue( + t.colorToAlphaThreshold, + ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD + ); +} +Object.defineProperties(ImageryLayer.prototype, { + /** + * Gets the imagery provider for this layer. This should not be called before {@link ImageryLayer#ready} returns true. + * @memberof ImageryLayer.prototype + * @type {ImageryProvider} + * @readonly + */ + imageryProvider: { + get: function() { + return this._imageryProvider; + } + }, + /** + * Returns true when the terrain provider has been successfully created. Otherwise, returns false. + * @memberof ImageryLayer.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return defined(this._imageryProvider); + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of the thrown error. + * @memberof Imagery.prototype + * @type {Event<Imagery.ErrorEventCallback>} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets an event that is raised when the imagery provider has been successfully created. Event listeners + * are passed the created instance of {@link ImageryProvider}. + * @memberof ImageryLayer.prototype + * @type {Event<ImageryLayer.ReadyEventCallback>} + * @readonly + */ + readyEvent: { + get: function() { + return this._readyEvent; + } + }, + /** + * Gets the rectangle of this layer. If this rectangle is smaller than the rectangle of the + * {@link ImageryProvider}, only a portion of the imagery provider is shown. + * @memberof ImageryLayer.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._rectangle; + } + } +}); +ImageryLayer.DEFAULT_BRIGHTNESS = 1; +ImageryLayer.DEFAULT_CONTRAST = 1; +ImageryLayer.DEFAULT_HUE = 0; +ImageryLayer.DEFAULT_SATURATION = 1; +ImageryLayer.DEFAULT_GAMMA = 1; +ImageryLayer.DEFAULT_SPLIT = SplitDirection$1.NONE; +ImageryLayer.DEFAULT_MINIFICATION_FILTER = TextureMinificationFilter$1.LINEAR; +ImageryLayer.DEFAULT_MAGNIFICATION_FILTER = TextureMagnificationFilter$1.LINEAR; +ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD = 4e-3; +ImageryLayer.fromProviderAsync = function(e, t) { + const n = new ImageryLayer(void 0, t); + return handlePromise$1(n, Promise.resolve(e)), n; +}; +ImageryLayer.fromWorldImagery = function(e) { + return e = defaultValue(e, defaultValue.EMPTY_OBJECT), ImageryLayer.fromProviderAsync( + createWorldImageryAsync({ + style: e.style + }), + e + ); +}; +ImageryLayer.prototype.isBaseLayer = function() { + return this._isBaseLayer; +}; +ImageryLayer.prototype.isDestroyed = function() { + return !1; +}; +ImageryLayer.prototype.destroy = function() { + return destroyObject(this); +}; +const imageryBoundsScratch = new Rectangle(), tileImageryBoundsScratch = new Rectangle(), clippedRectangleScratch = new Rectangle(), terrainRectangleScratch = new Rectangle(); +ImageryLayer.prototype.getImageryRectangle = function() { + const e = this._imageryProvider, t = this._rectangle; + return Rectangle.intersection(e.rectangle, t); +}; +ImageryLayer.prototype._createTileImagerySkeletons = function(e, t, n) { + const i = e.data; + if (!defined(t) || defined(this._minimumTerrainLevel) && e.level < this._minimumTerrainLevel || defined(this._maximumTerrainLevel) && e.level > this._maximumTerrainLevel) + return !1; + defined(n) || (n = i.imagery.length); + const r = this._imageryProvider; + if (!this.ready) + return this._skeletonPlaceholder.loadingImagery.addReference(), i.imagery.splice(n, 0, this._skeletonPlaceholder), !0; + const o = r.tilingScheme.projection instanceof WebMercatorProjection && e.rectangle.north < WebMercatorProjection.MaximumLatitude && e.rectangle.south > -WebMercatorProjection.MaximumLatitude, s = Rectangle.intersection( + r.rectangle, + this._rectangle, + imageryBoundsScratch + ); + let c = Rectangle.intersection( + e.rectangle, + s, + tileImageryBoundsScratch + ); + if (!defined(c)) { + if (!this.isBaseLayer()) + return !1; + const g = s, w = e.rectangle; + c = tileImageryBoundsScratch, w.south >= g.north ? c.north = c.south = g.north : w.north <= g.south ? c.north = c.south = g.south : (c.south = Math.max( + w.south, + g.south + ), c.north = Math.min( + w.north, + g.north + )), w.west >= g.east ? c.west = c.east = g.east : w.east <= g.west ? c.west = c.east = g.west : (c.west = Math.max( + w.west, + g.west + ), c.east = Math.min( + w.east, + g.east + )); + } + let l = 0; + c.south > 0 ? l = c.south : c.north < 0 && (l = c.north); + const f = 1 * t.getLevelMaximumGeometricError(e.level); + let h = getLevelWithMaximumTexelSpacing( + this, + f, + l + ); + h = Math.max(0, h); + const p = r.maximumLevel; + if (h > p && (h = p), defined(r.minimumLevel)) { + const g = r.minimumLevel; + h < g && (h = g); + } + const m = r.tilingScheme, _ = m.positionToTileXY( + Rectangle.northwest(c), + h + ), y = m.positionToTileXY( + Rectangle.southeast(c), + h + ); + let C = e.rectangle.width / 512, T = e.rectangle.height / 512; + const x = m.tileXYToRectangle( + _.x, + _.y, + h + ); + Math.abs(x.south - e.rectangle.north) < T && _.y < y.y && ++_.y, Math.abs(x.east - e.rectangle.west) < C && _.x < y.x && ++_.x; + const b = m.tileXYToRectangle( + y.x, + y.y, + h + ); + Math.abs(b.north - e.rectangle.south) < T && y.y > _.y && --y.y, Math.abs(b.west - e.rectangle.east) < C && y.x > _.x && --y.x; + const S = Rectangle.clone( + e.rectangle, + terrainRectangleScratch + ); + let E = m.tileXYToRectangle( + _.x, + _.y, + h + ), A = Rectangle.intersection( + E, + s, + clippedRectangleScratch + ), D; + o ? (m.rectangleToNativeRectangle( + S, + S + ), m.rectangleToNativeRectangle( + E, + E + ), m.rectangleToNativeRectangle( + A, + A + ), m.rectangleToNativeRectangle( + s, + s + ), D = m.tileXYToNativeRectangle.bind( + m + ), C = S.width / 512, T = S.height / 512) : D = m.tileXYToRectangle.bind( + m + ); + let P, I = 0, M = 1, R; + !this.isBaseLayer() && Math.abs(A.west - S.west) >= C && (I = Math.min( + 1, + (A.west - S.west) / S.width + )), !this.isBaseLayer() && Math.abs(A.north - S.north) >= T && (M = Math.max( + 0, + (A.north - S.south) / S.height + )); + const L = M; + for (let g = _.x; g <= y.x; g++) + if (P = I, E = D( + g, + _.y, + h + ), A = Rectangle.simpleIntersection( + E, + s, + clippedRectangleScratch + ), !!defined(A)) { + I = Math.min( + 1, + (A.east - S.west) / S.width + ), g === y.x && (this.isBaseLayer() || Math.abs(A.east - S.east) < C) && (I = 1), M = L; + for (let w = _.y; w <= y.y; w++) { + if (R = M, E = D(g, w, h), A = Rectangle.simpleIntersection( + E, + s, + clippedRectangleScratch + ), !defined(A)) + continue; + M = Math.max( + 0, + (A.south - S.south) / S.height + ), w === y.y && (this.isBaseLayer() || Math.abs(A.south - S.south) < T) && (M = 0); + const O = new Cartesian4(P, M, I, R), N = this.getImageryFromCache(g, w, h); + i.imagery.splice( + n, + 0, + new TileImagery(N, O, o) + ), ++n; + } + } + return !0; +}; +ImageryLayer.prototype._calculateTextureTranslationAndScale = function(e, t) { + let n = t.readyImagery.rectangle, i = e.rectangle; + if (t.useWebMercatorT) { + const l = t.readyImagery.imageryLayer.imageryProvider.tilingScheme; + n = l.rectangleToNativeRectangle( + n, + imageryBoundsScratch + ), i = l.rectangleToNativeRectangle( + i, + terrainRectangleScratch + ); + } + const r = i.width, o = i.height, s = r / n.width, c = o / n.height; + return new Cartesian4( + s * (i.west - n.west) / r, + c * (i.south - n.south) / o, + s, + c + ); +}; +ImageryLayer.prototype._requestImagery = function(e) { + const t = this._imageryProvider, n = this; + function i(s) { + if (!defined(s)) + return r(); + e.image = s, e.state = ImageryState$1.RECEIVED, e.request = void 0, TileProviderError.reportSuccess(n._requestImageError); + } + function r(s) { + if (e.request.state === RequestState$1.CANCELLED) { + e.state = ImageryState$1.UNLOADED, e.request = void 0; + return; + } + e.state = ImageryState$1.FAILED, e.request = void 0; + const c = `Failed to obtain image tile X: ${e.x} Y: ${e.y} Level: ${e.level}.`; + n._requestImageError = TileProviderError.reportError( + n._requestImageError, + t, + t.errorEvent, + c, + e.x, + e.y, + e.level, + s + ), n._requestImageError.retry && o(); + } + function o() { + const s = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.IMAGERY + }); + e.request = s, e.state = ImageryState$1.TRANSITIONING; + const c = t.requestImage( + e.x, + e.y, + e.level, + s + ); + if (!defined(c)) { + e.state = ImageryState$1.UNLOADED, e.request = void 0; + return; + } + defined(t.getTileCredits) && (e.credits = t.getTileCredits( + e.x, + e.y, + e.level + )), c.then(function(l) { + i(l); + }).catch(function(l) { + r(l); + }); + } + o(); +}; +ImageryLayer.prototype._createTextureWebGL = function(e, t) { + const n = new Sampler({ + minificationFilter: this.minificationFilter, + magnificationFilter: this.magnificationFilter + }), i = t.image; + return defined(i.internalFormat) ? new Texture({ + context: e, + pixelFormat: i.internalFormat, + width: i.width, + height: i.height, + source: { + arrayBufferView: i.bufferView + }, + sampler: n + }) : new Texture({ + context: e, + source: i, + pixelFormat: this._imageryProvider.hasAlphaChannel ? PixelFormat$1.RGBA : PixelFormat$1.RGB, + sampler: n + }); +}; +ImageryLayer.prototype._createTexture = function(e, t) { + const n = this._imageryProvider, i = t.image; + if (defined(n.tileDiscardPolicy)) { + const o = n.tileDiscardPolicy; + if (defined(o)) { + if (!o.isReady()) { + t.state = ImageryState$1.RECEIVED; + return; + } + if (o.shouldDiscardImage(i)) { + t.state = ImageryState$1.INVALID; + return; + } + } + } + const r = this._createTextureWebGL(e, t); + n.tilingScheme.projection instanceof WebMercatorProjection ? t.textureWebMercator = r : t.texture = r, t.image = void 0, t.state = ImageryState$1.TEXTURE_LOADED; +}; +function getSamplerKey(e, t, n) { + return `${e}:${t}:${n}`; +} +ImageryLayer.prototype._finalizeReprojectTexture = function(e, t) { + let n = this.minificationFilter; + const i = this.magnificationFilter; + if (n === TextureMinificationFilter$1.LINEAR && i === TextureMagnificationFilter$1.LINEAR && !PixelFormat$1.isCompressedFormat(t.pixelFormat) && CesiumMath.isPowerOfTwo(t.width) && CesiumMath.isPowerOfTwo(t.height)) { + n = TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR; + const o = ContextLimits.maximumTextureFilterAnisotropy, s = Math.min( + o, + defaultValue(this._maximumAnisotropy, o) + ), c = getSamplerKey( + n, + i, + s + ); + let l = e.cache.imageryLayerMipmapSamplers; + defined(l) || (l = {}, e.cache.imageryLayerMipmapSamplers = l); + let d = l[c]; + defined(d) || (d = l[c] = new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: n, + magnificationFilter: i, + maximumAnisotropy: s + })), t.generateMipmap(MipmapHint$1.NICEST), t.sampler = d; + } else { + const o = getSamplerKey( + n, + i, + 0 + ); + let s = e.cache.imageryLayerNonMipmapSamplers; + defined(s) || (s = {}, e.cache.imageryLayerNonMipmapSamplers = s); + let c = s[o]; + defined(c) || (c = s[o] = new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: n, + magnificationFilter: i + })), t.sampler = c; + } +}; +ImageryLayer.prototype._reprojectTexture = function(e, t, n) { + const i = t.textureWebMercator || t.texture, r = t.rectangle, o = e.context; + if (n = defaultValue(n, !0), n && !(this._imageryProvider.tilingScheme.projection instanceof GeographicProjection) && r.width / i.width > 1e-5) { + const s = this; + t.addReference(); + const c = new ComputeCommand({ + persists: !0, + owner: this, + // Update render resources right before execution instead of now. + // This allows different ImageryLayers to share the same vao and buffers. + preExecute: function(l) { + reprojectToGeographic(l, o, i, t.rectangle); + }, + postExecute: function(l) { + t.texture = l, s._finalizeReprojectTexture(o, l), t.state = ImageryState$1.READY, t.releaseReference(); + }, + canceled: function() { + t.state = ImageryState$1.TEXTURE_LOADED, t.releaseReference(); + } + }); + this._reprojectComputeCommands.push(c); + } else + n && (t.texture = i), this._finalizeReprojectTexture(o, i), t.state = ImageryState$1.READY; +}; +ImageryLayer.prototype.queueReprojectionCommands = function(e) { + const t = this._reprojectComputeCommands, n = t.length; + for (let i = 0; i < n; ++i) + e.commandList.push(t[i]); + t.length = 0; +}; +ImageryLayer.prototype.cancelReprojections = function() { + this._reprojectComputeCommands.forEach(function(e) { + defined(e.canceled) && e.canceled(); + }), this._reprojectComputeCommands.length = 0; +}; +ImageryLayer.prototype.getImageryFromCache = function(e, t, n, i) { + const r = getImageryCacheKey(e, t, n); + let o = this._imageryCache[r]; + return defined(o) || (o = new Imagery(this, e, t, n, i), this._imageryCache[r] = o), o.addReference(), o; +}; +ImageryLayer.prototype.removeImageryFromCache = function(e) { + const t = getImageryCacheKey(e.x, e.y, e.level); + delete this._imageryCache[t]; +}; +function getImageryCacheKey(e, t, n) { + return JSON.stringify([e, t, n]); +} +const uniformMap = { + u_textureDimensions: function() { + return this.textureDimensions; + }, + u_texture: function() { + return this.texture; + }, + textureDimensions: new Cartesian2(), + texture: void 0 +}, float32ArrayScratch = FeatureDetection.supportsTypedArrays() ? new Float32Array(2 * 64) : void 0; +function reprojectToGeographic(e, t, n, i) { + let r = t.cache.imageryLayer_reproject; + if (!defined(r)) { + r = t.cache.imageryLayer_reproject = { + vertexArray: void 0, + shaderProgram: void 0, + sampler: void 0, + destroy: function() { + defined(this.framebuffer) && this.framebuffer.destroy(), defined(this.vertexArray) && this.vertexArray.destroy(), defined(this.shaderProgram) && this.shaderProgram.destroy(); + } + }; + const C = new Float32Array(2 * 64 * 2); + let T = 0; + for (let A = 0; A < 64; ++A) { + const D = A / 63; + C[T++] = 0, C[T++] = D, C[T++] = 1, C[T++] = D; + } + const x = { + position: 0, + webMercatorT: 1 + }, b = TerrainProvider.getRegularGridIndices(2, 64), S = Buffer.createIndexBuffer({ + context: t, + typedArray: b, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }); + r.vertexArray = new VertexArray({ + context: t, + attributes: [ + { + index: x.position, + vertexBuffer: Buffer.createVertexBuffer({ + context: t, + typedArray: C, + usage: BufferUsage$1.STATIC_DRAW + }), + componentsPerAttribute: 2 + }, + { + index: x.webMercatorT, + vertexBuffer: Buffer.createVertexBuffer({ + context: t, + sizeInBytes: 64 * 2 * 4, + usage: BufferUsage$1.STREAM_DRAW + }), + componentsPerAttribute: 1 + } + ], + indexBuffer: S + }); + const E = new ShaderSource({ + sources: [ReprojectWebMercatorVS] + }); + r.shaderProgram = ShaderProgram.fromCache({ + context: t, + vertexShaderSource: E, + fragmentShaderSource: ReprojectWebMercatorFS, + attributeLocations: x + }), r.sampler = new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }); + } + n.sampler = r.sampler; + const o = n.width, s = n.height; + uniformMap.textureDimensions.x = o, uniformMap.textureDimensions.y = s, uniformMap.texture = n; + let c = Math.sin(i.south); + const l = 0.5 * Math.log((1 + c) / (1 - c)); + c = Math.sin(i.north); + const f = 1 / (0.5 * Math.log((1 + c) / (1 - c)) - l), h = new Texture({ + context: t, + width: o, + height: s, + pixelFormat: n.pixelFormat, + pixelDatatype: n.pixelDatatype, + preMultiplyAlpha: n.preMultiplyAlpha + }); + CesiumMath.isPowerOfTwo(o) && CesiumMath.isPowerOfTwo(s) && h.generateMipmap(MipmapHint$1.NICEST); + const p = i.south, m = i.north, _ = float32ArrayScratch; + let y = 0; + for (let C = 0; C < 64; ++C) { + const T = C / 63, x = CesiumMath.lerp(p, m, T); + c = Math.sin(x); + const S = (0.5 * Math.log((1 + c) / (1 - c)) - l) * f; + _[y++] = S, _[y++] = S; + } + r.vertexArray.getAttribute(1).vertexBuffer.copyFromArrayView(_), e.shaderProgram = r.shaderProgram, e.outputTexture = h, e.uniformMap = uniformMap, e.vertexArray = r.vertexArray; +} +function getLevelWithMaximumTexelSpacing(e, t, n) { + const i = e._imageryProvider, r = i.tilingScheme, o = r.ellipsoid, s = e._imageryProvider.tilingScheme.projection instanceof GeographicProjection ? 1 : Math.cos(n), c = r.rectangle, d = o.maximumRadius * c.width * s / (i.tileWidth * r.getNumberOfXTilesAtLevel(0)) / t, f = Math.log(d) / Math.log(2); + return Math.round(f) | 0; +} +function handleError$1(e, t) { + e.numberOfListeners > 0 ? e.raiseEvent(t) : console.error(t); +} +async function handlePromise$1(e, t) { + let n; + try { + if (n = await Promise.resolve(t), e.isDestroyed()) + return; + e._imageryProvider = n, e._readyEvent.raiseEvent(n); + } catch (i) { + handleError$1(e._errorEvent, i); + } +} +const TileEdge = { + WEST: 0, + NORTH: 1, + EAST: 2, + SOUTH: 3, + NORTHWEST: 4, + NORTHEAST: 5, + SOUTHWEST: 6, + SOUTHEAST: 7 +}, TileSelectionResult = { + /** + * There was no selection result, perhaps because the tile wasn't visited + * last frame. + */ + NONE: 0, + /** + * This tile was deemed not visible and culled. + */ + CULLED: 1, + /** + * The tile was selected for rendering. + */ + RENDERED: 2, + /** + * This tile did not meet the required screen-space error and was refined. + */ + REFINED: 3, + /** + * This tile was originally rendered, but it got kicked out of the render list + * in favor of an ancestor because it is not yet renderable. + */ + RENDERED_AND_KICKED: 6, + /** + * This tile was originally refined, but its rendered descendants got kicked out of the + * render list in favor of an ancestor because it is not yet renderable. + */ + REFINED_AND_KICKED: 7, + /** + * This tile was culled because it was not visible, but it still needs to be loaded + * and any heights on it need to be updated because the camera's position or the + * camera's reference frame's origin falls inside this tile. Loading this tile + * could affect the position of the camera if the camera is currently below + * terrain or if it is tracking an object whose height is referenced to terrain. + * And a change in the camera position may, in turn, affect what is culled. + */ + CULLED_BUT_NEEDED: 9, + /** + * Determines if a selection result indicates that this tile or its descendants were + * kicked from the render list. In other words, if it is <code>RENDERED_AND_KICKED</code> + * or <code>REFINED_AND_KICKED</code>. + * + * @param {TileSelectionResult} value The selection result to test. + * @returns {boolean} true if the tile was kicked, no matter if it was originally rendered or refined. + */ + wasKicked: function(e) { + return e >= TileSelectionResult.RENDERED_AND_KICKED; + }, + /** + * Determines the original selection result prior to being kicked or CULLED_BUT_NEEDED. + * If the tile wasn't kicked or CULLED_BUT_NEEDED, the original value is returned. + * @param {TileSelectionResult} value The selection result. + * @returns {TileSelectionResult} The original selection result prior to kicking. + */ + originalResult: function(e) { + return e & 3; + }, + /** + * Converts this selection result to a kick. + * @param {TileSelectionResult} value The original selection result. + * @returns {TileSelectionResult} The kicked form of the selection result. + */ + kick: function(e) { + return e | 4; + } +}; +function TerrainFillMesh(e) { + this.tile = e, this.frameLastUpdated = void 0, this.westMeshes = [], this.westTiles = [], this.southMeshes = [], this.southTiles = [], this.eastMeshes = [], this.eastTiles = [], this.northMeshes = [], this.northTiles = [], this.southwestMesh = void 0, this.southwestTile = void 0, this.southeastMesh = void 0, this.southeastTile = void 0, this.northwestMesh = void 0, this.northwestTile = void 0, this.northeastMesh = void 0, this.northeastTile = void 0, this.changedThisFrame = !0, this.visitedFrame = void 0, this.enqueuedFrame = void 0, this.mesh = void 0, this.vertexArray = void 0, this.waterMaskTexture = void 0, this.waterMaskTranslationAndScale = new Cartesian4(); +} +TerrainFillMesh.prototype.update = function(e, t, n) { + this.changedThisFrame && (createFillMesh(e, t, this.tile, n), this.changedThisFrame = !1); +}; +TerrainFillMesh.prototype.destroy = function(e) { + this._destroyVertexArray(e), defined(this.waterMaskTexture) && (--this.waterMaskTexture.referenceCount, this.waterMaskTexture.referenceCount === 0 && this.waterMaskTexture.destroy(), this.waterMaskTexture = void 0); +}; +TerrainFillMesh.prototype._destroyVertexArray = function(e) { + defined(this.vertexArray) && (defined(e) ? e.push(this.vertexArray) : GlobeSurfaceTile._freeVertexArray(this.vertexArray), this.vertexArray = void 0); +}; +const traversalQueueScratch = new Queue(); +TerrainFillMesh.updateFillTiles = function(e, t, n, i) { + const r = e._quadtree, o = r._levelZeroTiles, s = r._lastSelectionFrameNumber, c = traversalQueueScratch; + c.clear(); + for (let d = 0; d < t.length; ++d) { + const f = t[d]; + defined(f.data.vertexArray) && c.enqueue(t[d]); + } + let l = c.dequeue(); + for (; l !== void 0; ) { + const d = l.findTileToWest(o), f = l.findTileToSouth(o), h = l.findTileToEast(o), p = l.findTileToNorth(o); + visitRenderedTiles( + e, + n, + l, + d, + s, + TileEdge.EAST, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + f, + s, + TileEdge.NORTH, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + h, + s, + TileEdge.WEST, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + p, + s, + TileEdge.SOUTH, + !1, + c, + i + ); + const m = d.findTileToNorth(o), _ = d.findTileToSouth(o), y = h.findTileToNorth(o), C = h.findTileToSouth(o); + visitRenderedTiles( + e, + n, + l, + m, + s, + TileEdge.SOUTHEAST, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + y, + s, + TileEdge.SOUTHWEST, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + _, + s, + TileEdge.NORTHEAST, + !1, + c, + i + ), visitRenderedTiles( + e, + n, + l, + C, + s, + TileEdge.NORTHWEST, + !1, + c, + i + ), l = c.dequeue(); + } +}; +function visitRenderedTiles(e, t, n, i, r, o, s, c, l) { + if (i === void 0) + return; + let d = i; + for (; d && (d._lastSelectionResultFrame !== r || TileSelectionResult.wasKicked(d._lastSelectionResult) || TileSelectionResult.originalResult(d._lastSelectionResult) === TileSelectionResult.CULLED); ) { + if (s) + return; + const f = d.parent; + if (o >= TileEdge.NORTHWEST && f !== void 0) + switch (o) { + case TileEdge.NORTHWEST: + d = d === f.northwestChild ? f : void 0; + break; + case TileEdge.NORTHEAST: + d = d === f.northeastChild ? f : void 0; + break; + case TileEdge.SOUTHWEST: + d = d === f.southwestChild ? f : void 0; + break; + case TileEdge.SOUTHEAST: + d = d === f.southeastChild ? f : void 0; + break; + } + else + d = f; + } + if (d !== void 0) { + if (d._lastSelectionResult === TileSelectionResult.RENDERED) { + if (defined(d.data.vertexArray)) + return; + visitTile$1( + e, + t, + n, + d, + o, + r, + c, + l + ); + return; + } + if (TileSelectionResult.originalResult(i._lastSelectionResult) !== TileSelectionResult.CULLED) + switch (o) { + case TileEdge.WEST: + visitRenderedTiles( + e, + t, + n, + i.northwestChild, + r, + o, + !0, + c, + l + ), visitRenderedTiles( + e, + t, + n, + i.southwestChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.EAST: + visitRenderedTiles( + e, + t, + n, + i.southeastChild, + r, + o, + !0, + c, + l + ), visitRenderedTiles( + e, + t, + n, + i.northeastChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.SOUTH: + visitRenderedTiles( + e, + t, + n, + i.southwestChild, + r, + o, + !0, + c, + l + ), visitRenderedTiles( + e, + t, + n, + i.southeastChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.NORTH: + visitRenderedTiles( + e, + t, + n, + i.northeastChild, + r, + o, + !0, + c, + l + ), visitRenderedTiles( + e, + t, + n, + i.northwestChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.NORTHWEST: + visitRenderedTiles( + e, + t, + n, + i.northwestChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.NORTHEAST: + visitRenderedTiles( + e, + t, + n, + i.northeastChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.SOUTHWEST: + visitRenderedTiles( + e, + t, + n, + i.southwestChild, + r, + o, + !0, + c, + l + ); + break; + case TileEdge.SOUTHEAST: + visitRenderedTiles( + e, + t, + n, + i.southeastChild, + r, + o, + !0, + c, + l + ); + break; + default: + throw new DeveloperError("Invalid edge"); + } + } +} +function visitTile$1(e, t, n, i, r, o, s, c) { + const l = i.data; + if (l.fill === void 0) + l.fill = new TerrainFillMesh(i); + else if (l.fill.visitedFrame === o) + return; + l.fill.enqueuedFrame !== o && (l.fill.enqueuedFrame = o, l.fill.changedThisFrame = !1, s.enqueue(i)), propagateEdge( + e, + t, + n, + i, + r, + c + ); +} +function propagateEdge(e, t, n, i, r, o) { + const s = i.data.fill; + let c; + const l = n.data.fill; + defined(l) ? (l.visitedFrame = t.frameNumber, l.changedThisFrame && (createFillMesh( + e, + t, + n, + o + ), l.changedThisFrame = !1), c = n.data.fill.mesh) : c = n.data.mesh; + let d, f; + switch (r) { + case TileEdge.WEST: + d = s.westMeshes, f = s.westTiles; + break; + case TileEdge.SOUTH: + d = s.southMeshes, f = s.southTiles; + break; + case TileEdge.EAST: + d = s.eastMeshes, f = s.eastTiles; + break; + case TileEdge.NORTH: + d = s.northMeshes, f = s.northTiles; + break; + case TileEdge.NORTHWEST: + s.changedThisFrame = s.changedThisFrame || s.northwestMesh !== c, s.northwestMesh = c, s.northwestTile = n; + return; + case TileEdge.NORTHEAST: + s.changedThisFrame = s.changedThisFrame || s.northeastMesh !== c, s.northeastMesh = c, s.northeastTile = n; + return; + case TileEdge.SOUTHWEST: + s.changedThisFrame = s.changedThisFrame || s.southwestMesh !== c, s.southwestMesh = c, s.southwestTile = n; + return; + case TileEdge.SOUTHEAST: + s.changedThisFrame = s.changedThisFrame || s.southeastMesh !== c, s.southeastMesh = c, s.southeastTile = n; + return; + } + if (n.level <= i.level) { + s.changedThisFrame = s.changedThisFrame || d[0] !== c || d.length !== 1, d[0] = c, f[0] = n, d.length = 1, f.length = 1; + return; + } + let h, p, m, _; + const y = n.rectangle; + let C; + const T = i.rectangle; + switch (r) { + case TileEdge.WEST: + for (C = (T.north - T.south) * CesiumMath.EPSILON5, h = 0; h < f.length && (m = f[h], _ = m.rectangle, !CesiumMath.greaterThan( + y.north, + _.south, + C + )); ++h) + ; + for (p = h; p < f.length && (m = f[p], _ = m.rectangle, !CesiumMath.greaterThanOrEquals( + y.south, + _.north, + C + )); ++p) + ; + break; + case TileEdge.SOUTH: + for (C = (T.east - T.west) * CesiumMath.EPSILON5, h = 0; h < f.length && (m = f[h], _ = m.rectangle, !CesiumMath.lessThan( + y.west, + _.east, + C + )); ++h) + ; + for (p = h; p < f.length && (m = f[p], _ = m.rectangle, !CesiumMath.lessThanOrEquals( + y.east, + _.west, + C + )); ++p) + ; + break; + case TileEdge.EAST: + for (C = (T.north - T.south) * CesiumMath.EPSILON5, h = 0; h < f.length && (m = f[h], _ = m.rectangle, !CesiumMath.lessThan( + y.south, + _.north, + C + )); ++h) + ; + for (p = h; p < f.length && (m = f[p], _ = m.rectangle, !CesiumMath.lessThanOrEquals( + y.north, + _.south, + C + )); ++p) + ; + break; + case TileEdge.NORTH: + for (C = (T.east - T.west) * CesiumMath.EPSILON5, h = 0; h < f.length && (m = f[h], _ = m.rectangle, !CesiumMath.greaterThan( + y.east, + _.west, + C + )); ++h) + ; + for (p = h; p < f.length && (m = f[p], _ = m.rectangle, !CesiumMath.greaterThanOrEquals( + y.west, + _.east, + C + )); ++p) + ; + break; + } + p - h === 1 ? (s.changedThisFrame = s.changedThisFrame || d[h] !== c, d[h] = c, f[h] = n) : (s.changedThisFrame = !0, d.splice(h, p - h, c), f.splice(h, p - h, n)); +} +const cartographicScratch$1 = new Cartographic(), centerCartographicScratch = new Cartographic(), cartesianScratch = new Cartesian3(), normalScratch$1 = new Cartesian3(), octEncodedNormalScratch = new Cartesian2(), uvScratch2 = new Cartesian2(), uvScratch = new Cartesian2(); +function HeightAndNormal() { + this.height = 0, this.encodedNormal = new Cartesian2(); +} +function fillMissingCorner(e, t, n, i, r, o, s, c, l) { + if (defined(r)) + return r; + let d; + if (defined(o) && defined(s)) + d = (o.height + s.height) * 0.5; + else if (defined(o)) + d = o.height; + else if (defined(s)) + d = s.height; + else if (defined(c)) + d = c.height; + else { + const h = e.tile.data.tileBoundingRegion; + let p = 0, m = 0; + defined(h) && (p = h.minimumHeight, m = h.maximumHeight), d = (p + m) * 0.5; + } + return getVertexWithHeightAtCorner(e, t, n, i, d, l), l; +} +const heightRangeScratch = { + minimumHeight: 0, + maximumHeight: 0 +}, scratchCenter$3 = new Cartesian3(), swVertexScratch = new HeightAndNormal(), seVertexScratch = new HeightAndNormal(), nwVertexScratch = new HeightAndNormal(), neVertexScratch = new HeightAndNormal(), heightmapBuffer = typeof Uint8Array < "u" ? new Uint8Array(9 * 9) : void 0, scratchCreateMeshSyncOptions = { + tilingScheme: void 0, + x: 0, + y: 0, + level: 0, + exaggeration: 1, + exaggerationRelativeHeight: 0 +}; +function createFillMesh(e, t, n, i) { + GlobeSurfaceTile.initialize( + n, + e.terrainProvider, + e._imageryLayers + ); + const r = n.data, o = r.fill, s = n.rectangle, c = t.verticalExaggeration, l = t.verticalExaggerationRelativeHeight, d = c !== 1, f = n.tilingScheme.ellipsoid; + let h = getCorner( + o, + f, + 0, + 1, + o.northwestTile, + o.northwestMesh, + o.northTiles, + o.northMeshes, + o.westTiles, + o.westMeshes, + nwVertexScratch + ), p = getCorner( + o, + f, + 0, + 0, + o.southwestTile, + o.southwestMesh, + o.westTiles, + o.westMeshes, + o.southTiles, + o.southMeshes, + swVertexScratch + ), m = getCorner( + o, + f, + 1, + 0, + o.southeastTile, + o.southeastMesh, + o.southTiles, + o.southMeshes, + o.eastTiles, + o.eastMeshes, + seVertexScratch + ), _ = getCorner( + o, + f, + 1, + 1, + o.northeastTile, + o.northeastMesh, + o.eastTiles, + o.eastMeshes, + o.northTiles, + o.northMeshes, + neVertexScratch + ); + h = fillMissingCorner( + o, + f, + 0, + 1, + h, + p, + _, + m, + nwVertexScratch + ), p = fillMissingCorner( + o, + f, + 0, + 0, + p, + h, + m, + _, + swVertexScratch + ), m = fillMissingCorner( + o, + f, + 1, + 1, + m, + p, + _, + h, + seVertexScratch + ), _ = fillMissingCorner( + o, + f, + 1, + 1, + _, + m, + h, + p, + neVertexScratch + ); + const y = p.height, C = m.height, T = h.height, x = _.height; + let b = Math.min( + y, + C, + T, + x + ), S = Math.max( + y, + C, + T, + x + ); + const E = (b + S) * 0.5; + let A, D; + const P = e.getLevelMaximumGeometricError(n.level), I = f.maximumRadius - P; + let M = Math.acos(I / f.maximumRadius) * 4; + if (M *= 1.5, s.width > M && S - b <= P) { + const g = new HeightmapTerrainData({ + width: 9, + height: 9, + buffer: heightmapBuffer, + structure: { + // Use the maximum as the constant height so that this tile's skirt + // covers any cracks with adjacent tiles. + heightOffset: S + } + }), w = scratchCreateMeshSyncOptions; + w.tilingScheme = n.tilingScheme, w.x = n.x, w.y = n.y, w.level = n.level, w.exaggeration = c, w.exaggerationRelativeHeight = l, o.mesh = g._createMeshSync(w); + } else { + const g = d, w = Rectangle.center( + s, + centerCartographicScratch + ); + w.height = E; + const O = f.cartographicToCartesian( + w, + scratchCenter$3 + ), N = new TerrainEncoding( + O, + void 0, + void 0, + void 0, + void 0, + !0, + !0, + g, + c, + l + ); + let F = 5, B; + for (B = o.westMeshes, A = 0, D = B.length; A < D; ++A) + F += B[A].eastIndicesNorthToSouth.length; + for (B = o.southMeshes, A = 0, D = B.length; A < D; ++A) + F += B[A].northIndicesWestToEast.length; + for (B = o.eastMeshes, A = 0, D = B.length; A < D; ++A) + F += B[A].westIndicesSouthToNorth.length; + for (B = o.northMeshes, A = 0, D = B.length; A < D; ++A) + F += B[A].southIndicesEastToWest.length; + const V = heightRangeScratch; + V.minimumHeight = b, V.maximumHeight = S; + const U = N.stride; + let k = new Float32Array(F * U), $ = 0; + const G = $; + $ = addVertexWithComputedPosition( + f, + s, + N, + k, + $, + 0, + 1, + h.height, + h.encodedNormal, + 1, + V + ), $ = addEdge( + o, + f, + N, + k, + $, + o.westTiles, + o.westMeshes, + TileEdge.EAST, + V + ); + const q = $; + $ = addVertexWithComputedPosition( + f, + s, + N, + k, + $, + 0, + 0, + p.height, + p.encodedNormal, + 0, + V + ), $ = addEdge( + o, + f, + N, + k, + $, + o.southTiles, + o.southMeshes, + TileEdge.NORTH, + V + ); + const z = $; + $ = addVertexWithComputedPosition( + f, + s, + N, + k, + $, + 1, + 0, + m.height, + m.encodedNormal, + 0, + V + ), $ = addEdge( + o, + f, + N, + k, + $, + o.eastTiles, + o.eastMeshes, + TileEdge.WEST, + V + ); + const H = $; + $ = addVertexWithComputedPosition( + f, + s, + N, + k, + $, + 1, + 1, + _.height, + _.encodedNormal, + 1, + V + ), $ = addEdge( + o, + f, + N, + k, + $, + o.northTiles, + o.northMeshes, + TileEdge.SOUTH, + V + ), b = V.minimumHeight, S = V.maximumHeight; + const Q = OrientedBoundingBox.fromRectangle( + s, + b, + S, + n.tilingScheme.ellipsoid + ), ne = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + s.south + ), K = 1 / (WebMercatorProjection.geodeticLatitudeToMercatorAngle(s.north) - ne), Z = (WebMercatorProjection.geodeticLatitudeToMercatorAngle( + w.latitude + ) - ne) * K, ee = f.geodeticSurfaceNormalCartographic( + cartographicScratch$1, + normalScratch$1 + ), oe = AttributeCompression.octEncode( + ee, + octEncodedNormalScratch + ), X = $; + N.encode( + k, + $ * U, + Q.center, + Cartesian2.fromElements(0.5, 0.5, uvScratch), + E, + oe, + Z, + ee + ), ++$; + const fe = $, de = fe < 256 ? 1 : 2, ce = (fe - 1) * 3, ye = ce * de, ge = (k.length - fe * U) * Float32Array.BYTES_PER_ELEMENT; + let re; + if (ge >= ye) { + const j = fe * U * Float32Array.BYTES_PER_ELEMENT; + re = fe < 256 ? new Uint8Array(k.buffer, j, ce) : new Uint16Array(k.buffer, j, ce); + } else + re = fe < 256 ? new Uint8Array(ce) : new Uint16Array(ce); + k = new Float32Array(k.buffer, 0, fe * U); + let be = 0; + for (A = 0; A < fe - 2; ++A) + re[be++] = X, re[be++] = A, re[be++] = A + 1; + re[be++] = X, re[be++] = A, re[be++] = 0; + const pe = []; + for (A = q; A >= G; --A) + pe.push(A); + const Te = []; + for (A = z; A >= q; --A) + Te.push(A); + const xe = []; + for (A = H; A >= z; --A) + xe.push(A); + const W = []; + for (W.push(0), A = X - 1; A >= H; --A) + W.push(A); + o.mesh = new TerrainMesh( + N.center, + k, + re, + ce, + fe, + b, + S, + BoundingSphere.fromOrientedBoundingBox(Q), + computeOccludeePoint$1( + e, + Q.center, + s, + b, + S + ), + N.stride, + Q, + N, + pe, + Te, + xe, + W + ); + } + const R = t.context; + o._destroyVertexArray(i), o.vertexArray = GlobeSurfaceTile._createVertexArrayForMesh( + R, + o.mesh + ), r.processImagery( + n, + e.terrainProvider, + t, + !0 + ); + const L = o.waterMaskTexture; + if (o.waterMaskTexture = void 0, e.terrainProvider.hasWaterMask) { + const g = r._findAncestorTileWithTerrainData(n); + defined(g) && defined(g.data.waterMaskTexture) && (o.waterMaskTexture = g.data.waterMaskTexture, ++o.waterMaskTexture.referenceCount, r._computeWaterMaskTranslationAndScale( + n, + g, + o.waterMaskTranslationAndScale + )); + } + defined(L) && (--L.referenceCount, L.referenceCount === 0 && L.destroy()); +} +function addVertexWithComputedPosition(e, t, n, i, r, o, s, c, l, d, f) { + const h = cartographicScratch$1; + h.longitude = CesiumMath.lerp(t.west, t.east, o), h.latitude = CesiumMath.lerp(t.south, t.north, s), h.height = c; + const p = e.cartographicToCartesian( + h, + cartesianScratch + ); + let m; + n.hasGeodeticSurfaceNormals && (m = e.geodeticSurfaceNormal( + p, + normalScratch$1 + )); + const _ = uvScratch2; + return _.x = o, _.y = s, n.encode( + i, + r * n.stride, + p, + _, + c, + l, + d, + m + ), f.minimumHeight = Math.min(f.minimumHeight, c), f.maximumHeight = Math.max(f.maximumHeight, c), r + 1; +} +const sourceRectangleScratch = new Rectangle(); +function transformTextureCoordinates(e, t, n, i) { + let r = e.rectangle; + const o = t.rectangle; + t.x === 0 && n.x === 1 && e.x === e.tilingScheme.getNumberOfXTilesAtLevel(e.level) - 1 ? (r = Rectangle.clone( + e.rectangle, + sourceRectangleScratch + ), r.west -= CesiumMath.TWO_PI, r.east -= CesiumMath.TWO_PI) : e.x === 0 && n.x === 0 && t.x === t.tilingScheme.getNumberOfXTilesAtLevel(t.level) - 1 && (r = Rectangle.clone( + e.rectangle, + sourceRectangleScratch + ), r.west += CesiumMath.TWO_PI, r.east += CesiumMath.TWO_PI); + const s = r.east - r.west, c = (o.west - r.west) / s, l = (o.east - r.west) / s, d = r.north - r.south, f = (o.south - r.south) / d, h = (o.north - r.south) / d; + let p = (n.x - c) / (l - c), m = (n.y - f) / (h - f); + return Math.abs(p) < Math.EPSILON5 ? p = 0 : Math.abs(p - 1) < Math.EPSILON5 && (p = 1), Math.abs(m) < Math.EPSILON5 ? m = 0 : Math.abs(m - 1) < Math.EPSILON5 && (m = 1), i.x = p, i.y = m, i; +} +const encodedNormalScratch = new Cartesian2(); +function getVertexFromTileAtCorner(e, t, n, i, r) { + const o = e.encoding, s = e.vertices; + if (r.height = o.decodeHeight(s, t), o.hasVertexNormals) + o.getOctEncodedNormal( + s, + t, + r.encodedNormal + ); + else { + const c = r.encodedNormal; + c.x = 0, c.y = 0; + } +} +const encodedNormalScratch2 = new Cartesian2(), cartesianScratch2 = new Cartesian3(); +function getInterpolatedVertexAtCorner(e, t, n, i, r, o, s, c, l, d) { + const f = i.encoding, h = i.vertices, p = transformTextureCoordinates( + t, + n, + f.decodeTextureCoordinates( + h, + r, + uvScratch + ), + uvScratch + ), m = transformTextureCoordinates( + t, + n, + f.decodeTextureCoordinates( + h, + o, + uvScratch2 + ), + uvScratch2 + ); + let _; + l ? _ = (s - p.x) / (m.x - p.x) : _ = (c - p.y) / (m.y - p.y); + const y = f.decodeHeight(h, r), C = f.decodeHeight(h, o), T = n.rectangle; + cartographicScratch$1.longitude = CesiumMath.lerp( + T.west, + T.east, + s + ), cartographicScratch$1.latitude = CesiumMath.lerp( + T.south, + T.north, + c + ), d.height = cartographicScratch$1.height = CesiumMath.lerp( + y, + C, + _ + ); + let x; + if (f.hasVertexNormals) { + const b = f.getOctEncodedNormal( + h, + r, + encodedNormalScratch + ), S = f.getOctEncodedNormal( + h, + o, + encodedNormalScratch2 + ), E = AttributeCompression.octDecode( + b.x, + b.y, + cartesianScratch + ), A = AttributeCompression.octDecode( + S.x, + S.y, + cartesianScratch2 + ); + x = Cartesian3.lerp(E, A, _, cartesianScratch), Cartesian3.normalize(x, x), AttributeCompression.octEncode(x, d.encodedNormal); + } else + x = e.geodeticSurfaceNormalCartographic( + cartographicScratch$1, + cartesianScratch + ), AttributeCompression.octEncode(x, d.encodedNormal); +} +function getVertexWithHeightAtCorner(e, t, n, i, r, o) { + o.height = r; + const s = t.geodeticSurfaceNormalCartographic( + cartographicScratch$1, + cartesianScratch + ); + AttributeCompression.octEncode(s, o.encodedNormal); +} +function getCorner(e, t, n, i, r, o, s, c, l, d, f) { + if (getCornerFromEdge( + e, + t, + c, + s, + !1, + n, + i, + f + ) || getCornerFromEdge( + e, + t, + d, + l, + !0, + n, + i, + f + )) + return f; + let p; + if (meshIsUsable(r, o)) + return n === 0 ? i === 0 ? p = o.eastIndicesNorthToSouth[0] : p = o.southIndicesEastToWest[0] : i === 0 ? p = o.northIndicesWestToEast[0] : p = o.westIndicesSouthToNorth[0], getVertexFromTileAtCorner(o, p, n, i, f), f; + let m; + if (n === 0 ? i === 0 ? m = getClosestHeightToCorner( + e.westMeshes, + e.westTiles, + TileEdge.EAST, + e.southMeshes, + e.southTiles, + TileEdge.NORTH + ) : m = getClosestHeightToCorner( + e.northMeshes, + e.northTiles, + TileEdge.SOUTH, + e.westMeshes, + e.westTiles, + TileEdge.EAST + ) : i === 0 ? m = getClosestHeightToCorner( + e.southMeshes, + e.southTiles, + TileEdge.NORTH, + e.eastMeshes, + e.eastTiles, + TileEdge.WEST + ) : m = getClosestHeightToCorner( + e.eastMeshes, + e.eastTiles, + TileEdge.WEST, + e.northMeshes, + e.northTiles, + TileEdge.SOUTH + ), defined(m)) + return getVertexWithHeightAtCorner( + e, + t, + n, + i, + m, + f + ), f; +} +function getClosestHeightToCorner(e, t, n, i, r, o, s, c) { + const l = getNearestHeightOnEdge( + e, + t, + !1, + n + ), d = getNearestHeightOnEdge( + i, + r, + !0, + o + ); + return defined(l) && defined(d) ? (l + d) * 0.5 : defined(l) ? l : d; +} +function addEdge(e, t, n, i, r, o, s, c, l) { + for (let d = 0; d < o.length; ++d) + r = addEdgeMesh( + e, + t, + n, + i, + r, + o[d], + s[d], + c, + l + ); + return r; +} +function addEdgeMesh(e, t, n, i, r, o, s, c, l) { + let d = o.rectangle; + c === TileEdge.EAST && e.tile.x === 0 ? (d = Rectangle.clone( + o.rectangle, + sourceRectangleScratch + ), d.west -= CesiumMath.TWO_PI, d.east -= CesiumMath.TWO_PI) : c === TileEdge.WEST && o.x === 0 && (d = Rectangle.clone( + o.rectangle, + sourceRectangleScratch + ), d.west += CesiumMath.TWO_PI, d.east += CesiumMath.TWO_PI); + const f = e.tile.rectangle; + let h, p; + r > 0 && (n.decodeTextureCoordinates(i, r - 1, uvScratch), h = uvScratch.x, p = uvScratch.y); + let m, _; + switch (c) { + case TileEdge.WEST: + m = s.westIndicesSouthToNorth, _ = !1; + break; + case TileEdge.NORTH: + m = s.northIndicesWestToEast, _ = !0; + break; + case TileEdge.EAST: + m = s.eastIndicesNorthToSouth, _ = !1; + break; + case TileEdge.SOUTH: + m = s.southIndicesEastToWest, _ = !0; + break; + } + const y = o, C = e.tile, T = s.encoding, x = s.vertices, b = n.stride; + let S, E; + T.hasWebMercatorT && (S = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + f.south + ), E = 1 / (WebMercatorProjection.geodeticLatitudeToMercatorAngle( + f.north + ) - S)); + for (let A = 0; A < m.length; ++A) { + const D = m[A], P = T.decodeTextureCoordinates( + x, + D, + uvScratch + ); + transformTextureCoordinates(y, C, P, P); + const I = P.x, M = P.y, R = _ ? I : M; + if (R < 0 || R > 1 || Math.abs(I - h) < CesiumMath.EPSILON5 && Math.abs(M - p) < CesiumMath.EPSILON5) + continue; + const L = Math.abs(I) < CesiumMath.EPSILON5 || Math.abs(I - 1) < CesiumMath.EPSILON5, g = Math.abs(M) < CesiumMath.EPSILON5 || Math.abs(M - 1) < CesiumMath.EPSILON5; + if (L && g) + continue; + const w = T.decodePosition( + x, + D, + cartesianScratch + ), O = T.decodeHeight(x, D); + let N; + T.hasVertexNormals ? N = T.getOctEncodedNormal( + x, + D, + octEncodedNormalScratch + ) : (N = octEncodedNormalScratch, N.x = 0, N.y = 0); + let F = M; + if (T.hasWebMercatorT) { + const V = CesiumMath.lerp( + f.south, + f.north, + M + ); + F = (WebMercatorProjection.geodeticLatitudeToMercatorAngle(V) - S) * E; + } + let B; + n.hasGeodeticSurfaceNormals && (B = t.geodeticSurfaceNormal( + w, + normalScratch$1 + )), n.encode( + i, + r * b, + w, + P, + O, + N, + F, + B + ), l.minimumHeight = Math.min(l.minimumHeight, O), l.maximumHeight = Math.max(l.maximumHeight, O), ++r; + } + return r; +} +function getNearestHeightOnEdge(e, t, n, i, r, o) { + let s, c, l; + n ? (s = 0, c = e.length, l = 1) : (s = e.length - 1, c = -1, l = -1); + for (let d = s; d !== c; d += l) { + const f = e[d], h = t[d]; + if (!meshIsUsable(h, f)) + continue; + let p; + switch (i) { + case TileEdge.WEST: + p = f.westIndicesSouthToNorth; + break; + case TileEdge.SOUTH: + p = f.southIndicesEastToWest; + break; + case TileEdge.EAST: + p = f.eastIndicesNorthToSouth; + break; + case TileEdge.NORTH: + p = f.northIndicesWestToEast; + break; + } + const m = p[n ? 0 : p.length - 1]; + if (defined(m)) + return f.encoding.decodeHeight(f.vertices, m); + } +} +function meshIsUsable(e, t) { + return defined(t) && (!defined(e.data.fill) || !e.data.fill.changedThisFrame); +} +function getCornerFromEdge(e, t, n, i, r, o, s, c) { + let l, d, f, h, p; + const m = i[r ? 0 : n.length - 1], _ = n[r ? 0 : n.length - 1]; + if (meshIsUsable(m, _) && (o === 0 ? s === 0 ? (l = r ? _.northIndicesWestToEast : _.eastIndicesNorthToSouth, d = r, f = r) : (l = r ? _.eastIndicesNorthToSouth : _.southIndicesEastToWest, d = !r, f = !1) : s === 0 ? (l = r ? _.westIndicesSouthToNorth : _.northIndicesWestToEast, d = !r, f = !0) : (l = r ? _.southIndicesEastToWest : _.westIndicesSouthToNorth, d = r, f = !r), l.length > 0)) { + h = r ? 0 : l.length - 1, p = l[h], _.encoding.decodeTextureCoordinates( + _.vertices, + p, + uvScratch + ); + const y = transformTextureCoordinates( + m, + e.tile, + uvScratch, + uvScratch + ); + if (y.x === o && y.y === s) + return getVertexFromTileAtCorner(_, p, o, s, c), !0; + if (h = binarySearch(l, d ? o : s, function(C, T) { + _.encoding.decodeTextureCoordinates( + _.vertices, + C, + uvScratch + ); + const x = transformTextureCoordinates( + m, + e.tile, + uvScratch, + uvScratch + ); + return f ? d ? x.x - o : x.y - s : d ? o - x.x : s - x.y; + }), h < 0) { + if (h = ~h, h > 0 && h < l.length) + return getInterpolatedVertexAtCorner( + t, + m, + e.tile, + _, + l[h - 1], + l[h], + o, + s, + d, + c + ), !0; + } else + return getVertexFromTileAtCorner( + _, + l[h], + o, + s, + c + ), !0; + } + return !1; +} +const cornerPositionsScratch$1 = [ + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3() +]; +function computeOccludeePoint$1(e, t, n, i, r, o) { + const s = e.quadtree._occluders.ellipsoid, c = s.ellipsoid, l = cornerPositionsScratch$1; + return Cartesian3.fromRadians( + n.west, + n.south, + r, + c, + l[0] + ), Cartesian3.fromRadians( + n.east, + n.south, + r, + c, + l[1] + ), Cartesian3.fromRadians( + n.west, + n.north, + r, + c, + l[2] + ), Cartesian3.fromRadians( + n.east, + n.north, + r, + c, + l[3] + ), s.computeHorizonCullingPointPossiblyUnderEllipsoid( + t, + l, + i, + o + ); +} +function GlobeSurfaceTileProvider(e) { + this.lightingFadeOutDistance = 65e5, this.lightingFadeInDistance = 9e6, this.hasWaterMask = !1, this.showWaterEffect = !1, this.oceanNormalMap = void 0, this.zoomedOutOceanSpecularIntensity = 0.5, this.enableLighting = !1, this.dynamicAtmosphereLighting = !1, this.dynamicAtmosphereLightingFromSun = !1, this.showGroundAtmosphere = !1, this.shadows = ShadowMode$1.RECEIVE_ONLY, this.vertexShadowDarkness = 0.3, this.fillHighlightColor = void 0, this.hueShift = 0, this.saturationShift = 0, this.brightnessShift = 0, this.showSkirts = !0, this.backFaceCulling = !0, this.undergroundColor = void 0, this.undergroundColorAlphaByDistance = void 0, this.lambertDiffuseMultiplier = 0, this.materialUniformMap = void 0, this._materialUniformMap = void 0, this._quadtree = void 0, this._terrainProvider = e.terrainProvider, this._imageryLayers = e.imageryLayers, this._surfaceShaderSet = e.surfaceShaderSet, this._renderState = void 0, this._blendRenderState = void 0, this._disableCullingRenderState = void 0, this._disableCullingBlendRenderState = void 0, this._errorEvent = new Event(), this._removeLayerAddedListener = this._imageryLayers.layerAdded.addEventListener( + GlobeSurfaceTileProvider.prototype._onLayerAdded, + this + ), this._removeLayerRemovedListener = this._imageryLayers.layerRemoved.addEventListener( + GlobeSurfaceTileProvider.prototype._onLayerRemoved, + this + ), this._removeLayerMovedListener = this._imageryLayers.layerMoved.addEventListener( + GlobeSurfaceTileProvider.prototype._onLayerMoved, + this + ), this._removeLayerShownListener = this._imageryLayers.layerShownOrHidden.addEventListener( + GlobeSurfaceTileProvider.prototype._onLayerShownOrHidden, + this + ), this._imageryLayersUpdatedEvent = new Event(), this._layerOrderChanged = !1, this._tilesToRenderByTextureCount = [], this._drawCommands = [], this._uniformMaps = [], this._usedDrawCommands = 0, this._vertexArraysToDestroy = [], this._debug = { + wireframe: !1, + boundingSphereTile: void 0 + }, this._baseColor = void 0, this._firstPassInitialColor = void 0, this.baseColor = new Color(0, 0, 0.5, 1), this._clippingPlanes = void 0, this._clippingPolygons = void 0, this.cartographicLimitRectangle = Rectangle.clone(Rectangle.MAX_VALUE), this._hasLoadedTilesThisFrame = !1, this._hasFillTilesThisFrame = !1, this._oldVerticalExaggeration = void 0, this._oldVerticalExaggerationRelativeHeight = void 0; +} +Object.defineProperties(GlobeSurfaceTileProvider.prototype, { + /** + * Gets or sets the color of the globe when no imagery is available. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {Color} + */ + baseColor: { + get: function() { + return this._baseColor; + }, + set: function(e) { + this._baseColor = e, this._firstPassInitialColor = Cartesian4.fromColor( + e, + this._firstPassInitialColor + ); + } + }, + /** + * Gets or sets the {@link QuadtreePrimitive} for which this provider is + * providing tiles. This property may be undefined if the provider is not yet associated + * with a {@link QuadtreePrimitive}. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {QuadtreePrimitive} + */ + quadtree: { + get: function() { + return this._quadtree; + }, + set: function(e) { + this._quadtree = e; + } + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {TilingScheme} + */ + tilingScheme: { + get: function() { + if (defined(this._terrainProvider)) + return this._terrainProvider.tilingScheme; + } + }, + /** + * Gets an event that is raised when the geometry provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {Event} + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets an event that is raised when an imagery layer is added, shown, hidden, moved, or removed. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {Event} + */ + imageryLayersUpdatedEvent: { + get: function() { + return this._imageryLayersUpdatedEvent; + } + }, + /** + * Gets or sets the terrain provider that describes the surface geometry. + * @memberof GlobeSurfaceTileProvider.prototype + * @type {TerrainProvider} + */ + terrainProvider: { + get: function() { + return this._terrainProvider; + }, + set: function(e) { + this._terrainProvider !== e && (this._terrainProvider = e, defined(this._quadtree) && this._quadtree.invalidateAllTiles()); + } + }, + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering. + * + * @type {ClippingPlaneCollection} + * + * @private + */ + clippingPlanes: { + get: function() { + return this._clippingPlanes; + }, + set: function(e) { + ClippingPlaneCollection.setOwner(e, this, "_clippingPlanes"); + } + }, + /** + * The {@link ClippingPolygonCollection} used to selectively disable rendering inside or outside a list of polygons. + * + * @type {ClippingPolygonCollection} + * + * @private + */ + clippingPolygons: { + get: function() { + return this._clippingPolygons; + }, + set: function(e) { + ClippingPolygonCollection.setOwner(e, this, "_clippingPolygons"); + } + } +}); +function sortTileImageryByLayerIndex(e, t) { + let n = e.loadingImagery; + defined(n) || (n = e.readyImagery); + let i = t.loadingImagery; + return defined(i) || (i = t.readyImagery), n.imageryLayer._layerIndex - i.imageryLayer._layerIndex; +} +GlobeSurfaceTileProvider.prototype.update = function(e) { + this._imageryLayers._update(); +}; +function updateCredits(e, t) { + const n = t.creditDisplay, i = e._terrainProvider; + defined(i) && defined(i.credit) && n.addCreditToNextFrame(i.credit); + const r = e._imageryLayers; + for (let o = 0, s = r.length; o < s; ++o) { + const c = r.get(o); + c.ready && c.show && defined(c.imageryProvider.credit) && n.addCreditToNextFrame(c.imageryProvider.credit); + } +} +GlobeSurfaceTileProvider.prototype.initialize = function(e) { + this._imageryLayers.queueReprojectionCommands(e), this._layerOrderChanged && (this._layerOrderChanged = !1, this._quadtree.forEachLoadedTile(function(i) { + i.data.imagery.sort(sortTileImageryByLayerIndex); + })), updateCredits(this, e); + const t = this._vertexArraysToDestroy, n = t.length; + for (let i = 0; i < n; ++i) + GlobeSurfaceTile._freeVertexArray(t[i]); + t.length = 0; +}; +GlobeSurfaceTileProvider.prototype.beginUpdate = function(e) { + const t = this._tilesToRenderByTextureCount; + for (let r = 0, o = t.length; r < o; ++r) { + const s = t[r]; + defined(s) && (s.length = 0); + } + const n = this._clippingPlanes; + defined(n) && n.enabled && n.update(e); + const i = this._clippingPolygons; + defined(i) && i.enabled && (i.update(e), i.queueCommands(e)), this._usedDrawCommands = 0, this._hasLoadedTilesThisFrame = !1, this._hasFillTilesThisFrame = !1; +}; +GlobeSurfaceTileProvider.prototype.endUpdate = function(e) { + if (!defined(this._renderState)) { + this._renderState = RenderState.fromCache({ + // Write color and depth + cull: { + enabled: !0 + }, + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS + } + }), this._blendRenderState = RenderState.fromCache({ + // Write color and depth + cull: { + enabled: !0 + }, + depthTest: { + enabled: !0, + func: DepthFunction$1.LESS_OR_EQUAL + }, + blending: BlendingState$1.ALPHA_BLEND + }); + let s = clone$1(this._renderState, !0); + s.cull.enabled = !1, this._disableCullingRenderState = RenderState.fromCache(s), s = clone$1(this._blendRenderState, !0), s.cull.enabled = !1, this._disableCullingBlendRenderState = RenderState.fromCache(s); + } + this._hasFillTilesThisFrame && this._hasLoadedTilesThisFrame && TerrainFillMesh.updateFillTiles( + this, + this._quadtree._tilesToRender, + e, + this._vertexArraysToDestroy + ); + const t = this.quadtree, n = e.verticalExaggeration, i = e.verticalExaggerationRelativeHeight, r = this._oldVerticalExaggeration !== n || this._oldVerticalExaggerationRelativeHeight !== i; + this._oldVerticalExaggeration = n, this._oldVerticalExaggerationRelativeHeight = i, r && t.forEachLoadedTile(function(s) { + s.data.updateExaggeration(s, e, t); + }); + const o = this._tilesToRenderByTextureCount; + for (let s = 0, c = o.length; s < c; ++s) { + const l = o[s]; + if (defined(l)) + for (let d = 0, f = l.length; d < f; ++d) { + const h = l[d], p = h.data.tileBoundingRegion; + addDrawCommandsForTile(this, h, e), e.minimumTerrainHeight = Math.min( + e.minimumTerrainHeight, + p.minimumHeight + ); + } + } +}; +function pushCommand(e, t) { + const n = t.globeTranslucencyState; + if (n.translucent) { + const i = e.renderState.blending.enabled; + n.pushDerivedCommands( + e, + i, + t + ); + } else + t.commandList.push(e); +} +GlobeSurfaceTileProvider.prototype.updateForPick = function(e) { + const t = this._drawCommands; + for (let n = 0, i = this._usedDrawCommands; n < i; ++n) + pushCommand(t[n], e); +}; +GlobeSurfaceTileProvider.prototype.cancelReprojections = function() { + this._imageryLayers.cancelReprojections(); +}; +GlobeSurfaceTileProvider.prototype.getLevelMaximumGeometricError = function(e) { + return defined(this._terrainProvider) ? this._terrainProvider.getLevelMaximumGeometricError(e) : 0; +}; +GlobeSurfaceTileProvider.prototype.loadTile = function(e, t) { + let n = t.data, i = !0, r; + defined(n) && (i = n.boundingVolumeSourceTile !== t || t._lastSelectionResult === TileSelectionResult.CULLED_BUT_NEEDED, r = n.terrainState), GlobeSurfaceTile.processStateMachine( + t, + e, + this.terrainProvider, + this._imageryLayers, + this.quadtree, + this._vertexArraysToDestroy, + i + ), n = t.data, i && r !== t.data.terrainState && this.computeTileVisibility(t, e, this.quadtree.occluders) !== Visibility$1.NONE && n.boundingVolumeSourceTile === t && (i = !1, GlobeSurfaceTile.processStateMachine( + t, + e, + this.terrainProvider, + this._imageryLayers, + this.quadtree, + this._vertexArraysToDestroy, + i + )); +}; +const boundingSphereScratch = new BoundingSphere(), rectangleIntersectionScratch = new Rectangle(), splitCartographicLimitRectangleScratch = new Rectangle(), rectangleCenterScratch = new Cartographic(); +function clipRectangleAntimeridian(e, t) { + if (t.west < t.east) + return t; + const n = Rectangle.clone( + t, + splitCartographicLimitRectangleScratch + ); + return Rectangle.center(e, rectangleCenterScratch).longitude > 0 ? n.east = CesiumMath.PI : n.west = -CesiumMath.PI, n; +} +function isUndergroundVisible(e, t) { + if (t.cameraUnderground || t.globeTranslucencyState.translucent) + return !0; + if (e.backFaceCulling) + return !1; + const n = e._clippingPlanes; + if (defined(n) && n.enabled) + return !0; + const i = e._clippingPolygons; + return !!(defined(i) && i.enabled || !Rectangle.equals( + e.cartographicLimitRectangle, + Rectangle.MAX_VALUE + )); +} +GlobeSurfaceTileProvider.prototype.computeTileVisibility = function(e, t, n) { + const i = this.computeDistanceToTile(e, t); + e._distance = i; + const r = isUndergroundVisible(this, t); + if (t.fog.enabled && !r && CesiumMath.fog(i, t.fog.density) >= 1) + return Visibility$1.NONE; + const o = e.data, s = o.tileBoundingRegion; + if (o.boundingVolumeSourceTile === void 0) + return Visibility$1.PARTIAL; + const c = t.cullingVolume; + let l = s.boundingVolume; + defined(l) || (l = s.boundingSphere), o.clippedByBoundaries = !1; + const d = clipRectangleAntimeridian( + e.rectangle, + this.cartographicLimitRectangle + ), f = Rectangle.simpleIntersection( + d, + e.rectangle, + rectangleIntersectionScratch + ); + if (!defined(f)) + return Visibility$1.NONE; + if (Rectangle.equals(f, e.rectangle) || (o.clippedByBoundaries = !0), t.mode !== SceneMode$1.SCENE3D && (l = boundingSphereScratch, BoundingSphere.fromRectangleWithHeights2D( + e.rectangle, + t.mapProjection, + s.minimumHeight, + s.maximumHeight, + l + ), Cartesian3.fromElements( + l.center.z, + l.center.x, + l.center.y, + l.center + ), t.mode === SceneMode$1.MORPHING && defined(o.renderedMesh) && (l = BoundingSphere.union( + s.boundingSphere, + l, + l + ))), !defined(l)) + return Visibility$1.PARTIAL; + const h = this._clippingPlanes; + if (defined(h) && h.enabled) { + const C = h.computeIntersectionWithBoundingVolume( + l + ); + if (e.isClipped = C !== Intersect$1.INSIDE, C === Intersect$1.OUTSIDE) + return Visibility$1.NONE; + } + const p = this._clippingPolygons; + if (defined(p) && p.enabled) { + const C = p.computeIntersectionWithBoundingVolume( + s + ); + e.isClipped = C !== Intersect$1.OUTSIDE; + } + let m; + const _ = c.computeVisibility(l); + if (_ === Intersect$1.OUTSIDE ? m = Visibility$1.NONE : _ === Intersect$1.INTERSECTING ? m = Visibility$1.PARTIAL : _ === Intersect$1.INSIDE && (m = Visibility$1.FULL), m === Visibility$1.NONE) + return m; + const y = t.mode === SceneMode$1.SCENE3D && t.camera.frustum instanceof OrthographicFrustum; + if (t.mode === SceneMode$1.SCENE3D && !y && defined(n) && !r) { + const C = o.occludeePointInScaledSpace; + return !defined(C) || n.ellipsoid.isScaledSpacePointVisiblePossiblyUnderEllipsoid( + C, + s.minimumHeight + ) ? m : Visibility$1.NONE; + } + return m; +}; +GlobeSurfaceTileProvider.prototype.canRefine = function(e) { + return defined(e.data.terrainData) ? !0 : this.terrainProvider.getTileDataAvailable( + e.x * 2, + e.y * 2, + e.level + 1 + ) !== void 0; +}; +const readyImageryScratch = [], canRenderTraversalStack = []; +GlobeSurfaceTileProvider.prototype.canRenderWithoutLosingDetail = function(e, t) { + const n = e.data, i = readyImageryScratch; + i.length = this._imageryLayers.length; + let r = !1, o = !1, s; + defined(n) && (r = n.terrainState === TerrainState$2.READY, o = !0, s = n.imagery); + let c, l; + for (c = 0, l = i.length; c < l; ++c) + i[c] = o; + if (defined(s)) + for (c = 0, l = s.length; c < l; ++c) { + const h = s[c], p = h.loadingImagery, m = !defined(p) || p.state === ImageryState$1.FAILED || p.state === ImageryState$1.INVALID, _ = (h.loadingImagery || h.readyImagery).imageryLayer._layerIndex; + i[_] = m && i[_]; + } + const d = this.quadtree._lastSelectionFrameNumber, f = canRenderTraversalStack; + for (f.length = 0, f.push( + e.southwestChild, + e.southeastChild, + e.northwestChild, + e.northeastChild + ); f.length > 0; ) { + const h = f.pop(), p = h._lastSelectionResultFrame === d ? h._lastSelectionResult : TileSelectionResult.NONE; + if (p === TileSelectionResult.RENDERED) { + const m = h.data; + if (!defined(m)) + continue; + if (!r && h.data.terrainState === TerrainState$2.READY) + return !1; + const _ = h.data.imagery; + for (c = 0, l = _.length; c < l; ++c) { + const y = _[c], C = y.loadingImagery, T = !defined(C) || C.state === ImageryState$1.FAILED || C.state === ImageryState$1.INVALID, x = (y.loadingImagery || y.readyImagery).imageryLayer._layerIndex; + if (T && !i[x]) + return !1; + } + } else p === TileSelectionResult.REFINED && f.push( + h.southwestChild, + h.southeastChild, + h.northwestChild, + h.northeastChild + ); + } + return !0; +}; +const tileDirectionScratch = new Cartesian3(); +GlobeSurfaceTileProvider.prototype.computeTileLoadPriority = function(e, t) { + const n = e.data; + if (n === void 0) + return 0; + const i = n.tileBoundingRegion.boundingVolume; + if (i === void 0) + return 0; + const r = t.camera.positionWC, o = t.camera.directionWC, s = Cartesian3.subtract( + i.center, + r, + tileDirectionScratch + ), c = Cartesian3.magnitude(s); + return c < CesiumMath.EPSILON5 ? 0 : (Cartesian3.divideByScalar(s, c, s), (1 - Cartesian3.dot(s, o)) * e._distance); +}; +const modifiedModelViewScratch = new Matrix4(), modifiedModelViewProjectionScratch = new Matrix4(), tileRectangleScratch = new Cartesian4(), localizedCartographicLimitRectangleScratch = new Cartesian4(), localizedTranslucencyRectangleScratch = new Cartesian4(), rtcScratch = new Cartesian3(), centerEyeScratch = new Cartesian3(), southwestScratch = new Cartesian3(), northeastScratch = new Cartesian3(); +GlobeSurfaceTileProvider.prototype.showTileThisFrame = function(e, t) { + let n = 0; + const i = e.data.imagery; + for (let c = 0, l = i.length; c < l; ++c) { + const d = i[c]; + defined(d.readyImagery) && d.readyImagery.imageryLayer.alpha !== 0 && ++n; + } + let r = this._tilesToRenderByTextureCount[n]; + defined(r) || (r = [], this._tilesToRenderByTextureCount[n] = r), r.push(e); + const o = e.data; + defined(o.vertexArray) ? this._hasLoadedTilesThisFrame = !0 : this._hasFillTilesThisFrame = !0; + const s = this._debug; + ++s.tilesRendered, s.texturesRendered += n; +}; +const cornerPositionsScratch = [ + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3() +]; +function computeOccludeePoint(e, t, n, i, r, o) { + const s = e.quadtree._occluders.ellipsoid, c = s.ellipsoid, l = cornerPositionsScratch; + return Cartesian3.fromRadians( + n.west, + n.south, + r, + c, + l[0] + ), Cartesian3.fromRadians( + n.east, + n.south, + r, + c, + l[1] + ), Cartesian3.fromRadians( + n.west, + n.north, + r, + c, + l[2] + ), Cartesian3.fromRadians( + n.east, + n.north, + r, + c, + l[3] + ), s.computeHorizonCullingPointPossiblyUnderEllipsoid( + t, + l, + i, + o + ); +} +GlobeSurfaceTileProvider.prototype.computeDistanceToTile = function(e, t) { + updateTileBoundingRegion(e, this, t); + const n = e.data; + if (n.boundingVolumeSourceTile === void 0) + return 9999999999; + const r = n.tileBoundingRegion, o = r.minimumHeight, s = r.maximumHeight; + if (n.boundingVolumeSourceTile !== e) { + const l = t.camera.positionCartographic.height, d = Math.abs(l - o), f = Math.abs(l - s); + d > f ? (r.minimumHeight = o, r.maximumHeight = o) : (r.minimumHeight = s, r.maximumHeight = s); + } + const c = r.distanceToCamera(t); + return r.minimumHeight = o, r.maximumHeight = s, c; +}; +function updateTileBoundingRegion(e, t, n) { + let i = e.data; + i === void 0 && (i = e.data = new GlobeSurfaceTile()); + const r = e.tilingScheme.ellipsoid; + i.tileBoundingRegion === void 0 && (i.tileBoundingRegion = new TileBoundingRegion({ + computeBoundingVolumes: !1, + rectangle: e.rectangle, + ellipsoid: r, + minimumHeight: 0, + maximumHeight: 0 + })); + const o = i.tileBoundingRegion, s = o.minimumHeight, c = o.maximumHeight; + let l = !1, d = e; + const f = i.mesh, h = i.terrainData; + if (f !== void 0 && f.minimumHeight !== void 0 && f.maximumHeight !== void 0) + o.minimumHeight = f.minimumHeight, o.maximumHeight = f.maximumHeight, l = !0; + else if (h !== void 0 && h._minimumHeight !== void 0 && h._maximumHeight !== void 0) + o.minimumHeight = h._minimumHeight, o.maximumHeight = h._maximumHeight; + else { + o.minimumHeight = Number.NaN, o.maximumHeight = Number.NaN; + let p = e.parent; + for (; p !== void 0; ) { + const m = p.data; + if (m !== void 0) { + const _ = m.mesh, y = m.terrainData; + if (_ !== void 0 && _.minimumHeight !== void 0 && _.maximumHeight !== void 0) { + o.minimumHeight = _.minimumHeight, o.maximumHeight = _.maximumHeight; + break; + } else if (y !== void 0 && y._minimumHeight !== void 0 && y._maximumHeight !== void 0) { + o.minimumHeight = y._minimumHeight, o.maximumHeight = y._maximumHeight; + break; + } + } + p = p.parent; + } + d = p; + } + if (d !== void 0) { + const p = n.verticalExaggeration, m = n.verticalExaggerationRelativeHeight; + if (p !== 1 && (l = !1, o.minimumHeight = VerticalExaggeration.getHeight( + o.minimumHeight, + p, + m + ), o.maximumHeight = VerticalExaggeration.getHeight( + o.maximumHeight, + p, + m + )), l) + i.boundingVolumeIsFromMesh || (o._orientedBoundingBox = OrientedBoundingBox.clone( + f.orientedBoundingBox, + o._orientedBoundingBox + ), o._boundingSphere = BoundingSphere.clone( + f.boundingSphere3D, + o._boundingSphere + ), i.occludeePointInScaledSpace = Cartesian3.clone( + f.occludeePointInScaledSpace, + i.occludeePointInScaledSpace + ), defined(i.occludeePointInScaledSpace) || (i.occludeePointInScaledSpace = computeOccludeePoint( + t, + o._orientedBoundingBox.center, + e.rectangle, + o.minimumHeight, + o.maximumHeight, + i.occludeePointInScaledSpace + ))); + else { + const y = o._orientedBoundingBox === void 0 || o._boundingSphere === void 0; + (o.minimumHeight !== s || o.maximumHeight !== c || y) && (o.computeBoundingVolumes(r), i.occludeePointInScaledSpace = computeOccludeePoint( + t, + o._orientedBoundingBox.center, + e.rectangle, + o.minimumHeight, + o.maximumHeight, + i.occludeePointInScaledSpace + )); + } + i.boundingVolumeSourceTile = d, i.boundingVolumeIsFromMesh = l; + } else + i.boundingVolumeSourceTile = void 0, i.boundingVolumeIsFromMesh = !1; +} +GlobeSurfaceTileProvider.prototype.isDestroyed = function() { + return !1; +}; +GlobeSurfaceTileProvider.prototype.destroy = function() { + return this._tileProvider = this._tileProvider && this._tileProvider.destroy(), this._clippingPlanes = this._clippingPlanes && this._clippingPlanes.destroy(), this._clippingPolygons = this._clippingPolygons && this._clippingPolygons.destroy(), this._removeLayerAddedListener = this._removeLayerAddedListener && this._removeLayerAddedListener(), this._removeLayerRemovedListener = this._removeLayerRemovedListener && this._removeLayerRemovedListener(), this._removeLayerMovedListener = this._removeLayerMovedListener && this._removeLayerMovedListener(), this._removeLayerShownListener = this._removeLayerShownListener && this._removeLayerShownListener(), destroyObject(this); +}; +function getTileReadyCallback(e, t, n) { + return function(i) { + let r, o, s = -1; + const c = i.data.imagery, l = c.length; + let d; + for (d = 0; d < l; ++d) + if (r = c[d], o = defaultValue( + r.readyImagery, + r.loadingImagery + ), o.imageryLayer === t) { + s = d; + break; + } + if (s !== -1) { + const f = s + e; + if (r = c[f], o = defined(r) ? defaultValue(r.readyImagery, r.loadingImagery) : void 0, !defined(o) || o.imageryLayer !== t) + return !t._createTileImagerySkeletons( + i, + n, + f + ); + for (d = s; d < f; ++d) + c[d].freeResources(); + c.splice(s, e); + } + return !0; + }; +} +GlobeSurfaceTileProvider.prototype._onLayerAdded = function(e, t) { + if (!this.isDestroyed() && e.show) { + const n = this._terrainProvider, i = this, r = this._imageryLayersUpdatedEvent, o = function() { + e._imageryCache = {}, i._quadtree.forEachLoadedTile(function(s) { + if (defined(s._loadedCallbacks[e._layerIndex])) + return; + let c; + const l = s.data.imagery, d = l.length; + let f = -1, h = 0; + for (c = 0; c < d; ++c) { + const m = l[c]; + if (defaultValue( + m.readyImagery, + m.loadingImagery + ).imageryLayer === e) + f === -1 && (f = c), ++h; + else if (f !== -1) + break; + } + if (f === -1) + return; + const p = f + h; + e._createTileImagerySkeletons( + s, + n, + p + ) && (s._loadedCallbacks[e._layerIndex] = getTileReadyCallback( + h, + e, + n + ), s.state = QuadtreeTileLoadState$1.LOADING); + }); + }; + if (e.ready) { + const s = e.imageryProvider; + s._reload = o; + } + this._quadtree.forEachLoadedTile(function(s) { + e._createTileImagerySkeletons(s, n) && (s.state = QuadtreeTileLoadState$1.LOADING, s.level !== 0 && (s._lastSelectionResultFrame !== i.quadtree._lastSelectionFrameNumber || s._lastSelectionResult !== TileSelectionResult.RENDERED) && (s.renderable = !1)); + }), this._layerOrderChanged = !0, r.raiseEvent(); + } +}; +GlobeSurfaceTileProvider.prototype._onLayerRemoved = function(e, t) { + this._quadtree.forEachLoadedTile(function(n) { + const i = n.data.imagery; + let r = -1, o = 0; + for (let s = 0, c = i.length; s < c; ++s) { + const l = i[s]; + let d = l.loadingImagery; + if (defined(d) || (d = l.readyImagery), d.imageryLayer === e) + r === -1 && (r = s), l.freeResources(), ++o; + else if (r !== -1) + break; + } + r !== -1 && i.splice(r, o); + }), defined(e.imageryProvider) && (e.imageryProvider._reload = void 0), this._imageryLayersUpdatedEvent.raiseEvent(); +}; +GlobeSurfaceTileProvider.prototype._onLayerMoved = function(e, t, n) { + this._layerOrderChanged = !0, this._imageryLayersUpdatedEvent.raiseEvent(); +}; +GlobeSurfaceTileProvider.prototype._onLayerShownOrHidden = function(e, t, n) { + n ? this._onLayerAdded(e, t) : this._onLayerRemoved(e, t); +}; +const scratchClippingPlanesMatrix$1 = new Matrix4(), scratchInverseTransposeClippingPlanesMatrix$1 = new Matrix4(); +function createTileUniformMap(e, t) { + const n = { + u_initialColor: function() { + return this.properties.initialColor; + }, + u_fillHighlightColor: function() { + return this.properties.fillHighlightColor; + }, + u_zoomedOutOceanSpecularIntensity: function() { + return this.properties.zoomedOutOceanSpecularIntensity; + }, + u_oceanNormalMap: function() { + return this.properties.oceanNormalMap; + }, + u_atmosphereLightIntensity: function() { + return this.properties.atmosphereLightIntensity; + }, + u_atmosphereRayleighCoefficient: function() { + return this.properties.atmosphereRayleighCoefficient; + }, + u_atmosphereMieCoefficient: function() { + return this.properties.atmosphereMieCoefficient; + }, + u_atmosphereRayleighScaleHeight: function() { + return this.properties.atmosphereRayleighScaleHeight; + }, + u_atmosphereMieScaleHeight: function() { + return this.properties.atmosphereMieScaleHeight; + }, + u_atmosphereMieAnisotropy: function() { + return this.properties.atmosphereMieAnisotropy; + }, + u_lightingFadeDistance: function() { + return this.properties.lightingFadeDistance; + }, + u_nightFadeDistance: function() { + return this.properties.nightFadeDistance; + }, + u_center3D: function() { + return this.properties.center3D; + }, + u_verticalExaggerationAndRelativeHeight: function() { + return this.properties.verticalExaggerationAndRelativeHeight; + }, + u_tileRectangle: function() { + return this.properties.tileRectangle; + }, + u_modifiedModelView: function() { + const i = e.context.uniformState.view, r = Matrix4.multiplyByPoint( + i, + this.properties.rtc, + centerEyeScratch + ); + return Matrix4.setTranslation(i, r, modifiedModelViewScratch), modifiedModelViewScratch; + }, + u_modifiedModelViewProjection: function() { + const i = e.context.uniformState.view, r = e.context.uniformState.projection, o = Matrix4.multiplyByPoint( + i, + this.properties.rtc, + centerEyeScratch + ); + return Matrix4.setTranslation( + i, + o, + modifiedModelViewProjectionScratch + ), Matrix4.multiply( + r, + modifiedModelViewProjectionScratch, + modifiedModelViewProjectionScratch + ), modifiedModelViewProjectionScratch; + }, + u_dayTextures: function() { + return this.properties.dayTextures; + }, + u_dayTextureTranslationAndScale: function() { + return this.properties.dayTextureTranslationAndScale; + }, + u_dayTextureTexCoordsRectangle: function() { + return this.properties.dayTextureTexCoordsRectangle; + }, + u_dayTextureUseWebMercatorT: function() { + return this.properties.dayTextureUseWebMercatorT; + }, + u_dayTextureAlpha: function() { + return this.properties.dayTextureAlpha; + }, + u_dayTextureNightAlpha: function() { + return this.properties.dayTextureNightAlpha; + }, + u_dayTextureDayAlpha: function() { + return this.properties.dayTextureDayAlpha; + }, + u_dayTextureBrightness: function() { + return this.properties.dayTextureBrightness; + }, + u_dayTextureContrast: function() { + return this.properties.dayTextureContrast; + }, + u_dayTextureHue: function() { + return this.properties.dayTextureHue; + }, + u_dayTextureSaturation: function() { + return this.properties.dayTextureSaturation; + }, + u_dayTextureOneOverGamma: function() { + return this.properties.dayTextureOneOverGamma; + }, + u_dayIntensity: function() { + return this.properties.dayIntensity; + }, + u_southAndNorthLatitude: function() { + return this.properties.southAndNorthLatitude; + }, + u_southMercatorYAndOneOverHeight: function() { + return this.properties.southMercatorYAndOneOverHeight; + }, + u_waterMask: function() { + return this.properties.waterMask; + }, + u_waterMaskTranslationAndScale: function() { + return this.properties.waterMaskTranslationAndScale; + }, + u_minMaxHeight: function() { + return this.properties.minMaxHeight; + }, + u_scaleAndBias: function() { + return this.properties.scaleAndBias; + }, + u_dayTextureSplit: function() { + return this.properties.dayTextureSplit; + }, + u_dayTextureCutoutRectangles: function() { + return this.properties.dayTextureCutoutRectangles; + }, + u_clippingPlanes: function() { + const i = t._clippingPlanes; + return defined(i) && defined(i.texture) ? i.texture : e.context.defaultTexture; + }, + u_cartographicLimitRectangle: function() { + return this.properties.localizedCartographicLimitRectangle; + }, + u_clippingPlanesMatrix: function() { + const i = t._clippingPlanes, r = defined(i) ? Matrix4.multiply( + e.context.uniformState.view, + i.modelMatrix, + scratchClippingPlanesMatrix$1 + ) : Matrix4.IDENTITY; + return Matrix4.inverseTranspose( + r, + scratchInverseTransposeClippingPlanesMatrix$1 + ); + }, + u_clippingPlanesEdgeStyle: function() { + const i = this.properties.clippingPlanesEdgeColor; + return i.alpha = this.properties.clippingPlanesEdgeWidth, i; + }, + u_clippingDistance: function() { + const i = t._clippingPolygons.clippingTexture; + return defined(i) ? i : e.context.defaultTexture; + }, + u_clippingExtents: function() { + const i = t._clippingPolygons.extentsTexture; + return defined(i) ? i : e.context.defaultTexture; + }, + u_minimumBrightness: function() { + return e.fog.minimumBrightness; + }, + u_hsbShift: function() { + return this.properties.hsbShift; + }, + u_colorsToAlpha: function() { + return this.properties.colorsToAlpha; + }, + u_frontFaceAlphaByDistance: function() { + return this.properties.frontFaceAlphaByDistance; + }, + u_backFaceAlphaByDistance: function() { + return this.properties.backFaceAlphaByDistance; + }, + u_translucencyRectangle: function() { + return this.properties.localizedTranslucencyRectangle; + }, + u_undergroundColor: function() { + return this.properties.undergroundColor; + }, + u_undergroundColorAlphaByDistance: function() { + return this.properties.undergroundColorAlphaByDistance; + }, + u_lambertDiffuseMultiplier: function() { + return this.properties.lambertDiffuseMultiplier; + }, + u_vertexShadowDarkness: function() { + return this.properties.vertexShadowDarkness; + }, + // make a separate object so that changes to the properties are seen on + // derived commands that combine another uniform map with this one. + properties: { + initialColor: new Cartesian4(0, 0, 0.5, 1), + fillHighlightColor: new Color(0, 0, 0, 0), + zoomedOutOceanSpecularIntensity: 0.5, + oceanNormalMap: void 0, + lightingFadeDistance: new Cartesian2(65e5, 9e6), + nightFadeDistance: new Cartesian2(1e7, 4e7), + atmosphereLightIntensity: 10, + atmosphereRayleighCoefficient: new Cartesian3(55e-7, 13e-6, 284e-7), + atmosphereMieCoefficient: new Cartesian3(21e-6, 21e-6, 21e-6), + atmosphereRayleighScaleHeight: 1e4, + atmosphereMieScaleHeight: 3200, + atmosphereMieAnisotropy: 0.9, + hsbShift: new Cartesian3(), + center3D: void 0, + rtc: new Cartesian3(), + modifiedModelView: new Matrix4(), + tileRectangle: new Cartesian4(), + verticalExaggerationAndRelativeHeight: new Cartesian2(1, 0), + dayTextures: [], + dayTextureTranslationAndScale: [], + dayTextureTexCoordsRectangle: [], + dayTextureUseWebMercatorT: [], + dayTextureAlpha: [], + dayTextureNightAlpha: [], + dayTextureDayAlpha: [], + dayTextureBrightness: [], + dayTextureContrast: [], + dayTextureHue: [], + dayTextureSaturation: [], + dayTextureOneOverGamma: [], + dayTextureSplit: [], + dayTextureCutoutRectangles: [], + dayIntensity: 0, + colorsToAlpha: [], + southAndNorthLatitude: new Cartesian2(), + southMercatorYAndOneOverHeight: new Cartesian2(), + waterMask: void 0, + waterMaskTranslationAndScale: new Cartesian4(), + minMaxHeight: new Cartesian2(), + scaleAndBias: new Matrix4(), + clippingPlanesEdgeColor: Color.clone(Color.WHITE), + clippingPlanesEdgeWidth: 0, + localizedCartographicLimitRectangle: new Cartesian4(), + frontFaceAlphaByDistance: new Cartesian4(), + backFaceAlphaByDistance: new Cartesian4(), + localizedTranslucencyRectangle: new Cartesian4(), + undergroundColor: Color.clone(Color.TRANSPARENT), + undergroundColorAlphaByDistance: new Cartesian4(), + lambertDiffuseMultiplier: 0, + vertexShadowDarkness: 0 + } + }; + return defined(t.materialUniformMap) ? combine$2(n, t.materialUniformMap) : n; +} +function createWireframeVertexArrayIfNecessary(e, t, n) { + const i = n.data; + let r, o; + if (defined(i.vertexArray) ? (r = i.mesh, o = i.vertexArray) : defined(i.fill) && defined(i.fill.vertexArray) && (r = i.fill.mesh, o = i.fill.vertexArray), !(!defined(r) || !defined(o))) { + if (defined(i.wireframeVertexArray)) { + if (i.wireframeVertexArray.mesh === r) + return; + i.wireframeVertexArray.destroy(), i.wireframeVertexArray = void 0; + } + i.wireframeVertexArray = createWireframeVertexArray( + e, + o, + r + ), i.wireframeVertexArray.mesh = r; + } +} +function createWireframeVertexArray(e, t, n) { + const r = { + indices: n.indices, + primitiveType: PrimitiveType$1.TRIANGLES + }; + GeometryPipeline.toWireframe(r); + const o = r.indices, s = Buffer.createIndexBuffer({ + context: e, + typedArray: o, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.fromSizeInBytes( + o.BYTES_PER_ELEMENT + ) + }); + return new VertexArray({ + context: e, + attributes: t._attributes, + indexBuffer: s + }); +} +let getDebugOrientedBoundingBox, getDebugBoundingSphere, debugDestroyPrimitive; +(function() { + const e = new GeometryInstance({ + geometry: BoxOutlineGeometry.fromDimensions({ + dimensions: new Cartesian3(2, 2, 2) + }) + }), t = new GeometryInstance({ + geometry: new SphereOutlineGeometry({ radius: 1 }) + }); + let n = new Matrix4(), i, r; + function o(s) { + return new Primitive$3({ + geometryInstances: s, + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); + } + getDebugOrientedBoundingBox = function(s, c) { + return s === i || (debugDestroyPrimitive(), i = s, n = Matrix4.fromRotationTranslation( + s.halfAxes, + s.center, + n + ), e.modelMatrix = n, e.attributes.color = ColorGeometryInstanceAttribute.fromColor( + c + ), r = o(e)), r; + }, getDebugBoundingSphere = function(s, c) { + return s === i || (debugDestroyPrimitive(), i = s, n = Matrix4.fromTranslation(s.center, n), n = Matrix4.multiplyByUniformScale( + n, + s.radius, + n + ), t.modelMatrix = n, t.attributes.color = ColorGeometryInstanceAttribute.fromColor( + c + ), r = o(t)), r; + }, debugDestroyPrimitive = function() { + defined(r) && (r.destroy(), r = void 0, i = void 0); + }; +})(); +const otherPassesInitialColor = new Cartesian4(0, 0, 0, 0), surfaceShaderSetOptionsScratch = { + frameState: void 0, + surfaceTile: void 0, + numberOfDayTextures: void 0, + applyBrightness: void 0, + applyContrast: void 0, + applyHue: void 0, + applySaturation: void 0, + applyGamma: void 0, + applyAlpha: void 0, + applyDayNightAlpha: void 0, + applySplit: void 0, + showReflectiveOcean: void 0, + showOceanWaves: void 0, + enableLighting: void 0, + dynamicAtmosphereLighting: void 0, + dynamicAtmosphereLightingFromSun: void 0, + showGroundAtmosphere: void 0, + perFragmentGroundAtmosphere: void 0, + hasVertexNormals: void 0, + useWebMercatorProjection: void 0, + enableFog: void 0, + enableClippingPlanes: void 0, + clippingPlanes: void 0, + enableClippingPolygons: void 0, + clippingPolygons: void 0, + clippedByBoundaries: void 0, + hasImageryLayerCutout: void 0, + colorCorrect: void 0, + colorToAlpha: void 0, + hasGeodeticSurfaceNormals: void 0, + hasExaggeration: void 0 +}, defaultUndergroundColor = Color.TRANSPARENT, defaultUndergroundColorAlphaByDistance = new NearFarScalar(); +function addDrawCommandsForTile(e, t, n) { + const i = t.data; + defined(i.vertexArray) || (i.fill === void 0 && (i.fill = new TerrainFillMesh(t)), i.fill.update(e, n)); + const r = n.creditDisplay, o = i.terrainData; + if (defined(o) && defined(o.credits)) { + const j = o.credits; + for (let se = 0, Pe = j.length; se < Pe; ++se) + r.addCreditToNextFrame(j[se]); + } + let s = ContextLimits.maximumTextureImageUnits, c = i.waterMaskTexture, l = i.waterMaskTranslationAndScale; + !defined(c) && defined(i.fill) && (c = i.fill.waterMaskTexture, l = i.fill.waterMaskTranslationAndScale); + const d = n.cameraUnderground, f = n.globeTranslucencyState, h = f.translucent, p = f.frontFaceAlphaByDistance, m = f.backFaceAlphaByDistance, _ = f.rectangle, y = defaultValue( + e.undergroundColor, + defaultUndergroundColor + ), C = defaultValue( + e.undergroundColorAlphaByDistance, + defaultUndergroundColorAlphaByDistance + ), T = isUndergroundVisible(e, n) && n.mode === SceneMode$1.SCENE3D && y.alpha > 0 && (C.nearValue > 0 || C.farValue > 0), x = e.lambertDiffuseMultiplier, b = e.vertexShadowDarkness, S = e.hasWaterMask && defined(c), E = S && e.showWaterEffect, A = e.oceanNormalMap, D = E && defined(A), P = e.terrainProvider, I = defined(P) && e.terrainProvider.hasVertexNormals, M = n.fog.enabled && n.fog.renderable && !d, R = e.showGroundAtmosphere && n.mode === SceneMode$1.SCENE3D, L = ShadowMode$1.castShadows(e.shadows) && !h, g = ShadowMode$1.receiveShadows(e.shadows) && !h, w = e.hueShift, O = e.saturationShift, N = e.brightnessShift; + let F = !(CesiumMath.equalsEpsilon(w, 0, CesiumMath.EPSILON7) && CesiumMath.equalsEpsilon(O, 0, CesiumMath.EPSILON7) && CesiumMath.equalsEpsilon(N, 0, CesiumMath.EPSILON7)), B = !1; + if (R) { + const j = Cartesian3.magnitude(n.camera.positionWC), se = e.nightFadeOutDistance; + B = j > se; + } + S && --s, D && --s, defined(n.shadowState) && n.shadowState.shadowsEnabled && --s, defined(e.clippingPlanes) && e.clippingPlanes.enabled && --s, defined(e.clippingPolygons) && e.clippingPolygons.enabled && (--s, --s), s -= f.numberOfTextureUniforms; + const V = i.renderedMesh; + let U = V.center; + const k = V.encoding, $ = i.tileBoundingRegion, G = n.verticalExaggeration, q = n.verticalExaggerationRelativeHeight, z = G !== 1, H = k.hasGeodeticSurfaceNormals, Q = tileRectangleScratch; + let ne = 0, K = 0, Z = 0, ee = 0, oe = !1; + if (n.mode !== SceneMode$1.SCENE3D) { + const j = n.mapProjection, se = j.project( + Rectangle.southwest(t.rectangle), + southwestScratch + ), Pe = j.project( + Rectangle.northeast(t.rectangle), + northeastScratch + ); + if (Q.x = se.x, Q.y = se.y, Q.z = Pe.x, Q.w = Pe.y, n.mode !== SceneMode$1.MORPHING && (U = rtcScratch, U.x = 0, U.y = (Q.z + Q.x) * 0.5, U.z = (Q.w + Q.y) * 0.5, Q.x -= U.y, Q.y -= U.z, Q.z -= U.y, Q.w -= U.z), n.mode === SceneMode$1.SCENE2D && k.quantization === TerrainQuantization$1.BITS12) { + const le = 1 / (Math.pow(2, 12) - 1) * 0.5, De = (Q.z - Q.x) * le, Me = (Q.w - Q.y) * le; + Q.x -= De, Q.y -= Me, Q.z += De, Q.w += Me; + } + j instanceof WebMercatorProjection && (ne = t.rectangle.south, K = t.rectangle.north, Z = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + ne + ), ee = 1 / (WebMercatorProjection.geodeticLatitudeToMercatorAngle(K) - Z), oe = !0); + } + const X = surfaceShaderSetOptionsScratch; + X.frameState = n, X.surfaceTile = i, X.hasWaterMask = S, X.showReflectiveOcean = E, X.showOceanWaves = D, X.enableLighting = e.enableLighting, X.dynamicAtmosphereLighting = e.dynamicAtmosphereLighting, X.dynamicAtmosphereLightingFromSun = e.dynamicAtmosphereLightingFromSun, X.showGroundAtmosphere = R, X.atmosphereLightIntensity = e.atmosphereLightIntensity, X.atmosphereRayleighCoefficient = e.atmosphereRayleighCoefficient, X.atmosphereMieCoefficient = e.atmosphereMieCoefficient, X.atmosphereRayleighScaleHeight = e.atmosphereRayleighScaleHeight, X.atmosphereMieScaleHeight = e.atmosphereMieScaleHeight, X.atmosphereMieAnisotropy = e.atmosphereMieAnisotropy, X.perFragmentGroundAtmosphere = B, X.hasVertexNormals = I, X.useWebMercatorProjection = oe, X.clippedByBoundaries = i.clippedByBoundaries, X.hasGeodeticSurfaceNormals = H, X.hasExaggeration = z; + const fe = i.imagery; + let de = 0; + const ce = fe.length, ye = e.showSkirts && !d && !h, ge = e.backFaceCulling && !d && !h, re = ge ? e._renderState : e._disableCullingRenderState, be = ge ? e._blendRenderState : e._disableCullingBlendRenderState; + let pe = re, Te = e._firstPassInitialColor; + const xe = n.context; + if (defined(e._debug.boundingSphereTile) || debugDestroyPrimitive(), e._materialUniformMap !== e.materialUniformMap) { + e._materialUniformMap = e.materialUniformMap; + const j = e._drawCommands.length; + for (let se = 0; se < j; ++se) + e._uniformMaps[se] = createTileUniformMap( + n, + e + ); + } + do { + let j = 0, se, Pe; + if (e._drawCommands.length <= e._usedDrawCommands ? (se = new DrawCommand(), se.owner = t, se.cull = !1, se.boundingVolume = new BoundingSphere(), se.orientedBoundingBox = void 0, Pe = createTileUniformMap(n, e), e._drawCommands.push(se), e._uniformMaps.push(Pe)) : (se = e._drawCommands[e._usedDrawCommands], Pe = e._uniformMaps[e._usedDrawCommands]), se.owner = t, ++e._usedDrawCommands, t === e._debug.boundingSphereTile) { + const ze = $.boundingVolume, Ke = $.boundingSphere; + defined(ze) ? getDebugOrientedBoundingBox(ze, Color.RED).update(n) : defined(Ke) && getDebugBoundingSphere(Ke, Color.RED).update(n); + } + const le = Pe.properties; + Cartesian4.clone(Te, le.initialColor), le.oceanNormalMap = A, le.lightingFadeDistance.x = e.lightingFadeOutDistance, le.lightingFadeDistance.y = e.lightingFadeInDistance, le.nightFadeDistance.x = e.nightFadeOutDistance, le.nightFadeDistance.y = e.nightFadeInDistance, le.atmosphereLightIntensity = e.atmosphereLightIntensity, le.atmosphereRayleighCoefficient = e.atmosphereRayleighCoefficient, le.atmosphereMieCoefficient = e.atmosphereMieCoefficient, le.atmosphereRayleighScaleHeight = e.atmosphereRayleighScaleHeight, le.atmosphereMieScaleHeight = e.atmosphereMieScaleHeight, le.atmosphereMieAnisotropy = e.atmosphereMieAnisotropy, le.zoomedOutOceanSpecularIntensity = e.zoomedOutOceanSpecularIntensity; + const De = d ? m : p, Me = d ? p : m; + defined(De) && (Cartesian4.fromElements( + De.near, + De.nearValue, + De.far, + De.farValue, + le.frontFaceAlphaByDistance + ), Cartesian4.fromElements( + Me.near, + Me.nearValue, + Me.far, + Me.farValue, + le.backFaceAlphaByDistance + )), Cartesian4.fromElements( + C.near, + C.nearValue, + C.far, + C.farValue, + le.undergroundColorAlphaByDistance + ), Color.clone(y, le.undergroundColor), le.lambertDiffuseMultiplier = x, le.vertexShadowDarkness = b; + const He = !defined(i.vertexArray) && defined(e.fillHighlightColor) && e.fillHighlightColor.alpha > 0; + He && Color.clone( + e.fillHighlightColor, + le.fillHighlightColor + ), le.verticalExaggerationAndRelativeHeight.x = G, le.verticalExaggerationAndRelativeHeight.y = q, le.center3D = V.center, Cartesian3.clone(U, le.rtc), Cartesian4.clone(Q, le.tileRectangle), le.southAndNorthLatitude.x = ne, le.southAndNorthLatitude.y = K, le.southMercatorYAndOneOverHeight.x = Z, le.southMercatorYAndOneOverHeight.y = ee; + const Oe = localizedCartographicLimitRectangleScratch, $e = clipRectangleAntimeridian( + t.rectangle, + e.cartographicLimitRectangle + ), J = localizedTranslucencyRectangleScratch, ae = clipRectangleAntimeridian( + t.rectangle, + _ + ); + Cartesian3.fromElements( + w, + O, + N, + le.hsbShift + ); + const te = t.rectangle, ie = 1 / te.width, ue = 1 / te.height; + Oe.x = ($e.west - te.west) * ie, Oe.y = ($e.south - te.south) * ue, Oe.z = ($e.east - te.west) * ie, Oe.w = ($e.north - te.south) * ue, Cartesian4.clone( + Oe, + le.localizedCartographicLimitRectangle + ), J.x = (ae.west - te.west) * ie, J.y = (ae.south - te.south) * ue, J.z = (ae.east - te.west) * ie, J.w = (ae.north - te.south) * ue, Cartesian4.clone( + J, + le.localizedTranslucencyRectangle + ); + const me = M && CesiumMath.fog(t._distance, n.fog.density) > CesiumMath.EPSILON3; + F = F && (me || R); + let Se = !1, we = !1, Ee = !1, Ve = !1, We = !1, Ne = !1, Ae = !1, ke = !1, Fe = !1, Je = !1; + for (; j < s && de < ce; ) { + const ze = fe[de], Ke = ze.readyImagery; + if (++de, !defined(Ke) || Ke.imageryLayer.alpha === 0) + continue; + const Ye = ze.useWebMercatorT ? Ke.textureWebMercator : Ke.texture, Ue = Ke.imageryLayer; + defined(ze.textureTranslationAndScale) || (ze.textureTranslationAndScale = Ue._calculateTextureTranslationAndScale( + t, + ze + )), le.dayTextures[j] = Ye, le.dayTextureTranslationAndScale[j] = ze.textureTranslationAndScale, le.dayTextureTexCoordsRectangle[j] = ze.textureCoordinateRectangle, le.dayTextureUseWebMercatorT[j] = ze.useWebMercatorT, le.dayTextureAlpha[j] = Ue.alpha, Ne = Ne || le.dayTextureAlpha[j] !== 1, le.dayTextureNightAlpha[j] = Ue.nightAlpha, Ae = Ae || le.dayTextureNightAlpha[j] !== 1, le.dayTextureDayAlpha[j] = Ue.dayAlpha, Ae = Ae || le.dayTextureDayAlpha[j] !== 1, le.dayTextureBrightness[j] = Ue.brightness, Se = Se || le.dayTextureBrightness[j] !== ImageryLayer.DEFAULT_BRIGHTNESS, le.dayTextureContrast[j] = Ue.contrast, we = we || le.dayTextureContrast[j] !== ImageryLayer.DEFAULT_CONTRAST, le.dayTextureHue[j] = Ue.hue, Ee = Ee || le.dayTextureHue[j] !== ImageryLayer.DEFAULT_HUE, le.dayTextureSaturation[j] = Ue.saturation, Ve = Ve || le.dayTextureSaturation[j] !== ImageryLayer.DEFAULT_SATURATION, le.dayTextureOneOverGamma[j] = 1 / Ue.gamma, We = We || le.dayTextureOneOverGamma[j] !== 1 / ImageryLayer.DEFAULT_GAMMA, le.dayTextureSplit[j] = Ue.splitDirection, ke = ke || le.dayTextureSplit[j] !== 0; + let et = le.dayTextureCutoutRectangles[j]; + if (defined(et) || (et = le.dayTextureCutoutRectangles[j] = new Cartesian4()), Cartesian4.clone(Cartesian4.ZERO, et), defined(Ue.cutoutRectangle)) { + const Ie = clipRectangleAntimeridian( + te, + Ue.cutoutRectangle + ), _e = Rectangle.simpleIntersection( + Ie, + te, + rectangleIntersectionScratch + ); + Fe = defined(_e) || Fe, et.x = (Ie.west - te.west) * ie, et.y = (Ie.south - te.south) * ue, et.z = (Ie.east - te.west) * ie, et.w = (Ie.north - te.south) * ue; + } + let tt = le.colorsToAlpha[j]; + defined(tt) || (tt = le.colorsToAlpha[j] = new Cartesian4()); + const nt = defined(Ue.colorToAlpha) && Ue.colorToAlphaThreshold > 0; + if (Je = Je || nt, nt) { + const Ie = Ue.colorToAlpha; + tt.x = Ie.red, tt.y = Ie.green, tt.z = Ie.blue, tt.w = Ue.colorToAlphaThreshold; + } else + tt.w = -1; + if (defined(Ke.credits)) { + const Ie = Ke.credits; + for (let _e = 0, Y = Ie.length; _e < Y; ++_e) + r.addCreditToNextFrame(Ie[_e]); + } + ++j; + } + le.dayTextures.length = j, le.waterMask = c, Cartesian4.clone( + l, + le.waterMaskTranslationAndScale + ), le.minMaxHeight.x = k.minimumHeight, le.minMaxHeight.y = k.maximumHeight, Matrix4.clone(k.matrix, le.scaleAndBias); + const ve = e._clippingPlanes, Le = defined(ve) && ve.enabled && t.isClipped; + Le && (le.clippingPlanesEdgeColor = Color.clone( + ve.edgeColor, + le.clippingPlanesEdgeColor + ), le.clippingPlanesEdgeWidth = ve.edgeWidth); + const rt = e._clippingPolygons, Be = defined(rt) && rt.enabled && t.isClipped; + X.numberOfDayTextures = j, X.applyBrightness = Se, X.applyContrast = we, X.applyHue = Ee, X.applySaturation = Ve, X.applyGamma = We, X.applyAlpha = Ne, X.applyDayNightAlpha = Ae, X.applySplit = ke, X.enableFog = me, X.enableClippingPlanes = Le, X.clippingPlanes = ve, X.enableClippingPolygons = Be, X.clippingPolygons = rt, X.hasImageryLayerCutout = Fe, X.colorCorrect = F, X.highlightFillTile = He, X.colorToAlpha = Je, X.showUndergroundColor = T, X.translucent = h; + let Ze = i.renderedMesh.indices.length; + ye || (Ze = i.renderedMesh.indexCountWithoutSkirts), se.shaderProgram = e._surfaceShaderSet.getShaderProgram( + X + ), se.castShadows = L, se.receiveShadows = g, se.renderState = pe, se.primitiveType = PrimitiveType$1.TRIANGLES, se.vertexArray = i.vertexArray || i.fill.vertexArray, se.count = Ze, se.uniformMap = Pe, se.pass = Pass$1.GLOBE, e._debug.wireframe && (createWireframeVertexArrayIfNecessary(xe, e, t), defined(i.wireframeVertexArray) && (se.vertexArray = i.wireframeVertexArray, se.primitiveType = PrimitiveType$1.LINES, se.count = Ze * 2)); + let je = se.boundingVolume; + const at = se.orientedBoundingBox; + n.mode !== SceneMode$1.SCENE3D ? (BoundingSphere.fromRectangleWithHeights2D( + t.rectangle, + n.mapProjection, + $.minimumHeight, + $.maximumHeight, + je + ), Cartesian3.fromElements( + je.center.z, + je.center.x, + je.center.y, + je.center + ), n.mode === SceneMode$1.MORPHING && (je = BoundingSphere.union( + $.boundingSphere, + je, + je + ))) : (se.boundingVolume = BoundingSphere.clone( + $.boundingSphere, + je + ), se.orientedBoundingBox = OrientedBoundingBox.clone( + $.boundingVolume, + at + )), se.dirty = !0, h && f.updateDerivedCommands(se, n), pushCommand(se, n), pe = be, Te = otherPassesInitialColor; + } while (de < ce); +} +function GlobeTranslucency() { + this._enabled = !1, this._frontFaceAlpha = 1, this._frontFaceAlphaByDistance = void 0, this._backFaceAlpha = 1, this._backFaceAlphaByDistance = void 0, this._rectangle = Rectangle.clone(Rectangle.MAX_VALUE); +} +Object.defineProperties(GlobeTranslucency.prototype, { + /** + * When true, the globe is rendered as a translucent surface. + * <br /><br /> + * The alpha is computed by blending {@link Globe#material}, {@link Globe#imageryLayers}, + * and {@link Globe#baseColor}, all of which may contain translucency, and then multiplying by + * {@link GlobeTranslucency#frontFaceAlpha} and {@link GlobeTranslucency#frontFaceAlphaByDistance} for front faces and + * {@link GlobeTranslucency#backFaceAlpha} and {@link GlobeTranslucency#backFaceAlphaByDistance} for back faces. + * When the camera is underground back faces and front faces are swapped, i.e. back-facing geometry + * is considered front facing. + * <br /><br /> + * Translucency is disabled by default. + * + * @memberof GlobeTranslucency.prototype + * + * @type {boolean} + * @default false + * + * @see GlobeTranslucency#frontFaceAlpha + * @see GlobeTranslucency#frontFaceAlphaByDistance + * @see GlobeTranslucency#backFaceAlpha + * @see GlobeTranslucency#backFaceAlphaByDistance + */ + enabled: { + get: function() { + return this._enabled; + }, + set: function(e) { + this._enabled = e; + } + }, + /** + * A constant translucency to apply to front faces of the globe. + * <br /><br /> + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * + * @memberof GlobeTranslucency.prototype + * + * @type {number} + * @default 1.0 + * + * @see GlobeTranslucency#enabled + * @see GlobeTranslucency#frontFaceAlphaByDistance + * + * @example + * // Set front face translucency to 0.5. + * globe.translucency.frontFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + frontFaceAlpha: { + get: function() { + return this._frontFaceAlpha; + }, + set: function(e) { + this._frontFaceAlpha = e; + } + }, + /** + * Gets or sets near and far translucency properties of front faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * frontFaceAlphaByDistance will be disabled. + * <br /><br /> + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * + * @memberof GlobeTranslucency.prototype + * + * @type {NearFarScalar} + * @default undefined + * + * @see GlobeTranslucency#enabled + * @see GlobeTranslucency#frontFaceAlpha + * + * @example + * // Example 1. + * // Set front face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * + * @example + * // Example 2. + * // Disable front face translucency by distance + * globe.translucency.frontFaceAlphaByDistance = undefined; + */ + frontFaceAlphaByDistance: { + get: function() { + return this._frontFaceAlphaByDistance; + }, + set: function(e) { + this._frontFaceAlphaByDistance = NearFarScalar.clone( + e, + this._frontFaceAlphaByDistance + ); + } + }, + /** + * A constant translucency to apply to back faces of the globe. + * <br /><br /> + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * + * @memberof GlobeTranslucency.prototype + * + * @type {number} + * @default 1.0 + * + * @see GlobeTranslucency#enabled + * @see GlobeTranslucency#backFaceAlphaByDistance + * + * @example + * // Set back face translucency to 0.5. + * globe.translucency.backFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + backFaceAlpha: { + get: function() { + return this._backFaceAlpha; + }, + set: function(e) { + this._backFaceAlpha = e; + } + }, + /** + * Gets or sets near and far translucency properties of back faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * backFaceAlphaByDistance will be disabled. + * <br /><br /> + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * + * @memberof GlobeTranslucency.prototype + * + * @type {NearFarScalar} + * @default undefined + * + * @see GlobeTranslucency#enabled + * @see GlobeTranslucency#backFaceAlpha + * + * @example + * // Example 1. + * // Set back face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.backFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * + * @example + * // Example 2. + * // Disable back face translucency by distance + * globe.translucency.backFaceAlphaByDistance = undefined; + */ + backFaceAlphaByDistance: { + get: function() { + return this._backFaceAlphaByDistance; + }, + set: function(e) { + this._backFaceAlphaByDistance = NearFarScalar.clone( + e, + this._backFaceAlphaByDistance + ); + } + }, + /** + * A property specifying a {@link Rectangle} used to limit translucency to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + * + * @memberof GlobeTranslucency.prototype + * + * @type {Rectangle} + * @default {@link Rectangle.MAX_VALUE} + */ + rectangle: { + get: function() { + return this._rectangle; + }, + set: function(e) { + defined(e) || (e = Rectangle.clone(Rectangle.MAX_VALUE)), Rectangle.clone(e, this._rectangle); + } + } +}); +function ImageryLayerCollection() { + this._layers = [], this.layerAdded = new Event(), this.layerRemoved = new Event(), this.layerMoved = new Event(), this.layerShownOrHidden = new Event(); +} +Object.defineProperties(ImageryLayerCollection.prototype, { + /** + * Gets the number of layers in this collection. + * @memberof ImageryLayerCollection.prototype + * @type {number} + */ + length: { + get: function() { + return this._layers.length; + } + } +}); +ImageryLayerCollection.prototype.add = function(e, t) { + defined(t) ? this._layers.splice(t, 0, e) : (t = this._layers.length, this._layers.push(e)), this._update(), this.layerAdded.raiseEvent(e, t); + const i = e.readyEvent.addEventListener(() => { + this.layerShownOrHidden.raiseEvent(e, e._layerIndex, e.show), i(); + }); +}; +ImageryLayerCollection.prototype.addImageryProvider = function(e, t) { + const n = new ImageryLayer(e); + return this.add(n, t), n; +}; +ImageryLayerCollection.prototype.remove = function(e, t) { + t = defaultValue(t, !0); + const n = this._layers.indexOf(e); + return n !== -1 ? (this._layers.splice(n, 1), this._update(), this.layerRemoved.raiseEvent(e, n), t && e.destroy(), !0) : !1; +}; +ImageryLayerCollection.prototype.removeAll = function(e) { + e = defaultValue(e, !0); + const t = this._layers; + for (let n = 0, i = t.length; n < i; n++) { + const r = t[n]; + this.layerRemoved.raiseEvent(r, n), e && r.destroy(); + } + this._layers = []; +}; +ImageryLayerCollection.prototype.contains = function(e) { + return this.indexOf(e) !== -1; +}; +ImageryLayerCollection.prototype.indexOf = function(e) { + return this._layers.indexOf(e); +}; +ImageryLayerCollection.prototype.get = function(e) { + return this._layers[e]; +}; +function getLayerIndex(e, t) { + return e.indexOf(t); +} +function swapLayers(e, t, n) { + const i = e._layers; + if (t = CesiumMath.clamp(t, 0, i.length - 1), n = CesiumMath.clamp(n, 0, i.length - 1), t === n) + return; + const r = i[t]; + i[t] = i[n], i[n] = r, e._update(), e.layerMoved.raiseEvent(r, n, t); +} +ImageryLayerCollection.prototype.raise = function(e) { + const t = getLayerIndex(this._layers, e); + swapLayers(this, t, t + 1); +}; +ImageryLayerCollection.prototype.lower = function(e) { + const t = getLayerIndex(this._layers, e); + swapLayers(this, t, t - 1); +}; +ImageryLayerCollection.prototype.raiseToTop = function(e) { + const t = getLayerIndex(this._layers, e); + t !== this._layers.length - 1 && (this._layers.splice(t, 1), this._layers.push(e), this._update(), this.layerMoved.raiseEvent(e, this._layers.length - 1, t)); +}; +ImageryLayerCollection.prototype.lowerToBottom = function(e) { + const t = getLayerIndex(this._layers, e); + t !== 0 && (this._layers.splice(t, 1), this._layers.splice(0, 0, e), this._update(), this.layerMoved.raiseEvent(e, 0, t)); +}; +const applicableRectangleScratch = new Rectangle(); +function pickImageryHelper(e, t, n, i) { + const r = e.globe._surface._tilesToRender; + let o; + for (let c = 0; !defined(o) && c < r.length; ++c) { + const l = r[c]; + Rectangle.contains(l.rectangle, t) && (o = l); + } + if (!defined(o)) + return; + const s = o.data.imagery; + for (let c = s.length - 1; c >= 0; --c) { + const l = s[c], d = l.readyImagery; + if (!defined(d) || !d.imageryLayer.ready) + continue; + const f = d.imageryLayer.imageryProvider; + if (n && !defined(f.pickFeatures) || !Rectangle.contains(d.rectangle, t)) + continue; + const h = applicableRectangleScratch, p = 1 / 1024; + h.west = CesiumMath.lerp( + o.rectangle.west, + o.rectangle.east, + l.textureCoordinateRectangle.x - p + ), h.east = CesiumMath.lerp( + o.rectangle.west, + o.rectangle.east, + l.textureCoordinateRectangle.z + p + ), h.south = CesiumMath.lerp( + o.rectangle.south, + o.rectangle.north, + l.textureCoordinateRectangle.y - p + ), h.north = CesiumMath.lerp( + o.rectangle.south, + o.rectangle.north, + l.textureCoordinateRectangle.w + p + ), Rectangle.contains(h, t) && i(d); + } +} +ImageryLayerCollection.prototype.pickImageryLayers = function(e, t) { + const n = t.globe.pick(e, t); + if (!defined(n)) + return; + const i = t.ellipsoid.cartesianToCartographic( + n + ), r = []; + if (pickImageryHelper(t, i, !1, function(o) { + r.push(o.imageryLayer); + }), r.length !== 0) + return r; +}; +ImageryLayerCollection.prototype.pickImageryLayerFeatures = function(e, t) { + const n = t.globe.pick(e, t); + if (!defined(n)) + return; + const i = t.ellipsoid.cartesianToCartographic( + n + ), r = [], o = []; + if (pickImageryHelper(t, i, !0, function(s) { + if (!s.imageryLayer.ready) + return; + const l = s.imageryLayer.imageryProvider.pickFeatures( + s.x, + s.y, + s.level, + i.longitude, + i.latitude + ); + defined(l) && (r.push(l), o.push(s.imageryLayer)); + }), r.length !== 0) + return Promise.all(r).then(function(s) { + const c = []; + for (let l = 0; l < s.length; ++l) { + const d = s[l], f = o[l]; + if (defined(d) && d.length > 0) + for (let h = 0; h < d.length; ++h) { + const p = d[h]; + p.imageryLayer = f, defined(p.position) || (p.position = i), c.push(p); + } + } + return c; + }); +}; +ImageryLayerCollection.prototype.queueReprojectionCommands = function(e) { + const t = this._layers; + for (let n = 0, i = t.length; n < i; ++n) + t[n].queueReprojectionCommands(e); +}; +ImageryLayerCollection.prototype.cancelReprojections = function() { + const e = this._layers; + for (let t = 0, n = e.length; t < n; ++t) + e[t].cancelReprojections(); +}; +ImageryLayerCollection.prototype.isDestroyed = function() { + return !1; +}; +ImageryLayerCollection.prototype.destroy = function() { + return this.removeAll(!0), destroyObject(this); +}; +ImageryLayerCollection.prototype._update = function() { + let e = !0; + const t = this._layers; + let n, i, r, o; + for (r = 0, o = t.length; r < o; ++r) + i = t[r], i._layerIndex = r, i.show ? (i._isBaseLayer = e, e = !1) : i._isBaseLayer = !1, i.show !== i._show && (defined(i._show) && (defined(n) || (n = []), n.push(i)), i._show = i.show); + if (defined(n)) + for (r = 0, o = n.length; r < o; ++r) + i = n[r], this.layerShownOrHidden.raiseEvent(i, i._layerIndex, i.show); +}; +function QuadtreeOccluders(e) { + this._ellipsoid = new EllipsoidalOccluder(e.ellipsoid, Cartesian3.ZERO); +} +Object.defineProperties(QuadtreeOccluders.prototype, { + /** + * Gets the {@link EllipsoidalOccluder} that can be used to determine if a point is + * occluded by an {@link Ellipsoid}. + * @type {EllipsoidalOccluder} + * @memberof QuadtreeOccluders.prototype + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +function QuadtreeTile(e) { + this._tilingScheme = e.tilingScheme, this._x = e.x, this._y = e.y, this._level = e.level, this._parent = e.parent, this._rectangle = this._tilingScheme.tileXYToRectangle( + this._x, + this._y, + this._level + ), this._southwestChild = void 0, this._southeastChild = void 0, this._northwestChild = void 0, this._northeastChild = void 0, this.replacementPrevious = void 0, this.replacementNext = void 0, this._distance = 0, this._loadPriority = 0, this._customData = [], this._frameUpdated = void 0, this._lastSelectionResult = TileSelectionResult.NONE, this._lastSelectionResultFrame = void 0, this._loadedCallbacks = {}, this.state = QuadtreeTileLoadState$1.START, this.renderable = !1, this.upsampledFromParent = !1, this.data = void 0; +} +QuadtreeTile.createLevelZeroTiles = function(e) { + const t = e.getNumberOfXTilesAtLevel(0), n = e.getNumberOfYTilesAtLevel(0), i = new Array(t * n); + let r = 0; + for (let o = 0; o < n; ++o) + for (let s = 0; s < t; ++s) + i[r++] = new QuadtreeTile({ + tilingScheme: e, + x: s, + y: o, + level: 0 + }); + return i; +}; +QuadtreeTile.prototype._updateCustomData = function(e, t, n) { + let i = this.customData, r, o, s; + if (defined(t) && defined(n)) { + for (i = i.filter(function(c) { + return n.indexOf(c) === -1; + }), this._customData = i, s = this._rectangle, r = 0; r < t.length; ++r) + o = t[r], Rectangle.contains(s, o.positionCartographic) && i.push(o); + this._frameUpdated = e; + } else { + const c = this._parent; + if (defined(c) && this._frameUpdated !== c._frameUpdated) { + i.length = 0, s = this._rectangle; + const l = c.customData; + for (r = 0; r < l.length; ++r) + o = l[r], Rectangle.contains(s, o.positionCartographic) && i.push(o); + this._frameUpdated = c._frameUpdated; + } + } +}; +Object.defineProperties(QuadtreeTile.prototype, { + /** + * Gets the tiling scheme used to tile the surface. + * @memberof QuadtreeTile.prototype + * @type {TilingScheme} + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the tile X coordinate. + * @memberof QuadtreeTile.prototype + * @type {number} + */ + x: { + get: function() { + return this._x; + } + }, + /** + * Gets the tile Y coordinate. + * @memberof QuadtreeTile.prototype + * @type {number} + */ + y: { + get: function() { + return this._y; + } + }, + /** + * Gets the level-of-detail, where zero is the coarsest, least-detailed. + * @memberof QuadtreeTile.prototype + * @type {number} + */ + level: { + get: function() { + return this._level; + } + }, + /** + * Gets the parent tile of this tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + parent: { + get: function() { + return this._parent; + } + }, + /** + * Gets the cartographic rectangle of the tile, with north, south, east and + * west properties in radians. + * @memberof QuadtreeTile.prototype + * @type {Rectangle} + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * An array of tiles that is at the next level of the tile tree. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile[]} + */ + children: { + get: function() { + return [ + this.northwestChild, + this.northeastChild, + this.southwestChild, + this.southeastChild + ]; + } + }, + /** + * Gets the southwest child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + southwestChild: { + get: function() { + return defined(this._southwestChild) || (this._southwestChild = new QuadtreeTile({ + tilingScheme: this.tilingScheme, + x: this.x * 2, + y: this.y * 2 + 1, + level: this.level + 1, + parent: this + })), this._southwestChild; + } + }, + /** + * Gets the southeast child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + southeastChild: { + get: function() { + return defined(this._southeastChild) || (this._southeastChild = new QuadtreeTile({ + tilingScheme: this.tilingScheme, + x: this.x * 2 + 1, + y: this.y * 2 + 1, + level: this.level + 1, + parent: this + })), this._southeastChild; + } + }, + /** + * Gets the northwest child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + northwestChild: { + get: function() { + return defined(this._northwestChild) || (this._northwestChild = new QuadtreeTile({ + tilingScheme: this.tilingScheme, + x: this.x * 2, + y: this.y * 2, + level: this.level + 1, + parent: this + })), this._northwestChild; + } + }, + /** + * Gets the northeast child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + northeastChild: { + get: function() { + return defined(this._northeastChild) || (this._northeastChild = new QuadtreeTile({ + tilingScheme: this.tilingScheme, + x: this.x * 2 + 1, + y: this.y * 2, + level: this.level + 1, + parent: this + })), this._northeastChild; + } + }, + /** + * An array of objects associated with this tile. + * @memberof QuadtreeTile.prototype + * @type {Array} + */ + customData: { + get: function() { + return this._customData; + } + }, + /** + * Gets a value indicating whether or not this tile needs further loading. + * This property will return true if the {@link QuadtreeTile#state} is + * <code>START</code> or <code>LOADING</code>. + * @memberof QuadtreeTile.prototype + * @type {boolean} + */ + needsLoading: { + get: function() { + return this.state < QuadtreeTileLoadState$1.DONE; + } + }, + /** + * Gets a value indicating whether or not this tile is eligible to be unloaded. + * Typically, a tile is ineligible to be unloaded while an asynchronous operation, + * such as a request for data, is in progress on it. A tile will never be + * unloaded while it is needed for rendering, regardless of the value of this + * property. If {@link QuadtreeTile#data} is defined and has an + * <code>eligibleForUnloading</code> property, the value of that property is returned. + * Otherwise, this property returns true. + * @memberof QuadtreeTile.prototype + * @type {boolean} + */ + eligibleForUnloading: { + get: function() { + let e = !0; + return defined(this.data) && (e = this.data.eligibleForUnloading, defined(e) || (e = !0)), e; + } + } +}); +QuadtreeTile.prototype.findLevelZeroTile = function(e, t, n) { + const i = this.tilingScheme.getNumberOfXTilesAtLevel(0); + if (t < 0 ? t += i : t >= i && (t -= i), !(n < 0 || n >= this.tilingScheme.getNumberOfYTilesAtLevel(0))) + return e.filter(function(r) { + return r.x === t && r.y === n; + })[0]; +}; +QuadtreeTile.prototype.findTileToWest = function(e) { + const t = this.parent; + if (t === void 0) + return this.findLevelZeroTile(e, this.x - 1, this.y); + if (t.southeastChild === this) + return t.southwestChild; + if (t.northeastChild === this) + return t.northwestChild; + const n = t.findTileToWest(e); + if (n !== void 0) + return t.southwestChild === this ? n.southeastChild : n.northeastChild; +}; +QuadtreeTile.prototype.findTileToEast = function(e) { + const t = this.parent; + if (t === void 0) + return this.findLevelZeroTile(e, this.x + 1, this.y); + if (t.southwestChild === this) + return t.southeastChild; + if (t.northwestChild === this) + return t.northeastChild; + const n = t.findTileToEast(e); + if (n !== void 0) + return t.southeastChild === this ? n.southwestChild : n.northwestChild; +}; +QuadtreeTile.prototype.findTileToSouth = function(e) { + const t = this.parent; + if (t === void 0) + return this.findLevelZeroTile(e, this.x, this.y + 1); + if (t.northwestChild === this) + return t.southwestChild; + if (t.northeastChild === this) + return t.southeastChild; + const n = t.findTileToSouth(e); + if (n !== void 0) + return t.southwestChild === this ? n.northwestChild : n.northeastChild; +}; +QuadtreeTile.prototype.findTileToNorth = function(e) { + const t = this.parent; + if (t === void 0) + return this.findLevelZeroTile(e, this.x, this.y - 1); + if (t.southwestChild === this) + return t.northwestChild; + if (t.southeastChild === this) + return t.northeastChild; + const n = t.findTileToNorth(e); + if (n !== void 0) + return t.northwestChild === this ? n.southwestChild : n.southeastChild; +}; +QuadtreeTile.prototype.freeResources = function() { + this.state = QuadtreeTileLoadState$1.START, this.renderable = !1, this.upsampledFromParent = !1, defined(this.data) && defined(this.data.freeResources) && this.data.freeResources(), freeTile(this._southwestChild), this._southwestChild = void 0, freeTile(this._southeastChild), this._southeastChild = void 0, freeTile(this._northwestChild), this._northwestChild = void 0, freeTile(this._northeastChild), this._northeastChild = void 0; +}; +function freeTile(e) { + defined(e) && e.freeResources(); +} +function TileReplacementQueue() { + this.head = void 0, this.tail = void 0, this.count = 0, this._lastBeforeStartOfFrame = void 0; +} +TileReplacementQueue.prototype.markStartOfRenderFrame = function() { + this._lastBeforeStartOfFrame = this.head; +}; +TileReplacementQueue.prototype.trimTiles = function(e) { + let t = this.tail, n = !0; + for (; n && defined(this._lastBeforeStartOfFrame) && this.count > e && defined(t); ) { + n = t !== this._lastBeforeStartOfFrame; + const i = t.replacementPrevious; + t.eligibleForUnloading && (t.freeResources(), remove(this, t)), t = i; + } +}; +function remove(e, t) { + const n = t.replacementPrevious, i = t.replacementNext; + t === e._lastBeforeStartOfFrame && (e._lastBeforeStartOfFrame = i), t === e.head ? e.head = i : n.replacementNext = i, t === e.tail ? e.tail = n : i.replacementPrevious = n, t.replacementPrevious = void 0, t.replacementNext = void 0, --e.count; +} +TileReplacementQueue.prototype.markTileRendered = function(e) { + const t = this.head; + if (t === e) { + e === this._lastBeforeStartOfFrame && (this._lastBeforeStartOfFrame = e.replacementNext); + return; + } + if (++this.count, !defined(t)) { + e.replacementPrevious = void 0, e.replacementNext = void 0, this.head = e, this.tail = e; + return; + } + (defined(e.replacementPrevious) || defined(e.replacementNext)) && remove(this, e), e.replacementPrevious = void 0, e.replacementNext = t, t.replacementPrevious = e, this.head = e; +}; +function QuadtreePrimitive(e) { + this._tileProvider = e.tileProvider, this._tileProvider.quadtree = this, this._debug = { + enableDebugOutput: !1, + maxDepth: 0, + maxDepthVisited: 0, + tilesVisited: 0, + tilesCulled: 0, + tilesRendered: 0, + tilesWaitingForChildren: 0, + lastMaxDepth: -1, + lastMaxDepthVisited: -1, + lastTilesVisited: -1, + lastTilesCulled: -1, + lastTilesRendered: -1, + lastTilesWaitingForChildren: -1, + suspendLodUpdate: !1 + }; + const n = this._tileProvider.tilingScheme.ellipsoid; + this._tilesToRender = [], this._tileLoadQueueHigh = [], this._tileLoadQueueMedium = [], this._tileLoadQueueLow = [], this._tileReplacementQueue = new TileReplacementQueue(), this._levelZeroTiles = void 0, this._loadQueueTimeSlice = 5, this._tilesInvalidated = !1, this._addHeightCallbacks = [], this._removeHeightCallbacks = [], this._tileToUpdateHeights = [], this._lastTileIndex = 0, this._updateHeightsTimeSlice = 2, this._cameraPositionCartographic = void 0, this._cameraReferenceFrameOriginCartographic = void 0, this.maximumScreenSpaceError = defaultValue( + e.maximumScreenSpaceError, + 2 + ), this.tileCacheSize = defaultValue(e.tileCacheSize, 100), this.loadingDescendantLimit = 20, this.preloadAncestors = !0, this.preloadSiblings = !1, this._occluders = new QuadtreeOccluders({ + ellipsoid: n + }), this._tileLoadProgressEvent = new Event(), this._lastTileLoadQueueLength = 0, this._lastSelectionFrameNumber = void 0; +} +Object.defineProperties(QuadtreePrimitive.prototype, { + /** + * Gets the provider of {@link QuadtreeTile} instances for this quadtree. + * @type {QuadtreeTile} + * @memberof QuadtreePrimitive.prototype + */ + tileProvider: { + get: function() { + return this._tileProvider; + } + }, + /** + * Gets an event that's raised when the length of the tile load queue has changed since the last render frame. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. The event passes the new length of the tile load queue. + * + * @memberof QuadtreePrimitive.prototype + * @type {Event} + */ + tileLoadProgressEvent: { + get: function() { + return this._tileLoadProgressEvent; + } + }, + occluders: { + get: function() { + return this._occluders; + } + } +}); +QuadtreePrimitive.prototype.invalidateAllTiles = function() { + this._tilesInvalidated = !0; +}; +function invalidateAllTiles(e) { + const t = e._tileReplacementQueue; + t.head = void 0, t.tail = void 0, t.count = 0, clearTileLoadQueue(e); + const n = e._levelZeroTiles; + if (defined(n)) + for (let i = 0; i < n.length; ++i) { + const o = n[i].customData, s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c]; + l.level = 0, e._addHeightCallbacks.push(l); + } + n[i].freeResources(); + } + e._levelZeroTiles = void 0, e._tileProvider.cancelReprojections(); +} +QuadtreePrimitive.prototype.forEachLoadedTile = function(e) { + let t = this._tileReplacementQueue.head; + for (; defined(t); ) + t.state !== QuadtreeTileLoadState$1.START && e(t), t = t.replacementNext; +}; +QuadtreePrimitive.prototype.forEachRenderedTile = function(e) { + const t = this._tilesToRender; + for (let n = 0, i = t.length; n < i; ++n) + e(t[n]); +}; +QuadtreePrimitive.prototype.updateHeight = function(e, t) { + const n = this, i = { + positionOnEllipsoidSurface: void 0, + positionCartographic: e, + level: -1, + callback: t + }; + return i.removeFunc = function() { + const r = n._addHeightCallbacks, o = r.length; + for (let s = 0; s < o; ++s) + if (r[s] === i) { + r.splice(s, 1); + break; + } + n._removeHeightCallbacks.push(i), i.callback && (i.callback = void 0); + }, n._addHeightCallbacks.push(i), i.removeFunc; +}; +QuadtreePrimitive.prototype.update = function(e) { + defined(this._tileProvider.update) && this._tileProvider.update(e); +}; +function clearTileLoadQueue(e) { + const t = e._debug; + t.maxDepth = 0, t.maxDepthVisited = 0, t.tilesVisited = 0, t.tilesCulled = 0, t.tilesRendered = 0, t.tilesWaitingForChildren = 0, e._tileLoadQueueHigh.length = 0, e._tileLoadQueueMedium.length = 0, e._tileLoadQueueLow.length = 0; +} +QuadtreePrimitive.prototype.beginFrame = function(e) { + e.passes.render && (this._tilesInvalidated && (invalidateAllTiles(this), this._tilesInvalidated = !1), this._tileProvider.initialize(e), clearTileLoadQueue(this), !this._debug.suspendLodUpdate && this._tileReplacementQueue.markStartOfRenderFrame()); +}; +QuadtreePrimitive.prototype.render = function(e) { + const t = e.passes, n = this._tileProvider; + t.render && (n.beginUpdate(e), selectTilesForRendering(this, e), createRenderCommandsForSelectedTiles(this, e), n.endUpdate(e)), t.pick && this._tilesToRender.length > 0 && n.updateForPick(e); +}; +function updateTileLoadProgress(e, t) { + const n = e._tileLoadQueueHigh.length + e._tileLoadQueueMedium.length + e._tileLoadQueueLow.length; + if (n !== e._lastTileLoadQueueLength || e._tilesInvalidated) { + const r = Event.prototype.raiseEvent.bind( + e._tileLoadProgressEvent, + n + ); + t.afterRender.push(() => (r(), !0)), e._lastTileLoadQueueLength = n; + } + const i = e._debug; + i.enableDebugOutput && !i.suspendLodUpdate && (i.maxDepth = e._tilesToRender.reduce(function(r, o) { + return Math.max(r, o.level); + }, -1), i.tilesRendered = e._tilesToRender.length, (i.tilesVisited !== i.lastTilesVisited || i.tilesRendered !== i.lastTilesRendered || i.tilesCulled !== i.lastTilesCulled || i.maxDepth !== i.lastMaxDepth || i.tilesWaitingForChildren !== i.lastTilesWaitingForChildren || i.maxDepthVisited !== i.lastMaxDepthVisited) && (console.log( + `Visited ${i.tilesVisited}, Rendered: ${i.tilesRendered}, Culled: ${i.tilesCulled}, Max Depth Rendered: ${i.maxDepth}, Max Depth Visited: ${i.maxDepthVisited}, Waiting for children: ${i.tilesWaitingForChildren}` + ), i.lastTilesVisited = i.tilesVisited, i.lastTilesRendered = i.tilesRendered, i.lastTilesCulled = i.tilesCulled, i.lastMaxDepth = i.maxDepth, i.lastTilesWaitingForChildren = i.tilesWaitingForChildren, i.lastMaxDepthVisited = i.maxDepthVisited)); +} +QuadtreePrimitive.prototype.endFrame = function(e) { + !e.passes.render || e.mode === SceneMode$1.MORPHING || (processTileLoadQueue(this, e), updateHeights(this, e), updateTileLoadProgress(this, e)); +}; +QuadtreePrimitive.prototype.isDestroyed = function() { + return !1; +}; +QuadtreePrimitive.prototype.destroy = function() { + this._tileProvider = this._tileProvider && this._tileProvider.destroy(); +}; +let comparisonPoint; +const centerScratch$1 = new Cartographic(); +function compareDistanceToPoint(e, t) { + let n = Rectangle.center(e.rectangle, centerScratch$1); + const i = n.longitude - comparisonPoint.longitude, r = n.latitude - comparisonPoint.latitude; + n = Rectangle.center(t.rectangle, centerScratch$1); + const o = n.longitude - comparisonPoint.longitude, s = n.latitude - comparisonPoint.latitude; + return i * i + r * r - (o * o + s * s); +} +const cameraOriginScratch = new Cartesian3(); +let rootTraversalDetails = []; +function selectTilesForRendering(e, t) { + const n = e._debug; + if (n.suspendLodUpdate) + return; + const i = e._tilesToRender; + i.length = 0; + let r; + const o = e._tileProvider; + if (!defined(e._levelZeroTiles)) { + const y = o.tilingScheme; + if (defined(y)) { + const C = o.tilingScheme; + e._levelZeroTiles = QuadtreeTile.createLevelZeroTiles( + C + ); + const T = e._levelZeroTiles.length; + if (rootTraversalDetails.length < T) + for (rootTraversalDetails = new Array(T), r = 0; r < T; ++r) + rootTraversalDetails[r] === void 0 && (rootTraversalDetails[r] = new TraversalDetails()); + } else + return; + } + e._occluders.ellipsoid.cameraPosition = t.camera.positionWC; + let s; + const c = e._levelZeroTiles, l = c.length > 1 ? e._occluders : void 0; + comparisonPoint = t.camera.positionCartographic, c.sort(compareDistanceToPoint); + const d = e._addHeightCallbacks, f = e._removeHeightCallbacks, h = t.frameNumber; + let p; + if (d.length > 0 || f.length > 0) { + for (r = 0, p = c.length; r < p; ++r) + s = c[r], s._updateCustomData(h, d, f); + d.length = 0, f.length = 0; + } + const m = t.camera; + e._cameraPositionCartographic = m.positionCartographic; + const _ = Matrix4.getTranslation( + m.transform, + cameraOriginScratch + ); + for (e._cameraReferenceFrameOriginCartographic = e.tileProvider.tilingScheme.ellipsoid.cartesianToCartographic( + _, + e._cameraReferenceFrameOriginCartographic + ), r = 0, p = c.length; r < p; ++r) + s = c[r], e._tileReplacementQueue.markTileRendered(s), s.renderable ? visitIfVisible( + e, + s, + o, + t, + l, + !1, + rootTraversalDetails[r] + ) : (queueTileLoad(e, e._tileLoadQueueHigh, s, t), ++n.tilesWaitingForChildren); + e._lastSelectionFrameNumber = h; +} +function queueTileLoad(e, t, n, i) { + n.needsLoading && (e.tileProvider.computeTileLoadPriority !== void 0 && (n._loadPriority = e.tileProvider.computeTileLoadPriority( + n, + i + )), t.push(n)); +} +function TraversalDetails() { + this.allAreRenderable = !0, this.anyWereRenderedLastFrame = !1, this.notYetRenderableCount = 0; +} +function TraversalQuadDetails() { + this.southwest = new TraversalDetails(), this.southeast = new TraversalDetails(), this.northwest = new TraversalDetails(), this.northeast = new TraversalDetails(); +} +TraversalQuadDetails.prototype.combine = function(e) { + const t = this.southwest, n = this.southeast, i = this.northwest, r = this.northeast; + e.allAreRenderable = t.allAreRenderable && n.allAreRenderable && i.allAreRenderable && r.allAreRenderable, e.anyWereRenderedLastFrame = t.anyWereRenderedLastFrame || n.anyWereRenderedLastFrame || i.anyWereRenderedLastFrame || r.anyWereRenderedLastFrame, e.notYetRenderableCount = t.notYetRenderableCount + n.notYetRenderableCount + i.notYetRenderableCount + r.notYetRenderableCount; +}; +const traversalQuadsByLevel = new Array(31); +for (let e = 0; e < traversalQuadsByLevel.length; ++e) + traversalQuadsByLevel[e] = new TraversalQuadDetails(); +function visitTile(e, t, n, i, r) { + const o = e._debug; + ++o.tilesVisited, e._tileReplacementQueue.markTileRendered(n), n._updateCustomData(t.frameNumber), n.level > o.maxDepthVisited && (o.maxDepthVisited = n.level); + const s = screenSpaceError(e, t, n) < e.maximumScreenSpaceError, c = n.southwestChild, l = n.southeastChild, d = n.northwestChild, f = n.northeastChild, h = e._lastSelectionFrameNumber, p = n._lastSelectionResultFrame === h ? n._lastSelectionResult : TileSelectionResult.NONE, m = e.tileProvider; + if (s || i) { + const _ = TileSelectionResult.originalResult(p) === TileSelectionResult.RENDERED, y = TileSelectionResult.originalResult(p) === TileSelectionResult.CULLED || p === TileSelectionResult.NONE, C = n.state === QuadtreeTileLoadState$1.DONE; + let T = _ || y || C; + if (T || defined(m.canRenderWithoutLosingDetail) && (T = m.canRenderWithoutLosingDetail(n)), T) { + s && queueTileLoad( + e, + e._tileLoadQueueMedium, + n, + t + ), addTileToRenderList(e, n), r.allAreRenderable = n.renderable, r.anyWereRenderedLastFrame = p === TileSelectionResult.RENDERED, r.notYetRenderableCount = n.renderable ? 0 : 1, n._lastSelectionResultFrame = t.frameNumber, n._lastSelectionResult = TileSelectionResult.RENDERED, r.anyWereRenderedLastFrame || e._tileToUpdateHeights.push(n); + return; + } + i = !0, s && queueTileLoad(e, e._tileLoadQueueHigh, n, t); + } + if (m.canRefine(n)) { + if (c.upsampledFromParent && l.upsampledFromParent && d.upsampledFromParent && f.upsampledFromParent) { + addTileToRenderList(e, n), queueTileLoad( + e, + e._tileLoadQueueMedium, + n, + t + ), e._tileReplacementQueue.markTileRendered(c), e._tileReplacementQueue.markTileRendered(l), e._tileReplacementQueue.markTileRendered(d), e._tileReplacementQueue.markTileRendered(f), r.allAreRenderable = n.renderable, r.anyWereRenderedLastFrame = p === TileSelectionResult.RENDERED, r.notYetRenderableCount = n.renderable ? 0 : 1, n._lastSelectionResultFrame = t.frameNumber, n._lastSelectionResult = TileSelectionResult.RENDERED, r.anyWereRenderedLastFrame || e._tileToUpdateHeights.push(n); + return; + } + n._lastSelectionResultFrame = t.frameNumber, n._lastSelectionResult = TileSelectionResult.REFINED; + const y = e._tilesToRender.length, C = e._tileLoadQueueLow.length, T = e._tileLoadQueueMedium.length, x = e._tileLoadQueueHigh.length, b = e._tileToUpdateHeights.length; + if (visitVisibleChildrenNearToFar( + e, + c, + l, + d, + f, + t, + i, + r + ), y !== e._tilesToRender.length) { + const S = r.allAreRenderable, E = r.anyWereRenderedLastFrame, A = r.notYetRenderableCount; + let D = !1; + if (!S && !E) { + const P = e._tilesToRender; + for (let M = y; M < P.length; ++M) { + let R = P[M]; + for (; R !== void 0 && R._lastSelectionResult !== TileSelectionResult.KICKED && R !== n; ) + R._lastSelectionResult = TileSelectionResult.kick( + R._lastSelectionResult + ), R = R.parent; + } + e._tilesToRender.length = y, e._tileToUpdateHeights.length = b, addTileToRenderList(e, n), n._lastSelectionResult = TileSelectionResult.RENDERED; + const I = p === TileSelectionResult.RENDERED; + !I && A > e.loadingDescendantLimit && (e._tileLoadQueueLow.length = C, e._tileLoadQueueMedium.length = T, e._tileLoadQueueHigh.length = x, queueTileLoad( + e, + e._tileLoadQueueMedium, + n, + t + ), r.notYetRenderableCount = n.renderable ? 0 : 1, D = !0), r.allAreRenderable = n.renderable, r.anyWereRenderedLastFrame = I, I || e._tileToUpdateHeights.push(n), ++o.tilesWaitingForChildren; + } + e.preloadAncestors && !D && queueTileLoad(e, e._tileLoadQueueLow, n, t); + } + return; + } + n._lastSelectionResultFrame = t.frameNumber, n._lastSelectionResult = TileSelectionResult.RENDERED, addTileToRenderList(e, n), queueTileLoad(e, e._tileLoadQueueHigh, n, t), r.allAreRenderable = n.renderable, r.anyWereRenderedLastFrame = p === TileSelectionResult.RENDERED, r.notYetRenderableCount = n.renderable ? 0 : 1; +} +function visitVisibleChildrenNearToFar(e, t, n, i, r, o, s, c) { + if (t.level >= traversalQuadsByLevel.length) + return; + const l = o.camera.positionCartographic, d = e._tileProvider, f = e._occluders, h = traversalQuadsByLevel[t.level], p = h.southwest, m = h.southeast, _ = h.northwest, y = h.northeast; + l.longitude < t.rectangle.east ? l.latitude < t.rectangle.north ? (visitIfVisible( + e, + t, + d, + o, + f, + s, + p + ), visitIfVisible( + e, + n, + d, + o, + f, + s, + m + ), visitIfVisible( + e, + i, + d, + o, + f, + s, + _ + ), visitIfVisible( + e, + r, + d, + o, + f, + s, + y + )) : (visitIfVisible( + e, + i, + d, + o, + f, + s, + _ + ), visitIfVisible( + e, + t, + d, + o, + f, + s, + p + ), visitIfVisible( + e, + r, + d, + o, + f, + s, + y + ), visitIfVisible( + e, + n, + d, + o, + f, + s, + m + )) : l.latitude < t.rectangle.north ? (visitIfVisible( + e, + n, + d, + o, + f, + s, + m + ), visitIfVisible( + e, + t, + d, + o, + f, + s, + p + ), visitIfVisible( + e, + r, + d, + o, + f, + s, + y + ), visitIfVisible( + e, + i, + d, + o, + f, + s, + _ + )) : (visitIfVisible( + e, + r, + d, + o, + f, + s, + y + ), visitIfVisible( + e, + i, + d, + o, + f, + s, + _ + ), visitIfVisible( + e, + n, + d, + o, + f, + s, + m + ), visitIfVisible( + e, + t, + d, + o, + f, + s, + p + )), h.combine(c); +} +function containsNeededPosition(e, t) { + const n = t.rectangle; + return defined(e._cameraPositionCartographic) && Rectangle.contains(n, e._cameraPositionCartographic) || defined(e._cameraReferenceFrameOriginCartographic) && Rectangle.contains( + n, + e._cameraReferenceFrameOriginCartographic + ); +} +function visitIfVisible(e, t, n, i, r, o, s) { + if (n.computeTileVisibility(t, i, r) !== Visibility$1.NONE) + return visitTile( + e, + i, + t, + o, + s + ); + if (++e._debug.tilesCulled, e._tileReplacementQueue.markTileRendered(t), s.allAreRenderable = !0, s.anyWereRenderedLastFrame = !1, s.notYetRenderableCount = 0, containsNeededPosition(e, t)) { + (!defined(t.data) || !defined(t.data.vertexArray)) && queueTileLoad( + e, + e._tileLoadQueueMedium, + t, + i + ); + const c = e._lastSelectionFrameNumber, l = t._lastSelectionResultFrame === c ? t._lastSelectionResult : TileSelectionResult.NONE; + l !== TileSelectionResult.CULLED_BUT_NEEDED && l !== TileSelectionResult.RENDERED && e._tileToUpdateHeights.push(t), t._lastSelectionResult = TileSelectionResult.CULLED_BUT_NEEDED; + } else (e.preloadSiblings || t.level === 0) && queueTileLoad(e, e._tileLoadQueueLow, t, i), t._lastSelectionResult = TileSelectionResult.CULLED; + t._lastSelectionResultFrame = i.frameNumber; +} +function screenSpaceError(e, t, n) { + if (t.mode === SceneMode$1.SCENE2D || t.camera.frustum instanceof OrthographicFrustum || t.camera.frustum instanceof OrthographicOffCenterFrustum) + return screenSpaceError2D(e, t, n); + const i = e._tileProvider.getLevelMaximumGeometricError( + n.level + ), r = n._distance, o = t.context.drawingBufferHeight, s = t.camera.frustum.sseDenominator; + let c = i * o / (r * s); + return t.fog.enabled && (c -= CesiumMath.fog(r, t.fog.density) * t.fog.sse), c /= t.pixelRatio, c; +} +function screenSpaceError2D(e, t, n) { + let r = t.camera.frustum; + const o = r.offCenterFrustum; + defined(o) && (r = o); + const s = t.context, c = s.drawingBufferWidth, l = s.drawingBufferHeight, d = e._tileProvider.getLevelMaximumGeometricError( + n.level + ), f = Math.max(r.top - r.bottom, r.right - r.left) / Math.max(c, l); + let h = d / f; + return t.fog.enabled && t.mode !== SceneMode$1.SCENE2D && (h -= CesiumMath.fog(n._distance, t.fog.density) * t.fog.sse), h /= t.pixelRatio, h; +} +function addTileToRenderList(e, t) { + e._tilesToRender.push(t); +} +function processTileLoadQueue(e, t) { + const n = e._tileLoadQueueHigh, i = e._tileLoadQueueMedium, r = e._tileLoadQueueLow; + if (n.length === 0 && i.length === 0 && r.length === 0) + return; + e._tileReplacementQueue.trimTiles(e.tileCacheSize); + const o = getTimestamp$1() + e._loadQueueTimeSlice, s = e._tileProvider; + let c = processSinglePriorityLoadQueue( + e, + t, + s, + o, + n, + !1 + ); + c = processSinglePriorityLoadQueue( + e, + t, + s, + o, + i, + c + ), processSinglePriorityLoadQueue( + e, + t, + s, + o, + r, + c + ); +} +function sortByLoadPriority(e, t) { + return e._loadPriority - t._loadPriority; +} +function processSinglePriorityLoadQueue(e, t, n, i, r, o) { + n.computeTileLoadPriority !== void 0 && r.sort(sortByLoadPriority); + for (let s = 0, c = r.length; s < c && (getTimestamp$1() < i || !o); ++s) { + const l = r[s]; + e._tileReplacementQueue.markTileRendered(l), n.loadTile(t, l), o = !0; + } + return o; +} +const scratchRay = new Ray(), scratchCartographic$4 = new Cartographic(), scratchPosition$2 = new Cartesian3(), scratchArray$1 = []; +function updateHeights(e, t) { + if (!defined(e.tileProvider.tilingScheme)) + return; + const n = scratchArray$1; + n.length = 0; + const i = e._tileToUpdateHeights, r = getTimestamp$1(), o = e._updateHeightsTimeSlice, s = r + o, c = t.mode, l = t.mapProjection, d = e.tileProvider.tilingScheme.ellipsoid; + let f; + for (; i.length > 0; ) { + const h = i[0]; + if (!defined(h.data) || !defined(h.data.mesh)) { + const y = h._lastSelectionResultFrame === e._lastSelectionFrameNumber ? h._lastSelectionResult : TileSelectionResult.NONE; + (y === TileSelectionResult.RENDERED || y === TileSelectionResult.CULLED_BUT_NEEDED) && n.push(h), i.shift(), e._lastTileIndex = 0; + continue; + } + const p = h.customData, m = p.length; + let _ = !1; + for (f = e._lastTileIndex; f < m; ++f) { + const y = p[f], C = h.data.terrainData, T = defined(C) && C.wasCreatedByUpsampling(); + if (h.level > y.level && !T) { + if (defined(y.positionOnEllipsoidSurface) || (y.positionOnEllipsoidSurface = Cartesian3.fromRadians( + y.positionCartographic.longitude, + y.positionCartographic.latitude, + 0, + d + )), c === SceneMode$1.SCENE3D) { + const b = d.geodeticSurfaceNormal( + y.positionOnEllipsoidSurface, + scratchRay.direction + ), S = d.getSurfaceNormalIntersectionWithZAxis( + y.positionOnEllipsoidSurface, + 11500, + scratchRay.origin + ); + if (!defined(S)) { + let E = 0; + defined(h.data.tileBoundingRegion) && (E = h.data.tileBoundingRegion.minimumHeight); + const A = Math.min(E, -11500), D = Cartesian3.multiplyByScalar( + b, + Math.abs(A) + 1, + scratchPosition$2 + ); + Cartesian3.subtract( + y.positionOnEllipsoidSurface, + D, + scratchRay.origin + ); + } + } else + Cartographic.clone(y.positionCartographic, scratchCartographic$4), scratchCartographic$4.height = -11500, l.project(scratchCartographic$4, scratchPosition$2), Cartesian3.fromElements( + scratchPosition$2.z, + scratchPosition$2.x, + scratchPosition$2.y, + scratchPosition$2 + ), Cartesian3.clone(scratchPosition$2, scratchRay.origin), Cartesian3.clone(Cartesian3.UNIT_X, scratchRay.direction); + const x = h.data.pick( + scratchRay, + c, + l, + !1, + scratchPosition$2 + ); + defined(x) && (defined(y.callback) && y.callback(x), y.level = h.level); + } + if (getTimestamp$1() >= s) { + _ = !0; + break; + } + } + if (_) { + e._lastTileIndex = f; + break; + } else + e._lastTileIndex = 0, i.shift(); + } + for (f = 0; f < n.length; f++) + i.push(n[f]); +} +function createRenderCommandsForSelectedTiles(e, t) { + const n = e._tileProvider, i = e._tilesToRender; + for (let r = 0, o = i.length; r < o; ++r) { + const s = i[r]; + n.showTileThisFrame(s, t); + } +} +function Globe(e) { + e = defaultValue(e, Ellipsoid.default); + const t = new EllipsoidTerrainProvider({ + ellipsoid: e + }), n = new ImageryLayerCollection(); + this._ellipsoid = e, this._imageryLayerCollection = n, this._surfaceShaderSet = new GlobeSurfaceShaderSet(), this._material = void 0, this._surface = new QuadtreePrimitive({ + tileProvider: new GlobeSurfaceTileProvider({ + terrainProvider: t, + imageryLayers: n, + surfaceShaderSet: this._surfaceShaderSet + }) + }), this._terrainProvider = t, this._terrainProviderChanged = new Event(), this._undergroundColor = Color.clone(Color.BLACK), this._undergroundColorAlphaByDistance = new NearFarScalar( + e.maximumRadius / 1e3, + 0, + e.maximumRadius / 5, + 1 + ), this._translucency = new GlobeTranslucency(), makeShadersDirty(this), this.show = !0, this._oceanNormalMapResourceDirty = !0, this._oceanNormalMapResource = new Resource({ + url: buildModuleUrl("Assets/Textures/waterNormalsSmall.jpg") + }), this.maximumScreenSpaceError = 2, this.tileCacheSize = 100, this.loadingDescendantLimit = 20, this.preloadAncestors = !0, this.preloadSiblings = !1, this.fillHighlightColor = void 0, this.enableLighting = !1, this.lambertDiffuseMultiplier = 0.9, this.dynamicAtmosphereLighting = !0, this.dynamicAtmosphereLightingFromSun = !1, this.showGroundAtmosphere = Ellipsoid.WGS84.equals(e), this.atmosphereLightIntensity = 10, this.atmosphereRayleighCoefficient = new Cartesian3(55e-7, 13e-6, 284e-7), this.atmosphereMieCoefficient = new Cartesian3(21e-6, 21e-6, 21e-6), this.atmosphereRayleighScaleHeight = 1e4, this.atmosphereMieScaleHeight = 3200, this.atmosphereMieAnisotropy = 0.9, this.lightingFadeOutDistance = CesiumMath.PI_OVER_TWO * e.minimumRadius, this.lightingFadeInDistance = CesiumMath.PI * e.minimumRadius, this.nightFadeOutDistance = CesiumMath.PI_OVER_TWO * e.minimumRadius, this.nightFadeInDistance = 5 * CesiumMath.PI_OVER_TWO * e.minimumRadius, this.showWaterEffect = !0, this.depthTestAgainstTerrain = !1, this.shadows = ShadowMode$1.RECEIVE_ONLY, this.atmosphereHueShift = 0, this.atmosphereSaturationShift = 0, this.atmosphereBrightnessShift = 0, this.showSkirts = !0, this.backFaceCulling = !0, this._oceanNormalMap = void 0, this._zoomedOutOceanSpecularIntensity = void 0, this.vertexShadowDarkness = 0.3; +} +Object.defineProperties(Globe.prototype, { + /** + * Gets an ellipsoid describing the shape of this globe. + * @memberof Globe.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the collection of image layers that will be rendered on this globe. + * @memberof Globe.prototype + * @type {ImageryLayerCollection} + */ + imageryLayers: { + get: function() { + return this._imageryLayerCollection; + } + }, + /** + * Gets an event that's raised when an imagery layer is added, shown, hidden, moved, or removed. + * + * @memberof Globe.prototype + * @type {Event} + * @readonly + */ + imageryLayersUpdatedEvent: { + get: function() { + return this._surface.tileProvider.imageryLayersUpdatedEvent; + } + }, + /** + * Returns <code>true</code> when the tile load queue is empty, <code>false</code> otherwise. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. + * @memberof Globe.prototype + * @type {boolean} + * @readonly + */ + tilesLoaded: { + get: function() { + return defined(this._surface) ? this._surface._tileLoadQueueHigh.length === 0 && this._surface._tileLoadQueueMedium.length === 0 && this._surface._tileLoadQueueLow.length === 0 : !0; + } + }, + /** + * Gets or sets the color of the globe when no imagery is available. + * @memberof Globe.prototype + * @type {Color} + */ + baseColor: { + get: function() { + return this._surface.tileProvider.baseColor; + }, + set: function(e) { + this._surface.tileProvider.baseColor = e; + } + }, + /** + * A property specifying a {@link ClippingPlaneCollection} used to selectively disable rendering on the outside of each plane. + * + * @memberof Globe.prototype + * @type {ClippingPlaneCollection} + */ + clippingPlanes: { + get: function() { + return this._surface.tileProvider.clippingPlanes; + }, + set: function(e) { + this._surface.tileProvider.clippingPlanes = e; + } + }, + /** + * A property specifying a {@link ClippingPolygonCollection} used to selectively disable rendering inside or outside a list of polygons. + * + * @memberof Globe.prototype + * @type {ClippingPolygonCollection} + */ + clippingPolygons: { + get: function() { + return this._surface.tileProvider.clippingPolygons; + }, + set: function(e) { + this._surface.tileProvider.clippingPolygons = e; + } + }, + /** + * A property specifying a {@link Rectangle} used to limit globe rendering to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + * + * @memberof Globe.prototype + * @type {Rectangle} + * @default {@link Rectangle.MAX_VALUE} + */ + cartographicLimitRectangle: { + get: function() { + return this._surface.tileProvider.cartographicLimitRectangle; + }, + set: function(e) { + defined(e) || (e = Rectangle.clone(Rectangle.MAX_VALUE)), this._surface.tileProvider.cartographicLimitRectangle = e; + } + }, + /** + * The normal map to use for rendering waves in the ocean. Setting this property will + * only have an effect if the configured terrain provider includes a water mask. + * @memberof Globe.prototype + * @type {string} + * @default buildModuleUrl('Assets/Textures/waterNormalsSmall.jpg') + */ + oceanNormalMapUrl: { + get: function() { + return this._oceanNormalMapResource.url; + }, + set: function(e) { + this._oceanNormalMapResource.url = e, this._oceanNormalMapResourceDirty = !0; + } + }, + /** + * The terrain provider providing surface geometry for this globe. + * @type {TerrainProvider} + * + * @memberof Globe.prototype + * @type {TerrainProvider} + * + */ + terrainProvider: { + get: function() { + return this._terrainProvider; + }, + set: function(e) { + e !== this._terrainProvider && (this._terrainProvider = e, this._terrainProviderChanged.raiseEvent(e), defined(this._material) && makeShadersDirty(this)); + } + }, + /** + * Gets an event that's raised when the terrain provider is changed + * + * @memberof Globe.prototype + * @type {Event} + * @readonly + */ + terrainProviderChanged: { + get: function() { + return this._terrainProviderChanged; + } + }, + /** + * Gets an event that's raised when the length of the tile load queue has changed since the last render frame. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. The event passes the new length of the tile load queue. + * + * @memberof Globe.prototype + * @type {Event} + */ + tileLoadProgressEvent: { + get: function() { + return this._surface.tileLoadProgressEvent; + } + }, + /** + * Gets or sets the material appearance of the Globe. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + * @memberof Globe.prototype + * @type {Material | undefined} + */ + material: { + get: function() { + return this._material; + }, + set: function(e) { + this._material !== e && (this._material = e, makeShadersDirty(this)); + } + }, + /** + * The color to render the back side of the globe when the camera is underground or the globe is translucent, + * blended with the globe color based on the camera's distance. + * <br /><br /> + * To disable underground coloring, set <code>undergroundColor</code> to <code>undefined</code>. + * + * @memberof Globe.prototype + * @type {Color} + * @default {@link Color.BLACK} + * + * @see Globe#undergroundColorAlphaByDistance + */ + undergroundColor: { + get: function() { + return this._undergroundColor; + }, + set: function(e) { + this._undergroundColor = Color.clone(e, this._undergroundColor); + } + }, + /** + * Gets or sets the near and far distance for blending {@link Globe#undergroundColor} with the globe color. + * The alpha will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the alpha remains clamped to the nearest bound. If undefined, + * the underground color will not be blended with the globe color. + * <br /> <br /> + * When the camera is above the ellipsoid the distance is computed from the nearest + * point on the ellipsoid instead of the camera's position. + * + * @memberof Globe.prototype + * @type {NearFarScalar} + * + * @see Globe#undergroundColor + * + */ + undergroundColorAlphaByDistance: { + get: function() { + return this._undergroundColorAlphaByDistance; + }, + set: function(e) { + this._undergroundColorAlphaByDistance = NearFarScalar.clone( + e, + this._undergroundColorAlphaByDistance + ); + } + }, + /** + * Properties for controlling globe translucency. + * + * @memberof Globe.prototype + * @type {GlobeTranslucency} + */ + translucency: { + get: function() { + return this._translucency; + } + } +}); +function makeShadersDirty(e) { + const t = [], n = defined(e._material) && (defined(e._material.shaderSource.match(/slope/)) || defined(e._material.shaderSource.match("normalEC"))), i = [AtmosphereCommon, GroundAtmosphere]; + defined(e._material) && (!n || e._terrainProvider.requestVertexNormals) ? (i.push(e._material.shaderSource), t.push("APPLY_MATERIAL"), e._surface._tileProvider.materialUniformMap = e._material._uniforms) : e._surface._tileProvider.materialUniformMap = void 0, i.push(GlobeFS), e._surfaceShaderSet.baseVertexShaderSource = new ShaderSource({ + sources: [AtmosphereCommon, GroundAtmosphere, GlobeVS], + defines: t + }), e._surfaceShaderSet.baseFragmentShaderSource = new ShaderSource({ + sources: i, + defines: t + }), e._surfaceShaderSet.material = e._material; +} +function createComparePickTileFunction(e) { + return function(t, n) { + const i = BoundingSphere.distanceSquaredTo( + t.pickBoundingSphere, + e + ), r = BoundingSphere.distanceSquaredTo( + n.pickBoundingSphere, + e + ); + return i - r; + }; +} +const scratchArray = [], scratchSphereIntersectionResult = { + start: 0, + stop: 0 +}; +Globe.prototype.pickWorldCoordinates = function(e, t, n, i) { + n = defaultValue(n, !0); + const r = t.mode, o = t.mapProjection, s = scratchArray; + s.length = 0; + const c = this._surface._tilesToRender; + let l = c.length, d, f; + for (f = 0; f < l; ++f) { + d = c[f]; + const p = d.data; + if (!defined(p)) + continue; + let m = p.pickBoundingSphere; + if (r !== SceneMode$1.SCENE3D) + p.pickBoundingSphere = m = BoundingSphere.fromRectangleWithHeights2D( + d.rectangle, + o, + p.tileBoundingRegion.minimumHeight, + p.tileBoundingRegion.maximumHeight, + m + ), Cartesian3.fromElements( + m.center.z, + m.center.x, + m.center.y, + m.center + ); + else if (defined(p.renderedMesh)) + BoundingSphere.clone( + p.tileBoundingRegion.boundingSphere, + m + ); + else + continue; + const _ = IntersectionTests.raySphere( + e, + m, + scratchSphereIntersectionResult + ); + defined(_) && s.push(p); + } + s.sort(createComparePickTileFunction(e.origin)); + let h; + for (l = s.length, f = 0; f < l && (h = s[f].pick( + e, + t.mode, + t.mapProjection, + n, + i + ), !defined(h)); ++f) + ; + return h; +}; +const cartoScratch = new Cartographic(); +Globe.prototype.pick = function(e, t, n) { + if (n = this.pickWorldCoordinates(e, t, !0, n), defined(n) && t.mode !== SceneMode$1.SCENE3D) { + n = Cartesian3.fromElements(n.y, n.z, n.x, n); + const i = t.mapProjection.unproject(n, cartoScratch); + n = this._ellipsoid.cartographicToCartesian(i, n); + } + return n; +}; +const scratchGetHeightCartesian = new Cartesian3(), scratchGetHeightIntersection = new Cartesian3(), scratchGetHeightCartographic = new Cartographic(), scratchGetHeightRay = new Ray(); +function tileIfContainsCartographic(e, t) { + return defined(e) && Rectangle.contains(e.rectangle, t) ? e : void 0; +} +Globe.prototype.getHeight = function(e) { + const t = this._surface._levelZeroTiles; + if (!defined(t)) + return; + let n, i; + const r = t.length; + for (i = 0; i < r && (n = t[i], !Rectangle.contains(n.rectangle, e)); ++i) + ; + if (i >= r) + return; + let o = n; + for (; defined(n); ) + n = tileIfContainsCartographic(n._southwestChild, e) || tileIfContainsCartographic(n._southeastChild, e) || tileIfContainsCartographic(n._northwestChild, e) || n._northeastChild, defined(n) && defined(n.data) && defined(n.data.renderedMesh) && (o = n); + if (n = o, !defined(n) || !defined(n.data) || !defined(n.data.renderedMesh)) + return; + const s = this._surface._tileProvider.tilingScheme.projection, c = this._surface._tileProvider.tilingScheme.ellipsoid, l = Cartesian3.fromRadians( + e.longitude, + e.latitude, + 0, + c, + scratchGetHeightCartesian + ), d = scratchGetHeightRay, f = c.geodeticSurfaceNormal( + l, + d.direction + ), h = c.getSurfaceNormalIntersectionWithZAxis( + l, + 11500, + d.origin + ); + if (!defined(h)) { + let m; + defined(n.data.tileBoundingRegion) && (m = n.data.tileBoundingRegion.minimumHeight); + const _ = Math.min(defaultValue(m, 0), -11500), y = Cartesian3.multiplyByScalar( + f, + Math.abs(_) + 1, + scratchGetHeightIntersection + ); + Cartesian3.subtract(l, y, d.origin); + } + const p = n.data.pick( + d, + void 0, + s, + !1, + scratchGetHeightIntersection + ); + if (defined(p)) + return c.cartesianToCartographic( + p, + scratchGetHeightCartographic + ).height; +}; +Globe.prototype.update = function(e) { + this.show && e.passes.render && this._surface.update(e); +}; +Globe.prototype.beginFrame = function(e) { + const t = this._surface, n = t.tileProvider, i = this.terrainProvider, r = defined(i) && i.hasWaterMask && i.hasWaterMask; + if (r && this._oceanNormalMapResourceDirty) { + this._oceanNormalMapResourceDirty = !1; + const c = this._oceanNormalMapResource, l = c.url; + if (defined(l)) { + const d = this; + c.fetchImage().then(function(f) { + l === d._oceanNormalMapResource.url && (d._oceanNormalMap = d._oceanNormalMap && d._oceanNormalMap.destroy(), d._oceanNormalMap = new Texture({ + context: e.context, + source: f + })); + }); + } else + this._oceanNormalMap = this._oceanNormalMap && this._oceanNormalMap.destroy(); + } + const o = e.passes, s = e.mode; + o.render && (this.showGroundAtmosphere ? this._zoomedOutOceanSpecularIntensity = 0.4 : this._zoomedOutOceanSpecularIntensity = 0.5, t.maximumScreenSpaceError = this.maximumScreenSpaceError, t.tileCacheSize = this.tileCacheSize, t.loadingDescendantLimit = this.loadingDescendantLimit, t.preloadAncestors = this.preloadAncestors, t.preloadSiblings = this.preloadSiblings, n.terrainProvider = this.terrainProvider, n.lightingFadeOutDistance = this.lightingFadeOutDistance, n.lightingFadeInDistance = this.lightingFadeInDistance, n.nightFadeOutDistance = this.nightFadeOutDistance, n.nightFadeInDistance = this.nightFadeInDistance, n.zoomedOutOceanSpecularIntensity = s === SceneMode$1.SCENE3D ? this._zoomedOutOceanSpecularIntensity : 0, n.hasWaterMask = r, n.showWaterEffect = this.showWaterEffect, n.oceanNormalMap = this._oceanNormalMap, n.enableLighting = this.enableLighting, n.dynamicAtmosphereLighting = this.dynamicAtmosphereLighting, n.dynamicAtmosphereLightingFromSun = this.dynamicAtmosphereLightingFromSun, n.showGroundAtmosphere = this.showGroundAtmosphere, n.atmosphereLightIntensity = this.atmosphereLightIntensity, n.atmosphereRayleighCoefficient = this.atmosphereRayleighCoefficient, n.atmosphereMieCoefficient = this.atmosphereMieCoefficient, n.atmosphereRayleighScaleHeight = this.atmosphereRayleighScaleHeight, n.atmosphereMieScaleHeight = this.atmosphereMieScaleHeight, n.atmosphereMieAnisotropy = this.atmosphereMieAnisotropy, n.shadows = this.shadows, n.hueShift = this.atmosphereHueShift, n.saturationShift = this.atmosphereSaturationShift, n.brightnessShift = this.atmosphereBrightnessShift, n.fillHighlightColor = this.fillHighlightColor, n.showSkirts = this.showSkirts, n.backFaceCulling = this.backFaceCulling, n.vertexShadowDarkness = this.vertexShadowDarkness, n.undergroundColor = this._undergroundColor, n.undergroundColorAlphaByDistance = this._undergroundColorAlphaByDistance, n.lambertDiffuseMultiplier = this.lambertDiffuseMultiplier, t.beginFrame(e)); +}; +Globe.prototype.render = function(e) { + this.show && (defined(this._material) && this._material.update(e.context), this._surface.render(e)); +}; +Globe.prototype.endFrame = function(e) { + this.show && e.passes.render && this._surface.endFrame(e); +}; +Globe.prototype.isDestroyed = function() { + return !1; +}; +Globe.prototype.destroy = function() { + return this._surfaceShaderSet = this._surfaceShaderSet && this._surfaceShaderSet.destroy(), this._surface = this._surface && this._surface.destroy(), this._oceanNormalMap = this._oceanNormalMap && this._oceanNormalMap.destroy(), destroyObject(this); +}; +function IauOrientationParameters(e, t, n, i) { + this.rightAscension = e, this.declination = t, this.rotation = n, this.rotationRate = i; +} +const Iau2000Orientation = {}, TdtMinusTai = 32.184, J2000d = 2451545, c1 = -0.0529921, c2 = -0.1059842, c3 = 13.0120009, c4 = 13.3407154, c5 = 0.9856003, c6 = 26.4057084, c7 = 13.064993, c8 = 0.3287146, c9 = 1.7484877, c10 = -0.1589763, c11 = 36096e-7, c12 = 0.1643573, c13 = 12.9590088; +let dateTT = new JulianDate(); +Iau2000Orientation.ComputeMoon = function(e, t) { + defined(e) || (e = JulianDate.now()), dateTT = JulianDate.addSeconds(e, TdtMinusTai, dateTT); + const n = JulianDate.totalDays(dateTT) - J2000d, i = n / TimeConstants$1.DAYS_PER_JULIAN_CENTURY, r = (125.045 + c1 * n) * CesiumMath.RADIANS_PER_DEGREE, o = (250.089 + c2 * n) * CesiumMath.RADIANS_PER_DEGREE, s = (260.008 + c3 * n) * CesiumMath.RADIANS_PER_DEGREE, c = (176.625 + c4 * n) * CesiumMath.RADIANS_PER_DEGREE, l = (357.529 + c5 * n) * CesiumMath.RADIANS_PER_DEGREE, d = (311.589 + c6 * n) * CesiumMath.RADIANS_PER_DEGREE, f = (134.963 + c7 * n) * CesiumMath.RADIANS_PER_DEGREE, h = (276.617 + c8 * n) * CesiumMath.RADIANS_PER_DEGREE, p = (34.226 + c9 * n) * CesiumMath.RADIANS_PER_DEGREE, m = (15.134 + c10 * n) * CesiumMath.RADIANS_PER_DEGREE, _ = (119.743 + c11 * n) * CesiumMath.RADIANS_PER_DEGREE, y = (239.961 + c12 * n) * CesiumMath.RADIANS_PER_DEGREE, C = (25.053 + c13 * n) * CesiumMath.RADIANS_PER_DEGREE, T = Math.sin(r), x = Math.sin(o), b = Math.sin(s), S = Math.sin(c), E = Math.sin(l), A = Math.sin(d), D = Math.sin(f), P = Math.sin(h), I = Math.sin(p), M = Math.sin(m), R = Math.sin(_), L = Math.sin(y), g = Math.sin(C), w = Math.cos(r), O = Math.cos(o), N = Math.cos(s), F = Math.cos(c), B = Math.cos(l), V = Math.cos(d), U = Math.cos(f), k = Math.cos(h), $ = Math.cos(p), G = Math.cos(m), q = Math.cos(_), z = Math.cos(y), H = Math.cos(C), Q = (269.9949 + 31e-4 * i - 3.8787 * T - 0.1204 * x + 0.07 * b - 0.0172 * S + 72e-4 * A - 52e-4 * M + 43e-4 * g) * CesiumMath.RADIANS_PER_DEGREE, ne = (66.5392 + 0.013 * i + 1.5419 * w + 0.0239 * O - 0.0278 * N + 68e-4 * F - 29e-4 * V + 9e-4 * U + 8e-4 * G - 9e-4 * H) * CesiumMath.RADIANS_PER_DEGREE, K = (38.3213 + 13.17635815 * n - 14e-13 * n * n + 3.561 * T + 0.1208 * x - 0.0642 * b + 0.0158 * S + 0.0252 * E - 66e-4 * A - 47e-4 * D - 46e-4 * P + 28e-4 * I + 52e-4 * M + 4e-3 * R + 19e-4 * L - 44e-4 * g) * CesiumMath.RADIANS_PER_DEGREE, Z = (13.17635815 - 14e-13 * (2 * n) + 3.561 * w * c1 + 0.1208 * O * c2 - 0.0642 * N * c3 + 0.0158 * F * c4 + 0.0252 * B * c5 - 66e-4 * V * c6 - 47e-4 * U * c7 - 46e-4 * k * c8 + 28e-4 * $ * c9 + 52e-4 * G * c10 + 4e-3 * q * c11 + 19e-4 * z * c12 - 44e-4 * H * c13) / 86400 * CesiumMath.RADIANS_PER_DEGREE; + return defined(t) || (t = new IauOrientationParameters()), t.rightAscension = Q, t.declination = ne, t.rotation = K, t.rotationRate = Z, t; +}; +function IauOrientationAxes(e) { + (!defined(e) || typeof e != "function") && (e = Iau2000Orientation.ComputeMoon), this._computeFunction = e; +} +const xAxisScratch = new Cartesian3(), yAxisScratch = new Cartesian3(), zAxisScratch = new Cartesian3(); +function computeRotationMatrix(e, t, n) { + const i = xAxisScratch; + i.x = Math.cos(e + CesiumMath.PI_OVER_TWO), i.y = Math.sin(e + CesiumMath.PI_OVER_TWO), i.z = 0; + const r = Math.cos(t), o = zAxisScratch; + o.x = r * Math.cos(e), o.y = r * Math.sin(e), o.z = Math.sin(t); + const s = Cartesian3.cross(o, i, yAxisScratch); + return defined(n) || (n = new Matrix3()), n[0] = i.x, n[1] = s.x, n[2] = o.x, n[3] = i.y, n[4] = s.y, n[5] = o.y, n[6] = i.z, n[7] = s.z, n[8] = o.z, n; +} +const rotMtxScratch = new Matrix3(), quatScratch = new Quaternion(); +IauOrientationAxes.prototype.evaluate = function(e, t) { + defined(e) || (e = JulianDate.now()); + const n = this._computeFunction(e), i = computeRotationMatrix( + n.rightAscension, + n.declination, + t + ), r = CesiumMath.zeroToTwoPi(n.rotation), o = Quaternion.fromAxisAngle(Cartesian3.UNIT_Z, r, quatScratch), s = Matrix3.fromQuaternion( + Quaternion.conjugate(o, o), + rotMtxScratch + ); + return Matrix3.multiply(s, i, i); +}; +const attributeLocations$1 = { + position: 0 +}; +function EllipsoidPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.center = Cartesian3.clone(defaultValue(e.center, Cartesian3.ZERO)), this._center = new Cartesian3(), this.radii = Cartesian3.clone(e.radii), this._radii = new Cartesian3(), this._oneOverEllipsoidRadiiSquared = new Cartesian3(), this._boundingSphere = new BoundingSphere(), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = new Matrix4(), this._computedModelMatrix = new Matrix4(), this.show = defaultValue(e.show, !0), this.material = defaultValue( + e.material, + Material$4.fromType(Material$4.ColorType) + ), this._material = void 0, this._translucent = void 0, this.id = e.id, this._id = void 0, this.debugShowBoundingVolume = defaultValue( + e.debugShowBoundingVolume, + !1 + ), this.onlySunLighting = defaultValue(e.onlySunLighting, !1), this._onlySunLighting = !1, this._depthTestEnabled = defaultValue(e.depthTestEnabled, !0), this._useLogDepth = !1, this._sp = void 0, this._rs = void 0, this._va = void 0, this._pickSP = void 0, this._pickId = void 0, this._colorCommand = new DrawCommand({ + owner: defaultValue(e._owner, this) + }), this._pickCommand = new DrawCommand({ + owner: defaultValue(e._owner, this), + pickOnly: !0 + }); + const t = this; + this._uniforms = { + u_radii: function() { + return t.radii; + }, + u_oneOverEllipsoidRadiiSquared: function() { + return t._oneOverEllipsoidRadiiSquared; + } + }, this._pickUniforms = { + czm_pickColor: function() { + return t._pickId.color; + } + }; +} +function getVertexArray(e) { + let t = e.cache.ellipsoidPrimitive_vertexArray; + if (defined(t)) + return t; + const n = BoxGeometry.createGeometry( + BoxGeometry.fromDimensions({ + dimensions: new Cartesian3(2, 2, 2), + vertexFormat: VertexFormat.POSITION_ONLY + }) + ); + return t = VertexArray.fromGeometry({ + context: e, + geometry: n, + attributeLocations: attributeLocations$1, + bufferUsage: BufferUsage$1.STATIC_DRAW, + interleave: !0 + }), e.cache.ellipsoidPrimitive_vertexArray = t, t; +} +EllipsoidPrimitive.prototype.update = function(e) { + if (!this.show || e.mode !== SceneMode$1.SCENE3D || !defined(this.center) || !defined(this.radii)) + return; + const t = e.context, n = this.material.isTranslucent(), i = this._translucent !== n; + (!defined(this._rs) || i) && (this._translucent = n, this._rs = RenderState.fromCache({ + // Cull front faces - not back faces - so the ellipsoid doesn't + // disappear if the viewer enters the bounding box. + cull: { + enabled: !0, + face: CullFace$1.FRONT + }, + depthTest: { + enabled: this._depthTestEnabled + }, + // Only write depth when EXT_frag_depth is supported since the depth for + // the bounding box is wrong; it is not the true depth of the ray casted ellipsoid. + depthMask: !n && t.fragmentDepth, + blending: n ? BlendingState$1.ALPHA_BLEND : void 0 + })), defined(this._va) || (this._va = getVertexArray(t)); + let r = !1; + const o = this.radii; + if (!Cartesian3.equals(this._radii, o)) { + Cartesian3.clone(o, this._radii); + const y = this._oneOverEllipsoidRadiiSquared; + y.x = 1 / (o.x * o.x), y.y = 1 / (o.y * o.y), y.z = 1 / (o.z * o.z), r = !0; + } + (!Matrix4.equals(this.modelMatrix, this._modelMatrix) || !Cartesian3.equals(this.center, this._center)) && (Matrix4.clone(this.modelMatrix, this._modelMatrix), Cartesian3.clone(this.center, this._center), Matrix4.multiplyByTranslation( + this.modelMatrix, + this.center, + this._computedModelMatrix + ), r = !0), r && (Cartesian3.clone(Cartesian3.ZERO, this._boundingSphere.center), this._boundingSphere.radius = Cartesian3.maximumComponent(o), BoundingSphere.transform( + this._boundingSphere, + this._computedModelMatrix, + this._boundingSphere + )); + const s = this._material !== this.material; + this._material = this.material, this._material.update(t); + const c = this.onlySunLighting !== this._onlySunLighting; + this._onlySunLighting = this.onlySunLighting; + const l = e.useLogDepth, d = this._useLogDepth !== l; + this._useLogDepth = l; + const f = this._colorCommand; + let h, p; + (s || c || i || d) && (h = new ShaderSource({ + sources: [EllipsoidVS] + }), p = new ShaderSource({ + sources: [this.material.shaderSource, EllipsoidFS] + }), this.onlySunLighting && p.defines.push("ONLY_SUN_LIGHTING"), !n && t.fragmentDepth && p.defines.push("WRITE_DEPTH"), this._useLogDepth && (h.defines.push("LOG_DEPTH"), p.defines.push("LOG_DEPTH")), this._sp = ShaderProgram.replaceCache({ + context: t, + shaderProgram: this._sp, + vertexShaderSource: h, + fragmentShaderSource: p, + attributeLocations: attributeLocations$1 + }), f.vertexArray = this._va, f.renderState = this._rs, f.shaderProgram = this._sp, f.uniformMap = combine$2(this._uniforms, this.material._uniforms), f.executeInClosestFrustum = n); + const m = e.commandList, _ = e.passes; + if (_.render && (f.boundingVolume = this._boundingSphere, f.debugShowBoundingVolume = this.debugShowBoundingVolume, f.modelMatrix = this._computedModelMatrix, f.pass = n ? Pass$1.TRANSLUCENT : Pass$1.OPAQUE, m.push(f)), _.pick) { + const y = this._pickCommand; + (!defined(this._pickId) || this._id !== this.id) && (this._id = this.id, this._pickId = this._pickId && this._pickId.destroy(), this._pickId = t.createPickId({ + primitive: this, + id: this.id + })), (s || c || !defined(this._pickSP) || d) && (h = new ShaderSource({ + sources: [EllipsoidVS] + }), p = new ShaderSource({ + sources: [this.material.shaderSource, EllipsoidFS], + pickColorQualifier: "uniform" + }), this.onlySunLighting && p.defines.push("ONLY_SUN_LIGHTING"), !n && t.fragmentDepth && p.defines.push("WRITE_DEPTH"), this._useLogDepth && (h.defines.push("LOG_DEPTH"), p.defines.push("LOG_DEPTH")), this._pickSP = ShaderProgram.replaceCache({ + context: t, + shaderProgram: this._pickSP, + vertexShaderSource: h, + fragmentShaderSource: p, + attributeLocations: attributeLocations$1 + }), y.vertexArray = this._va, y.renderState = this._rs, y.shaderProgram = this._pickSP, y.uniformMap = combine$2( + combine$2(this._uniforms, this._pickUniforms), + this.material._uniforms + ), y.executeInClosestFrustum = n), y.boundingVolume = this._boundingSphere, y.modelMatrix = this._computedModelMatrix, y.pass = n ? Pass$1.TRANSLUCENT : Pass$1.OPAQUE, m.push(y); + } +}; +EllipsoidPrimitive.prototype.isDestroyed = function() { + return !1; +}; +EllipsoidPrimitive.prototype.destroy = function() { + return this._sp = this._sp && this._sp.destroy(), this._pickSP = this._pickSP && this._pickSP.destroy(), this._pickId = this._pickId && this._pickId.destroy(), destroyObject(this); +}; +function Moon(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = e.textureUrl; + defined(t) || (t = buildModuleUrl("Assets/Textures/moonSmall.jpg")), this.show = defaultValue(e.show, !0), this.textureUrl = t, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.MOON), this.onlySunLighting = defaultValue(e.onlySunLighting, !0), this._ellipsoidPrimitive = new EllipsoidPrimitive({ + radii: this.ellipsoid.radii, + material: Material$4.fromType(Material$4.ImageType), + depthTestEnabled: !1, + _owner: this + }), this._ellipsoidPrimitive.material.translucent = !1, this._axes = new IauOrientationAxes(); +} +Object.defineProperties(Moon.prototype, { + /** + * Get the ellipsoid that defines the shape of the moon. + * + * @memberof Moon.prototype + * + * @type {Ellipsoid} + * @readonly + * + * @default {@link Ellipsoid.MOON} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +const icrfToFixed = new Matrix3(), rotationScratch = new Matrix3(), translationScratch = new Cartesian3(), scratchCommandList = []; +Moon.prototype.update = function(e) { + if (!this.show) + return; + const t = this._ellipsoidPrimitive; + t.material.uniforms.image = this.textureUrl, t.onlySunLighting = this.onlySunLighting; + const n = e.time; + defined(Transforms.computeIcrfToFixedMatrix(n, icrfToFixed)) || Transforms.computeTemeToPseudoFixedMatrix(n, icrfToFixed); + const i = this._axes.evaluate(n, rotationScratch); + Matrix3.transpose(i, i), Matrix3.multiply(icrfToFixed, i, i); + const r = Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame( + n, + translationScratch + ); + Matrix3.multiplyByVector(icrfToFixed, r, r), Matrix4.fromRotationTranslation( + i, + r, + t.modelMatrix + ); + const o = e.commandList; + return e.commandList = scratchCommandList, scratchCommandList.length = 0, t.update(e), e.commandList = o, scratchCommandList.length === 1 ? scratchCommandList[0] : void 0; +}; +Moon.prototype.isDestroyed = function() { + return !1; +}; +Moon.prototype.destroy = function() { + return this._ellipsoidPrimitive = this._ellipsoidPrimitive && this._ellipsoidPrimitive.destroy(), destroyObject(this); +}; +const leftScratchArray = [], rightScratchArray = []; +function merge(e, t, n, i, r, o) { + const s = r - i + 1, c = o - r, l = leftScratchArray, d = rightScratchArray; + let f, h; + for (f = 0; f < s; ++f) + l[f] = e[i + f]; + for (h = 0; h < c; ++h) + d[h] = e[r + h + 1]; + f = 0, h = 0; + for (let p = i; p <= o; ++p) { + const m = l[f], _ = d[h]; + f < s && (h >= c || t(m, _, n) <= 0) ? (e[p] = m, ++f) : h < c && (e[p] = _, ++h); + } +} +function sort(e, t, n, i, r) { + if (i >= r) + return; + const o = Math.floor((i + r) * 0.5); + sort(e, t, n, i, o), sort(e, t, n, o + 1, r), merge(e, t, n, i, o, r); +} +function mergeSort(e, t, n) { + const i = e.length, r = Math.ceil(i * 0.5); + leftScratchArray.length = r, rightScratchArray.length = r, sort(e, t, n, 0, i - 1), leftScratchArray.length = 0, rightScratchArray.length = 0; +} +function Occluder(e, t) { + this._occluderPosition = Cartesian3.clone(e.center), this._occluderRadius = e.radius, this._horizonDistance = 0, this._horizonPlaneNormal = void 0, this._horizonPlanePosition = void 0, this._cameraPosition = void 0, this.cameraPosition = t; +} +const scratchCartesian3$2 = new Cartesian3(); +Object.defineProperties(Occluder.prototype, { + /** + * The position of the occluder. + * @memberof Occluder.prototype + * @type {Cartesian3} + */ + position: { + get: function() { + return this._occluderPosition; + } + }, + /** + * The radius of the occluder. + * @memberof Occluder.prototype + * @type {number} + */ + radius: { + get: function() { + return this._occluderRadius; + } + }, + /** + * The position of the camera. + * @memberof Occluder.prototype + * @type {Cartesian3} + */ + cameraPosition: { + set: function(e) { + e = Cartesian3.clone(e, this._cameraPosition); + const t = Cartesian3.subtract( + this._occluderPosition, + e, + scratchCartesian3$2 + ); + let n = Cartesian3.magnitudeSquared( + t + ); + const i = this._occluderRadius * this._occluderRadius; + let r, o, s; + if (n > i) { + r = Math.sqrt( + n - i + ), n = 1 / Math.sqrt(n), o = Cartesian3.multiplyByScalar( + t, + n, + scratchCartesian3$2 + ); + const c = r * r * n; + s = Cartesian3.add( + e, + Cartesian3.multiplyByScalar( + o, + c, + scratchCartesian3$2 + ), + scratchCartesian3$2 + ); + } else + r = Number.MAX_VALUE; + this._horizonDistance = r, this._horizonPlaneNormal = o, this._horizonPlanePosition = s, this._cameraPosition = e; + } + } +}); +Occluder.fromBoundingSphere = function(e, t, n) { + return defined(n) ? (Cartesian3.clone(e.center, n._occluderPosition), n._occluderRadius = e.radius, n.cameraPosition = t, n) : new Occluder(e, t); +}; +const tempVecScratch = new Cartesian3(); +Occluder.prototype.isPointVisible = function(e) { + if (this._horizonDistance !== Number.MAX_VALUE) { + let t = Cartesian3.subtract( + e, + this._occluderPosition, + tempVecScratch + ), n = this._occluderRadius; + if (n = Cartesian3.magnitudeSquared(t) - n * n, n > 0) + return n = Math.sqrt(n) + this._horizonDistance, t = Cartesian3.subtract(e, this._cameraPosition, t), n * n > Cartesian3.magnitudeSquared(t); + } + return !1; +}; +const occludeePositionScratch = new Cartesian3(); +Occluder.prototype.isBoundingSphereVisible = function(e) { + const t = Cartesian3.clone( + e.center, + occludeePositionScratch + ), n = e.radius; + if (this._horizonDistance !== Number.MAX_VALUE) { + let i = Cartesian3.subtract( + t, + this._occluderPosition, + tempVecScratch + ), r = this._occluderRadius - n; + if (r = Cartesian3.magnitudeSquared(i) - r * r, n < this._occluderRadius) + return r > 0 ? (r = Math.sqrt(r) + this._horizonDistance, i = Cartesian3.subtract( + t, + this._cameraPosition, + i + ), r * r + n * n > Cartesian3.magnitudeSquared(i)) : !1; + if (r > 0) { + i = Cartesian3.subtract( + t, + this._cameraPosition, + i + ); + const o = Cartesian3.magnitudeSquared(i), s = this._occluderRadius * this._occluderRadius, c = n * n; + return (this._horizonDistance * this._horizonDistance + s) * c > o * s ? !0 : (r = Math.sqrt(r) + this._horizonDistance, r * r + c > o); + } + return !0; + } + return !1; +}; +const tempScratch = new Cartesian3(); +Occluder.prototype.computeVisibility = function(e) { + const t = Cartesian3.clone(e.center), n = e.radius; + if (n > this._occluderRadius) + return Visibility$1.FULL; + if (this._horizonDistance !== Number.MAX_VALUE) { + let i = Cartesian3.subtract( + t, + this._occluderPosition, + tempScratch + ), r = this._occluderRadius - n; + const o = Cartesian3.magnitudeSquared(i); + if (r = o - r * r, r > 0) { + r = Math.sqrt(r) + this._horizonDistance, i = Cartesian3.subtract( + t, + this._cameraPosition, + i + ); + const s = Cartesian3.magnitudeSquared(i); + return r * r + n * n < s ? Visibility$1.NONE : (r = this._occluderRadius + n, r = o - r * r, r > 0 ? (r = Math.sqrt(r) + this._horizonDistance, s < r * r + n * n ? Visibility$1.FULL : Visibility$1.PARTIAL) : (i = Cartesian3.subtract( + t, + this._horizonPlanePosition, + i + ), Cartesian3.dot(i, this._horizonPlaneNormal) > -n ? Visibility$1.PARTIAL : Visibility$1.FULL)); + } + } + return Visibility$1.NONE; +}; +const occludeePointScratch = new Cartesian3(); +Occluder.computeOccludeePoint = function(e, t, n) { + const i = Cartesian3.clone(t), r = Cartesian3.clone(e.center), o = e.radius, s = n.length, c = Cartesian3.normalize( + Cartesian3.subtract(i, r, occludeePointScratch), + occludeePointScratch + ), l = -Cartesian3.dot(c, r), d = Occluder._anyRotationVector( + r, + c, + l + ); + let f = Occluder._horizonToPlaneNormalDotProduct( + e, + c, + l, + d, + n[0] + ); + if (!f) + return; + let h; + for (let m = 1; m < s; ++m) { + if (h = Occluder._horizonToPlaneNormalDotProduct( + e, + c, + l, + d, + n[m] + ), !h) + return; + h < f && (f = h); + } + if (f < 0.0017453283658983088) + return; + const p = o / f; + return Cartesian3.add( + r, + Cartesian3.multiplyByScalar( + c, + p, + occludeePointScratch + ), + occludeePointScratch + ); +}; +const computeOccludeePointFromRectangleScratch = []; +Occluder.computeOccludeePointFromRectangle = function(e, t) { + t = defaultValue(t, Ellipsoid.default); + const n = Rectangle.subsample( + e, + t, + 0, + computeOccludeePointFromRectangleScratch + ), i = BoundingSphere.fromPoints(n), r = Cartesian3.ZERO; + if (!Cartesian3.equals(r, i.center)) + return Occluder.computeOccludeePoint( + new BoundingSphere(r, t.minimumRadius), + i.center, + n + ); +}; +const tempVec0Scratch = new Cartesian3(); +Occluder._anyRotationVector = function(e, t, n) { + const i = Cartesian3.abs(t, tempVec0Scratch); + let r = i.x > i.y ? 0 : 1; + (r === 0 && i.z > i.x || r === 1 && i.z > i.y) && (r = 2); + const o = new Cartesian3(); + let s; + r === 0 ? (i.x = e.x, i.y = e.y + 1, i.z = e.z + 1, s = Cartesian3.UNIT_X) : r === 1 ? (i.x = e.x + 1, i.y = e.y, i.z = e.z + 1, s = Cartesian3.UNIT_Y) : (i.x = e.x + 1, i.y = e.y + 1, i.z = e.z, s = Cartesian3.UNIT_Z); + const c = (Cartesian3.dot(t, i) + n) / -Cartesian3.dot(t, s); + return Cartesian3.normalize( + Cartesian3.subtract( + Cartesian3.add( + i, + Cartesian3.multiplyByScalar(s, c, o), + i + ), + e, + i + ), + i + ); +}; +const posDirectionScratch = new Cartesian3(); +Occluder._rotationVector = function(e, t, n, i, r) { + let o = Cartesian3.subtract( + i, + e, + posDirectionScratch + ); + if (o = Cartesian3.normalize( + o, + o + ), Cartesian3.dot(t, o) < // eslint-disable-next-line no-loss-of-precision + 0.9999999847691291) { + const s = Cartesian3.cross( + t, + o, + o + ); + if (Cartesian3.magnitude(s) > CesiumMath.EPSILON13) + return Cartesian3.normalize(s, new Cartesian3()); + } + return r; +}; +const posScratch1 = new Cartesian3(), occluerPosScratch = new Cartesian3(), posScratch2 = new Cartesian3(), horizonPlanePosScratch = new Cartesian3(); +Occluder._horizonToPlaneNormalDotProduct = function(e, t, n, i, r) { + const o = Cartesian3.clone(r, posScratch1), s = Cartesian3.clone( + e.center, + occluerPosScratch + ), c = e.radius; + let l = Cartesian3.subtract( + s, + o, + posScratch2 + ); + const d = Cartesian3.magnitudeSquared( + l + ), f = c * c; + if (d < f) + return !1; + const h = d - f, p = Math.sqrt(h), _ = 1 / Math.sqrt( + d + ), C = p * _ * p; + l = Cartesian3.normalize( + l, + l + ); + const T = Cartesian3.add( + o, + Cartesian3.multiplyByScalar( + l, + C, + horizonPlanePosScratch + ), + horizonPlanePosScratch + ), x = Math.sqrt( + h - C * C + ); + let b = this._rotationVector( + s, + t, + n, + o, + i + ), S = Cartesian3.fromElements( + b.x * b.x * l.x + (b.x * b.y - b.z) * l.y + (b.x * b.z + b.y) * l.z, + (b.x * b.y + b.z) * l.x + b.y * b.y * l.y + (b.y * b.z - b.x) * l.z, + (b.x * b.z - b.y) * l.x + (b.y * b.z + b.x) * l.y + b.z * b.z * l.z, + posScratch1 + ); + S = Cartesian3.normalize( + S, + S + ); + const E = Cartesian3.multiplyByScalar( + S, + x, + posScratch1 + ); + b = Cartesian3.normalize( + Cartesian3.subtract( + Cartesian3.add(T, E, posScratch2), + s, + posScratch2 + ), + posScratch2 + ); + const A = Cartesian3.dot(t, b); + b = Cartesian3.normalize( + Cartesian3.subtract( + Cartesian3.subtract(T, E, b), + s, + b + ), + b + ); + const D = Cartesian3.dot(t, b); + return A < D ? A : D; +}; +function PerspectiveOffCenterFrustum(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.left = e.left, this._left = void 0, this.right = e.right, this._right = void 0, this.top = e.top, this._top = void 0, this.bottom = e.bottom, this._bottom = void 0, this.near = defaultValue(e.near, 1), this._near = this.near, this.far = defaultValue(e.far, 5e8), this._far = this.far, this._cullingVolume = new CullingVolume(), this._perspectiveMatrix = new Matrix4(), this._infinitePerspective = new Matrix4(); +} +function update$2(e) { + const t = e.top, n = e.bottom, i = e.right, r = e.left, o = e.near, s = e.far; + (t !== e._top || n !== e._bottom || r !== e._left || i !== e._right || o !== e._near || s !== e._far) && (e._left = r, e._right = i, e._top = t, e._bottom = n, e._near = o, e._far = s, e._perspectiveMatrix = Matrix4.computePerspectiveOffCenter( + r, + i, + n, + t, + o, + s, + e._perspectiveMatrix + ), e._infinitePerspective = Matrix4.computeInfinitePerspectiveOffCenter( + r, + i, + n, + t, + o, + e._infinitePerspective + )); +} +Object.defineProperties(PerspectiveOffCenterFrustum.prototype, { + /** + * Gets the perspective projection matrix computed from the view frustum. + * @memberof PerspectiveOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveOffCenterFrustum#infiniteProjectionMatrix + */ + projectionMatrix: { + get: function() { + return update$2(this), this._perspectiveMatrix; + } + }, + /** + * Gets the perspective projection matrix computed from the view frustum with an infinite far plane. + * @memberof PerspectiveOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveOffCenterFrustum#projectionMatrix + */ + infiniteProjectionMatrix: { + get: function() { + return update$2(this), this._infinitePerspective; + } + } +}); +const getPlanesRight = new Cartesian3(), getPlanesNearCenter = new Cartesian3(), getPlanesFarCenter = new Cartesian3(), getPlanesNormal = new Cartesian3(); +PerspectiveOffCenterFrustum.prototype.computeCullingVolume = function(e, t, n) { + const i = this._cullingVolume.planes, r = this.top, o = this.bottom, s = this.right, c = this.left, l = this.near, d = this.far, f = Cartesian3.cross(t, n, getPlanesRight), h = getPlanesNearCenter; + Cartesian3.multiplyByScalar(t, l, h), Cartesian3.add(e, h, h); + const p = getPlanesFarCenter; + Cartesian3.multiplyByScalar(t, d, p), Cartesian3.add(e, p, p); + const m = getPlanesNormal; + Cartesian3.multiplyByScalar(f, c, m), Cartesian3.add(h, m, m), Cartesian3.subtract(m, e, m), Cartesian3.normalize(m, m), Cartesian3.cross(m, n, m), Cartesian3.normalize(m, m); + let _ = i[0]; + return defined(_) || (_ = i[0] = new Cartesian4()), _.x = m.x, _.y = m.y, _.z = m.z, _.w = -Cartesian3.dot(m, e), Cartesian3.multiplyByScalar(f, s, m), Cartesian3.add(h, m, m), Cartesian3.subtract(m, e, m), Cartesian3.cross(n, m, m), Cartesian3.normalize(m, m), _ = i[1], defined(_) || (_ = i[1] = new Cartesian4()), _.x = m.x, _.y = m.y, _.z = m.z, _.w = -Cartesian3.dot(m, e), Cartesian3.multiplyByScalar(n, o, m), Cartesian3.add(h, m, m), Cartesian3.subtract(m, e, m), Cartesian3.cross(f, m, m), Cartesian3.normalize(m, m), _ = i[2], defined(_) || (_ = i[2] = new Cartesian4()), _.x = m.x, _.y = m.y, _.z = m.z, _.w = -Cartesian3.dot(m, e), Cartesian3.multiplyByScalar(n, r, m), Cartesian3.add(h, m, m), Cartesian3.subtract(m, e, m), Cartesian3.cross(m, f, m), Cartesian3.normalize(m, m), _ = i[3], defined(_) || (_ = i[3] = new Cartesian4()), _.x = m.x, _.y = m.y, _.z = m.z, _.w = -Cartesian3.dot(m, e), _ = i[4], defined(_) || (_ = i[4] = new Cartesian4()), _.x = t.x, _.y = t.y, _.z = t.z, _.w = -Cartesian3.dot(t, h), Cartesian3.negate(t, m), _ = i[5], defined(_) || (_ = i[5] = new Cartesian4()), _.x = m.x, _.y = m.y, _.z = m.z, _.w = -Cartesian3.dot(m, p), this._cullingVolume; +}; +PerspectiveOffCenterFrustum.prototype.getPixelDimensions = function(e, t, n, i, r) { + update$2(this); + const o = 1 / this.near; + let s = this.top * o; + const c = 2 * i * n * s / t; + s = this.right * o; + const l = 2 * i * n * s / e; + return r.x = l, r.y = c, r; +}; +PerspectiveOffCenterFrustum.prototype.clone = function(e) { + return defined(e) || (e = new PerspectiveOffCenterFrustum()), e.right = this.right, e.left = this.left, e.top = this.top, e.bottom = this.bottom, e.near = this.near, e.far = this.far, e._left = void 0, e._right = void 0, e._top = void 0, e._bottom = void 0, e._near = void 0, e._far = void 0, e; +}; +PerspectiveOffCenterFrustum.prototype.equals = function(e) { + return defined(e) && e instanceof PerspectiveOffCenterFrustum && this.right === e.right && this.left === e.left && this.top === e.top && this.bottom === e.bottom && this.near === e.near && this.far === e.far; +}; +PerspectiveOffCenterFrustum.prototype.equalsEpsilon = function(e, t, n) { + return e === this || defined(e) && e instanceof PerspectiveOffCenterFrustum && CesiumMath.equalsEpsilon( + this.right, + e.right, + t, + n + ) && CesiumMath.equalsEpsilon( + this.left, + e.left, + t, + n + ) && CesiumMath.equalsEpsilon( + this.top, + e.top, + t, + n + ) && CesiumMath.equalsEpsilon( + this.bottom, + e.bottom, + t, + n + ) && CesiumMath.equalsEpsilon( + this.near, + e.near, + t, + n + ) && CesiumMath.equalsEpsilon( + this.far, + e.far, + t, + n + ); +}; +function PerspectiveFrustum(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._offCenterFrustum = new PerspectiveOffCenterFrustum(), this.fov = e.fov, this._fov = void 0, this._fovy = void 0, this._sseDenominator = void 0, this.aspectRatio = e.aspectRatio, this._aspectRatio = void 0, this.near = defaultValue(e.near, 1), this._near = this.near, this.far = defaultValue(e.far, 5e8), this._far = this.far, this.xOffset = defaultValue(e.xOffset, 0), this._xOffset = this.xOffset, this.yOffset = defaultValue(e.yOffset, 0), this._yOffset = this.yOffset; +} +PerspectiveFrustum.packedLength = 6; +PerspectiveFrustum.pack = function(e, t, n) { + return n = defaultValue(n, 0), t[n++] = e.fov, t[n++] = e.aspectRatio, t[n++] = e.near, t[n++] = e.far, t[n++] = e.xOffset, t[n] = e.yOffset, t; +}; +PerspectiveFrustum.unpack = function(e, t, n) { + return t = defaultValue(t, 0), defined(n) || (n = new PerspectiveFrustum()), n.fov = e[t++], n.aspectRatio = e[t++], n.near = e[t++], n.far = e[t++], n.xOffset = e[t++], n.yOffset = e[t], n; +}; +function update$1(e) { + const t = e._offCenterFrustum; + (e.fov !== e._fov || e.aspectRatio !== e._aspectRatio || e.near !== e._near || e.far !== e._far || e.xOffset !== e._xOffset || e.yOffset !== e._yOffset) && (e._aspectRatio = e.aspectRatio, e._fov = e.fov, e._fovy = e.aspectRatio <= 1 ? e.fov : Math.atan(Math.tan(e.fov * 0.5) / e.aspectRatio) * 2, e._near = e.near, e._far = e.far, e._sseDenominator = 2 * Math.tan(0.5 * e._fovy), e._xOffset = e.xOffset, e._yOffset = e.yOffset, t.top = e.near * Math.tan(0.5 * e._fovy), t.bottom = -t.top, t.right = e.aspectRatio * t.top, t.left = -t.right, t.near = e.near, t.far = e.far, t.right += e.xOffset, t.left += e.xOffset, t.top += e.yOffset, t.bottom += e.yOffset); +} +Object.defineProperties(PerspectiveFrustum.prototype, { + /** + * Gets the perspective projection matrix computed from the view frustum. + * @memberof PerspectiveFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveFrustum#infiniteProjectionMatrix + */ + projectionMatrix: { + get: function() { + return update$1(this), this._offCenterFrustum.projectionMatrix; + } + }, + /** + * The perspective projection matrix computed from the view frustum with an infinite far plane. + * @memberof PerspectiveFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveFrustum#projectionMatrix + */ + infiniteProjectionMatrix: { + get: function() { + return update$1(this), this._offCenterFrustum.infiniteProjectionMatrix; + } + }, + /** + * Gets the angle of the vertical field of view, in radians. + * @memberof PerspectiveFrustum.prototype + * @type {number} + * @readonly + * @default undefined + */ + fovy: { + get: function() { + return update$1(this), this._fovy; + } + }, + /** + * @readonly + * @private + */ + sseDenominator: { + get: function() { + return update$1(this), this._sseDenominator; + } + }, + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof PerspectiveFrustum.prototype + * @type {PerspectiveOffCenterFrustum} + * @readonly + * @private + */ + offCenterFrustum: { + get: function() { + return update$1(this), this._offCenterFrustum; + } + } +}); +PerspectiveFrustum.prototype.computeCullingVolume = function(e, t, n) { + return update$1(this), this._offCenterFrustum.computeCullingVolume(e, t, n); +}; +PerspectiveFrustum.prototype.getPixelDimensions = function(e, t, n, i, r) { + return update$1(this), this._offCenterFrustum.getPixelDimensions( + e, + t, + n, + i, + r + ); +}; +PerspectiveFrustum.prototype.clone = function(e) { + return defined(e) || (e = new PerspectiveFrustum()), e.aspectRatio = this.aspectRatio, e.fov = this.fov, e.near = this.near, e.far = this.far, e._aspectRatio = void 0, e._fov = void 0, e._near = void 0, e._far = void 0, this._offCenterFrustum.clone(e._offCenterFrustum), e; +}; +PerspectiveFrustum.prototype.equals = function(e) { + return !defined(e) || !(e instanceof PerspectiveFrustum) ? !1 : (update$1(this), update$1(e), this.fov === e.fov && this.aspectRatio === e.aspectRatio && this._offCenterFrustum.equals(e._offCenterFrustum)); +}; +PerspectiveFrustum.prototype.equalsEpsilon = function(e, t, n) { + return !defined(e) || !(e instanceof PerspectiveFrustum) ? !1 : (update$1(this), update$1(e), CesiumMath.equalsEpsilon( + this.fov, + e.fov, + t, + n + ) && CesiumMath.equalsEpsilon( + this.aspectRatio, + e.aspectRatio, + t, + n + ) && this._offCenterFrustum.equalsEpsilon( + e._offCenterFrustum, + t, + n + )); +}; +const DynamicAtmosphereLightingType = { + /** + * Do not use dynamic atmosphere lighting. Atmosphere lighting effects will + * be lit from directly above rather than using the scene's light source. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * Use the scene's current light source for dynamic atmosphere lighting. + * + * @type {number} + * @constant + */ + SCENE_LIGHT: 1, + /** + * Force the dynamic atmosphere lighting to always use the sunlight direction, + * even if the scene uses a different light source. + * + * @type {number} + * @constant + */ + SUNLIGHT: 2 +}; +DynamicAtmosphereLightingType.fromGlobeFlags = function(e) { + return e.enableLighting && e.dynamicAtmosphereLighting ? e.dynamicAtmosphereLightingFromSun ? DynamicAtmosphereLightingType.SUNLIGHT : DynamicAtmosphereLightingType.SCENE_LIGHT : DynamicAtmosphereLightingType.NONE; +}; +const DynamicAtmosphereLightingType$1 = Object.freeze(DynamicAtmosphereLightingType); +function Atmosphere() { + this.lightIntensity = 10, this.rayleighCoefficient = new Cartesian3(55e-7, 13e-6, 284e-7), this.mieCoefficient = new Cartesian3(21e-6, 21e-6, 21e-6), this.rayleighScaleHeight = 1e4, this.mieScaleHeight = 3200, this.mieAnisotropy = 0.9, this.hueShift = 0, this.saturationShift = 0, this.brightnessShift = 0, this.dynamicLighting = DynamicAtmosphereLightingType$1.NONE; +} +function BrdfLutGenerator() { + this._colorTexture = void 0, this._drawCommand = void 0; +} +Object.defineProperties(BrdfLutGenerator.prototype, { + colorTexture: { + get: function() { + return this._colorTexture; + } + } +}); +function createCommand(e, t, n) { + const i = t.createViewportQuadCommand(BrdfLutGeneratorFS, { + framebuffer: n, + renderState: RenderState.fromCache({ + viewport: new BoundingRectangle(0, 0, 256, 256) + }) + }); + e._drawCommand = i; +} +BrdfLutGenerator.prototype.update = function(e) { + if (!defined(this._colorTexture)) { + const t = e.context, n = new Texture({ + context: t, + width: 256, + height: 256, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + sampler: Sampler.NEAREST + }); + this._colorTexture = n; + const i = new Framebuffer({ + context: t, + colorTextures: [n], + destroyAttachments: !1 + }); + createCommand(this, t, i), this._drawCommand.execute(t), i.destroy(), this._drawCommand.shaderProgram = this._drawCommand.shaderProgram && this._drawCommand.shaderProgram.destroy(); + } +}; +BrdfLutGenerator.prototype.isDestroyed = function() { + return !1; +}; +BrdfLutGenerator.prototype.destroy = function() { + return this._colorTexture = this._colorTexture && this._colorTexture.destroy(), destroyObject(this); +}; +const CameraFlightPath = {}; +function getAltitude(e, t, n) { + let i, r, o; + if (e instanceof PerspectiveFrustum) { + const s = Math.tan(0.5 * e.fovy); + return i = e.near, r = e.near * s, o = e.aspectRatio * r, Math.max(t * i / o, n * i / r); + } else if (e instanceof PerspectiveOffCenterFrustum) + return i = e.near, r = e.top, o = e.right, Math.max(t * i / o, n * i / r); + return Math.max(t, n); +} +const scratchCart = new Cartesian3(), scratchCart2 = new Cartesian3(); +function createPitchFunction(e, t, n, i) { + if (defined(i) && n(0.5) > i) { + const r = n(0), o = n(1), s = n(0.5), c = s - r, l = s - o; + return function(d) { + const f = n(d); + if (d <= 0.5) { + const p = (f - r) / c; + return CesiumMath.lerp(e, -CesiumMath.PI_OVER_TWO, p); + } + const h = (f - o) / l; + return CesiumMath.lerp(-CesiumMath.PI_OVER_TWO, t, 1 - h); + }; + } + return function(r) { + return CesiumMath.lerp(e, t, r); + }; +} +function createHeightFunction(e, t, n, i, r) { + let o = r; + const s = Math.max(n, i); + if (!defined(o)) { + const c = e.position, l = t, d = e.up, f = e.right, h = e.frustum, p = Cartesian3.subtract(c, l, scratchCart), m = Cartesian3.magnitude( + Cartesian3.multiplyByScalar(d, Cartesian3.dot(p, d), scratchCart2) + ), _ = Cartesian3.magnitude( + Cartesian3.multiplyByScalar( + f, + Cartesian3.dot(p, f), + scratchCart2 + ) + ); + o = Math.min( + getAltitude(h, m, _) * 0.2, + 1e9 + ); + } + if (s < o) { + const d = -Math.pow((o - n) * 1e6, 0.125), f = Math.pow((o - i) * 1e6, 1 / 8); + return function(h) { + const p = h * (f - d) + d; + return -Math.pow(p, 8) / 1e6 + o; + }; + } + return function(c) { + return CesiumMath.lerp(n, i, c); + }; +} +function adjustAngleForLERP(e, t) { + return CesiumMath.equalsEpsilon( + e, + CesiumMath.TWO_PI, + CesiumMath.EPSILON11 + ) && (e = 0), t > e + Math.PI ? e += CesiumMath.TWO_PI : t < e - Math.PI && (e -= CesiumMath.TWO_PI), e; +} +const scratchStart = new Cartesian3(); +function createUpdateCV(e, t, n, i, r, o, s, c) { + const l = e.camera, d = Cartesian3.clone(l.position, scratchStart), f = l.pitch, h = adjustAngleForLERP(l.heading, i), p = adjustAngleForLERP(l.roll, o), m = createHeightFunction( + l, + n, + d.z, + n.z, + s + ), _ = createPitchFunction( + f, + r, + m, + c + ); + function y(C) { + const T = C.time / t; + l.setView({ + orientation: { + heading: CesiumMath.lerp(h, i, T), + pitch: _(T), + roll: CesiumMath.lerp(p, o, T) + } + }), Cartesian2.lerp(d, n, T, l.position), l.position.z = m(T); + } + return y; +} +function useLongestFlight(e, t) { + e.longitude < t.longitude ? e.longitude += CesiumMath.TWO_PI : t.longitude += CesiumMath.TWO_PI; +} +function useShortestFlight(e, t) { + const n = e.longitude - t.longitude; + n < -CesiumMath.PI ? e.longitude += CesiumMath.TWO_PI : n > CesiumMath.PI && (t.longitude += CesiumMath.TWO_PI); +} +const scratchStartCart = new Cartographic(), scratchEndCart = new Cartographic(); +function createUpdate3D(e, t, n, i, r, o, s, c, l, d) { + const f = e.camera, p = e.mapProjection.ellipsoid, m = Cartographic.clone( + f.positionCartographic, + scratchStartCart + ), _ = f.pitch, y = adjustAngleForLERP(f.heading, i), C = adjustAngleForLERP(f.roll, o), T = p.cartesianToCartographic( + n, + scratchEndCart + ); + m.longitude = CesiumMath.zeroToTwoPi(m.longitude), T.longitude = CesiumMath.zeroToTwoPi(T.longitude); + let x = !1; + if (defined(c)) { + const A = CesiumMath.zeroToTwoPi(c), D = Math.min(m.longitude, T.longitude), P = Math.max(m.longitude, T.longitude), I = A >= D && A <= P; + if (defined(l)) { + const M = Math.abs(m.longitude - T.longitude), R = CesiumMath.TWO_PI - M; + (I ? M : R) < (I ? R : M) * l && !I && (x = !0); + } else I || (x = !0); + } + x ? useLongestFlight(m, T) : useShortestFlight(m, T); + const b = createHeightFunction( + f, + n, + m.height, + T.height, + s + ), S = createPitchFunction( + _, + r, + b, + d + ); + function E() { + const A = m.longitude, D = T.longitude, P = m.latitude, I = T.latitude; + return function(R) { + const L = R.time / t, g = Cartesian3.fromRadians( + CesiumMath.lerp(A, D, L), + CesiumMath.lerp(P, I, L), + b(L), + p + ); + f.setView({ + destination: g, + orientation: { + heading: CesiumMath.lerp(y, i, L), + pitch: S(L), + roll: CesiumMath.lerp(C, o, L) + } + }); + }; + } + return E(); +} +function createUpdate2D(e, t, n, i, r, o, s) { + const c = e.camera, l = Cartesian3.clone(c.position, scratchStart), d = adjustAngleForLERP(c.heading, i), f = c.frustum.right - c.frustum.left, h = createHeightFunction( + c, + n, + f, + n.z, + s + ); + function p(m) { + const _ = m.time / t; + c.setView({ + orientation: { + heading: CesiumMath.lerp(d, i, _) + } + }), Cartesian2.lerp(l, n, _, c.position); + const y = h(_), C = c.frustum, T = C.top / C.right, x = (y - (C.right - C.left)) * 0.5; + C.right += x, C.left -= x, C.top = T * C.right, C.bottom = -C.top; + } + return p; +} +const scratchCartographic$3 = new Cartographic(), scratchDestination = new Cartesian3(); +function emptyFlight(e, t) { + return { + startObject: {}, + stopObject: {}, + duration: 0, + complete: e, + cancel: t + }; +} +function wrapCallback(e, t) { + function n() { + typeof t == "function" && t(), e.enableInputs = !0; + } + return n; +} +CameraFlightPath.createTween = function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + let n = t.destination; + const i = e.mode; + if (i === SceneMode$1.MORPHING) + return emptyFlight(); + const r = defaultValue(t.convert, !0), o = e.mapProjection, s = o.ellipsoid, c = t.maximumHeight, l = t.flyOverLongitude, d = t.flyOverLongitudeWeight, f = t.pitchAdjustHeight; + let h = t.easingFunction; + r && i !== SceneMode$1.SCENE3D && (s.cartesianToCartographic(n, scratchCartographic$3), n = o.project(scratchCartographic$3, scratchDestination)); + const p = e.camera, m = t.endTransform; + defined(m) && p._setTransform(m); + let _ = t.duration; + defined(_) || (_ = Math.ceil(Cartesian3.distance(p.position, n) / 1e6) + 2, _ = Math.min(_, 3)); + const y = defaultValue(t.heading, 0), C = defaultValue(t.pitch, -CesiumMath.PI_OVER_TWO), T = defaultValue(t.roll, 0), x = e.screenSpaceCameraController; + x.enableInputs = !1; + const b = wrapCallback(x, t.complete), S = wrapCallback(x, t.cancel), E = p.frustum; + let A = e.mode === SceneMode$1.SCENE2D; + if (A = A && Cartesian2.equalsEpsilon(p.position, n, CesiumMath.EPSILON6), A = A && CesiumMath.equalsEpsilon( + Math.max(E.right - E.left, E.top - E.bottom), + n.z, + CesiumMath.EPSILON6 + ), A = A || e.mode !== SceneMode$1.SCENE2D && Cartesian3.equalsEpsilon( + n, + p.position, + CesiumMath.EPSILON10 + ), A = A && CesiumMath.equalsEpsilon( + CesiumMath.negativePiToPi(y), + CesiumMath.negativePiToPi(p.heading), + CesiumMath.EPSILON10 + ) && CesiumMath.equalsEpsilon( + CesiumMath.negativePiToPi(C), + CesiumMath.negativePiToPi(p.pitch), + CesiumMath.EPSILON10 + ) && CesiumMath.equalsEpsilon( + CesiumMath.negativePiToPi(T), + CesiumMath.negativePiToPi(p.roll), + CesiumMath.EPSILON10 + ), A) + return emptyFlight(b, S); + const D = new Array(4); + if (D[SceneMode$1.SCENE2D] = createUpdate2D, D[SceneMode$1.SCENE3D] = createUpdate3D, D[SceneMode$1.COLUMBUS_VIEW] = createUpdateCV, _ <= 0) + return emptyFlight(function() { + D[i]( + e, + 1, + n, + y, + C, + T, + c, + l, + d, + f + )({ time: 1 }), typeof b == "function" && b(); + }, S); + const P = D[i]( + e, + _, + n, + y, + C, + T, + c, + l, + d, + f + ); + if (!defined(h)) { + const I = p.positionCartographic.height, M = i === SceneMode$1.SCENE3D ? s.cartesianToCartographic(n).height : n.z; + I > M && I > 11500 ? h = EasingFunction$1.CUBIC_OUT : h = EasingFunction$1.QUINTIC_IN_OUT; + } + return { + duration: _, + easingFunction: h, + startObject: { + time: 0 + }, + stopObject: { + time: _ + }, + update: P, + complete: b, + cancel: S + }; +}; +const MapMode2D = { + /** + * The 2D map can be rotated about the z axis. + * + * @type {number} + * @constant + */ + ROTATE: 0, + /** + * The 2D map can be scrolled infinitely in the horizontal direction. + * + * @type {number} + * @constant + */ + INFINITE_SCROLL: 1 +}, MapMode2D$1 = Object.freeze(MapMode2D); +function Camera(e) { + this._scene = e, this._transform = Matrix4.clone(Matrix4.IDENTITY), this._invTransform = Matrix4.clone(Matrix4.IDENTITY), this._actualTransform = Matrix4.clone(Matrix4.IDENTITY), this._actualInvTransform = Matrix4.clone(Matrix4.IDENTITY), this._transformChanged = !1, this.position = new Cartesian3(), this._position = new Cartesian3(), this._positionWC = new Cartesian3(), this._positionCartographic = new Cartographic(), this._oldPositionWC = void 0, this.positionWCDeltaMagnitude = 0, this.positionWCDeltaMagnitudeLastFrame = 0, this.timeSinceMoved = 0, this._lastMovedTimestamp = 0, this.direction = new Cartesian3(), this._direction = new Cartesian3(), this._directionWC = new Cartesian3(), this.up = new Cartesian3(), this._up = new Cartesian3(), this._upWC = new Cartesian3(), this.right = new Cartesian3(), this._right = new Cartesian3(), this._rightWC = new Cartesian3(), this.frustum = new PerspectiveFrustum(), this.frustum.aspectRatio = e.drawingBufferWidth / e.drawingBufferHeight, this.frustum.fov = CesiumMath.toRadians(60), this.defaultMoveAmount = 1e5, this.defaultLookAmount = Math.PI / 60, this.defaultRotateAmount = Math.PI / 3600, this.defaultZoomAmount = 1e5, this.constrainedAxis = void 0, this.maximumZoomFactor = 1.5, this._moveStart = new Event(), this._moveEnd = new Event(), this._changed = new Event(), this._changedPosition = void 0, this._changedDirection = void 0, this._changedFrustum = void 0, this._changedHeading = void 0, this._changedRoll = void 0, this.percentageChanged = 0.5, this._viewMatrix = new Matrix4(), this._invViewMatrix = new Matrix4(), updateViewMatrix(this), this._mode = SceneMode$1.SCENE3D, this._modeChanged = !0; + const t = e.mapProjection; + this._projection = t, this._maxCoord = t.project( + new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO) + ), this._max2Dfrustum = void 0, rectangleCameraPosition3D( + this, + Camera.DEFAULT_VIEW_RECTANGLE, + this.position, + !0 + ); + let n = Cartesian3.magnitude(this.position); + n += n * Camera.DEFAULT_VIEW_FACTOR, Cartesian3.normalize(this.position, this.position), Cartesian3.multiplyByScalar(this.position, n, this.position); +} +Camera.TRANSFORM_2D = new Matrix4( + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 +); +Camera.TRANSFORM_2D_INVERSE = Matrix4.inverseTransformation( + Camera.TRANSFORM_2D, + new Matrix4() +); +Camera.DEFAULT_VIEW_RECTANGLE = Rectangle.fromDegrees( + -95, + -20, + -70, + 90 +); +Camera.DEFAULT_VIEW_FACTOR = 0.5; +Camera.DEFAULT_OFFSET = new HeadingPitchRange( + 0, + -CesiumMath.PI_OVER_FOUR, + 0 +); +function updateViewMatrix(e) { + Matrix4.computeView( + e._position, + e._direction, + e._up, + e._right, + e._viewMatrix + ), Matrix4.multiply( + e._viewMatrix, + e._actualInvTransform, + e._viewMatrix + ), Matrix4.inverseTransformation(e._viewMatrix, e._invViewMatrix); +} +function updateCameraDeltas(e) { + if (!defined(e._oldPositionWC)) + e._oldPositionWC = Cartesian3.clone( + e.positionWC, + e._oldPositionWC + ); + else { + e.positionWCDeltaMagnitudeLastFrame = e.positionWCDeltaMagnitude; + const t = Cartesian3.subtract( + e.positionWC, + e._oldPositionWC, + e._oldPositionWC + ); + e.positionWCDeltaMagnitude = Cartesian3.magnitude(t), e._oldPositionWC = Cartesian3.clone( + e.positionWC, + e._oldPositionWC + ), e.positionWCDeltaMagnitude > 0 ? (e.timeSinceMoved = 0, e._lastMovedTimestamp = getTimestamp$1()) : e.timeSinceMoved = Math.max(getTimestamp$1() - e._lastMovedTimestamp, 0) / 1e3; + } +} +Camera.prototype.canPreloadFlight = function() { + return defined(this._currentFlight) && this._mode !== SceneMode$1.SCENE2D; +}; +Camera.prototype._updateCameraChanged = function() { + const e = this; + if (updateCameraDeltas(e), e._changed.numberOfListeners === 0) + return; + const t = e.percentageChanged, n = e.heading; + defined(e._changedHeading) || (e._changedHeading = n); + let i = Math.abs(e._changedHeading - n) % CesiumMath.TWO_PI; + i = i > CesiumMath.PI ? CesiumMath.TWO_PI - i : i; + const r = i / Math.PI; + r > t && (e._changedHeading = n); + const o = e.roll; + defined(e._changedRoll) || (e._changedRoll = o); + let s = Math.abs(e._changedRoll - o) % CesiumMath.TWO_PI; + s = s > CesiumMath.PI ? CesiumMath.TWO_PI - s : s; + const c = s / Math.PI; + if (c > t && (e._changedRoll = o), (c > t || r > t) && e._changed.raiseEvent( + Math.max(c, r) + ), e._mode === SceneMode$1.SCENE2D) { + if (!defined(e._changedFrustum)) { + e._changedPosition = Cartesian3.clone( + e.position, + e._changedPosition + ), e._changedFrustum = e.frustum.clone(); + return; + } + const p = e.position, m = e._changedPosition, _ = e.frustum, y = e._changedFrustum, C = p.x + _.left, T = p.x + _.right, x = m.x + y.left, b = m.x + y.right, S = p.y + _.bottom, E = p.y + _.top, A = m.y + y.bottom, D = m.y + y.top, P = Math.max(C, x), I = Math.min(T, b), M = Math.max(S, A), R = Math.min(E, D); + let L; + if (P >= I || M >= E) + L = 1; + else { + let g = y; + C < x && T > b && S < A && E > D && (g = _), L = 1 - (I - P) * (R - M) / ((g.right - g.left) * (g.top - g.bottom)); + } + L > t && (e._changed.raiseEvent(L), e._changedPosition = Cartesian3.clone( + e.position, + e._changedPosition + ), e._changedFrustum = e.frustum.clone(e._changedFrustum)); + return; + } + if (!defined(e._changedDirection)) { + e._changedPosition = Cartesian3.clone( + e.positionWC, + e._changedPosition + ), e._changedDirection = Cartesian3.clone( + e.directionWC, + e._changedDirection + ); + return; + } + const l = CesiumMath.acosClamped( + Cartesian3.dot(e.directionWC, e._changedDirection) + ); + let d; + defined(e.frustum.fovy) ? d = l / (e.frustum.fovy * 0.5) : d = l; + const h = Cartesian3.distance( + e.positionWC, + e._changedPosition + ) / e.positionCartographic.height; + (d > t || h > t) && (e._changed.raiseEvent(Math.max(d, h)), e._changedPosition = Cartesian3.clone( + e.positionWC, + e._changedPosition + ), e._changedDirection = Cartesian3.clone( + e.directionWC, + e._changedDirection + )); +}; +function convertTransformForColumbusView(e) { + Transforms.basisTo2D( + e._projection, + e._transform, + e._actualTransform + ); +} +const scratchCartographic$2 = new Cartographic(), scratchCartesian3Projection = new Cartesian3(), scratchCartesian3$1 = new Cartesian3(), scratchCartesian4Origin = new Cartesian4(), scratchCartesian4NewOrigin = new Cartesian4(), scratchCartesian4NewXAxis = new Cartesian4(), scratchCartesian4NewYAxis = new Cartesian4(), scratchCartesian4NewZAxis = new Cartesian4(); +function convertTransformFor2D(e) { + const t = e._projection, n = t.ellipsoid, i = Matrix4.getColumn( + e._transform, + 3, + scratchCartesian4Origin + ), r = n.cartesianToCartographic( + i, + scratchCartographic$2 + ), o = t.project( + r, + scratchCartesian3Projection + ), s = scratchCartesian4NewOrigin; + s.x = o.z, s.y = o.x, s.z = o.y, s.w = 1; + const c = Cartesian4.clone( + Cartesian4.UNIT_X, + scratchCartesian4NewZAxis + ), l = Cartesian4.add( + Matrix4.getColumn(e._transform, 0, scratchCartesian3$1), + i, + scratchCartesian3$1 + ); + n.cartesianToCartographic(l, r), t.project(r, o); + const d = scratchCartesian4NewXAxis; + d.x = o.z, d.y = o.x, d.z = o.y, d.w = 0, Cartesian3.subtract(d, s, d), d.x = 0; + const f = scratchCartesian4NewYAxis; + if (Cartesian3.magnitudeSquared(d) > CesiumMath.EPSILON10) + Cartesian3.cross(c, d, f); + else { + const h = Cartesian4.add( + Matrix4.getColumn(e._transform, 1, scratchCartesian3$1), + i, + scratchCartesian3$1 + ); + n.cartesianToCartographic(h, r), t.project(r, o), f.x = o.z, f.y = o.x, f.z = o.y, f.w = 0, Cartesian3.subtract(f, s, f), f.x = 0, Cartesian3.magnitudeSquared(f) < CesiumMath.EPSILON10 && (Cartesian4.clone(Cartesian4.UNIT_Y, d), Cartesian4.clone(Cartesian4.UNIT_Z, f)); + } + Cartesian3.cross(f, c, d), Cartesian3.normalize(d, d), Cartesian3.cross(c, d, f), Cartesian3.normalize(f, f), Matrix4.setColumn( + e._actualTransform, + 0, + d, + e._actualTransform + ), Matrix4.setColumn( + e._actualTransform, + 1, + f, + e._actualTransform + ), Matrix4.setColumn( + e._actualTransform, + 2, + c, + e._actualTransform + ), Matrix4.setColumn( + e._actualTransform, + 3, + s, + e._actualTransform + ); +} +const scratchCartesian$1 = new Cartesian3(); +function updateMembers(e) { + const t = e._mode; + let n = !1, i = 0; + t === SceneMode$1.SCENE2D && (i = e.frustum.right - e.frustum.left, n = i !== e._positionCartographic.height); + let r = e._position; + const o = !Cartesian3.equals(r, e.position) || n; + o && (r = Cartesian3.clone(e.position, e._position)); + let s = e._direction; + const c = !Cartesian3.equals(s, e.direction); + c && (Cartesian3.normalize(e.direction, e.direction), s = Cartesian3.clone(e.direction, e._direction)); + let l = e._up; + const d = !Cartesian3.equals(l, e.up); + d && (Cartesian3.normalize(e.up, e.up), l = Cartesian3.clone(e.up, e._up)); + let f = e._right; + const h = !Cartesian3.equals(f, e.right); + h && (Cartesian3.normalize(e.right, e.right), f = Cartesian3.clone(e.right, e._right)); + const p = e._transformChanged || e._modeChanged; + e._transformChanged = !1, p && (Matrix4.inverseTransformation(e._transform, e._invTransform), e._mode === SceneMode$1.COLUMBUS_VIEW || e._mode === SceneMode$1.SCENE2D ? Matrix4.equals(Matrix4.IDENTITY, e._transform) ? Matrix4.clone(Camera.TRANSFORM_2D, e._actualTransform) : e._mode === SceneMode$1.COLUMBUS_VIEW ? convertTransformForColumbusView(e) : convertTransformFor2D(e) : Matrix4.clone(e._transform, e._actualTransform), Matrix4.inverseTransformation( + e._actualTransform, + e._actualInvTransform + ), e._modeChanged = !1); + const m = e._actualTransform; + if (o || p) + if (e._positionWC = Matrix4.multiplyByPoint( + m, + r, + e._positionWC + ), t === SceneMode$1.SCENE3D || t === SceneMode$1.MORPHING) + e._positionCartographic = e._projection.ellipsoid.cartesianToCartographic( + e._positionWC, + e._positionCartographic + ); + else { + const _ = scratchCartesian$1; + _.x = e._positionWC.y, _.y = e._positionWC.z, _.z = e._positionWC.x, t === SceneMode$1.SCENE2D && (_.z = i), e._projection.unproject(_, e._positionCartographic); + } + if (c || d || h) { + const _ = Cartesian3.dot( + s, + Cartesian3.cross(l, f, scratchCartesian$1) + ); + if (Math.abs(1 - _) > CesiumMath.EPSILON2) { + const y = 1 / Cartesian3.magnitudeSquared(l), C = Cartesian3.dot(l, s) * y, T = Cartesian3.multiplyByScalar( + s, + C, + scratchCartesian$1 + ); + l = Cartesian3.normalize( + Cartesian3.subtract(l, T, e._up), + e._up + ), Cartesian3.clone(l, e.up), f = Cartesian3.cross(s, l, e._right), Cartesian3.clone(f, e.right); + } + } + (c || p) && (e._directionWC = Matrix4.multiplyByPointAsVector( + m, + s, + e._directionWC + ), Cartesian3.normalize(e._directionWC, e._directionWC)), (d || p) && (e._upWC = Matrix4.multiplyByPointAsVector(m, l, e._upWC), Cartesian3.normalize(e._upWC, e._upWC)), (h || p) && (e._rightWC = Matrix4.multiplyByPointAsVector( + m, + f, + e._rightWC + ), Cartesian3.normalize(e._rightWC, e._rightWC)), (o || c || d || h || p) && updateViewMatrix(e); +} +function getHeading(e, t) { + let n; + return CesiumMath.equalsEpsilon(Math.abs(e.z), 1, CesiumMath.EPSILON3) ? n = Math.atan2(t.y, t.x) - CesiumMath.PI_OVER_TWO : n = Math.atan2(e.y, e.x) - CesiumMath.PI_OVER_TWO, CesiumMath.TWO_PI - CesiumMath.zeroToTwoPi(n); +} +function getPitch(e) { + return CesiumMath.PI_OVER_TWO - CesiumMath.acosClamped(e.z); +} +function getRoll(e, t, n) { + let i = 0; + return CesiumMath.equalsEpsilon(Math.abs(e.z), 1, CesiumMath.EPSILON3) || (i = Math.atan2(-n.z, t.z), i = CesiumMath.zeroToTwoPi(i + CesiumMath.TWO_PI)), i; +} +const scratchHPRMatrix1 = new Matrix4(), scratchHPRMatrix2 = new Matrix4(); +Object.defineProperties(Camera.prototype, { + /** + * Gets the camera's reference frame. The inverse of this transformation is appended to the view matrix. + * @memberof Camera.prototype + * + * @type {Matrix4} + * @readonly + * + * @default {@link Matrix4.IDENTITY} + */ + transform: { + get: function() { + return this._transform; + } + }, + /** + * Gets the inverse camera transform. + * @memberof Camera.prototype + * + * @type {Matrix4} + * @readonly + * + * @default {@link Matrix4.IDENTITY} + */ + inverseTransform: { + get: function() { + return updateMembers(this), this._invTransform; + } + }, + /** + * Gets the view matrix. + * @memberof Camera.prototype + * + * @type {Matrix4} + * @readonly + * + * @see Camera#inverseViewMatrix + */ + viewMatrix: { + get: function() { + return updateMembers(this), this._viewMatrix; + } + }, + /** + * Gets the inverse view matrix. + * @memberof Camera.prototype + * + * @type {Matrix4} + * @readonly + * + * @see Camera#viewMatrix + */ + inverseViewMatrix: { + get: function() { + return updateMembers(this), this._invViewMatrix; + } + }, + /** + * Gets the {@link Cartographic} position of the camera, with longitude and latitude + * expressed in radians and height in meters. In 2D and Columbus View, it is possible + * for the returned longitude and latitude to be outside the range of valid longitudes + * and latitudes when the camera is outside the map. + * @memberof Camera.prototype + * + * @type {Cartographic} + * @readonly + */ + positionCartographic: { + get: function() { + return updateMembers(this), this._positionCartographic; + } + }, + /** + * Gets the position of the camera in world coordinates. + * @memberof Camera.prototype + * + * @type {Cartesian3} + * @readonly + */ + positionWC: { + get: function() { + return updateMembers(this), this._positionWC; + } + }, + /** + * Gets the view direction of the camera in world coordinates. + * @memberof Camera.prototype + * + * @type {Cartesian3} + * @readonly + */ + directionWC: { + get: function() { + return updateMembers(this), this._directionWC; + } + }, + /** + * Gets the up direction of the camera in world coordinates. + * @memberof Camera.prototype + * + * @type {Cartesian3} + * @readonly + */ + upWC: { + get: function() { + return updateMembers(this), this._upWC; + } + }, + /** + * Gets the right direction of the camera in world coordinates. + * @memberof Camera.prototype + * + * @type {Cartesian3} + * @readonly + */ + rightWC: { + get: function() { + return updateMembers(this), this._rightWC; + } + }, + /** + * Gets the camera heading in radians. + * @memberof Camera.prototype + * + * @type {number} + * @readonly + */ + heading: { + get: function() { + if (this._mode !== SceneMode$1.MORPHING) { + const e = this._projection.ellipsoid, t = Matrix4.clone(this._transform, scratchHPRMatrix1), n = Transforms.eastNorthUpToFixedFrame( + this.positionWC, + e, + scratchHPRMatrix2 + ); + this._setTransform(n); + const i = getHeading(this.direction, this.up); + return this._setTransform(t), i; + } + } + }, + /** + * Gets the camera pitch in radians. + * @memberof Camera.prototype + * + * @type {number} + * @readonly + */ + pitch: { + get: function() { + if (this._mode !== SceneMode$1.MORPHING) { + const e = this._projection.ellipsoid, t = Matrix4.clone(this._transform, scratchHPRMatrix1), n = Transforms.eastNorthUpToFixedFrame( + this.positionWC, + e, + scratchHPRMatrix2 + ); + this._setTransform(n); + const i = getPitch(this.direction); + return this._setTransform(t), i; + } + } + }, + /** + * Gets the camera roll in radians. + * @memberof Camera.prototype + * + * @type {number} + * @readonly + */ + roll: { + get: function() { + if (this._mode !== SceneMode$1.MORPHING) { + const e = this._projection.ellipsoid, t = Matrix4.clone(this._transform, scratchHPRMatrix1), n = Transforms.eastNorthUpToFixedFrame( + this.positionWC, + e, + scratchHPRMatrix2 + ); + this._setTransform(n); + const i = getRoll(this.direction, this.up, this.right); + return this._setTransform(t), i; + } + } + }, + /** + * Gets the event that will be raised at when the camera starts to move. + * @memberof Camera.prototype + * @type {Event} + * @readonly + */ + moveStart: { + get: function() { + return this._moveStart; + } + }, + /** + * Gets the event that will be raised when the camera has stopped moving. + * @memberof Camera.prototype + * @type {Event} + * @readonly + */ + moveEnd: { + get: function() { + return this._moveEnd; + } + }, + /** + * Gets the event that will be raised when the camera has changed by <code>percentageChanged</code>. + * @memberof Camera.prototype + * @type {Event} + * @readonly + */ + changed: { + get: function() { + return this._changed; + } + } +}); +Camera.prototype.update = function(e) { + let t = !1; + if (e !== this._mode && (this._mode = e, this._modeChanged = e !== SceneMode$1.MORPHING, t = this._mode === SceneMode$1.SCENE2D), t) { + const n = this._max2Dfrustum = this.frustum.clone(), i = 2, r = n.top / n.right; + n.right = this._maxCoord.x * i, n.left = -n.right, n.top = r * n.right, n.bottom = -n.top; + } + this._mode === SceneMode$1.SCENE2D && clampMove2D(this, this.position); +}; +const setTransformPosition = new Cartesian3(), setTransformUp = new Cartesian3(), setTransformDirection = new Cartesian3(); +Camera.prototype._setTransform = function(e) { + const t = Cartesian3.clone(this.positionWC, setTransformPosition), n = Cartesian3.clone(this.upWC, setTransformUp), i = Cartesian3.clone(this.directionWC, setTransformDirection); + Matrix4.clone(e, this._transform), this._transformChanged = !0, updateMembers(this); + const r = this._actualInvTransform; + Matrix4.multiplyByPoint(r, t, this.position), Matrix4.multiplyByPointAsVector(r, i, this.direction), Matrix4.multiplyByPointAsVector(r, n, this.up), Cartesian3.cross(this.direction, this.up, this.right), updateMembers(this); +}; +const scratchAdjustOrthographicFrustumMousePosition = new Cartesian2(), scratchPickRay = new Ray(), scratchRayIntersection$1 = new Cartesian3(), scratchDepthIntersection$1 = new Cartesian3(); +function calculateOrthographicFrustumWidth(e) { + if (!Matrix4.equals(Matrix4.IDENTITY, e.transform)) + return Cartesian3.magnitude(e.position); + const t = e._scene, n = t.globe, i = scratchAdjustOrthographicFrustumMousePosition; + i.x = t.drawingBufferWidth / 2, i.y = t.drawingBufferHeight / 2; + let r; + if (defined(n)) { + const c = e.getPickRay(i, scratchPickRay); + r = n.pickWorldCoordinates( + c, + t, + !0, + scratchRayIntersection$1 + ); + } + let o; + t.pickPositionSupported && (o = t.pickPositionWorldCoordinates( + i, + scratchDepthIntersection$1 + )); + let s; + if (defined(r) || defined(o)) { + const c = defined(o) ? Cartesian3.distance(o, e.positionWC) : Number.POSITIVE_INFINITY, l = defined(r) ? Cartesian3.distance(r, e.positionWC) : Number.POSITIVE_INFINITY; + s = Math.min(c, l); + } else + s = Math.max(e.positionCartographic.height, 0); + return s; +} +Camera.prototype._adjustOrthographicFrustum = function(e) { + this.frustum instanceof OrthographicFrustum && (!e && this._positionCartographic.height < 15e4 || (this.frustum.width = calculateOrthographicFrustumWidth(this))); +}; +const scratchSetViewCartesian = new Cartesian3(), scratchSetViewTransform1 = new Matrix4(), scratchSetViewTransform2 = new Matrix4(), scratchSetViewQuaternion = new Quaternion(), scratchSetViewMatrix3 = new Matrix3(), scratchSetViewCartographic = new Cartographic(); +function setView3D(e, t, n) { + const i = Matrix4.clone( + e.transform, + scratchSetViewTransform1 + ), r = Transforms.eastNorthUpToFixedFrame( + t, + e._projection.ellipsoid, + scratchSetViewTransform2 + ); + e._setTransform(r), Cartesian3.clone(Cartesian3.ZERO, e.position), n.heading = n.heading - CesiumMath.PI_OVER_TWO; + const o = Quaternion.fromHeadingPitchRoll( + n, + scratchSetViewQuaternion + ), s = Matrix3.fromQuaternion(o, scratchSetViewMatrix3); + Matrix3.getColumn(s, 0, e.direction), Matrix3.getColumn(s, 2, e.up), Cartesian3.cross(e.direction, e.up, e.right), e._setTransform(i), e._adjustOrthographicFrustum(!0); +} +function setViewCV(e, t, n, i) { + const r = Matrix4.clone( + e.transform, + scratchSetViewTransform1 + ); + if (e._setTransform(Matrix4.IDENTITY), !Cartesian3.equals(t, e.positionWC)) { + if (i) { + const c = e._projection, l = c.ellipsoid.cartesianToCartographic( + t, + scratchSetViewCartographic + ); + t = c.project(l, scratchSetViewCartesian); + } + Cartesian3.clone(t, e.position); + } + n.heading = n.heading - CesiumMath.PI_OVER_TWO; + const o = Quaternion.fromHeadingPitchRoll( + n, + scratchSetViewQuaternion + ), s = Matrix3.fromQuaternion(o, scratchSetViewMatrix3); + Matrix3.getColumn(s, 0, e.direction), Matrix3.getColumn(s, 2, e.up), Cartesian3.cross(e.direction, e.up, e.right), e._setTransform(r), e._adjustOrthographicFrustum(!0); +} +function setView2D(e, t, n, i) { + const r = Matrix4.clone( + e.transform, + scratchSetViewTransform1 + ); + if (e._setTransform(Matrix4.IDENTITY), !Cartesian3.equals(t, e.positionWC)) { + if (i) { + const l = e._projection, d = l.ellipsoid.cartesianToCartographic( + t, + scratchSetViewCartographic + ); + t = l.project(d, scratchSetViewCartesian); + } + Cartesian2.clone(t, e.position); + const o = -t.z * 0.5, s = -o, c = e.frustum; + if (s > o) { + const l = c.top / c.right; + c.right = s, c.left = o, c.top = c.right * l, c.bottom = -c.top; + } + } + if (e._scene.mapMode2D === MapMode2D$1.ROTATE) { + n.heading = n.heading - CesiumMath.PI_OVER_TWO, n.pitch = -CesiumMath.PI_OVER_TWO, n.roll = 0; + const o = Quaternion.fromHeadingPitchRoll( + n, + scratchSetViewQuaternion + ), s = Matrix3.fromQuaternion(o, scratchSetViewMatrix3); + Matrix3.getColumn(s, 2, e.up), Cartesian3.cross(e.direction, e.up, e.right); + } + e._setTransform(r); +} +const scratchToHPRDirection = new Cartesian3(), scratchToHPRUp = new Cartesian3(), scratchToHPRRight = new Cartesian3(); +function directionUpToHeadingPitchRoll(e, t, n, i) { + const r = Cartesian3.clone( + n.direction, + scratchToHPRDirection + ), o = Cartesian3.clone(n.up, scratchToHPRUp); + if (e._scene.mode === SceneMode$1.SCENE3D) { + const c = e._projection.ellipsoid, l = Transforms.eastNorthUpToFixedFrame( + t, + c, + scratchHPRMatrix1 + ), d = Matrix4.inverseTransformation( + l, + scratchHPRMatrix2 + ); + Matrix4.multiplyByPointAsVector(d, r, r), Matrix4.multiplyByPointAsVector(d, o, o); + } + const s = Cartesian3.cross(r, o, scratchToHPRRight); + return i.heading = getHeading(r, o), i.pitch = getPitch(r), i.roll = getRoll(r, o, s), i; +} +const scratchSetViewOptions = { + destination: void 0, + orientation: { + direction: void 0, + up: void 0, + heading: void 0, + pitch: void 0, + roll: void 0 + }, + convert: void 0, + endTransform: void 0 +}, scratchHpr = new HeadingPitchRoll(); +Camera.prototype.setView = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = defaultValue( + e.orientation, + defaultValue.EMPTY_OBJECT + ); + const n = this._mode; + if (n === SceneMode$1.MORPHING) + return; + defined(e.endTransform) && this._setTransform(e.endTransform); + let i = defaultValue(e.convert, !0), r = defaultValue( + e.destination, + Cartesian3.clone(this.positionWC, scratchSetViewCartesian) + ); + defined(r) && defined(r.west) && (r = this.getRectangleCameraCoordinates( + r, + scratchSetViewCartesian + ), i = !1), defined(t.direction) && (t = directionUpToHeadingPitchRoll( + this, + r, + t, + scratchSetViewOptions.orientation + )), scratchHpr.heading = defaultValue(t.heading, 0), scratchHpr.pitch = defaultValue(t.pitch, -CesiumMath.PI_OVER_TWO), scratchHpr.roll = defaultValue(t.roll, 0), n === SceneMode$1.SCENE3D ? setView3D(this, r, scratchHpr) : n === SceneMode$1.SCENE2D ? setView2D(this, r, scratchHpr, i) : setViewCV(this, r, scratchHpr, i); +}; +const pitchScratch = new Cartesian3(); +Camera.prototype.flyHome = function(e) { + const t = this._mode; + if (t === SceneMode$1.MORPHING && this._scene.completeMorph(), t === SceneMode$1.SCENE2D) + this.flyTo({ + destination: Camera.DEFAULT_VIEW_RECTANGLE, + duration: e, + endTransform: Matrix4.IDENTITY + }); + else if (t === SceneMode$1.SCENE3D) { + const n = this.getRectangleCameraCoordinates( + Camera.DEFAULT_VIEW_RECTANGLE + ); + let i = Cartesian3.magnitude(n); + i += i * Camera.DEFAULT_VIEW_FACTOR, Cartesian3.normalize(n, n), Cartesian3.multiplyByScalar(n, i, n), this.flyTo({ + destination: n, + duration: e, + endTransform: Matrix4.IDENTITY + }); + } else if (t === SceneMode$1.COLUMBUS_VIEW) { + const n = this._projection.ellipsoid.maximumRadius; + let i = new Cartesian3(0, -1, 1); + i = Cartesian3.multiplyByScalar( + Cartesian3.normalize(i, i), + 5 * n, + i + ), this.flyTo({ + destination: i, + duration: e, + orientation: { + heading: 0, + pitch: -Math.acos(Cartesian3.normalize(i, pitchScratch).z), + roll: 0 + }, + endTransform: Matrix4.IDENTITY, + convert: !1 + }); + } +}; +Camera.prototype.worldToCameraCoordinates = function(e, t) { + return defined(t) || (t = new Cartesian4()), updateMembers(this), Matrix4.multiplyByVector(this._actualInvTransform, e, t); +}; +Camera.prototype.worldToCameraCoordinatesPoint = function(e, t) { + return defined(t) || (t = new Cartesian3()), updateMembers(this), Matrix4.multiplyByPoint(this._actualInvTransform, e, t); +}; +Camera.prototype.worldToCameraCoordinatesVector = function(e, t) { + return defined(t) || (t = new Cartesian3()), updateMembers(this), Matrix4.multiplyByPointAsVector( + this._actualInvTransform, + e, + t + ); +}; +Camera.prototype.cameraToWorldCoordinates = function(e, t) { + return defined(t) || (t = new Cartesian4()), updateMembers(this), Matrix4.multiplyByVector(this._actualTransform, e, t); +}; +Camera.prototype.cameraToWorldCoordinatesPoint = function(e, t) { + return defined(t) || (t = new Cartesian3()), updateMembers(this), Matrix4.multiplyByPoint(this._actualTransform, e, t); +}; +Camera.prototype.cameraToWorldCoordinatesVector = function(e, t) { + return defined(t) || (t = new Cartesian3()), updateMembers(this), Matrix4.multiplyByPointAsVector( + this._actualTransform, + e, + t + ); +}; +function clampMove2D(e, t) { + const n = e._scene.mapMode2D === MapMode2D$1.ROTATE, i = e._maxCoord.x, r = e._maxCoord.y; + let o, s; + n ? (s = i, o = -s) : (s = t.x - i * 2, o = t.x + i * 2), t.x > i && (t.x = s), t.x < -i && (t.x = o), t.y > r && (t.y = r), t.y < -r && (t.y = -r); +} +const moveScratch = new Cartesian3(); +Camera.prototype.move = function(e, t) { + const n = this.position; + Cartesian3.multiplyByScalar(e, t, moveScratch), Cartesian3.add(n, moveScratch, n), this._mode === SceneMode$1.SCENE2D && clampMove2D(this, n), this._adjustOrthographicFrustum(!0); +}; +Camera.prototype.moveForward = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this._mode === SceneMode$1.SCENE2D ? zoom2D$1(this, e) : this.move(this.direction, e); +}; +Camera.prototype.moveBackward = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this._mode === SceneMode$1.SCENE2D ? zoom2D$1(this, -e) : this.move(this.direction, -e); +}; +Camera.prototype.moveUp = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this.move(this.up, e); +}; +Camera.prototype.moveDown = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this.move(this.up, -e); +}; +Camera.prototype.moveRight = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this.move(this.right, e); +}; +Camera.prototype.moveLeft = function(e) { + e = defaultValue(e, this.defaultMoveAmount), this.move(this.right, -e); +}; +Camera.prototype.lookLeft = function(e) { + e = defaultValue(e, this.defaultLookAmount), this._mode !== SceneMode$1.SCENE2D && this.look(this.up, -e); +}; +Camera.prototype.lookRight = function(e) { + e = defaultValue(e, this.defaultLookAmount), this._mode !== SceneMode$1.SCENE2D && this.look(this.up, e); +}; +Camera.prototype.lookUp = function(e) { + e = defaultValue(e, this.defaultLookAmount), this._mode !== SceneMode$1.SCENE2D && this.look(this.right, -e); +}; +Camera.prototype.lookDown = function(e) { + e = defaultValue(e, this.defaultLookAmount), this._mode !== SceneMode$1.SCENE2D && this.look(this.right, e); +}; +const lookScratchQuaternion = new Quaternion(), lookScratchMatrix = new Matrix3(); +Camera.prototype.look = function(e, t) { + const n = defaultValue(t, this.defaultLookAmount), i = Quaternion.fromAxisAngle( + e, + -n, + lookScratchQuaternion + ), r = Matrix3.fromQuaternion(i, lookScratchMatrix), o = this.direction, s = this.up, c = this.right; + Matrix3.multiplyByVector(r, o, o), Matrix3.multiplyByVector(r, s, s), Matrix3.multiplyByVector(r, c, c); +}; +Camera.prototype.twistLeft = function(e) { + e = defaultValue(e, this.defaultLookAmount), this.look(this.direction, e); +}; +Camera.prototype.twistRight = function(e) { + e = defaultValue(e, this.defaultLookAmount), this.look(this.direction, -e); +}; +const rotateScratchQuaternion = new Quaternion(), rotateScratchMatrix = new Matrix3(); +Camera.prototype.rotate = function(e, t) { + const n = defaultValue(t, this.defaultRotateAmount), i = Quaternion.fromAxisAngle( + e, + -n, + rotateScratchQuaternion + ), r = Matrix3.fromQuaternion(i, rotateScratchMatrix); + Matrix3.multiplyByVector(r, this.position, this.position), Matrix3.multiplyByVector(r, this.direction, this.direction), Matrix3.multiplyByVector(r, this.up, this.up), Cartesian3.cross(this.direction, this.up, this.right), Cartesian3.cross(this.right, this.direction, this.up), this._adjustOrthographicFrustum(!1); +}; +Camera.prototype.rotateDown = function(e) { + e = defaultValue(e, this.defaultRotateAmount), rotateVertical(this, e); +}; +Camera.prototype.rotateUp = function(e) { + e = defaultValue(e, this.defaultRotateAmount), rotateVertical(this, -e); +}; +const rotateVertScratchP = new Cartesian3(), rotateVertScratchA = new Cartesian3(), rotateVertScratchTan = new Cartesian3(), rotateVertScratchNegate = new Cartesian3(); +function rotateVertical(e, t) { + const n = e.position; + if (defined(e.constrainedAxis) && !Cartesian3.equalsEpsilon( + e.position, + Cartesian3.ZERO, + CesiumMath.EPSILON2 + )) { + const i = Cartesian3.normalize(n, rotateVertScratchP), r = Cartesian3.equalsEpsilon( + i, + e.constrainedAxis, + CesiumMath.EPSILON2 + ), o = Cartesian3.equalsEpsilon( + i, + Cartesian3.negate(e.constrainedAxis, rotateVertScratchNegate), + CesiumMath.EPSILON2 + ); + if (!r && !o) { + const s = Cartesian3.normalize( + e.constrainedAxis, + rotateVertScratchA + ); + let c = Cartesian3.dot(i, s), l = CesiumMath.acosClamped(c); + t > 0 && t > l && (t = l - CesiumMath.EPSILON4), c = Cartesian3.dot( + i, + Cartesian3.negate(s, rotateVertScratchNegate) + ), l = CesiumMath.acosClamped(c), t < 0 && -t > l && (t = -l + CesiumMath.EPSILON4); + const d = Cartesian3.cross( + s, + i, + rotateVertScratchTan + ); + e.rotate(d, t); + } else (r && t < 0 || o && t > 0) && e.rotate(e.right, t); + } else + e.rotate(e.right, t); +} +Camera.prototype.rotateRight = function(e) { + e = defaultValue(e, this.defaultRotateAmount), rotateHorizontal(this, -e); +}; +Camera.prototype.rotateLeft = function(e) { + e = defaultValue(e, this.defaultRotateAmount), rotateHorizontal(this, e); +}; +function rotateHorizontal(e, t) { + defined(e.constrainedAxis) ? e.rotate(e.constrainedAxis, t) : e.rotate(e.up, t); +} +function zoom2D$1(e, t) { + const n = e.frustum; + let i; + if (t = t * 0.5, Math.abs(n.top) + Math.abs(n.bottom) > Math.abs(n.left) + Math.abs(n.right)) { + let r = n.top - t, o = n.bottom + t, s = e._maxCoord.y; + e._scene.mapMode2D === MapMode2D$1.ROTATE && (s *= e.maximumZoomFactor), o > s && (o = s, r = -s), r <= o && (r = 1, o = -1), i = n.right / n.top, n.top = r, n.bottom = o, n.right = n.top * i, n.left = -n.right; + } else { + let r = n.right - t, o = n.left + t, s = e._maxCoord.x; + e._scene.mapMode2D === MapMode2D$1.ROTATE && (s *= e.maximumZoomFactor), r > s && (r = s, o = -s), r <= o && (r = 1, o = -1), i = n.top / n.right, n.right = r, n.left = o, n.top = n.right * i, n.bottom = -n.top; + } +} +function zoom3D$1(e, t) { + e.move(e.direction, t); +} +Camera.prototype.zoomIn = function(e) { + e = defaultValue(e, this.defaultZoomAmount), this._mode === SceneMode$1.SCENE2D ? zoom2D$1(this, e) : zoom3D$1(this, e); +}; +Camera.prototype.zoomOut = function(e) { + e = defaultValue(e, this.defaultZoomAmount), this._mode === SceneMode$1.SCENE2D ? zoom2D$1(this, -e) : zoom3D$1(this, -e); +}; +Camera.prototype.getMagnitude = function() { + if (this._mode === SceneMode$1.SCENE3D) + return Cartesian3.magnitude(this.position); + if (this._mode === SceneMode$1.COLUMBUS_VIEW) + return Math.abs(this.position.z); + if (this._mode === SceneMode$1.SCENE2D) + return Math.max( + this.frustum.right - this.frustum.left, + this.frustum.top - this.frustum.bottom + ); +}; +const scratchLookAtMatrix4 = new Matrix4(); +Camera.prototype.lookAt = function(e, t) { + const n = this._scene, i = defaultValue(n.ellipsoid, Ellipsoid.default), r = Transforms.eastNorthUpToFixedFrame( + e, + i, + scratchLookAtMatrix4 + ); + this.lookAtTransform(r, t); +}; +const scratchLookAtHeadingPitchRangeOffset = new Cartesian3(), scratchLookAtHeadingPitchRangeQuaternion1 = new Quaternion(), scratchLookAtHeadingPitchRangeQuaternion2 = new Quaternion(), scratchHeadingPitchRangeMatrix3 = new Matrix3(); +function offsetFromHeadingPitchRange(e, t, n) { + t = CesiumMath.clamp( + t, + -CesiumMath.PI_OVER_TWO, + CesiumMath.PI_OVER_TWO + ), e = CesiumMath.zeroToTwoPi(e) - CesiumMath.PI_OVER_TWO; + const i = Quaternion.fromAxisAngle( + Cartesian3.UNIT_Y, + -t, + scratchLookAtHeadingPitchRangeQuaternion1 + ), r = Quaternion.fromAxisAngle( + Cartesian3.UNIT_Z, + -e, + scratchLookAtHeadingPitchRangeQuaternion2 + ), o = Quaternion.multiply(r, i, r), s = Matrix3.fromQuaternion( + o, + scratchHeadingPitchRangeMatrix3 + ), c = Cartesian3.clone( + Cartesian3.UNIT_X, + scratchLookAtHeadingPitchRangeOffset + ); + return Matrix3.multiplyByVector(s, c, c), Cartesian3.negate(c, c), Cartesian3.multiplyByScalar(c, n, c), c; +} +Camera.prototype.lookAtTransform = function(e, t) { + if (this._setTransform(e), !defined(t)) + return; + let n; + if (defined(t.heading) ? n = offsetFromHeadingPitchRange( + t.heading, + t.pitch, + t.range + ) : n = t, this._mode === SceneMode$1.SCENE2D) { + Cartesian2.clone(Cartesian2.ZERO, this.position), Cartesian3.negate(n, this.up), this.up.z = 0, Cartesian3.magnitudeSquared(this.up) < CesiumMath.EPSILON10 && Cartesian3.clone(Cartesian3.UNIT_Y, this.up), Cartesian3.normalize(this.up, this.up), this._setTransform(Matrix4.IDENTITY), Cartesian3.negate(Cartesian3.UNIT_Z, this.direction), Cartesian3.cross(this.direction, this.up, this.right), Cartesian3.normalize(this.right, this.right); + const i = this.frustum, r = i.top / i.right; + i.right = Cartesian3.magnitude(n) * 0.5, i.left = -i.right, i.top = r * i.right, i.bottom = -i.top, this._setTransform(e); + return; + } + Cartesian3.clone(n, this.position), Cartesian3.negate(this.position, this.direction), Cartesian3.normalize(this.direction, this.direction), Cartesian3.cross(this.direction, Cartesian3.UNIT_Z, this.right), Cartesian3.magnitudeSquared(this.right) < CesiumMath.EPSILON10 && Cartesian3.clone(Cartesian3.UNIT_X, this.right), Cartesian3.normalize(this.right, this.right), Cartesian3.cross(this.right, this.direction, this.up), Cartesian3.normalize(this.up, this.up), this._adjustOrthographicFrustum(!0); +}; +const viewRectangle3DCartographic1 = new Cartographic(), viewRectangle3DCartographic2 = new Cartographic(), viewRectangle3DNorthEast = new Cartesian3(), viewRectangle3DSouthWest = new Cartesian3(), viewRectangle3DNorthWest = new Cartesian3(), viewRectangle3DSouthEast = new Cartesian3(), viewRectangle3DNorthCenter = new Cartesian3(), viewRectangle3DSouthCenter = new Cartesian3(), viewRectangle3DCenter = new Cartesian3(), viewRectangle3DEquator = new Cartesian3(), defaultRF = { + direction: new Cartesian3(), + right: new Cartesian3(), + up: new Cartesian3() +}; +let viewRectangle3DEllipsoidGeodesic; +function computeD(e, t, n, i) { + return Math.abs(Cartesian3.dot(t, n)) / i - Cartesian3.dot(e, n); +} +function rectangleCameraPosition3D(e, t, n, i) { + const r = e._projection.ellipsoid, o = i ? e : defaultRF, s = t.north, c = t.south; + let l = t.east; + const d = t.west; + d > l && (l += CesiumMath.TWO_PI); + const f = (d + l) * 0.5; + let h; + if (c < -CesiumMath.PI_OVER_TWO + CesiumMath.RADIANS_PER_DEGREE && s > CesiumMath.PI_OVER_TWO - CesiumMath.RADIANS_PER_DEGREE) + h = 0; + else { + const I = viewRectangle3DCartographic1; + I.longitude = f, I.latitude = s, I.height = 0; + const M = viewRectangle3DCartographic2; + M.longitude = f, M.latitude = c, M.height = 0; + let R = viewRectangle3DEllipsoidGeodesic; + (!defined(R) || R.ellipsoid !== r) && (viewRectangle3DEllipsoidGeodesic = R = new EllipsoidGeodesic( + void 0, + void 0, + r + )), R.setEndPoints(I, M), h = R.interpolateUsingFraction( + 0.5, + viewRectangle3DCartographic1 + ).latitude; + } + const p = viewRectangle3DCartographic1; + p.longitude = f, p.latitude = h, p.height = 0; + const m = r.cartographicToCartesian( + p, + viewRectangle3DCenter + ), _ = viewRectangle3DCartographic1; + _.longitude = l, _.latitude = s; + const y = r.cartographicToCartesian( + _, + viewRectangle3DNorthEast + ); + _.longitude = d; + const C = r.cartographicToCartesian( + _, + viewRectangle3DNorthWest + ); + _.longitude = f; + const T = r.cartographicToCartesian( + _, + viewRectangle3DNorthCenter + ); + _.latitude = c; + const x = r.cartographicToCartesian( + _, + viewRectangle3DSouthCenter + ); + _.longitude = l; + const b = r.cartographicToCartesian( + _, + viewRectangle3DSouthEast + ); + _.longitude = d; + const S = r.cartographicToCartesian( + _, + viewRectangle3DSouthWest + ); + Cartesian3.subtract(C, m, C), Cartesian3.subtract(b, m, b), Cartesian3.subtract(y, m, y), Cartesian3.subtract(S, m, S), Cartesian3.subtract(T, m, T), Cartesian3.subtract(x, m, x); + const E = r.geodeticSurfaceNormal(m, o.direction); + Cartesian3.negate(E, E); + const A = Cartesian3.cross(E, Cartesian3.UNIT_Z, o.right); + Cartesian3.normalize(A, A); + const D = Cartesian3.cross(A, E, o.up); + let P; + if (e.frustum instanceof OrthographicFrustum) { + const I = Math.max( + Cartesian3.distance(y, C), + Cartesian3.distance(b, S) + ), M = Math.max( + Cartesian3.distance(y, b), + Cartesian3.distance(C, S) + ); + let R, L; + const g = e.frustum._offCenterFrustum, w = g.right / g.top, O = M * w; + I > O ? (R = I, L = R / w) : (L = M, R = O), P = Math.max(R, L); + } else { + const I = Math.tan(e.frustum.fovy * 0.5), M = e.frustum.aspectRatio * I; + if (P = Math.max( + computeD(E, D, C, I), + computeD(E, D, b, I), + computeD(E, D, y, I), + computeD(E, D, S, I), + computeD(E, D, T, I), + computeD(E, D, x, I), + computeD(E, A, C, M), + computeD(E, A, b, M), + computeD(E, A, y, M), + computeD(E, A, S, M), + computeD(E, A, T, M), + computeD(E, A, x, M) + ), c < 0 && s > 0) { + const R = viewRectangle3DCartographic1; + R.longitude = d, R.latitude = 0, R.height = 0; + let L = r.cartographicToCartesian( + R, + viewRectangle3DEquator + ); + Cartesian3.subtract(L, m, L), P = Math.max( + P, + computeD(E, D, L, I), + computeD(E, A, L, M) + ), R.longitude = l, L = r.cartographicToCartesian( + R, + viewRectangle3DEquator + ), Cartesian3.subtract(L, m, L), P = Math.max( + P, + computeD(E, D, L, I), + computeD(E, A, L, M) + ); + } + } + return Cartesian3.add( + m, + Cartesian3.multiplyByScalar(E, -P, viewRectangle3DEquator), + n + ); +} +const viewRectangleCVCartographic = new Cartographic(), viewRectangleCVNorthEast = new Cartesian3(), viewRectangleCVSouthWest = new Cartesian3(); +function rectangleCameraPositionColumbusView(e, t, n) { + const i = e._projection; + t.west > t.east && (t = Rectangle.MAX_VALUE); + const r = e._actualTransform, o = e._actualInvTransform, s = viewRectangleCVCartographic; + s.longitude = t.east, s.latitude = t.north; + const c = i.project(s, viewRectangleCVNorthEast); + Matrix4.multiplyByPoint(r, c, c), Matrix4.multiplyByPoint(o, c, c), s.longitude = t.west, s.latitude = t.south; + const l = i.project(s, viewRectangleCVSouthWest); + if (Matrix4.multiplyByPoint(r, l, l), Matrix4.multiplyByPoint(o, l, l), n.x = (c.x - l.x) * 0.5 + l.x, n.y = (c.y - l.y) * 0.5 + l.y, defined(e.frustum.fovy)) { + const d = Math.tan(e.frustum.fovy * 0.5), f = e.frustum.aspectRatio * d; + n.z = Math.max( + (c.x - l.x) / f, + (c.y - l.y) / d + ) * 0.5; + } else { + const d = c.x - l.x, f = c.y - l.y; + n.z = Math.max(d, f); + } + return n; +} +const viewRectangle2DCartographic = new Cartographic(), viewRectangle2DNorthEast = new Cartesian3(), viewRectangle2DSouthWest = new Cartesian3(); +function rectangleCameraPosition2D(e, t, n) { + const i = e._projection; + let r = t.east; + t.west > t.east && (e._scene.mapMode2D === MapMode2D$1.INFINITE_SCROLL ? r += CesiumMath.TWO_PI : (t = Rectangle.MAX_VALUE, r = t.east)); + let o = viewRectangle2DCartographic; + o.longitude = r, o.latitude = t.north; + const s = i.project(o, viewRectangle2DNorthEast); + o.longitude = t.west, o.latitude = t.south; + const c = i.project(o, viewRectangle2DSouthWest), l = Math.abs(s.x - c.x) * 0.5; + let d = Math.abs(s.y - c.y) * 0.5, f, h; + const p = e.frustum.right / e.frustum.top, m = d * p; + return l > m ? (f = l, h = f / p) : (h = d, f = m), d = Math.max(2 * f, 2 * h), n.x = (s.x - c.x) * 0.5 + c.x, n.y = (s.y - c.y) * 0.5 + c.y, o = i.unproject(n, o), o.height = d, n = i.project(o, n), n; +} +Camera.prototype.getRectangleCameraCoordinates = function(e, t) { + const n = this._mode; + if (defined(t) || (t = new Cartesian3()), n === SceneMode$1.SCENE3D) + return rectangleCameraPosition3D(this, e, t); + if (n === SceneMode$1.COLUMBUS_VIEW) + return rectangleCameraPositionColumbusView(this, e, t); + if (n === SceneMode$1.SCENE2D) + return rectangleCameraPosition2D(this, e, t); +}; +const pickEllipsoid3DRay = new Ray(); +function pickEllipsoid3D(e, t, n, i) { + n = defaultValue(n, Ellipsoid.default); + const r = e.getPickRay(t, pickEllipsoid3DRay), o = IntersectionTests.rayEllipsoid(r, n); + if (!o) + return; + const s = o.start > 0 ? o.start : o.stop; + return Ray.getPoint(r, s, i); +} +const pickEllipsoid2DRay = new Ray(); +function pickMap2D(e, t, n, i) { + let o = e.getPickRay(t, pickEllipsoid2DRay).origin; + o = Cartesian3.fromElements(o.y, o.z, 0, o); + const s = n.unproject(o); + if (!(s.latitude < -CesiumMath.PI_OVER_TWO || s.latitude > CesiumMath.PI_OVER_TWO)) + return n.ellipsoid.cartographicToCartesian(s, i); +} +const pickEllipsoidCVRay = new Ray(); +function pickMapColumbusView(e, t, n, i) { + const r = e.getPickRay(t, pickEllipsoidCVRay), o = -r.origin.x / r.direction.x; + Ray.getPoint(r, o, i); + const s = n.unproject(new Cartesian3(i.y, i.z, 0)); + if (!(s.latitude < -CesiumMath.PI_OVER_TWO || s.latitude > CesiumMath.PI_OVER_TWO || s.longitude < -Math.PI || s.longitude > Math.PI)) + return n.ellipsoid.cartographicToCartesian(s, i); +} +Camera.prototype.pickEllipsoid = function(e, t, n) { + const i = this._scene.canvas; + if (!(i.clientWidth === 0 || i.clientHeight === 0)) { + if (defined(n) || (n = new Cartesian3()), t = defaultValue(t, Ellipsoid.default), this._mode === SceneMode$1.SCENE3D) + n = pickEllipsoid3D(this, e, t, n); + else if (this._mode === SceneMode$1.SCENE2D) + n = pickMap2D(this, e, this._projection, n); + else if (this._mode === SceneMode$1.COLUMBUS_VIEW) + n = pickMapColumbusView( + this, + e, + this._projection, + n + ); + else + return; + return n; + } +}; +const pickPerspCenter = new Cartesian3(), pickPerspXDir = new Cartesian3(), pickPerspYDir = new Cartesian3(); +function getPickRayPerspective(e, t, n) { + const i = e._scene.canvas, r = i.clientWidth, o = i.clientHeight, s = Math.tan(e.frustum.fovy * 0.5), c = e.frustum.aspectRatio * s, l = e.frustum.near, d = 2 / r * t.x - 1, f = 2 / o * (o - t.y) - 1, h = e.positionWC; + Cartesian3.clone(h, n.origin); + const p = Cartesian3.multiplyByScalar( + e.directionWC, + l, + pickPerspCenter + ); + Cartesian3.add(h, p, p); + const m = Cartesian3.multiplyByScalar( + e.rightWC, + d * l * c, + pickPerspXDir + ), _ = Cartesian3.multiplyByScalar( + e.upWC, + f * l * s, + pickPerspYDir + ), y = Cartesian3.add(p, m, n.direction); + return Cartesian3.add(y, _, y), Cartesian3.subtract(y, h, y), Cartesian3.normalize(y, y), n; +} +const scratchDirection = new Cartesian3(); +function getPickRayOrthographic(e, t, n) { + const i = e._scene.canvas, r = i.clientWidth, o = i.clientHeight; + let s = e.frustum; + const c = s.offCenterFrustum; + defined(c) && (s = c); + let l = 2 / r * t.x - 1; + l *= (s.right - s.left) * 0.5; + let d = 2 / o * (o - t.y) - 1; + d *= (s.top - s.bottom) * 0.5; + const f = n.origin; + return Cartesian3.clone(e.position, f), Cartesian3.multiplyByScalar(e.right, l, scratchDirection), Cartesian3.add(scratchDirection, f, f), Cartesian3.multiplyByScalar(e.up, d, scratchDirection), Cartesian3.add(scratchDirection, f, f), Cartesian3.clone(e.directionWC, n.direction), (e._mode === SceneMode$1.COLUMBUS_VIEW || e._mode === SceneMode$1.SCENE2D) && Cartesian3.fromElements( + n.origin.z, + n.origin.x, + n.origin.y, + n.origin + ), n; +} +Camera.prototype.getPickRay = function(e, t) { + defined(t) || (t = new Ray()); + const n = this._scene.canvas; + if (n.clientWidth <= 0 || n.clientHeight <= 0) + return; + const i = this.frustum; + return defined(i.aspectRatio) && defined(i.fov) && defined(i.near) ? getPickRayPerspective(this, e, t) : getPickRayOrthographic(this, e, t); +}; +const scratchToCenter = new Cartesian3(), scratchProj = new Cartesian3(); +Camera.prototype.distanceToBoundingSphere = function(e) { + const t = Cartesian3.subtract( + this.positionWC, + e.center, + scratchToCenter + ), n = Cartesian3.multiplyByScalar( + this.directionWC, + Cartesian3.dot(t, this.directionWC), + scratchProj + ); + return Math.max(0, Cartesian3.magnitude(n) - e.radius); +}; +const scratchPixelSize = new Cartesian2(); +Camera.prototype.getPixelSize = function(e, t, n) { + const i = this.distanceToBoundingSphere(e), r = this.frustum.getPixelDimensions( + t, + n, + i, + this._scene.pixelRatio, + scratchPixelSize + ); + return Math.max(r.x, r.y); +}; +function createAnimationTemplateCV(e, t, n, i, r, o) { + const s = Cartesian3.clone(t); + n.y > i ? s.y -= n.y - i : n.y < -i && (s.y += -i - n.y), n.z > r ? s.z -= n.z - r : n.z < -r && (s.z += -r - n.z); + function c(l) { + const d = Cartesian3.lerp( + t, + s, + l.time, + new Cartesian3() + ); + e.worldToCameraCoordinatesPoint(d, e.position); + } + return { + easingFunction: EasingFunction$1.EXPONENTIAL_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + duration: o, + update: c + }; +} +const normalScratch = new Cartesian3(), centerScratch = new Cartesian3(), posScratch = new Cartesian3(), scratchCartesian3Subtract = new Cartesian3(); +function createAnimationCV(e, t) { + let n = e.position; + const i = e.direction, r = e.worldToCameraCoordinatesVector( + Cartesian3.UNIT_X, + normalScratch + ), o = -Cartesian3.dot(r, n) / Cartesian3.dot(r, i), s = Cartesian3.add( + n, + Cartesian3.multiplyByScalar(i, o, centerScratch), + centerScratch + ); + e.cameraToWorldCoordinatesPoint(s, s), n = e.cameraToWorldCoordinatesPoint(e.position, posScratch); + const c = Math.tan(e.frustum.fovy * 0.5), l = e.frustum.aspectRatio * c, d = Cartesian3.magnitude( + Cartesian3.subtract(n, s, scratchCartesian3Subtract) + ), f = l * d, h = c * d, p = e._maxCoord.x, m = e._maxCoord.y, _ = Math.max(f - p, p), y = Math.max(h - m, m); + if (n.z < -_ || n.z > _ || n.y < -y || n.y > y) { + const C = s.y < -_ || s.y > _, T = s.z < -y || s.z > y; + if (C || T) + return createAnimationTemplateCV( + e, + n, + s, + _, + y, + t + ); + } +} +Camera.prototype.createCorrectPositionTween = function(e) { + if (this._mode === SceneMode$1.COLUMBUS_VIEW) + return createAnimationCV(this, e); +}; +const scratchFlyToDestination = new Cartesian3(), newOptions = { + destination: void 0, + heading: void 0, + pitch: void 0, + roll: void 0, + duration: void 0, + complete: void 0, + cancel: void 0, + endTransform: void 0, + maximumHeight: void 0, + easingFunction: void 0 +}; +Camera.prototype.cancelFlight = function() { + defined(this._currentFlight) && (this._currentFlight.cancelTween(), this._currentFlight = void 0); +}; +Camera.prototype.completeFlight = function() { + if (defined(this._currentFlight)) { + this._currentFlight.cancelTween(); + const e = { + destination: void 0, + orientation: { + heading: void 0, + pitch: void 0, + roll: void 0 + } + }; + e.destination = newOptions.destination, e.orientation.heading = newOptions.heading, e.orientation.pitch = newOptions.pitch, e.orientation.roll = newOptions.roll, this.setView(e), defined(this._currentFlight.complete) && this._currentFlight.complete(), this._currentFlight = void 0; + } +}; +Camera.prototype.flyTo = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let t = e.destination; + if (this._mode === SceneMode$1.MORPHING) + return; + this.cancelFlight(); + const i = t instanceof Rectangle; + i && (t = this.getRectangleCameraCoordinates( + t, + scratchFlyToDestination + )); + let r = defaultValue( + e.orientation, + defaultValue.EMPTY_OBJECT + ); + if (defined(r.direction) && (r = directionUpToHeadingPitchRoll( + this, + t, + r, + scratchSetViewOptions.orientation + )), defined(e.duration) && e.duration <= 0) { + const f = scratchSetViewOptions; + f.destination = e.destination, f.orientation.heading = r.heading, f.orientation.pitch = r.pitch, f.orientation.roll = r.roll, f.convert = e.convert, f.endTransform = e.endTransform, this.setView(f), typeof e.complete == "function" && e.complete(); + return; + } + const o = this; + let s; + newOptions.destination = t, newOptions.heading = r.heading, newOptions.pitch = r.pitch, newOptions.roll = r.roll, newOptions.duration = e.duration, newOptions.complete = function() { + s === o._currentFlight && (o._currentFlight = void 0), defined(e.complete) && e.complete(); + }, newOptions.cancel = e.cancel, newOptions.endTransform = e.endTransform, newOptions.convert = i ? !1 : e.convert, newOptions.maximumHeight = e.maximumHeight, newOptions.pitchAdjustHeight = e.pitchAdjustHeight, newOptions.flyOverLongitude = e.flyOverLongitude, newOptions.flyOverLongitudeWeight = e.flyOverLongitudeWeight, newOptions.easingFunction = e.easingFunction; + const c = this._scene, l = CameraFlightPath.createTween(c, newOptions); + if (l.duration === 0) { + typeof l.complete == "function" && l.complete(); + return; + } + s = c.tweens.add(l), this._currentFlight = s; + let d = this._scene.preloadFlightCamera; + this._mode !== SceneMode$1.SCENE2D && (defined(d) || (d = Camera.clone(this)), d.setView({ + destination: t, + orientation: r + }), this._scene.preloadFlightCullingVolume = d.frustum.computeCullingVolume( + d.positionWC, + d.directionWC, + d.upWC + )); +}; +function distanceToBoundingSphere3D(e, t) { + const n = e.frustum, i = Math.tan(n.fovy * 0.5), r = n.aspectRatio * i; + return Math.max(t / r, t / i); +} +function distanceToBoundingSphere2D(e, t) { + let n = e.frustum; + const i = n.offCenterFrustum; + defined(i) && (n = i); + let r, o; + const s = n.right / n.top, c = t * s; + return t > c ? (r = t, o = r / s) : (o = t, r = c), Math.max(r, o) * 1.5; +} +const MINIMUM_ZOOM = 100; +function adjustBoundingSphereOffset(e, t, n) { + n = HeadingPitchRange.clone( + defined(n) ? n : Camera.DEFAULT_OFFSET + ); + const i = e._scene.screenSpaceCameraController.minimumZoomDistance, r = e._scene.screenSpaceCameraController.maximumZoomDistance, o = n.range; + if (!defined(o) || o === 0) { + const s = t.radius; + s === 0 ? n.range = MINIMUM_ZOOM : e.frustum instanceof OrthographicFrustum || e._mode === SceneMode$1.SCENE2D ? n.range = distanceToBoundingSphere2D(e, s) : n.range = distanceToBoundingSphere3D(e, s), n.range = CesiumMath.clamp(n.range, i, r); + } + return n; +} +Camera.prototype.viewBoundingSphere = function(e, t) { + t = adjustBoundingSphereOffset(this, e, t), this.lookAt(e.center, t); +}; +const scratchflyToBoundingSphereTransform = new Matrix4(), scratchflyToBoundingSphereDestination = new Cartesian3(), scratchflyToBoundingSphereDirection = new Cartesian3(), scratchflyToBoundingSphereUp = new Cartesian3(), scratchflyToBoundingSphereRight = new Cartesian3(), scratchFlyToBoundingSphereCart4 = new Cartesian4(), scratchFlyToBoundingSphereQuaternion = new Quaternion(), scratchFlyToBoundingSphereMatrix3 = new Matrix3(); +Camera.prototype.flyToBoundingSphere = function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = this._mode === SceneMode$1.SCENE2D || this._mode === SceneMode$1.COLUMBUS_VIEW; + this._setTransform(Matrix4.IDENTITY); + const i = adjustBoundingSphereOffset( + this, + e, + t.offset + ); + let r; + n ? r = Cartesian3.multiplyByScalar( + Cartesian3.UNIT_Z, + i.range, + scratchflyToBoundingSphereDestination + ) : r = offsetFromHeadingPitchRange( + i.heading, + i.pitch, + i.range + ); + const o = this._scene, s = defaultValue(o.ellipsoid, Ellipsoid.default), c = Transforms.eastNorthUpToFixedFrame( + e.center, + s, + scratchflyToBoundingSphereTransform + ); + Matrix4.multiplyByPoint(c, r, r); + let l, d; + if (!n) { + if (l = Cartesian3.subtract( + e.center, + r, + scratchflyToBoundingSphereDirection + ), Cartesian3.normalize(l, l), d = Matrix4.multiplyByPointAsVector( + c, + Cartesian3.UNIT_Z, + scratchflyToBoundingSphereUp + ), 1 - Math.abs(Cartesian3.dot(l, d)) < CesiumMath.EPSILON6) { + const h = Quaternion.fromAxisAngle( + l, + i.heading, + scratchFlyToBoundingSphereQuaternion + ), p = Matrix3.fromQuaternion( + h, + scratchFlyToBoundingSphereMatrix3 + ); + Cartesian3.fromCartesian4( + Matrix4.getColumn(c, 1, scratchFlyToBoundingSphereCart4), + d + ), Matrix3.multiplyByVector(p, d, d); + } + const f = Cartesian3.cross( + l, + d, + scratchflyToBoundingSphereRight + ); + Cartesian3.cross(f, l, d), Cartesian3.normalize(d, d); + } + this.flyTo({ + destination: r, + orientation: { + direction: l, + up: d + }, + duration: t.duration, + complete: t.complete, + cancel: t.cancel, + endTransform: t.endTransform, + maximumHeight: t.maximumHeight, + easingFunction: t.easingFunction, + flyOverLongitude: t.flyOverLongitude, + flyOverLongitudeWeight: t.flyOverLongitudeWeight, + pitchAdjustHeight: t.pitchAdjustHeight + }); +}; +const scratchCartesian3_1 = new Cartesian3(), scratchCartesian3_2 = new Cartesian3(), scratchCartesian3_3 = new Cartesian3(), scratchCartesian3_4 = new Cartesian3(), horizonPoints = [ + new Cartesian3(), + new Cartesian3(), + new Cartesian3(), + new Cartesian3() +]; +function computeHorizonQuad(e, t) { + const n = t.radii, i = e.positionWC, r = Cartesian3.multiplyComponents( + t.oneOverRadii, + i, + scratchCartesian3_1 + ), o = Cartesian3.magnitude(r), s = Cartesian3.normalize(r, scratchCartesian3_2); + let c, l; + Cartesian3.equalsEpsilon(s, Cartesian3.UNIT_Z, CesiumMath.EPSILON10) ? (c = new Cartesian3(0, 1, 0), l = new Cartesian3(0, 0, 1)) : (c = Cartesian3.normalize( + Cartesian3.cross(Cartesian3.UNIT_Z, s, scratchCartesian3_3), + scratchCartesian3_3 + ), l = Cartesian3.normalize( + Cartesian3.cross(s, c, scratchCartesian3_4), + scratchCartesian3_4 + )); + const d = Math.sqrt(Cartesian3.magnitudeSquared(r) - 1), f = Cartesian3.multiplyByScalar( + s, + 1 / o, + scratchCartesian3_1 + ), h = d / o, p = Cartesian3.multiplyByScalar( + c, + h, + scratchCartesian3_2 + ), m = Cartesian3.multiplyByScalar( + l, + h, + scratchCartesian3_3 + ), _ = Cartesian3.add(f, m, horizonPoints[0]); + Cartesian3.subtract(_, p, _), Cartesian3.multiplyComponents(n, _, _); + const y = Cartesian3.subtract(f, m, horizonPoints[1]); + Cartesian3.subtract(y, p, y), Cartesian3.multiplyComponents(n, y, y); + const C = Cartesian3.subtract(f, m, horizonPoints[2]); + Cartesian3.add(C, p, C), Cartesian3.multiplyComponents(n, C, C); + const T = Cartesian3.add(f, m, horizonPoints[3]); + return Cartesian3.add(T, p, T), Cartesian3.multiplyComponents(n, T, T), horizonPoints; +} +const scratchPickCartesian2 = new Cartesian2(), scratchRectCartesian = new Cartesian3(), cartoArray = [ + new Cartographic(), + new Cartographic(), + new Cartographic(), + new Cartographic() +]; +function addToResult(e, t, n, i, r, o) { + scratchPickCartesian2.x = e, scratchPickCartesian2.y = t; + const s = i.pickEllipsoid( + scratchPickCartesian2, + r, + scratchRectCartesian + ); + return defined(s) ? (cartoArray[n] = r.cartesianToCartographic(s, cartoArray[n]), 1) : (cartoArray[n] = r.cartesianToCartographic( + o[n], + cartoArray[n] + ), 0); +} +Camera.prototype.computeViewRectangle = function(e, t) { + e = defaultValue(e, Ellipsoid.default); + const n = this.frustum.computeCullingVolume( + this.positionWC, + this.directionWC, + this.upWC + ), i = new BoundingSphere( + Cartesian3.ZERO, + e.maximumRadius + ); + if (n.computeVisibility(i) === Intersect$1.OUTSIDE) + return; + const o = this._scene.canvas, s = o.clientWidth, c = o.clientHeight; + let l = 0; + const d = computeHorizonQuad(this, e); + if (l += addToResult( + 0, + 0, + 0, + this, + e, + d + ), l += addToResult( + 0, + c, + 1, + this, + e, + d + ), l += addToResult( + s, + c, + 2, + this, + e, + d + ), l += addToResult( + s, + 0, + 3, + this, + e, + d + ), l < 2) + return Rectangle.MAX_VALUE; + t = Rectangle.fromCartographicArray(cartoArray, t); + let f = 0, h = cartoArray[3].longitude; + for (let p = 0; p < 4; ++p) { + const m = cartoArray[p].longitude, _ = Math.abs(m - h); + _ > CesiumMath.PI ? f += CesiumMath.TWO_PI - _ : f += _, h = m; + } + return CesiumMath.equalsEpsilon( + Math.abs(f), + CesiumMath.TWO_PI, + CesiumMath.EPSILON9 + ) && (t.west = -CesiumMath.PI, t.east = CesiumMath.PI, cartoArray[0].latitude >= 0 ? t.north = CesiumMath.PI_OVER_TWO : t.south = -CesiumMath.PI_OVER_TWO), t; +}; +Camera.prototype.switchToPerspectiveFrustum = function() { + if (this._mode === SceneMode$1.SCENE2D || this.frustum instanceof PerspectiveFrustum) + return; + const e = this._scene; + this.frustum = new PerspectiveFrustum(), this.frustum.aspectRatio = e.drawingBufferWidth / e.drawingBufferHeight, this.frustum.fov = CesiumMath.toRadians(60); +}; +Camera.prototype.switchToOrthographicFrustum = function() { + if (this._mode === SceneMode$1.SCENE2D || this.frustum instanceof OrthographicFrustum) + return; + const e = calculateOrthographicFrustumWidth(this), t = this._scene; + this.frustum = new OrthographicFrustum(), this.frustum.aspectRatio = t.drawingBufferWidth / t.drawingBufferHeight, this.frustum.width = e; +}; +Camera.clone = function(e, t) { + return defined(t) || (t = new Camera(e._scene)), Cartesian3.clone(e.position, t.position), Cartesian3.clone(e.direction, t.direction), Cartesian3.clone(e.up, t.up), Cartesian3.clone(e.right, t.right), Matrix4.clone(e._transform, t.transform), t._transformChanged = !0, t.frustum = e.frustum.clone(), t; +}; +function Cesium3DTilePassState(e) { + this.pass = e.pass, this.commandList = e.commandList, this.camera = e.camera, this.cullingVolume = e.cullingVolume, this.ready = !1; +} +const mobileWidth = 576, lightboxHeight = 100, textColor = "#ffffff", highlightColor = "#48b"; +function CreditDisplayElement(e, t) { + this.credit = e, this.count = defaultValue(t, 1); +} +function contains(e, t) { + const n = e.length; + for (let i = 0; i < n; i++) { + const r = e[i]; + if (Credit.equals(r, t)) + return !0; + } + return !1; +} +function swapCesiumCredit(e) { + const t = e._previousCesiumCredit, n = e._currentCesiumCredit; + Credit.equals(n, t) || (defined(t) && e._cesiumCreditContainer.removeChild(t.element), defined(n) && e._cesiumCreditContainer.appendChild(n.element), e._previousCesiumCredit = n); +} +const delimiterClassName = "cesium-credit-delimiter"; +function createDelimiterElement(e) { + const t = document.createElement("span"); + return t.textContent = e, t.className = delimiterClassName, t; +} +function createCreditElement(e, t) { + if (defined(t)) { + const n = document.createElement(t); + n._creditId = e._creditId, n.appendChild(e), e = n; + } + return e; +} +function displayCredits(e, t, n, i) { + const r = e.childNodes; + let o = -1; + t.sort(function(s, c) { + return c.count - s.count; + }); + for (let s = 0; s < t.length; ++s) { + const c = t[s].credit; + if (defined(c)) { + if (o = s, defined(n) && (o *= 2, s > 0)) { + const d = o - 1; + if (r.length <= d) + e.appendChild(createDelimiterElement(n)); + else { + const f = r[d]; + f.className !== delimiterClassName && e.replaceChild( + createDelimiterElement(n), + f + ); + } + } + const l = c.element; + if (r.length <= o) + e.appendChild( + createCreditElement(l, i) + ); + else { + const d = r[o]; + d._creditId !== c._id && e.replaceChild( + createCreditElement(l, i), + d + ); + } + } + } + for (++o; o < r.length; ) + e.removeChild(r[o]); +} +function styleLightboxContainer(e) { + const t = e._lightboxCredits, n = e.viewport.clientWidth, i = e.viewport.clientHeight; + n !== e._lastViewportWidth && (n < mobileWidth ? (t.className = "cesium-credit-lightbox cesium-credit-lightbox-mobile", t.style.marginTop = "0") : (t.className = "cesium-credit-lightbox cesium-credit-lightbox-expanded", t.style.marginTop = `${Math.floor( + (i - t.clientHeight) * 0.5 + )}px`), e._lastViewportWidth = n), n >= mobileWidth && i !== e._lastViewportHeight && (t.style.marginTop = `${Math.floor( + (i - t.clientHeight) * 0.5 + )}px`, e._lastViewportHeight = i); +} +function appendCss(e) { + const t = ( + /*css*/ + ` +.cesium-credit-lightbox-overlay { + display: none; + z-index: 1; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(80, 80, 80, 0.8); +} + +.cesium-credit-lightbox { + background-color: #303336; + color: ${textColor}; + position: relative; + min-height: ${lightboxHeight}px; + margin: auto; +} +.cesium-credit-lightbox > ul > li a, +.cesium-credit-lightbox > ul > li a:visited, +.cesium-credit-wrapper a, +.cesium-credit-wrapper a:visited { + color: ${textColor}; +} +.cesium-credit-lightbox > ul > li a:hover { + color: ${highlightColor}; +} +.cesium-credit-lightbox.cesium-credit-lightbox-expanded { + border: 1px solid #444; + border-radius: 5px; + max-width: 370px; +} +.cesium-credit-lightbox.cesium-credit-lightbox-mobile { + height: 100%; + width: 100%; +} +.cesium-credit-lightbox-title { + padding: 20px 20px 0 20px; +} +.cesium-credit-lightbox-close { + font-size: 18pt; + cursor: pointer; + position: absolute; + top: 0; + right: 6px; + color: ${textColor}; +} +.cesium-credit-lightbox-close:hover { + color: ${highlightColor}; +} +.cesium-credit-lightbox > ul { + margin: 0; + padding: 12px 20px 12px 40px; + font-size: 13px; +} +.cesium-credit-lightbox > ul > li { + padding-bottom: 6px; +} +.cesium-credit-lightbox > ul > li * { + padding: 0; + margin: 0; +} + +.cesium-credit-expand-link { + padding-left: 5px; + cursor: pointer; + text-decoration: underline; + color: ${textColor}; +} +.cesium-credit-expand-link:hover { + color: ${highlightColor}; +} + +.cesium-credit-text { + color: ${textColor}; +} + +.cesium-credit-delimiter { + padding: 0 5px; +} + +.cesium-credit-textContainer *, +.cesium-credit-logoContainer * { + display: inline; +} + +.cesium-credit-textContainer a:hover { + color: ${highlightColor} +} + +.cesium-credit-textContainer .cesium-credit-wrapper:first-of-type { + padding-left: 5px; +} +` + ); + function n(o) { + if (o.shadowRoot) + return o.shadowRoot; + if (o.getRootNode) { + const s = o.getRootNode(); + if (s instanceof ShadowRoot) + return s; + } + } + const i = defaultValue( + n(e), + document.head + ), r = document.createElement("style"); + r.innerHTML = t, i.appendChild(r); +} +function CreditDisplay(e, t, n) { + const i = this; + n = defaultValue(n, document.body); + const r = document.createElement("div"); + r.className = "cesium-credit-lightbox-overlay", n.appendChild(r); + const o = document.createElement("div"); + o.className = "cesium-credit-lightbox", r.appendChild(o); + function s(_) { + o.contains(_.target) || i.hideLightbox(); + } + r.addEventListener("click", s, !1); + const c = document.createElement("div"); + c.className = "cesium-credit-lightbox-title", c.textContent = "Data provided by:", o.appendChild(c); + const l = document.createElement("a"); + l.onclick = this.hideLightbox.bind(this), l.innerHTML = "×", l.className = "cesium-credit-lightbox-close", o.appendChild(l); + const d = document.createElement("ul"); + o.appendChild(d); + const f = document.createElement("div"); + f.className = "cesium-credit-logoContainer", f.style.display = "inline", e.appendChild(f); + const h = document.createElement("div"); + h.className = "cesium-credit-textContainer", h.style.display = "inline", e.appendChild(h); + const p = document.createElement("a"); + p.className = "cesium-credit-expand-link", p.onclick = this.showLightbox.bind(this), p.textContent = "Data attribution", e.appendChild(p), appendCss(e); + const m = Credit.clone(CreditDisplay.cesiumCredit); + this._delimiter = defaultValue(t, "•"), this._screenContainer = h, this._cesiumCreditContainer = f, this._lastViewportHeight = void 0, this._lastViewportWidth = void 0, this._lightboxCredits = o, this._creditList = d, this._lightbox = r, this._hideLightbox = s, this._expandLink = p, this._expanded = !1, this._staticCredits = [], this._cesiumCredit = m, this._previousCesiumCredit = void 0, this._currentCesiumCredit = m, this._creditDisplayElementPool = [], this._creditDisplayElementIndex = 0, this._currentFrameCredits = { + screenCredits: new AssociativeArray(), + lightboxCredits: new AssociativeArray() + }, this._defaultCredit = void 0, this.viewport = n, this.container = e; +} +function setCredit(e, t, n, i) { + i = defaultValue(i, 1); + let r = t.get(n.id); + if (defined(r)) + r.count < Number.MAX_VALUE && (r.count += i); + else { + const o = e._creditDisplayElementPool, s = e._creditDisplayElementPoolIndex; + s < o.length ? (r = o[s], r.credit = n, r.count = i) : (r = new CreditDisplayElement(n, i), o.push(r)), ++e._creditDisplayElementPoolIndex, t.set(n.id, r); + } +} +CreditDisplay.prototype.addCreditToNextFrame = function(e) { + if (e.isIon()) { + defined(this._defaultCredit) || (this._defaultCredit = Credit.clone(getDefaultCredit())), this._currentCesiumCredit = this._defaultCredit; + return; + } + let t; + e.showOnScreen ? t = this._currentFrameCredits.screenCredits : t = this._currentFrameCredits.lightboxCredits, setCredit(this, t, e); +}; +CreditDisplay.prototype.addStaticCredit = function(e) { + const t = this._staticCredits; + contains(t, e) || t.push(e); +}; +CreditDisplay.prototype.removeStaticCredit = function(e) { + const t = this._staticCredits, n = t.indexOf(e); + n !== -1 && t.splice(n, 1); +}; +CreditDisplay.prototype.showLightbox = function() { + this._lightbox.style.display = "block", this._expanded = !0; +}; +CreditDisplay.prototype.hideLightbox = function() { + this._lightbox.style.display = "none", this._expanded = !1; +}; +CreditDisplay.prototype.update = function() { + this._expanded && styleLightboxContainer(this); +}; +CreditDisplay.prototype.beginFrame = function() { + const e = this._currentFrameCredits; + this._creditDisplayElementPoolIndex = 0; + const t = e.screenCredits, n = e.lightboxCredits; + t.removeAll(), n.removeAll(); + const i = this._staticCredits; + for (let r = 0; r < i.length; ++r) { + const o = i[r], s = o.showOnScreen ? t : n; + o.isIon() && Credit.equals(CreditDisplay.cesiumCredit, this._cesiumCredit) || setCredit(this, s, o, Number.MAX_VALUE); + } + Credit.equals(CreditDisplay.cesiumCredit, this._cesiumCredit) || (this._cesiumCredit = Credit.clone(CreditDisplay.cesiumCredit)), this._currentCesiumCredit = this._cesiumCredit; +}; +CreditDisplay.prototype.endFrame = function() { + const e = this._currentFrameCredits.screenCredits.values; + displayCredits( + this._screenContainer, + e, + this._delimiter, + void 0 + ); + const t = this._currentFrameCredits.lightboxCredits.values; + this._expandLink.style.display = t.length > 0 ? "inline" : "none", displayCredits(this._creditList, t, void 0, "li"), swapCesiumCredit(this); +}; +CreditDisplay.prototype.destroy = function() { + return this._lightbox.removeEventListener("click", this._hideLightbox, !1), this.container.removeChild(this._cesiumCreditContainer), this.container.removeChild(this._screenContainer), this.container.removeChild(this._expandLink), this.viewport.removeChild(this._lightbox), destroyObject(this); +}; +CreditDisplay.prototype.isDestroyed = function() { + return !1; +}; +CreditDisplay._cesiumCredit = void 0; +CreditDisplay._cesiumCreditInitialized = !1; +let defaultCredit$2; +function getDefaultCredit() { + if (!defined(defaultCredit$2)) { + let e = buildModuleUrl("Assets/Images/ion-credit.png"); + e.indexOf("http://") !== 0 && e.indexOf("https://") !== 0 && e.indexOf("data:") !== 0 && (e = new Uri(e).path()), defaultCredit$2 = new Credit( + `<a href="https://cesium.com/" target="_blank"><img src="${e}" style="vertical-align: -7px" title="Cesium ion"/></a>`, + !0 + ); + } + return CreditDisplay._cesiumCreditInitialized || (CreditDisplay._cesiumCredit = defaultCredit$2, CreditDisplay._cesiumCreditInitialized = !0), defaultCredit$2; +} +Object.defineProperties(CreditDisplay, { + /** + * Gets or sets the Cesium logo credit. + * @memberof CreditDisplay + * @type {Credit} + */ + cesiumCredit: { + get: function() { + return getDefaultCredit(), CreditDisplay._cesiumCredit; + }, + set: function(e) { + CreditDisplay._cesiumCredit = e, CreditDisplay._cesiumCreditInitialized = !0; + } + } +}); +CreditDisplay.CreditDisplayElement = CreditDisplayElement; +const PERSPECTIVE$1 = 0, ORTHOGRAPHIC$1 = 1; +function FrustumGeometry(e) { + const t = e.frustum, n = e.orientation, i = e.origin, r = defaultValue(e.vertexFormat, VertexFormat.DEFAULT), o = defaultValue(e._drawNearPlane, !0); + let s, c; + t instanceof PerspectiveFrustum ? (s = PERSPECTIVE$1, c = PerspectiveFrustum.packedLength) : t instanceof OrthographicFrustum && (s = ORTHOGRAPHIC$1, c = OrthographicFrustum.packedLength), this._frustumType = s, this._frustum = t.clone(), this._origin = Cartesian3.clone(i), this._orientation = Quaternion.clone(n), this._drawNearPlane = o, this._vertexFormat = r, this._workerName = "createFrustumGeometry", this.packedLength = 2 + c + Cartesian3.packedLength + Quaternion.packedLength + VertexFormat.packedLength; +} +FrustumGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + const i = e._frustumType, r = e._frustum; + return t[n++] = i, i === PERSPECTIVE$1 ? (PerspectiveFrustum.pack(r, t, n), n += PerspectiveFrustum.packedLength) : (OrthographicFrustum.pack(r, t, n), n += OrthographicFrustum.packedLength), Cartesian3.pack(e._origin, t, n), n += Cartesian3.packedLength, Quaternion.pack(e._orientation, t, n), n += Quaternion.packedLength, VertexFormat.pack(e._vertexFormat, t, n), n += VertexFormat.packedLength, t[n] = e._drawNearPlane ? 1 : 0, t; +}; +const scratchPackPerspective$1 = new PerspectiveFrustum(), scratchPackOrthographic$1 = new OrthographicFrustum(), scratchPackQuaternion$1 = new Quaternion(), scratchPackorigin$1 = new Cartesian3(), scratchVertexFormat = new VertexFormat(); +FrustumGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = e[t++]; + let r; + i === PERSPECTIVE$1 ? (r = PerspectiveFrustum.unpack( + e, + t, + scratchPackPerspective$1 + ), t += PerspectiveFrustum.packedLength) : (r = OrthographicFrustum.unpack( + e, + t, + scratchPackOrthographic$1 + ), t += OrthographicFrustum.packedLength); + const o = Cartesian3.unpack(e, t, scratchPackorigin$1); + t += Cartesian3.packedLength; + const s = Quaternion.unpack( + e, + t, + scratchPackQuaternion$1 + ); + t += Quaternion.packedLength; + const c = VertexFormat.unpack( + e, + t, + scratchVertexFormat + ); + t += VertexFormat.packedLength; + const l = e[t] === 1; + if (!defined(n)) + return new FrustumGeometry({ + frustum: r, + origin: o, + orientation: s, + vertexFormat: c, + _drawNearPlane: l + }); + const d = i === n._frustumType ? n._frustum : void 0; + return n._frustum = r.clone(d), n._frustumType = i, n._origin = Cartesian3.clone(o, n._origin), n._orientation = Quaternion.clone(s, n._orientation), n._vertexFormat = VertexFormat.clone(c, n._vertexFormat), n._drawNearPlane = l, n; +}; +function getAttributes(e, t, n, i, r, o, s, c) { + const l = e / 3 * 2; + for (let d = 0; d < 4; ++d) + defined(t) && (t[e] = o.x, t[e + 1] = o.y, t[e + 2] = o.z), defined(n) && (n[e] = s.x, n[e + 1] = s.y, n[e + 2] = s.z), defined(i) && (i[e] = c.x, i[e + 1] = c.y, i[e + 2] = c.z), e += 3; + r[l] = 0, r[l + 1] = 0, r[l + 2] = 1, r[l + 3] = 0, r[l + 4] = 1, r[l + 5] = 1, r[l + 6] = 0, r[l + 7] = 1; +} +const scratchRotationMatrix$1 = new Matrix3(), scratchViewMatrix = new Matrix4(), scratchInverseMatrix = new Matrix4(), scratchXDirection = new Cartesian3(), scratchYDirection = new Cartesian3(), scratchZDirection = new Cartesian3(), scratchNegativeX = new Cartesian3(), scratchNegativeY = new Cartesian3(), scratchNegativeZ = new Cartesian3(), frustumSplits = new Array(3), frustumCornersNDC$1 = new Array(4); +frustumCornersNDC$1[0] = new Cartesian4(-1, -1, 1, 1); +frustumCornersNDC$1[1] = new Cartesian4(1, -1, 1, 1); +frustumCornersNDC$1[2] = new Cartesian4(1, 1, 1, 1); +frustumCornersNDC$1[3] = new Cartesian4(-1, 1, 1, 1); +const scratchFrustumCorners$1 = new Array(4); +for (let e = 0; e < 4; ++e) + scratchFrustumCorners$1[e] = new Cartesian4(); +FrustumGeometry._computeNearFarPlanes = function(e, t, n, i, r, o, s, c) { + const l = Matrix3.fromQuaternion( + t, + scratchRotationMatrix$1 + ); + let d = defaultValue(o, scratchXDirection), f = defaultValue(s, scratchYDirection), h = defaultValue(c, scratchZDirection); + d = Matrix3.getColumn(l, 0, d), f = Matrix3.getColumn(l, 1, f), h = Matrix3.getColumn(l, 2, h), Cartesian3.normalize(d, d), Cartesian3.normalize(f, f), Cartesian3.normalize(h, h), Cartesian3.negate(d, d); + const p = Matrix4.computeView(e, h, f, d, scratchViewMatrix); + let m, _; + const y = i.projectionMatrix; + if (n === PERSPECTIVE$1) { + const C = Matrix4.multiply( + y, + p, + scratchInverseMatrix + ); + _ = Matrix4.inverse( + C, + scratchInverseMatrix + ); + } else + m = Matrix4.inverseTransformation(p, scratchInverseMatrix); + defined(_) ? (frustumSplits[0] = i.near, frustumSplits[1] = i.far) : (frustumSplits[0] = 0, frustumSplits[1] = i.near, frustumSplits[2] = i.far); + for (let C = 0; C < 2; ++C) + for (let T = 0; T < 4; ++T) { + let x = Cartesian4.clone( + frustumCornersNDC$1[T], + scratchFrustumCorners$1[T] + ); + if (defined(_)) { + x = Matrix4.multiplyByVector( + _, + x, + x + ); + const b = 1 / x.w; + Cartesian3.multiplyByScalar(x, b, x), Cartesian3.subtract(x, e, x), Cartesian3.normalize(x, x); + const S = Cartesian3.dot(h, x); + Cartesian3.multiplyByScalar(x, frustumSplits[C] / S, x), Cartesian3.add(x, e, x); + } else { + const b = i.offCenterFrustum; + defined(b) && (i = b); + const S = frustumSplits[C], E = frustumSplits[C + 1]; + x.x = (x.x * (i.right - i.left) + i.left + i.right) * 0.5, x.y = (x.y * (i.top - i.bottom) + i.bottom + i.top) * 0.5, x.z = (x.z * (S - E) - S - E) * 0.5, x.w = 1, Matrix4.multiplyByVector(m, x, x); + } + r[12 * C + T * 3] = x.x, r[12 * C + T * 3 + 1] = x.y, r[12 * C + T * 3 + 2] = x.z; + } +}; +FrustumGeometry.createGeometry = function(e) { + const t = e._frustumType, n = e._frustum, i = e._origin, r = e._orientation, o = e._drawNearPlane, s = e._vertexFormat, c = o ? 6 : 5; + let l = new Float64Array(3 * 4 * 6); + FrustumGeometry._computeNearFarPlanes( + i, + r, + t, + n, + l + ); + let d = 3 * 4 * 2; + l[d] = l[3 * 4], l[d + 1] = l[3 * 4 + 1], l[d + 2] = l[3 * 4 + 2], l[d + 3] = l[0], l[d + 4] = l[1], l[d + 5] = l[2], l[d + 6] = l[3 * 3], l[d + 7] = l[3 * 3 + 1], l[d + 8] = l[3 * 3 + 2], l[d + 9] = l[3 * 7], l[d + 10] = l[3 * 7 + 1], l[d + 11] = l[3 * 7 + 2], d += 3 * 4, l[d] = l[3 * 5], l[d + 1] = l[3 * 5 + 1], l[d + 2] = l[3 * 5 + 2], l[d + 3] = l[3], l[d + 4] = l[4], l[d + 5] = l[5], l[d + 6] = l[0], l[d + 7] = l[1], l[d + 8] = l[2], l[d + 9] = l[3 * 4], l[d + 10] = l[3 * 4 + 1], l[d + 11] = l[3 * 4 + 2], d += 3 * 4, l[d] = l[3], l[d + 1] = l[4], l[d + 2] = l[5], l[d + 3] = l[3 * 5], l[d + 4] = l[3 * 5 + 1], l[d + 5] = l[3 * 5 + 2], l[d + 6] = l[3 * 6], l[d + 7] = l[3 * 6 + 1], l[d + 8] = l[3 * 6 + 2], l[d + 9] = l[3 * 2], l[d + 10] = l[3 * 2 + 1], l[d + 11] = l[3 * 2 + 2], d += 3 * 4, l[d] = l[3 * 2], l[d + 1] = l[3 * 2 + 1], l[d + 2] = l[3 * 2 + 2], l[d + 3] = l[3 * 6], l[d + 4] = l[3 * 6 + 1], l[d + 5] = l[3 * 6 + 2], l[d + 6] = l[3 * 7], l[d + 7] = l[3 * 7 + 1], l[d + 8] = l[3 * 7 + 2], l[d + 9] = l[3 * 3], l[d + 10] = l[3 * 3 + 1], l[d + 11] = l[3 * 3 + 2], o || (l = l.subarray(3 * 4)); + const f = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: l + }) + }); + if (defined(s.normal) || defined(s.tangent) || defined(s.bitangent) || defined(s.st)) { + const p = defined(s.normal) ? new Float32Array(12 * c) : void 0, m = defined(s.tangent) ? new Float32Array(3 * 4 * c) : void 0, _ = defined(s.bitangent) ? new Float32Array(3 * 4 * c) : void 0, y = defined(s.st) ? new Float32Array(2 * 4 * c) : void 0, C = scratchXDirection, T = scratchYDirection, x = scratchZDirection, b = Cartesian3.negate(C, scratchNegativeX), S = Cartesian3.negate(T, scratchNegativeY), E = Cartesian3.negate(x, scratchNegativeZ); + d = 0, o && (getAttributes(d, p, m, _, y, E, C, T), d += 3 * 4), getAttributes(d, p, m, _, y, x, b, T), d += 3 * 4, getAttributes( + d, + p, + m, + _, + y, + b, + E, + T + ), d += 3 * 4, getAttributes( + d, + p, + m, + _, + y, + S, + E, + b + ), d += 3 * 4, getAttributes(d, p, m, _, y, C, x, T), d += 3 * 4, getAttributes(d, p, m, _, y, T, x, b), defined(p) && (f.normal = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: p + })), defined(m) && (f.tangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: m + })), defined(_) && (f.bitangent = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: _ + })), defined(y) && (f.st = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 2, + values: y + })); + } + const h = new Uint16Array(6 * c); + for (let p = 0; p < c; ++p) { + const m = p * 6, _ = p * 4; + h[m] = _, h[m + 1] = _ + 1, h[m + 2] = _ + 2, h[m + 3] = _, h[m + 4] = _ + 2, h[m + 5] = _ + 3; + } + return new Geometry({ + attributes: f, + indices: h, + primitiveType: PrimitiveType$1.TRIANGLES, + boundingSphere: BoundingSphere.fromVertices(l) + }); +}; +const PERSPECTIVE = 0, ORTHOGRAPHIC = 1; +function FrustumOutlineGeometry(e) { + const t = e.frustum, n = e.orientation, i = e.origin, r = defaultValue(e._drawNearPlane, !0); + let o, s; + t instanceof PerspectiveFrustum ? (o = PERSPECTIVE, s = PerspectiveFrustum.packedLength) : t instanceof OrthographicFrustum && (o = ORTHOGRAPHIC, s = OrthographicFrustum.packedLength), this._frustumType = o, this._frustum = t.clone(), this._origin = Cartesian3.clone(i), this._orientation = Quaternion.clone(n), this._drawNearPlane = r, this._workerName = "createFrustumOutlineGeometry", this.packedLength = 2 + s + Cartesian3.packedLength + Quaternion.packedLength; +} +FrustumOutlineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + const i = e._frustumType, r = e._frustum; + return t[n++] = i, i === PERSPECTIVE ? (PerspectiveFrustum.pack(r, t, n), n += PerspectiveFrustum.packedLength) : (OrthographicFrustum.pack(r, t, n), n += OrthographicFrustum.packedLength), Cartesian3.pack(e._origin, t, n), n += Cartesian3.packedLength, Quaternion.pack(e._orientation, t, n), n += Quaternion.packedLength, t[n] = e._drawNearPlane ? 1 : 0, t; +}; +const scratchPackPerspective = new PerspectiveFrustum(), scratchPackOrthographic = new OrthographicFrustum(), scratchPackQuaternion = new Quaternion(), scratchPackorigin = new Cartesian3(); +FrustumOutlineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + const i = e[t++]; + let r; + i === PERSPECTIVE ? (r = PerspectiveFrustum.unpack( + e, + t, + scratchPackPerspective + ), t += PerspectiveFrustum.packedLength) : (r = OrthographicFrustum.unpack( + e, + t, + scratchPackOrthographic + ), t += OrthographicFrustum.packedLength); + const o = Cartesian3.unpack(e, t, scratchPackorigin); + t += Cartesian3.packedLength; + const s = Quaternion.unpack( + e, + t, + scratchPackQuaternion + ); + t += Quaternion.packedLength; + const c = e[t] === 1; + if (!defined(n)) + return new FrustumOutlineGeometry({ + frustum: r, + origin: o, + orientation: s, + _drawNearPlane: c + }); + const l = i === n._frustumType ? n._frustum : void 0; + return n._frustum = r.clone(l), n._frustumType = i, n._origin = Cartesian3.clone(o, n._origin), n._orientation = Quaternion.clone(s, n._orientation), n._drawNearPlane = c, n; +}; +FrustumOutlineGeometry.createGeometry = function(e) { + const t = e._frustumType, n = e._frustum, i = e._origin, r = e._orientation, o = e._drawNearPlane, s = new Float64Array(3 * 4 * 2); + FrustumGeometry._computeNearFarPlanes( + i, + r, + t, + n, + s + ); + const c = new GeometryAttributes({ + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: s + }) + }); + let l, d; + const f = o ? 2 : 1, h = new Uint16Array(8 * (f + 1)); + let p = o ? 0 : 1; + for (; p < 2; ++p) + l = o ? p * 8 : 0, d = p * 4, h[l] = d, h[l + 1] = d + 1, h[l + 2] = d + 1, h[l + 3] = d + 2, h[l + 4] = d + 2, h[l + 5] = d + 3, h[l + 6] = d + 3, h[l + 7] = d; + for (p = 0; p < 2; ++p) + l = (f + p) * 8, d = p * 4, h[l] = d, h[l + 1] = d + 4, h[l + 2] = d + 1, h[l + 3] = d + 5, h[l + 4] = d + 2, h[l + 5] = d + 6, h[l + 6] = d + 3, h[l + 7] = d + 7; + return new Geometry({ + attributes: c, + indices: h, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: BoundingSphere.fromVertices(s) + }); +}; +function DebugCameraPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._camera = e.camera, this._frustumSplits = e.frustumSplits, this._color = defaultValue(e.color, Color.CYAN), this._updateOnChange = defaultValue(e.updateOnChange, !0), this.show = defaultValue(e.show, !0), this.id = e.id, this._id = void 0, this._outlinePrimitives = [], this._planesPrimitives = []; +} +const scratchRight$2 = new Cartesian3(), scratchRotation$3 = new Matrix3(), scratchOrientation = new Quaternion(), scratchPerspective = new PerspectiveFrustum(), scratchPerspectiveOffCenter = new PerspectiveOffCenterFrustum(), scratchOrthographic = new OrthographicFrustum(), scratchOrthographicOffCenter = new OrthographicOffCenterFrustum(), scratchColor$2 = new Color(), scratchSplits$1 = [1, 1e5]; +DebugCameraPrimitive.prototype.update = function(e) { + if (!this.show) + return; + const t = this._planesPrimitives, n = this._outlinePrimitives; + let i, r; + if (this._updateOnChange) { + for (r = t.length, i = 0; i < r; ++i) + n[i] = n[i] && n[i].destroy(), t[i] = t[i] && t[i].destroy(); + t.length = 0, n.length = 0; + } + if (t.length === 0) { + const o = this._camera, s = o.frustum; + let c; + s instanceof PerspectiveFrustum ? c = scratchPerspective : s instanceof PerspectiveOffCenterFrustum ? c = scratchPerspectiveOffCenter : s instanceof OrthographicFrustum ? c = scratchOrthographic : c = scratchOrthographicOffCenter, c = s.clone(c); + let l, d = this._frustumSplits; + !defined(d) || d.length <= 1 ? (d = scratchSplits$1, d[0] = this._camera.frustum.near, d[1] = this._camera.frustum.far, l = 1) : l = d.length - 1; + const f = o.positionWC, h = o.directionWC, p = o.upWC; + let m = o.rightWC; + m = Cartesian3.negate(m, scratchRight$2); + const _ = scratchRotation$3; + Matrix3.setColumn(_, 0, m, _), Matrix3.setColumn(_, 1, p, _), Matrix3.setColumn(_, 2, h, _); + const y = Quaternion.fromRotationMatrix( + _, + scratchOrientation + ); + for (t.length = n.length = l, i = 0; i < l; ++i) + c.near = d[i], c.far = d[i + 1], t[i] = new Primitive$3({ + geometryInstances: new GeometryInstance({ + geometry: new FrustumGeometry({ + origin: f, + orientation: y, + frustum: c, + _drawNearPlane: i === 0 + }), + attributes: { + color: ColorGeometryInstanceAttribute.fromColor( + Color.fromAlpha(this._color, 0.1, scratchColor$2) + ) + }, + id: this.id, + pickPrimitive: this + }), + appearance: new PerInstanceColorAppearance({ + translucent: !0, + flat: !0 + }), + asynchronous: !1 + }), n[i] = new Primitive$3({ + geometryInstances: new GeometryInstance({ + geometry: new FrustumOutlineGeometry({ + origin: f, + orientation: y, + frustum: c, + _drawNearPlane: i === 0 + }), + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(this._color) + }, + id: this.id, + pickPrimitive: this + }), + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); + } + for (r = t.length, i = 0; i < r; ++i) + n[i].update(e), t[i].update(e); +}; +DebugCameraPrimitive.prototype.isDestroyed = function() { + return !1; +}; +DebugCameraPrimitive.prototype.destroy = function() { + const e = this._planesPrimitives.length; + for (let t = 0; t < e; ++t) + this._outlinePrimitives[t] = this._outlinePrimitives[t] && this._outlinePrimitives[t].destroy(), this._planesPrimitives[t] = this._planesPrimitives[t] && this._planesPrimitives[t].destroy(); + return destroyObject(this); +}; +function DepthPlane(e) { + this._rs = void 0, this._sp = void 0, this._va = void 0, this._command = void 0, this._mode = void 0, this._useLogDepth = !1, this._ellipsoidOffset = defaultValue(e, 0); +} +const depthQuadScratch = FeatureDetection.supportsTypedArrays() ? new Float32Array(12) : [], scratchCartesian1$1 = new Cartesian3(), scratchCartesian2$3 = new Cartesian3(), scratchCartesian3 = new Cartesian3(), scratchCartesian4$1 = new Cartesian3(), scratchCartesian5 = new Cartesian3(); +function computeDepthQuad(e, t) { + const n = e.radii, i = t.camera; + let r, o, s; + if (i.frustum instanceof OrthographicFrustum) + r = Cartesian3.ZERO, o = i.rightWC, s = i.upWC; + else { + const h = i.positionWC, p = Cartesian3.multiplyComponents( + e.oneOverRadii, + h, + scratchCartesian1$1 + ), m = Cartesian3.normalize(p, scratchCartesian2$3), _ = Cartesian3.normalize( + Cartesian3.cross(Cartesian3.UNIT_Z, p, scratchCartesian3), + scratchCartesian3 + ), y = Cartesian3.normalize( + Cartesian3.cross(m, _, scratchCartesian4$1), + scratchCartesian4$1 + ), C = Cartesian3.magnitude(p), T = Math.sqrt(C * C - 1); + r = Cartesian3.multiplyByScalar( + m, + 1 / C, + scratchCartesian1$1 + ); + const x = T / C; + o = Cartesian3.multiplyByScalar(_, x, scratchCartesian2$3), s = Cartesian3.multiplyByScalar(y, x, scratchCartesian3); + } + const c = Cartesian3.add(r, s, scratchCartesian5); + Cartesian3.subtract(c, o, c), Cartesian3.multiplyComponents(n, c, c), Cartesian3.pack(c, depthQuadScratch, 0); + const l = Cartesian3.subtract(r, s, scratchCartesian5); + Cartesian3.subtract(l, o, l), Cartesian3.multiplyComponents(n, l, l), Cartesian3.pack(l, depthQuadScratch, 3); + const d = Cartesian3.add(r, s, scratchCartesian5); + Cartesian3.add(d, o, d), Cartesian3.multiplyComponents(n, d, d), Cartesian3.pack(d, depthQuadScratch, 6); + const f = Cartesian3.subtract( + r, + s, + scratchCartesian5 + ); + return Cartesian3.add(f, o, f), Cartesian3.multiplyComponents(n, f, f), Cartesian3.pack(f, depthQuadScratch, 9), depthQuadScratch; +} +DepthPlane.prototype.update = function(e) { + if (this._mode = e.mode, e.mode !== SceneMode$1.SCENE3D) + return; + const t = e.context, n = e.mapProjection.ellipsoid.radii, i = new Ellipsoid( + n.x + this._ellipsoidOffset, + n.y + this._ellipsoidOffset, + n.z + this._ellipsoidOffset + ), r = e.useLogDepth; + if (defined(this._command) || (this._rs = RenderState.fromCache({ + // Write depth, not color + cull: { + enabled: !0 + }, + depthTest: { + enabled: !0 + }, + colorMask: { + red: !1, + green: !1, + blue: !1, + alpha: !1 + } + }), this._command = new DrawCommand({ + renderState: this._rs, + boundingVolume: new BoundingSphere( + Cartesian3.ZERO, + i.maximumRadius + ), + pass: Pass$1.OPAQUE, + owner: this + })), !defined(this._sp) || this._useLogDepth !== r) { + this._useLogDepth = r; + const s = new ShaderSource({ + sources: [DepthPlaneVS] + }), c = new ShaderSource({ + sources: [DepthPlaneFS] + }); + r && (c.defines.push("LOG_DEPTH"), s.defines.push("LOG_DEPTH")), this._sp = ShaderProgram.replaceCache({ + shaderProgram: this._sp, + context: t, + vertexShaderSource: s, + fragmentShaderSource: c, + attributeLocations: { + position: 0 + } + }), this._command.shaderProgram = this._sp; + } + const o = computeDepthQuad(i, e); + if (defined(this._va)) + this._va.getAttribute(0).vertexBuffer.copyFromArrayView(o); + else { + const s = new Geometry({ + attributes: { + position: new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.FLOAT, + componentsPerAttribute: 3, + values: o + }) + }, + indices: [0, 1, 2, 2, 1, 3], + primitiveType: PrimitiveType$1.TRIANGLES + }); + this._va = VertexArray.fromGeometry({ + context: t, + geometry: s, + attributeLocations: { + position: 0 + }, + bufferUsage: BufferUsage$1.DYNAMIC_DRAW + }), this._command.vertexArray = this._va; + } +}; +DepthPlane.prototype.execute = function(e, t) { + this._mode === SceneMode$1.SCENE3D && this._command.execute(e, t); +}; +DepthPlane.prototype.isDestroyed = function() { + return !1; +}; +DepthPlane.prototype.destroy = function() { + this._sp = this._sp && this._sp.destroy(), this._va = this._va && this._va.destroy(); +}; +function DerivedCommand() { +} +const fragDepthRegex = /\bgl_FragDepth\b/, discardRegex = /\bdiscard\b/; +function getDepthOnlyShaderProgram$1(e, t) { + let n = e.shaderCache.getDerivedShaderProgram( + t, + "depthOnly" + ); + if (!defined(n)) { + const i = t._attributeLocations; + let r = t.fragmentShaderSource, o, s = !1; + const c = r.sources; + let l = c.length; + for (o = 0; o < l; ++o) + if (fragDepthRegex.test(c[o]) || discardRegex.test(c[o])) { + s = !0; + break; + } + let d = !1; + const f = r.defines; + for (l = f.length, o = 0; o < l; ++o) + if (f[o] === "LOG_DEPTH") { + d = !0; + break; + } + let h; + !s && !d ? (h = `void main() +{ + out_FragColor = vec4(1.0); +} +`, r = new ShaderSource({ + sources: [h] + })) : !s && d && (h = `void main() +{ + out_FragColor = vec4(1.0); + czm_writeLogDepth(); +} +`, r = new ShaderSource({ + defines: ["LOG_DEPTH"], + sources: [h] + })), n = e.shaderCache.createDerivedShaderProgram( + t, + "depthOnly", + { + vertexShaderSource: t.vertexShaderSource, + fragmentShaderSource: r, + attributeLocations: i + } + ); + } + return n; +} +function getDepthOnlyRenderState(e, t) { + const n = e._depthOnlyRenderStateCache; + let i = n[t.id]; + if (!defined(i)) { + const r = RenderState.getState(t); + r.depthMask = !0, r.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }, i = RenderState.fromCache(r), n[t.id] = i; + } + return i; +} +DerivedCommand.createDepthOnlyDerivedCommand = function(e, t, n, i) { + defined(i) || (i = {}); + let r, o; + return defined(i.depthOnlyCommand) && (r = i.depthOnlyCommand.shaderProgram, o = i.depthOnlyCommand.renderState), i.depthOnlyCommand = DrawCommand.shallowClone( + t, + i.depthOnlyCommand + ), !defined(r) || i.shaderProgramId !== t.shaderProgram.id ? (i.depthOnlyCommand.shaderProgram = getDepthOnlyShaderProgram$1( + n, + t.shaderProgram + ), i.depthOnlyCommand.renderState = getDepthOnlyRenderState( + e, + t.renderState + ), i.shaderProgramId = t.shaderProgram.id) : (i.depthOnlyCommand.shaderProgram = r, i.depthOnlyCommand.renderState = o), i; +}; +const writeLogDepthRegex = /\s+czm_writeLogDepth\(/, vertexlogDepthRegex = /\s+czm_vertexLogDepth\(/; +function getLogDepthShaderProgram(e, t) { + if (t.fragmentShaderSource.defines.indexOf("LOG_DEPTH_READ_ONLY") >= 0) + return t; + let i = e.shaderCache.getDerivedShaderProgram( + t, + "logDepth" + ); + if (!defined(i)) { + const r = t._attributeLocations, o = t.vertexShaderSource.clone(), s = t.fragmentShaderSource.clone(); + o.defines = defined(o.defines) ? o.defines.slice(0) : [], o.defines.push("LOG_DEPTH"), s.defines = defined(s.defines) ? s.defines.slice(0) : [], s.defines.push("LOG_DEPTH"); + let c, l, d = !1, f = o.sources, h = f.length; + for (c = 0; c < h; ++c) + if (vertexlogDepthRegex.test(f[c])) { + d = !0; + break; + } + if (!d) { + for (c = 0; c < h; ++c) + f[c] = ShaderSource.replaceMain(f[c], "czm_log_depth_main"); + l = ` + +void main() +{ + czm_log_depth_main(); + czm_vertexLogDepth(); +} +`, f.push(l); + } + for (f = s.sources, h = f.length, d = !1, c = 0; c < h; ++c) + writeLogDepthRegex.test(f[c]) && (d = !0); + s.defines.indexOf("LOG_DEPTH_WRITE") !== -1 && (d = !0); + let p = ""; + if (!d) { + for (c = 0; c < h; c++) + f[c] = ShaderSource.replaceMain(f[c], "czm_log_depth_main"); + p += ` +void main() +{ + czm_log_depth_main(); + czm_writeLogDepth(); +} +`; + } + f.push(p), i = e.shaderCache.createDerivedShaderProgram( + t, + "logDepth", + { + vertexShaderSource: o, + fragmentShaderSource: s, + attributeLocations: r + } + ); + } + return i; +} +DerivedCommand.createLogDepthCommand = function(e, t, n) { + defined(n) || (n = {}); + let i; + return defined(n.command) && (i = n.command.shaderProgram), n.command = DrawCommand.shallowClone(e, n.command), !defined(i) || n.shaderProgramId !== e.shaderProgram.id ? (n.command.shaderProgram = getLogDepthShaderProgram( + t, + e.shaderProgram + ), n.shaderProgramId = e.shaderProgram.id) : n.command.shaderProgram = i, n; +}; +function getPickShaderProgram$1(e, t, n) { + let i = e.shaderCache.getDerivedShaderProgram( + t, + "pick" + ); + if (!defined(i)) { + const r = t._attributeLocations; + let o = t.fragmentShaderSource; + const s = o.sources, c = s.length, d = s.some( + (p) => p.includes("out_FragData") + ) ? "out_FragData_0" : "out_FragColor", f = `void main () +{ + czm_non_pick_main(); + if (${d}.a == 0.0) { + discard; + } + ${d} = ${n}; +} `, h = new Array(c + 1); + for (let p = 0; p < c; ++p) + h[p] = ShaderSource.replaceMain(s[p], "czm_non_pick_main"); + h[c] = f, o = new ShaderSource({ + sources: h, + defines: o.defines + }), i = e.shaderCache.createDerivedShaderProgram( + t, + "pick", + { + vertexShaderSource: t.vertexShaderSource, + fragmentShaderSource: o, + attributeLocations: r + } + ); + } + return i; +} +function getPickRenderState(e, t) { + const n = e.picking.pickRenderStateCache; + let i = n[t.id]; + if (!defined(i)) { + const r = RenderState.getState(t); + r.blending.enabled = !1, r.depthMask = !0, i = RenderState.fromCache(r), n[t.id] = i; + } + return i; +} +DerivedCommand.createPickDerivedCommand = function(e, t, n, i) { + defined(i) || (i = {}); + let r, o; + return defined(i.pickCommand) && (r = i.pickCommand.shaderProgram, o = i.pickCommand.renderState), i.pickCommand = DrawCommand.shallowClone(t, i.pickCommand), !defined(r) || i.shaderProgramId !== t.shaderProgram.id ? (i.pickCommand.shaderProgram = getPickShaderProgram$1( + n, + t.shaderProgram, + t.pickId + ), i.pickCommand.renderState = getPickRenderState( + e, + t.renderState + ), i.shaderProgramId = t.shaderProgram.id) : (i.pickCommand.shaderProgram = r, i.pickCommand.renderState = o), i; +}; +function getHdrShaderProgram(e, t) { + let n = e.shaderCache.getDerivedShaderProgram( + t, + "HDR" + ); + if (!defined(n)) { + const i = t._attributeLocations, r = t.vertexShaderSource.clone(), o = t.fragmentShaderSource.clone(); + r.defines = defined(r.defines) ? r.defines.slice(0) : [], r.defines.push("HDR"), o.defines = defined(o.defines) ? o.defines.slice(0) : [], o.defines.push("HDR"), n = e.shaderCache.createDerivedShaderProgram( + t, + "HDR", + { + vertexShaderSource: r, + fragmentShaderSource: o, + attributeLocations: i + } + ); + } + return n; +} +DerivedCommand.createHdrCommand = function(e, t, n) { + defined(n) || (n = {}); + let i; + return defined(n.command) && (i = n.command.shaderProgram), n.command = DrawCommand.shallowClone(e, n.command), !defined(i) || n.shaderProgramId !== e.shaderProgram.id ? (n.command.shaderProgram = getHdrShaderProgram( + t, + e.shaderProgram + ), n.shaderProgramId = e.shaderProgram.id) : n.command.shaderProgram = i, n; +}; +function DeviceOrientationCameraController(e) { + this._scene = e, this._lastAlpha = void 0, this._lastBeta = void 0, this._lastGamma = void 0, this._alpha = void 0, this._beta = void 0, this._gamma = void 0; + const t = this; + function n(i) { + const r = i.alpha; + if (!defined(r)) { + t._alpha = void 0, t._beta = void 0, t._gamma = void 0; + return; + } + t._alpha = CesiumMath.toRadians(r), t._beta = CesiumMath.toRadians(i.beta), t._gamma = CesiumMath.toRadians(i.gamma); + } + window.addEventListener("deviceorientation", n, !1), this._removeListener = function() { + window.removeEventListener("deviceorientation", n, !1); + }; +} +const scratchQuaternion1 = new Quaternion(), scratchQuaternion2 = new Quaternion(), scratchMatrix3 = new Matrix3(); +function rotate(e, t, n, i) { + const r = e.direction, o = e.right, s = e.up, c = Quaternion.fromAxisAngle(r, n, scratchQuaternion2), l = Quaternion.fromAxisAngle(o, i, scratchQuaternion1), d = Quaternion.multiply(l, c, l), f = Quaternion.fromAxisAngle(s, t, scratchQuaternion2); + Quaternion.multiply(f, d, d); + const h = Matrix3.fromQuaternion(d, scratchMatrix3); + Matrix3.multiplyByVector(h, o, o), Matrix3.multiplyByVector(h, s, s), Matrix3.multiplyByVector(h, r, r); +} +DeviceOrientationCameraController.prototype.update = function() { + if (!defined(this._alpha)) + return; + defined(this._lastAlpha) || (this._lastAlpha = this._alpha, this._lastBeta = this._beta, this._lastGamma = this._gamma); + const e = this._lastAlpha - this._alpha, t = this._lastBeta - this._beta, n = this._lastGamma - this._gamma; + rotate(this._scene.camera, -e, t, n), this._lastAlpha = this._alpha, this._lastBeta = this._beta, this._lastGamma = this._gamma; +}; +DeviceOrientationCameraController.prototype.isDestroyed = function() { + return !1; +}; +DeviceOrientationCameraController.prototype.destroy = function() { + return this._removeListener(), destroyObject(this); +}; +function Fog() { + this.enabled = !0, this.renderable = !0, this.density = 2e-4, this.screenSpaceErrorFactor = 2, this.minimumBrightness = 0.03; +} +const heightsTable = [ + 359.393, + 800.749, + 1275.6501, + 2151.1192, + 3141.7763, + 4777.5198, + 6281.2493, + 12364.307, + 15900.765, + 49889.0549, + 78026.8259, + 99260.7344, + 120036.3873, + 151011.0158, + 156091.1953, + 203849.3112, + 274866.9803, + 319916.3149, + 493552.0528, + 628733.5874 +], densityTable = [ + 2e-5, + 2e-4, + 1e-4, + 7e-5, + 5e-5, + 4e-5, + 3e-5, + 19e-6, + 1e-5, + 85e-7, + 62e-7, + 58e-7, + 53e-7, + 52e-7, + 51e-7, + 42e-7, + 4e-6, + 34e-7, + 26e-7, + 22e-7 +]; +for (let e = 0; e < densityTable.length; ++e) + densityTable[e] *= 1e6; +const tableStartDensity = densityTable[1], tableEndDensity = densityTable[densityTable.length - 1]; +for (let e = 0; e < densityTable.length; ++e) + densityTable[e] = (densityTable[e] - tableEndDensity) / (tableStartDensity - tableEndDensity); +let tableLastIndex = 0; +function findInterval(e) { + const t = heightsTable, n = t.length; + if (e < t[0]) + return tableLastIndex = 0, tableLastIndex; + if (e > t[n - 1]) + return tableLastIndex = n - 2, tableLastIndex; + if (e >= t[tableLastIndex]) { + if (tableLastIndex + 1 < n && e < t[tableLastIndex + 1]) + return tableLastIndex; + if (tableLastIndex + 2 < n && e < t[tableLastIndex + 2]) + return ++tableLastIndex, tableLastIndex; + } else if (tableLastIndex - 1 >= 0 && e >= t[tableLastIndex - 1]) + return --tableLastIndex, tableLastIndex; + let i; + for (i = 0; i < n - 2 && !(e >= t[i] && e < t[i + 1]); ++i) + ; + return tableLastIndex = i, tableLastIndex; +} +const scratchPositionNormal$1 = new Cartesian3(); +Fog.prototype.update = function(e) { + if (!(e.fog.enabled = this.enabled)) + return; + e.fog.renderable = this.renderable; + const n = e.camera, i = n.positionCartographic; + if (!defined(i) || i.height > 8e5 || e.mode !== SceneMode$1.SCENE3D) { + e.fog.enabled = !1, e.fog.density = 0; + return; + } + const r = i.height, o = findInterval(r), s = CesiumMath.clamp( + (r - heightsTable[o]) / (heightsTable[o + 1] - heightsTable[o]), + 0, + 1 + ); + let c = CesiumMath.lerp(densityTable[o], densityTable[o + 1], s); + const l = this.density * 1e6, d = l / tableStartDensity * tableEndDensity; + c = c * (l - d) * 1e-6; + const f = Cartesian3.normalize( + n.positionWC, + scratchPositionNormal$1 + ), h = Math.abs(Cartesian3.dot(n.directionWC, f)); + c *= 1 - h, e.fog.density = c, e.fog.sse = this.screenSpaceErrorFactor, e.fog.minimumBrightness = this.minimumBrightness; +}; +function FrameState(e, t, n) { + this.context = e, this.commandList = [], this.shadowMaps = [], this.brdfLutGenerator = void 0, this.environmentMap = void 0, this.sphericalHarmonicCoefficients = void 0, this.specularEnvironmentMaps = void 0, this.specularEnvironmentMapsMaximumLOD = void 0, this.mode = SceneMode$1.SCENE3D, this.morphTime = SceneMode$1.getMorphTime(SceneMode$1.SCENE3D), this.frameNumber = 0, this.newFrame = !1, this.time = void 0, this.jobScheduler = n, this.mapProjection = void 0, this.camera = void 0, this.cameraUnderground = !1, this.globeTranslucencyState = void 0, this.cullingVolume = void 0, this.occluder = void 0, this.maximumScreenSpaceError = void 0, this.pixelRatio = 1, this.passes = { + /** + * @default false + */ + render: !1, + /** + * @default false + */ + pick: !1, + /** + * @default false + */ + pickVoxel: !1, + /** + * @default false + */ + depth: !1, + /** + * @default false + */ + postProcess: !1, + /** + * @default false + */ + offscreen: !1 + }, this.creditDisplay = t, this.afterRender = [], this.scene3DOnly = !1, this.fog = { + /** + * @default false + */ + enabled: !1, + renderable: !1, + density: void 0, + sse: void 0, + minimumBrightness: void 0 + }, this.atmosphere = void 0, this.verticalExaggeration = 1, this.verticalExaggerationRelativeHeight = 0, this.shadowState = { + /** + * @default true + */ + shadowsEnabled: !0, + shadowMaps: [], + lightShadowMaps: [], + /** + * @default 1.0 + */ + nearPlane: 1, + /** + * @default 5000.0 + */ + farPlane: 5e3, + /** + * @default 1000.0 + */ + closestObjectSize: 1e3, + /** + * @default 0 + */ + lastDirtyTime: 0, + /** + * @default true + */ + outOfView: !0 + }, this.splitPosition = 0, this.frustumSplits = [], this.backgroundColor = void 0, this.light = void 0, this.minimumDisableDepthTestDistance = void 0, this.invertClassification = !1, this.invertClassificationColor = void 0, this.useLogDepth = !1, this.tilesetPassState = void 0, this.minimumTerrainHeight = 0; +} +const DerivedCommandType = { + OPAQUE_FRONT_FACE: 0, + OPAQUE_BACK_FACE: 1, + DEPTH_ONLY_FRONT_FACE: 2, + DEPTH_ONLY_BACK_FACE: 3, + DEPTH_ONLY_FRONT_AND_BACK_FACE: 4, + TRANSLUCENT_FRONT_FACE: 5, + TRANSLUCENT_BACK_FACE: 6, + TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST: 7, + TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST: 8, + PICK_FRONT_FACE: 9, + PICK_BACK_FACE: 10, + DERIVED_COMMANDS_MAXIMUM_LENGTH: 11 +}, derivedCommandsMaximumLength = DerivedCommandType.DERIVED_COMMANDS_MAXIMUM_LENGTH, DerivedCommandNames = [ + "opaqueFrontFaceCommand", + "opaqueBackFaceCommand", + "depthOnlyFrontFaceCommand", + "depthOnlyBackFaceCommand", + "depthOnlyFrontAndBackFaceCommand", + "translucentFrontFaceCommand", + "translucentBackFaceCommand", + "translucentFrontFaceManualDepthTestCommand", + "translucentBackFaceManualDepthTestCommand", + "pickFrontFaceCommand", + "pickBackFaceCommand" +]; +function GlobeTranslucencyState() { + this._frontFaceAlphaByDistance = new NearFarScalar(0, 1, 0, 1), this._backFaceAlphaByDistance = new NearFarScalar(0, 1, 0, 1), this._frontFaceTranslucent = !1, this._backFaceTranslucent = !1, this._requiresManualDepthTest = !1, this._sunVisibleThroughGlobe = !1, this._environmentVisible = !1, this._useDepthPlane = !1, this._numberOfTextureUniforms = 0, this._globeTranslucencyFramebuffer = void 0, this._rectangle = Rectangle.clone(Rectangle.MAX_VALUE), this._derivedCommandKey = 0, this._derivedCommandsDirty = !1, this._derivedCommandPacks = void 0, this._derivedCommandTypes = new Array(derivedCommandsMaximumLength), this._derivedBlendCommandTypes = new Array(derivedCommandsMaximumLength), this._derivedPickCommandTypes = new Array(derivedCommandsMaximumLength), this._derivedCommandTypesToUpdate = new Array(derivedCommandsMaximumLength), this._derivedCommandsLength = 0, this._derivedBlendCommandsLength = 0, this._derivedPickCommandsLength = 0, this._derivedCommandsToUpdateLength = 0; +} +Object.defineProperties(GlobeTranslucencyState.prototype, { + frontFaceAlphaByDistance: { + get: function() { + return this._frontFaceAlphaByDistance; + } + }, + backFaceAlphaByDistance: { + get: function() { + return this._backFaceAlphaByDistance; + } + }, + translucent: { + get: function() { + return this._frontFaceTranslucent; + } + }, + sunVisibleThroughGlobe: { + get: function() { + return this._sunVisibleThroughGlobe; + } + }, + environmentVisible: { + get: function() { + return this._environmentVisible; + } + }, + useDepthPlane: { + get: function() { + return this._useDepthPlane; + } + }, + numberOfTextureUniforms: { + get: function() { + return this._numberOfTextureUniforms; + } + }, + rectangle: { + get: function() { + return this._rectangle; + } + } +}); +GlobeTranslucencyState.prototype.update = function(e) { + const t = e.globe; + if (!defined(t) || !t.show) { + this._frontFaceTranslucent = !1, this._backFaceTranslucent = !1, this._sunVisibleThroughGlobe = !0, this._environmentVisible = !0, this._useDepthPlane = !1; + return; + } + this._frontFaceAlphaByDistance = updateAlphaByDistance( + t.translucency.enabled, + t.translucency.frontFaceAlpha, + t.translucency.frontFaceAlphaByDistance, + this._frontFaceAlphaByDistance + ), this._backFaceAlphaByDistance = updateAlphaByDistance( + t.translucency.enabled, + t.translucency.backFaceAlpha, + t.translucency.backFaceAlphaByDistance, + this._backFaceAlphaByDistance + ), this._frontFaceTranslucent = isFaceTranslucent( + t.translucency.enabled, + this._frontFaceAlphaByDistance, + t + ), this._backFaceTranslucent = isFaceTranslucent( + t.translucency.enabled, + this._backFaceAlphaByDistance, + t + ), this._requiresManualDepthTest = requiresManualDepthTest(this, e, t), this._sunVisibleThroughGlobe = isSunVisibleThroughGlobe(this, e), this._environmentVisible = isEnvironmentVisible(this, e), this._useDepthPlane = useDepthPlane(this, e), this._numberOfTextureUniforms = getNumberOfTextureUniforms(this), this._rectangle = Rectangle.clone( + t.translucency.rectangle, + this._rectangle + ), gatherDerivedCommandRequirements(this, e); +}; +function updateAlphaByDistance(e, t, n, i) { + return e ? defined(n) ? (NearFarScalar.clone(n, i), i.nearValue *= t, i.farValue *= t, i) : (i.nearValue = t, i.farValue = t, i) : (i.nearValue = 1, i.farValue = 1, i); +} +function isFaceTranslucent(e, t, n) { + return e && (n.baseColor.alpha < 1 || t.nearValue < 1 || t.farValue < 1); +} +function isSunVisibleThroughGlobe(e, t) { + const n = e._frontFaceTranslucent, i = e._backFaceTranslucent; + return n && (t.cameraUnderground || i); +} +function isEnvironmentVisible(e, t) { + return !t.cameraUnderground || e._frontFaceTranslucent; +} +function useDepthPlane(e, t) { + return !t.cameraUnderground && !e._frontFaceTranslucent; +} +function requiresManualDepthTest(e, t, n) { + return e._frontFaceTranslucent && !e._backFaceTranslucent && !n.depthTestAgainstTerrain && t.mode !== SceneMode$1.SCENE2D && t.context.depthTexture; +} +function getNumberOfTextureUniforms(e) { + let t = 0; + return e._frontFaceTranslucent && ++t, e._requiresManualDepthTest && ++t, t; +} +function gatherDerivedCommandRequirements(e, t) { + e._derivedCommandsLength = getDerivedCommandTypes( + e, + t, + !1, + !1, + e._derivedCommandTypes + ), e._derivedBlendCommandsLength = getDerivedCommandTypes( + e, + t, + !0, + !1, + e._derivedBlendCommandTypes + ), e._derivedPickCommandsLength = getDerivedCommandTypes( + e, + t, + !1, + !0, + e._derivedPickCommandTypes + ); + let n, i = 0; + for (n = 0; n < e._derivedCommandsLength; ++n) + i |= 1 << e._derivedCommandTypes[n]; + for (n = 0; n < e._derivedBlendCommandsLength; ++n) + i |= 1 << e._derivedBlendCommandTypes[n]; + for (n = 0; n < e._derivedPickCommandsLength; ++n) + i |= 1 << e._derivedPickCommandTypes[n]; + let r = 0; + for (n = 0; n < derivedCommandsMaximumLength; ++n) + (i & 1 << n) > 0 && (e._derivedCommandTypesToUpdate[r++] = n); + e._derivedCommandsToUpdateLength = r; + const o = i !== e._derivedCommandKey; + e._derivedCommandKey = i, e._derivedCommandsDirty = o, !defined(e._derivedCommandPacks) && e._frontFaceTranslucent && (e._derivedCommandPacks = createDerivedCommandPacks()); +} +function getDerivedCommandTypes(e, t, n, i, r) { + let o = 0; + const s = e._frontFaceTranslucent, c = e._backFaceTranslucent; + if (!s) + return o; + const l = t.cameraUnderground, d = e._requiresManualDepthTest, f = i ? DerivedCommandType.PICK_FRONT_FACE : d ? DerivedCommandType.TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST : DerivedCommandType.TRANSLUCENT_FRONT_FACE, h = i ? DerivedCommandType.PICK_BACK_FACE : d ? DerivedCommandType.TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST : DerivedCommandType.TRANSLUCENT_BACK_FACE; + return t.mode === SceneMode$1.SCENE2D ? (r[o++] = DerivedCommandType.DEPTH_ONLY_FRONT_FACE, r[o++] = f, o) : (c ? (n || (r[o++] = DerivedCommandType.DEPTH_ONLY_FRONT_AND_BACK_FACE), l ? (r[o++] = f, r[o++] = h) : (r[o++] = h, r[o++] = f)) : l ? (n || (r[o++] = DerivedCommandType.DEPTH_ONLY_BACK_FACE), r[o++] = DerivedCommandType.OPAQUE_FRONT_FACE, r[o++] = h) : (n || (r[o++] = DerivedCommandType.DEPTH_ONLY_FRONT_FACE), r[o++] = DerivedCommandType.OPAQUE_BACK_FACE, r[o++] = f), o); +} +function removeDefine(e, t) { + const n = e.indexOf(t); + n > -1 && e.splice(n, 1); +} +function hasDefine(e, t) { + return e.indexOf(t) > -1; +} +function getOpaqueFrontFaceShaderProgram(e, t) { + removeDefine(e.defines, "TRANSLUCENT"), removeDefine(t.defines, "TRANSLUCENT"); +} +function getOpaqueBackFaceShaderProgram(e, t) { + removeDefine(e.defines, "GROUND_ATMOSPHERE"), removeDefine(t.defines, "GROUND_ATMOSPHERE"), removeDefine(e.defines, "FOG"), removeDefine(t.defines, "FOG"), removeDefine(e.defines, "TRANSLUCENT"), removeDefine(t.defines, "TRANSLUCENT"); +} +function getDepthOnlyShaderProgram(e, t) { + if (hasDefine(t.defines, "TILE_LIMIT_RECTANGLE") || hasDefine(t.defines, "ENABLE_CLIPPING_PLANES")) + return; + const n = `void main() +{ + out_FragColor = vec4(1.0); +} +`; + t.sources = [n]; +} +function getTranslucentShaderProgram$1(e, t) { + const n = t.sources, i = n.length; + for (let o = 0; o < i; ++o) + n[o] = ShaderSource.replaceMain( + n[o], + "czm_globe_translucency_main" + ); + n.push(` + +uniform sampler2D u_classificationTexture; +void main() +{ + vec2 st = gl_FragCoord.xy / czm_viewport.zw; +#ifdef MANUAL_DEPTH_TEST + float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, st)); + if (logDepthOrDepth != 0.0) + { + vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); + float depthEC = eyeCoordinate.z / eyeCoordinate.w; + if (v_positionEC.z < depthEC) + { + discard; + } + } +#endif + czm_globe_translucency_main(); + vec4 classificationColor = texture(u_classificationTexture, st); + if (classificationColor.a > 0.0) + { + // Reverse premultiplication process to get the correct composited result of the classification primitives + classificationColor.rgb /= classificationColor.a; + } + out_FragColor = classificationColor * vec4(classificationColor.aaa, 1.0) + out_FragColor * (1.0 - classificationColor.a); +} +`); +} +function getTranslucentBackFaceShaderProgram(e, t) { + getTranslucentShaderProgram$1(e, t), removeDefine(e.defines, "GROUND_ATMOSPHERE"), removeDefine(t.defines, "GROUND_ATMOSPHERE"), removeDefine(e.defines, "FOG"), removeDefine(t.defines, "FOG"); +} +function getTranslucentFrontFaceManualDepthTestShaderProgram(e, t) { + getTranslucentShaderProgram$1(e, t), e.defines.push("GENERATE_POSITION"), t.defines.push("MANUAL_DEPTH_TEST"); +} +function getTranslucentBackFaceManualDepthTestShaderProgram(e, t) { + getTranslucentBackFaceShaderProgram(e, t), e.defines.push("GENERATE_POSITION"), t.defines.push("MANUAL_DEPTH_TEST"); +} +function getPickShaderProgram(e, t) { + const n = `uniform sampler2D u_classificationTexture; +void main() +{ + vec2 st = gl_FragCoord.xy / czm_viewport.zw; + vec4 pickColor = texture(u_classificationTexture, st); + if (pickColor == vec4(0.0)) + { + discard; + } + out_FragColor = pickColor; +} +`; + t.sources = [n]; +} +function getDerivedShaderProgram(e, t, n, i, r, o) { + if (!defined(r)) + return t; + if (!i && defined(n)) + return n; + let s = e.shaderCache.getDerivedShaderProgram( + t, + o + ); + if (!defined(s)) { + const c = t._attributeLocations, l = t.vertexShaderSource.clone(), d = t.fragmentShaderSource.clone(); + l.defines = defined(l.defines) ? l.defines.slice(0) : [], d.defines = defined(d.defines) ? d.defines.slice(0) : [], r(l, d), s = e.shaderCache.createDerivedShaderProgram( + t, + o, + { + vertexShaderSource: l, + fragmentShaderSource: d, + attributeLocations: c + } + ); + } + return s; +} +function getOpaqueFrontFaceRenderState(e) { + e.cull.face = CullFace$1.BACK, e.cull.enabled = !0; +} +function getOpaqueBackFaceRenderState(e) { + e.cull.face = CullFace$1.FRONT, e.cull.enabled = !0; +} +function getDepthOnlyFrontFaceRenderState(e) { + e.cull.face = CullFace$1.BACK, e.cull.enabled = !0, e.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }; +} +function getDepthOnlyBackFaceRenderState(e) { + e.cull.face = CullFace$1.FRONT, e.cull.enabled = !0, e.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }; +} +function getDepthOnlyFrontAndBackFaceRenderState(e) { + e.cull.enabled = !1, e.colorMask = { + red: !1, + green: !1, + blue: !1, + alpha: !1 + }; +} +function getTranslucentFrontFaceRenderState(e) { + e.cull.face = CullFace$1.BACK, e.cull.enabled = !0, e.depthMask = !1, e.blending = BlendingState$1.ALPHA_BLEND; +} +function getTranslucentBackFaceRenderState(e) { + e.cull.face = CullFace$1.FRONT, e.cull.enabled = !0, e.depthMask = !1, e.blending = BlendingState$1.ALPHA_BLEND; +} +function getPickFrontFaceRenderState(e) { + e.cull.face = CullFace$1.BACK, e.cull.enabled = !0, e.blending.enabled = !1; +} +function getPickBackFaceRenderState(e) { + e.cull.face = CullFace$1.FRONT, e.cull.enabled = !0, e.blending.enabled = !1; +} +function getDerivedRenderState(e, t, n, i, r) { + if (!defined(i)) + return e; + if (!n && defined(t)) + return t; + let o = r[e.id]; + if (!defined(o)) { + const s = RenderState.getState(e); + i(s), o = RenderState.fromCache(s), r[e.id] = o; + } + return o; +} +function getTranslucencyUniformMap(e) { + return { + u_classificationTexture: function() { + return e._globeTranslucencyFramebuffer.classificationTexture; + } + }; +} +function getDerivedUniformMap(e, t, n, i, r) { + return defined(r) ? !i && defined(n) ? n : combine$2(t, r(e), !1) : t; +} +function DerivedCommandPack(e) { + this.pass = e.pass, this.pickOnly = e.pickOnly, this.getShaderProgramFunction = e.getShaderProgramFunction, this.getRenderStateFunction = e.getRenderStateFunction, this.getUniformMapFunction = e.getUniformMapFunction, this.renderStateCache = {}; +} +function createDerivedCommandPacks() { + return [ + // opaqueFrontFaceCommand + new DerivedCommandPack({ + pass: Pass$1.GLOBE, + pickOnly: !1, + getShaderProgramFunction: getOpaqueFrontFaceShaderProgram, + getRenderStateFunction: getOpaqueFrontFaceRenderState, + getUniformMapFunction: void 0 + }), + // opaqueBackFaceCommand + new DerivedCommandPack({ + pass: Pass$1.GLOBE, + pickOnly: !1, + getShaderProgramFunction: getOpaqueBackFaceShaderProgram, + getRenderStateFunction: getOpaqueBackFaceRenderState, + getUniformMapFunction: void 0 + }), + // depthOnlyFrontFaceCommand + new DerivedCommandPack({ + pass: Pass$1.GLOBE, + pickOnly: !1, + getShaderProgramFunction: getDepthOnlyShaderProgram, + getRenderStateFunction: getDepthOnlyFrontFaceRenderState, + getUniformMapFunction: void 0 + }), + // depthOnlyBackFaceCommand + new DerivedCommandPack({ + pass: Pass$1.GLOBE, + pickOnly: !1, + getShaderProgramFunction: getDepthOnlyShaderProgram, + getRenderStateFunction: getDepthOnlyBackFaceRenderState, + getUniformMapFunction: void 0 + }), + // depthOnlyFrontAndBackFaceCommand + new DerivedCommandPack({ + pass: Pass$1.GLOBE, + pickOnly: !1, + getShaderProgramFunction: getDepthOnlyShaderProgram, + getRenderStateFunction: getDepthOnlyFrontAndBackFaceRenderState, + getUniformMapFunction: void 0 + }), + // translucentFrontFaceCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !1, + getShaderProgramFunction: getTranslucentShaderProgram$1, + getRenderStateFunction: getTranslucentFrontFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }), + // translucentBackFaceCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !1, + getShaderProgramFunction: getTranslucentBackFaceShaderProgram, + getRenderStateFunction: getTranslucentBackFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }), + // translucentFrontFaceManualDepthTestCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !1, + getShaderProgramFunction: getTranslucentFrontFaceManualDepthTestShaderProgram, + getRenderStateFunction: getTranslucentFrontFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }), + // translucentBackFaceManualDepthTestCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !1, + getShaderProgramFunction: getTranslucentBackFaceManualDepthTestShaderProgram, + getRenderStateFunction: getTranslucentBackFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }), + // pickFrontFaceCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !0, + getShaderProgramFunction: getPickShaderProgram, + getRenderStateFunction: getPickFrontFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }), + // pickBackFaceCommand + new DerivedCommandPack({ + pass: Pass$1.TRANSLUCENT, + pickOnly: !0, + getShaderProgramFunction: getPickShaderProgram, + getRenderStateFunction: getPickBackFaceRenderState, + getUniformMapFunction: getTranslucencyUniformMap + }) + ]; +} +const derivedCommandNames = new Array(derivedCommandsMaximumLength), derivedCommandPacks = new Array(derivedCommandsMaximumLength); +GlobeTranslucencyState.prototype.updateDerivedCommands = function(e, t) { + const n = this._derivedCommandTypesToUpdate, i = this._derivedCommandsToUpdateLength; + if (i !== 0) { + for (let r = 0; r < i; ++r) + derivedCommandPacks[r] = this._derivedCommandPacks[n[r]], derivedCommandNames[r] = DerivedCommandNames[n[r]]; + updateDerivedCommands$1( + this, + e, + i, + n, + derivedCommandNames, + derivedCommandPacks, + t + ); + } +}; +function updateDerivedCommands$1(e, t, n, i, r, o, s) { + let c = t.derivedCommands.globeTranslucency; + const l = e._derivedCommandsDirty; + if (t.dirty || !defined(c) || l) { + t.dirty = !1, defined(c) || (c = {}, t.derivedCommands.globeTranslucency = c); + const d = s.frameNumber, f = defaultValue( + c.uniformMapDirtyFrame, + 0 + ), h = defaultValue( + c.shaderProgramDirtyFrame, + 0 + ), p = defaultValue( + c.renderStateDirtyFrame, + 0 + ), m = c.uniformMap !== t.uniformMap, _ = c.shaderProgramId !== t.shaderProgram.id, y = c.renderStateId !== t.renderState.id; + m && (c.uniformMapDirtyFrame = d), _ && (c.shaderProgramDirtyFrame = d), y && (c.renderStateDirtyFrame = d), c.uniformMap = t.uniformMap, c.shaderProgramId = t.shaderProgram.id, c.renderStateId = t.renderState.id; + for (let C = 0; C < n; ++C) { + const T = o[C], x = i[C], b = r[C]; + let S = c[b], E, A, D; + defined(S) ? (E = S.uniformMap, A = S.shaderProgram, D = S.renderState) : (E = void 0, A = void 0, D = void 0), S = DrawCommand.shallowClone(t, S), c[b] = S; + const P = defaultValue( + S.derivedCommands.uniformMapDirtyFrame, + 0 + ), I = defaultValue( + S.derivedCommands.shaderProgramDirtyFrame, + 0 + ), M = defaultValue( + S.derivedCommands.renderStateDirtyFrame, + 0 + ), R = m || P < f, L = _ || I < h, g = y || M < p; + R && (S.derivedCommands.uniformMapDirtyFrame = d), L && (S.derivedCommands.shaderProgramDirtyFrame = d), g && (S.derivedCommands.renderStateDirtyFrame = d), S.derivedCommands.type = x, S.pass = T.pass, S.pickOnly = T.pickOnly, S.uniformMap = getDerivedUniformMap( + e, + t.uniformMap, + E, + R, + T.getUniformMapFunction + ), S.shaderProgram = getDerivedShaderProgram( + s.context, + t.shaderProgram, + A, + L, + T.getShaderProgramFunction, + b + ), S.renderState = getDerivedRenderState( + t.renderState, + D, + g, + T.getRenderStateFunction, + T.renderStateCache + ); + } + } +} +GlobeTranslucencyState.prototype.pushDerivedCommands = function(e, t, n) { + const i = n.passes.pick || n.passes.pickVoxel; + if (i && t) + return; + let r = this._derivedCommandTypes, o = this._derivedCommandsLength; + if (i ? (r = this._derivedPickCommandTypes, o = this._derivedPickCommandsLength) : t && (r = this._derivedBlendCommandTypes, o = this._derivedBlendCommandsLength), o === 0) { + n.commandList.push(e); + return; + } + const s = e.derivedCommands.globeTranslucency; + for (let c = 0; c < o; ++c) { + const l = DerivedCommandNames[r[c]]; + n.commandList.push(s[l]); + } +}; +function executeCommandsMatchingType(e, t, n, i, r, o, s) { + for (let c = 0; c < t; ++c) { + const l = e[c], d = l.derivedCommands.type; + (!defined(s) || s.indexOf(d) > -1) && n(l, i, r, o); + } +} +function executeCommands$1(e, t, n, i, r, o) { + for (let s = 0; s < t; ++s) + n(e[s], i, r, o); +} +const opaqueTypes = [ + DerivedCommandType.OPAQUE_FRONT_FACE, + DerivedCommandType.OPAQUE_BACK_FACE +], depthOnlyTypes = [ + DerivedCommandType.DEPTH_ONLY_FRONT_FACE, + DerivedCommandType.DEPTH_ONLY_BACK_FACE, + DerivedCommandType.DEPTH_ONLY_FRONT_AND_BACK_FACE +]; +GlobeTranslucencyState.prototype.executeGlobeCommands = function(e, t, n, i, r) { + const o = i.context, s = e.commands[Pass$1.GLOBE], c = e.indices[Pass$1.GLOBE]; + c !== 0 && (this._globeTranslucencyFramebuffer = n, n.clearClassification(o, r), executeCommandsMatchingType( + s, + c, + t, + i, + o, + r, + opaqueTypes + )); +}; +GlobeTranslucencyState.prototype.executeGlobeClassificationCommands = function(e, t, n, i, r) { + const o = i.context, s = e.commands[Pass$1.GLOBE], c = e.indices[Pass$1.GLOBE], l = e.commands[Pass$1.TERRAIN_CLASSIFICATION], d = e.indices[Pass$1.TERRAIN_CLASSIFICATION]; + if (c === 0 || d === 0) + return; + const f = this._frontFaceTranslucent, h = this._backFaceTranslucent; + if ((!f || !h) && executeCommands$1( + l, + d, + t, + i, + o, + r + ), !f && !h) + return; + this._globeTranslucencyFramebuffer = n; + const p = o.uniformState.globeDepthTexture, m = r.framebuffer; + if (r.framebuffer = n.classificationFramebuffer, executeCommandsMatchingType( + s, + c, + t, + i, + o, + r, + depthOnlyTypes + ), o.depthTexture) { + const _ = n.packDepth( + o, + r + ); + o.uniformState.globeDepthTexture = _; + } + executeCommands$1( + l, + d, + t, + i, + o, + r + ), o.uniformState.globeDepthTexture = p, r.framebuffer = m; +}; +const PassThrough = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + out_FragColor = texture(colorTexture, v_textureCoordinates); +} +`; +function InvertClassification() { + this._numSamples = 1, this.previousFramebuffer = void 0, this._previousFramebuffer = void 0, this._depthStencilTexture = void 0, this._depthStencilRenderbuffer = void 0, this._fbo = new FramebufferManager({ + depthStencil: !0, + createDepthAttachments: !1 + }), this._fboClassified = new FramebufferManager({ + depthStencil: !0, + createDepthAttachments: !1 + }), this._rsUnclassified = void 0, this._rsClassified = void 0, this._unclassifiedCommand = void 0, this._classifiedCommand = void 0, this._translucentCommand = void 0, this._clearColorCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + owner: this + }), this._clearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + depth: 1, + stencil: 0 + }); + const e = this; + this._uniformMap = { + colorTexture: function() { + return e._fbo.getColorTexture(); + }, + depthTexture: function() { + return e._depthStencilTexture; + }, + classifiedTexture: function() { + return e._fboClassified.getColorTexture(); + } + }; +} +Object.defineProperties(InvertClassification.prototype, { + unclassifiedCommand: { + get: function() { + return this._unclassifiedCommand; + } + } +}); +InvertClassification.isTranslucencySupported = function(e) { + return e.depthTexture && e.fragmentDepth; +}; +const rsUnclassified = { + depthMask: !1, + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.EQUAL, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + backFunction: StencilFunction$1.NEVER, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + blending: BlendingState$1.ALPHA_BLEND +}, rsClassified = { + depthMask: !1, + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.NOT_EQUAL, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + backFunction: StencilFunction$1.NEVER, + reference: 0, + mask: StencilConstants$1.CLASSIFICATION_MASK + }, + blending: BlendingState$1.ALPHA_BLEND +}, rsDefault = { + depthMask: !0, + depthTest: { + enabled: !0 + }, + stencilTest: StencilConstants$1.setCesium3DTileBit(), + stencilMask: StencilConstants$1.CESIUM_3D_TILE_MASK, + blending: BlendingState$1.ALPHA_BLEND +}, translucentFS = `uniform sampler2D colorTexture; +uniform sampler2D depthTexture; +uniform sampler2D classifiedTexture; +in vec2 v_textureCoordinates; +void main() +{ + vec4 color = texture(colorTexture, v_textureCoordinates); + if (color.a == 0.0) + { + discard; + } + bool isClassified = all(equal(texture(classifiedTexture, v_textureCoordinates), vec4(0.0))); +#ifdef UNCLASSIFIED + vec4 highlightColor = czm_invertClassificationColor; + if (isClassified) + { + discard; + } +#else + vec4 highlightColor = vec4(1.0); + if (!isClassified) + { + discard; + } +#endif + out_FragColor = color * highlightColor; + gl_FragDepth = texture(depthTexture, v_textureCoordinates).r; +} +`, opaqueFS = `uniform sampler2D colorTexture; +in vec2 v_textureCoordinates; +void main() +{ + vec4 color = texture(colorTexture, v_textureCoordinates); + if (color.a == 0.0) + { + discard; + } +#ifdef UNCLASSIFIED + out_FragColor = color * czm_invertClassificationColor; +#else + out_FragColor = color; +#endif +} +`; +InvertClassification.prototype.update = function(e, t, n) { + const i = this._fbo.getColorTexture(), r = this.previousFramebuffer !== this._previousFramebuffer; + this._previousFramebuffer = this.previousFramebuffer; + const o = this._numSamples !== t, s = e.drawingBufferWidth, c = e.drawingBufferHeight, l = !defined(i) || i.width !== s || i.height !== c; + if ((l || r || o) && (this._numSamples = t, this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(), this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy(), defined(this._previousFramebuffer) || (this._depthStencilTexture = new Texture({ + context: e, + width: s, + height: c, + pixelFormat: PixelFormat$1.DEPTH_STENCIL, + pixelDatatype: PixelDatatype$1.UNSIGNED_INT_24_8 + }), t > 1 && (this._depthStencilRenderbuffer = new Renderbuffer({ + context: e, + width: s, + height: c, + format: RenderbufferFormat$1.DEPTH24_STENCIL8, + numSamples: t + })))), !defined(this._fbo.framebuffer) || l || r || o) { + this._fbo.destroy(), this._fboClassified.destroy(); + let d, f; + defined(this._previousFramebuffer) ? (d = n.getDepthStencilTexture(), f = n.getDepthStencilRenderbuffer()) : (d = this._depthStencilTexture, f = this._depthStencilRenderbuffer), this._fbo.setDepthStencilTexture(d), defined(f) && this._fbo.setDepthStencilRenderbuffer(f), this._fbo.update(e, s, c, t), defined(this._previousFramebuffer) || (this._fboClassified.setDepthStencilTexture(d), this._fboClassified.update(e, s, c)); + } + if (defined(this._rsUnclassified) || (this._rsUnclassified = RenderState.fromCache(rsUnclassified), this._rsClassified = RenderState.fromCache(rsClassified), this._rsDefault = RenderState.fromCache(rsDefault)), !defined(this._unclassifiedCommand) || r || o) { + defined(this._unclassifiedCommand) && (this._unclassifiedCommand.shaderProgram = this._unclassifiedCommand.shaderProgram && this._unclassifiedCommand.shaderProgram.destroy(), this._classifiedCommand.shaderProgram = this._classifiedCommand.shaderProgram && this._classifiedCommand.shaderProgram.destroy()); + const d = defined(this._previousFramebuffer) ? opaqueFS : translucentFS, f = new ShaderSource({ + defines: ["UNCLASSIFIED"], + sources: [d] + }), h = new ShaderSource({ + sources: [d] + }); + this._unclassifiedCommand = e.createViewportQuadCommand( + f, + { + renderState: defined(this._previousFramebuffer) ? this._rsUnclassified : this._rsDefault, + uniformMap: this._uniformMap, + owner: this + } + ), this._classifiedCommand = e.createViewportQuadCommand( + h, + { + renderState: defined(this._previousFramebuffer) ? this._rsClassified : this._rsDefault, + uniformMap: this._uniformMap, + owner: this + } + ), defined(this._translucentCommand) && (this._translucentCommand.shaderProgram = this._translucentCommand.shaderProgram && this._translucentCommand.shaderProgram.destroy()), defined(this._previousFramebuffer) || (this._translucentCommand = e.createViewportQuadCommand( + PassThrough, + { + renderState: this._rsUnclassified, + uniformMap: this._uniformMap, + owner: this + } + )); + } +}; +InvertClassification.prototype.prepareTextures = function(e, t) { + this._fbo._numSamples > 1 && this._fbo.prepareTextures(e, t); +}; +InvertClassification.prototype.clear = function(e, t) { + defined(this._previousFramebuffer) ? this._fbo.clear(e, this._clearColorCommand, t) : (this._fbo.clear(e, this._clearCommand, t), this._fboClassified.clear(e, this._clearCommand, t)); +}; +InvertClassification.prototype.executeClassified = function(e, t) { + if (!defined(this._previousFramebuffer)) { + const n = t.framebuffer; + this.prepareTextures(e, !0), t.framebuffer = this._fboClassified.framebuffer, this._translucentCommand.execute(e, t), t.framebuffer = n; + } + this._classifiedCommand.execute(e, t); +}; +InvertClassification.prototype.executeUnclassified = function(e, t) { + this._unclassifiedCommand.execute(e, t); +}; +InvertClassification.prototype.isDestroyed = function() { + return !1; +}; +InvertClassification.prototype.destroy = function() { + return this._fbo.destroy(), this._fboClassified.destroy(), this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(), this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy(), defined(this._unclassifiedCommand) && (this._unclassifiedCommand.shaderProgram = this._unclassifiedCommand.shaderProgram && this._unclassifiedCommand.shaderProgram.destroy(), this._classifiedCommand.shaderProgram = this._classifiedCommand.shaderProgram && this._classifiedCommand.shaderProgram.destroy()), destroyObject(this); +}; +function JobTypeBudget(e) { + this._total = e, this.usedThisFrame = 0, this.stolenFromMeThisFrame = 0, this.starvedThisFrame = !1, this.starvedLastFrame = !1; +} +Object.defineProperties(JobTypeBudget.prototype, { + total: { + get: function() { + return this._total; + } + } +}); +function JobScheduler(e) { + const t = new Array(JobType$1.NUMBER_OF_JOB_TYPES); + t[JobType$1.TEXTURE] = new JobTypeBudget( + defined(e) ? e[JobType$1.TEXTURE] : 10 + ), t[JobType$1.PROGRAM] = new JobTypeBudget( + defined(e) ? e[JobType$1.PROGRAM] : 10 + ), t[JobType$1.BUFFER] = new JobTypeBudget( + defined(e) ? e[JobType$1.BUFFER] : 30 + ); + const n = t.length; + let i, r = 0; + for (i = 0; i < n; ++i) + r += t[i].total; + const o = new Array(n); + for (i = 0; i < n; ++i) + o[i] = !1; + this._totalBudget = r, this._totalUsedThisFrame = 0, this._budgets = t, this._executedThisFrame = o; +} +JobScheduler.getTimestamp = getTimestamp$1; +Object.defineProperties(JobScheduler.prototype, { + totalBudget: { + get: function() { + return this._totalBudget; + } + } +}); +JobScheduler.prototype.disableThisFrame = function() { + this._totalUsedThisFrame = this._totalBudget; +}; +JobScheduler.prototype.resetBudgets = function() { + const e = this._budgets, t = e.length; + for (let n = 0; n < t; ++n) { + const i = e[n]; + i.starvedLastFrame = i.starvedThisFrame, i.starvedThisFrame = !1, i.usedThisFrame = 0, i.stolenFromMeThisFrame = 0; + } + this._totalUsedThisFrame = 0; +}; +JobScheduler.prototype.execute = function(e, t) { + const n = this._budgets, i = n[t], r = this._executedThisFrame[t]; + if (this._totalUsedThisFrame >= this._totalBudget && r) + return i.starvedThisFrame = !0, !1; + let o; + if (i.usedThisFrame + i.stolenFromMeThisFrame >= i.total) { + const l = n.length; + let d; + for (d = 0; d < l && (o = n[d], !(o.usedThisFrame + o.stolenFromMeThisFrame < o.total && !o.starvedLastFrame)); ++d) + ; + if (d === l && r) + return !1; + r && (i.starvedThisFrame = !0); + } + const s = JobScheduler.getTimestamp(); + e.execute(); + const c = JobScheduler.getTimestamp() - s; + return this._totalUsedThisFrame += c, o ? o.stolenFromMeThisFrame += c : i.usedThisFrame += c, this._executedThisFrame[t] = !0, !0; +}; +function PerformanceDisplay(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = getElement(e.container); + this._container = t; + const n = document.createElement("div"); + n.className = "cesium-performanceDisplay"; + const i = document.createElement("div"); + i.className = "cesium-performanceDisplay-fps", this._fpsText = document.createTextNode(""), i.appendChild(this._fpsText); + const r = document.createElement("div"); + r.className = "cesium-performanceDisplay-ms", this._msText = document.createTextNode(""), r.appendChild(this._msText), n.appendChild(r), n.appendChild(i), this._container.appendChild(n), this._lastFpsSampleTime = getTimestamp$1(), this._lastMsSampleTime = getTimestamp$1(), this._fpsFrameCount = 0, this._msFrameCount = 0, this._throttled = !1; + const o = document.createElement("div"); + o.className = "cesium-performanceDisplay-throttled", this._throttledText = document.createTextNode(""), o.appendChild(this._throttledText), n.appendChild(o); +} +Object.defineProperties(PerformanceDisplay.prototype, { + /** + * The display should indicate the FPS is being throttled. + * @memberof PerformanceDisplay.prototype + * + * @type {boolean} + */ + throttled: { + get: function() { + return this._throttled; + }, + set: function(e) { + this._throttled !== e && (e ? this._throttledText.nodeValue = "(throttled)" : this._throttledText.nodeValue = "", this._throttled = e); + } + } +}); +PerformanceDisplay.prototype.update = function(e) { + const t = getTimestamp$1(), n = defaultValue(e, !0); + this._fpsFrameCount++; + const i = t - this._lastFpsSampleTime; + if (i > 1e3) { + let o = "N/A"; + n && (o = this._fpsFrameCount * 1e3 / i | 0), this._fpsText.nodeValue = `${o} FPS`, this._lastFpsSampleTime = t, this._fpsFrameCount = 0; + } + this._msFrameCount++; + const r = t - this._lastMsSampleTime; + if (r > 200) { + let o = "N/A"; + n && (o = (r / this._msFrameCount).toFixed(2)), this._msText.nodeValue = `${o} MS`, this._lastMsSampleTime = t, this._msFrameCount = 0; + } +}; +PerformanceDisplay.prototype.destroy = function() { + return destroyObject(this); +}; +function PickDepth() { + this._framebuffer = new FramebufferManager(), this._textureToCopy = void 0, this._copyDepthCommand = void 0; +} +Object.defineProperties(PickDepth.prototype, { + framebuffer: { + get: function() { + return this._framebuffer.framebuffer; + } + } +}); +function updateFramebuffers$3(e, t, n) { + const i = n.width, r = n.height; + e._framebuffer.update(t, i, r); +} +function updateCopyCommands$1(e, t, n) { + defined(e._copyDepthCommand) || (e._copyDepthCommand = t.createViewportQuadCommand( + `uniform highp sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + vec4 globeDepthPacked = texture(czm_globeDepthTexture, v_textureCoordinates); + float globeDepth = czm_unpackDepth(globeDepthPacked); + float depth = texture(colorTexture, v_textureCoordinates).r; + out_FragColor = czm_branchFreeTernary(globeDepth <= 0.0 || globeDepth >= 1.0 || depth < globeDepth && depth > 0.0 && depth < 1.0, + czm_packDepth(depth), globeDepthPacked); +} +`, + { + renderState: RenderState.fromCache(), + uniformMap: { + colorTexture: function() { + return e._textureToCopy; + } + }, + owner: e + } + )), e._textureToCopy = n, e._copyDepthCommand.framebuffer = e.framebuffer; +} +PickDepth.prototype.update = function(e, t) { + updateFramebuffers$3(this, e, t), updateCopyCommands$1(this, e, t); +}; +const scratchPackedDepth = new Cartesian4(), packedDepthScale = new Cartesian4( + 1, + 1 / 255, + 1 / 65025, + 1 / 16581375 +); +PickDepth.prototype.getDepth = function(e, t, n) { + if (!defined(this.framebuffer)) + return; + const i = e.readPixels({ + x: t, + y: n, + width: 1, + height: 1, + framebuffer: this.framebuffer + }), r = Cartesian4.unpack(i, 0, scratchPackedDepth); + return Cartesian4.divideByScalar(r, 255, r), Cartesian4.dot(r, packedDepthScale); +}; +PickDepth.prototype.executeCopyDepth = function(e, t) { + this._copyDepthCommand.execute(e, t); +}; +PickDepth.prototype.isDestroyed = function() { + return !1; +}; +PickDepth.prototype.destroy = function() { + return this._framebuffer.destroy(), defined(this._copyDepthCommand) && (this._copyDepthCommand.shaderProgram = defined(this._copyDepthCommand.shaderProgram) && this._copyDepthCommand.shaderProgram.destroy()), destroyObject(this); +}; +function FrustumCommands(e, t) { + this.near = defaultValue(e, 0), this.far = defaultValue(t, 0); + const n = Pass$1.NUMBER_OF_PASSES, i = new Array(n), r = new Array(n); + for (let o = 0; o < n; ++o) + i[o] = [], r[o] = 0; + this.commands = i, this.indices = r; +} +const PassThroughDepth = `uniform highp sampler2D u_depthTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + out_FragColor = czm_packDepth(texture(u_depthTexture, v_textureCoordinates).r); +} +`; +function GlobeDepth() { + this._picking = !1, this._numSamples = 1, this._tempCopyDepthTexture = void 0, this._pickColorFramebuffer = new FramebufferManager({ + depthStencil: !0, + supportsDepthTexture: !0 + }), this._outputFramebuffer = new FramebufferManager({ + depthStencil: !0, + supportsDepthTexture: !0 + }), this._copyDepthFramebuffer = new FramebufferManager(), this._tempCopyDepthFramebuffer = new FramebufferManager(), this._updateDepthFramebuffer = new FramebufferManager({ + createColorAttachments: !1, + createDepthAttachments: !1, + depthStencil: !0 + }), this._clearGlobeColorCommand = void 0, this._copyColorCommand = void 0, this._copyDepthCommand = void 0, this._tempCopyDepthCommand = void 0, this._updateDepthCommand = void 0, this._viewport = new BoundingRectangle(), this._rs = void 0, this._rsBlend = void 0, this._rsUpdate = void 0, this._useScissorTest = !1, this._scissorRectangle = void 0, this._useHdr = void 0, this._clearGlobeDepth = void 0; +} +Object.defineProperties(GlobeDepth.prototype, { + colorFramebufferManager: { + get: function() { + return this._picking ? this._pickColorFramebuffer : this._outputFramebuffer; + } + }, + framebuffer: { + get: function() { + return this.colorFramebufferManager.framebuffer; + } + }, + depthStencilTexture: { + get: function() { + return this.colorFramebufferManager.getDepthStencilTexture(); + } + }, + picking: { + get: function() { + return this._picking; + }, + set: function(e) { + this._picking = e; + } + } +}); +function destroyFramebuffers$3(e) { + e._pickColorFramebuffer.destroy(), e._outputFramebuffer.destroy(), e._copyDepthFramebuffer.destroy(), e._tempCopyDepthFramebuffer.destroy(), e._updateDepthFramebuffer.destroy(); +} +function updateCopyCommands(e, t, n, i, r) { + e._viewport.width = n, e._viewport.height = i; + const o = !BoundingRectangle.equals( + e._viewport, + r.viewport + ); + let s = o !== e._useScissorTest; + e._useScissorTest = o, BoundingRectangle.equals(e._scissorRectangle, r.viewport) || (e._scissorRectangle = BoundingRectangle.clone( + r.viewport, + e._scissorRectangle + ), s = !0), (!defined(e._rs) || !BoundingRectangle.equals(e._viewport, e._rs.viewport) || s) && (e._rs = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + } + }), e._rsBlend = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + }, + blending: BlendingState$1.ALPHA_BLEND + }), e._rsUpdate = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + }, + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.EQUAL, + frontOperation: { + fail: StencilOperation$1.KEEP, + zFail: StencilOperation$1.KEEP, + zPass: StencilOperation$1.KEEP + }, + backFunction: StencilFunction$1.NEVER, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK, + mask: StencilConstants$1.CESIUM_3D_TILE_MASK + } + })), defined(e._copyDepthCommand) || (e._copyDepthCommand = t.createViewportQuadCommand( + PassThroughDepth, + { + uniformMap: { + u_depthTexture: function() { + return e.colorFramebufferManager.getDepthStencilTexture(); + } + }, + owner: e + } + )), e._copyDepthCommand.framebuffer = e._copyDepthFramebuffer.framebuffer, e._copyDepthCommand.renderState = e._rs, defined(e._copyColorCommand) || (e._copyColorCommand = t.createViewportQuadCommand( + PassThrough, + { + uniformMap: { + colorTexture: function() { + return e.colorFramebufferManager.getColorTexture(); + } + }, + owner: e + } + )), e._copyColorCommand.renderState = e._rs, defined(e._tempCopyDepthCommand) || (e._tempCopyDepthCommand = t.createViewportQuadCommand( + PassThroughDepth, + { + uniformMap: { + u_depthTexture: function() { + return e._tempCopyDepthTexture; + } + }, + owner: e + } + )), e._tempCopyDepthCommand.framebuffer = e._tempCopyDepthFramebuffer.framebuffer, e._tempCopyDepthCommand.renderState = e._rs, defined(e._updateDepthCommand) || (e._updateDepthCommand = t.createViewportQuadCommand( + PassThrough, + { + uniformMap: { + colorTexture: function() { + return e._tempCopyDepthFramebuffer.getColorTexture(); + } + }, + owner: e + } + )), e._updateDepthCommand.framebuffer = e._updateDepthFramebuffer.framebuffer, e._updateDepthCommand.renderState = e._rsUpdate, defined(e._clearGlobeColorCommand) || (e._clearGlobeColorCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + stencil: 0, + owner: e + })), e._clearGlobeColorCommand.framebuffer = e.framebuffer; +} +GlobeDepth.prototype.update = function(e, t, n, i, r, o) { + const s = n.width, c = n.height, l = r ? e.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT : PixelDatatype$1.UNSIGNED_BYTE; + this._numSamples = i, this.picking ? this._pickColorFramebuffer.update(e, s, c) : this._outputFramebuffer.update( + e, + s, + c, + i, + l + ), this._copyDepthFramebuffer.update(e, s, c), updateCopyCommands(this, e, s, c, t), e.uniformState.globeDepthTexture = void 0, this._useHdr = r, this._clearGlobeDepth = o; +}; +GlobeDepth.prototype.prepareColorTextures = function(e, t) { + !this.picking && this._numSamples > 1 && this._outputFramebuffer.prepareTextures(e, t); +}; +GlobeDepth.prototype.executeCopyDepth = function(e, t) { + defined(this._copyDepthCommand) && (this.prepareColorTextures(e), this._copyDepthCommand.execute(e, t), e.uniformState.globeDepthTexture = this._copyDepthFramebuffer.getColorTexture()); +}; +GlobeDepth.prototype.executeUpdateDepth = function(e, t, n, i) { + const r = defined(i) ? i : t.framebuffer.depthStencilTexture; + if (n || r !== this.colorFramebufferManager.getDepthStencilTexture()) { + if (defined(this._updateDepthCommand)) { + if (!defined(this._updateDepthFramebuffer.framebuffer) || this._updateDepthFramebuffer.getDepthStencilTexture() !== r || this._updateDepthFramebuffer.getColorTexture() !== this._copyDepthFramebuffer.getColorTexture()) { + const o = this._copyDepthFramebuffer.getColorTexture().width, s = this._copyDepthFramebuffer.getColorTexture().height; + this._tempCopyDepthFramebuffer.destroy(), this._tempCopyDepthFramebuffer.update(e, o, s); + const c = this._copyDepthFramebuffer.getColorTexture(); + this._updateDepthFramebuffer.setColorTexture(c, 0), this._updateDepthFramebuffer.setDepthStencilTexture(r), this._updateDepthFramebuffer.update(e, o, s), updateCopyCommands(this, e, o, s, t); + } + this._tempCopyDepthTexture = r, this._tempCopyDepthCommand.execute(e, t), this._updateDepthCommand.execute(e, t); + } + return; + } + defined(this._copyDepthCommand) && this._copyDepthCommand.execute(e, t); +}; +GlobeDepth.prototype.executeCopyColor = function(e, t) { + defined(this._copyColorCommand) && this._copyColorCommand.execute(e, t); +}; +GlobeDepth.prototype.clear = function(e, t, n) { + const i = this._clearGlobeColorCommand; + defined(i) && (Color.clone(n, i.color), this.colorFramebufferManager.clear(e, i, t)); +}; +GlobeDepth.prototype.isDestroyed = function() { + return !1; +}; +GlobeDepth.prototype.destroy = function() { + return destroyFramebuffers$3(this), defined(this._copyColorCommand) && (this._copyColorCommand.shaderProgram = this._copyColorCommand.shaderProgram.destroy()), defined(this._copyDepthCommand) && (this._copyDepthCommand.shaderProgram = this._copyDepthCommand.shaderProgram.destroy()), defined(this._tempCopyDepthCommand) && (this._tempCopyDepthCommand.shaderProgram = this._tempCopyDepthCommand.shaderProgram.destroy()), defined(this._updateDepthCommand) && (this._updateDepthCommand.shaderProgram = this._updateDepthCommand.shaderProgram.destroy()), destroyObject(this); +}; +function GlobeTranslucencyFramebuffer() { + this._framebuffer = new FramebufferManager({ + depthStencil: !0, + supportsDepthTexture: !0 + }), this._packedDepthFramebuffer = new FramebufferManager(), this._renderState = void 0, this._packedDepthCommand = void 0, this._clearCommand = void 0, this._viewport = new BoundingRectangle(), this._useScissorTest = !1, this._scissorRectangle = void 0, this._useHdr = void 0; +} +Object.defineProperties(GlobeTranslucencyFramebuffer.prototype, { + // Exposed for testing + classificationTexture: { + get: function() { + return this._framebuffer.getColorTexture(); + } + }, + classificationFramebuffer: { + get: function() { + return this._framebuffer.framebuffer; + } + }, + // Exposed for testing + packedDepthFramebuffer: { + get: function() { + return this._packedDepthFramebuffer.framebuffer; + } + }, + depthStencilTexture: { + get: function() { + return this._framebuffer.getDepthStencilTexture(); + } + }, + // Exposed for testing + depthStencilRenderbuffer: { + get: function() { + return this._framebuffer.getDepthStencilRenderbuffer(); + } + }, + packedDepthTexture: { + get: function() { + return this._packedDepthFramebuffer.getColorTexture(); + } + } +}); +function destroyResources$3(e) { + e._framebuffer.destroy(), e._packedDepthFramebuffer.destroy(); +} +function updateResources$1(e, t, n, i, r) { + const o = r ? t.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT : PixelDatatype$1.UNSIGNED_BYTE; + e._framebuffer.update( + t, + n, + i, + 1, + o + ), e._packedDepthFramebuffer.update(t, n, i); +} +function updateCommands(e, t, n, i, r) { + e._viewport.width = n, e._viewport.height = i; + const o = !BoundingRectangle.equals( + e._viewport, + r.viewport + ); + let s = o !== e._useScissorTest; + e._useScissorTest = o, BoundingRectangle.equals( + e._scissorRectangle, + r.viewport + ) || (e._scissorRectangle = BoundingRectangle.clone( + r.viewport, + e._scissorRectangle + ), s = !0), (!defined(e._renderState) || !BoundingRectangle.equals( + e._viewport, + e._renderState.viewport + ) || s) && (e._renderState = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + } + })), defined(e._packedDepthCommand) || (e._packedDepthCommand = t.createViewportQuadCommand( + PassThroughDepth, + { + uniformMap: { + u_depthTexture: function() { + return e.depthStencilTexture; + } + }, + owner: e + } + )), defined(e._clearCommand) || (e._clearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + depth: 1, + stencil: 0, + owner: e + })), e._packedDepthCommand.framebuffer = e._packedDepthFramebuffer.framebuffer, e._packedDepthCommand.renderState = e._renderState, e._clearCommand.framebuffer = e.classificationFramebuffer, e._clearCommand.renderState = e._renderState; +} +GlobeTranslucencyFramebuffer.prototype.updateAndClear = function(e, t, n, i) { + const r = t.width, o = t.height; + updateResources$1(this, n, r, o, e), updateCommands(this, n, r, o, i), this._useHdr = e; +}; +GlobeTranslucencyFramebuffer.prototype.clearClassification = function(e, t) { + this._clearCommand.execute(e, t); +}; +GlobeTranslucencyFramebuffer.prototype.packDepth = function(e, t) { + return this._packedDepthCommand.execute(e, t), this.packedDepthTexture; +}; +GlobeTranslucencyFramebuffer.prototype.isDestroyed = function() { + return !1; +}; +GlobeTranslucencyFramebuffer.prototype.destroy = function() { + return destroyResources$3(this), destroyObject(this); +}; +function OIT(e) { + this._numSamples = 1, this._translucentMultipassSupport = !1, this._translucentMRTSupport = !1; + const t = e.colorBufferFloat && e.depthTexture && e.floatBlend; + this._translucentMRTSupport = e.drawBuffers && t, this._translucentMultipassSupport = !this._translucentMRTSupport && t, this._opaqueFBO = void 0, this._opaqueTexture = void 0, this._depthStencilTexture = void 0, this._accumulationTexture = void 0, this._translucentFBO = new FramebufferManager({ + colorAttachmentsLength: this._translucentMRTSupport ? 2 : 1, + createColorAttachments: !1, + createDepthAttachments: !1, + depth: !0 + }), this._alphaFBO = new FramebufferManager({ + createColorAttachments: !1, + createDepthAttachments: !1, + depth: !0 + }), this._adjustTranslucentFBO = new FramebufferManager({ + colorAttachmentsLength: this._translucentMRTSupport ? 2 : 1, + createColorAttachments: !1 + }), this._adjustAlphaFBO = new FramebufferManager({ + createColorAttachments: !1 + }), this._opaqueClearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + owner: this + }), this._translucentMRTClearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 1), + owner: this + }), this._translucentMultipassClearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + owner: this + }), this._alphaClearCommand = new ClearCommand({ + color: new Color(1, 1, 1, 1), + owner: this + }), this._translucentRenderStateCache = {}, this._alphaRenderStateCache = {}, this._compositeCommand = void 0, this._adjustTranslucentCommand = void 0, this._adjustAlphaCommand = void 0, this._viewport = new BoundingRectangle(), this._rs = void 0, this._useScissorTest = !1, this._scissorRectangle = void 0, this._useHDR = !1; +} +function destroyTextures$1(e) { + e._accumulationTexture = e._accumulationTexture && !e._accumulationTexture.isDestroyed() && e._accumulationTexture.destroy(), e._revealageTexture = e._revealageTexture && !e._revealageTexture.isDestroyed() && e._revealageTexture.destroy(); +} +function destroyFramebuffers$2(e) { + e._translucentFBO.destroy(), e._alphaFBO.destroy(), e._adjustTranslucentFBO.destroy(), e._adjustAlphaFBO.destroy(); +} +function destroyResources$2(e) { + destroyTextures$1(e), destroyFramebuffers$2(e); +} +function updateTextures$1(e, t, n, i) { + destroyTextures$1(e), e._accumulationTexture = new Texture({ + context: t, + width: n, + height: i, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.FLOAT + }); + const r = new Float32Array(n * i * 4); + e._revealageTexture = new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.FLOAT, + source: { + arrayBufferView: r, + width: n, + height: i + }, + flipY: !1 + }); +} +function updateFramebuffers$2(e, t) { + destroyFramebuffers$2(e); + const n = WebGLConstants$1.FRAMEBUFFER_COMPLETE; + let i = !0; + const { width: r, height: o } = e._accumulationTexture; + if (e._translucentMRTSupport && (e._translucentFBO.setColorTexture(e._accumulationTexture, 0), e._translucentFBO.setColorTexture(e._revealageTexture, 1), e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture), e._translucentFBO.update(t, r, o), e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture, 0), e._adjustTranslucentFBO.setColorTexture(e._revealageTexture, 1), e._adjustTranslucentFBO.update(t, r, o), (e._translucentFBO.status !== n || e._adjustTranslucentFBO.status !== n) && (destroyFramebuffers$2(e), e._translucentMRTSupport = !1)), !e._translucentMRTSupport) { + e._translucentFBO.setColorTexture(e._accumulationTexture), e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture), e._translucentFBO.update(t, r, o), e._alphaFBO.setColorTexture(e._revealageTexture), e._alphaFBO.setDepthStencilTexture(e._depthStencilTexture), e._alphaFBO.update(t, r, o), e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture), e._adjustTranslucentFBO.update(t, r, o), e._adjustAlphaFBO.setColorTexture(e._revealageTexture), e._adjustAlphaFBO.update(t, r, o); + const s = e._translucentFBO.status === n, c = e._alphaFBO.status === n, l = e._adjustTranslucentFBO.status === n, d = e._adjustAlphaFBO.status === n; + (!s || !c || !l || !d) && (destroyResources$2(e), e._translucentMultipassSupport = !1, i = !1); + } + return i; +} +OIT.prototype.update = function(e, t, n, i, r) { + if (!this.isSupported()) + return; + this._opaqueFBO = n, this._opaqueTexture = n.getColorTexture(0), this._depthStencilTexture = n.getDepthStencilTexture(); + const { width: o, height: s } = this._opaqueTexture, c = this._accumulationTexture, l = !defined(c) || c.width !== o || c.height !== s || i !== this._useHDR, d = this._numSamples !== r; + if ((l || d) && (this._numSamples = r, updateTextures$1(this, e, o, s)), (!defined(this._translucentFBO.framebuffer) || l || d) && !updateFramebuffers$2(this, e)) + return; + this._useHDR = i; + const f = this; + let h, p; + defined(this._compositeCommand) || (h = new ShaderSource({ + sources: [CompositeOITFS] + }), this._translucentMRTSupport && h.defines.push("MRT"), p = { + u_opaque: function() { + return f._opaqueTexture; + }, + u_accumulation: function() { + return f._accumulationTexture; + }, + u_revealage: function() { + return f._revealageTexture; + } + }, this._compositeCommand = e.createViewportQuadCommand(h, { + uniformMap: p, + owner: this + })), defined(this._adjustTranslucentCommand) || (this._translucentMRTSupport ? (h = new ShaderSource({ + defines: ["MRT"], + sources: [AdjustTranslucentFS] + }), p = { + u_bgColor: function() { + return f._translucentMRTClearCommand.color; + }, + u_depthTexture: function() { + return f._depthStencilTexture; + } + }, this._adjustTranslucentCommand = e.createViewportQuadCommand(h, { + uniformMap: p, + owner: this + })) : this._translucentMultipassSupport && (h = new ShaderSource({ + sources: [AdjustTranslucentFS] + }), p = { + u_bgColor: function() { + return f._translucentMultipassClearCommand.color; + }, + u_depthTexture: function() { + return f._depthStencilTexture; + } + }, this._adjustTranslucentCommand = e.createViewportQuadCommand(h, { + uniformMap: p, + owner: this + }), p = { + u_bgColor: function() { + return f._alphaClearCommand.color; + }, + u_depthTexture: function() { + return f._depthStencilTexture; + } + }, this._adjustAlphaCommand = e.createViewportQuadCommand(h, { + uniformMap: p, + owner: this + }))), this._viewport.width = o, this._viewport.height = s; + const m = !BoundingRectangle.equals( + this._viewport, + t.viewport + ); + let _ = m !== this._useScissorTest; + this._useScissorTest = m, BoundingRectangle.equals(this._scissorRectangle, t.viewport) || (this._scissorRectangle = BoundingRectangle.clone( + t.viewport, + this._scissorRectangle + ), _ = !0), (!defined(this._rs) || !BoundingRectangle.equals(this._viewport, this._rs.viewport) || _) && (this._rs = RenderState.fromCache({ + viewport: this._viewport, + scissorTest: { + enabled: this._useScissorTest, + rectangle: this._scissorRectangle + } + })), defined(this._compositeCommand) && (this._compositeCommand.renderState = this._rs), this._adjustTranslucentCommand && (this._adjustTranslucentCommand.renderState = this._rs), defined(this._adjustAlphaCommand) && (this._adjustAlphaCommand.renderState = this._rs); +}; +const translucentMRTBlend = { + enabled: !0, + color: new Color(0, 0, 0, 0), + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.ONE, + functionDestinationRgb: BlendFunction$1.ONE, + functionSourceAlpha: BlendFunction$1.ZERO, + functionDestinationAlpha: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA +}, translucentColorBlend = { + enabled: !0, + color: new Color(0, 0, 0, 0), + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.ONE, + functionDestinationRgb: BlendFunction$1.ONE, + functionSourceAlpha: BlendFunction$1.ONE, + functionDestinationAlpha: BlendFunction$1.ONE +}, translucentAlphaBlend = { + enabled: !0, + color: new Color(0, 0, 0, 0), + equationRgb: BlendEquation$1.ADD, + equationAlpha: BlendEquation$1.ADD, + functionSourceRgb: BlendFunction$1.ZERO, + functionDestinationRgb: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA, + functionSourceAlpha: BlendFunction$1.ZERO, + functionDestinationAlpha: BlendFunction$1.ONE_MINUS_SOURCE_ALPHA +}; +function getTranslucentRenderState(e, t, n, i) { + let r = n[i.id]; + if (!defined(r)) { + const o = RenderState.getState(i); + o.depthMask = !1, o.blending = t, r = RenderState.fromCache(o), n[i.id] = r; + } + return r; +} +function getTranslucentMRTRenderState(e, t, n) { + return getTranslucentRenderState( + t, + translucentMRTBlend, + e._translucentRenderStateCache, + n + ); +} +function getTranslucentColorRenderState(e, t, n) { + return getTranslucentRenderState( + t, + translucentColorBlend, + e._translucentRenderStateCache, + n + ); +} +function getTranslucentAlphaRenderState(e, t, n) { + return getTranslucentRenderState( + t, + translucentAlphaBlend, + e._alphaRenderStateCache, + n + ); +} +const mrtShaderSource = ` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; + float ai = czm_out_FragColor.a; + float wzi = czm_alphaWeight(ai); + out_FragData_0 = vec4(Ci * wzi, ai); + out_FragData_1 = vec4(ai * wzi); +`, colorShaderSource = ` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; + float ai = czm_out_FragColor.a; + float wzi = czm_alphaWeight(ai); + out_FragColor = vec4(Ci, ai) * wzi; +`, alphaShaderSource = ` float ai = czm_out_FragColor.a; + out_FragColor = vec4(ai); +`; +function getTranslucentShaderProgram(e, t, n, i) { + const { shaderCache: r } = e, o = r.getDerivedShaderProgram(t, n); + if (defined(o)) + return o; + const s = t._attributeLocations, c = t.fragmentShaderSource.clone(); + c.sources = c.sources.map(function(f) { + return ShaderSource.replaceMain(f, "czm_translucent_main").replace(/out_FragColor/g, "czm_out_FragColor").replace( + /layout\s*\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g, + "" + ).replace(/\bdiscard\b/g, "czm_discard = true").replace(/czm_phong/g, "czm_translucentPhong"); + }), c.sources.splice( + 0, + 0, + `vec4 czm_out_FragColor; +bool czm_discard = false; +` + ); + const l = [...i.matchAll(/out_FragData_(\d+)/g)]; + let d = ""; + for (let f = 0; f < l.length; f++) { + const h = l[f]; + d = `layout (location = ${h[1]}) out vec4 ${h[0]}; +${d}`; + } + return c.sources.push(d), c.sources.push( + `void main() +{ + czm_translucent_main(); + if (czm_discard) + { + discard; + } +${i}} +` + ), r.createDerivedShaderProgram(t, n, { + vertexShaderSource: t.vertexShaderSource, + fragmentShaderSource: c, + attributeLocations: s + }); +} +function getTranslucentMRTShaderProgram(e, t) { + return getTranslucentShaderProgram( + e, + t, + "translucentMRT", + mrtShaderSource + ); +} +function getTranslucentColorShaderProgram(e, t) { + return getTranslucentShaderProgram( + e, + t, + "translucentMultipass", + colorShaderSource + ); +} +function getTranslucentAlphaShaderProgram(e, t) { + return getTranslucentShaderProgram( + e, + t, + "alphaMultipass", + alphaShaderSource + ); +} +OIT.prototype.createDerivedCommands = function(e, t, n) { + if (defined(n) || (n = {}), this._translucentMRTSupport) { + let c, l; + return defined(n.translucentCommand) && (c = n.translucentCommand.shaderProgram, l = n.translucentCommand.renderState), n.translucentCommand = DrawCommand.shallowClone( + e, + n.translucentCommand + ), !defined(c) || n.shaderProgramId !== e.shaderProgram.id ? (n.translucentCommand.shaderProgram = getTranslucentMRTShaderProgram( + t, + e.shaderProgram + ), n.translucentCommand.renderState = getTranslucentMRTRenderState( + this, + t, + e.renderState + ), n.shaderProgramId = e.shaderProgram.id) : (n.translucentCommand.shaderProgram = c, n.translucentCommand.renderState = l), n; + } + let i, r, o, s; + return defined(n.translucentCommand) && (i = n.translucentCommand.shaderProgram, r = n.translucentCommand.renderState, o = n.alphaCommand.shaderProgram, s = n.alphaCommand.renderState), n.translucentCommand = DrawCommand.shallowClone( + e, + n.translucentCommand + ), n.alphaCommand = DrawCommand.shallowClone(e, n.alphaCommand), !defined(i) || n.shaderProgramId !== e.shaderProgram.id ? (n.translucentCommand.shaderProgram = getTranslucentColorShaderProgram( + t, + e.shaderProgram + ), n.translucentCommand.renderState = getTranslucentColorRenderState( + this, + t, + e.renderState + ), n.alphaCommand.shaderProgram = getTranslucentAlphaShaderProgram( + t, + e.shaderProgram + ), n.alphaCommand.renderState = getTranslucentAlphaRenderState( + this, + t, + e.renderState + ), n.shaderProgramId = e.shaderProgram.id) : (n.translucentCommand.shaderProgram = i, n.translucentCommand.renderState = r, n.alphaCommand.shaderProgram = o, n.alphaCommand.renderState = s), n; +}; +function executeTranslucentCommandsSortedMultipass(e, t, n, i, r, o) { + let s, c, l; + const { context: d, frameState: f } = t, { useLogDepth: h, shadowState: p } = f, m = t._hdr, _ = i.framebuffer, y = p.lightShadowsEnabled; + i.framebuffer = e._adjustTranslucentFBO.framebuffer, e._adjustTranslucentCommand.execute(d, i), i.framebuffer = e._adjustAlphaFBO.framebuffer, e._adjustAlphaCommand.execute(d, i); + const C = e._opaqueFBO.framebuffer; + for (i.framebuffer = e._translucentFBO.framebuffer, l = 0; l < r.length; ++l) + s = r[l], s = h ? s.derivedCommands.logDepth.command : s, s = m ? s.derivedCommands.hdr.command : s, c = y && s.receiveShadows ? s.derivedCommands.oit.shadows.translucentCommand : s.derivedCommands.oit.translucentCommand, n( + c, + t, + d, + i, + C + ); + for (defined(o) && (s = o.unclassifiedCommand, c = y && s.receiveShadows ? s.derivedCommands.oit.shadows.translucentCommand : s.derivedCommands.oit.translucentCommand, n( + c, + t, + d, + i, + C + )), i.framebuffer = e._alphaFBO.framebuffer, l = 0; l < r.length; ++l) + s = r[l], s = h ? s.derivedCommands.logDepth.command : s, s = m ? s.derivedCommands.hdr.command : s, c = y && s.receiveShadows ? s.derivedCommands.oit.shadows.alphaCommand : s.derivedCommands.oit.alphaCommand, n( + c, + t, + d, + i, + C + ); + defined(o) && (s = o.unclassifiedCommand, c = y && s.receiveShadows ? s.derivedCommands.oit.shadows.alphaCommand : s.derivedCommands.oit.alphaCommand, n( + c, + t, + d, + i, + C + )), i.framebuffer = _; +} +function executeTranslucentCommandsSortedMRT(e, t, n, i, r, o) { + const { context: s, frameState: c } = t, { useLogDepth: l, shadowState: d } = c, f = t._hdr, h = i.framebuffer, p = d.lightShadowsEnabled; + i.framebuffer = e._adjustTranslucentFBO.framebuffer, e._adjustTranslucentCommand.execute(s, i); + const m = e._opaqueFBO.framebuffer; + i.framebuffer = e._translucentFBO.framebuffer; + let _, y; + for (let C = 0; C < r.length; ++C) + _ = r[C], _ = l ? _.derivedCommands.logDepth.command : _, _ = f ? _.derivedCommands.hdr.command : _, y = p && _.receiveShadows ? _.derivedCommands.oit.shadows.translucentCommand : _.derivedCommands.oit.translucentCommand, n( + y, + t, + s, + i, + m + ); + defined(o) && (_ = o.unclassifiedCommand, y = p && _.receiveShadows ? _.derivedCommands.oit.shadows.translucentCommand : _.derivedCommands.oit.translucentCommand, n( + y, + t, + s, + i, + m + )), i.framebuffer = h; +} +OIT.prototype.executeCommands = function(e, t, n, i, r) { + if (this._translucentMRTSupport) { + executeTranslucentCommandsSortedMRT( + this, + e, + t, + n, + i, + r + ); + return; + } + executeTranslucentCommandsSortedMultipass( + this, + e, + t, + n, + i, + r + ); +}; +OIT.prototype.execute = function(e, t) { + this._compositeCommand.execute(e, t); +}; +OIT.prototype.clear = function(e, t, n) { + const i = t.framebuffer; + t.framebuffer = this._opaqueFBO.framebuffer, Color.clone(n, this._opaqueClearCommand.color), this._opaqueClearCommand.execute(e, t), t.framebuffer = this._translucentFBO.framebuffer, (this._translucentMRTSupport ? this._translucentMRTClearCommand : this._translucentMultipassClearCommand).execute(e, t), this._translucentMultipassSupport && (t.framebuffer = this._alphaFBO.framebuffer, this._alphaClearCommand.execute(e, t)), t.framebuffer = i; +}; +OIT.prototype.isSupported = function() { + return this._translucentMRTSupport || this._translucentMultipassSupport; +}; +OIT.prototype.isDestroyed = function() { + return !1; +}; +OIT.prototype.destroy = function() { + return destroyResources$2(this), defined(this._compositeCommand) && (this._compositeCommand.shaderProgram = this._compositeCommand.shaderProgram && this._compositeCommand.shaderProgram.destroy()), defined(this._adjustTranslucentCommand) && (this._adjustTranslucentCommand.shaderProgram = this._adjustTranslucentCommand.shaderProgram && this._adjustTranslucentCommand.shaderProgram.destroy()), defined(this._adjustAlphaCommand) && (this._adjustAlphaCommand.shaderProgram = this._adjustAlphaCommand.shaderProgram && this._adjustAlphaCommand.shaderProgram.destroy()), destroyObject(this); +}; +function PickDepthFramebuffer() { + this._framebuffer = new FramebufferManager({ + color: !1, + depthStencil: !0, + supportsDepthTexture: !0 + }), this._passState = void 0; +} +Object.defineProperties(PickDepthFramebuffer.prototype, { + framebuffer: { + get: function() { + return this._framebuffer.framebuffer; + } + } +}); +function destroyResources$1(e) { + e._framebuffer.destroy(); +} +function createResources$1(e, t) { + const n = t.drawingBufferWidth, i = t.drawingBufferHeight; + e._framebuffer.update(t, n, i); + const r = new PassState(t); + r.blendingEnabled = !1, r.scissorTest = { + enabled: !0, + rectangle: new BoundingRectangle() + }, r.viewport = new BoundingRectangle(), e._passState = r; +} +PickDepthFramebuffer.prototype.update = function(e, t, n) { + const i = n.width, r = n.height; + this._framebuffer.isDirty(i, r) && createResources$1(this, e); + const o = this.framebuffer, s = this._passState; + return s.framebuffer = o, s.viewport.width = i, s.viewport.height = r, s.scissorTest.rectangle.x = t.x, s.scissorTest.rectangle.y = r - t.y, s.scissorTest.rectangle.width = 1, s.scissorTest.rectangle.height = 1, s; +}; +PickDepthFramebuffer.prototype.isDestroyed = function() { + return !1; +}; +PickDepthFramebuffer.prototype.destroy = function() { + return destroyResources$1(this), destroyObject(this); +}; +function PickFramebuffer(e) { + const t = new PassState(e); + t.blendingEnabled = !1, t.scissorTest = { + enabled: !0, + rectangle: new BoundingRectangle() + }, t.viewport = new BoundingRectangle(), this._context = e, this._fb = new FramebufferManager({ + depthStencil: !0 + }), this._passState = t, this._width = 0, this._height = 0; +} +PickFramebuffer.prototype.begin = function(e, t) { + const n = this._context, { width: i, height: r } = t; + return BoundingRectangle.clone( + e, + this._passState.scissorTest.rectangle + ), this._width = i, this._height = r, this._fb.update(n, i, r), this._passState.framebuffer = this._fb.framebuffer, this._passState.viewport.width = i, this._passState.viewport.height = r, this._passState; +}; +const colorScratch = new Color(); +PickFramebuffer.prototype.end = function(e) { + const t = defaultValue(e.width, 1), n = defaultValue(e.height, 1), i = this._context, r = i.readPixels({ + x: e.x, + y: e.y, + width: t, + height: n, + framebuffer: this._fb.framebuffer + }), o = Math.max(t, n), s = o * o, c = Math.floor(t * 0.5), l = Math.floor(n * 0.5); + let d = 0, f = 0, h = 0, p = -1; + for (let m = 0; m < s; ++m) { + if (-c <= d && d <= c && -l <= f && f <= l) { + const _ = 4 * ((l - f) * t + d + c); + colorScratch.red = Color.byteToFloat(r[_]), colorScratch.green = Color.byteToFloat(r[_ + 1]), colorScratch.blue = Color.byteToFloat(r[_ + 2]), colorScratch.alpha = Color.byteToFloat(r[_ + 3]); + const y = i.getObjectByPickColor(colorScratch); + if (defined(y)) + return y; + } + if (d === f || d < 0 && -d === f || d > 0 && d === 1 - f) { + const _ = h; + h = -p, p = _; + } + d += h, f += p; + } +}; +PickFramebuffer.prototype.readVoxelInfo = function(e) { + const t = defaultValue(e.width, 1), n = defaultValue(e.height, 1), r = this._context.readPixels({ + x: e.x, + y: e.y, + width: t, + height: n, + framebuffer: this._fb.framebuffer + }), o = Math.floor(t * 0.5), c = 4 * (Math.floor(n * 0.5) * t + o); + return r.slice(c, c + 4); +}; +PickFramebuffer.prototype.isDestroyed = function() { + return !1; +}; +PickFramebuffer.prototype.destroy = function() { + return this._fb.destroy(), destroyObject(this); +}; +function SceneFramebuffer() { + this._numSamples = 1, this._colorFramebuffer = new FramebufferManager({ + depthStencil: !0, + supportsDepthTexture: !0 + }), this._idFramebuffer = new FramebufferManager({ + depthStencil: !0, + supportsDepthTexture: !0 + }), this._idClearColor = new Color(0, 0, 0, 0), this._clearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + depth: 1, + owner: this + }); +} +function destroyResources(e) { + e._colorFramebuffer.destroy(), e._idFramebuffer.destroy(); +} +Object.defineProperties(SceneFramebuffer.prototype, { + framebuffer: { + get: function() { + return this._colorFramebuffer.framebuffer; + } + }, + idFramebuffer: { + get: function() { + return this._idFramebuffer.framebuffer; + } + }, + depthStencilTexture: { + get: function() { + return this._colorFramebuffer.getDepthStencilTexture(); + } + } +}); +SceneFramebuffer.prototype.update = function(e, t, n, i) { + const r = t.width, o = t.height, s = n ? e.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT : PixelDatatype$1.UNSIGNED_BYTE; + this._numSamples = i, this._colorFramebuffer.update( + e, + r, + o, + i, + s + ), this._idFramebuffer.update(e, r, o); +}; +SceneFramebuffer.prototype.clear = function(e, t, n) { + Color.clone(n, this._clearCommand.color), Color.clone(this._idClearColor, this._clearCommand.color), this._colorFramebuffer.clear(e, this._clearCommand, t), this._idFramebuffer.clear(e, this._clearCommand, t); +}; +SceneFramebuffer.prototype.getFramebuffer = function() { + return this._colorFramebuffer.framebuffer; +}; +SceneFramebuffer.prototype.getIdFramebuffer = function() { + return this._idFramebuffer.framebuffer; +}; +SceneFramebuffer.prototype.prepareColorTextures = function(e) { + this._numSamples > 1 && this._colorFramebuffer.prepareTextures(e); +}; +SceneFramebuffer.prototype.isDestroyed = function() { + return !1; +}; +SceneFramebuffer.prototype.destroy = function() { + return destroyResources(this), destroyObject(this); +}; +function ShadowMapShader() { +} +ShadowMapShader.getShadowCastShaderKeyword = function(e, t, n, i) { + return `castShadow ${e} ${t} ${n} ${i}`; +}; +ShadowMapShader.createShadowCastVertexShader = function(e, t, n) { + const i = e.defines.slice(0), r = e.sources.slice(0); + i.push("SHADOW_MAP"), n && i.push("GENERATE_POSITION"); + const o = ShaderSource.findPositionVarying(e), s = defined(o); + if (t && !s) { + const c = r.length; + for (let d = 0; d < c; ++d) + r[d] = ShaderSource.replaceMain(r[d], "czm_shadow_cast_main"); + r.push(`out vec3 v_positionEC; +void main() +{ + czm_shadow_cast_main(); + v_positionEC = (czm_inverseProjection * gl_Position).xyz; +}`); + } + return new ShaderSource({ + defines: i, + sources: r + }); +}; +ShadowMapShader.createShadowCastFragmentShader = function(e, t, n, i) { + const r = e.defines.slice(0), o = e.sources.slice(0); + r.push("SHADOW_MAP"); + let s = ShaderSource.findPositionVarying(e); + const c = defined(s); + c || (s = "v_positionEC"); + const l = o.length; + for (let f = 0; f < l; ++f) + o[f] = ShaderSource.replaceMain(o[f], "czm_shadow_cast_main"); + let d = ""; + return t && (c || (d += `in vec3 v_positionEC; +`), d += `uniform vec4 shadowMap_lightPositionEC; +`), i ? d += `void main() +{ +` : d += `void main() +{ + czm_shadow_cast_main(); + if (out_FragColor.a == 0.0) + { + discard; + } +`, t ? d += ` float distance = length(${s}); + if (distance >= shadowMap_lightPositionEC.w) + { + discard; + } + distance /= shadowMap_lightPositionEC.w; // radius + out_FragColor = czm_packDepth(distance); +` : n ? d += ` out_FragColor = vec4(1.0); +` : d += ` out_FragColor = czm_packDepth(gl_FragCoord.z); +`, d += `} +`, o.push(d), new ShaderSource({ + defines: r, + sources: o + }); +}; +ShadowMapShader.getShadowReceiveShaderKeyword = function(e, t, n, i) { + const r = e._usesDepthTexture, o = e._polygonOffsetSupported, s = e._isPointLight, c = e._isSpotLight, l = e._numberOfCascades > 1, d = e.debugCascadeColors, f = e.softShadows; + return `receiveShadow ${r}${o}${s}${c}${l}${d}${f}${t}${n}${i}`; +}; +ShadowMapShader.createShadowReceiveVertexShader = function(e, t, n) { + const i = e.defines.slice(0), r = e.sources.slice(0); + return i.push("SHADOW_MAP"), t && (n ? i.push("GENERATE_POSITION_AND_NORMAL") : i.push("GENERATE_POSITION")), new ShaderSource({ + defines: i, + sources: r + }); +}; +ShadowMapShader.createShadowReceiveFragmentShader = function(e, t, n, i, r) { + const o = ShaderSource.findNormalVarying(e), s = !i && defined(o) || i && r, c = ShaderSource.findPositionVarying(e), l = defined(c), d = t._usesDepthTexture, f = t._polygonOffsetSupported, h = t._isPointLight, p = t._isSpotLight, m = t._numberOfCascades > 1, _ = t.debugCascadeColors, y = t.softShadows, C = t.viewshed, T = h ? t._pointBias : i ? t._terrainBias : t._primitiveBias, x = e.defines.slice(0), b = e.sources.slice(0), S = b.length; + for (let D = 0; D < S; ++D) + b[D] = ShaderSource.replaceMain( + b[D], + "czm_shadow_receive_main" + ); + h ? x.push("USE_CUBE_MAP_SHADOW") : d && x.push("USE_SHADOW_DEPTH_TEXTURE"), y && !h && x.push("USE_SOFT_SHADOWS"), m && n && i && (s ? x.push("ENABLE_VERTEX_LIGHTING") : x.push("ENABLE_DAYNIGHT_SHADING")), n && T.normalShading && s && (x.push("USE_NORMAL_SHADING"), T.normalShadingSmooth > 0 && x.push("USE_NORMAL_SHADING_SMOOTH")); + let E = ""; + h ? E += `uniform samplerCube shadowMap_textureCube; +` : E += `uniform sampler2D shadowMap_texture; +`; + let A; + if (l ? A = ` return vec4(${c}, 1.0); +` : A = `#ifndef LOG_DEPTH + return czm_windowToEyeCoordinates(gl_FragCoord); +#else + return vec4(v_logPositionEC, 1.0); +#endif +`, E += `uniform mat4 shadowMap_matrix; +uniform vec3 shadowMap_lightDirectionEC; +uniform vec4 shadowMap_lightPositionEC; +uniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness; +uniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth; +#ifdef LOG_DEPTH +in vec3 v_logPositionEC; +#endif +vec4 getPositionEC() +{ +${A}} +vec3 getNormalEC() +{ +${s ? ` return normalize(${o}); +` : ` return vec3(1.0); +`}} +void applyNormalOffset(inout vec4 positionEC, vec3 normalEC, float nDotL) +{ +${T.normalOffset && s ? ` float normalOffset = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.x; + float normalOffsetScale = 1.0 - nDotL; + vec3 offset = normalOffset * normalOffsetScale * normalEC; + positionEC.xyz += offset; +` : ""}} +`, E += `void main() +{ + czm_shadow_receive_main(); + vec4 positionEC = getPositionEC(); + vec3 normalEC = getNormalEC(); + float depth = -positionEC.z; +`, E += ` czm_shadowParameters shadowParameters; + shadowParameters.texelStepSize = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy; + shadowParameters.depthBias = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z; + shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w; + shadowParameters.darkness = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w; +`, i && !C ? E += ` shadowParameters.depthBias *= max(depth * 0.01, 1.0); +` : f || (E += ` shadowParameters.depthBias *= mix(1.0, 100.0, depth * 0.0015); +`), h ? E += ` vec3 directionEC = positionEC.xyz - shadowMap_lightPositionEC.xyz; + float distance = length(directionEC); + directionEC = normalize(directionEC); + float radius = shadowMap_lightPositionEC.w; + // Stop early if the fragment is beyond the point light radius + if (distance > radius) + { + return; + } + vec3 directionWC = czm_inverseViewRotation * directionEC; + shadowParameters.depth = distance / radius; + shadowParameters.nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); + shadowParameters.texCoords = directionWC; + float visibility = czm_shadowVisibility(shadowMap_textureCube, shadowParameters); +` : p ? E += ` vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz); + float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); + applyNormalOffset(positionEC, normalEC, nDotL); + vec4 shadowPosition = shadowMap_matrix * positionEC; + // Spot light uses a perspective projection, so perform the perspective divide + shadowPosition /= shadowPosition.w; + // Stop early if the fragment is not in the shadow bounds + if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) + { + return; + } + shadowParameters.texCoords = shadowPosition.xy; + shadowParameters.depth = shadowPosition.z; + shadowParameters.nDotL = nDotL; + float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); +` : m ? E += ` float maxDepth = shadowMap_cascadeSplits[1].w; + // Stop early if the eye depth exceeds the last cascade + if (depth > maxDepth) + { + return; + } + // Get the cascade based on the eye-space depth + vec4 weights = czm_cascadeWeights(depth); + // Apply normal offset + float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); + applyNormalOffset(positionEC, normalEC, nDotL); + // Transform position into the cascade + vec4 shadowPosition = czm_cascadeMatrix(weights) * positionEC; + // Get visibility + shadowParameters.texCoords = shadowPosition.xy; + shadowParameters.depth = shadowPosition.z; + shadowParameters.nDotL = nDotL; + float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); + // Fade out shadows that are far away + float shadowMapMaximumDistance = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z; + float fade = max((depth - shadowMapMaximumDistance * 0.8) / (shadowMapMaximumDistance * 0.2), 0.0); + visibility = mix(visibility, 1.0, fade); +${_ ? ` // Draw cascade colors for debugging + out_FragColor *= czm_cascadeColor(weights); +` : ""}` : E += ` float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); + applyNormalOffset(positionEC, normalEC, nDotL); + vec4 shadowPosition = shadowMap_matrix * positionEC; + // Stop early if the fragment is not in the shadow bounds + if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) + { + return; + } + shadowParameters.texCoords = shadowPosition.xy; + shadowParameters.depth = shadowPosition.z; + shadowParameters.nDotL = nDotL; + float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); +`, C) { + const D = C.shadowColor ? Color.pack(C.shadowColor, []) : [0.2, 0.2, 0.2, 0.1], P = C.visibleColor ? Color.pack(C.visibleColor, []) : [1, 0.6, 0, 0.5]; + E += ` if (visibility <= ${C.distance || "0.4"}) + { + out_FragColor.rgba *= vec4(${D.join(",")}); + } + else + { + out_FragColor.rgba *= vec4(${P.join(",")}); + } +} +`; + } else typeof globalThis < "u" && globalThis.useVcsCustomShading ? (E += ` vec3 shadowSub = 0.8 * (1.0 - visibility) * vec3(nDotL); +`, E += ` out_FragColor.rgb -= shadowSub; +} +`) : E += ` out_FragColor.rgb *= visibility; +} +`; + return b.push(E), new ShaderSource({ + defines: x, + sources: b + }); +}; +function ShadowMap(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.context; + this._enabled = defaultValue(e.enabled, !0), this._softShadows = defaultValue(e.softShadows, !1), this._normalOffset = defaultValue(e.normalOffset, !0), this.dirty = !0, this.fromLightSource = defaultValue(e.fromLightSource, !0), this.darkness = defaultValue(e.darkness, 0.3), this._darkness = this.darkness, this.fadingEnabled = defaultValue(e.fadingEnabled, !0), this.maximumDistance = defaultValue(e.maximumDistance, 5e3), this._outOfView = !1, this._outOfViewPrevious = !1, this._needsUpdate = !0; + let n = !0; + (FeatureDetection.isInternetExplorer() || FeatureDetection.isEdge() || (FeatureDetection.isChrome() || FeatureDetection.isFirefox()) && FeatureDetection.isWindows() && !t.depthTexture) && (n = !1), this._polygonOffsetSupported = n, this._terrainBias = { + polygonOffset: n, + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4, + normalOffset: this._normalOffset, + normalOffsetScale: 0.5, + normalShading: !0, + normalShadingSmooth: 0.3, + depthBias: 1e-4 + }, this._primitiveBias = { + polygonOffset: n, + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4, + normalOffset: this._normalOffset, + normalOffsetScale: 0.1, + normalShading: !0, + normalShadingSmooth: 0.05, + depthBias: 2e-5 + }, this._pointBias = { + polygonOffset: !1, + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4, + normalOffset: this._normalOffset, + normalOffsetScale: 0, + normalShading: !0, + normalShadingSmooth: 0.1, + depthBias: 5e-4 + }, this._depthAttachment = void 0, this._colorAttachment = void 0, this._shadowMapMatrix = new Matrix4(), this._shadowMapTexture = void 0, this._lightDirectionEC = new Cartesian3(), this._lightPositionEC = new Cartesian4(), this._distance = 0, this._lightCamera = e.lightCamera, this._shadowMapCamera = new ShadowMapCamera(), this._shadowMapCullingVolume = void 0, this._sceneCamera = void 0, this._boundingSphere = new BoundingSphere(), this._isPointLight = defaultValue(e.isPointLight, !1), this._pointLightRadius = defaultValue(e.pointLightRadius, 100), this._cascadesEnabled = this._isPointLight ? !1 : defaultValue(e.cascadesEnabled, !0), this._numberOfCascades = this._cascadesEnabled ? defaultValue(e.numberOfCascades, 4) : 0, this._fitNearFar = !0, this._maximumCascadeDistances = [25, 150, 700, Number.MAX_VALUE], this._textureSize = new Cartesian2(), this._isSpotLight = !1, this._cascadesEnabled ? this._shadowMapCamera.frustum = new OrthographicOffCenterFrustum() : defined(this._lightCamera.frustum.fov) && (this._isSpotLight = !0), this._cascadeSplits = [new Cartesian4(), new Cartesian4()], this._cascadeMatrices = [ + new Matrix4(), + new Matrix4(), + new Matrix4(), + new Matrix4() + ], this._cascadeDistances = new Cartesian4(); + let i; + this._isPointLight ? i = 6 : this._cascadesEnabled ? i = this._numberOfCascades : i = 1, this._passes = new Array(i); + for (let r = 0; r < i; ++r) + this._passes[r] = new ShadowPass(t); + this.debugShow = !1, this.debugFreezeFrame = !1, this._debugFreezeFrame = !1, this._debugCascadeColors = !1, this._debugLightFrustum = void 0, this._debugCameraFrustum = void 0, this._debugCascadeFrustums = new Array(this._numberOfCascades), this._debugShadowViewCommand = void 0, this._usesDepthTexture = t.depthTexture, this._isPointLight && (this._usesDepthTexture = !1), this._primitiveRenderState = void 0, this._terrainRenderState = void 0, this._pointRenderState = void 0, createRenderStates(this), this._clearCommand = new ClearCommand({ + depth: 1, + color: new Color() + }), this._clearPassState = new PassState(t), this._size = defaultValue(e.size, 2048), this.size = this._size; +} +ShadowMap.MAXIMUM_DISTANCE = 2e4; +function ShadowPass(e) { + this.camera = new ShadowMapCamera(), this.passState = new PassState(e), this.framebuffer = void 0, this.textureOffsets = void 0, this.commandList = [], this.cullingVolume = void 0; +} +function createRenderState(e, t) { + return RenderState.fromCache({ + cull: { + enabled: !0, + face: CullFace$1.BACK + }, + depthTest: { + enabled: !0 + }, + colorMask: { + red: e, + green: e, + blue: e, + alpha: e + }, + depthMask: !0, + polygonOffset: { + enabled: t.polygonOffset, + factor: t.polygonOffsetFactor, + units: t.polygonOffsetUnits + } + }); +} +function createRenderStates(e) { + const t = !e._usesDepthTexture; + e._primitiveRenderState = createRenderState( + t, + e._primitiveBias + ), e._terrainRenderState = createRenderState( + t, + e._terrainBias + ), e._pointRenderState = createRenderState( + t, + e._pointBias + ); +} +ShadowMap.prototype.debugCreateRenderStates = function() { + createRenderStates(this); +}; +Object.defineProperties(ShadowMap.prototype, { + /** + * Determines if the shadow map will be shown. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @default true + */ + enabled: { + get: function() { + return this._enabled; + }, + set: function(e) { + this.dirty = this._enabled !== e, this._enabled = e; + } + }, + /** + * Determines if a normal bias will be applied to shadows. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @default true + */ + normalOffset: { + get: function() { + return this._normalOffset; + }, + set: function(e) { + this.dirty = this._normalOffset !== e, this._normalOffset = e, this._terrainBias.normalOffset = e, this._primitiveBias.normalOffset = e, this._pointBias.normalOffset = e; + } + }, + /** + * Determines if soft shadows are enabled. Uses pcf filtering which requires more texture reads and may hurt performance. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @default false + */ + softShadows: { + get: function() { + return this._softShadows; + }, + set: function(e) { + this.dirty = this._softShadows !== e, this._softShadows = e; + } + }, + /** + * The width and height, in pixels, of each shadow map. + * + * @memberof ShadowMap.prototype + * @type {number} + * @default 2048 + */ + size: { + get: function() { + return this._size; + }, + set: function(e) { + resize(this, e); + } + }, + /** + * Whether the shadow map is out of view of the scene camera. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @readonly + * @private + */ + outOfView: { + get: function() { + return this._outOfView; + } + }, + /** + * The culling volume of the shadow frustum. + * + * @memberof ShadowMap.prototype + * @type {CullingVolume} + * @readonly + * @private + */ + shadowMapCullingVolume: { + get: function() { + return this._shadowMapCullingVolume; + } + }, + /** + * The passes used for rendering shadows. Each face of a point light or each cascade for a cascaded shadow map is a separate pass. + * + * @memberof ShadowMap.prototype + * @type {ShadowPass[]} + * @readonly + * @private + */ + passes: { + get: function() { + return this._passes; + } + }, + /** + * Whether the light source is a point light. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @readonly + * @private + */ + isPointLight: { + get: function() { + return this._isPointLight; + } + }, + /** + * Debug option for visualizing the cascades by color. + * + * @memberof ShadowMap.prototype + * @type {boolean} + * @default false + * @private + */ + debugCascadeColors: { + get: function() { + return this._debugCascadeColors; + }, + set: function(e) { + this.dirty = this._debugCascadeColors !== e, this._debugCascadeColors = e; + } + } +}); +function destroyFramebuffer(e) { + const t = e._passes.length; + for (let n = 0; n < t; ++n) { + const i = e._passes[n], r = i.framebuffer; + defined(r) && !r.isDestroyed() && r.destroy(), i.framebuffer = void 0; + } + e._depthAttachment = e._depthAttachment && e._depthAttachment.destroy(), e._colorAttachment = e._colorAttachment && e._colorAttachment.destroy(); +} +function createFramebufferColor(e, t) { + const n = new Renderbuffer({ + context: t, + width: e._textureSize.x, + height: e._textureSize.y, + format: RenderbufferFormat$1.DEPTH_COMPONENT16 + }), i = new Texture({ + context: t, + width: e._textureSize.x, + height: e._textureSize.y, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + sampler: Sampler.NEAREST + }), r = new Framebuffer({ + context: t, + depthRenderbuffer: n, + colorTextures: [i], + destroyAttachments: !1 + }), o = e._passes.length; + for (let s = 0; s < o; ++s) { + const c = e._passes[s]; + c.framebuffer = r, c.passState.framebuffer = r; + } + e._shadowMapTexture = i, e._depthAttachment = n, e._colorAttachment = i; +} +function createFramebufferDepth(e, t) { + const n = new Texture({ + context: t, + width: e._textureSize.x, + height: e._textureSize.y, + pixelFormat: PixelFormat$1.DEPTH_STENCIL, + pixelDatatype: PixelDatatype$1.UNSIGNED_INT_24_8, + sampler: Sampler.NEAREST + }), i = new Framebuffer({ + context: t, + depthStencilTexture: n, + destroyAttachments: !1 + }), r = e._passes.length; + for (let o = 0; o < r; ++o) { + const s = e._passes[o]; + s.framebuffer = i, s.passState.framebuffer = i; + } + e._shadowMapTexture = n, e._depthAttachment = n; +} +function createFramebufferCube(e, t) { + const n = new Renderbuffer({ + context: t, + width: e._textureSize.x, + height: e._textureSize.y, + format: RenderbufferFormat$1.DEPTH_COMPONENT16 + }), i = new CubeMap({ + context: t, + width: e._textureSize.x, + height: e._textureSize.y, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + sampler: Sampler.NEAREST + }), r = [ + i.negativeX, + i.negativeY, + i.negativeZ, + i.positiveX, + i.positiveY, + i.positiveZ + ]; + for (let o = 0; o < 6; ++o) { + const s = new Framebuffer({ + context: t, + depthRenderbuffer: n, + colorTextures: [r[o]], + destroyAttachments: !1 + }), c = e._passes[o]; + c.framebuffer = s, c.passState.framebuffer = s; + } + e._shadowMapTexture = i, e._depthAttachment = n, e._colorAttachment = i; +} +function createFramebuffer(e, t) { + e._isPointLight ? createFramebufferCube(e, t) : e._usesDepthTexture ? createFramebufferDepth(e, t) : createFramebufferColor(e, t); +} +function checkFramebuffer(e, t) { + e._usesDepthTexture && e._passes[0].framebuffer.status !== WebGLConstants$1.FRAMEBUFFER_COMPLETE && (e._usesDepthTexture = !1, createRenderStates(e), destroyFramebuffer(e), createFramebuffer(e, t)); +} +function updateFramebuffer(e, t) { + (!defined(e._passes[0].framebuffer) || e._shadowMapTexture.width !== e._textureSize.x) && (destroyFramebuffer(e), createFramebuffer(e, t), checkFramebuffer(e, t), clearFramebuffer(e, t)); +} +function clearFramebuffer(e, t, n) { + n = defaultValue(n, 0), (e._isPointLight || n === 0) && (e._clearCommand.framebuffer = e._passes[n].framebuffer, e._clearCommand.execute(t, e._clearPassState)); +} +function resize(e, t) { + e._size = t; + const n = e._passes, i = n.length, r = e._textureSize; + if (e._isPointLight) { + t = ContextLimits.maximumCubeMapSize >= t ? t : ContextLimits.maximumCubeMapSize, r.x = t, r.y = t; + const o = new BoundingRectangle(0, 0, t, t); + n[0].passState.viewport = o, n[1].passState.viewport = o, n[2].passState.viewport = o, n[3].passState.viewport = o, n[4].passState.viewport = o, n[5].passState.viewport = o; + } else i === 1 ? (t = ContextLimits.maximumTextureSize >= t ? t : ContextLimits.maximumTextureSize, r.x = t, r.y = t, n[0].passState.viewport = new BoundingRectangle(0, 0, t, t)) : i === 4 && (t = ContextLimits.maximumTextureSize >= t * 2 ? t : ContextLimits.maximumTextureSize / 2, r.x = t * 2, r.y = t * 2, n[0].passState.viewport = new BoundingRectangle(0, 0, t, t), n[1].passState.viewport = new BoundingRectangle(t, 0, t, t), n[2].passState.viewport = new BoundingRectangle(0, t, t, t), n[3].passState.viewport = new BoundingRectangle( + t, + t, + t, + t + )); + e._clearPassState.viewport = new BoundingRectangle( + 0, + 0, + r.x, + r.y + ); + for (let o = 0; o < i; ++o) { + const s = n[o], c = s.passState.viewport, l = c.x / r.x, d = c.y / r.y, f = c.width / r.x, h = c.height / r.y; + s.textureOffsets = new Matrix4( + f, + 0, + 0, + l, + 0, + h, + 0, + d, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + } +} +const scratchViewport = new BoundingRectangle(); +function createDebugShadowViewCommand(e, t) { + let n; + e._isPointLight ? n = `uniform samplerCube shadowMap_textureCube; +in vec2 v_textureCoordinates; +void main() +{ + vec2 uv = v_textureCoordinates; + vec3 dir; + + if (uv.y < 0.5) + { + if (uv.x < 0.333) + { + dir.x = -1.0; + dir.y = uv.x * 6.0 - 1.0; + dir.z = uv.y * 4.0 - 1.0; + } + else if (uv.x < 0.666) + { + dir.y = -1.0; + dir.x = uv.x * 6.0 - 3.0; + dir.z = uv.y * 4.0 - 1.0; + } + else + { + dir.z = -1.0; + dir.x = uv.x * 6.0 - 5.0; + dir.y = uv.y * 4.0 - 1.0; + } + } + else + { + if (uv.x < 0.333) + { + dir.x = 1.0; + dir.y = uv.x * 6.0 - 1.0; + dir.z = uv.y * 4.0 - 3.0; + } + else if (uv.x < 0.666) + { + dir.y = 1.0; + dir.x = uv.x * 6.0 - 3.0; + dir.z = uv.y * 4.0 - 3.0; + } + else + { + dir.z = 1.0; + dir.x = uv.x * 6.0 - 5.0; + dir.y = uv.y * 4.0 - 3.0; + } + } + + float shadow = czm_unpackDepth(czm_textureCube(shadowMap_textureCube, dir)); + out_FragColor = vec4(vec3(shadow), 1.0); +} +` : n = `uniform sampler2D shadowMap_texture; +in vec2 v_textureCoordinates; +void main() +{ +${e._usesDepthTexture ? ` float shadow = texture(shadowMap_texture, v_textureCoordinates).r; +` : ` float shadow = czm_unpackDepth(texture(shadowMap_texture, v_textureCoordinates)); +`} out_FragColor = vec4(vec3(shadow), 1.0); +} +`; + const i = t.createViewportQuadCommand(n, { + uniformMap: { + shadowMap_texture: function() { + return e._shadowMapTexture; + }, + shadowMap_textureCube: function() { + return e._shadowMapTexture; + } + } + }); + return i.pass = Pass$1.OVERLAY, i; +} +function updateDebugShadowViewCommand(e, t) { + const n = t.context, i = t.context.drawingBufferWidth, r = t.context.drawingBufferHeight, o = Math.min(i, r) * 0.3, s = scratchViewport; + s.x = i - o, s.y = 0, s.width = o, s.height = o; + let c = e._debugShadowViewCommand; + defined(c) || (c = createDebugShadowViewCommand(e, n), e._debugShadowViewCommand = c), (!defined(c.renderState) || !BoundingRectangle.equals(c.renderState.viewport, s)) && (c.renderState = RenderState.fromCache({ + viewport: BoundingRectangle.clone(s) + })), t.commandList.push(e._debugShadowViewCommand); +} +const frustumCornersNDC = new Array(8); +frustumCornersNDC[0] = new Cartesian4(-1, -1, -1, 1); +frustumCornersNDC[1] = new Cartesian4(1, -1, -1, 1); +frustumCornersNDC[2] = new Cartesian4(1, 1, -1, 1); +frustumCornersNDC[3] = new Cartesian4(-1, 1, -1, 1); +frustumCornersNDC[4] = new Cartesian4(-1, -1, 1, 1); +frustumCornersNDC[5] = new Cartesian4(1, -1, 1, 1); +frustumCornersNDC[6] = new Cartesian4(1, 1, 1, 1); +frustumCornersNDC[7] = new Cartesian4(-1, 1, 1, 1); +const scratchMatrix$1 = new Matrix4(), scratchFrustumCorners = new Array(8); +for (let e = 0; e < 8; ++e) + scratchFrustumCorners[e] = new Cartesian4(); +function createDebugPointLight(e, t) { + const n = new GeometryInstance({ + geometry: new BoxOutlineGeometry({ + minimum: new Cartesian3(-0.5, -0.5, -0.5), + maximum: new Cartesian3(0.5, 0.5, 0.5) + }), + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(t) + } + }), i = new GeometryInstance({ + geometry: new SphereOutlineGeometry({ + radius: 0.5 + }), + attributes: { + color: ColorGeometryInstanceAttribute.fromColor(t) + } + }); + return new Primitive$3({ + geometryInstances: [n, i], + appearance: new PerInstanceColorAppearance({ + translucent: !1, + flat: !0 + }), + asynchronous: !1, + modelMatrix: e + }); +} +const debugOutlineColors = [Color.RED, Color.GREEN, Color.BLUE, Color.MAGENTA], scratchScale$5 = new Cartesian3(); +function applyDebugSettings(e, t) { + updateDebugShadowViewCommand(e, t); + const n = e.debugFreezeFrame && !e._debugFreezeFrame; + if (e._debugFreezeFrame = e.debugFreezeFrame, e.debugFreezeFrame && (n && (e._debugCameraFrustum = e._debugCameraFrustum && e._debugCameraFrustum.destroy(), e._debugCameraFrustum = new DebugCameraPrimitive({ + camera: e._sceneCamera, + color: Color.CYAN, + updateOnChange: !1 + })), e._debugCameraFrustum.update(t)), e._cascadesEnabled) { + if (e.debugFreezeFrame) { + n && (e._debugLightFrustum = e._debugLightFrustum && e._debugLightFrustum.destroy(), e._debugLightFrustum = new DebugCameraPrimitive({ + camera: e._shadowMapCamera, + color: Color.YELLOW, + updateOnChange: !1 + })), e._debugLightFrustum.update(t); + for (let i = 0; i < e._numberOfCascades; ++i) + n && (e._debugCascadeFrustums[i] = e._debugCascadeFrustums[i] && e._debugCascadeFrustums[i].destroy(), e._debugCascadeFrustums[i] = new DebugCameraPrimitive({ + camera: e._passes[i].camera, + color: debugOutlineColors[i], + updateOnChange: !1 + })), e._debugCascadeFrustums[i].update(t); + } + } else if (e._isPointLight) { + if (!defined(e._debugLightFrustum) || e._needsUpdate) { + const i = e._shadowMapCamera.positionWC, r = Quaternion.IDENTITY, o = e._pointLightRadius * 2, s = Cartesian3.fromElements( + o, + o, + o, + scratchScale$5 + ), c = Matrix4.fromTranslationQuaternionRotationScale( + i, + r, + s, + scratchMatrix$1 + ); + e._debugLightFrustum = e._debugLightFrustum && e._debugLightFrustum.destroy(), e._debugLightFrustum = createDebugPointLight( + c, + Color.YELLOW + ); + } + e._debugLightFrustum.update(t); + } else + (!defined(e._debugLightFrustum) || e._needsUpdate) && (e._debugLightFrustum = new DebugCameraPrimitive({ + camera: e._shadowMapCamera, + color: Color.YELLOW, + updateOnChange: !1 + })), e._debugLightFrustum.update(t); +} +function ShadowMapCamera() { + this.viewMatrix = new Matrix4(), this.inverseViewMatrix = new Matrix4(), this.frustum = void 0, this.positionCartographic = new Cartographic(), this.positionWC = new Cartesian3(), this.directionWC = Cartesian3.clone(Cartesian3.UNIT_Z), this.upWC = Cartesian3.clone(Cartesian3.UNIT_Y), this.rightWC = Cartesian3.clone(Cartesian3.UNIT_X), this.viewProjectionMatrix = new Matrix4(); +} +ShadowMapCamera.prototype.clone = function(e) { + Matrix4.clone(e.viewMatrix, this.viewMatrix), Matrix4.clone(e.inverseViewMatrix, this.inverseViewMatrix), this.frustum = e.frustum.clone(this.frustum), Cartographic.clone(e.positionCartographic, this.positionCartographic), Cartesian3.clone(e.positionWC, this.positionWC), Cartesian3.clone(e.directionWC, this.directionWC), Cartesian3.clone(e.upWC, this.upWC), Cartesian3.clone(e.rightWC, this.rightWC); +}; +const scaleBiasMatrix = new Matrix4( + 0.5, + 0, + 0, + 0.5, + 0, + 0.5, + 0, + 0.5, + 0, + 0, + 0.5, + 0.5, + 0, + 0, + 0, + 1 +); +ShadowMapCamera.prototype.getViewProjection = function() { + const e = this.viewMatrix, t = this.frustum.projectionMatrix; + return Matrix4.multiply(t, e, this.viewProjectionMatrix), Matrix4.multiply( + scaleBiasMatrix, + this.viewProjectionMatrix, + this.viewProjectionMatrix + ), this.viewProjectionMatrix; +}; +const scratchSplits = new Array(5), scratchFrustum = new PerspectiveFrustum(), scratchCascadeDistances = new Array(4), scratchMin$1 = new Cartesian3(), scratchMax$1 = new Cartesian3(); +function computeCascades(e, t) { + const n = e._shadowMapCamera, i = e._sceneCamera, r = i.frustum.near, o = i.frustum.far, s = e._numberOfCascades; + let c; + const l = o - r, d = o / r; + let f = 0.9, h = !1; + t.shadowState.closestObjectSize < 200 && (h = !0, f = 0.9); + const p = scratchCascadeDistances, m = scratchSplits; + for (m[0] = r, m[s] = o, c = 0; c < s; ++c) { + const M = (c + 1) / s, R = r * Math.pow(d, M), L = r + l * M, g = CesiumMath.lerp(L, R, f); + m[c + 1] = g, p[c] = g - m[c]; + } + if (h) { + for (c = 0; c < s; ++c) + p[c] = Math.min( + p[c], + e._maximumCascadeDistances[c] + ); + let M = m[0]; + for (c = 0; c < s - 1; ++c) + M += p[c], m[c + 1] = M; + } + Cartesian4.unpack(m, 0, e._cascadeSplits[0]), Cartesian4.unpack(m, 1, e._cascadeSplits[1]), Cartesian4.unpack(p, 0, e._cascadeDistances); + const _ = n.frustum, y = _.left, C = _.right, T = _.bottom, x = _.top, b = _.near, S = _.far, E = n.positionWC, A = n.directionWC, D = n.upWC, P = i.frustum.clone(scratchFrustum), I = n.getViewProjection(); + for (c = 0; c < s; ++c) { + P.near = m[c], P.far = m[c + 1]; + const M = Matrix4.multiply( + P.projectionMatrix, + i.viewMatrix, + scratchMatrix$1 + ), R = Matrix4.inverse( + M, + scratchMatrix$1 + ), L = Matrix4.multiply( + I, + R, + scratchMatrix$1 + ), g = Cartesian3.fromElements( + Number.MAX_VALUE, + Number.MAX_VALUE, + Number.MAX_VALUE, + scratchMin$1 + ), w = Cartesian3.fromElements( + -Number.MAX_VALUE, + -Number.MAX_VALUE, + -Number.MAX_VALUE, + scratchMax$1 + ); + for (let V = 0; V < 8; ++V) { + const U = Cartesian4.clone( + frustumCornersNDC[V], + scratchFrustumCorners[V] + ); + Matrix4.multiplyByVector(L, U, U), Cartesian3.divideByScalar(U, U.w, U), Cartesian3.minimumByComponent(U, g, g), Cartesian3.maximumByComponent(U, w, w); + } + g.x = Math.max(g.x, 0), g.y = Math.max(g.y, 0), g.z = 0, w.x = Math.min(w.x, 1), w.y = Math.min(w.y, 1), w.z = Math.min(w.z, 1); + const O = e._passes[c], N = O.camera; + N.clone(n); + const F = N.frustum; + F.left = y + g.x * (C - y), F.right = y + w.x * (C - y), F.bottom = T + g.y * (x - T), F.top = T + w.y * (x - T), F.near = b + g.z * (S - b), F.far = b + w.z * (S - b), O.cullingVolume = N.frustum.computeCullingVolume( + E, + A, + D + ); + const B = e._cascadeMatrices[c]; + Matrix4.multiply( + N.getViewProjection(), + i.inverseViewMatrix, + B + ), Matrix4.multiply(O.textureOffsets, B, B); + } +} +const scratchLightView = new Matrix4(), scratchRight$1 = new Cartesian3(), scratchUp$1 = new Cartesian3(), scratchTranslation$1 = new Cartesian3(); +function fitShadowMapToScene(e, t) { + const n = e._shadowMapCamera, i = e._sceneCamera, r = Matrix4.multiply( + i.frustum.projectionMatrix, + i.viewMatrix, + scratchMatrix$1 + ), o = Matrix4.inverse(r, scratchMatrix$1), s = n.directionWC; + let c = i.directionWC; + Cartesian3.equalsEpsilon(s, c, CesiumMath.EPSILON10) && (c = i.upWC); + const l = Cartesian3.cross(s, c, scratchRight$1); + c = Cartesian3.cross(l, s, scratchUp$1), Cartesian3.normalize(c, c), Cartesian3.normalize(l, l); + const d = Cartesian3.fromElements( + 0, + 0, + 0, + scratchTranslation$1 + ); + let f = Matrix4.computeView( + d, + s, + c, + l, + scratchLightView + ); + const h = Matrix4.multiply( + f, + o, + scratchMatrix$1 + ), p = Cartesian3.fromElements( + Number.MAX_VALUE, + Number.MAX_VALUE, + Number.MAX_VALUE, + scratchMin$1 + ), m = Cartesian3.fromElements( + -Number.MAX_VALUE, + -Number.MAX_VALUE, + -Number.MAX_VALUE, + scratchMax$1 + ); + for (let S = 0; S < 8; ++S) { + const E = Cartesian4.clone( + frustumCornersNDC[S], + scratchFrustumCorners[S] + ); + Matrix4.multiplyByVector(h, E, E), Cartesian3.divideByScalar(E, E.w, E), Cartesian3.minimumByComponent(E, p, p), Cartesian3.maximumByComponent(E, m, m); + } + m.z += 1e3, p.z -= 10; + const _ = scratchTranslation$1; + _.x = -(0.5 * (p.x + m.x)), _.y = -(0.5 * (p.y + m.y)), _.z = -m.z; + const y = Matrix4.fromTranslation(_, scratchMatrix$1); + f = Matrix4.multiply(y, f, f); + const C = 0.5 * (m.x - p.x), T = 0.5 * (m.y - p.y), x = m.z - p.z, b = n.frustum; + b.left = -C, b.right = C, b.bottom = -T, b.top = T, b.near = 0.01, b.far = x, Matrix4.clone(f, n.viewMatrix), Matrix4.inverse(f, n.inverseViewMatrix), Matrix4.getTranslation( + n.inverseViewMatrix, + n.positionWC + ), t.mapProjection.ellipsoid.cartesianToCartographic( + n.positionWC, + n.positionCartographic + ), Cartesian3.clone(s, n.directionWC), Cartesian3.clone(c, n.upWC), Cartesian3.clone(l, n.rightWC); +} +const directions = [ + new Cartesian3(-1, 0, 0), + new Cartesian3(0, -1, 0), + new Cartesian3(0, 0, -1), + new Cartesian3(1, 0, 0), + new Cartesian3(0, 1, 0), + new Cartesian3(0, 0, 1) +], ups = [ + new Cartesian3(0, -1, 0), + new Cartesian3(0, 0, -1), + new Cartesian3(0, -1, 0), + new Cartesian3(0, -1, 0), + new Cartesian3(0, 0, 1), + new Cartesian3(0, -1, 0) +], rights = [ + new Cartesian3(0, 0, 1), + new Cartesian3(1, 0, 0), + new Cartesian3(-1, 0, 0), + new Cartesian3(0, 0, -1), + new Cartesian3(1, 0, 0), + new Cartesian3(1, 0, 0) +]; +function computeOmnidirectional(e, t) { + const n = new PerspectiveFrustum(); + n.fov = CesiumMath.PI_OVER_TWO, n.near = 1, n.far = e._pointLightRadius, n.aspectRatio = 1; + for (let i = 0; i < 6; ++i) { + const r = e._passes[i].camera; + r.positionWC = e._shadowMapCamera.positionWC, r.positionCartographic = t.mapProjection.ellipsoid.cartesianToCartographic( + r.positionWC, + r.positionCartographic + ), r.directionWC = directions[i], r.upWC = ups[i], r.rightWC = rights[i], Matrix4.computeView( + r.positionWC, + r.directionWC, + r.upWC, + r.rightWC, + r.viewMatrix + ), Matrix4.inverse(r.viewMatrix, r.inverseViewMatrix), r.frustum = n; + } +} +const scratchCartesian1 = new Cartesian3(), scratchCartesian2$2 = new Cartesian3(), scratchBoundingSphere = new BoundingSphere(), scratchCenter$2 = scratchBoundingSphere.center; +function checkVisibility(e, t) { + const n = e._sceneCamera, i = e._shadowMapCamera, r = scratchBoundingSphere; + if (e._cascadesEnabled) { + if (n.frustum.near >= e.maximumDistance) { + e._outOfView = !0, e._needsUpdate = !1; + return; + } + const o = t.mapProjection.ellipsoid.geodeticSurfaceNormal( + n.positionWC, + scratchCartesian1 + ), s = Cartesian3.negate( + i.directionWC, + scratchCartesian2$2 + ), c = Cartesian3.dot(o, s); + if (e.fadingEnabled) { + const l = CesiumMath.clamp(c / 0.1, 0, 1); + e._darkness = CesiumMath.lerp( + 1, + e.darkness, + l + ); + } else + e._darkness = e.darkness; + if (c < 0) { + e._outOfView = !0, e._needsUpdate = !1; + return; + } + e._needsUpdate = !0, e._outOfView = !1; + } else if (e._isPointLight) + r.center = i.positionWC, r.radius = e._pointLightRadius, e._outOfView = t.cullingVolume.computeVisibility(r) === Intersect$1.OUTSIDE, e._needsUpdate = !e._outOfView && !e._boundingSphere.equals(r), BoundingSphere.clone(r, e._boundingSphere); + else { + const o = i.frustum.far / 2, s = Cartesian3.add( + i.positionWC, + Cartesian3.multiplyByScalar( + i.directionWC, + o, + scratchCenter$2 + ), + scratchCenter$2 + ); + r.center = s, r.radius = o, e._outOfView = t.cullingVolume.computeVisibility(r) === Intersect$1.OUTSIDE, e._needsUpdate = !e._outOfView && !e._boundingSphere.equals(r), BoundingSphere.clone(r, e._boundingSphere); + } +} +function updateCameras(e, t) { + const n = t.camera, i = e._lightCamera, r = e._sceneCamera, o = e._shadowMapCamera; + e._cascadesEnabled ? Cartesian3.clone(i.directionWC, o.directionWC) : e._isPointLight ? Cartesian3.clone(i.positionWC, o.positionWC) : o.clone(i); + const s = e._lightDirectionEC; + Matrix4.multiplyByPointAsVector( + n.viewMatrix, + o.directionWC, + s + ), Cartesian3.normalize(s, s), Cartesian3.negate(s, s), Matrix4.multiplyByPoint( + n.viewMatrix, + o.positionWC, + e._lightPositionEC + ), e._lightPositionEC.w = e._pointLightRadius; + let c, l; + e._fitNearFar ? (c = Math.min( + t.shadowState.nearPlane, + e.maximumDistance + ), l = Math.min(t.shadowState.farPlane, e.maximumDistance), l = Math.max(l, c + 1)) : (c = n.frustum.near, l = e.maximumDistance), e._sceneCamera = Camera.clone(n, r), n.frustum.clone(e._sceneCamera.frustum), e._sceneCamera.frustum.near = c, e._sceneCamera.frustum.far = l, e._distance = l - c, checkVisibility(e, t), !e._outOfViewPrevious && e._outOfView && (e._needsUpdate = !0), e._outOfViewPrevious = e._outOfView; +} +ShadowMap.prototype.update = function(e) { + if (updateCameras(this, e), this._needsUpdate) + if (updateFramebuffer(this, e.context), this._isPointLight && computeOmnidirectional(this, e), this._cascadesEnabled && (fitShadowMapToScene(this, e), this._numberOfCascades > 1 && computeCascades(this, e)), this._isPointLight) + this._shadowMapCullingVolume = CullingVolume.fromBoundingSphere( + this._boundingSphere + ); + else { + const t = this._shadowMapCamera, n = t.positionWC, i = t.directionWC, r = t.upWC; + this._shadowMapCullingVolume = t.frustum.computeCullingVolume( + n, + i, + r + ), this._passes.length === 1 && this._passes[0].camera.clone(t); + } + if (this._passes.length === 1) { + const t = this._sceneCamera.inverseViewMatrix; + Matrix4.multiply( + this._shadowMapCamera.getViewProjection(), + t, + this._shadowMapMatrix + ); + } + this.debugShow && applyDebugSettings(this, e); +}; +ShadowMap.prototype.updatePass = function(e, t) { + clearFramebuffer(this, e, t); +}; +const scratchTexelStepSize = new Cartesian2(); +function combineUniforms(e, t, n) { + const i = e._isPointLight ? e._pointBias : n ? e._terrainBias : e._primitiveBias, r = { + shadowMap_texture: function() { + return e._shadowMapTexture; + }, + shadowMap_textureCube: function() { + return e._shadowMapTexture; + }, + shadowMap_matrix: function() { + return e._shadowMapMatrix; + }, + shadowMap_cascadeSplits: function() { + return e._cascadeSplits; + }, + shadowMap_cascadeMatrices: function() { + return e._cascadeMatrices; + }, + shadowMap_lightDirectionEC: function() { + return e._lightDirectionEC; + }, + shadowMap_lightPositionEC: function() { + return e._lightPositionEC; + }, + shadowMap_cascadeDistances: function() { + return e._cascadeDistances; + }, + shadowMap_texelSizeDepthBiasAndNormalShadingSmooth: function() { + const o = scratchTexelStepSize; + return o.x = 1 / e._textureSize.x, o.y = 1 / e._textureSize.y, Cartesian4.fromElements( + o.x, + o.y, + i.depthBias, + i.normalShadingSmooth, + this.combinedUniforms1 + ); + }, + shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness: function() { + return Cartesian4.fromElements( + i.normalOffsetScale, + e._distance, + e.maximumDistance, + e._darkness, + this.combinedUniforms2 + ); + }, + combinedUniforms1: new Cartesian4(), + combinedUniforms2: new Cartesian4() + }; + return combine$2(t, r, !1); +} +function createCastDerivedCommand(e, t, n, i, r, o) { + let s, c, l; + if (defined(o) && (s = o.shaderProgram, c = o.renderState, l = o.uniformMap), o = DrawCommand.shallowClone(n, o), o.castShadows = !0, o.receiveShadows = !1, !defined(s) || r !== n.shaderProgram.id || t) { + const d = n.shaderProgram, f = n.pass === Pass$1.GLOBE, h = n.pass !== Pass$1.TRANSLUCENT, p = e._isPointLight, m = e._usesDepthTexture, _ = ShadowMapShader.getShadowCastShaderKeyword( + p, + f, + m, + h + ); + if (s = i.shaderCache.getDerivedShaderProgram( + d, + _ + ), !defined(s)) { + const C = d.vertexShaderSource, T = d.fragmentShaderSource, x = ShadowMapShader.createShadowCastVertexShader( + C, + p, + f + ), b = ShadowMapShader.createShadowCastFragmentShader( + T, + p, + m, + h + ); + s = i.shaderCache.createDerivedShaderProgram( + d, + _, + { + vertexShaderSource: x, + fragmentShaderSource: b, + attributeLocations: d._attributeLocations + } + ); + } + c = e._primitiveRenderState, p ? c = e._pointRenderState : f && (c = e._terrainRenderState), n.renderState.cull.enabled || (c = clone$1(c, !1), c.cull = clone$1(c.cull, !1), c.cull.enabled = !1, c = RenderState.fromCache(c)), l = combineUniforms(e, n.uniformMap, f); + } + return o.shaderProgram = s, o.renderState = c, o.uniformMap = l, o; +} +ShadowMap.createReceiveDerivedCommand = function(e, t, n, i, r) { + defined(r) || (r = {}); + const o = e.length > 0, s = t.shaderProgram, c = s.vertexShaderSource, l = s.fragmentShaderSource, d = t.pass === Pass$1.GLOBE; + let f = !1; + if (d && (f = t.owner.data.renderedMesh.encoding.hasVertexNormals), t.receiveShadows && o) { + let h, p; + defined(r.receiveCommand) && (h = r.receiveCommand.shaderProgram, p = r.receiveCommand.uniformMap), r.receiveCommand = DrawCommand.shallowClone( + t, + r.receiveCommand + ), r.castShadows = !1, r.receiveShadows = !0; + const m = r.receiveShaderCastShadows !== t.castShadows, _ = r.receiveShaderProgramId !== t.shaderProgram.id; + if (!defined(h) || _ || n || m) { + const y = ShadowMapShader.getShadowReceiveShaderKeyword( + e[0], + t.castShadows, + d, + f + ); + if (h = i.shaderCache.getDerivedShaderProgram( + s, + y + ), !defined(h)) { + const C = ShadowMapShader.createShadowReceiveVertexShader( + c, + d, + f + ), T = ShadowMapShader.createShadowReceiveFragmentShader( + l, + e[0], + t.castShadows, + d, + f + ); + h = i.shaderCache.createDerivedShaderProgram( + s, + y, + { + vertexShaderSource: C, + fragmentShaderSource: T, + attributeLocations: s._attributeLocations + } + ); + } + p = combineUniforms( + e[0], + t.uniformMap, + d + ); + } + r.receiveCommand.shaderProgram = h, r.receiveCommand.uniformMap = p, r.receiveShaderProgramId = t.shaderProgram.id, r.receiveShaderCastShadows = t.castShadows; + } + return r; +}; +ShadowMap.createCastDerivedCommand = function(e, t, n, i, r) { + if (defined(r) || (r = {}), t.castShadows) { + let o = r.castCommands; + defined(o) || (o = r.castCommands = []); + const s = r.castShaderProgramId, c = e.length; + o.length = c; + for (let l = 0; l < c; ++l) + o[l] = createCastDerivedCommand( + e[l], + n, + t, + i, + s, + o[l] + ); + r.castShaderProgramId = t.shaderProgram.id; + } + return r; +}; +ShadowMap.prototype.isDestroyed = function() { + return !1; +}; +ShadowMap.prototype.destroy = function() { + destroyFramebuffer(this), this._debugLightFrustum = this._debugLightFrustum && this._debugLightFrustum.destroy(), this._debugCameraFrustum = this._debugCameraFrustum && this._debugCameraFrustum.destroy(), this._debugShadowViewCommand = this._debugShadowViewCommand && this._debugShadowViewCommand.shaderProgram && this._debugShadowViewCommand.shaderProgram.destroy(); + for (let e = 0; e < this._numberOfCascades; ++e) + this._debugCascadeFrustums[e] = this._debugCascadeFrustums[e] && this._debugCascadeFrustums[e].destroy(); + return destroyObject(this); +}; +const CompositeTranslucentClassification = `uniform sampler2D colorTexture; + +#ifdef DEBUG_SHOW_DEPTH +uniform sampler2D u_packedTranslucentDepth; +#endif + +in vec2 v_textureCoordinates; + +void main() +{ +#ifdef DEBUG_SHOW_DEPTH + if (v_textureCoordinates.x < 0.5) + { + out_FragColor.rgb = vec3(czm_unpackDepth(texture(u_packedTranslucentDepth, v_textureCoordinates))); + out_FragColor.a = 1.0; + } +#else + vec4 color = texture(colorTexture, v_textureCoordinates); + +#ifdef PICK + if (color == vec4(0.0)) + { + discard; + } +#else + // Reverse premultiplication process to get the correct composited result of the classification primitives + color.rgb /= color.a; +#endif + out_FragColor = color; +#endif +} +`; +function TranslucentTileClassification(e) { + this._drawClassificationFBO = new FramebufferManager({ + createDepthAttachments: !1 + }), this._accumulationFBO = new FramebufferManager({ + createDepthAttachments: !1 + }), this._packFBO = new FramebufferManager(), this._opaqueDepthStencilTexture = void 0, this._textureToComposite = void 0, this._translucentDepthStencilTexture = void 0, this._packDepthCommand = void 0, this._accumulateCommand = void 0, this._compositeCommand = void 0, this._copyCommand = void 0, this._clearColorCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + owner: this + }), this._clearDepthStencilCommand = new ClearCommand({ + depth: 1, + stencil: 0, + owner: this + }), this._supported = e.depthTexture, this._viewport = new BoundingRectangle(), this._rsDepth = void 0, this._rsAccumulate = void 0, this._rsComp = void 0, this._useScissorTest = void 0, this._scissorRectangle = void 0, this._hasTranslucentDepth = !1, this._frustumsDrawn = 0; +} +Object.defineProperties(TranslucentTileClassification.prototype, { + /** + * Gets whether or not translucent depth was rendered. + * @memberof TranslucentTileClassification.prototype + * + * @type {boolean} + * @readonly + */ + hasTranslucentDepth: { + get: function() { + return this._hasTranslucentDepth; + } + } +}); +function destroyTextures(e) { + e._textureToComposite = void 0, e._translucentDepthStencilTexture = e._translucentDepthStencilTexture && !e._translucentDepthStencilTexture.isDestroyed() && e._translucentDepthStencilTexture.destroy(); +} +function destroyFramebuffers$1(e) { + e._drawClassificationFBO.destroy(), e._accumulationFBO.destroy(), e._packFBO.destroy(); +} +function updateTextures(e, t, n, i) { + destroyTextures(e), e._translucentDepthStencilTexture = new Texture({ + context: t, + width: n, + height: i, + pixelFormat: PixelFormat$1.DEPTH_STENCIL, + pixelDatatype: PixelDatatype$1.UNSIGNED_INT_24_8, + sampler: Sampler.NEAREST + }); +} +function updateFramebuffers$1(e, t, n, i) { + destroyFramebuffers$1(e), e._drawClassificationFBO.setDepthStencilTexture( + e._translucentDepthStencilTexture + ), e._drawClassificationFBO.update(t, n, i), e._accumulationFBO.setDepthStencilTexture( + e._translucentDepthStencilTexture + ), e._accumulationFBO.update(t, n, i), e._packFBO.update(t, n, i); +} +function updateResources(e, t, n, i) { + if (!e.isSupported()) + return; + e._opaqueDepthStencilTexture = i; + const r = e._opaqueDepthStencilTexture.width, o = e._opaqueDepthStencilTexture.height; + e._drawClassificationFBO.isDirty(r, o) && (updateTextures(e, t, r, o), updateFramebuffers$1(e, t, r, o)); + let s, c; + if (defined(e._packDepthCommand) || (s = new ShaderSource({ + sources: [CompareAndPackTranslucentDepth] + }), c = { + u_opaqueDepthTexture: function() { + return e._opaqueDepthStencilTexture; + }, + u_translucentDepthTexture: function() { + return e._translucentDepthStencilTexture; + } + }, e._packDepthCommand = t.createViewportQuadCommand(s, { + uniformMap: c, + owner: e + })), !defined(e._compositeCommand)) { + s = new ShaderSource({ + sources: [CompositeTranslucentClassification] + }), c = { + colorTexture: function() { + return e._textureToComposite; + } + }, e._compositeCommand = t.createViewportQuadCommand(s, { + uniformMap: c, + owner: e + }); + const f = e._compositeCommand, h = f.shaderProgram, p = t.shaderCache.createDerivedShaderProgram( + h, + "pick", + { + vertexShaderSource: h.vertexShaderSource, + fragmentShaderSource: new ShaderSource({ + sources: s.sources, + defines: ["PICK"] + }), + attributeLocations: h._attributeLocations + } + ), m = DrawCommand.shallowClone(f); + m.shaderProgram = p, f.derivedCommands.pick = m; + } + defined(e._copyCommand) || (s = new ShaderSource({ + sources: [CompositeTranslucentClassification] + }), c = { + colorTexture: function() { + return e._drawClassificationFBO.getColorTexture(); + } + }, e._copyCommand = t.createViewportQuadCommand(s, { + uniformMap: c, + owner: e + })), defined(e._accumulateCommand) || (s = new ShaderSource({ + sources: [CompositeTranslucentClassification] + }), c = { + colorTexture: function() { + return e._drawClassificationFBO.getColorTexture(); + } + }, e._accumulateCommand = t.createViewportQuadCommand(s, { + uniformMap: c, + owner: e + })), e._viewport.width = r, e._viewport.height = o; + const l = !BoundingRectangle.equals( + e._viewport, + n.viewport + ); + let d = l !== e._useScissorTest; + e._useScissorTest = l, BoundingRectangle.equals(e._scissorRectangle, n.viewport) || (e._scissorRectangle = BoundingRectangle.clone( + n.viewport, + e._scissorRectangle + ), d = !0), (!defined(e._rsDepth) || !BoundingRectangle.equals( + e._viewport, + e._rsDepth.viewport + ) || d) && (e._rsDepth = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + } + })), defined(e._packDepthCommand) && (e._packDepthCommand.renderState = e._rsDepth), (!defined(e._rsAccumulate) || !BoundingRectangle.equals( + e._viewport, + e._rsAccumulate.viewport + ) || d) && (e._rsAccumulate = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + }, + stencilTest: { + enabled: !0, + frontFunction: StencilFunction$1.EQUAL, + reference: StencilConstants$1.CESIUM_3D_TILE_MASK + } + })), defined(e._accumulateCommand) && (e._accumulateCommand.renderState = e._rsAccumulate), (!defined(e._rsComp) || !BoundingRectangle.equals( + e._viewport, + e._rsComp.viewport + ) || d) && (e._rsComp = RenderState.fromCache({ + viewport: e._viewport, + scissorTest: { + enabled: e._useScissorTest, + rectangle: e._scissorRectangle + }, + blending: BlendingState$1.ALPHA_BLEND + })), defined(e._compositeCommand) && (e._compositeCommand.renderState = e._rsComp, e._compositeCommand.derivedCommands.pick.renderState = e._rsComp); +} +TranslucentTileClassification.prototype.executeTranslucentCommands = function(e, t, n, i, r) { + const o = i.length; + let s, c; + const l = e.frameState.useLogDepth, d = e.context, f = n.framebuffer; + for (c = 0; c < o; ++c) + if (s = i[c], s = l ? s.derivedCommands.logDepth.command : s, s.depthForTranslucentClassification) { + this._hasTranslucentDepth = !0; + break; + } + if (this._hasTranslucentDepth) { + for (updateResources(this, d, n, r), n.framebuffer = this._drawClassificationFBO.framebuffer, this._clearDepthStencilCommand.execute(d, n), c = 0; c < o; ++c) { + if (s = i[c], s = l ? s.derivedCommands.logDepth.command : s, !s.depthForTranslucentClassification) + continue; + const h = s.derivedCommands.depth.depthOnlyCommand; + t(h, e, d, n); + } + this._frustumsDrawn += this._hasTranslucentDepth ? 1 : 0, this._hasTranslucentDepth && (n.framebuffer = this._packFBO.framebuffer, this._packDepthCommand.execute(d, n)), n.framebuffer = f; + } +}; +TranslucentTileClassification.prototype.executeClassificationCommands = function(e, t, n, i) { + if (!this._hasTranslucentDepth) + return; + const r = e.context, o = r.uniformState, s = n.framebuffer; + this._frustumsDrawn === 2 && (n.framebuffer = this._accumulationFBO.framebuffer, this._copyCommand.execute(r, n)), n.framebuffer = this._drawClassificationFBO.framebuffer, this._frustumsDrawn > 1 && this._clearColorCommand.execute(r, n), o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION); + const c = o.globeDepthTexture; + o.globeDepthTexture = this._packFBO.getColorTexture(); + const l = i.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION], d = i.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION]; + for (let f = 0; f < d; ++f) + t(l[f], e, r, n); + o.globeDepthTexture = c, n.framebuffer = s, this._frustumsDrawn !== 1 && (n.framebuffer = this._accumulationFBO.framebuffer, this._accumulateCommand.execute(r, n), n.framebuffer = s); +}; +TranslucentTileClassification.prototype.execute = function(e, t) { + if (!this._hasTranslucentDepth) + return; + this._frustumsDrawn === 1 ? this._textureToComposite = this._drawClassificationFBO.getColorTexture() : this._textureToComposite = this._accumulationFBO.getColorTexture(), (e.frameState.passes.pick ? this._compositeCommand.derivedCommands.pick : this._compositeCommand).execute(e.context, t), clear(this, e, t); +}; +function clear(e, t, n) { + if (!e._hasTranslucentDepth) + return; + const i = n.framebuffer; + n.framebuffer = e._drawClassificationFBO.framebuffer, e._clearColorCommand.execute( + t._context, + n + ), n.framebuffer = i, e._frustumsDrawn > 1 && (n.framebuffer = e._accumulationFBO.framebuffer, e._clearColorCommand.execute( + t._context, + n + )), e._hasTranslucentDepth = !1, e._frustumsDrawn = 0; +} +TranslucentTileClassification.prototype.isSupported = function() { + return this._supported; +}; +TranslucentTileClassification.prototype.isDestroyed = function() { + return !1; +}; +TranslucentTileClassification.prototype.destroy = function() { + return destroyTextures(this), destroyFramebuffers$1(this), defined(this._compositeCommand) && (this._compositeCommand.shaderProgram = this._compositeCommand.shaderProgram && this._compositeCommand.shaderProgram.destroy()), defined(this._packDepthCommand) && (this._packDepthCommand.shaderProgram = this._packDepthCommand.shaderProgram && this._packDepthCommand.shaderProgram.destroy()), destroyObject(this); +}; +function CommandExtent() { + this.command = void 0, this.near = void 0, this.far = void 0; +} +function View(e, t, n) { + const i = e.context; + let r; + i.depthTexture && (r = new GlobeDepth()); + let o; + e._useOIT && i.depthTexture && (o = new OIT(i)); + const s = new PassState(i); + s.viewport = BoundingRectangle.clone(n), this.camera = t, this._cameraClone = Camera.clone(t), this._cameraStartFired = !1, this._cameraMovedTime = void 0, this.viewport = n, this.passState = s, this.pickFramebuffer = new PickFramebuffer(i), this.pickDepthFramebuffer = new PickDepthFramebuffer(), this.sceneFramebuffer = new SceneFramebuffer(), this.globeDepth = r, this.globeTranslucencyFramebuffer = new GlobeTranslucencyFramebuffer(), this.oit = o, this.translucentTileClassification = new TranslucentTileClassification( + i + ), this.pickDepths = [], this.frustumCommandsList = [], this.debugFrustumStatistics = void 0, this._commandExtents = []; +} +const scratchPosition0 = new Cartesian3(), scratchPosition1 = new Cartesian3(); +function maxComponent(e, t) { + const n = Math.max(Math.abs(e.x), Math.abs(t.x)), i = Math.max(Math.abs(e.y), Math.abs(t.y)), r = Math.max(Math.abs(e.z), Math.abs(t.z)); + return Math.max(Math.max(n, i), r); +} +function cameraEqual(e, t, n) { + const i = 1 / Math.max(1, maxComponent(e.position, t.position)); + return Cartesian3.multiplyByScalar(e.position, i, scratchPosition0), Cartesian3.multiplyByScalar(t.position, i, scratchPosition1), Cartesian3.equalsEpsilon(scratchPosition0, scratchPosition1, n) && Cartesian3.equalsEpsilon(e.direction, t.direction, n) && Cartesian3.equalsEpsilon(e.up, t.up, n) && Cartesian3.equalsEpsilon(e.right, t.right, n) && Matrix4.equalsEpsilon(e.transform, t.transform, n) && e.frustum.equalsEpsilon(t.frustum, n); +} +View.prototype.checkForCameraUpdates = function(e) { + const t = this.camera, n = this._cameraClone; + return cameraEqual(t, n, CesiumMath.EPSILON15) ? (this._cameraStartFired && getTimestamp$1() - this._cameraMovedTime > e.cameraEventWaitTime && (t.moveEnd.raiseEvent(), this._cameraStartFired = !1), !1) : (this._cameraStartFired || (t.moveStart.raiseEvent(), this._cameraStartFired = !0), this._cameraMovedTime = getTimestamp$1(), Camera.clone(t, n), !0); +}; +function updateFrustums(e, t, n, i) { + const r = t.frameState, o = r.camera, s = r.useLogDepth ? t.logarithmicDepthFarToNearRatio : t.farToNearRatio, c = t.mode === SceneMode$1.SCENE2D, l = t.nearToFarDistance2D; + i *= 1 + CesiumMath.EPSILON2, n = Math.min(Math.max(n, o.frustum.near), o.frustum.far), i = Math.max(Math.min(i, o.frustum.far), n); + let d; + c ? (i = Math.min(i, o.position.z + t.nearToFarDistance2D), n = Math.min(n, i), d = Math.ceil( + Math.max(1, i - n) / t.nearToFarDistance2D + )) : d = Math.ceil(Math.log(i / n) / Math.log(s)); + const f = e.frustumCommandsList; + f.length = d; + for (let h = 0; h < d; ++h) { + let p, m; + c ? (p = Math.min( + i - l, + n + h * l + ), m = Math.min(i, p + l)) : (p = Math.max(n, Math.pow(s, h) * n), m = Math.min(i, s * p), t.logarithmicDepthBuffer && (m = Math.pow(10, Math.ceil(Math.log(m) / Math.log(10))))); + let _ = f[h]; + defined(_) ? (_.near = p, _.far = m) : _ = f[h] = new FrustumCommands( + p, + m + ); + } +} +function insertIntoBin(e, t, n, i, r) { + t.debugShowFrustums && (n.debugOverlappingFrustums = 0); + const o = e.frustumCommandsList, s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c], d = l.near, f = l.far; + if (i > f) + continue; + if (r < d) + break; + const h = n.pass, p = l.indices[h]++; + if (l.commands[h][p] = n, t.debugShowFrustums && (n.debugOverlappingFrustums |= 1 << c), n.executeInClosestFrustum) + break; + } + if (t.debugShowFrustums) { + const c = e.debugFrustumStatistics.commandsInFrustums; + c[n.debugOverlappingFrustums] = defined( + c[n.debugOverlappingFrustums] + ) ? c[n.debugOverlappingFrustums] + 1 : 1, ++e.debugFrustumStatistics.totalCommands; + } + t.updateDerivedCommands(n); +} +const scratchCullingVolume$1 = new CullingVolume(), scratchNearFarInterval = new Interval(); +View.prototype.createPotentiallyVisibleSet = function(e) { + const t = e.frameState, n = t.camera, i = n.directionWC, r = n.positionWC, o = e._computeCommandList, s = e._overlayCommandList, c = t.commandList; + e.debugShowFrustums && (this.debugFrustumStatistics = { + totalCommands: 0, + commandsInFrustums: {} + }); + const l = this.frustumCommandsList, d = l.length, f = Pass$1.NUMBER_OF_PASSES; + for (let L = 0; L < d; ++L) + for (let g = 0; g < f; ++g) + l[L].indices[g] = 0; + o.length = 0, s.length = 0; + const h = this._commandExtents, p = h.length; + let m = 0, _ = +Number.MAX_VALUE, y = -Number.MAX_VALUE; + const C = t.shadowState.shadowsEnabled; + let T = +Number.MAX_VALUE, x = -Number.MAX_VALUE, b = Number.MAX_VALUE; + const S = t.mode === SceneMode$1.SCENE3D ? t.occluder : void 0; + let E = t.cullingVolume; + const A = scratchCullingVolume$1.planes; + for (let L = 0; L < 5; ++L) + A[L] = E.planes[L]; + E = scratchCullingVolume$1; + const D = c.length; + for (let L = 0; L < D; ++L) { + const g = c[L], w = g.pass; + if (w === Pass$1.COMPUTE) + o.push(g); + else if (w === Pass$1.OVERLAY) + s.push(g); + else { + let O, N; + const F = g.boundingVolume; + if (defined(F)) { + if (!e.isVisible(g, E, S)) + continue; + const V = F.computePlaneDistances( + r, + i, + scratchNearFarInterval + ); + if (O = V.start, N = V.stop, _ = Math.min(_, O), y = Math.max(y, N), C && g.receiveShadows && O < ShadowMap.MAXIMUM_DISTANCE && !(w === Pass$1.GLOBE && O < -100 && N > 100)) { + const U = N - O; + w !== Pass$1.GLOBE && O < 100 && (b = Math.min(b, U)), T = Math.min(T, O), x = Math.max(x, N); + } + } else g instanceof ClearCommand ? (O = n.frustum.near, N = n.frustum.far) : (O = n.frustum.near, N = n.frustum.far, _ = Math.min(_, O), y = Math.max(y, N)); + let B = h[m]; + defined(B) || (B = h[m] = new CommandExtent()), B.command = g, B.near = O, B.far = N, m++; + } + } + C && (T = Math.min( + Math.max(T, n.frustum.near), + n.frustum.far + ), x = Math.max(Math.min(x, n.frustum.far), T)), C && (t.shadowState.nearPlane = T, t.shadowState.farPlane = x, t.shadowState.closestObjectSize = b), updateFrustums(this, e, _, y); + let P, I; + for (P = 0; P < m; P++) + I = h[P], insertIntoBin(this, e, I.command, I.near, I.far); + if (m < p) + for (P = m; P < p && (I = h[P], !!defined(I.command)); P++) + I.command = void 0; + const M = l.length, R = t.frustumSplits; + R.length = M + 1; + for (let L = 0; L < M; ++L) + R[L] = l[L].near, L === M - 1 && (R[L + 1] = l[L].far); +}; +View.prototype.destroy = function() { + this.pickFramebuffer = this.pickFramebuffer && this.pickFramebuffer.destroy(), this.pickDepthFramebuffer = this.pickDepthFramebuffer && this.pickDepthFramebuffer.destroy(), this.sceneFramebuffer = this.sceneFramebuffer && this.sceneFramebuffer.destroy(), this.globeDepth = this.globeDepth && this.globeDepth.destroy(), this.oit = this.oit && this.oit.destroy(), this.translucentTileClassification = this.translucentTileClassification && this.translucentTileClassification.destroy(), this.globeTranslucencyFramebuffer = this.globeTranslucencyFramebuffer && this.globeTranslucencyFramebuffer.destroy(); + let e; + const t = this.pickDepths, n = t.length; + for (e = 0; e < n; ++e) + t[e].destroy(); +}; +const offscreenDefaultWidth = 0.1, mostDetailedPreloadTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.MOST_DETAILED_PRELOAD +}), mostDetailedPickTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.MOST_DETAILED_PICK +}), pickTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.PICK +}); +function Picking(e) { + this._mostDetailedRayPicks = [], this.pickRenderStateCache = {}, this._pickPositionCache = {}, this._pickPositionCacheDirty = !1; + const t = new BoundingRectangle(0, 0, 1, 1), n = new Camera(e); + n.frustum = new OrthographicFrustum({ + width: offscreenDefaultWidth, + aspectRatio: 1, + near: 0.1 + }), this._pickOffscreenView = new View( + e, + n, + t + ); +} +Picking.prototype.update = function() { + this._pickPositionCacheDirty = !0; +}; +Picking.prototype.getPickDepth = function(e, t) { + const n = e.view.pickDepths; + let i = n[t]; + return defined(i) || (i = new PickDepth(), n[t] = i), i; +}; +const scratchOrthoPickingFrustum = new OrthographicOffCenterFrustum(), scratchOrthoOrigin = new Cartesian3(), scratchOrthoDirection = new Cartesian3(), scratchOrthoPixelSize = new Cartesian2(), scratchOrthoPickVolumeMatrix4 = new Matrix4(); +function getPickOrthographicCullingVolume(e, t, n, i, r) { + const o = e.camera; + let s = o.frustum; + const c = s.offCenterFrustum; + defined(c) && (s = c); + let l = 2 * (t.x - r.x) / r.width - 1; + l *= (s.right - s.left) * 0.5; + let d = 2 * (r.height - t.y - r.y) / r.height - 1; + d *= (s.top - s.bottom) * 0.5; + const f = Matrix4.clone( + o.transform, + scratchOrthoPickVolumeMatrix4 + ); + o._setTransform(Matrix4.IDENTITY); + const h = Cartesian3.clone(o.position, scratchOrthoOrigin); + Cartesian3.multiplyByScalar(o.right, l, scratchOrthoDirection), Cartesian3.add(scratchOrthoDirection, h, h), Cartesian3.multiplyByScalar(o.up, d, scratchOrthoDirection), Cartesian3.add(scratchOrthoDirection, h, h), o._setTransform(f), e.mode === SceneMode$1.SCENE2D && Cartesian3.fromElements(h.z, h.x, h.y, h); + const p = s.getPixelDimensions( + r.width, + r.height, + 1, + 1, + scratchOrthoPixelSize + ), m = scratchOrthoPickingFrustum; + return m.right = p.x * 0.5, m.left = -m.right, m.top = p.y * 0.5, m.bottom = -m.top, m.near = s.near, m.far = s.far, m.computeCullingVolume(h, o.directionWC, o.upWC); +} +const scratchPerspPickingFrustum = new PerspectiveOffCenterFrustum(), scratchPerspPixelSize = new Cartesian2(); +function getPickPerspectiveCullingVolume(e, t, n, i, r) { + const o = e.camera, s = o.frustum, c = s.near, l = Math.tan(s.fovy * 0.5), d = s.aspectRatio * l, f = 2 * (t.x - r.x) / r.width - 1, h = 2 * (r.height - t.y - r.y) / r.height - 1, p = f * c * d, m = h * c * l, _ = s.getPixelDimensions( + r.width, + r.height, + 1, + 1, + scratchPerspPixelSize + ), y = _.x * n * 0.5, C = _.y * i * 0.5, T = scratchPerspPickingFrustum; + return T.top = m + C, T.bottom = m - C, T.right = p + y, T.left = p - y, T.near = c, T.far = s.far, T.computeCullingVolume( + o.positionWC, + o.directionWC, + o.upWC + ); +} +function getPickCullingVolume(e, t, n, i, r) { + const o = e.camera.frustum; + return o instanceof OrthographicFrustum || o instanceof OrthographicOffCenterFrustum ? getPickOrthographicCullingVolume( + e, + t, + n, + i, + r + ) : getPickPerspectiveCullingVolume( + e, + t, + n, + i, + r + ); +} +let scratchRectangleWidth = 3, scratchRectangleHeight = 3, scratchRectangle$1 = new BoundingRectangle( + 0, + 0, + scratchRectangleWidth, + scratchRectangleHeight +); +const scratchPosition$1 = new Cartesian2(), scratchColorZero = new Color(0, 0, 0, 0); +Picking.prototype.pick = function(e, t, n, i) { + scratchRectangleWidth = defaultValue(n, 3), scratchRectangleHeight = defaultValue(i, scratchRectangleWidth); + const { context: r, frameState: o, defaultView: s } = e, { viewport: c, pickFramebuffer: l } = s; + e.view = s, c.x = 0, c.y = 0, c.width = r.drawingBufferWidth, c.height = r.drawingBufferHeight; + let d = s.passState; + d.viewport = BoundingRectangle.clone(c, d.viewport); + const f = SceneTransforms.transformWindowToDrawingBuffer( + e, + t, + scratchPosition$1 + ); + e.jobScheduler.disableThisFrame(), e.updateFrameState(), o.cullingVolume = getPickCullingVolume( + e, + f, + scratchRectangleWidth, + scratchRectangleHeight, + c + ), o.invertClassification = !1, o.passes.pick = !0, o.tilesetPassState = pickTilesetPassState, r.uniformState.update(o), e.updateEnvironment(), scratchRectangle$1.x = f.x - (scratchRectangleWidth - 1) * 0.5, scratchRectangle$1.y = e.drawingBufferHeight - f.y - (scratchRectangleHeight - 1) * 0.5, scratchRectangle$1.width = scratchRectangleWidth, scratchRectangle$1.height = scratchRectangleHeight, d = l.begin(scratchRectangle$1, c), e.updateAndExecuteCommands(d, scratchColorZero), e.resolveFramebuffers(d); + const h = l.end(scratchRectangle$1); + return r.endFrame(), h; +}; +Picking.prototype.pickVoxelCoordinate = function(e, t, n, i) { + scratchRectangleWidth = defaultValue(n, 3), scratchRectangleHeight = defaultValue(i, scratchRectangleWidth); + const { context: r, frameState: o, defaultView: s } = e, { viewport: c, pickFramebuffer: l } = s; + e.view = s, c.x = 0, c.y = 0, c.width = r.drawingBufferWidth, c.height = r.drawingBufferHeight; + let d = s.passState; + d.viewport = BoundingRectangle.clone(c, d.viewport); + const f = SceneTransforms.transformWindowToDrawingBuffer( + e, + t, + scratchPosition$1 + ); + e.jobScheduler.disableThisFrame(), e.updateFrameState(), o.cullingVolume = getPickCullingVolume( + e, + f, + scratchRectangleWidth, + scratchRectangleHeight, + c + ), o.invertClassification = !1, o.passes.pickVoxel = !0, o.tilesetPassState = pickTilesetPassState, r.uniformState.update(o), e.updateEnvironment(), scratchRectangle$1.x = f.x - (scratchRectangleWidth - 1) * 0.5, scratchRectangle$1.y = e.drawingBufferHeight - f.y - (scratchRectangleHeight - 1) * 0.5, scratchRectangle$1.width = scratchRectangleWidth, scratchRectangle$1.height = scratchRectangleHeight, d = l.begin(scratchRectangle$1, c), e.updateAndExecuteCommands(d, scratchColorZero), e.resolveFramebuffers(d); + const h = l.readVoxelInfo(scratchRectangle$1); + return r.endFrame(), h; +}; +function renderTranslucentDepthForPick(e, t) { + const { defaultView: n, context: i, frameState: r, environmentState: o } = e, { viewport: s, pickDepthFramebuffer: c } = n; + e.view = n, s.x = 0, s.y = 0, s.width = i.drawingBufferWidth, s.height = i.drawingBufferHeight; + let l = n.passState; + l.viewport = BoundingRectangle.clone(s, l.viewport), e.clearPasses(r.passes), r.passes.pick = !0, r.passes.depth = !0, r.cullingVolume = getPickCullingVolume( + e, + t, + 1, + 1, + s + ), r.tilesetPassState = pickTilesetPassState, e.updateEnvironment(), o.renderTranslucentDepthForPick = !0, l = c.update( + i, + t, + s + ), e.updateAndExecuteCommands(l, scratchColorZero), e.resolveFramebuffers(l), i.endFrame(); +} +const scratchPerspectiveFrustum$1 = new PerspectiveFrustum(), scratchPerspectiveOffCenterFrustum$1 = new PerspectiveOffCenterFrustum(), scratchOrthographicFrustum$1 = new OrthographicFrustum(), scratchOrthographicOffCenterFrustum$1 = new OrthographicOffCenterFrustum(); +Picking.prototype.pickPositionWorldCoordinates = function(e, t, n) { + if (!e.useDepthPicking) + return; + const i = t.toString(); + if (this._pickPositionCacheDirty) + this._pickPositionCache = {}, this._pickPositionCacheDirty = !1; + else if (this._pickPositionCache.hasOwnProperty(i)) + return Cartesian3.clone(this._pickPositionCache[i], n); + const { context: r, frameState: o, camera: s, defaultView: c } = e, { uniformState: l } = r; + e.view = c; + const d = SceneTransforms.transformWindowToDrawingBuffer( + e, + t, + scratchPosition$1 + ); + e.pickTranslucentDepth ? renderTranslucentDepthForPick(e, d) : (e.updateFrameState(), l.update(o), e.updateEnvironment()), d.y = e.drawingBufferHeight - d.y; + let f; + defined(s.frustum.fov) ? f = s.frustum.clone(scratchPerspectiveFrustum$1) : defined(s.frustum.infiniteProjectionMatrix) ? f = s.frustum.clone(scratchPerspectiveOffCenterFrustum$1) : defined(s.frustum.width) ? f = s.frustum.clone(scratchOrthographicFrustum$1) : f = s.frustum.clone(scratchOrthographicOffCenterFrustum$1); + const h = c.frustumCommandsList, p = h.length; + for (let m = 0; m < p; ++m) { + const y = this.getPickDepth(e, m).getDepth( + r, + d.x, + d.y + ); + if (defined(y) && y > 0 && y < 1) { + const C = h[m]; + let T; + return e.mode === SceneMode$1.SCENE2D ? (T = s.position.z, s.position.z = T - C.near + 1, f.far = Math.max(1, C.far - C.near), f.near = 1, l.update(o), l.updateFrustum(f)) : (f.near = C.near * (m !== 0 ? e.opaqueFrustumNearOffset : 1), f.far = C.far, l.updateFrustum(f)), n = SceneTransforms.drawingBufferToWorldCoordinates( + e, + d, + y, + n + ), e.mode === SceneMode$1.SCENE2D && (s.position.z = T, l.update(o)), this._pickPositionCache[i] = Cartesian3.clone(n), n; + } + } + this._pickPositionCache[i] = void 0; +}; +const scratchPickPositionCartographic = new Cartographic(); +Picking.prototype.pickPosition = function(e, t, n) { + if (n = this.pickPositionWorldCoordinates(e, t, n), defined(n) && e.mode !== SceneMode$1.SCENE3D) { + Cartesian3.fromElements(n.y, n.z, n.x, n); + const i = e.mapProjection, r = i.ellipsoid, o = i.unproject(n, scratchPickPositionCartographic); + r.cartographicToCartesian(o, n); + } + return n; +}; +function drillPick(e, t) { + let n, i; + const r = [], o = [], s = [], c = []; + defined(e) || (e = Number.MAX_VALUE); + let l = t(); + for (; defined(l); ) { + const d = l.object, f = l.position, h = l.exclude; + if (defined(f) && !defined(d)) { + r.push(l); + break; + } + if (!defined(d) || !defined(d.primitive) || !h && (r.push(l), 0 >= --e)) + break; + const p = d.primitive; + let m = !1; + typeof p.getGeometryInstanceAttributes == "function" && defined(d.id) && (i = p.getGeometryInstanceAttributes(d.id), defined(i) && defined(i.show) && (m = !0, i.show = ShowGeometryInstanceAttribute.toValue( + !1, + i.show + ), s.push(i))), d instanceof Cesium3DTileFeature && (m = !0, d.show = !1, c.push(d)), m || (p.show = !1, o.push(p)), l = t(); + } + for (n = 0; n < o.length; ++n) + o[n].show = !0; + for (n = 0; n < s.length; ++n) + i = s[n], i.show = ShowGeometryInstanceAttribute.toValue( + !0, + i.show + ); + for (n = 0; n < c.length; ++n) + c[n].show = !0; + return r; +} +Picking.prototype.drillPick = function(e, t, n, i, r) { + const o = this; + return drillPick(n, function() { + const l = o.pick(e, t, i, r); + if (defined(l)) + return { + object: l, + position: void 0, + exclude: !1 + }; + }).map(function(l) { + return l.object; + }); +}; +const scratchRight = new Cartesian3(), scratchUp = new Cartesian3(); +function MostDetailedRayPick(e, t, n) { + this.ray = e, this.width = t, this.tilesets = n, this.ready = !1; + const i = this; + this.promise = new Promise((r) => { + i._completePick = () => { + r(); + }; + }); +} +function updateOffscreenCameraFromRay(e, t, n, i) { + const r = t.direction, o = Cartesian3.mostOrthogonalAxis(r, scratchRight), s = Cartesian3.cross(r, o, scratchRight), c = Cartesian3.cross(r, s, scratchUp); + return i.position = t.origin, i.direction = r, i.up = c, i.right = s, i.frustum.width = defaultValue(n, offscreenDefaultWidth), i.frustum.computeCullingVolume( + i.positionWC, + i.directionWC, + i.upWC + ); +} +function updateMostDetailedRayPick(e, t, n) { + const i = t.frameState, { ray: r, width: o, tilesets: s } = n, c = e._pickOffscreenView.camera, l = updateOffscreenCameraFromRay( + e, + r, + o, + c + ), d = mostDetailedPreloadTilesetPassState; + d.camera = c, d.cullingVolume = l; + let f = !0; + const h = s.length; + for (let p = 0; p < h; ++p) { + const m = s[p]; + m.show && t.primitives.contains(m) && (m.updateForPass(i, d), f = f && d.ready); + } + return f && n._completePick(), f; +} +Picking.prototype.updateMostDetailedRayPicks = function(e) { + const t = this._mostDetailedRayPicks; + for (let n = 0; n < t.length; ++n) + updateMostDetailedRayPick(this, e, t[n]) && t.splice(n--, 1); +}; +function getTilesets(e, t, n) { + for (let i = 0; i < e.length; ++i) { + const r = e.get(i); + r.show && (defined(r.isCesium3DTileset) ? (!defined(t) || t.indexOf(r) === -1) && n.push(r) : r instanceof PrimitiveCollection && getTilesets(r, t, n)); + } +} +function launchMostDetailedRayPick(e, t, n, i, r, o) { + const s = []; + if (getTilesets(t.primitives, i, s), s.length === 0) + return Promise.resolve(o()); + const c = new MostDetailedRayPick(n, r, s); + return e._mostDetailedRayPicks.push(c), c.promise.then(function() { + return o(); + }); +} +function isExcluded(e, t) { + return !defined(e) || !defined(t) || t.length === 0 ? !1 : t.indexOf(e) > -1 || t.indexOf(e.primitive) > -1 || t.indexOf(e.id) > -1; +} +function getRayIntersection(e, t, n, i, r, o, s) { + const { context: c, frameState: l } = t, d = c.uniformState, f = e._pickOffscreenView; + t.view = f, updateOffscreenCameraFromRay(e, n, r, f.camera), scratchRectangle$1 = BoundingRectangle.clone(f.viewport, scratchRectangle$1); + const h = f.pickFramebuffer.begin(scratchRectangle$1, f.viewport); + t.jobScheduler.disableThisFrame(), t.updateFrameState(), l.invertClassification = !1, l.passes.pick = !0, l.passes.offscreen = !0, s ? l.tilesetPassState = mostDetailedPickTilesetPassState : l.tilesetPassState = pickTilesetPassState, d.update(l), t.updateEnvironment(), t.updateAndExecuteCommands(h, scratchColorZero), t.resolveFramebuffers(h); + let p; + const m = f.pickFramebuffer.end(scratchRectangle$1); + if (t.context.depthTexture) { + const _ = f.frustumCommandsList.length; + for (let y = 0; y < _; ++y) { + const T = e.getPickDepth(t, y).getDepth(c, 0, 0); + if (defined(T) && T > 0 && T < 1) { + const x = f.frustumCommandsList[y], b = x.near * (y !== 0 ? t.opaqueFrustumNearOffset : 1), S = x.far, E = b + T * (S - b); + p = Ray.getPoint(n, E); + break; + } + } + } + if (t.view = t.defaultView, c.endFrame(), defined(m) || defined(p)) + return { + object: m, + position: p, + exclude: !defined(p) && o || isExcluded(m, i) + }; +} +function getRayIntersections(e, t, n, i, r, o, s, c) { + return drillPick(i, function() { + return getRayIntersection( + e, + t, + n, + r, + o, + s, + c + ); + }); +} +function pickFromRay(e, t, n, i, r, o, s) { + const c = getRayIntersections( + e, + t, + n, + 1, + i, + r, + o, + s + ); + if (c.length > 0) + return c[0]; +} +function drillPickFromRay(e, t, n, i, r, o, s, c) { + return getRayIntersections( + e, + t, + n, + i, + r, + o, + s, + c + ); +} +function deferPromiseUntilPostRender(e, t) { + return new Promise((n, i) => { + t.then(function(r) { + const o = e.postRender.addEventListener(function() { + o(), n(r); + }); + e.requestRender(); + }).catch(function(r) { + i(r); + }); + }); +} +Picking.prototype.pickFromRay = function(e, t, n, i) { + return pickFromRay(this, e, t, n, i, !1, !1); +}; +Picking.prototype.drillPickFromRay = function(e, t, n, i, r) { + return drillPickFromRay( + this, + e, + t, + n, + i, + r, + !1, + !1 + ); +}; +Picking.prototype.pickFromRayMostDetailed = function(e, t, n, i) { + const r = this; + return t = Ray.clone(t), n = defined(n) ? n.slice() : n, deferPromiseUntilPostRender( + e, + launchMostDetailedRayPick( + r, + e, + t, + n, + i, + function() { + return pickFromRay( + r, + e, + t, + n, + i, + !1, + !0 + ); + } + ) + ); +}; +Picking.prototype.drillPickFromRayMostDetailed = function(e, t, n, i, r) { + const o = this; + return t = Ray.clone(t), i = defined(i) ? i.slice() : i, deferPromiseUntilPostRender( + e, + launchMostDetailedRayPick( + o, + e, + t, + i, + r, + function() { + return drillPickFromRay( + o, + e, + t, + n, + i, + r, + !1, + !0 + ); + } + ) + ); +}; +const scratchSurfacePosition = new Cartesian3(), scratchSurfaceNormal$1 = new Cartesian3(), scratchSurfaceRay = new Ray(), scratchCartographic$1 = new Cartographic(); +function getRayForSampleHeight(e, t) { + const n = e.ellipsoid, i = ApproximateTerrainHeights._defaultMaxTerrainHeight, r = n.geodeticSurfaceNormalCartographic( + t, + scratchSurfaceNormal$1 + ), o = Cartographic.toCartesian( + t, + n, + scratchSurfacePosition + ), s = scratchSurfaceRay; + s.origin = o, s.direction = r; + const c = new Ray(); + return Ray.getPoint(s, i, c.origin), Cartesian3.negate(r, c.direction), c; +} +function getRayForClampToHeight(e, t) { + const n = e.ellipsoid, i = Cartographic.fromCartesian( + t, + n, + scratchCartographic$1 + ); + return getRayForSampleHeight(e, i); +} +function getHeightFromCartesian(e, t) { + const n = e.ellipsoid; + return Cartographic.fromCartesian( + t, + n, + scratchCartographic$1 + ).height; +} +function sampleHeightMostDetailed(e, t, n, i, r) { + const o = getRayForSampleHeight(t, n); + return launchMostDetailedRayPick( + e, + t, + o, + i, + r, + function() { + const s = pickFromRay( + e, + t, + o, + i, + r, + !0, + !0 + ); + if (defined(s)) + return getHeightFromCartesian(t, s.position); + } + ); +} +function clampToHeightMostDetailed(e, t, n, i, r, o) { + const s = getRayForClampToHeight(t, n); + return launchMostDetailedRayPick( + e, + t, + s, + i, + r, + function() { + const c = pickFromRay( + e, + t, + s, + i, + r, + !0, + !0 + ); + if (defined(c)) + return Cartesian3.clone(c.position, o); + } + ); +} +Picking.prototype.sampleHeight = function(e, t, n, i) { + const r = getRayForSampleHeight(e, t), o = pickFromRay( + this, + e, + r, + n, + i, + !0, + !1 + ); + if (defined(o)) + return getHeightFromCartesian(e, o.position); +}; +Picking.prototype.clampToHeight = function(e, t, n, i, r) { + const o = getRayForClampToHeight(e, t), s = pickFromRay( + this, + e, + o, + n, + i, + !0, + !1 + ); + if (defined(s)) + return Cartesian3.clone(s.position, r); +}; +Picking.prototype.sampleHeightMostDetailed = function(e, t, n, i) { + n = defined(n) ? n.slice() : n; + const r = t.length, o = new Array(r); + for (let s = 0; s < r; ++s) + o[s] = sampleHeightMostDetailed( + this, + e, + t[s], + n, + i + ); + return deferPromiseUntilPostRender( + e, + Promise.all(o).then(function(s) { + const c = s.length; + for (let l = 0; l < c; ++l) + t[l].height = s[l]; + return t; + }) + ); +}; +Picking.prototype.clampToHeightMostDetailed = function(e, t, n, i) { + n = defined(n) ? n.slice() : n; + const r = t.length, o = new Array(r); + for (let s = 0; s < r; ++s) + o[s] = clampToHeightMostDetailed( + this, + e, + t[s], + n, + i, + t[s] + ); + return deferPromiseUntilPostRender( + e, + Promise.all(o).then(function(s) { + const c = s.length; + for (let l = 0; l < c; ++l) + t[l] = s[l]; + return t; + }) + ); +}; +Picking.prototype.destroy = function() { + this._pickOffscreenView = this._pickOffscreenView && this._pickOffscreenView.destroy(); +}; +const AcesTonemapping = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +#ifdef AUTO_EXPOSURE +uniform sampler2D autoExposure; +#else +uniform float exposure; +#endif + +void main() +{ + vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); + vec3 color = fragmentColor.rgb; + +#ifdef AUTO_EXPOSURE + color /= texture(autoExposure, vec2(0.5)).r; +#else + color *= vec3(exposure); +#endif + color = czm_acesTonemapping(color); + color = czm_inverseGamma(color); + + out_FragColor = vec4(color, fragmentColor.a); +} +`, AmbientOcclusionGenerate = `uniform sampler2D randomTexture; +uniform sampler2D depthTexture; +uniform float intensity; +uniform float bias; +uniform float lengthCap; +uniform float stepSize; +uniform float frustumLength; + +in vec2 v_textureCoordinates; + +vec4 clipToEye(vec2 uv, float depth) +{ + vec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0)); + vec4 posEC = czm_inverseProjection * vec4(xy, depth, 1.0); + posEC = posEC / posEC.w; + return posEC; +} + +//Reconstruct Normal Without Edge Removation +vec3 getNormalXEdge(vec3 posInCamera, float depthU, float depthD, float depthL, float depthR, vec2 pixelSize) +{ + vec4 posInCameraUp = clipToEye(v_textureCoordinates - vec2(0.0, pixelSize.y), depthU); + vec4 posInCameraDown = clipToEye(v_textureCoordinates + vec2(0.0, pixelSize.y), depthD); + vec4 posInCameraLeft = clipToEye(v_textureCoordinates - vec2(pixelSize.x, 0.0), depthL); + vec4 posInCameraRight = clipToEye(v_textureCoordinates + vec2(pixelSize.x, 0.0), depthR); + + vec3 up = posInCamera.xyz - posInCameraUp.xyz; + vec3 down = posInCameraDown.xyz - posInCamera.xyz; + vec3 left = posInCamera.xyz - posInCameraLeft.xyz; + vec3 right = posInCameraRight.xyz - posInCamera.xyz; + + vec3 DX = length(left) < length(right) ? left : right; + vec3 DY = length(up) < length(down) ? up : down; + + return normalize(cross(DY, DX)); +} + +void main(void) +{ + float depth = czm_readDepth(depthTexture, v_textureCoordinates); + vec4 posInCamera = clipToEye(v_textureCoordinates, depth); + + if (posInCamera.z > frustumLength) + { + out_FragColor = vec4(1.0); + return; + } + + vec2 pixelSize = czm_pixelRatio / czm_viewport.zw; + float depthU = czm_readDepth(depthTexture, v_textureCoordinates - vec2(0.0, pixelSize.y)); + float depthD = czm_readDepth(depthTexture, v_textureCoordinates + vec2(0.0, pixelSize.y)); + float depthL = czm_readDepth(depthTexture, v_textureCoordinates - vec2(pixelSize.x, 0.0)); + float depthR = czm_readDepth(depthTexture, v_textureCoordinates + vec2(pixelSize.x, 0.0)); + vec3 normalInCamera = getNormalXEdge(posInCamera.xyz, depthU, depthD, depthL, depthR, pixelSize); + + float ao = 0.0; + vec2 sampleDirection = vec2(1.0, 0.0); + float gapAngle = 90.0 * czm_radiansPerDegree; + + // RandomNoise + float randomVal = texture(randomTexture, v_textureCoordinates / pixelSize / 255.0).x; + + //Loop for each direction + for (int i = 0; i < 4; i++) + { + float newGapAngle = gapAngle * (float(i) + randomVal); + float cosVal = cos(newGapAngle); + float sinVal = sin(newGapAngle); + + //Rotate Sampling Direction + vec2 rotatedSampleDirection = vec2(cosVal * sampleDirection.x - sinVal * sampleDirection.y, sinVal * sampleDirection.x + cosVal * sampleDirection.y); + float localAO = 0.0; + float localStepSize = stepSize; + + //Loop for each step + for (int j = 0; j < 6; j++) + { + vec2 newCoords = v_textureCoordinates + rotatedSampleDirection * localStepSize * pixelSize; + + //Exception Handling + if(newCoords.x > 1.0 || newCoords.y > 1.0 || newCoords.x < 0.0 || newCoords.y < 0.0) + { + break; + } + + float stepDepthInfo = czm_readDepth(depthTexture, newCoords); + vec4 stepPosInCamera = clipToEye(newCoords, stepDepthInfo); + vec3 diffVec = stepPosInCamera.xyz - posInCamera.xyz; + float len = length(diffVec); + + if (len > lengthCap) + { + break; + } + + float dotVal = clamp(dot(normalInCamera, normalize(diffVec)), 0.0, 1.0 ); + float weight = len / lengthCap; + weight = 1.0 - weight * weight; + + if (dotVal < bias) + { + dotVal = 0.0; + } + + localAO = max(localAO, dotVal * weight); + localStepSize += stepSize; + } + ao += localAO; + } + + ao /= 4.0; + ao = 1.0 - clamp(ao, 0.0, 1.0); + ao = pow(ao, intensity); + out_FragColor = vec4(vec3(ao), 1.0); +} +`, AmbientOcclusionModulate = `uniform sampler2D colorTexture; +uniform sampler2D ambientOcclusionTexture; +uniform bool ambientOcclusionOnly; +in vec2 v_textureCoordinates; + +void main(void) +{ + vec4 color = texture(colorTexture, v_textureCoordinates); + vec4 ao = texture(ambientOcclusionTexture, v_textureCoordinates); + out_FragColor = ambientOcclusionOnly ? ao : ao * color; +} +`, BlackAndWhite = `uniform sampler2D colorTexture; +uniform float gradations; + +in vec2 v_textureCoordinates; + +void main(void) +{ + vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; +#ifdef CZM_SELECTED_FEATURE + if (czm_selected()) { + out_FragColor = vec4(rgb, 1.0); + return; + } +#endif + float luminance = czm_luminance(rgb); + float darkness = luminance * gradations; + darkness = (darkness - fract(darkness)) / gradations; + out_FragColor = vec4(vec3(darkness), 1.0); +} +`, BloomComposite = `uniform sampler2D colorTexture; +uniform sampler2D bloomTexture; +uniform bool glowOnly; + +in vec2 v_textureCoordinates; + +void main(void) +{ + vec4 color = texture(colorTexture, v_textureCoordinates); + +#ifdef CZM_SELECTED_FEATURE + if (czm_selected()) { + out_FragColor = color; + return; + } +#endif + + vec4 bloom = texture(bloomTexture, v_textureCoordinates); + out_FragColor = glowOnly ? bloom : bloom + color; +} +`, Brightness = `uniform sampler2D colorTexture; +uniform float brightness; + +in vec2 v_textureCoordinates; + +void main(void) +{ + vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; + vec3 target = vec3(0.0); + out_FragColor = vec4(mix(target, rgb, brightness), 1.0); +} +`, ContrastBias = `uniform sampler2D colorTexture; +uniform float contrast; +uniform float brightness; + +in vec2 v_textureCoordinates; + +void main(void) +{ + vec3 sceneColor = texture(colorTexture, v_textureCoordinates).xyz; + sceneColor = czm_RGBToHSB(sceneColor); + sceneColor.z += brightness; + sceneColor = czm_HSBToRGB(sceneColor); + + float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast)); + sceneColor = factor * (sceneColor - vec3(0.5)) + vec3(0.5); + out_FragColor = vec4(sceneColor, 1.0); +} +`, DepthOfField = `uniform sampler2D colorTexture; +uniform sampler2D blurTexture; +uniform sampler2D depthTexture; +uniform float focalDistance; + +in vec2 v_textureCoordinates; + +vec4 toEye(vec2 uv, float depth) +{ + vec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0)); + vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0); + posInCamera = posInCamera / posInCamera.w; + return posInCamera; +} + +float computeDepthBlur(float depth) +{ + float f; + if (depth < focalDistance) + { + f = (focalDistance - depth) / (focalDistance - czm_currentFrustum.x); + } + else + { + f = (depth - focalDistance) / (czm_currentFrustum.y - focalDistance); + f = pow(f, 0.1); + } + f *= f; + f = clamp(f, 0.0, 1.0); + return pow(f, 0.5); +} + +void main(void) +{ + float depth = czm_readDepth(depthTexture, v_textureCoordinates); + vec4 posInCamera = toEye(v_textureCoordinates, depth); + float d = computeDepthBlur(-posInCamera.z); + out_FragColor = mix(texture(colorTexture, v_textureCoordinates), texture(blurTexture, v_textureCoordinates), d); +} +`, DepthView = `uniform sampler2D depthTexture; + +in vec2 v_textureCoordinates; + +void main(void) +{ + float depth = czm_readDepth(depthTexture, v_textureCoordinates); + out_FragColor = vec4(vec3(depth), 1.0); +} +`, EdgeDetection = `uniform sampler2D depthTexture; +uniform float length; +uniform vec4 color; + +in vec2 v_textureCoordinates; + +void main(void) +{ + float directions[3]; + directions[0] = -1.0; + directions[1] = 0.0; + directions[2] = 1.0; + + float scalars[3]; + scalars[0] = 3.0; + scalars[1] = 10.0; + scalars[2] = 3.0; + + float padx = czm_pixelRatio / czm_viewport.z; + float pady = czm_pixelRatio / czm_viewport.w; + +#ifdef CZM_SELECTED_FEATURE + bool selected = false; + for (int i = 0; i < 3; ++i) + { + float dir = directions[i]; + selected = selected || czm_selected(vec2(-padx, dir * pady)); + selected = selected || czm_selected(vec2(padx, dir * pady)); + selected = selected || czm_selected(vec2(dir * padx, -pady)); + selected = selected || czm_selected(vec2(dir * padx, pady)); + if (selected) + { + break; + } + } + if (!selected) + { + out_FragColor = vec4(color.rgb, 0.0); + return; + } +#endif + + float horizEdge = 0.0; + float vertEdge = 0.0; + + for (int i = 0; i < 3; ++i) + { + float dir = directions[i]; + float scale = scalars[i]; + + horizEdge -= texture(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale; + horizEdge += texture(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale; + + vertEdge -= texture(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale; + vertEdge += texture(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale; + } + + float len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge); + out_FragColor = vec4(color.rgb, len > length ? color.a : 0.0); +} +`, FilmicTonemapping = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +#ifdef AUTO_EXPOSURE +uniform sampler2D autoExposure; +#else +uniform float exposure; +#endif + +// See slides 142 and 143: +// http://www.gdcvault.com/play/1012459/Uncharted_2__HDR_Lighting + +void main() +{ + vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); + vec3 color = fragmentColor.rgb; + +#ifdef AUTO_EXPOSURE + float exposure = texture(autoExposure, vec2(0.5)).r; + color /= exposure; +#else + color *= vec3(exposure); +#endif + + const float A = 0.22; // shoulder strength + const float B = 0.30; // linear strength + const float C = 0.10; // linear angle + const float D = 0.20; // toe strength + const float E = 0.01; // toe numerator + const float F = 0.30; // toe denominator + + const float white = 11.2; // linear white point value + + vec3 c = ((color * (A * color + C * B) + D * E) / (color * ( A * color + B) + D * F)) - E / F; + float w = ((white * (A * white + C * B) + D * E) / (white * ( A * white + B) + D * F)) - E / F; + + c = czm_inverseGamma(c / w); + out_FragColor = vec4(c, fragmentColor.a); +} +`, PbrNeutralTonemapping = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +#ifdef AUTO_EXPOSURE +uniform sampler2D autoExposure; +#else +uniform float exposure; +#endif + +void main() +{ + vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); + vec3 color = fragmentColor.rgb; + +#ifdef AUTO_EXPOSURE + color /= texture(autoExposure, vec2(0.5)).r; +#else + color *= vec3(exposure); +#endif + color = czm_pbrNeutralTonemapping(color); + color = czm_inverseGamma(color); + + out_FragColor = vec4(color, fragmentColor.a); +} +`, FXAA = `in vec2 v_textureCoordinates; + +uniform sampler2D colorTexture; + +const float fxaaQualitySubpix = 0.5; +const float fxaaQualityEdgeThreshold = 0.125; +const float fxaaQualityEdgeThresholdMin = 0.0833; + +void main() +{ + vec2 fxaaQualityRcpFrame = vec2(1.0) / czm_viewport.zw; + vec4 color = FxaaPixelShader( + v_textureCoordinates, + colorTexture, + fxaaQualityRcpFrame, + fxaaQualitySubpix, + fxaaQualityEdgeThreshold, + fxaaQualityEdgeThresholdMin); + float alpha = texture(colorTexture, v_textureCoordinates).a; + out_FragColor = vec4(color.rgb, alpha); +} +`, GaussianBlur1D = `#define SAMPLES 8 + +uniform float delta; +uniform float sigma; +uniform float direction; // 0.0 for x direction, 1.0 for y direction + +uniform sampler2D colorTexture; + +#ifdef USE_STEP_SIZE +uniform float stepSize; +#else +uniform vec2 step; +#endif + +in vec2 v_textureCoordinates; + +// Incremental Computation of the Gaussian: +// https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch40.html + +void main() +{ + vec2 st = v_textureCoordinates; + vec2 dir = vec2(1.0 - direction, direction); + +#ifdef USE_STEP_SIZE + vec2 step = vec2(stepSize * (czm_pixelRatio / czm_viewport.zw)); +#else + vec2 step = step; +#endif + + vec3 g; + g.x = 1.0 / (sqrt(czm_twoPi) * sigma); + g.y = exp((-0.5 * delta * delta) / (sigma * sigma)); + g.z = g.y * g.y; + + vec4 result = texture(colorTexture, st) * g.x; + for (int i = 1; i < SAMPLES; ++i) + { + g.xy *= g.yz; + + vec2 offset = float(i) * dir * step; + result += texture(colorTexture, st - offset) * g.x; + result += texture(colorTexture, st + offset) * g.x; + } + + out_FragColor = result; +} +`, LensFlare = `uniform sampler2D colorTexture; +uniform sampler2D dirtTexture; +uniform sampler2D starTexture; +uniform vec2 dirtTextureDimensions; +uniform float distortion; +uniform float ghostDispersal; +uniform float haloWidth; +uniform float dirtAmount; +uniform float earthRadius; +uniform float intensity; + +in vec2 v_textureCoordinates; + +// whether it is in space or not +// 6500000.0 is empirical value +#define DISTANCE_TO_SPACE 6500000.0 + +// return ndc from world coordinate biased earthRadius +vec4 getNDCFromWC(vec3 WC, float earthRadius) +{ + vec4 positionEC = czm_view * vec4(WC, 1.0); + positionEC = vec4(positionEC.x + earthRadius, positionEC.y, positionEC.z, 1.0); + vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); + return czm_viewportOrthographic * vec4(positionWC.xy, -positionWC.z, 1.0); +} + +// Check if current pixel is included Earth +// if then mask it gradually +float isInEarth(vec2 texcoord, vec2 sceneSize) +{ + vec2 NDC = texcoord * 2.0 - 1.0; + vec4 earthPosSC = getNDCFromWC(vec3(0.0), 0.0); + vec4 earthPosSCEdge = getNDCFromWC(vec3(0.0), earthRadius * 1.5); + NDC.xy -= earthPosSC.xy; + + float X = abs(NDC.x) * sceneSize.x; + float Y = abs(NDC.y) * sceneSize.y; + + return clamp(0.0, 1.0, max(sqrt(X * X + Y * Y) / max(abs(earthPosSCEdge.x * sceneSize.x), 1.0) - 0.8 , 0.0)); +} + +// For Chromatic effect +vec4 textureDistorted(sampler2D tex, vec2 texcoord, vec2 direction, vec3 distortion, bool isSpace) +{ + vec2 sceneSize = czm_viewport.zw; + vec3 color; + if(isSpace) + { + color.r = isInEarth(texcoord + direction * distortion.r, sceneSize) * texture(tex, texcoord + direction * distortion.r).r; + color.g = isInEarth(texcoord + direction * distortion.g, sceneSize) * texture(tex, texcoord + direction * distortion.g).g; + color.b = isInEarth(texcoord + direction * distortion.b, sceneSize) * texture(tex, texcoord + direction * distortion.b).b; + } + else + { + color.r = texture(tex, texcoord + direction * distortion.r).r; + color.g = texture(tex, texcoord + direction * distortion.g).g; + color.b = texture(tex, texcoord + direction * distortion.b).b; + } + return vec4(clamp(color, 0.0, 1.0), 0.0); +} + +void main(void) +{ + vec4 originalColor = texture(colorTexture, v_textureCoordinates); + vec3 rgb = originalColor.rgb; + bool isSpace = length(czm_viewerPositionWC.xyz) > DISTANCE_TO_SPACE; + + // Sun position + vec4 sunPos = czm_morphTime == 1.0 ? vec4(czm_sunPositionWC, 1.0) : vec4(czm_sunPositionColumbusView.zxy, 1.0); + vec4 sunPositionEC = czm_view * sunPos; + vec4 sunPositionWC = czm_eyeToWindowCoordinates(sunPositionEC); + sunPos = czm_viewportOrthographic * vec4(sunPositionWC.xy, -sunPositionWC.z, 1.0); + + // If sun is not in the screen space, use original color. + if(!isSpace || !((sunPos.x >= -1.1 && sunPos.x <= 1.1) && (sunPos.y >= -1.1 && sunPos.y <= 1.1))) + { + // Lens flare is disabled when not in space until #5932 is fixed. + // https://github.com/CesiumGS/cesium/issues/5932 + out_FragColor = originalColor; + return; + } + + vec2 texcoord = vec2(1.0) - v_textureCoordinates; + vec2 pixelSize = czm_pixelRatio / czm_viewport.zw; + vec2 invPixelSize = 1.0 / pixelSize; + vec3 distortionVec = pixelSize.x * vec3(-distortion, 0.0, distortion); + + // ghost vector to image centre: + vec2 ghostVec = (vec2(0.5) - texcoord) * ghostDispersal; + vec3 direction = normalize(vec3(ghostVec, 0.0)); + + // sample ghosts: + vec4 result = vec4(0.0); + vec4 ghost = vec4(0.0); + for (int i = 0; i < 4; ++i) + { + vec2 offset = fract(texcoord + ghostVec * float(i)); + // Only bright spots from the centre of the source image + ghost += textureDistorted(colorTexture, offset, direction.xy, distortionVec, isSpace); + } + result += ghost; + + // sample halo + vec2 haloVec = normalize(ghostVec) * haloWidth; + float weightForHalo = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5)); + weightForHalo = pow(1.0 - weightForHalo, 5.0); + + result += textureDistorted(colorTexture, texcoord + haloVec, direction.xy, distortionVec, isSpace) * weightForHalo * 1.5; + + // dirt on lens + vec2 dirtTexCoords = (v_textureCoordinates * invPixelSize) / dirtTextureDimensions; + if (dirtTexCoords.x > 1.0) + { + dirtTexCoords.x = mod(floor(dirtTexCoords.x), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.x) : fract(dirtTexCoords.x); + } + if (dirtTexCoords.y > 1.0) + { + dirtTexCoords.y = mod(floor(dirtTexCoords.y), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.y) : fract(dirtTexCoords.y); + } + result += dirtAmount * texture(dirtTexture, dirtTexCoords); + + // Rotating starburst texture's coordinate + // dot(czm_view[0].xyz, vec3(0.0, 0.0, 1.0)) + dot(czm_view[1].xyz, vec3(0.0, 1.0, 0.0)) + float camrot = czm_view[0].z + czm_view[1].y; + float cosValue = cos(camrot); + float sinValue = sin(camrot); + mat3 rotation = mat3( + cosValue, -sinValue, 0.0, + sinValue, cosValue, 0.0, + 0.0, 0.0, 1.0 + ); + + vec3 st1 = vec3(v_textureCoordinates * 2.0 - vec2(1.0), 1.0); + vec3 st2 = vec3((rotation * st1).xy, 1.0); + vec3 st3 = st2 * 0.5 + vec3(0.5); + vec2 lensStarTexcoord = st3.xy; + float weightForLensFlare = length(vec3(sunPos.xy, 0.0)); + float oneMinusWeightForLensFlare = max(1.0 - weightForLensFlare, 0.0); + + if (!isSpace) + { + result *= oneMinusWeightForLensFlare * intensity * 0.2; + } + else + { + result *= oneMinusWeightForLensFlare * intensity; + result *= texture(starTexture, lensStarTexcoord) * pow(weightForLensFlare, 1.0) * max((1.0 - length(vec3(st1.xy, 0.0))), 0.0) * 2.0; + } + + result += texture(colorTexture, v_textureCoordinates); + + out_FragColor = result; +} +`, ModifiedReinhardTonemapping = `uniform sampler2D colorTexture; +uniform vec3 white; + +in vec2 v_textureCoordinates; + +#ifdef AUTO_EXPOSURE +uniform sampler2D autoExposure; +#else +uniform float exposure; +#endif + +// See equation 4: +// http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf + +void main() +{ + vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); + vec3 color = fragmentColor.rgb; +#ifdef AUTO_EXPOSURE + float exposure = texture(autoExposure, vec2(0.5)).r; + color /= exposure; +#else + color *= vec3(exposure); +#endif + color = (color * (1.0 + color / white)) / (1.0 + color); + color = czm_inverseGamma(color); + out_FragColor = vec4(color, fragmentColor.a); +} +`, NightVision = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +float rand(vec2 co) +{ + return fract(sin(dot(co.xy ,vec2(12.9898, 78.233))) * 43758.5453); +} + +void main(void) +{ + float noiseValue = rand(v_textureCoordinates + sin(czm_frameNumber)) * 0.1; + vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; + vec3 green = vec3(0.0, 1.0, 0.0); + out_FragColor = vec4((noiseValue + rgb) * green, 1.0); +} +`, ReinhardTonemapping = `uniform sampler2D colorTexture; + +in vec2 v_textureCoordinates; + +#ifdef AUTO_EXPOSURE +uniform sampler2D autoExposure; +#else +uniform float exposure; +#endif + +// See equation 3: +// http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf + +void main() +{ + vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); + vec3 color = fragmentColor.rgb; +#ifdef AUTO_EXPOSURE + float exposure = texture(autoExposure, vec2(0.5)).r; + color /= exposure; +#else + color *= vec3(exposure); +#endif + color = color / (1.0 + color); + color = czm_inverseGamma(color); + out_FragColor = vec4(color, fragmentColor.a); +} +`, Silhouette = `uniform sampler2D colorTexture; +uniform sampler2D silhouetteTexture; + +in vec2 v_textureCoordinates; + +void main(void) +{ + vec4 silhouetteColor = texture(silhouetteTexture, v_textureCoordinates); + vec4 color = texture(colorTexture, v_textureCoordinates); + out_FragColor = mix(color, silhouetteColor, silhouetteColor.a); +} +`; +function AutoExposure() { + this._uniformMap = void 0, this._command = void 0, this._colorTexture = void 0, this._depthTexture = void 0, this._ready = !1, this._name = "czm_autoexposure", this._logDepthChanged = void 0, this._useLogDepth = void 0, this._framebuffers = void 0, this._previousLuminance = new FramebufferManager(), this._commands = void 0, this._clearCommand = void 0, this._minMaxLuminance = new Cartesian2(), this.enabled = !0, this._enabled = !0, this.minimumLuminance = 0.1, this.maximumLuminance = 10; +} +Object.defineProperties(AutoExposure.prototype, { + /** + * Determines if this post-process stage is ready to be executed. A stage is only executed when both <code>ready</code> + * and {@link AutoExposure#enabled} are <code>true</code>. A stage will not be ready while it is waiting on textures + * to load. + * + * @memberof AutoExposure.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * The unique name of this post-process stage for reference by other stages. + * + * @memberof AutoExposure.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * A reference to the texture written to when executing this post process stage. + * + * @memberof AutoExposure.prototype + * @type {Texture} + * @readonly + * @private + */ + outputTexture: { + get: function() { + const e = this._framebuffers; + if (defined(e)) + return e[e.length - 1].getColorTexture(0); + } + } +}); +function destroyFramebuffers(e) { + const t = e._framebuffers; + if (!defined(t)) + return; + const n = t.length; + for (let i = 0; i < n; ++i) + t[i].destroy(); + e._framebuffers = void 0, e._previousLuminance.destroy(), e._previousLuminance = void 0; +} +function createFramebuffers$1(e, t) { + destroyFramebuffers(e); + let n = e._width, i = e._height; + const r = t.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT, o = Math.ceil(Math.log(Math.max(n, i)) / Math.log(3)), s = new Array(o); + for (let l = 0; l < o; ++l) + n = Math.max(Math.ceil(n / 3), 1), i = Math.max(Math.ceil(i / 3), 1), s[l] = new FramebufferManager(), s[l].update(t, n, i, 1, r); + const c = s[o - 1].getColorTexture(0); + e._previousLuminance.update( + t, + c.width, + c.height, + 1, + r + ), e._framebuffers = s; +} +function destroyCommands(e) { + const t = e._commands; + if (!defined(t)) + return; + const n = t.length; + for (let i = 0; i < n; ++i) + t[i].shaderProgram.destroy(); + e._commands = void 0; +} +function createUniformMap$2(e, t) { + let n; + if (t === 0) + n = { + colorTexture: function() { + return e._colorTexture; + }, + colorTextureDimensions: function() { + return e._colorTexture.dimensions; + } + }; + else { + const i = e._framebuffers[t - 1].getColorTexture(0); + n = { + colorTexture: function() { + return i; + }, + colorTextureDimensions: function() { + return i.dimensions; + } + }; + } + return n.minMaxLuminance = function() { + return e._minMaxLuminance; + }, n.previousLuminance = function() { + return e._previousLuminance.getColorTexture(0); + }, n; +} +function getShaderSource(e, t) { + let n = `uniform sampler2D colorTexture; +in vec2 v_textureCoordinates; +float sampleTexture(vec2 offset) { +`; + return e === 0 ? n += ` vec4 color = texture(colorTexture, v_textureCoordinates + offset); + return czm_luminance(color.rgb); +` : n += ` return texture(colorTexture, v_textureCoordinates + offset).r; +`, n += `} + +`, n += `uniform vec2 colorTextureDimensions; +uniform vec2 minMaxLuminance; +uniform sampler2D previousLuminance; +void main() { + float color = 0.0; + float xStep = 1.0 / colorTextureDimensions.x; + float yStep = 1.0 / colorTextureDimensions.y; + int count = 0; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + vec2 offset; + offset.x = -xStep + float(i) * xStep; + offset.y = -yStep + float(j) * yStep; + if (offset.x < 0.0 || offset.x > 1.0 || offset.y < 0.0 || offset.y > 1.0) { + continue; + } + color += sampleTexture(offset); + ++count; + } + } + if (count > 0) { + color /= float(count); + } +`, e === t - 1 && (n += ` float previous = texture(previousLuminance, vec2(0.5)).r; + color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); + color = previous + (color - previous) / (60.0 * 1.5); + color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); +`), n += ` out_FragColor = vec4(color); +} +`, n; +} +function createCommands(e, t) { + destroyCommands(e); + const n = e._framebuffers, i = n.length, r = new Array(i); + for (let o = 0; o < i; ++o) + r[o] = t.createViewportQuadCommand( + getShaderSource(o, i), + { + framebuffer: n[o].framebuffer, + uniformMap: createUniformMap$2(e, o) + } + ); + e._commands = r; +} +AutoExposure.prototype.clear = function(e) { + const t = this._framebuffers; + if (!defined(t)) + return; + let n = this._clearCommand; + defined(n) || (n = this._clearCommand = new ClearCommand({ + color: new Color(0, 0, 0, 0), + framebuffer: void 0 + })); + const i = t.length; + for (let r = 0; r < i; ++r) + t[r].clear(e, n); +}; +AutoExposure.prototype.update = function(e) { + const t = e.drawingBufferWidth, n = e.drawingBufferHeight; + (t !== this._width || n !== this._height) && (this._width = t, this._height = n, createFramebuffers$1(this, e), createCommands(this, e), this._ready || (this._ready = !0)), this._minMaxLuminance.x = this.minimumLuminance, this._minMaxLuminance.y = this.maximumLuminance; + const i = this._framebuffers, r = i[i.length - 1]; + i[i.length - 1] = this._previousLuminance, this._commands[this._commands.length - 1].framebuffer = this._previousLuminance.framebuffer, this._previousLuminance = r; +}; +AutoExposure.prototype.execute = function(e, t) { + this._colorTexture = t; + const n = this._commands; + if (!defined(n)) + return; + const i = n.length; + for (let r = 0; r < i; ++r) + n[r].execute(e); +}; +AutoExposure.prototype.isDestroyed = function() { + return !1; +}; +AutoExposure.prototype.destroy = function() { + return destroyFramebuffers(this), destroyCommands(this), destroyObject(this); +}; +const PostProcessStageSampleMode = { + /** + * Samples the texture by returning the closest texel. + * + * @type {number} + * @constant + */ + NEAREST: 0, + /** + * Samples the texture through bi-linear interpolation of the four nearest texels. + * + * @type {number} + * @constant + */ + LINEAR: 1 +}; +function PostProcessStage(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.fragmentShader, n = defaultValue(e.textureScale, 1), i = defaultValue(e.pixelFormat, PixelFormat$1.RGBA); + this._fragmentShader = t, this._uniforms = e.uniforms, this._textureScale = n, this._forcePowerOfTwo = defaultValue(e.forcePowerOfTwo, !1), this._sampleMode = defaultValue( + e.sampleMode, + PostProcessStageSampleMode.NEAREST + ), this._pixelFormat = i, this._pixelDatatype = defaultValue( + e.pixelDatatype, + PixelDatatype$1.UNSIGNED_BYTE + ), this._clearColor = defaultValue(e.clearColor, Color.BLACK), this._uniformMap = void 0, this._command = void 0, this._colorTexture = void 0, this._depthTexture = void 0, this._idTexture = void 0, this._actualUniforms = {}, this._dirtyUniforms = [], this._texturesToRelease = [], this._texturesToCreate = [], this._texturePromise = void 0; + const r = new PassState(); + r.scissorTest = { + enabled: !0, + rectangle: defined(e.scissorRectangle) ? BoundingRectangle.clone(e.scissorRectangle) : new BoundingRectangle() + }, this._passState = r, this._ready = !1; + let o = e.name; + defined(o) || (o = createGuid()), this._name = o, this._logDepthChanged = void 0, this._useLogDepth = void 0, this._selectedIdTexture = void 0, this._selected = void 0, this._selectedShadow = void 0, this._parentSelected = void 0, this._parentSelectedShadow = void 0, this._combinedSelected = void 0, this._combinedSelectedShadow = void 0, this._selectedLength = 0, this._parentSelectedLength = 0, this._selectedDirty = !0, this._textureCache = void 0, this._index = void 0, this.enabled = !0, this._enabled = !0; +} +Object.defineProperties(PostProcessStage.prototype, { + /** + * Determines if this post-process stage is ready to be executed. A stage is only executed when both <code>ready</code> + * and {@link PostProcessStage#enabled} are <code>true</code>. A stage will not be ready while it is waiting on textures + * to load. + * + * @memberof PostProcessStage.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * The unique name of this post-process stage for reference by other stages in a {@link PostProcessStageComposite}. + * + * @memberof PostProcessStage.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * The fragment shader to use when execute this post-process stage. + * <p> + * The shader must contain a sampler uniform declaration for <code>colorTexture</code>, <code>depthTexture</code>, + * or both. + * </p> + * <p> + * The shader must contain a <code>vec2</code> varying declaration for <code>v_textureCoordinates</code> for sampling + * the texture uniforms. + * </p> + * + * @memberof PostProcessStage.prototype + * @type {string} + * @readonly + */ + fragmentShader: { + get: function() { + return this._fragmentShader; + } + }, + /** + * An object whose properties are used to set the uniforms of the fragment shader. + * <p> + * The object property values can be either a constant or a function. The function will be called + * each frame before the post-process stage is executed. + * </p> + * <p> + * A constant value can also be a URI to an image, a data URI, or an HTML element that can be used as a texture, such as HTMLImageElement or HTMLCanvasElement. + * </p> + * <p> + * If this post-process stage is part of a {@link PostProcessStageComposite} that does not execute in series, the constant value can also be + * the name of another stage in a composite. This will set the uniform to the output texture the stage with that name. + * </p> + * + * @memberof PostProcessStage.prototype + * @type {object} + * @readonly + */ + uniforms: { + get: function() { + return this._uniforms; + } + }, + /** + * A number in the range (0.0, 1.0] used to scale the output texture dimensions. A scale of 1.0 will render this post-process stage to a texture the size of the viewport. + * + * @memberof PostProcessStage.prototype + * @type {number} + * @readonly + */ + textureScale: { + get: function() { + return this._textureScale; + } + }, + /** + * Whether or not to force the output texture dimensions to be both equal powers of two. The power of two will be the next power of two of the minimum of the dimensions. + * + * @memberof PostProcessStage.prototype + * @type {number} + * @readonly + */ + forcePowerOfTwo: { + get: function() { + return this._forcePowerOfTwo; + } + }, + /** + * How to sample the input color texture. + * + * @memberof PostProcessStage.prototype + * @type {PostProcessStageSampleMode} + * @readonly + */ + sampleMode: { + get: function() { + return this._sampleMode; + } + }, + /** + * The color pixel format of the output texture. + * + * @memberof PostProcessStage.prototype + * @type {PixelFormat} + * @readonly + */ + pixelFormat: { + get: function() { + return this._pixelFormat; + } + }, + /** + * The pixel data type of the output texture. + * + * @memberof PostProcessStage.prototype + * @type {PixelDatatype} + * @readonly + */ + pixelDatatype: { + get: function() { + return this._pixelDatatype; + } + }, + /** + * The color to clear the output texture to. + * + * @memberof PostProcessStage.prototype + * @type {Color} + * @readonly + */ + clearColor: { + get: function() { + return this._clearColor; + } + }, + /** + * The {@link BoundingRectangle} to use for the scissor test. A default bounding rectangle will disable the scissor test. + * + * @memberof PostProcessStage.prototype + * @type {BoundingRectangle} + * @readonly + */ + scissorRectangle: { + get: function() { + return this._passState.scissorTest.rectangle; + } + }, + /** + * A reference to the texture written to when executing this post process stage. + * + * @memberof PostProcessStage.prototype + * @type {Texture} + * @readonly + * @private + */ + outputTexture: { + get: function() { + if (defined(this._textureCache)) { + const e = this._textureCache.getFramebuffer(this._name); + if (defined(e)) + return e.getColorTexture(0); + } + } + }, + /** + * The features selected for applying the post-process. + * <p> + * In the fragment shader, use <code>czm_selected</code> to determine whether or not to apply the post-process + * stage to that fragment. For example: + * <code> + * if (czm_selected(v_textureCoordinates)) { + * // apply post-process stage + * } else { + * out_FragColor = texture(colorTexture, v_textureCoordinates); + * } + * </code> + * </p> + * + * @memberof PostProcessStage.prototype + * @type {Array} + */ + selected: { + get: function() { + return this._selected; + }, + set: function(e) { + this._selected = e; + } + }, + /** + * @private + */ + parentSelected: { + get: function() { + return this._parentSelected; + }, + set: function(e) { + this._parentSelected = e; + } + } +}); +const depthTextureRegex = /uniform\s+sampler2D\s+depthTexture/g; +PostProcessStage.prototype._isSupported = function(e) { + return !depthTextureRegex.test(this._fragmentShader) || e.depthTexture; +}; +function getUniformValueGetterAndSetter(e, t, n) { + const i = t[n]; + return (typeof i == "string" || i instanceof HTMLCanvasElement || i instanceof HTMLImageElement || i instanceof HTMLVideoElement || i instanceof ImageData) && e._dirtyUniforms.push(n), { + get: function() { + return t[n]; + }, + set: function(r) { + const o = t[n]; + t[n] = r; + const s = e._actualUniforms, c = s[n]; + defined(c) && c !== o && c instanceof Texture && !defined(e._textureCache.getStageByName(n)) && (e._texturesToRelease.push(c), delete s[n], delete s[`${n}Dimensions`]), o instanceof Texture && e._texturesToRelease.push(o), typeof r == "string" || r instanceof HTMLCanvasElement || r instanceof HTMLImageElement || r instanceof HTMLVideoElement || r instanceof ImageData ? e._dirtyUniforms.push(n) : s[n] = r; + } + }; +} +function getUniformMapFunction(e, t) { + return function() { + const n = e._actualUniforms[t]; + return typeof n == "function" ? n() : n; + }; +} +function getUniformMapDimensionsFunction(e, t) { + return function() { + const n = e[t](); + if (defined(n)) + return n.dimensions; + }; +} +function createUniformMap$1(e) { + if (defined(e._uniformMap)) + return; + const t = {}, n = {}, i = e._uniforms, r = e._actualUniforms; + for (const o in i) + if (i.hasOwnProperty(o)) { + typeof i[o] != "function" ? (t[o] = getUniformMapFunction(e, o), n[o] = getUniformValueGetterAndSetter( + e, + i, + o + )) : (t[o] = i[o], n[o] = i[o]), r[o] = i[o]; + const s = t[o](); + (typeof s == "string" || s instanceof Texture || s instanceof HTMLImageElement || s instanceof HTMLCanvasElement || s instanceof HTMLVideoElement) && (t[`${o}Dimensions`] = getUniformMapDimensionsFunction( + t, + o + )); + } + e._uniforms = {}, Object.defineProperties(e._uniforms, n), e._uniformMap = combine$2(t, { + colorTexture: function() { + return e._colorTexture; + }, + colorTextureDimensions: function() { + return e._colorTexture.dimensions; + }, + depthTexture: function() { + return e._depthTexture; + }, + depthTextureDimensions: function() { + return e._depthTexture.dimensions; + }, + czm_idTexture: function() { + return e._idTexture; + }, + czm_selectedIdTexture: function() { + return e._selectedIdTexture; + }, + czm_selectedIdTextureStep: function() { + return 1 / e._selectedIdTexture.width; + } + }); +} +function createDrawCommand(e, t) { + if (defined(e._command) && !e._logDepthChanged && !e._selectedDirty) + return; + let n = e._fragmentShader; + if (defined(e._selectedIdTexture)) { + const r = e._selectedIdTexture.width; + n = n.replace(/in\s+vec2\s+v_textureCoordinates;/g, ""), n = `#define CZM_SELECTED_FEATURE +uniform sampler2D czm_idTexture; +uniform sampler2D czm_selectedIdTexture; +uniform float czm_selectedIdTextureStep; +in vec2 v_textureCoordinates; +bool czm_selected(vec2 offset) +{ + bool selected = false; + vec4 id = texture(czm_idTexture, v_textureCoordinates + offset); + for (int i = 0; i < ${r}; ++i) + { + vec4 selectedId = texture(czm_selectedIdTexture, vec2((float(i) + 0.5) * czm_selectedIdTextureStep, 0.5)); + if (all(equal(id, selectedId))) + { + return true; + } + } + return false; +} + +bool czm_selected() +{ + return czm_selected(vec2(0.0)); +} + +${n}`; + } + const i = new ShaderSource({ + defines: [e._useLogDepth ? "LOG_DEPTH" : ""], + sources: [n] + }); + e._command = t.createViewportQuadCommand(i, { + uniformMap: e._uniformMap, + owner: e + }); +} +function createSampler(e) { + const t = e._sampleMode; + let n, i; + t === PostProcessStageSampleMode.LINEAR ? (n = TextureMinificationFilter$1.LINEAR, i = TextureMagnificationFilter$1.LINEAR) : (n = TextureMinificationFilter$1.NEAREST, i = TextureMagnificationFilter$1.NEAREST); + const r = e._sampler; + (!defined(r) || r.minificationFilter !== n || r.magnificationFilter !== i) && (e._sampler = new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: n, + magnificationFilter: i + })); +} +function createLoadImageFunction(e, t) { + return function(n) { + e._texturesToCreate.push({ + name: t, + source: n + }); + }; +} +function createStageOutputTextureFunction(e, t) { + return function() { + return e._textureCache.getOutputTexture(t); + }; +} +function updateUniformTextures(e, t) { + let n, i, r; + const o = e._texturesToRelease; + let s = o.length; + for (n = 0; n < s; ++n) + i = o[n], i = i && i.destroy(); + o.length = 0; + const c = e._texturesToCreate; + for (s = c.length, n = 0; n < s; ++n) { + const h = c[n]; + r = h.name; + const p = h.source; + e._actualUniforms[r] = new Texture({ + context: t, + source: p + }); + } + c.length = 0; + const l = e._dirtyUniforms; + if (l.length === 0 && !defined(e._texturePromise)) { + e._ready = !0; + return; + } + if (l.length === 0 || defined(e._texturePromise)) + return; + s = l.length; + const d = e._uniforms, f = []; + for (n = 0; n < s; ++n) { + r = l[n]; + const h = d[r], p = e._textureCache.getStageByName( + h + ); + if (defined(p)) + e._actualUniforms[r] = createStageOutputTextureFunction( + e, + h + ); + else if (typeof h == "string") { + const m = new Resource({ + url: h + }); + f.push( + m.fetchImage().then(createLoadImageFunction(e, r)) + ); + } else + e._texturesToCreate.push({ + name: r, + source: h + }); + } + l.length = 0, f.length > 0 ? (e._ready = !1, e._texturePromise = Promise.all(f).then(function() { + e._ready = !0, e._texturePromise = void 0; + })) : e._ready = !0; +} +function releaseResources$1(e) { + defined(e._command) && (e._command.shaderProgram = e._command.shaderProgram && e._command.shaderProgram.destroy(), e._command = void 0), e._selectedIdTexture = e._selectedIdTexture && e._selectedIdTexture.destroy(); + const t = e._textureCache; + if (!defined(t)) + return; + const n = e._uniforms, i = e._actualUniforms; + for (const r in i) + i.hasOwnProperty(r) && i[r] instanceof Texture && (defined(t.getStageByName(n[r])) || i[r].destroy(), e._dirtyUniforms.push(r)); +} +function isSelectedTextureDirty$1(e) { + let t = defined(e._selected) ? e._selected.length : 0; + const n = defined(e._parentSelected) ? e._parentSelected : 0; + let i = e._selected !== e._selectedShadow || t !== e._selectedLength; + if (i = i || e._parentSelected !== e._parentSelectedShadow || n !== e._parentSelectedLength, defined(e._selected) && defined(e._parentSelected) ? e._combinedSelected = e._selected.concat(e._parentSelected) : defined(e._parentSelected) ? e._combinedSelected = e._parentSelected : e._combinedSelected = e._selected, !i && defined(e._combinedSelected)) { + if (!defined(e._combinedSelectedShadow)) + return !0; + t = e._combinedSelected.length; + for (let r = 0; r < t; ++r) + if (e._combinedSelected[r] !== e._combinedSelectedShadow[r]) + return !0; + } + return i; +} +function createSelectedTexture(e, t) { + if (!e._selectedDirty) + return; + e._selectedIdTexture = e._selectedIdTexture && e._selectedIdTexture.destroy(), e._selectedIdTexture = void 0; + const n = e._combinedSelected; + if (!defined(n)) + return; + let i, r, o = 0; + const s = n.length; + for (i = 0; i < s; ++i) + r = n[i], defined(r.pickIds) ? o += r.pickIds.length : defined(r.pickId) && ++o; + if (s === 0 || o === 0) { + const f = new Uint8Array(4); + f[0] = 255, f[1] = 255, f[2] = 255, f[3] = 255, e._selectedIdTexture = new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + arrayBufferView: f, + width: 1, + height: 1 + }, + sampler: Sampler.NEAREST + }); + return; + } + let c, l = 0; + const d = new Uint8Array(o * 4); + for (i = 0; i < s; ++i) + if (r = n[i], defined(r.pickIds)) { + const f = r.pickIds, h = f.length; + for (let p = 0; p < h; ++p) + c = f[p].color, d[l] = Color.floatToByte(c.red), d[l + 1] = Color.floatToByte(c.green), d[l + 2] = Color.floatToByte(c.blue), d[l + 3] = Color.floatToByte(c.alpha), l += 4; + } else defined(r.pickId) && (c = r.pickId.color, d[l] = Color.floatToByte(c.red), d[l + 1] = Color.floatToByte(c.green), d[l + 2] = Color.floatToByte(c.blue), d[l + 3] = Color.floatToByte(c.alpha), l += 4); + e._selectedIdTexture = new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + arrayBufferView: d, + width: o, + height: 1 + }, + sampler: Sampler.NEAREST + }); +} +PostProcessStage.prototype.update = function(e, t) { + if (this.enabled !== this._enabled && !this.enabled && releaseResources$1(this), this._enabled = this.enabled, !this._enabled || (this._logDepthChanged = t !== this._useLogDepth, this._useLogDepth = t, this._selectedDirty = isSelectedTextureDirty$1(this), this._selectedShadow = this._selected, this._parentSelectedShadow = this._parentSelected, this._combinedSelectedShadow = this._combinedSelected, this._selectedLength = defined(this._selected) ? this._selected.length : 0, this._parentSelectedLength = defined(this._parentSelected) ? this._parentSelected.length : 0, createSelectedTexture(this, e), createUniformMap$1(this), updateUniformTextures(this, e), createDrawCommand(this, e), createSampler(this), this._selectedDirty = !1, !this._ready)) + return; + const n = this._textureCache.getFramebuffer(this._name); + if (this._command.framebuffer = n, !defined(n)) + return; + const i = n.getColorTexture(0); + let r; + (i.width !== e.drawingBufferWidth || i.height !== e.drawingBufferHeight) && (r = this._renderState, (!defined(r) || i.width !== r.viewport.width || i.height !== r.viewport.height) && (this._renderState = RenderState.fromCache({ + viewport: new BoundingRectangle( + 0, + 0, + i.width, + i.height + ) + }))), this._command.renderState = r; +}; +PostProcessStage.prototype.execute = function(e, t, n, i) { + if (!defined(this._command) || !defined(this._command.framebuffer) || !this._ready || !this._enabled) + return; + this._colorTexture = t, this._depthTexture = n, this._idTexture = i, Sampler.equals(this._colorTexture.sampler, this._sampler) || (this._colorTexture.sampler = this._sampler); + const r = this.scissorRectangle.width > 0 && this.scissorRectangle.height > 0 ? this._passState : void 0; + defined(r) && (r.context = e), this._command.execute(e, r); +}; +PostProcessStage.prototype.isDestroyed = function() { + return !1; +}; +PostProcessStage.prototype.destroy = function() { + return releaseResources$1(this), destroyObject(this); +}; +function PostProcessStageComposite(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._stages = e.stages, this._inputPreviousStageTexture = defaultValue( + e.inputPreviousStageTexture, + !0 + ); + let t = e.name; + defined(t) || (t = createGuid()), this._name = t, this._uniforms = e.uniforms, this._textureCache = void 0, this._index = void 0, this._selected = void 0, this._selectedShadow = void 0, this._parentSelected = void 0, this._parentSelectedShadow = void 0, this._combinedSelected = void 0, this._combinedSelectedShadow = void 0, this._selectedLength = 0, this._parentSelectedLength = 0, this._selectedDirty = !0; +} +Object.defineProperties(PostProcessStageComposite.prototype, { + /** + * Determines if this post-process stage is ready to be executed. + * + * @memberof PostProcessStageComposite.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + const e = this._stages, t = e.length; + for (let n = 0; n < t; ++n) + if (!e[n].ready) + return !1; + return !0; + } + }, + /** + * The unique name of this post-process stage for reference by other stages in a PostProcessStageComposite. + * + * @memberof PostProcessStageComposite.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * Whether or not to execute this post-process stage when ready. + * + * @memberof PostProcessStageComposite.prototype + * @type {boolean} + */ + enabled: { + get: function() { + return this._stages[0].enabled; + }, + set: function(e) { + const t = this._stages, n = t.length; + for (let i = 0; i < n; ++i) + t[i].enabled = e; + } + }, + /** + * An alias to the uniform values of the post-process stages. May be <code>undefined</code>; in which case, get each stage to set uniform values. + * @memberof PostProcessStageComposite.prototype + * @type {object} + */ + uniforms: { + get: function() { + return this._uniforms; + } + }, + /** + * All post-process stages are executed in the order of the array. The input texture changes based on the value of <code>inputPreviousStageTexture</code>. + * If <code>inputPreviousStageTexture</code> is <code>true</code>, the input to each stage is the output texture rendered to by the scene or of the stage that executed before it. + * If <code>inputPreviousStageTexture</code> is <code>false</code>, the input texture is the same for each stage in the composite. The input texture is the texture rendered to by the scene + * or the output texture of the previous stage. + * + * @memberof PostProcessStageComposite.prototype + * @type {boolean} + * @readonly + */ + inputPreviousStageTexture: { + get: function() { + return this._inputPreviousStageTexture; + } + }, + /** + * The number of post-process stages in this composite. + * + * @memberof PostProcessStageComposite.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._stages.length; + } + }, + /** + * The features selected for applying the post-process. + * + * @memberof PostProcessStageComposite.prototype + * @type {Array} + */ + selected: { + get: function() { + return this._selected; + }, + set: function(e) { + this._selected = e; + } + }, + /** + * @private + */ + parentSelected: { + get: function() { + return this._parentSelected; + }, + set: function(e) { + this._parentSelected = e; + } + } +}); +PostProcessStageComposite.prototype._isSupported = function(e) { + const t = this._stages, n = t.length; + for (let i = 0; i < n; ++i) + if (!t[i]._isSupported(e)) + return !1; + return !0; +}; +PostProcessStageComposite.prototype.get = function(e) { + return this._stages[e]; +}; +function isSelectedTextureDirty(e) { + let t = defined(e._selected) ? e._selected.length : 0; + const n = defined(e._parentSelected) ? e._parentSelected : 0; + let i = e._selected !== e._selectedShadow || t !== e._selectedLength; + if (i = i || e._parentSelected !== e._parentSelectedShadow || n !== e._parentSelectedLength, defined(e._selected) && defined(e._parentSelected) ? e._combinedSelected = e._selected.concat(e._parentSelected) : defined(e._parentSelected) ? e._combinedSelected = e._parentSelected : e._combinedSelected = e._selected, !i && defined(e._combinedSelected)) { + if (!defined(e._combinedSelectedShadow)) + return !0; + t = e._combinedSelected.length; + for (let r = 0; r < t; ++r) + if (e._combinedSelected[r] !== e._combinedSelectedShadow[r]) + return !0; + } + return i; +} +PostProcessStageComposite.prototype.update = function(e, t) { + this._selectedDirty = isSelectedTextureDirty(this), this._selectedShadow = this._selected, this._parentSelectedShadow = this._parentSelected, this._combinedSelectedShadow = this._combinedSelected, this._selectedLength = defined(this._selected) ? this._selected.length : 0, this._parentSelectedLength = defined(this._parentSelected) ? this._parentSelected.length : 0; + const n = this._stages, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + this._selectedDirty && (o.parentSelected = this._combinedSelected), o.update(e, t); + } +}; +PostProcessStageComposite.prototype.isDestroyed = function() { + return !1; +}; +PostProcessStageComposite.prototype.destroy = function() { + const e = this._stages, t = e.length; + for (let n = 0; n < t; ++n) + e[n].destroy(); + return destroyObject(this); +}; +const PostProcessStageLibrary = {}; +function createBlur(e) { + const r = `#define USE_STEP_SIZE +${GaussianBlur1D}`, o = new PostProcessStage({ + name: `${e}_x_direction`, + fragmentShader: r, + uniforms: { + delta: 1, + sigma: 2, + stepSize: 1, + direction: 0 + }, + sampleMode: PostProcessStageSampleMode.LINEAR + }), s = new PostProcessStage({ + name: `${e}_y_direction`, + fragmentShader: r, + uniforms: { + delta: 1, + sigma: 2, + stepSize: 1, + direction: 1 + }, + sampleMode: PostProcessStageSampleMode.LINEAR + }), c = {}; + return Object.defineProperties(c, { + delta: { + get: function() { + return o.uniforms.delta; + }, + set: function(l) { + const d = o.uniforms, f = s.uniforms; + d.delta = f.delta = l; + } + }, + sigma: { + get: function() { + return o.uniforms.sigma; + }, + set: function(l) { + const d = o.uniforms, f = s.uniforms; + d.sigma = f.sigma = l; + } + }, + stepSize: { + get: function() { + return o.uniforms.stepSize; + }, + set: function(l) { + const d = o.uniforms, f = s.uniforms; + d.stepSize = f.stepSize = l; + } + } + }), new PostProcessStageComposite({ + name: e, + stages: [o, s], + uniforms: c + }); +} +PostProcessStageLibrary.createBlurStage = function() { + return createBlur("czm_blur"); +}; +PostProcessStageLibrary.createDepthOfFieldStage = function() { + const e = createBlur("czm_depth_of_field_blur"), t = new PostProcessStage({ + name: "czm_depth_of_field_composite", + fragmentShader: DepthOfField, + uniforms: { + focalDistance: 5, + blurTexture: e.name + } + }), n = {}; + return Object.defineProperties(n, { + focalDistance: { + get: function() { + return t.uniforms.focalDistance; + }, + set: function(i) { + t.uniforms.focalDistance = i; + } + }, + delta: { + get: function() { + return e.uniforms.delta; + }, + set: function(i) { + e.uniforms.delta = i; + } + }, + sigma: { + get: function() { + return e.uniforms.sigma; + }, + set: function(i) { + e.uniforms.sigma = i; + } + }, + stepSize: { + get: function() { + return e.uniforms.stepSize; + }, + set: function(i) { + e.uniforms.stepSize = i; + } + } + }), new PostProcessStageComposite({ + name: "czm_depth_of_field", + stages: [e, t], + inputPreviousStageTexture: !1, + uniforms: n + }); +}; +PostProcessStageLibrary.isDepthOfFieldSupported = function(e) { + return e.context.depthTexture; +}; +PostProcessStageLibrary.createEdgeDetectionStage = function() { + const e = createGuid(); + return new PostProcessStage({ + name: `czm_edge_detection_${e}`, + fragmentShader: EdgeDetection, + uniforms: { + length: 0.25, + color: Color.clone(Color.BLACK) + } + }); +}; +PostProcessStageLibrary.isEdgeDetectionSupported = function(e) { + return e.context.depthTexture; +}; +function getSilhouetteEdgeDetection(e) { + if (!defined(e)) + return PostProcessStageLibrary.createEdgeDetectionStage(); + const t = new PostProcessStageComposite({ + name: "czm_edge_detection_multiple", + stages: e, + inputPreviousStageTexture: !1 + }), n = {}; + let i = "", r = ""; + for (let c = 0; c < e.length; ++c) + i += `uniform sampler2D edgeTexture${c}; +`, r += ` vec4 edge${c} = texture(edgeTexture${c}, v_textureCoordinates); + if (edge${c}.a > 0.0) + { + color = edge${c}; + break; + } +`, n[`edgeTexture${c}`] = e[c].name; + const o = `${i}in vec2 v_textureCoordinates; +void main() { + vec4 color = vec4(0.0); + for (int i = 0; i < ${e.length}; i++) + { +${r} } + out_FragColor = color; +} +`, s = new PostProcessStage({ + name: "czm_edge_detection_combine", + fragmentShader: o, + uniforms: n + }); + return new PostProcessStageComposite({ + name: "czm_edge_detection_composite", + stages: [t, s] + }); +} +PostProcessStageLibrary.createSilhouetteStage = function(e) { + const t = getSilhouetteEdgeDetection(e), n = new PostProcessStage({ + name: "czm_silhouette_color_edges", + fragmentShader: Silhouette, + uniforms: { + silhouetteTexture: t.name + } + }); + return new PostProcessStageComposite({ + name: "czm_silhouette", + stages: [t, n], + inputPreviousStageTexture: !1, + uniforms: t.uniforms + }); +}; +PostProcessStageLibrary.isSilhouetteSupported = function(e) { + return e.context.depthTexture; +}; +PostProcessStageLibrary.createBloomStage = function() { + const e = new PostProcessStage({ + name: "czm_bloom_contrast_bias", + fragmentShader: ContrastBias, + uniforms: { + contrast: 128, + brightness: -0.3 + } + }), t = createBlur("czm_bloom_blur"), n = new PostProcessStageComposite({ + name: "czm_bloom_contrast_bias_blur", + stages: [e, t] + }), i = new PostProcessStage({ + name: "czm_bloom_generate_composite", + fragmentShader: BloomComposite, + uniforms: { + glowOnly: !1, + bloomTexture: n.name + } + }), r = {}; + return Object.defineProperties(r, { + glowOnly: { + get: function() { + return i.uniforms.glowOnly; + }, + set: function(o) { + i.uniforms.glowOnly = o; + } + }, + contrast: { + get: function() { + return e.uniforms.contrast; + }, + set: function(o) { + e.uniforms.contrast = o; + } + }, + brightness: { + get: function() { + return e.uniforms.brightness; + }, + set: function(o) { + e.uniforms.brightness = o; + } + }, + delta: { + get: function() { + return t.uniforms.delta; + }, + set: function(o) { + t.uniforms.delta = o; + } + }, + sigma: { + get: function() { + return t.uniforms.sigma; + }, + set: function(o) { + t.uniforms.sigma = o; + } + }, + stepSize: { + get: function() { + return t.uniforms.stepSize; + }, + set: function(o) { + t.uniforms.stepSize = o; + } + } + }), new PostProcessStageComposite({ + name: "czm_bloom", + stages: [n, i], + inputPreviousStageTexture: !1, + uniforms: r + }); +}; +PostProcessStageLibrary.createAmbientOcclusionStage = function() { + const e = new PostProcessStage({ + name: "czm_ambient_occlusion_generate", + fragmentShader: AmbientOcclusionGenerate, + uniforms: { + intensity: 3, + bias: 0.1, + lengthCap: 0.26, + stepSize: 1.95, + frustumLength: 1e3, + randomTexture: void 0 + } + }), t = createBlur("czm_ambient_occlusion_blur"); + t.uniforms.stepSize = 0.86; + const n = new PostProcessStageComposite({ + name: "czm_ambient_occlusion_generate_blur", + stages: [e, t] + }), i = new PostProcessStage({ + name: "czm_ambient_occlusion_composite", + fragmentShader: AmbientOcclusionModulate, + uniforms: { + ambientOcclusionOnly: !1, + ambientOcclusionTexture: n.name + } + }), r = {}; + return Object.defineProperties(r, { + intensity: { + get: function() { + return e.uniforms.intensity; + }, + set: function(o) { + e.uniforms.intensity = o; + } + }, + bias: { + get: function() { + return e.uniforms.bias; + }, + set: function(o) { + e.uniforms.bias = o; + } + }, + lengthCap: { + get: function() { + return e.uniforms.lengthCap; + }, + set: function(o) { + e.uniforms.lengthCap = o; + } + }, + stepSize: { + get: function() { + return e.uniforms.stepSize; + }, + set: function(o) { + e.uniforms.stepSize = o; + } + }, + frustumLength: { + get: function() { + return e.uniforms.frustumLength; + }, + set: function(o) { + e.uniforms.frustumLength = o; + } + }, + randomTexture: { + get: function() { + return e.uniforms.randomTexture; + }, + set: function(o) { + e.uniforms.randomTexture = o; + } + }, + delta: { + get: function() { + return t.uniforms.delta; + }, + set: function(o) { + t.uniforms.delta = o; + } + }, + sigma: { + get: function() { + return t.uniforms.sigma; + }, + set: function(o) { + t.uniforms.sigma = o; + } + }, + blurStepSize: { + get: function() { + return t.uniforms.stepSize; + }, + set: function(o) { + t.uniforms.stepSize = o; + } + }, + ambientOcclusionOnly: { + get: function() { + return i.uniforms.ambientOcclusionOnly; + }, + set: function(o) { + i.uniforms.ambientOcclusionOnly = o; + } + } + }), new PostProcessStageComposite({ + name: "czm_ambient_occlusion", + stages: [n, i], + inputPreviousStageTexture: !1, + uniforms: r + }); +}; +PostProcessStageLibrary.isAmbientOcclusionSupported = function(e) { + return e.context.depthTexture; +}; +const fxaaFS = `#define FXAA_QUALITY_PRESET 39 +${FXAA3_11} +${FXAA}`; +PostProcessStageLibrary.createFXAAStage = function() { + return new PostProcessStage({ + name: "czm_FXAA", + fragmentShader: fxaaFS, + sampleMode: PostProcessStageSampleMode.LINEAR + }); +}; +PostProcessStageLibrary.createAcesTonemappingStage = function(e) { + let t = e ? `#define AUTO_EXPOSURE +` : ""; + return t += AcesTonemapping, new PostProcessStage({ + name: "czm_aces", + fragmentShader: t, + uniforms: { + autoExposure: void 0, + exposure: 1 + } + }); +}; +PostProcessStageLibrary.createFilmicTonemappingStage = function(e) { + let t = e ? `#define AUTO_EXPOSURE +` : ""; + return t += FilmicTonemapping, new PostProcessStage({ + name: "czm_filmic", + fragmentShader: t, + uniforms: { + autoExposure: void 0, + exposure: 1 + } + }); +}; +PostProcessStageLibrary.createPbrNeutralTonemappingStage = function(e) { + let t = e ? `#define AUTO_EXPOSURE +` : ""; + return t += PbrNeutralTonemapping, new PostProcessStage({ + name: "czm_pbr_neutral", + fragmentShader: t, + uniforms: { + autoExposure: void 0, + exposure: 1 + } + }); +}; +PostProcessStageLibrary.createReinhardTonemappingStage = function(e) { + let t = e ? `#define AUTO_EXPOSURE +` : ""; + return t += ReinhardTonemapping, new PostProcessStage({ + name: "czm_reinhard", + fragmentShader: t, + uniforms: { + autoExposure: void 0, + exposure: 1 + } + }); +}; +PostProcessStageLibrary.createModifiedReinhardTonemappingStage = function(e) { + let t = e ? `#define AUTO_EXPOSURE +` : ""; + return t += ModifiedReinhardTonemapping, new PostProcessStage({ + name: "czm_modified_reinhard", + fragmentShader: t, + uniforms: { + white: Color.WHITE, + autoExposure: void 0, + exposure: 1 + } + }); +}; +PostProcessStageLibrary.createAutoExposureStage = function() { + return new AutoExposure(); +}; +PostProcessStageLibrary.createBlackAndWhiteStage = function() { + return new PostProcessStage({ + name: "czm_black_and_white", + fragmentShader: BlackAndWhite, + uniforms: { + gradations: 5 + } + }); +}; +PostProcessStageLibrary.createBrightnessStage = function() { + return new PostProcessStage({ + name: "czm_brightness", + fragmentShader: Brightness, + uniforms: { + brightness: 0.5 + } + }); +}; +PostProcessStageLibrary.createNightVisionStage = function() { + return new PostProcessStage({ + name: "czm_night_vision", + fragmentShader: NightVision + }); +}; +PostProcessStageLibrary.createDepthViewStage = function() { + return new PostProcessStage({ + name: "czm_depth_view", + fragmentShader: DepthView + }); +}; +PostProcessStageLibrary.createLensFlareStage = function() { + return new PostProcessStage({ + name: "czm_lens_flare", + fragmentShader: LensFlare, + uniforms: { + dirtTexture: buildModuleUrl("Assets/Textures/LensFlare/DirtMask.jpg"), + starTexture: buildModuleUrl("Assets/Textures/LensFlare/StarBurst.jpg"), + intensity: 2, + distortion: 10, + ghostDispersal: 0.4, + haloWidth: 0.4, + dirtAmount: 0.4, + earthRadius: Ellipsoid.WGS84.maximumRadius + } + }); +}; +function PostProcessStageTextureCache(e) { + this._collection = e, this._framebuffers = [], this._stageNameToFramebuffer = {}, this._width = void 0, this._height = void 0, this._updateDependencies = !1; +} +function getLastStageName(e) { + for (; defined(e.length); ) + e = e.get(e.length - 1); + return e.name; +} +function getStageDependencies(e, t, n, i, r) { + if (!i.enabled || !i._isSupported(t)) + return r; + const o = n[i.name] = {}; + if (defined(r)) { + const c = e.getStageByName(r); + o[getLastStageName(c)] = !0; + } + const s = i.uniforms; + if (defined(s)) { + const c = Object.getOwnPropertyNames(s), l = c.length; + for (let d = 0; d < l; ++d) { + const f = s[c[d]]; + if (typeof f == "string") { + const h = e.getStageByName(f); + defined(h) && (o[getLastStageName(h)] = !0); + } + } + } + return i.name; +} +function getCompositeDependencies(e, t, n, i, r) { + if (defined(i.enabled) && !i.enabled || defined(i._isSupported) && !i._isSupported(t)) + return r; + const o = r, s = !defined(i.inputPreviousStageTexture) || i.inputPreviousStageTexture; + let c = r; + const l = i.length; + for (let h = 0; h < l; ++h) { + const p = i.get(h); + defined(p.length) ? c = getCompositeDependencies( + e, + t, + n, + p, + r + ) : c = getStageDependencies( + e, + t, + n, + p, + r + ), s && (r = c); + } + let d, f; + if (s) + for (d = 1; d < l; ++d) + f = getLastStageName(i.get(d)), defined(n[f]) || (n[f] = {}), n[f][o] = !0; + else + for (d = 1; d < l; ++d) { + f = getLastStageName(i.get(d)); + const h = n[f]; + for (let p = 0; p < d; ++p) + h[getLastStageName(i.get(p))] = !0; + } + return c; +} +function getDependencies(e, t) { + const n = {}; + if (defined(e.ambientOcclusion)) { + const i = e.ambientOcclusion, r = e.bloom, o = e._tonemapping, s = e.fxaa; + let c = getCompositeDependencies( + e, + t, + n, + i, + void 0 + ); + c = getCompositeDependencies( + e, + t, + n, + r, + c + ), c = getStageDependencies( + e, + t, + n, + o, + c + ), c = getCompositeDependencies( + e, + t, + n, + e, + c + ), getStageDependencies(e, t, n, s, c); + } else + getCompositeDependencies( + e, + t, + n, + e, + void 0 + ); + return n; +} +function getFramebuffer(e, t, n) { + const r = e._collection.getStageByName(t), o = r._textureScale, s = r._forcePowerOfTwo, c = r._pixelFormat, l = r._pixelDatatype, d = r._clearColor; + let f, h; + const p = e._framebuffers, m = p.length; + for (f = 0; f < m; ++f) { + if (h = p[f], o !== h.textureScale || s !== h.forcePowerOfTwo || c !== h.pixelFormat || l !== h.pixelDatatype || !Color.equals(d, h.clearColor)) + continue; + const _ = h.stages, y = _.length; + let C = !1; + for (let T = 0; T < y; ++T) + if (n[_[T]]) { + C = !0; + break; + } + if (!C) + break; + } + return defined(h) && f < m ? (h.stages.push(t), h) : (h = { + textureScale: o, + forcePowerOfTwo: s, + pixelFormat: c, + pixelDatatype: l, + clearColor: d, + stages: [t], + buffer: new FramebufferManager({ + pixelFormat: c, + pixelDatatype: l + }), + clear: void 0 + }, p.push(h), h); +} +function createFramebuffers(e, t) { + const n = getDependencies(e._collection, t); + for (const i in n) + n.hasOwnProperty(i) && (e._stageNameToFramebuffer[i] = getFramebuffer( + e, + i, + n[i] + )); +} +function releaseResources(e) { + const t = e._framebuffers, n = t.length; + for (let i = 0; i < n; ++i) + t[i].buffer.destroy(); +} +function updateFramebuffers(e, t) { + const n = e._width, i = e._height, r = e._framebuffers, o = r.length; + for (let s = 0; s < o; ++s) { + const c = r[s], l = c.textureScale; + let d = Math.ceil(n * l), f = Math.ceil(i * l), h = Math.min(d, f); + c.forcePowerOfTwo && (CesiumMath.isPowerOfTwo(h) || (h = CesiumMath.nextPowerOfTwo(h)), d = h, f = h), c.buffer.update(t, d, f), c.clear = new ClearCommand({ + color: c.clearColor, + framebuffer: c.buffer.framebuffer + }); + } +} +PostProcessStageTextureCache.prototype.updateDependencies = function() { + this._updateDependencies = !0; +}; +PostProcessStageTextureCache.prototype.update = function(e) { + const t = this._collection, n = this._updateDependencies, i = defined(t.ambientOcclusion) && t.ambientOcclusion.enabled && t.ambientOcclusion._isSupported(e), r = defined(t.bloom) && t.bloom.enabled && t.bloom._isSupported(e), o = defined(t._tonemapping) && t._tonemapping.enabled && t._tonemapping._isSupported(e), s = defined(t.fxaa) && t.fxaa.enabled && t.fxaa._isSupported(e), c = !defined(t._activeStages) || t._activeStages.length > 0 || i || r || o || s; + if ((n || !c && this._framebuffers.length > 0) && (releaseResources(this), this._framebuffers.length = 0, this._stageNameToFramebuffer = {}, this._width = void 0, this._height = void 0), !n && !c) + return; + this._framebuffers.length === 0 && createFramebuffers(this, e); + const l = e.drawingBufferWidth, d = e.drawingBufferHeight, f = this._width !== l || this._height !== d; + !n && !f || (this._width = l, this._height = d, this._updateDependencies = !1, releaseResources(this), updateFramebuffers(this, e)); +}; +PostProcessStageTextureCache.prototype.clear = function(e) { + const t = this._framebuffers; + for (let n = 0; n < t.length; ++n) + t[n].clear.execute(e); +}; +PostProcessStageTextureCache.prototype.getStageByName = function(e) { + return this._collection.getStageByName(e); +}; +PostProcessStageTextureCache.prototype.getOutputTexture = function(e) { + return this._collection.getOutputTexture(e); +}; +PostProcessStageTextureCache.prototype.getFramebuffer = function(e) { + const t = this._stageNameToFramebuffer[e]; + if (defined(t)) + return t.buffer.framebuffer; +}; +PostProcessStageTextureCache.prototype.isDestroyed = function() { + return !1; +}; +PostProcessStageTextureCache.prototype.destroy = function() { + return releaseResources(this), destroyObject(this); +}; +const Tonemapper = { + /** + * Use the Reinhard tonemapping. + * + * @type {string} + * @constant + */ + REINHARD: "REINHARD", + /** + * Use the modified Reinhard tonemapping. + * + * @type {string} + * @constant + */ + MODIFIED_REINHARD: "MODIFIED_REINHARD", + /** + * Use the Filmic tonemapping. + * + * @type {string} + * @constant + */ + FILMIC: "FILMIC", + /** + * Use the ACES tonemapping. + * + * @type {string} + * @constant + */ + ACES: "ACES", + /** + * Use the PBR Neutral tonemapping {@link https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral|from Khronos}. + * + * @type {string} + * @constant + */ + PBR_NEUTRAL: "PBR_NEUTRAL" +}, Tonemapper$1 = Object.freeze(Tonemapper), stackScratch = []; +function PostProcessStageCollection() { + const e = PostProcessStageLibrary.createFXAAStage(), t = PostProcessStageLibrary.createAmbientOcclusionStage(), n = PostProcessStageLibrary.createBloomStage(); + this._autoExposureEnabled = !1, this._autoExposure = PostProcessStageLibrary.createAutoExposureStage(), this._exposure = 1, this._tonemapping = void 0, this._tonemapper = void 0, this.tonemapper = Tonemapper$1.PBR_NEUTRAL; + const i = this._tonemapping; + e.enabled = !1, t.enabled = !1, n.enabled = !1, i.enabled = !1; + const r = new PostProcessStageTextureCache(this), o = {}, s = stackScratch; + for (s.push(e, t, n, i); s.length > 0; ) { + const l = s.pop(); + o[l.name] = l, l._textureCache = r; + const d = l.length; + if (defined(d)) + for (let f = 0; f < d; ++f) + s.push(l.get(f)); + } + this._stages = [], this._activeStages = [], this._previousActiveStages = [], this._randomTexture = void 0; + const c = this; + t.uniforms.randomTexture = function() { + return c._randomTexture; + }, this._ao = t, this._bloom = n, this._fxaa = e, this._aoEnabled = void 0, this._bloomEnabled = void 0, this._tonemappingEnabled = void 0, this._fxaaEnabled = void 0, this._activeStagesChanged = !1, this._stagesRemoved = !1, this._textureCacheDirty = !1, this._stageNames = o, this._textureCache = r; +} +Object.defineProperties(PostProcessStageCollection.prototype, { + /** + * Determines if all of the post-process stages in the collection are ready to be executed. + * + * @memberof PostProcessStageCollection.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + let e = !1; + const t = this._stages, n = t.length; + for (let c = n - 1; c >= 0; --c) { + const l = t[c]; + e = e || l.ready && l.enabled; + } + const i = this._fxaa, r = this._ao, o = this._bloom, s = this._tonemapping; + return e = e || i.ready && i.enabled, e = e || r.ready && r.enabled, e = e || o.ready && o.enabled, e = e || s.ready && s.enabled, e; + } + }, + /** + * A post-process stage for Fast Approximate Anti-aliasing. + * <p> + * When enabled, this stage will execute after all others. + * </p> + * + * @memberof PostProcessStageCollection.prototype + * @type {PostProcessStage} + * @readonly + */ + fxaa: { + get: function() { + return this._fxaa; + } + }, + /** + * A post-process stage that applies Horizon-based Ambient Occlusion (HBAO) to the input texture. + * <p> + * Ambient occlusion simulates shadows from ambient light. These shadows would always be present when the + * surface receives light and regardless of the light's position. + * </p> + * <p> + * The uniforms have the following properties: <code>intensity</code>, <code>bias</code>, <code>lengthCap</code>, + * <code>stepSize</code>, <code>frustumLength</code>, <code>ambientOcclusionOnly</code>, + * <code>delta</code>, <code>sigma</code>, and <code>blurStepSize</code>. + * </p> + * <ul> + * <li><code>intensity</code> is a scalar value used to lighten or darken the shadows exponentially. Higher values make the shadows darker. The default value is <code>3.0</code>.</li> + * + * <li><code>bias</code> is a scalar value representing an angle in radians. If the dot product between the normal of the sample and the vector to the camera is less than this value, + * sampling stops in the current direction. This is used to remove shadows from near planar edges. The default value is <code>0.1</code>.</li> + * + * <li><code>lengthCap</code> is a scalar value representing a length in meters. If the distance from the current sample to first sample is greater than this value, + * sampling stops in the current direction. The default value is <code>0.26</code>.</li> + * + * <li><code>stepSize</code> is a scalar value indicating the distance to the next texel sample in the current direction. The default value is <code>1.95</code>.</li> + * + * <li><code>frustumLength</code> is a scalar value in meters. If the current fragment has a distance from the camera greater than this value, ambient occlusion is not computed for the fragment. + * The default value is <code>1000.0</code>.</li> + * + * <li><code>ambientOcclusionOnly</code> is a boolean value. When <code>true</code>, only the shadows generated are written to the output. When <code>false</code>, the input texture is modulated + * with the ambient occlusion. This is a useful debug option for seeing the effects of changing the uniform values. The default value is <code>false</code>.</li> + * </ul> + * <p> + * <code>delta</code>, <code>sigma</code>, and <code>blurStepSize</code> are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the shadows generated from the image to make them smoother. + * </p> + * <p> + * When enabled, this stage will execute before all others. + * </p> + * + * @memberof PostProcessStageCollection.prototype + * @type {PostProcessStageComposite} + * @readonly + */ + ambientOcclusion: { + get: function() { + return this._ao; + } + }, + /** + * A post-process stage for a bloom effect. + * <p> + * A bloom effect adds glow effect, makes bright areas brighter, and dark areas darker. + * </p> + * <p> + * This stage has the following uniforms: <code>contrast</code>, <code>brightness</code>, <code>glowOnly</code>, + * <code>delta</code>, <code>sigma</code>, and <code>stepSize</code>. + * </p> + * <ul> + * <li><code>contrast</code> is a scalar value in the range [-255.0, 255.0] and affects the contract of the effect. The default value is <code>128.0</code>.</li> + * + * <li><code>brightness</code> is a scalar value. The input texture RGB value is converted to hue, saturation, and brightness (HSB) then this value is + * added to the brightness. The default value is <code>-0.3</code>.</li> + * + * <li><code>glowOnly</code> is a boolean value. When <code>true</code>, only the glow effect will be shown. When <code>false</code>, the glow will be added to the input texture. + * The default value is <code>false</code>. This is a debug option for viewing the effects when changing the other uniform values.</li> + * </ul> + * <p> + * <code>delta</code>, <code>sigma</code>, and <code>stepSize</code> are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the shadows generated from the image to make them smoother. + * </p> + * <p> + * When enabled, this stage will execute before all others. + * </p> + * + * @memberOf PostProcessStageCollection.prototype + * @type {PostProcessStageComposite} + * @readonly + */ + bloom: { + get: function() { + return this._bloom; + } + }, + /** + * The number of post-process stages in this collection. + * + * @memberof PostProcessStageCollection.prototype + * @type {number} + * @readonly + */ + length: { + get: function() { + return removeStages(this), this._stages.length; + } + }, + /** + * A reference to the last texture written to when executing the post-process stages in this collection. + * + * @memberof PostProcessStageCollection.prototype + * @type {Texture} + * @readonly + * @private + */ + outputTexture: { + get: function() { + const e = this._fxaa; + if (e.enabled && e.ready) + return this.getOutputTexture(e.name); + const t = this._stages, n = t.length; + for (let s = n - 1; s >= 0; --s) { + const c = t[s]; + if (defined(c) && c.ready && c.enabled) + return this.getOutputTexture(c.name); + } + const i = this._tonemapping; + if (i.enabled && i.ready) + return this.getOutputTexture(i.name); + const r = this._bloom; + if (r.enabled && r.ready) + return this.getOutputTexture(r.name); + const o = this._ao; + if (o.enabled && o.ready) + return this.getOutputTexture(o.name); + } + }, + /** + * Whether the collection has a stage that has selected features. + * + * @memberof PostProcessStageCollection.prototype + * @type {boolean} + * @readonly + * @private + */ + hasSelected: { + get: function() { + const e = this._stages.slice(); + for (; e.length > 0; ) { + const t = e.pop(); + if (!defined(t)) + continue; + if (defined(t.selected)) + return !0; + const n = t.length; + if (defined(n)) + for (let i = 0; i < n; ++i) + e.push(t.get(i)); + } + return !1; + } + }, + /** + * Specifies the tonemapping algorithm used when rendering with high dynamic range. + * {@link https://sandcastle.cesium.com/?src=High%20Dynamic%20Range.html|Sandcastle Demo} + * + * @example viewer.scene.postProcessStages.tonemapper = Cesium.Tonemapper.ACES; + * + * @default Tonemapper.PBR_NEUTRAL + * @memberof PostProcessStageCollection.prototype + * @type {Tonemapper} + */ + tonemapper: { + get: function() { + return this._tonemapper; + }, + set: function(e) { + if (this._tonemapper === e) + return; + defined(this._tonemapping) && (delete this._stageNames[this._tonemapping.name], this._tonemapping.destroy()); + const t = this._autoExposureEnabled; + let n; + switch (e) { + case Tonemapper$1.REINHARD: + n = PostProcessStageLibrary.createReinhardTonemappingStage( + t + ); + break; + case Tonemapper$1.MODIFIED_REINHARD: + n = PostProcessStageLibrary.createModifiedReinhardTonemappingStage( + t + ); + break; + case Tonemapper$1.FILMIC: + n = PostProcessStageLibrary.createFilmicTonemappingStage( + t + ); + break; + case Tonemapper$1.PBR_NEUTRAL: + n = PostProcessStageLibrary.createPbrNeutralTonemappingStage( + t + ); + break; + default: + n = PostProcessStageLibrary.createAcesTonemappingStage( + t + ); + break; + } + if (t) { + const i = this._autoExposure; + n.uniforms.autoExposure = function() { + return i.outputTexture; + }; + } else + n.uniforms.exposure = this._exposure; + this._tonemapper = e, this._tonemapping = n, defined(this._stageNames) && (this._stageNames[n.name] = n, n._textureCache = this._textureCache), this._textureCacheDirty = !0; + } + }, + /** + * Control the exposure when HDR is on. Less than 1.0 makes the tonemapping darker while greater than 1.0 makes it brighter. + * + * @example viewer.scene.postProcessStages.exposure = 1.0; + * + * @default 1.0 + * @memberof PostProcessStageCollection.prototype + * @type {number} + */ + exposure: { + get: function() { + return this._exposure; + }, + set: function(e) { + this._tonemapping.uniforms.exposure = e, this._exposure = e; + } + } +}); +function removeStages(e) { + if (!e._stagesRemoved) + return; + e._stagesRemoved = !1; + const t = [], n = e._stages, i = n.length; + for (let r = 0, o = 0; r < i; ++r) { + const s = n[r]; + s && (s._index = o++, t.push(s)); + } + e._stages = t; +} +PostProcessStageCollection.prototype.add = function(e) { + const t = this._stageNames, n = stackScratch; + for (n.push(e); n.length > 0; ) { + const r = n.pop(); + t[r.name] = r, r._textureCache = this._textureCache; + const o = r.length; + if (defined(o)) + for (let s = 0; s < o; ++s) + n.push(r.get(s)); + } + const i = this._stages; + return e._index = i.length, i.push(e), this._textureCacheDirty = !0, e; +}; +PostProcessStageCollection.prototype.remove = function(e) { + if (!this.contains(e)) + return !1; + const t = this._stageNames, n = stackScratch; + for (n.push(e); n.length > 0; ) { + const i = n.pop(); + delete t[i.name]; + const r = i.length; + if (defined(r)) + for (let o = 0; o < r; ++o) + n.push(i.get(o)); + } + return this._stages[e._index] = void 0, this._stagesRemoved = !0, this._textureCacheDirty = !0, e._index = void 0, e._textureCache = void 0, e.destroy(), !0; +}; +PostProcessStageCollection.prototype.contains = function(e) { + return defined(e) && defined(e._index) && e._textureCache === this._textureCache; +}; +PostProcessStageCollection.prototype.get = function(e) { + return removeStages(this), this._stages[e]; +}; +PostProcessStageCollection.prototype.removeAll = function() { + const e = this._stages, t = e.length; + for (let n = 0; n < t; ++n) + this.remove(e[n]); + e.length = 0; +}; +PostProcessStageCollection.prototype.getStageByName = function(e) { + return this._stageNames[e]; +}; +PostProcessStageCollection.prototype.update = function(e, t, n) { + removeStages(this); + const i = this._activeStages, r = this._activeStages = this._previousActiveStages; + this._previousActiveStages = i; + const o = this._stages; + let s = r.length = o.length, c, l, d = 0; + for (c = 0; c < s; ++c) + l = o[c], l.ready && l.enabled && l._isSupported(e) && (r[d++] = l); + r.length = d; + let f = d !== i.length; + if (!f) { + for (c = 0; c < d; ++c) + if (r[c] !== i[c]) { + f = !0; + break; + } + } + const h = this._ao, p = this._bloom, m = this._autoExposure, _ = this._tonemapping, y = this._fxaa; + _.enabled = n; + const C = h.enabled && h._isSupported(e), T = p.enabled && p._isSupported(e), x = _.enabled && _._isSupported(e), b = y.enabled && y._isSupported(e); + if ((f || this._textureCacheDirty || C !== this._aoEnabled || T !== this._bloomEnabled || x !== this._tonemappingEnabled || b !== this._fxaaEnabled) && (this._textureCache.updateDependencies(), this._aoEnabled = C, this._bloomEnabled = T, this._tonemappingEnabled = x, this._fxaaEnabled = b, this._textureCacheDirty = !1), defined(this._randomTexture) && !C && (this._randomTexture.destroy(), this._randomTexture = void 0), !defined(this._randomTexture) && C) { + s = 256 * 256 * 3; + const S = new Uint8Array(s); + for (c = 0; c < s; c += 3) + S[c] = Math.floor(Math.random() * 255); + this._randomTexture = new Texture({ + context: e, + pixelFormat: PixelFormat$1.RGB, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + arrayBufferView: S, + width: 256, + height: 256 + }, + sampler: new Sampler({ + wrapS: TextureWrap$1.REPEAT, + wrapT: TextureWrap$1.REPEAT, + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) + }); + } + for (this._textureCache.update(e), y.update(e, t), h.update(e, t), p.update(e, t), _.update(e, t), this._autoExposureEnabled && m.update(e, t), s = o.length, c = 0; c < s; ++c) + o[c].update(e, t); + for (d = 0, c = 0; c < s; ++c) + l = o[c], l.ready && l.enabled && l._isSupported(e) && d++; + f = d !== r.length, f && this.update(e, t, n); +}; +PostProcessStageCollection.prototype.clear = function(e) { + this._textureCache.clear(e), this._autoExposureEnabled && this._autoExposure.clear(e); +}; +function getOutputTexture(e) { + for (; defined(e.length); ) + e = e.get(e.length - 1); + return e.outputTexture; +} +PostProcessStageCollection.prototype.getOutputTexture = function(e) { + const t = this.getStageByName(e); + if (defined(t)) + return getOutputTexture(t); +}; +function execute(e, t, n, i, r) { + if (defined(e.execute)) { + e.execute(t, n, i, r); + return; + } + const o = e.length; + let s; + if (e.inputPreviousStageTexture) + for (execute(e.get(0), t, n, i, r), s = 1; s < o; ++s) + execute( + e.get(s), + t, + getOutputTexture(e.get(s - 1)), + i, + r + ); + else + for (s = 0; s < o; ++s) + execute(e.get(s), t, n, i, r); +} +PostProcessStageCollection.prototype.execute = function(e, t, n, i) { + const r = this._activeStages, o = r.length, s = this._fxaa, c = this._ao, l = this._bloom, d = this._autoExposure, f = this._tonemapping, h = c.enabled && c._isSupported(e), p = l.enabled && l._isSupported(e), m = this._autoExposureEnabled, _ = f.enabled && f._isSupported(e), y = s.enabled && s._isSupported(e); + if (!y && !h && !p && !_ && o === 0) + return; + let C = t; + h && c.ready && (execute(c, e, C, n, i), C = getOutputTexture(c)), p && l.ready && (execute(l, e, C, n, i), C = getOutputTexture(l)), m && d.ready && execute(d, e, C, n, i), _ && f.ready && (execute(f, e, C, n, i), C = getOutputTexture(f)); + let T = C; + if (o > 0) { + execute(r[0], e, C, n, i); + for (let x = 1; x < o; ++x) + execute( + r[x], + e, + getOutputTexture(r[x - 1]), + n, + i + ); + T = getOutputTexture(r[o - 1]); + } + y && s.ready && execute(s, e, T, n, i); +}; +PostProcessStageCollection.prototype.copy = function(e, t) { + if (!defined(this._copyColorCommand)) { + const n = this; + this._copyColorCommand = e.createViewportQuadCommand(PassThrough, { + uniformMap: { + colorTexture: function() { + return n.outputTexture; + } + }, + owner: this + }); + } + this._copyColorCommand.framebuffer = t, this._copyColorCommand.execute(e); +}; +PostProcessStageCollection.prototype.isDestroyed = function() { + return !1; +}; +PostProcessStageCollection.prototype.destroy = function() { + return this._fxaa.destroy(), this._ao.destroy(), this._bloom.destroy(), this._autoExposure.destroy(), this._tonemapping.destroy(), this.removeAll(), this._textureCache = this._textureCache && this._textureCache.destroy(), destroyObject(this); +}; +const KeyboardEventModifier = { + /** + * Represents the shift key being held down. + * + * @type {number} + * @constant + */ + SHIFT: 0, + /** + * Represents the control key being held down. + * + * @type {number} + * @constant + */ + CTRL: 1, + /** + * Represents the alt key being held down. + * + * @type {number} + * @constant + */ + ALT: 2 +}, KeyboardEventModifier$1 = Object.freeze(KeyboardEventModifier), ScreenSpaceEventType = { + /** + * Represents a mouse left button down event. + * + * @type {number} + * @constant + */ + LEFT_DOWN: 0, + /** + * Represents a mouse left button up event. + * + * @type {number} + * @constant + */ + LEFT_UP: 1, + /** + * Represents a mouse left click event. + * + * @type {number} + * @constant + */ + LEFT_CLICK: 2, + /** + * Represents a mouse left double click event. + * + * @type {number} + * @constant + */ + LEFT_DOUBLE_CLICK: 3, + /** + * Represents a mouse left button down event. + * + * @type {number} + * @constant + */ + RIGHT_DOWN: 5, + /** + * Represents a mouse right button up event. + * + * @type {number} + * @constant + */ + RIGHT_UP: 6, + /** + * Represents a mouse right click event. + * + * @type {number} + * @constant + */ + RIGHT_CLICK: 7, + /** + * Represents a mouse middle button down event. + * + * @type {number} + * @constant + */ + MIDDLE_DOWN: 10, + /** + * Represents a mouse middle button up event. + * + * @type {number} + * @constant + */ + MIDDLE_UP: 11, + /** + * Represents a mouse middle click event. + * + * @type {number} + * @constant + */ + MIDDLE_CLICK: 12, + /** + * Represents a mouse move event. + * + * @type {number} + * @constant + */ + MOUSE_MOVE: 15, + /** + * Represents a mouse wheel event. + * + * @type {number} + * @constant + */ + WHEEL: 16, + /** + * Represents the start of a two-finger event on a touch surface. + * + * @type {number} + * @constant + */ + PINCH_START: 17, + /** + * Represents the end of a two-finger event on a touch surface. + * + * @type {number} + * @constant + */ + PINCH_END: 18, + /** + * Represents a change of a two-finger event on a touch surface. + * + * @type {number} + * @constant + */ + PINCH_MOVE: 19 +}, ScreenSpaceEventType$1 = Object.freeze(ScreenSpaceEventType); +function getPosition(e, t, n) { + const i = e._element; + if (i === document) + return n.x = t.clientX, n.y = t.clientY, n; + const r = i.getBoundingClientRect(); + return n.x = t.clientX - r.left, n.y = t.clientY - r.top, n; +} +function getInputEventKey(e, t) { + let n = e; + return defined(t) && (n += `+${t}`), n; +} +function getModifier(e) { + if (e.shiftKey) + return KeyboardEventModifier$1.SHIFT; + if (e.ctrlKey) + return KeyboardEventModifier$1.CTRL; + if (e.altKey) + return KeyboardEventModifier$1.ALT; +} +const MouseButton = { + LEFT: 0, + MIDDLE: 1, + RIGHT: 2 +}; +function registerListener(e, t, n, i) { + function r(o) { + i(e, o); + } + FeatureDetection.isInternetExplorer() ? n.addEventListener(t, r, !1) : n.addEventListener(t, r, { + capture: !1, + passive: !1 + }), e._removalFunctions.push(function() { + n.removeEventListener(t, r, !1); + }); +} +function registerListeners(e) { + const t = e._element, n = defined(t.disableRootEvents) ? t : document; + FeatureDetection.supportsPointerEvents() ? (registerListener( + e, + "pointerdown", + t, + handlePointerDown + ), registerListener( + e, + "pointerup", + t, + handlePointerUp + ), registerListener( + e, + "pointermove", + t, + handlePointerMove + ), registerListener( + e, + "pointercancel", + t, + handlePointerUp + )) : (registerListener( + e, + "mousedown", + t, + handleMouseDown + ), registerListener( + e, + "mouseup", + n, + handleMouseUp + ), registerListener( + e, + "mousemove", + n, + handleMouseMove + ), registerListener( + e, + "touchstart", + t, + handleTouchStart + ), registerListener( + e, + "touchend", + n, + handleTouchEnd + ), registerListener( + e, + "touchmove", + n, + handleTouchMove + ), registerListener( + e, + "touchcancel", + n, + handleTouchEnd + )), registerListener( + e, + "dblclick", + t, + handleDblClick + ); + let i; + "onwheel" in t ? i = "wheel" : document.onmousewheel !== void 0 ? i = "mousewheel" : i = "DOMMouseScroll", registerListener(e, i, t, handleWheel); +} +function unregisterListeners(e) { + const t = e._removalFunctions; + for (let n = 0; n < t.length; ++n) + t[n](); +} +const mouseDownEvent = { + position: new Cartesian2() +}; +function gotTouchEvent(e) { + e._lastSeenTouchEvent = getTimestamp$1(); +} +function canProcessMouseEvent(e) { + return getTimestamp$1() - e._lastSeenTouchEvent > ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds; +} +function checkPixelTolerance(e, t, n) { + const i = e.x - t.x, r = e.y - t.y; + return Math.sqrt(i * i + r * r) < n; +} +function handleMouseDown(e, t) { + if (!canProcessMouseEvent(e)) + return; + const n = t.button; + e._buttonDown[n] = !0; + let i; + if (n === MouseButton.LEFT) + i = ScreenSpaceEventType$1.LEFT_DOWN; + else if (n === MouseButton.MIDDLE) + i = ScreenSpaceEventType$1.MIDDLE_DOWN; + else if (n === MouseButton.RIGHT) + i = ScreenSpaceEventType$1.RIGHT_DOWN; + else + return; + const r = getPosition( + e, + t, + e._primaryPosition + ); + Cartesian2.clone(r, e._primaryStartPosition), Cartesian2.clone(r, e._primaryPreviousPosition); + const o = getModifier(t), s = e.getInputAction( + i, + o + ); + defined(s) && (Cartesian2.clone(r, mouseDownEvent.position), s(mouseDownEvent), t.preventDefault()); +} +const mouseUpEvent = { + position: new Cartesian2() +}, mouseClickEvent = { + position: new Cartesian2() +}; +function cancelMouseEvent(e, t, n, i) { + const r = getModifier(i), o = e.getInputAction( + t, + r + ), s = e.getInputAction( + n, + r + ); + if (defined(o) || defined(s)) { + const c = getPosition( + e, + i, + e._primaryPosition + ); + if (defined(o) && (Cartesian2.clone(c, mouseUpEvent.position), o(mouseUpEvent)), defined(s)) { + const l = e._primaryStartPosition; + checkPixelTolerance( + l, + c, + e._clickPixelTolerance + ) && (Cartesian2.clone(c, mouseClickEvent.position), s(mouseClickEvent)); + } + } +} +function handleMouseUp(e, t) { + if (!canProcessMouseEvent(e)) + return; + const n = t.button; + n !== MouseButton.LEFT && n !== MouseButton.MIDDLE && n !== MouseButton.RIGHT || (e._buttonDown[MouseButton.LEFT] && (cancelMouseEvent( + e, + ScreenSpaceEventType$1.LEFT_UP, + ScreenSpaceEventType$1.LEFT_CLICK, + t + ), e._buttonDown[MouseButton.LEFT] = !1), e._buttonDown[MouseButton.MIDDLE] && (cancelMouseEvent( + e, + ScreenSpaceEventType$1.MIDDLE_UP, + ScreenSpaceEventType$1.MIDDLE_CLICK, + t + ), e._buttonDown[MouseButton.MIDDLE] = !1), e._buttonDown[MouseButton.RIGHT] && (cancelMouseEvent( + e, + ScreenSpaceEventType$1.RIGHT_UP, + ScreenSpaceEventType$1.RIGHT_CLICK, + t + ), e._buttonDown[MouseButton.RIGHT] = !1)); +} +const mouseMoveEvent = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() +}; +function handleMouseMove(e, t) { + if (!canProcessMouseEvent(e)) + return; + const n = getModifier(t), i = getPosition( + e, + t, + e._primaryPosition + ), r = e._primaryPreviousPosition, o = e.getInputAction( + ScreenSpaceEventType$1.MOUSE_MOVE, + n + ); + defined(o) && (Cartesian2.clone(r, mouseMoveEvent.startPosition), Cartesian2.clone(i, mouseMoveEvent.endPosition), o(mouseMoveEvent)), Cartesian2.clone(i, r), (e._buttonDown[MouseButton.LEFT] || e._buttonDown[MouseButton.MIDDLE] || e._buttonDown[MouseButton.RIGHT]) && t.preventDefault(); +} +const mouseDblClickEvent = { + position: new Cartesian2() +}; +function handleDblClick(e, t) { + const n = t.button; + let i; + if (n === MouseButton.LEFT) + i = ScreenSpaceEventType$1.LEFT_DOUBLE_CLICK; + else + return; + const r = getModifier(t), o = e.getInputAction( + i, + r + ); + defined(o) && (getPosition(e, t, mouseDblClickEvent.position), o(mouseDblClickEvent)); +} +function handleWheel(e, t) { + let n; + if (defined(t.deltaY)) { + const o = t.deltaMode; + o === t.DOM_DELTA_PIXEL ? n = -t.deltaY : o === t.DOM_DELTA_LINE ? n = -t.deltaY * 40 : n = -t.deltaY * 120; + } else t.detail > 0 ? n = t.detail * -120 : n = t.wheelDelta; + if (!defined(n)) + return; + const i = getModifier(t), r = e.getInputAction( + ScreenSpaceEventType$1.WHEEL, + i + ); + defined(r) && (r(n), t.preventDefault()); +} +function handleTouchStart(e, t) { + gotTouchEvent(e); + const n = t.changedTouches; + let i; + const r = n.length; + let o, s; + const c = e._positions; + for (i = 0; i < r; ++i) + o = n[i], s = o.identifier, c.set( + s, + getPosition(e, o, new Cartesian2()) + ); + fireTouchEvents(e, t); + const l = e._previousPositions; + for (i = 0; i < r; ++i) + o = n[i], s = o.identifier, l.set( + s, + Cartesian2.clone(c.get(s)) + ); +} +function handleTouchEnd(e, t) { + gotTouchEvent(e); + const n = t.changedTouches; + let i; + const r = n.length; + let o, s; + const c = e._positions; + for (i = 0; i < r; ++i) + o = n[i], s = o.identifier, c.remove(s); + fireTouchEvents(e, t); + const l = e._previousPositions; + for (i = 0; i < r; ++i) + o = n[i], s = o.identifier, l.remove(s); +} +const touchStartEvent = { + position: new Cartesian2() +}, touch2StartEvent = { + position1: new Cartesian2(), + position2: new Cartesian2() +}, touchEndEvent = { + position: new Cartesian2() +}, touchClickEvent = { + position: new Cartesian2() +}, touchHoldEvent = { + position: new Cartesian2() +}; +function fireTouchEvents(e, t) { + const n = getModifier(t), i = e._positions, r = i.length; + let o, s; + const c = e._isPinching; + if (r !== 1 && e._buttonDown[MouseButton.LEFT]) { + if (e._buttonDown[MouseButton.LEFT] = !1, defined(e._touchHoldTimer) && (clearTimeout(e._touchHoldTimer), e._touchHoldTimer = void 0), o = e.getInputAction( + ScreenSpaceEventType$1.LEFT_UP, + n + ), defined(o) && (Cartesian2.clone( + e._primaryPosition, + touchEndEvent.position + ), o(touchEndEvent)), r === 0 && !e._isTouchHolding && (s = e.getInputAction( + ScreenSpaceEventType$1.LEFT_CLICK, + n + ), defined(s))) { + const l = e._primaryStartPosition, d = e._previousPositions.values[0]; + checkPixelTolerance( + l, + d, + e._clickPixelTolerance + ) && (Cartesian2.clone( + e._primaryPosition, + touchClickEvent.position + ), s(touchClickEvent)); + } + e._isTouchHolding = !1; + } + if (r === 0 && c && (e._isPinching = !1, o = e.getInputAction( + ScreenSpaceEventType$1.PINCH_END, + n + ), defined(o) && o()), r === 1 && !c) { + const l = i.values[0]; + Cartesian2.clone(l, e._primaryPosition), Cartesian2.clone(l, e._primaryStartPosition), Cartesian2.clone( + l, + e._primaryPreviousPosition + ), e._buttonDown[MouseButton.LEFT] = !0, o = e.getInputAction( + ScreenSpaceEventType$1.LEFT_DOWN, + n + ), defined(o) && (Cartesian2.clone(l, touchStartEvent.position), o(touchStartEvent)), e._touchHoldTimer = setTimeout(function() { + if (!e.isDestroyed() && (e._touchHoldTimer = void 0, e._isTouchHolding = !0, s = e.getInputAction( + ScreenSpaceEventType$1.RIGHT_CLICK, + n + ), defined(s))) { + const d = e._primaryStartPosition, f = e._previousPositions.values[0]; + checkPixelTolerance( + d, + f, + e._holdPixelTolerance + ) && (Cartesian2.clone( + e._primaryPosition, + touchHoldEvent.position + ), s(touchHoldEvent)); + } + }, ScreenSpaceEventHandler.touchHoldDelayMilliseconds), t.preventDefault(); + } + r === 2 && !c && (e._isPinching = !0, o = e.getInputAction( + ScreenSpaceEventType$1.PINCH_START, + n + ), defined(o) && (Cartesian2.clone(i.values[0], touch2StartEvent.position1), Cartesian2.clone(i.values[1], touch2StartEvent.position2), o(touch2StartEvent), t.preventDefault())); +} +function handleTouchMove(e, t) { + gotTouchEvent(e); + const n = t.changedTouches; + let i; + const r = n.length; + let o, s; + const c = e._positions; + for (i = 0; i < r; ++i) { + o = n[i], s = o.identifier; + const d = c.get(s); + defined(d) && getPosition(e, o, d); + } + fireTouchMoveEvents(e, t); + const l = e._previousPositions; + for (i = 0; i < r; ++i) + o = n[i], s = o.identifier, Cartesian2.clone( + c.get(s), + l.get(s) + ); +} +const touchMoveEvent = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() +}, touchPinchMovementEvent = { + distance: { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() + }, + angleAndHeight: { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() + } +}; +function fireTouchMoveEvents(e, t) { + const n = getModifier(t), i = e._positions, r = e._previousPositions, o = i.length; + let s; + if (o === 1 && e._buttonDown[MouseButton.LEFT]) { + const c = i.values[0]; + Cartesian2.clone(c, e._primaryPosition); + const l = e._primaryPreviousPosition; + s = e.getInputAction( + ScreenSpaceEventType$1.MOUSE_MOVE, + n + ), defined(s) && (Cartesian2.clone(l, touchMoveEvent.startPosition), Cartesian2.clone(c, touchMoveEvent.endPosition), s(touchMoveEvent)), Cartesian2.clone(c, l), t.preventDefault(); + } else if (o === 2 && e._isPinching && (s = e.getInputAction( + ScreenSpaceEventType$1.PINCH_MOVE, + n + ), defined(s))) { + const c = i.values[0], l = i.values[1], d = r.values[0], f = r.values[1], h = l.x - c.x, p = l.y - c.y, m = Math.sqrt(h * h + p * p) * 0.25, _ = f.x - d.x, y = f.y - d.y, C = Math.sqrt(_ * _ + y * y) * 0.25, T = (l.y + c.y) * 0.125, x = (f.y + d.y) * 0.125, b = Math.atan2(p, h), S = Math.atan2(y, _); + Cartesian2.fromElements( + 0, + C, + touchPinchMovementEvent.distance.startPosition + ), Cartesian2.fromElements( + 0, + m, + touchPinchMovementEvent.distance.endPosition + ), Cartesian2.fromElements( + S, + x, + touchPinchMovementEvent.angleAndHeight.startPosition + ), Cartesian2.fromElements( + b, + T, + touchPinchMovementEvent.angleAndHeight.endPosition + ), s(touchPinchMovementEvent); + } +} +function handlePointerDown(e, t) { + if (t.target.setPointerCapture(t.pointerId), t.pointerType === "touch") { + const n = e._positions, i = t.pointerId; + n.set( + i, + getPosition(e, t, new Cartesian2()) + ), fireTouchEvents(e, t), e._previousPositions.set( + i, + Cartesian2.clone(n.get(i)) + ); + } else + handleMouseDown(e, t); +} +function handlePointerUp(e, t) { + if (t.pointerType === "touch") { + const n = e._positions, i = t.pointerId; + n.remove(i), fireTouchEvents(e, t), e._previousPositions.remove(i); + } else + handleMouseUp(e, t); +} +function handlePointerMove(e, t) { + if (t.pointerType === "touch") { + const n = e._positions, i = t.pointerId, r = n.get(i); + if (!defined(r)) + return; + getPosition(e, t, r), fireTouchMoveEvents(e, t); + const o = e._previousPositions; + Cartesian2.clone( + n.get(i), + o.get(i) + ); + } else + handleMouseMove(e, t); +} +function ScreenSpaceEventHandler(e) { + this._inputEvents = {}, this._buttonDown = { + LEFT: !1, + MIDDLE: !1, + RIGHT: !1 + }, this._isPinching = !1, this._isTouchHolding = !1, this._lastSeenTouchEvent = -ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds, this._primaryStartPosition = new Cartesian2(), this._primaryPosition = new Cartesian2(), this._primaryPreviousPosition = new Cartesian2(), this._positions = new AssociativeArray(), this._previousPositions = new AssociativeArray(), this._removalFunctions = [], this._touchHoldTimer = void 0, this._clickPixelTolerance = 5, this._holdPixelTolerance = 25, this._element = defaultValue(e, document), registerListeners(this); +} +ScreenSpaceEventHandler.prototype.setInputAction = function(e, t, n) { + const i = getInputEventKey(t, n); + this._inputEvents[i] = e; +}; +ScreenSpaceEventHandler.prototype.getInputAction = function(e, t) { + const n = getInputEventKey(e, t); + return this._inputEvents[n]; +}; +ScreenSpaceEventHandler.prototype.removeInputAction = function(e, t) { + const n = getInputEventKey(e, t); + delete this._inputEvents[n]; +}; +ScreenSpaceEventHandler.prototype.isDestroyed = function() { + return !1; +}; +ScreenSpaceEventHandler.prototype.destroy = function() { + return unregisterListeners(this), destroyObject(this); +}; +ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds = 800; +ScreenSpaceEventHandler.touchHoldDelayMilliseconds = 1500; +function SceneTransitioner(e) { + this._scene = e, this._currentTweens = [], this._morphHandler = void 0, this._morphCancelled = !1, this._completeMorph = void 0, this._morphToOrthographic = !1; +} +SceneTransitioner.prototype.completeMorph = function() { + defined(this._completeMorph) && this._completeMorph(); +}; +SceneTransitioner.prototype.morphTo2D = function(e, t) { + defined(this._completeMorph) && this._completeMorph(); + const n = this._scene; + this._previousMode = n.mode, this._morphToOrthographic = n.camera.frustum instanceof OrthographicFrustum, !(this._previousMode === SceneMode$1.SCENE2D || this._previousMode === SceneMode$1.MORPHING) && (this._scene.morphStart.raiseEvent( + this, + this._previousMode, + SceneMode$1.SCENE2D, + !0 + ), n._mode = SceneMode$1.MORPHING, n.camera._setTransform(Matrix4.IDENTITY), this._previousMode === SceneMode$1.COLUMBUS_VIEW ? morphFromColumbusViewTo2D(this, e) : morphFrom3DTo2D(this, e, t), e === 0 && defined(this._completeMorph) && this._completeMorph()); +}; +const scratchToCVPosition = new Cartesian3(), scratchToCVDirection = new Cartesian3(), scratchToCVUp = new Cartesian3(), scratchToCVPosition2D = new Cartesian3(), scratchToCVDirection2D = new Cartesian3(), scratchToCVUp2D = new Cartesian3(), scratchToCVSurfacePosition = new Cartesian3(), scratchToCVCartographic = new Cartographic(), scratchToCVToENU = new Matrix4(), scratchToCVFrustumPerspective = new PerspectiveFrustum(), scratchToCVFrustumOrthographic = new OrthographicFrustum(), scratchToCVCamera = { + position: void 0, + direction: void 0, + up: void 0, + position2D: void 0, + direction2D: void 0, + up2D: void 0, + frustum: void 0 +}; +SceneTransitioner.prototype.morphToColumbusView = function(e, t) { + defined(this._completeMorph) && this._completeMorph(); + const n = this._scene; + if (this._previousMode = n.mode, this._previousMode === SceneMode$1.COLUMBUS_VIEW || this._previousMode === SceneMode$1.MORPHING) + return; + this._scene.morphStart.raiseEvent( + this, + this._previousMode, + SceneMode$1.COLUMBUS_VIEW, + !0 + ), n.camera._setTransform(Matrix4.IDENTITY); + let i = scratchToCVPosition; + const r = scratchToCVDirection, o = scratchToCVUp; + if (e > 0) + i.x = 0, i.y = -1, i.z = 1, i = Cartesian3.multiplyByScalar( + Cartesian3.normalize(i, i), + 5 * t.maximumRadius, + i + ), Cartesian3.negate(Cartesian3.normalize(i, r), r), Cartesian3.cross(Cartesian3.UNIT_X, r, o); + else { + const d = n.camera; + if (this._previousMode === SceneMode$1.SCENE2D) + Cartesian3.clone(d.position, i), i.z = d.frustum.right - d.frustum.left, Cartesian3.negate(Cartesian3.UNIT_Z, r), Cartesian3.clone(Cartesian3.UNIT_Y, o); + else { + Cartesian3.clone(d.positionWC, i), Cartesian3.clone(d.directionWC, r), Cartesian3.clone(d.upWC, o); + const f = t.scaleToGeodeticSurface( + i, + scratchToCVSurfacePosition + ), h = Transforms.eastNorthUpToFixedFrame( + f, + t, + scratchToCVToENU + ); + Matrix4.inverseTransformation(h, h), n.mapProjection.project( + t.cartesianToCartographic(i, scratchToCVCartographic), + i + ), Matrix4.multiplyByPointAsVector(h, r, r), Matrix4.multiplyByPointAsVector(h, o, o); + } + } + let s; + this._morphToOrthographic ? (s = scratchToCVFrustumOrthographic, s.width = n.camera.frustum.right - n.camera.frustum.left, s.aspectRatio = n.drawingBufferWidth / n.drawingBufferHeight) : (s = scratchToCVFrustumPerspective, s.aspectRatio = n.drawingBufferWidth / n.drawingBufferHeight, s.fov = CesiumMath.toRadians(60)); + const c = scratchToCVCamera; + c.position = i, c.direction = r, c.up = o, c.frustum = s; + const l = completeColumbusViewCallback(c); + createMorphHandler(this, l), this._previousMode === SceneMode$1.SCENE2D ? morphFrom2DToColumbusView(this, e, c, l) : (c.position2D = Matrix4.multiplyByPoint( + Camera.TRANSFORM_2D, + i, + scratchToCVPosition2D + ), c.direction2D = Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + r, + scratchToCVDirection2D + ), c.up2D = Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + o, + scratchToCVUp2D + ), n._mode = SceneMode$1.MORPHING, morphFrom3DToColumbusView(this, e, c, l)), e === 0 && defined(this._completeMorph) && this._completeMorph(); +}; +const scratchCVTo3DCamera = { + position: new Cartesian3(), + direction: new Cartesian3(), + up: new Cartesian3(), + frustum: void 0 +}, scratch2DTo3DFrustumPersp = new PerspectiveFrustum(); +SceneTransitioner.prototype.morphTo3D = function(e, t) { + defined(this._completeMorph) && this._completeMorph(); + const n = this._scene; + if (this._previousMode = n.mode, !(this._previousMode === SceneMode$1.SCENE3D || this._previousMode === SceneMode$1.MORPHING)) { + if (this._scene.morphStart.raiseEvent( + this, + this._previousMode, + SceneMode$1.SCENE3D, + !0 + ), n._mode = SceneMode$1.MORPHING, n.camera._setTransform(Matrix4.IDENTITY), this._previousMode === SceneMode$1.SCENE2D) + morphFrom2DTo3D(this, e, t); + else { + let i; + e > 0 ? (i = scratchCVTo3DCamera, Cartesian3.fromDegrees( + 0, + 0, + 5 * t.maximumRadius, + t, + i.position + ), Cartesian3.negate(i.position, i.direction), Cartesian3.normalize(i.direction, i.direction), Cartesian3.clone(Cartesian3.UNIT_Z, i.up)) : i = getColumbusViewTo3DCamera(this, t); + let r; + const o = n.camera; + o.frustum instanceof OrthographicFrustum ? r = o.frustum.clone() : (r = scratch2DTo3DFrustumPersp, r.aspectRatio = n.drawingBufferWidth / n.drawingBufferHeight, r.fov = CesiumMath.toRadians(60)), i.frustum = r; + const s = complete3DCallback(i); + createMorphHandler(this, s), morphFromColumbusViewTo3D(this, e, i, s); + } + e === 0 && defined(this._completeMorph) && this._completeMorph(); + } +}; +SceneTransitioner.prototype.isDestroyed = function() { + return !1; +}; +SceneTransitioner.prototype.destroy = function() { + return destroyMorphHandler(this), destroyObject(this); +}; +function createMorphHandler(e, t) { + if (e._scene.completeMorphOnUserInput) { + e._morphHandler = new ScreenSpaceEventHandler( + e._scene.canvas + ); + const n = function() { + e._morphCancelled = !0, e._scene.camera.cancelFlight(), t(e); + }; + e._completeMorph = n, e._morphHandler.setInputAction( + n, + ScreenSpaceEventType$1.LEFT_DOWN + ), e._morphHandler.setInputAction( + n, + ScreenSpaceEventType$1.MIDDLE_DOWN + ), e._morphHandler.setInputAction( + n, + ScreenSpaceEventType$1.RIGHT_DOWN + ), e._morphHandler.setInputAction( + n, + ScreenSpaceEventType$1.WHEEL + ); + } +} +function destroyMorphHandler(e) { + const t = e._currentTweens; + for (let n = 0; n < t.length; ++n) + t[n].cancelTween(); + e._currentTweens.length = 0, e._morphHandler = e._morphHandler && e._morphHandler.destroy(); +} +const scratchCVTo3DCartographic = new Cartographic(), scratchCVTo3DSurfacePoint = new Cartesian3(), scratchCVTo3DFromENU = new Matrix4(); +function getColumbusViewTo3DCamera(e, t) { + const n = e._scene, i = n.camera, r = scratchCVTo3DCamera, o = r.position, s = r.direction, c = r.up, l = n.mapProjection.unproject( + i.position, + scratchCVTo3DCartographic + ); + t.cartographicToCartesian(l, o); + const d = t.scaleToGeodeticSurface( + o, + scratchCVTo3DSurfacePoint + ), f = Transforms.eastNorthUpToFixedFrame( + d, + t, + scratchCVTo3DFromENU + ); + return Matrix4.multiplyByPointAsVector(f, i.direction, s), Matrix4.multiplyByPointAsVector(f, i.up, c), r; +} +const scratchCVTo3DStartPos = new Cartesian3(), scratchCVTo3DStartDir = new Cartesian3(), scratchCVTo3DStartUp = new Cartesian3(), scratchCVTo3DEndPos = new Cartesian3(), scratchCVTo3DEndDir = new Cartesian3(), scratchCVTo3DEndUp = new Cartesian3(); +function morphFromColumbusViewTo3D(e, t, n, i) { + t *= 0.5; + const r = e._scene, o = r.camera, s = Cartesian3.clone(o.position, scratchCVTo3DStartPos), c = Cartesian3.clone(o.direction, scratchCVTo3DStartDir), l = Cartesian3.clone(o.up, scratchCVTo3DStartUp), d = Matrix4.multiplyByPoint( + Camera.TRANSFORM_2D_INVERSE, + n.position, + scratchCVTo3DEndPos + ), f = Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D_INVERSE, + n.direction, + scratchCVTo3DEndDir + ), h = Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D_INVERSE, + n.up, + scratchCVTo3DEndUp + ); + function p(_) { + columbusViewMorph(s, d, _.time, o.position), columbusViewMorph(c, f, _.time, o.direction), columbusViewMorph(l, h, _.time, o.up), Cartesian3.cross(o.direction, o.up, o.right), Cartesian3.normalize(o.right, o.right); + } + const m = r.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: p, + complete: function() { + addMorphTimeAnimations(e, r, 0, 1, t, i); + } + }); + e._currentTweens.push(m); +} +const scratch2DTo3DFrustumOrtho = new OrthographicFrustum(), scratch3DToCVStartPos = new Cartesian3(), scratch3DToCVStartDir = new Cartesian3(), scratch3DToCVStartUp = new Cartesian3(), scratch3DToCVEndPos = new Cartesian3(), scratch3DToCVEndDir = new Cartesian3(), scratch3DToCVEndUp = new Cartesian3(); +function morphFrom2DTo3D(e, t, n) { + t /= 3; + const i = e._scene, r = i.camera; + let o; + t > 0 ? (o = scratchCVTo3DCamera, Cartesian3.fromDegrees( + 0, + 0, + 5 * n.maximumRadius, + n, + o.position + ), Cartesian3.negate(o.position, o.direction), Cartesian3.normalize(o.direction, o.direction), Cartesian3.clone(Cartesian3.UNIT_Z, o.up)) : (r.position.z = r.frustum.right - r.frustum.left, o = getColumbusViewTo3DCamera(e, n)); + let s; + e._morphToOrthographic ? (s = scratch2DTo3DFrustumOrtho, s.aspectRatio = i.drawingBufferWidth / i.drawingBufferHeight, s.width = r.frustum.right - r.frustum.left) : (s = scratch2DTo3DFrustumPersp, s.aspectRatio = i.drawingBufferWidth / i.drawingBufferHeight, s.fov = CesiumMath.toRadians(60)), o.frustum = s; + const c = complete3DCallback(o); + createMorphHandler(e, c); + let l; + e._morphToOrthographic ? l = function() { + morphFromColumbusViewTo3D(e, t, o, c); + } : l = function() { + morphOrthographicToPerspective( + e, + t, + o, + function() { + morphFromColumbusViewTo3D(e, t, o, c); + } + ); + }, t > 0 ? (i._mode = SceneMode$1.SCENE2D, r.flyTo({ + duration: t, + destination: Cartesian3.fromDegrees( + 0, + 0, + 5 * n.maximumRadius, + n, + scratch3DToCVEndPos + ), + complete: function() { + i._mode = SceneMode$1.MORPHING, l(); + } + })) : l(); +} +function columbusViewMorph(e, t, n, i) { + return Cartesian3.lerp(e, t, n, i); +} +function morphPerspectiveToOrthographic(e, t, n, i, r) { + const o = e._scene, s = o.camera; + if (s.frustum instanceof OrthographicFrustum) + return; + const c = s.frustum.fov, l = CesiumMath.RADIANS_PER_DEGREE * 0.5, d = n.position.z * Math.tan(c * 0.5); + s.frustum.far = d / Math.tan(l * 0.5) + 1e7; + function f(p) { + s.frustum.fov = CesiumMath.lerp(c, l, p.time); + const m = d / Math.tan(s.frustum.fov * 0.5); + i(s, m); + } + const h = o.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: f, + complete: function() { + s.frustum = n.frustum.clone(), r(e); + } + }); + e._currentTweens.push(h); +} +const scratchCVTo2DStartPos = new Cartesian3(), scratchCVTo2DStartDir = new Cartesian3(), scratchCVTo2DStartUp = new Cartesian3(), scratchCVTo2DEndPos = new Cartesian3(), scratchCVTo2DEndDir = new Cartesian3(), scratchCVTo2DEndUp = new Cartesian3(), scratchCVTo2DFrustum = new OrthographicOffCenterFrustum(), scratchCVTo2DRay = new Ray(), scratchCVTo2DPickPos = new Cartesian3(), scratchCVTo2DCamera = { + position: void 0, + direction: void 0, + up: void 0, + frustum: void 0 +}; +function morphFromColumbusViewTo2D(e, t) { + t *= 0.5; + const n = e._scene, i = n.camera, r = Cartesian3.clone(i.position, scratchCVTo2DStartPos), o = Cartesian3.clone(i.direction, scratchCVTo2DStartDir), s = Cartesian3.clone(i.up, scratchCVTo2DStartUp), c = Cartesian3.negate(Cartesian3.UNIT_Z, scratchCVTo2DEndDir), l = Cartesian3.clone(Cartesian3.UNIT_Y, scratchCVTo2DEndUp), d = scratchCVTo2DEndPos; + if (t > 0) + Cartesian3.clone(Cartesian3.ZERO, scratchCVTo2DEndPos), d.z = 5 * n.ellipsoid.maximumRadius; + else { + Cartesian3.clone(r, scratchCVTo2DEndPos); + const C = scratchCVTo2DRay; + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, r, C.origin), Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + o, + C.direction + ); + const T = n.globe; + if (defined(T)) { + const x = T.pickWorldCoordinates( + C, + n, + !0, + scratchCVTo2DPickPos + ); + defined(x) && (Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, x, d), d.z += Cartesian3.distance(r, d)); + } + } + const f = scratchCVTo2DFrustum; + f.right = d.z * 0.5, f.left = -f.right, f.top = f.right * (n.drawingBufferHeight / n.drawingBufferWidth), f.bottom = -f.top; + const h = scratchCVTo2DCamera; + h.position = d, h.direction = c, h.up = l, h.frustum = f; + const p = complete2DCallback(h); + createMorphHandler(e, p); + function m(C) { + columbusViewMorph(r, d, C.time, i.position), columbusViewMorph(o, c, C.time, i.direction), columbusViewMorph(s, l, C.time, i.up), Cartesian3.cross(i.direction, i.up, i.right), Cartesian3.normalize(i.right, i.right), i._adjustOrthographicFrustum(!0); + } + function _(C, T) { + C.position.z = T; + } + const y = n.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: m, + complete: function() { + morphPerspectiveToOrthographic( + e, + t, + h, + _, + p + ); + } + }); + e._currentTweens.push(y); +} +const scratch3DTo2DCartographic = new Cartographic(), scratch3DTo2DCamera = { + position: new Cartesian3(), + direction: new Cartesian3(), + up: new Cartesian3(), + position2D: new Cartesian3(), + direction2D: new Cartesian3(), + up2D: new Cartesian3(), + frustum: new OrthographicOffCenterFrustum() +}, scratch3DTo2DEndCamera = { + position: new Cartesian3(), + direction: new Cartesian3(), + up: new Cartesian3(), + frustum: void 0 +}, scratch3DTo2DPickPosition = new Cartesian3(), scratch3DTo2DRay = new Ray(), scratch3DTo2DToENU = new Matrix4(), scratch3DTo2DSurfacePoint = new Cartesian3(); +function morphFrom3DTo2D(e, t, n) { + t *= 0.5; + const i = e._scene, r = i.camera, o = scratch3DTo2DCamera; + if (t > 0) + Cartesian3.clone(Cartesian3.ZERO, o.position), o.position.z = 5 * n.maximumRadius, Cartesian3.negate(Cartesian3.UNIT_Z, o.direction), Cartesian3.clone(Cartesian3.UNIT_Y, o.up); + else { + n.cartesianToCartographic( + r.positionWC, + scratch3DTo2DCartographic + ), i.mapProjection.project(scratch3DTo2DCartographic, o.position), Cartesian3.negate(Cartesian3.UNIT_Z, o.direction), Cartesian3.clone(Cartesian3.UNIT_Y, o.up); + const h = scratch3DTo2DRay; + Cartesian3.clone(o.position2D, h.origin); + const p = Cartesian3.clone(r.directionWC, h.direction), m = n.scaleToGeodeticSurface( + r.positionWC, + scratch3DTo2DSurfacePoint + ), _ = Transforms.eastNorthUpToFixedFrame( + m, + n, + scratch3DTo2DToENU + ); + Matrix4.inverseTransformation(_, _), Matrix4.multiplyByPointAsVector(_, p, p), Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + p, + p + ); + const y = i.globe; + if (defined(y)) { + const C = y.pickWorldCoordinates( + h, + i, + !0, + scratch3DTo2DPickPosition + ); + if (defined(C)) { + const T = Cartesian3.distance(o.position2D, C); + C.x += T, Cartesian3.clone(C, o.position2D); + } + } + } + function s(h, p) { + h.position.x = p; + } + Matrix4.multiplyByPoint( + Camera.TRANSFORM_2D, + o.position, + o.position2D + ), Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + o.direction, + o.direction2D + ), Matrix4.multiplyByPointAsVector( + Camera.TRANSFORM_2D, + o.up, + o.up2D + ); + const c = o.frustum; + c.right = o.position.z * 0.5, c.left = -c.right, c.top = c.right * (i.drawingBufferHeight / i.drawingBufferWidth), c.bottom = -c.top; + const l = scratch3DTo2DEndCamera; + Matrix4.multiplyByPoint( + Camera.TRANSFORM_2D_INVERSE, + o.position2D, + l.position + ), Cartesian3.clone(o.direction, l.direction), Cartesian3.clone(o.up, l.up), l.frustum = c; + const d = complete2DCallback(l); + createMorphHandler(e, d); + function f() { + morphPerspectiveToOrthographic( + e, + t, + o, + s, + d + ); + } + morphFrom3DToColumbusView(e, t, o, f); +} +function morphOrthographicToPerspective(e, t, n, i) { + const r = e._scene, o = r.camera, s = o.frustum.right - o.frustum.left; + o.frustum = n.frustum.clone(); + const c = o.frustum.fov, l = CesiumMath.RADIANS_PER_DEGREE * 0.5, d = s * Math.tan(c * 0.5); + o.frustum.far = d / Math.tan(l * 0.5) + 1e7, o.frustum.fov = l; + function f(p) { + o.frustum.fov = CesiumMath.lerp(l, c, p.time), o.position.z = d / Math.tan(o.frustum.fov * 0.5); + } + const h = r.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: f, + complete: function() { + i(e); + } + }); + e._currentTweens.push(h); +} +function morphFrom2DToColumbusView(e, t, n, i) { + t *= 0.5; + const r = e._scene, o = r.camera, s = Cartesian3.clone(n.position, scratch3DToCVEndPos), c = Cartesian3.clone(n.direction, scratch3DToCVEndDir), l = Cartesian3.clone(n.up, scratch3DToCVEndUp); + r._mode = SceneMode$1.MORPHING; + function d() { + o.frustum = n.frustum.clone(); + const f = Cartesian3.clone(o.position, scratch3DToCVStartPos), h = Cartesian3.clone(o.direction, scratch3DToCVStartDir), p = Cartesian3.clone(o.up, scratch3DToCVStartUp); + f.z = s.z; + function m(y) { + columbusViewMorph(f, s, y.time, o.position), columbusViewMorph(h, c, y.time, o.direction), columbusViewMorph(p, l, y.time, o.up), Cartesian3.cross(o.direction, o.up, o.right), Cartesian3.normalize(o.right, o.right); + } + const _ = r.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: m, + complete: function() { + i(e); + } + }); + e._currentTweens.push(_); + } + e._morphToOrthographic ? d() : morphOrthographicToPerspective(e, 0, n, d); +} +function morphFrom3DToColumbusView(e, t, n, i) { + const r = e._scene, o = r.camera, s = Cartesian3.clone(o.position, scratch3DToCVStartPos), c = Cartesian3.clone(o.direction, scratch3DToCVStartDir), l = Cartesian3.clone(o.up, scratch3DToCVStartUp), d = Cartesian3.clone(n.position2D, scratch3DToCVEndPos), f = Cartesian3.clone(n.direction2D, scratch3DToCVEndDir), h = Cartesian3.clone(n.up2D, scratch3DToCVEndUp); + function p(_) { + columbusViewMorph(s, d, _.time, o.position), columbusViewMorph(c, f, _.time, o.direction), columbusViewMorph(l, h, _.time, o.up), Cartesian3.cross(o.direction, o.up, o.right), Cartesian3.normalize(o.right, o.right), o._adjustOrthographicFrustum(!0); + } + const m = r.tweens.add({ + duration: t, + easingFunction: EasingFunction$1.QUARTIC_OUT, + startObject: { + time: 0 + }, + stopObject: { + time: 1 + }, + update: p, + complete: function() { + addMorphTimeAnimations(e, r, 1, 0, t, i); + } + }); + e._currentTweens.push(m); +} +function addMorphTimeAnimations(e, t, n, i, r, o) { + const s = { + object: t, + property: "morphTime", + startValue: n, + stopValue: i, + duration: r, + easingFunction: EasingFunction$1.QUARTIC_OUT + }; + defined(o) && (s.complete = function() { + o(e); + }); + const c = t.tweens.addProperty(s); + e._currentTweens.push(c); +} +function complete3DCallback(e) { + return function(t) { + const n = t._scene; + n._mode = SceneMode$1.SCENE3D, n.morphTime = SceneMode$1.getMorphTime(SceneMode$1.SCENE3D), destroyMorphHandler(t); + const i = n.camera; + (t._previousMode !== SceneMode$1.MORPHING || t._morphCancelled) && (t._morphCancelled = !1, Cartesian3.clone(e.position, i.position), Cartesian3.clone(e.direction, i.direction), Cartesian3.clone(e.up, i.up), Cartesian3.cross(i.direction, i.up, i.right), Cartesian3.normalize(i.right, i.right), i.frustum = e.frustum.clone()); + const r = i.frustum; + n.frameState.useLogDepth && (r.near = 0.1, r.far = 1e10); + const o = defined(t._completeMorph); + t._completeMorph = void 0, n.camera.update(n.mode), t._scene.morphComplete.raiseEvent( + t, + t._previousMode, + SceneMode$1.SCENE3D, + o + ); + }; +} +function complete2DCallback(e) { + return function(t) { + const n = t._scene; + n._mode = SceneMode$1.SCENE2D, n.morphTime = SceneMode$1.getMorphTime(SceneMode$1.SCENE2D), destroyMorphHandler(t); + const i = n.camera; + Cartesian3.clone(e.position, i.position), i.position.z = n.ellipsoid.maximumRadius * 2, Cartesian3.clone(e.direction, i.direction), Cartesian3.clone(e.up, i.up), Cartesian3.cross(i.direction, i.up, i.right), Cartesian3.normalize(i.right, i.right), i.frustum = e.frustum.clone(); + const r = defined(t._completeMorph); + t._completeMorph = void 0, n.camera.update(n.mode), t._scene.morphComplete.raiseEvent( + t, + t._previousMode, + SceneMode$1.SCENE2D, + r + ); + }; +} +function completeColumbusViewCallback(e) { + return function(t) { + const n = t._scene; + n._mode = SceneMode$1.COLUMBUS_VIEW, n.morphTime = SceneMode$1.getMorphTime(SceneMode$1.COLUMBUS_VIEW), destroyMorphHandler(t); + const i = n.camera; + (t._previousModeMode !== SceneMode$1.MORPHING || t._morphCancelled) && (t._morphCancelled = !1, Cartesian3.clone(e.position, i.position), Cartesian3.clone(e.direction, i.direction), Cartesian3.clone(e.up, i.up), Cartesian3.cross(i.direction, i.up, i.right), Cartesian3.normalize(i.right, i.right)); + const r = i.frustum; + n.frameState.useLogDepth && (r.near = 0.1, r.far = 1e10); + const o = defined(t._completeMorph); + t._completeMorph = void 0, n.camera.update(n.mode), t._scene.morphComplete.raiseEvent( + t, + t._previousMode, + SceneMode$1.COLUMBUS_VIEW, + o + ); + }; +} +const CameraEventType = { + /** + * A left mouse button press followed by moving the mouse and releasing the button. + * + * @type {number} + * @constant + */ + LEFT_DRAG: 0, + /** + * A right mouse button press followed by moving the mouse and releasing the button. + * + * @type {number} + * @constant + */ + RIGHT_DRAG: 1, + /** + * A middle mouse button press followed by moving the mouse and releasing the button. + * + * @type {number} + * @constant + */ + MIDDLE_DRAG: 2, + /** + * Scrolling the middle mouse button. + * + * @type {number} + * @constant + */ + WHEEL: 3, + /** + * A two-finger touch on a touch surface. + * + * @type {number} + * @constant + */ + PINCH: 4 +}, CameraEventType$1 = Object.freeze(CameraEventType); +function getKey(e, t) { + let n = `${e}`; + return defined(t) && (n += `+${t}`), n; +} +function clonePinchMovement(e, t) { + Cartesian2.clone( + e.distance.startPosition, + t.distance.startPosition + ), Cartesian2.clone( + e.distance.endPosition, + t.distance.endPosition + ), Cartesian2.clone( + e.angleAndHeight.startPosition, + t.angleAndHeight.startPosition + ), Cartesian2.clone( + e.angleAndHeight.endPosition, + t.angleAndHeight.endPosition + ); +} +function listenToPinch(e, t, n) { + const i = getKey(CameraEventType$1.PINCH, t), r = e._update, o = e._isDown, s = e._eventStartPosition, c = e._pressTime, l = e._releaseTime; + r[i] = !0, o[i] = !1, s[i] = new Cartesian2(); + let d = e._movement[i]; + defined(d) || (d = e._movement[i] = {}), d.distance = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() + }, d.angleAndHeight = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() + }, d.prevAngle = 0, e._eventHandler.setInputAction( + function(f) { + e._buttonsDown++, o[i] = !0, c[i] = /* @__PURE__ */ new Date(), Cartesian2.lerp( + f.position1, + f.position2, + 0.5, + s[i] + ); + }, + ScreenSpaceEventType$1.PINCH_START, + t + ), e._eventHandler.setInputAction( + function() { + e._buttonsDown = Math.max(e._buttonsDown - 1, 0), o[i] = !1, l[i] = /* @__PURE__ */ new Date(); + }, + ScreenSpaceEventType$1.PINCH_END, + t + ), e._eventHandler.setInputAction( + function(f) { + if (o[i]) { + r[i] ? (clonePinchMovement(f, d), r[i] = !1, d.prevAngle = d.angleAndHeight.startPosition.x) : (Cartesian2.clone( + f.distance.endPosition, + d.distance.endPosition + ), Cartesian2.clone( + f.angleAndHeight.endPosition, + d.angleAndHeight.endPosition + )); + let h = d.angleAndHeight.endPosition.x; + const p = d.prevAngle, m = Math.PI * 2; + for (; h >= p + Math.PI; ) + h -= m; + for (; h < p - Math.PI; ) + h += m; + d.angleAndHeight.endPosition.x = -h * n.clientWidth / 12, d.angleAndHeight.startPosition.x = -p * n.clientWidth / 12; + } + }, + ScreenSpaceEventType$1.PINCH_MOVE, + t + ); +} +function listenToWheel(e, t) { + const n = getKey(CameraEventType$1.WHEEL, t), i = e._pressTime, r = e._releaseTime, o = e._update; + o[n] = !0; + let s = e._movement[n]; + defined(s) || (s = e._movement[n] = {}); + let c = e._lastMovement[n]; + defined(c) || (c = e._lastMovement[n] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2(), + valid: !1 + }), s.startPosition = new Cartesian2(), Cartesian2.clone(Cartesian2.ZERO, s.startPosition), s.endPosition = new Cartesian2(), e._eventHandler.setInputAction( + function(l) { + const d = 7.5 * CesiumMath.toRadians(l); + i[n] = r[n] = /* @__PURE__ */ new Date(), s.endPosition.x = 0, s.endPosition.y = d, Cartesian2.clone(s.endPosition, c.endPosition), c.valid = !0, o[n] = !1; + }, + ScreenSpaceEventType$1.WHEEL, + t + ); +} +function listenMouseButtonDownUp(e, t, n) { + const i = getKey(n, t), r = e._isDown, o = e._eventStartPosition, s = e._pressTime; + r[i] = !1, o[i] = new Cartesian2(); + let c = e._lastMovement[i]; + defined(c) || (c = e._lastMovement[i] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2(), + valid: !1 + }); + let l, d; + n === CameraEventType$1.LEFT_DRAG ? (l = ScreenSpaceEventType$1.LEFT_DOWN, d = ScreenSpaceEventType$1.LEFT_UP) : n === CameraEventType$1.RIGHT_DRAG ? (l = ScreenSpaceEventType$1.RIGHT_DOWN, d = ScreenSpaceEventType$1.RIGHT_UP) : n === CameraEventType$1.MIDDLE_DRAG && (l = ScreenSpaceEventType$1.MIDDLE_DOWN, d = ScreenSpaceEventType$1.MIDDLE_UP), e._eventHandler.setInputAction( + function(f) { + e._buttonsDown++, c.valid = !1, r[i] = !0, s[i] = /* @__PURE__ */ new Date(), Cartesian2.clone(f.position, o[i]); + }, + l, + t + ), e._eventHandler.setInputAction( + function() { + cancelMouseDownAction(getKey(n, void 0), e); + for (const f of Object.values(KeyboardEventModifier$1)) { + const h = getKey(n, f); + cancelMouseDownAction(h, e); + } + }, + d, + t + ); +} +function cancelMouseDownAction(e, t) { + const n = t._releaseTime, i = t._isDown; + i[e] && (t._buttonsDown = Math.max(t._buttonsDown - 1, 0)), i[e] = !1, n[e] = /* @__PURE__ */ new Date(); +} +function cloneMouseMovement(e, t) { + Cartesian2.clone(e.startPosition, t.startPosition), Cartesian2.clone(e.endPosition, t.endPosition); +} +function refreshMouseDownStatus(e, t, n) { + const i = n._isDown; + let r = !1; + const o = getKey(e, t); + for (const [l, d] of Object.entries(i)) + l.startsWith(e) && d && l !== o && (r = !0, cancelMouseDownAction(l, n)); + if (!r) + return; + const s = n._pressTime; + let c = n._lastMovement[o]; + defined(c) || (c = n._lastMovement[o] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2(), + valid: !1 + }), n._buttonsDown++, c.valid = !1, i[o] = !0, s[o] = /* @__PURE__ */ new Date(); +} +function listenMouseMove(e, t) { + const n = e._update, i = e._movement, r = e._lastMovement, o = e._isDown; + for (const s in CameraEventType$1) + if (CameraEventType$1.hasOwnProperty(s)) { + const c = CameraEventType$1[s]; + if (defined(c)) { + const l = getKey(c, t); + n[l] = !0, defined(e._lastMovement[l]) || (e._lastMovement[l] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2(), + valid: !1 + }), defined(e._movement[l]) || (e._movement[l] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2() + }); + } + } + e._eventHandler.setInputAction( + function(s) { + for (const c in CameraEventType$1) + if (CameraEventType$1.hasOwnProperty(c)) { + const l = CameraEventType$1[c]; + if (defined(l)) { + const d = getKey(l, t); + refreshMouseDownStatus(l, t, e), o[d] && (n[d] ? (cloneMouseMovement(i[d], r[d]), r[d].valid = !0, cloneMouseMovement(s, i[d]), n[d] = !1) : Cartesian2.clone( + s.endPosition, + i[d].endPosition + )); + } + } + Cartesian2.clone( + s.endPosition, + e._currentMousePosition + ); + }, + ScreenSpaceEventType$1.MOUSE_MOVE, + t + ); +} +function CameraEventAggregator(e) { + this._eventHandler = new ScreenSpaceEventHandler(e), this._update = {}, this._movement = {}, this._lastMovement = {}, this._isDown = {}, this._eventStartPosition = {}, this._pressTime = {}, this._releaseTime = {}, this._buttonsDown = 0, this._currentMousePosition = new Cartesian2(), listenToWheel(this, void 0), listenToPinch(this, void 0, e), listenMouseButtonDownUp(this, void 0, CameraEventType$1.LEFT_DRAG), listenMouseButtonDownUp(this, void 0, CameraEventType$1.RIGHT_DRAG), listenMouseButtonDownUp(this, void 0, CameraEventType$1.MIDDLE_DRAG), listenMouseMove(this, void 0); + for (const t in KeyboardEventModifier$1) + if (KeyboardEventModifier$1.hasOwnProperty(t)) { + const n = KeyboardEventModifier$1[t]; + defined(n) && (listenToWheel(this, n), listenToPinch(this, n, e), listenMouseButtonDownUp(this, n, CameraEventType$1.LEFT_DRAG), listenMouseButtonDownUp(this, n, CameraEventType$1.RIGHT_DRAG), listenMouseButtonDownUp(this, n, CameraEventType$1.MIDDLE_DRAG), listenMouseMove(this, n)); + } +} +Object.defineProperties(CameraEventAggregator.prototype, { + /** + * Gets the current mouse position. + * @memberof CameraEventAggregator.prototype + * @type {Cartesian2} + */ + currentMousePosition: { + get: function() { + return this._currentMousePosition; + } + }, + /** + * Gets whether any mouse button is down, a touch has started, or the wheel has been moved. + * @memberof CameraEventAggregator.prototype + * @type {boolean} + */ + anyButtonDown: { + get: function() { + const e = !this._update[getKey(CameraEventType$1.WHEEL)] || !this._update[getKey(CameraEventType$1.WHEEL, KeyboardEventModifier$1.SHIFT)] || !this._update[getKey(CameraEventType$1.WHEEL, KeyboardEventModifier$1.CTRL)] || !this._update[getKey(CameraEventType$1.WHEEL, KeyboardEventModifier$1.ALT)]; + return this._buttonsDown > 0 || e; + } + } +}); +CameraEventAggregator.prototype.isMoving = function(e, t) { + const n = getKey(e, t); + return !this._update[n]; +}; +CameraEventAggregator.prototype.getMovement = function(e, t) { + const n = getKey(e, t); + return this._movement[n]; +}; +CameraEventAggregator.prototype.getLastMovement = function(e, t) { + const n = getKey(e, t), i = this._lastMovement[n]; + if (i.valid) + return i; +}; +CameraEventAggregator.prototype.isButtonDown = function(e, t) { + const n = getKey(e, t); + return this._isDown[n]; +}; +CameraEventAggregator.prototype.getStartMousePosition = function(e, t) { + if (e === CameraEventType$1.WHEEL) + return this._currentMousePosition; + const n = getKey(e, t); + return this._eventStartPosition[n]; +}; +CameraEventAggregator.prototype.getButtonPressTime = function(e, t) { + const n = getKey(e, t); + return this._pressTime[n]; +}; +CameraEventAggregator.prototype.getButtonReleaseTime = function(e, t) { + const n = getKey(e, t); + return this._releaseTime[n]; +}; +CameraEventAggregator.prototype.reset = function() { + for (const e in this._update) + this._update.hasOwnProperty(e) && (this._update[e] = !0); +}; +CameraEventAggregator.prototype.isDestroyed = function() { + return !1; +}; +CameraEventAggregator.prototype.destroy = function() { + return this._eventHandler = this._eventHandler && this._eventHandler.destroy(), destroyObject(this); +}; +function Tween(e, t, n, i, r, o, s, c, l, d) { + this._tweens = e, this._tweenjs = t, this._startObject = clone$1(n), this._stopObject = clone$1(i), this._duration = r, this._delay = o, this._easingFunction = s, this._update = c, this._complete = l, this.cancel = d, this.needsStart = !0; +} +Object.defineProperties(Tween.prototype, { + /** + * An object with properties for initial values of the tween. The properties of this object are changed during the tween's animation. + * @memberof Tween.prototype + * + * @type {object} + * @readonly + */ + startObject: { + get: function() { + return this._startObject; + } + }, + /** + * An object with properties for the final values of the tween. + * @memberof Tween.prototype + * + * @type {object} + * @readonly + */ + stopObject: { + get: function() { + return this._stopObject; + } + }, + /** + * The duration, in seconds, for the tween. The tween is automatically removed from the collection when it stops. + * @memberof Tween.prototype + * + * @type {number} + * @readonly + */ + duration: { + get: function() { + return this._duration; + } + }, + /** + * The delay, in seconds, before the tween starts animating. + * @memberof Tween.prototype + * + * @type {number} + * @readonly + */ + delay: { + get: function() { + return this._delay; + } + }, + /** + * Determines the curve for animtion. + * @memberof Tween.prototype + * + * @type {EasingFunction} + * @readonly + */ + easingFunction: { + get: function() { + return this._easingFunction; + } + }, + /** + * The callback to call at each animation update (usually tied to the a rendered frame). + * @memberof Tween.prototype + * + * @type {TweenCollection.TweenUpdateCallback} + * @readonly + */ + update: { + get: function() { + return this._update; + } + }, + /** + * The callback to call when the tween finishes animating. + * @memberof Tween.prototype + * + * @type {TweenCollection.TweenCompleteCallback} + * @readonly + */ + complete: { + get: function() { + return this._complete; + } + }, + /** + * @memberof Tween.prototype + * + * @private + */ + tweenjs: { + get: function() { + return this._tweenjs; + } + } +}); +Tween.prototype.cancelTween = function() { + this._tweens.remove(this); +}; +function TweenCollection() { + this._tweens = []; +} +Object.defineProperties(TweenCollection.prototype, { + /** + * The number of tweens in the collection. + * @memberof TweenCollection.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._tweens.length; + } + } +}); +TweenCollection.prototype.add = function(e) { + if (e = defaultValue(e, defaultValue.EMPTY_OBJECT), e.duration === 0) + return defined(e.complete) && e.complete(), new Tween(this); + const t = e.duration / TimeConstants$1.SECONDS_PER_MILLISECOND, n = defaultValue(e.delay, 0), i = n / TimeConstants$1.SECONDS_PER_MILLISECOND, r = defaultValue( + e.easingFunction, + EasingFunction$1.LINEAR_NONE + ), o = e.startObject, s = new Tween$1(o); + s.to(clone$1(e.stopObject), t), s.delay(i), s.easing(r), defined(e.update) && s.onUpdate(function() { + e.update(o); + }), s.onComplete(defaultValue(e.complete, null)), s.repeat(defaultValue(e._repeat, 0)); + const c = new Tween( + this, + s, + e.startObject, + e.stopObject, + e.duration, + n, + r, + e.update, + e.complete, + e.cancel + ); + return this._tweens.push(c), c; +}; +TweenCollection.prototype.addProperty = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.object, n = e.property, i = e.startValue, r = e.stopValue; + function o(s) { + t[n] = s.value; + } + return this.add({ + startObject: { + value: i + }, + stopObject: { + value: r + }, + duration: defaultValue(e.duration, 3), + delay: e.delay, + easingFunction: e.easingFunction, + update: o, + complete: e.complete, + cancel: e.cancel, + _repeat: e._repeat + }); +}; +TweenCollection.prototype.addAlpha = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.material, n = []; + for (const r in t.uniforms) + t.uniforms.hasOwnProperty(r) && defined(t.uniforms[r]) && defined(t.uniforms[r].alpha) && n.push(r); + function i(r) { + const o = n.length; + for (let s = 0; s < o; ++s) + t.uniforms[n[s]].alpha = r.alpha; + } + return this.add({ + startObject: { + alpha: defaultValue(e.startValue, 0) + // Default to fade in + }, + stopObject: { + alpha: defaultValue(e.stopValue, 1) + }, + duration: defaultValue(e.duration, 3), + delay: e.delay, + easingFunction: e.easingFunction, + update: i, + complete: e.complete, + cancel: e.cancel + }); +}; +TweenCollection.prototype.addOffsetIncrement = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const n = e.material.uniforms; + return this.addProperty({ + object: n, + property: "offset", + startValue: n.offset, + stopValue: n.offset + 1, + duration: e.duration, + delay: e.delay, + easingFunction: e.easingFunction, + update: e.update, + cancel: e.cancel, + _repeat: 1 / 0 + }); +}; +TweenCollection.prototype.remove = function(e) { + if (!defined(e)) + return !1; + const t = this._tweens.indexOf(e); + return t !== -1 ? (e.tweenjs.stop(), defined(e.cancel) && e.cancel(), this._tweens.splice(t, 1), !0) : !1; +}; +TweenCollection.prototype.removeAll = function() { + const e = this._tweens; + for (let t = 0; t < e.length; ++t) { + const n = e[t]; + n.tweenjs.stop(), defined(n.cancel) && n.cancel(); + } + e.length = 0; +}; +TweenCollection.prototype.contains = function(e) { + return defined(e) && this._tweens.indexOf(e) !== -1; +}; +TweenCollection.prototype.get = function(e) { + return this._tweens[e]; +}; +TweenCollection.prototype.update = function(e) { + const t = this._tweens; + let n = 0; + for (e = defined(e) ? e / TimeConstants$1.SECONDS_PER_MILLISECOND : getTimestamp$1(); n < t.length; ) { + const i = t[n], r = i.tweenjs; + i.needsStart ? (i.needsStart = !1, r.start(e)) : r.update(e) ? n++ : (r.stop(), t.splice(n, 1)); + } +}; +function ScreenSpaceCameraController(e) { + this.enableInputs = !0, this.enableTranslate = !0, this.enableZoom = !0, this.enableRotate = !0, this.enableTilt = !0, this.enableLook = !0, this.inertiaSpin = 0.9, this.inertiaTranslate = 0.9, this.inertiaZoom = 0.8, this.maximumMovementRatio = 0.1, this.bounceAnimationTime = 3, this.minimumZoomDistance = 1, this.maximumZoomDistance = Number.POSITIVE_INFINITY, this.zoomFactor = 5, this.translateEventTypes = CameraEventType$1.LEFT_DRAG, this.zoomEventTypes = [ + CameraEventType$1.RIGHT_DRAG, + CameraEventType$1.WHEEL, + CameraEventType$1.PINCH + ], this.rotateEventTypes = CameraEventType$1.LEFT_DRAG, this.tiltEventTypes = [ + CameraEventType$1.MIDDLE_DRAG, + CameraEventType$1.PINCH, + { + eventType: CameraEventType$1.LEFT_DRAG, + modifier: KeyboardEventModifier$1.CTRL + }, + { + eventType: CameraEventType$1.RIGHT_DRAG, + modifier: KeyboardEventModifier$1.CTRL + } + ], this.lookEventTypes = { + eventType: CameraEventType$1.LEFT_DRAG, + modifier: KeyboardEventModifier$1.SHIFT + }; + const t = defaultValue(e.ellipsoid, Ellipsoid.default); + this.minimumPickingTerrainHeight = Ellipsoid.WGS84.equals(t) ? 15e4 : t.minimumRadius * 0.025, this._minimumPickingTerrainHeight = this.minimumPickingTerrainHeight, this.minimumPickingTerrainDistanceWithInertia = Ellipsoid.WGS84.equals( + t + ) ? 4e3 : t.minimumRadius * 63e-5, this.minimumCollisionTerrainHeight = Ellipsoid.WGS84.equals(t) ? 15e3 : t.minimumRadius * 25e-4, this._minimumCollisionTerrainHeight = this.minimumCollisionTerrainHeight, this.minimumTrackBallHeight = Ellipsoid.WGS84.equals(t) ? 75e5 : t.minimumRadius * 1.175, this._minimumTrackBallHeight = this.minimumTrackBallHeight, this.enableCollisionDetection = !0, this._scene = e, this._globe = void 0, this._ellipsoid = t, this._lastGlobeHeight = 0, this._aggregator = new CameraEventAggregator(e.canvas), this._lastInertiaSpinMovement = void 0, this._lastInertiaZoomMovement = void 0, this._lastInertiaTranslateMovement = void 0, this._lastInertiaTiltMovement = void 0, this._inertiaDisablers = { + _lastInertiaZoomMovement: [ + "_lastInertiaSpinMovement", + "_lastInertiaTranslateMovement", + "_lastInertiaTiltMovement" + ], + _lastInertiaTiltMovement: [ + "_lastInertiaSpinMovement", + "_lastInertiaTranslateMovement" + ] + }, this._tweens = new TweenCollection(), this._tween = void 0, this._horizontalRotationAxis = void 0, this._tiltCenterMousePosition = new Cartesian2(-1, -1), this._tiltCenter = new Cartesian3(), this._rotateMousePosition = new Cartesian2(-1, -1), this._rotateStartPosition = new Cartesian3(), this._strafeStartPosition = new Cartesian3(), this._strafeMousePosition = new Cartesian2(), this._strafeEndMousePosition = new Cartesian2(), this._zoomMouseStart = new Cartesian2(-1, -1), this._zoomWorldPosition = new Cartesian3(), this._useZoomWorldPosition = !1, this._panLastMousePosition = new Cartesian2(), this._panLastWorldPosition = new Cartesian3(), this._tiltCVOffMap = !1, this._looking = !1, this._rotating = !1, this._strafing = !1, this._zoomingOnVector = !1, this._zoomingUnderground = !1, this._rotatingZoom = !1, this._adjustedHeightForTerrain = !1, this._cameraUnderground = !1; + const n = e.mapProjection; + this._maxCoord = n.project( + new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO) + ), this._rotateFactor = void 0, this._rotateRateRangeAdjustment = void 0, this._maximumRotateRate = 1.77, this._minimumRotateRate = 1 / 5e3, this._minimumZoomRate = 20, this._maximumZoomRate = 5906376272e3, this._minimumUndergroundPickDistance = 2e3, this._maximumUndergroundPickDistance = 1e4; +} +function decay(e, t) { + if (e < 0) + return 0; + const n = (1 - t) * 25; + return Math.exp(-n * e); +} +function sameMousePosition(e) { + return Cartesian2.equalsEpsilon( + e.startPosition, + e.endPosition, + CesiumMath.EPSILON14 + ); +} +const inertiaMaxClickTimeThreshold = 0.4; +function maintainInertia(e, t, n, i, r, o, s) { + let c = o[s]; + defined(c) || (c = o[s] = { + startPosition: new Cartesian2(), + endPosition: new Cartesian2(), + motion: new Cartesian2(), + inertiaEnabled: !0 + }); + const l = e.getButtonPressTime(t, n), d = e.getButtonReleaseTime(t, n), f = l && d && (d.getTime() - l.getTime()) / 1e3, p = d && ((/* @__PURE__ */ new Date()).getTime() - d.getTime()) / 1e3; + if (l && d && f < inertiaMaxClickTimeThreshold) { + const m = decay(p, i), _ = e.getLastMovement(t, n); + if (!defined(_) || sameMousePosition(_) || !c.inertiaEnabled || (c.motion.x = (_.endPosition.x - _.startPosition.x) * 0.5, c.motion.y = (_.endPosition.y - _.startPosition.y) * 0.5, c.startPosition = Cartesian2.clone( + _.startPosition, + c.startPosition + ), c.endPosition = Cartesian2.multiplyByScalar( + c.motion, + m, + c.endPosition + ), c.endPosition = Cartesian2.add( + c.startPosition, + c.endPosition, + c.endPosition + ), isNaN(c.endPosition.x) || isNaN(c.endPosition.y) || Cartesian2.distance( + c.startPosition, + c.endPosition + ) < 0.5)) + return; + if (!e.isButtonDown(t, n)) { + const y = e.getStartMousePosition(t, n); + r(o, y, c); + } + } +} +function activateInertia(e, t) { + if (defined(t)) { + let n = e[t]; + defined(n) && (n.inertiaEnabled = !0); + const i = e._inertiaDisablers[t]; + if (defined(i)) { + const r = i.length; + for (let o = 0; o < r; ++o) + n = e[i[o]], defined(n) && (n.inertiaEnabled = !1); + } + } +} +const scratchEventTypeArray = []; +function reactToInput(e, t, n, i, r, o) { + if (!defined(n)) + return; + const s = e._aggregator; + Array.isArray(n) || (scratchEventTypeArray[0] = n, n = scratchEventTypeArray); + const c = n.length; + for (let l = 0; l < c; ++l) { + const d = n[l], f = defined(d.eventType) ? d.eventType : d, h = d.modifier, p = s.isMoving(f, h) && s.getMovement(f, h), m = s.getStartMousePosition(f, h); + e.enableInputs && t && (p ? (i(e, m, p), activateInertia(e, o)) : r < 1 && maintainInertia( + s, + f, + h, + r, + i, + e, + o + )); + } +} +const scratchZoomPickRay = new Ray(), scratchPickCartesian = new Cartesian3(), scratchZoomOffset = new Cartesian2(), scratchZoomDirection = new Cartesian3(), scratchCenterPixel = new Cartesian2(), scratchCenterPosition = new Cartesian3(), scratchPositionNormal = new Cartesian3(), scratchPickNormal = new Cartesian3(), scratchZoomAxis = new Cartesian3(), scratchCameraPositionNormal = new Cartesian3(), scratchTargetNormal = new Cartesian3(), scratchCameraPosition = new Cartesian3(), scratchCameraUpNormal = new Cartesian3(), scratchCameraRightNormal = new Cartesian3(), scratchForwardNormal = new Cartesian3(), scratchPositionToTarget = new Cartesian3(), scratchPositionToTargetNormal = new Cartesian3(), scratchPan = new Cartesian3(), scratchCenterMovement = new Cartesian3(), scratchCenter$1 = new Cartesian3(), scratchCartesian = new Cartesian3(), scratchCartesianTwo = new Cartesian3(), scratchCartesianThree = new Cartesian3(), scratchZoomViewOptions = { + orientation: new HeadingPitchRoll() +}; +function handleZoom(e, t, n, i, r, o) { + let s = 1; + defined(o) && (s = CesiumMath.clamp( + Math.abs(o), + 0.25, + 1 + )); + const c = n.endPosition.y - n.startPosition.y, d = c > 0 ? e.minimumZoomDistance * s : 0, f = e.maximumZoomDistance, h = r - d; + let p = i * h; + p = CesiumMath.clamp( + p, + e._minimumZoomRate, + e._maximumZoomRate + ); + let m = c / e._scene.canvas.clientHeight; + m = Math.min(m, e.maximumMovementRatio); + let _ = p * m; + if (e.enableCollisionDetection || e.minimumZoomDistance === 0 || !defined(e._globe)) { + if (_ > 0 && Math.abs(r - d) < 1 || _ < 0 && Math.abs(r - f) < 1) + return; + r - _ < d ? _ = r - d - 1 : r - _ > f && (_ = r - f); + } + const y = e._scene, C = y.camera, T = y.mode, x = scratchZoomViewOptions.orientation; + if (x.heading = C.heading, x.pitch = C.pitch, x.roll = C.roll, C.frustum instanceof OrthographicFrustum) { + Math.abs(_) > 0 && (C.zoomIn(_), C._adjustOrthographicFrustum(!0)); + return; + } + const b = defaultValue( + n.inertiaEnabled, + Cartesian2.equals(t, e._zoomMouseStart) + ); + let S = e._zoomingOnVector, E = e._rotatingZoom, A; + if (b || (e._zoomMouseStart = Cartesian2.clone( + t, + e._zoomMouseStart + ), defined(e._globe) && T === SceneMode$1.SCENE2D ? (A = C.getPickRay(t, scratchZoomPickRay).origin, A = Cartesian3.fromElements( + A.y, + A.z, + A.x + )) : defined(e._globe) && (A = pickPosition( + e, + t, + scratchPickCartesian + )), defined(A) ? (e._useZoomWorldPosition = !0, e._zoomWorldPosition = Cartesian3.clone( + A, + e._zoomWorldPosition + )) : e._useZoomWorldPosition = !1, S = e._zoomingOnVector = !1, E = e._rotatingZoom = !1, e._zoomingUnderground = e._cameraUnderground), !e._useZoomWorldPosition) { + C.zoomIn(_); + return; + } + let D = T === SceneMode$1.COLUMBUS_VIEW; + if (C.positionCartographic.height < 2e6 && (E = !0), !b || E) { + if (T === SceneMode$1.SCENE2D) { + const P = e._zoomWorldPosition, I = C.position; + if (!Cartesian3.equals(P, I) && C.positionCartographic.height < e._maxCoord.x * 2) { + const M = C.position.x, R = Cartesian3.subtract( + P, + I, + scratchZoomDirection + ); + Cartesian3.normalize(R, R); + const L = Cartesian3.distance(P, I) * _ / (C.getMagnitude() * 0.5); + C.move(R, L * 0.5), (C.position.x < 0 && M > 0 || C.position.x > 0 && M < 0) && (A = C.getPickRay(t, scratchZoomPickRay).origin, A = Cartesian3.fromElements( + A.y, + A.z, + A.x + ), e._zoomWorldPosition = Cartesian3.clone( + A, + e._zoomWorldPosition + )); + } + } else if (T === SceneMode$1.SCENE3D) { + const P = Cartesian3.normalize( + C.position, + scratchCameraPositionNormal + ); + if (e._cameraUnderground || e._zoomingUnderground || C.positionCartographic.height < 3e3 && Math.abs(Cartesian3.dot(C.direction, P)) < 0.6) + D = !0; + else { + const I = y.canvas, M = scratchCenterPixel; + M.x = I.clientWidth / 2, M.y = I.clientHeight / 2; + const R = pickPosition( + e, + M, + scratchCenterPosition + ); + if (!defined(R)) + D = !0; + else if (C.positionCartographic.height < 1e6) + if (Cartesian3.dot(C.direction, P) >= -0.5) + D = !0; + else { + const L = scratchCameraPosition; + Cartesian3.clone(C.position, L); + const g = e._zoomWorldPosition; + let w = scratchTargetNormal; + if (w = Cartesian3.normalize(g, w), Cartesian3.dot(w, P) < 0) + return; + const O = scratchCenter$1, N = scratchForwardNormal; + Cartesian3.clone(C.direction, N), Cartesian3.add( + L, + Cartesian3.multiplyByScalar(N, 1e3, scratchCartesian), + O + ); + const F = scratchPositionToTarget, B = scratchPositionToTargetNormal; + Cartesian3.subtract(g, L, F), Cartesian3.normalize(F, B); + const V = Cartesian3.dot( + P, + B + ); + if (V >= 0) { + e._zoomMouseStart.x = -1; + return; + } + const U = Math.acos(-V), k = Cartesian3.magnitude(L), $ = Cartesian3.magnitude(g), G = k - _, q = Cartesian3.magnitude( + F + ), z = Math.asin( + CesiumMath.clamp( + q / $ * Math.sin(U), + -1, + 1 + ) + ), H = Math.asin( + CesiumMath.clamp( + G / $ * Math.sin(U), + -1, + 1 + ) + ), Q = z - H + U, ne = scratchCameraUpNormal; + Cartesian3.normalize(L, ne); + let K = scratchCameraRightNormal; + K = Cartesian3.cross(B, ne, K), K = Cartesian3.normalize(K, K), Cartesian3.normalize( + Cartesian3.cross(ne, K, scratchCartesian), + N + ), Cartesian3.multiplyByScalar( + Cartesian3.normalize(O, scratchCartesian), + Cartesian3.magnitude(O) - _, + O + ), Cartesian3.normalize(L, L), Cartesian3.multiplyByScalar( + L, + G, + L + ); + const Z = scratchPan; + Cartesian3.multiplyByScalar( + Cartesian3.add( + Cartesian3.multiplyByScalar( + ne, + Math.cos(Q) - 1, + scratchCartesianTwo + ), + Cartesian3.multiplyByScalar( + N, + Math.sin(Q), + scratchCartesianThree + ), + scratchCartesian + ), + G, + Z + ), Cartesian3.add(L, Z, L), Cartesian3.normalize(O, ne), Cartesian3.normalize( + Cartesian3.cross(ne, K, scratchCartesian), + N + ); + const ee = scratchCenterMovement; + Cartesian3.multiplyByScalar( + Cartesian3.add( + Cartesian3.multiplyByScalar( + ne, + Math.cos(Q) - 1, + scratchCartesianTwo + ), + Cartesian3.multiplyByScalar( + N, + Math.sin(Q), + scratchCartesianThree + ), + scratchCartesian + ), + Cartesian3.magnitude(O), + ee + ), Cartesian3.add(O, ee, O), Cartesian3.clone(L, C.position), Cartesian3.normalize( + Cartesian3.subtract(O, L, scratchCartesian), + C.direction + ), Cartesian3.clone(C.direction, C.direction), Cartesian3.cross(C.direction, C.up, C.right), Cartesian3.cross(C.right, C.direction, C.up), C.setView(scratchZoomViewOptions); + return; + } + else { + const L = Cartesian3.normalize( + R, + scratchPositionNormal + ), g = Cartesian3.normalize( + e._zoomWorldPosition, + scratchPickNormal + ), w = Cartesian3.dot(g, L); + if (w > 0 && w < 1) { + const O = CesiumMath.acosClamped(w), N = Cartesian3.cross( + g, + L, + scratchZoomAxis + ), F = Math.abs(O) > CesiumMath.toRadians(20) ? C.positionCartographic.height * 0.75 : C.positionCartographic.height - _, B = _ / F; + C.rotate(N, O * B); + } + } + } + } + e._rotatingZoom = !D; + } + if (!b && D || S) { + let P; + const I = SceneTransforms.worldToWindowCoordinates( + y, + e._zoomWorldPosition, + scratchZoomOffset + ); + T !== SceneMode$1.COLUMBUS_VIEW && Cartesian2.equals(t, e._zoomMouseStart) && defined(I) ? P = C.getPickRay(I, scratchZoomPickRay) : P = C.getPickRay(t, scratchZoomPickRay); + const M = P.direction; + (T === SceneMode$1.COLUMBUS_VIEW || T === SceneMode$1.SCENE2D) && Cartesian3.fromElements( + M.y, + M.z, + M.x, + M + ), C.move(M, _), e._zoomingOnVector = !0; + } else + C.zoomIn(_); + e._cameraUnderground || C.setView(scratchZoomViewOptions); +} +const translate2DStart = new Ray(), translate2DEnd = new Ray(), scratchTranslateP0 = new Cartesian3(); +function translate2D(e, t, n) { + const r = e._scene.camera; + let o = r.getPickRay(n.startPosition, translate2DStart).origin, s = r.getPickRay(n.endPosition, translate2DEnd).origin; + o = Cartesian3.fromElements(o.y, o.z, o.x, o), s = Cartesian3.fromElements(s.y, s.z, s.x, s); + const c = Cartesian3.subtract(o, s, scratchTranslateP0), l = Cartesian3.magnitude(c); + l > 0 && (Cartesian3.normalize(c, c), r.move(c, l)); +} +function zoom2D(e, t, n) { + defined(n.distance) && (n = n.distance); + const r = e._scene.camera; + handleZoom( + e, + t, + n, + e.zoomFactor, + r.getMagnitude() + ); +} +const twist2DStart = new Cartesian2(), twist2DEnd = new Cartesian2(); +function twist2D(e, t, n) { + if (defined(n.angleAndHeight)) { + singleAxisTwist2D(e, t, n.angleAndHeight); + return; + } + const i = e._scene, r = i.camera, o = i.canvas, s = o.clientWidth, c = o.clientHeight; + let l = twist2DStart; + l.x = 2 / s * n.startPosition.x - 1, l.y = 2 / c * (c - n.startPosition.y) - 1, l = Cartesian2.normalize(l, l); + let d = twist2DEnd; + d.x = 2 / s * n.endPosition.x - 1, d.y = 2 / c * (c - n.endPosition.y) - 1, d = Cartesian2.normalize(d, d); + let f = CesiumMath.acosClamped(l.x); + l.y < 0 && (f = CesiumMath.TWO_PI - f); + let h = CesiumMath.acosClamped(d.x); + d.y < 0 && (h = CesiumMath.TWO_PI - h); + const p = h - f; + r.twistRight(p); +} +function singleAxisTwist2D(e, t, n) { + let i = e._rotateFactor * e._rotateRateRangeAdjustment; + i > e._maximumRotateRate && (i = e._maximumRotateRate), i < e._minimumRotateRate && (i = e._minimumRotateRate); + const r = e._scene, o = r.camera, s = r.canvas; + let c = (n.endPosition.x - n.startPosition.x) / s.clientWidth; + c = Math.min(c, e.maximumMovementRatio); + const l = i * c * Math.PI * 4; + o.twistRight(l); +} +function update2D(e) { + const t = e._scene.mapMode2D === MapMode2D$1.ROTATE; + Matrix4.equals(Matrix4.IDENTITY, e._scene.camera.transform) ? (reactToInput( + e, + e.enableTranslate, + e.translateEventTypes, + translate2D, + e.inertiaTranslate, + "_lastInertiaTranslateMovement" + ), reactToInput( + e, + e.enableZoom, + e.zoomEventTypes, + zoom2D, + e.inertiaZoom, + "_lastInertiaZoomMovement" + ), t && reactToInput( + e, + e.enableRotate, + e.tiltEventTypes, + twist2D, + e.inertiaSpin, + "_lastInertiaTiltMovement" + )) : (reactToInput( + e, + e.enableZoom, + e.zoomEventTypes, + zoom2D, + e.inertiaZoom, + "_lastInertiaZoomMovement" + ), t && reactToInput( + e, + e.enableRotate, + e.translateEventTypes, + twist2D, + e.inertiaSpin, + "_lastInertiaSpinMovement" + )); +} +const pickGlobeScratchRay = new Ray(), scratchDepthIntersection = new Cartesian3(), scratchRayIntersection = new Cartesian3(); +function pickPosition(e, t, n) { + const i = e._scene, r = e._globe, o = i.camera; + let s; + if (i.pickPositionSupported && (s = i.pickPositionWorldCoordinates( + t, + scratchDepthIntersection + )), !defined(r)) + return Cartesian3.clone(s, n); + const c = !e._cameraUnderground, l = o.getPickRay(t, pickGlobeScratchRay), d = r.pickWorldCoordinates( + l, + i, + c, + scratchRayIntersection + ), f = defined(s) ? Cartesian3.distance(s, o.positionWC) : Number.POSITIVE_INFINITY, h = defined(d) ? Cartesian3.distance(d, o.positionWC) : Number.POSITIVE_INFINITY; + return f < h ? Cartesian3.clone(s, n) : Cartesian3.clone(d, n); +} +const scratchDistanceCartographic = new Cartographic(); +function getDistanceFromSurface(e) { + const t = e._ellipsoid, n = e._scene, i = n.camera, r = n.mode; + let o = 0; + if (r === SceneMode$1.SCENE3D) { + const l = t.cartesianToCartographic( + i.position, + scratchDistanceCartographic + ); + defined(l) && (o = l.height); + } else + o = i.position.z; + const s = defaultValue(e._scene.globeHeight, 0); + return Math.abs(s - o); +} +const scratchSurfaceNormal = new Cartesian3(); +function getZoomDistanceUnderground(e, t) { + const n = t.origin, i = t.direction, r = getDistanceFromSurface(e), o = Cartesian3.normalize(n, scratchSurfaceNormal); + let s = Math.abs(Cartesian3.dot(o, i)); + return s = Math.max(s, 0.5) * 2, r * s; +} +function getTiltCenterUnderground(e, t, n, i) { + let r = Cartesian3.distance(t.origin, n); + const o = getDistanceFromSurface(e), s = CesiumMath.clamp( + o * 5, + e._minimumUndergroundPickDistance, + e._maximumUndergroundPickDistance + ); + return r > s && (r = Math.min(r, o / 5), r = Math.max(r, 100)), Ray.getPoint(t, r, i); +} +function getStrafeStartPositionUnderground(e, t, n, i) { + let r; + return defined(n) ? (r = Cartesian3.distance(t.origin, n), r > e._maximumUndergroundPickDistance && (r = getDistanceFromSurface(e))) : r = getDistanceFromSurface(e), Ray.getPoint(t, r, i); +} +const scratchInertialDelta = new Cartesian2(); +function continueStrafing(e, t) { + const n = t.endPosition, i = Cartesian2.subtract( + t.endPosition, + t.startPosition, + scratchInertialDelta + ), r = e._strafeEndMousePosition; + Cartesian2.add(r, i, r), t.endPosition = r, strafe(e, t, e._strafeStartPosition), t.endPosition = n; +} +const translateCVStartRay = new Ray(), translateCVEndRay = new Ray(), translateCVStartPos = new Cartesian3(), translateCVEndPos = new Cartesian3(), translateCVDifference = new Cartesian3(), translateCVOrigin = new Cartesian3(), translateCVPlane = new Plane(Cartesian3.UNIT_X, 0), translateCVStartMouse = new Cartesian2(), translateCVEndMouse = new Cartesian2(); +function translateCV(e, t, n) { + if (Cartesian3.equals(t, e._translateMousePosition) || (e._looking = !1), Cartesian3.equals(t, e._strafeMousePosition) || (e._strafing = !1), e._looking) { + look3D(e, t, n); + return; + } + if (e._strafing) { + continueStrafing(e, n); + return; + } + const r = e._scene.camera, o = e._cameraUnderground, s = Cartesian2.clone( + n.startPosition, + translateCVStartMouse + ), c = Cartesian2.clone(n.endPosition, translateCVEndMouse); + let l = r.getPickRay(s, translateCVStartRay); + const d = Cartesian3.clone(Cartesian3.ZERO, translateCVOrigin), f = Cartesian3.UNIT_X; + let h; + if (r.position.z < e._minimumPickingTerrainHeight && (h = pickPosition(e, s, translateCVStartPos), defined(h) && (d.x = h.x)), o || d.x > r.position.z && defined(h)) { + let b = h; + o && (b = getStrafeStartPositionUnderground( + e, + l, + h, + translateCVStartPos + )), Cartesian2.clone(t, e._strafeMousePosition), Cartesian2.clone(t, e._strafeEndMousePosition), Cartesian3.clone(b, e._strafeStartPosition), e._strafing = !0, strafe(e, n, e._strafeStartPosition); + return; + } + const p = Plane.fromPointNormal(d, f, translateCVPlane); + l = r.getPickRay(s, translateCVStartRay); + const m = IntersectionTests.rayPlane( + l, + p, + translateCVStartPos + ), _ = r.getPickRay(c, translateCVEndRay), y = IntersectionTests.rayPlane( + _, + p, + translateCVEndPos + ); + if (!defined(m) || !defined(y)) { + e._looking = !0, look3D(e, t, n), Cartesian2.clone(t, e._translateMousePosition); + return; + } + const C = Cartesian3.subtract( + m, + y, + translateCVDifference + ), T = C.x; + C.x = C.y, C.y = C.z, C.z = T; + const x = Cartesian3.magnitude(C); + x > CesiumMath.EPSILON6 && (Cartesian3.normalize(C, C), r.move(C, x)); +} +const rotateCVWindowPos = new Cartesian2(), rotateCVWindowRay = new Ray(), rotateCVCenter = new Cartesian3(), rotateCVVerticalCenter = new Cartesian3(), rotateCVTransform = new Matrix4(), rotateCVVerticalTransform = new Matrix4(), rotateCVOrigin = new Cartesian3(), rotateCVPlane = new Plane(Cartesian3.UNIT_X, 0), rotateCVCartesian3 = new Cartesian3(), rotateCVCart = new Cartographic(), rotateCVOldTransform = new Matrix4(), rotateCVQuaternion = new Quaternion(), rotateCVMatrix = new Matrix3(), tilt3DCartesian3 = new Cartesian3(); +function rotateCV(e, t, n) { + if (defined(n.angleAndHeight) && (n = n.angleAndHeight), Cartesian2.equals(t, e._tiltCenterMousePosition) || (e._tiltCVOffMap = !1, e._looking = !1), e._looking) { + look3D(e, t, n); + return; + } + const r = e._scene.camera; + e._tiltCVOffMap || !e.onMap() || Math.abs(r.position.z) > e._minimumPickingTerrainHeight ? (e._tiltCVOffMap = !0, rotateCVOnPlane(e, t, n)) : rotateCVOnTerrain(e, t, n); +} +function rotateCVOnPlane(e, t, n) { + const i = e._scene, r = i.camera, o = i.canvas, s = rotateCVWindowPos; + s.x = o.clientWidth / 2, s.y = o.clientHeight / 2; + const c = r.getPickRay(s, rotateCVWindowRay), l = Cartesian3.UNIT_X, d = c.origin, f = c.direction; + let h; + const p = Cartesian3.dot(l, f); + if (Math.abs(p) > CesiumMath.EPSILON6 && (h = -Cartesian3.dot(l, d) / p), !defined(h) || h <= 0) { + e._looking = !0, look3D(e, t, n), Cartesian2.clone(t, e._tiltCenterMousePosition); + return; + } + const m = Cartesian3.multiplyByScalar(f, h, rotateCVCenter); + Cartesian3.add(d, m, m); + const _ = i.mapProjection, y = _.ellipsoid; + Cartesian3.fromElements(m.y, m.z, m.x, m); + const C = _.unproject(m, rotateCVCart); + y.cartographicToCartesian(C, m); + const T = Transforms.eastNorthUpToFixedFrame( + m, + y, + rotateCVTransform + ), x = e._globe, b = e._ellipsoid; + e._globe = void 0, e._ellipsoid = Ellipsoid.UNIT_SPHERE, e._rotateFactor = 1, e._rotateRateRangeAdjustment = 1; + const S = Matrix4.clone(r.transform, rotateCVOldTransform); + r._setTransform(T), rotate3D(e, t, n, Cartesian3.UNIT_Z), r._setTransform(S), e._globe = x, e._ellipsoid = b; + const E = b.maximumRadius; + e._rotateFactor = 1 / E, e._rotateRateRangeAdjustment = E; +} +function rotateCVOnTerrain(e, t, n) { + const i = e._scene, r = i.camera, o = e._cameraUnderground; + let s, c; + const l = Cartesian3.UNIT_X; + if (Cartesian2.equals(t, e._tiltCenterMousePosition)) + s = Cartesian3.clone(e._tiltCenter, rotateCVCenter); + else { + if (r.position.z < e._minimumPickingTerrainHeight && (s = pickPosition(e, t, rotateCVCenter)), !defined(s)) { + c = r.getPickRay(t, rotateCVWindowRay); + const R = c.origin, L = c.direction; + let g; + const w = Cartesian3.dot(l, L); + if (Math.abs(w) > CesiumMath.EPSILON6 && (g = -Cartesian3.dot(l, R) / w), !defined(g) || g <= 0) { + e._looking = !0, look3D(e, t, n), Cartesian2.clone(t, e._tiltCenterMousePosition); + return; + } + s = Cartesian3.multiplyByScalar(L, g, rotateCVCenter), Cartesian3.add(R, s, s); + } + o && (defined(c) || (c = r.getPickRay(t, rotateCVWindowRay)), getTiltCenterUnderground(e, c, s, s)), Cartesian2.clone(t, e._tiltCenterMousePosition), Cartesian3.clone(s, e._tiltCenter); + } + const d = i.canvas, f = rotateCVWindowPos; + f.x = d.clientWidth / 2, f.y = e._tiltCenterMousePosition.y, c = r.getPickRay(f, rotateCVWindowRay); + const h = Cartesian3.clone(Cartesian3.ZERO, rotateCVOrigin); + h.x = s.x; + const p = Plane.fromPointNormal(h, l, rotateCVPlane), m = IntersectionTests.rayPlane( + c, + p, + rotateCVVerticalCenter + ), _ = r._projection, y = _.ellipsoid; + Cartesian3.fromElements(s.y, s.z, s.x, s); + let C = _.unproject(s, rotateCVCart); + y.cartographicToCartesian(C, s); + const T = Transforms.eastNorthUpToFixedFrame( + s, + y, + rotateCVTransform + ); + let x; + defined(m) ? (Cartesian3.fromElements( + m.y, + m.z, + m.x, + m + ), C = _.unproject(m, rotateCVCart), y.cartographicToCartesian(C, m), x = Transforms.eastNorthUpToFixedFrame( + m, + y, + rotateCVVerticalTransform + )) : x = T; + const b = e._globe, S = e._ellipsoid; + e._globe = void 0, e._ellipsoid = Ellipsoid.UNIT_SPHERE, e._rotateFactor = 1, e._rotateRateRangeAdjustment = 1; + let E = Cartesian3.UNIT_Z; + const A = Matrix4.clone(r.transform, rotateCVOldTransform); + r._setTransform(T); + const D = Cartesian3.cross( + Cartesian3.UNIT_Z, + Cartesian3.normalize(r.position, rotateCVCartesian3), + rotateCVCartesian3 + ), P = Cartesian3.dot(r.right, D); + if (rotate3D(e, t, n, E, !1, !0), r._setTransform(x), P < 0) { + const R = n.startPosition.y - n.endPosition.y; + (o && R < 0 || !o && R > 0) && (E = void 0); + const L = r.constrainedAxis; + r.constrainedAxis = void 0, rotate3D(e, t, n, E, !0, !1), r.constrainedAxis = L; + } else + rotate3D(e, t, n, E, !0, !1); + if (defined(r.constrainedAxis)) { + const R = Cartesian3.cross( + r.direction, + r.constrainedAxis, + tilt3DCartesian3 + ); + Cartesian3.equalsEpsilon(R, Cartesian3.ZERO, CesiumMath.EPSILON6) || (Cartesian3.dot(R, r.right) < 0 && Cartesian3.negate(R, R), Cartesian3.cross(R, r.direction, r.up), Cartesian3.cross(r.direction, r.up, r.right), Cartesian3.normalize(r.up, r.up), Cartesian3.normalize(r.right, r.right)); + } + r._setTransform(A), e._globe = b, e._ellipsoid = S; + const I = S.maximumRadius; + e._rotateFactor = 1 / I, e._rotateRateRangeAdjustment = I; + const M = Cartesian3.clone( + r.positionWC, + rotateCVCartesian3 + ); + if (e.enableCollisionDetection && adjustHeightForTerrain(e, !0), !Cartesian3.equals(r.positionWC, M)) { + r._setTransform(x), r.worldToCameraCoordinatesPoint(M, M); + const R = Cartesian3.magnitudeSquared(M); + Cartesian3.magnitudeSquared(r.position) > R && (Cartesian3.normalize(r.position, r.position), Cartesian3.multiplyByScalar( + r.position, + Math.sqrt(R), + r.position + )); + const L = Cartesian3.angleBetween(M, r.position), g = Cartesian3.cross( + M, + r.position, + M + ); + Cartesian3.normalize(g, g); + const w = Quaternion.fromAxisAngle( + g, + L, + rotateCVQuaternion + ), O = Matrix3.fromQuaternion(w, rotateCVMatrix); + Matrix3.multiplyByVector(O, r.direction, r.direction), Matrix3.multiplyByVector(O, r.up, r.up), Cartesian3.cross(r.direction, r.up, r.right), Cartesian3.cross(r.right, r.direction, r.up), r._setTransform(A); + } +} +const zoomCVWindowPos = new Cartesian2(), zoomCVWindowRay = new Ray(), zoomCVIntersection = new Cartesian3(); +function zoomCV(e, t, n) { + defined(n.distance) && (n = n.distance); + const i = e._scene, r = i.camera, o = i.canvas, s = e._cameraUnderground; + let c; + s ? c = t : (c = zoomCVWindowPos, c.x = o.clientWidth / 2, c.y = o.clientHeight / 2); + const l = r.getPickRay(c, zoomCVWindowRay), d = l.origin, f = l.direction, h = r.position.z; + let p; + h < e._minimumPickingTerrainHeight && (p = pickPosition(e, c, zoomCVIntersection)); + let m; + if (defined(p) && (m = Cartesian3.distance(d, p)), s) { + const _ = getZoomDistanceUnderground( + e, + l + ); + defined(m) ? m = Math.min(m, _) : m = _; + } + if (!defined(m)) { + const _ = Cartesian3.UNIT_X; + m = -Cartesian3.dot(_, d) / Cartesian3.dot(_, f); + } + handleZoom( + e, + t, + n, + e.zoomFactor, + m + ); +} +function updateCV(e) { + const n = e._scene.camera; + if (!Matrix4.equals(Matrix4.IDENTITY, n.transform)) + reactToInput( + e, + e.enableRotate, + e.rotateEventTypes, + rotate3D, + e.inertiaSpin, + "_lastInertiaSpinMovement" + ), reactToInput( + e, + e.enableZoom, + e.zoomEventTypes, + zoom3D, + e.inertiaZoom, + "_lastInertiaZoomMovement" + ); + else { + const i = e._tweens; + if (e._aggregator.anyButtonDown && i.removeAll(), reactToInput( + e, + e.enableTilt, + e.tiltEventTypes, + rotateCV, + e.inertiaSpin, + "_lastInertiaTiltMovement" + ), reactToInput( + e, + e.enableTranslate, + e.translateEventTypes, + translateCV, + e.inertiaTranslate, + "_lastInertiaTranslateMovement" + ), reactToInput( + e, + e.enableZoom, + e.zoomEventTypes, + zoomCV, + e.inertiaZoom, + "_lastInertiaZoomMovement" + ), reactToInput( + e, + e.enableLook, + e.lookEventTypes, + look3D + ), !e._aggregator.anyButtonDown && !i.contains(e._tween)) { + const r = n.createCorrectPositionTween( + e.bounceAnimationTime + ); + defined(r) && (e._tween = i.add(r)); + } + i.update(); + } +} +const scratchStrafeRay = new Ray(), scratchStrafePlane = new Plane(Cartesian3.UNIT_X, 0), scratchStrafeIntersection = new Cartesian3(), scratchStrafeDirection = new Cartesian3(); +function strafe(e, t, n) { + const i = e._scene, r = i.camera, o = r.getPickRay(t.endPosition, scratchStrafeRay); + let s = Cartesian3.clone(r.direction, scratchStrafeDirection); + i.mode === SceneMode$1.COLUMBUS_VIEW && Cartesian3.fromElements(s.z, s.x, s.y, s); + const c = Plane.fromPointNormal( + n, + s, + scratchStrafePlane + ), l = IntersectionTests.rayPlane( + o, + c, + scratchStrafeIntersection + ); + defined(l) && (s = Cartesian3.subtract(n, l, s), i.mode === SceneMode$1.COLUMBUS_VIEW && Cartesian3.fromElements(s.y, s.z, s.x, s), Cartesian3.add(r.position, s, r.position)); +} +const spin3DPick = new Cartesian3(), scratchCartographic = new Cartographic(), scratchRadii = new Cartesian3(), scratchEllipsoid = new Ellipsoid(), scratchLookUp = new Cartesian3(), scratchNormal$1 = new Cartesian3(), scratchMousePosition = new Cartesian3(); +function spin3D(e, t, n) { + const r = e._scene.camera, o = e._cameraUnderground; + let s = e._ellipsoid; + if (!Matrix4.equals(r.transform, Matrix4.IDENTITY)) { + rotate3D(e, t, n); + return; + } + let c, l; + const d = s.geodeticSurfaceNormal(r.position, scratchLookUp); + if (Cartesian2.equals(t, e._rotateMousePosition)) { + if (e._looking) + look3D(e, t, n, d); + else if (e._rotating) + rotate3D(e, t, n); + else if (e._strafing) + continueStrafing(e, n); + else { + if (Cartesian3.magnitude(r.position) < Cartesian3.magnitude(e._rotateStartPosition)) + return; + c = Cartesian3.magnitude(e._rotateStartPosition), l = scratchRadii, l.x = l.y = l.z = c, s = Ellipsoid.fromCartesian3(l, scratchEllipsoid), pan3D(e, t, n, s); + } + return; + } + e._looking = !1, e._rotating = !1, e._strafing = !1; + const f = s.cartesianToCartographic( + r.positionWC, + scratchCartographic + ).height, h = e._globe; + if (defined(h) && f < e._minimumPickingTerrainHeight) { + const p = pickPosition( + e, + n.startPosition, + scratchMousePosition + ); + if (defined(p)) { + let m = !1; + const _ = r.getPickRay( + n.startPosition, + pickGlobeScratchRay + ); + if (o) + m = !0, getStrafeStartPositionUnderground(e, _, p, p); + else { + const y = s.geodeticSurfaceNormal(p, scratchNormal$1); + Math.abs(Cartesian3.dot(_.direction, y)) < 0.05 ? m = !0 : m = Cartesian3.magnitude(r.position) < Cartesian3.magnitude(p); + } + m ? (Cartesian2.clone(t, e._strafeEndMousePosition), Cartesian3.clone(p, e._strafeStartPosition), e._strafing = !0, strafe(e, n, e._strafeStartPosition)) : (c = Cartesian3.magnitude(p), l = scratchRadii, l.x = l.y = l.z = c, s = Ellipsoid.fromCartesian3(l, scratchEllipsoid), pan3D(e, t, n, s), Cartesian3.clone(p, e._rotateStartPosition)); + } else + e._looking = !0, look3D(e, t, n, d); + } else defined( + r.pickEllipsoid( + n.startPosition, + e._ellipsoid, + spin3DPick + ) + ) ? (pan3D(e, t, n, e._ellipsoid), Cartesian3.clone(spin3DPick, e._rotateStartPosition)) : f > e._minimumTrackBallHeight ? (e._rotating = !0, rotate3D(e, t, n)) : (e._looking = !0, look3D(e, t, n, d)); + Cartesian2.clone(t, e._rotateMousePosition); +} +function rotate3D(e, t, n, i, r, o) { + r = defaultValue(r, !1), o = defaultValue(o, !1); + const s = e._scene, c = s.camera, l = s.canvas, d = c.constrainedAxis; + defined(i) && (c.constrainedAxis = i); + const f = Cartesian3.magnitude(c.position); + let h = e._rotateFactor * (f - e._rotateRateRangeAdjustment); + h > e._maximumRotateRate && (h = e._maximumRotateRate), h < e._minimumRotateRate && (h = e._minimumRotateRate); + let p = (n.startPosition.x - n.endPosition.x) / l.clientWidth, m = (n.startPosition.y - n.endPosition.y) / l.clientHeight; + p = Math.min(p, e.maximumMovementRatio), m = Math.min( + m, + e.maximumMovementRatio + ); + const _ = h * p * Math.PI * 2, y = h * m * Math.PI; + r || c.rotateRight(_), o || c.rotateUp(y), c.constrainedAxis = d; +} +const pan3DP0 = Cartesian4.clone(Cartesian4.UNIT_W), pan3DP1 = Cartesian4.clone(Cartesian4.UNIT_W), pan3DTemp0 = new Cartesian3(), pan3DTemp1 = new Cartesian3(), pan3DTemp2 = new Cartesian3(), pan3DTemp3 = new Cartesian3(), pan3DStartMousePosition = new Cartesian2(), pan3DEndMousePosition = new Cartesian2(), pan3DDiffMousePosition = new Cartesian2(), pan3DPixelDimensions = new Cartesian2(), panRay = new Ray(); +function pan3D(e, t, n, i) { + const r = e._scene, o = r.camera, s = Cartesian2.clone( + n.startPosition, + pan3DStartMousePosition + ), c = Cartesian2.clone( + n.endPosition, + pan3DEndMousePosition + ), l = i.cartesianToCartographic( + o.positionWC, + scratchCartographic + ).height; + let d, f; + if (!n.inertiaEnabled && l < e._minimumPickingTerrainHeight && (d = Cartesian3.clone(e._panLastWorldPosition, pan3DP0), !defined(e._globe) && !Cartesian2.equalsEpsilon( + s, + e._panLastMousePosition + ) && (d = pickPosition(e, s, pan3DP0)), !defined(e._globe) && defined(d))) { + const h = Cartesian3.subtract(d, o.positionWC, pan3DTemp1), p = Cartesian3.multiplyByScalar( + o.directionWC, + Cartesian3.dot(o.directionWC, h), + pan3DTemp1 + ), m = Cartesian3.magnitude(p), _ = o.frustum.getPixelDimensions( + r.drawingBufferWidth, + r.drawingBufferHeight, + m, + r.pixelRatio, + pan3DPixelDimensions + ), y = Cartesian2.subtract( + c, + s, + pan3DDiffMousePosition + ), C = Cartesian3.multiplyByScalar( + o.rightWC, + y.x * _.x, + pan3DTemp1 + ), T = Cartesian3.normalize( + o.positionWC, + scratchCameraPositionNormal + ), x = o.getPickRay(c, panRay).direction, b = Cartesian3.subtract( + x, + Cartesian3.projectVector(x, o.rightWC, pan3DTemp2), + pan3DTemp2 + ), S = Cartesian3.angleBetween(b, o.directionWC); + let E = 1; + defined(o.frustum.fov) && (E = Math.max(Math.tan(S), 0.1)); + let A = Math.abs( + Cartesian3.dot(o.directionWC, T) + ); + const D = -y.y * _.y * 2 / Math.sqrt(E) * (1 - A), P = Cartesian3.multiplyByScalar( + x, + D, + pan3DTemp2 + ); + A = Math.abs(Cartesian3.dot(o.upWC, T)); + const I = Cartesian3.multiplyByScalar( + o.upWC, + -y.y * (1 - A) * _.y, + pan3DTemp3 + ); + f = Cartesian3.add(d, C, pan3DP1), f = Cartesian3.add(f, P, f), f = Cartesian3.add(f, I, f), Cartesian3.clone(f, e._panLastWorldPosition), Cartesian2.clone(c, e._panLastMousePosition); + } + if ((!defined(d) || !defined(f)) && (d = o.pickEllipsoid(s, i, pan3DP0), f = o.pickEllipsoid(c, i, pan3DP1)), !defined(d) || !defined(f)) { + e._rotating = !0, rotate3D(e, t, n); + return; + } + if (d = o.worldToCameraCoordinates(d, d), f = o.worldToCameraCoordinates(f, f), defined(o.constrainedAxis)) { + const h = o.constrainedAxis, p = Cartesian3.mostOrthogonalAxis(h, pan3DTemp0); + Cartesian3.cross(p, h, p), Cartesian3.normalize(p, p); + const m = Cartesian3.cross(h, p, pan3DTemp1), _ = Cartesian3.magnitude(d), y = Cartesian3.dot(h, d), C = Math.acos(y / _), T = Cartesian3.multiplyByScalar(h, y, pan3DTemp2); + Cartesian3.subtract(d, T, T), Cartesian3.normalize(T, T); + const x = Cartesian3.magnitude(f), b = Cartesian3.dot(h, f), S = Math.acos(b / x), E = Cartesian3.multiplyByScalar(h, b, pan3DTemp3); + Cartesian3.subtract(f, E, E), Cartesian3.normalize(E, E); + let A = Math.acos(Cartesian3.dot(T, p)); + Cartesian3.dot(T, m) < 0 && (A = CesiumMath.TWO_PI - A); + let D = Math.acos(Cartesian3.dot(E, p)); + Cartesian3.dot(E, m) < 0 && (D = CesiumMath.TWO_PI - D); + const P = A - D; + let I; + Cartesian3.equalsEpsilon(h, o.position, CesiumMath.EPSILON2) ? I = o.right : I = Cartesian3.cross(h, o.position, pan3DTemp0); + const M = Cartesian3.cross(h, I, pan3DTemp0), R = Cartesian3.dot( + M, + Cartesian3.subtract(d, h, pan3DTemp1) + ), L = Cartesian3.dot( + M, + Cartesian3.subtract(f, h, pan3DTemp1) + ); + let g; + R > 0 && L > 0 ? g = S - C : R > 0 && L <= 0 ? Cartesian3.dot(o.position, h) > 0 ? g = -C - S : g = C + S : g = C - S, o.rotateRight(P), o.rotateUp(g); + } else { + Cartesian3.normalize(d, d), Cartesian3.normalize(f, f); + const h = Cartesian3.dot(d, f), p = Cartesian3.cross(d, f, pan3DTemp0); + if (h < 1 && !Cartesian3.equalsEpsilon(p, Cartesian3.ZERO, CesiumMath.EPSILON14)) { + const m = Math.acos(h); + o.rotate(p, m); + } + } +} +const zoom3DUnitPosition = new Cartesian3(), zoom3DCartographic = new Cartographic(); +let preIntersectionDistance = 0; +function zoom3D(e, t, n) { + defined(n.distance) && (n = n.distance); + const i = n.inertiaEnabled, r = e._ellipsoid, o = e._scene, s = o.camera, c = o.canvas, l = e._cameraUnderground; + let d; + l ? d = t : (d = zoomCVWindowPos, d.x = c.clientWidth / 2, d.y = c.clientHeight / 2); + const f = s.getPickRay(d, zoomCVWindowRay); + let h; + const p = r.cartesianToCartographic( + s.position, + zoom3DCartographic + ).height, m = Math.abs(preIntersectionDistance) < e.minimumPickingTerrainDistanceWithInertia; + (i ? m : p < e._minimumPickingTerrainHeight) && (h = pickPosition(e, d, zoomCVIntersection)); + let y; + if (defined(h) && (y = Cartesian3.distance(f.origin, h), preIntersectionDistance = y), l) { + const T = getZoomDistanceUnderground( + e, + f + ); + defined(y) ? y = Math.min(y, T) : y = T; + } + defined(y) || (y = p); + const C = Cartesian3.normalize( + s.position, + zoom3DUnitPosition + ); + handleZoom( + e, + t, + n, + e.zoomFactor, + y, + Cartesian3.dot(C, s.direction) + ); +} +const tilt3DWindowPos = new Cartesian2(), tilt3DRay = new Ray(), tilt3DCenter = new Cartesian3(), tilt3DVerticalCenter = new Cartesian3(), tilt3DTransform = new Matrix4(), tilt3DVerticalTransform = new Matrix4(), tilt3DOldTransform = new Matrix4(), tilt3DQuaternion = new Quaternion(), tilt3DMatrix = new Matrix3(), tilt3DCart = new Cartographic(), tilt3DLookUp = new Cartesian3(); +function tilt3D(e, t, n) { + const r = e._scene.camera; + if (!Matrix4.equals(r.transform, Matrix4.IDENTITY)) + return; + if (defined(n.angleAndHeight) && (n = n.angleAndHeight), Cartesian2.equals(t, e._tiltCenterMousePosition) || (e._tiltOnEllipsoid = !1, e._looking = !1), e._looking) { + const c = e._ellipsoid.geodeticSurfaceNormal( + r.position, + tilt3DLookUp + ); + look3D(e, t, n, c); + return; + } + const s = e._ellipsoid.cartesianToCartographic( + r.position, + tilt3DCart + ); + e._tiltOnEllipsoid || s.height > e._minimumCollisionTerrainHeight ? (e._tiltOnEllipsoid = !0, tilt3DOnEllipsoid(e, t, n)) : tilt3DOnTerrain(e, t, n); +} +const tilt3DOnEllipsoidCartographic = new Cartographic(); +function tilt3DOnEllipsoid(e, t, n) { + const i = e._ellipsoid, r = e._scene, o = r.camera, s = e.minimumZoomDistance * 0.25, c = i.cartesianToCartographic( + o.positionWC, + tilt3DOnEllipsoidCartographic + ).height; + if (c - s - 1 < CesiumMath.EPSILON3 && n.endPosition.y - n.startPosition.y < 0) + return; + const l = r.canvas, d = tilt3DWindowPos; + d.x = l.clientWidth / 2, d.y = l.clientHeight / 2; + const f = o.getPickRay(d, tilt3DRay); + let h; + const p = IntersectionTests.rayEllipsoid(f, i); + if (defined(p)) + h = Ray.getPoint(f, p.start, tilt3DCenter); + else if (c > e._minimumTrackBallHeight) { + const x = IntersectionTests.grazingAltitudeLocation( + f, + i + ); + if (!defined(x)) + return; + const b = i.cartesianToCartographic( + x, + tilt3DCart + ); + b.height = 0, h = i.cartographicToCartesian( + b, + tilt3DCenter + ); + } else { + e._looking = !0; + const x = e._ellipsoid.geodeticSurfaceNormal( + o.position, + tilt3DLookUp + ); + look3D(e, t, n, x), Cartesian2.clone(t, e._tiltCenterMousePosition); + return; + } + const m = Transforms.eastNorthUpToFixedFrame( + h, + i, + tilt3DTransform + ), _ = e._globe, y = e._ellipsoid; + e._globe = void 0, e._ellipsoid = Ellipsoid.UNIT_SPHERE, e._rotateFactor = 1, e._rotateRateRangeAdjustment = 1; + const C = Matrix4.clone(o.transform, tilt3DOldTransform); + o._setTransform(m), rotate3D(e, t, n, Cartesian3.UNIT_Z), o._setTransform(C), e._globe = _, e._ellipsoid = y; + const T = y.maximumRadius; + e._rotateFactor = 1 / T, e._rotateRateRangeAdjustment = T; +} +function tilt3DOnTerrain(e, t, n) { + const i = e._ellipsoid, r = e._scene, o = r.camera, s = e._cameraUnderground; + let c, l, d; + if (Cartesian2.equals(t, e._tiltCenterMousePosition)) + c = Cartesian3.clone(e._tiltCenter, tilt3DCenter); + else { + if (c = pickPosition(e, t, tilt3DCenter), !defined(c)) { + if (l = o.getPickRay(t, tilt3DRay), d = IntersectionTests.rayEllipsoid(l, i), !defined(d)) { + if (i.cartesianToCartographic( + o.position, + tilt3DCart + ).height <= e._minimumTrackBallHeight) { + e._looking = !0; + const L = e._ellipsoid.geodeticSurfaceNormal( + o.position, + tilt3DLookUp + ); + look3D(e, t, n, L), Cartesian2.clone(t, e._tiltCenterMousePosition); + } + return; + } + c = Ray.getPoint(l, d.start, tilt3DCenter); + } + s && (defined(l) || (l = o.getPickRay(t, tilt3DRay)), getTiltCenterUnderground(e, l, c, c)), Cartesian2.clone(t, e._tiltCenterMousePosition), Cartesian3.clone(c, e._tiltCenter); + } + const f = r.canvas, h = tilt3DWindowPos; + h.x = f.clientWidth / 2, h.y = e._tiltCenterMousePosition.y, l = o.getPickRay(h, tilt3DRay); + const p = Cartesian3.magnitude(c), m = Cartesian3.fromElements(p, p, p, scratchRadii), _ = Ellipsoid.fromCartesian3(m, scratchEllipsoid); + if (d = IntersectionTests.rayEllipsoid(l, _), !defined(d)) + return; + const y = Cartesian3.magnitude(l.origin) > p ? d.start : d.stop, C = Ray.getPoint(l, y, tilt3DVerticalCenter), T = Transforms.eastNorthUpToFixedFrame( + c, + i, + tilt3DTransform + ), x = Transforms.eastNorthUpToFixedFrame( + C, + _, + tilt3DVerticalTransform + ), b = e._globe, S = e._ellipsoid; + e._globe = void 0, e._ellipsoid = Ellipsoid.UNIT_SPHERE, e._rotateFactor = 1, e._rotateRateRangeAdjustment = 1; + let E = Cartesian3.UNIT_Z; + const A = Matrix4.clone(o.transform, tilt3DOldTransform); + o._setTransform(x); + const D = Cartesian3.cross( + C, + o.positionWC, + tilt3DCartesian3 + ); + if (Cartesian3.dot(o.rightWC, D) < 0) { + const R = n.startPosition.y - n.endPosition.y; + (s && R < 0 || !s && R > 0) && (E = void 0); + const L = o.constrainedAxis; + o.constrainedAxis = void 0, rotate3D(e, t, n, E, !0, !1), o.constrainedAxis = L; + } else + rotate3D(e, t, n, E, !0, !1); + if (o._setTransform(T), rotate3D(e, t, n, E, !1, !0), defined(o.constrainedAxis)) { + const R = Cartesian3.cross( + o.direction, + o.constrainedAxis, + tilt3DCartesian3 + ); + Cartesian3.equalsEpsilon(R, Cartesian3.ZERO, CesiumMath.EPSILON6) || (Cartesian3.dot(R, o.right) < 0 && Cartesian3.negate(R, R), Cartesian3.cross(R, o.direction, o.up), Cartesian3.cross(o.direction, o.up, o.right), Cartesian3.normalize(o.up, o.up), Cartesian3.normalize(o.right, o.right)); + } + o._setTransform(A), e._globe = b, e._ellipsoid = S; + const I = S.maximumRadius; + e._rotateFactor = 1 / I, e._rotateRateRangeAdjustment = I; + const M = Cartesian3.clone( + o.positionWC, + tilt3DCartesian3 + ); + if (e.enableCollisionDetection && adjustHeightForTerrain(e, !0), !Cartesian3.equals(o.positionWC, M)) { + o._setTransform(x), o.worldToCameraCoordinatesPoint(M, M); + const R = Cartesian3.magnitudeSquared(M); + Cartesian3.magnitudeSquared(o.position) > R && (Cartesian3.normalize(o.position, o.position), Cartesian3.multiplyByScalar( + o.position, + Math.sqrt(R), + o.position + )); + const L = Cartesian3.angleBetween(M, o.position), g = Cartesian3.cross( + M, + o.position, + M + ); + Cartesian3.normalize(g, g); + const w = Quaternion.fromAxisAngle(g, L, tilt3DQuaternion), O = Matrix3.fromQuaternion(w, tilt3DMatrix); + Matrix3.multiplyByVector(O, o.direction, o.direction), Matrix3.multiplyByVector(O, o.up, o.up), Cartesian3.cross(o.direction, o.up, o.right), Cartesian3.cross(o.right, o.direction, o.up), o._setTransform(A); + } +} +const look3DStartPos = new Cartesian2(), look3DEndPos = new Cartesian2(), look3DStartRay = new Ray(), look3DEndRay = new Ray(), look3DNegativeRot = new Cartesian3(), look3DTan = new Cartesian3(); +function look3D(e, t, n, i) { + const o = e._scene.camera, s = look3DStartPos; + s.x = n.startPosition.x, s.y = 0; + const c = look3DEndPos; + c.x = n.endPosition.x, c.y = 0; + let l = o.getPickRay(s, look3DStartRay), d = o.getPickRay(c, look3DEndRay), f = 0, h, p; + o.frustum instanceof OrthographicFrustum ? (h = l.origin, p = d.origin, Cartesian3.add(o.direction, h, h), Cartesian3.add(o.direction, p, p), Cartesian3.subtract(h, o.position, h), Cartesian3.subtract(p, o.position, p), Cartesian3.normalize(h, h), Cartesian3.normalize(p, p)) : (h = l.direction, p = d.direction); + let m = Cartesian3.dot(h, p); + m < 1 && (f = Math.acos(m)), f = n.startPosition.x > n.endPosition.x ? -f : f; + const _ = e._horizontalRotationAxis; + if (defined(i) ? o.look(i, -f) : defined(_) ? o.look(_, -f) : o.lookLeft(f), s.x = 0, s.y = n.startPosition.y, c.x = 0, c.y = n.endPosition.y, l = o.getPickRay(s, look3DStartRay), d = o.getPickRay(c, look3DEndRay), f = 0, o.frustum instanceof OrthographicFrustum ? (h = l.origin, p = d.origin, Cartesian3.add(o.direction, h, h), Cartesian3.add(o.direction, p, p), Cartesian3.subtract(h, o.position, h), Cartesian3.subtract(p, o.position, p), Cartesian3.normalize(h, h), Cartesian3.normalize(p, p)) : (h = l.direction, p = d.direction), m = Cartesian3.dot(h, p), m < 1 && (f = Math.acos(m)), f = n.startPosition.y > n.endPosition.y ? -f : f, i = defaultValue(i, _), defined(i)) { + const y = o.direction, C = Cartesian3.negate( + i, + look3DNegativeRot + ), T = Cartesian3.equalsEpsilon( + y, + i, + CesiumMath.EPSILON2 + ), x = Cartesian3.equalsEpsilon( + y, + C, + CesiumMath.EPSILON2 + ); + if (!T && !x) { + m = Cartesian3.dot(y, i); + let b = CesiumMath.acosClamped(m); + f > 0 && f > b && (f = b - CesiumMath.EPSILON4), m = Cartesian3.dot(y, C), b = CesiumMath.acosClamped(m), f < 0 && -f > b && (f = -b + CesiumMath.EPSILON4); + const S = Cartesian3.cross(i, y, look3DTan); + o.look(S, f); + } else (T && f < 0 || x && f > 0) && o.look(o.right, -f); + } else + o.lookUp(f); +} +function update3D(e) { + reactToInput( + e, + e.enableRotate, + e.rotateEventTypes, + spin3D, + e.inertiaSpin, + "_lastInertiaSpinMovement" + ), reactToInput( + e, + e.enableZoom, + e.zoomEventTypes, + zoom3D, + e.inertiaZoom, + "_lastInertiaZoomMovement" + ), reactToInput( + e, + e.enableTilt, + e.tiltEventTypes, + tilt3D, + e.inertiaSpin, + "_lastInertiaTiltMovement" + ), reactToInput( + e, + e.enableLook, + e.lookEventTypes, + look3D + ); +} +const scratchAdjustHeightTransform = new Matrix4(), scratchAdjustHeightCartographic = new Cartographic(); +function adjustHeightForTerrain(e, t) { + e._adjustedHeightForTerrain = !0; + const n = e._scene, i = n.mode; + if (i === SceneMode$1.SCENE2D || i === SceneMode$1.MORPHING) + return; + const r = n.camera, o = defaultValue(n.ellipsoid, Ellipsoid.WGS84), s = n.mapProjection; + let c, l; + Matrix4.equals(r.transform, Matrix4.IDENTITY) || (c = Matrix4.clone(r.transform, scratchAdjustHeightTransform), l = Cartesian3.magnitude(r.position), r._setTransform(Matrix4.IDENTITY)); + const d = scratchAdjustHeightCartographic; + i === SceneMode$1.SCENE3D ? o.cartesianToCartographic(r.position, d) : s.unproject(r.position, d); + let f = !1; + if (d.height < e._minimumCollisionTerrainHeight) { + const h = e._scene.globeHeight; + if (defined(h)) { + const p = h + e.minimumZoomDistance, m = h - e._lastGlobeHeight, _ = m / e._lastGlobeHeight; + d.height < p && (t || Math.abs(_) <= 0.1) && (d.height = p, i === SceneMode$1.SCENE3D ? o.cartographicToCartesian(d, r.position) : s.project(d, r.position), f = !0), t || Math.abs(_) <= 0.1 ? e._lastGlobeHeight = h : e._lastGlobeHeight += m * 0.1; + } + } + defined(c) && (r._setTransform(c), f && (Cartesian3.normalize(r.position, r.position), Cartesian3.negate(r.position, r.direction), Cartesian3.multiplyByScalar( + r.position, + Math.max(l, e.minimumZoomDistance), + r.position + ), Cartesian3.normalize(r.direction, r.direction), Cartesian3.cross(r.direction, r.up, r.right), Cartesian3.cross(r.right, r.direction, r.up))); +} +ScreenSpaceCameraController.prototype.onMap = function() { + const e = this._scene, t = e.mode, n = e.camera; + return t === SceneMode$1.COLUMBUS_VIEW ? Math.abs(n.position.x) - this._maxCoord.x < 0 && Math.abs(n.position.y) - this._maxCoord.y < 0 : !0; +}; +const scratchPreviousPosition = new Cartesian3(), scratchPreviousDirection = new Cartesian3(); +ScreenSpaceCameraController.prototype.update = function() { + const e = this._scene, { camera: t, globe: n, mode: i } = e; + Matrix4.equals(t.transform, Matrix4.IDENTITY) ? (this._globe = n, this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default)) : (this._globe = void 0, this._ellipsoid = Ellipsoid.UNIT_SPHERE); + const { verticalExaggeration: r, verticalExaggerationRelativeHeight: o } = e; + this._minimumCollisionTerrainHeight = VerticalExaggeration.getHeight( + this.minimumCollisionTerrainHeight, + r, + o + ), this._minimumPickingTerrainHeight = VerticalExaggeration.getHeight( + this.minimumPickingTerrainHeight, + r, + o + ), this._minimumTrackBallHeight = VerticalExaggeration.getHeight( + this.minimumTrackBallHeight, + r, + o + ), this._cameraUnderground = e.cameraUnderground && defined(this._globe); + const s = this._ellipsoid.maximumRadius; + this._rotateFactor = 1 / s, this._rotateRateRangeAdjustment = s, this._adjustedHeightForTerrain = !1; + const c = Cartesian3.clone( + t.positionWC, + scratchPreviousPosition + ), l = Cartesian3.clone( + t.directionWC, + scratchPreviousDirection + ); + if (i === SceneMode$1.SCENE2D ? update2D(this) : i === SceneMode$1.COLUMBUS_VIEW ? (this._horizontalRotationAxis = Cartesian3.UNIT_Z, updateCV(this)) : i === SceneMode$1.SCENE3D && (this._horizontalRotationAxis = void 0, update3D(this)), this.enableCollisionDetection && !this._adjustedHeightForTerrain) { + const d = !Cartesian3.equals(c, t.positionWC) || !Cartesian3.equals(l, t.directionWC); + adjustHeightForTerrain(this, d); + } + this._aggregator.reset(); +}; +ScreenSpaceCameraController.prototype.isDestroyed = function() { + return !1; +}; +ScreenSpaceCameraController.prototype.destroy = function() { + return this._tweens.removeAll(), this._aggregator = this._aggregator && this._aggregator.destroy(), destroyObject(this); +}; +const AdditiveBlend = `uniform sampler2D colorTexture; +uniform sampler2D colorTexture2; + +uniform vec2 center; +uniform float radius; + +in vec2 v_textureCoordinates; + +void main() +{ + vec4 color0 = texture(colorTexture, v_textureCoordinates); + vec4 color1 = texture(colorTexture2, v_textureCoordinates); + + float x = length(gl_FragCoord.xy - center) / radius; + float t = smoothstep(0.5, 0.8, x); + out_FragColor = mix(color0 + color1, color1, t); +} +`, BrightPass = `uniform sampler2D colorTexture; + +uniform float avgLuminance; +uniform float threshold; +uniform float offset; + +in vec2 v_textureCoordinates; + +float key(float avg) +{ + float guess = 1.5 - (1.5 / (avg * 0.1 + 1.0)); + return max(0.0, guess) + 0.1; +} + +// See section 9. "The bright-pass filter" of Realtime HDR Rendering +// http://www.cg.tuwien.ac.at/research/publications/2007/Luksch_2007_RHR/Luksch_2007_RHR-RealtimeHDR%20.pdf + +void main() +{ + vec4 color = texture(colorTexture, v_textureCoordinates); + vec3 xyz = czm_RGBToXYZ(color.rgb); + float luminance = xyz.r; + + float scaledLum = key(avgLuminance) * luminance / avgLuminance; + float brightLum = max(scaledLum - threshold, 0.0); + float brightness = brightLum / (offset + brightLum); + + xyz.r = brightness; + out_FragColor = vec4(czm_XYZToRGB(xyz), 1.0); +} +`; +function SunPostProcess() { + this._sceneFramebuffer = new SceneFramebuffer(); + const e = 0.125, t = new Array(6); + t[0] = new PostProcessStage({ + fragmentShader: PassThrough, + textureScale: e, + forcePowerOfTwo: !0, + sampleMode: PostProcessStageSampleMode.LINEAR + }); + const n = t[1] = new PostProcessStage({ + fragmentShader: BrightPass, + uniforms: { + avgLuminance: 0.5, + // A guess at the average luminance across the entire scene + threshold: 0.25, + offset: 0.1 + }, + textureScale: e, + forcePowerOfTwo: !0 + }), i = this; + this._delta = 1, this._sigma = 2, this._blurStep = new Cartesian2(), t[2] = new PostProcessStage({ + fragmentShader: GaussianBlur1D, + uniforms: { + step: function() { + return i._blurStep.x = i._blurStep.y = 1 / n.outputTexture.width, i._blurStep; + }, + delta: function() { + return i._delta; + }, + sigma: function() { + return i._sigma; + }, + direction: 0 + }, + textureScale: e, + forcePowerOfTwo: !0 + }), t[3] = new PostProcessStage({ + fragmentShader: GaussianBlur1D, + uniforms: { + step: function() { + return i._blurStep.x = i._blurStep.y = 1 / n.outputTexture.width, i._blurStep; + }, + delta: function() { + return i._delta; + }, + sigma: function() { + return i._sigma; + }, + direction: 1 + }, + textureScale: e, + forcePowerOfTwo: !0 + }), t[4] = new PostProcessStage({ + fragmentShader: PassThrough, + sampleMode: PostProcessStageSampleMode.LINEAR + }), this._uCenter = new Cartesian2(), this._uRadius = void 0, t[5] = new PostProcessStage({ + fragmentShader: AdditiveBlend, + uniforms: { + center: function() { + return i._uCenter; + }, + radius: function() { + return i._uRadius; + }, + colorTexture2: function() { + return i._sceneFramebuffer.framebuffer.getColorTexture(0); + } + } + }), this._stages = new PostProcessStageComposite({ + stages: t + }); + const r = new PostProcessStageTextureCache(this), o = t.length; + for (let s = 0; s < o; ++s) + t[s]._textureCache = r; + this._textureCache = r, this.length = t.length; +} +SunPostProcess.prototype.get = function(e) { + return this._stages.get(e); +}; +SunPostProcess.prototype.getStageByName = function(e) { + const t = this._stages.length; + for (let n = 0; n < t; ++n) { + const i = this._stages.get(n); + if (i.name === e) + return i; + } +}; +const sunPositionECScratch = new Cartesian4(), sunPositionWCScratch = new Cartesian2(), sizeScratch = new Cartesian2(), postProcessMatrix4Scratch = new Matrix4(); +function updateSunPosition(e, t, n) { + const i = t.uniformState, r = i.sunPositionWC, o = i.view, s = i.viewProjection, c = i.projection; + let l = Matrix4.computeViewportTransformation( + n, + 0, + 1, + postProcessMatrix4Scratch + ); + const d = Matrix4.multiplyByPoint( + o, + r, + sunPositionECScratch + ); + let f = Transforms.pointToGLWindowCoordinates( + s, + l, + r, + sunPositionWCScratch + ); + d.x += CesiumMath.SOLAR_RADIUS; + const h = Transforms.pointToGLWindowCoordinates( + c, + l, + d, + d + ), p = Cartesian2.magnitude(Cartesian2.subtract(h, f, h)) * 30 * 2, m = sizeScratch; + m.x = p, m.y = p, e._uCenter = Cartesian2.clone(f, e._uCenter), e._uRadius = Math.max(m.x, m.y) * 0.15; + const _ = t.drawingBufferWidth, y = t.drawingBufferHeight, C = e._stages, T = C.get(0), x = T.outputTexture.width, b = T.outputTexture.height, S = new BoundingRectangle(); + S.width = x, S.height = b, l = Matrix4.computeViewportTransformation( + S, + 0, + 1, + postProcessMatrix4Scratch + ), f = Transforms.pointToGLWindowCoordinates( + s, + l, + r, + sunPositionWCScratch + ), m.x *= x / _, m.y *= b / y; + const E = T.scissorRectangle; + E.x = Math.max(f.x - m.x * 0.5, 0), E.y = Math.max(f.y - m.y * 0.5, 0), E.width = Math.min(m.x, _), E.height = Math.min(m.y, y); + for (let A = 1; A < 4; ++A) + BoundingRectangle.clone(E, C.get(A).scissorRectangle); +} +SunPostProcess.prototype.clear = function(e, t, n) { + this._sceneFramebuffer.clear(e, t, n), this._textureCache.clear(e); +}; +SunPostProcess.prototype.update = function(e) { + const t = e.context, n = e.viewport, i = this._sceneFramebuffer; + i.update(t, n); + const r = i.framebuffer; + return this._textureCache.update(t), this._stages.update(t, !1), updateSunPosition(this, t, n), r; +}; +SunPostProcess.prototype.execute = function(e) { + const t = this._sceneFramebuffer.framebuffer.getColorTexture(0), n = this._stages, i = n.length; + n.get(0).execute(e, t); + for (let r = 1; r < i; ++r) + n.get(r).execute(e, n.get(r - 1).outputTexture); +}; +SunPostProcess.prototype.copy = function(e, t) { + if (!defined(this._copyColorCommand)) { + const n = this; + this._copyColorCommand = e.createViewportQuadCommand(PassThrough, { + uniformMap: { + colorTexture: function() { + return n._stages.get(n._stages.length - 1).outputTexture; + } + }, + owner: this + }); + } + this._copyColorCommand.framebuffer = t, this._copyColorCommand.execute(e); +}; +SunPostProcess.prototype.isDestroyed = function() { + return !1; +}; +SunPostProcess.prototype.destroy = function() { + return this._textureCache.destroy(), this._stages.destroy(), destroyObject(this); +}; +function DebugInspector() { + this._cachedShowFrustumsShaders = {}; +} +function getAttributeLocations(e) { + const t = {}, n = e.vertexAttributes; + for (const i in n) + n.hasOwnProperty(i) && (t[i] = n[i].index); + return t; +} +function createDebugShowFrustumsShaderProgram(e, t) { + const n = e.context, i = t, r = i.fragmentShaderSource.clone(), o = []; + r.sources = r.sources.map(function(f) { + f = ShaderSource.replaceMain(f, "czm_Debug_main"); + const h = /out_FragData_(\d+)/g; + let p; + for (; (p = h.exec(f)) !== null; ) + o.indexOf(p[1]) === -1 && o.push(p[1]); + return f; + }); + const s = o.length; + let c = ""; + c += `uniform vec3 debugShowCommandsColor; +`, c += `uniform vec3 debugShowFrustumsColor; +`, c += `void main() +{ + czm_Debug_main(); +`; + let l; + if (s > 0) + for (l = 0; l < s; ++l) + c += ` out_FragData_${o[l]}.rgb *= debugShowCommandsColor; +`, c += ` out_FragData_${o[l]}.rgb *= debugShowFrustumsColor; +`; + else + c += ` out_FragColor.rgb *= debugShowCommandsColor; +`, c += ` out_FragColor.rgb *= debugShowFrustumsColor; +`; + c += "}", r.sources.push(c); + const d = getAttributeLocations(i); + return ShaderProgram.fromCache({ + context: n, + vertexShaderSource: i.vertexShaderSource, + fragmentShaderSource: r, + attributeLocations: d + }); +} +const scratchFrustumColor = new Color(); +function createDebugShowFrustumsUniformMap(e, t) { + let n; + return defined(t.uniformMap) ? n = t.uniformMap : n = {}, defined(n.debugShowCommandsColor) || defined(n.debugShowFrustumsColor) || (n.debugShowCommandsColor = function() { + return e.debugShowCommands ? (defined(t._debugColor) || (t._debugColor = Color.fromRandom()), t._debugColor) : Color.WHITE; + }, n.debugShowFrustumsColor = function() { + return e.debugShowFrustums ? (scratchFrustumColor.red = t.debugOverlappingFrustums & 1 ? 1 : 0, scratchFrustumColor.green = t.debugOverlappingFrustums & 2 ? 1 : 0, scratchFrustumColor.blue = t.debugOverlappingFrustums & 4 ? 1 : 0, scratchFrustumColor.alpha = 1, scratchFrustumColor) : Color.WHITE; + }), n; +} +const scratchShowFrustumCommand = new DrawCommand(); +DebugInspector.prototype.executeDebugShowFrustumsCommand = function(e, t, n) { + const i = t.shaderProgram.id; + let r = this._cachedShowFrustumsShaders[i]; + defined(r) || (r = createDebugShowFrustumsShaderProgram( + e, + t.shaderProgram + ), this._cachedShowFrustumsShaders[i] = r); + const o = DrawCommand.shallowClone( + t, + scratchShowFrustumCommand + ); + o.shaderProgram = r, o.uniformMap = createDebugShowFrustumsUniformMap(e, t), o.execute(e.context, n); +}; +function VoxelCell(e, t, n) { + this._primitive = e, this._tileIndex = t, this._sampleIndex = n, this._metadata = {}, this._orientedBoundingBox = new OrientedBoundingBox(); +} +VoxelCell.fromKeyframeNode = function(e, t, n, i) { + const r = new VoxelCell(e, t, n), { spatialNode: o, metadata: s } = i; + return r._metadata = getMetadataForSample(e, s, n), r._orientedBoundingBox = getOrientedBoundingBox( + e, + o, + n, + r._orientedBoundingBox + ), r; +}; +function getMetadataForSample(e, t, n) { + if (!defined(t)) + return; + const { names: i, types: r } = e.provider, o = {}; + for (let s = 0; s < i.length; s++) { + const c = i[s], l = MetadataType$1.getComponentCount(r[s]), d = t[s].slice( + n * l, + (n + 1) * l + ); + o[c] = d; + } + return o; +} +const tileCoordinateScratch = new Cartesian3(), tileUvScratch = new Cartesian3(); +function getOrientedBoundingBox(e, t, n, i) { + const r = t.dimensions, o = r.x * r.y, s = Math.floor(n / o), c = n - s * o, l = Math.floor(c / r.x), d = c - l * r.x, f = Cartesian3.fromElements( + d, + l, + s, + tileCoordinateScratch + ), h = Cartesian3.divideComponents( + Cartesian3.subtract( + f, + e._paddingBefore, + tileCoordinateScratch + ), + e.dimensions, + tileUvScratch + ); + return e._shape.computeOrientedBoundingBoxForSample( + t, + e.dimensions, + h, + i + ); +} +Object.defineProperties(VoxelCell.prototype, { + /** + * Gets an object of the metadata values for this cell. The object's keys are the metadata names. + * + * @memberof VoxelCell.prototype + * + * @type {object} + * + * @readonly + * @private + */ + metadata: { + get: function() { + return this._metadata; + } + }, + /** + * All objects returned by {@link Scene#pick} have a <code>primitive</code> property. This returns + * the VoxelPrimitive containing the cell. + * + * @memberof VoxelCell.prototype + * + * @type {VoxelPrimitive} + * + * @readonly + */ + primitive: { + get: function() { + return this._primitive; + } + }, + /** + * Get the sample index of the cell. + * + * @memberof VoxelCell.prototype + * + * @type {number} + * + * @readonly + */ + sampleIndex: { + get: function() { + return this._sampleIndex; + } + }, + /** + * Get the index of the tile containing the cell. + * + * @memberof VoxelCell.prototype + * + * @type {number} + * + * @readonly + */ + tileIndex: { + get: function() { + return this._tileIndex; + } + }, + /** + * Get a copy of the oriented bounding box containing the cell. + * + * @memberof VoxelCell.prototype + * + * @type {OrientedBoundingBox} + * + * @readonly + */ + orientedBoundingBox: { + get: function() { + return this._orientedBoundingBox.clone(); + } + } +}); +VoxelCell.prototype.hasProperty = function(e) { + return defined(this._metadata[e]); +}; +VoxelCell.prototype.getNames = function() { + return Object.keys(this._metadata); +}; +VoxelCell.prototype.getProperty = function(e) { + return this._metadata[e]; +}; +const VoxelUtils = `struct Ray { + vec3 pos; + vec3 dir; + vec3 rawDir; +}; + +#if defined(JITTER) +/** + * Generate a pseudo-random value for a given 2D screen coordinate. + * Similar to https://www.shadertoy.com/view/4djSRW with a modified hashscale. + */ +float hash(vec2 p) +{ + vec3 p3 = fract(vec3(p.xyx) * 50.0); + p3 += dot(p3, p3.yzx + 19.19); + return fract((p3.x + p3.y) * p3.z); +} +#endif + +float minComponent(in vec3 v) { + return min(min(v.x, v.y), v.z); +} + +float maxComponent(in vec3 v) { + return max(max(v.x, v.y), v.z); +} + +struct PointJacobianT { + vec3 point; + mat3 jacobianT; +}; +`, VoxelFS = `// See Intersection.glsl for the definition of intersectScene +// See IntersectionUtils.glsl for the definition of nextIntersection +// See convertUvToBox.glsl, convertUvToCylinder.glsl, or convertUvToEllipsoid.glsl +// for the definition of convertUvToShapeUvSpace. The appropriate function is +// selected based on the VoxelPrimitive shape type, and added to the shader in +// Scene/VoxelRenderResources.js. +// See Octree.glsl for the definitions of TraversalData, SampleData, +// traverseOctreeFromBeginning, and traverseOctreeFromExisting +// See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture + +#define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops +#if defined(PICKING_VOXEL) + #define ALPHA_ACCUM_MAX 0.1 +#else + #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0 +#endif + +uniform mat3 u_transformDirectionViewToLocal; +uniform vec3 u_cameraPositionUv; +uniform float u_stepSize; + +#if defined(PICKING) + uniform vec4 u_pickColor; +#endif + +vec3 getSampleSize(in int level) { + vec3 sampleCount = exp2(float(level)) * vec3(u_dimensions); + vec3 sampleSizeUv = 1.0 / sampleCount; + return scaleShapeUvToShapeSpace(sampleSizeUv); +} + +#define MINIMUM_STEP_SCALAR (0.02) +#define SHIFT_FRACTION (0.001) + +/** + * Given a coordinate within a tile, and sample spacings along a ray through + * the coordinate, find the distance to the points where the ray entered and + * exited the voxel cell, along with the surface normals at those points. + * The surface normals are returned in shape space coordinates. + */ +RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlongRay) { + vec3 voxelCoord = tileUv * vec3(u_dimensions); + vec3 directions = sign(sampleSizeAlongRay); + vec3 positiveDirections = max(directions, 0.0); + vec3 entryCoord = mix(ceil(voxelCoord), floor(voxelCoord), positiveDirections); + vec3 exitCoord = entryCoord + directions; + + vec3 distanceFromEntry = -abs((entryCoord - voxelCoord) * sampleSizeAlongRay); + float lastEntry = maxComponent(distanceFromEntry); + bvec3 isLastEntry = equal(distanceFromEntry, vec3(lastEntry)); + vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; + vec4 entry = vec4(entryNormal, lastEntry); + + vec3 distanceToExit = abs((exitCoord - voxelCoord) * sampleSizeAlongRay); + float firstExit = minComponent(distanceToExit); + bvec3 isFirstExit = equal(distanceToExit, vec3(firstExit)); + vec3 exitNormal = vec3(isFirstExit) * directions; + vec4 exit = vec4(exitNormal, firstExit); + + return RayShapeIntersection(entry, exit); +} + +vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) { + // The Jacobian is computed in a space where the shape spans [-1, 1]. + // But the ray is marched in a space where the shape fills [0, 1]. + // So we need to scale the Jacobian by 2. + vec3 gradient = 2.0 * viewRay.rawDir * jacobianT; + vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient; + + RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay); + + // Transform normal from shape space to Cartesian space + vec3 voxelNormal = normalize(jacobianT * voxelIntersection.entry.xyz); + // Compare with the shape intersection, to choose the appropriate normal + vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w); + vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry); + + float fixedStep = minComponent(abs(sampleSizeAlongRay)) * u_stepSize; + float shift = fixedStep * SHIFT_FRACTION; + float dt = voxelIntersection.exit.w + shift; + if ((currentT + dt) > shapeIntersection.exit.w) { + // Stop at end of shape + dt = shapeIntersection.exit.w - currentT + shift; + } + float stepSize = clamp(dt, fixedStep * MINIMUM_STEP_SCALAR, fixedStep + shift); + + return vec4(entry.xyz, stepSize); +} + +vec2 packIntToVec2(int value) { + float shifted = float(value) / 255.0; + float lowBits = fract(shifted); + float highBits = floor(shifted) / 255.0; + return vec2(highBits, lowBits); +} + +vec2 packFloatToVec2(float value) { + float lowBits = fract(value); + float highBits = floor(value) / 255.0; + return vec2(highBits, lowBits); +} + +int getSampleIndex(in vec3 tileUv) { + ivec3 voxelDimensions = u_dimensions; + vec3 sampleCoordinate = tileUv * vec3(voxelDimensions); + // tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not. + // (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1). + // Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring + vec3 maxCoordinate = vec3(voxelDimensions) - vec3(0.5); + sampleCoordinate = clamp(sampleCoordinate, vec3(0.0), maxCoordinate); + ivec3 sampleIndex = ivec3(floor(sampleCoordinate)); + #if defined(PADDING) + voxelDimensions += u_paddingBefore + u_paddingAfter; + sampleIndex += u_paddingBefore; + #endif + // Convert to a 1D index for lookup in a 1D data array + return sampleIndex.x + voxelDimensions.x * (sampleIndex.y + voxelDimensions.y * sampleIndex.z); +} + +void main() +{ + vec4 fragCoord = gl_FragCoord; + vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1] + vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz); + vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case + vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case + vec3 viewPosUv = u_cameraPositionUv; + #if defined(SHAPE_ELLIPSOID) + // viewDirUv has been scaled to a space where the ellipsoid is a sphere. + // Undo this scaling to get the raw direction. + vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv; + Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir); + #else + Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv); + #endif + + Intersections ix; + RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix); + + // Exit early if the scene was completely missed. + if (shapeIntersection.entry.w == NO_HIT) { + discard; + } + + float currentT = shapeIntersection.entry.w; + float endT = shapeIntersection.exit.w; + vec3 positionUv = viewPosUv + currentT * viewDirUv; + PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); + + // Traverse the tree from the start position + TraversalData traversalData; + SampleData sampleDatas[SAMPLE_COUNT]; + traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas); + vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); + + #if defined(JITTER) + float noise = hash(screenCoord); // [0,1] + currentT += noise * step.w; + positionUv += noise * step.w * viewDirUv; + #endif + + FragmentInput fragmentInput; + #if defined(STATISTICS) + setStatistics(fragmentInput.metadata.statistics); + #endif + + vec4 colorAccum = vec4(0.0); + + for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) { + // Read properties from the megatexture based on the traversal state + Properties properties = accumulatePropertiesFromMegatexture(sampleDatas); + + // Prepare the custom shader inputs + copyPropertiesToMetadata(properties, fragmentInput.metadata); + fragmentInput.voxel.positionUv = positionUv; + fragmentInput.voxel.positionShapeUv = pointJacobian.point; + fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv; + fragmentInput.voxel.viewDirUv = viewDirUv; + fragmentInput.voxel.viewDirWorld = viewDirWorld; + fragmentInput.voxel.surfaceNormal = step.xyz; + fragmentInput.voxel.travelDistance = step.w; + fragmentInput.voxel.stepCount = stepCount; + fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex; + fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv); + + // Run the custom shader + czm_modelMaterial materialOutput; + fragmentMain(fragmentInput, materialOutput); + + // Sanitize the custom shader output + vec4 color = vec4(materialOutput.diffuse, materialOutput.alpha); + color.rgb = max(color.rgb, vec3(0.0)); + color.a = clamp(color.a, 0.0, 1.0); + + // Pre-multiplied alpha blend + colorAccum += (1.0 - colorAccum.a) * vec4(color.rgb * color.a, color.a); + + // Stop traversing if the alpha has been fully saturated + if (colorAccum.a > ALPHA_ACCUM_MAX) { + colorAccum.a = ALPHA_ACCUM_MAX; + break; + } + + if (step.w == 0.0) { + // Shape is infinitely thin. The ray may have hit the edge of a + // foreground voxel. Step ahead slightly to check for more voxels + step.w == 0.00001; + } + + // Keep raymarching + currentT += step.w; + positionUv = viewPosUv + currentT * viewDirUv; + + // Check if there's more intersections. + if (currentT > endT) { + #if (INTERSECTION_COUNT == 1) + break; + #else + shapeIntersection = nextIntersection(ix); + if (shapeIntersection.entry.w == NO_HIT) { + break; + } else { + // Found another intersection. Resume raymarching there + currentT = shapeIntersection.entry.w; + endT = shapeIntersection.exit.w; + positionUv = viewPosUv + currentT * viewDirUv; + } + #endif + } + + // Traverse the tree from the current ray position. + // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step. + pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); + traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas); + step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); + } + + // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1] + colorAccum.a /= ALPHA_ACCUM_MAX; + + #if defined(PICKING) + // If alpha is 0.0 there is nothing to pick + if (colorAccum.a == 0.0) { + discard; + } + out_FragColor = u_pickColor; + #elif defined(PICKING_VOXEL) + // If alpha is 0.0 there is nothing to pick + if (colorAccum.a == 0.0) { + discard; + } + vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex); + vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv)); + out_FragColor = vec4(megatextureId, sampleIndex); + #else + out_FragColor = colorAccum; + #endif +} +`, VoxelVS = `in vec2 position; + +uniform vec4 u_ndcSpaceAxisAlignedBoundingBox; + +void main() { + vec2 aabbMin = u_ndcSpaceAxisAlignedBoundingBox.xy; + vec2 aabbMax = u_ndcSpaceAxisAlignedBoundingBox.zw; + vec2 translation = 0.5 * (aabbMax + aabbMin); + vec2 scale = 0.5 * (aabbMax - aabbMin); + gl_Position = vec4(position * scale + translation, 0.0, 1.0); +} +`, IntersectionUtils = `/* Intersection defines +#define INTERSECTION_COUNT ### +*/ + +#define NO_HIT (-czm_infinity) +#define INF_HIT (czm_infinity * 0.5) + +struct RayShapeIntersection { + vec4 entry; + vec4 exit; +}; + +vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1) +{ + if (intersect0.w == NO_HIT) { + return intersect1; + } else if (intersect1.w == NO_HIT) { + return intersect0; + } + return (intersect0.w <= intersect1.w) ? intersect0 : intersect1; +} + +vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1) +{ + return (intersect0.w >= intersect1.w) ? intersect0 : intersect1; +} + +RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1) +{ + bool missed = (intersect0.entry.w == NO_HIT) || + (intersect1.entry.w == NO_HIT) || + (intersect0.exit.w < intersect1.entry.w) || + (intersect0.entry.w > intersect1.exit.w); + if (missed) { + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + return RayShapeIntersection(miss, miss); + } + + vec4 entry = intersectionMax(intersect0.entry, intersect1.entry); + vec4 exit = intersectionMin(intersect0.exit, intersect1.exit); + + return RayShapeIntersection(entry, exit); +} + +struct Intersections { + // Don't access these member variables directly - call the functions instead. + + // Store an array of ray-surface intersections. Each intersection is composed of: + // .xyz for the surface normal at the intersection point + // .w for the T value + // The scale of the normal encodes the shape intersection type: + // length(intersection.xyz) = 1: positive shape entry + // length(intersection.xyz) = 2: positive shape exit + // length(intersection.xyz) = 3: negative shape entry + // length(intersection.xyz) = 4: negative shape exit + // INTERSECTION_COUNT is the number of ray-*shape* (volume) intersections, + // so we need twice as many to track ray-*surface* intersections + vec4 intersections[INTERSECTION_COUNT * 2]; + + #if (INTERSECTION_COUNT > 1) + // Maintain state for future nextIntersection calls + int index; + int surroundCount; + bool surroundIsPositive; + #endif +}; + +RayShapeIntersection getFirstIntersection(in Intersections ix) +{ + return RayShapeIntersection(ix.intersections[0], ix.intersections[1]); +} + +vec4 encodeIntersectionType(vec4 intersection, int index, bool entry) +{ + float scale = float(index > 0) * 2.0 + float(!entry) + 1.0; + return vec4(intersection.xyz * scale, intersection.w); +} + +// Use defines instead of real functions because WebGL1 cannot access array with non-constant index. +#define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t)) +#define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y) +#define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter)) +#define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false) + +#if (INTERSECTION_COUNT > 1) +void initializeIntersections(inout Intersections ix) { + // Sort the intersections from min T to max T with bubble sort. + // Note: If this sorting function changes, some of the intersection test may + // need to be updated. Search for "bubble sort" to find those areas. + const int sortPasses = INTERSECTION_COUNT * 2 - 1; + for (int n = sortPasses; n > 0; --n) { + for (int i = 0; i < sortPasses; ++i) { + // The loop should be: for (i = 0; i < n; ++i) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to break early instead + if (i >= n) { break; } + + vec4 intersect0 = ix.intersections[i + 0]; + vec4 intersect1 = ix.intersections[i + 1]; + + bool inOrder = intersect0.w <= intersect1.w; + + ix.intersections[i + 0] = inOrder ? intersect0 : intersect1; + ix.intersections[i + 1] = inOrder ? intersect1 : intersect0; + } + } + + // Prepare initial state for nextIntersection + ix.index = 0; + ix.surroundCount = 0; + ix.surroundIsPositive = false; +} +#endif + +#if (INTERSECTION_COUNT > 1) +RayShapeIntersection nextIntersection(inout Intersections ix) { + vec4 surfaceIntersection = vec4(0.0, 0.0, 0.0, NO_HIT); + RayShapeIntersection shapeIntersection = RayShapeIntersection(surfaceIntersection, surfaceIntersection); + + const int passCount = INTERSECTION_COUNT * 2; + + if (ix.index == passCount) { + return shapeIntersection; + } + + for (int i = 0; i < passCount; ++i) { + // The loop should be: for (i = ix.index; i < passCount; ++i) {...} but WebGL1 cannot + // loop with non-constant condition, so it has to continue instead. + if (i < ix.index) { + continue; + } + + ix.index = i + 1; + + surfaceIntersection = ix.intersections[i]; + int intersectionType = int(length(surfaceIntersection.xyz) - 0.5); + bool currShapeIsPositive = intersectionType < 2; + bool enter = intMod(intersectionType, 2) == 0; + + ix.surroundCount += enter ? +1 : -1; + ix.surroundIsPositive = currShapeIsPositive ? enter : ix.surroundIsPositive; + + // entering positive or exiting negative + if (ix.surroundCount == 1 && ix.surroundIsPositive && enter == currShapeIsPositive) { + shapeIntersection.entry = surfaceIntersection; + } + + // exiting positive or entering negative after being inside positive + bool exitPositive = !enter && currShapeIsPositive && ix.surroundCount == 0; + bool enterNegativeFromPositive = enter && !currShapeIsPositive && ix.surroundCount == 2 && ix.surroundIsPositive; + if (exitPositive || enterNegativeFromPositive) { + shapeIntersection.exit = surfaceIntersection; + + // entry and exit have been found, so the loop can stop + if (exitPositive) { + // After exiting positive shape there is nothing left to intersect, so jump to the end index. + ix.index = passCount; + } + break; + } + } + + return shapeIntersection; +} +#endif + +// NOTE: initializeIntersections, nextIntersection aren't even declared unless INTERSECTION_COUNT > 1 +`, IntersectDepth = `// See IntersectionUtils.glsl for the definitions of Ray, Intersections, +// setIntersectionPair, INF_HIT, NO_HIT + +/* intersectDepth defines (set in Scene/VoxelRenderResources.js) +#define DEPTH_INTERSECTION_INDEX ### +*/ + +uniform mat4 u_transformPositionViewToUv; + +void intersectDepth(in vec2 screenCoord, in Ray ray, inout Intersections ix) { + float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, screenCoord)); + if (logDepthOrDepth != 0.0) { + // Calculate how far the ray must travel before it hits the depth buffer. + vec4 eyeCoordinateDepth = czm_screenToEyeCoordinates(screenCoord, logDepthOrDepth); + eyeCoordinateDepth /= eyeCoordinateDepth.w; + vec3 depthPositionUv = vec3(u_transformPositionViewToUv * eyeCoordinateDepth); + float t = dot(depthPositionUv - ray.pos, ray.dir); + setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(t, +INF_HIT)); + } else { + // There's no depth at this location. + setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(NO_HIT)); + } +} +`, IntersectClippingPlanes = `// See IntersectionUtils.glsl for the definitions of Ray, Intersections, INF_HIT, +// NO_HIT, setShapeIntersection + +/* Clipping plane defines (set in Scene/VoxelRenderResources.js) +#define CLIPPING_PLANES_UNION +#define CLIPPING_PLANES_COUNT +#define CLIPPING_PLANES_INTERSECTION_INDEX +*/ + +uniform sampler2D u_clippingPlanesTexture; +uniform mat4 u_clippingPlanesMatrix; + +// Plane is in Hessian Normal Form +vec4 intersectPlane(in Ray ray, in vec4 plane) { + vec3 n = plane.xyz; // normal + float w = plane.w; // -dot(pointOnPlane, normal) + + float a = dot(ray.pos, n); + float b = dot(ray.dir, n); + float t = -(w + a) / b; + + return vec4(n, t); +} + +void intersectClippingPlanes(in Ray ray, inout Intersections ix) { + vec4 backSide = vec4(-ray.dir, -INF_HIT); + vec4 farSide = vec4(ray.dir, +INF_HIT); + RayShapeIntersection clippingVolume; + + #if (CLIPPING_PLANES_COUNT == 1) + // Union and intersection are the same when there's one clipping plane, and the code + // is more simplified. + vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, 0, u_clippingPlanesMatrix); + vec4 intersection = intersectPlane(ray, planeUv); + bool reflects = dot(ray.dir, intersection.xyz) < 0.0; + clippingVolume.entry = reflects ? backSide : intersection; + clippingVolume.exit = reflects ? intersection : farSide; + setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); + #elif defined(CLIPPING_PLANES_UNION) + vec4 firstTransmission = vec4(ray.dir, +INF_HIT); + vec4 lastReflection = vec4(-ray.dir, -INF_HIT); + for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { + vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); + vec4 intersection = intersectPlane(ray, planeUv); + if (dot(ray.dir, planeUv.xyz) > 0.0) { + firstTransmission = intersection.w <= firstTransmission.w ? intersection : firstTransmission; + } else { + lastReflection = intersection.w >= lastReflection.w ? intersection : lastReflection; + } + } + clippingVolume.entry = backSide; + clippingVolume.exit = lastReflection; + setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 0, clippingVolume); + clippingVolume.entry = firstTransmission; + clippingVolume.exit = farSide; + setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 1, clippingVolume); + #else // intersection + vec4 lastTransmission = vec4(ray.dir, -INF_HIT); + vec4 firstReflection = vec4(-ray.dir, +INF_HIT); + for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { + vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); + vec4 intersection = intersectPlane(ray, planeUv); + if (dot(ray.dir, planeUv.xyz) > 0.0) { + lastTransmission = intersection.w > lastTransmission.w ? intersection : lastTransmission; + } else { + firstReflection = intersection.w < firstReflection.w ? intersection: firstReflection; + } + } + if (lastTransmission.w < firstReflection.w) { + clippingVolume.entry = lastTransmission; + clippingVolume.exit = firstReflection; + } else { + clippingVolume.entry = vec4(-ray.dir, NO_HIT); + clippingVolume.exit = vec4(ray.dir, NO_HIT); + } + setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); + #endif +} +`, IntersectLongitude = `// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, +// RayShapeIntersection + +vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) { + float normalSign = positiveNormal ? 1.0 : -1.0; + vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign; + + vec2 position = ray.pos.xy; + vec2 direction = ray.dir.xy; + float approachRate = dot(direction, planeNormal); + float distance = -dot(position, planeNormal); + + float t = (approachRate == 0.0) + ? NO_HIT + : distance / approachRate; + + return vec4(planeNormal, 0.0, t); +} + +RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal) +{ + vec4 intersection = intersectLongitude(ray, angle, positiveNormal); + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + + bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0); + if (!hitFront) { + return RayShapeIntersection(intersection, farSide); + } else { + return RayShapeIntersection(-1.0 * farSide, intersection); + } +} + +void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2]) +{ + intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false); + intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true); +} + +bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) { + float normalSign = positiveNormal ? 1.0 : -1.0; + vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign; + vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy; + return dot(hit, planeDirection) > 0.0; +} + +void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) { + vec4 intersection = intersectLongitude(ray, angle, true); + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + + if (hitPositiveHalfPlane(ray, intersection, true)) { + intersections[0].entry = -1.0 * farSide; + intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w); + intersections[1].entry = intersection; + intersections[1].exit = farSide; + } else { + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + intersections[0].entry = -1.0 * farSide; + intersections[0].exit = farSide; + intersections[1].entry = miss; + intersections[1].exit = miss; + } +} + +RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle) +{ + // Note: works for maxAngle > minAngle + pi, where the "regular wedge" + // is actually a negative volume. + // Compute intersections with the two planes. + // Normals will point toward the "outside" (negative space) + vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false); + vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true); + + // Choose intersection with smallest T as the "first", the other as "last" + // Note: first or last could be in the "shadow" wedge, beyond the tip + bool inOrder = intersect1.w <= intersect2.w; + vec4 first = inOrder ? intersect1 : intersect2; + vec4 last = inOrder ? intersect2 : intersect1; + + bool firstIsAhead = first.w >= 0.0; + bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0; + bool exitFromInside = firstIsAhead == startedInsideFirst; + bool lastIsAhead = last.w > 0.0; + bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0; + bool enterFromOutside = lastIsAhead == startedOutsideLast; + + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + + if (exitFromInside && enterFromOutside) { + // Ray crosses both faces of negative wedge, exiting then entering the positive shape + return RayShapeIntersection(first, last); + } else if (!exitFromInside && enterFromOutside) { + // Ray starts inside wedge. last is in shadow wedge, and first is actually the entry + return RayShapeIntersection(-1.0 * farSide, first); + } else if (exitFromInside && !enterFromOutside) { + // First intersection was in the shadow wedge, so last is actually the exit + return RayShapeIntersection(last, farSide); + } else { // !exitFromInside && !enterFromOutside + // Both intersections were in the shadow wedge + return RayShapeIntersection(miss, miss); + } +} +`, IntersectBox = `// See IntersectionUtils.glsl for the definitions of Ray, RayShapeIntersection, +// NO_HIT, Intersections + +/* Box defines (set in Scene/VoxelBoxShape.js) +#define BOX_INTERSECTION_INDEX ### // always 0 +*/ + +uniform vec3 u_renderMinBounds; +uniform vec3 u_renderMaxBounds; + +RayShapeIntersection intersectBox(in Ray ray, in vec3 minBound, in vec3 maxBound) +{ + // Consider the box as the intersection of the space between 3 pairs of parallel planes + // Compute the distance along the ray to each plane + vec3 t0 = (minBound - ray.pos) / ray.dir; + vec3 t1 = (maxBound - ray.pos) / ray.dir; + + // Identify candidate entries/exits based on distance from ray.pos + vec3 entries = min(t0, t1); + vec3 exits = max(t0, t1); + + vec3 directions = sign(ray.dir); + + // The actual intersection points are the furthest entry and the closest exit + float lastEntry = maxComponent(entries); + bvec3 isLastEntry = equal(entries, vec3(lastEntry)); + vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; + vec4 entry = vec4(entryNormal, lastEntry); + + float firstExit = minComponent(exits); + bvec3 isFirstExit = equal(exits, vec3(firstExit)); + vec3 exitNormal = vec3(isLastEntry) * directions; + vec4 exit = vec4(exitNormal, firstExit); + + if (entry.w > exit.w) { + entry.w = NO_HIT; + exit.w = NO_HIT; + } + + return RayShapeIntersection(entry, exit); +} + +void intersectShape(in Ray ray, inout Intersections ix) +{ + RayShapeIntersection intersection = intersectBox(ray, u_renderMinBounds, u_renderMaxBounds); + setShapeIntersection(ix, BOX_INTERSECTION_INDEX, intersection); +} +`, IntersectCylinder = `// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, Intersections, +// RayShapeIntersection, setSurfaceIntersection, setShapeIntersection, +// intersectIntersections +// See IntersectLongitude.glsl for the definitions of intersectHalfPlane, +// intersectFlippedWedge, intersectRegularWedge + +/* Cylinder defines (set in Scene/VoxelCylinderShape.js) +#define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN +#define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT +#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE +#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF +#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF +#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO + +#define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX +#define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN +#define CYLINDER_INTERSECTION_INDEX_ANGLE +*/ + +// Cylinder uniforms +uniform vec2 u_cylinderRenderRadiusMinMax; +uniform vec2 u_cylinderRenderHeightMinMax; +#if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE) + uniform vec2 u_cylinderRenderAngleMinMax; +#endif + +/** + * Find the intersection of a ray with the volume defined by two planes of constant z + */ +RayShapeIntersection intersectHeightBounds(in Ray ray, in vec2 minMaxHeight, in bool convex) +{ + float zPosition = ray.pos.z; + float zDirection = ray.dir.z; + + float tmin = (minMaxHeight.x - zPosition) / zDirection; + float tmax = (minMaxHeight.y - zPosition) / zDirection; + + // Normals point outside the volume + float signFlip = convex ? 1.0 : -1.0; + vec4 intersectMin = vec4(0.0, 0.0, -1.0 * signFlip, tmin); + vec4 intersectMax = vec4(0.0, 0.0, 1.0 * signFlip, tmax); + + bool topEntry = zDirection < 0.0; + vec4 entry = topEntry ? intersectMax : intersectMin; + vec4 exit = topEntry ? intersectMin : intersectMax; + + return RayShapeIntersection(entry, exit); +} + +/** + * Find the intersection of a ray with a right cylindrical surface of a given radius + * about the z-axis. + */ +RayShapeIntersection intersectCylinder(in Ray ray, in float radius, in bool convex) +{ + vec2 position = ray.pos.xy; + vec2 direction = ray.dir.xy; + + float a = dot(direction, direction); + float b = dot(position, direction); + float c = dot(position, position) - radius * radius; + float determinant = b * b - a * c; + + if (determinant < 0.0) { + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + return RayShapeIntersection(miss, miss); + } + + determinant = sqrt(determinant); + float t1 = (-b - determinant) / a; + float t2 = (-b + determinant) / a; + float signFlip = convex ? 1.0 : -1.0; + vec4 intersect1 = vec4(normalize(position + t1 * direction) * signFlip, 0.0, t1); + vec4 intersect2 = vec4(normalize(position + t2 * direction) * signFlip, 0.0, t2); + + return RayShapeIntersection(intersect1, intersect2); +} + +/** + * Find the intersection of a ray with a right cylindrical solid of given + * radius and height bounds. NOTE: The shape is assumed to be convex. + */ +RayShapeIntersection intersectBoundedCylinder(in Ray ray, in float radius, in vec2 minMaxHeight) +{ + RayShapeIntersection cylinderIntersection = intersectCylinder(ray, radius, true); + RayShapeIntersection heightBoundsIntersection = intersectHeightBounds(ray, minMaxHeight, true); + return intersectIntersections(ray, cylinderIntersection, heightBoundsIntersection); +} + +void intersectShape(Ray ray, inout Intersections ix) +{ + // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. + // Direction is scaled as well to be in sync with position. + ray.pos = ray.pos * 2.0 - 1.0; + ray.dir *= 2.0; + + RayShapeIntersection outerIntersect = intersectBoundedCylinder(ray, u_cylinderRenderRadiusMinMax.y, u_cylinderRenderHeightMinMax); + + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MAX, outerIntersect); + + if (outerIntersect.entry.w == NO_HIT) { + return; + } + + #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT) + // When the cylinder is perfectly thin it's necessary to sandwich the + // inner cylinder intersection inside the outer cylinder intersection. + + // Without this special case, + // [outerMin, outerMax, innerMin, innerMax] will bubble sort to + // [outerMin, innerMin, outerMax, innerMax] which will cause the back + // side of the cylinder to be invisible because it will think the ray + // is still inside the inner (negative) cylinder after exiting the + // outer (positive) cylinder. + + // With this special case, + // [outerMin, innerMin, innerMax, outerMax] will bubble sort to + // [outerMin, innerMin, innerMax, outerMax] which will work correctly. + + // Note: If initializeIntersections() changes its sorting function + // from bubble sort to something else, this code may need to change. + RayShapeIntersection innerIntersect = intersectCylinder(ray, 1.0, false); + setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter + setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter + setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit + setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit + #elif defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN) + RayShapeIntersection innerIntersect = intersectCylinder(ray, u_cylinderRenderRadiusMinMax.x, false); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MIN, innerIntersect); + #endif + + #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF) + RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect); + #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF) + RayShapeIntersection wedgeIntersects[2]; + intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); + #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO) + RayShapeIntersection wedgeIntersects[2]; + intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); + setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); + #endif +} +`, IntersectEllipsoid = `// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, Intersections, +// RayShapeIntersection, setSurfaceIntersection, setShapeIntersection +// See IntersectLongitude.glsl for the definitions of intersectHalfPlane, +// intersectFlippedWedge, intersectRegularWedge + +/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF +#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF +#define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE +#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX +#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN +#define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX +#define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN +*/ + +#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE) + uniform vec2 u_ellipsoidRenderLongitudeMinMax; +#endif +uniform float u_eccentricitySquared; +uniform vec2 u_ellipsoidRenderLatitudeSinMinMax; +uniform vec2 u_clipMinMaxHeight; + +RayShapeIntersection intersectZPlane(in Ray ray, in float z) { + float t = -ray.pos.z / ray.dir.z; + + bool startsOutside = sign(ray.pos.z) == sign(z); + bool entry = (t >= 0.0) != startsOutside; + + vec4 intersect = vec4(0.0, 0.0, z, t); + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + + if (entry) { + return RayShapeIntersection(intersect, farSide); + } else { + return RayShapeIntersection(-1.0 * farSide, intersect); + } +} + +RayShapeIntersection intersectHeight(in Ray ray, in float relativeHeight, in bool convex) +{ + // Scale the ray by the ellipsoid axes to make it a unit sphere + // Note: approximating ellipsoid + height as an ellipsoid + vec3 radiiCorrection = u_ellipsoidRadiiUv / (u_ellipsoidRadiiUv + relativeHeight); + vec3 position = ray.pos * radiiCorrection; + vec3 direction = ray.dir * radiiCorrection; + + float a = dot(direction, direction); // ~ 1.0 (or maybe 4.0 if ray is scaled) + float b = dot(direction, position); // roughly inside [-1.0, 1.0] when zoomed in + float c = dot(position, position) - 1.0; // ~ 0.0 when zoomed in. + float determinant = b * b - a * c; // ~ b * b when zoomed in + + if (determinant < 0.0) { + vec4 miss = vec4(normalize(direction), NO_HIT); + return RayShapeIntersection(miss, miss); + } + + determinant = sqrt(determinant); + + // Compute larger root using standard formula + float signB = b < 0.0 ? -1.0 : 1.0; + // The other root may suffer from subtractive cancellation in the standard formula. + // Compute it from the first root instead. + float t1 = (-b - signB * determinant) / a; + float t2 = c / (a * t1); + float tmin = min(t1, t2); + float tmax = max(t1, t2); + + float directionScale = convex ? 1.0 : -1.0; + vec3 d1 = directionScale * normalize(position + tmin * direction); + vec3 d2 = directionScale * normalize(position + tmax * direction); + + return RayShapeIntersection(vec4(d1, tmin), vec4(d2, tmax)); +} + +/** + * Given a circular cone around the z-axis, with apex at the origin, + * find the parametric distance(s) along a ray where that ray intersects + * the cone. + * The cone opening angle is described by the squared cosine of + * its half-angle (the angle between the Z-axis and the surface) + */ +vec2 intersectDoubleEndedCone(in Ray ray, in float cosSqrHalfAngle) +{ + vec3 o = ray.pos; + vec3 d = ray.dir; + float sinSqrHalfAngle = 1.0 - cosSqrHalfAngle; + + float aSin = d.z * d.z * sinSqrHalfAngle; + float aCos = -dot(d.xy, d.xy) * cosSqrHalfAngle; + float a = aSin + aCos; + + float bSin = d.z * o.z * sinSqrHalfAngle; + float bCos = -dot(o.xy, d.xy) * cosSqrHalfAngle; + float b = bSin + bCos; + + float cSin = o.z * o.z * sinSqrHalfAngle; + float cCos = -dot(o.xy, o.xy) * cosSqrHalfAngle; + float c = cSin + cCos; + // determinant = b * b - a * c. But bSin * bSin = aSin * cSin. + // Avoid subtractive cancellation by expanding to eliminate these terms + float determinant = 2.0 * bSin * bCos + bCos * bCos - aSin * cCos - aCos * cSin - aCos * cCos; + + if (determinant < 0.0) { + return vec2(NO_HIT); + } else if (a == 0.0) { + // Ray is parallel to cone surface + return (b == 0.0) + ? vec2(NO_HIT) // Ray is on cone surface + : vec2(-0.5 * c / b, NO_HIT); + } + + determinant = sqrt(determinant); + + // Compute larger root using standard formula + float signB = b < 0.0 ? -1.0 : 1.0; + float t1 = (-b - signB * determinant) / a; + // The other root may suffer from subtractive cancellation in the standard formula. + // Compute it from the first root instead. + float t2 = c / (a * t1); + float tmin = min(t1, t2); + float tmax = max(t1, t2); + return vec2(tmin, tmax); +} + +/** + * Given a point on a conical surface, find the surface normal at that point. + */ +vec3 getConeNormal(in vec3 p, in bool convex) { + // Start with radial component pointing toward z-axis + vec2 radial = -abs(p.z) * normalize(p.xy); + // Z component points toward opening of cone + float zSign = (p.z < 0.0) ? -1.0 : 1.0; + float z = length(p.xy) * zSign; + // Flip normal if shape is convex + float flip = (convex) ? -1.0 : 1.0; + return normalize(vec3(radial, z) * flip); +} + +/** + * Compute the shift between the ellipsoid origin and the apex of a cone of latitude + */ +float getLatitudeConeShift(in float sinLatitude) { + // Find prime vertical radius of curvature: + // the distance along the ellipsoid normal to the intersection with the z-axis + float x2 = u_eccentricitySquared * sinLatitude * sinLatitude; + float primeVerticalRadius = inversesqrt(1.0 - x2); + + // Compute a shift from the origin to the intersection of the cone with the z-axis + return primeVerticalRadius * u_eccentricitySquared * sinLatitude; +} + +void intersectFlippedCone(in Ray ray, in float cosHalfAngle, out RayShapeIntersection intersections[2]) { + // Undo the scaling from ellipsoid to sphere + ray.pos = ray.pos * u_ellipsoidRadiiUv; + ray.dir = ray.dir * u_ellipsoidRadiiUv; + // Shift the ray to account for the latitude cone not being centered at the Earth center + ray.pos.z += getLatitudeConeShift(cosHalfAngle); + + float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; + vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); + + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + + // Initialize output with no intersections + intersections[0].entry = -1.0 * farSide; + intersections[0].exit = farSide; + intersections[1].entry = miss; + intersections[1].exit = miss; + + if (intersect.x == NO_HIT) { + return; + } + + // Find the points of intersection + float tmin = intersect.x; + float tmax = intersect.y; + vec3 p0 = ray.pos + tmin * ray.dir; + vec3 p1 = ray.pos + tmax * ray.dir; + + vec4 intersect0 = vec4(getConeNormal(p0, true), tmin); + vec4 intersect1 = vec4(getConeNormal(p1, true), tmax); + + bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); + bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); + + if (p0InShadowCone && p1InShadowCone) { + // no valid intersections + } else if (p0InShadowCone) { + intersections[0].exit = intersect1; + } else if (p1InShadowCone) { + intersections[0].entry = intersect0; + } else { + intersections[0].exit = intersect0; + intersections[1].entry = intersect1; + intersections[1].exit = farSide; + } +} + +RayShapeIntersection intersectRegularCone(in Ray ray, in float cosHalfAngle, in bool convex) { + // Undo the scaling from ellipsoid to sphere + ray.pos = ray.pos * u_ellipsoidRadiiUv; + ray.dir = ray.dir * u_ellipsoidRadiiUv; + // Shift the ray to account for the latitude cone not being centered at the Earth center + ray.pos.z += getLatitudeConeShift(cosHalfAngle); + + float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; + vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); + + vec4 miss = vec4(normalize(ray.dir), NO_HIT); + vec4 farSide = vec4(normalize(ray.dir), INF_HIT); + + if (intersect.x == NO_HIT) { + return RayShapeIntersection(miss, miss); + } + + // Find the points of intersection + float tmin = intersect.x; + float tmax = intersect.y; + vec3 p0 = ray.pos + tmin * ray.dir; + vec3 p1 = ray.pos + tmax * ray.dir; + + vec4 intersect0 = vec4(getConeNormal(p0, convex), tmin); + vec4 intersect1 = vec4(getConeNormal(p1, convex), tmax); + + bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); + bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); + + if (p0InShadowCone && p1InShadowCone) { + return RayShapeIntersection(miss, miss); + } else if (p0InShadowCone) { + return RayShapeIntersection(intersect1, farSide); + } else if (p1InShadowCone) { + return RayShapeIntersection(-1.0 * farSide, intersect0); + } else { + return RayShapeIntersection(intersect0, intersect1); + } +} + +void intersectShape(in Ray ray, inout Intersections ix) { + // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. + // Direction is scaled as well to be in sync with position. + ray.pos = ray.pos * 2.0 - 1.0; + ray.dir *= 2.0; + + // Outer ellipsoid + RayShapeIntersection outerIntersect = intersectHeight(ray, u_clipMinMaxHeight.y, true); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect); + + // Exit early if the outer ellipsoid was missed. + if (outerIntersect.entry.w == NO_HIT) { + return; + } + + // Inner ellipsoid + RayShapeIntersection innerIntersect = intersectHeight(ray, u_clipMinMaxHeight.x, false); + + if (innerIntersect.entry.w == NO_HIT) { + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect); + } else { + // When the ellipsoid is large and thin it's possible for floating point math + // to cause the ray to intersect the inner ellipsoid before the outer ellipsoid. + // To prevent this from happening, clamp innerIntersect to outerIntersect and + // sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection. + + // Without this special case, + // [outerMin, outerMax, innerMin, innerMax] will bubble sort to + // [outerMin, innerMin, outerMax, innerMax] which will cause the back + // side of the ellipsoid to be invisible because it will think the ray + // is still inside the inner (negative) ellipsoid after exiting the + // outer (positive) ellipsoid. + + // With this special case, + // [outerMin, innerMin, innerMax, outerMax] will bubble sort to + // [outerMin, innerMin, innerMax, outerMax] which will work correctly. + + // Note: If initializeIntersections() changes its sorting function + // from bubble sort to something else, this code may need to change. + innerIntersect.entry.w = max(innerIntersect.entry.w, outerIntersect.entry.w); + innerIntersect.exit.w = min(innerIntersect.exit.w, outerIntersect.exit.w); + setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter + setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter + setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit + setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit + } + + // Bottom cone + #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) + RayShapeIntersection bottomConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, false); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF) + RayShapeIntersection bottomConeIntersection = intersectZPlane(ray, -1.0); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF) + RayShapeIntersection bottomConeIntersections[2]; + intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, bottomConeIntersections); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersections[0]); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersections[1]); + #endif + + // Top cone + #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF) + RayShapeIntersection topConeIntersections[2]; + intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, topConeIntersections); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersections[0]); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersections[1]); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF) + RayShapeIntersection topConeIntersection = intersectZPlane(ray, 1.0); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF) + RayShapeIntersection topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, false); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); + #endif + + // Wedge + #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO) + RayShapeIntersection wedgeIntersects[2]; + intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF) + RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect); + #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF) + RayShapeIntersection wedgeIntersects[2]; + intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); + setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); + #endif +} +`, Intersection = `// Main intersection function for Voxel scenes. +// See IntersectBox.glsl, IntersectCylinder.glsl, or IntersectEllipsoid.glsl +// for the definition of intersectShape. The appropriate function is selected +// based on the VoxelPrimitive shape type, and added to the shader in +// Scene/VoxelRenderResources.js. +// See also IntersectClippingPlane.glsl and IntersectDepth.glsl. +// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, +// getFirstIntersection, initializeIntersections, nextIntersection. + +/* Intersection defines (set in Scene/VoxelRenderResources.js) +#define INTERSECTION_COUNT ### +*/ + +RayShapeIntersection intersectScene(in vec2 screenCoord, in Ray ray, out Intersections ix) { + // Do a ray-shape intersection to find the exact starting and ending points. + intersectShape(ray, ix); + + // Exit early if the positive shape was completely missed or behind the ray. + RayShapeIntersection intersection = getFirstIntersection(ix); + if (intersection.entry.w == NO_HIT) { + // Positive shape was completely missed - so exit early. + return intersection; + } + + // Clipping planes + #if defined(CLIPPING_PLANES) + intersectClippingPlanes(ray, ix); + #endif + + // Depth + #if defined(DEPTH_TEST) + intersectDepth(screenCoord, ray, ix); + #endif + + // Find the first intersection that's in front of the ray + #if (INTERSECTION_COUNT > 1) + initializeIntersections(ix); + for (int i = 0; i < INTERSECTION_COUNT; ++i) { + intersection = nextIntersection(ix); + if (intersection.exit.w > 0.0) { + // Set start to 0.0 when ray is inside the shape. + intersection.entry.w = max(intersection.entry.w, 0.0); + break; + } + } + #else + // Set start to 0.0 when ray is inside the shape. + intersection.entry.w = max(intersection.entry.w, 0.0); + #endif + + return intersection; +} +`, convertUvToBox = `/* Box defines (set in Scene/VoxelBoxShape.js) +#define BOX_HAS_SHAPE_BOUNDS +*/ + +#if defined(BOX_HAS_SHAPE_BOUNDS) + uniform vec3 u_boxUvToShapeUvScale; + uniform vec3 u_boxUvToShapeUvTranslate; +#endif + +PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { + // For BOX, UV space = shape space, so we can use positionUv as-is, + // and the Jacobian is the identity matrix, except that a step of 1 + // only spans half the shape space [-1, 1], so the identity is scaled. + return PointJacobianT(positionUv, mat3(0.5)); +} + +vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { +#if defined(BOX_HAS_SHAPE_BOUNDS) + return positionShape * u_boxUvToShapeUvScale + u_boxUvToShapeUvTranslate; +#else + return positionShape; +#endif +} + +PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { + PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); + pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); + return pointJacobian; +} + +vec3 convertShapeUvToUvSpace(in vec3 shapeUv) { +#if defined(BOX_HAS_SHAPE_BOUNDS) + return (shapeUv - u_boxUvToShapeUvTranslate) / u_boxUvToShapeUvScale; +#else + return shapeUv; +#endif +} + +vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { +#if defined(BOX_HAS_SHAPE_BOUNDS) + return shapeUv / u_boxUvToShapeUvScale; +#else + return shapeUv; +#endif +}`, convertUvToCylinder = `/* Cylinder defines (set in Scene/VoxelCylinderShape.js) +#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS +#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT +#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE +#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY +#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY +#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED +*/ + +#if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) + uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset +#endif +#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) + uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset +#endif +#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) + uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset +#endif +#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) + uniform vec2 u_cylinderShapeUvAngleMinMax; +#endif +#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) + uniform float u_cylinderShapeUvAngleRangeZeroMid; +#endif + +PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { + // Convert from Cartesian UV space [0, 1] to Cartesian local space [-1, 1] + vec3 position = positionUv * 2.0 - 1.0; + + float radius = length(position.xy); // [0, 1] + vec3 radial = normalize(vec3(position.xy, 0.0)); + + // Shape space height is defined within [0, 1] + float height = positionUv.z; // [0, 1] + vec3 z = vec3(0.0, 0.0, 1.0); + + float angle = atan(position.y, position.x); + vec3 east = normalize(vec3(-position.y, position.x, 0.0)); + + vec3 point = vec3(radius, height, angle); + mat3 jacobianT = mat3(radial, z, east / length(position.xy)); + return PointJacobianT(point, jacobianT); +} + +vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { + float radius = positionShape.x; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) + radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; + #endif + + float height = positionShape.y; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) + height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; + #endif + + float angle = (positionShape.z + czm_pi) / czm_twoPi; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) + // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative. + angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid); + #endif + + // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) + angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle; + #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) + angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle; + #endif + + angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; + #endif + + return vec3(radius, height, angle); +} + +PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { + PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); + pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); + return pointJacobian; +} + +vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { + float radius = shapeUv.x; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) + radius /= u_cylinderUvToShapeUvRadius.x; + #endif + + float height = shapeUv.y; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) + height /= u_cylinderUvToShapeUvHeight.x; + #endif + + float angle = shapeUv.z * czm_twoPi; + #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) + angle /= u_cylinderUvToShapeUvAngle.x; + #endif + + return vec3(radius, height, angle); +} +`, convertUvToEllipsoid = `/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY +#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY +#define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE +#define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED +#define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE +*/ + +uniform vec3 u_ellipsoidRadiiUv; // [0,1] +uniform vec2 u_evoluteScale; // (radiiUv.x ^ 2 - radiiUv.z ^ 2) * vec2(1.0, -1.0) / radiiUv; +uniform vec3 u_ellipsoidInverseRadiiSquaredUv; +#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) || defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) + uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid; +#endif +#if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) + uniform vec2 u_ellipsoidUvToShapeUvLongitude; // x = scale, y = offset +#endif +#if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) + uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset +#endif +uniform float u_ellipsoidInverseHeightDifferenceUv; + +// robust iterative solution without trig functions +// https://github.com/0xfaded/ellipse_demo/issues/1 +// https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse +// Extended to return radius of curvature along with the point +vec3 nearestPointAndRadiusOnEllipse(vec2 pos, vec2 radii) { + vec2 p = abs(pos); + vec2 inverseRadii = 1.0 / radii; + + // We describe the ellipse parametrically: v = radii * vec2(cos(t), sin(t)) + // but store the cos and sin of t in a vec2 for efficiency. + // Initial guess: t = pi/4 + vec2 tTrigs = vec2(0.7071067811865476); + // Initial guess of point on ellipsoid + vec2 v = radii * tTrigs; + // Center of curvature of the ellipse at v + vec2 evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; + + const int iterations = 3; + for (int i = 0; i < iterations; ++i) { + // Find the (approximate) intersection of p - evolute with the ellipsoid. + vec2 q = normalize(p - evolute) * length(v - evolute); + // Update the estimate of t. + tTrigs = (q + evolute) * inverseRadii; + tTrigs = normalize(clamp(tTrigs, 0.0, 1.0)); + v = radii * tTrigs; + evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; + } + + return vec3(v * sign(pos), length(v - evolute)); +} + +PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { + // Convert from UV space [0, 1] to local space [-1, 1] + vec3 position = positionUv * 2.0 - 1.0; + // Undo the scaling from ellipsoid to sphere + position = position * u_ellipsoidRadiiUv; + + float longitude = atan(position.y, position.x); + vec3 east = normalize(vec3(-position.y, position.x, 0.0)); + + // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z) + // (assume radii.y == radii.x) and find the nearest point on the ellipse and its normal + float distanceFromZAxis = length(position.xy); + vec2 posEllipse = vec2(distanceFromZAxis, position.z); + vec3 surfacePointAndRadius = nearestPointAndRadiusOnEllipse(posEllipse, u_ellipsoidRadiiUv.xz); + vec2 surfacePoint = surfacePointAndRadius.xy; + + vec2 normal2d = normalize(surfacePoint * u_ellipsoidInverseRadiiSquaredUv.xz); + float latitude = atan(normal2d.y, normal2d.x); + vec3 north = vec3(-normal2d.y * normalize(position.xy), abs(normal2d.x)); + + float heightSign = length(posEllipse) < length(surfacePoint) ? -1.0 : 1.0; + float height = heightSign * length(posEllipse - surfacePoint); + vec3 up = normalize(cross(east, north)); + + vec3 point = vec3(longitude, latitude, height); + mat3 jacobianT = mat3(east / distanceFromZAxis, north / (surfacePointAndRadius.z + height), up); + return PointJacobianT(point, jacobianT); +} + +vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { + // Longitude: shift & scale to [0, 1] + float longitude = (positionShape.x + czm_pi) / czm_twoPi; + + // Correct the angle when max < min + // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space. + #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) + longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z); + #endif + + // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. + #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) + longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude; + #endif + #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) + longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude; + #endif + + #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) + longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y; + #endif + + // Latitude: shift and scale to [0, 1] + float latitude = (positionShape.y + czm_piOverTwo) / czm_pi; + #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) + latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y; + #endif + + // Height: scale to the range [0, 1] + float height = 1.0 + positionShape.z * u_ellipsoidInverseHeightDifferenceUv; + + return vec3(longitude, latitude, height); +} + +PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { + PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); + pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); + return pointJacobian; +} + +vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { + // Convert from [0, 1] to radians [-pi, pi] + float longitude = shapeUv.x * czm_twoPi; + #if defined (ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) + longitude /= u_ellipsoidUvToShapeUvLongitude.x; + #endif + + // Convert from [0, 1] to radians [-pi/2, pi/2] + float latitude = shapeUv.y * czm_pi; + #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) + latitude /= u_ellipsoidUvToShapeUvLatitude.x; + #endif + + float height = shapeUv.z / u_ellipsoidInverseHeightDifferenceUv; + + return vec3(longitude, latitude, height); +} +`, Octree = `// These octree flags must be in sync with GpuOctreeFlag in VoxelTraversal.js +#define OCTREE_FLAG_INTERNAL 0 +#define OCTREE_FLAG_LEAF 1 +#define OCTREE_FLAG_PACKED_LEAF_FROM_PARENT 2 + +#define OCTREE_MAX_LEVELS 32 // Harcoded value because GLSL doesn't like variable length loops + +uniform sampler2D u_octreeInternalNodeTexture; +uniform vec2 u_octreeInternalNodeTexelSizeUv; +uniform int u_octreeInternalNodeTilesPerRow; +#if (SAMPLE_COUNT > 1) +uniform sampler2D u_octreeLeafNodeTexture; +uniform vec2 u_octreeLeafNodeTexelSizeUv; +uniform int u_octreeLeafNodeTilesPerRow; +#endif + +struct OctreeNodeData { + int data; + int flag; +}; + +struct TraversalData { + ivec4 octreeCoords; + int parentOctreeIndex; +}; + +struct SampleData { + int megatextureIndex; + ivec4 tileCoords; + vec3 tileUv; + #if (SAMPLE_COUNT > 1) + float weight; + #endif +}; + +// Integer mod: For WebGL1 only +int intMod(in int a, in int b) { + return a - (b * (a / b)); +} +int normU8_toInt(in float value) { + return int(value * 255.0); +} +int normU8x2_toInt(in vec2 value) { + return int(value.x * 255.0) + 256 * int(value.y * 255.0); +} +float normU8x2_toFloat(in vec2 value) { + return float(normU8x2_toInt(value)) / 65535.0; +} + +OctreeNodeData getOctreeNodeData(in vec2 octreeUv) { + vec4 texData = texture(u_octreeInternalNodeTexture, octreeUv); + + OctreeNodeData data; + data.data = normU8x2_toInt(texData.xy); + data.flag = normU8x2_toInt(texData.zw); + return data; +} + +OctreeNodeData getOctreeChildData(in int parentOctreeIndex, in ivec3 childCoord) { + int childIndex = childCoord.z * 4 + childCoord.y * 2 + childCoord.x; + int octreeCoordX = intMod(parentOctreeIndex, u_octreeInternalNodeTilesPerRow) * 9 + 1 + childIndex; + int octreeCoordY = parentOctreeIndex / u_octreeInternalNodeTilesPerRow; + vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); + return getOctreeNodeData(octreeUv); +} + +int getOctreeParentIndex(in int octreeIndex) { + int octreeCoordX = intMod(octreeIndex, u_octreeInternalNodeTilesPerRow) * 9; + int octreeCoordY = octreeIndex / u_octreeInternalNodeTilesPerRow; + vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); + vec4 parentData = texture(u_octreeInternalNodeTexture, octreeUv); + int parentOctreeIndex = normU8x2_toInt(parentData.xy); + return parentOctreeIndex; +} + +/** +* Convert a position in the uv-space of the tileset bounding shape +* into the uv-space of a tile within the tileset +*/ +vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { + // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2) + float dimAtLevel = exp2(float(octreeCoords.w)); + return shapePosition * dimAtLevel - vec3(octreeCoords.xyz); +} + +vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { + vec3 tileUv = getTileUv(shapePosition, octreeCoords); + return clamp(tileUv, vec3(0.0), vec3(1.0)); +} + +void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) { + sampleData.megatextureIndex = data.data; + sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT) + ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) + : octreeCoords; +} + +#if (SAMPLE_COUNT > 1) +void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleDatas[SAMPLE_COUNT]) { + int leafIndex = data.data; + int leafNodeTexelCount = 2; + // Adding 0.5 moves to the center of the texel + float leafCoordXStart = float(intMod(leafIndex, u_octreeLeafNodeTilesPerRow) * leafNodeTexelCount) + 0.5; + float leafCoordY = float(leafIndex / u_octreeLeafNodeTilesPerRow) + 0.5; + + // Get an interpolation weight and a flag to determine whether to read the parent texture + vec2 leafUv0 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 0.0, leafCoordY); + vec4 leafData0 = texture(u_octreeLeafNodeTexture, leafUv0); + float lerp = normU8x2_toFloat(leafData0.xy); + sampleDatas[0].weight = 1.0 - lerp; + sampleDatas[1].weight = lerp; + // TODO: this looks wrong? Should be comparing to OCTREE_FLAG_PACKED_LEAF_FROM_PARENT + sampleDatas[0].tileCoords = (normU8_toInt(leafData0.z) == 1) + ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) + : octreeCoords; + sampleDatas[1].tileCoords = (normU8_toInt(leafData0.w) == 1) + ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) + : octreeCoords; + + // Get megatexture indices for both samples + vec2 leafUv1 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 1.0, leafCoordY); + vec4 leafData1 = texture(u_octreeLeafNodeTexture, leafUv1); + sampleDatas[0].megatextureIndex = normU8x2_toInt(leafData1.xy); + sampleDatas[1].megatextureIndex = normU8x2_toInt(leafData1.zw); +} +#endif + +OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) { + float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w)); + vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel; + vec3 end = start + vec3(sizeAtLevel); + OctreeNodeData childData; + + for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { + // Find out which octree child contains the position + // 0 if before center, 1 if after + vec3 center = 0.5 * (start + end); + vec3 childCoord = step(center, shapePosition); + + // Get octree coords for the next level down + ivec4 octreeCoords = traversalData.octreeCoords; + traversalData.octreeCoords = ivec4(octreeCoords.xyz * 2 + ivec3(childCoord), octreeCoords.w + 1); + + childData = getOctreeChildData(traversalData.parentOctreeIndex, ivec3(childCoord)); + + if (childData.flag != OCTREE_FLAG_INTERNAL) { + // leaf tile - stop traversing + break; + } + + // interior tile - keep going deeper + start = mix(start, center, childCoord); + end = mix(center, end, childCoord); + traversalData.parentOctreeIndex = childData.data; + } + + return childData; +} + +/** +* Transform a given position to an octree tile coordinate and a position within that tile, +* and find the corresponding megatexture index and texture coordinates +*/ +void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) { + traversalData.octreeCoords = ivec4(0); + traversalData.parentOctreeIndex = 0; + + OctreeNodeData nodeData = getOctreeNodeData(vec2(0.0)); + if (nodeData.flag != OCTREE_FLAG_LEAF) { + nodeData = traverseOctreeDownwards(shapePosition, traversalData); + } + + #if (SAMPLE_COUNT == 1) + getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); + sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); + #else + getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); + sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); + sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords); + #endif +} + +bool inRange(in vec3 v, in vec3 minVal, in vec3 maxVal) { + return clamp(v, minVal, maxVal) == v; +} + +bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) { + vec3 tileUv = getTileUv(shapePosition, octreeCoords); + bool inside = inRange(tileUv, vec3(0.0), vec3(1.0)); + // Assume (!) the position is always inside the root tile. + return inside || octreeCoords.w == 0; +} + +void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) { + if (insideTile(shapePosition, traversalData.octreeCoords)) { + for (int i = 0; i < SAMPLE_COUNT; i++) { + sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); + } + return; + } + + // Go up tree until we find a parent tile containing shapePosition + for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { + traversalData.octreeCoords.xyz /= 2; + traversalData.octreeCoords.w -= 1; + + if (insideTile(shapePosition, traversalData.octreeCoords)) { + break; + } + + traversalData.parentOctreeIndex = getOctreeParentIndex(traversalData.parentOctreeIndex); + } + + // Go down tree + OctreeNodeData nodeData = traverseOctreeDownwards(shapePosition, traversalData); + + #if (SAMPLE_COUNT == 1) + getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); + sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); + #else + getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); + sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); + sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords); + #endif +} +`, Megatexture$1 = `// See Octree.glsl for the definitions of SampleData and intMod + +/* Megatexture defines (set in Scene/VoxelRenderResources.js) +#define SAMPLE_COUNT ### +#define NEAREST_SAMPLING +#define PADDING +*/ + +uniform ivec2 u_megatextureSliceDimensions; // number of slices per tile, in two dimensions +uniform ivec2 u_megatextureTileDimensions; // number of tiles per megatexture, in two dimensions +uniform vec2 u_megatextureVoxelSizeUv; +uniform vec2 u_megatextureSliceSizeUv; +uniform vec2 u_megatextureTileSizeUv; + +uniform ivec3 u_dimensions; // does not include padding +#if defined(PADDING) + uniform ivec3 u_paddingBefore; + uniform ivec3 u_paddingAfter; +#endif + +// Integer min, max, clamp: For WebGL1 only +int intMin(int a, int b) { + return a <= b ? a : b; +} +int intMax(int a, int b) { + return a >= b ? a : b; +} +int intClamp(int v, int minVal, int maxVal) { + return intMin(intMax(v, minVal), maxVal); +} + +vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale) +{ + int indexX = intMod(index, dimensions.x); + int indexY = index / dimensions.x; + return vec2(indexX, indexY) * uvScale; +} + +/* + How is 3D data stored in a 2D megatexture? + + In this example there is only one loaded tile and it has 2x2x2 voxels (8 voxels total). + The data is sliced by Z. The data at Z = 0 is placed in texels (0,0), (0,1), (1,0), (1,1) and + the data at Z = 1 is placed in texels (2,0), (2,1), (3,0), (3,1). + Note that there could be empty space in the megatexture because it's a power of two. + + 0 1 2 3 + +---+---+---+---+ + | | | | | 3 + +---+---+---+---+ + | | | | | 2 + +-------+-------+ + |010|110|011|111| 1 + |--- ---|--- ---| + |000|100|001|101| 0 + +-------+-------+ + + When doing linear interpolation the megatexture needs to be sampled twice: once for + the Z slice above the voxel coordinate and once for the slice below. The two slices + are interpolated with fract(coord.z - 0.5). For example, a Z coordinate of 1.0 is + halfway between two Z slices so the interpolation factor is 0.5. Below is a side view + of the 3D voxel grid with voxel coordinates on the left side. + + 2 +---+ + |001| + 1 +-z-+ + |000| + 0 +---+ + + When doing nearest neighbor the megatexture only needs to be sampled once at the closest Z slice. +*/ + +Properties getPropertiesFromMegatexture(in SampleData sampleData) { + int tileIndex = sampleData.megatextureIndex; + vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions); + ivec3 voxelDimensions = u_dimensions; + + #if defined(PADDING) + voxelDimensions += u_paddingBefore + u_paddingAfter; + voxelCoord += vec3(u_paddingBefore); + #endif + + #if defined(NEAREST_SAMPLING) + // Round to the center of the nearest voxel + voxelCoord = floor(voxelCoord) + vec3(0.5); + #endif + + // Tile location + vec2 tileUvOffset = index1DTo2DTexcoord(tileIndex, u_megatextureTileDimensions, u_megatextureTileSizeUv); + + // Slice location + float slice = voxelCoord.z - 0.5; + int sliceIndex = int(floor(slice)); + int sliceIndex0 = intClamp(sliceIndex, 0, voxelDimensions.z - 1); + vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); + + // Voxel location + vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(voxelDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv; + + // Final location in the megatexture + vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset; + + #if defined(NEAREST_SAMPLING) + return getPropertiesFromMegatextureAtUv(uv0); + #else + float sliceLerp = fract(slice); + int sliceIndex1 = intMin(sliceIndex + 1, voxelDimensions.z - 1); + vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); + vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset; + Properties properties0 = getPropertiesFromMegatextureAtUv(uv0); + Properties properties1 = getPropertiesFromMegatextureAtUv(uv1); + return mixProperties(properties0, properties1, sliceLerp); + #endif +} + +// Convert an array of sample datas to a final weighted properties. +Properties accumulatePropertiesFromMegatexture(in SampleData sampleDatas[SAMPLE_COUNT]) { + #if (SAMPLE_COUNT == 1) + return getPropertiesFromMegatexture(sampleDatas[0]); + #else + // When more than one sample is taken the accumulator needs to start at 0 + Properties properties = clearProperties(); + for (int i = 0; i < SAMPLE_COUNT; ++i) { + float weight = sampleDatas[i].weight; + + // Avoid reading the megatexture when the weight is 0 as it can be costly. + if (weight > 0.0) { + Properties tempProperties = getPropertiesFromMegatexture(sampleDatas[i]); + tempProperties = scaleProperties(tempProperties, weight); + properties = sumProperties(properties, tempProperties); + } + } + return properties; + #endif +} +`; +function VoxelRenderResources(e) { + const t = new ShaderBuilder(); + this.shaderBuilder = t; + const n = e._customShader, i = combine$2(e._uniformMap, n.uniformMap); + e._uniformMap = i; + const r = n.uniforms; + for (const p in r) + if (r.hasOwnProperty(p)) { + const m = r[p]; + t.addUniform( + m.type, + p, + ShaderDestination$1.FRAGMENT + ); + } + t.addUniform( + "sampler2D", + "u_megatextureTextures[METADATA_COUNT]", + ShaderDestination$1.FRAGMENT + ), this.uniformMap = i; + const o = e._clippingPlanes, s = defined(o) && o.enabled ? o.length : 0; + this.clippingPlanes = o, this.clippingPlanesLength = s, t.addVertexLines([VoxelVS]), t.addFragmentLines([ + n.fragmentShaderText, + "#line 0", + Octree, + VoxelUtils, + IntersectionUtils, + Megatexture$1 + ]), s > 0 && (t.addDefine( + "CLIPPING_PLANES", + void 0, + ShaderDestination$1.FRAGMENT + ), t.addDefine( + "CLIPPING_PLANES_COUNT", + s, + ShaderDestination$1.FRAGMENT + ), o.unionClippingRegions && t.addDefine( + "CLIPPING_PLANES_UNION", + void 0, + ShaderDestination$1.FRAGMENT + ), t.addFragmentLines([IntersectClippingPlanes])), e._depthTest && (t.addDefine( + "DEPTH_TEST", + void 0, + ShaderDestination$1.FRAGMENT + ), t.addFragmentLines([IntersectDepth])); + const c = e._provider.shape; + c === "BOX" ? t.addFragmentLines([ + convertUvToBox, + IntersectBox, + Intersection + ]) : c === "CYLINDER" ? t.addFragmentLines([ + convertUvToCylinder, + IntersectLongitude, + IntersectCylinder, + Intersection + ]) : c === "ELLIPSOID" && (t.addDefine( + "SHAPE_ELLIPSOID", + void 0, + ShaderDestination$1.FRAGMENT + ), t.addFragmentLines([ + convertUvToEllipsoid, + IntersectLongitude, + IntersectEllipsoid, + Intersection + ])), t.addFragmentLines([VoxelFS]); + const l = e._shape, d = l.shaderDefines; + for (const p in d) + if (d.hasOwnProperty(p)) { + let m = d[p]; + defined(m) && (m = m === !0 ? void 0 : m, t.addDefine(p, m, ShaderDestination$1.FRAGMENT)); + } + let f = l.shaderMaximumIntersectionsLength; + s > 0 && (t.addDefine( + "CLIPPING_PLANES_INTERSECTION_INDEX", + f, + ShaderDestination$1.FRAGMENT + ), s === 1 ? f += 1 : o.unionClippingRegions ? f += 2 : f += 1), e._depthTest && (t.addDefine( + "DEPTH_INTERSECTION_INDEX", + f, + ShaderDestination$1.FRAGMENT + ), f += 1), t.addDefine( + "INTERSECTION_COUNT", + f, + ShaderDestination$1.FRAGMENT + ), (!Cartesian3.equals(e.paddingBefore, Cartesian3.ZERO) || !Cartesian3.equals(e.paddingAfter, Cartesian3.ZERO)) && t.addDefine("PADDING", void 0, ShaderDestination$1.FRAGMENT), e._useLogDepth && t.addDefine( + "LOG_DEPTH_READ_ONLY", + void 0, + ShaderDestination$1.FRAGMENT + ), e._nearestSampling && t.addDefine( + "NEAREST_SAMPLING", + void 0, + ShaderDestination$1.FRAGMENT + ); + const h = e._traversal; + t.addDefine( + "SAMPLE_COUNT", + `${h._sampleCount}`, + ShaderDestination$1.FRAGMENT + ); +} +function processVoxelProperties(e, t) { + const { shaderBuilder: n } = e, { + names: i, + types: r, + componentTypes: o, + minimumValues: s, + maximumValues: c + } = t._provider, l = r.length, d = defined(s) && defined(c); + n.addDefine( + "METADATA_COUNT", + l, + ShaderDestination$1.FRAGMENT + ), d && n.addDefine( + "STATISTICS", + void 0, + ShaderDestination$1.FRAGMENT + ); + for (let P = 0; P < l; P++) { + const I = i[P], M = r[P], R = `PropertyStatistics_${I}`, L = `PropertyStatistics_${I}`; + n.addStruct( + R, + L, + ShaderDestination$1.FRAGMENT + ); + const g = getGlslType(M); + n.addStructField(R, g, "min"), n.addStructField(R, g, "max"); + } + const f = "Statistics", h = "Statistics", p = "statistics"; + n.addStruct( + f, + h, + ShaderDestination$1.FRAGMENT + ); + for (let P = 0; P < l; P++) { + const I = i[P], M = `PropertyStatistics_${I}`, R = I; + n.addStructField( + f, + M, + R + ); + } + const m = "Metadata", _ = "Metadata", y = "metadata"; + n.addStruct( + m, + _, + ShaderDestination$1.FRAGMENT + ), n.addStructField( + m, + h, + p + ); + for (let P = 0; P < l; P++) { + const I = i[P], M = r[P], R = getGlslType(M); + n.addStructField(m, R, I); + } + for (let P = 0; P < l; P++) { + const I = i[P], M = r[P], R = getGlslPartialDerivativeType(M), L = `VoxelProperty_${I}`, g = `VoxelProperty_${I}`; + n.addStruct( + L, + g, + ShaderDestination$1.FRAGMENT + ), n.addStructField( + L, + R, + "partialDerivativeLocal" + ), n.addStructField( + L, + R, + "partialDerivativeWorld" + ), n.addStructField( + L, + R, + "partialDerivativeView" + ), n.addStructField( + L, + R, + "partialDerivativeValid" + ); + } + const C = "Voxel", T = "Voxel", x = "voxel"; + n.addStruct( + C, + T, + ShaderDestination$1.FRAGMENT + ); + for (let P = 0; P < l; P++) { + const I = i[P], M = `VoxelProperty_${I}`; + n.addStructField(C, M, I); + } + n.addStructField(C, "vec3", "positionEC"), n.addStructField(C, "vec3", "positionUv"), n.addStructField(C, "vec3", "positionShapeUv"), n.addStructField(C, "vec3", "positionUvLocal"), n.addStructField(C, "vec3", "viewDirUv"), n.addStructField(C, "vec3", "viewDirWorld"), n.addStructField(C, "vec3", "surfaceNormal"), n.addStructField(C, "float", "travelDistance"), n.addStructField(C, "int", "stepCount"), n.addStructField(C, "int", "tileIndex"), n.addStructField(C, "int", "sampleIndex"); + const b = "FragmentInput"; + n.addStruct( + b, + "FragmentInput", + ShaderDestination$1.FRAGMENT + ), n.addStructField( + b, + _, + y + ), n.addStructField( + b, + T, + x + ); + const E = "Properties", A = "Properties", D = "properties"; + n.addStruct( + E, + A, + ShaderDestination$1.FRAGMENT + ); + for (let P = 0; P < l; P++) { + const I = i[P], M = r[P], R = getGlslType(M); + n.addStructField(E, R, I); + } + { + const P = "clearProperties"; + n.addFunction( + P, + `${A} clearProperties()`, + ShaderDestination$1.FRAGMENT + ), n.addFunctionLines(P, [ + `${A} ${D};` + ]); + for (let I = 0; I < l; I++) { + const M = i[I], R = r[I]; + o[I]; + const L = getGlslType(R); + n.addFunctionLines(P, [ + `${D}.${M} = ${L}(0.0);` + ]); + } + n.addFunctionLines(P, [ + `return ${D};` + ]); + } + { + const P = "sumProperties"; + n.addFunction( + P, + `${A} sumProperties(${A} propertiesA, ${A} propertiesB)`, + ShaderDestination$1.FRAGMENT + ), n.addFunctionLines(P, [ + `${A} ${D};` + ]); + for (let I = 0; I < l; I++) { + const M = i[I]; + n.addFunctionLines(P, [ + `${D}.${M} = propertiesA.${M} + propertiesB.${M};` + ]); + } + n.addFunctionLines(P, [ + `return ${D};` + ]); + } + { + const P = "scaleProperties"; + n.addFunction( + P, + `${A} scaleProperties(${A} ${D}, float scale)`, + ShaderDestination$1.FRAGMENT + ), n.addFunctionLines(P, [ + `${A} scaledProperties = ${D};` + ]); + for (let I = 0; I < l; I++) { + const M = i[I]; + n.addFunctionLines(P, [ + `scaledProperties.${M} *= scale;` + ]); + } + n.addFunctionLines(P, ["return scaledProperties;"]); + } + { + const P = "mixProperties"; + n.addFunction( + P, + `${A} mixProperties(${A} propertiesA, ${A} propertiesB, float mixFactor)`, + ShaderDestination$1.FRAGMENT + ), n.addFunctionLines(P, [ + `${A} ${D};` + ]); + for (let I = 0; I < l; I++) { + const M = i[I]; + n.addFunctionLines(P, [ + `${D}.${M} = mix(propertiesA.${M}, propertiesB.${M}, mixFactor);` + ]); + } + n.addFunctionLines(P, [ + `return ${D};` + ]); + } + { + const P = "copyPropertiesToMetadata"; + n.addFunction( + P, + `void copyPropertiesToMetadata(in ${A} ${D}, inout ${_} ${y})`, + ShaderDestination$1.FRAGMENT + ); + for (let I = 0; I < l; I++) { + const M = i[I]; + n.addFunctionLines(P, [ + `${y}.${M} = ${D}.${M};` + ]); + } + } + if (d) { + const P = "setStatistics"; + n.addFunction( + P, + `void setStatistics(inout ${h} ${p})`, + ShaderDestination$1.FRAGMENT + ); + for (let I = 0; I < l; I++) { + const M = i[I], R = r[I], L = MetadataType$1.getComponentCount(R); + for (let g = 0; g < L; g++) { + const w = getGlslField(R, g), O = s[I][g], N = c[I][g]; + n.addFunctionLines(P, [ + `${p}.${M}.min${w} = ${getGlslNumberAsFloat( + O + )};`, + `${p}.${M}.max${w} = ${getGlslNumberAsFloat( + N + )};` + ]); + } + } + } + { + const P = "getPropertiesFromMegatextureAtUv"; + n.addFunction( + P, + `${A} getPropertiesFromMegatextureAtUv(vec2 texcoord)`, + ShaderDestination$1.FRAGMENT + ), n.addFunctionLines(P, [ + `${A} ${D};` + ]); + for (let I = 0; I < l; I++) { + const M = i[I], R = r[I]; + o[I]; + const L = getGlslTextureSwizzle(R); + n.addFunctionLines(P, [ + `properties.${M} = texture(u_megatextureTextures[${I}], texcoord)${L};` + ]); + } + n.addFunctionLines(P, [ + `return ${D};` + ]); + } +} +function getGlslType(e) { + if (e === MetadataType$1.SCALAR) + return "float"; + if (e === MetadataType$1.VEC2) + return "vec2"; + if (e === MetadataType$1.VEC3) + return "vec3"; + if (e === MetadataType$1.VEC4) + return "vec4"; +} +function getGlslTextureSwizzle(e) { + if (e === MetadataType$1.SCALAR) + return ".r"; + if (e === MetadataType$1.VEC2) + return ".ra"; + if (e === MetadataType$1.VEC3) + return ".rgb"; + if (e === MetadataType$1.VEC4) + return ""; +} +function getGlslPartialDerivativeType(e) { + if (e === MetadataType$1.SCALAR) + return "vec3"; + if (e === MetadataType$1.VEC2) + return "mat2"; + if (e === MetadataType$1.VEC3) + return "mat3"; + if (e === MetadataType$1.VEC4) + return "mat4"; +} +function getGlslNumberAsFloat(e) { + let t = e.toString(); + return t.indexOf(".") === -1 && (t = `${e}.0`), t; +} +function getGlslField(e, t) { + return e === MetadataType$1.SCALAR ? "" : `[${t}]`; +} +function buildVoxelDrawCommands(e, t) { + const n = new VoxelRenderResources(e); + processVoxelProperties(n, e); + const { + shaderBuilder: i, + clippingPlanes: r, + clippingPlanesLength: o + } = n; + if (o > 0) { + const T = "getClippingPlane", x = getClippingFunction(r, t), b = 0, S = x.indexOf(")") + 1, E = x.indexOf("{", S) + 1, A = x.indexOf("}", E), D = x.slice( + b, + S + ), P = x.slice( + E, + A + ); + i.addFunction( + T, + D, + ShaderDestination$1.FRAGMENT + ), i.addFunctionLines(T, [P]); + } + const s = i.clone(); + s.addDefine("PICKING", void 0, ShaderDestination$1.FRAGMENT); + const c = i.clone(); + c.addDefine( + "PICKING_VOXEL", + void 0, + ShaderDestination$1.FRAGMENT + ); + const l = i.buildShaderProgram(t), d = s.buildShaderProgram(t), f = c.buildShaderProgram( + t + ), h = RenderState.fromCache({ + cull: { + enabled: !0, + face: CullFace$1.BACK + }, + depthTest: { + enabled: !1 + }, + depthMask: !1, + // internally the shader does premultiplied alpha, so it makes sense to blend that way too + blending: BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND + }), p = t.getViewportQuadVertexArray(), m = e._depthTest, _ = new DrawCommand({ + vertexArray: p, + primitiveType: PrimitiveType$1.TRIANGLES, + renderState: h, + shaderProgram: l, + uniformMap: n.uniformMap, + modelMatrix: e._compoundModelMatrix, + pass: Pass$1.VOXELS, + executeInClosestFrustum: !0, + owner: this, + cull: m, + // don't cull or occlude if depth testing is off + occlude: m + // don't cull or occlude if depth testing is off + }), y = DrawCommand.shallowClone( + _, + new DrawCommand() + ); + y.shaderProgram = d, y.pickOnly = !0; + const C = DrawCommand.shallowClone( + _, + new DrawCommand() + ); + if (C.shaderProgram = f, C.pickOnly = !0, defined(e._drawCommand)) { + const T = e._drawCommand; + T.shaderProgram = T.shaderProgram && T.shaderProgram.destroy(); + } + if (defined(e._drawCommandPick)) { + const T = e._drawCommandPick; + T.shaderProgram = T.shaderProgram && T.shaderProgram.destroy(); + } + if (defined(e._drawCommandPickVoxel)) { + const T = e._drawCommandPickVoxel; + T.shaderProgram = T.shaderProgram && T.shaderProgram.destroy(); + } + e._drawCommand = _, e._drawCommandPick = y, e._drawCommandPickVoxel = C; +} +function VoxelBoxShape() { + this.orientedBoundingBox = new OrientedBoundingBox(), this.boundingSphere = new BoundingSphere(), this.boundTransform = new Matrix4(), this.shapeTransform = new Matrix4(), this._minBounds = Cartesian3.clone( + VoxelBoxShape.DefaultMinBounds, + new Cartesian3() + ), this._maxBounds = Cartesian3.clone( + VoxelBoxShape.DefaultMaxBounds, + new Cartesian3() + ), this.shaderUniforms = { + renderMinBounds: new Cartesian3(), + renderMaxBounds: new Cartesian3(), + boxUvToShapeUvScale: new Cartesian3(), + boxUvToShapeUvTranslate: new Cartesian3() + }, this.shaderDefines = { + BOX_INTERSECTION_INDEX: void 0, + BOX_HAS_SHAPE_BOUNDS: void 0 + }, this.shaderMaximumIntersectionsLength = 0; +} +const scratchCenter = new Cartesian3(), scratchScale$4 = new Cartesian3(), scratchRotation$2 = new Matrix3(), scratchClipMinBounds$1 = new Cartesian3(), scratchClipMaxBounds$1 = new Cartesian3(), scratchRenderMinBounds$1 = new Cartesian3(), scratchRenderMaxBounds$1 = new Cartesian3(), transformLocalToUv = Matrix4.fromRotationTranslation( + Matrix3.fromUniformScale(0.5, new Matrix3()), + new Cartesian3(0.5, 0.5, 0.5), + new Matrix4() +); +VoxelBoxShape.prototype.update = function(e, t, n, i, r) { + i = defaultValue(i, VoxelBoxShape.DefaultMinBounds), r = defaultValue(r, VoxelBoxShape.DefaultMaxBounds); + const o = VoxelBoxShape.DefaultMinBounds, s = VoxelBoxShape.DefaultMaxBounds; + t = this._minBounds = Cartesian3.clamp( + t, + o, + s, + this._minBounds + ), n = this._maxBounds = Cartesian3.clamp( + n, + o, + s, + this._maxBounds + ), i = Cartesian3.clamp( + i, + o, + s, + scratchClipMinBounds$1 + ), r = Cartesian3.clamp( + r, + o, + s, + scratchClipMaxBounds$1 + ); + const c = Cartesian3.clamp( + t, + i, + r, + scratchRenderMinBounds$1 + ), l = Cartesian3.clamp( + n, + i, + r, + scratchRenderMaxBounds$1 + ), d = Matrix4.getScale(e, scratchScale$4); + if (c.x > l.x || c.y > l.y || c.z > l.z || (c.x === l.x) + (c.y === l.y) + (c.z === l.z) >= 2 || i.x > r.x || i.y > r.y || i.z > r.z || d.x === 0 || d.y === 0 || d.z === 0) + return !1; + this.shapeTransform = Matrix4.clone(e, this.shapeTransform), this.orientedBoundingBox = getBoxChunkObb( + c, + l, + this.shapeTransform, + this.orientedBoundingBox + ), this.boundTransform = Matrix4.fromRotationTranslation( + this.orientedBoundingBox.halfAxes, + this.orientedBoundingBox.center, + this.boundTransform + ), this.boundingSphere = BoundingSphere.fromOrientedBoundingBox( + this.orientedBoundingBox, + this.boundingSphere + ); + const { shaderUniforms: f, shaderDefines: h } = this; + for (const _ in h) + h.hasOwnProperty(_) && (h[_] = void 0); + const p = !Cartesian3.equals(t, o) || !Cartesian3.equals(n, s); + let m = 0; + if (h.BOX_INTERSECTION_INDEX = m, m += 1, f.renderMinBounds = Matrix4.multiplyByPoint( + transformLocalToUv, + c, + f.renderMinBounds + ), f.renderMaxBounds = Matrix4.multiplyByPoint( + transformLocalToUv, + l, + f.renderMaxBounds + ), p) { + h.BOX_HAS_SHAPE_BOUNDS = !0; + const _ = t, y = n; + f.boxUvToShapeUvScale = Cartesian3.fromElements( + 2 / (_.x === y.x ? 1 : y.x - _.x), + 2 / (_.y === y.y ? 1 : y.y - _.y), + 2 / (_.z === y.z ? 1 : y.z - _.z), + f.boxUvToShapeUvScale + ), f.boxUvToShapeUvTranslate = Cartesian3.fromElements( + -f.boxUvToShapeUvScale.x * (_.x * 0.5 + 0.5), + -f.boxUvToShapeUvScale.y * (_.y * 0.5 + 0.5), + -f.boxUvToShapeUvScale.z * (_.z * 0.5 + 0.5), + f.boxUvToShapeUvTranslate + ); + } + return this.shaderMaximumIntersectionsLength = m, !0; +}; +const scratchTileMinBounds$2 = new Cartesian3(), scratchTileMaxBounds$2 = new Cartesian3(); +VoxelBoxShape.prototype.computeOrientedBoundingBoxForTile = function(e, t, n, i, r) { + const o = this._minBounds, s = this._maxBounds, c = 1 / Math.pow(2, e), l = Cartesian3.fromElements( + CesiumMath.lerp(o.x, s.x, c * t), + CesiumMath.lerp(o.y, s.y, c * n), + CesiumMath.lerp(o.z, s.z, c * i), + scratchTileMinBounds$2 + ), d = Cartesian3.fromElements( + CesiumMath.lerp(o.x, s.x, c * (t + 1)), + CesiumMath.lerp(o.y, s.y, c * (n + 1)), + CesiumMath.lerp(o.z, s.z, c * (i + 1)), + scratchTileMaxBounds$2 + ); + return getBoxChunkObb( + l, + d, + this.shapeTransform, + r + ); +}; +const sampleSizeScratch$2 = new Cartesian3(); +VoxelBoxShape.prototype.computeOrientedBoundingBoxForSample = function(e, t, n, i) { + const r = 1 / Math.pow(2, e.level), o = Cartesian3.divideComponents( + Cartesian3.ONE, + t, + sampleSizeScratch$2 + ), s = Cartesian3.multiplyByScalar( + o, + r, + sampleSizeScratch$2 + ), c = Cartesian3.multiplyByScalar( + Cartesian3.fromElements( + e.x + n.x, + e.y + n.y, + e.z + n.z, + scratchTileMinBounds$2 + ), + r, + scratchTileMinBounds$2 + ), l = Cartesian3.add( + c, + s, + scratchTileMaxBounds$2 + ), d = this._minBounds, f = this._maxBounds, h = Cartesian3.fromElements( + CesiumMath.lerp(d.x, f.x, c.x), + CesiumMath.lerp(d.y, f.y, c.y), + CesiumMath.lerp(d.z, f.z, c.z), + scratchTileMinBounds$2 + ), p = Cartesian3.fromElements( + CesiumMath.lerp(d.x, f.x, l.x), + CesiumMath.lerp(d.y, f.y, l.y), + CesiumMath.lerp(d.z, f.z, l.z), + scratchTileMaxBounds$2 + ); + return getBoxChunkObb( + h, + p, + this.shapeTransform, + i + ); +}; +VoxelBoxShape.DefaultMinBounds = Object.freeze( + new Cartesian3(-1, -1, -1) +); +VoxelBoxShape.DefaultMaxBounds = Object.freeze( + new Cartesian3(1, 1, 1) +); +function getBoxChunkObb(e, t, n, i) { + const r = VoxelBoxShape.DefaultMinBounds, o = VoxelBoxShape.DefaultMaxBounds; + if (Cartesian3.equals(e, r) && Cartesian3.equals(t, o)) + i.center = Matrix4.getTranslation(n, i.center), i.halfAxes = Matrix4.getMatrix3(n, i.halfAxes); + else { + let c = Matrix4.getScale(n, scratchScale$4); + const l = Cartesian3.midpoint( + e, + t, + scratchCenter + ); + i.center = Matrix4.multiplyByPoint(n, l, i.center), c = Cartesian3.fromElements( + c.x * 0.5 * (t.x - e.x), + c.y * 0.5 * (t.y - e.y), + c.z * 0.5 * (t.z - e.z), + scratchScale$4 + ); + const d = Matrix4.getRotation(n, scratchRotation$2); + i.halfAxes = Matrix3.setScale(d, c, i.halfAxes); + } + return i; +} +function VoxelCylinderShape() { + this.orientedBoundingBox = new OrientedBoundingBox(), this.boundingSphere = new BoundingSphere(), this.boundTransform = new Matrix4(), this.shapeTransform = new Matrix4(), this._minimumRadius = VoxelCylinderShape.DefaultMinBounds.x, this._maximumRadius = VoxelCylinderShape.DefaultMaxBounds.x, this._minimumHeight = VoxelCylinderShape.DefaultMinBounds.y, this._maximumHeight = VoxelCylinderShape.DefaultMaxBounds.y, this._minimumAngle = VoxelCylinderShape.DefaultMinBounds.z, this._maximumAngle = VoxelCylinderShape.DefaultMaxBounds.z, this.shaderUniforms = { + cylinderRenderHeightMinMax: new Cartesian2(), + cylinderRenderRadiusMinMax: new Cartesian2(), + cylinderRenderAngleMinMax: new Cartesian2(), + cylinderUvToShapeUvRadius: new Cartesian2(), + cylinderUvToShapeUvHeight: new Cartesian2(), + cylinderUvToShapeUvAngle: new Cartesian2(), + cylinderShapeUvAngleMinMax: new Cartesian2(), + cylinderShapeUvAngleRangeZeroMid: 0 + }, this.shaderDefines = { + CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN: void 0, + CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT: void 0, + CYLINDER_HAS_RENDER_BOUNDS_ANGLE: void 0, + CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO: void 0, + CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF: void 0, + CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_RADIUS: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_ANGLE: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY: void 0, + CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED: void 0, + CYLINDER_INTERSECTION_INDEX_RADIUS_MAX: void 0, + CYLINDER_INTERSECTION_INDEX_RADIUS_MIN: void 0, + CYLINDER_INTERSECTION_INDEX_ANGLE: void 0 + }, this.shaderMaximumIntersectionsLength = 0; +} +const scratchScale$3 = new Cartesian3(); +VoxelCylinderShape.prototype.update = function(e, t, n, i, r) { + i = defaultValue( + i, + VoxelCylinderShape.DefaultMinBounds + ), r = defaultValue( + r, + VoxelCylinderShape.DefaultMaxBounds + ); + const o = VoxelCylinderShape.DefaultMinBounds.x, s = VoxelCylinderShape.DefaultMaxBounds.x, c = VoxelCylinderShape.DefaultMinBounds.y, l = VoxelCylinderShape.DefaultMaxBounds.y, d = VoxelCylinderShape.DefaultMinBounds.z, f = VoxelCylinderShape.DefaultMaxBounds.z, h = f - d, p = 0.5 * h, m = CesiumMath.EPSILON10, _ = CesiumMath.EPSILON3, y = CesiumMath.EPSILON10, C = CesiumMath.clamp( + t.x, + o, + s + ), T = CesiumMath.clamp( + n.x, + o, + s + ), x = CesiumMath.clamp( + i.x, + o, + s + ), b = CesiumMath.clamp( + r.x, + o, + s + ), S = Math.max(C, x), E = Math.min(T, b), A = CesiumMath.clamp( + t.y, + c, + l + ), D = CesiumMath.clamp( + n.y, + c, + l + ), P = CesiumMath.clamp( + i.y, + c, + l + ), I = CesiumMath.clamp( + r.y, + c, + l + ), M = Math.max(A, P), R = Math.min(D, I), L = CesiumMath.negativePiToPi(t.z), g = CesiumMath.negativePiToPi(n.z), w = CesiumMath.negativePiToPi(i.z), O = CesiumMath.negativePiToPi(r.z), N = Math.max(L, w), F = Math.min(g, O), B = Matrix4.getScale(e, scratchScale$3); + if (E === 0 || S > E || M > R || CesiumMath.equalsEpsilon(B.x, 0, void 0, m) || CesiumMath.equalsEpsilon(B.y, 0, void 0, m) || CesiumMath.equalsEpsilon(B.z, 0, void 0, m)) + return !1; + this._minimumRadius = C, this._maximumRadius = T, this._minimumHeight = A, this._maximumHeight = D, this._minimumAngle = L, this._maximumAngle = g, this.shapeTransform = Matrix4.clone(e, this.shapeTransform), this.orientedBoundingBox = getCylinderChunkObb( + S, + E, + M, + R, + N, + F, + this.shapeTransform, + this.orientedBoundingBox + ), this.boundTransform = Matrix4.fromRotationTranslation( + this.orientedBoundingBox.halfAxes, + this.orientedBoundingBox.center, + this.boundTransform + ), this.boundingSphere = BoundingSphere.fromOrientedBoundingBox( + this.orientedBoundingBox, + this.boundingSphere + ); + const k = C === o && T === s, $ = A === c && D === l, G = g < L, q = g - L + G * h, z = q > p + y && q < h - y, H = q < p - y, Q = q >= p - y && q <= p + y, ne = z || H || Q, K = CesiumMath.equalsEpsilon( + L, + d, + void 0, + _ + ), Z = CesiumMath.equalsEpsilon( + g, + f, + void 0, + _ + ), ee = S === o, oe = F < N, X = F - N + oe * h, fe = X >= p - y && X < h - y, de = X > y && X < p - y, ce = X <= y, ye = fe || de || ce, { shaderUniforms: ge, shaderDefines: re } = this; + for (const pe in re) + re.hasOwnProperty(pe) && (re[pe] = void 0); + let be = 0; + if (re.CYLINDER_INTERSECTION_INDEX_RADIUS_MAX = be, be += 1, ee || (re.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN = !0, re.CYLINDER_INTERSECTION_INDEX_RADIUS_MIN = be, be += 1), ge.cylinderRenderRadiusMinMax = Cartesian2.fromElements( + S, + E, + ge.cylinderRenderRadiusMinMax + ), S === E && (re.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT = !0), !k) { + re.CYLINDER_HAS_SHAPE_BOUNDS_RADIUS = !0; + const pe = T - C; + let Te = 0, xe = 1; + pe !== 0 && (Te = 1 / pe, xe = -C / pe), ge.cylinderUvToShapeUvRadius = Cartesian2.fromElements( + Te, + xe, + ge.cylinderUvToShapeUvRadius + ); + } + if (!$) { + re.CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT = !0; + const pe = D - A; + let Te = 0, xe = 1; + pe !== 0 && (Te = 2 / pe, xe = -(A + 1) / pe), ge.cylinderUvToShapeUvHeight = Cartesian2.fromElements( + Te, + xe, + ge.cylinderUvToShapeUvHeight + ); + } + if (ge.cylinderRenderHeightMinMax = Cartesian2.fromElements( + M, + R, + ge.cylinderRenderHeightMinMax + ), G && (re.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED = !0), ye && (re.CYLINDER_HAS_RENDER_BOUNDS_ANGLE = !0, re.CYLINDER_INTERSECTION_INDEX_ANGLE = be, fe ? (re.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF = !0, be += 1) : de ? (re.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF = !0, be += 2) : ce && (re.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO = !0, be += 2), ge.cylinderRenderAngleMinMax = Cartesian2.fromElements( + N, + F, + ge.cylinderRenderAngleMinMax + )), ne) { + re.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE = !0, K && (re.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY = !0), Z && (re.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY = !0); + const pe = (L - d) / h, Te = (g - d) / h, xe = 1 - q / h; + if (ge.cylinderShapeUvAngleMinMax = Cartesian2.fromElements( + pe, + Te, + ge.cylinderShapeUvAngleMinMax + ), ge.cylinderShapeUvAngleRangeZeroMid = (Te + 0.5 * xe) % 1, q <= y) + ge.cylinderUvToShapeUvAngle = Cartesian2.fromElements( + 0, + 1, + ge.cylinderUvToShapeUvAngle + ); + else { + const W = h / q, j = -(L - d) / q; + ge.cylinderUvToShapeUvAngle = Cartesian2.fromElements( + W, + j, + ge.cylinderUvToShapeUvAngle + ); + } + } + return this.shaderMaximumIntersectionsLength = be, !0; +}; +VoxelCylinderShape.prototype.computeOrientedBoundingBoxForTile = function(e, t, n, i, r) { + const o = this._minimumRadius, s = this._maximumRadius, c = this._minimumHeight, l = this._maximumHeight, d = this._minimumAngle, f = this._maximumAngle, h = 1 / Math.pow(2, e), p = CesiumMath.lerp( + o, + s, + t * h + ), m = CesiumMath.lerp( + o, + s, + (t + 1) * h + ), _ = CesiumMath.lerp( + c, + l, + n * h + ), y = CesiumMath.lerp( + c, + l, + (n + 1) * h + ), C = CesiumMath.lerp( + d, + f, + i * h + ), T = CesiumMath.lerp( + d, + f, + (i + 1) * h + ); + return getCylinderChunkObb( + p, + m, + _, + y, + C, + T, + this.shapeTransform, + r + ); +}; +const sampleSizeScratch$1 = new Cartesian3(), scratchTileMinBounds$1 = new Cartesian3(), scratchTileMaxBounds$1 = new Cartesian3(); +VoxelCylinderShape.prototype.computeOrientedBoundingBoxForSample = function(e, t, n, i) { + const r = 1 / Math.pow(2, e.level), o = Cartesian3.divideComponents( + Cartesian3.ONE, + t, + sampleSizeScratch$1 + ), s = Cartesian3.multiplyByScalar( + o, + r, + sampleSizeScratch$1 + ), c = Cartesian3.multiplyByScalar( + Cartesian3.fromElements( + e.x + n.x, + e.y + n.y, + e.z + n.z, + scratchTileMinBounds$1 + ), + r, + scratchTileMinBounds$1 + ), l = Cartesian3.add( + c, + s, + scratchTileMaxBounds$1 + ), d = this._minimumRadius, f = this._maximumRadius, h = this._minimumHeight, p = this._maximumHeight, m = this._minimumAngle, _ = this._maximumAngle, y = CesiumMath.lerp(d, f, c.x), C = CesiumMath.lerp(d, f, l.x), T = CesiumMath.lerp(h, p, c.y), x = CesiumMath.lerp(h, p, l.y), b = CesiumMath.lerp(m, _, c.z), S = CesiumMath.lerp(m, _, l.z); + return getCylinderChunkObb( + y, + C, + T, + x, + b, + S, + this.shapeTransform, + i + ); +}; +VoxelCylinderShape.DefaultMinBounds = Object.freeze( + new Cartesian3(0, -1, -CesiumMath.PI) +); +VoxelCylinderShape.DefaultMaxBounds = Object.freeze( + new Cartesian3(1, 1, +CesiumMath.PI) +); +const maxTestAngles = 5, scratchTestAngles = new Array(maxTestAngles), scratchTranslation = new Cartesian3(), scratchRotation$1 = new Matrix3(), scratchTranslationMatrix = new Matrix4(), scratchRotationMatrix = new Matrix4(), scratchScaleMatrix = new Matrix4(), scratchMatrix = new Matrix4(), scratchColumn0 = new Cartesian3(), scratchColumn1 = new Cartesian3(), scratchColumn2 = new Cartesian3(), scratchCorners = new Array(8); +for (let e = 0; e < 8; e++) + scratchCorners[e] = new Cartesian3(); +function orthogonal(e, t, n) { + return Math.abs(Cartesian4.dot(e, t)) < n; +} +function isValidOrientedBoundingBoxTransformation(e) { + const t = Matrix4.getColumn(e, 0, scratchColumn0), n = Matrix4.getColumn(e, 1, scratchColumn1), i = Matrix4.getColumn(e, 2, scratchColumn2), r = CesiumMath.EPSILON4; + return orthogonal(t, n, r) && orthogonal(n, i, r); +} +function computeLooseOrientedBoundingBox(e, t) { + const n = scratchCorners; + Cartesian3.fromElements(-0.5, -0.5, -0.5, n[0]), Cartesian3.fromElements(-0.5, -0.5, 0.5, n[1]), Cartesian3.fromElements(-0.5, 0.5, -0.5, n[2]), Cartesian3.fromElements(-0.5, 0.5, 0.5, n[3]), Cartesian3.fromElements(0.5, -0.5, -0.5, n[4]), Cartesian3.fromElements(0.5, -0.5, 0.5, n[5]), Cartesian3.fromElements(0.5, 0.5, -0.5, n[6]), Cartesian3.fromElements(0.5, 0.5, 0.5, n[7]); + for (let i = 0; i < 8; ++i) + Matrix4.multiplyByPoint(e, n[i], n[i]); + return OrientedBoundingBox.fromPoints(n, t); +} +function getCylinderChunkObb(e, t, n, i, r, o, s, c) { + const l = VoxelCylinderShape.DefaultMinBounds, d = VoxelCylinderShape.DefaultMaxBounds, f = l.x, h = d.x, p = l.y, m = d.y, _ = l.z, y = d.z; + if (e === f && t === h && n === p && i === m && r === _ && o === y) + return c.center = Matrix4.getTranslation(s, c.center), c.halfAxes = Matrix4.getMatrix3(s, c.halfAxes), c; + o < r && (o += CesiumMath.TWO_PI); + const T = o - r, x = r + T * 0.5, b = scratchTestAngles; + let S = 0; + b[S++] = r, b[S++] = o, b[S++] = x, T > CesiumMath.PI && (b[S++] = x - CesiumMath.PI_OVER_TWO, b[S++] = x + CesiumMath.PI_OVER_TWO); + let E = 1, A = 1, D = -1, P = -1; + for (let G = 0; G < S; ++G) { + const q = b[G] - x, z = Math.cos(q), H = Math.sin(q), Q = z * e, ne = H * e, K = z * t, Z = H * t; + E = Math.min(E, Q), A = Math.min(A, ne), E = Math.min(E, K), A = Math.min(A, Z), D = Math.max(D, Q), P = Math.max(P, ne), D = Math.max(D, K), P = Math.max(P, Z); + } + const I = D - E, M = P - A, R = i - n, L = (E + D) * 0.5, g = (A + P) * 0.5, w = (n + i) * 0.5, O = Cartesian3.fromElements( + L, + g, + w, + scratchTranslation + ), N = Matrix3.fromRotationZ(x, scratchRotation$1), F = Cartesian3.fromElements( + I, + M, + R, + scratchScale$3 + ), B = Matrix4.fromScale(F, scratchScaleMatrix), V = Matrix4.fromRotation(N, scratchRotationMatrix), U = Matrix4.fromTranslation( + O, + scratchTranslationMatrix + ), k = Matrix4.multiplyTransformation( + V, + Matrix4.multiplyTransformation( + U, + B, + scratchMatrix + ), + scratchMatrix + ), $ = Matrix4.multiplyTransformation( + s, + k, + scratchMatrix + ); + return isValidOrientedBoundingBoxTransformation($) ? OrientedBoundingBox.fromTransformation($, c) : computeLooseOrientedBoundingBox($, c); +} +function VoxelEllipsoidShape() { + this.orientedBoundingBox = new OrientedBoundingBox(), this.boundingSphere = new BoundingSphere(), this.boundTransform = new Matrix4(), this.shapeTransform = new Matrix4(), this._rectangle = new Rectangle(), this._minimumHeight = VoxelEllipsoidShape.DefaultMinBounds.z, this._maximumHeight = VoxelEllipsoidShape.DefaultMaxBounds.z, this._ellipsoid = new Ellipsoid(), this._translation = new Cartesian3(), this._rotation = new Matrix3(), this.shaderUniforms = { + ellipsoidRadiiUv: new Cartesian3(), + eccentricitySquared: 0, + evoluteScale: new Cartesian2(), + ellipsoidInverseRadiiSquaredUv: new Cartesian3(), + ellipsoidRenderLongitudeMinMax: new Cartesian2(), + ellipsoidShapeUvLongitudeMinMaxMid: new Cartesian3(), + ellipsoidUvToShapeUvLongitude: new Cartesian2(), + ellipsoidUvToShapeUvLatitude: new Cartesian2(), + ellipsoidRenderLatitudeSinMinMax: new Cartesian2(), + ellipsoidInverseHeightDifferenceUv: 0, + clipMinMaxHeight: new Cartesian2() + }, this.shaderDefines = { + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY: void 0, + ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE: void 0, + ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF: void 0, + ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF: void 0, + ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE: void 0, + ELLIPSOID_INTERSECTION_INDEX_LONGITUDE: void 0, + ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX: void 0, + ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN: void 0, + ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX: void 0, + ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN: void 0 + }, this.shaderMaximumIntersectionsLength = 0; +} +const scratchActualMinBounds = new Cartesian3(), scratchShapeMinBounds = new Cartesian3(), scratchShapeMaxBounds = new Cartesian3(), scratchClipMinBounds = new Cartesian3(), scratchClipMaxBounds = new Cartesian3(), scratchRenderMinBounds = new Cartesian3(), scratchRenderMaxBounds = new Cartesian3(), scratchScale$2 = new Cartesian3(), scratchRotationScale = new Matrix3(), scratchShapeOuterExtent = new Cartesian3(), scratchRenderOuterExtent = new Cartesian3(), scratchRenderRectangle = new Rectangle(); +VoxelEllipsoidShape.prototype.update = function(e, t, n, i, r) { + const { DefaultMinBounds: o, DefaultMaxBounds: s } = VoxelEllipsoidShape; + i = defaultValue(i, o), r = defaultValue(r, s); + const c = CesiumMath.EPSILON10, l = CesiumMath.EPSILON3, d = CesiumMath.EPSILON10, f = CesiumMath.EPSILON10, h = CesiumMath.EPSILON3, p = Matrix4.getScale(e, scratchScale$2), m = Cartesian3.clone( + o, + scratchActualMinBounds + ); + m.z = -Cartesian3.minimumComponent(p); + const _ = Cartesian3.clamp( + t, + m, + s, + scratchShapeMinBounds + ), y = Cartesian3.clamp( + n, + m, + s, + scratchShapeMaxBounds + ), C = Cartesian3.clamp( + i, + m, + s, + scratchClipMinBounds + ), T = Cartesian3.clamp( + r, + m, + s, + scratchClipMaxBounds + ), x = Cartesian3.maximumByComponent( + _, + C, + scratchRenderMinBounds + ), b = Cartesian3.minimumByComponent( + y, + T, + scratchRenderMaxBounds + ), S = Cartesian3.add( + p, + Cartesian3.fromElements( + y.z, + y.z, + y.z, + scratchShapeOuterExtent + ), + scratchShapeOuterExtent + ), E = Cartesian3.maximumComponent(S), A = Cartesian3.add( + p, + Cartesian3.fromElements( + b.z, + b.z, + b.z, + scratchRenderOuterExtent + ), + scratchRenderOuterExtent + ); + if (x.y > b.y || x.y === s.y || b.y === o.y || x.z > b.z || CesiumMath.equalsEpsilon( + A, + Cartesian3.ZERO, + void 0, + c + )) + return !1; + this._rectangle = Rectangle.fromRadians( + _.x, + _.y, + y.x, + y.y + ), this._translation = Matrix4.getTranslation(e, this._translation), this._rotation = Matrix4.getRotation(e, this._rotation), this._ellipsoid = Ellipsoid.fromCartesian3(p, this._ellipsoid), this._minimumHeight = _.z, this._maximumHeight = y.z; + const D = Rectangle.fromRadians( + x.x, + x.y, + b.x, + b.y, + scratchRenderRectangle + ); + this.orientedBoundingBox = getEllipsoidChunkObb( + D, + x.z, + b.z, + this._ellipsoid, + this._translation, + this._rotation, + this.orientedBoundingBox + ), this.shapeTransform = Matrix4.fromRotationTranslation( + Matrix3.setScale(this._rotation, S, scratchRotationScale), + this._translation, + this.shapeTransform + ), this.boundTransform = Matrix4.fromRotationTranslation( + this.orientedBoundingBox.halfAxes, + this.orientedBoundingBox.center, + this.boundTransform + ), this.boundingSphere = BoundingSphere.fromOrientedBoundingBox( + this.orientedBoundingBox, + this.boundingSphere + ); + const P = s.x - o.x, I = 0.5 * P, M = b.x < x.x, R = b.x - x.x + M * P, L = R <= d, g = R >= I - d && R < P - d, w = R > d && R < I - d, O = L || g || w, N = y.x < _.x, F = y.x - _.x + N * P, B = F > I + d && F < P - d, V = F >= I - d && F <= I + d, U = F < I - d, k = B || V || U, $ = b.y < -h, G = b.y >= -h && b.y <= +h, q = b.y > +h && b.y < s.y - f, z = $ || G || q, H = x.y > o.y + f && x.y < -h, Q = x.y >= -h && x.y <= +h, ne = x.y > +h, K = H || Q || ne, Z = z || K, ee = y.y - _.y, oe = y.y < -h, X = y.y >= -h && y.y <= +h, fe = y.y > +h && y.y < s.y - f, de = oe || X || fe, ce = _.y > o.y + f && _.y < -h, ye = _.y >= -h && _.y <= +h, ge = _.y > +h, be = de || (ce || ye || ge), { shaderUniforms: pe, shaderDefines: Te } = this; + for (const le in Te) + Te.hasOwnProperty(le) && (Te[le] = void 0); + pe.ellipsoidRadiiUv = Cartesian3.divideByScalar( + S, + E, + pe.ellipsoidRadiiUv + ); + const { x: xe, z: W } = pe.ellipsoidRadiiUv, j = W / xe; + pe.eccentricitySquared = 1 - j * j, pe.evoluteScale = Cartesian2.fromElements( + (xe * xe - W * W) / xe, + (W * W - xe * xe) / W, + pe.evoluteScale + ), pe.ellipsoidInverseRadiiSquaredUv = Cartesian3.divideComponents( + Cartesian3.ONE, + Cartesian3.multiplyComponents( + pe.ellipsoidRadiiUv, + pe.ellipsoidRadiiUv, + pe.ellipsoidInverseRadiiSquaredUv + ), + pe.ellipsoidInverseRadiiSquaredUv + ); + let se = 0; + Te.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX = se, se += 1, Te.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN = se, se += 1, pe.clipMinMaxHeight = Cartesian2.fromElements( + (x.z - y.z) / E, + (b.z - y.z) / E, + pe.clipMinMaxHeight + ); + const Pe = (y.z - _.z) / E; + if (pe.ellipsoidInverseHeightDifferenceUv = 1 / Pe, _.z === y.z && (pe.ellipsoidInverseHeightDifferenceUv = 0), O && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE = !0, Te.ELLIPSOID_INTERSECTION_INDEX_LONGITUDE = se, g ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF = !0, se += 1) : w ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF = !0, se += 2) : L && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO = !0, se += 2), pe.ellipsoidRenderLongitudeMinMax = Cartesian2.fromElements( + x.x, + b.x, + pe.ellipsoidRenderLongitudeMinMax + )), k) + if (Te.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE = !0, y.x < _.x && (Te.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED = !0), F <= d) + pe.ellipsoidUvToShapeUvLongitude = Cartesian2.fromElements( + 0, + 1, + pe.ellipsoidUvToShapeUvLongitude + ); + else { + const De = P / F, Me = -(_.x - o.x) / F; + pe.ellipsoidUvToShapeUvLongitude = Cartesian2.fromElements( + De, + Me, + pe.ellipsoidUvToShapeUvLongitude + ); + } + if (O) { + const le = CesiumMath.equalsEpsilon( + x.x, + o.x, + void 0, + l + ), De = CesiumMath.equalsEpsilon( + b.x, + s.x, + void 0, + l + ); + le && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY = !0), De && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY = !0); + const Me = (_.x - o.x) / P, He = (y.x - o.x) / P, Oe = (b.x - o.x) / P, $e = 1 - R / P, J = (Oe + 0.5 * $e) % 1; + pe.ellipsoidShapeUvLongitudeMinMaxMid = Cartesian3.fromElements( + Me, + He, + J, + pe.ellipsoidShapeUvLongitudeMinMaxMid + ); + } + if (Z && (K && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN = !0, Te.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN = se, H ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF = !0, se += 1) : Q ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF = !0, se += 1) : ne && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF = !0, se += 2)), z && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX = !0, Te.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX = se, $ ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF = !0, se += 2) : G ? (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF = !0, se += 1) : q && (Te.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF = !0, se += 1)), pe.ellipsoidRenderLatitudeSinMinMax = Cartesian2.fromElements( + Math.sin(x.y), + Math.sin(b.y), + pe.ellipsoidRenderLatitudeSinMinMax + )), be) + if (Te.ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE = !0, ee < f) + pe.ellipsoidUvToShapeUvLatitude = Cartesian2.fromElements( + 0, + 1, + pe.ellipsoidUvToShapeUvLatitude + ); + else { + const De = (s.y - o.y) / ee, Me = (o.y - _.y) / ee; + pe.ellipsoidUvToShapeUvLatitude = Cartesian2.fromElements( + De, + Me, + pe.ellipsoidUvToShapeUvLatitude + ); + } + return this.shaderMaximumIntersectionsLength = se, !0; +}; +const scratchRectangle = new Rectangle(); +VoxelEllipsoidShape.prototype.computeOrientedBoundingBoxForTile = function(e, t, n, i, r) { + const o = 1 / Math.pow(2, e), s = t * o, c = (t + 1) * o, l = n * o, d = (n + 1) * o, f = i * o, h = (i + 1) * o, p = Rectangle.subsection( + this._rectangle, + s, + l, + c, + d, + scratchRectangle + ), m = CesiumMath.lerp( + this._minimumHeight, + this._maximumHeight, + f + ), _ = CesiumMath.lerp( + this._minimumHeight, + this._maximumHeight, + h + ); + return getEllipsoidChunkObb( + p, + m, + _, + this._ellipsoid, + this._translation, + this._rotation, + r + ); +}; +const sampleSizeScratch = new Cartesian3(), scratchTileMinBounds = new Cartesian3(), scratchTileMaxBounds = new Cartesian3(); +VoxelEllipsoidShape.prototype.computeOrientedBoundingBoxForSample = function(e, t, n, i) { + const r = 1 / Math.pow(2, e.level), o = Cartesian3.divideComponents( + Cartesian3.ONE, + t, + sampleSizeScratch + ), s = Cartesian3.multiplyByScalar( + o, + r, + sampleSizeScratch + ), c = Cartesian3.multiplyByScalar( + Cartesian3.fromElements( + e.x + n.x, + e.y + n.y, + e.z + n.z, + scratchTileMinBounds + ), + r, + scratchTileMinBounds + ), l = Cartesian3.add( + c, + s, + scratchTileMaxBounds + ), d = Rectangle.subsection( + this._rectangle, + c.x, + c.y, + l.x, + l.y, + scratchRectangle + ), f = CesiumMath.lerp( + this._minimumHeight, + this._maximumHeight, + c.z + ), h = CesiumMath.lerp( + this._minimumHeight, + this._maximumHeight, + l.z + ); + return getEllipsoidChunkObb( + d, + f, + h, + this._ellipsoid, + this._translation, + this._rotation, + i + ); +}; +function getEllipsoidChunkObb(e, t, n, i, r, o, s) { + return s = OrientedBoundingBox.fromRectangle( + e, + t, + n, + i, + s + ), s.center = Cartesian3.add(s.center, r, s.center), s.halfAxes = Matrix3.multiply( + s.halfAxes, + o, + s.halfAxes + ), s; +} +VoxelEllipsoidShape.DefaultMinBounds = Object.freeze( + new Cartesian3( + -CesiumMath.PI, + -CesiumMath.PI_OVER_TWO, + -Ellipsoid.WGS84.minimumRadius + ) +); +VoxelEllipsoidShape.DefaultMaxBounds = Object.freeze( + new Cartesian3( + CesiumMath.PI, + CesiumMath.PI_OVER_TWO, + 10 * Ellipsoid.WGS84.maximumRadius + ) +); +const VoxelShapeType = { + /** + * A box shape. + * + * @type {string} + * @constant + * @private + */ + BOX: "BOX", + /** + * An ellipsoid shape. + * + * @type {string} + * @constant + * @private + */ + ELLIPSOID: "ELLIPSOID", + /** + * A cylinder shape. + * + * @type {string} + * @constant + * @private + */ + CYLINDER: "CYLINDER" +}; +VoxelShapeType.getMinBounds = function(e) { + switch (e) { + case VoxelShapeType.BOX: + return VoxelBoxShape.DefaultMinBounds; + case VoxelShapeType.ELLIPSOID: + return VoxelEllipsoidShape.DefaultMinBounds; + case VoxelShapeType.CYLINDER: + return VoxelCylinderShape.DefaultMinBounds; + } +}; +VoxelShapeType.getMaxBounds = function(e) { + switch (e) { + case VoxelShapeType.BOX: + return VoxelBoxShape.DefaultMaxBounds; + case VoxelShapeType.ELLIPSOID: + return VoxelEllipsoidShape.DefaultMaxBounds; + case VoxelShapeType.CYLINDER: + return VoxelCylinderShape.DefaultMaxBounds; + } +}; +VoxelShapeType.getShapeConstructor = function(e) { + switch (e) { + case VoxelShapeType.BOX: + return VoxelBoxShape; + case VoxelShapeType.ELLIPSOID: + return VoxelEllipsoidShape; + case VoxelShapeType.CYLINDER: + return VoxelCylinderShape; + } +}; +const VoxelShapeType$1 = Object.freeze(VoxelShapeType); +function DoubleEndedPriorityQueue(e) { + this._comparator = e.comparator, this._maximumLength = e.maximumLength, this._array = defined(e.maximumLength) ? new Array(e.maximumLength) : [], this._length = 0; +} +Object.defineProperties(DoubleEndedPriorityQueue.prototype, { + /** + * Gets the number of elements in the queue. + * + * @memberof DoubleEndedPriorityQueue.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + }, + /** + * Gets or sets the maximum number of elements in the queue. + * If set to a smaller value than the current length of the queue, the lowest priority elements are removed. + * If an element is inserted when the queue is at full capacity, the minimum element is removed. + * If set to undefined, the size of the queue is unlimited. + * + * @memberof DoubleEndedPriorityQueue.prototype + * + * @type {number} + * @readonly + */ + maximumLength: { + get: function() { + return this._maximumLength; + }, + set: function(e) { + if (defined(e)) { + for (; this._length > e; ) + this.removeMinimum(); + this._array.length = e; + } + this._maximumLength = e; + } + }, + /** + * Gets the internal array. + * + * @memberof DoubleEndedPriorityQueue.prototype + * + * @type {Array} + * @readonly + */ + internalArray: { + get: function() { + return this._array; + } + }, + /** + * The comparator used by the queue. + * If comparator(a, b) is less than 0, a is lower priority than b. + * + * @memberof DoubleEndedPriorityQueue.prototype + * + * @type {DoubleEndedPriorityQueue.ComparatorCallback} + * @readonly + */ + comparator: { + get: function() { + return this._comparator; + } + } +}); +DoubleEndedPriorityQueue.prototype.clone = function() { + const e = this._maximumLength, t = this._comparator, n = this._array, i = this._length, r = new DoubleEndedPriorityQueue({ + comparator: t, + maximumLength: e + }); + r._length = i; + for (let o = 0; o < i; o++) + r._array[o] = n[o]; + return r; +}; +DoubleEndedPriorityQueue.prototype.reset = function() { + this._length = 0; + const e = this._maximumLength; + if (defined(e)) + for (let t = 0; t < e; t++) + this._array[t] = void 0; + else + this._array.length = 0; +}; +DoubleEndedPriorityQueue.prototype.resort = function() { + const e = this._length; + for (let t = 0; t < e; t++) + pushUp(this, t); +}; +DoubleEndedPriorityQueue.prototype.insert = function(e) { + let t; + const n = this._maximumLength; + if (defined(n)) { + if (n === 0) + return; + if (this._length === n) { + const r = this._array[0]; + if (this._comparator(e, r) <= 0) + return e; + t = this.removeMinimum(); + } + } + const i = this._length; + return this._array[i] = e, this._length++, pushUp(this, i), t; +}; +DoubleEndedPriorityQueue.prototype.removeMinimum = function() { + const e = this._length; + if (e === 0) + return; + this._length--; + const t = this._array[0]; + return e >= 2 && (this._array[0] = this._array[e - 1], pushDown(this, 0)), this._array[e - 1] = void 0, t; +}; +DoubleEndedPriorityQueue.prototype.removeMaximum = function() { + const e = this._length; + if (e === 0) + return; + this._length--; + let t; + if (e <= 2) + t = this._array[e - 1]; + else { + const n = greaterThan(this, 1, 2) ? 1 : 2; + t = this._array[n], this._array[n] = this._array[e - 1], e >= 4 && pushDown(this, n); + } + return this._array[e - 1] = void 0, t; +}; +DoubleEndedPriorityQueue.prototype.getMinimum = function() { + if (this._length !== 0) + return this._array[0]; +}; +DoubleEndedPriorityQueue.prototype.getMaximum = function() { + const e = this._length; + if (e !== 0) + return e <= 2 ? this._array[e - 1] : this._array[greaterThan(this, 1, 2) ? 1 : 2]; +}; +function swap(e, t, n) { + const i = e._array, r = i[t]; + i[t] = i[n], i[n] = r; +} +function lessThan(e, t, n) { + return e._comparator(e._array[t], e._array[n]) < 0; +} +function greaterThan(e, t, n) { + return e._comparator(e._array[t], e._array[n]) > 0; +} +function pushUp(e, t) { + if (t === 0) + return; + const n = Math.floor(CesiumMath.log2(t + 1)) % 2 === 0, i = Math.floor((t - 1) / 2), r = lessThan(e, t, i); + for (r !== n && (swap(e, t, i), t = i); t >= 3; ) { + const o = Math.floor((t - 3) / 4); + if (lessThan(e, t, o) !== r) + break; + swap(e, t, o), t = o; + } +} +function pushDown(e, t) { + const n = e._length, i = Math.floor(CesiumMath.log2(t + 1)) % 2 === 0; + let r; + for (; (r = 2 * t + 1) < n; ) { + let o = r; + const s = r + 1; + if (s < n) { + lessThan(e, s, o) === i && (o = s); + const c = 2 * r + 1, l = Math.max( + Math.min(n - c, 4), + 0 + ); + for (let d = 0; d < l; d++) { + const f = c + d; + lessThan(e, f, o) === i && (o = f); + } + } + if (lessThan(e, o, t) === i && (swap(e, o, t), o !== r && o !== s)) { + const c = Math.floor((o - 1) / 2); + greaterThan(e, o, c) === i && swap(e, o, c); + } + t = o; + } +} +const LoadState = Object.freeze({ + UNLOADED: 0, + // Has no data and is in dormant state + RECEIVING: 1, + // Is waiting on data from the provider + RECEIVED: 2, + // Received data from the provider + LOADED: 3, + // Processed data from provider + FAILED: 4, + // Failed to receive data from the provider + UNAVAILABLE: 5 + // No data available for this tile +}); +function KeyframeNode(e, t) { + this.spatialNode = e, this.keyframe = t, this.state = LoadState.UNLOADED, this.metadata = [], this.megatextureIndex = -1, this.priority = -Number.MAX_VALUE, this.highPriorityFrameNumber = -1; +} +KeyframeNode.priorityComparator = function(e, t) { + return e.priority - t.priority; +}; +KeyframeNode.searchComparator = function(e, t) { + return e.keyframe - t.keyframe; +}; +KeyframeNode.LoadState = LoadState; +function Megatexture(e, t, n, i, r) { + i === MetadataComponentType$1.UNSIGNED_SHORT && (i = MetadataComponentType$1.FLOAT32); + const o = e.floatingPointTexture; + if (i === MetadataComponentType$1.FLOAT32 && !o) + throw new RuntimeError("Floating point texture not supported"); + let s; + i === MetadataComponentType$1.FLOAT32 || i === MetadataComponentType$1.FLOAT64 ? s = PixelDatatype$1.FLOAT : i === MetadataComponentType$1.UINT8 && (s = PixelDatatype$1.UNSIGNED_BYTE); + let c; + n === 1 ? c = e.webgl2 ? PixelFormat$1.RED : PixelFormat$1.LUMINANCE : n === 2 ? c = e.webgl2 ? PixelFormat$1.RG : PixelFormat$1.LUMINANCE_ALPHA : n === 3 ? c = PixelFormat$1.RGB : n === 4 && (c = PixelFormat$1.RGBA); + const l = 512 * 1024 * 1024, d = 128 * 1024 * 1024; + r = Math.min( + defaultValue(r, d), + l + ); + const f = ContextLimits.maximumTextureSize, h = MetadataComponentType$1.getSizeInBytes( + i + ), p = Math.floor( + r / (n * h) + ), m = Math.min( + f, + CesiumMath.previousPowerOfTwo(Math.floor(Math.sqrt(p))) + ), _ = Math.ceil(Math.sqrt(t.x)), y = Math.ceil(t.z / _), C = _ * t.x, T = y * t.y, x = Math.floor( + m / C + ), b = Math.floor( + m / T + ); + if (x === 0 || b === 0) + throw new RuntimeError("Tileset is too large to fit into megatexture"); + this.channelCount = n, this.componentType = i, this.voxelCountPerTile = Cartesian3.clone(t, new Cartesian3()), this.maximumTileCount = x * b, this.regionCountPerMegatexture = new Cartesian2( + x, + b + ), this.voxelCountPerRegion = new Cartesian2( + C, + T + ), this.sliceCountPerRegion = new Cartesian2( + _, + y + ), this.voxelSizeUv = new Cartesian2( + 1 / m, + 1 / m + ), this.sliceSizeUv = new Cartesian2( + t.x / m, + t.y / m + ), this.regionSizeUv = new Cartesian2( + C / m, + T / m + ), this.texture = new Texture({ + context: e, + pixelFormat: c, + pixelDatatype: s, + flipY: !1, + width: m, + height: m, + sampler: new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }) + }); + const S = MetadataComponentType$1.toComponentDatatype( + i + ); + this.tileVoxelDataTemp = ComponentDatatype$1.createTypedArray( + S, + C * T * n + ), this.nodes = new Array(this.maximumTileCount); + for (let E = 0; E < this.maximumTileCount; E++) + this.nodes[E] = new MegatextureNode(E); + for (let E = 0; E < this.maximumTileCount; E++) { + const A = this.nodes[E]; + A.previousNode = E > 0 ? this.nodes[E - 1] : void 0, A.nextNode = E < this.maximumTileCount - 1 ? this.nodes[E + 1] : void 0; + } + this.occupiedList = void 0, this.emptyList = this.nodes[0], this.occupiedCount = 0; +} +function MegatextureNode(e) { + this.index = e, this.nextNode = void 0, this.previousNode = void 0; +} +Megatexture.prototype.add = function(e) { + if (this.isFull()) + throw new DeveloperError("Trying to add when there are no empty spots"); + const t = this.emptyList; + this.emptyList = this.emptyList.nextNode, defined(this.emptyList) && (this.emptyList.previousNode = void 0), t.nextNode = this.occupiedList, defined(t.nextNode) && (t.nextNode.previousNode = t), this.occupiedList = t; + const n = t.index; + return this.writeDataToTexture(n, e), this.occupiedCount++, n; +}; +Megatexture.prototype.remove = function(e) { + if (e < 0 || e >= this.maximumTileCount) + throw new DeveloperError("Megatexture index out of bounds"); + const t = this.nodes[e]; + defined(t.previousNode) && (t.previousNode.nextNode = t.nextNode), defined(t.nextNode) && (t.nextNode.previousNode = t.previousNode), t.nextNode = this.emptyList, defined(t.nextNode) && (t.nextNode.previousNode = t), t.previousNode = void 0, this.emptyList = t, this.occupiedCount--; +}; +Megatexture.prototype.isFull = function() { + return this.emptyList === void 0; +}; +Megatexture.getApproximateTextureMemoryByteLength = function(e, t, n, i) { + i === MetadataComponentType$1.UNSIGNED_SHORT && (i = MetadataComponentType$1.FLOAT32); + const r = MetadataComponentType$1.getSizeInBytes( + i + ), o = e * t.x * t.y * t.z, s = Math.ceil(Math.sqrt(t.x)), c = Math.ceil(t.z / s), l = s * t.x, d = c * t.y; + let f = CesiumMath.previousPowerOfTwo( + Math.floor(Math.sqrt(o)) + ); + for (; ; ) { + const p = Math.floor(f / l), m = Math.floor(f / d); + if (p * m >= e) + break; + f *= 2; + } + return f * f * n * r; +}; +Megatexture.prototype.writeDataToTexture = function(e, t) { + const n = t.constructor === Uint16Array ? new Float32Array(t) : t, i = this.voxelCountPerTile, r = this.sliceCountPerRegion, o = this.voxelCountPerRegion, s = this.channelCount, c = this.tileVoxelDataTemp; + for (let y = 0; y < i.z; y++) { + const C = y % r.x * i.x, T = Math.floor(y / r.x) * i.y; + for (let x = 0; x < i.y; x++) + for (let b = 0; b < i.x; b++) { + const S = y * i.y * i.x + x * i.x + b, E = (T + x) * o.x + (C + b); + for (let A = 0; A < s; A++) + c[E * s + A] = n[S * s + A]; + } + } + const l = this.regionCountPerMegatexture, d = o.x, f = o.y, h = e % l.x * o.x, p = Math.floor(e / l.x) * o.y, _ = { + source: { + arrayBufferView: c, + width: d, + height: f + }, + xOffset: h, + yOffset: p + }; + this.texture.copyFrom(_); +}; +Megatexture.prototype.isDestroyed = function() { + return !1; +}; +Megatexture.prototype.destroy = function() { + return this.texture = this.texture && this.texture.destroy(), destroyObject(this); +}; +function SpatialNode(e, t, n, i, r, o, s) { + this.children = void 0, this.parent = r, this.level = e, this.x = t, this.y = n, this.z = i, this.dimensions = Cartesian3.clone(s), this.keyframeNodes = [], this.renderableKeyframeNodes = [], this.renderableKeyframeNodeLerp = 0, this.renderableKeyframeNodePrevious = void 0, this.renderableKeyframeNodeNext = void 0, this.orientedBoundingBox = new OrientedBoundingBox(), this.approximateVoxelSize = 0, this.screenSpaceError = 0, this.visitedFrameNumber = -1, this.computeBoundingVolumes(o); +} +const scratchObbHalfScale = new Cartesian3(); +SpatialNode.prototype.computeBoundingVolumes = function(e) { + this.orientedBoundingBox = e.computeOrientedBoundingBoxForTile( + this.level, + this.x, + this.y, + this.z, + this.orientedBoundingBox + ); + const t = Matrix3.getScale( + this.orientedBoundingBox.halfAxes, + scratchObbHalfScale + ), n = 2 * Cartesian3.maximumComponent(t); + this.approximateVoxelSize = n / Cartesian3.minimumComponent(this.dimensions); +}; +SpatialNode.prototype.constructChildNodes = function(e) { + const { level: t, x: n, y: i, z: r } = this, o = n * 2, s = i * 2, c = r * 2, l = s + 1, d = o + 1, f = c + 1, h = t + 1, p = [ + [h, o, s, c], + [h, d, s, c], + [h, o, l, c], + [h, d, l, c], + [h, o, s, f], + [h, d, s, f], + [h, o, l, f], + [h, d, l, f] + ]; + this.children = p.map(([m, _, y, C]) => new SpatialNode(m, _, y, C, this, e, this.dimensions)); +}; +SpatialNode.prototype.visibility = function(e, t) { + const n = this.orientedBoundingBox; + return e.cullingVolume.computeVisibilityWithPlaneMask(n, t); +}; +SpatialNode.prototype.computeScreenSpaceError = function(e, t) { + const n = this.orientedBoundingBox; + let i = Math.sqrt(n.distanceSquaredTo(e)); + i = Math.max(i, CesiumMath.EPSILON7); + const r = this.approximateVoxelSize, o = t * (r / i); + this.screenSpaceError = o; +}; +const scratchBinarySearchKeyframeNode = { + keyframe: 0 +}; +function findKeyframeIndex(e, t) { + return scratchBinarySearchKeyframeNode.keyframe = e, binarySearch( + t, + scratchBinarySearchKeyframeNode, + KeyframeNode.searchComparator + ); +} +SpatialNode.prototype.computeSurroundingRenderableKeyframeNodes = function(e) { + let t = this; + const n = t.level, i = Math.floor(e), r = Math.ceil(e); + let o, s, c = +Number.MAX_VALUE, l = +Number.MAX_VALUE; + for (; defined(t); ) { + const { renderableKeyframeNodes: h } = t; + if (h.length >= 1) { + const p = getKeyframeIndexPrev( + i, + h + ), m = h[p], _ = r === i || i < m.keyframe ? p : Math.min(p + 1, h.length - 1), y = h[_], C = i - m.keyframe, T = getWeightedKeyframeDistance( + n - t.level, + C + ); + T < c && (c = T, o = m); + const x = y.keyframe - r, b = getWeightedKeyframeDistance( + n - t.level, + x + ); + if (b < l && (l = b, s = y), C === 0 && x === 0) + break; + } + t = t.parent; + } + if (this.renderableKeyframeNodePrevious = o, this.renderableKeyframeNodeNext = s, !defined(o) || !defined(s)) + return; + const d = o.keyframe, f = s.keyframe; + this.renderableKeyframeNodeLerp = d === f ? 0 : CesiumMath.clamp( + (e - d) / (f - d), + 0, + 1 + ); +}; +function getKeyframeIndexPrev(e, t) { + const n = findKeyframeIndex(e, t); + return n < 0 ? CesiumMath.clamp(~n - 1, 0, t.length - 1) : n; +} +function getWeightedKeyframeDistance(e, t) { + const n = Math.exp(e * 4), i = t >= 0 ? 1 : -200; + return e * n + t * i; +} +SpatialNode.prototype.isVisited = function(e) { + return this.visitedFrameNumber === e; +}; +SpatialNode.prototype.createKeyframeNode = function(e) { + let t = findKeyframeIndex(e, this.keyframeNodes); + if (t < 0) { + t = ~t; + const n = new KeyframeNode(this, e); + this.keyframeNodes.splice(t, 0, n); + } +}; +SpatialNode.prototype.destroyKeyframeNode = function(e, t) { + const n = e.keyframe, i = findKeyframeIndex(n, this.keyframeNodes); + if (i < 0) + throw new DeveloperError("Keyframe node does not exist."); + if (this.keyframeNodes.splice(i, 1), e.megatextureIndex !== -1) { + for (let o = 0; o < t.length; o++) + t[o].remove(e.megatextureIndex); + const r = findKeyframeIndex( + n, + this.renderableKeyframeNodes + ); + if (r < 0) + throw new DeveloperError("Renderable keyframe node does not exist."); + this.renderableKeyframeNodes.splice(r, 1); + } + e.spatialNode = void 0, e.state = KeyframeNode.LoadState.UNLOADED, e.metadata = {}, e.megatextureIndex = -1, e.priority = -Number.MAX_VALUE, e.highPriorityFrameNumber = -1; +}; +SpatialNode.prototype.addKeyframeNodeToMegatextures = function(e, t) { + if (e.state !== KeyframeNode.LoadState.RECEIVED || e.megatextureIndex !== -1 || e.metadata.length !== t.length) + throw new DeveloperError("Keyframe node cannot be added to megatexture"); + for (let r = 0; r < t.length; r++) { + const o = t[r]; + e.megatextureIndex = o.add(e.metadata[r]); + } + e.state = KeyframeNode.LoadState.LOADED; + const n = this.renderableKeyframeNodes; + let i = findKeyframeIndex( + e.keyframe, + n + ); + if (i >= 0) + throw new DeveloperError("Keyframe already renderable"); + i = ~i, n.splice(i, 0, e); +}; +SpatialNode.prototype.isRenderable = function(e) { + const t = this.renderableKeyframeNodePrevious, n = this.renderableKeyframeNodeNext, i = this.level; + return defined(t) && defined(n) && (t.spatialNode.level === i || n.spatialNode.level === i) && this.visitedFrameNumber === e; +}; +function VoxelTraversal(e, t, n, i, r, o, s) { + this._primitive = e, this.megatextures = new Array(i.length); + for (let _ = 0; _ < i.length; _++) { + const y = i[_], C = MetadataType$1.getComponentCount(y), T = r[_]; + this.megatextures[_] = new Megatexture( + t, + n, + C, + T, + s + ); + } + const c = this.megatextures[0].maximumTileCount; + this._simultaneousRequestCount = 0, this._debugPrint = !1, this._frameNumber = 0; + const l = e._shape; + this.rootNode = new SpatialNode(0, 0, 0, 0, void 0, l, n), this._priorityQueue = new DoubleEndedPriorityQueue({ + maximumLength: c, + comparator: KeyframeNode.priorityComparator + }), this._highPriorityKeyframeNodes = new Array(c), this._keyframeNodesInMegatexture = new Array(c), this._keyframeCount = o, this._sampleCount = void 0, this._keyframeLocation = 0, this._binaryTreeKeyframeWeighting = new Array(o); + const d = this._binaryTreeKeyframeWeighting; + d[0] = 0, d[o - 1] = 0, binaryTreeWeightingRecursive( + d, + 1, + o - 2, + 0 + ); + const f = 9, h = 2048, p = Math.floor( + h / f + ), m = Math.ceil( + c / p + ); + this.internalNodeTexture = new Texture({ + context: t, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + flipY: !1, + width: h, + height: m, + sampler: new Sampler({ + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) + }), this.internalNodeTilesPerRow = p, this.internalNodeTexelSizeUv = new Cartesian2( + 1 / h, + 1 / m + ), this.leafNodeTexture = void 0, this.leafNodeTilesPerRow = void 0, this.leafNodeTexelSizeUv = new Cartesian2(); +} +VoxelTraversal.prototype.findKeyframeNode = function(e) { + return this._keyframeNodesInMegatexture.find(function(t) { + return t.megatextureIndex === e; + }); +}; +function binaryTreeWeightingRecursive(e, t, n, i) { + if (t > n) + return; + const r = Math.floor((t + n) / 2); + e[r] = i, binaryTreeWeightingRecursive(e, t, r - 1, i + 1), binaryTreeWeightingRecursive(e, r + 1, n, i + 1); +} +VoxelTraversal.simultaneousRequestCountMaximum = 50; +VoxelTraversal.prototype.update = function(e, t, n, i) { + const r = this._primitive, o = e.context, s = this.megatextures[0].maximumTileCount, c = this._keyframeCount, l = r._levelBlendFactor, d = l > 0, f = c > 1, h = (d ? 2 : 1) * (f ? 2 : 1); + this._sampleCount = h; + const p = h >= 2; + if (p && !defined(this.leafNodeTexture)) { + const x = Math.floor( + 512 + ), b = Math.ceil( + s / x + ); + this.leafNodeTexture = new Texture({ + context: o, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + flipY: !1, + width: 1024, + height: b, + sampler: new Sampler({ + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) + }), this.leafNodeTexelSizeUv = Cartesian2.fromElements( + 1 / 1024, + 1 / b, + this.leafNodeTexelSizeUv + ), this.leafNodeTilesPerRow = x; + } else !p && defined(this.leafNodeTexture) && (this.leafNodeTexture = this.leafNodeTexture.destroy()); + if (this._keyframeLocation = CesiumMath.clamp( + t, + 0, + c - 1 + ), n && recomputeBoundingVolumesRecursive(this, this.rootNode), i) + return; + this._frameNumber = e.frameNumber; + const m = getTimestamp$1(); + loadAndUnload(this, e); + const _ = getTimestamp$1(); + generateOctree(this, h, l); + const y = getTimestamp$1(); + if (this._debugPrint) { + const C = _ - m, T = y - _, x = y - m; + printDebugInformation( + this, + C, + T, + x + ); + } +}; +VoxelTraversal.prototype.isRenderable = function(e) { + return e.isRenderable(this._frameNumber); +}; +VoxelTraversal.prototype.isDestroyed = function() { + return !1; +}; +VoxelTraversal.prototype.destroy = function() { + const e = this.megatextures, t = e.length; + for (let n = 0; n < t; n++) + e[n] = e[n] && e[n].destroy(); + return this.internalNodeTexture = this.internalNodeTexture && this.internalNodeTexture.destroy(), this.leafNodeTexture = this.leafNodeTexture && this.leafNodeTexture.destroy(), destroyObject(this); +}; +function recomputeBoundingVolumesRecursive(e, t) { + if (t.computeBoundingVolumes(e._primitive._shape), defined(t.children)) + for (let n = 0; n < 8; n++) { + const i = t.children[n]; + recomputeBoundingVolumesRecursive(e, i); + } +} +function requestData(e, t) { + if (e._simultaneousRequestCount >= VoxelTraversal.simultaneousRequestCountMaximum) + return; + const n = e._primitive._provider; + function i(l) { + e._simultaneousRequestCount--; + const d = n.types.length; + if (!defined(l)) + t.state = KeyframeNode.LoadState.UNAVAILABLE; + else if (l === KeyframeNode.LoadState.FAILED) + t.state = KeyframeNode.LoadState.FAILED; + else if (!Array.isArray(l) || l.length !== d) + t.state = KeyframeNode.LoadState.FAILED; + else { + const f = e.megatextures; + for (let h = 0; h < d; h++) { + const { voxelCountPerTile: p, channelCount: m } = f[h], { x: _, y, z: C } = p, T = _ * y * C, x = l[h], b = T * m; + if (x.length === b) + t.metadata[h] = x, t.state = KeyframeNode.LoadState.RECEIVED; + else { + t.state = KeyframeNode.LoadState.FAILED; + break; + } + } + } + } + function r() { + e._simultaneousRequestCount--, t.state = KeyframeNode.LoadState.FAILED; + } + const { keyframe: o, spatialNode: s } = t, c = n.requestData({ + tileLevel: s.level, + tileX: s.x, + tileY: s.y, + tileZ: s.z, + keyframe: o + }); + defined(c) ? (e._simultaneousRequestCount++, t.state = KeyframeNode.LoadState.RECEIVING, c.then(i).catch(r)) : t.state = KeyframeNode.LoadState.FAILED; +} +function mapInfiniteRangeToZeroOne(e) { + return e / (1 + e); +} +function loadAndUnload(e, t) { + const n = e._frameNumber, i = e._primitive, r = i._shape, o = i.screenSpaceError, s = e._priorityQueue, c = e._keyframeCount, l = CesiumMath.clamp( + Math.floor(e._keyframeLocation), + 0, + c - 2 + ), d = l + 1, { camera: f, context: h, pixelRatio: p } = t, { positionWC: m, frustum: _ } = f, C = h.drawingBufferHeight / p / _.sseDenominator; + function T(M, R) { + if (M.computeScreenSpaceError(m, C), R = M.visibility( + t, + R + ), R === CullingVolume.MASK_OUTSIDE) + return; + if (M.visitedFrameNumber = n, c === 1) + M.createKeyframeNode(0); + else if (M.keyframeNodes.length !== c) + for (let N = 0; N < c; N++) + M.createKeyframeNode(N); + const { screenSpaceError: L, keyframeNodes: g } = M, w = mapInfiniteRangeToZeroOne(L); + let O = !1; + for (let N = 0; N < g.length; N++) { + const F = g[N]; + F.priority = 10 * w + keyframePriority( + l, + F.keyframe, + d, + e + ), F.state !== KeyframeNode.LoadState.UNAVAILABLE && F.state !== KeyframeNode.LoadState.FAILED && F.priority !== -Number.MAX_VALUE && s.insert(F), F.state === KeyframeNode.LoadState.LOADED && (O = !0); + } + if (L < o || !O) { + M.children = void 0; + return; + } + defined(M.children) || M.constructChildNodes(r); + for (let N = 0; N < 8; N++) { + const F = M.children[N]; + T(F, R); + } + } + s.reset(), T(e.rootNode, CullingVolume.MASK_INDETERMINATE); + const x = e._highPriorityKeyframeNodes; + let b = 0, S; + for (; s.length > 0; ) + S = s.removeMaximum(), S.highPriorityFrameNumber = n, x[b] = S, b++; + const E = e._keyframeNodesInMegatexture, A = e.megatextures[0], D = A.occupiedCount; + E.length = D, E.sort(function(M, R) { + return M.highPriorityFrameNumber === R.highPriorityFrameNumber ? R.priority - M.priority : R.highPriorityFrameNumber - M.highPriorityFrameNumber; + }); + let P = 0, I = 0; + for (let M = 0; M < b; M++) + if (S = x[M], !(S.state === KeyframeNode.LoadState.LOADED || S.spatialNode === void 0) && (S.state === KeyframeNode.LoadState.UNLOADED && requestData(e, S), S.state === KeyframeNode.LoadState.RECEIVED)) { + let R = 0; + if (A.isFull()) { + R = D - 1 - P, P++; + const L = E[R]; + L.spatialNode.destroyKeyframeNode( + L, + e.megatextures + ); + } else + R = D + I, I++; + S.spatialNode.addKeyframeNodeToMegatextures( + S, + e.megatextures + ), E[R] = S; + } +} +function keyframePriority(e, t, n, i) { + const r = Math.min( + Math.abs(t - e), + Math.abs(t - n) + ), o = Math.max( + e, + i._keyframeCount - n - 1, + 1 + ), s = Math.pow( + 1 - r / o, + 4 + ), c = Math.exp( + -i._binaryTreeKeyframeWeighting[t] + ); + return CesiumMath.lerp( + c, + s, + 0.15 + 0.85 * s + ); +} +function printDebugInformation(e, t, n, i) { + const r = e._keyframeCount, o = e.rootNode, s = Object.keys(KeyframeNode.LoadState).length, c = new Array(s), l = new Array(s); + let d = 0; + for (let T = 0; T < s; T++) { + const x = new Array(r); + c[T] = x; + for (let b = 0; b < r; b++) + x[b] = 0; + l[T] = 0; + } + function f(T) { + const x = T.keyframeNodes; + for (let b = 0; b < x.length; b++) { + const S = x[b], E = S.keyframe, A = S.state; + c[A][E] += 1, l[A] += 1, d++; + } + if (defined(T.children)) + for (let b = 0; b < 8; b++) { + const S = T.children[b]; + f(S); + } + } + f(o); + const h = `KEYFRAMES: ${c[KeyframeNode.LoadState.LOADED]}`, p = `UNLOADED: ${l[KeyframeNode.LoadState.UNLOADED]} | RECEIVING: ${l[KeyframeNode.LoadState.RECEIVING]} | RECEIVED: ${l[KeyframeNode.LoadState.RECEIVED]} | LOADED: ${l[KeyframeNode.LoadState.LOADED]} | FAILED: ${l[KeyframeNode.LoadState.FAILED]} | UNAVAILABLE: ${l[KeyframeNode.LoadState.UNAVAILABLE]} | TOTAL: ${d}`, m = Math.round(t * 100) / 100, _ = Math.round(n * 100) / 100, y = Math.round(i * 100) / 100, C = `LOAD: ${m} | OCT: ${_} | ALL: ${y}`; + console.log( + `${h} || ${p} || ${C}` + ); +} +const GpuOctreeFlag = { + // Data is an octree index. + INTERNAL: 0, + // Data is a leaf node. + LEAF: 1, + // When leaf data is packed in the octree and there's a node that is forced to + // render but has no data of its own (such as when its siblings are renderable but it + // is not), signal that it's using its parent's data. + PACKED_LEAF_FROM_PARENT: 2 +}; +function generateOctree(e, t, n) { + const i = e._primitive._screenSpaceError, r = e._keyframeLocation, o = e._frameNumber, s = t >= 2; + let c = 0, l = 0; + const d = [], f = []; + function h(m, _, y, C, T) { + let x = !1; + if (defined(m.children)) + for (let b = 0; b < 8; b++) { + const S = m.children[b]; + S.computeSurroundingRenderableKeyframeNodes(r), S.isRenderable(o) && (x = !0); + } + if (x) { + d[T] = GpuOctreeFlag.INTERNAL << 16 | _, d[y] = C, c++, C = _, T = C * 9 + 1; + for (let b = 0; b < 8; b++) { + const S = m.children[b]; + _ = c, y = _ * 9 + 0, h( + S, + _, + y, + C, + T + b + ); + } + } else { + if (s) { + const b = l * 5, S = m.renderableKeyframeNodePrevious, E = m.level - S.spatialNode.level, A = S.spatialNode.parent, D = defined(A) ? A.renderableKeyframeNodePrevious : S, P = getLodLerp(m, i, n), I = E, M = 1, R = S.megatextureIndex, L = D.megatextureIndex; + f[b + 0] = P, f[b + 1] = I, f[b + 2] = M, f[b + 3] = R, f[b + 4] = L, d[T] = GpuOctreeFlag.LEAF << 16 | l; + } else { + const b = m.renderableKeyframeNodePrevious, E = m.level - b.spatialNode.level === 0 ? GpuOctreeFlag.LEAF : GpuOctreeFlag.PACKED_LEAF_FROM_PARENT; + d[T] = E << 16 | b.megatextureIndex; + } + l++; + } + } + const p = e.rootNode; + p.computeSurroundingRenderableKeyframeNodes(r), p.isRenderable(o) && h(p, 0, 0, 0, 0), copyToInternalNodeTexture( + d, + 9, + e.internalNodeTilesPerRow, + e.internalNodeTexture + ), s && copyToLeafNodeTexture( + f, + 2, + e.leafNodeTilesPerRow, + e.leafNodeTexture + ); +} +function getLodLerp(e, t, n) { + if (e.parent === void 0) + return 0; + const i = e.screenSpaceError, r = e.parent.screenSpaceError, s = ((t - i) / (r - i) + n - 1) / n; + return CesiumMath.clamp(s, 0, 1); +} +function copyToInternalNodeTexture(e, t, n, i) { + const r = PixelFormat$1.componentsLength(i.pixelFormat), o = Math.ceil(e.length / t), s = Math.max( + 1, + t * Math.min(o, n) + ), c = Math.max(1, Math.ceil(o / n)), l = new Uint8Array(s * c * r); + for (let h = 0; h < e.length; h++) { + const p = e[h], m = h * r; + for (let _ = 0; _ < r; _++) + l[m + _] = p >>> _ * 8 & 255; + } + const f = { + source: { + arrayBufferView: l, + width: s, + height: c + }, + xOffset: 0, + yOffset: 0 + }; + i.copyFrom(f); +} +function copyToLeafNodeTexture(e, t, n, i) { + const r = PixelFormat$1.componentsLength(i.pixelFormat), o = 5, s = Math.ceil(e.length / o), c = Math.max( + 1, + t * Math.min(s, n) + ), l = Math.max(1, Math.ceil(s / n)), d = new Uint8Array(c * l * r); + for (let p = 0; p < s; p++) { + const m = e[p * o + 0], _ = e[p * o + 1], y = e[p * o + 2], C = e[p * o + 3], T = e[p * o + 4], x = CesiumMath.clamp( + Math.floor(65536 * m), + 0, + 65535 + ); + d[p * 8 + 0] = x >>> 0 & 255, d[p * 8 + 1] = x >>> 8 & 255, d[p * 8 + 2] = _ & 255, d[p * 8 + 3] = y & 255, d[p * 8 + 4] = C >>> 0 & 255, d[p * 8 + 5] = C >>> 8 & 255, d[p * 8 + 6] = T >>> 0 & 255, d[p * 8 + 7] = T >>> 8 & 255; + } + const h = { + source: { + arrayBufferView: d, + width: c, + height: l + }, + xOffset: 0, + yOffset: 0 + }; + i.copyFrom(h); +} +VoxelTraversal.getApproximateTextureMemoryByteLength = function(e, t, n, i) { + let r = 0; + const o = n.length; + for (let s = 0; s < o; s++) { + const c = n[s], l = i[s], d = MetadataType$1.getComponentCount(c); + r += Megatexture.getApproximateTextureMemoryByteLength( + e, + t, + d, + l + ); + } + return r; +}; +const UniformType = { + /** + * A single floating point value. + * + * @type {string} + * @constant + */ + FLOAT: "float", + /** + * A vector of 2 floating point values. + * + * @type {string} + * @constant + */ + VEC2: "vec2", + /** + * A vector of 3 floating point values. + * + * @type {string} + * @constant + */ + VEC3: "vec3", + /** + * A vector of 4 floating point values. + * + * @type {string} + * @constant + */ + VEC4: "vec4", + /** + * A single integer value + * + * @type {string} + * @constant + */ + INT: "int", + /** + * A vector of 2 integer values. + * + * @type {string} + * @constant + */ + INT_VEC2: "ivec2", + /** + * A vector of 3 integer values. + * + * @type {string} + * @constant + */ + INT_VEC3: "ivec3", + /** + * A vector of 4 integer values. + * + * @type {string} + * @constant + */ + INT_VEC4: "ivec4", + /** + * A single boolean value. + * + * @type {string} + * @constant + */ + BOOL: "bool", + /** + * A vector of 2 boolean values. + * + * @type {string} + * @constant + */ + BOOL_VEC2: "bvec2", + /** + * A vector of 3 boolean values. + * + * @type {string} + * @constant + */ + BOOL_VEC3: "bvec3", + /** + * A vector of 4 boolean values. + * + * @type {string} + * @constant + */ + BOOL_VEC4: "bvec4", + /** + * A 2x2 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT2: "mat2", + /** + * A 3x3 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT3: "mat3", + /** + * A 3x3 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT4: "mat4", + /** + * A 2D sampled texture. + * @type {string} + * @constant + */ + SAMPLER_2D: "sampler2D", + SAMPLER_CUBE: "samplerCube" +}, UniformType$1 = Object.freeze(UniformType); +function getImageFromTypedArray(e, t, n) { + const i = new Uint8ClampedArray(e.buffer), r = new ImageData(i, t, n), o = document.createElement("canvas"); + return o.width = t, o.height = n, o.getContext("2d").putImageData(r, 0, 0), o; +} +function TextureManager() { + this._defaultTexture = void 0, this._textures = {}, this._loadedImages = [], this._lastUpdatedFrame = -1; +} +TextureManager.prototype.getTexture = function(e) { + return this._textures[e]; +}; +function fetchTexture2D(e, t, n) { + n.resource.fetchImage().then(function(i) { + e._loadedImages.push({ + id: t, + image: i, + textureUniform: n + }); + }).catch(function() { + const i = e._textures[t]; + defined(i) && i !== e._defaultTexture && i.destroy(), e._textures[t] = e._defaultTexture; + }); +} +TextureManager.prototype.loadTexture2D = function(e, t) { + defined(t.typedArray) ? this._loadedImages.push({ + id: e, + textureUniform: t + }) : fetchTexture2D(this, e, t); +}; +function createTexture(e, t, n) { + const { id: i, textureUniform: r, image: o } = t, s = n.webgl2 ? getTextureAndMips(r, o, n) : getWebGL1Texture(r, o, n), c = e._textures[i]; + defined(c) && c !== n.defaultTexture && c.destroy(), e._textures[i] = s; +} +function getTextureAndMips(e, t, n) { + const { typedArray: i, sampler: r } = e, o = defined(i) ? getTextureFromTypedArray(e, n) : new Texture({ context: n, source: t, sampler: r }); + return samplerRequiresMipmap(r) && o.generateMipmap(), o; +} +function getWebGL1Texture(e, t, n) { + const { typedArray: i, sampler: r } = e, o = samplerRequiresMipmap(r), s = r.wrapS === TextureWrap$1.REPEAT || r.wrapS === TextureWrap$1.MIRRORED_REPEAT || r.wrapT === TextureWrap$1.REPEAT || r.wrapT === TextureWrap$1.MIRRORED_REPEAT, { width: c, height: l } = defined(i) ? e : t, d = [c, l].every(CesiumMath.isPowerOfTwo); + if ((o || s) && !d) + if (defined(i)) { + if (e.pixelDatatype === PixelDatatype$1.UNSIGNED_BYTE) { + const h = getImageFromTypedArray(i, c, l), p = resizeImageToNextPowerOfTwo(h); + return getTextureAndMips({ sampler: r }, p, n); + } + } else { + const h = resizeImageToNextPowerOfTwo(t); + return getTextureAndMips(e, h, n); + } + else return getTextureAndMips(e, t, n); + return o ? console.warn( + "Texture requires resizing for mipmaps but pixelDataType cannot be resized. The texture may be rendered incorrectly." + ) : s && console.warn( + "Texture requires resizing for wrapping but pixelDataType cannot be resized. The texture may be rendered incorrectly." + ), getTextureFromTypedArray(e, n); +} +function samplerRequiresMipmap(e) { + return [ + TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST, + TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR, + TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST, + TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR + ].includes(e.minificationFilter); +} +function getTextureFromTypedArray(e, t) { + const { + pixelFormat: n, + pixelDatatype: i, + width: r, + height: o, + typedArray: s, + sampler: c + } = e; + return new Texture({ + context: t, + pixelFormat: n, + pixelDatatype: i, + source: { arrayBufferView: s, width: r, height: o }, + sampler: c, + flipY: !1 + }); +} +TextureManager.prototype.update = function(e) { + if (e.frameNumber === this._lastUpdatedFrame) + return; + this._lastUpdatedFrame = e.frameNumber; + const t = e.context; + this._defaultTexture = t.defaultTexture; + const n = this._loadedImages; + for (let i = 0; i < n.length; i++) { + const r = n[i]; + createTexture(this, r, t); + } + n.length = 0; +}; +TextureManager.prototype.isDestroyed = function() { + return !1; +}; +TextureManager.prototype.destroy = function() { + const e = this._textures; + for (const t in e) + if (e.hasOwnProperty(t)) { + const n = e[t]; + n !== this._defaultTexture && n.destroy(); + } + return destroyObject(this); +}; +function CustomShader(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.mode = defaultValue(e.mode, CustomShaderMode$1.MODIFY_MATERIAL), this.lightingModel = e.lightingModel, this.uniforms = defaultValue(e.uniforms, defaultValue.EMPTY_OBJECT), this.varyings = defaultValue(e.varyings, defaultValue.EMPTY_OBJECT), this.vertexShaderText = e.vertexShaderText, this.fragmentShaderText = e.fragmentShaderText, this.translucencyMode = defaultValue( + e.translucencyMode, + CustomShaderTranslucencyMode$1.INHERIT + ), this._textureManager = new TextureManager(), this._defaultTexture = void 0, this.uniformMap = buildUniformMap(this), this.usedVariablesVertex = { + attributeSet: {}, + featureIdSet: {}, + metadataSet: {} + }, this.usedVariablesFragment = { + attributeSet: {}, + featureIdSet: {}, + metadataSet: {}, + materialSet: {} + }, findUsedVariables(this), validateBuiltinVariables(this); +} +function buildUniformMap(e) { + const t = e.uniforms, n = {}; + for (const i in t) + if (t.hasOwnProperty(i)) { + const r = t[i]; + r.type === UniformType$1.SAMPLER_2D ? (e._textureManager.loadTexture2D(i, r.value), n[i] = createUniformTexture2DFunction( + e, + i + )) : n[i] = createUniformFunction( + e, + i + ); + } + return n; +} +function createUniformTexture2DFunction(e, t) { + return function() { + return defaultValue( + e._textureManager.getTexture(t), + e._defaultTexture + ); + }; +} +function createUniformFunction(e, t) { + return function() { + return e.uniforms[t].value; + }; +} +function getVariables(e, t, n) { + let i; + for (; (i = t.exec(e)) !== null; ) { + const r = i[1]; + n[r] = !0; + } +} +function findUsedVariables(e) { + const t = /[vf]sInput\.attributes\.(\w+)/g, n = /[vf]sInput\.featureIds\.(\w+)/g, i = /[vf]sInput\.metadata.(\w+)/g; + let r; + const o = e.vertexShaderText; + defined(o) && (r = e.usedVariablesVertex.attributeSet, getVariables(o, t, r), r = e.usedVariablesVertex.featureIdSet, getVariables(o, n, r), r = e.usedVariablesVertex.metadataSet, getVariables(o, i, r)); + const s = e.fragmentShaderText; + if (defined(s)) { + r = e.usedVariablesFragment.attributeSet, getVariables(s, t, r), r = e.usedVariablesFragment.featureIdSet, getVariables(s, n, r), r = e.usedVariablesFragment.metadataSet, getVariables(s, i, r); + const c = /material\.(\w+)/g, l = e.usedVariablesFragment.materialSet; + getVariables(s, c, l); + } +} +function expandCoordinateAbbreviations(e) { + const t = /^.*MC$/, n = /^.*WC$/, i = /^.*EC$/; + return t.test(e) ? `${e} (model coordinates)` : n.test(e) ? `${e} (Cartesian world coordinates)` : i.test(e) ? `${e} (eye coordinates)` : e; +} +function validateVariableUsage(e, t, n, i) { + if (e.hasOwnProperty(t)) { + const r = `${expandCoordinateAbbreviations( + t + )} is not available in the ${i} shader. Did you mean ${expandCoordinateAbbreviations( + n + )} instead?`; + throw new DeveloperError(r); + } +} +function validateBuiltinVariables(e) { + const t = e.usedVariablesVertex.attributeSet; + validateVariableUsage(t, "position", "positionMC", "vertex"), validateVariableUsage(t, "normal", "normalMC", "vertex"), validateVariableUsage(t, "tangent", "tangentMC", "vertex"), validateVariableUsage(t, "bitangent", "bitangentMC", "vertex"), validateVariableUsage(t, "positionWC", "positionMC", "vertex"), validateVariableUsage(t, "positionEC", "positionMC", "vertex"), validateVariableUsage(t, "normalEC", "normalMC", "vertex"), validateVariableUsage(t, "tangentEC", "tangentMC", "vertex"), validateVariableUsage(t, "bitangentEC", "bitangentMC", "vertex"); + const n = e.usedVariablesFragment.attributeSet; + validateVariableUsage(n, "position", "positionEC", "fragment"), validateVariableUsage(n, "normal", "normalEC", "fragment"), validateVariableUsage(n, "tangent", "tangentEC", "fragment"), validateVariableUsage(n, "bitangent", "bitangentEC", "fragment"), validateVariableUsage(n, "normalMC", "normalEC", "fragment"), validateVariableUsage(n, "tangentMC", "tangentEC", "fragment"), validateVariableUsage(n, "bitangentMC", "bitangentEC", "fragment"); +} +CustomShader.prototype.setUniform = function(e, t) { + const n = this.uniforms[e]; + n.type === UniformType$1.SAMPLER_2D ? this._textureManager.loadTexture2D(e, t) : defined(t.clone) ? n.value = t.clone(n.value) : n.value = t; +}; +CustomShader.prototype.update = function(e) { + this._defaultTexture = e.context.defaultTexture, this._textureManager.update(e); +}; +CustomShader.prototype.isDestroyed = function() { + return !1; +}; +CustomShader.prototype.destroy = function() { + this._textureManager = this._textureManager && this._textureManager.destroy(), destroyObject(this); +}; +function VoxelPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._ready = !1, this._provider = defaultValue( + e.provider, + VoxelPrimitive.DefaultProvider + ), this._traversal = void 0, this._shape = void 0, this._shapeVisible = !1, this._paddingBefore = new Cartesian3(), this._paddingAfter = new Cartesian3(), this._minBounds = new Cartesian3(), this._minBoundsOld = new Cartesian3(), this._maxBounds = new Cartesian3(), this._maxBoundsOld = new Cartesian3(), this._exaggeratedMinBounds = new Cartesian3(), this._exaggeratedMinBoundsOld = new Cartesian3(), this._exaggeratedMaxBounds = new Cartesian3(), this._exaggeratedMaxBoundsOld = new Cartesian3(), this._minClippingBounds = new Cartesian3(), this._minClippingBoundsOld = new Cartesian3(), this._maxClippingBounds = new Cartesian3(), this._maxClippingBoundsOld = new Cartesian3(), this._clippingPlanes = void 0, this._clippingPlanesState = 0, this._clippingPlanesEnabled = !1, this._modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._exaggeratedModelMatrix = Matrix4.clone(this._modelMatrix), this._compoundModelMatrix = new Matrix4(), this._compoundModelMatrixOld = new Matrix4(), this._customShader = defaultValue( + e.customShader, + VoxelPrimitive.DefaultCustomShader + ), this._customShaderCompilationEvent = new Event(), this._shaderDirty = !0, this._drawCommand = void 0, this._drawCommandPick = void 0, this._pickId = void 0, this._clock = e.clock, this._transformPositionWorldToUv = new Matrix4(), this._transformPositionUvToWorld = new Matrix4(), this._transformDirectionWorldToLocal = new Matrix3(), this._transformNormalLocalToWorld = new Matrix3(), this._nearestSampling = !1, this._levelBlendFactor = 0, this._stepSizeMultiplier = 1, this._depthTest = !0, this._useLogDepth = void 0, this._screenSpaceError = 4, this._debugPolylines = new PolylineCollection(), this._debugDraw = !1, this._disableRender = !1, this._disableUpdate = !1, this._uniforms = { + octreeInternalNodeTexture: void 0, + octreeInternalNodeTilesPerRow: 0, + octreeInternalNodeTexelSizeUv: new Cartesian2(), + octreeLeafNodeTexture: void 0, + octreeLeafNodeTilesPerRow: 0, + octreeLeafNodeTexelSizeUv: new Cartesian2(), + megatextureTextures: [], + megatextureSliceDimensions: new Cartesian2(), + megatextureTileDimensions: new Cartesian2(), + megatextureVoxelSizeUv: new Cartesian2(), + megatextureSliceSizeUv: new Cartesian2(), + megatextureTileSizeUv: new Cartesian2(), + dimensions: new Cartesian3(), + paddingBefore: new Cartesian3(), + paddingAfter: new Cartesian3(), + transformPositionViewToUv: new Matrix4(), + transformPositionUvToView: new Matrix4(), + transformDirectionViewToLocal: new Matrix3(), + transformNormalLocalToWorld: new Matrix3(), + cameraPositionUv: new Cartesian3(), + ndcSpaceAxisAlignedBoundingBox: new Cartesian4(), + clippingPlanesTexture: void 0, + clippingPlanesMatrix: new Matrix4(), + stepSize: 0, + pickColor: new Color() + }, this._shapeDefinesOld = {}, this._uniformMap = {}; + const t = this._uniforms, n = this._uniformMap; + for (const r in t) + if (t.hasOwnProperty(r)) { + const o = `u_${r}`; + n[o] = function() { + return t[r]; + }; + } + const i = this._provider; + initialize$1(this, i); +} +function initialize$1(e, t) { + const { + shape: n, + minBounds: i = VoxelShapeType$1.getMinBounds(n), + maxBounds: r = VoxelShapeType$1.getMaxBounds(n) + } = t; + e.minBounds = i, e.maxBounds = r, e.minClippingBounds = VoxelShapeType$1.getMinBounds(n), e.maxClippingBounds = VoxelShapeType$1.getMaxBounds(n), e._exaggeratedMinBounds = Cartesian3.clone( + e._minBounds, + e._exaggeratedMinBounds + ), e._exaggeratedMaxBounds = Cartesian3.clone( + e._maxBounds, + e._exaggeratedMaxBounds + ), e._exaggeratedModelMatrix = Matrix4.clone( + e._modelMatrix, + e._exaggeratedModelMatrix + ), checkTransformAndBounds(e, t); + const o = VoxelShapeType$1.getShapeConstructor(n); + e._shape = new o(), e._shapeVisible = updateShapeAndTransforms( + e, + e._shape + ); +} +Object.defineProperties(VoxelPrimitive.prototype, { + /** + * Gets a value indicating whether or not the primitive is ready for use. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * Gets the {@link VoxelProvider} associated with this primitive. + * + * @memberof VoxelPrimitive.prototype + * @type {VoxelProvider} + * @readonly + */ + provider: { + get: function() { + return this._provider; + } + }, + /** + * Gets the bounding sphere. + * + * @memberof VoxelPrimitive.prototype + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + return this._shape.boundingSphere; + } + }, + /** + * Gets the oriented bounding box. + * + * @memberof VoxelPrimitive.prototype + * @type {OrientedBoundingBox} + * @readonly + */ + orientedBoundingBox: { + get: function() { + return this._shape.orientedBoundingBox; + } + }, + /** + * Gets the model matrix. + * + * @memberof VoxelPrimitive.prototype + * @type {Matrix4} + * @readonly + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._modelMatrix = Matrix4.clone(e, this._modelMatrix); + } + }, + /** + * Gets the shape type. + * + * @memberof VoxelPrimitive.prototype + * @type {VoxelShapeType} + * @readonly + */ + shape: { + get: function() { + return this._provider.shape; + } + }, + /** + * Gets the voxel dimensions. + * + * @memberof VoxelPrimitive.prototype + * @type {Cartesian3} + * @readonly + */ + dimensions: { + get: function() { + return this._provider.dimensions; + } + }, + /** + * Gets the minimum value per channel of the voxel data. + * + * @memberof VoxelPrimitive.prototype + * @type {number[][]} + * @readonly + */ + minimumValues: { + get: function() { + return this._provider.minimumValues; + } + }, + /** + * Gets the maximum value per channel of the voxel data. + * + * @memberof VoxelPrimitive.prototype + * @type {number[][]} + * @readonly + */ + maximumValues: { + get: function() { + return this._provider.maximumValues; + } + }, + /** + * Gets or sets whether or not this primitive should be displayed. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + */ + show: { + get: function() { + return !this._disableRender; + }, + set: function(e) { + this._disableRender = !e; + } + }, + /** + * Gets or sets whether or not the primitive should update when the view changes. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + */ + disableUpdate: { + get: function() { + return this._disableUpdate; + }, + set: function(e) { + this._disableUpdate = e; + } + }, + /** + * Gets or sets whether or not to render debug visualizations. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + */ + debugDraw: { + get: function() { + return this._debugDraw; + }, + set: function(e) { + this._debugDraw = e; + } + }, + /** + * Gets or sets whether or not to test against depth when rendering. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + */ + depthTest: { + get: function() { + return this._depthTest; + }, + set: function(e) { + this._depthTest !== e && (this._depthTest = e, this._shaderDirty = !0); + } + }, + /** + * Gets or sets the nearest sampling. + * + * @memberof VoxelPrimitive.prototype + * @type {boolean} + */ + nearestSampling: { + get: function() { + return this._nearestSampling; + }, + set: function(e) { + this._nearestSampling !== e && (this._nearestSampling = e, this._shaderDirty = !0); + } + }, + /** + * Controls how quickly to blend between different levels of the tree. + * 0.0 means an instantaneous pop. + * 1.0 means a full linear blend. + * + * @memberof VoxelPrimitive.prototype + * @type {number} + * @private + */ + levelBlendFactor: { + get: function() { + return this._levelBlendFactor; + }, + set: function(e) { + this._levelBlendFactor = CesiumMath.clamp(e, 0, 1); + } + }, + /** + * Gets or sets the screen space error in pixels. If the screen space size + * of a voxel is greater than the screen space error, the tile is subdivided. + * Lower screen space error corresponds with higher detail rendering, but could + * result in worse performance and higher memory consumption. + * + * @memberof VoxelPrimitive.prototype + * @type {number} + */ + screenSpaceError: { + get: function() { + return this._screenSpaceError; + }, + set: function(e) { + this._screenSpaceError = e; + } + }, + /** + * Gets or sets the step size multiplier used during raymarching. + * The lower the value, the higher the rendering quality, but + * also the worse the performance. + * + * @memberof VoxelPrimitive.prototype + * @type {number} + */ + stepSize: { + get: function() { + return this._stepSizeMultiplier; + }, + set: function(e) { + this._stepSizeMultiplier = e; + } + }, + /** + * Gets or sets the minimum bounds in the shape's local coordinate system. + * Voxel data is stretched or squashed to fit the bounds. + * + * @memberof VoxelPrimitive.prototype + * @type {Cartesian3} + */ + minBounds: { + get: function() { + return this._minBounds; + }, + set: function(e) { + this._minBounds = Cartesian3.clone(e, this._minBounds); + } + }, + /** + * Gets or sets the maximum bounds in the shape's local coordinate system. + * Voxel data is stretched or squashed to fit the bounds. + * + * @memberof VoxelPrimitive.prototype + * @type {Cartesian3} + */ + maxBounds: { + get: function() { + return this._maxBounds; + }, + set: function(e) { + this._maxBounds = Cartesian3.clone(e, this._maxBounds); + } + }, + /** + * Gets or sets the minimum clipping location in the shape's local coordinate system. + * Any voxel content outside the range is clipped. + * + * @memberof VoxelPrimitive.prototype + * @type {Cartesian3} + */ + minClippingBounds: { + get: function() { + return this._minClippingBounds; + }, + set: function(e) { + this._minClippingBounds = Cartesian3.clone( + e, + this._minClippingBounds + ); + } + }, + /** + * Gets or sets the maximum clipping location in the shape's local coordinate system. + * Any voxel content outside the range is clipped. + * + * @memberof VoxelPrimitive.prototype + * @type {Cartesian3} + */ + maxClippingBounds: { + get: function() { + return this._maxClippingBounds; + }, + set: function(e) { + this._maxClippingBounds = Cartesian3.clone( + e, + this._maxClippingBounds + ); + } + }, + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the primitive. + * + * @memberof VoxelPrimitive.prototype + * @type {ClippingPlaneCollection} + */ + clippingPlanes: { + get: function() { + return this._clippingPlanes; + }, + set: function(e) { + ClippingPlaneCollection.setOwner(e, this, "_clippingPlanes"); + } + }, + /** + * Gets or sets the custom shader. If undefined, {@link VoxelPrimitive.DefaultCustomShader} is set. + * + * @memberof VoxelPrimitive.prototype + * @type {CustomShader} + */ + customShader: { + get: function() { + return this._customShader; + }, + set: function(e) { + if (this._customShader !== e) { + const t = this._uniformMap, i = this._customShader.uniformMap; + for (const r in i) + i.hasOwnProperty(r) && delete t[r]; + defined(e) ? this._customShader = e : this._customShader = VoxelPrimitive.DefaultCustomShader, this._shaderDirty = !0; + } + } + }, + /** + * Gets an event that is raised whenever a custom shader is compiled. + * + * @memberof VoxelPrimitive.prototype + * @type {Event} + * @readonly + */ + customShaderCompilationEvent: { + get: function() { + return this._customShaderCompilationEvent; + } + } +}); +const scratchDimensions = new Cartesian3(), scratchIntersect = new Cartesian4(), scratchNdcAabb = new Cartesian4(), scratchScale$1 = new Cartesian3(), scratchLocalScale = new Cartesian3(), scratchRotation = new Matrix3(), scratchRotationAndLocalScale = new Matrix3(), scratchTransformPositionWorldToLocal = new Matrix4(), scratchTransformPositionLocalToWorld = new Matrix4(), scratchTransformPositionLocalToProjection = new Matrix4(), transformPositionLocalToUv = Matrix4.fromRotationTranslation( + Matrix3.fromUniformScale(0.5, new Matrix3()), + new Cartesian3(0.5, 0.5, 0.5), + new Matrix4() +), transformPositionUvToLocal = Matrix4.fromRotationTranslation( + Matrix3.fromUniformScale(2, new Matrix3()), + new Cartesian3(-1, -1, -1), + new Matrix4() +); +VoxelPrimitive.prototype.update = function(e) { + const t = this._provider; + this._customShader.update(e); + const n = e.context; + if (!this._ready) { + initFromProvider(this, t, n), e.afterRender.push(() => (this._ready = !0, !0)); + return; + } + updateVerticalExaggeration(this, e); + const i = checkTransformAndBounds(this, t), r = this._shape; + if (i && (this._shapeVisible = updateShapeAndTransforms(this, r), checkShapeDefines(this, r) && (this._shaderDirty = !0)), !this._shapeVisible) + return; + const o = getKeyframeLocation( + t.timeIntervalCollection, + this._clock + ), s = this._traversal, c = s._sampleCount; + if (s.update( + e, + o, + i, + // recomputeBoundingVolumes + this._disableUpdate + // pauseUpdate + ), c !== s._sampleCount && (this._shaderDirty = !0), !s.isRenderable(s.rootNode) || (this._debugDraw && debugDraw(this, e), this._disableRender)) + return; + this._useLogDepth !== e.useLogDepth && (this._useLogDepth = e.useLogDepth, this._shaderDirty = !0), updateClippingPlanes(this, e) && (this._shaderDirty = !0); + const d = s.leafNodeTexture, f = this._uniforms; + defined(d) && (f.octreeLeafNodeTexture = s.leafNodeTexture, f.octreeLeafNodeTexelSizeUv = Cartesian2.clone( + s.leafNodeTexelSizeUv, + f.octreeLeafNodeTexelSizeUv + ), f.octreeLeafNodeTilesPerRow = s.leafNodeTilesPerRow), this._shaderDirty && (buildVoxelDrawCommands(this, n), this._shaderDirty = !1); + const h = n.uniformState.viewProjection, p = r.orientedBoundingBox, m = orientedBoundingBoxToNdcAabb( + p, + h, + scratchNdcAabb + ); + if (m.x === 1 || m.y === 1 || m.z === -1 || m.w === -1) + return; + f.ndcSpaceAxisAlignedBoundingBox = Cartesian4.clone( + m, + f.ndcSpaceAxisAlignedBoundingBox + ); + const y = n.uniformState.inverseView; + f.transformPositionViewToUv = Matrix4.multiplyTransformation( + this._transformPositionWorldToUv, + y, + f.transformPositionViewToUv + ); + const C = n.uniformState.view; + f.transformPositionUvToView = Matrix4.multiplyTransformation( + C, + this._transformPositionUvToWorld, + f.transformPositionUvToView + ); + const T = n.uniformState.inverseViewRotation; + f.transformDirectionViewToLocal = Matrix3.multiply( + this._transformDirectionWorldToLocal, + T, + f.transformDirectionViewToLocal + ), f.transformNormalLocalToWorld = Matrix3.clone( + this._transformNormalLocalToWorld, + f.transformNormalLocalToWorld + ); + const x = e.camera.positionWC; + f.cameraPositionUv = Matrix4.multiplyByPoint( + this._transformPositionWorldToUv, + x, + f.cameraPositionUv + ), f.stepSize = this._stepSizeMultiplier; + const b = e.passes.pick ? this._drawCommandPick : e.passes.pickVoxel ? this._drawCommandPickVoxel : this._drawCommand; + b.boundingVolume = r.boundingSphere, e.commandList.push(b); +}; +const scratchExaggerationScale = new Cartesian3(), scratchExaggerationCenter = new Cartesian3(), scratchCartographicCenter = new Cartographic(), scratchExaggerationTranslation = new Cartesian3(); +function updateVerticalExaggeration(e, t) { + if (e._exaggeratedMinBounds = Cartesian3.clone( + e._minBounds, + e._exaggeratedMinBounds + ), e._exaggeratedMaxBounds = Cartesian3.clone( + e._maxBounds, + e._exaggeratedMaxBounds + ), e.shape === VoxelShapeType$1.ELLIPSOID) { + const n = t.verticalExaggerationRelativeHeight, i = t.verticalExaggeration; + e._exaggeratedMinBounds.z = (e._minBounds.z - n) * i + n, e._exaggeratedMaxBounds.z = (e._maxBounds.z - n) * i + n; + } else if (e.shape === VoxelShapeType$1.BOX) { + const n = Cartesian3.fromElements( + 1, + 1, + t.verticalExaggeration, + scratchExaggerationScale + ); + e._exaggeratedModelMatrix = Matrix4.multiplyByScale( + e._modelMatrix, + n, + e._exaggeratedModelMatrix + ), e._exaggeratedModelMatrix = Matrix4.multiplyByTranslation( + e._exaggeratedModelMatrix, + computeBoxExaggerationTranslation(e, t), + e._exaggeratedModelMatrix + ); + } +} +function computeBoxExaggerationTranslation(e, t) { + const { + shapeTransform: n = Matrix4.IDENTITY, + globalTransform: i = Matrix4.IDENTITY + } = e._provider, r = Matrix4.getTranslation( + n, + scratchExaggerationCenter + ), o = Matrix4.multiplyByPoint( + e._modelMatrix, + r, + scratchExaggerationCenter + ), s = Matrix4.multiplyByPoint( + i, + o, + scratchExaggerationCenter + ), l = Ellipsoid.WGS84.cartesianToCartographic( + s, + scratchCartographicCenter + ); + let d = 0; + defined(l) && (d = l.height); + const f = VerticalExaggeration.getHeight( + d, + t.verticalExaggeration, + t.verticalExaggerationRelativeHeight + ); + return Cartesian3.fromElements( + 0, + 0, + (f - d) / t.verticalExaggeration, + scratchExaggerationTranslation + ); +} +function initFromProvider(e, t, n) { + const i = e._uniforms; + e._pickId = n.createPickId({ primitive: e }), i.pickColor = Color.clone(e._pickId.color, i.pickColor); + const { shaderDefines: r, shaderUniforms: o } = e._shape; + e._shapeDefinesOld = clone$1(r, !0); + const s = e._uniformMap; + for (const c in o) + if (o.hasOwnProperty(c)) { + const l = `u_${c}`; + s[l] = function() { + return o[c]; + }; + } + i.dimensions = Cartesian3.clone( + t.dimensions, + i.dimensions + ), e._paddingBefore = Cartesian3.clone( + defaultValue(t.paddingBefore, Cartesian3.ZERO), + e._paddingBefore + ), i.paddingBefore = Cartesian3.clone( + e._paddingBefore, + i.paddingBefore + ), e._paddingAfter = Cartesian3.clone( + defaultValue(t.paddingAfter, Cartesian3.ZERO), + e._paddingBefore + ), i.paddingAfter = Cartesian3.clone( + e._paddingAfter, + i.paddingAfter + ), e._traversal = setupTraversal(e, t, n), setTraversalUniforms(e._traversal, i); +} +function checkTransformAndBounds(e, t) { + const n = defaultValue( + t.shapeTransform, + Matrix4.IDENTITY + ), i = defaultValue( + t.globalTransform, + Matrix4.IDENTITY + ); + return Matrix4.multiplyTransformation( + i, + e._exaggeratedModelMatrix, + e._compoundModelMatrix + ), Matrix4.multiplyTransformation( + e._compoundModelMatrix, + n, + e._compoundModelMatrix + ), updateBound(e, "_compoundModelMatrix", "_compoundModelMatrixOld") + updateBound(e, "_minBounds", "_minBoundsOld") + updateBound(e, "_maxBounds", "_maxBoundsOld") + updateBound( + e, + "_exaggeratedMinBounds", + "_exaggeratedMinBoundsOld" + ) + updateBound( + e, + "_exaggeratedMaxBounds", + "_exaggeratedMaxBoundsOld" + ) + updateBound(e, "_minClippingBounds", "_minClippingBoundsOld") + updateBound(e, "_maxClippingBounds", "_maxClippingBoundsOld") > 0; +} +function updateBound(e, t, n) { + const i = e[t], r = e[n], o = !i.equals(r); + return o && i.clone(r), o ? 1 : 0; +} +function updateShapeAndTransforms(e, t, n) { + if (!t.update( + e._compoundModelMatrix, + e._exaggeratedMinBounds, + e._exaggeratedMaxBounds, + e.minClippingBounds, + e.maxClippingBounds + )) + return !1; + const r = t.shapeTransform, o = Matrix4.inverse( + r, + scratchTransformPositionWorldToLocal + ), s = Matrix4.getRotation( + r, + scratchRotation + ), c = Matrix4.getScale(r, scratchScale$1), l = Cartesian3.maximumComponent(c), d = Cartesian3.divideByScalar( + c, + l, + scratchLocalScale + ), f = Matrix3.multiplyByScale( + s, + d, + scratchRotationAndLocalScale + ); + return e._transformPositionWorldToUv = Matrix4.multiplyTransformation( + transformPositionLocalToUv, + o, + e._transformPositionWorldToUv + ), e._transformPositionUvToWorld = Matrix4.multiplyTransformation( + r, + transformPositionUvToLocal, + e._transformPositionUvToWorld + ), e._transformDirectionWorldToLocal = Matrix4.getMatrix3( + o, + e._transformDirectionWorldToLocal + ), e._transformNormalLocalToWorld = Matrix3.inverseTranspose( + f, + e._transformNormalLocalToWorld + ), !0; +} +function setupTraversal(e, t, n) { + const i = Cartesian3.clone(t.dimensions, scratchDimensions); + Cartesian3.add(i, e._paddingBefore, i), Cartesian3.add(i, e._paddingAfter, i); + const r = t.maximumTileCount, o = defined(r) ? VoxelTraversal.getApproximateTextureMemoryByteLength( + r, + i, + t.types, + t.componentTypes + ) : void 0, s = defaultValue(t.keyframeCount, 1); + return new VoxelTraversal( + e, + n, + i, + t.types, + t.componentTypes, + s, + o + ); +} +function setTraversalUniforms(e, t) { + t.octreeInternalNodeTexture = e.internalNodeTexture, t.octreeInternalNodeTexelSizeUv = Cartesian2.clone( + e.internalNodeTexelSizeUv, + t.octreeInternalNodeTexelSizeUv + ), t.octreeInternalNodeTilesPerRow = e.internalNodeTilesPerRow; + const n = e.megatextures, i = n[0], r = n.length; + t.megatextureTextures = new Array(r); + for (let o = 0; o < r; o++) + t.megatextureTextures[o] = n[o].texture; + t.megatextureSliceDimensions = Cartesian2.clone( + i.sliceCountPerRegion, + t.megatextureSliceDimensions + ), t.megatextureTileDimensions = Cartesian2.clone( + i.regionCountPerMegatexture, + t.megatextureTileDimensions + ), t.megatextureVoxelSizeUv = Cartesian2.clone( + i.voxelSizeUv, + t.megatextureVoxelSizeUv + ), t.megatextureSliceSizeUv = Cartesian2.clone( + i.sliceSizeUv, + t.megatextureSliceSizeUv + ), t.megatextureTileSizeUv = Cartesian2.clone( + i.regionSizeUv, + t.megatextureTileSizeUv + ); +} +function checkShapeDefines(e, t) { + const n = t.shaderDefines, i = Object.keys(n).some( + (r) => n[r] !== e._shapeDefinesOld[r] + ); + return i && (e._shapeDefinesOld = clone$1(n, !0)), i; +} +function getKeyframeLocation(e, t) { + if (!defined(e) || !defined(t)) + return 0; + let n = t.currentTime, i, r = e.indexOf(n); + r >= 0 ? i = e.get(r) : (r = ~r, r === e.length ? (r = e.length - 1, i = e.get(r), n = i.stop) : (i = e.get(r), n = i.start)); + const o = JulianDate.secondsDifference( + i.stop, + i.start + ), c = JulianDate.secondsDifference( + n, + i.start + ) / o; + return r + c; +} +function updateClippingPlanes(e, t) { + const n = e.clippingPlanes; + if (!defined(n)) + return !1; + n.update(t); + const { clippingPlanesState: i, enabled: r } = n; + if (r) { + const o = e._uniforms; + o.clippingPlanesTexture = n.texture, o.clippingPlanesMatrix = Matrix4.transpose( + Matrix4.multiplyTransformation( + Matrix4.inverse( + n.modelMatrix, + o.clippingPlanesMatrix + ), + e._transformPositionUvToWorld, + o.clippingPlanesMatrix + ), + o.clippingPlanesMatrix + ); + } + return e._clippingPlanesState === i && e._clippingPlanesEnabled === r ? !1 : (e._clippingPlanesState = i, e._clippingPlanesEnabled = r, !0); +} +VoxelPrimitive.prototype.isDestroyed = function() { + return !1; +}; +VoxelPrimitive.prototype.destroy = function() { + const e = this._drawCommand; + defined(e) && (e.shaderProgram = e.shaderProgram && e.shaderProgram.destroy()); + const t = this._drawCommandPick; + return defined(t) && (t.shaderProgram = t.shaderProgram && t.shaderProgram.destroy()), this._pickId = this._pickId && this._pickId.destroy(), this._traversal = this._traversal && this._traversal.destroy(), this._clippingPlanes = this._clippingPlanes && this._clippingPlanes.destroy(), destroyObject(this); +}; +const corners = new Array( + new Cartesian4(-1, -1, -1, 1), + new Cartesian4(1, -1, -1, 1), + new Cartesian4(-1, 1, -1, 1), + new Cartesian4(1, 1, -1, 1), + new Cartesian4(-1, -1, 1, 1), + new Cartesian4(1, -1, 1, 1), + new Cartesian4(-1, 1, 1, 1), + new Cartesian4(1, 1, 1, 1) +), vertexNeighborIndices = new Array( + 1, + 2, + 4, + 0, + 3, + 5, + 0, + 3, + 6, + 1, + 2, + 7, + 0, + 5, + 6, + 1, + 4, + 7, + 2, + 4, + 7, + 3, + 5, + 6 +), scratchCornersClipSpace = new Array( + new Cartesian4(), + new Cartesian4(), + new Cartesian4(), + new Cartesian4(), + new Cartesian4(), + new Cartesian4(), + new Cartesian4(), + new Cartesian4() +); +function orientedBoundingBoxToNdcAabb(e, t, n) { + const i = Matrix4.fromRotationTranslation( + e.halfAxes, + e.center, + scratchTransformPositionLocalToWorld + ), r = Matrix4.multiply( + t, + i, + scratchTransformPositionLocalToProjection + ); + let o = +Number.MAX_VALUE, s = -Number.MAX_VALUE, c = +Number.MAX_VALUE, l = -Number.MAX_VALUE, d; + const f = scratchCornersClipSpace, h = corners.length; + for (d = 0; d < h; d++) + Matrix4.multiplyByVector( + r, + corners[d], + f[d] + ); + for (d = 0; d < h; d++) { + const p = f[d]; + if (p.z >= -p.w) { + const m = p.x / p.w, _ = p.y / p.w; + o = Math.min(o, m), s = Math.max(s, m), c = Math.min(c, _), l = Math.max(l, _); + } else + for (let m = 0; m < 3; m++) { + const _ = vertexNeighborIndices[d * 3 + m], y = f[_]; + if (y.z >= -y.w) { + const C = p.z + p.w, T = y.z + y.w, x = C / (C - T), b = Cartesian4.lerp( + p, + y, + x, + scratchIntersect + ), S = b.x / b.w, E = b.y / b.w; + o = Math.min(o, S), s = Math.max(s, S), c = Math.min(c, E), l = Math.max(l, E); + } + } + } + return o = CesiumMath.clamp(o, -1, 1), c = CesiumMath.clamp(c, -1, 1), s = CesiumMath.clamp(s, -1, 1), l = CesiumMath.clamp(l, -1, 1), n = Cartesian4.fromElements(o, c, s, l, n), n; +} +const polylineAxisDistance = 3e7, polylineXAxis = new Cartesian3(polylineAxisDistance, 0, 0), polylineYAxis = new Cartesian3(0, polylineAxisDistance, 0), polylineZAxis = new Cartesian3(0, 0, polylineAxisDistance); +function debugDraw(e, t) { + const n = e._traversal, i = e._debugPolylines; + i.removeAll(); + function r(l, d, f, h) { + i.add({ + positions: [l, d], + width: h, + material: Material$4.fromType("Color", { + color: f + }) + }); + } + function o(l, d, f) { + const h = l.computeCorners(); + r(h[0], h[1], d, f), r(h[2], h[3], d, f), r(h[4], h[5], d, f), r(h[6], h[7], d, f), r(h[0], h[2], d, f), r(h[4], h[6], d, f), r(h[1], h[3], d, f), r(h[5], h[7], d, f), r(h[0], h[4], d, f), r(h[2], h[6], d, f), r(h[1], h[5], d, f), r(h[3], h[7], d, f); + } + function s(l) { + if (!n.isRenderable(l)) + return; + const d = l.level, h = Math.max(1, 5 / Math.pow(2, d)), m = [Color.RED, Color.LIME, Color.BLUE][d % 3]; + if (o(l.orientedBoundingBox, m, h), defined(l.children)) + for (let _ = 0; _ < 8; _++) + s(l.children[_]); + } + o(e._shape.orientedBoundingBox, Color.WHITE, 5), s(n.rootNode); + const c = 10; + r( + Cartesian3.ZERO, + polylineXAxis, + Color.RED, + c + ), r( + Cartesian3.ZERO, + polylineYAxis, + Color.LIME, + c + ), r( + Cartesian3.ZERO, + polylineZAxis, + Color.BLUE, + c + ), i.update(t); +} +VoxelPrimitive.DefaultCustomShader = new CustomShader({ + fragmentShaderText: `void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) +{ + material.diffuse = vec3(1.0); + material.alpha = 1.0; +}` +}); +function DefaultVoxelProvider() { + this.ready = !0, this.shape = VoxelShapeType$1.BOX, this.dimensions = new Cartesian3(1, 1, 1), this.names = ["data"], this.types = [MetadataType$1.SCALAR], this.componentTypes = [MetadataComponentType$1.FLOAT32], this.maximumTileCount = 1; +} +DefaultVoxelProvider.prototype.requestData = function(e) { + if (!((defined(e) ? defaultValue(e.tileLevel, 0) : 0) >= 1)) + return Promise.resolve([new Float32Array(1)]); +}; +VoxelPrimitive.DefaultProvider = new DefaultVoxelProvider(); +const requestRenderAfterFrame = function(e) { + return function() { + e.frameState.afterRender.push(function() { + e.requestRender(); + }); + }; +}; +function Scene(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.canvas; + let n = e.creditContainer, i = e.creditViewport; + const r = clone$1(e.contextOptions), o = defined(n), s = new Context(t, r); + o || (n = document.createElement("div"), n.style.position = "absolute", n.style.bottom = "0", n.style["text-shadow"] = "0 0 2px #000000", n.style.color = "#ffffff", n.style["font-size"] = "10px", n.style["padding-right"] = "5px", t.parentNode.appendChild(n)), defined(i) || (i = t.parentNode), this._id = createGuid(), this._jobScheduler = new JobScheduler(), this._frameState = new FrameState( + s, + new CreditDisplay(n, "•", i), + this._jobScheduler + ), this._frameState.scene3DOnly = defaultValue(e.scene3DOnly, !1), this._removeCreditContainer = !o, this._creditContainer = n, this._canvas = t, this._context = s, this._computeEngine = new ComputeEngine(s), this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this._globe = void 0, this._globeTranslucencyState = new GlobeTranslucencyState(), this._primitives = new PrimitiveCollection(), this._groundPrimitives = new PrimitiveCollection(), this._globeHeight = void 0, this._globeHeightDirty = !0, this._cameraUnderground = !1, this._removeUpdateHeightCallback = void 0, this._logDepthBuffer = Scene.defaultLogDepthBuffer && s.fragmentDepth, this._logDepthBufferDirty = !0, this._tweens = new TweenCollection(), this._shaderFrameCount = 0, this._sunPostProcess = void 0, this._computeCommandList = [], this._overlayCommandList = [], this._useOIT = defaultValue(e.orderIndependentTranslucency, !0), this._executeOITFunction = void 0, this._depthPlane = new DepthPlane(e.depthPlaneEllipsoidOffset), this._clearColorCommand = new ClearCommand({ + color: new Color(), + stencil: 0, + owner: this + }), this._depthClearCommand = new ClearCommand({ + depth: 1, + owner: this + }), this._stencilClearCommand = new ClearCommand({ + stencil: 0 + }), this._classificationStencilClearCommand = new ClearCommand({ + stencil: 0, + renderState: RenderState.fromCache({ + stencilMask: StencilConstants$1.CLASSIFICATION_MASK + }) + }), this._depthOnlyRenderStateCache = {}, this._transitioner = new SceneTransitioner(this), this._preUpdate = new Event(), this._postUpdate = new Event(), this._renderError = new Event(), this._preRender = new Event(), this._postRender = new Event(), this._minimumDisableDepthTestDistance = 0, this._debugInspector = new DebugInspector(), this._msaaSamples = defaultValue(e.msaaSamples, 4), this.rethrowRenderErrors = !1, this.completeMorphOnUserInput = !0, this.morphStart = new Event(), this.morphComplete = new Event(), this.skyBox = void 0, this.skyAtmosphere = void 0, this.sun = void 0, this.sunBloom = !0, this._sunBloom = void 0, this.moon = void 0, this.backgroundColor = Color.clone(Color.BLACK), this._mode = SceneMode$1.SCENE3D, this._mapProjection = defined(e.mapProjection) ? e.mapProjection : new GeographicProjection(this._ellipsoid), this.morphTime = 1, this.farToNearRatio = 1e3, this.logarithmicDepthFarToNearRatio = 1e9, this.nearToFarDistance2D = 175e4, this.verticalExaggeration = 1, this.verticalExaggerationRelativeHeight = 0, this.debugCommandFilter = void 0, this.debugShowCommands = !1, this.debugShowFrustums = !1, this.debugShowFramesPerSecond = !1, this.debugShowDepthFrustum = 1, this.debugShowFrustumPlanes = !1, this._debugShowFrustumPlanes = !1, this._debugFrustumPlanes = void 0, this.useDepthPicking = !0, this.pickTranslucentDepth = !1, this.cameraEventWaitTime = 500, this.atmosphere = new Atmosphere(), this.fog = new Fog(), this.fog.enabled = Ellipsoid.WGS84.equals(this._ellipsoid), Ellipsoid.WGS84.equals(this._ellipsoid) || (Camera.DEFAULT_VIEW_RECTANGLE = Rectangle.fromDegrees( + -45, + -45, + 45, + 45 + )), this._shadowMapCamera = new Camera(this), this.shadowMap = new ShadowMap({ + context: s, + lightCamera: this._shadowMapCamera, + enabled: defaultValue(e.shadows, !1) + }), this.invertClassification = !1, this.invertClassificationColor = Color.clone(Color.WHITE), this._actualInvertClassificationColor = Color.clone( + this._invertClassificationColor + ), this._invertClassification = new InvertClassification(), this.focalLength = void 0, this.eyeSeparation = void 0, this.postProcessStages = new PostProcessStageCollection(), this._brdfLutGenerator = new BrdfLutGenerator(), this._performanceDisplay = void 0, this._debugVolume = void 0, this._screenSpaceCameraController = new ScreenSpaceCameraController(this), this._cameraUnderground = !1, this._mapMode2D = defaultValue(e.mapMode2D, MapMode2D$1.INFINITE_SCROLL), this._environmentState = { + skyBoxCommand: void 0, + skyAtmosphereCommand: void 0, + sunDrawCommand: void 0, + sunComputeCommand: void 0, + moonCommand: void 0, + isSunVisible: !1, + isMoonVisible: !1, + isReadyForAtmosphere: !1, + isSkyAtmosphereVisible: !1, + clearGlobeDepth: !1, + useDepthPlane: !1, + renderTranslucentDepthForPick: !1, + originalFramebuffer: void 0, + useGlobeDepthFramebuffer: !1, + useOIT: !1, + useInvertClassification: !1, + usePostProcess: !1, + usePostProcessSelected: !1, + useWebVR: !1 + }, this._useWebVR = !1, this._cameraVR = void 0, this._aspectRatioVR = void 0, this.requestRenderMode = defaultValue(e.requestRenderMode, !1), this._renderRequested = !0, this.maximumRenderTimeChange = defaultValue( + e.maximumRenderTimeChange, + 0 + ), this._lastRenderTime = void 0, this._frameRateMonitor = void 0, this._removeRequestListenerCallback = RequestScheduler.requestCompletedEvent.addEventListener( + requestRenderAfterFrame(this) + ), this._removeTaskProcessorListenerCallback = TaskProcessor.taskCompletedEvent.addEventListener( + requestRenderAfterFrame(this) + ), this._removeGlobeCallbacks = [], this._removeTerrainProviderReadyListener = void 0; + const c = new BoundingRectangle( + 0, + 0, + s.drawingBufferWidth, + s.drawingBufferHeight + ), l = new Camera(this); + this._logDepthBuffer && (l.frustum.near = 0.1, l.frustum.far = 1e10), this.preloadFlightCamera = new Camera(this), this.preloadFlightCullingVolume = void 0, this._picking = new Picking(this), this._defaultView = new View(this, l, c), this._view = this._defaultView, this._hdr = void 0, this._hdrDirty = void 0, this.highDynamicRange = !1, this.gamma = 2.2, this.sphericalHarmonicCoefficients = void 0, this.specularEnvironmentMaps = void 0, this._specularEnvironmentCubeMap = void 0, this.light = new SunLight(), updateFrameNumber(this, 0, JulianDate.now()), this.updateFrameState(), this.initializeFrame(); +} +Scene.defaultLogDepthBuffer = !0; +function updateGlobeListeners(e, t) { + for (let i = 0; i < e._removeGlobeCallbacks.length; ++i) + e._removeGlobeCallbacks[i](); + e._removeGlobeCallbacks.length = 0; + const n = []; + defined(t) && (n.push( + t.imageryLayersUpdatedEvent.addEventListener( + requestRenderAfterFrame(e) + ) + ), n.push( + t.terrainProviderChanged.addEventListener( + requestRenderAfterFrame(e) + ) + )), e._removeGlobeCallbacks = n; +} +Object.defineProperties(Scene.prototype, { + /** + * Gets the canvas element to which this scene is bound. + * @memberof Scene.prototype + * + * @type {HTMLCanvasElement} + * @readonly + */ + canvas: { + get: function() { + return this._canvas; + } + }, + /** + * The drawingBufferHeight of the underlying GL context. + * @memberof Scene.prototype + * + * @type {number} + * @readonly + * + * @see {@link https://www.khronos.org/registry/webgl/specs/1.0/#DOM-WebGLRenderingContext-drawingBufferHeight|drawingBufferHeight} + */ + drawingBufferHeight: { + get: function() { + return this._context.drawingBufferHeight; + } + }, + /** + * The drawingBufferWidth of the underlying GL context. + * @memberof Scene.prototype + * + * @type {number} + * @readonly + * + * @see {@link https://www.khronos.org/registry/webgl/specs/1.0/#DOM-WebGLRenderingContext-drawingBufferWidth|drawingBufferWidth} + */ + drawingBufferWidth: { + get: function() { + return this._context.drawingBufferWidth; + } + }, + /** + * The maximum aliased line width, in pixels, supported by this WebGL implementation. It will be at least one. + * @memberof Scene.prototype + * + * @type {number} + * @readonly + * + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with <code>ALIASED_LINE_WIDTH_RANGE</code>. + */ + maximumAliasedLineWidth: { + get: function() { + return ContextLimits.maximumAliasedLineWidth; + } + }, + /** + * The maximum length in pixels of one edge of a cube map, supported by this WebGL implementation. It will be at least 16. + * @memberof Scene.prototype + * + * @type {number} + * @readonly + * + * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml|glGet} with <code>GL_MAX_CUBE_MAP_TEXTURE_SIZE</code>. + */ + maximumCubeMapSize: { + get: function() { + return ContextLimits.maximumCubeMapSize; + } + }, + /** + * Returns <code>true</code> if the {@link Scene#pickPosition} function is supported. + * @memberof Scene.prototype + * + * @type {boolean} + * @readonly + * + * @see Scene#pickPosition + */ + pickPositionSupported: { + get: function() { + return this._context.depthTexture; + } + }, + /** + * Returns <code>true</code> if the {@link Scene#sampleHeight} and {@link Scene#sampleHeightMostDetailed} functions are supported. + * @memberof Scene.prototype + * + * @type {boolean} + * @readonly + * + * @see Scene#sampleHeight + * @see Scene#sampleHeightMostDetailed + */ + sampleHeightSupported: { + get: function() { + return this._context.depthTexture; + } + }, + /** + * Returns <code>true</code> if the {@link Scene#clampToHeight} and {@link Scene#clampToHeightMostDetailed} functions are supported. + * @memberof Scene.prototype + * + * @type {boolean} + * @readonly + * + * @see Scene#clampToHeight + * @see Scene#clampToHeightMostDetailed + */ + clampToHeightSupported: { + get: function() { + return this._context.depthTexture; + } + }, + /** + * Returns <code>true</code> if the {@link Scene#invertClassification} is supported. + * @memberof Scene.prototype + * + * @type {boolean} + * @readonly + * + * @see Scene#invertClassification + */ + invertClassificationSupported: { + get: function() { + return this._context.depthTexture; + } + }, + /** + * Returns <code>true</code> if specular environment maps are supported. + * @memberof Scene.prototype + * + * @type {boolean} + * @readonly + * + * @see Scene#specularEnvironmentMaps + */ + specularEnvironmentMapsSupported: { + get: function() { + return SpecularEnvironmentCubeMap.isSupported(this._context); + } + }, + /** + * The ellipsoid. If not specified, the default ellipsoid is used. + * @memberof Scene.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets or sets the depth-test ellipsoid. + * @memberof Scene.prototype + * + * @type {Globe} + */ + globe: { + get: function() { + return this._globe; + }, + set: function(e) { + this._globe = this._globe && this._globe.destroy(), this._globe = e, updateGlobeListeners(this, e); + } + }, + /** + * Gets the collection of primitives. + * @memberof Scene.prototype + * + * @type {PrimitiveCollection} + * @readonly + */ + primitives: { + get: function() { + return this._primitives; + } + }, + /** + * Gets the collection of ground primitives. + * @memberof Scene.prototype + * + * @type {PrimitiveCollection} + * @readonly + */ + groundPrimitives: { + get: function() { + return this._groundPrimitives; + } + }, + /** + * Gets or sets the camera. + * @memberof Scene.prototype + * + * @type {Camera} + * @readonly + */ + camera: { + get: function() { + return this._view.camera; + }, + set: function(e) { + this._view.camera = e; + } + }, + /** + * Gets or sets the view. + * @memberof Scene.prototype + * + * @type {View} + * @readonly + * + * @private + */ + view: { + get: function() { + return this._view; + }, + set: function(e) { + this._view = e; + } + }, + /** + * Gets the default view. + * @memberof Scene.prototype + * + * @type {View} + * @readonly + * + * @private + */ + defaultView: { + get: function() { + return this._defaultView; + } + }, + /** + * Gets picking functions and state + * @memberof Scene.prototype + * + * @type {Picking} + * @readonly + * + * @private + */ + picking: { + get: function() { + return this._picking; + } + }, + /** + * Gets the controller for camera input handling. + * @memberof Scene.prototype + * + * @type {ScreenSpaceCameraController} + * @readonly + */ + screenSpaceCameraController: { + get: function() { + return this._screenSpaceCameraController; + } + }, + /** + * Get the map projection to use in 2D and Columbus View modes. + * @memberof Scene.prototype + * + * @type {MapProjection} + * @readonly + * + * @default new GeographicProjection() + */ + mapProjection: { + get: function() { + return this._mapProjection; + } + }, + /** + * Gets the job scheduler + * @memberof Scene.prototype + * @type {JobScheduler} + * @readonly + * + * @private + */ + jobScheduler: { + get: function() { + return this._jobScheduler; + } + }, + /** + * Gets state information about the current scene. If called outside of a primitive's <code>update</code> + * function, the previous frame's state is returned. + * @memberof Scene.prototype + * + * @type {FrameState} + * @readonly + * + * @private + */ + frameState: { + get: function() { + return this._frameState; + } + }, + /** + * Gets the environment state. + * @memberof Scene.prototype + * + * @type {EnvironmentState} + * @readonly + * + * @private + */ + environmentState: { + get: function() { + return this._environmentState; + } + }, + /** + * Gets the collection of tweens taking place in the scene. + * @memberof Scene.prototype + * + * @type {TweenCollection} + * @readonly + * + * @private + */ + tweens: { + get: function() { + return this._tweens; + } + }, + /** + * Gets the collection of image layers that will be rendered on the globe. + * @memberof Scene.prototype + * + * @type {ImageryLayerCollection} + * @readonly + */ + imageryLayers: { + get: function() { + if (defined(this.globe)) + return this.globe.imageryLayers; + } + }, + /** + * The terrain provider providing surface geometry for the globe. + * @memberof Scene.prototype + * + * @type {TerrainProvider} + */ + terrainProvider: { + get: function() { + if (defined(this.globe)) + return this.globe.terrainProvider; + }, + set: function(e) { + this._removeTerrainProviderReadyListener = this._removeTerrainProviderReadyListener && this._removeTerrainProviderReadyListener(), defined(this.globe) && (this.globe.terrainProvider = e); + } + }, + /** + * Gets an event that's raised when the terrain provider is changed + * @memberof Scene.prototype + * + * @type {Event} + * @readonly + */ + terrainProviderChanged: { + get: function() { + if (defined(this.globe)) + return this.globe.terrainProviderChanged; + } + }, + /** + * Gets the event that will be raised before the scene is updated or rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + * @memberof Scene.prototype + * + * @see {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering} + * @see Scene#postUpdate + * @see Scene#preRender + * @see Scene#postRender + * + * @type {Event} + * @readonly + */ + preUpdate: { + get: function() { + return this._preUpdate; + } + }, + /** + * Gets the event that will be raised immediately after the scene is updated and before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + * @memberof Scene.prototype + * + * @see {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering} + * @see Scene#preUpdate + * @see Scene#preRender + * @see Scene#postRender + * + * @type {Event} + * @readonly + */ + postUpdate: { + get: function() { + return this._postUpdate; + } + }, + /** + * Gets the event that will be raised when an error is thrown inside the <code>render</code> function. + * The Scene instance and the thrown error are the only two parameters passed to the event handler. + * By default, errors are not rethrown after this event is raised, but that can be changed by setting + * the <code>rethrowRenderErrors</code> property. + * @memberof Scene.prototype + * + * @type {Event} + * @readonly + */ + renderError: { + get: function() { + return this._renderError; + } + }, + /** + * Gets the event that will be raised after the scene is updated and immediately before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + * @memberof Scene.prototype + * + * @see {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering} + * @see Scene#preUpdate + * @see Scene#postUpdate + * @see Scene#postRender + * + * @type {Event} + * @readonly + */ + preRender: { + get: function() { + return this._preRender; + } + }, + /** + * Gets the event that will be raised immediately after the scene is rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + * @memberof Scene.prototype + * + * @see {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering} + * @see Scene#preUpdate + * @see Scene#postUpdate + * @see Scene#postRender + * + * @type {Event} + * @readonly + */ + postRender: { + get: function() { + return this._postRender; + } + }, + /** + * Gets the simulation time when the scene was last rendered. Returns undefined if the scene has not yet been + * rendered. + * @memberof Scene.prototype + * + * @type {JulianDate} + * @readonly + */ + lastRenderTime: { + get: function() { + return this._lastRenderTime; + } + }, + /** + * @memberof Scene.prototype + * @private + * @readonly + */ + context: { + get: function() { + return this._context; + } + }, + /** + * This property is for debugging only; it is not for production use. + * <p> + * When {@link Scene.debugShowFrustums} is <code>true</code>, this contains + * properties with statistics about the number of command execute per frustum. + * <code>totalCommands</code> is the total number of commands executed, ignoring + * overlap. <code>commandsInFrustums</code> is an array with the number of times + * commands are executed redundantly, e.g., how many commands overlap two or + * three frustums. + * </p> + * + * @memberof Scene.prototype + * + * @type {object} + * @readonly + * + * @default undefined + */ + debugFrustumStatistics: { + get: function() { + return this._view.debugFrustumStatistics; + } + }, + /** + * Gets whether or not the scene is optimized for 3D only viewing. + * @memberof Scene.prototype + * @type {boolean} + * @readonly + */ + scene3DOnly: { + get: function() { + return this._frameState.scene3DOnly; + } + }, + /** + * Gets whether or not the scene has order independent translucency enabled. + * Note that this only reflects the original construction option, and there are + * other factors that could prevent OIT from functioning on a given system configuration. + * @memberof Scene.prototype + * @type {boolean} + * @readonly + */ + orderIndependentTranslucency: { + get: function() { + return this._useOIT; + } + }, + /** + * Gets the unique identifier for this scene. + * @memberof Scene.prototype + * @type {string} + * @readonly + */ + id: { + get: function() { + return this._id; + } + }, + /** + * Gets or sets the current mode of the scene. + * @memberof Scene.prototype + * @type {SceneMode} + * @default {@link SceneMode.SCENE3D} + */ + mode: { + get: function() { + return this._mode; + }, + set: function(e) { + e === SceneMode$1.SCENE2D ? this.morphTo2D(0) : e === SceneMode$1.SCENE3D ? this.morphTo3D(0) : e === SceneMode$1.COLUMBUS_VIEW && this.morphToColumbusView(0), this._mode = e; + } + }, + /** + * Gets the number of frustums used in the last frame. + * @memberof Scene.prototype + * @type {FrustumCommands[]} + * + * @private + */ + frustumCommandsList: { + get: function() { + return this._view.frustumCommandsList; + } + }, + /** + * Gets the number of frustums used in the last frame. + * @memberof Scene.prototype + * @type {number} + * + * @private + */ + numberOfFrustums: { + get: function() { + return this._view.frustumCommandsList.length; + } + }, + /** + * When <code>true</code>, splits the scene into two viewports with steroscopic views for the left and right eyes. + * Used for cardboard and WebVR. + * @memberof Scene.prototype + * @type {boolean} + * @default false + */ + useWebVR: { + get: function() { + return this._useWebVR; + }, + set: function(e) { + this._useWebVR = e, this._useWebVR ? (this._frameState.creditDisplay.container.style.visibility = "hidden", this._cameraVR = new Camera(this), defined(this._deviceOrientationCameraController) || (this._deviceOrientationCameraController = new DeviceOrientationCameraController( + this + )), this._aspectRatioVR = this.camera.frustum.aspectRatio) : (this._frameState.creditDisplay.container.style.visibility = "visible", this._cameraVR = void 0, this._deviceOrientationCameraController = this._deviceOrientationCameraController && !this._deviceOrientationCameraController.isDestroyed() && this._deviceOrientationCameraController.destroy(), this.camera.frustum.aspectRatio = this._aspectRatioVR, this.camera.frustum.xOffset = 0); + } + }, + /** + * Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @memberof Scene.prototype + * @type {MapMode2D} + * @readonly + */ + mapMode2D: { + get: function() { + return this._mapMode2D; + } + }, + /** + * Gets or sets the position of the splitter within the viewport. Valid values are between 0.0 and 1.0. + * @memberof Scene.prototype + * + * @type {number} + */ + splitPosition: { + get: function() { + return this._frameState.splitPosition; + }, + set: function(e) { + this._frameState.splitPosition = e; + } + }, + /** + * The distance from the camera at which to disable the depth test of billboards, labels and points + * to, for example, prevent clipping against terrain. When set to zero, the depth test should always + * be applied. When less than zero, the depth test should never be applied. Setting the disableDepthTestDistance + * property of a billboard, label or point will override this value. + * @memberof Scene.prototype + * @type {number} + * @default 0.0 + */ + minimumDisableDepthTestDistance: { + get: function() { + return this._minimumDisableDepthTestDistance; + }, + set: function(e) { + this._minimumDisableDepthTestDistance = e; + } + }, + /** + * Whether or not to use a logarithmic depth buffer. Enabling this option will allow for less frustums in the multi-frustum, + * increasing performance. This property relies on fragmentDepth being supported. + * @memberof Scene.prototype + * @type {boolean} + */ + logarithmicDepthBuffer: { + get: function() { + return this._logDepthBuffer; + }, + set: function(e) { + e = this._context.fragmentDepth && e, this._logDepthBuffer !== e && (this._logDepthBuffer = e, this._logDepthBufferDirty = !0); + } + }, + /** + * The value used for gamma correction. This is only used when rendering with high dynamic range. + * @memberof Scene.prototype + * @type {number} + * @default 2.2 + */ + gamma: { + get: function() { + return this._context.uniformState.gamma; + }, + set: function(e) { + this._context.uniformState.gamma = e; + } + }, + /** + * Whether or not to use high dynamic range rendering. + * @memberof Scene.prototype + * @type {boolean} + * @default false + */ + highDynamicRange: { + get: function() { + return this._hdr; + }, + set: function(e) { + const t = this._context, n = e && t.depthTexture && (t.colorBufferFloat || t.colorBufferHalfFloat); + this._hdrDirty = n !== this._hdr, this._hdr = n; + } + }, + /** + * Whether or not high dynamic range rendering is supported. + * @memberof Scene.prototype + * @type {boolean} + * @readonly + * @default true + */ + highDynamicRangeSupported: { + get: function() { + const e = this._context; + return e.depthTexture && (e.colorBufferFloat || e.colorBufferHalfFloat); + } + }, + /** + * Whether or not the camera is underneath the globe. + * @memberof Scene.prototype + * @type {boolean} + * @readonly + * @default false + */ + cameraUnderground: { + get: function() { + return this._cameraUnderground; + } + }, + /** + * The sample rate of multisample antialiasing (values greater than 1 enable MSAA). + * @memberof Scene.prototype + * @type {number} + * @default 4 + */ + msaaSamples: { + get: function() { + return this._msaaSamples; + }, + set: function(e) { + e = Math.min(e, ContextLimits.maximumSamples), this._msaaSamples = e; + } + }, + /** + * Returns <code>true</code> if the Scene's context supports MSAA. + * @memberof Scene.prototype + * @type {boolean} + * @readonly + */ + msaaSupported: { + get: function() { + return this._context.msaa; + } + }, + /** + * Ratio between a pixel and a density-independent pixel. Provides a standard unit of + * measure for real pixel measurements appropriate to a particular device. + * + * @memberof Scene.prototype + * @type {number} + * @default 1.0 + * @private + */ + pixelRatio: { + get: function() { + return this._frameState.pixelRatio; + }, + set: function(e) { + this._frameState.pixelRatio = e; + } + }, + /** + * @private + */ + opaqueFrustumNearOffset: { + get: function() { + return 0.9999; + } + }, + /** + * @private + */ + globeHeight: { + get: function() { + return this._globeHeight; + } + } +}); +Scene.prototype.getCompressedTextureFormatSupported = function(e) { + const t = this.context; + return (e === "WEBGL_compressed_texture_s3tc" || e === "s3tc") && t.s3tc || (e === "WEBGL_compressed_texture_pvrtc" || e === "pvrtc") && t.pvrtc || (e === "WEBGL_compressed_texture_etc" || e === "etc") && t.etc || (e === "WEBGL_compressed_texture_etc1" || e === "etc1") && t.etc1 || (e === "WEBGL_compressed_texture_astc" || e === "astc") && t.astc || (e === "EXT_texture_compression_bptc" || e === "bc7") && t.bc7; +}; +function updateDerivedCommands(e, t, n) { + const i = e._frameState, r = e._context, o = e._view.oit, s = i.shadowState.lightShadowMaps, c = i.shadowState.lightShadowsEnabled; + let l = t.derivedCommands; + defined(t.pickId) && (l.picking = DerivedCommand.createPickDerivedCommand( + e, + t, + r, + l.picking + )), t.pickOnly || (l.depth = DerivedCommand.createDepthOnlyDerivedCommand( + e, + t, + r, + l.depth + )), l.originalCommand = t, e._hdr && (l.hdr = DerivedCommand.createHdrCommand( + t, + r, + l.hdr + ), t = l.hdr.command, l = t.derivedCommands), c && t.receiveShadows && (l.shadows = ShadowMap.createReceiveDerivedCommand( + s, + t, + n, + r, + l.shadows + )), t.pass === Pass$1.TRANSLUCENT && defined(o) && o.isSupported() && (c && t.receiveShadows ? (l.oit = defined(l.oit) ? l.oit : {}, l.oit.shadows = o.createDerivedCommands( + l.shadows.receiveCommand, + r, + l.oit.shadows + )) : l.oit = o.createDerivedCommands( + t, + r, + l.oit + )); +} +Scene.prototype.updateDerivedCommands = function(e) { + if (!defined(e.derivedCommands)) + return; + const t = this._frameState, n = this._context; + let i = !1; + const r = t.shadowState.lastDirtyTime; + e.lastDirtyTime !== r && (e.lastDirtyTime = r, e.dirty = !0, i = !0); + const o = t.useLogDepth, s = this._hdr, c = e.derivedCommands, l = defined(c.logDepth), d = defined(c.hdr), f = defined(c.originalCommand), h = o && !l, p = s && !d, m = (!o || !s) && !f; + if (e.dirty = e.dirty || h || p || m, e.dirty) { + e.dirty = !1; + const _ = t.shadowState.shadowMaps; + t.shadowState.shadowsEnabled && e.castShadows && (c.shadows = ShadowMap.createCastDerivedCommand( + _, + e, + i, + n, + c.shadows + )), (l || h) && (c.logDepth = DerivedCommand.createLogDepthCommand( + e, + n, + c.logDepth + ), updateDerivedCommands( + this, + c.logDepth.command, + i + )), (f || m) && updateDerivedCommands(this, e, i); + } +}; +const renderTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.RENDER +}), preloadTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.PRELOAD +}), preloadFlightTilesetPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.PRELOAD_FLIGHT +}), requestRenderModeDeferCheckPassState = new Cesium3DTilePassState({ + pass: Cesium3DTilePass$1.REQUEST_RENDER_MODE_DEFER_CHECK +}), scratchOccluderBoundingSphere = new BoundingSphere(); +let scratchOccluder; +function getOccluder(e) { + const t = e.globe; + if (e._mode === SceneMode$1.SCENE3D && defined(t) && t.show && !e._cameraUnderground && !e._globeTranslucencyState.translucent) { + const n = e.ellipsoid, i = e.frameState.minimumTerrainHeight; + return scratchOccluderBoundingSphere.radius = n.minimumRadius + i, scratchOccluder = Occluder.fromBoundingSphere( + scratchOccluderBoundingSphere, + e.camera.positionWC, + scratchOccluder + ), scratchOccluder; + } +} +Scene.prototype.clearPasses = function(e) { + e.render = !1, e.pick = !1, e.pickVoxel = !1, e.depth = !1, e.postProcess = !1, e.offscreen = !1; +}; +function updateFrameNumber(e, t, n) { + const i = e._frameState; + i.frameNumber = t, i.time = JulianDate.clone(n, i.time); +} +Scene.prototype.updateFrameState = function() { + const e = this.camera, t = this._frameState; + t.commandList.length = 0, t.shadowMaps.length = 0, t.brdfLutGenerator = this._brdfLutGenerator, t.environmentMap = this.skyBox && this.skyBox._cubeMap, t.mode = this._mode, t.morphTime = this.morphTime, t.mapProjection = this.mapProjection, t.camera = e, t.cullingVolume = e.frustum.computeCullingVolume( + e.positionWC, + e.directionWC, + e.upWC + ), t.occluder = getOccluder(this), t.minimumTerrainHeight = 0, t.minimumDisableDepthTestDistance = this._minimumDisableDepthTestDistance, t.invertClassification = this.invertClassification, t.useLogDepth = this._logDepthBuffer && !(this.camera.frustum instanceof OrthographicFrustum || this.camera.frustum instanceof OrthographicOffCenterFrustum), t.light = this.light, t.cameraUnderground = this._cameraUnderground, t.globeTranslucencyState = this._globeTranslucencyState; + const { globe: n } = this; + defined(n) && n._terrainExaggerationChanged && (this.verticalExaggeration = n._terrainExaggeration, this.verticalExaggerationRelativeHeight = n._terrainExaggerationRelativeHeight, n._terrainExaggerationChanged = !1), t.verticalExaggeration = this.verticalExaggeration, t.verticalExaggerationRelativeHeight = this.verticalExaggerationRelativeHeight, defined(this._specularEnvironmentCubeMap) && this._specularEnvironmentCubeMap.ready ? (t.specularEnvironmentMaps = this._specularEnvironmentCubeMap.texture, t.specularEnvironmentMapsMaximumLOD = this._specularEnvironmentCubeMap.maximumMipmapLevel) : (t.specularEnvironmentMaps = void 0, t.specularEnvironmentMapsMaximumLOD = void 0), t.sphericalHarmonicCoefficients = this.sphericalHarmonicCoefficients, this._actualInvertClassificationColor = Color.clone( + this.invertClassificationColor, + this._actualInvertClassificationColor + ), InvertClassification.isTranslucencySupported(this._context) || (this._actualInvertClassificationColor.alpha = 1), t.invertClassificationColor = this._actualInvertClassificationColor, defined(this.globe) ? t.maximumScreenSpaceError = this.globe.maximumScreenSpaceError : t.maximumScreenSpaceError = 2, this.clearPasses(t.passes), t.tilesetPassState = void 0; +}; +Scene.prototype.isVisible = function(e, t, n) { + return defined(e) && (!defined(e.boundingVolume) || !e.cull || t.computeVisibility(e.boundingVolume) !== Intersect$1.OUTSIDE && (!defined(n) || !e.occlude || !e.boundingVolume.isOccluded(n))); +}; +let transformFrom2D = new Matrix4( + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 +); +transformFrom2D = Matrix4.inverseTransformation( + transformFrom2D, + transformFrom2D +); +function debugShowBoundingVolume(e, t, n, i) { + const r = t._frameState, o = r.context, s = e.boundingVolume; + defined(t._debugVolume) && t._debugVolume.destroy(); + let c, l = Cartesian3.clone(s.center); + if (r.mode !== SceneMode$1.SCENE3D) { + l = Matrix4.multiplyByPoint(transformFrom2D, l, l); + const p = r.mapProjection, m = p.unproject(l); + l = p.ellipsoid.cartographicToCartesian(m); + } + if (defined(s.radius)) { + const p = s.radius; + c = GeometryPipeline.toWireframe( + EllipsoidGeometry.createGeometry( + new EllipsoidGeometry({ + radii: new Cartesian3(p, p, p), + vertexFormat: PerInstanceColorAppearance.FLAT_VERTEX_FORMAT + }) + ) + ), t._debugVolume = new Primitive$3({ + geometryInstances: new GeometryInstance({ + geometry: c, + modelMatrix: Matrix4.fromTranslation(l), + attributes: { + color: new ColorGeometryInstanceAttribute(1, 0, 0, 1) + } + }), + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: !1 + }), + asynchronous: !1 + }); + } else { + const p = s.halfAxes; + c = GeometryPipeline.toWireframe( + BoxGeometry.createGeometry( + BoxGeometry.fromDimensions({ + dimensions: new Cartesian3(2, 2, 2), + vertexFormat: PerInstanceColorAppearance.FLAT_VERTEX_FORMAT + }) + ) + ), t._debugVolume = new Primitive$3({ + geometryInstances: new GeometryInstance({ + geometry: c, + modelMatrix: Matrix4.fromRotationTranslation( + p, + l, + new Matrix4() + ), + attributes: { + color: new ColorGeometryInstanceAttribute(1, 0, 0, 1) + } + }), + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: !1 + }), + asynchronous: !1 + }); + } + const d = r.commandList, f = r.commandList = []; + t._debugVolume.update(r), e = f[0], r.useLogDepth && (e = DerivedCommand.createLogDepthCommand(e, o).command); + let h; + defined(i) && (h = n.framebuffer, n.framebuffer = i), e.execute(o, n), defined(h) && (n.framebuffer = h), r.commandList = d; +} +function executeCommand(e, t, n, i, r) { + const o = t._frameState; + if (defined(t.debugCommandFilter) && !t.debugCommandFilter(e)) + return; + if (e instanceof ClearCommand) { + e.execute(n, i); + return; + } + e.debugShowBoundingVolume && defined(e.boundingVolume) && debugShowBoundingVolume(e, t, i, r), o.useLogDepth && defined(e.derivedCommands.logDepth) && (e = e.derivedCommands.logDepth.command); + const s = o.passes; + if (!s.pick && !s.pickVoxel && !s.depth && t._hdr && defined(e.derivedCommands) && defined(e.derivedCommands.hdr) && (e = e.derivedCommands.hdr.command), s.pick || s.depth) { + if (s.pick && !s.depth && defined(e.derivedCommands.picking)) { + e = e.derivedCommands.picking.pickCommand, e.execute(n, i); + return; + } else if (defined(e.derivedCommands.depth)) { + e = e.derivedCommands.depth.depthOnlyCommand, e.execute(n, i); + return; + } + } + if (t.debugShowCommands || t.debugShowFrustums) { + t._debugInspector.executeDebugShowFrustumsCommand( + t, + e, + i + ); + return; + } + o.shadowState.lightShadowsEnabled && e.receiveShadows && defined(e.derivedCommands.shadows) ? e.derivedCommands.shadows.receiveCommand.execute(n, i) : e.execute(n, i); +} +function executeIdCommand(e, t, n, i) { + const r = t._frameState; + let o = e.derivedCommands; + defined(o) && (r.useLogDepth && defined(o.logDepth) && (e = o.logDepth.command), o = e.derivedCommands, defined(o.picking) ? (e = o.picking.pickCommand, e.execute(n, i)) : defined(o.depth) && (e = o.depth.depthOnlyCommand, e.execute(n, i))); +} +function backToFront(e, t, n) { + return t.boundingVolume.distanceSquaredTo(n) - e.boundingVolume.distanceSquaredTo(n); +} +function frontToBack(e, t, n) { + return e.boundingVolume.distanceSquaredTo(n) - t.boundingVolume.distanceSquaredTo(n) + CesiumMath.EPSILON12; +} +function executeTranslucentCommandsBackToFront(e, t, n, i, r) { + const o = e.context; + mergeSort(i, backToFront, e.camera.positionWC), defined(r) && t( + r.unclassifiedCommand, + e, + o, + n + ); + const s = i.length; + for (let c = 0; c < s; ++c) + t(i[c], e, o, n); +} +function executeTranslucentCommandsFrontToBack(e, t, n, i, r) { + const o = e.context; + mergeSort(i, frontToBack, e.camera.positionWC), defined(r) && t( + r.unclassifiedCommand, + e, + o, + n + ); + const s = i.length; + for (let c = 0; c < s; ++c) + t(i[c], e, o, n); +} +function executeVoxelCommands(e, t, n, i) { + const r = e.context; + mergeSort(i, backToFront, e.camera.positionWC); + const o = i.length; + for (let s = 0; s < o; ++s) + t(i[s], e, r, n); +} +const scratchPerspectiveFrustum = new PerspectiveFrustum(), scratchPerspectiveOffCenterFrustum = new PerspectiveOffCenterFrustum(), scratchOrthographicFrustum = new OrthographicFrustum(), scratchOrthographicOffCenterFrustum = new OrthographicOffCenterFrustum(); +function executeCommands(e, t) { + const { camera: n, context: i, frameState: r } = e, { uniformState: o } = i; + o.updateCamera(n); + let s; + defined(n.frustum.fov) ? s = n.frustum.clone(scratchPerspectiveFrustum) : defined(n.frustum.infiniteProjectionMatrix) ? s = n.frustum.clone(scratchPerspectiveOffCenterFrustum) : defined(n.frustum.width) ? s = n.frustum.clone(scratchOrthographicFrustum) : s = n.frustum.clone(scratchOrthographicOffCenterFrustum), s.near = n.frustum.near, s.far = n.frustum.far, o.updateFrustum(s), o.updatePass(Pass$1.ENVIRONMENT); + const c = r.passes, l = c.pick || c.pickVoxel, d = e._environmentState, f = e._view, h = d.renderTranslucentDepthForPick, p = d.useWebVR; + if (!l) { + const L = d.skyBoxCommand; + if (defined(L) && executeCommand(L, e, i, t), d.isSkyAtmosphereVisible && executeCommand( + d.skyAtmosphereCommand, + e, + i, + t + ), d.isSunVisible && (d.sunDrawCommand.execute(i, t), e.sunBloom && !p)) { + let g; + d.useGlobeDepthFramebuffer ? g = f.globeDepth.framebuffer : d.usePostProcess ? g = f.sceneFramebuffer.framebuffer : g = d.originalFramebuffer, e._sunPostProcess.execute(i), e._sunPostProcess.copy(i, g), t.framebuffer = g; + } + d.isMoonVisible && d.moonCommand.execute(i, t); + } + let m; + d.useOIT ? (defined(e._executeOITFunction) || (e._executeOITFunction = function(L, g, w, O, N) { + f.globeDepth.prepareColorTextures(i), f.oit.executeCommands( + L, + g, + w, + O, + N + ); + }), m = e._executeOITFunction) : c.render ? m = executeTranslucentCommandsBackToFront : m = executeTranslucentCommandsFrontToBack; + const _ = f.frustumCommandsList, y = _.length, C = d.clearGlobeDepth, T = d.useDepthPlane, x = e._globeTranslucencyState, b = x.translucent, S = e._view.globeTranslucencyFramebuffer, E = e._depthClearCommand, A = e._stencilClearCommand, D = e._classificationStencilClearCommand, P = e._depthPlane, I = d.usePostProcessSelected, M = n.position.z; + let R; + for (let L = 0; L < y; ++L) { + const g = y - L - 1, w = _[g]; + e.mode === SceneMode$1.SCENE2D ? (n.position.z = M - w.near + 1, s.far = Math.max(1, w.far - w.near), s.near = 1, o.update(r), o.updateFrustum(s)) : (s.near = g !== 0 ? w.near * e.opaqueFrustumNearOffset : w.near, s.far = w.far, o.updateFrustum(s)), E.execute(i, t), i.stencilBuffer && A.execute(i, t), o.updatePass(Pass$1.GLOBE); + let O = w.commands[Pass$1.GLOBE], N = w.indices[Pass$1.GLOBE]; + if (b) + x.executeGlobeCommands( + w, + executeCommand, + S, + e, + t + ); + else + for (R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + const F = f.globeDepth; + if (defined(F) && d.useGlobeDepthFramebuffer && F.executeCopyDepth(i, t), !d.renderTranslucentDepthForPick) + if (o.updatePass(Pass$1.TERRAIN_CLASSIFICATION), O = w.commands[Pass$1.TERRAIN_CLASSIFICATION], N = w.indices[Pass$1.TERRAIN_CLASSIFICATION], b) + x.executeGlobeClassificationCommands( + w, + executeCommand, + S, + e, + t + ); + else + for (R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + if (C && (E.execute(i, t), T && P.execute(i, t)), !d.useInvertClassification || l || d.renderTranslucentDepthForPick) { + for (o.updatePass(Pass$1.CESIUM_3D_TILE), O = w.commands[Pass$1.CESIUM_3D_TILE], N = w.indices[Pass$1.CESIUM_3D_TILE], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + if (N > 0 && (defined(F) && d.useGlobeDepthFramebuffer && (F.prepareColorTextures(i, C), F.executeUpdateDepth( + i, + t, + C, + F.depthStencilTexture + )), !d.renderTranslucentDepthForPick)) + for (o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION), O = w.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION], N = w.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + } else { + e._invertClassification.clear(i, t); + const k = t.framebuffer; + for (t.framebuffer = e._invertClassification._fbo.framebuffer, o.updatePass(Pass$1.CESIUM_3D_TILE), O = w.commands[Pass$1.CESIUM_3D_TILE], N = w.indices[Pass$1.CESIUM_3D_TILE], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + for (defined(F) && d.useGlobeDepthFramebuffer && (e._invertClassification.prepareTextures(i), F.executeUpdateDepth( + i, + t, + C, + e._invertClassification._fbo.getDepthStencilTexture() + )), o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW), O = w.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW], N = w.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + for (t.framebuffer = k, e._invertClassification.executeClassified(i, t), r.invertClassificationColor.alpha === 1 && e._invertClassification.executeUnclassified(i, t), N > 0 && i.stencilBuffer && D.execute(i, t), o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION), O = w.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION], N = w.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + } + for (N > 0 && i.stencilBuffer && A.execute(i, t), o.updatePass(Pass$1.VOXELS), O = w.commands[Pass$1.VOXELS], N = w.indices[Pass$1.VOXELS], O.length = N, executeVoxelCommands(e, executeCommand, t, O), o.updatePass(Pass$1.OPAQUE), O = w.commands[Pass$1.OPAQUE], N = w.indices[Pass$1.OPAQUE], R = 0; R < N; ++R) + executeCommand(O[R], e, i, t); + g !== 0 && e.mode !== SceneMode$1.SCENE2D && (s.near = w.near, o.updateFrustum(s)); + let B; + if (!l && d.useInvertClassification && r.invertClassificationColor.alpha < 1 && (B = e._invertClassification), o.updatePass(Pass$1.TRANSLUCENT), O = w.commands[Pass$1.TRANSLUCENT], O.length = w.indices[Pass$1.TRANSLUCENT], m( + e, + executeCommand, + t, + O, + B + ), w.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION] > 0 && f.translucentTileClassification.isSupported() && (f.translucentTileClassification.executeTranslucentCommands( + e, + executeCommand, + t, + O, + F.depthStencilTexture + ), f.translucentTileClassification.executeClassificationCommands( + e, + executeCommand, + t, + w + )), i.depthTexture && e.useDepthPicking && (d.useGlobeDepthFramebuffer || h)) { + const k = F.depthStencilTexture, $ = e._picking.getPickDepth(e, g); + $.update(i, k), $.executeCopyDepth(i, t); + } + if (l || !I) + continue; + const U = t.framebuffer; + if (t.framebuffer = f.sceneFramebuffer.getIdFramebuffer(), s.near = g !== 0 ? w.near * e.opaqueFrustumNearOffset : w.near, s.far = w.far, o.updateFrustum(s), o.updatePass(Pass$1.GLOBE), O = w.commands[Pass$1.GLOBE], N = w.indices[Pass$1.GLOBE], b) + x.executeGlobeCommands( + w, + executeIdCommand, + S, + e, + t + ); + else + for (R = 0; R < N; ++R) + executeIdCommand(O[R], e, i, t); + for (C && (E.framebuffer = t.framebuffer, E.execute(i, t), E.framebuffer = void 0), C && T && P.execute(i, t), o.updatePass(Pass$1.CESIUM_3D_TILE), O = w.commands[Pass$1.CESIUM_3D_TILE], N = w.indices[Pass$1.CESIUM_3D_TILE], R = 0; R < N; ++R) + executeIdCommand(O[R], e, i, t); + for (o.updatePass(Pass$1.OPAQUE), O = w.commands[Pass$1.OPAQUE], N = w.indices[Pass$1.OPAQUE], R = 0; R < N; ++R) + executeIdCommand(O[R], e, i, t); + for (o.updatePass(Pass$1.TRANSLUCENT), O = w.commands[Pass$1.TRANSLUCENT], N = w.indices[Pass$1.TRANSLUCENT], R = 0; R < N; ++R) + executeIdCommand(O[R], e, i, t); + t.framebuffer = U; + } +} +function executeComputeCommands(e) { + e.context.uniformState.updatePass(Pass$1.COMPUTE); + const n = e._environmentState.sunComputeCommand; + defined(n) && n.execute(e._computeEngine); + const i = e._computeCommandList, r = i.length; + for (let o = 0; o < r; ++o) + i[o].execute(e._computeEngine); +} +function executeOverlayCommands(e, t) { + e.context.uniformState.updatePass(Pass$1.OVERLAY); + const i = e.context, r = e._overlayCommandList, o = r.length; + for (let s = 0; s < o; ++s) + r[s].execute(i, t); +} +function insertShadowCastCommands(e, t, n) { + const i = n.shadowMapCullingVolume, r = n.isPointLight, o = n.passes, s = o.length, c = t.length; + for (let l = 0; l < c; ++l) { + const d = t[l]; + if (e.updateDerivedCommands(d), d.castShadows && (d.pass === Pass$1.GLOBE || d.pass === Pass$1.CESIUM_3D_TILE || d.pass === Pass$1.OPAQUE || d.pass === Pass$1.TRANSLUCENT) && e.isVisible(d, i)) + if (r) + for (let f = 0; f < s; ++f) + o[f].commandList.push(d); + else if (s === 1) + o[0].commandList.push(d); + else { + let f = !1; + for (let h = s - 1; h >= 0; --h) { + const p = o[h].cullingVolume; + if (e.isVisible(d, p)) + o[h].commandList.push(d), f = !0; + else if (f) + break; + } + } + } +} +function executeShadowMapCastCommands(e) { + const t = e.frameState, n = t.shadowState.shadowMaps, i = n.length; + if (!t.shadowState.shadowsEnabled) + return; + const r = e.context, o = r.uniformState; + for (let s = 0; s < i; ++s) { + const c = n[s]; + if (c.outOfView) + continue; + const l = c.passes, d = l.length; + for (let h = 0; h < d; ++h) + l[h].commandList.length = 0; + const f = e.frameState.commandList; + insertShadowCastCommands(e, f, c); + for (let h = 0; h < d; ++h) { + const p = c.passes[h]; + o.updateCamera(p.camera), c.updatePass(r, h); + const m = p.commandList.length; + for (let _ = 0; _ < m; ++_) { + const y = p.commandList[_]; + o.updatePass(y.pass), executeCommand( + y.derivedCommands.shadows.castCommands[s], + e, + r, + p.passState + ); + } + } + } +} +const scratchEyeTranslation = new Cartesian3(); +Scene.prototype.updateAndExecuteCommands = function(e, t) { + const i = this._frameState.mode; + this._environmentState.useWebVR ? executeWebVRCommands(this, e, t) : i !== SceneMode$1.SCENE2D || this._mapMode2D === MapMode2D$1.ROTATE ? executeCommandsInViewport(!0, this, e, t) : (updateAndClearFramebuffers(this, e, t), execute2DViewportCommands(this, e)); +}; +function executeWebVRCommands(e, t, n) { + const i = e._view, r = i.camera, s = e._environmentState.renderTranslucentDepthForPick; + updateAndClearFramebuffers(e, t, n), updateAndRenderPrimitives(e), i.createPotentiallyVisibleSet(e), executeComputeCommands(e), s || executeShadowMapCastCommands(e); + const c = t.viewport; + c.x = 0, c.y = 0, c.width = c.width * 0.5; + const l = Camera.clone(r, e._cameraVR); + l.frustum = r.frustum; + const d = r.frustum.near, f = d * defaultValue(e.focalLength, 5), h = defaultValue(e.eyeSeparation, f / 30), p = Cartesian3.multiplyByScalar( + l.right, + h * 0.5, + scratchEyeTranslation + ); + r.frustum.aspectRatio = c.width / c.height; + const m = 0.5 * h * d / f; + Cartesian3.add(l.position, p, r.position), r.frustum.xOffset = m, executeCommands(e, t), c.x = c.width, Cartesian3.subtract(l.position, p, r.position), r.frustum.xOffset = -m, executeCommands(e, t), Camera.clone(l, r); +} +const scratch2DViewportCartographic = new Cartographic( + Math.PI, + CesiumMath.PI_OVER_TWO +), scratch2DViewportMaxCoord = new Cartesian3(), scratch2DViewportSavedPosition = new Cartesian3(), scratch2DViewportTransform = new Matrix4(), scratch2DViewportCameraTransform = new Matrix4(), scratch2DViewportEyePoint = new Cartesian3(), scratch2DViewportWindowCoords = new Cartesian3(), scratch2DViewport = new BoundingRectangle(); +function execute2DViewportCommands(e, t) { + const n = e.context, i = e.frameState, r = e.camera, o = t.viewport, s = BoundingRectangle.clone(o, scratch2DViewport); + t.viewport = s; + const c = scratch2DViewportCartographic, l = scratch2DViewportMaxCoord; + e.mapProjection.project(c, l); + const f = Cartesian3.clone( + r.position, + scratch2DViewportSavedPosition + ), h = Matrix4.clone( + r.transform, + scratch2DViewportCameraTransform + ), p = r.frustum.clone(); + r._setTransform(Matrix4.IDENTITY); + const m = Matrix4.computeViewportTransformation( + s, + 0, + 1, + scratch2DViewportTransform + ), _ = r.frustum.projectionMatrix, y = r.positionWC.y, C = Cartesian3.fromElements( + CesiumMath.sign(y) * l.x - y, + 0, + -r.positionWC.x, + scratch2DViewportEyePoint + ), T = Transforms.pointToGLWindowCoordinates( + _, + m, + C, + scratch2DViewportWindowCoords + ); + T.x = Math.floor(T.x); + const x = s.x, b = s.width; + if (y === 0 || T.x <= x || T.x >= x + b) + executeCommandsInViewport(!0, e, t); + else if (Math.abs(x + b * 0.5 - T.x) < 1) + s.width = T.x - s.x, r.position.x *= CesiumMath.sign(r.position.x), r.frustum.right = 0, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!0, e, t), s.x = T.x, r.position.x = -r.position.x, r.frustum.right = -r.frustum.left, r.frustum.left = 0, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!1, e, t); + else if (T.x > x + b * 0.5) { + s.width = T.x - x; + const S = r.frustum.right; + r.frustum.right = l.x - y, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!0, e, t), s.x = T.x, s.width = x + b - T.x, r.position.x = -r.position.x, r.frustum.left = -r.frustum.right, r.frustum.right = S - r.frustum.right * 2, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!1, e, t); + } else { + s.x = T.x, s.width = x + b - T.x; + const S = r.frustum.left; + r.frustum.left = -l.x - y, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!0, e, t), s.x = x, s.width = T.x - x, r.position.x = -r.position.x, r.frustum.right = -r.frustum.left, r.frustum.left = S - r.frustum.left * 2, i.cullingVolume = r.frustum.computeCullingVolume( + r.positionWC, + r.directionWC, + r.upWC + ), n.uniformState.update(i), executeCommandsInViewport(!1, e, t); + } + r._setTransform(h), Cartesian3.clone(f, r.position), r.frustum = p.clone(), t.viewport = o; +} +function executeCommandsInViewport(e, t, n, i) { + const r = t._environmentState, o = t._view, s = r.renderTranslucentDepthForPick; + e || (t.frameState.commandList.length = 0), updateAndRenderPrimitives(t), o.createPotentiallyVisibleSet(t), e && (defined(i) && updateAndClearFramebuffers(t, n, i), executeComputeCommands(t), s || executeShadowMapCastCommands(t)), executeCommands(t, n); +} +const scratchCullingVolume = new CullingVolume(); +Scene.prototype.updateEnvironment = function() { + const e = this._frameState, t = this._view, n = this._environmentState, i = e.passes.render, r = e.passes.offscreen, o = this.atmosphere, s = this.skyAtmosphere, c = this.globe, l = this._globeTranslucencyState; + if (!i || this._mode !== SceneMode$1.SCENE2D && t.camera.frustum instanceof OrthographicFrustum || !l.environmentVisible) + n.skyAtmosphereCommand = void 0, n.skyBoxCommand = void 0, n.sunDrawCommand = void 0, n.sunComputeCommand = void 0, n.moonCommand = void 0; + else { + if (defined(s)) { + if (defined(c)) + s.setDynamicLighting( + DynamicAtmosphereLightingType$1.fromGlobeFlags(c) + ), n.isReadyForAtmosphere = n.isReadyForAtmosphere || !c.show || c._surface._tilesToRender.length > 0; + else { + const T = o.dynamicLighting; + s.setDynamicLighting(T), n.isReadyForAtmosphere = !0; + } + n.skyAtmosphereCommand = s.update( + e, + c + ), defined(n.skyAtmosphereCommand) && this.updateDerivedCommands(n.skyAtmosphereCommand); + } else + n.skyAtmosphereCommand = void 0; + n.skyBoxCommand = defined(this.skyBox) ? this.skyBox.update(e, this._hdr) : void 0; + const C = defined(this.sun) ? this.sun.update(e, t.passState, this._hdr) : void 0; + n.sunDrawCommand = defined(C) ? C.drawCommand : void 0, n.sunComputeCommand = defined(C) ? C.computeCommand : void 0, n.moonCommand = defined(this.moon) ? this.moon.update(e) : void 0; + } + const d = n.clearGlobeDepth = defined(c) && c.show && (!c.depthTestAgainstTerrain || this.mode === SceneMode$1.SCENE2D); + (n.useDepthPlane = d && this.mode === SceneMode$1.SCENE3D && l.useDepthPlane) && this._depthPlane.update(e), n.renderTranslucentDepthForPick = !1, n.useWebVR = this._useWebVR && this.mode !== SceneMode$1.SCENE2D && !r; + const h = e.mode === SceneMode$1.SCENE3D && !l.sunVisibleThroughGlobe ? e.occluder : void 0; + let p = e.cullingVolume; + const m = scratchCullingVolume.planes; + for (let C = 0; C < 5; ++C) + m[C] = p.planes[C]; + p = scratchCullingVolume, n.isSkyAtmosphereVisible = defined(n.skyAtmosphereCommand) && n.isReadyForAtmosphere, n.isSunVisible = this.isVisible( + n.sunDrawCommand, + p, + h + ), n.isMoonVisible = this.isVisible( + n.moonCommand, + p, + h + ); + const _ = this.specularEnvironmentMaps; + let y = this._specularEnvironmentCubeMap; + defined(_) && (y == null ? void 0 : y.url) !== _ ? (y = y && y.destroy(), this._specularEnvironmentCubeMap = new SpecularEnvironmentCubeMap(_)) : !defined(_) && defined(y) && (y.destroy(), this._specularEnvironmentCubeMap = void 0), defined(this._specularEnvironmentCubeMap) && this._specularEnvironmentCubeMap.update(e); +}; +function updateDebugFrustumPlanes(e) { + const t = e._frameState; + e.debugShowFrustumPlanes !== e._debugShowFrustumPlanes && (e.debugShowFrustumPlanes ? e._debugFrustumPlanes = new DebugCameraPrimitive({ + camera: e.camera, + updateOnChange: !1, + frustumSplits: t.frustumSplits + }) : e._debugFrustumPlanes = e._debugFrustumPlanes && e._debugFrustumPlanes.destroy(), e._debugShowFrustumPlanes = e.debugShowFrustumPlanes), defined(e._debugFrustumPlanes) && e._debugFrustumPlanes.update(t); +} +function updateShadowMaps(e) { + const t = e._frameState, n = t.shadowMaps, i = n.length, r = i > 0 && !t.passes.pick && !t.passes.pickVoxel && e.mode === SceneMode$1.SCENE3D; + if (r !== t.shadowState.shadowsEnabled && (++t.shadowState.lastDirtyTime, t.shadowState.shadowsEnabled = r), t.shadowState.lightShadowsEnabled = !1, !!r) { + for (let o = 0; o < i; ++o) + if (n[o] !== t.shadowState.shadowMaps[o]) { + ++t.shadowState.lastDirtyTime; + break; + } + t.shadowState.shadowMaps.length = 0, t.shadowState.lightShadowMaps.length = 0; + for (let o = 0; o < i; ++o) { + const s = n[o]; + s.update(t), t.shadowState.shadowMaps.push(s), s.fromLightSource && (t.shadowState.lightShadowMaps.push(s), t.shadowState.lightShadowsEnabled = !0), s.dirty && (++t.shadowState.lastDirtyTime, s.dirty = !1); + } + } +} +function updateAndRenderPrimitives(e) { + const t = e._frameState; + e._groundPrimitives.update(t), e._primitives.update(t), updateDebugFrustumPlanes(e), updateShadowMaps(e), e._globe && e._globe.render(t); +} +function updateAndClearFramebuffers(e, t, n) { + const i = e._context, r = e._frameState, o = e._environmentState, s = e._view, c = e._frameState.passes, l = c.pick || c.pickVoxel; + defined(s.globeDepth) && (s.globeDepth.picking = l); + const d = o.useWebVR; + o.originalFramebuffer = t.framebuffer, defined(e.sun) && e.sunBloom !== e._sunBloom ? (e.sunBloom && !d ? e._sunPostProcess = new SunPostProcess() : defined(e._sunPostProcess) && (e._sunPostProcess = e._sunPostProcess.destroy()), e._sunBloom = e.sunBloom) : !defined(e.sun) && defined(e._sunPostProcess) && (e._sunPostProcess = e._sunPostProcess.destroy(), e._sunBloom = !1); + const f = e._clearColorCommand; + Color.clone(n, f.color), f.execute(i, t); + const h = o.useGlobeDepthFramebuffer = defined( + s.globeDepth + ); + h && (s.globeDepth.update( + i, + t, + s.viewport, + e.msaaSamples, + e._hdr, + o.clearGlobeDepth + ), s.globeDepth.clear(i, t, n)); + const p = s.oit, m = o.useOIT = !l && defined(p) && p.isSupported(); + m && (p.update( + i, + t, + s.globeDepth.colorFramebufferManager, + e._hdr, + e.msaaSamples + ), p.clear(i, t, n), o.useOIT = p.isSupported()); + const _ = e.postProcessStages; + let y = o.usePostProcess = !l && (e._hdr || _.length > 0 || _.ambientOcclusion.enabled || _.fxaa.enabled || _.bloom.enabled); + if (o.usePostProcessSelected = !1, y && (s.sceneFramebuffer.update( + i, + s.viewport, + e._hdr, + e.msaaSamples + ), s.sceneFramebuffer.clear(i, t, n), _.update(i, r.useLogDepth, e._hdr), _.clear(i), y = o.usePostProcess = _.ready, o.usePostProcessSelected = y && _.hasSelected), o.isSunVisible && e.sunBloom && !d ? (t.framebuffer = e._sunPostProcess.update(t), e._sunPostProcess.clear(i, t, n)) : h ? t.framebuffer = s.globeDepth.framebuffer : y && (t.framebuffer = s.sceneFramebuffer.framebuffer), defined(t.framebuffer) && f.execute(i, t), o.useInvertClassification = !l && defined(t.framebuffer) && e.invertClassification) { + let T; + if (e.frameState.invertClassificationColor.alpha === 1 && o.useGlobeDepthFramebuffer && (T = s.globeDepth.framebuffer), defined(T) || i.depthTexture) { + if (e._invertClassification.previousFramebuffer = T, e._invertClassification.update( + i, + e.msaaSamples, + s.globeDepth.colorFramebufferManager + ), e._invertClassification.clear(i, t), e.frameState.invertClassificationColor.alpha < 1 && m) { + const x = e._invertClassification.unclassifiedCommand, b = x.derivedCommands; + b.oit = p.createDerivedCommands( + x, + i, + b.oit + ); + } + } else + o.useInvertClassification = !1; + } + e._globeTranslucencyState.translucent && s.globeTranslucencyFramebuffer.updateAndClear( + e._hdr, + s.viewport, + i, + t + ); +} +Scene.prototype.resolveFramebuffers = function(e) { + const t = this._context, n = this._environmentState, i = this._view, r = i.globeDepth; + defined(r) && r.prepareColorTextures(t); + const o = n.useOIT, s = n.useGlobeDepthFramebuffer, c = n.usePostProcess, l = n.originalFramebuffer, d = s ? r.colorFramebufferManager : void 0, f = i.sceneFramebuffer._colorFramebuffer, h = i.sceneFramebuffer.idFramebuffer; + o && (e.framebuffer = c ? f.framebuffer : l, i.oit.execute(t, e)); + const p = i.translucentTileClassification; + if (p.hasTranslucentDepth && p.isSupported() && p.execute(this, e), c) { + i.sceneFramebuffer.prepareColorTextures(t); + let m = f; + s && !o && (m = d); + const _ = this.postProcessStages, y = m.getColorTexture(0), C = h.getColorTexture(0), T = defaultValue( + d, + f + ).getDepthStencilTexture(); + _.execute(t, y, T, C), _.copy(t, l); + } + !o && !c && s && (e.framebuffer = l, r.executeCopyColor(t, e)); +}; +function callAfterRenderFunctions(e) { + const t = e._frameState.afterRender; + for (let n = 0, i = t.length; n < i; ++n) + t[n]() && e.requestRender(); + t.length = 0; +} +function getGlobeHeight(e) { + if (e.mode === SceneMode$1.MORPHING) + return; + const n = e.camera.positionCartographic; + return e.getHeight(n); +} +Scene.prototype.getHeight = function(e, t) { + if (!defined(e)) + return; + const n = t === HeightReference$1.CLAMP_TO_TERRAIN || t === HeightReference$1.RELATIVE_TO_TERRAIN, i = t === HeightReference$1.CLAMP_TO_3D_TILE || t === HeightReference$1.RELATIVE_TO_3D_TILE; + if (!defined(e)) + return; + let r = Number.NEGATIVE_INFINITY; + if (!n) { + const s = this.primitives.length; + for (let c = 0; c < s; ++c) { + const l = this.primitives.get(c); + if (!l.isCesium3DTileset || !l.show || !l.enableCollision) + continue; + const d = l.getHeight(e, this); + defined(d) && d > r && (r = d); + } + } + const o = this._globe; + if (!i && defined(o) && o.show) { + const s = o.getHeight(e); + s > r && (r = s); + } + if (r > Number.NEGATIVE_INFINITY) + return r; +}; +const updateHeightScratchCartographic = new Cartographic(); +Scene.prototype.updateHeight = function(e, t, n) { + let i = -1, r = !1; + const o = () => { + if (r || this.frameState.frameNumber <= i) + return; + i = this.frameState.frameNumber, Cartographic.clone(e, updateHeightScratchCartographic); + const y = this.getHeight(e, n); + defined(y) && (updateHeightScratchCartographic.height = y, t(updateHeightScratchCartographic)); + }, s = n === HeightReference$1.CLAMP_TO_TERRAIN || n === HeightReference$1.RELATIVE_TO_TERRAIN, c = n === HeightReference$1.CLAMP_TO_3D_TILE || n === HeightReference$1.RELATIVE_TO_3D_TILE; + let l; + !c && defined(this.globe) && (l = this.globe._surface.updateHeight( + e, + o + )); + let d = {}; + const f = this._ellipsoid, h = (y) => { + if (s || y.isDestroyed() || !y.isCesium3DTileset) + return; + const C = y.updateHeight( + e, + o, + f + ); + d[y.id] = C; + }; + if (!s) { + const y = this.primitives.length; + for (let C = 0; C < y; ++C) { + const T = this.primitives.get(C); + h(T); + } + } + const p = this.primitives.primitiveAdded.addEventListener( + h + ), m = this.primitives.primitiveRemoved.addEventListener( + (y) => { + y.isDestroyed() || !y.isCesium3DTileset || (defined(d[y.id]) && d[y.id](), delete d[y.id]); + } + ); + return () => { + l = l && l(), Object.values(d).forEach( + (y) => y() + ), d = {}, p(), m(), r = !0; + }; +}; +function isCameraUnderground(e) { + const t = e.camera, n = e._mode, i = e._screenSpaceCameraController, r = t.positionCartographic; + if (!defined(r)) + return !1; + if (!i.onMap() && r.height < 0) + return !0; + if (n === SceneMode$1.SCENE2D || n === SceneMode$1.MORPHING) + return !1; + const o = e._globeHeight; + return defined(o) && r.height < o; +} +Scene.prototype.initializeFrame = function() { + if (this._shaderFrameCount++ === 120 && (this._shaderFrameCount = 0, this._context.shaderCache.destroyReleasedShaderPrograms(), this._context.textureCache.destroyReleasedTextures()), this._tweens.update(), this._globeHeightDirty) { + defined(this._removeUpdateHeightCallback) && (this._removeUpdateHeightCallback(), this._removeUpdateHeightCallback = void 0), this._globeHeight = getGlobeHeight(this), this._globeHeightDirty = !1; + const e = this.camera.positionCartographic; + this._removeUpdateHeightCallback = this.updateHeight( + e, + (t) => { + this.isDestroyed() || (this._globeHeight = t.height); + } + ); + } + this._cameraUnderground = isCameraUnderground(this), this._globeTranslucencyState.update(this), this._screenSpaceCameraController.update(), defined(this._deviceOrientationCameraController) && this._deviceOrientationCameraController.update(), this.camera.update(this._mode), this.camera._updateCameraChanged(); +}; +function updateDebugShowFramesPerSecond(e, t) { + if (e.debugShowFramesPerSecond) { + if (!defined(e._performanceDisplay)) { + const n = document.createElement("div"); + n.className = "cesium-performanceDisplay-defaultContainer", e._canvas.parentNode.appendChild(n); + const r = new PerformanceDisplay({ + container: n + }); + e._performanceDisplay = r, e._performanceContainer = n; + } + e._performanceDisplay.throttled = e.requestRenderMode, e._performanceDisplay.update(t); + } else defined(e._performanceDisplay) && (e._performanceDisplay = e._performanceDisplay && e._performanceDisplay.destroy(), e._performanceContainer.parentNode.removeChild( + e._performanceContainer + )); +} +function prePassesUpdate(e) { + e._jobScheduler.resetBudgets(); + const t = e._frameState; + e.primitives.prePassesUpdate(t), defined(e.globe) && e.globe.update(t), e._picking.update(), t.creditDisplay.update(); +} +function postPassesUpdate(e) { + const t = e._frameState; + e.primitives.postPassesUpdate(t), RequestScheduler.update(); +} +const scratchBackgroundColor = new Color(); +function render(e) { + const t = e._frameState, n = e.context, i = n.uniformState, r = e._defaultView; + e._view = r, e.updateFrameState(), t.passes.render = !0, t.passes.postProcess = e.postProcessStages.hasSelected, t.tilesetPassState = renderTilesetPassState; + let o = defaultValue(e.backgroundColor, Color.BLACK); + e._hdr && (o = Color.clone(o, scratchBackgroundColor), o.red = Math.pow(o.red, e.gamma), o.green = Math.pow(o.green, e.gamma), o.blue = Math.pow(o.blue, e.gamma)), t.backgroundColor = o, t.atmosphere = e.atmosphere, e.fog.update(t), i.update(t); + const s = e.shadowMap; + defined(s) && s.enabled && (!defined(e.light) || e.light instanceof SunLight ? Cartesian3.negate(i.sunDirectionWC, e._shadowMapCamera.direction) : Cartesian3.clone(e.light.direction, e._shadowMapCamera.direction), t.shadowMaps.push(s)), e._computeCommandList.length = 0, e._overlayCommandList.length = 0; + const c = r.viewport; + c.x = 0, c.y = 0, c.width = n.drawingBufferWidth, c.height = n.drawingBufferHeight; + const l = r.passState; + l.framebuffer = void 0, l.blendingEnabled = void 0, l.scissorTest = void 0, l.viewport = BoundingRectangle.clone(c, l.viewport), defined(e.globe) && e.globe.beginFrame(t), e.updateEnvironment(), e.updateAndExecuteCommands(l, o), e.resolveFramebuffers(l), l.framebuffer = void 0, executeOverlayCommands(e, l), defined(e.globe) && (e.globe.endFrame(t), e.globe.tilesLoaded || (e._renderRequested = !0)), n.endFrame(); +} +function tryAndCatchError(e, t) { + try { + t(e); + } catch (n) { + if (e._renderError.raiseEvent(e, n), e.rethrowRenderErrors) + throw n; + } +} +function updateMostDetailedRayPicks(e) { + return e._picking.updateMostDetailedRayPicks(e); +} +Scene.prototype.render = function(e) { + this._preUpdate.raiseEvent(this, e); + const t = this._frameState; + t.newFrame = !1, defined(e) || (e = JulianDate.now()); + const n = this._view.checkForCameraUpdates(this); + n && (this._globeHeightDirty = !0); + let i = !this.requestRenderMode || this._renderRequested || n || this._logDepthBufferDirty || this._hdrDirty || this.mode === SceneMode$1.MORPHING; + if (!i && defined(this.maximumRenderTimeChange) && defined(this._lastRenderTime)) { + const r = Math.abs( + JulianDate.secondsDifference(this._lastRenderTime, e) + ); + i = i || r > this.maximumRenderTimeChange; + } + if (i) { + this._lastRenderTime = JulianDate.clone(e, this._lastRenderTime), this._renderRequested = !1, this._logDepthBufferDirty = !1, this._hdrDirty = !1; + const r = CesiumMath.incrementWrap( + t.frameNumber, + 15e6, + 1 + ); + updateFrameNumber(this, r, e), t.newFrame = !0; + } + tryAndCatchError(this, prePassesUpdate), this.primitives.show && (tryAndCatchError(this, updateMostDetailedRayPicks), tryAndCatchError(this, updatePreloadPass), tryAndCatchError(this, updatePreloadFlightPass), i || tryAndCatchError(this, updateRequestRenderModeDeferCheckPass)), this._postUpdate.raiseEvent(this, e), i && (this._preRender.raiseEvent(this, e), t.creditDisplay.beginFrame(), tryAndCatchError(this, render)), updateDebugShowFramesPerSecond(this, i), tryAndCatchError(this, postPassesUpdate), callAfterRenderFunctions(this), i && (this._postRender.raiseEvent(this, e), t.creditDisplay.endFrame()); +}; +Scene.prototype.forceRender = function(e) { + this._renderRequested = !0, this.render(e); +}; +Scene.prototype.requestRender = function() { + this._renderRequested = !0; +}; +Scene.prototype.clampLineWidth = function(e) { + return Math.max( + ContextLimits.minimumAliasedLineWidth, + Math.min(e, ContextLimits.maximumAliasedLineWidth) + ); +}; +Scene.prototype.pick = function(e, t, n) { + return this._picking.pick(this, e, t, n); +}; +Scene.prototype.pickVoxel = function(e, t, n) { + const i = this.pick(e, t, n); + if (!defined(i)) + return; + const r = i.primitive; + if (!(r instanceof VoxelPrimitive)) + return; + const o = this._picking.pickVoxelCoordinate( + this, + e, + t, + n + ), s = 255 * o[0] + o[1], c = r._traversal.findKeyframeNode(s); + if (!defined(c)) + return; + const l = 255 * o[2] + o[3]; + return VoxelCell.fromKeyframeNode( + r, + s, + l, + c + ); +}; +Scene.prototype.pickPositionWorldCoordinates = function(e, t) { + return this._picking.pickPositionWorldCoordinates( + this, + e, + t + ); +}; +Scene.prototype.pickPosition = function(e, t) { + return this._picking.pickPosition(this, e, t); +}; +Scene.prototype.drillPick = function(e, t, n, i) { + return this._picking.drillPick(this, e, t, n, i); +}; +function updatePreloadPass(e) { + const t = e._frameState; + preloadTilesetPassState.camera = t.camera, preloadTilesetPassState.cullingVolume = t.cullingVolume, e.primitives.updateForPass(t, preloadTilesetPassState); +} +function updatePreloadFlightPass(e) { + const t = e._frameState; + if (!t.camera.canPreloadFlight()) + return; + preloadFlightTilesetPassState.camera = e.preloadFlightCamera, preloadFlightTilesetPassState.cullingVolume = e.preloadFlightCullingVolume, e.primitives.updateForPass(t, preloadFlightTilesetPassState); +} +function updateRequestRenderModeDeferCheckPass(e) { + e.primitives.updateForPass( + e._frameState, + requestRenderModeDeferCheckPassState + ); +} +Scene.prototype.pickFromRay = function(e, t, n) { + return this._picking.pickFromRay(this, e, t, n); +}; +Scene.prototype.drillPickFromRay = function(e, t, n, i) { + return this._picking.drillPickFromRay( + this, + e, + t, + n, + i + ); +}; +Scene.prototype.pickFromRayMostDetailed = function(e, t, n) { + return this._picking.pickFromRayMostDetailed( + this, + e, + t, + n + ); +}; +Scene.prototype.drillPickFromRayMostDetailed = function(e, t, n, i) { + return this._picking.drillPickFromRayMostDetailed( + this, + e, + t, + n, + i + ); +}; +Scene.prototype.sampleHeight = function(e, t, n) { + return this._picking.sampleHeight(this, e, t, n); +}; +Scene.prototype.clampToHeight = function(e, t, n, i) { + return this._picking.clampToHeight( + this, + e, + t, + n, + i + ); +}; +Scene.prototype.sampleHeightMostDetailed = function(e, t, n) { + return this._picking.sampleHeightMostDetailed( + this, + e, + t, + n + ); +}; +Scene.prototype.clampToHeightMostDetailed = function(e, t, n) { + return this._picking.clampToHeightMostDetailed( + this, + e, + t, + n + ); +}; +Scene.prototype.cartesianToCanvasCoordinates = function(e, t) { + return SceneTransforms.worldToWindowCoordinates(this, e, t); +}; +Scene.prototype.completeMorph = function() { + this._transitioner.completeMorph(); +}; +Scene.prototype.morphTo2D = function(e) { + e = defaultValue(e, 2), this._transitioner.morphTo2D(e, this._ellipsoid); +}; +Scene.prototype.morphToColumbusView = function(e) { + e = defaultValue(e, 2), this._transitioner.morphToColumbusView(e, this._ellipsoid); +}; +Scene.prototype.morphTo3D = function(e) { + e = defaultValue(e, 2), this._transitioner.morphTo3D(e, this._ellipsoid); +}; +function setTerrain(e, t) { + if (e._removeTerrainProviderReadyListener = e._removeTerrainProviderReadyListener && e._removeTerrainProviderReadyListener(), t.ready) { + defined(e.globe) && (e.globe.terrainProvider = t.provider); + return; + } + e.globe.terrainProvider = void 0, e._removeTerrainProviderReadyListener = t.readyEvent.addEventListener( + (n) => { + defined(e) && defined(e.globe) && (e.globe.terrainProvider = n), e._removeTerrainProviderReadyListener(); + } + ); +} +Scene.prototype.setTerrain = function(e) { + return setTerrain(this, e), e; +}; +Scene.prototype.isDestroyed = function() { + return !1; +}; +Scene.prototype.destroy = function() { + this._tweens.removeAll(), this._computeEngine = this._computeEngine && this._computeEngine.destroy(), this._screenSpaceCameraController = this._screenSpaceCameraController && this._screenSpaceCameraController.destroy(), this._deviceOrientationCameraController = this._deviceOrientationCameraController && !this._deviceOrientationCameraController.isDestroyed() && this._deviceOrientationCameraController.destroy(), this._primitives = this._primitives && this._primitives.destroy(), this._groundPrimitives = this._groundPrimitives && this._groundPrimitives.destroy(), this._globe = this._globe && this._globe.destroy(), this._removeTerrainProviderReadyListener = this._removeTerrainProviderReadyListener && this._removeTerrainProviderReadyListener(), this.skyBox = this.skyBox && this.skyBox.destroy(), this.skyAtmosphere = this.skyAtmosphere && this.skyAtmosphere.destroy(), this._debugSphere = this._debugSphere && this._debugSphere.destroy(), this.sun = this.sun && this.sun.destroy(), this._sunPostProcess = this._sunPostProcess && this._sunPostProcess.destroy(), this._depthPlane = this._depthPlane && this._depthPlane.destroy(), this._transitioner = this._transitioner && this._transitioner.destroy(), this._debugFrustumPlanes = this._debugFrustumPlanes && this._debugFrustumPlanes.destroy(), this._brdfLutGenerator = this._brdfLutGenerator && this._brdfLutGenerator.destroy(), this._picking = this._picking && this._picking.destroy(), this._defaultView = this._defaultView && this._defaultView.destroy(), this._view = void 0, this._removeCreditContainer && this._canvas.parentNode.removeChild(this._creditContainer), this.postProcessStages = this.postProcessStages && this.postProcessStages.destroy(), this._context = this._context && this._context.destroy(), this._frameState.creditDisplay = this._frameState.creditDisplay && this._frameState.creditDisplay.destroy(), defined(this._performanceDisplay) && (this._performanceDisplay = this._performanceDisplay && this._performanceDisplay.destroy(), this._performanceContainer.parentNode.removeChild( + this._performanceContainer + )), this._removeRequestListenerCallback(), this._removeTaskProcessorListenerCallback(); + for (let e = 0; e < this._removeGlobeCallbacks.length; ++e) + this._removeGlobeCallbacks[e](); + return this._removeGlobeCallbacks.length = 0, defined(this._removeUpdateHeightCallback) && (this._removeUpdateHeightCallback(), this._removeUpdateHeightCallback = void 0), destroyObject(this); +}; +function SkyAtmosphere(e) { + e = defaultValue(e, Ellipsoid.WGS84), this.show = !0, this.perFragmentAtmosphere = !1, this._ellipsoid = e; + const t = 1.025, n = Cartesian3.multiplyByScalar( + e.radii, + t, + new Cartesian3() + ); + this._scaleMatrix = Matrix4.fromScale(n), this._modelMatrix = new Matrix4(), this._command = new DrawCommand({ + owner: this, + modelMatrix: this._modelMatrix + }), this._spSkyFromSpace = void 0, this._spSkyFromAtmosphere = void 0, this._flags = void 0, this.atmosphereLightIntensity = 50, this.atmosphereRayleighCoefficient = new Cartesian3(55e-7, 13e-6, 284e-7), this.atmosphereMieCoefficient = new Cartesian3(21e-6, 21e-6, 21e-6), this.atmosphereRayleighScaleHeight = 1e4, this.atmosphereMieScaleHeight = 3200, this.atmosphereMieAnisotropy = 0.9, this.hueShift = 0, this.saturationShift = 0, this.brightnessShift = 0, this._hueSaturationBrightness = new Cartesian3(); + const i = new Cartesian3(); + i.x = e.maximumRadius * t, i.y = e.maximumRadius, i.z = 0, this._radiiAndDynamicAtmosphereColor = i; + const r = this; + this._command.uniformMap = { + u_radiiAndDynamicAtmosphereColor: function() { + return r._radiiAndDynamicAtmosphereColor; + }, + u_hsbShift: function() { + return r._hueSaturationBrightness.x = r.hueShift, r._hueSaturationBrightness.y = r.saturationShift, r._hueSaturationBrightness.z = r.brightnessShift, r._hueSaturationBrightness; + }, + u_atmosphereLightIntensity: function() { + return r.atmosphereLightIntensity; + }, + u_atmosphereRayleighCoefficient: function() { + return r.atmosphereRayleighCoefficient; + }, + u_atmosphereMieCoefficient: function() { + return r.atmosphereMieCoefficient; + }, + u_atmosphereRayleighScaleHeight: function() { + return r.atmosphereRayleighScaleHeight; + }, + u_atmosphereMieScaleHeight: function() { + return r.atmosphereMieScaleHeight; + }, + u_atmosphereMieAnisotropy: function() { + return r.atmosphereMieAnisotropy; + } + }; +} +Object.defineProperties(SkyAtmosphere.prototype, { + /** + * Gets the ellipsoid the atmosphere is drawn around. + * @memberof SkyAtmosphere.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +SkyAtmosphere.prototype.setDynamicLighting = function(e) { + this._radiiAndDynamicAtmosphereColor.z = e; +}; +const scratchModelMatrix$1 = new Matrix4(); +SkyAtmosphere.prototype.update = function(e, t) { + if (!this.show) + return; + const n = e.mode; + if (n !== SceneMode$1.SCENE3D && n !== SceneMode$1.MORPHING || !e.passes.render) + return; + const i = Matrix4.fromRotationTranslation( + e.context.uniformState.inverseViewRotation, + Cartesian3.ZERO, + scratchModelMatrix$1 + ), r = Matrix4.multiplyTransformation( + i, + Axis$1.Y_UP_TO_Z_UP, + scratchModelMatrix$1 + ), o = Matrix4.multiply( + this._scaleMatrix, + r, + scratchModelMatrix$1 + ); + Matrix4.clone(o, this._modelMatrix); + const s = e.context, c = hasColorCorrection(this), l = e.globeTranslucencyState.translucent, d = this.perFragmentAtmosphere || l || !defined(t) || !t.show, f = this._command; + if (!defined(f.vertexArray)) { + const p = EllipsoidGeometry.createGeometry( + new EllipsoidGeometry({ + radii: new Cartesian3(1, 1, 1), + slicePartitions: 256, + stackPartitions: 256, + vertexFormat: VertexFormat.POSITION_ONLY + }) + ); + f.vertexArray = VertexArray.fromGeometry({ + context: s, + geometry: p, + attributeLocations: GeometryPipeline.createAttributeLocations(p), + bufferUsage: BufferUsage$1.STATIC_DRAW + }), f.renderState = RenderState.fromCache({ + cull: { + enabled: !0, + face: CullFace$1.FRONT + }, + blending: BlendingState$1.ALPHA_BLEND, + depthMask: !1 + }); + } + const h = c | d << 2 | l << 3; + if (h !== this._flags) { + this._flags = h; + const p = []; + c && p.push("COLOR_CORRECT"), d && p.push("PER_FRAGMENT_ATMOSPHERE"), l && p.push("GLOBE_TRANSLUCENT"); + const m = new ShaderSource({ + defines: p, + sources: [AtmosphereCommon, SkyAtmosphereCommon, SkyAtmosphereVS] + }), _ = new ShaderSource({ + defines: p, + sources: [AtmosphereCommon, SkyAtmosphereCommon, SkyAtmosphereFS] + }); + this._spSkyAtmosphere = ShaderProgram.fromCache({ + context: s, + vertexShaderSource: m, + fragmentShaderSource: _ + }), f.shaderProgram = this._spSkyAtmosphere; + } + return f; +}; +function hasColorCorrection(e) { + return !(CesiumMath.equalsEpsilon( + e.hueShift, + 0, + CesiumMath.EPSILON7 + ) && CesiumMath.equalsEpsilon( + e.saturationShift, + 0, + CesiumMath.EPSILON7 + ) && CesiumMath.equalsEpsilon( + e.brightnessShift, + 0, + CesiumMath.EPSILON7 + )); +} +SkyAtmosphere.prototype.isDestroyed = function() { + return !1; +}; +SkyAtmosphere.prototype.destroy = function() { + const e = this._command; + return e.vertexArray = e.vertexArray && e.vertexArray.destroy(), this._spSkyAtmosphere = this._spSkyAtmosphere && this._spSkyAtmosphere.destroy(), destroyObject(this); +}; +function SkyBox(e) { + this.sources = e.sources, this._sources = void 0, this.show = defaultValue(e.show, !0), this._command = new DrawCommand({ + modelMatrix: Matrix4.clone(Matrix4.IDENTITY), + owner: this + }), this._cubeMap = void 0, this._attributeLocations = void 0, this._useHdr = void 0; +} +SkyBox.prototype.update = function(e, t) { + const n = this, { mode: i, passes: r, context: o } = e; + if (!this.show || i !== SceneMode$1.SCENE3D && i !== SceneMode$1.MORPHING || !r.render) + return; + if (this._sources !== this.sources) { + this._sources = this.sources; + const c = this.sources; + typeof c.positiveX == "string" ? loadCubeMap(o, this._sources).then(function(l) { + n._cubeMap = n._cubeMap && n._cubeMap.destroy(), n._cubeMap = l; + }) : (this._cubeMap = this._cubeMap && this._cubeMap.destroy(), this._cubeMap = new CubeMap({ + context: o, + source: c + })); + } + const s = this._command; + if (!defined(s.vertexArray)) { + s.uniformMap = { + u_cubeMap: function() { + return n._cubeMap; + } + }; + const c = BoxGeometry.createGeometry( + BoxGeometry.fromDimensions({ + dimensions: new Cartesian3(2, 2, 2), + vertexFormat: VertexFormat.POSITION_ONLY + }) + ), l = this._attributeLocations = GeometryPipeline.createAttributeLocations( + c + ); + s.vertexArray = VertexArray.fromGeometry({ + context: o, + geometry: c, + attributeLocations: l, + bufferUsage: BufferUsage$1.STATIC_DRAW + }), s.renderState = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND + }); + } + if (!defined(s.shaderProgram) || this._useHdr !== t) { + const c = new ShaderSource({ + defines: [t ? "HDR" : ""], + sources: [SkyBoxFS] + }); + s.shaderProgram = ShaderProgram.fromCache({ + context: o, + vertexShaderSource: SkyBoxVS, + fragmentShaderSource: c, + attributeLocations: this._attributeLocations + }), this._useHdr = t; + } + if (defined(this._cubeMap)) + return s; +}; +SkyBox.prototype.isDestroyed = function() { + return !1; +}; +SkyBox.prototype.destroy = function() { + const e = this._command; + return e.vertexArray = e.vertexArray && e.vertexArray.destroy(), e.shaderProgram = e.shaderProgram && e.shaderProgram.destroy(), this._cubeMap = this._cubeMap && this._cubeMap.destroy(), destroyObject(this); +}; +function getDefaultSkyBoxUrl(e) { + return buildModuleUrl(`Assets/Textures/SkyBox/tycho2t3_80_${e}.jpg`); +} +SkyBox.createEarthSkyBox = function() { + return new SkyBox({ + sources: { + positiveX: getDefaultSkyBoxUrl("px"), + negativeX: getDefaultSkyBoxUrl("mx"), + positiveY: getDefaultSkyBoxUrl("py"), + negativeY: getDefaultSkyBoxUrl("my"), + positiveZ: getDefaultSkyBoxUrl("pz"), + negativeZ: getDefaultSkyBoxUrl("mz") + } + }); +}; +function Sun() { + this.show = !0, this._drawCommand = new DrawCommand({ + primitiveType: PrimitiveType$1.TRIANGLES, + boundingVolume: new BoundingSphere(), + owner: this + }), this._commands = { + drawCommand: this._drawCommand, + computeCommand: void 0 + }, this._boundingVolume = new BoundingSphere(), this._boundingVolume2D = new BoundingSphere(), this._texture = void 0, this._drawingBufferWidth = void 0, this._drawingBufferHeight = void 0, this._radiusTS = void 0, this._size = void 0, this.glowFactor = 1, this._glowFactorDirty = !1, this._useHdr = void 0; + const e = this; + this._uniformMap = { + u_texture: function() { + return e._texture; + }, + u_size: function() { + return e._size; + } + }; +} +Object.defineProperties(Sun.prototype, { + /** + * Gets or sets a number that controls how "bright" the Sun's lens flare appears + * to be. Zero shows just the Sun's disc without any flare. + * Use larger values for a more pronounced flare around the Sun. + * + * @memberof Sun.prototype + * @type {number} + * @default 1.0 + */ + glowFactor: { + get: function() { + return this._glowFactor; + }, + set: function(e) { + e = Math.max(e, 0), this._glowFactor = e, this._glowFactorDirty = !0; + } + } +}); +const scratchPositionWC = new Cartesian2(), scratchLimbWC = new Cartesian2(), scratchPositionEC = new Cartesian4(), scratchCartesian4 = new Cartesian4(); +Sun.prototype.update = function(e, t, n) { + if (!this.show) + return; + const i = e.mode; + if (i === SceneMode$1.SCENE2D || i === SceneMode$1.MORPHING || !e.passes.render) + return; + const r = e.context, o = t.viewport.width, s = t.viewport.height; + if (!defined(this._texture) || o !== this._drawingBufferWidth || s !== this._drawingBufferHeight || this._glowFactorDirty || n !== this._useHdr) { + this._texture = this._texture && this._texture.destroy(), this._drawingBufferWidth = o, this._drawingBufferHeight = s, this._glowFactorDirty = !1, this._useHdr = n; + let S = Math.max(o, s); + S = Math.pow(2, Math.ceil(Math.log(S) / Math.log(2)) - 2), S = Math.max(1, S); + const E = n ? r.halfFloatingPointTexture ? PixelDatatype$1.HALF_FLOAT : PixelDatatype$1.FLOAT : PixelDatatype$1.UNSIGNED_BYTE; + this._texture = new Texture({ + context: r, + width: S, + height: S, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: E + }), this._glowLengthTS = this._glowFactor * 5, this._radiusTS = 1 / (1 + 2 * this._glowLengthTS) * 0.5; + const A = this, D = { + u_radiusTS: function() { + return A._radiusTS; + } + }; + this._commands.computeCommand = new ComputeCommand({ + fragmentShaderSource: SunTextureFS, + outputTexture: this._texture, + uniformMap: D, + persists: !1, + owner: this, + postExecute: function() { + A._commands.computeCommand = void 0; + } + }); + } + const c = this._drawCommand; + if (!defined(c.vertexArray)) { + const S = { + direction: 0 + }, E = new Uint8Array(4 * 2); + E[0] = 0, E[1] = 0, E[2] = 255, E[3] = 0, E[4] = 255, E[5] = 255, E[6] = 0, E[7] = 255; + const A = Buffer.createVertexBuffer({ + context: r, + typedArray: E, + usage: BufferUsage$1.STATIC_DRAW + }), D = [ + { + index: S.direction, + vertexBuffer: A, + componentsPerAttribute: 2, + normalize: !0, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE + } + ], P = Buffer.createIndexBuffer({ + context: r, + typedArray: new Uint16Array([0, 1, 2, 0, 2, 3]), + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }); + c.vertexArray = new VertexArray({ + context: r, + attributes: D, + indexBuffer: P + }), c.shaderProgram = ShaderProgram.fromCache({ + context: r, + vertexShaderSource: SunVS, + fragmentShaderSource: SunFS, + attributeLocations: S + }), c.renderState = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND + }), c.uniformMap = this._uniformMap; + } + const l = r.uniformState.sunPositionWC, d = r.uniformState.sunPositionColumbusView, f = this._boundingVolume, h = this._boundingVolume2D; + Cartesian3.clone(l, f.center), h.center.x = d.z, h.center.y = d.x, h.center.z = d.y, f.radius = CesiumMath.SOLAR_RADIUS + CesiumMath.SOLAR_RADIUS * this._glowLengthTS, h.radius = f.radius, i === SceneMode$1.SCENE3D ? BoundingSphere.clone(f, c.boundingVolume) : i === SceneMode$1.COLUMBUS_VIEW && BoundingSphere.clone(h, c.boundingVolume); + const p = SceneTransforms.computeActualEllipsoidPosition( + e, + l, + scratchCartesian4 + ), m = Cartesian3.magnitude( + Cartesian3.subtract(p, e.camera.position, scratchCartesian4) + ), _ = r.uniformState.projection, y = scratchPositionEC; + y.x = 0, y.y = 0, y.z = -m, y.w = 1; + const C = Matrix4.multiplyByVector( + _, + y, + scratchCartesian4 + ), T = SceneTransforms.clipToGLWindowCoordinates( + t.viewport, + C, + scratchPositionWC + ); + y.x = CesiumMath.SOLAR_RADIUS; + const x = Matrix4.multiplyByVector( + _, + y, + scratchCartesian4 + ), b = SceneTransforms.clipToGLWindowCoordinates( + t.viewport, + x, + scratchLimbWC + ); + return this._size = Cartesian2.magnitude( + Cartesian2.subtract(b, T, scratchCartesian4) + ), this._size = 2 * this._size * (1 + 2 * this._glowLengthTS), this._size = Math.ceil(this._size), this._commands; +}; +Sun.prototype.isDestroyed = function() { + return !1; +}; +Sun.prototype.destroy = function() { + const e = this._drawCommand; + return e.vertexArray = e.vertexArray && e.vertexArray.destroy(), e.shaderProgram = e.shaderProgram && e.shaderProgram.destroy(), this._texture = this._texture && this._texture.destroy(), destroyObject(this); +}; +function startRenderLoop(e) { + e._renderLoopRunning = !0; + let t = 0; + function n(i) { + if (!e.isDestroyed()) + if (e._useDefaultRenderLoop) + try { + const r = e._targetFrameRate; + if (!defined(r)) + e.resize(), e.render(), requestAnimationFrame(n); + else { + const o = 1e3 / r, s = i - t; + s > o && (e.resize(), e.render(), t = i - s % o), requestAnimationFrame(n); + } + } catch (r) { + e._useDefaultRenderLoop = !1, e._renderLoopRunning = !1, e._showRenderLoopErrors && e.showErrorPanel("An error occurred while rendering. Rendering has stopped.", void 0, r); + } + else + e._renderLoopRunning = !1; + } + requestAnimationFrame(n); +} +function configurePixelRatio(e) { + let t = e._useBrowserRecommendedResolution ? 1 : window.devicePixelRatio; + return t *= e._resolutionScale, defined(e._scene) && (e._scene.pixelRatio = t), t; +} +function configureCanvasSize(e) { + const t = e._canvas; + let n = t.clientWidth, i = t.clientHeight; + const r = configurePixelRatio(e); + e._canvasClientWidth = n, e._canvasClientHeight = i, n *= r, i *= r, t.width = n, t.height = i, e._canRender = n !== 0 && i !== 0, e._lastDevicePixelRatio = window.devicePixelRatio; +} +function configureCameraFrustum(e) { + const t = e._canvas, n = t.width, i = t.height; + if (n !== 0 && i !== 0) { + const r = e._scene.camera.frustum; + defined(r.aspectRatio) ? r.aspectRatio = n / i : (r.top = r.right * (i / n), r.bottom = -r.top); + } +} +function CesiumWidget(e, t) { + e = getElement(e), t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = document.createElement("div"); + n.className = "cesium-widget", e.appendChild(n); + const i = document.createElement("canvas"), r = FeatureDetection.supportsImageRenderingPixelated(); + this._supportsImageRenderingPixelated = r, r && (i.style.imageRendering = FeatureDetection.imageRenderingValue()), i.oncontextmenu = function() { + return !1; + }, i.onselectstart = function() { + return !1; + }; + function o() { + i !== i.ownerDocument.activeElement && i.ownerDocument.activeElement.blur(); + } + defaultValue( + t.blurActiveElementOnCanvasFocus, + !0 + ) && (i.addEventListener("mousedown", o), i.addEventListener("pointerdown", o)), n.appendChild(i); + const c = document.createElement("div"); + c.className = "cesium-widget-credits"; + const l = defined(t.creditContainer) ? getElement(t.creditContainer) : n; + l.appendChild(c); + const d = defined(t.creditViewport) ? getElement(t.creditViewport) : n, f = defaultValue(t.showRenderLoopErrors, !0), h = defaultValue( + t.useBrowserRecommendedResolution, + !0 + ); + this._element = n, this._container = e, this._canvas = i, this._canvasClientWidth = 0, this._canvasClientHeight = 0, this._lastDevicePixelRatio = 0, this._creditViewport = d, this._creditContainer = l, this._innerCreditContainer = c, this._canRender = !1, this._renderLoopRunning = !1, this._showRenderLoopErrors = f, this._resolutionScale = 1, this._useBrowserRecommendedResolution = h, this._forceResize = !1, this._clock = defined(t.clock) ? t.clock : new Clock(), configureCanvasSize(this); + try { + const p = defaultValue(t.ellipsoid, Ellipsoid.default), m = new Scene({ + canvas: i, + contextOptions: t.contextOptions, + creditContainer: c, + creditViewport: d, + ellipsoid: p, + mapProjection: t.mapProjection, + orderIndependentTranslucency: t.orderIndependentTranslucency, + scene3DOnly: defaultValue(t.scene3DOnly, !1), + shadows: t.shadows, + mapMode2D: t.mapMode2D, + requestRenderMode: t.requestRenderMode, + maximumRenderTimeChange: t.maximumRenderTimeChange, + depthPlaneEllipsoidOffset: t.depthPlaneEllipsoidOffset, + msaaSamples: t.msaaSamples + }); + this._scene = m, m.camera.constrainedAxis = Cartesian3.UNIT_Z, configurePixelRatio(this), configureCameraFrustum(this); + let _ = t.globe; + defined(_) || (_ = new Globe(p)), _ !== !1 && (m.globe = _, m.globe.shadows = defaultValue( + t.terrainShadows, + ShadowMode$1.RECEIVE_ONLY + )); + let y = t.skyBox; + !defined(y) && Ellipsoid.WGS84.equals(p) && (y = SkyBox.createEarthSkyBox()), y !== !1 && (m.skyBox = y, m.sun = new Sun(), Ellipsoid.WGS84.equals(p) && (m.moon = new Moon())); + let C = t.skyAtmosphere; + !defined(C) && Ellipsoid.WGS84.equals(p) && (C = new SkyAtmosphere(p), C.show = t.globe !== !1 && _.show), C !== !1 && (m.skyAtmosphere = C); + let T = t.baseLayer; + t.globe !== !1 && T !== !1 && (defined(T) || (T = ImageryLayer.fromWorldImagery()), m.imageryLayers.add(T)), defined(t.terrainProvider) && t.globe !== !1 && (m.terrainProvider = t.terrainProvider), defined(t.terrain) && t.globe !== !1 && m.setTerrain(t.terrain), this._screenSpaceEventHandler = new ScreenSpaceEventHandler(i), defined(t.sceneMode) && (t.sceneMode === SceneMode$1.SCENE2D && this._scene.morphTo2D(0), t.sceneMode === SceneMode$1.COLUMBUS_VIEW && this._scene.morphToColumbusView(0)), this._useDefaultRenderLoop = void 0, this.useDefaultRenderLoop = defaultValue( + t.useDefaultRenderLoop, + !0 + ), this._targetFrameRate = void 0, this.targetFrameRate = t.targetFrameRate; + const x = this; + this._onRenderError = function(b, S) { + x._useDefaultRenderLoop = !1, x._renderLoopRunning = !1, x._showRenderLoopErrors && x.showErrorPanel("An error occurred while rendering. Rendering has stopped.", void 0, S); + }, m.renderError.addEventListener(this._onRenderError); + } catch (p) { + throw f && this.showErrorPanel("Error constructing CesiumWidget.", 'Visit <a href="http://get.webgl.org">http://get.webgl.org</a> to verify that your web browser and hardware support WebGL. Consider trying a different web browser or updating your video drivers. Detailed error information is below:', p), p; + } +} +Object.defineProperties(CesiumWidget.prototype, { + /** + * Gets the parent container. + * @memberof CesiumWidget.prototype + * + * @type {Element} + * @readonly + */ + container: { + get: function() { + return this._container; + } + }, + /** + * Gets the canvas. + * @memberof CesiumWidget.prototype + * + * @type {HTMLCanvasElement} + * @readonly + */ + canvas: { + get: function() { + return this._canvas; + } + }, + /** + * Gets the credit container. + * @memberof CesiumWidget.prototype + * + * @type {Element} + * @readonly + */ + creditContainer: { + get: function() { + return this._creditContainer; + } + }, + /** + * Gets the credit viewport + * @memberof CesiumWidget.prototype + * + * @type {Element} + * @readonly + */ + creditViewport: { + get: function() { + return this._creditViewport; + } + }, + /** + * Gets the scene. + * @memberof CesiumWidget.prototype + * + * @type {Scene} + * @readonly + */ + scene: { + get: function() { + return this._scene; + } + }, + /** + * Gets the collection of image layers that will be rendered on the globe. + * @memberof CesiumWidget.prototype + * + * @type {ImageryLayerCollection} + * @readonly + */ + imageryLayers: { + get: function() { + return this._scene.imageryLayers; + } + }, + /** + * The terrain provider providing surface geometry for the globe. + * @memberof CesiumWidget.prototype + * + * @type {TerrainProvider} + */ + terrainProvider: { + get: function() { + return this._scene.terrainProvider; + }, + set: function(e) { + this._scene.terrainProvider = e; + } + }, + /** + * Manages the list of credits to display on screen and in the lightbox. + * @memberof CesiumWidget.prototype + * + * @type {CreditDisplay} + */ + creditDisplay: { + get: function() { + return this._scene.frameState.creditDisplay; + } + }, + /** + * Gets the camera. + * @memberof CesiumWidget.prototype + * + * @type {Camera} + * @readonly + */ + camera: { + get: function() { + return this._scene.camera; + } + }, + /** + * Gets the default ellipsoid for the scene. + * @memberof CesiumWidget.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._scene.ellipsoid; + } + }, + /** + * Gets the clock. + * @memberof CesiumWidget.prototype + * + * @type {Clock} + * @readonly + */ + clock: { + get: function() { + return this._clock; + } + }, + /** + * Gets the screen space event handler. + * @memberof CesiumWidget.prototype + * + * @type {ScreenSpaceEventHandler} + * @readonly + */ + screenSpaceEventHandler: { + get: function() { + return this._screenSpaceEventHandler; + } + }, + /** + * Gets or sets the target frame rate of the widget when <code>useDefaultRenderLoop</code> + * is true. If undefined, the browser's requestAnimationFrame implementation + * determines the frame rate. If defined, this value must be greater than 0. A value higher + * than the underlying requestAnimationFrame implementation will have no effect. + * @memberof CesiumWidget.prototype + * + * @type {number} + */ + targetFrameRate: { + get: function() { + return this._targetFrameRate; + }, + set: function(e) { + this._targetFrameRate = e; + } + }, + /** + * Gets or sets whether or not this widget should control the render loop. + * If true the widget will use requestAnimationFrame to + * perform rendering and resizing of the widget, as well as drive the + * simulation clock. If set to false, you must manually call the + * <code>resize</code>, <code>render</code> methods as part of a custom + * render loop. If an error occurs during rendering, {@link Scene}'s + * <code>renderError</code> event will be raised and this property + * will be set to false. It must be set back to true to continue rendering + * after the error. + * @memberof CesiumWidget.prototype + * + * @type {boolean} + */ + useDefaultRenderLoop: { + get: function() { + return this._useDefaultRenderLoop; + }, + set: function(e) { + this._useDefaultRenderLoop !== e && (this._useDefaultRenderLoop = e, e && !this._renderLoopRunning && startRenderLoop(this)); + } + }, + /** + * Gets or sets a scaling factor for rendering resolution. Values less than 1.0 can improve + * performance on less powerful devices while values greater than 1.0 will render at a higher + * resolution and then scale down, resulting in improved visual fidelity. + * For example, if the widget is laid out at a size of 640x480, setting this value to 0.5 + * will cause the scene to be rendered at 320x240 and then scaled up while setting + * it to 2.0 will cause the scene to be rendered at 1280x960 and then scaled down. + * @memberof CesiumWidget.prototype + * + * @type {number} + * @default 1.0 + */ + resolutionScale: { + get: function() { + return this._resolutionScale; + }, + set: function(e) { + this._resolutionScale !== e && (this._resolutionScale = e, this._forceResize = !0); + } + }, + /** + * Boolean flag indicating if the browser's recommended resolution is used. + * If true, the browser's device pixel ratio is ignored and 1.0 is used instead, + * effectively rendering based on CSS pixels instead of device pixels. This can improve + * performance on less powerful devices that have high pixel density. When false, rendering + * will be in device pixels. {@link CesiumWidget#resolutionScale} will still take effect whether + * this flag is true or false. + * @memberof CesiumWidget.prototype + * + * @type {boolean} + * @default true + */ + useBrowserRecommendedResolution: { + get: function() { + return this._useBrowserRecommendedResolution; + }, + set: function(e) { + this._useBrowserRecommendedResolution !== e && (this._useBrowserRecommendedResolution = e, this._forceResize = !0); + } + } +}); +CesiumWidget.prototype.showErrorPanel = function(e, t, n) { + const i = this._element, r = document.createElement("div"); + r.className = "cesium-widget-errorPanel"; + const o = document.createElement("div"); + o.className = "cesium-widget-errorPanel-content", r.appendChild(o); + const s = document.createElement("div"); + s.className = "cesium-widget-errorPanel-header", s.appendChild(document.createTextNode(e)), o.appendChild(s); + const c = document.createElement("div"); + c.className = "cesium-widget-errorPanel-scroll", o.appendChild(c); + function l() { + c.style.maxHeight = `${Math.max( + Math.round(i.clientHeight * 0.9 - 100), + 30 + )}px`; + } + l(), defined(window.addEventListener) && window.addEventListener("resize", l, !1); + const d = defined(t), f = defined(n); + if (d || f) { + const m = document.createElement("div"); + if (m.className = "cesium-widget-errorPanel-message", c.appendChild(m), f) { + let _ = formatError(n); + d || (typeof n == "string" && (n = new Error(n)), t = formatError({ + name: n.name, + message: n.message + }), _ = n.stack), typeof console < "u" && console.error(`${e} +${t} +${_}`); + const y = document.createElement("div"); + y.className = "cesium-widget-errorPanel-message-details collapsed"; + const C = document.createElement("span"); + C.className = "cesium-widget-errorPanel-more-details", C.appendChild(document.createTextNode("See more...")), y.appendChild(C), y.onclick = function(T) { + y.removeChild(C), y.appendChild(document.createTextNode(_)), y.className = "cesium-widget-errorPanel-message-details", o.className = "cesium-widget-errorPanel-content expanded", y.onclick = void 0; + }, c.appendChild(y); + } + m.innerHTML = `<p>${t}</p>`; + } + const h = document.createElement("div"); + h.className = "cesium-widget-errorPanel-buttonPanel", o.appendChild(h); + const p = document.createElement("button"); + p.setAttribute("type", "button"), p.className = "cesium-button", p.appendChild(document.createTextNode("OK")), p.onclick = function() { + defined(l) && defined(window.removeEventListener) && window.removeEventListener("resize", l, !1), i.removeChild(r); + }, h.appendChild(p), i.appendChild(r); +}; +CesiumWidget.prototype.isDestroyed = function() { + return !1; +}; +CesiumWidget.prototype.destroy = function() { + defined(this._scene) && (this._scene.renderError.removeEventListener(this._onRenderError), this._scene = this._scene.destroy()), this._container.removeChild(this._element), this._creditContainer.removeChild(this._innerCreditContainer), destroyObject(this); +}; +CesiumWidget.prototype.resize = function() { + const e = this._canvas; + !this._forceResize && this._canvasClientWidth === e.clientWidth && this._canvasClientHeight === e.clientHeight && this._lastDevicePixelRatio === window.devicePixelRatio || (this._forceResize = !1, configureCanvasSize(this), configureCameraFrustum(this), this._scene.requestRender()); +}; +CesiumWidget.prototype.render = function() { + if (this._canRender) { + this._scene.initializeFrame(); + const e = this._clock.tick(); + this._scene.render(e); + } else + this._clock.tick(); +}; +function TileAvailability(e, t) { + this._tilingScheme = e, this._maximumLevel = t, this._rootNodes = []; +} +const rectangleScratch$2 = new Rectangle(); +function findNode(e, t, n, i) { + const r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o]; + if (s.x === t && s.y === n && s.level === e) + return !0; + } + return !1; +} +TileAvailability.prototype.addAvailableTileRange = function(e, t, n, i, r) { + const o = this._tilingScheme, s = this._rootNodes; + if (e === 0) + for (let p = n; p <= r; ++p) + for (let m = t; m <= i; ++m) + findNode(e, m, p, s) || s.push(new QuadtreeNode(o, void 0, 0, m, p)); + o.tileXYToRectangle(t, n, e, rectangleScratch$2); + const c = rectangleScratch$2.west, l = rectangleScratch$2.north; + o.tileXYToRectangle(i, r, e, rectangleScratch$2); + const d = rectangleScratch$2.east, f = rectangleScratch$2.south, h = new RectangleWithLevel( + e, + c, + f, + d, + l + ); + for (let p = 0; p < s.length; ++p) { + const m = s[p]; + rectanglesOverlap(m.extent, h) && putRectangleInQuadtree(this._maximumLevel, m, h); + } +}; +TileAvailability.prototype.computeMaximumLevelAtPosition = function(e) { + let t; + for (let n = 0; n < this._rootNodes.length; ++n) { + const i = this._rootNodes[n]; + if (rectangleContainsPosition(i.extent, e)) { + t = i; + break; + } + } + return defined(t) ? findMaxLevelFromNode(void 0, t, e) : -1; +}; +const rectanglesScratch = [], remainingToCoverByLevelScratch = [], westScratch = new Rectangle(), eastScratch = new Rectangle(); +TileAvailability.prototype.computeBestAvailableLevelOverRectangle = function(e) { + const t = rectanglesScratch; + t.length = 0, e.east < e.west ? (t.push( + Rectangle.fromRadians( + -Math.PI, + e.south, + e.east, + e.north, + westScratch + ) + ), t.push( + Rectangle.fromRadians( + e.west, + e.south, + Math.PI, + e.north, + eastScratch + ) + )) : t.push(e); + const n = remainingToCoverByLevelScratch; + n.length = 0; + let i; + for (i = 0; i < this._rootNodes.length; ++i) + updateCoverageWithNode( + n, + this._rootNodes[i], + t + ); + for (i = n.length - 1; i >= 0; --i) + if (defined(n[i]) && n[i].length === 0) + return i; + return 0; +}; +const cartographicScratch = new Cartographic(); +TileAvailability.prototype.isTileAvailable = function(e, t, n) { + const i = this._tilingScheme.tileXYToRectangle( + t, + n, + e, + rectangleScratch$2 + ); + return Rectangle.center(i, cartographicScratch), this.computeMaximumLevelAtPosition(cartographicScratch) >= e; +}; +TileAvailability.prototype.computeChildMaskForTile = function(e, t, n) { + const i = e + 1; + if (i >= this._maximumLevel) + return 0; + let r = 0; + return r |= this.isTileAvailable(i, 2 * t, 2 * n + 1) ? 1 : 0, r |= this.isTileAvailable(i, 2 * t + 1, 2 * n + 1) ? 2 : 0, r |= this.isTileAvailable(i, 2 * t, 2 * n) ? 4 : 0, r |= this.isTileAvailable(i, 2 * t + 1, 2 * n) ? 8 : 0, r; +}; +function QuadtreeNode(e, t, n, i, r) { + this.tilingScheme = e, this.parent = t, this.level = n, this.x = i, this.y = r, this.extent = e.tileXYToRectangle(i, r, n), this.rectangles = [], this._sw = void 0, this._se = void 0, this._nw = void 0, this._ne = void 0; +} +Object.defineProperties(QuadtreeNode.prototype, { + nw: { + get: function() { + return this._nw || (this._nw = new QuadtreeNode( + this.tilingScheme, + this, + this.level + 1, + this.x * 2, + this.y * 2 + )), this._nw; + } + }, + ne: { + get: function() { + return this._ne || (this._ne = new QuadtreeNode( + this.tilingScheme, + this, + this.level + 1, + this.x * 2 + 1, + this.y * 2 + )), this._ne; + } + }, + sw: { + get: function() { + return this._sw || (this._sw = new QuadtreeNode( + this.tilingScheme, + this, + this.level + 1, + this.x * 2, + this.y * 2 + 1 + )), this._sw; + } + }, + se: { + get: function() { + return this._se || (this._se = new QuadtreeNode( + this.tilingScheme, + this, + this.level + 1, + this.x * 2 + 1, + this.y * 2 + 1 + )), this._se; + } + } +}); +function RectangleWithLevel(e, t, n, i, r) { + this.level = e, this.west = t, this.south = n, this.east = i, this.north = r; +} +function rectanglesOverlap(e, t) { + const n = Math.max(e.west, t.west), i = Math.max(e.south, t.south), r = Math.min(e.east, t.east), o = Math.min(e.north, t.north); + return i < o && n < r; +} +function putRectangleInQuadtree(e, t, n) { + for (; t.level < e; ) + if (rectangleFullyContainsRectangle(t.nw.extent, n)) + t = t.nw; + else if (rectangleFullyContainsRectangle(t.ne.extent, n)) + t = t.ne; + else if (rectangleFullyContainsRectangle(t.sw.extent, n)) + t = t.sw; + else if (rectangleFullyContainsRectangle(t.se.extent, n)) + t = t.se; + else + break; + if (t.rectangles.length === 0 || t.rectangles[t.rectangles.length - 1].level <= n.level) + t.rectangles.push(n); + else { + let i = binarySearch( + t.rectangles, + n.level, + rectangleLevelComparator + ); + i < 0 && (i = ~i), t.rectangles.splice(i, 0, n); + } +} +function rectangleLevelComparator(e, t) { + return e.level - t; +} +function rectangleFullyContainsRectangle(e, t) { + return t.west >= e.west && t.east <= e.east && t.south >= e.south && t.north <= e.north; +} +function rectangleContainsPosition(e, t) { + return t.longitude >= e.west && t.longitude <= e.east && t.latitude >= e.south && t.latitude <= e.north; +} +function findMaxLevelFromNode(e, t, n) { + let i = 0, r = !1; + for (; !r; ) { + const o = t._nw && rectangleContainsPosition(t._nw.extent, n), s = t._ne && rectangleContainsPosition(t._ne.extent, n), c = t._sw && rectangleContainsPosition(t._sw.extent, n), l = t._se && rectangleContainsPosition(t._se.extent, n); + if (o + s + c + l > 1) { + o && (i = Math.max( + i, + findMaxLevelFromNode(t, t._nw, n) + )), s && (i = Math.max( + i, + findMaxLevelFromNode(t, t._ne, n) + )), c && (i = Math.max( + i, + findMaxLevelFromNode(t, t._sw, n) + )), l && (i = Math.max( + i, + findMaxLevelFromNode(t, t._se, n) + )); + break; + } else o ? t = t._nw : s ? t = t._ne : c ? t = t._sw : l ? t = t._se : r = !0; + } + for (; t !== e; ) { + const o = t.rectangles; + for (let s = o.length - 1; s >= 0 && o[s].level > i; --s) { + const c = o[s]; + rectangleContainsPosition(c, n) && (i = c.level); + } + t = t.parent; + } + return i; +} +function updateCoverageWithNode(e, t, n) { + if (!t) + return; + let i, r = !1; + for (i = 0; i < n.length; ++i) + r = r || rectanglesOverlap(t.extent, n[i]); + if (!r) + return; + const o = t.rectangles; + for (i = 0; i < o.length; ++i) { + const s = o[i]; + e[s.level] || (e[s.level] = n), e[s.level] = subtractRectangle( + e[s.level], + s + ); + } + updateCoverageWithNode(e, t._nw, n), updateCoverageWithNode(e, t._ne, n), updateCoverageWithNode(e, t._sw, n), updateCoverageWithNode(e, t._se, n); +} +function subtractRectangle(e, t) { + const n = []; + for (let i = 0; i < e.length; ++i) { + const r = e[i]; + rectanglesOverlap(r, t) ? (r.west < t.west && n.push( + new Rectangle( + r.west, + r.south, + t.west, + r.north + ) + ), r.east > t.east && n.push( + new Rectangle( + t.east, + r.south, + r.east, + r.north + ) + ), r.south < t.south && n.push( + new Rectangle( + Math.max(t.west, r.west), + r.south, + Math.min(t.east, r.east), + t.south + ) + ), r.north > t.north && n.push( + new Rectangle( + Math.max(t.west, r.west), + t.north, + Math.min(t.east, r.east), + r.north + ) + )) : n.push(r); + } + return n; +} +const ALL_CHILDREN = 15; +function TerrainProviderBuilder$2(e) { + this.ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this.credit = void 0, this.tilingScheme = void 0, this.height = void 0, this.width = void 0, this.encoding = void 0, this.lodCount = void 0, this.hasAvailability = !1, this.tilesAvailable = void 0, this.tilesAvailabilityLoaded = void 0, this.levelZeroMaximumGeometricError = void 0, this.terrainDataStructure = void 0; +} +TerrainProviderBuilder$2.prototype.build = function(e) { + e._credit = this.credit, e._tilingScheme = this.tilingScheme, e._height = this.height, e._width = this.width, e._encoding = this.encoding, e._lodCount = this.lodCount, e._hasAvailability = this.hasAvailability, e._tilesAvailable = this.tilesAvailable, e._tilesAvailabilityLoaded = this.tilesAvailabilityLoaded, e._levelZeroMaximumGeometricError = this.levelZeroMaximumGeometricError, e._terrainDataStructure = this.terrainDataStructure; +}; +function parseMetadataSuccess$1(e, t) { + const n = t.copyrightText; + defined(n) && (e.credit = new Credit(n)); + const i = t.spatialReference, r = defaultValue(i.latestWkid, i.wkid), o = t.extent, s = { + ellipsoid: e.ellipsoid + }; + if (r === 4326) + s.rectangle = Rectangle.fromDegrees( + o.xmin, + o.ymin, + o.xmax, + o.ymax + ), e.tilingScheme = new GeographicTilingScheme( + s + ); + else if (r === 3857) { + const d = Math.PI * e.ellipsoid.maximumRadius; + t.extent.xmax > d && (t.extent.xmax = d), t.extent.ymax > d && (t.extent.ymax = d), t.extent.xmin < -d && (t.extent.xmin = -d), t.extent.ymin < -d && (t.extent.ymin = -d), s.rectangleSouthwestInMeters = new Cartesian2( + o.xmin, + o.ymin + ), s.rectangleNortheastInMeters = new Cartesian2( + o.xmax, + o.ymax + ), e.tilingScheme = new WebMercatorTilingScheme( + s + ); + } else + throw new RuntimeError("Invalid spatial reference"); + const c = t.tileInfo; + if (!defined(c)) + throw new RuntimeError("tileInfo is required"); + e.width = c.rows + 1, e.height = c.cols + 1, e.encoding = c.format === "LERC" ? HeightmapEncoding$1.LERC : HeightmapEncoding$1.NONE, e.lodCount = c.lods.length - 1, (e.hasAvailability = t.capabilities.indexOf("Tilemap") !== -1) && (e.tilesAvailable = new TileAvailability( + e.tilingScheme, + e.lodCount + ), e.tilesAvailable.addAvailableTileRange( + 0, + 0, + 0, + e.tilingScheme.getNumberOfXTilesAtLevel(0), + e.tilingScheme.getNumberOfYTilesAtLevel(0) + ), e.tilesAvailabilityLoaded = new TileAvailability( + e.tilingScheme, + e.lodCount + )), e.levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + e.tilingScheme.ellipsoid, + e.width, + e.tilingScheme.getNumberOfXTilesAtLevel(0) + ), t.bandCount > 1 && console.log( + "ArcGISTiledElevationTerrainProvider: Terrain data has more than 1 band. Using the first one." + ), defined(t.minValues) && defined(t.maxValues) ? e.terrainDataStructure = { + elementMultiplier: 1, + lowestEncodedHeight: t.minValues[0], + highestEncodedHeight: t.maxValues[0] + } : e.terrainDataStructure = { + elementMultiplier: 1 + }; +} +async function requestMetadata$1(e, t, n) { + try { + const i = await t.fetchJson(); + parseMetadataSuccess$1(e, i); + } catch (i) { + const r = `An error occurred while accessing ${t}.`; + throw TileProviderError.reportError( + void 0, + n, + defined(n) ? n._errorEvent : void 0, + r + ), i; + } +} +function ArcGISTiledElevationTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._resource = void 0, this._credit = void 0, this._tilingScheme = void 0, this._levelZeroMaximumGeometricError = void 0, this._maxLevel = void 0, this._terrainDataStructure = void 0, this._width = void 0, this._height = void 0, this._encoding = void 0, this._lodCount = void 0, this._hasAvailability = !1, this._tilesAvailable = void 0, this._tilesAvailabilityLoaded = void 0, this._availableCache = {}, this._errorEvent = new Event(); +} +Object.defineProperties(ArcGISTiledElevationTerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {GeographicTilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return !1; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return !1; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof ArcGISTiledElevationTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + return this._tilesAvailable; + } + } +}); +ArcGISTiledElevationTerrainProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT), e = await Promise.resolve(e); + let n = Resource.createIfNeeded(e); + n.appendForwardSlash(), defined(t.token) && (n = n.getDerivedResource({ + queryParameters: { + token: t.token + } + })); + const i = n.getDerivedResource({ + queryParameters: { + f: "pjson" + } + }), r = new TerrainProviderBuilder$2(t); + await requestMetadata$1(r, i); + const o = new ArcGISTiledElevationTerrainProvider(t); + return r.build(o), o._resource = n, o; +}; +ArcGISTiledElevationTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + const r = this._resource.getDerivedResource({ + url: `tile/${n}/${t}/${e}`, + request: i + }), o = this._hasAvailability; + let s = Promise.resolve(!0), c; + if (o && !defined(isTileAvailable(this, n + 1, e * 2, t * 2))) { + const h = requestAvailability( + this, + n + 1, + e * 2, + t * 2 + ); + s = h.promise, c = h.request; + } + const l = r.fetchArrayBuffer(); + if (!defined(l) || !defined(s)) + return; + const d = this, f = this._tilesAvailable; + return Promise.all([l, s]).then(function(h) { + return new HeightmapTerrainData({ + buffer: h[0], + width: d._width, + height: d._height, + childTileMask: o ? f.computeChildMaskForTile(n, e, t) : ALL_CHILDREN, + structure: d._terrainDataStructure, + encoding: d._encoding + }); + }).catch(async function(h) { + var p; + if (defined(c) && c.state === RequestState$1.CANCELLED) { + i.cancel(); + try { + await ((p = i.deferred) == null ? void 0 : p.promise); + } catch { + } + return i.state = RequestState$1.CANCELLED, Promise.reject(h); + } + return Promise.reject(h); + }); +}; +function isTileAvailable(e, t, n, i) { + if (!e._hasAvailability) + return; + const r = e._tilesAvailabilityLoaded, o = e._tilesAvailable; + if (t > e._lodCount) + return !1; + if (o.isTileAvailable(t, n, i)) + return !0; + if (r.isTileAvailable(t, n, i)) + return !1; +} +ArcGISTiledElevationTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +ArcGISTiledElevationTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { + if (!this._hasAvailability) + return; + const i = isTileAvailable(this, n, e, t); + if (defined(i)) + return i; + requestAvailability(this, n, e, t); +}; +ArcGISTiledElevationTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { +}; +function findRange(e, t, n, i) { + const r = t - 1, o = n - 1, s = i[e.y * t + e.x], c = [], l = { + startX: e.x, + startY: e.y, + endX: 0, + endY: 0 + }, d = new Cartesian2(e.x + 1, e.y + 1); + let f = !1, h = !1; + for (; !(f && h); ) { + let p = d.x; + const m = h ? d.y + 1 : d.y; + if (!f) { + for (let _ = e.y; _ < m; ++_) + if (i[_ * t + d.x] !== s) { + f = !0; + break; + } + f ? (c.push(new Cartesian2(d.x, e.y)), --d.x, --p, l.endX = d.x) : d.x === r ? (l.endX = d.x, f = !0) : ++d.x; + } + if (!h) { + const _ = d.y * t; + for (let y = e.x; y <= p; ++y) + if (i[_ + y] !== s) { + h = !0; + break; + } + h ? (c.push(new Cartesian2(e.x, d.y)), --d.y, l.endY = d.y) : d.y === o ? (l.endY = d.y, h = !0) : ++d.y; + } + } + return { + endingIndices: c, + range: l, + value: s + }; +} +function computeAvailability(e, t, n, i, r) { + const o = []; + if (r.every(function(l) { + return l === r[0]; + })) + return r[0] === 1 && o.push({ + startX: e, + startY: t, + endX: e + n - 1, + endY: t + i - 1 + }), o; + let c = [new Cartesian2(0, 0)]; + for (; c.length > 0; ) { + const l = c.pop(), d = findRange(l, n, i, r); + if (d.value === 1) { + const h = d.range; + h.startX += e, h.endX += e, h.startY += t, h.endY += t, o.push(h); + } + const f = d.endingIndices; + f.length > 0 && (c = c.concat(f)); + } + return o; +} +function requestAvailability(e, t, n, i) { + if (!e._hasAvailability) + return {}; + const r = Math.floor(n / 128) * 128, o = Math.floor(i / 128) * 128, s = Math.min(1 << t, 128), c = `tilemap/${t}/${o}/${r}/${s}/${s}`, l = e._availableCache; + if (defined(l[c])) + return l[c]; + const d = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.TERRAIN + }); + let h = e._resource.getDerivedResource({ + url: c, + request: d + }).fetchJson(); + return defined(h) ? (h = h.then(function(p) { + const m = computeAvailability( + r, + o, + s, + s, + p.data + ); + e._tilesAvailabilityLoaded.addAvailableTileRange( + t, + r, + o, + r + s, + o + s + ); + const _ = e._tilesAvailable; + for (let y = 0; y < m.length; ++y) { + const C = m[y]; + _.addAvailableTileRange( + t, + C.startX, + C.startY, + C.endX, + C.endY + ); + } + return isTileAvailable(e, t, n, i); + }), l[c] = { + promise: h, + request: d + }, h = h.finally(function(p) { + return delete l[c], p; + }), { + promise: h, + request: d + }) : {}; +} +const url = "https://dev.virtualearth.net/REST/v1/Locations"; +function BingMapsGeocoderService(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.key; + this._key = t; + const n = { + key: t + }; + defined(e.culture) && (n.culture = e.culture), this._resource = new Resource({ + url, + queryParameters: n + }), this._credit = new Credit( + '<img src="http://dev.virtualearth.net/Branding/logo_powered_by.png"/>', + !1 + ); +} +Object.defineProperties(BingMapsGeocoderService.prototype, { + /** + * The URL endpoint for the Bing geocoder service + * @type {string} + * @memberof BingMapsGeocoderService.prototype + * @readonly + */ + url: { + get: function() { + return url; + } + }, + /** + * The key for the Bing geocoder service + * @type {string} + * @memberof BingMapsGeocoderService.prototype + * @readonly + */ + key: { + get: function() { + return this._key; + } + }, + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof BingMapsGeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + } +}); +BingMapsGeocoderService.prototype.geocode = async function(e) { + return this._resource.getDerivedResource({ + queryParameters: { + query: e + } + }).fetchJsonp("jsonp").then(function(n) { + return n.resourceSets.length === 0 ? [] : n.resourceSets[0].resources.map(function(r) { + const o = r.bbox, s = o[0], c = o[1], l = o[2], d = o[3]; + return { + displayName: r.name, + destination: Rectangle.fromDegrees(c, s, d, l) + }; + }); + }); +}; +function CartographicGeocoderService() { +} +Object.defineProperties(CartographicGeocoderService.prototype, { + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof CartographicGeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: function() { + } + } +}); +CartographicGeocoderService.prototype.geocode = function(e) { + const t = e.match(/[^\s,\n]+/g); + if (t.length === 2 || t.length === 3) { + let n = +t[0], i = +t[1]; + const r = t.length === 3 ? +t[2] : 300; + if (isNaN(n) && isNaN(i)) { + const o = /^(\d+.?\d*)([nsew])/i; + for (let s = 0; s < t.length; ++s) { + const c = t[s].match(o); + o.test(t[s]) && c.length === 3 && (/^[ns]/i.test(c[2]) ? i = /^[n]/i.test(c[2]) ? +c[1] : -c[1] : /^[ew]/i.test(c[2]) && (n = /^[e]/i.test(c[2]) ? +c[1] : -c[1])); + } + } + if (!isNaN(n) && !isNaN(i) && !isNaN(r)) { + const o = { + displayName: e, + destination: Cartesian3.fromDegrees(n, i, r) + }; + return Promise.resolve([o]); + } + } + return Promise.resolve([]); +}; +const scratchTimeVec = new Cartesian4(), scratchTemp0 = new Cartesian3(), scratchTemp1 = new Cartesian3(); +function createEvaluateFunction(e) { + const t = e.points, n = e.times; + if (t.length < 3) { + const i = n[0], r = 1 / (n[1] - i), o = t[0], s = t[1]; + return function(c, l) { + defined(l) || (l = new Cartesian3()); + const d = (c - i) * r; + return Cartesian3.lerp(o, s, d, l); + }; + } + return function(i, r) { + defined(r) || (r = new Cartesian3()); + const o = e._lastTimeIndex = e.findTimeInterval( + i, + e._lastTimeIndex + ), s = (i - n[o]) / (n[o + 1] - n[o]), c = scratchTimeVec; + c.z = s, c.y = s * s, c.x = c.y * s, c.w = 1; + let l, d, f, h, p; + return o === 0 ? (l = t[0], d = t[1], f = e.firstTangent, h = Cartesian3.subtract(t[2], l, scratchTemp0), Cartesian3.multiplyByScalar(h, 0.5, h), p = Matrix4.multiplyByVector( + HermiteSpline.hermiteCoefficientMatrix, + c, + c + )) : o === t.length - 2 ? (l = t[o], d = t[o + 1], h = e.lastTangent, f = Cartesian3.subtract(d, t[o - 1], scratchTemp0), Cartesian3.multiplyByScalar(f, 0.5, f), p = Matrix4.multiplyByVector( + HermiteSpline.hermiteCoefficientMatrix, + c, + c + )) : (l = t[o - 1], d = t[o], f = t[o + 1], h = t[o + 2], p = Matrix4.multiplyByVector( + CatmullRomSpline.catmullRomCoefficientMatrix, + c, + c + )), r = Cartesian3.multiplyByScalar(l, p.x, r), Cartesian3.multiplyByScalar(d, p.y, scratchTemp1), Cartesian3.add(r, scratchTemp1, r), Cartesian3.multiplyByScalar(f, p.z, scratchTemp1), Cartesian3.add(r, scratchTemp1, r), Cartesian3.multiplyByScalar(h, p.w, scratchTemp1), Cartesian3.add(r, scratchTemp1, r); + }; +} +const firstTangentScratch = new Cartesian3(), lastTangentScratch = new Cartesian3(); +function CatmullRomSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.points, n = e.times; + let i = e.firstTangent, r = e.lastTangent; + if (t.length > 2 && (defined(i) || (i = firstTangentScratch, Cartesian3.multiplyByScalar(t[1], 2, i), Cartesian3.subtract(i, t[2], i), Cartesian3.subtract(i, t[0], i), Cartesian3.multiplyByScalar(i, 0.5, i)), !defined(r))) { + const o = t.length - 1; + r = lastTangentScratch, Cartesian3.multiplyByScalar(t[o - 1], 2, r), Cartesian3.subtract(t[o], r, r), Cartesian3.add(r, t[o - 2], r), Cartesian3.multiplyByScalar(r, 0.5, r); + } + this._times = n, this._points = t, this._firstTangent = Cartesian3.clone(i), this._lastTangent = Cartesian3.clone(r), this._evaluateFunction = createEvaluateFunction(this), this._lastTimeIndex = 0; +} +Object.defineProperties(CatmullRomSpline.prototype, { + /** + * An array of times for the control points. + * + * @memberof CatmullRomSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of {@link Cartesian3} control points. + * + * @memberof CatmullRomSpline.prototype + * + * @type {Cartesian3[]} + * @readonly + */ + points: { + get: function() { + return this._points; + } + }, + /** + * The tangent at the first control point. + * + * @memberof CatmullRomSpline.prototype + * + * @type {Cartesian3} + * @readonly + */ + firstTangent: { + get: function() { + return this._firstTangent; + } + }, + /** + * The tangent at the last control point. + * + * @memberof CatmullRomSpline.prototype + * + * @type {Cartesian3} + * @readonly + */ + lastTangent: { + get: function() { + return this._lastTangent; + } + } +}); +CatmullRomSpline.catmullRomCoefficientMatrix = new Matrix4( + -0.5, + 1, + -0.5, + 0, + 1.5, + -2.5, + 0, + 1, + -1.5, + 2, + 0.5, + 0, + 0.5, + -0.5, + 0, + 0 +); +CatmullRomSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +CatmullRomSpline.prototype.wrapTime = Spline.prototype.wrapTime; +CatmullRomSpline.prototype.clampTime = Spline.prototype.clampTime; +CatmullRomSpline.prototype.evaluate = function(e, t) { + return this._evaluateFunction(e, t); +}; +const Intersections2D = {}; +Intersections2D.clipTriangleAtAxisAlignedThreshold = function(e, t, n, i, r, o) { + defined(o) ? o.length = 0 : o = []; + let s, c, l; + t ? (s = n < e, c = i < e, l = r < e) : (s = n > e, c = i > e, l = r > e); + const d = s + c + l; + let f, h, p, m, _, y; + return d === 1 ? s ? (f = (e - n) / (i - n), h = (e - n) / (r - n), o.push(1), o.push(2), h !== 1 && (o.push(-1), o.push(0), o.push(2), o.push(h)), f !== 1 && (o.push(-1), o.push(0), o.push(1), o.push(f))) : c ? (p = (e - i) / (r - i), m = (e - i) / (n - i), o.push(2), o.push(0), m !== 1 && (o.push(-1), o.push(1), o.push(0), o.push(m)), p !== 1 && (o.push(-1), o.push(1), o.push(2), o.push(p))) : l && (_ = (e - r) / (n - r), y = (e - r) / (i - r), o.push(0), o.push(1), y !== 1 && (o.push(-1), o.push(2), o.push(1), o.push(y)), _ !== 1 && (o.push(-1), o.push(2), o.push(0), o.push(_))) : d === 2 ? !s && n !== e ? (m = (e - i) / (n - i), _ = (e - r) / (n - r), o.push(0), o.push(-1), o.push(1), o.push(0), o.push(m), o.push(-1), o.push(2), o.push(0), o.push(_)) : !c && i !== e ? (y = (e - r) / (i - r), f = (e - n) / (i - n), o.push(1), o.push(-1), o.push(2), o.push(1), o.push(y), o.push(-1), o.push(0), o.push(1), o.push(f)) : !l && r !== e && (h = (e - n) / (r - n), p = (e - i) / (r - i), o.push(2), o.push(-1), o.push(0), o.push(2), o.push(h), o.push(-1), o.push(1), o.push(2), o.push(p)) : d !== 3 && (o.push(0), o.push(1), o.push(2)), o; +}; +Intersections2D.computeBarycentricCoordinates = function(e, t, n, i, r, o, s, c, l) { + const d = n - s, f = s - r, h = o - c, p = i - c, m = 1 / (h * d + f * p), _ = t - c, y = e - s, C = (h * y + f * _) * m, T = (-p * y + d * _) * m, x = 1 - C - T; + return defined(l) ? (l.x = C, l.y = T, l.z = x, l) : new Cartesian3(C, T, x); +}; +Intersections2D.computeLineSegmentLineSegmentIntersection = function(e, t, n, i, r, o, s, c, l) { + const d = (s - r) * (t - o) - (c - o) * (e - r), f = (n - e) * (t - o) - (i - t) * (e - r), h = (c - o) * (n - e) - (s - r) * (i - t); + if (h === 0) + return; + const p = d / h, m = f / h; + if (p >= 0 && p <= 1 && m >= 0 && m <= 1) + return defined(l) || (l = new Cartesian2()), l.x = e + p * (n - e), l.y = t + p * (i - t), l; +}; +function QuantizedMeshTerrainData(e) { + this._quantizedVertices = e.quantizedVertices, this._encodedNormals = e.encodedNormals, this._indices = e.indices, this._minimumHeight = e.minimumHeight, this._maximumHeight = e.maximumHeight, this._boundingSphere = e.boundingSphere, this._orientedBoundingBox = e.orientedBoundingBox, this._horizonOcclusionPoint = e.horizonOcclusionPoint, this._credits = e.credits; + const t = this._quantizedVertices.length / 3, n = this._uValues = this._quantizedVertices.subarray( + 0, + t + ), i = this._vValues = this._quantizedVertices.subarray( + t, + 2 * t + ); + this._heightValues = this._quantizedVertices.subarray( + 2 * t, + 3 * t + ); + function r(s, c) { + return i[s] - i[c]; + } + function o(s, c) { + return n[s] - n[c]; + } + this._westIndices = sortIndicesIfNecessary( + e.westIndices, + r, + t + ), this._southIndices = sortIndicesIfNecessary( + e.southIndices, + o, + t + ), this._eastIndices = sortIndicesIfNecessary( + e.eastIndices, + r, + t + ), this._northIndices = sortIndicesIfNecessary( + e.northIndices, + o, + t + ), this._westSkirtHeight = e.westSkirtHeight, this._southSkirtHeight = e.southSkirtHeight, this._eastSkirtHeight = e.eastSkirtHeight, this._northSkirtHeight = e.northSkirtHeight, this._childTileMask = defaultValue(e.childTileMask, 15), this._createdByUpsampling = defaultValue(e.createdByUpsampling, !1), this._waterMask = e.waterMask, this._mesh = void 0; +} +Object.defineProperties(QuantizedMeshTerrainData.prototype, { + /** + * An array of credits for this tile. + * @memberof QuantizedMeshTerrainData.prototype + * @type {Credit[]} + */ + credits: { + get: function() { + return this._credits; + } + }, + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @memberof QuantizedMeshTerrainData.prototype + * @type {Uint8Array|HTMLImageElement|HTMLCanvasElement} + */ + waterMask: { + get: function() { + return this._waterMask; + } + }, + childTileMask: { + get: function() { + return this._childTileMask; + } + }, + canUpsample: { + get: function() { + return defined(this._mesh); + } + } +}); +const arrayScratch = []; +function sortIndicesIfNecessary(e, t, n) { + arrayScratch.length = e.length; + let i = !1; + for (let r = 0, o = e.length; r < o; ++r) + arrayScratch[r] = e[r], i = i || r > 0 && t(e[r - 1], e[r]) > 0; + return i ? (arrayScratch.sort(t), IndexDatatype$1.createTypedArray(n, arrayScratch)) : e; +} +const createMeshTaskName$1 = "createVerticesFromQuantizedTerrainMesh", createMeshTaskProcessorNoThrottle$1 = new TaskProcessor(createMeshTaskName$1), createMeshTaskProcessorThrottle$1 = new TaskProcessor( + createMeshTaskName$1, + TerrainData.maximumAsynchronousTasks +); +QuantizedMeshTerrainData.prototype.createMesh = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.tilingScheme, n = e.x, i = e.y, r = e.level, o = defaultValue(e.exaggeration, 1), s = defaultValue( + e.exaggerationRelativeHeight, + 0 + ), c = defaultValue(e.throttle, !0), l = t.ellipsoid, d = t.tileXYToRectangle(n, i, r), h = (c ? createMeshTaskProcessorThrottle$1 : createMeshTaskProcessorNoThrottle$1).scheduleTask({ + minimumHeight: this._minimumHeight, + maximumHeight: this._maximumHeight, + quantizedVertices: this._quantizedVertices, + octEncodedNormals: this._encodedNormals, + includeWebMercatorT: !0, + indices: this._indices, + westIndices: this._westIndices, + southIndices: this._southIndices, + eastIndices: this._eastIndices, + northIndices: this._northIndices, + westSkirtHeight: this._westSkirtHeight, + southSkirtHeight: this._southSkirtHeight, + eastSkirtHeight: this._eastSkirtHeight, + northSkirtHeight: this._northSkirtHeight, + rectangle: d, + relativeToCenter: this._boundingSphere.center, + ellipsoid: l, + exaggeration: o, + exaggerationRelativeHeight: s + }); + if (!defined(h)) + return; + const p = this; + return Promise.resolve(h).then(function(m) { + const _ = p._quantizedVertices.length / 3, y = _ + p._westIndices.length + p._southIndices.length + p._eastIndices.length + p._northIndices.length, C = IndexDatatype$1.createTypedArray( + y, + m.indices + ), T = new Float32Array(m.vertices), x = m.center, b = m.minimumHeight, S = m.maximumHeight, E = p._boundingSphere, A = p._orientedBoundingBox, D = defaultValue( + Cartesian3.clone(m.occludeePointInScaledSpace), + p._horizonOcclusionPoint + ), P = m.vertexStride, I = TerrainEncoding.clone(m.encoding); + return p._mesh = new TerrainMesh( + x, + T, + C, + m.indexCountWithoutSkirts, + _, + b, + S, + E, + D, + P, + A, + I, + m.westIndicesSouthToNorth, + m.southIndicesEastToWest, + m.eastIndicesNorthToSouth, + m.northIndicesWestToEast + ), p._quantizedVertices = void 0, p._encodedNormals = void 0, p._indices = void 0, p._uValues = void 0, p._vValues = void 0, p._heightValues = void 0, p._westIndices = void 0, p._southIndices = void 0, p._eastIndices = void 0, p._northIndices = void 0, p._mesh; + }); +}; +const upsampleTaskProcessor$1 = new TaskProcessor( + "upsampleQuantizedTerrainMesh", + TerrainData.maximumAsynchronousTasks +); +QuantizedMeshTerrainData.prototype.upsample = function(e, t, n, i, r, o, s) { + const c = this._mesh; + if (!defined(this._mesh)) + return; + const l = t * 2 !== r, d = n * 2 === o, f = e.ellipsoid, h = e.tileXYToRectangle( + r, + o, + s + ), p = upsampleTaskProcessor$1.scheduleTask({ + vertices: c.vertices, + vertexCountWithoutSkirts: c.vertexCountWithoutSkirts, + indices: c.indices, + indexCountWithoutSkirts: c.indexCountWithoutSkirts, + encoding: c.encoding, + minimumHeight: this._minimumHeight, + maximumHeight: this._maximumHeight, + isEastChild: l, + isNorthChild: d, + childRectangle: h, + ellipsoid: f + }); + if (!defined(p)) + return; + let m = Math.min(this._westSkirtHeight, this._eastSkirtHeight); + m = Math.min(m, this._southSkirtHeight), m = Math.min(m, this._northSkirtHeight); + const _ = l ? m * 0.5 : this._westSkirtHeight, y = d ? m * 0.5 : this._southSkirtHeight, C = l ? this._eastSkirtHeight : m * 0.5, T = d ? this._northSkirtHeight : m * 0.5, x = this._credits; + return Promise.resolve(p).then(function(b) { + const S = new Uint16Array(b.vertices), E = IndexDatatype$1.createTypedArray( + S.length / 3, + b.indices + ); + let A; + return defined(b.encodedNormals) && (A = new Uint8Array(b.encodedNormals)), new QuantizedMeshTerrainData({ + quantizedVertices: S, + indices: E, + encodedNormals: A, + minimumHeight: b.minimumHeight, + maximumHeight: b.maximumHeight, + boundingSphere: BoundingSphere.clone(b.boundingSphere), + orientedBoundingBox: OrientedBoundingBox.clone( + b.orientedBoundingBox + ), + horizonOcclusionPoint: Cartesian3.clone(b.horizonOcclusionPoint), + westIndices: b.westIndices, + southIndices: b.southIndices, + eastIndices: b.eastIndices, + northIndices: b.northIndices, + westSkirtHeight: _, + southSkirtHeight: y, + eastSkirtHeight: C, + northSkirtHeight: T, + childTileMask: 0, + credits: x, + createdByUpsampling: !0 + }); + }); +}; +const maxShort = 32767, barycentricCoordinateScratch$1 = new Cartesian3(); +QuantizedMeshTerrainData.prototype.interpolateHeight = function(e, t, n) { + let i = CesiumMath.clamp( + (t - e.west) / e.width, + 0, + 1 + ); + i *= maxShort; + let r = CesiumMath.clamp( + (n - e.south) / e.height, + 0, + 1 + ); + return r *= maxShort, defined(this._mesh) ? interpolateMeshHeight$1(this, i, r) : interpolateHeight$1(this, i, r); +}; +function pointInBoundingBox(e, t, n, i, r, o, s, c) { + const l = Math.min(n, r, s), d = Math.max(n, r, s), f = Math.min(i, o, c), h = Math.max(i, o, c); + return e >= l && e <= d && t >= f && t <= h; +} +const texCoordScratch0$1 = new Cartesian2(), texCoordScratch1$1 = new Cartesian2(), texCoordScratch2$1 = new Cartesian2(); +function interpolateMeshHeight$1(e, t, n) { + const i = e._mesh, r = i.vertices, o = i.encoding, s = i.indices; + for (let c = 0, l = s.length; c < l; c += 3) { + const d = s[c], f = s[c + 1], h = s[c + 2], p = o.decodeTextureCoordinates( + r, + d, + texCoordScratch0$1 + ), m = o.decodeTextureCoordinates( + r, + f, + texCoordScratch1$1 + ), _ = o.decodeTextureCoordinates( + r, + h, + texCoordScratch2$1 + ); + if (pointInBoundingBox(t, n, p.x, p.y, m.x, m.y, _.x, _.y)) { + const y = Intersections2D.computeBarycentricCoordinates( + t, + n, + p.x, + p.y, + m.x, + m.y, + _.x, + _.y, + barycentricCoordinateScratch$1 + ); + if (y.x >= -1e-15 && y.y >= -1e-15 && y.z >= -1e-15) { + const C = o.decodeHeight(r, d), T = o.decodeHeight(r, f), x = o.decodeHeight(r, h); + return y.x * C + y.y * T + y.z * x; + } + } + } +} +function interpolateHeight$1(e, t, n) { + const i = e._uValues, r = e._vValues, o = e._heightValues, s = e._indices; + for (let c = 0, l = s.length; c < l; c += 3) { + const d = s[c], f = s[c + 1], h = s[c + 2], p = i[d], m = i[f], _ = i[h], y = r[d], C = r[f], T = r[h]; + if (pointInBoundingBox(t, n, p, y, m, C, _, T)) { + const x = Intersections2D.computeBarycentricCoordinates( + t, + n, + p, + y, + m, + C, + _, + T, + barycentricCoordinateScratch$1 + ); + if (x.x >= -1e-15 && x.y >= -1e-15 && x.z >= -1e-15) { + const b = x.x * o[d] + x.y * o[f] + x.z * o[h]; + return CesiumMath.lerp( + e._minimumHeight, + e._maximumHeight, + b / maxShort + ); + } + } + } +} +QuantizedMeshTerrainData.prototype.isChildAvailable = function(e, t, n, i) { + let r = 2; + return n !== e * 2 && ++r, i !== t * 2 && (r -= 2), (this._childTileMask & 1 << r) !== 0; +}; +QuantizedMeshTerrainData.prototype.wasCreatedByUpsampling = function() { + return this._createdByUpsampling; +}; +function LayerInformation(e) { + this.resource = e.resource, this.version = e.version, this.isHeightmap = e.isHeightmap, this.tileUrlTemplates = e.tileUrlTemplates, this.availability = e.availability, this.hasVertexNormals = e.hasVertexNormals, this.hasWaterMask = e.hasWaterMask, this.hasMetadata = e.hasMetadata, this.availabilityLevels = e.availabilityLevels, this.availabilityTilesLoaded = e.availabilityTilesLoaded, this.littleEndianExtensionSize = e.littleEndianExtensionSize, this.availabilityPromiseCache = {}; +} +function TerrainProviderBuilder$1(e) { + this.requestVertexNormals = defaultValue(e.requestVertexNormals, !1), this.requestWaterMask = defaultValue(e.requestWaterMask, !1), this.requestMetadata = defaultValue(e.requestMetadata, !0), this.ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this.heightmapWidth = 65, this.heightmapStructure = void 0, this.hasWaterMask = !1, this.hasMetadata = !1, this.hasVertexNormals = !1, this.scheme = void 0, this.lastResource = void 0, this.layerJsonResource = void 0, this.previousError = void 0, this.availability = void 0, this.tilingScheme = void 0, this.levelZeroMaximumGeometricError = void 0, this.heightmapStructure = void 0, this.layers = [], this.attribution = "", this.overallAvailability = [], this.overallMaxZoom = 0, this.tileCredits = []; +} +TerrainProviderBuilder$1.prototype.build = function(e) { + e._heightmapWidth = this.heightmapWidth, e._scheme = this.scheme; + const t = defined(this.lastResource.credits) ? this.lastResource.credits : []; + e._tileCredits = t.concat(this.tileCredits), e._availability = this.availability, e._tilingScheme = this.tilingScheme, e._requestWaterMask = this.requestWaterMask, e._levelZeroMaximumGeometricError = this.levelZeroMaximumGeometricError, e._heightmapStructure = this.heightmapStructure, e._layers = this.layers, e._hasWaterMask = this.hasWaterMask, e._hasVertexNormals = this.hasVertexNormals, e._hasMetadata = this.hasMetadata; +}; +async function parseMetadataSuccess(e, t, n) { + if (!t.format) { + const y = "The tile format is not specified in the layer.json file."; + throw e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + y + ), new RuntimeError(y); + } + if (!t.tiles || t.tiles.length === 0) { + const y = "The layer.json file does not specify any tile URL templates."; + throw e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + y + ), new RuntimeError(y); + } + let i = !1, r = !1, o = !1, s = !0, c = !1; + if (t.format === "heightmap-1.0") + c = !0, defined(e.heightmapStructure) || (e.heightmapStructure = { + heightScale: 1 / 5, + heightOffset: -1e3, + elementsPerHeight: 1, + stride: 1, + elementMultiplier: 256, + isBigEndian: !1, + lowestEncodedHeight: 0, + highestEncodedHeight: 256 * 256 - 1 + }), r = !0, e.requestWaterMask = !0; + else if (t.format.indexOf("quantized-mesh-1.") !== 0) { + const y = `The tile format "${t.format}" is invalid or not supported.`; + throw e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + y + ), new RuntimeError(y); + } + const l = t.tiles, d = t.maxzoom; + if (e.overallMaxZoom = Math.max( + e.overallMaxZoom, + d + ), !t.projection || t.projection === "EPSG:4326") + e.tilingScheme = new GeographicTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 1, + ellipsoid: e.ellipsoid + }); + else if (t.projection === "EPSG:3857") + e.tilingScheme = new WebMercatorTilingScheme({ + numberOfLevelZeroTilesX: 1, + numberOfLevelZeroTilesY: 1, + ellipsoid: e.ellipsoid + }); + else { + const y = `The projection "${t.projection}" is invalid or not supported.`; + throw e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + y + ), new RuntimeError(y); + } + if (e.levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + e.tilingScheme.ellipsoid, + e.heightmapWidth, + e.tilingScheme.getNumberOfXTilesAtLevel(0) + ), !t.scheme || t.scheme === "tms" || t.scheme === "slippyMap") + e.scheme = t.scheme; + else { + const y = `The scheme "${t.scheme}" is invalid or not supported.`; + throw e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + y + ), new RuntimeError(y); + } + let f; + defined(t.extensions) && t.extensions.indexOf("octvertexnormals") !== -1 ? i = !0 : defined(t.extensions) && t.extensions.indexOf("vertexnormals") !== -1 && (i = !0, s = !1), defined(t.extensions) && t.extensions.indexOf("watermask") !== -1 && (r = !0), defined(t.extensions) && t.extensions.indexOf("metadata") !== -1 && (o = !0); + const h = t.metadataAvailability, p = t.available; + let m; + if (defined(p) && !defined(h)) { + m = new TileAvailability( + e.tilingScheme, + p.length + ); + for (let y = 0; y < p.length; ++y) { + const C = p[y], T = e.tilingScheme.getNumberOfYTilesAtLevel( + y + ); + defined(e.overallAvailability[y]) || (e.overallAvailability[y] = []); + for (let x = 0; x < C.length; ++x) { + const b = C[x], S = T - b.endY - 1, E = T - b.startY - 1; + e.overallAvailability[y].push([ + b.startX, + S, + b.endX, + E + ]), m.addAvailableTileRange( + y, + b.startX, + S, + b.endX, + E + ); + } + } + } else defined(h) && (f = new TileAvailability( + e.tilingScheme, + d + ), m = new TileAvailability( + e.tilingScheme, + d + ), e.overallAvailability[0] = [[0, 0, 1, 0]], m.addAvailableTileRange(0, 0, 0, 1, 0)); + e.hasWaterMask = e.hasWaterMask || r, e.hasVertexNormals = e.hasVertexNormals || i, e.hasMetadata = e.hasMetadata || o, defined(t.attribution) && (e.attribution.length > 0 && (e.attribution += " "), e.attribution += t.attribution), e.layers.push( + new LayerInformation({ + resource: e.lastResource, + version: t.version, + isHeightmap: c, + tileUrlTemplates: l, + availability: m, + hasVertexNormals: i, + hasWaterMask: r, + hasMetadata: o, + availabilityLevels: h, + availabilityTilesLoaded: f, + littleEndianExtensionSize: s + }) + ); + const _ = t.parentUrl; + return defined(_) ? defined(m) ? (e.lastResource = e.lastResource.getDerivedResource( + { + url: _ + } + ), e.lastResource.appendForwardSlash(), e.layerJsonResource = e.lastResource.getDerivedResource( + { + url: "layer.json" + } + ), await requestLayerJson(e), !0) : (console.log( + "A layer.json can't have a parentUrl if it does't have an available array." + ), !0) : !0; +} +function parseMetadataFailure(e, t, n) { + let i = `An error occurred while accessing ${e.layerJsonResource.url}.`; + if (defined(t) && (i += ` +${t.message}`), e.previousError = TileProviderError.reportError( + e.previousError, + n, + defined(n) ? n._errorEvent : void 0, + i + ), e.previousError.retry) + return requestLayerJson(e, n); + throw new RuntimeError(i); +} +async function metadataSuccess$1(e, t, n) { + await parseMetadataSuccess(e, t, n); + const i = e.overallAvailability.length; + if (i > 0) { + const r = e.availability = new TileAvailability( + e.tilingScheme, + e.overallMaxZoom + ); + for (let o = 0; o < i; ++o) { + const s = e.overallAvailability[o]; + for (let c = 0; c < s.length; ++c) { + const l = s[c]; + r.addAvailableTileRange( + o, + l[0], + l[1], + l[2], + l[3] + ); + } + } + } + if (e.attribution.length > 0) { + const r = new Credit(e.attribution); + e.tileCredits.push(r); + } + return !0; +} +async function requestLayerJson(e, t) { + try { + const n = await e.layerJsonResource.fetchJson(); + return metadataSuccess$1(e, n, t); + } catch (n) { + return defined(n) && n.statusCode === 404 ? (await parseMetadataSuccess( + e, + { + tilejson: "2.1.0", + format: "heightmap-1.0", + version: "1.0.0", + scheme: "tms", + tiles: ["{z}/{x}/{y}.terrain?v={version}"] + }, + t + ), !0) : parseMetadataFailure(e, n, t); + } +} +function CesiumTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._heightmapWidth = void 0, this._heightmapStructure = void 0, this._hasWaterMask = !1, this._hasVertexNormals = !1, this._hasMetadata = !1, this._scheme = void 0, this._ellipsoid = e.ellipsoid, this._requestVertexNormals = defaultValue( + e.requestVertexNormals, + !1 + ), this._requestWaterMask = defaultValue(e.requestWaterMask, !1), this._requestMetadata = defaultValue(e.requestMetadata, !0), this._errorEvent = new Event(); + let t = e.credit; + typeof t == "string" && (t = new Credit(t)), this._credit = t, this._availability = void 0, this._tilingScheme = void 0, this._levelZeroMaximumGeometricError = void 0, this._layers = void 0, this._tileCredits = void 0; +} +const QuantizedMeshExtensionIds = { + /** + * Oct-Encoded Per-Vertex Normals are included as an extension to the tile mesh + * + * @type {number} + * @constant + * @default 1 + */ + OCT_VERTEX_NORMALS: 1, + /** + * A watermask is included as an extension to the tile mesh + * + * @type {number} + * @constant + * @default 2 + */ + WATER_MASK: 2, + /** + * A json object contain metadata about the tile + * + * @type {number} + * @constant + * @default 4 + */ + METADATA: 4 +}; +function getRequestHeader(e) { + return !defined(e) || e.length === 0 ? { + Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01" + } : { + Accept: `application/vnd.quantized-mesh;extensions=${e.join("-")},application/octet-stream;q=0.9,*/*;q=0.01` + }; +} +function createHeightmapTerrainData(e, t, n, i, r) { + const o = new Uint16Array( + t, + 0, + e._heightmapWidth * e._heightmapWidth + ); + return new HeightmapTerrainData({ + buffer: o, + childTileMask: new Uint8Array(t, o.byteLength, 1)[0], + waterMask: new Uint8Array( + t, + o.byteLength + 1, + t.byteLength - o.byteLength - 1 + ), + width: e._heightmapWidth, + height: e._heightmapWidth, + structure: e._heightmapStructure, + credits: e._tileCredits + }); +} +function createQuantizedMeshTerrainData(e, t, n, i, r, o) { + const s = o.littleEndianExtensionSize; + let c = 0; + const l = 3, d = l + 1, f = Float64Array.BYTES_PER_ELEMENT * l, h = Float64Array.BYTES_PER_ELEMENT * d, m = Uint16Array.BYTES_PER_ELEMENT * 3, _ = 3; + let y = Uint16Array.BYTES_PER_ELEMENT, C = y * _; + const T = new DataView(t), x = new Cartesian3( + T.getFloat64(c, !0), + T.getFloat64(c + 8, !0), + T.getFloat64(c + 16, !0) + ); + c += f; + const b = T.getFloat32(c, !0); + c += Float32Array.BYTES_PER_ELEMENT; + const S = T.getFloat32(c, !0); + c += Float32Array.BYTES_PER_ELEMENT; + const E = new BoundingSphere( + new Cartesian3( + T.getFloat64(c, !0), + T.getFloat64(c + 8, !0), + T.getFloat64(c + 16, !0) + ), + T.getFloat64(c + f, !0) + ); + c += h; + const A = new Cartesian3( + T.getFloat64(c, !0), + T.getFloat64(c + 8, !0), + T.getFloat64(c + 16, !0) + ); + c += f; + const D = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const P = new Uint16Array(t, c, D * 3); + c += D * m, D > 64 * 1024 && (y = Uint32Array.BYTES_PER_ELEMENT, C = y * _); + const I = P.subarray(0, D), M = P.subarray(D, 2 * D), R = P.subarray( + D * 2, + 3 * D + ); + AttributeCompression.zigZagDeltaDecode(I, M, R), c % y !== 0 && (c += y - c % y); + const L = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const g = IndexDatatype$1.createTypedArrayFromArrayBuffer( + D, + t, + c, + L * _ + ); + c += L * C; + let w = 0; + const O = g.length; + for (let K = 0; K < O; ++K) { + const Z = g[K]; + g[K] = w - Z, Z === 0 && ++w; + } + const N = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const F = IndexDatatype$1.createTypedArrayFromArrayBuffer( + D, + t, + c, + N + ); + c += N * y; + const B = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const V = IndexDatatype$1.createTypedArrayFromArrayBuffer( + D, + t, + c, + B + ); + c += B * y; + const U = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const k = IndexDatatype$1.createTypedArrayFromArrayBuffer( + D, + t, + c, + U + ); + c += U * y; + const $ = T.getUint32(c, !0); + c += Uint32Array.BYTES_PER_ELEMENT; + const G = IndexDatatype$1.createTypedArrayFromArrayBuffer( + D, + t, + c, + $ + ); + c += $ * y; + let q, z; + for (; c < T.byteLength; ) { + const K = T.getUint8(c, !0); + c += Uint8Array.BYTES_PER_ELEMENT; + const Z = T.getUint32(c, s); + if (c += Uint32Array.BYTES_PER_ELEMENT, K === QuantizedMeshExtensionIds.OCT_VERTEX_NORMALS && e._requestVertexNormals) + q = new Uint8Array(t, c, D * 2); + else if (K === QuantizedMeshExtensionIds.WATER_MASK && e._requestWaterMask) + z = new Uint8Array(t, c, Z); + else if (K === QuantizedMeshExtensionIds.METADATA && e._requestMetadata) { + const ee = T.getUint32(c, !0); + if (ee > 0) { + const X = getJsonFromTypedArray( + new Uint8Array(t), + c + Uint32Array.BYTES_PER_ELEMENT, + ee + ).available; + if (defined(X)) + for (let fe = 0; fe < X.length; ++fe) { + const de = n + fe + 1, ce = X[fe], ye = e._tilingScheme.getNumberOfYTilesAtLevel( + de + ); + for (let ge = 0; ge < ce.length; ++ge) { + const re = ce[ge], be = ye - re.endY - 1, pe = ye - re.startY - 1; + e.availability.addAvailableTileRange( + de, + re.startX, + be, + re.endX, + pe + ), o.availability.addAvailableTileRange( + de, + re.startX, + be, + re.endX, + pe + ); + } + } + } + o.availabilityTilesLoaded.addAvailableTileRange(n, i, r, i, r); + } + c += Z; + } + const H = e.getLevelMaximumGeometricError(n) * 5, Q = e._tilingScheme.tileXYToRectangle(i, r, n), ne = OrientedBoundingBox.fromRectangle( + Q, + b, + S, + e._tilingScheme.ellipsoid + ); + return new QuantizedMeshTerrainData({ + center: x, + minimumHeight: b, + maximumHeight: S, + boundingSphere: E, + orientedBoundingBox: ne, + horizonOcclusionPoint: A, + quantizedVertices: P, + encodedNormals: q, + indices: g, + westIndices: F, + southIndices: V, + eastIndices: k, + northIndices: G, + westSkirtHeight: H, + southSkirtHeight: H, + eastSkirtHeight: H, + northSkirtHeight: H, + childTileMask: e.availability.computeChildMaskForTile(n, i, r), + waterMask: z, + credits: e._tileCredits + }); +} +CesiumTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + const r = this._layers; + let o; + const s = r.length; + let c = !1, l = Promise.resolve(); + if (s === 1) + o = r[0]; + else + for (let d = 0; d < s; ++d) { + const f = r[d]; + if (!defined(f.availability) || f.availability.isTileAvailable(n, e, t)) { + o = f; + break; + } + const h = checkLayer( + this, + e, + t, + n, + f, + d === 0 + ); + h.result && (c = !0, l = l.then( + () => h.promise + )); + } + return !defined(o) && c ? l.then(() => new Promise((d) => { + setTimeout(() => { + const f = this.requestTileGeometry(e, t, n, i); + d(f); + }, 0); + })) : requestTileGeometry(this, e, t, n, o, i); +}; +function requestTileGeometry(e, t, n, i, r, o) { + if (!defined(r)) + return Promise.reject(new RuntimeError("Terrain tile doesn't exist")); + const s = r.tileUrlTemplates; + if (s.length === 0) + return; + let c; + !e._scheme || e._scheme === "tms" ? c = e._tilingScheme.getNumberOfYTilesAtLevel(i) - n - 1 : c = n; + const l = []; + e._requestVertexNormals && r.hasVertexNormals && l.push( + r.littleEndianExtensionSize ? "octvertexnormals" : "vertexnormals" + ), e._requestWaterMask && r.hasWaterMask && l.push("watermask"), e._requestMetadata && r.hasMetadata && l.push("metadata"); + let d, f; + const h = s[(t + c + i) % s.length], p = r.resource; + defined(p._ionEndpoint) && !defined(p._ionEndpoint.externalType) ? (l.length !== 0 && (f = { extensions: l.join("-") }), d = getRequestHeader(void 0)) : d = getRequestHeader(l); + const m = p.getDerivedResource({ + url: h, + templateValues: { + version: r.version, + z: i, + x: t, + y: c + }, + queryParameters: f, + headers: d, + request: o + }).fetchArrayBuffer(); + if (defined(m)) + return m.then(function(_) { + return defined(_) ? defined(e._heightmapStructure) ? createHeightmapTerrainData(e, _) : createQuantizedMeshTerrainData( + e, + _, + i, + t, + n, + r + ) : Promise.reject(new RuntimeError("Mesh buffer doesn't exist.")); + }); +} +Object.defineProperties(CesiumTerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof CesiumTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof CesiumTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof CesiumTerrainProvider.prototype + * @type {GeographicTilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return this._hasWaterMask && this._requestWaterMask; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return this._hasVertexNormals && this._requestVertexNormals; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include metadata. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasMetadata: { + get: function() { + return this._hasMetadata && this._requestMetadata; + } + }, + /** + * Boolean flag that indicates if the client should request vertex normals from the server. + * Vertex normals data is appended to the standard tile mesh data only if the client requests the vertex normals and + * if the server provides vertex normals. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + requestVertexNormals: { + get: function() { + return this._requestVertexNormals; + } + }, + /** + * Boolean flag that indicates if the client should request a watermask from the server. + * Watermask data is appended to the standard tile mesh data only if the client requests the watermask and + * if the server provides a watermask. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + requestWaterMask: { + get: function() { + return this._requestWaterMask; + } + }, + /** + * Boolean flag that indicates if the client should request metadata from the server. + * Metadata is appended to the standard tile mesh data only if the client requests the metadata and + * if the server provides a metadata. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + requestMetadata: { + get: function() { + return this._requestMetadata; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. Note that this reflects tiles that are known to be available currently. + * Additional tiles may be discovered to be available in the future, e.g. if availability information + * exists deeper in the tree rather than it all being discoverable at the root. However, a tile that + * is available now will not become unavailable in the future. + * @memberof CesiumTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + return this._availability; + } + } +}); +CesiumTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +CesiumTerrainProvider.fromIonAssetId = async function(e, t) { + const n = await IonResource.fromAssetId(e); + return CesiumTerrainProvider.fromUrl(n, t); +}; +CesiumTerrainProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT), e = await Promise.resolve(e); + const n = Resource.createIfNeeded(e); + n.appendForwardSlash(); + const i = new TerrainProviderBuilder$1(t); + i.lastResource = n, i.layerJsonResource = i.lastResource.getDerivedResource( + { + url: "layer.json" + } + ), await requestLayerJson(i); + const r = new CesiumTerrainProvider(t); + return i.build(r), r; +}; +CesiumTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { + if (!defined(this._availability)) + return; + if (n > this._availability._maximumLevel) + return !1; + if (this._availability.isTileAvailable(n, e, t)) + return !0; + if (!this._hasMetadata) + return !1; + const i = this._layers, r = i.length; + for (let o = 0; o < r; ++o) + if (checkLayer(this, e, t, n, i[o], o === 0).result) + return; + return !1; +}; +CesiumTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { + if (!defined(this._availability) || n > this._availability._maximumLevel || this._availability.isTileAvailable(n, e, t) || !this._hasMetadata) + return; + const i = this._layers, r = i.length; + for (let o = 0; o < r; ++o) { + const s = checkLayer(this, e, t, n, i[o], o === 0); + if (defined(s.promise)) + return s.promise; + } +}; +function getAvailabilityTile(e, t, n, i) { + if (i === 0) + return; + const r = e.availabilityLevels, o = i % r === 0 ? i - r : (i / r | 0) * r, s = 1 << i - o, c = t / s | 0, l = n / s | 0; + return { + level: o, + x: c, + y: l + }; +} +function checkLayer(e, t, n, i, r, o) { + if (!defined(r.availabilityLevels)) + return { + result: !1 + }; + let s; + const c = function() { + delete r.availabilityPromiseCache[s]; + }, l = r.availabilityTilesLoaded, d = r.availability; + let f = getAvailabilityTile(r, t, n, i); + for (; defined(f); ) { + if (d.isTileAvailable(f.level, f.x, f.y) && !l.isTileAvailable(f.level, f.x, f.y)) { + let h; + if (!o && (s = `${f.level}-${f.x}-${f.y}`, h = r.availabilityPromiseCache[s], !defined(h))) { + const p = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.TERRAIN + }); + h = requestTileGeometry( + e, + f.x, + f.y, + f.level, + r, + p + ), defined(h) && (r.availabilityPromiseCache[s] = h, h.then(c)); + } + return { + result: !0, + promise: h + }; + } + f = getAvailabilityTile(r, f.x, f.y, f.level); + } + return { + result: !1 + }; +} +CesiumTerrainProvider._getAvailabilityTile = getAvailabilityTile; +function CircleGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.radius, n = { + center: e.center, + semiMajorAxis: t, + semiMinorAxis: t, + ellipsoid: e.ellipsoid, + height: e.height, + extrudedHeight: e.extrudedHeight, + granularity: e.granularity, + vertexFormat: e.vertexFormat, + stRotation: e.stRotation, + shadowVolume: e.shadowVolume + }; + this._ellipseGeometry = new EllipseGeometry(n), this._workerName = "createCircleGeometry"; +} +CircleGeometry.packedLength = EllipseGeometry.packedLength; +CircleGeometry.pack = function(e, t, n) { + return EllipseGeometry.pack(e._ellipseGeometry, t, n); +}; +const scratchEllipseGeometry$1 = new EllipseGeometry({ + center: new Cartesian3(), + semiMajorAxis: 1, + semiMinorAxis: 1 +}), scratchOptions$2 = { + center: new Cartesian3(), + radius: void 0, + ellipsoid: Ellipsoid.clone(Ellipsoid.default), + height: void 0, + extrudedHeight: void 0, + granularity: void 0, + vertexFormat: new VertexFormat(), + stRotation: void 0, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + shadowVolume: void 0 +}; +CircleGeometry.unpack = function(e, t, n) { + const i = EllipseGeometry.unpack( + e, + t, + scratchEllipseGeometry$1 + ); + return scratchOptions$2.center = Cartesian3.clone( + i._center, + scratchOptions$2.center + ), scratchOptions$2.ellipsoid = Ellipsoid.clone( + i._ellipsoid, + scratchOptions$2.ellipsoid + ), scratchOptions$2.ellipsoid = Ellipsoid.clone( + i._ellipsoid, + scratchEllipseGeometry$1._ellipsoid + ), scratchOptions$2.height = i._height, scratchOptions$2.extrudedHeight = i._extrudedHeight, scratchOptions$2.granularity = i._granularity, scratchOptions$2.vertexFormat = VertexFormat.clone( + i._vertexFormat, + scratchOptions$2.vertexFormat + ), scratchOptions$2.stRotation = i._stRotation, scratchOptions$2.shadowVolume = i._shadowVolume, defined(n) ? (scratchOptions$2.semiMajorAxis = i._semiMajorAxis, scratchOptions$2.semiMinorAxis = i._semiMinorAxis, n._ellipseGeometry = new EllipseGeometry(scratchOptions$2), n) : (scratchOptions$2.radius = i._semiMajorAxis, new CircleGeometry(scratchOptions$2)); +}; +CircleGeometry.createGeometry = function(e) { + return EllipseGeometry.createGeometry(e._ellipseGeometry); +}; +CircleGeometry.createShadowVolume = function(e, t, n) { + const i = e._ellipseGeometry._granularity, r = e._ellipseGeometry._ellipsoid, o = t(i, r), s = n(i, r); + return new CircleGeometry({ + center: e._ellipseGeometry._center, + radius: e._ellipseGeometry._semiMajorAxis, + ellipsoid: r, + stRotation: e._ellipseGeometry._stRotation, + granularity: i, + extrudedHeight: o, + height: s, + vertexFormat: VertexFormat.POSITION_ONLY, + shadowVolume: !0 + }); +}; +Object.defineProperties(CircleGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + return this._ellipseGeometry.rectangle; + } + }, + /** + * For remapping texture coordinates when rendering CircleGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return this._ellipseGeometry.textureCoordinateRotationPoints; + } + } +}); +function CircleOutlineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.radius, n = { + center: e.center, + semiMajorAxis: t, + semiMinorAxis: t, + ellipsoid: e.ellipsoid, + height: e.height, + extrudedHeight: e.extrudedHeight, + granularity: e.granularity, + numberOfVerticalLines: e.numberOfVerticalLines + }; + this._ellipseGeometry = new EllipseOutlineGeometry(n), this._workerName = "createCircleOutlineGeometry"; +} +CircleOutlineGeometry.packedLength = EllipseOutlineGeometry.packedLength; +CircleOutlineGeometry.pack = function(e, t, n) { + return EllipseOutlineGeometry.pack( + e._ellipseGeometry, + t, + n + ); +}; +const scratchEllipseGeometry = new EllipseOutlineGeometry({ + center: new Cartesian3(), + semiMajorAxis: 1, + semiMinorAxis: 1 +}), scratchOptions$1 = { + center: new Cartesian3(), + radius: void 0, + ellipsoid: Ellipsoid.clone(Ellipsoid.UNIT_SPHERE), + height: void 0, + extrudedHeight: void 0, + granularity: void 0, + numberOfVerticalLines: void 0, + semiMajorAxis: void 0, + semiMinorAxis: void 0 +}; +CircleOutlineGeometry.unpack = function(e, t, n) { + const i = EllipseOutlineGeometry.unpack( + e, + t, + scratchEllipseGeometry + ); + return scratchOptions$1.center = Cartesian3.clone( + i._center, + scratchOptions$1.center + ), scratchOptions$1.ellipsoid = Ellipsoid.clone( + i._ellipsoid, + scratchOptions$1.ellipsoid + ), scratchOptions$1.height = i._height, scratchOptions$1.extrudedHeight = i._extrudedHeight, scratchOptions$1.granularity = i._granularity, scratchOptions$1.numberOfVerticalLines = i._numberOfVerticalLines, defined(n) ? (scratchOptions$1.semiMajorAxis = i._semiMajorAxis, scratchOptions$1.semiMinorAxis = i._semiMinorAxis, n._ellipseGeometry = new EllipseOutlineGeometry(scratchOptions$1), n) : (scratchOptions$1.radius = i._semiMajorAxis, new CircleOutlineGeometry(scratchOptions$1)); +}; +CircleOutlineGeometry.createGeometry = function(e) { + return EllipseOutlineGeometry.createGeometry(e._ellipseGeometry); +}; +function CustomHeightmapTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._callback = e.callback, this._tilingScheme = e.tilingScheme, defined(this._tilingScheme) || (this._tilingScheme = new GeographicTilingScheme({ + ellipsoid: defaultValue(e.ellipsoid, Ellipsoid.default) + })), this._width = e.width, this._height = e.height; + const t = Math.max(this._width, this._height); + this._levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + this._tilingScheme.ellipsoid, + t, + this._tilingScheme.getNumberOfXTilesAtLevel(0) + ), this._errorEvent = new Event(); + let n = e.credit; + typeof n == "string" && (n = new Credit(n)), this._credit = n; +} +Object.defineProperties(CustomHeightmapTerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * Water mask is not supported by {@link CustomHeightmapTerrainProvider}, so the return + * value will always be false. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return !1; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * Vertex normals are not supported by {@link CustomHeightmapTerrainProvider}, so the return + * value will always be false. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return !1; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + } + }, + /** + * Gets the number of columns per heightmap tile. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + width: { + get: function() { + return this._width; + } + }, + /** + * Gets the number of rows per heightmap tile. + * @memberof CustomHeightmapTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + height: { + get: function() { + return this._height; + } + } +}); +CustomHeightmapTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + const r = this._callback(e, t, n); + if (!defined(r)) + return; + const o = this._width, s = this._height; + return Promise.resolve(r).then(function(c) { + let l = c; + return Array.isArray(l) && (l = new Float64Array(l)), new HeightmapTerrainData({ + buffer: l, + width: o, + height: s + }); + }); +}; +CustomHeightmapTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +CustomHeightmapTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { +}; +CustomHeightmapTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { +}; +function DefaultProxy(e) { + this.proxy = e; +} +DefaultProxy.prototype.getURL = function(e) { + const t = this.proxy.indexOf("?") === -1 ? "?" : ""; + return this.proxy + t + encodeURIComponent(e); +}; +const GeocodeType = { + /** + * Perform a search where the input is considered complete. + * + * @type {number} + * @constant + */ + SEARCH: 0, + /** + * Perform an auto-complete using partial input, typically + * reserved for providing possible results as a user is typing. + * + * @type {number} + * @constant + */ + AUTOCOMPLETE: 1 +}, GeocodeType$1 = Object.freeze(GeocodeType); +function GeocoderService() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(GeocoderService.prototype, { + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof GeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: DeveloperError.throwInstantiationError + } +}); +GeocoderService.getCreditsFromResult = function(e) { + if (defined(e.attributions)) + return e.attributions.map(Credit.getIonCredit); +}; +GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; +function GeometryFactory() { + DeveloperError.throwInstantiationError(); +} +GeometryFactory.createGeometry = function(e) { + DeveloperError.throwInstantiationError(); +}; +var protobuf$2 = { exports: {} }; +/*! + * protobuf.js v7.3.0 (c) 2016, daniel wirtz + * compiled fri, 10 may 2024 03:38:34 utc + * licensed under the bsd-3-clause license + * see: https://github.com/dcodeio/protobuf.js for details + */ +(function(module) { + (function(undefined$1) { + (function(t, n, i) { + function r(s) { + var c = n[s]; + return c || t[s][0].call(c = n[s] = { exports: {} }, r, c, c.exports), c.exports; + } + var o = r(i[0]); + o.util.global.protobuf = o, module && module.exports && (module.exports = o); + })({ 1: [function(e, t, n) { + t.exports = i; + function i(r, o) { + for (var s = new Array(arguments.length - 1), c = 0, l = 2, d = !0; l < arguments.length; ) + s[c++] = arguments[l++]; + return new Promise(function(h, p) { + s[c] = function(_) { + if (d) + if (d = !1, _) + p(_); + else { + for (var y = new Array(arguments.length - 1), C = 0; C < y.length; ) + y[C++] = arguments[C]; + h.apply(null, y); + } + }; + try { + r.apply(o || null, s); + } catch (m) { + d && (d = !1, p(m)); + } + }); + } + }, {}], 2: [function(e, t, n) { + var i = n; + i.length = function(d) { + var f = d.length; + if (!f) + return 0; + for (var h = 0; --f % 4 > 1 && d.charAt(f) === "="; ) + ++h; + return Math.ceil(d.length * 3) / 4 - h; + }; + for (var r = new Array(64), o = new Array(123), s = 0; s < 64; ) + o[r[s] = s < 26 ? s + 65 : s < 52 ? s + 71 : s < 62 ? s - 4 : s - 59 | 43] = s++; + i.encode = function(d, f, h) { + for (var p = null, m = [], _ = 0, y = 0, C; f < h; ) { + var T = d[f++]; + switch (y) { + case 0: + m[_++] = r[T >> 2], C = (T & 3) << 4, y = 1; + break; + case 1: + m[_++] = r[C | T >> 4], C = (T & 15) << 2, y = 2; + break; + case 2: + m[_++] = r[C | T >> 6], m[_++] = r[T & 63], y = 0; + break; + } + _ > 8191 && ((p || (p = [])).push(String.fromCharCode.apply(String, m)), _ = 0); + } + return y && (m[_++] = r[C], m[_++] = 61, y === 1 && (m[_++] = 61)), p ? (_ && p.push(String.fromCharCode.apply(String, m.slice(0, _))), p.join("")) : String.fromCharCode.apply(String, m.slice(0, _)); + }; + var c = "invalid encoding"; + i.decode = function(d, f, h) { + for (var p = h, m = 0, _, y = 0; y < d.length; ) { + var C = d.charCodeAt(y++); + if (C === 61 && m > 1) + break; + if ((C = o[C]) === undefined$1) + throw Error(c); + switch (m) { + case 0: + _ = C, m = 1; + break; + case 1: + f[h++] = _ << 2 | (C & 48) >> 4, _ = C, m = 2; + break; + case 2: + f[h++] = (_ & 15) << 4 | (C & 60) >> 2, _ = C, m = 3; + break; + case 3: + f[h++] = (_ & 3) << 6 | C, m = 0; + break; + } + } + if (m === 1) + throw Error(c); + return h - p; + }, i.test = function(d) { + return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(d); + }; + }, {}], 3: [function(e, t, n) { + t.exports = i; + function i() { + this._listeners = {}; + } + i.prototype.on = function(o, s, c) { + return (this._listeners[o] || (this._listeners[o] = [])).push({ + fn: s, + ctx: c || this + }), this; + }, i.prototype.off = function(o, s) { + if (o === undefined$1) + this._listeners = {}; + else if (s === undefined$1) + this._listeners[o] = []; + else + for (var c = this._listeners[o], l = 0; l < c.length; ) + c[l].fn === s ? c.splice(l, 1) : ++l; + return this; + }, i.prototype.emit = function(o) { + var s = this._listeners[o]; + if (s) { + for (var c = [], l = 1; l < arguments.length; ) + c.push(arguments[l++]); + for (l = 0; l < s.length; ) + s[l].fn.apply(s[l++].ctx, c); + } + return this; + }; + }, {}], 4: [function(e, t, n) { + t.exports = i(i); + function i(l) { + return typeof Float32Array < "u" ? function() { + var d = new Float32Array([-0]), f = new Uint8Array(d.buffer), h = f[3] === 128; + function p(C, T, x) { + d[0] = C, T[x] = f[0], T[x + 1] = f[1], T[x + 2] = f[2], T[x + 3] = f[3]; + } + function m(C, T, x) { + d[0] = C, T[x] = f[3], T[x + 1] = f[2], T[x + 2] = f[1], T[x + 3] = f[0]; + } + l.writeFloatLE = h ? p : m, l.writeFloatBE = h ? m : p; + function _(C, T) { + return f[0] = C[T], f[1] = C[T + 1], f[2] = C[T + 2], f[3] = C[T + 3], d[0]; + } + function y(C, T) { + return f[3] = C[T], f[2] = C[T + 1], f[1] = C[T + 2], f[0] = C[T + 3], d[0]; + } + l.readFloatLE = h ? _ : y, l.readFloatBE = h ? y : _; + }() : function() { + function d(h, p, m, _) { + var y = p < 0 ? 1 : 0; + if (y && (p = -p), p === 0) + h(1 / p > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), m, _); + else if (isNaN(p)) + h(2143289344, m, _); + else if (p > 34028234663852886e22) + h((y << 31 | 2139095040) >>> 0, m, _); + else if (p < 11754943508222875e-54) + h((y << 31 | Math.round(p / 1401298464324817e-60)) >>> 0, m, _); + else { + var C = Math.floor(Math.log(p) / Math.LN2), T = Math.round(p * Math.pow(2, -C) * 8388608) & 8388607; + h((y << 31 | C + 127 << 23 | T) >>> 0, m, _); + } + } + l.writeFloatLE = d.bind(null, r), l.writeFloatBE = d.bind(null, o); + function f(h, p, m) { + var _ = h(p, m), y = (_ >> 31) * 2 + 1, C = _ >>> 23 & 255, T = _ & 8388607; + return C === 255 ? T ? NaN : y * (1 / 0) : C === 0 ? y * 1401298464324817e-60 * T : y * Math.pow(2, C - 150) * (T + 8388608); + } + l.readFloatLE = f.bind(null, s), l.readFloatBE = f.bind(null, c); + }(), typeof Float64Array < "u" ? function() { + var d = new Float64Array([-0]), f = new Uint8Array(d.buffer), h = f[7] === 128; + function p(C, T, x) { + d[0] = C, T[x] = f[0], T[x + 1] = f[1], T[x + 2] = f[2], T[x + 3] = f[3], T[x + 4] = f[4], T[x + 5] = f[5], T[x + 6] = f[6], T[x + 7] = f[7]; + } + function m(C, T, x) { + d[0] = C, T[x] = f[7], T[x + 1] = f[6], T[x + 2] = f[5], T[x + 3] = f[4], T[x + 4] = f[3], T[x + 5] = f[2], T[x + 6] = f[1], T[x + 7] = f[0]; + } + l.writeDoubleLE = h ? p : m, l.writeDoubleBE = h ? m : p; + function _(C, T) { + return f[0] = C[T], f[1] = C[T + 1], f[2] = C[T + 2], f[3] = C[T + 3], f[4] = C[T + 4], f[5] = C[T + 5], f[6] = C[T + 6], f[7] = C[T + 7], d[0]; + } + function y(C, T) { + return f[7] = C[T], f[6] = C[T + 1], f[5] = C[T + 2], f[4] = C[T + 3], f[3] = C[T + 4], f[2] = C[T + 5], f[1] = C[T + 6], f[0] = C[T + 7], d[0]; + } + l.readDoubleLE = h ? _ : y, l.readDoubleBE = h ? y : _; + }() : function() { + function d(h, p, m, _, y, C) { + var T = _ < 0 ? 1 : 0; + if (T && (_ = -_), _ === 0) + h(0, y, C + p), h(1 / _ > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), y, C + m); + else if (isNaN(_)) + h(0, y, C + p), h(2146959360, y, C + m); + else if (_ > 17976931348623157e292) + h(0, y, C + p), h((T << 31 | 2146435072) >>> 0, y, C + m); + else { + var x; + if (_ < 22250738585072014e-324) + x = _ / 5e-324, h(x >>> 0, y, C + p), h((T << 31 | x / 4294967296) >>> 0, y, C + m); + else { + var b = Math.floor(Math.log(_) / Math.LN2); + b === 1024 && (b = 1023), x = _ * Math.pow(2, -b), h(x * 4503599627370496 >>> 0, y, C + p), h((T << 31 | b + 1023 << 20 | x * 1048576 & 1048575) >>> 0, y, C + m); + } + } + } + l.writeDoubleLE = d.bind(null, r, 0, 4), l.writeDoubleBE = d.bind(null, o, 4, 0); + function f(h, p, m, _, y) { + var C = h(_, y + p), T = h(_, y + m), x = (T >> 31) * 2 + 1, b = T >>> 20 & 2047, S = 4294967296 * (T & 1048575) + C; + return b === 2047 ? S ? NaN : x * (1 / 0) : b === 0 ? x * 5e-324 * S : x * Math.pow(2, b - 1075) * (S + 4503599627370496); + } + l.readDoubleLE = f.bind(null, s, 0, 4), l.readDoubleBE = f.bind(null, c, 4, 0); + }(), l; + } + function r(l, d, f) { + d[f] = l & 255, d[f + 1] = l >>> 8 & 255, d[f + 2] = l >>> 16 & 255, d[f + 3] = l >>> 24; + } + function o(l, d, f) { + d[f] = l >>> 24, d[f + 1] = l >>> 16 & 255, d[f + 2] = l >>> 8 & 255, d[f + 3] = l & 255; + } + function s(l, d) { + return (l[d] | l[d + 1] << 8 | l[d + 2] << 16 | l[d + 3] << 24) >>> 0; + } + function c(l, d) { + return (l[d] << 24 | l[d + 1] << 16 | l[d + 2] << 8 | l[d + 3]) >>> 0; + } + }, {}], 5: [function(require, module, exports) { + module.exports = inquire; + function inquire(moduleName) { + try { + var mod = eval("quire".replace(/^/, "re"))(moduleName); + if (mod && (mod.length || Object.keys(mod).length)) + return mod; + } catch (e) { + } + return null; + } + }, {}], 6: [function(e, t, n) { + t.exports = i; + function i(r, o, s) { + var c = s || 8192, l = c >>> 1, d = null, f = c; + return function(p) { + if (p < 1 || p > l) + return r(p); + f + p > c && (d = r(c), f = 0); + var m = o.call(d, f, f += p); + return f & 7 && (f = (f | 7) + 1), m; + }; + } + }, {}], 7: [function(e, t, n) { + var i = n; + i.length = function(o) { + for (var s = 0, c = 0, l = 0; l < o.length; ++l) + c = o.charCodeAt(l), c < 128 ? s += 1 : c < 2048 ? s += 2 : (c & 64512) === 55296 && (o.charCodeAt(l + 1) & 64512) === 56320 ? (++l, s += 4) : s += 3; + return s; + }, i.read = function(o, s, c) { + var l = c - s; + if (l < 1) + return ""; + for (var d = null, f = [], h = 0, p; s < c; ) + p = o[s++], p < 128 ? f[h++] = p : p > 191 && p < 224 ? f[h++] = (p & 31) << 6 | o[s++] & 63 : p > 239 && p < 365 ? (p = ((p & 7) << 18 | (o[s++] & 63) << 12 | (o[s++] & 63) << 6 | o[s++] & 63) - 65536, f[h++] = 55296 + (p >> 10), f[h++] = 56320 + (p & 1023)) : f[h++] = (p & 15) << 12 | (o[s++] & 63) << 6 | o[s++] & 63, h > 8191 && ((d || (d = [])).push(String.fromCharCode.apply(String, f)), h = 0); + return d ? (h && d.push(String.fromCharCode.apply(String, f.slice(0, h))), d.join("")) : String.fromCharCode.apply(String, f.slice(0, h)); + }, i.write = function(o, s, c) { + for (var l = c, d, f, h = 0; h < o.length; ++h) + d = o.charCodeAt(h), d < 128 ? s[c++] = d : d < 2048 ? (s[c++] = d >> 6 | 192, s[c++] = d & 63 | 128) : (d & 64512) === 55296 && ((f = o.charCodeAt(h + 1)) & 64512) === 56320 ? (d = 65536 + ((d & 1023) << 10) + (f & 1023), ++h, s[c++] = d >> 18 | 240, s[c++] = d >> 12 & 63 | 128, s[c++] = d >> 6 & 63 | 128, s[c++] = d & 63 | 128) : (s[c++] = d >> 12 | 224, s[c++] = d >> 6 & 63 | 128, s[c++] = d & 63 | 128); + return c - l; + }; + }, {}], 8: [function(e, t, n) { + var i = n; + i.build = "minimal", i.Writer = e(16), i.BufferWriter = e(17), i.Reader = e(9), i.BufferReader = e(10), i.util = e(15), i.rpc = e(12), i.roots = e(11), i.configure = r; + function r() { + i.util._configure(), i.Writer._configure(i.BufferWriter), i.Reader._configure(i.BufferReader); + } + r(); + }, { 10: 10, 11: 11, 12: 12, 15: 15, 16: 16, 17: 17, 9: 9 }], 9: [function(e, t, n) { + t.exports = l; + var i = e(15), r, o = i.LongBits, s = i.utf8; + function c(_, y) { + return RangeError("index out of range: " + _.pos + " + " + (y || 1) + " > " + _.len); + } + function l(_) { + this.buf = _, this.pos = 0, this.len = _.length; + } + var d = typeof Uint8Array < "u" ? function(y) { + if (y instanceof Uint8Array || Array.isArray(y)) + return new l(y); + throw Error("illegal buffer"); + } : function(y) { + if (Array.isArray(y)) + return new l(y); + throw Error("illegal buffer"); + }, f = function() { + return i.Buffer ? function(C) { + return (l.create = function(x) { + return i.Buffer.isBuffer(x) ? new r(x) : d(x); + })(C); + } : d; + }; + l.create = f(), l.prototype._slice = i.Array.prototype.subarray || /* istanbul ignore next */ + i.Array.prototype.slice, l.prototype.uint32 = /* @__PURE__ */ function() { + var y = 4294967295; + return function() { + if (y = (this.buf[this.pos] & 127) >>> 0, this.buf[this.pos++] < 128 || (y = (y | (this.buf[this.pos] & 127) << 7) >>> 0, this.buf[this.pos++] < 128) || (y = (y | (this.buf[this.pos] & 127) << 14) >>> 0, this.buf[this.pos++] < 128) || (y = (y | (this.buf[this.pos] & 127) << 21) >>> 0, this.buf[this.pos++] < 128) || (y = (y | (this.buf[this.pos] & 15) << 28) >>> 0, this.buf[this.pos++] < 128)) return y; + if ((this.pos += 5) > this.len) + throw this.pos = this.len, c(this, 10); + return y; + }; + }(), l.prototype.int32 = function() { + return this.uint32() | 0; + }, l.prototype.sint32 = function() { + var y = this.uint32(); + return y >>> 1 ^ -(y & 1) | 0; + }; + function h() { + var _ = new o(0, 0), y = 0; + if (this.len - this.pos > 4) { + for (; y < 4; ++y) + if (_.lo = (_.lo | (this.buf[this.pos] & 127) << y * 7) >>> 0, this.buf[this.pos++] < 128) + return _; + if (_.lo = (_.lo | (this.buf[this.pos] & 127) << 28) >>> 0, _.hi = (_.hi | (this.buf[this.pos] & 127) >> 4) >>> 0, this.buf[this.pos++] < 128) + return _; + y = 0; + } else { + for (; y < 3; ++y) { + if (this.pos >= this.len) + throw c(this); + if (_.lo = (_.lo | (this.buf[this.pos] & 127) << y * 7) >>> 0, this.buf[this.pos++] < 128) + return _; + } + return _.lo = (_.lo | (this.buf[this.pos++] & 127) << y * 7) >>> 0, _; + } + if (this.len - this.pos > 4) { + for (; y < 5; ++y) + if (_.hi = (_.hi | (this.buf[this.pos] & 127) << y * 7 + 3) >>> 0, this.buf[this.pos++] < 128) + return _; + } else + for (; y < 5; ++y) { + if (this.pos >= this.len) + throw c(this); + if (_.hi = (_.hi | (this.buf[this.pos] & 127) << y * 7 + 3) >>> 0, this.buf[this.pos++] < 128) + return _; + } + throw Error("invalid varint encoding"); + } + l.prototype.bool = function() { + return this.uint32() !== 0; + }; + function p(_, y) { + return (_[y - 4] | _[y - 3] << 8 | _[y - 2] << 16 | _[y - 1] << 24) >>> 0; + } + l.prototype.fixed32 = function() { + if (this.pos + 4 > this.len) + throw c(this, 4); + return p(this.buf, this.pos += 4); + }, l.prototype.sfixed32 = function() { + if (this.pos + 4 > this.len) + throw c(this, 4); + return p(this.buf, this.pos += 4) | 0; + }; + function m() { + if (this.pos + 8 > this.len) + throw c(this, 8); + return new o(p(this.buf, this.pos += 4), p(this.buf, this.pos += 4)); + } + l.prototype.float = function() { + if (this.pos + 4 > this.len) + throw c(this, 4); + var y = i.float.readFloatLE(this.buf, this.pos); + return this.pos += 4, y; + }, l.prototype.double = function() { + if (this.pos + 8 > this.len) + throw c(this, 4); + var y = i.float.readDoubleLE(this.buf, this.pos); + return this.pos += 8, y; + }, l.prototype.bytes = function() { + var y = this.uint32(), C = this.pos, T = this.pos + y; + if (T > this.len) + throw c(this, y); + if (this.pos += y, Array.isArray(this.buf)) + return this.buf.slice(C, T); + if (C === T) { + var x = i.Buffer; + return x ? x.alloc(0) : new this.buf.constructor(0); + } + return this._slice.call(this.buf, C, T); + }, l.prototype.string = function() { + var y = this.bytes(); + return s.read(y, 0, y.length); + }, l.prototype.skip = function(y) { + if (typeof y == "number") { + if (this.pos + y > this.len) + throw c(this, y); + this.pos += y; + } else + do + if (this.pos >= this.len) + throw c(this); + while (this.buf[this.pos++] & 128); + return this; + }, l.prototype.skipType = function(_) { + switch (_) { + case 0: + this.skip(); + break; + case 1: + this.skip(8); + break; + case 2: + this.skip(this.uint32()); + break; + case 3: + for (; (_ = this.uint32() & 7) !== 4; ) + this.skipType(_); + break; + case 5: + this.skip(4); + break; + default: + throw Error("invalid wire type " + _ + " at offset " + this.pos); + } + return this; + }, l._configure = function(_) { + r = _, l.create = f(), r._configure(); + var y = i.Long ? "toLong" : ( + /* istanbul ignore next */ + "toNumber" + ); + i.merge(l.prototype, { + int64: function() { + return h.call(this)[y](!1); + }, + uint64: function() { + return h.call(this)[y](!0); + }, + sint64: function() { + return h.call(this).zzDecode()[y](!1); + }, + fixed64: function() { + return m.call(this)[y](!0); + }, + sfixed64: function() { + return m.call(this)[y](!1); + } + }); + }; + }, { 15: 15 }], 10: [function(e, t, n) { + t.exports = o; + var i = e(9); + (o.prototype = Object.create(i.prototype)).constructor = o; + var r = e(15); + function o(s) { + i.call(this, s); + } + o._configure = function() { + r.Buffer && (o.prototype._slice = r.Buffer.prototype.slice); + }, o.prototype.string = function() { + var c = this.uint32(); + return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + c, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + c, this.len)); + }, o._configure(); + }, { 15: 15, 9: 9 }], 11: [function(e, t, n) { + t.exports = {}; + }, {}], 12: [function(e, t, n) { + var i = n; + i.Service = e(13); + }, { 13: 13 }], 13: [function(e, t, n) { + t.exports = r; + var i = e(15); + (r.prototype = Object.create(i.EventEmitter.prototype)).constructor = r; + function r(o, s, c) { + if (typeof o != "function") + throw TypeError("rpcImpl must be a function"); + i.EventEmitter.call(this), this.rpcImpl = o, this.requestDelimited = !!s, this.responseDelimited = !!c; + } + r.prototype.rpcCall = function o(s, c, l, d, f) { + if (!d) + throw TypeError("request must be specified"); + var h = this; + if (!f) + return i.asPromise(o, h, s, c, l, d); + if (!h.rpcImpl) + return setTimeout(function() { + f(Error("already ended")); + }, 0), undefined$1; + try { + return h.rpcImpl( + s, + c[h.requestDelimited ? "encodeDelimited" : "encode"](d).finish(), + function(m, _) { + if (m) + return h.emit("error", m, s), f(m); + if (_ === null) + return h.end( + /* endedByRPC */ + !0 + ), undefined$1; + if (!(_ instanceof l)) + try { + _ = l[h.responseDelimited ? "decodeDelimited" : "decode"](_); + } catch (y) { + return h.emit("error", y, s), f(y); + } + return h.emit("data", _, s), f(null, _); + } + ); + } catch (p) { + return h.emit("error", p, s), setTimeout(function() { + f(p); + }, 0), undefined$1; + } + }, r.prototype.end = function(s) { + return this.rpcImpl && (s || this.rpcImpl(null, null, null), this.rpcImpl = null, this.emit("end").off()), this; + }; + }, { 15: 15 }], 14: [function(e, t, n) { + t.exports = r; + var i = e(15); + function r(l, d) { + this.lo = l >>> 0, this.hi = d >>> 0; + } + var o = r.zero = new r(0, 0); + o.toNumber = function() { + return 0; + }, o.zzEncode = o.zzDecode = function() { + return this; + }, o.length = function() { + return 1; + }; + var s = r.zeroHash = "\0\0\0\0\0\0\0\0"; + r.fromNumber = function(d) { + if (d === 0) + return o; + var f = d < 0; + f && (d = -d); + var h = d >>> 0, p = (d - h) / 4294967296 >>> 0; + return f && (p = ~p >>> 0, h = ~h >>> 0, ++h > 4294967295 && (h = 0, ++p > 4294967295 && (p = 0))), new r(h, p); + }, r.from = function(d) { + if (typeof d == "number") + return r.fromNumber(d); + if (i.isString(d)) + if (i.Long) + d = i.Long.fromString(d); + else + return r.fromNumber(parseInt(d, 10)); + return d.low || d.high ? new r(d.low >>> 0, d.high >>> 0) : o; + }, r.prototype.toNumber = function(d) { + if (!d && this.hi >>> 31) { + var f = ~this.lo + 1 >>> 0, h = ~this.hi >>> 0; + return f || (h = h + 1 >>> 0), -(f + h * 4294967296); + } + return this.lo + this.hi * 4294967296; + }, r.prototype.toLong = function(d) { + return i.Long ? new i.Long(this.lo | 0, this.hi | 0, !!d) : { low: this.lo | 0, high: this.hi | 0, unsigned: !!d }; + }; + var c = String.prototype.charCodeAt; + r.fromHash = function(d) { + return d === s ? o : new r( + (c.call(d, 0) | c.call(d, 1) << 8 | c.call(d, 2) << 16 | c.call(d, 3) << 24) >>> 0, + (c.call(d, 4) | c.call(d, 5) << 8 | c.call(d, 6) << 16 | c.call(d, 7) << 24) >>> 0 + ); + }, r.prototype.toHash = function() { + return String.fromCharCode( + this.lo & 255, + this.lo >>> 8 & 255, + this.lo >>> 16 & 255, + this.lo >>> 24, + this.hi & 255, + this.hi >>> 8 & 255, + this.hi >>> 16 & 255, + this.hi >>> 24 + ); + }, r.prototype.zzEncode = function() { + var d = this.hi >> 31; + return this.hi = ((this.hi << 1 | this.lo >>> 31) ^ d) >>> 0, this.lo = (this.lo << 1 ^ d) >>> 0, this; + }, r.prototype.zzDecode = function() { + var d = -(this.lo & 1); + return this.lo = ((this.lo >>> 1 | this.hi << 31) ^ d) >>> 0, this.hi = (this.hi >>> 1 ^ d) >>> 0, this; + }, r.prototype.length = function() { + var d = this.lo, f = (this.lo >>> 28 | this.hi << 4) >>> 0, h = this.hi >>> 24; + return h === 0 ? f === 0 ? d < 16384 ? d < 128 ? 1 : 2 : d < 2097152 ? 3 : 4 : f < 16384 ? f < 128 ? 5 : 6 : f < 2097152 ? 7 : 8 : h < 128 ? 9 : 10; + }; + }, { 15: 15 }], 15: [function(e, t, n) { + var i = n; + i.asPromise = e(1), i.base64 = e(2), i.EventEmitter = e(3), i.float = e(4), i.inquire = e(5), i.utf8 = e(7), i.pool = e(6), i.LongBits = e(14), i.isNode = !!(typeof commonjsGlobal < "u" && commonjsGlobal && commonjsGlobal.process && commonjsGlobal.process.versions && commonjsGlobal.process.versions.node), i.global = i.isNode && commonjsGlobal || typeof window < "u" && window || typeof self < "u" && self || this, i.emptyArray = Object.freeze ? Object.freeze([]) : ( + /* istanbul ignore next */ + [] + ), i.emptyObject = Object.freeze ? Object.freeze({}) : ( + /* istanbul ignore next */ + {} + ), i.isInteger = Number.isInteger || /* istanbul ignore next */ + function(c) { + return typeof c == "number" && isFinite(c) && Math.floor(c) === c; + }, i.isString = function(c) { + return typeof c == "string" || c instanceof String; + }, i.isObject = function(c) { + return c && typeof c == "object"; + }, i.isset = /** + * Checks if a property on a message is considered to be present. + * @param {Object} obj Plain object or message instance + * @param {string} prop Property name + * @returns {boolean} `true` if considered to be present, otherwise `false` + */ + i.isSet = function(c, l) { + var d = c[l]; + return d != null && c.hasOwnProperty(l) ? typeof d != "object" || (Array.isArray(d) ? d.length : Object.keys(d).length) > 0 : !1; + }, i.Buffer = function() { + try { + var s = i.inquire("buffer").Buffer; + return s.prototype.utf8Write ? s : ( + /* istanbul ignore next */ + null + ); + } catch { + return null; + } + }(), i._Buffer_from = null, i._Buffer_allocUnsafe = null, i.newBuffer = function(c) { + return typeof c == "number" ? i.Buffer ? i._Buffer_allocUnsafe(c) : new i.Array(c) : i.Buffer ? i._Buffer_from(c) : typeof Uint8Array > "u" ? c : new Uint8Array(c); + }, i.Array = typeof Uint8Array < "u" ? Uint8Array : Array, i.Long = /* istanbul ignore next */ + i.global.dcodeIO && /* istanbul ignore next */ + i.global.dcodeIO.Long || /* istanbul ignore next */ + i.global.Long || i.inquire("long"), i.key2Re = /^true|false|0|1$/, i.key32Re = /^-?(?:0|[1-9][0-9]*)$/, i.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/, i.longToHash = function(c) { + return c ? i.LongBits.from(c).toHash() : i.LongBits.zeroHash; + }, i.longFromHash = function(c, l) { + var d = i.LongBits.fromHash(c); + return i.Long ? i.Long.fromBits(d.lo, d.hi, l) : d.toNumber(!!l); + }; + function r(s, c, l) { + for (var d = Object.keys(c), f = 0; f < d.length; ++f) + (s[d[f]] === undefined$1 || !l) && (s[d[f]] = c[d[f]]); + return s; + } + i.merge = r, i.lcFirst = function(c) { + return c.charAt(0).toLowerCase() + c.substring(1); + }; + function o(s) { + function c(l, d) { + if (!(this instanceof c)) + return new c(l, d); + Object.defineProperty(this, "message", { get: function() { + return l; + } }), Error.captureStackTrace ? Error.captureStackTrace(this, c) : Object.defineProperty(this, "stack", { value: new Error().stack || "" }), d && r(this, d); + } + return c.prototype = Object.create(Error.prototype, { + constructor: { + value: c, + writable: !0, + enumerable: !1, + configurable: !0 + }, + name: { + get: function() { + return s; + }, + set: undefined$1, + enumerable: !1, + // configurable: false would accurately preserve the behavior of + // the original, but I'm guessing that was not intentional. + // For an actual error subclass, this property would + // be configurable. + configurable: !0 + }, + toString: { + value: function() { + return this.name + ": " + this.message; + }, + writable: !0, + enumerable: !1, + configurable: !0 + } + }), c; + } + i.newError = o, i.ProtocolError = o("ProtocolError"), i.oneOfGetter = function(c) { + for (var l = {}, d = 0; d < c.length; ++d) + l[c[d]] = 1; + return function() { + for (var f = Object.keys(this), h = f.length - 1; h > -1; --h) + if (l[f[h]] === 1 && this[f[h]] !== undefined$1 && this[f[h]] !== null) + return f[h]; + }; + }, i.oneOfSetter = function(c) { + return function(l) { + for (var d = 0; d < c.length; ++d) + c[d] !== l && delete this[c[d]]; + }; + }, i.toJSONOptions = { + longs: String, + enums: String, + bytes: String, + json: !0 + }, i._configure = function() { + var s = i.Buffer; + if (!s) { + i._Buffer_from = i._Buffer_allocUnsafe = null; + return; + } + i._Buffer_from = s.from !== Uint8Array.from && s.from || /* istanbul ignore next */ + function(l, d) { + return new s(l, d); + }, i._Buffer_allocUnsafe = s.allocUnsafe || /* istanbul ignore next */ + function(l) { + return new s(l); + }; + }; + }, { 1: 1, 14: 14, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7 }], 16: [function(e, t, n) { + t.exports = h; + var i = e(15), r, o = i.LongBits, s = i.base64, c = i.utf8; + function l(b, S, E) { + this.fn = b, this.len = S, this.next = undefined$1, this.val = E; + } + function d() { + } + function f(b) { + this.head = b.head, this.tail = b.tail, this.len = b.len, this.next = b.states; + } + function h() { + this.len = 0, this.head = new l(d, 0, 0), this.tail = this.head, this.states = null; + } + var p = function() { + return i.Buffer ? function() { + return (h.create = function() { + return new r(); + })(); + } : function() { + return new h(); + }; + }; + h.create = p(), h.alloc = function(S) { + return new i.Array(S); + }, i.Array !== Array && (h.alloc = i.pool(h.alloc, i.Array.prototype.subarray)), h.prototype._push = function(S, E, A) { + return this.tail = this.tail.next = new l(S, E, A), this.len += E, this; + }; + function m(b, S, E) { + S[E] = b & 255; + } + function _(b, S, E) { + for (; b > 127; ) + S[E++] = b & 127 | 128, b >>>= 7; + S[E] = b; + } + function y(b, S) { + this.len = b, this.next = undefined$1, this.val = S; + } + y.prototype = Object.create(l.prototype), y.prototype.fn = _, h.prototype.uint32 = function(S) { + return this.len += (this.tail = this.tail.next = new y( + (S = S >>> 0) < 128 ? 1 : S < 16384 ? 2 : S < 2097152 ? 3 : S < 268435456 ? 4 : 5, + S + )).len, this; + }, h.prototype.int32 = function(S) { + return S < 0 ? this._push(C, 10, o.fromNumber(S)) : this.uint32(S); + }, h.prototype.sint32 = function(S) { + return this.uint32((S << 1 ^ S >> 31) >>> 0); + }; + function C(b, S, E) { + for (; b.hi; ) + S[E++] = b.lo & 127 | 128, b.lo = (b.lo >>> 7 | b.hi << 25) >>> 0, b.hi >>>= 7; + for (; b.lo > 127; ) + S[E++] = b.lo & 127 | 128, b.lo = b.lo >>> 7; + S[E++] = b.lo; + } + h.prototype.uint64 = function(S) { + var E = o.from(S); + return this._push(C, E.length(), E); + }, h.prototype.int64 = h.prototype.uint64, h.prototype.sint64 = function(S) { + var E = o.from(S).zzEncode(); + return this._push(C, E.length(), E); + }, h.prototype.bool = function(S) { + return this._push(m, 1, S ? 1 : 0); + }; + function T(b, S, E) { + S[E] = b & 255, S[E + 1] = b >>> 8 & 255, S[E + 2] = b >>> 16 & 255, S[E + 3] = b >>> 24; + } + h.prototype.fixed32 = function(S) { + return this._push(T, 4, S >>> 0); + }, h.prototype.sfixed32 = h.prototype.fixed32, h.prototype.fixed64 = function(S) { + var E = o.from(S); + return this._push(T, 4, E.lo)._push(T, 4, E.hi); + }, h.prototype.sfixed64 = h.prototype.fixed64, h.prototype.float = function(S) { + return this._push(i.float.writeFloatLE, 4, S); + }, h.prototype.double = function(S) { + return this._push(i.float.writeDoubleLE, 8, S); + }; + var x = i.Array.prototype.set ? function(S, E, A) { + E.set(S, A); + } : function(S, E, A) { + for (var D = 0; D < S.length; ++D) + E[A + D] = S[D]; + }; + h.prototype.bytes = function(S) { + var E = S.length >>> 0; + if (!E) + return this._push(m, 1, 0); + if (i.isString(S)) { + var A = h.alloc(E = s.length(S)); + s.decode(S, A, 0), S = A; + } + return this.uint32(E)._push(x, E, S); + }, h.prototype.string = function(S) { + var E = c.length(S); + return E ? this.uint32(E)._push(c.write, E, S) : this._push(m, 1, 0); + }, h.prototype.fork = function() { + return this.states = new f(this), this.head = this.tail = new l(d, 0, 0), this.len = 0, this; + }, h.prototype.reset = function() { + return this.states ? (this.head = this.states.head, this.tail = this.states.tail, this.len = this.states.len, this.states = this.states.next) : (this.head = this.tail = new l(d, 0, 0), this.len = 0), this; + }, h.prototype.ldelim = function() { + var S = this.head, E = this.tail, A = this.len; + return this.reset().uint32(A), A && (this.tail.next = S.next, this.tail = E, this.len += A), this; + }, h.prototype.finish = function() { + for (var S = this.head.next, E = this.constructor.alloc(this.len), A = 0; S; ) + S.fn(S.val, E, A), A += S.len, S = S.next; + return E; + }, h._configure = function(b) { + r = b, h.create = p(), r._configure(); + }; + }, { 15: 15 }], 17: [function(e, t, n) { + t.exports = o; + var i = e(16); + (o.prototype = Object.create(i.prototype)).constructor = o; + var r = e(15); + function o() { + i.call(this); + } + o._configure = function() { + o.alloc = r._Buffer_allocUnsafe, o.writeBytesBuffer = r.Buffer && r.Buffer.prototype instanceof Uint8Array && r.Buffer.prototype.set.name === "set" ? function(l, d, f) { + d.set(l, f); + } : function(l, d, f) { + if (l.copy) + l.copy(d, f, 0, l.length); + else for (var h = 0; h < l.length; ) + d[f++] = l[h++]; + }; + }, o.prototype.bytes = function(l) { + r.isString(l) && (l = r._Buffer_from(l, "base64")); + var d = l.length >>> 0; + return this.uint32(d), d && this._push(o.writeBytesBuffer, d, l), this; + }; + function s(c, l, d) { + c.length < 40 ? r.utf8.write(c, l, d) : l.utf8Write ? l.utf8Write(c, d) : l.write(c, d); + } + o.prototype.string = function(l) { + var d = r.Buffer.byteLength(l); + return this.uint32(d), d && this._push(s, d, l), this; + }, o._configure(); + }, { 15: 15, 16: 16 }] }, {}, [8]); + })(); +})(protobuf$2); +var protobufExports = protobuf$2.exports; +const protobuf = /* @__PURE__ */ getDefaultExportFromCjs(protobufExports), protobuf$1 = /* @__PURE__ */ _mergeNamespaces({ + __proto__: null, + default: protobuf +}, [protobufExports]); +function isBitSet(e, t) { + return (e & t) !== 0; +} +const childrenBitmasks = [1, 2, 4, 8], anyChildBitmask = 15, cacheFlagBitmask = 16, imageBitmask = 64, terrainBitmask = 128; +function GoogleEarthEnterpriseTileInformation(e, t, n, i, r, o) { + this._bits = e, this.cnodeVersion = t, this.imageryVersion = n, this.terrainVersion = i, this.imageryProvider = r, this.terrainProvider = o, this.ancestorHasTerrain = !1, this.terrainState = void 0; +} +GoogleEarthEnterpriseTileInformation.clone = function(e, t) { + return defined(t) ? (t._bits = e._bits, t.cnodeVersion = e.cnodeVersion, t.imageryVersion = e.imageryVersion, t.terrainVersion = e.terrainVersion, t.imageryProvider = e.imageryProvider, t.terrainProvider = e.terrainProvider) : t = new GoogleEarthEnterpriseTileInformation( + e._bits, + e.cnodeVersion, + e.imageryVersion, + e.terrainVersion, + e.imageryProvider, + e.terrainProvider + ), t.ancestorHasTerrain = e.ancestorHasTerrain, t.terrainState = e.terrainState, t; +}; +GoogleEarthEnterpriseTileInformation.prototype.setParent = function(e) { + this.ancestorHasTerrain = e.ancestorHasTerrain || this.hasTerrain(); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasSubtree = function() { + return isBitSet(this._bits, cacheFlagBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasImagery = function() { + return isBitSet(this._bits, imageBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasTerrain = function() { + return isBitSet(this._bits, terrainBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasChildren = function() { + return isBitSet(this._bits, anyChildBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasChild = function(e) { + return isBitSet(this._bits, childrenBitmasks[e]); +}; +GoogleEarthEnterpriseTileInformation.prototype.getChildBitmask = function() { + return this._bits & anyChildBitmask; +}; +function stringToBuffer(e) { + const t = e.length, n = new ArrayBuffer(t), i = new Uint8Array(n); + for (let r = 0; r < t; ++r) + i[r] = e.charCodeAt(r); + return n; +} +const defaultKey = stringToBuffer( + `Eô½\vyâjE"’,ÍqøIFgQ\0B%Æèa,f)\bÆ4Üjb%y +wmiÖðœk“¡½NuàA[ß@V\fÙ»r›|3SîOlÔq°{ÀEVZ­wUe\v3’*¬l5Å0sø3>mF8J´Ýð.ÝuڌDt"úa"\f3"So¯9D\vŒ9Ù9L¹¿«\\ŒP_Ÿ"uxé\x07q‘h;Áěð<VqH‚'UfYNe˜u£aF}a?A\0Ÿ×´4M·F°Õ¸Š'{‹Ü+»Mg0ÈÑö\\Pú[/F›n5/'C.ë +\f^¥s\x1Be4ål.jC'c#U©?q{gC}:¯ÍâTUœýKÆâŸ/(íË\\Æ-f\x07ˆ§;/*"N°k.Ý\r•}}GºC²²+>Mª>}æÎI‰Ææx\fa1-¤O¥~q ˆì\r1èN\v\0nPh}=\b\r•¦n£h—$[kó#ó¶s³\r\v@ÀŸØQ]ú".jßI\0¹ wUÆïj¿{GLƒîÜÜF…©­S\x07+S4\x07ÿ”Yä8è1ƒN¹XFkË-#†’p\x005ˆ"Ï1²&/çÃu-6,rt°#G·ÓÑ&…7râ\0ŒDÏÚ3-Þ\`†i#i*|ÍKQ\r•T9w.)ê\x1B¦P¢joP™\\>TûïP[\v\x07E‰m(w7ێJfJo™ åpâ¹q~\fmI-zþrÇòY0»]såÉ êxì ðŠB|G\`°½&·q¶ÇŸÑ3‚=Ó«îc™È+S D\\qÆÌD2O<ÊÀ)=RÓaX©}e´ÜÏ\rô=ñ\b©BÚ# Ø¿^PIøMÀËGLO÷{+ØÅ1’;µoÜl\r’ˆўÛ?âéÚ_ԄâFaZÞUϤ\0¾ýÎgñJi—æ HØ]~®q N®ÀV©‘<‚rçvì)IÖ]-ƒãÛ6©;f—‡jÕ¶=P^R¹KÇsWxÉô.Y\x07•“oÐKW>''Ç\`Û;íšSD>?’mw¢ +ë?R¨ÆU^1I7…ôÅ&-©¿‹'TÚÃj å*x°Öprª‹h½ˆ÷_H±~ÀXL?fù>áeÀp§Ï8i¯ðVldIœ'­xtO‡ÞV9\0Úw\vË-\x1B‰û5Oõ\bQ\`Á +ZGM&30xÚÀœFGâ[y\`In7gS +>éìF9²ñ4\rƄSuná\fYÙÞ)…{II¥wy¾IV.6ç\v:»Ob{ÒM1•/½8{¨O!áìFpv•})"xˆ +Ý\\ÚÞQÏðüYRe|3ßóHÚ»*uÛ\`²Ôüí\x1Bì5¨ÿ(1\x07-È܈F|Š["` +); +function GoogleEarthEnterpriseMetadata(e) { + this.imageryPresent = !0, this.protoImagery = void 0, this.terrainPresent = !0, this.negativeAltitudeExponentBias = 32, this.negativeAltitudeThreshold = CesiumMath.EPSILON12, this.providers = {}, this.key = void 0, this._resource = void 0, this._quadPacketVersion = 1, this._tileInfo = {}, this._subtreePromises = {}; +} +Object.defineProperties(GoogleEarthEnterpriseMetadata.prototype, { + /** + * Gets the name of the Google Earth Enterprise server. + * @memberof GoogleEarthEnterpriseMetadata.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._resource.url; + } + }, + /** + * Gets the proxy used for metadata requests. + * @memberof GoogleEarthEnterpriseMetadata.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._resource.proxy; + } + }, + /** + * Gets the resource used for metadata requests. + * @memberof GoogleEarthEnterpriseMetadata.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + } +}); +GoogleEarthEnterpriseMetadata.fromUrl = async function(e) { + let t = e; + typeof t != "string" && !(t instanceof Resource) && (t = e.url); + const n = Resource.createIfNeeded(t); + n.appendForwardSlash(); + const i = new GoogleEarthEnterpriseMetadata(); + i._resource = n; + try { + await requestDbRoot(i), await i.getQuadTreePacket("", i._quadPacketVersion); + } catch (r) { + const o = `An error occurred while accessing ${getMetadataResource(i, "", 1).url}: ${r}`; + throw new RuntimeError(o); + } + return i; +}; +GoogleEarthEnterpriseMetadata.tileXYToQuadKey = function(e, t, n) { + let i = ""; + for (let r = n; r >= 0; --r) { + const o = 1 << r; + let s = 0; + isBitSet(t, o) ? isBitSet(e, o) && (s |= 1) : (s |= 2, isBitSet(e, o) || (s |= 1)), i += s; + } + return i; +}; +GoogleEarthEnterpriseMetadata.quadKeyToTileXY = function(e) { + let t = 0, n = 0; + const i = e.length - 1; + for (let r = i; r >= 0; --r) { + const o = 1 << r, s = +e[i - r]; + isBitSet(s, 2) ? isBitSet(s, 1) || (t |= o) : (n |= o, isBitSet(s, 1) && (t |= o)); + } + return { + x: t, + y: n, + level: i + }; +}; +GoogleEarthEnterpriseMetadata.prototype.isValid = function(e) { + let t = this.getTileInformationFromQuadKey(e); + if (defined(t)) + return t !== null; + let n = !0, i = e, r; + for (; i.length > 1; ) + if (r = i.substring(i.length - 1), i = i.substring(0, i.length - 1), t = this.getTileInformationFromQuadKey(i), defined(t)) { + !t.hasSubtree() && !t.hasChild(parseInt(r)) && (n = !1); + break; + } else if (t === null) { + n = !1; + break; + } + return n; +}; +const taskProcessor$1 = new TaskProcessor("decodeGoogleEarthEnterprisePacket"); +GoogleEarthEnterpriseMetadata.prototype.getQuadTreePacket = function(e, t, n) { + t = defaultValue(t, 1), e = defaultValue(e, ""); + const r = getMetadataResource(this, e, t, n).fetchArrayBuffer(); + if (!defined(r)) + return; + const o = this._tileInfo, s = this.key; + return r.then(function(c) { + return taskProcessor$1.scheduleTask( + { + buffer: c, + quadKey: e, + type: "Metadata", + key: s + }, + [c] + ).then(function(d) { + let f, h = -1; + if (e !== "") { + h = e.length + 1; + const _ = d[e]; + f = o[e], f._bits |= _._bits, delete d[e]; + } + const p = Object.keys(d); + p.sort(function(_, y) { + return _.length - y.length; + }); + const m = p.length; + for (let _ = 0; _ < m; ++_) { + const y = p[_]; + if (d[y] !== null) { + const T = GoogleEarthEnterpriseTileInformation.clone(d[y]), x = y.length; + if (x === h) + T.setParent(f); + else if (x > 1) { + const b = o[y.substring(0, y.length - 1)]; + T.setParent(b); + } + o[y] = T; + } else + o[y] = null; + } + }); + }); +}; +GoogleEarthEnterpriseMetadata.prototype.populateSubtree = function(e, t, n, i) { + const r = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e, t, n); + return populateSubtree(this, r, i); +}; +function populateSubtree(e, t, n) { + const i = e._tileInfo; + let r = t, o = i[r]; + if (defined(o) && (!o.hasSubtree() || o.hasChildren())) + return o; + for (; o === void 0 && r.length > 1; ) + r = r.substring(0, r.length - 1), o = i[r]; + let s; + const c = e._subtreePromises; + let l = c[r]; + if (defined(l)) + return l.then(function() { + return s = new Request({ + throttle: n.throttle, + throttleByServer: n.throttleByServer, + type: n.type, + priorityFunction: n.priorityFunction + }), populateSubtree(e, t, s); + }); + if (!defined(o) || !o.hasSubtree()) + return Promise.reject( + new RuntimeError(`Couldn't load metadata for tile ${t}`) + ); + if (l = e.getQuadTreePacket(r, o.cnodeVersion, n), !!defined(l)) + return c[r] = l, l.then(function() { + return s = new Request({ + throttle: n.throttle, + throttleByServer: n.throttleByServer, + type: n.type, + priorityFunction: n.priorityFunction + }), populateSubtree(e, t, s); + }).finally(function() { + delete c[r]; + }); +} +GoogleEarthEnterpriseMetadata.prototype.getTileInformation = function(e, t, n) { + const i = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e, t, n); + return this._tileInfo[i]; +}; +GoogleEarthEnterpriseMetadata.prototype.getTileInformationFromQuadKey = function(e) { + return this._tileInfo[e]; +}; +function getMetadataResource(e, t, n, i) { + return e._resource.getDerivedResource({ + url: `flatfile?q2-0${t}-q.${n.toString()}`, + request: i + }); +} +let dbrootParser, dbrootParserPromise; +function requestDbRoot(e) { + const t = e._resource.getDerivedResource({ + url: "dbRoot.v5", + queryParameters: { + output: "proto" + } + }); + if (!defined(dbrootParserPromise)) { + const n = buildModuleUrl("ThirdParty/google-earth-dbroot-parser.js"), i = window.cesiumGoogleEarthDbRootParser; + dbrootParserPromise = loadAndExecuteScript(n).then(function() { + dbrootParser = window.cesiumGoogleEarthDbRootParser(protobuf$1), defined(i) ? window.cesiumGoogleEarthDbRootParser = i : delete window.cesiumGoogleEarthDbRootParser; + }); + } + return dbrootParserPromise.then(function() { + return t.fetchArrayBuffer(); + }).then(function(n) { + const i = dbrootParser.EncryptedDbRootProto.decode( + new Uint8Array(n) + ); + let r = i.encryptionData, o = r.byteOffset, s = o + r.byteLength; + const c = e.key = r.buffer.slice(o, s); + r = i.dbrootData, o = r.byteOffset, s = o + r.byteLength; + const l = r.buffer.slice(o, s); + return taskProcessor$1.scheduleTask( + { + buffer: l, + type: "DbRoot", + key: c + }, + [l] + ); + }).then(function(n) { + const i = dbrootParser.DbRootProto.decode( + new Uint8Array(n.buffer) + ); + if (e.imageryPresent = defaultValue( + i.imageryPresent, + e.imageryPresent + ), e.protoImagery = i.protoImagery, e.terrainPresent = defaultValue( + i.terrainPresent, + e.terrainPresent + ), defined(i.endSnippet) && defined(i.endSnippet.model)) { + const c = i.endSnippet.model; + e.negativeAltitudeExponentBias = defaultValue( + c.negativeAltitudeExponentBias, + e.negativeAltitudeExponentBias + ), e.negativeAltitudeThreshold = defaultValue( + c.compressedNegativeAltitudeThreshold, + e.negativeAltitudeThreshold + ); + } + defined(i.databaseVersion) && (e._quadPacketVersion = defaultValue( + i.databaseVersion.quadtreeVersion, + e._quadPacketVersion + )); + const r = e.providers, o = defaultValue(i.providerInfo, []), s = o.length; + for (let c = 0; c < s; ++c) { + const l = o[c], d = l.copyrightString; + defined(d) && (r[l.providerId] = new Credit(d.value)); + } + }).catch(function() { + console.log(`Failed to retrieve ${t.url}. Using defaults.`), e.key = defaultKey; + }); +} +function GoogleEarthEnterpriseTerrainData(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._buffer = e.buffer, this._credits = e.credits, this._negativeAltitudeExponentBias = e.negativeAltitudeExponentBias, this._negativeElevationThreshold = e.negativeElevationThreshold; + const t = defaultValue(e.childTileMask, 15); + let n = t & 3; + n |= t & 4 ? 8 : 0, n |= t & 8 ? 4 : 0, this._childTileMask = n, this._createdByUpsampling = defaultValue(e.createdByUpsampling, !1), this._skirtHeight = void 0, this._bufferType = this._buffer.constructor, this._mesh = void 0, this._minimumHeight = void 0, this._maximumHeight = void 0; +} +Object.defineProperties(GoogleEarthEnterpriseTerrainData.prototype, { + /** + * An array of credits for this tile + * @memberof GoogleEarthEnterpriseTerrainData.prototype + * @type {Credit[]} + */ + credits: { + get: function() { + return this._credits; + } + }, + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @memberof GoogleEarthEnterpriseTerrainData.prototype + * @type {Uint8Array|HTMLImageElement|HTMLCanvasElement} + */ + waterMask: { + get: function() { + } + } +}); +const createMeshTaskName = "createVerticesFromGoogleEarthEnterpriseBuffer", createMeshTaskProcessorNoThrottle = new TaskProcessor(createMeshTaskName), createMeshTaskProcessorThrottle = new TaskProcessor( + createMeshTaskName, + TerrainData.maximumAsynchronousTasks +), nativeRectangleScratch = new Rectangle(), rectangleScratch$1 = new Rectangle(); +GoogleEarthEnterpriseTerrainData.prototype.createMesh = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.tilingScheme, n = e.x, i = e.y, r = e.level, o = defaultValue(e.exaggeration, 1), s = defaultValue( + e.exaggerationRelativeHeight, + 0 + ), c = defaultValue(e.throttle, !0), l = t.ellipsoid; + t.tileXYToNativeRectangle(n, i, r, nativeRectangleScratch), t.tileXYToRectangle(n, i, r, rectangleScratch$1); + const d = l.cartographicToCartesian( + Rectangle.center(rectangleScratch$1) + ), h = 40075.16 / (1 << r); + this._skirtHeight = Math.min(h * 8, 1e3); + const m = (c ? createMeshTaskProcessorThrottle : createMeshTaskProcessorNoThrottle).scheduleTask({ + buffer: this._buffer, + nativeRectangle: nativeRectangleScratch, + rectangle: rectangleScratch$1, + relativeToCenter: d, + ellipsoid: l, + skirtHeight: this._skirtHeight, + exaggeration: o, + exaggerationRelativeHeight: s, + includeWebMercatorT: !0, + negativeAltitudeExponentBias: this._negativeAltitudeExponentBias, + negativeElevationThreshold: this._negativeElevationThreshold + }); + if (!defined(m)) + return; + const _ = this; + return m.then(function(y) { + return _._mesh = new TerrainMesh( + d, + new Float32Array(y.vertices), + new Uint16Array(y.indices), + y.indexCountWithoutSkirts, + y.vertexCountWithoutSkirts, + y.minimumHeight, + y.maximumHeight, + BoundingSphere.clone(y.boundingSphere3D), + Cartesian3.clone(y.occludeePointInScaledSpace), + y.numberOfAttributes, + OrientedBoundingBox.clone(y.orientedBoundingBox), + TerrainEncoding.clone(y.encoding), + y.westIndicesSouthToNorth, + y.southIndicesEastToWest, + y.eastIndicesNorthToSouth, + y.northIndicesWestToEast + ), _._minimumHeight = y.minimumHeight, _._maximumHeight = y.maximumHeight, _._buffer = void 0, _._mesh; + }); +}; +GoogleEarthEnterpriseTerrainData.prototype.interpolateHeight = function(e, t, n) { + const i = CesiumMath.clamp( + (t - e.west) / e.width, + 0, + 1 + ), r = CesiumMath.clamp( + (n - e.south) / e.height, + 0, + 1 + ); + return defined(this._mesh) ? interpolateMeshHeight(this, i, r) : interpolateHeight(this, i, r, e); +}; +const upsampleTaskProcessor = new TaskProcessor( + "upsampleQuantizedTerrainMesh", + TerrainData.maximumAsynchronousTasks +); +GoogleEarthEnterpriseTerrainData.prototype.upsample = function(e, t, n, i, r, o, s) { + const c = this._mesh; + if (!defined(this._mesh)) + return; + const l = t * 2 !== r, d = n * 2 === o, f = e.ellipsoid, h = e.tileXYToRectangle( + r, + o, + s + ), p = upsampleTaskProcessor.scheduleTask({ + vertices: c.vertices, + indices: c.indices, + indexCountWithoutSkirts: c.indexCountWithoutSkirts, + vertexCountWithoutSkirts: c.vertexCountWithoutSkirts, + encoding: c.encoding, + minimumHeight: this._minimumHeight, + maximumHeight: this._maximumHeight, + isEastChild: l, + isNorthChild: d, + childRectangle: h, + ellipsoid: f + }); + if (!defined(p)) + return; + const m = this; + return p.then(function(_) { + const y = new Uint16Array(_.vertices), C = IndexDatatype$1.createTypedArray( + y.length / 3, + _.indices + ), T = m._skirtHeight; + return new QuantizedMeshTerrainData({ + quantizedVertices: y, + indices: C, + minimumHeight: _.minimumHeight, + maximumHeight: _.maximumHeight, + boundingSphere: BoundingSphere.clone(_.boundingSphere), + orientedBoundingBox: OrientedBoundingBox.clone( + _.orientedBoundingBox + ), + horizonOcclusionPoint: Cartesian3.clone(_.horizonOcclusionPoint), + westIndices: _.westIndices, + southIndices: _.southIndices, + eastIndices: _.eastIndices, + northIndices: _.northIndices, + westSkirtHeight: T, + southSkirtHeight: T, + eastSkirtHeight: T, + northSkirtHeight: T, + childTileMask: 0, + createdByUpsampling: !0, + credits: m._credits + }); + }); +}; +GoogleEarthEnterpriseTerrainData.prototype.isChildAvailable = function(e, t, n, i) { + let r = 2; + return n !== e * 2 && ++r, i !== t * 2 && (r -= 2), (this._childTileMask & 1 << r) !== 0; +}; +GoogleEarthEnterpriseTerrainData.prototype.wasCreatedByUpsampling = function() { + return this._createdByUpsampling; +}; +const texCoordScratch0 = new Cartesian2(), texCoordScratch1 = new Cartesian2(), texCoordScratch2 = new Cartesian2(), barycentricCoordinateScratch = new Cartesian3(); +function interpolateMeshHeight(e, t, n) { + const i = e._mesh, r = i.vertices, o = i.encoding, s = i.indices; + for (let c = 0, l = s.length; c < l; c += 3) { + const d = s[c], f = s[c + 1], h = s[c + 2], p = o.decodeTextureCoordinates( + r, + d, + texCoordScratch0 + ), m = o.decodeTextureCoordinates( + r, + f, + texCoordScratch1 + ), _ = o.decodeTextureCoordinates( + r, + h, + texCoordScratch2 + ), y = Intersections2D.computeBarycentricCoordinates( + t, + n, + p.x, + p.y, + m.x, + m.y, + _.x, + _.y, + barycentricCoordinateScratch + ); + if (y.x >= -1e-15 && y.y >= -1e-15 && y.z >= -1e-15) { + const C = o.decodeHeight(r, d), T = o.decodeHeight(r, f), x = o.decodeHeight(r, h); + return y.x * C + y.y * T + y.z * x; + } + } +} +const sizeOfUint16 = Uint16Array.BYTES_PER_ELEMENT, sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT, sizeOfInt32 = Int32Array.BYTES_PER_ELEMENT, sizeOfFloat = Float32Array.BYTES_PER_ELEMENT, sizeOfDouble = Float64Array.BYTES_PER_ELEMENT; +function interpolateHeight(e, t, n, i) { + const r = e._buffer; + let o = 0, s = 0, c = 0; + n > 0.5 ? (t > 0.5 ? (o = 2, s = 0.5) : o = 3, c = 0.5) : t > 0.5 && (o = 1, s = 0.5); + const l = new DataView(r); + let d = 0; + for (let E = 0; E < o; ++E) + d += l.getUint32(d, !0), d += sizeOfUint32; + d += sizeOfUint32, d += 2 * sizeOfDouble; + const f = CesiumMath.toRadians(l.getFloat64(d, !0) * 180); + d += sizeOfDouble; + const h = CesiumMath.toRadians(l.getFloat64(d, !0) * 180); + d += sizeOfDouble; + const p = i.width / f / 2, m = i.height / h / 2, _ = l.getInt32(d, !0); + d += sizeOfInt32; + const y = l.getInt32(d, !0) * 3; + d += sizeOfInt32, d += sizeOfInt32; + const C = new Array(_), T = new Array(_), x = new Array(_); + let b; + for (b = 0; b < _; ++b) + C[b] = s + l.getUint8(d++) * p, T[b] = c + l.getUint8(d++) * m, x[b] = l.getFloat32(d, !0) * 6371010, d += sizeOfFloat; + const S = new Array(y); + for (b = 0; b < y; ++b) + S[b] = l.getUint16(d, !0), d += sizeOfUint16; + for (b = 0; b < y; b += 3) { + const E = S[b], A = S[b + 1], D = S[b + 2], P = C[E], I = C[A], M = C[D], R = T[E], L = T[A], g = T[D], w = Intersections2D.computeBarycentricCoordinates( + t, + n, + P, + R, + I, + L, + M, + g, + barycentricCoordinateScratch + ); + if (w.x >= -1e-15 && w.y >= -1e-15 && w.z >= -1e-15) + return w.x * x[E] + w.y * x[A] + w.z * x[D]; + } +} +const TerrainState = { + UNKNOWN: 0, + NONE: 1, + SELF: 2, + PARENT: 3 +}, julianDateScratch = new JulianDate(); +function TerrainCache() { + this._terrainCache = {}, this._lastTidy = JulianDate.now(); +} +TerrainCache.prototype.add = function(e, t) { + this._terrainCache[e] = { + buffer: t, + timestamp: JulianDate.now() + }; +}; +TerrainCache.prototype.get = function(e) { + const n = this._terrainCache[e]; + if (defined(n)) + return delete this._terrainCache[e], n.buffer; +}; +TerrainCache.prototype.tidy = function() { + if (JulianDate.now(julianDateScratch), JulianDate.secondsDifference(julianDateScratch, this._lastTidy) > 10) { + const e = this._terrainCache, t = Object.keys(e), n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i], o = e[r]; + JulianDate.secondsDifference(julianDateScratch, o.timestamp) > 10 && delete e[r]; + } + JulianDate.clone(julianDateScratch, this._lastTidy); + } +}; +function GoogleEarthEnterpriseTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._tilingScheme = new GeographicTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 2, + rectangle: new Rectangle( + -CesiumMath.PI, + -CesiumMath.PI, + CesiumMath.PI, + CesiumMath.PI + ), + ellipsoid: e.ellipsoid + }); + let t = e.credit; + typeof t == "string" && (t = new Credit(t)), this._credit = t, this._levelZeroMaximumGeometricError = 40075.16, this._terrainCache = new TerrainCache(), this._terrainPromises = {}, this._terrainRequests = {}, this._errorEvent = new Event(); +} +Object.defineProperties(GoogleEarthEnterpriseTerrainProvider.prototype, { + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._metadata.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._metadata.proxy; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return !1; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return !1; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof GoogleEarthEnterpriseTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + } + } +}); +GoogleEarthEnterpriseTerrainProvider.fromMetadata = function(e, t) { + if (!e.terrainPresent) + throw new RuntimeError(`The server ${e.url} doesn't have terrain`); + const n = new GoogleEarthEnterpriseTerrainProvider(t); + return n._metadata = e, n; +}; +const taskProcessor = new TaskProcessor("decodeGoogleEarthEnterprisePacket"); +function computeChildMask(e, t, n) { + let i = t.getChildBitmask(); + if (t.terrainState === TerrainState.PARENT) { + i = 0; + for (let r = 0; r < 4; ++r) { + const o = n.getTileInformationFromQuadKey( + e + r.toString() + ); + defined(o) && o.hasTerrain() && (i |= 1 << r); + } + } + return i; +} +GoogleEarthEnterpriseTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + const r = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e, t, n), o = this._terrainCache, s = this._metadata, c = s.getTileInformationFromQuadKey(r); + if (!defined(c)) + return Promise.reject(new RuntimeError("Terrain tile doesn't exist")); + let l = c.terrainState; + defined(l) || (l = c.terrainState = TerrainState.UNKNOWN); + const d = o.get(r); + if (defined(d)) { + const T = s.providers[c.terrainProvider]; + return Promise.resolve( + new GoogleEarthEnterpriseTerrainData({ + buffer: d, + childTileMask: computeChildMask(r, c, s), + credits: defined(T) ? [T] : void 0, + negativeAltitudeExponentBias: s.negativeAltitudeExponentBias, + negativeElevationThreshold: s.negativeAltitudeThreshold + }) + ); + } + if (o.tidy(), c.ancestorHasTerrain) { + if (l === TerrainState.NONE) + return Promise.reject(new RuntimeError("Terrain tile doesn't exist")); + } else return Promise.resolve( + new HeightmapTerrainData({ + buffer: new Uint8Array(16 * 16), + width: 16, + height: 16 + }) + ); + let f, h = r, p = -1; + switch (l) { + case TerrainState.SELF: + p = c.terrainVersion; + break; + case TerrainState.PARENT: + h = h.substring(0, h.length - 1), f = s.getTileInformationFromQuadKey(h), p = f.terrainVersion; + break; + case TerrainState.UNKNOWN: + c.hasTerrain() ? p = c.terrainVersion : (h = h.substring(0, h.length - 1), f = s.getTileInformationFromQuadKey(h), defined(f) && f.hasTerrain() && (p = f.terrainVersion)); + break; + } + if (p < 0) + return Promise.reject(new RuntimeError("Terrain tile doesn't exist")); + const m = this._terrainPromises, _ = this._terrainRequests; + let y, C; + if (defined(m[h])) + y = m[h], C = _[h]; + else { + C = i; + const T = buildTerrainResource( + this, + h, + p, + C + ).fetchArrayBuffer(); + if (!defined(T)) + return; + y = T.then(function(x) { + return defined(x) ? taskProcessor.scheduleTask( + { + buffer: x, + type: "Terrain", + key: s.key + }, + [x] + ).then(function(b) { + const S = s.getTileInformationFromQuadKey(h); + S.terrainState = TerrainState.SELF, o.add(h, b[0]); + const E = S.terrainProvider, A = b.length - 1; + for (let D = 0; D < A; ++D) { + const P = h + D.toString(), I = s.getTileInformationFromQuadKey(P); + defined(I) && (o.add(P, b[D + 1]), I.terrainState = TerrainState.PARENT, I.terrainProvider === 0 && (I.terrainProvider = E)); + } + }) : Promise.reject(new RuntimeError("Failed to load terrain.")); + }), m[h] = y, _[h] = C, y = y.finally(function() { + delete m[h], delete _[h]; + }); + } + return y.then(function() { + const T = o.get(r); + if (defined(T)) { + const x = s.providers[c.terrainProvider]; + return new GoogleEarthEnterpriseTerrainData({ + buffer: T, + childTileMask: computeChildMask(r, c, s), + credits: defined(x) ? [x] : void 0, + negativeAltitudeExponentBias: s.negativeAltitudeExponentBias, + negativeElevationThreshold: s.negativeAltitudeThreshold + }); + } + return Promise.reject(new RuntimeError("Failed to load terrain.")); + }).catch(function(T) { + return C.state === RequestState$1.CANCELLED ? (i.state = C.state, Promise.reject(T)) : (c.terrainState = TerrainState.NONE, Promise.reject(T)); + }); +}; +GoogleEarthEnterpriseTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +GoogleEarthEnterpriseTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { + const i = this._metadata; + let r = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e, t, n); + const o = i.getTileInformation(e, t, n); + if (o === null) + return !1; + if (defined(o)) { + if (!o.ancestorHasTerrain) + return !0; + const s = o.terrainState; + if (s === TerrainState.NONE) + return !1; + if ((!defined(s) || s === TerrainState.UNKNOWN) && (o.terrainState = TerrainState.UNKNOWN, !o.hasTerrain())) { + r = r.substring(0, r.length - 1); + const c = i.getTileInformationFromQuadKey(r); + if (!defined(c) || !c.hasTerrain()) + return !1; + } + return !0; + } + if (i.isValid(r)) { + const s = new Request({ + throttle: !1, + throttleByServer: !0, + type: RequestType$1.TERRAIN + }); + i.populateSubtree(e, t, n, s); + } + return !1; +}; +GoogleEarthEnterpriseTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { +}; +function buildTerrainResource(e, t, n, i) { + return n = defined(n) && n > 0 ? n : 1, e._metadata.resource.getDerivedResource({ + url: `flatfile?f1c-0${t}-t.${n.toString()}`, + request: i + }); +} +const GoogleMaps = {}; +GoogleMaps.defaultApiKey = void 0; +GoogleMaps.mapTilesApiEndpoint = new Resource({ + url: "https://tile.googleapis.com/v1/" +}); +GoogleMaps.getDefaultCredit = function() { + return new Credit( + '<img src="https://assets.ion.cesium.com/google-credit.png" style="vertical-align: -5px" alt="Google">', + !0 + ); +}; +const InterpolationAlgorithm = {}; +InterpolationAlgorithm.type = void 0; +InterpolationAlgorithm.getRequiredDataPoints = DeveloperError.throwInstantiationError; +InterpolationAlgorithm.interpolateOrderZero = DeveloperError.throwInstantiationError; +InterpolationAlgorithm.interpolate = DeveloperError.throwInstantiationError; +function PeliasGeocoderService(e) { + this._url = Resource.createIfNeeded(e), this._url.appendForwardSlash(); +} +Object.defineProperties(PeliasGeocoderService.prototype, { + /** + * The Resource used to access the Pelias endpoint. + * @type {Resource} + * @memberof PeliasGeocoderService.prototype + * @readonly + */ + url: { + get: function() { + return this._url; + } + }, + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof PeliasGeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: function() { + } + } +}); +PeliasGeocoderService.prototype.geocode = async function(e, t) { + return this._url.getDerivedResource({ + url: t === GeocodeType$1.AUTOCOMPLETE ? "autocomplete" : "search", + queryParameters: { + text: e + } + }).fetchJson().then(function(i) { + return i.features.map(function(r) { + let o; + const s = r.bbox; + if (defined(s)) + o = Rectangle.fromDegrees( + s[0], + s[1], + s[2], + s[3] + ); + else { + const c = r.geometry.coordinates[0], l = r.geometry.coordinates[1]; + o = Cartesian3.fromDegrees(c, l); + } + return { + displayName: r.properties.label, + destination: o, + attributions: i.attributions + }; + }); + }); +}; +function IonGeocoderService(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.accessToken, Ion.defaultAccessToken), n = Resource.createIfNeeded( + defaultValue(e.server, Ion.defaultServer) + ); + n.appendForwardSlash(); + const i = Ion.getDefaultTokenCredit(t); + defined(i) && e.scene.frameState.creditDisplay.addStaticCredit( + Credit.clone(i) + ); + const r = n.getDerivedResource({ + url: "v1/geocode" + }); + defined(t) && r.appendQueryParameters({ access_token: t }), this._accessToken = t, this._server = n, this._pelias = new PeliasGeocoderService(r); +} +Object.defineProperties(IonGeocoderService.prototype, { + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof IonGeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: function() { + } + } +}); +IonGeocoderService.prototype.geocode = async function(e, t) { + return this._pelias.geocode(e, t); +}; +function MapProjection() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(MapProjection.prototype, { + /** + * Gets the {@link Ellipsoid}. + * + * @memberof MapProjection.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: DeveloperError.throwInstantiationError + } +}); +MapProjection.prototype.project = DeveloperError.throwInstantiationError; +MapProjection.prototype.unproject = DeveloperError.throwInstantiationError; +function MorphWeightSpline(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.weights, n = e.times; + this._times = n, this._weights = t, this._count = t.length / n.length, this._lastTimeIndex = 0; +} +Object.defineProperties(MorphWeightSpline.prototype, { + /** + * An array of times for the control weights. + * + * @memberof WeightSpline.prototype + * + * @type {number[]} + * @readonly + */ + times: { + get: function() { + return this._times; + } + }, + /** + * An array of floating-point array control weights. + * + * @memberof WeightSpline.prototype + * + * @type {number[]} + * @readonly + */ + weights: { + get: function() { + return this._weights; + } + } +}); +MorphWeightSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval; +MorphWeightSpline.prototype.wrapTime = Spline.prototype.wrapTime; +MorphWeightSpline.prototype.clampTime = Spline.prototype.clampTime; +MorphWeightSpline.prototype.evaluate = function(e, t) { + const n = this.weights, i = this.times, r = this._lastTimeIndex = this.findTimeInterval( + e, + this._lastTimeIndex + ), o = (e - i[r]) / (i[r + 1] - i[r]); + defined(t) || (t = new Array(this._count)); + for (let s = 0; s < this._count; s++) { + const c = r * this._count + s; + t[s] = n[c] * (1 - o) + n[c + this._count] * o; + } + return t; +}; +function OpenCageGeocoderService(e, t, n) { + e = Resource.createIfNeeded(e), e.appendForwardSlash(), e.setQueryParameters({ key: t }), this._url = e, this._params = defaultValue(n, {}), this._credit = new Credit( + 'Geodata copyright <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors', + !1 + ); +} +Object.defineProperties(OpenCageGeocoderService.prototype, { + /** + * The Resource used to access the OpenCage endpoint. + * @type {Resource} + * @memberof OpenCageGeocoderService.prototype + * @readonly + */ + url: { + get: function() { + return this._url; + } + }, + /** + * Optional params passed to OpenCage in order to customize geocoding + * @type {object} + * @memberof OpenCageGeocoderService.prototype + * @readonly + */ + params: { + get: function() { + return this._params; + } + }, + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + * @memberof OpenCageGeocoderService.prototype + * @type {Credit|undefined} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + } +}); +OpenCageGeocoderService.prototype.geocode = async function(e) { + return this._url.getDerivedResource({ + url: "json", + queryParameters: combine$2(this._params, { q: e }) + }).fetchJson().then(function(n) { + return n.results.map(function(i) { + let r; + const o = i.bounds; + if (defined(o)) + r = Rectangle.fromDegrees( + o.southwest.lng, + o.southwest.lat, + o.northeast.lng, + o.northeast.lat + ); + else { + const s = i.geometry.lat, c = i.geometry.lng; + r = Cartesian3.fromDegrees(s, c); + } + return { + displayName: i.formatted, + destination: r + }; + }); + }); +}; +const Packable = { + /** + * The number of elements used to pack the object into an array. + * @type {number} + */ + packedLength: void 0, + /** + * Stores the provided instance into the provided array. + * @function + * + * @param {*} value The value to pack. + * @param {number[]} array The array to pack into. + * @param {number} [startingIndex=0] The index into the array at which to start packing the elements. + */ + pack: DeveloperError.throwInstantiationError, + /** + * Retrieves an instance from a packed array. + * @function + * + * @param {number[]} array The packed array. + * @param {number} [startingIndex=0] The starting index of the element to be unpacked. + * @param {object} [result] The object into which to store the result. + * @returns {object} The modified result parameter or a new Object instance if one was not provided. + */ + unpack: DeveloperError.throwInstantiationError +}, PackableForInterpolation = { + /** + * The number of elements used to store the object into an array in its interpolatable form. + * @type {number} + */ + packedInterpolationLength: void 0, + /** + * Converts a packed array into a form suitable for interpolation. + * @function + * + * @param {number[]} packedArray The packed array. + * @param {number} [startingIndex=0] The index of the first element to be converted. + * @param {number} [lastIndex=packedArray.length] The index of the last element to be converted. + * @param {number[]} [result] The object into which to store the result. + */ + convertPackedArrayForInterpolation: DeveloperError.throwInstantiationError, + /** + * Retrieves an instance from a packed array converted with {@link PackableForInterpolation.convertPackedArrayForInterpolation}. + * @function + * + * @param {number[]} array The array previously packed for interpolation. + * @param {number[]} sourceArray The original packed array. + * @param {number} [startingIndex=0] The startingIndex used to convert the array. + * @param {number} [lastIndex=packedArray.length] The lastIndex used to convert the array. + * @param {object} [result] The object into which to store the result. + * @returns {object} The modified result parameter or a new Object instance if one was not provided. + */ + unpackInterpolationResult: DeveloperError.throwInstantiationError +}; +function Proxy() { + DeveloperError.throwInstantiationError(); +} +Proxy.prototype.getURL = DeveloperError.throwInstantiationError; +function interpolateColors(e, t, n, i, r, o, s) { + const c = PolylinePipeline.numberOfPoints(e, t, r); + let l; + const d = n.red, f = n.green, h = n.blue, p = n.alpha, m = i.red, _ = i.green, y = i.blue, C = i.alpha; + if (Color.equals(n, i)) { + for (l = 0; l < c; l++) + o[s++] = Color.floatToByte(d), o[s++] = Color.floatToByte(f), o[s++] = Color.floatToByte(h), o[s++] = Color.floatToByte(p); + return s; + } + const T = (m - d) / c, x = (_ - f) / c, b = (y - h) / c, S = (C - p) / c; + let E = s; + for (l = 0; l < c; l++) + o[E++] = Color.floatToByte(d + l * T), o[E++] = Color.floatToByte(f + l * x), o[E++] = Color.floatToByte(h + l * b), o[E++] = Color.floatToByte(p + l * S); + return E; +} +function SimplePolylineGeometry(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.positions, n = e.colors, i = defaultValue(e.colorsPerVertex, !1); + this._positions = t, this._colors = n, this._colorsPerVertex = i, this._arcType = defaultValue(e.arcType, ArcType$1.GEODESIC), this._granularity = defaultValue( + e.granularity, + CesiumMath.RADIANS_PER_DEGREE + ), this._ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this._workerName = "createSimplePolylineGeometry"; + let r = 1 + t.length * Cartesian3.packedLength; + r += defined(n) ? 1 + n.length * Color.packedLength : 1, this.packedLength = r + Ellipsoid.packedLength + 3; +} +SimplePolylineGeometry.pack = function(e, t, n) { + n = defaultValue(n, 0); + let i; + const r = e._positions; + let o = r.length; + for (t[n++] = o, i = 0; i < o; ++i, n += Cartesian3.packedLength) + Cartesian3.pack(r[i], t, n); + const s = e._colors; + for (o = defined(s) ? s.length : 0, t[n++] = o, i = 0; i < o; ++i, n += Color.packedLength) + Color.pack(s[i], t, n); + return Ellipsoid.pack(e._ellipsoid, t, n), n += Ellipsoid.packedLength, t[n++] = e._colorsPerVertex ? 1 : 0, t[n++] = e._arcType, t[n] = e._granularity, t; +}; +SimplePolylineGeometry.unpack = function(e, t, n) { + t = defaultValue(t, 0); + let i, r = e[t++]; + const o = new Array(r); + for (i = 0; i < r; ++i, t += Cartesian3.packedLength) + o[i] = Cartesian3.unpack(e, t); + r = e[t++]; + const s = r > 0 ? new Array(r) : void 0; + for (i = 0; i < r; ++i, t += Color.packedLength) + s[i] = Color.unpack(e, t); + const c = Ellipsoid.unpack(e, t); + t += Ellipsoid.packedLength; + const l = e[t++] === 1, d = e[t++], f = e[t]; + return defined(n) ? (n._positions = o, n._colors = s, n._ellipsoid = c, n._colorsPerVertex = l, n._arcType = d, n._granularity = f, n) : new SimplePolylineGeometry({ + positions: o, + colors: s, + ellipsoid: c, + colorsPerVertex: l, + arcType: d, + granularity: f + }); +}; +const scratchArray1 = new Array(2), scratchArray2 = new Array(2), generateArcOptionsScratch = { + positions: scratchArray1, + height: scratchArray2, + ellipsoid: void 0, + minDistance: void 0, + granularity: void 0 +}; +SimplePolylineGeometry.createGeometry = function(e) { + const t = e._positions, n = e._colors, i = e._colorsPerVertex, r = e._arcType, o = e._granularity, s = e._ellipsoid, c = CesiumMath.chordLength( + o, + s.maximumRadius + ), l = defined(n) && !i; + let d; + const f = t.length; + let h, p, m, _, y = 0; + if (r === ArcType$1.GEODESIC || r === ArcType$1.RHUMB) { + let S, E, A; + r === ArcType$1.GEODESIC ? (S = CesiumMath.chordLength( + o, + s.maximumRadius + ), E = PolylinePipeline.numberOfPoints, A = PolylinePipeline.generateArc) : (S = o, E = PolylinePipeline.numberOfPointsRhumbLine, A = PolylinePipeline.generateRhumbArc); + const D = PolylinePipeline.extractHeights(t, s), P = generateArcOptionsScratch; + if (r === ArcType$1.GEODESIC ? P.minDistance = c : P.granularity = o, P.ellipsoid = s, l) { + let I = 0; + for (d = 0; d < f - 1; d++) + I += E( + t[d], + t[d + 1], + S + ) + 1; + h = new Float64Array(I * 3), m = new Uint8Array(I * 4), P.positions = scratchArray1, P.height = scratchArray2; + let M = 0; + for (d = 0; d < f - 1; ++d) { + scratchArray1[0] = t[d], scratchArray1[1] = t[d + 1], scratchArray2[0] = D[d], scratchArray2[1] = D[d + 1]; + const R = A(P); + if (defined(n)) { + const L = R.length / 3; + _ = n[d]; + for (let g = 0; g < L; ++g) + m[M++] = Color.floatToByte(_.red), m[M++] = Color.floatToByte(_.green), m[M++] = Color.floatToByte(_.blue), m[M++] = Color.floatToByte(_.alpha); + } + h.set(R, y), y += R.length; + } + } else if (P.positions = t, P.height = D, h = new Float64Array( + A(P) + ), defined(n)) { + for (m = new Uint8Array(h.length / 3 * 4), d = 0; d < f - 1; ++d) { + const M = t[d], R = t[d + 1], L = n[d], g = n[d + 1]; + y = interpolateColors( + M, + R, + L, + g, + c, + m, + y + ); + } + const I = n[f - 1]; + m[y++] = Color.floatToByte(I.red), m[y++] = Color.floatToByte(I.green), m[y++] = Color.floatToByte(I.blue), m[y++] = Color.floatToByte(I.alpha); + } + } else { + p = l ? f * 2 - 2 : f, h = new Float64Array(p * 3), m = defined(n) ? new Uint8Array(p * 4) : void 0; + let S = 0, E = 0; + for (d = 0; d < f; ++d) { + const A = t[d]; + if (l && d > 0 && (Cartesian3.pack(A, h, S), S += 3, _ = n[d - 1], m[E++] = Color.floatToByte(_.red), m[E++] = Color.floatToByte(_.green), m[E++] = Color.floatToByte(_.blue), m[E++] = Color.floatToByte(_.alpha)), l && d === f - 1) + break; + Cartesian3.pack(A, h, S), S += 3, defined(n) && (_ = n[d], m[E++] = Color.floatToByte(_.red), m[E++] = Color.floatToByte(_.green), m[E++] = Color.floatToByte(_.blue), m[E++] = Color.floatToByte(_.alpha)); + } + } + const C = new GeometryAttributes(); + C.position = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.DOUBLE, + componentsPerAttribute: 3, + values: h + }), defined(n) && (C.color = new GeometryAttribute({ + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + componentsPerAttribute: 4, + values: m, + normalize: !0 + })), p = h.length / 3; + const T = (p - 1) * 2, x = IndexDatatype$1.createTypedArray( + p, + T + ); + let b = 0; + for (d = 0; d < p - 1; ++d) + x[b++] = d, x[b++] = d + 1; + return new Geometry({ + attributes: C, + indices: x, + primitiveType: PrimitiveType$1.LINES, + boundingSphere: BoundingSphere.fromPoints(t) + }); +}; +function SphereGeometry(e) { + const t = defaultValue(e.radius, 1), i = { + radii: new Cartesian3(t, t, t), + stackPartitions: e.stackPartitions, + slicePartitions: e.slicePartitions, + vertexFormat: e.vertexFormat + }; + this._ellipsoidGeometry = new EllipsoidGeometry(i), this._workerName = "createSphereGeometry"; +} +SphereGeometry.packedLength = EllipsoidGeometry.packedLength; +SphereGeometry.pack = function(e, t, n) { + return EllipsoidGeometry.pack(e._ellipsoidGeometry, t, n); +}; +const scratchEllipsoidGeometry = new EllipsoidGeometry(), scratchOptions = { + radius: void 0, + radii: new Cartesian3(), + vertexFormat: new VertexFormat(), + stackPartitions: void 0, + slicePartitions: void 0 +}; +SphereGeometry.unpack = function(e, t, n) { + const i = EllipsoidGeometry.unpack( + e, + t, + scratchEllipsoidGeometry + ); + return scratchOptions.vertexFormat = VertexFormat.clone( + i._vertexFormat, + scratchOptions.vertexFormat + ), scratchOptions.stackPartitions = i._stackPartitions, scratchOptions.slicePartitions = i._slicePartitions, defined(n) ? (Cartesian3.clone(i._radii, scratchOptions.radii), n._ellipsoidGeometry = new EllipsoidGeometry(scratchOptions), n) : (scratchOptions.radius = i._radii.x, new SphereGeometry(scratchOptions)); +}; +SphereGeometry.createGeometry = function(e) { + return EllipsoidGeometry.createGeometry(e._ellipsoidGeometry); +}; +function TilingScheme(e) { +} +Object.defineProperties(TilingScheme.prototype, { + /** + * Gets the ellipsoid that is tiled by the tiling scheme. + * @memberof TilingScheme.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + * @memberof TilingScheme.prototype + * @type {Rectangle} + */ + rectangle: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the map projection used by the tiling scheme. + * @memberof TilingScheme.prototype + * @type {MapProjection} + */ + projection: { + get: DeveloperError.throwInstantiationError + } +}); +TilingScheme.prototype.getNumberOfXTilesAtLevel = DeveloperError.throwInstantiationError; +TilingScheme.prototype.getNumberOfYTilesAtLevel = DeveloperError.throwInstantiationError; +TilingScheme.prototype.rectangleToNativeRectangle = DeveloperError.throwInstantiationError; +TilingScheme.prototype.tileXYToNativeRectangle = DeveloperError.throwInstantiationError; +TilingScheme.prototype.tileXYToRectangle = DeveloperError.throwInstantiationError; +TilingScheme.prototype.positionToTileXY = DeveloperError.throwInstantiationError; +function DataRectangle(e, t) { + this.rectangle = e, this.maxLevel = t; +} +function TerrainProviderBuilder(e) { + this.ellipsoid = defaultValue(e.ellipsoid, Ellipsoid.default), this.tilingScheme = void 0, this.heightmapWidth = void 0, this.heightmapHeight = void 0, this.levelZeroMaximumGeometricError = void 0, this.rectangles = []; +} +TerrainProviderBuilder.prototype.build = function(e) { + e._tilingScheme = this.tilingScheme, e._heightmapWidth = this.heightmapWidth, e._heightmapHeight = this.heightmapHeight, e._levelZeroMaximumGeometricError = this.levelZeroMaximumGeometricError, e._rectangles = this.rectangles; +}; +function metadataSuccess(e, t) { + const n = t.getElementsByTagName("SRS")[0].textContent; + if (n === "EPSG:4326") + e.tilingScheme = new GeographicTilingScheme({ + ellipsoid: e.ellipsoid + }); + else + throw new RuntimeError(`SRS ${n} is not supported`); + const i = t.getElementsByTagName("TileFormat")[0]; + e.heightmapWidth = parseInt( + i.getAttribute("width"), + 10 + ), e.heightmapHeight = parseInt( + i.getAttribute("height"), + 10 + ), e.levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap( + e.ellipsoid, + Math.min( + e.heightmapWidth, + e.heightmapHeight + ), + e.tilingScheme.getNumberOfXTilesAtLevel(0) + ); + const r = t.getElementsByTagName("DataExtent"); + for (let o = 0; o < r.length; ++o) { + const s = r[o], c = CesiumMath.toRadians( + parseFloat(s.getAttribute("minx")) + ), l = CesiumMath.toRadians( + parseFloat(s.getAttribute("miny")) + ), d = CesiumMath.toRadians( + parseFloat(s.getAttribute("maxx")) + ), f = CesiumMath.toRadians( + parseFloat(s.getAttribute("maxy")) + ), h = parseInt(s.getAttribute("maxlevel"), 10); + e.rectangles.push( + new DataRectangle(new Rectangle(c, l, d, f), h) + ); + } +} +function metadataFailure(e, t, n) { + let i = `An error occurred while accessing ${e.url}`; + throw defined(t) && defined(t.message) && (i = `${i}: ${t.message}`), TileProviderError.reportError( + void 0, + n, + defined(n) ? n._errorEvent : void 0, + i + ), new RuntimeError(i); +} +async function requestMetadata(e, t, n) { + try { + const i = await t.fetchXML(); + metadataSuccess(e, i); + } catch (i) { + metadataFailure(t, i, n); + } +} +function VRTheWorldTerrainProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._errorEvent = new Event(), this._terrainDataStructure = { + heightScale: 1 / 1e3, + heightOffset: -1e3, + elementsPerHeight: 3, + stride: 4, + elementMultiplier: 256, + isBigEndian: !0, + lowestEncodedHeight: 0, + highestEncodedHeight: 256 * 256 * 256 - 1 + }; + let t = e.credit; + typeof t == "string" && (t = new Credit(t)), this._credit = t, this._tilingScheme = void 0, this._rectangles = []; +} +Object.defineProperties(VRTheWorldTerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {GeographicTilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: function() { + return !1; + } + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: function() { + return !1; + } + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: function() { + } + } +}); +VRTheWorldTerrainProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = new TerrainProviderBuilder(t), i = Resource.createIfNeeded(e); + await requestMetadata(n, i); + const r = new VRTheWorldTerrainProvider(t); + return n.build(r), r._resource = i, r; +}; +VRTheWorldTerrainProvider.prototype.requestTileGeometry = function(e, t, n, i) { + const r = this._tilingScheme.getNumberOfYTilesAtLevel(n), s = this._resource.getDerivedResource({ + url: `${n}/${e}/${r - t - 1}.tif`, + queryParameters: { + cesium: !0 + }, + request: i + }).fetchImage({ + preferImageBitmap: !0 + }); + if (!defined(s)) + return; + const c = this; + return Promise.resolve(s).then(function(l) { + return new HeightmapTerrainData({ + buffer: getImagePixels(l), + width: c._heightmapWidth, + height: c._heightmapHeight, + childTileMask: getChildMask(c, e, t, n), + structure: c._terrainDataStructure + }); + }); +}; +VRTheWorldTerrainProvider.prototype.getLevelMaximumGeometricError = function(e) { + return this._levelZeroMaximumGeometricError / (1 << e); +}; +const rectangleScratch = new Rectangle(); +function getChildMask(e, t, n, i) { + const r = e._tilingScheme, o = e._rectangles, s = r.tileXYToRectangle(t, n, i); + let c = 0; + for (let l = 0; l < o.length && c !== 15; ++l) { + const d = o[l]; + if (d.maxLevel <= i) + continue; + const f = d.rectangle, h = Rectangle.intersection( + f, + s, + rectangleScratch + ); + defined(h) && (isTileInRectangle(r, f, t * 2, n * 2, i + 1) && (c |= 4), isTileInRectangle( + r, + f, + t * 2 + 1, + n * 2, + i + 1 + ) && (c |= 8), isTileInRectangle( + r, + f, + t * 2, + n * 2 + 1, + i + 1 + ) && (c |= 1), isTileInRectangle( + r, + f, + t * 2 + 1, + n * 2 + 1, + i + 1 + ) && (c |= 2)); + } + return c; +} +function isTileInRectangle(e, t, n, i, r) { + const o = e.tileXYToRectangle(n, i, r); + return defined( + Rectangle.intersection(o, t, rectangleScratch) + ); +} +VRTheWorldTerrainProvider.prototype.getTileDataAvailable = function(e, t, n) { +}; +VRTheWorldTerrainProvider.prototype.loadTileDataAvailability = function(e, t, n) { +}; +function VideoSynchronizer(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._clock = void 0, this._element = void 0, this._clockSubscription = void 0, this._seekFunction = void 0, this._lastPlaybackRate = void 0, this.clock = e.clock, this.element = e.element, this.epoch = defaultValue(e.epoch, Iso8601.MINIMUM_VALUE), this.tolerance = defaultValue(e.tolerance, 1), this._seeking = !1, this._seekFunction = void 0, this._firstTickAfterSeek = !1; +} +Object.defineProperties(VideoSynchronizer.prototype, { + /** + * Gets or sets the clock used to drive the video element. + * + * @memberof VideoSynchronizer.prototype + * @type {Clock} + */ + clock: { + get: function() { + return this._clock; + }, + set: function(e) { + const t = this._clock; + t !== e && (defined(t) && (this._clockSubscription(), this._clockSubscription = void 0), defined(e) && (this._clockSubscription = e.onTick.addEventListener( + VideoSynchronizer.prototype._onTick, + this + )), this._clock = e); + } + }, + /** + * Gets or sets the video element to synchronize. + * + * @memberof VideoSynchronizer.prototype + * @type {HTMLVideoElement} + */ + element: { + get: function() { + return this._element; + }, + set: function(e) { + const t = this._element; + t !== e && (defined(t) && t.removeEventListener("seeked", this._seekFunction, !1), defined(e) && (this._seeking = !1, this._seekFunction = createSeekFunction(this), e.addEventListener("seeked", this._seekFunction, !1)), this._element = e, this._seeking = !1, this._firstTickAfterSeek = !1); + } + } +}); +VideoSynchronizer.prototype.destroy = function() { + return this.element = void 0, this.clock = void 0, destroyObject(this); +}; +VideoSynchronizer.prototype.isDestroyed = function() { + return !1; +}; +VideoSynchronizer.prototype._trySetPlaybackRate = function(e) { + if (this._lastPlaybackRate === e.multiplier) + return; + const t = this._element; + try { + t.playbackRate = e.multiplier; + } catch { + t.playbackRate = 0; + } + this._lastPlaybackRate = e.multiplier; +}; +VideoSynchronizer.prototype._onTick = function(e) { + const t = this._element; + if (!defined(t) || t.readyState < 2) + return; + const n = t.paused, i = e.shouldAnimate; + if (i === n && (i ? t.play() : t.pause()), this._seeking || this._firstTickAfterSeek) { + this._firstTickAfterSeek = !1; + return; + } + this._trySetPlaybackRate(e); + const r = e.currentTime, o = defaultValue(this.epoch, Iso8601.MINIMUM_VALUE); + let s = JulianDate.secondsDifference(r, o); + const c = t.duration; + let l; + const d = t.currentTime; + t.loop ? (s = s % c, s < 0 && (s = c - s), l = s) : s > c ? l = c : s < 0 ? l = 0 : l = s; + const f = i ? defaultValue(this.tolerance, 1) : 1e-3; + Math.abs(l - d) > f && (this._seeking = !0, t.currentTime = l); +}; +function createSeekFunction(e) { + return function() { + e._seeking = !1, e._firstTickAfterSeek = !0; + }; +} +const VulkanConstants = { + VK_FORMAT_UNDEFINED: 0, + VK_FORMAT_R4G4_UNORM_PACK8: 1, + VK_FORMAT_R4G4B4A4_UNORM_PACK16: 2, + VK_FORMAT_B4G4R4A4_UNORM_PACK16: 3, + VK_FORMAT_R5G6B5_UNORM_PACK16: 4, + VK_FORMAT_B5G6R5_UNORM_PACK16: 5, + VK_FORMAT_R5G5B5A1_UNORM_PACK16: 6, + VK_FORMAT_B5G5R5A1_UNORM_PACK16: 7, + VK_FORMAT_A1R5G5B5_UNORM_PACK16: 8, + VK_FORMAT_R8_UNORM: 9, + VK_FORMAT_R8_SNORM: 10, + VK_FORMAT_R8_USCALED: 11, + VK_FORMAT_R8_SSCALED: 12, + VK_FORMAT_R8_UINT: 13, + VK_FORMAT_R8_SINT: 14, + VK_FORMAT_R8_SRGB: 15, + VK_FORMAT_R8G8_UNORM: 16, + VK_FORMAT_R8G8_SNORM: 17, + VK_FORMAT_R8G8_USCALED: 18, + VK_FORMAT_R8G8_SSCALED: 19, + VK_FORMAT_R8G8_UINT: 20, + VK_FORMAT_R8G8_SINT: 21, + VK_FORMAT_R8G8_SRGB: 22, + VK_FORMAT_R8G8B8_UNORM: 23, + VK_FORMAT_R8G8B8_SNORM: 24, + VK_FORMAT_R8G8B8_USCALED: 25, + VK_FORMAT_R8G8B8_SSCALED: 26, + VK_FORMAT_R8G8B8_UINT: 27, + VK_FORMAT_R8G8B8_SINT: 28, + VK_FORMAT_R8G8B8_SRGB: 29, + VK_FORMAT_B8G8R8_UNORM: 30, + VK_FORMAT_B8G8R8_SNORM: 31, + VK_FORMAT_B8G8R8_USCALED: 32, + VK_FORMAT_B8G8R8_SSCALED: 33, + VK_FORMAT_B8G8R8_UINT: 34, + VK_FORMAT_B8G8R8_SINT: 35, + VK_FORMAT_B8G8R8_SRGB: 36, + VK_FORMAT_R8G8B8A8_UNORM: 37, + VK_FORMAT_R8G8B8A8_SNORM: 38, + VK_FORMAT_R8G8B8A8_USCALED: 39, + VK_FORMAT_R8G8B8A8_SSCALED: 40, + VK_FORMAT_R8G8B8A8_UINT: 41, + VK_FORMAT_R8G8B8A8_SINT: 42, + VK_FORMAT_R8G8B8A8_SRGB: 43, + VK_FORMAT_B8G8R8A8_UNORM: 44, + VK_FORMAT_B8G8R8A8_SNORM: 45, + VK_FORMAT_B8G8R8A8_USCALED: 46, + VK_FORMAT_B8G8R8A8_SSCALED: 47, + VK_FORMAT_B8G8R8A8_UINT: 48, + VK_FORMAT_B8G8R8A8_SINT: 49, + VK_FORMAT_B8G8R8A8_SRGB: 50, + VK_FORMAT_A8B8G8R8_UNORM_PACK32: 51, + VK_FORMAT_A8B8G8R8_SNORM_PACK32: 52, + VK_FORMAT_A8B8G8R8_USCALED_PACK32: 53, + VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 54, + VK_FORMAT_A8B8G8R8_UINT_PACK32: 55, + VK_FORMAT_A8B8G8R8_SINT_PACK32: 56, + VK_FORMAT_A8B8G8R8_SRGB_PACK32: 57, + VK_FORMAT_A2R10G10B10_UNORM_PACK32: 58, + VK_FORMAT_A2R10G10B10_SNORM_PACK32: 59, + VK_FORMAT_A2R10G10B10_USCALED_PACK32: 60, + VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 61, + VK_FORMAT_A2R10G10B10_UINT_PACK32: 62, + VK_FORMAT_A2R10G10B10_SINT_PACK32: 63, + VK_FORMAT_A2B10G10R10_UNORM_PACK32: 64, + VK_FORMAT_A2B10G10R10_SNORM_PACK32: 65, + VK_FORMAT_A2B10G10R10_USCALED_PACK32: 66, + VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 67, + VK_FORMAT_A2B10G10R10_UINT_PACK32: 68, + VK_FORMAT_A2B10G10R10_SINT_PACK32: 69, + VK_FORMAT_R16_UNORM: 70, + VK_FORMAT_R16_SNORM: 71, + VK_FORMAT_R16_USCALED: 72, + VK_FORMAT_R16_SSCALED: 73, + VK_FORMAT_R16_UINT: 74, + VK_FORMAT_R16_SINT: 75, + VK_FORMAT_R16_SFLOAT: 76, + VK_FORMAT_R16G16_UNORM: 77, + VK_FORMAT_R16G16_SNORM: 78, + VK_FORMAT_R16G16_USCALED: 79, + VK_FORMAT_R16G16_SSCALED: 80, + VK_FORMAT_R16G16_UINT: 81, + VK_FORMAT_R16G16_SINT: 82, + VK_FORMAT_R16G16_SFLOAT: 83, + VK_FORMAT_R16G16B16_UNORM: 84, + VK_FORMAT_R16G16B16_SNORM: 85, + VK_FORMAT_R16G16B16_USCALED: 86, + VK_FORMAT_R16G16B16_SSCALED: 87, + VK_FORMAT_R16G16B16_UINT: 88, + VK_FORMAT_R16G16B16_SINT: 89, + VK_FORMAT_R16G16B16_SFLOAT: 90, + VK_FORMAT_R16G16B16A16_UNORM: 91, + VK_FORMAT_R16G16B16A16_SNORM: 92, + VK_FORMAT_R16G16B16A16_USCALED: 93, + VK_FORMAT_R16G16B16A16_SSCALED: 94, + VK_FORMAT_R16G16B16A16_UINT: 95, + VK_FORMAT_R16G16B16A16_SINT: 96, + VK_FORMAT_R16G16B16A16_SFLOAT: 97, + VK_FORMAT_R32_UINT: 98, + VK_FORMAT_R32_SINT: 99, + VK_FORMAT_R32_SFLOAT: 100, + VK_FORMAT_R32G32_UINT: 101, + VK_FORMAT_R32G32_SINT: 102, + VK_FORMAT_R32G32_SFLOAT: 103, + VK_FORMAT_R32G32B32_UINT: 104, + VK_FORMAT_R32G32B32_SINT: 105, + VK_FORMAT_R32G32B32_SFLOAT: 106, + VK_FORMAT_R32G32B32A32_UINT: 107, + VK_FORMAT_R32G32B32A32_SINT: 108, + VK_FORMAT_R32G32B32A32_SFLOAT: 109, + VK_FORMAT_R64_UINT: 110, + VK_FORMAT_R64_SINT: 111, + VK_FORMAT_R64_SFLOAT: 112, + VK_FORMAT_R64G64_UINT: 113, + VK_FORMAT_R64G64_SINT: 114, + VK_FORMAT_R64G64_SFLOAT: 115, + VK_FORMAT_R64G64B64_UINT: 116, + VK_FORMAT_R64G64B64_SINT: 117, + VK_FORMAT_R64G64B64_SFLOAT: 118, + VK_FORMAT_R64G64B64A64_UINT: 119, + VK_FORMAT_R64G64B64A64_SINT: 120, + VK_FORMAT_R64G64B64A64_SFLOAT: 121, + VK_FORMAT_B10G11R11_UFLOAT_PACK32: 122, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 123, + VK_FORMAT_D16_UNORM: 124, + VK_FORMAT_X8_D24_UNORM_PACK32: 125, + VK_FORMAT_D32_SFLOAT: 126, + VK_FORMAT_S8_UINT: 127, + VK_FORMAT_D16_UNORM_S8_UINT: 128, + VK_FORMAT_D24_UNORM_S8_UINT: 129, + VK_FORMAT_D32_SFLOAT_S8_UINT: 130, + VK_FORMAT_BC1_RGB_UNORM_BLOCK: 131, + VK_FORMAT_BC1_RGB_SRGB_BLOCK: 132, + VK_FORMAT_BC1_RGBA_UNORM_BLOCK: 133, + VK_FORMAT_BC1_RGBA_SRGB_BLOCK: 134, + VK_FORMAT_BC2_UNORM_BLOCK: 135, + VK_FORMAT_BC2_SRGB_BLOCK: 136, + VK_FORMAT_BC3_UNORM_BLOCK: 137, + VK_FORMAT_BC3_SRGB_BLOCK: 138, + VK_FORMAT_BC4_UNORM_BLOCK: 139, + VK_FORMAT_BC4_SNORM_BLOCK: 140, + VK_FORMAT_BC5_UNORM_BLOCK: 141, + VK_FORMAT_BC5_SNORM_BLOCK: 142, + VK_FORMAT_BC6H_UFLOAT_BLOCK: 143, + VK_FORMAT_BC6H_SFLOAT_BLOCK: 144, + VK_FORMAT_BC7_UNORM_BLOCK: 145, + VK_FORMAT_BC7_SRGB_BLOCK: 146, + VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: 147, + VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: 148, + VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: 149, + VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: 150, + VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: 151, + VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: 152, + VK_FORMAT_EAC_R11_UNORM_BLOCK: 153, + VK_FORMAT_EAC_R11_SNORM_BLOCK: 154, + VK_FORMAT_EAC_R11G11_UNORM_BLOCK: 155, + VK_FORMAT_EAC_R11G11_SNORM_BLOCK: 156, + VK_FORMAT_ASTC_4x4_UNORM_BLOCK: 157, + VK_FORMAT_ASTC_4x4_SRGB_BLOCK: 158, + VK_FORMAT_ASTC_5x4_UNORM_BLOCK: 159, + VK_FORMAT_ASTC_5x4_SRGB_BLOCK: 160, + VK_FORMAT_ASTC_5x5_UNORM_BLOCK: 161, + VK_FORMAT_ASTC_5x5_SRGB_BLOCK: 162, + VK_FORMAT_ASTC_6x5_UNORM_BLOCK: 163, + VK_FORMAT_ASTC_6x5_SRGB_BLOCK: 164, + VK_FORMAT_ASTC_6x6_UNORM_BLOCK: 165, + VK_FORMAT_ASTC_6x6_SRGB_BLOCK: 166, + VK_FORMAT_ASTC_8x5_UNORM_BLOCK: 167, + VK_FORMAT_ASTC_8x5_SRGB_BLOCK: 168, + VK_FORMAT_ASTC_8x6_UNORM_BLOCK: 169, + VK_FORMAT_ASTC_8x6_SRGB_BLOCK: 170, + VK_FORMAT_ASTC_8x8_UNORM_BLOCK: 171, + VK_FORMAT_ASTC_8x8_SRGB_BLOCK: 172, + VK_FORMAT_ASTC_10x5_UNORM_BLOCK: 173, + VK_FORMAT_ASTC_10x5_SRGB_BLOCK: 174, + VK_FORMAT_ASTC_10x6_UNORM_BLOCK: 175, + VK_FORMAT_ASTC_10x6_SRGB_BLOCK: 176, + VK_FORMAT_ASTC_10x8_UNORM_BLOCK: 177, + VK_FORMAT_ASTC_10x8_SRGB_BLOCK: 178, + VK_FORMAT_ASTC_10x10_UNORM_BLOCK: 179, + VK_FORMAT_ASTC_10x10_SRGB_BLOCK: 180, + VK_FORMAT_ASTC_12x10_UNORM_BLOCK: 181, + VK_FORMAT_ASTC_12x10_SRGB_BLOCK: 182, + VK_FORMAT_ASTC_12x12_UNORM_BLOCK: 183, + VK_FORMAT_ASTC_12x12_SRGB_BLOCK: 184, + VK_FORMAT_G8B8G8R8_422_UNORM: 1000156e3, + VK_FORMAT_B8G8R8G8_422_UNORM: 1000156001, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 1000156002, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 1000156003, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: 1000156004, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: 1000156005, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: 1000156006, + VK_FORMAT_R10X6_UNORM_PACK16: 1000156007, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16: 1000156008, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: 1000156009, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: 1000156010, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: 1000156011, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: 1000156012, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: 1000156013, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: 1000156014, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: 1000156015, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: 1000156016, + VK_FORMAT_R12X4_UNORM_PACK16: 1000156017, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16: 1000156018, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: 1000156019, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: 1000156020, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: 1000156021, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: 1000156022, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: 1000156023, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: 1000156024, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: 1000156025, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: 1000156026, + VK_FORMAT_G16B16G16R16_422_UNORM: 1000156027, + VK_FORMAT_B16G16R16G16_422_UNORM: 1000156028, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: 1000156029, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: 1000156030, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: 1000156031, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: 1000156032, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: 1000156033, + VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: 1000054e3, + VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: 1000054001, + VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: 1000054002, + VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: 1000054003, + VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: 1000054004, + VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: 1000054005, + VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: 1000054006, + VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: 1000054007, + VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT: 1000066e3, + VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT: 1000066001, + VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT: 1000066002, + VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT: 1000066003, + VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT: 1000066004, + VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT: 1000066005, + VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT: 1000066006, + VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT: 1000066007, + VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT: 1000066008, + VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT: 1000066009, + VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT: 1000066010, + VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT: 1000066011, + VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT: 1000066012, + VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT: 1000066013, + VK_FORMAT_G8B8G8R8_422_UNORM_KHR: 1000156e3, + VK_FORMAT_B8G8R8G8_422_UNORM_KHR: 1000156001, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR: 1000156002, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR: 1000156003, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR: 1000156004, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR: 1000156005, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR: 1000156006, + VK_FORMAT_R10X6_UNORM_PACK16_KHR: 1000156007, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR: 1000156008, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR: 1000156009, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: 1000156010, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: 1000156011, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR: 1000156012, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR: 1000156013, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR: 1000156014, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR: 1000156015, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR: 1000156016, + VK_FORMAT_R12X4_UNORM_PACK16_KHR: 1000156017, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR: 1000156018, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR: 1000156019, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: 1000156020, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: 1000156021, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR: 1000156022, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR: 1000156023, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR: 1000156024, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR: 1000156025, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR: 1000156026, + VK_FORMAT_G16B16G16R16_422_UNORM_KHR: 1000156027, + VK_FORMAT_B16G16R16G16_422_UNORM_KHR: 1000156028, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR: 1000156029, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR: 1000156030, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR: 1000156031, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR: 1000156032, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR: 1000156033 +}, VulkanConstants$1 = Object.freeze(VulkanConstants); +function createWorldBathymetryAsync(e) { + return e = defaultValue(e, defaultValue.EMPTY_OBJECT), CesiumTerrainProvider.fromIonAssetId(2426648, { + requestVertexNormals: defaultValue(e.requestVertexNormals, !1) + }); +} +function createWorldTerrainAsync(e) { + return e = defaultValue(e, defaultValue.EMPTY_OBJECT), CesiumTerrainProvider.fromIonAssetId(1, { + requestVertexNormals: defaultValue(e.requestVertexNormals, !1), + requestWaterMask: defaultValue(e.requestWaterMask, !1), + ellipsoid: Ellipsoid.WGS84 + }); +} +const compressedMagic = 1953029805, compressedMagicSwap = 2917034100; +function decodeGoogleEarthEnterpriseData(e, t) { + if (decodeGoogleEarthEnterpriseData.passThroughDataForTesting) + return t; + const n = e.byteLength; + if (n === 0 || n % 4 !== 0) + throw new RuntimeError( + "The length of key must be greater than 0 and a multiple of 4." + ); + const i = new DataView(t), r = i.getUint32(0, !0); + if (r === compressedMagic || r === compressedMagicSwap) + return t; + const o = new DataView(e); + let s = 0; + const c = t.byteLength, l = c - c % 8, d = n; + let f, h = 8; + for (; s < l; ) + for (h = (h + 8) % 24, f = h; s < l && f < d; ) + i.setUint32( + s, + i.getUint32(s, !0) ^ o.getUint32(f, !0), + !0 + ), i.setUint32( + s + 4, + i.getUint32(s + 4, !0) ^ o.getUint32(f + 4, !0), + !0 + ), s += 8, f += 24; + if (s < c) + for (f >= d && (h = (h + 8) % 24, f = h); s < c; ) + i.setUint8(s, i.getUint8(s) ^ o.getUint8(f)), s++, f++; +} +decodeGoogleEarthEnterpriseData.passThroughDataForTesting = !1; +const scratchBarycentricCoords = new Cartesian3(); +function pointInsideTriangle(e, t, n, i) { + const r = barycentricCoordinates( + e, + t, + n, + i, + scratchBarycentricCoords + ); + return defined(r) ? r.x > 0 && r.y > 0 && r.z > 0 : !1; +} +async function sampleTerrain(e, t, n, i) { + return defined(i) || (i = !1), doSampling(e, t, n, i); +} +function attemptConsumeNextQueueItem(e, t, n) { + const i = e[0], r = i.terrainProvider.requestTileGeometry( + i.x, + i.y, + i.level + ); + if (!r) + return !1; + let o; + return n ? o = r.then(createInterpolateFunction(i)) : o = r.then(createInterpolateFunction(i)).catch(createMarkFailedFunction(i)), e.shift(), t.push(o), !0; +} +function delay(e) { + return new Promise(function(t) { + setTimeout(t, e); + }); +} +function drainTileRequestQueue(e, t, n) { + return e.length ? attemptConsumeNextQueueItem( + e, + t, + n + ) ? drainTileRequestQueue(e, t, n) : delay(100).then(() => drainTileRequestQueue(e, t, n)) : Promise.resolve(); +} +function doSampling(e, t, n, i) { + const r = e.tilingScheme; + let o; + const s = [], c = {}; + for (o = 0; o < n.length; ++o) { + const d = r.positionToTileXY(n[o], t); + if (!defined(d)) + continue; + const f = d.toString(); + if (!c.hasOwnProperty(f)) { + const h = { + x: d.x, + y: d.y, + level: t, + tilingScheme: r, + terrainProvider: e, + positions: [] + }; + c[f] = h, s.push(h); + } + c[f].positions.push(n[o]); + } + const l = []; + return drainTileRequestQueue( + s, + l, + i + ).then(function() { + return Promise.all(l).then(function() { + return n; + }); + }); +} +function interpolateAndAssignHeight(e, t, n) { + const i = t.interpolateHeight( + n, + e.longitude, + e.latitude + ); + return i === void 0 ? !1 : (e.height = i, !0); +} +function createInterpolateFunction(e) { + const t = e.positions, n = e.tilingScheme.tileXYToRectangle( + e.x, + e.y, + e.level + ); + return function(i) { + let r = !1; + for (let o = 0; o < t.length; ++o) { + const s = t[o]; + if (!interpolateAndAssignHeight( + s, + i, + n + )) { + r = !0; + break; + } + } + return r ? i.createMesh({ + tilingScheme: e.tilingScheme, + x: e.x, + y: e.y, + level: e.level, + // don't throttle this mesh creation because we've asked to sample these points; + // so sample them! We don't care how many tiles that is! + throttle: !1 + }).then(function() { + for (let o = 0; o < t.length; ++o) { + const s = t[o]; + interpolateAndAssignHeight(s, i, n); + } + }) : Promise.resolve(); + }; +} +function createMarkFailedFunction(e) { + const t = e.positions; + return function() { + for (let n = 0; n < t.length; ++n) { + const i = t[n]; + i.height = void 0; + } + }; +} +const scratchCartesian2$1 = new Cartesian2(); +async function sampleTerrainMostDetailed(e, t, n) { + defined(n) || (n = !1); + const i = [], r = [], o = e.availability, s = []; + for (let l = 0; l < t.length; ++l) { + const d = t[l], f = o.computeMaximumLevelAtPosition(d); + if (r[l] = f, f === 0) { + e.tilingScheme.positionToTileXY( + d, + 1, + scratchCartesian2$1 + ); + const p = e.loadTileDataAvailability( + scratchCartesian2$1.x, + scratchCartesian2$1.y, + 1 + ); + defined(p) && s.push(p); + } + let h = i[f]; + defined(h) || (i[f] = h = []), h.push(d); + } + await Promise.all(s), await Promise.all( + i.map(function(l, d) { + if (defined(l)) + return sampleTerrain( + e, + d, + l, + n + ); + }) + ); + const c = []; + for (let l = 0; l < t.length; ++l) { + const d = t[l]; + o.computeMaximumLevelAtPosition(d) !== r[l] && c.push(d); + } + return c.length > 0 && await sampleTerrainMostDetailed( + e, + c, + n + ), t; +} +function srgbToLinear(e) { + return e <= 0.04045 ? e * 0.07739938080495357 : Math.pow( + // eslint-disable-next-line no-loss-of-precision + (e + 0.055) * 0.9478672985781991, + 2.4 + ); +} +function webGLConstantToGlslType(e) { + switch (e) { + case WebGLConstants$1.FLOAT: + return "float"; + case WebGLConstants$1.FLOAT_VEC2: + return "vec2"; + case WebGLConstants$1.FLOAT_VEC3: + return "vec3"; + case WebGLConstants$1.FLOAT_VEC4: + return "vec4"; + case WebGLConstants$1.FLOAT_MAT2: + return "mat2"; + case WebGLConstants$1.FLOAT_MAT3: + return "mat3"; + case WebGLConstants$1.FLOAT_MAT4: + return "mat4"; + case WebGLConstants$1.SAMPLER_2D: + return "sampler2D"; + case WebGLConstants$1.BOOL: + return "bool"; + } +} +function wrapFunction(e, t, n) { + return function() { + n.apply(e, arguments), t.apply(e, arguments); + }; +} +const defaultDimensions = new Cartesian3(1, 1, 1); +function BoxEmitter(e) { + e = defaultValue(e, defaultDimensions), this._dimensions = Cartesian3.clone(e); +} +Object.defineProperties(BoxEmitter.prototype, { + /** + * The width, height and depth dimensions of the box in meters. + * @memberof BoxEmitter.prototype + * @type {Cartesian3} + * @default new Cartesian3(1.0, 1.0, 1.0) + */ + dimensions: { + get: function() { + return this._dimensions; + }, + set: function(e) { + Cartesian3.clone(e, this._dimensions); + } + } +}); +const scratchHalfDim = new Cartesian3(); +BoxEmitter.prototype.emit = function(e) { + const t = this._dimensions, n = Cartesian3.multiplyByScalar(t, 0.5, scratchHalfDim), i = CesiumMath.randomBetween(-n.x, n.x), r = CesiumMath.randomBetween(-n.y, n.y), o = CesiumMath.randomBetween(-n.z, n.z); + e.position = Cartesian3.fromElements(i, r, o, e.position), e.velocity = Cartesian3.normalize( + e.position, + e.velocity + ); +}; +function Cesium3DTileContent() { + this.featurePropertiesDirty = !1; +} +Object.defineProperties(Cesium3DTileContent.prototype, { + /** + * Gets the number of features in the tile. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + featuresLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the number of points in the tile. + * <p> + * Only applicable for tiles with Point Cloud content. This is different than {@link Cesium3DTileContent#featuresLength} which + * equals the number of groups of points as distinguished by the <code>BATCH_ID</code> feature table semantic. + * </p> + * + * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/PointCloud#batched-points} + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + pointsLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the number of triangles in the tile. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + trianglesLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the tile's geometry memory in bytes. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + geometryByteLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the tile's texture memory in bytes. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + texturesByteLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the amount of memory used by the batch table textures and any binary + * metadata properties not accounted for in geometryByteLength or + * texturesByteLength + * + * @memberof Cesium3DTileContent.prototype + * + * @type {number} + * @readonly + */ + batchTableByteLength: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the array of {@link Cesium3DTileContent} objects for contents that contain other contents, such as composite tiles. The inner contents may in turn have inner contents, such as a composite tile that contains a composite tile. + * + * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Composite|Composite specification} + * + * @memberof Cesium3DTileContent.prototype + * + * @type {Array} + * @readonly + */ + innerContents: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Returns true when the tile's content is ready to render; otherwise false + * + * @memberof Cesium3DTileContent.prototype + * + * @type {boolean} + * @readonly + */ + ready: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the tileset for this tile. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {Cesium3DTileset} + * @readonly + */ + tileset: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the tile containing this content. + * + * @memberof Cesium3DTileContent.prototype + * + * @type {Cesium3DTile} + * @readonly + */ + tile: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the url of the tile's content. + * @memberof Cesium3DTileContent.prototype + * + * @type {string} + * @readonly + */ + url: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the batch table for this content. + * <p> + * This is used to implement the <code>Cesium3DTileContent</code> interface, but is + * not part of the public Cesium API. + * </p> + * + * @type {Cesium3DTileBatchTable} + * @readonly + * + * @private + */ + batchTable: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the metadata for this content, whether it is available explicitly or via + * implicit tiling. If there is no metadata, this property should be undefined. + * <p> + * This is used to implement the <code>Cesium3DTileContent</code> interface, but is + * not part of the public Cesium API. + * </p> + * + * @type {ImplicitMetadataView|undefined} + * + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + metadata: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + }, + set: function(e) { + DeveloperError.throwInstantiationError(); + } + }, + /** + * Gets the group for this content if the content has metadata (3D Tiles 1.1) or + * if it uses the <code>3DTILES_metadata</code> extension. If neither are present, + * this property should be undefined. + * <p> + * This is used to implement the <code>Cesium3DTileContent</code> interface, but is + * not part of the public Cesium API. + * </p> + * + * @type {Cesium3DTileContentGroup|undefined} + * + * @private + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + */ + group: { + // eslint-disable-next-line getter-return + get: function() { + DeveloperError.throwInstantiationError(); + }, + set: function(e) { + DeveloperError.throwInstantiationError(); + } + } +}); +Cesium3DTileContent.prototype.hasProperty = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.getFeature = function(e) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.applyDebugSettings = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.applyStyle = function(e) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.update = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.pick = function(e, t, n) { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.isDestroyed = function() { + DeveloperError.throwInstantiationError(); +}; +Cesium3DTileContent.prototype.destroy = function() { + DeveloperError.throwInstantiationError(); +}; +function ConditionsExpression(e, t) { + this._conditionsExpression = clone$1(e, !0), this._conditions = e.conditions, this._runtimeConditions = void 0, setRuntime(this, t); +} +Object.defineProperties(ConditionsExpression.prototype, { + /** + * Gets the conditions expression defined in the 3D Tiles Styling language. + * + * @memberof ConditionsExpression.prototype + * + * @type {object} + * @readonly + * + * @default undefined + */ + conditionsExpression: { + get: function() { + return this._conditionsExpression; + } + } +}); +function Statement(e, t) { + this.condition = e, this.expression = t; +} +function setRuntime(e, t) { + const n = [], i = e._conditions; + if (!defined(i)) + return; + const r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o], c = String(s[0]), l = String(s[1]); + n.push( + new Statement( + new Expression(c, t), + new Expression(l, t) + ) + ); + } + e._runtimeConditions = n; +} +ConditionsExpression.prototype.evaluate = function(e, t) { + const n = this._runtimeConditions; + if (!defined(n)) + return; + const i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + if (o.condition.evaluate(e)) + return o.expression.evaluate(e, t); + } +}; +ConditionsExpression.prototype.evaluateColor = function(e, t) { + const n = this._runtimeConditions; + if (!defined(n)) + return; + const i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + if (o.condition.evaluate(e)) + return o.expression.evaluateColor(e, t); + } +}; +ConditionsExpression.prototype.getShaderFunction = function(e, t, n, i) { + const r = this._runtimeConditions; + if (!defined(r) || r.length === 0) + return; + let o = ""; + const s = r.length; + for (let c = 0; c < s; ++c) { + const l = r[c], d = l.condition.getShaderExpression( + t, + n + ), f = l.expression.getShaderExpression( + t, + n + ); + o += ` ${c === 0 ? "if" : "else if"} (${d}) + { + return ${f}; + } +`; + } + return o = `${i} ${e} +{ +${o} return ${i}(1.0); +} +`, o; +}; +ConditionsExpression.prototype.getVariables = function() { + let e = []; + const t = this._runtimeConditions; + if (!defined(t) || t.length === 0) + return e; + const n = t.length; + for (let i = 0; i < n; ++i) { + const r = t[i]; + e.push.apply(e, r.condition.getVariables()), e.push.apply(e, r.expression.getVariables()); + } + return e = e.filter(function(i, r, o) { + return o.indexOf(i) === r; + }), e; +}; +function Cesium3DTileStyle(e) { + this._style = {}, this._ready = !1, this._show = void 0, this._color = void 0, this._pointSize = void 0, this._pointOutlineColor = void 0, this._pointOutlineWidth = void 0, this._labelColor = void 0, this._labelOutlineColor = void 0, this._labelOutlineWidth = void 0, this._font = void 0, this._labelStyle = void 0, this._labelText = void 0, this._backgroundColor = void 0, this._backgroundPadding = void 0, this._backgroundEnabled = void 0, this._scaleByDistance = void 0, this._scale = void 0, this._translucencyByDistance = void 0, this._distanceDisplayCondition = void 0, this._heightOffset = void 0, this._anchorLineEnabled = void 0, this._anchorLineColor = void 0, this._image = void 0, this._disableDepthTestDistance = void 0, this._horizontalOrigin = void 0, this._verticalOrigin = void 0, this._labelHorizontalOrigin = void 0, this._labelVerticalOrigin = void 0, this._meta = void 0, this._colorShaderFunction = void 0, this._showShaderFunction = void 0, this._pointSizeShaderFunction = void 0, this._colorShaderFunctionReady = !1, this._showShaderFunctionReady = !1, this._pointSizeShaderFunctionReady = !1, this._colorShaderTranslucent = !1, setup(this, e); +} +function setup(e, t) { + t = defaultValue(clone$1(t, !0), e._style), e._style = t, e.show = t.show, e.color = t.color, e.pointSize = t.pointSize, e.pointOutlineColor = t.pointOutlineColor, e.pointOutlineWidth = t.pointOutlineWidth, e.labelColor = t.labelColor, e.labelOutlineColor = t.labelOutlineColor, e.labelOutlineWidth = t.labelOutlineWidth, e.labelStyle = t.labelStyle, e.font = t.font, e.labelText = t.labelText, e.backgroundColor = t.backgroundColor, e.backgroundPadding = t.backgroundPadding, e.backgroundEnabled = t.backgroundEnabled, e.scaleByDistance = t.scaleByDistance, e.scale = t.scale, e.translucencyByDistance = t.translucencyByDistance, e.distanceDisplayCondition = t.distanceDisplayCondition, e.heightOffset = t.heightOffset, e.anchorLineEnabled = t.anchorLineEnabled, e.anchorLineColor = t.anchorLineColor, e.image = t.image, e.disableDepthTestDistance = t.disableDepthTestDistance, e.horizontalOrigin = t.horizontalOrigin, e.verticalOrigin = t.verticalOrigin, e.labelHorizontalOrigin = t.labelHorizontalOrigin, e.labelVerticalOrigin = t.labelVerticalOrigin; + const n = {}; + if (defined(t.meta)) { + const i = t.defines, r = defaultValue(t.meta, defaultValue.EMPTY_OBJECT); + for (const o in r) + r.hasOwnProperty(o) && (n[o] = new Expression(r[o], i)); + } + e._meta = n, e._ready = !0; +} +function getExpression(e, t) { + const n = defaultValue(e._style, defaultValue.EMPTY_OBJECT).defines; + if (defined(t)) { + if (typeof t == "boolean" || typeof t == "number") + return new Expression(String(t)); + if (typeof t == "string") + return new Expression(t, n); + if (defined(t.conditions)) + return new ConditionsExpression(t, n); + } else return; + return t; +} +function getJsonFromExpression(e) { + if (defined(e)) { + if (defined(e.expression)) + return e.expression; + if (defined(e.conditionsExpression)) + return clone$1(e.conditionsExpression, !0); + } else return; + return e; +} +Object.defineProperties(Cesium3DTileStyle.prototype, { + /** + * Gets the object defining the style using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {object} + * @readonly + * + * @default {} + */ + style: { + get: function() { + return this._style; + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>show</code> property. Alternatively a boolean, string, or object defining a show style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return or convert to a <code>Boolean</code>. + * </p> + * <p> + * This expression is applicable to all tile formats. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @example + * const style = new Cesium3DTileStyle({ + * show : '(regExp("^Chest").test(${County})) && (${YearBuilt} >= 1970)' + * }); + * style.show.evaluate(feature); // returns true or false depending on the feature's properties + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a custom function + * style.show = { + * evaluate : function(feature) { + * return true; + * } + * }; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a boolean + * style.show = true; + * }; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a string + * style.show = '${Height} > 0'; + * }; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a condition + * style.show = { + * conditions: [ + * ['${height} > 2', 'false'], + * ['true', 'true'] + * ]; + * }; + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + this._show = getExpression(this, e), this._style.show = getJsonFromExpression(this._show), this._showShaderFunctionReady = !1; + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>color</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is applicable to all tile formats. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @example + * const style = new Cesium3DTileStyle({ + * color : '(${Temperature} > 90) ? color("red") : color("white")' + * }); + * style.color.evaluateColor(feature, result); // returns a Cesium.Color object + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a custom function + * style.color = { + * evaluateColor : function(feature, result) { + * return Cesium.Color.clone(Cesium.Color.WHITE, result); + * } + * }; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a string + * style.color = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a condition + * style.color = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + this._color = getExpression(this, e), this._style.color = getJsonFromExpression(this._color), this._colorShaderFunctionReady = !1; + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>pointSize</code> property. Alternatively a string or object defining a point size style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile or a Point Cloud tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @example + * const style = new Cesium3DTileStyle({ + * pointSize : '(${Temperature} > 90) ? 2.0 : 1.0' + * }); + * style.pointSize.evaluate(feature); // returns a Number + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a custom function + * style.pointSize = { + * evaluate : function(feature) { + * return 1.0; + * } + * }; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a number + * style.pointSize = 1.0; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a string + * style.pointSize = '${height} / 10'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a condition + * style.pointSize = { + * conditions : [ + * ['${height} > 2', '1.0'], + * ['true', '2.0'] + * ] + * }; + */ + pointSize: { + get: function() { + return this._pointSize; + }, + set: function(e) { + this._pointSize = getExpression(this, e), this._style.pointSize = getJsonFromExpression(this._pointSize), this._pointSizeShaderFunctionReady = !1; + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>pointOutlineColor</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a string + * style.pointOutlineColor = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a condition + * style.pointOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + pointOutlineColor: { + get: function() { + return this._pointOutlineColor; + }, + set: function(e) { + this._pointOutlineColor = getExpression(this, e), this._style.pointOutlineColor = getJsonFromExpression( + this._pointOutlineColor + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>pointOutlineWidth</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a string + * style.pointOutlineWidth = '5'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a condition + * style.pointOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + pointOutlineWidth: { + get: function() { + return this._pointOutlineWidth; + }, + set: function(e) { + this._pointOutlineWidth = getExpression(this, e), this._style.pointOutlineWidth = getJsonFromExpression( + this._pointOutlineWidth + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelColor</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a string + * style.labelColor = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a condition + * style.labelColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelColor: { + get: function() { + return this._labelColor; + }, + set: function(e) { + this._labelColor = getExpression(this, e), this._style.labelColor = getJsonFromExpression(this._labelColor); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelOutlineColor</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a string + * style.labelOutlineColor = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a condition + * style.labelOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelOutlineColor: { + get: function() { + return this._labelOutlineColor; + }, + set: function(e) { + this._labelOutlineColor = getExpression(this, e), this._style.labelOutlineColor = getJsonFromExpression( + this._labelOutlineColor + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelOutlineWidth</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a string + * style.labelOutlineWidth = '5'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a condition + * style.labelOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + labelOutlineWidth: { + get: function() { + return this._labelOutlineWidth; + }, + set: function(e) { + this._labelOutlineWidth = getExpression(this, e), this._style.labelOutlineWidth = getJsonFromExpression( + this._labelOutlineWidth + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>font</code> property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>String</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * font : '(${Temperature} > 90) ? "30px Helvetica" : "24px Helvetica"' + * }); + * style.font.evaluate(feature); // returns a String + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override font expression with a custom function + * style.font = { + * evaluate : function(feature) { + * return '24px Helvetica'; + * } + * }; + */ + font: { + get: function() { + return this._font; + }, + set: function(e) { + this._font = getExpression(this, e), this._style.font = getJsonFromExpression(this._font); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>label style</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>LabelStyle</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * labelStyle : `(\${Temperature} > 90) ? ${LabelStyle.FILL_AND_OUTLINE} : ${LabelStyle.FILL}` + * }); + * style.labelStyle.evaluate(feature); // returns a LabelStyle + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelStyle expression with a custom function + * style.labelStyle = { + * evaluate : function(feature) { + * return LabelStyle.FILL; + * } + * }; + */ + labelStyle: { + get: function() { + return this._labelStyle; + }, + set: function(e) { + this._labelStyle = getExpression(this, e), this._style.labelStyle = getJsonFromExpression(this._labelStyle); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelText</code> property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>String</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * labelText : '(${Temperature} > 90) ? ">90" : "<=90"' + * }); + * style.labelText.evaluate(feature); // returns a String + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelText expression with a custom function + * style.labelText = { + * evaluate : function(feature) { + * return 'Example label text'; + * } + * }; + */ + labelText: { + get: function() { + return this._labelText; + }, + set: function(e) { + this._labelText = getExpression(this, e), this._style.labelText = getJsonFromExpression(this._labelText); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>backgroundColor</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a string + * style.backgroundColor = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a condition + * style.backgroundColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + backgroundColor: { + get: function() { + return this._backgroundColor; + }, + set: function(e) { + this._backgroundColor = getExpression(this, e), this._style.backgroundColor = getJsonFromExpression( + this._backgroundColor + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>backgroundPadding</code> property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Cartesian2</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundPadding expression with a string + * style.backgroundPadding = 'vec2(5.0, 7.0)'; + * style.backgroundPadding.evaluate(feature); // returns a Cartesian2 + */ + backgroundPadding: { + get: function() { + return this._backgroundPadding; + }, + set: function(e) { + this._backgroundPadding = getExpression(this, e), this._style.backgroundPadding = getJsonFromExpression( + this._backgroundPadding + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>backgroundEnabled</code> property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Boolean</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a string + * style.backgroundEnabled = 'true'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a condition + * style.backgroundEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + backgroundEnabled: { + get: function() { + return this._backgroundEnabled; + }, + set: function(e) { + this._backgroundEnabled = getExpression(this, e), this._style.backgroundEnabled = getJsonFromExpression( + this._backgroundEnabled + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>scaleByDistance</code> property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Cartesian4</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override scaleByDistance expression with a string + * style.scaleByDistance = 'vec4(1.5e2, 2.0, 1.5e7, 0.5)'; + * style.scaleByDistance.evaluate(feature); // returns a Cartesian4 + */ + scaleByDistance: { + get: function() { + return this._scaleByDistance; + }, + set: function(e) { + this._scaleByDistance = getExpression(this, e), this._style.scaleByDistance = getJsonFromExpression( + this._scaleByDistance + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>scale</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override scale expression with a string + * style.scale = '5'; + * + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override scale expression with a condition + * style.scale = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + scale: { + get: function() { + return this._scale; + }, + set: function(e) { + this._scale = getExpression(this, e), this._style.scale = getJsonFromExpression(this._scale); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>translucencyByDistance</code> property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Cartesian4</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override translucencyByDistance expression with a string + * style.translucencyByDistance = 'vec4(1.5e2, 1.0, 1.5e7, 0.2)'; + * style.translucencyByDistance.evaluate(feature); // returns a Cartesian4 + */ + translucencyByDistance: { + get: function() { + return this._translucencyByDistance; + }, + set: function(e) { + this._translucencyByDistance = getExpression(this, e), this._style.translucencyByDistance = getJsonFromExpression( + this._translucencyByDistance + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>distanceDisplayCondition</code> property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Cartesian2</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override distanceDisplayCondition expression with a string + * style.distanceDisplayCondition = 'vec2(0.0, 5.5e6)'; + * style.distanceDisplayCondition.evaluate(feature); // returns a Cartesian2 + */ + distanceDisplayCondition: { + get: function() { + return this._distanceDisplayCondition; + }, + set: function(e) { + this._distanceDisplayCondition = getExpression(this, e), this._style.distanceDisplayCondition = getJsonFromExpression( + this._distanceDisplayCondition + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>heightOffset</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a string + * style.heightOffset = '2.0'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a condition + * style.heightOffset = { + * conditions : [ + * ['${height} > 2', '4.0'], + * ['true', '2.0'] + * ] + * }; + */ + heightOffset: { + get: function() { + return this._heightOffset; + }, + set: function(e) { + this._heightOffset = getExpression(this, e), this._style.heightOffset = getJsonFromExpression(this._heightOffset); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>anchorLineEnabled</code> property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Boolean</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a string + * style.anchorLineEnabled = 'true'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a condition + * style.anchorLineEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + anchorLineEnabled: { + get: function() { + return this._anchorLineEnabled; + }, + set: function(e) { + this._anchorLineEnabled = getExpression(this, e), this._style.anchorLineEnabled = getJsonFromExpression( + this._anchorLineEnabled + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>anchorLineColor</code> property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Color</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a string + * style.anchorLineColor = 'color("blue")'; + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a condition + * style.anchorLineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + anchorLineColor: { + get: function() { + return this._anchorLineColor; + }, + set: function(e) { + this._anchorLineColor = getExpression(this, e), this._style.anchorLineColor = getJsonFromExpression( + this._anchorLineColor + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>image</code> property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>String</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * image : '(${Temperature} > 90) ? "/url/to/image1" : "/url/to/image2"' + * }); + * style.image.evaluate(feature); // returns a String + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override image expression with a custom function + * style.image = { + * evaluate : function(feature) { + * return '/url/to/image'; + * } + * }; + */ + image: { + get: function() { + return this._image; + }, + set: function(e) { + this._image = getExpression(this, e), this._style.image = getJsonFromExpression(this._image); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>disableDepthTestDistance</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>Number</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override disableDepthTestDistance expression with a string + * style.disableDepthTestDistance = '1000.0'; + * style.disableDepthTestDistance.evaluate(feature); // returns a Number + */ + disableDepthTestDistance: { + get: function() { + return this._disableDepthTestDistance; + }, + set: function(e) { + this._disableDepthTestDistance = getExpression(this, e), this._style.disableDepthTestDistance = getJsonFromExpression( + this._disableDepthTestDistance + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>horizontalOrigin</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>HorizontalOrigin</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * horizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.horizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override horizontalOrigin expression with a custom function + * style.horizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + horizontalOrigin: { + get: function() { + return this._horizontalOrigin; + }, + set: function(e) { + this._horizontalOrigin = getExpression(this, e), this._style.horizontalOrigin = getJsonFromExpression( + this._horizontalOrigin + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>verticalOrigin</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>VerticalOrigin</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * verticalOrigin : VerticalOrigin.TOP + * }); + * style.verticalOrigin.evaluate(feature); // returns a VerticalOrigin + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override verticalOrigin expression with a custom function + * style.verticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + verticalOrigin: { + get: function() { + return this._verticalOrigin; + }, + set: function(e) { + this._verticalOrigin = getExpression(this, e), this._style.verticalOrigin = getJsonFromExpression(this._verticalOrigin); + } + }, + /** + Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelHorizontalOrigin</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>HorizontalOrigin</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * labelHorizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.labelHorizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelHorizontalOrigin expression with a custom function + * style.labelHorizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + labelHorizontalOrigin: { + get: function() { + return this._labelHorizontalOrigin; + }, + set: function(e) { + this._labelHorizontalOrigin = getExpression(this, e), this._style.labelHorizontalOrigin = getJsonFromExpression( + this._labelHorizontalOrigin + ); + } + }, + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's <code>labelVerticalOrigin</code> property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + * <p> + * The expression must return a <code>VerticalOrigin</code>. + * </p> + * <p> + * This expression is only applicable to point features in a Vector tile. + * </p> + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. + * + * @example + * const style = new Cesium3DTileStyle({ + * labelVerticalOrigin : VerticalOrigin.TOP + * }); + * style.labelVerticalOrigin.evaluate(feature); // returns a VerticalOrigin + * + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelVerticalOrigin expression with a custom function + * style.labelVerticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + labelVerticalOrigin: { + get: function() { + return this._labelVerticalOrigin; + }, + set: function(e) { + this._labelVerticalOrigin = getExpression(this, e), this._style.labelVerticalOrigin = getJsonFromExpression( + this._labelVerticalOrigin + ); + } + }, + /** + * Gets or sets the object containing application-specific expression that can be explicitly + * evaluated, e.g., for display in a UI. + * + * @memberof Cesium3DTileStyle.prototype + * + * @type {StyleExpression} + * + * @example + * const style = new Cesium3DTileStyle({ + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * style.meta.description.evaluate(feature); // returns a String with the substituted variables + */ + meta: { + get: function() { + return this._meta; + }, + set: function(e) { + this._meta = e; + } + } +}); +Cesium3DTileStyle.fromUrl = function(e) { + return Resource.createIfNeeded(e).fetchJson(e).then(function(n) { + return new Cesium3DTileStyle(n); + }); +}; +Cesium3DTileStyle.prototype.getColorShaderFunction = function(e, t, n) { + return this._colorShaderFunctionReady ? (n.translucent = this._colorShaderTranslucent, this._colorShaderFunction) : (this._colorShaderFunctionReady = !0, defined(this.color) && defined(this.color.getShaderFunction) ? this._colorShaderFunction = this.color.getShaderFunction( + e, + t, + n, + "vec4" + ) : this._colorShaderFunction = void 0, this._colorShaderTranslucent = n.translucent, this._colorShaderFunction); +}; +Cesium3DTileStyle.prototype.getShowShaderFunction = function(e, t, n) { + return this._showShaderFunctionReady ? this._showShaderFunction : (this._showShaderFunctionReady = !0, defined(this.show) && defined(this.show.getShaderFunction) ? this._showShaderFunction = this.show.getShaderFunction( + e, + t, + n, + "bool" + ) : this._showShaderFunction = void 0, this._showShaderFunction); +}; +Cesium3DTileStyle.prototype.getPointSizeShaderFunction = function(e, t, n) { + return this._pointSizeShaderFunctionReady ? this._pointSizeShaderFunction : (this._pointSizeShaderFunctionReady = !0, defined(this.pointSize) && defined(this.pointSize.getShaderFunction) ? this._pointSizeShaderFunction = this.pointSize.getShaderFunction( + e, + t, + n, + "float" + ) : this._pointSizeShaderFunction = void 0, this._pointSizeShaderFunction); +}; +Cesium3DTileStyle.prototype.getVariables = function() { + let e = []; + return defined(this.color) && defined(this.color.getVariables) && e.push.apply(e, this.color.getVariables()), defined(this.show) && defined(this.show.getVariables) && e.push.apply(e, this.show.getVariables()), defined(this.pointSize) && defined(this.pointSize.getVariables) && e.push.apply(e, this.pointSize.getVariables()), e = e.filter(function(t, n, i) { + return i.indexOf(t) === n; + }), e; +}; +function ImplicitSubtreeCache(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._maximumSubtreeCount = defaultValue(e.maximumSubtreeCount, 0), this._subtreeRequestCounter = 0, this._queue = new DoubleEndedPriorityQueue({ + comparator: ImplicitSubtreeCache.comparator + }); +} +ImplicitSubtreeCache.prototype.addSubtree = function(e) { + const t = new ImplicitSubtreeCacheNode( + e, + this._subtreeRequestCounter + ); + this._subtreeRequestCounter++, this._queue.insert(t); + const n = e.implicitCoordinates; + if (n.level > 0) { + const i = n.getParentSubtreeCoordinates(); + this.find(i); + } + if (this._maximumSubtreeCount > 0) + for (; this._queue.length > this._maximumSubtreeCount && this._queue.getMinimum() !== t; ) + this._queue.removeMinimum(); +}; +ImplicitSubtreeCache.prototype.find = function(e) { + const t = this._queue, n = t.internalArray, i = t.length; + for (let r = 0; r < i; r++) { + const o = n[r], c = o.subtree.implicitCoordinates; + if (e.isEqual(c)) + return o.subtree; + } +}; +ImplicitSubtreeCache.comparator = function(e, t) { + const n = e.subtree.implicitCoordinates, i = t.subtree.implicitCoordinates; + return n.isAncestor(i) ? 1 : i.isAncestor(n) ? -1 : e.stamp - t.stamp; +}; +function ImplicitSubtreeCacheNode(e, t) { + this.subtree = e, this.stamp = t; +} +function VoxelContent(e) { + this._resource = e, this._metadataTable = void 0; +} +Object.defineProperties(VoxelContent.prototype, { + /** + * The {@link MetadataTable} storing voxel property values. + * + * @type {MetadataTable} + * @readonly + * @private + */ + metadataTable: { + get: function() { + return this._metadataTable; + } + } +}); +VoxelContent.fromJson = async function(e, t, n, i) { + let r; + defined(t) ? r = { + json: t, + binary: void 0 + } : r = parseVoxelChunks(n); + const o = await requestBuffers(e, r.json, r.binary), s = {}, c = r.json.bufferViews.length; + for (let h = 0; h < c; ++h) { + const p = r.json.bufferViews[h], m = p.byteOffset, _ = m + p.byteLength, C = o[p.buffer].subarray(m, _); + s[h] = C; + } + const l = r.json.voxelTable, d = r.json.propertyTables[l], f = new VoxelContent(e); + return f._metadataTable = new MetadataTable({ + count: d.count, + properties: d.properties, + class: i.classes[d.class], + bufferViews: s + }), f; +}; +function requestBuffers(e, t, n) { + const i = t.buffers.length, r = new Array(i); + for (let o = 0; o < i; o++) { + const s = t.buffers[o]; + if (defined(s.uri)) { + const l = e.getDerivedResource({ + url: s.uri + }); + r[o] = l.fetchArrayBuffer().then(function(d) { + return new Uint8Array(d); + }); + } else + r[o] = Promise.resolve(n); + } + return Promise.all(r); +} +function parseVoxelChunks(e) { + const n = new DataView(e.buffer, e.byteOffset); + let i = 8; + const r = n.getUint32(i, !0); + i += 8; + const o = n.getUint32(i, !0); + i += 8; + const s = getJsonFromTypedArray(e, i, r); + i += r; + const c = e.subarray(i, i + o); + return { + json: s, + binary: c + }; +} +function Cesium3DTilesVoxelProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.shapeTransform = void 0, this.globalTransform = void 0, this.shape = void 0, this.minBounds = void 0, this.maxBounds = void 0, this.dimensions = void 0, this.paddingBefore = void 0, this.paddingAfter = void 0, this.names = void 0, this.types = void 0, this.componentTypes = void 0, this.minimumValues = void 0, this.maximumValues = void 0, this.maximumTileCount = void 0, this._implicitTileset = void 0, this._subtreeCache = new ImplicitSubtreeCache(); +} +Cesium3DTilesVoxelProvider.fromUrl = async function(e) { + const t = Resource.createIfNeeded(e), n = await t.fetchJson(); + validate(n); + const i = getMetadataSchemaLoader(n, t); + await i.load(); + const r = n.root, o = r.content.extensions["3DTILES_content_voxels"], s = o.class, c = hasExtension(n, "3DTILES_metadata") ? n.extensions["3DTILES_metadata"] : n, l = i.schema, d = new Cesium3DTilesetMetadata({ + metadataJson: c, + schema: l + }), f = new Cesium3DTilesVoxelProvider(); + addAttributeInfo(f, d, s); + const h = new ImplicitTileset(t, r, l), { + shape: p, + minBounds: m, + maxBounds: _, + shapeTransform: y, + globalTransform: C + } = getShape(r); + f.shape = p, f.minBounds = m, f.maxBounds = _, f.dimensions = Cartesian3.unpack(o.dimensions), f.shapeTransform = y, f.globalTransform = C, f.maximumTileCount = getTileCount(d); + let T, x; + return defined(o.padding) && (T = Cartesian3.unpack(o.padding.before), x = Cartesian3.unpack(o.padding.after)), f.paddingBefore = T, f.paddingAfter = x, f._implicitTileset = h, ResourceCache.unload(i), f; +}; +function getTileCount(e) { + if (defined(e.tileset)) + return e.tileset.getPropertyBySemantic( + MetadataSemantic$1.TILESET_TILE_COUNT + ); +} +function validate(e) { + const t = e.root; + if (!defined(t.content)) + throw new RuntimeError("Root must have content"); + if (!hasExtension(t.content, "3DTILES_content_voxels")) + throw new RuntimeError( + "Root tile content must have 3DTILES_content_voxels extension" + ); + if (!hasExtension(t, "3DTILES_implicit_tiling") && !defined(t.implicitTiling)) + throw new RuntimeError("Root tile must have implicit tiling"); + if (!defined(e.schema) && !defined(e.schemaUri) && !hasExtension(e, "3DTILES_metadata")) + throw new RuntimeError("Tileset must have a metadata schema"); +} +function getShape(e) { + const t = e.boundingVolume; + let n; + if (defined(e.transform) ? n = Matrix4.unpack(e.transform) : n = Matrix4.clone(Matrix4.IDENTITY), defined(t.box)) + return getBoxShape(t.box, n); + if (defined(t.region)) + return getEllipsoidShape(t.region); + if (hasExtension(t, "3DTILES_bounding_volume_cylinder")) + return getCylinderShape( + t.extensions["3DTILES_bounding_volume_cylinder"].cylinder, + n + ); + throw new RuntimeError( + "Only box, region and 3DTILES_bounding_volume_cylinder are supported in Cesium3DTilesVoxelProvider" + ); +} +function getEllipsoidShape(e) { + const t = e[0], n = e[1], i = e[2], r = e[3], o = e[4], s = e[5], c = Matrix4.fromScale(Ellipsoid.WGS84.radii), l = new Cartesian3(t, n, o), d = new Cartesian3(i, r, s); + return { + shape: VoxelShapeType$1.ELLIPSOID, + minBounds: l, + maxBounds: d, + shapeTransform: c, + globalTransform: Matrix4.clone(Matrix4.IDENTITY) + }; +} +function getBoxShape(e, t) { + const n = OrientedBoundingBox.unpack(e), i = Matrix4.fromRotationTranslation( + n.halfAxes, + n.center + ); + return { + shape: VoxelShapeType$1.BOX, + minBounds: Cartesian3.clone(VoxelBoxShape.DefaultMinBounds), + maxBounds: Cartesian3.clone(VoxelBoxShape.DefaultMaxBounds), + shapeTransform: i, + globalTransform: t + }; +} +function getCylinderShape(e, t) { + const n = OrientedBoundingBox.unpack(e), i = Matrix4.fromRotationTranslation( + n.halfAxes, + n.center + ); + return { + shape: VoxelShapeType$1.CYLINDER, + minBounds: Cartesian3.clone(VoxelCylinderShape.DefaultMinBounds), + maxBounds: Cartesian3.clone(VoxelCylinderShape.DefaultMaxBounds), + shapeTransform: i, + globalTransform: t + }; +} +function getMetadataSchemaLoader(e, t) { + const { schemaUri: n, schema: i } = e; + return defined(n) ? ResourceCache.getSchemaLoader({ + resource: t.getDerivedResource({ + url: n + }) + }) : ResourceCache.getSchemaLoader({ schema: i }); +} +function addAttributeInfo(e, t, n) { + const { schema: i, statistics: r } = t, o = r == null ? void 0 : r.classes[n], s = i.classes[n].properties, c = Object.entries(s).map(([h, p]) => { + const { type: m, componentType: _ } = p, y = o == null ? void 0 : o.properties[h].min, C = o == null ? void 0 : o.properties[h].max, T = MetadataType$1.getComponentCount(m), x = copyArray(y, T), b = copyArray(C, T); + return { id: h, type: m, componentType: _, minValue: x, maxValue: b }; + }); + e.names = c.map((h) => h.id), e.types = c.map((h) => h.type), e.componentTypes = c.map((h) => h.componentType); + const l = c.map((h) => h.minValue), d = c.map((h) => h.maxValue), f = l.some(defined); + e.minimumValues = f ? l : void 0, e.maximumValues = f ? d : void 0; +} +function copyArray(e, t) { + if (!defined(e)) + return; + const n = Array.isArray(e) ? e : [e]; + return Array.from({ length: t }, (i, r) => n[r]); +} +async function getVoxelContent(e, t) { + const n = e.contentUriTemplates[0].getDerivedResource( + { + templateValues: t.getTemplateValues() + } + ), i = e.baseResource.getDerivedResource({ + url: n.url + }), r = await i.fetchArrayBuffer(), o = preprocess3DTileContent(r); + return await VoxelContent.fromJson( + i, + o.jsonPayload, + o.binaryPayload, + e.metadataSchema + ); +} +async function getSubtreePromise(e, t) { + const n = e._implicitTileset, i = e._subtreeCache; + let r = i.find(t); + if (defined(r)) + return r; + const o = n.subtreeUriTemplate.getDerivedResource( + { + templateValues: t.getTemplateValues() + } + ), s = n.baseResource.getDerivedResource({ + url: o.url + }), c = await s.fetchArrayBuffer(); + if (r = i.find(t), defined(r)) + return r; + const l = preprocess3DTileContent(c); + return r = await ImplicitSubtree.fromSubtreeJson( + s, + l.jsonPayload, + l.binaryPayload, + n, + t + ), i.addSubtree(r), r; +} +Cesium3DTilesVoxelProvider.prototype.requestData = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.tileLevel, 0), n = defaultValue(e.tileX, 0), i = defaultValue(e.tileY, 0), r = defaultValue(e.tileZ, 0); + if (defaultValue(e.keyframe, 0) !== 0) + return; + const s = this._implicitTileset, c = this.names, l = new ImplicitTileCoordinates({ + subdivisionScheme: s.subdivisionScheme, + subtreeLevels: s.subtreeLevels, + level: t, + x: n, + y: i, + z: r + }), d = l.isSubtreeRoot() && l.level > 0, f = d ? l.getParentSubtreeCoordinates() : l.getSubtreeCoordinates(); + return getSubtreePromise(this, f).then(function(p) { + return (d ? p.childSubtreeIsAvailableAtCoordinates(l) : p.tileIsAvailableAtCoordinates(l)) ? getVoxelContent(s, l) : Promise.reject("Tile is not available"); + }).then(function(p) { + return c.map(function(m) { + return p.metadataTable.getPropertyTypedArray(m); + }); + }); +}; +function CircleEmitter(e) { + e = defaultValue(e, 1), this._radius = defaultValue(e, 1); +} +Object.defineProperties(CircleEmitter.prototype, { + /** + * The radius of the circle in meters. + * @memberof CircleEmitter.prototype + * @type {number} + * @default 1.0 + */ + radius: { + get: function() { + return this._radius; + }, + set: function(e) { + this._radius = e; + } + } +}); +CircleEmitter.prototype.emit = function(e) { + const t = CesiumMath.randomBetween(0, CesiumMath.TWO_PI), n = CesiumMath.randomBetween(0, this._radius), i = n * Math.cos(t), r = n * Math.sin(t), o = 0; + e.position = Cartesian3.fromElements(i, r, o, e.position), e.velocity = Cartesian3.clone(Cartesian3.UNIT_Z, e.velocity); +}; +const CloudType = { + /** + * Cumulus cloud. + * + * @type {number} + * @constant + */ + CUMULUS: 0 +}; +CloudType.validate = function(e) { + return e === CloudType.CUMULUS; +}; +const CloudType$1 = Object.freeze(CloudType); +function CumulusCloud(e, t) { + if (e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._show = defaultValue(e.show, !0), this._position = Cartesian3.clone( + defaultValue(e.position, Cartesian3.ZERO) + ), !defined(e.scale) && defined(e.maximumSize)) + this._maximumSize = Cartesian3.clone(e.maximumSize), this._scale = new Cartesian2(this._maximumSize.x, this._maximumSize.y); + else { + this._scale = Cartesian2.clone( + defaultValue(e.scale, new Cartesian2(20, 12)) + ); + const n = new Cartesian3( + this._scale.x, + this._scale.y, + Math.min(this._scale.x, this._scale.y) / 1.5 + ); + this._maximumSize = Cartesian3.clone( + defaultValue(e.maximumSize, n) + ); + } + this._slice = defaultValue(e.slice, -1), this._color = Color.clone(defaultValue(e.color, Color.WHITE)), this._brightness = defaultValue(e.brightness, 1), this._cloudCollection = t, this._index = -1; +} +const SHOW_INDEX$1 = CumulusCloud.SHOW_INDEX = 0, POSITION_INDEX$1 = CumulusCloud.POSITION_INDEX = 1, SCALE_INDEX$1 = CumulusCloud.SCALE_INDEX = 2, MAXIMUM_SIZE_INDEX$1 = CumulusCloud.MAXIMUM_SIZE_INDEX = 3, SLICE_INDEX$1 = CumulusCloud.SLICE_INDEX = 4, BRIGHTNESS_INDEX$1 = CumulusCloud.BRIGHTNESS_INDEX = 5, COLOR_INDEX$1 = CumulusCloud.COLOR_INDEX = 6; +CumulusCloud.NUMBER_OF_PROPERTIES = 7; +function makeDirty(e, t) { + const n = e._cloudCollection; + defined(n) && (n._updateCloud(e, t), e._dirty = !0); +} +Object.defineProperties(CumulusCloud.prototype, { + /** + * Determines if this cumulus cloud will be shown. Use this to hide or show a cloud, instead + * of removing it and re-adding it to the collection. + * @memberof CumulusCloud.prototype + * @type {boolean} + * @default true + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + this._show !== e && (this._show = e, makeDirty(this, SHOW_INDEX$1)); + } + }, + /** + * Gets or sets the Cartesian position of this cumulus cloud. + * @memberof CumulusCloud.prototype + * @type {Cartesian3} + */ + position: { + get: function() { + return this._position; + }, + set: function(e) { + const t = this._position; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), makeDirty(this, POSITION_INDEX$1)); + } + }, + /** + * <p>Gets or sets the scale of the cumulus cloud billboard in meters. + * The <code>scale</code> property will affect the size of the billboard, + * but not the cloud's actual appearance.</p> + * <div align='center'> + * <table border='0' cellpadding='5'><tr> + * <td align='center'> + * <code>cloud.scale = new Cesium.Cartesian2(12, 8);</code><br/> + * <img src='Images/CumulusCloud.scalex12y8.png' width='250' height='158' /> + * </td> + * <td align='center'> + * <code>cloud.scale = new Cesium.Cartesian2(24, 10);</code><br/> + * <img src='Images/CumulusCloud.scalex24y10.png' width='250' height='158' /> + * </td> + * </tr></table> + * </div> + * + * <p>To modify the cloud's appearance, modify its <code>maximumSize</code> + * and <code>slice</code> properties.</p> + * @memberof CumulusCloud.prototype + * @type {Cartesian2} + * + * @see CumulusCloud#maximumSize + * @see CumulusCloud#slice + */ + scale: { + get: function() { + return this._scale; + }, + set: function(e) { + const t = this._scale; + Cartesian2.equals(t, e) || (Cartesian2.clone(e, t), makeDirty(this, SCALE_INDEX$1)); + } + }, + /** + * <p>Gets or sets the maximum size of the cumulus cloud rendered on the billboard. + * This defines a maximum ellipsoid volume that the cloud can appear in. + * Rather than guaranteeing a specific size, this specifies a boundary for the + * cloud to appear in, and changing it can affect the shape of the cloud.</p> + * <p>Changing the z-value of <code>maximumSize</code> has the most dramatic effect + * on the cloud's appearance because it changes the depth of the cloud, and thus the + * positions at which the cloud-shaping texture is sampled.</p> + * <div align='center'> + * <table border='0' cellpadding='5'> + * <tr> + * <td align='center'> + * <code>cloud.maximumSize = new Cesium.Cartesian3(14, 9, 10);</code><br/> + * <img src='Images/CumulusCloud.maximumSizex14y9z10.png' width='250' height='158' /> + * </td> + * <td align='center'> + * <code>cloud.maximumSize.x = 25;</code><br/> + * <img src='Images/CumulusCloud.maximumSizex25.png' width='250' height='158' /> + * </td> + * </tr> + * <tr> + * <td align='center'> + * <code>cloud.maximumSize.y = 5;</code><br/> + * <img src='Images/CumulusCloud.maximumSizey5.png' width='250' height='158' /> + * </td> + * <td align='center'> + * <code>cloud.maximumSize.z = 17;</code><br/> + * <img src='Images/CumulusCloud.maximumSizez17.png' width='250' height='158' /> + * </td> + * </tr> + * </table> + * </div> + * + * <p>To modify the billboard's actual size, modify the cloud's <code>scale</code> property.</p> + * @memberof CumulusCloud.prototype + * @type {Cartesian3} + * + * @see CumulusCloud#scale + */ + maximumSize: { + get: function() { + return this._maximumSize; + }, + set: function(e) { + const t = this._maximumSize; + Cartesian3.equals(t, e) || (Cartesian3.clone(e, t), makeDirty(this, MAXIMUM_SIZE_INDEX$1)); + } + }, + /** + * Sets the color of the cloud + * @memberof CumulusCloud.prototype + * @type {Color} + * @default Color.WHITE + */ + color: { + get: function() { + return this._color; + }, + set: function(e) { + const t = this._color; + Color.equals(t, e) || (Color.clone(e, t), makeDirty(this, COLOR_INDEX$1)); + } + }, + /** + * <p>Gets or sets the "slice" of the cloud that is rendered on the billboard, i.e. + * the specific cross-section of the cloud chosen for the billboard's appearance. + * Given a value between 0 and 1, the slice specifies how deeply into the cloud + * to intersect based on its maximum size in the z-direction.</p> + * <div align='center'> + * <table border='0' cellpadding='5'><tr> + * <td align='center'><code>cloud.slice = 0.32;</code><br/><img src='Images/CumulusCloud.slice0.32.png' width='250' height='158' /></td> + * <td align='center'><code>cloud.slice = 0.5;</code><br/><img src='Images/CumulusCloud.slice0.5.png' width='250' height='158' /></td> + * <td align='center'><code>cloud.slice = 0.6;</code><br/><img src='Images/CumulusCloud.slice0.6.png' width='250' height='158' /></td> + * </tr></table> + * </div> + * + * <br /> + * <p>Due to the nature in which this slice is calculated, + * values below <code>0.2</code> may result in cross-sections that are too small, + * and the edge of the ellipsoid will be visible. Similarly, values above <code>0.7</code> + * will cause the cloud to appear smaller. Values outside the range <code>[0.1, 0.9]</code> + * should be avoided entirely because they do not produce desirable results.</p> + * + * <div align='center'> + * <table border='0' cellpadding='5'><tr> + * <td align='center'><code>cloud.slice = 0.08;</code><br/><img src='Images/CumulusCloud.slice0.08.png' width='250' height='158' /></td> + * <td align='center'><code>cloud.slice = 0.8;</code><br/><img src='Images/CumulusCloud.slice0.8.png' width='250' height='158' /></td> + * </tr></table> + * </div> + * + * <p>If <code>slice</code> is set to a negative number, the cloud will not render a cross-section. + * Instead, it will render the outside of the ellipsoid that is visible. For clouds with + * small values of `maximumSize.z`, this can produce good-looking results, but for larger + * clouds, this can result in a cloud that is undesirably warped to the ellipsoid volume.</p> + * + * <div align='center'> + * <table border='0' cellpadding='5'><tr> + * <td align='center'> + * <code>cloud.slice = -1.0;<br/>cloud.maximumSize.z = 18;</code><br/> + * <img src='Images/CumulusCloud.slice-1z18.png' width='250' height='158' /> + * </td> + * <td align='center'> + * <code>cloud.slice = -1.0;<br/>cloud.maximumSize.z = 30;</code><br/> + * <img src='Images/CumulusCloud.slice-1z30.png' width='250' height='158' /></td> + * </tr></table> + * </div> + * + * @memberof CumulusCloud.prototype + * @type {number} + * @default -1.0 + */ + slice: { + get: function() { + return this._slice; + }, + set: function(e) { + this._slice !== e && (this._slice = e, makeDirty(this, SLICE_INDEX$1)); + } + }, + /** + * Gets or sets the brightness of the cloud. This can be used to give clouds + * a darker, grayer appearance. + * <br /><br /> + * <div align='center'> + * <table border='0' cellpadding='5'><tr> + * <td align='center'><code>cloud.brightness = 1.0;</code><br/><img src='Images/CumulusCloud.brightness1.png' width='250' height='158' /></td> + * <td align='center'><code>cloud.brightness = 0.6;</code><br/><img src='Images/CumulusCloud.brightness0.6.png' width='250' height='158' /></td> + * <td align='center'><code>cloud.brightness = 0.0;</code><br/><img src='Images/CumulusCloud.brightness0.png' width='250' height='158' /></td> + * </tr></table> + * </div> + * @memberof CumulusCloud.prototype + * @type {number} + * @default 1.0 + */ + brightness: { + get: function() { + return this._brightness; + }, + set: function(e) { + this._brightness !== e && (this._brightness = e, makeDirty(this, BRIGHTNESS_INDEX$1)); + } + } +}); +CumulusCloud.prototype._destroy = function() { + this._cloudCollection = void 0; +}; +let attributeLocations; +const scratchTextureDimensions = new Cartesian3(), attributeLocationsBatched = { + positionHighAndScaleX: 0, + positionLowAndScaleY: 1, + packedAttribute0: 2, + // show, brightness, direction + packedAttribute1: 3, + // cloudSize, slice + color: 4 +}, attributeLocationsInstanced = { + direction: 0, + positionHighAndScaleX: 1, + positionLowAndScaleY: 2, + packedAttribute0: 3, + // show, brightness + packedAttribute1: 4, + // cloudSize, slice + color: 5 +}, SHOW_INDEX = CumulusCloud.SHOW_INDEX, POSITION_INDEX = CumulusCloud.POSITION_INDEX, SCALE_INDEX = CumulusCloud.SCALE_INDEX, MAXIMUM_SIZE_INDEX = CumulusCloud.MAXIMUM_SIZE_INDEX, SLICE_INDEX = CumulusCloud.SLICE_INDEX, BRIGHTNESS_INDEX = CumulusCloud.BRIGHTNESS_INDEX, NUMBER_OF_PROPERTIES = CumulusCloud.NUMBER_OF_PROPERTIES, COLOR_INDEX = CumulusCloud.COLOR_INDEX; +function CloudCollection(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._clouds = [], this._cloudsToUpdate = [], this._cloudsToUpdateIndex = 0, this._cloudsRemoved = !1, this._createVertexArray = !1, this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES), this._noiseTexture = void 0, this._textureSliceWidth = 128, this._noiseTextureRows = 4, this.noiseDetail = defaultValue(e.noiseDetail, 16), this.noiseOffset = Cartesian3.clone( + defaultValue(e.noiseOffset, Cartesian3.ZERO) + ), this._loading = !1, this._ready = !1; + const t = this; + this._uniforms = { + u_noiseTexture: function() { + return t._noiseTexture; + }, + u_noiseTextureDimensions: getNoiseTextureDimensions(t), + u_noiseDetail: function() { + return t.noiseDetail; + } + }, this._vaNoise = void 0, this._spNoise = void 0, this._spCreated = !1, this._sp = void 0, this._rs = void 0, this.show = defaultValue(e.show, !0), this._colorCommands = [], this.debugBillboards = defaultValue(e.debugBillboards, !1), this._compiledDebugBillboards = !1, this.debugEllipsoids = defaultValue(e.debugEllipsoids, !1), this._compiledDebugEllipsoids = !1; +} +function getNoiseTextureDimensions(e) { + return function() { + return scratchTextureDimensions.x = e._textureSliceWidth, scratchTextureDimensions.y = e._noiseTextureRows, scratchTextureDimensions.z = 1 / e._noiseTextureRows, scratchTextureDimensions; + }; +} +Object.defineProperties(CloudCollection.prototype, { + /** + * Returns the number of clouds in this collection. + * @memberof CloudCollection.prototype + * @type {number} + */ + length: { + get: function() { + return removeClouds(this), this._clouds.length; + } + } +}); +function destroyClouds(e) { + const t = e.length; + for (let n = 0; n < t; ++n) + e[n] && e[n]._destroy(); +} +CloudCollection.prototype.add = function(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.cloudType, CloudType$1.CUMULUS); + let n; + return t === CloudType$1.CUMULUS && (n = new CumulusCloud(e, this), n._index = this._clouds.length, this._clouds.push(n), this._createVertexArray = !0), n; +}; +CloudCollection.prototype.remove = function(e) { + return this.contains(e) ? (this._clouds[e._index] = void 0, this._cloudsRemoved = !0, this._createVertexArray = !0, e._destroy(), !0) : !1; +}; +CloudCollection.prototype.removeAll = function() { + destroyClouds(this._clouds), this._clouds = [], this._cloudsToUpdate = [], this._cloudsToUpdateIndex = 0, this._cloudsRemoved = !1, this._createVertexArray = !0; +}; +function removeClouds(e) { + if (e._cloudsRemoved) { + e._cloudsRemoved = !1; + const t = [], n = e._clouds, i = n.length; + for (let r = 0, o = 0; r < i; ++r) { + const s = n[r]; + defined(s) && (n._index = o++, t.push(s)); + } + e._clouds = t; + } +} +CloudCollection.prototype._updateCloud = function(e, t) { + e._dirty || (this._cloudsToUpdate[this._cloudsToUpdateIndex++] = e), ++this._propertiesChanged[t]; +}; +CloudCollection.prototype.contains = function(e) { + return defined(e) && e._cloudCollection === this; +}; +CloudCollection.prototype.get = function(e) { + return removeClouds(this), this._clouds[e]; +}; +const texturePositions = new Float32Array([ + -1, + -1, + 1, + -1, + 1, + 1, + -1, + 1 +]), textureIndices = new Uint16Array([0, 1, 2, 0, 2, 3]); +function createTextureVA(e) { + const t = Buffer.createVertexBuffer({ + context: e, + typedArray: texturePositions, + usage: BufferUsage$1.STATIC_DRAW + }), n = Buffer.createIndexBuffer({ + context: e, + typedArray: textureIndices, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }), i = [ + { + index: 0, + vertexBuffer: t, + componentsPerAttribute: 2, + componentDatatype: ComponentDatatype$1.FLOAT + } + ]; + return new VertexArray({ + context: e, + attributes: i, + indexBuffer: n + }); +} +let getIndexBuffer; +function getIndexBufferBatched(e) { + let n = e.cache.cloudCollection_indexBufferBatched; + if (defined(n)) + return n; + const i = 16384 * 6 - 6, r = new Uint16Array(i); + for (let o = 0, s = 0; o < i; o += 6, s += 4) + r[o] = s, r[o + 1] = s + 1, r[o + 2] = s + 2, r[o + 3] = s, r[o + 4] = s + 2, r[o + 5] = s + 3; + return n = Buffer.createIndexBuffer({ + context: e, + typedArray: r, + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }), n.vertexArrayDestroyable = !1, e.cache.cloudCollection_indexBufferBatched = n, n; +} +function getIndexBufferInstanced(e) { + let t = e.cache.cloudCollection_indexBufferInstanced; + return defined(t) || (t = Buffer.createIndexBuffer({ + context: e, + typedArray: new Uint16Array([0, 1, 2, 0, 2, 3]), + usage: BufferUsage$1.STATIC_DRAW, + indexDatatype: IndexDatatype$1.UNSIGNED_SHORT + }), t.vertexArrayDestroyable = !1, e.cache.cloudCollection_indexBufferInstanced = t), t; +} +function getVertexBufferInstanced(e) { + let t = e.cache.cloudCollection_vertexBufferInstanced; + return defined(t) || (t = Buffer.createVertexBuffer({ + context: e, + typedArray: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]), + usage: BufferUsage$1.STATIC_DRAW + }), t.vertexArrayDestroyable = !1, e.cache.cloudCollection_vertexBufferInstanced = t), t; +} +function createVAF(e, t, n) { + const i = [ + { + index: attributeLocations.positionHighAndScaleX, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: BufferUsage$1.STATIC_DRAW + }, + { + index: attributeLocations.positionLowAndScaleY, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: BufferUsage$1.STATIC_DRAW + }, + { + index: attributeLocations.packedAttribute0, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: BufferUsage$1.STATIC_DRAW + }, + { + index: attributeLocations.packedAttribute1, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.FLOAT, + usage: BufferUsage$1.STATIC_DRAW + }, + { + index: attributeLocations.color, + componentsPerAttribute: 4, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + normalize: !0, + usage: BufferUsage$1.STATIC_DRAW + } + ]; + n && i.push({ + index: attributeLocations.direction, + componentsPerAttribute: 2, + componentDatatype: ComponentDatatype$1.FLOAT, + vertexBuffer: getVertexBufferInstanced(e) + }); + const r = n ? t : 4 * t; + return new VertexArrayFacade(e, i, r, n); +} +const writePositionScratch = new EncodedCartesian3(); +function writePositionAndScale(e, t, n, i) { + let r; + const o = n[attributeLocations.positionHighAndScaleX], s = n[attributeLocations.positionLowAndScaleY], c = i.position; + EncodedCartesian3.fromCartesian(c, writePositionScratch); + const l = i.scale, d = writePositionScratch.high, f = writePositionScratch.low; + e._instanced ? (r = i._index, o(r, d.x, d.y, d.z, l.x), s(r, f.x, f.y, f.z, l.y)) : (r = i._index * 4, o(r + 0, d.x, d.y, d.z, l.x), o(r + 1, d.x, d.y, d.z, l.x), o(r + 2, d.x, d.y, d.z, l.x), o(r + 3, d.x, d.y, d.z, l.x), s(r + 0, f.x, f.y, f.z, l.y), s(r + 1, f.x, f.y, f.z, l.y), s(r + 2, f.x, f.y, f.z, l.y), s(r + 3, f.x, f.y, f.z, l.y)); +} +function writePackedAttribute0(e, t, n, i) { + let r; + const o = n[attributeLocations.packedAttribute0], s = i.show, c = i.brightness; + e._instanced ? (r = i._index, o(r, s, c, 0, 0)) : (r = i._index * 4, o(r + 0, s, c, 0, 0), o(r + 1, s, c, 1, 0), o(r + 2, s, c, 1, 1), o(r + 3, s, c, 0, 1)); +} +function writePackedAttribute1(e, t, n, i) { + let r; + const o = n[attributeLocations.packedAttribute1], s = i.maximumSize, c = i.slice; + e._instanced ? (r = i._index, o(r, s.x, s.y, s.z, c)) : (r = i._index * 4, o(r + 0, s.x, s.y, s.z, c), o(r + 1, s.x, s.y, s.z, c), o(r + 2, s.x, s.y, s.z, c), o(r + 3, s.x, s.y, s.z, c)); +} +function writeColor(e, t, n, i) { + let r; + const o = n[attributeLocations.color], s = i.color, c = Color.floatToByte(s.red), l = Color.floatToByte(s.green), d = Color.floatToByte(s.blue), f = Color.floatToByte(s.alpha); + e._instanced ? (r = i._index, o(r, c, l, d, f)) : (r = i._index * 4, o(r + 0, c, l, d, f), o(r + 1, c, l, d, f), o(r + 2, c, l, d, f), o(r + 3, c, l, d, f)); +} +function writeCloud(e, t, n, i) { + writePositionAndScale(e, t, n, i), writePackedAttribute0(e, t, n, i), writePackedAttribute1(e, t, n, i), writeColor(e, t, n, i); +} +function createNoiseTexture(e, t, n, i) { + const r = e, o = r._textureSliceWidth, s = r._noiseTextureRows, c = t.context; + r._vaNoise = createTextureVA(c), r._spNoise = ShaderProgram.fromCache({ + context: c, + vertexShaderSource: n, + fragmentShaderSource: i, + attributeLocations: { + position: 0 + } + }); + const l = r.noiseDetail, d = r.noiseOffset; + r._noiseTexture = new Texture({ + context: c, + width: o * o / s, + height: o * s, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + pixelFormat: PixelFormat$1.RGBA, + sampler: new Sampler({ + wrapS: TextureWrap$1.REPEAT, + wrapT: TextureWrap$1.REPEAT, + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) + }); + const f = new ComputeCommand({ + vertexArray: r._vaNoise, + shaderProgram: r._spNoise, + outputTexture: r._noiseTexture, + uniformMap: { + u_noiseTextureDimensions: getNoiseTextureDimensions(r), + u_noiseDetail: function() { + return l; + }, + u_noiseOffset: function() { + return d; + } + }, + persists: !1, + owner: e, + postExecute: function(h) { + r._ready = !0, r._loading = !1; + } + }); + t.commandList.push(f), r._loading = !0; +} +function createVertexArray(e, t) { + const n = e, i = t.context; + n._createVertexArray = !1, n._vaf = n._vaf && n._vaf.destroy(); + const r = e._clouds, o = r.length; + if (o > 0) { + n._vaf = createVAF(i, o, n._instanced); + const s = n._vaf.writers; + let c; + for (c = 0; c < o; ++c) { + const l = r[c]; + writeCloud(e, t, s, l); + } + n._vaf.commit(getIndexBuffer(i)); + } +} +const scratchWriterArray = []; +function updateClouds(e, t) { + const n = t.context, i = e, o = i._clouds.length, s = i._cloudsToUpdate, c = i._cloudsToUpdateIndex, l = i._propertiesChanged, d = scratchWriterArray; + d.length = 0, (l[POSITION_INDEX] || l[SCALE_INDEX]) && d.push(writePositionAndScale), (l[SHOW_INDEX] || l[BRIGHTNESS_INDEX]) && d.push(writePackedAttribute0), (l[MAXIMUM_SIZE_INDEX] || l[SLICE_INDEX]) && d.push(writePackedAttribute1), l[COLOR_INDEX] && d.push(writeColor); + const f = d.length, h = i._vaf.writers; + let p, m, _; + if (c / o > 0.1) { + for (p = 0; p < c; ++p) + for (m = s[p], m._dirty = !1, _ = 0; _ < f; ++_) + d[_](e, t, h, m); + i._vaf.commit(getIndexBuffer(n)); + } else { + for (p = 0; p < c; ++p) { + for (m = s[p], m._dirty = !1, _ = 0; _ < f; ++_) + d[_](e, t, h, m); + i._instanced ? i._vaf.subCommit(m._index, 1) : i._vaf.subCommit(m._index * 4, 4); + } + i._vaf.endSubCommits(); + } + i._cloudsToUpdateIndex = 0; +} +function createShaderProgram(e, t, n, i) { + const r = t.context, o = e, s = new ShaderSource({ + defines: [], + sources: [n] + }); + o._instanced && s.defines.push("INSTANCED"); + const c = new ShaderSource({ + defines: [], + sources: [i] + }); + o.debugBillboards && c.defines.push("DEBUG_BILLBOARDS"), o.debugEllipsoids && c.defines.push("DEBUG_ELLIPSOIDS"), o._sp = ShaderProgram.replaceCache({ + context: r, + shaderProgram: o._sp, + vertexShaderSource: s, + fragmentShaderSource: c, + attributeLocations + }), o._rs = RenderState.fromCache({ + depthTest: { + enabled: !0, + func: WebGLConstants$1.LESS + }, + depthMask: !1, + blending: BlendingState$1.ALPHA_BLEND + }), o._spCreated = !0, o._compiledDebugBillboards = o.debugBillboards, o._compiledDebugEllipsoids = o.debugEllipsoids; +} +function createDrawCommands(e, t) { + const n = e, i = t.passes, r = n._uniforms, o = t.commandList; + if (i.render) { + const s = n._colorCommands, c = n._vaf.va, l = c.length; + s.length = l; + for (let d = 0; d < l; d++) { + let f = s[d]; + defined(f) || (f = s[d] = new DrawCommand()), f.pass = Pass$1.TRANSLUCENT, f.owner = e, f.uniformMap = r, f.count = c[d].indicesCount, f.vertexArray = c[d].va, f.shaderProgram = n._sp, f.renderState = n._rs, n._instanced && (f.count = 6, f.instanceCount = n._clouds.length), o.push(f); + } + } +} +CloudCollection.prototype.update = function(e) { + if (removeClouds(this), !this.show) + return; + const t = this.debugBillboards || this.debugEllipsoids; + this._ready = t ? !0 : defined(this._noiseTexture), !this._ready && !this._loading && !t && createNoiseTexture(this, e, CloudNoiseVS, CloudNoiseFS), this._instanced = e.context.instancedArrays, attributeLocations = this._instanced ? attributeLocationsInstanced : attributeLocationsBatched, getIndexBuffer = this._instanced ? getIndexBufferInstanced : getIndexBufferBatched; + const i = this._clouds.length, r = this._cloudsToUpdate, o = this._cloudsToUpdateIndex; + this._createVertexArray ? createVertexArray(this, e) : o > 0 && updateClouds(this, e), o > i * 1.5 && (r.length = i), !(!defined(this._vaf) || !defined(this._vaf.va) || !this._ready & !t) && ((!this._spCreated || this.debugBillboards !== this._compiledDebugBillboards || this.debugEllipsoids !== this._compiledDebugEllipsoids) && createShaderProgram(this, e, CloudCollectionVS, CloudCollectionFS), createDrawCommands(this, e)); +}; +CloudCollection.prototype.isDestroyed = function() { + return !1; +}; +CloudCollection.prototype.destroy = function() { + return this._noiseTexture = this._noiseTexture && this._noiseTexture.destroy(), this._sp = this._sp && this._sp.destroy(), this._vaf = this._vaf && this._vaf.destroy(), destroyClouds(this._clouds), destroyObject(this); +}; +const defaultAngle = CesiumMath.toRadians(30); +function ConeEmitter(e) { + this._angle = defaultValue(e, defaultAngle); +} +Object.defineProperties(ConeEmitter.prototype, { + /** + * The angle of the cone in radians. + * @memberof CircleEmitter.prototype + * @type {number} + * @default Cesium.Math.toRadians(30.0) + */ + angle: { + get: function() { + return this._angle; + }, + set: function(e) { + this._angle = e; + } + } +}); +ConeEmitter.prototype.emit = function(e) { + const t = Math.tan(this._angle), n = CesiumMath.randomBetween(0, CesiumMath.TWO_PI), i = CesiumMath.randomBetween(0, t), r = i * Math.cos(n), o = i * Math.sin(n), s = 1; + e.velocity = Cartesian3.fromElements(r, o, s, e.velocity), Cartesian3.normalize(e.velocity, e.velocity), e.position = Cartesian3.clone(Cartesian3.ZERO, e.position); +}; +function DebugAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.attributeName; + let n = e.perInstanceAttribute; + defined(n) || (n = !1); + let i = defaultValue(e.glslDatatype, "vec3"); + const r = `v_${t}`; + let o; + if (t === "normal" || t === "tangent" || t === "bitangent") + o = `vec4 getColor() { return vec4((${r} + vec3(1.0)) * 0.5, 1.0); } +`; + else + switch (t === "st" && (i = "vec2"), i) { + case "float": + o = `vec4 getColor() { return vec4(vec3(${r}), 1.0); } +`; + break; + case "vec2": + o = `vec4 getColor() { return vec4(${r}, 0.0, 1.0); } +`; + break; + case "vec3": + o = `vec4 getColor() { return vec4(${r}, 1.0); } +`; + break; + case "vec4": + o = `vec4 getColor() { return ${r}; } +`; + break; + } + const s = `in vec3 position3DHigh; +in vec3 position3DLow; +in float batchId; +${n ? "" : `in ${i} ${t}; +`}out ${i} ${r}; +void main() +{ +vec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow); +${n ? `${r} = czm_batchTable_${t}(batchId); +` : `${r} = ${t}; +`}gl_Position = czm_modelViewProjectionRelativeToEye * p; +}`, c = `in ${i} ${r}; +${o} +void main() +{ +out_FragColor = getColor(); +}`; + this.material = void 0, this.translucent = defaultValue(e.translucent, !1), this._vertexShaderSource = defaultValue(e.vertexShaderSource, s), this._fragmentShaderSource = defaultValue(e.fragmentShaderSource, c), this._renderState = Appearance.getDefaultRenderState( + !1, + !1, + e.renderState + ), this._closed = defaultValue(e.closed, !1), this._attributeName = t, this._glslDatatype = i; +} +Object.defineProperties(DebugAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof DebugAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link DebugAppearance#material}. + * Use {@link DebugAppearance#getFragmentShaderSource} to get the full source. + * + * @memberof DebugAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + * + * @memberof DebugAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When <code>true</code>, the geometry is expected to be closed. + * + * @memberof DebugAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The name of the attribute being visualized. + * + * @memberof DebugAppearance.prototype + * + * @type {string} + * @readonly + */ + attributeName: { + get: function() { + return this._attributeName; + } + }, + /** + * The GLSL datatype of the attribute being visualized. + * + * @memberof DebugAppearance.prototype + * + * @type {string} + * @readonly + */ + glslDatatype: { + get: function() { + return this._glslDatatype; + } + } +}); +DebugAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +DebugAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +DebugAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +function DebugModelMatrixPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.length = defaultValue(e.length, 1e7), this._length = void 0, this.width = defaultValue(e.width, 2), this._width = void 0, this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._modelMatrix = new Matrix4(), this.id = e.id, this._id = void 0, this._primitive = void 0; +} +DebugModelMatrixPrimitive.prototype.update = function(e) { + if (this.show) { + if (!defined(this._primitive) || !Matrix4.equals(this._modelMatrix, this.modelMatrix) || this._length !== this.length || this._width !== this.width || this._id !== this.id) { + this._modelMatrix = Matrix4.clone(this.modelMatrix, this._modelMatrix), this._length = this.length, this._width = this.width, this._id = this.id, defined(this._primitive) && this._primitive.destroy(), this.modelMatrix[12] === 0 && this.modelMatrix[13] === 0 && this.modelMatrix[14] === 0 && (this.modelMatrix[14] = 0.01); + const t = new GeometryInstance({ + geometry: new PolylineGeometry({ + positions: [Cartesian3.ZERO, Cartesian3.UNIT_X], + width: this.width, + vertexFormat: PolylineColorAppearance.VERTEX_FORMAT, + colors: [Color.RED, Color.RED], + arcType: ArcType$1.NONE + }), + modelMatrix: Matrix4.multiplyByUniformScale( + this.modelMatrix, + this.length, + new Matrix4() + ), + id: this.id, + pickPrimitive: this + }), n = new GeometryInstance({ + geometry: new PolylineGeometry({ + positions: [Cartesian3.ZERO, Cartesian3.UNIT_Y], + width: this.width, + vertexFormat: PolylineColorAppearance.VERTEX_FORMAT, + colors: [Color.GREEN, Color.GREEN], + arcType: ArcType$1.NONE + }), + modelMatrix: Matrix4.multiplyByUniformScale( + this.modelMatrix, + this.length, + new Matrix4() + ), + id: this.id, + pickPrimitive: this + }), i = new GeometryInstance({ + geometry: new PolylineGeometry({ + positions: [Cartesian3.ZERO, Cartesian3.UNIT_Z], + width: this.width, + vertexFormat: PolylineColorAppearance.VERTEX_FORMAT, + colors: [Color.BLUE, Color.BLUE], + arcType: ArcType$1.NONE + }), + modelMatrix: Matrix4.multiplyByUniformScale( + this.modelMatrix, + this.length, + new Matrix4() + ), + id: this.id, + pickPrimitive: this + }); + this._primitive = new Primitive$3({ + geometryInstances: [t, n, i], + appearance: new PolylineColorAppearance(), + asynchronous: !1 + }); + } + this._primitive.update(e); + } +}; +DebugModelMatrixPrimitive.prototype.isDestroyed = function() { + return !1; +}; +DebugModelMatrixPrimitive.prototype.destroy = function() { + return this._primitive = this._primitive && this._primitive.destroy(), destroyObject(this); +}; +function DirectionalLight(e) { + this.direction = Cartesian3.clone(e.direction), this.color = Color.clone(defaultValue(e.color, Color.WHITE)), this.intensity = defaultValue(e.intensity, 1); +} +const EllipsoidSurfaceAppearanceFS = `in vec3 v_positionMC; +in vec3 v_positionEC; +in vec2 v_st; + +void main() +{ + czm_materialInput materialInput; + + vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0))); +#ifdef FACE_FORWARD + normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); +#endif + + materialInput.s = v_st.s; + materialInput.st = v_st; + materialInput.str = vec3(v_st, 0.0); + + // Convert tangent space material normal to eye space + materialInput.normalEC = normalEC; + materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC); + + // Convert view vector to world space + vec3 positionToEyeEC = -v_positionEC; + materialInput.positionToEyeEC = positionToEyeEC; + + czm_material material = czm_getMaterial(materialInput); + +#ifdef FLAT + out_FragColor = vec4(material.diffuse + material.emission, material.alpha); +#else + out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); +#endif +} +`, EllipsoidSurfaceAppearanceVS = `in vec3 position3DHigh; +in vec3 position3DLow; +in vec2 st; +in float batchId; + +out vec3 v_positionMC; +out vec3 v_positionEC; +out vec2 v_st; + +void main() +{ + vec4 p = czm_computePosition(); + + v_positionMC = position3DHigh + position3DLow; // position in model coordinates + v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates + v_st = st; + + gl_Position = czm_modelViewProjectionRelativeToEye * p; +} +`; +function EllipsoidSurfaceAppearance(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = defaultValue(e.translucent, !0), n = defaultValue(e.aboveGround, !1); + this.material = defined(e.material) ? e.material : Material$4.fromType(Material$4.ColorType), this.translucent = defaultValue(e.translucent, !0), this._vertexShaderSource = defaultValue( + e.vertexShaderSource, + EllipsoidSurfaceAppearanceVS + ), this._fragmentShaderSource = defaultValue( + e.fragmentShaderSource, + EllipsoidSurfaceAppearanceFS + ), this._renderState = Appearance.getDefaultRenderState( + t, + !n, + e.renderState + ), this._closed = !1, this._flat = defaultValue(e.flat, !1), this._faceForward = defaultValue(e.faceForward, n), this._aboveGround = n; +} +Object.defineProperties(EllipsoidSurfaceAppearance.prototype, { + /** + * The GLSL source code for the vertex shader. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {string} + * @readonly + */ + vertexShaderSource: { + get: function() { + return this._vertexShaderSource; + } + }, + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link EllipsoidSurfaceAppearance#material}, + * {@link EllipsoidSurfaceAppearance#flat}, and {@link EllipsoidSurfaceAppearance#faceForward}. + * Use {@link EllipsoidSurfaceAppearance#getFragmentShaderSource} to get the full source. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {string} + * @readonly + */ + fragmentShaderSource: { + get: function() { + return this._fragmentShaderSource; + } + }, + /** + * The WebGL fixed-function state to use when rendering the geometry. + * <p> + * The render state can be explicitly defined when constructing a {@link EllipsoidSurfaceAppearance} + * instance, or it is set implicitly via {@link EllipsoidSurfaceAppearance#translucent} + * and {@link EllipsoidSurfaceAppearance#aboveGround}. + * </p> + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {object} + * @readonly + */ + renderState: { + get: function() { + return this._renderState; + } + }, + /** + * When <code>true</code>, the geometry is expected to be closed so + * {@link EllipsoidSurfaceAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + closed: { + get: function() { + return this._closed; + } + }, + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type VertexFormat + * @readonly + * + * @default {@link EllipsoidSurfaceAppearance.VERTEX_FORMAT} + */ + vertexFormat: { + get: function() { + return EllipsoidSurfaceAppearance.VERTEX_FORMAT; + } + }, + /** + * When <code>true</code>, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + flat: { + get: function() { + return this._flat; + } + }, + /** + * When <code>true</code>, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default true + */ + faceForward: { + get: function() { + return this._faceForward; + } + }, + /** + * When <code>true</code>, the geometry is expected to be on the ellipsoid's + * surface - not at a constant height above it - so {@link EllipsoidSurfaceAppearance#renderState} + * has backface culling enabled. + * + * + * @memberof EllipsoidSurfaceAppearance.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + aboveGround: { + get: function() { + return this._aboveGround; + } + } +}); +EllipsoidSurfaceAppearance.VERTEX_FORMAT = VertexFormat.POSITION_AND_ST; +EllipsoidSurfaceAppearance.prototype.getFragmentShaderSource = Appearance.prototype.getFragmentShaderSource; +EllipsoidSurfaceAppearance.prototype.isTranslucent = Appearance.prototype.isTranslucent; +EllipsoidSurfaceAppearance.prototype.getRenderState = Appearance.prototype.getRenderState; +function FrameRateMonitor(e) { + this._scene = e.scene, this.samplingWindow = defaultValue( + e.samplingWindow, + FrameRateMonitor.defaultSettings.samplingWindow + ), this.quietPeriod = defaultValue( + e.quietPeriod, + FrameRateMonitor.defaultSettings.quietPeriod + ), this.warmupPeriod = defaultValue( + e.warmupPeriod, + FrameRateMonitor.defaultSettings.warmupPeriod + ), this.minimumFrameRateDuringWarmup = defaultValue( + e.minimumFrameRateDuringWarmup, + FrameRateMonitor.defaultSettings.minimumFrameRateDuringWarmup + ), this.minimumFrameRateAfterWarmup = defaultValue( + e.minimumFrameRateAfterWarmup, + FrameRateMonitor.defaultSettings.minimumFrameRateAfterWarmup + ), this._lowFrameRate = new Event(), this._nominalFrameRate = new Event(), this._frameTimes = [], this._needsQuietPeriod = !0, this._quietPeriodEndTime = 0, this._warmupPeriodEndTime = 0, this._frameRateIsLow = !1, this._lastFramesPerSecond = void 0, this._pauseCount = 0; + const t = this; + this._preUpdateRemoveListener = this._scene.preUpdate.addEventListener( + function(r, o) { + update(t); + } + ), this._hiddenPropertyName = document.hidden !== void 0 ? "hidden" : document.mozHidden !== void 0 ? "mozHidden" : document.msHidden !== void 0 ? "msHidden" : document.webkitHidden !== void 0 ? "webkitHidden" : void 0; + const n = document.hidden !== void 0 ? "visibilitychange" : document.mozHidden !== void 0 ? "mozvisibilitychange" : document.msHidden !== void 0 ? "msvisibilitychange" : document.webkitHidden !== void 0 ? "webkitvisibilitychange" : void 0; + function i() { + visibilityChanged(t); + } + this._visibilityChangeRemoveListener = void 0, defined(n) && (document.addEventListener( + n, + i, + !1 + ), this._visibilityChangeRemoveListener = function() { + document.removeEventListener( + n, + i, + !1 + ); + }); +} +FrameRateMonitor.defaultSettings = { + samplingWindow: 5, + quietPeriod: 2, + warmupPeriod: 5, + minimumFrameRateDuringWarmup: 4, + minimumFrameRateAfterWarmup: 8 +}; +FrameRateMonitor.fromScene = function(e) { + return (!defined(e._frameRateMonitor) || e._frameRateMonitor.isDestroyed()) && (e._frameRateMonitor = new FrameRateMonitor({ + scene: e + })), e._frameRateMonitor; +}; +Object.defineProperties(FrameRateMonitor.prototype, { + /** + * Gets the {@link Scene} instance for which to monitor performance. + * @memberof FrameRateMonitor.prototype + * @type {Scene} + */ + scene: { + get: function() { + return this._scene; + } + }, + /** + * Gets the event that is raised when a low frame rate is detected. The function will be passed + * the {@link Scene} instance as its first parameter and the average number of frames per second + * over the sampling window as its second parameter. + * @memberof FrameRateMonitor.prototype + * @type {Event} + */ + lowFrameRate: { + get: function() { + return this._lowFrameRate; + } + }, + /** + * Gets the event that is raised when the frame rate returns to a normal level after having been low. + * The function will be passed the {@link Scene} instance as its first parameter and the average + * number of frames per second over the sampling window as its second parameter. + * @memberof FrameRateMonitor.prototype + * @type {Event} + */ + nominalFrameRate: { + get: function() { + return this._nominalFrameRate; + } + }, + /** + * Gets the most recently computed average frames-per-second over the last <code>samplingWindow</code>. + * This property may be undefined if the frame rate has not been computed. + * @memberof FrameRateMonitor.prototype + * @type {number} + */ + lastFramesPerSecond: { + get: function() { + return this._lastFramesPerSecond; + } + } +}); +FrameRateMonitor.prototype.pause = function() { + ++this._pauseCount, this._pauseCount === 1 && (this._frameTimes.length = 0, this._lastFramesPerSecond = void 0); +}; +FrameRateMonitor.prototype.unpause = function() { + --this._pauseCount, this._pauseCount <= 0 && (this._pauseCount = 0, this._needsQuietPeriod = !0); +}; +FrameRateMonitor.prototype.isDestroyed = function() { + return !1; +}; +FrameRateMonitor.prototype.destroy = function() { + return this._preUpdateRemoveListener(), defined(this._visibilityChangeRemoveListener) && this._visibilityChangeRemoveListener(), destroyObject(this); +}; +function update(e, t) { + if (e._pauseCount > 0) + return; + const n = getTimestamp$1(); + if (e._needsQuietPeriod) + e._needsQuietPeriod = !1, e._frameTimes.length = 0, e._quietPeriodEndTime = n + e.quietPeriod / TimeConstants$1.SECONDS_PER_MILLISECOND, e._warmupPeriodEndTime = e._quietPeriodEndTime + (e.warmupPeriod + e.samplingWindow) / TimeConstants$1.SECONDS_PER_MILLISECOND; + else if (n >= e._quietPeriodEndTime) { + e._frameTimes.push(n); + const i = n - e.samplingWindow / TimeConstants$1.SECONDS_PER_MILLISECOND; + if (e._frameTimes.length >= 2 && e._frameTimes[0] <= i) { + for (; e._frameTimes.length >= 2 && e._frameTimes[1] < i; ) + e._frameTimes.shift(); + const r = (n - e._frameTimes[0]) / (e._frameTimes.length - 1); + e._lastFramesPerSecond = 1e3 / r; + const o = 1e3 / (n > e._warmupPeriodEndTime ? e.minimumFrameRateAfterWarmup : e.minimumFrameRateDuringWarmup); + r > o ? e._frameRateIsLow || (e._frameRateIsLow = !0, e._needsQuietPeriod = !0, e.lowFrameRate.raiseEvent( + e.scene, + e._lastFramesPerSecond + )) : e._frameRateIsLow && (e._frameRateIsLow = !1, e._needsQuietPeriod = !0, e.nominalFrameRate.raiseEvent( + e.scene, + e._lastFramesPerSecond + )); + } + } +} +function visibilityChanged(e) { + document[e._hiddenPropertyName] ? e.pause() : e.unpause(); +} +function GoogleEarthEnterpriseDiscardPolicy() { + this._image = new Image(); +} +GoogleEarthEnterpriseDiscardPolicy.prototype.isReady = function() { + return !0; +}; +GoogleEarthEnterpriseDiscardPolicy.prototype.shouldDiscardImage = function(e) { + return e === this._image; +}; +function GoogleEarthEnterpriseImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._tileDiscardPolicy = e.tileDiscardPolicy, this._tilingScheme = new GeographicTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 2, + rectangle: new Rectangle( + -CesiumMath.PI, + -CesiumMath.PI, + CesiumMath.PI, + CesiumMath.PI + ), + ellipsoid: e.ellipsoid + }); + let t = e.credit; + typeof t == "string" && (t = new Credit(t)), this._credit = t, this._tileWidth = 256, this._tileHeight = 256, this._maximumLevel = 23, defined(this._tileDiscardPolicy) || (this._tileDiscardPolicy = new GoogleEarthEnterpriseDiscardPolicy()), this._errorEvent = new Event(); +} +Object.defineProperties(GoogleEarthEnterpriseImageryProvider.prototype, { + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._metadata.url; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._metadata.proxy; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return 0; + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._credit; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + * @memberof GoogleEarthEnterpriseImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !1; + } + } +}); +GoogleEarthEnterpriseImageryProvider.fromMetadata = function(e, t) { + if (!e.imageryPresent) + throw new RuntimeError(`The server ${e.url} doesn't have imagery`); + const n = new GoogleEarthEnterpriseImageryProvider(t); + return n._metadata = e, n; +}; +GoogleEarthEnterpriseImageryProvider.prototype.getTileCredits = function(e, t, n) { + const i = this._metadata, r = i.getTileInformation(e, t, n); + if (defined(r)) { + const o = i.providers[r.imageryProvider]; + if (defined(o)) + return [o]; + } +}; +GoogleEarthEnterpriseImageryProvider.prototype.requestImage = function(e, t, n, i) { + const r = this._tileDiscardPolicy._image, o = this._metadata, s = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e, t, n), c = o.getTileInformation(e, t, n); + if (!defined(c)) { + if (o.isValid(s)) { + const d = new Request({ + throttle: i.throttle, + throttleByServer: i.throttleByServer, + type: i.type, + priorityFunction: i.priorityFunction + }); + o.populateSubtree(e, t, n, d); + return; + } + return Promise.resolve(r); + } + if (!c.hasImagery()) + return Promise.resolve(r); + const l = buildImageResource( + this, + c, + e, + t, + n, + i + ).fetchArrayBuffer(); + if (defined(l)) + return l.then(function(d) { + decodeGoogleEarthEnterpriseData(o.key, d); + let f = new Uint8Array(d), h; + const p = o.protoImagery; + if ((!defined(p) || !p) && (h = getImageType(f)), !defined(h) && (!defined(p) || p)) { + const m = decodeEarthImageryPacket(f); + h = m.imageType, f = m.imageData; + } + return !defined(h) || !defined(f) ? r : loadImageFromTypedArray({ + uint8Array: f, + format: h, + flipY: !0 + }); + }); +}; +GoogleEarthEnterpriseImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +function buildImageResource(e, t, n, i, r, o) { + const s = GoogleEarthEnterpriseMetadata.tileXYToQuadKey(n, i, r); + let c = t.imageryVersion; + return c = defined(c) && c > 0 ? c : 1, e._metadata.resource.getDerivedResource({ + url: `flatfile?f1-0${s}-i.${c.toString()}`, + request: o + }); +} +function getImageType(e) { + const t = "JFIF"; + if (e[6] === t.charCodeAt(0) && e[7] === t.charCodeAt(1) && e[8] === t.charCodeAt(2) && e[9] === t.charCodeAt(3)) + return "image/jpeg"; + const n = "PNG"; + if (e[1] === n.charCodeAt(0) && e[2] === n.charCodeAt(1) && e[3] === n.charCodeAt(2)) + return "image/png"; +} +function decodeEarthImageryPacket(e) { + const t = protobufExports.Reader.create(e), n = t.len, i = {}; + for (; t.pos < n; ) { + const s = t.uint32(); + let c; + switch (s >>> 3) { + case 1: + i.imageType = t.uint32(); + break; + case 2: + i.imageData = t.bytes(); + break; + case 3: + i.alphaType = t.uint32(); + break; + case 4: + i.imageAlpha = t.bytes(); + break; + case 5: + if (c = i.copyrightIds, defined(c) || (c = i.copyrightIds = []), (s & 7) === 2) { + const l = t.uint32() + t.pos; + for (; t.pos < l; ) + c.push(t.uint32()); + } else + c.push(t.uint32()); + break; + default: + t.skipType(s & 7); + break; + } + } + const r = i.imageType; + if (defined(r)) + switch (r) { + case 0: + i.imageType = "image/jpeg"; + break; + case 4: + i.imageType = "image/png"; + break; + default: + throw new RuntimeError( + "GoogleEarthEnterpriseImageryProvider: Unsupported image type." + ); + } + const o = i.alphaType; + return defined(o) && o !== 0 && (console.log( + "GoogleEarthEnterpriseImageryProvider: External alpha not supported." + ), delete i.alphaType, delete i.imageAlpha), i; +} +const defaultColor = new Color(1, 1, 1, 0.4), defaultGlowColor = new Color(0, 1, 0, 0.05), defaultBackgroundColor = new Color(0, 0.5, 0, 0.2); +function GridImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0, this._tilingScheme = defined(e.tilingScheme) ? e.tilingScheme : new GeographicTilingScheme({ ellipsoid: e.ellipsoid }), this._cells = defaultValue(e.cells, 8), this._color = defaultValue(e.color, defaultColor), this._glowColor = defaultValue(e.glowColor, defaultGlowColor), this._glowWidth = defaultValue(e.glowWidth, 6), this._backgroundColor = defaultValue( + e.backgroundColor, + defaultBackgroundColor + ), this._errorEvent = new Event(), this._tileWidth = defaultValue(e.tileWidth, 256), this._tileHeight = defaultValue(e.tileHeight, 256), this._canvasSize = defaultValue(e.canvasSize, 256), this._canvas = this._createGridCanvas(); +} +Object.defineProperties(GridImageryProvider.prototype, { + /** + * Gets the proxy used by this provider. + * @memberof GridImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof GridImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof GridImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof GridImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof GridImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof GridImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof GridImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof GridImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof GridImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof GridImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof GridImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !0; + } + } +}); +GridImageryProvider.prototype._drawGrid = function(e) { + const n = this._canvasSize; + for (let i = 0; i <= this._cells; ++i) { + const o = 1 + i / this._cells * (n - 1); + e.moveTo(o, 0), e.lineTo(o, n), e.moveTo(0, o), e.lineTo(n, o); + } + e.stroke(); +}; +GridImageryProvider.prototype._createGridCanvas = function() { + const e = document.createElement("canvas"); + e.width = this._canvasSize, e.height = this._canvasSize; + const t = 0, n = this._canvasSize, i = e.getContext("2d"), r = this._backgroundColor.toCssColorString(); + i.fillStyle = r, i.fillRect(t, t, n, n); + const o = this._glowColor.toCssColorString(); + i.strokeStyle = o, i.lineWidth = this._glowWidth, i.strokeRect(t, t, n, n), this._drawGrid(i), i.lineWidth = this._glowWidth * 0.5, i.strokeRect(t, t, n, n), this._drawGrid(i); + const s = this._color.toCssColorString(); + return i.strokeStyle = s, i.lineWidth = 2, i.strokeRect(t, t, n, n), i.lineWidth = 1, this._drawGrid(i), e; +}; +GridImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +GridImageryProvider.prototype.requestImage = function(e, t, n, i) { + return Promise.resolve(this._canvas); +}; +GridImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +function I3SDecoder() { +} +I3SDecoder._maxDecodingConcurrency = Math.max( + FeatureDetection.hardwareConcurrency - 1, + 1 +); +I3SDecoder._decodeTaskProcessor = new TaskProcessor( + "decodeI3S", + I3SDecoder._maxDecodingConcurrency +); +I3SDecoder._promise = void 0; +async function initializeDecoder() { + if (await I3SDecoder._decodeTaskProcessor.initWebAssemblyModule({ + wasmBinaryFile: "ThirdParty/draco_decoder.wasm" + })) + return I3SDecoder._decodeTaskProcessor; + throw new RuntimeError("I3S decoder could not be initialized."); +} +I3SDecoder.decode = async function(e, t, n, i, r) { + return defined(I3SDecoder._promise) || (I3SDecoder._promise = initializeDecoder()), I3SDecoder._promise.then(function(o) { + const s = n._parent._data, c = n._parent._inverseRotationMatrix; + let l = 0, d = 0, f = 0; + defined(s.obb) ? (l = s.obb.center[0], d = s.obb.center[1], f = s.obb.center[2]) : defined(s.mbs) && (l = s.mbs[0], d = s.mbs[1], f = s.mbs[2]); + const h = Matrix3.fromRotationX(-CesiumMath.PI_OVER_TWO), p = new Matrix3(); + Matrix3.multiply( + h, + c, + p + ); + const m = Cartographic.fromDegrees( + l, + d, + f + ), _ = Ellipsoid.WGS84.cartographicToCartesian( + m + ), y = { + binaryData: n._data, + featureData: defined(i) && defined(i[0]) ? i[0].data : void 0, + schema: t, + bufferInfo: n._geometryBufferInfo, + ellipsoidRadiiSquare: Ellipsoid.WGS84.radiiSquared, + url: e, + geoidDataList: n._dataProvider._geoidDataList, + cartographicCenter: m, + cartesianCenter: _, + parentRotation: p, + enableFeatures: n._dataProvider.showFeatures, + splitGeometryByColorTransparency: n._dataProvider.adjustMaterialAlphaMode, + symbologyData: r, + calculateNormals: n._dataProvider.calculateNormals + }; + return o.scheduleTask(y); + }); +}; +function I3SFeature(e, t) { + this._parent = e, this._dataProvider = e._dataProvider, this._layer = e._layer, defined(this._parent._nodeIndex) ? this._resource = this._parent._layer.resource.getDerivedResource({ + url: `nodes/${this._parent._data.mesh.attribute.resource}/${t}` + }) : this._resource = this._parent.resource.getDerivedResource({ url: t }); +} +Object.defineProperties(I3SFeature.prototype, { + /** + * Gets the resource for the feature + * @memberof I3SFeature.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SFeature.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + } +}); +I3SFeature.prototype.load = async function() { + return this._data = await I3SDataProvider.loadJson(this._resource), this._data; +}; +function I3SField(e, t) { + this._storageInfo = t, this._parent = e, this._dataProvider = e._dataProvider, this._loadPromise = void 0; + const n = `attributes/${t.key}/0`; + defined(this._parent._nodeIndex) ? this._resource = this._parent._layer.resource.getDerivedResource({ + url: `nodes/${this._parent._data.mesh.attribute.resource}/${n}` + }) : this._resource = this._parent.resource.getDerivedResource({ url: n }); +} +Object.defineProperties(I3SField.prototype, { + /** + * Gets the resource for the fields + * @memberof I3SField.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the header for this field. + * @memberof I3SField.prototype + * @type {object} + * @readonly + */ + header: { + get: function() { + return this._header; + } + }, + /** + * Gets the values for this field. + * @memberof I3SField.prototype + * @type {object} + * @readonly + */ + values: { + get: function() { + if (defined(this._values)) { + if (defined(this._values.attributeValues)) + return this._values.attributeValues; + if (defined(this._values.objectIds)) + return this._values.objectIds; + } + return []; + } + }, + /** + * Gets the name for the field. + * @memberof I3SField.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._storageInfo.name; + } + } +}); +function getNumericTypeSize(e) { + return e === "UInt8" || e === "Int8" ? 1 : e === "UInt16" || e === "Int16" ? 2 : e === "UInt32" || e === "Int32" || e === "Oid32" || e === "Float32" ? 4 : e === "UInt64" || e === "Int64" || e === "Float64" ? 8 : 0; +} +function getValueTypeSize(e) { + return e === "String" ? 1 : getNumericTypeSize(e); +} +async function load(e) { + const t = await e._dataProvider._loadBinary(e._resource), n = new DataView(t); + e._data = t, e._validateHeader(n); + const i = e._parseHeader(n), r = e._getBodyOffset(i); + e._validateBody(n, r), e._parseBody(n, r); +} +I3SField.prototype.load = function() { + return defined(this._loadPromise) ? this._loadPromise : (this._loadPromise = load(this).catch(function(e) { + console.error(e); + }), this._loadPromise); +}; +I3SField.prototype._parseValue = function(e, t, n) { + let i; + if (t === "UInt8") + i = e.getUint8(n), n += 1; + else if (t === "Int8") + i = e.getInt8(n), n += 1; + else if (t === "UInt16") + i = e.getUint16(n, !0), n += 2; + else if (t === "Int16") + i = e.getInt16(n, !0), n += 2; + else if (t === "UInt32") + i = e.getUint32(n, !0), n += 4; + else if (t === "Oid32") + i = e.getUint32(n, !0), n += 4; + else if (t === "Int32") + i = e.getInt32(n, !0), n += 4; + else if (t === "UInt64") { + const r = e.getUint32(n, !0), o = e.getUint32(n + 4, !0); + i = r + Math.pow(2, 32) * o, n += 8; + } else if (t === "Int64") { + const r = e.getUint32(n, !0), o = e.getUint32(n + 4, !0); + o < Math.pow(2, 31) ? i = r + Math.pow(2, 32) * o : i = r + Math.pow(2, 32) * (o - Math.pow(2, 32)), n += 8; + } else t === "Float32" ? (i = e.getFloat32(n, !0), n += 4) : t === "Float64" ? (i = e.getFloat64(n, !0), n += 8) : t === "String" && (i = String.fromCharCode(e.getUint8(n)), n += 1); + return { + value: i, + offset: n + }; +}; +I3SField.prototype._parseHeader = function(e) { + let t = 0; + this._header = {}; + for (let n = 0; n < this._storageInfo.header.length; n++) { + const i = this._storageInfo.header[n], r = this._parseValue(e, i.valueType, t); + this._header[i.property] = r.value, t = r.offset; + } + return t; +}; +I3SField.prototype._parseBody = function(e, t) { + this._values = {}; + for (let n = 0; n < this._storageInfo.ordering.length; n++) { + const i = this._storageInfo.ordering[n], r = i === "ObjectIds" ? "objectIds" : i, o = this._storageInfo[r]; + if (defined(o)) { + this._values[r] = []; + for (let s = 0; s < this._header.count; ++s) + if (o.valueType !== "String") { + const c = this._parseValue( + e, + o.valueType, + t + ); + this._values[r].push(c.value), t = c.offset; + } else { + const c = this._values.attributeByteCounts[s]; + let l = ""; + for (let d = 0; d < c; ++d) { + const f = this._parseValue( + e, + o.valueType, + t + ); + f.value.charCodeAt(0) !== 0 && (l += f.value), t = f.offset; + } + this._values[r].push(l); + } + } + } +}; +I3SField.prototype._getBodyOffset = function(e) { + let t = 0; + return defined(this._storageInfo.attributeValues) ? t = getNumericTypeSize(this._storageInfo.attributeValues.valueType) : defined(this._storageInfo.objectIds) && (t = getNumericTypeSize(this._storageInfo.objectIds.valueType)), t > 0 ? Math.ceil(e / t) * t : e; +}; +I3SField.prototype._validateHeader = function(e) { + let t = 0; + for (let n = 0; n < this._storageInfo.header.length; n++) { + const i = this._storageInfo.header[n]; + t += getValueTypeSize(i.valueType); + } + if (e.byteLength < t) + throw new RuntimeError( + `Invalid attribute buffer size (field: ${this.name}, header: ${t}, actual: ${e.byteLength})` + ); +}; +I3SField.prototype._validateBody = function(e, t) { + if (!defined(this._header.count)) + throw new RuntimeError( + `Invalid attribute buffer (field: ${this.name}, count is missing)` + ); + let n; + for (let i = 0; i < this._storageInfo.ordering.length && t < e.byteLength; i++) { + const r = this._storageInfo.ordering[i], o = r === "ObjectIds" ? "objectIds" : r, s = this._storageInfo[o]; + if (defined(s)) + if (s.valueType !== "String") { + o === "attributeByteCounts" && (n = t); + const c = getNumericTypeSize(s.valueType); + t += c * this._header.count; + } else { + if (!defined(n)) + throw new RuntimeError( + `Invalid attribute buffer (field: ${this.name}, attributeByteCounts is missing)` + ); + for (let c = 0; c < this._header.count && t < e.byteLength; ++c) { + const l = this._parseValue( + e, + this._storageInfo.attributeByteCounts.valueType, + n + ); + t += l.value, n = l.offset; + } + } + else + throw new RuntimeError( + `Invalid attribute buffer (field: ${this.name}, ${o} is missing)` + ); + } + if (e.byteLength < t) + throw new RuntimeError( + `Invalid attribute buffer size (field: ${this.name}, expected: ${t}, actual: ${e.byteLength})` + ); +}; +function I3SGeometry(e, t) { + const n = e._dataProvider, i = e._layer; + let r; + defined(e._nodeIndex) ? r = i.resource.getDerivedResource({ + url: `nodes/${e._data.mesh.geometry.resource}/${t}` + }) : r = e.resource.getDerivedResource({ url: t }), this._parent = e, this._dataProvider = n, this._layer = i, this._resource = r, this._customAttributes = void 0; +} +Object.defineProperties(I3SGeometry.prototype, { + /** + * Gets the resource for the geometry + * @memberof I3SGeometry.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SGeometry.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + }, + /** + * Gets the custom attributes of the geometry. + * @memberof I3SGeometry.prototype + * @type {object} + * @readonly + */ + customAttributes: { + get: function() { + return this._customAttributes; + } + } +}); +I3SGeometry.prototype.load = function() { + const e = this; + return this._dataProvider._loadBinary(this._resource).then(function(t) { + return e._data = t, t; + }); +}; +const scratchAb = new Cartesian3(), scratchAp1 = new Cartesian3(), scratchAp2 = new Cartesian3(), scratchCp1 = new Cartesian3(), scratchCp2 = new Cartesian3(); +function sameSide(e, t, n, i) { + const r = Cartesian3.subtract(i, n, scratchAb), o = Cartesian3.cross( + r, + Cartesian3.subtract(e, n, scratchAp1), + scratchCp1 + ), s = Cartesian3.cross( + r, + Cartesian3.subtract(t, n, scratchAp2), + scratchCp2 + ); + return Cartesian3.dot(o, s) >= 0; +} +const scratchV0 = new Cartesian3(), scratchV1 = new Cartesian3(), scratchV0V1 = new Cartesian3(), scratchV0V2 = new Cartesian3(), scratchCrossProd = new Cartesian3(), scratchNormal = new Cartesian3(), scratchV0p = new Cartesian3(), scratchV1p = new Cartesian3(), scratchV2p = new Cartesian3(); +I3SGeometry.prototype.getClosestPointIndexOnTriangle = function(e, t, n) { + if (defined(this._customAttributes) && defined(this._customAttributes.positions)) { + const i = new Cartesian3(e, t, n); + i.x -= this._customAttributes.cartesianCenter.x, i.y -= this._customAttributes.cartesianCenter.y, i.z -= this._customAttributes.cartesianCenter.z, Matrix3.multiplyByVector( + this._customAttributes.parentRotation, + i, + i + ); + let r = Number.MAX_VALUE, o, s, c, l; + const d = this._customAttributes.positions, f = this._customAttributes.indices; + let h; + defined(f) ? h = f.length : h = d.length / 3; + for (let p = 0; p < h; p++) { + let m, _, y; + defined(f) ? (m = f[p], _ = f[p + 1], y = f[p + 2]) : (m = p * 3, _ = p * 3 + 1, y = p * 3 + 2); + const C = Cartesian3.fromElements( + d[m * 3], + d[m * 3 + 1], + d[m * 3 + 2], + scratchV0 + ), T = Cartesian3.fromElements( + d[_ * 3], + d[_ * 3 + 1], + d[_ * 3 + 2], + scratchV1 + ), x = new Cartesian3( + d[y * 3], + d[y * 3 + 1], + d[y * 3 + 2] + ); + if (!sameSide(i, C, T, x) || !sameSide(i, T, C, x) || !sameSide(i, x, C, T)) + continue; + const b = Cartesian3.subtract(T, C, scratchV0V1), S = Cartesian3.subtract(x, C, scratchV0V2), E = Cartesian3.cross(b, S, scratchCrossProd); + if (Cartesian3.magnitude(E) === 0) + continue; + const A = Cartesian3.normalize(E, scratchNormal), D = Cartesian3.subtract(i, C, scratchV0p), P = Math.abs(Cartesian3.dot(D, A)); + if (P < r) { + r = P, o = p; + const I = Cartesian3.magnitudeSquared( + Cartesian3.subtract(i, C, D) + ), M = Cartesian3.magnitudeSquared( + Cartesian3.subtract(i, T, scratchV1p) + ), R = Cartesian3.magnitudeSquared( + Cartesian3.subtract(i, x, scratchV2p) + ); + I < M && I < R ? (c = m, l = C, s = I) : M < R ? (c = _, l = T, s = M) : (c = y, l = x, s = R); + } + } + if (defined(o)) + return { + index: c, + distanceSquared: s, + distance: Math.sqrt(s), + queriedPosition: i, + closestPosition: Cartesian3.clone(l) + }; + } + return { + index: -1, + distanceSquared: Number.Infinity, + distance: Number.Infinity + }; +}; +function convertColorFactor(e) { + const t = [], n = e.length; + for (let i = 0; i < n; i++) + i < 3 ? t.push(srgbToLinear(e[i])) : t.push(e[i]); + return t; +} +I3SGeometry.prototype._generateGltf = function(e, t, n, i, r, o, s, c) { + let l = { + pbrMetallicRoughness: { + metallicFactor: 0 + }, + doubleSided: !0, + name: "Material" + }, d = !1, f, h = ""; + if (defined(this._parent._data.mesh) && defined(this._layer._data.materialDefinitions)) { + const b = this._parent._data.mesh.material.definition; + if (b >= 0 && b < this._layer._data.materialDefinitions.length) { + if (f = this._layer._data.materialDefinitions[b], l = f, defined(l.pbrMetallicRoughness) && defined(l.pbrMetallicRoughness.baseColorTexture)) { + d = !0, l.pbrMetallicRoughness.baseColorTexture.index = 0; + let S = "0"; + if (defined(this._layer._data.textureSetDefinitions)) + for (let E = 0; E < this._layer._data.textureSetDefinitions.length; E++) { + const A = this._layer._data.textureSetDefinitions[E]; + for (let D = 0; D < A.formats.length; D++) { + const P = A.formats[D]; + if (P.format === "jpg") { + S = P.name; + break; + } + } + } + defined(this._parent._data.mesh) && this._parent._data.mesh.material.resource >= 0 && (h = this._layer.resource.getDerivedResource({ + url: `nodes/${this._parent._data.mesh.material.resource}/textures/${S}` + }).url); + } + defined(l.pbrMetallicRoughness) && defined(l.pbrMetallicRoughness.baseColorFactor) && (l.pbrMetallicRoughness.baseColorFactor = convertColorFactor( + l.pbrMetallicRoughness.baseColorFactor + )), defined(l.emissiveFactor) && (l.emissiveFactor = convertColorFactor( + l.emissiveFactor + )); + } + } else defined(this._parent._data.textureData) && (d = !0, h = this._parent.resource.getDerivedResource({ + url: `${this._parent._data.textureData[0].href}` + }).url, l.pbrMetallicRoughness.baseColorTexture = { index: 0 }); + defined(l.alphaMode) && (l.alphaMode = l.alphaMode.toUpperCase()); + let p = [], m = [], _ = []; + d && (p = [ + { + sampler: 0, + source: 0 + } + ], m = [ + { + uri: h + } + ], _ = [ + { + magFilter: 9729, + minFilter: 9986, + wrapS: 10497, + wrapT: 10497 + } + ]); + const y = [], C = n.length; + for (let x = 0; x < C; x++) { + const b = n[x].primitives, S = b.length; + for (let E = 0; E < S; E++) { + const A = b[E]; + if (defined(A.material)) { + for (; A.material >= y.length; ) { + const P = clone$1(l, !0); + y.push(P); + } + const D = y[A.material]; + defined(A.extra) && A.extra.isTransparent ? defined(D.alphaMode) || (D.alphaMode = "BLEND") : D.alphaMode === "BLEND" && (D.alphaMode = "OPAQUE"); + } + } + } + return { + scene: 0, + scenes: [ + { + nodes: e + } + ], + nodes: t, + meshes: n, + buffers: i, + bufferViews: r, + accessors: o, + materials: y, + textures: p, + images: m, + samplers: _, + asset: { + version: "2.0" + }, + extensions: s, + extensionsUsed: c + }; +}; +function I3SNode(e, t, n) { + let i, r, o, s; + n ? (i = 0, r = e) : (i = e._level + 1, r = e._layer), typeof t == "number" ? o = t : s = e.resource.getDerivedResource({ + url: `${t}/` + }), this._parent = e, this._dataProvider = e._dataProvider, this._isRoot = n, this._level = i, this._layer = r, this._nodeIndex = o, this._resource = s, this._isLoading = !1, this._tile = void 0, this._data = void 0, this._geometryData = [], this._featureData = [], this._fields = {}, this._children = [], this._childrenReadyPromise = void 0, this._globalTransform = void 0, this._inverseGlobalTransform = void 0, this._inverseRotationMatrix = void 0, this._symbologyData = void 0; +} +Object.defineProperties(I3SNode.prototype, { + /** + * Gets the resource for the node. + * @memberof I3SNode.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the parent layer. + * @memberof I3SNode.prototype + * @type {I3SLayer} + * @readonly + */ + layer: { + get: function() { + return this._layer; + } + }, + /** + * Gets the parent node. + * @memberof I3SNode.prototype + * @type {I3SNode|undefined} + * @readonly + */ + parent: { + get: function() { + return this._parent; + } + }, + /** + * Gets the children nodes. + * @memberof I3SNode.prototype + * @type {I3SNode[]} + * @readonly + */ + children: { + get: function() { + return this._children; + } + }, + /** + * Gets the collection of geometries. + * @memberof I3SNode.prototype + * @type {I3SGeometry[]} + * @readonly + */ + geometryData: { + get: function() { + return this._geometryData; + } + }, + /** + * Gets the collection of features. + * @memberof I3SNode.prototype + * @type {I3SFeature[]} + * @readonly + */ + featureData: { + get: function() { + return this._featureData; + } + }, + /** + * Gets the collection of fields. + * @memberof I3SNode.prototype + * @type {I3SField[]} + * @readonly + */ + fields: { + get: function() { + return this._fields; + } + }, + /** + * Gets the Cesium3DTile for this node. + * @memberof I3SNode.prototype + * @type {Cesium3DTile} + * @readonly + */ + tile: { + get: function() { + return this._tile; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SNode.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + } +}); +I3SNode.prototype.load = async function() { + const e = this; + function t() { + if (!e._isRoot) { + const r = e._create3DTileDefinition(); + e._tile = new Cesium3DTile( + e._layer._tileset, + e._dataProvider.resource, + r, + e._parent._tile + ), e._tile._i3sNode = e; + } + } + if (!defined(this._nodeIndex)) { + const r = await I3SDataProvider.loadJson(this._resource); + e._data = r, t(); + return; + } + const n = await this._layer._getNodeInNodePages(this._nodeIndex); + e._data = n; + let i; + e._isRoot ? i = "nodes/root/" : defined(n.mesh) && (i = `../${n.mesh.geometry.resource}/`), defined(i) && (e._resource = e._parent.resource.getDerivedResource({ url: i })), t(); +}; +function createAndLoadField(e, t) { + const n = new I3SField(e, t); + return e._fields[t.name] = n, n.load(); +} +I3SNode.prototype.loadFields = function() { + const e = this._layer._data.attributeStorageInfo, t = []; + if (defined(e)) + for (let n = 0; n < e.length; n++) { + const i = e[n], r = this._fields[i.name]; + defined(r) ? t.push(r.load()) : t.push(createAndLoadField(this, i)); + } + return Promise.all(t); +}; +I3SNode.prototype.loadField = function(e) { + const t = this._fields[e]; + if (defined(t)) + return t.load(); + const n = this._layer._data.attributeStorageInfo; + if (defined(n)) + for (let i = 0; i < n.length; i++) { + const r = n[i]; + if (r.name === e) + return createAndLoadField(this, r); + } + return Promise.resolve(); +}; +I3SNode.prototype.getFieldsForPickedPosition = function(e) { + const t = this.geometryData[0]; + if (!defined(t.customAttributes.featureIndex)) + return {}; + const n = t.getClosestPointIndexOnTriangle( + e.x, + e.y, + e.z + ); + if (n.index === -1 || n.index > t.customAttributes.featureIndex.length) + return {}; + const i = t.customAttributes.featureIndex[n.index]; + return this.getFieldsForFeature(i); +}; +I3SNode.prototype.getFieldsForFeature = function(e) { + const t = {}; + for (const n in this.fields) + if (this.fields.hasOwnProperty(n)) { + const i = this.fields[n]; + e >= 0 && e < i.values.length && (t[i.name] = i.values[e]); + } + return t; +}; +I3SNode.prototype._loadChildren = function() { + const e = this; + if (defined(this._childrenReadyPromise)) + return this._childrenReadyPromise; + const t = []; + if (defined(e._data.children)) + for (let n = 0; n < e._data.children.length; n++) { + const i = e._data.children[n], r = new I3SNode( + e, + defaultValue(i.href, i), + !1 + ); + e._children.push(r), t.push(r.load()); + } + return this._childrenReadyPromise = Promise.all(t).then(function() { + for (let n = 0; n < e._children.length; n++) + e._tile.children.push(e._children[n]._tile); + }), this._childrenReadyPromise; +}; +I3SNode.prototype._loadGeometryData = function() { + const e = []; + if (defined(this._data.geometryData)) + for (let t = 0; t < this._data.geometryData.length; t++) { + const n = new I3SGeometry( + this, + this._data.geometryData[t].href + ); + this._geometryData.push(n), e.push(n.load()); + } + else if (defined(this._data.mesh)) { + const t = this._layer._findBestGeometryBuffers( + this._data.mesh.geometry.definition, + ["position", "uv0"] + ), n = `./geometries/${t.bufferIndex}/`, i = new I3SGeometry(this, n); + i._geometryDefinitions = t.definition, i._geometryBufferInfo = t.geometryBufferInfo, this._geometryData.push(i), e.push(i.load()); + } + return Promise.all(e); +}; +I3SNode.prototype._loadFeatureData = function() { + const e = []; + if (defined(this._data.featureData)) + for (let t = 0; t < this._data.featureData.length; t++) { + const n = new I3SFeature( + this, + this._data.featureData[t].href + ); + this._featureData.push(n), e.push(n.load()); + } + return Promise.all(e); +}; +I3SNode.prototype._clearGeometryData = function() { + this._geometryData = []; +}; +I3SNode.prototype._create3DTileDefinition = function() { + const e = this._data.obb, t = this._data.mbs; + if (!defined(e) && !defined(t)) { + console.error("Failed to load I3S node. Bounding volume is required."); + return; + } + let n; + if (defined(e) ? n = Cartographic.fromDegrees( + e.center[0], + e.center[1], + e.center[2] + ) : n = Cartographic.fromDegrees(t[0], t[1], t[2]), defined(this._dataProvider._geoidDataList) && defined(n)) + for (let T = 0; T < this._dataProvider._geoidDataList.length; T++) { + const x = this._dataProvider._geoidDataList[T], b = x.projection.project(n); + if (b.x > x.nativeExtent.west && b.x < x.nativeExtent.east && b.y > x.nativeExtent.south && b.y < x.nativeExtent.north) { + n.height += sampleGeoid(b.x, b.y, x); + break; + } + } + let i = {}, r, o = 0; + defined(e) ? (i = { + box: [ + 0, + 0, + 0, + e.halfSize[0], + 0, + 0, + 0, + e.halfSize[1], + 0, + 0, + 0, + e.halfSize[2] + ] + }, o = Math.max( + Math.max(this._data.obb.halfSize[0], this._data.obb.halfSize[1]), + this._data.obb.halfSize[2] + ), r = Ellipsoid.WGS84.cartographicToCartesian(n)) : (i = { + sphere: [0, 0, 0, t[3]] + }, r = Ellipsoid.WGS84.cartographicToCartesian(n), o = this._data.mbs[3]), o *= 2; + let s = 1 / 0; + if (defined(this._data.lodThreshold)) + if (this._layer._data.nodePages.lodSelectionMetricType === "maxScreenThresholdSQ") { + const T = Math.sqrt( + this._data.lodThreshold / (Math.PI * 0.25) + ); + s = o / T; + } else if (this._layer._data.nodePages.lodSelectionMetricType === "maxScreenThreshold") { + const T = this._data.lodThreshold; + s = o / T; + } else + console.error("Invalid lodSelectionMetricType in Layer"); + else if (defined(this._data.lodSelection)) + for (let T = 0; T < this._data.lodSelection.length; T++) + this._data.lodSelection[T].metricType === "maxScreenThreshold" && (s = o / this._data.lodSelection[T].maxError); + s === 1 / 0 && (s = 1e5); + const c = s * 16, l = new HeadingPitchRoll(0, 0, 0); + let d = Transforms.headingPitchRollQuaternion(r, l); + defined(this._data.obb) && (d = new Quaternion( + this._data.obb.quaternion[0], + this._data.obb.quaternion[1], + this._data.obb.quaternion[2], + this._data.obb.quaternion[3] + )); + const f = Matrix3.fromQuaternion(d), h = Matrix3.inverse(f, new Matrix3()), p = new Matrix4( + f[0], + f[1], + f[2], + 0, + f[3], + f[4], + f[5], + 0, + f[6], + f[7], + f[8], + 0, + r.x, + r.y, + r.z, + 1 + ), m = Matrix4.inverse( + p, + new Matrix4() + ), _ = Matrix4.clone(p); + defined(this._parent._globalTransform) && Matrix4.multiply( + p, + this._parent._inverseGlobalTransform, + _ + ), this._globalTransform = p, this._inverseGlobalTransform = m, this._inverseRotationMatrix = h; + const y = []; + for (let T = 0; T < this._children.length; T++) + y.push( + this._children[T]._create3DTileDefinition() + ); + return { + children: y, + refine: "REPLACE", + boundingVolume: i, + transform: [ + _[0], + _[4], + _[8], + _[12], + _[1], + _[5], + _[9], + _[13], + _[2], + _[6], + _[10], + _[14], + _[3], + _[7], + _[11], + _[15] + ], + content: { + uri: defined(this._resource) ? this._resource.url : void 0 + }, + geometricError: c + }; +}; +I3SNode.prototype._loadSymbology = async function() { + !defined(this._symbologyData) && defined(this._layer._symbology) && (this._symbologyData = await this._layer._symbology._getSymbology(this)); +}; +I3SNode.prototype._createContentURL = async function() { + let e = { + scene: 0, + scenes: [ + { + nodes: [0] + } + ], + nodes: [ + { + name: "singleNode" + } + ], + meshes: [], + buffers: [], + bufferViews: [], + accessors: [], + materials: [], + textures: [], + images: [], + samplers: [], + asset: { + version: "2.0" + } + }; + const t = [this._loadGeometryData()]; + if (this._dataProvider.legacyVersion16 && t.push(this._loadFeatureData()), await Promise.all(t), defined(this._geometryData) && this._geometryData.length > 0) { + this._dataProvider._applySymbology && await this._loadSymbology(); + const r = this._geometryData[0].resource.url, o = this._layer._data.store.defaultGeometrySchema, s = this._geometryData[0], c = await I3SDecoder.decode( + r, + o, + s, + this._featureData[0], + this._symbologyData + ); + if (!defined(c)) + return; + e = s._generateGltf( + c.meshData.nodesInScene, + c.meshData.nodes, + c.meshData.meshes, + c.meshData.buffers, + c.meshData.bufferViews, + c.meshData.accessors, + c.meshData.rootExtensions, + c.meshData.extensionsUsed + ), this._geometryData[0]._customAttributes = c.meshData._customAttributes; + } + const n = this._dataProvider._binarizeGltf(e), i = new Blob([n], { + type: "application/binary" + }); + return URL.createObjectURL(i); +}; +async function loadFilters(e) { + const t = e._layer._filters, n = []; + for (let i = 0; i < t.length; i++) { + const r = e.loadField(t[i].name); + n.push(r); + } + return await Promise.all(n), t; +} +function checkFeatureValue(e, t, n) { + if (!defined(n.values) || n.values.length === 0) + return !1; + const i = defined(t) ? t.values : []; + let r; + e < i.length && (r = i[e]); + let o = !1; + for (let s = 0; s < n.values.length; s++) + if (n.values[s] === r) { + o = !0; + break; + } + return o; +} +async function filterFeatures(e, t) { + const n = e._tile.content.batchTable; + if (defined(n) && n.featuresLength > 0) { + n.setAllShow(!0); + const i = await loadFilters(e); + if (i.length > 0) + for (let r = 0; r < n.featuresLength; r++) + for (let o = 0; o < i.length; o++) { + const s = i[o]; + if (!checkFeatureValue(r, e._fields[s.name], s)) { + n.setShow(r, !1); + break; + } + } + } + t.show = !0; +} +I3SNode.prototype._filterFeatures = function() { + var n, i; + const e = []; + for (let r = 0; r < this._children.length; r++) { + const o = this._children[r]._filterFeatures(); + e.push(o); + } + const t = (i = (n = this._tile) == null ? void 0 : n.content) == null ? void 0 : i._model; + if (defined(this._geometryData) && this._geometryData.length > 0 && defined(t) && t.ready) { + t.show = !1; + const r = filterFeatures(this, t); + e.push(r); + } + return Promise.all(e); +}; +Cesium3DTile.prototype._hookedRequestContent = Cesium3DTile.prototype.requestContent; +Cesium3DTile.prototype.requestContent = function() { + if (!this.tileset._isI3STileSet) + return this._hookedRequestContent(); + if (!this._isLoading) { + this._isLoading = !0; + const e = this; + return this._i3sNode._createContentURL().then((t) => { + if (!defined(t)) { + e._isLoading = !1; + return; + } + return e._contentResource = new Resource({ url: t }), e._hookedRequestContent(); + }).then((t) => { + const n = t == null ? void 0 : t._model; + return defined(e._i3sNode._geometryData) && e._i3sNode._geometryData.length > 0 && defined(n) && (n.show = !1, n.readyEvent.addEventListener(() => { + filterFeatures(e._i3sNode, n); + })), e._isLoading = !1, t; + }); + } +}; +function bilinearInterpolate(e, t, n, i, r, o) { + const s = n * (1 - e) + i * e, c = r * (1 - e) + o * e; + return s * (1 - t) + c * t; +} +function sampleMap(e, t, n, i) { + const r = e + t * n; + return i[r]; +} +function sampleGeoid(e, t, n) { + const i = n.nativeExtent; + let r = (e - i.west) / (i.east - i.west) * (n.width - 1), o = (t - i.south) / (i.north - i.south) * (n.height - 1); + const s = Math.floor(r); + let c = Math.floor(o); + r -= s, o -= c; + const l = s < n.width ? s + 1 : s; + let d = c < n.height ? c + 1 : c; + c = n.height - 1 - c, d = n.height - 1 - d; + const f = sampleMap(s, c, n.width, n.buffer), h = sampleMap(l, c, n.width, n.buffer), p = sampleMap(s, d, n.width, n.buffer), m = sampleMap(l, d, n.width, n.buffer); + let _ = bilinearInterpolate(r, o, f, h, p, m); + return _ = _ * n.scale + n.offset, _; +} +Object.defineProperties(Cesium3DTile.prototype, { + /** + * Gets the I3S Node for the tile. + * @memberof Cesium3DTile.prototype + * @type {string} + */ + i3sNode: { + get: function() { + return this._i3sNode; + } + } +}); +function I3SSymbology(e) { + this._layer = e, this._defaultSymbology = void 0, this._valueFields = [], this._uniqueValueHash = void 0, this._classBreaksHash = void 0, this._parseLayerSymbology(); +} +Object.defineProperties(I3SSymbology.prototype, { + /** + * Gets the default symbology data. + * @memberof I3SSymbology.prototype + * @type {object} + * @readonly + */ + defaultSymbology: { + get: function() { + return this._defaultSymbology; + } + } +}); +function convertColor(e, t) { + const n = []; + for (let i = 0; i < e.length; i++) { + const r = Color.byteToFloat(e[i]); + i < 3 ? n.push(srgbToLinear(r)) : n.push(r); + } + return n.length === 3 && (defined(t) ? n.push(1 - t / 100) : n.push(1)), n; +} +function parseSymbol(e, t) { + const n = { + edges: void 0, + material: void 0 + }; + if (defined(e) && defined(e.symbolLayers)) + for (let i = 0; i < e.symbolLayers.length; i++) { + const r = e.symbolLayers[i]; + if (r.type === "Fill") { + const o = r.edges, s = r.outline; + if (defined(o) ? (n.edges = {}, defined(o.color) && (n.edges.color = convertColor( + o.color, + o.transparency + ))) : defined(s) && (n.edges = {}, defined(s.color) && (n.edges.color = convertColor( + s.color, + s.transparency + ))), !t) { + const c = r.material; + defined(c) && (n.material = { + colorMixMode: c.colorMixMode + }, defined(c.color) && (n.material.color = convertColor( + c.color, + c.transparency + ))); + } + break; + } + } + return n; +} +function buildUniqueValueHash(e, t) { + if (defined(e.uniqueValueGroups)) { + const n = {}; + for (let i = 0; i < e.uniqueValueGroups.length; i++) { + const r = e.uniqueValueGroups[i].classes; + if (defined(r)) + for (let o = 0; o < r.length; o++) { + const s = parseSymbol( + r[o].symbol, + t + ), c = r[o].values; + for (let l = 0; l < c.length; l++) { + const d = c[l]; + let f = n; + for (let h = 0; h < d.length; h++) { + const p = d[h]; + h === d.length - 1 ? f[p] = s : (defined(f[p]) || (f[p] = {}), f = f[p]); + } + } + } + } + return n; + } + if (defined(e.uniqueValueInfos)) { + const n = {}; + for (let i = 0; i < e.uniqueValueInfos.length; i++) { + const r = e.uniqueValueInfos[i]; + n[r.value] = parseSymbol(r.symbol, t); + } + return n; + } +} +function buildClassBreaksHash(e, t) { + if (defined(e.classBreakInfos)) { + const n = [...e.classBreakInfos]; + n.sort(function(r, o) { + const s = defaultValue(r.classMaxValue, r.classMinValue), c = defaultValue(o.classMaxValue, o.classMinValue); + return s - c; + }); + const i = { + ranges: [], + symbols: [] + }; + defined(e.minValue) && (i.ranges.push(e.minValue), i.symbols.push(void 0)); + for (let r = 0; r < n.length; r++) { + const o = n[r]; + defined(o.classMinValue) && (i.ranges.length === 0 || o.classMinValue > i.ranges[i.ranges.length - 1]) && (i.ranges.push(o.classMinValue), i.symbols.push(void 0)), defined(o.classMaxValue) && (i.ranges.length === 0 || o.classMaxValue > i.ranges[i.ranges.length - 1]) && (i.ranges.push(o.classMaxValue), i.symbols.push(parseSymbol(o.symbol, t))); + } + return i.symbols.push(void 0), i; + } +} +I3SSymbology.prototype._parseLayerSymbology = function() { + const e = this._layer.data.drawingInfo; + if (defined(e) && defined(e.renderer)) { + const t = this._layer.data.cachedDrawingInfo, n = defined(t) && t.color === !0, i = e.renderer; + i.type === "simple" ? this._defaultSymbology = parseSymbol(i.symbol, n) : i.type === "uniqueValue" ? (this._defaultSymbology = parseSymbol( + i.defaultSymbol, + n + ), this._valueFields.push(i.field1), defined(i.field2) && this._valueFields.push(i.field2), defined(i.field3) && this._valueFields.push(i.field3), this._uniqueValueHash = buildUniqueValueHash(i, n)) : i.type === "classBreaks" && (this._defaultSymbology = parseSymbol( + i.defaultSymbol, + n + ), this._valueFields.push(i.field), this._classBreaksHash = buildClassBreaksHash(i, n)); + } +}; +function findHashForUniqueValues(e, t, n, i) { + const r = t[n]; + if (i < r.length) { + const o = r[i], s = e[o]; + return defined(s) && ++n < t.length ? findHashForUniqueValues(s, t, n, i) : s; + } +} +function bisect(e, t) { + let n = 0, i = e.length; + if (n < i) + do { + const r = n + i >>> 1; + e[r] < t ? n = r + 1 : i = r; + } while (n < i); + return n; +} +function findHashForClassBreaks(e, t, n) { + const i = t[n], r = bisect(e.ranges, i); + return e.symbols[r]; +} +I3SSymbology.prototype._getSymbology = async function(e) { + const t = { + default: this._defaultSymbology + }; + if (this._valueFields.length > 0) { + const n = []; + for (let o = 0; o < this._valueFields.length; o++) + n.push(e.loadField(this._valueFields[o])); + await Promise.all(n); + const i = []; + for (let o = 0; o < this._valueFields.length; o++) + i.push(e.fields[this._valueFields[o]].values); + let r; + if (defined(this._uniqueValueHash) ? r = (o) => findHashForUniqueValues( + this._uniqueValueHash, + i, + 0, + o + ) : defined(this._classBreaksHash) && (r = (o) => findHashForClassBreaks( + this._classBreaksHash, + i[0], + o + )), defined(r)) { + const o = i[0]; + for (let s = 0; s < o.length; s++) { + const c = r(s); + defined(c) && (t[s] = c); + } + } + } + return t; +}; +function I3SLayer(e, t, n) { + this._dataProvider = e, this._parent = n, !defined(t.href) && defined(t.id) && (t.href = `layers/${t.id}`); + const i = this._parent.resource.getUrlComponent(); + let r = ""; + i.match(/layers\/\d/) ? r = `${i}`.replace(/\/+$/, "") : r = `${i}`.replace(/\/?$/, "/").concat(`${t.href}`), this._version = t.store.version; + const o = this._version.split("."); + this._majorVersion = parseInt(o[0]), this._minorVersion = o.length > 1 ? parseInt(o[1]) : 0, this._resource = new Resource({ url: r }), this._resource.setQueryParameters( + this._dataProvider.resource.queryParameters + ), this._resource.appendForwardSlash(), this._data = t, this._rootNode = void 0, this._nodePages = {}, this._nodePageFetches = {}, this._extent = void 0, this._tileset = void 0, this._geometryDefinitions = void 0, this._filters = [], this._symbology = void 0, this._computeGeometryDefinitions(!0), this._computeExtent(); +} +Object.defineProperties(I3SLayer.prototype, { + /** + * Gets the resource for the layer. + * @memberof I3SLayer.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the root node of this layer. + * @memberof I3SLayer.prototype + * @type {I3SNode} + * @readonly + */ + rootNode: { + get: function() { + return this._rootNode; + } + }, + /** + * Gets the Cesium3DTileset for this layer. + * @memberof I3SLayer.prototype + * @type {Cesium3DTileset|undefined} + * @readonly + */ + tileset: { + get: function() { + return this._tileset; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SLayer.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + }, + /** + * The version string of the loaded I3S dataset + * @memberof I3SLayer.prototype + * @type {string} + * @readonly + */ + version: { + get: function() { + return this._version; + } + }, + /** + * The major version number of the loaded I3S dataset + * @memberof I3SLayer.prototype + * @type {number} + * @readonly + */ + majorVersion: { + get: function() { + return this._majorVersion; + } + }, + /** + * The minor version number of the loaded I3S dataset + * @memberof I3SLayer.prototype + * @type {number} + * @readonly + */ + minorVersion: { + get: function() { + return this._minorVersion; + } + }, + /** + * When <code>true</code>, when the loaded I3S version is 1.6 or older + * @memberof I3SLayer.prototype + * @type {boolean} + * @readonly + */ + legacyVersion16: { + get: function() { + if (defined(this.version)) + return this.majorVersion < 1 || this.majorVersion === 1 && this.minorVersion <= 6; + } + } +}); +I3SLayer.prototype.load = async function(e) { + if (this._data.spatialReference.wkid !== 4326) + throw new RuntimeError( + `Unsupported spatial reference: ${this._data.spatialReference.wkid}` + ); + if (this._dataProvider.applySymbology && (this._symbology = new I3SSymbology(this)), await this._dataProvider.loadGeoidData(), await this._loadRootNode(e), await this._create3DTileset(e), this._rootNode._tile = this._tileset._root, this._tileset._root._i3sNode = this._rootNode, this.legacyVersion16) + return this._rootNode._loadChildren(); +}; +I3SLayer.prototype._computeGeometryDefinitions = function(e) { + if (this._geometryDefinitions = [], defined(this._data.geometryDefinitions)) + for (let t = 0; t < this._data.geometryDefinitions.length; t++) { + const n = [], i = this._data.geometryDefinitions[t].geometryBuffers; + for (let r = 0; r < i.length; r++) { + const o = i[r], s = []; + let c = !1; + if (defined(o.compressedAttributes) && e) { + c = !0; + const l = o.compressedAttributes.attributes; + for (let d = 0; d < l.length; d++) + s.push(l[d]); + } else + for (const l in o) + l !== "offset" && s.push(l); + n.push({ + compressed: c, + attributes: s, + index: i.indexOf(o) + }); + } + n.sort(function(r, o) { + return r.compressed && !o.compressed ? -1 : !r.compressed && o.compressed ? 1 : r.attributes.length - o.attributes.length; + }), this._geometryDefinitions.push(n); + } +}; +I3SLayer.prototype._findBestGeometryBuffers = function(e, t) { + const n = this._geometryDefinitions[e]; + if (defined(n)) + for (let i = 0; i < n.length; ++i) { + const r = n[i]; + let o = !1; + const s = r.attributes; + for (let c = 0; c < t.length; c++) + if (!s.includes(t[c])) { + o = !0; + break; + } + if (!o) + return { + bufferIndex: r.index, + definition: n, + geometryBufferInfo: r + }; + } + return 0; +}; +I3SLayer.prototype._loadRootNode = function(e) { + if (defined(this._data.nodePages)) { + let t = 0; + defined(this._data.nodePages.rootIndex) && (t = this._data.nodePages.rootIndex), this._rootNode = new I3SNode(this, t, !0); + } else + this._rootNode = new I3SNode(this, this._data.store.rootNode, !0); + return this._rootNode.load(e); +}; +I3SLayer.prototype._getNodeInNodePages = function(e) { + const t = Math.floor(e / this._data.nodePages.nodesPerPage), n = e % this._data.nodePages.nodesPerPage; + return this._loadNodePage(t).then(function(i) { + return i.nodes[n]; + }); +}; +I3SLayer._fetchJson = function(e) { + return e.fetchJson(); +}; +I3SLayer.prototype._loadNodePage = function(e) { + const t = this; + if (!defined(this._nodePageFetches[e])) { + const n = this.resource.getDerivedResource({ + url: `nodepages/${e}/` + }), i = I3SLayer._fetchJson(n).then(function(r) { + return defined(r.error) && r.error.code !== 200 ? Promise.reject(r.error) : (t._nodePages[e] = r.nodes, r); + }); + this._nodePageFetches[e] = i; + } + return this._nodePageFetches[e]; +}; +I3SLayer.prototype._computeExtent = function() { + defined(this._data.fullExtent) ? this._extent = Rectangle.fromDegrees( + this._data.fullExtent.xmin, + this._data.fullExtent.ymin, + this._data.fullExtent.xmax, + this._data.fullExtent.ymax + ) : defined(this._data.store.extent) && (this._extent = Rectangle.fromDegrees( + this._data.store.extent[0], + this._data.store.extent[1], + this._data.store.extent[2], + this._data.store.extent[3] + )); +}; +I3SLayer.prototype._create3DTileset = async function(e) { + var o, s, c; + const t = { + asset: { + version: "1.0" + }, + geometricError: Number.MAX_VALUE, + root: this._rootNode._create3DTileDefinition() + }, n = new Blob([JSON.stringify(t)], { + type: "application/json" + }), i = URL.createObjectURL(n), r = (c = (s = (o = this._symbology) == null ? void 0 : o.defaultSymbology) == null ? void 0 : s.edges) == null ? void 0 : c.color; + defined(r) && !defined(e == null ? void 0 : e.outlineColor) && (e = defined(e) ? clone$1(e) : {}, e.outlineColor = Color.fromCartesian4( + Cartesian4.fromArray(r) + )), this._tileset = await Cesium3DTileset.fromUrl( + i, + e + ), this._tileset.show = this._parent.show, this._tileset._isI3STileSet = !0, this._tileset.tileUnload.addEventListener(function(l) { + l._i3sNode._clearGeometryData(), URL.revokeObjectURL(l._contentResource._url), l._contentResource = l._i3sNode.resource; + }), this._tileset.tileVisible.addEventListener(function(l) { + defined(l._i3sNode) && l._i3sNode._loadChildren(); + }); +}; +I3SLayer.prototype._updateVisibility = function() { + defined(this._tileset) && (this._tileset.show = this._parent.show); +}; +I3SLayer.prototype.filterByAttributes = function(e) { + this._filters = defined(e) ? clone$1(e, !0) : []; + const t = this._rootNode; + return defined(t) ? t._filterFeatures() : Promise.resolve(); +}; +function I3SStatistics(e, t) { + this._dataProvider = e, this._resource = new Resource({ url: t }), this._resource.setQueryParameters(e.resource.queryParameters), this._resource.appendForwardSlash(); +} +Object.defineProperties(I3SStatistics.prototype, { + /** + * Gets the resource for the statistics + * @memberof I3SStatistics.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SStatistics.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + }, + /** + * Gets the collection of attribute names. + * @memberof I3SStatistics.prototype + * @type {string[]} + * @readonly + */ + names: { + get: function() { + const e = [], t = this._data.summary; + if (defined(t)) + for (let n = 0; n < t.length; ++n) + e.push(t[n].fieldName); + return e; + } + } +}); +I3SStatistics.prototype.load = async function() { + return this._data = await I3SDataProvider.loadJson(this._resource), this._data; +}; +I3SStatistics.prototype._getValues = function(e) { + const t = this._data.summary; + if (defined(t)) + for (let n = 0; n < t.length; ++n) { + const i = t[n]; + if (i.fieldName === e) + return defined(i.mostFrequentValues) ? [...i.mostFrequentValues] : []; + } +}; +function I3SSublayer(e, t, n) { + this._dataProvider = e, this._parent = t, this._data = n, this._name = n.name, this._modelName = n.modelName, this._visibility = defaultValue(n.visibility, !0), this._resource = void 0, this._sublayers = [], this._i3sLayers = []; +} +Object.defineProperties(I3SSublayer.prototype, { + /** + * Gets the resource for the sublayer + * @memberof I3SSublayer.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SSublayer.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + }, + /** + * Gets the name for the sublayer. + * @memberof I3SSublayer.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * Gets the model name for the sublayer. + * @memberof I3SSublayer.prototype + * @type {string} + * @readonly + */ + modelName: { + get: function() { + return this._modelName; + } + }, + /** + * Gets the collection of child sublayers. + * @memberof I3SSublayer.prototype + * @type {I3SSublayer[]} + * @readonly + */ + sublayers: { + get: function() { + return this._sublayers; + } + }, + /** + * Gets or sets the sublayer visibility. + * @memberof I3SSublayer.prototype + * @type {boolean} + */ + visibility: { + get: function() { + return this._visibility; + }, + set: function(e) { + if (this._visibility !== e) { + this._visibility = e; + for (let t = 0; t < this._i3sLayers.length; t++) + this._i3sLayers[t]._updateVisibility(); + } + } + }, + /** + * Determines if the sublayer will be shown. + * @memberof I3SSublayer.prototype + * @type {boolean} + * @readonly + */ + show: { + get: function() { + return this._visibility && this._parent.show; + } + } +}); +I3SSublayer._fromData = async function(e, t, n, i) { + const r = new I3SSublayer(e, i, n); + if (r._data.layerType === "group") { + const o = r._data.sublayers; + if (defined(o)) { + const s = []; + for (let l = 0; l < o.length; l++) { + const d = I3SSublayer._fromData( + e, + t, + o[l], + r + ); + s.push(d); + } + const c = await Promise.all(s); + for (let l = 0; l < c.length; l++) { + const d = c[l]; + r._sublayers.push(d), r._i3sLayers.push(...d._i3sLayers); + } + } + } else if (r._data.layerType === "3DObject") { + const o = t.concat( + `/sublayers/${r._data.id}` + ), s = new Resource({ url: o }); + s.setQueryParameters(e.resource.queryParameters), s.appendForwardSlash(), r._resource = s; + const c = await I3SDataProvider.loadJson(r._resource), l = new I3SLayer(e, c, r); + r._i3sLayers.push(l); + } else + console.log( + `${r._data.layerType} layer ${r._data.name} is skipped as not supported.` + ); + return r; +}; +var LercDecode = { exports: {} }; +(function(e) { + /* Copyright 2015-2018 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */ + (function() { + var t = function() { + var o = {}; + o.defaultNoDataValue = -34027999387901484e22, o.decode = function(h, p) { + p = p || {}; + var m = p.encodedMaskData || p.encodedMaskData === null, _ = d(h, p.inputOffset || 0, m), y = p.noDataValue !== null ? p.noDataValue : o.defaultNoDataValue, C = s( + _, + p.pixelType || Float32Array, + p.encodedMaskData, + y, + p.returnMask + ), T = { + width: _.width, + height: _.height, + pixelData: C.resultPixels, + minValue: C.minValue, + maxValue: _.pixels.maxValue, + noDataValue: y + }; + return C.resultMask && (T.maskData = C.resultMask), p.returnEncodedMask && _.mask && (T.encodedMaskData = _.mask.bitset ? _.mask.bitset : null), p.returnFileInfo && (T.fileInfo = c(_), p.computeUsedBitDepths && (T.fileInfo.bitDepths = l(_))), T; + }; + var s = function(h, p, m, _, y) { + var C = 0, T = h.pixels.numBlocksX, x = h.pixels.numBlocksY, b = Math.floor(h.width / T), S = Math.floor(h.height / x), E = 2 * h.maxZError, A = Number.MAX_VALUE, D; + m = m || (h.mask ? h.mask.bitset : null); + var P, I; + P = new p(h.width * h.height), y && m && (I = new Uint8Array(h.width * h.height)); + for (var M = new Float32Array(b * S), R, L, g = 0; g <= x; g++) { + var w = g !== x ? S : h.height % x; + if (w !== 0) + for (var O = 0; O <= T; O++) { + var N = O !== T ? b : h.width % T; + if (N !== 0) { + var F = g * h.width * S + O * b, B = h.width - N, V = h.pixels.blocks[C], U, k, $; + V.encoding < 2 ? (V.encoding === 0 ? U = V.rawData : (f(V.stuffedData, V.bitsPerPixel, V.numValidPixels, V.offset, E, M, h.pixels.maxValue), U = M), k = 0) : V.encoding === 2 ? $ = 0 : $ = V.offset; + var G; + if (m) + for (L = 0; L < w; L++) { + for (F & 7 && (G = m[F >> 3], G <<= F & 7), R = 0; R < N; R++) + F & 7 || (G = m[F >> 3]), G & 128 ? (I && (I[F] = 1), D = V.encoding < 2 ? U[k++] : $, A = A > D ? D : A, P[F++] = D) : (I && (I[F] = 0), P[F++] = _), G <<= 1; + F += B; + } + else if (V.encoding < 2) + for (L = 0; L < w; L++) { + for (R = 0; R < N; R++) + D = U[k++], A = A > D ? D : A, P[F++] = D; + F += B; + } + else + for (A = A > $ ? $ : A, L = 0; L < w; L++) { + for (R = 0; R < N; R++) + P[F++] = $; + F += B; + } + if (V.encoding === 1 && k !== V.numValidPixels) + throw "Block and Mask do not match"; + C++; + } + } + } + return { + resultPixels: P, + resultMask: I, + minValue: A + }; + }, c = function(h) { + return { + fileIdentifierString: h.fileIdentifierString, + fileVersion: h.fileVersion, + imageType: h.imageType, + height: h.height, + width: h.width, + maxZError: h.maxZError, + eofOffset: h.eofOffset, + mask: h.mask ? { + numBlocksX: h.mask.numBlocksX, + numBlocksY: h.mask.numBlocksY, + numBytes: h.mask.numBytes, + maxValue: h.mask.maxValue + } : null, + pixels: { + numBlocksX: h.pixels.numBlocksX, + numBlocksY: h.pixels.numBlocksY, + numBytes: h.pixels.numBytes, + maxValue: h.pixels.maxValue, + noDataValue: h.noDataValue + } + }; + }, l = function(h) { + for (var p = h.pixels.numBlocksX * h.pixels.numBlocksY, m = {}, _ = 0; _ < p; _++) { + var y = h.pixels.blocks[_]; + y.encoding === 0 ? m.float32 = !0 : y.encoding === 1 ? m[y.bitsPerPixel] = !0 : m[0] = !0; + } + return Object.keys(m); + }, d = function(h, p, m) { + var _ = {}, y = new Uint8Array(h, p, 10); + if (_.fileIdentifierString = String.fromCharCode.apply(null, y), _.fileIdentifierString.trim() !== "CntZImage") + throw "Unexpected file identifier string: " + _.fileIdentifierString; + p += 10; + var C = new DataView(h, p, 24); + if (_.fileVersion = C.getInt32(0, !0), _.imageType = C.getInt32(4, !0), _.height = C.getUint32(8, !0), _.width = C.getUint32(12, !0), _.maxZError = C.getFloat64(16, !0), p += 24, !m) + if (C = new DataView(h, p, 16), _.mask = {}, _.mask.numBlocksY = C.getUint32(0, !0), _.mask.numBlocksX = C.getUint32(4, !0), _.mask.numBytes = C.getUint32(8, !0), _.mask.maxValue = C.getFloat32(12, !0), p += 16, _.mask.numBytes > 0) { + var T = new Uint8Array(Math.ceil(_.width * _.height / 8)); + C = new DataView(h, p, _.mask.numBytes); + var x = C.getInt16(0, !0), b = 2, S = 0; + do { + if (x > 0) + for (; x--; ) + T[S++] = C.getUint8(b++); + else { + var E = C.getUint8(b++); + for (x = -x; x--; ) + T[S++] = E; + } + x = C.getInt16(b, !0), b += 2; + } while (b < _.mask.numBytes); + if (x !== -32768 || S < T.length) + throw "Unexpected end of mask RLE encoding"; + _.mask.bitset = T, p += _.mask.numBytes; + } else _.mask.numBytes | _.mask.numBlocksY | _.mask.maxValue || (_.mask.bitset = new Uint8Array(Math.ceil(_.width * _.height / 8))); + C = new DataView(h, p, 16), _.pixels = {}, _.pixels.numBlocksY = C.getUint32(0, !0), _.pixels.numBlocksX = C.getUint32(4, !0), _.pixels.numBytes = C.getUint32(8, !0), _.pixels.maxValue = C.getFloat32(12, !0), p += 16; + var A = _.pixels.numBlocksX, D = _.pixels.numBlocksY, P = A + (_.width % A > 0 ? 1 : 0), I = D + (_.height % D > 0 ? 1 : 0); + _.pixels.blocks = new Array(P * I); + for (var M = 0, R = 0; R < I; R++) + for (var L = 0; L < P; L++) { + var g = 0, w = h.byteLength - p; + C = new DataView(h, p, Math.min(10, w)); + var O = {}; + _.pixels.blocks[M++] = O; + var N = C.getUint8(0); + if (g++, O.encoding = N & 63, O.encoding > 3) + throw "Invalid block encoding (" + O.encoding + ")"; + if (O.encoding === 2) { + p++; + continue; + } + if (N !== 0 && N !== 2) { + if (N >>= 6, O.offsetType = N, N === 2) + O.offset = C.getInt8(1), g++; + else if (N === 1) + O.offset = C.getInt16(1, !0), g += 2; + else if (N === 0) + O.offset = C.getFloat32(1, !0), g += 4; + else + throw "Invalid block offset type"; + if (O.encoding === 1) + if (N = C.getUint8(g), g++, O.bitsPerPixel = N & 63, N >>= 6, O.numValidPixelsType = N, N === 2) + O.numValidPixels = C.getUint8(g), g++; + else if (N === 1) + O.numValidPixels = C.getUint16(g, !0), g += 2; + else if (N === 0) + O.numValidPixels = C.getUint32(g, !0), g += 4; + else + throw "Invalid valid pixel count type"; + } + if (p += g, O.encoding !== 3) { + var F, B; + if (O.encoding === 0) { + var V = (_.pixels.numBytes - 1) / 4; + if (V !== Math.floor(V)) + throw "uncompressed block has invalid length"; + F = new ArrayBuffer(V * 4), B = new Uint8Array(F), B.set(new Uint8Array(h, p, V * 4)); + var U = new Float32Array(F); + O.rawData = U, p += V * 4; + } else if (O.encoding === 1) { + var k = Math.ceil(O.numValidPixels * O.bitsPerPixel / 8), $ = Math.ceil(k / 4); + F = new ArrayBuffer($ * 4), B = new Uint8Array(F), B.set(new Uint8Array(h, p, k)), O.stuffedData = new Uint32Array(F), p += k; + } + } + } + return _.eofOffset = p, _; + }, f = function(h, p, m, _, y, C, T) { + var x = (1 << p) - 1, b = 0, S, E = 0, A, D, P = Math.ceil((T - _) / y), I = h.length * 4 - Math.ceil(p * m / 8); + for (h[h.length - 1] <<= 8 * I, S = 0; S < m; S++) { + if (E === 0 && (D = h[b++], E = 32), E >= p) + A = D >>> E - p & x, E -= p; + else { + var M = p - E; + A = (D & x) << M & x, D = h[b++], E = 32 - M, A += D >>> E; + } + C[S] = A < P ? _ + A * y : T; + } + return C; + }; + return o; + }(), n = /* @__PURE__ */ function() { + var o = { + //methods ending with 2 are for the new byte order used by Lerc2.3 and above. + //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons. + unstuff: function(d, f, h, p, m, _, y, C) { + var T = (1 << h) - 1, x = 0, b, S = 0, E, A, D, P, I = d.length * 4 - Math.ceil(h * p / 8); + if (d[d.length - 1] <<= 8 * I, m) + for (b = 0; b < p; b++) + S === 0 && (A = d[x++], S = 32), S >= h ? (E = A >>> S - h & T, S -= h) : (D = h - S, E = (A & T) << D & T, A = d[x++], S = 32 - D, E += A >>> S), f[b] = m[E]; + else + for (P = Math.ceil((C - _) / y), b = 0; b < p; b++) + S === 0 && (A = d[x++], S = 32), S >= h ? (E = A >>> S - h & T, S -= h) : (D = h - S, E = (A & T) << D & T, A = d[x++], S = 32 - D, E += A >>> S), f[b] = E < P ? _ + E * y : C; + }, + unstuffLUT: function(d, f, h, p, m, _) { + var y = (1 << f) - 1, C = 0, T = 0, x = 0, b = 0, S = 0, E, A = [], D = d.length * 4 - Math.ceil(f * h / 8); + d[d.length - 1] <<= 8 * D; + var P = Math.ceil((_ - p) / m); + for (T = 0; T < h; T++) + b === 0 && (E = d[C++], b = 32), b >= f ? (S = E >>> b - f & y, b -= f) : (x = f - b, S = (E & y) << x & y, E = d[C++], b = 32 - x, S += E >>> b), A[T] = S < P ? p + S * m : _; + return A.unshift(p), A; + }, + unstuff2: function(d, f, h, p, m, _, y, C) { + var T = (1 << h) - 1, x = 0, b, S = 0, E = 0, A, D, P; + if (m) + for (b = 0; b < p; b++) + S === 0 && (D = d[x++], S = 32, E = 0), S >= h ? (A = D >>> E & T, S -= h, E += h) : (P = h - S, A = D >>> E & T, D = d[x++], S = 32 - P, A |= (D & (1 << P) - 1) << h - P, E = P), f[b] = m[A]; + else { + var I = Math.ceil((C - _) / y); + for (b = 0; b < p; b++) + S === 0 && (D = d[x++], S = 32, E = 0), S >= h ? (A = D >>> E & T, S -= h, E += h) : (P = h - S, A = D >>> E & T, D = d[x++], S = 32 - P, A |= (D & (1 << P) - 1) << h - P, E = P), f[b] = A < I ? _ + A * y : C; + } + return f; + }, + unstuffLUT2: function(d, f, h, p, m, _) { + var y = (1 << f) - 1, C = 0, T = 0, x = 0, b = 0, S = 0, E = 0, A, D = [], P = Math.ceil((_ - p) / m); + for (T = 0; T < h; T++) + b === 0 && (A = d[C++], b = 32, E = 0), b >= f ? (S = A >>> E & y, b -= f, E += f) : (x = f - b, S = A >>> E & y, A = d[C++], b = 32 - x, S |= (A & (1 << x) - 1) << f - x, E = x), D[T] = S < P ? p + S * m : _; + return D.unshift(p), D; + }, + originalUnstuff: function(d, f, h, p) { + var m = (1 << h) - 1, _ = 0, y, C = 0, T, x, b, S = d.length * 4 - Math.ceil(h * p / 8); + for (d[d.length - 1] <<= 8 * S, y = 0; y < p; y++) + C === 0 && (x = d[_++], C = 32), C >= h ? (T = x >>> C - h & m, C -= h) : (b = h - C, T = (x & m) << b & m, x = d[_++], C = 32 - b, T += x >>> C), f[y] = T; + return f; + }, + originalUnstuff2: function(d, f, h, p) { + var m = (1 << h) - 1, _ = 0, y, C = 0, T = 0, x, b, S; + for (y = 0; y < p; y++) + C === 0 && (b = d[_++], C = 32, T = 0), C >= h ? (x = b >>> T & m, C -= h, T += h) : (S = h - C, x = b >>> T & m, b = d[_++], C = 32 - S, x |= (b & (1 << S) - 1) << h - S, T = S), f[y] = x; + return f; + } + }, s = { + HUFFMAN_LUT_BITS_MAX: 12, + //use 2^12 lut, treat it like constant + computeChecksumFletcher32: function(d) { + for (var f = 65535, h = 65535, p = d.length, m = Math.floor(p / 2), _ = 0; m; ) { + var y = m >= 359 ? 359 : m; + m -= y; + do + f += d[_++] << 8, h += f += d[_++]; + while (--y); + f = (f & 65535) + (f >>> 16), h = (h & 65535) + (h >>> 16); + } + return p & 1 && (h += f += d[_] << 8), f = (f & 65535) + (f >>> 16), h = (h & 65535) + (h >>> 16), (h << 16 | f) >>> 0; + }, + readHeaderInfo: function(d, f) { + var h = f.ptr, p = new Uint8Array(d, h, 6), m = {}; + if (m.fileIdentifierString = String.fromCharCode.apply(null, p), m.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) + throw "Unexpected file identifier string (expect Lerc2 ): " + m.fileIdentifierString; + h += 6; + var _ = new DataView(d, h, 8), y = _.getInt32(0, !0); + m.fileVersion = y, h += 4, y >= 3 && (m.checksum = _.getUint32(4, !0), h += 4), _ = new DataView(d, h, 12), m.height = _.getUint32(0, !0), m.width = _.getUint32(4, !0), h += 8, y >= 4 ? (m.numDims = _.getUint32(8, !0), h += 4) : m.numDims = 1, _ = new DataView(d, h, 40), m.numValidPixel = _.getUint32(0, !0), m.microBlockSize = _.getInt32(4, !0), m.blobSize = _.getInt32(8, !0), m.imageType = _.getInt32(12, !0), m.maxZError = _.getFloat64(16, !0), m.zMin = _.getFloat64(24, !0), m.zMax = _.getFloat64(32, !0), h += 40, f.headerInfo = m, f.ptr = h; + var C, T; + if (y >= 3 && (T = y >= 4 ? 52 : 48, C = this.computeChecksumFletcher32(new Uint8Array(d, h - T, m.blobSize - 14)), C !== m.checksum)) + throw "Checksum failed."; + return !0; + }, + checkMinMaxRanges: function(d, f) { + var h = f.headerInfo, p = this.getDataTypeArray(h.imageType), m = h.numDims * this.getDataTypeSize(h.imageType), _ = this.readSubArray(d, f.ptr, p, m), y = this.readSubArray(d, f.ptr + m, p, m); + f.ptr += 2 * m; + var C, T = !0; + for (C = 0; C < h.numDims; C++) + if (_[C] !== y[C]) { + T = !1; + break; + } + return h.minValues = _, h.maxValues = y, T; + }, + readSubArray: function(d, f, h, p) { + var m; + if (h === Uint8Array) + m = new Uint8Array(d, f, p); + else { + var _ = new ArrayBuffer(p), y = new Uint8Array(_); + y.set(new Uint8Array(d, f, p)), m = new h(_); + } + return m; + }, + readMask: function(d, f) { + var h = f.ptr, p = f.headerInfo, m = p.width * p.height, _ = p.numValidPixel, y = new DataView(d, h, 4), C = {}; + if (C.numBytes = y.getUint32(0, !0), h += 4, (_ === 0 || m === _) && C.numBytes !== 0) + throw "invalid mask"; + var T, x; + if (_ === 0) + T = new Uint8Array(Math.ceil(m / 8)), C.bitset = T, x = new Uint8Array(m), f.pixels.resultMask = x, h += C.numBytes; + else if (C.numBytes > 0) { + T = new Uint8Array(Math.ceil(m / 8)), y = new DataView(d, h, C.numBytes); + var b = y.getInt16(0, !0), S = 2, E = 0, A = 0; + do { + if (b > 0) + for (; b--; ) + T[E++] = y.getUint8(S++); + else + for (A = y.getUint8(S++), b = -b; b--; ) + T[E++] = A; + b = y.getInt16(S, !0), S += 2; + } while (S < C.numBytes); + if (b !== -32768 || E < T.length) + throw "Unexpected end of mask RLE encoding"; + x = new Uint8Array(m); + var D = 0, P = 0; + for (P = 0; P < m; P++) + P & 7 ? (D = T[P >> 3], D <<= P & 7) : D = T[P >> 3], D & 128 && (x[P] = 1); + f.pixels.resultMask = x, C.bitset = T, h += C.numBytes; + } + return f.ptr = h, f.mask = C, !0; + }, + readDataOneSweep: function(d, f, h) { + var p = f.ptr, m = f.headerInfo, _ = m.numDims, y = m.width * m.height, C = m.imageType, T = m.numValidPixel * s.getDataTypeSize(C) * _, x, b = f.pixels.resultMask; + if (h === Uint8Array) + x = new Uint8Array(d, p, T); + else { + var S = new ArrayBuffer(T), E = new Uint8Array(S); + E.set(new Uint8Array(d, p, T)), x = new h(S); + } + if (x.length === y * _) + f.pixels.resultPixels = x; + else { + f.pixels.resultPixels = new h(y * _); + var A = 0, D = 0, P = 0, I = 0; + if (_ > 1) + for (P = 0; P < _; P++) + for (I = P * y, D = 0; D < y; D++) + b[D] && (f.pixels.resultPixels[I + D] = x[A++]); + else + for (D = 0; D < y; D++) + b[D] && (f.pixels.resultPixels[D] = x[A++]); + } + return p += T, f.ptr = p, !0; + }, + readHuffmanTree: function(d, f) { + var h = this.HUFFMAN_LUT_BITS_MAX, p = new DataView(d, f.ptr, 16); + f.ptr += 16; + var m = p.getInt32(0, !0); + if (m < 2) + throw "unsupported Huffman version"; + var _ = p.getInt32(4, !0), y = p.getInt32(8, !0), C = p.getInt32(12, !0); + if (y >= C) + return !1; + var T = new Uint32Array(C - y); + s.decodeBits(d, f, T); + var x = [], b, S, E, A; + for (b = y; b < C; b++) + S = b - (b < _ ? 0 : _), x[S] = { first: T[b - y], second: null }; + var D = d.byteLength - f.ptr, P = Math.ceil(D / 4), I = new ArrayBuffer(P * 4), M = new Uint8Array(I); + M.set(new Uint8Array(d, f.ptr, D)); + var R = new Uint32Array(I), L = 0, g, w = 0; + for (g = R[0], b = y; b < C; b++) + S = b - (b < _ ? 0 : _), A = x[S].first, A > 0 && (x[S].second = g << L >>> 32 - A, 32 - L >= A ? (L += A, L === 32 && (L = 0, w++, g = R[w])) : (L += A - 32, w++, g = R[w], x[S].second |= g >>> 32 - L)); + var O = 0, N = 0, F = new c(); + for (b = 0; b < x.length; b++) + x[b] !== void 0 && (O = Math.max(O, x[b].first)); + O >= h ? N = h : N = O, O >= 30 && console.log("WARning, large NUM LUT BITS IS " + O); + var B = [], V, U, k, $, G, q; + for (b = y; b < C; b++) + if (S = b - (b < _ ? 0 : _), A = x[S].first, A > 0) + if (V = [A, S], A <= N) + for (U = x[S].second << N - A, k = 1 << N - A, E = 0; E < k; E++) + B[U | E] = V; + else + for (U = x[S].second, q = F, $ = A - 1; $ >= 0; $--) + G = U >>> $ & 1, G ? (q.right || (q.right = new c()), q = q.right) : (q.left || (q.left = new c()), q = q.left), $ === 0 && !q.val && (q.val = V[1]); + return { + decodeLut: B, + numBitsLUTQick: N, + numBitsLUT: O, + tree: F, + stuffedData: R, + srcPtr: w, + bitPos: L + }; + }, + readHuffman: function(d, f, h) { + var p = f.headerInfo, m = p.numDims, _ = f.headerInfo.height, y = f.headerInfo.width, C = y * _, T = this.readHuffmanTree(d, f), x = T.decodeLut, b = T.tree, S = T.stuffedData, E = T.srcPtr, A = T.bitPos, D = T.numBitsLUTQick, P = T.numBitsLUT, I = f.headerInfo.imageType === 0 ? 128 : 0, M, R, L, g = f.pixels.resultMask, w, O, N, F, B, V, U, k = 0; + A > 0 && (E++, A = 0); + var $ = S[E], G = f.encodeMode === 1, q = new h(C * m), z = q, H; + for (H = 0; H < p.numDims; H++) { + if (m > 1 && (z = new h(q.buffer, C * H, C), k = 0), f.headerInfo.numValidPixel === y * _) + for (V = 0, F = 0; F < _; F++) + for (B = 0; B < y; B++, V++) { + if (R = 0, w = $ << A >>> 32 - D, O = w, 32 - A < D && (w |= S[E + 1] >>> 64 - A - D, O = w), x[O]) + R = x[O][1], A += x[O][0]; + else + for (w = $ << A >>> 32 - P, O = w, 32 - A < P && (w |= S[E + 1] >>> 64 - A - P, O = w), M = b, U = 0; U < P; U++) + if (N = w >>> P - U - 1 & 1, M = N ? M.right : M.left, !(M.left || M.right)) { + R = M.val, A = A + U + 1; + break; + } + A >= 32 && (A -= 32, E++, $ = S[E]), L = R - I, G ? (B > 0 ? L += k : F > 0 ? L += z[V - y] : L += k, L &= 255, z[V] = L, k = L) : z[V] = L; + } + else + for (V = 0, F = 0; F < _; F++) + for (B = 0; B < y; B++, V++) + if (g[V]) { + if (R = 0, w = $ << A >>> 32 - D, O = w, 32 - A < D && (w |= S[E + 1] >>> 64 - A - D, O = w), x[O]) + R = x[O][1], A += x[O][0]; + else + for (w = $ << A >>> 32 - P, O = w, 32 - A < P && (w |= S[E + 1] >>> 64 - A - P, O = w), M = b, U = 0; U < P; U++) + if (N = w >>> P - U - 1 & 1, M = N ? M.right : M.left, !(M.left || M.right)) { + R = M.val, A = A + U + 1; + break; + } + A >= 32 && (A -= 32, E++, $ = S[E]), L = R - I, G ? (B > 0 && g[V - 1] ? L += k : F > 0 && g[V - y] ? L += z[V - y] : L += k, L &= 255, z[V] = L, k = L) : z[V] = L; + } + f.ptr = f.ptr + (E + 1) * 4 + (A > 0 ? 4 : 0); + } + f.pixels.resultPixels = q; + }, + decodeBits: function(d, f, h, p, m) { + { + var _ = f.headerInfo, y = _.fileVersion, C = 0, T = new DataView(d, f.ptr, 5), x = T.getUint8(0); + C++; + var b = x >> 6, S = b === 0 ? 4 : 3 - b, E = (x & 32) > 0, A = x & 31, D = 0; + if (S === 1) + D = T.getUint8(C), C++; + else if (S === 2) + D = T.getUint16(C, !0), C += 2; + else if (S === 4) + D = T.getUint32(C, !0), C += 4; + else + throw "Invalid valid pixel count type"; + var P = 2 * _.maxZError, I, M, R, L, g, w, O, N, F, B = _.numDims > 1 ? _.maxValues[m] : _.zMax; + if (E) { + for (f.counter.lut++, N = T.getUint8(C), C++, L = Math.ceil((N - 1) * A / 8), g = Math.ceil(L / 4), M = new ArrayBuffer(g * 4), R = new Uint8Array(M), f.ptr += C, R.set(new Uint8Array(d, f.ptr, L)), O = new Uint32Array(M), f.ptr += L, F = 0; N - 1 >>> F; ) + F++; + L = Math.ceil(D * F / 8), g = Math.ceil(L / 4), M = new ArrayBuffer(g * 4), R = new Uint8Array(M), R.set(new Uint8Array(d, f.ptr, L)), I = new Uint32Array(M), f.ptr += L, y >= 3 ? w = o.unstuffLUT2(O, A, N - 1, p, P, B) : w = o.unstuffLUT(O, A, N - 1, p, P, B), y >= 3 ? o.unstuff2(I, h, F, D, w) : o.unstuff(I, h, F, D, w); + } else + f.counter.bitstuffer++, F = A, f.ptr += C, F > 0 && (L = Math.ceil(D * F / 8), g = Math.ceil(L / 4), M = new ArrayBuffer(g * 4), R = new Uint8Array(M), R.set(new Uint8Array(d, f.ptr, L)), I = new Uint32Array(M), f.ptr += L, y >= 3 ? p == null ? o.originalUnstuff2(I, h, F, D) : o.unstuff2(I, h, F, D, !1, p, P, B) : p == null ? o.originalUnstuff(I, h, F, D) : o.unstuff(I, h, F, D, !1, p, P, B)); + } + }, + readTiles: function(d, f, h) { + var p = f.headerInfo, m = p.width, _ = p.height, y = p.microBlockSize, C = p.imageType, T = s.getDataTypeSize(C), x = Math.ceil(m / y), b = Math.ceil(_ / y); + f.pixels.numBlocksY = b, f.pixels.numBlocksX = x, f.pixels.ptr = 0; + var S = 0, E = 0, A = 0, D = 0, P = 0, I = 0, M = 0, R = 0, L = 0, g = 0, w = 0, O = 0, N = 0, F = 0, B = 0, V = 0, U, k, $, G, q, z, H = new h(y * y), Q = _ % y || y, ne = m % y || y, K, Z, ee = p.numDims, oe, X = f.pixels.resultMask, fe = f.pixels.resultPixels; + for (A = 0; A < b; A++) + for (P = A !== b - 1 ? y : Q, D = 0; D < x; D++) + for (I = D !== x - 1 ? y : ne, w = A * m * y + D * y, O = m - I, oe = 0; oe < ee; oe++) { + if (ee > 1 && (fe = new h(f.pixels.resultPixels.buffer, m * _ * oe * T, m * _)), M = d.byteLength - f.ptr, U = new DataView(d, f.ptr, Math.min(10, M)), k = {}, V = 0, R = U.getUint8(0), V++, L = R >> 6 & 255, g = R >> 2 & 15, g !== (D * y >> 3 & 15)) + throw "integrity issue"; + if (z = R & 3, z > 3) + throw f.ptr += V, "Invalid block encoding (" + z + ")"; + if (z === 2) { + f.counter.constant++, f.ptr += V; + continue; + } else if (z === 0) { + if (f.counter.uncompressed++, f.ptr += V, N = P * I * T, F = d.byteLength - f.ptr, N = N < F ? N : F, $ = new ArrayBuffer(N % T === 0 ? N : N + T - N % T), G = new Uint8Array($), G.set(new Uint8Array(d, f.ptr, N)), q = new h($), B = 0, X) + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + X[w] && (fe[w] = q[B++]), w++; + w += O; + } + else + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + fe[w++] = q[B++]; + w += O; + } + f.ptr += B * T; + } else if (K = s.getDataTypeUsed(C, L), Z = s.getOnePixel(k, V, K, U), V += s.getDataTypeSize(K), z === 3) + if (f.ptr += V, f.counter.constantoffset++, X) + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + X[w] && (fe[w] = Z), w++; + w += O; + } + else + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + fe[w++] = Z; + w += O; + } + else if (f.ptr += V, s.decodeBits(d, f, H, Z, oe), V = 0, X) + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + X[w] && (fe[w] = H[V++]), w++; + w += O; + } + else + for (S = 0; S < P; S++) { + for (E = 0; E < I; E++) + fe[w++] = H[V++]; + w += O; + } + } + }, + /***************** + * private methods (helper methods) + *****************/ + formatFileInfo: function(d) { + return { + fileIdentifierString: d.headerInfo.fileIdentifierString, + fileVersion: d.headerInfo.fileVersion, + imageType: d.headerInfo.imageType, + height: d.headerInfo.height, + width: d.headerInfo.width, + numValidPixel: d.headerInfo.numValidPixel, + microBlockSize: d.headerInfo.microBlockSize, + blobSize: d.headerInfo.blobSize, + maxZError: d.headerInfo.maxZError, + pixelType: s.getPixelType(d.headerInfo.imageType), + eofOffset: d.eofOffset, + mask: d.mask ? { + numBytes: d.mask.numBytes + } : null, + pixels: { + numBlocksX: d.pixels.numBlocksX, + numBlocksY: d.pixels.numBlocksY, + //"numBytes": data.pixels.numBytes, + maxValue: d.headerInfo.zMax, + minValue: d.headerInfo.zMin, + noDataValue: d.noDataValue + } + }; + }, + constructConstantSurface: function(d) { + var f = d.headerInfo.zMax, h = d.headerInfo.numDims, p = d.headerInfo.height * d.headerInfo.width, m = p * h, _ = 0, y = 0, C = 0, T = d.pixels.resultMask; + if (T) + if (h > 1) + for (_ = 0; _ < h; _++) + for (C = _ * p, y = 0; y < p; y++) + T[y] && (d.pixels.resultPixels[C + y] = f); + else + for (y = 0; y < p; y++) + T[y] && (d.pixels.resultPixels[y] = f); + else if (d.pixels.resultPixels.fill) + d.pixels.resultPixels.fill(f); + else + for (y = 0; y < m; y++) + d.pixels.resultPixels[y] = f; + }, + getDataTypeArray: function(d) { + var f; + switch (d) { + case 0: + f = Int8Array; + break; + case 1: + f = Uint8Array; + break; + case 2: + f = Int16Array; + break; + case 3: + f = Uint16Array; + break; + case 4: + f = Int32Array; + break; + case 5: + f = Uint32Array; + break; + case 6: + f = Float32Array; + break; + case 7: + f = Float64Array; + break; + default: + f = Float32Array; + } + return f; + }, + getPixelType: function(d) { + var f; + switch (d) { + case 0: + f = "S8"; + break; + case 1: + f = "U8"; + break; + case 2: + f = "S16"; + break; + case 3: + f = "U16"; + break; + case 4: + f = "S32"; + break; + case 5: + f = "U32"; + break; + case 6: + f = "F32"; + break; + case 7: + f = "F64"; + break; + default: + f = "F32"; + } + return f; + }, + isValidPixelValue: function(d, f) { + if (f == null) + return !1; + var h; + switch (d) { + case 0: + h = f >= -128 && f <= 127; + break; + case 1: + h = f >= 0 && f <= 255; + break; + case 2: + h = f >= -32768 && f <= 32767; + break; + case 3: + h = f >= 0 && f <= 65536; + break; + case 4: + h = f >= -2147483648 && f <= 2147483647; + break; + case 5: + h = f >= 0 && f <= 4294967296; + break; + case 6: + h = f >= -34027999387901484e22 && f <= 34027999387901484e22; + break; + case 7: + h = f >= 5e-324 && f <= 17976931348623157e292; + break; + default: + h = !1; + } + return h; + }, + getDataTypeSize: function(d) { + var f = 0; + switch (d) { + case 0: + case 1: + f = 1; + break; + case 2: + case 3: + f = 2; + break; + case 4: + case 5: + case 6: + f = 4; + break; + case 7: + f = 8; + break; + default: + f = d; + } + return f; + }, + getDataTypeUsed: function(d, f) { + var h = d; + switch (d) { + case 2: + case 4: + h = d - f; + break; + case 3: + case 5: + h = d - 2 * f; + break; + case 6: + f === 0 ? h = d : f === 1 ? h = 2 : h = 1; + break; + case 7: + f === 0 ? h = d : h = d - 2 * f + 1; + break; + default: + h = d; + break; + } + return h; + }, + getOnePixel: function(d, f, h, p) { + var m = 0; + switch (h) { + case 0: + m = p.getInt8(f); + break; + case 1: + m = p.getUint8(f); + break; + case 2: + m = p.getInt16(f, !0); + break; + case 3: + m = p.getUint16(f, !0); + break; + case 4: + m = p.getInt32(f, !0); + break; + case 5: + m = p.getUInt32(f, !0); + break; + case 6: + m = p.getFloat32(f, !0); + break; + case 7: + m = p.getFloat64(f, !0); + break; + default: + throw "the decoder does not understand this pixel type"; + } + return m; + } + }, c = function(d, f, h) { + this.val = d, this.left = f, this.right = h; + }, l = { + /* + * ********removed options compared to LERC1. We can bring some of them back if needed. + * removed pixel type. LERC2 is typed and doesn't require user to give pixel type + * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly. + * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost. + * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc, + * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now. + * We can add it back later if their's a clear requirement. + * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient) + * removed computeUsedBitDepths. + * + * + * response changes compared to LERC1 + * 1. encodedMaskData is not available + * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range) + * 3. maskData is always available + */ + /***************** + * public properties + ******************/ + //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable + /***************** + * public methods + *****************/ + /** + * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata. + * + * @param {ArrayBuffer} input The LERC input byte stream + * @param {object} [options] options Decoding options + * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position + * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process + */ + decode: function(d, f) { + f = f || {}; + var h = f.noDataValue, p = 0, m = {}; + if (m.ptr = f.inputOffset || 0, m.pixels = {}, !!s.readHeaderInfo(d, m)) { + var _ = m.headerInfo, y = _.fileVersion, C = s.getDataTypeArray(_.imageType); + s.readMask(d, m), _.numValidPixel !== _.width * _.height && !m.pixels.resultMask && (m.pixels.resultMask = f.maskData); + var T = _.width * _.height; + if (m.pixels.resultPixels = new C(T * _.numDims), m.counter = { + onesweep: 0, + uncompressed: 0, + lut: 0, + bitstuffer: 0, + constant: 0, + constantoffset: 0 + }, _.numValidPixel !== 0) + if (_.zMax === _.zMin) + s.constructConstantSurface(m); + else if (y >= 4 && s.checkMinMaxRanges(d, m)) + s.constructConstantSurface(m); + else { + var x = new DataView(d, m.ptr, 2), b = x.getUint8(0); + if (m.ptr++, b) + s.readDataOneSweep(d, m, C); + else if (y > 1 && _.imageType <= 1 && Math.abs(_.maxZError - 0.5) < 1e-5) { + var S = x.getUint8(1); + if (m.ptr++, m.encodeMode = S, S > 2 || y < 4 && S > 1) + throw "Invalid Huffman flag " + S; + S ? s.readHuffman(d, m, C) : s.readTiles(d, m, C); + } else + s.readTiles(d, m, C); + } + m.eofOffset = m.ptr; + var E; + f.inputOffset ? (E = m.headerInfo.blobSize + f.inputOffset - m.ptr, Math.abs(E) >= 1 && (m.eofOffset = f.inputOffset + m.headerInfo.blobSize)) : (E = m.headerInfo.blobSize - m.ptr, Math.abs(E) >= 1 && (m.eofOffset = m.headerInfo.blobSize)); + var A = { + width: _.width, + height: _.height, + pixelData: m.pixels.resultPixels, + minValue: _.zMin, + maxValue: _.zMax, + validPixelCount: _.numValidPixel, + dimCount: _.numDims, + dimStats: { + minValues: _.minValues, + maxValues: _.maxValues + }, + maskData: m.pixels.resultMask + //noDataValue: noDataValue + }; + if (m.pixels.resultMask && s.isValidPixelValue(_.imageType, h)) { + var D = m.pixels.resultMask; + for (p = 0; p < T; p++) + D[p] || (A.pixelData[p] = h); + A.noDataValue = h; + } + return m.noDataValue = h, f.returnFileInfo && (A.fileInfo = s.formatFileInfo(m)), A; + } + }, + getBandCount: function(d) { + var f = 0, h = 0, p = {}; + for (p.ptr = 0, p.pixels = {}; h < d.byteLength - 58; ) + s.readHeaderInfo(d, p), h += p.headerInfo.blobSize, f++, p.ptr = h; + return f; + } + }; + return l; + }(), i = function() { + var o = new ArrayBuffer(4), s = new Uint8Array(o), c = new Uint32Array(o); + return c[0] = 1, s[0] === 1; + }(), r = { + /************wrapper**********************************************/ + /** + * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types. + * + * @alias module:Lerc + * @param {ArrayBuffer} input The LERC input byte stream + * @param {object} [options] The decoding options below are optional. + * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position. + * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32. + * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value. + * @returns {{width, height, pixels, pixelType, mask, statistics}} + * @property {number} width Width of decoded image. + * @property {number} height Height of decoded image. + * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height. + * @property {string} pixelType The type of pixels represented in the output. + * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid. + * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values + **/ + decode: function(o, s) { + if (!i) + throw "Big endian system is not supported."; + s = s || {}; + var c = s.inputOffset || 0, l = new Uint8Array(o, c, 10), d = String.fromCharCode.apply(null, l), f, h; + if (d.trim() === "CntZImage") + f = t, h = 1; + else if (d.substring(0, 5) === "Lerc2") + f = n, h = 2; + else + throw "Unexpected file identifier string: " + d; + for (var p = 0, m = o.byteLength - 10, _, y = [], C, T, x = { + width: 0, + height: 0, + pixels: [], + pixelType: s.pixelType, + mask: null, + statistics: [] + }; c < m; ) { + var b = f.decode(o, { + inputOffset: c, + //for both lerc1 and lerc2 + encodedMaskData: _, + //lerc1 only + maskData: T, + //lerc2 only + returnMask: p === 0, + //lerc1 only + returnEncodedMask: p === 0, + //lerc1 only + returnFileInfo: !0, + //for both lerc1 and lerc2 + pixelType: s.pixelType || null, + //lerc1 only + noDataValue: s.noDataValue || null + //lerc1 only + }); + c = b.fileInfo.eofOffset, p === 0 && (_ = b.encodedMaskData, T = b.maskData, x.width = b.width, x.height = b.height, x.dimCount = b.dimCount || 1, x.pixelType = b.pixelType || b.fileInfo.pixelType, x.mask = b.maskData), h > 1 && b.fileInfo.mask && b.fileInfo.mask.numBytes > 0 && y.push(b.maskData), p++, x.pixels.push(b.pixelData), x.statistics.push({ + minValue: b.minValue, + maxValue: b.maxValue, + noDataValue: b.noDataValue, + dimStats: b.dimStats + }); + } + var S, E, A; + if (h > 1 && y.length > 1) { + for (A = x.width * x.height, x.bandMasks = y, T = new Uint8Array(A), T.set(y[0]), S = 1; S < y.length; S++) + for (C = y[S], E = 0; E < A; E++) + T[E] = T[E] & C[E]; + x.maskData = T; + } + return x; + } + }; + e.exports ? e.exports = r : this.Lerc = r; + })(); +})(LercDecode); +var LercDecodeExports = LercDecode.exports; +const Lerc = /* @__PURE__ */ getDefaultExportFromCjs(LercDecodeExports); +function I3SDataProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._name = e.name, this._show = defaultValue(e.show, !0), this._geoidTiledTerrainProvider = e.geoidTiledTerrainProvider, this._showFeatures = defaultValue(e.showFeatures, !1), this._adjustMaterialAlphaMode = defaultValue( + e.adjustMaterialAlphaMode, + !1 + ), this._applySymbology = defaultValue(e.applySymbology, !1), this._calculateNormals = defaultValue(e.calculateNormals, !1), this._cesium3dTilesetOptions = defaultValue( + e.cesium3dTilesetOptions, + defaultValue.EMPTY_OBJECT + ), this._layers = [], this._sublayers = [], this._data = void 0, this._extent = void 0, this._geoidDataPromise = void 0, this._geoidDataList = void 0, this._decoderTaskProcessor = void 0, this._taskProcessorReadyPromise = void 0, this._attributeStatistics = [], this._layersExtent = []; +} +Object.defineProperties(I3SDataProvider.prototype, { + /** + * Gets a human-readable name for this dataset. + * @memberof I3SDataProvider.prototype + * @type {string} + * @readonly + */ + name: { + get: function() { + return this._name; + } + }, + /** + * Determines if the dataset will be shown. + * @memberof I3SDataProvider.prototype + * @type {boolean} + */ + show: { + get: function() { + return this._show; + }, + set: function(e) { + if (this._show !== e) { + this._show = e; + for (let t = 0; t < this._layers.length; t++) + this._layers[t]._updateVisibility(); + } + } + }, + /** + * The terrain provider referencing the GEOID service to be used for orthometric to ellipsoidal conversion. + * @memberof I3SDataProvider.prototype + * @type {ArcGISTiledElevationTerrainProvider} + * @readonly + */ + geoidTiledTerrainProvider: { + get: function() { + return this._geoidTiledTerrainProvider; + } + }, + /** + * Gets the collection of layers. + * @memberof I3SDataProvider.prototype + * @type {I3SLayer[]} + * @readonly + */ + layers: { + get: function() { + return this._layers; + } + }, + /** + * Gets the collection of building sublayers. + * @memberof I3SDataProvider.prototype + * @type {I3SSublayer[]} + * @readonly + */ + sublayers: { + get: function() { + return this._sublayers; + } + }, + /** + * Gets the I3S data for this object. + * @memberof I3SDataProvider.prototype + * @type {object} + * @readonly + */ + data: { + get: function() { + return this._data; + } + }, + /** + * Gets the extent covered by this I3S. + * @memberof I3SDataProvider.prototype + * @type {Rectangle} + * @readonly + */ + extent: { + get: function() { + return this._extent; + } + }, + /** + * The resource used to fetch the I3S dataset. + * @memberof I3SDataProvider.prototype + * @type {Resource} + * @readonly + */ + resource: { + get: function() { + return this._resource; + } + }, + /** + * Determines if the features will be shown. + * @memberof I3SDataProvider.prototype + * @type {boolean} + * @readonly + */ + showFeatures: { + get: function() { + return this._showFeatures; + } + }, + /** + * Determines if the alpha mode of the material will be adjusted depending on the color vertex attribute. + * @memberof I3SDataProvider.prototype + * @type {boolean} + * @readonly + */ + adjustMaterialAlphaMode: { + get: function() { + return this._adjustMaterialAlphaMode; + } + }, + /** + * Determines if the I3S symbology will be parsed and applied for the layers. + * @memberof I3SDataProvider.prototype + * @type {boolean} + * @readonly + */ + applySymbology: { + get: function() { + return this._applySymbology; + } + }, + /** + * Determines if the flat normals will be generated for I3S geometry without normals. + * @memberof I3SDataProvider.prototype + * @type {boolean} + * @readonly + */ + calculateNormals: { + get: function() { + return this._calculateNormals; + } + } +}); +I3SDataProvider.prototype.destroy = function() { + for (let e = 0; e < this._layers.length; e++) + defined(this._layers[e]._tileset) && this._layers[e]._tileset.destroy(); + return destroyObject(this); +}; +I3SDataProvider.prototype.isDestroyed = function() { + return !1; +}; +I3SDataProvider.prototype.update = function(e) { + for (let t = 0; t < this._layers.length; t++) + defined(this._layers[t]._tileset) && this._layers[t]._tileset.update(e); +}; +I3SDataProvider.prototype.prePassesUpdate = function(e) { + for (let t = 0; t < this._layers.length; t++) + defined(this._layers[t]._tileset) && this._layers[t]._tileset.prePassesUpdate(e); +}; +I3SDataProvider.prototype.postPassesUpdate = function(e) { + for (let t = 0; t < this._layers.length; t++) + defined(this._layers[t]._tileset) && this._layers[t]._tileset.postPassesUpdate(e); +}; +I3SDataProvider.prototype.updateForPass = function(e, t) { + for (let n = 0; n < this._layers.length; n++) + defined(this._layers[n]._tileset) && this._layers[n]._tileset.updateForPass(e, t); +}; +function buildLayerUrl(e, t) { + const n = e.resource.getUrlComponent(); + let i = ""; + return n.match(/layers\/\d/) ? i = `${n}`.replace(/\/+$/, "") : i = `${n}`.replace(/\/?$/, "/").concat(`layers/${t}`), i; +} +async function addLayers(e, t, n) { + if (t.layerType === "Building") { + defined(n.showFeatures) || (e._showFeatures = !0), defined(n.adjustMaterialAlphaMode) || (e._adjustMaterialAlphaMode = !0), defined(n.applySymbology) || (e._applySymbology = !0), defined(n.calculateNormals) || (e._calculateNormals = !0); + const i = buildLayerUrl(e, t.id); + if (defined(t.sublayers)) { + const r = []; + for (let s = 0; s < t.sublayers.length; s++) { + const c = I3SSublayer._fromData( + e, + i, + t.sublayers[s], + e + ); + r.push(c); + } + const o = await Promise.all(r); + for (let s = 0; s < o.length; s++) { + const c = o[s]; + e._sublayers.push(c), e._layers.push(...c._i3sLayers); + } + } + if (defined(t.statisticsHRef)) { + const r = i.concat(`/${t.statisticsHRef}`), o = new I3SStatistics(e, r); + await o.load(), e._attributeStatistics.push(o); + } + if (defined(t.fullExtent)) { + const r = Rectangle.fromDegrees( + t.fullExtent.xmin, + t.fullExtent.ymin, + t.fullExtent.xmax, + t.fullExtent.ymax + ); + e._layersExtent.push(r); + } + } else if (t.layerType === "3DObject" || t.layerType === "IntegratedMesh") { + !defined(n.calculateNormals) && !defined(t.textureSetDefinitions) && (e._calculateNormals = !0); + const i = new I3SLayer(e, t, e); + e._layers.push(i), defined(i._extent) && e._layersExtent.push(i._extent); + } else + console.log( + `${t.layerType} layer ${t.name} is skipped as not supported.` + ); +} +I3SDataProvider.fromUrl = async function(e, t) { + t = defaultValue(t, defaultValue.EMPTY_OBJECT); + const n = Resource.createIfNeeded(e); + n.setQueryParameters({ f: "pjson" }, !0); + const i = await I3SDataProvider.loadJson(n), r = new I3SDataProvider(t); + if (r._resource = n, r._data = i, defined(i.layers)) { + const s = []; + for (let c = 0; c < i.layers.length; c++) { + const l = addLayers(r, i.layers[c], t); + s.push(l); + } + await Promise.all(s); + } else + await addLayers(r, i, t); + r._computeExtent(); + const o = []; + for (let s = 0; s < r._layers.length; s++) + o.push( + r._layers[s].load(t.cesium3dTilesetOptions) + ); + return await Promise.all(o), r; +}; +I3SDataProvider._fetchJson = function(e) { + return e.fetchJson(); +}; +I3SDataProvider.loadJson = async function(e) { + const t = await I3SDataProvider._fetchJson(e); + if (defined(t.error)) { + if (console.error("Failed to fetch I3S ", e.url), defined(t.error.message) && console.error(t.error.message), defined(t.error.details)) + for (let n = 0; n < t.error.details.length; n++) + console.log(t.error.details[n]); + throw new RuntimeError(t.error); + } + return t; +}; +I3SDataProvider.prototype._loadBinary = async function(e) { + const t = await e.fetchArrayBuffer(); + if (t.byteLength > 0 && new Uint8Array(t)[0] === 123 && new TextDecoder().decode(t).includes("404")) + throw new RuntimeError(`Failed to load binary: ${e.url}`); + return t; +}; +I3SDataProvider.prototype._binarizeGltf = function(e) { + const n = new TextEncoder().encode(JSON.stringify(e)), i = new Uint8Array(n.byteLength + 20), r = { + magic: new Uint8Array(i.buffer, 0, 4), + version: new Uint32Array(i.buffer, 4, 1), + length: new Uint32Array(i.buffer, 8, 1), + chunkLength: new Uint32Array(i.buffer, 12, 1), + chunkType: new Uint32Array(i.buffer, 16, 1), + chunkData: new Uint8Array( + i.buffer, + 20, + n.byteLength + ) + }; + return r.magic[0] = 103, r.magic[1] = 108, r.magic[2] = 84, r.magic[3] = 70, r.version[0] = 2, r.length[0] = i.byteLength, r.chunkLength[0] = n.byteLength, r.chunkType[0] = 1313821514, r.chunkData.set(n), i; +}; +const scratchCartesian2 = new Cartesian2(); +function getCoveredTiles(e, t) { + const n = e.tilingScheme, i = [], r = {}, o = e._lodCount, s = Cartographic.fromRadians(t.west, t.north), c = Cartographic.fromRadians(t.east, t.south), l = n.positionToTileXY(s, o), d = n.positionToTileXY( + c, + o + ); + for (let h = l.x; h <= d.x; h++) + for (let p = l.y; p <= d.y; p++) { + const m = Cartesian2.fromElements(h, p, scratchCartesian2), _ = m.toString(); + if (!r.hasOwnProperty(_)) { + const y = { + x: m.x, + y: m.y, + level: o, + tilingScheme: n, + terrainProvider: e, + positions: [] + }; + r[_] = y, i.push(y); + } + } + const f = []; + for (let h = 0; h < i.length; ++h) { + const p = i[h], m = p.terrainProvider.requestTileGeometry( + p.x, + p.y, + p.level + ); + f.push(m); + } + return Promise.all(f).then(function(h) { + const p = []; + for (let m = 0; m < h.length; m++) { + const _ = { + tilingScheme: n, + x: i[m].x, + y: i[m].y, + level: i[m].level + }, y = h[m]; + let C = "Geographic"; + n._projection instanceof WebMercatorProjection && (C = "WebMercator"); + const T = { + projectionType: C, + projection: n._projection, + nativeExtent: n.tileXYToNativeRectangle( + _.x, + _.y, + _.level + ), + height: y._height, + width: y._width, + scale: y._structure.heightScale, + offset: y._structure.heightOffset + }; + if (y._encoding === HeightmapEncoding$1.LERC) { + const x = Lerc.decode(y._buffer); + T.buffer = x.pixels[0]; + } else + T.buffer = y._buffer; + p.push(T); + } + return p; + }); +} +async function loadGeoidData(e) { + const t = e._geoidTiledTerrainProvider; + if (defined(t)) + try { + const n = await getCoveredTiles( + t, + e._extent + ); + e._geoidDataList = n; + } catch { + console.log( + "Error retrieving Geoid Terrain tiles - no geoid conversion will be performed." + ); + } +} +I3SDataProvider.prototype.loadGeoidData = async function() { + return defined(this._geoidDataPromise) ? this._geoidDataPromise : (this._geoidDataPromise = loadGeoidData(this), this._geoidDataPromise); +}; +I3SDataProvider.prototype._computeExtent = function() { + let e; + for (let t = 0; t < this._layersExtent.length; t++) { + const n = this._layersExtent[t]; + defined(e) ? Rectangle.union(e, n, e) : e = Rectangle.clone(n); + } + this._extent = e; +}; +I3SDataProvider.prototype.getAttributeNames = function() { + const e = []; + for (let t = 0; t < this._attributeStatistics.length; ++t) + e.push(...this._attributeStatistics[t].names); + return e; +}; +I3SDataProvider.prototype.getAttributeValues = function(e) { + for (let t = 0; t < this._attributeStatistics.length; ++t) { + const n = this._attributeStatistics[t]._getValues(e); + if (defined(n)) + return n; + } + return []; +}; +I3SDataProvider.prototype.filterByAttributes = function(e) { + const t = []; + for (let n = 0; n < this._layers.length; n++) { + const i = this._layers[n].filterByAttributes(e); + t.push(i); + } + return Promise.all(t); +}; +function Light() { +} +Object.defineProperties(Light.prototype, { + /** + * The color of the light. + * @memberof Light.prototype + * @type {Color} + */ + color: { + get: DeveloperError.throwInstantiationError + }, + /** + * The intensity controls the strength of the light. <code>intensity</code> has a minimum value of 0.0 and no maximum value. + * @memberof Light.prototype + * @type {number} + */ + intensity: { + get: DeveloperError.throwInstantiationError + } +}); +const trailingSlashRegex = /\/$/, defaultCredit$1 = new Credit( + '© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/">Improve this map</a></strong>' +); +function MapboxStyleImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = e.styleId, n = e.accessToken; + this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0; + const i = Resource.createIfNeeded( + defaultValue(e.url, "https://api.mapbox.com/styles/v1/") + ); + this._styleId = t, this._accessToken = n; + const r = defaultValue(e.tilesize, 512); + this._tilesize = r; + const o = defaultValue(e.username, "mapbox"); + this._username = o; + const s = defined(e.scaleFactor) ? "@2x" : ""; + let c = i.getUrlComponent(); + trailingSlashRegex.test(c) || (c += "/"), c += `${this._username}/${t}/tiles/${this._tilesize}/{z}/{x}/{y}${s}`, i.url = c, i.setQueryParameters({ + access_token: n + }); + let l; + defined(e.credit) ? (l = e.credit, typeof l == "string" && (l = new Credit(l))) : l = defaultCredit$1, this._resource = i, this._imageryProvider = new UrlTemplateImageryProvider({ + url: i, + credit: l, + ellipsoid: e.ellipsoid, + minimumLevel: e.minimumLevel, + maximumLevel: e.maximumLevel, + rectangle: e.rectangle + }); +} +Object.defineProperties(MapboxStyleImageryProvider.prototype, { + /** + * Gets the URL of the Mapbox server. + * @memberof MapboxStyleImageryProvider.prototype + * @type {string} + * @readonly + */ + url: { + get: function() { + return this._imageryProvider.url; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + * @memberof MapboxStyleImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._imageryProvider.rectangle; + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof MapboxStyleImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._imageryProvider.tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof MapboxStyleImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._imageryProvider.tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof MapboxStyleImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + return this._imageryProvider.maximumLevel; + } + }, + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + * @memberof MapboxStyleImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + return this._imageryProvider.minimumLevel; + } + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof MapboxStyleImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._imageryProvider.tilingScheme; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof MapboxStyleImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + return this._imageryProvider.tileDiscardPolicy; + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof MapboxStyleImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._imageryProvider.errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof MapboxStyleImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + return this._imageryProvider.credit; + } + }, + /** + * Gets the proxy used by this provider. + * @memberof MapboxStyleImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + return this._imageryProvider.proxy; + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + * @memberof MapboxStyleImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return this._imageryProvider.hasAlphaChannel; + } + } +}); +MapboxStyleImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +MapboxStyleImageryProvider.prototype.requestImage = function(e, t, n, i) { + return this._imageryProvider.requestImage(e, t, n, i); +}; +MapboxStyleImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { + return this._imageryProvider.pickFeatures(e, t, n, i, r); +}; +MapboxStyleImageryProvider._defaultCredit = defaultCredit$1; +function NeverTileDiscardPolicy(e) { +} +NeverTileDiscardPolicy.prototype.isReady = function() { + return !0; +}; +NeverTileDiscardPolicy.prototype.shouldDiscardImage = function(e) { + return !1; +}; +const defaultCredit = new Credit( + "MapQuest, Open Street Map and contributors, CC-BY-SA" +); +function OpenStreetMapImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = Resource.createIfNeeded( + defaultValue(e.url, "https://tile.openstreetmap.org/") + ); + t.appendForwardSlash(), t.url += `{z}/{x}/{y}${e.retinaTiles ? "@2x" : ""}.${defaultValue(e.fileExtension, "png")}`; + const n = new WebMercatorTilingScheme({ + ellipsoid: e.ellipsoid + }), i = 256, r = 256, o = defaultValue(e.minimumLevel, 0), s = e.maximumLevel, c = defaultValue(e.rectangle, n.rectangle), l = n.positionToTileXY( + Rectangle.southwest(c), + o + ), d = n.positionToTileXY( + Rectangle.northeast(c), + o + ); + (Math.abs(d.x - l.x) + 1) * (Math.abs(d.y - l.y) + 1); + let f = defaultValue(e.credit, defaultCredit); + typeof f == "string" && (f = new Credit(f)), UrlTemplateImageryProvider.call(this, { + url: t, + credit: f, + tilingScheme: n, + tileWidth: i, + tileHeight: r, + minimumLevel: o, + maximumLevel: s, + rectangle: c + }); +} +defined(Object.create) && (OpenStreetMapImageryProvider.prototype = Object.create( + UrlTemplateImageryProvider.prototype +), OpenStreetMapImageryProvider.prototype.constructor = OpenStreetMapImageryProvider); +const defaultSize = new Cartesian2(1, 1); +function Particle(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.mass = defaultValue(e.mass, 1), this.position = Cartesian3.clone( + defaultValue(e.position, Cartesian3.ZERO) + ), this.velocity = Cartesian3.clone( + defaultValue(e.velocity, Cartesian3.ZERO) + ), this.life = defaultValue(e.life, Number.MAX_VALUE), this.image = e.image, this.startColor = Color.clone(defaultValue(e.startColor, Color.WHITE)), this.endColor = Color.clone(defaultValue(e.endColor, Color.WHITE)), this.startScale = defaultValue(e.startScale, 1), this.endScale = defaultValue(e.endScale, 1), this.imageSize = Cartesian2.clone( + defaultValue(e.imageSize, defaultSize) + ), this._age = 0, this._normalizedAge = 0, this._billboard = void 0; +} +Object.defineProperties(Particle.prototype, { + /** + * Gets the age of the particle in seconds. + * @memberof Particle.prototype + * @type {number} + */ + age: { + get: function() { + return this._age; + } + }, + /** + * Gets the age normalized to a value in the range [0.0, 1.0]. + * @memberof Particle.prototype + * @type {number} + */ + normalizedAge: { + get: function() { + return this._normalizedAge; + } + } +}); +const deltaScratch = new Cartesian3(); +Particle.prototype.update = function(e, t) { + return Cartesian3.multiplyByScalar(this.velocity, e, deltaScratch), Cartesian3.add(this.position, deltaScratch, this.position), defined(t) && t(this, e), this._age += e, this.life === Number.MAX_VALUE ? this._normalizedAge = 0 : this._normalizedAge = this._age / this.life, this._age <= this.life; +}; +function ParticleBurst(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.time = defaultValue(e.time, 0), this.minimum = defaultValue(e.minimum, 0), this.maximum = defaultValue(e.maximum, 50), this._complete = !1; +} +Object.defineProperties(ParticleBurst.prototype, { + /** + * <code>true</code> if the burst has been completed; <code>false</code> otherwise. + * @memberof ParticleBurst.prototype + * @type {boolean} + */ + complete: { + get: function() { + return this._complete; + } + } +}); +function ParticleEmitter(e) { +} +ParticleEmitter.prototype.emit = function(e) { + DeveloperError.throwInstantiationError(); +}; +const defaultImageSize = new Cartesian2(1, 1); +function ParticleSystem(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.show = defaultValue(e.show, !0), this.updateCallback = e.updateCallback, this.loop = defaultValue(e.loop, !0), this.image = defaultValue(e.image, void 0); + let t = e.emitter; + defined(t) || (t = new CircleEmitter(0.5)), this._emitter = t, this._bursts = e.bursts, this._modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this._emitterModelMatrix = Matrix4.clone( + defaultValue(e.emitterModelMatrix, Matrix4.IDENTITY) + ), this._matrixDirty = !0, this._combinedMatrix = new Matrix4(), this._startColor = Color.clone( + defaultValue(e.color, defaultValue(e.startColor, Color.WHITE)) + ), this._endColor = Color.clone( + defaultValue(e.color, defaultValue(e.endColor, Color.WHITE)) + ), this._startScale = defaultValue( + e.scale, + defaultValue(e.startScale, 1) + ), this._endScale = defaultValue( + e.scale, + defaultValue(e.endScale, 1) + ), this._emissionRate = defaultValue(e.emissionRate, 5), this._minimumSpeed = defaultValue( + e.speed, + defaultValue(e.minimumSpeed, 1) + ), this._maximumSpeed = defaultValue( + e.speed, + defaultValue(e.maximumSpeed, 1) + ), this._minimumParticleLife = defaultValue( + e.particleLife, + defaultValue(e.minimumParticleLife, 5) + ), this._maximumParticleLife = defaultValue( + e.particleLife, + defaultValue(e.maximumParticleLife, 5) + ), this._minimumMass = defaultValue( + e.mass, + defaultValue(e.minimumMass, 1) + ), this._maximumMass = defaultValue( + e.mass, + defaultValue(e.maximumMass, 1) + ), this._minimumImageSize = Cartesian2.clone( + defaultValue( + e.imageSize, + defaultValue(e.minimumImageSize, defaultImageSize) + ) + ), this._maximumImageSize = Cartesian2.clone( + defaultValue( + e.imageSize, + defaultValue(e.maximumImageSize, defaultImageSize) + ) + ), this._sizeInMeters = defaultValue(e.sizeInMeters, !1), this._lifetime = defaultValue(e.lifetime, Number.MAX_VALUE), this._billboardCollection = void 0, this._particles = [], this._particlePool = [], this._previousTime = void 0, this._currentTime = 0, this._carryOver = 0, this._complete = new Event(), this._isComplete = !1, this._updateParticlePool = !0, this._particleEstimate = 0; +} +Object.defineProperties(ParticleSystem.prototype, { + /** + * The particle emitter for this + * @memberof ParticleSystem.prototype + * @type {ParticleEmitter} + * @default CircleEmitter + */ + emitter: { + get: function() { + return this._emitter; + }, + set: function(e) { + this._emitter = e; + } + }, + /** + * An array of {@link ParticleBurst}, emitting bursts of particles at periodic times. + * @memberof ParticleSystem.prototype + * @type {ParticleBurst[]} + * @default undefined + */ + bursts: { + get: function() { + return this._bursts; + }, + set: function(e) { + this._bursts = e, this._updateParticlePool = !0; + } + }, + /** + * The 4x4 transformation matrix that transforms the particle system from model to world coordinates. + * @memberof ParticleSystem.prototype + * @type {Matrix4} + * @default Matrix4.IDENTITY + */ + modelMatrix: { + get: function() { + return this._modelMatrix; + }, + set: function(e) { + this._matrixDirty = this._matrixDirty || !Matrix4.equals(this._modelMatrix, e), Matrix4.clone(e, this._modelMatrix); + } + }, + /** + * The 4x4 transformation matrix that transforms the particle system emitter within the particle systems local coordinate system. + * @memberof ParticleSystem.prototype + * @type {Matrix4} + * @default Matrix4.IDENTITY + */ + emitterModelMatrix: { + get: function() { + return this._emitterModelMatrix; + }, + set: function(e) { + this._matrixDirty = this._matrixDirty || !Matrix4.equals(this._emitterModelMatrix, e), Matrix4.clone(e, this._emitterModelMatrix); + } + }, + /** + * The color of the particle at the beginning of its life. + * @memberof ParticleSystem.prototype + * @type {Color} + * @default Color.WHITE + */ + startColor: { + get: function() { + return this._startColor; + }, + set: function(e) { + Color.clone(e, this._startColor); + } + }, + /** + * The color of the particle at the end of its life. + * @memberof ParticleSystem.prototype + * @type {Color} + * @default Color.WHITE + */ + endColor: { + get: function() { + return this._endColor; + }, + set: function(e) { + Color.clone(e, this._endColor); + } + }, + /** + * The initial scale to apply to the image of the particle at the beginning of its life. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + startScale: { + get: function() { + return this._startScale; + }, + set: function(e) { + this._startScale = e; + } + }, + /** + * The final scale to apply to the image of the particle at the end of its life. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + endScale: { + get: function() { + return this._endScale; + }, + set: function(e) { + this._endScale = e; + } + }, + /** + * The number of particles to emit per second. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 5 + */ + emissionRate: { + get: function() { + return this._emissionRate; + }, + set: function(e) { + this._emissionRate = e, this._updateParticlePool = !0; + } + }, + /** + * Sets the minimum bound in meters per second above which a particle's actual speed will be randomly chosen. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + minimumSpeed: { + get: function() { + return this._minimumSpeed; + }, + set: function(e) { + this._minimumSpeed = e; + } + }, + /** + * Sets the maximum bound in meters per second below which a particle's actual speed will be randomly chosen. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + maximumSpeed: { + get: function() { + return this._maximumSpeed; + }, + set: function(e) { + this._maximumSpeed = e; + } + }, + /** + * Sets the minimum bound in seconds for the possible duration of a particle's life above which a particle's actual life will be randomly chosen. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 5.0 + */ + minimumParticleLife: { + get: function() { + return this._minimumParticleLife; + }, + set: function(e) { + this._minimumParticleLife = e; + } + }, + /** + * Sets the maximum bound in seconds for the possible duration of a particle's life below which a particle's actual life will be randomly chosen. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 5.0 + */ + maximumParticleLife: { + get: function() { + return this._maximumParticleLife; + }, + set: function(e) { + this._maximumParticleLife = e, this._updateParticlePool = !0; + } + }, + /** + * Sets the minimum mass of particles in kilograms. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + minimumMass: { + get: function() { + return this._minimumMass; + }, + set: function(e) { + this._minimumMass = e; + } + }, + /** + * Sets the maximum mass of particles in kilograms. + * @memberof ParticleSystem.prototype + * @type {number} + * @default 1.0 + */ + maximumMass: { + get: function() { + return this._maximumMass; + }, + set: function(e) { + this._maximumMass = e; + } + }, + /** + * Sets the minimum bound, width by height, above which to randomly scale the particle image's dimensions in pixels. + * @memberof ParticleSystem.prototype + * @type {Cartesian2} + * @default new Cartesian2(1.0, 1.0) + */ + minimumImageSize: { + get: function() { + return this._minimumImageSize; + }, + set: function(e) { + this._minimumImageSize = e; + } + }, + /** + * Sets the maximum bound, width by height, below which to randomly scale the particle image's dimensions in pixels. + * @memberof ParticleSystem.prototype + * @type {Cartesian2} + * @default new Cartesian2(1.0, 1.0) + */ + maximumImageSize: { + get: function() { + return this._maximumImageSize; + }, + set: function(e) { + this._maximumImageSize = e; + } + }, + /** + * Gets or sets if the particle size is in meters or pixels. <code>true</code> to size particles in meters; otherwise, the size is in pixels. + * @memberof ParticleSystem.prototype + * @type {boolean} + * @default false + */ + sizeInMeters: { + get: function() { + return this._sizeInMeters; + }, + set: function(e) { + this._sizeInMeters = e; + } + }, + /** + * How long the particle system will emit particles, in seconds. + * @memberof ParticleSystem.prototype + * @type {number} + * @default Number.MAX_VALUE + */ + lifetime: { + get: function() { + return this._lifetime; + }, + set: function(e) { + this._lifetime = e; + } + }, + /** + * Fires an event when the particle system has reached the end of its lifetime. + * @memberof ParticleSystem.prototype + * @type {Event} + */ + complete: { + get: function() { + return this._complete; + } + }, + /** + * When <code>true</code>, the particle system has reached the end of its lifetime; <code>false</code> otherwise. + * @memberof ParticleSystem.prototype + * @type {boolean} + */ + isComplete: { + get: function() { + return this._isComplete; + } + } +}); +function updateParticlePool(e) { + const t = e._emissionRate, n = e._maximumParticleLife; + let i = 0; + const r = e._bursts; + if (defined(r)) { + const h = r.length; + for (let p = 0; p < h; ++p) + i += r[p].maximum; + } + const o = e._billboardCollection, s = e.image, c = Math.ceil(t * n + i), l = e._particles, d = e._particlePool, f = Math.max( + c - l.length - d.length, + 0 + ); + for (let h = 0; h < f; ++h) { + const p = new Particle(); + p._billboard = o.add({ + image: s, + // Make the newly added billboards invisible when updating the particle pool + // to prevent the billboards from being displayed when the particles + // are not created. The billboard will always be set visible in + // updateBillboard function when its corresponding particle update. + show: !1 + }), d.push(p); + } + e._particleEstimate = c; +} +function getOrCreateParticle(e) { + let t = e._particlePool.pop(); + return defined(t) || (t = new Particle()), t; +} +function addParticleToPool(e, t) { + e._particlePool.push(t); +} +function freeParticlePool(e) { + const t = e._particles, n = e._particlePool, i = e._billboardCollection, r = t.length, o = n.length, s = e._particleEstimate, c = o - Math.max(s - r - o, 0); + for (let l = c; l < o; ++l) { + const d = n[l]; + i.remove(d._billboard); + } + n.length = c; +} +function removeBillboard(e) { + defined(e._billboard) && (e._billboard.show = !1); +} +function updateBillboard(e, t) { + let n = t._billboard; + defined(n) || (n = t._billboard = e._billboardCollection.add({ + image: t.image + })), n.width = t.imageSize.x, n.height = t.imageSize.y, n.position = t.position, n.sizeInMeters = e.sizeInMeters, n.show = !0; + const i = CesiumMath.lerp( + t.startColor.red, + t.endColor.red, + t.normalizedAge + ), r = CesiumMath.lerp( + t.startColor.green, + t.endColor.green, + t.normalizedAge + ), o = CesiumMath.lerp( + t.startColor.blue, + t.endColor.blue, + t.normalizedAge + ), s = CesiumMath.lerp( + t.startColor.alpha, + t.endColor.alpha, + t.normalizedAge + ); + n.color = new Color(i, r, o, s), n.scale = CesiumMath.lerp( + t.startScale, + t.endScale, + t.normalizedAge + ); +} +function addParticle(e, t) { + t.startColor = Color.clone(e._startColor, t.startColor), t.endColor = Color.clone(e._endColor, t.endColor), t.startScale = e._startScale, t.endScale = e._endScale, t.image = e.image, t.life = CesiumMath.randomBetween( + e._minimumParticleLife, + e._maximumParticleLife + ), t.mass = CesiumMath.randomBetween( + e._minimumMass, + e._maximumMass + ), t.imageSize.x = CesiumMath.randomBetween( + e._minimumImageSize.x, + e._maximumImageSize.x + ), t.imageSize.y = CesiumMath.randomBetween( + e._minimumImageSize.y, + e._maximumImageSize.y + ), t._normalizedAge = 0, t._age = 0; + const n = CesiumMath.randomBetween( + e._minimumSpeed, + e._maximumSpeed + ); + Cartesian3.multiplyByScalar(t.velocity, n, t.velocity), e._particles.push(t); +} +function calculateNumberToEmit(e, t) { + if (e._isComplete) + return 0; + t = CesiumMath.mod(t, e._lifetime); + const n = t * e._emissionRate; + let i = Math.floor(n); + if (e._carryOver += n - i, e._carryOver > 1 && (i++, e._carryOver -= 1), defined(e.bursts)) { + const r = e.bursts.length; + for (let o = 0; o < r; o++) { + const s = e.bursts[o], c = e._currentTime; + defined(s) && !s._complete && c > s.time && (i += CesiumMath.randomBetween(s.minimum, s.maximum), s._complete = !0); + } + } + return i; +} +const rotatedVelocityScratch = new Cartesian3(); +ParticleSystem.prototype.update = function(e) { + if (!this.show) + return; + defined(this._billboardCollection) || (this._billboardCollection = new BillboardCollection()), this._updateParticlePool && (updateParticlePool(this), this._updateParticlePool = !1); + let t = 0; + this._previousTime && (t = JulianDate.secondsDifference(e.time, this._previousTime)), t < 0 && (t = 0); + const n = this._particles, i = this._emitter, r = this.updateCallback; + let o, s, c = n.length; + for (o = 0; o < c; ++o) + s = n[o], s.update(t, r) ? updateBillboard(this, s) : (removeBillboard(s), addParticleToPool(this, s), n[o] = n[c - 1], --o, --c); + n.length = c; + const l = calculateNumberToEmit(this, t); + if (l > 0 && defined(i)) { + this._matrixDirty && (this._combinedMatrix = Matrix4.multiply( + this.modelMatrix, + this.emitterModelMatrix, + this._combinedMatrix + ), this._matrixDirty = !1); + const d = this._combinedMatrix; + for (o = 0; o < l; o++) + s = getOrCreateParticle(this), this._emitter.emit(s), Cartesian3.add( + s.position, + s.velocity, + rotatedVelocityScratch + ), Matrix4.multiplyByPoint( + d, + rotatedVelocityScratch, + rotatedVelocityScratch + ), s.position = Matrix4.multiplyByPoint( + d, + s.position, + s.position + ), Cartesian3.subtract( + rotatedVelocityScratch, + s.position, + s.velocity + ), Cartesian3.normalize(s.velocity, s.velocity), addParticle(this, s), updateBillboard(this, s); + } + if (this._billboardCollection.update(e), this._previousTime = JulianDate.clone(e.time, this._previousTime), this._currentTime += t, this._lifetime !== Number.MAX_VALUE && this._currentTime > this._lifetime) + if (this.loop) { + if (this._currentTime = CesiumMath.mod(this._currentTime, this._lifetime), this.bursts) { + const d = this.bursts.length; + for (o = 0; o < d; o++) + this.bursts[o]._complete = !1; + } + } else + this._isComplete = !0, this._complete.raiseEvent(this); + e.frameNumber % 120 === 0 && freeParticlePool(this); +}; +ParticleSystem.prototype.isDestroyed = function() { + return !1; +}; +ParticleSystem.prototype.destroy = function() { + return this._billboardCollection = this._billboardCollection && this._billboardCollection.destroy(), destroyObject(this); +}; +function getClipAndStyleCode(e, t, n) { + return ` float clipDistance = clip(gl_FragCoord, ${e}, ${t}); + vec4 clippingPlanesEdgeColor = vec4(1.0); + clippingPlanesEdgeColor.rgb = ${n}.rgb; + float clippingPlanesEdgeWidth = ${n}.a; + if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) + { + out_FragColor = clippingPlanesEdgeColor; + } +`; +} +const Splitter = { + /** + * Given a fragment shader string, returns a modified version of it that + * only renders on one side of the screen or the other. Fragments on the + * other side are discarded. The screen side is given by a uniform called + * `czm_splitDirection`, which can be added by calling + * {@link Splitter#addUniforms}, and the split position is given by an + * automatic uniform called `czm_splitPosition`. + */ + modifyFragmentShader: function e(t) { + return t = ShaderSource.replaceMain(t, "czm_splitter_main"), t += // czm_splitPosition is not declared because it is an automatic uniform. + `uniform float czm_splitDirection; +void main() +{ +#ifndef SHADOW_MAP + if (czm_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; + if (czm_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; +#endif + czm_splitter_main(); +} +`, t; + }, + /** + * Add `czm_splitDirection` to the given uniform map. + * + * @param {object} object The object on which the `splitDirection` property may be found. + * @param {object} uniformMap The uniform map. + */ + addUniforms: function e(t, n) { + n.czm_splitDirection = function() { + return t.splitDirection; + }; + } +}, DecodingState = { + NEEDS_DECODE: 0, + DECODING: 1, + READY: 2, + FAILED: 3 +}; +function PointCloud(e) { + this._parsedContent = void 0, this._drawCommand = void 0, this._isTranslucent = !1, this._styleTranslucent = !1, this._constantColor = Color.clone(Color.DARKGRAY), this._highlightColor = Color.clone(Color.WHITE), this._pointSize = 1, this._rtcCenter = void 0, this._quantizedVolumeScale = void 0, this._quantizedVolumeOffset = void 0, this._styleableShaderAttributes = void 0, this._isQuantized = !1, this._isOctEncoded16P = !1, this._isRGB565 = !1, this._hasColors = !1, this._hasNormals = !1, this._hasBatchIds = !1, this._decodingState = DecodingState.READY, this._dequantizeInShader = !0, this._isQuantizedDraco = !1, this._isOctEncodedDraco = !1, this._quantizedRange = 0, this._octEncodedRange = 0, this.backFaceCulling = !1, this._backFaceCulling = !1, this.normalShading = !0, this._normalShading = !0, this._opaqueRenderState = void 0, this._translucentRenderState = void 0, this._mode = void 0, this._ready = !1, this._pointsLength = 0, this._geometryByteLength = 0, this._vertexShaderLoaded = e.vertexShaderLoaded, this._fragmentShaderLoaded = e.fragmentShaderLoaded, this._uniformMapLoaded = e.uniformMapLoaded, this._batchTableLoaded = e.batchTableLoaded, this._pickIdLoaded = e.pickIdLoaded, this._opaquePass = defaultValue(e.opaquePass, Pass$1.OPAQUE), this._cull = defaultValue(e.cull, !0), this.style = void 0, this._style = void 0, this.styleDirty = !1, this.modelMatrix = Matrix4.clone(Matrix4.IDENTITY), this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY), this.time = 0, this.shadows = ShadowMode$1.ENABLED, this._boundingSphere = void 0, this.clippingPlanes = void 0, this.isClipped = !1, this.clippingPlanesDirty = !1, this.clippingPlanesOriginMatrix = void 0, this.attenuation = !1, this._attenuation = !1, this.geometricError = 0, this.geometricErrorScale = 1, this.maximumAttenuation = this._pointSize, this.splitDirection = defaultValue( + e.splitDirection, + SplitDirection$1.NONE + ), this._splittingEnabled = !1, this._error = void 0, initialize(this, e); +} +Object.defineProperties(PointCloud.prototype, { + pointsLength: { + get: function() { + return this._pointsLength; + } + }, + geometryByteLength: { + get: function() { + return this._geometryByteLength; + } + }, + ready: { + get: function() { + return this._ready; + } + }, + color: { + get: function() { + return Color.clone(this._highlightColor); + }, + set: function(e) { + this._highlightColor = Color.clone(e, this._highlightColor); + } + }, + boundingSphere: { + get: function() { + if (defined(this._drawCommand)) + return this._drawCommand.boundingVolume; + }, + set: function(e) { + this._boundingSphere = BoundingSphere.clone(e, this._boundingSphere); + } + } +}); +function initialize(e, t) { + const n = PntsParser.parse( + t.arrayBuffer, + t.byteOffset + ); + if (e._parsedContent = n, e._rtcCenter = n.rtcCenter, e._hasNormals = n.hasNormals, e._hasColors = n.hasColors, e._hasBatchIds = n.hasBatchIds, e._isTranslucent = n.isTranslucent, !n.hasBatchIds && defined(n.batchTableBinary) && (n.styleableProperties = Cesium3DTileBatchTable.getBinaryProperties( + n.pointsLength, + n.batchTableJson, + n.batchTableBinary + )), defined(n.draco)) { + const c = n.draco; + e._decodingState = DecodingState.NEEDS_DECODE, c.dequantizeInShader = e._dequantizeInShader; + } + const i = n.positions; + defined(i) && (e._isQuantized = i.isQuantized, e._quantizedVolumeScale = i.quantizedVolumeScale, e._quantizedVolumeOffset = i.quantizedVolumeOffset, e._quantizedRange = i.quantizedRange); + const r = n.normals; + defined(r) && (e._isOctEncoded16P = r.octEncoded); + const o = n.colors; + defined(o) && (defined(o.constantColor) && (e._constantColor = Color.clone( + o.constantColor, + e._constantColor + ), e._hasColors = !1), e._isRGB565 = o.isRGB565); + const s = n.batchIds; + defined(n.batchIds) && (s.name = "BATCH_ID", s.semantic = "BATCH_ID", s.setIndex = void 0), n.hasBatchIds && e._batchTableLoaded( + n.batchLength, + n.batchTableJson, + n.batchTableBinary + ), e._pointsLength = n.pointsLength; +} +const scratchMin = new Cartesian3(), scratchMax = new Cartesian3(), scratchPosition = new Cartesian3(); +let randomNumberGenerator, randomValues; +function getRandomValues(e) { + if (!defined(randomValues)) { + randomNumberGenerator = new MersenneTwister$1(0), randomValues = new Array(e); + for (let t = 0; t < e; ++t) + randomValues[t] = randomNumberGenerator.random(); + } + return randomValues; +} +function computeApproximateBoundingSphereFromPositions(e) { + const n = e.length / 3, i = Math.min(n, 20), r = getRandomValues(20), o = Number.MAX_VALUE, s = -Number.MAX_VALUE, c = Cartesian3.fromElements(o, o, o, scratchMin), l = Cartesian3.fromElements(s, s, s, scratchMax); + for (let f = 0; f < i; ++f) { + const h = Math.floor(r[f] * n), p = Cartesian3.unpack(e, h * 3, scratchPosition); + Cartesian3.minimumByComponent(c, p, c), Cartesian3.maximumByComponent(l, p, l); + } + const d = BoundingSphere.fromCornerPoints(c, l); + return d.radius += CesiumMath.EPSILON2, d; +} +function prepareVertexAttribute(e, t) { + const n = ComponentDatatype$1.fromTypedArray(e); + return n === ComponentDatatype$1.INT || n === ComponentDatatype$1.UNSIGNED_INT || n === ComponentDatatype$1.DOUBLE ? (oneTimeWarning( + "Cast pnts property to floats", + `Point cloud property "${t}" will be cast to a float array because INT, UNSIGNED_INT, and DOUBLE are not valid WebGL vertex attribute types. Some precision may be lost.` + ), new Float32Array(e)) : e; +} +const scratchPointSizeAndTimeAndGeometricErrorAndDepthMultiplier = new Cartesian4(), scratchQuantizedVolumeScaleAndOctEncodedRange = new Cartesian4(), scratchColor$1 = new Color(), positionLocation = 0, colorLocation = 1, normalLocation = 2, batchIdLocation = 3, numberOfAttributes = 4, scratchClippingPlanesMatrix = new Matrix4(), scratchInverseTransposeClippingPlanesMatrix = new Matrix4(); +function createResources(e, t) { + const n = t.context, i = e._parsedContent, r = e._pointsLength, o = i.positions, s = i.colors, c = i.normals, l = i.batchIds, d = i.styleableProperties, f = defined(d), h = e._isQuantized, p = e._isQuantizedDraco, m = e._isOctEncoded16P, _ = e._isOctEncodedDraco, y = e._quantizedRange, C = e._octEncodedRange, T = e._isRGB565, x = e._isTranslucent, b = e._hasColors, S = e._hasNormals, E = e._hasBatchIds; + let A, D; + const P = [], I = {}; + if (e._styleableShaderAttributes = I, f) { + let B = numberOfAttributes; + for (const V in d) + if (d.hasOwnProperty(V)) { + const U = d[V], k = prepareVertexAttribute(U.typedArray, V); + A = U.componentCount, D = ComponentDatatype$1.fromTypedArray(k); + const $ = Buffer.createVertexBuffer({ + context: n, + typedArray: k, + usage: BufferUsage$1.STATIC_DRAW + }); + e._geometryByteLength += $.sizeInBytes; + const G = { + index: B, + vertexBuffer: $, + componentsPerAttribute: A, + componentDatatype: D, + normalize: !1, + offsetInBytes: 0, + strideInBytes: 0 + }; + P.push(G), I[V] = { + location: B, + componentCount: A + }, ++B; + } + } + const M = Buffer.createVertexBuffer({ + context: n, + typedArray: o.typedArray, + usage: BufferUsage$1.STATIC_DRAW + }); + e._geometryByteLength += M.sizeInBytes; + let R; + b && (R = Buffer.createVertexBuffer({ + context: n, + typedArray: s.typedArray, + usage: BufferUsage$1.STATIC_DRAW + }), e._geometryByteLength += R.sizeInBytes); + let L; + S && (L = Buffer.createVertexBuffer({ + context: n, + typedArray: c.typedArray, + usage: BufferUsage$1.STATIC_DRAW + }), e._geometryByteLength += L.sizeInBytes); + let g; + E && (l.typedArray = prepareVertexAttribute( + l.typedArray, + "batchIds" + ), g = Buffer.createVertexBuffer({ + context: n, + typedArray: l.typedArray, + usage: BufferUsage$1.STATIC_DRAW + }), e._geometryByteLength += g.sizeInBytes); + let w = []; + if (h ? D = ComponentDatatype$1.UNSIGNED_SHORT : p ? D = y <= 255 ? ComponentDatatype$1.UNSIGNED_BYTE : ComponentDatatype$1.UNSIGNED_SHORT : D = ComponentDatatype$1.FLOAT, w.push({ + index: positionLocation, + vertexBuffer: M, + componentsPerAttribute: 3, + componentDatatype: D, + normalize: !1, + offsetInBytes: 0, + strideInBytes: 0 + }), e._cull && (h || p ? e._boundingSphere = BoundingSphere.fromCornerPoints( + Cartesian3.ZERO, + e._quantizedVolumeScale + ) : e._boundingSphere = computeApproximateBoundingSphereFromPositions( + o.typedArray + )), b) + if (T) + w.push({ + index: colorLocation, + vertexBuffer: R, + componentsPerAttribute: 1, + componentDatatype: ComponentDatatype$1.UNSIGNED_SHORT, + normalize: !1, + offsetInBytes: 0, + strideInBytes: 0 + }); + else { + const B = x ? 4 : 3; + w.push({ + index: colorLocation, + vertexBuffer: R, + componentsPerAttribute: B, + componentDatatype: ComponentDatatype$1.UNSIGNED_BYTE, + normalize: !0, + offsetInBytes: 0, + strideInBytes: 0 + }); + } + S && (m ? (A = 2, D = ComponentDatatype$1.UNSIGNED_BYTE) : _ ? (A = 2, D = C <= 255 ? ComponentDatatype$1.UNSIGNED_BYTE : ComponentDatatype$1.UNSIGNED_SHORT) : (A = 3, D = ComponentDatatype$1.FLOAT), w.push({ + index: normalLocation, + vertexBuffer: L, + componentsPerAttribute: A, + componentDatatype: D, + normalize: !1, + offsetInBytes: 0, + strideInBytes: 0 + })), E && w.push({ + index: batchIdLocation, + vertexBuffer: g, + componentsPerAttribute: 1, + componentDatatype: ComponentDatatype$1.fromTypedArray(l.typedArray), + normalize: !1, + offsetInBytes: 0, + strideInBytes: 0 + }), f && (w = w.concat(P)); + const O = new VertexArray({ + context: n, + attributes: w + }), N = { + depthTest: { + enabled: !0 + } + }, F = { + depthTest: { + enabled: !0 + }, + depthMask: !1, + blending: BlendingState$1.ALPHA_BLEND + }; + e._opaquePass === Pass$1.CESIUM_3D_TILE && (N.stencilTest = StencilConstants$1.setCesium3DTileBit(), N.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK, F.stencilTest = StencilConstants$1.setCesium3DTileBit(), F.stencilMask = StencilConstants$1.CESIUM_3D_TILE_MASK), e._opaqueRenderState = RenderState.fromCache(N), e._translucentRenderState = RenderState.fromCache( + F + ), e._drawCommand = new DrawCommand({ + boundingVolume: new BoundingSphere(), + cull: e._cull, + modelMatrix: new Matrix4(), + primitiveType: PrimitiveType$1.POINTS, + vertexArray: O, + count: r, + shaderProgram: void 0, + // Updated in createShaders + uniformMap: void 0, + // Updated in createShaders + renderState: x ? e._translucentRenderState : e._opaqueRenderState, + pass: x ? Pass$1.TRANSLUCENT : e._opaquePass, + owner: e, + castShadows: !1, + receiveShadows: !1, + pickId: e._pickIdLoaded() + }); +} +function createUniformMap(e, t) { + const n = t.context, i = e._isQuantized, r = e._isQuantizedDraco, o = e._isOctEncodedDraco; + let s = { + u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier: function() { + const c = scratchPointSizeAndTimeAndGeometricErrorAndDepthMultiplier; + if (c.x = e._attenuation ? e.maximumAttenuation : e._pointSize, c.x *= t.pixelRatio, c.y = e.time, e._attenuation) { + const l = t.camera.frustum; + let d; + t.mode === SceneMode$1.SCENE2D || l instanceof OrthographicFrustum ? d = Number.POSITIVE_INFINITY : d = n.drawingBufferHeight / t.camera.frustum.sseDenominator, c.z = e.geometricError * e.geometricErrorScale, c.w = d; + } + return c; + }, + u_highlightColor: function() { + return e._highlightColor; + }, + u_constantColor: function() { + return e._constantColor; + }, + u_clippingPlanes: function() { + const c = e.clippingPlanes; + return e.isClipped ? c.texture : n.defaultTexture; + }, + u_clippingPlanesEdgeStyle: function() { + const c = e.clippingPlanes; + if (!defined(c)) + return Color.TRANSPARENT; + const l = Color.clone(c.edgeColor, scratchColor$1); + return l.alpha = c.edgeWidth, l; + }, + u_clippingPlanesMatrix: function() { + const c = e.clippingPlanes; + if (!defined(c)) + return Matrix4.IDENTITY; + const l = defaultValue( + e.clippingPlanesOriginMatrix, + e._modelMatrix + ); + Matrix4.multiply( + n.uniformState.view3D, + l, + scratchClippingPlanesMatrix + ); + const d = Matrix4.multiply( + scratchClippingPlanesMatrix, + c.modelMatrix, + scratchClippingPlanesMatrix + ); + return Matrix4.inverseTranspose( + d, + scratchInverseTransposeClippingPlanesMatrix + ); + } + }; + Splitter.addUniforms(e, s), (i || r || o) && (s = combine$2(s, { + u_quantizedVolumeScaleAndOctEncodedRange: function() { + const c = scratchQuantizedVolumeScaleAndOctEncodedRange; + if (defined(e._quantizedVolumeScale)) { + const l = Cartesian3.clone( + e._quantizedVolumeScale, + c + ); + Cartesian3.divideByScalar(l, e._quantizedRange, c); + } + return c.w = e._octEncodedRange, c; + } + })), defined(e._uniformMapLoaded) && (s = e._uniformMapLoaded(s)), e._drawCommand.uniformMap = s; +} +function getStyleablePropertyIds(e, t) { + const n = /czm_3dtiles_property_(\d+)/g; + let i = n.exec(e); + for (; i !== null; ) { + const r = parseInt(i[1]); + t.indexOf(r) === -1 && t.push(r), i = n.exec(e); + } +} +function getBuiltinPropertyNames(e, t) { + e = e.slice(e.indexOf(` +`)); + const n = /czm_3dtiles_builtin_property_(\w+)/g; + let i = n.exec(e); + for (; i !== null; ) { + const r = i[1]; + t.indexOf(r) === -1 && t.push(r), i = n.exec(e); + } +} +function getVertexAttribute(e, t) { + const n = e.numberOfAttributes; + for (let i = 0; i < n; ++i) { + const r = e.getAttribute(i); + if (r.index === t) + return r; + } +} +const builtinVariableSubstitutionMap = { + POSITION: "czm_3dtiles_builtin_property_POSITION", + POSITION_ABSOLUTE: "czm_3dtiles_builtin_property_POSITION_ABSOLUTE", + COLOR: "czm_3dtiles_builtin_property_COLOR", + NORMAL: "czm_3dtiles_builtin_property_NORMAL" +}; +function createShaders(e, t, n) { + let i, r, o; + const s = t.context, c = defined(n), l = e._isQuantized, d = e._isQuantizedDraco, f = e._isOctEncoded16P, h = e._isOctEncodedDraco, p = e._isRGB565, m = e._isTranslucent, _ = e._hasColors, y = e._hasNormals, C = e._hasBatchIds, T = e._backFaceCulling, x = e._normalShading, b = e._drawCommand.vertexArray, S = e.clippingPlanes, E = e._attenuation; + let A, D, P, I = m; + const M = clone$1(builtinVariableSubstitutionMap), R = {}, L = e._styleableShaderAttributes; + for (r in L) + L.hasOwnProperty(r) && (o = L[r], M[r] = `czm_3dtiles_property_${o.location}`, R[o.location] = o); + if (c) { + const K = { + translucent: !1 + }, Z = "(vec3 czm_3dtiles_builtin_property_POSITION, vec3 czm_3dtiles_builtin_property_POSITION_ABSOLUTE, vec4 czm_3dtiles_builtin_property_COLOR, vec3 czm_3dtiles_builtin_property_NORMAL)"; + A = n.getColorShaderFunction( + `getColorFromStyle${Z}`, + M, + K + ), D = n.getShowShaderFunction( + `getShowFromStyle${Z}`, + M, + K + ), P = n.getPointSizeShaderFunction( + `getPointSizeFromStyle${Z}`, + M, + K + ), defined(A) && K.translucent && (I = !0); + } + e._styleTranslucent = I; + const g = defined(A), w = defined(D), O = defined(P), N = e.isClipped, F = [], B = []; + g && (getStyleablePropertyIds(A, F), getBuiltinPropertyNames(A, B)), w && (getStyleablePropertyIds(D, F), getBuiltinPropertyNames(D, B)), O && (getStyleablePropertyIds(P, F), getBuiltinPropertyNames(P, B)); + const V = B.indexOf("COLOR") >= 0, U = B.indexOf("NORMAL") >= 0; + if (U && !y) + throw new RuntimeError( + "Style references the NORMAL semantic but the point cloud does not have normals" + ); + for (r in L) + if (L.hasOwnProperty(r)) { + o = L[r]; + const K = F.indexOf(o.location) >= 0, Z = getVertexAttribute( + b, + o.location + ); + Z.enabled = K; + } + const k = _ && (!g || V); + if (_) { + const K = getVertexAttribute(b, colorLocation); + K.enabled = k; + } + const $ = y && (x || T || U); + if (y) { + const K = getVertexAttribute( + b, + normalLocation + ); + K.enabled = $; + } + const G = { + a_position: positionLocation + }; + k && (G.a_color = colorLocation), $ && (G.a_normal = normalLocation), C && (G.a_batchId = batchIdLocation); + let q = ""; + const z = F.length; + for (i = 0; i < z; ++i) { + const K = F[i]; + o = R[K]; + const Z = o.componentCount, ee = `czm_3dtiles_property_${K}`; + let oe; + Z === 1 ? oe = "float" : oe = `vec${Z}`, q += `in ${oe} ${ee}; +`, G[ee] = o.location; + } + createUniformMap(e, t); + let H = `in vec3 a_position; +out vec4 v_color; +uniform vec4 u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier; +uniform vec4 u_constantColor; +uniform vec4 u_highlightColor; +`; + H += `float u_pointSize; +float tiles3d_tileset_time; +`, E && (H += `float u_geometricError; +float u_depthMultiplier; +`), H += q, k && (m ? H += `in vec4 a_color; +` : p ? H += `in float a_color; +const float SHIFT_RIGHT_11 = 1.0 / 2048.0; +const float SHIFT_RIGHT_5 = 1.0 / 32.0; +const float SHIFT_LEFT_11 = 2048.0; +const float SHIFT_LEFT_5 = 32.0; +const float NORMALIZE_6 = 1.0 / 64.0; +const float NORMALIZE_5 = 1.0 / 32.0; +` : H += `in vec3 a_color; +`), $ && (f || h ? H += `in vec2 a_normal; +` : H += `in vec3 a_normal; +`), C && (H += `in float a_batchId; +`), (l || d || h) && (H += `uniform vec4 u_quantizedVolumeScaleAndOctEncodedRange; +`), g && (H += A), w && (H += D), O && (H += P), H += `void main() +{ + u_pointSize = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.x; + tiles3d_tileset_time = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.y; +`, E && (H += ` u_geometricError = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.z; + u_depthMultiplier = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.w; +`), k ? m ? H += ` vec4 color = a_color; +` : p ? H += ` float compressed = a_color; + float r = floor(compressed * SHIFT_RIGHT_11); + compressed -= r * SHIFT_LEFT_11; + float g = floor(compressed * SHIFT_RIGHT_5); + compressed -= g * SHIFT_LEFT_5; + float b = compressed; + vec3 rgb = vec3(r * NORMALIZE_5, g * NORMALIZE_6, b * NORMALIZE_5); + vec4 color = vec4(rgb, 1.0); +` : H += ` vec4 color = vec4(a_color, 1.0); +` : H += ` vec4 color = u_constantColor; +`, l || d ? H += ` vec3 position = a_position * u_quantizedVolumeScaleAndOctEncodedRange.xyz; +` : H += ` vec3 position = a_position; +`, H += ` vec3 position_absolute = vec3(czm_model * vec4(position, 1.0)); +`, $ ? (f ? H += ` vec3 normal = czm_octDecode(a_normal); +` : h ? H += ` vec3 normal = czm_octDecode(a_normal, u_quantizedVolumeScaleAndOctEncodedRange.w).zxy; +` : H += ` vec3 normal = a_normal; +`, H += ` vec3 normalEC = czm_normal * normal; +`) : H += ` vec3 normal = vec3(1.0); +`, g && (H += ` color = getColorFromStyle(position, position_absolute, color, normal); +`), w && (H += ` float show = float(getShowFromStyle(position, position_absolute, color, normal)); +`), O ? H += ` gl_PointSize = getPointSizeFromStyle(position, position_absolute, color, normal) * czm_pixelRatio; +` : E ? H += ` vec4 positionEC = czm_modelView * vec4(position, 1.0); + float depth = -positionEC.z; + gl_PointSize = min((u_geometricError / depth) * u_depthMultiplier, u_pointSize); +` : H += ` gl_PointSize = u_pointSize; +`, H += ` color = color * u_highlightColor; +`, $ && x && (H += ` float diffuseStrength = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC); + diffuseStrength = max(diffuseStrength, 0.4); + color.xyz *= diffuseStrength * czm_lightColor; +`), H += ` v_color = color; + gl_Position = czm_modelViewProjection * vec4(position, 1.0); +`, $ && T && (H += ` float visible = step(-normalEC.z, 0.0); + gl_Position *= visible; + gl_PointSize *= visible; +`), w && (H += ` gl_Position.w *= float(show); + gl_PointSize *= float(show); +`), H += `} +`; + let Q = `in vec4 v_color; +`; + N && (Q += `uniform highp sampler2D u_clippingPlanes; +uniform mat4 u_clippingPlanesMatrix; +uniform vec4 u_clippingPlanesEdgeStyle; +`, Q += ` +`, Q += getClippingFunction(S, s), Q += ` +`), Q += `void main() +{ + out_FragColor = czm_gammaCorrect(v_color); +`, N && (Q += getClipAndStyleCode( + "u_clippingPlanes", + "u_clippingPlanesMatrix", + "u_clippingPlanesEdgeStyle" + )), Q += `} +`, e.splitDirection !== SplitDirection$1.NONE && (Q = Splitter.modifyFragmentShader(Q)), defined(e._vertexShaderLoaded) && (H = e._vertexShaderLoaded(H)), defined(e._fragmentShaderLoaded) && (Q = e._fragmentShaderLoaded(Q)); + const ne = e._drawCommand; + defined(ne.shaderProgram) && ne.shaderProgram.destroy(), ne.shaderProgram = ShaderProgram.fromCache({ + context: s, + vertexShaderSource: H, + fragmentShaderSource: Q, + attributeLocations: G + }); + try { + ne.shaderProgram._bind(); + } catch { + throw new RuntimeError( + "Error generating style shader: this may be caused by a type mismatch, index out-of-bounds, or other syntax error." + ); + } +} +function decodeDraco(e, t) { + if (e._decodingState === DecodingState.READY) + return !1; + if (e._decodingState === DecodingState.NEEDS_DECODE) { + const n = e._parsedContent, i = n.draco, r = DracoLoader.decodePointCloud(i, t); + defined(r) && (e._decodingState = DecodingState.DECODING, r.then(function(o) { + e._decodingState = DecodingState.READY; + const s = defined(o.POSITION) ? o.POSITION.array : void 0, c = defined(o.RGB) ? o.RGB.array : void 0, l = defined(o.RGBA) ? o.RGBA.array : void 0, d = defined(o.NORMAL) ? o.NORMAL.array : void 0, f = defined(o.BATCH_ID) ? o.BATCH_ID.array : void 0, h = defined(s) && defined(o.POSITION.data.quantization), p = defined(d) && defined(o.NORMAL.data.quantization); + if (h) { + const C = o.POSITION.data.quantization, T = C.range; + e._quantizedVolumeScale = Cartesian3.fromElements( + T, + T, + T + ), e._quantizedVolumeOffset = Cartesian3.unpack( + C.minValues + ), e._quantizedRange = (1 << C.quantizationBits) - 1, e._isQuantizedDraco = !0; + } + p && (e._octEncodedRange = (1 << o.NORMAL.data.quantization.quantizationBits) - 1, e._isOctEncodedDraco = !0); + let m = n.styleableProperties; + const _ = i.batchTableProperties; + for (const C in _) + if (_.hasOwnProperty(C)) { + const T = o[C]; + defined(m) || (m = {}), m[C] = { + typedArray: T.array, + componentCount: T.data.componentsPerAttribute + }; + } + defined(s) && (n.positions = { + typedArray: s + }); + const y = defaultValue(l, c); + defined(y) && (n.colors = { + typedArray: y + }), defined(d) && (n.normals = { + typedArray: d + }), defined(f) && (n.batchIds = { + typedArray: f + }), n.styleableProperties = m; + }).catch(function(o) { + e._decodingState = DecodingState.FAILED, e._error = o; + })); + } + return !0; +} +const scratchComputedTranslation = new Cartesian4(), scratchScale = new Cartesian3(); +PointCloud.prototype.update = function(e) { + const t = e.context; + if (defined(this._error)) { + const d = this._error; + throw this._error = void 0, d; + } + if (decodeDraco(this, t)) + return; + let i = !1, r = !Matrix4.equals(this._modelMatrix, this.modelMatrix); + if (this._mode !== e.mode && (this._mode = e.mode, r = !0), defined(this._drawCommand) || (createResources(this, e), r = !0, i = !0, this._ready = !0, this._parsedContent = void 0), r) { + Matrix4.clone(this.modelMatrix, this._modelMatrix); + const d = this._drawCommand.modelMatrix; + if (Matrix4.clone(this._modelMatrix, d), defined(this._rtcCenter) && Matrix4.multiplyByTranslation(d, this._rtcCenter, d), defined(this._quantizedVolumeOffset) && Matrix4.multiplyByTranslation( + d, + this._quantizedVolumeOffset, + d + ), e.mode !== SceneMode$1.SCENE3D) { + const h = e.mapProjection, p = Matrix4.getColumn( + d, + 3, + scratchComputedTranslation + ); + Cartesian4.equals(p, Cartesian4.UNIT_W) || Transforms.basisTo2D(h, d, d); + } + const f = this._drawCommand.boundingVolume; + if (BoundingSphere.clone(this._boundingSphere, f), this._cull) { + const h = f.center; + Matrix4.multiplyByPoint(d, h, h); + const p = Matrix4.getScale(d, scratchScale); + f.radius *= Cartesian3.maximumComponent(p); + } + } + this.clippingPlanesDirty && (this.clippingPlanesDirty = !1, i = !0), this._attenuation !== this.attenuation && (this._attenuation = this.attenuation, i = !0), this.backFaceCulling !== this._backFaceCulling && (this._backFaceCulling = this.backFaceCulling, i = !0), this.normalShading !== this._normalShading && (this._normalShading = this.normalShading, i = !0), (this._style !== this.style || this.styleDirty) && (this._style = this.style, this.styleDirty = !1, i = !0); + const o = this.splitDirection !== SplitDirection$1.NONE; + this._splittingEnabled !== o && (this._splittingEnabled = o, i = !0), i && createShaders(this, e, this._style), this._drawCommand.castShadows = ShadowMode$1.castShadows(this.shadows), this._drawCommand.receiveShadows = ShadowMode$1.receiveShadows(this.shadows); + const s = this._highlightColor.alpha < 1 || this._constantColor.alpha < 1 || this._styleTranslucent; + this._drawCommand.renderState = s ? this._translucentRenderState : this._opaqueRenderState, this._drawCommand.pass = s ? Pass$1.TRANSLUCENT : this._opaquePass; + const c = e.commandList, l = e.passes; + (l.render || l.pick) && c.push(this._drawCommand); +}; +PointCloud.prototype.isDestroyed = function() { + return !1; +}; +PointCloud.prototype.destroy = function() { + const e = this._drawCommand; + return defined(e) && (e.vertexArray = e.vertexArray && e.vertexArray.destroy(), e.shaderProgram = e.shaderProgram && e.shaderProgram.destroy()), destroyObject(this); +}; +function QuadtreeTileProvider() { + DeveloperError.throwInstantiationError(); +} +QuadtreeTileProvider.computeDefaultLevelZeroMaximumGeometricError = function(e) { + return e.ellipsoid.maximumRadius * 2 * Math.PI * 0.25 / (65 * e.getNumberOfXTilesAtLevel(0)); +}; +Object.defineProperties(QuadtreeTileProvider.prototype, { + /** + * Gets or sets the {@link QuadtreePrimitive} for which this provider is + * providing tiles. + * @memberof QuadtreeTileProvider.prototype + * @type {QuadtreePrimitive} + */ + quadtree: { + get: DeveloperError.throwInstantiationError, + set: DeveloperError.throwInstantiationError + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof QuadtreeTileProvider.prototype + * @type {TilingScheme} + */ + tilingScheme: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets an event that is raised when the geometry provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof QuadtreeTileProvider.prototype + * @type {Event} + */ + errorEvent: { + get: DeveloperError.throwInstantiationError + } +}); +QuadtreeTileProvider.prototype.update = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.beginUpdate = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.endUpdate = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.getLevelMaximumGeometricError = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.loadTile = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.computeTileVisibility = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.showTileThisFrame = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.computeDistanceToTile = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.isDestroyed = DeveloperError.throwInstantiationError; +QuadtreeTileProvider.prototype.destroy = DeveloperError.throwInstantiationError; +function SphereEmitter(e) { + e = defaultValue(e, 1), this._radius = defaultValue(e, 1); +} +Object.defineProperties(SphereEmitter.prototype, { + /** + * The radius of the sphere in meters. + * @memberof SphereEmitter.prototype + * @type {number} + * @default 1.0 + */ + radius: { + get: function() { + return this._radius; + }, + set: function(e) { + this._radius = e; + } + } +}); +SphereEmitter.prototype.emit = function(e) { + const t = CesiumMath.randomBetween(0, CesiumMath.TWO_PI), n = CesiumMath.randomBetween(0, CesiumMath.PI), i = CesiumMath.randomBetween(0, this._radius), r = i * Math.cos(t) * Math.sin(n), o = i * Math.sin(t) * Math.sin(n), s = i * Math.cos(n); + e.position = Cartesian3.fromElements(r, o, s, e.position), e.velocity = Cartesian3.normalize( + e.position, + e.velocity + ); +}; +function StyleExpression() { +} +StyleExpression.prototype.evaluate = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +StyleExpression.prototype.evaluateColor = function(e, t) { + DeveloperError.throwInstantiationError(); +}; +StyleExpression.prototype.getShaderFunction = function(e, t, n, i) { + DeveloperError.throwInstantiationError(); +}; +StyleExpression.prototype.getVariables = function() { + DeveloperError.throwInstantiationError(); +}; +function Terrain(e) { + this._ready = !1, this._provider = void 0, this._errorEvent = new Event(), this._readyEvent = new Event(), handlePromise(this, e); +} +Object.defineProperties(Terrain.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of the thrown error. + * @memberof Terrain.prototype + * @type {Event<Terrain.ErrorEventCallback>} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets an event that is raised when the terrain provider has been successfully created. Event listeners + * are passed the created instance of {@link TerrainProvider}. + * @memberof Terrain.prototype + * @type {Event<Terrain.ReadyEventCallback>} + * @readonly + */ + readyEvent: { + get: function() { + return this._readyEvent; + } + }, + /** + * Returns true when the terrain provider has been successfully created. Otherwise, returns false. + * @memberof Terrain.prototype + * + * @type {boolean} + * @readonly + */ + ready: { + get: function() { + return this._ready; + } + }, + /** + * The terrain provider providing surface geometry to a globe. Do not use until {@link Terrain.readyEvent} is raised. + * @memberof Terrain.prototype + * + * @type {TerrainProvider} + * @readonly + */ + provider: { + get: function() { + return this._provider; + } + } +}); +Terrain.fromWorldTerrain = function(e) { + return new Terrain(createWorldTerrainAsync(e)); +}; +Terrain.fromWorldBathymetry = function(e) { + return new Terrain(createWorldBathymetryAsync(e)); +}; +function handleError(e, t) { + e.numberOfListeners > 0 ? e.raiseEvent(t) : console.error(t); +} +async function handlePromise(e, t) { + let n; + try { + n = await Promise.resolve(t), e._provider = n, e._ready = !0, e._readyEvent.raiseEvent(n); + } catch (i) { + handleError(e._errorEvent, i); + } +} +function TileBoundingVolume() { +} +TileBoundingVolume.prototype.boundingVolume = void 0; +TileBoundingVolume.prototype.boundingSphere = void 0; +TileBoundingVolume.prototype.distanceToCamera = function(e) { + DeveloperError.throwInstantiationError(); +}; +TileBoundingVolume.prototype.intersectPlane = function(e) { + DeveloperError.throwInstantiationError(); +}; +TileBoundingVolume.prototype.createDebugVolume = function(e) { + DeveloperError.throwInstantiationError(); +}; +function TileCoordinatesImageryProvider(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this._tilingScheme = defined(e.tilingScheme) ? e.tilingScheme : new GeographicTilingScheme({ ellipsoid: e.ellipsoid }), this._color = defaultValue(e.color, Color.YELLOW), this._errorEvent = new Event(), this._tileWidth = defaultValue(e.tileWidth, 256), this._tileHeight = defaultValue(e.tileHeight, 256), this._defaultAlpha = void 0, this._defaultNightAlpha = void 0, this._defaultDayAlpha = void 0, this._defaultBrightness = void 0, this._defaultContrast = void 0, this._defaultHue = void 0, this._defaultSaturation = void 0, this._defaultGamma = void 0, this._defaultMinificationFilter = void 0, this._defaultMagnificationFilter = void 0; +} +Object.defineProperties(TileCoordinatesImageryProvider.prototype, { + /** + * Gets the proxy used by this provider. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {Proxy} + * @readonly + */ + proxy: { + get: function() { + } + }, + /** + * Gets the width of each tile, in pixels. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {number} + * @readonly + */ + tileWidth: { + get: function() { + return this._tileWidth; + } + }, + /** + * Gets the height of each tile, in pixels. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {number} + * @readonly + */ + tileHeight: { + get: function() { + return this._tileHeight; + } + }, + /** + * Gets the maximum level-of-detail that can be requested. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumLevel: { + get: function() { + } + }, + /** + * Gets the minimum level-of-detail that can be requested. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {number} + * @readonly + */ + minimumLevel: { + get: function() { + } + }, + /** + * Gets the tiling scheme used by this provider. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: function() { + return this._tilingScheme; + } + }, + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {Rectangle} + * @readonly + */ + rectangle: { + get: function() { + return this._tilingScheme.rectangle; + } + }, + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {TileDiscardPolicy} + * @readonly + */ + tileDiscardPolicy: { + get: function() { + } + }, + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: function() { + return this._errorEvent; + } + }, + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: function() { + } + }, + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {boolean} + * @readonly + */ + hasAlphaChannel: { + get: function() { + return !0; + } + } +}); +TileCoordinatesImageryProvider.prototype.getTileCredits = function(e, t, n) { +}; +TileCoordinatesImageryProvider.prototype.requestImage = function(e, t, n, i) { + const r = document.createElement("canvas"); + r.width = 256, r.height = 256; + const o = r.getContext("2d"), s = this._color.toCssColorString(); + return o.strokeStyle = s, o.lineWidth = 2, o.strokeRect(1, 1, 255, 255), o.font = "bold 25px Arial", o.textAlign = "center", o.fillStyle = s, o.fillText(`L: ${n}`, 124, 86), o.fillText(`X: ${e}`, 124, 136), o.fillText(`Y: ${t}`, 124, 186), Promise.resolve(r); +}; +TileCoordinatesImageryProvider.prototype.pickFeatures = function(e, t, n, i, r) { +}; +function TileDiscardPolicy(e) { + DeveloperError.throwInstantiationError(); +} +TileDiscardPolicy.prototype.isReady = DeveloperError.throwInstantiationError; +TileDiscardPolicy.prototype.shouldDiscardImage = DeveloperError.throwInstantiationError; +const TileState = { + START: 0, + LOADING: 1, + READY: 2, + UPSAMPLED_ONLY: 3 +}, TileState$1 = Object.freeze(TileState); +function TimeDynamicPointCloud(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.show = defaultValue(e.show, !0), this.modelMatrix = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), this.shadows = defaultValue(e.shadows, ShadowMode$1.ENABLED), this.maximumMemoryUsage = defaultValue(e.maximumMemoryUsage, 256), this.shading = new PointCloudShading(e.shading), this.style = e.style, this.frameFailed = new Event(), this.frameChanged = new Event(), this._clock = e.clock, this._intervals = e.intervals, this._clippingPlanes = void 0, this.clippingPlanes = e.clippingPlanes, this._pointCloudEyeDomeLighting = new PointCloudEyeDomeLighting(), this._loadTimestamp = void 0, this._clippingPlanesState = 0, this._styleDirty = !1, this._pickId = void 0, this._totalMemoryUsageInBytes = 0, this._frames = [], this._previousInterval = void 0, this._nextInterval = void 0, this._lastRenderedFrame = void 0, this._clockMultiplier = 0, this._runningSum = 0, this._runningLength = 0, this._runningIndex = 0, this._runningSamples = new Array(5).fill(0), this._runningAverage = 0; +} +Object.defineProperties(TimeDynamicPointCloud.prototype, { + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the point cloud. + * + * @memberof TimeDynamicPointCloud.prototype + * + * @type {ClippingPlaneCollection} + */ + clippingPlanes: { + get: function() { + return this._clippingPlanes; + }, + set: function(e) { + ClippingPlaneCollection.setOwner(e, this, "_clippingPlanes"); + } + }, + /** + * The total amount of GPU memory in bytes used by the point cloud. + * + * @memberof TimeDynamicPointCloud.prototype + * + * @type {number} + * @readonly + * + * @see TimeDynamicPointCloud#maximumMemoryUsage + */ + totalMemoryUsageInBytes: { + get: function() { + return this._totalMemoryUsageInBytes; + } + }, + /** + * The bounding sphere of the frame being rendered. Returns <code>undefined</code> if no frame is being rendered. + * + * @memberof TimeDynamicPointCloud.prototype + * + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: function() { + if (defined(this._lastRenderedFrame)) + return this._lastRenderedFrame.pointCloud.boundingSphere; + } + } +}); +function getFragmentShaderLoaded(e) { + return `uniform vec4 czm_pickColor; +${e}`; +} +function getUniformMapLoaded(e) { + return function(t) { + return combine$2(t, { + czm_pickColor: function() { + return e._pickId.color; + } + }); + }; +} +function getPickIdLoaded() { + return "czm_pickColor"; +} +TimeDynamicPointCloud.prototype.makeStyleDirty = function() { + this._styleDirty = !0; +}; +TimeDynamicPointCloud.prototype._getAverageLoadTime = function() { + return this._runningLength === 0 ? 0.05 : this._runningAverage; +}; +const scratchDate = new JulianDate(); +function getClockMultiplier(e) { + const t = e._clock, n = t.canAnimate && t.shouldAnimate, i = t.multiplier; + return n ? i : 0; +} +function getIntervalIndex(e, t) { + return e._intervals.indexOf(t.start); +} +function getNextInterval(e, t) { + const n = e._intervals, i = e._clock, r = getClockMultiplier(e); + if (r === 0) + return; + const o = e._getAverageLoadTime(), s = JulianDate.addSeconds( + i.currentTime, + o * r, + scratchDate + ); + let c = n.indexOf(s); + const l = getIntervalIndex(e, t); + return c === l && (r >= 0 ? ++c : --c), n.get(c); +} +function getCurrentInterval(e) { + const t = e._intervals, i = e._clock.currentTime, r = t.indexOf(i); + return t.get(r); +} +function reachedInterval(e, t, n) { + const i = getClockMultiplier(e), r = getIntervalIndex(e, t), o = getIntervalIndex(e, n); + return i >= 0 ? r >= o : r <= o; +} +function handleFrameFailure(e, t) { + return function(n) { + const i = defined(n.message) ? n.message : n.toString(); + e.frameFailed.numberOfListeners > 0 ? e.frameFailed.raiseEvent({ + uri: t, + message: i + }) : (console.log(`A frame failed to load: ${t}`), console.log(`Error: ${i}`)); + }; +} +function requestFrame(e, t, n) { + const i = getIntervalIndex(e, t), r = e._frames; + let o = r[i]; + if (!defined(o)) { + const s = t.data.transform, c = defined(s) ? Matrix4.fromArray(s) : void 0, l = t.data.uri; + o = { + pointCloud: void 0, + transform: c, + timestamp: getTimestamp$1(), + sequential: !0, + ready: !1, + touchedFrameNumber: n.frameNumber, + uri: l + }, r[i] = o, Resource.fetchArrayBuffer({ + url: l + }).then(function(d) { + o.pointCloud = new PointCloud({ + arrayBuffer: d, + cull: !0, + fragmentShaderLoaded: getFragmentShaderLoaded, + uniformMapLoaded: getUniformMapLoaded(e), + pickIdLoaded: getPickIdLoaded + }); + }).catch(handleFrameFailure(e, l)); + } + return o; +} +function updateAverageLoadTime(e, t) { + e._runningSum += t, e._runningSum -= e._runningSamples[e._runningIndex], e._runningSamples[e._runningIndex] = t, e._runningLength = Math.min( + e._runningLength + 1, + e._runningSamples.length + ), e._runningIndex = (e._runningIndex + 1) % e._runningSamples.length, e._runningAverage = e._runningSum / e._runningLength; +} +function prepareFrame(e, t, n, i) { + t.touchedFrameNumber < i.frameNumber - 1 && (t.sequential = !1); + const r = t.pointCloud; + if (defined(r) && !t.ready) { + const o = i.commandList, s = o.length; + if (renderFrame(e, t, n, i), r.ready && (t.ready = !0, e._totalMemoryUsageInBytes += r.geometryByteLength, o.length = s, t.sequential)) { + const c = (getTimestamp$1() - t.timestamp) / 1e3; + updateAverageLoadTime(e, c); + } + } + t.touchedFrameNumber = i.frameNumber; +} +const scratchModelMatrix = new Matrix4(); +function getGeometricError(e, t) { + const n = e.shading; + return defined(n) && defined(n.baseResolution) ? n.baseResolution : defined(t.boundingSphere) ? CesiumMath.cbrt( + t.boundingSphere.volume() / t.pointsLength + ) : 0; +} +function getMaximumAttenuation(e) { + const t = e.shading; + return defined(t) && defined(t.maximumAttenuation) ? t.maximumAttenuation : 10; +} +const defaultShading = new PointCloudShading(); +function renderFrame(e, t, n, i) { + const r = defaultValue(e.shading, defaultShading), o = t.pointCloud, s = defaultValue(t.transform, Matrix4.IDENTITY); + o.modelMatrix = Matrix4.multiplyTransformation( + e.modelMatrix, + s, + scratchModelMatrix + ), o.style = e.style, o.time = n.timeSinceLoad, o.shadows = e.shadows, o.clippingPlanes = e._clippingPlanes, o.isClipped = n.isClipped, o.attenuation = r.attenuation, o.backFaceCulling = r.backFaceCulling, o.normalShading = r.normalShading, o.geometricError = getGeometricError(e, o), o.geometricErrorScale = r.geometricErrorScale, o.maximumAttenuation = getMaximumAttenuation(e); + try { + o.update(i); + } catch (c) { + handleFrameFailure(e, t.uri)(c); + } + t.touchedFrameNumber = i.frameNumber; +} +function loadFrame(e, t, n, i) { + const r = requestFrame(e, t, i); + prepareFrame(e, r, n, i); +} +function getUnloadCondition(e) { + return function(t) { + return t.touchedFrameNumber < e.frameNumber; + }; +} +function unloadFrames(e, t) { + const n = e._frames, i = n.length; + for (let r = 0; r < i; ++r) { + const o = n[r]; + if (defined(o) && (!defined(t) || t(o))) { + const s = o.pointCloud; + o.ready && (e._totalMemoryUsageInBytes -= s.geometryByteLength), defined(s) && s.destroy(), o === e._lastRenderedFrame && (e._lastRenderedFrame = void 0), n[r] = void 0; + } + } +} +function getFrame(e, t) { + const n = getIntervalIndex(e, t), i = e._frames[n]; + if (defined(i) && i.ready) + return i; +} +function updateInterval(e, t, n, i, r) { + return defined(n) ? n.ready ? !0 : (loadFrame(e, t, i, r), n.ready) : !1; +} +function getNearestReadyInterval(e, t, n, i, r) { + let o, s, c; + const l = e._intervals, d = e._frames, f = getIntervalIndex(e, n), h = getIntervalIndex(e, t); + if (f >= h) { + for (o = f; o >= h; --o) + if (s = l.get(o), c = d[o], updateInterval(e, s, c, i, r)) + return s; + } else + for (o = f; o <= h; ++o) + if (s = l.get(o), c = d[o], updateInterval(e, s, c, i, r)) + return s; + return t; +} +function setFramesDirty(e, t, n) { + const i = e._frames, r = i.length; + for (let o = 0; o < r; ++o) { + const s = i[o]; + defined(s) && defined(s.pointCloud) && (s.pointCloud.clippingPlanesDirty = t, s.pointCloud.styleDirty = n); + } +} +const updateState = { + timeSinceLoad: 0, + isClipped: !1, + clippingPlanesDirty: !1 +}; +TimeDynamicPointCloud.prototype.update = function(e) { + if (e.mode === SceneMode$1.MORPHING || !this.show) + return; + defined(this._pickId) || (this._pickId = e.context.createPickId({ + primitive: this + })), defined(this._loadTimestamp) || (this._loadTimestamp = JulianDate.clone(e.time)); + const t = Math.max( + JulianDate.secondsDifference(e.time, this._loadTimestamp) * 1e3, + 0 + ), n = this._clippingPlanes; + let i = 0, r = !1; + const o = defined(n) && n.enabled; + o && (n.update(e), i = n.clippingPlanesState), this._clippingPlanesState !== i && (this._clippingPlanesState = i, r = !0); + const s = this._styleDirty; + this._styleDirty = !1, (r || s) && setFramesDirty(this, r, s), updateState.timeSinceLoad = t, updateState.isClipped = o; + const c = this.shading, l = this._pointCloudEyeDomeLighting, d = e.commandList, f = d.length; + let h = this._previousInterval, p = this._nextInterval; + const m = getCurrentInterval(this); + if (!defined(m)) + return; + let _ = !1; + const y = getClockMultiplier(this), C = y === 0; + y !== this._clockMultiplier && (_ = !0, this._clockMultiplier = y), (!defined(h) || C) && (h = m), (!defined(p) || _ || reachedInterval(this, m, p)) && (p = getNextInterval(this, m)), h = getNearestReadyInterval( + this, + h, + m, + updateState, + e + ); + let T = getFrame(this, h); + defined(T) || (loadFrame(this, h, updateState, e), T = this._lastRenderedFrame), defined(T) && renderFrame(this, T, updateState, e), defined(p) && loadFrame(this, p, updateState, e); + const x = this; + defined(T) && !defined(this._lastRenderedFrame) && e.afterRender.push(function() { + return !0; + }), defined(T) && T !== this._lastRenderedFrame && x.frameChanged.numberOfListeners > 0 && e.afterRender.push(function() { + return x.frameChanged.raiseEvent(x), !0; + }), this._previousInterval = h, this._nextInterval = p, this._lastRenderedFrame = T; + const b = this._totalMemoryUsageInBytes, S = this.maximumMemoryUsage * 1024 * 1024; + b > S && unloadFrames(this, getUnloadCondition(e)); + const A = d.length - f; + defined(c) && c.attenuation && c.eyeDomeLighting && A > 0 && l.update( + e, + f, + c, + this.boundingSphere + ); +}; +TimeDynamicPointCloud.prototype.isDestroyed = function() { + return !1; +}; +TimeDynamicPointCloud.prototype.destroy = function() { + return unloadFrames(this), this._clippingPlanes = this._clippingPlanes && this._clippingPlanes.destroy(), this._pickId = this._pickId && this._pickId.destroy(), destroyObject(this); +}; +function ViewportQuad(e, t) { + this.show = !0, defined(e) || (e = new BoundingRectangle()), this.rectangle = BoundingRectangle.clone(e), defined(t) || (t = Material$4.fromType(Material$4.ColorType, { + color: new Color(1, 1, 1, 1) + })), this.material = t, this._material = void 0, this._overlayCommand = void 0, this._rs = void 0; +} +ViewportQuad.prototype.update = function(e) { + if (!this.show) + return; + const t = this._rs; + if ((!defined(t) || !BoundingRectangle.equals(t.viewport, this.rectangle)) && (this._rs = RenderState.fromCache({ + blending: BlendingState$1.ALPHA_BLEND, + viewport: this.rectangle + })), e.passes.render) { + const i = e.context; + if (this._material !== this.material || !defined(this._overlayCommand)) { + this._material = this.material, defined(this._overlayCommand) && this._overlayCommand.shaderProgram.destroy(); + const r = new ShaderSource({ + sources: [this._material.shaderSource, ViewportQuadFS] + }); + this._overlayCommand = i.createViewportQuadCommand(r, { + renderState: this._rs, + uniformMap: this._material._uniforms, + owner: this + }), this._overlayCommand.pass = Pass$1.OVERLAY; + } + this._material.update(i), this._overlayCommand.renderState = this._rs, this._overlayCommand.uniformMap = this._material._uniforms, e.commandList.push(this._overlayCommand); + } +}; +ViewportQuad.prototype.isDestroyed = function() { + return !1; +}; +ViewportQuad.prototype.destroy = function() { + return defined(this._overlayCommand) && (this._overlayCommand.shaderProgram = this._overlayCommand.shaderProgram && this._overlayCommand.shaderProgram.destroy()), destroyObject(this); +}; +function VoxelProvider() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(VoxelProvider.prototype, { + /** + * A transform from local space to global space. If undefined, the identity matrix will be used instead. + * + * @memberof VoxelProvider.prototype + * @type {Matrix4|undefined} + * @readonly + */ + globalTransform: { + get: DeveloperError.throwInstantiationError + }, + /** + * A transform from shape space to local space. If undefined, the identity matrix will be used instead. + * + * @memberof VoxelProvider.prototype + * @type {Matrix4|undefined} + * @readonly + */ + shapeTransform: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the {@link VoxelShapeType} + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {VoxelShapeType} + * @readonly + */ + shape: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the minimum bounds. + * If undefined, the shape's default minimum bounds will be used instead. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {Cartesian3|undefined} + * @readonly + */ + minBounds: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the maximum bounds. + * If undefined, the shape's default maximum bounds will be used instead. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {Cartesian3|undefined} + * @readonly + */ + maxBounds: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the number of voxels per dimension of a tile. This is the same for all tiles in the dataset. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {Cartesian3} + * @readonly + */ + dimensions: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the number of padding voxels before the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {Cartesian3|undefined} + * @readonly + */ + paddingBefore: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the number of padding voxels after the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {Cartesian3|undefined} + * @readonly + */ + paddingAfter: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the metadata names. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {string[]} + * @readonly + */ + names: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the metadata types. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {MetadataType[]} + * @readonly + */ + types: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the metadata component types. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {MetadataComponentType[]} + * @readonly + */ + componentTypes: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the metadata minimum values. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {number[][]|undefined} + * @readonly + */ + minimumValues: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the metadata maximum values. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {number[][]|undefined} + * @readonly + */ + maximumValues: { + get: DeveloperError.throwInstantiationError + }, + /** + * The maximum number of tiles that exist for this provider. This value is used as a hint to the voxel renderer to allocate an appropriate amount of GPU memory. If this value is not known it can be undefined. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {number|undefined} + * @readonly + */ + maximumTileCount: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the number of keyframes in the dataset. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {number} + * @readonly + * @private + */ + keyframeCount: { + get: DeveloperError.throwInstantiationError + }, + /** + * Gets the {@link TimeIntervalCollection} for the dataset, or undefined if it doesn't have timestamps. + * This should not be called before {@link VoxelProvider#ready} returns true. + * + * @memberof VoxelProvider.prototype + * @type {TimeIntervalCollection} + * @readonly + * @private + */ + timeIntervalCollection: { + get: DeveloperError.throwInstantiationError + } +}); +VoxelProvider.prototype.requestData = DeveloperError.throwInstantiationError; +function VoxelShape() { + DeveloperError.throwInstantiationError(); +} +Object.defineProperties(VoxelShape.prototype, { + /** + * An oriented bounding box containing the bounded shape. + * The update function must be called before accessing this value. + * + * @memberof VoxelShape.prototype + * @type {OrientedBoundingBox} + * @readonly + */ + orientedBoundingBox: { + get: DeveloperError.throwInstantiationError + }, + /** + * A bounding sphere containing the bounded shape. + * The update function must be called before accessing this value. + * + * @memberof VoxelShape.prototype + * @type {BoundingSphere} + * @readonly + */ + boundingSphere: { + get: DeveloperError.throwInstantiationError + }, + /** + * A transformation matrix containing the bounded shape. + * The update function must be called before accessing this value. + * + * @memberof VoxelShape.prototype + * @type {Matrix4} + * @readonly + */ + boundTransform: { + get: DeveloperError.throwInstantiationError + }, + /** + * A transformation matrix containing the shape, ignoring the bounds. + * The update function must be called before accessing this value. + * + * @memberof VoxelShape.prototype + * @type {Matrix4} + * @readonly + */ + shapeTransform: { + get: DeveloperError.throwInstantiationError + }, + /** + * @type {Object<string, any>} + * @readonly + */ + shaderUniforms: { + get: DeveloperError.throwInstantiationError + }, + /** + * @type {Object<string, any>} + * @readonly + */ + shaderDefines: { + get: DeveloperError.throwInstantiationError + }, + /** + * The maximum number of intersections against the shape for any ray direction. + * @type {number} + * @readonly + */ + shaderMaximumIntersectionsLength: { + get: DeveloperError.throwInstantiationError + } +}); +VoxelShape.prototype.update = DeveloperError.throwInstantiationError; +VoxelShape.prototype.computeOrientedBoundingBoxForTile = DeveloperError.throwInstantiationError; +VoxelShape.prototype.computeOrientedBoundingBoxForSample = DeveloperError.throwInstantiationError; +VoxelShape.DefaultMinBounds = DeveloperError.throwInstantiationError; +VoxelShape.DefaultMaxBounds = DeveloperError.throwInstantiationError; +async function computeFlyToLocationForRectangle(e, t) { + const n = t.terrainProvider, i = t.mapProjection, r = i.ellipsoid; + let o; + const s = t.camera.getRectangleCameraCoordinates(e); + if (t.mode === SceneMode$1.SCENE3D ? o = r.cartesianToCartographic(s) : o = i.unproject(s), !defined(n)) + return o; + const c = n.availability; + if (!defined(c) || t.mode === SceneMode$1.SCENE2D) + return o; + const l = [ + Rectangle.center(e), + Rectangle.southeast(e), + Rectangle.southwest(e), + Rectangle.northeast(e), + Rectangle.northwest(e) + ], d = await computeFlyToLocationForRectangle._sampleTerrainMostDetailed( + n, + l + ); + let f = !1; + const h = d.reduce(function(m, _) { + return defined(_.height) ? (f = !0, Math.max(_.height, m)) : m; + }, -Number.MAX_VALUE), p = o; + return f && (p.height += h), p; +} +computeFlyToLocationForRectangle._sampleTerrainMostDetailed = sampleTerrainMostDetailed; +const scratchColor = new Color(), scratchColorAbove = new Color(), scratchColorBelow = new Color(), scratchColorBlend = new Color(), scratchPackedFloat = new Cartesian4(), scratchColorBytes = new Uint8Array(4); +function lerpEntryColor(e, t, n, i) { + const r = t.height === n.height ? 0 : (e - t.height) / (n.height - t.height); + return Color.lerp(t.color, n.color, r, i); +} +function createNewEntry(e, t) { + return { + height: e, + color: Color.clone(t) + }; +} +function removeDuplicates(e) { + return e = e.filter(function(t, n, i) { + const r = n > 0, o = n < i.length - 1, s = r ? t.height === i[n - 1].height : !0, c = o ? t.height === i[n + 1].height : !0; + return !s || !c; + }), e = e.filter(function(t, n, i) { + const r = n > 0, o = n < i.length - 1, s = r ? Color.equals(t.color, i[n - 1].color) : !1, c = o ? Color.equals(t.color, i[n + 1].color) : !1; + return !s || !c; + }), e = e.filter(function(t, n, i) { + const r = n > 0, o = r ? Color.equals(t.color, i[n - 1].color) : !1, s = r ? t.height === i[n - 1].height : !0; + return !o || !s; + }), e; +} +function preprocess(e) { + let t, n; + const i = [], r = e.length; + for (t = 0; t < r; t++) { + const o = e[t], s = o.entries, c = s.length; + let l = []; + for (n = 0; n < c; n++) { + const m = s[n], _ = CesiumMath.clamp( + m.height, + createElevationBandMaterial._minimumHeight, + createElevationBandMaterial._maximumHeight + ), y = Color.clone(m.color, scratchColor); + y.red *= y.alpha, y.green *= y.alpha, y.blue *= y.alpha, l.push(createNewEntry(_, y)); + } + let d = !0, f = !0; + for (n = 0; n < c - 1; n++) { + const m = l[n + 0], _ = l[n + 1]; + d = d && m.height <= _.height, f = f && m.height >= _.height; + } + f ? l = l.reverse() : d || mergeSort(l, function(m, _) { + return CesiumMath.sign(m.height - _.height); + }); + let h = defaultValue(o.extendDownwards, !1), p = defaultValue(o.extendUpwards, !1); + l.length === 1 && !h && !p && (h = !0, p = !0), h && l.splice( + 0, + 0, + createNewEntry( + createElevationBandMaterial._minimumHeight, + l[0].color + ) + ), p && l.splice( + l.length, + 0, + createNewEntry( + createElevationBandMaterial._maximumHeight, + l[l.length - 1].color + ) + ), l = removeDuplicates(l), i.push(l); + } + return i; +} +function createLayeredEntries(e) { + const t = preprocess(e); + let n = [], i = [], r; + function o(d, f) { + n.push(createNewEntry(d, f)); + } + function s(d, f, h) { + let p = Color.multiplyByScalar(h, 1 - f.alpha, scratchColorBlend); + p = Color.add(p, f, p), o(d, p); + } + const c = t.length; + for (r = 0; r < c; r++) { + const d = t[r]; + let f = 0, h = 0; + i = n, n = []; + const p = d.length, m = i.length; + for (; f < p || h < m; ) { + const _ = f < p ? d[f] : void 0, y = f > 0 ? d[f - 1] : void 0, C = f < p - 1 ? d[f + 1] : void 0, T = h < m ? i[h] : void 0, x = h > 0 ? i[h - 1] : void 0, b = h < m - 1 ? i[h + 1] : void 0; + if (defined(_) && defined(T) && _.height === T.height) { + const S = defined(b) && T.height === b.height, E = !defined(x), A = !defined(b), D = defined(C) && _.height === C.height, P = !defined(y), I = !defined(C); + S ? D ? (s(_.height, _.color, T.color), s(_.height, C.color, b.color)) : P ? (o(_.height, T.color), s(_.height, _.color, b.color)) : I ? (s(_.height, _.color, T.color), o(_.height, b.color)) : (s(_.height, _.color, T.color), s(_.height, _.color, b.color)) : E ? D ? (o(_.height, _.color), s(_.height, C.color, T.color)) : I ? (o(_.height, _.color), o(_.height, T.color)) : (P || o(_.height, _.color), s(_.height, _.color, T.color)) : A ? D ? (s(_.height, _.color, T.color), o(_.height, C.color)) : P ? (o(_.height, T.color), o(_.height, _.color)) : I ? s(_.height, _.color, T.color) : (s(_.height, _.color, T.color), o(_.height, _.color)) : D ? (s(_.height, _.color, T.color), s(_.height, C.color, T.color)) : P ? (o(_.height, T.color), s(_.height, _.color, T.color)) : I ? (s(_.height, _.color, T.color), o(_.height, T.color)) : s(_.height, _.color, T.color), f += D ? 2 : 1, h += S ? 2 : 1; + } else if (defined(_) && defined(T) && defined(x) && _.height < T.height) { + const S = lerpEntryColor( + _.height, + x, + T, + scratchColorBelow + ); + defined(y) ? defined(C) ? s(_.height, _.color, S) : (s(_.height, _.color, S), o(_.height, S)) : (o(_.height, S), s(_.height, _.color, S)), f++; + } else if (defined(T) && defined(_) && defined(y) && T.height < _.height) { + const S = lerpEntryColor( + T.height, + y, + _, + scratchColorAbove + ); + defined(x) ? defined(b) ? s(T.height, S, T.color) : (s(T.height, S, T.color), o(T.height, S)) : (o(T.height, S), s(T.height, S, T.color)), h++; + } else defined(_) && (!defined(T) || _.height < T.height) ? (defined(T) && !defined(x) && !defined(C) ? (o(_.height, _.color), o(_.height, createElevationBandMaterial._emptyColor), o(T.height, createElevationBandMaterial._emptyColor)) : (!defined(T) && defined(x) && !defined(y) && (o( + x.height, + createElevationBandMaterial._emptyColor + ), o(_.height, createElevationBandMaterial._emptyColor)), o(_.height, _.color)), f++) : defined(T) && (!defined(_) || T.height < _.height) && (o(T.height, T.color), h++); + } + } + return removeDuplicates(n); +} +function createElevationBandMaterial(e) { + const { scene: t, layers: n } = defaultValue(e, defaultValue.EMPTY_OBJECT), { context: i } = t, r = createLayeredEntries(n), o = r.length; + let s, c, l; + if (!createElevationBandMaterial._useFloatTexture(i)) { + c = PixelDatatype$1.UNSIGNED_BYTE, l = PixelFormat$1.RGBA, s = new Uint8Array(o * 4); + for (let m = 0; m < o; m++) + Cartesian4.packFloat(r[m].height, scratchPackedFloat), Cartesian4.pack(scratchPackedFloat, s, m * 4); + } else { + c = PixelDatatype$1.FLOAT, l = i.webgl2 ? PixelFormat$1.RED : PixelFormat$1.LUMINANCE, s = new Float32Array(o); + for (let m = 0; m < o; m++) + s[m] = r[m].height; + } + const f = Texture.create({ + context: i, + pixelFormat: l, + pixelDatatype: c, + source: { + arrayBufferView: s, + width: o, + height: 1 + }, + sampler: new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.NEAREST, + magnificationFilter: TextureMagnificationFilter$1.NEAREST + }) + }), h = new Uint8Array(o * 4); + for (let m = 0; m < o; m++) + r[m].color.toBytes(scratchColorBytes), h[m * 4 + 0] = scratchColorBytes[0], h[m * 4 + 1] = scratchColorBytes[1], h[m * 4 + 2] = scratchColorBytes[2], h[m * 4 + 3] = scratchColorBytes[3]; + const p = Texture.create({ + context: i, + pixelFormat: PixelFormat$1.RGBA, + pixelDatatype: PixelDatatype$1.UNSIGNED_BYTE, + source: { + arrayBufferView: h, + width: o, + height: 1 + }, + sampler: new Sampler({ + wrapS: TextureWrap$1.CLAMP_TO_EDGE, + wrapT: TextureWrap$1.CLAMP_TO_EDGE, + minificationFilter: TextureMinificationFilter$1.LINEAR, + magnificationFilter: TextureMagnificationFilter$1.LINEAR + }) + }); + return Material$4.fromType("ElevationBand", { + heights: f, + colors: p + }); +} +createElevationBandMaterial._useFloatTexture = function(e) { + return e.floatingPointTexture; +}; +createElevationBandMaterial._maximumHeight = 5906376425472; +createElevationBandMaterial._minimumHeight = -5906376425472; +createElevationBandMaterial._emptyColor = new Color(0, 0, 0, 0); +async function createGooglePhotorealistic3DTileset(e, t) { + if (t = defaultValue(t, {}), t.cacheBytes = defaultValue(t.cacheBytes, 1536 * 1024 * 1024), t.maximumCacheOverflowBytes = defaultValue( + t.maximumCacheOverflowBytes, + 1024 * 1024 * 1024 + ), t.enableCollision = defaultValue(t.enableCollision, !0), e = defaultValue(e, GoogleMaps.defaultApiKey), !defined(e)) + return requestCachedIonTileset(t); + let n; + const i = GoogleMaps.getDefaultCredit(); + defined(i) && (n = [i]); + const r = new Resource({ + url: `${GoogleMaps.mapTilesApiEndpoint}3dtiles/root.json`, + queryParameters: { + key: e + }, + credits: n + }); + return Cesium3DTileset.fromUrl(r, t); +} +const metadataCache = {}; +async function requestCachedIonTileset(e) { + let i = metadataCache[2275207]; + defined(i) || (i = IonResource.fromAssetId(2275207), metadataCache[2275207] = i); + const r = await i; + return Cesium3DTileset.fromUrl(r, e); +} +async function createOsmBuildingsAsync(e) { + const t = await Cesium3DTileset.fromIonAssetId(96188, e); + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + let n = e.style; + if (!defined(n)) { + const i = defaultValue( + e.defaultColor, + Color.WHITE + ).toCssColorString(); + n = new Cesium3DTileStyle({ + color: `Boolean(\${feature['cesium#color']}) ? color(\${feature['cesium#color']}) : ${i}` + }); + } + return t.style = n, t; +} +function createTangentSpaceDebugPrimitive(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT); + const t = []; + let n = e.geometry; + (!defined(n.attributes) || !defined(n.primitiveType)) && (n = n.constructor.createGeometry(n)); + const i = n.attributes, r = Matrix4.clone( + defaultValue(e.modelMatrix, Matrix4.IDENTITY) + ), o = defaultValue(e.length, 1e4); + if (defined(i.normal) && t.push( + new GeometryInstance({ + geometry: GeometryPipeline.createLineSegmentsForVectors( + n, + "normal", + o + ), + attributes: { + color: new ColorGeometryInstanceAttribute(1, 0, 0, 1) + }, + modelMatrix: r + }) + ), defined(i.tangent) && t.push( + new GeometryInstance({ + geometry: GeometryPipeline.createLineSegmentsForVectors( + n, + "tangent", + o + ), + attributes: { + color: new ColorGeometryInstanceAttribute(0, 1, 0, 1) + }, + modelMatrix: r + }) + ), defined(i.bitangent) && t.push( + new GeometryInstance({ + geometry: GeometryPipeline.createLineSegmentsForVectors( + n, + "bitangent", + o + ), + attributes: { + color: new ColorGeometryInstanceAttribute(0, 0, 1, 1) + }, + modelMatrix: r + }) + ), t.length > 0) + return new Primitive$3({ + asynchronous: !1, + geometryInstances: t, + appearance: new PerInstanceColorAppearance({ + flat: !0, + translucent: !1 + }) + }); +} +const DepthViewPacked = `uniform sampler2D u_depthTexture; + +in vec2 v_textureCoordinates; + +void main() +{ + float z_window = czm_unpackDepth(texture(u_depthTexture, v_textureCoordinates)); + z_window = czm_reverseLogDepth(z_window); + float n_range = czm_depthRange.near; + float f_range = czm_depthRange.far; + float z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range); + float scale = pow(z_ndc * 0.5 + 0.5, 8.0); + out_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0); +} +`; +function TextureUniform(e) { + e = defaultValue(e, defaultValue.EMPTY_OBJECT), this.typedArray = e.typedArray, this.width = e.width, this.height = e.height, this.pixelFormat = defaultValue(e.pixelFormat, PixelFormat$1.RGBA), this.pixelDatatype = defaultValue( + e.pixelDatatype, + PixelDatatype$1.UNSIGNED_BYTE + ); + let t = e.url; + typeof t == "string" && (t = Resource.createIfNeeded(t)), this.resource = t; + const i = defaultValue(e.repeat, !0) ? TextureWrap$1.REPEAT : TextureWrap$1.CLAMP_TO_EDGE; + this.sampler = new Sampler({ + wrapS: i, + wrapT: i, + minificationFilter: e.minificationFilter, + magnificationFilter: e.magnificationFilter, + maximumAnisotropy: e.maximumAnisotropy + }); +} +const VaryingType = { + /** + * A single floating point value. + * + * @type {string} + * @constant + */ + FLOAT: "float", + /** + * A vector of 2 floating point values. + * + * @type {string} + * @constant + */ + VEC2: "vec2", + /** + * A vector of 3 floating point values. + * + * @type {string} + * @constant + */ + VEC3: "vec3", + /** + * A vector of 4 floating point values. + * + * @type {string} + * @constant + */ + VEC4: "vec4", + /** + * A 2x2 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT2: "mat2", + /** + * A 3x3 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT3: "mat2", + /** + * A 3x3 matrix of floating point values. + * + * @type {string} + * @constant + */ + MAT4: "mat4" +}, VaryingType$1 = Object.freeze(VaryingType); +function createTaskProcessorWorker(e) { + async function t({ data: i }) { + const r = [], o = { + id: i.id, + result: void 0, + error: void 0 + }; + self.CESIUM_BASE_URL = i.baseUrl; + try { + const s = await e(i.parameters, r); + o.result = s; + } catch (s) { + s instanceof Error ? o.error = { + name: s.name, + message: s.message, + stack: s.stack + } : o.error = s; + } + i.canTransferArrayBuffer || (r.length = 0); + try { + postMessage(o, r); + } catch (s) { + o.result = void 0, o.error = `postMessage failed with error: ${formatError( + s + )} + with responseMessage: ${JSON.stringify(o)}`, postMessage(o); + } + } + function n(i) { + var r; + postMessage({ + id: (r = i.data) == null ? void 0 : r.id, + error: `postMessage failed with error: ${JSON.stringify(i)}` + }); + } + return self.onmessage = t, self.onmessageerror = n, self; +} +export { + AlphaMode$1 as AlphaMode, + AlphaPipelineStage, + Appearance, + ApproximateTerrainHeights, + ArcGISTiledElevationTerrainProvider, + ArcGisBaseMapType$1 as ArcGisBaseMapType, + ArcGisMapServerImageryProvider, + ArcGisMapService, + ArcType$1 as ArcType, + ArticulationStageType$1 as ArticulationStageType, + AssociativeArray, + Atmosphere, + AtmospherePipelineStage, + AttributeCompression, + AttributeType$1 as AttributeType, + AutoExposure, + AutomaticUniforms, + Axis$1 as Axis, + AxisAlignedBoundingBox, + B3dmLoader, + B3dmParser, + BatchTable, + BatchTableHierarchy, + BatchTexture, + BatchTexturePipelineStage, + Billboard, + BillboardCollection, + BillboardGraphics, + BillboardVisualizer, + BingMapsGeocoderService, + BingMapsImageryProvider, + BingMapsStyle$1 as BingMapsStyle, + BlendEquation$1 as BlendEquation, + BlendFunction$1 as BlendFunction, + BlendOption$1 as BlendOption, + BlendingState$1 as BlendingState, + BoundingRectangle, + BoundingSphere, + BoundingSphereState$1 as BoundingSphereState, + BoundingVolumeSemantics, + BoxEmitter, + BoxGeometry, + BoxGeometryUpdater, + BoxGraphics, + BoxOutlineGeometry, + BrdfLutGenerator, + Buffer, + BufferLoader, + BufferUsage$1 as BufferUsage, + CPUStylingPipelineStage, + CallbackProperty, + Camera, + CameraEventAggregator, + CameraEventType$1 as CameraEventType, + CameraFlightPath, + Cartesian2, + Cartesian3, + Cartesian4, + Cartographic, + CartographicGeocoderService, + CatmullRomSpline, + Cesium3DContentGroup, + Cesium3DTile, + Cesium3DTileBatchTable, + Cesium3DTileColorBlendMode$1 as Cesium3DTileColorBlendMode, + Cesium3DTileContent, + Cesium3DTileContentFactory, + Cesium3DTileContentState$1 as Cesium3DTileContentState, + Cesium3DTileContentType$1 as Cesium3DTileContentType, + Cesium3DTileFeature, + Cesium3DTileFeatureTable, + Cesium3DTileOptimizationHint$1 as Cesium3DTileOptimizationHint, + Cesium3DTileOptimizations, + Cesium3DTilePass$1 as Cesium3DTilePass, + Cesium3DTilePassState, + Cesium3DTilePointFeature, + Cesium3DTileRefine$1 as Cesium3DTileRefine, + Cesium3DTileStyle, + Cesium3DTileStyleEngine, + Cesium3DTilesVoxelProvider, + Cesium3DTileset, + Cesium3DTilesetBaseTraversal, + Cesium3DTilesetCache, + Cesium3DTilesetGraphics, + Cesium3DTilesetHeatmap, + Cesium3DTilesetMetadata, + Cesium3DTilesetMostDetailedTraversal, + Cesium3DTilesetSkipTraversal, + Cesium3DTilesetStatistics, + Cesium3DTilesetTraversal, + Cesium3DTilesetVisualizer, + CesiumTerrainProvider, + CesiumWidget, + Check, + CheckerboardMaterialProperty, + CircleEmitter, + CircleGeometry, + CircleOutlineGeometry, + ClassificationModelDrawCommand, + ClassificationPipelineStage, + ClassificationPrimitive, + ClassificationType$1 as ClassificationType, + ClearCommand, + ClippingPlane, + ClippingPlaneCollection, + ClippingPolygon, + ClippingPolygonCollection, + Clock, + ClockRange$1 as ClockRange, + ClockStep$1 as ClockStep, + CloudCollection, + CloudType$1 as CloudType, + Color, + ColorBlendMode$1 as ColorBlendMode, + ColorGeometryInstanceAttribute, + ColorMaterialProperty, + ComponentDatatype$1 as ComponentDatatype, + Composite3DTileContent, + CompositeEntityCollection, + CompositeMaterialProperty, + CompositePositionProperty, + CompositeProperty, + CompressedTextureBuffer, + ComputeCommand, + ComputeEngine, + ConditionsExpression, + ConeEmitter, + ConstantPositionProperty, + ConstantProperty, + ConstantSpline, + ContentMetadata, + Context, + ContextLimits, + CoplanarPolygonGeometry, + CoplanarPolygonGeometryLibrary, + CoplanarPolygonOutlineGeometry, + CornerType$1 as CornerType, + CorridorGeometry, + CorridorGeometryLibrary, + CorridorGeometryUpdater, + CorridorGraphics, + CorridorOutlineGeometry, + Credit, + CreditDisplay, + CubeMap, + CubeMapFace, + CubicRealPolynomial, + CullFace$1 as CullFace, + CullingVolume, + CumulusCloud, + CustomDataSource, + CustomHeightmapTerrainProvider, + CustomShader, + CustomShaderMode$1 as CustomShaderMode, + CustomShaderPipelineStage, + CustomShaderTranslucencyMode$1 as CustomShaderTranslucencyMode, + CylinderGeometry, + CylinderGeometryLibrary, + CylinderGeometryUpdater, + CylinderGraphics, + CylinderOutlineGeometry, + CzmlDataSource, + DataSource, + DataSourceClock, + DataSourceCollection, + DataSourceDisplay, + DebugAppearance, + DebugCameraPrimitive, + DebugInspector, + DebugModelMatrixPrimitive, + DefaultProxy, + DepthFunction$1 as DepthFunction, + DepthPlane, + DequantizationPipelineStage, + DerivedCommand, + DeveloperError, + DeviceOrientationCameraController, + DirectionalLight, + DiscardEmptyTileImagePolicy, + DiscardMissingTileImagePolicy, + DistanceDisplayCondition, + DistanceDisplayConditionGeometryInstanceAttribute, + DoubleEndedPriorityQueue, + DoublyLinkedList, + DracoLoader, + DrawCommand, + DynamicAtmosphereLightingType$1 as DynamicAtmosphereLightingType, + DynamicGeometryBatch, + DynamicGeometryUpdater$1 as DynamicGeometryUpdater, + EarthOrientationParameters, + EarthOrientationParametersSample, + EasingFunction$1 as EasingFunction, + EllipseGeometry, + EllipseGeometryLibrary, + EllipseGeometryUpdater, + EllipseGraphics, + EllipseOutlineGeometry, + Ellipsoid, + EllipsoidGeodesic, + EllipsoidGeometry, + EllipsoidGeometryUpdater, + EllipsoidGraphics, + EllipsoidOutlineGeometry, + EllipsoidPrimitive, + EllipsoidRhumbLine, + EllipsoidSurfaceAppearance, + EllipsoidTangentPlane, + EllipsoidTerrainProvider, + EllipsoidalOccluder, + Empty3DTileContent, + EncodedCartesian3, + Entity, + EntityCluster, + EntityCollection, + EntityView, + Event, + EventHelper, + Expression, + ExpressionNodeType$1 as ExpressionNodeType, + ExtrapolationType$1 as ExtrapolationType, + FeatureDetection, + FeatureIdPipelineStage, + Fog, + ForEach, + FrameRateMonitor, + FrameState, + Framebuffer, + FramebufferManager, + FrustumCommands, + FrustumGeometry, + FrustumOutlineGeometry, + Fullscreen, + GeoJsonDataSource, + GeoJsonLoader, + GeocodeType$1 as GeocodeType, + GeocoderService, + GeographicProjection, + GeographicTilingScheme, + Geometry, + Geometry3DTileContent, + GeometryAttribute, + GeometryAttributes, + GeometryFactory, + GeometryInstance, + GeometryInstanceAttribute, + GeometryOffsetAttribute$1 as GeometryOffsetAttribute, + GeometryPipeline, + GeometryPipelineStage, + GeometryType$1 as GeometryType, + GeometryUpdater, + GeometryUpdaterSet, + GeometryVisualizer, + GetFeatureInfoFormat, + Globe, + GlobeDepth, + GlobeSurfaceShaderSet, + GlobeSurfaceTile, + GlobeSurfaceTileProvider, + GlobeTranslucency, + GlobeTranslucencyFramebuffer, + GlobeTranslucencyState, + GltfBufferViewLoader, + GltfDracoLoader, + GltfImageLoader, + GltfIndexBufferLoader, + GltfJsonLoader, + GltfLoader, + GltfLoaderUtil, + GltfStructuralMetadataLoader, + GltfTextureLoader, + GltfVertexBufferLoader, + GoogleEarthEnterpriseImageryProvider, + GoogleEarthEnterpriseMapsProvider, + GoogleEarthEnterpriseMetadata, + GoogleEarthEnterpriseTerrainData, + GoogleEarthEnterpriseTerrainProvider, + GoogleEarthEnterpriseTileInformation, + GoogleMaps, + GpxDataSource, + GregorianDate, + GridImageryProvider, + GridMaterialProperty, + GroundGeometryUpdater, + GroundPolylineGeometry, + GroundPolylinePrimitive, + GroundPrimitive, + GroupMetadata, + HeadingPitchRange, + HeadingPitchRoll, + Heap, + HeightReference$1 as HeightReference, + HeightmapEncoding$1 as HeightmapEncoding, + HeightmapTerrainData, + HeightmapTessellator, + HermitePolynomialApproximation, + HermiteSpline, + HilbertOrder, + HorizontalOrigin$1 as HorizontalOrigin, + I3SDataProvider, + I3SDecoder, + I3SFeature, + I3SField, + I3SGeometry, + I3SLayer, + I3SNode, + I3SStatistics, + I3SSublayer, + I3SSymbology, + I3dmLoader, + I3dmParser, + Iau2000Orientation, + Iau2006XysData, + Iau2006XysSample, + IauOrientationAxes, + IauOrientationParameters, + ImageBasedLighting, + ImageBasedLightingPipelineStage, + ImageMaterialProperty, + Imagery, + ImageryLayer, + ImageryLayerCollection, + ImageryLayerFeatureInfo, + ImageryProvider, + ImageryState$1 as ImageryState, + Implicit3DTileContent, + ImplicitAvailabilityBitstream, + ImplicitMetadataView, + ImplicitSubdivisionScheme$1 as ImplicitSubdivisionScheme, + ImplicitSubtree, + ImplicitSubtreeCache, + ImplicitSubtreeMetadata, + ImplicitTileCoordinates, + ImplicitTileset, + IndexDatatype$1 as IndexDatatype, + InstanceAttributeSemantic$1 as InstanceAttributeSemantic, + InstancingPipelineStage, + InterpolationAlgorithm, + InterpolationType$1 as InterpolationType, + Intersect$1 as Intersect, + IntersectionTests, + Intersections2D, + Interval, + InvertClassification, + Ion, + IonGeocoderService, + IonImageryProvider, + IonResource, + IonWorldImageryStyle$1 as IonWorldImageryStyle, + Iso8601, + JobScheduler, + JobType$1 as JobType, + JsonMetadataTable, + JulianDate, + KTX2Transcoder, + KeyboardEventModifier$1 as KeyboardEventModifier, + KeyframeNode, + KmlCamera, + KmlDataSource, + KmlLookAt, + KmlTour, + KmlTourFlyTo, + KmlTourWait, + Label, + LabelCollection, + LabelGraphics, + LabelStyle$1 as LabelStyle, + LabelVisualizer, + LagrangePolynomialApproximation, + LeapSecond, + Light, + LightingModel$1 as LightingModel, + LightingPipelineStage, + LinearApproximation, + LinearSpline, + ManagedArray, + MapMode2D$1 as MapMode2D, + MapProjection, + MapboxImageryProvider, + MapboxStyleImageryProvider, + Material$4 as Material, + MaterialAppearance, + MaterialPipelineStage, + MaterialProperty, + CesiumMath as Math, + Matrix2, + Matrix3, + Matrix4, + Megatexture, + MetadataClass, + MetadataClassProperty, + MetadataComponentType$1 as MetadataComponentType, + MetadataEntity, + MetadataEnum, + MetadataEnumValue, + MetadataPipelineStage, + MetadataSchema, + MetadataSchemaLoader, + MetadataSemantic$1 as MetadataSemantic, + MetadataTable, + MetadataTableProperty, + MetadataType$1 as MetadataType, + MipmapHint$1 as MipmapHint, + Model, + Model3DTileContent, + ModelAlphaOptions, + ModelAnimation, + ModelAnimationChannel, + ModelAnimationCollection, + ModelAnimationLoop$1 as ModelAnimationLoop, + ModelAnimationState$1 as ModelAnimationState, + ModelArticulation, + ModelArticulationStage, + ModelClippingPlanesPipelineStage, + ModelClippingPolygonsPipelineStage, + ModelColorPipelineStage, + ModelComponents, + ModelDrawCommand, + ModelFeature, + ModelFeatureTable, + ModelGraphics, + ModelLightingOptions, + ModelMatrixUpdateStage, + ModelNode, + ModelRenderResources, + ModelRuntimeNode, + ModelRuntimePrimitive, + ModelSceneGraph, + ModelSilhouettePipelineStage, + ModelSkin, + ModelSplitterPipelineStage, + ModelStatistics, + ModelType$1 as ModelType, + ModelUtility, + ModelVisualizer, + Moon, + MorphTargetsPipelineStage, + MorphWeightSpline, + MortonOrder, + Multiple3DTileContent, + MultisampleFramebuffer, + NearFarScalar, + NeverTileDiscardPolicy, + NodeRenderResources, + NodeStatisticsPipelineStage, + NodeTransformationProperty, + OIT, + Occluder, + OffsetGeometryInstanceAttribute, + OpenCageGeocoderService, + OpenStreetMapImageryProvider, + OrderedGroundPrimitiveCollection, + OrientedBoundingBox, + OrthographicFrustum, + OrthographicOffCenterFrustum, + Packable, + PackableForInterpolation, + Particle, + ParticleBurst, + ParticleEmitter, + ParticleSystem, + Pass$1 as Pass, + PassState, + PathGraphics, + PathVisualizer, + PeliasGeocoderService, + PerInstanceColorAppearance, + PerformanceDisplay, + PerspectiveFrustum, + PerspectiveOffCenterFrustum, + PickDepth, + PickDepthFramebuffer, + PickFramebuffer, + Picking, + PickingPipelineStage, + PinBuilder, + PixelDatatype$1 as PixelDatatype, + PixelFormat$1 as PixelFormat, + Plane, + PlaneGeometry, + PlaneGeometryUpdater, + PlaneGraphics, + PlaneOutlineGeometry, + PntsLoader, + PntsParser, + PointCloud, + PointCloudEyeDomeLighting, + PointCloudShading, + PointCloudStylingPipelineStage, + PointGraphics, + PointPrimitive, + PointPrimitiveCollection, + PointVisualizer, + PolygonGeometry, + PolygonGeometryLibrary, + PolygonGeometryUpdater, + PolygonGraphics, + PolygonHierarchy, + PolygonOutlineGeometry, + PolygonPipeline, + Polyline, + PolylineArrowMaterialProperty, + PolylineCollection, + PolylineColorAppearance, + PolylineDashMaterialProperty, + PolylineGeometry, + PolylineGeometryUpdater, + PolylineGlowMaterialProperty, + PolylineGraphics, + PolylineMaterialAppearance, + PolylineOutlineMaterialProperty, + PolylinePipeline, + PolylineVisualizer, + PolylineVolumeGeometry, + PolylineVolumeGeometryLibrary, + PolylineVolumeGeometryUpdater, + PolylineVolumeGraphics, + PolylineVolumeOutlineGeometry, + PositionProperty, + PositionPropertyArray, + PostProcessStage, + PostProcessStageCollection, + PostProcessStageComposite, + PostProcessStageLibrary, + PostProcessStageSampleMode, + PostProcessStageTextureCache, + Primitive$3 as Primitive, + PrimitiveCollection, + PrimitiveLoadPlan, + PrimitiveOutlineGenerator, + PrimitiveOutlinePipelineStage, + PrimitivePipeline, + PrimitiveRenderResources, + PrimitiveState$1 as PrimitiveState, + PrimitiveStatisticsPipelineStage, + PrimitiveType$1 as PrimitiveType, + Property, + PropertyArray, + PropertyAttribute, + PropertyAttributeProperty, + PropertyBag, + PropertyTable, + PropertyTexture, + PropertyTextureProperty, + Proxy, + QuadraticRealPolynomial, + QuadtreeOccluders, + QuadtreePrimitive, + QuadtreeTile, + QuadtreeTileLoadState$1 as QuadtreeTileLoadState, + QuadtreeTileProvider, + QuantizedMeshTerrainData, + QuarticRealPolynomial, + Quaternion, + QuaternionSpline, + Queue, + Ray, + Rectangle, + RectangleCollisionChecker, + RectangleGeometry, + RectangleGeometryLibrary, + RectangleGeometryUpdater, + RectangleGraphics, + RectangleOutlineGeometry, + ReferenceFrame$1 as ReferenceFrame, + ReferenceProperty, + RenderState, + Renderbuffer, + RenderbufferFormat$1 as RenderbufferFormat, + Request, + RequestErrorEvent, + RequestScheduler, + RequestState$1 as RequestState, + RequestType$1 as RequestType, + Resource, + ResourceCache, + ResourceCacheKey, + ResourceCacheStatistics, + ResourceLoader, + ResourceLoaderState$1 as ResourceLoaderState, + Rotation, + RuntimeError, + S2Cell, + SDFSettings$1 as SDFSettings, + SampledPositionProperty, + SampledProperty, + Sampler, + ScaledPositionProperty, + Scene, + SceneFramebuffer, + SceneMode$1 as SceneMode, + SceneMode2DPipelineStage, + SceneTransforms, + SceneTransitioner, + ScreenSpaceCameraController, + ScreenSpaceEventHandler, + ScreenSpaceEventType$1 as ScreenSpaceEventType, + SelectedFeatureIdPipelineStage, + SensorVolumePortionToDisplay, + ShaderBuilder, + ShaderCache, + ShaderDestination$1 as ShaderDestination, + ShaderFunction, + ShaderProgram, + ShaderSource, + ShaderStruct, + ShadowMap, + ShadowMapShader, + ShadowMode$1 as ShadowMode, + ShadowVolumeAppearance, + ShowGeometryInstanceAttribute, + Simon1994PlanetaryPositions, + SimplePolylineGeometry, + SingleTileImageryProvider, + SkinningPipelineStage, + SkyAtmosphere, + SkyBox, + SpatialNode, + SpecularEnvironmentCubeMap, + SphereEmitter, + SphereGeometry, + SphereOutlineGeometry, + Spherical, + Spline, + SplitDirection$1 as SplitDirection, + Splitter, + StaticGeometryColorBatch, + StaticGeometryPerMaterialBatch, + StaticGroundGeometryColorBatch, + StaticGroundGeometryPerMaterialBatch, + StaticGroundPolylinePerMaterialBatch, + StaticOutlineGeometryBatch, + StencilConstants$1 as StencilConstants, + StencilFunction$1 as StencilFunction, + StencilOperation$1 as StencilOperation, + SteppedSpline, + Stereographic, + StripeMaterialProperty, + StripeOrientation$1 as StripeOrientation, + StructuralMetadata, + StyleCommandsNeeded$1 as StyleCommandsNeeded, + StyleExpression, + Sun, + SunLight, + SunPostProcess, + SupportedImageFormats, + TaskProcessor, + Terrain, + TerrainData, + TerrainEncoding, + TerrainFillMesh, + TerrainMesh, + TerrainOffsetProperty, + TerrainProvider, + TerrainQuantization$1 as TerrainQuantization, + TerrainState$2 as TerrainState, + Texture, + TextureAtlas, + TextureCache, + TextureMagnificationFilter$1 as TextureMagnificationFilter, + TextureManager, + TextureMinificationFilter$1 as TextureMinificationFilter, + TextureUniform, + TextureWrap$1 as TextureWrap, + TileAvailability, + TileBoundingRegion, + TileBoundingS2Cell, + TileBoundingSphere, + TileBoundingVolume, + TileCoordinatesImageryProvider, + TileDiscardPolicy, + TileEdge, + TileImagery, + TileMapServiceImageryProvider, + TileMetadata, + TileOrientedBoundingBox, + TileProviderError, + TileReplacementQueue, + TileSelectionResult, + TileState$1 as TileState, + Tileset3DTileContent, + TilesetMetadata, + TilesetPipelineStage, + TilingScheme, + TimeConstants$1 as TimeConstants, + TimeDynamicImagery, + TimeDynamicPointCloud, + TimeInterval, + TimeIntervalCollection, + TimeIntervalCollectionPositionProperty, + TimeIntervalCollectionProperty, + TimeStandard$1 as TimeStandard, + Tipsify, + Tonemapper$1 as Tonemapper, + Transforms, + TranslationRotationScale, + TranslucentTileClassification, + TridiagonalSystemSolver, + TrustedServers, + TweenCollection, + UniformState, + UniformType$1 as UniformType, + UrlTemplateImageryProvider, + VRTheWorldTerrainProvider, + VaryingType$1 as VaryingType, + Vector3DTileBatch, + Vector3DTileClampedPolylines, + Vector3DTileContent, + Vector3DTileGeometry, + Vector3DTilePoints, + Vector3DTilePolygons, + Vector3DTilePolylines, + Vector3DTilePrimitive, + VelocityOrientationProperty, + VelocityVectorProperty, + VertexArray, + VertexArrayFacade, + VertexAttributeSemantic$1 as VertexAttributeSemantic, + VertexFormat, + VerticalExaggeration, + VerticalExaggerationPipelineStage, + VerticalOrigin$1 as VerticalOrigin, + VideoSynchronizer, + View, + ViewportQuad, + Visibility$1 as Visibility, + Visualizer, + VoxelBoxShape, + VoxelCell, + VoxelContent, + VoxelCylinderShape, + VoxelEllipsoidShape, + VoxelPrimitive, + VoxelProvider, + VoxelRenderResources, + VoxelShape, + VoxelShapeType$1 as VoxelShapeType, + VoxelTraversal, + VulkanConstants$1 as VulkanConstants, + WallGeometry, + WallGeometryLibrary, + WallGeometryUpdater, + WallGraphics, + WallOutlineGeometry, + WebGLConstants$1 as WebGLConstants, + WebMapServiceImageryProvider, + WebMapTileServiceImageryProvider, + WebMercatorProjection, + WebMercatorTilingScheme, + WindingOrder$1 as WindingOrder, + WireframeIndexGenerator, + WireframePipelineStage, + AcesTonemapping as _shadersAcesTonemappingStage, + AdditiveBlend as _shadersAdditiveBlend, + AdjustTranslucentFS as _shadersAdjustTranslucentFS, + AllMaterialAppearanceFS as _shadersAllMaterialAppearanceFS, + AllMaterialAppearanceVS as _shadersAllMaterialAppearanceVS, + AmbientOcclusionGenerate as _shadersAmbientOcclusionGenerate, + AmbientOcclusionModulate as _shadersAmbientOcclusionModulate, + AspectRampMaterial as _shadersAspectRampMaterial, + AtmosphereCommon as _shadersAtmosphereCommon, + AtmosphereStageFS as _shadersAtmosphereStageFS, + AtmosphereStageVS as _shadersAtmosphereStageVS, + BasicMaterialAppearanceFS as _shadersBasicMaterialAppearanceFS, + BasicMaterialAppearanceVS as _shadersBasicMaterialAppearanceVS, + BillboardCollectionFS as _shadersBillboardCollectionFS, + BillboardCollectionVS as _shadersBillboardCollectionVS, + BlackAndWhite as _shadersBlackAndWhite, + BloomComposite as _shadersBloomComposite, + BrdfLutGeneratorFS as _shadersBrdfLutGeneratorFS, + BrightPass as _shadersBrightPass, + Brightness as _shadersBrightness, + BumpMapMaterial as _shadersBumpMapMaterial, + CPUStylingStageFS as _shadersCPUStylingStageFS, + CPUStylingStageVS as _shadersCPUStylingStageVS, + CheckerboardMaterial as _shadersCheckerboardMaterial, + CloudCollectionFS as _shadersCloudCollectionFS, + CloudCollectionVS as _shadersCloudCollectionVS, + CloudNoiseFS as _shadersCloudNoiseFS, + CloudNoiseVS as _shadersCloudNoiseVS, + CompareAndPackTranslucentDepth as _shadersCompareAndPackTranslucentDepth, + CompositeOITFS as _shadersCompositeOITFS, + CompositeTranslucentClassification as _shadersCompositeTranslucentClassification, + ContrastBias as _shadersContrastBias, + CustomShaderStageFS as _shadersCustomShaderStageFS, + CustomShaderStageVS as _shadersCustomShaderStageVS, + CzmBuiltins as _shadersCzmBuiltins, + DepthOfField as _shadersDepthOfField, + DepthPlaneFS as _shadersDepthPlaneFS, + DepthPlaneVS as _shadersDepthPlaneVS, + DepthView as _shadersDepthView, + DepthViewPacked as _shadersDepthViewPacked, + DotMaterial as _shadersDotMaterial, + EdgeDetection as _shadersEdgeDetection, + ElevationBandMaterial as _shadersElevationBandMaterial, + ElevationContourMaterial as _shadersElevationContourMaterial, + ElevationRampMaterial as _shadersElevationRampMaterial, + EllipsoidFS as _shadersEllipsoidFS, + EllipsoidSurfaceAppearanceFS as _shadersEllipsoidSurfaceAppearanceFS, + EllipsoidSurfaceAppearanceVS as _shadersEllipsoidSurfaceAppearanceVS, + EllipsoidVS as _shadersEllipsoidVS, + FXAA as _shadersFXAA, + FXAA3_11 as _shadersFXAA3_11, + FadeMaterial as _shadersFadeMaterial, + FeatureIdStageFS as _shadersFeatureIdStageFS, + FeatureIdStageVS as _shadersFeatureIdStageVS, + FilmicTonemapping as _shadersFilmicTonemapping, + GaussianBlur1D as _shadersGaussianBlur1D, + GeometryStageFS as _shadersGeometryStageFS, + GeometryStageVS as _shadersGeometryStageVS, + GlobeFS as _shadersGlobeFS, + GlobeVS as _shadersGlobeVS, + GridMaterial as _shadersGridMaterial, + GroundAtmosphere as _shadersGroundAtmosphere, + czm_HSBToRGB as _shadersHSBToRGB, + czm_HSLToRGB as _shadersHSLToRGB, + ImageBasedLightingStageFS as _shadersImageBasedLightingStageFS, + InstancingStageCommon as _shadersInstancingStageCommon, + InstancingStageVS as _shadersInstancingStageVS, + IntersectBox as _shadersIntersectBox, + IntersectClippingPlanes as _shadersIntersectClippingPlanes, + IntersectCylinder as _shadersIntersectCylinder, + IntersectDepth as _shadersIntersectDepth, + IntersectEllipsoid as _shadersIntersectEllipsoid, + IntersectLongitude as _shadersIntersectLongitude, + Intersection as _shadersIntersection, + IntersectionUtils as _shadersIntersectionUtils, + LegacyInstancingStageVS as _shadersLegacyInstancingStageVS, + LensFlare as _shadersLensFlare, + LightingStageFS as _shadersLightingStageFS, + MaterialStageFS as _shadersMaterialStageFS, + Megatexture$1 as _shadersMegatexture, + MetadataStageFS as _shadersMetadataStageFS, + MetadataStageVS as _shadersMetadataStageVS, + ModelClippingPlanesStageFS as _shadersModelClippingPlanesStageFS, + ModelClippingPolygonsStageFS as _shadersModelClippingPolygonsStageFS, + ModelClippingPolygonsStageVS as _shadersModelClippingPolygonsStageVS, + ModelColorStageFS as _shadersModelColorStageFS, + ModelFS as _shadersModelFS, + ModelSilhouetteStageFS as _shadersModelSilhouetteStageFS, + ModelSilhouetteStageVS as _shadersModelSilhouetteStageVS, + ModelSplitterStageFS as _shadersModelSplitterStageFS, + ModelVS as _shadersModelVS, + ModifiedReinhardTonemapping as _shadersModifiedReinhardTonemapping, + MorphTargetsStageVS as _shadersMorphTargetsStageVS, + NightVision as _shadersNightVision, + NormalMapMaterial as _shadersNormalMapMaterial, + Octree as _shadersOctree, + PassThrough as _shadersPassThrough, + PassThroughDepth as _shadersPassThroughDepth, + PbrNeutralTonemapping as _shadersPbrNeutralTonemapping, + PerInstanceColorAppearanceFS as _shadersPerInstanceColorAppearanceFS, + PerInstanceColorAppearanceVS as _shadersPerInstanceColorAppearanceVS, + PerInstanceFlatColorAppearanceFS as _shadersPerInstanceFlatColorAppearanceFS, + PerInstanceFlatColorAppearanceVS as _shadersPerInstanceFlatColorAppearanceVS, + PointCloudEyeDomeLightingShader as _shadersPointCloudEyeDomeLighting, + PointCloudStylingStageVS as _shadersPointCloudStylingStageVS, + PointPrimitiveCollectionFS as _shadersPointPrimitiveCollectionFS, + PointPrimitiveCollectionVS as _shadersPointPrimitiveCollectionVS, + PolygonSignedDistanceFS as _shadersPolygonSignedDistanceFS, + PolylineArrowMaterial as _shadersPolylineArrowMaterial, + PolylineColorAppearanceVS as _shadersPolylineColorAppearanceVS, + PolylineCommon as _shadersPolylineCommon, + PolylineDashMaterial as _shadersPolylineDashMaterial, + PolylineFS$1 as _shadersPolylineFS, + PolylineGlowMaterial as _shadersPolylineGlowMaterial, + PolylineMaterialAppearanceVS as _shadersPolylineMaterialAppearanceVS, + PolylineOutlineMaterial as _shadersPolylineOutlineMaterial, + PolylineShadowVolumeFS as _shadersPolylineShadowVolumeFS, + PolylineShadowVolumeMorphFS as _shadersPolylineShadowVolumeMorphFS, + PolylineShadowVolumeMorphVS as _shadersPolylineShadowVolumeMorphVS, + PolylineShadowVolumeVS as _shadersPolylineShadowVolumeVS, + PolylineVS as _shadersPolylineVS, + PrimitiveOutlineStageFS as _shadersPrimitiveOutlineStageFS, + PrimitiveOutlineStageVS as _shadersPrimitiveOutlineStageVS, + czm_RGBToHSB as _shadersRGBToHSB, + czm_RGBToHSL as _shadersRGBToHSL, + czm_RGBToXYZ as _shadersRGBToXYZ, + ReinhardTonemapping as _shadersReinhardTonemapping, + ReprojectWebMercatorFS as _shadersReprojectWebMercatorFS, + ReprojectWebMercatorVS as _shadersReprojectWebMercatorVS, + RimLightingMaterial as _shadersRimLightingMaterial, + SelectedFeatureIdStageCommon as _shadersSelectedFeatureIdStageCommon, + ShadowVolumeAppearanceFS as _shadersShadowVolumeAppearanceFS, + ShadowVolumeAppearanceVS as _shadersShadowVolumeAppearanceVS, + ShadowVolumeFS as _shadersShadowVolumeFS, + Silhouette as _shadersSilhouette, + SkinningStageVS as _shadersSkinningStageVS, + SkyAtmosphereCommon as _shadersSkyAtmosphereCommon, + SkyAtmosphereFS as _shadersSkyAtmosphereFS, + SkyAtmosphereVS as _shadersSkyAtmosphereVS, + SkyBoxFS as _shadersSkyBoxFS, + SkyBoxVS as _shadersSkyBoxVS, + SlopeRampMaterial as _shadersSlopeRampMaterial, + StripeMaterial as _shadersStripeMaterial, + SunFS as _shadersSunFS, + SunTextureFS as _shadersSunTextureFS, + SunVS as _shadersSunVS, + TexturedMaterialAppearanceFS as _shadersTexturedMaterialAppearanceFS, + TexturedMaterialAppearanceVS as _shadersTexturedMaterialAppearanceVS, + Vector3DTileClampedPolylinesFS as _shadersVector3DTileClampedPolylinesFS, + Vector3DTileClampedPolylinesVS as _shadersVector3DTileClampedPolylinesVS, + Vector3DTilePolylinesVS as _shadersVector3DTilePolylinesVS, + VectorTileVS as _shadersVectorTileVS, + VerticalExaggerationStageVS as _shadersVerticalExaggerationStageVS, + ViewportQuadFS as _shadersViewportQuadFS, + ViewportQuadVS as _shadersViewportQuadVS, + VoxelFS as _shadersVoxelFS, + VoxelUtils as _shadersVoxelUtils, + VoxelVS as _shadersVoxelVS, + WaterMaterial as _shadersWater, + WaterMaskMaterial as _shadersWaterMaskMaterial, + czm_XYZToRGB as _shadersXYZToRGB, + czm_acesTonemapping as _shadersacesTonemapping, + czm_alphaWeight as _shadersalphaWeight, + czm_antialias as _shadersantialias, + czm_applyHSBShift as _shadersapplyHSBShift, + czm_approximateSphericalCoordinates as _shadersapproximateSphericalCoordinates, + czm_approximateTanh as _shadersapproximateTanh, + czm_backFacing as _shadersbackFacing, + czm_branchFreeTernary as _shadersbranchFreeTernary, + czm_cascadeColor as _shaderscascadeColor, + czm_cascadeDistance as _shaderscascadeDistance, + czm_cascadeMatrix as _shaderscascadeMatrix, + czm_cascadeWeights as _shaderscascadeWeights, + czm_clipPolygons as _shadersclipPolygons, + czm_columbusViewMorph as _shaderscolumbusViewMorph, + czm_computeAtmosphereColor as _shaderscomputeAtmosphereColor, + czm_computeGroundAtmosphereScattering as _shaderscomputeGroundAtmosphereScattering, + czm_computePosition as _shaderscomputePosition, + czm_computeScattering as _shaderscomputeScattering, + convertUvToBox as _shadersconvertUvToBox, + convertUvToCylinder as _shadersconvertUvToCylinder, + convertUvToEllipsoid as _shadersconvertUvToEllipsoid, + czm_cosineAndSine as _shaderscosineAndSine, + czm_decompressTextureCoordinates as _shadersdecompressTextureCoordinates, + czm_degreesPerRadian as _shadersdegreesPerRadian, + czm_depthClamp as _shadersdepthClamp, + czm_depthRange as _shadersdepthRange, + czm_depthRangeStruct as _shadersdepthRangeStruct, + czm_eastNorthUpToEyeCoordinates as _shaderseastNorthUpToEyeCoordinates, + czm_ellipsoidContainsPoint as _shadersellipsoidContainsPoint, + czm_ellipsoidTextureCoordinates as _shadersellipsoidTextureCoordinates, + czm_epsilon1 as _shadersepsilon1, + czm_epsilon2 as _shadersepsilon2, + czm_epsilon3 as _shadersepsilon3, + czm_epsilon4 as _shadersepsilon4, + czm_epsilon5 as _shadersepsilon5, + czm_epsilon6 as _shadersepsilon6, + czm_epsilon7 as _shadersepsilon7, + czm_equalsEpsilon as _shadersequalsEpsilon, + czm_eyeOffset as _shaderseyeOffset, + czm_eyeToWindowCoordinates as _shaderseyeToWindowCoordinates, + czm_fastApproximateAtan as _shadersfastApproximateAtan, + czm_fog as _shadersfog, + czm_gammaCorrect as _shadersgammaCorrect, + czm_geodeticSurfaceNormal as _shadersgeodeticSurfaceNormal, + czm_getDefaultMaterial as _shadersgetDefaultMaterial, + czm_getDynamicAtmosphereLightDirection as _shadersgetDynamicAtmosphereLightDirection, + czm_getLambertDiffuse as _shadersgetLambertDiffuse, + czm_getSpecular as _shadersgetSpecular, + czm_getWaterNoise as _shadersgetWaterNoise, + czm_hue as _shadershue, + czm_infinity as _shadersinfinity, + czm_inverseGamma as _shadersinverseGamma, + czm_isEmpty as _shadersisEmpty, + czm_isFull as _shadersisFull, + czm_latitudeToWebMercatorFraction as _shaderslatitudeToWebMercatorFraction, + czm_lineDistance as _shaderslineDistance, + czm_linearToSrgb as _shaderslinearToSrgb, + czm_luminance as _shadersluminance, + czm_material as _shadersmaterial, + czm_materialInput as _shadersmaterialInput, + czm_maximumComponent as _shadersmaximumComponent, + czm_metersPerPixel as _shadersmetersPerPixel, + czm_modelMaterial as _shadersmodelMaterial, + czm_modelToWindowCoordinates as _shadersmodelToWindowCoordinates, + czm_modelVertexOutput as _shadersmodelVertexOutput, + czm_multiplyWithColorBalance as _shadersmultiplyWithColorBalance, + czm_nearFarScalar as _shadersnearFarScalar, + czm_octDecode as _shadersoctDecode, + czm_oneOverPi as _shadersoneOverPi, + czm_oneOverTwoPi as _shadersoneOverTwoPi, + czm_packDepth as _shaderspackDepth, + czm_passCesium3DTile as _shaderspassCesium3DTile, + czm_passCesium3DTileClassification as _shaderspassCesium3DTileClassification, + czm_passCesium3DTileClassificationIgnoreShow as _shaderspassCesium3DTileClassificationIgnoreShow, + czm_passClassification as _shaderspassClassification, + czm_passCompute as _shaderspassCompute, + czm_passEnvironment as _shaderspassEnvironment, + czm_passGlobe as _shaderspassGlobe, + czm_passOpaque as _shaderspassOpaque, + czm_passOverlay as _shaderspassOverlay, + czm_passTerrainClassification as _shaderspassTerrainClassification, + czm_passTranslucent as _shaderspassTranslucent, + czm_passVoxels as _shaderspassVoxels, + czm_pbrLighting as _shaderspbrLighting, + czm_pbrNeutralTonemapping as _shaderspbrNeutralTonemapping, + czm_phong as _shadersphong, + czm_pi as _shaderspi, + czm_piOverFour as _shaderspiOverFour, + czm_piOverSix as _shaderspiOverSix, + czm_piOverThree as _shaderspiOverThree, + czm_piOverTwo as _shaderspiOverTwo, + czm_planeDistance as _shadersplaneDistance, + czm_pointAlongRay as _shaderspointAlongRay, + czm_radiansPerDegree as _shadersradiansPerDegree, + czm_ray as _shadersray, + czm_rayEllipsoidIntersectionInterval as _shadersrayEllipsoidIntersectionInterval, + czm_raySegment as _shadersraySegment, + czm_raySphereIntersectionInterval as _shadersraySphereIntersectionInterval, + czm_readDepth as _shadersreadDepth, + czm_readNonPerspective as _shadersreadNonPerspective, + czm_reverseLogDepth as _shadersreverseLogDepth, + czm_round as _shadersround, + czm_saturation as _shaderssaturation, + czm_sceneMode2D as _shaderssceneMode2D, + czm_sceneMode3D as _shaderssceneMode3D, + czm_sceneModeColumbusView as _shaderssceneModeColumbusView, + czm_sceneModeMorphing as _shaderssceneModeMorphing, + czm_shadowDepthCompare as _shadersshadowDepthCompare, + czm_shadowParameters as _shadersshadowParameters, + czm_shadowVisibility as _shadersshadowVisibility, + czm_signNotZero as _shaderssignNotZero, + czm_solarRadius as _shaderssolarRadius, + czm_sphericalHarmonics as _shaderssphericalHarmonics, + czm_srgbToLinear as _shaderssrgbToLinear, + czm_tangentToEyeSpaceMatrix as _shaderstangentToEyeSpaceMatrix, + czm_textureCube as _shaderstextureCube, + czm_threePiOver2 as _shadersthreePiOver2, + czm_transformPlane as _shaderstransformPlane, + czm_translateRelativeToEye as _shaderstranslateRelativeToEye, + czm_translucentPhong as _shaderstranslucentPhong, + czm_transpose as _shaderstranspose, + czm_twoPi as _shaderstwoPi, + czm_unpackClippingExtents as _shadersunpackClippingExtents, + czm_unpackDepth as _shadersunpackDepth, + czm_unpackFloat as _shadersunpackFloat, + czm_unpackUint as _shadersunpackUint, + czm_valueTransform as _shadersvalueTransform, + czm_vertexLogDepth as _shadersvertexLogDepth, + czm_webMercatorMaxLatitude as _shaderswebMercatorMaxLatitude, + czm_windowToEyeCoordinates as _shaderswindowToEyeCoordinates, + czm_writeDepthClamp as _shaderswriteDepthClamp, + czm_writeLogDepth as _shaderswriteLogDepth, + czm_writeNonPerspective as _shaderswriteNonPerspective, + addBuffer, + addDefaults, + addExtensionsRequired, + addExtensionsUsed, + addPipelineExtras, + addToArray, + appendForwardSlash, + arrayRemoveDuplicates, + barycentricCoordinates, + binarySearch, + buildDrawCommand, + buildModuleUrl, + buildVoxelDrawCommands, + clone$1 as clone, + combine$2 as combine, + computeFlyToLocationForRectangle, + createBillboardPointCallback, + createElevationBandMaterial, + createGooglePhotorealistic3DTileset, + createGuid, + createMaterialPropertyDescriptor, + createOsmBuildingsAsync, + createPropertyDescriptor, + createRawPropertyDescriptor, + createTangentSpaceDebugPrimitive, + createTaskProcessorWorker, + createUniform$1 as createUniform, + createUniformArray, + createWorldBathymetryAsync, + createWorldImageryAsync, + createWorldTerrainAsync, + decodeGoogleEarthEnterpriseData, + decodeVectorPolylinePositions, + defaultValue, + defer, + defined, + demodernizeShader, + deprecationWarning, + destroyObject, + exportKml, + findAccessorMinMax, + findContentMetadata, + findGroupMetadata, + findTileMetadata, + forEachTextureInMaterial, + formatError, + freezeRenderState, + getAbsoluteUri, + getAccessorByteStride, + getBaseUri, + getBinaryAccessor, + getClipAndStyleCode, + getClippingFunction, + getComponentReader, + getElement, + getExtensionFromUri, + getFilenameFromUri, + getImageFromTypedArray, + getImagePixels, + getJsonFromTypedArray, + getMagic, + getStringFromTypedArray, + getTimestamp$1 as getTimestamp, + hasExtension, + heightReferenceOnEntityPropertyChanged, + isBitSet, + isBlobUri, + isCrossOriginUrl, + isDataUri, + isLeapYear, + loadAndExecuteScript, + loadCubeMap, + loadImageFromTypedArray, + loadKTX2, + mergeSort, + moveTechniqueRenderStates, + moveTechniquesToExtension, + numberOfComponentsForType, + objectToQuery, + oneTimeWarning, + parseBatchTable, + parseFeatureMetadataLegacy, + parseGlb, + parseResponseHeaders, + parseStructuralMetadata, + pickModel, + pointInsideTriangle, + preprocess3DTileContent, + processVoxelProperties, + queryToObject, + readAccessorPacked, + removeExtension, + removeExtensionsRequired, + removeExtensionsUsed, + removePipelineExtras, + removeUnusedElements, + resizeImageToNextPowerOfTwo, + sampleTerrain, + sampleTerrainMostDetailed, + scaleToGeodeticSurface, + srgbToLinear, + subdivideArray, + updateAccessorComponentTypes, + updateVersion, + usesExtension, + webGLConstantToGlslType, + wrapFunction, + writeTextToCanvas +}; diff --git a/public/assets/cesium.js b/public/assets/cesium.js new file mode 100644 index 0000000..267769a --- /dev/null +++ b/public/assets/cesium.js @@ -0,0 +1 @@ +export * from "./cesium-68463534.js"; diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json new file mode 100644 index 0000000..0dbf157 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":0,"numberOfSamples":1000,"samples":[-0.002403025022753476,-2.5083047211757836e-5,-1.721638967214743e-8,-0.002402558217007106,-2.5020003017226545e-5,-1.7146589882925253e-8,-0.002402152743739069,-2.4908815008776256e-5,-1.7018183343380784e-8,-0.0024018177616850914,-2.4779340864272868e-5,-1.686693112266686e-8,-0.0024015512294922256,-2.4661265859267777e-5,-1.672851429567895e-8,-0.0024013415089134365,-2.4580601237402673e-5,-1.6634308307010567e-8,-0.0024011692853140917,-2.4557354638250633e-5,-1.660856911234815e-8,-0.0024010094083213077,-2.460379520847823e-5,-1.666634004388421e-8,-0.002400832781870665,-2.472274606391698e-5,-1.681138635859172e-8,-0.0024006088674261195,-2.490565851910724e-5,-1.7033840158805374e-8,-0.0024003096414815053,-2.513083477542098e-5,-1.7307985763326293e-8,-0.002399915678730765,-2.5363106308028472e-5,-1.759177707540246e-8,-0.0023994239684226163,-2.5557205638682287e-5,-1.7830822072448312e-8,-0.0023988549431304905,-2.566700881355288e-5,-1.7969488578482e-8,-0.0023982538707374547,-2.5660422954022525e-5,-1.7968844164137065e-8,-0.002397681821948537,-2.553480284678542e-5,-1.7825226886235993e-8,-0.0023971964165357008,-2.53237668313255e-5,-1.7578462540315414e-8,-0.002396830441918346,-2.50885777844268e-5,-1.7301586465142487e-8,-0.0023965800106651434,-2.4896546614298096e-5,-1.7075078798371497e-8,-0.0023964084361551537,-2.4797687943490375e-5,-1.695902560230991e-8,-0.002396262002993096,-2.481096708533641e-5,-1.6976666372280337e-8,-0.0023960882393536166,-2.4923817586803518e-5,-1.7113670694608337e-8,-0.002395849219877066,-2.5101106375207836e-5,-1.732863106912266e-8,-0.002395527525579831,-2.5297461255455714e-5,-1.756761197379987e-8,-0.0023951260596151974,-2.546854998291281e-5,-1.7777564319951067e-8,-0.0023946640036132836,-2.5579325396643004e-5,-1.7916241394922998e-8,-0.0023941708783994835,-2.5608875350224024e-5,-1.7958135357141878e-8,-0.0023936800199459637,-2.5552141704174967e-5,-1.7896681829365477e-8,-0.00239322243029576,-2.5418865388500117e-5,-1.774311016303839e-8,-0.0023928218677541743,-2.5230314934074022e-5,-1.7522587181791123e-8,-0.0023924917832175113,-2.5014690159013176e-5,-1.7268730448048223e-8,-0.0023922342643846748,-2.480218762163173e-5,-1.7017686942652696e-8,-0.0023920407464684762,-2.4620565317509125e-5,-1.6802798466007283e-8,-0.0023918939307276768,-2.4491771693316273e-5,-1.6650542584010726e-8,-0.0023917702332855676,-2.442975015807349e-5,-1.6577888357278284e-8,-0.002391642329452238,-2.443909807420655e-5,-1.6590679729922046e-8,-0.002391481763245852,-2.4514179502452957e-5,-1.6682551340715887e-8,-0.0023912619080620466,-2.4638499724969643e-5,-1.6834129065335303e-8,-0.002390961805205984,-2.478455800610903e-5,-1.701276797456279e-8,-0.00239057134744484,-2.4915132198915024e-5,-1.717399678816932e-8,-0.0023900974268101054,-2.4987729973603072e-5,-1.7266795508165544e-8,-0.0023895689055318833,-2.496391501976109e-5,-1.7244787681999786e-8,-0.002389036165074365,-2.4823284691699932e-5,-1.7083063873624844e-8,-0.002388560578292379,-2.4577378315217863e-5,-1.6794918110509053e-8,-0.0023881937570601162,-2.4274142413621198e-5,-1.643724545979219e-8,-0.0023879553394346147,-2.3985163329236852e-5,-1.6095335313882396e-8,-0.002387823242597225,-2.3778727505381422e-5,-1.5850778179207802e-8,-0.002387743703083488,-2.3693514905278695e-5,-1.575012576846581e-8,-0.002387654469699301,-2.3727803248252375e-5,-1.57919573836453e-8,-0.0023875068224310926,-2.384701163322787e-5,-1.5935693828749185e-8,-0.0023872766838733636,-2.4000872036063545e-5,-1.6121849968027748e-8,-0.0023869645383715133,-2.4139837531397063e-5,-1.6291451853276617e-8,-0.0023865890688437295,-2.4225578577636494e-5,-1.6398545934918142e-8,-0.002386179207668243,-2.4235415814278647e-5,-1.641560182566368e-8,-0.0023857671367677994,-2.4162608465253676e-5,-1.633403013000638e-8,-0.00238538293231372,-2.4014446579879058e-5,-1.6162059832962554e-8,-0.002385050648932289,-2.3809267842749758e-5,-1.5921265822080736e-8,-0.0023847856192039767,-2.357281279621325e-5,-1.564223465313254e-8,-0.002384592973846085,-2.333418942320294e-5,-1.5359717819261274e-8,-0.0023844674152753756,-2.3121781930974167e-5,-1.5107704928910368e-8,-0.0023843942234786524,-2.2959461734624766e-5,-1.491486592392592e-8,-0.002384351361188566,-2.2863520256191973e-5,-1.4800873864748202e-8,-0.0023843123252193354,-2.28406536006252e-5,-1.4773996666932113e-8,-0.0023842493365599203,-2.2887020091128393e-5,-1.4829969279080835e-8,-0.0023841366567967904,-2.2988230871289267e-5,-1.4951960812478233e-8,-0.0023839539952364617,-2.312021069380629e-5,-1.5111546301631272e-8,-0.00238369008534005,-2.3251022890859802e-5,-1.527079819049034e-8,-0.0023833464925758774,-2.3344139544444378e-5,-1.5386101234343148e-8,-0.002382941139623567,-2.336411463944466e-5,-1.5414884137776942e-8,-0.002382509826925251,-2.328539769468119e-5,-1.532618136616557e-8,-0.0023821027927208825,-2.3103440347943915e-5,-1.5114003628255345e-8,-0.002381773349088804,-2.284408291453904e-5,-1.4808671898883374e-8,-0.0023815590512039917,-2.2563826220574735e-5,-1.4477243667166011e-8,-0.002381463086871345,-2.233471929550198e-5,-1.4205559558666824e-8,-0.0023814485095478804,-2.221697578834785e-5,-1.4065641166745777e-8,-0.002381452228381859,-2.2233998994991225e-5,-1.4085907881538568e-8,-0.002381411455037569,-2.2365307161191684e-5,-1.424262147988882e-8,-0.0023812864408547367,-2.2559894107652725e-5,-1.447559680357265e-8,-0.002381068549780454,-2.2758766135733266e-5,-1.4714854003566721e-8,-0.0023807747559344136,-2.291337561706086e-5,-1.4902487127724783e-8,-0.002380436370789755,-2.2994297064707167e-5,-1.5003052078078702e-8,-0.0023800885646524635,-2.299177707261808e-5,-1.5004382649226507e-8,-0.00237976327801646,-2.291211671228343e-5,-1.4913466509235396e-8,-0.0023794853741548514,-2.277298527889861e-5,-1.4750994633350504e-8,-0.0023792708581126575,-2.2599122259547465e-5,-1.4546281765613793e-8,-0.0023791261518308006,-2.241861685502684e-5,-1.4332799297124966e-8,-0.002379048025038435,-2.2259517123002332e-5,-1.4144070736454437e-8,-0.002379024159088545,-2.214660348294054e-5,-1.4009774292460906e-8,-0.0023790344674725033,-2.209831973031592e-5,-1.395206580492697e-8,-0.0023790533562057336,-2.2124111902023713e-5,-1.3982415286808531e-8,-0.002379052917494198,-2.222265873839312e-5,-1.4099513692685225e-8,-0.0023790067355613062,-2.238139064397462e-5,-1.428869841454831e-8,-0.002378893869389061,-2.257747476862916e-5,-1.4523091866730754e-8,-0.002378702581053121,-2.2780337278386994e-5,-1.476653436627111e-8,-0.002378433361551305,-2.2955662245878917e-5,-1.4978254730954575e-8,-0.002378100828725866,-2.3070719458652143e-5,-1.511914018072533e-8,-0.0023777339193535064,-2.310095367991105e-5,-1.515956714522654e-8,-0.0023773732909614727,-2.303748192499462e-5,-1.5088399696609955e-8,-0.0023770645160716658,-2.2893966475516838e-5,-1.492131520640025e-8,-0.002376846389675512,-2.2709585344523315e-5,-1.4704506770614907e-8,-0.0023767362857042957,-2.2543662682762967e-5,-1.4508420483594385e-8,-0.0023767187552697256,-2.2459283627088534e-5,-1.4408307234147157e-8,-0.0023767459611238515,-2.2499820209175073e-5,-1.445625065299755e-8,-0.0023767538670920077,-2.2670163085399482e-5,-1.4658709621930782e-8,-0.0023766872411040843,-2.2934727415897178e-5,-1.4973964372283597e-8,-0.0023765193201164465,-2.323369224805631e-5,-1.5331258141108677e-8,-0.0023762563410213845,-2.350669143427009e-5,-1.5658866089500266e-8,-0.002375928430938125,-2.371079089789632e-5,-1.5905466616878e-8,-0.0023755754730009244,-2.382701217823089e-5,-1.6047996748580552e-8,-0.0023752354105984904,-2.3857755177899014e-5,-1.6088754695381856e-8,-0.002374937643938984,-2.3820288416794153e-5,-1.6047823960984603e-8,-0.002374700710601401,-2.3740166302795695e-5,-1.5955340321399732e-8,-0.0023745323579410426,-2.364615831678585e-5,-1.584546360315411e-8,-0.002374430478790293,-2.356666639934087e-5,-1.575205426032653e-8,-0.002374384221762089,-2.352701024171114e-5,-1.57053729084508e-8,-0.0023743752258978223,-2.3547031862098734e-5,-1.572919102890182e-8,-0.0023743792463522813,-2.3638741087943782e-5,-1.5837991897107692e-8,-0.002374368580960303,-2.380412406762251e-5,-1.60343866710735e-8,-0.002374315566041234,-2.403369636554169e-5,-1.6307405665562255e-8,-0.0023741969508027684,-2.4306554286211768E-05,-1.663253558578559e-8,-0.0023739984897390765,-2.4592488041431972e-5,-1.6974166769903272e-8,-0.0023737187937815855,-2.485635257581502e-5,-1.729069822860392e-8,-0.0023733713634909127,-2.506433547134887e-5,-1.75419012861819e-8,-0.002372983923689407,-2.5191127286277645e-5,-1.769739737193478e-8,-0.002372594652471399,-2.5226659292504724e-5,-1.774469317666995e-8,-0.0023722453489884105,-2.518097690876975e-5,-1.7695084665231785e-8,-0.0023719720500917853,-2.508558541252764e-5,-1.758542950683843e-8,-0.0023717945137316262,-2.4989429346639012e-5,-1.7473550411127092e-8,-0.002371707467356645,-2.494832237534192e-5,-1.7425795584798645e-8,-0.002371677894372136,-2.5008867215187453e-5,-1.7497939205762146e-8,-0.0023716521953735695,-2.519167607485704e-5,-1.7715125311405072e-8,-0.002371573067713854,-2.548183725590846e-5,-1.8060341886620035e-8,-0.0023713996123746663,-2.5833052724984733e-5,-1.8479137373701417e-8,-0.002371120733790304,-2.6184543627960917e-5,-1.8899572452170946e-8,-0.002370755545988175,-2.6481976563885553e-5,-1.925703522704526e-8,-0.0023703426289241364,-2.6692240399045317e-5,-1.951183288718046e-8,-0.002369925545652223,-2.6807480392539526e-5,-1.9654094044252732e-8,-0.0023695414256623836,-2.6840554567015164e-5,-1.969852847864199e-8,-0.0023692152111846727,-2.681698378371743e-5,-1.9675010651785046e-8,-0.0023689586030738027,-2.676742403134865e-5,-1.961971546979294e-8,-0.002368771517557994,-2.672230169153053e-5,-1.9568738474777108e-8,-0.0023686442754798733,-2.6708491821190418e-5,-1.9554090992955217e-8,-0.0023685596467347297,-2.6747237733667733e-5,-1.960116950419851e-8,-0.0023684946354959537,-2.68525198499682e-5,-1.97267938434712e-8,-0.002368422377939945,-2.7029396546161804e-5,-1.9937245693158044e-8,-0.002368314731930507,-2.7272358283705946e-5,-2.0226327583010683e-8,-0.002368145999280894,-2.7564325967266348e-5,-2.0574158419038293e-8,-0.0023678977178564387,-2.7877297359742607e-5,-2.0947880438817348e-8,-0.002367563716932125,-2.8175607003251493e-5,-2.13054362009557e-8,-0.0023671538835179904,-2.842219417818171e-5,-2.1602912348808545e-8,-0.0023666947656918185,-2.8587099112517685e-5,-2.1804557557978034e-8,-0.002366225711058261,-2.865603679897383e-5,-2.1892948933762033e-8,-0.0023657906850576426,-2.8636207775475263e-5,-2.1875955583981355e-8,-0.0023654275601418958,-2.855700316341736e-5,-2.178772414823076e-8,-0.0023651577407058874,-2.8464659629023123e-5,-2.168254086275059e-8,-0.002364979157822262,-2.8411626526095733e-5,-2.162241058543541e-8,-0.0023648650418965824,-2.8442979454826838e-5,-2.166103733977592e-8,-0.0023647696710966484,-2.858341235909699e-5,-2.182833892955203e-8,-0.0023646404647817425,-2.8828964162584613e-5,-2.2120438590644107e-8,-0.002364433315624853,-2.9147094222646294e-5,-2.2499504905555506e-8,-0.0023641258489594833,-2.9486173871872614e-5,-2.2904806040155516e-8,-0.0023637232753826293,-2.979130710829397e-5,-2.3271375506734424e-8,-0.0023632546433513643,-3.0020135017275484e-5,-2.3548762139194928e-8,-0.002362761919778162,-3.0152532930312014e-5,-2.371261331000258e-8,-0.002362287259213515,-3.019176737033716e-5,-2.3766181246292998e-8,-0.002361863354709199,-3.015895406508579e-5,-2.3733906423839642e-8,-0.0023615089325091636,-3.0084812691876054e-5,-2.3651770841389847e-8,-0.00236122863993826,-3.0002168291456246e-5,-2.355846990290136e-8,-0.002361015342081342,-2.9940748794497447e-5,-2.3489231721847384e-8,-0.002360853090462664,-2.99242064708113e-5,-2.347223119682423e-8,-0.0023607198261957722,-2.9968579872684983e-5,-2.352671480071416e-8,-0.0023605896206938806,-3.008134175253829e-5,-2.3661849584525067e-8,-0.002360434817332799,-3.0260449420114613e-5,-2.3875596082544623e-8,-0.002360228724551759,-3.049336232044938e-5,-2.4153533560309604e-8,-0.002359949398259028,-3.0756647438100245e-5,-2.4468344706144205e-8,-0.0023595845450922696,-3.1017291850921676e-5,-2.4781284325725616e-8,-0.0023591366902662777,-3.1236974924948935e-5,-2.5047141991886597e-8,-0.0023586265980894577,-3.1379935910133564e-5,-2.5223485405296768e-8,-0.0023580922330621156,-3.1423318194842274e-5,-2.5282880705071384e-8,-0.002357581446433621,-3.136654245445751e-5,-2.5224014627911062e-8,-0.0023571393504713037,-3.123511772789739e-5,-2.507629936540768e-8,-0.0023567945569627356,-3.107585378526121e-5,-2.4894381030997065e-8,-0.002356549808293787,-3.094425143746427e-5,-2.474345004782824e-8,-0.0023563808398743354,-3.088856588907149e-5,-2.468058353057825e-8,-0.002356243673347264,-3.093631165990455e-5,-2.473883210055294e-8,-0.0023560873309623623,-3.108742146766624e-5,-2.491898425872327e-8,-0.002355867681615853,-3.131543790559243e-5,-2.5190695953120915e-8,-0.0023555585115042363,-3.157564626292947e-5,-2.5501820575724358e-8,-0.0023551570793018816,-3.1817414987353845e-5,-2.5792819079502532e-8,-0.0023546830395721335,-3.199708556138092e-5,-2.601196397786125e-8,-0.0023541715928763573,-3.2087761735616844e-5,-2.612699814404651e-8,-0.0023536634728575476,-3.208356074308803e-5,-2.6130313106072467e-8,-0.002353195112875602,-3.199796079202877e-5,-2.6037164980856268e-8,-0.0023527917127598285,-3.185788963483199e-5,-2.5878832104811108e-8,-0.0023524643421163408,-3.1696231806253835e-5,-2.569384848742031e-8,-0.002352210558042157,-3.15451429795799e-5,-2.5520122001298037e-8,-0.002352017095867703,-3.1431404225224024e-5,-2.5389404645823923e-8,-0.0023518632011028735,-3.137387309610943e-5,-2.532421829510982e-8,-0.0023517237164243985,-3.138241693585632e-5,-2.5336544634470662e-8,-0.0023515716747720653,-3.1457557889187125e-5,-2.542738407693742e-8,-0.002351380666688492,-3.159026777706401e-5,-2.5586503563180176e-8,-0.002351127544409854,-3.1761819323126654e-5,-2.5792232842799336e-8,-0.002350795997438297,-3.194420346482523e-5,-2.601189004377488e-8,-0.00235038109753939,-3.210218902073709e-5,-2.620411988036901e-8,-0.0023498939766626002,-3.2198362784118887e-5,-2.6324761207664516e-8,-0.002349364441336059,-3.2201906185988056e-5,-2.6337171516754927e-8,-0.002348838300113838,-3.2099820884316304e-5,-2.622549250364978e-8,-0.002348367104865175,-3.1906193387378433E-05,-2.6005638953133388e-8,-0.002347991928908947,-3.16632964565759e-5,-2.572670334096174e-8,-0.0023477278385863123,-3.1430895046698076e-5,-2.5458524871709287e-8,-0.0023475573302447783,-3.1266834683295797e-5,-2.526903432937616e-8,-0.0023474365947856223,-3.1207840834265524e-5,-2.5201788974958383e-8,-0.0023473111312674834,-3.125926073193481e-5,-2.5263855985966862e-8,-0.0023471329217680113,-3.139668630853095e-5,-2.5427484190962568e-8,-0.0023468725828316842,-3.157629805487812e-5,-2.564195034641037e-8,-0.00234652400711633,-3.174838223286182e-5,-2.5849203831761563e-8,-0.0023461023891960834,-3.1869477830964374e-5,-2.5998061315297644e-8,-0.0023456379459007243,-3.191071358278629e-5,-2.6054089874945166e-8,-0.002345167714297938,-3.1861618822297345e-5,-2.6004274687434745e-8,-0.0023447273964050676,-3.1729710102991125e-5,-2.5856743363241975e-8,-0.0023443447623778383,-3.15367263237694e-5,-2.5636504725218675e-8,-0.002344035611415732,-3.1312828941514695e-5,-2.5378716588854288e-8,-0.0023438025868741026,-3.1090321324122036e-5,-2.5121307043493483e-8,-0.002343636419494298,-3.0898215687290654e-5,-2.4898533605619872e-8,-0.0023435187346924568,-3.075840762917019e-5,-2.473640851696107e-8,-0.002343425470101371,-3.06836209512552e-5,-2.4650217468068794e-8,-0.002343330156203922,-3.067678824239108e-5,-2.46437581014699e-8,-0.0023432067557343844,-3.0731268964403044e-5,-2.4709591242115973e-8,-0.002343032205144756,-3.083142896996042e-5,-2.482971769728214e-8,-0.0023427890317182145,-3.09534849684997e-5,-2.4976536733214626e-8,-0.002342468429998982,-3.1066960867543575e-5,-2.5114480866863458e-8,-0.0023420738829506476,-3.113759753821509e-5,-2.520334251191813e-8,-0.0023416245655075696,-3.113286617338482e-5,-2.5204692814982757e-8,-0.002341156456037676,-3.1030702451985074e-5,-2.5092155875587517e-8,-0.0023407180452088712,-3.083007768640861e-5,-2.4863906224778936e-8,-0.0023403583393829482,-3.055874873840108e-5,-2.4551880478986413e-8,-0.002340109110049135,-3.027131810595971e-5,-2.421961909495806e-8,-0.0023399695530012623,-3.0033690127916367e-5,-2.394416454197952e-8,-0.0023399035996637175,-2.9898874983898596e-5,-2.378781857784365e-8,-0.0023398534173924984,-2.9886919236503446e-5,-2.3774659522504135e-8,-0.002339761711113448,-2.9979953784273124e-5,-2.388461211409085e-8,-0.0023395905205925225,-3.0132912884441697e-5,-2.4065731184666787e-8,-0.002339328969507674,-3.0291463113513845e-5,-2.4254908440399182e-8,-0.0023389905263682936,-3.0407909014329455e-5,-2.439632805788379e-8,-0.002338604647812188,-3.0450610353352113e-5,-2.4452510933726005e-8,-0.002338207386718835,-3.0406942615971795e-5,-2.4407957962391716e-8,-0.002337833512955816,-3.0281802581374335e-5,-2.4267646192649814e-8,-0.002337510916804099,-3.009374007485284e-5,-2.405271127085375e-8,-0.00233725717872705,-2.9870050109659613e-5,-2.379481298482102e-8,-0.0023370780896862574,-2.96415499392353e-5,-2.3530020163429226e-8,-0.0023369679571642664,-2.943765111817507e-5,-2.3292964938693384e-8,-0.002336911380731853,-2.928228272071026e-5,-2.311196745938867e-8,-0.0023368860519105425,-2.9191004014698512e-5,-2.3005572673000774e-8,-0.0023368660995786595,-2.9169474421886248e-5,-2.2980719814710166e-8,-0.002336825467155114,-2.921325593941368e-5,-2.3032512896595408e-8,-0.0023367409423963475,-2.9308629309781252e-5,-2.3145193486284356e-8,-0.002336594789812839,-2.94340434461076e-5,-2.329383537317645e-8,-0.002336377141683103,-2.9562078747041886e-5,-2.3446595994696407e-8,-0.0023360882937399465,-2.9662099579462933e-5,-2.3567732219797592e-8,-0.0023357408585416017,-2.9704065354320472e-5,-2.36219691020052e-8,-0.0023353611169372288,-2.9664178807460198e-5,-2.3581074777115405e-8,-0.002334987901996926,-2.953256184083392e-5,-2.3432902238347995e-8,-0.002334666656879615,-2.9321444023828176e-5,-2.3191111499019182e-8,-0.002334437144125591,-2.906967526378198e-5,-2.2900614292587276e-8,-0.0023343170286952335,-2.8837540628692366e-5,-2.263164135915559e-8,-0.002334289377364724,-2.868863915936848e-5,-2.245863079739621e-8,-0.0023343042731189534,-2.8664576401788524e-5,-2.243065985991554e-8,-0.002334297427240077,-2.8766728884431434e-5,-2.2550060161150142e-8,-0.00233421602436304,-2.8956937999179782e-5,-2.277304822604038e-8,-0.0023340366493231914,-2.9175695277364925e-5,-2.3030723691705274e-8,-0.0023337675567428337,-2.9365148437702835e-5,-2.325572494540632e-8,-0.002333439019167699,-2.948499872544599e-5,-2.3400714149062195e-8,-0.002333090235900311,-2.9517803647735512e-5,-2.3444668908795366e-8,-0.002332758701346869,-2.9466638538369463e-5,-2.3390385484474364e-8,-0.0023324738052357035,-2.934937562502968e-5,-2.3258055105401835e-8,-0.0023322540424882687,-2.919255582833955e-5,-2.3078281732160556e-8,-0.0023321064600515273,-2.902614663617285e-5,-2.2885999487207492e-8,-0.002332027286009202,-2.8879263050207602e-5,-2.271540058262342e-8,-0.0023320033619865835,-2.877662704188809e-5,-2.259567613496163e-8,-0.002332014289946477,-2.873576097567269e-5,-2.2547631244607782e-8,-0.002332035177135321,-2.8765014379972653e-5,-2.2581326280258576e-8,-0.0023320398449503863,-2.8862571973660708e-5,-2.2694919143851268e-8,-0.0023320042471653172,-2.9016654866027363e-5,-2.287492871831799e-8,-0.0023319096779583115,-2.9206946607571382e-5,-2.3097917898279694e-8,-0.002331745434296553,-2.940702053860624e-5,-2.333330260051453e-8,-0.0023315107913132412,-2.9587554741398894e-5,-2.354703004535643e-8,-0.002331216183994399,-2.9720241445388588e-5,-2.370604059396504e-8,-0.0023308833968589734,-2.9782371874826208e-5,-2.378354402409868e-8,-0.0023305442821816677,-2.976211745161164e-5,-2.376519028712881e-8,-0.002330237019842478,-2.9664138028036154e-5,-2.3655730605611676e-8,-0.002329998741183291,-2.9513937315933643e-5,-2.3484296706424633e-8,-0.0023298543227104943,-2.935776247905231e-5,-2.3304483190610554e-8,-0.0023298039688696283,-2.9254146272590037e-5,-2.3184600111912306e-8,-0.0023298161627486316,-2.9255771124284795e-5,-2.3186513526067538e-8,-0.002329833717182933,-2.9387407680729007e-5,-2.3339799540173714e-8,-0.00232979429485865,-2.963251445919433e-5,-2.3625939095795707e-8,-0.0023296555485235837,-2.993876684354111e-5,-2.3984573422930422e-8,-0.002329410031430962,-3.0240089226068864e-5,-2.433902191722381e-8,-0.002329082684861528,-3.048133910260082e-5,-2.4624941076546366e-8,-0.002328716252266335,-3.063272313348873e-5,-2.4807118980201846e-8,-0.0023283552432151315,-3.0691090518933916e-5,-2.4881121231374615e-8,-0.002328035235814446,-3.067316204035687e-5,-2.486564617259907e-8,-0.002327778453652459,-3.060672619689269e-5,-2.4792504271784795e-8,-0.0023275936390781573,-3.052324005011218e-5,-2.4698123022970693e-8,-0.002327477917828302,-3.0452785078251434e-5,-2.461765146651857e-8,-0.002327419112590265,-3.0420884134364205E-05,-2.458113394257909e-8,-0.0023273980040969685,-3.0446326357327403e-5,-2.4610839446448034e-8,-0.002327390669521878,-3.0539531096370326e-5,-2.4719266183936192e-8,-0.0023273711094918687,-3.070139397965835e-5,-2.4907774784639605e-8,-0.002327314298389271,-3.0922803788878494e-5,-2.5166047977091938e-8,-0.002327199604182002,-3.118523180180453e-5,-2.5472802828543438e-8,-0.0023270141555905726,-3.146275582275373e-5,-2.579813850369303e-8,-0.002326755507257778,-3.1725524753218145e-5,-2.6107509797618743e-8,-0.002326433025242352,-3.194433915074523e-5,-2.636696380227279e-8,-0.00232606757107646,-3.2095816875852493E-05,-2.6549064620552972e-8,-0.0023256892347763903,-3.216744119251998e-5,-2.663874128588696e-8,-0.0023253330548705857,-3.216173673953351e-5,-2.6638224765391106e-8,-0.002325032753407156,-3.209873777588853e-5,-2.6570101510359574e-8,-0.0023248127299698297,-3.201549252585091e-5,-2.6476970450584947e-8,-0.002324679419257254,-3.1960909325668365e-5,-2.641563798078472e-8,-0.002324614738368727,-3.198471760129885e-5,-2.6444333423830437e-8,-0.0023245759518624605,-3.2121629871326e-5,-2.6604171937243653e-8,-0.002324505785473568,-3.237602913514e-5,-2.6901108196581215e-8,-0.0023243518127423596,-3.271591879496891e-5,-2.7298653087985366e-8,-0.00232408675837698,-3.308237216229446e-5,-2.772870037338478e-8,-0.0023237183421038277,-3.341134600686158e-5,-2.8116827565107905e-8,-0.0023232834120907914,-3.365603424276712e-5,-2.8408283829963784e-8,-0.0023228315250686865,-3.379852594585868e-5,-2.8581601521190148e-8,-0.0023224081917482394,-3.384823308876176e-5,-2.8646918820079517e-8,-0.0023220447513682056,-3.3832392487888304e-5,-2.8635163154902712e-8,-0.0023217556857669294,-3.378539642682306e-5,-2.8585851446400122e-8,-0.0023215406467797794,-3.374081042009061e-5,-2.8537897313167375e-8,-0.002321388188291431,-3.3726795999537757e-5,-2.8524238705810844e-8,-0.002321279357326137,-3.376398701175925e-5,-2.8569237172436706e-8,-0.002321190580067218,-3.3864561252015965e-5,-2.8687469509032147e-8,-0.0023210960815719848,-3.403170234189584e-5,-2.8883032294239802e-8,-0.0023209703112198727,-3.425921865422195e-5,-2.9149091545929388e-8,-0.0023207907692627456,-3.453153525414017e-5,-2.9467892708359517e-8,-0.002320541348280485,-3.4824632907782434e-5,-2.9811852888919886e-8,-0.002320215787982576,-3.510859047522046e-5,-3.014647119465895e-8,-0.002319820326628823,-3.5352020534393274e-5,-3.0435397604764066e-8,-0.002319374429235887,-3.5528027890910064e-5,-3.064726176518535e-8,-0.0023189086929537852,-3.562058707993201e-5,-3.0763027321289934e-8,-0.0023184596969337903,-3.562967431567573e-5,-3.078198150000386e-8,-0.0023180625159862473,-3.557348082881343e-5,-3.072444153370548e-8,-0.0023177424037032486,-3.548664144440317e-5,-3.062992075551395e-8,-0.0023175074984734543,-3.5414226963611394e-5,-3.0550393228261676e-8,-0.0023173444808164832,-3.5402047537825155e-5,-3.053919267474974e-8,-0.002317219043515323,-3.548478675955916e-5,-3.063722510387765e-8,-0.0023170825452282313,-3.567474791693208e-5,-3.085971138660794e-8,-0.0023168847150472982,-3.595522696647335e-5,-3.118819869005432e-8,-0.0023165894160324624,-3.628263070896687e-5,-3.157275232013399e-8,-0.0023161874027681608,-3.659879209134966e-5,-3.194610912976707e-8,-0.002315699674318987,-3.6849589557777495e-5,-3.224527727736699e-8,-0.002315169322935829,-3.7001624225642415e-5,-3.2430960432418255e-8,-0.002314646199700832,-3.704960690848625e-5,-3.249625130896201e-8,-0.0023141720768090047,-3.701289220350198e-5,-3.246278529929417e-8,-0.0023137719944856,-3.692533958583261e-5,-3.2369181497699095e-8,-0.002313452787336121,-3.682436937453514e-5,-3.225850415814049e-8,-0.002313206349815514,-3.674303927821273e-5,-3.216911319350878e-8,-0.002313014513893187,-3.6705975238209506e-5,-3.21298653443614e-8,-0.002312853494672486,-3.6728114464930174e-5,-3.215852030546475e-8,-0.0023126972338266515,-3.681481612065799e-5,-3.226175333094992e-8,-0.0023125198655322456,-3.696232465768661e-5,-3.24356389814037e-8,-0.002312297893017724,-3.7158178604489365e-5,-3.266612338087536e-8,-0.0023120126639769563,-3.7381726521067834e-5,-3.292962936131338e-8,-0.002311653424383115,-3.760539504033395e-5,-3.319450237088803e-8,-0.0023112206387045776,-3.7797568417562995e-5,-3.3424282093674193e-8,-0.002310728536788081,-3.7927679776685745e-5,-3.3583518129125895e-8,-0.0023102052694704335,-3.7973269632081315e-5,-3.3645883688399196e-8,-0.002309689114953737,-3.792741024238655e-5,-3.3602769741033175e-8,-0.002309220367796046,-3.780365018678395e-5,-3.34690861984953e-8,-0.0023088306454635615,-3.763560952953059e-5,-3.328295822689161e-8,-0.0023085331437765486,-3.7470095324169245e-5,-3.30979876994702e-8,-0.0023083175552887736,-3.7355299923970754e-5,-3.296981668241202e-8,-0.0023081517291295645,-3.732774019023125e-5,-3.2941121239366296e-8,-0.0023079897002703125,-3.740204716129852e-5,-3.302971182509186e-8,-0.0023077837234663535,-3.7566599907923365e-5,-3.322321468544985e-8,-0.0023074969972720206,-3.778618699150824e-5,-3.348181192736664e-8,-0.002307113642460123,-3.801111136025596e-5,-3.374850764245679e-8,-0.002306642967714749,-3.819047303514916e-5,-3.3964389987148476e-8,-0.0023061164179579287,-3.8285780849737995e-5,-3.40844388236443e-8,-0.0023055780533455137,-3.828042081343265e-5,-3.408864550347391e-8,-0.0023050720265702773,-3.818189606197478e-5,-3.3984813393723e-8,-0.0023046316398957264,-3.801683262139339e-5,-3.3802987367837267e-8,-0.00230427334288954,-3.7821682524135505e-5,-3.358486019035794e-8,-0.0023039963644423222,-3.7633111972824855e-5,-3.337272686138091e-8,-0.002303786336992908,-3.748100255910153e-5,-3.320135317605305e-8,-0.0023036204437704402,-3.738497046118624e-5,-3.3093833427999516e-8,-0.002303472191629436,-3.735370107695463e-5,-3.306068870435814e-8,-0.002303315004370737,-3.738581151208172e-5,-3.310077586295026e-8,-0.0023031247168510474,-3.7471158388023855e-5,-3.32027746012847e-8,-0.002302881512812013,-3.759204402485969e-5,-3.334659244660564e-8,-0.002302571933303701,-3.772437161974421e-5,-3.3504698526810776e-8,-0.0023021913377570913,-3.7839318120416736e-5,-3.364401288936653e-8,-0.0023017466592312736,-3.790639624397905e-5,-3.3729365113627754e-8,-0.002301258499438132,-3.789868982799408e-5,-3.3729469251606456e-8,-0.0023007607416336475,-3.780025860121621e-5,-3.362545368835861e-8,-0.0023002955727393715,-3.761398422436507e-5,-3.341996763976326e-8,-0.002299903135206751,-3.7366095073082776e-5,-3.314251715734096e-8,-0.002299608241321281,-3.7103131944292765e-5,-3.284613208267745e-8,-0.002299409859179875,-3.687991824381861e-5,-3.259369265324991e-8,-0.002299279285932504,-3.674229260682073e-5,-3.243819215569253e-8,-0.002299168823546775,-3.6712133551511284e-5,-3.240551750739637e-8,-0.002299027108588892,-3.678121604662647e-5,-3.248721326687466e-8,-0.0022988143521173038,-3.6915489318077446e-5,-3.2645093229978927e-8,-0.0022985121434507642,-3.706652291671608e-5,-3.282408232012828e-8,-0.0022981259731840605,-3.718510344513982e-5,-3.296765596479805e-8,-0.002297681444338649,-3.723291069296564e-5,-3.3031266622567177e-8,-0.0022972163826716816,-3.7189964304819385e-5,-3.299108395567988e-8,-0.002296771289655474,-3.705699893642229e-5,-3.284699771750507e-8,-0.0022963804162048507,-3.685301926143306e-5,-3.2620069474865724e-8,-0.0022960653412444033,-3.66092080660818e-5,-3.234570517089325e-8,-0.0022958321994601843,-3.6361104881873565e-5,-3.206471491834107e-8,-0.002295672602594345,-3.6141216362085723e-5,-3.181475278986125e-8,-0.002295567237924504,-3.5973699239903435e-5,-3.1624065630400416e-8,-0.0022954906243840873,-3.5871742882865936e-5,-3.150833328403298e-8,-0.002295415668514197,-3.583734289021038e-5,-3.1470303577740756e-8,-0.002295317231199662,-3.5862619387422194e-5,-3.15012747362056e-8,-0.002295174587684972,-3.593175025312556e-5,-3.158334026307848e-8,-0.0022949731503511582,-3.6022919077861825e-5,-3.169165951737354e-8,-0.0022947059593891967,-3.6110200777476796e-5,-3.1796616976641045e-8,-0.0022943752972072132,-3.616576445549112e-5,-3.186629056886203e-8,-0.002293994395917849,-3.616308491839482e-5,-3.1870055583428156e-8,-0.0022935884913046806,-3.608188698839053e-5,-3.1784218012190775e-8,-0.002293193570220022,-3.591490428985524e-5,-3.159981966187581e-8,-0.002292850700555697,-3.567488665407547e-5,-3.1330816136700846e-8,-0.0022925949121289655,-3.539799888834784e-5,-3.101814903088958e-8,-0.002292441079759657,-3.5138654460845667e-5,-3.072396888884776e-8,-0.0022923737482313526,-3.495377210004042e-5,-3.051367324612897e-8,-0.0022923487357085484,-3.4881645478195986e-5,-3.043169702193616e-8,-0.0022923082878944408,-3.492651926994169e-5,-3.048374540670587e-8,-0.0022922023645509603,-3.5057777584302726e-5,-3.063565736187704e-8,-0.002292004823110608,-3.522321745129158e-5,-3.0828335408719365e-8,-0.002291718031987991,-3.536782916311345e-5,-3.099901295008251e-8,-0.0022913672330241424,-3.544908418763723e-5,-3.109866179650461e-8,-0.002290990059070643,-3.544468044302114e-5,-3.1100956371175926e-8,-0.0022906260283061795,-3.535334262818601e-5,-3.1003445892457103e-8,-0.0022903084934227853,-3.5191150650947184e-5,-3.082366001102285e-8,-0.002290059645962504,-3.4985740590012e-5,-3.059271116004469e-8,-0.002289888308889336,-3.476990829758171e-5,-3.034806608016834e-8,-0.002289790112933232,-3.457553303386381e-5,-3.0126527996035566e-8,-0.0022897496397346197,-3.442855427528838e-5,-2.995832382862933e-8,-0.002289743927638933,-3.434557978525591e-5,-2.986303752963534e-8,-0.002289746588173612,-3.433235628935457e-5,-2.984772570762622e-8,-0.002289731806192985,-3.438399705495003e-5,-2.9907130752155833e-8,-0.0022896776371395563,-3.448658144544781e-5,-3.0025539997263514e-8,-0.002289568333240068,-3.4619516180843974e-5,-3.0179546880832127e-8,-0.002289395830989697,-3.47581192864351e-5,-3.034104020878307e-8,-0.0022891606980330746,-3.487624615385044e-5,-3.048017863245395e-8,-0.0022888727561433233,-3.494909690242651e-5,-3.0568516096956604e-8,-0.0022885513883073552,-3.4956571873741554e-5,-3.058275352336701e-8,-0.002288225022291335,-3.4887629910986334e-5,-3.050971134872694e-8,-0.0022879285346280604,-3.474558680788467e-5,-3.0352495822772635e-8,-0.002287697014005668,-3.4552914595581084e-5,-3.013619110840197e-8,-0.002287555258528512,-3.4352264826514714e-5,-2.990924381258495e-8,-0.002287505296293813,-3.419939650252042e-5,-2.9735499630763315e-8,-0.0022875185392014596,-3.414608973943245e-5,-2.9674650423240414e-8,-0.002287540654767576,-3.421841512072958e-5,-2.975725826269698e-8,-0.0022875109191809696,-3.44028369555647e-5,-2.9968681291149824e-8,-0.0022873866431173677,-3.4650463730046105e-5,-3.025373403994287e-8,-0.002287158332342123,-3.489747604808045e-5,-3.05398504214709e-8,-0.0022868484445149025,-3.5088852879194874e-5,-3.076405861695239e-8,-0.0022864982748903593,-3.519317267669936e-5,-3.0889870385194194e-8,-0.002286152562989151,-3.520525313625685e-5,-3.091044534452543e-8,-0.002285848351995372,-3.514064936767193e-5,-3.084259232463975e-8,-0.0022856095545583004,-3.5027359972136336e-5,-3.071759518882632e-8,-0.0022854458582351883,-3.4898128170332654e-5,-3.057260162184731e-8,-0.00228535406658743,-3.4784542000901826e-5,-3.0443888195242704e-8,-0.0022853205545476122,-3.471284955278595e-5,-3.0361936066289834e-8,-0.0022853242782383083,-3.4701131164836125e-5,-3.034799776992067e-8,-0.0022853401172956323,-3.475768108400181e-5,-3.0412079618106474e-8,-0.0022853423369857883,-3.488055943683937e-5,-3.055234935450222e-8,-0.0022853079331452636,-3.505829657473036e-5,-3.075595068991225e-8,-0.002285219540357508,-3.5271714452898415e-5,-3.1001145596984345e-8,-0.0022850675526555806,-3.5496617417606936e-5,-3.12604400979373e-8,-0.0022848513167228906,-3.5706935033342264e-5,-3.150417106161792e-8,-0.0022845794630886704,-3.587803665272236e-5,-3.170422273669897e-8,-0.0022842694256383967,-3.599011192601114e-5,-3.183778648177624e-8,-0.00228394612191299,-3.6031573527607656e-5,-3.1891182357691236e-8,-0.002283639559272516,-3.6002497987339216e-5,-3.1863829412209876e-8,-0.0022833807000028155,-3.591781523569677e-5,-3.17720571397393e-8,-0.002283194835117489,-3.580895633737797e-5,-3.1651234007313374e-8,-0.0022830926687873554,-3.572151453512309e-5,-3.155331255203707e-8,-0.0022830615120185546,-3.57062013456485e-5,-3.1536574359696766e-8,-0.002283061910144253,-3.5802515052971905e-5,-3.1646865496677e-8,-0.0022830358716624693,-3.602024681505544e-5,-3.1896238479571526e-8,-0.002282927452508825,-3.6329876875859376e-5,-3.2251745516056244e-8,-0.0022827062816265977,-3.667107036558002e-5,-3.264498114105585e-8,-0.0022823796709535715,-3.697658131461953e-5,-3.299928501542816e-8,-0.0022819864232603475,-3.719735460090399e-5,-3.325834215160285e-8,-0.0022815785791103415,-3.731532145924846e-5,-3.340080377913226e-8,-0.0022812032084957965,-3.734128205682896e-5,-3.3438034270071183e-8,-0.002280891871937716,-3.7304369843453694e-5,-3.3402379181189025e-8,-0.00228065814223643,-3.724061603780327e-5,-3.333439792808469e-8,-0.0022805000038872204,-3.718451764462349e-5,-3.327337443004344e-8,-0.0022804039844390635,-3.7164175330215406e-5,-3.325171023981485e-8,-0.002280349211641098,-3.7198996010101034e-5,-3.3292116454290506e-8,-0.0022803108906574855,-3.729879835377055e-5,-3.3406389414515064e-8,-0.002280263357184188,-3.746369139111816e-5,-3.359514042205903e-8,-0.0022801829142725643,-3.76845561343038e-5,-3.3848312986735143e-8,-0.0022800505440541212,-3.794419075362827e-5,-3.4146529008746734e-8,-0.002279854394613768,-3.821932509749697e-5,-3.446344080378021e-8,-0.002279591667380771,-3.8483592197162534e-5,-3.4769134737453335e-8,-0.0022792694769532365,-3.8711202674219674e-5,-3.503427192200282e-8,-0.002278904453787725,-3.888090559245803e-5,-3.523451107453436e-8,-0.002278520994022731,-3.897981593858639e-5,-3.5354790439935546e-8,-0.0022781481387727765,-3.900661067575245e-5,-3.539296714173588e-8,-0.002277815196272408,-3.897358681368924e-5,-3.536228182941742e-8,-0.0022775462453310945,-3.8907078916294634e-5,-3.5292063500544346e-8,-0.0022773537578315915,-3.88453723888866e-5,-3.5225611058902015e-8,-0.0022772323066882973,-3.88328268780596e-5,-3.5213664861948535e-8,-0.002277154719218136,-3.89093864059176e-5,-3.5302432695555914e-8,-0.0022770743013513575,-3.909671606337604e-5,-3.551757119061668e-8,-0.0022769361938568297,-3.93858582620144e-5,-3.584980135264396e-8,-0.0022766965332619883,-3.9734321357865546e-5,-3.625133407898208e-8,-0.002276341115211891,-4.007817531691193e-5,-3.664954907985626e-8,-0.0022758922917568173,-4.035551223226274e-5,-3.697373201351628e-8,-0.0022753992488523085,-4.0528709716748785e-5,-3.7180470529775404e-8,-0.0022749180581077707,-4.059371095721217e-5,-3.726429156698758e-8,-0.0022744933359550488,-4.057442247318822e-5,-3.7251455930854735e-8,-0.0022741491150162865,-4.0509294110553696e-5,-3.718495011122612e-8,-0.0022738888817427747,-4.043836498717976e-5,-3.7109976390399145e-8,-0.0022737006122365193,-4.0394935220934196e-5,-3.706454561541384e-8,-0.0022735628534328385,-4.0401953921682715e-5,-3.7075254422409025e-8,-0.0022734497848497666,-4.047142453162688e-5,-3.7156399239620105e-8,-0.0022733348583905645,-4.060512607912676e-5,-3.731060746631049e-8,-0.0022731934580261463,-4.0795705115488924e-5,-3.752998308750005e-8,-0.00227300512552994,-4.102789765037355e-5,-3.7797496246937914e-8,-0.0022727556876095496,-4.128004247365327e-5,-3.808875005360056e-8,-0.002272439315133133,-4.152626986166031e-5,-3.837450044928072e-8,-0.0022720601389120266,-4.173970137526162e-5,-3.862427282168575e-8,-0.0022716327599983676,-4.1896595491755895e-5,-3.8811002059216745e-8,-0.0022711810539608945,-4.1980908267824755e-5,-3.8916135263443654e-8,-0.00227073496835204,-4.1988409487146426e-5,-3.8934279948754235e-8,-0.002270325441507122,-4.192927899551331e-5,-3.8876227340469446e-8,-0.002269978122215947,-4.1828177158028644e-5,-3.8769219119330844e-8,-0.00226970702629286,-4.172123601459589e-5,-3.865378498185866e-8,-0.0022695094556672577,-4.1649926366732944e-5,-3.857700174244831e-8,-0.002269363629343624,-4.165219466353312e-5,-3.858250738357373e-8,-0.0022692306298698933,-4.175204263636338e-5,-3.869853604806306e-8,-0.0022690619905320303,-4.195007217268219e-5,-3.892687238355782e-8,-0.0022688127656313537,-4.22189359377569e-5,-3.923733305382498e-8,-0.0022684568851602466,-4.2507766167857475e-5,-3.9572560430991624e-8,-0.002267998326091102,-4.275672312180571e-5,-3.986449700076138e-8,-0.0022674714734245843,-4.291695195769548e-5,-4.005713795935709e-8,-0.0022669291597497737,-4.296662160132691e-5,-4.012487438155247e-8,-0.0022664242564903914,-4.2915295188340505e-5,-4.007760659904807e-8,-0.0022659940652150863,-4.279611123618072e-5,-3.995206908990567e-8,-0.002265653503930502,-4.265191244855833e-5,-3.979631362883339e-8,-0.0022653969340296893,-4.252261313043785e-5,-3.965552378432056e-8,-0.0022652046236925952,-4.243769493960012e-5,-3.95634861733223e-8,-0.002265049794477369,-4.241380155046763e-5,-3.9539697044729416e-8,-0.0022649041082798216,-4.245547864330964e-5,-3.9589986428501323e-8,-0.00226474124918325,-4.255711975844435e-5,-3.970856627954339e-8,-0.0022645391613217362,-4.270500455743162e-5,-3.988028806109427e-8,-0.0022642816799547678,-4.287910780361013e-5,-4.008272167427198e-8,-0.002263960087918555,-4.3054900809357125e-5,-4.028824466566982e-8,-0.002263574719130994,-4.320567695985923e-5,-4.0466687322319195e-8,-0.0022631362204558894,-4.330590165289405e-5,-4.058908270551296e-8,-0.0022626656639188536,-4.3335670173572484e-5,-4.063264302083518e-8,-0.0022621925719040524,-4.328569846595285e-5,-4.0586363627982455e-8,-0.0022617502460647106,-4.316153538197371e-5,-4.045582192050501e-8,-0.0022613686905826485,-4.298517863381172e-5,-4.02651379123331e-8,-0.002261066659628733,-4.279254577136207e-5,-4.0054328367112326e-8,-0.002260845254738966,-4.2626492298289355e-5,-3.9871642378719045e-8,-0.002260685452234943,-4.252671070386968e-5,-3.976228848354713e-8,-0.0022605509404802003,-4.251909481418603e-5,-3.9756384567982686e-8,-0.002260396131472639,-4.260760900980759e-5,-3.985954021720435e-8,-0.002260177694963087,-4.277131989594658e-5,-4.004914789052283e-8,-0.002259866766101412,-4.2968166060102e-5,-4.027830918497738e-8,-0.002259458210637815,-4.3145372744970057e-5,-4.048742944540769e-8,-0.0022589733613924707,-4.3254145791464096e-5,-4.062085419440258e-8,-0.002258454294531585,-4.326392054614321e-5,-4.064315339359069e-8,-0.0022579511436190353,-4.3170655978861896e-5,-4.0548734377790825e-8,-0.0022575073922757242,-4.2995916330466316e-5,-4.036104128218041e-8,-0.0022571489718927946,-4.2777865460527206e-5,-4.012258232791228e-8,-0.0022568805697357453,-4.255884861731508e-5,-3.988102778980891e-8,-0.0022566887016491335,-4.2374725671374876e-5,-3.967716426716014e-8,-0.002256548444902981,-4.2248875604791526e-5,-3.953799287615894e-8,-0.002256430457477919,-4.2190877177150564e-5,-3.9475031093020603e-8,-0.0022563063262742698,-4.219814048656945e-5,-3.9485967035225393e-8,-0.0022561518892659908,-4.225864272457631e-5,-3.9557654446514965e-8,-0.0022559490620141626,-4.235363463796422e-5,-3.9669178707093105e-8,-0.0022556869196150115,-4.245992921932744e-5,-3.9794503964805914e-8,-0.002255362650026142,-4.2551960746738174e-5,-3.990484416493067e-8,-0.00225498259128279,-4.260418776905965e-5,-3.9971363026047316e-8,-0.0022545629951551973,-4.259443556510106e-5,-3.996888136177645e-8,-0.002254129647814144,-4.2508371758274345e-5,-3.988086135327218e-8,-0.0022537151993712646,-4.234455193159232e-5,-3.970509132900266e-8,-0.00225335330209883,-4.2118407480589275e-5,-3.9458268320626675e-8,-0.0022530698916637996,-4.186263655252896e-5,-3.917660732834667e-8,-0.0022528740190121094,-4.162180095563857e-5,-3.8909958155369906e-8,-0.002252752217450626,-4.1441201489894646e-5,-3.870944411348118e-8,-0.0022526698614514173,-4.1353325375690816e-5,-3.861225482382609e-8,-0.0022525801000990234,-4.136713774543938e-5,-3.862947201208333e-8,-0.0022524373733573866,-4.146464933767827e-5,-3.8741929345072135e-8,-0.002252210525373519,-4.1605994325611274e-5,-3.89055852814104e-8,-0.0022518911377591767,-4.1740803405337114e-5,-3.906405012373955e-8,-0.0022514949999607,-4.182182996698903e-5,-3.9163825942864726e-8,-0.0022510569958787445,-4.181681135790668e-5,-3.916776403591502e-8,-0.002250621342141275,-4.171557236139564e-5,-3.906331946104076e-8,-0.0022502301294550285,-4.15308425955026e-5,-3.886378396708598e-8,-0.002249913449319389,-4.129306958437996e-5,-3.860271679338941e-8,-0.002249683726453224,-4.104130530740587e-5,-3.832383998911728e-8,-0.002249535283975047,-4.0813295369522146e-5,-3.8069884935159855e-8,-0.0022494483048860476,-4.0637702512655366e-5,-3.787370255806774e-8,-0.002249395075586441,-4.053008747505458e-5,-3.775352485809548e-8,-0.002249346228387429,-4.049258564563083e-5,-3.771239510768213e-8,-0.0022492755010270257,-4.0516052192387256e-5,-3.774046242612261e-8,-0.0022491626277783426,-4.058321264511812e-5,-3.7818520580070174e-8,-0.0022489947436900195,-4.0671780343274614e-5,-3.7921589641568395e-8,-0.002248766957445944,-4.075711343877572e-5,-3.8021986797907276e-8,-0.0022484826632076446,-4.081452585563666e-5,-3.8091951714669235e-8,-0.002248153838048646,-4.0821728247974105e-5,-3.8106341905870566e-8,-0.002247801079960905,-4.076195151424849e-5,-3.804605949402225e-8,-0.002247452593148405,-4.0628012018448585e-5,-3.790257146744856e-8,-0.0022471409301629466,-4.042682459236734e-5,-3.768302732502345e-8,-0.00224689646765886,-4.018263561138499e-5,-3.7414039313886286e-8,-0.0022467379334867687,-3.993603737751534e-5,-3.71407722402369e-8,-0.0022466629330224067,-3.973603731085064e-5,-3.6918205817805125e-8,-0.0022466437937668942,-3.962548372148706e-5,-3.679484541297912e-8,-0.0022466332626418345,-3.962510713746668e-5,-3.679475135912498e-8,-0.0022465795112438054,-3.972433968955547e-5,-3.690704831574807e-8,-0.002246443844399572,-3.988431149987231e-5,-3.7089012125681974e-8,-0.0022462127331009103,-4.005144641550452e-5,-3.728104124941213e-8,-0.002245899726127667,-4.017461828870116e-5,-3.742571513024981e-8,-0.0022455385610210964,-4.021870065905526e-5,-3.7482979092119534e-8,-0.002245171991501091,-4.017101257208119e-5,-3.743755699529912e-8,-0.0022448406857828573,-4.0040872064166135e-5,-3.729877117661851e-8,-0.002244574842630709,-3.985434389103751e-5,-3.709499167218068e-8,-0.00224438953153147,-3.964658315948225e-5,-3.6865281132306804e-8,-0.002244283739282433,-3.9453769098646514e-5,-3.6650395806950313e-8,-0.0022442425786291715,-3.9306138580895836e-5,-3.648483998275852e-8,-0.0022442417262513318,-3.9223235736532204e-5,-3.639130046745756e-8,-0.002244252825270072,-3.921193238763609e-5,-3.637818766334322e-8,-0.002244248580715095,-3.926701981343953e-5,-3.6440147045714485e-8,-0.002244206665010873,-3.9373614587264704e-5,-3.656072898333406e-8,-0.0022441120851505714,-3.9510449394149734e-5,-3.671615220159067e-8,-0.002243958158082218,-3.9653224799783987e-5,-3.687916687487293e-8,-0.002243746569982561,-3.977754481038861e-5,-3.702240992509356e-8,-0.0022434870012997396,-3.986143852984975e-5,-3.7121211995940224e-8,-0.002243196539261886,-3.9887788360821346e-5,-3.715623183345602e-8,-0.002242898748955786,-3.984704324325663e-5,-3.711640914072695e-8,-0.0022426218280860106,-3.974042123909537e-5,-3.7002547544910815e-8,-0.0022423948446182447,-3.9583186860967147e-5,-3.683110598566761e-8,-0.002242241179018976,-3.940641160112801e-5,-3.663638469156625e-8,-0.00224216956598242,-3.925442123747653e-5,-3.646787712775838e-8,-0.002242165743912653,-3.917522022806908e-5,-3.63796461283401e-8,-0.0022421904430927637,-3.92042809462743e-5,-3.641210968875951e-8,-0.0022421888363345576,-3.934800163595166e-5,-3.657333079382851e-8,-0.0022421101287026773,-3.957707112540881e-5,-3.683135600408295e-8,-0.0022419276065207064,-3.983591431005777e-5,-3.712457446970693e-8,-0.0022416477393448642,-4.0063753426798325e-5,-3.73851192566621e-8,-0.0022413045475564155,-4.0215340963561835e-5,-3.7561970560884604e-8,-0.0022409449338205603,-4.0271819274777205e-5,-3.7633148529958066e-8,-0.0022406136872176463,-4.0240309319839884e-5,-3.7605480019251675e-8,-0.002240343470877864,-4.0146522531138636e-5,-3.750668536605433e-8,-0.002240150677565745,-4.002533269708593e-5,-3.7375157741474976e-8,-0.002240035711440105,-3.991240818250783e-5,-3.725076167766338e-8,-0.002239985804253139,-3.9838071993125945e-5,-3.7167903625866e-8,-0.0022399789880449567,-3.9823368021104823e-5,-3.715090319780558e-8,-0.0022399885175577506,-3.9878050065343086e-5,-3.721146830451135e-8,-0.002239987272940578,-4.000036042511323e-5,-3.734824122526935e-8,-0.0022399516443405575,-4.017838712946535e-5,-3.7548239619326853e-8,-0.002239864499431365,-4.0392596449678075e-5,-3.778973496167977e-8,-0.0022397169957782525,-4.061908331716644e-5,-3.804599535317224e-8,-0.002239509163109704,-4.083302738834809e-5,-3.828923970936112e-8,-0.00223924945058436,-4.101186342286681e-5,-3.8494196874711744e-8,-0.002238953599371396,-4.113797301515876e-5,-3.8641048926455915e-8,-0.0022386430618668383,-4.120100796303263e-5,-3.871793082545036e-8,-0.002238342944066297,-4.1200001151770064e-5,-3.872324181388282e-8,-0.0022380791839847307,-4.114530686782865e-5,-3.866788607866194e-8,-0.002237874380510262,-4.1060002066053976e-5,-3.857703907310176e-8,-0.00223774180926945,-4.097948394853225e-5,-3.848995354296783e-8,-0.00223767825635013,-4.094712480839855e-5,-3.845528558322179e-8,-0.002237658399419641,-4.1004061797862145e-5,-3.851967858482813e-8,-0.0022376356888406273,-4.11738325963669e-5,-3.8710382858211906e-8,-0.0022375542283195344,-4.144791944811161e-5,-3.9018797372337954e-8,-0.002237369976256706,-4.178239537910177e-5,-3.939648342269923e-8,-0.0022370705865857117,-4.211192540677199e-5,-3.97707040733493e-8,-0.002236681021205403,-4.237528136520402e-5,-4.0072894403993155e-8,-0.0022362515136581293,-4.2537390808246587e-5,-4.026326754963274e-8,-0.0022358368811051695,-4.2596592517748946e-5,-4.033897314519272e-8,-0.002235479455892738,-4.257760540665977e-5,-4.032647668471118e-8,-0.0022352014732815342,-4.251839568376904e-5,-4.026725325138652e-8,-0.0022350055128588357,-4.245824814262653e-5,-4.0204769494537755e-8,-0.002234879072292001,-4.2429981973685345e-5,-4.017588031994506e-8,-0.002234800143287794,-4.245617891594765e-5,-4.020647152992803e-8,-0.0022347421748675988,-4.254810062132713e-5,-4.030997076660549e-8,-0.002234678089860464,-4.2706022024608e-5,-4.04874490318804e-8,-0.002234583596800719,-4.292040013149177e-5,-4.072877100486095e-8,-0.0022344399196055193,-4.3173776366831664e-5,-4.101470592062815e-8,-0.002234235865992565,-4.344333894544913e-5,-4.13198704377615e-8,-0.002233969089473579,-4.370403283753067e-5,-4.1616299339581775e-8,-0.0022336463289874286,-4.393200590097062e-5,-4.1877337327494744e-8,-0.002233282501130823,-4.410796757286399e-5,-4.2081351239347404e-8,-0.0022328987863395795,-4.422003807868895e-5,-4.2214822045642e-8,-0.0022325199496675764,-4.426587777665794e-5,-4.227465236873269e-8,-0.0022321710530385326,-4.4253972215963034e-5,-4.226962591744968e-8,-0.0022318736432929433,-4.420392191805795e-5,-4.2220888713159193e-8,-0.0022316414113256896,-4.414545555348796e-5,-4.216110347774086e-8,-0.0022314754270215662,-4.4115440270257426e-5,-4.213136166132721e-8,-0.002231359823442391,-4.415175418461966e-5,-4.217445054382591e-8,-0.0022312601532689185,-4.4283382554984865e-5,-4.232367827957026e-8,-0.002231127767120565,-4.4518168017474204e-5,-4.258888372588604e-8,-0.0022309127621388284,-4.483326721123653e-5,-4.2945429863533486e-8,-0.0022305832777618443,-4.5176107345948044e-5,-4.33350641470657e-8,-0.0022301417812274774,-4.548042189951665e-5,-4.3683804639003184e-8,-0.00222962696006888,-4.5691654474732635e-5,-4.3930355472978606e-8,-0.0022290982784922498,-4.578732224176004e-5,-4.404886114752745e-8,-0.0022286126995498105,-4.578096414425489e-5,-4.405337631430236e-8,-0.002228207126679372,-4.571064953482692e-5,-4.39852734699268e-8,-0.002227893056699919,-4.562206961243283e-5,-4.38947320909112e-8,-0.002227660846567752,-4.555526540573994e-5,-4.382620421038141e-8,-0.002227487702103169,-4.55379758899719e-5,-4.381102028222137e-8,-0.0022273451775774154,-4.558426004228901e-5,-4.386564409422788e-8,-0.0022272045720067527,-4.569590592468164e-5,-4.39929402649985e-8,-0.002227040330898362,-4.586469098944103e-5,-4.418444952301841e-8,-0.0022268322499077128,-4.607464729273845e-5,-4.4422813065954085e-8,-0.0022265671012077232,-4.6304319138032545e-5,-4.46843227290974e-8,-0.002226239866699384,-4.65292374402582e-5,-4.4941773047288794e-8,-0.002225854484890745,-4.6724799757426735e-5,-4.51677431041688e-8,-0.0022254237956320375,-4.6869601410910074e-5,-4.5338309138385286e-8,-0.002224968272659459,-4.694890763075256e-5,-4.543684582222292e-8,-0.002224513374267207,-4.695764552052053e-5,-4.545727907051517e-8,-0.0022240857042466885,-4.690227807341315e-5,-4.5406156340506795e-8,-0.0022237084214524207,-4.680103654287797e-5,-4.530300679993751e-8,-0.002223396530534961,-4.668216756519775e-5,-4.517860947561035e-8,-0.002223152787249789,-4.658014304122351e-5,-4.507104168252101e-8,-0.002222964935742375,-4.652995213290346e-5,-4.501951893274435e-8,-0.002222805166025817,-4.655966574712351e-5,-4.505611999008108e-8,-0.0022226330833182246,-4.6682000764129616e-5,-4.519616588800026e-8,-0.002222403496610867,-4.6886909508180545e-5,-4.542958762812166e-8,-0.002222079087811143,-4.7138819175493126e-5,-4.571749442657403e-8,-0.0022216449448798823,-4.738267384694757e-5,-4.59987335824701e-8,-0.002221118171827722,-4.7560111136303446e-5,-4.620795613858712e-8,-0.002220545312392466,-4.763048075773373e-5,-4.629917145710085e-8,-0.002219986393474025,-4.758588464850228e-5,-4.626262271116031e-8,-0.002219493466999461,-4.745169161788492e-5,-4.612549476134362e-8,-0.0022190950899372997,-4.727349057060608e-5,-4.5937616176018814e-8,-0.0022187928437108866,-4.709946526084481e-5,-4.575211981967887e-8,-0.0022185676608473866,-4.6967148258508964e-5,-4.561086581454774e-8,-0.0022183897340214403,-4.6897877865561347e-5,-4.5538205382200175e-8,-0.002218227112864587,-4.689730372738356e-5,-4.55412865670691e-8,-0.0022180511931498754,-4.6958726789225835e-5,-4.5613476972552826e-8,-0.002217839478448058,-4.706684563405332e-5,-4.573834204511953e-8,-0.002217576767892167,-4.720088385532349e-5,-4.5893088802846886e-8,-0.0022172557391592737,-4.7337099909682e-5,-4.605143273264397e-8,-0.0022168773700565656,-4.74510906017821e-5,-4.6186255635813826e-8,-0.0022164511799183666,-4.752034046529439e-5,-4.627248139736567e-8,-0.002215994899699834,-4.7527295848164124e-5,-4.629045712510837e-8,-0.002215532947978386,-4.746279506796771e-5,-4.622968509992351e-8,-0.0022150932151455763,-4.732912349998839e-5,-4.60921625117704e-8,-0.0022147021652644183,-4.714160221841957e-5,-4.589418230010463e-8,-0.002214378969883185,-4.692762570971198e-5,-4.566542228593394e-8,-0.0022141300645164186,-4.672255695780222e-5,-4.544463178449744e-8,-0.0022139458137362612,-4.6562850713633075e-5,-4.52722393117001e-8,-0.00221380060967952,-4.64777591528412e-5,-4.518126383051442e-8,-0.0022136569173281237,-4.648149783906708e-5,-4.518852648490155e-8,-0.0022134729343128413,-4.65678409922886e-5,-4.5288350736913463e-8,-0.002213212730213477,-4.670898079689068e-5,-4.545089717714251e-8,-0.002212856797894262,-4.686004182357243e-5,-4.562684735817594e-8,-0.0022124099074522273,-4.6969555866714336e-5,-4.575890861717408e-8,-0.0022119026018825377,-4.699407898397332e-5,-4.579813949784263e-8,-0.0022113839010346006,-4.691226389953383e-5,-4.5719800103478644e-8,-0.0022109065487812933,-4.673212611187127e-5,-4.553166994833471e-8,-0.0022105106421530336,-4.6487513953655795e-5,-4.52703652159344e-8,-0.002210212924897253,-4.622545023671105e-5,-4.498750033432147e-8,-0.0022100056515220326,-4.599082657138239e-5,-4.4732842639896e-8,-0.0022098634270506174,-4.58151562763414e-5,-4.454182124988341e-8,-0.002209753114187779,-4.5712337116466916e-5,-4.4430643000829475e-8,-0.0022096423610802776,-4.568024895658921e-5,-4.439779129857697e-8,-0.0022095048224221024,-4.570516696428774e-5,-4.4428692789315846e-8,-0.0022093223580628898,-4.576643434562114e-5,-4.45008081941231e-8,-0.0022090854104389146,-4.5840198863217866e-5,-4.458782308690369e-8,-0.002208792684048753,-4.590211841998753e-5,-4.4662757683266604e-8,-0.002208450773065764,-4.592949249699432e-5,-4.470041059236587e-8,-0.0022080738356743857,-4.590342965342051e-5,-4.467976024450722e-8,-0.0022076829208446235,-4.581149511652582e-5,-4.45868263584567e-8,-0.0022073042325302127,-4.565081152181556e-5,-4.441802397944935e-8,-0.002206965605216999,-4.5430915166275075e-5,-4.418331181075295e-8,-0.0022066909305378285,-4.51749843519472e-5,-4.390764665471133e-8,-0.0022064933389565914,-4.49177448738443e-5,-4.3628860219709356e-8,-0.0022063692939843756,-4.469903269899099e-5,-4.339076928750656e-8,-0.002206296459441618,-4.455384182826084e-5,-4.323234070924075e-8,-0.002206237344690818,-4.450182876565845e-5,-4.317610450389361e-8,-0.002206148437110928,-4.454022855258338e-5,-4.322014158498983e-8,-0.0022059920678573607,-4.464314996140854e-5,-4.333696738013364e-8,-0.002205747078655037,-4.47677698551155e-5,-4.3480006469238615e-8,-0.0022054149560458707,-4.4865453971987394e-5,-4.359562672668298e-8,-0.0022050197778874484,-4.4894469310904836e-5,-4.363714563703815e-8,-0.002204602080350687,-4.483081733338681e-5,-4.357698088947024e-8,-0.0022042082496701748,-4.4674256976108435e-5,-4.34136267011671e-8,-0.002203878355963061,-4.444767502332483e-5,-4.317130450908105e-8,-0.002203636131830214,-4.418988337579432e-5,-4.289227455216706e-8,-0.0022034842767954172,-4.3944313012475434e-5,-4.2624468807672645e-8,-0.0022034062225738905,-4.374765150444576e-5,-4.240888990786396e-8,-0.0022033728732570334,-4.362214656382595e-5,-4.22709113039624e-8,-0.0022033511472193176,-4.357325021474196e-5,-4.2217405326860426e-8,-0.002203311259278957,-4.359184072021775e-5,-4.2238963148967383e-8,-0.002203231161403219,-4.365884984553331e-5,-4.2314893940482235e-8,-0.0022030981896355236,-4.37501815219e-5,-4.241868804084055e-8,-0.0022029088590102435,-4.3840715442687394e-5,-4.252255845087228e-8,-0.002202667855443351,-4.390713159132299e-5,-4.2600676139939876e-8,-0.0022023869397814195,-4.392991328620103e-5,-4.263141972686281e-8,-0.002202083971331653,-4.389514078579005e-5,-4.259929970541784e-8,-0.0022017817509400405,-4.3796571313615305e-5,-4.2497155377534966e-8,-0.002201506019114991,-4.363807773550661e-5,-4.232878802184368e-8,-0.002201281829056389,-4.3435865519477696e-5,-4.211145676298463e-8,-0.0022011278651603286,-4.321905966755535e-5,-4.187668985882363e-8,-0.002201049428771376,-4.3026635343832115e-5,-4.166711799444936e-8,-0.0022010326564595945,-4.2899212226683795e-5,-4.1527605488542144e-8,-0.0022010438605880736,-4.2866701401245325e-5,-4.149168981230639e-8,-0.002201036815050561,-4.2936311524374124e-5,-4.156826007306663e-8,-0.0022009668005209242,-4.3087189621691026e-5,-4.1735408849570453e-8,-0.002200805687849186,-4.3275540935940235e-5,-4.194576010041846e-8,-0.0022005511147673534,-4.344845205145683e-5,-4.214141087930924e-8,-0.0022002261579351164,-4.356010243054483e-5,-4.2271627325288035e-8,-0.0021998709471877614,-4.3583870411128616e-5,-4.230621553318354e-8,-0.0021995306329296136,-4.351713167905666e-5,-4.2241049980976345e-8,-0.002199244012936336,-4.337907539302264e-5,-4.209604395428574e-8,-0.0021990354974688524,-4.3203716761038325e-5,-4.190782352683438e-8,-0.0021989114882803953,-4.303068697336216e-5,-4.1719808660383815e-8,-0.0021988611198272934,-4.2896143039547516e-5,-4.157220587465444e-8,-0.002198860529686386,-4.28256834219112e-5,-4.149400848221767e-8,-0.0021988792290551736,-4.283052362484336e-5,-4.149848437908441e-8,-0.0021988868020958604,-4.290728558961128e-5,-4.158266825085552e-8,-0.002198858332636107,-4.30407374421635e-5,-4.1730227888167276e-8,-0.0021987776559889718,-4.320815607531913e-5,-4.191627227789234e-8,-0.0021986383828306827,-4.338394252488224e-5,-4.211255171468341e-8,-0.0021984432617016725,-4.354352417484422e-5,-4.229189520363366e-8,-0.0021982026851288055,-4.366616419637895e-5,-4.243138177200893e-8,-0.002197932987833362,-4.373685585806035e-5,-4.2514400830429825e-8,-0.0021976547873646343,-4.374776948947891e-5,-4.2532145447490745e-8,-0.0021973912163822202,-4.3699666494011446e-5,-4.248507449934088e-8,-0.002197165565964018,-4.360339553726757e-5,-4.238455982416569e-8,-0.0021969976661542537,-4.348102472191013e-5,-4.2254266098886135e-8,-0.0021968986060033643,-4.3365344851824027e-5,-4.212983081364773e-8,-0.002196864488916266,-4.329582521635688e-5,-4.205462845468875e-8,-0.00219687177106506,-4.330950164594914e-5,-4.206983298743024e-8,-0.0021968783763478264,-4.342774012978813e-5,-4.219976819299261e-8,-0.002196833942465688,-4.364410781791684e-5,-4.2438344229764724e-8,-0.0021966974953614438,-4.392134829558463e-5,-4.274547229078794e-8,-0.0021964542822063117,-4.420215324008212e-5,-4.305868573313644e-8,-0.002196122004749595,-4.4429633911088055e-5,-4.3315482134634745e-8,-0.002195743141195934,-4.456667055575025e-5,-4.3474511881865136e-8,-0.0021953688213683063,-4.460502832877005e-5,-4.352567029416044e-8,-0.0021950430896256865,-4.456276883725236e-5,-4.34875261233581e-8,-0.00219479325103675,-4.447456387533459e-5,-4.339707996174946e-8,-0.0021946271302473947,-4.4380500039176534e-5,-4.329781770575668e-8,-0.0021945353071144784,-4.43168589575551e-5,-4.322972528487527e-8,-0.0021944959560133495,-4.4310062852754164e-5,-4.322252177775724e-8,-0.002194480563537203,-4.4373660852183527e-5,-4.32920524953864e-8,-0.0021944595227321863,-4.450786864707432e-5,-4.343945466521452e-8,-0.0021944069506842096,-4.4701191951449525e-5,-4.36527150890374e-8,-0.0021943042180325003,-4.49335617950116e-5,-4.391005375463803e-8,-0.002194141906377647,-4.518027077748843e-5,-4.4184332052663467e-8,-0.0021939201779301136,-4.5416019876788224e-5,-4.444764386522221e-8,-0.002193647790767406,-4.561847347713716e-5,-4.4675332295713537e-8,-0.0021933402416158846,-4.5770915859345256e-5,-4.484892453692752e-8,-0.00219301755709073,-4.586399243241319e-5,-4.495797173896476e-8,-0.0021927019881854267,-4.589680376520009e-5,-4.50011490514789e-8,-0.002192415581968075,-4.587758677189852e-5,-4.498696354861374e-8,-0.002192177416627541,-4.582404354917942e-5,-4.493420418458068e-8,-0.0021920001056428633,-4.576302032079154e-5,-4.487180284605771e-8,-0.0021918853630141493,-4.5728554041258204e-5,-4.483694086387648e-8,-0.0021918193971149852,-4.575678790110061e-5,-4.486962210563871e-8,-0.0021917704552939657,-4.5876737000029106e-5,-4.500249145208053e-8,-0.0021916921793231213,-4.609805171784536e-5,-4.524715951212536e-8,-0.002191535722030832,-4.640085504307758e-5,-4.558273256144663e-8,-0.002191268622527711,-4.673572239421093e-5,-4.5955562378608346e-8,-0.0021908911531643392,-4.703860588774864e-5,-4.6295536372601254e-8,-0.0021904389342049485,-4.725525462149562e-5,-4.654284579454351e-8,-0.0021899688757674282,-4.7361335435271427e-5,-4.667003748796585e-8,-0.002189537217572945,-4.736738240175443e-5,-4.66875152635767e-8,-0.002189182178099598,-4.730905371796731e-5,-4.6633131046491385e-8,-0.0021889175315774733,-4.723144495265606e-5,-4.655539679656418e-8,-0.0021887354256682617,-4.717574835041439e-5,-4.6499184056199204e-8,-0.0021886135162408732,-4.717157179860376e-5,-4.649736314449432e-8,-0.0021885224957076004,-4.723435333698451e-5,-4.656775348526145e-8,-0.002188432196672109,-4.736596568910569e-5,-4.671343301511786e-8,-0.0021883159915355365,-4.755688007918747e-5,-4.69247944722332e-8,-0.002188153797184117,-4.7789060056815985e-5,-4.7182558125506696e-8,-0.0021879339216937933,-4.8039252490120275e-5,-4.7461392605544466e-8,-0.0021876538472704776,-4.828243590852618e-5,-4.773381750934838e-8,-0.002187319992989988,-4.849521912185547e-5,-4.7974061450627616e-8,-0.0021869464613131022,-4.865894024085986e-5,-4.816152081756237e-8,-0.0021865528992877276,-4.87620998684626e-5,-4.828339410490294e-8,-0.0021861618199906937,-4.8801891534619e-5,-4.833627312095251e-8,-0.0021857956854069802,-4.878486309271509e-5,-4.832680892763946e-8,-0.0021854738600616984,-4.8726762987137e-5,-4.8271587194920043e-8,-0.0021852094900030724,-4.86515128943926e-5,-4.8196176656966384e-8,-0.002185006334014698,-4.858914285791343e-5,-4.8133122371377696e-8,-0.0021848556724831675,-4.8572182159752406e-5,-4.8118210423692764e-8,-0.0021847340908449993,-4.862969584851901e-5,-4.818398533821574e-8,-0.0021846040333787834,-4.8778729210677626e-5,-4.835019658202303e-8,-0.0021844197065521583,-4.901477659668526e-5,-4.861300583671992e-8,-0.002184139908137586,-4.9305740268685153e-5,-4.89380239589084e-8,-0.002183745208710712,-4.959578164277363e-5,-4.926436436193073e-8,-0.0021832508778272947,-4.9822400093252296e-5,-4.9523381452495355e-8,-0.0021827054179990426,-4.9940812964766306e-5,-4.9665452368679164e-8,-0.002182172657790118,-4.9941786271621964e-5,-4.967953305482646e-8,-0.0021817074157041024,-4.985220421423567e-5,-4.959386599256073e-8,-0.002181338673865619,-4.9720142395811015e-5,-4.945991919619401e-8,-0.0021810666706533364,-4.9595568980319e-5,-4.933166537295909e-8,-0.0021808703783844,-4.951657478515571e-5,-4.92507832762818e-8,-0.0021807181941960203,-4.950399504420421e-5,-4.924073730655143e-8,-0.0021805769182982548,-4.956218364039945e-5,-4.9307324380953e-8,-0.0021804174795038798,-4.968259370492711e-5,-4.9442212976376634e-8,-0.0021802179110294567,-4.9847836933814006e-5,-4.9627109424267564e-8,-0.002179964670767143,-5.003531159657192e-5,-4.983764252872737e-8,-0.0021796530724134083,-5.0220385609024966e-5,-5.004692161411961e-8,-0.002179287108625143,-5.0379309817940806e-5,-5.0228863268068284e-8,-0.0021788786984716967,-5.049197671212808e-5,-5.0361312329529946e-8,-0.0021784462256297563,-5.054452595703909e-5,-5.04289060225776e-8,-0.0021780122025803136,-5.053151803276535e-5,-5.042538797210063e-8,-0.002177600157916581,-5.045722929573454e-5,-5.035495070136917e-8,-0.0021772310966522526,-5.0335776567875636e-5,-5.023237210708531e-8,-0.002176919902460922,-5.0189932859938544e-5,-5.0081843179902245e-8,-0.00217667207082299,-5.004853269807545e-5,-4.993436120974221e-8,-0.0021764812441906808,-4.994249777622941e-5,-4.982363597059191e-8,-0.0021763280507105863,-4.98996114264398e-5,-4.978052270196503e-8,-0.0021761809437515654,-4.9938185981473035e-5,-4.982603516805561e-8,-0.002176000149806595,-5.006025793450334e-5,-4.9963621703133264e-8,-0.002175745817326205,-5.024622884164902e-5,-5.0172910484799115e-8,-0.002175390157594791,-5.0454365055776456e-5,-5.0408841281164365e-8,-0.002174930337153652,-5.06288459355e-5,-5.061036106903455e-8,-0.002174395353711165,-5.071699644838109e-5,-5.0719362989473973e-8,-0.0021738401034926535,-5.0689679713245726e-5,-5.0703131233504954e-8,-0.0021733265233010663,-5.055363671187018e-5,-5.056794205359903e-8,-0.0021729011128648096,-5.034775070284775e-5,-5.035513085813307e-8,-0.0021725811078602674,-5.012585939427826e-5,-5.012259516349527e-8,-0.0021723547388293137,-4.993700515060601e-5,-4.992354472562844e-8,-0.0021721915116131806,-4.9812811310871116e-5,-4.979285902848771e-8,-0.0021720546749986677,-4.976445626435847e-5,-4.9743630077680485e-8,-0.002171910550591354,-4.978612573658363e-5,-4.977057674929707e-8,-0.0021717334408312126,-4.986073223887547e-5,-4.985593590639394e-8,-0.0021715072056702122,-4.9965197761627746e-5,-4.997503848354697e-8,-0.002171225123681876,-5.007442062639999e-5,-5.010064735726323e-8,-0.0021708891541935235,-5.0164162613396194e-5,-5.020624123144993e-8,-0.002170509011565236,-5.021337352113505e-5,-5.026869269970753e-8,-0.0021701010201165194,-5.020633834079381e-5,-5.027067408474085e-8,-0.002169686481978018,-5.013479660142251e-5,-5.02029350445516e-8,-0.0021692892001323122,-4.999980622314807e-5,-5.006625128102955e-8,-0.002168932022375522,-4.9812758371010945e-5,-4.9872480658075486e-8,-0.002168632724515974,-4.95948957641629e-5,-4.96440934171442e-8,-0.0021683999304833723,-4.9374905475583854e-5,-4.94117279890712e-8,-0.0021682299884622017,-4.9184517024424835e-5,-4.9209644023520306e-8,-0.0021681057683319905,-4.905256550499114e-5,-4.906946354132325e-8,-0.0021679981084059274,-4.899850303697785e-5,-4.901315398366616e-8,-0.0021678702118165865,-4.902660625417457e-5,-4.904654790153962e-8,-0.002167684855459021,-4.912228342329066e-5,-4.915496722137846e-8,-0.002167413675346147,-4.9252117611135175e-5,-4.930287422769272e-8,-0.0021670467328493287,-4.9369236645834006e-5,-4.9439453319941026e-8,-0.0021665991445428225,-4.942457392269512e-5,-4.951084310411176e-8,-0.0021661107109958544,-4.9382031214902844e-5,-4.9476821013151695e-8,-0.0021656359860024264,-4.923205966050717e-5,-4.932584479686643e-8,-0.0021652269664645565,-4.8996524294130615e-5,-4.908058662160895e-8,-0.0021649159058167063,-4.872105249104496e-5,-4.878982557957179e-8,-0.002164706655984438,-4.8458301673946887e-5,-4.8510450968611894e-8,-0.0021645777385677746,-4.825084661063017e-5,-4.8288973195301046e-8,-0.0021644934054848965,-4.812122783466715e-5,-4.81506379139743e-8,-0.0021644159176900527,-4.8071024900689184e-5,-4.809815557247862e-8,-0.0021643141929952214,-4.808594061576428e-5,-4.81168922637752e-8,-0.002164167674411756,-4.814266053659258e-5,-4.818208341414474e-8,-0.0021639667146355628,-4.8214709519840826e-5,-4.8265144796799985e-8,-0.0021637113015193915,-4.8276471408607926e-5,-4.833815104674628e-8,-0.0021634093935051597,-4.8305717497990586e-5,-4.8376751136334334e-8,-0.0021630753860666465,-4.8285336142651836e-5,-4.836216222000512e-8,-0.0021627286667312874,-4.8204863846761885e-5,-4.828283802361071e-8,-0.002162391861482956,-4.8062097732630306e-5,-4.813613888210156e-8,-0.0021620882679398825,-4.786457221389886e-5,-4.792984469758117e-8,-0.0021618381966684985,-4.763020148052184e-5,-4.768283959318655e-8,-0.0021616544721947527,-4.738615688544101e-5,-4.74240049864915e-8,-0.0021615380479013072,-4.716519867376527e-5,-4.718845234479752e-8,-0.002161475302072799,-4.699937039553237e-5,-4.701091284755469e-8,-0.0021614386393250546,-4.6912154688658707e-5,-4.691736184216948e-8,-0.002161391201800069,-4.6911292679655636e-5,-4.691717630397373e-8,-0.002161295075484384,-4.698475296081406e-5,-4.6998506562417824e-8,-0.002161121034202,-4.710162372082691e-5,-4.712886694957854e-8,-0.002160857131367918,-4.7218339997966116e-5,-4.726153824963162e-8,-0.0021605135166616594,-4.728911357216719e-5,-4.734669635449493e-8,-0.002160121614640899,-4.727811102218645e-5,-4.7344670899897986e-8,-0.002159727070259186,-4.71700332472349e-5,-4.72376676723403e-8,-0.002159377681774251,-4.697546153405605e-5,-4.703590761080976e-8,-0.0021591097858532486,-4.672829423936533e-5,-4.677517141941328e-8,-0.002158938074167603,-4.6475408602648845e-5,-4.650582202815821e-8,-0.002158852916009944,-4.626235480050213e-5,-4.627738514230599e-8,-0.002158825801635166,-4.612087538018337e-5,-4.612493766194266e-8,-0.002158819709787541,-4.606270599802699e-5,-4.606214934513943e-8,-0.002158799607308813,-4.608051665422589e-5,-4.6081993496327766e-8,-0.0021587395273344563,-4.615361327504223e-5,-4.616267371658823e-8,-0.002158625286072611,-4.625494118904886e-5,-4.627511694149892e-8,-0.002158453953359905,-4.635691120285143e-5,-4.638936013416345e-8,-0.002158231790057722,-4.643523375110354e-5,-4.647887273854775e-8,-0.002157971911670394,-4.647108233605865e-5,-4.652305041561149e-8,-0.0021576922476335206,-4.6452294121769896e-5,-4.650856384345036e-8,-0.0021574138014324212,-4.637428430326153e-5,-4.6430286990051256e-8,-0.0021571587957101316,-4.624105015071745e-5,-4.629227406134107e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json new file mode 100644 index 0000000..b4be241 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":1000,"numberOfSamples":1000,"samples":[-0.002156948117797158,-4.6066106188504274e-5,-4.610870837852341e-8,-0.0021567976844821175,-4.587262928957953e-5,-4.590411215695837e-8,-0.002156713908245568,-4.569170874283684e-5,-4.5711626484184725e-8,-0.0021566893595621928,-4.555761003533914e-5,-4.5568113732113295e-8,-0.002156700743371349,-4.549983445555494e-5,-4.5505741530892555e-8,-0.0021567115663395065,-4.5533671389188886e-5,-4.5541790676334716e-8,-0.0021566804178876843,-4.5652915406612466e-5,-4.5670622833809834e-8,-0.002156572912636481,-4.582870678241587e-5,-4.58621255953264e-8,-0.0021563728566239655,-4.601620142754535e-5,-4.6068577295811786e-8,-0.0021560880133587525,-4.616711622705171e-5,-4.623794070121091e-8,-0.002155748222189647,-4.62434863816923e-5,-4.6328641438483505e-8,-0.002155396920669294,-4.622782396424562e-5,-4.632067580425877e-8,-0.00215507933393081,-4.612686483113469e-5,-4.621997607570151e-8,-0.0021548310204559523,-4.596856314722607e-5,-4.605556460572259e-8,-0.0021546697448800787,-4.579380803487395e-5,-4.5870948767990285e-8,-0.0021545925009090403,-4.564545026639773e-5,-4.571243253541094e-8,-0.00215457808447119,-4.555777214888923e-5,-4.561767662258407e-8,-0.002154594019620961,-4.554927142265337e-5,-4.560764640929833e-8,-0.002154605368940617,-4.562040509803385e-5,-4.568383677005805e-8,-0.002154582628502511,-4.575613804937631e-5,-4.583074108471704e-8,-0.0021545067042819666,-4.593156748733217e-5,-4.602179515117175e-8,-0.0021543704349080905,-4.6118291920214145e-5,-4.6226298143065905e-8,-0.002154177429419203,-4.628970757896518e-5,-4.64152905393417e-8,-0.0021539395320203554,-4.642448039496704e-5,-4.656547403677698e-8,-0.0021536740325304696,-4.6508347419083976e-5,-4.6661248300741016e-8,-0.002153401212638439,-4.6534852085000904e-5,-4.669548060691322e-8,-0.0021531422886805827,-4.650565883599465e-5,-4.666974436961425e-8,-0.0021529174221249937,-4.6430830311047396e-5,-4.6594529114611347e-8,-0.002152743281384537,-4.632899782380846e-5,-4.648943285318694e-8,-0.0021526297364554913,-4.622682327908873e-5,-4.6382720029024235e-8,-0.0021525757781952213,-4.615665217809799e-5,-4.6309007987320986e-8,-0.0021525657635618595,-4.615111791560906e-5,-4.630363581540198e-8,-0.0021525683606683156,-4.623433111379003e-5,-4.639321479077921e-8,-0.0021525411131787307,-4.641162808298889e-5,-4.658444896551646e-8,-0.00215244181360915,-4.6662730585749126e-5,-4.685650807739798e-8,-0.002152243559761613,-4.69438336830974e-5,-4.716299443903288e-8,-0.0021519463173773905,-4.720028130623982e-5,-4.744536946490242e-8,-0.0021515783140552483,-4.738487646555355e-5,-4.7652539659263205e-8,-0.0021511863195340735,-4.7473012892754915e-5,-4.775714558013054e-8,-0.002150820158632104,-4.74681988823182e-5,-4.7761682951372046e-8,-0.0021505186509381763,-4.739759003524929e-5,-4.769404722497823e-8,-0.002150301454146949,-4.7301602034095665e-5,-4.75967746928141e-8,-0.002150167504080223,-4.722237577724007e-5,-4.751493736774092e-8,-0.0021500984653760494,-4.7194327180898005e-5,-4.7486029043007825e-8,-0.002150065007643072,-4.7238211715320985e-5,-4.753336591146179e-8,-0.002150034011848315,-4.735890504159874e-5,-4.7663329284699034e-8,-0.0021499752813515308,-4.754650144645341e-5,-4.7866189097583804e-8,-0.0021498666614940885,-4.777999559892799e-5,-4.811985529955003e-8,-0.002149696844734374,-4.8032435641353954e-5,-4.8395408706038154e-8,-0.0021494657462589853,-4.8276239272205825e-5,-4.866295866283441e-8,-0.0021491829316347584,-4.848761715432387e-5,-4.8896590036391526e-8,-0.002148864888882999,-4.864954755615883e-5,-4.9077698538029214e-8,-0.002148531969661492,-4.875324012053347e-5,-4.9196590948451486e-8,-0.00214820559302335,-4.879845385417849e-5,-4.925275811633043e-8,-0.0021479058723801398,-4.8793211725869386e-5,-4.9254476683867235e-8,-0.0021476494691693242,-4.875326148772683e-5,-4.921820529983365e-8,-0.0021474473356039884,-4.8701280224926454e-5,-4.916782927985692e-8,-0.002147302025734625,-4.8665427348109735e-5,-4.913330991550414e-8,-0.0021472046146883317,-4.867636961659977e-5,-4.914769826441347e-8,-0.0021471322071707254,-4.8761685544412094e-5,-4.924121019381598e-8,-0.0021470482597085038,-4.893732048233069e-5,-4.943192954490526e-8,-0.002146908584499707,-4.91979967179343e-5,-4.97152190263401E-08,-0.002146674363316176,-4.9511646656850674e-5,-5.0057427768996096e-8,-0.002146328667920062,-4.982422622000098e-5,-5.0400872447169334e-8,-0.0021458875359486144,-5.007688042712524e-5,-5.0682229364308553e-8,-0.002145397011314185,-5.0228379818507437e-5,-5.0856638807463407e-8,-0.0021449161791735768,-5.0270217445764416e-5,-5.091394422090286e-8,-0.002144495917953705,-5.0226434247242504e-5,-5.087865414824122e-8,-0.002144164522903363,-5.01408709895491e-5,-5.079660476566392e-8,-0.002143924532470479,-5.0060878640441164e-5,-5.0717902245852795e-8,-0.002143757959315198,-5.002483607513269e-5,-5.068379162791456e-8,-0.002143634896737234,-5.005585115815337e-5,-5.071984838493151e-8,-0.002143521842854634,-5.0160650756850324e-5,-5.083446444779818e-8,-0.002143388120717485,-5.0331651201626866e-5,-5.102064773664288e-8,-0.002143210184954386,-5.055054311417113e-5,-5.125954074459971e-8,-0.002142974117514982,-5.079251129394976e-5,-5.152482507010141e-8,-0.0021426765074378826,-5.103064468172294e-5,-5.178753018681961e-8,-0.0021423238391256607,-5.124006797853224e-5,-5.202065134245872e-8,-0.002141930651324379,-5.140134181465216e-5,-5.220297342970296e-8,-0.0021415168281439588,-5.150282446702924e-5,-5.2321688446799315e-8,-0.0021411044645297406,-5.154180999406271e-5,-5.237359158139016e-8,-0.0021407148054202576,-5.152449499997826e-5,-5.236496558245039e-8,-0.0021403655678020684,-5.146510002939213e-5,-5.231059043138093e-8,-0.002140068652238457,-5.138444270295482e-5,-5.2232268635753575e-8,-0.002139828133292629,-5.1308028225241545e-5,-5.2156950212399334e-8,-0.002139638422673149,-5.126350568803761e-5,-5.2114230564000163e-8,-0.00213948268691379,-5.1277018333799685e-5,-5.213259191254482e-8,-0.002139332290822501,-5.1367795817320406e-5,-5.223357239670482e-8,-0.0021391489883805194,-5.154098912009453e-5,-5.242383088390882e-8,-0.002138891970010422,-5.1780522562900146e-5,-5.268710604455327e-8,-0.0021385305995390066,-5.20462253084977e-5,-5.2980835455315765e-8,-0.002138059594008942,-5.2280784568316565e-5,-5.324353111816718e-8,-0.002137508049281609,-5.242840674319948e-5,-5.341489927661907e-8,-0.0021369333564798328,-5.245794992558174e-5,-5.3460757754233854e-8,-0.0021364000567887635,-5.237659280739311e-5,-5.338772944526506e-8,-0.0021359554177806913,-5.222499524366457e-5,-5.323816602452792e-8,-0.0021356157132549174,-5.205829004263862e-5,-5.307010206523827e-8,-0.002135367798385966,-5.1925718630202697e-5,-5.293584770307225e-8,-0.0021351802309842655,-5.185853393324863e-5,-5.2869237987871783e-8,-0.002135015709675917,-5.186747116928778e-5,-5.288277568269625e-8,-0.0021348401734937695,-5.194616985504687e-5,-5.2970891829753475e-8,-0.002134627758060293,-5.2076667370690687e-5,-5.311539888620349e-8,-0.002134362664862016,-5.22346501846903e-5,-5.329085053332862e-8,-0.0021340393185033547,-5.2393733389077045e-5,-5.3469096840437146e-8,-0.002133661644592146,-5.252894430972528e-5,-5.362316413179043e-8,-0.0021332416919183183,-5.2619642849676823e-5,-5.373058405670703e-8,-0.002132797639105352,-5.265187989316952e-5,-5.377605953151373e-8,-0.00213235123299873,-5.262008658853691e-5,-5.3753301407695094e-8,-0.0021319247547086106,-5.252787431710746e-5,-5.366582385721862e-8,-0.002131537812166341,-5.2387711692295135e-5,-5.3526527141880856e-8,-0.002131204386649835,-5.221948578729788e-5,-5.335616249926751e-8,-0.002130930436840616,-5.204813499564776e-5,-5.3180922715721016e-8,-0.0021307122475242276,-5.190051666082856e-5,-5.3029303636494595e-8,-0.002130535691096194,-5.1801663288743484e-5,-5.2928303953712826e-8,-0.002130376577415983,-5.1770519389418736e-5,-5.289893815879023e-8,-0.0021302025383327134,-5.1815158911048855e-5,-5.2950976313991277e-8,-0.002129977378036466,-5.192792796725971e-5,-5.3077407334747964E-08,-0.0021296688087945386,-5.208214555192072e-5,-5.325050928388623e-8,-0.0021292592998348823,-5.2233329336141494e-5,-5.342289782969275e-8,-0.002128757014872047,-5.2328224363975537e-5,-5.353718707965699e-8,-0.0021282003685288873,-5.232211388239153e-5,-5.354471701182651e-8,-0.0021276495587692528,-5.219820202071707e-5,-5.342650421322242e-8,-0.002127165444777017,-5.1977374748586926e-5,-5.32037987462269e-8,-0.002126786408919701,-5.1710339300552144e-5,-5.292980367635397e-8,-0.0021265166937946525,-5.145633618560855e-5,-5.2667177244896215e-8,-0.00212633105580082,-5.126167160748416e-5,-5.246538067689548e-8,-0.002126189328271234,-5.114869660600918e-5,-5.234897812409529e-8,-0.0021260510373621883,-5.111638783278097e-5,-5.231801132895357e-8,-0.002125884513579751,-5.114733030685652e-5,-5.235503053809026e-8,-0.0021256702248682435,-5.121572331910457e-5,-5.243327665430199e-8,-0.002125400455812279,-5.1293642979333694e-5,-5.252321996716058e-8,-0.0021250775059338096,-5.1355096043385815e-5,-5.259696904862907e-8,-0.0021247116610059085,-5.1378537621995244e-5,-5.2631164024147827e-8,-0.0021243192352671083,-5.134861185069034e-5,-5.2609026267915535e-8,-0.002123920533294502,-5.125749504161394e-5,-5.252187717870801e-8,-0.002123537513917045,-5.1105899487825944e-5,-5.237017732952232e-8,-0.0021231909824004935,-5.0903510148269925e-5,-5.21639052525058e-8,-0.002122897386272381,-5.066840160744641e-5,-5.192188374186477e-8,-0.0021226656718111524,-5.042508933637542e-5,-5.166975788992617e-8,-0.002122494839571998,-5.0201204525872756e-5,-5.143662126873064e-8,-0.0021223728064571974,-5.002307532138799e-5,-5.125052539179263e-8,-0.002122277063662247,-4.9910792187481684e-5,-5.1133373559448276e-8,-0.002122177350465051,-4.9873571668336e-5,-5.1095958839310544e-8,-0.002122040271899325,-4.990621895883855e-5,-5.113395766297128e-8,-0.002121835670220407,-4.998749569171908e-5,-5.122580454826739e-8,-0.002121544289358671,-5.008151805352115e-5,-5.133380683137773e-8,-0.0021211653940700756,-5.0143498952941705e-5,-5.141007127166793e-8,-0.0021207216447338448,-5.0130441492102875e-5,-5.1407976149345016e-8,-0.002120257496141451,-5.001520456175847e-5,-5.1297441102601807e-8,-0.002119828397979043,-4.9798850489622e-5,-5.107840402680578e-8,-0.0021194826754195456,-4.9513892869127156e-5,-5.078451782729881e-8,-0.002119244086201465,-4.921409445932999e-5,-5.0472444375840066e-8,-0.0021191046402436534,-4.8954748273117716e-5,-5.0200988226733736e-8,-0.002119031138708923,-4.8773978554723135e-5,-5.001124485406591e-8,-0.002118980101862301,-4.8684026206295004e-5,-4.991720030835334e-8,-0.00211891220827597,-4.867379334879302e-5,-4.990812813538284e-8,-0.0021188006530865576,-4.8717674424215837e-5,-4.9957631878584515e-8,-0.0021186330805224884,-4.878489183979079e-5,-5.003335885442783e-8,-0.002118409606923484,-4.8846210672363946e-5,-5.010414572430475e-8,-0.0021181395569648243,-4.887764161794287e-5,-5.0144131459874775e-8,-0.002117838428140765,-4.8862089859800686e-5,-5.013472762586503e-8,-0.0021175254797301053,-4.87900395563563e-5,-5.006548391793509e-8,-0.0021172217039225403,-4.865995177280172e-5,-4.9934517707598465e-8,-0.0021169477453683006,-4.8478584561881674e-5,-4.9748766630150475e-8,-0.002116721392799632,-4.8261007717598124e-5,-4.952391111144196e-8,-0.00211655455107997,-4.802973321358578e-5,-4.928344153787555e-8,-0.002116450096966629,-4.781233066898358e-5,-4.9056238260434893e-8,-0.0021163995074253497,-4.763723300556185e-5,-4.88723175000772e-8,-0.00211638238176434,-4.752806896211847e-5,-4.8757005535652654e-8,-0.0021163687749273766,-4.749765415455074e-5,-4.872463016284184e-8,-0.0021163245129189124,-4.75433801208055e-5,-4.8773504423959966e-8,-0.0021162186131261293,-4.7645689733550204e-5,-4.888400543678275e-8,-0.0021160311239636605,-4.7770598620135224e-5,-4.902087037517744e-8,-0.0021157594156345004,-4.787624496808221e-5,-4.913984622203423e-8,-0.0021154210653734945,-4.792249771712643e-5,-4.919779498322852e-8,-0.0021150518661444766,-4.788171611098116e-5,-4.916427157162084e-8,-0.0021146983037815758,-4.774784549571525e-5,-4.903151581702451e-8,-0.0021144054214774677,-4.754043449876239e-5,-4.881909664190108e-8,-0.002114203335655032,-4.730071511555959e-5,-4.857004998709531e-8,-0.0021140976257717674,-4.7079605315396366e-5,-4.8338297363515245e-8,-0.002114068243449401,-4.6921741162987395e-5,-4.817168920274723e-8,-0.0021140776517754515,-4.685238849929127e-5,-4.8097948508555413e-8,-0.002114084019446718,-4.6872596236596724e-5,-4.81192411375788e-8,-0.002114053227237637,-4.6963141965845496e-5,-4.821604606694751e-8,-0.002113965448400426,-4.7093502898033734e-5,-4.8356449951288814e-8,-0.0021138158726727416,-4.7231060835115885e-5,-4.8505867927921634e-8,-0.0021136117434029157,-4.73475915439524e-5,-4.863405741638106e-8,-0.002113368243224607,-4.742253450655109e-5,-4.8718797175518944e-8,-0.0021131048107557887,-4.7443958322278066e-5,-4.874708212682086e-8,-0.002112842390293642,-4.740840058984932e-5,-4.87150037508711e-8,-0.002112601402461571,-4.732044050097083e-5,-4.8627229494421786e-8,-0.002112399898104981,-4.71923458598116e-5,-4.84965171325286e-8,-0.0021122513870208202,-4.7043586695278016e-5,-4.834314259144425e-8,-0.002112162155506463,-4.689959768605062e-5,-4.8193650389836864e-8,-0.0021121284044120486,-4.678902511400128e-5,-4.807810872069021e-8,-0.002112134192586928,-4.6738909755118304e-5,-4.802520783954363e-8,-0.002112151736011111,-4.676805674809973e-5,-4.8055358790222776e-8,-0.0021121455008559073,-4.68802207502431e-5,-4.8173435647070684e-8,-0.002112080244306887,-4.705993268071947e-5,-4.8364140938563196e-8,-0.0021119310664213338,-4.727368018370931e-5,-4.8592931302070324e-8,-0.002111691895111901,-4.747730114612249e-5,-4.881352739322071e-8,-0.0021113788749667064,-4.7627699607907756e-5,-4.898012188224292e-8,-0.00211102704677318,-4.7694954771803144e-5,-4.9060201272908396e-8,-0.002110681352249585,-4.767075494556609e-5,-4.90436883734857e-8,-0.002110384874318121,-4.7570663804349934e-5,-4.894570849816082e-8,-0.0021101677401916797,-4.7429813825341904e-5,-4.8802430880724736e-8,-0.002110039696581039,-4.729335730533683e-5,-4.866125590022362e-8,-0.0021099884072854364,-4.7204358850854926e-5,-4.8568084600913465e-8,-0.002109983945387274,-4.7192708949043166e-5,-4.855543459993911e-8,-0.0021099879117350232,-4.726846620998511e-5,-4.863507382826351e-8,-0.0021099639576379094,-4.7421428985429237e-5,-4.879720662545984e-8,-0.0021098861854816123,-4.7626298326830003e-5,-4.901567331796005e-8,-0.002109743186109511,-4.7850789510772105e-5,-4.9256450069474826e-8,-0.002109537586825893,-4.8063526347891254e-5,-4.948609768053289e-8,-0.002109282655958739,-4.8239580975826655e-5,-4.967782243823404e-8,-0.0021089979409871034,-4.8363148343395243e-5,-4.981449771751667e-8,-0.002108705341277884,-4.8427999229028034e-5,-4.988923858233261e-8,-0.002108426170116319,-4.843672757019664e-5,-4.990457813568429e-8,-0.0021081790939703336,-4.8399655340769195e-5,-4.987120855545762e-8,-0.002107978462340765,-4.8333815691984267e-5,-4.98068240380907e-8,-0.0021078325085235445,-4.8261883157006745e-5,-4.973500790876879e-8,-0.002107741182028866,-4.8210487087105704e-5,-4.968358842430621e-8,-0.0021076938773007476,-4.820714020935879e-5,-4.9681591379790985e-8,-0.0021076680383246907,-4.827513281127266e-5,-4.975399170959863e-8,-0.002107630376401887,-4.842654419791798e-5,-4.991432609044488e-8,-0.0021075425159545343,-4.865523284848443e-5,-5.015711147352186e-8,-0.0021073713272879244,-4.893349928726431e-5,-5.045403692151433e-8,-0.002107101054149504,-4.921621165090497e-5,-5.075804312180078e-8,-0.00210674158544731,-4.9453141274911964e-5,-5.1016160495136004e-8,-0.0021063277292051657,-4.960526660686225e-5,-5.1186657637328415e-8,-0.0021059088236712936,-4.965767137535703e-5,-5.1252729209342855e-8,-0.002105533355710234,-4.962333434846008e-5,-5.122672710022117e-8,-0.002105235298687669,-4.953725574759237e-5,-5.114433301511661e-8,-0.0021050267301768173,-4.9444765358431426e-5,-5.105262008384059e-8,-0.0021048975954977385,-4.938895653500951e-5,-5.099704564916817e-8,-0.0021048209457205044,-4.940083264676395e-5,-5.1011036159970786e-8,-0.0021047611320736954,-4.9493878141675046e-5,-5.110997819652719e-8,-0.0021046825545899023,-4.9663315734863536e-5,-5.1290024568352304e-8,-0.002104557033149279,-4.98893453161492e-5,-5.1531150434198844e-8,-0.0021043684802190066,-5.0143026698940785e-5,-5.1803180748147716e-8,-0.002104114312419352,-5.0393089164750924e-5,-5.2073008844431506e-8,-0.0021038039107087792,-5.0611974369170696e-5,-5.2311154609061635e-8,-0.002103455142864527,-5.077997300985246e-5,-5.249634587215205e-8,-0.0021030901973043527,-5.088713159052434e-5,-5.261767665298347e-8,-0.002102731754757487,-5.093327497583167e-5,-5.2674658453290784e-8,-0.002102400038249737,-5.0926853473763044e-5,-5.267593710089334e-8,-0.002102110741705476,-5.088333895282607e-5,-5.2637516149960456e-8,-0.002101873489403106,-5.08235740242651e-5,-5.2580999673824274e-8,-0.0021016904381226816,-5.07720385838116e-5,-5.2531862498246874e-8,-0.0021015548084289933,-5.0754644122074386e-5,-5.2517309070279127e-8,-0.002101449525764805,-5.079541727592946e-5,-5.256294807274047e-8,-0.002101346863688587,-5.091147619245311e-5,-5.268753767417356e-8,-0.0021012107625705593,-5.110647842638639e-5,-5.2895930277749896e-8,-0.0021010036231113496,-5.1364431323432054e-5,-5.317225671965255e-8,-0.0021006978474307205,-5.164780092740599e-5,-5.347763770609452e-8,-0.0021002887607210427,-5.1904283966139336e-5,-5.3757151991875933e-8,-0.0020998017811831972,-5.2082983385010847e-5,-5.3956856249473105e-8,-0.002099287305051419,-5.2153786677272464e-5,-5.404424493360183e-8,-0.002098803714303415,-5.211938886395136e-5,-5.402099729340937e-8,-0.0020983970909576486,-5.201310176200273e-5,-5.392087032373497e-8,-0.0020980879471518285,-5.1884788106360025e-5,-5.379525398388802e-8,-0.0020978694594535633,-5.178355560077695e-5,-5.3695353664609535e-8,-0.0020977146033212875,-5.1744897802943776e-5,-5.3658858151211176e-8,-0.0020975867206337855,-5.17850538647107e-5,-5.370387698001164e-8,-0.002097449252174256,-5.1901448471996434e-5,-5.382901325735156e-8,-0.0020972727165282454,-5.2076755488728516e-5,-5.4017187239652266e-8,-0.002097038679265766,-5.228448053746355e-5,-5.424119501315798e-8,-0.002096741115512614,-5.2494770950254756e-5,-5.446974146690214e-8,-0.0020963856479537316,-5.267968073580639e-5,-5.467310941300608e-8,-0.0020959871806476727,-5.281730553664611e-5,-5.482773870037851e-8,-0.002095566547851664,-5.2894425618154075e-5,-5.49192091763326e-8,-0.0020951467983804607,-5.2907580747666326e-5,-5.494346629557186e-8,-0.0020947496865052926,-5.2862703551995284e-5,-5.490641407062349e-8,-0.00209439283463895,-5.277366064911636e-5,-5.482230500560337e-8,-0.002094087719578533,-5.266022168051224e-5,-5.471156076175677e-8,-0.0020938383034884785,-5.2545818362760925e-5,-5.459846822588298e-8,-0.00209364009071615,-5.245512424241938e-5,-5.4508786421523974e-8,-0.002093479524987209,-5.241128303972207e-5,-5.4467015989831044e-8,-0.002093333866675805,-5.243244496307399e-5,-5.449285675295966e-8,-0.002093172238328941,-5.25272454837531e-5,-5.459637339444828e-8,-0.002092959192295158,-5.2689536740216397e-5,-5.47721861308031e-8,-0.002092662162437497,-5.289419192472436e-5,-5.4994709404817255e-8,-0.002092262731012093,-5.3097515495686634e-5,-5.5218327291160634e-8,-0.0020917682925749906,-5.3246152076680836e-5,-5.5386719323868286e-8,-0.0020912168729252238,-5.32948950916572e-5,-5.5451705931345774e-8,-0.00209066831104737,-5.322638039161152e-5,-5.539407826225248e-8,-0.002090182976448214,-5.306061034027742e-5,-5.523368866112795e-8,-0.0020897991792229852,-5.2847036022818596e-5,-5.502129784760488e-8,-0.0020895220312050072,-5.264403046194828e-5,-5.481735951820511e-8,-0.002089327651578887,-5.2498344531242285e-5,-5.4670817165440435e-8,-0.002089176601984936,-5.243402752975581e-5,-5.46075905285881e-8,-0.002089027832962104,-5.2451886161662154e-5,-5.462976227025945e-8,-0.002088848145979607,-5.253524957931374e-5,-5.4721159636310425e-8,-0.002088616519163286,-5.265749417095675e-5,-5.485481113266398e-8,-0.0020883247601802828,-5.278870213189013e-5,-5.499971074275159e-8,-0.0020879761659435914,-5.290068935685728e-5,-5.512613172786507e-8,-0.002087583221816599,-5.297058683962383e-5,-5.520959628157752e-8,-0.002087164777385674,-5.29832296796577e-5,-5.5233626895864976e-8,-0.002086742950109644,-5.2932455223265686e-5,-5.519126877302781e-8,-0.002086339956581604,-5.282138748957507e-5,-5.508542075950947e-8,-0.0020859750527439137,-5.266171847400609e-5,-5.492801945295256e-8,-0.0020856618891764334,-5.247200185689632e-5,-5.4738177469182e-8,-0.0020854066000901466,-5.227520696881749e-5,-5.453962120190033e-8,-0.0020852067040709943,-5.209587655834655e-5,-5.4357819901512334e-8,-0.002085050761531667,-5.19570440334916e-5,-5.421693100956444e-8,-0.0020849188250382576,-5.187695475340274e-5,-5.4136513752244604e-8,-0.0020847838283227895,-5.1865633386018315e-5,-5.4127943797766366e-8,-0.002084614302700284,-5.192134366393279e-5,-5.4190517439071605e-8,-0.002084379177216386,-5.202743147570318e-5,-5.4307801867957737e-8,-0.0020840552632532838,-5.2151132764179095e-5,-5.444603412637725e-8,-0.0020836367229090016,-5.2246983387897786e-5,-5.4557508305702125e-8,-0.0020831432642481086,-5.226727446908682e-5,-5.45915998704627e-8,-0.00208262110484632,-5.217892051956154e-5,-5.451267651801983e-8,-0.0020821314693878165,-5.1979995231158984e-5,-5.4317639028435655e-8,-0.002081728580818981,-5.170500269403149e-5,-5.404156653193917e-8,-0.0020814384597434145,-5.1412711832119855e-5,-5.374512512192592e-8,-0.0020812512548079114,-5.1162601970100065e-5,-5.349017232141276e-8,-0.0020811301739922143,-5.0993981576040526e-5,-5.331814200443522e-8,-0.0020810288964036128,-5.091778800135395e-5,-5.324144113486929e-8,-0.0020809068797548306,-5.0920708246115815e-5,-5.324742058440525e-8,-0.002080737412895719,-5.0975044648063965e-5,-5.330822538299496e-8,-0.0020805090765344805,-5.104836915559959e-5,-5.339054776415609e-8,-0.0020802235105041346,-5.111032019083676e-5,-5.3462654102947513e-8,-0.0020798920087048986,-5.113645247824958e-5,-5.349856905196274e-8,-0.0020795322310856322,-5.111013067736273e-5,-5.3480319452971573e-8,-0.002079165270330489,-5.102337145825212e-5,-5.339903379738613e-8,-0.002078812929807196,-5.0877027322918444e-5,-5.325522084868336e-8,-0.0020784951021789507,-5.0680399754512935e-5,-5.3058323468374344e-8,-0.0020782272019827155,-5.0450194248135284e-5,-5.2825530483115977E-08,-0.002078017796904138,-5.020860124030872e-5,-5.257971627504764e-8,-0.002077866846658982,-4.998045829403398e-5,-5.234652763334412e-8,-0.002077764949227266,-4.9789769777337244e-5,-5.215090293742938e-8,-0.002077693796213007,-4.96559598259346e-5,-5.201333928555749e-8,-0.002077627945643406,-4.959024266445353e-5,-5.1946199184189877e-8,-0.0020775379573369774,-4.959258117963107e-5,-5.1950458272378425e-8,-0.002077394847759163,-4.964972754567608e-5,-5.20133946027985e-8,-0.0020771757956997636,-4.973494898228385e-5,-5.2107934240242226e-8,-0.0020768707597667575,-4.981047198397003e-5,-5.21948928946358e-8,-0.002076488719453658,-4.9833950263944744e-5,-5.222962698296795e-8,-0.0020760607752435137,-4.976947981592237e-5,-5.217368787144459e-8,-0.0020756363255762,-4.960119521007246e-5,-5.2009327355383566e-8,-0.0020752699804712604,-4.934370262592132e-5,-5.175068444401802e-8,-0.002075002258206543,-4.904167747827994e-5,-5.144355599514386e-8,-0.002074843505137487,-4.875527236421879e-5,-5.115030112001243e-8,-0.002074770885112081,-4.85375576824606e-5,-5.092642497342114e-8,-0.0020747400769557814,-4.841647775431193e-5,-5.080178737543361e-8,-0.00207470360549399,-4.839002227744564e-5,-5.077538800998163e-8,-0.0020746254988324455,-4.843356303392952e-5,-5.082265162308837e-8,-0.002074487411936633,-4.8512066229528486e-5,-5.090778965666528e-8,-0.002074287589063454,-4.8590652566310444e-5,-5.099462507142112e-8,-0.0020740364229402913,-4.864094211986411e-5,-5.105327235216716e-8,-0.0020737516117730406,-4.864364377231825e-5,-5.1063071939584795e-8,-0.0020734542779023923,-4.858893563414716e-5,-5.101324060777878e-8,-0.0020731661303226793,-4.847596434842968e-5,-5.090249495797251e-8,-0.0020729072209830705,-4.831209437291138e-5,-5.073826475982897e-8,-0.002072693884949742,-4.81119863715466e-5,-5.053563043378728e-8,-0.0020725366574624164,-4.789627336170478e-5,-5.031584456326077e-8,-0.002072438244777095,-4.76894406001386e-5,-5.0104114550785046e-8,-0.0020723920062757552,-4.751664405123388e-5,-4.992640119935618e-8,-0.002072381620741844,-4.7399626029792626e-5,-4.980535122260885e-8,-0.002072382493146707,-4.735231857382114e-5,-4.975587690759763e-8,-0.002072365126038206,-4.737703392101369e-5,-4.9781211913094104e-8,-0.0020723002115636837,-4.746229500170882e-5,-4.987048608611002e-8,-0.002072164686144449,-4.758318793891755e-5,-4.9998772052492005e-8,-0.0020719476479477516,-4.7704672733856255e-5,-5.0130175273880784e-8,-0.0020716548762382742,-4.778785681354576e-5,-5.0224127220180263E-08,-0.002071310506859259,-4.779875995902617e-5,-5.0244500497020163e-8,-0.0020709542977483263,-4.7718213318121765e-5,-5.017014103512715e-8,-0.002070633392768585,-4.755018007788747e-5,-5.0003890279004845e-8,-0.0020703892518739446,-4.7324560969728754e-5,-4.9775852540256276e-8,-0.002070243556064142,-4.709095642120351e-5,-4.953713265926498e-8,-0.002070189582318923,-4.690347790577672e-5,-4.93441179578025e-8,-0.002070194443298303,-4.6802416516879245e-5,-4.9239360290252976e-8,-0.002070211781957937,-4.680166452708117e-5,-4.923831183218621e-8,-0.0020701982102484394,-4.688757653287808e-5,-4.9327848095478144e-8,-0.0020701254502533,-4.702784331254064e-5,-4.947517696147768e-8,-0.002069984310820259,-4.718405080239909e-5,-4.9640685225447364e-8,-0.002069781881963152,-4.732196406548829e-5,-4.978861540585559e-8,-0.002069535727065262,-4.741708010271714e-5,-4.989300757237092e-8,-0.0020692682062174064,-4.7456088345065395e-5,-4.993946266170168e-8,-0.0020690022999483347,-4.743604483466135e-5,-4.9924473337753236e-8,-0.0020687589325963695,-4.736278778201662e-5,-4.9853830021207306e-8,-0.0020685552095647745,-4.724938104372905e-5,-4.9740931313843226e-8,-0.0020684029471759965,-4.7114721697835956e-5,-4.9605222607596616e-8,-0.002068307113632894,-4.698198596032385e-5,-4.9470525465095644e-8,-0.002068264210735056,-4.6876359384872586e-5,-4.936274057243991e-8,-0.0020682611085878133,-4.682161851644506e-5,-4.930645763105391e-8,-0.002068275207205279,-4.683559588593652e-5,-4.932042167102954e-8,-0.002068276840995726,-4.692525626768796e-5,-4.941250393336782e-8,-0.0020682343681795467,-4.708286526062035e-5,-4.9575641749325084e-8,-0.002068121336074826,-4.728509807584928e-5,-4.9786665145860586e-8,-0.002067923897843404,-4.7496385865671217e-5,-5.0009436305109905e-8,-0.0020676460373650566,-4.7676378285878495e-5,-5.0202301586995866e-8,-0.0020673105644500745,-4.77898332491647e-5,-5.032822287464823e-8,-0.002066955050994269,-4.781625324925658e-5,-5.036486940750825e-8,-0.0020666233471462645,-4.7756464778773514e-5,-5.0311739548860085e-8,-0.002066354580310086,-4.763398187934115e-5,-5.0191974764700023E-08,-0.0020661724200392493,-4.7490128745401975e-5,-5.004766473653001e-8,-0.0020660778693884388,-4.737345115377653e-5,-4.9929071504630356e-8,-0.002066048524221078,-4.732603099287772e-5,-4.9880421809209325e-8,-0.0020660453797246812,-4.737129330364156e-5,-4.992704483799921e-8,-0.0020660250285791494,-4.7508085193365105e-5,-5.006889477610717e-8,-0.0020659523841825966,-4.7713206060515434e-5,-5.028283650859611e-8,-0.0020658090029066624,-4.795053885650078e-5,-5.053188956294247e-8,-0.002065594771846483,-4.818222569886375e-5,-5.0776768516938594e-8,-0.002065324117375244,-4.837752105633615e-5,-5.0985184294608874e-8,-0.002065019767433622,-4.851728875182688e-5,-5.1136723525022014e-8,-0.0020647068446275245,-4.8594594783670716e-5,-5.1223668798557995e-8,-0.0020644086381638085,-4.861304972472082e-5,-5.124938607964203e-8,-0.002064144097864555,-4.8584434676873395e-5,-5.122584536957933e-8,-0.002063926468637026,-4.852647936788248e-5,-5.1171225339119544e-8,-0.0020637623786124806,-4.846100605905334e-5,-5.11079143446867e-8,-0.0020636508879348973,-4.841213269692522e-5,-5.106066445180714e-8,-0.002063582435238546,-4.8403934845334516e-5,-5.1054290024565175e-8,-0.002063538168965467,-4.8457018960260466e-5,-5.1110281108115146e-8,-0.002063490642966396,-4.858388401565267e-5,-5.12421042751145e-8,-0.002063407082221286,-4.8783799285689586e-5,-5.144985988199522e-8,-0.0020632559577338995,-4.9039126710606216e-5,-5.1716281192541857e-8,-0.0020630160427410785,-4.931581340272001e-5,-5.200696102828744e-8,-0.002062684941410063,-4.95699691789468e-5,-5.2276889335559116e-8,-0.0020622829172062315,-4.9759696099219955e-5,-5.2482526161209284e-8,-0.0020618491854511264,-4.9858113731482825e-5,-5.259526114699326e-8,-0.0020614313126430684,-4.98622055714111e-5,-5.261072103110058e-8,-0.0020610717124268244,-4.979388598943105e-5,-5.255018976438976e-8,-0.00206079622917913,-4.9693307260769264e-5,-5.2454091838812215e-8,-0.002060608259750969,-4.960738794563041e-5,-5.2370482519734586e-8,-0.0020604893759882652,-4.957747244117635e-5,-5.234243575739418e-8,-0.0020604054583355405,-4.962944279368117e-5,-5.239769021503708e-8,-0.00206031622426224,-4.976850689463904e-5,-5.254290844467591e-8,-0.0020601854537221713,-4.997959938080869e-5,-5.276367005121703e-8,-0.002059989171420568,-5.0232827495872717e-5,-5.3029781808228276e-8,-0.0020597197607184654,-5.049196909900188e-5,-5.330394627200139e-8,-0.002059385412596773,-5.0723251719086136e-5,-5.35509256812709e-8,-0.002059005920337264,-5.0901931837912855e-5,-5.374455696877302e-8,-0.0020586068325025636,-5.1015438910330984e-5,-5.387122879648511e-8,-0.0020582139353274493,-5.106332394108202e-5,-5.3929977985066915e-8,-0.0020578492211639973,-5.105516573900859e-5,-5.3930358175955645e-8,-0.002057528552028513,-5.100771436745336e-5,-5.388943054436595e-8,-0.0020572605931187234,-5.094215881551009e-5,-5.382886471043966e-8,-0.0020570463828137086,-5.088182315066045e-5,-5.3772543032440546e-8,-0.0020568790450358394,-5.0850080664488783e-5,-5.3744486331419684e-8,-0.0020567435004348058,-5.086799254343324e-5,-5.376655829843546e-8,-0.0020566165172875277,-5.0951144908211624e-5,-5.38553140117008e-8,-0.002056468009873697,-5.1105440079060466e-5,-5.40176449522486e-8,-0.002056264887091375,-5.13224346701609e-5,-5.4245796040435814e-8,-0.0020559784072281106,-5.157623756835036e-5,-5.451389058844007e-8,-0.0020555942713637253,-5.1825209665744814e-5,-5.4779432398487804e-8,-0.0020551217432332926,-5.202108670480498e-5,-5.4992587084446835e-8,-0.002054595971680873,-5.212442299521637e-5,-5.511211091620739e-8,-0.002054069540827032,-5.212000715115373e-5,-5.51213256728815e-8,-0.0020535954582683582,-5.202381128623128e-5,-5.503543356010499e-8,-0.002053209667556904,-5.187728707364314e-5,-5.48959111155173e-8,-0.002052921320923942,-5.1732422490422854e-5,-5.4755490408141264e-8,-0.0020527136286440546,-5.163540619096735e-5,-5.466165472016251e-8,-0.002052552370246584,-5.16152962902263e-5,-5.464504010682952e-8,-0.002052397089200715,-5.167979779085585e-5,-5.471483931427527e-8,-0.0020522111175157827,-5.1817015362214554e-5,-5.4860156203498216e-8,-0.002051968552414977,-5.200091488002448e-5,-5.505518884494557e-8,-0.002051657757119859,-5.219838699551085e-5,-5.5266251947721564e-8,-0.0020512816489339715,-5.237636228823249e-5,-5.5459107581815276e-8,-0.0020508553095427784,-5.2507832957142995e-5,-5.5605365688318714e-8,-0.0020504017421625635,-5.2575890404729004e-5,-5.568690921630114e-8,-0.002049946887543557,-5.257533993074332e-5,-5.5697769382127575e-8,-0.002049514984834118,-5.251207506856239e-5,-5.5643570315387093e-8,-0.0020491250330573053,-5.240083953067565e-5,-5.553919797775131e-8,-0.0020487886736325817,-5.226219084775036e-5,-5.540559549606092e-8,-0.002048509350314085,-5.211942672300324e-5,-5.526655233827838e-8,-0.0020482822912756475,-5.1995876311308334e-5,-5.514595440180733e-8,-0.0020480948969156336,-5.191250486751777e-5,-5.506543751527602e-8,-0.0020479273660762303,-5.188554270222557e-5,-5.5042078174011434e-8,-0.002047753716271682,-5.19237834715236e-5,-5.5085654827554707e-8,-0.002047543853386551,-5.202532476066097e-5,-5.5195172880639046e-8,-0.0020472677925593256,-5.2174216124140644e-5,-5.535514660858792e-8,-0.002046902870774027,-5.2338771760351975e-5,-5.553355877045675e-8,-0.0020464432837271392,-5.247451873274851e-5,-5.568470840459575e-8,-0.0020459084093877532,-5.253449204712567e-5,-5.575981860047395e-8,-0.002045343640214381,-5.2486027294355265e-5,-5.5724461720487053e-8,-0.002044808785656605,-5.2326853813685626e-5,-5.557525555895152e-8,-0.002044356731611969,-5.208986005362827e-5,-5.534487592771635e-8,-0.002044013525552351,-5.183141847200364e-5,-5.5090255370018856e-8,-0.002043771226817781,-5.160953417781544e-5,-5.48704621303244e-8,-0.0020435956589243583,-5.1464429347744986e-5,-5.472704260792385e-8,-0.0020434418674889353,-5.1410036594933055e-5,-5.4675282541850294e-8,-0.0020432684427998627,-5.14362548539681e-5,-5.470618039648655e-8,-0.0020430462096218717,-5.1516940304592496e-5,-5.4794150517663037e-8,-0.0020427612302023604,-5.161886518563504e-5,-5.490581755587025e-8,-0.002042413976632722,-5.170911019925943e-5,-5.50074620408479e-8,-0.0020420165420526716,-5.1760253982835196e-5,-5.5070471238764245e-8,-0.0020415890123641396,-5.1753638794210315e-5,-5.507496856439569e-8,-0.002041155494939975,-5.168102371657047e-5,-5.501178570621877e-8,-0.0020407401651533347,-5.154474405169965e-5,-5.488278817879703e-8,-0.0020403637204026146,-5.135653343018677e-5,-5.4699684377973364e-8,-0.002040040576882192,-5.113526412477106e-5,-5.448162890443747e-8,-0.002039777091455139,-5.09039490226065e-5,-5.425206240270826e-8,-0.0020395709362431877,-5.068649756636404e-5,-5.4035371776647424e-8,-0.002039411459954195,-5.050467571637247e-5,-5.385385724355181e-8,-0.002039280756574348,-5.037542727193322e-5,-5.372512326084712e-8,-0.0020391552857087123,-5.030852534711591e-5,-5.365977061904039e-8,-0.0020390080427771986,-5.030447590753775e-5,-5.365921376204627e-8,-0.002038811568452725,-5.0352607930303213e-5,-5.3713516384989046e-8,-0.0020385424324039243,-5.042973944197244e-5,-5.379970190700536e-8,-0.0020381875739485158,-5.050077044952324e-5,-5.388206675784495e-8,-0.0020377516616928775,-5.052330199125621e-5,-5.391680200972993e-8,-0.0020372625651711995,-5.045802416725423e-5,-5.386277190055731e-8,-0.0020367698775526524,-5.028392416035833e-5,-5.3697376840582164e-8,-0.0020363321435952564,-5.001196000452072e-5,-5.34308014077663e-8,-0.0020359951521852593,-4.968703486004547e-5,-5.310816086035136e-8,-0.0020357726478473404,-4.937288418461528e-5,-5.279414480895378e-8,-0.0020356419556401216,-4.9126855995544544e-5,-5.2547399322285394e-8,-0.002035556684070434,-4.897959533240644e-5,-5.2399885499866514e-8,-0.0020354668174017705,-4.892970414356411e-5,-5.2351307750795756e-8,-0.0020353344578759418,-4.8951698867931034e-5,-5.237686688565701e-8,-0.0020351402813209166,-4.900893595997211e-5,-5.2440021527677685e-8,-0.0020348825479860966,-4.906468718670452e-5,-5.250353037457378e-8,-0.0020345726105927375,-4.908894182699448e-5,-5.253641005057569e-8,-0.002034229863541913,-4.906144649731033e-5,-5.251727392128725e-8,-0.002033877432711455,-4.897243922319491e-5,-5.2435389666249733e-8,-0.002033538711092817,-4.882223756648143e-5,-5.2290488844127926e-8,-0.002033234470164266,-4.8620156756388854e-5,-5.2091736421230884e-8,-0.0020329804185158853,-4.838285072517303e-5,-5.185597492180308e-8,-0.0020327852353072594,-4.813206614562613e-5,-5.160531630998899e-8,-0.002032649254192641,-4.789178910703803e-5,-5.136415864036497e-8,-0.00203256409568354,-4.7684964149517676e-5,-5.115586867184493e-8,-0.002032513412831578,-4.7530207576543425e-5,-5.099954932398015e-8,-0.0020324746777436327,-4.743890663944881e-5,-5.0907215491822745e-8,-0.002032421864725609,-4.741298395352246e-5,-5.088156196373777e-8,-0.002032328861343699,-4.744359026821503e-5,-5.091451930689139e-8,-0.002032173443614939,-4.7510913626487626e-5,-5.098678990055797e-8,-0.002031941783002499,-4.75853718193778e-5,-5.106873150905396e-8,-0.0020316332829377146,-4.763092567556373e-5,-5.112349305662727e-8,-0.002031264678451989,-4.7611506845454626e-5,-5.111354889776993e-8,-0.0020308711459007655,-4.7500835256465015e-5,-5.101094070015697e-8,-0.002030501384939176,-4.7293891553481265e-5,-5.0809346057054425e-8,-0.0020302046550841244,-4.7015069114082157e-5,-5.053271389164446e-8,-0.002030012417735536,-4.6715860633814e-5,-5.023306514824246e-8,-0.0020299237206302333,-4.645858056483108e-5,-4.997393446583235e-8,-0.002029904534219609,-4.629246101907128e-5,-4.980599835191041e-8,-0.0020299027081861383,-4.6235733219535855e-5,-4.974874457112798e-8,-0.0020298691085456756,-4.6273355836021885e-5,-4.9787942532947575e-8,-0.002029772836986357,-4.6368492929145236e-5,-4.9886997870461254e-8,-0.0020296053518841788,-4.6478270704142267e-5,-5.0002696473796485e-8,-0.0020293762284797076,-4.6565779984025805e-5,-5.009732090515303e-8,-0.0020291058975264805,-4.660586503998099e-5,-5.0144678766039385e-8,-0.0020288190745721122,-4.658611551409667e-5,-5.013139050785385e-8,-0.0020285401833065263,-4.650544482721242e-5,-5.0055709880198454e-8,-0.0020282905163081324,-4.637198758862261e-5,-4.9925521941264115e-8,-0.0020280863812595215,-4.6201017541421475e-5,-4.975620376898143e-8,-0.002027937697407739,-4.6012910954525015e-5,-4.95684364968778e-8,-0.0020278468548150497,-4.5830932166805734e-5,-4.938584335030445e-8,-0.0020278079352926354,-4.5678563130217145e-5,-4.923225233991149e-8,-0.0020278066732735607,-4.5576287146234076e-5,-4.9128512005390405e-8,-0.0020278216052989797,-4.553814792964579e-5,-4.908913495339701e-8,-0.0020278266184087235,-4.5568694544187735e-5,-4.91192941943901e-8,-0.0020277947861438816,-4.566099727855335e-5,-4.921277950752152e-8,-0.0020277030598136164,-4.579640243999685e-5,-4.9351559556919325e-8,-0.0020275370670149273,-4.5946459644631754e-5,-4.950743825762933e-8,-0.0020272951641109476,-4.6077038467505365e-5,-4.964594133297112e-8,-0.0020269909380996286,-4.615441491887575e-5,-4.9732349917762104e-8,-0.002026653192492816,-4.615293081887066e-5,-4.973956903588067e-8,-0.002026322209052732,-4.606314805429271e-5,-4.965671815932576e-8,-0.0020260414134917063,-4.5898197313257225e-5,-4.949598467985722e-8,-0.002025845064816443,-4.569487890022771e-5,-4.929407616837752e-8,-0.0020257453978966516,-4.550622741121225e-5,-4.9104815330766504e-8,-0.0020257254701901042,-4.538541867435896e-5,-4.898274157296879e-8,-0.0020257433889951937,-4.536680350718691e-5,-4.89636608578841e-8,-0.0020257476215753702,-4.5453789008186565e-5,-4.905208248604179e-8,-0.002025695654193513,-4.562012774480506e-5,-4.922225373647776e-8,-0.0020255663701208917,-4.582262170758979e-5,-4.943082479997011e-8,-0.0020253618227586557,-4.6016984020625265e-5,-4.963283638283841e-8,-0.00202510099803616,-4.6169328034816214e-5,-4.979343944742674e-8,-0.002024811017417274,-4.626077683867761e-5,-4.989278000082901e-8,-0.002024519795827304,-4.6286832571634604e-5,-4.992561400738215e-8,-0.0020242514862415977,-4.625433913083903e-5,-4.989840752411386e-8,-0.002024024252686185,-4.617810969109077e-5,-4.982595556164917e-8,-0.0020238493406938953,-4.607808430854788e-5,-4.972841725462505e-8,-0.0020237306112493255,-4.597702408116703e-5,-4.96288581956967e-8,-0.002023664162763472,-4.589834984431947e-5,-4.955099750636145e-8,-0.0020236381094273855,-4.586365827157764e-5,-4.951673189348936e-8,-0.0020236329502209293,-4.5889656355000434e-5,-4.954314934249165e-8,-0.002023623153744319,-4.5984715081919234e-5,-4.963915423232379e-8,-0.0020235804546441657,-4.6145777376813115e-5,-4.980235686787022e-8,-0.002023478863220688,-4.635676148666589e-5,-5.0017332271608656e-8,-0.0020233006158513526,-4.658965624449702e-5,-5.025648223081647e-8,-0.002023041531229927,-4.6808945440860525e-5,-5.048423155390615e-8,-0.0020227139642913913,-4.6978896318268104e-5,-5.066420578545552e-8,-0.002022346013528821,-4.7072161309276584e-5,-5.0767917079637096e-8,-0.002021976583923614,-4.7077557162162256e-5,-5.0782829172766134e-8,-0.002021646938817805,-4.700482993717928e-5,-5.071753209060727e-8,-0.0020213903373314294,-4.688457071627136e-5,-5.060204845365824e-8,-0.00202122225761361,-4.676225438165741e-5,-5.048208770780828e-8,-0.002021134399579563,-4.668682793085823e-5,-5.040757499631068e-8,-0.0020210955157597492,-4.66964938733245e-5,-5.041810897949245e-8,-0.002021060207166187,-4.680660727557303e-5,-5.053039604591645e-8,-0.0020209831787395298,-4.700501284627893e-5,-5.073317426465869e-8,-0.0020208331782008877,-4.7257207541469374e-5,-5.0992163914768974e-8,-0.002020600749527367,-4.751873684499668e-5,-5.126249359928724e-8,-0.002020297495132843,-4.7748817668834114e-5,-5.150253416122725e-8,-0.002019949045350994,-4.791973032907616e-5,-5.168357842505219e-8,-0.002019586148214338,-4.801998291591459e-5,-5.1793273968425187e-8,-0.0020192374342056386,-4.8052601996660434e-5,-5.183409256541799e-8,-0.002018925159106304,-4.8031175323490096e-5,-5.181942050354247e-8,-0.0020186634942643855,-4.797571811880198e-5,-5.1769350061628944e-8,-0.002018458307559683,-4.7909321720409155e-5,-5.17071934570522e-8,-0.0020183074793059634,-4.7855657746552463e-5,-5.1656878184229704e-8,-0.0020182012242393878,-4.783688725574289e-5,-5.164083264519561e-8,-0.0020181224346406887,-4.7871384574551e-5,-5.167777089044754e-8,-0.002018047515893418,-4.797092449356852e-5,-5.177995991815182e-8,-0.0020179484270965854,-4.813745696818201e-5,-5.1950004632217014e-8,-0.0020177966111187182,-4.836022705575067e-5,-5.217785319666721e-8,-0.0020175689778127058,-4.861471743161788e-5,-5.243952149084699e-8,-0.0020172549083493363,-4.886518940475764e-5,-5.2699404555608824e-8,-0.0020168618491771245,-4.9071739379400246e-5,-5.291720278700551e-8,-0.0020164165457899337,-4.920074189090056e-5,-5.305839885690176e-8,-0.0020159601254947663,-4.923537724905972e-5,-5.310497994930823e-8,-0.0020155377782343923,-4.9182101111894395e-5,-5.3062208619770655e-8,-0.0020151863264922898,-4.9070186505180795e-5,-5.2958496549887175e-8,-0.0020149239683831454,-4.894424255995497e-5,-5.28381974040878e-8,-0.002014745466484543,-4.8852234007670655e-5,-5.2749744360003565e-8,-0.002014623980385843,-4.8832737442584404e-5,-5.2732795661562925E-08,-0.0020145187675945538,-4.8905033515197663e-5,-5.2807996323674024e-8,-0.002014386463354211,-4.9064737170752646e-5,-5.297217537397421e-8,-0.0020141926071653754,-4.928613889269881e-5,-5.3200321420099145e-8,-0.002013919923050992,-4.953032530867741e-5,-5.3453543629696204e-8,-0.002013571006866503,-4.975617191211685e-5,-5.369014468097558e-8,-0.0020131652167542056,-4.993046123284049e-5,-5.3875992139383384e-8,-0.002012731692604997,-5.0034158097124634e-5,-5.399109718532883e-8,-0.0020123014742402913,-5.0063845602625036e-5,-5.403129483295887e-8,-0.00201190121087524,-5.002933955111049e-5,-5.4005977959494064e-8,-0.002011549521326985,-4.994945558883987e-5,-5.393385164637899e-8,-0.002011255743455944,-4.984764678639762e-5,-5.383846809376056e-8,-0.0020110201985696686,-4.974843179222414e-5,-5.374453985485008e-8,-0.002010835083772604,-4.9674777295965575e-5,-5.367526613695328e-8,-0.0020106854277154628,-4.964606496865315e-5,-5.365032901804489e-8,-0.0020105500400673802,-4.9676073962541255e-5,-5.3683953076972764e-8,-0.0020104028617102853,-4.9770593190928885e-5,-5.3782559234610896e-8,-0.0020102154280196164,-4.992472116898015e-5,-5.39419945769669e-8,-0.002009961203093299,-5.01205774324166e-5,-5.4145045648848874e-8,-0.0020096220475094026,-5.032702956215601e-5,-5.436091558231032e-8,-0.0020091956873586328,-5.0503577918817376e-5,-5.454893403638213e-8,-0.0020087010935627442,-5.060963041617747e-5,-5.466782814365228e-8,-0.0020081776870822868,-5.06175125618987e-5,-5.468889528583259e-8,-0.0020076760813480246,-5.052404157729019e-5,-5.4607820427235687e-8,-0.0020072426309083852,-5.03543523152836e-5,-5.444874990717472e-8,-0.0020069043511348767,-5.015493124700536e-5,-5.42575575233768e-8,-0.0020066610667815107,-4.997871174697851e-5,-5.40871357697118e-8,-0.0020064875013838,-4.98690470565664e-5,-5.3981449732444325e-8,-0.0020063429428621477,-4.9848723760962696e-5,-5.396442162152271e-8,-0.0020061836818402717,-4.991653940438004e-5,-5.40361687618578e-8,-0.0020059740082301832,-5.005060728795719e-5,-5.4175883241144576e-8,-0.0020056933781890086,-5.021595398427699e-5,-5.434910207886136e-8,-0.0020053390005447076,-5.037374382076034e-5,-5.4516829286568113e-8,-0.0020049242019915922,-5.048986269802197e-5,-5.464425732666e-8,-0.0020044736538592134,-5.054119841472836e-5,-5.470733410760349e-8,-0.0020040170112563204,-5.0518666909647305e-5,-5.469609132681992e-8,-0.002003582651521957,-5.0426916644760484e-5,-5.461455429534083e-8,-0.002003192848389794,-5.028151267800684e-5,-5.4477987905210974e-8,-0.0020028610069787686,-5.010484787898947e-5,-5.430874706071043e-8,-0.0020025908720933084,-4.992194480586509e-5,-5.413196542421391e-8,-0.0020023771463984017,-4.9756918400443195e-5,-5.3971933421660555e-8,-0.002002206808863418,-4.963034306888264e-5,-5.384945799572805e-8,-0.0020020606277349035,-4.955729195151486e-5,-5.3779965287491494e-8,-0.002001914752160842,-4.9545629165052306e-5,-5.377186303277142e-8,-0.0020017426370449094,-4.959424701946217e-5,-5.382477021649585e-8,-0.0020015178700865826,-4.9691252782268014e-5,-5.392756337052816e-8,-0.002001218597218113,-4.981272984636775e-5,-5.4056892268100934e-8,-0.0020008337756181305,-4.9923598500677135e-5,-5.417780009747694e-8,-0.002000370096206164,-4.998267559890689e-5,-5.4248682766537245e-8,-0.0019998563334538166,-4.995319905600739e-5,-5.423191853970226e-8,-0.0019993405058199324,-4.981692900508882e-5,-5.4108211202206056e-8,-0.0019988771595501596,-4.958544642961348e-5,-5.388813032255459e-8,-0.001998508235516319,-4.930060305686856e-5,-5.361273486836377e-8,-0.0019982470792282445,-4.902112276864653e-5,-5.3340329163181614e-8,-0.001998074636703137,-4.880149849864028e-5,-5.31255233957502e-8,-0.0019979490776461596,-4.867431780069525e-5,-5.300163018068865e-8,-0.001997822100817167,-4.864355803151583e-5,-5.2973805172126e-8,-0.0019976535169998273,-4.8688691267618395e-5,-5.3022777123200866e-8,-0.001997419552504148,-4.8774601604832057e-5,-5.311433704727912e-8,-0.001997114744774493,-4.8862226688571974e-5,-5.320970261330998e-8,-0.0019967494607951706,-4.891701856579829e-5,-5.3273961127601174e-8,-0.0019963452028423133,-4.8914377496388965e-5,-5.328171644965104e-8,-0.0019959291743273603,-4.884227819040176e-5,-5.3220032150562435e-8,-0.0019955289872912786,-4.870151669163586e-5,-5.3088954045228216e-8,-0.001995168161878916,-4.850401085939419e-5,-5.289994962557313e-8,-0.0019948628903654394,-4.8269744288963775e-5,-5.267284224427861e-8,-0.0019946202670904343,-4.8023026531601735e-5,-5.2431967802807096e-8,-0.0019944379707342885,-4.7788675113880514e-5,-5.220224766362233e-8,-0.0019943051797844005,-4.7588659781935926e-5,-5.200579146376313e-8,-0.0019942042706509,-4.743954711749449e-5,-5.1859386167826104e-8,-0.001994112859914415,-4.735069680607469e-5,-5.1772781475901097e-8,-0.001994006037341234,-4.732295848864623e-5,-5.1747440313270875e-8,-0.001993858894812306,-4.7347710668200726e-5,-5.177551950964653e-8,-0.0019936496579878314,-4.740627635058635e-5,-5.18390919640976e-8,-0.001993363861819001,-4.7470190253398286e-5,-5.1910146838977426e-8,-0.0019929996205191062,-4.7503541595903896e-5,-5.195272017060764e-8,-0.0019925728195238626,-4.746902878186876e-5,-5.1928915188607375e-8,-0.001992119310680294,-4.7338527946317814e-5,-5.1809644671995214e-8,-0.001991689987214206,-4.710613654808492e-5,-5.1587956392584026e-8,-0.0019913363447532006,-4.6797293437381455e-5,-5.128838764343941e-8,-0.0019910904742861894,-4.6465669201456026e-5,-5.096398901617266e-8,-0.001990950368197197,-4.617513909028325e-5,-5.067840830528089e-8,-0.0019908806466250022,-4.5975167125504204e-5,-5.048140368418561e-8,-0.0019908285309041696,-4.5883747649525306e-5,-5.039181646697579e-8,-0.0019907446103717484,-4.588605349155747e-5,-5.039601315964357e-8,-0.0019905972795608703,-4.59456274268961e-5,-5.045866854053545e-8,-0.0019903769307380295,-4.601920467643337e-5,-5.053718566759492e-8,-0.001990092573971516,-4.60683822052351e-5,-5.059317403618827e-8,-0.0019897653271612717,-4.6066023946311286e-5,-5.059894157366422e-8,-0.0019894219047486518,-4.5998288524238066e-5,-5.0539804388693425e-8,-0.001989089388356069,-4.5864029542767294e-5,-5.041380553085208e-8,-0.001988791342582684,-4.5672889943786124e-5,-5.023002279694939e-8,-0.0019885450270769787,-4.544267119758317e-5,-5.000598811628438e-8,-0.001988359611822744,-4.519623780012269e-5,-4.9764511439258186e-8,-0.001988235373861473,-4.4958196634044265e-5,-4.9530237154278555e-8,-0.001988163874878257,-4.475155292368226e-5,-4.932622435749737e-8,-0.0019881291494703197,-4.4594624487372946e-5,-4.917088069716583e-8,-0.0019881097672433527,-4.449860634103792e-5,-4.907562319610449e-8,-0.0019880814361664893,-4.446599676205845e-5,-4.9043404078743095e-8,-0.001988019896370336,-4.448984902371915e-5,-4.90679788963876e-8,-0.0019879040251158317,-4.455382789815783e-5,-4.9133842968146527e-8,-0.001987719144006088,-4.463316087772778e-5,-4.921694042093964e-8,-0.001987460558236463,-4.46967620556441e-5,-4.9286514917244204e-8,-0.0019871370966062707,-4.471122399257981e-5,-4.9308929889939364e-8,-0.0019867735413332,-4.464753053386993e-5,-4.925440944020967e-8,-0.0019864096922321078,-4.449046879624519e-5,-4.910667619111871e-8,-0.001986093293887148,-4.424847454638656e-5,-4.887310764941467e-8,-0.0019858657165408035,-4.395851101024967e-5,-4.858986252843164e-8,-0.0019857444502105696,-4.36793761172567e-5,-4.831531748591886e-8,-0.0019857123157436644,-4.3471892985409506e-5,-4.811032585031551e-8,-0.001985722442942424,-4.3374678707536145e-5,-4.801403302963816e-8,-0.001985717837909519,-4.3389861516746215e-5,-4.802953349265059e-8,-0.0019856536347009303,-4.348657983914437e-5,-4.812711300883761e-8,-0.001985509793314366,-4.3617293200771854e-5,-4.826016677840372e-8,-0.001985291041141802,-4.373551017512467e-5,-4.8382599589213666e-8,-0.001985018982825112,-4.380710889702349e-5,-4.8460059289153266e-8,-0.00198472269519155,-4.381413163467009e-5,-4.8473904889146595e-8,-0.0019844313817317153,-4.3753602107519224e-5,-4.8420335013601454e-8,-0.0019841698777690116,-4.3634265418978614e-5,-4.830740886578302e-8,-0.00198395631013117,-4.347308097731399e-5,-4.815167459106861e-8,-0.00198380093609794,-4.32920529085931e-5,-4.7974972464015794e-8,-0.0019837056325942176,-4.311530044265703e-5,-4.7801388949448075e-8,-0.0019836639326078916,-4.2966205027643966e-5,-4.765430103584804e-8,-0.0019836616788419274,-4.2864560277764126e-5,-4.755351001687462e-8,-0.0019836784835310212,-4.2823816969524074e-5,-4.75125667742844e-8,-0.0019836901334029686,-4.284880913635948e-5,-4.753661876885519e-8,-0.0019836717844280323,-4.293443985340406e-5,-4.7621167559884083e-8,-0.001983601577361672,-4.306561983656408e-5,-4.775195443764006e-8,-0.00198346427639853,-4.321860830029743e-5,-4.79061064744248e-8,-0.001983254503428399,-4.3363817575379086e-5,-4.805466061004061e-8,-0.001982979128261479,-4.3470011868281195e-5,-4.8166508580713625e-8,-0.0019826583317162807,-4.350982227820718e-5,-4.8213806615591725e-8,-0.0019823245270563744,-4.346642997860529e-5,-4.817876549475533e-8,-0.0019820179079688013,-4.334055689306835e-5,-4.806092503305833e-8,-0.0019817776241884424,-4.315546627647395e-5,-4.788249609663614e-8,-0.001981629243341138,-4.295622121243347e-5,-4.768788218876515e-8,-0.00198157253207564,-4.279964969343516e-5,-4.753376447678903e-8,-0.0019815768110193243,-4.273555993575656e-5,-4.747031671641675e-8,-0.0019815896914275643,-4.2786939561310826e-5,-4.752132323658576e-8,-0.001981556964728314,-4.294065163758243e-5,-4.767470277125102e-8,-0.001981442898715948,-4.315455768342111e-5,-4.788935301045354e-8,-0.001981239994932547,-4.337586664281439e-5,-4.811318043326988e-8,-0.001980965615592369,-4.3559380683812036e-5,-4.830112897720887e-8,-0.001980651104271411,-4.3677669740602314e-5,-4.842535724700544e-8,-0.001980330622165264,-4.37224614567855e-5,-4.8476842035870866e-8,-0.001980033601616317,-4.370082309922366e-5,-4.846185712372692e-8,-0.001979781186553916,-4.362987461869388e-5,-4.8396913373778846e-8,-0.0019795853426471683,-4.35321462310607e-5,-4.8304189751421825e-8,-0.001979449164923876,-4.343211096476673e-5,-4.8208004801788516e-8,-0.001979367516891493,-4.335355049589747e-5,-4.81320762404166e-8,-0.0019793277939190233,-4.331724667908914e-5,-4.8097157631997425e-8,-0.0019793109779484602,-4.333865671006025e-5,-4.811875302716466e-8,-0.00197929334115372,-4.342552864224307e-5,-4.8204839307820454e-8,-0.0019792491585166726,-4.3575840607934675e-5,-4.835390191602501e-8,-0.0019791544719827683,-4.377676979296662e-5,-4.855390559455163e-8,-0.0019789914659854206,-4.400538864917376e-5,-4.878285284376596e-8,-0.001978752618067997,-4.423151487384888e-5,-4.9011380729146134e-8,-0.001978443571552841,-4.442266642057841e-5,-4.920743293376487e-8,-0.0019780837559768326,-4.455044155192306e-5,-4.93424419569069e-8,-0.001977704189216635,-4.459716325964112e-5,-4.9397956177720134e-8,-0.0019773423735596264,-4.4561466986321577e-5,-4.937141684655841e-8,-0.001977034607825835,-4.446140319979623e-5,-4.927959934097138e-8,-0.0019768066566202684,-4.433345001834858e-5,-4.915798984075471e-8,-0.0019766648048065616,-4.422600808807836e-5,-4.905454320636164e-8,-0.001976590642014865,-4.418718038152136e-5,-4.901754862575995e-8,-0.0019765433922679146,-4.424941926591262e-5,-4.908018505043689e-8,-0.0019764714799322142,-4.441704193678446e-5,-4.924782281001948e-8,-0.0019763299672662825,-4.466351711965738e-5,-4.949503779025665e-8,-0.0019760958592488333,-4.494111748014449e-5,-4.9774988214425593e-8,-0.001975773776278894,-4.519821653836421e-5,-5.003649186587927e-8,-0.001975390495162118,-4.539533451112828e-5,-5.0239976118785304e-8,-0.0019749831859174212,-4.551335871876182e-5,-5.0365773681986254e-8,-0.0019745879207018306,-4.555320514137526e-5,-5.041400386812903e-8,-0.0019742323786003236,-4.553037719774458e-5,-5.039938833552872e-8,-0.0019739331147513276,-4.5468406296927464e-5,-5.03448680797245e-8,-0.001973695819172792,-4.539349471122782e-5,-5.0276287499947574e-8,-0.0019735168135767726,-4.533089935511781e-5,-5.0218721062822205e-8,-0.0019733846944876474,-4.5302611923024283e-5,-5.019408501320979e-8,-0.0019732817668098417,-4.532562487218592e-5,-5.021939519624579e-8,-0.0019731854504376916,-4.5410207074392044e-5,-5.0305107394665245e-8,-0.0019730701622044603,-4.5557997564901036e-5,-5.045329830787116e-8,-0.001972910223039121,-4.576026673732602e-5,-5.0655959638034884e-8,-0.001972684031500541,-4.5997198476817514E-05,-5.0894198826261366e-8,-0.001972379090884328,-4.623929153514652e-5,-5.113944114811148e-8,-0.001971996635686588,-4.6451727228890164e-5,-5.135753400078218e-8,-0.0019715539766186102,-4.660160044857538e-5,-5.1515737334611745e-8,-0.0019710828542270687,-4.6666477609024985e-5,-5.159115485388241e-8,-0.001970623298040414,-4.664162896085638e-5,-5.1578016403124346e-8,-0.001970214212090245,-4.65432620191606e-5,-5.1491151948029e-8,-0.001969883242927487,-4.6406229230851866e-5,-5.1364075446337285e-8,-0.001969638857557791,-4.627639846031354e-5,-5.124174919757445e-8,-0.001969467008160238,-4.6199420166105754e-5,-5.116961866658035e-8,-0.0019693336914688433,-4.6208627966382286e-5,-5.1181552597747694e-8,-0.001969193371546135,-4.631535486871011e-5,-5.128996338486575e-8,-0.0019690015104308046,-4.650497733936632e-5,-5.148150977961362e-8,-0.001968727504736385,-4.6740821064600386e-5,-5.172064567922468e-8,-0.001968363316252578,-4.697522012612561e-5,-5.196041523031695e-8,-0.00196792440570595,-4.71636765838571e-5,-5.2156492160433425e-8,-0.001967443051877653,-4.727655930735045e-5,-5.227890703313716e-8,-0.0019669575953292872,-4.730437768201357e-5,-5.2317472555509746e-8,-0.0019665022928231123,-4.7256201646844035e-5,-5.228042290007389e-8,-0.0019661009362071376,-4.715377406937989e-5,-5.218873377314962e-8,-0.0019657647779907092,-4.702464970878444e-5,-5.206938544394163e-8,-0.001965493477560509,-4.689660585321579e-5,-5.194979398067257e-8,-0.001965277377825799,-4.6794002474408414e-5,-5.185413345399812e-8,-0.001965099914950498,-4.67357278760477e-5,-5.1801254050097615e-8,-0.0019649396611614903,-4.673397854378611e-5,-5.180348656861776e-8,-0.0019647721014879383,-4.6793187059781656e-5,-5.186563289514447e-8,-0.0019645716558417217,-4.690878647692816e-5,-5.1983771468773974e-8,-0.0019643145874512157,-4.706604455706395e-5,-5.214404907793817e-8,-0.001963983213520618,-4.7239795327600476e-5,-5.232226406608289e-8,-0.0019635711534783046,-4.7396399391850306e-5,-5.248560550378622e-8,-0.0019630881783210172,-4.749923158841316e-5,-5.2597912011238834e-8,-0.0019625620385825687,-4.7517783547080394e-5,-5.262860028092075e-8,-0.001962034600536159,-4.743810866143697e-5,-5.2563034466538445e-8,-0.001961551663459193,-4.7270187530390955e-5,-5.2409958425237556e-8,-0.0019611493437624405,-4.7047867070956564e-5,-5.2201684891901307e-8,-0.0019608425118726406,-4.682012526184868e-5,-5.198578136085175e-8,-0.001960620223510975,-4.663679110534357e-5,-5.1811253235307756e-8,-0.00196044964691645,-4.65343886842311e-5,-5.1714684022350806e-8,-0.001960286244385532,-4.652696232149927e-5,-5.171103424799668e-8,-0.0019600861987816276,-4.660393314075276e-5,-5.1791161198884274e-8,-0.001959817384072231,-4.673447845393499e-5,-5.192571546679343e-8,-0.0019594663672666632,-4.687647620848606e-5,-5.207366237327364e-8,-0.0019590402013480103,-4.69873681531962e-5,-5.219291849091948e-8,-0.0019585630459199917,-4.7034093216261266e-5,-5.2250281015410575e-8,-0.0019580689434451474,-4.699963912862847e-5,-5.222813797470916e-8,-0.001957593098636109,-4.6884855780413277E-05,-5.212650982795257e-8,-0.0019571642607120374,-4.6705755925512453e-5,-5.196056523166988e-8,-0.001956800031936092,-4.648795164335014e-5,-5.175520387715332e-8,-0.0019565055327110657,-4.626040613743492e-5,-5.1538868280151164e-8,-0.001956274664949442,-4.605019885705157e-5,-5.133830575689433e-8,-0.0019560927255029953,-4.587904903303501e-5,-5.117507505063576e-8,-0.001955939273522816,-4.5761480824035993e-5,-5.106372503209461e-8,-0.00195579066288265,-4.570401845100373e-5,-5.101104052329391e-8,-0.001955622211363207,-4.570476038673568e-5,-5.101566680936453e-8,-0.001955410378080181,-4.575298140689403e-5,-5.1067700552761083e-8,-0.0019551355106216866,-4.5828851541139104e-5,-5.114829612455283e-8,-0.0019547856381423576,-4.590392133545704e-5,-5.122995115968192e-8,-0.001954361197611504,-4.594364275569868e-5,-5.127880370114713e-8,-0.001953879361532978,-4.591336545457481e-5,-5.126044894606853e-8,-0.001953375159198017,-4.5788157126795125e-5,-5.114965466945004e-8,-0.0019528960573228693,-4.556404200060815e-5,-5.094156483201756e-8,-0.0019524888638265663,-4.52650121756844e-5,-5.0658773399677315e-8,-0.0019521829510683111,-4.493969555783338e-5,-5.03482415102804e-8,-0.001951978224705543,-4.4646436883604996e-5,-5.006686001308755e-8,-0.0019518449631389671,-4.4433199757164185e-5,-4.9861909053352045e-8,-0.0019517355290165363,-4.43223575013476e-5,-4.9756164208185047e-8,-0.0019516011374687279,-4.430667685873654e-5,-4.9743737900243164e-8,-0.0019514058087092413,-4.4355660121435736e-5,-4.979589561049797e-8,-0.0019511334488388776,-4.442707829644108e-5,-4.987196748279403e-8,-0.0019507882121724506,-4.4478635729643045e-5,-4.993057447552316e-8,-0.0019503903208332868,-4.447687118184344e-5,-4.9938400968221414e-8,-0.0019499696523796678,-4.440237013879302e-5,-4.9875550740711113e-8,-0.0019495587983859016,-4.425144642123595e-5,-4.973750799595954e-8,-0.0019491867583722598,-4.403481674939329e-5,-4.953408613857425e-8,-0.001948874170726926,-4.3773966244990976e-5,-4.928597425302703e-8,-0.0019486306854478142,-4.3496186610003896e-5,-4.901984567298104e-8,-0.0019484545808215287,-4.322941742227304e-5,-4.876319520040075e-8,-0.0019483342448092852,-4.299784164805793e-5,-4.853991498678627e-8,-0.0019482508367361243,-4.281882578092175e-5,-4.8367249272998265E-08,-0.0019481813406516451,-4.2701332047739913e-5,-4.8254265238426306e-8,-0.001948101431884755,-4.2645465612550796e-5,-4.820147285858156e-8,-0.0019479880023605153,-4.2642663695294445e-5,-4.820104258643957e-8,-0.0019478215084132696,-4.267621983914629e-5,-4.823725928348993e-8,-0.0019475884766814169,-4.2722120831818105e-5,-4.8287176766687065e-8,-0.001947284537476418,-4.2750605376743135e-5,-4.832193112023108e-8,-0.0019469179020162252,-4.272943149953421e-5,-4.830978464674593e-8,-0.001946512130701754,-4.2629987351193034e-5,-4.8222103668448865e-8,-0.0019461057920909896,-4.243645483759409e-5,-4.804249139879382e-8,-0.0019457459924259364,-4.2155871844775294e-5,-4.777688442978733e-8,-0.001945474433914433,-4.182357814670306e-5,-4.745909633402526e-8,-0.0019453099923769398,-4.149726260691403e-5,-4.7145127891331156e-8,-0.0019452376149965635,-4.123797713130104e-5,-4.689469161507122e-8,-0.0019452123501192205,-4.108646923628689e-5,-4.67481344270079e-8,-0.0019451775408544185,-4.104846697515171e-5,-4.671199913017461e-8,-0.001945086305653114,-4.10964890190002e-5,-4.67605464329462e-8,-0.00194491498170104,-4.118420798055841e-5,-4.6849415350206084e-8,-0.0019446649566739968,-4.1263439193324884e-5,-4.693190382853436e-8,-0.0019443564891179575,-4.129638690638195e-5,-4.6970831215838533e-8,-0.001944019871009889,-4.126124977537125e-5,-4.694416268183079e-8,-0.0019436874568431314,-4.115267744009283e-5,-4.6845757576426216e-8,-0.0019433878283089455,-4.097933082895468e-5,-4.668329117893592e-8,-0.0019431420227587768,-4.076018683375537e-5,-4.64748293924473e-8,-0.001942961425049852,-4.052037587530838e-5,-4.624478413720799e-8,-0.001942847090506267,-4.028693694379081e-5,-4.6019666043409794e-8,-0.001942790358890472,-4.008483999357206e-5,-4.5824064376144906e-8,-0.0019427745871054582,-3.9933607897037706e-5,-4.5677259981585586e-8,-0.0019427777616891982,-3.984486508728241e-5,-4.559083113158273e-8,-0.0019427755865315058,-3.982107608163827e-5,-4.556748866183424e-8,-0.0019427445679542873,-3.985544668643988e-5,-4.5601049016244416e-8,-0.0019426648249855798,-3.9932722126588916e-5,-4.5677213148583996e-8,-0.0019425225723483325,-4.003067731752825e-5,-4.577491057145826e-8,-0.00194231231186212,-4.0122223590998573e-5,-4.586815250812175e-8,-0.001942038840723702,-4.017825071467646e-5,-4.592859500544757e-8,-0.0019417189403766162,-4.017172995117602e-5,-4.592943591477745e-8,-0.0019413817963929902,-4.0083668653272205e-5,-4.5851299075569445e-8,-0.0019410663758636533,-3.9910612776753746e-5,-4.5689797651230024e-8,-0.0019408138567119492,-3.9671609827259084e-5,-4.546263553447091e-8,-0.0019406546006421536,-3.941021451110704e-5,-4.52117972507066e-8,-0.001940593319235403,-3.918608994782784e-5,-4.499543804327817e-8,-0.0019406012767298,-3.905498590278002e-5,-4.486832358067523e-8,-0.001940623920404477,-3.904542284858823e-5,-4.4859006867683975e-8,-0.0019406025544464632,-3.914639483061919e-5,-4.495769578301747e-8,-0.001940497520876102,-3.931411884703988e-5,-4.512260307194805e-8,-0.001940299698239888,-3.949212761192832e-5,-4.5299254342045724e-8,-0.0019400271696272137,-3.9631546521015266e-5,-4.5440050246729585e-8,-0.0019397134945464904,-3.970249901148748e-5,-4.55153769119164e-8,-0.0019393955892964717,-3.969592038203203e-5,-4.551557626730208e-8,-0.0019391053846128947,-3.961966037424788e-5,-4.544745102453445e-8,-0.0019388656601532564,-3.9492805816283906e-5,-4.532898685003671e-8,-0.0019386887618311728,-3.9340423201373115e-5,-4.518433473733331e-8,-0.0019385768153243493,-3.9189313030825355e-5,-4.5039624737876385e-8,-0.0019385226755074644,-3.9064588188579694e-5,-4.491950007652083e-8,-0.0019385113945777103,-3.89868350713039e-5,-4.4844233237342264e-8,-0.0019385222021650083,-3.8969763524809525e-5,-4.48273957066787e-8,-0.0019385310528990875,-3.9018436577778017e-5,-4.4874176736247263E-08,-0.001938513684450707,-3.912838732750907e-5,-4.498060099930697e-8,-0.0019384488723173468,-3.928589530112374e-5,-4.51338353807561e-8,-0.001938321483040145,-3.946943857740446e-5,-4.531354277085539e-8,-0.0019381250107120861,-3.965222629013153e-5,-4.5494184057548586e-8,-0.0019378633026130548,-3.9805684583894356e-5,-4.5648196322549064e-8,-0.0019375512317700392,-3.990367219926965e-5,-4.574992768613837e-8,-0.0019372141057675222,-3.9927275177831916e-5,-4.5780279834495175e-8,-0.0019368852732491004,-3.987006414845319e-5,-4.573198875575406e-8,-0.0019366009982821448,-3.9743041431457964e-5,-4.561474398462704e-8,-0.001936392008214114,-3.9577268369624826e-5,-4.545806912288991e-8,-0.0019362725887905185,-3.9421116423997146e-5,-4.530885190760244e-8,-0.0019362308367980837,-3.93293215936308e-5,-4.522070434461868e-8,-0.0019362265448863605,-3.934447117414749e-5,-4.5235796012735197e-8,-0.0019362021567699314,-3.947831204143984e-5,-4.5366449130396565e-8,-0.0019361044622756712,-3.9704499044345756e-5,-4.558787687093552e-8,-0.0019359055467726995,-3.9969038024905696e-5,-4.5848165191453386e-8,-0.001935610918476163,-4.0212436952495197e-5,-4.608967212085328e-8,-0.0019352522767100955,-4.0390248298052926e-5,-4.626892936144965e-8,-0.001934872343550989,-4.04826572347339e-5,-4.636602580928481e-8,-0.0019345110162189247,-4.0492973987788945e-5,-4.6383349171738214e-8,-0.0019341974042064007,-4.0440353373262014e-5,-4.633877244453355e-8,-0.00193394745527741,-4.035183976460438e-5,-4.6258113992407355e-8,-0.0019337648831009675,-4.025623586702828e-5,-4.6169223646382756e-8,-0.001933643297940725,-4.018010690860001e-5,-4.6098017218746215e-8,-0.0019335684391845415,-4.014524819687492e-5,-4.606588963420782e-8,-0.0019335202829593439,-4.016691288990378e-5,-4.608791074426844e-8,-0.001933475196842574,-4.025240778009302e-5,-4.617145854048994e-8,-0.0019334084174011334,-4.039999941699849e-5,-4.6315210257224784e-8,-0.0019332970460884604,-4.0598441631085976e-5,-4.6508730328468455e-8,-0.0019331234337040622,-4.0827636234276635e-5,-4.67330881859333e-8,-0.0019328784570221483,-4.1060782189105156e-5,-4.69628242270068e-8,-0.001932564016748744,-4.126806268614148e-5,-4.716934132885776e-8,-0.0019321940512386387,-4.14215942181376e-5,-4.732552837106896e-8,-0.001931793485630655,-4.1500945427768556e-5,-4.741103326315836e-8,-0.0019313948975945483,-4.149824340283206e-5,-4.741729676503009e-8,-0.0019310330346188518,-4.142188515293687e-5,-4.7351395895912765e-8,-0.0019307375352558293,-4.1297801414388954e-5,-4.723760067108958e-8,-0.0019305246932332914,-4.116693684145903e-5,-4.711522060800814e-8,-0.0019303901558369954,-4.107771840039374e-5,-4.7031429532281454e-8,-0.001930305702440573,-4.1073507327231025e-5,-4.70290097302363e-8,-0.001930223661133537,-4.117772149833033e-5,-4.71316652941459e-8,-0.0019300904151773313,-4.1382707713134946e-5,-4.733292449466249e-8,-0.0019298652063116251,-4.1649473063614e-5,-4.7595646288971316e-8,-0.0019295353407003367,-4.192078311450537e-5,-4.786461098057043e-8,-0.0019291195029987889,-4.214178037375372e-5,-4.8086494979264673e-8,-0.0019286581510240075,-4.227740391874418e-5,-4.822680388860586e-8,-0.0019281977027044515,-4.23190945630982e-5,-4.827648982478889e-8,-0.001927776949794641,-4.228093381957044e-5,-4.8248402386580654e-8,-0.0019274200721663662,-4.219051722902683e-5,-4.8168652620736966e-8,-0.001927135772707496,-4.20798850584923e-5,-4.8067954346620734e-8,-0.0019269198332215003,-4.197912027142969e-5,-4.797542280744417e-8,-0.0019267586318278405,-4.1912777277154615e-5,-4.7915023022203665e-8,-0.0019266323173630316,-4.189820026513446e-5,-4.7903834928403336e-8,-0.0019265173637764677,-4.194471819140883e-5,-4.795122144177823e-8,-0.0019263888011234276,-4.205308385953557e-5,-4.805829680961167e-8,-0.0019262225974915343,-4.221501646557592e-5,-4.821751718558146e-8,-0.0019259985568891125,-4.2413183674726635e-5,-4.8412658231367925e-8,-0.0019257037357562376,-4.262227688328076e-5,-4.861977364178274e-8,-0.0019253358507307667,-4.281183412618318e-5,-4.88097763412886e-8,-0.0019249056464002532,-4.295109158693287e-5,-4.895296804974039e-8,-0.00192443696510101,-4.3015405547280085e-5,-4.9025146674251664e-8,-0.001923963576351099,-4.299286159649854e-5,-4.901401418858055e-8,-0.0019235227456985294,-4.288907110417211e-5,-4.892397352513479e-8,-0.0019231466972611288,-4.2728295806226845e-5,-4.8777489495455956e-8,-0.0019228540148536525,-4.2549887097491935e-5,-4.861195243355361e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json new file mode 100644 index 0000000..771149a --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":10000,"numberOfSamples":1000,"samples":[1.9197471616856318e-4,7.996600532056201e-6,-1.2597360486632112e-8,1.923979354906972e-4,8.059544161443208e-6,-1.2601754449986743e-8,1.9274745963100852e-4,8.18217092448731e-6,-1.2612185701149497e-8,1.9301410614298842e-4,8.328459694631899e-6,-1.2625220207854334e-8,1.9320200661086356e-4,8.46367290461882e-6,-1.263746635903232e-8,1.933256574311564e-4,8.557979990756902e-6,-1.264596926377846e-8,1.9340729897750835e-4,8.588749871695277e-6,-1.2648467217789009e-8,1.9347454382165973e-4,8.54234886551231e-6,-1.2643575641672086e-8,1.9355780445299317e-4,8.41580428718647e-6,-1.2630935191527253e-8,1.9368703586457032e-4,8.218144650907273e-6,-1.2611321617725655e-8,1.9388759494511673e-4,7.970728457914735e-6,-1.2586673932584885e-8,1.9417557384287807e-4,7.70570255454025e-6,-1.2559972916060515e-8,1.9455353413614596e-4,7.461994170668981e-6,-1.2534909842557773e-8,1.950079268750979e-4,7.278838435440244e-6,-1.2515320800328438e-8,1.9550946566497787e-4,7.1877009230743185e-6,-1.250443183656935e-8,1.9601716991058025e-4,7.204296880679899e-6,-1.2504049076168112e-8,1.964858622143666e-4,7.322751895738212e-6,-1.2513893072518937e-8,1.9687601817327312e-4,7.513719443070609e-6,-1.2531293180978063e-8,1.9716418145619786e-4,7.727807131336245e-6,-1.255143733487227e-8,1.9735148270881055e-4,7.904972006017888e-6,-1.256828984627858e-8,1.9746717430474582e-4,7.989189307001313e-6,-1.2576107854737417e-8,1.9756414464783983e-4,7.945391162788686e-6,-1.2571208909452543e-8,1.9770522673983343e-4,7.772936988045046e-6,-1.255336219063038e-8,1.9794335851555265e-4,7.508737590816236e-6,-1.2526112219574885e-8,1.9830340643788719e-4,7.216310774252375e-6,-1.2495704511570225e-8,1.9877444051722307e-4,6.9643475770128966e-6,-1.2468991956480241e-8,1.9931605492441463e-4,6.804754497374457e-6,-1.2451273955690413e-8,1.99874367496323e-4,6.7599548302468994e-6,-1.2444993679265321e-8,2.0039900027274713e-4,6.82270849799812e-6,-1.2449629419202722e-8,2.0085428305204736e-4,6.964723431631095e-6,-1.2462470630692901e-8,2.012230129828281e-4,7.147810040913146e-6,-1.2479705950981818e-8,2.015048844233702e-4,7.3331078822919305e-6,-1.2497376827881843e-8,2.0171260728942556e-4,7.4869143007848404e-6,-1.2512018298014086e-8,2.0186784837753266e-4,7.583663846056725e-6,-1.2521002574264202e-8,2.0199788115223623e-4,7.6072954724533325e-6,-1.252268798054521e-8,2.0213287762151582e-4,7.552075776678594e-6,-1.25164799413586e-8,2.023032713093168e-4,7.423389313956485e-6,-1.250287524528341e-8,2.025365492604393e-4,7.238354929979809e-6,-1.2483501654253962e-8,2.0285312487000682e-4,7.025543178481034e-6,-1.2461102098633864e-8,2.032615548180566e-4,6.822697696785637e-6,-1.2439358398961576e-8,2.037542292355152e-4,6.671464949679808e-6,-1.2422433892723618e-8,2.043054648544205e-4,6.609017340781519e-6,-1.241418367286807e-8,2.0487402079284614e-4,6.658061470286973e-6,-1.2417141084804209e-8,2.0541091916908847e-4,6.8183286453880834e-6,-1.2431576848491557e-8,2.0587131297464264e-4,7.063148440915905e-6,-1.2455025250029365e-8,2.0622704282800456e-4,7.343452105811302e-6,-1.2482583077772363e-8,2.064756840198449e-4,7.598950788494315e-6,-1.2508013979414962e-8,2.0664282168786132e-4,7.773572333271332e-6,-1.2525372054527937e-8,2.0677643799377142e-4,7.830732911241555e-6,-1.2530654293509096e-8,2.069346139971509e-4,7.763969732585166e-6,-1.252297208136234e-8,2.0716968071363143e-4,7.599507240572051e-6,-1.2504868071919612e-8,2.075133831394106e-4,7.389324388835024e-6,-1.2481637303243253e-8,2.079680047158014e-4,7.196295440443784e-6,-1.2459822238997104e-8,2.0850678511286473e-4,7.076223630712314e-6,-1.2445361216516968e-8,2.09083353603553e-4,7.063208010991012e-6,-1.2442027977015235e-8,2.0964607359171694e-4,7.163288146015455e-6,-1.245068068918884e-8,2.1015153998119444e-4,7.357300167494584e-6,-1.2469466055778998e-8,2.105729208467013e-4,7.6098914082299795e-6,-1.2494715588623496e-8,2.1090206952705673e-4,7.880059152858419e-6,-1.2522068534104855e-8,2.1114705135521922e-4,8.129688725332927e-6,-1.2547426277362978e-8,2.11327623932954e-4,8.328785948689606e-6,-1.2567558359396523e-8,2.1147063027153733e-4,8.45781981905388e-6,-1.2580371063842255e-8,2.116062170779773e-4,8.508318739735103e-6,-1.2584953522756101e-8,2.1176489219544155e-4,8.482821664273282e-6,-1.2581533889456395e-8,2.1197487908306462e-4,8.394780190546323e-6,-1.2571439050506965e-8,2.1225908578335732e-4,8.268336110121104e-6,-1.2557075378613995e-8,2.1263125815806694e-4,8.137282943263268e-6,-1.2541867403695375e-8,2.1309149641396343e-4,8.042041677157666e-6,-1.2530015745409708e-8,2.1362232923984473e-4,8.023413973770414e-6,-1.2525906367685887e-8,2.141877185477536e-4,8.112834049185048e-6,-1.2533095524318957e-8,2.1473774581068903e-4,8.3210914871919e-6,-1.2553050116063849e-8,2.1522011129794914e-4,8.630080126066386e-6,-1.2584142235542132e-8,2.1559591766686086e-4,8.992908412392393e-6,-1.2621531987775295e-8,2.1585357677476676e-4,9.344915051726786e-6,-1.2658284937238318e-8,2.1601416666211921e-4,9.622593263837225e-6,-1.2687427039128446e-8,2.1612534488552648e-4,9.78287653756447e-6,-1.2704087855205246e-8,2.1624652249650514e-4,9.81514982519467e-6,-1.2706860844017089e-8,2.1643148366610137e-4,9.742398905621779e-6,-1.2697982257149455e-8,2.1671439125053968e-4,9.612686075077394e-6,-1.2682472194826136e-8,2.1710262618754617e-4,9.484942883597433e-6,-1.2666663487275253e-8,2.1757724992220657e-4,9.413689438536168e-6,-1.2656583095773519e-8,2.180998881122663e-4,9.436636301726828e-6,-1.2656579120301334e-8,2.1862349866680082e-4,9.567821662343242e-6,-1.2668481926430359e-8,2.1910382506955763e-4,9.797254291937394e-6,-1.2691451235088495e-8,2.1950852180187367e-4,1.0096209406878957e-5,-1.2722473686840802e-8,2.1982203208259762e-4,1.0425814221374339e-5,-1.2757289563240955e-8,2.2004593990235762e-4,1.0746017377170483e-5,-1.279141904043139e-8,2.2019594725035345e-4,1.1022697089033848e-5,-1.2821004358988786e-8,2.2029723714439854e-4,1.1231954282858246e-5,-1.284332207805951e-8,2.2037976133546005e-4,1.1361792925413278e-5,-1.285697045584737e-8,2.204743050715671e-4,1.1412058566647195e-5,-1.2861837839761607e-8,2.2060942735678435e-4,1.139360836886871e-5,-1.2858986747465736e-8,2.2080886496210573e-4,1.1327297175898568e-5,-1.2850546480647196e-8,2.2108883199633075e-4,1.1242779422350658e-5,-1.2839626876663463e-8,2.2145479727229533e-4,1.117656313941561e-5,-1.2830179748791994e-8,2.218978524119614e-4,1.1168241380550244e-5,-1.2826654765479383e-8,2.223918274118358e-4,1.125368271022084e-5,-1.2833271066266854e-8,2.2289360923823234e-4,1.1454892795233024e-5,-1.2852838922138324e-8,2.2334970247736352e-4,1.1768728623398749e-5,-1.288537714386462e-8,2.2371036423718345e-4,1.2159917386077626e-5,-1.2927189221052759e-8,2.2394786325905398e-4,1.2565129918165497e-5,-1.2971236046903973e-8,2.2407012789687003e-4,1.2910776320851335e-5,-1.3009149058543156e-8,2.2412080512659326e-4,1.3138423398335554e-5,-1.3034156281509835e-8,2.2416403518024246e-4,1.3225258584550226e-5,-1.3043432270151873e-8,2.242617193073924e-4,1.31895428771349e-5,-1.303873108036752e-8,2.244545122747121e-4,1.3080514119203897e-5,-1.302529805681681e-8,2.247533541484739e-4,1.2960154137190002e-5,-1.3009918312410972e-8,2.2514149681588606e-4,1.288542370013457e-5,-1.2999015386017868e-8,2.2558304221404233e-4,1.2896057941767493e-5,-1.2997297157850649e-8,2.2603369392279116e-4,1.3009117176953077e-5,-1.3007061790201875e-8,2.264507770082446e-4,1.3219243737167519e-5,-1.3028087674737915e-8,2.2680097981678127e-4,1.3502917845584759e-5,-1.3057987443448877e-8,2.2706512925085745e-4,1.3825112165154655e-5,-1.3092899943215674e-8,2.2723980182644377e-4,1.4146844760246526e-5,-1.312835960370297e-8,2.2733606659061404e-4,1.4432176615984899e-5,-1.316015072754668e-8,2.2737613010144923e-4,1.4653552288310205e-5,-1.3184975709050629e-8,2.2738889061095103e-4,1.4794967275872633e-5,-1.3200846957566375e-8,2.2740539458427508e-4,1.485298630857986e-5,-1.3207200828708261e-8,2.2745491914188558e-4,1.48361020505556e-5,-1.3204810600297655e-8,2.2756189301271438e-4,1.4763163136429955e-5,-1.3195611648549548e-8,2.2774342945347363e-4,1.4661392768367974e-5,-1.318251654013457e-8,2.2800711646406744e-4,1.4564073938727435e-5,-1.3169225227622847e-8,2.2834878588194946e-4,1.4507553748530596e-5,-1.3159958692847593e-8,2.287503519544513e-4,1.4526782542924386e-5,-1.3158983635572145e-8,2.2917872878590236e-4,1.4648464790645952e-5,-1.3169782666393387e-8,2.2958798770619958e-4,1.4881779191418465e-5,-1.3193861131791164e-8,2.2992738155013117e-4,1.5208892056563145e-5,-1.3229487616666131e-8,2.3015629354228862e-4,1.5580637661667213e-5,-1.3271075564489491e-8,2.3026234150305317e-4,1.5924292688085457e-5,-1.331008459441756e-8,2.3027280889853033e-4,1.6165999528322054e-5,-1.3337725131374554e-8,2.3024916735463958e-4,1.6259694822258185e-5,-1.3348408049319169e-8,2.3026415545918469e-4,1.6206222473384533e-5,-1.334196191813377e-8,2.303737207873722e-4,1.6050930760160185e-5,-1.3323325049974134e-8,2.3059936656605264e-4,1.586282236461781e-5,-1.3300188674521488e-8,2.309273397309413e-4,1.5709080036263402e-5,-1.328019137069129e-8,2.3131987266427655e-4,1.5637160807724585e-5,-1.3268952807786755e-8,2.3172978464227394e-4,1.5668110115491378e-5,-1.3269276372437528e-8,2.3211253167230013e-4,1.579838872190477e-5,-1.3281222326984168e-8,2.3243381968418038e-4,1.6005968044664794e-5,-1.3302645758738719e-8,2.326732628860945e-4,1.6257565449448583e-5,-1.3329918467555854e-8,2.3282524674238283e-4,1.651551762610959e-5,-1.3358697686405669e-8,2.3289788056306504e-4,1.674381866600482e-5,-1.3384673664069943e-8,2.3291052997145164e-4,1.6913063406322665e-5,-1.3404220672953126e-8,2.3289032072172143e-4,1.700401500413197e-5,-1.3414875180816028e-8,2.3286803858424185e-4,1.7009620439693355e-5,-1.3415595856352999e-8,2.328739025738482e-4,1.6935397883075238e-5,-1.3406804390503862e-8,2.3293373693946084e-4,1.6798289595216762e-5,-1.3390246403408823e-8,2.3306590757557672e-4,1.6624355851294292e-5,-1.3368746419574027e-8,2.3327907598190837e-4,1.6445739810291813e-5,-1.334591547674048e-8,2.3357067709120252e-4,1.6297106752196225e-5,-1.3325815392409889e-8,2.3392604926032666e-4,1.621152078481189e-5,-1.3312532903507163e-8,2.3431832644508823e-4,1.6215461539974096e-5,-1.3309583151627188e-8,2.3470981296471905e-4,1.6322593851986297e-5,-1.3319074542987742e-8,2.350563586266793e-4,1.6526652827706943e-5,-1.3340700335972787e-8,2.3531635632917516e-4,1.6795606538324656e-5,-1.3370882993466678e-8,2.3546449597391608e-4,1.7071515543042718e-5,-1.3402687449686616e-8,2.3550651143611578e-4,1.7281479296035646e-5,-1.3427194538859864e-8,2.354860662292638e-4,1.736119067195648e-5,-1.3436455207389577e-8,2.354745423562714e-4,1.7282664410910297e-5,-1.3426879119078932e-8,2.3554413988636483e-4,1.7069422488256228e-5,-1.340100684306105e-8,2.3573843359821594e-4,1.678735137254538e-5,-1.3366380140959267e-8,2.3605794175604995e-4,1.6516440745440828e-5,-1.333226482032832e-8,2.364666128436858e-4,1.6321330128306323e-5,-1.3306309980540544e-8,2.369106704107837e-4,1.6235316784717564e-5,-1.329272307712745e-8,2.373372411284009e-4,1.6259841608278305e-5,-1.3292124623119489e-8,2.3770594596677692e-4,1.6372931299750227e-5,-1.3302373390412671e-8,2.37993246071328e-4,1.6539681380754335e-5,-1.3319651568231e-8,2.3819211939730327e-4,1.6721074059761234e-5,-1.3339438365960858e-8,2.3830961030271236e-4,1.6880231173799742e-5,-1.335727306140373e-8,2.3836375681855868e-4,1.6986636247061285e-5,-1.3369334013755532e-8,2.3838035533166568e-4,1.701905501777484e-5,-1.33728675782703e-8,2.383895323005555e-4,1.6967478698558967e-5,-1.3366467989198284e-8,2.38422070556946e-4,1.6834089647268072e-5,-1.3350197399653409e-8,2.3850556570700744e-4,1.6633066038275236e-5,-1.3325545739040455e-8,2.3866072662191243e-4,1.6388979589520194e-5,-1.32952356240298e-8,2.3889832942241776e-4,1.613376763873816e-5,-1.3262897145540119e-8,2.3921726251748584e-4,1.5902571416136462e-5,-1.3232645062727092e-8,2.3960391772207974e-4,1.5728837101970084e-5,-1.3208572512056224e-8,2.4003306897066437e-4,1.5639090729009958e-5,-1.3194159292205045e-8,2.4047031694471747e-4,1.5647770280759835e-5,-1.3191601366742145e-8,2.408763192909911e-4,1.5752441997243236e-5,-1.320109658813078e-8,2.4121332685415593e-4,1.593012198481269e-5,-1.3220221033409507e-8,2.414543324312317e-4,1.6136500786482835e-5,-1.3243695130072412e-8,2.4159379503856346e-4,1.631092961927605e-5,-1.3263965868818756e-8,2.416563493402631e-4,1.6389819439386743e-5,-1.327294423034196e-8,2.416971351728686e-4,1.6327839253466488e-5,-1.3264745691624821e-8,2.4178793488179986e-4,1.611933231700696e-5,-1.323839068662466e-8,2.4199092390150611e-4,1.580664719687679e-5,-1.3198809867441091e-8,2.4233282522947923e-4,1.546635588883893e-5,-1.315515486800695e-8,2.42795161206397e-4,1.5179028049018296e-5,-1.3117189496490207e-8,2.4332560646111933e-4,1.5000197877739287e-5,-1.3091844309906427e-8,2.4386095630435782e-4,1.494730909943296e-5,-1.3081612462610715e-8,2.443476230301867e-4,1.5004081626133282e-5,-1.3084945993000656e-8,2.447521154769013e-4,1.513382584235183e-5,-1.3097713318885834e-8,2.4506227529865664e-4,1.529290726155764e-5,-1.3114741963102495e-8,2.4528352222681816e-4,1.5440210476210758e-5,-1.3130971246521739e-8,2.454337577216843e-4,1.554235342838633e-5,-1.3142157207141877e-8,2.4553879145722154e-4,1.5576059836117717e-5,-1.3145250706278301e-8,2.456286535961741e-4,1.5529165859651303e-5,-1.313858102750454e-8,2.4573440156436537e-4,1.5401067537156352e-5,-1.312192399297445e-8,2.4588495016140917e-4,1.5202739157127264e-5,-1.3096479904399723e-8,2.4610367254958987e-4,1.4956012999883382e-5,-1.3064759078539774e-8,2.4640490122437197e-4,1.4691580503364029e-5,-1.3030343464314749e-8,2.467909300514352e-4,1.444531172938255e-5,-1.299749108332309e-8,2.472503716788958e-4,1.4252978327617077e-5,-1.2970574858005676e-8,2.4775861981413225e-4,1.4143991993889015e-5,-1.2953383025503955e-8,2.482808292580495e-4,1.4135196216785739e-5,-1.2948356913590524e-8,2.4877732410946555e-4,1.4225995061342692e-5,-1.295589775406787e-8,2.492108317402965e-4,1.439598151292376e-5,-1.297390984283666e-8,2.495546496005041e-4,1.4605934664835293e-5,-1.2997753852338253e-8,2.4980058126312243e-4,1.4802976706468473e-5,-1.3020791083393111e-8,2.499648122532091e-4,1.4930522578149964e-5,-1.3035648974352602e-8,2.500889719183307e-4,1.4942625206491755e-5,-1.3036141981384923e-8,2.502332948927713e-4,1.4819937637970325e-5,-1.301942657528763e-8,2.5046053996871437e-4,1.458121681939785e-5,-1.2987549154608683e-8,2.508142835955966e-4,1.4282610184457833e-5,-1.294739872783118e-8,2.513011655620707e-4,1.4000896174505066e-5,-1.2908626141535389e-8,2.5188749805877945e-4,1.3806467779425598e-5,-1.288027326783674e-8,2.5251290861910285e-4,1.3739666020847875e-5,-1.286777210466249e-8,2.531129543478528e-4,1.3801980509944972e-5,-1.2871727408598455e-8,2.5363851477171943e-4,1.3963248403024858e-5,-1.288867324663838e-8,2.5406475771490327e-4,1.4177059797621997e-5,-1.2912910633960826e-8,2.543902585935145e-4,1.4395467555977205e-5,-1.2938351134914312e-8,2.5463093937902145e-4,1.457846819591566e-5,-1.295977796036463e-8,2.54813136638039e-4,1.4698160028561238e-5,-1.2973461632588474e-8,2.54967981581639e-4,1.4739503755468211e-5,-1.2977324579518188e-8,2.551274405562864e-4,1.4699654562096109e-5,-1.2970877284779953e-8,2.5532142348084824e-4,1.4587027197628657e-5,-1.2955077061468487e-8,2.5557518672666003e-4,1.4420380583572636e-5,-1.2932175481281603e-8,2.5590650103593743e-4,1.4227567224019883e-5,-1.2905548350362233e-8,2.5632253366152845e-4,1.4043212860365394e-5,-1.287943866108471e-8,2.568170361656435e-4,1.3904585536052271e-5,-1.285851192094646e-8,2.5736901125437294e-4,1.384542362248093e-5,-1.2847155402873307e-8,2.5794421239109947e-4,1.388843946076878e-5,-1.2848556465930347e-8,2.5850035030317047e-4,1.403829277109537e-5,-1.2863749847957166e-8,2.589956924459188e-4,1.4277505943607658e-5,-1.2890953907157057e-8,2.5939924357184515e-4,1.4567459494134127e-5,-1.2925525776831505e-8,2.596996993209261e-4,1.4855178454192225e-5,-1.2960705554380696e-8,2.5991041763439313e-4,1.5084813281586183e-5,-1.2989066766874659e-8,2.6006856585053105e-4,1.5211326349834672e-5,-1.3004361087109885e-8,2.602278725687631e-4,1.5213126500508729e-5,-1.3003294012197764e-8,2.6044583194747623e-4,1.5100107540589441e-5,-1.2986715711409487e-8,2.607678954750293e-4,1.4913817381501574e-5,-1.2959760458590743e-8,2.6121309337834975e-4,1.471789554231206e-5,-1.2930675613196354e-8,2.617666739936158e-4,1.4580147819581488e-5,-1.2908507750034461e-8,2.623838952785086e-4,1.4551998820653167e-5,-1.2900372867353652e-8,2.6300436611455946e-4,1.465364176688067e-5,-1.2909389577639032e-8,2.6357084573760297e-4,1.4871017273617807e-5,-1.293411963262422e-8,2.640443869669923e-4,1.5164543154651873e-5,-1.2969586613798102e-8,2.64410737769705e-4,1.548385098723045e-5,-1.3009177614068972e-8,2.6467821443590807e-4,1.5781554620764703e-5,-1.304650817055167e-8,2.648707916531887e-4,1.602193715049497e-5,-1.3076659266674922e-8,2.650204220774552e-4,1.6184189121099728e-5,-1.309668323525758e-8,0.00026516090400317593,1.626199634794566e-5,-1.3105583832666333e-8,2.653238016446657e-4,1.626157432670227e-5,-1.3104045518856175e-8,2.6553584872296177e-4,1.619953400725645e-5,-1.3094120073806924e-8,2.6581694404772865e-4,1.6101034287601604e-5,-1.3078966785871532e-8,2.6617803512994057e-4,1.599792643257314e-5,-1.3062635061321467e-8,2.666186743112128e-4,1.5926127147520803e-5,-1.3049789195619948e-8,2.671247177812508e-4,1.5921303481340893e-5,-1.3045222202262528e-8,2.6766743265218185e-4,1.6012313493671894e-5,-1.3053032308258361e-8,2.682058449019524e-4,1.6212993883764293e-5,-1.3075494404843321e-8,2.6869381754198406e-4,1.6514662380160417e-5,-1.3111934310112453e-8,2.690915392547794e-4,1.688312459406304e-5,-1.3158158531168263e-8,2.693782808806831e-4,1.726356887424719e-5,-1.3206971608799833e-8,2.695612194819721e-4,1.7593764377538284e-5,-1.3249899145305468e-8,2.696757969225932e-4,1.7821710710339604e-5,-1.3279603194733367e-8,2.697766262792751e-4,1.7921174890309415e-5,-1.3292069257397106e-8,2.699221571586634e-4,1.7899381168918985e-5,-1.3287759748585721e-8,2.701585140051222e-4,1.7794662659770487e-5,-1.3271427248333769e-8,2.7050743193193414e-4,1.7665574219650932e-5,-1.3250774476406711e-8,2.70961263500747e-4,1.7575149467220522e-5,-1.3234415117476824e-8,2.714859046544607e-4,1.7574737909080554e-5,-1.3229680863399421e-8,2.7203052331977687e-4,1.769170100835547e-5,-1.324083414757745e-8,2.7254117585821244e-4,1.7924189075479015e-5,-1.3268167506586092e-8,2.729741997691505e-4,1.8244128847031433e-5,-1.3308232751599827e-8,2.733054105239225e-4,1.860683481743521e-5,-1.335506308671976e-8,2.7353289682521516e-4,1.896345349760831e-5,-1.3401893664246537E-08,2.73673842637392e-4,1.9271996265799993e-5,-1.3442759869942829e-8,2.737578282615282e-4,1.9504213337008058e-5,-1.3473535503050086e-8,2.738194967147241e-4,1.9647848480923535e-5,-1.3492301040760689e-8,2.7389256852830313e-4,1.9705491001702175e-5,-1.3499197079042159e-8,2.740058704701865e-4,1.9691777654711647e-5,-1.3496023246278775e-8,2.741810262902575e-4,1.9630334079578346e-5,-1.3485807494797274e-8,2.744310131178127e-4,1.9551058078948304e-5,-1.347245824705066e-8,2.747588655876082e-4,1.948759434125028e-5,-1.3460484076347776e-8,2.7515620852405575e-4,1.9474357175009086e-5,-1.3454669802832967e-8,2.7560192124283077e-4,1.954221941430565e-5,-1.3459536895858992e-8,2.760620815654129e-4,1.9712188518429024e-5,-1.3478446229307413e-8,2.764931140341487e-4,1.998747860898367e-5,-1.3512381587099931e-8,2.768499825458415e-4,2.0346447047745347e-5,-1.3558791588758346e-8,2.7709934818909317e-4,2.0740975236487897e-5,-1.3611211001438215e-8,2.7723376707050325e-4,2.1104902391710272e-5,-1.3660381144345922e-8,2.7727951721184677e-4,2.1372977512600064e-5,-1.3696942301516698e-8,2.7729156569639065e-4,2.150364337470411e-5,-1.371469511192883e-8,2.7733590146886866e-4,2.1494482605572527e-5,-1.3712813986364758e-8,2.7746730910535865e-4,2.1382407878183956e-5,-1.3695935779833347e-8,2.777129170467314e-4,2.1229571564400812e-5,-1.3672319050985458e-8,2.7806720281447627e-4,2.1102980963536406e-5,-1.3651166775522754e-8,2.7849753778370835e-4,2.105639774177976e-5,-1.3640203101975407e-8,2.7895571606205595e-4,2.1119312740397868e-5,-1.36440855384151e-8,2.7939082054513723e-4,2.129380639205303e-5,-1.3663777942921247e-8,2.797602560487331e-4,2.155785003144518e-5,-1.3696778046641539e-8,2.8003725820557e-4,2.1872858482824725e-5,-1.3738005196123418e-8,2.802142004107094e-4,2.219328394309847e-5,-1.3781099702460829e-8,2.8030175709160225e-4,2.2476143948988695e-5,-1.381982555271776e-8,2.8032472939190016e-4,2.268859947612066e-5,-1.3849251125167231e-8,2.803159812312574e-4,2.2812371570131774e-5,-1.386647093141835e-8,2.803101183459111e-4,2.2844791364820303e-5,-1.387080182051307e-8,2.8033821087907477e-4,2.2797146171930603e-5,-1.3863552789390385e-8,2.8042420340903043e-4,2.2691458727297488e-5,-1.3847561307081722e-8,2.8058292600206835e-4,2.2556824850266946e-5,-1.3826691726476474e-8,2.8081916298474405e-4,2.2425953925453616e-5,-1.3805403994071266e-8,2.8112721903985157e-4,2.2331951025042324e-5,-1.3788383591687185e-8,2.8149066344888076e-4,2.2304951530066296e-5,-1.3780134438421739e-8,2.8188238547674434e-4,2.2367947560152177e-5,-1.3784386060479597e-8,2.822658721965546e-4,2.2531246589409013e-5,-1.380320444288144e-8,2.8259936195518845e-4,2.278597036190299e-5,-1.38358812243578e-8,2.828444569445365e-4,2.3098866508920356e-5,-1.3877999412904191e-8,2.82979105364523e-4,2.341279564136978e-5,-1.3921401485040897e-8,2.8301103748081484e-4,2.3657751771110462e-5,-1.3955814384309308e-8,2.8298340770177647e-4,2.37731328817469e-5,-1.3972176264270338e-8,2.8296484207766603e-4,2.3733029889624773e-5,-1.3966353021702428e-8,2.830249037760498e-4,2.3559828091315065e-5,-1.3941085550751729e-8,2.832073180871705e-4,2.331632681640619e-5,-1.3904875495648811e-8,2.8351576155621184e-4,2.308077284889224e-5,-1.3868553787955135e-8,2.8391769853862014e-4,2.2919547763551398e-5,-1.384157822144315e-8,2.8436019434869387e-4,2.287017449835268e-5,-1.3829694080640847e-8,2.847876469600927e-4,2.2937814065198065e-5,-1.3834319348602738e-8,2.8515485284144533e-4,2.3101223801610495e-5,-1.3853146215244e-8,2.85433793371567e-4,2.332264590269975e-5,-1.3881308460203237e-8,2.856153143340677e-4,2.3557815709961442e-5,-1.3912679492992264e-8,2.857074693224336e-4,2.3764383273789843e-5,-1.3941085356826256e-8,2.8573186713930584e-4,2.390828726211465e-5,-1.3961325891680267e-8,2.857188696819171e-4,2.39679560926046e-5,-1.3969911360196299e-8,2.8570231452007376e-4,2.3936257400670855e-5,-1.3965439487283113e-8,2.857144182944666e-4,2.382028199606721e-5,-1.394860030825303e-8,2.8578147687363805e-4,2.3639260037550102e-5,-1.3921869960500952e-8,2.8592084201393037e-4,2.342114432945347e-5,-1.3889012634409748e-8,2.8613931356911184e-4,2.3198585473751224e-5,-1.3854531958188717e-8,2.864327166543551e-4,2.3004883616430312e-5,-1.3823159470958645e-8,2.867863494363946e-4,2.2870125806672398e-5,-1.3799380523453057e-8,2.8717609388622425e-4,2.2817452101605205e-5,-1.378693317459741e-8,2.8757018441867614e-4,2.2859200077940465e-5,-1.378819562942302e-8,2.8793216925267906e-4,2.2992674449651844e-5,-1.3803413833910311e-8,2.8822619040308e-4,2.3196048522297792e-5,-1.3829891060439484e-8,2.8842548394305867e-4,2.3426397377221117e-5,-1.386152544402009e-8,2.885234854253173e-4,2.362330839766609e-5,-1.3889296541301406e-8,2.885438986592403e-4,2.3721722641275258e-5,-1.3903263102308176e-8,2.885424114376653e-4,2.3674183477913317e-5,-1.3896003696172715e-8,2.885929118709168e-4,2.3474313471584593e-5,-1.3866152311867126e-8,2.8875979009874574e-4,2.316637368653028e-5,-1.3819777847051538e-8,2.890704395776163e-4,2.283074746827438e-5,-1.3768264842029872e-8,2.895049885128943e-4,2.2551813469805068e-5,-1.3723757443181604e-8,2.900082669629545e-4,2.2387357101861408e-5,-1.3694865214262721e-8,2.9051374253208817e-4,2.235489612947439e-5,-1.36846867449533e-8,2.909649021340734e-4,2.2436103025525936e-5,-1.3691271872221072e-8,2.9132650488845045e-4,2.2590621258034392e-5,-1.3709370985045623e-8,2.9158637691061105e-4,2.2770429252790272e-5,-1.3732329579321405e-8,2.917517969683068e-4,2.2930448877807925e-5,-1.3753577653967498e-8,2.9184401188628566e-4,2.303489006955536e-5,-1.3767628184703838e-8,2.918927671925494e-4,2.3060445344766418e-5,-1.3770682898745772e-8,2.919314014291164e-4,2.299749274559909e-5,-1.3760937852867262e-8,2.9199247847638013e-4,2.2849926468667013e-5,-1.3738629102849638e-8,2.921039092862608e-4,2.2633834466347406e-5,-1.370584503210565e-8,2.92285666948327e-4,2.2375057960451114e-5,-1.3666144851793793e-8,2.925473850976914e-4,2.2105676829510934e-5,-1.3624037426111123e-8,2.9288716836903646e-4,2.185972836237773e-5,-1.3584395520403735e-8,2.93291734444017e-4,2.1668667070356885e-5,-1.355186975838904e-8,2.937378250344291e-4,2.1556973898122735e-5,-1.3530315087571015e-8,2.941947974500097e-4,2.1538210800188506e-5,-1.3522214675142932e-8,2.9462828965697827e-4,2.161178421989162e-5,-1.3528102494893166e-8,2.950049836659742e-4,2.176062612107966e-5,-1.3546028771640402e-8,2.9529877895283186e-4,2.1950341406551685e-5,-1.3571220417731373e-8,2.95498425036084e-4,2.2131299035723218e-5,-1.3596256341667975e-8,2.956153580837951e-4,2.22458472466366e-5,-1.361215968484941e-8,2.9568840667843486e-4,2.224225736534045e-5,-1.3610641296881544e-8,2.957800686939963e-4,2.2093977823393965e-5,-1.3587181550703598e-8,2.9595999348482825e-4,2.181678085271199e-5,-1.3543713834794471e-8,2.9627849161117025e-4,2.1471574018712877e-5,-1.3489060449153417e-8,2.9674319322068856e-4,2.1145294614123724e-5,-1.343609251827474e-8,2.9731425733706953e-4,2.09172161107864e-5,-1.3396774613550436e-8,2.9792187015270356e-4,2.082994835974585e-5,-1.3377886272534408e-8,2.984942122206886e-4,2.0880413673918396e-5,-1.3379586077781747e-8,2.989796522647844e-4,2.1030612573302552e-5,-1.3396809617098212e-8,2.993552928593664e-4,2.1226817991504233e-5,-1.3421929704689853e-8,2.9962420917402626e-4,2.141632957853267e-5,-1.3447160232838052e-8,2.998076048709863e-4,2.155742331817498e-5,-1.3466074608348756e-8,2.999366508951447e-4,2.162322261659597e-5,-1.3474303011588651e-8,3.0004605342871587e-4,2.160194083120627e-5,-1.3469704117491014e-8,3.001694758979349e-4,2.1495566477339442e-5,-1.3452259987949643e-8,3.003361714790454e-4,2.131801033581268e-5,-1.34238210598226e-8,3.00568250260884e-4,2.109291783629834e-5,-1.3387751649168571e-8,3.0087835205456256e-4,2.0850953582104578e-5,-1.3348491679679161e-8,3.012678716217725e-4,2.062624812724149e-5,-1.3311032550608233e-8,3.0172620046434173e-4,2.045193589878053e-5,-1.3280308792564854e-8,3.0223147737772435e-4,2.0355180263715515e-5,-1.3260534503027968e-8,3.027530905670879e-4,2.03523675046193e-5,-1.3254528922034592e-8,3.0325589739471393e-4,2.0445234386801097e-5,-1.326309141038214e-8,3.0370584098537583e-4,2.061873537337817e-5,-1.3284535301274032e-8,3.0407635475241393e-4,2.084132023298335e-5,-1.3314523112149486e-8,3.043548220950259e-4,2.106807932262644e-5,-1.334635951759101e-8,3.0454817712909907e-4,2.1247259597402573e-5,-1.337190847136496e-8,3.0468606841306306e-4,2.1330590886984806e-5,-1.338324729373875e-8,3.048190993710789e-4,2.1286814653441683e-5,-1.337492842426596e-8,3.0500947292813136e-4,2.1115405047104646e-5,-1.3346293728374482e-8,3.0531334240780847e-4,2.0854333144826318e-5,-1.330280661991811e-8,3.0575933228971686e-4,2.057446009779354e-5,-1.3255246543245369e-8,3.063336126043048e-4,2.035786012500672e-5,-1.3216390908366007e-8,3.0698195437051866e-4,2.0267933422058764e-5,-1.3196404367399528e-8,3.076297906607286e-4,2.0326989761099988e-5,-1.3199302777510673e-8,3.0820929098613465e-4,2.051301152374637e-5,-1.3222284594361782e-8,3.086790667643346e-4,2.0774250916837253e-5,-1.3257795354211066e-8,3.0902959140693113e-4,2.1050411845724763e-5,-1.3296685507824527e-8,3.0927719251130383e-4,2.1289582840270976e-5,-1.3330825505471842e-8,3.0945357058928e-4,2.145674944124067e-5,-1.33545105445674e-8,3.095961699201846e-4,2.153531284308726e-5,-1.3364818313685573e-8,3.0974146708267824e-4,2.152488868920895e-5,-1.3361368767381744e-8,3.0992097203242546e-4,2.1438017800151246e-5,-1.3345858365688848e-8,3.1015887202686857e-4,2.1297039816659653e-5,-1.3321563576426557e-8,3.1047036154725256e-4,2.1131275414374563e-5,-1.3292871575557973e-8,3.1086020309551777e-4,2.0974113615666323e-5,-1.3264820449894448e-8,0.00031132159469673937,2.0859458460963544e-5,-1.3242589706398116e-8,3.118358892299663e-4,2.08172018406579e-5,-1.3230876462418405e-8,3.123739556176808e-4,2.0867961619606607e-5,-1.3233145002595053e-8,3.1289980273878425e-4,2.1017999708571363e-5,-1.3250835029635484e-8,3.133765322075633e-4,2.1255710514705023e-5,-1.3282711917019378e-8,3.1377389441996034e-4,2.1551170659549085e-5,-1.332461455740315e-8,3.1407592571305155e-4,2.1859774047728385e-5,-1.3369828669154369e-8,3.1428671803730246e-4,2.212997996013805e-5,-1.3410177045357869e-8,3.14432506824964e-4,2.2314131680739853e-5,-1.3437721540724634e-8,3.1455876362506394e-4,2.2380463429616143e-5,-1.3446783871977407e-8,3.1472170043465105e-4,2.2323641852085563e-5,-1.3435813847370838e-8,3.1497476110345693e-4,2.217044112756572e-5,-1.3408494160108003e-8,3.153526234579617e-4,2.1976994096751363e-5,-1.337345682081832e-8,3.1585774444304715e-4,2.1815602165497123e-5,-1.3342262745022897e-8,3.1645594131746787e-4,2.1753230588716412e-5,-1.332596859353312e-8,3.170852855440563e-4,2.1829339986754936e-5,-1.3331486306519194e-8,3.1767609064744373e-4,2.204329336795916e-5,-1.335938578246327e-8,3.1817307131503856e-4,2.2357437282565592e-5,-1.3404182809004631e-8,3.185496252597622e-4,2.2713150253212193e-5,-1.3456770258106373e-8,3.188097318692035e-4,2.305068096859074e-5,-1.350756753269062e-8,3.1898017607109944e-4,2.3324049974074164e-5,-1.3548973772346303e-8,3.1909924742474843e-4,2.3507561072834535e-5,-1.3576520061523686e-8,3.192068961684871e-4,2.359541331330978e-5,-1.3588911123510958e-8,3.1933831976116504e-4,2.3597783076813762e-5,-1.358746123971623e-8,3.1952065880791903e-4,2.3536160980096142e-5,-1.3575362908229614e-8,3.19771579080949e-4,2.3439311888661372e-5,-1.3557025218592592e-8,3.200985885643759e-4,2.3340011786561243e-5,-1.3537543756519094e-8,3.2049846336595103e-4,2.3272031254568778e-5,-1.3522245412330314e-8,3.2095680118528186e-4,2.3266656684082567e-5,-1.3516194501257755e-8,3.214482960990994e-4,2.3348264536126095e-5,-1.3523546070473995e-8,3.219387035953197e-4,2.352905494166589e-5,-1.3546710031825095e-8,3.2238945173181284e-4,2.3803973484541637e-5,-1.3585453917150966e-8,3.2276517284783867e-4,2.414782235178386e-5,-1.3636274656717374e-8,3.2304300787259485e-4,2.4516917684648338e-5,-1.369247871891746e-8,3.2322093588827404e-4,2.4856694790520883e-5,-1.374527463790208e-8,3.2332167991338466e-4,2.5114409674883268e-5,-1.3785796286515207e-8,3.233897052011945e-4,2.525357146846435e-5,-1.3807516666649438e-8,3.2348120921461983e-4,2.5265406266578555e-5,-1.3808261001094046e-8,3.2364963922767976e-4,2.5173284625345988e-5,-1.3791120413398418e-8,3.2393091613960477e-4,2.5028248522414485e-5,-1.3763924450587002e-8,3.243327110819311e-4,2.489645279708152e-5,-1.3737355303383892e-8,3.2483114194985555e-4,2.4841661933600615e-5,-1.3722151158493351e-8,3.253764637315329e-4,2.4907661106982096e-5,-1.3726145974744325e-8,3.2590667505080653e-4,2.5106163518978407e-5,-1.3752074004335538e-8,3.263648743232834e-4,2.5414592771149465e-5,-1.3796943801410434e-8,3.267142644419916e-4,2.5784562274762126e-5,-1.3853232512079237e-8,3.2694560655390203e-4,2.6157379978950974e-5,-1.3911368702242648e-8,3.2707552207375036e-4,2.64802029079398e-5,-1.3962446344578679e-8,3.2713809920406574e-4,2.6717260951139974e-5,-1.4000191368277358e-8,3.2717430412455535e-4,2.685395991046812e-5,-1.4021757723105099e-8,3.272230250199076e-4,2.6895095773412356e-5,-1.4027518182301305e-8,3.273154328546555e-4,2.6859988741622723e-5,-1.4020303863838187e-8,3.27472427946398e-4,2.6777052624059808e-5,-1.4004517409235265e-8,3.2770404819257206e-4,2.667917357422416e-5,-1.3985374637999391e-8,3.2800968800751206e-4,2.6600135622202087e-5,-1.396833964272351e-8,3.283784197698704e-4,2.65715822213231e-5,-1.3958675851617953e-8,3.2878934377281676e-4,2.661975357857392e-5,-1.3960963251046796e-8,3.2921252136175277e-4,2.6761429111553565e-5,-1.397844020247438e-8,3.2961152402647006e-4,2.699907821559547e-5,-1.4012129808211943e-8,3.29948753915105e-4,2.7316263206531952e-5,-1.4059921868231094e-8,3.3019401009220286e-4,2.7675690266479282e-5,-1.4116060189696021e-8,3.303348983515174e-4,2.8023052525526852e-5,-1.417164175112956e-8,3.303851664433875e-4,2.8298564869411255e-5,-1.4216501609523993e-8,3.303858174704456e-4,2.845434313568276e-5,-1.4242167403395092e-8,3.303959416014983e-4,2.847131185450436e-5,-1.424477933710207e-8,3.304753311960585e-4,2.8367701265917583e-5,-1.4226626167552076e-8,3.3066574499633107e-4,2.8194592527739406e-5,-1.4195561924860455e-8,3.3097847333721307e-4,2.8020371048836455e-5,-1.4162617817120332e-8,3.3139229136450047e-4,2.7910733393913838e-5,-1.4138840614943994e-8,3.318610576038761e-4,2.7911418740544573e-5,-1.4132437583694847e-8,3.32327158660616e-4,2.8038257552148033e-5,-1.4146944421067845e-8,3.3273630146328536e-4,2.8275956095937735e-5,-1.4180721826563061e-8,3.3304982043797914e-4,2.8584590280257757e-5,-1.4227750741366778e-8,3.332518772704476e-4,2.8911198090895583e-5,-1.4279413650778645e-8,3.3335044303321585e-4,2.9203016014443303e-5,-1.4326720121414798e-8,3.3337264600420897e-4,2.9418844303718548e-5,-1.4362340255230543e-8,3.333565716870711e-4,2.953593528593423e-5,-1.438192328577023e-8,3.333423100299153e-4,2.955156240787833e-5,-1.4384490907506754e-8,3.333646227280616e-4,2.9480245799448394e-5,-1.4372041376989542e-8,3.3344841055820307e-4,2.9348582447400512e-5,-1.434870041016347e-8,3.3360692534264394e-4,2.9189588504290738e-5,-1.4319770705147037e-8,3.338418939605668e-4,2.903780052882538e-5,-1.429092220642219e-8,3.341445478842576e-4,2.8925502238673784e-5,-1.4267598983776846e-8,3.3449686902692956e-4,2.8879716510260736e-5,-1.4254567192028621e-8,3.34872893630502e-4,2.8919305085978387e-5,-1.4255452413328958e-8,3.3524046998712566e-4,2.905162633610626e-5,-1.4272125495191893e-8,3.3556438983591447e-4,2.926868042533546e-5,-1.4303906971243346e-8,3.358120415655983e-4,2.9543700862908523e-5,-1.4346787820191492e-8,3.359620973953016e-4,2.9830621885824582e-5,-1.4393165436296007e-8,3.3601476557872876e-4,3.0069847654572008e-5,-1.4432765793470925e-8,3.3599911919222826e-4,3.020259394749606e-5,-1.4455159337401374e-8,3.3597110300592314e-4,3.019141034190686e-5,-1.4453385307179457e-8,3.35998526488256e-4,3.00380349093956e-5,-1.4427081304578546e-8,3.3613729850181856e-4,2.9787423935761663e-5,-1.4383225010504009e-8,3.3641053011372276e-4,2.9513350056419022e-5,-1.4333808242876725e-8,3.368014006431015e-4,2.9292449987817804e-5,-1.4291641185111276e-8,3.3726185452744576e-4,2.9179980574871958e-5,-1.4266408426820145e-8,3.377303740186198e-4,2.9197037823386694e-5,-1.4262469364142498e-8,3.3814986945613203e-4,2.9330730888683372e-5,-1.427863436126763e-8,3.3848010158714516e-4,2.9543115154846164e-5,-1.4309336642064932e-8,3.38703273259897e-4,2.9783603206552747e-5,-1.4346471770152776e-8,3.388238715787891e-4,3.0001002317025725e-5,-1.4381352417660723e-8,3.388645512106792e-4,3.015313826145052e-5,-1.4406430035573901e-8,3.388596992978482e-4,3.0213214891368453e-5,-1.441656210821404e-8,3.388480896868653e-4,3.0172579589435465e-5,-1.4409671063513486e-8,3.3886595201610624e-4,3.0040010984943417e-5,-1.4386745775937594e-8,3.389415616773652e-4,2.983826465857231e-5,-1.435129353309962e-8,3.3909197448769624e-4,2.9599024245251944e-5,-1.4308467177209232e-8,3.393219732788287e-4,2.935743690567301e-5,-1.4264115645959442e-8,3.396247872186201e-4,2.9147198599977515e-5,-1.4223960274082391e-8,3.3998384944594585e-4,2.8996680396776103e-5,-1.419298232822601e-8,3.4037497978542483e-4,2.8925994092867653e-5,-1.4174970094013113e-8,3.4076876816749476e-4,2.8944576739562157e-5,-1.4172101451461987e-8,3.4113333363185183e-4,2.9048903134653624e-5,-1.4184452613283302e-8,3.4143806830900614e-4,2.9220259014859665e-5,-1.4209426481068721e-8,3.416592313159679e-4,2.942335957385573e-5,-1.4241300071719586e-8,3.4178768959361645e-4,2.9607879560626548e-5,-1.4271351102299056e-8,3.418373350901813e-4,2.971582378240197e-5,-1.4289150939638257e-8,3.4184996084014505e-4,2.9696727082961728e-5,-1.4285356690807156e-8,3.418902633601011e-4,2.952827110856552e-5,-1.425546855762454e-8,3.420270707706498e-4,2.9232745927517535e-5,-1.4202771104298555e-8,3.4230607491550166e-4,2.8876464783064984e-5,-1.4138250014917669e-8,3.4272891522547444e-4,2.8547270391760742e-5,-1.4076783978948293e-8,3.432521860159393e-4,2.8320914566404532e-5,-1.4031512125887654e-8,3.4380643577638096e-4,2.8235399587572567e-5,-1.4009518407800017e-8,3.4432227839255926e-4,2.8284922903914585e-5,-1.4010681330376893e-8,3.4474989405392577e-4,2.8430706232186193e-5,-1.4029244458375631e-8,3.450667007921132e-4,2.8618389049455682e-5,-1.405649452639386e-8,3.4527564357985356e-4,2.879355388007985e-5,-1.4083250375345564e-8,3.453987654829163e-4,2.8912049121438285e-5,-1.4101646097180218e-8,3.45469585268103e-4,2.894525815503267e-5,-1.4106194425210915e-8,3.4552604642457406e-4,2.8881730901118583e-5,-1.4094281874326899e-8,3.4560455047242703e-4,2.8726431535401165e-5,-1.4066215283106948e-8,3.457351529958053e-4,2.84982490045257e-5,-1.4024875511406945e-8,3.459380666037131e-4,2.8226171437823553e-5,-1.397505116091795e-8,3.462216637718113e-4,2.794459723979762e-5,-1.3922581182171141e-8,3.4658209986642525e-4,2.7688322235778394e-5,-1.3873458405560078e-8,3.4700449561030034e-4,2.748781270498401e-5,-1.3833031101689292e-8,3.474653304988083e-4,2.7365322208472776e-5,-1.3805386540778746e-8,3.479355692431911e-4,2.7332084280176915e-5,-1.3792904236856692e-8,3.483841987506852e-4,2.738651159118678e-5,-1.3795909548384521e-8,3.48782076015223e-4,2.7513276120753096e-5,-1.3812375954175199e-8,3.4910623716508923e-4,2.768327317176719e-5,-1.3837706596348546e-8,3.493450066374296e-4,2.785497909947437e-5,-1.3864767635512509e-8,3.4950380428156456e-4,2.7978582520697178e-5,-1.388452258098352e-8,3.496101796449104e-4,2.800470747307293e-5,-1.3887648902006153e-8,3.4971470295323565e-4,2.7898579782032046e-5,-1.3867255990212172e-8,3.498829672228969e-4,2.7657103890016168e-5,-1.3822133605209417e-8,3.5017591926531956e-4,2.7320571946380355e-5,-1.375894735333673e-8,3.5062370726759935e-4,2.6967510508779796e-5,-1.3691352108885298e-8,3.512076836751679e-4,2.668829415482261e-5,-1.3635359280006073e-8,3.518645594543916e-4,2.6549168451208284e-5,-1.3603044848274974e-8,3.525120860381075e-4,2.6567976763254272e-5,-1.359825241655584e-8,3.530801471377777e-4,2.671440633051558e-5,-1.3616465703002289e-8,3.5353016455276417e-4,2.692942938290615e-5,-1.3647971513994665e-8,3.538577002956241e-4,2.7148881753446637e-5,-1.3681795510084634e-8,3.540840771794443e-4,2.7320151877578618e-5,-1.3708567939664234e-8,3.542449634789241e-4,2.740961864282937e-5,-1.372191839944505e-8,3.543805993034693e-4,2.7403434203548572e-5,-1.3718799059739425e-8,3.545289983413223e-4,2.730498627401825e-5,-1.3699233288566783e-8,3.547216624954893e-4,2.7131303055044464e-5,-1.366581028187246e-8,3.5498087228620824e-4,2.690928730173587e-5,-1.3623050830270064e-8,3.5531797095255416e-4,2.6671814970846222e-5,-1.3576675347345746e-8,3.557325408326314e-4,2.6453572621222732e-5,-1.3532810617513158e-8,3.562126332903402e-4,2.628664184351773e-5,-1.3497191162436568e-8,3.5673629776197384e-4,2.619610347960688e-5,-1.3474416118620455e-8,3.5727449108908464e-4,2.6196233744873596e-5,-1.3467331827186608e-8,3.577951171362706e-4,2.628789151186731e-5,-1.3476583429700484e-8,3.582677504977914e-4,2.6457485603445368e-5,-1.3500355686777276e-8,3.5866856083210973e-4,2.667773719840518e-5,-1.3534335889835297e-8,3.58984983565573e-4,2.691031135287597e-5,-1.3571967951946276e-8,3.592197788921785e-4,2.7110381522096033e-5,-1.3605104433755066e-8,3.5939395836391525e-4,2.723347733466807e-5,-1.3625211838772243e-8,3.5954731475294516e-4,2.7245005640118063e-5,-1.3625233122092842e-8,3.5973439287282456e-4,2.7131819567977223e-5,-1.3601941703224978e-8,3.600135954575884e-4,2.6912915110491107e-5,-1.355814290805302e-8,3.60429073295564e-4,2.664325075241653e-5,-1.3503526756102676e-8,3.60990418920039e-4,2.64034696792908e-5,-1.3452835801158697e-8,3.6166146352094975e-4,2.6273775898966717e-5,-1.3421074493356377e-8,3.623688032765512e-4,2.630225709809558e-5,-1.3417659611230746e-8,3.6302889191182174e-4,2.6485921915614753e-5,-1.3442821004948017e-8,3.635787000997205e-4,2.6775836053406942e-5,-1.3488337737398986e-8,3.6399313254539714e-4,2.7100845265447172e-5,-1.3541675775041822e-8,3.6428387361378935e-4,2.739386253867796e-5,-1.3590675845310196e-8,3.644865074909421e-4,2.7608376878739416e-5,-1.3626575377250361e-8,3.6464576613601913e-4,2.7723005292816395e-5,-1.364495582745406e-8,3.6480461555127395e-4,2.77383404850266e-5,-1.3645341642181487e-8,3.6499818740537e-4,2.76710053685678e-5,-1.3630271402829668e-8,3.6525122259954397e-4,2.754788664050142e-5,-1.360432815008887e-8,3.6557730310316335e-4,2.7401492817728636e-5,-1.357329062063108e-8,3.659787553882458e-4,2.72661665993695e-5,-1.3543394730429565e-8,3.6644689750384423e-4,2.7174555417879994e-5,-1.352065178127914e-8,3.669628241382334e-4,2.7153908983776746e-5,-1.3510179030065285e-8,3.674992016602788e-4,2.7222166045638933e-5,-1.3515526234079713e-8,3.68023539090487e-4,2.73843521332642e-5,-1.3538046023492725e-8,3.685030041719975e-4,2.7630228716345682e-5,-1.357642629855776e-8,3.689102801263324e-4,2.793415315314418e-5,-1.362653567100988e-8,3.692294796808659e-4,2.825781083626839e-5,-1.368173224189925e-8,3.694608523244996e-4,2.8555916027981706e-5,-1.3733727733496358e-8,3.6962307871807993e-4,2.8784249160797294e-5,-1.3773978177336275e-8,3.697522993353289e-4,2.8908903102290343e-5,-1.3795451641862713e-8,3.6989731803456434e-4,2.8915385836666257e-5,-1.3794521381371401e-8,3.701106527110447e-4,2.8815745762559872e-5,-1.3772576532502819e-8,3.704358354453675e-4,2.8651045702873957e-5,-1.3736749819577554e-8,3.7089307273516974e-4,2.8486040803253674e-5,-1.369908367506479e-8,3.714679608227572e-4,2.8394043726751596e-5,-1.3673710854101186e-8,3.7210991213757036e-4,2.843405066778115e-5,-1.3672440108961631e-8,3.7274498490128303e-4,2.8628554579815174e-5,-1.3700371291720451e-8,3.733002400374539e-4,2.8953884905579092e-5,-1.375383654447321e-8,3.737283127161456e-4,2.934966667201483e-5,-1.3821992572909582e-8,3.74019840199307e-4,2.9742318752869464e-5,-1.3891158565206442e-8,3.741996113300426e-4,3.0069483883304552e-5,-1.3949424588473654e-8,3.743121974552402e-4,3.0294519375517385e-5,-1.3989456769194334e-8,3.7440629029591007e-4,3.0408720943630665e-5,-1.4009040575435913e-8,3.745237271452724e-4,3.042555417326966e-5,-1.4010137999684472e-8,3.7469432233555345e-4,3.0372415163084517e-5,-1.399745265579277e-8,3.7493481407911624e-4,3.0283392801809747e-5,-1.3977121315336288e-8,3.7524974009757705e-4,3.0194074963467853e-5,-1.3955729687359219e-8,3.7563276072333213e-4,3.013796030115297e-5,-1.3939607838651707e-8,3.7606789752317216e-4,3.014358067755694e-5,-1.3934276197156442e-8,3.765308715945007e-4,3.0231593508346177e-5,-1.394391327502817e-8,3.769911447976581e-4,3.0411553226949515e-5,-1.3970762499094855e-8,3.774153866080384e-4,3.067874957136116e-5,-1.4014505540693484e-8,3.7777276900158004e-4,3.101223988098575e-5,-1.4071785355970582e-8,3.780416881621932e-4,3.137561973052833e-5,-1.4136185048005719e-8,3.782164562994042e-4,3.1721813892388676e-5,-1.4198962795870701e-8,3.7831168136817563e-4,3.2002044707192615e-5,-1.4250643304019193e-8,3.7836207867593326e-4,3.2177378338159576e-5,-1.4283213281041604e-8,3.784166470845473e-4,3.222972568760059e-5,-1.4292338201740607e-8,3.7852801727424653e-4,3.216882097511682e-5,-1.4278915068388991e-8,3.7873941235653586e-4,3.2032643792585974e-5,-1.4249424676350356e-8,3.7907250187723524e-4,3.1880386191779476e-5,-1.4214835935159804e-8,3.79519524138801e-4,3.1778859253417956e-5,-1.4188143257430748e-8,3.800425591675725e-4,3.1785057707013906e-5,-1.4180988668013144e-8,3.8058155833472476e-4,3.192941802742809e-5,-1.420023019579586e-8,3.810702007095623e-4,3.220552703223705e-5,-1.424564138430845e-8,3.814550608339061e-4,3.257118968284767e-5,-1.4309824655516338e-8,3.8171088610531375e-4,3.2961679962287354e-5,-1.4380610992098202e-8,3.818457030615165e-4,3.3310117296884816e-5,-1.444499449135639e-8,3.8189440825249304e-4,3.356630414228731e-5,-1.4492871054400158e-8,3.8190518456659355e-4,3.3706990005561714e-5,-1.4519156100786139e-8,3.8192545511999565e-4,3.3735939536645784e-5,-1.4523932873023375e-8,0.00038199221663132935,3.36770574780388e-5,-1.4511243699103591e-8,3.8212794959808886e-4,3.356532850735636e-5,-1.44874232515469e-8,3.8234068283503006e-4,3.3438964212912564e-5,-1.445961632653455e-8,3.826260695837975e-4,3.333397058547786e-5,-1.4434725361888601e-8,3.8296985541619517e-4,3.328078604508245e-5,-1.4418750654133305e-8,3.8335002714571484e-4,3.3302014460873146e-5,-1.441635218389012e-8,3.837387391287661e-4,3.341034772114456e-5,-1.4430449062814374e-8,3.841046361875188e-4,3.3606223967194986e-5,-1.4461732780659432e-8,3.844163948873668e-4,3.3875453388444264e-5,-1.4508108409027856e-8,3.846481026697538e-4,3.4187920503036706e-5,-1.4564283527851176e-8,3.8478626988731516e-4,3.449926174844078e-5,-1.4621926226168586e-8,3.8483677916458626e-4,3.475742957885683e-5,-1.4670832194101453e-8,3.8482854708888275e-4,3.491455839733871e-5,-1.4701226812136726e-8,3.8481043392111564e-4,3.4941584971485933e-5,-1.4706695752866484e-8,3.8484010168733006e-4,3.484013825587449e-5,-1.468664371357169e-8,3.8496755452253895e-4,3.464574228765504e-5,-1.4647105606473425e-8,3.852194666708856e-4,3.4419635873436564e-5,-1.4599384135326243e-8,3.8559051584685747e-4,3.4231768838361375e-5,-1.4556966089518085e-8,3.8604470174984556e-4,3.4141257634779535e-5,-1.4531832281699271e-8,3.8652549596401316e-4,3.4180796113487486e-5,-1.4531324827219252e-8,3.8697101818921484e-4,3.434917801281351e-5,-1.4556386882613265e-8,3.8732970092140794e-4,3.461318978913546e-5,-1.4601550234372074e-8,3.875723463890504e-4,3.491766325493246e-5,-1.4656605918405712e-8,3.8769763284319733e-4,3.5200524303996284e-5,-1.4709446876581307e-8,3.8772997811639925e-4,3.540841369879993e-5,-1.474921260370285e-8,3.877109937265693e-4,3.550840337825738e-5,-1.476877406003373e-8,3.8768778169230556e-4,3.5492866851361164e-5,-1.476588786722735e-8,3.877020190388187e-4,3.5377264492801586e-5,-1.4742916279944912e-8,3.8778272420060984e-4,3.519311331097323e-5,-1.4705540490345767e-8,3.8794354267678884e-4,3.497940485725285e-5,-1.4661111679795208e-8,3.88183621815305e-4,3.4775082366194856e-5,-1.4617171125102894e-8,3.8849040862005046e-4,3.4613774624727124e-5,-1.4580401934381552e-8,3.888429039948693e-4,3.452069902788002e-5,-1.4556015515333534e-8,3.8921458948142855e-4,3.45109299576898e-5,-1.4547412738969088e-8,3.8957597873680495e-4,3.4588150401447517e-5,-1.455591709815627e-8,3.8989728274007056e-4,3.474336635341969e-5,-1.4580440622513306e-8,3.9015195396758514e-4,3.495368121352255e-5,-1.4617090694513199e-8,3.9032177735499337e-4,3.5182101792084835e-5,-1.4658947568485471e-8,3.9040340540185385e-4,3.5380277120652675e-5,-1.4696467881042956e-8,3.904146306630224e-4,3.549631641986946e-5,-1.4719008759851094e-8,3.903967427080332e-4,3.548836893154207e-5,-1.4717615696219794e-8,3.9040860609677376e-4,3.534095270614115e-5,-1.468840935651692e-8,3.905107938530057e-4,3.507658782265891e-5,-1.4635025503981219e-8,3.9074435561294203e-4,3.4754301960084933e-5,-1.4568447883446436e-8,3.911142837911334e-4,3.445237060488615e-5,-1.4503769375063293e-8,3.915867065914306e-4,3.4242280516138355e-5,-1.4455241755727162e-8,3.9210098851033884e-4,3.416630020580259e-5,-1.4431921054112957e-8,3.9258978921974933e-4,3.42277415173893e-5,-1.4435583191215956e-8,3.92997891960016e-4,3.43949587943332e-5,-1.446115512515839e-8,3.9329397995157005e-4,3.4614214184008465e-5,-1.4498870429778417e-8,3.934741228294369e-4,3.482529654460197e-5,-1.4537116508416524e-8,3.935585439745504e-4,3.497539271070658e-5,-1.456516089516988e-8,3.935841244453831e-4,3.502882428209544e-5,-1.4575248316469991e-8,3.935950084123615e-4,3.497180118274077e-5,-1.4563798423281858e-8,3.9363335905265697e-4,3.4812268755863353e-5,-1.453161028551469e-8,3.9373196934599825e-4,3.457567997812712e-5,-1.4483168817569692e-8,3.9390985158140024e-4,3.4298244121273065e-5,-1.442534785326174e-8,3.941710735045695e-4,3.401951202215226e-5,-1.4365908871774454e-8,3.945062887672119e-4,3.377587091359689e-5,-1.431215883946541e-8,3.948959058166358e-4,3.3595868201667825e-5,-1.4269990715109863e-8,3.9531378332501087e-4,3.34975018387911e-5,-1.4243345355196083e-8,3.95730734118531e-4,3.348697905005418e-5,-1.4233969882786683e-8,3.9611767962868447e-4,3.3558268125866676e-5,-1.424129255710753e-8,3.964487102877791e-4,3.3693000306870486e-5,-1.4262290516375536e-8,3.9670457560232427e-4,3.386072530925677e-5,-1.429136009013897e-8,3.96877142245794e-4,3.402026478479182e-5,-1.4320404114221407e-8,3.96974675963087e-4,3.412377428846557e-5,-1.433955280018419e-8,3.970263033690597e-4,3.412534347773198e-5,-1.4338948576893425e-8,3.970821930901893e-4,3.3994646882125137E-05,-1.4311677516442803e-8,3.972051269460485e-4,3.373258641401384e-5,-1.4257126814339408e-8,3.9745171697619185e-4,3.3380857036472385e-5,-1.4183048350455968e-8,3.9784887548471545e-4,3.3015677815108926e-5,-1.4104376616313594e-8,3.983784208606685e-4,3.272315572911758e-5,-1.4038376360391643e-8,3.989810077392129e-4,3.2567028222608205e-5,-1.3998275239165507e-8,3.995784033932848e-4,3.256650678484111e-5,-1.3988808427858587e-8,4.001011450991133e-4,3.269479846358877e-5,-1.4005705396679457e-8,4.0050766556828905e-4,3.2894820685850835e-5,-1.4038489709830286e-8,4.0078956955466436e-4,3.310064022337845e-5,-1.407446327281956e-8,4.0096621978551547e-4,3.325505206119748e-5,-1.4102093289319672e-8,4.010745404447036e-4,3.3319672146671645e-5,-1.4113112716440347e-8,4.0115849496576356e-4,3.3278246778498246e-5,-1.4103416685224999e-8,4.0126036221118603e-4,3.3135359116825646e-5,-1.4073080729645138e-8,4.014143685471576e-4,3.291243375807629e-5,-1.4025773677232568e-8,4.0164265136440953e-4,3.264223661405534e-5,-1.3967743564302586e-8,4.019534608500238e-4,3.236272447032621e-5,-1.390655605379301e-8,4.023414451750576e-4,3.211102729665613e-5,-1.3849797898036786e-8,4.0278971307670453e-4,3.191824538468825e-5,-1.3803953237611915e-8,4.032731686233601e-4,3.18056089510052e-5,-1.3773602883065726e-8,4.037624347508987e-4,3.178228329803735e-5,-1.376099772735688e-8,4.0422776760387706e-4,3.184466222614487e-5,-1.3765925422093045e-8,4.0464271102872616e-4,3.1976751617668895e-5,-1.3785736315062855e-8,4.049875078121135e-4,3.2151373504918296e-5,-1.3815449042655647e-8,4.0525242347578963e-4,3.2332175019236376e-5,-1.3847964962952615e-8,4.0544119121250843e-4,3.2476862419152035e-5,-1.3874561986942388e-8,4.05574305140568e-4,3.254270756363941e-5,-1.3885979640020726e-8,4.0569066632959827e-4,3.249544686392352e-5,-1.3874369128060043e-8,4.0584474135106326e-4,3.232141920233108e-5,-1.3836033795223245e-8,4.060959597117366e-4,3.203981711665866e-5,-1.3774198864523915e-8,4.0648944202457856e-4,3.170776499799547e-5,-1.3700205970255192e-8,4.070339380710125e-4,3.14094387988266e-5,-1.3631320248747382e-8,4.076901544592694e-4,3.122757281338524e-5,-1.3584880382566213e-8,4.083808447150242e-4,3.1209812559531696e-5,-1.357136683146307e-8,4.090200221087287e-4,3.1349995147856346e-5,-1.3590446140588086e-8,4.0954443123187515e-4,3.1595103343674464e-5,-1.3632168430282483e-8,4.099303837683666e-4,3.187049880203468e-5,-1.3681872256090355e-8,4.101918277261662e-4,3.210671035463291e-5,-1.3725481876963942e-8,4.103671176469619e-4,3.225608889167277e-5,-1.3752883934071199e-8,4.1050398879131114e-4,3.2297665182539014e-5,-1.3759059927073484e-8,4.106480562172606e-4,3.223425978678608e-5,-1.3743742869076615e-8,4.108359107796797e-4,3.208637535174844e-5,-1.371041895829871e-8,4.1109180515318115e-4,3.188566709771694e-5,-1.366514943234374e-8,4.1142658815250326e-4,3.166901056491771e-5,-1.3615380156688916e-8,4.118380537063425e-4,3.147326545835003e-5,-1.3568790580043022e-8,4.123123872285276e-4,3.1330693322293186e-5,-1.3532246924646132e-8,4.1282660990819755e-4,3.12650855735152e-5,-1.3510937230181173e-8,4.1335194038861985e-4,3.12888232285669e-5,-1.3507759179538763e-8,0.00041385782791872523,3.14012402587035e-5,-1.3523006860697865e-8,4.143162097043059e-4,3.158851800056764e-5,-1.3554343762603742e-8,4.147055736697891e-4,3.182504325345812e-5,-1.3596998591413753e-8,4.150145461827425e-4,3.207610038134238e-5,-1.3644157727172217e-8,4.1524476893370035e-4,3.230183268389632e-5,-1.368759809958973e-8,4.1541284364256985e-4,3.2462481911037404e-5,-1.3718658948585584e-8,4.1555091775811174e-4,3.252513293742975e-5,-1.3729683805619488e-8,4.1570478512098117e-4,3.247211793603926e-5,-1.3715984522395111e-8,4.159276624200048e-4,3.2310116826504505e-5,-1.3678055124053507e-8,4.1626805702971783e-4,3.2076790804311726e-5,-1.3623245822332607e-8,4.167524617387805e-4,3.1839355536118996e-5,-1.3565610929515464e-8,4.173687071937988e-4,3.1679433606488e-5,-1.352271054257597e-8,4.180608672886187e-4,3.166480571656874e-5,-1.3509541984888306e-8,4.187443288713044e-4,3.182021371545731e-5,-1.353221487846181e-8,4.193369682737023e-4,3.211533218369021e-5,-1.3585218588590153e-8,4.1978931227977685e-4,3.247863499575709e-5,-1.3654153761093438e-8,4.2009704087509506e-4,3.282777137229304e-5,-1.3721983897773367e-8,4.202929904690921e-4,3.309778073197644e-5,-1.377490014751364e-8,4.2042859167406205e-4,3.325494568929429e-5,-1.3805267082687721e-8,4.2055631802961126e-4,3.329635406528146e-5,-1.3811685967344244e-8,4.207187075410816e-4,3.324181570289828e-5,-1.3797529601781316e-8,4.209438553744661e-4,3.312430221578908e-5,-1.376914696052265e-8,4.212450114021482e-4,3.29820290127452e-5,-1.3734307231289387e-8,4.2162200611876914e-4,3.285276439909095e-5,-1.3700985550654417e-8,4.220632466273461e-4,3.276974175556986e-5,-1.3676406563612262e-8,4.225479806825113e-4,3.275847057478871e-5,-1.3666274054639809e-8,4.2304896717371235e-4,3.283409778896946e-5,-1.367416405793029e-8,4.23535782825238e-4,3.299935006506142e-5,-1.3701088573561653e-8,4.2397886988324306e-4,3.3243478824476034e-5,-1.374527589841765e-8,4.2435406637511227e-4,3.354279531934157e-5,-1.3802236076034794e-8,4.246470102477941e-4,3.3863147891369016e-5,-1.3865160722445153e-8,4.248566904943515e-4,3.4164346787876715e-5,-1.392568757735148e-8,4.249974307882397e-4,3.4406249583597606e-5,-1.3975043403899051e-8,4.2509869023787635e-4,3.455590008719841e-5,-1.4005525482322397e-8,4.252022353167417e-4,3.4594902384809774e-5,-1.4012200930378964e-8,4.2535628227180944e-4,3.452606191561703e-5,-1.3994602436161527e-8,4.2560627053101944e-4,3.437774195887487e-5,-1.3957997791203556e-8,4.259826655671023e-4,3.42033544248866e-5,-1.3913552496987838e-8,4.2648812302165757e-4,3.407288572264099e-5,-1.3876612700332113e-8,4.2708920644435e-4,3.405490071168592e-5,-1.3862734860228985e-8,4.2771960286236156e-4,3.419246160656786e-5,-1.388224482934693e-8,4.2829858276369735e-4,3.4483331127508464e-5,-1.39356667397566e-8,4.287591800201008e-4,3.487711132752329e-5,-1.401286696741407e-8,4.2907189221625086e-4,3.529375343362766e-5,-1.4096933853643936e-8,4.2925111181198606e-4,3.5653822332007866e-5,-1.4170691079982273e-8,4.293431436633978e-4,3.590386737424457e-5,-1.422220020649449e-8,4.294057069943159e-4,3.602629900089709e-5,-1.4246968028465437e-8,4.2949028887441184e-4,3.603476243390713e-5,-1.4247107509361492e-8,4.296326637699373e-4,3.596258975350247e-5,-1.422906114426545e-8,4.298507830160587e-4,3.585122067538412e-5,-1.4201284229219959e-8,4.30146821619837e-4,3.574178595192985e-5,-1.4172502101488057e-8,4.305105528179752e-4,3.567004669500458e-5,-1.4150577469349977e-8,4.309225690144668e-4,3.566353502127585e-5,-1.4141794633184363e-8,4.3135708115020477e-4,3.5739694174433475e-5,-1.4150368611616155e-8,4.3178466029482305e-4,3.5904363120716595e-5,-1.4178070671429282e-8,4.321754230960808e-4,3.615055457113382e-5,-1.4223940930016515e-8,4.3250300470527235e-4,3.645801938170371e-5,-1.4284152898436964e-8,4.327492141671965e-4,3.6794455062480333e-5,-1.4352180111878265e-8,4.329086361301494e-4,3.711914037777242e-5,-1.441944170755436e-8,4.329919362284678e-4,3.738922622588004e-5,-1.4476525706585657e-8,4.3302648954548616e-4,3.756805202918171e-5,-1.4514923144055002e-8,4.330533235187689e-4,3.763391300210855e-5,-1.4528989528198715e-8,4.331202330514279e-4,3.7587099620632155e-5,-1.4517675625248134e-8,4.33271953934643e-4,3.7453099149815584e-5,-1.4485529520827118e-8,4.335391170749413e-4,3.728040086638992e-5,-1.4442540122095772e-8,4.3392835970523195e-4,3.713209968463934e-5,-1.4402528788363379e-8,4.344165500758634e-4,3.707165347756771e-5,-1.4380064897967802e-8,4.3495230062594813e-4,3.714511840207765e-5,-1.438637838413005e-8,4.3546692736868404e-4,3.7364868229131036e-5,-1.4425430174624792e-8,4.3589372030768185e-4,3.7701867510223756e-5,-1.4491842764582526e-8,4.361893091351183e-4,3.8092289800798756e-5,-1.4572120153155367e-8,4.3634757852403625e-4,3.8457985039809324e-5,-1.464910812938325e-8,4.363991796352178e-4,3.8732147174392066e-5,-1.4707727290935779e-8,4.3639763452364114e-4,3.887826414780291e-5,-1.4739264857224268e-8,4.364001722647106e-4,3.889525252824335e-5,-1.474263969373984e-8,4.364523016838084e-4,3.881021476354108e-5,-1.4722977299200551e-8,4.365804771433114e-4,3.866556340462599e-5,-1.468896039574687e-8,4.367919722871205e-4,3.8506926413442914e-5,-1.4650297668231218e-8,4.370786669043261e-4,3.837491837753309e-5,-1.4615939698352876e-8,4.3742177567648004e-4,3.8300841711920557e-5,-1.4593067497875068e-8,4.377959505900983e-4,3.830495380523125e-5,-1.4586611379527836e-8,4.3817246361271725e-4,3.839583492266989e-5,-1.4599028669935255e-8,4.385219262133009e-4,3.856996202628723e-5,-1.4630154871815322e-8,4.388172474094774e-4,3.881133934777927e-5,-1.4677068982739351e-8,4.3903736753377824e-4,3.909172438758446e-5,-1.4734059655137036e-8,4.39171785700476e-4,3.9372492362129876e-5,-1.4792916472356046e-8,4.392250878709724e-4,3.9609287825052854e-5,-1.48438349018792e-8,4.392197841418492e-4,3.9760010138741e-5,-1.4877110525214467e-8,4.391952872335693e-4,3.9795215836805176e-5,-1.488546114998337e-8,4.392015028478242e-4,3.9708130526000964e-5,-1.4866368508482124e-8,4.392874740657098e-4,3.9520303226885334e-5,-1.4823547388579492e-8,4.3948798661524503e-4,3.927964654825381e-5,-1.4766788554084115e-8,4.3981252877586845e-4,3.905019462021475e-5,-1.4709963203151688e-8,4.4024057367895406e-4,3.889606668889953e-5,-1.4667637174980205e-8,4.407251019923313e-4,3.886426054421898e-5,-1.465121537204819e-8,4.4120371732378895e-4,3.897130268161372e-5,-1.4665702138134793e-8,4.4161456567829924e-4,3.919776198075389e-5,-1.4708062006301217e-8,4.41912806692747e-4,3.949272215218089e-5,-1.4767828043097781e-8,4.4208268554817335e-4,3.978761101197567e-5,-1.4829982902345276e-8,4.421409699762284e-4,4.001548958358082e-5,-1.4879284623686034e-8,4.421303237867017e-4,4.012928886396741e-5,-1.4904509091663218e-8,4.4210531633417574e-4,4.011254468451751e-5,-1.4901064005645254e-8,4.421168168722615e-4,3.997960143327207e-5,-1.487124044964496e-8,4.422004451507053e-4,3.9767094807069e-5,-1.4822485598136494e-8,4.4237183113721076e-4,3.9521669753076244e-5,-1.4764783122292205e-8,4.426279491665109e-4,3.928881642907068e-5,-1.4708204056709783e-8,4.429518454747351e-4,3.91054375635812e-5,-1.4661205248835662e-8,4.433181067887932e-4,3.899632725145631e-5,-1.4629752573422735e-8,4.436975223791884e-4,3.8973357147412855e-5,-1.4617048273316101e-8,4.4406056405082626e-4,3.903590468819179e-5,-1.4623561502714967e-8,4.4438008650014344e-4,3.91715076460056e-5,-1.4647122090138582e-8,4.446339768961001e-4,3.935646602380224e-5,-1.4682981479505956e-8,4.448083963396037e-4,3.955684978592832e-5,-1.4723927049201846e-8,4.4490177030358924e-4,3.973098128986008e-5,-1.4760714274992125e-8,4.4492878725670593e-4,3.9834759260079374e-5,-1.4783179135015065e-8,4.4492247041699046e-4,3.983068781073579e-5,-1.4782276848273152e-8,4.4493150521741963e-4,3.9699639584905065e-5,-1.4752832416571488e-8,4.4501065268293756e-4,3.945150399211428e-5,-1.4696101798232349e-8,4.452051621230111e-4,3.912878232058367e-5,-1.4620773630123115e-8,4.4553450758414917e-4,3.879851843897706e-5,-1.4541367888067542e-8,4.459831270119789e-4,3.853341144760553e-5,-1.4474199279655483e-8,4.4650334228181737e-4,3.83892962100095e-5,-1.4432428557074345e-8,4.470294963479162e-4,3.838843851633301e-5,-1.4422210720894016e-8,4.474971022466872e-4,3.8514644123259556e-5,-1.4441268698217063e-8,4.4785977033990704e-4,3.872025545847296e-5,-1.4480033042680275e-8,4.480991934681107e-4,3.8940889744311725e-5,-1.4524608121518424e-8,4.48226794522255e-4,3.911257774162124e-5,-1.4560498684405491e-8,4.482780588321118e-4,3.918669829382871e-5,-1.457607889926847e-8,4.4830195410043057e-4,3.913954024565277e-5,-1.4565007306195704e-8,4.483485381147606e-4,3.8974954360315984e-5,-1.4527125710483059e-8,4.484579671969714e-4,3.872030337677846e-5,-1.4467791545713628e-8,4.4865345969394e-4,3.841765061935548e-5,-1.4396030200337683e-8,4.489392960449042e-4,3.811327623924533e-5,-1.4322193270630174e-8,4.4930320331229367e-4,3.7848511485026534e-5,-1.4255821744391228e-8,4.497213338957374e-4,3.765366154702086e-5,-1.4204163537672068e-8,4.5016388935185643e-4,3.7545304813913294e-5,-1.4171463776027224e-8,4.5060002058532647e-4,3.752619081927828e-5,-1.415888242467012e-8,4.5100150770761724e-4,3.758652962581753e-5,-1.4164756572674547e-8,4.5134546376081325e-4,3.7705677615177184e-5,-1.4184941935731645e-8,4.5161665818218725e-4,3.785383751499737e-5,-1.4213111016563784e-8,4.518100423627256e-4,3.7994051971822126e-5,-1.4241074681839239e-8,4.5193371514478737e-4,3.8085369823532785e-5,-1.4259379743515523e-8,4.5201173652522936e-4,3.808847352382779e-5,-1.4258553184670598e-8,4.5208492668352473e-4,3.797471001575803e-5,-1.4231251193107125e-8,4.522066971808626e-4,3.77376787180318e-5,-1.4175095272905575e-8,4.5243135935849304e-4,3.7403252871591634e-5,-1.4095172040726785e-8,4.5279582657719995e-4,3.7030874343293475e-5,-1.4004497095542028e-8,4.5330172975054594e-4,3.6700112219684904e-5,-1.3921072538958264e-8,4.539088056613535e-4,3.648437266876659e-5,-1.3861984223206524e-8,4.545461169138244e-4,3.642372882885231e-5,-1.3837216692123784e-8,4.5513658700048617e-4,3.651138922317251e-5,-1.3846408129259836e-8,4.556220323441288e-4,3.66997016694241e-5,-1.3879890283223254e-8,4.559775185965056e-4,3.691969978430192e-5,-1.3922769386842146e-8,4.562122242740801e-4,3.710309854736905e-5,-1.3959682858114987e-8,4.5636084388552884e-4,3.7198647914217366e-5,-1.397848887776796e-8,4.564712492187718e-4,3.7180239677984124e-5,-1.3972296643507357e-8,4.5659257815677795e-4,3.7047788247771294e-5,-1.393998633269255e-8,4.5676585962010804e-4,3.682314037864092e-5,-1.3885605024489333e-8,4.57017899354544e-4,3.65430985371316e-5,-1.3816998895031419e-8,4.573585513254664e-4,3.625115082842816e-5,-1.3743986972765052e-8,4.5778120823241134e-4,3.5989329685002914e-5,-1.367641965358165e-8,4.582659310878471e-4,3.579152347703973e-5,-1.3622494409608255e-8,4.587842300484169e-4,3.567911872805785e-5,-1.3587614246913989e-8,4.5930436312677383e-4,3.565921697959824e-5,-1.357389940117045e-8,4.5979615512869434e-4,3.572510183973148e-5,-1.358027877351196e-8,4.6023475988321376e-4,3.585820060660067e-5,-1.360294284347647e-8,4.6060335832733674e-4,3.6030722091809204e-5,-1.3635911870639802e-8,4.60895139188042e-4,3.6208528902177354e-5,-1.3671590860836431e-8,4.6111494690815154e-4,3.635429757026502e-5,-1.3701352069797334e-8,4.612807925415506e-4,3.6431488839050474e-5,-1.3716346193401218e-8,4.614247987373746e-4,3.6410027954227026e-5,-1.3708835750741679e-8,4.6159205914533125e-4,3.62743262879114e-5,-1.3674231350069227e-8,4.6183498055835207e-4,3.6032773953528615e-5,-1.3613573886357206e-8,4.6220096368370197e-4,3.572504366766511e-5,-1.3535497406452498e-8,4.627142460022724e-4,3.5420516607509466e-5,-1.345601089443765e-8,4.633589570077975e-4,3.520158587923049e-5,-1.339462640412944e-8,4.640754895656249e-4,3.5133781640715624e-5,-1.336732887285183e-8,4.6477797333421513e-4,3.523710146370312e-5,-1.337976511947418e-8,4.653863109243403e-4,3.5476761963375476e-5,-1.3424888861955243e-8,4.658546211216421e-4,3.577942568893229e-5,-1.3486488367131025e-8,4.661813358342299e-4,3.6063351831523195e-5,-1.3545965988268696e-8,4.664004611033069e-4,3.626473218857858e-5,-1.3588320959816941e-8,4.665639958352068e-4,3.6350407228647365e-5,-1.360513303776225e-8,4.6672541684679767e-4,3.631790496298228e-5,-1.3594788762173888e-8,4.6692865416770923e-4,3.618845377576418e-5,-1.3561187150119446e-8,4.672026368560225e-4,3.5997925297469526e-5,-1.3511940939945172e-8,4.6755982834898976e-4,3.5788386314177225e-5,-1.3456575605413407e-8,4.67997179408685e-4,3.5601078032541834e-5,-1.3404875559273569e-8,4.684985923176623e-4,3.5470812389852354e-5,-1.3365423942936016e-8,4.6903849108559164e-4,3.542180047068913e-5,-1.3344439413006975e-8,4.695861596821659e-4,3.546508508953634e-5,-1.3345040436527447e-8,4.7011041192164126e-4,3.559772500847251e-5,-1.3367006714160734e-8,4.705840542170844e-4,3.580375537789526e-5,-1.3407016011675667e-8,4.7098759753275935e-4,3.6056678871433476e-5,-1.3459233547938723e-8,4.7131190949890184e-4,3.632298007574168e-5,-1.3516078049011552e-8,4.71559790690804e-4,3.6566204934469644e-5,-1.3569053058169974e-8,4.717465735754899e-4,3.6751383530202755E-05,-1.3609647477316639e-8,4.718998124130554e-4,3.684981905601746e-5,-1.3630405599256602e-8,4.7205781579265745e-4,3.684452081682734e-5,-1.3626310087204059e-8,4.7226605766033966e-4,3.673637051258554e-5,-1.3596506069195115e-8,4.725699924678846e-4,3.654994787786842e-5,-1.3546025765795578e-8,4.730033180778431e-4,3.6336041112372295e-5,-1.3486667699711668e-8,4.7357300089362716e-4,3.616604739808837e-5,-1.3435763281303896e-8,4.74246972161772e-4,3.611397064008277e-5,-1.3411769997669891e-8,4.7495468950762464e-4,3.6228226616847743e-5,-1.342728801093758e-8,4.756075265498231e-4,3.6506596772157785e-5,-1.3482806498111208e-8,4.761324789643435e-4,3.68921215314555e-5,-1.3565521966204982e-8,4.76500027685036e-4,3.729587464380291e-5,-1.3654665288008376e-8,4.7672987690625123e-4,3.763293743393644e-5,-1.3730017018062513e-8,4.768749775046739e-4,3.7850136442992455e-5,-1.3778472109271951e-8,4.7699763159739244e-4,3.7934345672070496e-5,-1.379606231317544e-8,4.7715085690734735e-4,3.790502947009683e-5,-1.3786386207802384e-8,4.7736947329048336e-4,3.780076670277705e-5,-1.3757715344810296e-8,4.7766881383462853e-4,3.7666865402247315e-5,-1.3720316041747617e-8,4.780473761409701e-4,3.7546640888132714e-5,-1.368447808114495e-8,4.7849069816615584e-4,3.747611264933771e-5,-1.3659170952435136e-8,4.789752246660876e-4,3.748091718942398e-5,-1.3651117518452754e-8,4.7947201707088224e-4,3.757448492495361e-5,-1.3664168314897276e-8,4.799505077512641e-4,3.775714321569889e-5,-1.3698971973992664e-8,4.803824002412184e-4,3.801622409426613e-5,-1.3752971782310215e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json new file mode 100644 index 0000000..765f637 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":11000,"numberOfSamples":1000,"samples":[4.807455898115237e-4,3.832746570992544e-5,-1.3820749559112586e-8,4.810276804026849e-4,3.8657939483712816e-5,-1.3894708855793208e-8,4.8122851144731977e-4,3.897037866353488e-5,-1.3966029941865335e-8,4.8136122169643126e-4,3.922846753666153e-5,-1.4025813189547578e-8,4.8145158055841605e-4,3.94025277918899e-5,-1.406634943105251e-8,4.815355041583503e-4,3.9474978459853574e-5,-1.408245537787128e-8,4.8165478219839815e-4,3.9445013590506954e-5,-1.4072791780691197e-8,4.8185089652025466e-4,3.933196966399209e-5,-1.4041008026015441e-8,4.8215671196515623e-4,3.9176311765079673e-5,-1.3996340784096513e-8,4.825864763543066e-4,3.9036228711670225e-5,-1.3953028790341758e-8,4.8312623641597524e-4,3.897747212754661e-5,-1.3927849119148707e-8,4.837291888970253e-4,3.9055456474574426e-5,-1.3935510387344442e-8,4.843221611312391e-4,3.929313827217236e-5,-1.3982860442730526e-8,4.848265247112546e-4,3.966499254457847e-5,-1.4064616609993489e-8,4.8518733416020557e-4,4.009980545620315e-5,-1.4163881241573302e-8,4.853950931909375e-4,4.050581912340954e-5,-1.425830655995102e-8,4.854866151667581e-4,4.080574058134305e-5,-1.4328715323638037e-8,4.85525688196407e-4,4.096178493042818e-5,-1.4365239392562207e-8,4.855772001398806e-4,4.0979862819758134e-5,-1.4368394366073396e-8,4.856885804979649e-4,4.089713112766541e-5,-1.4346234987150922e-8,4.8588326125485515e-4,4.076435074414623e-5,-1.4310345248447114e-8,4.8616296080937287e-4,4.063161994000118e-5,-1.4272594843316575e-8,4.865136173432042e-4,4.054008405187016e-5,-1.4243172616081504e-8,4.8691142789272524e-4,4.051847158520118e-5,-1.4229620182921136e-8,4.8732762934217247e-4,4.0582299326150006e-5,-1.4236433463507242e-8,4.8773212709177916e-4,4.07341134689005e-5,-1.4264941962397524e-8,4.880965967034294e-4,4.096407600183585e-5,-1.4313353517338398e-8,4.88397573177068e-4,4.1250927252936434e-5,-1.4376959666340294e-8,4.886197129387349e-4,4.1563798332032156e-5,-1.4448564853229553e-8,4.887589435265532e-4,4.1865488207741994e-5,-1.451924254306548e-8,4.888247307700336e-4,4.211748974787741e-5,-1.4579476522027053e-8,4.888405100767859e-4,4.228641181812268e-5,-1.462064263346648e-8,4.888415356313333e-4,4.235083017747227e-5,-1.463666315611464e-8,4.888699069788087e-4,4.2307124574301165e-5,-1.462554429370797e-8,4.889672434197426e-4,4.2172729191325406e-5,-1.459042628142175e-8,4.89166100944331e-4,4.198561886052198e-5,-1.4539802909504917e-8,4.894815424795779e-4,4.179941029790374e-5,-1.4486638095790344e-8,4.899045597653066e-4,4.16738571918689e-5,-1.4446179472955758e-8,4.903995543457572e-4,4.1661226263416274e-5,-1.4432491631334258e-8,4.909084078410756e-4,4.179064877681403e-5,-1.4454232713012669e-8,4.913629055658968e-4,4.205495921373214e-5,-1.4510927067288458e-8,4.917043498415898e-4,4.2406630471518614e-5,-1.4591584452824552e-8,4.919041260653661e-4,4.2768455240018365e-5,-1.4677226547185713e-8,4.91975143734432e-4,4.30581023135401e-5,-1.4747087713819914e-8,4.919667281492841e-4,4.321634341236769e-5,-1.4785795141156964e-8,4.919450134806429e-4,4.322488299346272e-5,-1.4787918091785175e-8,4.919696544610528e-4,4.310619995991277e-5,-1.4758043194016052e-8,4.920780610928328e-4,4.2909134196637064e-5,-1.4707389424281414e-8,4.922813225790399e-4,4.269033595193827e-5,-1.464944226297227e-8,4.925688425220637e-4,4.249988199139718e-5,-1.4596537842685818e-8,4.92916302217559e-4,4.2373819969799324e-5,-1.4557994767186664e-8,4.932930424762773e-4,4.233227598512297e-5,-1.4539483417289066e-8,4.936673798735039e-4,4.2380499169877454e-5,-1.4543082916464466e-8,4.940100632622315e-4,4.251078828128216e-5,-1.4567604259159937e-8,4.942967406427109e-4,4.27043504794895e-5,-1.4608973846901326e-8,4.945102476677884e-4,4.2933063498730834e-5,-1.4660638792530654e-8,4.946431248320447e-4,4.316170803770033e-5,-1.4714088579726986e-8,4.947001929114915e-4,4.335150966562856e-5,-1.4759675319273507e-8,4.947003518474758e-4,4.3465620460088586e-5,-1.4787908056141978e-8,4.946762700491294e-4,4.3476391218321277e-5,-1.4791230435817252e-8,4.946706632709735e-4,4.337312853241991e-5,-1.4766006598097854e-8,4.947286919062398e-4,4.316792790944356e-5,-1.4714140745679074e-8,4.948875598480194e-4,4.289680338026428e-5,-1.46436248866499e-8,4.951660198459949e-4,4.261431606960693e-5,-1.4567507684274658e-8,4.955572023782361e-4,4.238205390573295e-5,-1.4501266960766878e-8,4.960275056948562e-4,4.225356593077395e-5,-1.4459112508157139e-8,4.965226079965434e-4,4.225970770296015e-5,-1.445012992875491e-8,4.969797348841862e-4,4.239855798309805e-5,-1.4475344797421208e-8,4.973435745501257e-4,4.263333074298414e-5,-1.452672530286383e-8,4.975817616767804e-4,4.290011641573763e-5,-1.4588789841322534e-8,4.976949342797306e-4,4.31246291984686e-5,-1.4642736998874316e-8,4.977169933512843e-4,4.32435191844831e-5,-1.4671952404593025e-8,4.977043744489744e-4,4.3222752491909916e-5,-1.4666876259907704e-8,4.977180995272924e-4,4.30657402384419e-5,-1.4627283126456636e-8,4.978060190996614e-4,4.280844975449757e-5,-1.4561258969220208e-8,4.979920722311104e-4,4.2505071693506214e-5,-1.4481783123106343e-8,4.982749931993637e-4,4.221149461163865e-5,-1.4402704387878677e-8,4.986341351162414e-4,4.1972812399652274e-5,-1.4335614319282961e-8,4.99038023174974e-4,4.181724732728816e-5,-1.4288203371298527e-8,4.994521132236064e-4,4.1755451375511826e-5,-1.4263899128169458e-8,4.998442497099592e-4,4.1782774302784495e-5,-1.4262268021020732e-8,5.001879318353291e-4,4.1882399162322495e-5,-1.4279703860248156e-8,5.004642516735846e-4,4.202823461485221e-5,-1.4310113798395751e-8,5.006634317541689e-4,4.218742398465999e-5,-1.4345522650409268e-8,5.007865154243883e-4,4.232301933686223e-5,-1.4376697915433863e-8,5.008471450808845e-4,4.239771827120947e-5,-1.4394026271468186e-8,5.008726192415792e-4,4.237947661390274e-5,-1.4388889379628621e-8,5.009027064025104e-4,4.224906691188224e-5,-1.4355605708386248e-8,5.009844664141034e-4,4.200814399437556e-5,-1.4293595372097094e-8,5.011622958425812e-4,4.168457799010023e-5,-1.4208933086185455e-8,5.014648490094809e-4,4.133098997158663e-5,-1.4114222164068199e-8,5.018933871908035e-4,4.1014046129932506e-5,-1.4026120755346876e-8,5.024172779489319e-4,4.079629120466331e-5,-1.3960894019653134e-8,5.029800978344093e-4,4.0716851663191706e-5,-1.3929502673170868e-8,5.035149205751237e-4,4.0778803174321974e-5,-1.3934148788121047e-8,5.039631026052139e-4,4.0948067350335475e-5,-1.3967574412809247e-8,5.042898951464934e-4,4.116358529728348e-5,-1.4015214047407058e-8,5.044923433820881e-4,4.1354546447450864e-5,-1.405930760929713e-8,5.045980853346142e-4,4.145904379395495e-5,-1.4083628433054094e-8,5.046562864241187e-4,4.143903113694813e-5,-1.4077491031220824e-8,5.047237703547672e-4,4.128796116298141e-5,-1.4038013428869964e-8,5.048504577142612e-4,4.1029648300892024e-5,-1.3970152894372228e-8,5.050682042868694e-4,4.070946922079784e-5,-1.3884718542673423e-8,5.053857892959258e-4,4.038129871002777e-5,-1.3795175637434057e-8,5.057904773855169e-4,4.0094587167200846e-5,-1.3714342555419928e-8,5.062542972907671e-4,3.988514116215506e-5,-1.3651908298048012e-8,5.067420758582822e-4,3.9771018930213065e-5,-1.36131932106548e-8,5.072186700798977e-4,3.9752847710952766e-5,-1.3599056334601855e-8,5.076541049257842e-4,3.981679039448647e-5,-1.3606552572220539e-8,5.080265636895346e-4,3.993839829792082e-5,-1.3629887915207912e-8,5.083239056768367e-4,4.008625429723009e-5,-1.366134539027628e-8,5.085445405312649e-4,4.02251540015048e-5,-1.3692068130210929e-8,5.086982215653529e-4,4.031923748367069e-5,-1.3712790472901225e-8,5.088067942896942e-4,4.033585746282454e-5,-1.3714758380114217e-8,5.089042016332715e-4,4.0250984480183826e-5,-1.369110873241738e-8,5.090342370463796e-4,4.005630209267127e-5,-1.36387919547938e-8,5.09244162874289e-4,3.976656292219734e-5,-1.3560660497017656e-8,5.095732393487734e-4,3.942360984383623e-5,-1.3466737784983145e-8,5.100381218559963e-4,3.9092145563312785e-5,-1.3373334502326575e-8,5.106211663506831e-4,3.884421714299498e-5,-1.3299185546533904e-8,5.112695708256073e-4,3.873558642398053e-5,-1.325938777322804e-8,5.119093049859852e-4,3.878426446529394e-5,-1.3259745614206067e-8,5.124690770718819e-4,3.896273593345075e-5,-1.3294485083970076e-8,5.129030399538616e-4,3.920805997219822e-5,-1.3348486880023718e-8,5.13202292093832e-4,3.944384781038976e-5,-1.3402621757432825e-8,5.133926118135372e-4,3.9603311868793384e-5,-1.3439524368879208e-8,5.135225876503645e-4,3.964513077729718e-5,-1.344773648237942e-8,5.136484244188965e-4,3.955939833262208e-5,-1.3423498173910979e-8,5.138202846515992e-4,3.936503101320661e-5,-1.337045078206997e-8,5.140727251366115e-4,3.9101620258126494e-5,-1.3297891578819023e-8,5.144200439889327e-4,3.8818723273896924e-5,-1.3218230049065295e-8,5.148563248939854e-4,3.8565076244178615e-5,-1.31442269252279e-8,5.153592942705727e-4,3.8379720577811564e-5,-1.3086552229207539e-8,5.158965586590853e-4,3.8286402743178446e-5,-1.3052102047767048e-8,5.164325300028227e-4,3.829166482457637e-5,-1.3043289492522785e-8,5.169345624266961e-4,3.838611140678518e-5,-1.3058250794240458e-8,5.173773998025525e-4,3.854777091398222e-5,-1.3091694599441699e-8,5.177457469094699e-4,3.8746318140652295E-05,-1.3136024508001314e-8,5.180353753683765e-4,3.894721737733719e-5,-1.3182422098429487e-8,5.182533801875123e-4,3.9115464526579055e-5,-1.322176802538456e-8,5.184180207872244e-4,3.9219155018714586e-5,-1.3245479826195314e-8,5.185582174206982e-4,3.923339887816621e-5,-1.3246473160946539e-8,5.187121920390923e-4,3.9145162676454723e-5,-1.3220474590964729e-8,0.00051892397371530155,3.895909776742693e-5,-1.316773040159988e-8,5.192361363727685e-4,3.8702959631497384e-5,-1.3094695644609137e-8,5.19678041196177e-4,3.8429183553321686e-5,-1.3014701920521112e-8,5.20251698135249e-4,3.820781513346968e-5,-1.2946243125940887e-8,5.209217831712024e-4,3.810779889170091e-5,-1.2908049988956758e-8,5.216188239536118e-4,3.817071047034634e-5,-1.2912046211167408e-8,5.222596846655533e-4,3.8389929217076366e-5,-1.295764933741635e-8,5.227776981227885e-4,3.870942493105218e-5,-1.3031193682067312e-8,5.231462221446176e-4,3.90449333361414e-5,-1.3111251595486714e-8,5.233834624169179e-4,3.9315346546736246e-5,-1.3176687479802485e-8,5.235394281321812e-4,3.946752696132619e-5,-1.3213083897284422e-8,5.236754233317036e-4,3.9485713744511626e-5,-1.3215295714260378e-8,5.238462568216775e-4,3.9387314888452363e-5,-1.3186630329662888e-8,5.240896667697123e-4,3.921173128856953e-5,-1.3136310014778118e-8,5.244226644038686e-4,3.900801174331826e-5,-1.3076572242619164e-8,5.248426426550115e-4,3.882439799199982e-5,-1.3020069826079723e-8,5.253311937372029e-4,3.870065090327242e-5,-1.2977767650741354e-8,5.258593061790778e-4,3.8663123547147846e-5,-1.2957402470289928e-8,5.263931056407179e-4,3.8722437005912813e-5,-1.2962597830659435e-8,5.268994400545242e-4,3.887355383309786e-5,-1.2992693609541672e-8,5.273506944811689e-4,3.909786013135494e-5,-1.304323238147115e-8,5.277283618928682e-4,3.9366737045691754e-5,-1.310693161469982e-8,5.280251104455353e-4,3.964596224958332e-5,-1.3174889451303355e-8,5.282454335082373e-4,3.990022972843365e-5,-1.3237768428264953e-8,5.284052231946588e-4,4.009736888639202e-5,-1.3286836033079106e-8,5.285305494829884e-4,4.021225325537939e-5,-1.3314912562979519e-8,5.286557060394544e-4,4.0230579521206196e-5,-1.3317363974876683e-8,5.288202403339737e-4,4.015271335318547e-5,-1.3293259523465599e-8,5.290641459351538e-4,3.999743645858218e-5,-1.3246644881952389e-8,5.29420183065172e-4,3.980429049478516e-5,-1.3187490243689071e-8,5.299032094367221e-4,3.963165594186321e-5,-1.313141009986588e-8,5.304988417193463e-4,3.9546878333224285e-5,-1.3097054263167734e-8,5.311574317731786e-4,3.96065921173356e-5,-1.3100650126240523e-8,5.318014578119245e-4,3.98319165292681e-5,-1.3149038022273758e-8,5.32349611324718e-4,4.019180005671327e-5,-1.3234910936428494e-8,5.327485204893838e-4,4.0608738174731215e-5,-1.3338177317094923e-8,5.32993774836213e-4,4.098800442554419e-5,-1.3433731281722263e-8,5.331274981533502e-4,4.125409164773492e-5,-1.3501160283562443e-8,5.332164335123858e-4,4.137379163363762e-5,-1.353087213849061e-8,5.333259193608972e-4,4.13576666322837e-5,-1.3524569124303872e-8,5.335024650995162e-4,4.124644008992089e-5,-1.3491904463169542e-8,5.337679129261047e-4,4.109355822924989e-5,-1.3446225415098136e-8,5.341216559001369e-4,4.0951180469202836e-5,-1.340113134321436e-8,5.345463734211426e-4,4.0861572281668134e-5,-1.3368231159593744e-8,5.350143019353962e-4,4.0852955656746325e-5,-1.3355852072504397e-8,5.354928423825327e-4,4.093817556745151e-5,-1.3368381791204466e-8,5.359493976739728e-4,4.111506478866112e-5,-1.3406093750610092e-8,5.363555591240247e-4,4.136805710751307e-5,-1.3465430533373401e-8,5.366906062535734e-4,4.167087291184944e-5,-1.353970510439085e-8,5.369441549435876e-4,4.199017748541348e-5,-1.3620131233801054e-8,5.371176836764395e-4,4.229004758300979e-5,-1.3697055796399448e-8,5.372246939412618e-4,4.2536815840649555e-5,-1.376122922588961e-8,5.372894831724115e-4,4.2703741062777625e-5,-1.3804984921125316e-8,5.373446669618185e-4,4.277512234113474e-5,-1.3823300988072162e-8,0.00053742757544824975,4.27496117961429e-5,-1.3814764582700658e-8,5.375755603610683e-4,4.264248462223457e-5,-1.3782413644499372e-8,5.378200593904353e-4,4.2486472593883745e-5,-1.373430126808111e-8,5.381792508290428e-4,4.233015478549633e-5,-1.368338167500512e-8,5.386499283189473e-4,4.223204705859813e-5,-1.3646059069466792e-8,5.392010226639216e-4,4.224848840771485e-5,-1.3638780125339982e-8,5.397734225659609e-4,4.2415447202705524e-5,-1.3672723821927818e-8,5.402914650870005e-4,4.272937436938092e-5,-1.3748141826012162e-8,5.406870951769552e-4,4.3138228021123006e-5,-1.3851605137995859e-8,5.409276624223462e-4,4.355360016244392e-5,-1.3959259082476329e-8,5.410308634400444e-4,4.388299832113226e-5,-1.404572807505199e-8,5.410560312127462e-4,4.406544519190341e-5,-1.409387560046213e-8,5.410774246421454e-4,4.4090008179269903e-5,-1.4099829500317099e-8,5.411566007764416e-4,4.399025355105983e-5,-1.4071552354515442e-8,5.413273035270495e-4,4.3823916588713976e-5,-1.4023612135435341e-8,5.415945168970027e-4,4.365179453199496e-5,-1.3971835246327046e-8,5.41941678191083e-4,4.3523829968479546e-5,-1.3929763987744986e-8,5.423397870270695e-4,4.3473105445618066e-5,-1.3906988846966135e-8,5.427550475932729e-4,4.3515132910834864e-5,-1.3908697960636151e-8,5.431542404764803e-4,4.364960885200329e-5,-1.393582992804166e-8,5.435083954292767e-4,4.386290135691708e-5,-1.3985503452994463e-8,5.437955680521673e-4,4.413075019834189e-5,-1.4051648813651171e-8,5.440031193610353e-4,4.442130458093591e-5,-1.4125847171957948e-8,5.441294904295869e-4,4.4698775986850106e-5,-1.4198377383350764e-8,5.441851609821107e-4,4.4927902109817414e-5,-1.4259451932272639e-8,5.44192274379237e-4,4.5079042801761985e-5,-1.4300570677415424e-8,5.441825131835359e-4,4.513324877772769e-5,-1.4315854380231034e-8,5.441931678314615e-4,4.508643514283918e-5,-1.4303200161377657e-8,5.442616930190452e-4,4.495182030705989e-5,-1.4265097005812744e-8,5.444193252662113e-4,4.475992062198913e-5,-1.420891194830896e-8,5.446845113517835e-4,4.455563870804244e-5,-1.4146439051286658e-8,5.450570012046475e-4,4.439214140356481e-5,-1.4092482439868092e-8,5.455138259491807e-4,4.432123995689494e-5,-1.4062247519459378e-8,5.460091567979519e-4,4.4380529159655735e-5,-1.4067548181360422e-8,5.464806332929459e-4,4.457933352573298e-5,-1.411246534473196e-8,5.468639351101996e-4,4.488842557502628e-5,-1.41900303462031e-8,5.471137114483806e-4,4.5240836901430264e-5,-1.4282186009332701e-8,5.472228700801882e-4,4.5549104705021665e-5,-1.436459415403402e-8,5.472286408053625e-4,4.573542557700775e-5,-1.4415174862346914e-8,5.471991045330296e-4,4.576046398285103e-5,-1.4422216878027767e-8,5.47206448294467e-4,4.56349055279638e-5,-1.4387623676551349e-8,5.473019740297997e-4,4.5409058585348715e-5,-1.4324164571538933e-8,5.475045890269017e-4,4.5149831126079944e-5,-1.4249406835206891e-8,5.47803705825606e-4,4.4918876045973197e-5,-1.4180002072172085e-8,5.481698176479473e-4,4.4759851057189094e-5,-1.412830013525889e-8,5.48565692247331e-4,4.469494792163449e-5,-1.410125538583461e-8,5.489546078069922e-4,4.4727065395722936e-5,-1.4100722236229494e-8,5.493051789854964e-4,4.484400912140682e-5,-1.4124308082445898e-8,5.495938405083384e-4,4.5022613923846395e-5,-1.4166321890606745e-8,5.498062624304646e-4,4.523222436300298e-5,-1.4218687392005276e-8,5.499384595504489e-4,4.54378852388539e-5,-1.4271863647322725e-8,5.49997724894559e-4,4.560386201037831e-5,-1.4315865288538859e-8,5.500030030438457e-4,4.5697985530979016e-5,-1.434147018981161e-8,5.499839508065228e-4,4.5696843463098964e-5,-1.4341625669559141e-8,5.499779032270899e-4,4.559110119398946e-5,-1.4312908167490931e-8,5.500244181110129e-4,4.5389582007094315e-5,-1.4256724128095877e-8,5.50157883005538e-4,4.512048381923619e-5,-1.417984329569152e-8,5.503995686945172e-4,4.482844257285975e-5,-1.4093882581779136e-8,5.507511242321261e-4,4.456714389146746e-5,-1.4013561269086788e-8,5.511914791808575e-4,4.438847474538031e-5,-1.3953862718354635e-8,5.516785262955729e-4,4.43302010252111e-5,-1.3926532510634918e-8,5.521561635635225e-4,4.4404755979930705e-5,-1.3936611787065186e-8,5.525663239678071e-4,4.459220322119048e-5,-1.3979975801327925e-8,5.528642063231052e-4,4.484065587117192e-5,-1.4043007349154969e-8,5.530328973052125e-4,4.507661529127626e-5,-1.4105288308440919e-8,5.530916519570143e-4,4.522480506594574e-5,-1.4145236907282978e-8,5.530923528858961e-4,4.523202408225343e-5,-1.4147030087645297e-8,5.531031506537776e-4,4.5085084291692684e-5,-1.4105860437065999e-8,5.531855430718504e-4,4.4813819040833696e-5,-1.4028958709191986e-8,5.533755526889687e-4,4.447784879142051e-5,-1.3932084645392354e-8,5.536768815553462e-4,4.41448232435347e-5,-1.3833668292310375e-8,5.540662856310166e-4,4.387093911013423e-5,-1.3749517436350942e-8,5.545054107827476e-4,4.369036706870036e-5,-1.3689826206305373e-8,5.549526056740539e-4,4.3613801028485625e-5,-1.3658542876311258e-8,5.553711420623051e-4,4.363257224331595e-5,-1.3654223719707622e-8,5.55733434845886e-4,4.3724503286497815e-5,-1.3671440617076656e-8,5.560225166865299e-4,4.385919757848827e-5,-1.3702164569045507e-8,5.56232263778228e-4,4.400211587684637e-5,-1.3736921152732457e-8,5.563673733728169e-4,4.4117846392702796e-5,-1.376575922796316e-8,5.564433941300915e-4,4.4173372568585065e-5,-1.3779194966470485e-8,5.564864419333089e-4,4.414206095567587e-5,-1.3769317275568825e-8,5.565317072407061e-4,4.4008603643539826E-05,-1.373115531210439e-8,5.566196665612034e-4,4.377426004116058e-5,-1.3664180386757936e-8,5.567893255742785e-4,4.3460653879901505e-5,-1.3573495648336821e-8,5.5706903259323e-4,4.3109638309396154e-5,-1.3470018373719109e-8,5.574671621600434e-4,4.277713905643178e-5,-1.3369019224232388e-8,5.579663031544923e-4,4.25209069743737e-5,-1.3286905991693288e-8,5.585242506155931e-4,4.2385091814629774e-5,-1.323695369887385e-8,5.590827837639093e-4,4.238670958930531e-5,-1.322532616995296e-8,5.595820943030839e-4,4.2508928121728134e-5,-1.324879527303495e-8,5.599765436803205e-4,4.270375260425213e-5,-1.3295025360336303e-8,5.602470647653046e-4,4.290357624198227e-5,-1.3345467218010926e-8,5.604066433327727e-4,4.3038521618008536e-5,-1.3380135565607916e-8,5.604971361354452e-4,4.305496671614097e-5,-1.3382982052173816e-8,5.605778644400599e-4,4.293002467591174e-5,-1.3346289025681776e-8,5.607089623263255e-4,4.267729978794635e-5,-1.3272636519098559e-8,5.609347399582315e-4,4.234165410834814e-5,-1.3173718674744843e-8,5.61272824224999e-4,4.1984822487049506e-5,-1.3066489427049024e-8,5.617125088503604e-4,4.1667542738988164e-5,-1.2968201743518012e-8,5.622215885905281e-4,4.1434866394617e-5,-1.289219032748799e-8,5.627575830200749e-4,4.130882130901546e-5,-1.2845587660872705e-8,5.632786025023382e-4,4.1288594336048484e-5,-1.2829102735199409e-8,5.637508743402848e-4,4.135555763250854e-5,-1.2838217765699319e-8,5.641523616550949e-4,4.147987966628914e-5,-1.2864954028178306e-8,5.644734987008431e-4,4.1626480056051095e-5,-1.2899567931198906e-8,5.647164882240774e-4,4.1759528984558676e-5,-1.2931887162585448e-8,5.648942535231952e-4,4.184578296212132e-5,-1.2952297818560158e-8,5.650294889116143e-4,4.1857547900959665e-5,-1.2952577895423737e-8,5.651535715361088e-4,4.177605896823371e-5,-1.2926828568155383e-8,5.653044894483615e-4,4.159567182824132e-5,-1.287267633441649e-8,5.655225692094629e-4,4.132839759346974e-5,-1.279266224815386e-8,5.658430328778544e-4,4.100697766475647e-5,-1.2695307297663935e-8,5.662857653330005e-4,4.068344030322492e-5,-1.2594934042639526e-8,5.668451659124272e-4,4.042019197207262e-5,-1.2509327194232984e-8,5.674853336557398e-4,4.027347907363591e-5,-1.2455107328985577e-8,5.681455713211361e-4,4.027408208489247e-5,-1.244214622307206e-8,5.68756746685192e-4,4.0414004798879e-5,-1.2469513131187434e-8,5.692626340933667e-4,4.0646580039138516e-5,-1.2525133623159566e-8,5.696369955166504e-4,4.090066807453131e-5,-1.2589478046435055e-8,5.698896665275624e-4,4.110245921092196e-5,-1.2641551835441664e-8,5.700608716068607e-4,4.1195953729986446e-5,-1.2664715990718236e-8,5.702077505850598e-4,4.1155798139361454e-5,-1.2650540717421748e-8,5.703884759901265e-4,4.099042424392756e-5,-1.2600051493450478e-8,5.706483903579017e-4,4.073662588412746e-5,-1.2522583891047876e-8,5.710109691405875e-4,4.0448332338844876e-5,-1.243290518949643e-8,5.714748841309391e-4,4.0182934684654553E-05,-1.2347452802728689e-8,5.720170435890389e-4,3.9988544477136714e-5,-1.2280615128135358e-8,5.726001321744273e-4,3.9895057969472874e-5,-1.2241921421025485e-8,5.731821206679281e-4,3.991064069654339e-5,-1.2234717623019245e-8,5.737250198595423e-4,4.002343402058786e-5,-1.2256397133360156e-8,5.742009861844149e-4,4.0206784374766535e-5,-1.2299779958393722e-8,5.745952088943357e-4,4.042579305071043e-5,-1.2355009254206567e-8,5.749061274942017e-4,4.064339540438695e-5,-1.2411383146639144e-8,5.751440773201222e-4,4.0825069665894794e-5,-1.2458778726029885e-8,5.753293799587323e-4,4.094221059405223e-5,-1.2488629625521792e-8,5.754904006567578e-4,4.097477176506438e-5,-1.2494646793562146e-8,5.756615125629631e-4,4.0913864151746437e-5,-1.2473547362790684e-8,5.758803459554417e-4,4.076472695839921e-5,-1.24259847650868e-8,5.761832436211499e-4,4.0549772255380785e-5,-1.2357617600292305e-8,5.765979379808243e-4,4.0310124351701156e-5,-1.2279811549458918e-8,5.771336876089873e-4,4.010269549721812e-5,-1.2209012413795871e-8,5.777716895829274e-4,3.9989598090760646e-5,-1.2163757626176808e-8,5.784616465902294e-4,4.001937776225071e-5,-1.2159125570823381e-8,5.791308482835355e-4,4.020580099469462e-5,-1.2200322952745242e-8,5.797065295022585e-4,4.0515899636114696e-5,-1.2278907274980914e-8,5.80142457888133e-4,4.087731150446172e-5,-1.2374661952472232e-8,5.804354401798264e-4,4.120363917341638e-5,-1.2462792256088949e-8,5.806232139856671e-4,4.142456024104346e-5,-1.2522577976320966e-8,5.807671988462954e-4,4.1505812543823224e-5,-1.2543184545504214e-8,5.809309310098887e-4,4.145299058481706e-5,-1.2524943479233836e-8,5.811633911987712e-4,4.130273058000135e-5,-1.2477155055317291e-8,5.814906054594975e-4,4.110843349549538e-5,-1.241437134424403e-8,5.819145513730104e-4,4.092617541810449e-5,-1.2352610977888855e-8,5.824169208822125e-4,4.0803658015597504e-5,-1.2306198503680667e-8,5.829655041898003e-4,4.077300848955851e-5,-1.2285457641107754e-8,5.835216304790936e-4,4.08473506951388e-5,-1.2295353076190144e-8,5.840475044047213e-4,4.1020878040647856e-5,-1.2335168157344423e-8,5.845123946407954e-4,4.1271912795883656e-5,-1.2399194688289209e-8,5.848968676341912e-4,4.1568009920163966e-5,-1.247819580484653e-8,5.851947152164219e-4,4.1871931312817365e-5,-1.2561243079423654e-8,5.854127287371877e-4,4.214737362730478e-5,-1.2637501168654626e-8,5.855689082537816e-4,4.236363657066199e-5,-1.2697641820982583e-8,5.856898580934266e-4,4.2498978178316354e-5,-1.2734800220127118e-8,5.85807889067023e-4,4.254292268264029e-5,-1.2745207957826337e-8,5.859579513795578e-4,4.249795347224145e-5,-1.272871639020561e-8,5.861741086786202e-4,4.2380895742717424e-5,-1.2689360718495551e-8,5.8648484953241e-4,4.2223796026970555e-5,-1.2635890084310931e-8,5.869065735812319e-4,4.2073073991807874e-5,-1.2581801894459312e-8,5.874356319421588e-4,4.19846475120227e-5,-1.2544061137121026e-8,5.880413756125081e-4,4.201259995003142e-5,-1.2539678227518325e-8,5.886653049404993e-4,4.219108683589354e-5,-1.2580052638216501e-8,5.8923238679551e-4,4.2514839582835756e-5,-1.266480189970253e-8,5.896756386652956e-4,4.2930283800824865e-5,-1.2778839288959433e-8,5.89964101552167e-4,4.334851356362142e-5,-1.2896139522771572e-8,5.901171113360668e-4,4.367814905014522e-5,-1.298951948589008e-8,5.901947880698806e-4,4.38602737483596e-5,-1.3040992057450742e-8,5.902714285460607e-4,4.3885736496831144e-5,-1.3046861211874255e-8,5.904086373518427e-4,4.3789236335983746e-5,-1.3016096632518927e-8,5.90640488345573e-4,4.362965960038413e-5,-1.2964884842237333e-8,5.90971946441086e-4,4.34695603945582e-5,-1.2911008855333938e-8,5.913852195337234e-4,4.336092270372908e-5,-1.2869904121306538e-8,5.918485774305888e-4,4.333812126088688e-5,-1.285252461742886e-8,5.923245446952727e-4,4.3416150897318016e-5,-1.2864501648532461e-8,5.927764593066211e-4,4.359190961413261e-5,-1.2906114467297666e-8,5.931734732856898e-4,4.384714236114294e-5,-1.2972841846778543e-8,5.934942150203255e-4,4.4152466088083324e-5,-1.3056421398296158e-8,5.937291030815587e-4,4.447215885443439e-5,-1.3146311817982143e-8,5.938811933955622e-4,4.47693426906656e-5,-1.3231356330999967e-8,5.93965485886057e-4,4.5011077674093984e-5,-1.3301399351245954e-8,5.94006799600864e-4,4.5172770496475155e-5,-1.334862131885749e-8,5.940365840398179e-4,4.5241413682133494e-5,-1.336846818500244e-8,5.940891110207756e-4,4.521750624615486e-5,-1.3360212923084611e-8,5.941973595900601e-4,4.511571456359875e-5,-1.3327250246980502e-8,5.943887128092454e-4,4.4964352725929755e-5,-1.3277177720368145e-8,5.946803298205737e-4,4.480359021479988e-5,-1.3221572693952441E-08,5.950740552025116e-4,4.4681698944798734e-5,-1.3175121289205661e-8,5.955515209880322e-4,4.4648007751150914e-5,-1.3153551831570361e-8,5.960715426732222e-4,4.474149532569575e-5,-1.3169977028198143e-8,5.965733804112413e-4,4.4975795704802126e-5,-1.3229934760324216e-8,5.969897334847129e-4,4.5325368620618036e-5,-1.3326761651752678e-8,5.972695820723137e-4,4.572244176421522e-5,-1.3440440521292401e-8,5.974020923934746e-4,4.607385900358259e-5,-1.3542760448690568e-8,5.974260041454101e-4,4.6295468638069834e-5,-1.3607887991505155e-8,5.974149745012774e-4,4.63461491160932e-5,-1.3622690856111841e-8,5.974464645346873e-4,4.62408255489987e-5,-1.3590608456208522e-8,5.975733330563519e-4,4.603711609863486e-5,-1.3527729382284185e-8,5.978120949073726e-4,4.5808229996933905e-5,-1.3455010772294891e-8,5.981476506938362e-4,4.561887790575258e-5,-1.3391473757723922e-8,5.985457456463102e-4,4.551241536514983e-5,-1.3350535217826406e-8,5.989652880636257e-4,4.550820785410715e-5,-1.3339057205444769e-8,5.993671400674556e-4,4.560473672048171e-5,-1.3357888193002322e-8,5.997192571010954e-4,4.578464443118222e-5,-1.340296607210915e-8,5.999993638835912e-4,4.601975491101805e-5,-1.3466562670281527e-8,6.001963194062474e-4,4.627562551405624e-5,-1.353859250547407e-8,6.003106951839153e-4,4.651585668922163e-5,-1.3607999789540018e-8,6.003545828554706e-4,4.670640694476506e-5,-1.3664190858733449e-8,6.003504102879558e-4,4.681993271445912e-5,-1.3698426655564152e-8,6.003285040062579e-4,4.6839792267256964e-5,-1.3705039077842174e-8,6.003233654665366e-4,4.6763054815347505e-5,-1.3682318721009288e-8,6.00368980029104e-4,4.6601915443853456e-5,-1.3632979669015082e-8,6.004936892972919e-4,4.638313791509782e-5,-1.3564152706925421e-8,6.007152397239569e-4,4.6145339984406526e-5,-1.348684271745055e-8,6.010365913857648e-4,4.5934168128419516e-5,-1.3414767746104295e-8,6.014429942225124e-4,4.5795480210201754e-5,-1.3362464203894209e-8,6.019011057532637e-4,4.576653383496385e-5,-1.334252963495435e-8,6.023615895275835e-4,4.586559553492988e-5,-1.3362105344807452e-8,6.027669935205449e-4,4.608188309838632e-5,-1.3419300705541302e-8,6.030658883371729e-4,4.6370003546858796e-5,-1.350105745458068e-8,6.032312519987232e-4,4.66548633865428e-5,-1.3584497719127712e-8,6.032758091670896e-4,4.685133527899667e-5,-1.3643100300052348e-8,6.032535495762095e-4,4.6894725810143705e-5,-1.365628640799527e-8,6.03241729155245e-4,4.6767362660908595e-5,-1.3617683021674188e-8,6.033108166392385e-4,4.65049510596044e-5,-1.3537085025814027e-8,6.034993182490741e-4,4.617895985207165e-5,-1.3435213551070888e-8,6.038060843341433e-4,4.5867317225684895e-5,-1.3335114749071355e-8,6.041994185155103e-4,4.563018257654167e-5,-1.3255104395874068e-8,6.046332663829588e-4,4.549926714185694e-5,-1.3205572436516151e-8,6.05061438746373e-4,4.5478931464839044e-5,-1.3189054107180226e-8,6.054462336936745e-4,4.555306960662015e-5,-1.3201909329785792e-8,6.05762009514742e-4,4.5692876070382345e-5,-1.3236331295070042e-8,6.059957599659084e-4,4.586321651672058e-5,-1.3282117826334546e-8,6.061465022300673e-4,4.6027351570760987e-5,-1.332813231699191e-8,6.062243702543427e-4,4.615066462844048e-5,-1.3363565264245378e-8,6.062495021200464e-4,4.620409516581872e-5,-1.3379104609315037e-8,6.062503718534889e-4,4.616766157689615e-5,-1.3368067825864579e-8,6.062610395188557e-4,4.6033924576426214e-5,-1.3327457601791911e-8,6.063169469718518e-4,4.581063544655485e-5,-1.3258772884036288e-8,6.064494044595206e-4,4.55215188896636e-5,-1.3168331958415403e-8,6.066795318747286e-4,4.52042881604833e-5,-1.3066866709055663e-8,6.070128998625647e-4,4.490545427349359e-5,-1.2968213330564991e-8,6.074363111856063e-4,4.467226793872749e-5,-1.2887087372606102e-8,6.079179098524724e-4,4.4543009907630994e-5,-1.2836174421477544e-8,6.084112436310817e-4,4.453736700212919e-5,-1.282297992625794e-8,6.08863370461571e-4,4.464886329443632e-5,-1.2847073663286673e-8,6.092264758703546e-4,4.4841679024146196e-5,-1.289860746681526e-8,6.094712937410751e-4,4.505445305432866e-5,-1.2959127922180999e-8,6.095987972448405e-4,4.521292039621171e-5,-1.3005410854173592e-8,6.096448764943399e-4,4.5250510079934645e-5,-1.3016030794821033e-8,6.096730138384927e-4,4.513114561506076e-5,-1.2978711001202054e-8,6.097545631549566e-4,4.486402580498518e-5,-1.2895124516848801e-8,6.099439852908066e-4,4.450134061490781e-5,-1.2780348513948726e-8,6.102610819546051e-4,4.4118743907326676e-5,-1.265702267633818e-8,6.106884949894511e-4,4.378880296374916e-5,-1.2547376438516559e-8,6.111831302385094e-4,4.356052924504412e-5,-1.2467023709897674e-8,6.116930853079845e-4,4.3451843285146805e-5,-1.2422507196552202e-8,6.121718091847651e-4,4.3453283807383274e-5,-1.2412110270198072e-8,6.125859229567852e-4,4.3537061943772174e-5,-1.242828767855344e-8,6.129174051327997e-4,4.3666315988779066e-5,-1.2460290569013057e-8,6.131625421240779e-4,4.380214478201701e-5,-1.249629588729844e-8,6.133297797994605e-4,4.390824915390768e-5,-1.2524935334363993e-8,6.134376059320164e-4,4.395405443660182e-5,-1.2536392208869133e-8,6.135126429920539e-4,4.391729178049016e-5,-1.2523285610369912e-8,6.135875232541355e-4,4.37866565556534e-5,-1.248151062142838e-8,6.136978474050366e-4,4.3564553195397556e-5,-1.2411078877572878e-8,6.138776204707606e-4,4.3269171658970975e-5,-1.2316794930864575e-8,6.141531157431434e-4,4.293451537346142e-5,-1.2208394276352459e-8,6.145360882992824e-4,4.260690395661579e-5,-1.2099680577646451e-8,6.150183068876578e-4,4.233718420343913e-5,-1.2006354865178858e-8,6.155698862543469e-4,4.216944569007125e-5,-1.194266561911202e-8,6.161432780116315e-4,4.212893829735594e-5,-1.191760894514987e-8,6.166829962369822e-4,4.221304211145604e-5,-1.1931838226690434e-8,6.171390028809723e-4,4.2388733189199025e-5,-1.1976435073662864e-8,6.174801786565707e-4,4.2598204728411776e-5,-1.2034228597516467e-8,6.177039713164523e-4,4.2771969148489644e-5,-1.2083631887323418e-8,6.178390324477566e-4,4.284658717591776e-5,-1.2104190944765916e-8,6.179391490155112e-4,4.2782467541547576e-5,-1.2082381407395732e-8,6.180690499519215e-4,4.257622589977647e-5,-1.2015807665370394e-8,6.182856981106309e-4,4.2262641290182364e-5,-1.1914142478848567e-8,6.186214061728539e-4,4.1904306638940616e-5,-1.1796159869780265e-8,6.190753692770967e-4,4.1572254817565175e-5,-1.168386155567887e-8,6.196167242703293e-4,4.1325277041778395e-5,-1.1596058210408694e-8,6.201967488488639e-4,4.119594759437842e-5,-1.1543865254199268e-8,6.20764019662867e-4,4.118716574602068e-5,-1.1529328261415304e-8,6.21276549030351e-4,4.127757978552318e-5,-1.154678533548196e-8,6.217080946567695e-4,4.143120927489927e-5,-1.1585638643255654e-8,6.220491812385284e-4,4.1606888823869886e-5,-1.1633240123016763e-8,6.223049974865838e-4,4.176527688606243e-5,-1.1677161479087305e-8,6.224922388533137e-4,4.1873203335198556e-5,-1.1706688765447071e-8,6.226360955927154e-4,4.1906205539858945e-5,-1.1713717885084007e-8,6.227676718629662e-4,4.185030251602371e-5,-1.1693341505436549E-08,6.229214415278793e-4,4.1703735041523074e-5,-1.1644381723185078e-8,6.231319853664534e-4,4.147878640125714e-5,-1.1569970337746821e-8,6.234292802965761e-4,4.120299476324085e-5,-1.1478018587251494e-8,6.238323413543623e-4,4.0918246606836314e-5,-1.1381111507640178e-8,6.243421835840833e-4,4.067585345858345e-5,-1.1295177991775304e-8,6.249366570621865e-4,4.052646987191822e-5,-1.1236482520549367e-8,6.255707246045346e-4,4.0506051125566727e-5,-1.1217220872998886e-8,6.261847863392266e-4,4.062225481812146e-5,-1.124105993740093e-8,6.267202336075681e-4,4.08475845493812e-5,-1.1300642714626034e-8,6.271371716095217e-4,4.112393555640522e-5,-1.1378640363826194e-8,6.274272002337375e-4,4.137818217173511e-5,-1.1452374173663731e-8,6.276160661029025e-4,4.1543172110683946e-5,-1.1500321761911784e-8,6.277555903893943e-4,4.157642470580568e-5,-1.1508102924530854e-8,6.27908422691926e-4,4.147064598947023e-5,-1.1472061584588963e-8,6.281309101857208e-4,4.125382444025051e-5,-1.1399670417759892e-8,6.284589806615875e-4,4.0979990293322234e-5,-1.1307001676311571e-8,6.289004951050204e-4,4.071397673517665e-5,-1.1214196847662963e-8,6.294355537344494e-4,4.051475934856745e-5,-1.1140281814471427e-8,6.300239373611482e-4,4.0422039237037176e-5,-1.1098767800734435e-8,6.306167817204206e-4,4.044943019418976e-5,-1.1095165829009265e-8,6.311685570877783e-4,4.058515042629986e-5,-1.1126836428171848e-8,6.316459742628735e-4,4.079850842401508e-5,-1.1184776656645354e-8,6.320322305868174e-4,4.104897677346346e-5,-1.1256406714476454e-8,6.323269912046183e-4,4.129481071708473e-5,-1.1328374881368757e-8,6.325436800244089e-4,4.149944694038418e-5,-1.138873428162963e-8,6.327057717418874e-4,4.16353572641571e-5,-1.142829124798009e-8,6.3284320211077e-4,4.168599958414399e-5,-1.144127484924841e-8,6.329892507073682e-4,4.1646813714983565e-5,-1.1425641935138297e-8,6.331776221375067e-4,4.1525972124440285e-5,-1.1383308731724334e-8,6.334390698103364e-4,4.134505386970275e-5,-1.1320431548573354e-8,6.337968406765966e-4,4.1139068109295805e-5,-1.1247577530122925e-8,6.342606793062239e-4,4.0954382499360176e-5,-1.1179279984573037e-8,6.34820349377044e-4,4.084256691331992e-5,-1.1132243894526839e-8,6.354414692002509e-4,4.084884439949683e-5,-1.1121682761778917e-8,6.360679001502076e-4,4.0996568100376256e-5,-1.1156195968997953e-8,6.366339468110234e-4,4.1273455162251384e-5,-1.1233067444498262e-8,6.370847593082296e-4,4.162814226045832e-5,-1.1336844237008164e-8,6.37396720814852e-4,4.1982708229566924e-5,-1.1443112874876232e-8,6.375870858518857e-4,4.225789061658065e-5,-1.1526456467575253e-8,6.377074182492132e-4,4.239935949578947e-5,-1.1568844891267493e-8,6.378247532323368e-4,4.239301187350808e-5,-1.1564617122042744e-8,6.380001550354765e-4,4.226467189936685e-5,-1.1520634437041544e-8,6.382730696351323e-4,4.20678159364482e-5,-1.145275407366425e-8,6.386547983664781e-4,4.186642207611976e-5,-1.1380759726833166e-8,6.391301491825187e-4,4.1718969727590826e-5,-1.1323481608403951e-8,6.396645134501095e-4,4.16669354931265E-05,-1.1295058824572489e-8,6.402135211432802e-4,4.1728883630486846e-5,-1.130272523179324e-8,6.407329313863037e-4,4.189994975384543e-5,-1.1346210158588048e-8,6.411869273337647e-4,4.215579668992807e-5,-1.141864418294653e-8,6.415535317098374e-4,4.245951292741821e-5,-1.1508603446175233e-8,6.418266451670236e-4,4.276953906141313e-5,-1.160268944345754e-8,6.420150711981394e-4,4.3046889911181794e-5,-1.168800792468656e-8,6.42139481568027e-4,4.326056338850396e-5,-1.1754073581974093e-8,6.422284650134046e-4,4.3390762964130205e-5,-1.1793939423120785e-8,6.423145863944254e-4,4.343025232088572e-5,-1.1804643333497793e-8,6.424308611712833e-4,4.3384560725109035e-5,-1.1787259369334247e-8,6.426075271147033e-4,4.327164998942055e-5,-1.1746830998873365e-8,6.428686772623222e-4,4.312121499188235e-5,-1.1692290186969063e-8,6.43228211111064e-4,4.297319789412587e-5,-1.163620160738782e-8,6.436849034127897e-4,4.2874338512484316e-5,-1.1593853762600689e-8,6.442175178239869e-4,4.287106863696716e-5,-1.1581024865378009e-8,6.447826241944376e-4,4.299769946587701e-5,-1.1610003778983072e-8,6.453192106631316e-4,4.326148989808878e-5,-1.1684410461728622e-8,6.457633643151136e-4,4.363072674477005e-5,-1.179495428359945e-8,6.460709780358178e-4,4.403539258500074e-5,-1.1919425251124777e-8,6.46238269440531e-4,4.438654427814625e-5,-1.202896701159812e-8,6.463067360377512e-4,4.460863357575101e-5,-1.2098638955452586e-8,6.463473522053487e-4,4.466782983677177e-5,-1.2116629130642991e-8,6.464328198700985e-4,4.458091988511223e-5,-1.2087172530117929e-8,6.466134080396352e-4,4.440296244483021e-5,-1.2026767218001455e-8,6.469062893985017e-4,4.420432212394621e-5,-1.1957162905655501e-8,6.472980673486538e-4,4.4049415375376975e-5,-1.1898899064049858e-8,6.477545569824074e-4,4.398348465637827e-5,-1.1867178141227173e-8,6.482321283936542e-4,4.402769158632383e-5,-1.1870077472484313e-8,6.486874451684293e-4,4.4180110616365914e-5,-1.190843181001741e-8,6.490845942283705e-4,4.442004791255551e-5,-1.1976767655848106e-8,6.493996674170178e-4,4.471399475420608e-5,-1.2064930829832403e-8,6.496230132730473e-4,4.502224997790057e-5,-1.2160170877601224e-8,6.497593165315699e-4,4.530541463222377e-5,-1.2249376594925378e-8,6.498257985589669e-4,4.5530023897967826e-5,-1.2321106524374785e-8,6.498490150835266e-4,4.5672787320462324e-5,-1.2367125184429808e-8,6.49860849248668e-4,4.5723111388483726e-5,-1.2383285624306336e-8,6.498943459428724e-4,4.56838734642481e-5,-1.2369777794004631e-8,6.499798483583396e-4,4.5570805788698724e-5,-1.2330940194194202e-8,6.50141540921297e-4,4.5410946737608354e-5,-1.2274858062634918e-8,6.50394252361549e-4,4.524034632505981e-5,-1.2212820673742356e-8,6.507402898474811e-4,4.510081644081227e-5,-1.2158498221920027e-8,6.511662941424877e-4,4.503501619399875e-5,-1.2126476181320007e-8,6.516409652377725e-4,4.507883196177047e-5,-1.2129687005367259e-8,6.521158333795178e-4,4.525065636203942e-5,-1.2175577965498676e-8,6.525322031476455e-4,4.553941364164363e-5,-1.2261726884082065e-8,6.528365381010586e-4,4.5896913451435045e-5,-1.2372957541494924e-8,6.53001864278318e-4,4.6243075736359524e-5,-1.2482966177543175e-8,6.530450153429226e-4,4.6489294263523875e-5,-1.2562182212005331e-8,6.530262302326049e-4,4.657300931178719e-5,-1.2589338662501737e-8,6.530266241761063e-4,4.6484341852986244e-5,-1.2560253186849565e-8,6.531153745404709e-4,4.626789168937222e-5,-1.248839206681805e-8,6.533259500794602e-4,4.600025166059354e-5,-1.2397689341809364e-8,6.536518626923442e-4,4.5759473698595974e-5,-1.2312978138197302e-8,6.540578644141293e-4,4.56028117197643e-5,-1.2253084886290816e-8,6.544960449519266e-4,4.555825704891566e-5,-1.222809841334969e-8,6.549192256583115e-4,4.562646405711048e-5,-1.2239671643138295e-8,6.552892641813089e-4,4.578752220519903e-5,-1.2282737836356728e-8,6.555809511761707e-4,4.6008638879196065e-5,-1.23475952409882e-8,6.557831063329746e-4,4.625097547136351e-5,-1.2421941128098137e-8,6.558981448308248e-4,4.647540239116749e-5,-1.2492798538365653e-8,6.559406151232579e-4,4.664739366488725e-5,-1.2548313680324879e-8,6.55934795368779e-4,4.674108669115587e-5,-1.2579299722569738e-8,6.559114262674878e-4,4.674234926529412e-5,-1.258037528172128e-8,6.559037475636952e-4,4.6650576798607184e-5,-1.2550589153337167e-8,6.559431799480559e-4,4.647890047352641e-5,-1.2493483386171588e-8,6.560551490320222e-4,4.625272895401807e-5,-1.241665830734056e-8,6.562554736211841e-4,4.6006843480568736e-5,-1.2330965549949725e-8,6.565475621712678e-4,4.5781298533340715e-5,-1.224938677601268e-8,6.569205673771478e-4,4.561626701972796e-5,-1.2185538559539806e-8,6.573487109405446e-4,4.554580590585966e-5,-1.2151659149246088e-8,6.577924153502072e-4,4.5590415220543125e-5,-1.215594635662814e-8,6.58202593113294e-4,4.574881097857109e-5,-1.2199412084801173e-8,6.585297262397721e-4,4.59909687918636e-5,-1.2273096298199133e-8,6.587382425042407e-4,4.62568085760598e-5,-1.2357324481940705e-8,6.588231495329708e-4,4.646624084061321e-5,-1.2425073606254522e-8,6.588204978599106e-4,4.65431768960108e-5,-1.2450244405357208e-8,6.588012287440477e-4,4.644637290291428e-5,-1.2418191579088436e-8,6.588458419334591e-4,4.61899779128904e-5,-1.2332619928155143e-8,6.590119357198074e-4,4.5838877755827045e-5,-1.2214031205022718e-8,6.593137391720427e-4,4.548068499544168e-5,-1.2090617955505468e-8,6.597236153319567e-4,4.519227164557173e-5,-1.1987544773090963e-8,6.601895628610029e-4,4.5018724180246425e-5,-1.1920237507966108e-8,6.606554423138694e-4,4.49697296954195e-5,-1.189308702067798e-8,6.610749674083071e-4,4.502738150794323e-5,-1.1901620274760557e-8,6.614178803084616e-4,4.515738862713096e-5,-1.1935726383931564e-8,6.616706357616994e-4,4.531887849385159e-5,-1.1982572911828448e-8,6.61834447382716e-4,4.547133072107415e-5,-1.2028824379413137e-8,6.6192264137107e-4,4.5579126378920714e-5,-1.2062283892577649e-8,6.619580115031964e-4,4.561475770029697e-5,-1.2073180904243843e-8,6.619700433900955e-4,4.556135838574398e-5,-1.2055197467963607e-8,6.61991699576438e-4,4.5414661343623503e-5,-1.200620365179172e-8,6.620555712945934e-4,4.51840896179602e-5,-1.1928622796913211e-8,6.621894741458482e-4,4.489240920507422e-5,-1.182931385336294e-8,6.624119923538018e-4,4.457342997377879e-5,-1.1718880084197724e-8,6.627287685916333e-4,4.4267655432898346e-5,-1.1610397059841187e-8,6.631303288208212e-4,4.401622188040044e-5,-1.1517614629584648e-8,6.635920520441031e-4,4.3853814799379214e-5,-1.1452739383809711e-8,6.640766309640293e-4,4.3801500136949246e-5,-1.1423990223408127e-8,6.645391547065707e-4,4.3860465762502585e-5,-1.1433213609765761e-8,6.649348907757294e-4,4.400781803244625e-5,-1.1474022268078109e-8,6.652295738743438e-4,4.4196208170768975e-5,-1.1531237312247409e-8,6.654109062286146e-4,4.435975285734818e-5,-1.1582666541464982e-8,6.654978651706966e-4,4.442827675775156e-5,-1.1603994416442983e-8,6.655421492594667e-4,4.434891282437948e-5,-1.1576365369570233e-8,6.656163939754637e-4,4.410816482066763e-5,-1.1494114352982963e-8,6.657897957674164e-4,4.3742356818358154e-5,-1.136844192019311e-8,6.661014873919342e-4,4.332714263267976e-5,-1.1223980436229123e-8,6.66546435586102e-4,4.294919512763321e-5,-1.1089453851181167e-8,6.670813088959861e-4,4.267547632709114e-5,-1.0987569771282318e-8,6.676444956798761e-4,4.2535713727573955e-5,-1.0929181332560628e-8,6.681774843805674e-4,4.252258156620681e-5,-1.0913107238000703e-8,6.686384044883153e-4,4.260325002735994e-5,-1.0929587800350869e-8,6.690062161390295e-4,4.2733346818073974e-5,-1.0964592948012124e-8,6.692787368457985e-4,4.286787118068754e-5,-1.1003310653399214e-8,6.694682707915127e-4,4.296777011126571e-5,-1.1032406940396475e-8,6.695972389198812e-4,4.300322240539698e-5,-1.1041321064106932e-8,6.696946149272839e-4,4.295523829967347e-5,-1.1023008875669534e-8,6.697929196037282e-4,4.2816698354687566e-5,-1.0974419442589062e-8,6.699251733474295e-4,4.2593196764431914e-5,-1.0896807753560433e-8,6.701212865700194e-4,4.230341044442153e-5,-1.0795842637994127e-8,6.704037174690174e-4,4.1978221761531796e-5,-1.0681328919295532e-8,6.707828559139265e-4,4.1657672615155404e-5,-1.0566288547495148e-8,6.712532690016723e-4,4.138524242901553e-5,-1.0465216530512158e-8,6.717922865944109e-4,4.119981360746378e-5,-1.0391550497627238e-8,6.723621835534646e-4,4.112674104581725e-5,-1.0354712996658229e-8,6.729163674503193e-4,4.117028254115718e-5,-1.0357404924622589e-8,6.734087601805087e-4,4.1309743555585105e-5,-1.0393953428156289e-8,6.738045432664134e-4,4.150094656252346e-5,-1.0450378613876328e-8,6.740899326696811e-4,4.168357203370962e-5,-1.0506544084907395e-8,6.742784623792691e-4,4.1793849405908306e-5,-1.0540362360195925e-8,6.744112537778521e-4,4.178074134045985e-5,-1.053345924363471e-8,6.745493044657425e-4,4.1621948675312874e-5,-1.0476951591107518e-8,6.747577135709221e-4,4.1334207987166106e-5,-1.0375304924468307e-8,6.750854372839487e-4,4.097200972504231e-5,-1.0246168788815136e-8,6.755482329271165e-4,4.0612262569480024e-5,-1.0115334350837037e-8,6.761231653952755e-4,4.032957409188221e-5,-1.0008413784011982e-8,6.767578521833027e-4,4.017301604488647e-5,-9.94290139609733e-9,6.773894310269758e-4,4.015465619698559e-5,-9.924065754328441e-9,6.779636072244319e-4,4.025271194279116e-5,-9.945684323589636e-9,6.784462992592076e-4,4.042426218751692e-5,-9.994032077050076e-9,6.788262531519046e-4,4.0619750895181834e-5,-1.0052621713449427e-8,6.791114670866537e-4,4.0793953317949755e-5,-1.0105937498144301e-8,6.793233103813246e-4,4.091197852871128e-5,-1.0141630257049476e-8,6.794909850969935e-4,4.0951453051865014e-5,-1.01514585939184e-8,6.7964728168145e-4,4.090274064307937e-5,-1.0131510062344522e-8,6.798254076015645e-4,4.076859742149239e-5,-1.0082138915684628e-8,6.800561699820016e-4,4.0563850495158245e-5,-1.0007849266961698e-8,6.8036477449427e-4,4.031492566409186e-5,-9.917132870207206e-9,6.807668440871827e-4,4.0058407100975396e-5,-9.822042726828585e-9,6.812639721347429e-4,3.98374389784475e-5,-9.737104678895134e-9,6.818400995093161e-4,3.9695020030860256e-5,-9.677186556046806e-9,6.824608377364019e-4,3.966437272967973e-5,-9.65429089058683e-9,6.830778514977682e-4,3.975846050622824e-5,-9.673896804332269e-9,6.8363893699842e-4,3.996251016407234e-5,-9.732153955509115e-9,6.841017372567231e-4,4.023361206932423e-5,-9.815394137449953e-9,6.844466228191916e-4,4.05092582535884e-5,-9.902727164968086e-9,6.846838738110617e-4,4.072297495515305e-5,-9.971213593928136e-9,6.848523051199315e-4,4.082220466885166e-5,-1.000201594026922e-8,6.850095982123903e-4,4.07828469698932e-5,-9.98560223372568e-9,6.852171873960667e-4,4.0616222783899834e-5,-9.924483469796086e-9,6.855238737488718e-4,4.036653532224773e-5,-9.832728989987601e-9,6.859526224257744e-4,4.00993290741107e-5,-9.732322816114245e-9,6.86494446675017e-4,3.988386503340198e-5,-9.647264291981038e-9,6.871115650576727e-4,3.977452661168896e-5,-9.597109977300679e-9,6.877489646437295e-4,3.979728759741124e-5,-9.592045225736865e-9,6.883501673843535e-4,3.994563772478752e-5,-9.631095222420986e-9,6.888714062386018e-4,4.018638516815171e-5,-9.70376889018204e-9,6.89289773006254e-4,4.047168422173579e-5,-9.79400284884246e-9,6.896042371432542e-4,4.075196513064055e-5,-9.884614283434994e-9,6.898314601928995e-4,4.0985699460782386e-5,-9.960814485912439e-9,6.899994707481199e-4,4.114457896454388e-5,-1.0012195088317796e-8,6.901416346331935e-4,4.1214864630885974e-5,-1.0033353714839723e-8,6.902920197616812e-4,4.119656099349532e-5,-1.0023683572674945e-8,6.904821165138293e-4,4.1101881144250444e-5,-9.986848350330236e-9,6.907382638650003e-4,4.09537582206849e-5,-9.930264533573738e-9,6.910790024415842e-4,4.0784383529647454e-5,-9.864646068425661e-9,6.915118287645734e-4,4.06330723894299e-5,-9.803388502339166e-9,6.92029478921974e-4,4.054225759251511e-5,-9.761330963984282e-9,6.926069404711696e-4,4.055042383207215e-5,-9.752392841996608e-9,6.93201577440324e-4,4.068187369966381e-5,-9.785963135087253e-9,6.937591702126083e-4,4.0935603885594335e-5,-9.86281521804032e-9,6.942270330740719e-4,4.1278405821690475e-5,-9.972398042232453e-9,6.945712632534799e-4,4.164815702606528e-5,-1.0093706764041374e-8,6.947908016139201e-4,4.196965425274466e-5,-1.0200641875276863e-8,6.949204861200494e-4,4.217816671559534e-5,-1.027018519806173e-8,6.950204845917e-4,4.2240436893643125e-5,-1.0289782773011855e-8,6.951568783835051e-4,4.2163991349505506e-5,-1.0260761389728324e-8,6.953820071952732e-4,4.1992296890793167e-5,-1.0196951522017627e-8,6.957214881833488e-4,4.1789873918597023e-5,-1.0119904592446122e-8,6.961704254910497e-4,4.162399139921554e-5,-1.0052855248199617e-8,6.966977464138914e-4,4.154851515582117e-5,-1.0015196278929336e-8,6.972559483814732e-4,4.159322790104321e-5,-1.0018554243928807e-8,6.977931798100247e-4,4.1759927789965654e-5,-1.006500579411969e-8,6.982647541256812e-4,4.202510292476047e-5,-1.0147554437825793e-8,6.986416504509654e-4,4.23477429452799e-5,-1.0252547579380231e-8,6.989144432942709e-4,4.267979568978907e-5,-1.0363254734980224e-8,6.990924889111561e-4,4.297633660441667e-5,-1.046354978955787e-8,6.991995765864698e-4,4.3203125469473766e-5,-1.0540778184890215e-8,6.992679525856361e-4,4.334055988722916e-5,-1.0587341630078698e-8,6.993324737511327e-4,4.338433788379723e-5,-1.0601042222300012e-8,6.994259422448656e-4,4.33439373540044e-5,-1.0584573537885036e-8,6.995758178822197e-4,4.324016014019141e-5,-1.0544655239898046e-8,6.998018846283525e-4,4.310255497934784e-5,-1.049116419505745e-8,7.001142366953494e-4,4.296687167505949e-5,-1.0436353487376878e-8,7.00511078834245e-4,4.28720812612912e-5,-1.0393964239501379e-8,7.009763426032131e-4,4.285598693783195e-5,-1.0377799290857615e-8,7.014781075470884e-4,4.294835757893481e-5,-1.0399281482030315e-8,7.01969994354906e-4,4.316142500987284e-5,-1.0463892261942207e-8,7.023982919714376e-4,4.3479848296496525E-05,-1.0567290124078954e-8,7.027162843902773e-4,4.385542505735799e-5,-1.0693127635927223e-8,7.029027821209852e-4,4.42135354664673e-5,-1.0815191406563102e-8,7.029758681401383e-4,4.44744496722845e-5,-1.0904987723913586e-8,7.029914590549362e-4,4.458263269534113e-5,-1.0942205658178163e-8,7.030240973959722e-4,4.4528749813272105e-5,-1.0922540209312683e-8,7.031394395161471e-4,4.435182467687107e-5,-1.0858532246731884e-8,7.033730001998939e-4,4.412187581728143e-5,-1.0773708033050758e-8,7.037236525719877e-4,4.391449186565976e-5,-1.0694038600834027e-8,7.041603691418619e-4,4.378961991431415e-5,-1.0640801646843702e-8,7.046353875274154e-4,4.378031259963003e-5,-1.0626632482199593e-8,7.050976569019387e-4,4.3890906265389334e-5,-1.0654550090175343e-8,7.055033512381783e-4,4.4101463726791514e-5,-1.0719012226212606e-8,7.058225832089542e-4,4.4375368649487437e-5,-1.0808140470310517e-8,7.060425584939559e-4,4.4667972118194066e-5,-1.0906544945457309e-8,7.061676354241381e-4,4.4934992978476056e-5,-1.0998328320161188e-8,7.062167941862384e-4,4.513963638656883e-5,-1.1069817830506132e-8,7.062192461146077e-4,4.525758094198104e-5,-1.1111586225981603e-8,7.062091365135665e-4,4.527941172781372e-5,-1.1119497270185845e-8,7.062203187254132e-4,4.521057587191405e-5,-1.1094762027694266e-8,7.062819845440831e-4,4.5069391812404094e-5,-1.1043233702560278e-8,7.06415505665796e-4,4.488393907460559e-5,-1.0974313413837001e-8,7.066323612634319e-4,4.4688540962570335e-5,-1.089978106738531e-8,7.069327966070445e-4,4.452012245181196e-5,-1.0832652650027417e-8,7.073048809528734e-4,4.4414291049901125e-5,-1.0785940512482935e-8,7.077239303819673e-4,4.4400593182769026e-5,-1.0771010723654536e-8,7.081530282662858e-4,4.449628480384157e-5,-1.0795218004047385e-8,7.08546309372772e-4,4.4698728013663695e-5,-1.0858860998889045e-8,7.088570074624559e-4,4.497837061391854e-5,-1.0952277710884579e-8,7.090511764918637e-4,4.527680031930541e-5,-1.1054882078469456e-8,7.091242875412201e-4,4.551603875633128e-5,-1.1138494306429178e-8,7.091120498076681e-4,4.562208888687946e-5,-1.117598713005094e-8,7.090846177539748e-4,4.5555482629709526e-5,-1.1152408119707443e-8,7.091216217038918e-4,4.533143658656323e-5,-1.1072207380177586e-8,7.092802036001695e-4,4.501504148607371e-5,-1.0957523637321026e-8,7.095747795025035e-4,4.469379194735881e-5,-1.0838617797559788e-8,7.099779924341384e-4,4.4444886939645104e-5,-1.0742641317809363e-8,7.104372322708001e-4,4.431417690490606e-5,-1.0686428868332595e-8,7.108944427121056e-4,4.43116119214771e-5,-1.067478403156329e-8,7.113007184917924e-4,4.441806234799192e-5,-1.0702470480375884e-8,7.11623679367533e-4,4.459632083759559e-5,-1.0757592826290675e-8,7.118492538786992e-4,4.480161570626685e-5,-1.0824953711808661e-8,7.11980233791131e-4,4.4989876558258635e-5,-1.0888886188899312e-8,7.120332870788396e-4,4.512373743613871e-5,-1.093553525218388e-8,7.120351830951165e-4,4.517671189813642e-5,-1.0954618391336977e-8,7.12018506314901e-4,4.513573773315998e-5,-1.094058962873492e-8,7.12017114163592e-4,4.500208629716573e-5,-1.0893112309757543e-8,7.120616914124563e-4,4.47905968840482e-5,-1.0816818974571956e-8,7.121758530794824e-4,4.452730583824109e-5,-1.0720449941183935e-8,7.12373225808455e-4,4.424582850797638e-5,-1.0615582948149321e-8,7.126557056969058e-4,4.3983020894276823E-05,-1.0515185840291802e-8,7.130128748690027e-4,4.377430370445033e-5,-1.0432097453514521e-8,7.134225026408814e-4,4.364884043657226e-5,-1.0377410518766734e-8,7.138521296875519e-4,4.3624612316220915e-5,-1.0358662531311387e-8,7.142621087199356e-4,4.370335181858926e-5,-1.0377769717223068e-8,7.146110340123279e-4,4.386580901383108e-5,-1.0428929632440784e-8,7.148644843579355e-4,4.406916289330847e-5,-1.0497305281474699e-8,7.150068229220568e-4,4.424991700273873e-5,-1.0559887164612516e-8,7.150530524366479e-4,4.4336178298709344e-5,-1.0590042672540263e-8,7.15053734810595e-4,4.42704276374271e-5,-1.056605287956476e-8,7.150846291680763e-4,4.403576931514396e-5,-1.0480847359923442e-8,7.152198511851885e-4,4.3670120179829765e-5,-1.0347183403858284e-8,7.155008744882165e-4,4.325529287265698e-5,-1.019372183871818e-8,7.159202063701489e-4,4.288442453165478e-5,-1.0053486378649688e-8,7.164288382090401e-4,4.262714020159595e-5,-9.95164253828637e-9,7.169595712173114e-4,4.2511112636761016e-5,-9.899008498589871e-9,7.174506599694499e-4,4.2524020942925516e-5,-9.892540841677029e-9,7.178598144621892e-4,4.2627404619268514e-5,-9.91983987587705e-9,7.181678446769699e-4,4.27721963699476e-5,-9.964266310840572e-9,7.183759126586623e-4,4.291045343841636e-5,-1.0008908875743132e-8,7.18500405594647e-4,4.300234497131943e-5,-1.0039122755238085e-8,7.185677828556197e-4,4.30196320106107e-5,-1.0044007543963475e-8,7.186101042079086e-4,4.294717412168661e-5,-1.001723346601736e-8,7.186610533817944e-4,4.278335317154585e-5,-9.957406051808767e-9,7.18752168284341e-4,4.253964376045135e-5,-9.867997924772748e-9,7.189091853091514e-4,4.2239192867652126e-5,-9.756827287293615e-9,7.191486680453425e-4,4.191412441845834e-5,-9.635062646698978e-9,7.194753833185204e-4,4.1601472907260915e-5,-9.515794554155215e-9,7.198809710473828e-4,4.1338056243998875e-5,-9.412302783608438e-9,7.203442861506658e-4,4.115483206636226e-5,-9.33615368049298e-9,7.208335901116579e-4,4.107136650050428e-5,-9.295250483512817e-9,7.21310582686931e-4,4.109113767836152e-5,-9.292009746461441e-9,7.217361374829578e-4,4.1198376722348027e-5,-9.321908690989147e-9,7.220776248483091e-4,4.135721706930838e-5,-9.372781644989014e-9,7.223174798075731e-4,4.151444248885548e-5,-9.42550576306746e-9,7.224616572947125e-4,4.160760778234224e-5,-9.456878589667109e-9,7.225448756233372e-4,4.157965702183735e-5,-9.445137808270311e-9,7.226279081272899e-4,4.139838628719147e-5,-9.377400707335786e-9,7.22782831518834e-4,4.107397411941798e-5,-9.256348015631858e-9,7.230679109607896e-4,4.066348908937088e-5,-9.10200491377539e-9,7.235030324353299e-4,4.025454393631868e-5,-8.94585670514005e-9,7.240604349135902e-4,3.993307278447048e-5,-8.819235976789946e-9,7.246770474161983e-4,3.9752475639384204e-5,-8.74220271896425e-9,7.25280167562206e-4,3.972032945361145e-5,-8.71863631377646e-9,7.258112499168408e-4,3.980545137139982e-5,-8.738490452126625e-9,7.262379795707331e-4,3.995588791311808e-5,-8.783922245220665e-9,7.265545698200255e-4,4.011659749582939e-5,-8.83541706972929e-9,7.267755339873465e-4,4.024105833074878e-5,-8.875936197311278e-9,7.269279845271264e-4,4.029652987094112e-5,-8.892976574019021e-9,7.270451450548466e-4,4.026516750216042e-5,-8.879235354411228e-9,7.271616327638609e-4,4.014326976173892e-5,-8.832575722188413e-9,7.273099551577129e-4,3.993996905439593e-5,-8.755682817923396e-9,7.275175140387404e-4,3.9675705000669275e-5,-8.65552457776656e-9,7.278037036096325e-4,3.938023732409923e-5,-8.542589315450922e-9,7.281770882665271e-4,3.9089662899162196e-5,-8.429786504232964e-9,7.286331360591269e-4,3.884197223268564e-5,-8.330888585721539e-9,7.291533677555678e-4,3.867120217350354e-5,-8.258515599405508e-9,7.297067738756757e-4,3.860090558086704e-5,-8.221844583454592e-9,7.302539666578742e-4,3.8638182704821905e-5,-8.224400957513714e-9,7.307538962269374e-4,3.876983049784128e-5,-8.262452625865695e-9,7.311722092434422e-4,3.896204742743471e-5,-8.324571705863522e-9,7.314897527645678e-4,3.9164524285314036e-5,-8.3927927962959e-9,7.317094414493923e-4,3.931904431090589e-5,-8.445566122962981e-9,7.318594845103638e-4,3.937201425400375e-5,-8.462392890762826e-9,7.319908066651358e-4,3.928917259530832e-5,-8.42948659848983e-9,7.321669790530052e-4,3.906885058053107e-5,-8.345010771919948e-9,7.324469928605998e-4,3.8748281868431985e-5,-8.22172192559327e-9,7.328651675913713e-4,3.839739804730499e-5,-8.084889760603431e-9,7.334166535442571e-4,3.809868218835139e-5,-7.964969302770367e-9,7.340570593855317e-4,3.791967584824037e-5,-7.88746795733556e-9,7.347180158889726e-4,3.789093829132095e-5,-7.864694610367329e-9,7.35330978895752e-4,3.799999059049531e-5,-7.893257941684946e-9,7.358473549973659e-4,3.820188625552753e-5,-7.95762224232136e-9,7.36247320859895e-4,3.8438037090302746e-5,-8.036768609057542e-9,7.365375874964547e-4,3.865343008418449e-5,-8.110432460280896e-9,7.367432165561168e-4,3.880698844533339e-5,-8.163005946748622e-9,7.368986354207467e-4,3.8875061863166875e-5,-8.185035831936871e-9,7.370405983510341e-4,3.885061218849014e-5,-8.173156102939069e-9,7.372035548293182e-4,3.8740714185469477e-5,-8.129326522098361e-9,7.374166923744471e-4,3.8563901864775714e-5,-8.05990590565618e-9,7.377017025310008e-4,3.834777065479802e-5,-7.974743340507008e-9,7.38070622142274e-4,3.8126512150255426e-5,-7.886238130470689e-9,7.385236155784789e-4,3.7937678633434624e-5,-7.80816935910351e-9,7.390471872462534e-4,3.7817479218706066e-5,-7.754041850862354e-9,7.39613896733862e-4,3.779443638936219e-5,-7.734832514708064e-9,7.401848806728716e-4,3.788221163124379e-5,-7.75635096994411e-9,7.407160397257579e-4,3.807351780711525e-5,-7.816863716772319e-9,7.411675017627108e-4,3.83377342940748e-5,-7.905958120875292e-9,7.415142919555773e-4,3.8624442718095306e-5,-8.005552813609206e-9,7.417549191637427e-4,3.887335159084064e-5,-8.093346705012602e-9,7.419146387750976e-4,3.902868594401002e-5,-8.14809060536792e-9,7.420415466924796e-4,3.9054260051663074e-5,-8.155305505607456e-9,7.421957712450767e-4,3.894484020912841e-5,-8.111780096870276e-9,7.424340938914088e-4,3.873006125504485e-5,-8.02737573183699e-9,7.42793899355561e-4,3.846880194086285e-5,-7.923264854219435e-9,7.432812620141698e-4,3.823437454532318e-5,-7.82664187542525e-9,7.438677441412036e-4,3.809405520022208e-5,-7.763143694430137e-9,7.444981839003461e-4,3.808955287654943e-5,-7.749409650064826e-9,7.451073361538792e-4,3.822586805072566e-5,-7.788599612458683e-9,7.456389114710405e-4,3.847282903416642e-5,-7.870587084328902e-9,7.460595325375159e-4,3.8777620572790256e-5,-7.97634017132848e-9,7.463633344203971e-4,3.90818258416466e-5,-8.084164382373755e-9,7.465679154850866e-4,3.9335967587656355e-5,-8.175197120055171e-9,7.467056704916095e-4,3.950769387356267e-5,-8.236653653676395e-9,7.468147802209882e-4,3.958364471163843e-5,-8.262748556136644e-9,7.469323302937862e-4,3.956728801685668e-5,-8.25406326448367e-9,7.470900224543724e-4,3.947522924674709e-5,-8.21625230612436E-09,7.473117786206921e-4,3.9333574246693434e-5,-8.15868872939971e-9,7.476122444451707e-4,3.917483364161524e-5,-8.093285230637837e-9,7.479954258414936e-4,3.9035053263447094e-5,-8.033430521419e-9,7.484532171378763e-4,3.8950407831258895e-5,-7.992775209673987e-9,7.489642810589979e-4,3.895244597740534e-5,-7.983527194781351e-9,7.494944525688141e-4,3.906165830601274e-5,-8.014060469529422e-9,7.500002746529996e-4,3.9280174203610924e-5,-8.086078232861302e-9,7.504369055959056e-4,3.9586013083436254e-5,-8.192238951203957e-9,7.507699029120727e-4,3.993257848288867e-5,-8.31570446363603e-9,7.509875768828624e-4,4.025651618290501e-5,-8.432888245201967e-9,7.511084739632404e-4,4.049377684511111e-5,-8.519412651981377e-9,7.511792950330379e-4,4.059903216808652e-5,-8.557453460506901e-9,7.51262580818493e-4,4.056073182061699e-5,-8.541545996409175e-9,7.514184424281146e-4,4.040549547796316e-5,-8.480474453332119e-9,7.516871944073718e-4,4.019036204144835e-5,-8.394680466844668e-9,7.520786833722089e-4,3.998634873333417e-5,-8.31041577663291e-9,7.525708694622507e-4,3.985920059382761e-5,-8.252707967838128e-9,7.531170338310043e-4,3.985300180192867e-5,-8.239147244363815e-9,7.536588526186752e-4,3.998070036708499e-5,-8.276008258796359e-9,7.541413990265233e-4,4.022342678605548e-5,-8.357544078241255e-9,7.54525863865062e-4,4.05380201242533e-5,-8.468421354961952e-9,7.547967008719969e-4,4.0869815523018587e-5,-8.588335122366214e-9,7.549619635945633e-4,4.116635887970118e-5,-8.697206288555848e-9,7.550480101612701e-4,4.1388047065979665e-5,-8.779387588935774e-9,7.550913554910073e-4,4.151357045899603e-5,-8.825967420826681e-9,7.551305842522161e-4,4.154031612162445e-5,-8.835132581061215e-9,7.552001895864037e-4,4.148139165922518e-5,-8.811164119887681e-9,7.55326828426084e-4,4.1361260126847735e-5,-8.762820923675844e-9,7.555274925687125e-4,4.12114438663705e-5,-8.70170647458801e-9,7.558087203055979e-4,4.1066871518413693e-5,-8.640891785799208e-9,7.561661037027524e-4,4.09626519740274e-5,-8.593743073534889e-9,7.565837873294337e-4,4.0930595848213674e-5,-8.572674913245856e-9,7.570343023719693e-4,4.0994708019895345e-5,-8.58746909968765e-9,7.574798432523166e-4,4.116526167701248e-5,-8.642942450707564e-9,7.578766597453443e-4,4.143219506580418e-5,-8.736227826676889e-9,7.581839700006578e-4,4.1760430647830195e-5,-8.85472089607003e-9,7.583769007372872e-4,4.209143613341075e-5,-8.97646260497755e-9,7.584593350854895e-4,4.235492678888832e-5,-9.074535079715516e-9,7.584693326984003e-4,4.249010700473473e-5,-9.125223368184249e-9,7.58470988460264e-4,4.246860282595259e-5,-9.116849569321388e-9,7.585337351705025e-4,4.230716762507732e-5,-9.054700673282172e-9,7.587083994551931e-4,4.206260627237825e-5,-8.959261900385463e-9,7.590114511903744e-4,4.181169099700161e-5,-8.858889905876627e-9,7.594231618304254e-4,4.162653730197789e-5,-8.780808674797843e-9,7.598974502542237e-4,4.155567159126383e-5,-8.744091746991325e-9,7.603770701441117e-4,4.161547883315085e-5,-8.756261200644959e-9,7.608083072352005e-4,4.1791395294714015e-5,-8.813314074637931e-9,7.611518311466191e-4,4.204568142158321e-5,-8.902175671211233e-9,7.613885521055572e-4,4.232834360337178e-5,-9.004492689727314e-9,7.615206177534766e-4,4.258845489577387e-5,-9.100837967244961e-9,7.61568322961355e-4,4.2783817580922045e-5,-9.174529986143186e-9,7.615641863347267e-4,4.288746563387388e-5,-9.214382010099968e-9,7.615458421224065e-4,4.289030424473849e-5,-9.215981555878051e-9,7.615493776879412e-4,4.280020160465099e-5,-9.181526671744856e-9,7.616042486398303e-4,4.26385797343642e-5,-9.118594656166542e-9,7.61730210455046e-4,4.2435795379432153e-5,-9.03837554219817e-9,7.61936050598561e-4,4.222646210520275e-5,-8.953874020503188e-9,7.622194897874063e-4,4.204535712200338e-5,-8.87837427683221e-9,7.625676250645121e-4,4.1923882039288665e-5,-8.824153587401546e-9,7.629576171601758e-4,4.188660389994002e-5,-8.801211913123232e-9,0.00076335781686778445,4.194730410322629e-5,-8.815719768604965e-9,7.637301806589586e-4,4.210424149540176e-5,-8.868024377405146e-9,7.640353866362429e-4,4.233530176320579e-5,-8.950502771608857e-9,7.642418368971225e-4,4.259542541961727e-5,-9.046295943306457e-9,7.643379706413167e-4,4.282042794217269e-5,-9.130652554192153e-9,7.643436783033333e-4,4.29411494887276e-5,-9.176459932444947e-9,7.643128225427903e-4,4.290719105443412e-5,-9.163573390875584e-9,7.643198908851147e-4,4.27107298651634e-5,-9.088104238947882e-9,7.644329712891078e-4,4.23954390951903e-5,-8.965872528852865e-9,7.646866633436667e-4,4.204199444422708e-5,-8.826934866527333e-9,7.650704200976676e-4,4.17372669333947e-5,-8.704057045239502e-9,7.655369936842672e-4,4.154471093131832e-5,-8.621706108552556e-9,7.660227565342318e-4,4.1489461027239444e-5,-8.590446292021975e-9,7.664679096395077e-4,4.155968867214678e-5,-8.60719762281304e-9,7.668295552510263e-4,4.1717667344140696e-5,-8.65897698447111e-9,7.670867797953163e-4,4.191334217832278e-5,-8.727615499482921e-9,7.672399375245228e-4,4.209611415617943e-5,-8.794011363368658e-9,7.673067113076542e-4,4.2223374435902354e-5,-8.841422117427617e-9,7.673167461421355e-4,4.226589688328241e-5,-8.857772846673981e-9,7.673057770691697e-4,4.221051342646373e-5,-8.837001052988211e-9,7.673098402283448e-4,4.206030802892788e-5,-8.779391079594279e-9,7.673601781277127e-4,4.18326361185597e-5,-8.690943756311483e-9,7.674793660680467e-4,4.1555511526051535e-5,-8.58199870451685e-9,7.676789770593695e-4,4.126301892957958e-5,-8.465429763661297e-9,7.679588364412986e-4,4.0990480338567314e-5,-8.354768907767848e-9,7.683075907368027e-4,4.077001331558171e-5,-8.262536838002104e-9,7.687041577968274e-4,4.062672035544098e-5,-8.198843955832656e-9,7.691197778494181e-4,4.057536670843389e-5,-8.170131786714939e-9,7.69520695114969e-4,4.061730481647757e-5,-8.17788778750396e-9,7.698719236009533e-4,4.073758088267318e-5,-8.217289031700045e-9,7.701429410375053e-4,4.090284202188645e-5,-8.276083307954193e-9,7.703158959245221e-4,4.106194157234824e-5,-8.334583011415699e-9]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json new file mode 100644 index 0000000..ed067a1 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":12000,"numberOfSamples":1000,"samples":[7.703954280162467e-4,4.1152337826266915e-5,-8.368108119871265e-9,7.704163319665058e-4,4.111507788730868e-5,-8.352989399151336e-9,7.704421464154993e-4,4.091720944904923e-5,-8.275542352848811e-9,7.705485092428724e-4,4.05724562623383e-5,-8.140252864992262e-9,7.707939985966856e-4,4.014524130054576e-5,-7.971353086916377e-9,7.71193504222048e-4,3.972957759547678e-5,-7.80469566907836e-9,7.717115053607008e-4,3.9412072212316335e-5,-7.673655282248528e-9,7.722792203821364e-4,3.924081276169691e-5,-7.597334312683116e-9,7.728228927422465e-4,3.921592014800571e-5,-7.576902082499595e-9,7.732865636479628e-4,3.930044006202883e-5,-7.599469965429773e-9,7.736417360467977e-4,3.9439508716162856e-5,-7.645015059481085e-9,7.738862021781628e-4,3.9577299627356655e-5,-7.692550022805146e-9,7.740375781067476e-4,3.9667776867413035e-5,-7.724156675043192e-9,7.741257583521852e-4,3.9679734947780095e-5,-7.727075835179889e-9,7.741863193020013e-4,3.959810915098842e-5,-7.69451274251175e-9,7.742552430288779e-4,3.9423328672554246e-5,-7.625696494804441e-9,7.743646142276804e-4,3.9169548057952974e-5,-7.525395913350832e-9,7.745390796275454e-4,3.886191912277735e-5,-7.4029175785362335e-9,7.747931611691499e-4,3.853296073940333e-5,-7.2706518736087654e-9,7.751296404933389e-4,3.821816871539602e-5,-7.14230656603222e-9,7.75539277044951e-4,3.795118644851318e-5,-7.03102083378519e-9,7.760019965895818e-4,3.7759097444815016e-5,-6.947589780698099e-9,7.764894114568546e-4,3.7658393030000226e-5,-6.898960011119357e-9,7.769683935525284e-4,3.765194567776308e-5,-6.887041206138857e-9,7.77405468600329e-4,3.7727187339015794e-5,-6.907852463658269e-9,7.777719367210197e-4,3.7855696317654865e-5,-6.951096001721251e-9,7.780497715515111e-4,3.799465132874708e-5,-7.000433114460731e-9,7.782381033839588e-4,3.809125972066116e-5,-7.035036448543083e-9,7.783590131789634e-4,3.809174285674149e-5,-7.033143881376136e-9,7.784595953194529e-4,3.795570392998253e-5,-6.97793131163529e-9,7.786057068107846e-4,3.767368510457848e-5,-6.864708360881282e-9,7.78863996118783e-4,3.728037531656348e-5,-6.706310810691064e-9,7.792756265371022e-4,3.685219468959701e-5,-6.532225465482031e-9,7.798348397283327e-4,3.648330405006227e-5,-6.379231745544197e-9,7.804875774404013e-4,3.624915992465997e-5,-6.277220111165846e-9,7.811532791147602e-4,3.6178446406365796e-5,-6.238248751260801e-9,7.817563618614648e-4,3.624887846641678e-5,-6.254752293779451e-9,7.822492066349364e-4,3.6404572752001926e-5,-6.305999039127454e-9,7.826184621073835e-4,3.658034238992342e-5,-6.367226110433409e-9,7.828786448897808e-4,3.672020080806501e-5,-6.416659701095429e-9,7.830611528872669e-4,3.678622737434062e-5,-6.439002339589363e-9,7.83204269111392e-4,3.6760045223355876e-5,-6.4262288080890655e-9,7.83346116265409e-4,3.6640538094929564e-5,-6.376990645821899e-9,7.835202865150684e-4,3.644047816686522e-5,-6.2955425776532835e-9,7.837530585274323e-4,3.618322636043522e-5,-6.190565289506217e-9,7.840613538345039e-4,3.5899528490766174e-5,-6.073894295370791e-9,7.844511692520874e-4,3.56240404001225e-5,-5.959079652820332e-9,7.849166362486965e-4,3.5391266889247926e-5,-5.859734881539029e-9,7.854401461991078e-4,3.5230870470624936e-5,-5.787703349498604e-9,7.85994077008628e-4,3.516280326863614e-5,-5.751203618221222e-9,7.865443681490566e-4,3.519312942196211e-5,-5.753224515569559e-9,7.870557121649313e-4,3.531147041257569e-5,-5.790462278713693e-9,7.874977374834473e-4,3.549084781661851e-5,-5.8530751899271e-9,7.878512977067683e-4,3.5690381696580056e-5,-5.925483082828172e-9,7.88113902130303e-4,3.586089281430252e-5,-5.9883395159535995e-9,7.883033069918536e-4,3.595324388575569e-5,-6.021732124830117e-9,7.884579960410935e-4,3.5929083510116866e-5,-6.009544248256601e-9,7.886327975757129e-4,3.577280030598468e-5,-5.9444715378693474e-9,7.888879780100181e-4,3.550164046195876e-5,-5.832367391647236e-9,7.8927192870103e-4,3.51687389345516e-5,-5.693704861085736e-9,7.898018205719634e-4,3.4853326117873307e-5,-5.559814012217819e-9,7.904515896948133e-4,3.4636846056963114e-5,-5.463410169207496e-9,7.911567365586743e-4,3.457328365667514e-5,-5.426733674861982e-9,7.91836723351535e-4,3.4669207955395765e-5,-5.453450884163303e-9,7.924237202788972e-4,3.488486649734166e-5,-5.5288267094573905e-9,7.928824548961669e-4,3.515389152880303e-5,-5.627269436403621e-9,7.932136820118008e-4,3.540839736028799e-5,-5.722097489506235e-9,7.934449059141124e-4,3.5597063748403574e-5,-5.792673659357338e-9,7.936168882573704e-4,3.569210775996662e-5,-5.827295173952732e-9,7.937723217445624e-4,3.568791359332356e-5,-5.822884193637893e-9,7.93948800831336e-4,3.559595323883983e-5,-5.783216738249511e-9,7.941754088277288e-4,3.543933477989003e-5,-5.716920600537979e-9,7.944713320113322e-4,3.524834071649752e-5,-5.635744464363097e-9,7.948452117223364e-4,3.505690102972568e-5,-5.5531067119024055e-9,7.952946621025866e-4,3.489936168856889e-5,-5.482741290558481e-9,7.958060134527227e-4,3.4806877971801684e-5,-5.437234302862502e-9,7.963548356244236e-4,3.4803064153757236e-5,-5.4263155715433935e-9,7.969080873912969e-4,3.4899187129560714e-5,-5.454979598662578e-9,7.974285582348853e-4,3.50899868901018e-5,-5.521799771482021e-9,7.978815595783528e-4,3.53517139310461e-5,-5.618028402827992e-9,7.982428279621153e-4,3.5643920541599894e-5,-5.728107579266846e-9,7.985056927078104e-4,3.591576113045357e-5,-5.8319638327390805e-9,7.986852279968585e-4,3.6116131940588234e-5,-5.908914090462572e-9,7.988176580367524e-4,3.620557989303193e-5,-5.942429308719043e-9,7.989544079791842e-4,3.616720864975489e-5,-5.924668401918435e-9,7.991513656849079e-4,3.601375362426653e-5,-5.859607617947738e-9,7.994550428476274e-4,3.5788266373648105e-5,-5.763648882378041e-9,7.99888593020665e-4,3.5556588356057684e-5,-5.662870662485801e-9,8.004419741134302e-4,3.539153188530321e-5,-5.586797190304597e-9,8.010710698253013e-4,3.5351857597047766e-5,-5.559879219657929e-9,8.017086298947224e-4,3.546304659868737e-5,-5.5935163200738305e-9,8.022846671415112e-4,3.5708577068191366e-5,-5.6822096378184195e-9,8.027481145977655e-4,3.603666410112383e-5,-5.805964874906324e-9,8.03080122412991e-4,3.637928126071499e-5,-5.9377647708489825e-9,8.032943410005627e-4,3.66738652272459e-5,-6.0522761139605395e-9,8.034269249007324e-4,3.687843167960255e-5,-6.132033879229968e-9,8.035230519879982e-4,3.697653334579644e-5,-6.1696217748146e-9,8.036257380118303e-4,3.6974206946549126e-5,-6.166656508896828e-9,8.037692352128727e-4,3.689330257374978e-5,-6.131278442552063e-9,8.039764427338145e-4,3.6764723596644845e-5,-6.075520263494496e-9,8.042586457584074e-4,3.662315128777011e-5,-6.013183162784273e-9,8.046160819092535e-4,3.6503272989771094e-5,-5.9582713714511854e-9,8.050385231957502e-4,3.643678976682334e-5,-5.9237473528870625e-9,8.055057955743184e-4,3.644934285412461e-5,-5.920288595123292e-9,8.05988792090945e-4,3.655676717208342e-5,-5.95478706400642e-9,8.064519656770659e-4,3.676075426661275e-5,-6.028574833606665e-9,8.068582848986766e-4,3.7045013088594046e-5,-6.1357749440002495e-9,8.071769237677392e-4,3.737399900933667e-5,-6.26261951082692e-9,8.073924491758243e-4,3.769659412573422e-5,-6.388754892200863e-9,8.075124666197616e-4,3.7955997865778476e-5,-6.491115253060035e-9,8.075698393218493e-4,3.8104352666225344e-5,-6.549812033282912e-9,8.07616918266904e-4,3.811755258854625e-5,-6.5542030392740885e-9,8.077125028108634e-4,3.8004458985452114e-5,-6.506795533466793e-9,8.079056000982033e-4,3.780654452780539e-5,-6.4233624926436094e-9,8.082214227720043e-4,3.758774308343327e-5,-6.3291414262697445e-9,8.086539871520523e-4,3.741775103981728e-5,-6.252328710187585e-9,8.091672759069606e-4,3.7353752588214316e-5,-6.216752306565877e-9,8.097045052884347e-4,3.742558962134468e-5,-6.235686559437506e-9,8.10203012993122e-4,3.7628423384850995e-5,-6.308502277607127e-9,8.106106251449948e-4,3.792510731679957e-5,-6.421212634856097e-9,8.108985322821864e-4,3.8257644162653106e-5,-6.550833196339432e-9,8.11066628774171e-4,3.856383400569566e-5,-6.6720638631456955e-9,8.111401568994287e-4,3.8793232686939005e-5,-6.763879623403471e-9,8.111600098107639e-4,3.89173073971411e-5,-6.813868422693099e-9,8.111711107269196e-4,3.893182181341246e-5,-6.8194280235812216e-9,8.112128636990658e-4,3.8852913529948424e-5,-6.786357912765378e-9,8.1131356935384e-4,3.8710088334482416e-5,-6.726121364291298e-9,8.114885730374386e-4,3.853908980505929e-5,-6.652976845483148e-9,8.117408037071133e-4,3.837625006855202e-5,-6.5816575047402725e-9,8.120622864326276e-4,3.825456404102906e-5,-6.5257403552766695e-9,8.124357145823514e-4,3.82008938099246e-5,-6.496493824519633e-9,8.128358550233297e-4,3.823344877076438e-5,-6.50185004606853e-9,8.132312194083829e-4,3.8358874558908814e-5,-6.54518991660995e-9,8.135869354214777e-4,3.856887726212377e-5,-6.623869747140799e-9,8.138698868858205e-4,3.8837323813125146e-5,-6.727869263055802e-9,8.140566018155787e-4,3.91199837876055e-5,-6.83950023112515e-9,8.141427039935174e-4,3.935979230186433e-5,-6.9354371500791985e-9,8.14150262656473e-4,3.949946847388898e-5,-6.9918722744796985e-9,8.141277285832854e-4,3.949960053306327e-5,-6.991994835378283e-9,8.141388942367572e-4,3.935526219250151e-5,-6.93289197521611e-9,8.142430879224422e-4,3.910207785679162e-5,-6.8281493368907015e-9,8.144749296276758e-4,3.880686864520632e-5,-6.704223833237992e-9,8.1483306083408e-4,3.854646680042599e-5,-6.592073096421126e-9,8.152821053230805e-4,3.838435896231063e-5,-6.5178631025860026e-9,8.157651947313659e-4,3.835428291873892e-5,-6.49629781434836e-9,8.162207450781731e-4,3.845478693315215e-5,-6.528135674230928e-9,8.16597684699937e-4,3.865376270796675e-5,-6.60159629155916e-9,8.168657158061926e-4,3.889947743847334e-5,-6.69644446442954e-9,8.170194049574676e-4,3.913422953807289e-5,-6.7893400986806185e-9,8.17076394641524e-4,3.930728020730456e-5,-6.85914255437804e-9,8.170710316645813e-4,3.938449175604022e-5,-6.891061862959034e-9,8.170454569870298e-4,3.935306732398158e-5,-6.878882809994513e-9,8.170405722878981e-4,3.9221105681444305e-5,-6.825033584806315e-9,8.1708896023377e-4,3.901310215359767e-5,-6.7388979016364186e-9,8.172108407223391e-4,3.87633764776707e-5,-6.634171213681119e-9,8.174130175522054e-4,3.850938229687362e-5,-6.526094414707984e-9,8.176899834395489e-4,3.8286205079792516e-5,-6.4291520891420515e-9,8.180260959470649e-4,3.812267075009407e-5,-6.3554492104173685e-9,8.183979894619872e-4,3.803873780290355e-5,-6.313637763487015e-9,8.187769116206049e-4,3.804351923521837e-5,-6.308093725118056e-9,8.191312129866966e-4,3.813337134793312e-5,-6.338063937256885e-9,8.194296942684052e-4,3.8289922698924704e-5,-6.396704673018225e-9,8.196467238419641e-4,3.847879781237149e-5,-6.470354270719354e-9,8.197695294206804e-4,3.8650968100779566e-5,-6.538921130269099e-9,8.19806513649201e-4,3.874943540462814e-5,-6.5785960033068025e-9,8.197929489727498e-4,3.8723134804595094e-5,-6.5676898771434025e-9,8.197883002079536e-4,3.854613941350416e-5,-6.4947236728071645e-9,8.198609759695765e-4,3.823403064971981e-5,-6.365297279203114e-9,8.200636944477346e-4,3.784594464219167e-5,-6.203000857389413e-9,0.000820411436661712,3.746667085519243e-5,-6.042172936215794e-9,8.208749674671344e-4,3.7176223092774686e-5,-5.915617415305801e-9,8.213932248000017e-4,3.7022992160726405e-5,-5.843759010230899e-9,8.218961027605576e-4,3.701275044446644e-5,-5.830076453078521e-9,8.223254904904929e-4,3.711435819021485e-5,-5.863118056849916e-9,8.226473843906112e-4,3.727482958449793e-5,-5.922239824745653e-9,8.228545590175748e-4,3.7435687186837764e-5,-5.983966399587255e-9,8.229627474394682e-4,3.7545885310616436e-5,-6.027176921838554e-9,8.230036090129152e-4,3.756990148797665e-5,-6.036554527428151e-9,8.230167806825249e-4,3.749138311092206e-5,-6.004372061981051e-9,8.230423185742567e-4,3.731317666393389e-5,-5.930818699795622e-9,8.231143493501816e-4,3.705449505134662e-5,-5.823063768625377e-9,8.23256553209646e-4,3.674606808012696e-5,-5.693352353058202e-9,8.234798189428454e-4,3.642429612693932e-5,-5.556571384393087e-9,8.237820413355269e-4,3.6125418828181186e-5,-5.427765212931279e-9,8.241496751844597e-4,3.588054059534543e-5,-5.320016584338888e-9,8.245603883153199e-4,3.571199342395666e-5,-5.242923452023574e-9,8.249861688108776e-4,3.563099782478505e-5,-5.201638270344065e-9,8.253965549120751e-4,3.563626588694151e-5,-5.1962726434097535e-9,8.257620082869455e-4,3.571323197160154e-5,-5.221486300041849e-9,8.260577695440884e-4,3.583385451251235e-5,-5.266230045559657e-9,8.262687299902825e-4,3.595753207818218e-5,-5.313924512584801e-9,8.263954241197148e-4,3.6034603798458864e-5,-5.343784865943491e-9,8.264598903887887e-4,3.601442540484084e-5,-5.334201311502159e-9,8.265081515702821e-4,3.585914554288692e-5,-5.268642284511385e-9,8.26604385596247e-4,3.556101693181241e-5,-5.143074426032549e-9,8.268132192939278e-4,3.515537353926115e-5,-4.971501142912185e-9,8.271738744510702e-4,3.471782861774951e-5,-4.7848532086355065e-9,8.276795586094963e-4,3.4340322196190036e-5,-4.621118053741745e-9,8.282766891716653e-4,3.4095760039524445e-5,-4.5108069909192165e-9,8.288861464980373e-4,3.401140563924369e-5,-4.465996728964361e-9,8.29433355059079e-4,3.406500941237964e-5,-4.4785874372255114e-9,8.298704729894737e-4,3.420103631857123e-5,-4.526688711410476e-9,8.301833096396713e-4,3.4353709967328716e-5,-4.583790454622501e-9,8.303862100769367e-4,3.446546478614344e-5,-4.626173157513306e-9,8.305118250621173e-4,3.449687603771798e-5,-4.6370194576684565e-9,8.306008664699762e-4,3.442941009341466e-5,-4.607762309491803e-9,8.306940322478887e-4,3.426386875947961e-5,-4.537752547464339e-9,8.308263261536525e-4,3.401682527001027e-5,-4.4330652748613145e-9,8.310232819304966e-4,3.371620106257414e-5,-4.304822699303797e-9,8.312987280593526e-4,3.339641097448233e-5,-4.167187973746248e-9,8.31653979219806e-4,3.309335744578138e-5,-4.0351952674026125e-9,8.32078417238307e-4,3.283958122742209e-5,-3.9226242940869606e-9,8.325514069439921e-4,3.26599656110982e-5,-3.8401496329485945e-9,8.330453353948687e-4,3.256846904668967e-5,-3.793977723288974e-9,8.335293651888821e-4,3.2566169333962955e-5,-3.785049055168084e-9,8.33973516225973e-4,3.264061001145597e-5,-3.808740687729704e-9,8.343528580041156e-4,3.2766396288388346e-5,-3.855005633134729e-9,8.346517248312861e-4,3.290709657118518e-5,-3.9089874063833434e-9,8.348679389439184e-4,3.301872928211123e-5,-3.95230090306051e-9,8.350167359300278e-4,3.305558632640454e-5,-3.965393684369818e-9,8.351331058149185e-4,3.297932755397413e-5,-3.9314416005053e-9,8.352699660831031e-4,3.277126367429032e-5,-3.8417220291605366e-9,8.354889117471341e-4,3.244507340953231e-5,-3.7012047953805833e-9,8.358419691208809e-4,3.205326833172769e-5,-3.531440109697599e-9,8.36348763283404e-4,3.167867290599403e-5,-3.3670502139274996e-9,8.369813197061595e-4,3.140782451156133e-5,-3.244586908337016e-9,8.376693061030729e-4,3.129669563122999e-5,-3.1881493598681102e-9,8.383263658012633e-4,3.134863920078477e-5,-3.200051972071662e-9,8.388826052155265e-4,3.151766556410064e-5,-3.2619908468242225e-9,8.393050072888866e-4,3.173205489277276e-5,-3.344664087646371e-9,8.395988757541516e-4,3.192172100776251e-5,-3.419003963066664e-9,8.397963286098811e-4,3.203621272799185e-5,-3.46362815353071e-9,8.399416326313247e-4,3.205061679819683e-5,-3.4674080518768483e-9,8.400794992423449e-4,3.1963263817541386e-5,-3.4287495907215916e-9,8.402479103687121e-4,3.179002909330446e-5,-3.3534888117140308e-9,8.404745687451004e-4,3.155830071326884e-5,-3.2525737289196144e-9,8.407754646399417e-4,3.130173895136262e-5,-3.1399368209433314e-9,8.41154541388092e-4,3.1055764720891035e-5,-3.0305415711644196e-9,8.416041280544131e-4,3.085345156272672e-5,-2.9385364426828023e-9,8.421061656017975e-4,3.072164283076384e-5,-2.8755213785209154e-9,8.426344113814458e-4,3.067736638925079e-5,-2.8490015368691745e-9,8.431577953645121e-4,3.072498523450466e-5,-2.8612024549307127e-9,8.436447971117692e-4,3.085470440573325e-5,-2.9084547718786858e-9,8.440683720702881e-4,3.1042869672780824e-5,-2.981273689818602e-9,8.444108321936859e-4,3.125426055813509e-5,-3.065198477158535e-9,8.446680629527056e-4,3.144642492558669e-5,-3.142451937358192e-9,8.448524507159502e-4,3.15759057443261e-5,-3.194437005461156e-9,8.449938340091091e-4,3.160610588444374e-5,-3.2050494314965393e-9,8.451374660071655e-4,3.151638576719877e-5,-3.1646699302547115e-9,8.453375715697237e-4,3.1311130994121866e-5,-3.0742611477808833e-9,8.456453986738488e-4,3.1025780835067146e-5,-2.94819557957702e-9,8.46092653379528e-4,3.0725045293271956e-5,-2.81368862948315e-9,8.466753220872281e-4,3.0488818598972834e-5,-2.704879810332908e-9,8.473471109643087e-4,3.038640446510119e-5,-2.6518278127619258e-9,8.480305696476147e-4,3.0449024854662588e-5,-2.668679548466348e-9,8.486441257401572e-4,3.065628903781551e-5,-2.7477040330430985e-9,8.491313375173792e-4,3.094576582096809e-5,-2.8631317709746885e-9,8.494766164139384e-4,3.123946697058364e-5,-2.9822273668107125e-9,8.497020423260754e-4,3.1471127846907625e-5,-3.0767866876898872e-9,8.498521170161459e-4,3.16017891014394e-5,-3.129775126187276e-9,8.499770409409726e-4,3.1621830699592834e-5,-3.1363362066964675e-9,8.501209480543094e-4,3.1544720456021056e-5,-3.1013685836141294e-9,8.503161532077362e-4,3.1398399640952655e-5,-3.036097487468567e-9,8.505816546173871e-4,3.1217759899263695e-5,-2.9550165687006546e-9,8.509236995527479e-4,3.103916188717301e-5,-2.8735662703891047e-9,8.513369862483362e-4,3.0896507607776705e-5,-2.8063743424389867e-9,8.518060495699486e-4,3.081805794501351e-5,-2.7657886014572145e-9,8.523069735798167e-4,3.082345930368575e-5,-2.7605358876292335e-9,8.528098318936862e-4,3.0920864735206294e-5,-2.79447672381635e-9,8.532822991542584e-4,3.110457416848017e-5,-2.8656065993726486e-9,8.536945524033567e-4,3.1354085988535145e-5,-2.965633018689591e-9,8.540249574865114e-4,3.163548969538209e-5,-3.080489694586202e-9,8.542654720972812e-4,3.190574453586719e-5,-3.192028596537508e-9,8.544254041595665e-4,3.211974836915866e-5,-3.28090202256463e-9,8.545322236510779e-4,3.2239278828225266e-5,-3.3303148632010992e-9,8.546285733291039e-4,3.224218246448245e-5,-3.330007151957699e-9,8.547652672831671e-4,3.2129878781118014e-5,-3.279649312494011e-9,8.549907364400541e-4,3.193111420486313e-5,-3.1907193571916717e-9,8.553382926807156e-4,3.1699773222277685e-5,-3.0858345714949625e-9,8.558140144434115e-4,3.150496484434305e-5,-2.9946769942906606e-9,8.563897321781071e-4,3.1413455736156216e-5,-2.9464704670555277e-9,8.570061787799461e-4,3.1468304822318046e-5,-2.960646903904852e-9,8.575886586831152e-4,3.167199701229673e-5,-3.039317862345337e-9,8.580709942206223e-4,3.198346246211776e-5,-3.1656988018487623e-9,8.584171135061124e-4,3.233248147476386e-5,-3.310099393214403e-9,8.586297960336273e-4,3.264478971416768e-5,-3.440645754903185e-9,8.587438963877701e-4,3.286515489171303e-5,-3.5332321749884526e-9,8.58810255130539e-4,3.2968897888927814e-5,-3.5765784450704622e-9,8.588794391843271e-4,3.2960802961293873e-5,-3.5719305847910328e-9,8.589911009932855e-4,3.2866533850223576e-5,-3.529577019202463e-9,8.591697919005255e-4,3.272249454060714e-5,-3.4646650245504987e-9,8.594251730433313e-4,3.256765883619841e-5,-3.393767811079765e-9,8.597541389353542e-4,3.2438210292960187e-5,-3.3325521813766835e-9,8.601432315592983e-4,3.236427582707883e-5,-3.2942803106507433e-9,8.605707893509768e-4,3.236765846754327e-5,-3.2887387933129255e-9,8.610090272757816e-4,3.245976837958149e-5,-3.3212886990489386e-9,8.614266330715411e-4,3.2639496241471747e-5,-3.3919234343927197e-9,8.617925265638105e-4,3.289145361493536e-5,-3.4944824234170423e-9,8.620810773671341e-4,3.318566240946574e-5,-3.616455097562243e-9,8.62278291344594e-4,3.3480062508905175e-5,-3.7399625948591e-9,8.623874686730959e-4,3.372681857367478e-5,-3.844371487446432e-9,8.624320722870976e-4,3.38822001208865e-5,-3.910489310686052e-9,8.624536695365803e-4,3.391801974913249e-5,-3.925509323340507e-9,8.625041693741896e-4,3.3831145103447495e-5,-3.887217720697746e-9,8.626336863724894e-4,3.364749744285424e-5,-3.805912914971897e-9,8.628771728569449e-4,3.34184061309152e-5,-3.703085242205503e-9,8.632436901356097e-4,3.3209472451514874e-5,-3.606852247536402e-9,8.637117164869609e-4,3.30843353744748e-5,-3.5450791305814132e-9,8.64232526978409e-4,3.30874054017447e-5,-3.537852982664476e-9,8.647417259564168e-4,3.32305264787094e-5,-3.591449619924816e-9,8.651764977358669e-4,3.348834402295054e-5,-3.695963620118213e-9,8.654934113410493e-4,3.380514974584113e-5,-3.827962144226022e-9,8.65680227216288e-4,3.411174050293928e-5,-3.957644664897803e-9,8.657570330287688e-4,3.4346041766830635e-5,-4.057808965225653e-9,8.657669387277931e-4,3.446932313815453e-5,-4.11101586076775e-9,8.657613435022625e-4,3.4472588411529344e-5,-4.112539581686109e-9,8.657862135868558e-4,3.4373094380466114e-5,-4.069050533975013e-9,8.658735763707832e-4,3.4205060581144676e-5,-3.99475967321788e-9,8.660388852455758e-4,3.400943296480929e-5,-3.907091687927469e-9,8.66282466493992e-4,3.3825844969993364e-5,-3.823219696797409e-9,8.665927137849105e-4,3.3687619719216236e-5,-3.7578388388344435e-9,8.669494024009601e-4,3.361913423273398e-5,-3.7219299984715987e-9,8.673264891657124e-4,3.363439881774626e-5,-3.7220625465320145e-9,8.676945418145927e-4,3.373592694579208e-5,-3.7598487309122184e-9,8.680234235964354e-4,3.391351714465576e-5,-3.831368929963179e-9,8.682859972296471e-4,3.4143297256214016e-5,-3.926691202132316e-9,8.684632880644983e-4,3.4388163647136244e-5,-4.029972466578756e-9,8.685506814790997e-4,3.460127638371885e-5,-4.120889818604067e-9,8.685633840062911e-4,3.4734023180121915e-5,-4.178058611548191e-9,8.685380720783138e-4,3.4748252417980764e-5,-4.184372534042753e-9,8.685276349437916e-4,3.462966914812959e-5,-4.132901756292709e-9,8.685883291320915e-4,3.439669502663824e-5,-4.030854924441111e-9,8.687628382465881e-4,3.409933619952682e-5,-3.8992420211352555e-9,8.690658895057307e-4,3.3806647123293056e-5,-3.767634596223998e-9,8.694785799556857e-4,3.358696397155016e-5,-3.66578227162126e-9,8.69953568550893e-4,3.348840676249508e-5,-3.6152232829612797e-9,8.704286241585501e-4,3.352635120659295e-5,-3.623705146793659e-9,8.708434233092473e-4,3.36810197345908e-5,-3.6838087593563796e-9,8.711544860856722e-4,3.390464015558857e-5,-3.775680273187482e-9,8.713445725476498e-4,3.4135193673201416e-5,-3.872743220397276e-9,8.714246913321904e-4,3.4312587501143965e-5,-3.948669842514471e-9,8.714288385999942e-4,3.4392832306213484e-5,-3.983673438771948e-9,8.714035709437477e-4,3.4356588349835174e-5,-3.968454991877816e-9,8.713959401397892e-4,3.4210390500048455e-5,-3.904979500162979e-9,8.714434314935408e-4,3.398142071965159e-5,-3.80439632081465e-9,8.715682144280527e-4,3.370866502664886e-5,-3.6833035835006632e-9,8.717760142029626e-4,3.343373250814609e-5,-3.5597712152619653e-9,8.720583485322628e-4,3.3193644320049306e-5,-3.450143545804329e-9,8.723963305223968e-4,3.301640385510928e-5,-3.367013852901416e-9,8.727645877754009e-4,3.2918942751948914e-5,-3.318240190622122e-9,8.731346053164378e-4,3.290646426016532e-5,-3.3065975355143806e-9,8.734775263631105e-4,3.297227361968222e-5,-3.329661479803068e-9,8.737669246598247e-4,3.3097659941762863e-5,-3.3797021541565744e-9,8.739822501713752e-4,3.325204966262417e-5,-3.443668277316694e-9,8.741134429392175e-4,3.339441456133996e-5,-3.5037068763647772e-9,8.741663973729802e-4,3.347758868121113e-5,-3.538992779628764e-9,8.741674829281171e-4,3.3457101736264556e-5,-3.529614543781381e-9,8.741636709228396e-4,3.33044797175946e-5,-3.4624919926690294e-9,8.742144615830622e-4,3.302135267114131e-5,-3.337668517116169e-9,8.743747932608298e-4,3.264687423555464e-5,-3.1716545924770886e-9,8.746743840366114e-4,3.2251051243278426e-5,-2.9946081022665746e-9,8.751039489192597e-4,3.1913364921373566e-5,-2.841130150424048e-9,8.75616678903275e-4,3.169573821909346e-5,-2.738595983860198e-9,8.761445007935473e-4,3.162302292091491e-5,-2.698649906049282e-9,8.766203447195945e-4,3.167892308982781e-5,-2.715236885002451e-9,8.769963987697803e-4,3.18159383463042e-5,-2.7686104110067445e-9,8.772531062745815e-4,3.197221978649029e-5,-2.8323654947714774e-9,8.773990475854998e-4,3.2088299096119665e-5,-2.880564943726866e-9,8.774645762292172e-4,3.211954673233677e-5,-2.893205151464858e-9,8.774924155916585e-4,3.204298846969703e-5,-2.8593905607603026e-9,8.775277330636137e-4,3.185874387139908e-5,-2.778242446816188e-9,8.776094585559394e-4,3.158700840416259e-5,-2.657838435817586e-9,8.777641128132043e-4,3.126183960920271e-5,-2.5126548703569532e-9,8.78002877757191e-4,3.092341017264447e-5,-2.360210638245288e-9,8.78321864386743e-4,3.061051760107952e-5,-2.217716237311034e-9,8.787048132667152e-4,3.0354696413936292e-5,-2.0993733631963004e-9,8.791271129207127e-4,3.0176554948077197e-5,-2.0146576508170057e-9,8.795600526842855e-4,3.0084265265720063e-5,-1.9675904842138486e-9,8.799746005764623e-4,3.0073592700195904e-5,-1.9567272155798592e-9,8.803445685727407e-4,3.0128701933306585e-5,-1.9754931411414064e-9,8.806494724082241e-4,3.0223295863434567e-5,-2.012635250546257e-9,8.808775707256542e-4,3.0322170015652122e-5,-2.052817626545346e-9,8.810294629751855e-4,3.0383874541022066e-5,-2.077700737209661e-9,8.811219817814094e-4,3.0365784932921254e-5,-2.068140259899549e-9,8.811907881742122e-4,3.0232911390513986e-5,-2.0081342888122047e-9,8.812885190182023e-4,2.997035224275941e-5,-1.8904615726488688e-9,8.814748050867232e-4,2.9595882363843328e-5,-1.7223897108962145e-9,8.817972325406356e-4,2.9164896341324755e-5,-1.5279575596742727e-9,8.822694105023639e-4,2.8759323793384683e-5,-1.343146342028477e-9,8.828590048460752e-4,2.846005103322195e-5,-1.203784176843767e-9,8.834961316970444e-4,2.8315408404152892e-5,-1.1317019817736651e-9,8.840994293836644e-4,2.83238474756633e-5,-1.1270381711241277e-9,8.846048503517724e-4,2.8439563876848128e-5,-1.1705107836514342e-9,8.849825261434277e-4,2.859423427913567e-5,-1.2327153363012424e-9,8.852377405673897e-4,2.872082247503333e-5,-1.2843809606697235e-9,8.854014350719654e-4,2.876976020388615e-5,-1.303411303612948e-9,8.855175691600622e-4,2.8715569658327886e-5,-1.277894686911527e-9,8.856319414654461e-4,2.8556383656666185e-5,-1.2061264571813115e-9,8.857841196699158e-4,2.8309570284204513e-5,-1.0949624616496077e-9,8.86002414496257e-4,2.800577749822175e-5,-9.574157297751806e-10,8.863013254260068e-4,2.7682541703841347e-5,-8.099261480403505e-10,8.866810883604368e-4,2.737801278175877e-5,-6.695408320630273e-10,8.871291034948231e-4,2.712535762590261e-5,-5.513048593649785e-10,8.876228817584209e-4,2.6948399119048687e-5,-4.661876242949888e-10,8.881339924077757e-4,2.6858865286951922e-5,-4.197713685400893e-10,8.886323956855838e-4,2.6855412138336997e-5,-4.1179225649502044e-10,8.890905424093482e-4,2.6924258581403914e-5,-4.3643441475982406e-10,8.89486876270744e-4,2.704096977561104e-5,-4.831197421077393e-10,8.898087302066524e-4,2.7172978043164845e-5,-5.375765842824722e-10,8.900547902185537e-4,2.7282747178927522e-5,-5.831513974124379e-10,8.902372653753913e-4,2.733186854749421e-5,-6.02542926548089e-10,8.903834851144673e-4,2.7286782595027556e-5,-5.803341451115104e-10,8.905356820182493e-4,2.712678713758405e-5,-5.066546828876249e-10,8.907466490935431e-4,2.6853822167289743e-5,-3.817222697006188e-10,8.910687379135351e-4,2.650095008026581e-5,-2.1981389275727818e-10,8.915358613141435e-4,2.613316302797963e-5,-4.974968918210426e-11,8.921441557986117e-4,2.583341569558239e-5,9.130127597938247e-11,8.928435576312597e-4,2.5673648601187617e-5,1.7077634639135572e-10,8.935508750856743e-4,2.5683679634147847e-5,1.7468326592194504e-10,8.941811428365587e-4,2.5837610180360195e-5,1.1381510218411522e-10,8.946793739990621e-4,2.6067113585673513e-5,1.8006901262402275e-11,8.950349091826171e-4,2.6291644820413183e-5,-7.717084794839584e-11,8.952750213494531e-4,2.6446389435700407e-5,-1.427663814093566e-10,8.954475970296075e-4,2.64960814946439e-5,-1.625988001066087e-10,8.956041887442954e-4,2.6435196735103513e-5,-1.334689640026147e-10,8.957887712051753e-4,2.6280905283114967e-5,-6.224871917615731e-11,8.960323226691599e-4,2.6064317323041538e-5,3.777765165941726e-11,8.963513575114935e-4,2.5822815459411318e-5,1.5017549800954496e-10,8.96748509792149e-4,2.5594124919428984e-5,2.5799083696445723e-10,8.972140957359525e-4,2.5411712108030967e-5,3.459131555119787e-10,8.97728398380985e-4,2.5301088813513795e-5,4.0208667445015245e-10,8.982646818886401e-4,2.5276973108559064e-5,4.19511702332487e-10,8.987928885022273e-4,2.5341491278246515e-5,3.969097854818967e-10,8.992838386101128e-4,2.548373838032777e-5,3.389148700251626e-10,8.997135067687896e-4,2.5680959581705512e-5,2.5551799630259e-10,9.000668011166033e-4,2.590128913974731e-5,1.6084571383571664e-10,9.003404075887244e-4,2.610773225553987e-5,7.143433854803536e-11,9.005444531271067e-4,2.626306035931546e-5,4.124552392039377e-12,9.00702826310028e-4,2.6335350498633444e-5,-2.636373164642357e-11,9.008518990331428e-4,2.6304027478397698e-5,-1.0173572691243059e-11,9.010369750715351e-4,2.616622985452215e-5,5.4685092455799334e-11,9.013053376731691e-4,2.5942528849006335e-5,1.5954350428825642e-10,9.016950534266347e-4,2.5679451672258137e-5,2.8372503804596007e-10,9.022205066966907e-4,2.544470577148632e-5,3.9657633063202955e-10,9.028595081446744e-4,2.5311299328910574e-5,4.6464848630157026e-10,9.035509621163673e-4,2.5331826054565013e-5,4.634519661365919e-10,9.042106403831823e-4,2.5513725417149697e-5,3.8884970955208253e-10,9.047617243836385e-4,2.5811755065389144e-5,2.60664002639359e-10,9.051639505218222e-4,2.614554976562279e-5,1.1486292999309726e-10,9.054243849394402e-4,2.6432431256007105e-5,-1.1230224109221291e-11,9.055864786501333e-4,2.6615750824420068e-5,-9.174245642919217e-11,9.057083348203511e-4,2.6675961252054152e-5,-1.1728835587695205e-10,9.05843511575355e-4,2.6625694545636095e-5,-9.286576972832296e-11,9.06030514980889e-4,2.649764658641052e-5,-3.258481232105302e-11,9.06290090659766e-4,2.6332711316700743e-5,4.5492394804177083e-11,9.066269079166894e-4,2.617147979221003e-5,1.230902666428942e-10,9.07032727485054e-4,2.6049140781842117e-5,1.8405636274430814e-10,9.074895537591257e-4,2.5992565692749985e-5,2.1580884693763228e-10,9.079725233622418e-4,2.601842289978903e-5,2.1034058494702972e-10,9.08452843161885e-4,2.6131794189518346e-5,1.649501949413581e-10,9.089011187176733e-4,2.632531969086917e-5,8.266582317282753e-11,9.092912509323934e-4,2.657930002330282e-5,-2.7811191372744197e-11,9.096046947811349e-4,2.686337600497953e-5,-1.5287896453951608e-10,9.098343835696975e-4,2.7140160235303376e-5,-2.756580777618742e-10,9.099874027396871e-4,2.737067976970732e-5,-3.7839683569915226e-10,9.100856080701482e-4,2.7521019033657425e-5,-4.4541806075215186e-10,9.101636727790192e-4,2.756915427471307e-5,-4.662024595936307e-10,9.102644580498961e-4,2.751076592587584e-5,-4.3810314345020306E-10,9.104319511252228e-4,2.736291054800073e-5,-3.681879685719245e-10,9.107022221916946e-4,2.7164432891512126e-5,-2.736553609265788e-10,9.110933354507029e-4,2.6971680885033756e-5,-1.800824904443576e-10,9.11596330532063e-4,2.6848117080263942e-5,-1.167738231171905e-10,9.121710507471927e-4,2.6847793958635906e-5,-1.0913815308381964e-10,9.12751534970597e-4,2.6996070209376236e-5,-1.6964949395235283e-10,9.132634636288651e-4,2.72756008370633e-5,-2.9115810444199527e-10,9.136492992958313e-4,2.762733566158342e-5,-4.471383736182009e-10,9.138892892803114e-4,2.797002314543524e-5,-6.005507786510418e-10,9.140064810409892e-4,2.8229735821653137e-5,-7.173953360843062e-10,9.140537060586121e-4,2.8363778381520954e-5,-7.777099880424133e-10,9.14091744347561e-4,2.8368259804342512e-5,-7.790964097262822e-10,9.141707165736832e-4,2.8270290432506036e-5,-7.332676996715194e-10,9.143209375298112e-4,2.811333903517838e-5,-6.595294780294835e-10,9.145523676781168e-4,2.7943782175206335e-5,-5.787922436801097e-10,9.148586524660526e-4,2.780218073489562e-5,-5.09645207598181e-10,9.15222213264884e-4,2.771907523928594e-5,-4.663750532641056e-10,9.156186000215372e-4,2.771356286516508e-5,-4.581833019385022e-10,9.160198239972885e-4,2.7793018214471577e-5,-4.889247071998724e-10,9.163971548837643e-4,2.795307226790254e-5,-5.570122799444724e-10,9.167240149473723e-4,2.8177711329907586e-5,-6.554310086134877e-10,9.169794235753807e-4,2.8439962674449603e-5,-7.720472188029496e-10,9.171519825482253e-4,2.870402885777489e-5,-8.905750008556582e-10,9.172436935254598e-4,2.8929649817970348e-5,-9.925419838939779e-10,9.172722940063046e-4,2.9078832692983632e-5,-1.0603291660817625e-9,9.172706400546866e-4,2.912409780548574e-5,-1.080924584550345e-9,9.17282157849279e-4,2.9056323329246427e-5,-1.0495469582952546e-9,9.17352548715972e-4,2.8889652042343435e-5,-9.719977617501207e-10,9.175193386587934e-4,2.8661331040972106e-5,-8.647637143988589e-10,9.178017998224793e-4,2.842566755332037e-5,-7.524533284368034e-10,9.181939299909826e-4,2.824278153652306e-5,-6.627971222401617e-10,9.186627846165465e-4,2.8164133229208014e-5,-6.200278774014088e-10,9.19153691738718e-4,2.8217986087638425e-5,-6.380459293784765e-10,9.196025451004935e-4,2.8398984740483134E-05,-7.153326477966576e-10,9.199531003263491e-4,2.8666337663424036e-5,-8.338087002295918e-10,9.201741950295597e-4,2.8953522843619235e-5,-9.631226655409933e-10,9.202698561839225e-4,2.918802920852016e-5,-1.0697405631849333e-9,9.202770539297086e-4,2.9313951870328424e-5,-1.1274657767908662e-9,9.20251788073042e-4,2.9307694253609973e-5,-1.1248038587933661e-9,9.202503631241845e-4,2.918064509705824e-5,-1.0663142394564279e-9,9.203142811661418e-4,2.897003743896867e-5,-9.68530131895985e-10,9.204634699590332e-4,2.8724513202568727e-5,-8.534492296718607e-10,9.206973132387841e-4,2.849110787091789e-5,-7.426352211365498e-10,9.209999773637789e-4,2.8307067355278376e-5,-6.534492842105844e-10,9.213465790289916e-4,2.8196472237938423e-5,-5.974035621587512e-10,9.21708293335506e-4,2.8169942280115928e-5,-5.798940312517992e-10,9.220560080914304e-4,2.8225631349565033e-5,-6.005462214024394e-10,9.223629986190541e-4,2.8350410654034294e-5,-6.536955210792199e-10,9.226073866112044e-4,2.8520935298446312e-5,-7.28851240962084e-10,9.227750120124014e-4,2.8705005688838147e-5,-8.113094184352923e-10,9.228628541636617e-4,2.886416079327547e-5,-8.833278120249603e-10,9.228823589672353e-4,2.895853283479903e-5,-9.263428574000358e-10,9.228611534120579e-4,2.8954410829763517e-5,-9.244525203760215e-10,9.22841094274703e-4,2.8833597004887607e-5,-8.687589669821464e-10,9.228711087655056e-4,2.860178543460586e-5,-7.612984631604381e-10,9.229952903879357e-4,2.8291928119182712e-5,-6.167002132570091e-10,9.232395355675018e-4,2.7959342967609063e-5,-4.600776629160696e-10,9.236018170315074e-4,2.766851040299726e-5,-3.211006337196332e-10,9.240504121843283e-4,2.7475443382623978e-5,-2.2596816610665073e-10,9.24531262399518e-4,2.741170749626898e-5,-1.8999789985040983e-10,9.249820629694834e-4,2.747542499218661e-5,-2.1326498107148244e-10,9.25348579660942e-4,2.7631811895541113e-5,-2.805432543382063e-10,9.255984900902482e-4,2.7822723222327646e-5,-3.6544697746303546e-10,9.257290496695094e-4,2.798233184373522e-5,-4.3755816439126784e-10,9.25766534088789e-4,2.80545120609564e-5,-4.705154590635174e-10,9.257576987930197e-4,2.800685278340508e-5,-4.4865598588417815e-10,9.257561138535627e-4,2.7837106293070436e-5,-3.701910247767966e-10,9.258080615404461e-4,2.757056376533481e-5,-2.4616627976356377e-10,9.259425348434525e-4,2.7250326470559132e-5,-9.609656809923689e-11,9.261676807511085e-4,2.6924824434891593e-5,5.773311606893498e-11,9.264731188036599e-4,2.663697142690499e-5,1.9528968966108854e-10,9.268356351407438e-4,2.6417432659609167e-5,3.019901995562894e-10,9.272255509647921e-4,2.6282152592361178e-5,3.6997091936557287e-10,9.276120574189009e-4,2.6232846291373425e-5,3.9797540595297546e-10,9.279670116931762e-4,2.6258881085469936e-5,3.9055441141759986e-10,9.282675227858236e-4,2.633942937784366e-5,3.570959163618194e-10,9.284980234511821e-4,2.644547284239765e-5,3.109050504872678e-10,9.286524796636579e-4,2.654193492234242e-5,2.6822927772623276e-10,9.287369625751979e-4,2.6590780100069592e-5,2.468431766251289e-10,9.287720369209947e-4,2.6556135305642376e-5,2.636822102111064e-10,9.287934339306461e-4,2.6412028824363202e-5,3.312264037819188e-10,9.288486997992517e-4,2.6151880961107663e-5,4.530300718778846e-10,9.289878720362526e-4,2.5796515725207018e-5,6.199146734068698e-10,9.292487589067231e-4,2.5395465656098757e-5,8.092647167352129e-10,9.29641666352082e-4,2.5017209649756432e-5,9.894516360464816e-10,9.301413876496481e-4,2.472917795980915e-5,1.1290141747255939e-9,9.306922559167429e-4,2.4575229989538544e-5,1.2070780979559616e-9,9.312251819721861e-4,2.4561109000296633e-5,1.2202059312944135e-9,9.316789667520669e-4,2.465414560968802e-5,1.1827604254879246e-9,9.320169043861123e-4,2.479571175444768e-5,1.1213819953507269e-9,9.322336847376593e-4,2.4919677271373376e-5,1.0666004249723868e-9,9.323526991819391e-4,2.496981318218703e-5,1.044792681412822e-9,9.324168167771345e-4,2.4911728305382368e-5,1.072537792680831e-9,9.324763341556606e-4,2.473779692662344e-5,1.1541348440936524e-9,9.32577287240139e-4,2.446550131433796e-5,1.2821529509168165e-9,9.327524775390439e-4,2.4130741138395573e-5,1.440358563370683e-9,9.330166395630526e-4,2.3778318046824064e-5,1.608044416470438e-9,9.333661039477023e-4,2.345210977652227e-5,1.7646106799430005e-9,9.337821762564567e-4,2.3187164366326925e-5,1.8933448565731633e-9,9.342366534787011e-4,2.3004991867956138e-5,1.983756984261391e-9,9.346977645863617e-4,2.2912152275451638e-5,2.0323646948176415e-9,9.351352665974508e-4,2.2901360219547865e-5,2.0422501912195693e-9,9.355241516458479e-4,2.2953966611580642e-5,2.021915505548688e-9,9.358471024062418e-4,2.3042848220487e-5,1.983917263664366e-9,9.360962029673838e-4,2.313526295966051e-5,1.9435240421953627e-9,9.362744148421519e-4,2.319579877368126e-5,1.9173555450183216e-9,9.363970340869479e-4,2.3190008396632788e-5,1.921714213936969e-9,9.364926985739199e-4,2.3089580081948874e-5,1.970175219873316e-9,9.366025595028989e-4,2.287954350737153e-5,2.070174683549589e-9,9.367754583789063e-4,2.256662486320555e-5,2.219009962619075e-9,9.370572543760401e-4,2.2185503816041416e-5,2.40080151825208e-9,9.374749898088448e-4,2.179746684581724e-5,2.5870254829646286e-9,9.380215496738124e-4,2.1476617739059208e-5,2.7428988022427817e-9,9.386504920238448e-4,2.1285143976963856e-5,2.8389345262250392e-9,9.392879545260637e-4,2.124847926412409e-5,2.8626284858923288e-9,9.398581363504856e-4,2.1344635824425707e-5,2.8236063659948714e-9,9.403092110193681e-4,2.1513973951784947e-5,2.749245885993131e-9,9.406269138130842e-4,2.1682634723939766e-5,2.67386501863676e-9,9.408323763286779e-4,2.178648157968665e-5,2.6275885831474924e-9,9.409696504997068e-4,2.1786146578814432e-5,2.6292808737827737e-9,9.410906514838015e-4,2.1671298131321062e-5,2.6844268786052037e-9,9.41242649635597e-4,2.145702236312698e-5,2.786633456564728e-9,9.414601509848395e-4,2.1176178630965497e-5,2.9210047073092557e-9,9.417610200086401e-4,2.0870608445111807e-5,3.0681179766648086e-9,9.421460370053103e-4,2.0582809873944577e-5,3.207899651127782e-9,9.426010936837508e-4,2.0348968697412414e-5,3.3229824926066307e-9,9.431012540259686e-4,2.0193985304551373e-5,3.401195641488044e-9,9.436158120570794e-4,2.012884842892798e-5,3.436951038320817e-9,9.441134784478598e-4,2.015031500623975e-5,3.4314859276191417e-9,9.44566950904901e-4,2.0242534645964484e-5,3.3921135298370826e-9,9.449563631171996e-4,2.0379982085524475e-5,3.330805785534591e-9,9.45271517348029e-4,2.0530961708450033e-5,3.2625023737391606e-9,9.455131621575188e-4,2.0661233197895548e-5,3.203395247216593e-9,9.456936234191719e-4,2.0737740900431553e-5,3.1692023079153e-9,9.458369007988554e-4,2.073272466669384e-5,3.1732674706314038e-9,9.459779040524844e-4,2.0628653770206123e-5,3.224233945190357e-9,9.461597634391267e-4,2.0424167988906754e-5,3.3231751090821356e-9,9.46427574458297e-4,2.014003684687474e-5,3.4606600272122213e-9,9.468173676227388e-4,1.98221812789624e-5,3.615192303367057e-9,9.473413942934375e-4,1.9537012097558103e-5,3.755318583394564e-9,9.479753457182548e-4,1.9355058402098106e-5,3.847349600926752e-9,9.486571399076209e-4,1.9325058394134616e-5,3.867688552958027e-9,9.493040520760504e-4,1.9450539767815956e-5,3.814066075128484e-9,9.498430651538646e-4,1.9684623094334385e-5,3.7081770948540923e-9,9.502378728614017e-4,1.994861501821484e-5,3.5870008241428506e-9,9.504975307118342e-4,2.01632840220824e-5,3.4880374073031084e-9,9.506654032765242e-4,2.0274709481559317e-5,3.437068799563959e-9,9.507989420812344e-4,2.0264365859063468e-5,3.4433449550727618e-9,9.509516863480496e-4,2.0145143002205663e-5,3.5013586813003237e-9,9.511626032896819e-4,1.9950604861647016e-5,3.595755007819909e-9,9.514523625841899e-4,1.972359867900281e-5,3.7065483148110366e-9,9.518240846294337e-4,1.9507126203245064e-5,3.813351896094841e-9,9.522662841079077e-4,1.933798514493866e-5,3.898421280054506e-9,9.527567177104721e-4,1.9242649321887765e-5,3.94873970416592e-9,9.532666534200279e-4,1.9234898009828817e-5,3.9573083496472175e-9,9.537653046836214e-4,1.931500888982162e-5,3.923656171525834e-9,9.542241491314553e-4,1.9470419469034043e-5,3.853573929853045e-9,9.546208269205008e-4,1.967778168597357e-5,3.758113485784791e-9,9.549422337944906e-4,1.990624356532854e-5,3.6519733720235854e-9,9.551864658672643e-4,2.012153016907811e-5,3.5515235649189295e-9,9.553635348866212e-4,2.029033148993112e-5,3.4727284456947125e-9,9.554949463176509e-4,2.0384734278047446e-5,3.429079651875691e-9,9.55612166139684e-4,2.03866030610309e-5,3.4295402733541126e-9,9.557537872596488e-4,2.029183687422643e-5,3.4764900665650733e-9,9.559608378031081e-4,2.0114246891201803e-5,3.563775485379721e-9,9.562694312086343e-4,1.988802000189864e-5,3.6753836672060575e-9,9.567005353306505e-4,1.9666425812314765e-5,3.785918859393363e-9,9.572485741343938e-4,1.951354653734905e-5,3.864486310112931e-9,9.57873847869679e-4,1.9487015195238054e-5,3.8829949935352816e-9,9.58506375185627e-4,1.961495423927636e-5,3.827353654574862e-9,9.590658554599388e-4,1.9878214338844435e-5,3.706183686441474e-9,9.59491778185771e-4,2.021167822462048e-5,3.5503480856677113e-9,9.597671996149698e-4,2.0528378965229346e-5,3.4014299519401243e-9,9.599217284447296e-4,2.0753552855409916e-5,3.295380207449077e-9,9.600140258223889e-4,2.084893939258985e-5,3.2508500223577976e-9,9.601071466008167e-4,2.081721898662703e-5,3.2670417811981256e-9,9.602500853369318e-4,2.0691028420511654e-5,3.3288768573415605e-9,9.604701387776805e-4,2.051709319339869e-5,3.4144264007709955e-9,9.60773545484276e-4,2.034297332174702e-5,3.501100421052396e-9,9.611500679665309e-4,2.0208786324005668e-5,3.569552864573399e-9,9.615783591656324e-4,2.014318881895291e-5,3.6056735200335207e-9,9.620307130834803e-4,2.0161937110386437e-5,3.6014269400379457e-9,9.62477113531018e-4,2.0267731706648574e-5,3.5550823882264824e-9,9.628889049217328e-4,2.0450864920827385e-5,3.4710012484743916e-9,9.632422415170349e-4,2.069066577730867e-5,3.3589647822421636e-9,9.635212754316284e-4,2.0957906935666852e-5,3.2329849290971195e-9,9.637208099389389e-4,2.1218360815741975e-5,3.1095519476630494e-9,9.638478893925641e-4,2.143740445538196e-5,3.0054061149790872e-9,9.639218361763492e-4,2.158517204251695e-5,2.9350831633136274e-9,9.639725275225862e-4,2.164161332623286e-5,2.9085171189180765e-9,9.64036920303166e-4,2.1600821946777073e-5,2.928960887667208e-9,9.641539462469475e-4,2.1473982466179215e-5,2.991503500896854e-9,9.643579665181983e-4,2.129029021121154e-5,3.0824929931979146e-9,9.646710825382556e-4,2.1095019009386883e-5,3.180304929063653e-9,9.650951414487477e-4,2.0943493593642626e-5,3.2581268817857795e-9,9.656055505064805e-4,2.08898021785074e-5,3.2893920797482204e-9,9.661506527532753e-4,2.0970707862049013e-5,3.2556740154475738e-9,9.666609700686485e-4,2.1188936127107843e-5,3.154989219151684e-9,9.670695157136533e-4,2.1504456001118907e-5,3.0062342252277902e-9,9.673367523603838e-4,2.1842686062608042e-5,2.8453160317467475e-9,9.674669505838162e-4,2.2120216315934066e-5,2.7126670331229932e-9,9.675052672091475e-4,2.227588153984791e-5,2.6381300324599617e-9,9.67517310975436e-4,2.2290098639572074e-5,2.631571812351488e-9,9.675641549386202e-4,2.2184188610723864e-5,2.683192639935835e-9,9.676856175598294e-4,2.20050732406217e-5,2.770831293998539e-9,9.678958345343047e-4,2.1806797104405777e-5,2.8687326779884426e-9,9.681874796128061e-4,2.1636899335670483e-5,2.953998363007588e-9,9.685391645791842e-4,2.152957275673156e-5,3.00987037631748e-9,9.689223645110006e-4,2.150393434528262e-5,3.0266647100820593e-9,9.693065461435913e-4,2.1564905127593073e-5,3.0015027830697376e-9,9.696627464705727e-4,2.170489096403e-5,2.9376390040777005e-9,9.699663713453124e-4,2.190558400417185e-5,2.843664610904784e-9,9.701997585934131e-4,2.213998368625858e-5,2.732536103734538e-9,9.703546573483743e-4,2.2375052452482884e-5,2.6202568912921775e-9,9.704343769114892e-4,2.2575473791547756e-5,2.524023751178972e-9,9.70454924970594e-4,2.2708679506424222e-5,2.4597828841057676e-9,9.704442684490575e-4,2.2750680548228815e-5,2.4394191096140195e-9,9.70439123002729e-4,2.269163919856002e-5,2.4680675742140396e-9,9.704792630519241e-4,2.2539791907013454e-5,2.542185695856593e-9,9.706000419416595e-4,2.2322356320565065e-5,2.6490241837254375e-9,9.708244225247657e-4,2.208254490993235e-5,2.7679330778128663e-9,9.711561348596273e-4,2.1872563135784633e-5,2.8736116004682885e-9,9.715756674472968e-4,2.1743144202396543e-5,2.9411105609226534e-9,9.720408542324096e-4,2.1730926538918943e-5,2.952015717458691e-9,9.724936339510598e-4,2.1846219921065344e-5,2.9005828036571425e-9,9.728734724452532e-4,2.206526684943893e-5,2.797753482524233e-9,9.73135268736305e-4,2.2331915022099625e-5,2.670534930423955e-9,9.732656869873846e-4,2.2571721047228047e-5,2.5551777813643346e-9,9.732896097496811e-4,2.2715649390846857e-5,2.4855509251822116e-9,9.732616414073596e-4,2.272350320648063e-5,2.481624710067114e-9,9.732459633450723e-4,2.2595527734851322e-5,2.5437609524692543e-9,9.732948670608518e-4,2.2367393624596813e-5,2.6551037957679194e-9,9.73435775314028e-4,2.2093662920085047e-5,2.7895237218060307e-9,9.736697513088091e-4,2.18295826774539e-5,2.9203430820786453e-9,9.739779823635234e-4,2.1618463822268142e-5,3.0263986928152343e-9,9.743307630656896e-4,2.14864286442583e-5,3.094632000552376e-9,9.746951934172733e-4,2.1442559653592196e-5,3.120143478228777e-9,9.75040337470858e-4,2.1481561948537084e-5,3.105047155900916e-9,9.753402753088035e-4,2.1586872020260996e-5,3.0570669881734935e-9,9.755760407850127e-4,2.1733399542332765e-5,2.9882432258541283e-9,9.757372606998641e-4,2.1890007987213578e-5,2.913710103700545e-9,9.758238522467932e-4,2.2022308074060718e-5,2.8502981225779335e-9,9.758475695193567e-4,2.2096463822383953e-5,2.814649675643213e-9,9.75832592759985e-4,2.208441265972937e-5,2.8206647589847394e-9,9.758139779570534e-4,2.1970120824932505e-5,2.8764536267483205e-9,9.758329513980938e-4,2.1755459239150598e-5,2.9814657729990575e-9,9.759289405456378e-4,2.146343405290607e-5,3.1248755506446147e-9,9.761297562449015e-4,2.1136469459250627e-5,3.2863308207215907e-9,9.764427844228285e-4,2.0828722875066234e-5,3.4395760619971846e-9,9.768504235625822e-4,2.05936578116549e-5,3.558401665094199e-9,9.773119310828517e-4,2.047011212383905e-5,3.623414500991834e-9,9.777718670258082e-4,2.0470907088346007e-5,3.627703453703138e-9,9.781733258317801e-4,2.057752945621449e-5,3.5796494003707138e-9,9.784727031122457e-4,2.0742968740602736e-5,3.501766797457081e-9,9.786520083386822e-4,2.090280873294008e-5,3.4254174178099575e-9,9.787247391817811e-4,2.099234249163606e-5,3.3824366972435045e-9,9.787325073239532e-4,2.0964978181006943e-5,3.3960258792809006e-9,9.787325574450096e-4,2.080554329966027e-5,3.474116418782361e-9,9.78780386798012e-4,2.053316629811452e-5,3.607853339306525e-9,9.78914283306498e-4,2.0192836373745813e-5,3.7756288344559166e-9,9.79147450149718e-4,1.9840040928541138e-5,3.9505044744465266e-9,9.794691393037586e-4,1.9525344833017023e-5,4.107694790089413e-9,9.798520178516646e-4,1.928413468832371e-5,4.229601723499455e-9,9.802613780058582e-4,1.9132999458968806e-5,4.30768523320254e-9,9.806628425931363e-4,1.9071152761889917e-5,4.341903576740723e-9,9.810273134182267e-4,1.9084239326578834e-5,4.338962357581536e-9,9.81333537072951e-4,1.9148443642578993e-5,4.310353550740631e-9,9.81569296115634e-4,1.9233976343823555e-5,4.2706388260183405e-9,9.817321483998952e-4,1.9307966381521585e-5,4.235993167701627e-9,9.81830219636952e-4,1.933733918927407e-5,4.222757802688705e-9,9.818829501630556e-4,1.9292467400002797e-5,4.245632427234919e-9,9.819209964844942e-4,1.9152168044642423e-5,4.315222825428222e-9,9.8198392831691e-4,1.890983975966044e-5,4.435029642934434e-9,9.821143377150008e-4,1.857919889488635e-5,4.59861659028588e-9,9.823480141006478e-4,1.819663416702158e-5,4.788408783691395e-9,9.827021678395676e-4,1.781681352429813e-5,4.977767747591471e-9,9.8316630954625e-4,1.750019208422675e-5,5.1370239028109335e-9,9.837010460599907e-4,1.729533464359589e-5,5.242087342349132e-9,9.842471758127079e-4,1.722284340206006e-5,5.282365711457081e-9,9.847423799112572e-4,1.7267922501442923e-5,5.2645551112541595e-9,9.851390392167326e-4,1.7384650541422545e-5,5.210737350473865e-9,9.85416712413494e-4,1.7509721680699187e-5,5.151788515618179e-9,9.855858656559924e-4,1.7580163367743918e-5,5.118732221992248e-9,9.856830005405348e-4,1.754937325800318e-5,5.134813103943706e-9,9.857596419803308e-4,1.7397498039928058e-5,5.210281577132254e-9,9.858686370143312e-4,1.7134242430752782e-5,5.340872784086539e-9,9.860514093620037e-4,1.6794137806137563e-5,5.509998145968244e-9,9.863293550422345e-4,1.6426136917274978e-5,5.693759305662125e-9,9.867012674118518e-4,1.6080882897378395e-5,5.867166202605813e-9,9.871466831850105e-4,1.5799461394281728e-5,6.009706321470195e-9,9.876331363464859e-4,1.560644168178504e-5,6.108876220456722e-9,9.881244546795737e-4,1.5508013115131364e-5,6.16123561320287e-9,9.885877203164924e-4,1.5494168132305846e-5,6.1714423956312695e-9,9.889977731607897e-4,1.554301218967708e-5,6.150173958810571e-9,9.89339357154404e-4,1.5625438489487203e-5,6.11180328305642e-9,9.896077069428486e-4,1.5709163928471263e-5,6.072354236231378e-9,9.898084641090051e-4,1.5761986455145772e-5,6.047846128949401e-9,9.89957481892549e-4,1.575472773264608e-5,6.052821432389052e-9,9.900805416390554e-4,1.5664564164811243e-5,6.098708901861965e-9,9.902123484409752e-4,1.5479331179479615e-5,6.191709401312268e-9,9.903935258545628e-4,1.5202748222706768e-5,6.33020714370356e-9,9.906641160678208e-4,1.4859172652645127e-5,6.502381741232603e-9,9.910530106883304e-4,1.4494749524882107e-5,6.685572808518867e-9,9.915653761885476e-4,1.4170939529055735e-5,6.8494023081549725e-9,9.92173804543939e-4,1.3948485846748767e-5,6.963646567409606e-9,9.92820439606734e-4,1.3865800846189006e-5,7.008937764536123e-9,9.934330686488335e-4,1.3922023616282452e-5,6.98524850756154e-9,9.939493480964887e-4,1.4075052891534514e-5,6.91302227434678e-9,9.943372374337234e-4,1.4256527274009431e-5,6.825888020437902e-9,9.946022722861765e-4,1.4395571285888233e-5,6.75895614654633e-9,9.947808856143072e-4,1.4439740434982362e-5,6.738430832136037e-9,9.949257957257986e-4,1.4366093115323758e-5,6.776065172871318e-9,9.950905167510095e-4,1.418186073054903e-5,6.868729017701459e-9,9.953173989064848e-4,1.391790875148587e-5,7.001518418367263e-9,9.95630713119781e-4,1.3618756991412558e-5,7.152573416875709e-9,9.960345799292754e-4,1.3332040182830323e-5,7.29822948174995e-9,9.965148922381106e-4,1.3099245727471433e-5,7.4176277467670906e-9,9.970441941477112e-4,1.294893783688122e-5,7.496180701557594e-9,9.975882397394037e-4,1.2893264734091967e-5,7.527452492986098e-9,9.98112746713271e-4,1.2927881166143136e-5,7.513323955728468e-9,9.985890416039868e-4,1.3034634044303174e-5,7.462717843178684e-9,9.98997826875862e-4,1.3185900947308538e-5,7.389423516943071e-9,9.993309205324102e-4,1.3349405125668461e-5,7.3096360810763596e-9,9.99591375901445e-4,1.3492586365441474e-5,7.2397137309556e-9,9.99792668555754e-4,1.3586170648049899e-5,7.19436794380859e-9,9.999574846180697e-4,1.3607159236305784e-5,7.185183536470915e-9,0.0010001162353076604,1.3541721843540724e-5,7.219205045654568e-9,0.0010003049165363592,1.3388426048463978e-5,7.297338394204071e-9,0.0010005613623854227,1.3161776667357265e-5,7.4125560623676355e-9,0.0010009186855654698,1.2894930291567578e-5,7.548472365832492e-9,0.001001395431805748,1.2638913929780974e-5,7.679645009834532e-9,0.0010019842716833783,1.2454704246940159e-5,7.775465670467849e-9,0.0010026447567112351,1.2396089240531763e-5,7.80872345265965e-9,0.0010033080233894881,1.2487217081785896e-5,7.766920829338294e-9,0.0010038972478855197,1.2706548445498057e-5,7.660458605367358e-9,0.0010043565504526115,1.2989946449421098e-5,7.521224770364038e-9,0.001004672231437384,1.3254551939388285e-5,7.390681026669133e-9,0.0010048741581043606,1.3430195374539308e-5,7.304097230213788e-9,0.001005019125368549,1.3480998017901777e-5,7.27969563649755e-9,0.001005168386359312,1.340941335065461e-5,7.316596454133312e-9,0.0010053704906546521,1.3246930061867809e-5,7.3994046186029145e-9,0.0010056532197300141,1.3040000118914438e-5,7.505138119129774e-9,0.0010060229091539998,1.2837303701281687e-5,7.609490773330097e-9,0.0010064679702872599,1.2680694358525935e-5,7.691325334965295e-9,0.00100696410900686,1.2599802055308625e-5,7.73543576837147e-9,0.0010074799303969257,1.2609453088105831e-5,7.733972018905462e-9,0.0010079824262810555,1.270927137545503e-5,7.68678360040066e-9,0.001008441983199197,1.2885166585695294e-5,7.600766502657164e-9,0.0010088364680810365,1.3112382500046945e-5,7.488348827427479e-9,0.0010091540147537904,1.3359627618872047e-5,7.365366043977686e-9,0.0010093942793346546,1.3593707411098743e-5,7.248659658443538e-9,0.0010095681767792678,1.3783993741249416e-5,7.15377885761242e-9,0.0010096964280629517,1.3906222158150544e-5,7.093063507146875e-9,0.0010098073351207102,1.3945501108580383e-5,7.074156161434548e-9,0.001009933998475673,1.3898670498425644e-5,7.098839141011301e-9,0.0010101108925560731,1.3776156395851466e-5,7.162087545997906e-9,0.0010103693537762879,1.3603229200616472e-5,7.2513716092129284e-9,0.001010731370310706,1.3419833637562037e-5,7.3466457393835305e-9,0.0010112016762827962,1.3277108498864683e-5,7.422018074019115e-9,0.0010117598625822178,1.3228209751310446e-5,7.450356500270065e-9,0.0010123568768607588,1.3312347000828476e-5,7.411421404428368e-9,0.0010129222480500654,1.3535582819181508e-5,7.301724939909382e-9,0.001013385331984101,1.3858804132080293e-5,7.140781390672817e-9,0.001013703707706818,1.4205000113155494e-5,6.967497490960027e-9,0.0010138822454817784,1.448749274687313e-5,6.825833236491937e-9,0.0010139696115598694,1.464433393257325e-5,6.747309515966404e-9,0.001014034960781267,1.4658559233696529e-5,6.740744459985028e-9,0.0010141406929217946,1.4555765436898252e-5,6.793498539548968e-9,0.0010143254890754552,1.4386576477060897e-5,6.880297884166936e-9,0.0010146008251386124,1.420706593101242e-5,6.973012537470857e-9,0.0010149561275081414,1.4065065181815716e-5,7.047465907773897e-9,0.00101536675460542,1.3993570240248546e-5,7.0867457546242325e-9,0.0010158013574818438,1.4009210516690739e-5,7.0820601273590445e-9,0.0010162275161801665,1.4113340727320419e-5,7.032323770553171e-9,0.0010166159146742558,1.429419134817385e-5,6.943198192930504e-9,0.0010169435907143895,1.4529570251940101e-5,6.825790427443894e-9,0.001017196458485237,1.4790107827825064e-5,6.695003258799705e-9,0.0010173710222833715,1.5043063994411697e-5,6.5675509780237646e-9,0.0010174750556951806,1.5256600380969255e-5,6.459732390817189e-9,0.001017526963278131,1.5404159828331004e-5,6.385177403566588e-9,0.0010175537373666459,1.5468376233596634e-5,6.352868110860509e-9,0.001017587717364337,1.544402654131814e-5,6.365661713647204e-9,0.0010176624605994554,1.5339717534360233e-5,6.419435210938414e-9,0.0010178080063839555,1.5178075945731396e-5,6.502944076621323e-9,0.0010180457452669584,1.4994254410299033e-5,6.598491835633543e-9,0.001018383064035031,1.4832381264038678e-5,6.6836353960864175e-9,0.0010188083316972948,1.47391332796154e-5,6.734397667122887e-9,0.0010192878609278002,1.475363974145172e-5,6.730438678602947e-9,0.0010197678046505864,1.4894272655654495e-5,6.661915015952189e-9,0.00102018443463024,1.5145950174105276e-5,6.5361350999692345e-9,0.0010204836747962334,1.5455522234757765e-5,6.380048705078234e-9,0.0010206437243931602,1.5743334912936524e-5,6.2343512371156256e-9,0.0010206877187796243,1.5931055263172206e-5,6.139179160224897e-9,0.0010206758978202743,1.5972669549953236e-5,6.118206896081988e-9,0.0010206802785743953,1.587040614601252e-5,6.170538509004209e-9,0.0010207572457502255,1.5667653115910527e-5,6.274358304487625e-9,0.0010209325449119094,1.5426977239675342e-5,6.398084889086976e-9,0.0010212017498908892,1.520786821074164e-5,6.511580983868921e-9,0.0010215398590799887,1.5053291656116975e-5,6.5929010127443566e-9,0.001021912431934167,1.498569502034724e-5,6.630329259183798e-9,0.0010222841435015692,1.5008880327172054e-5,6.621529648464819e-9,0.0010226239917599095,1.5112068113238198e-5,6.571614831742929e-9,0.0010229080944826484,1.527401144689631e-5,6.491159177179544e-9,0.0010231212780165244,1.5466570242856973e-5,6.394419794620523e-9,0.001023258140679252,1.565799311163615e-5,6.29764201481796e-9,0.001023323723746117,1.581631986787821e-5,6.217269214912676e-9,0.0010233335657502231,1.5913194832607108e-5,6.1679458224003706e-9,0.001023312652942418,1.592801691867029e-5,6.160375068918902e-9,0.0010232928007281963,1.5851837316847298e-5,6.199331981376249e-9,0.0010233083950897286,1.5690131829775294e-5,6.282255337576482e-9,0.0010233908943278179,1.5463603240336597e-5,6.398818557630599e-9,0.0010235628682748299,1.5206365333078503e-5,6.531796793225194e-9,0.001023832615986048,1.4961295414609502e-5,6.659351030318273e-9,0.0010241904386357422,1.4772889164037382e-5,6.75860252344733e-9,0.001024607567166903,1.4678269177210256e-5,6.810218842264442e-9,0.001025038835875019,1.4697338813962965e-5,6.803536849223181e-9,0.0010254302198467145,1.4824014543455562e-5,6.7412161836967475e-9,0.001025731571596928,1.5021882123837198e-5,6.641636326261475e-9,0.0010259126052034333,1.522848767407803e-5,6.536783150416774e-9,0.0010259765363499528,1.5370953906319304e-5,6.464197088487894e-9,0.0010259633245588596,1.5390062552732196e-5,6.454503675266422e-9,0.0010259374918061134,1.5262568774086813e-5,6.519889575291671e-9,0.0010259645518792863,1.5009405517106155e-5,6.649894303135918e-9,0.0010260881771412683,1.4685110812366908e-5,6.816835676346961e-9,0.0010263193576777233,1.4355638624471758e-5,6.98711790063453e-9,0.0010266398889383535,1.4077159844329356e-5,7.1319926882616635e-9,0.001027014226018415,1.388425288732607e-5,7.2335633845970444e-9,0.0010274020414492461,1.3788133610311604e-5,7.285745723386852e-9,0.0010277670997235588,1.378095198171993e-5,7.292187151879546e-9,0.0010280818168414282,1.384189253769118e-5,7.263261955630348e-9,0.0010283288268859772,1.3942614549109414e-5,7.213352520340318e-9,0.0010285011445110084,1.405139140764495e-5,7.158731665697266e-9,0.0010286019408435882,1.413632711989153e-5,7.115870597147311e-9,0.0010286442540053864,1.4168322568558104e-5,7.09986088584424e-9,0.0010286504037499457,1.4124365397943462e-5,7.12268504128625e-9,0.0010286504791455998,1.3991292700524017e-5,7.191271681234185e-9,0.0010286791648484964,1.3769478993510954e-5,7.3056080066068604e-9,0.0010287705469715204,1.3475266008978337e-5,7.457494460578409e-9,0.001028951327632887,1.3140689311306862e-5,7.630660550566689e-9,0.0010292338285229816,1.280935564220711e-5,7.802822009644976e-9,0.0010296108825569928,1.2528353458002378e-5,7.949760843038067e-9,0.0010300546940236487,1.233759347627838e-5,8.050755726164393e-9,0.0010305208273311641,1.2259178009605778e-5,8.094075186049836e-9,0.0010309570900584187,1.2289732755782155e-5,8.08103476461809e-9,0.0010313157392175553,1.239822992254162e-5,8.027273387668908e-9,0.0010315663465513536,1.2530919495367793e-5,7.960336714121893e-9,0.0010317058209335492,1.2623500762804774e-5,7.913435014428099e-9,0.001031761762409121,1.2618455216019864e-5,7.916445804350526e-9,0.0010317863213620134,1.2482715648861428e-5,7.986708154305847e-9,0.0010318409415092163,1.2218875567850196e-5,8.123174915224233e-9,0.0010319770490094284,1.1864341225077265e-5,8.306813126168584e-9,0.00103222073763433,1.1478137897328902e-5,8.507363432120657e-9,0.001032567744181653,1.1121486498340977e-5,8.693293502779717e-9,0.001032989301697024,1.084087419509298e-5,8.840491614529463e-9,0.0010334441429188832,1.065944919603051e-5,8.936740074754993e-9,0.0010338905402688494,1.0577173083741774e-5,8.981736505163395e-9,0.0010342945423151325,1.0576383955421915e-5,8.98433665789792e-9,0.00103463375858786,1.0628837350001691e-5,8.958991422832772e-9,0.0010348979793146607,1.0701777354861157e-5,8.922621233770985e-9,0.0010350882727302663,1.0762337371071754e-5,8.89230185881902e-9,0.0010352157191526022,1.0780632780980312e-5,8.883608858628518e-9,0.0010353002554859072,1.0732303407048932e-5,8.90925860516677e-9,0.0010353694431257166,1.0601227344865006e-5,8.977690201699487e-9,0.0010354564618759658,1.0382697470573208e-5,9.09143350297743e-9,0.0010355964502504992,1.008658752883728e-5,9.245490273873833e-9,0.00103582062126145,9.739174784541215e-6,9.426394426544935e-9,0.001036148531357024,9.381685552026843e-6,9.612933762557046e-9,0.001036580411402926,9.063860868442835e-6,9.779418101910907e-9,0.0010370928511063498,8.832500434599207e-6,9.901545674027221e-9,0.0010376410685493903,8.717740287966906e-6,9.963490318062588e-9,0.001038168776362179,8.722090107823838e-6,9.963639543713632e-9,0.001038623174432724,8.817117820241822e-6,9.916433090139891e-9,0.0010389699638132367,8.949806345046257e-6,9.849185263172341e-9,0.0010392031310252545,9.056681538401306e-6,9.794814136056429e-9,0.0010393464417650642,9.081041880969784e-6,9.7828832107339e-9,0.0010394465445357972,8.98803121924295e-6,9.831716602058708e-9,0.0010395599652596504,8.773379181090786e-6,9.943793307826468e-9,0.0010397377850124105,8.463527638538071e-6,1.010562028455275e-8,0.0010400124740567555,8.107264085356009e-6,1.0292016552047566e-8,0.0010403907983126954,7.761647465210934e-6,1.047336668482392e-8,0.0010408546068110553,7.476975351250501e-6,1.0623406725890964e-8,0.0010413683448417354,7.285608742141655e-6,1.0725068130866081e-8,0.0010418898199738098,7.197436696745734e-6,1.077292879202111e-8,0.0010423802623030689,7.201792582882333e-6,1.0772323696065717e-8,0.0010428110604212102,7.273401012350935e-6,1.0736320365516424e-8,0.0010431666141344895,7.3794054706384364e-6,1.0682066369385867e-8,0.0010434442537033133,7.485424438284342e-6,1.062758834085327e-8,0.001043652630466233,7.559908129853109e-6,1.0589456096467488e-8,0.0010438096899647942,7.577040457584126e-6,1.0581220954317427e-8,0.0010439407598399314,7.518874452397437e-6,1.0612288493742078e-8,0.0010440766580099585,7.3774053804267025e-6,1.0686856280073861e-8,0.0010442511917944904,7.1569232978676465e-6,1.0802719477653824e-8,0.0010444971593526165,6.876269078840813e-6,1.0950114569202205e-8,0.001044840195797599,6.569674575005575e-6,1.1111270660756568e-8,0.0010452907905748228,6.284047442282688e-6,1.1261780001466925e-8,0.0010458366657182785,6.070632446913745e-6,1.1374885918198315e-8,0.0010464397212440041,5.970991705073476e-6,1.1428761032437083e-8,0.0010470419129418023,6.0012650636924906e-6,1.1414752486565529e-8,0.0010475808873286244,6.142246342171787e-6,1.134266195270011e-8,0.0010480101442759484,6.342031857499272e-6,1.1239472124113928e-8,0.0010483145665516262,6.531775462877667e-6,1.1141164514740623e-8,0.0010485141839921832,6.647674109549178e-6,1.1081204358546142e-8,0.0010486555927916323,6.649554437643226e-6,1.1080769771562399e-8,0.0010487962274780228,6.52970014858732e-6,1.1144090607712959e-8,0.001048988161110087,6.311113549640392e-6,1.1259318747852037e-8,0.001049266135585487,6.038217412853158e-6,1.140334069973273e-8,0.0010496417708631659,5.764112342343603e-6,1.1548386965958874e-8,0.001050103884713581,5.538005408647266e-6,1.1668579695155248e-8,0.0010506236688532541,5.395419538643018e-6,1.1745084312143063e-8,0.001051162793625547,5.352737678222033e-6,1.176905039772956e-8,0.0010516822059403249,5.4065291012566944e-6,1.1742069546748452e-8,0.0010521495626468031,5.5369304279269275e-6,1.1674479004989727e-8,0.0010525439851890206,5.7134564555245825e-6,1.1582329111142928e-8,0.0010528578438257308,5.9014015084172195e-6,1.1483979856274418e-8,0.0010530961263485919,6.067417747217445e-6,1.139710095373138e-8,0.0010532743691075914,6.1835874192326255e-6,1.133647354846759e-8,0.0010534160834845703,6.230045791333779e-6,1.1312589735762775e-8,0.001053550198721015,6.1966823130205854e-6,1.1330774854534354e-8,0.0010537085154161126,6.0844906794547615e-6,1.1390513063025623e-8,0.0010539227224054864,5.906847205676181e-6,1.1484802633572627e-8,0.00105422025687308,5.690435278638442e-6,1.1599668036115498e-8,0.0010546184278993171,5.4746708261865515e-6,1.1714426246353476e-8,0.001055117156275193,5.307635025766357e-6,1.1803769941651274e-8,0.001055692545616445,5.236529243510756e-6,1.184274644058134e-8,0.001056295705931545,5.292689648675187e-6,1.1814655608677331e-8,0.0010568617072468647,5.4757403210461624e-6,1.1719477956429268e-8,0.0010573293783666506,5.74604326804144e-6,1.157796966652239e-8,0.0010576645165347547,6.033560344798371e-6,1.1427058221344922e-8,0.0010578737870635731,6.261973517443829e-6,1.1307094518131505e-8,0.0010580009637449824,6.3760497725166996e-6,1.1247346419441141e-8,0.001058108517330219,6.358165356812837e-6,1.1257242872632262e-8,0.0010582556001528874,6.228289144348805e-6,1.1326384333356857e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json new file mode 100644 index 0000000..d7e3be9 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":13000,"numberOfSamples":1000,"samples":[0.0010584823083198346,6.031818825503171e-6,1.14309469118811e-8,0.0010588036033781425,5.823520864538709e-6,1.1542103150393909e-8,0.0010592110744742987,5.6537248748726675e-6,1.1633248752700286e-8,0.0010596790894540058,5.559275280564943e-6,1.1684765345343194e-8,0.0010601724727019367,5.559236240846307e-6,1.1686339583847125e-8,0.0010606540091394276,5.654379293057021e-6,1.163732802349451e-8,0.0010610908819856466,5.829497270171977e-6,1.1545624012790231e-8,0.0010614594503400023,6.057715047147503e-6,1.1425423187205381e-8,0.001061747989835144,6.305862037083749e-6,1.1294367431781857e-8,0.0010619573719630783,6.539955951254238e-6,1.1170587469196216e-8,0.0010620999645025674,6.73003410085884e-6,1.107008326599654e-8,0.0010621972572704668,6.85379996171742e-6,1.1004756707165859e-8,0.0010622768540195135,6.898913123430779e-6,1.098119849532928e-8,0.0010623693266318172,6.864185869807982e-6,1.1000078885400938e-8,0.0010625050436689565,6.760079817880366e-6,1.1055907410923635e-8,0.001062710756522555,6.608668374463369e-6,1.1137052470541557e-8,0.0010630055440594903,6.442842455479279e-6,1.122613014857253e-8,0.0010633958133875673,6.303928192637586e-6,1.1301216346173524e-8,0.0010638698300656857,6.236227673998108e-6,1.1338700200742188e-8,0.0010643938207032379,6.277096687541316e-6,1.1318549017049607e-8,0.0010649135018336272,6.443029009602109e-6,1.1231761017071778e-8,0.0010653652534506645,6.716334917457601e-6,1.1087554932954997e-8,0.0010656971998236583,7.041447402084115e-6,1.0915428186536279e-8,0.0010658919742331224,7.338860744797124e-6,1.0757744815379704e-8,0.0010659770288683225,7.534292063466726e-6,1.0654138240953239e-8,0.001066013886508743,7.587831708115414e-6,1.0625935223163422e-8,0.0010660723258305996,7.506181686783977e-6,1.0669662265910576e-8,0.0010662052115061964,7.3335686443663195e-6,1.0761922260944352e-8,0.0010664358470525873,7.130863915281745e-6,1.0870481691937031e-8,0.0010667588393153595,6.955633515934309e-6,1.0964801902708683e-8,0.0010671485918925085,6.8498410434954626e-6,1.1022511941646397e-8,0.0010675694409390784,6.835426550329633e-6,1.1031759374762615e-8,0.0010679841615469535,6.915158645441867e-6,1.0990824083116765e-8,0.0010683599657830244,7.076052103195604e-6,1.0906394119921115e-8,0.0010686723933572796,7.293685466136946e-6,1.0791343615514796e-8,0.00106890765095213,7.536822311352906e-6,1.0662299642942404e-8,0.0010690635977016276,7.77211139688823e-6,1.0537115853861746e-8,0.001069149428980129,7.968577301214409e-6,1.0432429890255657e-8,0.0010691841550370862,8.101601929648258e-6,1.036149374624633e-8,0.0010691940071483454,8.156061538266819e-6,1.0332478423133815e-8,0.001069209055658057,8.128266563717782e-6,1.03474435063982e-8,0.0010692594713290538,8.026593480405271e-6,1.0402013164716527e-8,0.0010693717459872535,7.870945267100574e-6,1.0485664177770738e-8,0.0010695649713014753,7.691125951702836e-6,1.05825672334285e-8,0.0010698471837835711,7.524020444771572e-6,1.0673046459330192e-8,0.0010702118794917663,7.409199319244088e-6,1.073588364535248e-8,0.0010706353190277158,7.382260325524803e-6,1.0751866255570777e-8,0.0010710762838212979,7.465490347225327e-6,1.0708824642405977e-8,0.0010714809682874885,7.6570210693528492E-06,1.0607528738465052e-8,0.0010717954666795326,7.92266264450533e-6,1.0466162353522634e-8,0.0010719849482146093,8.197549025520211e-6,1.031948512559187e-8,0.0010720518335533688,8.403355641842077e-6,1.0209555077841326e-8,0.0010720405373210041,8.477632103826806e-6,1.0169920153450947e-8,0.001072021738228369,8.400092320472587e-6,1.021150931330851e-8,0.0010720635198379748,8.199374023477202e-6,1.0319075409549964e-8,0.0010722065788787624,7.937147885028722e-6,1.0459750886515433e-8,0.00107245583521534,7.681893768449438e-6,1.0597036740148054e-8,0.0010727875503866039,7.487659268153709e-6,1.0702071381753594e-8,0.0010731630002383215,7.384581405590331e-6,1.075864496894142e-8,0.0010735409195010803,7.379180450137632e-6,1.0763066178824929e-8,0.001073885642552888,7.459556157906894e-6,1.0721462765445143e-8,0.0010741711464074789,7.60167164073378e-6,1.064650717664984e-8,0.0010743824677307964,7.774854624539591e-6,1.05545292946971e-8,0.0010745158753886549,7.946253107214568e-6,1.0463140800736486e-8,0.0010745783975093434,8.084663970024577e-6,1.0389154063601514e-8,0.0010745867148931046,8.164015707520659e-6,1.0346669113505363e-8,0.0010745652935797434,8.166515928713906e-6,1.0345347414447921e-8,0.0010745436064007652,8.085247843115634e-6,1.0389003625916266e-8,0.001074552414002862,7.925732239563838e-6,1.04747713355022e-8,0.0010746194263179607,7.705947602888145e-6,1.0593098065321354e-8,0.0010747649179418883,7.45457851834404e-6,1.0728675241616273e-8,0.0010749978735612412,7.207509835919612e-6,1.0862287758949862e-8,0.0010753131883688583,7.0027414856204215e-6,1.0973502950806292e-8,0.0010756904320888402,6.874033979996817e-6,1.1044059873554255e-8,0.0010760947834755237,6.8436529769841505e-6,1.1061787085804026e-8,0.001076481049891446,6.914886396186059e-6,1.1024693263841812e-8,0.0010768018290682909,7.066051634150347e-6,1.0944283327208556e-8,0.0010770200321076698,7.249261634913781e-6,1.0846289489249666e-8,0.001077123420982185,7.39804993243476e-6,1.076656197635394e-8,0.0010771348797026668,7.44585714263904e-6,1.0741042838621376e-8,0.0010771101367558554,7.350779981649652e-6,1.0792371226593277e-8,0.0010771194563272597,7.114340819791003e-6,1.091978472227473e-8,0.0010772207158111727,6.781925749825741e-6,1.1098942285178267e-8,0.001077438751988009,6.423598569950669e-6,1.1292263291924475e-8,0.0010777614606054466,6.107174429654953e-6,1.1463350840217734e-8,0.001078150988925822,5.878278442603043e-6,1.1587643347827043e-8,0.0010785602961386523,5.753858224937523e-6,1.1655892460490189e-8,0.0010789465240847547,5.72623912615062e-6,1.167203738632892e-8,0.0010792781883616845,5.7715171050260465e-6,1.1648769383961856e-8,0.0010795372547668179,5.857715055435001e-6,1.1603202812664468e-8,0.001079718408317149,5.950842140755552e-6,1.1553633958985417e-8,0.0010798274054571314,6.018931123532262e-6,1.1517348515355086e-8,0.0010798793764046966,6.034916081994106e-6,1.150903056702829e-8,0.0010798970957694128,5.979082561969348e-6,1.1539400992860876e-8,0.0010799088782759599,5.841386795654391e-6,1.1613943229511664e-8,0.001079945671266815,5.6234999239785664e-6,1.1731800417280663e-8,0.0010800370563297977,5.339960624404898e-6,1.1885168170973472e-8,0.0010802063626677298,5.017558699714286e-6,1.2059638070394361e-8,0.001080465709873069,4.692281975823613e-6,1.2235836282107038e-8,0.0010808121845919524,4.403722523375394e-6,1.239241282362964e-8,0.0010812263927673289,4.1875776377249006e-6,1.2510056790341688e-8,0.0010816742755761358,4.067606126441703e-6,1.2575830541311822e-8,0.0010821124162932766,4.048764490048608e-6,1.2586910279254428e-8,0.001082496394029135,4.1132067224480435e-6,1.2552812557360103e-8,0.0010827911400719823,4.220728194789922e-6,1.2495218049522599e-8,0.0010829814407256138,4.315035608807498e-6,1.2444602628550136e-8,0.0010830795939978,4.336331558319785e-6,1.2433397469308228e-8,0.0010831263014689158,4.238515418925506e-6,1.2486625405764085e-8,0.0010831815716910997,4.005888907583e-6,1.2612831618416838e-8,0.0010833062871192334,3.6615290203470267e-6,1.2799568273597161e-8,0.0010835411795810717,3.261162454656364e-6,1.3016729071965934e-8,0.0010838933778462134,2.8737930394674124e-6,1.3227010267237029e-8,0.001084337034999438,2.5585169726812227e-6,1.3398407369065678e-8,0.0010848260137734957,2.3486087687672093e-6,1.351281176227918e-8,0.0010853104715353803,2.2479370425633493e-6,1.3567994079646327e-8,0.0010857496852788604,2.2371567972056594e-6,1.3574322546551323e-8,0.0010861181451779231,2.2837281191620208e-6,1.3549388239562281e-8,0.0010864060912470594,2.3509882779473265e-6,1.351309848109019e-8,0.001086617167375567,2.4043382300803017e-6,1.348429676688557e-8,0.0010867653789912383,2.414780175748046e-6,1.3478800918996513e-8,0.0010868723951977914,2.36090336349784e-6,1.3508287044674754e-8,0.0010869652859729975,2.230320299619587e-6,1.357949036950374e-8,0.0010870742527047388,2.0210940838380106e-6,1.3693435401754393e-8,0.0010872297036982135,1.7431263470573831e-6,1.3844706627164613e-8,0.0010874581583647045,1.4188304041524766e-6,1.4021110351396713e-8,0.0010877770309646244,1.0819285734700634e-6,1.420434005833336e-8,0.0010881892473587201,7.732394508393998e-7,1.4372250040797893e-8,0.0010886795450963712,5.330813350595426e-7,1.4502949312721697e-8,0.001089214649730255,3.9140243490344096e-7,1.458013766244398e-8,0.0010897487258969283,3.584072521389756e-7,1.459820749252219e-8,0.0010902335819651038,4.191729634013468e-7,1.4565214418600275e-8,0.0010906310187498445,5.348153076480196e-7,1.4502295396028616e-8,0.0010909236281021046,6.506177348026824e-7,1.443926695100913e-8,0.001091120685014961,7.092800663955221e-7,1.4407391615029013e-8,0.001091257136747916,6.658869235087142e-7,1.4431183604022623e-8,0.0010913854479859381,5.005821622148568e-7,1.4521478794650966e-8,0.0010915618860652314,2.251478759511052e-7,1.467185398741576e-8,0.0010918307189155313,-1.1924299742407577e-7,1.4859864732950039e-8,0.0010922113493534546,-4.734372432057817e-7,1.5053255310459487e-8,0.0010926932935980337,-7.775556028587294e-7,1.5219334684945516e-8,0.0010932410472572044,-9.877102401363634e-7,1.533407805988485e-8,0.0010938063797259453,-1.0859165470122615e-6,1.5387566050399254e-8,0.001094342455259391,-1.080589230442882e-6,1.5384321095468852e-8,0.00109481445675083,-9.995980021090122e-7,1.5339569592932147e-8,0.0010952043212414967,-8.803420527904827e-7,1.5273828324478645e-8,0.0010955103354372215,-7.608506842509845e-7,1.520800473466209e-8,0.0010957438947718288,-6.738297010954895e-7,1.516008890171015e-8,0.0010959255739260278,-6.435882030741187e-7,1.514342886133524e-8,0.0010960816844447629,-6.848008439732961e-7,1.516603611113632e-8,0.001096241543978873,-8.02004725041787e-7,1.5230321629549556e-8,0.0010964350536024304,-9.891361497491146e-7,1.5332873831182345e-8,0.0010966898752015986,-1.2290044827439803e-6,1.5464206803068726e-8,0.0010970275583669783,-1.4932930260580311e-6,1.5608784981685757e-8,0.0010974584822657629,-1.7443109645131954e-6,1.574598051452959e-8,0.0010979764965260918,-1.9399561880694465e-6,1.5852762521604583e-8,0.0010985554895813923,-2.0426623918831098e-6,1.590856103716042e-8,0.0010991510076969397,-2.031063016383569e-6,1.590164521848076e-8,0.0010997091337757634,-1.9102678540224635e-6,1.5834788151340182e-8,0.0011001814643931509,-1.7151290714917107e-6,1.5727115299126148e-8,0.0011005408546707206,-1.5028952094650604e-6,1.5610105905041306e-8,0.001100790948640354,-1.3368393448549428e-6,1.5518581808694086e-8,0.001100965184316589,-1.2672952194125447e-6,1.5480237846173764e-8,0.0011011161176956588,-1.3175209969869768e-6,1.5507843040213407e-8,0.0011012998469212088,-1.4787697248972343e-6,1.5596542078759433e-8,0.001101561065014156,-1.7146998910046917e-6,1.5726308035865734e-8,0.0011019226990827457,-1.9724071175410574e-6,1.586801490545639e-8,0.001102382007116548,-2.196363356079692e-6,1.5991084228148263e-8,0.0011029132667145561,-2.3416096021800094e-6,1.6070722292919825e-8,0.0011034757514399483,-2.38310916619068e-6,1.6093077245681256e-8,0.0011040244786115357,-2.31927776315323e-6,1.6057225467888683e-8,0.0011045205794044041,-2.1694385072843676e-6,1.597381802522786e-8,0.0011049385690624493,-1.966838354498544e-6,1.5861252045493124e-8,0.0011052692443645087,-1.750001842086337e-6,1.5740883086523665e-8,0.0011055186380034719,-1.5550353774155559e-6,1.5632734001830676e-8,0.0011057045369247066,-1.4103695910270938e-6,1.5552549745965977e-8,0.0011058522277989002,-1.3341378137981495e-6,1.551032955262108e-8,0.0011059906217503908,-1.3335025490994153e-6,1.5509962936515426e-8,0.001106149150194748,-1.404950501845874e-6,1.5549420079728942e-8,0.0011063551807779252,-1.5348143523852197e-6,1.5621073311654e-8,0.0011066313631327655,-1.6998081049754247e-6,1.5712016164878937e-8,0.0011069922927926747,-1.8679853774396568e-6,1.580459705808824e-8,0.0011074402507398938,-2.0011637405826746e-6,1.5877740607269027e-8,0.0011079607077455421,-2.060248709035317e-6,1.5909858156164228e-8,0.001108519738968454,-2.0144254988523965e-6,1.588390462537339e-8,0.0011090667951459137,-1.8531436940924132e-6,1.5794016241904865e-8,0.0011095457522609323,-1.5962893152773853E-06,1.5651187561937485e-8,0.0011099131036531966,-1.295286315591519e-6,1.548393416264128e-8,0.0011101558729649911,-1.0201697065466408e-6,1.5331133204623056e-8,0.0011102988958696094,-8.358929741676526e-7,1.5228836499800212e-8,0.001110396160826366,-7.792957175517323e-7,1.519745019538023e-8,0.00111051078357651,-8.4832733122868e-7,1.5235767590110828e-8,0.0011106942753399312,-1.0069042485667557e-6,1.5323711725274e-8,0.00111097368196469,-1.1999692577389667e-6,1.5430718007157876e-8,0.0011113487938456635,-1.370515245006706e-6,1.5525164027079777e-8,0.0011117968919402519,-1.472886234678616e-6,1.5581716379428368e-8,0.00111228126468647,-1.4803580618799743e-6,1.5585522069862342e-8,0.0011127605283525728,-1.38735025143936e-6,1.553345118973782e-8,0.0011131969606502966,-1.207467615593322e-6,1.5433042494833323e-8,0.0011135628384484684,-9.68609089136904e-7,1.5299812786382335e-8,0.0011138441430138264,-7.063766770539463e-7,1.515359787677788e-8,0.0011140413969519087,-4.5716749529745555e-7,1.5014692696968984e-8,0.0011141679771116317,-2.5224292949749117e-7,1.4900524553462284e-8,0.0011142467106409985,-1.1360505719006956e-7,1.4823340179212186e-8,0.0011143057375622243,-5.1947099677121166e-8,1.478906414284595e-8,0.0011143745275428235,-6.641623982905153e-8,1.479718055412551e-8,0.0011144805411490116,-1.4554045014367347e-7,1.4841267716474989e-8,0.0011146465039405943,-2.6868186327244643e-7,1.4909818722617364e-8,0.0011148879464543517,-4.077487512787168e-7,1.4987193531681402e-8,0.0011152106069133069,-5.293572049765862e-7,1.5054810350341645e-8,0.001115607505557431,-5.981354506604627e-7,1.5092967998964315e-8,0.0011160562278251995,-5.82238372920153e-7,1.508390498897239e-8,0.0011165181858738054,-4.617774614729789e-7,1.5016501585294573e-8,0.0011169427756374372,-2.3916486858598275e-7,1.489207589936706e-8,0.001117279123695704,5.281074662320559e-8,1.4728931150574154e-8,0.0011174945353303808,3.5238253651923323e-7,1.4561593636104278e-8,0.0011175918891919794,5.85237341776037e-7,1.4431602483043102e-8,0.001117613973298778,6.922600246158575e-7,1.4371955080154304e-8,0.0011176285284481737,6.540692000960255e-7,1.4393394122909386e-8,0.0011177012518909313,4.973859584028976e-7,1.4480914676359373e-8,0.0011178724639969737,2.807665191832271e-7,1.4601797634793543e-8,0.0011181484319527568,7.064887876481905e-8,1.4718987525011862e-8,0.0011185068668504749,-7.890745011779789e-8,1.4802357637019236e-8,0.0011189091709123736,-1.3646153918415363e-7,1.4834384089423755e-8,0.0011193126105248509,-9.43931094899234e-8,1.48108065335213e-8,0.0011196792366973227,3.5164048593491474e-8,1.473837430297344e-8,0.0011199811858316087,2.26369559642981e-7,1.4631494218090753e-8,0.0011202031869314724,4.4589422366034254e-7,1.4508776239873582e-8,0.00112034310520379,6.586854121746841e-7,1.4389816343386903e-8,0.0011204109385747102,8.330417415667043e-7,1.4292352649188305e-8,0.0011204265234972595,9.446967691452359e-7,1.4229970169917528e-8,0.0011204162785695454,9.796302768584618e-7,1.4210520366177409e-8,0.0011204093914756884,9.354136766252925e-7,1.423536740670385e-8,0.0011204339509095645,8.210357617533893e-7,1.4299488573279187e-8,0.0011205135047749502,6.554492436680685e-7,1.4392288214421408e-8,0.0011206642577800594,4.652528434009131e-7,1.4498888367884619e-8,0.001120892869175372,2.817729973787914e-7,1.4601751044198787e-8,0.0011211947550755549,1.3757495990860276e-7,1.4682621069015419e-8,0.0011215528883894927,6.21872975976025e-8,1.4724918735586556e-8,0.001121937523487324,7.657802320904832e-8,1.471684663627745e-8,0.0011223081121608392,1.862337483495964e-7,1.4655293964103262e-8,0.0011226193191337492,3.7406125879550593e-7,1.4549846746055096e-8,0.001122832579558784,5.965725646991329e-7,1.4424943518651694e-8,0.001122931860338344,7.888398809784377e-7,1.4317073347269448e-8,0.0011229368584202211,8.823540066354003e-7,1.42646972284513e-8,0.0011229030163360236,8.31978931560535e-7,1.4293081372632381e-8,0.0011229027871189272,6.377983868581165e-7,1.4402074372500076e-8,0.0011229961745440554,3.466313844851877e-7,1.4565346045514696e-8,0.0011232080312209413,3.131213495657076e-8,1.4742059226319447e-8,0.0011235241667242122,-2.384517151272013e-7,1.4893183747109764e-8,0.0011239038866639104,-4.1705069829968125e-7,1.4993199888376666e-8,0.0011242978045176068,-4.891837396590307e-7,1.5033552385496457e-8,0.0011246618087164136,-4.650533911979487e-7,1.501996092483476e-8,0.0011249644073865193,-3.712956185955165e-7,1.4967350495564534e-8,0.0011251887847238463,-2.4226609099827207e-7,1.489497804254355e-8,0.0011253319323496448,-1.1342860023329529e-7,1.4822732804632492e-8,0.001125402634959825,-1.6748392335343594e-8,1.476855463336166e-8,0.0011254190551908455,2.2583818610430424e-8,1.4746592428163293e-8,0.001125406006350285,-1.147849811646348e-8,1.4765866874794957e-8,0.0011253918703925659,-1.2428284425453638e-7,1.4829389975213278e-8,0.001125405153669,-3.098575433825358e-7,1.4933811618400424e-8,0.001125470825285484,-5.515007109536961e-7,1.5069747750744837e-8,0.0011256068473051415,-8.237402109522106e-7,1.522287862447306e-8,0.0011258213742378021,-1.0955210324600928e-6,1.5375735433027346e-8,0.001126110953640497,-1.33434576076099e-6,1.551002392607651e-8,0.0011264599688784321,-1.5110754595557068e-6,1.5609325258051984e-8,0.0011268415324472347,-1.6050367155868619e-6,1.5661979950811296e-8,0.0011272200850014037,-1.6091063327225863e-6,1.5663968705012574e-8,0.0011275562307977297,-1.5342861631028003e-6,1.5621508044081852e-8,0.0011278144681279808,-1.4124327608801717e-6,1.5552595027563792e-8,0.001127973697196369,-1.2945868803236955e-6,1.548604925928786e-8,0.0011280382587597413,-1.2418556395565706e-6,1.5456333428887506e-8,0.0011280441049613882,-1.3076713541081708e-6,1.5493515389976944e-8,0.0011280530903307478,-1.5159246352740396e-6,1.5610950547436537e-8,0.001128132778175655,-1.8463668689740967e-6,1.579711977668449e-8,0.0011283296134604944,-2.238778351585612e-6,1.601804452302929e-8,0.0011286507402838491,-2.6162893563312223e-6,1.6230430827785135e-8,0.001129064849116733,-2.914505922934018e-6,1.639803217786027e-8,0.0011295188883964043,-3.1003495271215335e-6,1.650223555792818e-8,0.0011299585096496848,-3.1743954370268017e-6,1.6543390761059785e-8,0.0011303422387863712,-3.1616614223987634e-6,1.6535639899295777e-8,0.0011306468543703053,-3.099226465392222e-6,1.649993957729718e-8,0.0011308665355909385,-3.026115926253836e-6,1.6458343678529448e-8,0.0011310092877528594,-2.97696670198988e-6,1.643041637428008e-8,0.0011310930107738839,-2.9787150579821667e-6,1.643135725219101e-8,0.0011311420979546502,-3.048971357365785e-6,1.6471083224590702e-8,0.0011311844863316548,-3.1951543584245246e-6,1.655374177555831e-8,0.0011312487969415517,-3.4140426711787296e-6,1.667746050617603e-8,0.001131361247585663,-3.6918347099299193e-6,1.683438659836271e-8,0.0011315422288500833,-4.005155407124281e-6,1.701126248263884e-8,0.0011318028686057846,-4.323516118603748e-6,1.719082210152812e-8,0.001132142305142021,-4.613386976593811e-6,1.7354095519871995e-8,0.001132546459390808,-4.843583003603475e-6,1.7483454475893005e-8,0.0011329889427781129,-4.991272754047409e-6,1.7566013688537354e-8,0.0011334344413259357,-5.047541910774497e-6,1.7596784618951905e-8,0.001133844458183822,-5.021292733474158e-6,1.7580889129752105e-8,0.0011341848700335095,-4.94040959890774e-6,1.753421475919338e-8,0.0011344344119443499,-4.8491916969188745e-6,1.748193700907113e-8,0.0011345925814498685,-4.801059066100088e-6,1.745434825021528e-8,0.001134684387300292,-4.846227082445247e-6,1.7479841111046328e-8,0.0011347584805635495,-5.0160858158737145e-6,1.7576061597522453e-8,0.0011348759327808268,-5.309263400214288e-6,1.7742064468409605e-8,0.0011350908173706725,-5.6869034120381485e-6,1.7955706489080888e-8,0.0011354299176144932,-6.082800701089851e-6,1.8179418623203863e-8,0.0011358822190113598,-6.426124898603051e-6,1.8373054177066374e-8,0.0011364043809356825,-6.665757949870108e-6,1.8507648393622844e-8,0.0011369384853650538,-6.7840861137196476e-6,1.8573247563186413e-8,0.0011374316455507916,-6.795823634017219e-6,1.8578280026159067e-8,0.001137848673807987,-6.736604005607285e-6,1.85430965640259e-8,0.001138175543947817,-6.649378408098194e-6,1.8492219634553844e-8,0.0011384164599360274,-6.574091986083006e-6,1.8448433493018965e-8,0.0011385884812031334,-6.5420367269707E-06,1.8429543600599157e-8,0.0011387163515221173,-6.573764105960214e-6,1.844718403120001e-8,0.0011388284833158092,-6.678850501571657e-6,1.8506697577031452e-8,0.0011389539421612653,-6.856289459219892e-6,1.8607380918886297e-8,0.0011391198567281403,-7.094990988364993e-6,1.8742791852569966e-8,0.0011393486909906535,-7.374470404067843e-6,1.8901162544082247e-8,0.001139655105173082,-7.666288253826918e-6,1.9066235687773136e-8,0.0011400426757558419,-7.936983461486883e-6,1.921894205864218e-8,0.0011405013577337874,-8.152936837249098e-6,1.9340168556050783e-8,0.0011410069453844265,-8.286904307477137e-6,1.941447163411268e-8,0.001141523687978373,-8.325052062458535e-6,1.943407977800105e-8,0.0011420104921204704,-8.272482966705914e-6,1.940204081740356e-8,0.0011424298885641681,-8.155032071176124e-6,1.9333238629293002e-8,0.0011427577026877223,-8.01590505046847e-6,1.9252449665323856e-8,0.0011429907616206283,-7.907174957399983e-6,1.9189445751876634e-8,0.0011431501649271265,-7.877608061907913e-6,1.917200273740673e-8,0.0011432784491987938,-7.9594886944176e-6,1.9218374972079383e-8,0.0011434302434748492,-8.157983701078854e-6,1.9331275036921774e-8,0.0011436578055424847,-8.446881947193677e-6,1.949552477305666e-8,0.00114399515501405,-8.773659928063834e-6,1.9681008281834052e-8,0.001144446522983574,-9.073972603149053e-6,1.9850948567032337e-8,0.0011449845240813815,-9.291172843971188e-6,1.997301868872744e-8,0.0011455595354737658,-9.393027652032006e-6,2.0028869806567677e-8,0.0011461161009334714,-9.378716130867975e-6,2.001814630971795e-8,0.0011466089029168024,-9.274461172054308e-6,1.9956008806800238e-8,0.0011470122988015584,-9.121833292035425e-6,1.9866427698242803e-8,0.00114732188508422,-8.96496066277439e-6,1.977481168122164e-8,0.001147550426654242,-8.84115873090527e-6,1.970259092640148e-8,0.0011477216937115396,-8.776250220560751e-6,1.966451506584681e-8,0.0011478647584178116,-8.783503033521037e-6,1.966805944170667e-8,0.0011480097210303582,-8.864451422748417e-6,1.971393023358895e-8,0.0011481847339456337,-9.010282799110149e-6,1.9796897029095008e-8,0.0011484137013095736,-9.203162855983934e-6,1.9906583070119853e-8,0.0011487139621447924,-9.417536219790016e-6,2.0028232082651543e-8,0.0011490935669522466,-9.622008265590576e-6,2.0143797216780358e-8,0.0011495483701545808,-9.782674812070154e-6,2.0233850339937727e-8,0.0011500598968202766,-9.868530899457088e-6,2.0280675342107168e-8,0.001150595576793416,-9.858788234789456e-6,2.027245503525575e-8,0.0011511130407411538,-9.750551556433113e-6,2.0207673116114426e-8,0.0011515690958261268,-9.563815939238883e-6,2.0097983923800655e-8,0.0011519316806153635,-9.340392670730376e-6,1.9967584121287674e-8,0.001152190749497022,-9.135185026245966e-6,1.9848156573524196e-8,0.0011523634382926925,-9.001659265593388e-6,1.9770455193964563e-8,0.0011524907957058544,-8.976351650421527e-6,1.975535707782608e-8,0.0011526268209164589,-9.067935946616826e-6,1.9807599727437817e-8,0.0011528235054923113,-9.25449432683755e-6,1.9914294904382524e-8,0.0011531166414686328,-9.489552149459594e-6,2.0048491573720485e-8,0.0011535164504243166,-9.71476019621844e-6,2.0176519619224113e-8,0.0011540055000518578,-9.875454353321969e-6,2.0266935867828633e-8,0.0011545443526542588,-9.934597905884134e-6,2.029851857027083e-8,0.0011550830429836547,-9.881012223473731e-6,2.026498429883669e-8,0.0011555744937682764,-9.729706251418504e-6,2.0175168201088018e-8,0.0011559854772124829,-9.51504938883692e-6,2.0049071556327196e-8,0.0011563021464909625,-9.280042396553756e-6,1.991163982225793e-8,0.0011565296752859802,-9.065727818539686e-6,1.9786613888511836e-8,0.001156687736425848,-8.903688987058367e-6,1.9692182364519e-8,0.0011568044046975123,-8.8125619957311e-6,1.9638981965480233e-8,0.0011569105458751,-8.797789715304598e-6,1.9629991386652268e-8,0.0011570356151798416,-8.853178776230065e-6,1.9661469660227554e-8,0.0011572048275839113,-8.963029002850191e-6,1.9724213131765286e-8,0.0011574371573823965,-9.104180604326605e-6,1.9804750235027096e-8,0.0011577435098976399,-9.247950130788989e-6,1.9886461799431398e-8,0.0011581246406424353,-9.362476184699034e-6,1.9950934601369646e-8,0.001158568958664678,-9.41631267388031e-6,1.9980033554842147e-8,0.001159051135572797,-9.383982662467644e-6,1.9959107105592105e-8,0.0011595332400694842,-9.253407196201551e-6,1.988127948054991e-8,0.0011599704116754437,-9.033473617199929e-6,1.9751830591591057e-8,0.001160321905079089,-8.757962164306107e-6,1.9590469326886845e-8,0.0011605651381540996,-8.481352968156326e-6,1.9428884611557018e-8,0.0011607066977102414,-8.264780100526713e-6,1.9302555692561575e-8,0.0011607835786356816,-8.156211653841857e-6,1.9239208531028127e-8,0.001160852303938451,-8.173672131833849e-6,1.9249082973678126e-8,0.0011609704050213417,-8.299502401002055e-6,1.9321670102197103e-8,0.0011611786600939425,-8.487524842860316e-6,1.942996472795716e-8,0.00116149085756971,-8.678548440956826e-6,1.9539526753642373e-8,0.0011618930476837161,-8.817263786054158e-6,1.961829467481908e-8,0.0011623502480845786,-8.865197369246996e-6,1.9644073624203352e-8,0.0011628170462849206,-8.807345064885849e-6,1.9608343243756524e-8,0.001163248772606246,-8.652436380407108e-6,1.9516370694754277e-8,0.0011636107636861521,-8.42810745764086e-6,1.9384372461534673e-8,0.0011638841503945102,-8.17290291549061e-6,1.9234838808357553e-8,0.0011640675332915647,-7.927309243105636e-6,1.9091306227406572e-8,0.001164174910574985,-7.725934562782125e-6,1.897381570422459e-8,0.0011642310911780206,-7.592301438636944e-6,1.8895911963434465e-8,0.001164266183153776,-7.536686249750781e-6,1.8863426101585725e-8,0.0011643105098843333,-7.556534996681924e-6,1.8874751833990127e-8,0.0011643907219274397,-7.638508383357229e-6,1.892205030520054e-8,0.0011645272144765674,-7.761166811425134e-6,1.8992807601442906e-8,0.0011647324707863098,-7.897651936164617e-6,1.9071379900299287e-8,0.0011650098094900412,-8.018265814666975e-6,1.914048233352255e-8,0.0011653521888236509,-8.093307790327415e-6,1.9182839583695098e-8,0.001165741133615056,-8.096798948189496e-6,1.9183362843101123e-8,0.0011661465394286383,-8.01169930545659e-6,1.913219846759754e-8,0.0011665289267256526,-7.836536321099879e-6,1.9028592765835697e-8,0.0011668460658409007,-7.591725078170206e-6,1.8884569456476698e-8,0.0011670647742319771,-7.321672629410377e-6,1.872613603007408e-8,0.0011671752536712213,-7.087778965397692e-6,1.8589162929747138e-8,0.0011672007945532352,-6.950506281680236e-6,1.8508875117680157e-8,0.0011671946165852476,-6.946270276537636e-6,1.8506350208028936e-8,0.0011672219724961402,-7.071417197234697e-6,1.8579216055933185e-8,0.0011673358746302342,-7.283275108892446e-6,1.8702356985605753e-8,0.0011675594159570796,-7.517413113909867e-6,1.8838061377010595e-8,0.0011678822015231747,-7.710561368063675e-6,1.8949420655493054e-8,0.0011682689261397071,-7.818135372925264e-6,1.9010538692202126e-8,0.0011686730493583339,-7.821696462300443e-6,1.90108499425854e-8,0.0011690494583318888,-7.727720962976632e-6,1.8954353489254236e-8,0.0011693632444199163,-7.56134032774171e-6,1.885590552632025e-8,0.00116959424227111,-7.358324729191973e-6,1.8736493783482777e-8,0.0011697381322427927,-7.157289319737172e-6,1.861866602390422e-8,0.001169805015940991,-6.993028321525914e-6,1.852264983791331e-8,0.0011698161546601542,-6.891491872816817e-6,1.8463458014440653e-8,0.0011697995747586565,-6.866806023143072e-6,1.8449195474681566e-8,0.001169785345145261,-6.9204124414224666e-6,1.8480593608555368e-8,0.0011698012390084927,-7.0420511084665356e-6,1.8551596753815423e-8,0.0011698692959780039,-7.212115770190638e-6,1.865072612237821e-8,0.001170003535115469,-7.40476340602822e-6,1.876287162320732e-8,0.0011702087001298016,-7.591191261412983e-6,1.887118665962335e-8,0.001170479701385697,-7.742851069545861e-6,1.895896527939579e-8,0.0011708015200401624,-7.834746251544546e-6,1.9011588216858993e-8,0.0011711496211634048,-7.849130822009977e-6,1.9018713426567524e-8,0.0011714913924403504,-7.779910197998646e-6,1.8976869060788222e-8,0.0011717897544849946,-7.637523831636095e-6,1.889230519205385e-8,0.001172010309956273,-7.452738502943907e-6,1.8783182601489195e-8,0.0011721323598993924,-7.275994332800178e-6,1.867913794942048e-8,0.0011721611281580594,-7.168155593634209e-6,1.861581265298405e-8,0.0011721343191450696,-7.1813051484193844e-6,1.862357539268324e-8,0.0011721149049607846,-7.335813716215587e-6,1.87141217167984e-8,0.001172168800567516,-7.607145133330706e-6,1.8872833135365767e-8,0.0011723380208572738,-7.933227173421569e-6,1.9063184028057393e-8,0.0011726252496139771,-8.239481077610759e-6,1.924143891636807e-8,0.0011729975280554965,-8.466260519538257e-6,1.9372719916227837e-8,0.0011734031858778484,-8.584501548552111e-6,1.944016181411194e-8,0.001173790302185874,-8.596454295920204e-6,1.944531693494591e-8,0.0011741190787508823,-8.527161410478187e-6,1.9403109104349883e-8,0.0011743669348481497,-8.413502697600549e-6,1.933534155711618e-8,0.0011745284115409797,-8.294793736602777e-6,1.9265131227668844e-8,0.0011746124079364151,-8.206190261184355e-6,1.9213032276832187e-8,0.0011746385065752375,-8.174556373859033e-6,1.9194649111671876e-8,0.0011746330915234392,-8.216052103381338e-6,1.9219279634408336e-8,0.0011746253880197785,-8.335082109550146e-6,1.9289350289034145e-8,0.0011746435809791025,-8.524542340119898e-6,1.9400586230916127e-8,0.0011747112692470335,-8.767280557710057e-6,1.954286430798587e-8,0.0011748445359639791,-9.03865596643075e-6,1.9701692857538592e-8,0.0011750499632298852,-9.309966660718363e-6,1.9860201817912727e-8,0.001175323799399941,-9.552298843262974e-6,2.0001396821218872e-8,0.00117565222379474,-9.740381416028808e-6,2.0110439466007515e-8,0.0011760125740055314,-9.856258828588306e-6,2.0176834214821782e-8,0.001176375524771259,-9.89270749701017e-6,2.0196458357561633e-8,0.0011767084198622795,-9.856295447680713e-6,2.0173355725141192e-8,0.0011769802534832457,-9.769680052766479e-6,2.0121046365166935e-8,0.001177168799588408,-9.671871258832764e-6,2.0062613323586582e-8,0.0011772694476469777,-9.6141384720008e-6,2.002822704058926e-8,0.0011773031276615976,-9.649130357389883e-6,2.004871269724044e-8,0.001177317927990144,-9.813195811093411e-6,2.0145182911243707e-8,0.0011773784774201084,-1.0107742086366462e-5,2.031816622647421e-8,0.0011775429199502576,-1.0491244705205072e-5,2.054301185498362e-8,0.001177837880102486,-1.0891186429975976e-5,2.077695811502661e-8,0.0011782469508336748,-1.1232228758863288e-5,2.0975685618500445e-8,0.0011787199252995327,-1.1464270048217633e-5,2.1109807093236463e-8,0.001179195117857407,-1.1575096317836384e-5,2.1172327792887724e-8,0.0011796204060343677,-1.1585333083324484e-5,2.117567378298927e-8,0.001179964253721622,-1.153426084540048e-5,2.1143276835969646e-8,0.001180216947487361,-1.1465789942356163e-5,2.1101215758474892e-8,0.0011803864077251783,-1.1418915216628996e-5,2.107252293342305e-8,0.0011804924552570766,-1.1422849945557147e-5,2.1074313204903283e-8,0.0011805616351961057,-1.149534972563153e-5,2.111684828473406e-8,0.0011806231296561194,-1.164260838042896e-5,2.1203547272920038e-8,0.001180705405349917,-1.185983590457733e-5,2.133138289587363e-8,0.0011808332022572984,-1.2132380829244001e-5,2.1491566451183692e-8,0.0011810247593277404,-1.2437538534793616e-5,2.1670609888946692e-8,0.00118128939658047,-1.2747235945817167e-5,2.1851893747692842e-8,0.0011816258296817952,-1.3031688632184382e-5,2.2017816721285344e-8,0.0011820217409164156,-1.3263766786722557e-5,2.215238102483769e-8,0.0011824549343442512,-1.3423476824073942e-5,2.224386173036045e-8,0.0011828960923008392,-1.3501908143475178e-5,2.228715845248425e-8,0.0011833129578829248,-1.3504032616951642e-5,2.2285447254115404e-8,0.0011836756314048944,-1.3449812928952117e-5,2.2250794275112108e-8,0.001183962592413837,-1.3373153848677134e-5,2.2203458812617827e-8,0.0011841669322909438,-1.3318065327970467e-5,2.2169537514422055e-8,0.0011843016926503368,-1.3331175884827947e-5,2.2176482373441217e-8,0.0011844020642103072,-1.3450260247773386e-5,2.2246332098472546e-8,0.001184521202676278,-1.3690428025695983e-5,2.2387640451217336e-8,0.0011847171293863903,-1.4032994909381187e-5,2.2589027933433944e-8,0.001185032463777717,-1.4424743371322873e-5,2.281883562996951e-8,0.0011854755677246913,-1.4792794984495582e-5,2.3033918419938312e-8,0.0011860147396502052,-1.507088024578483e-5,2.319513060443558e-8,0.0011865905179456926,-1.5223319477673633e-5,2.328150001628114e-8,0.0011871389466646689,-1.5253718038456167e-5,2.3295410581307743e-8,0.0011876123061146714,-1.519648813755946e-5,2.3257586969311357e-8,0.0011879885113928858,-1.5099845661934605e-5,2.3196940123018956e-8,0.0011882695341677578,-1.501035144178206e-5,2.31412842396481e-8,0.0011884742356245803,-1.4963788315746421e-5,2.3111852364620775e-8,0.001188630530564791,-1.4982034546106686e-5,2.3121452402727265e-8,0.0011887692807419578,-1.507353292827563e-5,2.3174817880824452e-8,0.0011889202463939105,-1.5235106883747588e-5,2.3269772227890994e-8,0.0011891093972103773,-1.5453904219857056e-5,2.3398442893928934e-8,0.001189356787492648,-1.5709243646093957e-5,2.3548380493865156e-8,0.001189674562434833,-1.597465760311393e-5,2.3703767108688843e-8,0.0011900650705906138,-1.622059546320253e-5,2.3847010207390837e-8,0.0011905194959919482,-1.641817450904896e-5,2.396096721453941e-8,0.0011910177895063875,-1.6543919681829082e-5,2.403177226492937e-8,0.0011915306556030559,-1.6584788766736868e-5,2.4051839818261955e-8,0.001192023898945927,-1.6542298384545826e-5,2.4022324070467803e-8,0.001192464757553144,-1.643440146715635e-5,2.3954211093486313e-8,0.001192829119799411,-1.629404609753833e-5,2.3867395750016865e-8,0.001193108027212104,-1.6164104458207515e-5,2.3787569044241983e-8,0.0011933118430555575,-1.608921071912973e-5,2.3741272731391792e-8,0.0011934707320330146,-1.6105658509481013e-5,2.374985781205688e-8,0.0011936303976635173,-1.623111932778949e-5,2.3823425330801796e-8,0.0011938425904213918,-1.6456797947603263e-5,2.3956291913805633e-8,0.0011941512693824246,-1.6745405678767475e-5,2.4125926378533872e-8,0.0011945777513011316,-1.703806116613979e-5,2.4297131106293858e-8,0.0011951108176325653,-1.7270552184130284e-5,2.4431706269672658e-8,0.0011957078826386161,-1.7394145331375484e-5,2.4500786304503858e-8,0.001196308651953773,-1.7391670563142902e-5,2.4494397478295562e-8,0.0011968553574094527,-1.7280885870127336e-5,2.442346637634852e-8,0.0011973097438809756,-1.7104486121415902e-5,2.4313830319614202e-8,0.0011976600271846305,-1.6913544964189015e-5,2.4196263777647027e-8,0.0011979178287977973,-1.6752823815132273e-5,2.4097605696463648e-8,0.0011981097707620147,-1.6652578579863055e-5,2.4035827004151324e-8,0.0011982686801686477,-1.6626751066110573e-5,2.401899572758425e-8,0.0011984270612510747,-1.6674980003615707e-5,2.4046572026728495e-8,0.0011986131998672476,-1.6785856209140574e-5,2.411144126081378e-8,0.00119884907936858,-1.6939967517406705e-5,2.4201781684558578e-8,0.0011991490988296598,-1.7112385016964997e-5,2.430255743190104e-8,0.0011995189044720176,-1.727490968716899e-5,2.4396846663078468e-8,0.0011999541434850292,-1.73987053704685e-5,2.446740213138539e-8,0.0012004395264967585,-1.7457927525291007e-5,2.4498820966803372E-08,0.0012009491082435547,-1.743451264755266e-5,2.4480422287605266e-8,0.001201448900782843,-1.7323465817622007e-5,2.4409425154034857e-8,0.0012019025457898729,-1.713703206787251e-5,2.429344400128628e-8,0.0012022796375072394,-1.6905527800039264e-5,2.415095110327444e-8,0.001202564674709609,-1.66730256383639e-5,2.4008615527302114e-8,0.0012027634568679232,-1.6487847620334767e-5,2.3895505198766226e-8,0.001202904030611828,-1.6390163394670685e-5,2.3835574955575874e-8,0.0012030311028923925,-1.6400516224166192e-5,2.384078723594285e-8,0.0012031951747230444,-1.6513004713512284e-5,2.390712060734509e-8,0.001203439368777117,-1.6695385826531313e-5,2.4014786720648956e-8,0.0012037875416534632,-1.6896357132806125e-5,2.413273573212916e-8,0.0012042369997383238,-1.7058417430140396e-5,2.422642990299439e-8,0.001204758270153749,-1.7133153462624448e-5,2.42669920335499e-8,0.0012053027296240449,-1.7094557087145528e-5,2.4239131779032624e-8,0.001205816243419089,-1.694576087819249e-5,2.414512189749825e-8,0.001206254208107606,-1.671652593603102e-5,2.4003224447649546e-8,0.0012065924774887938,-1.6452686017868706e-5,2.3841274764580573e-8,0.0012068306855210508,-1.6202252980745935e-5,2.3688257288772364e-8,0.0012069882451567506,-1.6003642610002783e-5,2.3567193058502826e-8,0.0012070962548821874,-1.5879317737007825e-5,2.3491350212189728e-8,0.0012071891126864752,-1.5834987172204415e-5,2.3463848234982794e-8,0.0012072982435586271,-1.5862395994595704e-5,2.3479429419473134E-08,0.0012074484919681056,-1.5943390285158226e-5,2.3526960795175952e-8,0.0012076565349967772,-1.6053727644420263e-5,2.3591735054261115e-8,0.0012079303224518817,-1.6166109640853678e-5,2.3657270713232458e-8,0.0012082687433021958,-1.625265566416613e-5,2.370677465035961e-8,0.0012086611896754904,-1.6287448494366172e-5,2.372466631141001e-8,0.0012090872917999832,-1.6249836702848495e-5,2.3698580523446967e-8,0.0012095176855486077,-1.6128815528154758e-5,2.3622028928013453e-8,0.0012099170613362122,-1.592798579392285e-5,2.349739986274672e-8,0.0012102505659388227,-1.566936060894537e-5,2.3338237567455915e-8,0.0012104933479661164,-1.5393153749585413e-5,2.316906420901978e-8,0.0012106406191476266,-1.5150881099106516e-5,2.302113572545944e-8,0.001210713427762985,-1.4991745019339821e-5,2.2924136337323242e-8,0.0012107557250189674,-1.4946543294335746e-5,2.2896419733099684e-8,0.0012108221716802248,-1.5016161651831003e-5,2.293810304377412e-8,0.0012109612315525406,-1.5170264902251345e-5,2.3030401775421017e-8,0.0012112005956738774,-1.535671009607627e-5,2.3141465559964834e-8,0.0012115402123723076,-1.551722648703216e-5,2.3235958218962858e-8,0.0012119541203185218,-1.5603217342101987e-5,2.32846361790215e-8,0.0012123989690091418,-1.558704649773601e-5,2.32711262155396e-8,0.0012128258188160085,-1.546672637976945e-5,2.3194667025593706e-8,0.0012131919055231588,-1.526397476343263e-5,2.306882035076686e-8,0.001213469672752588,-1.5016981076206275e-5,2.2916988632259907e-8,0.0012136512717100716,-1.4770193242323362e-5,2.2766165374691033e-8,0.0012137479589100495,-1.4563974629347552e-5,2.2640665341646183e-8,0.0012137852603573004,-1.4426773355970368e-5,2.255743926778347e-8,0.0012137959093788662,-1.4371343522844578e-5,2.2523883713028728e-8,0.0012138128365966673,-1.439499826481813e-5,2.2538091856692798e-8,0.0012138638400819995,-1.4482668698853964e-5,2.2590762305896745e-8,0.0012139685086682349,-1.4611158244269921e-5,2.2667775734842887e-8,0.0012141370773553156,-1.4753294457875256e-5,2.2752669276880412e-8,0.0012143704447298367,-1.4881339284913565e-5,2.2828655628043122e-8,0.0012146606157735983,-1.4969696583580246e-5,2.2880242761076628e-8,0.0012149911979015464,-1.499739616837105e-5,2.2894754107216863e-8,0.001215338074413792,-1.495094088433912e-5,2.286409075695815e-8,0.0012156709220629822,-1.4827860365214653e-5,2.278691472150337e-8,0.0012159566967008494,-1.4640607873998432e-5,2.2671006872583375e-8,0.0012161661678526474,-1.4419214392042551e-5,2.253482998176492e-8,0.0012162834218881762,-1.4209794962010202e-5,2.2406545421342624e-8,0.001216315642396274,-1.4065845309811994e-5,2.2318651755283653e-8,0.0012162975273846636,-1.4032046896515793e-5,2.229810801795348e-8,0.001216284646636957,-1.412603160851158e-5,2.2355282871068613e-8,0.0012163354726003424,-1.4328040488737538e-5,2.2477767363016963e-8,0.0012164899159747096,-1.4585949126754397e-5,2.263355123417095e-8,0.001216755574130199,-1.4833892797710722e-5,2.278243853374842e-8,0.0012171078245810246,-1.5014490026863692e-5,2.2889603737556964e-8,0.001217501208749591,-1.5094377647005056e-5,2.2935034657986378e-8,0.0012178847630020077,-1.5068934395509631e-5,2.2916347417685273e-8,0.0012182150285436164,-1.4958137548021152e-5,2.2846155074825506e-8,0.0012184640069405344,-1.4797783644600629e-5,2.2746590779909395e-8,0.0012186220505673322,-1.4629683731770791e-5,2.2643235920746163e-8,0.001218696822913379,-1.449297270290909e-5,2.2559801522444672e-8,0.0012187095811834294,-1.4417539138099393e-5,2.2514186857630122e-8,0.0012186898663968694,-1.4420061297596525e-5,2.2516180023635898e-8,0.0012186696633395672,-1.4502833252156467e-5,2.2566860603567102e-8,0.0012186780735641304,-1.4655108434294776e-5,2.2659490899290508e-8,0.0012187372918174148,-1.4856253456001961e-5,2.2781443114298367e-8,0.001218860273629298,-1.5079824490775369e-5,2.2916635639418696e-8,0.0012190500435946263,-1.5297700051893458e-5,2.3047988343221898e-8,0.001219300200263371,-1.548365519236493e-5,2.3159560794279936e-8,0.0012195960618367548,-1.5616237415079354e-5,2.3238309613797606e-8,0.0012199161265676276,-1.568118550987916e-5,2.3275603178996437e-8,0.0012202338545077081,-1.567373100870673e-5,2.326866879195279e-8,0.0012205201561264112,-1.560100091808706e-5,2.3222067337371707e-8,0.001220747382989795,-1.5484226141098953e-5,2.3148995007320677e-8,0.0012208955835540899,-1.535941411892994e-5,2.3071605072069785e-8,0.0012209607427107806,-1.5274050539459638e-5,2.3018902382756045e-8,0.001220962475274646,-1.5277280997782236e-5,2.3020705792687032e-8,0.0012209458731045407,-1.5403436960660497e-5,2.309762894932575e-8,0.0012209717976255354,-1.565448470536381e-5,2.3250476497938733e-8,0.0012210955463632595,-1.5992317511104423e-5,2.345566341649283e-8,0.0012213435678971353,-1.634934524496698e-5,2.367175263118225e-8,0.0012217022640911984,-1.6653999885394203e-5,2.3855040758167472e-8,0.0012221254162641652,-1.685673242853055e-5,2.397543609100118e-8,0.0012225539172616843,-1.694295513018085e-5,2.4024369111537456e-8,0.0012229355612905532,-1.6930207344080828e-5,2.4013018459709848e-8,0.0012232368258948774,-1.6856088422204816e-5,2.3964815471614588e-8,0.001223445818883135,-1.6764870074623695e-5,2.3907108196114857e-8,0.0012235694616662836,-1.66972195773145e-5,2.3864781052871904e-8,0.0012236282176459417,-1.668400111843338e-5,2.3856473140188308e-8,0.0012236504409797394,-1.6743379709783217e-5,2.3892909894168513e-8,0.0012236671763620997,-1.6880175503808295e-5,2.3976645895061022e-8,0.001223707624433692,-1.708683221483701e-5,2.4102766441136323e-8,0.0012237954317209335,-1.734565340062886e-5,2.426029685357651e-8,0.0012239459921608604,-1.7631973134540477e-5,2.4434117926847972e-8,0.0012241649213519893,-1.791791608308859e-5,2.4607207076905056e-8,0.0012244478183697678,-1.817632574317451e-5,2.476299133590999e-8,0.0012247812244358886,-1.838435464330882e-5,2.4887533086232756e-8,0.0012251444556581857,-1.8526399189167512e-5,2.4971356499031972e-8,0.001225512030680893,-1.8596356874691012e-5,2.5010875116620252e-8,0.0012258566090267735,-1.8599249204608337e-5,2.500940666446154e-8,0.0012261525206215848,-1.8552184327634754e-5,2.4977727871947743e-8,0.0012263801754533244,-1.8484389126531722e-5,2.4934001023126065e-8,0.001226531589440995,-1.8435353897332787e-5,2.4902521731442044e-8,0.0012266163824655456,-1.844942436845583e-5,2.4910327037782435e-8,0.0012266658987470957,-1.8565429063659797e-5,2.498085133256966e-8,0.0012267312754294553,-1.880207278591228e-5,2.5125090674904964e-8,0.0012268713258371598,-1.914430998630717e-5,2.533341535608457e-8,0.001227131022819862,-1.954022969406463e-5,2.557377342250434e-8,0.0012275202373195173,-1.991570456003484e-5,2.5800673545950185e-8,0.0012280066605481112,-2.0202550073462475e-5,2.5972399157529153e-8,0.0012285289260753722,-2.036442274620531e-5,2.6066887113834473e-8,0.0012290215337736447,-2.0405843598096857e-5,2.608730247250189e-8,0.0012294364792536673,-2.0362831684957532e-5,2.605626237353159e-8,0.0012297525480403702,-2.0285001528169813e-5,2.600470001447718e-8,0.001229973287643303,-2.0219675206655426e-5,2.596192790923771e-8,0.00123011945294299,-2.0202577079814657e-5,2.5949829286862887e-8,0.0012302208090147813,-2.0254570927893388e-5,2.598089556577197e-8,0.001230309575850642,-2.0382079862008366e-5,2.6058620701201978e-8,0.0012304158345859968,-2.0579100696291248e-5,2.6178889594627654e-8,0.0012305643517482184,-2.0829746668818747e-5,2.6331638580619262e-8,0.0012307723235892732,-2.1111062515209374e-5,2.6502607204116547e-8,0.0012310478548748765,-2.1396114777007075e-5,2.6675202086625746e-8,0.0012313891899758615,-2.1657391046044656e-5,2.6832534064826254e-8,0.0012317848985939483,-2.187044513583133e-5,2.6959629716658373e-8,0.001232215249623264,-2.2017430944470345e-5,2.7045614719736176e-8,0.0012326547447966258,-2.209001773221379e-5,2.7085542859440893e-8,0.0012330755592392312,-2.2091326924775106e-5,2.70816135899996e-8,0.0012334516279752959,-2.203663011034868e-5,2.7043580150642033e-8,0.001233763101802164,-2.1952544155669515e-5,2.6988170698065287e-8,0.001234000846053606,-2.1874499915341305e-5,2.6937404354593894e-8,0.0012341705639102628,-2.184212653370876e-5,2.691563704449534e-8,0.0012342956223987628,-2.1891979650956894e-5,2.6945050302677308e-8,0.001234416688585595,-2.2047557895417835e-5,2.7039585964648845e-8,0.0012345855888722889,-2.23083766412273e-5,2.719839449139654e-8,0.0012348517249173988,-2.2642708147870215e-5,2.7401545144008608e-8,0.0012352433616983397,-2.2990593392258627e-5,2.7611962377998624e-8,0.0012357521897338616,-2.328103233247334e-5,2.778596961972363e-8,0.0012363319390749912,-2.3458241076732956e-5,2.7889391237730747e-8,0.001236914832205126,-2.3503051358274284e-5,2.7910738893106944e-8,0.0012374372602634584,-2.34370143285074e-5,2.7863779646029196e-8,0.0012378600978094599,-2.3308844078715344e-5,2.7779123129400366e-8,0.001238175025995959,-2.3173834169043024e-5,2.7691345091404345e-8,0.0012383987375117022,-2.3077516654817154e-5,2.7628715793488518e-8,0.0012385621901050622,-2.304804267920002e-5,2.7608434146434345e-8,0.001238700730871274,-2.3095701387628564e-5,2.7636418998067664e-8,0.0012388473917175444,-2.321606101218933e-5,2.7709418024290113e-8,0.0012390291726658905,-2.339397590953754e-5,2.781763697063455e-8,0.001239265187271221,-2.3607198404592336e-5,2.7947049692492793e-8,0.0012395656932513142,-2.3829477290720274e-5,2.808131142382676e-8,0.001239931567574002,-2.4033454791804963e-5,2.8203502070202986e-8,0.001240354197034772,-2.419368952870141e-5,2.8297948187087624e-8,0.0012408160639877112,-2.4289979933212816e-5,2.835226322126063e-8,0.0012412924936616241,-2.431076507997636e-5,2.835947104322042e-8,0.001241754847581157,-2.4255949556786933e-5,2.8319783468064274e-8,0.0012421750027906508,-2.413837942889537e-5,2.8241514856497743e-8,0.0012425305735050856,-2.398330917104594e-5,2.8140695039591662e-8,0.001242810041407821,-2.3825431793646963e-5,2.803911624686781e-8,0.0012430167548026835,-2.3703494765039817e-5,2.796086702784852e-8,0.0012431707595330977,-2.3653019187846447e-5,2.792773776976358e-8,0.0012433075282853305,-2.3697965910599013e-5,2.7954078812129726e-8,0.0012434727173970845,-2.3842679769997022e-5,2.8041949740427052e-8,0.001243712463212426,-2.4066405760676784e-5,2.8177927469785303e-8,0.0012440601035040232,-2.432362427984792e-5,2.8333484399655164e-8,0.0012445228361571915,-2.4553159928907133e-5,2.84706844897476e-8,0.001245074558848186,-2.469598742631698e-5,2.8553156726817562e-8,0.0012456608862963842,-2.4715959349908565e-5,2.8558858281151512e-8,0.001246216708050109,-2.4613291013679496e-5,2.8488399775580813e-8,0.001246688489499405,-2.4423038202625592e-5,2.8364074640010765e-8,0.0012470500759516796,-2.4199802086790886e-5,2.8220269933140577e-8,0.0012473056186578205,-2.3997923243581362e-5,2.8091007067191165e-8,0.0012474816718979766,-2.3856832628854112e-5,2.8000725693752732e-8,0.0012476152297567857,-2.3795467178827526e-5,2.796083255759579e-8,0.0012477434727424471,-2.3813936544781482e-5,2.797087896365848e-8,0.0012478974825907967,-2.3898538079999737e-5,2.802185450423327e-8,0.0012480994715242364,-2.4027063105389873e-5,2.8099607177080368e-8,0.0012483620860405254,-2.4173063448967265e-5,2.8187527217003586e-8,0.0012486885425988454,-2.4309038643380227e-5,2.8268487756534477e-8,0.0012490729604937483,-2.4409048929309893e-5,2.832640747738927e-8,0.0012495008229754566,-2.4451320673572244e-5,2.8347832218140762e-8,0.0012499499393055541,-2.442119484453209e-5,2.8323772418069707e-8,0.0012503925365264328,-2.4314275664468087e-5,2.8251695604431464e-8,0.0012507990005257714,-2.4139030867608762e-5,2.8137171704645568e-8,0.001251143262636996,-2.391768914256767e-5,2.7994415164953935e-8,0.0012514090363835088,-2.368426701735876e-5,2.7844976389814205e-8,0.0012515953110546903,-2.3479107716070564e-5,2.771421375274228e-8,0.0012517191350728285,-2.3340474530020665e-5,2.7625933544735366e-8,0.0012518141482856812,-2.3295030625602135e-5,2.7596407518891168e-8,0.00125192444142756,-2.334975383124914e-5,2.7629401271552236e-8,0.0012520946514939732,-2.348776438369355e-5,2.7713746828686006e-8,0.0012523583631477433,-2.3669877510084097e-5,2.7824516476769492e-8,0.0012527277286170939,-2.38425421336231e-5,2.7928118057615044e-8,0.0012531876409788102,-2.3951178423680048e-5,2.7990642199443437e-8,0.0012536974445180235,-2.395580939174183e-5,2.7987543221912417e-8,0.0012542012794675764,-2.3843814405731823e-5,2.7911488512020674e-8,0.0012546444912580575,-2.3634230998913443e-5,2.7774939914552914e-8,0.0012549898708866338,-2.337098949679818e-5,2.760582318235473e-8,0.0012552269467497428,-2.31078977299701e-5,2.7438033142794907e-8,0.0012553712247767674,-2.2892283909759187e-5,2.730112602560997e-8,0.001255455539610628,-2.2753872111695107e-5,2.7213370434487382e-8,0.0012555187275849952,-2.2701515499694785e-5,2.7179817449245153e-8,0.0012555962675502516,-2.2726235663317327e-5,2.719436714414756e-8,0.0012557148843836085,-2.280713457832666e-5,2.724360162183075e-8,0.001255890687072248,-2.2917285638186973e-5,2.7310518757386415e-8,0.001256129398595488,-2.3028282424195017e-5,2.7377340966423323e-8,0.0012564273842037858,-2.3113398094334926e-5,2.742741470506988e-8,0.001256772748129926,-2.3149894992070267e-5,2.7446594516070987e-8,0.0012571463545275083,-2.3121157899020574e-5,2.7424565261140528e-8,0.0012575231640768645,-2.3019131476612913e-5,2.7356401669610725e-8,0.001257874612111306,-2.284700440575688e-5,2.7244296214391676e-8,0.0012581727000068063,-2.2621361371800596e-5,2.7098925268443296e-8,0.0012583959412701018,-2.2372382207858894e-5,2.6939533510837228e-8,0.0012585362273141267,-2.2140433227805133e-5,2.6791698499354605e-8,0.0012586042852673735,-2.196814660205169e-5,2.6682241581275458e-8,0.0012586306549829782,-2.1889126806689826e-5,2.6632055608261722e-8,0.0012586601311620252,-2.1916855981065547e-5,2.664914718129419e-8,0.0012587403517282045,-2.2038399148444123e-5,2.672480002912566e-8,0.0012589081308858302,-2.2216070066749486e-5,2.6834805998698666e-8,0.001259178401966701,-2.2397001174915816e-5,2.6945651229235044e-8,0.0012595395662738137,-2.2527436600423014e-5,2.7023591961309044e-8,0.0012599565073977735,-2.2567114697326255e-5,2.704368259177285e-8,0.0012603800277351954,-2.249955563699239e-5,2.6996141762203254e-8,0.0012607598300570521,-2.2335587057110256e-5,2.6888416016816608e-8,0.0012610573544834757,-2.2109330675960614e-5,2.674249136516303e-8,0.0012612547690560867,-2.186800615213288e-5,2.6588343449294578e-8,0.0012613575758832708,-2.1658922356915117e-5,2.6455686208838244e-8,0.001261390591051946,-2.151793017938794e-5,2.6366737636690552e-8,0.00126138947197204,-2.146269522919313e-5,2.6332111564846554e-8,0.001261391218294045,-2.1491868003257122e-5,2.635046486548411e-8,0.0012614266428808319,-2.15888902989852e-5,2.641103229929555e-8,0.0012615162216082754,-2.1727952954471072e-5,2.6497431575663864e-8,0.0012616690635331466,-2.187983048108349e-5,2.6591299115901463e-8,0.0012618838439774989,-2.2016383972793845e-5,2.6675035116793972e-8,0.0012621505235054361,-2.2113585277586392e-5,2.6733624171416905e-8,0.0012624521180612978,-2.2153524616584108e-5,2.6755867859438524e-8,0.00126276632102878,-2.2126043067001626e-5,2.6735440962205498e-8,0.0012630672801498218,-2.2030481309721585e-5,2.6672051476437688e-8,0.0012633282001385453,-2.1877576094169603e-5,2.6572675677080794e-8,0.0012635254927225803,-2.1690821374928485e-5,2.6452399559931268e-8,0.0012636447200479173,-2.150581193844573e-5,2.6333924961939377e-8,0.0012636873694712005,-2.1365630790647973e-5,2.62445471842398e-8,0.001263675689203714,-2.1311092535360135e-5,2.6209908895091034e-8,0.001263651583389443,-2.1367352542053175e-5,2.624553285893486e-8,0.0012636669236140193,-2.1532112858698217e-5,2.6349454998586358e-8,0.0012637672086514252,-2.1772261625864342e-5,2.6500247615930587e-8,0.0012639754671761418,-2.2032532614826404e-5,2.666264158225693e-8,0.001264284192241647,-2.2253087100624153e-5,2.679874434506354e-8,0.0012646586664950854,-2.238799657886381e-5,2.687976398338216e-8,0.001265048952007261,-2.2417146448438736e-5,2.68935001124463e-8,0.0012654046375396352,-2.2348637976309602e-5,2.6845743928639548e-8,0.001265687166465729,-2.2213199967963506e-5,2.6756558234120423e-8,0.0012658770847539854,-2.205411237295862e-5,2.6653709859809845e-8,0.0012659757694239995,-2.1916095275190147e-5,2.6565519875628988e-8,0.0012660024992930466,-2.1835733466883678e-5,2.6514812194613012e-8,0.0012659883363219941,-2.183504682483079e-5,2.6514975770749016e-8,0.001265968564043513,-2.1918984668542527e-5,2.656857289282304e-8,0.0012659755016867593,-2.2076758125450218e-5,2.666835322071545e-8,0.0012660331867845541,-2.2286013655878877e-5,2.6799978389807436e-8,0.0012661546447266811,-2.2518299270481508e-5,2.6945459630868268e-8,0.0012663416011667139,-2.2744366594706175e-5,2.708642168120064e-8,0.0012665859156780787,-2.2938374403736194e-5,2.720666230998871e-8,0.0012668718340026004,-2.308069895407578e-5,2.729387607334129e-8,0.0012671783608418628,-2.315961813842999e-5,2.7340731279403066e-8,0.0012674815022603028,-2.3172399530941718e-5,2.734561490457562e-8,0.0012677565540440863,-2.3126206424985553e-5,2.7313258391016998e-8,0.0012679809078356128,-2.3038880813856224e-5,2.7255232108115096e-8,0.0012681379667225815,-2.293909764723427e-5,2.718996925380211e-8,0.001268222410981478,-2.2864607647463806e-5,2.714153350665855e-8,0.0012682458991817589,-2.285674137919671e-5,2.7136033101520892e-8,0.0012682404442877298,-2.294997743206441e-5,2.7194986348181077e-8,0.0012682552261359058,-2.3158135615329883e-5,2.732665258099185e-8,0.0012683438357439264,-2.3463184370203866e-5,2.751908579692521e-8,0.0012685445912806244,-2.381508922712379e-5,2.774017528295886e-8,0.0012688635218484556,-2.4146813037913072e-5,2.794723304902699e-8,0.0012692705636366676,-2.439852622614259e-5,2.8102383947438925e-8,0.0012697114811386142,-2.453808374801821e-5,2.818558432617654e-8,0.0012701278926337827,-2.456798692026666e-5,2.8199025785485304E-08,0.0012704747097447653,-2.451874191640579e-5,2.8162796580241977e-8,0.0012707290511519327,-2.4435369716645258e-5,2.8106093111468987e-8,0.00127089082105009,-2.4363968771578763e-5,2.8058468845464867e-8,0.0012709780445711418,-2.4341966719446985e-5,2.804354865594735e-8,0.0012710200656264432,-2.439279816146933e-5,2.8075722588673664e-8,0.001271050641705294,-2.4524258495752033e-5,2.8159296031538897e-8,0.0012711018882705825,-2.4729497552478398e-5,2.8289339641440367e-8,0.0012711994916664129,-2.4989923105568873e-5,2.8453680377103202e-8,0.0012713595362361608,-2.5279401250563086e-5,2.863560229913506e-8,0.0012715871496310693,-2.5568988582094783e-5,2.8816787886148046e-8,0.0012718768697763392,-2.5831442116825033e-5,2.898007870930307e-8,0.0012722144010838205,-2.6044933071783422e-5,2.911175618979125e-8,0.0012725792455093397,-2.619559555621507e-5,2.9203144635270495e-8,0.001272947626786604,-2.627888618297095e-5,2.9251514544716158e-8,0.0012732953571026233,-2.630006763486035e-5,2.9260441855358742e-8,0.0012736006475878774,-2.6274127894061375e-5,2.9239767557704245e-8,0.0012738470763975945,-2.6225193166156763e-5,2.9205161411702542e-8,0.0012740270157430664,-2.6185124088254545e-5,2.9177104177386633e-8,0.0012741455908807501,-2.6190414429344983e-5,2.9178785414269988e-8,0.001274224316427514,-2.62760887589678e-5,2.9232165679184445e-8,0.0012743020615554482,-2.646586880061536e-5,2.935178899471236e-8,0.001274429803943883,-2.6760187731966526e-5,2.9537333686976303e-8,0.0012746566213436674,-2.712756647179489e-5,2.976831346906732e-8,0.0012750096385508432,-2.7507546288788524e-5,3.0006033761210905e-8,0.0012754781610912526,-2.7829406560484464e-5,3.020548189174035e-8,0.001276013858158292,-2.8039650417442057e-5,3.033279425528792e-8,0.0012765492750488386,-2.812244159011328e-5,3.0378310890776146e-8,0.001277023642649741,-2.810137217333263e-5,3.035772861075833e-8,0.0012774012466509133,-2.802473521408781e-5,3.0302589247883327e-8,0.0012776758745853178,-2.7945890596938154e-5,3.024749497268067e-8,0.0012778647758220772,-2.79085430819153e-5,3.022048134829472e-8,0.001277998800793535,-2.793980262467159e-5,3.0238533240266736e-8,0.0012781132813501053,-2.804931557698271e-5,3.0307171318946226e-8,0.0012782413834105137,-2.8231718287190717e-5,3.042226138414893e-8,0.0012784098972853835,-2.8470294804898002e-5,3.0572571320992245e-8,0.0012786367518833218,-2.8740849073584766e-5,3.074235593251752e-8,0.0012789297433653374,-2.9015619036969142e-5,3.091384476109464e-8,0.0012792863683563302,-2.9267159831319898e-5,3.10696300382083e-8,0.0012796947422641365,-2.9471974501639326e-5,3.119488465856777e-8,0.0012801355484260517,-2.9613619515355336e-5,3.127929159311357e-8,0.0012805848824221722,-2.9684936207415627e-5,3.131847898599492e-8,0.001281017638662968,-2.968910490383866e-5,3.131473845451968e-8,0.0012814109964758992,-2.963950002011583e-5,3.1276957457645865e-8,0.0012817477332364437,-2.9558493616968298e-5,3.1219814796159154e-8,0.0012820192456920046,-2.9475284638605605e-5,3.116227933862801e-8,0.001282228197848576,-2.9422701983244574e-5,3.1125420021043346e-8,0.001282390606699797,-2.943268070189973e-5,3.112941115271035e-8,0.0012825366317504978,-2.9529907636028162e-5,3.118948519163852e-8,0.0012827084194776662,-2.9723676059624966e-5,3.131088059813362e-8,0.0012829528288665348,-2.9999700516418604e-5,3.1483844908667825e-8,0.0012833079130263225,-3.0316201547194518e-5,3.168132285335997e-8,0.0012837859765342673,-3.061020073146328e-5,3.1863018658290956e-8,0.0012843618450062628,-3.081684226297564e-5,3.198765635324121e-8,0.0012849765874220782,-3.089521995994752e-5,3.20294184946202e-8,0.0012855586318208988,-3.084588285428632e-5,3.1989175468429604e-8,0.0012860510837547415,-3.0708540178211655e-5,3.189304549666774e-8,0.001286429391721135,-3.054259065273131e-5,3.1779790208841204e-8,0.0012867022080911398,-3.0404062537684042e-5,3.1685762437681995e-8,0.001286900377279203,-3.0330777585708804e-5,3.163518182633183e-8,0.001287063300987379,-3.0338387143386424e-5,3.163759774986754e-8,0.001287228565364857,-3.042354922701865e-5,3.1690131287687944e-8,0.0012874261434639106,-3.056970632894269e-5,3.1781451277475414e-8,0.0012876761011276928,-3.075264889043229e-5,3.189554315979008e-8,0.001287988197340863,-3.094489886686548e-5,3.201458498978887e-8,0.0012883622633117567,-3.111913753711612e-5,3.2121090216733314e-8,0.0012887890246263095,-3.125116421789353e-5,3.219969606469643e-8,0.0012892514436496775,-3.1322610080414284e-5,3.223881626240157e-8,0.0012897267572810904,-3.132337450102907e-5,3.223217751474067e-8,0.0012901893827250341,-3.125348366035541e-5,3.2180042784654345e-8,0.0012906146194111945,-3.1123848609875844e-5,3.208974051574626e-8,0.0012909826969805158,-3.0955505293186115e-5,3.197517438868874e-8,0.0012912825565626971,-3.0777215881050795e-5,3.185520292845642e-8,0.0012915147687625943,-3.0621540642874033e-5,3.175097395022615e-8,0.001291693035842951,-3.0519716537336427E-05,3.168249183610786e-8,0.0012918438362249742,-3.0495841413462402e-5,3.1664819795655e-8,0.0012920037928547566,-3.056087693364674e-5,3.1704304670211076e-8,0.0012922141715474165,-3.0707282053063105e-5,3.17953364867465e-8,0.001292512034520009,-3.090599709338316e-5,3.1918661500173786e-8,0.0012929187002381516,-3.110850773894603e-5,3.2042880122178096e-8,0.0012934285950733568,-3.1256693423193994e-5,3.213078673276235e-8,0.0012940044453168913,-3.1300498297250774e-5,3.215061328521406e-8,0.001294584877820033,-3.12176444133966e-5,3.20885883560331e-8,0.001295104589766634,-3.102462475607171e-5,3.195596529494129e-8,0.0012955179603695564,-3.077085167751126e-5,3.178521309227125e-8,0.0012958131840410975,-3.0518540566581096e-5,3.1616916955709714e-8,0.0012960105999187787,-3.032026641965267e-5,3.148511085415194e-8,0.0012961495978159076,-3.0205433323736027e-5,3.140845109678617e-8,0.0012962734470908504,-3.0178565979806494e-5,3.1389212768773746e-8,0.0012964186126221632,-3.022527856628844e-5,3.141738252834504e-8,0.0012966099467786687,-3.032037295760454e-5,3.1476126820308665e-8,0.0012968600751613467,-3.043465498738407e-5,3.154631955101938e-8,0.0012971707339509185,-3.0539529403013107e-5,3.160949484610287e-8,0.0012975345391934867,-3.0609886172662965e-5,3.164960498486348e-8,0.0012979366525891216,-3.062613758462698e-5,3.1654217987039235e-8,0.0012983564533401342,-3.057599296156603e-5,3.1615600298714555e-8,0.0012987695840761062,-3.0456167864014533e-5,3.1531828857941956e-8,0.0012991507884455799,-3.027379091331488e-5,3.140775068646107e-8,0.0012994777236449333,-3.004683999448522e-5,3.125530194558217e-8,0.0012997353921117309,-2.9802813505353085e-5,3.1092622133109445e-8,0.0012999202861004046,-2.9575139003558806e-5,3.09416264273142e-8,0.0013000430270444395,-2.93974130243819e-5,3.0824133092212875e-8,0.001300128331498118,-2.9296350396882437e-5,3.075718715872455e-8,0.0013002116679433546,-2.928500804947685e-5,3.074866956412388e-8,0.0013003328193243616,-2.935801434543197e-5,3.0794343521651624e-8,0.001300527308605543,-2.9490231267340253e-5,3.0877225135393917e-8,0.0013008171756119307,-2.9639869058835446e-5,3.0969838317194383e-8,0.0013012031591031939,-2.9756515314625574e-5,3.10395465251122e-8,0.0013016609455879465,-2.9793446563434323e-5,3.105650235031395e-8,0.0013021442562541905,-2.972172931898944e-5,3.100263591424007e-8,0.0013025961177511457,-2.9541337275106654e-5,3.087867894617946e-8,0.0013029660006317406,-2.9283509335878423e-5,3.0705543544897195e-8,0.0013032261586196996,-2.9001308736517474e-5,3.051808034793436e-8,0.0013033793833759004,-2.875164122635431e-5,3.035331118242153e-8,0.0013034547749617115,-2.8577237008618275e-5,3.023868954419752e-8,0.0013034950005774671,-2.8496554952853205e-5,3.018561791167246e-8,0.0013035422626375217,-2.8503927091162528e-5,3.018972942257647e-8,0.0013036286487182313,-2.8576659673191224e-5,3.023572044825167e-8,0.0013037723920898197,-2.8683998777921855e-5,3.0303320007544866e-8,0.0013039784710675347,-2.8794434907111588e-5,3.037204952208462e-8,0.0013042411712836108,-2.8880283437659195e-5,3.042410362765577e-8,0.0013045469059940415,-2.8920083977942182e-5,3.044577741719525e-8,0.0013048765892900785,-2.8899827777303695e-5,3.042817208710491e-8,0.0013052076096280716,-2.8813836177220682e-5,3.0367751697282956e-8,0.0013055158699504063,-2.8665686201342626e-5,3.026699500311816e-8,0.0013057784723598796,-2.8469027833693583e-5,3.0134989400730604e-8,0.0013059774012722158,-2.824758312302742e-5,2.998744624708401e-8,0.0013061039917527009,-2.803329661145913e-5,2.984543622349855e-8,0.0013061631500154798,-2.786174715368294e-5,2.973227959525612e-8,0.0013061755169066931,-2.7764752904717206e-5,2.966860348764004e-8,0.0013061756394885842,-2.7761595595907e-5,2.9666567318660748e-8,0.0013062052931786697,-2.785175086959786e-5,2.972518749832201e-8,0.001306303142538855,-2.801230059159129e-5,2.9828826603746476e-8,0.0013064938194895942,-2.820182285028999e-5,2.9949955265754234e-8,0.001306780086361943,-2.8370168467178228e-5,3.005571106771042e-8,0.0013071407644421912,-2.8471378373462444e-5,3.0116392578181026e-8,0.0013075352201250116,-2.8475996159682643e-5,3.011342304590286e-8,0.001307913334487316,-2.8379292346448963e-5,3.0044539506056616e-8,0.0013082284553436203,-2.820295608258615e-5,2.992467194139616e-8,0.001308449795111905,-2.798934380814309e-5,2.9781980996995586e-8,0.0013085703641908598,-2.7789555942438875e-5,2.9649940584985727e-8,0.0013086075992558702,-2.7649081856834136e-5,2.9557946510256037e-8,0.0013085965713823258,-2.7596068441511594e-5,2.9523765739778143e-8,0.001308578775603071,-2.763613069992761e-5,2.9550353019012925e-8,0.0013085910545795772,-2.7754483402330733e-5,2.9627464816654964e-8,0.0013086582864577261,-2.7923038311927625e-5,2.973644409629548e-8,0.00130879097813508,-2.810881146934206e-5,2.985573633256056e-8,0.0013089866559391336,-2.8280794299983097e-5,2.9965288371083946e-8,0.0013092330853364449,-2.841421177594859e-5,3.004918959647898e-8,0.0013095117218239086,-2.849249915857971e-5,3.00968495932514e-8,0.0013098006051115334,-2.8507901829533638e-5,3.010335322333937e-8,0.0013100766331532816,-2.8461574612671678e-5,3.006956699423517e-8,0.00131031764281404,-2.8363692896845595e-5,3.0002285569679514e-8,0.0013105049028917662,-2.823351948220192e-5,2.991431821194102e-8,0.0013106264457913824,-2.809877946612421e-5,2.9824048280105456e-8,0.001310681133427025,-2.7993271777071674e-5,2.9753766780009736e-8,0.0013106824426351005,-2.795161269268233e-5,2.972610709291234e-8,0.0013106598420135267,-2.8000824017845768e-5,2.975846481850516e-8,0.001310655166280242,-2.8150479328616627e-5,2.9856575254154354e-8,0.0013107127876955784,-2.8385509043680695e-5,3.000993471753322e-8,0.0013108657814568222,-2.866643869990418e-5,3.0192141079751784e-8,0.0013111236756196114,-2.8939129152693387e-5,3.036744088323199e-8,0.0013114677764056418,-2.915104009753794e-5,3.0501486920959236e-8,0.001311856492484787,-2.9267251923133067e-5,3.0571854184595145e-8,0.001312238049311916,-2.9279859822208612e-5,3.057411525864111e-8,0.0013125651169096678,-2.9208198159179714e-5,3.0521802359526976e-8,0.0013128064021552001,-2.909142250826646e-5,3.044129361786551e-8,0.0013129525886068233,-2.897698933927629e-5,3.0364030849243177e-8,0.001313016206816826,-2.890865807546817e-5,3.031854722956662e-8,0.001313026461668143,-2.8916887043806896e-5,3.0324238748257375e-8,0.0013130209243820167,-2.901349026915853e-5,3.0388075426164644e-8,0.0013130364508609068,-2.91912467162573e-5,3.050460897562148e-8,0.0013131016267059507,-2.9427863667728573e-5,3.0658773423636455e-8,0.00131323234339437,-2.9692576163541312e-5,3.0830280966021656e-8,0.0013134309224520154,-2.9953194080713292e-5,3.099817761610996e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json new file mode 100644 index 0000000..e8e2db5 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":14000,"numberOfSamples":1000,"samples":[0.0013136880538731968,-3.0181825300251084e-5,3.1144455018197914e-8,0.0013139862307697747,-3.0358458604268804e-5,3.125626468859012e-8,0.0013143034381558063,-3.0472498704118995e-5,3.1326857923882795e-8,0.001314616342296335,-3.0522889122674205e-5,3.135568412117831e-8,0.0013149028238326915,-3.051757614543907e-5,3.134810730752583e-8,0.0013151441476950397,-3.0472812693602606e-5,3.1315005489895234e-8,0.001315327245423572,-3.041233669157899e-5,3.127221966442859e-8,0.0013154474985632677,-3.0365940022199845e-5,3.1239522569258994e-8,0.0013155119761371786,-3.0366482616605727e-5,3.123852579233063e-8,0.0013155421786821661,-3.044428590458291e-5,3.1288903751562086e-8,0.0013155741637083083,-3.061859253490029e-5,3.140279579367739e-8,0.0013156532826805987,-3.08878545724263e-5,3.15785553459714e-8,0.0013158221093964287,-3.122350814634265e-5,3.179684474210843e-8,0.0013161043666861684,-3.1573152017452694e-5,3.202287220092828e-8,0.001316492562279381,-3.187552478285449e-5,3.221630534507893e-8,0.0013169475071545026,-3.2081986318948946e-5,3.234541530079332e-8,0.0013174114482328236,-3.217362581767834e-5,3.2398333198900105e-8,0.0013178279759007432,-3.216549962188907e-5,3.238578137269618e-8,0.0013181587209702065,-3.209786877058771e-5,3.233512178519737e-8,0.0013183908584672483,-3.202101456924127e-5,3.2280078366949867e-8,0.0013185355723118594,-3.198087692229784e-5,3.22510415181099e-8,0.0013186210256550192,-3.200948903377424e-5,3.226871171627078e-8,0.001318683516304464,-3.212087078817048e-5,3.2341550899422565e-8,0.0013187592325329092,-3.2311333689063695e-5,3.246626921888799e-8,0.0013188777975085585,-3.256278527721231e-5,3.263027897225073e-8,0.0013190580943835157,-3.28478210560236e-5,3.281520552707126e-8,0.001319306537685271,-3.3135522599053245e-5,3.30007052286256e-8,0.0013196176305973269,-3.339691167788335e-5,3.3167938459672674e-8,0.0013199762931723731,-3.360923943949643e-5,3.330224076991175e-8,0.001320361240591444,-3.3758679883073964e-5,3.339478932604852e-8,0.0013207486407314094,-3.3841371491741154e-5,3.3443266039948134e-8,0.0013211154170834028,-3.3863122696377714e-5,3.345170814905867e-8,0.0013214419486963593,-3.3838325595684376e-5,3.342984862739796e-8,0.0013217143059939618,-3.3788485178276064e-5,3.3392152957732015e-8,0.0013219262892678202,-3.374042925569602e-5,3.3356565064026065e-8,0.0013220814837101608,-3.37239298755937e-5,3.334280561542386e-8,0.0013221952658236343,-3.3768093745891034e-5,3.336987271475884e-8,0.0013222959339579021,-3.389572813238187e-5,3.345230413051685e-8,0.0013224231012386285,-3.411559264521433e-5,3.359518483099222e-8,0.001322620987373266,-3.44143314836092e-5,3.378904291433436e-8,0.0013229254974994617,-3.47525377055976e-5,3.4007455453146385e-8,0.0013233481259613213,-3.507078420316715e-5,3.421110391244622e-8,0.0013238651644779758,-3.5307915680853196e-5,3.435980179531848e-8,0.0013244214578083684,-3.5424988893193025e-5,3.4428250117923195e-8,0.0013249498096669955,-3.5421322382391885e-5,3.441665080515855e-8,0.0013253957656545127,-3.533284530570563e-5,3.4349593606930406e-8,0.0013257341054285624,-3.521518782185486e-5,3.4264687362774436e-8,0.0013259708733802966,-3.5122901891955616e-5,3.4198504380576074e-8,0.0013261345823387194,-3.509485421874728e-5,3.4176685340857736e-8,0.0013262639590043055,-3.514877227589115e-5,3.421034115508173e-8,0.0013263974759466818,-3.5282692478288204e-5,3.42972534612874e-8,0.0013265664975942637,-3.547980948220061e-5,3.4425417060696266e-8,0.00132679174008558,-3.5714173837029465e-5,3.457707337361339e-8,0.0013270820868991236,-3.595606011854193e-5,3.473236215303623e-8,0.0013274350277215283,-3.617667618018595e-5,3.487237396855363e-8,0.0013278383205704806,-3.6352045676457e-5,3.4981566469251094e-8,0.0013282725585155749,-3.6465885830951754e-5,3.504952018493835e-8,0.0013287143399232126,-3.651136884131447e-5,3.507202780552796e-8,0.001329139723468503,-3.649166207236073e-5,3.5051459488144146e-8,0.0013295275370495275,-3.6419245769639135e-5,3.499636143139478e-8,0.0013298621741601225,-3.631427873602864e-5,3.492040029054349e-8,0.0013301357987788196,-3.620233676919433e-5,3.484081953074903e-8,0.0013303500182077856,-3.6111625895291846e-5,3.4776475543805855e-8,0.0013305170072328,-3.606960581815073e-5,3.4745462642883064e-8,0.0013306599051258836,-3.609882203418703e-5,3.4762278550856455e-8,0.0013308118536023116,-3.621166286686944e-5,3.483441417239421e-8,0.0013310123518564367,-3.64043217054422e-5,3.495855682409469e-8,0.0013312994223816388,-3.6651762152887505e-5,3.511751481890027e-8,0.0013316973518746693,-3.6907391838432765e-5,3.528018149292224e-8,0.0013322032136629622,-3.711186898684884e-5,3.540737536800615e-8,0.0013327798493111566,-3.721219549322923e-5,3.546437127639159e-8,0.0013333634934342639,-3.718420813249119e-5,3.543571757580381e-8,0.001333886255019829,-3.70450465515009e-5,3.53335093009964e-8,0.0013343019613464686,-3.6846215847581066e-5,3.5192757078025216e-8,0.001334600413137058,-3.6651362298198277e-5,3.505642654975122e-8,0.0013348042208097524,-3.6512872822752915e-5,3.495958564720737e-8,0.0013349544109773996,-3.6458841744971036e-5,3.49205708479965e-8,0.0013350949386154267,-3.649215529746224e-5,3.49404840851344e-8,0.0013352621732775469,-3.659679818886342e-5,3.500770195061645e-8,0.001335480179315456,-3.6746003522191745e-5,3.510363508802379e-8,0.0013357600358690303,-3.6909212409168185e-5,3.520756323936493e-8,0.0013361011544938224,-3.705705068984642e-5,3.52999605336332e-8,0.00133649332519081,-3.7164741980348925e-5,3.536463540591373e-8,0.0013369190829818159,-3.7214510810799346e-5,3.539015342857483e-8,0.0013373563443612583,-3.719721204638616e-5,3.537079341232845e-8,0.0013377813051418917,-3.711323131523201e-5,3.530711046883947e-8,0.0013381715937814552,-3.697254005026054e-5,3.520601101140213e-8,0.0013385094912165925,-3.6793660324817705e-5,3.5080116340020854e-8,0.0013387847813319696,-3.660147627572446e-5,3.494630461274569e-8,0.0013389968351418553,-3.642410292771776e-5,3.482354178926302e-8,0.0013391557003256266,-3.628905404552198e-5,3.473019081800264e-8,0.0013392819820180002,-3.621893946658274e-5,3.468102678374732e-8,0.0013394052631200586,-3.622700347066692e-5,3.468425016446891e-8,0.0013395607383982387,-3.631286700900988e-5,3.473878515860904e-8,0.0013397835600754613,-3.645915330073845e-5,3.483228424044899e-8,0.0013401005623555385,-3.663056453013473e-5,3.494077405219707e-8,0.0013405202232471124,-3.6777887727110934e-5,3.5031461893425745e-8,0.0013410241084409612,-3.684910446392256e-5,3.5070089714356354e-8,0.0013415655317836142,-3.68068037108336e-5,3.503236888286036e-8,0.0013420805713068025,-3.664539114072159e-5,3.491530557749418e-8,0.0013425100358751974,-3.6397470548011556e-5,3.47413920987351e-8,0.00134282186684753,-3.6122771266874264e-5,3.455114282299104e-8,0.0013430210440999052,-3.5884585735838275e-5,3.438718523558038e-8,0.0013431424937006674,-3.5727401868071906e-5,3.427912167202074e-8,0.00134323392387406,-3.5666709476200635e-5,3.423668442759081e-8,0.0013433393957544833,-3.569188452387105e-5,3.425186840423222e-8,0.0013434898472930886,-3.577592172660759e-5,3.430576805004325e-8,0.0013437006458960645,-3.588557734935549e-5,3.4375631883152696e-8,0.0013439733632099559,-3.598872432152733e-5,3.443987682266083e-8,0.0013442990272794215,-3.6058572131738544e-5,3.448082578605249e-8,0.0013446613049089872,-3.6075754726357985e-5,3.44859220020242e-8,0.001345039248616876,-3.6029368037547205e-5,3.444825503332818e-8,0.0013454098213895693,-3.591751673460431e-5,3.436684759254604e-8,0.0013457504724702282,-3.57474829484819e-5,3.424678910825797e-8,0.0013460419605556845,-3.5535332633184876e-5,3.409904369034362e-8,0.0013462713941414768,-3.530453678562293e-5,3.3939575913952353e-8,0.0013464350440412546,-3.5083247688415916e-5,3.3787496601098456e-8,0.001346540218956281,-3.490026072080504e-5,3.366224387151234e-8,0.0013466055506973335,-3.478008498355249e-5,3.358013732940204e-8,0.001346659241019408,-3.4737853074248655e-5,3.355088149022233e-8,0.0013467351263881956,-3.477505002897689e-5,3.3574748237485566e-8,0.0013468668157807983,-3.487707274585662e-5,3.36411293630354e-8,0.0013470805087412794,-3.501350818296307e-5,3.3728992049500143e-8,0.0013473874871725111,-3.5141989537112516e-5,3.3809694862078156e-8,0.0013477779846166242,-3.5216299066590065e-5,3.385250575241212e-8,0.0013482190793279586,-3.5198369687471605e-5,3.3832555330064887e-8,0.001348659613978359,-3.507162618165665e-5,3.3739577083562544e-8,0.001349043468490627,-3.485031268644354e-5,3.358395470384573e-8,0.001349327999366581,-3.4578485620740276e-5,3.3395893343763146e-8,0.0013494994616960665,-3.431622032059404e-5,3.321604676365601e-8,0.001349576900362316,-3.411840812110945e-5,3.3081186820720924e-8,0.0013496024923671088,-3.4016892922365775e-5,3.3012189592066463e-8,0.0013496246279193777,-3.401415154718749e-5,3.300992090644571e-8,0.0013496829179363164,-3.408870967312186e-5,3.305913434321514e-8,0.0013498005419856707,-3.420638364611618e-5,3.313629142245499e-8,0.001349983766265312,-3.433103577998142e-5,3.3216931742549514e-8,0.001350225503188383,-3.443167213616684e-5,3.328041116125517e-8,0.001350509870791549,-3.44857855079198e-5,3.3311987997451824e-8,0.001350816111848709,-3.44802776149318e-5,3.330325655153641e-8,0.0013511215354534733,-3.44113203272646e-5,3.325193674476666e-8,0.0013514038266242718,-3.428394324938091e-5,3.3161588903372553e-8,0.0013516432294084326,-3.41115562702498e-5,3.3041366067246576e-8,0.0013518249947347244,-3.391515061958602e-5,3.29055587983786e-8,0.0013519421489563276,-3.372159161237384e-5,3.277246672853169e-8,0.0013519981162253448,-3.35604192219653e-5,3.2662172488743894e-8,0.0013520082488663807,-3.345899609113347e-5,3.259313778399188e-8,0.0013519991491952143,-3.343655294053388e-5,3.257806735071459e-8,0.0013520049886915973,-3.349849264305731e-5,3.262004101630264e-8,0.0013520609158930905,-3.36328575909331e-5,3.2710241377374956e-8,0.0013521948074782938,-3.3810651240403614e-5,3.2828394204526694e-8,0.0013524194680195325,-3.399070247049815e-5,3.2946301667474426e-8,0.0013527275548078518,-3.412846985252045e-5,3.3033954284171145e-8,0.0013530910516223313,-3.41870260521444e-5,3.306696170857802e-8,0.0013534662186818406,-3.414758958099839e-5,3.303351712767489e-8,0.0013538036921596796,-3.401650121264336e-5,3.293885919569297e-8,0.0013540617630267778,-3.3825695437600704e-5,3.280532715743045e-8,0.0013542189655621978,-3.3625013396523797e-5,3.2666968653528377e-8,0.0013542809896239987,-3.3467679762926974e-5,3.255963827369867e-8,0.0013542783419837156,-3.3394020433318414e-5,3.251003853738814e-8,0.0013542554119995557,-3.342020697923614e-5,3.252828382153754e-8,0.0013542560140103023,-3.3536391035527796e-5,3.2606892142050424e-8,0.0013543116989025482,-3.371353007933651e-5,3.2725642792952345e-8,0.0013544365308802784,-3.391431273365121e-5,3.285910327271554e-8,0.0013546280975285543,-3.410316353858851e-5,3.2983383466057345e-8,0.0013548720539619643,-3.4252552907384106e-5,3.308026489902493e-8,0.001355147353668992,-3.43454908576762e-5,3.313870075252464e-8,0.0013554305468037433,-3.437553330264171e-5,3.315467676927687e-8,0.0013556988011802253,-3.434572357619407e-5,3.313045281129339e-8,0.0013559320038673691,-3.426735815892247e-5,3.30737806614842e-8,0.0013561145343338845,-3.415887769336406e-5,3.299724375590522e-8,0.0013562372346350193,-3.40446430953795e-5,3.291748056072256e-8,0.001356299729968249,-3.395293821719811e-5,3.285379960496967e-8,0.0013563126464800305,-3.39124616274109e-5,3.2825694374099335e-8,0.0013562986345168043,-3.394695718115785e-5,3.284908231937111e-8,0.0013562906901488832,-3.406854808973949e-5,3.2931730931658255e-8,0.0013563265580224901,-3.4271700357362895e-5,3.3069227097465745e-8,0.0013564394803830895,-3.453081024388408e-5,3.3243512234392763e-8,0.001356647830444362,-3.480395690125668e-5,3.342564568063368e-8,0.0013569477158602284,-3.504296952579012e-5,3.358281757335669e-8,0.0013573120584085639,-3.52068525793514e-5,3.368754392194241e-8,0.001357697050412798,-3.5273779767518736e-5,3.3725762172275216e-8,0.0013580538346326509,-3.524742322405932e-5,3.3700952947215904e-8,0.0013583414729187431,-3.515577457801083e-5,3.3633068996217375e-8,0.0013585373183607017,-3.504326814963739e-5,3.3552899090837633e-8,0.0013586421139425234,-3.4958781479045985e-5,3.3493719387707e-8,0.001358678685937704,-3.494290707046618e-5,3.3482624669021657e-8,0.001358684778336174,-3.501803608967189e-5,3.353396129882613e-8,0.001358702322909947,-3.518405715028354e-5,3.36466993389363e-8,0.0013587666406036992,-3.542061521536396e-5,3.380626499920978e-8,0.0013588989123856205,-3.5694495803273485e-5,3.398974496696862e-8,0.001359103663247866,-3.5969025766868755e-5,3.417229612867719e-8,0.0013593708567535968,-3.621226756590788e-5,3.4332592451649465e-8,0.0013596806793210175,-3.640207539916034e-5,3.4456072169122394e-8,0.0013600088338772479,-3.6527817297702786e-5,3.4535941490019846e-8,0.0013603309085686056,-3.6589745925869715e-5,3.4572666368770736e-8,0.0013606253906847028,-3.659727205627579e-5,3.4572817000381455e-8,0.0013608755966453268,-3.656705235731982e-5,3.45478428901892e-8,0.0013610710755603856,-3.652125748003627e-5,3.4512957394544435e-8,0.0013612090115036409,-3.648585481662091e-5,3.448596151433922e-8,0.0013612958461505,-3.648833256815448e-5,3.448560847301663e-8,0.0013613487825353768,-3.655412453139295e-5,3.452905427534737e-8,0.0013613960977975756,-3.6701245140876124e-5,3.4628141465119906e-8,0.0013614745650237811,-3.693358561190437e-5,3.4784884782548805e-8,0.0013616224205170902,-3.7235042204870165e-5,3.4987633233731027e-8,0.001361868091522445,-3.756832421090297e-5,3.521045772248526e-8,0.001362218255945228,-3.788197415238886e-5,3.541808383563176e-8,0.0013626514699812326,-3.812539193249165e-5,3.557619486093644e-8,0.001363122322234058,-3.8266165560665596e-5,3.566324383611881e-8,0.0013635754647547845,-3.830134386399334e-5,3.5678079037798024e-8,0.0013639630780626708,-3.825738313571894e-5,3.563975015298319e-8,0.001364258080357862,-3.817994201829989e-5,3.5580274568062977e-8,0.0013644589434662312,-3.811922202797349e-5,3.5534332460088205e-8,0.0013645865742663128,-3.81166924124298e-5,3.5530027944857735e-8,0.0013646762446455044,-3.819653354824757e-5,3.558310331044814e-8,0.001364767819829093,-3.8362605590993256e-5,3.569514079478911e-8,0.0013648967631197295,-3.8600238344742254e-5,3.585514627803409e-8,0.0013650874946786213,-3.888148752071901e-5,3.60434300221522e-8,0.0013653499642588421,-3.917227000116867e-5,3.62365942886353e-8,0.00136567964200512,-3.943967176457917e-5,3.6412451385441956e-8,0.0013660603709506384,-3.965784039600382e-5,3.65538578644758e-8,0.0013664688889499187,-3.981147629204727e-5,3.665089579529965e-8,0.0013668796761675812,-3.989679821734419e-5,3.6701401260529234e-8,0.0013672690955396569,-3.992052333462929e-5,3.6710241547116054e-8,0.0013676183253096337,-3.9897716306200194e-5,3.668789735721834e-8,0.0013679151464472477,-3.984932666566189e-5,3.664884493646582e-8,0.0013681550099158162,-3.979985343784534e-5,3.660997364210455e-8,0.0013683418187992174,-3.977508572660584e-5,3.658897704031485e-8,0.0013684886345164064,-3.9799531863791056e-5,3.6602481816290366e-8,0.0013686181140462686,-3.989297417404592e-5,3.6663608773571173e-8,0.0013687618136698219,-4.006569078124706e-5,3.677873040014451e-8,0.0013689567976789784,-4.031268759372785e-5,3.6943686509812775e-8,0.0013692379960220952,-4.0608958982055686e-5,3.714077674900414e-8,0.0013696263976024602,-4.0909688045915914e-5,3.733908018595111e-8,0.001370116858706226,-4.115943735403728e-5,3.7500783826076915e-8,0.0013706730192843547,-4.131030892561659e-5,3.759353716751259e-8,0.0013712357655380756,-4.1341651354543865e-5,3.760387092264407e-8,0.001371743681640421,-4.1269733274189294e-5,3.754378869036469e-8,0.0013721549303818486,-4.114093707006044e-5,3.744600118910848e-8,0.0013724590038156602,-4.1013018078885606e-5,3.7350822712677154e-8,0.0013726746583584263,-4.0935524588789915e-5,3.7292433498253575e-8,0.0013728388253621247,-4.093780361015353e-5,3.7290504667023286e-8,0.0013729936653109317,-4.102619609853645e-5,3.7348411588796894e-8,0.001373176359782013,-4.118762655376452e-5,3.745605098886693e-8,0.0013734130133102524,-4.139607981819826e-5,3.759467361926248e-8,0.0013737161837680623,-4.161950138762874e-5,3.7741869452387925e-8,0.0013740850229568907,-4.182594710895547e-5,3.787581954548767e-8,0.0013745072421834012,-4.198858396882682e-5,3.797857502949695e-8,0.0013749623837124778,-4.208926335925624e-5,3.803827857381001e-8,0.0013754258276343432,-4.2120407717748035e-5,3.8050265155743136e-8,0.001375872892622539,-4.2085198307853355e-5,3.801710263943968e-8,0.001376282469925798,-4.199628974034897e-5,3.7947728565110885e-8,0.0013766397572874227,-4.187345120748918e-5,3.7855899666402347e-8,0.0013769379150291574,-4.1740698791756187e-5,3.775826686919178e-8,0.0013771788132807986,-4.162339046388268e-5,3.76723488673647e-8,0.0013773731537905993,-4.154540420571933e-5,3.7614493141915814e-8,0.0013775401104706387,-4.1526264618012495e-5,3.759779228022895e-8,0.0013777064032593797,-4.157796597586423e-5,3.762987031680914e-8,0.001377904267471179,-4.170125910920436e-5,3.771044184184231e-8,0.0013781672206391812,-4.188175848661827e-5,3.78288749397831e-8,0.00137852256618738,-4.2087548328483725e-5,3.7962807628071696e-8,0.0013789809169083302,-4.2271422389212076e-5,3.807982991820045e-8,0.0013795260580142504,-4.238109909941585e-5,3.8144447194615674e-8,0.0013801120459359865,-4.237742637005507e-5,3.813041208095439e-8,0.0013806741263976,-4.225334424947585e-5,3.8033625865393774e-8,0.0013811520519300435,-4.2041187655938626e-5,3.787713159675286e-8,0.0013815136370865081,-4.180098864064637e-5,3.7703002181980215e-8,0.0013817644462791729,-4.159593522969593e-5,3.755522195444356e-8,0.0013819398040921613,-4.146995772891535e-5,3.7463973571636786e-8,0.0013820873195676013,-4.143814444971667e-5,3.74389528223684e-8,0.0013822508297504756,-4.1489856674521627e-5,3.747173694159376e-8,0.0013824612018183504,-4.159808318168086e-5,3.7542636676095634e-8,0.001382733677333939,-4.172918004101423e-5,3.76277743218216e-8,0.0013830692173663335,-4.185025959459586e-5,3.7704340994960595e-8,0.0013834575067367659,-4.193387127219509e-5,3.7753754368892116e-8,0.00138388030970731,-4.196070426809343e-5,3.776329962305264e-8,0.0013843148322871465,-4.1921028124019695e-5,3.7726878625517075e-8,0.0013847370777409624,-4.181512286564115e-5,3.7645150528966244e-8,0.0013851250900450299,-4.165273271465304e-5,3.752512539985943e-8,0.0013854619058602147,-4.145156074913463e-5,3.737919056711855e-8,0.0013857379458243554,-4.123483834305219e-5,3.722351350041851e-8,0.0013859525067954938,-4.1028195536964666e-5,3.707590164867331e-8,0.001386114186987945,-4.08562465832129e-5,3.6953376917189425e-8,0.0013862402914967716,-4.0739217947163935e-5,3.6869727504020365e-8,0.0013863552819137583,-4.068981038566365e-5,3.683325080139284e-8,0.0013864882812566375,-4.071045407698197e-5,3.684488191793497e-8,0.0013866695093654466,-4.0791084850707254e-5,3.689683217641563e-8,0.0013869252570760705,-4.0907845082072896e-5,3.6971967000828836e-8,0.0013872711358115565,-4.102392437415202e-5,3.7044638632372434e-8,0.0013877044103900269,-4.10944872644231e-5,3.708418444800822e-8,0.0013881982022425643,-4.107730918647336e-5,3.70621554354846e-8,0.0013887024507251455,-4.094823201885367e-5,3.696274535980045e-8,0.0013891560996636264,-4.071545369969397e-5,3.6792453536201996e-8,0.0013895088976246747,-4.042264374578624e-5,3.658214577314118e-8,0.0013897421255975183,-4.013475017712353e-5,3.637717862062872e-8,0.0013898751358086116,-3.99123909946508e-5,3.621955119697095e-8,0.0013899539157585976,-3.97898760399196e-5,3.613256495667892e-8,0.0013900305358917047,-3.976825529054825e-5,3.611605869920365e-8,0.0013901459897183817,-3.982280938552323e-5,3.615187595826213e-8,0.001390322583927315,-3.9916483926864295e-5,3.621354110721034e-8,0.0013905644815372748,-4.00116379826972e-5,3.627465691377648e-8,0.001390862196549241,-4.007719389834769e-5,3.6313891042696686e-8,0.0013911977272878053,-4.009168854677753e-5,3.631692015857626e-8,0.001391548803289706,-4.004388985804637e-5,3.627660019245447e-8,0.0013918921108757572,-3.9932383942914886e-5,3.619246897144912e-8,0.001392205925877442,-3.976474847087717e-5,3.607009012040189e-8,0.001392472481833256,-3.9556371616133894e-5,3.592027726302581e-8,0.0013926801795685095,-3.932876436594814e-5,3.5758025153182566e-8,0.0013928255206943443,-3.910712261197275e-5,3.5600891948591315e-8,0.0013929143574365078,-3.891704325009154e-5,3.546670424830646e-8,0.0013929619662561058,-3.878067864465175e-5,3.5370785800753655e-8,0.0013929916634681091,-3.8712865216251155e-5,3.5323145245009847e-8,0.0013930319212074739,-3.871783709874851e-5,3.532613964822986e-8,0.0013931121650108214,-3.878718027241075e-5,3.537313617747967e-8,0.0013932576761824852,-3.889956926863257e-5,3.544855030305457e-8,0.0013934841205019005,-3.902264562679513e-5,3.5529430896809445e-8,0.0013937923389470475,-3.911747336501126e-5,3.558876680690813e-8,0.0013941645951322254,-3.9146037401005566e-5,3.560072677257016e-8,0.0013945643433518572,-3.908149684330105e-5,3.554760976148454e-8,0.0013949419740809537,-3.8919080012482775e-5,3.54271205202408e-8,0.0013952477277678645,-3.868301987054237e-5,3.525691407233159e-8,0.001395448996586115,-3.842366805801884e-5,3.507242835859129e-8,0.0013955441184541493,-3.8202198743737096e-5,3.491619511363628e-8,0.001395563841894682,-3.806835542580855e-5,3.482237329132881e-8,0.0013955584098649994,-3.804297850225461e-5,3.4804676331452736e-8,0.0013955778157443777,-3.8114400232592614e-5,3.4854056156277526e-8,0.0013956561830292,-3.8248114880291454e-5,3.4945709067619815e-8,0.0013958061096767589,-3.840169374270801e-5,3.504970300817749e-8,0.001396021525706078,-3.853707477095065e-5,3.513962678304474e-8,0.0013962843041433993,-3.8627076516026636e-5,3.5197026880596114e-8,0.0013965707576988314,-3.865699570879773e-5,3.521229439063478e-8,0.0013968563725718281,-3.8623536025609064e-5,3.5183688298750485e-8,0.0013971187911648243,-3.8532907044979155e-5,3.511587978476073e-8,0.001397339741657006,-3.8398963032655006e-5,3.501866053362015e-8,0.0013975065707011172,-3.824149273866268e-5,3.490584928664414e-8,0.0013976137214529206,-3.808437691328442e-5,3.47941124837482e-8,0.0013976641337538325,-3.795316224892923e-5,3.470130668547223e-8,0.0013976701313359334,-3.787171824233571e-5,3.4644083108582145e-8,0.0013976530803277948,-3.785809777299285e-5,3.4634877223998395e-8,0.0013976411745630901,-3.792027581554576e-5,3.467883721971932e-8,0.0013976651171231898,-3.8052873706371765e-5,3.477154552196402e-8,0.001397752138213877,-3.8236151892252456e-5,3.489846164729002e-8,0.0013979195447783234,-3.8438219455829296e-5,3.5036710195449224e-8,0.0013981694399458889,-3.862056128580171e-5,3.515918741519236e-8,0.001398486147697437,-3.874608834560939e-5,3.524031957876636e-8,0.0013988374531938928,-3.878827062153085e-5,3.526239348503685e-8,0.001399180229735303,-3.873936055813441e-5,3.5221074317918304e-8,0.0013994701906148062,-3.861521125226919e-5,3.5128449985403174e-8,0.0013996740998213511,-3.845410205611195e-5,3.501191367250836e-8,0.0013997808979702491,-3.830798334251088e-5,3.490787420794603e-8,0.0013998068841861602,-3.822734029112152e-5,3.485117466616385e-8,0.0013997912690781416,-3.824484084870901e-5,3.486381492238321e-8,0.001399782875381604,-3.836511152067367e-5,3.494805808686753e-8,0.0013998239209614296,-3.856545057793629e-5,3.508720829151086e-8,0.0013999383452429608,-3.880618248898522e-5,3.5253069111989446e-8,0.001400128687982977,-3.9044513556967366e-5,3.5415721677933286e-8,0.0014003803140351105,-3.924559928935504e-5,3.555119946742358e-8,0.0014006688652410718,-3.938796884383357e-5,3.564509648433299e-8,0.0014009672459019793,-3.946401158692379e-5,3.569268613464028e-8,0.0014012504631784645,-3.9477773714654874e-5,3.5697219627372335e-8,0.0014014983378744935,-3.9442025791079544e-5,3.566783351875651e-8,0.0014016968485090753,-3.937562123845998e-5,3.561776933093947e-8,0.0014018389311078144,-3.930135009856592e-5,3.556297869454529e-8,0.0014019252611881805,-3.924395351028988e-5,3.552079791655267e-8,0.0014019650674987158,-3.922771502573723e-5,3.550823547292913e-8,0.0014019765254487317,-3.927316184126799e-5,3.5539561321083074e-8,0.0014019859072127623,-3.939286678870541e-5,3.562326047613582e-8,0.0014020245683540645,-3.9587049026522654e-5,3.57589225433063e-8,0.0014021232793080098,-3.984050350448809e-5,3.5935183683834784e-8,0.0014023045619820167,-4.0122876368864325e-5,3.613011664758931e-8,0.001402575188517273,-4.0393711578013267e-5,3.631499515737404e-8,0.0014029218430838034,-4.0611873294491905e-5,3.6461068646827724e-8,0.0014033123169753285,-4.074679499372091e-5,3.654749216388009e-8,0.0014037026283073234,-4.078780138232347e-5,3.6567752091281347e-8,0.0014040481592061073,-4.074819558912667e-5,3.653228462529379e-8,0.0014043154629272954,-4.0662606574106574e-5,3.646629348386904e-8,0.0014044912857379814,-4.057825582912705e-5,3.640333363998543e-8,0.001404586199481951,-4.054249152292174e-5,3.6376420565956945E-08,0.0014046315916832204,-4.059001163717845e-5,3.640913312668297e-8,0.0014046706036646942,-4.073363552405963e-5,3.650939734711049e-8,0.0014047457709805932,-4.096173679938644e-5,3.6668033280187714e-8,0.0014048875975041877,-4.1243138982900314e-5,3.686248986601918e-8,0.0014051079231287907,-4.153727189609017e-5,3.706412048229687e-8,0.0014053996891925462,-4.180543919169627e-5,3.724605723962737e-8,0.0014057418851642401,-4.201928520354164e-5,3.7388982979293707e-8,0.0014061067325829505,-4.216459310863377e-5,3.748357386154352e-8,0.0014064662792454632,-4.2240904034702006e-5,3.75300453375767e-8,0.001406796935332708,-4.225873123662221e-5,3.753610982343233e-8,0.0014070818711074016,-4.223609237701761e-5,3.7514565091294765e-8,0.0014073119283782146,-4.219538055815336e-5,3.748118402098386e-8,0.0014074858454996213,-4.216086923191445e-5,3.7453036902211475e-8,0.0014076103837110468,-4.215657537536124e-5,3.744699428145286e-8,0.001407700482867457,-4.2203893189522455e-5,3.7477990165415446e-8,0.0014077790394113716,-4.231848459825597e-5,3.755673767593618e-8,0.0014078754676845311,-4.250633958081457e-5,3.768691664581742e-8,0.0014080219967517041,-4.275967059593405e-5,3.7862358742113034e-8,0.0014082470158322466,-4.305438268393406e-5,3.8065444478173206e-8,0.0014085662107764442,-4.3351709842482535e-5,3.826846229183665e-8,0.0014089744868300872,-4.360598119993927e-5,3.843922404533621e-8,0.0014094431536157055,-4.377765422595991e-5,3.8550288702544655e-8,0.0014099256069116926,-4.384699363489847e-5,3.8588547143931624e-8,0.001410370621965012,-4.3822017616625005e-5,3.8560684416864574e-8,0.0014107379906385569,-4.373660777036701e-5,3.8491618344667396e-8,0.001411009964557524,-4.363969764258664e-5,3.841657689536917e-8,0.0014111946000197385,-4.3580512043394426e-5,3.8370420063415034e-8,0.0014113211867777273,-4.359545857298468e-5,3.837829828573306e-8,0.0014114306461733982,-4.3700232323209964e-5,3.8450239351540594e-8,0.001411564408632792,-4.388818610139138e-5,3.858035161105931e-8,0.0014117547305501578,-4.4134232812283986e-5,3.874997182226532e-8,0.0014120184750084578,-4.440248212920195e-5,3.8933324817321076e-8,0.0014123552829552618,-4.4655279826922307e-5,3.910396017989396e-8,0.0014127498958597165,-4.4861304314633954e-5,3.924032595412258e-8,0.0014131773611926266,-4.500092974261656e-5,3.932930729967511e-8,0.0014136092759243295,-4.5068124233728125e-5,3.9367328715653395e-8,0.001414019350464863,-4.50693223258045e-5,3.9359414083827914e-8,0.001414387280570928,-4.5020436860496765e-5,3.931705416718012e-8,0.0014147007530842784,-4.4943253683445574e-5,3.925572649703533e-8,0.0014149560140847756,-4.486209219785531e-5,3.919262101512192e-8,0.0014151576551419522,-4.4801074437002196e-5,3.914474595500056e-8,0.001415318136201093,-4.478183557739158e-5,3.912726793698288e-8,0.0014154572003696824,-4.482122856836196e-5,3.9151802563573214e-8,0.0014156009001108517,-4.492859041749618e-5,3.9224425325897754e-8,0.0014157795097893533,-4.5102449376290346e-5,3.93433918158505e-8,0.0014160233109937125,-4.532727500167816e-5,3.94970098303655e-8,0.0014163555567608258,-4.557201265798743e-5,3.96628298780135e-8,0.0014167833913719533,-4.579313198730899e-5,3.980996986060289e-8,0.0014172901012929602,-4.594441145983626e-5,3.990606550755613e-8,0.0014178341748209257,-4.599235373069634e-5,3.9928088314464635e-8,0.0014183591944381855,-4.593096157451421e-5,3.987268351609923e-8,0.0014188124373602864,-4.5787093578951006e-5,3.975984439233655e-8,0.001419163393834719,-4.561185313227637e-5,3.9626636645945325e-8,0.0014194126920989531,-4.5462152420401115e-5,3.951386849890556e-8,0.0014195882504336435,-4.5382171232237414e-5,3.945270542300551e-8,0.0014197329253106763,-4.539256577330823e-5,3.9456983564371725e-8,0.0014198906236090039,-4.548923231726588e-5,3.952257759491028e-8,0.001420095771986858,-4.5648857684138e-5,3.963175850856077e-8,0.0014203677362581296,-4.5837385340540104e-5,3.975959325884974e-8,0.0014207096597213865,-4.601850510949015e-5,3.988016811818957e-8,0.0014211104809135435,-4.616063637726872e-5,3.9971495331700885e-8,0.0014215489510336552,-4.624177480943514e-5,4.001871904464167e-8,0.0014219986351035052,-4.6251956591088596e-5,4.0015574979438314e-8,0.0014224329376801295,-4.619339291718908e-5,3.996426457805398e-8,0.001422829353219783,-4.607871301987465e-5,3.9874120697775513e-8,0.0014231724530763103,-4.592798447099774e-5,3.9759530620922137e-8,0.0014234554326269762,-4.57652124151591e-5,3.9637548056577846e-8,0.0014236803642659415,-4.561496504861187e-5,3.952556952558051e-8,0.0014238575838519927,-4.5499512314608026e-5,3.943929979142778e-8,0.0014240046262760098,-4.543644346492547e-5,3.9390987574810174e-8,0.0014241448474782898,-4.543650107068099e-5,3.938780661528568e-8,0.0014243055769598875,-4.55014025622324e-5,3.943030334635427e-8,0.0014245153230789524,-4.562160361393435e-5,3.951093333991738e-8,0.0014247992679477627,-4.5774516750711624e-5,3.9613026810845106e-8,0.0014251725776000539,-4.592471607435623e-5,3.97111673534239e-8,0.0014256324150758487,-4.6028499832087334e-5,3.9774539919194244e-8,0.0014261519278773282,-4.604466942670059e-5,3.97745103455597e-8,0.0014266816106519023,-4.595018557846401e-5,3.9695557904295956e-8,0.0014271621257017225,-4.575388705227969e-5,3.9544859389287236e-8,0.0014275457311608392,-4.549845458283125e-5,3.935358890200528e-8,0.001427815306107102,-4.524605002091276e-5,3.916657774531871e-8,0.0014279894860666584,-4.505443172790813e-5,3.9025101307670685e-8,0.001428111845943068,-4.4957151971777735e-5,3.895259664595886e-8,0.0014282324457039898,-4.4956997998443266e-5,3.8950037799349965e-8,0.0014283921152246375,-4.5031813061035744e-5,3.9000405529012745e-8,0.001428614503799861,-4.514594302658012e-5,3.907728510090153e-8,0.0014289052039444517,-4.526123102336767e-5,3.915303573565249e-8,0.0014292549887714064,-4.5344780633131716e-5,3.9204408290150735e-8,0.0014296445351593818,-4.537328317671618e-5,3.921546485399938e-8,0.0014300491927835234,-4.533479827914965e-5,3.917854634066426e-8,0.0014304433224275918,-4.522881772940035e-5,3.909403114722347e-8,0.001430804033341362,-4.5065037434135e-5,3.896929881664266e-8,0.001431114134170649,-4.486114602985143e-5,3.8817147411994384e-8,0.001431364173594574,-4.463995090524377e-5,3.8653843304944497e-8,0.001431553477665542,-4.4426110315797016e-5,3.8496905092415785e-8,0.0014316900992935974,-4.4242818950062476e-5,3.8362786478080485e-8,0.0014317897941557708,-4.410886020323244e-5,3.8264727869013804e-8,0.0014318743099349634,-4.403620954390451e-5,3.8210949087253464e-8,0.0014319691565770345,-4.402814004867514e-5,3.8203232744223565e-8,0.0014321008288139233,-4.407781633250867e-5,3.823596615193787e-8,0.0014322933132242908,-4.4167493057523215e-5,3.829575167824442e-8,0.0014325635783059797,-4.426874231918825e-5,3.8361828243839776e-8,0.0014329159984174987,-4.4344806916418694e-5,3.8407962919808685e-8,0.0014333367610415697,-4.435666435111393e-5,3.840682171688473e-8,0.0014337910720800594,-4.4273697098380086e-5,3.833742616530986e-8,0.0014342273731959762,-4.408716016137151e-5,3.819450047412489e-8,0.0014345914434781843,-4.382020957560829e-5,3.79954130449742e-8,0.0014348470970175808,-4.352582193219588e-5,3.7778581483576264e-8,0.0014349925697684392,-4.326902649537983e-5,3.759070188014273e-8,0.0014350613489107376,-4.3101343714786775e-5,3.746837044387351e-8,0.0014351064354383872,-4.304237393549526e-5,3.74248666578265e-8,0.0014351786308693037,-4.3077895175319485e-5,3.744893988723652e-8,0.001435311120145527,-4.3171511316731736e-5,3.751349253798805e-8,0.001435514983638263,-4.3280124103506245e-5,3.7587031889058094e-8,0.0014357827442222175,-4.33657644870084e-5,3.764234602726513e-8,0.0014360950176135047,-4.340168328161423e-5,3.766080981694061e-8,0.0014364268982985113,-4.3373918763642415e-5,3.7633249662091946e-8,0.0014367527843651797,-4.328039694830718e-5,3.755898187846603e-8,0.0014370497401466067,-4.312909776010434e-5,3.7444270646673757e-8,0.0014372999251545048,-4.29358844997081e-5,3.730070931627148e-8,0.0014374923724849156,-4.2722063680720855e-5,3.71435536648068e-8,0.0014376241618117747,-4.251167408721932e-5,3.6989920136254e-8,0.0014377009262072043,-4.2328490779715396e-5,3.6856738666764285e-8,0.0014377364788064743,-4.2192837572660376e-5,3.675846863045126e-8,0.0014377513692969844,-4.2118585485798534e-5,3.6704856042820815e-8,0.001437770451447845,-4.2110786884528316e-5,3.669912913273134e-8,0.0014378196981251372,-4.21642244916051e-5,3.6736925449717485e-8,0.0014379224790505686,-4.226308798281828e-5,3.680616377621557e-8,0.0014380955334853483,-4.238200534606743e-5,3.6888012155040675e-8,0.0014383449114242503,-4.2488670304332985e-5,3.6959034935254815e-8,0.0014386623333420816,-4.254848883471872e-5,3.69946922542799e-8,0.001439023053413255,-4.253172746547254e-5,3.6974437223496824e-8,0.00143938722951177,-4.242284653717159e-5,3.688818009449981e-8,0.001439707137154768,-4.222971419566938e-5,3.674257304428873e-8,0.0014399409659193428,-4.198781671588203e-5,3.656376280190634e-8,0.001440069459918548,-4.1753765044836575e-5,3.6392606119182155e-8,0.001440106597622063,-4.158679104094984e-5,3.6271381464065536e-8,0.0014400959148385573,-4.1525832600832144e-5,3.622739349459521e-8,0.0014400927711180566,-4.15752438414865e-5,3.626283531393904e-8,0.0014401429180055368,-4.170699406909172e-5,3.635659541946491e-8,0.0014402691460889587,-4.1875615871244114e-5,3.6475292110604114e-8,0.0014404700687453444,-4.20353985030447e-5,3.658586574851633e-8,0.0014407270427852904,-4.215187194132588e-5,3.666388371140973e-8,0.001441013130719309,-4.220595818615349e-5,3.6696359973947585e-8,0.0014413003263376396,-4.219308157288958e-5,3.6680826446642095e-8,0.001441564033217401,-4.212012924590863e-5,3.662287749152233e-8,0.0014417853809006085,-4.2002181831792545e-5,3.653368462176073e-8,0.0014419523959797523,-4.185969337729201e-5,3.642799751790315e-8,0.0014420606999227586,-4.171600435622608e-5,3.632248964966348e-8,0.0014421139198980406,-4.159487387718513e-5,3.623411674528073e-8,0.0014421237028206181,-4.151777055500738e-5,3.6178218018737015e-8,0.0014421089934266833,-4.150085444996026e-5,3.6166287820635e-8,0.0014420941576250958,-4.155198804294638e-5,3.620370937664565e-8,0.0014421057972856064,-4.166845338362705e-5,3.628802792965738e-8,0.0014421685219863218,-4.183607922736202e-5,3.6408352528175015e-8,0.0014423002757643633,-4.203032172674412e-5,3.65463031098458e-8,0.0014425080608542666,-4.22195472333642e-5,3.667862994977846e-8,0.001442784991572208,-4.237031728117714e-5,3.6781252110025435e-8,0.0014431095090614871,-4.245409762385614e-5,3.6834180674033206e-8,0.0014434474962299161,-4.245454297942441e-5,3.682664986919906e-8,0.0014437579597159325,-4.237398291446551e-5,3.676149381934002e-8,0.0014440024218877274,-4.2236870836770005e-5,3.665727124065034e-8,0.0014441566692500326,-4.208735480065546e-5,3.654623465415403e-8,0.0014442210777839057,-4.197894413823149e-5,3.646678154580181e-8,0.0014442238639085503,-4.1957657259825583e-5,3.6451395741224957e-8,0.001444213177633174,-4.204514955028633e-5,3.6514704020701185e-8,0.0014442400148779796,-4.2230738483301597e-5,3.664799820937176e-8,0.001444340327612597,-4.2477002171248194e-5,3.6823531208232587E-08,0.0014445252831045401,-4.273521305190709e-5,3.700583739358809e-8,0.001444782633063003,-4.296167146369278e-5,3.716358146341754e-8,0.0014450854085491184,-4.312785702347721e-5,3.727679374827056e-8,0.001445401951167018,-4.322288651739154e-5,3.733842340885731e-8,0.001445703365975638,-4.3250813436262515e-5,3.735212787958807e-8,0.0014459674945798882,-4.32260760357198e-5,3.73288004390637e-8,0.001446180300220262,-4.316923443732345e-5,3.728344873718978e-8,0.0014463359582635035,-4.310370309668452e-5,3.723292189167686e-8,0.0014464365687389773,-4.305328850624032e-5,3.719426687269874e-8,0.0014464918465855834,-4.304002473972689e-5,3.718325365119318e-8,0.0014465186728166825,-4.308181819575483e-5,3.721266618215463e-8,0.0014465400355141305,-4.3189687170519945e-5,3.7290221487352145e-8,0.0014465827531187007,-4.336489798552785e-5,3.741640893771544e-8,0.0014466736056468219,-4.3596841039752464e-5,3.758294229173246e-8,0.0014468340922974643,-4.386279199894946e-5,3.77726972029659e-8,0.0014470748301542683,-4.413057535440872e-5,3.7961848327240886e-8,0.0014473912922101449,-4.4364408720834884e-5,3.812432810558878e-8,0.0014477626657607462,-4.453297875666711e-5,3.8237820661230854e-8,0.001448154854433801,-4.461771816489685e-5,3.828974037644961e-8,0.0014485274030723117,-4.461890202134063e-5,3.8281447589952853e-8,0.0014488429638407447,-4.455758179245559e-5,3.822931479912126e-8,0.001449077126957026,-4.447225398864734e-5,3.816195570741389e-8,0.001449226023125882,-4.441032020245069e-5,3.8113794316332475e-8,0.0014493090755652274,-4.441579020404974e-5,3.8116125833806295e-8,0.001449364947092221,-4.451633994090186e-5,3.818794133287042e-8,0.0014494407057380814,-4.471426477041007e-5,3.832972073058778e-8,0.0014495774144823556,-4.498555350055323e-5,3.8523117853081915e-8,0.0014497978450341655,-4.5288121537755064e-5,3.873716648698755e-8,0.001450101396289851,-4.557563857325436e-5,3.89383696430426e-8,0.0014504674700356046,-4.581077178440381e-5,3.9100206897818924e-8,0.001450864329811925,-4.59729347684755e-5,3.920855010190983e-8,0.001451258767715561,-4.605934108050844e-5,3.92621859121156e-8,0.001451623153623208,-4.608136827590191e-5,3.926997648012008e-8,0.0014519388956488832,-4.605924560935e-5,3.9246910208725725e-8,0.0014521971379447417,-4.6017229535460886e-5,3.9210629613232204e-8,0.0014523980389310705,-4.5980057149587095e-5,3.917896492879653e-8,0.0014525496603379358,-4.597051953376308e-5,3.9168276920308264e-8,0.0014526669574361673,-4.600759430739576e-5,3.9192135619664394e-8,0.0014527708281076104,-4.610453020282936e-5,3.9259884840940946e-8,0.0014528867245701964,-4.626654176388048e-5,3.9374895639106777e-8,0.0014530421048613528,-4.648831416903428e-5,3.9532731387203335e-8,0.0014532621468013511,-4.6752190201937326e-5,3.971990995005398e-8,0.0014535637916342824,-4.7028515568426274e-5,3.9914326393312656e-8,0.0014539493947660874,-4.727971460801391e-5,4.008841173852169e-8,0.0014544025921314587,-4.7468597955633217e-5,4.021531201044032e-8,0.0014548892922685616,-4.7569142347220584e-5,4.027675511472258e-8,0.0014553650558184153,-4.7575810436338764e-5,4.026972977663235e-8,0.0014557870851216873,-4.750717265528638e-5,4.020889782847651e-8,0.0014561265502366723,-4.7401772022354576e-5,4.012327246018735e-8,0.0014563767220609832,-4.730757137609055e-5,4.004821937536077e-8,0.00145655435776092,-4.726880621379515e-5,4.001569186801683e-8,0.001456694463586125,-4.73144514864003e-5,4.004587627083997e-8,0.0014568404770532691,-4.7451327393656046e-5,4.0142460997834714e-8,0.0014570327641523222,-4.7663290283813975e-5,4.029246947753112e-8,0.001457298519145466,-4.7916441311999795e-5,4.047043105356473e-8,0.0014576457793189451,-4.816871716330359e-5,4.064555627563837e-8,0.0014580630692166065,-4.8380870254886153e-5,4.07896946312839e-8,0.0014585242916217804,-4.85254475628263e-5,4.0883660976549706e-8,0.0014589966823086494,-4.859135992178545e-5,4.092028278391199e-8,0.0014594488895383127,-4.8583561201735886e-5,4.0903922552317477e-8,0.0014598568660654338,-4.851917902858856e-5,4.084752107398645e-8,0.001460206718017994,-4.8422238333548e-5,4.0768741953613706e-8,0.0014604949812930131,-4.831876578154884e-5,4.068648768877478e-8,0.0014607274013576004,-4.823314160900414e-5,4.0618350180221016e-8,0.0014609172150457537,-4.8185712318530414e-5,4.057893429465176e-8,0.001461083502746424,-4.8191179258434105E-05,4.0578670798416085e-8,0.001461249671904525,-4.82571706133708e-5,4.0622715345642995e-8,0.001461441693727446,-4.838261929000545e-5,4.07097296081658e-8,0.0014616854233344243,-4.8556014057686534e-5,4.083066061163576e-8,0.0014620023267894015,-4.8754249269082786e-5,4.0968058990523775e-8,0.0014624034953483796,-4.894358809285292e-5,4.109698020827211e-8,0.0014628831941533296,-4.908464338861261e-5,4.118875936509696e-8,0.0014634150433660768,-4.914226299762998e-5,4.121824393937142e-8,0.0014639548020531532,-4.9098224861191336e-5,4.117296927439143e-8,0.001464451637979818,-4.8961091183785824e-5,4.106020733296679e-8,0.0014648646915946838,-4.8766820370606e-5,4.090722801199529e-8,0.0014651772883869003,-4.8568009313809076e-5,4.075319349404685e-8,0.0014654017214941388,-4.8416426777365386e-5,4.063612262558724e-8,0.0014655731149098806,-4.834715390556542e-5,4.05811408271586e-8,0.0014657366598345033,-4.8370472978448067e-5,4.0594648027202523e-8,0.0014659342958094506,-4.847253437725393e-5,4.066516335293664e-8,0.0014661950114605521,-4.862215666828612e-5,4.076876008564538e-8,0.0014665301910791108,-4.8780249807602064e-5,4.0876316291687736e-8,0.0014669336173157724,-4.8909088442915184e-5,4.096041061837196e-8,0.0014673849869394323,-4.89797010783182e-5,4.10005813588427e-8,0.0014678556191269404,-4.8976435201010984e-5,4.0986359543432826e-8,0.0014683149714162325,-4.889830880085964e-5,4.091793502517985e-8,0.0014687365529222206,-4.875735290426732e-5,4.080472681276175e-8,0.0014691021142846357,-4.857481423921316e-5,4.0662543710692137e-8,0.0014694036337962362,-4.8376450354823765e-5,4.0510213167388694e-8,0.0014696432745798936,-4.8188046898087444e-5,4.0366429937764576e-8,0.0014698319277800106,-4.803190530328035e-5,4.0247286006004545e-8,0.0014699871102827962,-4.7924526915939426e-5,4.0164595796703556e-8,0.0014701307848855516,-4.787522027490336e-5,4.012482396092963e-8,0.0014702872622128149,-4.788517195205734e-5,4.012834089633514e-8,0.0014704809975428358,-4.794666693736669e-5,4.0168855709075365e-8,0.0014707338344027386,-4.804244009905834e-5,4.0233062784634995e-8,0.0014710611213139102,-4.814566107532364e-5,4.030084085232558e-8,0.0014714665413726273,-4.822181569590968e-5,4.034683134470572e-8,0.001471936732554558,-4.823419676772928e-5,4.0344537351810816e-8,0.0014724385787785134,-4.815393883152968e-5,4.02735824939934e-8,0.0014729232921461939,-4.7972708991935915e-5,4.012881131104992e-8,0.001473339733380658,-4.771194684085152e-5,3.99268721108642e-8,0.0014736534482333627,-4.7420811459529796e-5,3.97045678271898e-8,0.0014738614631978186,-4.716016424666695e-5,3.9506949528936975e-8,0.0014739933492919856,-4.697982067329245e-5,3.937043540172194e-8,0.0014740979744279096,-4.690167112469379e-5,3.931032980142313e-8,0.0014742246024554207,-4.691644256644111e-5,3.9318604552850936e-8,0.0014744082651071803,-4.69922299640802e-5,3.9370563974310175e-8,0.0014746637140043946,-4.708756851895923e-5,3.943489870131204e-8,0.0014749866046875014,-4.7162958123676244e-5,3.948243157993727e-8,0.001475358543065385,-4.71883294842356e-5,3.949159654624633e-8,0.001475753210166725,-4.714652817698946e-5,3.945074236392933e-8,0.001476142078096254,-4.7033888847950614e-5,3.9358189832320374e-8,0.0014764992123982724,-4.685887934392134e-5,3.9220928510260014e-8,0.0014768049713061416,-4.663938791887539e-5,3.905248086942313e-8,0.001477048391317066,-4.639911917690382e-5,3.8870289051615004e-8,0.0014772281442441146,-4.61636413222774e-5,3.86929540003015e-8,0.0014773521218631534,-4.595660324837137e-5,3.8537604231317574e-8,0.0014774358574483667,-4.579659133441228e-5,3.841765492707048e-8,0.0014775001956065402,-4.569496823083304e-5,3.8341186816552856e-8,0.0014775686820781154,-4.565470129067433e-5,3.830999686167372e-8,0.0014776649243166784,-4.566994456347111e-5,3.8319233095593914e-8,0.0014778099359220231,-4.5726192560117234e-5,3.83575570353092e-8,0.0014780193244124584,-4.580097117160524e-5,3.840782891730723e-8,0.0014783000450939625,-4.5865328797617776e-5,3.8448445201550915e-8,0.0014786467079729625,-4.588696439857752e-5,3.845582251437362e-8,0.0014790384080720245,-4.583611242343526e-5,3.840873944588172e-8,0.0014794383527260398,-4.56945594107753e-5,3.82947864626867e-8,0.001479799398450005,-4.5465999161076066e-5,3.811769435150879e-8,0.0014800774121277783,-4.518250806512075e-5,3.790185132520664e-8,0.0014802492942168032,-4.489995809258601e-5,3.768879845012064e-8,0.0014803258879004637,-4.467961171000656e-5,3.7523621216932424e-8,0.0014803496588216847,-4.456364916372832e-5,3.7436882425543227E-08,0.0014803767789849922,-4.455914717389837e-5,3.743285124826617e-8,0.00148045471663273,-4.463944669785187e-5,3.749072374826842e-8,0.0014806079903739232,-4.4759080332929866e-5,3.757599995374444e-8,0.0014808363575325631,-4.4871298219932226e-5,3.7653765328709984e-8,0.0014811213748755097,-4.49400791113898e-5,3.7697698950566665e-8,0.0014814353063795221,-4.494494148911797e-5,3.769349125262831e-8,0.0014817486607833878,-4.488064489949951e-5,3.7638296039217246e-8,0.0014820352591590176,-4.475444899156155e-5,3.75383511170801e-8,0.001482275222988769,-4.458271568201399e-5,3.740624045556785e-8,0.0014824566343186552,-4.438752806725547e-5,3.7258364186440963e-8,0.0014825762933425046,-4.41933973514123e-5,3.711263205430016e-8,0.0014826396781233982,-4.402407385189993e-5,3.698628868785702e-8,0.0014826601038704105,-4.3899537486014864e-5,3.689381745950238e-8,0.0014826570290835308,-4.3833355408042506e-5,3.684500249109746e-8,0.0014826535665252642,-4.383076384824262e-5,3.684342893133268e-8,0.0014826734964349505,-4.388776027353641e-5,3.688571137475423e-8,0.0014827381250709867,-4.3991250197185465e-5,3.696157870415823e-8,0.0014828632277558774,-4.4120225732295084e-5,3.7054853705114773e-8,0.0014830562790585913,-4.424796254416029e-5,3.7145299091021524e-8,0.001483314114902658,-4.4345226853738956e-5,3.721123064884487e-8,0.0014836212427355765,-4.438471351759688e-5,3.723292906691934e-8,0.0014839495880320053,-4.434704884177869e-5,3.719700534277648e-8,0.0014842612053440878,-4.4227969750309367e-5,3.7101437221589655e-8,0.001484515578411819,-4.4044706083483356e-5,3.6959930289161086e-8,0.0014846818321571568,-4.383767436946015e-5,3.6802887599284104e-8,0.001484752665298912,-4.366282494601175e-5,3.6671649941767425e-8,0.0014847523079773632,-4.357345179251354e-5,3.6605110282143873e-8,0.0014847306685902028,-4.3598461730291396e-5,3.662379044416523e-8,0.0014847439416985908,-4.372996532663204e-5,3.672084767057359e-8,0.001484832455576805,-4.392834159757466e-5,3.6866053246575335e-8,0.0014850084524969315,-4.414052139172515e-5,3.701958292803764e-8,0.0014852579225742377,-4.4319394962506785e-5,3.7146574635816525e-8,0.00148555111690797,-4.443521318072178e-5,3.7225576915926685e-8,0.0014858540251273446,-4.447773434048518e-5,3.724992857383376e-8,0.0014861364543161625,-4.445270363925244e-5,3.722482225495067e-8,0.0014863760913723298,-4.437656318307988e-5,3.716309655277369e-8,0.0014865597532513933,-4.427164451826376e-5,3.708154822513582e-8,0.0014866832683675857,-4.4162460074345484e-5,3.699824191460888e-8,0.0014867508559287582,-4.407282323694022e-5,3.693054466535894e-8,0.0014867742340000237,-4.402339782503651e-5,3.68934712540527e-8,0.0014867713714220555,-4.402943420367354e-5,3.689807422058526e-8,0.0014867646564762282,-4.409867285281513e-5,3.6949844467746125e-8,0.0014867782740302412,-4.422973621937711e-5,3.7047415402730984e-8,0.0014868348754921309,-4.441152508594255e-5,3.718204520461165e-8,0.0014869519465962582,-4.462400182095811e-5,3.733824048865543e-8,0.0014871384186216602,-4.484053098879151e-5,3.749566462993671e-8,0.0014873921480441546,-4.5031733174503954e-5,3.7632239067973675e-8,0.0014876988747097991,-4.517047600970056e-5,3.772804673560034e-8,0.0014880330851069787,-4.5237407062414714e-5,3.776948065811721e-8,0.0014883611336936045,-4.522638867386191e-5,3.7753106366925946e-8,0.0014886470419661934,-4.5148829423299135e-5,3.768853679617695e-8,0.0014888610099375744,-4.503511107630251e-5,3.75991142701746e-8,0.0014889893734640611,-4.493078727593386e-5,3.7518833390943256e-8,0.0014890426802024238,-4.4885939658503095e-5,3.74844077895564e-8,0.0014890568559620368,-4.493900359979849e-5,3.752344755667185e-8,0.0014890836459080803,-4.5101175184416406e-5,3.7643181361237684e-8,0.001489172305795643,-4.535029512050693e-5,3.7826206234394064e-8,0.0014893513815948645,-4.5639131365739326e-5,3.803685162170241e-8,0.0014896203853677792,-4.591379586939746e-5,3.8234980089391865e-8,0.0014899543663838013,-4.613185728141613e-5,3.8389462478218916e-8,0.0014903162297077394,-4.6271946349084726e-5,3.848520377485263e-8,0.0014906691385107214,-4.6333741604474694e-5,3.852289537208366e-8,0.0014909844428688587,-4.6332267253878814e-5,3.851449641139075e-8,0.0014912446994979787,-4.629096295265064e-5,3.8477884251820716e-8,0.001491443475023993,-4.623604922293549e-5,3.843262815520471e-8,0.0014915838036451312,-4.61927449105687e-5,3.8397284898482245e-8,0.0014916764513131834,-4.618284796155863e-5,3.838776175182558e-8,0.0014917383357409837,-4.622298504810592e-5,3.8416126988273096e-8,0.0014917909428913139,-4.632303584535767e-5,3.848944739748476e-8,0.0014918583550758398,-4.648458412369112e-5,3.860856466449232e-8,0.0014919645095770773,-4.669969166698596e-5,3.8767106301308565e-8,0.001492129594339425,-4.695065290037247e-5,3.895130296913219e-8,0.0014923659795207224,-4.721144655663761e-5,3.914118664687933e-8,0.0014926745732702724,-4.745133715731877e-5,3.931347861780057e-8,0.0014930428020581202,-4.764050267803905e-5,3.944599080200351e-8,0.0014934453287540244,-4.77567381989998e-5,3.952272977792478e-8,0.0014938479976421455,-4.7791615726440825e-5,3.9538419803086526e-8,0.0014942145959709434,-4.775437268653611e-5,3.950114664854367e-8,0.0014945152548361581,-4.7672147717775885e-5,3.943216537025932e-8,0.0014947347496844735,-4.758571958330954e-5,3.936237614997539e-8,0.0014948784839529095,-4.754071729882442e-5,3.9325587712150906e-8,0.001494973688060228,-4.7575580700830986e-5,3.934960606065222e-8,0.001495063893699758,-4.7709339668887554e-5,3.9447410821275483e-8,0.0014951967819727924,-4.793386974666786e-5,3.961177012530231e-8,0.0014954089548056488,-4.82150113356529e-5,3.9816407071216556e-8,0.001495713972368483,-4.8503439552528306e-5,4.0024278257678855e-8,0.0014960992299929698,-4.875088216767253e-5,4.0199671339311314e-8,0.0014965325627533485,-4.892426755697233e-5,4.031863181757441e-8,0.0014969742965597005,-4.9012244353112056e-5,4.037361715514292e-8,0.0014973887060458133,-4.90234527916337e-5,4.037196030438772e-8,0.0014977509975768778,-4.897987925534544e-5,4.033069659995429e-8,0.0014980493699429142,-4.8909370842569586e-5,4.0270872530960104e-8,0.0014982838272042372,-4.8839785143966184e-5,4.0213214367086265e-8,0.0014984636893112296,-4.879533379597899e-5,4.017552829673121e-8,0.0014986050564438516,-4.879459745805125e-5,4.0171351190536136e-8,0.0014987286878216618,-4.884940264365551e-5,4.020917276631506e-8,0.0014988581486848397,-4.8963892845157507e-5,4.029171690125393e-8,0.0014990177337836207,-4.9133541633318104e-5,4.0415144161886566e-8,0.0014992296650089489,-4.934439725353427e-5,4.056846910653133e-8,0.0014995103608385159,-4.957328780427341e-5,4.073379081419653e-8,0.0014998661313054954,-4.978992849651283e-5,4.0888033317214166E-08,0.001500289438846751,-4.996169395570395e-5,4.100670227701081e-8,0.0015007575640223773,-5.00609271009138e-5,4.1069476582698656e-8,0.0015012354183340914,-5.0073132062903215e-5,4.106633523245191e-8,0.001501682931435136,-5.000313393611321e-5,4.10020124318666e-8,0.0015020653958463235,-4.9876318236111225e-5,4.089664152349184e-8,0.001502363510762478,-4.973362668651773e-5,4.078166708635209e-8,0.0015025796036362987,-4.9621359434477365e-5,4.06919240015438e-8,0.001502737788613337,-4.957881774687852e-5,4.0656280257301776e-8,0.0015028778851812186,-4.9627518948032364e-5,4.0689710099869005e-8,0.001503044775055048,-4.9765138003926926e-5,4.078912007859041e-8,0.001503276131990282,-4.9966042084288354e-5,4.093418214974257e-8,0.0015035921340975534,-5.0188522911167886e-5,4.109307745813918e-8,0.0015039904959644906,-5.038664086853307e-5,4.12314822617478e-8,0.0015044484479765602,-5.052272450607022e-5,4.1321828260849926e-8,0.0015049305867960681,-5.057627006151882e-5,4.1349724488542334e-8,0.0015053992671028003,-5.0546698588028124e-5,4.1315734395285215e-8,0.001505823682333701,-5.0450202162379264e-5,4.123276774522326e-8,0.0015061851264551991,-5.03131376162049e-5,4.1120991139124105e-8,0.00150647810650972,-5.0164985415371416e-5,4.100254562995308e-8,0.0015067085911635734,-5.003289045076868e-5,4.0897557578942296e-8,0.0015068910568689683,-4.9938339881018866e-5,4.0821788084939146e-8,0.0015070455081733843,-4.989557017837055e-5,4.078553560863914e-8,0.0015071949768719031,-4.991095762554463e-5,4.079319265895584e-8,0.0015073634330199596,-4.998270255847455e-5,4.0842964940455486e-8,0.001507573648758257,-5.0100484272582855e-5,4.092657881678172e-8,0.001507844474226869,-5.024531275080717e-5,4.1029213145852093E-08,0.0015081872475477102,-5.039029477878423e-5,4.113020982278904e-8,0.001508601639381369,-5.0503348351200574e-5,4.1205288990591655e-8,0.0015090721800536042,-5.0552825964399286e-5,4.123090271547341e-8,0.0015095677542445187,-5.051598845732162e-5,4.119061726808571e-8,0.0015100464398749296,-5.0388137396494456e-5,4.1081869583940654e-8,0.0015104661524490966,-5.0188150732697904e-5,4.091992886992478e-8,0.0015107980562968522,-4.995626598255443e-5,4.073597315450068e-8,0.0015110369884425087,-4.974323096834382e-5,4.056865503257804e-8,0.0015112037636235288,-4.9594689096187027e-5,4.0452143784550536e-8,0.0015113382538688342,-4.9537390122333774e-5,4.040571885063075e-8,0.001511486651518908,-4.9572491390367476e-5,4.0428949376900265e-8,0.0015116882343063284,-4.9677288522526345e-5,4.0503412055625985e-8,0.001511965832908493,-4.981328246977489e-5,4.0599203239587485e-8,0.0015123218678560742,-4.993712667865752e-5,4.0683458185044255e-8,0.0015127398774388951,-5.001120491259384e-5,4.072833176366586e-8,0.0015131902459503254,-5.0011430442294444e-5,4.0716651632460574e-8,0.0015136381639806527,-4.9930908725903795e-5,4.064433406034829e-8,0.0015140516272895985,-4.977923819466192e-5,4.051953249837382e-8,0.0015144075622012096,-4.9578319631606846e-5,4.035928102066704e-8,0.0015146949683276282,-4.9356355695184494e-5,4.0184938821169755e-8,0.0015149150502128804,-4.9141887980333486e-5,4.0017799643976816e-8,0.0015150791746275875,-4.895917584109024e-5,3.9875772118617474e-8,0.0015152057997848073,-4.8825388632539786e-5,3.977139653273003e-8,0.0015153173317295856,-4.874940504486354e-5,3.971098695425316e-8,0.0015154374095433952,-4.8731643689852686e-5,3.9694467703771245e-8,0.0015155886318726306,-4.876432642304724e-5,3.971551230211538e-8,0.0015157903988936615,-4.8831866635134174e-5,3.976183295261236e-8,0.0015160564336704537,-4.891150797550089e-5,3.9815759747989534e-8,0.001516391691608481,-4.8974788479225625e-5,3.985552106330658e-8,0.0015167888924818176,-4.899079602098747e-5,3.985786664037715e-8,0.0015172258993118245,-4.893217400965164e-5,3.9802659015735863e-8,0.0015176663030841539,-4.878381729040918e-5,3.967934665594565e-8,0.0015180658418397924,-4.855185669703154e-5,3.9493549812086156e-8,0.0015183852145058741,-4.8267882631723335e-5,3.927002879151628e-8,0.001518605245428821,-4.7983227159816685E-05,3.904816418536927e-8,0.0015187364109845078,-4.7752853667001454e-5,3.8869607112691156e-8,0.0015188162107197098,-4.76157007253304e-5,3.876330623471329e-8,0.0015188951081814535,-4.7581646967552716e-5,3.87356971621642e-8,0.0015190187423242043,-4.763095682004308e-5,3.877055536279872e-8,0.0015192148843438057,-4.7724206359166875e-5,3.883693164021174e-8,0.0015194889111096335,-4.7816122036906335e-5,3.890001525702813e-8,0.0015198265573875282,-4.78675190041975e-5,3.893034461914193e-8,0.0015202006147450764,-4.785267690604367e-5,3.8909281403952436e-8,0.0015205786058022936,-4.776206764521024e-5,3.883074987792664e-8,0.001520929655959892,-4.7601511265561416e-5,3.8700210594517606e-8,0.0015212297485279174,-4.73889457227636e-5,3.853192522081979e-8,0.001521464985636384,-4.714978616986874e-5,3.834534142739313e-8,0.001521632714070136,-4.691181862109943e-5,3.8161308626593714e-8,0.0015217407259916819,-4.6700544473304215e-5,3.7998737945680615e-8,0.001521805050737679,-4.653561112622005e-5,3.7872078917049705e-8,0.0015218469609350476,-4.6428620942574455e-5,3.77897496515343e-8,0.0015218898209953303,-4.638232433864213e-5,3.7753505077697286e-8,0.0015219562588472324,-4.63908829784902e-5,3.775855431522331e-8,0.0015220657852472567,-4.644073196168358e-5,3.779415592915643e-8,0.0015222326849345393,-4.6511768353575117e-5,3.78445580321092e-8,0.0015224639302797234,-4.6578917633677744e-5,3.789033821231449e-8,0.0015227569400496383,-4.6614434070743716e-5,3.791035015751786e-8,0.0015230973823843132,-4.659163295010869e-5,3.788469386599491e-8,0.0015234580899453059,-4.6490764418833046e-5,3.779915028577375e-8,0.0015238011301948635,-4.630679101973296e-5,3.765088713532935e-8,0.0015240852672769784,-4.6056717425461094e-5,3.7453737167092474e-8,0.001524279176362041,-4.578158370729293e-5,3.723946842777562e-8,0.0015243761207970313,-4.5537893273890615e-5,3.7051147789336374e-8,0.0015244012465784203,-4.537833811089991e-5,3.692846975976653e-8,0.0015244043069810233,-4.5330485030194646e-5,3.689159982476225e-8,0.001524440051851727,-4.5386093677926136e-5,3.693319329946158e-8,0.0015245475921702796,-4.550706901455292e-5,3.70231970685862e-8,0.001524739631177373,-4.564256280847005e-5,3.712221109997426e-8,0.0015250039821238194,-4.574645320979391e-5,3.719506196713576e-8,0.001525312469978232,-4.57880724817201e-5,3.7219009823727845e-8,0.0015256311465300198,-4.575529177708597e-5,3.71858758629502e-8,0.0015259283156329572,-4.5652460184988825e-5,3.710009588757813e-8,0.001526179490549331,-4.549604863952453e-5,3.697504333756095e-8,0.0015263698298762106,-4.5309863016883735e-5,3.682918922629797e-8,0.0015264948690534665,-4.5120549024834013e-5,3.668269874859717e-8,0.0015265600057452486,-4.495356643058214e-5,3.65545436819091e-8,0.0015265789603062382,-4.4829825029204026e-5,3.646015826369734e-8,0.0015265714591917814,-4.476317621887072e-5,3.640967597256171e-8,0.001526560393019653,-4.47588814097071e-5,3.6406785222506725e-8,0.0015265687425595057,-4.481319012855167e-5,3.6448328955322366e-8,0.001526616673386339,-4.491402171639455e-5,3.6524727155707175e-8,0.001526719088838322,-4.5042478706087005e-5,3.662110821247449e-8,0.001526883671120863,-4.517492388060347e-5,3.671899335520608e-8,0.001527109357997393,-4.528556689050531e-5,3.679846629243785e-8,0.0015273852648541443,-4.5349660451110904e-5,3.684080865883039e-8,0.0015276902649918051,-4.5347572784252786e-5,3.683168213824624e-8,0.0015279940023550515,-4.5269982630066084e-5,3.676496818810432e-8,0.001528260741500139,-4.5123660491407865e-5,3.664687940483986e-8,0.0015284573649040436,-4.493568923535388e-5,3.649883068748661e-8,0.0015285651819203082,-4.475224028990135e-5,3.6356268024786054e-8,0.001528591522529057,-4.462799322930828e-5,3.6260564495138095e-8,0.0015285733068809862,-4.4606708170989893e-5,3.6244339332635135e-8,0.0015285663015500417,-4.4701580903939586e-5,3.631667920617675e-8,0.001528623057978843,-4.4888075568297965e-5,3.645788182105769e-8,0.0015287721301055885,-4.511488889181742e-5,3.662804240559266e-8,0.0015290104785997134,-4.532567197125326e-5,3.678385405657058e-8,0.0015293104382067145,-4.547810886081325e-5,3.689331286542308e-8,0.0015296334898081117,-4.555238252513215e-5,3.6942127930790746e-8,0.0015299425822774475,-4.5549875508693376e-5,3.6932458321921016e-8,0.0015302094618059117,-4.5487012585997464e-5,3.687784149123152e-8,0.0015304173593234294,-4.538838777224406e-5,3.6797650641900755e-8,0.0015305608012845585,-4.5281191160702335e-5,3.6712741731269536e-8,0.0015306441945146152,-4.5191250244956506e-5,3.664253537729438e-8,0.0015306800306723414,-4.514019365633332e-5,3.660306514411148e-8,0.0015306868440561443,-4.5143317412885504e-5,3.660554118454364e-8,0.0015306868688130097,-4.5208046874071456e-5,3.665525950628058e-8,0.001530703372269813,-4.533304361844633e-5,3.675088279926432e-8,0.0015307577071024677,-4.550816475509205e-5,3.6884311766138235e-8,0.0015308663545292767,-4.5715530714938635e-5,3.7041438425744794e-8,0.001531038403461839,-4.5931705831679506e-5,3.7203859056823594e-8,0.0015312738096312358,-4.613076201647923e-5,3.7351380006003594e-8,0.001531562647587085,-4.628797631784266e-5,3.7465058196804165e-8,0.001531885540287841,-4.638388948223532e-5,3.753045447184219e-8,0.0015322154350115606,-4.6408424099129384e-5,3.75407624833672e-8,0.0015325210181051422,-4.636473481435046e-5,3.749952617090675e-8,0.0015327722562987192,-4.62720299113284e-5,3.742243109933671e-8,0.0015329482178092664,-4.616568661040811e-5,3.7337038635539955e-8,0.0015330459667584296,-4.60922941785365e-5,3.7278814888025735e-8,0.001533087023241133,-4.609795126881395e-5,3.728225619249699e-8,0.001533115983708838,-4.621153374983078e-5,3.736837190134323e-8,0.0015331876400693626,-4.643018459294151e-5,3.753391652633899e-8,0.0015333461088477486,-4.6716886718747485e-5,3.7749779963297116e-8,0.001533607077938741,-4.701413330082583e-5,3.797158062251958e-8,0.0015339536898771556,-4.7266463413301e-5,3.8156979046495933e-8,0.0015343469210881689,-4.7438804933053115e-5,3.827972461061156e-8,0.0015347420400233514,-4.7522609577066365e-5,3.833423468532848e-8,0.0015351018922789568,-4.75311913550837e-5,3.833175719045527e-8,0.0015354032268769953,-4.7490536847499134e-5,3.8293014468682244e-8,0.0015356372503282487,-4.7430749661384474e-5,3.8241437080403724e-8,0.0015358072060457936,-4.738020854009638e-5,3.819867181103716e-8,0.0015359252275494756,-4.736231090740194e-5,3.818223813016995e-8,0.0015360095332831896,-4.739380510817324e-5,3.820445815928393e-8,0.0015360820478136717,-4.748383499571379e-5,3.82718722773441e-8,0.001536166141831675,-4.763330834665019e-5,3.838478548063725e-8,0.001536284194639195,-4.783458629340891e-5,3.8536969464764897e-8,0.0015364548174580863,-4.8071792138992605e-5,3.871582755825761e-8,0.001536689888308331,-4.832221693893701e-5,3.890347256035087e-8,0.001536991949021952,-4.8559125680806725e-5,3.907898810591917e-8,0.0015373526882001662,-4.875585201501901e-5,3.9221757056841037E-08,0.0015377531409755225,-4.889068042494506e-5,3.931538272353313e-8,0.0015381659828674545,-4.895167436888976e-5,3.9351451406966635e-8,0.0015385598715198048,-4.894040830492917e-5,3.9332267184161023e-8,0.0015389053503828088,-4.887366805568127e-5,3.927184980018389e-8,0.0015391815674583567,-4.878238533919379e-5,3.919473310592367e-8,0.0015393827610044833,-4.870713902780217e-5,3.913220935194622e-8,0.001539522826925547,-4.868983638924286e-5,3.911586463438951e-8,0.001539635551012186,-4.8762258491063296e-5,3.916897922140672e-8,0.0015397681169518995,-4.893424373568861e-5,3.929783969200081e-8,0.0015399675307219867,-4.9186670824232385e-5,3.9486747633733346e-8,0.0015402639575685848,-4.94746582698892e-5,3.970072063670472e-8,0.001540658896768355,-4.974203898215638e-5,3.989665648604e-8,0.0015411250260262703,-4.9940960584229624e-5,4.0038309783718896e-8,0.0015416177088270302,-5.0046684404287795e-5,4.010752915400204e-8,0.0015420911707916128,-5.006124568783706e-5,4.010688682435594e-8,0.0015425111740769344,-5.000709715400226e-5,4.00545534176231e-8,0.0015428603593231258,-4.9916572907574924e-5,3.9975967592465016e-8,0.001543137348004615,-4.9822560505639655e-5,3.9896549730067413e-8,0.0015433527728847896,-4.9752685894152456e-5,3.983728353617607e-8,0.0015435248853113634,-4.972672630231794e-5,3.981289716560943e-8,0.0015436759860362377,-4.975595477250484e-5,3.9831537088095255e-8,0.0015438297952060482,-4.984325147671539e-5,3.989494979643839e-8,0.0015440093369692496,-4.998334813656624e-5,3.999866380557658e-8,0.0015442348151259754,-5.016309804535865e-5,4.013214246585282e-8,0.0015445211154071746,-5.0362121259628284e-5,4.027925529887606e-8,0.0015448749611662643,-5.055446980018576e-5,4.0419618992163206e-8,0.0015452923005028491,-5.071189862384606e-5,4.053125674762409e-8,0.0015457569800726891,-5.0808855828295383E-05,4.059460327889975e-8,0.0015462418900000286,-5.082850879931722e-5,4.059724221672877e-8,0.0015467132993301472,-5.076823346637892e-5,4.0538094268894254e-8,0.0015471380038922773,-5.064252614673594e-5,4.042945683138028e-8,0.0015474916360774626,-5.048174585710053e-5,4.0295709244955134e-8,0.0015477657624747324,-5.0326348408581844e-5,4.016852598729084e-8,0.0015479715584376128,-5.02176988612463e-5,4.00795759607021e-8,0.001548138675163666,-5.018759931395581e-5,4.0052468864238434e-8,0.001548309019173918,-5.0249167170106635e-5,4.0095999848332944e-8,0.001548526363415651,-5.039173011559901e-5,4.020064552392213e-8,0.001548824072026234,-5.0581979693915296e-5,4.033985817256759e-8,0.0015492146318262102,-5.0772290610955474e-5,4.047669746431854e-8,0.0015496851936439822,-5.091443598787875e-5,4.057438892398452e-8,0.001550201601146154,-5.0973893683465014e-5,4.0607169310144533e-8,0.001550719547427848,-5.093895551994056e-5,4.0567056747315524e-8,0.0015511979549022272,-5.082132789363123e-5,4.0464060310906736e-8,0.001551609085796503,-5.064930767517722e-5,4.032070429909841e-8,0.001551942485882253,-5.045777032215602e-5,4.0164179972009266e-8,0.001552203365741154,-5.027932903282667e-5,4.0019527762343134e-8,0.0015524080338778475,-5.0138911795649996e-5,3.990557662144009e-8,0.0015525789206599471,-5.005169954767954e-5,3.983352487266917e-8,0.0015527405622942454,-5.0023207216840704e-5,3.980713258549693e-8,0.001552916795278977,-5.005024771803662e-5,3.982350168918181e-8,0.0015531287739189376,-5.012197934084325e-5,3.987384769919168e-8,0.0015533932025365111,-5.022080731770897e-5,3.99441559610026e-8,0.0015537202826231122,-5.03234457482546e-5,4.0016025565273536e-8,0.0015541112665716941,-5.0402810390084915e-5,4.0068239562396716e-8,0.0015545561079804125,-5.0431489448755314e-5,4.007959506236113e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json new file mode 100644 index 0000000..c6ac961 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":15000,"numberOfSamples":1000,"samples":[0.001555032396790159,-5.038717964716439e-5,4.003321453737454e-8,0.001555507240340409,-5.025945257220019e-5,3.992178064606655e-8,0.0015559433318249748,-5.005568561411016e-5,3.975199831316558e-8,0.0015563086828940746,-4.9802949292686764e-5,3.9545822083813816e-8,0.001556587031841404,-4.9543375923704664e-5,3.9336583092513e-8,0.0015567845028372617,-4.93232976794034e-5,3.9160317297773175e-8,0.0015569291408115862,-4.9179757456819175e-5,3.904518941710335e-8,0.0015570631279621951,-4.912957061070448e-5,3.90031151041951e-8,0.0015572306984882043,-4.916483994647903e-5,3.902661169621281e-8,0.0015574660511056152,-4.9255840502179806e-5,3.9091477245714126e-8,0.0015577847760354089,-4.9359606772293576e-5,3.9163823082464017e-8,0.001558180685115808,-4.943135773630568e-5,3.920908834205859e-8,0.0015586283968716341,-4.943566203060656e-5,3.920059314584998e-8,0.0015590906701226305,-4.9354497209498185e-5,3.9125494924869697e-8,0.001559528261058972,-4.919020584318819e-5,3.8986728207848124e-8,0.0015599093591160292,-4.896289913685733e-5,3.880070214408021e-8,0.0015602159244718476,-4.870367300374791e-5,3.8591890031225615e-8,0.001560445583043622,-4.844627081761637e-5,3.838637217885279e-8,0.0015606095190522666,-4.821988699048854e-5,3.8206389463064e-8,0.001560728059333107,-4.80447105719932e-5,3.8067072967328046e-8,0.0015608258215469178,-4.7930366808124216e-5,3.797538689472998e-8,0.0015609276655558022,-4.787644642721989e-5,3.793059714039383e-8,0.0015610558505919753,-4.7874043041353836e-5,3.792543115973339e-8,0.0015612281647851558,-4.7907464781617856e-5,3.794734148986789e-8,0.0015614564996265033,-4.795579391508165e-5,3.797969902153523e-8,0.0015617453775785114,-4.7994480662788104e-5,3.8003106795686565e-8,0.001562090231917282,-4.799751763502489e-5,3.7997236526191586e-8,0.0015624757732016965,-4.7940913074933274e-5,3.7943666553683704e-8,0.0015628755385377238,-4.780797264952134e-5,3.783002608138753e-8,0.0015632543909054244,-4.759591895225801e-5,3.765503864336205e-8,0.0015635755508337965,-4.7321569326116703e-5,3.743272490582087e-8,0.0015638118247210714,-4.702212301492192e-5,3.719276938020053e-8,0.0015639572183669657,-4.674759666086147e-5,3.697442350326965e-8,0.0015640325431972783,-4.654548661616456e-5,3.681443353406246e-8,0.0015640803149591668,-4.644389332460276e-5,3.673389012822279e-8,0.0015641503210691414,-4.644165242496307e-5,3.673070606589074e-8,0.0015642829369577056,-4.651013021168292e-5,3.678135043023996e-8,0.0015644977495392904,-4.660446073429612e-5,3.685000664095114e-8,0.001564790749643378,-4.6677917336542896e-5,3.6900071652951433e-8,0.001565138707406003,-4.66938238368795e-5,3.690350083708066e-8,0.0015655073435626183,-4.663241657433939e-5,3.6845954665167155e-8,0.0015658602190323327,-4.649255514773499e-5,3.672776169544263e-8,0.0015661663607259592,-4.628936931980565e-5,3.656170224679889e-8,0.0015664055799049252,-4.6049225283354464e-5,3.636883604376693e-8,0.001566571002171141,-4.580336936715299e-5,3.6173502381504967e-8,0.0015666687673390187,-4.558160277952096e-5,3.599852488215996e-8,0.0015667154033415197,-4.5407215387777025e-5,3.586148463513818e-8,0.0015667338355941623,-4.529393320932333e-5,3.577253994149994e-8,0.0015667490993197454,-4.524500274399756e-5,3.573380667359368e-8,0.0015667846174289822,-4.5254024907903564e-5,3.57399848967389e-8,0.001566859497029681,-4.5306834496840176e-5,3.5779734964378544e-8,0.0015669868024443458,-4.5383715412729446e-5,3.583733887760147e-8,0.001567172455798627,-4.546158479647085e-5,3.5894430294282084e-8,0.0015674144103284765,-4.551618411695069e-5,3.593183701499408e-8,0.001567701899164982,-4.5524599621765035e-5,3.593172347162997e-8,0.0015680149455750063,-4.5468646452923546e-5,3.588034316011282e-8,0.001568325023881159,-4.533952995396979e-5,3.577163595791014e-8,0.001568598375261144,-4.514331996072684e-5,3.561129614715066e-8,0.0015688033307539359,-4.490516831986402e-5,3.5419775786897466e-8,0.0015689213635770478,-4.4668520678280764e-5,3.5231422956829793e-8,0.0015689580930293371,-4.448560774152507e-5,3.508694038347068e-8,0.001568947072838441,-4.439966029933874e-5,3.501951652065551e-8,0.0015689406813127415,-4.442653532989222e-5,3.5040594280255434e-8,0.0015689905208410501,-4.454694343553021e-5,3.5134005465375e-8,0.0015691279470960945,-4.471462114836585e-5,3.526264408522862e-8,0.001569355167197491,-4.4874982251366504e-5,3.5383351783517066e-8,0.0015696491590304815,-4.498328840192346e-5,3.5461324901144965e-8,0.0015699730086184231,-4.5014843868502684e-5,3.547806086334234e-8,0.0015702878466824224,-4.496644962533722e-5,3.5432227789964445e-8,0.0015705615045717492,-4.48522455988792e-5,3.5336015448358164e-8,0.0015707731361774711,-4.469737825179658e-5,3.520983386424041e-8,0.0015709146371371892,-4.453167337270511e-5,3.507720338549927e-8,0.0015709899450492496,-4.4384204168804375e-5,3.4960569188722246e-8,0.0015710129446352492,-4.427899769327988e-5,3.487815813513884e-8,0.0015710044338982897,-4.4232035758685976e-5,3.484187409746818e-8,0.0015709885901114629,-4.424966839076787e-5,3.48562113954969e-8,0.0015709893763831153,-4.4328433769242266e-5,3.491813422291662e-8,0.0015710273252120134,-4.4456174728882454e-5,3.501786728147512e-8,0.001571117095259444,-4.4614146603934006e-5,3.514044529398255e-8,0.0015712659471281585,-4.4779625550250765e-5,3.526772890807883e-8,0.0015714729990209998,-4.492865339998087e-5,3.5380643711257126e-8,0.0015717290886569444,-4.503882672267935e-5,3.5461540303863484e-8,0.0015720171486412,-4.509218250304847e-5,3.549662088853352e-8,0.0015723131710548195,-4.507838065681111e-5,3.547847663955526e-8,0.0015725883317389549,-4.499835421555663e-5,3.540880348366659e-8,0.001572813307826608,-4.486786800809496e-5,3.5300892636416496e-8,0.0015729655070056204,-4.47191603474519e-5,3.518058646081875e-8,0.0015730384980441499,-4.459776227937817e-5,3.5083578249073555e-8,0.0015730502214990328,-4.4551776967474605e-5,3.504702004926623e-8,0.0015730436787471955,-4.461436338745037e-5,3.5095992048822466e-8,0.0015730749295945277,-4.478695231412046e-5,3.5230609633398364e-8,0.00157319126570817,-4.5034672737442647e-5,3.542266299781257e-8,0.0015734115792861226,-4.529940702276995e-5,3.562602881073632e-8,0.0015737208148722149,-4.552319788898638e-5,3.5795178558746185e-8,0.0015740799139331147,-4.5667994072365434e-5,3.590075376760617e-8,0.0015744426094396393,-4.572297761098429e-5,3.593523410445762e-8,0.0015747694654922382,-4.570060260613509e-5,3.5909545233455296e-8,0.0015750350883362262,-4.56275210357777e-5,3.584556214181634e-8,0.0015752294134122743,-4.5535604842148e-5,3.576877953266378e-8,0.0015753556604648073,-4.545534529408837e-5,3.5703062165524755e-8,0.0015754271119554817,-4.541175214597163e-5,3.566756900441209e-8,0.0015754637850900197,-4.5422021566715475e-5,3.567516845886349e-8,0.0015754892419881964,-4.549435685857388e-5,3.5731726192643936e-8,0.0015755275323007985,-4.562767745693644e-5,3.5835969133508226e-8,0.0015756002822981585,-4.581213815904196e-5,3.597985887669808e-8,0.0015757240290649212,-4.603051129355547e-5,3.6149580268519345e-8,0.0015759080778055216,-4.626046736804536e-5,3.632726928230143e-8,0.0015761532032229398,-4.6477532670966515e-5,3.6493374497356665e-8,0.0015764513190264005,-4.66583682351069e-5,3.662937540080888e-8,0.0015767861221216862,-4.6784116146357104e-5,3.67205887315865e-8,0.0015771347357232419,-4.6843579857850895e-5,3.6758772560147956e-8,0.0015774703483009739,-4.683599304438294e-5,3.67442426941251e-8,0.0015777659552356682,-4.677317302149219e-5,3.66873186351272e-8,0.0015779995237324785,-4.668049190430199e-5,3.660873387655922e-8,0.0015781605555831091,-4.659528839149842e-5,3.6538079166891776e-8,0.0015782567852510353,-4.656091594072024e-5,3.650901070819981e-8,0.0015783179633283798,-4.6615418475760236e-5,3.655049543919046e-8,0.0015783922903835324,-4.677665068892878e-5,3.667544840847755e-8,0.0015785325756434202,-4.703036852583066e-5,3.687171431896692e-8,0.0015787756427616659,-4.733035159097787e-5,3.7102367094230025e-8,0.0015791259181678027,-4.761430923312568e-5,3.731827295238525e-8,0.0015795538411506713,-4.7828037828527396e-5,3.747709330858676e-8,0.0015800096969891477,-4.7943878769038486E-05,3.7557792145692596e-8,0.0015804431624417705,-4.796481847401571e-5,3.756375094216574e-8,0.0015808178057632656,-4.791635491291735e-5,3.7516101368887467e-8,0.0015811164141571583,-4.783405291768669e-5,3.744360223405161e-8,0.0015813392677104443,-4.775314048922322e-5,3.737423693485045e-8,0.0015814993203580124,-4.7702326404354844e-5,3.733035174588052e-8,0.0015816171643790661,-4.7701193814970105e-5,3.7326791516613286e-8,0.0015817169630395575,-4.775965776778595e-5,3.737071389079256e-8,0.001581823347515752,-4.787832470052812e-5,3.7462041637598934e-8,0.0015819588828547596,-4.8049258257063996e-5,3.7594106726625155e-8,0.0015821417963573898,-4.8257082895207296e-5,3.775446258471748e-8,0.0015823838479101892,-4.848060164321304e-5,3.792608585212836e-8,0.001582688504544025,-4.869520808633535e-5,3.8089269531459865e-8,0.0015830498625370153,-4.887615170356731e-5,3.822428825087552e-8,0.0015834527637300596,-4.9002351733972964e-5,3.8314560752223585e-8,0.0015838743628422021,-4.906026034512833e-5,3.834982706901485e-8,0.001584287221216587,-4.904715037019271e-5,3.832875105474419e-8,0.001584663741938823,-4.897310145628491e-5,3.826032241557493e-8,0.001584981463061841,-4.8861079857009655e-5,3.8163607031293117e-8,0.0015852285820703014,-4.874466991235223e-5,3.8065608345197424e-8,0.0015854088600154176,-4.8662962215500585e-5,3.7997004979177486e-8,0.0015855444217866606,-4.86522846509656e-5,3.798563784368472e-8,0.001585674261819128,-4.8735533803462465e-5,3.804836085608511e-8,0.001585846375312292,-4.891189807186035e-5,3.818334234181005e-8,0.00158610348310477,-4.9151982596995845e-5,3.836657757562266e-8,0.001586466654834368,-4.9403489989380824e-5,3.8556531405909456e-8,0.0015869251102463237,-4.960807810621859e-5,3.870740581132169e-8,0.0015874391429179613,-4.9722343633764594e-5,3.8785587350351096e-8,0.0015879553631793688,-4.973190214442801e-5,3.878064452942808e-8,0.001588425577199708,-4.9652024693980827e-5,3.870567071163837e-8,0.00158881977381429,-4.951725979120483e-5,3.8588846273972866e-8,0.0015891295065786543,-4.936775952074638e-5,3.84623889278333e-8,0.001589364066660281,-4.9238715531157035e-5,3.8354092314337146e-8,0.001589543909685928,-4.9154994199223596e-5,3.8283168581558065e-8,0.0015896945618050432,-4.9129902713118106e-5,3.825948659678869e-8,0.0015898422153512498,-4.916611627099987e-5,3.8284520145138256e-8,0.001590010859028341,-4.925727610695112e-5,3.8352726691160195e-8,0.0015902202966968217,-4.938958761833569e-5,3.845280876708773e-8,0.0015904844846205953,-4.954336749390981e-5,3.8568874325898195e-8,0.0015908099083882816,-4.969485381752708e-5,3.868182932013065e-8,0.0015911941068452644,-4.98187279964764e-5,3.8771413773902485e-8,0.0015916248545581027,-4.989160905264646e-5,3.881908380631811e-8,0.0015920807276100831,-4.9896318601345885e-5,3.881152013111638e-8,0.0015925336582621405,-4.982618528736371e-5,3.874409592893164e-8,0.0015929536328127007,-4.9688213379708714e-5,3.862330576383604e-8,0.0015933149629505758,-4.950379940089145e-5,3.846710078351864e-8,0.001593602808933612,-4.930610263244153e-5,3.830248200720968e-8,0.0015938182399501703,-4.913404445176729e-5,3.8160453318297506e-8,0.0015939802243672306,-4.902380951458289e-5,3.806916042959481e-8,0.0015941233988982489,-4.899946750049259e-5,3.8046581250505863e-8,0.0015942911880484664,-4.906498251129774e-5,3.80945375169188e-8,0.0015945249563040758,-4.920032285756388e-5,3.8196040630227036e-8,0.0015948515164234465,-4.9364207196608636e-5,3.8317796980507725e-8,0.001595273159867582,-4.950449066879408e-5,3.841854809931519e-8,0.0015957650230228916,-4.9573895929635576e-5,3.846143646287539e-8,0.0015962822947114133,-4.954513058246872e-5,3.842577890144347e-8,0.0015967748230214939,-4.941856956430488e-5,3.8312929742037596e-8,0.001597202494943064,-4.921934317902047e-5,3.814375061431865e-8,0.0015975448239908775,-4.898645979137916e-5,3.794978155712491e-8,0.0015978022649466863,-4.876005227964857e-5,3.7762998553756675e-8,0.0015979913135114392,-4.85719625681952e-5,3.76083609760703e-8,0.0015981373497028673,-4.84414879329937e-5,3.750059586381275e-8,0.0015982682896983585,-4.837523496803743e-5,3.744429677813117e-8,0.0015984102235238262,-4.8369073369492696e-5,3.743563223650375e-8,0.0015985848577516198,-4.8410619737028296e-5,3.746436079232389e-8,0.0015988080578801715,-4.848147621960483e-5,3.751556089859576e-8,0.0015990887787054714,-4.8559129023742496e-5,3.7571077107145096e-8,0.0015994279675657184,-4.861890144868653e-5,3.761106919377434e-8,0.0015998175105410416,-4.8636534469734454e-5,3.761614354464905e-8,0.0016002397772522405,-4.859177185400766e-5,3.757032802152641e-8,0.0016006686543139628,-4.84728413566226e-5,3.74647259539885e-8,0.0016010729910405593,-4.828097347843213e-5,3.7301095421887124e-8,0.0016014227983081818,-4.8033231546302496e-5,3.709395135898375e-8,0.0016016972164009232,-4.776158920159305e-5,3.686957478771082e-8,0.001601891799677878,-4.750708267512769e-5,3.6661070725469196e-8,0.0016020220967839574,-4.730984733590426e-5,3.65002268054441e-8,0.0016021214376728508,-4.7197895387483466e-5,3.640855159267248e-8,0.0016022329539292035,-4.7178441191331395e-5,3.6390568883612766e-8,0.001602398098868516,-4.723486700987873e-5,3.64317778525816e-8,0.0016026451775172069,-4.7330459524417435e-5,3.6502037536061675e-8,0.0016029812826023223,-4.741790311922242e-5,3.6563402100527594e-8,0.0016033900211863004,-4.7451924030049034e-5,3.658023478305435e-8,0.0016038359142873748,-4.7401493578198037e-5,3.65287527576269e-8,0.0016042743565764664,-4.725778830099e-5,3.6403069368047857e-8,0.0016046639296792753,-4.703526837810497e-5,3.621574128865795e-8,0.0016049768310006606,-4.676579911472799e-5,3.599284252644777e-8,0.0016052041001474093,-4.6488499312397777e-5,3.576575444073776e-8,0.0016053547788864799,-4.623936983449527e-5,3.556292473478258e-8,0.0016054506685802667,-4.604404725371659e-5,3.540424269592429e-8,0.00160551955904301,-4.591491456251917e-5,3.529894528530359e-8,0.0016055893304846428,-4.585176544402924e-5,3.5246319584402404e-8,0.0016056839738281931,-4.584435487657563e-5,3.523780378361235e-8,0.0016058214226180075,-4.58754099005351e-5,3.525934967930275e-8,0.0016060125662822487,-4.5923316964371105e-5,3.5293484731850514e-8,0.0016062607469574757,-4.5964330399595076e-5,3.5321033008763995e-8,0.0016065612721366269,-4.597465556251913e-5,3.5322825752794e-8,0.001606900939181552,-4.5932990607520925e-5,3.528185027009399e-8,0.0016072580949436541,-4.582396800827508e-5,3.518611857277115e-8,0.0016076041773001588,-4.564246758849356e-5,3.503214741997083e-8,0.001607907835484071,-4.539791130326102e-5,3.482829369055841e-8,0.001608142149154005,-4.511646354493401e-5,3.4596304332457856e-8,0.0016082937279128775,-4.483839603063741e-5,3.4368956580540236e-8,0.001608370164011681,-4.460905850485839e-5,3.418262319337986e-8,0.0016084013367679887,-4.4465215778220584e-5,3.4066244784300986e-8,0.0016084321421592992,-4.442209614898366e-5,3.4031040378216796e-8,0.0016085087032214472,-4.4467328910789975e-5,3.406590890538271e-8,0.001608663854204168,-4.4564751128790306e-5,3.414084287148784e-8,0.0016089078261996121,-4.466603533873435e-5,3.4216585652257157e-8,0.0016092268749752002,-4.472491235101269e-5,3.425621097733665e-8,0.0016095888815234746,-4.470896660568734e-5,3.4234524970492415e-8,0.00160995294459917,-4.46061700180591e-5,3.414304169545714e-8,0.0016102797685153603,-4.442554150736995e-5,3.39901449867369e-8,0.001610540291413511,-4.41928249660299e-5,3.379729090404697e-8,0.001610720877149768,-4.3942959524330366e-5,3.3592785051752095e-8,0.0016108243718107255,-4.3711535533740247e-5,3.340493987008991e-8,0.0016108673896750982,-4.352740556905542e-5,3.325631883018611e-8,0.0016108751528596623,-4.340803798367828e-5,3.31602500419108e-8,0.0016108756639389974,-4.3358117340029234e-5,3.31199083561361e-8,0.00161089471982018,-4.33708154841172e-5,3.312942713946964e-8,0.0016109525410755215,-4.34306101333567e-5,3.317612870807587e-8,0.0016110620470242626,-4.351655218140907e-5,3.3243045504261954e-8,0.001611228317562383,-4.360524372648092e-5,3.331122931252226e-8,0.0016114486396584151,-4.367330914275547e-5,3.336174083792286e-8,0.0016117127150576606,-4.3699607289291936e-5,3.33775293772246e-8,0.0016120029665654158,-4.366764384768521e-5,3.3345510827283086e-8,0.0016122953248352881,-4.35685848202546e-5,3.3259070099345036e-8,0.0016125613483437497,-4.340490324202378e-5,3.312093756709973e-8,0.0016127727551766623,-4.319382193216696e-5,3.294576076085041e-8,0.0016129088996316033,-4.296843215561775e-5,3.276074107332174e-8,0.0016129659137071207,-4.277350269527232e-5,3.260204841704383e-8,0.0016129634518711477,-4.2654123502679954e-5,3.250560511019986e-8,0.0016129434192342419,-4.263951160928507e-5,3.249413087936494e-8,0.0016129578689934336,-4.272950726670111e-5,3.25664702196115e-8,0.001613050232896208,-4.2892278302879625e-5,3.2696007974918103e-8,0.0016132395138366183,-4.307566567224347e-5,3.2840080832235315e-8,0.0016135153781361821,-4.3225967007183096e-5,3.295532521363271e-8,0.0016138447598283675,-4.330446141592195e-5,3.3011068605873004e-8,0.0016141845061787268,-4.329558915141256e-5,3.299579503566333e-8,0.0016144937858859182,-4.320654916003372e-5,3.29165093334752e-8,0.0016147426836319956,-4.3061418898431364e-5,3.2793617549553344e-8,0.0016149162538619413,-4.28932148940195e-5,3.2654235700933185e-8,0.0016150148382885333,-4.273622151749938e-5,3.252591778532962e-8,0.0016150517857130536,-4.261972946654225e-5,3.243173477682972e-8,0.001615049514803641,-4.256367933918242e-5,3.238701919898679e-8,0.0016150347633862986,-4.2576490174574447e-5,3.239787068664833e-8,0.0016150339039934956,-4.265505690214593e-5,3.24613058418649e-8,0.0016150690590622733,-4.278649690659109e-5,3.2566675877575025e-8,0.0016151554483356746,-4.2951022505443604e-5,3.269788817933618e-8,0.0016153001048231429,-4.312527285417708e-5,3.283598386574173e-8,0.0016155017602802555,-4.328548587995333e-5,3.2961656880308e-8,0.0016157514557302796,-4.3410193344149555e-5,3.305749480030836e-8,0.0016160335151886938,-4.348253336100209e-5,3.310998203842222e-8,0.0016163267962227231,-4.3492450229067064e-5,3.311139396130571e-8,0.001616606420595729,-4.343902077762299e-5,3.306167660919614e-8,0.001616846570836147,-4.3332918110579625e-5,3.297027424956425e-8,0.0016170251774682734,-4.319829401359851e-5,3.285736904569684e-8,0.0016171308087405997,-4.307222907662207e-5,3.2753160720529384e-8,0.0016171704476762414,-4.299915965162309e-5,3.2693234113441636e-8,0.0016171742841552047,-4.301865193973153e-5,3.2708769773927315e-8,0.0016171918923307148,-4.314894035091985e-5,3.281350053431754e-8,0.0016172768691222427,-4.337450691395369e-5,3.299396166424684e-8,0.0016174652144145727,-4.364756211844907e-5,3.321089173978478e-8,0.0016177597932134746,-4.390561146011057e-5,3.341354613711286e-8,0.0016181304852361284,-4.4095543629212986e-5,3.3559243265705895e-8,0.0016185284692897027,-4.4190547319258514e-5,3.362705585213057e-8,0.0016189045522376445,-4.4193243891010715e-5,3.362020601659291e-8,0.0016192223969067512,-4.412817824935237e-5,3.355967969498163e-8,0.0016194638193470891,-4.403063195720452e-5,3.34748138358053e-8,0.0016196280163832983,-4.393679585500097e-5,3.339511192107193e-8,0.0016197277267549035,-4.3877154423368346e-5,3.334489133236136e-8,0.0016197845593948158,-4.387287847418416e-5,3.334056960624522e-8,0.0016198245204375643,-4.3934319125600074e-5,3.3389732573910446e-8,0.0016198739737394417,-4.4060948688515964e-5,3.3491313790702704e-8,0.001619956137050907,-4.424248547766236e-5,3.3636593203828094e-8,0.0016200882954145463,-4.4460987523551896e-5,3.381084517949932e-8,0.0016202798937417601,-4.469366279624242e-5,3.399550450501883e-8,0.0016205316675254457,-4.4916122131234496e-5,3.417072218106146e-8,0.0016208358841783572,-4.51056635939364e-5,3.431804144775011e-8,0.0016211775123474187,-4.524417861154815e-5,3.442285758382958e-8,0.0016215360341788234,-4.532053562216261e-5,3.447647579529873e-8,0.0016218877589150979,-4.5332465127465866e-5,3.4477688314315185e-8,0.0016222086413283134,-4.528794941479019e-5,3.4433800071019065e-8,0.0016224777898770169,-4.520602795248432e-5,3.436102856785716e-8,0.0016226820080681198,-4.511649275684907e-5,3.428394416218811e-8,0.0016228212897336288,-4.505716598228851e-5,3.423303906504118e-8,0.0016229139005976808,-4.50670885186496e-5,3.423920259833186e-8,0.0016229978830992289,-4.51749217202737e-5,3.432456868826437e-8,0.0016231246866747196,-4.538503437297744e-5,3.449162408965321e-8,0.0016233428870291516,-4.566853319778398e-5,3.4716252957965794e-8,0.0016236772248806965,-4.596812991238768e-5,3.495178509204106e-8,0.0016241152647686152,-4.621869465816446e-5,3.514559949367053e-8,0.0016246116056889723,-4.637312377459764e-5,3.526003661180751e-8,0.0016251072872445914,-4.6418152194176277e-5,3.5285198490338464e-8,0.0016255516901675028,-4.637296697358738e-5,3.523771443245092e-8,0.0016259155653828902,-4.627592173555477e-5,3.5149685697300395e-8,0.0016261928281600965,-4.616943668607092e-5,3.5056106184870745e-8,0.0016263953747431522,-4.608946050777786e-5,3.4986134383754507e-8,0.00162654592076792,-4.606055522365073e-5,3.4959174040392114e-8,0.0016266717530924076,-4.6094961601108544e-5,3.498436583192719e-8,0.0016268002162611959,-4.619362578856872e-5,3.506170277704274e-8,0.0016269555762756986,-4.6347898809298577e-5,3.5183591772346576e-8,0.0016271567027249208,-4.654151467710764e-5,3.533649211716943e-8,0.0016274153179251607,-4.675286847043376e-5,3.550269075582101e-8,0.0016277348011426761,-4.695766887346226e-5,3.566236234788382e-8,0.0016281097039318963,-4.7132008983412574e-5,3.5796030279421156e-8,0.0016285262644494334,-4.7255678611228e-5,3.5887315314142226e-8,0.001628964073625187,-4.731526564371127e-5,3.5925567937765023E-08,0.0016293987695045343,-4.7306594472402196e-5,3.5907931482636357e-8,0.0016298055166128098,-4.723617482978707e-5,3.5840485560798704e-8,0.0016301629750232944,-4.7121376003895105e-5,3.573820180050115e-8,0.0016304574112304933,-4.698912835410786e-5,3.562359354313474e-8,0.001630686636381212,-4.687296006046646e-5,3.552402309108488e-8,0.001630863266571223,-4.6807921698255846e-5,3.546744809793738e-8,0.001631016074302961,-4.6822961021669483e-5,3.5476346222796364e-8,0.0016311873490471736,-4.6931285427303824e-5,3.556023149782128e-8,0.0016314241196807519,-4.712134705140385e-5,3.570874980570606e-8,0.0016317631244090534,-4.7353656267366736e-5,3.5889370924150126e-8,0.0016322143049490748,-4.756904084464057e-5,3.605411987293246e-8,0.0016327523237028758,-4.770869469055887e-5,3.615570802256036e-8,0.001633323721960312,-4.7737093003807625e-5,3.616600609540491e-8,0.0016338673630050457,-4.7654512699828896e-5,3.608614967055138e-8,0.0016343363161102794,-4.7492623882838964e-5,3.59428498486487e-8,0.0016347097760828822,-4.729839554612501e-5,3.577507367476015e-8,0.0016349924051370127,-4.7117130386448616e-5,3.5619987353530545e-8,0.0016352061343948639,-4.6981902350859326e-5,3.550426387925348e-8,0.0016353807083681227,-4.691028273741784e-5,3.544154910868567e-8,0.0016355464804455415,-4.690570628738172e-5,3.543383998937961e-8,0.001635730112170018,-4.696057989449839e-5,3.5474262687520425e-8,0.0016359523601496132,-4.705941012943231e-5,3.5549738432914185e-8,0.0016362269041772656,-4.718145036852111e-5,3.56431208201011e-8,0.0016365595879771274,-4.730304536267612e-5,3.5735016865504467e-8,0.0016369478987237219,-4.7400035126582016e-5,3.58056778292684e-8,0.0016373808483354118,-4.7450543227840547e-5,3.583728050603426e-8,0.0016378397017732427,-4.7438197284311285e-5,3.581663456998011e-8,0.0016383000265438497,-4.7355354305080354e-5,3.573790790644766e-8,0.001638735210162438,-4.720557229499285e-5,3.5604668453241686e-8,0.0016391211394910926,-4.700451726643738e-5,3.5430520082254106e-8,0.001639441306452008,-4.6778640180967995e-5,3.5237790208829276e-8,0.0016396912690668532,-4.6561377647454084e-5,3.5054142350092676e-8,0.0016398813658379573,-4.63872399230719e-5,3.490753406266736e-8,0.0016400368292994823,-4.628458200577974e-5,3.4820292858860436e-8,0.0016401946504560447,-4.6268117996810935e-5,3.480322538106792e-8,0.0016403967479677747,-4.6332728578918845e-5,3.485095674241419e-8,0.001640679685853359,-4.645083249127904e-5,3.494018708827335e-8,0.0016410627568417529,-4.657595311703952e-5,3.5032828146860476e-8,0.0016415385136823188,-4.665404102506928e-5,3.5085209016852697e-8,0.0016420712361589218,-4.6640593747802424e-5,3.506183028304087e-8,0.0016426066758982037,-4.651680204060536e-5,3.49483030632206e-8,0.0016430902029990438,-4.6296213477060036e-5,3.4756616314912035e-8,0.0016434846325752775,-4.601807762842053e-5,3.451956176891535e-8,0.0016437792010674768,-4.573164001443794e-5,3.4277753576294015e-8,0.0016439873944463735,-4.5480182565328244e-5,3.406648234300473e-8,0.0016441377649539473,-4.5291435015766347e-5,3.390791520498886e-8,0.0016442637177816871,-4.517553440841134e-5,3.38096166616314e-8,0.0016443960339398652,-4.512789702654878e-5,3.376713660815342e-8,0.0016445588953631549,-4.5133752929414504e-5,3.3767884966551584e-8,0.0016447684565497988,-4.517231429766106e-5,3.3794572068923304e-8,0.001645032669366525,-4.521994135279829e-5,3.382772789479797e-8,0.0016453514524502528,-4.5252519765481794e-5,3.3847558228796395e-8,0.0016457168505185967,-4.524759349498278e-5,3.38356608525806e-8,0.001646113327512554,-4.51867851078022e-5,3.3777059144320585e-8,0.0016465187233436285,-4.5058731090684236e-5,3.366270182651552e-8,0.0016469065595708819,-4.4862213010709696e-5,3.349209230451183e-8,0.0016472501485759548,-4.460855757214049e-5,3.327522050357837e-8,0.0016475282892311342,-4.43219688174928e-5,3.303267631530774e-8,0.001647731361928809,-4.40365769207798e-5,3.279298525555044e-8,0.0016478658173717641,-4.378990661504161e-5,3.2587010223876336e-8,0.001647955012278325,-4.361395560197095e-5,3.244050743190803e-8,0.0016480353368982224,-4.352634140384957e-5,3.236693816783387e-8,0.0016481481573200063,-4.352430208745986e-5,3.236282743263174e-8,0.0016483294908475749,-4.358362185466893e-5,3.240727442369534e-8,0.001648600066709863,-4.366323577305269e-5,3.2466074614676396e-8,0.0016489585077819739,-4.371486073861877e-5,3.249977289857885e-8,0.0016493799815096145,-4.369565905864213e-5,3.247396466644824e-8,0.0016498216574363398,-4.35805854427313e-5,3.236916312326058e-8,0.0016502342591044501,-4.337016148742985e-5,3.2186868815840264e-8,0.0016505762173780565,-4.309020706568123e-5,3.194909432152713e-8,0.0016508250968513124,-4.278317246005813e-5,3.1691092721698956e-8,0.0016509819009967624,-4.24946924788503e-5,3.1450271221881416e-8,0.0016510674183862332,-4.226105950962592e-5,3.125597438215787e-8,0.0016511135338679924,-4.210202576888828e-5,3.112374663814163e-8,0.0016511538874274358,-4.201993406387043e-5,3.105483497910188e-8,0.0016512170388640625,-4.200324771532353e-5,3.1039256218679945e-8,0.0016513230147448136,-4.2031673250908966e-5,3.106005739207479e-8,0.0016514824899899535,-4.2080862105879425e-5,3.109711887696447e-8,0.0016516973653265966,-4.212590433392133e-5,3.1129923067476226e-8,0.001651961729402234,-4.214373526750093e-5,3.113947244255304e-8,0.001652262709403183,-4.2115034434587586e-5,3.11098777670916e-8,0.001652581282236162,-4.20262355409554e-5,3.103010807540562e-8,0.001652893563089459,-4.1871968498026697e-5,3.089609413234407e-8,0.0016531733119630543,-4.165773999853627e-5,3.071294747399099e-8,0.001653396304072018,-4.1401950749318465e-5,3.0496512296258735e-8,0.0016535465337220673,-4.113559677284715e-5,3.027291157231968e-8,0.00165362283822673,-4.08978653952933e-5,3.007468972951524e-8,0.001653643051829214,-4.072709688518788e-5,2.993320892854408e-8,0.0016536425379715574,-4.064915069866908e-5,2.986905479463843e-8,0.0016536658656256423,-4.0667642322225216e-5,2.988415848613424e-8,0.0016537538623654171,-4.076077998128367e-5,2.995949305378407e-8,0.0016539310239152949,-4.088682206365838e-5,3.0059909699632935e-8,0.0016541982039326847,-4.099610396545309e-5,3.0144299811144e-8,0.0016545328263749025,-4.1044953793367646e-5,3.0177129842224954e-8,0.0016548957129889686,-4.100692229408898e-5,3.013755445295461e-8,0.0016552417765755723,-4.0878540058739154e-5,3.0023865014476645e-8,0.0016555313813681053,-4.0678744800547455e-5,2.985267628556814e-8,0.0016557394578348126,-4.0442706059349526e-5,2.965356616713717e-8,0.0016558602205119905,-4.0212091256584694e-5,2.9460936650144332e-8,0.0016559066064064827,-4.002467175107929e-5,2.9305507808049016e-8,0.0016559051411805651,-3.990618815504244e-5,2.9207810627581598e-8,0.0016558883208421219,-3.986641734804314e-5,2.9175190181454984e-8,0.0016558871094012825,-3.989970995789232e-5,2.920244204328383e-8,0.0016559255239323612,-3.9988717521732396e-5,2.9274958922300416e-8,0.0016560179934640134,-4.010939295998521e-5,2.9372803922459204e-8,0.0016561690600313398,-4.023567907279301e-5,2.947446435780696e-8,0.0016563744709726966,-4.0343077329543915e-5,2.9559704687070583e-8,0.0016566227473716701,-4.04110569171678e-5,2.9611550177314757e-8,0.0016568967011817656,-4.0424765170366424e-5,2.9617783814663727e-8,0.0016571748725286567,-4.03766005139679e-5,2.9572361572399208e-8,0.001657433277921752,-4.026798280415287e-5,2.9476932544257488e-8,0.0016576481341211992,-4.011122108290574e-5,2.9342315929308953e-8,0.0016578002161897344,-3.993068140079735e-5,2.918927620055278e-8,0.0016578808882250792,-3.97616016784514e-5,2.904730413787855e-8,0.0016578983842147038,-3.964455859766971e-5,2.894986463588264e-8,0.0016578810457861806,-3.961480375790006e-5,2.8925550308629004e-8,0.0016578735047228827,-3.968893422226867e-5,2.8987194852995764e-8,0.0016579242628156493,-3.985510074322592e-5,2.9124022121367424e-8,0.0016580686098759247,-4.007348282468502e-5,2.9302307407495906e-8,0.001658315212483153,-4.028875236110224e-5,2.9475907260284677e-8,0.0016586433615687947,-4.044883713349159e-5,2.9601907087753384e-8,0.0016590113970561915,-4.0520869931719907e-5,2.9653810852602028e-8,0.0016593709065407672,-4.049825768358674e-5,2.9627222749183985e-8,0.0016596801558158162,-4.039855087642855e-5,2.953777937619335e-8,0.0016599128451770951,-4.025546688761349e-5,2.9414208659192474e-8,0.001660061372670357,-4.010894002692455e-5,2.928985879812469e-8,0.0016601355508499426,-3.999598249842553e-5,2.9195098085642385e-8,0.0016601582578794414,-3.994386969418339e-5,2.9151836997324146e-8,0.0016601594601349523,-3.9966285990856224e-5,2.9170608546724392E-08,0.0016601699239930832,-4.006254573710791e-5,2.9250175101477995e-8,0.0016602158041532625,-4.021951416375853e-5,2.9379253301896273e-8,0.0016603149537395255,-4.041536412718664e-5,2.9539614735345927e-8,0.00166047527124585,-4.062408817363606e-5,2.970971399095024e-8,0.0016606948895783432,-4.081978853524619e-5,2.986812443718438e-8,0.0016609636296508186,-4.098007900947471e-5,2.9996308350286483e-8,0.0016612650174455234,-4.108841983012459e-5,3.0080601450579956e-8,0.0016615783991599132,-4.113565076063209e-5,3.01135932639863e-8,0.00166188105966781,-4.11211016170598e-5,3.009513534055636e-8,0.001662150531071203,-4.105352714493535e-5,3.0033097660775586e-8,0.0016623675379770072,-4.095183539624763e-5,2.994381510048298e-8,0.0016625201033940193,-4.0844962473662907e-5,2.98517361833591e-8,0.0016626087554811723,-4.0769446539057265e-5,2.9787188477707118e-8,0.0016626514160071732,-4.0762994359918156e-5,2.9780965991072815e-8,0.0016626848298044925,-4.0853432310140516e-5,2.9855291758414986e-8,0.0016627585180696237,-4.104557297078488e-5,3.001319945286181e-8,0.0016629196343020275,-4.1312810810254054e-5,3.023184378109478e-8,0.0016631936622173485,-4.1601319751516236e-5,3.046615302114082e-8,0.0016635717482644979,-4.1848343784879263e-5,3.0664058183648755e-8,0.0016640132555107746,-4.200576477773202e-5,3.0786057280139574e-8,0.0016644620386205267,-4.205590491481198e-5,3.0818301607812385e-8,0.001664866364125141,-4.201279974388258e-5,3.0773509768777413e-8,0.001665192705554029,-4.1912072651471524e-5,3.068227045198648e-8,0.0016654301308830564,-4.1797159168452974e-5,3.0581274453788686e-8,0.0016655875286445104,-4.170783384293948e-5,3.050359333944092e-8,0.001665687465604892,-4.167319984191924e-5,3.0472896827926416e-8,0.0016657594905155892,-4.170874776273719e-5,3.050124412626773e-8,0.0016658342301060726,-4.181625386895793e-5,3.058929521132896e-8,0.0016659386770511526,-4.1985505643195065e-5,3.0727965256502515e-8,0.0016660927790692734,-4.2197234556937535e-5,3.0900934221248055e-8,0.001666307394327278,-4.242676039351328e-5,3.108761361993264e-8,0.0016665836116936171,-4.2647885737481854e-5,3.1266263776837525e-8,0.0016669133750296294,-4.2836615240290816e-5,3.141699700450582e-8,0.0016672812040082632,-4.29742538784887e-5,3.1524353127941986e-8,0.001667666583854231,-4.3049585079543835e-5,3.157918783389978e-8,0.0016680466219054927,-4.306016694156729e-5,3.1579840829446867e-8,0.0016683988209936053,-4.3012919060955386e-5,3.153264421759085e-8,0.0016687039684606657,-4.2924075892586436e-5,3.145177637443578e-8,0.001668949248977301,-4.281847186208641e-5,3.135844372913255e-8,0.001669131786259909,-4.272775819299064e-5,3.127914542178871e-8,0.0016692623804481766,-4.268653070428464e-5,3.1242302733313314e-8,0.0016693680627836978,-4.272526972232355e-5,3.1272440060728026e-8,0.0016694908319522278,-4.286013130087455e-5,3.138195636848311e-8,0.0016696795079151228,-4.3082236687797025e-5,3.156257050561017e-8,0.0016699738397906113,-4.335263606913009e-5,3.178138863954782e-8,0.0016703860640257925,-4.3610062290433165e-5,3.1987399692878435e-8,0.0016708909850968417,-4.3792311883293744e-5,3.212916881254575e-8,0.0016714333005318656,-4.3861116917503015e-5,3.217546090751692e-8,0.0016719492822700806,-4.3815726814167675e-5,3.2126524444803504e-8,0.0016723897475633752,-4.368843070089595e-5,3.201025739742718e-8,0.0016727324810957033,-4.352796787840965e-5,3.1868119479992646e-8,0.0016729818078562674,-4.338203342372647e-5,3.174024705968066e-8,0.001673160510358554,-4.3286058936851166e-5,3.165596355869807e-8,0.0016733001997954202,-4.325918304672302e-5,3.1630534790235667e-8,0.0016734335563792723,-4.3305040518058526e-5,3.166611119385737e-8,0.0016735892269826305,-4.3414715646800075e-5,3.1754482304429493e-8,0.0016737888324904195,-4.357023755789901e-5,3.188016234879414e-8,0.0016740453537005702,-4.3748057320064645e-5,3.202330368510447e-8,0.0016743624861162748,-4.392241829557162e-5,3.216241408654458e-8,0.0016747348092937828,-4.406860454410632e-5,3.227695616684352e-8,0.0016751487805059524,-4.416603666815915e-5,3.234987839857888e-8,0.001675584637718124,-4.420100590072595e-5,3.236992864406305e-8,0.0016760191120139118,-4.4168658691226686e-5,3.23333885762874e-8,0.0016764286255676625,-4.407397693962139e-5,3.224493873197347e-8,0.0016767926831136699,-4.393169599546051e-5,3.211753662941352e-8,0.001677097237930815,-4.3765093105344423e-5,3.197123217472216e-8,0.00167733777658621,-4.360358105039846e-5,3.183091478114156e-8,0.001677521869398556,-4.347902774846859e-5,3.172303510741116e-8,0.0016776707408900074,-4.342049118287758e-5,3.167116295241453e-8,0.0016778187422698135,-4.3447130391136005e-5,3.1690241873688606e-8,0.0016780089503785252,-4.3560098509420256e-5,3.178016652122048e-8,0.0016782833720448765,-4.373614563117936e-5,3.192080369790514e-8,0.0016786683666438333,-4.3927655024510755e-5,3.207221484054373e-8,0.001679160369115784,-4.407367191046424e-5,3.2183808817329206e-8,0.0016797209875307913,-4.412114009758808e-5,3.221188471697183e-8,0.0016802880403294148,-4.404672142738793e-5,3.213771971384632e-8,0.001680798773740542,-4.386597338792192e-5,3.197519004817064e-8,0.0016812121713359505,-4.362439078443936e-5,3.176318558267004e-8,0.0016815186777889915,-4.337739128303645e-5,3.1548644038694827e-8,0.0016817358173011794,-4.317163234212843e-5,3.137068706839119e-8,0.0016818964774662018,-4.303518866881324e-5,3.125235326029229e-8,0.0016820373053456571,-4.2976515779093504e-5,3.1199916976096325e-8,0.0016821908517579908,-4.298835334932385e-5,3.120645643391533e-8,0.001682381643870257,-4.305295001771544e-5,3.125647495228362e-8,0.0016826248641123465,-4.314669659029766e-5,3.1329875743603594e-8,0.0016829262935964223,-4.3243765750394774e-5,3.1404959032322505e-8,0.0016832827993444842,-4.3319058823132525e-5,3.1460773886099394e-8,0.0016836831808576592,-4.335081474193989e-5,3.147921387142313e-8,0.0016841094761317773,-4.332309858073908e-5,3.144709006843145e-8,0.0016845389965708768,-4.322812581928537e-5,3.1358136502702837e-8,0.0016849472827916928,-4.30680097516396e-5,3.121454317459761e-8,0.001685311817324549,-4.28553785051464e-5,3.102747616737498e-8,0.0016856160259362443,-4.2612465496661675e-5,3.081620600067579e-8,0.0016858529647612876,-4.2368472572295754e-5,3.060568908899294e-8,0.0016860279929869306,-4.2155252212118004e-5,3.042272064814904e-8,0.0016861597397253318,-4.2001707138160697e-5,3.029110352696416e-8,0.001686278802546357,-4.192753075558542e-5,3.0226450956112963e-8,0.0016864236511896307,-4.1937096150845514e-5,3.023131644925384e-8,0.0016866333005143353,-4.20148809990313e-5,3.029172471873377e-8,0.0016869370383114897,-4.212468985170035e-5,3.0376837396555156e-8,0.0016873432300061099,-4.221528826700933e-5,3.0443795692792346e-8,0.0016878316433975797,-4.223370069387507e-5,3.044875659726567e-8,0.0016883549945588567,-4.214339067565662e-5,3.0361907947096335e-8,0.0016888524992501178,-4.193939125212146e-5,3.017996755366323e-8,0.0016892708942925403,-4.165129888299081e-5,2.992858118803242e-8,0.0016895823148465297,-4.1331399559831654e-5,2.9652240492607542e-8,0.0016897900659125485,-4.103474076847829e-5,2.9397395175287495e-8,0.0016899216625505006,-4.080203475990938e-5,2.919799465346154e-8,0.0016900157054978312,-4.0652031392961096e-5,2.906915313908238e-8,0.0016901099208097574,-4.058288462987776e-5,2.900853004866035e-8,0.0016902339270298944,-4.057817378667731e-5,2.900165126974593e-8,0.0016904065626526063,-4.061354355146046e-5,2.9027644312851774e-8,0.0016906360051758417,-4.0661950119559325e-5,2.9063648467584324e-8,0.0016909209995482196,-4.069723028481099e-5,2.9087710885649258e-8,0.0016912522654108416,-4.069653884596306e-5,2.9080721860103752e-8,0.0016916138646757722,-4.064230977992161e-5,2.9028017183053914e-8,0.0016919847467131485,-4.052416230559773e-5,2.8921020015667242e-8,0.0016923408945919195,-4.034078146507427e-5,2.8758904768726176e-8,0.0016926584456100585,-4.0101338254094135e-5,2.854984370404633e-8,0.0016929177886920088,-3.98256830559316e-5,2.8311126828899853e-8,0.001693108077881154,-3.954252987433632e-5,2.8067479641023334e-8,0.0016932310746483276,-3.928519728252996e-5,2.7847258747180767e-8,0.0016933029691601435,-3.908519792267514e-5,2.767686433700739e-8,0.0016933530634665743,-3.896487647791898e-5,2.7574483226122663e-8,0.0016934189419301243,-3.893091195901987e-5,2.7544749748504323e-8,0.0016935386906464923,-3.897054727601237e-5,2.7575867805514548e-8,0.001693741560057379,-3.905203356829756e-5,2.7640332995878002e-8,0.0016940391412425884,-3.9130122676386634e-5,2.7699808677760945e-8,0.0016944196388182435,-3.9156405028759944e-5,2.7713881316001143e-8,0.0016948479443695268,-3.909270277009998e-5,2.7651188701418565e-8,0.0016952732925359264,-3.892369137957591e-5,2.749979593321849e-8,0.0016956435737868081,-3.8663481150373246e-5,2.7272496371780773e-8,0.001695921508217519,-3.835205250275875e-5,2.7003629854952092e-8,0.0016960956761315402,-3.804202367397545e-5,2.67378143191e-8,0.0016961815319577094,-3.778160361537539e-5,2.6515529524935576e-8,0.001696213032473906,-3.7601416121365983e-5,2.6362069074866936e-8,0.0016962301457196613,-3.750973613700963e-5,2.628370233701135e-8,0.0016962680770975457,-3.749551816840239e-5,2.627045669394839e-8,0.0016963512376621233,-3.753538910232288e-5,2.63021853253086e-8,0.0016964917453452192,-3.7600818583413475e-5,2.635465438290942e-8,0.001696690651419292,-3.766350660714986e-5,2.6404007688425848e-8,0.001696940137771745,-3.769874102950349e-5,2.642947829630893e-8,0.0016972256658882062,-3.7687335396604675e-5,2.6414948818137022e-8,0.0016975277902204365,-3.761694740849289e-5,2.635007890531258e-8,0.001697823895555182,-3.7483365373189244e-5,2.6231474474216885e-8,0.0016980904064073249,-3.729186542931282e-5,2.6063916854335785e-8,0.0016983059629982868,-3.705818431813839e-5,2.5861193564983613e-8,0.00169845567523588,-3.6808209557159376e-5,2.5645733638452276e-8,0.0016985358748413822,-3.6575286342219624e-5,2.544614117888997e-8,0.0016985578725676185,-3.6394393189292205e-5,2.5292069524213555e-8,0.0016985486004877865,-3.629367901585675e-5,2.5206946956193076e-8,0.001698546470920179,-3.628561471787852e-5,2.5200532434859682e-8,0.0016985925376170278,-3.6361141746669543e-5,2.5264171502710526e-8,0.0016987192823167937,-3.648970911878939e-5,2.537113473313952e-8,0.0016989407603901555,-3.66260131869023e-5,2.548261022146134e-8,0.0016992475797464068,-3.672165020583402e-5,2.5557724392811732e-8,0.0016996084606618878,-3.673811638230782e-5,2.5564517650592807e-8,0.001699977956475142,-3.6657310285023185e-5,2.5488638588697726e-8,0.0017003082070326627,-3.648654916289649e-5,2.5337305501061796e-8,0.001700561508238771,-3.625653060246809e-5,2.5137301531646965e-8,0.0017007199892369825,-3.601259358681587e-5,2.492738326789755e-8,0.0017007892677775634,-3.580192599678626e-5,2.474739066190967e-8,0.0017007949978842718,-3.566104751616369e-5,2.462773297309177e-8,0.0017007740285271689,-3.560774970729352e-5,2.4582760104628268e-8,0.001700763881614479,-3.5639540723169225e-5,2.4609678123756305e-8,0.0017007942876682992,-3.5737747088271245e-5,2.4692199666377635e-8,0.0017008827935677405,-3.5874468764077714e-5,2.48064931342209e-8,0.0017010342865269056,-3.601946403066804e-5,2.4926953335125145e-8,0.0017012429683338664,-3.614526778038245e-5,2.503041713192252e-8,0.0017014952046849267,-3.623023427960677e-5,2.5098644185563178e-8,0.001701772238022168,-3.626002631665762e-5,2.5119562344499273e-8,0.0017020524196195597,-3.6228338899696296e-5,2.5087946189913077e-8,0.0017023131682198593,-3.613749747676565e-5,2.500601481098576e-8,0.0017025331952084945,-3.599911636755302e-5,2.488403054979358e-8,0.001702695545569224,-3.583443484893609e-5,2.4740519688495516e-8,0.001702791658995604,-3.567341761960704e-5,2.4601345097724025e-8,0.001702825905263925,-3.5551336305842663e-5,2.449660803475595e-8,0.0017028188818827854,-3.550180632355494e-5,2.4454604213756933e-8,0.001702806735149731,-3.5546798682885895e-5,2.4493348244526906e-8,0.0017028341827005904,-3.5686793861779424e-5,2.4612368548798255e-8,0.0017029417119942861,-3.589622192692521e-5,2.4789084250634145e-8,0.001703151464359933,-3.612826882154989e-5,2.4983140816697334e-8,0.0017034584180842351,-3.632857896050061e-5,2.514822835935455e-8,0.0017038313132765339,-3.645226816286234e-5,2.5246595649292e-8,0.0017042226379164888,-3.647699395454146e-5,2.5260079820686068e-8,0.0017045828447247262,-3.640761249596701e-5,2.5193854756660187e-8,0.0017048733046878682,-3.627237682470769e-5,2.5072903100127402e-8,0.0017050744960167964,-3.611354589471979e-5,2.4933747465570844e-8,0.0017051883610562926,-3.597597816658294e-5,2.4814589910546375e-8,0.0017052354342512147,-3.5896752180398834e-5,2.4746512664333185e-8,0.0017052482576193312,-3.589793749996182e-5,2.4747526264296278e-8,0.001705263072666433,-3.598363726072869e-5,2.482032549880074e-8,0.0017053119227668128,-3.614137236019604e-5,2.4953695706256513e-8,0.0017054169711461474,-3.6346798808851755e-5,2.5126630491637535e-8,0.001705587948875609,-3.656997064057401e-5,2.5313627491764613e-8,0.0017058225445119196,-3.678132058142517e-5,2.548965965479151e-8,0.0017061087821257628,-3.69561651974611e-5,2.563388881603951e-8,0.0017064282269366776,-3.70773600928232e-5,2.5731871018470053e-8,0.0017067591018042412,-3.713639521195745e-5,2.5776518819360373e-8,0.0017070789070781516,-3.71335783856623e-5,2.576833424327725e-8,0.001707366647808429,-3.7077896034809675e-5,2.5715344204894712e-8,0.0017076050669122245,-3.6986775316050295e-5,2.563286430776859e-8,0.0017077833482693745,-3.6885519284883346e-5,2.5542879446377526e-8,0.0017079005422884115,-3.6805662765103294e-5,2.547244983570222e-8,0.0017079692563718653,-3.678101653653675e-5,2.545019000338502e-8,0.0017080179220300188,-3.684031594380135e-5,2.549999137370553e-8,0.0017080887479602191,-3.699691368462634e-5,2.5632392147724558e-8,0.001708228641281455,-3.723898589582162e-5,2.583648649016691e-8,0.0017084735851781347,-3.752657719115359e-5,2.607763848747086e-8,0.0017088326289339622,-3.7800822890985845e-5,2.6305464895935834e-8,0.0017092809717665692,-3.800389880699946e-5,2.6470864658603684e-8,0.001709767617820864,-3.810010719756817e-5,2.6543979991628234e-8,0.0017102337850382358,-3.8086965178193554e-5,2.6523588534275293e-8,0.0017106319934249428,-3.799214504651016e-5,2.6434316445958196e-8,0.0017109375331463164,-3.786074079930412e-5,2.6315481437475767e-8,0.0017111503518974585,-3.774050858751181e-5,2.6208213356204093e-8,0.0017112901426587356,-3.767043065840216e-5,2.6145574168089167e-8,0.001711388473927356,-3.767435097338324e-5,2.6147233879245078e-8,0.0017114807478860903,-3.7759148181293965e-5,2.6218181852708225e-8,0.0017115993915441882,-3.791616629237784e-5,2.6350243451075947e-8,0.0017117688340202747,-3.812478479964005e-5,2.6525321161408846e-8,0.0017120025462314225,-3.8357269218783055e-5,2.671957407701288e-8,0.0017123022368902155,-3.858401705662783e-5,2.690781030939024e-8,0.0017126589667248331,-3.8778319536625255e-5,2.706742096037333e-8,0.0017130556713426438,-3.892000575518932e-5,2.718139609955358e-8,0.0017134704463890348,-3.8997637220543705e-5,2.72401837338603e-8,0.0017138799079658143,-3.900926090925543e-5,2.7242381927571813e-8,0.0017142621560916798,-3.896209930041389e-5,2.719452965369347e-8,0.0017145992769997747,-3.887164408049795e-5,2.7110327165076998e-8,0.0017148795732618073,-3.876038090260755e-5,2.7009443934541433e-8,0.0017150997739135154,-3.8656079592503165e-5,2.691587804537622e-8,0.0017152674011576832,-3.858919935674702e-5,2.6855564023675893e-8,0.001715402930080424,-3.858850645778573e-5,2.68525620088811e-8,0.0017155403030105689,-3.867411814540851e-5,2.6923223505940072e-8,0.001715723354598753,-3.884849496986257e-5,2.706875788258036e-8,0.0017159957908326042,-3.9088518326831626e-5,2.7268754434345864e-8,0.0017163851403779347,-3.9344697300168935e-5,2.748066663980295e-8,0.001716886993958065,-3.955318428218216e-5,2.7650053898035193e-8,0.0017174602847125158,-3.965909042471542e-5,2.773040269966326e-8,0.001718040134972025,-3.963938085916244e-5,2.770265841257851e-8,0.0017185625897166842,-3.9511228867599055e-5,2.758236823583223e-8,0.0017189868062355465,-3.932167724591736e-5,2.7410713552494807e-8,0.001719303790073166,-3.912724285345024e-5,2.7236765021706585e-8,0.0017195315916373054,-3.897569321704473e-5,2.710159348901865e-8,0.0017197039490144403,-3.889639604552238e-5,2.7029929542711243e-8,0.001719859026622647,-3.889874932274322e-5,2.7028998797406246e-8,0.0017200313178398767,-3.897534491821806e-5,2.7091549749431207e-8,0.0017202469671751624,-3.910684938799904e-5,2.7200319928931065e-8,0.001720521602018453,-3.926695176135516e-5,2.7332412797781222e-8,0.001720859794259045,-3.942689817955544e-5,2.7463158757262513e-8,0.001721255728863236,-3.955955466122989e-5,2.756947544016638e-8,0.0017216948873827532,-3.9642868900642176e-5,2.7632707506931933e-8,0.001722156569161592,-3.966254350579579e-5,2.764085344336467e-8,0.0017226170439005363,-3.9613697538888915e-5,2.7590003469533287e-8,0.001723052976870324,-3.9501301872358064e-5,2.7484764624405265e-8,0.0017234446600947672,-3.933941901930363e-5,2.733763268972299e-8,0.001723778754377761,-3.914951517199835e-5,2.7167486552635708e-8,0.0017240504576373702,-3.8958063040786535e-5,2.6997386666773607e-8,0.0017242650711087881,-3.8793531002493264e-5,2.6851810256787167e-8,0.0017244389431611393,-3.868270733259092e-5,2.675337383241879e-8,0.0017245995113033862,-3.864602832841346e-5,2.671885005626151e-8,0.0017247834536315045,-3.8691681327300336e-5,2.6754311849929e-8,0.0017250313802367769,-3.880929377612953e-5,2.6850034141866425e-8,0.001725377842565471,-3.896581169015178e-5,2.697723630726428e-8,0.0017258375470063556,-3.910800396460535e-5,2.7090318371162557e-8,0.0017263930836693708,-3.917572346874251e-5,2.7138107085967308e-8,0.0017269933872087041,-3.912436180795919e-5,2.7082925689746156e-8,0.0017275689865215494,-3.8945638522437385e-5,2.691835379492017e-8,0.0017280585048235183,-3.86727214245852e-5,2.6673635556659343e-8,0.001728431073422244,-3.836534884152783e-5,2.6400818438587404e-8,0.0017286923868734853,-3.808504387510162e-5,2.61532106623058e-8,0.0017288748816655678,-3.787530232705404e-5,2.5968120288942417e-8,0.0017290217154868146,-3.7754199534558863E-05,2.5860493154658515e-8,0.0017291734675064128,-3.771726995413944e-5,2.582562501534354e-8,0.0017293607820238672,-3.7744848247661723E-05,2.584579636728525e-8,0.001729602000315515,-3.780948874960963e-5,2.5896883802857644e-8,0.001729903599395464,-3.788165973355425e-5,2.595331727889163e-8,0.0017302617181777903,-3.7933690493989186e-5,2.5991389794231897e-8,0.0017306640141175572,-3.794259510943676e-5,2.5991547940454676e-8,0.001731091755867424,-3.789224556048095e-5,2.594015958103042e-8,0.001731522255539111,-3.7775051882364856e-5,2.5830937167328825e-8,0.0017319317604426708,-3.7593037290670407e-5,2.5665905426726304e-8,0.0017322987686243735,-3.735795299004614e-5,2.545555029736884e-8,0.0017326074067128012,-3.709011144855787e-5,2.5217806685687195e-8,0.0017328503457029842,-3.6815919057722917e-5,2.4975834819967113e-8,0.001733030801250284,-3.6564297546596944e-5,2.4754770932095832e-8,0.001733163245050693,-3.636230112525841e-5,2.4577788776660804e-8,0.0017332725692263016,-3.6230386059595666e-5,2.446195888578073e-8,0.001733391561335409,-3.6177777041230204e-5,2.4414354594100277e-8,0.0017335564073636222,-3.619837183913728e-5,2.4428778625296542e-8,0.001733799814146551,-3.626816379255833e-5,2.4483858210644657e-8,0.0017341419144584454,-3.634606741287226e-5,2.454398795466479e-8,0.0017345806750870597,-3.638048933612316e-5,2.4565021790145197e-8,0.0017350858869240476,-3.632295309658755e-5,2.4505843202086038e-8,0.0017356024788424108,-3.614624025006184e-5,2.4343764994910206e-8,0.0017360663216553012,-3.585874629062718e-5,2.408675934782713e-8,0.0017364275421104804,-3.550486845228883e-5,2.377374351553505e-8,0.001736668888599713,-3.514850340937432e-5,2.34602712311622e-8,0.001736808661045457,-3.4848567953173e-5,2.3197265336036242e-8,0.001736888544939611,-3.464037865199596e-5,2.301485336433552e-8,0.0017369558513605297,-3.4530440416808935e-5,2.29179595201377e-8,0.001737049707092597,-3.4502354376221574e-5,2.289165624475731e-8,0.0017371947516276504,-3.4526982344086895e-5,2.2910199010581445e-8,0.0017374008073448293,-3.4571512886728264e-5,2.2944984052831473e-8,0.001737665467048844,-3.460545560147143e-5,2.2969695297045837e-8,0.001737977290689824,-3.460390307791772e-5,2.296299541437974e-8,0.0017383186141002541,-3.454918032334136e-5,2.290982677063709e-8,0.0017386679295325906,-3.4431804356590167e-5,2.2802188582601254e-8,0.0017390021734525031,-3.42511906097866e-5,2.2639776047910924e-8,0.0017392992945751758,-3.40160914722638e-5,2.243042545250072e-8,0.0017395413117880889,-3.374434814309473e-5,2.2189933916874547e-8,0.0017397176600680104,-3.346135952529788e-5,2.1940688488459516e-8,0.0017398281621878566,-3.319689225605055e-5,2.170877243418754e-8,0.0017398847366847004,-3.2980307378858836e-5,2.1519663391740078e-8,0.00173991100205662,-3.283480466826047e-5,2.1393128136041958e-8,0.0017399392899709579,-3.27718231350248e-5,2.1338379242105724e-8,0.00174000521831946,-3.278698042141254e-5,2.1350723083240454e-8,0.001740140572588363,-3.285870325852261e-5,2.1410652793135758e-8,0.0017403655886877377,-3.295034303669861e-5,2.1485963701877946e-8,0.0017406820927880144,-3.301629939579607e-5,2.153721791335664e-8,0.0017410695269251995,-3.301209684177935e-5,2.152643905078453e-8,0.001741486310794703,-3.290702867540473e-5,2.1427864745405244e-8,0.0017418784545159788,-3.269589869418132e-5,2.1237862433750336e-8,0.0017421948525763043,-3.2404476839655194e-5,2.097945465702013e-8,0.001742404370709457,-3.208389090653782e-5,2.069734831489266e-8,0.001742506671572139,-3.179415040864402e-5,2.0443603476147352e-8,0.0017425307722198473,-3.158389373995162e-5,2.0260073766504838e-8,0.0017425223974869423,-3.147622681133658e-5,2.0166207874633754e-8,0.0017425275508909542,-3.146622368211866e-5,2.0157058325399752e-8,0.0017425801811898768,-3.152827253738807e-5,2.020986020759265e-8,0.0017426972860252556,-3.162719052466486e-5,2.02938080720638e-8,0.001742880085460341,-3.172780363660379e-5,2.0378372619537326e-8,0.001743118076178938,-3.180084546028723e-5,2.0438317988914532e-8,0.0017433934077427334,-3.1825558838409014e-5,2.045583270732787e-8,0.0017436844082488409,-3.179033969714021e-5,2.0421013873564265e-8,0.001743968178512343,-3.169263001235832e-5,2.0331783624667846e-8,0.0017442227209409098,-3.153871728518193e-5,2.0193782525411485e-8,0.0017444291701622036,-3.134350069999404e-5,2.002022746940685e-8,0.0017445744879534223,-3.112978763186553e-5,1.9831294365844262e-8,0.0017446545474839863,-3.092639446856581e-5,1.9652370870985962e-8,0.0017446769299296102,-3.0764373350770444e-5,1.9510621046903156e-8,0.0017446621867443558,-3.067120727891532e-5,1.9429795770389297e-8,0.001744642159515886,-3.066382603124781e-5,1.9424111620866493e-8,0.0017446545782597647,-3.074243219545489e-5,1.9492972810802038e-8,0.0017447345609175441,-3.088764647827402e-5,1.961870511808151e-8,0.0017449051754598907,-3.106281392238331e-5,1.9768826171514667e-8,0.0017451700230479688,-3.122163105108318e-5,1.9902887093021913e-8,0.001745510408947374,-3.1319374667683715e-5,1.9982307573413395e-8,0.001745888357283682,-3.1324766347923475e-5,1.998060209584599e-8,0.0017462551360621196,-3.122919694479231e-5,1.989118907219179e-8,0.0017465634988662125,-3.105046157655002e-5,1.9730384470556232e-8,0.001746780545164631,-3.0829192817083005e-5,1.9534083265630877e-8,0.0017468971763283654,-3.06181089004315e-5,1.9348284579479396e-8,0.0017469304559974707,-3.0466979567041213e-5,1.921600927524104e-8,0.001746917542182514,-3.0408580265584186e-5,1.916519343229281e-8,0.001746903536584843,-3.0450937289348743e-5,1.9202135362128732e-8,0.0017469283478326418,-3.057824727716383e-5,1.931250208156185e-8,0.0017470175401144699,-3.075870969388561e-5,1.9468283092315117e-8,0.0017471793662891689,-3.095489208974001e-5,1.9636835355944387e-8,0.00174740696584924,-3.1132521919019314e-5,1.978845734405289e-8,0.0017476831047323403,-3.126577909856488e-5,1.9900875698021727e-8,0.0017479851225330183,-3.1339285687671686e-5,1.9960887050540934e-8,0.0017482888771933986,-3.134799753916344e-5,1.9964247391127438e-8,0.001748571500534339,-3.1296247023240655e-5,1.9914888607216414e-8,0.0017488134063673208,-3.1196725784627565e-5,1.9824099003596076e-8,0.0017490001909731922,-3.106955308858083e-5,1.970973106837139e-8,0.0017491248720657058,-3.0941022082626086e-5,1.9595042768266226e-8,0.0017491904664698418,-3.084128927975832e-5,1.9506546090950694e-8,0.0017492122725144203,-3.080019758367981e-5,1.9470218613974216e-8,0.0017492184473760612,-3.084086291599031e-5,1.950583763271849e-8,0.0017492470171063378,-3.097194995726486e-5,1.9620297100766168e-8,0.0017493381646387358,-3.1181363894115793e-5,1.980227981843363e-8,0.0017495228601829887,-3.143510381205071e-5,2.0021485851797534e-8,0.0017498116793050868,-3.168386290175472e-5,2.023458425088819e-8,0.0017501889553554505,-3.18764773563137e-5,2.039704390946832e-8,0.001750615655745262,-3.197543249573554e-5,2.0476649055390935e-8,0.0017510402683068693,-3.1968199999134966e-5,2.0463276536587624e-8,0.0017514133531797574,-3.187031880307763e-5,2.037138563020928e-8,0.0017517005273633118,-3.1719998107685436e-5,2.0235063634656074e-8,0.001751890219662361,-3.156694813316782e-5,2.009806183335921e-8,0.0017519948081852045,-3.1459214757831945e-5,2.0002203745109712e-8,0.0017520456413406555,-3.14316280501743e-5,1.99773642676767e-8,0.001752083843670919,-3.149863525213701e-5,2.0035412948970665e-8,0.0017521497040240116,-3.1652918673865666e-5,2.0169255510395947e-8,0.0017522736069611874,-3.186951297035694e-5,2.0356620338662876e-8,0.0017524707370152176,-3.211356229077129e-5,2.056690037038114e-8,0.0017527403103441905,-3.234896981308914e-5,2.076865466262888e-8,0.0017530684808992239,-3.254545176213017e-5,2.0935651692450514e-8,0.0017534331318351181,-3.2682714956734884e-5,2.1050408448247448e-8,0.0017538088119477358,-3.275180452227584e-5,2.110531752462392e-8,0.0017541707526388716,-3.275447431229004e-5,2.1102114748483773e-8,0.0017544976901405082,-3.270162706579011e-5,2.105056824283674e-8,0.0017547738024637697,-3.2611589026689284e-5,2.096699993899653e-8,0.0017549902985381242,-3.250844445279376e-5,2.0872790992964694e-8,0.001755147084288628,-3.242014951493518e-5,2.0792620166438958e-8,0.001755254570490484,-3.2375793594230804e-5,2.0751927960372814e-8,0.001755335063281145,-3.2401220502996406e-5,2.0772996896363735e-8,0.0017554223357314845,-3.251259859283147e-5,2.0869356621329078e-8,0.0017555573977173214,-3.2708863724273736e-5,2.1039332104000612e-8,0.0017557790984082053,-3.29660727723672e-5,2.126132814313656e-8,0.0017561108323753565,-3.3238262436040336e-5,2.1494763264115556e-8,0.0017565485849542516,-3.346811995275699e-5,2.1689479904005575e-8,0.0017570576145160576,-3.360552772869162e-5,2.1801953478252693e-8,0.001757581785070488,-3.362585143779291e-5,2.1811245999041253e-8,0.0017580620722044517,-3.353851148587489e-5,2.1726427797049774e-8,0.001758455202278241,-3.3382035778471196e-5,2.158208310470156e-8,0.0017587444079113072,-3.320959575010596e-5,2.1425399176948597e-8,0.0017589399770165945,-3.307263661221911e-5,2.130160656072588e-8,0.0017590722808459125,-3.3008502295315075e-5,2.1243072677899854e-8,0.001759181556547813,-3.3034286998855964e-5,2.1264051244620618e-8,0.0017593078653479616,-3.314644102862432e-5,2.1360602034657684e-8,0.0017594831921096522,-3.332452486865661e-5,2.1514143545573805e-8,0.0017597265437465275,-3.353738875474003e-5,2.1697021326259336e-8,0.001760042245970357,-3.3750244753001815e-5,2.1878713640531822e-8,0.001760421146334321,-3.393124357669487e-5,2.2031497920959415e-8,0.0017608439638752132,-3.405644801825657e-5,2.2134681640893213e-8,0.0017612857471203435,-3.411264048046515e-5,2.2176972713998292e-8,0.0017617204091223166,-3.409797973084421e-5,2.2157031793999206e-8,0.0017621245438929386,-3.402096746414191e-5,2.208259287114386e-8,0.0017624801775086999,-3.3898450706873454e-5,2.1968740632231774e-8,0.0017627765982876126,-3.3753300304850276e-5,2.183585863215288e-8,0.001763011621842634,-3.3612016549370004e-5,2.1707446371806972e-8,0.0017631925713161728,-3.350214912888116e-5,2.1607729651469524e-8,0.0017633370417948848,-3.344913871513708e-5,2.1558783250075647e-8,0.0017634730174059953,-3.347197967528787e-5,2.1576714714329268e-8,0.0017636371116576798,-3.357742597786236e-5,2.1666704084487572e-8,0.0017638691979690627,-3.3753723774377576e-5,2.181772916999189e-8,0.0017642023031790117,-3.396680513750332e-5,2.1999445627985694e-8,0.0017646491667109299,-3.4163476660183754e-5,2.2165086343053056e-8,0.0017651911849654452,-3.428501454789286e-5,2.226334653764835e-8,0.001765778160698935,-3.428858702670496e-5,2.2257091907866984e-8,0.0017663432093342334,-3.416606996623403e-5,2.213983656780172e-8,0.0017668269543614896,-3.3948415208319496e-5,2.193955489711035e-8,0.001767197842766506,-3.369259112538415e-5,2.17070724834961e-8,0.0017674586193811824,-3.34596154530708e-5,2.1496498412280247e-8,0.001767639060592299,-3.329574652596208e-5,2.1348468166328244e-8,0.0017677821871205088,-3.3223440312985864e-5,2.1282180173486558e-8,0.0017679311822968995,-3.324154570836546e-5,2.129578103953367e-8,0.001768120512436396,-3.333086353608994e-5,2.1371561635770116e-8,0.0017683715270797181,-3.346142626072527e-5,2.148260408851196e-8,0.0017686914318105862,-3.3599409128902524e-5,2.1598953117881766e-8,0.0017690744739801523,-3.371291615094851e-5,2.1692652330809286e-8,0.0017695045695388376,-3.3776430454713476e-5,2.1741529840179073e-8,0.0017699588242402324,-3.3773791444695706e-5,2.1731694812881347e-8,0.0017704114732510778,-3.369964876976124e-5,2.1658752122008647e-8,0.0017708378094016797,-3.355943690940463e-5,2.152778106353521e-8,0.0017712176390383754,-3.336799684118138e-5,2.1352151053456795e-8,0.0017715378651225137,-3.314720089247531e-5,2.1151437607701027e-8,0.0017717941126926234,-3.2923077927578334e-5,2.0948840418387312e-8,0.0017719915599731899,-3.272273093629134e-5,2.0768364307715262e-8,0.0017721450953806894,-3.257108279253322e-5,2.063183815712094e-8,0.001772278789586462,-3.248736044869667e-5,2.0555760321616602e-8,0.0017724243969323124,-3.2481099228891417e-5,2.0547838756955484e-8,0.0017726180377305497,-3.2547672204280884e-5,2.06032360891902e-8,0.001772893902096436,-3.26643881516983e-5,2.070137445010743e-8,0.0017732745145420026,-3.278970120097843e-5,2.0805422495871913e-8,0.0017737592672930375,-3.286910117515717e-5,2.0867510935645095e-8,0.0017743165104114895,-3.285007607212869e-5,2.0841794381781585e-8,0.0017748868641271837,-3.27030730663727e-5,2.0702786663879134e-8,0.0017754014530360297,-3.2437768348831866e-5,2.0459662686927267e-8,0.0017758080743716612,-3.2102608481630945e-5,2.015584789108212e-8,0.0017760903595036206,-3.17656634260758e-5,1.985200104905266e-8,0.0017762693117928238,-3.1488255206219554e-5,1.9602496536206447e-8,0.0017763894591366236,-3.13062590108772e-5,1.9438747273234566e-8,0.001776500414190258,-3.12255836885439e-5,1.9365283650061506e-8,0.0017766430268873303,-3.1228419406428315e-5,1.9365541425495753e-8,0.0017768429247380117,-3.128342719222774e-5,1.9411160162745227e-8,0.0017771097947912773,-3.1355028823638904e-5,1.9470365609482324e-8,0.0017774396800211817,-3.141000926638304e-5,1.9513809181670135e-8,0.0017778182926467716,-3.142162035464175e-5,1.951808140830944e-8,0.0017782244717445747,-3.137198226709649e-5,1.946769186203101e-8,0.0017786336024299082,-3.12533185341731e-5,1.9356066032986675e-8,0.0017790209705546684,-3.1068226775794e-5,1.9185763398043137e-8,0.0017793650121143564,-3.08290205222032e-5,1.8967926769402895e-8,0.001779650296646995,-3.055604937514018e-5,1.8720829744334336e-8,0.0017798698743530228,-3.0274995636721267e-5,1.846747256260845e-8,0.001780026632235612,-3.001344158238894e-5,1.8232467517967285e-8,0.0017801335374979842,-2.9797089846618077e-5,1.8038579085288705e-8,0.0017802127450977066,-2.964590951538579e-5,1.7903218620709243e-8,0.0017802935187865058,-2.9570467972433672e-5,1.783518762572123e-8,0.0017804088777299578,-2.9568714404354944e-5,1.7831942719272197e-8,0.0017805907080136712,-2.9623577448738986e-5,1.7877681205500904e-8,0.0017808630276179797,-2.97023326731302e-5,1.7943009994474517e-8,0.0017812337934054229,-2.97595557883807e-5,1.7987695659313328e-8,0.0017816872967592035,-2.9745687070046982e-5,1.7968220015004007e-8,0.0017821813976015835,-2.962172070135213e-5,1.7850629717166458e-8,0.0017826548299887984,-2.9376324177287026e-5,1.762553130680372e-8,0.0017830461959892749,-2.903634032102028e-5,1.731731488754778e-8,0.0017833176117902473,-2.866124927995671e-5,1.6979208783705445e-8,0.001783469533852475,-2.832122375637814e-5,1.6673724822837606e-8,0.0017835376035968266,-2.80706105762117e-5,1.6448993998207882e-8,0.0017835749164607615,-2.793168172891396e-5,1.6324306949224888e-8,0.0017836317390693452,-2.7894493168831586e-5,1.6290136262871556e-8,0.0017837425116183111,-2.7927737072698468e-5,1.6318029727125984e-8,0.0017839222251040216,-2.7991952248573566e-5,1.6372552649405453e-8,0.0017841690180765415,-2.804960543379875e-5,1.6420305148628225e-8,0.0017844690921453375,-2.8070762770376914e-5,1.6434881896134044e-8,0.001784801494145308,-2.803540319002629e-5,1.6398785045025665e-8,0.0017851419554334824,-2.7933929717305372e-5,1.6303760303012625e-8,0.0017854659718042635,-2.7766907604290468e-5,1.6150522430904983e-8,0.0017857515136427459,-2.7544366750350456e-5,1.5948164497142894e-8,0.0017859816002243757,-2.7284609584283965e-5,1.571315251966609e-8,0.0017861467536977667,-2.7012260273114013e-5,1.5467614316026404e-8,0.0017862470230057806,-2.6755286369400636e-5,1.5236648496569402e-8,0.0017862930134701384,-2.654104265296623e-5,1.504470406978934e-8,0.001786305424195102,-2.6391773125555355e-5,1.491146539228525e-8,0.0017863128449208082,-2.6320220335777346e-5,1.4847885035371189e-8,0.0017863478278571186,-2.632612309632168e-5,1.4853112441925018e-8,0.0017864415524204687,-2.639440009895842e-5,1.491303463720827e-8,0.0017866176433893105,-2.649564870787032e-5,1.500094022968379e-8,0.0017868858723667914,-2.6589505322540724e-5,1.5080702406757717e-8,0.0017872368982414784,-2.66314436018206e-5,1.5112903973863852e-8,0.0017876399981771522,-2.6583121415397484e-5,1.5063969741293373e-8,0.0017880463839678022,-2.6424855833963814e-5,1.4917086903880453e-8,0.0017884001103203367,-2.61662566626825e-5,1.4681479769128718e-8,0.0017886554421320897,-2.5848825556468653e-5,1.439459563665528e-8,0.0017887942451537537,-2.5535601758596886e-5,1.4112816495281188e-8,0.0017888338091817063,-2.5289736988679483e-5,1.3892330893168733e-8,0.0017888195185604239,-2.515213106178181e-5,1.3769205429052592e-8,0.0017888063464290775,-2.5129846263159923e-5,1.3749151498984439e-8,0.0017888398156686227,-2.5199537269306553e-5,1.3810764966794239e-8,0.0017889451574657782,-2.5320670226036306e-5,1.391749936516575e-8,0.0017891262814678304,-2.544988601042015e-5,1.4030567902762325e-8,0.0017893708634015488,-2.5550922719877188e-5,1.4117760285831568e-8,0.0017896570726811836,-2.5599109255723216e-5,1.4157333008626661e-8,0.0017899592671993573,-2.5582042811262578e-5,1.4138489270469296e-8,0.0017902519438446774,-2.5498478260559e-5,1.4060321791036643e-8,0.0017905123629933307,-2.535677868794753e-5,1.3930440496755607e-8,0.0017907225488373376,-2.51734072821892e-5,1.3763682625522863e-8,0.0017908711693659085,-2.4971322438834654e-5,1.3580725771725944e-8,0.0017909554371954345,-2.4777821665357153e-5,1.3406151734326352e-8,0.0017909827283962571,-2.462135499749847e-5,1.3265522508586063e-8,0.001790971202300491,-2.4527148765017287e-5,1.3181360162542386e-8,0.0017909485628708425,-2.4512064252896147e-5,1.316846906372442e-8,0.0017909483769799933,-2.457975629539259e-5,1.3229610662378395e-8,0.0017910040460442844,-2.4717652977466054e-5,1.3352913035006776e-8,0.001791141441592685,-2.4897216452611835e-5,1.3512291120867038e-8,0.0017913719494893788,-2.5078198784446382e-5,1.367144672572904e-8,0.0017916878464235458,-2.5216509648907783e-5,1.3791025050547342e-8,0.0017920615866127356,-2.5274345945545365e-5,1.3837668829362787e-8,0.0017924499408709217,-2.5230505604992228e-5,1.3793113821811035e-8,0.001792803043549295,-2.508822447015411e-5,1.3660997294053245e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json new file mode 100644 index 0000000..bf89351 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":16000,"numberOfSamples":1000,"samples":[0.0017930770944964171,-2.487756201187732e-5,1.3468791504217692e-8,0.0017932476264231187,-2.464987080068864e-5,1.3262714904077391e-8,0.0017933184724985877,-2.446409956071231e-5,1.3095425337680572e-8,0.0017933216314600794,-2.436869143477916e-5,1.3009865564682467e-8,0.0017933067138776958,-2.438639601001157e-5,1.3025800857085489e-8,0.0017933242278720884,-2.450889654783832e-5,1.3135191695059903e-8,0.0017934104016406212,-2.470298517826634e-5,1.330788790362845e-8,0.0017935796118112995,-2.4923857068963115e-5,1.35036193070344e-8,0.0017938254296263332,-2.512860398380717e-5,1.3684062401894767e-8,0.001794127049257825,-2.5285096932882215e-5,1.3820701756483629e-8,0.0017944568919538132,-2.537530987356056e-5,1.389769075082024e-8,0.0017947867111250417,-2.5394724503292413e-5,1.3911234845185292e-8,0.0017950914943699093,-2.5349982163249467e-5,1.3867468677974076e-8,0.0017953516485814604,-2.5256290869559507e-5,1.3780165902829643e-8,0.0017955543110713956,-2.513520274015715e-5,1.3668792904120013e-8,0.0017956944918898108,-2.501264398241291e-5,1.3556752559378335e-8,0.0017957763330320648,-2.4916631576514276e-5,1.3469287614057573e-8,0.0017958142078399008,-2.487403171878831e-5,1.343048298157746e-8,0.0017958328475770424,-2.4906014603702265e-5,1.3459107884232579e-8,0.001795865353512456,-2.5022541802827092e-5,1.3563657130380593e-8,0.001795948122041468,-2.521726303763574e-5,1.3737855679584164e-8,0.0017961127345561176,-2.546517299188524e-5,1.395871521848886e-8,0.0017963766324439365,-2.572537619201675e-5,1.4189187885469435e-8,0.0017967359302593923,-2.5949711291697144e-5,1.4386024761031048e-8,0.0017971637506210216,-2.6095329969824996e-5,1.451109103127541e-8,0.0017976155937020869,-2.6137143168968956e-5,1.4542469045381444e-8,0.0017980404371389018,-2.607573723966647e-5,1.4481422712615806e-8,0.001798394095120732,-2.5938065908348892e-5,1.4352832525648934e-8,0.0017986508156540284,-2.5770774714917362e-5,1.4199014670934582e-8,0.0017988099091846071,-2.5628118914854457e-5,1.4068743101640252e-8,0.0017988956039585806,-2.555773604555096e-5,1.4004458068040699e-8,0.0017989500158965364,-2.558822796060149e-5,1.4031230788508505e-8,0.0017990211621026053,-2.5722340085414784e-5,1.415084222610123e-8,0.0017991498357205768,-2.593791853046823e-5,1.4342850551324464e-8,0.0017993597382745207,-2.6195968610161597e-5,1.4571956673982097e-8,0.0017996538157950808,-2.645239065855816e-5,1.4798559267271849e-8,0.0018000169294873425,-2.666894130169837e-5,1.498852497549383e-8,0.0018004224996779246,-2.6820193009237008e-5,1.5119328433877708e-8,0.0018008399579285909,-2.6895709367472842e-5,1.5181911626012463e-8,0.0018012407279650508,-2.6898643187987404e-5,1.5179375808053418e-8,0.0018016019580566775,-2.6842624017871885e-5,1.512418529733506e-8,0.0018019083507358257,-2.6748422125539742e-5,1.503519386765796e-8,0.0018021529000758112,-2.664111066735776e-5,1.4935106313335826e-8,0.0018023373010458653,-2.654770620791294e-5,1.4848328300519829e-8,0.0018024724205052492,-2.6494772143160663e-5,1.4798742963175621e-8,0.0018025786668415908,-2.6505317999914305e-5,1.4806850211476605e-8,0.0018026854955645365,-2.659451656531552e-5,1.4885891179718516e-8,0.0018028287921071594,-2.6764406036804033e-5,1.5037147763755564e-8,0.0018030448604636129,-2.6999007434058543e-5,1.5245693907824705e-8,0.0018033608554715635,-2.726276700041339e-5,1.5479157196478573e-8,0.0018037839756043577,-2.750560873314212e-5,1.5692371417557645e-8,0.0018042943907072807,-2.767567790489397e-5,1.583886014992919e-8,0.0018048471164087917,-2.7736268154231167e-5,1.5886025345858665e-8,0.0018053841995643509,-2.7679480289528892e-5,1.582737530167465e-8,0.0018058526507647669,-2.752969711011927e-5,1.5685558185452904e-8,0.001806220217685462,-2.73353380759272e-5,1.550478294473961e-8,0.0018064829196074033,-2.715336860705409e-5,1.533667607943918e-8,0.001806663117932587,-2.7033305913710596e-5,1.5225741546222746e-8,0.001806800801895628,-2.7005730814722615e-5,1.5199028506319084e-8,0.0018069420013151019,-2.7077300335566203e-5,1.5261811538653193e-8,0.0018071276684187964,-2.7232000211422743e-5,1.5398964117004876e-8,0.0018073853085648632,-2.7437165696606414e-5,1.5580585890886757e-8,0.0018077246572371043,-2.7652248535832284e-5,1.576998693661435e-8,0.0018081377800550024,-2.7838089562507862e-5,1.5932006675260243e-8,0.0018086029626342595,-2.7964541054522235e-5,1.603977518121356e-8,0.0018090908374324907,-2.8014926126988497e-5,1.607861859878816e-8,0.00180957084697334,-2.7986978508900445e-5,1.6046829753568754e-8,0.0018100165314672806,-2.7890983536707856e-5,1.5953965389800106e-8,0.0018104089137041853,-2.774636589803873e-5,1.5817776136232783e-8,0.0018107380434183873,-2.7577939639375955e-5,1.5660833269492737e-8,0.0018110032945058872,-2.7412588632335316e-5,1.5507519669488106e-8,0.0018112130984671998,-2.727650820984009e-5,1.5381492498527788e-8,0.0018113845185778008,-2.719266881496396e-5,1.5303331370154355e-8,0.0018115426463610783,-2.7177984586301253e-5,1.5287947407869493e-8,0.0018117192686648675,-2.7239724617485946e-5,1.5341380468993828e-8,0.001811949680932402,-2.7371212382235838e-5,1.545703888127489e-8,0.0018122663836599232,-2.754807176709037e-5,1.561247872864076e-8,0.0018126893601793177,-2.772785807579092e-5,1.57692019263019e-8,0.001813215168157243,-2.7856683016959833e-5,1.5878661656300398e-8,0.001813810503341971,-2.788443523714781e-5,1.589593222254393e-8,0.0018144169960900853,-2.7784424994027194e-5,1.5797369795099836e-8,0.0018149690546354657,-2.7567238609616395e-5,1.5593102180247856e-8,0.0018154173615913274,-2.7279217321055754e-5,1.532562475157829e-8,0.001815745477353155,-2.698524284095293e-5,1.5054105867581623e-8,0.001815971625884253,-2.674564379645672e-5,1.4833294082824518e-8,0.0018161376350310534,-2.6598869981665784e-5,1.4697715161200344e-8,0.0018162930699050063,-2.6555272801256695e-5,1.46561098570472e-8,0.0018164816791041126,-2.6600309925083196e-5,1.4694563048089877e-8,0.001816733162707175,-2.6702680190249542e-5,1.4784125685246063e-8,0.0018170600913158257,-2.682355433898887e-5,1.4889335877885533e-8,0.0018174585911996668,-2.6924764974141972e-5,1.4975656178105195e-8,0.0018179114635388195,-2.697514492077015e-5,1.5015123550887387e-8,0.0018183927840198378,-2.69547379106428e-5,1.499003182489609e-8,0.0018188731580403156,-2.6856711418009936e-5,1.4894556739454665e-8,0.001819324793629755,-2.6687029559253713e-5,1.473440683021408e-8,0.0018197256785068433,-2.6462277654925132e-5,1.4524849413287513e-8,0.001820062373922574,-2.6206258898886165e-5,1.428764312060864e-8,0.001820331254382838,-2.5946127881015275e-5,1.4047536963377575e-8,0.001820538445168254,-2.5708755861324498e-5,1.3828946837314153e-8,0.0018206989383891886,-2.5517624437804906e-5,1.365308557110985e-8,0.0018208352337955717,-2.5390152599451144e-5,1.3535489407026761e-8,0.0018209755912363625,-2.5335207243642732e-5,1.34837573147026e-8,0.001821151632775928,-2.5350517985874814e-5,1.3495281869197622e-8,0.0018213945362785741,-2.5420047270152325e-5,1.3555011738893574e-8,0.0018217289276931587,-2.551235675360919e-5,1.363413439824075e-8,0.001822164406689718,-2.5582239942904856e-5,1.3691653129699898e-8,0.001822686655285152,-2.557849948022469e-5,1.3681411343723724e-8,0.0018232531039378613,-2.5459295222371094e-5,1.3565889406493894e-8,0.0018237998026180275,-2.5211254782313133e-5,1.3333435451442727e-8,0.0018242618025331551,-2.48617013791813e-5,1.300934477782622e-8,0.0018245988973076108,-2.4473013353101097e-5,1.2650735273151976e-8,0.0018248114805428112,-2.4119027032174727e-5,1.2325005783849212e-8,0.0018249369229238492,-2.3856916289854328e-5,1.2084104532181132e-8,0.0018250308362240503,-2.371030618670482e-5,1.1949100841989596e-8,0.001825146047330891,-2.366910915234589e-5,1.1910159201163204e-8,0.0018253190675345766,-2.3700474694523012e-5,1.1936747643950821e-8,0.0018255659145471929,-2.3762271034004848e-5,1.1990121606287427e-8,0.0018258842445968248,-2.3813805840709907e-5,1.2033166516185259e-8,0.001826258169929863,-2.382242826521537e-5,1.2036355717542334e-8,0.0018266634773100754,-2.3766769983762126e-5,1.1980573637170289e-8,0.001827072388230482,-2.363782080690576e-5,1.1857967699394822e-8,0.0018274577516185762,-2.343858881848419e-5,1.1671564450583e-8,0.0018277966526101797,-2.318264021823313e-5,1.1433927158541618e-8,0.0018280733241575382,-2.2891668446499556e-5,1.1164967072672481e-8,0.0018282811577905753,-2.259224023359341e-5,1.0889004337993399e-8,0.001828423551827078,-2.231201801919025e-5,1.0631321018346868e-8,0.0018285135003267157,-2.207596922814408e-5,1.0414665395833809e-8,0.0018285721071275558,-2.1903000912757984e-5,1.0256127104231967e-8,0.0018286262706814032,-2.1803209435120533e-5,1.0164594038831645e-8,0.001828705702435555,-2.177583438325039e-5,1.0138909579633824e-8,0.001828839337656277,-2.1807956588344662e-5,1.0166784524005633e-8,0.0018290509329571627,-2.1874064192536067e-5,1.0224554437432966e-8,0.0018293535538177238,-2.1937215282132975e-5,1.027838557907086e-8,0.0018297433561300666,-2.1953289747187514e-5,1.0288214837085777e-8,0.0018301945153309169,-2.1879869760203124e-5,1.0215787794044302e-8,0.001830658946308421,-2.168992779500395e-5,1.0036992338479185e-8,0.0018310753618979378,-2.138679258668782e-5,9.755367998113473e-9,0.0018313889838965569,-2.1011704357252705e-5,9.40893730399691e-9,0.0018315746329431721,-2.063467135717398e-5,9.061841978804914e-9,0.0018316490783180249,-2.0328796754628263e-5,8.780851241439044e-9,0.0018316632653398112,-2.0141677331726018e-5,8.60917634137112e-9,0.001831679395233614,-2.0080681978185537e-5,8.55305072202464e-9,0.0018317476612021335,-2.0117816834583795e-5,8.586332987307337e-9,0.0018318940208144653,-2.0206428881992914e-5,8.665969743081962e-9,0.0018321201082134187,-2.0298263194615822e-5,8.747708166164193e-9,0.001832409908402203,-2.0354458317239478e-5,8.796142458866711e-9,0.00183273774398109,-2.035003732644327e-5,8.788718700893353e-9,0.001833074770107819,-2.027416826766039e-5,8.715846695855356e-9,0.001833393452426999,-2.0128529716534936e-5,8.579316424344743e-9,0.0018336705866361742,-1.992511730302927e-5,8.390268759309309e-9,0.0018338894912187423,-1.968387735533606e-5,8.167058601271752e-9,0.0018340416791292305,-1.943010095958344e-5,7.932910852662894e-9,0.0018341280134618974,-1.9191384559990707e-5,7.713154507289564e-9,0.0018341590816821458,-1.8994066898046752e-5,7.53193522572574e-9,0.0018341544149850127,-1.885940649167221e-5,7.40865932392435e-9,0.0018341403815578727,-1.8800038802715472e-5,7.3546966523347715e-9,0.0018341468535115438,-1.8817250628981883e-5,7.370872897137305e-9,0.0018342029234141627,-1.889956862277312e-5,7.446231414582977e-9,0.0018343321227258867,-1.9023083174690816e-5,7.558447698209529e-9,0.0018345476553118807,-1.9153707945490168e-5,7.676042116963366e-9,0.0018348481083950683,-1.9251549921866032e-5,7.762491329140837e-9,0.0018352144196331546,-1.9277769509678416e-5,7.782530133022137e-9,0.0018356096596253435,-1.920398976117508e-5,7.710681424220857e-9,0.0018359837763515755,-1.9022957466042443e-5,7.540865396769042e-9,0.0018362849741516284,-1.8756908829736255e-5,7.293910761478627e-9,0.0018364766833233455,-1.8457870012827724e-5,7.017737181329629e-9,0.0018365538571077135,-1.8194914639068882e-5,6.775647214996834e-9,0.001836548563460727,-1.803024372589666e-5,6.624410847690285e-9,0.0018365187675594202,-1.7995409567851337e-5,6.592525088216024e-9,0.0018365252877235454,-1.8081331449302935e-5,6.671177914624835e-9,0.0018366101542084223,-1.8246672589318575e-5,6.822077045534804e-9,0.0018367869375824912,-1.8436994200718304e-5,6.995122222991016e-9,0.001837043888830328,-1.8602938875977135e-5,7.145101322978344e-9,0.0018373537387537482,-1.8710583772040503e-5,7.241122599512904e-9,0.0018376837337121634,-1.8743874840279134e-5,7.2687428712580284e-9,0.0018380027530075403,-1.8702372696090056e-5,7.227808403795434e-9,0.0018382852635966235,-1.8597450955179613e-5,7.128926096284541e-9,0.001838513176276471,-1.8448670412689796e-5,6.990149973877557e-9,0.0018386767249291653,-1.8280754164638692e-5,6.8342449477846595e-9,0.0018387750038904136,-1.812090639012062e-5,6.686252226411574e-9,0.0018388162973281307,-1.799601728606697e-5,6.570911706461216e-9,0.0018388179260978472,-1.7929389648419776e-5,6.509607695224068e-9,0.0018388050594228275,-1.7937016075237906e-5,6.516893378261047e-9,0.0018388079846011016,-1.8023966004633595e-5,6.597145459559734e-9,0.001838857713922728,-1.818180313357647e-5,6.742223335637884e-9,0.0018389803552352245,-1.838806035919854e-5,6.9310780933096055e-9,0.0018391912530982262,-1.860858891245793e-5,7.132034188312767e-9,0.0018394902971468079,-1.88029481324306e-5,7.3078518212857724e-9,0.0018398597310770378,-1.8932177661136858e-5,7.422918615431776e-9,0.0018402654168871984,-1.896772954162206e-5,7.451423914551764e-9,0.0018406621235211068,-1.8899934385024923e-5,7.385028293072869e-9,0.0018410028729857332,-1.8743806537061265e-5,7.238049462551088e-9,0.0018412512510457238,-1.8539475868505472e-5,7.047719368366382e-9,0.0018413937282192889,-1.834483799071887e-5,6.86733900839635e-9,0.0018414470718991932,-1.8220140618210308e-5,6.752093172557913e-9,0.0018414557581306575,-1.8208514775956216e-5,6.741217444212319e-9,0.0018414780209857879,-1.8320709364073575e-5,6.844095149750602e-9,0.001841565803992494,-1.8532077021471085e-5,7.037638298125493e-9,0.0018417482230087799,-1.8793447944416692e-5,7.276395121919292e-9,0.001842025845932932,-1.9049480082961622e-5,7.509453930519011e-9,0.001842376034057044,-1.925507263145096e-5,7.69549565376883e-9,0.0018427639401787223,-1.9383990375315344e-5,7.810647629678605e-9,0.0018431531413094465,-1.942958955901095e-5,7.849070713791684e-9,0.0018435127392187048,-1.940088549418417e-5,7.8192866216250315E-09,0.001843820730492911,-1.9317320377072763e-5,7.739348166296656e-9,0.0018440648885501498,-1.9204160908646343e-5,7.632620118984367e-9,0.001844242531542363,-1.9089035068363377e-5,7.524612793811735e-9,0.0018443600647661403,-1.8999259868333292e-5,7.440521812341918e-9,0.001844432549312981,-1.8959307662865297e-5,7.402863667254894e-9,0.0018444829953387927,-1.8987874349045107e-5,7.428729689176291e-9,0.0018445407209490732,-1.9094430440071465e-5,7.52658268876082e-9,0.0018446380463958871,-1.9275761849198014e-5,7.693093256534828e-9,0.001844804951317121,-1.9513700180089063e-5,7.911127592194227e-9,0.0018450622049142106,-1.9775670897407012e-5,8.15036239379623e-9,0.0018454146537959305,-2.0019361155694627e-5,8.37168352380671e-9,0.0018458471645658634,-2.020149491512519e-5,8.53532123115057e-9,0.001846325472916595,-2.0288852030465627e-5,8.610991677718667e-9,0.001846802738334875,-2.0268255874207588e-5,8.587035433849896e-9,0.0018472305526570348,-2.0152106866842266e-5,8.475412368243551e-9,0.0018475714841345342,-1.99772538420524e-5,8.31053358635742e-9,0.0018478096100095864,-1.9796940495792812e-5,8.141712154172403e-9,0.0018479558587613187,-1.9667497884298463e-5,8.020816057287474e-9,0.0018480460497650023,-1.9633092096664974e-5,7.988216118779569e-9,0.0018481313475885142,-1.97130435184807e-5,8.061204673026506e-9,0.0018482635125553158,-1.989628715353263e-5,8.229056332405201e-9,0.0018484798977238869,-2.014547254945726e-5,8.45695909902495e-9,0.0018487937859131421,-2.0409270039150275e-5,8.697434490355547e-9,0.0018491933464550954,-2.0637777460108637e-5,8.904531720257321e-9,0.001849648388562267,-2.0794981895125802e-5,9.04525543618406e-9,0.0018501208603383453,-2.0864590650255843e-5,9.104868950596546e-9,0.0018505745805460858,-2.0849287684095834e-5,9.086145203825255e-9,0.0018509815951685388,-2.0766006244656177e-5,9.004964655845875e-9,0.0018513249009249032,-2.0640121265863943e-5,8.88493947825769e-9,0.0018515986248674762,-2.0500399014916906e-5,8.75275158592604e-9,0.0018518069924697927,-2.037529947986055e-5,8.634737803338043e-9,0.0018519630574627775,-2.029034519449881e-5,8.55444480376467e-9,0.0018520875544509319,-2.0265862670398454e-5,8.530515515536571e-9,0.0018522076118006106,-2.0314479503742223e-5,8.574357895458459e-9,0.001852354640478269,-2.043817792207266e-5,8.68743961998716e-9,0.0018525605725263623,-2.0625343158510295e-5,8.85862825193293e-9,0.0018528519045839407,-2.0849110173348045e-5,9.06276525797922e-9,0.0018532420360760945,-2.1069073571299936e-5,9.262339779435322e-9,0.001853724130935122,-2.123818424609054e-5,9.413907129041965e-9,0.0018542681745039775,-2.13146965067963e-5,9.479118156772436e-9,0.001854825500677946,-2.1275855803305648e-5,9.437327265942164e-9,0.0018553411001434338,-2.1127603421251835e-5,9.294511094167757e-9,0.001855769808091963,-2.0905197786356253e-5,9.083769325899609e-9,0.001856089934500493,-2.066366542445483e-5,8.856377940750694e-9,0.001856309055157489,-2.0461827016597087e-5,8.66688007773098e-9,0.0018564605291198604,-2.0346009610590452e-5,8.557941716365146e-9,0.0018565929794966702,-2.0338609963516525e-5,8.549815123998282e-9,0.0018567566935258077,-2.0434095465034442e-5,8.636794189047838e-9,0.0018569909246059376,-2.0602544164462002e-5,8.790679141975657e-9,0.001857315247217037,-2.079894845221756e-5,8.96952007306406e-9,0.0018577267622189627,-2.097526582003082e-5,9.12880609280628e-9,0.001858203223977554,-2.109175679528336e-5,9.231914666619509e-9,0.0018587104540100233,-2.1124682017155018e-5,9.257156442445109e-9,0.0018592113115679834,-2.106890188932159e-5,9.200104828967708e-9,0.0018596735056705283,-2.0935816127821806e-5,9.07163153057935e-9,0.0018600745996205108,-2.0748452915729757e-5,8.89332379757743e-9,0.0018604039664238258,-2.0535775690622106e-5,8.692194187757801e-9,0.0018606624467996109,-2.032768021272182e-5,8.496037214902576e-9,0.0018608607937328295,-2.0151290741381685e-5,8.329989644194028e-9,0.0018610177895546044,-2.0028404875289557e-5,8.214148845006132e-9,0.0018611584243115355,-1.9973516875703052e-5,8.161728802068476e-9,0.0018613119834204608,-1.999186368250376e-5,8.17725592983337e-9,0.0018615094730483387,-2.0077264157555704e-5,8.254611200906061e-9,0.0018617795921467622,-2.021010824142319e-5,8.375250055651793e-9,0.0018621426777235635,-2.0356759570897997e-5,8.507743574528015e-9,0.0018626030974959807,-2.0472527218197918e-5,8.610594760757943e-9,0.001863142529370494,-2.0510266452106173e-5,8.640213095127023e-9,0.001863718542838287,-2.0434462278556232e-5,8.563932655985352e-9,0.0018642726717816077,-2.0236362154722935e-5,8.374014217097276e-9,0.0018647478436570396,-1.9942109211313427e-5,8.095175761587323e-9,0.001865108368948935,-1.960728289796133e-5,7.779474788722417e-9,0.0018653524017467537,-1.9298711898535704e-5,7.4892916930745e-9,0.0018655107551995035,-1.9072315354648044e-5,7.27659510756275e-9,0.0018656340820196373,-1.895724351204022e-5,7.168151304633016e-9,0.0018657758320747826,-1.895135064135561e-5,7.161416176012306e-9,0.0018659780113648356,-1.9026593337249196e-5,7.229749985625541e-9,0.0018662631207856332,-1.9139791481250695e-5,7.332602529333776e-9,0.0018666323647777408,-1.9244376015289706e-5,7.426524029334083e-9,0.0018670686302071045,-1.93003096381889e-5,7.474374412439072e-9,0.0018675424105708905,-1.9280847880737214e-5,7.451532270409492e-9,0.0018680189994260549,-1.9175704489265866e-5,7.348747503653877e-9,0.0018684654564785955,-1.8990736169104185e-5,7.171778438188237e-9,0.0018688561260398076,-1.8744836865035615e-5,6.938463114669843e-9,0.0018691760026911882,-1.8465188498455326e-5,6.674284503730649e-9,0.001869421833270251,-1.818207784859466e-5,6.407542925266269e-9,0.0018696013388690184,-1.7924257543533537e-5,6.165035437391302e-9,0.0018697312745747144,-1.77154221714517e-5,5.968767927016784e-9,0.0018698350512996898,-1.7571817919185243e-5,5.8337191006715384e-9,0.0018699402886244905,-1.750060390009367e-5,5.76630978226681e-9,0.0018700762544792589,-1.7498573862310598e-5,5.763229760950721e-9,0.0018702708423503566,-1.7551071627329354e-5,5.8104800416812336e-9,0.0018705465025051088,-1.763137263486119e-5,5.882878383752786e-9,0.0018709146903029294,-1.770161615547732e-5,5.945007935726127e-9,0.0018713693790612124,-1.771717503436893e-5,5.955326079857078e-9,0.001871882005628167,-1.7636224585071255e-5,5.875056690709975e-9,0.0018724021730790383,-1.7434179833481032e-5,5.681589270232072e-9,0.0018728684333721528,-1.7118167658035483e-5,5.3819353393236815e-9,0.0018732287172204356,-1.6732355540166632e-5,5.017686966724454e-9,0.0018734616898216,-1.6346704189132433e-5,4.654472798669768e-9,0.0018735862278335242,-1.6031827206181716e-5,4.358367558462995e-9,0.0018736526901350647,-1.583326478782647e-5,4.1717537065880975e-9,0.0018737219046122688,-1.5758804508346698e-5,4.10148922345258e-9,0.0018738443004110933,-1.578241850439683e-5,4.12273758898688e-9,0.0018740479774201498,-1.5858384906640113e-5,4.192354118637595e-9,0.0018743368377812267,-1.5936813363410486e-5,4.2635170100055776e-9,0.0018746952507608576,-1.5975245333576563e-5,4.296582563572818e-9,0.001875095253598817,-1.594505681652756e-5,4.265000879239349e-9,0.0018755037392833745,-1.5833619336192383e-5,4.157239354603041e-9,0.0018758885761289046,-1.5643635440476038e-5,3.976084601740173e-9,0.001876223379869671,-1.539063040568846e-5,3.736258860742264e-9,0.0018764908158095375,-1.5099215718405392e-5,3.460921341786339e-9,0.0018766843555797306,-1.4798700313825205e-5,3.1775739251165955e-9,0.001876808514204054,-1.4518593640800304e-5,2.913862771528727e-9,0.001876877684600156,-1.428449594527703e-5,2.6937304046643276e-9,0.0018769138794313335,-1.4114849713635936e-5,2.534362112040424e-9,0.001876943877891384,-1.4018784813808756e-5,2.444153315210054e-9,0.0018769961556297737,-1.3994930354196748e-5,2.4215928014478305e-9,0.0018770976892354386,-1.4030988542626093e-5,2.454884423634573e-9,0.0018772705481379275,-1.4104015382463982e-5,2.5222631987773908e-9,0.001877528051302119,-1.4181603792678899e-5,2.5931789806121115e-9,0.0018778703569376982,-1.4224713941675174e-5,2.6310160704288327e-9,0.0018782801543122864,-1.4193451439422243e-5,2.598529820729149e-9,0.0018787205590664604,-1.405678212300852e-5,2.4669139600598395e-9,0.0018791386692319275,-1.3805285464980217e-5,2.2276810492311913e-9,0.0018794780123360833,-1.3462303276611882e-5,1.9030504386180313e-9,0.0018796988460152687,-1.3085081939944344e-5,1.5469771882351445e-9,0.001879797376121251,-1.2749246711917046e-5,1.2305366805810725e-9,0.001879810814909188,-1.2520431987685998e-5,1.0152379061173355e-9,0.0018798025069450173,-1.2428480565797385e-5,9.28792039154265e-10,0.0018798356637794984,-1.2459405930458762e-5,9.576569245815327e-10,0.0018799514652937973,-1.2567147881760806e-5,1.058227207885944e-9,0.0018801611228964044,-1.2694459694026742e-5,1.1765668337490139e-9,0.0018804504286041776,-1.2790844470236134e-5,1.2652815802583089e-9,0.0018807898296935043,-1.2822211239622132e-5,1.2925348480468322e-9,0.001881144296639176,-1.2773137375766395e-5,1.244082520275377e-9,0.001881480541304962,-1.2644829708590756e-5,1.1212779543347608e-9,0.0018817714830373492,-1.2451442593087324e-5,9.37573033027889e-10,0.0018819987877392661,-1.2216113471832141e-5,7.147943106851535e-10,0.0018821541835679256,-1.1967040551517974e-5,4.79481554800589e-10,0.001882239823342938,-1.1733614321682521e-5,2.592733145950963e-10,0.0018822677333682823,-1.1542659347071796e-5,7.937878641490489e-11,0.001882258290813125,-1.1414929386642006e-5,-4.073055482831923e-11,0.00188223769665013,-1.1362192719985607e-5,-9.008293919875422e-11,0.001882234648515446,-1.1385337979164145e-5,-6.800108198389007e-11,0.0018822765976668182,-1.147373068275585e-5,1.529829570741141e-11,0.0018823859220090569,-1.1605863972995146e-5,1.3934936610352848e-10,0.0018825762769299201,-1.1751333204930212e-5,2.7535196640362164e-10,0.001882849356696919,-1.1874174668779581e-5,3.8937810798312383e-10,0.0018831923326353601,-1.1937760844475924e-5,4.470257514000792e-10,0.0018835766745060477,-1.1911660763090492e-5,4.198775427362523e-10,0.0018839599006157666,-1.1780441166968134e-5,2.937343558620432e-10,0.0018842923200876947,-1.1552816367157377e-5,7.714292268036392e-11,0.0018845300065070212,-1.1267101431234662e-5,-1.935563353070176e-10,0.001884651848842402,-1.0986979616266467e-5,-4.582805070815646e-10,0.0018846729512961321,-1.0783668473551395e-5,-6.500369715974631e-10,0.001884644026311698,-1.0709107993313308e-5,-7.201687612284614e-10,0.0018846329849430254,-1.0774324376780514e-5,-6.586566194780138e-10,0.0018846977991100334,-1.0946622650667459e-5,-4.966346506891892e-10,0.0018848664449174443,-1.1166459365350037e-5,-2.9038739613313543e-10,0.0018851332005309256,-1.1371807843700045e-5,-9.836030862044166e-11,0.00188546833284025,-1.1516483567944784e-5,3.6072174092010136e-11,0.0018858320534413794,-1.1577196587717038e-5,9.118298144119174e-11,0.0018861858170151932,-1.1551897946543376e-5,6.526251494340663e-11,0.0018864988368209698,-1.1454250824736898e-5,-2.8641386320276168e-11,0.0018867506997908348,-1.130771157982184e-5,-1.683171289939276e-10,0.0018869317981828468,-1.114067253953726e-5,-3.269535468848281e-10,0.00188704288267068,-1.0982683580718171e-5,-4.766790893169354e-10,0.00188709425157458,-1.0861262431198378e-5,-5.915582605683498e-10,0.0018871045582005074,-1.0798915164720963e-5,-6.504092600231872e-10,0.0018870989904794264,-1.0810255077489202e-5,-6.395398827368157e-10,0.0018871065171513206,-1.089946266139451e-5,-5.551558313967678e-10,0.0018871561148395357,-1.1058676341069262e-5,-4.048719775294948e-10,0.0018872723151573511,-1.1267948529405112e-5,-2.077232698081918e-10,0.0018874707273317042,-1.1497174238386989e-5,7.702962172308863e-12,0.0018877543345839755,-1.1710094620244999e-5,2.0709679356946207e-10,0.0018881113731507087,-1.1870079468074387e-5,3.5592247332806187e-10,0.0018885154354453212,-1.1947025394181564e-5,4.2594198011051527e-10,0.0018889282709940963,-1.1924554434572256e-5,4.0198452420754266e-10,0.0018893057509901104,-1.180642796887354e-5,2.8793937793174093e-10,0.0018896072155190882,-1.1620319815144137e-5,1.102325230061882e-10,0.0018898073174633363,-1.141620503858083e-5,-8.378045830706647e-11,0.0018899072882816023,-1.1256680872880053e-5,-2.350144500265779e-10,0.00188994004525897,-1.1199004466727915e-5,-2.8962303888349816e-10,0.0018899634124805416,-1.1274091765243815e-5,-2.187662588737686e-10,0.0018900409279768637,-1.1472911999612212e-5,-3.133758064503063e-11,0.0018902183761997377,-1.1749297526970216e-5,2.2880621691449785e-10,0.0018905085190595347,-1.2038537620544541e-5,5.004579398597872e-10,0.0018908911977333046,-1.2281010673800587e-5,7.273646082903298e-10,0.0018913257026649535,-1.2438746635557551e-5,8.738262880584713e-10,0.001891766418942364,-1.2500025159169855e-5,9.289921702418269e-10,0.0018921745217345054,-1.2474898759061678e-5,9.025856295473614e-10,0.0018925235949496604,-1.2387224374957897e-5,8.173373978207359e-10,0.0018928006012498605,-1.2267242724669224e-5,7.019521780489794e-10,0.001893004532648849,-1.2146219309942353e-5,5.860420989860535e-10,0.0018931444568213974,-1.2052958305120446e-5,4.968374482519974e-10,0.0018932376922635935,-1.201136506885249e-5,4.5688395279176046e-10,0.0018933080932005942,-1.203830971069964e-5,4.820179060546816e-10,0.0018933840198379344,-1.2141431704543413e-5,5.792878687063079e-10,0.0018934954432214392,-1.2317048491958935e-5,7.449904944807481e-10,0.0018936698433884116,-1.2548874791752978e-5,9.63493451044306e-10,0.0018939271289290503,-1.2808571057900438e-5,1.207801973263226e-9,0.0018942745270844783,-1.3059009801183272e-5,1.4426931836520661e-9,0.0018947029628015445,-1.3260512884313262e-5,1.6306445395104082e-9,0.0018951865409454112,-1.3379240786205856e-5,1.739776196090901e-9,0.0018956861193035659,-1.339582085200682e-5,1.7520006276159735e-9,0.001896156784362993,-1.3311821218936873e-5,1.6691149414387627e-9,0.0018965578833635218,-1.315201628144059e-5,1.5148888736049156e-9,0.0018968634955145083,-1.2961201862073039e-5,1.3319718714925833e-9,0.0018970707895216053,-1.27953186054354e-5,1.1734090967998433e-9,0.0018972035254706415,-1.270792499395131e-5,1.0897877058615488e-9,0.0018973082905004745,-1.2734836504746565e-5,1.1147159041982071e-9,0.0018974426469162598,-1.2881765897702211e-5,1.2532161191392723e-9,0.0018976577334179135,-1.3120638566367633e-5,1.4783604413576136e-9,0.0018979817061840188,-1.3397830754750496e-5,1.7391592222003208e-9,0.001898411458923872,-1.3651830597880485e-5,1.9773042111285594e-9,0.0018989162166529016,-1.3832467412215963e-5,2.1453543532283e-9,0.0018994501504002229,-1.3913394698958246e-5,2.218528300226893e-9,0.0018999670934915821,-1.3894285229865015e-5,2.1967560935101533e-9,0.0019004313205916007,-1.3794987368719163e-5,2.0991062793393773e-9,0.0019008222473536457,-1.3646563923406225e-5,1.9552477096692173e-9,0.0019011342862434643,-1.3483210869567092e-5,1.7977502645593472e-9,0.0019013742670453792,-1.3336710126712298e-5,1.656805182705815e-9,0.0019015583445810035,-1.3233251710861967e-5,1.557210441490532e-9,0.0019017093215130678,-1.3191683234416556e-5,1.516718948288368e-9,0.0019018544551819409,-1.322222486221346e-5,1.5448335845441187e-9,0.0019020232614363063,-1.332508798252e-5,1.641518474045382e-9,0.0019022446122891282,-1.3489036976123344e-5,1.7958687511443292e-9,0.0019025425844261994,-1.369058867045455e-5,1.985394636394811e-9,0.0019029310998461496,-1.3895103526272778e-5,2.177098013812628e-9,0.0019034084130146504,-1.4061158291373949e-5,2.3316432829741173e-9,0.0019039536403952983,-1.4148798826174367e-5,2.411188360481643e-9,0.00190452798036301,-1.4130390523376207e-5,2.3896713112052716e-9,0.0019050821403015848,-1.4000599135125858e-5,2.262277159589695e-9,0.0019055688083909521,-1.3781106731241096e-5,2.0499028297317794e-9,0.0019059562148011579,-1.3517137805515713e-5,1.795813482384683e-9,0.0019062378216281627,-1.3266226807941069e-5,1.55488479026225e-9,0.0019064346707243743,-1.3082876840158903e-5,1.3789321851604236e-9,0.0019065897975290977,-1.300402884385789e-5,1.3028645792247607e-9,0.0019067566525288243,-1.3039478647258866e-5,1.335631681489911e-9,0.0019069848668208623,-1.3169664466781716e-5,1.458241594737562e-9,0.0019073072088376596,-1.3351363244590194e-5,1.6292950121476715e-9,0.0019077314104704636,-1.35297729754093e-5,1.7965331398129217e-9,0.0019082393455308658,-1.3653389545506359e-5,1.910981408664566e-9,0.0019087936495511212,-1.368692249063571e-5,1.9391998920108105e-9,0.0019093490888763,-1.36182247050182e-5,1.8698433679372743e-9,0.0019098643504093444,-1.3457815665676977e-5,1.7131785903247102e-9,0.0019103104535418381,-1.3232664882104302e-5,1.49513174647234e-9,0.001910674199703993,-1.2977653683504635e-5,1.2491153226176072e-9,0.001910957383345947,-1.2727836569487273e-5,1.0086216538112337e-9,0.0019111736376836673,-1.2513095263658599e-5,8.021151208985223e-10,0.0019113446910483782,-1.2355262008813369e-5,6.502990133921028e-10,0.0019114970699477254,-1.2266914435896981e-5,5.649887739956633e-10,0.001911659458251913,-1.2250863989869682e-5,5.48651037755953e-10,0.0019118603142655674,-1.2299688915426472e-5,5.939871771107086e-10,0.0019121250704395051,-1.2395224103850199e-5,6.83479516283135e-10,0.001912472298250459,-1.2508553962420433e-5,7.894175597020551e-10,0.0019129086995072113,-1.2601732458062466e-5,8.755614362231623e-10,0.0019134238587510172,-1.2632856875682743e-5,9.019823758839568e-10,0.0019139872139001782,-1.2565475255362356e-5,8.340185275907759e-10,0.0019145507149744756,-1.2380996991705414e-5,6.541016494998854e-10,0.0019150594943169597,-1.208942059331609e-5,3.720012705806915e-10,0.0019154687355826697,-1.1731803189978585e-5,2.7186751351475117e-11,0.0019157599073696201,-1.1370438510631843e-5,-3.2059589419623007e-10,0.0019159480871280882,-1.1069433649940181e-5,-6.099776897920081e-10,0.0019160765242110884,-1.0874351161307604e-5,-7.975067244527357e-10,0.001916201638240862,-1.0799731954230843e-5,-8.695695269755934e-10,0.0019163757206690922,-1.0828066294132719e-5,-8.432736692445251e-10,0.001916633663319116,-1.0918083407511515e-5,-7.583931686950212e-10,0.0019169865545414935,-1.1017681518618213e-5,-6.649208970516302e-10,0.0019174220148160516,-1.1077138327480256e-5,-6.104228457140029e-10,0.001917909652400136,-1.1059628873658679e-5,-6.300141180862712e-10,0.0019184095373273615,-1.0947442807596206e-5,-7.404583107456317e-10,0.0019188815145464583,-1.074336196537258e-5,-9.388858115135974e-10,0.0019192932808213034,-1.0467594123611643e-5,-1.20575358697917e-9,0.0019196256213150462,-1.0151606595075532e-5,-1.5107725145640873e-9,0.0019198741582867806,-9.830831037267878e-6,-1.8199155582087304e-9,0.001920048034328906,-9.53810189496491e-6,-2.101716952530784e-9,0.00192016664884815,-9.298985720095432e-6,-2.3317451423285186e-9,0.0019202557299710247,-9.129284586844093e-6,-2.4949779817672822e-9,0.0019203436982262987,-9.03425635494825e-6,-2.5865276762768656e-9,0.0019204586561453517,-9.008766308266697e-6,-2.6114761398253937e-9,0.0019206257964393613,-9.037767379553837e-6,-2.584400459288261e-9,0.0019208647556760669,-9.096934635335611e-6,-2.528749375572851e-9,0.0019211863918376449,-9.153791617985142e-6,-2.475744453410305e-9,0.0019215887893763244,-9.170318069016814e-6,-2.4618619106144695e-9,0.0019220532680969222,-9.108486698013456e-6,-2.5235177511399977e-9,0.0019225426370994027,-8.93968667282501e-6,-2.6880381102716844e-9,0.0019230051437690364,-8.656881355420935e-6,-2.9620064184294193e-9,0.0019233868768198299,-8.284641843373393e-6,-3.321635583237772e-9,0.0019236508865696793,-7.87924983238811e-6,-3.7126811593957043e-9,0.0019237944180940756,-7.513626152701059e-6,-4.064969808739745e-9,0.0019238530642237287,-7.251346875133989e-6,-4.317442787274023e-9,0.0019238875264319904,-7.123184534446885e-6,-4.440727658128514e-9,0.0019239602849499028,-7.118772335068044e-6,-4.445080751689829e-9,0.0019241150340064711,-7.195410187776e-6,-4.3718032484889515e-9,0.0019243672115235493,-7.296057858543114e-6,-4.275859784550209e-9,0.0019247056490780219,-7.366796576870663e-6,-4.209081160263236e-9,0.001925100638222425,-7.368390575798459e-6,-4.2090899838722325e-9,0.0019255136991263675,-7.28124033598263e-6,-4.29459094897082e-9,0.0019259062934330908,-7.105313322498182e-6,-4.465474633111174e-9,0.001926246455241092,-6.8569503429279765e-6,-4.705904064104801e-9,0.001926513155176582,-6.563908504672785e-6,-4.989086595641599e-9,0.0019266984060524598,-6.259565315487143e-6,-5.28285207654197e-9,0.0019268072181901595,-5.977125716265304e-6,-5.555231795710813e-9,0.0019268557194206991,-5.744607949504135e-6,-5.779286983994542e-9,0.001926867956789526,-5.581192829623622e-6,-5.93661711990306e-9,0.0019268720688889452,-5.495252817643273e-6,-6.019245563941074e-9,0.0019268965365545243,-5.483964670467983e-6,-6.029980211505466e-9,0.0019269669147046517,-5.534047865259946e-6,-5.981698489668393e-9,0.0019271030607710645,-5.623188311924287e-6,-5.895977467639949e-9,0.0019273166863302753,-5.7219540024492885e-6,-5.8012471529754476e-9,0.001927608964943563,-5.7963044626612365e-6,-5.730359732741071e-9,0.001927968073137577,-5.811296023443038e-6,-5.716996716285913e-9,0.001928367327868175,-5.736968151573158e-6,-5.789976737812062e-9,0.0019287657529438592,-5.556881102280313e-6,-5.965023129181158e-9,0.0019291137044280984,-5.2780252562612125e-6,-6.235225744033611e-9,0.0019293656129909568,-4.9378508432014095e-6,-6.564293224012181e-9,0.0019294981647026979,-4.601333003765205e-6,-6.88943201632588e-9,0.001929525485728095,-4.342876353937429e-6,-7.138863176862139e-9,0.0019294994801223031,-4.217696588858802e-6,-7.25946537969358e-9,0.0019294908116161604,-4.238299439230228e-6,-7.239417461315074e-9,0.001929560314582812,-4.371015270438031e-6,-7.111424613284696e-9,0.0019297377118852202,-4.55344246107046e-6,-6.935795233464066e-9,0.001930017314096714,-4.719917590952116e-6,-6.775858205910853e-9,0.001930367658027968,-4.821014209853837e-6,-6.679201920416775e-9,0.0019307459008136353,-4.8316120263198285e-6,-6.669947990797228e-9,0.0019311099639047478,-4.749855588336907e-6,-6.749791325681373e-9,0.001931426078730715,-4.591648798416053e-6,-6.903320619292728e-9,0.0019316723240502833,-4.384152509840636e-6,-7.104284083463843e-9,0.00193183957714851,-4.159855661523347e-6,-7.321298468100921e-9,0.0019319309590358179,-3.951522849872863e-6,-7.522721099309414e-9,0.001931960272729608,-3.7879464393165173e-6,-7.680755766459321e-9,0.0019319496225054618,-3.690498897752296e-6,-7.774788967531755e-9,0.0019319263202685097,-3.6706055523742944e-6,-7.793831867149322e-9,0.001931919267959071,-3.7283927164905087e-6,-7.737819257871908e-9,0.0019319552108667095,-3.852716726614077e-6,-7.617573393096083e-9,0.0019320552988749142,-4.02248969024826e-6,-7.453520879166667e-9,0.0019322322171346693,-4.209066647074804e-6,-7.27339092546293e-9,0.0019324880384187753,-4.379522397329557e-6,-7.109051304871561e-9,0.0019328128907126745,-4.5006846976982455e-6,-6.9926006585541975e-9,0.001933184500922892,-4.543960637217014e-6,-6.951680008281516e-9,0.0019335690805746674,-4.491239132575197e-6,-7.0037418708715674e-9,0.0019339247854987158,-4.3417098714221724e-6,-7.149447726110859e-9,0.0019342092422925217,-4.118009382523817e-6,-7.366743932940767e-9,0.0019343916827004838,-3.868204312684253e-6,-7.608992772716862e-9,0.001934467361572726,-3.658733712507117e-6,-7.811866984567964e-9,0.001934467204138646,-3.5553083996379697e-6,-7.911879053399946e-9,0.0019344532495840499,-3.5966460829545584e-6,-7.871776332288663e-9,0.0019344968195731504,-3.7753114217998696e-6,-7.698978894623498e-9,0.0019346495112623097,-4.03947689724567e-6,-7.443761240396356e-9,0.0019349242390860283,-4.315579736048795e-6,-7.177294842177374e-9,0.0019352959799658958,-4.537209508290387e-6,-6.9637480873944295e-9,0.0019357174371195988,-4.664295527601881e-6,-6.8417869033334726e-9,0.0019361376429321514,-4.687227031264865e-6,-6.820621053087697e-9,0.0019365149604292852,-4.620518272556331e-6,-6.886137513437268e-9,0.001936822735002006,-4.4930784615761195e-6,-7.01030959332819e-9,0.0019370497573068866,-4.3395817761451026e-6,-7.159541983283873e-9,0.0019371982714750445,-4.194332245529059e-6,-7.300606086896117e-9,0.0019372813098119841,-4.0872389658178436e-6,-7.404541171072901e-9,0.0019373200047168263,-4.041081596253815e-6,-7.449311969194115e-9,0.0019373408698219712,-4.06951090543502e-6,-7.421751862826817e-9,0.0019373728401152071,-4.175601163817662e-6,-7.318959872347354e-9,0.0019374438984557292,-4.351140097040351e-6,-7.14897163907601e-9,0.0019375773878386295,-4.577090029110529e-6,-6.930294004143148e-9,0.0019377884492321462,-4.8255307456941e-6,-6.690013847281935e-9,0.0019380811458521296,-5.063086450380342e-6,-6.460482833914179e-9,0.0019384468078961414,-5.2556340897116115e-6,-6.274765644942493e-9,0.001938864070694948,-5.373859826780817e-6,-6.161257575262624e-9,0.0019393008815218134,-5.39900090253849e-6,-6.138107237175963e-9,0.0019397185968336869,-5.328108998262378e-6,-6.208094891699568e-9,0.0019400783924782288,-5.178029968915432e-6,-6.3547673684562564e-9,0.001940350064460665,-4.986568248040517e-6,-6.541330751226949e-9,0.0019405222410656135,-4.808507589956162e-6,-6.714561951692604e-9,0.0019406110279473565,-4.704360703335738e-6,-6.815780527851394e-9,0.0019406619186682263,-4.722099909779016e-6,-6.798592282970913e-9,0.0019407397828170951,-4.877341093394415e-6,-6.6480630164182626e-9,0.0019409070239167167,-5.142645237546104e-6,-6.3909979796592525e-9,0.0019411991246476956,-5.455021750594156e-6,-6.08859132515089e-9,0.0019416113591816284,-5.739907638638507e-6,-5.813170806092759e-9,0.0019421039399188788,-5.938379623146413e-6,-5.621848443746926e-9,0.001942620441220814,-6.023358180511173e-6,-5.540825654139379e-9,0.0019431076064300335,-6.000155352616885e-6,-5.564854280690739e-9,0.0019435278468381142,-5.896618797745685e-6,-5.66679479290207e-9,0.0019438629592743444,-5.750852545969404e-6,-5.809548326748877e-9,0.0019441120808416875,-5.601534475667561e-6,-5.955480832384088e-9,0.001944287443752201,-5.482065741624393e-6,-6.072125549617999e-9,0.0019444101506376872,-5.417660736467644e-6,-6.135020234542866e-9,0.001944506708268009,-5.424015514502002e-6,-6.12900103028505e-9,0.0019446061453395735,-5.5065945921930115e-6,-6.048882321230036e-9,0.0019447372317435117,-5.660164219490716e-6,-5.899883466024544e-9,0.0019449253683826993,-5.8687316263243564E-06,-5.6976552684035205e-9,0.001945189030333371,-6.106463427556881e-6,-5.467362321854533e-9,0.001945536161431122,-6.340235377640483e-6,-5.241200084831334e-9,0.0019459613750219223,-6.534129514976202e-6,-5.0540407206024526E-09,0.0019464450016517627,-6.655627092463941e-6,-4.9374385215283745e-9,0.0019469548828858596,-6.682567740270542e-6,-4.912878296775678e-9,0.001947451269570495,-6.60932933283276e-6,-4.985758640608991e-9,0.0019478943525422965,-6.450513493834239e-6,-5.14178782748562e-9,0.0019482532181079584,-6.2407756398245034e-6,-5.347142200685174e-9,0.0019485145355209999,-6.029956846976695e-6,-5.553227818359947e-9,0.001948688832848761,-5.8732962326046545e-6,-5.706255960069141e-9,0.0019488117889920867,-5.817657136586249e-6,-5.76069054929591e-9,0.001948938125527602,-5.886667676818439e-6,-5.69370500652984e-9,0.0019491274075020232,-6.0699856033129015e-6,-5.515569915679763e-9,0.0019494249289553265,-6.3227915401508744E-06,-5.270071903094241e-9,0.001949845257742566,-6.578590377092514e-6,-5.022021831291358e-9,0.0019503668701211755,-6.771379833246088e-6,-4.8356927104913765e-9,0.001950941025999169,-6.857006618888046e-6,-4.754047856449597e-9,0.0019515098360051739,-6.823912357418047e-6,-4.788264987953578e-9,0.0019520240658229982,-6.690500284410137e-6,-4.920280238133386e-9,0.0019524536244067533,-6.49382548244997e-6,-5.113816259747165e-9,0.0019527895094792508,-6.276752315075202e-6,-5.326941081183438e-9,0.0019530401509459683,-6.078332438438705e-6,-5.521497393189113e-9,0.001953225817980965,-5.928567237035448e-6,-5.668236483345585e-9,0.0019533734478342783,-5.84651286102268e-6,-5.74866469745462e-9,0.0019535127069048035,-5.840135760566559e-6,-5.755159455452236e-9,0.0019536730713173847,-5.906707798229399e-6,-5.690546687804252e-9,0.0019538812761171337,-6.033223898987462e-6,-5.567654612994196e-9,0.0019541585144023286,-6.197000707763707e-6,-5.408699430107965e-9,0.0019545171385095907,-6.367107479822374e-6,-5.243879262195881e-9,0.0019549572076320533,-6.5074833444539475e-6,-5.108346058501838e-9,0.0019554639201165612,-6.582363249082454e-6,-5.03694129358835e-9,0.001956007498430186,-6.563809875728904e-6,-5.0568720809815e-9,0.001956546986261798,-6.4398326830353245e-6,-5.179789317621606e-9,0.001957038319601614,-6.220390777973844e-6,-5.3959025305882386e-9,0.001957445211377807,-5.938406346561329e-6,-5.6729623501463044E-09,0.0019577497434098727,-5.6441961139281294e-6,-5.961701088875459e-9,0.00195795905198493,-5.3940117834603315e-6,-6.207071934832427e-9,0.001958105475933685,-5.235595818058769e-6,-6.362420055449834e-9,0.0019582395183540724,-5.194843437985116e-6,-6.402542072145623e-9,0.001958417079498149,-5.267559275761301e-6,-6.331712684108876e-9,0.0019586841391798864,-5.419208397437096e-6,-6.183867152169376e-9,0.0019590632992368684,-5.5936274617679324e-6,-6.0140407497047866e-9,0.0019595468572287758,-5.728796846682779e-6,-5.882943397267424e-9,0.001960099404208329,-5.774659859002328e-6,-5.8395474337831e-9,0.0019606692273000065,-5.706491547132605e-6,-5.908007246472056e-9,0.001961203875844111,-5.5290734820936245e-6,-6.083550911233866e-9,0.001961663710892444,-5.271294504247528e-6,-6.33775249294814e-9,0.0019620291042840325,-4.974990706173587e-6,-6.62948408349352e-9,0.0019623006544432146,-4.683271223898374e-6,-6.916401377222745e-9,0.001962494734377491,-4.432015613971804e-6,-7.163317469825513e-9,0.00196263744876942,-4.24555166449937e-6,-7.3464495352867865e-9,0.001962759151531451,-4.135625053205161e-6,-7.454405906541533e-9,0.0019628903475563684,-4.102163162853727e-6,-7.487397138171459e-9,0.001963058825873597,-4.134581772027361e-6,-7.45591629508366e-9,0.0019632873735704035,-4.2130275752858015e-6,-7.37949782948698e-9,0.001963591384460584,-4.309670509689841e-6,-7.285447272084761e-9,0.001963976034392938,-4.390698571258319e-6,-7.2069014925367394E-09,0.00196443330876546,-4.419933657794488e-6,-7.1793089036528066e-9,0.0019649399761413515,-4.364865771727716e-6,-7.23453490273262e-9,0.001965458415821613,-4.2050069352158806e-6,-7.392670556572303e-9,0.0019659423021510165,-3.940624693125234e-6,-7.653438357820787e-9,0.001966347619651084,-3.5979703831828426e-6,-7.991020087185636e-9,0.001966646410720784,-3.2268073690315724e-6,-8.35646294373238e-9,0.001966837804951861,-2.88866026076316e-6,-8.6892469084276e-9,0.0019669507350560987,-2.638942552458159e-6,-8.93489923720782e-9,0.001967036219204756,-2.509897091168396e-6,-9.061792188439865e-9,0.0019671521102095036,-2.5011703515333097e-6,-9.070385947269845e-9,0.001967346338386762,-2.5810055380569523e-6,-8.992002968155938e-9,0.0019676443316525953,-2.696486676324743e-6,-8.878723391163976e-9,0.0019680437540308916,-2.788602202893239e-6,-8.788584213578214e-9,0.00196851699192739,-2.8074134547524235e-6,-8.77069512204032e-9,0.0019690198105688102,-2.723406029950918e-6,-8.854087293070188e-9,0.001969503286514971,-2.5325606025790628e-6,-9.042705655591e-9,0.0019699255438227234,-2.2545503651888572e-6,-9.317149614451272e-9,0.0019702602048416143,-1.9254253998824907e-6,-9.64186138287465e-9,0.0019704998243126686,-1.587626778063647e-6,-9.974977396460062e-9,0.001970654436207738,-1.2805361083925496e-6,-1.0277671836369529E-08,0.001970746848452303,-1.0338220010957484e-6,-1.0520734387427998e-8,0.001970806813276138,-8.642671882979529e-7,-1.0687691080751363e-8,0.0019708657346138646,-7.754852094272468e-7,-1.0775054263680461e-8,0.001970952685885467,-7.59358064857489e-7,-1.0790873734095068e-8,0.001971091690133412,-7.980785287859418e-7,-1.075270881326718e-8,0.0019712997330186763,-8.661819417994633e-7,-1.0685635082892515e-8,0.001971584912381313,-9.325958251431366e-7,-1.0620251655417039e-8,0.001971944386893563,-9.632389319096306e-7,-1.0590148555848218e-8,0.0019723623172643737,-9.250101036695197e-7,-1.0627989281767547e-8,0.001972808830631805,-7.919702181976068e-7,-1.0759406320346234e-8,0.0019732419679683944,-5.536462457545765e-7,-1.0994779047683153e-8,0.001973614823661226,-2.2335933302557065e-7,-1.1320973812675675e-8,0.0019738884737286657,1.5799990717252462e-7,-1.1697589927724113e-8,0.0019740473224203847,5.280347963458416e-7,-1.2062959771330483e-8,0.00197410928803649,8.20358883314744e-7,-1.2351497457826083e-8,0.001974123317235958,9.877098265902934e-7,-1.251656570489879e-8,0.001974153255924493,1.0192999814429548e-6,-1.2547588496020676e-8,0.0019742556717545824,9.434428611000109e-7,-1.2472576911245205e-8,0.0019744623865517686,8.154180584666158e-7,-1.2346103517772794e-8,0.001974774135226251,6.982018680757243e-7,-1.2230299564424663e-8,0.001975164866836536,6.44800593857355e-7,-1.2177471453811616e-8,0.001975592187135106,6.871905621175031e-7,-1.221921769330186e-8,0.001976009248334955,8.327104581488337e-7,-1.2362852376014084e-8,0.0019763749925609457,1.0663971388143509e-6,-1.259366276420492e-8,0.001976661273607453,1.3571121056137057e-6,-1.2880913658228117e-8,0.0019768563928079714,1.6655158949823804e-6,-1.3185711559255818e-8,0.001976965150873674,1.9522178827619e-6,-1.3469078659361015e-8,0.0019770060231024044,2.1846215565256827e-6,-1.3698753468466588e-8,0.001977006519814771,2.3414551764659016e-6,-1.3853691582153881E-08,0.0019769979445145433,2.4146980122888094e-6,-1.3925966248255384e-8,0.0019770105929741008,2.409217344158514e-6,-1.3920387497226856e-8,0.0019770700502998715,2.340825972519958e-6,-1.3852563760087515e-8,0.0019771946962903715,2.233613597212906e-6,-1.3746268263541514e-8,0.001977394083641216,2.117137695108602e-6,-1.3630691930216664e-8,0.00197766776849491,2.02355937158754e-6,-1.353764934893884e-8,0.0019780043391657534,1.9844130263776497e-6,-1.3498405475263642e-8,0.001978380746958981,2.0264143260061553e-6,-1.353951384539365e-8,0.001978762774876461,2.1656876800633962e-6,-1.3677055583687163e-8,0.00197910834678161,2.4005955486988004e-6,-1.3909478074330424e-8,0.0019793755690996236,2.7052325640155345e-6,-1.4211108687579435e-8,0.0019795358980323765,3.0280329593492748e-6,-1.4530782563116931e-8,0.0019795888602322726,3.3008762468395384e-6,-1.4800926854883546e-8,0.001979569909580966,3.4602522751505376e-6,-1.4958607317158036e-8,0.0019795428292347273,3.4729664075210322e-6,-1.4971007396679774e-8,0.0019795766858330343,3.3517185374406653e-6,-1.485078131230214e-8,0.001979719097725177,3.150012236996182e-6,-1.4650917551003886e-8,0.0019799807430923235,2.939717703579574e-6,-1.4442508997057445e-8,0.001980337179051505,2.785210747885825e-6,-1.4289220607364234e-8,0.001980742604001265,2.726455749296866e-6,-1.423061560237119e-8,0.0019811460867675897,2.7744247605888214e-6,-1.4277633511904348e-8,0.001981503955526798,2.915383589334282e-6,-1.4416788031389436e-8,0.0019817866606374806,3.119072655949307e-6,-1.4618203584318185e-8,0.0019819810541467733,3.3472878569643014e-6,-1.4844069697144964e-8,0.0019820896686203603,3.5612914305410776e-6,-1.5055977587760283e-8,0.00198212818028609,3.7276910519524167e-6,-1.522077511487346e-8,0.0019821217200457113,3.822702343827983e-6,-1.531483119915164e-8,0.001982100526968717,3.8346574475360094e-6,-1.5326546430867445e-8,0.001982095446197697,3.7647342774013897e-6,-1.525707214555077e-8,0.0019821337647565624,3.626027788928867e-6,-1.511936833404366e-8,0.00198223586051072,3.441229396883561e-6,-1.4935887639064302e-8,0.00198241295750562,3.2394074768603723e-6,-1.4735395171384388e-8,0.001982665941468611,3.0524134698759988e-6,-1.4549442314482317e-8,0.0019829850278711707,2.9111670054398966e-6,-1.4408723058841443e-8,0.0019833501452222605,2.841809897117393e-6,-1.4339272286988301e-8,0.0019837320752173157,2.8615334931783054e-6,-1.4358293854803897e-8,0.001984094861776407,2.9738376767734945e-6,-1.4469388182609625e-8,0.001984400625925791,3.163606036205151e-6,-1.465759406565055e-8,0.001984617903763515,3.39387177161666e-6,-1.4886148324894974e-8,0.001984733239124418,3.6078493427449448e-6,-1.5098540495896356e-8,0.001984762586708769,3.740319866084089e-6,-1.522990885918146e-8,0.001984755051949164,3.739151728899739e-6,-1.5228487094580237e-8,0.0019847812506757346,3.589373742862749e-6,-1.507949371776934e-8,0.0019849070018280613,3.324884794977739e-6,-1.481665653780441e-8,0.0019851657075547475,3.017077739740492e-6,-1.4510837813089766e-8,0.001985546337819205,2.7455641756043497e-6,-1.4240999293311826e-8,0.0019860027126962026,2.5689052542741243e-6,-1.4065234505030063e-8,0.001986474911058454,2.5102785475177926e-6,-1.4006586884914449e-8,0.001986909190146146,2.5597820777408202e-6,-1.4055310223533645e-8,0.001987269141598994,2.685729541695863e-6,-1.4180024373601416e-8,0.001987538415975901,2.8470244196991636e-6,-1.4339955147058143e-8,0.0019877184535379826,3.0026745725009918e-6,-1.4494369758932575e-8,0.001987824315689395,3.1178169485181043e-6,-1.4608579499453113e-8,0.0019878803285720108,3.1671431670578377e-6,-1.4657380747630862e-8,0.001987916017903525,3.1367378731829e-6,-1.4626916752757822e-8,0.00198796225735607,3.0248075252962984e-6,-1.4515412078652403e-8,0.001988047562103157,2.8413753222055076e-6,-1.4332850735856531e-8,0.0019881946131477435,2.60687216740141e-6,-1.4099542829987458e-8,0.001988417298411971,2.349527873938127e-6,-1.3843513258288562e-8,0.0019887187102340417,2.1016769841030624e-6,-1.3596844711551368e-8,0.001989090425727029,1.895388778983732e-6,-1.3391377619170956e-8,0.001989513160461744,1.7578895979745178e-6,-1.3254203612054567e-8,0.001989958770446367,1.7071788559904026e-6,-1.3203316404532476e-8,0.001990393534070427,1.7481911434179824e-6,-1.3243755974189393e-8,0.0019907827350952195,1.8697874359525122e-6,-1.336454230925692e-8,0.00199109681028482,2.0431157285996407e-6,-1.3536978415285554e-8,0.001991319151058384,2.222726763531207e-6,-1.371574429721612e-8,0.0019914544946981836,2.3526243150694117e-6,-1.3844968523515149e-8,0.0019915347809361574,2.379086977407752e-6,-1.3871077631016254e-8,0.001991617224389839,2.269346242030513e-6,-1.376144811926663e-8,0.0019917698902892863,2.0294384279911193e-6,-1.3522157951942242e-8,0.0019920466456429435,1.7095202837346074e-6,-1.3203206351826863e-8,0.001992463423863107,1.3885001624897012e-6,-1.288317749571206e-8,0.0019929908638321907,1.143480512993817e-6,-1.2638853847306288e-8,0.0019935682104733686,1.0214708448982725e-6,-1.2517091776224162e-8,0.0019941285130815195,1.0283869976145581e-6,-1.2523846927649901e-8,0.0019946200002937324,1.1365035316745898e-6,-1.2631538348227922e-8,0.001995015574720192,1.300685938679259e-6,-1.2795181679410482e-8,0.0019953118522825736,1.4734595686959486e-6,-1.2967407715671091e-8,0.0019955231121392253,1.6145721408287418e-6,-1.3108023269665573e-8,0.001995674485554681,1.6953207844439172e-6,-1.3188361405392658e-8,0.001995796372307964,1.6996250991069645e-6,-1.3192379686625797e-8,0.0019959203169879858,1.6236696505985474e-6,-1.3116312565503816e-8,0.0019960757921594096,1.475055708754886e-6,-1.2967807444551166e-8,0.0019962873383381975,1.271613814117125e-6,-1.2764702800757431e-8,0.001996571813660661,1.039617664310189e-6,-1.253321173415832e-8,0.001996935876688311,8.10987734279826e-7,-1.2305124592895642e-8,0.0019973742307001037,6.19237649378676e-7,-1.2113796509748371e-8,0.0019978693382533895,4.943937406260044e-7,-1.198913399233764e-8,0.0019983931254425164,4.575767847518032e-7,-1.1952232495962723e-8,0.0019989108215040154,5.162092500765573e-7,-1.2010593106379118e-8,0.0019993866344011147,6.609218430927506e-7,-1.215498240158599e-8,0.001999790531775251,8.650472468204294e-7,-1.2358850045151053e-8,0.0020001051872744658,1.0872195388065961e-6,-1.258086799786539e-8,0.0020003320300538583,1.2774384887276872e-6,-1.2770987731393865e-8,0.0020004948833237455,1.386820963278251e-6,-1.2880238021882123e-8,0.0020006389899060112,1.380409164658492e-6,-1.2873596607745973e-8,0.0020008230599442827,1.250445294729628e-6,-1.2743295658742569e-8,0.0020011035292148414,1.0248522465183068e-6,-1.2517287786395435e-8,0.0020015145004623476,7.642707366236366e-7,-1.2256256246504428e-8,0.002002052224806011,5.444286659134359e-7,-1.203598958625036e-8,0.0020026739455431216,4.2948544136936147e-7,-1.1920745495741174e-8,0.002003313579512777,4.496948714502562e-7,-1.1940890619262743e-8,0.0020039058326337656,5.94885512572639e-7,-1.208630936784008e-8,0.0020044058510690797,8.245709877731227e-7,-1.2316460457905977e-8,0.002004796841439746,1.0859096843776425e-6,-1.2578353220820108e-8,0.0020050868112686674,1.3296101468781744e-6,-1.2822521486441082e-8,0.0020053001577274294,1.5190539612688328e-6,-1.3012215262669332e-8,0.002005469139021302,1.6331027930982382e-6,-1.3126245137314179e-8,0.0020056275325741548,1.6652065850658668e-6,-1.3158091335992063e-8,0.0020058066106900104,1.6211993428942383e-6,-1.3113673482230696e-8,0.0020060325903481888,1.5170686408574125e-6,-1.3009079439298547e-8,0.002006324650222416,1.3769637497429265e-6,-1.2868534813545612e-8,0.0020066929754689877,1.2310800018681066e-6,-1.2722269046986007e-8,0.002007136798951896,1.1127780991151567e-6,-1.2603647647411476e-8,0.0020076429784578894,1.054378781853201e-6,-1.254500526328362e-8,0.002008186099861188,1.081598763449451e-6,-1.2572118807769247e-8,0.0020087311297168646,1.2074288608481698e-6,-1.2698088673752461e-8,0.002009239103287181,1.4270773152031296e-6,-1.2918234760844035e-8,0.0020096752789058284,1.716007875070945e-6,-1.3208055118895744e-8,0.0020100179652990918,2.0326550064858777e-6,-1.352587734554098e-8,0.0020102654993804938,2.3260539621831587e-6,-1.3820486693134687e-8,0.0020104390771972405,2.547030253336762e-6,-1.4042386690680413e-8,0.002010580106295075,2.6604804750482006e-6,-1.4156191902665433e-8,0.0020107419502173964,2.6557832329077294e-6,-1.4151139319925016e-8,0.0020109771879805558,2.5523069324261464e-6,-1.4046647718123685e-8,0.0020113229426591533,2.397375789826293e-6,-1.3890280276741745e-8,0.0020117884211216064,2.2554114694326285e-6,-1.3746841070905745e-8,0.0020123497341117697,2.1898980519676447e-6,-1.3680257875013628e-8,0.002012955651515441,2.2438213886840194e-6,-1.3733900181722728e-8,0.0020135433728180985,2.4266447610087438e-6,-1.39174182558369e-8,0.0020140579317852875,2.71366437476233e-6,-1.4206014604787913e-8,0.0020144668228012324,3.057204948402956e-6,-1.4551671002974376e-8,0.0020147647475891694,3.403199418756304e-6,-1.4899863316082618e-8,0.0020149692079483423,3.7055522989431925e-6,-1.520408419186706e-8,0.00201511150064555,3.9340846123691215e-6,-1.5433892567141782e-8,0.0020152277251075717,4.076173637410506e-6,-1.5576577887703656e-8,0.002015352239871468,4.134536644454852e-6,-1.563490853663456e-8,0.0020155138461719147,4.123692670047893e-6,-1.5623536213635403e-8,0.002015733840614426,4.0666243269108735e-6,-1.55656072328393e-8,0.0020160248674950276,3.992054942875605e-6,-1.549001455038565e-8,0.002016389829459018,3.93198510839712e-6,-1.542893704410032e-8,0.0020168206820040395,3.918765993757011e-6,-1.541493242521958e-8,0.0020172975756185623,3.980985777701276e-6,-1.5476833726911856E-08,0.0020177894153615887,4.137875398081949e-6,-1.5634127210906082e-8,0.002018257233673766,4.392939175307108e-6,-1.589050240627824e-8,0.0020186613266694954,4.728908346737077e-6,-1.6228694079735292e-8,0.0020189715206215524,5.107091194937329e-6,-1.660975065177038e-8,0.0020191776486713324,5.473615092617835e-6,-1.6979292753435012e-8,0.002019295779758033,5.772429950864491e-6,-1.7280651483171656e-8,0.002019366518176988,5.961349214838775e-6,-1.7471108259171236e-8,0.0020194449006417144,6.025194125173232e-6,-1.7535205282025255e-8,0.0020195851788385455,5.980999551576999e-6,-1.7490022440756466e-8,0.0020198257279237858,5.873603143711555e-6,-1.7380744515888384e-8,0.0020201787279912464,5.763467291729197e-6,-1.7268403150332105e-8,0.002020627231636164,5.710627551405569e-6,-1.7213706810198902e-8,0.002021130054639501,5.7592346508056935e-6,-1.7261429057047976e-8,0.002021632985760314,5.926817997082376e-6,-1.7429501306651574e-8,0.0020220830928120654,6.20118699778434e-6,-1.7705783145695567e-8,0.0020224418380563767,6.54565640069781e-6,-1.8053264624984565e-8,0.002022693062944097,6.910491614078083e-6,-1.842162169656846e-8,0.0020228439203432147,7.246330768272015e-6,-1.876083414523109e-8,0.00202291967499455,7.515105216752511e-6,-1.9032294027402762e-8,0.002022955371584404,7.695808702277565e-6,-1.9214681031198905e-8,0.0020229876289183193,7.785067752112486e-6,-1.9304540519772036e-8,0.002023048591573068,7.794246700981407e-6,-1.931333154928886e-8,0.0020231624980154585,7.745203409912733e-6,-1.926311028183914e-8,0.0020233442466032186,7.666212202219833e-6,-1.918240528759956e-8,0.0020235989734061375,7.588624354679677e-6,-1.9102866270263047e-8,0.002023921859131006,7.544034825291021e-6,-1.9056442936228402e-8,0.0020242978850773183,7.561308638331777e-6,-1.907241483206435e-8,0.0020247018586647472,7.662755338235264e-6,-1.9173526603769192e-8,0.0020250996748987574,7.859045107714878e-6,-1.9370801266084847e-8,0.0020254522736660083,8.143408211325172e-6,-1.9657586738974178e-8,0.0020257235021321623,8.487284167289417e-6,-2.0005064388235096e-8,0.0020258914008579325,8.841089839559924e-6,-2.0362983469746076e-8,0.0020259593522022504,9.143502782538063e-6,-2.0669092452411597e-8,0.002025960886878649,9.339097586877438e-6,-2.0867079499950275e-8,0.0020259529258870486,9.398254944606137e-6,-2.0926796085751366e-8,0.0020259980842913805,9.329515946722925e-6,-2.085676872498728e-8,0.0020261436498098338,9.177436067364245e-6,-2.0702003689784143e-8,0.002026406976788043,9.007145260904893e-6,-2.0528373390696197e-8,0.0020267726311981303,8.883574211806648e-6,-2.0401649057662443e-8,0.002027200045442295,8.85396367750792e-6,-2.0369837232274553e-8,0.00202763668051562,8.938366466169523e-6,-2.0453528387901555e-8,0.002028031669042613,9.128606584898225e-6,-2.0644735364591285e-8,0.0020283466335991557,9.39376249959402e-6,-2.0912327645621907e-8,0.00202856210099846,9.689503075361093e-6,-2.121142268331872e-8,0.002028679138809268,9.968698912730516e-6,-2.1494151041399055e-8,0.0020287166795685033,1.0191047732068404e-5,-2.1719481725996414e-8,0.0020287057358542504,1.0329897581158466e-5,-2.186021727137697e-8,0.0020286822638829623,1.0375287950705e-5,-2.1906123600102078e-8,0.0020286804677956084,1.0333353870444897e-5,-2.186332802988044e-8,0.0020287278066525257,1.022312602899354e-5,-2.175105158087606e-8,0.0020288421647846723,1.0072112218170743e-5,-2.1597111262225863e-8,0.0020290308875681577,9.911875842701016e-6,-2.143344844153332e-8,0.0020292909665944156,9.774243576700235e-6,-2.129232494824514e-8,0.0020296097239808366,9.688113323346603e-6,-2.1203133387480477e-8,0.0020299656877050217,9.67644684934271e-6,-2.11893658424898e-8,0.0020303297882378582,9.752905982662366e-6,-2.1265165055571597e-8,0.0020306676073327287,9.917766980710009e-6,-2.1431087980682735e-8,0.002030943934628873,1.0153584998504719e-5,-2.1669593622508353e-8,0.0020311306708723493,1.0422590466425067e-5,-2.1942323425636325e-8,0.002031217579951732,1.0669289798588603e-5,-2.219275019954811e-8,0.002031222335730858,1.0831796516238949e-5,-2.235778014634001e-8,0.002031193048301995,1.0861890930176747e-5,-2.2388241959551486e-8,0.00203119703859634,1.0746492481003186e-5,-2.2270735146629827e-8,0.002031297195154339,1.0517768776177442e-5,-2.2037844471414716e-8,0.0020315273094421984,1.0243291108028e-5,-2.1758092239078608e-8,0.0020318802493412753,1.0000530434740792e-5,-2.1510081000851584e-8,0.002032314137298937,9.850022664826762e-6,-2.1355340836590286e-8,0.002032770207259545,9.81982278786599e-6,-2.132258299426645e-8,0.0020331917199350323,9.904280503784482e-6,-2.14063888568104e-8,0.002033536949342053,1.0072489993620747e-5,-2.157566092331201e-8,0.0020337847861032054,1.0280151984724976e-5,-2.178555756437125e-8,0.002033934644404204,1.0480633734434917e-5,-2.1988684509594312e-8,0.002034002956023895,1.0633476288885205e-5,-2.2143773497299168e-8,0.0020340179562521273,1.0710065550269308e-5,-2.222152752762457e-8,0.002034013813275749,1.0696609639052564e-5,-2.2207730651406188e-8,0.002034024860105363,1.0594604521297306e-5,-2.2103765848150748e-8,0.002034080587443095,1.0419122419825089e-5,-2.19248717814829e-8,0.0020342019278727854,1.0195455518673118e-5,-2.169670062200928e-8,0.0020343991620295483,9.954802844166271e-6,-2.145091239995425e-8,0.0020346714321390342,9.729785129053017e-6,-2.122063084652677e-8,0.0020350074824118905,9.550386709694598e-6,-2.103636451097717e-8,0.002035387185509016,9.440493583899565e-6,-2.0922533216016104e-8,0.0020357836037984364,9.414912608424384e-6,-2.089444107511516e-8,0.0020361655489376162,9.476655420791237e-6,-2.0955452598258494e-8,0.002036501001353076,9.614310232276557e-6,-2.1094206564680248e-8,0.002036762210872142,9.79994037620005e-6,-2.1282363869390327e-8,0.0020369330481708123,9.989184837192771e-6,-2.1474658477092256e-8,0.002037017771296381,1.012628359366276e-5,-2.1614061269663444e-8,0.002037047915437464,1.015658110540848e-5,-2.164463677168314e-8,0.0020370813026867737,1.0046056108125668e-5,-2.153154985964805e-8,0.0020371875508600258,9.800650799576031e-6,-2.1280773292665346e-8,0.002037421936656467,9.472336381754918e-6,-2.094520101904596e-8,0.0020378005857027153,9.143072453333508e-6,-2.0608270685343048e-8,0.0020382928899801513,8.892876275813154e-6,-2.035149508235166e-8,0.0020388358398022157,8.770499811406708e-6,-2.0224669132370346e-8,0.002039359770557812,8.781941663669052e-6,-2.0234157130035133e-8,0.0020398103504522254,8.897729739466089e-6,-2.0350211586612295e-8,0.0020401588643933475,9.069382952218172e-6,-2.0523629149456965e-8,0.0020404019625274035,9.245293559122839e-6,-2.0701866584475123e-8,0.002040555827693921,9.381504609670853e-6,-2.0840025781472896e-8,0.0020406489259659406,9.447228151930216e-6,-2.0906536788607898e-8,0.0020407154331214734,9.426696770852405e-6,-2.088512838607746e-8,0.00204078985578392,9.318873354513713e-6,-2.077459998128169e-8,0.00204090271395194,9.135845367544504e-6,-2.0587206452044835e-8,0.0020410771407216085,8.900239108317796e-6,-2.034599700431967e-8,0.002041326419699712,8.641807325844239e-6,-2.0081292128129632e-8,0.0020416526435947345,8.393337339943669e-6,-1.982648942593215e-8,0.002042046703171445,8.186237577472187e-6,-1.9613586261310882e-8,0.0020424895896427346,8.046339142518472e-6,-1.9468954219893878e-8,0.0020429547843234747,7.990305000968632e-6,-1.940972395069631e-8,0.0020434115251253306,8.022843551834938e-6,-1.9440936885743926e-8,0.002043828782565443,8.134892448156656e-6,-1.9553616311880043e-8,0.0020441798602190554,8.302917025788585e-6,-1.972393223071845e-8,0.0020444477519546617,8.4896969525292e-6,-1.9913901817449882e-8,0.0020446311903293338,8.647706547103258e-6,-2.0074815114312748e-8,0.0020447501973034107,8.726723226422148e-6,-2.0155077328217368e-8,0.002044848244940901,8.686627904246379e-6,-2.011341515541943e-8,0.0020449867383772256,8.513737749746249e-6,-1.9935671842505055e-8,0.002045228541166259,8.234144633017872e-6,-1.964846070320371e-8,0.0020456134638839763,7.913572361465218e-6,-1.931898185881672e-8,0.0020461377861319533,7.63729312921591e-6,-1.9034476270744172e-8,0.0020467521585061633,7.477202828544634e-6,-1.8868592712503943e-8,0.002047381272856939,7.464688941483806e-6,-1.8853644549237028e-8,0.0020479532062943314,7.58431837206364e-6,-1.8974080315531745e-8,0.0020484215587382487,7.78774400789283e-6,-1.918060677428675e-8,0.0020487722662357426,8.015405362121847e-6,-1.941233147259879e-8,0.002049018198077936,8.214197838192044e-6,-1.9614843383185996e-8,0.0020491889216315115,8.346735295295853e-6,-1.9749735808637718e-8,0.0020493210512069144,8.393632060507522e-6,-1.979700451228811e-8,0.0020494512449664246,8.351957607960816e-6,-1.9753525015406534e-8,0.0020496117250101715,8.23232744734854e-6,-1.963010652990153e-8,0.002049827426776408,8.055769435622714e-6,-1.944827439536342e-8,0.002050114053526486,7.850558869214728e-6,-1.9236989441846953e-8,0.0020504767490431433,7.648847136675355e-6,-1.9029157282885984e-8,0.0020509094756088818,7.482854532348159e-6,-1.8857725613841873e-8,0.002051395453334524,7.380623768682452e-6,-1.8751377321085998e-8,0.0020519090052662243,7.361760387571575e-6,-1.8730230620980626e-8,0.0020524188593675297,7.433818308990292e-6,-1.8802173480598776e-8,0.0020528926844391848,7.589950602549962e-6,-1.8960428834936324e-8,0.0020533024421489844,7.808390524123514e-6,-1.9182928498524213e-8,0.0020536299340462158,8.054192913403938e-6,-1.9433978306497595e-8,0.0020538718361486044,8.283434195619361e-6,-1.9668482974938482e-8,0.0020540434289632683,8.45004521906672e-6,-1.9838956797592828e-8,0.0020541797514216247,8.515402796906978e-6,-1.99054534057615e-8,0.0020543322054149753,8.459930706160225e-6,-1.984759651675978e-8,0.0020545585952090927,8.293944827313858e-6,-1.9675807879402267e-8,0.0020549063810787,8.062431097372e-6,-1.9436246264897823e-8,0.0020553934153247633,7.837497117823304e-6,-1.920304947832446e-8,0.002055995700465939,7.696451661454231e-6,-1.9055809090821722e-8,0.002056651811353018,7.693154521324639e-6,-1.9050112336143213e-8,0.0020572846695030584,7.837818600247798e-6,-1.919671296351236e-8,0.002057829365555983,8.096658859821898e-6,-1.946106441052887e-8,0.002058252145844519,8.409493816274429e-6,-1.978134730901258e-8,0.0020585536030746266,8.712990432294358e-6,-2.0092375696100318e-8,0.002058759808669095,8.957877739096902e-6,-2.0343349339844396e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json new file mode 100644 index 0000000..4dcccb3 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":17000,"numberOfSamples":1000,"samples":[0.0020589095356776037,9.116105504093818e-6,-2.0505272164235435e-8,0.002059043510293161,9.180255067418492e-6,-2.0570390059257767e-8,0.0020591976431414568,9.159302745262173e-6,-2.054785882824188e-8,0.002059399625909375,9.073759899582225e-6,-2.045874721325323e-8,0.0020596674746746844,8.95148439515232e-6,-2.033170765436402e-8,0.00206000888513569,8.824207938457376e-6,-2.019937465729761e-8,0.002060420904195782,8.724308617167852e-6,-2.0095032184184587e-8,0.0020608899779143205,8.68132520947309e-6,-2.0049049012491025e-8,0.0020613928365786132,8.717972919315283e-6,-2.008482719556681e-8,0.0020618988348358,8.845955809078727e-6,-2.021453482958727e-8,0.002062374125258358,9.062441716260134e-6,-2.0435474508193457e-8,0.0020627874895708226,9.348364762479418e-6,-2.072826871336509e-8,0.0020631169945883126,9.669654112154566e-6,-2.1058015950605946e-8,0.0020633560604633263,9.98198746864013e-6,-2.137908652587735e-8,0.002063517288428266,1.023877017749716e-5,-2.164330411583651e-8,0.002063632645942536,1.0401139220424818e-5,-2.1810299545772995e-8,0.0020637491502467223,1.0448183572471843e-5,-2.185815206205818e-8,0.0020639198525462597,1.0385066085844465e-5,-2.1791885352537092e-8,0.002064190922547863,1.0246206042140799e-5,-2.1646843352671344e-8,0.002064587291919049,1.0090636415679369e-5,-2.1483949591921145e-8,0.0020651014652658243,9.988078798241432e-6,-2.13753442005915e-8,0.002065691367589172,9.998026570269695e-6,-2.1382754626188622e-8,0.002066291012197917,1.0149230388591655e-5,-2.153622147579785e-8,0.002066831501387849,1.0429452683376921e-5,-2.182338975756979e-8,0.002067263169333099,1.0791237145000513e-5,-2.2195367611649683e-8,0.002067568557615017,1.1170401662074308e-5,-2.2585814103541868e-8,0.0020677618994642912,1.1507219742502304e-5,-2.2932879418767003e-8,0.0020678786593962845,1.1760992660056131e-5,-2.319433420100162e-8,0.00206796228678175,1.1914801500387303e-5,-2.3352529680849556e-8,0.0020680536670884195,1.1972789302221374e-5,-2.3411612372762594e-8,0.002068185083895209,1.1954165594086708e-5,-2.339133460421787e-8,0.0020683778972125345,1.1887104070253944e-5,-2.3320744180844544e-8,0.002068642307553408,1.180390121082168e-5,-2.3233173740066774e-8,0.002068977856263579,1.1737393814191125e-5,-2.3162537647244684e-8,0.002069373999389383,1.1717978706675388e-5,-2.3140267827765654e-8,0.0020698107873335274,1.1770514429890422e-5,-2.3192140613020073e-8,0.0020702602014525747,1.1910715973072524e-5,-2.3334573248691355e-8,0.002070688939508567,1.2141252692424613e-5,-2.3570578997251697e-8,0.0020710632916822844,1.2448527390387745e-5,-2.3886375187523575e-8,0.002071356066541742,1.2801803268012288e-5,-2.4250382510760558e-8,0.0020715543319876706,1.3156451701310057e-5,-2.4616491549786515e-8,0.00207166551766087,1.3462116971780244e-5,-2.493246716960177e-8,0.002071719050649512,1.3674624989544023e-5,-2.5152297788431047e-8,0.0020717617377544535,1.3768431742533288e-5,-2.524915847137308e-8,0.0020718472574079074,1.374550081599251e-5,-2.5224700784713937e-8,0.0020720223622184525,1.363727582508806e-5,-2.5111195478472052e-8,0.0020723137031515636,1.3498471162329926e-5,-2.496519243244624e-8,0.002072719191338335,1.339381780152275e-5,-2.485385332221292e-8,0.002073206795757431,1.338096643139214e-5,-2.483723759380846e-8,0.0020737219362692,1.3494245133198445e-5,-2.4951381108780162e-8,0.00207420211020392,1.373455339359368e-5,-2.5197661804572466e-8,0.0020745944143773383,1.4069430089365293e-5,-2.554271199173207e-8,0.002074869746023746,1.4443723774723879e-5,-2.5929405831806994e-8,0.0020750285128816304,1.479667972622433e-5,-2.6294607590510123e-8,0.0020750966176363173,1.5078544268788864e-5,-2.6586483364644268e-8,0.0020751148669499956,1.5260889492796408e-5,-2.677529701011583e-8,0.0020751270004247535,1.5338783722705668e-5,-2.6855711891848633e-8,0.0020751704833224575,1.5326746513909972e-5,-2.684261106263222e-8,0.0020752715762822763,1.5251984116094389e-5,-2.6764080409271047e-8,0.002075444009124103,1.5147762629496005e-5,-2.6654533703698157e-8,0.002075689729548116,1.504827746606285e-5,-2.6549398220846943e-8,0.002076000366210549,1.4985082629739757e-5,-2.6481430881895264e-8,0.002076358657231711,1.498441301720375e-5,-2.6477967033587838e-8,0.0020767397992757677,1.5064587977735741e-5,-2.6558240543651232e-8,0.002077113259954405,1.5233004156103975e-5,-2.6730240753699176e-8,0.0020774459186594374,1.548284453443912e-5,-2.6987226620384064e-8,0.002077707337417931,1.5790500049088474e-5,-2.7304945193864276e-8,0.002077877261826839,1.6115682164498162e-5,-2.764165309505029e-8,0.0020779538822941765,1.6406603632449e-5,-2.7943458192743133e-8,0.0020779594398716464,1.6611353072832964e-5,-2.8156170195329946e-8,0.0020779390055978278,1.6693382219093287e-5,-2.824146792653341e-8,0.0020779502913158923,1.6645409426593984e-5,-2.8191416586278918e-8,0.002078046844161103,1.6494938438233428e-5,-2.803425405045996e-8,0.0020782610782756087,1.6297779276038386e-5,-2.782772424649056e-8,0.0020785941150732565,1.612175588363035e-5,-2.7642241561896423e-8,0.0020790159587568842,1.6027141518751153e-5,-2.754063775278662e-8,0.0020794748756735038,1.6050743503202965e-5,-2.756160492638588e-8,0.0020799118940896845,1.619791239208086e-5,-2.7711253577368164e-8,0.0020802757626315633,1.6443513592555717e-5,-2.7963924844698012e-8,0.0020805345246273253,1.674043522617959e-5,-2.8270877063799093e-8,0.002080681226938013,1.7032634096537527e-5,-2.857380300224129e-8,0.002080732951995497,1.7268943244941685e-5,-2.881925151534997e-8,0.002080724194408864,1.7413982316484317e-5,-2.8970092565580946e-8,0.0020806971435383278,1.745367834708195e-5,-2.901136620869484e-8,0.0020806920260737966,1.7394912621893336e-5,-2.8949975367327408e-8,0.002080739988704213,1.72607815502705e-5,-2.8809768850635676e-8,0.002080859515267317,1.70838985357426e-5,-2.8624560861473263e-8,0.0020810559636607064,1.6899885539921436e-5,-2.8431349761988563e-8,0.0020813230557203376,1.6742274751481572e-5,-2.8265022453786016e-8,0.0020816451171855417,1.6639033795220282e-5,-2.8154767386943654e-8,0.0020819993189068113,1.6610203007369465e-5,-2.812164312243963e-8,0.0020823577851628115,1.6665911699555345e-5,-2.817650914736122e-8,0.0020826899633292987,1.680426930790959e-5,-2.8317770861029884e-8,0.002082966018551884,1.7009150846059025e-5,-2.852896394235378e-8,0.002083162073066397,1.7248756752608075e-5,-2.8777135556946513e-8,0.0020832674579102563,1.7476932878513038e-5,-2.9014151463292816e-8,0.0020832924694833593,1.7639846001218737e-5,-2.9183675584427234e-8,0.0020832727739094805,1.7689422424584678e-5,-2.9235274256026354e-8,0.0020832653064138955,1.7601030960855478e-5,-2.9142946193151746e-8,0.0020833330245630757,1.7387646058308056e-5,-2.8919920603682593e-8,0.002083522753935488,1.7100955802243916e-5,-2.8619808329920083e-8,0.0020838468179513333,1.6815710705222776e-5,-2.8320330725747508e-8,0.002084278439419095,1.6604039049236554e-5,-2.8096659219011013e-8,0.0020847625566020353,1.6512511531122853e-5,-2.799759622144117e-8,0.002085235023267062,1.6551414097566436e-5,-2.8034351982823543e-8,0.0020856408987005555,1.6697366798988196e-5,-2.8183104552679034e-8,0.0020859461245631033,1.690450794263447e-5,-2.8396456266918066e-8,0.0020861415082864985,1.7118421130651345e-5,-2.8617819915088376e-8,0.0020862405867537945,1.7288696492304295e-5,-2.8794501922373435e-8,0.0020862736330299575,1.737809826474195e-5,-2.8887350772104285e-8,0.002086279804006059,1.7367702998098975e-5,-2.8876251011356654e-8,0.0020862990421835854,1.7258011428210435e-5,-2.8761400589556528e-8,0.002086365115922038,1.7066487746353264e-5,-2.8560802190087286e-8,0.0020865008408489875,1.682256943694604e-5,-2.8305053907286174e-8,0.002086715919263949,1.656156014476701e-5,-2.8030941270095572e-8,0.0020870071990390262,1.6318714925791584e-5,-2.7775237638634485e-8,0.0020873606761909773,1.612444436636325e-5,-2.7569706696292268e-8,0.0020877543487093165,1.6001012803300085e-5,-2.7437694306513178e-8,0.0020881612220372825,1.596050578626689e-5,-2.7392040420271822e-8,0.002088552230288847,1.6003549082607828e-5,-2.7433729548710437e-8,0.0020888992435952967,1.611837191802468e-5,-2.7550832366391624e-8,0.0020891786471092483,1.6280160651193357e-5,-2.7717702617435652e-8,0.0020893761169842166,1.6451350603092855e-5,-2.7895164399045403e-8,0.002089492678959948,1.6584503687808136e-5,-2.803347849401429e-8,0.0020895506186168747,1.6629975070205594e-5,-2.8080421596796448e-8,0.0020895956639829702,1.654957839540818e-5,-2.799570583593579e-8,0.002089690395538273,1.6333804471878623e-5,-2.7769090685971695e-8,0.002089896033722322,1.6014373257708863e-5,-2.7433529126734662e-8,0.0020902475806469254,1.5661140369289124e-5,-2.7061908434893643e-8,0.002090735796633609,1.5359270098771867e-5,-2.67432120407e-8,0.00209130859780546,1.5176778132377433e-5,-2.6548672939580005e-8,0.002091891842946931,1.5140754055244766e-5,-2.6506954770801897e-8,0.0020924165245282877,1.5233761825979138e-5,-2.660030176659009e-8,0.002092838108888907,1.5407435049015967e-5,-2.6778581186473033e-8,0.0020931426145603437,1.5602073463539797e-5,-2.697961713028947e-8,0.002093342524197185,1.576303163752042e-5,-2.7146256028244872e-8,0.0020934681224012187,1.5850536534203465e-5,-2.7236664035016808e-8,0.002093558330924372,1.584356238962605e-5,-2.7228488040135843e-8,0.002093652929189025,1.5739702587511593e-5,-2.711885649216876e-8,0.002093786585558144,1.5552692842214613e-5,-2.6921891528832596e-8,0.002093984610700063,1.530847635566744e-5,-2.6664625730728237e-8,0.002094260408522702,1.5040327883243397e-5,-2.6381866829385993e-8,0.0020946146605398033,1.4783590396206654e-5,-2.6110629573656682e-8,0.0020950361908124754,1.4570612940870071e-5,-2.5884801421741135e-8,0.002095504287982403,1.4426464136665532e-5,-2.573066979561237e-8,0.0020959920098880948,1.436589162782448e-5,-2.566378974830331e-8,0.0020964698904481064,1.4391654082877689e-5,-2.568727581986414e-8,0.002096909672107035,1.4494027260271335e-5,-2.5791262682142066e-8,0.002097287955238897,1.4651254484391914e-5,-2.595327902709219e-8,0.0020975898588619776,1.483086589384205e-5,-2.6139490483611765e-8,0.0020978129239909112,1.4992194433574303e-5,-2.6307227096703933e-8,0.002097971126731232,1.5091109530391926e-5,-2.6409931481351222e-8,0.002098097703998993,1.5088284225384236e-5,-2.6405927211233465e-8,0.002098243998954342,1.4961356647547054e-5,-2.6271336291410024e-8,0.002098470643735973,1.4718558663920096e-5,-2.601451060716538e-8,0.002098829142769062,1.4406847413029446e-5,-2.568461021728266e-8,0.002099338584112944,1.4104891981013634e-5,-2.5364227738068856e-8,0.002099970577078888,1.389718581053549e-5,-2.51422113367583e-8,0.0021006554024350413,1.3839945599057747e-5,-2.5077873022135188e-8,0.0021013089162565824,1.3939075366767634e-5,-2.5177804466452004e-8,0.0021018642410454017,1.4152966541286029e-5,-2.5398697748388907e-8,0.002102290544234685,1.4414719463911722e-5,-2.5670555129297722e-8,0.002102593458372229,1.4657717276490355e-5,-2.5923475251490083e-8,0.002102803823419274,1.4832523419603329e-5,-2.610539494337901e-8,0.002102963997051854,1.4912874042482475e-5,-2.6188440763515092e-8,0.00210311701985688,1.489429901720448e-5,-2.6167581509441245e-8,0.00210329981316489,1.4789514144286761e-5,-2.605589711490424e-8,0.0021035395604685125,1.4623216960515582e-5,-2.5879181897882027e-8,0.002103852012857229,1.4427256816148642e-5,-2.5670874573032203e-8,0.0021042409306866908,1.4236166858646234e-5,-2.546731313778813e-8,0.002104698454320543,1.4082882456060734e-5,-2.53031751996881e-8,0.0021052064752133293,1.3994654154339699e-5,-2.5207158431920774e-8,0.0021057391315831625,1.3989407920046565e-5,-2.519818244598461e-8,0.002106266387320575,1.4073050130678136e-5,-2.5282607415599342e-8,0.002106758334830071,1.423820083636465e-5,-2.5452924691916057e-8,0.0021071897012097697,1.4464569256647e-5,-2.568810271807864e-8,0.0021075440763852053,1.4720984983073159e-5,-2.5955605114652786e-8,0.002107817455023985,1.4968991587208612e-5,-2.6215033812032676e-8,0.0021080207898770947,1.5167881763610569e-5,-2.6423345985019315e-8,0.0021081811782254606,1.52812712911579e-5,-2.6541802838830476e-8,0.002108340721814446,1.5285367127017497e-5,-2.6544815228638046e-8,0.002108551393130802,1.5178224387244792e-5,-2.6429882679400344e-8,0.0021088642657054028,1.4987405902763008e-5,-2.6225817522741596e-8,0.0021093131823441873,1.477109413125047e-5,-2.5993980396136906e-8,0.0021098973634679687,1.4606796678395606e-5,-2.5816350529623914e-8,0.0021105729078048107,1.4566334520348138e-5,-2.5769076832392603e-8,0.0021112628777701157,1.4686483996552583e-5,-2.589140375989459e-8,0.002111884963727069,1.49524858304974e-5,-2.616814292368397e-8,0.0021123820416213326,1.530564027223351e-5,-2.653758083888853e-8,0.002112738443062604,1.566943862865359e-5,-2.6919021383359056e-8,0.0021129763380782042,1.597734406587063e-5,-2.7242128079128386e-8,0.002113139906608551,1.6188913189144726e-5,-2.7463982116337144e-8,0.0021132785147635735,1.6292255587917617e-5,-2.7571731956963736e-8,0.002113435244892276,1.6298231436790853e-5,-2.7576542617677282e-8,0.002113641467647694,1.623231108640538e-5,-2.750507948119659e-8,0.0021139155020888497,1.612742596429646e-5,-2.739200662875825e-8,0.002114263195353226,1.601868102419684e-5,-2.7274398004963558e-8,0.002114679097938746,1.5939462619916927e-5,-2.7187584649230205e-8,0.002115147857818045,1.591820498712063e-5,-2.7161697731839154e-8,0.0021156460082405507,1.5975354031712748e-5,-2.7218453269601503e-8,0.0021161445333496127,1.6120489838517026e-5,-2.736813658476198e-8,0.002116612541248858,1.6350066999505276e-5,-2.7607239032229045e-8,0.002117021983644663,1.6646569377117553e-5,-2.791754490148783e-8,0.002117352837098394,1.697979911393296e-5,-2.826741083990463e-8,0.0021175978015787107,1.731065634053247e-5,-2.8615637817191073e-8,0.00211776543378165,1.759725263509948e-5,-2.8917829165943654e-8,0.002117880769420787,1.7802584133189674e-5,-2.9134478291953385e-8,0.002117982886203447,1.7902584529889876e-5,-2.9239569317390042e-8,0.002118119198387002,1.7893289828263934e-5,-2.922832774864068e-8,0.002118336487991736,1.7795584944785858e-5,-2.9122440610658274e-8,0.0021186692843823997,1.7655389538035962e-5,-2.8970402749374115e-8,0.0021191276345471233,1.7536852324466382e-5,-2.8840362727093884e-8,0.0021196884143433207,1.7507199823531867e-5,-2.880401634238384e-8,0.002120295925762307,1.7615411346021366e-5,-2.8913861014445143e-8,0.0021208758106100725,1.787247903713528e-5,-2.9182079529307654e-8,0.002121359406182991,1.8244267405424016e-5,-2.9572807067690778e-8,0.0021217074721560777,1.8663209769622012e-5,-3.0014474124992184e-8,0.0021219209004431955,1.905356541542978e-5,-3.042663828206199e-8,0.0021220343298265485,1.9356536768551152e-5,-3.0746705244532125e-8,0.002122099166839674,1.954377814105041e-5,-3.094431491310143e-8,0.002122166330543905,1.9617217855782224e-5,-3.102119259421685e-8,0.0021222752180405586,1.9600531064406503e-5,-3.100215517299388e-8,0.002122449658514504,1.952878967527067e-5,-3.092419165467688e-8,0.0021226984612435964,1.9440127761138346e-5,-3.082765962692926e-8,0.002123017846957808,1.9370314072744265e-5,-3.075052790344494e-8,0.0021233940681903195,1.934948928989278e-5,-3.0724888774326296e-8,0.0021238056794888474,1.9399952935627528e-5,-3.077458440678296e-8,0.002124225682580438,1.9534193054597844e-5,-3.091310551719368e-8,0.002124624113565031,1.9752886458047202e-5,-3.1141464105636413e-8,0.002124971655833702,2.0043233580223036e-5,-3.144639940286134e-8,0.00212524450155675,2.037859705176521e-5,-3.179992728445566e-8,0.002125429949440885,2.0720660307119964e-5,-3.216153381034379e-8,0.0021255313735390655,2.1024952911718785e-5,-3.2483951488909524e-8,0.0021255706390746042,2.1249553405534983e-5,-3.272236244662322e-8,0.0021255862274255134,2.136531580176944e-5,-3.284530096658392e-8,0.002125626472329969,2.136477599867833e-5,-3.2844230643420137e-8,0.0021257389764561077,2.1266765123494018e-5,-3.273861136499655e-8,0.0021259586471253046,2.1114766388613177e-5,-3.2574325849611996e-8,0.0021262973922635143,2.0968604798671925e-5,-3.241497651320302e-8,0.0021267384416393392,2.0890666115759917e-5,-3.2327268627746654e-8,0.0021272376715695132,2.0929425811587144e-5,-3.236339970670092e-8,0.002127733046172089,2.110460424404699e-5,-3.2545061768599696e-8,0.00212816092546539,2.1399236109442378e-5,-3.2854762929754035e-8,0.0021284746737500223,2.176302809822261e-5,-3.3239236614057686e-8,0.002128658496133636,2.212740460159936e-5,-3.362543623506609e-8,0.0021287304336883744,2.2426834845535454e-5,-3.3943333219980947e-8,0.0021287335646911943,2.2617434207905126e-5,-3.414584047635682e-8,0.0021287204228760234,2.2685679731977404e-5,-3.421817395035784e-8,0.0021287380406940413,2.264602236182866e-5,-3.417535947240264e-8,0.002128818715188701,2.2531501692113913e-5,-3.4052283410800604e-8,0.002128977344015476,2.2382911676892006e-5,-3.3892197642410027e-8,0.002129213263803856,2.2240213464310166e-5,-3.373760006185234e-8,0.0021295139322477768,2.2137245808817076e-5,-3.362460002842891e-8,0.0021298586205894944,2.2099046795842652e-5,-3.358004972356987e-8,0.0021302214146577676,2.2140545104573738e-5,-3.362013028869592e-8,0.0021305737006618716,2.2265607580957118e-5,-3.374931398457121e-8,0.0021308867762918587,2.2466010723704024e-5,-3.39592257518173e-8,0.002131135293920836,2.2720594046935103e-5,-3.4227667717305434e-8,0.0021313019334212695,2.2995565753170124e-5,-3.451884933521096e-8,0.0021313829342262734,2.3247460182788705e-5,-3.4786456209133385e-8,0.0021313929103826883,2.3430080081429465e-5,-3.4981018338903236e-8,0.0021313662623369065,2.35053775592328e-5,-3.506154647311194e-8,0.002131352534668617,2.3455775394926864e-5,-3.500875472352498e-8,0.0021314050619435174,2.3293157757724045e-5,-3.483475480248656e-8,0.0021315656878382726,2.305959461858975e-5,-3.458394904972025e-8,0.002131851148769884,2.2817817875395575e-5,-3.432300884872676e-8,0.002132246675708553,2.2634145895239077e-5,-3.412278123476084e-8,0.0021327093056224787,2.255991732479814e-5,-3.4038512859965103e-8,0.0021331794386085386,2.261762912569421e-5,-3.4094941293936804e-8,0.002133596614516856,2.2795606804280943e-5,-3.4280365800889207e-8,0.0021339148569076657,2.3052078776754165e-5,-3.455073970041519e-8,0.0021341135296762083,2.3327034579694484e-5,-3.484217778475803e-8,0.0021342009716787884,2.355832491670355e-5,-3.508814955727273e-8,0.0021342101969445745,2.3697300658380293e-5,-3.523629751598651e-8,0.0021341884075972216,2.3719450332254015e-5,-3.525994944230765e-8,0.002134184081791398,2.3627331849970435e-5,-3.5161372712859956e-8,0.002134235900463689,2.3446066878692636e-5,-3.4967036409302774e-8,0.0021343663946126897,2.321429430328426e-5,-3.471798296710547e-8,0.0021345807976598918,2.2974350116389325e-5,-3.4459344612988514e-8,0.0021348696549837566,2.2764450779378168e-5,-3.4231980765256686e-8,0.0021352131046345666,2.2613905870942357e-5,-3.4067347153649095e-8,0.0021355851791665065,2.25409643711599e-5,-3.398518306415485e-8,0.002135957353588875,2.255223300982052e-5,-3.3992879723749303e-8,0.0021363013822437923,2.264265540717151e-5,-3.408542886166249e-8,0.0021365919676518924,2.279553658100697e-5,-3.4245382178955386e-8,0.0021368099415358917,2.298274820199354e-5,-3.444296877039347e-8,0.0021369464146205742,2.3165964903851673e-5,-3.463731317033913e-8,0.0021370076236995232,2.3300428516159704e-5,-3.4780406073762714e-8,0.0021370188901841084,2.334275576213467e-5,-3.482548254690987e-8,0.002137024662802771,2.3262920180390915e-5,-3.473993474880969e-8,0.0021370813223880038,2.3057492795026685e-5,-3.451958523389752e-8,0.002137241889275746,2.2757801904735166e-5,-3.41974981982623e-8,0.0021375370262618257,2.2426116340509338e-5,-3.3839966919214845e-8,0.002137961316631726,2.213800200907653e-5,-3.3527737842564464e-8,0.0021384728126343628,2.1957459800264673e-5,-3.332951347872889e-8,0.002139006670366777,2.191643370582827e-5,-3.3280036206354196e-8,0.0021394959229136664,2.2007302232413204e-5,-3.3371904617377737e-8,0.0021398901271324055,2.2189143712365275e-5,-3.3562023526722955e-8,0.002140166006414651,2.2402515162981413e-5,-3.378718549615929e-8,0.002140329077781706,2.2586184572995143e-5,-3.398186921720036e-8,0.0021404083035632985,2.2691063196128188e-5,-3.409319354061641e-8,0.002140446731689183,2.2688976940126358e-5,-3.409045739764433e-8,0.002140490895281052,2.2575699890952926e-5,-3.396857223236857e-8,0.0021405812375513067,2.2368761539972847e-5,-3.374586429282327e-8,0.002140745261299301,2.21013187905107e-5,-3.345758704823717e-8,0.002140994332456639,2.181402372302832e-5,-3.314720913566537e-8,0.002141324077070165,2.15469856889004e-5,-3.285775427864785e-8,0.002141717448243737,2.1333424920190157e-5,-3.262494699138589e-8,0.0021421491254591573,2.1195757227350775e-5,-3.247299004550511e-8,0.0021425900057506363,2.1143998775028036e-5,-3.2412859574264454e-8,0.002143011062769476,2.117578153748411e-5,-3.2442332125159627e-8,0.0021433864887417924,2.1277166088685482e-5,-3.254683206575627e-8,0.0021436964440635616,2.142377656843826e-5,-3.270056832632809e-8,0.0021439298869587705,2.1582271289495213e-5,-3.2867992137633203e-8,0.0021440878674806683,2.1712763255525305e-5,-3.3006289361086e-8,0.002144187054590783,2.1773439803346106e-5,-3.3070310510598916e-8,0.002144262009093983,2.172867744059509e-5,-3.302135431596869e-8,0.002144363336494184,2.156066898233932e-5,-3.2839788635029706e-8,0.0021445484486645283,2.128161554298987e-5,-3.253826914107641e-8,0.0021448640499980975,2.093968006406232e-5,-3.216820242252745e-8,0.0021453256085358927,2.0610778355504582e-5,-3.181096877059883e-8,0.002145905198301666,2.0374493068902587e-5,-3.155211428654284e-8,0.00214653761622983,2.028404497865664e-5,-3.144915450204835e-8,0.002147143609271417,2.0346789600608755e-5,-3.151058660106004e-8,0.0021476575414585346,2.0525272704293914e-5,-3.1696854344447995e-8,0.002148045581613403,2.0755200980876327e-5,-3.193942834876001e-8,0.0021483090662633483,2.0968393190590092e-5,-3.2165288983192186e-8,0.002148476685362016,2.111059951237463e-5,-3.231601401750927e-8,0.002148592188673189,2.115054857145032e-5,-3.235756967674147e-8,0.0021487026050471423,2.108140192452833e-5,-3.2282037014221544e-8,0.002148849218208448,2.091738286919093e-5,-3.2104180012498956e-8,0.0021490617141141114,2.0687943158359667e-5,-3.185531826563116e-8,0.0021493552248900965,2.043093865495207e-5,-3.1576037272193084e-8,0.0021497299103959574,2.018578295980443e-5,-3.1308781112487576e-8,0.0021501726730506327,1.99873898678633e-5,-3.109124846202539e-8,0.0021506604730088547,1.986152543363258e-5,-3.0951322070678607e-8,0.0021511645783630928,1.9821951349432184e-5,-3.0903980935864254e-8,0.0021516549924586936,1.986945352369192e-5,-3.0950285248140185e-8,0.0021521044365688485,1.9992440843010033e-5,-3.107804747030246e-8,0.0021524916686676407,2.016856874486101e-5,-3.126355090492214e-8,0.0021528042317079527,2.0367018571783807e-5,-3.147390414350625e-8,0.002153040804545645,2.0551375958833374e-5,-3.167000555671362e-8,0.002153213305985311,2.0683403675124328e-5,-3.181050955508008e-8,0.002153348503797179,2.0728467991859314e-5,-3.185767901736995e-8,0.002153487865791758,2.06633838486928e-5,-3.178596101433709e-8,0.002153683336498533,2.0486260716953912e-5,-3.159278162166714e-8,0.0021539866168050876,2.022543685029994e-5,-3.130833435668043e-8,0.0021544317139913717,1.9941401323367558e-5,-3.099772567279643e-8,0.0021550161923323133,1.9714632358069782e-5,-3.074786370682314e-8,0.002155692720036186,1.961840203113644e-5,-3.0638105864892124e-8,0.0021563809762338523,1.9688010875520684e-5,-3.070702518398803e-8,0.0021569972223773057,1.990511081944595e-5,-3.0935392402114285e-8,0.002157485124027573,2.0207307545267066e-5,-3.125638734645144e-8,0.002157830955696959,2.0515501898373752e-5,-3.1584963952577884e-8,0.0021580591073866546,2.0761657983135865e-5,-3.1847730058857165e-8,0.0021582161445200332,2.0904745124936695e-5,-3.200013957830926e-8,0.0021583539825240404,2.0933500471754782e-5,-3.20295538061186e-8,0.0021585179343003775,2.0861021855106574e-5,-3.194956386357729e-8,0.0021587404344839763,2.071653038410741e-5,-3.179127525102121e-8,0.0021590389475030915,2.0537441620192218e-5,-3.159486520542445e-8,0.0021594163239126024,2.0362778417702688e-5,-3.140248197378161e-8,0.002159862527034524,2.02278948399552e-5,-3.12524698579826e-8,0.002160357285130327,2.0160345669093216e-5,-3.117480508185589e-8,0.002160873478204498,2.017687657565958e-5,-3.1187780101922056e-8,0.002161381090914999,2.028164028054539e-5,-3.1296077539601465e-8,0.0021618514304895253,2.0465857833124282e-5,-3.1490443368311834e-8,0.0021622611359319007,2.0709012451658273e-5,-3.174899334089471e-8,0.002162595566211041,2.0981352258249935e-5,-3.203986438715612e-8,0.0021628513653473066,2.1247405686018214e-5,-3.232489338007879e-8,0.0021630380775924086,2.1470340095996585e-5,-3.256419591015205e-8,0.0021631786722644116,2.1617083222566323e-5,-3.272164177108625e-8,0.00216330868415945,2.1664275769114177e-5,-3.277135694153426e-8,0.0021634731281762807,2.1605065487863532e-5,-3.2705257492733154e-8,0.0021637197852005,2.1455812436603205e-5,-3.254053477237097e-8,0.0021640877997709013,2.1259948537739125e-5,-3.232400898296171e-8,0.002164592603377122,2.108438739205041e-5,-3.212829934769005e-8,0.0021652124263154904,2.1004045458292953e-5,-3.2034996857797784e-8,0.002165885927123784,2.107545579977581e-5,-3.21059404679378e-8,0.002166528501769656,2.1310646054636276e-5,-3.235474767326647e-8,0.0021670632549307834,2.1668132745757332e-5,-3.273691349900394e-8,0.0021674499574846086,2.2069275229952522e-5,-3.3167461209084994e-8,0.002167695398646148,2.2430414143251984e-5,-3.355576152777364e-8,0.0021678424617177497,2.2691454458900874e-5,-3.383651203996052e-8,0.002167948850623929,2.2828166985303557e-5,-3.398307877885336e-8,0.0021680682294110717,2.2848871903014454e-5,-3.400396925492826e-8,0.002168239621410091,2.2783477264658934e-5,-3.393109259567893e-8,0.0021684843405062296,2.2671975588932204e-5,-3.380744770218485e-8,0.0021688073255370847,2.2555681481195456e-5,-3.367771500329707e-8,0.0021692001470083005,2.247154601714925e-5,-3.358207900819488e-8,0.0021696442585630864,2.2448607182279223e-5,-3.355228837104354e-8,0.0021701141864079454,2.250565226458912e-5,-3.360901884393857e-8,0.0021705808201399487,2.2649663627314837e-5,-3.376013066261044e-8,0.002171014994842116,2.2875029470842755e-5,-3.399981066861581e-8,0.0021713914000250586,2.3163823595123173e-5,-3.430889349840126e-8,0.002171692521788873,2.348758011808522e-5,-3.4656770876542255e-8,0.0021719120261017694,2.381072758144914e-5,-3.500503838425244e-8,0.002172056961163761,2.4095477309522668e-5,-3.531268029929626e-8,0.002172148267756013,2.430773141450824e-5,-3.5542386815216575e-8,0.0021722192183669113,2.4423369339532766e-5,-3.5667380799741086e-8,0.0021723115797911727,2.443412716691192e-5,-3.567793407850738e-8,0.002172469370856416,2.435222243916228e-5,-3.558662383347489e-8,0.002172730141133899,2.4212483806263987e-5,-3.5430893243344456e-8,0.0021731143123856107,2.406994280862633e-5,-3.527059410845282e-8,0.0021736147553494305,2.399049051461565e-5,-3.517783640369402e-8,0.0021741911382967354,2.4033616638707532e-5,-3.5218066388396594e-8,0.0021747750128882433,2.4230582571380168e-5,-3.542607458320517e-8,0.0021752887669595176,2.4567528571206925e-5,-3.5787372573666643e-8,0.002175673052155437,2.49852415759974e-5,-3.623781078312394e-8,0.002175908854725856,2.5399662837313294e-5,-3.668591393596756e-8,0.0021760215228088064,2.5733306593570758e-5,-3.704716213606398e-8,0.002176065901163682,2.5940343519971294e-5,-3.727134201842648e-8,0.0021761034783204496,2.6014370722419524e-5,-3.735101978943853e-8,0.0021761840080405325,2.598057227504093e-5,-3.731306905929495e-8,0.0021763370696546024,2.5881272618678495e-5,-3.7203079961238056e-8,0.002176571964578955,2.5762734966788867e-5,-3.7071131130532555e-8,0.002176881812643163,2.5666444320064544e-5,-3.6962369095902545e-8,0.002177248530362033,2.562462645803108e-5,-3.6912097310867254e-8,0.0021776471185262275,2.56583990067598e-5,-3.694366624460091e-8,0.0021780490847102727,2.577707907708006e-5,-3.706762059466764e-8,0.002178425470464016,2.5977906113517757e-5,-3.7281338682605485e-8,0.002178749995054507,2.6246122306122735e-5,-3.7569099018844795e-8,0.00217900258816672,2.6555835903572176e-5,-3.7903003824289374e-8,0.0021791731432856958,2.687235363923373e-5,-3.8245472427078433e-8,0.002179264774642755,2.715651610226576e-5,-3.8553882093067663e-8,0.0021792954993946666,2.737100012726711e-5,-3.878734993897014e-8,0.0021792972905228126,2.7487801409019163e-5,-3.891485525836279e-8,0.0021793118845096627,2.7495392292255558e-5,-3.8923106738733907e-8,0.0021793835257311045,2.740366279969572e-5,-3.8822101383632065e-8,0.0021795497062576503,2.7244969924330507e-5,-3.864650695887784e-8,0.0021798315902990814,2.70702521421955e-5,-3.845164962605757e-8,0.0021802262299320907,2.693987847972113e-5,-3.8303651911103566e-8,0.0021807030536763806,2.6909868400577606e-5,-3.826434729027413e-8,0.002181207209043901,2.7015773686396604e-5,-3.837346895969279e-8,0.002181671386070132,2.7258810728352984e-5,-3.8633200520179275e-8,0.0021820347882051537,2.7600628586197033e-5,-3.9002200115334744e-8,0.002182263235355336,2.7971926183414146e-5,-3.940491263576584e-8,0.0021823611556105044,2.829417321789066e-5,-3.9755366604696456e-8,0.0021823687183090976,2.8505597620353956e-5,-3.9985695960752894e-8,0.002182345504518596,2.8579166128070304e-5,-4.006587420492795e-8,0.00218234968005574,2.852535965389795e-5,-4.000679786407413e-8,0.0021824224556048176,2.838187447749541e-5,-3.984911376569704e-8,0.0021825822079256305,2.8198197432587352e-5,-3.964648840870845e-8,0.002182826606343748,2.802230424969246e-5,-3.9451180587015695e-8,0.0021831385394179867,2.7892584515013404e-5,-3.930524420287103e-8,0.002183492363313434,2.7834558372804433e-5,-3.9236882225582924e-8,0.00218385884397354,2.7860496490932013e-5,-3.9259933128383583e-8,0.0021842086588251997,2.7970168372585447e-5,-3.937460019364952e-8,0.0021845150758582356,2.815172900254157e-5,-3.956836422313752e-8,0.0021847565668936496,2.838260505830918e-5,-3.9816914283289737e-8,0.002184919839335821,2.8630898322059892e-5,-4.0085638458821643e-8,0.002185003215576358,2.885819450463714e-5,-4.033263381846127e-8,0.00218501956630861,2.9024619642616696e-5,-4.0514173513386934e-8,0.002184997331671042,2.9096343678574037e-5,-4.0592881414629923e-8,0.0021849779434766005,2.9054458176741742e-5,-4.054747138967016e-8,0.0021850086809995705,2.890265974050007e-5,-4.0381253019101765e-8,0.0021851317555203866,2.867039550492026e-5,-4.012573894978999e-8,0.002185372477190764,2.8408972654841787e-5,-3.983659301605007e-8,0.002185730455124099,2.8180528313815657e-5,-3.958174677758403e-8,0.0021861771693066417,2.804251014407566e-5,-3.942450075684918e-8,0.002186661265337064,2.803206489062113e-5,-3.940634962351665e-8,0.0021871205644257144,2.8154906091556042e-5,-3.953453886956924e-8,0.0021874978725242504,2.8382145494403323e-5,-3.977826745766282e-8,0.002187756423815575,2.865671184733779e-5,-4.0075466582978284e-8,0.0021878902551987,2.8908425992492547e-5,-4.0349239996036213E-08,0.0021879255831569328,2.907366219308399e-5,-4.052949755270081e-8,0.002187912085216684,2.9112986253584563e-5,-4.057244739063578e-8,0.0021879072199879612,2.9020292931549317e-5,-4.0470759660277784E-08,0.0021879598630596396,2.8820635503511565e-5,-4.025130399634947e-8,0.0021880992812219192,2.855917509608077e-5,-3.996313733776403e-8,0.002188332056726784,2.8287020621832985e-5,-3.9662060963515264e-8,0.0021886456060208528,2.804939262502735e-5,-3.9397673106991304e-8,0.0021890148819920466,2.7878715380127772e-5,-3.9205757381181164e-8,0.002189409156221178,2.7792378102702624e-5,-3.9105747978824426e-8,0.0021897972687176166,2.7793455583849522e-5,-3.9101439536603146e-8,0.0021901511374968234,2.7872602070577086e-5,-3.9183008468822456e-8,0.0021904481235000325,2.80099950384596e-5,-3.932910624744156e-8,0.002190673074057688,2.8177065500827853e-5,-3.950871255388833e-8,0.0021908206554662854,2.8338483116444323e-5,-3.9683248872783535e-8,0.002190898034144987,2.8455330491275332e-5,-3.980999342254779e-8,0.002190927155960091,2.8490498477234655e-5,-3.9847964078533655e-8,0.0021909449561215767,2.841676049523602e-5,-3.9766800450551744e-8,0.002190999293289918,2.8226395593368268e-5,-3.955740530076425e-8,0.0021911391604951622,2.7938931175521973e-5,-3.924055987672371e-8,0.0021914004248092763,2.7602074739011113e-5,-3.886808440988153e-8,0.00219179202133541,2.7282286475806473e-5,-3.851264350198292e-8,0.002192289357213238,2.704625873866707e-5,-3.82475557684289e-8,0.0021928392696263337,2.6940105864173445e-5,-3.812399760810237e-8,0.0021933752027235077,2.697500409955819e-5,-3.815512007691709e-8,0.002193836370061701,2.712470614302269e-5,-3.8313049345572726e-8,0.0021941837606845793,2.7334592335765326e-5,-3.8538514178115646e-8,0.0021944084668189573,2.753776194502866e-5,-3.875830475133487e-8,0.002194531286417225,2.7672583796492192e-5,-3.890450991618433e-8,0.002194595052600508,2.769704623340426e-5,-3.893040017878978e-8,0.0021946525033668582,2.759686253141467e-5,-3.881953924029014e-8,0.002194753120305771,2.7386090076476726e-5,-3.858667842959779e-8,0.0021949323250686314,2.7100914061041817e-5,-3.82710888669168e-8,0.0021952055424206626,2.678902702000713e-5,-3.792497063521771e-8,0.0021955679291575467,2.6498107213706706e-5,-3.760078207771899e-8,0.0021959986568907772,2.626660204683497e-5,-3.73410335002723e-8,0.0021964674766541165,2.6118501228737073e-5,-3.7172439057852775e-8,0.0021969413113013753,2.60620374695922e-5,-3.7104408935529385e-8,0.0021973894608135576,2.6091132908844254e-5,-3.7130604436828466e-8,0.00219778705276762,2.6188108161646412e-5,-3.7231911539965425e-8,0.0021981171577645352,2.6326541689641457e-5,-3.7379570709525906e-8,0.0021983722862443157,2.647389410124768e-5,-3.753800898406534e-8,0.0021985558494707763,2.6594192238440678e-5,-3.766770585522208e-8,0.0021986837479933113,2.6651537795907375e-5,-3.772898009889921e-8,0.0021987855132714115,2.6615420265459276e-5,-3.76878288712398e-8,0.0021989034252902504,2.646839864760911e-5,-3.752446513210713e-8,0.002199087291365176,2.621516384114665e-5,-3.7243437839789706e-8,0.002199383129417582,2.588937576288623e-5,-3.688130790905145e-8,0.0021998169911259277,2.555241378810931e-5,-3.650538638656394e-8,0.0022003802001003703,2.5279351320183844e-5,-3.619836871761591e-8,0.0022010254563611044,2.513422877506996e-5,-3.603114654032077e-8,0.002201679461595271,2.5145548720641303e-5,-3.603578324988553e-8,0.0022022676262901954,2.5295397762231912e-5,-3.619337702747384e-8,0.0022027384098715387,2.552770043771887e-5,-3.6442911016991864e-8,0.0022030761947726936,2.5769490088737933e-5,-3.6704451465803936e-8,0.0022032999837505608,2.5953710056367697e-5,-3.690413133727294e-8,0.002203452495899009,2.6035101872089713e-5,-3.699166081129466e-8,0.00220358608653898,2.5996726968420892e-5,-3.6947657521712005e-8,0.0022037500668679825,2.584868135819004e-5,-3.678246540474378e-8,0.0022039815599960576,2.562183741456571e-5,-3.6529498934363496e-8,0.0022043004146107474,2.5359154396673204e-5,-3.6235824598435174e-8,0.0022047079845341367,2.510642092784503e-5,-3.595198121736966e-8,0.002205189271399241,2.490392157422305e-5,-3.5722695471243174e-8,0.0022057175485827437,2.4780291065975067e-5,-3.557995202152093e-8,0.002206260229099632,2.4749273402388118E-05,-3.553929040719807e-8,0.0022067847011294868,2.4809362891213233e-5,-3.559935513770356e-8,0.002207263133432532,2.494571788740346e-5,-3.574402276444476e-8,0.0022076757646234684,2.5133391696059046e-5,-3.594599847110066e-8,0.0022080127950028375,2.534094893318031e-5,-3.61707958606488e-8,0.0022082753512539274,2.5533983406702185e-5,-3.6380543421501094e-8,0.0022084759594946783,2.5678586499651885e-5,-3.653770547250637e-8,0.0022086387115195184,2.5745202620986414e-5,-3.6609273231779453e-8,0.002208798772150077,2.5713550443386234e-5,-3.6572240060008746e-8,0.002208999993716592,2.557900040024047e-5,-3.6420802882875486e-8,0.0022092887458073814,2.5359488384672675e-5,-3.6174216899908184e-8,0.0022097025167608603,2.5099812062111692e-5,-3.588172643050776e-8,0.0022102543881308777,2.4867936743048755e-5,-3.56185625830845e-8,0.0022109195242995543,2.4738476511340537e-5,-3.5467648422950415e-8,0.002211634051687777,2.4765337819048855e-5,-3.5489237515539794e-8,0.002212313150289902,2.495636083716276e-5,-3.5692713187243686e-8,0.0022128823429647753,2.526671790565515e-5,-3.602912278257172e-8,0.0022133046472050132,2.5616981016093155e-5,-3.641102991172894e-8,0.0022135888531115686,2.5924578071327065e-5,-3.6747220225829005e-8,0.0022137783155401383,2.6130440340332528e-5,-3.69721280559337e-8,0.0022139309577410685,2.6210438172246873e-5,-3.705850643683236e-8,0.0022141014474845195,2.6172901848814536e-5,-3.7014821330468624e-8,0.0022143303324376486,2.604895373490618e-5,-3.687478915277662e-8,0.002214639802017609,2.5881451700368056e-5,-3.668537821684993e-8,0.0022150338963010646,2.5715502764954452e-5,-3.649643735626844e-8,0.0022155011447347337,2.5591302194405776e-5,-3.6352737563078843e-8,0.0022160184567097205,2.553907975187675e-5,-3.628822151576024e-8,0.0022165557263009628,2.5575938852458807e-5,-3.63223191891732e-8,0.0022170807551756427,2.5704576800506107e-5,-3.6458407892383054e-8,0.002217564030701961,2.591385422119361e-5,-3.668441906146322e-8,0.0022179828448299827,2.6181049859668053e-5,-3.697537858622144e-8,0.0022183242804138395,2.6475407977684876e-5,-3.729737331333177e-8,0.002218586851652362,2.6762362021212276e-5,-3.7612202106384365e-8,0.002218780907528584,2.7007899392426868e-5,-3.7882116402540654e-8,0.00221892800983572,2.718282261799535e-5,-3.807443917791746e-8,0.0022190594291572868,2.7266897794539164e-5,-3.816614008581418e-8,0.002219213643884262,2.7253074171586324e-5,-3.814862701576736e-8,0.0022194321448706397,2.7151812912431053e-5,-3.8032782192625904e-8,0.0022197524438374,2.699457943246866e-5,-3.785310248538782e-8,0.0022201977516507457,2.6834004944931882e-5,-3.7668058896544666e-8,0.0022207647596439554,2.6736960739406968e-5,-3.755241769514929e-8,0.002221414588087056,2.6767401671111417e-5,-3.757801963905858e-8,0.0022220754445295104,2.696116773143545e-5,-3.778551747050506e-8,0.002222662982074354,2.7304481080951647e-5,-3.81602371398771e-8,0.002223112492580615,2.7732335963690483e-5,-3.8630272100101265e-8,0.0022234048892087036,2.815262001038408e-5,-3.9093316095525206e-8,0.002223570353579146,2.8482812379548647e-5,-3.9457507211628694e-8,0.0022236698422765312,2.8677471002609632e-5,-3.9671972494411865e-8,0.002223768955546225,2.8734606819302868e-5,-3.973390147896533e-8,0.002223918561912486,2.8685068606721128e-5,-3.9676852435000445e-8,0.002224146947177898,2.857614254949019e-5,-3.955275079853739e-8,0.002224460584546953,2.8457539680318737e-5,-3.9416539001133896e-8,0.0022248488878112726,2.8372409677147155e-5,-3.931628151961653e-8,0.0022252897394614136,2.8352697862785916e-5,-3.9287926512737694e-8,0.002225754439448891,2.8417200189247082e-5,-3.9352956850409215e-8,0.0022262119752000306,2.8571064147124517e-5,-3.9517646409515605e-8,0.0022266329015272588,2.8806246946617162e-5,-3.977346217838114e-8,0.002226992971723243,2.9102919767945163e-5,-4.009861614536306e-8,0.002227276408541931,2.9431986686848863e-5,-4.046090776146395e-8,0.002227478443459657,2.975881765135786e-5,-4.082189498635584e-8,0.0022276066367046955,3.00479536480172e-5,-4.114208286135804e-8,0.0022276806541805206,3.0268246647568305e-5,-4.1386550741833944e-8,0.0022277304168021564,3.0397850263698415e-5,-4.153044218187168e-8,0.0022277927064168696,3.0428497299104088e-5,-4.1563769098494404e-8,0.0022279064138012593,3.036858246513481e-5,-4.149502940286735e-8,0.002228106506621653,3.0244655302837534e-5,-4.13531517818982e-8,0.0022284166785792644,3.0100550888706932e-5,-4.1186794221321944e-8,0.0022288411897262855,2.9992625796661267e-5,-4.10591614928939e-8,0.0022293578310589434,2.997937361758266e-5,-4.1036340003927136e-8,0.002229915827113162,3.0105006870106393e-5,-4.116870189588894e-8,0.0022304437011137785,3.0380336855881893e-5,-4.146920822621145e-8,0.0022308696821551816,3.0770008843180174e-5,-4.189889481023213e-8,0.0022311489278408515,3.119747911794132e-5,-4.237238494059883e-8,0.002231282975267909,3.157105128869589e-5,-4.278709882978031e-8,0.0022313182697664352,3.181892335039289e-5,-4.3062523712161575e-8,0.0022313244787628863,3.1913280890993805e-5,-4.316712531818715e-8,0.0022313668866389517,3.187208721013959e-5,-4.312031825412391e-8,0.0022314877691962513,3.174329917730292e-5,-4.297493790279011e-8,0.0022317016189136243,3.1584440533183345e-5,-4.2794660080913634e-8,0.0022320000376087473,3.1447193001066374e-5,-4.263700565313382e-8,0.0022323599775302527,3.1369544649942365e-5,-4.2544629399779314e-8,0.0022327512669868426,3.13736485445689e-5,-4.254281430583861e-8,0.0022331420789577098,3.146660704082846e-5,-4.264014632464142e-8,0.002233502662649728,3.164221547907365e-5,-4.283028278424188e-8,0.0022338081602597494,3.188287847991798e-5,-4.309400116155361e-8,0.0022340411058888376,3.216172283638613e-5,-4.340155202858812e-8,0.002234193788318541,3.244531827001491e-5,-4.371572186288535e-8,0.002234270215537642,3.269748772071455e-5,-4.399608728756532e-8,0.0022342870174345488,3.288434625146084e-5,-4.4204595810092806e-8,0.0022342725300309807,3.298010211189754e-5,-4.431198509478476e-8,0.00223426358719864,3.297265366270278e-5,-4.430402838113176e-8,0.002234300042169446,3.28677210223566e-5,-4.4186255163092324e-8,0.0022344176501358816,3.269023712664952e-5,-4.398572890389884e-8,0.0022346404530500393,3.248215526411121e-5,-4.374887676761402e-8,0.0022349739993351363,3.229642695778004e-5,-4.3534981383312984e-8,0.002235400846601725,3.218729338221004e-5,-4.3405375317758714e-8,0.0022358801294424515,3.2197598996961654e-5,-4.3409074494626946e-8,0.0022363531613351687,3.234518444318427e-5,-4.356719715545998e-8,0.0022367562584270713,3.26124404623423e-5,-4.386088239969612e-8,0.002237039364916164,3.2944799036726895e-5,-4.4229360674700297e-8,0.002237184585255663,3.3263008754100455e-5,-4.458371191536925e-8,0.0022372152097443723,3.348808466964168e-5,-4.4835003790813605e-8,0.002237188268790842,3.356890037152168e-5,-4.492538522979582e-8,0.002237172973766367,3.3498373396684425e-5,-4.4846285550617134e-8,0.002237226446062347,3.331063740330506e-5,-4.463527151098567e-8,0.0022373785866876966,3.306356285861056e-5,-4.435657408777556e-8,0.0022376301801785795,3.281796598936418e-5,-4.407798109343235e-8,0.002237960293002327,3.262266212632057e-5,-4.385422435645071e-8,0.0022383364907900727,3.250798890852662e-5,-4.371970523753345e-8,0.002238723456645966,3.2485676809755455e-5,-4.3688197681211816e-8,0.0022390886143439774,3.255173487689696e-5,-4.3755889161178954e-8,0.002239405282078471,3.2689939993701276e-5,-4.390514695537152e-8,0.002239654500276259,3.2874917872497975e-5,-4.410791058122196e-8,0.002239826466603891,3.3074841894149056e-5,-4.43287154816248e-8,0.0022399219825763365,3.325431872964785e-5,-4.452793608909369e-8,0.00223995372724577,3.337818442270938e-5,-4.466602508507044e-8,0.002239946609945796,3.341665474095889e-5,-4.4709250539583116e-8,0.0022399361149010558,3.335152643078121e-5,-4.463662869840457e-8,0.0022399637177205746,3.318214901741799e-5,-4.4446666383878356e-8,0.0022400692719222156,3.292908438196356e-5,-4.4161604326662625e-8,0.0022402815961347503,3.263324461259011e-5,-4.382667142532589e-8,0.0022406097829435986,3.234928937051243e-5,-4.35029200728048e-8,0.0022410381982317313,3.2133989991873885e-5,-4.325433505758617e-8,0.002241527366860039,3.2032192958380706e-5,-4.31320710589e-8,0.002242021338402319,3.206407169227447e-5,-4.315991919307524e-8,0.002242460373611949,3.22173758634287e-5,-4.3325235858678146e-8,0.0022427962572554097,3.244758975145919e-5,-4.3578759913273076e-8,0.002243006285647738,3.268735329396462e-5,-4.384500203668317e-8,0.002243101254106713,3.2863977904254935e-5,-4.4041959824776854e-8,0.002243123492551911,3.292048609982193e-5,-4.410494856355586e-8,0.0022431341784470964,3.283271918257909e-5,-4.400603585822717e-8,0.002243194132145136,3.261533508896748e-5,-4.376093452019552e-8,0.0022433459529788004,3.2314277942817154e-5,-4.342065606321087e-8,0.0022436045440565053,3.198999227156275e-5,-4.305276261895022e-8,0.002243958133515982,3.169947891807182e-5,-4.2721289735892826e-8,0.002244376640907042,3.148388477407264e-5,-4.2472798095789184e-8,0.0022448221512804886,3.136378685678507e-5,-4.233096289601714e-8,0.0022452575632132565,3.134045113321896e-5,-4.2297823602288997e-8,0.002245652005153063,3.139999666608745e-5,-4.2358322241039085e-8,0.002245983472810847,3.151802159817808e-5,-4.248543069195238e-8,0.0022462398578507008,3.166353197668659e-5,-4.2644554056704593e-8,0.002246419446397792,3.180211929402931e-5,-4.2797108244559135e-8,0.0022465314514837314,3.1898991863196846e-5,-4.290391686790522e-8,0.0022465964763423293,3.192267915682146e-5,-4.292934587877446e-8,0.0022466461542808808,3.185001140863545e-5,-4.2846882077462555e-8,0.0022467207138888905,3.1672240851810194e-5,-4.264604611928958e-8,0.0022468631990779767,3.140089843834509e-5,-4.2339079016408486e-8,0.0022471100388813652,3.1070610463486265e-5,-4.196427300171984e-8,0.002247479746499827,3.073566784992554e-5,-4.158230565870342e-8,0.0022479638331529823,3.045874199951375e-5,-4.1263714808448154e-8,0.002248524763253154,3.02937857422682e-5,-4.1069733388505545e-8,0.002249103611883865,3.0268960024283786e-5,-4.1032988729356464e-8,0.0022496357222364597,3.0376558929030593e-5,-4.114590430823665e-8,0.002250068824548509,3.0574158665270486e-5,-4.1361647414439126e-8,0.0022503772247836114,3.07964029825346e-5,-4.160710741763205e-8,0.002250567802057482,3.097301904580212e-5,-4.1803061544443096e-8,0.002250676749711126,3.1047324392743566e-5,-4.188509138902905e-8,0.0022507586723131802,3.099010340839463e-5,-4.1819420951854353e-8,0.002250871480347393,3.080538471041008e-5,-4.1609680129912226e-8,0.0022510615188335178,3.052699532297764e-5,-4.1293253390966694e-8,0.002251353179262093,3.0207520227351978e-5,-4.092900157619033e-8,0.0022517456031207373,2.990365199999711e-5,-4.058081653528731e-8,0.002252216441744965,2.966277801546249e-5,-4.0302454700107246e-8,0.0022527301904458124,2.9514465763670236e-5,-4.012779775956819e-8,0.0022532475943158755,2.9467955847632948e-5,-4.0067851081194045e-8,0.0022537333307623537,2.9514413442723212e-5,-4.0113146302274113E-08,0.0022541607881451917,2.9631644844628163e-5,-4.023900335211374e-8,0.002254514189838657,2.9789237110179563e-5,-4.041133614434692e-8,0.0022547890266936274,2.9952985275678716e-5,-4.059167064094272e-8,0.0022549917913854377,3.0088440765969818e-5,-4.074114160771088e-8,0.0022551396035145384,3.016407696389352e-5,-4.08240201186456e-8,0.0022552597216511264,3.015481429148342e-5,-4.081164539487939e-8,0.0022553882919875423,3.0046508802163843e-5,-4.0687495180085486e-8,0.002255567099077569,2.9841357504034444e-5,-4.045337540522603e-8,0.0022558369388607233,2.9562838755949134e-5,-4.0135156504026914e-8,0.0022562271875581842,2.9257130726269753e-5,-3.978455631529007e-8,0.0022567436326642507,2.898714903281843e-5,-3.947255364662877e-8,0.0022573598823487835,2.8817209579511943e-5,-3.927213390100102e-8,0.002258018966071855,2.8791605493017066e-5,-3.923404737454537e-8,0.002258648117312685,2.891633036493332e-5,-3.936599702943412e-8,0.0022591820275492096,2.9154153382066135e-5,-3.962682189325287e-8,0.0022595839247476135,2.9436595028559185e-5,-3.993977198480979e-8,0.00225985505008105,2.9686790215993037e-5,-4.021816649643196e-8,0.002260030241699472,2.9842461088519565e-5,-4.039130403089442e-8,0.002260164133587199,2.9870701143892955e-5,-4.042125712911031e-8,0.0022603147060398874,2.9772008334002676e-5,-4.0307640364203134e-8,0.002260529356679789,2.957539212424842e-5,-4.008236218492744e-8,0.0022608360709949985,2.9328088618681445e-5,-3.9798262676794195e-8,0.002261240279369694,2.9083351681059975e-5,-3.951545849385412e-8,0.0022617268003365322,2.888909043567816e-5,-3.9288472509905356e-8,0.0022622655482008036,2.8779388123142624e-5,-3.915647214350556e-8,0.002262819189102602,2.8770098261314698e-5,-3.913805732001187e-8,0.002263350798057785,2.88586129564398e-5,-3.92308125522209e-8,0.0022638299762149723,2.9026875547142857e-5,-3.9414639258724473e-8,0.00226423666135669,2.9246199189130553e-5,-3.9657234352431613e-8,0.0022645626786873415,2.9482478245198007e-5,-3.992005306099529e-8,0.0022648116674165116,2.9700822468235492e-5,-4.016358408751382e-8,0.0022649981596772123,2.9869345096513426e-5,-4.0351602493104255e-8,0.00226514630501003,2.9962411033835785e-5,-4.04547762743576e-8,0.002265288298830657,2.9963862391270176e-5,-4.045428268554886e-8,0.0022654620702153745,2.9870664852001304e-5,-4.034600056798178e-8,0.002265707212446325,2.969691295175194e-5,-4.0145217890832345e-8,0.002266057956294179,2.947691133511338e-5,-3.9890345763315734e-8,0.0022665329039003286,2.926444328548644e-5,-3.964227072360827e-8,0.0022671236887107245,2.9124484378898093e-5,-3.9475022511818455E-08,0.002267788240646869,2.9115420126813518e-5,-3.945552451759843e-8,0.0022684561262601086,2.9265821438624493e-5,-3.9617054061131354e-8,0.0022690490903026677,2.955733641213853e-5,-3.993960157280089e-8,0.002269509515122626,2.992626254599793e-5,-4.035147042985752e-8,0.00226982162214845,3.0286068029203308e-5,-4.0754733553186254e-8,0.0022700138757717004,3.055897303667495e-5,-4.1061025649979134e-8,0.0022701436737226793,3.069989577380529e-5,-4.1218699906638504e-8,0.00227027517647685,3.070387520696665e-5,-4.122131101616223e-8,0.002270461042897145,3.059919619723711e-5,-4.1100011651257346e-8,0.002270732689133939,3.0433729733369717e-5,-4.090835113136894e-8,0.002271098337780852,3.026097227227714e-5,-4.070670005595391e-8,0.002271546105525531,3.012906258930677e-5,-4.0549886052690306e-8,0.002272049606456396,3.007354356655947e-5,-4.0478868217575704e-8,0.0022725744638758933,3.011354728086309e-5,-4.051615436512521e-8,0.0022730847790649704,3.0250954443169037e-5,-4.066458322488583e-8,0.002273548838725809,3.047206367789406e-5,-4.0909059104787467e-8,0.0022739434936463994,3.075113090835044e-5,-4.1220551846418976e-8,0.0022742568636345524,3.105504186902545e-5,-4.156147942044127e-8,0.0022744892839467825,3.134835492335001e-5,-4.189151521878511e-8,0.0022746527416301044,3.159798737144839e-5,-4.217292294439811e-8,0.0022747692873981264,3.177714018497166e-5,-4.237495585906838e-8,0.0022748688113758886,3.186850606857967e-5,-4.247743480535395e-8,0.002274986290774487,3.186699225575003e-5,-4.2473855910760004e-8,0.0022751583117732004,3.178213127539921e-5,-4.237427673206388e-8,0.0022754182619907173,3.1640017291713195e-5,-4.2207768491395545e-8,0.0022757894556965316,3.1483670873694755e-5,-4.202308555544977e-8,0.0022762763149492913,3.1369490725813464e-5,-4.188476186116999e-8,0.002276855832823401,3.135697026894548e-5,-4.186133900931318e-8,0.0022774744421386866,3.1490633861351893e-5,-4.200454099581501e-8,0.0022780569340058936,3.177865036092299e-5,-4.232457983909165e-8,0.0022785298502353986,3.217986098398422e-5,-4.277512950721424e-8,0.002278850878859694,3.261186828087253e-5,-4.326249088421801e-8,0.002279027127460274,3.29810254809563e-5,-4.3679853601427606e-8,0.0022791101135152944,3.3218485070021266e-5,-4.3948435338700015e-8,0.0022791716138773816,3.33017751806445e-5,-4.404203618293163e-8,0.0022792763622203156,3.325354630218967e-5,-4.3985619723857855e-8,0.0022794650184009696,3.312474867222378e-5,-4.3836336864797965e-8,0.0022797502493714416,3.297479872131966e-5,-4.3661248003750406e-8,0.00228012142820996,3.285672340462785e-5,-4.35206528604119e-8,0.0022805525144040995,3.2809069538178984e-5,-4.3458910771532503e-8,0.002281009749824412,3.28530678199272e-5,-4.350102367560977e-8,0.002281457946481573,3.299290573495884e-5,-4.3652647942342574e-8,0.0022818653863613037,3.3217663060474e-5,-4.390203862093646e-8,0.0022822076095379298,3.350430854908523e-5,-4.4223341324998374e-8,0.0022824701581385626,3.38215008984268e-5,-4.458094556850484e-8,0.0022826501909389498,3.413398695711384e-5,-4.493459121134231e-8,0.0022827568168762593,3.44073498830337e-5,-4.524485208989148e-8,0.0022828100447377627,3.4612658901913384e-5,-4.547843105508966e-8,0.0022828384740465075,3.4730475087631895e-5,-4.561266796396316e-8,0.002282876011570533,3.475388096679199e-5,-4.5638964500433376e-8,0.002282957848421652,3.469040464851831e-5,-4.5565062411767125e-8,0.0022831158204580496,3.456271833872463e-5,-4.541606069616092e-8,0.0022833731202049406,3.440786048574832e-5,-4.5233819572801423e-8,0.0022837383081319583,3.427425554837967e-5,-4.507378989735375e-8,0.0022841992424606486,3.42151255976047e-5,-4.4997528462908375e-8,0.0022847190630679586,3.427694413898361e-5,-4.505929978605274e-8,0.0022852381039333777,3.448341082476899e-5,-4.528736898920922e-8,0.002285686017006873,3.4819631970934466e-5,-4.566551541864208e-8,0.0022860045965692596,3.522625967483624e-5,-4.6126130449042295e-8,0.0022861729555042707,3.5613274931110104e-5,-4.65660689031637e-8,0.002286219685653516,3.5892392446296056e-5,-4.688394305335418e-8,0.002286211691889868,3.601177133491025e-5,-4.7019944247694604e-8,0.002286225505956513,3.5972626779050686e-5,-4.697479161031815e-8,0.0022863188543598124,3.58205873724714e-5,-4.6799832485411654e-8,0.00228651668635773,3.562198060753e-5,-4.6570120297171264e-8,0.002286812966928041,3.5440632292562546e-5,-4.635820450409294e-8,0.002287180868527256,3.532389707738892e-5,-4.6218365864022434e-8,0.002287583967878681,3.5298098790532246e-5,-4.618136168410986e-8,0.0022879848284268977,3.536980504236021e-5,-4.6255633734096165e-8,0.0022883504197809537,3.552946613083765e-5,-4.643115703668337e-8,0.002288655274879669,3.575541538610793e-5,-4.668378554344655e-8,0.0022888834463104927,3.60176745468646e-5,-4.697952823998258e-8,0.002289029789277668,3.6281738912671874e-5,-4.727893103740416e-8,0.002289100595889158,3.65126058036671e-5,-4.754178038619249e-8,0.0022891133320047745,3.667916372430841e-5,-4.773217946936401e-8,0.0022890950961498148,3.675871799412574e-5,-4.782371311654076e-8,0.0022890795607725576,3.674100774676719e-5,-4.7804003549630296e-8,0.002289102527511509,3.663093644990813e-5,-4.767785241181172e-8,0.002289196541348638,3.644938070154096e-5,-4.746830614559982e-8,0.0022893851939173337,3.6231636872978196e-5,-4.7215134114218746e-8,0.002289677840039512,3.602331407239086e-5,-4.6970406519053876e-8,0.0022900654708520327,3.58736629553553e-5,-4.679101983320465e-8,0.002290518708418688,3.582634915501503e-5,-4.6728061346799346e-8,0.0022909894789891827,3.590809695929047e-5,-4.681348212371508e-8,0.002291418352774001,3.611712058525191e-5,-4.704638370723802e-8,0.002291748752111823,3.641569025232455e-5,-4.7384109668672996e-8,0.0022919460643483626,3.6733133288591057e-5,-4.774556420547209e-8,0.0022920143328060607,3.6983858880081674e-5,-4.803206329891999e-8,0.002291999814615806,3.7096977477987554e-5,-4.8161604641847836e-8,0.002291975474626928,3.704374634491269e-5,-4.8100515063701843e-8,0.0022920128248449328,3.6846970662485426e-5,-4.787422973248501e-8,0.0022921567275596033,3.656759825553701e-5,-4.7551933742153225e-8,0.0022924155206640656,3.627866505605262e-5,-4.721685937218435e-8,0.0022927669894349093,3.6041857596996885e-5,-4.6939648387720506e-8,0.002293172035520522,3.589533984270876e-5,-4.676448884083824e-8,0.002293587774220062,3.585234950794764e-5,-4.670737294106673e-8,0.00229397625599273,3.5905780732209896e-5,-4.676107434656356e-8,0.0022943087935883965,3.603438248915831e-5,-4.690198432790658e-8,0.0022945674627496593,3.6208248273547327e-5,-4.709625363021303e-8,0.0022947453752612396,3.639309951270794e-5,-4.730469355160464e-8,0.002294846618012875,3.655385217382977e-5,-4.748694572871607e-8,0.0022948859966711527,3.6658142221179055e-5,-4.760561192507473e-8,0.0022948882229804706,3.66802485027254e-5,-4.7630789899419904e-8,0.002294885915277481,3.660536515102313e-5,-4.754496057001509e-8,0.0022949158390162044,3.64335141641052e-5,-4.7347464493291285e-8,0.002295013303258485,3.6181877526743895e-5,-4.705723761896796e-8,0.0022952053707549756,3.5884255428738196e-5,-4.6712359540665154e-8,0.0022955042500871392,3.558678939109289e-5,-4.6365392836542746e-8,0.002295902637857623,3.534001900618766e-5,-4.607449202272132e-8,0.002296372603345501,3.518847407688666e-5,-4.5891531629784525e-8,0.002296868936882388,3.515979486113663e-5,-4.584945571699113e-8,0.002297337100875107,3.525571375908133e-5,-4.595154991513938e-8,0.0022977251112613487,3.54474663309797e-5,-4.6165727461002804e-8,0.002297997511006086,3.567828648084553e-5,-4.642708208073091e-8,0.0022981479038201797,3.587486868504097e-5,-4.665101902295781e-8,0.0022982048890346418,3.59670990491837e-5,-4.6756152857442506e-8,0.0022982264993906746,3.591076706084595e-5,-4.66907281238414e-8,0.00229828244392896,3.570370688981107e-5,-4.645139989864305e-8,0.0022984305793150974,3.538654013029307e-5,-4.6084187811529834e-8,0.002298698613153666,3.502687277549902e-5,-4.5666380520174655e-8,0.0022990791902976694,3.4695334694455384e-5,-4.5279093849930466e-8,0.0022995381727997865,3.4445276278051516e-5,-4.49839970221804e-8,0.002300029218953335,3.430321854904224e-5,-4.4812265883725474e-8,0.0023005071520190556,3.426970567379333e-5,-4.4765358220823394e-8,0.0023009363058259054,3.432593949783263e-5,-4.4822399265362546e-8,0.0023012938617268945,3.444159290053393e-5,-4.494899788620879e-8,0.002301570006953491,3.458126436569647e-5,-4.51046246777301e-8,0.002301766800108603,3.470904311234521e-5,-4.524791553057968e-8,0.002301896888738061,3.479179416047871e-5,-4.534053254240823e-8,0.002301982375857608,3.480208071788327e-5,-4.535057802732492e-8,0.0023020534602801847,3.472142304601621e-5,-4.525634915545079e-8,0.0023021460538406057,3.454404162586172e-5,-4.505063369302154e-8,0.002302297520970304,3.4280415377693827e-5,-4.474483116108385e-8,0.00230254017354546,3.395911142067943e-5,-4.4371164167657605e-8,0.0023028932564570586,3.3624877587848964e-5,-4.398066536436923e-8,0.0023033555964254958,3.333152309155398e-5,-4.3635188638132984e-8,0.0023039020503271127,3.312995217770553e-5,-4.339376844190064e-8,0.002304486385520222,3.305425894193706e-5,-4.329658172175806e-8,0.002305051035348368,3.3110519998397165e-5,-4.335181227808648e-8,0.0023055413708626526,3.3272560571329226e-5,-4.353040435431237e-8,0.0023059202737308734,3.348666573581906e-5,-4.3771124818958763e-8,0.0023061786570983014,3.368428524135492e-5,-4.3994995923487775e-8,0.0023063388048928817,3.379947725797813e-5,-4.412542796611055e-8,0.0023064492323863275,3.378653186463361e-5,-4.410875759920423e-8,0.0023065718780325255,3.363277880294064e-5,-4.392931753536871e-8,0.0023067648430645355,3.336223440573916e-5,-4.361391666217241e-8,0.0023070660644278905,3.302816568314063e-5,-4.322345795297547e-8,0.002307483727852774,3.269679339994018e-5,-4.2834243518091083e-8,0.0023079967124393116,3.242829025455311e-5,-4.2516054578377455e-8,0.002308563857239961,3.2262195589673835e-5,-4.2315205384790976e-8,0.0023091372052619127,3.221149782256434e-5,-4.224750159055635e-8,0.002309673844341424,3.2265073740245427e-5,-4.2300823774791806e-8,0.0023101432068525158,3.239501720334835e-5,-4.244342832539441e-8,0.0023105295861446016,3.256496006872504e-5,-4.2633513685632894e-8,0.0023108314009869526,3.2736917316135974e-5,-4.282717939490637e-8,0.002311059046577513,3.287596311964373e-5,-4.298390962236588e-8,0.0023112325956021447,3.2953249680788354e-5,-4.30701110947523e-8,0.00231137979665109,3.294831861010061e-5,-4.306178209267358e-8,0.0023115340997543143,3.285151044406728e-5,-4.2947275355292e-8,0.0023117319317365243,3.2666777386046935e-5,-4.2730561942988145e-8,0.0023120082445560355,3.241439708027806e-5,-4.243445694518821e-8,0.0023123897136956896,3.213200948149292e-5,-4.210197938273945e-8,0.002312886188388601,3.1871514418046985e-5,-4.179294978549619e-8,0.0023134830361791667,3.168968477884489e-5,-4.157326718028376e-8,0.0023141388246951094,3.163282940214068e-5,-4.149718047268907e-8,0.002314792329840861,3.172005820484998e-5,-4.158778555622238e-8,0.002315378896673669,3.193290371843414e-5,-4.182474929661659e-8,0.0023158505127047306,3.2217740072628357e-5,-4.214680612835947e-8,0.0023161909435828218,3.2501262856054346e-5,-4.2469442360932653e-8,0.002316419671183998,3.271254277366566e-5,-4.27103290681903e-8,0.0023165841921237427,3.2802780436011716e-5,-4.2812247472897776e-8,0.0023167450214273137,3.2756541656388914e-5,-4.275628838705075e-8,0.0023169591271539453,3.259272819167442e-5,-4.256326379538918e-8,0.0023172663812004936,3.2356898186037265e-5,-4.228512778642178e-8,0.0023176817453812227,3.2108186977599e-5,-4.199006993769168e-8,0.002318194185054491,3.1904582986137214e-5,-4.174553762547756e-8,0.00231877176791076,3.1790160014621046e-5,-4.1603324561922454e-8,0.002319371007020906,3.1787119353049104e-5,-4.159008391244041e-8,0.0023199475183516252,3.189400454355314e-5,-4.17049622110272e-8,0.0023204650305293554,3.20894591354611e-5,-4.1923747329153166e-8,0.002320900868517307,3.2339315150879754e-5,-4.220702939293869e-8,0.0023212476092142357,3.260440417190498e-5,-4.2509329097549e-8,0.0023215118356965506,3.284715719192341e-5,-4.278686762213579e-8,0.0023217113982006393,3.3036182323788574e-5,-4.300295310375987e-8,0.002321872364162279,3.314903836216729e-5,-4.313120169100703e-8,0.0023220262092654128,3.3173971066507745e-5,-4.315751282036905e-8,0.002322207158400309,3.311135649858902e-5,-4.3081732272613976e-8,0.0023224491028571363,3.297521373884765e-5,-4.291948491394481e-8,0.002322781228382118,3.279447518776715e-5,-4.270382165655561e-8,0.0023232216822924234,3.261266466520483e-5,-4.248505510679363e-8,0.002323769722566849,3.2483621858754785e-5,-4.2325943183644296e-8,0.002324398904211897,3.2460944922610885e-5,-4.228942774440365e-8,0.002325056179267136,3.258120401470381e-5,-4.241896142727533e-8,0.002325671964702718,3.2846122159074696e-5,-4.271751943685757e-8,0.00232618144268266,3.321386581244003e-5,-4.3137207029593565e-8,0.0023265488268709705,3.36082031220369e-5,-4.3589753742231386e-8,0.0023267814240886583,3.394420957442691e-5,-4.397636855767629e-8,0.0023269254239565483,3.415782391829717e-5,-4.422212158225807e-8,0.002327046906947544,3.422452814123435e-5,-4.429770088385412e-8,0.002327209206277997,3.4160981089080925e-5,-4.422143906155781e-8,0.002327456336525311,3.401357864203633e-5,-4.4046282714445835E-08,0.002327805923589105,3.384194337626255e-5,-4.384093488623098e-8,0.002328250166554385,3.37036441574621e-5,-4.3672328614357636e-8,0.002328761740259225,3.364315089403521e-5,-4.3592791245387643e-8,0.002329301915681379,3.36856352720997e-5,-4.3632602011700155e-8,0.002329829055291661,3.383516729126079e-5,-4.379753708045467e-8,0.0023303062390849644,3.407663050535043e-5,-4.407078165874924e-8,0.0023307070359199853,3.438049828740393e-5,-4.441833484198168e-8,0.0023310187619350036,3.470925636680583e-5,-4.4796515547741785e-8,0.0023312431048083324,3.502410718649536e-5,-4.515990686671555e-8,0.002331394528886721,3.5290797443504604e-5,-4.5468276438613356e-8,0.002331497260081565,3.5483844383961805e-5,-4.569154976787356e-8,0.002331581733856791,3.558904226640621e-5,-4.581270005257149e-8,0.0023316810811048884,3.560465423137779e-5,-4.582909582100883e-8,0.002331827771099224,3.5541816076164474e-5,-4.575300867708182e-8,0.0023320501595354027,3.542447396167401e-5,-4.561169901534009e-8,0.0023323683909373285,3.528871876135906e-5,-4.5446880835164095e-8,0.0023327891822946096,3.51805346933835e-5,-4.531231018055253e-8,0.002333299958278486,3.515015003696038e-5,-4.52672578511267e-8,0.0023338645432176663,3.5241270465413334e-5,-4.5363790266725256e-8,0.002334424562220092,3.5475412457926315e-5,-4.562814505895616e-8,0.0023349112408662287,3.583613212030472e-5,-4.6041947983230845e-8,0.002335268146958933,3.626338247097496e-5,-4.6535418255023436e-8,0.0023354760591965088,3.666773954728629e-5,-4.700402689339779e-8,0.0023355644528050535,3.696270836812873e-5,-4.7346394509497067e-8,0.002335600051392683,3.7098371862978543e-5,-4.75036656435806e-8,0.002335658860810056,3.707695140177438e-5,-4.747763880896117e-8,0.0023357987401432536,3.694435600604198e-5,-4.732093922172631e-8,0.002336045463982361,3.6767616798790464e-5,-4.711093689128459e-8,0.002336393449628172,3.661235323283033e-5,-4.6923808409687194e-8,0.00233681482692482,3.6528212315890726e-5,-4.68177625437056e-8,0.002337270388702322,3.6542959451067806e-5,-4.682607312286444e-8,0.0023377189367930666,3.66625719363429e-5,-4.6956871248297825e-8,0.002338124071548144,3.687450363014641e-5,-4.7196561629315964e-8,0.002338458716826444,3.71523445299233e-5,-4.75149713046986e-8,0.0023387078440758034,3.7461115310449495e-5,-4.787144263559505e-8,0.002338869585723431,3.7762817841687184e-5,-4.822140859107426e-8,0.0023389547817296704,3.802184043837775e-5,-4.852287616148231e-8,0.0023389850485431105,3.820974950563554e-5,-4.87421532200505e-8,0.002338989627065774,3.830895059743735e-5,-4.885815585004515e-8,0.0023390014899789605,3.8314840733578865e-5,-4.8864887051675046e-8,0.002339053227796983,3.823643256374001e-5,-4.8772155817743224e-8,0.0023391730470084114,3.809565596331883e-5,-4.860485990028719e-8,0.002339381007965399,3.7925524692509784e-5,-4.840106376674009e-8,0.0023396854228536312,3.776719520424567e-5,-4.82088209371393e-8,0.0023400793116841023,3.76654727255943e-5,-4.808107898018889e-8,0.002340537481346002,3.766178500501879e-5,-4.8067398459253976e-8,0.0023410160318337752,3.778395059438169e-5,-4.820166978989883e-8,0.0023414571514578423,3.8033753723512084e-5,-4.8487112668261064e-8,0.002341802014567862,3.837655741982126e-5,-4.888372230559299e-8,0.0023420114228051465,3.874102641968516e-5,-4.930783648964436e-8,0.0023420863661792065,3.9036695298684036e-5,-4.965293287954776e-8,0.0023420745217566197,3.918717458210972e-5,-4.982885057806455e-8,0.0023420538209714603,3.91622722916344e-5,-4.9799546790811774e-8,0.0023421004046062298,3.8988852688015025e-5,-4.959573407663678e-8,0.0023422602630217295,3.8734768578304047e-5,-4.9296049457022376e-8,0.0023425391360975905,3.847893082192605e-5,-4.899224673303789e-8,0.0023429102765989336,3.828568044273994e-5,-4.8759531463412606e-8,0.0023433299940436355,3.819251167163617e-5,-4.8642341136861975e-8,0.0023437518655280796,3.8209551159922836e-5,-4.865357708177263e-8,0.0023441359775748295,3.8325147109487965e-5,-4.87807783260245e-8,0.002344453495623456,3.8512988018584136e-5,-4.8994075741131246e-8,0.002344688236531956,3.873852777500904e-5,-4.9253489797137967e-8,0.0023448367420634006,3.896429832747165e-5,-4.951513690495988e-8,0.002344907563344286,3.915445172418351e-5,-4.973668851539436e-8,0.002344919846223446,3.927885131661452e-5,-4.9882338277690744e-8,0.0023449010717055798,3.9316757036171124e-5,-4.992722780668246e-8,0.0023448838074805536,3.925979958184939e-5,-4.986094461349622e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json new file mode 100644 index 0000000..f46c700 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":18000,"numberOfSamples":1000,"samples":[0.002344901558802442,3.911368303105064e-5,-4.968948981883951e-8,0.002344984132234963,3.8898163040661456e-5,-4.9435280092255396e-8,0.002345153076453194,3.8645137911801235e-5,-4.913505665071581e-8,0.0023454177649364274,3.8394882701718704e-5,-4.883571430956027e-8,0.0023457726182683734,3.8190636084535106e-5,-4.858818570335279e-8,0.0023461958479369647,3.8071833815956895e-5,-4.8439580759263195E-08,0.0023466502566154754,3.806617270836784e-5,-4.8423700396250246e-8,0.0023470871667342188,3.818099295284342e-5,-4.855052067391149e-8,0.0023474547964515697,3.8395736841710905e-5,-4.8796864492445077e-8,0.002347711548848421,3.865908630266998e-5,-4.9102715263344044e-8,0.0023478420825502667,3.889571950044163e-5,-4.937914952780937e-8,0.00234786961391877,3.902607152063935e-5,-4.9531851099022974e-8,0.0023478548636246925,3.899526350333567e-5,-4.949545923878963e-8,0.002347876570857601,3.8797420616696476e-5,-4.926230021920203e-8,0.0023480009856264934,3.8479554435582394e-5,-4.888691218568922e-8,0.002348257394842648,3.81212678497871e-5,-4.8462214576854004e-8,0.0023486326479069406,3.7803093228172886e-5,-4.8082513592352674e-8,0.0023490835964367573,3.75814623825538e-5,-4.781433129307214e-8,0.002349556312825578,3.747939916176964e-5,-4.768549705089819e-8,0.002350001794120482,3.7490379203984336e-5,-4.768944037993623e-8,0.002350384381521822,3.758800212452211e-5,-4.779618621991062e-8,0.0023506841057128985,3.773572437125139e-5,-4.796348785816809e-8,0.0023508956980960788,3.7894232799687954e-5,-4.814536983155262e-8,0.00235102648099269,3.802641740658273e-5,-4.829803528414698e-8,0.002351094173287532,3.810084978765315e-5,-4.838411531070628e-8,0.0023511246964647747,3.8094608924835005e-5,-4.837614007717066e-8,0.0023511496348331447,3.799585924542727e-5,-4.825963731338258e-8,0.0023512029179003826,3.780605403700456e-5,-4.803571540037979e-8,0.002351316493203054,3.754110540847055e-5,-4.772242618165293e-8,0.002351515254331023,3.723065606146325e-5,-4.7353971759481864e-8,0.0023518120205759476,3.6914840723378074e-5,-4.697706960436158e-8,0.0023522036900594134,3.663842066327486e-5,-4.664428486396447e-8,0.0023526697415857454,3.6442835626573675e-5,-4.6404850464569947E-08,0.0023531739492806607,3.635743472275251e-5,-4.629433098034591e-8,0.0023536695969230293,3.639153741844735e-5,-4.632502065598751e-8,0.002354107963028887,3.65290387843179e-5,-4.64791633358682e-8,0.0023544493334192655,3.672744771866113e-5,-4.670739713326941e-8,0.0023546748244885193,3.692340046714689e-5,-4.693502893752279e-8,0.0023547957604870243,3.704596407123413e-5,-4.707779081016492e-8,0.002354855915443392,3.703656572046711e-5,-4.70656375977696e-8,0.0023549223160394474,3.68699978500431e-5,-4.6867843166706427e-8,0.002355064610704272,3.656683381659626e-5,-4.65078344897485e-8,0.002355330456332751,3.6188645949168455e-5,-4.605762360942627e-8,0.0023557290800031,3.581614088997792e-5,-4.561209830788785e-8,0.0023562313149006323,3.552104851024793e-5,-4.525598622392911e-8,0.002356784170343763,3.534573263514571e-5,-4.503985226093692e-8,0.00235733028458666,3.529761527789713e-5,-4.49733843052568e-8,0.002357823000083982,3.535587514723036e-5,-4.503300722505471e-8,0.0023582334607192713,3.548324139112816e-5,-4.517550230472812e-8,0.0023585511399880337,3.5636946080439145e-5,-4.535076312918837e-8,0.002358780962041987,3.577633956909642e-5,-4.551078335076926e-8,0.0023589395842511522,3.5867314155800855e-5,-4.561499749370089e-8,0.002359052080351249,3.588475773629073e-5,-4.563332272362631e-8,0.002359149147828655,3.58142084645814e-5,-4.554820350082022e-8,0.0023592643626533377,3.565335730415486e-5,-4.5356402142557453E-08,0.002359430841246486,3.541339537933329e-5,-4.507057121932486e-8,0.0023596768567981123,3.511952535451973e-5,-4.471987460114685e-8,0.0023600205188522927,3.480948168500788e-5,-4.4348345490610194e-8,0.0023604644698905536,3.452896471445555e-5,-4.400967986329848e-8,0.002360992350010294,3.432364769813786e-5,-4.375798612579386e-8,0.002361569042366369,3.422878850205881e-5,-4.363559641492016e-8,0.0023621460051594665,3.4259012492440044e-5,-4.3660883375380844e-8,0.0023626713616961515,3.440164922381125e-5,-4.3820080092443e-8,0.002363102567048767,3.4616447316981465e-5,-4.4066547053651594e-8,0.002363418276529288,3.484277697645849e-5,-4.432896661511161e-8,0.002363625904080295,3.501331834422755e-5,-4.452741922922826e-8,0.002363762140673494,3.50713100177352e-5,-4.459391491625094e-8,0.0023638851680286292,3.498694287747205e-5,-4.449207573009896e-8,0.0023640594734086117,3.4767688893707976e-5,-4.422967279774819e-8,0.002364337052724743,3.44579776897352e-5,-4.385849503168624e-8,0.0023647414089119547,3.412668761857231e-5,-4.345970698104098e-8,0.002365260922020612,3.3846152104623893e-5,-4.3119075143364176e-8,0.0023658544426327192,3.367093165302294e-5,-4.290180278936738e-8,0.0023664660490979486,3.362478090509265e-5,-4.2836928949552116e-8,0.002367041894211088,3.3699477499923e-5,-4.29156715149733e-8,0.0023675425813141815,3.3863070665591675e-5,-4.3100929149056666e-8,0.002367948361133545,3.407186155979982e-5,-4.334131276515742e-8,0.0023682583104001854,3.4281125480317074e-5,-4.358383945165417e-8,0.002368486347050624,3.4452289918945094e-5,-4.378254145392837e-8,0.002368656569458454,3.455667745010834e-5,-4.3903037676489125e-8,0.002368799213631667,3.457704329979657e-5,-4.39244496666408e-8,0.0023689474323752143,3.450818698611703e-5,-4.384015205758009e-8,0.0023691344170632556,3.4357416482385305e-5,-4.3658308045106786e-8,0.002369390127550806,3.4144946605107745e-5,-4.340234799568976e-8,0.002369737050180081,3.390358038895181e-5,-4.311066755298774e-8,0.0023701849761484078,3.367640314542406e-5,-4.283404275674573e-8,0.002370725808074802,3.351105695568608e-5,-4.262900855450118e-8,0.0023713306372070224,3.344998149691437e-5,-4.254638292238252e-8,0.0023719519724518553,3.351806525291478e-5,-4.261657041710548e-8,0.0023725329401571575,3.371175366291013e-5,-4.283642668257849e-8,0.0023730222295828053,3.3995002702351264e-5,-4.316414308379054e-8,0.002373389973065274,3.430578520129685e-5,-4.3526671192005085e-8,0.0023736381505010734,3.4572328983584834e-5,-4.38388242013889e-8,0.0023738010098588143,3.473355012811767e-5,-4.402752760022938e-8,0.00237393531167498,3.4756315512409036e-5,-4.40524591922618e-8,0.0023741041518875864,3.4643979531241987e-5,-4.391644020525929e-8,0.0023743597715574142,3.443428581685144e-5,-4.366325823519776e-8,0.002374730275263065,3.418808569592938e-5,-4.336456918047751e-8,0.0023752135991477064,3.397259983293269e-5,-4.3100208376556956e-8,0.002375779941817866,3.384415723124978e-5,-4.293768908589405e-8,0.0023763813960745914,3.383531261076801e-5,-4.2916694132470866e-8,0.0023769653178674142,3.394966546843266e-5,-4.304258701004152e-8,0.0023774870203995034,3.416488144273135e-5,-4.3289677344681276e-8,0.002377918235263097,3.444154087954113e-5,-4.3611544323386645e-8,0.0023782499725694506,3.473394751413563e-5,-4.3953871457543554e-8,0.002378490676997382,3.499948400810439e-5,-4.4265690042450136e-8,0.002378661785361829,3.520478219905836e-5,-4.45068771402646e-8,0.0023787927125148967,3.5328684667322306e-5,-4.465179236135274e-8,0.0023789164661922424,3.5362982250262976e-5,-4.4690190041228925e-8,0.002379066168330197,3.531210837114164e-5,-4.462683919511151e-8,0.0023792721073279486,3.519257964256899e-5,-4.448085699607398e-8,0.0023795586569317585,3.50323249823028e-5,-4.4284979324380445e-8,0.0023799404698155602,3.486935159153574e-5,-4.408411931944888e-8,0.00238041786411957,3.4748539855140206e-5,-4.39317205628605e-8,0.0023809723866902452,3.471506365948844e-5,-4.38820214882267e-8,0.0023815649852208134,3.48036933953732e-5,-4.397726798401748e-8,0.0023821401857936045,3.502563195655052e-5,-4.423182507960411e-8,0.0023826385643343764,3.535804096673262e-5,-4.461940477123716e-8,0.002383015549616911,3.574351081297848e-5,-4.507218244911266e-8,0.0023832590121007622,3.610394768843331e-5,-4.549722500288198e-8,0.0023833960729126107,3.6365403192313095e-5,-4.5806082879119395e-8,0.0023834844707587666,3.6482794911242564e-5,-4.594430660481812e-8,0.0023835926131679144,3.6453070353420245e-5,-4.5907232417809996e-8,0.0023837780068744117,3.6312527567923084e-5,-4.573698815443366e-8,0.002384072504190872,3.612228458903607e-5,-4.550549834835012e-8,0.002384477540262076,3.594951747525463e-5,-4.529245938741677e-8,0.0023849679834993427,3.5850894327466484e-5,-4.516576690664186e-8,0.0023855013057676516,3.586164050491832e-5,-4.5168379713013465e-8,0.0023860287687607305,3.599113018920311e-5,-4.5312724744731254e-8,0.002386506003294634,3.6224400739596276e-5,-4.558208417162952e-8,0.0023869010817420566,3.65281921996621e-5,-4.5937482125035984e-8,0.0023871989250919125,3.685955147899608e-5,-4.632784241705567e-8,0.002387401820865755,3.7174763898084735e-5,-4.6700739768763154e-8,0.002387526785819297,3.7436733765039484e-5,-4.701140163670798e-8,0.0023876010849905364,3.761979915266924e-5,-4.7228628272774645e-8,0.00238765727041805,3.771186667545958e-5,-4.733742080218521e-8,0.002387728725155376,3.7714449644070145e-5,-4.7339022820513065e-8,0.0023878460686218663,3.764152424039279e-5,-4.724953688088123e-8,0.002388034216505095,3.751792399775393e-5,-4.709805432518741e-8,0.0023883096269505005,3.7377464417580596e-5,-4.692455759226862e-8,0.002388677274146209,3.726041803036959e-5,-4.677709598428318e-8,0.0023891272588487315,3.720938268477899e-5,-4.6706986835451093e-8,0.0023896319399229,3.7262272101778856e-5,-4.6760418636059854e-8,0.0023901458647094826,3.7441849520893325e-5,-4.696572132812101e-8,0.002390611746871633,3.774354152197786e-5,-4.731844757029362e-8,0.0023909747687158945,3.81269601588696e-5,-4.777091840959034e-8,0.002391202906290385,3.8519192870702565e-5,-4.823603735908806e-8,0.0023913040660786186,3.883476948556154e-5,-4.8611270833999345e-8,0.002391328128732739,3.9006667440986484e-5,-4.881589018117696e-8,0.00239134943562406,3.90124026913742e-5,-4.882222941094568e-8,0.002391438487576229,3.8880411452464615e-5,-4.866331475848319e-8,0.0023916383708005662,3.867507853522781e-5,-4.841510309828039e-8,0.00239195590432241,3.847153998643774e-5,-4.816669872463936e-8,0.0023923668018147257,3.833341819751815e-5,-4.799408876442468e-8,0.002392828007801345,3.830015839190798e-5,-4.794511807386538e-8,0.0023932907590552147,3.8383856123547755e-5,-4.8035481865629606e-8,0.00239371096036409,3.857245714578611e-5,-4.82521178047072e-8,0.0023940559931876475,3.883616405890264e-5,-4.856042818085454e-8,0.0023943082930363074,3.9134985874419545e-5,-4.891304887908877e-8,0.0023944662220829185,3.9426309839536574e-5,-4.925889576057055e-8,0.0023945426540706474,3.967167832740828e-5,-4.955145041930234e-8,0.0023945617795173573,3.984206233309221e-5,-4.975530429415886e-8,0.002394554803373748,3.992121054124771e-5,-4.985033218746083e-8,0.00239455526447015,3.990695202747839e-5,-4.983330111917577e-8,0.002394594661569528,3.9810623353083994e-5,-4.971716322616409e-8,0.0023946988252229935,3.965513390937551e-5,-4.952874150407233e-8,0.0023948850777624304,3.9472259325648355e-5,-4.9305586614794425e-8,0.00239515997526318,3.9299439114975593e-5,-4.909233045733194e-8,0.0023955174021503037,3.9175945382072434e-5,-4.893628682300761e-8,0.002395937007932476,3.9137890421156826e-5,-4.8881533371822775e-8,0.002396383695909191,3.921131979781866e-5,-4.896047917113908e-8,0.0023968099593563576,3.9403258047878505e-5,-4.918277327372618e-8,0.002397163497613983,3.969252739918278e-5,-4.952387416863947e-8,0.0023974015854493413,4.002518309701328e-5,-4.99193026544001e-8,0.002397509675261247,4.0321678158350774e-5,-5.027326909845036e-8,0.0023975151824612907,4.049998955523513e-5,-5.048669925554299e-8,0.0023974844671535013,4.050819106081807e-5,-5.049657166197553e-8,0.002397499090668801,4.034853438152713e-5,-5.0304833087084466e-8,0.0023976229322382613,4.007667775600651e-5,-4.997738881179162e-8,0.002397879519985696,3.977656534145411e-5,-4.96140773901125E-08,0.0023982502957491016,3.9527801939768744e-5,-4.93098968993077e-8,0.002398689129527083,3.938302665345923e-5,-4.912820157919039e-8,0.002399141121851689,3.936112368628708e-5,-4.9092584839070415e-8,0.002399557122870482,3.945190021821551e-5,-4.919217196871091e-8,0.002399901681190261,3.9625470595205126e-5,-4.939240127952472e-8,0.0024001557140803276,3.9841782493496445e-5,-4.9646053324931454e-8,0.00240031603823306,4.0058414074826275e-5,-4.990243651972935e-8,0.0024003933848322214,4.02365269468108e-5,-5.0114610330648764e-8,0.0024004095942288745,4.034539638022784e-5,-5.0245052214989265e-8,0.0024003941453741816,4.0365693589607254e-5,-5.0269831914895396e-8,0.0024003801497172756,4.0291449589680024e-5,-5.018110199371788e-8,0.0024004000531943383,4.013054961443052e-5,-4.9987707246810776e-8,0.0024004814327914467,3.990360304898532e-5,-4.9713797552627094e-8,0.0024006433784475078,3.96412645683471e-5,-4.9395635374628664e-8,0.002400893829350257,3.938038444905259e-5,-4.907710595026679e-8,0.0024012280072063545,3.9159384872200925e-5,-4.88043653842751e-8,0.002401627983789423,3.901309599496099e-5,-4.861979177381442e-8,0.0024020634684160267,3.896712290496793e-5,-4.8555194568685595e-8,0.0024024942344411503,3.903172416614497e-5,-4.862420076639316e-8,0.0024028751869229125,3.919562945854613e-5,-4.881439962151439e-8,0.0024031652429550516,3.942160059336088e-5,-4.908159561584208e-8,0.0024033401183291706,3.964740296327271e-5,-4.9350792145343485e-8,0.002403406122558092,3.9796826052265784e-5,-4.952959530944614e-8,0.0024034075771528214,3.9802695108078196e-5,-4.953626629721684e-8,0.002403418663533099,3.963531471377749e-5,-4.933424264248788e-8,0.002403517483513351,3.9320414167136537e-5,-4.895377104664041e-8,0.00240375400559779,3.893213949475224e-5,-4.848339885001966e-8,0.0024041310350306584,3.856275056172833e-5,-4.803360539427687e-8,0.002404608522803643,3.8287467657906244e-5,-4.7694797328705657e-8,0.002405124618903588,3.814364277978108e-5,-4.7512463896821273e-8,0.002405618526611032,3.812961405164927e-5,-4.748570334517685e-8,0.0024060450436589023,3.821594093326314e-5,-4.7580367143404314e-8,0.002406379515424713,3.8359386346411104e-5,-4.774544974096198e-8,0.0024066165603803674,3.851416440298249e-5,-4.7926337409967924e-8,0.002406766193043988,3.863916072047892e-5,-4.8073452764022304e-8,0.0024068496190933135,3.870200493814187e-5,-4.814731567974312e-8,0.0024068954751543747,3.8681384728337856e-5,-4.812157280049673e-8,0.0024069363302526986,3.8568469741027326e-5,-4.7984907944708237e-8,0.002407005092363638,3.8367620010703626e-5,-4.774197343294295e-8,0.0024071311642991904,3.8096143001373596e-5,-4.741307791637707e-8,0.00240733648448139,3.7782662926820594e-5,-4.703219316231057e-8,0.0024076319591230843,3.746376601902139e-5,-4.664296180742872e-8,0.0024080150100535243,3.717901842199488e-5,-4.629284851707181e-8,0.0024084688627471237,3.6964873105139e-5,-4.6025986316963574e-8,0.002408963950387803,3.684822663195842e-5,-4.587550926484438e-8,0.002409461535231225,3.6840528070730786e-5,-4.585634918576009e-8,0.0024099194289861434,3.6933325176103526e-5,-4.595954827428758e-8,0.002410299639091284,3.709615129870326e-5,-4.6149286023116704e-8,0.0024105775736920194,3.727809719448076e-5,-4.636443290545415e-8,0.0024107515290991625,3.7414947503234764e-5,-4.652707276927955e-8,0.0024108494422053167,3.744332346904537e-5,-4.6559778833502254e-8,0.0024109280582808607,3.732068196771385e-5,-4.641012552830863e-8,0.0024110599588631028,3.704486401008396e-5,-4.6074593882075726e-8,0.0024113092457543352,3.666207745630117e-5,-4.560832165779338e-8,0.0024117058579894443,3.625440453889971e-5,-4.511002792620606e-8,0.00241223320394758,3.590984658345839e-5,-4.468591059086578e-8,0.0024128367433007784,3.569068786073452e-5,-4.4411566261216975e-8,0.002413447167854588,3.561679042361314e-5,-4.431182379727306e-8,0.002414003943390364,3.566857531655897e-5,-4.4364131508880796e-8,0.002414468917828636,3.5802128924618506e-5,-4.45164528407243e-8,0.0024148287689588913,3.596582802687616e-5,-4.4707042649597976e-8,0.0024150906323866994,3.6112294226174406e-5,-4.487876186163635e-8,0.0024152756199526553,3.620466985756144e-5,-4.4986732147043753e-8,0.002415412983422486,3.621886433437632e-5,-4.5001246595991545e-8,0.002415535705571361,3.614384708305006e-5,-4.490832914512481e-8,0.0024156771163272757,3.59813440871689e-5,-4.470949129805716e-8,0.0024158678193869285,3.5745351613970705e-5,-4.442116416614326e-8,0.002416132416351302,3.546120330008051e-5,-4.4073537242749924e-8,0.0024164859220694446,3.516352548830468e-5,-4.370808294460031e-8,0.00241693034169506,3.4892359785693274e-5,-4.337295078484064e-8,0.0024174524408001833,3.468719086143528e-5,-4.3115900098566585e-8,0.002418023930833043,3.457944258321774e-5,-4.2975364635792224e-8,0.002418604957254082,3.4584872568489474e-5,-4.297126534219297e-8,0.002419150952416655,3.469789771516463e-5,-4.30979643194712e-8,0.0024196218300455495,3.48898251884466e-5,-4.3321783064122653e-8,0.0024199916518604678,3.51121471359681e-5,-4.3584618304832864e-8,0.002420256595170644,3.5304987746849386e-5,-4.381393076419317e-8,0.002420439070447764,3.54098460734516e-5,-4.393818240200917e-8,0.002420585972638163,3.5384692412318615e-5,-4.39053621156832e-8,0.0024207596255476035,3.521796937688811e-5,-4.3700303187940916e-8,0.00242102169533141,3.493649672842064e-5,-4.335458114598203e-8,0.0024214136673983418,3.460203389622349e-5,-4.294254391313394e-8,0.0024219412696859064,3.4294397281599166e-5,-4.2560928350924536e-8,0.002422570997871016,3.40859042454751e-5,-4.2297873198728576e-8,0.002423241774708797,3.401825188013031e-5,-4.220478688725671e-8,0.002423886226246646,3.4092534703597756e-5,-4.2284029344064495e-8,0.002424450990286084,3.4275193790697986e-5,-4.2495842308161056e-8,0.002424907897269756,3.4513860089160096e-5,-4.277731373829174e-8,0.002425254646420478,3.475404717614502e-5,-4.306250514379759e-8,0.0024255087764721997,3.495073098604035e-5,-4.329653600382793e-8,0.0024256997145779124,3.5073628211510956e-5,-4.344214009667556e-8,0.0024258619447215263,3.510795400575972e-5,-4.3480765687463235e-8,0.002426030203565686,3.505305808974759e-5,-4.341105272837135e-8,0.0024262362674914877,3.4920608081784176e-5,-4.3246676601309794e-8,0.0024265064422872465,3.473295174654087e-5,-4.3014350394663596e-8,0.0024268589868617334,3.4521461493677566e-5,-4.275180769052857e-8,0.002427301138503399,3.432410975088323e-5,-4.250490759677728e-8,0.0024278260913050916,3.418129571204661e-5,-4.2322676945393295e-8,0.002428411097108386,3.4129280643721544e-5,-4.2249456747169526e-8,0.002429018449007624,3.4191654643649516e-5,-4.231457750259257e-8,0.002429600921945329,3.4370848029145066e-5,-4.2521942446609057e-8,0.002430111852543173,3.464306742421111e-5,-4.284362752322127e-8,0.0024305177078212167,3.4960014332554184e-5,-4.322166147588011e-8,0.0024308089963019476,3.525864256604065e-5,-4.3579634420191055e-8,0.0024310052103568625,3.54768490791095e-5,-4.3841674275576033e-8,0.0024311514832499894,3.5570331945046896e-5,-4.3953026184890535e-8,0.0024313076209347257,3.552531869349453e-5,-4.389576556823521e-8,0.0024315325810961527,3.5363327353876604e-5,-4.369491031447773e-8,0.0024318686265469066,3.513647254223246e-5,-4.341303915546696e-8,0.0024323294873825944,3.491423748049786e-5,-4.3134445579347336e-8,0.002432896167264619,3.476495141289254e-5,-4.294268271529085e-8,0.0024335222309093078,3.4737272570903575e-5,-4.2897907650809233e-8,0.0024341473034816276,3.484777220801906e-5,-4.3021473228785095e-8,0.0024347141143896403,3.5078911481254485e-5,-4.3293103813853885e-8,0.0024351828565165653,3.5387420696509406e-5,-4.3660807647483854e-8,0.0024355382696882246,3.571869639847352e-5,-4.4058284519528546e-8,0.0024357886769330174,3.602113490945862e-5,-4.442243365076725e-8,0.0024359595899447976,3.6255981177570735e-5,-4.470551282002724e-8,0.002436085616257832,3.64014787157889e-5,-4.4880378715262854e-8,0.002436203431207954,3.645261201880796e-5,-4.49403083766768e-8,0.002436346881699283,3.641860110716656e-5,-4.489600455109322e-8,0.0024365439720128446,3.631989439005647e-5,-4.477193408814986e-8,0.002436814886263786,3.618547757967348e-5,-4.460305079373914e-8,0.0024371701965660787,3.605043991849035e-5,-4.443187709405474e-8,0.0024376087810835056,3.5953118153448417e-5,-4.430512313890507e-8,0.002438115638816738,3.593080766479197e-5,-4.42685612060324e-8,0.0024386606910261066,3.601319060175138e-5,-4.43590417894124e-8,0.0024392005329820178,3.621366124796751e-5,-4.459380937231256e-8,0.0024396852406738875,3.652073535771226e-5,-4.495979153559817e-8,0.002440070792536112,3.689393707336404e-5,-4.540830813754903e-8,0.0024403341938348043,3.7269028978704966e-5,-4.586125501539923e-8,0.0024404847869948067,3.757420212930339e-5,-4.6230801286461525e-8,0.0024405649339235085,3.775253295873212e-5,-4.6446847061845124e-8,0.0024406379971211724,3.778108573313487e-5,-4.6480442904616754e-8,0.0024407684360130493,3.7678040163525975e-5,-4.635265130274541e-8,0.002441002576816896,3.749564568269083e-5,-4.6126207922268527e-8,0.0024413569455008703,3.730344562480743e-5,-4.58853778897302e-8,0.0024418164775716804,3.716885726843634e-5,-4.571251766869334e-8,0.002442341086211704,3.7141004685513786e-5,-4.566838003723965e-8,0.002442877339190302,3.72411338432493e-5,-4.5780171769525656e-8,0.002443371731515466,3.746064251142103e-5,-4.603872319654958e-8,0.002443782406429579,3.7766052234272806e-5,-4.640413953378797e-8,0.002444086872764397,3.810893879139721e-5,-4.681768347059421e-8,0.002444284388309687,3.843785498667255e-5,-4.721633349478445e-8,0.002444393232414692,3.8709012326829734e-5,-4.7546011694557105e-8,0.002444444549161754,3.889334328329184e-5,-4.7770454539860257e-8,0.002444475074792687,3.8979187827749855e-5,-4.787468720267451e-8,0.0024445206944451194,3.8971331473534686e-5,-4.7863936944109584e-8,0.0024446118314487707,3.8887888173957045e-5,-4.775982946018779e-8,0.0024447706911564257,3.8756507830295623e-5,-4.7595742185117445e-8,0.002445009754862674,3.861079858955392e-5,-4.741246632391835e-8,0.002445330792627307,3.848709249206566e-5,-4.7254353116952106e-8,0.0024457239072774276,3.84210898084392e-5,-4.7165331531864033e-8,0.002446166646694304,3.844355610942536e-5,-4.71836986496915e-8,0.002446624062616858,3.857428817952799e-5,-4.733464480752854e-8,0.0024470514934107203,3.88144481598043e-5,-4.762062321108293e-8,0.002447402125327943,3.913928762815128e-5,-4.801212199106996e-8,0.0024476400881559847,3.9495739935443694e-5,-4.8444475535150416e-8,0.0024477561339314394,3.981049166716775e-5,-4.8827712071902615e-8,0.002447778077693695,4.001077266348328e-5,-4.9072160123498955e-8,0.0024477670483197492,4.005148747549024e-5,-4.9121840338880554e-8,0.0024477974812433497,3.993465087268592e-5,-4.897832831402965e-8,0.002447929926440992,3.9709268450711776e-5,-4.870064967828901e-8,0.0024481909223161946,3.9451954414470326e-5,-4.838174394154787e-8,0.0024485684783898502,3.923993501418732e-5,-4.811575988446022e-8,0.0024490213965491316,3.9129377699806304e-5,-4.797180052202577e-8,0.0024494948154261892,3.91451644029732e-5,-4.798138431887394e-8,0.002449935069477873,3.928119976470324e-5,-4.8138482471436045e-8,0.002450300397506881,3.9507323269912974e-5,-4.840749035993413e-8,0.0024505668157711494,3.9779044908857327e-5,-4.8734735279841313E-08,0.0024507297637555462,4.004759573096723e-5,-4.906061161920809e-8,0.002450802394303154,4.02688488745371e-5,-4.9330599704006644e-8,0.0024508113644507706,4.0410128173367605e-5,-4.95038655686505e-8,0.002450791125069385,4.0454212555310635e-5,-4.955844487476108e-8,0.0024507778465312773,4.040035570468197e-5,-4.949267054201453e-8,0.0024508040198822152,4.026270069107783e-5,-4.932327950223557e-8,0.0024508944505534447,4.006688255862525e-5,-4.908122347286046e-8,0.0024510638634689867,3.984580917053899e-5,-4.880648823794057e-8,0.00245131584498336,3.963541528939374e-5,-4.854295462312273e-8,0.002451642653661857,3.9470681141633724e-5,-4.833364518839405e-8,0.002452025536044154,3.938176083843848e-5,-4.8216083300638214e-8,0.002452435488543121,3.938977033584164e-5,-4.8217107227132724e-8,0.002452835048062748,3.950174696583605e-5,-4.8346481745672895e-8,0.0024531824507044967,3.970500384005907e-5,-4.858962496972789e-8,0.0024534396241559695,3.9962702831889606e-5,-4.890182990265696e-8,0.0024535843268946146,4.021443150526203e-5,-4.920880941676828e-8,0.002453623652929858,4.0386636134526066e-5,-4.9419622792017125e-8,0.002453601452891794,4.041499005959166e-5,-4.945444695873122e-8,0.0024535904575645672,4.0272043808040254e-5,-4.9278768855135644e-8,0.002453667088416081,3.9984366591700615e-5,-4.892445528448971e-8,0.0024538804961186404,3.9625472135700606e-5,-4.8481018851177726e-8,0.002454234041076148,3.9286627001372286e-5,-4.8059919577965076e-8,0.002454688758937021,3.90430339964667e-5,-4.7753378723272426e-8,0.002455182859858328,3.893307901809375e-5,-4.760913419343073e-8,0.0024556538362148746,3.895585698194267e-5,-4.762729962876685e-8,0.0024560537286482022,3.908100050787737e-5,-4.777201985779246e-8,0.00245635559786168,3.92623565237223e-5,-4.7987768345426784e-8,0.002456553543520675,3.945013089553443e-5,-4.821391608652092e-8,0.002456659304914327,3.9599666210168044e-5,-4.839543997652059e-8,0.002456697551274787,3.9677063676223765e-5,-4.849000855734107e-8,0.002456700822614684,3.966238759049165e-5,-4.847222180997126e-8,0.0024567044573505052,3.9550907364328136e-5,-4.833540821334541e-8,0.0024567417680072287,3.935256550822404e-5,-4.8091109193474636e-8,0.0024568398052084747,3.9089819952275556e-5,-4.776643242859904e-8,0.002457016102034005,3.879409971555748e-5,-4.739964644423014e-8,0.0024572767266246858,3.850135084065896e-5,-4.7034702557923994e-8,0.002457615714144817,3.8247292949526414e-5,-4.671548886753261e-8,0.002458015719767934,3.806281830374309e-5,-4.648030512056859e-8,0.0024584497093368225,3.7969709899505705e-5,-4.6356668032574766e-8,0.0024588835950892117,3.797672416493626e-5,-4.6356402548602995e-8,0.002459280019112911,3.8076035091713856e-5,-4.647098884390965e-8,0.0024596039507214372,3.8240450757803655e-5,-4.666776031810568e-8,0.0024598307142160007,3.842294852242427e-5,-4.68890281670926e-8,0.002459955918353923,3.8561282527527495e-5,-4.7057687283657186e-8,0.0024600044256263562,3.85906258738798e-5,-4.7093002809037085e-8,0.0024600323640595525,3.846469351560399e-5,-4.693699010582562e-8,0.002460115198327215,3.817888591278212e-5,-4.658318142014719e-8,0.0024603211513315733,3.778139333481038e-5,-4.609033001301854e-8,0.0024606816896058582,3.7360118141523624e-5,-4.5566248750844804e-8,0.0024611773581020993,3.700873869629158e-5,-4.5126111329188663e-8,0.0024617480565587665,3.679136890764092e-5,-4.484915535672109e-8,0.0024623194040428297,3.6725241793431914e-5,-4.4757458521259293e-8,0.002462828313114861,3.6785610286324895e-5,-4.4821776764596e-8,0.0024632368323780508,3.692313753770688e-5,-4.49825480110503e-8,0.002463533911415987,3.7081973038857536e-5,-4.517174974987359e-8,0.002463730207416001,3.72123954530806e-5,-4.5328262829285335e-8,0.0024638508339381053,3.727738907944816e-5,-4.540602228952397e-8,0.0024639287406243806,3.725496815222289e-5,-4.537712390347134e-8,0.002463999440178538,3.7138246844026674e-5,-4.523220853693909e-8,0.002464096769834068,3.693441043162565e-5,-4.4979410248424785e-8,0.002464249278477507,3.6662920271676045e-5,-4.464221452771284e-8,0.0024644771058909905,3.6352892349154964e-5,-4.4256185173269244e-8,0.0024647894963774355,3.60394813223482e-5,-4.3864446992286476e-8,0.00246518333004217,3.575928664507124e-5,-4.3512032388348086e-8,0.00246564308966862,3.5545192829730305e-5,-4.323961698689231e-8,0.002466142462746481,3.54212599682058e-5,-4.30773347216381e-8,0.0024666475561435836,3.539825611996659e-5,-4.303928925890125e-8,0.002467121549800276,3.5470424064565755e-5,-4.311941218583528e-8,0.002467530510301026,3.5614038369783264e-5,-4.328936880925462e-8,0.0024678501018424014,3.578830836147025e-5,-4.3499317664747304e-8,0.00246807277205011,3.5939557401127685e-5,-4.368284640476247e-8,0.0024682141340358534,3.6009986170699735e-5,-4.3767824546787344e-8,0.002468315806348312,3.595167953042106e-5,-4.369398422338407e-8,0.002468440719277613,3.574403825458124e-5,-4.343483114258189e-8,0.0024686576285004418,3.5408406295791984e-5,-4.301598790135291e-8,0.002469016756628685,3.5009868675168896e-5,-4.251749277816247e-8,0.002469527016305481,3.4639085816369505e-5,-4.2051331770138575e-8,0.0024701491272457075,3.437918303108398e-5,-4.172053655964463e-8,0.0024708107727132163,3.4275108324639473e-5,-4.1581346163947136e-8,0.0024714349391305145,3.432221330845508e-5,-4.162900742123513e-8,0.0024719649634269477,3.447673339527891e-5,-4.181047415170179e-8,0.0024723756773897968,3.4677347990773343e-5,-4.2050733510056084e-8,0.0024726711706196352,3.486498141779451e-5,-4.227704642717137e-8,0.002472875776800631,3.499457801076819e-5,-4.243345755026598e-8,0.002473024311147267,3.5039164456257024e-5,-4.248596282344877e-8,0.002473154485424879,3.49892258455584e-5,-4.24219893311207e-8,0.0024733018836487117,3.485023256564978e-5,-4.224757508831041e-8,0.0024734966693373177,3.4639859686924084e-5,-4.198405931463602e-8,0.002473761122223743,3.4385249288497285e-5,-4.166470061647262e-8,0.0024741075410927692,3.412005527399114e-5,-4.1330957835760266e-8,0.0024745365035125336,3.388081280598191e-5,-4.1027956557272016e-8,0.0024750358991933777,3.3702298329276224e-5,-4.0798783384882296e-8,0.002475581446443766,3.361205682415149e-5,-4.0677810154140694e-8,0.0024761393094790735,3.362488283309667e-5,-4.068393655070341e-8,0.00247667099923248,3.3738415010136826e-5,-4.081509111115514e-8,0.0024771401592741794,3.393112591255991e-5,-4.104553604679316e-8,0.0024775202300596727,3.4163782098038836e-5,-4.132736396042357e-8,0.0024778015552186553,3.4384841805604154e-5,-4.15968981141725e-8,0.002477996355230064,3.453957481857277e-5,-4.178587242689799e-8,0.002478139925461257,3.4582095835946386e-5,-4.183646089222978e-8,0.0024782863608294597,3.448855008036613e-5,-4.171792894077942e-8,0.002478497599215119,3.426810101996982e-5,-4.1440616533293496e-8,0.002478826423475806,3.3966768621773196e-5,-4.106097101147728e-8,0.002479297655651806,3.365920201414745e-5,-4.067146491268234e-8,0.0024798956470742607,3.3427359889743966e-5,-4.0374142208359564e-8,0.002480566263107198,3.333281657692773e-5,-4.0246164098665086e-8,0.0024812348815230548,3.339569240715765e-5,-4.031349099874403e-8,0.002481832069138389,3.359098154088289e-5,-4.054608293176884e-8,0.0024823140828337882,3.3862509899205475e-5,-4.087496962472572e-8,0.0024826701499891905,3.4144843169478624e-5,-4.121926049669797e-8,0.0024829174589391183,3.438196398751778e-5,-4.150927531351717e-8,0.002483090231395934,3.453716218275256e-5,-4.169890994247633e-8,0.0024832289273681676,3.459479555529096e-5,-4.1768010969739914e-8,0.0024833725099405357,3.455739202683464e-5,-4.171898971311369e-8,0.002483553953461178,3.444130953944551e-5,-4.1571586234288615e-8,0.002483797896582137,3.42726872143246e-5,-4.135789466565913e-8,0.002484119250717028,3.408404982664835e-5,-4.111811949072816e-8,0.0024845220544084173,3.3911157045767064e-5,-4.08966177191401e-8,0.0024849984608592214,3.378942234513219e-5,-4.073744810316272e-8,0.002485528319030998,3.37493393541924e-5,-4.0678740705520224e-8,0.0024860802611576817,3.381090099062003e-5,-4.07458217081001e-8,0.002486615292822404,3.3977887022200906e-5,-4.094410565553709e-8,0.0024870933615432594,3.4233776242617746e-5,-4.1253884823212716e-8,0.0024874822433588704,3.454145160287273e-5,-4.162972775740252e-8,0.0024877666980437367,3.4848325612800404e-5,-4.200659476353093e-8,0.002487954948091704,3.5096872718110185e-5,-4.2312767159825944e-8,0.0024880797904155523,3.523845842873798e-5,-4.248704298833028e-8,0.002488193043039279,3.5246843277377304e-5,-4.249570636640487e-8,0.0024883539592743067,3.512738494103619e-5,-4.234426909230887e-8,0.0024886140602875923,3.49187025600563e-5,-4.207987071532803e-8,0.002489002194927896,3.468515900952789e-5,-4.178219564842183e-8,0.0024895143834379584,3.450085337149065e-5,-4.1543686661381805e-8,0.002490112692358687,3.4428839747837344e-5,-4.144362746866002e-8,0.002490735095733774,3.4502254176917696e-5,-4.152441444489307e-8,0.002491313820334456,3.47148501990305e-5,-4.177943206499539e-8,0.0024917952057646542,3.5025110867509906e-5,-4.21578484386859e-8,0.002492153108185882,3.537166319265242e-5,-4.2583614770799746e-8,0.0024923915653697563,3.569250545655623e-5,-4.297938359576452e-8,0.0024925381077774505,3.594019773552308e-5,-4.328553882965522e-8,0.0024926327298874706,3.608907519420701e-5,-4.346936640882342e-8,0.0024927174854313663,3.6135139860801745e-5,-4.352511605516019e-8,0.0024928293045150462,3.6091731116077385e-5,-4.3468759712982866e-8,0.0024929962078651933,3.598404077227055e-5,-4.3331234070503576e-8,0.002493235828937878,3.584424198247867e-5,-4.315237723752643e-8,0.002493554988497319,3.5707654226319e-5,-4.297612739315671e-8,0.002493949475402431,3.560950550536974e-5,-4.284648196073154e-8,0.002494403814902926,3.558150409860973e-5,-4.2803251027824265e-8,0.0024948914829334063,3.5647523756435825e-5,-4.287670742727347e-8,0.0024953765911673344,3.581825773142045e-5,-4.308089582356996e-8,0.0024958182908375675,3.608573040867354e-5,-4.340666705533066e-8,0.0024961786512342457,3.641986140806195e-5,-4.381718846972339e-8,0.0024964332001036105,3.677013333856981e-5,-4.424981283072611e-8,0.002496580985875428,3.707466125980302e-5,-4.4627260595163124e-8,0.00249664942189288,3.7275972463325826e-5,-4.487730097257107e-8,0.002496690103679088,3.733875515066651e-5,-4.4954995613220536e-8,0.0024967655193018647,3.726250067358835e-5,-4.485864320894178e-8,0.002496931013734003,3.7083456871196986e-5,-4.46324458229267e-8,0.0024972186148263043,3.686490845186074e-5,-4.435466169172905e-8,0.002497628180291189,3.6679510733870065e-5,-4.411582351619956e-8,0.002498128079111284,3.658972340409257e-5,-4.3994441199673844e-8,0.0024986644042137227,3.663208106121771e-5,-4.4037246854020054e-8,0.0024991755753180833,3.680926861936187e-5,-4.4248953740883185e-8,0.002499608064555356,3.709163133072151e-5,-4.459370765840227e-8,0.0024999288144117358,3.742710477725366e-5,-4.500715060851872e-8,0.0025001310412585205,3.775603780312682e-5,-4.5414811573711545e-8,0.0025002324917523817,3.8025992028683344e-5,-4.57506862741052e-8,0.002500267909808244,3.82021913744237e-5,-4.5970516699009e-8,0.0025002791334092648,3.827161818741498e-5,-4.6057156152074936e-8,0.002500306150636883,3.824142696912959e-5,-4.601877616789812e-8,0.002500381023813219,3.813396254515294e-5,-4.588273798227383e-8,0.002500524917925695,3.7980819109320463e-5,-4.5688184530668866e-8,0.002500747387946369,3.781755623906785e-5,-4.547941847511398e-8,0.0025010467943652028,3.7679593748579237e-5,-4.530076608806616e-8,0.002501411000812327,3.759894473403009e-5,-4.5192519652786e-8,0.002501818061535664,3.76010451065458e-5,-4.518700349120371e-8,0.002502237249305373,3.7700983349453346e-5,-4.530383549196263e-8,0.002502631391630373,3.789891117462528e-5,-4.5544060670952407e-8,0.0025029618245448393,3.817544639615828e-5,-4.588418136956523e-8,0.0025031968555852867,3.8489391629367015e-5,-4.6273070203581374e-8,0.002503322900130418,3.878132383082006e-5,-4.6636329847159344e-8,0.0025033544659702643,3.898595666221756e-5,-4.689179674409995e-8,0.0025033366866835474,3.9052160624291637e-5,-4.6974744631872444e-8,0.002503335424761968,3.8963286204251026e-5,-4.686346369928086e-8,0.002503416415545243,3.874697513072474e-5,-4.659163332249408e-8,0.002503622458507168,3.846773122092755e-5,-4.623914977805023e-8,0.0025039595976610314,3.820530008492874e-5,-4.590530882256746e-8,0.002504397631776516,3.802946606966512e-5,-4.5677537488936655e-8,0.002504882299547712,3.798169372682445e-5,-4.560852435839345e-8,0.002505352221421315,3.806826004220745e-5,-4.570743517294879e-8,0.00250575432324309,3.8263797822131395e-5,-4.59439244261933e-8,0.0025060542893460607,3.852145546614233e-5,-4.6260390338084265e-8,0.002506241100184328,3.878568465963214e-5,-4.658768272125083e-8,0.0025063261680084966,3.900454144029845e-5,-4.686046599932783e-8,0.0025063382859264074,3.913932359754488e-5,-4.702948014495108e-8,0.0025063160483484925,3.917014569025023e-5,-4.706882713849625e-8,0.002506299694580531,3.9097007570934184e-5,-4.697758835500036e-8,0.0025063241642786917,3.893705066219002e-5,-4.677655197485161e-8,0.002506414458106024,3.8719469291395064e-5,-4.650187612960767e-8,0.002506583529031959,3.847966713294664e-5,-4.6197729527279165e-8,0.0025068322231723375,3.825390939784268e-5,-4.5909552105830005e-8,0.00250715042643049,3.8075081039815325e-5,-4.5678747389959236e-8,0.002507518671035578,3.79694315028609e-5,-4.553864588391083e-8,0.002507909881434134,3.7953757863868274e-5,-4.551099211154035e-8,0.0025082914429322,3.8032479762118567e-5,-4.560219705504129e-8,0.0025086283062298424,3.819441369790588e-5,-4.5799089344806656e-8,0.002508888222288745,3.8409920504514224e-5,-4.6065065644875405e-8,0.002509049867274366,3.863051042059274e-5,-4.633938175836797e-8,0.002509113004638694,3.879425510226927e-5,-4.654391267553016e-8,0.0025091068429147767,3.883993594289078e-5,-4.6601084959132783e-8,0.0025090898042000585,3.872875934821506e-5,-4.6461387254399373e-8,0.002509134996273683,3.846495952331999e-5,-4.6129379088556667e-8,0.002509303823785431,3.810176136963081e-5,-4.567118163005868e-8,0.0025096206611317003,3.77249340788089e-5,-4.519386918014874e-8,0.0025100635025889603,3.742094334698776e-5,-4.480570179737146e-8,0.0025105750725739227,3.7247279761174246e-5,-4.4579149479260436e-8,0.0025110856597778002,3.721891833235642e-5,-4.4533963341258614e-8,0.0025115347336513087,3.7312355209207396e-5,-4.464198908935113e-8,0.0025118837717088426,3.7479672497395944e-5,-4.4844363555259744e-8,0.0025121197805155586,3.766434463552293e-5,-4.507092241835546e-8,0.0025122524606316582,3.781403239390384e-5,-4.5256039989766344e-8,0.002512308218517646,3.788897265948401e-5,-4.534921710684068e-8,0.002512323198993744,3.7866377431753216e-5,-4.532087455967344e-8,0.0025123364352792246,3.774164049515155e-5,-4.5164209733579505e-8,0.002512383722153255,3.752690440451212e-5,-4.4893662222274306e-8,0.0025124927690744884,3.724752495244522e-5,-4.454058376296237e-8,0.0025126800686300593,3.6937187041074546e-5,-4.4147073781900625e-8,0.002512949640805612,3.663249847498581e-5,-4.3759102263850506e-8,0.0025132935154346414,3.636784559588725e-5,-4.3419995601533096e-8,0.0025136935134270817,3.6171127440481755e-5,-4.3165098457630535e-8,0.002514123766723244,3.606055777639336e-5,-4.301781026749884e-8,0.002514553618955688,3.604231707921164e-5,-4.298663815376317e-8,0.0025149508839445193,3.610876316223164e-5,-4.306282715704458e-8,0.0025152857940081257,3.6237122105096005e-5,-4.321846926867821e-8,0.0025155362609611655,3.6389174493579715e-5,-4.3405830751730746e-8,0.002515694790395706,3.651350376824656e-5,-4.356001367114698e-8,0.002515776049335391,3.6552764092910476e-5,-4.360815615449484e-8,0.0025158217306482694,3.64579617376964e-5,-4.348766977365181e-8,0.002515896936537497,3.620833883698536e-5,-4.317158041654697e-8,0.002516073071847446,3.5828669318152446e-5,-4.269046581534293e-8,0.002516399987719169,3.539060604592482e-5,-4.213413246847748e-8,0.0025168814606322987,3.499021840014745e-5,-4.162331415721513e-8,0.0025174707936113064,3.4710531005774946e-5,-4.126263149227772e-8,0.002518090589616577,3.459078644678115e-5,-4.1102057661954364e-8,0.002518663524727177,3.4618912918017596e-5,-4.112741399925282e-8,0.0025191361740298083,3.474582741761788e-5,-4.1278096176040484e-8,0.0025194875406559848,3.490802432070915e-5,-4.147510457868247e-8,0.002519725292742549,3.504638962014763e-5,-4.16444050552658e-8,0.0025198766141857846,3.5116951628882e-5,-4.173036446018124e-8,0.002519978706172601,3.509468993429849e-5,-4.1700694202266914e-8,0.002520071130482626,3.497310385097045e-5,-4.154621540106111e-8,0.002520190252699242,3.4761794687652565e-5,-4.1278135639874127e-8,0.0025203652372844786,3.448316626617987e-5,-4.092409555262571e-8,0.002520615191656812,3.416849468288395e-5,-4.05232510677893e-8,0.002520947440465501,3.385345763496335e-5,-4.0120551152513905e-8,0.002521357059662189,3.3573332103171066e-5,-3.976057689732734e-8,0.0025218278023055253,3.335822588172072e-5,-3.9481488035551096e-8,0.0025223344083919984,3.3228896480038676e-5,-3.930979257938309e-8,0.0025228460215779803,3.319367073788616e-5,-3.925652251261835e-8,0.0025233303087924958,3.324669892834196e-5,-3.9315015622613785e-8,0.0025237579626117535,3.336760095667987e-5,-3.946031753109398e-8,0.0025241074151963775,3.352256518500154e-5,-3.9650309128366536e-8,0.0025243697315655363,3.366716014331096e-5,-3.982900185191263e-8,0.002524553460207322,3.375163915239177e-5,-3.9933128485974816e-8,0.002524688300114605,3.37298851909107e-5,-3.9903559505638475e-8,0.002524824998114826,3.357240651657453e-5,-3.970202211903166e-8,0.0025250277665400896,3.328120777325597e-5,-3.933021967054159e-8,0.002525356611076024,3.289990453199541e-5,-3.8842803606554595e-8,0.0025258428381231134,3.250914558990305e-5,-3.834160036262284e-8,0.0025264698957574395,3.220189906693548e-5,-3.794432342774024e-8,0.0025271741566565867,3.2047197639093385e-5,-3.773873488953271e-8,0.002527868930050737,3.206296769477658e-5,-3.7748283537389005e-8,0.002528477957775852,3.2214078628227146e-5,-3.792951338789108e-8,0.0025289589671146006,3.243333093220877e-5,-3.8198347470684486e-8,0.002529308244893737,3.2649160481611736e-5,-3.8464834618929027e-8,0.002529551044230285,3.280554245702909e-5,-3.8658136766423037e-8,0.0025297276422903844,3.286996887218826e-5,-3.873662679239773e-8,0.0025298816375502052,3.283279972249427e-5,-3.8687266747971134e-8,0.002530052440279624,3.2702708511500886e-5,-3.852013964263886e-8,0.0025302712732322313,3.250144171865661e-5,-3.8262077101730963E-08,0.002530559210242333,3.22591991158146e-5,-3.7950935413685944e-8,0.002530926148178654,3.2010602838034795e-5,-3.7630466201304596e-8,0.002531370351391248,3.1790798148834993e-5,-3.7345270529438355e-8,0.0025318786907376338,3.1631370951251876e-5,-3.713553615551818e-8,0.0025324279262051433,3.155608559611767e-5,-3.703162366365894e-8,0.0025329874164920214,3.1576901848478516e-5,-3.704907123537745e-8,0.0025335233363896095,3.1691081346079224e-5,-3.71849683887019e-8,0.002534004013295205,3.1880164541897305e-5,-3.741660475396124e-8,0.0025344056658638974,3.211134266810114e-5,-3.770302889521404e-8,0.0025347176716889862,3.234141683476799e-5,-3.798981805268735e-8,0.0025349464931195965,3.25231453918205e-5,-3.821692596727692e-8,0.002535117468766687,3.261356425395861e-5,-3.832919965284332e-8,0.002535273522037362,3.25837585549067e-5,-3.828894828785741e-8,0.0025354694854592633,3.242890013057747e-5,-3.808899818124254e-8,0.0025357608919522735,3.217582413424165e-5,-3.776263794934066e-8,0.002536187666940124,3.1883621764644e-5,-3.738458087106923e-8,0.0025367568259437178,3.1632385404099197e-5,-3.7056717765237276e-8,0.0025374327525164407,3.1499190159307474e-5,-3.687752844703763e-8,0.0025381439662942977,3.152925181564535e-5,-3.690529396896161e-8,0.00253880714969785,3.1717495544648184e-5,-3.7134493175846014e-8,0.002539357012067217,3.201212311537006e-5,-3.7500132915228656e-8,0.002539765928854451,3.233760649167408e-5,-3.79067823651572e-8,0.0025400453147970577,3.2622583246552875e-5,-3.82638918563021e-8,0.0025402331112333227,3.281872156862578e-5,-3.850972952935261e-8,0.002540377487382661,3.290621872055572e-5,-3.8618458257282727e-8,0.002540524155092487,3.288979390474908e-5,-3.8595246105451726e-8,0.0025407093934606078,3.279105867884921e-5,-3.846681028316092e-8,0.002540957537634892,3.2641231271875194e-5,-3.827233474111451e-8,0.002541280815381751,3.247562338960235e-5,-3.805651702208651e-8,0.0025416799467947535,3.232966235413645e-5,-3.786445609457888e-8,0.002542144857740274,3.223562798311164e-5,-3.7737407372711096e-8,0.002542655579590631,3.221938662051105e-5,-3.7708565661377785e-8,0.0025431838362320446,3.229680174430522e-5,-3.779849423590047e-8,0.0025436960054889923,3.247013233511464e-5,-3.8010564296692125e-8,0.00254415790798978,3.272542643389036e-5,-3.8327620226833e-8,0.002544541182956549,3.303226997284184e-5,-3.871155421654684e-8,0.0025448301444755037,3.334704611861932e-5,-3.9107270584671315e-8,0.0025450273211040327,3.3620069672829226e-5,-3.9451574837501164e-8,0.002545155729501141,3.380568399136757e-5,-3.968592063249876e-8,0.002545256556630443,3.387319471601984e-5,-3.977037692107729e-8,0.0025453820443540687,3.3816009067509984e-5,-3.969547432241733e-8,0.002545584452323269,3.365650342624907e-5,-3.948871602576002e-8,0.0025459029162299583,3.344455147949948e-5,-3.9213016496428415e-8,0.0025463510522096334,3.324840420752361e-5,-3.895529090102889e-8,0.002546909232956193,3.3138246514345544e-5,-3.8805530645937213e-8,0.002547525817875957,3.31656565561402e-5,-3.883045961997576e-8,0.002548129745697608,3.334578366524815e-5,-3.9050513834874766e-8,0.002548651901131051,3.3650693689135876e-5,-3.9431034299941284e-8,0.00254904685669721,3.4018656743914485e-5,-3.989388291545174e-8,0.002549305056062235,3.4375770534290136e-5,-4.034493649891447e-8,0.002549450755241978,3.465939649203068e-5,-4.070401123079711e-8,0.0025495291586907494,3.4833241697630345e-5,-4.092420182378461e-8,0.002549590687379239,3.4890489219274215e-5,-4.099602575860678e-8,0.0025496789205144556,3.4848031855415884e-5,-4.0940251920067316e-8,0.0025498244612649898,3.473730209237217e-5,-4.079637327911076e-8,0.0025500436032672657,3.459585033605535e-5,-4.061196445682029e-8,0.002550339547154352,3.4461308211710806e-5,-4.0434988555481746e-8,0.0025507043433619027,3.4367523260307965e-5,-4.030880973480197e-8,0.0025511206731693597,3.4341897944161364e-5,-4.0268729945377805e-8,0.002551563424104876,3.4402972367080165e-5,-4.03388608138628e-8,0.002552001606617659,3.4557690980306746e-5,-4.0528610973922175e-8,0.002552401461273141,3.479848664498499e-5,-4.082892216673805e-8,0.0025527314827823774,3.510120673609544e-5,-4.120952912256527e-8,0.002552969364218686,3.542565410114826e-5,-4.161951137566323e-8,0.0025531095580215266,3.572058968524942e-5,-4.19935413975739e-8,0.002553168729760865,3.59339104478195e-5,-4.226480110017664e-8,0.0025531858573809097,3.602631744383978e-5,-4.238244913932361e-8,0.0025532150611217693,3.598419299693054e-5,-4.232817322961466e-8,0.002553312233386756,3.582648549097322e-5,-4.212517282076237e-8,0.0025535195183206613,3.560220174300033e-5,-4.1835212060668614e-8,0.002553852830502855,3.537869695525301e-5,-4.15439349344679e-8,0.0025542964378125308,3.5224255096316406e-5,-4.133880357556166e-8,0.002554806195557747,3.519005643611671e-5,-4.1286055750094206e-8,0.002555320571266334,3.5296537354939525e-5,-4.141303722830442e-8,0.0025557766128750385,3.552799805828805e-5,-4.170091750744843e-8,0.002556126465171574,3.583732608559857e-5,-4.209034923582469e-8,0.002556349360987087,3.615973932622834e-5,-4.249882289419115e-8,0.0025564551410904254,3.6431100822784126e-5,-4.284408179364047e-8,0.0025564785276809823,3.6604393384032696e-5,-4.306534222497807e-8,0.002556467160589559,3.6658984478097046e-5,-4.3135357610844236e-8,0.002556468510402671,3.660096821231846e-5,-4.306106582894111e-8,0.0025565200544311623,3.645675748916501e-5,-4.28755593884766e-8,0.0025566445046864778,3.626394236750845e-5,-4.262649174123844e-8,0.0025568493925952245,3.606285126280341e-5,-4.236530656389189e-8,0.002557129168848333,3.589047078361781e-5,-4.213942711868888e-8,0.0025574680949682657,3.5776750212926264e-5,-4.1987475893609535e-8,0.0025578429268030643,3.574244515459497e-5,-4.193647233080398e-8,0.002558225197975276,3.579750560221392e-5,-4.1999734310573656e-8,0.0025585835602312756,3.593934241195524e-5,-4.217460204810126e-8,0.002558887016647417,3.61509584570488e-5,-4.2439939751589254e-8,0.0025591098618594843,3.639984373749989e-5,-4.2754572922321514e-8,0.002559238497448476,3.663948624180955e-5,-4.305908526809104e-8,0.002559278835866122,3.6815737799850185e-5,-4.3283910146574906e-8,0.002559261046831353,3.68791601038681e-5,-4.336518833602966e-8,0.0025592372774527606,3.680125222475687e-5,-4.3265665007869605e-8,0.0025592697003744484,3.658826729490232e-5,-4.299250430234186e-8,0.0025594113266689754,3.6284623802832374e-5,-4.260177686092147e-8,0.0025596874257284618,3.596177093402923e-5,-4.218437109225698e-8,0.0025600863540812774,3.569620677368294e-5,-4.183807532178788e-8,0.002560563687246403,3.554623400075656e-5,-4.1637989758230514e-8,0.002561056690233244,3.553661609585996e-5,-4.161684553067492e-8,0.0025615023865055877,3.565507989845713e-5,-4.176023644906828e-8,0.002561853048804872,3.585927599621287e-5,-4.20151041647804e-8,0.0025620856129585094,3.6090108860365954e-5,-4.230643641429664e-8,0.0025622040446008454,3.628699041834416e-5,-4.255663518033421e-8,0.0025622353918832905,3.6401300490328786e-5,-4.270283147309331e-8,0.0025622213473997326,3.6405401558346106e-5,-4.2708678956345274e-8,0.0025622078408738705,3.6295813489391095e-5,-4.256872173084837e-8,0.0025622353848293975,3.609068615788058e-5,-4.230540259760305e-8,0.00256233232102081,3.582322550250386e-5,-4.1960772840867707e-8,0.002562511863801732,3.553353735483984e-5,-4.158605612885912e-8,0.0025627725248878294,3.526111693837438e-5,-4.123196242121757e-8,0.00256310070883618,3.503928727808233e-5,-4.0941482037820396e-8,0.0025634741471409566,3.4891828381175004e-5,-4.074551346356165e-8,0.002563865248603042,3.483125361276283e-5,-4.066063228427299e-8,0.002564244075042713,3.4857926898380974e-5,-4.068793102758481e-8,0.002564581202623444,3.495942454822687e-5,-4.0812119542659516e-8,0.00256485109943431,3.5110048036088305e-5,-4.100075191629571e-8,0.0025650367242128005,3.527118210779312e-5,-4.120451556732618e-8,0.002565135498337338,3.539413055019303e-5,-4.136076151439963e-8,0.0025651654120114266,3.5427525351978796e-5,-4.1403038721833427e-8,0.0025651680412939974,3.533045146974794e-5,-4.127809559426407e-8,0.0025652038004362098,3.508913423679075e-5,-4.096749224333056e-8,0.0025653363340437958,3.472992631684516e-5,-4.050439181559414e-8,0.0025656093621240807,3.431861032240273e-5,-3.997271395936973e-8,0.0025660270415399614,3.394124366569468e-5,-3.9482630402027894e-8,0.0025665499166005316,3.367374522340637e-5,-3.913169321930131e-8,0.0025671094737676993,3.3555941288687166e-5,-3.8971649823626466e-8,0.0025676326398133926,3.358238507761676e-5,-3.899658257921173e-8,0.00256806353887396,3.3710715096302974e-5,-3.915332696323073e-8,0.0025683748955028416,3.387946611070678e-5,-3.936392740831083e-8,0.0025685688159335627,3.402630843529469e-5,-3.954873741392243e-8,0.0025686706264498697,3.410151913115822e-5,-3.96436201055269e-8,0.002568719735740128,3.4075375284090386e-5,-3.9609586863852165e-8,0.0025687602388208127,3.3940249039981586e-5,-3.9435794394587893e-8,0.002568832735617296,3.370870760914346e-5,-3.913743671001868e-8,0.0025689681542897694,3.340879250968684e-5,-3.874991257803349e-8,0.0025691840551694215,3.307763210742136e-5,-3.832068947589197e-8,0.002569483538443005,3.275462578485857e-5,-3.790047634512565e-8,0.00256985645494049,3.2475309573827486e-5,-3.753521316052912e-8,0.0025702822795653883,3.226668899010827e-5,-3.725997236190257e-8,0.002570733820216625,3.214437650152126e-5,-3.70952464417701e-8,0.002571181033117111,3.211133565934368e-5,-3.70453424363933e-8,0.0025715946013054125,3.215772517602418e-5,-3.7098167201791944e-8,0.002571949318347555,3.226144137496881e-5,-3.722583343084536e-8,0.002572227570996682,3.2389277195387017e-5,-3.738598474604562e-8,0.0025724233208959243,3.249913626791757e-5,-3.752447594345222e-8,0.002572546572517723,3.2544481248383096e-5,-3.7581027423136185e-8,0.002572627105263867,3.248253008845186e-5,-3.7499865346558056e-8,0.0025727146254667485,3.2286766565557764e-5,-3.7246045798024494e-8,0.0025728713746888203,3.196144702345607e-5,-3.6824362906102526e-8,0.0025731546573224077,3.1551122395760685e-5,-3.6291732875808416e-8,0.0025735930611439093,3.113531128318894e-5,-3.5750349486020505e-8,0.0025741686669498156,3.080383281342957e-5,-3.5315932671875985e-8,0.002574818793527538,3.0622158898999846e-5,-3.5073179334983326e-8,0.002575459250901792,3.0606384083367444e-5,-3.5043561582390667e-8,0.0025760157713347175,3.072183306088944e-5,-3.518340880366333e-8,0.0025764462366678763,3.0902486165110045e-5,-3.5408643786040035e-8,0.0025767458975593516,3.107681621716422e-5,-3.562773879707096e-8,0.0025769394739584782,3.118739906047621e-5,-3.5766760816977004e-8,0.0025770682803444704,3.12001551469743e-5,-3.5781267605868635e-8,0.0025771782767451306,3.110525759781823e-5,-3.565767914468704e-8,0.0025773113662062915,3.091339865537416e-5,-3.540879179965687e-8,0.0025774999609862632,3.065026064735654e-5,-3.5066958787603745e-8,0.0025777640357551542,3.035060945700293e-5,-3.4676643389330934e-8,0.002578110043284982,3.0052507451921462e-5,-3.428694627394564e-8,0.002578531397055513,2.9791926281541815e-5,-3.3944523195161236e-8,0.0025790103290381297,2.9598057935518227e-5,-3.368738209113566e-8,0.0025795209096909134,2.948965519446499e-5,-3.354007538112134e-8,0.002580032896739608,2.94727630782897e-5,-3.351077440578792e-8,0.0025805159234916397,2.954000878094914e-5,-3.3590389005577315e-8,0.002580943592558336,2.9671294779383406e-5,-3.375345201478358e-8,0.0025812972568394475,2.983567962877638e-5,-3.3960441519085414e-8,0.002581569412426488,2.9994385199715056e-5,-3.416148972868799e-8,0.002581766674986788,3.0105076417356167e-5,-3.430175679860849e-8,0.0025819120683374308,3.0127919994288804e-5,-3.4329229444587715e-8,0.002582045519993052,3.0034048227300084e-5,-3.420579656011638e-8,0.0025822203949664234,2.9816100977510195e-5,-3.392112802616561e-8,0.002582493526172687,2.9498181435378302e-5,-3.3505790908997055e-8,0.0025829078467866826,2.913934269067586e-5,-3.3035889417979293e-8,0.002583471922975573,2.8823154006253027e-5,-3.261957918279001e-8,0.0025841475821974037,2.8630944686295138e-5,-3.236241863773583e-8,0.0025848575009842015,2.860875020177161e-5,-3.23245690882075e-8,0.0025855132051104206,2.8747336224273945e-5,-3.249487409873808e-8,0.0025860483870083825,2.898840096044825e-5,-3.279872884323055e-8,0.0025864386289602428,2.925160284354101e-5,-3.31328354281292e-8,0.0025867003344974215,2.9464434140691195e-5,-3.340364643567008e-8,0.0025868758817611977,2.9580498213838604e-5,-3.355089908895895e-8,0.0025870163518221215,2.958356532888121e-5,-3.3552916689574256e-8,0.00258716874146591,2.948254760991543e-5,-3.342033057128494e-8,0.0025873690254704456,2.930331685653275e-5,-3.31857940505852e-8,0.0025876396104315717,2.908092911135896e-5,-3.289416461028243e-8,0.0025879892061104566,2.88534249664018e-5,-3.259456856612757e-8,0.0025884138089266786,2.8656989162023898e-5,-3.2334059412977954e-8,0.002588898359017111,2.8521979692271508e-5,-3.215231454490244e-8,0.002589419062272378,2.8469586189780088e-5,-3.2077164254932806e-8,0.002589946473323683,2.8509159090307877e-5,-3.212107523599057e-8,0.002590449393316276,2.8636563050092073e-5,-3.227904091415366e-8,0.002590899361197364,2.8834057391279875e-5,-3.2528461699677137e-8,0.00259127520629838,2.9071975778584452e-5,-3.2831291645010475e-8,0.0025915670649930126,2.9312176621478835e-5,-3.313838678718475e-8,0.0025917793326626975,2.951309804139549e-5,-3.33958896106978e-8,0.0025919320721802777,2.96361235160836e-5,-3.355336698452127e-8,0.002592060388232209,2.9652876016196784e-5,-3.357329612354791e-8,0.0025922110409532205,2.9552949250428954e-5,-3.344128213388367e-8,0.0025924352611730508,2.9350891816452204e-5,-3.3175402893513874e-8,0.0025927770732672843,2.908978789339379e-5,-3.2831114881942346e-8,0.0025932582302109035,2.8837351096213648e-5,-3.2496316807290324e-8,0.0025938644424488276,2.8670845449783314e-5,-3.2271752176790486e-8,0.00259454130569729,2.8651787572331885e-5,-3.223802204062918e-8,0.0025952073153012044,2.880006435961552e-5,-3.242178048536644e-8,0.0025957820237779284,2.9082752023308125e-5,-3.2781025144444316e-8,0.002596215451355888,2.942669394122801e-5,-3.3221292787055197e-8,0.0025965024447693404,2.9748129367640864e-5,-3.3634051131772567e-8,0.0025966765282158253,2.998185229157122e-5,-3.3934507817174133e-8,0.002596791242167228,3.009622528063916e-5,-3.408109516064842e-8,0.0025969011572768027,3.0092558261656323e-5,-3.4074756512656124e-8,0.002597049688176753,2.9995632087270322e-5,-3.3946851949197073e-8,0.0025972643186138377,2.9842572236855614e-5,-3.3744958806311066e-8,0.002597556681278304,2.9673938276303314e-5,-3.3521470462183287e-8,0.002597924726275709,2.9527819877394803e-5,-3.332595043754231e-8,0.0025983552864050196,2.9436122490796813e-5,-3.320019805897644e-8,0.002598826556628034,2.9421965307062316e-5,-3.3174709416024415e-8,0.0025993106853013,2.949756098639174e-5,-3.32658027069346e-8,0.002599776848353735,2.9662467082486734e-5,-3.347330412600232e-8,0.0026001951252648077,2.99025861685836e-5,-3.377926073172787e-8,0.0026005411717937273,3.019067108816419e-5,-3.414860105393843e-8,0.002600801115884702,3.048904747005782e-5,-3.453261736501532e-8,0.0026009756449572323,3.075479964565841e-5,-3.487558988314453e-8,0.0026010821201373643,3.094704699047445e-5,-3.512412559281178e-8,0.0026011537374556978,3.103526998712179e-5,-3.523794137373505e-8,0.0026012352359606815,3.100711111394474e-5,-3.52001023446636e-8,0.0026013752640351045,3.08739211784446e-5,-3.5024463414013454e-8,0.0026016160874248713,3.0672358090410115e-5,-3.475804093991398e-8,0.0026019820559800674,3.0460335902351476e-5,-3.447598865451195e-8,0.0026024694362678106,3.0306029731080202e-5,-3.4267389520307465e-8,0.0026030416290290835,3.0270338541856285e-5,-3.421233572704718e-8,0.0026036342474958208,3.0386657894908002e-5,-3.435533680675956e-8,0.0026041720030882468,3.064594194570206e-5,-3.4685549028801975e-8,0.0026045930310347977,3.09961293659131e-5,-3.513578419828963e-8,0.0026048698621258057,3.1359222083486464e-5,-3.560466452625087e-8,0.002605016277847952,3.165875436058266e-5,-3.5992435719287957e-8,0.0026050775582436726,3.1843809880593544e-5,-3.623231983185307e-8,0.0026051114117463955,3.1899280024474e-5,-3.630395313793583e-8,0.0026051700508598736,3.184180085895025e-5,-3.622821835659225e-8,0.0026052897100294578,3.1707923332180516e-5,-3.605202198717156e-8,0.0026054879335475844,3.154166996092474e-5,-3.5832271992857454e-8,0.0026057657097087847,3.138536625159791e-5,-3.5624031184444675e-8,0.0026061113393798714,3.1274330301516524e-5,-3.5473569113068227e-8,0.0026065041725679677,3.123426843754492e-5,-3.5414846395313414e-8,0.0026069176827509784,3.127995084377525e-5,-3.54676479866181e-8,0.0026073221793504135,3.141424395457776e-5,-3.563622226078849e-8,0.002607687760832499,3.162725534231478e-5,-3.590812143263662e-8,0.002607988052610515,3.189600175406857e-5,-3.6253749808592313e-8,0.0026082048747776295,3.218555030603266e-5,-3.662781876104157e-8,0.0026083332526672066,3.2452725750126513e-5,-3.697411627683993e-8,0.0026083853531278017,3.265297934002162e-5,-3.72343878712858e-8,0.0026083914259650088,3.2749867670578894e-5,-3.736065308576354e-8,0.002608396133617845,3.272507890931113e-5,-3.732831038939484e-8,0.0026084499787289036,3.258582024132688e-5,-3.714589715717855e-8,0.0026085974212649975,3.236651424287259e-5,-3.6857515677651e-8,0.0026088647679620098,3.2123260707560836e-5,-3.65358635683691e-8,0.002609251366434725,3.1921661831404596e-5,-3.6266559361749115e-8,0.0026097270315835943,3.182058662536569e-5,-3.612701970627575e-8,0.002610237284691165,3.185588171012813e-5,-3.6165054551592994e-8,0.002610716126815699,3.202876234196642e-5,-3.6383392719986345e-8,0.0026111037028992033,3.23033372673764e-5,-3.6736088564341154e-8,0.0026113636304113436,3.261570097552551e-5,-3.714014721843922e-8,0.002611493434829786,3.2892780986458314e-5,-3.750008482171149e-8,0.002611523495367077,3.307418573417459e-5,-3.7736560791061143E-08,0.002611505142783382,3.312826382278772e-5,-3.780750968567028e-8,0.002611493763715752,3.3056708359165294e-5,-3.771431792722278e-8,0.0026115341933477952,3.2888214172239555e-5,-3.749370515848177e-8,0.0026116528511147953,3.266635873779777e-5,-3.7202054725746606e-8,0.0026118568135878677,3.2437504850753895e-5,-3.6899719726700316e-8,0.0026121372770168093,3.22421675305727e-5,-3.663975855845446e-8,0.0026124744813415092,3.2110441667230555e-5,-3.646188211570326e-8,0.002612842227916604,3.206036322123708e-5,-3.639018811094762e-8,0.00261321139785924,3.2097696128144984e-5,-3.64327692480781e-8,0.00261355274464152,3.2216066114155835e-5,-3.658181139714531e-8,0.0026138396427348816,3.2397063044748426e-5,-3.681367790345908e-8,0.0026140514872013475,3.261067171343822e-5,-3.708942654441659e-8,0.0026141780311365196,3.2817050683532635e-5,-3.7357080590710184e-8,0.002614224114800926,3.297101014117252e-5,-3.7557436147006555e-8,0.002614213119889088,3.303013696291152e-5,-3.7634673802280204e-8,0.002614186549965068,3.296599359632987e-5,-3.755103806085695e-8,0.0026141973753741167,3.277534783937561e-5,-3.7301599143301795e-8,0.002614297046902401,3.248635183237581e-5,-3.69224435741917e-8,0.0026145197475576695,3.215508644569542e-5,-3.648630993783964e-8,0.002614870090159904,3.185171140863245e-5,-3.608467312200419e-8,0.0026153197674543857,3.164059402548646e-5,-3.5801927989370486e-8,0.0026158147703580206,3.156177686629293e-5,-3.569118447274441e-8,0.0026162903077401106,3.1620210993565046e-5,-3.5760006489734524e-8,0.0026166880991987354,3.1785560398102544e-5,-3.5969814749259693e-8,0.002616970841721617,3.200160523740788e-5,-3.624783231824479e-8,0.002617130261397801,3.220181753315225e-5,-3.65072435138508e-8,0.0026171871606737534,3.232655585316976e-5,-3.6669675925902054e-8,0.00261718397046602,3.233719347395405e-5,-3.6683842036219965e-8,0.0026171724016019787,3.222347506708292e-5,-3.6535405177033614e-8,0.0026172002283405987,3.200264024737339e-5,-3.624607593524087e-8,0.0026173011810684,3.171173130676567e-5,-3.586373455846947e-8,0.0026174902392406083,3.139662825485608e-5,-3.544818102047367e-8,0.0026177642440258567,3.110164755113335e-5,-3.5057518398642445e-8,0.0026181060091383474,3.086218416322592e-5,-3.4738433135395185e-8,0.0026184896650506663,3.070099873181416e-5,-3.452121062024481e-8,0.0026188855768160607,3.062736487635263e-5,-3.441851050195791e-8,0.0026192641644238587,3.063776642104189e-5,-3.44262138034998e-8,0.0026195987827379364,3.071705603650061e-5,-3.452490184616867e-8,0.0026198682621240295,3.083960982102611e-5,-3.4681327174304134e-8,0.0026200597799300902,3.0970713580179304e-5,-3.485016751422272e-8,0.0026201724252346513,3.106906901777973e-5,-3.497724556731821e-8,0.002620221032692184,3.1091763777759243e-5,-3.500601824118333e-8,0.0026202386178564006,3.10028288611161e-5,-3.4888839501679675e-8,0.0026202745150329704,3.0784947027866455e-5,-3.4602410900141006e-8,0.0026203852922867623,3.0450819216758257e-5,-3.416279062923851e-8,0.002620618265425924,3.0047622079189514e-5,-3.363132109745287e-8,0.002620992870319827,2.9648323815135033e-5,-3.31033303947174e-8,0.0026214894619416536,2.932979763141325e-5,-3.267956343422445e-8,0.0026220531242507274,2.9146566799369495e-5,-3.2431878766493014e-8,0.002622611657445149,2.9112958080091928e-5,-3.237984681690709e-8,0.0026230987533740094,2.9201352737337322e-5,-3.248826516711856e-8,0.0026234720422993033,2.935474709537481e-5,-3.268331002587069e-8,0.002623720696604966,2.950580934218716e-5,-3.28772184813543e-8,0.002623863141320352,2.9594733190630928e-5,-3.2991532941629956e-8,0.002623938403472255,2.9581523567624585e-5,-3.2973239176112444e-8,0.0026239948751797743,2.945153944445875e-5,-3.280223748832211e-8,0.002624079352158989,2.9214975075539966e-5,-3.249095709508292e-8,0.0026242282334253994,2.8901697565596798e-5,-3.207786296841002e-8,0.0026244620668671175,2.855315053807396e-5,-3.161700102240202e-8,0.0026247839524003213,2.821331655109691e-5,-3.116615430893701e-8,0.0026251814438661785,2.7920728883389294e-5,-3.077624804492969e-8,0.002625630821426735,2.770290261143587e-5,-3.048387523980967e-8,0.0026261023194173497,2.7573621615054672e-5,-3.030759911853844e-8,0.0026265650867071107,2.753272069170523e-5,-3.024760371638935e-8,0.0026269911754542366,2.7567495629662442e-5,-3.0287542037181364e-8,0.0026273585031503107,2.7654808956776647e-5,-3.0397305793839284e-8,0.0026276531846827346,2.776337289842733e-5,-3.0535989704684127e-8,0.0026278717322375995,2.785627661607388e-5,-3.0655133830369624e-8,0.0026280234298139303,2.7894361322732897e-5,-3.0703083939648824e-8,0.0026281325803872136,2.7841478039741167e-5,-3.063189326845691e-8,0.0026282392000712505,2.7672557297109677e-5,-3.040802070948686e-8,0.0026283955437060506,2.7384085700415085e-5,-3.002625965469175e-8,0.00262865565196701,2.700371371201096e-5,-2.9522515841626875e-8,0.002629057605315128,2.6592301817640855e-5,-2.897657699704715e-8,0.0026296042239974493,2.623136467768682e-5,-2.8495630917078668e-8,0.0026302538309996223,2.599585843503772e-5,-2.8178505464655922e-8,0.002630930614107705,2.5924188462011436e-5,-2.807623809106079e-8,0.0026315519205043305,2.6002942441934412e-5,-2.8171931342658712e-8,0.002632057542513618,2.6175113742488016e-5,-2.8391396121084223e-8,0.0026324258329257447,2.6364726212698507e-5,-2.8635308308118833e-8,0.002632672462723894,2.6502714775448774e-5,-2.881304110057633e-8,0.0026328380412312087,2.6543357889184606e-5,-2.8864178132588297e-8,0.0026329731241864014,2.6469411774491017e-5,-2.8765333495100423e-8,0.0026331258609140727,2.6289281768524357e-5,-2.852665947748336e-8,0.0026333338989213834,2.6030282261764095e-5,-2.8183285436663457e-8,0.002633620171689503,2.573080090149753e-5,-2.7785262712895203e-8,0.002633991642655656,2.5432731091922993e-5,-2.7387706234444074e-8,0.0026344403222787766,2.517473880061446e-5,-2.7041855038120544e-8,0.002634946113457011,2.498684705051351e-5,-2.6787753182580472e-8,0.0026354809501950237,2.4886802821856877e-5,-2.6649271729928865e-8,0.0026360135612485953,2.487845151655501e-5,-2.66318567861711e-8,0.0026365141657436557,2.4952076373098923e-5,-2.672296922722169e-8,0.002636958487571637,2.508635806998142e-5,-2.6894714182866534e-8,0.002637330770592852,2.5251345857424093e-5,-2.7107782135658014e-8,0.0026376258574601534,2.541191401004594e-5,-2.731596108184508e-8,0.002637850566159729,2.5531539580490765e-5,-2.747102088376633e-8,0.002638024527826738,2.557660264320669e-5,-2.7528304916922454e-8,0.0026381802741849004,2.552172015255805e-5,-2.7453780860784707e-8,0.0026383615500640014,2.535654692073106e-5,-2.7233147342018143e-8,0.0026386179885873363,2.5093413410281484e-5,-2.6882116638732477e-8,0.002638994289794082,2.4773009859853065e-5,-2.6454097522886618e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json new file mode 100644 index 0000000..270577e --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":19000,"numberOfSamples":1000,"samples":[0.00263951402096563,2.446275040491078e-5,-2.6038117688221015e-8,0.0026401631724560673,2.4241976200195275e-5,-2.5739261712150362e-8,0.002640884349598046,2.417407411008679e-5,-2.5641764129475454e-8,0.0026415912918163185,2.4277459627606698e-5,-2.577057311285661e-8,0.0026422007751247287,2.4514250198517228e-5,-2.6076268743377622e-8,0.002642664329828072,2.4806135401016956e-5,-2.6455914313675208e-8,0.002642981408758501,2.5067420523334124e-5,-2.6796599674782414e-8,0.0026431902581784475,2.523476738670862e-5,-2.701462116287926e-8,0.0026433473077564114,2.5280434293348607e-5,-2.707291191164421e-8,0.0026435080278592402,2.5209814035850336e-5,-2.6977864625794997e-8,0.0026437153058168224,2.5051197769627946e-5,-2.6766036632474325e-8,0.002643995008250455,2.4844553414124373e-5,-2.6489610125027892e-8,0.002644356096346505,2.4632482174508258e-5,-2.6204648569688263e-8,0.002644792866933108,2.4453878979516923e-5,-2.5962750928942762e-8,0.002645287958825506,2.433962413644026e-5,-2.580522022561437e-8,0.0026458157625529125,2.4309628109960647e-5,-2.5758941317575327e-8,0.00264634623063722,2.4371028134717308e-5,-2.5833817493889664e-8,0.0026468490048528843,2.4517626043978552e-5,-2.6021955503015233e-8,0.002647297629221693,2.473075415894809e-5,-2.629884122598041e-8,0.002647673419069512,2.498168300232041e-5,-2.6626587976528904e-8,0.0026479684516871804,2.5235364563765828e-5,-2.6958906132239313e-8,0.0026481873145099825,2.54550480044092e-5,-2.724714977923732e-8,0.0026483474854581976,2.5607329200806667e-5,-2.744689859121178e-8,0.002648478321749667,2.5667306663201197e-5,-2.7524725198145248e-8,0.002648618565417001,2.562364143904652e-5,-2.746495256788262e-8,0.002648811933829168,2.548331398325493e-5,-2.7276137128600436e-8,0.002649099993304903,2.5275225022656478e-5,-2.6996080239347117e-8,0.0026495118344468096,2.5050470037239995e-5,-2.6692385337925312e-8,0.0026500516782408433,2.4875937156110125e-5,-2.6454031394300517e-8,0.0026506887377273874,2.481830242231187e-5,-2.637005584696817e-8,0.0026513571570154788,2.4919878684211346e-5,-2.649732055333089e-8,0.0026519727576500727,2.5176293414199947e-5,-2.6830682803784936e-8,0.00265246347865712,2.553137242424813e-5,-2.7296067819030845e-8,0.0026527977885291948,2.5897092428559638e-5,-2.777691417282513e-8,0.0026529937872264786,2.6188736914085377e-5,-2.8160834927125474e-8,0.0026531053400488365,2.6354405340763377e-5,-2.8378742435525895e-8,0.002653197143730883,2.6384803835271885e-5,-2.8417798104530085e-8,0.0026533237489522734,2.630496073324375e-5,-2.8310488620170042e-8,0.002653519415667135,2.61584941720321e-5,-2.8113966146280626e-8,0.0026537972075638358,2.5993391727317396e-5,-2.7891437296909137e-8,0.0026541528220946162,2.5852711656499893e-5,-2.7699980495729533e-8,0.002654569583467504,2.576980469437125e-5,-2.758418502662082e-8,0.002655022888269817,2.5766321279371505e-5,-2.7573341150534074e-8,0.0026554838903719694,2.5851487346184455e-5,-2.7680269328933923e-8,0.0026559228543872925,2.6021962722230312e-5,-2.7900982114737346e-8,0.0026563125592436493,2.6262270927647677e-5,-2.8215210320601784e-8,0.0026566318822620954,2.6546159408893735e-5,-2.8588246183577963e-8,0.0026568693325829773,2.683937297731775e-5,-2.8974675169938895e-8,0.00265702588046726,2.7104047119859548e-5,-2.9324209301872344e-8,0.0026571162804157502,2.730439944298196e-5,-2.9589182861804454e-8,0.002657168287578267,2.741298625135473e-5,-2.973278593466467e-8,0.002657219506910407,2.7416528074622072e-5,-2.9736788701860016e-8,0.002657312004454739,2.7320200846281446e-5,-2.9607346163960382e-8,0.0026574851280428084,2.714945498836805e-5,-2.9377627673142143e-8,0.0026577671410715864,2.6948550466389847e-5,-2.9106116594645743e-8,0.0026581666337407396,2.677480114515534e-5,-2.8869130261933987e-8,0.002658665644369953,2.668759153112913e-5,-2.874622335182529e-8,0.0026592177642860556,2.673249924766369e-5,-2.8798893801029236e-8,0.0026597551845333914,2.6923863313585407e-5,-2.9047096880029876e-8,0.0026602066278280773,2.7233239467283458e-5,-2.945360447347533e-8,0.0026605218701161496,2.759279450344971e-5,-2.992839322576825e-8,0.002660691339317348,2.791687831695263e-5,-3.0357403494703774e-8,0.0026607489650131524,2.813307297178182e-5,-3.064397603742436e-8,0.002660756316410744,2.820629128228656e-5,-3.0740975280116455e-8,0.00266077813131762,2.814444053347429e-5,-3.0658329382785926e-8,0.0026608626181401033,2.7987094517445165e-5,-3.044802835863527e-8,0.002661033282093157,2.7787369099427664e-5,-3.018018911351549e-8,0.002661290670229049,2.759646253123286e-5,-2.992268275086257e-8,0.002661618847227499,2.745466279524221e-5,-2.9729256636510297e-8,0.002661992324996788,2.7388048564438633e-5,-2.9635075082451442e-8,0.0026623814914065623,2.740846380825369e-5,-2.9656508743774662e-8,0.0026627564064791672,2.751469021981976e-5,-2.9792508338229933e-8,0.002663089657287003,2.769378081550649e-5,-3.002626101217006e-8,0.0026633589993581537,2.7922422231694105e-5,-3.032697532756177e-8,0.0026635502049094915,2.816877186333765e-5,-3.065235507227498e-8,0.002663660058606214,2.8395509491539593e-5,-3.095269273591784e-8,0.0026636988226479592,2.8564683516255168e-5,-3.1177317725720975e-8,0.0026636910185861354,2.8644267020628355e-5,-3.128328931824663e-8,0.002663673368164203,2.8615444636392442e-5,-3.124507257083623e-8,0.0026636892999802016,2.847882357726595e-5,-3.106284172552677e-8,0.0026637804953454328,2.8257367087954442e-5,-3.076651119240239e-8,0.0026639771539304236,2.7994347029093748e-5,-3.041320967031577e-8,0.002664289390944928,2.7745919962196963e-5,-3.0077603120369135e-8,0.0026647021583839263,2.7569343911087362e-5,-2.983632036881539e-8,0.002665175574611234,2.7508966541401323e-5,-2.9749234062979572e-8,0.002665651753105894,2.758308150002246e-5,-2.9841711448467954e-8,0.0026660679387967637,2.777557445101302e-5,-3.009314804079612e-8,0.002666373652606828,2.8036422130212083e-5,-3.043735504000154e-8,0.0026665467921051737,2.8293485634668975e-5,-3.0778184924067085e-8,0.002666601852555459,2.8473726055012245e-5,-3.1017907545195027e-8,0.0026665852853927806,2.8526301970881325e-5,-3.1088172804032435e-8,0.002666559122253182,2.843738526897907e-5,-3.0969895282801916e-8,0.0026665805053176046,2.823043592843639e-5,-3.069370740064932e-8,0.0026666863526158286,2.795380188020402e-5,-3.032352927191644e-8,0.002666888030781808,2.7663438827002143e-5,-2.993366290807507e-8,0.0026671748130789254,2.7408493516036183e-5,-2.958966680282094e-8,0.0026675216046985984,2.722333376093842e-5,-2.933771824724552e-8,0.0026678967932506742,2.7125467417972392e-5,-2.920171724683057e-8,0.002668268174343812,2.7116928055334394e-5,-2.918496557666993e-8,0.0026686067536675503,2.718687142750966e-5,-2.9273488870256556e-8,0.002668889153521843,2.7314125916714938e-5,-2.9439367095546293e-8,0.0026690995240611494,2.7469415229723713e-5,-2.9643692403226327e-8,0.002669231588881734,2.761768401200625e-5,-2.983969287822529e-8,0.0026692909045567758,2.772137604439484e-5,-2.9977123836592665e-8,0.002669296689582548,2.7745483589062654e-5,-3.0009007656812204e-8,0.0026692818814056923,2.76645400450632e-5,-2.9900964988722216e-8,0.002669289786419154,2.7470487600255673e-5,-2.9641735210395685e-8,0.0026693663135547675,2.7178855682651955e-5,-2.9251483856010147e-8,0.002669548600717101,2.6829814064937723e-5,-2.8783321052296953e-8,0.002669853232704221,2.6481571864986507e-5,-2.8314646721668814e-8,0.0026702686612265127,2.6196540227162797e-5,-2.792883344868289e-8,0.0026707555410017745,2.6024208042934442e-5,-2.769243626155642e-8,0.0026712556999075863,2.5986573478360687e-5,-2.7635653186376986e-8,0.002671707089748267,2.6071129511972674e-5,-2.7742712797765785e-8,0.0026720600901569886,2.6233603318288687e-5,-2.795522462078366e-8,0.002672290443135009,2.640954156364561e-5,-2.818742186699068e-8,0.0026724052428170825,2.653145786869803e-5,-2.8349002218997386e-8,0.002672440220313686,2.6546752821712073e-5,-2.8369163632258638e-8,0.0026724489957256573,2.6431102842522592e-5,-2.8214673922745004e-8,0.002672487698917711,2.6193125149463324e-5,-2.789629736013679e-8,0.0026726001820109838,2.586916578069951e-5,-2.746199942230688e-8,0.002672808644915501,2.551090053887501e-5,-2.6980507296689357e-8,0.0026731118372536797,2.5170934360175597e-5,-2.6522128760281473e-8,0.0026734896589889912,2.4891330726868854e-5,-2.6143393330707435e-8,0.0026739109227287,2.4697549447807037e-5,-2.5878832880513e-8,0.0026743410670043246,2.4597486622909633e-5,-2.5739543146492245e-8,0.002674747998989801,2.458373190904632e-5,-2.5716071958711425e-8,0.0026751057440529678,2.463704675194214e-5,-2.57830039780471e-8,0.0026753964831346907,2.47297865751725e-5,-2.5903529531835557e-8,0.00267561183646005,2.4828867315808e-5,-2.6033429491443315e-8,0.0026757540793394046,2.489859900654912e-5,-2.6124877326598502e-8,0.00267583747024861,2.4904174485618595e-5,-2.6131104709850983e-8,0.0026758891320712635,2.4816671777239062e-5,-2.6013096260213478e-8,0.0026759481268225807,2.4619877273035702e-5,-2.5748745104085175e-8,0.002676060878740094,2.4317891637757816e-5,-2.534308690420903e-8,0.002676271641860672,2.3940547910458253e-5,-2.4835628594163594e-8,0.0026766089922976954,2.3542240639262514e-5,-2.429887410844018e-8,0.002677072911743146,2.3190810939116947e-5,-2.3823549830955104e-8,0.002677629384711697,2.2947801471423495e-5,-2.349226195279842e-8,0.0026782174373540597,2.284747447523584e-5,-2.3351420427147178e-8,0.002678767190753552,2.2884450527373708e-5,-2.3394574904936935e-8,0.002679221246387928,2.3015772470718473e-5,-2.3564955982734086e-8,0.0026795504594499405,2.31755695605357e-5,-2.3774871289120044e-8,0.002679759170591716,2.3295137206169125e-5,-2.393243272963582e-8,0.0026798803135628544,2.3320917185443094e-5,-2.3965602905995443e-8,0.0026799640145154023,2.322577558520088e-5,-2.3837397612610006e-8,0.0026800639314745046,2.3012215146842673e-5,-2.3550384713622862E-08,0.0026802248899573116,2.2708392050599457e-5,-2.3141585163499967e-8,0.0026804742934984,2.235906805897442e-5,-2.2670554977751216e-8,0.0026808185968568944,2.2014267511493717e-5,-2.220428842578894e-8,0.0026812448336239396,2.171854636264718e-5,-2.180280461715125e-8,0.0026817259374465234,2.150323880680172e-5,-2.1508611094251824e-8,0.00268222781652349,2.1382809836528223e-5,-2.1341628366433782e-8,0.0026827161726339327,2.1355034347562173e-5,-2.1299284836488415e-8,0.0026831617535715744,2.140378470911418e-5,-2.1360196730420277e-8,0.0026835436457758872,2.1502965966267144e-5,-2.1489465414133864e-8,0.0026838509543692596,2.16204854567272e-5,-2.1644050147128995e-8,0.002684083542702058,2.1721810919128004e-5,-2.1777567204648777e-8,0.0026842524063363047,2.1773296218550722e-5,-2.184473901283113e-8,0.0026843798793523676,2.174584592951199e-5,-2.1806283785570994e-8,0.002684499254751002,2.1619604754520625e-5,-2.1635208600026604e-8,0.002684652615539522,2.1389936125771377e-5,-2.132488556836351e-8,0.0026848851553524585,2.1073684595338914e-5,-2.0897551736655894e-8,0.002685234761333537,2.071276203290809e-5,-2.040922349572789e-8,0.0026857179492677428,2.0370460882582813e-5,-1.9944823185549678e-8,0.002686317392056504,2.0116807827503108e-5,-1.9598553255649772e-8,0.002686979523907763,2.0004912349695077e-5,-1.9442129284992614e-8,0.0026876280837219843,2.0048512671163523e-5,-1.949455243073783e-8,0.0026881899249303247,2.0214024293583018e-5,-1.9711294931862544e-8,0.002688620249435145,2.043285656095454e-5,-2.000069039920413e-8,0.002688914623014258,2.0626936406510176e-5,-2.0258093448061607e-8,0.002689104448499188,2.073370425998305e-5,-2.0399378529749706e-8,0.0026892419298627126,2.0720641518941455e-5,-2.038044359813892e-8,0.00268938312888527,2.0587598019377475e-5,-2.0200427284762034e-8,0.002689574768650333,2.0360579482662567e-5,-1.989355990805515e-8,0.0026898465947728313,2.0081670543145843e-5,-1.9515867700560127e-8,0.0026902088053080623,1.9798500950558975e-5,-1.913120086648592e-8,0.002690653320029833,1.9555086732382298e-5,-1.8798959747669437e-8,0.0026911577108349486,1.9384918317815483e-5,-1.856468027518342e-8,0.0026916907283687213,1.9306783846534458e-5,-1.8454204375709315e-8,0.0026922183440946422,1.932346249716126e-5,-1.8471725008849565e-8,0.0026927093194704355,1.9422959535281348e-5,-1.8601349303398246e-8,0.002693139577075912,1.9581620030571056e-5,-1.8811304655394267e-8,0.0026934949979082095,1.9768275469618075e-5,-1.905959980051295e-8,0.0026937727037630865,1.9948579211282313e-5,-1.9299928293298172e-8,0.002693981227014739,2.008903816565814e-5,-1.9487102008012012e-8,0.0026941399761876384,2.0160743594175506e-5,-1.958202828436642e-8,0.002694278150304583,2.014308771745926e-5,-1.9556669135148625e-8,0.002694432839134833,2.0027814972522264e-5,-1.939951202924289e-8,0.0026946454407021474,1.9823465164879817e-5,-1.912164795226923e-8,0.002694955118743798,1.9559228013221924e-5,-1.876210188452582e-8,0.0026953885604227568,1.9285588555638527e-5,-1.8388822887488567e-8,0.002695947389646158,1.906784792733087e-5,-1.8090003030037158e-8,0.002696598361371597,1.8969529356223275e-5,-1.7951673808881418e-8,0.0026972747172651123,1.9028183067974308e-5,-1.8024976958726027e-8,0.002697894448259002,1.923482567582152e-5,-1.82982964892157e-8,0.0026983903263144058,1.953167385178543e-5,-1.8694084270395405e-8,0.0026987355972708806,1.9833273175935162e-5,-1.9097304148343785e-8,0.002698950451980689,2.005962260427181e-5,-1.9400090848296767e-8,0.0026990880859063043,2.016241265792062e-5,-1.9537100067242948e-8,0.0026992117922432905,2.013345355569334e-5,-1.949684506615443e-8,0.002699375647089422,1.999759245364751e-5,-1.9312213181089278e-8,0.002699614261285006,1.9798830819145078e-5,-1.9041939056218857e-8,0.0026999406340535597,1.9586801508834097e-5,-1.8752604336031518e-8,0.0027003488738597202,1.9406767550178475e-5,-1.850529554434705e-8,0.002700818970481651,1.9293437948365567e-5,-1.8347238284879605e-8,0.0027013220497049467,1.9267719508964687e-5,-1.8307237617048195e-8,0.002701825549465035,1.9335593552310834e-5,-1.839393020569358e-8,0.0027022980757690288,1.9488723621636194e-5,-1.8596431789749385e-8,0.002702713662607276,1.970654001153539e-5,-1.8887103092774177e-8,0.002703055157533248,1.9959543955443707e-5,-1.9226073522447195e-8,0.002703316448267429,2.0213520540267606e-5,-1.9567030088327615e-8,0.0027035033133196956,2.0434152409261692e-5,-1.986350378693203e-8,0.0027036329373279133,2.059147843487134e-5,-2.0074871352699753e-8,0.002703732317100221,2.0663912104588616e-5,-2.017172044859481e-8,0.002703835708462897,2.064176391337209e-5,-2.0140576017720335e-8,0.002703981045779454,2.0530222225002636e-5,-1.9987983238696774e-8,0.002704204955540068,2.0351562676141675e-5,-1.9743638549377247e-8,0.0027045358067139627,2.014570325430151e-5,-1.9461313750205066e-8,0.002704984805772576,1.996714707688034e-5,-1.92148397591981e-8,0.0027055368649279493,1.987574577050617e-5,-1.9085611169575944e-8,0.002706145685078051,1.9919963553539275e-5,-1.913981275734757e-8,0.0027067395839023285,2.0115935619329194e-5,-1.9399872245807953e-8,0.002707241964949466,2.0432627984345386e-5,-1.9824189275903496e-8,0.002707600561978769,2.079591363745013e-5,-2.031258854203578e-8,0.0027078094546453073,2.1114943868623784e-5,-2.0742078873478338e-8,0.0027079095029694275,2.1317626509160715e-5,-2.101494646065448e-8,0.002707967740739984,2.1374638784031844e-5,-2.1091231796414332e-8,0.0027080501916891273,2.1301291919555723e-5,-2.0991196408044287e-8,0.002708202805321296,2.1142645928582355e-5,-2.0775234408464792e-8,0.0027084452776870867,2.0954316120813476E-05,-2.0518098346501502e-8,0.002708774162575712,2.078764131629634e-5,-2.028905117718749e-8,0.002709169810830763,2.0681479161499233e-5,-2.014086685744763e-8,0.0027096034430987557,2.065925821172407e-5,-2.0105765910602988e-8,0.0027100428652535534,2.0729021182110605e-5,-2.0195268624788187e-8,0.0027104568599029245,2.088478077558925e-5,-2.0401806622108805e-8,0.0027108187654351296,2.1108546115977512e-5,-2.0701327617105837e-8,0.002711109496587725,2.1372986326076458e-5,-2.10568899223502e-8,0.002711319970232938,2.1644827851250796e-5,-2.142334211249965e-8,0.002711452708090201,2.1889050652350722e-5,-2.1753098561200446e-8,0.002711522206080725,2.207368852602839e-5,-2.2002679141313222e-8,0.002711553726110139,2.2174663760722812e-5,-2.2139227350930035e-8,0.0027115804817427185,2.2179989492678676E-05,-2.214615199321869e-8,0.0027116394229722046,2.2092790600064617e-5,-2.2027220749220564e-8,0.002711765902353902,2.1932661136871404e-5,-2.1808497541801675e-8,0.0027119875265561675,2.17349102139576e-5,-2.153749682666738e-8,0.0027123175594141167,2.154714321577371e-5,-2.1278725972971384e-8,0.002712748677090166,2.1422310197924048e-5,-2.1104340382649643e-8,0.0027132489457220156,2.1407462817094904e-5,-2.107881988743877e-8,0.002713763222707799,2.1528939153101463e-5,-2.12386510801654e-8,0.002714223539826301,2.17779711508261e-5,-2.1572526893751845e-8,0.0027145692235508168,2.210462782438041e-5,-2.201294395593925e-8,0.0027147705289971287,2.242831272043591e-5,-2.245045363896241e-8,0.002714842961370987,2.26651374401677e-5,-2.2770961975807826e-8,0.0027148417371246187,2.2759728481484883e-5,-2.2899019449501894e-8,0.0027148384646546696,2.270361220246182e-5,-2.2822761360270927e-8,0.002714894133814566,2.253147752919397e-5,-2.2588785865962968e-8,0.002715042481976411,2.230178058034443e-5,-2.227589996373742e-8,0.0027152877602880654,2.2075146022270574e-5,-2.196600255000497e-8,0.0027156119658795414,2.189977200438472e-5,-2.1724460810982776e-8,0.0027159847379479274,2.180547085498409e-5,-2.1592064109398672e-8,0.0027163717326484887,2.18037059038195e-5,-2.158495102003217e-8,0.0027167402462662167,2.189035707386248e-5,-2.169814943921391e-8,0.0027170626329077376,2.204902136902486e-5,-2.1909862774099005e-8,0.002717318577686348,2.225407880034124e-5,-2.2185536220454567e-8,0.002717496917322223,2.247368848952755e-5,-2.2481941172479003e-8,0.0027175971570509785,2.2673148098990517e-5,-2.2751819980273843e-8,0.002717630437619656,2.2818986025088118e-5,-2.2949521472554347e-8,0.002717619374232879,2.2883830547347417e-5,-2.3037639752791775e-8,0.0027175960863589687,2.2851508344780233e-5,-2.29939131948583e-8,0.002717598071460584,2.27213176952526e-5,-2.281699857396905e-8,0.0027176621709201596,2.2510260056520727e-5,-2.2529529271382513e-8,0.0027178174751903974,2.22521853070832e-5,-2.2177067543554316e-8,0.0027180784671276526,2.1993333213934358e-5,-2.1822217623532972e-8,0.0027184398641318065,2.178448760758116e-5,-2.153411268172913e-8,0.0027188745594770346,2.1670561409178468e-5,-2.137429317301222e-8,0.0027193360025531545,2.1679009178246315e-5,-2.1380826619141587e-8,0.002719766138446254,2.1809462677510583e-5,-2.1553961002315126e-8,0.00272010902935972,2.2028302823201387e-5,-2.184847600516649e-8,0.0027203278821346134,2.2272524858974438e-5,-2.2178797892063562e-8,0.0027204196799707763,2.24654419229855e-5,-2.2440404566424472e-8,0.002720419476537429,2.2541182151501676e-5,-2.2543308403420168e-8,0.002720389514355453,2.246792006086709e-5,-2.2443785172222848e-8,0.0027203968580779593,2.2257868624423312e-5,-2.2157995797522724e-8,0.0027204907531003454,2.1959156500183422e-5,-2.17509487518943e-8,0.0027206903780250197,2.1635680043467534e-5,-2.1309184877300774e-8,0.0027209858546815508,2.1346417556349277e-5,-2.0912787442917073e-8,0.002721347808163526,2.1132433058736414e-5,-2.06177932502233e-8,0.002721738732659261,2.101302770424033e-5,-2.045091160605777e-8,0.002722121842089695,2.0988064107378192e-5,-2.0412526919188236e-8,0.0027224663072612032,2.104272221321373e-5,-2.0482980964473065e-8,0.0027227497312666536,2.1152219247249398e-5,-2.0628864697851955e-8,0.0027229592187699085,2.1285646420264224e-5,-2.0808205423364215e-8,0.002723092024279769,2.140915534170127e-5,-2.0974851448080727e-8,0.002723156140984944,2.14891410191427e-5,-2.108288393508341e-8,0.002723170606461795,2.149605797679514e-5,-2.1091870780846034e-8,0.0027231647986974373,2.140913982897247e-5,-2.0973305086363463e-8,0.002723175747615389,2.122154123906254e-5,-2.0717585989345948e-8,0.0027232427667478894,2.094452464224403e-5,-2.0339705819586754e-8,0.0027233996145755853,2.0608713479640643e-5,-1.9880992713257535e-8,0.002723665721382843,2.026060892275378e-5,-1.9404470170278227e-8,0.0027240391567136266,1.9953854594028393e-5,-1.898310231028625e-8,0.002724494146855511,1.9736789731948312e-5,-1.8682948875842208e-8,0.002724984781134481,1.9639562245665583e-5,-1.8545605329381536e-8,0.002725454640230336,1.9664591180140306e-5,-1.8575060281540082e-8,0.0027258502841296267,1.978346436416098e-5,-1.8733227690675876e-8,0.0027261353236396123,1.9941877016394326e-5,-1.894645849238284e-8,0.002726301248658682,2.007230249813052e-5,-1.912271463933041e-8,0.0027263713289722514,2.011187104949174e-5,-1.9175991154117115e-8,0.002726395138448426,2.002057957804487e-5,-1.905127428909273e-8,0.002726434196991114,1.9793401183908815e-5,-1.8741182852925098e-8,0.0027265433420372793,1.946100805656228e-5,-1.828705235095383e-8,0.0027267551469351914,1.9078518607560066e-5,-1.7763682989189432e-8,0.002727073366580046,1.870747687105405e-5,-1.7254861286109985e-8,0.0027274765293817524,1.8398952985918913e-5,-1.683037011094019e-8,0.002727927993060576,1.818353027833995e-5,-1.6532295654523488e-8,0.0027283871266923043,1.8069347217504134e-5,-1.637222675764901e-8,0.0027288178204516824,1.804577514014172e-5,-1.633611041703065e-8,0.0027291931918580247,1.8089300870504294e-5,-1.6392157254153952e-8,0.0027294972768002954,1.816913014448269e-5,-1.649844892067187e-8,0.0027297251046408027,1.8251552466542002e-5,-1.660892918346911e-8,0.0027298822811575333,1.830324285422369e-5,-1.6677976929709144e-8,0.0027299846109979653,1.8294199006395545e-5,-1.6664471571957215e-8,0.0027300576392803658,1.8201084382144078e-5,-1.6536379482566312e-8,0.002730135367558795,1.801142871411346e-5,-1.6276481194654895e-8,0.0027302569950561194,1.772835840690819e-5,-1.5888815400112085e-8,0.002730460675000141,1.7374367034465673e-5,-1.540383280991605e-8,0.002730774317388617,1.6991538671805468e-5,-1.487874681986958e-8,0.002731205492992096,1.663554986253649e-5,-1.4389430286252634e-8,0.0027317346225685167,1.6362736100393333e-5,-1.401285392592605e-8,0.0027323159732417688,1.6213321694122396e-5,-1.3804237823242727e-8,0.0027328882043883593,1.6197272773221976e-5,-1.377768292956184e-8,0.002733391477933123,1.628923403372551e-5,-1.3899104903846669e-8,0.0027337846859482747,1.6435087027299024e-5,-1.4095004537599963e-8,0.002734056500043612,1.656745755001094e-5,-1.4273511480543449e-8,0.0027342271115420556,1.6624323330041047e-5,-1.4349761230979106e-8,0.002734341218625606,1.6564849873113524e-5,-1.4267579057934553e-8,0.0027344551943848145,1.6378505391622318e-5,-1.4012046808109738e-8,0.002734622289801755,1.608581588143182e-5,-1.3610682506044439e-8,0.0027348797656559553,1.5731229116967588e-5,-1.312384293400565e-8,0.0027352411979116873,1.5370487927067927e-5,-1.262758861964929e-8,0.0027356956705479342,1.5056407177672457e-5,-1.2194285616455754e-8,0.002736213318040265,1.4827270079832405e-5,-1.1876677483532097e-8,0.0027367546090290257,1.4700733657187753e-5,-1.169940036745348e-8,0.002737279962922846,1.4673731384326293e-5,-1.16586767454608e-8,0.0027377570640155654,1.4726736350655366e-5,-1.1728029197099415e-8,0.0027381648557289963,1.482989457646782e-5,-1.1866648191392354e-8,0.0027384946423735903,1.4948942426058718e-5,-1.2027544616739114e-8,0.002738749434445084,1.504985821963847e-5,-1.216399804528127e-8,0.0027389426406392242,1.5102225647928979e-5,-1.2234218749741384e-8,0.0027390967313658887,1.508190848938774e-5,-1.2205022203274869e-8,0.0027392418828776502,1.497377683520103e-5,-1.2055543818857391e-8,0.0027394140032673863,1.4774979914795335e-5,-1.1781703210623261e-8,0.0027396510558396095,1.449859754939216e-5,-1.1401214646296961e-8,0.0027399865631337478,1.4176337452192784e-5,-1.0957324233453986e-8,0.0027404401157403325,1.3857589419184968e-5,-1.0517579850249122e-8,0.002741006988407936,1.3601649709835046e-5,-1.016324470539438e-8,0.002741651946643131,1.3461932237357087e-5,-9.967701894510386e-9,0.0027423134297618586,1.3466164991872435e-5,-9.969292325791265e-9,0.0027429204127412043,1.3602045380436758e-5,-1.0151559338201335e-8,0.0027434161980657615,1.381781057785335e-5,-1.0443902181835858e-8,0.0027437775903663983,1.403930043979941e-5,-1.0744867582233018e-8,0.00274402026056172,1.4195086586668818e-5,-1.0956551973741348e-8,0.002744189707180539,1.4237647948831023e-5,-1.101361813162918e-8,0.0027443444308235623,1.4153214739371446e-5,-1.0896808965594635e-8,0.0027445391212823013,1.3960083614703103e-5,-1.063071839494125e-8,0.0027448126229584063,1.369940353501182e-5,-1.0271311517205686e-8,0.0027451820491002014,1.342296064314159e-5,-9.889353385649206e-9,0.0027456424369939375,1.3181296837245952e-5,-9.554228595057486e-9,0.0027461706266553357,1.301415215625418e-5,-9.320814951324564e-9,0.0027467319065318033,1.2944348784452829e-5,-9.220945708603037e-9,0.0027472878430236675,1.297566686114043e-5,-9.26028974478475e-9,0.0027478036209455806,1.3094521161716708e-5,-9.420488426281658e-9,0.0027482535395967965,1.3274409109423844e-5,-9.665206228210173e-9,0.002748624017387072,1.3481665911821765e-5,-9.94808846615289e-9,0.002748914201993835,1.3681151040180056e-5,-1.0220678594459335e-8,0.002749134840466332,1.3840922486020028e-5,-1.0438925666362003e-8,0.0027493062755827883,1.3935617636275572e-5,-1.0567851392877573e-8,0.0027494561978375956,1.3948871850020234e-5,-1.0584841736813426e-8,0.002749617298368145,1.3875330877006017e-5,-1.0482372438320108e-8,0.002749824478571436,1.3722661790345272e-5,-1.0270772986168708e-8,0.002750110830763187,1.3513482353169196e-5,-9.98093410823438e-9,0.00275050148863685,1.3286167853943228e-5,-9.665504146217214e-9,0.0027510052007713166,1.3092282740735443e-5,-9.395433012835077e-9,0.0027516054627253683,1.2987797311630384e-5,-9.247916863310523e-9,0.0027522560077975567,1.3016795714357577e-5,-9.283940992366734e-9,0.002752887270832192,1.3191513005764179e-5,-9.520705716744854e-9,0.0027534268750110877,1.3479307947422266e-5,-9.913575792228905e-9,0.002753827252818105,1.380820104122874e-5,-1.0363635022831688e-8,0.002754085066367869,1.4092408000508905e-5,-1.0752843979321471e-8,0.002754240423604777,1.4264671631161601e-5,-1.0988570669126968e-8,0.0027543577158397454,1.4297504261183262e-5,-1.1032801675695634e-8,0.0027545010082918016,1.4205075789953122e-5,-1.0904699986993847e-8,0.0027547161998007054,1.4030591799180186e-5,-1.0663283329901377e-8,0.0027550240194078655,1.3829185117178249e-5,-1.0384043206256625e-8,0.002755421453020713,1.3653474454465471e-5,-1.0139258403077382e-8,0.0027558875196220835,1.3544259564344984e-5,-9.985280220478687e-9,0.0027563903321073395,1.3525955479519786e-5,-9.956181654857124e-9,0.0027568938904163395,1.3605460183974092e-5,-1.0062009063794016e-8,0.002757364073561223,1.3773418082126131e-5,-1.029030898978133e-8,0.0027577735523741467,1.4007312606634619e-5,-1.0610254942756665e-8,0.002758105281049702,1.4275878871466236e-5,-1.0978721485269755e-8,0.0027583543129910426,1.4544196144378514e-5,-1.1347397176404875e-8,0.002758527884760369,1.4778781498711986e-5,-1.1669921998794136e-8,0.0027586439565762334,1.495202207329257e-5,-1.1908062139585563e-8,0.0027587286752269713,1.5045486741457556e-5,-1.2036263263573345e-8,0.002758813283168323,1.5052079543374385e-5,-1.2044567346228864e-8,0.0027589307562035483,1.497726783006875e-5,-1.1940277717807085e-8,0.0027591121400170103,1.4839587044545021e-5,-1.1748696271030066e-8,0.002759382258301141,1.4670374331164395e-5,-1.1512860934478634e-8,0.0027597543590631487,1.4512060743916354e-5,-1.1291303651724086e-8,0.002760223851724849,1.4413504572653444e-5,-1.1151667518328181e-8,0.002760762772812467,1.4420577561528979e-5,-1.1157671499436408e-8,0.002761318710750578,1.4561512390203414e-5,-1.1348746558323507e-8,0.00276182335825203,1.483046758444795e-5,-1.171717072812087e-8,0.002762213232767044,1.5178600777388183e-5,-1.2195628938203373e-8,0.0027624561618459875,1.5523579998102924e-5,-1.2670370954457433e-8,0.002762568055471419,1.577896645887847e-5,-1.3021911778698365e-8,0.002762607053442844,1.588892345218556e-5,-1.3173036202525945e-8,0.0027626477535367317,1.5847494556313896e-5,-1.3115353264673006e-8,0.002762752148698717,1.5693341116187472e-5,-1.290193227055894e-8,0.002762952717258098,1.5488291251018845e-5,-1.2617722370350503e-8,0.0027632510418019677,1.5294686690858635e-5,-1.2348462136331391e-8,0.0027636259344087917,1.5160707656321381e-5,-1.2160612203495138e-8,0.002764043924793039,1.511465428428553e-5,-1.2093523880228672e-8,0.002764468105360931,1.5165219435121325e-5,-1.2159711904489318e-8,0.0027648642771565795,1.5304554776486206e-5,-1.2348881160795975e-8,0.00276520491193756,1.551214917612753e-5,-1.2633083740317827e-8,0.0027654717421526196,1.5758859205074683e-5,-1.2972187445271782e-8,0.0027656573615933593,1.601108180866163e-5,-1.331966747011974e-8,0.0027657658412326984,1.623508143758839e-5,-1.3628693916074076e-8,0.0027658122315612965,1.6401336192405455e-5,-1.385824500072823e-8,0.0027658208032614435,1.64885423505343e-5,-1.397868551819702e-8,0.0027658220656359834,1.6486733828388484e-5,-1.397605157394892e-8,0.002765848891824904,1.639909794692674e-5,-1.3854513826157042e-8,0.0027659321674139512,1.6242317878778517e-5,-1.3636849548780435e-8,0.002766096303503263,1.6045369593808686e-5,-1.3362857387789591e-8,0.0027663548615603564,1.5846730676314847e-5,-1.308562701077851e-8,0.0027667064826740096,1.5689835021215877e-5,-1.2865361853446855e-8,0.002767131628491153,1.5616253392744474e-5,-1.2759959238257351e-8,0.002767591541465577,1.565613932350352e-5,-1.2811680422273687e-8,0.0027680318643640033,1.581672526418174e-5,-1.3031031172521404e-8,0.0027683935757452003,1.607229328191158e-5,-1.3382687188492964e-8,0.0027686315906423767,1.6362317419807093e-5,-1.3782849249591848e-8,0.0027687352106116232,1.660487394222258e-5,-1.4117902190796029e-8,0.002768738239820442,1.6725105080637398e-5,-1.4283993588661351e-8,0.0027687087079556953,1.6685822510540136e-5,-1.422947633870195e-8,0.0027687213527381837,1.650176304721841e-5,-1.3974559220475729e-8,0.0027688289978741332,1.622925799770131e-5,-1.3596908755438644e-8,0.002769048363398059,1.594031700512789e-5,-1.3195832869032236e-8,0.00276936337344147,1.569769408859385e-5,-1.2857958409166736e-8,0.002769738192543268,1.5541237964123733e-5,-1.2638499739393606e-8,0.002770130857577132,1.5485700596560033e-5,-1.2558236264973412e-8,0.0027705028435936804,1.5525121557837643e-5,-1.2609441752677153e-8,0.002770824104016123,1.5639139817898094e-5,-1.2764417778794309e-8,0.0027710750382562957,1.579871667179225e-5,-1.298325399628226e-8,0.002771246995946245,1.5970684935818387e-5,-1.322007185623983e-8,0.0027713422068845884,1.6121524757386047e-5,-1.3428307331702114e-8,0.0027713733059165882,1.622087961293736e-5,-1.3565689517813172e-8,0.0027713622519797507,1.6245092710609566e-5,-1.3599228831309594e-8,0.002771338258376431,1.6180665568763176e-5,-1.3510033682923686e-8,0.0027713344138243505,1.6027070557930125e-5,-1.3297175460530656e-8,0.0027713830768532144,1.579813080854103e-5,-1.2979564370243544e-8,0.0027715105782646693,1.5521323628688927e-5,-1.2595002061998987e-8,0.002771732045267941,1.5234636665673235e-5,-1.2195915802458485e-8,0.002772047301432447,1.4981007805899022e-5,-1.1841777298032802e-8,0.002772438752589332,1.4800880562158318e-5,-1.1588867502371844e-8,0.0027728720133379584,1.4723695349422957e-5,-1.1478455258934069e-8,0.0027733000270757664,1.475936384689405e-5,-1.1524829287417343e-8,0.0027736714038943994,1.4891518683271445e-5,-1.1705728640433002e-8,0.002773942949580787,1.5075513691583893e-5,-1.1959405556781578e-8,0.002774094298536084,1.5244784160866828e-5,-1.2193420369479077e-8,0.00277413935771806,1.5327642621168224e-5,-1.2308056164262575e-8,0.002774127095241945,1.5271382737278492e-5,-1.222991079233378e-8,0.002774127125267959,1.5063483024427677e-5,-1.1941373736095969e-8,0.002774204509579759,1.4737530909312808e-5,-1.1488800019336111e-8,0.0027743965548067697,1.43593324733346e-5,-1.0963210259393599e-8,0.0027747034985702353,1.4001351538615448e-5,-1.0464911437262635e-8,0.0027750951364715324,1.3719672259939094e-5,-1.007167416389651e-8,0.002775526051367617,1.3542754928601997e-5,-9.823200461899074e-9,0.0027759503581378433,1.3472044653032601e-5,-9.721903248961207e-9,0.0027763311030684443,1.3489110782461308e-5,-9.742655844025204e-9,0.0027766441055164853,1.356402503429683e-5,-9.84425800476849e-9,0.002776878237542247,1.3662175145885656e-5,-9.978801364369811e-9,0.00277703421910064,1.3749001999510627e-5,-1.0098250340897997e-8,0.002777123145672282,1.3793304300500613e-5,-1.0159108468992627e-8,0.002777165069365021,1.3769948799978488e-5,-1.012627712891473e-8,0.002777187380425079,1.366257139239754e-5,-9.976865115490197e-9,0.002777222427192686,1.3466379006569386e-5,-9.704079704233e-9,0.002777303795784524,1.3190508945819256e-5,-9.32046418862628e-9,0.0027774610887294536,1.285887005615791e-5,-8.859037531642524e-9,0.00277771379236086,1.250829794191475e-5,-8.370757335750319e-9,0.0027780656045215007,1.2183280121571277e-5,-7.917278908180143e-9,0.00277850108054271,1.1927476784055753e-5,-7.559280656595044e-9,0.002778986285044394,1.1773582658743977e-5,-7.3424319327927995e-9,0.0027794741941447932,1.1734065609188585e-5,-7.284473669250357e-9,0.0027799142794985264,1.1795451333347614e-5,-7.367127372081157e-9,0.00278026452821218,1.1918270864807826e-5,-7.535846169209884e-9,0.0027805032458643373,1.204384768123753e-5,-7.709138116829781e-9,0.0027806373209791524,1.2107676158375936e-5,-7.797171506191644e-9,0.002780703452468078,1.2057033090757864e-5,-7.726358310931846e-9,0.002780759925646668,1.186787561236933e-5,-7.46295792291357e-9,0.002780869728653987,1.155427127221588e-5,-7.026249491461181e-9,0.002781080498337681,1.1164946271353642e-5,-6.483757041896363e-9,0.002781409786732128,1.0767143875816982e-5,-5.928845847483083e-9,0.0027818421004138097,1.04248448157659e-5,-5.450501229246064e-9,0.0027823377629871307,1.0181105245430409e-5,-5.10879819574084e-9,0.002782847735319512,1.0050699713777196e-5,-4.924616944992279e-9,0.002783327243787241,1.0022856728953502e-5,-4.883325460734916e-9,0.0027837440651562097,1.0069594711575953e-5,-4.94624874966697e-9,0.0027840812269027786,1.015483206039899e-5,-5.063271670053514e-9,0.0027843360787357524,1.024152532104462e-5,-5.1827770304128115e-9,0.002784517883012557,1.0296305457586499e-5,-5.258162067166841e-9,0.0027846452783812006,1.0292292461840592e-5,-5.251838399917288e-9,0.002784744078074569,1.0211053940810853e-5,-5.138017383006263e-9,0.0027848451722726508,1.004447040455388e-5,-4.905319130341186e-9,0.002784981869337182,9.796760182050914e-6,-4.559563393831464e-9,0.0027851859388087303,9.486172936094592e-6,-4.1260871182282976e-9,0.0027854820195520776,9.145128566965864e-6,-3.649923337373014e-9,0.0027858809685050146,8.817212839408479e-6,-3.1916519447886542e-9,0.002786374004344479,8.549858663854469e-6,-2.8172810988601715e-9,0.002786930516713693,8.38311526590999e-6,-2.5826759770245543e-9,0.0027875021251903167,8.337323332657525e-6,-2.5164033042951878e-9,0.002788033442730153,8.404341144331321e-6,-2.6074358965324996e-9,0.0027884768663511967,8.546587963184419e-6,-2.8036922561923524e-9,0.002788806444515096,8.705359435428541e-6,-3.023511191011914e-9,0.002789025898946628,8.816155454370437e-6,-3.1769693624562517e-9,0.00278916808580964,8.826174280013064e-6,-3.1902919454504053e-9,0.0027892861494492062,8.708654066453408e-6,-3.0259083522581603e-9,0.002789439024007953,8.46996585135858e-6,-2.6924102085292982e-9,0.0027896754169786063,8.14743898998842e-6,-2.2415918566646356e-9,0.002790020989298804,7.798481749683577e-6,-1.7533598997337004e-9,0.0027904727105389194,7.484380983397801e-6,-1.3132102122914294e-9,0.0027910019465777094,7.254182931369871e-6,-9.89761674395551e-10,0.0027915644996498075,7.133899378245067e-6,-8.196308089392246e-10,0.002792113334641582,7.123723332179867e-6,-8.034153427098901e-10,0.0027926094573086616,7.202432983697204e-6,-9.117101623954198e-10,0.002793028233302452,7.335726174669705e-6,-1.0966748720526548e-9,0.0027933609484635524,7.4849003149403414e-6,-1.3041707157630382e-9,0.002793613109513304,7.61360949860106e-6,-1.4832721372423023e-9,0.002793801331699417,7.692125726622039e-6,-1.5923023708007069e-9,0.0027939501157332436,7.699650544928369e-6,-1.602113739190793e-9,0.0027940890449749374,7.62559574208575e-6,-1.4978805430814948e-9,0.0027942502546082484,7.47061613566804e-6,-1.2805101597583769e-9,0.002794465545354246,7.247708832349798e-6,-9.681400023267961e-10,0.0027947623730721393,6.982972729165114e-6,-5.97180208495864e-10,0.002795158293619206,6.714815163187818e-6,-2.2122179168722028e-10,0.0027956544044971682,6.489842552957791e-6,9.465788350054435e-11,0.0027962298905296608,6.353985618709735e-6,2.862426270105938e-10,0.0027968413003591638,6.339329590931643e-6,3.085594249353236e-10,0.002797430023565606,6.450574770211097e-6,1.5483829055035215e-10,0.0027979381407812233,6.657939065789282e-6,-1.33481326751483e-10,0.0027983274370340884,6.9023050870562255e-6,-4.73865860969561e-10,0.0027985929487883057,7.112534229482264e-6,-7.668664513252449e-10,0.0027987644712778367,7.227889781129287e-6,-9.274873085756629e-10,0.002798895846497114,7.215922522318092e-6,-9.102130577481535e-10,0.0027990476214502418,7.07954168609196e-6,-7.189055791823305e-10,0.002799270159329704,6.8528184660678055e-6,-4.0097058487487015e-10,0.0027995921098042825,6.589150394962895e-6,-3.089155205840986e-11,0.0028000160559371254,6.346543838175632e-6,3.10246237176008e-10,0.0028005208861621384,6.174077528739478e-6,5.536306075559972e-10,0.002801069138807742,6.102332622183427e-6,6.561508599671992e-10,0.002801616887775129,6.139228531226112e-6,6.063570042587458e-10,0.0028021235424224794,6.271340195284573e-6,4.227738196672006e-10,0.0028025593261495505,6.469448209654452e-6,1.462323628969768e-10,0.002802909202716053,6.696171451931554e-6,-1.7081556781815749e-10,0.0028031732715659992,6.913472533175175e-6,-4.748902722777455e-10,0.002803364595060627,7.088522312131387e-6,-7.198047146353163e-10,0.002803505761944061,7.197381055746142e-6,-8.718919784335805e-10,0.002803625279954858,7.226791581760613e-6,-9.125259098952547e-10,0.0028037543398572442,7.1748236665111314e-6,-8.389867042693141e-10,0.0028039239008144736,7.051055423278122e-6,-6.646711695244907e-10,0.0028041616337651505,6.8765748079719594e-6,-4.190817695600791e-10,0.0028044880974484863,6.6835013555270844e-6,-1.471822583423747e-10,0.0028049117634366405,6.5130028002482435e-6,9.333211200818222e-11,0.002805423407949294,6.410183518830969e-6,2.391581525590211e-10,0.0028059919682429956,6.414458134729057e-6,2.348761811647254e-10,0.0028065656354558507,6.545964496883274e-6,5.204916047160679e-11,0.0028070820322286597,6.792467980851788e-6,-2.923256812302114e-10,0.0028074875111325586,7.1049452709561795e-6,-7.295484999982558e-10,0.002807758398439204,7.408801568743201e-6,-1.1549479735996095e-9,0.002807912309953183,7.629016879277494e-6,-1.4632184010996237e-9,0.0028080018600268285,7.717209899264664e-6,-1.5864308892715257e-9,0.00280809416469148,7.666574793887121e-6,-1.5149558263742769e-9,0.0028082476851966315,7.509156810078956e-6,-1.293585924107478e-9,0.0028084967768828226,7.300588647517751e-6,-1.0001414868267381e-9,0.002808847262739549,7.101610708252468e-6,-7.196587372359342e-10,0.0028092805508106752,6.9632211202788204e-6,-5.236849754708002e-10,0.0028097620700029556,6.9179843415002716e-6,-4.5813084509820613e-10,0.0028102506436204987,6.977109497128568e-6,-5.3909443895529e-10,0.002810706875116468,7.1318269763759485e-6,-7.546337294862254e-10,0.002811099653827845,7.357649721019065e-6,-1.0705937383009498e-9,0.0028114103186717213,7.620360090645017e-6,-1.4389400470211245e-9,0.0028116342841793644,7.882562522965005e-6,-1.8069960493090511e-9,0.002811780336556491,8.109700436176797e-6,-2.1259981185286337e-9,0.0028118681577567702,8.274759500587497e-6,-2.3578054290919355e-9,0.002811924804212133,8.361260065829955e-6,-2.479149299892737e-9,0.002811980892546883,8.36454527445245e-6,-2.4834224476780367e-9,0.0028120670235339054,8.291786877210306e-6,-2.380638941437992e-9,0.002812210545938763,8.161235186498023e-6,-2.196355734372293e-9,0.0028124324269317093,8.000947582996757e-6,-1.9699141477060387e-9,0.0028127438794841287,7.846806856187975e-6,-1.7517213264542863e-9,0.002813142552806622,7.739137129470781e-6,-1.5985536553676695e-9,0.002813608808015108,7.716755992795095e-6,-1.5652027889490953e-9,0.002814103934259319,7.807540942446503e-6,-1.6911479779159391e-9,0.0028145735374341036,8.016337002635303e-6,-1.9834359406417603e-9,0.0028149593679730016,8.31455967856922e-6,-2.4019489267911616e-9,0.0028152192752681693,8.639495206008205e-6,-2.858393347499628e-9,0.002815347491924279,8.910155826623826e-6,-3.238690313459153e-9,0.0028153820992645705,9.056877288906372e-6,-3.444739279219633e-9,0.0028153917225959865,9.049565373279847e-6,-3.434183721829044e-9,0.0028154478006963196,8.907688181128402e-6,-3.234368005566589e-9,0.0028155987912163055,8.687766600877536e-6,-2.924641731063571e-9,0.002815858796138938,8.458997654451106e-6,-2.6021037702235526e-9,0.0028162112125574854,8.281283974367032e-6,-2.3508457347741356e-9,0.002816620244870729,8.193045999255578e-6,-2.2249439851131193e-9,0.002817043196425516,8.208464494140208e-6,-2.2446042949535775e-9,0.0028174399451113383,8.320583317078408e-6,-2.4004250119473305e-9,0.0028177788955663485,8.506869283546043e-6,-2.661052702041974e-9,0.0028180401266746525,8.735196722855205e-6,-2.9814634943747566e-9,0.002818216618208338,8.969546300902432e-6,-3.3109360361838935e-9,0.0028183139820533165,9.175233421802618e-6,-3.600466281728827e-9,0.0028183488727125663,9.323413400084446e-6,-3.809217986798757e-9,0.0028183463049050498,9.39458305470024e-6,-3.90954465122841e-9,0.0028183361606477814,9.380837778898787e-6,-3.890194719106599e-9,0.002818349263122649,9.286671155840795e-6,-3.757406772881838e-9,0.002818413492033781,9.128333531433483e-6,-3.53396419516556e-9,0.0028185502773691137,8.932029054209705e-6,-3.2566550844126667e-9,0.0028187715560268277,8.731181934898563e-6,-2.972477812164968e-9,0.0028190771735186674,8.562773878565448e-6,-2.7335615331514525e-9,0.002819452811212173,8.462515809163019e-6,-2.5904087552382515e-9,0.0028198689659859892,8.458399189389392e-6,-2.5827732791303527e-9,0.0028202823760493027,8.562461789260582e-6,-2.7279409911836136e-9,0.0028206420530898016,8.76203294867925e-6,-3.0082465413739715e-9,0.0028209016970371353,9.01428419331315e-6,-3.3633026041725225e-9,0.0028210372630595158,9.250300643214355e-6,-3.695772409602383e-9,0.0028210625026776777,9.393515552182452e-6,-3.897503770163006e-9,0.0028210309762700552,9.388841811821506e-6,-3.890735771174717e-9,0.0028210180397079793,9.227581680220804e-6,-3.6632088806019304e-9,0.002821090430482207,8.951597895319539e-6,-3.273910330543877e-9,0.002821281364602508,8.633748034245999e-6,-2.8253997402826636e-9,0.0028215841712364,8.34816387734706e-6,-2.4219756103304343e-9,0.0028219629940235817,8.147536600047868e-6,-2.1378075495426764e-9,0.0028223698510740254,8.054819543764938e-6,-2.0053439921519466e-9,0.002822758897752516,8.06627654451556e-6,-2.0195926662397562e-9,0.0028230947143213737,8.159510301354147e-6,-2.149322407764077e-9,0.0028233554406812823,8.301852148391436e-6,-2.348744115947894e-9,0.00282353282593384,8.45708600749022e-6,-2.5668892800147934e-9,0.002823630975521782,8.590367413029983e-6,-2.754534233626674e-9,0.002823664602469181,8.671985233133684e-6,-2.869577271902303e-9,0.0028236568220320374,8.680413957217215e-6,-2.881448031847007e-9,0.002823636368151626,8.604700974308771e-6,-2.77454826352887e-9,0.00282363417253053,8.446003171394267e-6,-2.55042869198829e-9,0.0028236793809163405,8.217892940976991e-6,-2.2281801649158934e-9,0.0028237951897224314,7.945063459574405e-6,-1.8425677017566835e-9,0.0028239951055245996,7.660380146708828e-6,-1.4398777251617586e-9,0.0028242801645024245,7.40050743300998e-6,-1.0718072754261351e-9,0.0028246375107151937,7.200455492493439e-6,-7.878393942073073e-10,0.002825040666646605,7.087470503711195e-6,-6.266431600801484e-10,0.002825451877475943,7.074723084324243e-6,-6.071044899922806e-10,0.00282582713879414,7.155466286875476e-6,-7.199525343266866e-10,0.0028261246005233435,7.299190176080726e-6,-9.222045847808211e-10,0.00282631625064073,7.452589468357933e-6,-1.138486076576167e-9,0.002826400528199012,7.5487591099507736e-6,-1.2740885116638722e-9,0.002826410104662908,7.52604944408374e-6,-1.2417419852670848e-9,0.0028264072933222306,7.3519489307029926e-6,-9.95445629992879e-10,0.002826464019776748,7.0400481913062265e-6,-5.543990372405558e-10,0.0028266339859106117,6.6478080126638315e-6,2.5428477574195166e-13,0.002826932486316038,6.254009951919073e-6,5.573195548555597e-10,0.002827334926475173,5.928910433440534e-6,1.017639188279871e-9,0.0028277917797869642,5.7135131054699254E-06,1.3232757200131534e-9,0.002828248468891538,5.614983691413445e-6,1.4639603114758254e-9,0.0028286601533812237,5.614073569452187e-6,1.4666632447107474e-9,0.0028289983913868215,5.676607424183315e-6,1.379463686399024e-9,0.002829251626940915,5.763552361016194e-6,1.257411163440545e-9,0.0028294226533315623,5.8378051497912814e-6,1.1529709034080448e-9,0.002829525391442807,5.868127420486881e-6,1.1104318965864509e-9,0.002829581983388046,5.831461400637911e-6,1.162556397104102e-9,0.0028296201636700017,5.714584370675174e-6,1.3281613329217984e-9,0.0028296704970861516,5.515438234757098e-6,1.610201352537694e-9,0.0028297631021037386,5.243980536622576e-6,1.9945855887171813e-9,0.0028299236827314406,4.922012339098648e-6,2.4504737826893106e-9,0.0028301691569658544,4.581263003820374e-6,2.933023335426697e-9,0.0028305037217332307,4.259296600010102e-6,3.3891673170969797e-9,0.002830916459461489,3.993408191619676e-6,3.766190530193445e-9,0.0028313814792820546,3.8133369601973606e-6,4.021977064794002e-9,0.0028318611572783646,3.7341893056990802e-6,4.135010647324168e-9,0.0028323123871055148,3.7511839643312496e-6,4.1118687449955575e-9,0.002832695135207755,3.837639289960757e-6,3.990171251095755e-9,0.0028329821184355144,3.947374265896908e-6,3.835263147375323e-9,0.0028331678013638183,4.02244680576321e-6,3.7292680413861366e-9,0.002833273994081028,4.0063226672806816e-6,3.752376733977591e-9,0.0028333486086335536,3.8605677828823e-6,3.959124752584863e-9,0.0028334548656437477,3.5800588386143807e-6,4.356815088093346e-9,0.0028336519146150165,3.199196575199989e-6,4.896744085319297e-9,0.002833973775156948,2.7832242943678695e-6,5.486528461109836e-9,0.002834417043797699,2.4062456980927005e-6,6.021220646396547e-9,0.002834944056387233,2.1262318186002894e-6,6.418661302859258e-9,0.0028354988875670265,1.969203084860813e-6,6.641874660667108e-9,0.0028360266300474844,1.927913656213458e-6,6.70098348403756e-9,0.0028364871221820765,1.971420933258333e-6,6.639725869469694e-9,0.0028368601012207684,2.0580493155069e-6,6.517137481949485e-9,0.002837143798391918,2.146084523307919e-6,6.392404569592256e-9,0.0028373505649315713,2.200262702481213e-6,6.315634711039505e-9,0.0028375022225614853,2.194747581939334e-6,6.323580516384682e-9,0.002837626278744532,2.1141632193792574e-6,6.438118184879123e-9,0.002837752983195648,1.9539503821470446e-6,6.665710573780227e-9,0.002837912672316925,1.720635357079953e-6,6.997035491702147e-9,0.0028381327625960472,1.4319563558805509e-6,7.406851308263388e-9,0.0028384339774149996,1.1162175023410766e-6,7.85496469067567e-9,0.0028388259645027686,8.098741102245192e-7,8.289678744088075e-9,0.0028393032769971362,5.525056854996284e-7,8.654901931555912e-9,0.002839843390194472,3.791424868007549e-7,8.900980702450035e-9,0.0028404085467517684,3.1124743347196077e-7,8.997452128487504e-9,0.002840952357445899,3.4901622113740223e-7,8.943973785765355e-9,0.002841430295633725,4.68119085106208e-7,8.775000509935415e-9,0.0028418113735728568,6.229385663401742e-7,8.555251582211405e-9,0.0028420874546643236,7.562180083845292e-7,8.366042862071104e-9,0.002842277186103206,8.12928826496597e-7,8.28557717186452e-9,0.0028424229792514757,7.548341939316745e-7,8.368220742089385e-9,0.0028425812098529235,5.718152359385369e-7,8.628388634888865e-9,0.002842807562695609,2.864119988032696e-7,9.034090564959052e-9,0.0028431411958904427,-5.075784686922267e-8,9.513435790152513e-9,0.002843592795816794,-3.745954342178899e-7,9.973922781259542e-9,0.00284414136383234,-6.243541079214667e-7,1.0329162879331443e-8,0.0028447415293055118,-7.608178796241404e-7,1.0523290713005752e-8,0.0028453383289325533,-7.7516339165713e-7,1.0543619193061516e-8,0.0028458829874018483,-6.870431643594794e-7,1.0418002465363624e-8,0.002846343745861855,-5.347045473568402e-7,1.0200845400060194e-8,0.002846709393672464,-3.626758819940621e-7,9.955588339874181e-9,0.0028469868913886353,-2.1168976993434465e-7,9.740321417669294e-9,0.0028471961486281772,-1.1277953739782726e-7,9.5993194186896e-9,0.002847364587199702,-8.507667609072321e-8,9.559858106078426e-9,0.0028475227795878447,-1.357926730672906e-7,9.63217247842041e-9,0.0028477012760148397,-2.6098770439544055e-7,9.810568108142715e-9,0.0028479280799226956,-4.4634904759132186e-7,1.0074568307647262e-8,0.002848226026012085,-6.678989044547163e-7,1.038996413878128e-8,0.002848609485491815,-8.932110104100397e-7,1.0710570698878495e-8,0.0028490803883028048,-1.08421348997412e-6,1.0982211998329638e-8,0.0028496244808374053,-1.2027066912850638e-6,1.1150545368581883e-8,0.0028502098087099434,-1.2189535497820264e-6,1.117325646547346e-8,0.0028507899812964224,-1.1218694346857707e-6,1.1034558640475975e-8,0.0028513137786630493,-9.269848437980516e-7,1.0756559639854864e-8,0.0028517396184371633,-6.772541783626091e-7,1.040045521595228e-8,0.002852049745857075,-4.3383629160081065e-7,1.0053410747715433e-8,0.002852257667938162,-2.588555502582333e-7,9.80397507841194e-9,0.0028524050176591494,-1.966808876808624e-7,9.715373390453078e-9,0.002852549088431962,-2.610733914805113e-7,9.807193562515353e-9,0.002852746181827145,-4.3236107396414083e-7,1.0051389365553414e-8,0.002853036583500799,-6.643300296990387e-7,1.0382115635541902e-8,0.0028534351813685878,-8.975086395893872e-7,1.0714629219647167e-8,0.002853929365115319,-1.0745790729053187e-6,1.096719853065988e-8,0.0028544839144717562,-1.1539281212368752e-6,1.1080391616891132e-8,0.002855051068247713,-1.1181731669905117e-6,1.1029268499031812e-8,0.002855582768565016,-9.75875355579879e-7,1.0825912624788529e-8,0.0028560415652221956,-7.566392276976092e-7,1.051252610395587e-8,0.0028564073406055135,-5.018534207721013e-7,1.0148247915315251e-8,0.002856678785926064,-2.5444286344771827e-7,9.794490668368394e-9,0.002856870524742683,-5.058886026101649e-8,9.503046426891806e-9,0.002857007914873242,8.512852095070961e-8,9.30908662963937e-9,0.0028571215454132087,1.412895044493818e-7,9.22891211852966e-9,0.002857242681589101,1.1896856287060092e-7,9.260923881079643e-9,0.0028573999738171854,3.009713316077348e-8,9.38800232202608e-9,0.0028576170512156747,-1.0428600410014353e-7,9.580041432918065e-9,0.002857910332403342,-2.5568229132032263e-7,9.796312889070212e-9,0.002858286478980994,-3.900984786692505e-7,9.988259642955946e-9,0.002858739364701392,-4.712582429285285e-7,1.0104059717794627e-8,0.00285924729195101,-4.661759280679692e-7,1.0096572400747676e-8,0.002859772355326098,-3.5361998523694726e-7,9.935435750221926e-9,0.0028602647405304277,-1.3415193562808552e-7,9.621442048735044e-9,0.0028606740590430527,1.6248167838119398e-7,9.197139078236257e-9,0.0028609662384943444,4.78853899398024e-7,8.74468806781909e-9,0.002861139063409164,7.44255750862787e-7,8.365236229068475e-9,0.002861226934688806,8.984655386532225e-7,8.144871394043985e-9,0.002861290126468282,9.137233591571715e-7,8.123196247026203e-9,0.0028613933351704225,8.035260371148903e-7,8.280824203979028e-9,0.002861584483698411,6.150660520729815e-7,8.55027050948895e-9,0.0028618827041504077,4.113854839993796e-7,8.841474477305177e-9,0.0028622775767180642,2.524378755512151e-7,9.068802254899132e-9,0.0028627363987564036,1.8135003911035153e-7,9.17060221962431e-9,0.0028632149243848224,2.1781405590917407e-7,9.118624569170666e-9,0.002863668101326738,3.577669060595684e-7,8.918529212376947e-9,0.0028640588395250108,5.775725882547501e-7,8.603998240368662e-9,0.002864363874395403,8.409557603452859e-7,8.226895323903023e-9,0.002864576317683268,1.1070964706719793e-6,7.845700967819764e-9,0.0028647049562361203,1.3383042800297684e-6,7.514484405755572e-9,0.0028647709664122996,1.505912805444349e-6,7.274393180785887e-9,0.0028648031644739605,1.5936658590036488e-6,7.148753085068565e-9,0.0028648329825001757,1.5985844872876452e-6,7.141820831205116e-9,0.0028648901078107145,1.5298597346848266e-6,7.240401923975936e-9,0.0028649992237887115,1.40662889791498e-6,7.417073022953166e-9,0.002865177723667968,1.255395999935133e-6,7.63388684017037e-9,0.002865433962330402,1.1074017364182093e-6,7.84611558047985e-9,0.0028657656359532793,9.9575507730559e-7,8.006322067477023e-9,0.002866158158739561,9.517297115380463e-7,8.069644697438206e-9,0.0028665835690910722,9.99411061201828e-7,8.001485323787432e-9,0.0028670015032235038,1.1483302317519537e-6,7.788115041184415e-9,0.002867364559705957,1.3852827350377053e-6,7.448455109494122e-9,0.0028676299233594852,1.6691386030128764e-6,7.041536345565719e-9,0.0028677759678411305,1.9347439744128324e-6,6.660862146080923e-9,0.0028678167309223023,2.1103546939003207e-6,6.409323306547407e-9,0.0028678034788689843,2.144698261273195e-6,6.3603400593137696e-9,0.0028678078376921227,2.029720577821034e-6,6.525302617003996e-9,0.0028678938191672595,1.8044434865642015e-6,6.8481776203151215e-9,0.002868094666236441,1.5376263800915127e-6,7.230454856236507e-9,0.002868405913933894,1.3009574329347206e-6,7.569539411050057e-9,0.0028687938676968555,1.1474463535309566e-6,7.789602788927635e-9,0.002869210861589051,1.1019524188615657e-6,7.855057338570128e-9,0.002869609334325944,1.1622461307956396e-6,7.769013139741857e-9,0.002869951231852881,1.3057241037395412e-6,7.563711223382599e-9,0.002870212677215331,1.4976923875705954e-6,7.288744102079043e-9,0.002870385194690064,1.699062535904297e-6,7.000097817318875e-9,0.002870474725317542,1.8727935944983242e-6,6.75093165594071e-9,0.002870499135165648,1.988954290042755e-6,6.584275013804583e-9,0.00287048464138741,2.0282382639665136e-6,6.527917653518532e-9,0.0028704616140799583,1.9837809533528225e-6,6.5917562221991524E-09,0.0028704602549171655,1.8612665906276216e-6,6.767640226165102e-9,0.002870506668811975,1.6774673462495774e-6,7.031500508441279e-9,0.0028706197689758587,1.457604560662817e-6,7.34716419913411e-9,0.0028708091655566463,1.2320673332684813e-6,7.671058717135242e-9,0.0028710739127016565,1.0328358362055718e-6,7.957305852913069e-9,0.0028714019528153388,8.896734068155328e-7,8.163146833604354e-9,0.0028717702214416355,8.259448522978371e-7,8.254940922690583e-9,0.0028721457505871515,8.537612288983449e-7,8.215181934479207e-9,0.0028724887943640687,9.684630238408015e-7,8.050494120702066e-9,0.0028727594429303256,1.1436800035455436e-6,7.798780069504199e-9,0.0028729285817180555,1.3300651297795598e-6,7.531028042365649e-9,0.0028729915695690435,1.462263368762386e-6,7.341218977444032e-9,0.002872978448805743,1.4772429274966988e-6,7.3198920236120235e-9,0.002872951252863827,1.339998687991839e-6,7.517195289934864e-9,0.0028729836176172785,1.0630678713911078e-6,7.914951705548082e-9,0.0028731308183241877,7.051695488262558e-7,8.42876029911416e-9,0.0028734078884947605,3.473260311513201e-7,8.942348496380804e-9,0.0028737882087745852,6.114666054513867e-8,9.353047158655345e-9,0.002874219668384876,-1.1272126322969022e-7,9.602619303010073e-9,0.0028746456433421104,-1.6888577001482716e-7,9.683354937474298e-9,0.002875020314855133,-1.291094150016922e-7,9.626438926383505e-9,0.00287531548780091,-3.018828501717634e-8,9.484597230108128e-9,0.0028755210579180877,8.668647485398011e-8,9.31689120875924e-9,0.0028756422882183752,1.8328829012502568e-7,9.178200849892443e-9,0.002875696134402279,2.288312141503027e-7,9.112800066087184e-9,0.002875707547399061,2.025805089596482e-7,9.150562494597015e-9,0.002875705846174958,9.52630333672185e-8,9.304873938120105e-9,0.0028757210926035038,-9.052120703341189e-8,9.57200496741452e-9,0.0028757804866157105,-3.4091383411167794e-7,9.932003851136088e-9,0.002875904942563708,-6.325855214179894e-7,1.035130470799866e-8,0.0028761062305016523,-9.357358663929467e-7,1.0787070613173603e-8,0.002876385114451254,-1.2180331505464313e-6,1.1192851470911072e-8,0.002876730724811969,-1.4490859095561661e-6,1.1524975361779462e-8,0.002877121258656621,-1.6050876840491572e-6,1.174919121731711e-8,0.002877526072604426,-1.6732673197605107e-6,1.1847070930135468e-8,0.0028779092664162932,-1.6557908710847165e-6,1.1821668584018685e-8,0.0028782350578963945,-1.5726563757144414e-6,1.1701746720225946e-8,0.002878475324870978,-1.4624372605699738e-6,1.1542873713258664e-8,0.0028786189483200725,-1.3787231489666856e-6,1.1422265207849368e-8,0.002878680701003052,-1.3798468481290254e-6,1.1423915368175761e-8,0.002878704787159146,-1.5113471987390404e-6,1.1613291349036044e-8,0.002878756903957089,-1.785757177929549e-6,1.2008265758302951e-8,0.002878902862502164,-2.1705939820080316e-6,1.2561939708202041e-8,0.0028791817969540797,-2.5954920375929927e-6,1.3173007501556022e-8,0.002879589402551466,-2.9784185508799e-6,1.3723483959784089e-8,0.0028800817252932734,-3.2567032182663314e-6,1.4123284543802338e-8,0.0028805956227206074,-3.4055518723271702e-6,1.4336808076009957e-8,0.00288107208392016,-3.4376003397330977e-6,1.4382284035630344e-8,0.0028814710783001875,-3.3898579305011365e-6,1.43129954824349e-8,0.0028817755563885373,-3.3082580675083343e-6,1.4195060433588716e-8,0.002881988308033612,-3.2361154678533363e-6,1.4090836012607044e-8,0.0028821262129773463,-3.207791533507497e-6,1.4049812193983022e-8,0.0028822147082530657,-3.246215519180097e-6,1.4105033781258338e-8,0.0028822834027905776,-3.36241780936278e-6,1.4272395487930903e-8,0.002882362616150177,-3.5558741422002764e-6,1.4551103140709693e-8,0.0028824803465096684,-3.815258525621979e-6,1.4924750790070064e-8,0.002882659335415783,-4.119686711663455e-6,1.5363142882474208e-8,0.0028829141547347752,-4.440809412356523e-6,1.5825359058537653e-8,0.0028832486380844327,-4.746136382797398e-6,1.626457640078978e-8,0.0028836543274357697,-5.003595714935634e-6,1.6634632356475022e-8,0.0028841105948802857,-5.186858658952929e-6,1.6897660746955784e-8,0.0028845868380229104,-5.280659678729527e-6,1.703172244416492e-8,0.0028850468268388713,-5.285119178421869e-6,1.703703042675255e-8,0.0028854548808014517,-5.2180136555174015e-6,1.693924927655556e-8,0.00288578318588404,-5.1141539701945615e-6,1.678862920440044e-8,0.0028860192930803964,-5.021207939658294e-6,1.6653980349342108e-8,0.0028861723562649236,-4.991365507388845e-6,1.6610608238690897e-8,0.0028862757956466495,-5.06888921218822e-6,1.6722303008240677e-8,0.0028863833910300974,-5.2754810860775145e-6,1.7020219754766915e-8,0.002886556622110814,-5.598336802918629e-6,1.7485702072118628e-8,0.0028868448006271175,-5.988001271290007e-6,1.804727106737048e-8,0.0028872654738177545,-6.371171534302883e-6,1.8599132347397268e-8,0.002887795844354059,-6.675623117016277e-6,1.903710691825924e-8,0.0028883812762736244,-6.855447025490349e-6,1.9295003604406827e-8,0.0028889563468819752,-6.903610854021034e-6,1.9362747686658358e-8,0.0028894665800328696,-6.847559620219423e-6,1.9280059028761153e-8,0.0028898810668172878,-6.734011844686922e-6,1.911450684067196e-8,0.0028901940052642504,-6.612662324206851e-6,1.893795127279494e-8,0.0028904191547270935,-6.524988204859821e-6,1.881034874825922e-8,0.002890582222841485,-6.4992181867616665e-6,1.8772471855239283e-8,0.0028907142743236822,-6.549601240706169e-6,1.8844849350322546e-8,0.0028908470537224477,-6.677663335062472e-6,1.9029580088897277e-8,0.0028910098168515577,-6.87394958687946e-6,1.9312855656179486e-8,0.0028912269035187145,-7.1197167658875545e-6,1.966742957177217e-8,0.0028915154465618195,-7.388703555439692e-6,2.0055217248474415e-8,0.002891882983346302,-7.649501334948221e-6,2.0430764834169687e-8,0.002892325261621495,-7.869140909601243e-6,2.0746451553512368e-8,0.002892825069667161,-8.018140622490618e-6,2.095977025193972e-8,0.0028933531569161294,-8.0765493987099e-6,2.1042023401707183e-8,0.0028938720607829473,-8.039749741569616e-6,2.0986676926427616e-8,0.002894342905333149,-7.92219781746215e-6,2.081475472290096e-8,0.0028947341280570267,-7.757261613370963e-6,2.0574609101836252e-8,0.0028950300744023127,-7.592178937176516e-6,2.033462657209387e-8,0.0028952370056188714,-7.47855706718128e-6,2.0169463592427875e-8,0.0028953844081573035,-7.460137255342665e-6,2.0142316838205095e-8,0.00289552034348127,-7.560525475110968e-6,2.0287169809216575e-8,0.0028957008077851775,-7.774273461944861e-6,2.0595931401456922e-8,0.0028959747760086865,-8.06484752748952e-6,2.1015565228355683e-8,0.0028963687909720668,-8.37202856618837e-6,2.1458840848969644e-8,0.002896876822197008,-8.628384556733143e-6,2.1828161536226112e-8,0.002897460687328443,-8.779917072525279e-6,2.2045408873836965e-8,0.0028980621551318326,-8.802502597728348e-6,2.207573173944743e-8,0.002898621746734977,-8.706920074860234e-6,2.1934852495291796e-8,0.0028990957821008693,-8.531279911183452e-6,2.1678125082780306e-8,0.002899465167343782,-8.326114196731398e-6,2.137891611386844e-8,0.0028997348041497496,-8.13959047569529e-6,2.110712912790612e-8,0.002899926963249216,-8.007836040779991e-6,2.091513975889782e-8,0.002900073067994656,-7.951291908204955e-6,2.0832502054918495e-8,0.002900206831484279,-7.975306429587075e-6,2.0866828269500727e-8,0.002900359629928538,-8.072622529241776e-6,2.1007425546019428e-8,0.0029005576921144888,-8.226159990315293e-6,2.1229360644075667e-8,0.0029008202589749987,-8.411462892954981e-6,2.1497037476612273e-8,0.0029011579526491515,-8.59892006014462e-6,2.176744153154923e-8,0.0029015709907129882,-8.756361710375036e-6,2.1993920303424827e-8,0.002902047505571332,-8.85279154909494e-6,2.2131593765595492e-8,0.0029025628872768883,-8.863671727157463e-6,2.2145000075912374e-8,0.0029030815052825793,-8.777345014016352e-6,2.2017385091665053e-8,0.0029035620496829224,-8.600986341434939e-6,2.175931513310784e-8,0.002903966637114285,-8.363362576374002e-6,2.141266869690318e-8,0.0029042717781266334,-8.111634884846253e-6,2.1045980547935134e-8,0.002904477372654277,-7.901280532790563e-6,2.073978444425112e-8,0.002904609628244343,-7.781372369153714e-6,2.0565217145761693e-8,0.002904715791276944,-7.780057503835996e-6,2.056294239996993e-8,0.0029048518634546975,-7.895457374774159e-6,2.0729997122619613e-8,0.0029050672122561154,-8.095212921731798e-6,2.1019213111936452e-8,0.0029053908949938285,-8.324795261790677e-6,2.1351336711916632e-8,0.002905823673533291,-8.52201545814966e-6,2.1636089845854755e-8,0.0029063379482547036,-8.63355664871243e-6,2.1796127132877224e-8,0.00290688567731947,-8.628754999473182e-6,2.178700899956975e-8,0.002907411886688896,-8.506448804640417e-6,2.1607149038605026e-8,0.002907869313118284,-8.29292031099503e-6,2.1294847433827952e-8,0.002908229337953015,-8.032291094367549e-6,2.0914343210019756e-8,0.002908486197412823,-7.773494661513888e-6,2.0536855496935417e-8,0.0029086544808403334,-7.5585686559262325e-6,2.0223523711567358e-8,0.0029087623904295403,-7.415402414785589e-6,2.001484051067057e-8,0.002908843981353781,-7.35553482324306e-6,1.9927459583560743e-8,0.002908932726752054,-7.375649943051864e-6,1.9956406208574644e-8,0.0029090572536835126,-7.460809532075294e-6,2.0079817615799907e-8,0.002909238952715364,-7.5879228762615555e-6,2.0264014865399943e-8,0.0029094906884145105,-7.728775534689363e-6,2.0467914700593435e-8,0.0029098158523242937,-7.852662044244406e-6,2.064685157630933e-8,0.002910207338650096,-7.929175550194102e-6,2.0756624253538985e-8,0.0029106466203267355,-7.931911576665453e-6,2.0758877958416994e-8,0.002911103814377557,-7.843588459108618e-6,2.062855490190973e-8,0.0029115402023730556,-7.66224497593975e-6,2.0362916420013977e-8,0.002911914696322001,-7.406730952055019e-6,1.998953139422466e-8,0.0029121945161994208,-7.118129171687856e-6,1.9568325801371748e-8,0.0029123675377467186,-6.853478439441242e-6,1.918239985768633e-8,0.002912450734123804,-6.670885447814342e-6,1.8916298524169225e-8,0.002912488859188778,-6.610394269086291e-6,1.88281387438807e-8,0.0029125417695362995,-6.679120462312963e-6,1.8928018749465943e-8,0.0029126652147423104,-6.848070988212437e-6,1.9173497757355166e-8,0.0029128935517388484,-7.061935206702308e-6,1.9483944368025575e-8,0.002913231037578079,-7.256695642236208e-6,1.9766193972595816e-8,0.0029136533209005457,-7.377571585707302e-6,1.9940619511564884e-8,0.0029141165252539614,-7.391701575272796e-6,1.9959524190801965e-8,0.0029145697689046887,-7.293322714917477e-6,1.981463990082668e-8,0.0029149673788549375,-7.1018310443380406e-6,1.953430007430907e-8,0.002915278149714961,-6.8545563898393026e-6,1.9172935518929185e-8,0.002915490151865234,-6.596725101954491e-6,1.8796465187354656e-8,0.0029156107375936115,-6.371248850546456e-6,1.846741356078346e-8,0.002915662539790091,-6.210673245514143e-6,1.8233164243708407e-8,0.0029156771594396804,-6.1327104522359935e-6,1.8119444504375368e-8,0.002915688499493966,-6.139498762978267e-6,1.812926086634637e-8,0.0029157272510905927,-6.219687203803143e-6,1.824596696099231e-8,0.0029158172217261446,-6.3520114728173305e-6,1.843850247261238e-8,0.002915973412501954,-6.5091582694995025e-6,1.8667034188020637e-8,0.0029162012640837876,-6.6612268782975755e-6,1.888798608393158e-8,0.0029164964235661433,-6.778735787311186e-6,1.9058396783844645e-8,0.002916844658644618,-6.835584702079287e-6,1.91402221340199e-8,0.0029172220097263466,-6.812552966048134e-6,1.910544630322981e-8,0.002917595884444303,-6.7017614420562816e-6,1.8942618913472558e-8,0.002917928412307093,-6.511815863831633e-6,1.8664385893287575e-8,0.00291818347875855,-6.2719153866716e-6,1.8313480562819844e-8,0.002918337682433519,-6.031490122748525e-6,1.7962147335797165e-8,0.002918392453911434,-5.8514246809711895e-6,1.7699255420367632e-8,0.0029183808220965175,-5.785913109725185e-6,1.760375851831056e-8,0.002918361694896576,-5.860827931022856e-6,1.7713146738291097e-8,0.0029184005478205227,-6.060277614749884e-6,1.8003943123245615e-8,0.0029185450818061424,-6.330635628385983e-6,1.8397723097046376e-8,0.002918808813042895,-6.6005652769916755e-6,1.8790403319492904e-8,0.002919169951357401,-6.805733183674234e-6,1.908827114831872e-8,0.0029195829508730235,-6.906435273516535e-6,1.92336174657321e-8,0.002919994648581057,-6.893430674434389e-6,1.9213166424777753e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json new file mode 100644 index 0000000..7805bb3 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":2000,"numberOfSamples":1000,"samples":[-0.0019226433452019043,-4.2400202047522655e-5,-4.847209139509104e-8,-0.0019224915279308452,-4.232138293995991e-5,-4.839917575682174e-8,-0.0019223575599970867,-4.2339533342532786e-5,-4.841941987929699e-8,-0.0019221925201880694,-4.2455757141232014e-5,-4.853500256368106e-8,-0.0019219535221161883,-4.264378690983704e-5,-4.87214377132331e-8,-0.0019216173050324704,-4.285653639574512e-5,-4.893368444013015e-8,-0.0019211878632388768,-4.304035090341533e-5,-4.911986351109583e-8,-0.0019206944269591652,-4.3151566455827686e-5,-4.923733483565604e-8,-0.001920180782153211,-4.316840557061996e-5,-4.9264336921476375e-8,-0.0019196912154135558,-4.3093903838697776e-5,-4.920299044056076e-8,-0.001919259170950511,-4.2950548434361e-5,-4.9074301884897993e-8,-0.0019189019210674083,-4.277089886837732e-5,-4.8909249976046343e-8,-0.0019186208521778832,-4.258868047478004e-5,-4.8740241599705884e-8,-0.001918404926768647,-4.243272605567538e-5,-4.859521792579728e-8,-0.0019182349450095773,-4.2323928794774185e-5,-4.849461482060666e-8,-0.0019180872700253946,-4.2274266862589164E-05,-4.8450338629402915e-8,-0.001917936666180632,-4.228680533004299e-5,-4.846574052979398e-8,-0.00191775854316843,-4.2355896173164964e-5,-4.8535824807684226e-8,-0.0019175311877270766,-4.246735024004276e-5,-4.864742159638906e-8,-0.0019172384671460499,-4.25989290061144e-5,-4.877961167038227e-8,-0.0019168730864799963,-4.2721876682799584e-5,-4.890508625070886e-8,-0.0019164398837302117,-4.280432151427329e-5,-4.8993279677066866e-8,-0.0019159579014177714,-4.281706315274191e-5,-4.901583883335078e-8,-0.0019154594243000278,-4.27412144250086e-5,-4.8953968414289994e-8,-0.001914984557283099,-4.2575562469439085e-5,-4.880561552483321e-8,-0.0019145716125768752,-4.234039279521026e-5,-4.858934382627422e-8,-0.0019142459086730812,-4.207501807745824e-5,-4.834220694952108e-8,-0.0019140111182697102,-4.1828569489815494e-5,-4.811113500434928e-8,-0.0019138468399848853,-4.1646650455964184e-5,-4.794024685992306e-8,-0.0019137136475314569,-4.155842585264431e-5,-4.785840090516636e-8,-0.0019135639168575628,-4.156847538008292e-5,-4.787112479174571e-8,-0.001913354878178476,-4.165575436672902e-5,-4.795925785880041e-8,-0.001913060039736298,-4.1779660100407035e-5,-4.808445425303678e-8,-0.0019126758326174886,-4.189128905126362e-5,-4.8199834042895305e-8,-0.0019122216639617473,-4.194655693717889e-5,-4.8262624541360104e-8,-0.0019117335388331718,-4.191721880810053e-5,-4.8244930247959284e-8,-0.0019112535774869718,-4.17965282482666e-5,-4.8139407883790543e-8,-0.0019108191058004997,-4.159831661316574e-5,-4.795859671838348e-8,-0.001910454761111615,-4.13507805095086e-5,-4.7729094163578805e-8,-0.0019101693588310655,-4.108797784158734e-5,-4.74834365018481e-8,-0.0019099571113809235,-4.084210928294797e-5,-4.725264424568893e-8,-0.0019098014051956349,-4.06383521782112e-5,-4.706116300989979e-8,-0.001909679232807439,-4.049244367589526e-5,-4.6924445600308274e-8,-0.0019095650792493577,-4.041027304587661e-5,-4.684851156054176e-8,-0.0019094338706790138,-4.038850509596943e-5,-4.6830551880131895e-8,-0.0019092631960406178,-4.041545998091156e-5,-4.685979719885473e-8,-0.0019090353342274217,-4.0471961726856714e-5,-4.691831881589462e-8,-0.0019087395911655302,-4.053242839868951e-5,-4.698199191766588e-8,-0.0019083750969175394,-4.0566889485238066e-5,-4.7022295836454817e-8,-0.0019079535950202848,-4.05448090409642e-5,-4.7009857068801336e-8,-0.0019075008929219535,-4.0441352326518995e-5,-4.692041592595363e-8,-0.0019070548602137859,-4.024557340002766e-5,-4.674274417153859e-8,-0.0019066581194424014,-3.996789525520936e-5,-4.648596905336088e-8,-0.0019063458229643833,-3.964246667720178e-5,-4.618202616974119e-8,-0.001906132593687367,-3.932066250072738e-5,-4.5879631296205274e-8,-0.001906005112413036,-3.9056140911694693e-5,-4.563013841888741e-8,-0.0019059250849624966,-3.888725831245831e-5,-4.547077730150599e-8,-0.0019058418160187416,-3.882488208844757e-5,-4.541289156609024e-8,-0.0019057084893034362,-3.885058262649113e-5,-4.5439933455113804e-8,-0.0019054953071705263,-3.892448678948119e-5,-4.551462448108332e-8,-0.0019051956015066044,-3.899818092129441e-5,-4.559102248754266e-8,-0.001904824751066378,-3.902764552633575e-5,-4.562680789434229e-8,-0.0019044139453100216,-3.898286178877979e-5,-4.5592592314242095e-8,-0.0019040014133682513,-3.8852641286461894e-5,-4.547679044559279e-8,-0.0019036234930003598,-3.864464423892581e-5,-4.5285911009026024e-8,-0.0019033074182967,-3.838144973804248e-5,-4.504099501526467e-8,-0.0019030670807785748,-3.809414814477403e-5,-4.477156044224583e-8,-0.0019029021776647626,-3.7815292683842436e-5,-4.4508817510060506e-8,-0.001902800227035411,-3.757290803529455e-5,-4.427982585191298e-8,-0.0019027403062597105,-3.738655521525043e-5,-4.410361508352597e-8,-0.0019026972766109718,-3.726562021454014e-5,-4.3989482282936625e-8,-0.0019026455605967178,-3.720939282853564e-5,-4.393706825168861e-8,-0.001902562049494492,-3.720819681311018e-5,-4.393747898583925e-8,-0.0019024282429587474,-3.7244887169539354e-5,-4.397474157144386e-8,-0.0019022320167928473,-3.7296417780327447e-5,-4.402726172840666e-8,-0.0019019694121183246,-3.733563521997301e-5,-4.406942025345132e-8,-0.0019016466101295054,-3.7333817380047615e-5,-4.4073850286943826e-8,-0.001901281721675244,-3.72647279533573e-5,-4.401521158739995e-8,-0.0019009051492186858,-3.7110772537172744e-5,-4.387608872624823e-8,-0.0019005564761927897,-3.687070357499274e-5,-4.365449081610721e-8,-0.0019002760006965934,-3.656614621766662e-5,-4.3370288285066725e-8,-0.0019000913323042824,-3.624205466668279e-5,-4.306583828633659e-8,-0.0019000039601944792,-3.5956706816941076e-5,-4.279656932567122e-8,-0.0018999840816792122,-3.576226105855051e-5,-4.261250079410351e-8,-0.0018999792883793371,-3.568461104514584e-5,-4.253901137884262e-8,-0.001899933981398471,-3.5713853399087564e-5,-4.2567602344540055e-8,-0.0018998090711157681,-3.581022732657273e-5,-4.266128735242672e-8,-0.0018995924498515157,-3.5920529128532807E-05,-4.27699363285063e-8,-0.0018992979805863262,-3.599552540735251e-5,-4.284667515898346e-8,-0.001898956996465333,-3.60016505232314e-5,-4.2859033641491364e-8,-0.0018986077115788766,-3.5925404995038095e-5,-4.2793327231141533e-8,-0.0018982861274868695,-3.5772115322624845e-5,-4.2653762704726326e-8,-0.0018980197803509253,-3.556151123416992e-5,-4.245848237196928e-8,-0.0018978243192027849,-3.532201505409536e-5,-4.2234258129154944e-8,-0.0018977025183165013,-3.5084842908056075e-5,-4.201085903922587e-8,-0.001897645338891351,-3.487865622253372e-5,-4.181584089370757e-8,-0.001897634548299051,-3.472539749417785e-5,-4.1670438822720854e-8,-0.0018976462592206278,-3.4637684651986404E-05,-4.158699002545304e-8,-0.0018976547528813345,-3.461783260192269e-5,-4.156798431104482e-8,-0.0018976360025567379,-3.465835456450116e-5,-4.160658512785339e-8,-0.0018975704668702292,-3.474353699435762e-5,-4.168818028849286e-8,-0.0018974450856599756,-3.485154582856132e-5,-4.179238643199875e-8,-0.0018972547032642363,-3.4956750270050015e-5,-4.189517808310863e-8,-0.0018970031462578617,-3.5032293373468896e-5,-4.1971187462921197e-8,-0.001896704041121835,-3.5053177068163955e-5,-4.199649895495414e-8,-0.0018963811064912409,-3.500033872352196e-5,-4.195247884233675e-8,-0.0018960669388229457,-3.486606242620335e-5,-4.183101890714069e-8,-0.0018957986732221059,-3.466005594878666e-5,-4.1640536726904226e-8,-0.0018956091571617987,-3.441367338006517e-5,-4.141024300465335e-8,-0.0018955143084655717,-3.417789714991304e-5,-4.11883959487616e-8,-0.0018955015199407235,-3.401103934461799e-5,-4.103064766105313e-8,-0.0018955276091062383,-3.395751831846302e-5,-4.097979506922786e-8,-0.0018955320612609062,-3.4027724788744977e-5,-4.104650552871127e-8,-0.001895460925824634,-3.419213691026499e-5,-4.120354608540807e-8,-0.0018952876637236959,-3.439431347479264e-5,-4.139792350116541e-8,-0.0018950194973305701,-3.4574094187676726e-5,-4.157273141268476e-8,-0.00189468901820827,-3.468727701743215e-5,-4.168573954249668e-8,-0.0018943393648524587,-3.471417304124221e-5,-4.171758103848185e-8,-0.001894011175966523,-3.4658126432902484e-5,-4.1670568510380554e-8,-0.0018937347654549707,-3.4538913747532676e-5,-4.156270803527193e-8,-0.0018935271586108895,-3.438520384909261e-5,-4.1420753571334326e-8,-0.0018933922404869188,-3.4228171385826936e-5,-4.127420869753851e-8,-0.0018933224519850319,-3.409667569558539e-5,-4.115067186901395e-8,-0.001893301244193991,-3.40137190510597e-5,-4.10723266568858e-8,-0.0018933060255165923,-3.399399788202456e-5,-4.105348708812609e-8,-0.0018933114133081418,-3.404253904550354e-5,-4.109924608197351e-8,-0.0018932925837213562,-3.415443233452324e-5,-4.120524021833533e-8,-0.0018932284621856921,-3.431570348176952e-5,-4.135853030487643e-8,-0.001893104383091029,-3.4505267334039883e-5,-4.1539480078514925e-8,-0.00189291393259836,-3.469764551964496e-5,-4.172428673891212e-8,-0.0018926599383916741,-3.486610463956082e-5,-4.188783776156979e-8,-0.0018923546511316431,-3.498605241766292e-5,-4.2006785198344876e-8,-0.001892019101621626,-3.5038631408074926e-5,-4.206286015466167e-8,-0.0018916814855736094,-3.5014534367428806e-5,-4.204652314564249e-8,-0.001891374040852943,-3.491799599962725e-5,-4.196092987201902e-8,-0.0018911275262606326,-3.477018738663742e-5,-4.182542386637248e-8,-0.0018909628356181614,-3.460994197225293e-5,-4.167647877700423e-8,-0.0018908809794151223,-3.448870510773402e-5,-4.1563025636714426e-8,-0.001890855680381783,-3.4457266426274074e-5,-4.1533801407386716e-8,-0.0018908353879217353,-3.454621539121781e-5,-4.1618610494880996e-8,-0.0018907590601062614,-3.474930510512576e-5,-4.1812322746267864e-8,-0.0018905806559135173,-3.502183484605819e-5,-4.2073175486873276e-8,-0.0018902883688857062,-3.529801938551741e-5,-4.233914044230188e-8,-0.0018899068551920142,-3.551742428610809e-5,-4.255290749642152e-8,-0.001889483249018912,-3.564481602849056e-5,-4.268065997382881e-8,-0.0018890679245541686,-3.567523527632135e-5,-4.2716955210695495e-8,-0.00188870032072965,-3.562727788606181e-5,-4.267856906938492e-8,-0.0018884030745074487,-3.5532202829357725e-5,-4.2594437460528625e-8,-0.0018881823723488097,-3.54243921208098e-5,-4.2496795451858114e-8,-0.0018880312102406572,-3.533504994855418e-5,-4.2415230301185514e-8,-0.0018879332139387782,-3.5288747014991394e-5,-4.237330143238159e-8,-0.0018878660597741292,-3.5301680267534746e-5,-4.23867434249854e-8,-0.001887804493950075,-3.5380813257388804e-5,-4.246254511061698e-8,-0.0018877231921547025,-3.552361030820859e-5,-4.259866804167272e-8,-0.0018875996014664324,-3.5718391160070784e-5,-4.278440830777563e-8,-0.0018874167566322304,-3.594551788242534e-5,-4.300154835611885e-8,-0.0018871657927251448,-3.617965687985636e-5,-4.322647911791066e-8,-0.0018868476636197298,-3.639308212496223e-5,-4.3433238917490384e-8,-0.0018864736576865142,-3.655967876258171e-5,-4.359717299143751e-8,-0.0018860644895497603,-3.66591992046944e-5,-4.369885112248462e-8,-0.0018856478855353213,-3.668124668546799e-5,-4.37278181581545e-8,-0.0018852547440176993,-3.6628421846668554e-5,-4.3685686879638724e-8,-0.0018849140165977931,-3.651813115392309e-5,-4.358808695279573e-8,-0.0018846464338938206,-3.638236555382138e-5,-4.346473580791103e-8,-0.0018844576056432885,-3.6264235942699986e-5,-4.3356365793623564e-8,-0.0018843321784880178,-3.6209913884206997e-5,-4.3307130103906174e-8,-0.0018842322632395324,-3.625576306513159e-5,-4.335226126403655e-8,-0.0018841040436168481,-3.641349949400654e-5,-4.350374571050373e-8,-0.0018838940566287233,-3.6660400894427665e-5,-4.374080127460915e-8,-0.001883570085252579,-3.694276386559895e-5,-4.401301964778491e-8,-0.001883135475562002,-3.7194520085842316e-5,-4.425796870583932e-8,-0.001882627578444282,-3.73621475032825e-5,-4.442477583414205e-8,-0.0018821014403124572,-3.742201299485457e-5,-4.4490542846202025e-8,-0.001881609313986513,-3.7382507458315104e-5,-4.4462439215216833e-8,-0.0018811865907120172,-3.7274116019286886e-5,-4.436849914685254e-8,-0.001880847632416261,-3.713591350573811e-5,-4.424508395808057e-8,-0.00188058871037337,-3.7004918805228556e-5,-4.4126962304448526e-8,-0.0018803936614843618,-3.691021781204701e-5,-4.4041748300567786e-8,-0.0018802392951189633,-3.6870851790922326e-5,-4.400778710220607e-8,-0.0018800994849178696,-3.68957089255605e-5,-4.40339130327419e-8,-0.0018799481169941405,-3.698411204251374e-5,-4.411991825255021e-8,-0.0018797614670353787,-3.7126553405316096e-5,-4.425722892864331e-8,-0.0018795204776576248,-3.730559347706619e-5,-4.442976975442706e-8,-0.0018792131464299988,-3.749729428555327e-5,-4.46153152223929e-8,-0.0018788368365865878,-3.7673694011914794e-5,-4.4787772369335294e-8,-0.0018783998781203336,-3.780658890837698e-5,-4.492065092723705e-8,-0.0018779216417479986,-3.787236867220032e-5,-4.4991520603290696e-8,-0.0018774304478634798,-3.785712894848209e-5,-4.4986782858554793e-8,-0.001876959132956837,-3.776087580238688e-5,-4.490568783170876e-8,-0.001876538772816988,-3.759950843431477e-5,-4.476237298058196e-8,-0.0018761917084975216,-3.740363503756282e-5,-4.458499652618009e-8,-0.0018759253154816227,-3.721393836510612e-5,-4.441161416080866e-8,-0.0018757279816746558,-3.7073377257336396e-5,-4.4282962063134714e-8,-0.0018755687920489152,-3.701708377818567e-5,-4.4232881827984826e-8,-0.0018754023218197238,-3.706175871807319e-5,-4.427809041286009e-8,-0.0018751791516401983,-3.71976903316632e-5,-4.4410338519050925e-8,-0.0018748606150037481,-3.738752598197328e-5,-4.4594994984169714e-8,-0.0018744330348925565,-3.7574982787928245E-05,-4.47791613026569e-8,-0.0018739145177022712,-3.770239276914684e-5,-4.490826020461936e-8,-0.0018733495373167643,-3.773009490362128e-5,-4.4944415378813574e-8,-0.0018727931908080317,-3.764831441568e-5,-4.487773977743384e-8,-0.0018722931442570632,-3.7476441825173546e-5,-4.472576455407728e-8,-0.0018718776143170825,-3.72522449686114e-5,-4.452343076403651e-8,-0.0018715526178116695,-3.701813258333055e-5,-4.431030817274317e-8,-0.0018713062231411261,-3.681055615655657e-5,-4.4120686585272034e-8,-0.001871115468151383,-3.665468354723957e-5,-4.397851191896047e-8,-0.001870952694577932,-3.6563328602725056e-5,-4.389625440586987e-8,-0.0018707900517583916,-3.653811265418476e-5,-4.3875885637797216e-8,-0.0018706023334060244,-3.6571255822349916e-5,-4.391050608580251e-8,-0.0018703688700737859,-3.664722159578986e-5,-4.398588937722728e-8,-0.0018700751930006965,-3.6744157938658e-5,-4.408184554328447e-8,-0.0018697148769254426,-3.683557666976917e-5,-4.4173775089313205e-8,-0.0018692914772034106,-3.6892936200826666e-5,-4.423502611041501e-8,-0.0018688199023591616,-3.688965083963331e-5,-4.424057092448585e-8,-0.0018683261082645549,-3.680648604854699e-5,-4.4172010900809014e-8,-0.0018678439684996118,-3.663736658049673e-5,-4.4023038613393244e-8,-0.0018674088734324848,-3.639364723333976e-5,-4.3803546879327065e-8,-0.0018670490319146785,-3.610454803253589e-5,-4.354021989210011e-8,-0.001866776960604691,-3.581233195531623e-5,-4.327223113044107e-8,-0.0018665842545617494,-3.556274227869284e-5,-4.304246095848443e-8,-0.0018664419014308188,-3.539322985208859e-5,-4.2886518844144926e-8,-0.001866306540510951,-3.532250177755452e-5,-4.282282625286369e-8,-0.0018661311596336301,-3.5344543323723834e-5,-4.284673828172474e-8,-0.0018658774885188531,-3.542898898557433e-5,-4.293057236042494e-8,-0.0018655268253949977,-3.55281941668765e-5,-4.303001094315354e-8,-0.0018650860333417425,-3.55896847358241e-5,-4.309572055327366e-8,-0.0018645862558132557,-3.557072469934887e-5,-4.3087114771064386e-8,-0.001864074064290464,-3.54502290003869e-5,-4.298370377047688e-8,-0.0018635978679334747,-3.523359331224885e-5,-4.278980205390345e-8,-0.0018631947076426666,-3.494883476042089e-5,-4.2531058883068645e-8,-0.0018628822307316867,-3.4636347734627516E-05,-4.224496475448857e-8,-0.0018626577466252,-3.433705755884229e-5,-4.196979779298566e-8,-0.0018625028468491243,-3.408334448344101e-5,-4.173608792809358e-8,-0.0018623903292806535,-3.389462368841906e-5,-4.1562378749819724e-8,-0.001862290600784725,-3.377697613200107e-5,-4.145477037782527e-8,-0.0018621762300559555,-3.3725088096835355e-5,-4.14086669723388e-8,-0.0018620246347852986,-3.372488473601601e-5,-4.141123207304418e-8,-0.0018618195632346566,-3.375593156589706e-5,-4.1443656121148575e-8,-0.0018615521548540242,-3.3793432453618705e-5,-4.148302730689643e-8,-0.001861222100187459,-3.3810221048498295E-05,-4.15041470998425e-8,-0.0018608389284970092,-3.377941053241642e-5,-4.148192086511341e-8,-0.0018604228570434176,-3.367833230390359e-5,-4.139496124109246e-8,-0.0018600040268228783,-3.3493942425028966e-5,-4.123062094176194e-8,-0.001859618642548962,-3.322877352067173e-5,-4.0990619843655576e-8,-0.0018593011806838898,-3.290498445207031e-5,-4.0694967467908326e-8,-0.001859073836432133,-3.256319848003421e-5,-4.038105550600808e-8,-0.0018589370096645738,-3.225400787141628e-5,-4.0095898376829484e-8,-0.0018588658572420299,-3.202355089014602e-5,-3.988278237900221e-8,-0.001858815953690681,-3.1898535195761845e-5,-3.9767279252543205e-8,-0.0018587365322608792,-3.187731481624273e-5,-3.974875641256137e-8,-0.001858585847420525,-3.193072891426777e-5,-3.9800881931187754e-8,-0.0018583427276889898,-3.201157846011818e-5,-3.988018363222736e-8,-0.001858011024484624,-3.206838339685549e-5,-3.993871620605644e-8,-0.0018576168661056972,-3.2058722129593e-5,-3.993651170976707e-8,-0.001857200628294303,-3.1958785793748546e-5,-3.98506487342928e-8,-0.0018568063178679155,-3.1767390735336565e-5,-3.9679225404044e-8,-0.0018564711830394505,-3.150417991339459e-5,-3.943989843936122e-8,-0.0018562180244630548,-3.120309508365586e-5,-3.916393604405171e-8,-0.001856051832860989,-3.0903287984785486e-5,-3.888777991719524e-8,-0.0018559610387409902,-3.0640165715613776e-5,-3.864464037772421e-8,-0.0018559222165318323,-3.043888182499085e-5,-3.845831450517588e-8,-0.0018559062367179708,-3.031135180046263e-5,-3.8340287099323454e-8,-0.0018558839785556914,-3.025648674119293e-5,-3.828987583339211e-8,-0.0018558305005729916,-3.0262498510445098e-5,-3.829637141557298e-8,-0.0018557274688207667,-3.030998413607464e-5,-3.8341946180221575e-8,-0.0018555642923261315,-3.0374874455143256e-5,-3.8404431294548646e-8,-0.0018553386335638984,-3.043096245585696e-5,-3.8459652833342595e-8,-0.0018550567897867762,-3.0452262426219995e-5,-3.8483550463237314e-8,-0.0018547340635318174,-3.041572528206477e-5,-3.8454603062521525e-8,-0.0018543947164707576,-3.03048875961989e-5,-3.835716288178646e-8,-0.0018540704590361671,-3.0114692323656852e-5,-3.81859702743685e-8,-0.0018537960249984855,-2.985666954648834e-5,-3.79511015108531e-8,-0.0018536008786521339,-2.9562027461414482e-5,-3.768102528692731e-8,-0.0018534981424192035,-2.927893614320846e-5,-3.742024332911934e-8,-0.0018534751696137296,-2.9061233360087007e-5,-3.72188887172703e-8,-0.0018534923481789171,-2.8950357584252507e-5,-3.711593484750272e-8,-0.0018534940550578869,-2.8958436077817732e-5,-3.7123378482837e-8,-0.0018534282008300274,-2.9062277323979435e-5,-3.722046668883958e-8,-0.0018532645332598092,-2.921211788923309e-5,-3.736159207290112e-8,-0.0018530028720135114,-2.934986972526837e-5,-3.7493050320642694e-8,-0.0018526694542170326,-2.942727873570747e-5,-3.756982425163037e-8,-0.0018523058642196187,-2.9417150023504876e-5,-3.7566073539067835e-8,-0.0018519564866905035,-2.9316192868627697e-5,-3.7477965536880444e-8,-0.0018516584089416203,-2.9141557732680905e-5,-3.7320700414486564e-8,-0.001851435208412855,-2.8923992161479002e-5,-3.712235494419344e-8,-0.001851294541339165,-2.869997092993335e-5,-3.691666372244825e-8,-0.0018512288972952473,-2.850431556199019e-5,-3.673612972502268e-8,-0.0018512187605911334,-2.8364293030248146e-5,-3.6606422818222735e-8,-0.0018512372743969517,-2.8295880091963878e-5,-3.6542771387623024e-8,-0.001851255373367241,-2.830245486957463e-5,-3.654865101402205e-8,-0.0018512464347500161,-2.837567990696616e-5,-3.661658029509977e-8,-0.0018511897654824728,-2.849797616767571e-5,-3.6730452314410044e-8,-0.0018510726455833026,-2.864577894127868e-5,-3.6868605111867225e-8,-0.0018508911239511774,-2.879283048085962e-5,-3.700688885749968e-8,-0.0018506500169525825,-2.891316386992196e-5,-3.712138235946777e-8,-0.0018503624659893852,-2.8983841434482034e-5,-3.719083313132091e-8,-0.001850049192722774,-2.8987717253845237e-5,-3.719912582085492e-8,-0.00184973724683297,-2.8916604783197052e-5,-3.7138199915807674e-8,-0.0018494574590516221,-2.877500685094965e-5,-3.7011601488886906e-8,-0.001849239457271444,-2.8583618727700412e-5,-3.6837917133073514e-8,-0.001849103637120204,-2.8380420558935783e-5,-3.665199142573758e-8,-0.0018490512556514666,-2.8216113176951286e-5,-3.650082802289004e-8,-0.0018490568923369543,-2.814133170477168e-5,-3.643173901900574e-8,-0.001849070044366471,-2.8187498919253204e-5,-3.6474479853762786e-8,-0.0018490301023305032,-2.835027238269989e-5,-3.662573037762882e-8,-0.0018488899067574623,-2.8587217166636767e-5,-3.6846766146306595e-8,-0.0018486348257891318,-2.883361606393152e-5,-3.707797543919425e-8,-0.0018482863056600417,-2.902755950667316e-5,-3.726201459105288e-8,-0.0018478899852914469,-2.9130064005063796e-5,-3.736241363816512e-8,-0.0018474976562760789,-2.91321131307372e-5,-3.737016828147584e-8,-0.0018471524750899352,-2.905016180405401e-5,-3.729976063286029e-8,-0.0018468812786227445,-2.8916268553225196e-5,-3.718025357565311e-8,-0.0018466931172711491,-2.876806315238052e-5,-3.7046173746412294e-8,-0.0018465815057894385,-2.8640983775258864e-5,-3.6930365429741035e-8,-0.00184652829693714,-2.8563136245366806e-5,-3.685914654239289e-8,-0.0018465080445311866,-2.8552306292304803e-5,-3.6849396405970724e-8,-0.0018464923711327586,-2.8614698711177184e-5,-3.69072585309602e-8,-0.0018464540475209713,-2.874515858709884e-5,-3.702828145510411e-8,-0.001846370522506678,-2.8928669467886978e-5,-3.7198811661589566e-8,-0.001846226627091265,-2.9142919199792575e-5,-3.739840984195331e-8,-0.0018460161773210895,-2.936159596526058e-5,-3.7602928735736206e-8,-0.0018457424092981416,-2.9557907441157696e-5,-3.7787745528739335e-8,-0.0018454174436069045,-2.9707932709951874e-5,-3.793078679950588e-8,-0.001845060979936064,-2.9793682517744152e-5,-3.8015266553066575e-8,-0.0018446983139210466,-2.9805837685586976e-5,-3.803216933965162e-8,-0.001844357663506958,-2.974619611849742e-5,-3.7982560537325245e-8,-0.0018440664544479193,-2.9629797711193566e-5,-3.7879707314877856e-8,-0.001843845950446449,-2.948601531108566e-5,-3.775030341662861e-8,-0.0018437041818345754,-2.9356851092842417e-5,-3.763307774716062e-8,-0.0018436286704259478,-2.929018395984869e-5,-3.7572610524337075e-8,-0.0018435826591715672,-2.9326650546160026e-5,-3.7607099199983846e-8,-0.001843510243611047,-2.9482479522100277e-5,-3.7752270839027916e-8,-0.0018433534878047207,-2.9736569576451163e-5,-3.798922207122916e-8,-0.001843076228620517,-3.003258999787417e-5,-3.826624809927366e-8,-0.0018426810050820315,-3.0299279226205748e-5,-3.851758748645876e-8,-0.0018422077376924746,-3.0478508169391107e-5,-3.8689353289091895e-8,-0.0018417156239789582,-3.054470317700498e-5,-3.875746335719129e-8,-0.0018412606553196052,-3.050710730095082e-5,-3.872977574482587e-8,-0.001840880483325183,-3.0398882257686496e-5,-3.8636192256924036e-8,-0.001840590004125507,-3.026250677128237e-5,-3.851540126764517e-8,-0.0018403844397698059,-3.013820957242196e-5,-3.840435285169504e-8,-0.001840245361005513,-3.0057347763451893e-5,-3.8332152701456324e-8,-0.0018401466765782936,-3.0039751280580974e-5,-3.831749547487945e-8,-0.0018400595016326148,-3.0093363332831677e-5,-3.836817784862127e-8,-0.0018399559497764423,-3.0215015910877106e-5,-3.848169905675189e-8,-0.001839812170196447,-3.039186553279613e-5,-3.864654273812751e-8,-0.0018396108283989022,-3.060338054950594e-5,-3.884402378562721e-8,-0.0018393430417674114,-3.082394307346604e-5,-3.905071575977295e-8,-0.001839009544828154,-3.1026114366856945e-5,-3.924146216346563e-8,-0.0018386207708631277,-3.1184328723264915e-5,-3.939273712194119e-8,-0.0018381957305413437,-3.127857148136643e-5,-3.948596451419425e-8,-0.0018377597459139795,-3.1297656724416976e-5,-3.95104860508152e-8,-0.001837341137178437,-3.1241751125251476e-5,-3.946590292406994e-8,-0.0018369670512292443,-3.112376810976386e-5,-3.9363472022820164e-8,-0.0018366586561733092,-3.096932899220622e-5,-3.922626209101001e-8,-0.0018364258708403016,-3.0814812173559905e-5,-3.9087559514838445e-8,-0.0018362621920370473,-3.070252357614279e-5,-3.8986539372919337e-8,-0.0018361412688580824,-3.067203929167175e-5,-3.896025500527251e-8,-0.0018360180816703487,-3.0748042684471684e-5,-3.903223795898209e-8,-0.0018358378502917804,-3.092774827382751e-5,-3.920064225747588e-8,-0.0018355532968053283,-3.1174550168373766e-5,-3.9432189756387474e-8,-0.0018351446756584952,-3.142525945238052e-5,-3.966879216514516e-8,-0.001834631257077125,-3.161182618802566e-5,-3.9847630332795574e-8,-0.001834065391188641,-3.168747068911088e-5,-3.992527940095902e-8,-0.0018335116541834382,-3.164236364109196e-5,-3.989214970654177e-8,-0.0018330236496004874,-3.1501495858562004e-5,-3.977056585296882e-8,-0.0018326302885483708,-3.130976247069251e-5,-3.960119517536447e-8,-0.0018323344622033428,-3.111494455177007e-5,-3.94275962437217e-8,-0.0018321196002908996,-3.095597209536023e-5,-3.928554181120305e-8,-0.0018319582888422555,-3.085789845493625e-5,-3.919836392406287e-8,-0.0018318194757880513,-3.083157342368737e-5,-3.9176511626126014e-8,-0.0018316733480543946,-3.0875483927058214e-5,-3.9219089175635253e-8,-0.0018314943794796696,-3.097812687524317e-5,-3.931593991989682e-8,-0.0018312633560748676,-3.1120334429811935e-5,-3.9449760179892773e-8,-0.001830968913688379,-3.1277592120351454e-5,-3.9598246635518696e-8,-0.0018306087634235733,-3.14226374107931e-5,-3.9736499110668715e-8,-0.0018301904168349817,-3.152864766531905e-5,-3.9839932121797345e-8,-0.0018297309265778968,-3.1573033171681355e-5,-3.988771007373838e-8,-0.0018292551760944991,-3.154139489645285e-5,-3.986633134180522e-8,-0.0018287925523648566,-3.1430926466745534e-5,-3.977274223006469e-8,-0.0018283721888019805,-3.125244172846257e-5,-3.961626454205167e-8,-0.0018280173510476312,-3.1030241019074e-5,-3.941861928815817e-8,-0.0018277399014371466,-3.079933897322065e-5,-3.921157228495376e-8,-0.0018275359237807758,-3.060002936908609e-5,-3.9032106768399976e-8,-0.0018273836315456557,-3.0470075984707517e-5,-3.891530628053033e-8,-0.0018272448509398856,-3.0435259419920423e-5,-3.8885571590877783e-8,-0.0018270713806662069,-3.0500042234658058e-5,-3.8947817158765014e-8,-0.0018268166773114957,-3.064158208297821e-5,-3.908171343754616e-8,-0.0018264509824322654,-3.081128525962225e-5,-3.924294928095106e-8,-0.0018259745066705093,-3.0946791653507584e-5,-3.937422858396294e-8,-0.001825421200068397,-3.0992294321174295e-5,-3.942401662190722e-8,-0.001824848707194268,-3.091859675203208e-5,-3.936503312287334e-8,-0.0018243181665254498,-3.0732388589482095e-5,-3.920280801715213e-8,-0.0018238741939498265,-3.047033281073113e-5,-3.897033103345112e-8,-0.0018235344222076416,-3.0182968256406758e-5,-3.871343791162342e-8,-0.0018232907112232296,-2.9917962061241705e-5,-3.8475612220985564e-8,-0.0018231175915879915,-2.9709470223528575e-5,-3.8288287874661005e-8,-0.0018229820547856707,-2.9574767415543407e-5,-3.8167680241916334e-8,-0.0018228511227224586,-2.951575072500136e-5,-3.811601209651671e-8,-0.0018226963993247997,-2.9522399260808083e-5,-3.812455102291935e-8,-0.001822496346012939,-2.9576313361484465e-5,-3.817679071516764e-8,-0.00182223736569908,-2.9653667368211555e-5,-3.82511596794088e-8,-0.001821914484007764,-2.9727713244422272e-5,-3.8323339418991535e-8,-0.0018215319226575477,-2.9771325860086927e-5,-3.836859871537784e-8,-0.0018211033649289739,-2.9760077349048065e-5,-3.8364575828414726e-8,-0.0018206513209798074,-2.967600860452736e-5,-3.82946771372016e-8,-0.001820204868578569,-2.95117106918752e-5,-3.815177651088395e-8,-0.001819795308698592,-2.9273717903851084e-5,-3.7941337848129227e-8,-0.0018194499553985499,-2.8983792765006212e-5,-3.768268339819807e-8,-0.001819185216669178,-2.867678407238349e-5,-3.74071910297524e-8,-0.0018190008974349288,-2.83945853396037e-5,-3.715294339073842e-8,-0.001818877777254797,-2.8177048843502435e-5,-3.69565401325332e-8,-0.001818779842287521,-2.8051892787703585e-5,-3.684386725138177e-8,-0.0018186613648890997,-2.8026242318695985e-5,-3.682221547238342e-8,-0.0018184777104345217,-2.8082404782524753e-5,-3.687617397457534e-8,-0.0018181975534309522,-2.8179856821560048e-5,-3.6969212144048666e-8,-0.001817813196202531,-2.8264185854983048e-5,-3.705172966271644e-8,-0.001817345167041442,-2.8281685470529075e-5,-3.707441588866618e-8,-0.0018168381018592475,-2.8195553966210703e-5,-3.7003162870434875e-8,-0.0018163479603249767,-2.799754849487948e-5,-3.6829836985857307e-8,-0.0018159250008670967,-2.770979157575244e-5,-3.657403648862273e-8,-0.0018155995956956029,-2.7375894624095573e-5,-3.6275093682421794e-8,-0.0018153764219808644,-2.704596699485922e-5,-3.5978494998850386e-8,-0.0018152377869368145,-2.6762455524996808e-5,-3.572301447864534e-8,-0.001815152477201721,-2.6551760020655958e-5,-3.553302574177351e-8,-0.0018150853173970892,-2.6422470662984083e-5,-3.541677798998169e-8,-0.0018150042988686545,-2.6368080187245047e-5,-3.5368740905128105e-8,-0.001814884542944513,-2.637140326946383e-5,-3.5373559468304656e-8,-0.0018147098501943748,-2.640883213452553e-5,-3.540992975432918e-8,-0.001814472968339351,-2.6453705314678775e-5,-3.5453704890593495e-8,-0.0018141754822484056,-2.6478914642215583e-5,-3.548029701796509e-8,-0.0018138277280354835,-2.645933668573588e-5,-3.54668779570484e-8,-0.0018134485433922909,-2.63746995002284e-5,-3.539493771542412e-8,-0.0018130641999637516,-2.6213143484268603e-5,-3.525347116797519e-8,-0.0018127056529817164,-2.5975139443379584e-5,-3.504252776569707e-8,-0.0018124034131899443,-2.5676611824827752e-5,-3.477610412804476e-8,-0.0018121801872194175,-2.534931109205454e-5,-3.448259855575883e-8,-0.0018120429840718477,-2.503646524431114e-5,-3.420100849172037e-8,-0.0018119778375527472,-2.4783230392470123e-5,-3.3972382770939356e-8,-0.001811950347330866,-2.462408751833058e-5,-3.3828419190625865e-8,-0.0018119132838824324,-2.4571574822020067e-5,-3.3781151941416513e-8,-0.0018118193692635378,-2.461097139426063e-5,-3.381793208892705e-8,-0.0018116348830005524,-2.470333459138878e-5,-3.390395510139745e-8,-0.0018113494195414132,-2.479592830408992e-5,-3.399155855798691e-8,-0.0018109788397635016,-2.483652227449304e-5,-3.403315775348767e-8,-0.0018105608775236578,-2.4787225178468724e-5,-3.399388280325552e-8,-0.001810144903993606,-2.4634019749026035e-5,-3.386038668968676e-8,-0.0018097788424705386,-2.438943653685379e-5,-3.364343809426621e-8,-0.0018094970976968308,-2.408776623021186e-5,-3.3373712923926915e-8,-0.0018093131065530167,-2.3774611485516244e-5,-3.3092397700764274e-8,-0.0018092184234519324,-2.3494490111001275e-5,-3.283995827133673e-8,-0.0018091877331322158,-2.3280593294754563e-5,-3.2646790853564697e-8,-0.0018091871161683125,-2.314939866682767e-5,-3.252822506211939e-8,-0.0018091823293289193,-2.31004611501778e-5,-3.248421726376951e-8,-0.0018091448540584615,-2.311978262620908e-5,-3.250233499343941e-8,-0.0018090550794540737,-2.3184591180723153e-5,-3.2562086291900066e-8,-0.0018089031861997175,-2.3267897328885993e-5,-3.2639095018153503e-8,-0.0018086887334329814,-2.3342085624690892e-5,-3.2708403157821664e-8,-0.0018084198247745962,-2.338158487023955e-5,-3.2746898333729124e-8,-0.0018081122968712463,-2.3365150542970265e-5,-3.273533916353727e-8,-0.001807788822855228,-2.3278370617031e-5,-3.2660558495518114e-8,-0.0018074773359588981,-2.3116713555088714e-5,-3.251818044986732e-8,-0.0018072078836895496,-2.2888860456224638e-5,-3.231565942478291e-8,-0.0018070071067168634,-2.2619145607374683e-5,-3.2074584949186564e-8,-0.0018068904090166695,-2.2346867579039005e-5,-3.18301977417072e-8,-0.001806853807850492,-2.2119984734449717e-5,-3.162581546841964e-8,-0.0018068696241016469,-2.198255341150245e-5,-3.150153125112428e-8,-0.0018068904530553504,-2.195926967130759e-5,-3.1480191546692454e-8,-0.0018068624614854115,-2.2044177423088666e-5,-3.155704270849953e-8,-0.0018067433270976935,-2.2200245280886165e-5,-3.1699156433731375e-8,-0.0018065165630427827,-2.2371032429944445e-5,-3.1855811466588946e-8,-0.0018061958896326482,-2.2498959032548624e-5,-3.197492592167717e-8,-0.0018058190557784669,-2.2542034459431462e-5,-3.201819263383411e-8,-0.0018054353226003737,-2.2483393859611878e-5,-3.196979945333175e-8,-0.001805091981515879,-2.2332389766442987e-5,-3.183757466667896e-8,-0.0018048237525921153,-2.211905907663405e-5,-3.1648156894879373e-8,-0.0018046468284378982,-2.1884874969180767e-5,-3.1438765962970895e-8,-0.0018045577965828564,-2.167257080863706e-5,-3.124804952076372e-8,-0.0018045367469031802,-2.1517256483314775e-5,-3.1108003719807276e-8,-0.0018045532547471112,-2.1440415901790588e-5,-3.103843208390343e-8,-0.0018045734964459543,-2.1447606975861767e-5,-3.1044738831155513e-8,-0.0018045667264467702,-2.1529672691860464e-5,-3.111893588046535e-8,-0.0018045098804961046,-2.1666384245823865e-5,-3.1242914374253404e-8,-0.0018043898839023068,-2.183112130503548e-5,-3.1392708760228225e-8,-0.001804203954475141,-2.1995397908962797e-5,-3.1542638797071024e-8,-0.0018039586205425583,-2.2132522471774145e-5,-3.166864148494045e-8,-0.0018036682150897336,-2.222029327998615e-5,-3.1750683255942955e-8,-0.0018033532774611,-2.2243105107731316e-5,-3.1774601732825967e-8,-0.0018030388535303287,-2.2193945397383773e-5,-3.173385130063672e-8,-0.0018027522942073136,-2.2076575061598045e-5,-3.1631467135425805e-8,-0.0018025198123736337,-2.1907738260673892e-5,-3.148213395270582e-8,-0.0018023610503111382,-2.171835234695091e-5,-3.131339673265721e-8,-0.0018022817446064101,-2.155153029171974e-5,-3.1164020013668663e-8,-0.0018022664981731129,-2.145492195250491e-5,-3.107715875834362e-8,-0.0018022761116299893,-2.1466616576633423e-5,-3.1087611729159285e-8,-0.001802254637597213,-2.1598488185100718e-5,-3.1206666940015674e-8,-0.0018021472428660756,-2.182595909351053e-5,-3.1412695010306495e-8,-0.0018019218634438376,-2.2092822584774562e-5,-3.1655360838329714e-8,-0.0018015825756897933,-2.2331161258804622e-5,-3.187351846210822e-8,-0.0018011669858702807,-2.2485932648024347e-5,-3.2017362632812046e-8,-0.0018007305205330378,-2.2531424552391003e-5,-3.20632837968358e-8,-0.0018003274466781097,-2.247396849454174e-5,-3.201639378115172e-8,-0.001799997044701253,-2.2344006761817026e-5,-3.190352915618942e-8,-0.0017997576968600084,-2.2183994777753875e-5,-3.1762527108728355e-8,-0.0017996074214415598,-2.2037129804367622e-5,-3.163218737463046e-8,-0.0017995281388526994,-2.1939134700851098e-5,-3.1544874466880096e-8,-0.001799491474118722,-2.191336925847295e-5,-3.1522014871558e-8,-0.0017994648236848451,-2.196879034163294e-5,-3.157211653547259e-8,-0.0017994169612412726,-2.210030852102367e-5,-3.1690969385098476e-8,-0.0017993225970557186,-2.2291116208268445e-5,-3.1863685374065217e-8,-0.0017991654559053219,-2.2516364846537557e-5,-3.2068017711543623e-8,-0.0017989396964144166,-2.2747470340719118e-5,-3.2278281986817246e-8,-0.001798649733945888,-2.2956364822787877e-5,-3.246922246142647e-8,-0.0017983088087218547,-2.3119105042172602e-5,-3.2619262744900355e-8,-0.0017979368481374199,-2.3218557224021916e-5,-3.271288686018867e-8,-0.001797558043108042,-2.3246284945411038e-5,-3.274229168261259e-8,-0.0017971982454755217,-2.3203905608775542e-5,-3.2708591798824984e-8,-0.0017968820442133351,-2.3104089519329166e-5,-3.2622768771998037e-8,-0.0017966291126735867,-2.297111342990777e-5,-3.250628913382254e-8,-0.0017964493540700971,-2.2840186859440642e-5,-3.239064633254201e-8,-0.001796337092370337,-2.2753871040159905e-5,-3.231424590201427e-8,-0.001796266176874397,-2.2753701692947285e-5,-3.2314867821004395e-8,-0.0017961898758915664,-2.2866622884127602e-5,-3.241733430757836e-8,-0.0017960501969663332,-2.3089920943539757e-5,-3.261975895170297e-8,-0.0017957976108034395,-2.3383568322421448e-5,-3.288650179068292e-8,-0.0017954135250510931,-2.3679171476829465e-5,-3.315617804332179e-8,-0.0017949215447578652,-2.390518557869303e-5,-3.336437672142568e-8,-0.0017943787200954949,-2.401500851776904e-5,-3.3468942402757484e-8,-0.0017938521133034476,-2.400161061140643e-5,-3.346310636110839e-8,-0.0017933953283730748,-2.3893135268437862e-5,-3.3371567284018426e-8,-0.0017930360672664986,-2.3736813868647664e-5,-3.323619106299432e-8,-0.0017927757839283627,-2.3582117106361543e-5,-3.310107169625848e-8,-0.0017925963117210405,-2.3469363688785598e-5,-3.300241303329868e-8,-0.0017924682328384592,-2.342451096539411e-5,-3.296382113706184e-8,-0.0017923581550719071,-2.345828625550179e-5,-3.299539036168371e-8,-0.001792234150133278,-2.356759742598324e-5,-3.309481410911366e-8,-0.0017920696405059335,-2.3737980155055785e-5,-3.324947345493431e-8,-0.0017918461088012336,-2.3946656287756952e-5,-3.343914759620848e-8,-0.0017915547494891267,-2.416604836192296e-5,-3.363918826601897e-8,-0.0017911970460121622,-2.4367571375549456e-5,-3.382396166819764e-8,-0.0017907841940512808,-2.4525457139788785e-5,-3.3970302096064133e-8,-0.0017903353488858134,-2.4620205356925683e-5,-3.4060599419872674e-8,-0.001789874928831574,-2.464121873006898e-5,-3.408513361013069e-8,-0.0017894293545302076,-2.458842006514815e-5,-3.404350871950484e-8,-0.001789023505241213,-2.4472837169482275e-5,-3.394520600674971e-8,-0.0017886770648342907,-2.431614883409421e-5,-3.3809267595780996e-8,-0.0017884008200234735,-2.4149141187628658e-5,-3.366304609271047e-8,-0.001788192903348495,-2.4008712245158947e-5,-3.353964297579916e-8,-0.0017880354372265181,-2.393253545893989e-5,-3.347316905691076e-8,-0.0017878931539800256,-2.3950554353910987e-5,-3.34910405981934e-8,-0.0017877167144701928,-2.4073806065351983e-5,-3.360377068735919e-8,-0.001787453569690734,-2.428392045087678e-5,-3.379534491041236e-8,-0.0017870663495322726,-2.4530220442592966e-5,-3.402051298850108e-8,-0.0017865519910194932,-2.4741563720019448e-5,-3.4215448424805376e-8,-0.0017859491906381667,-2.4852189071213217e-5,-3.4321023197333045e-8,-0.001785325958533287,-2.482869995671932e-5,-3.4307016493753474e-8,-0.0017847528767015353,-2.4681669420333632e-5,-3.418245486606978e-8,-0.0017842781208460322,-2.4456188730650273e-5,-3.3987154219619505e-8,-0.0017839168488831807,-2.4210443635923462e-5,-3.3772695142451446e-8,-0.0017836554356915608,-2.3996010205156732e-5,-3.358499104157047e-8,-0.0017834629055072672,-2.384722325415727e-5,-3.345487005540549e-8,-0.0017833022278605421,-2.377911957973221e-5,-3.33961693481918e-8,-0.0017831382257718895,-2.3790191594592873e-5,-3.340803787799357e-8,-0.0017829420119458068,-2.386664304225821e-5,-3.347858835271957e-8,-0.0017826931337199766,-2.3986439556649512e-5,-3.35884337520014e-8,-0.001782380554182279,-2.4122805007119548e-5,-3.37138034186474e-8,-0.0017820030107513522,-2.424741808773985e-5,-3.382943346932811e-8,-0.0017815688268330704,-2.4333593880854584e-5,-3.391144581214018e-8,-0.0017810949919451016,-2.435957061890063e-5,-3.3940296734933424e-8,-0.0017806052023764001,-2.4311695591746605e-5,-3.3903609380761455e-8,-0.001780126733231539,-2.4186960953258744e-5,-3.3798419210927013e-8,-0.001779686389109376,-2.3994309151659606e-5,-3.363234575116789e-8,-0.0017793060255654567,-2.3754312161234117e-5,-3.3423362014270186e-8,-0.0017789982504817423,-2.3497003448101446e-5,-3.319796437690346e-8,-0.0017787629677499328,-2.325789658218794e-5,-3.2987743056121986e-8,-0.0017785853328477087,-2.307245026259536e-5,-3.2824528494159e-8,-0.001778435693719291,-2.29692203202828e-5,-3.2734270343295896e-8,-0.0017782724447692514,-2.2962114363640616e-5,-3.2729999425653523e-8,-0.0017780489744251891,-2.304310446279494e-5,-3.2805121499466924e-8,-0.0017777252482119056,-2.3178271529330762e-5,-3.292970232577239e-8,-0.0017772823647096638,-2.331129259651724e-5,-3.305351428606098e-8,-0.0017767346083272459,-2.3377529158287416e-5,-3.311868318348257e-8,-0.001776130764697321,-2.3326480780226323e-5,-3.3079844371637935e-8,-0.0017755397912121303,-2.3142506066602418e-5,-3.292267378791187e-8,-0.001775025923089456,-2.285130228165791e-5,-3.2669641431352325e-8,-0.001774626618706956,-2.2507845107702927e-5,-3.2369284423643596e-8,-0.0017743445685003865,-2.217390512592298e-5,-3.207630409849978e-8,-0.0017741544806826274,-2.1898231682136928e-5,-3.1834061464338805e-8,-0.0017740169436090173,-2.1707118952548065e-5,-3.166620956255327e-8,-0.001773891219541728,-2.1604779152879516e-5,-3.157692307526984e-8,-0.0017737432310165142,-2.157882930216389e-5,-3.155562491937049e-8,-0.0017735489504333692,-2.1606679331330368e-5,-3.1582552828697624e-8,-0.0017732949817235678,-2.1660754250425577e-5,-3.163336707176071e-8,-0.0017729779982578978,-2.1712249139899234e-5,-3.1682516270717386e-8,-0.0017726039251191308,-2.1733947237802756e-5,-3.170578892729579e-8,-0.0017721870422029683,-2.170274238348413e-5,-3.168258293259854e-8,-0.001771748742021881,-2.160228540957275e-5,-3.1598253034946674e-8,-0.001771315436498432,-2.142574791419228e-5,-3.144654198656495e-8,-0.0017709151725227585,-2.1178148251122183e-5,-3.123163082063926e-8,-0.0017705729667818262,-2.0877318554922502e-5,-3.096901728522543e-8,-0.00177030549185305,-2.055260685325797e-5,-3.0684433448224743e-8,-0.0017701162882080364,-2.0240789383713746e-5,-3.041032430169265e-8,-0.0017699929466398218,-1.99794218315807e-5,-3.018005089313501e-8,-0.0017699074633654773,-1.9798779288104986e-5,-3.002078373264498e-8,-0.0017698202590316055,-1.971411094245867e-5,-2.994657558110185e-8,-0.0017696875886955075,-1.9720002942223983e-5,-2.9953206911113435e-8,-0.0017694714315701055,-1.9788544043428927e-5,-3.0016365819494506e-8,-0.001769150179508032,-1.9872824099373976e-5,-3.009460999645151e-8,-0.0017687273917546744,-1.9916635597634004e-5,-3.013794933369788e-8,-0.0017682349328222557,-1.986951675134688e-5,-3.0101278511672435e-8,-0.00176772710105645,-1.970328034493384e-5,-2.995916376833186e-8,-0.0017672653670454336,-1.942323674398719e-5,-2.9715881402750377e-8,-0.0017668987135009146,-1.906762066737871e-5,-2.9404951820690843e-8,-0.0017666484557888058,-1.8694185914153163e-5,-2.9077305426574343e-8,-0.0017665045683398996,-1.836037649987278e-5,-2.8783779540595175e-8,-0.0017664336822339468,-1.810670803004512e-5,-2.85604298531802e-8,-0.0017663927590512497,-1.7949525459591675e-5,-2.8422063980110166e-8,-0.0017663414629926905,-1.7882936783559632e-5,-2.8363836548011972e-8,-0.001766249541876796,-1.7885707909765793e-5,-2.8367242121714928e-8,-0.001766099266242993,-1.7928819727490756e-5,-2.8406756909275128e-8,-0.0017658847993394775,-1.798137782732972e-5,-2.8455090069843767e-8,-0.001765610393070421,-1.8014480188581894e-5,-2.8486659197502897e-8,-0.0017652885448722823,-1.800366604960887e-5,-2.8479796999216368e-8,-0.0017649384258213695,-1.7930802219111313e-5,-2.8418420896184835e-8,-0.0017645842871166185,-1.778602853787445e-5,-2.829372109660203e-8,-0.0017642532352409623,-1.7569903288050705e-5,-2.81060198076404e-8,-0.001763971759473834,-1.7295278259522374e-5,-2.786641950500421e-8,-0.0017637607807011494,-1.698782162266873e-5,-2.7597305393828584e-8,-0.0017636298282722234,-1.668378910785923e-5,-2.7330463361969477e-8,-0.0017635720325075124,-1.6424062245120354e-5,-2.7101919283812356e-8,-0.0017635623160880396,-1.624485381333525e-5,-2.6943804573923697e-8,-0.0017635607308321933,-1.6167370096356146e-5,-2.6875224575923194e-8,-0.0017635211289864948,-1.6190012162179073e-5,-2.68952735608918e-8,-0.0017634030561349838,-1.6286391210993562e-5,-2.6981120973846906e-8,-0.0017631832067511017,-1.6410496829813158e-5,-2.7092420717209323e-8,-0.001762862804611093,-1.650784066444652e-5,-2.7181070789573557e-8,-0.001762468592752757,-1.6529538541808296e-5,-2.720366625840219e-8,-0.001762046894151369,-1.6445530812446836e-5,-2.713326263374019e-8,-0.0017616519554521687,-1.6253198861825676e-5,-2.696709599279156e-8,-0.0017613315225252794,-1.5978453405918325e-5,-2.672764292807032e-8,-0.0017611140058775958,-1.5668350101802668e-5,-2.645617877953825e-8,-0.0017610016624053787,-1.5377341425857762e-5,-2.6200694380823762e-8,-0.001760972152477191,-1.5152050261090025e-5,-2.6002466768736517e-8,-0.0017609872896826445,-1.5020078162915458e-5,-2.5886132235295784e-8,-0.0017610048499390252,-1.4986153105280482e-5,-2.585618781524479e-8,-0.0017609887967856529,-1.5035267740803247e-5,-2.5899659894477047e-8,-0.0017609151979063953,-1.5139768158020223e-5,-2.5992305073980463e-8,-0.001760773716567572,-1.5266958060346903e-5,-2.610532992986437e-8,-0.0017605661687073292,-1.5385079455718696e-5,-2.6210718388494383e-8,-0.0017603038826338377,-1.5467116653328303e-5,-2.6284636330568005e-8,-0.0017600050563999715,-1.5492918931559058e-5,-2.630931543163531e-8,-0.00175969254649456,-1.5450515709074643e-5,-2.6274181953792665e-8,-0.0017593918639489119,-1.5337330423786408e-5,-2.617687582404043e-8,-0.0017591287810466108,-1.516152233340109e-5,-2.6024399594225813e-8,-0.0017589258943309788,-1.4943092225619993e-5,-2.5834108333616962e-8,-0.0017587977883399433,-1.4713698844311321e-5,-2.563361964748376e-8,-0.001758745306123578,-1.4513557060983797e-5,-2.5458186180871662e-8,-0.0017587508567577885,-1.4384033445413648e-5,-2.534426611652559e-8,-0.0017587779139626098,-1.4356303112866524e-5,-2.5319563744401592e-8,-0.0017587774818432792,-1.4439371548397277e-5,-2.5392423095802513e-8,-0.0017587014180465244,-1.461308765223457e-5,-2.5545545630735418e-8,-0.0017585182143315644,-1.4831017637906244e-5,-2.573837988454579e-8,-0.001758224300036135,-1.5033522952700285e-5,-2.5918544356983626e-8,-0.0017578456814572269,-1.5165890121277228e-5,-2.6037769834404815e-8,-0.0017574296827317477,-1.5194062164951215e-5,-2.6065783871821737e-8,-0.0017570309130902051,-1.5112670663097581e-5,-2.5997452534758276e-8,-0.001756696813994369,-1.4944139321311835e-5,-2.5852086776316284e-8,-0.0017564568402563836,-1.473071652369088e-5,-2.566653582995585e-8,-0.0017563173354597894,-1.4522642160396031e-5,-2.548486082353178e-8,-0.0017562624354948073,-1.4365851015030895e-5,-2.5347546705261553e-8,-0.0017562599735600776,-1.4292151664489295e-5,-2.5282821848690496e-8,-0.001756270345717931,-1.4313890299943314e-5,-2.5301868529854778e-8,-0.0017562557588578422,-1.4423796145213121e-5,-2.5398581829437754e-8,-0.0017561874812613571,-1.4599191257972496e-5,-2.5553204717269587e-8,-0.0017560497205785389,-1.4808590783445874e-5,-2.573812424229174e-8,-0.0017558401001670073,-1.501849889141526e-5,-2.5923886858305346e-8,-0.0017555677036126833,-1.5198851791683837e-5,-2.6084035700955837e-8,-0.0017552499882569114,-1.5326523211685818e-5,-2.6198219746351277e-8,-0.0017549096171388453,-1.5387143092883683e-5,-2.625378099409158e-8,-0.0017545716844747704,-1.5375917958639373e-5,-2.624643446693762e-8,-0.0017542612485054693,-1.5298085448759974e-5,-2.618062930004095e-8,-0.0017540007404882867,-1.5169273450952789e-5,-2.6069861979063126e-8,-0.0017538066861335557,-1.5015531634949477e-5,-2.593675647987724e-8,-0.0017536853789179659,-1.4872118319182157e-5,-2.5812093138283254e-8,-0.0017536279768385933,-1.4779491480665109e-5,-2.5731383005018647e-8,-0.001753606952723239,-1.477510058162383e-5,-2.5727704626657337e-8,-0.0017535772625469973,-1.4881293853944655e-5,-2.5821044107833472e-8,-0.0017534854838303832,-1.5093084239007569e-5,-2.600743669074431e-8,-0.001753286710863749,-1.5372854528035302e-5,-2.6254185280220255e-8,-0.0017529628465813953,-1.5658309245887e-5,-2.650676375421154e-8,-0.0017525321779777868,-1.5882916451512282e-5,-2.6706754294287406e-8,-0.0017520438774256833,-1.599931632431093e-5,-2.6812413521358316e-8,-0.0017515603547515798,-1.599389242849295e-5,-2.6811474485739375e-8,-0.0017511370747768787,-1.58870721613282e-5,-2.6721446136561115e-8,-0.0017508085426400448,-1.5722498178991464e-5,-2.6580205900138525e-8,-0.001750583522276346,-1.5552126055896935e-5,-2.6433054088095324e-8,-0.0017504477988545496,-1.5423007708300132e-5,-2.6321212129111954e-8,-0.001750371174214469,-1.5368439711583733e-5,-2.62740633198849e-8,-0.001750315851837096,-1.5403810993203438e-5,-2.630543047416448e-8,-0.0017502443819633047,-1.552642617773328e-5,-2.641330452405617e-8,-0.0017501260881107377,-1.5718366270618406e-5,-2.6582255837826362e-8,-0.001749941315168841,-1.595138996435713e-5,-2.6787687878177625e-8,-0.0017496832210316077,-1.6192740022060927e-5,-2.7000937830024997e-8,-0.0017493572693855985,-1.6410744434680557e-5,-2.719422519070173e-8,-0.001748978948913387,-1.6579358203906588e-5,-2.7344668887639668e-8,-0.0017485704968312657,-1.6681163415333903e-5,-2.74369274282324e-8,-0.0017481574240992264,-1.670883282721197e-5,-2.7464466784574147e-8,-0.0017477653066889829,-1.666547427544194e-5,-2.742983935525184e-8,-0.0017474168841164288,-1.6564305460559376e-5,-2.7344394725503e-8,-0.001747129279233854,-1.6427879931202274e-5,-2.722763656186771e-8,-0.0017469110243550452,-1.6286771476204226e-5,-2.7106146180372478e-8,-0.0017467586534195868,-1.6177063093025705e-5,-2.7011472007132247e-8,-0.0017466533463252492,-1.6135412490742596e-5,-2.6975864478472212e-8,-0.0017465594178202246,-1.6190686058868135e-5,-2.7024931986323628e-8,-0.0017464276261986936,-1.6352739951425828e-5,-2.7167717614836124e-8,-0.0017462061719448097,-1.6602042086509395e-5,-2.7387475511613235e-8,-0.0017458589390846183,-1.688727509586495e-5,-2.7639480984314817e-8,-0.001745383793112345,-1.7137548063945405e-5,-2.7861723308800773e-8,-0.001744819115139456,-1.7287659579105718e-5,-2.7997065592867195e-8,-0.0017442316274042247,-1.7303833560797986e-5,-2.8015768007836517e-8,-0.0017436912573285538,-1.7194973975304273e-5,-2.7925287860788828e-8,-0.001743247452036388,-1.7004614184730193e-5,-2.7763247275154654e-8,-0.0017429180130239536,-1.6791404372740664e-5,-2.758049651565357e-8,-0.0017426913839497045,-1.6609904370917028e-5,-2.7424492345162885e-8,-0.001742536475141356,-1.649859690995107e-5,-2.7328913073261393e-8,-0.0017424137905466815,-1.6475754777084468e-5,-2.731001280582881e-8,-0.0017422844622990985,-1.6540670952381766e-5,-2.7367575703814308e-8,-0.001742116355369948,-1.6677544114767887e-5,-2.7488179361086792e-8,-0.0017418876343611228,-1.686031928037145e-5,-2.764933739189588e-8,-0.0017415883616594284,-1.70577248174131e-5,-2.782387438953023e-8,-0.0017412205022093819,-1.7238115114124338e-5,-2.7984175560639326e-8,-0.0017407965855088022,-1.737379930727008e-5,-2.8106002984605667e-8,-0.0017403372333003285,-1.744456666693547e-5,-2.81716008451723e-8,-0.0017398678463401798,-1.7440083829039737e-5,-2.817179627356715e-8,-0.0017394149398974874,-1.7360942313155324e-5,-2.8106908907450188e-8,-0.0017390025998627163,-1.7218462503755394e-5,-2.7986581351569095e-8,-0.0017386492629266872,-1.7033516940844868e-5,-2.78287765345854e-8,-0.0017383648667583472,-1.6834511621145167e-5,-2.7658071698212013e-8,-0.0017381483860776027,-1.6654526309760896e-5,-2.750323777098479e-8,-0.0017379857880764208,-1.6527352718845074e-5,-2.7393844848311547e-8,-0.0017378488996451671,-1.6481799532138352e-5,-2.735530264547702e-8,-0.0017376966372265247,-1.653390656976417e-5,-2.7402002468754002e-8,-0.0017374807521994074,-1.6678137811977933e-5,-2.752950967892001e-8,-0.0017371577619254865,-1.6881003467352378e-5,-2.7708880462880502e-8,-0.0017367058418978965,-1.7082956805723142e-5,-2.7888277038928824e-8,-0.0017361397871615877,-1.7213636041267133e-5,-2.8006313607759834e-8,-0.0017355130919502622,-1.7217983517437767e-5,-2.8014887489228886e-8,-0.0017349010873700975,-1.7080148864802256e-5,-2.789998107144859e-8,-0.0017343723348015217,-1.6829898005292252e-5,-2.7687166142917287e-8,-0.0017339647832955254,-1.6527764114669422e-5,-2.742869117101087e-8,-0.0017336786370508808,-1.6239846977128967e-5,-2.718170516827529e-8,-0.0017334849605685624,-1.6017009429821272e-5,-2.6990333500378085e-8,-0.0017333407869161536,-1.588567181395312e-5,-2.6877727087182345e-8,-0.0017332024740586718,-1.5848606242811324e-5,-2.6846667644146168e-8,-0.0017330340615586818,-1.5890746362680283e-5,-2.68844715727071e-8,-0.0017328110493750382,-1.598598400945783e-5,-2.696877596915934e-8,-0.00173252127473545,-1.6103053832416733e-5,-2.7072598915931684e-8,-0.0017321643150833425,-1.6210210138051937e-5,-2.716841036510506e-8,-0.0017317501140170313,-1.6278998147010685e-5,-2.723144593688566e-8,-0.0017312970188940173,-1.6287366080985484e-5,-2.7242447571344237e-8,-0.0017308292084595779,-1.6222185622260528e-5,-2.7189872388028625e-8,-0.001730373452436675,-1.6081006942388617e-5,-2.7071418830950497e-8,-0.0017299553582569695,-1.5872667604661172e-5,-2.6894553273205772e-8,-0.0017295955423252537,-1.5616500957420817e-5,-2.6675832877706237e-8,-0.0017293061873740823,-1.5340170469505593e-5,-2.6439061947713e-8,-0.0017290883470865532,-1.507625010199129e-5,-2.6212382075122478e-8,-0.0017289303472872032,-1.485771739629063e-5,-2.6024423253133448e-8,-0.0017288076171489378,-1.4712600788592941e-5,-2.5899692716363257e-8,-0.0017286843786890062,-1.4657982104751628e-5,-2.5853345982890227e-8,-0.0017285179920752429,-1.469378801204321e-5,-2.5885710544355952e-8,-0.0017282669016267444,-1.4797809692912494e-5,-2.597784298491023e-8,-0.0017279022709099565,-1.4924826606494031e-5,-2.6090678957383975e-8,-0.0017274210330882648,-1.5013539408658058e-5,-2.6171041964052904e-8,-0.0017268544886931924,-1.500339980186787e-5,-2.6166307322124555e-8,-0.0017262646488298942,-1.4857541654773406e-5,-2.6044338623451537e-8,-0.0017257250829835684,-1.4580494467278208e-5,-2.5808814537283378e-8,-0.0017252937794389228,-1.4218526667931194e-5,-2.5499476937908507e-8,-0.0017249930231404602,-1.3840794807331261e-5,-2.517585149150039e-8,-0.0017248067699141875,-1.351270711306445e-5,-2.4894335555473773e-8,-0.0017246934534974646,-1.3276295708485894e-5,-2.4691333401292228e-8,-0.0017246038274408126,-1.314433765536367e-5,-2.4578159853052325e-8,-0.0017244948196652298,-1.3105269854769773e-5,-2.454517288778279e-8,-0.0017243364526524838,-1.3132362073222714e-5,-2.456957312402072e-8,-0.0017241132667976712,-1.3192342565411862e-5,-2.4622786661510245e-8,-0.0017238228661482834,-1.325163183139236e-5,-2.4675851118792835e-8,-0.0017234735662261548,-1.3280343921097598e-5,-2.470291409721152e-8,-0.0017230820075737141,-1.3254924222723466e-5,-2.4683557620105018e-8,-0.0017226707950760843,-1.3160121817767504e-5,-2.4604525475472103e-8,-0.001722265910630456,-1.2990581890931382e-5,-2.4461095384133306e-8,-0.001721893605087852,-1.275194862461917e-5,-2.4258014835579526e-8,-0.0017215766694778005,-1.2461004044485085e-5,-2.400961012256891e-8,-0.0017213304202050618,-1.2144266502687791e-5,-2.373858904526001e-8,-0.0017211591144521662,-1.1834740035222872e-5,-2.3473278345894057e-8,-0.0017210536379387664,-1.15669121811399e-5,-2.3243368159746304e-8,-0.0017209912434660293,-1.137053703664978e-5,-2.3074600444917153e-8,-0.00172093786428734,-1.126418106526938e-5,-2.2983213066028008e-8,-0.0017208531150557185,-1.1249725559581083e-5,-2.2971150222902847e-8,-0.0017206977257007766,-1.1309037278010377e-5,-2.3023095245395752e-8,-0.0017204427559582552,-1.1404176889886242e-5,-2.3106548502949438e-8,-0.0017200791234227555,-1.1482681882738014e-5,-2.3176327687590162e-8,-0.0017196246541953794,-1.148889330573019e-5,-2.3184350335903796e-8,-0.001719124641958263,-1.1380227657635337e-5,-2.3093722950941158e-8,-0.0017186423638384035,-1.114361781624759e-5,-2.289295661201278e-8,-0.0017182400231541156,-1.0804036814357762e-5,-2.2603315828948557e-8,-0.0017179572397719124,-1.0418304686722344e-5,-2.2273489276189473e-8,-0.0017177979779009823,-1.0055136813138216e-5,-2.1962468500676522e-8,-0.0017177326568771723,-9.771363476111051e-6,-2.171915971274942e-8,-0.0017177126940655086,-9.59618259083335e-6,-2.1568855933039855e-8,-0.0017176882158911563,-9.528664202440341e-6,-2.151102115154199e-8,-0.0017176207842986657,-9.54532916023194e-6,-2.152570092195504e-8,-0.001717488539588401,-9.61114215968148e-6,-2.1582903167043163e-8,-0.0017172856020235222,-9.688935408136953e-6,-2.1650695633700068e-8,-0.0017170188075453885,-9.745503388018222e-6,-2.1700489974222203e-8,-0.001716704030343493,-9.75481187740589e-6,-2.1709853665659155e-8,-0.001716363051667733,-9.699527683861308e-6,-2.1663854398151375e-8,-0.0017160209740540878,-9.571902058244573e-6,-2.155581284513286e-8,-0.0017157037275235207,-9.374493289871258e-6,-2.1387892099804606e-8,-0.0017154351582843574,-9.12063251889091e-6,-2.1171465309349033e-8,-0.0017152334371241793,-8.834059379219236e-6,-2.0926792740536966e-8,-0.0017151070380174468,-8.54691461997685e-6,-2.0681324010697784e-8,-0.0017150511747853247,-8.295434661355793e-6,-2.0466057621787945e-8,-0.0017150460711992154,-8.113332137404114e-6,-2.030992124260642e-8,-0.0017150584488687581,-8.023886119027629e-6,-2.0233017236108107e-8,-0.0017150469068009022,-8.032794681682757e-6,-2.0240470470753276E-08,-0.0017149705846409252,-8.124212126971078e-6,-2.031895666669989e-8,-0.0017147992299687779,-8.261786867259084e-6,-2.043750161115691e-8,-0.0017145220766764634,-8.39524066367176e-6,-2.0553060054856926e-8,-0.001714152932724592,-8.471588872493842e-6,-2.062012893709478e-8,-0.0017137294505731322,-8.448766698921679e-6,-2.0602470471424994e-8,-0.0017133056268037235,-8.30827935977141e-6,-2.0484010951138584e-8,-0.0017129382965746429,-8.062726137621993e-6,-2.0275329834940626e-8,-0.0017126708829768335,-7.754388283059394e-6,-2.0012476947012425e-8,-0.0017125200757254853,-7.443621313326269e-6,-1.9747060849152198e-8,-0.0017124712795059404,-7.190431363037621e-6,-1.9530504080148718e-8,-0.001712485108463056,-7.0366396458408515e-6,-1.9398773754969298e-8,-0.0017125116285125956,-6.995979960543143e-6,-1.9363850589301513e-8,-0.0017125055152946264,-7.054904126090996e-6,-1.941433171688431e-8,-0.0017124362267456486,-7.181290036679982e-6,-1.9522819783303132e-8,-0.0017122912356786113,-7.33559115667751e-6,-1.9655458212988638e-8,-0.0017120739679193392,-7.480041670713854e-6,-1.9779851901213196e-8,-0.0017117993662422982,-7.584250733816216e-6,-1.9869913460128613e-8,-0.0017114893374762983,-7.627641340691138e-6,-1.9907989660052855e-8,-0.0017111690927208221,-7.6000125055850025e-6,-1.9885345225042433e-8,-0.0017108644073861132,-7.501412760528949e-6,-1.9802025000362843e-8,-0.0017105992780522003,-7.341978719606794e-6,-1.966667578346078e-8,-0.0017103933189507282,-7.1417111820099305e-6,-1.949632951528594e-8,-0.0017102585004460788,-6.929573781906971e-6,-1.9315642219774395e-8,-0.0017101954017993111,-6.7409497837180035e-6,-1.9154764556717096e-8,-0.0017101899463117245,-6.612514274616833e-6,-1.904501927146042e-8,-0.0017102124219094009,-6.574302226505446e-6,-1.9012164611844463e-8,-0.0017102208546907933,-6.640381461484933e-6,-1.906841604034119e-8,-0.0017101696872487946,-6.801430426475136e-6,-1.920604126355059e-8,-0.0017100221870999638,-7.023203351349197e-6,-1.939596217498844e-8,-0.0017097624173563275,-7.2532026779098715e-6,-1.959339512897098e-8,-0.0017094018542985613,-7.4343348959541015e-6,-1.9749511339903364e-8,-0.0017089776595243197,-7.520980981562084e-6,-1.982519953065219e-8,-0.0017085430785728673,-7.491875094526717e-6,-1.98021064005799e-8,-0.0017081533169143335,-7.355782261528479e-6,-1.968751486928549e-8,-0.0017078512816734047,-7.148736530329722e-6,-1.9512013140907094e-8,-0.0017076570788535014,-6.924050653939927e-6,-1.9321004792382517e-8,-0.0017075639301940206,-6.73805286028801e-6,-1.9162573935492407e-8,-0.0017075414744693901,-6.635623404704152e-6,-1.9075152574921577e-8,-0.0017075452538536885,-6.6397481673598866e-6,-1.907856769945405e-8,-0.0017075291279762277,-6.74799680854229e-6,-1.917095975773456e-8,-0.001707456464753147,-6.936270654025548e-6,-1.9331909124735297e-8,-0.001707306873839935,-7.167486224038338e-6,-1.9529815014463757e-8,-0.0017070774940020905,-7.40150152130711e-6,-1.9730384470556232e-8,-0.001706780055599116,-7.603160648750164e-6,-1.9903542367193303e-8,-0.0017064359548183703,-7.747073464223104e-6,-2.0027552034501053e-8,-0.0017060712869391593,-7.819370843360752e-6,-2.009053088308096e-8,-0.0017057128647851082,-7.81750689300007e-6,-2.0090272816758505e-8,-0.0017053853475831233,-7.749258787440385e-6,-2.0033369653230264e-8,-0.0017051090246987348,-7.63165252439743e-6,-1.9934273203516424e-8,-0.0017048976130836205,-7.48990374053086e-6,-1.9814391821666054e-8,-0.0017047556071532683,-7.355870167993619e-6,-1.9700800557958514e-8,-0.0017046752314598494,-7.265069438578037e-6,-1.962374814999241e-8,-0.001704633907873945,-7.251176602605976e-6,-1.9612010035070857e-8,-0.0017045942123405239,-7.337574074837141e-6,-1.968569133958673e-8,-0.0017045088636094908,-7.527447475358424e-6,-1.984773628854404e-8,-0.0017043321125059295,-7.796609969145614e-6,-2.0077728553648004e-8,-0.0017040352892301902,-8.094628881719389e-6,-2.033278529821439e-8,-0.0017036199174814714,-8.357321757473915e-6,-2.0558199710134475e-8,-0.0017031207453830734,-8.527279641554265e-6,-2.07049674527795e-8,-0.0017025957211632837,-8.573251713438601e-6,-2.0746330786424403e-8,-0.0017021073995130097,-8.499347348814524e-6,-2.0685612575558143e-8,-0.0017017044497118188,-8.341162243397592e-6,-2.0552915628861326e-8,-0.0017014101770728533,-8.152663137236833e-6,-2.0393996128262026e-8,-0.001701220123087332,-7.99029114266652e-6,-2.0256802195303342e-8,-0.0017011069963663247,-7.899440803721392e-6,-2.0180015465234488e-8,-0.0017010298088642021,-7.905934485141747e-6,-2.0185786978182623e-8,-0.0017009442845075707,-8.013087611659719e-6,-2.0277176829621546e-8,-0.001700812271449088,-8.203778005991368e-6,-2.043983579510598e-8,-0.001700608518360257,-8.446292559298515e-6,-2.0646923134808663e-8,-0.0017003238336688721,-8.702227743979316e-6,-2.086581340902206e-8,-0.0016999645473487364,-8.934420936028888e-6,-2.106486263485468e-8,-0.00169954913513485,-9.113190354238928e-6,-2.1218747636263865e-8,-0.0016991033874861217,-9.22001102864717e-6,-2.1311618593498575e-8,-0.0016986554807616981,-9.248647435155238e-6,-2.13380740034121e-8,-0.0016982318855080062,-9.204399731118582e-6,-2.1302519561850147e-8,-0.0016978543995590132,-9.10238542444722e-6,-2.121770451114759e-8,-0.0016975380294125626,-8.965565187764711e-6,-2.1103046899748445e-8,-0.0016972892355614753,-8.822716746064468e-6,-2.0982928734896224e-8,-0.001697104147393287,-8.706075816679848e-6,-2.0884721675880377e-8,-0.0016969666972081788,-8.647926619789557e-6,-2.0835920379221263e-8,-0.00169684740011825,-8.675181170249637e-6,-2.0859546028640884e-8,-0.0016967045804855362,-8.801519162920972e-6,-2.0967436610679105e-8,-0.0016964905065300056,-9.01844333619171e-6,-2.1152579343920042e-8,-0.0016961639731149969,-9.289415793960601e-6,-2.138406153842879e-8,-0.001695707106127775,-9.553311743058151e-6,-2.160998864081665e-8,-0.0016951385176591758,-9.741104001052941e-6,-2.1771702413548394e-8,-0.0016945128063564176,-9.801298769835388e-6,-2.1825425829586347e-8,-0.001693902985101117,-9.720976758235634e-6,-2.176009941619977e-8,-0.0016933741666031645,-9.529958261736527e-6,-2.1600847624303437e-8,-0.0016929627649807358,-9.286767509844959e-6,-2.1397063223247418e-8,-0.0016926700984223038,-9.056285660978077e-6,-2.1203544267075215e-8,-0.0016924690855679811,-8.890755742029625e-6,-2.1064502321326876e-8,-0.0016923170302585921,-8.819805710338477e-6,-2.1005150945671767e-8,-0.0016921682214408472,-8.8489478525651e-6,-2.1030391509463162e-8,-0.0016919833229793798,-8.963433333096914e-6,-2.1127991678712995e-8,-0.0016917350451069605,-9.1345146397534e-6,-2.1273812337831973e-8,-0.0016914106590955637,-9.326304850307346e-6,-2.1437577987506275e-8,-0.0016910119930584138,-9.50234733555081e-6,-2.158843896357954e-8,-0.0016905533915853798,-9.631291450467526e-6,-2.1699798048136526e-8,-0.0016900581754099764,-9.69110899668149e-6,-2.1752905508392625e-8,-0.0016895542586885487,-9.671493446052107e-6,-2.1738910779710982e-8,-0.0016890696305639124,-9.574362283327237e-6,-2.1659302094648493e-8,-0.0016886283866275086,-9.412685663855614e-6,-2.1524925607916213e-8,-0.001688247743667381,-9.208192002297713e-6,-2.1354054577412935e-8,-0.0016879360364431592,-8.98854909081757e-6,-2.1170017704178606e-8,-0.0016876914563649197,-8.784322466768402e-6,-2.0998642806816554e-8,-0.0016875013089274406,-8.625690463057586e-6,-2.086549585606093e-8,-0.0016873417279686287,-8.53858560005698e-6,-2.0792626469016813e-8,-0.001687178325547085,-8.539692110101775e-6,-2.079432297753112e-8,-0.0016869691166023061,-8.630151987089456e-6,-2.0871746461888742e-8,-0.0016866715029369072,-8.789267347131455e-6,-2.100754636158876e-8,-0.001686254318023176,-8.97163165767185e-6,-2.1163398058176738e-8,-0.0016857129301765929,-9.112940780203801e-6,-2.1284938230037018e-8,-0.0016850801573558933,-9.148161471228022e-6,-2.1317184884815498e-8,-0.001684422796496244,-9.037763226930734e-6,-2.122672379094548e-8,-0.0016838198027999708,-8.787797426035769e-6,-2.1018591580797273e-8,-0.0016833318949512636,-8.44940531154977e-6,-2.0735764854021037e-8,-0.0016829803888256231,-8.096954946202853e-6,-2.0440726785689123e-8,-0.0016827459755191082,-7.799047296914452e-6,-2.0191141842253217e-8,-0.001682583454796451,-7.598483392665845e-6,-2.0023083749209106e-8,-0.0016824406087873034,-7.507046345778621e-6,-1.9946647297024858e-8,-0.00168227233893414,-7.511005682637191e-6,-1.995050767444206e-8,-0.0016820477635596358,-7.580629314178077e-6,-2.0009840918065495e-8,-0.0016817519149339769,-7.679226904576688e-6,-2.0093885939198342e-8,-0.0016813844563981313,-7.770076038468931e-6,-2.017176810577966e-8,-0.00168095711875254,-7.821310599237092e-6,-2.02166337334569e-8,-0.0016804905773571324,-7.809332280904686e-6,-2.020854689581189e-8,-0.001680010953275545,-7.72105576611143e-6,-2.013639837823021e-8,-0.001679546036692029,-7.555014866778501e-6,-1.999884849506686e-8,-0.0016791214090587767,-7.3212178391739496e-6,-1.9804212819061585e-8,-0.0016787568208649483,-7.0396326381076e-6,-1.956919439356282e-8,-0.0016784633058374865,-6.737431280764423e-6,-1.9316573595337173e-8,-0.0016782413530992905,-6.445394475960026e-6,-1.907219462969039e-8,-0.001678080222805157,-6.193862700986028e-6,-1.8861571689255484e-8,-0.0016779584103784654,-6.008506027515523e-6,-1.8706342929766363e-8,-0.001677845249146384,-5.906093833141004e-6,-1.8620715185890165e-8,-0.0016777038192801804,-5.890290612856807e-6,-1.8607914310898255e-8,-0.0016774958004093384,-5.947719194763358e-6,-1.8656841222782147e-8,-0.0016771890493794792,-6.04551842846217e-6,-1.873997969081269e-8,-0.001676767832841618,-6.132885965309012e-6,-1.8814675758844495e-8,-0.0016762435242489034,-6.149771262434435e-6,-1.8830466334363702e-8,-0.0016756602448421592,-6.044400624246342e-6,-1.8743841862040513e-8,-0.001675087945535953,-5.795520152856072e-6,-1.8536922752685177e-8,-0.001674600133436057,-5.427392994706577e-6,-1.8229981102522346e-8,-0.0016742451149479186,-5.004926323171685e-6,-1.7877295972549893e-8,-0.0016740276746855878,-4.608399079730942e-6,-1.7546004506771972e-8,-0.0016739119980301556,-4.302510944871832e-6,-1.729026756861099e-8,-0.0016738412334485694,-4.117301795986611e-6,-1.7135338860309113e-8,-0.0016737597260480786,-4.047201977927108e-6,-1.7076725758927597e-8,-0.0016736272940627243,-4.062129813392705e-6,-1.708939796436854e-8,-0.0016734236526182423,-4.121225593287399e-6,-1.7139232302019368e-8,-0.0016731464204356393,-4.183527382690121e-6,-1.719194905092986e-8,-0.001672806667024793,-4.214324596648135e-6,-1.721846074771176e-8,-0.0016724243936852225,-4.1882372375009135e-6,-1.7197481453770475e-8,-0.0016720247121886067,-4.090499672781078e-6,-1.71166177315317e-8,-0.001671634560924054,-3.9173958791691575e-6,-1.697273167292582e-8,-0.0016712796064216253,-3.676148262014399e-6,-1.677183719774153e-8,-0.0016709811132979546,-3.3841381804794744e-6,-1.6528438089025636e-8,-0.001670752839878428,-3.067097445950772e-6,-1.626401154436992e-8,-0.0016705983902454557,-2.755995668689129e-6,-1.6004410253319553e-8,-0.0016705096420609104,-2.4827410471397807e-6,-1.5776279333381472e-8,-0.0016704667555038147,-2.2751486697532836e-6,-1.5602864533974782e-8,-0.001670440054529566,-2.151829226592785e-6,-1.5499751063543376e-8,-0.001670393800312215,-2.117817669325008e-6,-1.5471212409242127e-8,-0.001670291584102462,-2.1617204405963794e-6,-1.5507814775575798e-8,-0.0016701029794063543,-2.2550054075283997e-6,-1.5585801952800447e-8,-0.0016698110099757678,-2.354258371242796e-6,-1.5668961170856538e-8,-0.0016694193436379667,-2.4075797922360825e-6,-1.5713962061550806e-8,-0.0016689568880535386,-2.3659216383981152e-6,-1.5679837674904023e-8,-0.001668476255894404,-2.198389705642687e-6,-1.5540770761251108e-8,-0.0016680427111036224,-1.9070635849955495e-6,-1.5298448763090533e-8,-0.0016677138985701416,-1.5331708742942751e-6,-1.49871845626283e-8,-0.001667517861434114,-1.147223731015582e-6,-1.4665690841976024e-8,-0.0016674416245268775,-8.243545513833562e-7,-1.4396566986045408e-8,-0.0016674379465091208,-6.170824570407865e-7,-1.4223645290633774e-8,-0.0016674458929825874,-5.401446955353702e-7,-1.415932767755485e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json new file mode 100644 index 0000000..ddc7d4d --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":20000,"numberOfSamples":1000,"samples":[0.002920358133904192,-6.784113942412794e-6,1.9052440314477163e-8,0.0029206413912713745,-6.613636446664559e-6,1.880279195741177e-8,0.0029208307139081857,-6.4248857259363685e-6,1.8526799455172666e-8,0.002920930147853429,-6.259580496894272e-6,1.8285299846459358e-8,0.002920958301557765,-6.151401288497133e-6,1.8127384394993633e-8,0.002920943527534336,-6.121517965926748e-6,1.8083876197142136e-8,0.002920918375602291,-6.176714362040785e-6,1.816459054828576e-8,0.0029209142523147777,-6.309966452545619e-6,1.8359183512205728e-8,0.0029209570493570875,-6.502919273456435e-6,1.864078390277559e-8,0.0029210641805222245,-6.729529878146821e-6,1.8971329337261025e-8,0.0029212431239192664,-6.960111764971586e-6,1.9307474224319167e-8,0.0029214911994797127,-7.165144308668532e-6,1.960613535377138e-8,0.002921796120285953,-7.318617634903727e-6,1.982935162046132e-8,0.002922137007124233,-7.4010933087209115e-6,1.994874542519259e-8,0.0029224858842140738,-7.402792330024526e-6,1.9950053694911065e-8,0.0029228100891597296,-7.3269133160290385e-6,1.9838013786501703e-8,0.0029230765056806078,-7.192875581754198e-6,1.9641124744988003e-8,0.002923258593947595,-7.038021661925838e-6,1.941411030247615e-8,0.0029233461420444737,-6.914897975233613e-6,1.9233867338703342e-8,0.0029233550561071457,-6.88082642372724e-6,1.9184132872670825e-8,0.002923331035256764,-6.979157664713172e-6,1.9328047777690732e-8,0.002923340142385916,-7.2183869507838524e-6,1.9677702094935728e-8,0.002923445583922481,-7.561828631160178e-6,2.0179192009197127e-8,0.002923681317946548,-7.937980661899995e-6,2.072789220706034e-8,0.0029240384097172193,-8.268180631197756e-6,2.1208898937220332e-8,0.0029244717828463846,-8.495446917109097e-6,2.1539128515592525e-8,0.0029249206337382287,-8.5993447870362e-6,2.168897594018406e-8,0.0029253292642615033,-8.593866031641322e-6,2.1679150221309016e-8,0.002925659785723746,-8.515407336314436e-6,2.1563040883823154e-8,0.0029258958667452545,-8.409144036535884e-6,2.140676187245665e-8,0.0029260405842169023,-8.318330424117874e-6,2.1273515340970926e-8,0.0029261116369550147,-8.277597083016847e-6,2.1213831819462888e-8,0.0029261360482877165,-8.309529221173803e-6,2.1260608728115165e-8,0.0029261452014683505,-8.42340926017503e-6,2.142729184107828e-8,0.002926170313882796,-8.615486024606374e-6,2.1708269585437497e-8,0.00292623844165663,-8.870566448345604e-6,2.2081201504360447e-8,0.00292636924853009,-9.164729529600066e-6,2.2511001728707966e-8,0.0029265727710682966,-9.46889441648262e-6,2.295507952203869e-8,0.0029268483980316373,-9.752900430721535e-6,2.336931848773817e-8,0.0029271851539575938,-9.989600330613871e-6,2.371405611551756e-8,0.0029275631112714875,-1.0158516530347245e-5,2.3959412562508196e-8,0.002927955664309901,-1.0248883948905652e-5,2.408973052847181e-8,0.002928332543885939,-1.0262052169211477e-5,2.4107097524156514e-8,0.002928663659626732,-1.0213176614852856e-5,2.4033835922844377e-8,0.002928924086482032,-1.0131859571605514e-5,2.391343414198871e-8,0.002929100469893201,-1.006068720901442e-5,2.380835533385682e-8,0.00292919825272032,-1.0049779074946679e-5,2.3791978424671676e-8,0.0029292472514429032,-1.0145544621233506e-5,2.3932078427797663e-8,0.0029293008561212352,-1.0374107175155202e-5,2.4266580620660107e-8,0.0029294238469290295,-1.0725024417737487e-5,2.4779841229322424e-8,0.002929669111734987,-1.114611883277768e-5,2.539521780426727e-8,0.0029300535325597157,-1.1558053316444333e-5,2.599647534430263e-8,0.0029305485124082784,-1.1884615009568598e-5,2.647210161222967e-8,0.0029310923955805034,-1.2081611605397568e-5,2.675757842754958e-8,0.002931616304399638,-1.2148069338781219e-5,2.6851763811636517e-8,0.002932067285150511,-1.2117575796211164e-5,2.6804177118692685e-8,0.002932418917621506,-1.2040100109443465e-5,2.6688285414068273e-8,0.002932670230039864,-1.1965464765100921e-5,2.657720810322275e-8,0.0029328387680504554,-1.1933289258766363e-5,2.6528961772784398e-8,0.00293295270881014,-1.196897681852962e-5,2.658062017342903e-8,0.002933044376699607,-1.2083490982675024e-5,2.67480469420976e-8,0.0029331455921541476,-1.2274805413081184e-5,2.7028061070784242e-8,0.002933284292138651,-1.2529877406152909e-5,2.7401345594697467e-8,0.00293348183921598,-1.2826952297089921e-5,2.7835835906596038e-8,0.0029337508490475143,-1.3138354603080276e-5,2.829083170402535e-8,0.002934093645838865,-1.3433894030281315e-5,2.872201713802254e-8,0.0029345016544849406,-1.3684880135773215e-5,2.908736254701938e-8,0.0029349561406361926,-1.386840837531521e-5,2.935340201831078e-8,0.002935430486740117,-1.3971275110489517e-5,2.95009506018706e-8,0.002935893835760189,-1.3992889279387817e-5,2.9529348563241594e-8,0.002936315747796631,-1.3946693107954746e-5,2.9458526641335536e-8,0.0029366714399644074,-1.3859725730502529e-5,2.9328347332084718e-8,0.0029369471463227275,-1.3770076163005065e-5,2.919483182596872e-8,0.0029371450608840764,-1.3721886782902614e-5,2.912277265954847e-8,0.002937286864066753,-1.3757394229001907e-5,2.917400350300773e-8,0.0029374138979444495,-1.3905986529102212e-5,2.9391340967481903e-8,0.002937581299334286,-1.4172039349156543e-5,2.9780814874648412e-8,0.002937844163109093,-1.45262281968288e-5,3.029905020497397e-8,0.0029382377175291947,-1.4907319198974039e-5,3.085599616240686e-8,0.0029387598782889463,-1.5239082205155629e-5,3.13397558100923e-8,0.0029393676298225253,-1.5457827043506526e-5,3.165695446938089e-8,0.002939992216838139,-1.5536378976067384e-5,3.1767915909756623e-8,0.0029405653190518453,-1.5490797301223943e-5,3.169654522724492e-8,0.002941041254771594,-1.536815347138079e-5,3.151235350452084e-8,0.00294140542344543,-1.5225670745632641e-5,3.129971116966001e-8,0.0029416699353257774,-1.511314588614597e-5,3.113191036723647e-8,0.002941863403875871,-1.5063955018859357e-5,3.105791466104839e-8,0.002942020994539501,-1.5093505935668198e-5,3.110013611490886e-8,0.002942177366646585,-1.520170158147927e-5,3.125814014183412e-8,0.0029423625508156873,-1.537654151057894e-5,3.1514004634474597e-8,0.002942599690849947,-1.559743059921687e-5,3.183721614696178e-8,0.00294290359336924,-1.5838011990550073e-5,3.2188849522134435e-8,0.00294327957060671,-1.606891948600009e-5,3.252562907878252e-8,0.002943722566359027,-1.626091105834113e-5,3.2804552667574874e-8,0.0029442169460562008,-1.6388674978272435e-5,3.2988495583917805e-8,0.002944737613991192,-1.643514977217652e-5,3.3052553288382284e-8,0.002945253028492552,-1.6395599116742716e-5,3.299000825108424e-8,0.0029457301748656087,-1.6280316984019043e-5,3.2816276383530096e-8,0.0029461409054937337,-1.6114844458962526e-5,3.2569189442586106e-8,0.002946468467779173,-1.59369584836108e-5,3.230452078197805e-8,0.0029467127007430827,-1.5790452065963385e-5,3.20867790313752e-8,0.002946892484190752,-1.571653783339316e-5,3.19765091292342e-8,0.0029470444074099875,-1.574421226294738e-5,3.201610119609517e-8,0.00294721700040216,-1.5881334913556607e-5,3.2216717921521556e-8,0.002947460426363542,-1.6108825234197094e-5,3.2549869520431156e-8,0.002947812788728661,-1.6380947123874963e-5,3.294795449427606e-8,0.002948286406491707,-1.663423983095662e-5,3.3317466246604255e-8,0.0029488597757889802,-1.6805051579412595e-5,3.356478318315856e-8,0.0029494809972528905,-1.6850594771345913e-5,3.362711592054566e-8,0.0029500837834087173,-1.6764027436157334e-5,3.3494691584581735e-8,0.002950609547099543,-1.65754022846451e-5,3.321214488618771e-8,0.0029510248489415226,-1.6338277873894157e-5,3.285874310463184e-8,0.002951326908519711,-1.6110067758768604e-5,3.251932528889389e-8,0.002951537740617979,-1.5935923031543694e-5,3.226045946019777e-8,0.002951692897861342,-1.5841154803625142e-5,3.2119268917177497e-8,0.0029518308167177263,-1.5831373922113136e-5,3.210371527010424e-8,0.002951985680243071,-1.5896753371837802e-5,3.219898309769699e-8,0.0029521838394617654,-1.6017149276703177e-5,3.237510141211502e-8,0.0029524425171660266,-1.6166416508957604e-5,3.259333287301716e-8,0.002952769476479237,-1.631566760743691e-5,3.281097659429368e-8,0.0029531628666808734,-1.6435949662826805e-5,3.298530817637135e-8,0.002953611072809355,-1.6501010877409013e-5,3.307765926789581e-8,0.0029540929521073237,-1.6490693620487103e-5,3.305842467294873e-8,0.002954579264429746,-1.639499922671663e-5,3.291305556929234e-8,0.00295503617946976,-1.6218085914775832e-5,3.264794315872196e-8,0.0029554312636725514,-1.598068794654785e-5,3.2293958485677294e-8,0.002955741283648492,-1.5719093070127868e-5,3.1904895652031e-8,0.002955959806034109,-1.547937573783238e-5,3.154889715991773e-8,0.0029561017019983917,-1.5307268455907255e-5,3.129343797151466e-8,0.002956202124345455,-1.5236171399037398e-5,3.118759456372629e-8,0.002956309344895545,-1.5277053681785616e-5,3.124717312307237e-8,0.002956473061121083,-1.5413664099591182e-5,3.144774573045378e-8,0.002956731321048645,-1.56048785559379e-5,3.1728248939181924e-8,0.00295709965139376,-1.5793981380019647e-5,3.20047831722283e-8,0.002957565526219128,-1.592284518104132e-5,3.2191570296512827e-8,0.002958090281759539,-1.5947524626471783e-5,3.2223937815342005e-8,0.0029586188407144266,-1.5850738642942996e-5,3.2076690446522256e-8,0.002959094945026436,-1.5646720190761735e-5,3.177121976954928e-8,0.002959476848073268,-1.5376083073574004e-5,3.136786811924238e-8,0.0029597476091094625,-1.5092533249955837e-5,3.094622473963542e-8,0.0029599165389014807,-1.4847001851064014e-5,3.058161120537158e-8,0.0029600126576895124,-1.4675368085643121e-5,3.032691574396036e-8,0.0029600742944759875,-1.4593152680899354e-5,3.020479859533819e-8,0.0029601393336397405,-1.4596748310243467e-5,3.020960605628144e-8,0.002960238698290419,-1.4668406120361078e-5,3.031483113270092e-8,0.002960393348094185,-1.4782054688900286e-5,3.048176038556993e-8,0.0029606137208240614,-1.4908213038661743e-5,3.0666732803764704e-8,0.002960900307724539,-1.5017561814104221e-5,3.082638893027108e-8,0.002961244434757364,-1.50835587775595e-5,3.092151102287129e-8,0.0029616289196745093,-1.508481954343969e-5,3.092053838966425e-8,0.0029620288994349014,-1.5007922270276185e-5,3.080373072655211e-8,0.002962413625758523,-1.485083932757977e-5,3.056826258788275e-8,0.0029627502369207145,-1.4626387490437281e-5,3.023332794121676e-8,0.002963010182597418,-1.4364071234967201e-5,2.9842834228472035E-08,0.002963177767764606,-1.4107920694885702e-5,2.9462135061082662e-8,0.002963258245024794,-1.390835698351417e-5,2.9165907356940043e-8,0.002963281197327158,-1.3808595017261191e-5,2.9017964910745684e-8,0.0029632955592347656,-1.3829869002871433e-5,2.9049396981577167e-8,0.0029633562901483323,-1.396211303207011e-5,2.9244867118890364e-8,0.002963507429295757,-1.4165122782118485e-5,2.9544476640865564e-8,0.0029637685076608447,-1.4380196230406393e-5,2.986111941278739e-8,0.0029641293995320965,-1.4547336536681909e-5,3.010599812437667e-8,0.0029645544477331213,-1.462147944059388e-5,3.021262159737794e-8,0.002964993199433165,-1.4582947790407866e-5,3.015220993420224e-8,0.002965393786237881,-1.4440252912374524e-5,2.993775541428279e-8,0.002965715263846332,-1.4225700000439636e-5,2.9617431791449873e-8,0.002965936105661564,-1.3985740295725363e-5,2.926023813664994e-8,0.0029660572013795127,-1.3768956215185547e-5,2.893816297894991e-8,0.0029660991821764673,-1.361495218959358e-5,2.8709729777681658e-8,0.0029660954822132313,-1.3546940317984253e-5,2.8609061319606824e-8,0.0029660836753954115,-1.3569374678669404e-5,2.86424548981107e-8,0.002966097715672726,-1.3670152439685494e-5,2.8791723939980673e-8,0.002966162758787371,-1.382559151959131e-5,2.9021622975413763e-8,0.002966292909415142,-1.4006141463460001e-5,2.9288313696922994e-8,0.0029664912327432187,-1.4181368889154244e-5,2.9546719679842586e-8,0.00296675098439865,-1.432364071392131e-5,2.975594063607446e-8,0.0029670571768570203,-1.441068763053631e-5,2.988302426452729e-8,0.0029673880824924595,-1.4427641005829092e-5,2.990599124607975e-8,0.0029677168251591012,-1.4369146872198044e-5,2.9817001755657374e-8,0.002968013691011178,-1.4241810907193253e-5,2.962601250879183e-8,0.0029682500709710805,-1.4066513065220714e-5,2.93642059457502e-8,0.002968404731954602,-1.387910107568484e-5,2.9084963591962518e-8,0.002968471978193223,-1.3727039399383037e-5,2.88588007731629e-8,0.002968469059433979,-1.3659767445614165e-5,2.875897632722551e-8,0.0029684378958154877,-1.3713145157645224e-5,2.8838395498620046e-8,0.00296843646941631,-1.3893353069001035e-5,2.9105800690051132e-8,0.0029685202671800416,-1.4169383669450605e-5,2.9514779524273305e-8,0.0029687215722676882,-1.4480741544933563e-5,2.997532983204709e-8,0.0029690374925616814,-1.4758063993347154e-5,3.038452227517716e-8,0.002969432550313911,-1.494625005415047e-5,3.0660807023103234e-8,0.0029698527534371528,-1.501941615613648e-5,3.076614564288683e-8,0.002970242975131316,-1.4983590593674082e-5,3.070991787329774e-8,0.002970560707010411,-1.486978332026129e-5,3.053852833456252e-8,0.002970783380041674,-1.4722598896256202e-5,3.031840881526067e-8,0.0029709096528671933,-1.4588664344004444e-5,3.01187930361603e-8,0.0029709563531596737,-1.4507263299708571e-5,2.999782950169233e-8,0.0029709528196634203,-1.450412607323851e-5,2.9993430059943106e-8,0.0029709340930672533,-1.4588613765477793e-5,3.011917526326649e-8,0.0029709342235076834,-1.4754157039491757e-5,3.036503994043903e-8,0.0029709808089967682,-1.4981337496558506e-5,3.070201327711546e-8,0.0029710914938153535,-1.524256500555707e-5,3.1089054340748793e-8,0.0029712726180356206,-1.5507206205397086e-5,3.1480689014010646e-8,0.0029715197167699482,-1.5746211713835314e-5,3.1833846061620287e-8,0.002971819217195222,-1.5935676545529305e-5,3.211310994113541e-8,0.0029721506391493777,-1.6059298169857467e-5,3.2294356226821274e-8,0.002972488915422919,-1.6110085669579795e-5,3.236730284468479e-8,0.0029728068475521232,-1.609171171330991e-5,3.233754856855953e-8,0.0029730780491342918,-1.6019684593364873e-5,3.2228331099957483e-8,0.002973280996517472,-1.5922014544477006e-5,3.2081488017266414e-8,0.002973404663571169,-1.5838170077771026e-5,3.195582334149546e-8,0.0029734552005521004,-1.581431674792034e-5,3.1919928221359786e-8,0.002973461188362297,-1.589302000644207e-5,3.2036819078499595e-8,0.0029734728689441363,-1.609792381140514e-5,3.234121094806937e-8,0.0029735507610109523,-1.6418860094304986e-5,3.281753040259766e-8,0.002973744280704623,-1.6807320664665265e-5,3.3393348896120576e-8,0.0029740698756861514,-1.7189700640362698e-5,3.395915574472174e-8,0.002974502213153519,-1.7494403406110863e-5,3.4408643234550394e-8,0.002974984560957685,-1.767802825408724e-5,3.4677597890506306e-8,0.0029754513730213712,-1.773672456282881e-5,3.476073805538473e-8,0.002975849730807777,-1.7700253301847003e-5,3.470280180238341e-8,0.0029761508530331345,-1.7616516953682456e-5,3.4575409590022556e-8,0.0029763511916333146,-1.7535807952942615e-5,3.445351817065031e-8,0.0029764671850589274,-1.7499734982786542e-5,3.439891544803893e-8,0.002976527814731713,-1.753553605886131e-5,3.445182277720747e-8,0.0029765674333753333,-1.7654482487030005e-5,3.462863214504655e-8,0.0029766197783471023,-1.785285028144174e-5,3.4923452338110174e-8,0.002976713303471049,-1.8114495901758313e-5,3.531200044507124e-8,0.00297686786306883,-1.841450460826479e-5,3.575704849602197e-8,0.002977092820345906,-1.8723439945705067e-5,3.6214741069552453E-08,0.0029773865940886136,-1.9011730919729806e-5,3.6641106825301627e-8,0.00297773758195352,-1.9253744086145604e-5,3.6998098021908325e-8,0.002978126225410339,-1.9431077092030192e-5,3.725847234837322e-8,0.002978527778364898,-1.953481608938666e-5,3.740914085341509e-8,0.0029789154040244796,-1.9566826718393777e-5,3.7453087807647996e-8,0.002979263474936315,-1.9540223734977267e-5,3.741007038668588e-8,0.002979551126528603,-1.9479037319080024e-5,3.731610210216535e-8,0.002979766242014358,-1.9416859969519788e-5,3.722137847792964e-8,0.0029799099497124348,-1.9393715173435276e-5,3.7185523694292244e-8,0.002980000915971834,-1.94498533312271e-5,3.7268276541520824e-8,0.0029800772524500073,-1.9615566721707554e-5,3.7514326950814606e-8,0.002980192469529219,-1.9898167604817833e-5,3.7934040287157073e-8,0.0029804022602219083,-2.0271164712515565e-5,3.8487521814506124e-8,0.0029807434701728474,-2.067424132501533e-5,3.9084720785291444e-8,0.0029812147089178787,-2.1030261025836366e-5,3.961077233026522e-8,0.0029817719928732045,-2.127449949752043e-5,3.99694784583061e-8,0.0029823449666828935,-2.1379992430783766e-5,4.0121037663042906e-8,0.0029828645165091085,-2.136410513008704e-5,4.009182899623436e-8,0.0029832854451143304,-2.127531976246566e-5,3.995464665032265e-8,0.002983594498668351,-2.1171712511966522e-5,3.97964527218785e-8,0.0029838054954291746,-2.1103248487216302e-5,3.9691834147374094e-8,0.002983948836829765,-2.110276132606735e-5,3.968953147631429e-8,0.002984061290257191,-2.1184288397485705e-5,3.981006008442894e-8,0.002984178513731084,-2.1345484561751207E-05,4.004945855912969e-8,0.00298433040769511,-2.157146104983014e-5,4.0385128619668554e-8,0.002984538433971821,-2.183875045296736e-5,4.078179890719198e-8,0.002984814157245484,-2.2119128743535838e-5,4.1197228817699106e-8,0.0029851587068223267,-2.2383338100873876e-5,4.158774803164346e-8,0.0029855631058775885,-2.260472386163859e-5,4.191366897386889e-8,0.002986009558291577,-2.2762699849510053e-5,4.214444460091879e-8,0.002986473810408079,-2.2845709776562213e-5,4.226307152736928e-8,0.0029869284555065143,-2.285321248440732e-5,4.226903134195116e-8,0.0029873468009023675,-2.279640960153469e-5,4.217934987696174e-8,0.0029877069362470323,-2.2697618488155953e-5,4.202762496290873e-8,0.002987995706883981,-2.2588196005956238e-5,4.186087368514205e-8,0.0029882122724941918,-2.250493424394035e-5,4.173407992678916e-8,0.002988370845250907,-2.2484777608857293e-5,4.170223881865493e-8,0.0029885017936435655,-2.255756728162393e-5,4.180950622118746e-8,0.002988649508545319,-2.2737002269993502e-5,4.20757789848222e-8,0.002988864944534272,-2.3011660125789477e-5,4.248345478531366e-8,0.0029891917531914853,-2.3340375925996207e-5,4.2970713042447454e-8,0.0029896486141179545,-2.3657833305475466e-5,4.3439950290240724e-8,0.002990215930999584,-2.3893473135528555e-5,4.378597223794274e-8,0.0029908371871804683,-2.399812996226874e-5,4.393568517521914e-8,0.0029914382467285117,-2.396417191820179e-5,4.3878147729951906e-8,0.0029919551613743003,-2.38265851199188e-5,4.3666186218943454e-8,0.0029923547556799392,-2.364535922564181e-5,4.33899815622375e-8,0.0029926388924618567,-2.34815530183942e-5,4.314111317342226e-8,0.0029928352743501543,-2.3379858232251807e-5,4.298635560434982e-8,0.002992983643000855,-2.3362211966869825e-5,4.2958145653724355e-8,0.002993124239325345,-2.3429729514789833e-5,4.305762336091702e-8,0.0029932908205783236,-2.3568260581625195e-5,4.3263117748307686e-8,0.0029935075467194595,-2.3754218892099406e-5,4.353897939933425e-8,0.002993788115402275,-2.3959322132927218e-5,4.3842700238288005e-8,0.002994135865131543,-2.415427368613513e-5,4.413039745178603e-8,0.002994544317604473,-2.431187474329782e-5,4.436143642962751e-8,0.0029949981369148688,-2.4409940834154676e-5,4.4502773677267694e-8,0.002995474733920963,-2.4434159363146072e-5,4.453322269139798e-8,0.002995946867852737,-2.438065412063379e-5,4.444727962470359e-8,0.0029963863997792425,-2.4257633800533217e-5,4.425756592263305e-8,0.0029967688850502656,-2.4085455016201706e-5,4.399488097416399e-8,0.002997078338300538,-2.3894673268282683e-5,4.370522458009922e-8,0.002997311349129843,-2.3721945852451404e-5,4.344359182276227e-8,0.002997479656226587,-2.360404297666528e-5,4.32649398235654e-8,0.0029976103593761477,-2.357065305448074e-5,4.3213385803306306e-8,0.002997743110787153,-2.3636926496027646e-5,4.3311086910764544e-8,0.002997923748088096,-2.379704664473801e-5,4.354874311053949e-8,0.0029981942175954005,-2.4020889171051923e-5,4.388077348084879e-8,0.0029985799058661606,-2.4256592745038067e-5,4.422930981774514e-8,0.0029990778745615423,-2.444143335305884e-5,4.450051619084297e-8,0.002999651934402648,-2.4520419116148653e-5,4.461236561595702e-8,0.003000240119555401,-2.4466536425871935e-5,4.452486712152954e-8,0.0030007744382348467,-2.4292342453891288e-5,4.4257372821343864e-8,0.0030012043836071256,-2.4045254021272564e-5,4.388146492212079e-8,0.003001512146798215,-2.3788596603881732E-05,4.3492440534199405e-8,0.003001713011004348,-2.3579216292932016e-5,4.3175608587979206e-8,0.0030018440201570076,-2.345253767991309e-5,4.298382851303703e-8,0.0030019492490419297,-2.3418849803166555e-5,4.293202980731309e-8,0.0030020683571267115,-2.3467794115789163e-5,4.300412504387121e-8,0.003002230577040951,-2.3575924418412295e-5,4.3164515275253525e-8,0.0030024530481396073,-2.371369072928725e-5,4.336864156691746e-8,0.0030027414546316424,-2.3850507219765965e-5,4.357057053753451e-8,0.0030030914014577796,-2.395813305179184e-5,4.3728004665977624e-8,0.003003489836964812,-2.4013129247926298e-5,4.3805913400348664e-8,0.003003916505986112,-2.3999045197511412e-5,4.3779791639210484e-8,0.0030043458018004154,-2.3908648392456543e-5,4.3639009503235175e-8,0.003004749546491452,-2.3746015567883387e-5,4.338995688522113e-8,0.0030051010544452283,-2.3527756377723387e-5,4.305786620408989e-8,0.003005380278727441,-2.3282359290256304e-5,4.268578367873625e-8,0.0030055791218540325,-2.3046814799346892e-5,4.232942511550203e-8,0.003005705403471987,-2.2860300990568903e-5,4.2047613637055405e-8,0.0030057838269298923,-2.2755768795899834e-5,4.188959157506121e-8,0.0030058528292368726,-2.275134395340437e-5,4.188212374752424e-8,0.003005957307061821,-2.2843946110056914e-5,4.2020014794074985E-08,0.003006138413427418,-2.300724171618979e-5,4.226319699714995e-8,0.0030064225790959894,-2.319527741556905e-5,4.254234844837243e-8,0.003006812562702178,-2.335201743558618e-5,4.277330694714285e-8,0.0030072836012702583,-2.3425444976355578e-5,4.2878234687331705e-8,0.003007787264335132,-2.3382901257872224e-5,4.280856410095554e-8,0.003008263689228249,-2.3222450315454287e-5,4.2561953877304193e-8,0.0030086592071474436,-2.2974830200955383e-5,4.218511547518296e-8,0.0030089426676550976,-2.26937486182808e-5,4.17591305405803e-8,0.00300911333844383,-2.2438134195979213e-5,4.137267939823414e-8,0.003009197487585295,-2.225432969879038e-5,4.1095226879594374e-8,0.003009236757661162,-2.216547948200621e-5,4.0961121500672567e-8,0.003009274709149118,-2.217043771176245e-5,4.09681037873079e-8,0.0030093468102407217,-2.224960297551781e-5,4.108625065125137e-8,0.003009475717436156,-2.2373205783984607e-5,4.1270546851323725e-8,0.003009670815179887,-2.250862585044295e-5,4.147189797251425e-8,0.0030099299700386954,-2.2625428795493783e-5,4.164463699013084e-8,0.00301024187402901,-2.269838136100306e-5,4.1750971465696804e-8,0.003010588197802463,-2.2709282253166442e-5,4.17636812926794e-8,0.0030109454772800953,-2.2648401738654642e-5,4.1668279995880246e-8,0.0030112871514783373,-2.2515993789587058e-5,4.1465320020488957e-8,0.003011586410402015,-2.2323777967550487e-5,4.1172650945728414e-8,0.003011820354517727,-2.2095615453953176e-5,4.082642765490463e-8,0.0030119753682766987,-2.1866121724890676e-5,4.0478962804724885e-8,0.0030120526329220835,-2.167596603147096e-5,4.019155827324615e-8,0.003012071619005174,-2.1563470526289128e-5,4.002177521312465e-8,0.0030120689879420764,-2.1553983387326334e-5,4.0007412510859045e-8,0.0030120914835277484,-2.1650539471334874e-5,4.015251477306536e-8,0.003012183981443884,-2.1829957093484467e-5,4.0421644155871945e-8,0.003012376436940448,-2.2046872823385574e-5,4.074612539538994e-8,0.003012674385510726,-2.2245060636632923e-5,4.104120937557746e-8,0.003013056385483303,-2.237249037808146e-5,4.122877520759659e-8,0.003013479206572159,-2.2395363336080645e-5,4.125840285038834e-8,0.00301388907552939,-2.2307009988112173e-5,4.112064949092303e-8,0.003014235716569667,-2.21292539477236e-5,4.0848957479960844e-8,0.0030144852458368573,-2.1905904722336058e-5,4.0509715506145036e-8,0.003014628140393211,-2.1690273931464643e-5,4.0183354013727575e-8,0.0030146798861370155,-2.1530670765035162e-5,3.9942465173289727e-8,0.003014674513909391,-2.1458647516230403e-5,3.9834154839566405e-8,0.0030146539150070514,-2.1483480978725524e-5,3.9871866653527925e-8,0.003014657045850174,-2.159355446238517e-5,4.003762590554032e-8,0.0030147123189946208,-2.1762610361229233e-5,4.029158028075859e-8,0.0030148344079461886,-2.1957660138997936e-5,4.0583952504102195e-8,0.003015024723893025,-2.214588593896058e-5,4.0865392615269084e-8,0.0030152739036193445,-2.22993320272481e-5,4.109395623141755e-8,0.0030155648211872598,-2.239750335835605e-5,4.123893927793968e-8,0.0030158753159103555,-2.242862410171888e-5,4.1282740545661414e-8,0.0030161804959735242,-2.239035571976067e-5,4.122196425411615e-8,0.0030164549748184135,-2.2290484655788065e-5,4.106850249505057e-8,0.0030166756785176938,-2.2147566876471484e-5,4.085053467582822e-8,0.0030168257902463656,-2.1990840651876128e-5,4.0612367627877493e-8,0.0030168998356597245,-2.185809576971141e-5,4.041113557692705e-8,0.003016908801918456,-2.1790004412026398e-5,4.030814374624823e-8,0.0030168827390098687,-2.1820318277313286e-5,4.035402021045058e-8,0.0030168675107474373,-2.19637983748077e-5,4.057054444845606e-8,0.003016913871536386,-2.220687703617631e-5,4.09366942603126e-8,0.003017061280745224,-2.2507121073764624e-5,4.138801109760418e-8,0.0030173232653145413,-2.28042122748035e-5,4.1833304318833444e-8,0.0030176816547766365,-2.3038752114974032e-5,4.218308051823787e-8,0.003018092461901088,-2.317060860472061e-5,4.2377204037070425e-8,0.0030185000617629827,-2.3189358211647577e-5,4.240056434796237e-8,0.0030188531890023565,-2.3114278349446322e-5,4.2282916648184983e-8,0.0030191172695145925,-2.298608274263823e-5,4.2086230161827244e-8,0.003019280521670172,-2.2854616393563075e-5,4.188596434454325e-8,0.00301935377876645,-2.27664496809722e-5,4.1752283274555145e-8,0.0030193653932179577,-2.2755137035095014e-5,4.173540981919782e-8,0.0030193531828910203,-2.2835689436507088e-5,4.185743087774839e-8,0.003019355569264338,-2.3003756094996915e-5,4.211123646364793e-8,0.003019403958407845,-2.323899690414335e-5,4.246574371735947e-8,0.003019517875462904,-2.3511172447957385e-5,4.2875145551518413e-8,0.003019703373553423,-2.3786991097561844e-5,4.328922423781491e-8,0.003019954219332213,-2.4036029761377636e-5,4.3662218358333147e-8,0.003020254766068992,-2.423482031971884e-5,4.395891153209101e-8,0.003020583367897793,-2.4369010761043288e-5,4.415784033020523e-8,0.0030209155492026242,-2.4434102956819604e-5,4.425239523927991e-8,0.0030212267021837735,-2.443546844269732e-5,4.4250868318591255e-8,0.0030214945520319145,-2.438812313993975e-5,4.417614262844354e-8,0.0030217018620748537,-2.4316298536123176e-5,4.406504030121207e-8,0.0030218398456035413,-2.4252307744576375e-5,4.396654725060574e-8,0.003021912331535931,-2.4233602777596313e-5,4.39372627104561e-8,0.0030219396761021347,-2.429662036167427e-5,4.4032012805518794e-8,0.0030219599100410016,-2.4466782499552282e-5,4.4288740896769435e-8,0.00302202361177359,-2.4746531459929342e-5,4.47105455738881e-8,0.003022180395983599,-2.5107010582484676e-5,4.525329764117915e-8,0.003022460057180725,-2.5490814286278737e-5,4.5829951905006934e-8,0.003022857627761485,-2.5828964736561783e-5,4.633626256410645e-8,0.003023332267934383,-2.6065721301283244e-5,4.668826880948124e-8,0.003023821927221237,-2.6178133626157623e-5,4.685181828073514e-8,0.0030242654527104103,-2.618060722133502e-5,4.6849397702988095e-8,0.00302462064736006,-2.6115003315723564e-5,4.674500325784846e-8,0.003024872054652819,-2.6034210741007566e-5,4.661907867346306e-8,0.003025029247398639,-2.5987096868666402e-5,4.654559337911846e-8,0.003025119674183166,-2.600869221520683e-5,4.657718713531259e-8,0.0030251798618585422,-2.6115962524536738e-5,4.6738915646380234e-8,0.003025247304514287,-2.6307892425086884e-5,4.702858653637406e-8,0.0030253540345252404,-2.6568373656992416e-5,4.742130825887169e-8,0.003025522180290973,-2.6870812112854194e-5,4.7876552038498893e-8,0.0030257616742353777,-2.718362842899639e-5,4.834647617031556e-8,0.0030260701248843638,-2.7475754898200334e-5,4.878418797216237e-8,0.003026434531440565,-2.7721296131052857e-5,4.915072369570908e-8,0.003026834267375794,-2.790282528074767e-5,4.941997646359749e-8,0.003027244652317317,-2.801310467185596e-5,4.958126578195143e-8,0.00302764045789911,-2.8055375984440208e-5,4.963976761859313e-8,0.0030279989828120874,-2.8042678247256376e-5,4.961548465878466e-8,0.003028302732030385,-2.7996614735003015e-5,4.9541371336797554e-8,0.0030285419382640503,-2.7945668380696642e-5,4.946074008271887e-8,0.0030287171664962805,-2.7922799028450726e-5,4.9423540183523226e-8,0.003028841979820805,-2.796162115926255e-5,4.948048077466765e-8,0.0030289448272879803,-2.8090202994150213e-5,4.967360897101288e-8,0.00302906808799766,-2.832216698757468e-5,5.002291747065914e-8,0.003029261393516597,-2.8646859820436187e-5,5.051165188848918e-8,0.0030295674732655794,-2.9023648863821986e-5,5.107788139765754e-8,0.0030300035036457318,-2.9387468552092513e-5,5.1622994265168756e-8,0.003030547654439084,-2.966892547984612e-5,5.204210187529804e-8,0.0030311419708281494,-2.9821700123341288e-5,5.226546402242462e-8,0.003031713429022907,-2.9841451121119933e-5,5.228710697781398e-8,0.0030322015269454838,-2.9764614366811912e-5,5.216297581619774e-8,0.003032576700297681,-2.964992539693665e-5,5.1982771928407634e-8,0.0030328427049061664,-2.95558177823456e-5,5.18354400080819e-8,0.0030330273738204275,-2.952483864326578e-5,5.178537523848844e-8,0.0030331699517057442,-2.9577898541893805e-5,5.1863748181959154e-8,0.0030333104138618784,-2.9715604944099784e-5,5.207074030425486e-8,0.003033482465717576,-2.9922976396352082e-5,5.238294189196952e-8,0.0030337098242709487,-3.017493755703473e-5,5.276185486031358e-8,0.0030340047066781646,-3.0441434203506502e-5,5.316170038656006e-8,0.0030343677318868385,-3.069201162682167e-5,5.353632168723621e-8,0.0030347889661070187,-3.089987345211356e-5,5.384526338775909e-8,0.0030352499978571756,-3.104524236184448e-5,5.405880170678398e-8,0.0030357268634388502,-3.111778908424594e-5,5.416158516454266e-8,0.0030361935715449567,-3.1117887001919675e-5,5.415451590233293e-8,0.003036625814699871,-3.105651407747209e-5,5.4054586154864e-8,0.003037004388893214,-3.095390233892545e-5,5.3892806738359834e-8,0.003037318044491069,-3.083722670992275e-5,5.3710656905416486e-8,0.0030375656938618433,-3.073753439132445e-5,5.355535566628204e-8,0.0030377579336559293,-3.068595891553895e-5,5.347403607373892e-8,0.0030379177300265737,-3.0709070813912385e-5,5.350663829087113e-8,0.00303807966723912,-3.0823076928323533e-5,5.367713979638666e-8,0.0030382864205653216,-3.102708512509555e-5,5.3983480616954495e-8,0.003038580787609243,-3.1297162733261364e-5,5.438876948576837e-8,0.0030389926926067358,-3.158502205672186e-5,5.481947606929273e-8,0.003039524072818,-3.1826340398447944e-5,5.517809779127173e-8,0.0030401396754807146,-3.196074975273588e-5,5.5373393880473416e-8,0.0030407732402690456,-3.1956872342941396e-5,5.5358273365942866e-8,0.0030413506216760183,-3.1827784431995975e-5,5.515324561172027e-8,0.0030418182463314066,-3.1625541651179424e-5,5.4838080988230775e-8,0.003042160215499455,-3.141800758364335e-5,5.4516451859117366e-8,0.003042396527409552,-3.126315753054347e-5,5.4276642795710085e-8,0.003042568426483442,-3.119410063882663e-5,5.416865946881467e-8,0.0030427219468042673,-3.121729790939866e-5,5.4201628447496637e-8,0.0030428965072263536,-3.131876817788899e-5,5.435349924198628e-8,0.0030431195875498325,-3.1472417249374476e-5,5.4583966139684054e-8,0.003043405671120528,-3.164719823662061e-5,5.48454888443154e-8,0.003043757278206,-3.181220441401584e-5,5.509103044165085e-8,0.0030441666670632966,-3.194016210578213e-5,5.527928024881129e-8,0.0030446177728978936,-3.2010055857858906e-5,5.537854846801234e-8,0.0030450884814295937,-3.200922767702134e-5,5.5369895852801475e-8,0.003045553386619406,-3.193493319092446e-5,5.524947681257876e-8,0.003045987115545042,-3.179510076572901e-5,5.502968803317016e-8,0.0030463680745412454,-3.1607871380829794e-5,5.473845618856727e-8,0.0030466821164058687,-3.139963516825679e-5,5.441621391559135e-8,0.0030469255028017037,-3.120163298944072e-5,5.4110664553357935e-8,0.003047106649642553,-3.1045429760949075e-5,5.3869815322197836e-8,0.003047246264489913,-3.0957724333207185e-5,5.373401644060654e-8,0.0030473756148905722,-3.0955076276420677e-5,5.372793333790556e-8,0.0030475327337165107,-3.10391075449408e-5,5.385333611732599e-8,0.0030477562593878016,-3.119291882112134e-5,5.408383161903094e-8,0.0030480767420623433,-3.138019112187306e-5,5.436371344206401e-8,0.003048506271394186,-3.154923496407961e-5,5.461427067933738e-8,0.003049029398017934,-3.164403612417949e-5,5.4750595244403097E-08,0.003049600741217892,-3.162181473782961e-5,5.470817249590223e-8,0.0030501546590933595,-3.147129459702184e-5,5.447053534930495e-8,0.0030506267199089275,-3.122124129326912e-5,5.408216609011085e-8,0.003050977543809847,-3.0931489493301834e-5,5.363475132421305e-8,0.0030512056349143645,-3.066970206362606e-5,5.323164358366911e-8,0.0030513427951945633,-3.048709541508865e-5,5.2950735410073135e-8,0.0030514375272195533,-3.0405493613713788e-5,5.2824725934812176e-8,0.0030515374213706445,-3.0418359774685625e-5,5.284287745599565e-8,0.003051677995809869,-3.050014466075965e-5,5.296553808075435e-8,0.0030518790092155215,-3.061696562449272e-5,5.314062781446654e-8,0.003052145625853913,-3.073469977610028e-5,5.3316031028704927e-8,0.0030524714707749288,-3.082377392153637e-5,5.344682144560079e-8,0.0030528417493476028,-3.086160174564249e-5,5.34988474804598e-8,0.0030532358836312897,-3.0833881042707114e-5,5.345060667689741e-8,0.003053629879526026,-3.0735485986035706e-5,5.3294565854492434e-8,0.0030539988364117142,-3.0571146292916206e-5,5.30382059792326e-8,0.0030543199507090837,-3.0355674406952507e-5,5.270438907050841e-8,0.0030545760956502454,-3.0113150877368533e-5,5.233010961195881e-8,0.00305475954547292,-2.9874438142143042e-5,5.1962653663563995e-8,0.003054874940487383,-2.967277780668974e-5,5.165280031939516e-8,0.0030549404324154324,-2.9537825570307475e-5,5.144563962738253e-8,0.0030549861390338404,-2.9489134143288323e-5,5.137059250576423e-8,0.0030550495976808005,-2.953061394193003e-5,5.143300630399881e-8,0.003055168710759939,-2.9647526534915528e-5,5.160970828560753e-8,0.0030553733364540553,-2.9807121158297693e-5,5.1850176986509324e-8,0.0030556770688369554,-2.9963521348213533e-5,5.208418350889287e-8,0.0030560711382057876,-3.0066914121891328e-5,5.223590149011024e-8,0.003056522783852153,-3.007606385331831e-5,5.224295582005858e-8,0.0030569803906741184,-2.9971466768568165e-5,5.207634125974998e-8,0.0030573862107332603,-2.9764480348069197e-5,5.1754164969916074e-8,0.0030576939719519337,-2.9497043921062268e-5,5.134105271121149e-8,0.0030578844960596806,-2.9229485363525857e-5,5.092940536552576e-8,0.0030579714726823846,-2.9020378842860718e-5,5.060856308901679e-8,0.00305799430929109,-2.890783769790072e-5,5.0436246780448754e-8,0.0030580024833647516,-2.8900743931462217e-5,5.042530128741445e-8,0.0030580398139917744,-2.8981793723107103e-5,5.0548579370877406e-8,0.0030581349144192635,-2.9117796452997896e-5,5.075489270553819e-8,0.0030582989710085853,-2.927092112731661e-5,5.0986296117823764e-8,0.00305852838098303,-2.9406906130383003e-5,5.1190589621726315e-8,0.00305880913029923,-2.9499417804318987e-5,5.132784410791377e-8,0.0030591209014314944,-2.9531615236497716e-5,5.1372652866946216e-8,0.003059440241717404,-2.949633831159525e-5,5.131434068941656e-8,0.00305974298908132,-2.9395907947313022e-5,5.1156659354477445e-8,0.0030600065090859636,-2.9241933794825013e-5,5.091753916282965e-8,0.00306021229511157,-2.9054948323373344e-5,5.062856693783168e-8,0.003060349177847135,-2.8863199511689882e-5,5.033312632870034e-8,0.003060416814008068,-2.8699745555567035e-5,5.008188395273282e-8,0.0030604284223485962,-2.8597283966096064e-5,4.992478512143156e-8,0.0030604111977471983,-2.858098323762389e-5,4.990002248696701e-8,0.0030604029204521956,-2.8660871126497475e-5,5.002240613766968e-8,0.0030604443802250266,-2.8826475438747818e-5,5.027527520898142e-8,0.0030605691021830185,-2.9046441406551585e-5,5.061009175503469e-8,0.00306079346737266,-2.927436144349517e-5,5.0955543464884993e-8,0.0030611106463299936,-2.945974872572592e-5,5.123445153963956e-8,0.003061490627398194,-2.9561147187201426e-5,5.1383839021491824e-8,0.0030618866932196325,-2.9557585511589545e-5,5.137235223398255e-8,0.0030622468460100747,-2.9455021239405097e-5,5.1209933881528055e-8,0.0030625273270125427,-2.9285654512983767e-5,5.0946554534423536e-8,0.0030627045011972953,-2.909970499319971e-5,5.065943900038011e-8,0.003062781223049597,-2.8951506243513924e-5,5.043168206571564e-8,0.0030627851170516554,-2.8884214842026012e-5,5.032886811317642e-8,0.003062759221135395,-2.8918582214671775e-5,5.038203695084455e-8,0.0030627487734678108,-2.9049687038960627e-5,5.0582911500186546e-8,0.0030627893702877065,-2.9251814457828465e-5,5.0891584468485985e-8,0.0030629003148716434,-2.9488179827505706e-5,5.1251525998749074e-8,0.0030630839037973016,-2.972103318011528e-5,5.160504457192073e-8,0.0030633288315558426,-2.9918997653759335e-5,5.190441062046527e-8,0.003063615124797014,-3.0060785653816723e-5,5.211739828811116e-8,0.003063918729338474,-3.013609360645597e-5,5.222854366679751e-8,0.003064214995878956,-3.014497667576545e-5,5.223815136496016e-8,0.0030644811540353513,-3.0096760320048008e-5,5.2160662139867385e-8,0.003064698316991432,-3.0009023509637796e-5,5.202315302953461e-8,0.0030648536429064674,-2.990656924730143e-5,5.1863784882354814e-8,0.0030649429933266646,-2.9819741475536308e-5,5.1729180727117875e-8,0.0030649738454125133,-2.9781167475517766e-5,5.166933721709507e-8,0.0030649674206902153,-2.98201748061254e-5,5.172897531156119e-8,0.0030649581828044383,-2.9955006804012056e-5,5.19355879701887e-8,0.0030649887015580467,-3.0184701153387606e-5,5.2287079973691934e-8,0.0030650993228122743,-3.048438554024296e-5,5.274472973817438e-8,0.0030653151426291397,-3.080799959377198e-5,5.3237545317571995e-8,0.0030656356436287177,-3.109971429626911e-5,5.36798936350581e-8,0.003066032397083313,-3.131062399609393e-5,5.3997123564829124e-8,0.0030664566457068772,-3.141392264624986e-5,5.414878191396371e-8,0.003066853673243906,-3.141241782904111e-5,5.414000445922996e-8,0.003067178107954643,-3.1336255718859404e-5,5.401782535141934e-8,0.003067405017322031,-3.123297452844401e-5,5.385569119674471e-8,0.0030675342967685115,-3.115406523908855e-5,5.3732673458228506e-8,0.0030675883450696387,-3.1142126616185284e-5,5.3713731593782084e-8,0.003067604598905477,-3.122165258980363e-5,5.3835712946092174e-8,0.0030676253853558076,-3.139518885501176e-5,5.41016984091395e-8,0.0030676878955794595,-3.164514859820826e-5,5.448403678006608e-8,0.0030678167760080873,-3.1940102956282886e-5,5.4934156079083943e-8,0.00306802082106185,-3.22432379520567e-5,5.539556794925043e-8,0.0030682938008947383,-3.252038055262967e-5,5.581610023286302e-8,0.003068618188348601,-3.2745712319185725e-5,5.6156527333722295e-8,0.0030689700372110436,-3.290455445210272e-5,5.63947158589191e-8,0.0030693235621584002,-3.299368835276426e-5,5.652604281911584e-8,0.0030696546829265168,-3.302018003318915e-5,5.656158441311524e-8,0.003069943501781531,-3.299964329710182e-5,5.652548727111865e-8,0.0030701761356594238,-3.295448884467991e-5,5.6452316329964884e-8,0.0030703464351241215,-3.2912168983386934e-5,5.6384348797087725e-8,0.0030704579205523843,-3.290292724600728e-5,5.6368046064395786e-8,0.0030705257705411666,-3.2956240209135014e-5,5.6448491101539555e-8,0.003070577902929506,-3.3095212754677564e-5,5.666072725949836e-8,0.003070653303256023,-3.332901887976236e-5,5.7018206275630994e-8,0.0030707954675129484,-3.3645317050531466e-5,5.750131258839977e-8,0.003071040281409215,-3.4006866132882734e-5,5.805237688321617e-8,0.003071401442066699,-3.435724590922433e-5,5.858460257890024e-8,0.003071860664240823,-3.463707718078335e-5,5.900700173455468e-8,0.003072369948294953,-3.4805077484133635e-5,5.9256687131385314e-8,0.0030728668933984586,-3.4853323968064e-5,5.932224867940723e-8,0.00307329574470014,-3.4808729472292477e-5,5.9245906426521214e-8,0.0030736238628414326,-3.472127382584356e-5,5.910521892617646e-8,0.0030738476136962186,-3.4646440956723325e-5,5.898583976281836e-8,0.0030739883560582247,-3.462984017376718e-5,5.895772090868357e-8,0.0030740829181741033,-3.46981445897087e-5,5.906122528438606e-8,0.0030741729261370603,-3.485661305223858e-5,5.930354340403719e-8,0.0030742957031104122,-3.509154811261891e-5,5.966276668283171e-8,0.0030744779277463736,-3.537572740023708e-5,6.00964697542749e-8,0.0030747323559975367,-3.5675189893930766e-5,6.055223916889516e-8,0.003075057487670119,-3.5956061174078274e-5,6.097812908001633e-8,0.0030754397046584866,-3.619027550379833e-5,6.133134047523962e-8,0.0030758570531433604,-3.6359408441814945e-5,6.158398173260262e-8,0.0030762836935755364,-3.645637499575067e-5,6.17255797130405e-8,0.0030766941332692503,-3.6485215974385064e-5,6.176270393282051e-8,0.00307706662715048,-3.645952970605651e-5,6.17165520944473e-8,0.0030773855806581914,-3.64002479832436e-5,6.161954383422073e-8,0.0030776432027652626,-3.63332416409525e-5,6.151163570192726e-8,0.003077840759611733,-3.628682113866609e-5,6.143643256726638e-8,0.003077989627912044,-3.628885788142236e-5,6.143667890109774e-8,0.0030781120193623807,-3.6363006241524466e-5,6.154837667649236e-8,0.0030782405956229293,-3.652349964920907e-5,6.179278977302228e-8,0.0030784153961581056,-3.6768720995789186e-5,6.216668724687254e-8,0.003078676287039924,-3.707542807113103e-5,6.263368664319519e-8,0.0030790504999446576,-3.739763323181358e-5,6.312273725650803e-8,0.0030795385416962856,-3.767491089624212e-5,6.354097060212617e-8,0.0030801063485889927,-3.7851372011602716E-05,6.380282181650783e-8,0.003080691860843348,-3.789839797156401e-5,6.3864909335135015E-08,0.0030812263089583505,-3.782804205247127e-5,6.374660437345014e-8,0.0030816595018051856,-3.768799022595951e-5,6.352218567186832e-8,0.003081975175275685,-3.754141745986299e-5,6.328960513196501e-8,0.0030821904003572086,-3.7444257862379394e-5,6.313520651894206e-8,0.003082343638281676,-3.743069219176931e-5,6.311124043335557e-8,0.0030824800552818033,-3.7509564541134194e-5,6.323047245576145e-8,0.0030826400072475326,-3.7668452785068254e-5,6.347276711043042e-8,0.003082852413765722,-3.788093848520992e-5,6.379661295313797e-8,0.003083132266538477,-3.811403698482697e-5,6.415076333549884e-8,0.0030834808667202927,-3.833449478651092e-5,6.448396137955909e-8,0.0030838877341181153,-3.8513714836371074e-5,6.475242681002939e-8,0.0030843336004778847,-3.8631288755844996e-5,6.49251538042667e-8,0.003084794042322366,-3.867707285475078e-5,6.49869875714132e-8,0.0030852433321181686,-3.865183435490819e-5,6.49395475346079e-8,0.0030856581339217173,-3.856655888053119e-5,6.48001336398034e-8,0.0030860206460516367,-3.844058492853828e-5,6.459884806542256e-8,0.0030863208771382037,-3.8298947069799535e-5,6.437449277747022e-8,0.0030865580404335806,-3.816935596666206e-5,6.416988298112212e-8,0.0030867412223701774,-3.807898089265322e-5,6.402682842646071e-8,0.0030868893766480983,-3.8050984731237867e-5,6.398072676630348e-8,0.0030870304944824955,-3.810068561233592e-5,6.405462439468387e-8,0.003087199430753806,-3.823122572618231e-5,6.425261522376926e-8,0.0030874333446925814,-3.842914766591009e-5,6.455320872359164e-8,0.0030877636895722525,-3.866159342862816e-5,6.490525234810125e-8,0.0030882049718960573,-3.887836166676586e-5,6.523127311346362e-8,0.003088743561312213,-3.9022341755227606e-5,6.544356507347711e-8,0.003089333590640843,-3.904860755320145e-5,6.547348840413299e-8,0.0030899071036917716,-3.894510170953161e-5,6.530322358465656e-8,0.0030903979050176593,-3.8742004346281896e-5,6.498015271661827e-8,0.003090767228006569,-3.8501181533249536e-5,6.460049051721142e-8,0.0030910160608724553,-3.8290854101103754e-5,6.426997931057188e-8,0.0030911786470456865,-3.816087723268984e-5,6.406549047523721e-8,0.003091304636594572,-3.81308943961482e-5,6.401668515462453e-8,0.0030914415331645385,-3.819243835001492e-5,6.410948319588161e-8,0.003091624053373996,-3.831851468248846e-5,6.430123035197483e-8,0.0030918706623143453,-3.8474104361764894e-5,6.453722136219927e-8,0.0030921846709144477,-3.8624255014770126e-5,6.476330985906157e-8,0.0030925572633731823,-3.8739191826344275e-5,6.493373044917373e-8,0.0030929709124494467,-3.879722444333691e-5,6.501542077873879e-8,0.003093402731555433,-3.8786312162609277e-5,6.499027635350036e-8,0.0030938277663450082,-3.870467412242986e-5,6.485599547202599e-8,0.0030942222139669767,-3.856054410640383e-5,6.462566902485165e-8,0.003094566519648795,-3.8371053174280506e-5,6.432606100579885e-8,0.0030948481721392368,-3.816012347433993e-5,6.399436069664364e-8,0.003095063804553022,-3.795541247827492e-5,6.36734419165358e-8,0.003095220250846101,-3.778464042825393e-5,6.34061366452044e-8,0.003095334440344874,-3.76716671513097e-5,6.322910755980504e-8,0.00309543208101415,-3.76325912073004e-5,6.316677889485286e-8,0.0030955450293822886,-3.767217508425234e-5,6.32258396731875e-8,0.003095707183071852,-3.778095740397159e-5,6.339090801722296e-8,0.00309594862334514,-3.793365750566644e-5,6.36222778804018e-8,0.003096287931628474,-3.80901905074783e-5,6.385770713701393e-8,0.0030967236941520254,-3.8201303672671125e-5,6.402124536059043e-8,0.003097228280907147,-3.822036947682624e-5,6.404140759803494e-8,0.0030977490184312755,-3.8120022723220564e-5,6.387670810024808e-8,0.0030982210755350135,-3.7907147081520453e-5,6.353864073301886e-8,0.0030985900761617553,-3.762610731223205e-5,6.309655120907573e-8,0.0030988336384995293,-3.734434007536094e-5,6.265523738702239e-8,0.003098968816215725,-3.7126254709522466e-5,6.231441792645098e-8,0.003099041425769494,-3.7010331236075636e-5,6.213318613669418e-8,0.0030991055833493103,-3.7000963291756114e-5,6.211747094970239e-8,0.0030992057850765756,-3.707503307238412e-5,6.223050579274813e-8,0.0030993681475792695,-3.719515769679686e-5,6.241367766141261e-8,0.0030996000182369945,-3.7321886461173106e-5,6.260562024590069e-8,0.0030998940056717068,-3.742152940130405e-5,6.275433238229519e-8,0.003100233021590866,-3.7469791909199243e-5,6.282264287237035e-8,0.0031005946146256498,-3.74527865541713e-5,6.278957087078115e-8,0.0031009543309571943,-3.7366892039579344e-5,6.264995951136436e-8,0.003101288498980592,-3.721816385706405e-5,6.241351573364313e-8,0.0031015767979117176,-3.702139137135275e-5,6.210337620395833e-8,0.0031018047687390517,-3.679862687950359e-5,6.175387343947005e-8,0.0031019661991720264,-3.657686241831285e-5,6.140695022313485e-8,0.0031020649564957345,-3.638462538015085e-5,6.110684934249384e-8,0.0031021156285978737,-3.624768225270253e-5,6.089338495755532e-8,0.003102142484188417,-3.6184428286903e-5,6.079473351831937e-8,0.0031021765631752685,-3.620172937410701e-5,6.082097958568538e-8,0.0031022510076930674,-3.629208197157182e-5,6.095979473559371e-8,0.0031023950750430954,-3.643289906673445e-5,6.117550104443778e-8,0.0031026275545373554,-3.658852828809345e-5,6.141241349154455e-8,0.0031029505897565103,-3.6715498961018746e-5,6.160314515690131e-8,0.0031033454561945222,-3.677128760644678e-5,6.168223979401771e-8,0.0031037725875075316,-3.672594194239396e-5,6.160407633853862e-8,0.0031041783170027994,-3.6573890333345214e-5,6.13609507617016e-8,0.0031045091130757767,-3.634081561194844e-5,6.099349544356457e-8,0.0031047297909969312,-3.607980110758601e-5,6.058452494813771e-8,0.0031048374201034855,-3.585494963702326e-5,6.023352619407363e-8,0.003104862516995215,-3.5718644691785436e-5,6.002135737673514e-8,0.003104856093193385,-3.569405931092349e-5,5.998319444364333e-8,0.0031048700872880267,-3.577137790618058e-5,6.010288490586609e-8,0.003104941604094109,-3.5916960865466545e-5,6.032745899023271e-8,0.00310508658575867,-3.608784938858073e-5,6.058987181278256e-8,0.003105301813939656,-3.6244129061960325e-5,6.082825896614451e-8,0.0031055709169320175,-3.6355939860998774e-5,6.099670423139435e-8,0.003105870647986892,-3.6405690275413666e-5,6.106846533436347e-8,0.0031061756914431407,-3.638750956805874e-5,6.103492926911871e-8,0.0031064618740461935,-3.630572623697611e-5,6.090315332297189e-8,0.0031067083897661323,-3.617327510332381e-5,6.069340518034317e-8,0.0031068996748370463,-3.6010179052804656e-5,6.043687697777326e-8,0.0031070273067826453,-3.5841809895788134e-5,6.017304374810048e-8,0.003107091924907097,-3.569640763286369e-5,5.994580924865879e-8,0.003107104690948129,-3.5601421586642455e-5,5.979775912534584e-8,0.0031070874280543044,-3.557871974140187e-5,5.976263364692894e-8,0.0031070705639987084,-3.563939705212548e-5,5.985721638430891e-8,0.00310708845076731,-3.577953751271076e-5,6.007479140748683e-8,0.0031071724854550274,-3.597857902840596e-5,6.0382741421625e-8,0.003107343449944664,-3.620155104969642e-5,6.072622362437715e-8,0.0031076051132779385,-3.640540195274204e-5,6.10381901744192e-8,0.0031079410880545904,-3.6548419234103456e-5,6.125412657583635e-8,0.0031083163328670636,-3.6600797795219e-5,6.132843658673388e-8,0.003108683776045806,-3.655377779638129e-5,6.12484672972554e-8,0.0031089953478281146,-3.642449473760269e-5,6.104178540723422e-8,0.0031092151923365167,-3.6254006005909544e-5,6.077284786520125e-8,0.003109331132111241,-3.6097367552710236e-5,6.052739707346827e-8,0.00310935954808475,-3.6007610042852635e-5,6.038750927329051e-8,0.0031093404361101393,-3.601917120844064e-5,6.04059490162074e-8,0.0031093239113226005,-3.6137917913298556e-5,6.059089030936383e-8,0.003109354124427072,-3.6341991680345246e-5,6.090751315544337e-8,0.0031094576079410963,-3.6591899919457295e-5,6.12939239128099e-8,0.003109639723574992,-3.684400498898479e-5,6.168222747975021e-8,0.003109888172433052,-3.706155993675539e-5,6.201562972733295e-8,0.003110179865335902,-3.7220522609188814e-5,6.225730522644977e-8,0.0031104876813696455,-3.731061864999249e-5,6.239184703464731e-8,0.00311078539719096,-3.733367074941028e-5,6.242252235980394e-8,0.0031110506840359895,-3.730106234421321e-5,6.236728729470829e-8,0.003111266829818254,-3.723134017143124e-5,6.225510727514509e-8,0.0031114239398752712,-3.7148181411718e-5,6.212287206499815e-8,0.0031115201531575613,-3.7078419428024274e-5,6.201236188919679e-8,0.003111562975299694,-3.7049500972479054e-5,6.196625586571644e-8,0.003111570240611829,-3.7085775629295866e-5,6.20222732746493e-8,0.0031115696907623807,-3.720350361712773e-5,6.220533256957703e-8,0.003111595961660061,-3.740535774526301e-5,6.251900193071125e-8,0.0031116842348012787,-3.7676298720104116e-5,6.293919212979045e-8,0.0031118612256879658,-3.798340020650173e-5,6.341407163920447e-8,0.003112136139777003,-3.828150901245256e-5,6.387306782824209e-8,0.003112495379209596,-3.852427301854293e-5,6.424415997620797e-8,0.003112903926884855,-3.867726198381603e-5,6.447432367142958e-8,0.0031133136874417224,-3.872848224078679e-5,6.454579824951314e-8,0.0031136761793375063,-3.8692456923064395E-05,6.448222652228261e-8,0.0031139554371912236,-3.860656882561176e-5,6.434267804320025e-8,0.0031141372703484766,-3.8521032659985596e-5,6.420576709598722e-8,0.0031142324513703736,-3.848555621137015e-5,6.414873497201981e-8,0.003114273122112332,-3.85363882869955e-5,6.422732768153216e-8,0.0031143034616922818,-3.868736365238427e-5,6.446208120483557e-8,0.0031143674207793413,-3.892758353008189e-5,6.483503018920008e-8,0.003114497459059395,-3.9226240381586666e-5,6.529750515880651e-8,0.0031147078121036174,-3.954245370409532e-5,6.578559894383833e-8,0.00311499378960663,-3.983627974908429e-5,6.623730004445356e-8,0.0031153360888836355,-4.007726426013293e-5,6.660567612073376e-8,0.0031157075151952004,-4.024868825724295e-5,6.686529743458914e-8,0.00311607947574405,-4.034776414925683e-5,6.701237492469503e-8,0.0031164267230209515,-4.038331710088937e-5,6.706105409678788e-8,0.0031167301083817336,-4.037260325837689e-5,6.703845169512361e-8,0.003116977890976981,-4.033831580823609e-5,6.698004129434217e-8,0.0031171663505323325,-4.030610095786534e-5,6.692583316158584e-8,0.0031173002857739405,-4.030233658179883e-5,6.691691302618574e-8,0.0031173935830516013,-4.035158745219613e-5,6.699141672014888e-8,0.003117469472534857,-4.047311163717984e-5,6.71790093138832e-8,0.0031175594775110223,-4.067616621474953e-5,6.749354678239481e-8,0.0031176996760878236,-4.095478103045957e-5,6.792501578391407e-8,0.003117923245200117,-4.1284097202451735e-5,6.843400804444655e-8,0.003118249965451604,-4.162156390749211e-5,6.895378532468487e-8,0.0031186762577232225,-4.1915651713568604e-5,6.940399276282996e-8,0.0031191714040973333,-4.212116830683181e-5,6.971456663709166e-8,0.0031196840741649716,-4.2215346438736336e-5,6.985077033810668e-8,0.003120157847027817,-4.220674667049533e-5,6.98269624957057e-8,0.0031205489414833265,-4.2132362620646234e-5,6.97018734876997e-8,0.0031208383916512266,-4.20448327662397e-5,6.955836204462521e-8,0.003121034785095203,-4.199616018547974e-5,6.947774286240719e-8,0.003121168632125931,-4.202421267565137e-5,6.951862361251391e-8,0.0031212820770698153,-4.214528318978495e-5,6.970544612819716e-8,0.0031214177248149594,-4.235306877230772e-5,7.002722768273191e-8,0.0031216092731973467,-4.2622792035729374e-5,7.044435725304227e-8,0.0031218754919343627,-4.2918580516760454e-5,7.090035608149642e-8,0.0031222181803268524,-4.320209457310386e-5,7.133539946884241e-8,0.003122623947005099,-4.344044848734895e-5,7.169857291254788e-8,0.00312306884485219,-4.361179467816571e-5,7.195639886437939e-8,0.003123524289638139,-4.370774340490241e-5,7.209642624241596e-8,0.0031239626656890764,-4.373282262997294e-5,7.21262580887302e-8,0.0031243615440335547,-4.3701909396077086e-5,7.206948965492392e-8,0.0031247061538028763,-4.3636780471882876e-5,7.196033443639855e-8,0.0031249903765416783,-4.356272900897019e-5,7.183837800351165e-8,0.0031252168682957006,-4.3505688790359626e-5,7.174410685588453e-8,0.0031253968441908885,-4.348975073626395e-5,7.17150048965672e-8,0.0031255497310814042,-4.35346390742139e-5,7.178155313739291e-8,0.00312570246406995,-4.3652662272077505e-5,7.196242839516862e-8,0.0031258876523310264,-4.384487979547073e-5,7.225856364534224e-8,0.003126139361453899,-4.409699636109416e-5,7.26468964950289e-8,0.003126485461480311,-4.437689592985936e-5,7.307674195249288e-8,0.003126937079372063,-4.4637120813428204e-5,7.347383911846252e-8,0.003127478854765807,-4.482535361453673e-5,7.375675854161458e-8,0.0031280666690904416,-4.490213927602775e-5,7.386449999496449e-8,0.0031286382404406153,-4.4858518891369295e-5,7.37839353542856e-8,0.0031291344460409416,-4.472272685316552e-5,7.356017852034121e-8,0.0031295207052957296,-4.455029894921475e-5,7.328095575302624e-8,0.0031297969026368396,-4.440289276125083e-5,7.304320913549977e-8,0.0031299925059136854,-4.4327735522592144e-5,7.292069128837017e-8,0.0031301525953489643,-4.4346566926362245e-5,7.294663172919162e-8,0.003130323040755186,-4.44552245163689e-5,7.311334170083266e-8,0.0031305398839340287,-4.463002091424208e-5,7.338260528006618e-8,0.00313082404631057,-4.483652215332876e-5,7.369977824422968e-8,0.0031311803606072124,-4.503787355813529e-5,7.400698484506922e-8,0.0031315994383132096,-4.5201450522542784e-5,7.425347439859536e-8,0.0031320612381614877,-4.530356848674249e-5,7.440279963037097e-8,0.0031325396046175753,-4.533218545978504e-5,7.443682235158883e-8,0.003133007088926917,-4.528754210138793e-5,7.435654510846008e-8,0.003133439334571156,-4.51809403698077e-5,7.41801159799911e-8,0.003133818472273233,-4.503213230381495e-5,7.393873233871031e-8,0.003134135205289634,-4.486591093923118e-5,7.367133504974223e-8,0.0031343895555660316,-4.470855447784281e-5,7.34190699593144e-8,0.003134590575431148,-4.4584622562577654e-5,7.322027017012072e-8,0.0031347554245567386,-4.451420562905288e-5,7.310611312884732e-8,0.0031349080100163845,-4.451044644791041e-5,7.309669605942408e-8,0.0031350771198854635,-4.457710742852157e-5,7.319723119373661e-8,0.0031352936217133444,-4.47060605212665e-5,7.339422020383135e-8,0.0031355858958112227,-4.487510826442938e-5,7.365224958348347e-8,0.003135972822388433,-4.5047645339306655e-5,7.391369496033267e-8,0.0031364549294214225,-4.517674188187485e-5,7.410524949995039e-8,0.003137006880828943,-4.521608014150156e-5,7.415499865583744e-8,0.0031375773084138556,-4.513707215275879e-5,7.401903658596108e-8,0.003138101428611319,-4.494515854131807e-5,7.370680978793502e-8,0.0031385245037932065,-4.468383466731007e-5,7.328731665396651e-8,0.0031388241332245405,-4.441996388809048e-5,7.286597138629206e-8,0.003139017499846824,-4.421722026618582e-5,7.254276438257211e-8,0.003139150157383647,-4.411342074013215e-5,7.237653893372397e-8,0.0031392756212672386,-4.411288523762928e-5,7.237306272266767e-8,0.003139437968769991,-4.4192948719133804e-5,7.249557334607343e-8,0.0031396632755686426,-4.431658177299298e-5,7.268500837724008e-8,0.0031399588406845693,-4.444412071309936e-5,7.287870894461722e-8,0.0031403166737552367,-4.454122642373622e-5,7.302295817715162e-8,0.0031407183126958165,-4.4583109623867075e-5,7.307944575839242e-8,0.0031411394477191415,-4.4556196731207386e-5,7.302762227868937e-8,0.0031415539994911366,-4.445830099035177e-5,7.28647417048713e-8,0.003141937728993228,-4.429775179132686e-5,7.260437295376374e-8,0.0031422713373744243,-4.4091609934731785e-5,7.227358181570472e-8,0.0031425429027575314,-4.386309308749254e-5,7.190893225978437e-8,0.0031427494576673834,-4.363836426557965e-5,7.155149576181157e-8,0.0031428974772572276,-4.3442976873453624e-5,7.124128957024562e-8,0.003143002214192302,-4.329843267004607e-5,7.101185038058907e-8,0.003143086052266109,-4.321920239699395e-5,7.088551186228275e-8,0.0031431760678829164,-4.3210361139567735e-5,7.086966698763124e-8,0.0031433008971223707,-4.3265945431617366e-5,7.09542336198036e-8,0.003143486895319873,-4.336813785078726e-5,7.111052058211447e-8,0.0031437533847702066,-4.348759147027911e-5,7.12919612296051e-8,0.0031441069213620117,-4.358585463469756e-5,7.143813366953108e-8,0.003144535476545944,-4.362139298757207e-5,7.148429942205696e-8,0.003145005091611609,-4.3560203673701036e-5,7.137795505629189e-8,0.003145463126681861,-4.3389675112285365e-5,7.11003324650128e-8,0.003145851574927433,-4.3129979926205826e-5,7.068402441148508e-8,0.0031461283507413433,-4.2833959953962696e-5,7.021264040871186e-8,0.003146286100171612,-4.257032356693477e-5,6.979432110562806e-8,0.0031463558591178996,-4.239669820392884e-5,6.951932082306872e-8,0.003146392327049763,-4.233819904869464e-5,6.942631862677053e-8,0.0031464507043553205,-4.2383168839997224e-5,6.94958958380317e-8,0.0031465688651928546,-4.249459392815535e-5,6.966883115670779e-8,0.0031467612849682977,-4.262689345829094e-5,6.987285185595196e-8,0.0031470222789782287,-4.273918499304871e-5,7.004366315740973e-8,0.0031473330289561153,-4.2802158807808166e-5,7.013567759431403e-8,0.003147668417268007,-4.279983806022786e-5,7.01245308551207e-8,0.0031480021049310764,-4.272860133319068e-5,7.00052672228628e-8,0.0031483099313495784,-4.259528124034335e-5,6.978916831189976e-8,0.0031485723125253334,-4.241509647530167e-5,6.950045735299453e-8,0.0031487761173877083,-4.2209454417396814e-5,6.917289890407978e-8,0.0031489161538580373,-4.2003459881328945e-5,6.884596295593158e-8,0.003148996162170557,-4.1822953882087386e-5,6.856021556609623e-8,0.003149028978654053,-4.169106752864223e-5,6.835188836388549e-8,0.003149035482429731,-4.162464544196019e-5,6.824720046102467e-8,0.003149042199251593,-4.163112014627014e-5,6.825739085675065e-8,0.00314907771956232,-4.170639233813112e-5,6.837538674971382e-8,0.0031491682653819867,-4.18342132313785e-5,6.857492364962827e-8,0.0031493329122884942,-4.198742613049102e-5,6.881267918772647e-8,0.003149579039836493,-4.213120402571019e-5,6.903358555963276e-8,0.0031498986271138838,-4.2228420130555436e-5,6.91794432100356e-8,0.0031502664228729867,-4.2247298350746497e-5,6.920097199180307e-8,0.003150641701734798,-4.217078712182122e-5,6.907238815589541e-8,0.0031509754961388586,-4.200545381164349e-5,6.880509810771359e-8,0.0031512238608324395,-4.1785638196682574e-5,6.845392811745735e-8,0.0031513640821730364,-4.1567794289340616e-5,6.810802378555436e-8,0.003151406157010707,-4.141327484247085e-5,6.786370323995615e-8,0.0031513912510576945,-4.136560918026271e-5,6.778876311671728e-8,0.003151375804577231,-4.1434395174820625e-5,6.789730029476199e-8,0.0031514098642566202,-4.159482257943738e-5,6.81492342574456e-8,0.0031515215625475173,-4.18012216288661e-5,6.847194098192803e-8,0.0031517136174996478,-4.200494130433833e-5,6.878861599395965e-8,0.0031519692707481077,-4.216756787951769e-5,6.903911030241721e-8,0.003152261517243071,-4.2266490087485424e-5,6.918851693440988e-8,0.0031525610670786637,-4.229461685062819e-5,6.922644943555905e-8,0.0031528414655990046,-4.22573706176436e-5,6.9162068457332e-8,0.003153081775375267,-4.216923255662013e-5,6.901853417953314e-8,0.0031532678798198805,-4.205077312180638e-5,6.882835975902144e-8,0.0031533932546355388,-4.192616457967239e-5,6.862959482793142e-8,0.0031534595708972847,-4.1820803001536924e-5,6.84621653927876e-8,0.0031534770784778826,-4.175861379115542e-5,6.836364650161207e-8,0.0031534643622982412,-4.17588032667655e-5,6.836409543908077e-8,0.0031534468701465957,-4.183228856251606e-5,6.848035579602831e-8,0.003153453782052926,-4.197854007215975e-5,6.871105220452271e-8,0.003153513263736754,-4.218384148552481e-5,6.903390427614672e-8,0.0031536467429532566,-4.242196322172231e-5,6.940693592124387e-8,0.003153863430347162,-4.265783483101526e-5,6.977446531891138e-8,0.003154156585993926,-4.285397543340932e-5,7.007742427316526e-8,0.00315450279718283,-4.2978622186424466e-5,7.026625449926472e-8,0.0031548650041122103,-4.301400854080456e-5,7.031388230440871e-8,0.00315519943918034,-4.296289169347691e-5,7.022577473855363e-8,0.003155465859320983,-4.285109888117147e-5,7.00436294628589e-8,0.0031556391659936065,-4.272394847220358e-5,6.983943122484468e-8,0.0031557188612724523,-4.263555517927237e-5,6.969842457165365e-8,0.0031557317728420436,-4.263280101975123e-5,6.969387032889604e-8,0.0031557249027450757,-4.2739520543408744e-5,6.98623192302485e-8,0.0031557498994496218,-4.294833096833603e-5,7.019104128047928e-8,0.00315584589866597,-4.322452786249621e-5,7.062447804376743e-8,0.0031560287243041687,-4.3519737897634517e-5,7.108598411323216e-8,0.003156290210848438,-4.378791545601902e-5,7.150311106554863e-8,0.0031566054069980037,-4.3996660675542415e-5,7.182534984786604e-8,0.0031569423808284628,-4.4131253208340974e-5,7.203026754938302e-8,0.003157270337523358,-4.4192994871844845e-5,7.212064457656072e-8,0.003157564470837877,-4.419496903596624e-5,7.211761487890475e-8,0.003157808015852627,-4.415761251223253e-5,7.205364259861087e-8,0.0031579926823708912,-4.4105138784809375e-5,7.196695049477917e-8,0.0031581184957774153,-4.406285452731199e-5,7.189738913692536e-8,0.003158193599416625,-4.4054911516432865e-5,7.188294750699247e-8,0.003158234031798483,-4.4101897275740684e-5,7.195593087373301e-8,0.003158263018098467,-4.421788006294162e-5,7.213822712040806e-8,0.003158309054218505,-4.440704337455989e-5,7.243594276621938e-8,0.0031584021289597524,-4.466069514352587e-5,7.283470938809992e-8,0.0031585679463628875,-4.495603322513259e-5,7.329786169090022e-8,0.003158821045759386,-4.5258255933040026e-5,7.37699600181512e-8,0.003159158924190263,-4.5526890236963015e-5,7.418696615489833e-8,0.0031595597943583466,-4.572549126524957e-5,7.44916678688917e-8,0.003159985788919604,-4.5832004494916494e-5,7.465002833083531e-8,0.003160391467505701,-4.5846244908167024e-5,7.466284408960723e-8,0.003160735390904223,-4.5791651761595475e-5,7.456824370500927e-8,0.003160991329864051,-4.5710340506587154e-5,7.443354724124745e-8,0.0031611557652805296,-4.56525958579643e-5,7.433840211999739e-8,0.0031612493653574466,-4.566356507695597e-5,7.43536688058528e-8,0.0031613116320375638,-4.577082683019708e-5,7.452191859422641e-8,0.00316138983687732,-4.5976704493927694e-5,7.484561016922063e-8,0.0031615255351170207,-4.625816721714404e-5,7.52873081576349e-8,0.00316174330606514,-4.6574539940815696e-5,7.578215147025375e-8,0.0031620456464795553,-4.687999059605023e-5,7.625769376845123e-8,0.003162415165519021,-4.713588347181678e-5,7.665335200741533e-8,0.003162822036835446,-4.731880660958561e-5,7.693289460631574e-8,0.0031632329785881486,-4.7422738256966696e-5,7.708762391075058e-8,0.0031636185498555743,-4.7456548574135615e-5,7.713222429686289e-8,0.003163957394531511,-4.743930170684533e-5,7.709723112409955e-8,0.003164237749092535,-4.7395460395258866e-5,7.702145770310557e-8,0.0031644572629982944,-4.735103026805132e-5,7.694598016390119e-8,0.0031646221440750945,-4.733077694987257e-5,7.690981863864776e-8,0.003164746262745098,-4.735610332844896e-5,7.694660644621445e-8,0.003164850315648308,-4.744295341822404e-5,7.708123668442743e-8,0.003164960615211108,-4.7599282087552986e-5,7.732580598792541e-8,0.00316510674443353,-4.7822150507262595e-5,7.767502077308712e-8,0.0031653173075884386,-4.809522158373371e-5,7.810233831505504e-8,0.003165613500816317,-4.8388234367153477e-5,7.855932068502407e-8,0.003166001527547761,-4.8660505245747866e-5,7.898136490858256e-8,0.0031664667240323473,-4.886967395690606e-5,7.930165483686465e-8,0.0031669732473650035,-4.898427913808119e-5,7.947106008168446e-8,0.0031674717018881997,-4.899555012818512e-5,7.94766938590658e-8,0.0031679131839261526,-4.892263568963575e-5,7.934999749978144e-8,0.0031682643359964833,-4.8808002238974886e-5,7.91591853553536e-8,0.0031685171259444567,-4.8704610129976645e-5,7.898863798646383e-8,0.003168689888016564,-4.866027347872532e-5,7.891391738685978e-8,0.0031688203554882553,-4.870497925930795e-5,7.898168134647224e-8,0.0031689541483683986,-4.884458925824059e-5,7.919995944645049e-8,0.003169132666912061,-4.90615415154104e-5,7.953967154409288e-8,0.0031693835370994743,-4.932123743816433e-5,7.994513150365482e-8,0.0031697155633991425,-4.958174182690445e-5,8.034963065946353e-8,0.0031701188096189092,-4.9803993111668386e-5,8.069160780662406e-8,0.0031705690690595756,-4.995993501816825e-5,8.092735112553882e-8,0.0031710349046023332,-5.003685841512912e-5,8.103761860361142e-8,0.003171484997353245,-5.003758483585365e-5,8.10276899103105e-8,0.0031718939250299756,-4.997743721292307e-5,8.092241368604767e-8,0.0031722454763997874,-4.98796363572316e-5,8.075886678430627e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json new file mode 100644 index 0000000..841a3de --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":21000,"numberOfSamples":1000,"samples":[0.0031725336341924394,-4.9770637985046546e-5,8.057900832626396e-8,0.0031727619720193665,-4.967631255249218e-5,8.042370582661394e-8,0.0031729423213677447,-4.961918610821703e-5,8.032842301827844e-8,0.003173093301004051,-4.9616439750269165e-5,8.032005503717977e-8,0.0031732388512125246,-4.9678142521825614e-5,8.04140915834666e-8,0.003173406461172115,-4.980531114277095e-5,8.061152056197695e-8,0.003173624434517486,-4.998780080363393e-5,8.089554409980637e-8,0.0031739174410596086,-5.02027153676187e-5,8.122921958837977e-8,0.0031743000569504428,-5.0414905317985565e-5,8.155645946622467e-8,0.0031747693572844707,-5.058170552271261e-5,8.1809696462639e-8,0.003175299754099858,-5.066328166614758e-5,8.192630588543693e-8,0.003175844728509721,-5.06368615606572e-5,8.187106223913913e-8,0.003176348378152092,-5.0508762136083794e-5,8.16550486069026e-8,0.0031767639923363524,-5.0316402748498936e-5,8.133866443459827e-8,0.0031770709661550177,-5.011689791600365e-5,8.101329428919594e-8,0.0031772811274633317,-4.9967147620633346e-5,8.076944687326912e-8,0.003177432030673561,-4.9905479367471625e-5,8.066745206192551e-8,0.003177572270523811,-4.994259580574966e-5,8.072317955227706e-8,0.003177746439699948,-5.0063033684474547e-5,8.091070950808379e-8,0.0031779848344744835,-5.0233470557248106e-5,8.117598151931799e-8,0.0031782992076989803,-5.0413262606724425e-5,8.145387798184555e-8,0.003178683508504494,-5.056397454491497e-5,8.168346678500409e-8,0.0031791178624765563,-5.0656360805938936e-5,8.181895509495128e-8,0.003179574229733301,-5.067436252240991e-5,8.183576329438713e-8,0.003180022490647086,-5.0616168724939576e-5,8.173192449420742e-8,0.0031804358927458322,-5.049270511433461e-5,8.152548156884965e-8,0.0031807950553075313,-5.0324297904340744e-5,8.124910490024964e-8,0.0031810901697997096,-5.013646650496189e-5,8.094342997127281e-8,0.003181321456190578,-4.995570801310683e-5,8.065043893174666e-8,0.0031814982527144423,-4.9805917795511555e-5,8.040785329190629e-8,0.0031816373210504898,-4.970574993088201e-5,8.024497887522197e-8,0.0031817608717426495,-4.9666782981278536e-5,8.017978161620004e-8,0.0031818944706078238,-4.969213348437762e-5,8.021665586604609e-8,0.003182064656150664,-4.977526990474911e-5,8.034455083019423e-8,0.0031822958582123618,-4.9899054210053294e-5,8.053555151866265e-8,0.0031826060765792474,-5.00355420814562e-5,8.074475516704612e-8,0.0031830011463665404,-5.014786026254351e-5,8.091345990457809e-8,0.0031834686693217383,-5.0195995982255704e-5,8.097846711663703e-8,0.0031839746468371897,-5.01475748419181e-5,8.088913626890179e-8,0.0031844673261262986,-4.999173257679851e-5,8.062922765445895e-8,0.003184891172592454,-4.974957666882377e-5,8.023331134917238e-8,0.0031852075073160895,-4.9472597723993216e-5,7.978406694492346e-8,0.0031854111053174357,-4.922574084934537e-5,7.938518959159813e-8,0.0031855320833315435,-4.9062718900561163e-5,7.912193983519057e-8,0.003185621952271365,-4.9007423813544054e-5,7.903149987919705e-8,0.003185733140730741,-4.905026352546958e-5,7.909733195325303e-8,0.003185903073154297,-4.915750209942922e-5,7.926446313102022e-8,0.0031861477150601954,-4.9285511618747645e-5,7.946261622724468e-8,0.0031864630412842053,-4.9393086955828754e-5,7.962606325736776e-8,0.0031868305582437354,-4.944910682330027e-5,7.970578335261417e-8,0.0031872237417380285,-4.9435815064372105e-5,7.967442526435043e-8,0.003187613799646374,-4.934910556784959e-5,7.952642648280632e-8,0.0031879743406409483,-4.919701658863508e-5,7.927535204629794e-8,0.0031882849181979036,-4.899707191619981e-5,7.894954072044581e-8,0.0031885333705692622,-4.8772886247731465e-5,7.85867133852273e-8,0.0031887169235430774,-4.8550472591157195e-5,7.82281831475899e-8,0.0031888421191353347,-4.8354611885566905e-5,7.791317453714298e-8,0.0031889236591736768,-4.820561826479776e-5,7.767373204135999e-8,0.003188982392912168,-4.811685191685343e-5,7.753076281390647e-8,0.0031890428229633568,-4.80931088914721e-5,7.749144001256398e-8,0.003189130371339149,-4.8129751866914776e-5,7.754779717892457e-8,0.0031892684093893045,-4.821248076042052e-5,7.767640704932689e-8,0.003189474936144377,-4.8317827589117846e-5,7.78393091488724e-8,0.003189758740824415,-4.841472688601514e-5,7.798671830001753e-8,0.0031901151496382964,-4.846801130205281e-5,7.806277470675716e-8,0.0031905224205677797,-4.844497532884705e-5,7.801604196463123e-8,0.003190941284990858,-4.8325353983456495e-5,7.781525298490396e-8,0.0031913210506145494,-4.811258839800113e-5,7.746697340533311e-8,0.0031916141519961177,-4.784055752540146e-5,7.702604990677442e-8,0.003191795418319783,-4.7568255887754585e-5,7.658695371946121e-8,0.0031918755740832448,-4.73600221174305e-5,7.625217949764229e-8,0.003191898603829455,-4.725988960279658e-5,7.609132297246147e-8,0.0031919229650166662,-4.7275184045738147e-5,7.611500607230232e-8,0.003191998333085281,-4.737827479416436e-5,7.62779363395227e-8,0.0031921508881996145,-4.752216804202383e-5,7.65041794434679e-8,0.003192381393929433,-4.765854984268982e-5,7.671628736820805e-8,0.0031926718219546014,-4.7750056416319196e-5,7.685497758163076e-8,0.003192994371773742,-4.7775167613736925e-5,7.688676322707986e-8,0.0031933191121518447,-4.7727892633397725e-5,7.680310882032987e-8,0.0031936191057208192,-4.761498877639121e-5,7.661565929511285e-8,0.0031938734231599622,-4.74525826505499e-5,7.635065824624502e-8,0.0031940688710230926,-4.7262880918771545e-5,7.60436847923047e-8,0.0031942008964133926,-4.707097737875328e-5,7.573466367930087e-8,0.0031942737606263116,-4.6901719035824056e-5,7.546299629687368e-8,0.003194299972841271,-4.6776661718682426e-5,7.526278957837741e-8,0.003194298887206334,-4.6711226468842323e-5,7.51583342891208e-8,0.003194294386829285,-4.671240074914931e-5,7.516039741374076e-8,0.0031943118407074603,-4.6777394668392805e-5,7.526403312546946e-8,0.0031943746893159835,-4.6893437644436546e-5,7.544826377873212e-8,0.0031945009495270385,-4.7038759907479775e-5,7.567773903852656e-8,0.0031946998830175675,-4.7184820903478814e-5,7.590646855791671e-8,0.0031949691011137634,-4.729986237129749e-5,7.608369607755573e-8,0.0031952925157211496,-4.735397448743149e-5,7.616211706606225e-8,0.003195640046002511,-4.7325873413935426e-5,7.610866131565764e-8,0.0031959707011487326,-4.721084275969199e-5,7.591694218179518e-8,0.0031962407678702612,-4.7027544120006907e-5,7.561778712416466e-8,0.0031964172220154555,-4.68193172139658e-5,7.528100427078354e-8,0.003196492459990767,-4.664522204584982e-5,7.500092425591764e-8,0.003196492024360513,-4.6560407478603466e-5,7.486507180241458e-8,0.0031964677331033607,-4.6593856889802264e-5,7.491877034751068e-8,0.003196477403032644,-4.673659702635629e-5,7.514654134177191e-8,0.0031965625176653793,-4.694773588519694e-5,7.548204705047288e-8,0.0031967362693748544,-4.717322873987367e-5,7.583837429474331e-8,0.003196985533609338,-4.73651776342118e-5,7.613905990916508e-8,0.0031972812138878572,-4.74929888958597e-5,7.633588427653374e-8,0.003197589462630078,-4.7545490933105095e-5,7.64119965822908e-8,0.0031978796496195555,-4.752757942989125e-5,7.637620017022061e-8,0.00319812848863574,-4.745512493931714e-5,7.625453549820702e-8,0.00319832144886984,-4.73503257355979e-5,7.608275219379998e-8,0.003198452856742482,-4.723812082730018e-5,7.590064580016247e-8,0.0031985255501511783,-4.7143356527051194e-5,7.57476813144896e-8,0.0031985502819583764,-4.708825806567633e-5,7.565908112945316e-8,0.003198544736531598,-4.708995351933302e-5,7.566191375034777e-8,0.0031985318797554075,-4.7158036203798245e-5,7.577116598009077e-8,0.0031985373474858482,-4.729251335254058e-5,7.598640463765804e-8,0.003198585869566576,-4.7482775567525455e-5,7.629010685976644e-8,0.003198697155597323,-4.77081476564717e-5,7.664860219081877e-8,0.0031988819238857836,-4.794029858008897e-5,7.701607636820799e-8,0.003199138852327985,-4.8147471043280815e-5,7.734153154992998e-8,0.003199453210956632,-4.830010600773658e-5,7.757794512375888e-8,0.003199797758983186,-4.8377126251611665e-5,7.769236057072432e-8,0.0032001363178023106,-4.8371976704389703e-5,7.767540881795748e-8,0.0032004303140051693,-4.829716076321788e-5,7.754825940028813e-8,0.0032006480922657813,-4.818534649742223e-5,7.736402060215561e-8,0.0032007754503471137,-4.8084736666072045e-5,7.720004750070717e-8,0.0032008237523528764,-4.804734673697885e-5,7.713910918442968e-8,0.0032008304786310298,-4.811209016681051e-5,7.724247975155619e-8,0.0032008488052868407,-4.828932206014769e-5,7.75255161602495e-8,0.0032009288771208118,-4.8555592301733185e-5,7.794960329169746e-8,0.0032010998408043487,-4.886272668875077e-5,7.843695977208304e-8,0.003201361960637265,-4.915635461273817e-5,7.89004476629134e-8,0.0032016912406135044,-4.939361188750261e-5,7.927192014721211e-8,0.0032020513707647475,-4.955240233850549e-5,7.951689650027676e-8,0.003202405716929175,-4.963141986809062e-5,7.963431614369855e-8,0.003202725094131901,-4.964474472975755e-5,7.96475824883057e-8,0.0032029909049170156,-4.961523348656123e-5,7.959378125967193e-8,0.0032031952157390927,-4.9569099471490336e-5,7.951497736532009e-8,0.003203339535741044,-4.9532218017991734e-5,7.945241230521701e-8,0.003203433394698867,-4.9527674213515084e-5,7.944273135170713e-8,0.003203493051170196,-4.9573859322178696e-5,7.951503476725994e-8,0.0032035401504446515,-4.968261143955701e-5,7.968790885396807e-8,0.003203599881864006,-4.9857248372708116e-5,7.996622623173358e-8,0.0032036981474841027,-5.009083623491609e-5,8.033833401588e-8,0.003203857560932273,-5.036549668524096e-5,8.077497791863144e-8,0.003204092697562571,-5.0653692877754714e-5,8.123148677107812e-8,0.003204405679190628,-5.092213317310819e-5,8.165420910353239e-8,0.0032047836194003913,-5.1138171334250516e-5,8.199093925766638e-8,0.0032051993388942314,-5.1277508026645685e-5,8.220333981594443e-8,0.0032056159214573134,-5.1331152612609345e-5,8.227803147217174e-8,0.003205994476325643,-5.130950962968257e-5,8.223291039616594e-8,0.0032063034747539243,-5.124205747668012e-5,8.211628608958799e-8,0.0032065274675029567,-5.117202959915313e-5,8.199800522314307e-8,0.0032066727907678195,-5.114661833837934e-5,8.195353656090792e-8,0.003206768020942503,-5.120449980278048e-5,8.204400434520673e-8,0.003206857735831905,-5.1363916576045276e-5,8.229736031489842e-8,0.0032069901253816147,-5.161569359479557e-5,8.269759795845019e-8,0.0032072020803685336,-5.192501441612641e-5,8.318797642795423e-8,0.0032075077397297554,-5.2242393867866604e-5,8.368882847285539e-8,0.0032078955532431,-5.251946367429561e-5,8.412289258504691e-8,0.0032083345384939406,-5.272262269658563e-5,8.443706503733802e-8,0.0032087857334492185,-5.2839458337762004e-5,8.461246000974382e-8,0.0032092132683576424,-5.287735806351859e-5,8.466190722367029e-8,0.003209591378752329,-5.285732676741347e-5,8.461980304623928e-8,0.0032099067777057117,-5.28068081968459e-5,8.45304822826286e-8,0.0032101578456377655,-5.275393921740916e-5,8.443903221733049e-8,0.0032103524731652163,-5.272386017376191e-5,8.438550073902889e-8,0.003210505786562472,-5.273660287213019e-5,8.440164096217491e-8,0.0032106382225371155,-5.280577247081059e-5,8.450886182259405e-8,0.0032107738321281018,-5.293736316606222e-5,8.471631689347386e-8,0.0032109383060951215,-5.312841217033488e-5,8.501870672494748e-8,0.0032111560978738906,-5.3365752533195204e-5,8.53942849508674e-8,0.0032114462795934918,-5.362571089155793e-5,8.580446840164302e-8,0.003211817437324192,-5.3875979778961625e-5,8.619700739786424e-8,0.003212262941595191,-5.408075100149098e-5,8.651439387397291e-8,0.0032127589082548043,-5.42090965214644e-5,8.670741201761251e-8,0.003213267160170133,-5.4244595572723914e-5,8.675057308886833e-8,0.0032137438024166646,-5.419248668805494e-5,8.665344939450431e-8,0.003214151231767454,-5.4080711291759844e-5,8.646208359285265e-8,0.0032144693035585834,-5.395352361443707e-5,8.624839037585663e-8,0.003214701461565474,-5.385958237500533e-5,8.609072790016972e-8,0.003214873783886847,-5.383864063516811e-5,8.605238679805011e-8,0.0032150276171485034,-5.391105610832501e-5,8.616487457733809e-8,0.003215208326315366,-5.4072889410851724e-5,8.642041535988369e-8,0.0032154533705997484,-5.429755486548332e-5,8.677506471248515e-8,0.0032157828754069747,-5.4543390211428154e-5,8.716123185097693e-8,0.0032161952720170784,-5.47649828140714e-5,8.750601063943785e-8,0.0032166691643119804,-5.492483570390711e-5,8.7749822276115e-8,0.003217170484883344,-5.500177601999277e-5,8.785966932376333e-8,0.0032176621369899984,-5.499386164298536e-5,8.783350388091249e-8,0.0032181127441866936,-5.491583634520034e-5,8.76958803060696e-8,0.003218502126948113,-5.479314994168618e-5,8.748819344576886e-8,0.0032188229483265337,-5.465521433334049e-5,8.72578166749344e-8,0.0032190794757014783,-5.452988429357098e-5,8.704931644272088e-8,0.0032192849457666393,-5.443991014971355e-5,8.689888287838887e-8,0.003219458734952503,-5.440110974291796e-5,8.683149639470852e-8,0.003219623918717538,-5.442154904813298e-5,8.685964506488469e-8,0.0032198052118412182,-5.45010330062948e-5,8.698248405259667e-8,0.0032200268668433098,-5.463053766414709e-5,8.718490554543236e-8,0.0032203099278025797,-5.479171920972871e-5,8.743680309860852e-8,0.0032206683696555803,-5.4957218224956276e-5,8.769370344416006e-8,0.003221104252445989,-5.509302127948437e-5,8.790074530833945e-8,0.0032216031987040658,-5.516423932315975e-5,8.800209652952139e-8,0.003222132914621037,-5.514457142603367e-5,8.795617458979574e-8,0.003222647901010924,-5.502711200558859e-5,8.775290593353369e-8,0.0032231013851103294,-5.483131338436564e-5,8.74247239172623e-8,0.003223460966712298,-5.4600702849415643e-5,8.704264763661174e-8,0.003223720696988658,-5.43901749473945e-5,8.66955543476372e-8,0.0032239032022557705,-5.4248004296358326e-5,8.646099319840247e-8,0.003224051050262102,-5.4200944786757004e-5,8.638114273675721e-8,0.003224212268778945,-5.424827912428962e-5,8.645345453958669e-8,0.0032244265358801734,-5.4365234327404105e-5,8.663660081008881e-8,0.003224716276502034,-5.451231450454134e-5,8.686597920410975e-8,0.003225083737911467,-5.4646403659949004e-5,8.707189019189658e-8,0.0032255131188312245,-5.473059972318432e-5,8.719538813836393e-8,0.0032259761006378034,-5.4741087113638165e-5,8.719911679190398e-8,0.0032264390598020325,-5.467034723233956e-5,8.707212789604444e-8,0.003226870334335864,-5.452668660564738e-5,8.682879510984012e-8,0.0032272460710804887,-5.4330699940323715e-5,8.65029138253738e-8,0.0032275536298945894,-5.4109915442819836e-5,8.613902532997006e-8,0.003227792304669776,-5.389313593906661e-5,8.5783374691673e-8,0.0032279718677233277,-5.370570458175747e-5,8.547642058179856e-8,0.003228109845550558,-5.356634066004432e-5,8.524786544988952e-8,0.003228228456413095,-5.348557339633553e-5,8.511420042723426e-8,0.0032283518197443535,-5.346531342893715e-5,8.507801310989298e-8,0.0032285035568127823,-5.349896832429377e-5,8.512814037196994e-8,0.003228704536722173,-5.357174984312455e-5,8.524016481482288e-8,0.0032289703539402797,-5.366119984972382e-5,8.537735462686527e-8,0.00322930813206437,-5.373842092470895e-5,8.549282323459017e-8,0.003229712689921856,-5.377103839587337e-5,8.553448506801853e-8,0.0032301631836865975,-5.3729107718665944e-5,8.545465152637074e-8,0.0032306227277087924,-5.359428799950994e-5,8.522472059019744e-8,0.0032310441986026,-5.337012969281068e-5,8.48515280839209e-8,0.0032313836582013745,-5.30879790841398e-5,8.438660592029636e-8,0.0032316176061930268,-5.280197806460897e-5,8.391790250084734e-8,0.0032317548261706127,-5.2571609399665335e-5,8.354146004605948e-8,0.0032318343808087915,-5.243934120871027e-5,8.332524114371036e-8,0.00323190997001867,-5.24157284474321e-5,8.328513968311465e-8,0.003232029903870015,-5.247922773889295e-5,8.33849749888785e-8,0.0032322230037252673,-5.2587959715898925e-5,8.355594128527012e-8,0.0032324945300250224,-5.269508974157829e-5,8.372185756843382e-8,0.0032328299476484103,-5.2761097382812485e-5,8.381914925073835e-8,0.0032332022647684135,-5.2760565068347416e-5,8.380767128683809e-8,0.0032335796804347913,-5.268412304439345e-5,8.367349551296979e-8,0.003233931955256522,-5.2537170491451925e-5,8.342645104170425e-8,0.00323423510297691,-5.2336755010051395e-5,8.309480474079313e-8,0.003234474406802793,-5.210743061617814e-5,8.271847665355266e-8,0.0032346457437325534,-5.187668488346703e-5,8.234172294838152e-8,0.003234755280902423,-5.167055575138879e-5,8.200621219761825e-8,0.003234817807050895,-5.150997501251897e-5,8.174527616602243e-8,0.00323485410132211,-5.140821394599531e-5,8.157988013641992e-8,0.0032348878601373273,-5.1369622605597356e-5,8.15166024002056e-8,0.003234942697918216,-5.138953284328997e-5,8.154743911983669e-8,0.00323503947037617,-5.1454958354580704e-5,8.16508993774942e-8,0.0032351938886941546,-5.154582187779148e-5,8.179401797604287e-8,0.0032354142832091816,-5.16366609641141e-5,8.193524012891515e-8,0.003235699333554656,-5.1699018157927345e-5,8.202847891428973e-8,0.0032360358332845078,-5.170513116825102e-5,8.202923924758582e-8,0.003236397395298634,-5.163367599192616e-5,8.190391001440081e-8,0.0032367460274376706,-5.147751296830587e-5,8.164208997353886e-8,0.003237038911014802,-5.125146075858404e-5,8.126881868503913e-8,0.0032372413519731985,-5.099546813545693e-5,8.084938120768122e-8,0.0032373424767896393,-5.076735769152771e-5,8.04773994266105e-8,0.003237364737593232,-5.0623575968753e-5,8.024369261604461e-8,0.0032373583817348877,-5.0595930934664296e-5,8.01987556722749e-8,0.0032373814263608053,-5.067835383782129e-5,8.033154293976049e-8,0.0032374767927001143,-5.0831888417986464e-5,8.05778502518239e-8,0.0032376595358681605,-5.100299476696643e-5,8.08503013355666e-8,0.0032379179830066707,-5.1142929781694154e-5,8.106998345596535e-8,0.0032382234578475634,-5.121949714913483e-5,8.118548183125027e-8,0.0032385413765336594,-5.1220034229706235e-5,8.117745244402647e-8,0.0032388396301233986,-5.1148784000511076e-5,8.105395968506553e-8,0.00323909343633175,-5.1022080757357263e-5,8.084232217504016e-8,0.003239287476598087,-5.086344596635564e-5,8.058099601387515e-8,0.003239416418574005,-5.06993062299847e-5,8.031267394281034e-8,0.0032394844711164405,-5.055531403368913e-5,8.007849327535253e-8,0.0032395041778899027,-5.0453203864372276e-5,7.991313554603084e-8,0.003239494528968082,-5.0408228290502986e-5,7.98408045445796e-8,0.0032394784475627734,-5.0427301336513986e-5,7.987225828658261e-8,0.003239479791896909,-5.050810067219918e-5,8.000332058699083e-8,0.0032395202194974377,-5.063931236648878e-5,8.021522493846629e-8,0.003239616293252338,-5.080193546123921e-5,8.047671952390412e-8,0.003239777049036872,-5.097147176821398e-5,8.074769163503124e-8,0.003240002171167665,-5.112088531384368e-5,8.098412232278307e-8,0.0032402808961741075,-5.122423243494423e-5,8.114415044682696e-8,0.0032405918090109447,-5.126100829262938e-5,8.119521335082708e-8,0.003240904131438615,-5.122133435508816e-5,8.112236888320618e-8,0.003241181684719136,-5.111146117220087e-5,8.093692711688671e-8,0.003241390622446391,-5.095766931217798e-5,8.068237971757372e-8,0.0032415106650658305,-5.080520775946731e-5,8.04323546602781e-8,0.003241546514068598,-5.070868740467566e-5,8.027494782684523e-8,0.0032415324844812794,-5.071373081832885e-5,8.028313812372978e-8,0.003241523709398545,-5.083705921425271e-5,8.048281634683229e-8,0.0032415751240446157,-5.1057319994444045e-5,8.083823631077988e-8,0.003241719537245258,-5.132391935969942e-5,8.126660197144499e-8,0.0032419576140943988,-5.157842278878715e-5,8.167296421774885e-8,0.0032422632301883753,-5.177516910115313e-5,8.198373070848606e-8,0.0032425973491017465,-5.189151237656024e-5,8.216316480911329e-8,0.003242921385633165,-5.192728220314501e-5,8.221219939811576e-8,0.003243205429064354,-5.1898436692860174e-5,8.215775773060924e-8,0.0032434313058024543,-5.182970678799692e-5,8.204054311489319e-8,0.0032435923938506023,-5.1748673330064326e-5,8.190536290404036e-8,0.0032436920809447035,-5.1681708633171465e-5,8.179466859600291e-8,0.0032437419250657485,-5.165123951677518e-5,8.17443236041018e-8,0.0032437597611700603,-5.167373948957442e-5,8.178051974505204e-8,0.0032437676397874047,-5.1758154968282606e-5,8.191729901686929e-8,0.003243789408658554,-5.190473825027876e-5,8.215464440259327e-8,0.0032438478099100776,-5.2104555505873134e-5,8.247762756783664e-8,0.0032439612563935362,-5.234009583257239e-5,8.28573715553115e-8,0.0032441407595725984,-5.258721229750601e-5,8.325425050664329e-8,0.0032443875424479525,-5.281834024054875e-5,8.36232428780749e-8,0.0032446918276209393,-5.300675228469284e-5,8.392100559929466e-8,0.0032450332255609038,-5.3131371114476176e-5,8.411381289746435e-8,0.00324538295404514,-5.318148371486626e-5,8.418520437848297e-8,0.003245707983573782,-5.316071079859441e-5,8.414223757206918e-8,0.0032459772192329835,-5.3089364431137183e-5,8.401896535485175e-8,0.0032461694781570896,-5.300370532228837e-5,8.387484551908885e-8,0.003246281847351533,-5.2950284714670026e-5,8.37853066862844e-8,0.0032463352544695014,-5.297443793121066e-5,8.382308719834454e-8,0.0032463728424833803,-5.310479309421307e-5,8.403337508404443e-8,0.003246448216996769,-5.333992759564566e-5,8.441256609303461e-8,0.0032466062921121183,-5.364552457477591e-5,8.49040114435253e-8,0.0032468659901151594,-5.396605828032138e-5,8.541718992475005e-8,0.003247214553528512,-5.424562065011762e-5,8.586156956307863e-8,0.003247615679936334,-5.444642162568678e-5,8.617657458590432e-8,0.003248024912597425,-5.455655514944839e-5,8.634399975468773e-8,0.003248403432332568,-5.458687626580262e-5,8.638262859372707e-8,0.0032487255353343303,-5.4562352771310106e-5,8.633386467620277e-8,0.00324898008935198,-5.451326661190067e-5,8.624724859115626e-8,0.0032491685238771285,-5.4468896133598934e-5,8.617020704301661e-8,0.0032493017385686698,-5.44538837415368e-5,8.614231992982142e-8,0.0032493972235823195,-5.448639212370825e-5,8.619253072529561e-8,0.0032494766715691,-5.4577106999117414e-5,8.633766110669544e-8,0.003249563821635595,-5.4728537878472483e-5,8.658130339795376e-8,0.0032496821379050258,-5.4934496846960336e-5,8.691293350608795e-8,0.0032498520196944476,-5.5180047124981716e-5,8.730779131766455e-8,0.0032500875683692987,-5.544249647615775e-5,8.772852392629017e-8,0.0032503934051933206,-5.569395062737085e-5,8.812944569042736e-8,0.0032507623946056432,-5.5905572624570456e-5,8.846361811302392e-8,0.0032511752416808635,-5.60531534073218e-5,8.869203900002466e-8,0.0032516027189509527,-5.6122949655416366e-5,8.879316740083876e-8,0.003252010653866079,-5.6116271961945236e-5,8.87702629117698e-8,0.0032523669850277413,-5.605136928982403e-5,8.865417136694602e-8,0.0032526495630223616,-5.596163996267052e-5,8.850004846746351e-8,0.003252852996146235,-5.588978132512746e-5,8.837752315420322e-8,0.0032529925562878982,-5.58782471815996e-5,8.83550511189378e-8,0.003253103082055259,-5.595758026448335e-5,8.848108953757554e-8,0.0032532314776745693,-5.613576384150119e-5,8.876716640678854e-8,0.0032534234568621025,-5.6393001850667115e-5,8.917985280515563e-8,0.0032537084871765787,-5.668575826548498e-5,8.964767779069584e-8,0.0032540894242032077,-5.696017640428366e-5,9.008307761306017e-8,0.00325454214619616,-5.716962075359378e-5,9.041084937999461e-8,0.0032550252674333844,-5.728830620990315e-5,9.059011621990187e-8,0.003255494511827089,-5.731556283163272e-5,9.06209904156305e-8,0.003255914883576044,-5.7271048375594106e-5,9.0536487245569e-8,0.003256266746644497,-5.71854418674298e-5,9.03871423788393e-8,0.003256546050101389,-5.709145577327869e-5,9.022629331978918e-8,0.003256761198809244,-5.701770488175832e-5,9.010018411835402e-8,0.0032569290319573213,-5.6985589687069876e-5,9.004308407198988e-8,0.0032570712782715805,-5.700820517414628e-5,9.007569729439265e-8,0.003257211829634789,-5.709019855395602e-5,9.02050273070369e-8,0.003257374555642879,-5.722785472994945e-5,9.042451477474267e-8,0.0032575811280771455,-5.740918789972536e-5,9.07141464433097e-8,0.0032578484112563417,-5.761434937787547e-5,9.104111671626653e-8,0.003258185352705804,-5.781702102123823e-5,9.136217618930464e-8,0.0032585898547709312,-5.7987501554828986e-5,9.162880083070914e-8,0.003259046711760422,-5.8097856157750106e-5,9.179571951463989e-8,0.0032595281106661137,-5.812865707175766e-5,9.183195308320635e-8,0.003259997899742414,-5.807559874358659e-5,9.173151942039728e-8,0.003260419534272522,-5.7953377600878414e-5,9.151954278320197e-8,0.003260765818064894,-5.7794560130481856e-5,9.125009531413922e-8,0.0032610273094332534,-5.7642803315349266e-5,9.099481763997835e-8,0.0032612163205118245,-5.754195090058938e-5,9.082492438170712e-8,0.0032613648222029144,-5.752416949150301e-5,9.07918667306029e-8,0.0032615165714595593,-5.7600716096652344e-5,9.09125486368035e-8,0.003261715522120589,-5.7758163232549566e-5,9.116362370356967e-8,0.003261993680028687,-5.796146329096944e-5,9.148694570509478e-8,0.0032623620293660872,-5.8163394938097374e-5,9.180524978805767e-8,0.003262807665272582,-5.8317766793719975e-5,9.20437012761951e-8,0.0032632983134054426,-5.839199548958222e-5,9.215020451540345e-8,0.0032637924706452283,-5.8374669624859956e-5,9.210741718701442e-8,0.0032642511156409566,-5.827592207902026e-5,9.193302480930112e-8,0.0032646467560847373,-5.8121634092867766e-5,9.167002565308534e-8,0.003264967464613854,-5.794476140729533e-5,9.137245205768258e-8,0.0032652161360441057,-5.777729029325265e-5,9.109227604970783e-8,0.0032654068966987506,-5.764485386744147e-5,9.087078295628466e-8,0.003265560763456718,-5.756421591411039e-5,9.073466938213295e-8,0.0032657018358711034,-5.754278131830879e-5,9.069539608026732e-8,0.0032658544101094944,-5.757911789189286e-5,9.075008999633211e-8,0.0032660408074434333,-5.766372839766714e-5,9.088277448331733e-8,0.003266279396647697,-5.777976701135738e-5,9.106550153542938e-8,0.003266582301739539,-5.790395532285883e-5,9.12598753635655e-8,0.0032669526451217174,-5.80083795326496e-5,9.142009964322477e-8,0.003267381767555401,-5.8063972041273024e-5,9.149881185930952e-8,0.0032678476163183977,-5.804619770493952e-5,9.145646309337639e-8,0.003268316164476314,-5.79424713012002e-5,9.12733988533491e-8,0.0032687475221006164,-5.7759070899220414e-5,9.096097972973574e-8,0.003269106529960257,-5.7523825509117984e-5,9.056570793575683e-8,0.0032693746058921917,-5.7281393394498796e-5,9.01612217244734e-8,0.0032695575700859222,-5.7081169177186004e-5,8.982829299441299e-8,0.003269685200835826,-5.696205583363011e-5,8.962983858648573e-8,0.003269802214385346,-5.69404396125155e-5,8.959138558936853e-8,0.0032699545344188102,-5.700604476264368e-5,8.969464615227079e-8,0.0032701763009091883,-5.7126338282034846e-5,8.988518777066455e-8,0.003270481677542585,-5.725676162404585e-5,9.008956185060092e-8,0.0032708629470038705,-5.735286992395743e-5,9.023531943545998e-8,0.00327129431081459,-5.73809369580062e-5,9.026823726629858e-8,0.003271739599354458,-5.7324683909892404e-5,9.0162995318363e-8,0.0032721614993477402,-5.7187059246788255e-5,8.992569167509696e-8,0.0032725298445275717,-5.698731841848309e-5,8.958873870059514e-8,0.0032728270521627735,-5.675482647236528e-5,8.920055536744774e-8,0.003273049851570274,-5.652171851946322e-5,8.881356947561132e-8,0.0032732076970815966,-5.6316492523811355e-5,8.847388481842329e-8,0.003273319145670565,-5.615979289425225e-5,8.821459453534936e-8,0.0032734076545255755,-5.6062581528121386e-5,8.80529729256984e-8,0.003273497839452653,-5.602614665502433e-5,8.799058220459504e-8,0.003273612612866018,-5.604313201827532e-5,8.801494830994981e-8,0.0032737710867281598,-5.609888691693807e-5,8.81017115844299e-8,0.0032739868282610452,-5.617282175496241e-5,8.821681580619211e-8,0.0032742660365082388,-5.6239927611709573e-5,8.831905491514963e-8,0.003274605453936708,-5.627300819139812e-5,8.836386764965425e-8,0.0032749903608651097,-5.624637481283029e-5,8.830953041101465e-8,0.0032753938061936853,-5.614154823740327e-5,8.812653176627841e-8,0.0032757789936782864,-5.595449360495289e-5,8.78092919463083e-8,0.003276106647287594,-5.5701960526054305e-5,8.738628367074491e-8,0.0032763471421135533,-5.5422576587764e-5,8.692152997987455e-8,0.003276493258995722,-5.516877259292599e-5,8.650115186701256e-8,0.0032765664014518425,-5.499014654352684e-5,8.6206007430559e-8,0.003276610999942624,-5.491529491512299e-5,8.608196484440229e-8,0.00327667876464851,-5.494164014254628e-5,8.612345199946136e-8,0.0032768108494707626,-5.5038149965003114e-5,8.627829358674474e-8,0.0032770262708863127,-5.5157998227194705e-5,8.646888984364038e-8,0.0032773198064892668,-5.525387498988542e-5,8.661760852501955e-8,0.003277667339223204,-5.528988528837087e-5,8.666631731922832e-8,0.0032780346135977243,-5.5247658906088445e-5,8.658614562003795e-8,0.0032783860663120725,-5.512713483912658e-5,8.637835326428021e-8,0.0032786918994025917,-5.494363190933129e-5,8.606912261480339e-8,0.0032789327276445193,-5.472280951801439e-5,8.570104945011115e-8,0.003279101674465376,-5.449476059083265e-5,8.532342409842275e-8,0.0032792040453030104,-5.4288301754132294e-5,8.498301212375031e-8,0.0032792550494914192,-5.4126402494692005e-5,8.471678473867611e-8,0.00327927635003745,-5.402331015253779e-5,8.454741469132955e-8,0.003279292261048445,-5.398344931011103e-5,8.448159405887646e-8,0.0032793262697919023,-5.4001841681931624e-5,8.451073771217038e-8,0.0032793983038223334,-5.406554644950239e-5,8.461328637466328e-8,0.003279522775013503,-5.4155543035676e-5,8.475773055077884e-8,0.0032797071337421773,-5.4248736184423704e-5,8.490590178054932e-8,0.0032799506498463736,-5.432014534373688e-5,8.501666483516674e-8,0.003280243299674806,-5.434560660615751e-5,8.505051210231342e-8,0.003280565004985942,-5.430549748269372e-5,8.497579494488648e-8,0.003280886168989561,-5.4189871664097075e-5,8.47771184438119e-8,0.003281171139090372,-5.4004474659509736e-5,8.446499011144445e-8,0.003281386101154559,-5.377533480404946e-5,8.408301336304262e-8,0.0032815110470657827,-5.354778435894943e-5,8.370597725390225e-8,0.003281551525320081,-5.3376005048922325e-5,8.342256462979238e-8,0.0032815423544261006,-5.3303997698127796e-5,8.330417977081286e-8,0.0032815375199139597,-5.334662167257096e-5,8.337402779899631e-8,0.003281589425999078,-5.3482477388724635e-5,8.359571772677401e-8,0.003281729077837722,-5.366347603158219e-5,8.388931201996357e-8,0.0032819577992785165,-5.383448660629819e-5,8.416390530143764e-8,0.003282252028816867,-5.3951461208844274e-5,8.434755805679241e-8,0.003282575064733863,-5.399087527054447e-5,8.440270284958065e-8,0.0032828888308288045,-5.395041499415586e-5,8.432692167156779e-8,0.0032831620823933123,-5.384442525035143e-5,8.414501783308623e-8,0.003283374577592845,-5.369758720472906e-5,8.389827797025655e-8,0.0032835182149421297,-5.3538900495709054e-5,8.363445972132653e-8,0.003283596317507677,-5.3396677990892325e-5,8.339967143688218e-8,0.0032836217594359217,-5.3294597136367996e-5,8.323212142857587e-8,0.0032836142689651616,-5.3248868881598726e-5,8.31577096068053e-8,0.0032835972456282487,-5.326663219322064e-5,8.318754756177193e-8,0.003283594445314077,-5.33455619881586e-5,8.331735797629278e-8,0.003283626858166137,-5.34746355750414e-5,8.35286872417797e-8,0.0032837101355881193,-5.363590835227975e-5,8.379175121758466e-8,0.0032838527983820075,-5.3806929427041975e-5,8.406937560267436e-8,0.003284055181100754,-5.396343946274494e-5,8.432148778286718e-8,0.0032843089773761463,-5.40822511951771e-5,8.450998775388706e-8,0.003284597358913076,-5.414438100313206e-5,8.460404446842303e-8,0.003284895834787221,-5.413857912979374e-5,8.458595257932233e-8,0.003285174445296768,-5.406532947278778e-5,8.445757818292492e-8,0.0032854023338345904,-5.3940697089698616e-5,8.424636958756322e-8,0.0032855554831677934,-5.379806390910282e-5,8.400782714837921e-8,0.003285626815766494,-5.3684562539693467e-5,8.38193737194727e-8,0.0032856347701112503,-5.3649414340871245e-5,8.376117760633833e-8,0.0032856235616832005,-5.3725485877918647e-5,8.38860837426238e-8,0.003285650142636974,-5.391249164401037e-5,8.419236027689752e-8,0.0032857616382241683,-5.4173556173630084e-5,8.461836300416228e-8,0.003285976011289329,-5.444965808100916e-5,8.50665090145353e-8,0.003286277545198635,-5.468347961861177e-5,8.544264341871019e-8,0.0032866275363075573,-5.483838580460321e-5,8.568728752895917e-8,0.0032869809330381304,-5.490461627338049e-5,8.578565026164803e-8,0.0032872996339806037,-5.489474335285152e-5,8.575977711296552e-8,0.003287559053510933,-5.48347345844862e-5,8.565341922089876e-8,0.0032877491677817746,-5.475543920672599e-5,8.551775502054806e-8,0.0032878725457978937,-5.4686451467669074e-5,8.540127833973602e-8,0.0032879413934742783,-5.465235422268597e-5,8.534381381044643e-8,0.003287974597188788,-5.4670536130827427e-5,8.53731992403231e-8,0.003287994886136215,-5.474993658443841e-5,8.550343585455102e-8,0.003288026004617243,-5.489052942074253e-5,8.573393033814724e-8,0.0032880898877680324,-5.508355309891816e-5,8.604985500404462e-8,0.003288203921857211,-5.5312587539400495e-5,8.642385409484243e-8,0.0032883785505384453,-5.5555608027442216E-05,8.681938148259401e-8,0.0032886156357365445,-5.578790705412445e-5,8.719554080619211e-8,0.0032889078436774757,-5.5985521987479445e-5,8.751283667062376e-8,0.003289239125545009,-5.612881998939157e-5,8.77392146012537e-8,0.003289586318797038,-5.620594849831879e-5,8.78558281449679e-8,0.0032899218910641607,-5.621585137160659e-5,8.786195042061433e-8,0.0032902179191576634,-5.617054021271309e-5,8.77784760736655e-8,0.0032904515278464005,-5.609599525829377e-5,8.764903319639631e-8,0.003290611690989794,-5.603034994237022e-5,8.753663675600585e-8,0.0032907060886177963,-5.601757230920074e-5,8.751312401969255e-8,0.0032907648315062244,-5.60957001758165e-5,8.763993271030684e-8,0.00329083651219213,-5.628175714456582e-5,8.794367269940098e-8,0.003290973902945432,-5.656023599277606e-5,8.839762192953688e-8,0.003291213321631433,-5.6884077700507716e-5,8.892363541663668e-8,0.003291558763057707,-5.7191191598862794e-5,8.941943124269481e-8,0.0032919809643103797,-5.742839856654776e-5,8.979798297636507e-8,0.0032924313677109907,-5.756902600419823e-5,9.001640079964623e-8,0.0032928611324823196,-5.7616237434723784e-5,9.008120657162066e-8,0.003293234884122227,-5.759476981903807e-5,9.003437623650073e-8,0.003293535602904595,-5.753893290328132e-5,8.993321103832823e-8,0.003293762927268325,-5.7482792094576774e-5,8.983397854989548e-8,0.003293928650397064,-5.745439610101603e-5,8.978246898705095e-8,0.003294052074754002,-5.7473344437337244e-5,8.981023130920463e-8,0.003294156313027807,-5.755021904012821e-5,8.993390698836747e-8,0.0032942654733313977,-5.768674160814335e-5,9.01556607176256e-8,0.0032944022662521263,-5.787621616364838e-5,9.046394738638393e-8,0.003294585697181951,-5.810428412374258e-5,9.083470767938509e-8,0.003294828730883638,-5.835025192829971e-5,9.123350329312376e-8,0.0032951361110117538,-5.858935210068161e-5,9.161924961334033e-8,0.003295502862145243,-5.879608733804884e-5,9.194981099819587e-8,0.0032959140922813155,-5.894836427269165e-5,9.218894166181916e-8,0.003296346501630117,-5.903178845858687e-5,9.2313465377073e-8,0.0032967716942378903,-5.904330752969372e-5,9.231927451156279e-8,0.003297161013652729,-5.8993325195830865e-5,9.222465017716898e-8,0.0032974912528637187,-5.8905595820280855e-5,9.206977518622295e-8,0.0032977504065195102,-5.881449638135142e-5,9.191186754025751e-8,0.003297942473857903,-5.875940209359208e-5,9.181563871498607e-8,0.0032980898714052753,-5.877616173854993e-5,9.183921908280787e-8,0.0032982314957932714,-5.88866346272826e-5,9.201718962789459e-8,0.0032984146833885644,-5.908904162486795e-5,9.23451566292984e-8,0.0032986812779857745,-5.935379884542151e-5,9.277334751463147e-8,0.003299051997951586,-5.962945134656554e-5,9.321663709787946e-8,0.003299516827886728,-5.985901363351853e-5,9.358146928311346e-8,0.0033000378122319263,-5.999998453310655e-5,9.379868554416737e-8,0.003300563468977945,-6.003775679601342e-5,9.384541959529023e-8,0.003301046759699778,-5.9986342425414024e-5,9.374604054768167e-8,0.0033014576765286454,-5.987863396959832e-5,9.355579500500295e-8,0.003301786809054379,-5.975339670750789e-5,9.33390980278829e-8,0.0033020419823445663,-5.964508164161518e-5,9.315264867329e-8,0.0033022421362587082,-5.9578548895871055e-5,9.303685979764736e-8,0.003302411561432909,-5.9567748630520254e-5,9.301394192772079e-8,0.0033025757102160976,-5.961647141519134e-5,9.308938092423752e-8,0.003302758454813665,-5.971971311326604e-5,9.32543085753427e-8,0.003302980149123383,-5.986499809573707e-5,9.348767984635991e-8,0.0033032558966772426,-6.003362496588928e-5,9.375826851834662e-8,0.003303593705146403,-6.0202192353766145e-5,9.402715772445558e-8,0.0033039926166897105,-6.034495084095433e-5,9.425167222522078e-8,0.003304441386900897,-6.043737478577002e-5,9.439138689843304e-8,0.003304918618617791,-6.046082993353868e-5,9.441594479608006e-8,0.0033053952081656575,-6.040751190609572e-5,9.431324511412548e-8,0.0033058394190006372,-6.028418972979809e-5,9.409552551950787e-8,0.0033062239072710452,-6.011307792870043e-5,9.380056022170947e-8,0.0033065329819612454,-5.99287475949815e-5,9.348622559924204e-8,0.003306767914704313,-5.977122717532698e-5,9.321879190076651e-8,0.003306948486177933,-5.9676703637333575e-5,9.305741226162379e-8,0.0033071098761496675,-5.966803032891732e-5,9.303855751819586e-8,0.003307295078633383,-5.974750722150152e-5,9.316446634613662e-8,0.003307544114132092,-5.9894223093106617E-05,9.339925812123948e-8,0.0033078824817017226,-6.006764076265878e-5,9.367527554290179e-8,0.003308312428674662,-6.021771715946743e-5,9.390997219756039e-8,0.003308810868846452,-6.02993136284251e-5,9.402960860305769e-8,0.003309335890088662,-6.028585030600706e-5,9.39915224159716e-8,0.003309839846317023,-6.017646168426142e-5,9.379561381316522e-8,0.003310283495942255,-5.999380790271972e-5,9.348042402784567e-8,0.0033106453888089448,-5.977450811021991e-5,9.310709708273535e-8,0.0033109239015205183,-5.955734946844783e-5,9.273979011758474e-8,0.003311133299984977,-5.937407692846487e-5,9.243051520461885e-8,0.0033112972340637236,-5.924481776115903e-5,9.221178385233012e-8,0.0033114426199441147,-5.917750316763905e-5,9.209590179549796e-8,0.0033115952609545363,-5.9169497804775444e-5,9.207784107991695e-8,0.003311777204723194,-5.920987375766593e-5,9.213904652853273e-8,0.0033120052080999,-5.92814938356559e-5,9.225082851606375e-8,0.003312289594904694,-5.936274846059623e-5,9.237717028262174e-8,0.003312633024578902,-5.942929679557276e-5,9.247760893901174e-8,0.003313029137070735,-5.945642637260442e-5,9.251122688928723e-8,0.0033134615879803833,-5.942257807852542e-5,9.244260873645003e-8,0.0033139044987459776,-5.931413137224047e-5,9.22498336783901e-8,0.0033143255654085853,-5.913063940039792e-5,9.193309185903323e-8,0.003314692523404364,-5.888852657791199e-5,9.152061902109267e-8,0.003314982071759978,-5.862063074863608e-5,9.106765658072329e-8,0.0033151883441194956,-5.836990960235362e-5,9.064573525743296e-8,0.003315327061036844,-5.817820907612507e-5,9.032387007253822e-8,0.003315432756404787,-5.807381239007963e-5,9.014792415786519e-8,0.003315549502730872,-5.80625870862475e-5,9.012617527068651e-8,0.0033157184572218204,-5.8126053541180765e-5,9.022654455023874e-8,0.003315966551858763,-5.8226689676969886e-5,9.038585941639497e-8,0.0033162996332138915,-5.831825523870404e-5,9.052728727571216e-8,0.0033167015288640424,-5.835787971070538e-5,9.058041563143791e-8,0.0033171388754599613,-5.8316694902620264e-5,9.049864230177064e-8,0.003317570199537387,-5.818631498100734e-5,9.026951683504713e-8,0.0033179566224040904,-5.7979533462259516e-5,8.99154851350754e-8,0.0033182710352989515,-5.772533753434543e-5,8.94853309482593e-8,0.003318503156852944,-5.746022504077495e-5,8.903967082003617e-8,0.003318659520612165,-5.721893166409305e-5,8.863565691424088e-8,0.0033187593907932924,-5.7027409664830245e-5,8.831554830627552e-8,0.0033188288152567313,-5.6899447070337116e-5,8.810136402150192e-8,0.0033188949683195744,-5.683663868685322e-5,8.799503967854189e-8,0.0033189820031886176,-5.683044444173091e-5,8.79819251290983e-8,0.0033191086079180677,-5.686498657172212e-5,8.80353851458633e-8,0.0033192868090701146,-5.6919687627007744e-5,8.812108202417043e-8,0.0033195213608058194,-5.6971468212093134e-5,8.820056393045532e-8,0.003319809205334997,-5.6996756676009524e-5,8.823463939940167e-8,0.0033201388682853913,-5.6973850769248384e-5,8.818741927408212e-8,0.0033204901645404743,-5.688617916715095e-5,8.803185327819643e-8,0.0033208351653437364,-5.672667481568836e-5,8.775700668157399e-8,0.0033211417606726764,-5.650258196722333e-5,8.737589343481958e-8,0.0033213807589085697,-5.623860290952227e-5,8.693042466255639e-8,0.003321535704580842,-5.5975194089382036e-5,8.64882803546673e-8,0.003321611779853912,-5.575964063734652e-5,8.612788421461543e-8,0.0033216383488875716,-5.563121550563371e-5,8.591372038897917e-8,0.00332166160133251,-5.560648771923718e-5,8.587208299016034e-8,0.003321729332346463,-5.567246407025703e-5,8.597999999454416e-8,0.0033218749696411454,-5.5791288194139026e-5,8.617344710132884e-8,0.003322108078793622,-5.591357362818337e-5,8.636987047930183e-8,0.003322414074917141,-5.599359775464645e-5,8.649361999558831e-8,0.0033227610657908736,-5.600062818328033e-5,8.649468343439781e-8,0.0033231098129842453,-5.592409172339057e-5,8.635693899550423e-8,0.003323423401229845,-5.577304858807897e-5,8.60968278743868e-8,0.0033236746106560327,-5.5571625019046895e-5,8.57553706414179e-8,0.0033238501378285963,-5.535223551652658e-5,8.538670353148495e-8,0.003323951512978097,-5.5148243821503265e-5,8.504591708672522e-8,0.0033239930515267515,-5.4987516475655016e-5,8.477855814651931e-8,0.003323997693098464,-5.4888022929405465e-5,8.461360179444422e-8,0.0033239919654675055,-5.485601986581888e-5,8.456067453943338e-8,0.0033240012834951657,-5.4886614374086276e-5,8.461111130656435e-8,0.00332404640453801,-5.496599005265156e-5,8.474164448132102e-8,0.003324141328817078,-5.507438956499113e-5,8.491926542726227e-8,0.003324292421254159,-5.5189074106772154e-5,8.510604823670503e-8,0.0033244982624229583,-5.528690636714247e-5,8.526342573891019e-8,0.0033247498139609742,-5.534665974060568e-5,8.5356116539381e-8,0.003325030738318475,-5.535139742517621e-5,8.535622814349039e-8,0.003325318078773487,-5.529132808874682e-5,8.524810407518335e-8,0.0033255840434287193,-5.516732559483926e-5,8.503412127897562e-8,0.003325800025884042,-5.4994500283684165e-5,8.474038755337137e-8,0.003325943636647162,-5.4803921202816106e-5,8.441925947919739e-8,0.003326007954119694,-5.463949661780294e-5,8.414386557641033e-8,0.0033260093929748016,-5.454751850488496e-5,8.39906316797749e-8,0.0033259881913321188,-5.4560143825206843e-5,8.401195873056964e-8,0.0033259972865628765,-5.4680122236649234e-5,8.421112518435034e-8,0.003326082679984568,-5.4876669269890736e-5,8.453576539427439e-8,0.0033262656698723574,-5.509660108184346e-5,8.489670021080734e-8,0.0033265367421952,-5.528454025680654e-5,8.520177547374201e-8,0.0033268625692368203,-5.540089651290604e-5,8.53858406600953e-8,0.0033271997836301316,-5.5430263445104554e-5,8.542454745717457e-8,0.00332750801243725,-5.538020410605459e-5,8.533193941439912e-8,0.0033277582273325535,-5.527451512296222e-5,8.514878834424156e-8,0.0033279360985943923,-5.514504454421498e-5,8.492865234127454e-8,0.0033280417206101223,-5.502443713341801e-5,8.47257264967664e-8,0.0033280872119350394,-5.494062573953781e-5,8.458583816329359e-8,0.0033280931856418602,-5.4913121909954754e-5,8.454056432249686e-8,0.003328084687829209,-5.49510529651956e-5,8.460424445406648e-8,0.003328087119786794,-5.505287514330795e-5,8.477367296994299e-8,0.003328122619004344,-5.520754438276987e-5,8.503008040542494e-8,0.0033282072794208633,-5.539681605654844e-5,8.534289014342119e-8,0.0033283494784650124,-5.559823205385741e-5,8.567459021016955e-8,0.0033285493241682613,-5.5788247308437714e-5,8.5985886311372e-8,0.0033287989546007955,-5.594511202878772e-5,8.624053969095568e-8,0.0033290834152926,-5.605145404558202e-5,8.640978601385084e-8,0.0033293820025522038,-5.609665354800625e-5,8.647641681844645e-8,0.00332967012765513,-5.607914249037254e-5,8.64386360154981e-8,0.003329922108265471,-5.600868372770514e-5,8.63137014691309e-8,0.003330115618151409,-5.590807269377462e-5,8.614043768918587e-8,0.0033302381328333365,-5.58126677029861e-5,8.597808953775239e-8,0.0033302943335076583,-5.5765475825965935e-5,8.589791861426393e-8,0.0033303112431023363,-5.580611329656748e-5,8.596488539474054e-8,0.003330335893358347,-5.595512706192685e-5,8.621187561535514e-8,0.0033304217950196257,-5.620076748901601e-5,8.661809726569148e-8,0.0033306077541668403,-5.649824615334275e-5,8.710815973363818e-8,0.003330900673735715,-5.678551821777345e-5,8.757850948338549e-8,0.0033312733708816735,-5.7007580014031255e-5,8.793794593475561e-8,0.003331677827847687,-5.713506396332166e-5,8.81385544183494e-8,0.0033320641462310304,-5.7168762976044525e-5,8.818303689777447e-8,0.003332394888741356,-5.713232454494835e-5,8.81121521924967e-8,0.003332650948899174,-5.706056072566515e-5,8.79848172366316e-8,0.0033328307387244707,-5.69892054818512e-5,8.786079588531413e-8,0.003332946103134148,-5.6948270940260595e-5,8.7789662082767e-8,0.003333017524013881,-5.695869565914077e-5,8.780546633003202e-8,0.003333069785980845,-5.7031151550971855e-5,8.79250644837299e-8,0.003333128293176569,-5.7166122827538784e-5,8.814848616597651e-8,0.003333215942814037,-5.735486447701515e-5,8.846062555209589e-8,0.003333350526081416,-5.758107712399529e-5,8.883400189972032e-8,0.003333542711568079,-5.782323256543382e-5,8.923255045240708e-8,0.0033337948024626724,-5.805748921759443e-5,8.961641831353482e-8,0.0033341004955474854,-5.826092281925177e-5,8.994735848331943e-8,0.0033344456574180216,-5.8414663420069585e-5,9.019404254409442e-8,0.0033348099763535065,-5.850667539814434e-5,9.033680470762473e-8,0.0033351693972139954,-5.8534013007029704e-5,9.037145788055351e-8,0.0033354992652454255,-5.850435337312846e-5,9.031176994724097e-8,0.003335778150817505,-5.8436628216984924e-5,9.019026948162117e-8,0.0033359924676545083,-5.836033415719681e-5,9.005674088553579e-8,0.003336141696475799,-5.831247259530645e-5,8.99728131408324e-8,0.003336242937122228,-5.833081796090152e-5,9.000064726389226e-8,0.003336332072852576,-5.844314497737879e-5,9.018519988192054e-8,0.003336457993721301,-5.8654611621949015e-5,9.053364701309959e-8,0.003336668034416213,-5.8939341334053395e-5,9.100181248328803e-8,0.0033369886308538366,-5.9243988034202145e-5,9.15003563787348e-8,0.0033374117211466396,-5.950577741976175e-5,9.192485569877443e-8,0.0033378966406314506,-5.9676814334938345e-5,9.219623025373824e-8,0.003338387060585492,-5.974061238822445e-5,9.228818050131115e-8,0.003338832161640395,-5.9712769824558396e-5,9.222809662066525e-8,0.003339200660884803,-5.9629238348668325e-5,9.207713490030904e-8,0.0033394839946629365,-5.9531508527586526e-5,9.19051435138701e-8,0.00333969194933606,-5.9455615021928336e-5,9.177216062406416e-8,0.0033398456958361393,-5.9426735296063406e-5,9.171952556625893e-8,0.0033399714625476887,-5.94580076063395e-5,9.176821138029921e-8,0.0033400959454044452,-5.9551503177061825e-5,9.19207583444299e-8,0.003340243216604815,-5.969991931487511e-5,9.21642828744451e-8,0.003340432528612182,-5.988845372977386e-5,9.247363390315894e-8,0.00334067661964073,-6.009682747560091e-5,9.281470236403697e-8,0.003340980391006287,-6.0301603901974886e-5,9.314821825194654e-8,0.0033413400860247433,-6.047899922745841e-5,9.34344253905957e-8,0.0033417433406987395,-6.0608161718892285e-5,9.363861218700703e-8,0.0033421704338331562,-6.0674530868574566e-5,9.373681434940468e-8,0.003342596793867571,-6.067274472862805e-5,9.372073186756808e-8,0.003342996619504433,-6.060857747387037e-5,9.360092417739725e-8,0.0033433472973181913,-6.049938316515723e-5,9.340736779360886e-8,0.003343634076313921,-6.037265637678459e-5,9.318674843140178e-8,0.003343854352958671,-6.026253039672385e-5,9.29962869527095e-8,0.0033440207974379525,-6.02040503597778e-5,9.289398103642671e-8,0.00334416209570793,-6.0225227664861864e-5,9.292540486542561e-8,0.0033443195738953684,-6.033783862182839e-5,9.310869759814082e-8,0.0033445382535737425,-6.052967926745262e-5,9.342213643036966e-8,0.0033448528768625176,-6.076271261213488e-5,9.380146725962548e-8,0.0033452733341006566,-6.098129519580642e-5,9.415379750598335e-8,0.0033457773304763423,-6.11302103754188e-5,9.43875995339562e-8,0.003346316441695281,-6.117498982465232e-5,9.444642575943193e-8,0.0033468338086486238,-6.111354333006799e-5,9.432810795018451e-8,0.0033472838692474196,-6.097324927755117e-5,9.4079645301939e-8,0.0033476441985163447,-6.0797240704200516e-5,9.377398884436344e-8,0.0033479163084475117,-6.062888070521747e-5,9.348385258171712e-8,0.003348119017326552,-6.050124738963157e-5,9.326410433273226e-8,0.0033482798563691583,-6.043317112036643e-5,9.314535120928058e-8,0.0033484280459571253,-6.0429873261064216e-5,9.313533471622201e-8,0.0033485900303240564,-6.0485597297215256e-5,9.322360188274091e-8,0.0033487870427821647,-6.058650061285441e-5,9.338645264051759e-8,0.003349033779148276,-6.071317745669125e-5,9.359112405668456e-8,0.003349337512154647,-6.084287930407258e-5,9.379941019517652e-8,0.0033496973868342426,-6.0951778738148076e-5,9.39713912066027e-8,0.0033501040189214903,-6.1017654657638296e-5,9.406994902831682e-8,0.003350539852327468,-6.102313701204754e-5,9.406628005534092e-8,0.0033509808424563464,-6.0959184102096446e-5,9.394579478956938e-8,0.0033513997985662727,-6.0828035243102085e-5,9.371305998195274e-8,0.003351771242630648,-6.064464806465786e-5,9.339407682046672e-8,0.0033520770502697586,-6.043567280060645e-5,9.303431185934628e-8,0.0033523115992083793,-6.023549059632611e-5,9.269175686275925e-8,0.0033524849538567095,-6.0079656147178764e-5,9.242570667708549e-8,0.003352622868607595,-5.999683644913714e-5,9.228321247007672e-8,0.0033527629108964156,-6.0000858451751614e-5,9.228598308330152e-8,0.0033529466888537886,-6.0084899028015664e-5,9.242109352946563e-8,0.003353209163212818,-6.0220101719581925e-5,9.263915942649568e-8,0.003353567452423346,-6.036056292024498e-5,9.286301996208644e-8,0.003354013074553909,-6.045506176241125e-5,9.300742375322236e-8,0.003354511938151932,-6.0462793179074204e-5,9.300515855826013e-8,0.003355013937094379,-6.036701837740332e-5,9.282957547814603e-8,0.0033554690078815767,-6.018006277425595e-5,9.250263119120252e-8,0.0033558424476254254,-5.9937221757790955e-5,9.208440293612802e-8,0.0033561228412348943,-5.9683282240027307e-5,9.165030735952862e-8,0.003356320744440452,-5.9458664926667036e-5,9.126781835699132e-8,0.003356461215846782,-5.929059997108527e-5,9.09818074709203e-8,0.0033565749791113304,-5.919060979973586e-5,9.081060603989335e-8,0.0033566915189816907,-5.915640839670276e-5,9.07494897969949e-8,0.0033568350305881473,-5.91755770416691e-5,9.077702401431161e-8,0.003357022613830941,-5.9229226963443656e-5,9.086121990946202e-8,0.003357263701159578,-5.929496452229679e-5,9.096440629587108e-8,0.003357559911226247,-5.934921839576949e-5,9.104702421945221e-8,0.0033579049385909485,-5.9369383956175455e-5,9.1071192375381e-8,0.0033582845835001054,-5.9336313704812116e-5,9.100494733703145e-8,0.00335867744667257,-5.923739982099832e-5,9.082751861971475e-8,0.003359057001605932,-5.906997363720898e-5,9.053508695821385e-8,0.003359395616398978,-5.884413276926084e-5,9.014546329210125e-8,0.003359670484111321,-5.858354614172143e-5,8.96992412648217e-8,0.003359870306372325,-5.83227294745991e-5,8.925494292974744e-8,0.003360000476205311,-5.8100244081356475e-5,8.887733886137964e-8,0.0033600842939887445,-5.794905158876692e-5,8.862112733910623e-8,0.0033601588394004405,-5.7886876867381644e-5,8.851484939281549e-8,0.0033602660797591934,-5.790993390908707e-5,8.85506789176601e-8,0.003360441674025316,-5.799244505104898e-5,8.868407215376571e-8,0.003360704848971143,-5.809247460735285e-5,8.884397868653839e-8,0.003361052408555661,-5.8162610399993446e-5,8.895098477449679e-8,0.0033614587985430038,-5.816263041067814e-5,8.893850581578914e-8,0.003361882595100984,-5.807055435201572e-5,8.877103313526498e-8,0.0033622778382321966,-5.788851232418176e-5,8.845357733079992e-8,0.003362606646946412,-5.764123357960088e-5,8.802875740347297e-8,0.003362848722009863,-5.736772166360094e-5,8.756257923304475e-8,0.003363004624307182,-5.710951428610873e-5,8.712465566458204e-8,0.0033630925651310676,-5.690004657624532e-5,8.677046271557997e-8,0.0033631411170110623,-5.6758424875231495e-5,8.653114040510852e-8,0.003363181256001812,-5.668835779717318e-5,8.641199419472419e-8,0.0033632402740149748,-5.6680785627308535e-5,8.639713164955336e-8,0.0033633383786634027,-5.67180183840242e-5,8.64564805526587e-8,0.0033634874868962595,-5.6777755378881375e-5,8.65524655651299e-8,0.0033636912810481303,-5.683628445550697e-5,8.66452477529796e-8,0.003363945718484768,-5.687086249094485e-5,8.669663650025481e-8,0.0033642395389277832,-5.686171426360383e-5,8.667346696354637e-8,0.0033645548029027344,-5.6794222114151424e-5,8.655138743646585e-8,0.0033648679728196743,-5.6661634264931834e-5,8.631952160889124e-8,0.003365152316192434,-5.646808727765676e-5,8.598556119531746e-8,0.0033653823440695273,-5.6231009443925796e-5,8.557966538825618e-8,0.003365540348867742,-5.598115619209057e-5,8.515425825459867e-8,0.0033656236291926926,-5.5758262063050816e-5,8.477643543829795e-8,0.003365649237974656,-5.5601580627967396e-5,8.451187493962213e-8,0.003365652653538818,-5.5537505781072915e-5,8.440402629396734e-8,0.0033656789459104476,-5.5569291146105796e-5,8.445703766415184e-8,0.003365769023611574,-5.5674099565599833e-5,8.463116901817921e-8,0.003365946605285959,-5.580935658495085e-5,8.485389455646114e-8,0.003366211262409989,-5.592573091926771e-5,8.504204720695987e-8,0.0033665395943343838,-5.598132333980049e-5,8.512577176624952e-8,0.003366892961472996,-5.59521898282755e-5,8.506604596898847e-8,0.003367228357217615,-5.583677491599288e-5,8.486175343471328e-8,0.0033675090217883843,-5.565418314517531e-5,8.454632832083293e-8,0.0033677122812087027,-5.543770395775392e-5,8.417651191158752e-8,0.0033678331653782018,-5.522579913828783e-5,8.381704806824443e-8,0.0033678834944036373,-5.50530389308712e-5,8.352552276592036e-8,0.0033678872697589877,-5.494321345418341e-5,8.334103225252462e-8,0.003367874119813055,-5.490600237086945e-5,8.327889130742978e-8,0.0033678728417263332,-5.493731937946403e-5,8.333146207894089e-8,0.003367906582298691,-5.50223028120182e-5,8.347329601819736e-8,0.003367990240931756,-5.5139459330814e-5,8.36680693328067e-8,0.003368129820921837,-5.5264706650024884e-5,8.387526013174893e-8,0.0033683230141878383,-5.53746278372721e-5,8.405550425907457e-8,0.0033685602874602904,-5.544884667401181e-5,8.417455801548991e-8,0.0033688260245799536,-5.5471875403664845e-5,8.420648096017351e-8,0.0033690996964164,-5.54349217648513e-5,8.41368044105891e-8,0.0033693574390171246,-5.533796983745346e-5,8.396611154911362e-8,0.003369574738556079,-5.51920190230235e-5,8.371373979967595e-8,0.0033697309471166486,-5.502062543221554e-5,8.342014676700197e-8,0.0033698157191195807,-5.4858963662490004e-5,8.314502135403152e-8,0.00336983588693757,-5.4748211466438515e-5,8.295758836096101e-8,0.003369819180796456,-5.472435396786891e-5,8.291770942984493e-8,0.0033698103447281362,-5.4804144817696605e-5,8.305241791698605e-8,0.0033698580327925177,-5.497509215486744e-5,8.333937840761425e-8,0.00336999704671909,-5.519660736781785e-5,8.370918090270701e-8,0.003370235023755808,-5.541355414664154e-5,8.406846696487325e-8,0.0033705505910493,-5.557548077177791e-5,8.43325066766928e-8,0.0033709027002781183,-5.565191209448797e-5,8.445094442884492e-8,0.0033712449573918956,-5.563811944371171e-5,8.441726573141519e-8,0.0033715383281370122,-5.5551947479558465e-5,8.426301455023264e-8,0.0033717588003342688,-5.5425603682988634e-5,8.404350744757277e-8,0.0033718997534319347,-5.529628730757146e-5,8.382176259040501e-8,0.0033719703516509663,-5.519808521396885e-5,8.365483265879684e-8,0.0033719915125817105,-5.515616301581334e-5,8.358424368986457e-8,0.003371990670460589,-5.5183508520810655e-5,8.363084262341449e-8,0.003371996312094328,-5.5280222125438397e-5,8.37938999603007e-8,0.0033720332014755966,-5.543506986883743e-5,8.405389123547616e-8,0.0033721189855487107,-5.56286157858378e-5,8.437778720791833e-8,0.003372262458821144,-5.5837078683713314e-5,8.472545698884107e-8,0.0033724633940253805,-5.603614789623234e-5,8.505597653427594e-8,0.003372713546608454,-5.620417709122976e-5,8.533294234846123e-8,0.0033729982668022603,-5.632452546423462e-5,8.552844070193068e-8,0.00337329829570848,-5.6387235045065904e-5,8.562597120345452e-8,0.003373591662554191,-5.639037939243083e-5,8.56228158420924e-8,0.0033738558827816345,-5.634128823507716e-5,8.553209949381927e-8,0.0033740709065428706,-5.625757728164715e-5,8.538435984518772e-8,0.0033742233614416587,-5.6167318041165296e-5,8.522753464272809e-8,0.0033743120850930324,-5.6106839883563096e-5,8.512295286558207e-8,0.0033743535182657845,-5.6114284681771475e-5,8.51343302306435e-8,0.003374383584560917,-5.621816091412462e-5,8.530860378052354e-8,0.003374451653711905,-5.642363033026548e-5,8.565316246357324e-8,0.003374604874548048,-5.670392651341919e-5,8.612176775673318e-8,0.003374868363272367,-5.700515151316815e-5,8.662290807184912e-8,0.0033752327666612806,-5.726543902108981e-5,8.705223569982031e-8,0.003375657734454065,-5.743861941957818e-5,8.733251492462779e-8,0.00337608883276525,-5.7508964679654286e-5,8.743842547911098e-8,0.0033764770314720334,-5.749109053497066e-5,8.739613430904317e-8,0.003376791288154108,-5.741928432963936e-5,8.726484516431357e-8,0.003377021873463669,-5.733428391425587e-5,8.711405749206888e-8,0.003377177244553692,-5.727289468373037e-5,8.700584615729924e-8,0.0033772782065038614,-5.7261975296652276e-5,8.698482352101486e-8,0.003377351897211726,-5.731608876134401e-5,8.707450164078988e-8,0.0033774266600864046,-5.743750053577925e-5,8.727765185706965e-8,0.0033775279397840904,-5.761758344607225e-5,8.757892428997106e-8,0.0033776751676794963,-5.783921764291742e-5,8.794897670651642e-8,0.0033778797227997696,-5.807988352583364e-5,8.834963725304223e-8,0.0033781440270615184,-5.831509017006301e-5,8.873957895692964e-8,0.0033784617768650477,-5.8521803894550365e-5,8.908001953560924e-8,0.003378819238634322,-5.868149381761238e-5,8.933984781642511e-8,0.003379197323670683,-5.8782439093002966e-5,8.949957584080041e-8,0.003379574066231394,-5.882122050843463e-5,8.955393397490966e-8,0.003379927308581292,-5.880351542948081e-5,8.951323372093641e-8,0.0033802375736910525,-5.8744255904977356e-5,8.940353066295135e-8,0.003380491220639322,-5.86670851430349e-5,8.92654614473728e-8,0.003380684061250688,-5.8602724717853605e-5,8.915117457299559e-8,0.003380825238790617,-5.8585283278155506e-5,8.911787039413452e-8,0.0033809400725077258,-5.8645366370736766e-5,8.921617853680288e-8,0.0033810692089788217,-5.8799874204040243e-5,8.947323513780382e-8,0.003381260821250198,-5.904106722336901e-5,8.987469296042821e-8,0.0033815547925915685,-5.933123263112307e-5,9.0356110182332e-8,0.003381964109575867,-5.961028832185029e-5,9.081592148861166e-8,0.0033824647851254143,-5.981713959083937e-5,9.1151422106769e-8,0.003383003169851391,-5.9914358833980524e-5,9.130033548932249e-8,0.0033835175357943767,-5.9901254032734106e-5,9.126278647579509e-8,0.0033839605590798446,-5.980890433849116e-5,9.10926902260356e-8,0.00338431099616989,-5.968366488858203e-5,9.086948355865654e-8,0.0033845727837585357,-5.9570442762593056e-5,9.066948346775116e-8,0.0033847670858004075,-5.950243521857609e-5,9.05484296124944e-8,0.0033849232362922243,-5.9497727807565615e-5,9.053594275132374e-8,0.0033850716583332255,-5.956024397003957e-5,9.063751388399143e-8,0.0033852393421935963,-5.9682490187505253e-5,9.083949487511646e-8,0.0033854472176725985,-5.984859127500225e-5,9.111441080009529e-8,0.0033857086133339863,-6.003720459463659e-5,9.142588647628522e-8,0.0033860284271986017,-6.022439650227471e-5,9.173340583043047e-8,0.003386402955846923,-6.038656005091193e-5,9.199713865518988e-8,0.003386820462731965,-6.0503374088305864e-5,9.218289744117541e-8,0.003387262658810295,-6.05606230682693e-5,9.226693315388558e-8,0.0033877071395750856,-6.0552452997181255e-5,9.223981379163578e-8,0.0033881305330445235,-6.048266726105932e-5,9.210864890465263e-8,0.0033885120041810286,-6.036487174837796e-5,9.189727295160823e-8,0.003388836782278121,-6.022136221100909e-5,9.164417689053099e-8,0.003389099364723984,-6.008071140194549e-5,9.139814912203612e-8,0.003389306087909998,-5.9974056769629564e-5,9.121173103792565e-8,0.0033894766507592314,-5.992991778520634e-5,9.113234376727132e-8,0.0033896436217253243,-5.9967392439029444e-5,9.119094033650632e-8,0.003389848331184142,-6.00884494472235e-5,9.138938243016609e-8,0.003390131696696725,-6.027176738671097e-5,9.169052134537972e-8,0.003390520408645742,-6.0472489173007385e-5,9.20181223124543e-8,0.003391013048776062,-6.0632291852483944e-5,9.227391611926006e-8,0.003391574685345615,-6.069936708195099e-5,9.237117323434914e-8,0.0033921465752053356,-6.0649508463182645e-5,9.227013011226155e-8,0.003392668019375996,-6.049561955058757e-5,9.199390213601754e-8,0.003393098109249708,-6.027985582758634e-5,9.161498325294656e-8,0.003393425788317697,-6.005472021645174e-5,9.12229510324662e-8,0.00339366621882231,-5.986502345047448e-5,9.089367784604274e-8,0.003393849764889761,-5.973824800765525e-5,9.067301795341194e-8,0.0033940108887349028,-5.9683418753718195e-5,9.057517474706375e-8,0.0033941806177451347,-5.969475502631139e-5,9.058927390461232e-8,0.0033943828082887316,-5.9756555264083074e-5,9.068792616803152e-8,0.0033946329021984417,-5.984744069403636e-5,9.083450585144963e-8,0.003394937808251754,-5.994358255246006e-5,9.098854172687638e-8,0.003395296161910116,-6.002127117598997e-5,9.110993548500498e-8,0.003395698804414143,-6.0059267214638514e-5,9.116285658288206e-8,0.0033961296425301405,-6.004122350292775e-5,9.111984405853812e-8,0.0033965672449549665,-5.995817702591761e-5,9.096608893871411e-8,0.0033969875056327195,-5.9810681332088226e-5,9.070310529653611e-8,0.0033973673472186662,-5.960989551896998e-5,9.035055940505286e-8,0.0033976890073721226,-5.937702862808381e-5,8.994519524467432e-8,0.00339794414966279,-5.914078600227383e-5,8.953626954603158e-8,0.00339813686265762,-5.893285864413488e-5,8.91776383701858e-8,0.0033982846760873316,-5.8782022201718587e-5,8.891757350029357e-8,0.0033984170426695744,-5.8707756459061303e-5,8.878796990728907e-8,0.0033985710041651773,-5.8714419523522015e-5,8.879474808736464e-8,0.003398783964213327,-5.8787308590801815e-5,8.891163690828701e-8,0.003399084097724401,-5.889244323337396e-5,8.908026373626042e-8,0.003399480270250761,-5.898203293481756e-5,8.921967011645284e-8,0.0033999551699554283,-5.900646431000797e-5,8.924656326463904e-8,0.003400466358786225,-5.893049216975236e-5,8.91024588459512e-8,0.003400957801068039,-5.8747104648884236e-5,8.877683281588798e-8,0.003401378527359106,-5.848118000125292e-5,8.831304298309702e-8,0.0034016995373273343,-5.817987411373497e-5,8.779181892187154e-8,0.0034019205448226966,-5.789489120259509e-5,8.730103063936285e-8,0.0034020649231812825,-5.7666180030203005e-5,8.690798801868969e-8,0.003402168049287801,-5.751375176227864e-5,8.664571506488682e-8,0.003402265858276145,-5.743804869788241e-5,8.651389470980682e-8,0.00340238747932283,-5.742519852330234e-5,8.64881096032888e-8,0.0034025522455255973,-5.7453234933997976e-5,8.653057385184077e-8,0.0034027695489980392,-5.7497130460310654e-5,8.659865614011625e-8,0.003403039886903058,-5.753221388492227e-5,8.665054230622828e-8,0.0034033560870460524,-5.753644074444263e-5,8.664895352331391e-8,0.0034037044047870047,-5.7492186034072585e-5,8.656414307834132e-8,0.003404065680014834,-5.738807359108861e-5,8.637705347880114e-8,0.0034044170305128105,-5.722099116240365e-5,8.60828262613509e-8,0.003404734597935735,-5.6997926909140374e-5,8.569395943787588e-8,0.003404997558905359,-5.6736793275923886e-5,8.524163215191012e-8,0.0034051929890715296,-5.646520876211743e-5,8.477344074418974e-8,0.003405320408160798,-5.621648018227168e-5,8.434631513995815e-8,0.003405394300451476,-5.6022900264124296e-5,8.40149123124777e-8,0.0034054430646795236,-5.590772696450894e-5,8.381791884209707e-8,0.0034055038606741876,-5.587815564824331e-5,8.376626228374444e-8,0.0034056142384550816,-5.59216390476811e-5,8.383721738396868e-8,0.003405802567121793,-5.600706841995555e-5,8.397686437719106e-8,0.003406079762115114,-5.609104831024885e-5,8.411111539414267e-8,0.0034064347003346877,-5.6128202268790945e-5,8.416335082003054e-8,0.0034068351738956544,-5.6083285215666045e-5,8.407483916197228e-8,0.003407235151776666,-5.594181500695267e-5,8.382243623901492e-8,0.0034075871596243503,-5.5715353849958e-5,8.342714398589868e-8,0.0034078560389337632,-5.543856994368361e-5,8.294878555047174e-8,0.0034080288015259303,-5.5158405656903775e-5,8.246741739171249e-8,0.003408116556022004,-5.491960304745137e-5,8.20587213493105e-8,0.0034081483496585887,-5.475262430635319e-5,8.17736335484883e-8,0.0034081606287834965,-5.466819510979342e-5,8.162935251217643e-8,0.003408187213574958,-5.465879991060622e-5,8.161218884734959e-8,0.0034082529479952245,-5.470438823302094e-5,8.168747464274309e-8,0.0034083714747449156,-5.477893708194855e-5,8.181075694408507e-8,0.0034085458513296286,-5.4855751000708015e-5,8.193669718795236e-8,0.003408770414545297,-5.4910925975911326e-5,8.202480039048432e-8,0.003409032781106392,-5.4925363401297566e-5,8.204274072682829e-8,0.0034093155318804143,-5.488606600123461e-5,8.196858076576507e-8,0.0034095977133735593,-5.478735913882586e-5,8.179294852554372e-8,0.0034098566636729913,-5.463228818846857e-5,8.1521508229844755E-08,0.003410070752139286,-5.443391476149148e-5,8.117715796819658e-8,0.0034102233957102024,-5.4215684339399623e-5,8.0800505879973e-8,0.003410308068531649,-5.400958289018258e-5,8.044648266424068e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json new file mode 100644 index 0000000..5a65685 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":22000,"numberOfSamples":1000,"samples":[0.003410332914201753,-5.3850894022675106e-5,8.017517098961131e-8,0.003410322528879365,-5.376958194615e-5,8.003701237438996e-8,0.0034103145652221627,-5.3780481135696216e-5,8.005617875605212e-8,0.0034103506775372276,-5.3876274061593275e-5,8.021888857849169e-8,0.003410464307410866,-5.402707135418975e-5,8.047308167596654e-8,0.003410669971601388,-5.4187778507499705e-5,8.074133887896081e-8,0.003410958362427396,-5.431078402439631e-5,8.094271511350002e-8,0.0034112988966924413,-5.435925986441926e-5,8.101538020005893e-8,0.0034116483046836123,-5.431671386401488e-5,8.093263501288651e-8,0.0034119621492173344,-5.41904204198061e-5,8.070834304160092e-8,0.0034122059256284677,-5.400841636122217e-5,8.039138838903804e-8,0.0034123629141804617,-5.38113276447821e-5,8.005145827068325e-8,0.003412436926427523,-5.3641509849942013e-5,7.976047048128742e-8,0.0034124495366027988,-5.3532666321671336e-5,7.957504010808949e-8,0.0034124330661485227,-5.350283981451321e-5,7.952484351765614e-8,0.0034124218722404974,-5.3552370565715433e-5,7.960947036368768e-8,0.0034124447457084236,-5.3666539079328896e-5,7.980316491937519e-8,0.0034125202858526367,-5.382106091332426e-5,8.00642647210325e-8,0.0034126555868305777,-5.398815305369993e-5,8.034545908014444e-8,0.0034128473776592204,-5.414152490629849e-5,8.06021342297411e-8,0.0034130843642180496,-5.425966542015235e-5,8.079783644736344e-8,0.0034133497512128354,-5.4327618445658844e-5,8.090725685897239e-8,0.003413623435855102,-5.4337869912637006e-5,8.091781018622006e-8,0.003413883907454681,-5.429097539492461e-5,8.083081580105819e-8,0.0034141102665403125,-5.419622361028624e-5,8.066268207707981e-8,0.0034142849136512055,-5.407215162017978e-5,8.044570051432896e-8,0.00341439730488426,-5.394617096384391e-5,8.022718223765307e-8,0.003414448551881033,-5.385201336379878e-5,8.006482802604857e-8,0.0034144554442633347,-5.382365677022172e-5,8.001619006311863e-8,0.003414451133210198,-5.388562472720168e-5,8.012215438343905e-8,0.0034144795115925615,-5.4042269894100845e-5,8.038890648236031e-8,0.003414582717752921,-5.427144088560471e-5,8.077748959286917e-8,0.0034147858366957128,-5.452785635760065e-5,8.120990068433355e-8,0.003415086335408109,-5.475685197042185e-5,8.159276299340531e-8,0.0034154541675420077,-5.491264135361651e-5,8.184854560101504e-8,0.003415842328369328,-5.497241133679643e-5,8.19395012048398e-8,0.0034162020648540446,-5.494079694397467e-5,8.187500799224558e-8,0.0034164960597480513,-5.484509224563486e-5,8.170297816008171e-8,0.003416705855690934,-5.472520370648011e-5,8.14923147861858e-8,0.0034168331491478627,-5.462263220717812e-5,8.131389578844407e-8,0.003416896425673255,-5.457135459703978e-5,8.122506662590603e-8,0.003416924864737033,-5.459196701501527e-5,8.125992201462119e-8,0.0034169512624180483,-5.468942093895768e-5,8.142580537893595e-8,0.0034170054267853647,-5.485407812356393e-5,8.17054100824689e-8,0.0034171092005408077,-5.506533196508355e-5,8.206310391954363e-8,0.0034172737893538854,-5.529662285957986e-5,8.24534661992994e-8,0.0034174994368857004,-5.552057481406241e-5,8.282992315001632e-8,0.0034177769459542693,-5.5713266654435735e-5,8.315188937008223e-8,0.0034180902481047706,-5.58571185539423e-5,8.338960767448971e-8,0.0034184192209990544,-5.594239734507513e-5,8.352672714006698e-8,0.0034187422744122974,-5.5967759795049916e-5,8.356130894842189e-8,0.0034190386613258106,-5.5940313585960716e-5,8.350600300356605e-8,0.0034192907451060053,-5.5875438829459745e-5,8.338772029482915e-8,0.0034194865853197334,-5.5796286755981725e-5,8.324661178228372e-8,0.0034196231618546383,-5.573239332743332e-5,8.313343416160889e-8,0.0034197100026956712,-5.571629566234729e-5,8.310353167794132e-8,0.0034197718373557965,-5.5777017730924494e-5,8.320565011677361e-8,0.0034198476546487924,-5.593045265235306e-5,8.346570742357244e-8,0.0034199832418701356,-5.6169307155583144e-5,8.387000547866622e-8,0.0034202166393619616,-5.64584557493018e-5,8.435767926960611e-8,0.0034205614639800535,-5.67418663020452e-5,8.483274082655738e-8,0.003420997727034218,-5.696140593963007e-5,8.51962311929662e-8,0.0034214773558268368,-5.707879301142648e-5,8.538365211417604e-8,0.0034219421419332224,-5.708851047552745e-5,8.538688805157197e-8,0.0034223438059788605,-5.701585691614104e-5,8.525060072019697e-8,0.0034226564954146083,-5.690413699843295e-5,8.504993386503595e-8,0.003422878920363075,-5.679944106094893e-5,8.486413227000239e-8,0.0034230291674335464,-5.6739176541925223e-5,8.475681081074442e-8,0.003423136660697731,-5.6746178962097036e-5,8.476606168603778e-8,0.0034232343831674863,-5.682746769406769e-5,8.490269488349289e-8,0.0034233527024106186,-5.697594757338996e-5,8.515352124084064e-8,0.003423515048462373,-5.717372366496969e-5,8.548725451920484e-8,0.003423735360724929,-5.739623453008071e-5,8.586162778920173e-8,0.0034240171921175824,-5.761661689063496e-5,8.623076555625632e-8,0.003424354282394761,-5.7809781532945634e-5,8.655200921001188e-8,0.003424732337212298,-5.795580012171021e-5,8.679159414405439e-8,0.0034251316600929604,-5.804228112995662e-5,8.692867283680107e-8,0.0034255301389273553,-5.8065571370678764e-5,8.695739993818016e-8,0.0034259061435299876,-5.8030942708281336e-5,8.68873016976559e-8,0.003426241192945239,-5.7952061490074354e-5,8.674237096252997e-8,0.003426522442310002,-5.784987818084441e-5,8.655906513984539e-8,0.0034267450710929025,-5.775090698206635e-5,8.638314938058331e-8,0.0034269146613510586,-5.768461436478088e-5,8.626498016672915e-8,0.0034270492888037753,-5.7679206341423455e-5,8.625215296635437e-8,0.0034271801115048016,-5.775513150463932e-5,8.637847340111039e-8,0.003427348318837799,-5.791673040416302e-5,8.66500111928406e-8,0.003427596290732135,-5.814466196255829e-5,8.703260278195282e-8,0.0034279529627239238,-5.8394327194921334e-5,8.744949479355945e-8,0.003428418470586544,-5.860576263431353e-5,8.77983298726461e-8,0.00342895785967562,-5.872474275422114e-5,8.79870966366347e-8,0.0034295111225311516,-5.872520138069127e-5,8.797231646130829e-8,0.0034300159367414112,-5.8619276575255356e-5,8.777608739665868e-8,0.003430429936364875,-5.8449346719175054e-5,8.747221956219683e-8,0.0034307409539403753,-5.8269005362368705e-5,8.715330218992734e-8,0.0034309636874953423,-5.812488879415304e-5,8.689927969838687e-8,0.0034311290547955646,-5.804651663753494e-5,8.676002574361577e-8,0.0034312730856115364,-5.804431513186724e-5,8.675224016919222e-8,0.003431428842749821,-5.811258599710215e-5,8.686495556850346e-8,0.003431621833748501,-5.823424073945281e-5,8.706799112634763e-8,0.0034318679871170456,-5.838549788451625e-5,8.732014432177786e-8,0.0034321731793053077,-5.854001187955921e-5,8.757621999925782e-8,0.0034325337535511193,-5.8672442465983527E-05,8.779300375802679e-8,0.0034329377969641297,-5.876149483775846e-5,8.79343338304245e-8,0.0034333670820067457,-5.8792422402358875e-5,8.7975316488367e-8,0.0034337996533433854,-5.875886549720411e-5,8.790547650809066e-8,0.0034342129023982814,-5.8663743295375374e-5,8.773032040338553e-8,0.0034345867528595554,-5.8519040728693963E-05,8.747098149349937e-8,0.00343490662495616,-5.834457618854895e-5,8.716204139286165e-8,0.003435165997133961,-5.816584043444344e-5,8.684766473704805e-8,0.003435368377604481,-5.8010940498476064e-5,8.657614158669101e-8,0.003435528469312809,-5.79066894188021e-5,8.639300030976978e-8,0.0034356721817477088,-5.787374966119817e-5,8.633265875065238e-8,0.0034358346431882215,-5.7920805816179714e-5,8.640865043476558e-8,0.00343605489737805,-5.8038637339463834e-5,8.660388209222903e-8,0.0034363663675272185,-5.8196543664505935e-5,8.686495377469283e-8,0.003436784132872785,-5.834498191690136e-5,8.710692888866458e-8,0.003437293776835478,-5.8427735873480615e-5,8.72341254787051e-8,0.0034378497110881335,-5.8402092841660325e-5,8.717442687949159e-8,0.0034383882973978448,-5.8257765502926945e-5,8.691145603639477e-8,0.003438851408713721,-5.802240303565348e-5,8.649384664598423e-8,0.0034392073380863355,-5.774932951993929e-5,8.601401185593557e-8,0.0034394577744100104,-5.749559608304214e-5,8.557022184800596e-8,0.003439630233895451,-5.7303386349150334e-5,8.523451882013677e-8,0.0034397639148655676,-5.71921018810065e-5,8.503923334835471e-8,0.003439897152082377,-5.716002300749245e-5,8.498019404726612e-8,0.0034400599773055985,-5.719061355114749e-5,8.502796230293353e-8,0.0034402713672934656,-5.725932344600479e-5,8.513976877355545e-8,0.0034405393098027363,-5.7338962376120295e-5,8.52687687250456e-8,0.0034408620305790096,-5.7403458295962594e-5,8.5370360365332e-8,0.0034412295639111826,-5.74305399376233e-5,8.540661686558558e-8,0.0034416255077720182,-5.7403819017073256e-5,8.534975049941572e-8,0.0034420290593737894,-5.7314494475115625e-5,8.518502074925517e-8,0.0034424175204084556,-5.7162649725107814e-5,8.491300299198063e-8,0.0034427693744096327,-5.695780291358059e-5,8.45505703435799e-8,0.003443067694390436,-5.671827027498391e-5,8.412977141244271e-8,0.0034433033585062117,-5.6469137408961e-5,8.369422260683416e-8,0.003443477522363603,-5.6238888006486065e-5,8.329312068593308e-8,0.0034436028265143223,-5.6054927768332085e-5,8.297335687745774e-8,0.0034437028776761053,-5.593849466785818e-5,8.277067663956046e-8,0.0034438096971042514,-5.589961405993521e-5,8.270110737924363e-8,0.0034439589152577502,-5.593284157050621e-5,8.275395289466784e-8,0.0034441825909026142,-5.601493075148707e-5,8.288821797121621e-8,0.0034445001635288017,-5.610621465702858e-5,8.303535737202917e-8,0.0034449095226591654,-5.615762951966539e-5,8.311147869532069e-8,0.0034453821233687756,-5.612393855092263e-5,8.303989847633601e-8,0.003445866927768903,-5.598013860657117e-5,8.277898571579688e-8,0.003446305117155568,-5.573359851034611e-5,8.234268399454156e-8,0.003446650688170405,-5.54237541297035e-5,8.179975395214818e-8,0.003446886420895123,-5.5107576665760024e-5,8.124862318937609e-8,0.0034470267259821934,-5.483846667724602e-5,8.078097385183255e-8,0.00344710766051307,-5.464993566767857e-5,8.04536936374894e-8,0.003447171789706657,-5.455038535028025e-5,8.028012646114274e-8,0.0034472558389312216,-5.452741901483898e-5,8.02378602589795e-8,0.003447384454009153,-5.455622510521429e-5,8.028347230580017e-8,0.003447569166450617,-5.460748845901849e-5,8.036626359875367e-8,0.003447810144196527,-5.465292154467429e-5,8.043768722291936e-8,0.0034480987268725206,-5.466849659176279e-5,8.045671557812648e-8,0.003448419783191651,-5.46362499989435e-5,8.039277888315682e-8,0.003448753772593059,-5.45454637568273e-5,8.022774113086465e-8,0.0034490787902391605,-5.439364106836301e-5,7.995762374625734e-8,0.003449372967644381,-5.41872734508112e-5,7.959400330433788e-8,0.0034496174799257423,-5.394199608711304e-5,7.916430464845655e-8,0.003449800033082265,-5.368150494101013e-5,7.870985989025718e-8,0.0034499182123150364,-5.343472982432336e-5,7.828086678372597e-8,0.003449981722370573,-5.323117506956941e-5,7.792815673433031e-8,0.0034500124919465153,-5.30949612652312e-5,7.769278778854012e-8,0.0034500419488425822,-5.303878495366926e-5,7.759565134357626e-8,0.003450105483013042,-5.305939695552917e-5,7.762989261880157e-8,0.0034502349108771345,-5.3136052000312036E-05,7.775860628781301e-8,0.00345045036327994,-5.3232896856317525e-5,7.791934553656435e-8,0.0034507534559009615,-5.330563477313901e-5,7.803586216602371e-8,0.0034511239123253042,-5.331189940292976e-5,7.80359816725961e-8,0.0034515217741313154,-5.3223411868618484e-5,7.787229296285301e-8,0.0034518963778732035,-5.303630985682997e-5,7.753954870439826e-8,0.003452200772443476,-5.277494601652743e-5,7.708083438603485e-8,0.0034524067233620208,-5.24857622131667e-5,7.657676351766069e-8,0.003452513539318852,-5.222238745671445e-5,7.611970105647155e-8,0.003452546358006263,-5.202834487641089e-5,7.578401494859984e-8,0.003452545316805372,-5.1925238857953614e-5,7.56059228122419e-8,0.0034525517079226162,-5.1910531969244896e-5,7.55799748568084e-8,0.0034525973425899702,-5.1963341595560646e-5,7.566935879164173e-8,0.003452699860306806,-5.2053492925631584e-5,7.582168477769657e-8,0.003452863075258511,-5.2149607426261665e-5,7.598291155508565e-8,0.0034530799060755258,-5.222439818684115e-5,7.61063070119408e-8,0.003453335818338361,-5.2257343532068194e-5,7.615685892232103e-8,0.003453611766785339,-5.223571891965294e-5,7.61129377116946e-8,0.0034538864899658996,-5.215494408708145e-5,7.596690383151867e-8,0.003454138506384482,-5.201882998128307e-5,7.572562427973521e-8,0.003454348337076918,-5.183978826068164e-5,7.541091271463072e-8,0.0034545013314538756,-5.1638552963418784e-5,7.505903324803353e-8,0.003454591043269122,-5.144265642680074e-5,7.47179322561575e-8,0.0034546224963198295,-5.128290588661151e-5,7.444094709790633e-8,0.003454614029832736,-5.118756231866206e-5,7.427657654620211e-8,0.0034545960964780477,-5.117499667449252e-5,7.425575471974446e-8,0.0034546059759224725,-5.124696696840789e-5,7.438038383349255e-8,0.003454678971542103,-5.13853618139435e-5,7.46180167622108e-8,0.003454838496800186,-5.155451806553497e-5,7.490622976898416e-8,0.003455088410098183,-5.170923490366474e-5,7.516676020545438e-8,0.0034554104312331923,-5.18063784397559e-5,7.53256558047392e-8,0.0034557677626890567,-5.181660232781692e-5,7.533338722547459e-8,0.003456114043853787,-5.173270086815992e-5,7.517894604581043e-8,0.0034564052677747885,-5.157212308820495e-5,7.48937718027089e-8,0.003456611436614271,-5.1372648185342906e-5,7.454392055414663e-8,0.0034567244663298784,-5.118206849108857e-5,7.421205085109125e-8,0.0034567595924578005,-5.104487112438851e-5,7.397444303572169e-8,0.0034567496932292933,-5.0990411029647274e-5,7.388079046187029e-8,0.0034567348219838017,-5.1026634462844345E-05,7.394368941315555e-8,0.0034567511208470503,-5.1140910162072285e-5,7.41404001886787e-8,0.003456822969488365,-5.130640701071599e-5,7.442407063670418e-8,0.0034569600809666373,-5.149059048477161e-5,7.473844540174441e-8,0.003457158836079232,-5.166263101478568e-5,7.503054191154755e-8,0.0034574058624226842,-5.179814342816616e-5,7.525864485773623e-8,0.0034576819982162126,-5.188131487414444e-5,7.53958236160267e-8,0.003457965624434055,-5.190529764163641e-5,7.543055726802653e-8,0.003458235153642075,-5.187182989119657e-5,7.536613158997809e-8,0.003458470988800748,-5.179074706531707e-5,7.52198852644471e-8,0.0034586575036994354,-5.1679536585510255e-5,7.502247538759579e-8,0.0034587855033521653,-5.156254212189298e-5,7.481641900418598e-8,0.0034588552057932243,-5.1469030724573484e-5,7.465256143383775e-8,0.0034588791061978532,-5.142920657003421e-5,7.458297859873786e-8,0.003458883218149259,-5.1467660711166246e-5,7.464955268013278e-8,0.0034589045776179444,-5.159510836468649e-5,7.48697763858947e-8,0.0034589835250980615,-5.180135000044591e-5,7.522485150187091e-8,0.0034591517840109193,-5.205370320062124e-5,7.56573232920082e-8,0.0034594206555359705,-5.2303828254811026e-5,7.608317761780516e-8,0.0034597750906966754,-5.250174966429808e-5,7.641623908985145e-8,0.0034601771049745287,-5.2611539439694236e-5,7.659526793472266e-8,0.003460577222136936,-5.262200185778321e-5,7.660223703442587e-8,0.003460928903507887,-5.254861496345348e-5,7.646534203758294e-8,0.003461200559315436,-5.2427345790902366e-5,7.624789704143432e-8,0.0034613819623500147,-5.230371513415596e-5,7.602909490634815e-8,0.00346148446467581,-5.2220931733726785e-5,7.58833715008536e-8,0.003461536103359664,-5.2210117968981436e-5,7.586364467457609e-8,0.003461573517811942,-5.2284544913011865e-5,7.599167543503633e-8,0.0034616329485504336,-5.243864613206289e-5,7.625673698865155e-8,0.003461742549106104,-5.265142211148723e-5,7.662177846795173e-8,0.003461917703165235,-5.2892782274308036e-5,7.703449448843473e-8,0.0034621599737674246,-5.313072477304534e-5,7.74396760194996e-8,0.0034624591084389793,-5.33374098966768e-5,7.778955053911857e-8,0.003462796779292467,-5.349304510582412e-5,7.805033191515012e-8,0.003463150686187144,-5.3587487694671127e-5,7.820488911072816e-8,0.0034634980867577683,-5.362014291759816e-5,7.825256020973388e-8,0.0034638184347490337,-5.35989854743125e-5,7.820751398896041e-8,0.0034640953366142095,-5.353936163065365e-5,7.809672470592285e-8,0.0034643182806015373,-5.3462782486652334e-5,7.795785220255605e-8,0.0034644845501561154,-5.339545627403919e-5,7.783656035226323e-8,0.0034646014413177184,-5.336592005983549e-5,7.778221516267927e-8,0.0034646882637985664,-5.3400881599815127e-5,7.78405393635882e-8,0.003464776653159077,-5.351867683920702e-5,7.804231285445772e-8,0.003464906957150965,-5.372111733504216e-5,7.838949782169935e-8,0.0034651189235659127,-5.398689725856593e-5,7.884418711991946e-8,0.0034654377510551313,-5.427171287388532e-5,7.932912268318844e-8,0.003465861181889111,-5.45189747063227e-5,7.974637922620187e-8,0.0034663557995089868,-5.4679006723517416e-5,8.001057810235294e-8,0.003466866832075317,-5.4727667638690595e-5,8.008101605182355e-8,0.003467337213583027,-5.467430917764118e-5,7.997525515932372e-8,0.0034677259185634294,-5.45558137956383e-5,7.975848386026634e-8,0.0034680175758430914,-5.4421850197762574e-5,7.951758779610465e-8,0.003468221945391668,-5.431943863471243e-5,7.93341221303494e-8,0.003468366749984431,-5.4282189894998705e-5,7.926564782173139e-8,0.003468488253575451,-5.432554626942201e-5,7.933775100923389e-8,0.003468622577673265,-5.4446940976185534e-5,7.954473091422483e-8,0.00346879910386759,-5.4629139136083834e-5,7.985575566520995e-8,0.003469036315266957,-5.484531500646757e-5,8.022385234336574e-8,0.0034693400970225562,-5.506482644748267e-5,8.05959068464886e-8,0.003469704347103154,-5.525874833196587e-5,8.09221138287859e-8,0.003470113426848338,-5.54043045866477e-5,8.116348069551332e-8,0.003470545719066106,-5.548767615842907e-5,8.129655797854296e-8,0.0034709775149081618,-5.550506450046016e-5,8.131522490515083e-8,0.0034713865350294564,-5.546223505877917e-5,8.122990831469518e-8,0.00347175466700389,-5.537307165347207e-5,8.10651077332558e-8,0.003472069935483391,-5.5257707024367603e-5,8.085614780070984e-8,0.0034723279767847086,-5.514048489525153e-5,8.064555763367976e-8,0.0034725332728849033,-5.504767565387728e-5,8.047894670947377e-8,0.0034727002510506733,-5.5004592720721175e-5,8.039983781883514e-8,0.003472853897452726,-5.5031486682279284e-5,8.044249502323219e-8,0.0034730286883273595,-5.513778809238864e-5,8.062209526950794e-8,0.003473263973229728,-5.531544130156531e-5,8.092351809161323e-8,0.0034735943076693245,-5.553413717659481e-5,8.129347436960563e-8,0.003474035665897499,-5.574326882078972e-5,8.16441259001113e-8,0.0034745731955609315,-5.5884742086398796e-5,8.18752580591423e-8,0.0034751596486798657,-5.5914583892773785e-5,8.19115493205368e-8,0.003475729749079442,-5.5822556153648676e-5,8.173640984494093e-8,0.0034762246796353497,-5.563705319293436e-5,8.140033666182622e-8,0.003476612701492186,-5.541203574155975e-5,8.099801039245487e-8,0.003476895422108325,-5.52051656998577e-5,8.063001150121857e-8,0.0034771002354880218,-5.50597528893753e-5,8.037124816213464e-8,0.003477266808137206,-5.499678333889154e-5,8.025718895626209e-8,0.003477434878777277,-5.501575513956466e-5,8.028567476587208e-8,0.0034776364077081026,-5.510010155564282e-5,8.042677847876208e-8,0.0034778919129647623,-5.522370891534653e-5,8.063443431098723e-8,0.003478209655577147,-5.53567664624354e-5,8.085668027157581e-8,0.003478586484780268,-5.547053781197861e-5,8.104383769654996e-8,0.003479009745324267,-5.5541137233202974e-5,8.115488223399064e-8,0.0034794599661624203,-5.55522999409954e-5,8.116209039532e-8,0.00347991406310937,-5.5497055559913984e-5,8.105385714697197e-8,0.00348034877409459,-5.5378226962704636e-5,8.083554656447708e-8,0.003480743967899695,-5.5207701396177e-5,8.052824678244802e-8,0.003481085399356866,-5.500462615502403e-5,8.016563989201027e-8,0.003481366669257658,-5.4792906661938594e-5,7.978960191727658e-8,0.0034815903954937507,-5.459831114198394e-5,7.944505128213398e-8,0.003481768645435652,-5.444530524158718e-5,7.917429462220676e-8,0.003481922641158277,-5.435363020679066e-5,7.901097650404148e-8,0.003482081557943241,-5.43344611388244e-5,7.897344901624152e-8,0.0034822796949849086,-5.438607219406785e-5,7.90574880741661e-8,0.0034825508886991334,-5.4489814677525574e-5,7.922969966297901e-8,0.003482919510198329,-5.460863179618924e-5,7.942530879637457e-8,0.00348338922468968,-5.4691530175031036e-5,7.955606784582527e-8,0.0034839341482262006,-5.468684887826709e-5,7.953314250976801e-8,0.003484500044929782,-5.456236411226566e-5,7.930171563250027e-8,0.003485020395764967,-5.432242661163013e-5,7.887051211495277e-8,0.003485441830665722,-5.4009666442778456e-5,7.831463037203127e-8,0.003485744308334187,-5.3687830051453043e-5,7.774555423085291e-8,0.003485944356059249,-5.341619454208322e-5,7.726643890430705e-8,0.0034860824605426953,-5.323068031905013e-5,7.69391413336341e-8,0.003486205192699337,-5.313887848336849e-5,7.677573716104043e-8,0.003486351616487765,-5.312585818689202e-5,7.674902644824243e-8,0.003486546989851855,-5.3163832246076e-5,7.680975614919294e-8,0.003486802071512451,-5.322081037736187e-5,7.690188262653895e-8,0.003487115234474545,-5.326655085161755e-5,7.697289095930539e-8,0.003487475361305784,-5.3276107450321254e-5,7.697977967690026e-8,0.00348786468748232,-5.323188756023941e-5,7.689243976502786e-8,0.003488261541112851,-5.3124867656400085e-5,7.669564695902987e-8,0.0034886431118577687,-5.2955187271283527e-5,7.639006967152842e-8,0.0034889883345022694,-5.273207584356439e-5,7.599217164183895e-8,0.00348928082718179,-5.247287143335613e-5,7.553253065060545e-8,0.0034895115406157772,-5.220092938007728e-5,7.505217138911657e-8,0.0034896806403166163,-5.194253721386278e-5,7.45970984578306e-8,0.003489798281891112,-5.17231700616895e-5,7.421163449310192e-8,0.003489884081885023,-5.156346255637453e-5,7.393127924950925e-8,0.0034899651917605482,-5.1475349070217194e-5,7.37759579390884e-8,0.0034900730046242873,-5.145880727187514e-5,7.374448490150087e-8,0.0034902384487222934,-5.149957504391051e-5,7.38108940008001e-8,0.003490485713360978,-5.1568581097192085e-5,7.392383226896056e-8,0.0034908247516596694,-5.162452953725788e-5,7.401135645851316e-8,0.0034912442178913756,-5.162129070334261e-5,7.399384833356589e-8,0.0034917082870866084,-5.152067046187914e-5,7.380600775763368e-8,0.003492161919526589,-5.1307906470345714e-5,7.342344472404727e-8,0.0034925468003312904,-5.100251708159784e-5,7.28812436475048e-8,0.0034928230231711763,-5.065567102917774e-5,7.22692085054129e-8,0.00349298480607223,-5.0332008284307815e-5,7.170010948102879e-8,0.003493060486880091,-5.008509810197167e-5,7.126687367301145e-8,0.0034930978108644877,-4.994040408769448e-5,7.10129659368693e-8,0.003493144812116986,-4.989292212429899e-5,7.092852991350264e-8,0.003493236329890927,-4.991616821749949e-5,7.09664233386691e-8,0.003493389382240401,-4.997451260323819e-5,7.106400377600212e-8,0.0034936049670886314,-5.003303046878982e-5,7.116036558566628e-8,0.0034938724850190725,-5.006315699024087e-5,7.120605641471014e-8,0.003494174181710002,-5.004500801825621e-5,7.116689888635155e-8,0.003494488647240114,-4.9967898958017656e-5,7.10247226686362e-8,0.003494793491455296,-4.983017838931351e-5,7.077701977191036e-8,0.0034950676495118685,-4.963883343406836e-5,7.043629688622425e-8,0.0034952936893218015,-4.940884123717768e-5,7.00290073852739e-8,0.0034954602703394025,-4.91619116469257e-5,6.959337044053813e-8,0.003495564525333123,-4.8924164351532744e-5,6.917524860206665e-8,0.0034956137545527114,-4.872255946766232e-5,6.882178267966077e-8,0.003495625715726868,-4.858035828766625e-5,6.857332667336269e-8,0.003495626962793271,-4.8512296531638016e-5,6.845495049254806e-8,0.003495649053141319,-4.852049680516395e-5,6.846936904534974e-8,0.00349572299679345,-4.859225484338337e-5,6.859329915473242e-8,0.0034958728136478237,-4.870052145709375e-5,6.877863372874697e-8,0.003496109274904872,-4.8807474643686194e-5,6.895900381066696e-8,0.0034964250870034323,-4.887130098211752e-5,6.906179269833887e-8,0.0034967931639454048,-4.885581409325789e-5,6.902485348345956e-8,0.0034971698712657363,-4.874139651093061e-5,6.881530246607359e-8,0.0034975044920154213,-4.853405294472491e-5,6.84449092255104e-8,0.0034977539089692195,-4.82679369446728e-5,6.797415829244196e-8,0.0034978977356623906,-4.799750824878962e-5,6.749837862946622e-8,0.003497946438249529,-4.778016802970108e-5,6.71174247409688e-8,0.003497937170337883,-4.765667743097292e-5,6.690162413586374e-8,0.0034979190953097782,-4.763908471093491e-5,6.687094352623798e-8,0.003497936251514583,-4.771117288133363e-5,6.699607854306233e-8,0.0034980160892215074,-4.783863709240464e-5,6.72164958349271e-8,0.0034981665960245093,-4.798196106874302e-5,6.746304065721289e-8,0.0034983797653029723,-4.810632101892896e-5,6.7675162011292e-8,0.003498637465113023,-4.818668505636025e-5,6.780961989824135e-8,0.003498916867361659,-4.820909523255125e-5,6.784251930616007e-8,0.0034991943722301896,-4.816994545602405e-5,6.77679407084832e-8,0.003499448182358842,-4.8074658565751284e-5,6.759564195017042e-8,0.003499660159392372,-4.793641707463699e-5,6.734892080114882e-8,0.003499817561197899,-4.777495464323169e-5,6.70625616249293e-8,0.0034999149556601225,-4.761498368904733e-5,6.678005875369204e-8,0.0034999561644388504,-4.7483672003196496e-5,6.654908362581237e-8,0.003499955598723389,-4.7406752130685654e-5,6.64145242188782e-8,0.003499937981419274,-4.7403373506660164e-5,6.64093764187308e-8,0.0034999354725625304,-4.748062569635709e-5,6.654518620862992e-8,0.0034999818663642855,-4.762947778629249e-5,6.680512211808298e-8,0.003500104737353191,-4.782411608126126e-5,6.714310459443665e-8,0.0035003176166506283,-4.802589279357225e-5,6.749101949715656e-8,0.0035006147541124916,-4.819155958831892e-5,6.777333062458293e-8,0.0035009704717046735,-4.8283900302600454e-5,6.79257035406021e-8,0.0035013438418472647,-4.828195062171539e-5,6.791269545624289e-8,0.0035016879794580935,-4.818789700989003e-5,6.77394776851162e-8,0.00350196195728518,-4.8028314713332036e-5,6.7453611515929e-8,0.0035021422800556846,-4.784851634702435e-5,6.713486096804716e-8,0.0035022301857497284,-4.770064526201016e-5,6.687425034339409e-8,0.0035022515726871335,-4.762872570098612e-5,6.674801281177754e-8,0.003502248809025409,-4.76559744371242e-5,6.6795665439382e-8,0.0035022673478896467,-4.777938593190681e-5,6.701087743219682e-8,0.003502342631637575,-4.7973344665574994e-5,6.734808187955503e-8,0.0035024922414820824,-4.819969702053791e-5,6.774024524213613e-8,0.003502715017307082,-4.841926028605082e-5,6.811897897486228e-8,0.0035029954034810603,-4.8600480484494276e-5,6.842952899629088e-8,0.003503309784163736,-4.872362633221379e-5,6.863790981889476e-8,0.0035036322351094896,-4.878127146575032e-5,6.873159448741184e-8,0.0035039386022962613,-4.877672372667128e-5,6.871671928860393e-8,0.003504208970165578,-4.87218399559206e-5,6.861430714964363e-8,0.003504429141433504,-4.863501729753385e-5,6.845682584882933e-8,0.00350459182981821,-4.853945290340068e-5,6.828516088744188e-8,0.0035046979735865453,-4.846124060565817e-5,6.814520400131455e-8,0.00350475808642424,-4.842667362547513e-5,6.808297903800876e-8,0.00350479302443529,-4.845822639406622e-5,6.813746753851686e-8,0.003504833027239744,-4.8569169986268695e-5,6.833115419174137e-8,0.003504913702238319,-4.8757838383985466e-5,6.866012446657687e-8,0.0035050683853181447,-4.900391199350466e-5,6.908782646579392e-8,0.0035053182256271995,-4.926964452673352e-5,6.954751938057267e-8,0.003505663509814919,-4.950767016413277e-5,6.995616209346973e-8,0.003506080502214955,-4.967398233611283e-5,7.023720489982495e-8,0.0035065262851390663,-4.974153435641874e-5,7.034430756266863e-8,0.003506950416802348,-4.970896615211756e-5,7.027638385694825e-8,0.003507309058355678,-4.960110682063593e-5,7.0078148342398e-8,0.003507576569966767,-4.9461571981689524e-5,6.982680430100155e-8,0.003507751260505524,-4.9340525835212706e-5,6.961036660223815e-8,0.0035078543380118467,-4.928155435713404e-5,6.950463542881697e-8,0.003507923017411245,-4.931120710474176e-5,6.955507505634865e-8,0.003508000088817847,-4.943373386134086e-5,6.976794205386932e-8,0.0035081230318595195,-4.9631997266688886e-5,7.011223942234489e-8,0.003508315707408989,-4.987372010955851e-5,7.053089174394624e-8,0.003508584634184765,-5.012067906449034e-5,7.095689951327328e-8,0.003508920154172877,-5.033779131119303e-5,7.13291488630146e-8,0.0035093011174319503,-5.0499608977751295e-5,7.16036029544808e-8,0.0035097008909079027,-5.059322819724562e-5,7.175822123658268e-8,0.003510092795370233,-5.0618099620991336e-5,7.179252228933486e-8,0.0035104540074803628,-5.058396686418179e-5,7.172395576915468e-8,0.0035107678630634256,-5.050815563358695e-5,7.15831936559844e-8,0.0035110250474179707,-5.041300190160958e-5,7.140965978633763e-8,0.003511224303772449,-5.0323602655051194e-5,7.124755864747469e-8,0.003511373081760116,-5.026556563032649e-5,7.114182180173342e-8,0.0035114881227789486,-5.026219499321855e-5,7.113303314780363e-8,0.003511595434404246,-5.0330578468163386e-5,7.125049337013055e-8,0.003511728512620591,-5.047647794780582e-5,7.15033405278639e-8,0.0035119233836461974,-5.0689046876978714e-5,7.187153222950117e-8,0.003512209769178392,-5.093800093324406e-5,7.230120436607415e-8,0.003512599955153083,-5.1176799888461815e-5,7.271049692322936e-8,0.003513080034794742,-5.135392592457402e-5,7.300940477436388e-8,0.003513609502076132,-5.14298349934786e-5,7.312941724983363e-8,0.0035141320281950124,-5.139216413429823e-5,7.305001548325024e-8,0.0035145936629104664,-5.1261041454466944e-5,7.28077595651944e-8,0.003514959887450534,-5.108168091747994e-5,7.248300624823855e-8,0.0035152241266274524,-5.090867675710344e-5,7.217204520177112e-8,0.0035154059396990682,-5.078968882418096e-5,7.195828527441259e-8,0.0035155420813633245,-5.075426745699315e-5,7.189270617613542e-8,0.0035156751083582306,-5.0809654038145116e-5,7.198679130075311e-8,0.003515843117254807,-5.094257374417173e-5,7.221607476825528e-8,0.0035160725094786714,-5.112494538587068e-5,7.253048594280297e-8,0.0035163744088703465,-5.132142690619098e-5,7.286773029032713e-8,0.0035167446049327736,-5.1497064920155425e-5,7.316666417595633e-8,0.003517166385541075,-5.1623642515698906e-5,7.337826896105822e-8,0.0035176151934762446,-5.168374224689177e-5,7.347259275945112e-8,0.0035180638474490854,-5.167220679053694e-5,7.344117159692746e-8,0.003518487230567752,-5.159533656149261e-5,7.329555446259182e-8,0.0035188657466365884,-5.146856119474064e-5,7.306321274190783e-8,0.0035191873567905307,-5.13134535075297e-5,7.278232032475649e-8,0.0035194484899109596,-5.1154771029381724e-5,7.249655785721567e-8,0.0035196543025420254,-5.101775638284942e-5,7.225031546170417e-8,0.0035198186084428556,-5.0925530397301455e-5,7.208400788541844e-8,0.0035199635105888586,-5.089622436322815e-5,7.202894163244655e-8,0.003520118343208592,-5.093945103045378e-5,7.210112224469392e-8,0.0035203169511922577,-5.105206016209678e-5,7.229397007328736e-8,0.003520592065648051,-5.1214188069510806e-5,7.2571689142489e-8,0.00352096625240208,-5.138810927673326e-5,7.286756429012272e-8,0.0035214411001403445,-5.1523353653888815e-5,7.309310451119305e-8,0.0035219896591436894,-5.15702050538723e-5,7.316168179423694e-8,0.0035225589618442157,-5.149859927706176e-5,7.302152157725176e-8,0.003523085668432638,-5.1313067895405906e-5,7.268175566529078e-8,0.003523518917940908,-5.105359802726036e-5,7.221375246224139e-8,0.003523838095962248,-5.0780520742168284e-5,7.17243210762634e-8,0.0035240564761216146,-5.0552185506667285e-5,7.13161973079306e-8,0.003524211505779421,-5.040730619616483e-5,7.105688273569124e-8,0.003524349502340482,-5.035813602950126e-5,7.096680808680643e-8,0.0035245122820342207,-5.039321453053906e-5,7.102455458373297e-8,0.003524729076631242,-5.0485092313253465e-5,7.1180850127246e-8,0.003525013583176288,-5.059899047337806e-5,7.137404304621766e-8,0.003525364590777378,-5.070022815478351e-5,7.154318300099117e-8,0.0035257686958330417,-5.075977742115368e-5,7.163764186847562e-8,0.003526204144558562,-5.075793251795897e-5,7.16233638631601e-8,0.003526645154897335,-5.06861406598159e-5,7.148591957241648e-8,0.003527066167471657,-5.0547118838004726e-5,7.123062042100954e-8,0.0035274455836368955,-5.03535175473795e-5,7.088014482938875e-8,0.003527768623758874,-5.012545639882056e-5,7.047021401502236e-8,0.0035280290362206864,-4.988738877980477e-5,7.004408058198917e-8,0.0035282296839363246,-4.966483945398808e-5,6.964675729891865e-8,0.003528382291270085,-4.9481325891113706e-5,6.931952735975422e-8,0.003528506567199636,-4.935546278755109e-5,6.909476075587484e-8,0.003528628724271695,-4.929815291741338e-5,6.899092748257108e-8,0.0035287791842859104,-4.9309749713025403e-5,6.900767973450815e-8,0.0035289888641371506,-4.9377284113068966e-5,6.912119895490268e-8,0.003529283256307753,-4.947268367777429e-5,6.92813827041382e-8,0.0035296742313782816,-4.955407009659888e-5,6.941439827038625e-8,0.003530151349516904,-4.957278427309963e-5,6.943511266213218e-8,0.0035306772094212354,-4.948747198735312e-5,6.92717079077621e-8,0.003531192964839601,-4.928195652942658e-5,6.889685346018671e-8,0.0035316365215482056,-4.89774365236009e-5,6.834895029601523e-8,0.003531966575744259,-4.862874958980648e-5,6.772540073203424e-8,0.0035321786442322665,-4.830377164926679e-5,6.714615431489767e-8,0.003532303511122255,-4.805750770984733e-5,6.670788672264682e-8,0.0035323910644271955,-4.7915439884981005e-5,6.645464473265158e-8,0.003532490905278016,-4.787198094158151e-5,6.637538089556046e-8,0.0035326391070453276,-4.7899603242805185e-5,6.6420465804465665E-08,0.003532853457600977,-4.79609329089279e-5,6.652335567882734e-8,0.003533134764875135,-4.801870810507902e-5,6.661826425948239e-8,0.0035334709225311187,-4.80420607780708e-5,6.6651124930788e-8,0.0035338414892082007,-4.800969554135657e-5,6.658497123133597e-8,0.003534221883309781,-4.791109649069916e-5,6.640185991590025e-8,0.0035345870911481937,-4.774650430734176e-5,6.610271983901248e-8,0.003534914922415681,-4.7525956167852065e-5,6.570564041722356e-8,0.003535188784668761,-4.726751897573049e-5,6.524278234784632e-8,0.003535399869757837,-4.699475689773158e-5,6.475593288560843e-8,0.003535548488616758,-4.673352273796198e-5,6.429082959559262e-8,0.0035356443027719678,-4.6508419457597334e-5,6.389085743601263e-8,0.003535705452163371,-4.633936348530399e-5,6.359090277517784e-8,0.0035357567090917945,-4.623851257366044e-5,6.341187165168234e-8,0.003535826730715225,-4.6207747236638295e-5,6.335626221346214e-8,0.0035359444328626815,-4.62369186224868e-5,6.340521229944e-8,0.0035361343987252193,-4.6303140463713727e-5,6.351750974087675e-8,0.0035364112077063,-4.637182901460024e-5,6.363172583245652e-8,0.0035367731674912405,-4.640084478194753e-5,6.367372155706706e-8,0.003537197303637594,-4.634911429135081e-5,6.357183762261232e-8,0.0035376391122535576,-4.618966433176537e-5,6.327964211385549e-8,0.003538041119459337,-4.592349949638268e-5,6.280007246840904e-8,0.0035383510638224264,-4.558644822183458e-5,6.219724757422401e-8,0.0035385429814836127,-4.524104977366377e-5,6.158200500178063e-8,0.0035386287865788782,-4.495389988038994e-5,6.107183348045023e-8,0.003538652157842681,-4.477026159769317e-5,6.074602879654554e-8,0.0035386688439036844,-4.47004078804151e-5,6.062170724859673e-8,0.003538726003163398,-4.4722809906257866e-5,6.065974926915645e-8,0.0035388505435425223,-4.4797903515981296e-5,6.078947944701308e-8,0.003539047874416657,-4.488281287540454e-5,6.093489620785433e-8,0.0035393068814284787,-4.4941391084842396e-5,6.103238884542969e-8,0.003539606554146499,-4.494882794965666e-5,6.103867464873075e-8,0.003539921676724328,-4.4892499760318906e-5,6.093205597538492e-8,0.003540226919719803,-4.477102781459113e-5,6.07105950251088e-8,0.0035404997394379314,-4.4592754938286915e-5,6.03893845810904e-8,0.0035407226338242614,-4.437398906963968e-5,5.999749164758063e-8,0.003540885022134315,-4.413694086471505e-5,5.957436958624628e-8,0.0035409847601478635,-4.3907158055120185e-5,5.91653320895687e-8,0.003541029039603609,-4.371029443432704e-5,5.881578782502931e-8,0.003541034222876167,-4.3568356911767184e-5,5.856451374224705e-8,0.0035410242820919035,-4.34959360356527e-5,5.843690932693798e-8,0.0035410278165807162,-4.349704460319828e-5,5.8439391136652944e-8,0.003541073866467474,-4.35631774348635e-5,5.8556051173999174e-8,0.003541186954993939,-4.367314619920436e-5,5.874856491748497e-8,0.0035413819586960823,-4.379504612211161e-5,5.895993621631804e-8,0.003541659481115643,-4.389056974908652e-5,5.9122364071120686e-8,0.0035420026717852874,-4.392188556736655e-5,5.9169501196338025e-8,0.0035423770266627625,-4.386091460591744e-5,5.9052739202674654e-8,0.003542735137307152,-4.369954534362978e-5,5.8758966934382756e-8,0.003543027709928473,-4.345726115647605e-5,5.8323693696870554e-8,0.003543219432923343,-4.318096116450492e-5,5.783045574779396e-8,0.0035433037039722254,-4.293306375151269e-5,5.7389662664115485e-8,0.003543307510625984,-4.2770211481893025e-5,5.710096925546551e-8,0.003543281657416864,-4.2722564889928e-5,5.7016803661170176e-8,0.0035432808969128654,-4.2784998811324036e-5,5.7127048886294805e-8,0.003543345083182791,-4.29237431526913e-5,5.7371094348610354e-8,0.0035434901225729534,-4.309218173774192e-5,5.766603094543882e-8,0.0035437096200434323,-4.324625449648452e-5,5.793397699501254e-8,0.003543982437111229,-4.335377416740421e-5,5.811844457672117e-8,0.003544280963361055,-4.339731616568985e-5,5.81892230593214e-8,0.003544577345674607,-4.337307492070495e-5,5.814014309175838e-8,0.0035448472547188253,-4.328818788598209e-5,5.798423922921832e-8,0.003545071945356522,-4.315800457900615e-5,5.774893393946444e-8,0.0035452395202854154,-4.300371531604833e-5,5.7471914844255585e-8,0.0035453459408502194,-4.285012265748278e-5,5.719723861116069e-8,0.0035453958923160433,-4.2723120313231096e-5,5.697084279090594e-8,0.0035454032149012556,-4.264651128545993e-5,5.683482254338785e-8,0.0035453903011499546,-4.2638151061864956e-5,5.682050114724788e-8,0.003545385835098054,-4.270593783651835e-5,5.6941284815840156e-8,0.0035454206037119564,-4.2844639289619016e-5,5.718710304786205e-8,0.003545521737679013,-4.3034763683612925e-5,5.7522579910149e-8,0.0035457064554863466,-4.3244478586494526e-5,5.7890672855239426e-8,0.0035459768841103315,-4.343484771283477e-5,5.822218243869248e-8,0.0035463175130871715,-4.35676865911608e-5,5.8449803092231185e-8,0.003546696374372438,-4.361459001005239e-5,5.852408386886376e-8,0.003547070408275864,-4.3565227278255075e-5,5.842791123349795e-8,0.0035473947092906958,-4.343266116837182e-5,5.8185596798430805e-8,0.003547634245769986,-4.3253317404532224e-5,5.786248016398101e-8,0.003547775128552845,-4.307980993012999e-5,5.755198880500784e-8,0.0035478310759871168,-4.296686019185961e-5,5.7350653828112885e-8,0.003547840931561206,-4.295416001320256e-5,5.732790326738767e-8,0.003547856465191098,-4.305323561587963e-5,5.7503072995357236e-8,0.0035479251065484753,-4.3244764513410865e-5,5.7840967381065036e-8,0.0035480755467052556,-4.3487437490787506e-5,5.82678059755974e-8,0.003548312159234838,-4.3733132149183526e-5,5.869821561074207e-8,0.003548618609759482,-4.394085957403888e-5,5.9059893258797215e-8,0.0035489665155445534,-4.4084657379925696e-5,5.930742385274079e-8,0.0035493243155301293,-4.4155064485646884e-5,5.94246850590516e-8,0.0035496635912923074,-4.415657349882108e-5,5.942017343141657e-8,0.003549962454933137,-4.4103723515838815e-5,5.932002348157367e-8,0.0035502068853032385,-4.401745537774121e-5,5.91615814739689e-8,0.0035503910919313167,-4.392223541541534e-5,5.898836758135166e-8,0.0035505176599334156,-4.3843716170544275e-5,5.884594653272736e-8,0.0035505977261718136,-4.3806355923926305e-5,5.877765373835154e-8,0.0035506509029348764,-4.38304481117814e-5,5.881923373523053e-8,0.0035507042417583052,-4.392838644885185e-5,5.8992150582505356e-8,0.003550789375607358,-4.4100629561268414e-5,5.9296460179193444e-8,0.0035509372747178996,-4.4332623510118206e-5,5.970549942120029e-8,0.0035511709877155606,-4.459455929913146e-5,6.016568287046157e-8,0.0035514981633926815,-4.4845618151110135e-5,6.060425933750863e-8,0.0035519062473257645,-4.504285818124529e-5,6.094521953949166e-8,0.003552363010141798,-4.515265199572119e-5,6.112959670344877e-8,0.0035528232538145662,-4.516091931665212e-5,6.113348597576136e-8,0.0035532400588138987,-4.5078419810363994e-5,6.097717700290937e-8,0.0035535771481694945,-4.4939099071296303e-5,6.07218955472018e-8,0.0035538186514130496,-4.479186991256323e-5,6.045492489427308e-8,0.0035539735035672354,-4.4688098423139305e-5,6.02672442098929e-8,0.0035540731748337205,-4.466810631879039e-5,6.022963420680442e-8,0.0035541630731403067,-4.475043551216551e-5,6.037388305148787e-8,0.003554289865126375,-4.4927280773815736e-5,6.068503341769779e-8,0.0035544886846951913,-4.516779476639947e-5,6.110755581298996e-8,0.0035547745839082123,-4.542805241964009e-5,6.156319330980759e-8,0.0035551408759050616,-4.5663759910920776e-5,6.197350799964669e-8,0.003555563963135248,-4.5841008864221135e-5,6.227883337795943e-8,0.0035560116876657694,-4.5941979139417047e-5,6.24482093400329e-8,0.0035564516280192447,-4.596527201117455e-5,6.24798008660841e-8,0.003556857010155012,-4.592266312849646e-5,6.239502440655055e-8,0.003557209714814007,-4.5834565631833704e-5,6.223046308066282e-8,0.003557501080364987,-4.572581403912075e-5,6.203040815733011e-8,0.0035577315537230697,-4.562240269450946e-5,6.184110140786349e-8,0.003557910036471095,-4.554903608560832e-5,6.170637764909142e-8,0.0035580533024840793,-4.552692161730423e-5,6.166368747736406e-8,0.0035581853049642667,-4.557119728743023e-5,6.173946177102266e-8,0.0035583356940717664,-4.568768485662425e-5,6.194333838364082e-8,0.0035585365708927026,-4.586927857225371e-5,6.226185510588425e-8,0.0035588166627198116,-4.609326999183041e-5,6.265390851272246e-8,0.003559193137323904,-4.632193829336071e-5,6.30520372167614e-8,0.003559663281878733,-4.650876999059089e-5,6.337362542760012e-8,0.003560200245713937,-4.661063021140253e-5,6.354254648899662e-8,0.0035607569317794813,-4.6602396654738655e-5,6.351506594055439e-8,0.003561278648384015,-4.6487494514614917e-5,6.32983887923139e-8,0.0035617199935504846,-4.6298558243764545e-5,6.29516014692535e-8,0.003562058627582537,-4.608741314362649e-5,6.256758166751812e-8,0.0035623004672044175,-4.5909078533960046e-5,6.224430829280521e-8,0.003562475581175662,-4.5806486601264316e-5,6.205760310203278e-8,0.0035626279001984354,-4.580067735294027e-5,6.204384806523509e-8,0.003562802954124633,-4.5888015756848204e-5,6.219537779330008e-8,0.003563037055132452,-4.6043654273636875e-5,6.246701201447148e-8,0.003563350070700666,-4.622932203076322e-5,6.27901620525839e-8,0.0035637427913076075,-4.6403085941301916e-5,6.309025042503193e-8,0.003564198880158738,-4.6528682381631946e-5,6.330320173165173e-8,0.0035646903766327347,-4.658232632749611e-5,6.338736538669235e-8,0.0035651848849890845,-4.6555732749513495e-5,6.332870370697999e-8,0.0035656523705938485,-4.645535269046844e-5,6.313929883122431e-8,0.0035660700713561725,-4.6298937321714985e-5,6.285117367268997e-8,0.003566425004528302,-4.611096934697695e-5,6.250815533966789e-8,0.0035667143995241142,-4.591827694533483e-5,6.215809174271331e-8,0.0035669448573334944,-4.574655007561588e-5,6.184666832943819e-8,0.0035671310343054594,-4.561778706202556e-5,6.161284724828767e-8,0.0035672942787601126,-4.554824175451044e-5,6.148516952915002e-8,0.0035674611803288114,-4.5546361387194964e-5,6.147805454901015e-8,0.003567661543033928,-4.5610385548273515e-5,6.158757512312564e-8,0.003567924912442449,-4.5725767445714075e-5,6.178702994408387e-8,0.0035682748142848095,-4.5863544983274e-5,6.202428486357496e-8,0.0035687207877180566,-4.598192357438832e-5,6.222480065079293e-8,0.0035692503506583244,-4.603366023380281e-5,6.230484445613422e-8,0.0035698255742100237,-4.597995195287227e-5,6.219611092854864e-8,0.0035703895352063105,-4.580682740172019e-5,6.187471998839677e-8,0.003570883632004423,-4.553525834522834e-5,6.137904502638934e-8,0.003571268864222055,-4.521699225352601e-5,6.080211684283172e-8,0.0035715396695708015,-4.4916408899932836e-5,6.025908338968015e-8,0.003571723198393817,-4.468799023289393e-5,5.984686372144387e-8,0.003571866379697392,-4.456067955242553e-5,5.961625196141818e-8,0.0035720191409290983,-4.453406964456066e-5,5.956536150564443e-8,0.0035722211083410766,-4.458410992868764e-5,5.965019352482582e-8,0.003572494625911943,-4.4673173061435514e-5,5.980293252365561e-8,0.0035728434568544545,-4.476028636567257e-5,5.995034390494367e-8,0.0035732552997467812,-4.480936493091201e-5,6.002839604720158e-8,0.003573706429317807,-4.479480285769821e-5,5.99920413721776e-8,0.0035741673042217212,-4.4704415364411226e-5,5.982025244393188e-8,0.0035746082437256763,-4.45398457623661e-5,5.951659167339322e-8,0.003575004335958261,-4.43147481520429e-5,5.9105889956792483e-8,0.003575338940318722,-4.405137481478573e-5,5.862814161090186e-8,0.0035756054724064797,-4.3776367002100296e-5,5.81310100746709e-8,0.0035758075061845546,-4.3516565870462726e-5,5.766237414128631e-8,0.0035759576042431298,-4.32955011747464e-5,5.726406668644314e-8,0.003576075473322457,-4.313078064462699e-5,5.696719548910158e-8,0.0035761858511276887,-4.3032185858342236e-5,5.678871564724287e-8,0.0035763162079560256,-4.300017921430965e-5,5.672876610846801e-8,0.0035764940524594456,-4.3024605140873026e-5,5.6768438605918676e-8,0.0035767432881861085,-4.30836704446525e-5,5.686814868430869e-8,0.0035770790275487753,-4.314407216803266e-5,5.6968106744896594e-8,0.0035775010573515023,-4.3164050813275044e-5,5.699394484154996e-8,0.003577987803146952,-4.310136895375068e-5,5.6870952361826546e-8,0.0035784948165471183,-4.292678335936257e-5,5.65479221696561e-8,0.003578962840272767,-4.2639405852658924e-5,5.602429479005061e-8,0.003579336851006414,-4.227498438897039e-5,5.536473452635238e-8,0.003579588685688661,-4.18979968512765e-5,5.468488805835137e-8,0.0035797296080622783,-4.1578011198993515e-5,5.4109049105691114e-8,0.0035798042114301037,-4.1363105981440804e-5,5.372259413331688e-8,0.0035798702564199783,-4.126542984896543e-5,5.354626012529212e-8,0.0035799774382410184,-4.126391236459329e-5,5.354128307652321e-8,0.003580154993927935,-4.1317791469285e-5,5.363395239974795e-8,0.003580409608935486,-4.1381581597515776e-5,5.374262013811699e-8,0.003580729783643385,-4.1415934670145685e-5,5.3797139133405634e-8,0.003581092408746188,-4.139336320909661e-5,5.3748926352074026e-8,0.003581469034566333,-4.130007224972205e-5,5.357400193982709e-8,0.0035818310034735766,-4.1135487314135264e-5,5.3271956810880735e-8,0.0035821534692491988,-4.0910476824976e-5,5.286268340386592e-8,0.003582418418358619,-4.06446935945381e-5,5.238161243589318e-8,0.0035826166797022483,-4.0363280171443215e-5,5.187384845082181e-8,0.00358274884529989,-4.009317462540421e-5,5.1387588037206476e-8,0.003582824995614943,-3.985933882274082e-5,5.096737917280055e-8,0.0035828632611508504,-3.9681384105172434e-5,5.064806914993073e-8,0.0035828875139954875,-3.957098298811167e-5,5.045014818249678e-8,0.003582924529544475,-3.953016479695639e-5,5.0376688098463605e-8,0.00358300081862799,-3.955047708564117e-5,5.0411877426842314e-8,0.0035831392261010796,-3.961300640930363e-5,5.052117648958689e-8,0.003583355214352302,-3.968931328155379e-5,5.065319072165797e-8,0.0035836526718863154,-3.974377438611344e-5,5.074407946967609e-8,0.003584019676710392,-3.973841845099247e-5,5.072633320424865e-8,0.0035844258489106545,-3.9641235948389545e-5,5.0543575221023724e-8,0.003584824176308066,-3.943762986883524e-5,5.0170788891649215e-8,0.0035851605988330357,-3.914173842671066e-5,4.963424297277142e-8,0.0035853918960880448,-3.880043670747472e-5,4.9018405921792256e-8,0.003585505322328108,-3.848249328671764e-5,4.844644654517097e-8,0.003585527515563994,-3.8253569503164206e-5,4.803549689485371e-8,0.0035855144146158527,-3.8149888897543195e-5,4.784960245800021e-8,0.0035855273906091824,-3.8166487904675314e-5,4.787887836846632e-8,0.0035856104495281117,-3.8265157169492204e-5,4.805402080142565e-8,0.0035857798816200707,-3.8393560363288984e-5,4.828082047147677e-8,0.0035860268763078557,-3.8503227747035004e-5,4.847250586230702e-8,0.003586326680961035,-3.855986372475001e-5,4.8568113786697065e-8,0.003586648121636525,-3.8546152355993225e-5,4.853728942981486e-8,0.0035869605978639182,-3.846010828728895e-5,4.837710529272839e-8,0.003587238303345829,-3.8311783073421156e-5,4.810602981932446e-8,0.0035874625495865785,-3.811982896336047e-5,4.775775329407981e-8,0.00358762304655042,-3.790829412712801e-5,4.7375493462969575e-8,0.003587718543212155,-3.7703539314087314e-5,4.700651815697953e-8,0.0035877568854504843,-3.753109690746856e-5,4.669652828927809e-8,0.0035877543189045003,-3.741240911193318e-5,4.648378792509094e-8,0.0035877337821993926,-3.736170012036886e-5,4.639348279578213e-8,0.003587722146397466,-3.738348798138e-5,4.643324183247487e-8,0.003587746637258956,-3.747117499085622e-5,4.659063494568057e-8,0.0035878308010265218,-3.760702188597041e-5,4.683321176191194e-8,0.0035879904688035855,-3.776372946249842e-5,4.7111485215557924e-8,0.0035882302134709367,-3.790765307608103e-5,4.736488113389693e-8,0.0035885407027646038,-3.800358818517712e-5,4.753047496748133e-8,0.0035888975265631912,-3.802122612155703e-5,4.755460390198331e-8,0.003589262683625903,-3.7943134492679234e-5,4.740703403510289e-8,0.003589590313060849,-3.777295305645327e-5,4.709535929441549e-8,0.0035898376636516174,-3.754070148435225e-5,4.6674180657203245e-8,0.003589979939820703,-3.730052104784748e-5,4.6240824276023414e-8,0.003590023371945228,-3.711708048632642e-5,4.5910925049693536e-8,0.0035900077501635065,-3.7042871910765236e-5,4.577784781514526e-8,0.0035899933020088546,-3.709707415007798e-5,4.587502096050476e-8,0.003590037208575344,-3.725873614994456e-5,4.6163979998570615e-8,0.0035901730111987757,-3.747812082032692e-5,4.655494611376622e-8,0.0035904033060219416,-3.769784537258867e-5,4.6944876133643913e-8,0.003590705852666982,-3.787137405914086e-5,4.725061888805473e-8,0.0035910458330059257,-3.7972004750569304e-5,4.7424881917477886e-8,0.0035913870901548824,-3.799305368319623e-5,4.7456342834723396e-8,0.003591699210907479,-3.794340612840332e-5,4.736148608065085e-8,0.0035919606768198722,-3.7842095199116786e-5,4.7174801397497153e-8,0.0035921596171359957,-3.7713708795726786e-5,4.6940568127754947e-8,0.003592293558379161,-3.758490512066759e-5,4.6706667488679346e-8,0.0035923688823323,-3.7481625279828046e-5,4.651961895285797e-8,0.0035924001126666325,-3.742650014676788e-5,4.641991343171655e-8,0.003592408782381076,-3.743612894819133e-5,4.643708427178588e-8,0.0035924214411165024,-3.751830128528744e-5,4.6584688608919025e-8,0.0035924664696293106,-3.7669705308534085e-5,4.685621045027915e-8,0.003592569774155505,-3.7874901547291835e-5,4.7223301285490726e-8,0.003592749902450613,-3.810728859606727e-5,4.763765035237718e-8,0.0035930135281971444,-3.833251364146036e-5,4.8037268016193544e-8,0.003593352477999401,-3.85142094254474e-5,4.835692293551611e-8,0.003593743318325711,-3.862124028617287e-5,4.8541211620976406e-8,0.0035941500803349773,-3.8635219635304036e-5,4.855799005285224e-8,0.0035945303054739485,-3.8556856029829644e-5,4.8409563859566875e-8,0.0035948441441678958,-3.84093266238022e-5,4.8138450958546775e-8,0.0035950652932258955,-3.823653707192244e-5,4.7823971958565097E-08,0.003595191000352243,-3.809453371200407e-5,4.7566669363102354e-8,0.003595246796889517,-3.803631027123147e-5,4.7461060314247433E-08,0.0035952816700368603,-3.809404780623166e-5,4.756396298769029e-8,0.0035953529476908017,-3.826654280703843e-5,4.7872228760978966e-8,0.0035955064360887307,-3.851914359448242e-5,4.832290540180464e-8,0.0035957614102684605,-3.8797097685212365e-5,4.8817364790469434e-8,0.0035961074408753227,-3.904519065318432e-5,4.925659081088645e-8,0.0035965125426542463,-3.922380619036841e-5,4.9569925989950274e-8,0.0035969362675940465,-3.9315732962972006e-5,4.972712682605005e-8,0.003597341109482439,-3.932441886961113e-5,4.9735041797245097e-8,0.0035976991308152764,-3.9267828750470704e-5,4.962644042986901e-8,0.0035979941492756103,-3.917176770050048e-5,4.944797265987095e-8,0.0035982212646163817,-3.906461231436291e-5,4.925073309806581e-8,0.0035983853864858173,-3.8973731332623625e-5,4.9083882869826816e-8,0.003598499705108412,-3.8923037020490345e-5,4.899027237780294e-8,0.003598584313547959,-3.893093107139329e-5,4.900272753215885e-8,0.003598664665047769,-3.900814200916675e-5,4.914012707459969e-8,0.003598769295912446,-3.91554181102269e-5,4.940325446403414e-8,0.003598926296552057,-3.936159589408526e-5,4.9771395938974046e-8,0.0035991584178781378,-3.9603052569638225e-5,5.020149262688757e-8,0.0035994774570306106,-3.9845742495034574e-5,5.063196470603437e-8,0.003599879456446016,-4.0050595060088164e-5,5.099254875986903e-8,0.0036003427551529487,-4.018188155414745e-5,5.121939647495595e-8,0.0036008305267239238,-4.021666105614067e-5,5.127201267350899e-8,0.003601298082359539,-4.015241628723848e-5,5.114683795044416e-8,0.0036017034785005065,-4.001010080325409e-5,5.0882498429844205e-8,0.0036020186446318633,-3.983102151691306e-5,5.055393791953197e-8,0.00360223784043595,-3.966773922720605e-5,5.025583994965174e-8,0.0036023807275160397,-3.957088011118183e-5,5.0078834765566855e-8,0.0036024884440489483,-3.957514576006304e-5,5.008445593779248e-8,0.003602612836630004,-3.9688759093846825e-5,5.028643421396089e-8,0.003602801507346342,-3.9890448396384285e-5,5.064559582445518e-8,0.0036030837132397233,-4.013591224250133e-5,5.1081729897139555e-8,0.0036034625787910108,-4.037175117016467e-5,5.149873123423126e-8,0.0036039164745840613,-4.0551277524241955e-5,5.181297742668326e-8,0.0036044080529050305,-4.0646004294966926e-5,5.197384946590186e-8,0.00360489619893693,-4.064945869958866e-5,5.197041780922286e-8,0.0036053460251226866,-4.0574082061552914e-5,5.182570742191499e-8,0.0036057344318386826,-4.044453999591332e-5,5.158455566701788e-8,0.0036060514579108944,-4.029075668722807e-5,5.130104481965624e-8,0.003606299011004411,-4.01424970484346e-5,5.1028778692332877e-8,0.0036064885833287518,-4.0025849226308426e-5,5.081459498933569e-8,0.003606638973317254,-3.9961099891688534e-5,5.069476213733481e-8,0.003606774332411993,-3.9961203232245695e-5,5.069221405358963e-8,0.0036069222452277806,-4.003023028212907e-5,5.081374865009258e-8,0.0036071112182922568,-4.016168303508934e-5,5.1047028727656355e-8,0.003607366963232316,-4.033714988858951e-5,5.135826999643147e-8,0.0036077072303672525,-4.0526398781894345e-5,5.169257162187404e-8,0.0036081358410376746,-4.069044856608033e-5,5.19795998409735e-8,0.00360863791472181,-4.0788768684664725e-5,5.214662964419998e-8,0.0036091792602710175,-4.079000858969095e-5,5.2137837160242114e-8,0.003609712280943959,-4.068309768113012e-5,5.1934170132578293e-8,0.0036101880918484254,-4.04838562463079e-5,5.1565076095717744e-8,0.0036105710604826644,-4.0233135214053623e-5,5.11049366675387e-8,0.0036108500263461432,-3.998610781681087e-5,5.065355467128838e-8,0.003611041677968052,-3.9796540409886596e-5,5.0307660035659015e-8,0.0036111851665100313,-3.970186618515915e-5,5.0134017422303575e-8,0.0036113304864999287,-3.971382372907988e-5,5.0152753919674675e-8,0.0036115247250119607,-3.98167918000583e-5,5.033467938084641e-8,0.0036118001491949494,-3.997345877334354e-5,5.061180843179813e-8,0.003612167114637999,-4.013564216404726e-5,5.089703004119631e-8,0.0036126132814578962,-4.025692196720492e-5,5.110687626163271e-8,0.0036131087640671185,-4.0303479742982214e-5,5.118093281193777e-8,0.0036136150876857724,-4.026034802700086e-5,5.109292725088119e-8,0.003614094856008835,-4.0132016043704154e-5,5.085165351686192e-8,0.0036145193074628326,-3.993836208888382e-5,5.0493512681573206e-8,0.003614872292763547,-3.9708210576448246e-5,5.0070825982924494e-8,0.003615150815762236,-3.947285164647236e-5,4.9640137095099506e-8,0.0036153632808230353,-3.926096931140428e-5,4.9253097195019005e-8,0.0036155267616432177,-3.909538048400595e-5,4.89506275147321e-8,0.0036156642392711075,-3.8991230807476714e-5,4.8759693003331155e-8,0.0036158021749105296,-3.895495080175904e-5,4.86914245950835e-8,0.0036159682275933073,-3.8983383111791493e-5,4.873955389149923e-8,0.003616188577386115,-3.9062911493915725e-5,4.887889729439448e-8,0.0036164842465590077,-3.9168981167351876e-5,4.906461395007111e-8,0.003616866127419069,-3.926707099410478e-5,4.9234122993500053E-08,0.003617329348913702,-3.931673398289274e-5,4.9314522167269587e-8,0.003617849150796829,-3.928001916208648e-5,4.923780665633049e-8,0.003618381798653043,-3.913360777112033e-5,4.896267227430695e-8,0.0036188735440883186,-3.888055553865431e-5,4.849554188132768e-8,0.003619276853702225,-3.855491658006466e-5,4.789873129478229e-8,0.0036195676184713646,-3.821416389457841e-5,4.7276580612196774e-8,0.0036197545025373444,-3.792090095161403e-5,4.6742254073388355e-8,0.0036198753513412853,-3.772222272857822e-5,4.6380371688515686e-8,0.0036199830801991757,-3.763623905030227e-5,4.6222755173165736e-8,0.00362012849213772,-3.7650144684676776e-5,4.624521707582522e-8,0.003620346940104583,-3.77278873639625e-5,4.6381754134727366e-8,0.0036206519317770578,-3.7822429509832206e-5,4.654694600928876e-8,0.0036210353347296935,-3.788800232657244e-5,4.6658156643896576e-8,0.0036214722356083732,-3.7889552847069945e-5,4.665250017723497e-8,0.0036219282737146377,-3.7808250334028e-5,4.6496606350338104e-8,0.003622367558528604,-3.764294604213074e-5,4.618907856043481e-8,0.003622759613618764,-3.740807222574171e-5,4.5756568470016735e-8,0.003623084197594277,-3.7129000539556704e-5,4.524531717165578e-8,0.0036233334897944123,-3.6836271033352585e-5,4.471070197478162e-8,0.003623511822352105,-3.656004150987419e-5,4.42072171491852e-8,0.003623633625770037,-3.632568696345636e-5,4.378055463898182e-8,0.0036237204746564565,-3.615095303416537e-5,4.3462496938331666e-8,0.0036237980238943072,-3.604451542869379e-5,4.326833725239851e-8,0.0036238932087061873,-3.600542881626248e-5,4.3195891834918523e-8,0.0036240316260941043,-3.6022998605292114e-5,4.322528366433578e-8,0.003624234754252283,-3.6076927455552074E-05,4.331926852948421e-8,0.0036245165668879796,-3.613800749232242e-5,4.34246123367742e-8,0.003624879311897084,-3.617023187311202e-5,4.3476066000601294e-8,0.0036253090835464646,-3.6135726391495956e-5,4.3405390637871034e-8,0.0036257732585274127,-3.6003592967351125e-5,4.315733397260209e-8,0.0036262232058954036,-3.576186980901324e-5,4.271111422394686e-8,0.003626605331546473,-3.542823247726426e-5,4.209956869519151e-8,0.003626879436036661,-3.50518579454549e-5,4.1412337399755736e-8,0.0036270365079126123,-3.470071004044956e-5,4.0772704917605835e-8,0.0036271047904969573,-3.443736111457935e-5,4.029373159298715e-8,0.0036271389316380864,-3.429581521273013e-5,4.003629528591115e-8,0.0036271983746661196,-3.427189565117347e-5,3.999186380888534e-8,0.0036273272627723543,-3.433001504928174e-5,4.009507060595036e-8,0.0036275443605000503,-3.441929039714666e-5,4.02532013146905e-8,0.003627843559349204,-3.448978456372097e-5,4.037574941419381e-8,0.0036282007307444626,-3.450355291645972e-5,4.039436204166938e-8,0.0036285824334346233,-3.443962968437811e-5,4.027168052144104e-8,0.003628953774846586,-3.4294406238919776e-5,4.000181674287031e-8,0.003629284453436167,-3.4079224683629005e-5,3.960585055025596e-8,0.00362955288864694,-3.381643465683662e-5,3.912462715686188e-8,0.0036297485036715003,-3.353465476085004e-5,3.8610171191587416e-8,0.0036298722480067286,-3.3263883330298314e-5,3.811684927278125e-8,0.003629935574821214,-3.303104643643447e-5,3.769332757952957e-8,0.003629958188257625,-3.285642390889165e-5,3.737611903004188e-8,0.003629964993502037,-3.275128511796277e-5,3.7185320702803963e-8,0.0036299828010852926,-3.271683137367501e-5,3.712271268820873e-8,0.003630037189355566,-3.274419552984249e-5,3.7171770693712e-8,0.003630149597490292,-3.281517977483511e-5,3.729903127915843e-8,0.0036303345419651353,-3.290362286671258e-5,3.7456641443449155e-8,0.0036305967997701106,-3.297753462876925e-5,3.758635247116539e-8,0.003630928513207681,-3.300252642506156e-5,3.762587782766384e-8,0.0036313068265694214,-3.294744940956532e-5,3.7519188323039196e-8,0.00363169380297549,-3.2792780456482834e-5,3.7231652891866554e-8,0.0036320412779389313,-3.254062980327011e-5,3.676798183842747e-8,0.0036323028298620714,-3.222229600651305e-5,3.618566999286661e-8,0.00363245144150968,-3.1896535693968474e-5,3.559165692670533e-8,0.003632494924818845,-3.163343128727202e-5,3.5112974053962996e-8,0.003632477752238004,-3.148784739433187e-5,3.4848610971418145e-8,0.0036324645616411712,-3.147677766139223e-5,3.4828549478256566e-8,0.003632513929295136,-3.1574620316264846e-5,3.5005434477029905e-8,0.0036326579319382944,-3.1727711619258e-5,3.528122902984301e-8,0.0036328967617592235,-3.187682011716218e-5,3.554823526809591e-8,0.0036332061434049393,-3.197502524181992e-5,3.572156454636925e-8,0.0036335495974229026,-3.1995847248725226e-5,3.575374279393732e-8,0.003633889293870905,-3.19333227910892e-5,3.563461873953822e-8,0.003634193172744235,-3.17978842240923e-5,3.538369154094479e-8,0.003634438615965457,-3.161109030916799e-5,3.504045625380042e-8,0.003634613855985011,-3.1400671454106465e-5,3.465541572534082e-8,0.003634718071699902,-3.11961575856113e-5,3.428219175465637e-8,0.003634760562279025,-3.102500639946222e-5,3.3970535921702535e-8,0.0036347591134491177,-3.0909251987672765e-5,3.376025962304962e-8,0.003634737607805422,-3.086278268132625e-5,3.367629517795057e-8,0.0036347229490649663,-3.088948453492992e-5,3.372533325761154e-8,0.003634741563228235,-3.0982560065987805e-5,3.389460784514429e-8,0.003634815901229414,-3.112512713113596e-5,3.4153020033679004e-8,0.0036349612766972193,-3.129198170965659e-5,3.4454394956192596e-8,0.003635183245992869,-3.145240784677646e-5,3.4742669582784826e-8,0.0036354757079425717,-3.1573956992053166e-5,3.495886526255861e-8,0.0036358199160614058,-3.1627212256825974e-5,3.504983415027823e-8,0.0036361849045063073,-3.159171660721317e-5,3.4979039620345153e-8,0.003636530479561921,-3.1462895172653124e-5,3.473901011215707e-8,0.0036368142578559253,-3.1258495477149596e-5,3.436280051338025e-8,0.003637003387374721,-3.102115681331883e-5,3.3928392231956515e-8,0.003637088755021439,-3.081237158304347e-5,3.35475459720963e-8,0.003637094946225761,-3.069500019812094e-5,3.333402234292594e-8,0.0036370770559699434,-3.0708848592774254e-5,3.335935424561485e-8,0.0036371013292986853,-3.085231309250355e-5,3.361973574732224e-8,0.0036372186076369544,-3.108268917674487e-5,3.4036836713625407e-8,0.0036374461301725914,-3.133543760619602e-5,3.449300493597974e-8,0.0036377666800752285,-3.154966294649507e-5,3.4877648547478624e-8,0.003638141297749838,-3.1685759118405125e-5,3.511925103365506e-8,0.0036385252843173046,-3.173024090401332e-5,3.5193980505349496e-8,0.0036388799750885084,-3.1691380373824776e-5,3.5117541386689996e-8,0.003639178463924923,-3.1591479016366276e-5,3.493096321710203e-8,0.003639406831918024,-3.145964120367891e-5,3.4687408289269027e-8,0.0036395631103395176,-3.132641488984484e-5,3.444246310972407e-8,0.003639655535314708,-3.122008096808154e-5,3.4247456211883176e-8,0.0036397006665107633,-3.1163893875378406e-5,3.414448139816457e-8,0.003639721329488939,-3.1173806420359784e-5,3.416226804857164e-8,0.0036397441644748767,-3.125655767899938e-5,3.431270209771732e-8,0.003639796568166988,-3.140832386339877e-5,3.458839076722247e-8,0.0036399030331303018,-3.161441580614675e-5,3.49621599593727e-8,0.0036400812861970703,-3.1850493516183555e-5,3.538933414193512e-8,0.0036403388783366928,-3.2085469069802425e-5,3.581309683606768e-8,0.003640670899708472,-3.228595888933305e-5,3.617266898678714e-8,0.003641059410890908,-3.242184074945234e-5,3.6413480741849684e-8,0.003641474976614793,-3.2472192397990765e-5,3.6497992784001544e-8,0.0036418804736073327,-3.243081777099901e-5,3.6415684316993066e-8,0.0036422373048892133,-3.231046066567557e-5,3.619054998193656e-8,0.003642513965287651,-3.2144261682321465e-5,3.588351146600024e-8,0.0036426959856221573,-3.198235682061668e-5,3.5586005065773693e-8,0.0036427944977556605,-3.1881697208743154e-5,3.5401356745524745e-8,0.0036428486849075714,-3.188933045907144e-5,3.5414444145402196e-8,0.0036429173685921887,-3.202403752604784e-5,3.565852233264122e-8,0.0036430596414088368,-3.226577445343364e-5,3.609629779052436e-8,0.0036433124954249867,-3.2561078847616284e-5,3.66299793816928e-8,0.0036436776177795477,-3.284337212027593e-5,3.713830880496045e-8,0.0036441242313400286,-3.3057030277970586e-5,3.7520345040000954e-8,0.0036446041810241324,-3.317277180321848e-5,3.772337507096917e-8,0.0036450692490085615,-3.3189738563198884e-5,3.7746545722749065e-8,0.003645482899676809,-3.3128175256394194e-5,3.7627357042686266e-8,0.0036458246434632187,-3.301933774306142e-5,3.7423151774873677e-8,0.003646089234413236,-3.289707990184836e-5,3.71957515176344e-8,0.003646283665094115,-3.279244336538491e-5,3.7001641525103554e-8,0.0036464239349174375,-3.273067656021924e-5,3.6886607019548715e-8,0.0036465323149864697,-3.272957018214073e-5,3.6882747854165715e-8,0.0036466349961541663,-3.279825429446103e-5,3.700630533575309e-8,0.0036467596710251142,-3.2936106766617314e-5,3.725568811188398e-8,0.0036469325807821826,-3.313193807407561e-5,3.7610026698915855e-8,0.0036471748124150484,-3.3364069240662704e-5,3.802938859382088e-8,0.003647498169133209,-3.360210126412473e-5,3.845809149088258e-8,0.0036479015316435363,-3.38109253939106e-5,3.883209072712449e-8,0.003648368986541947,-3.395689666898082e-5,3.909027582893097e-8,0.003648870921029724,-3.401521748118757e-5,3.9187927000580045e-8,0.0036493686380024244,-3.397675991479839e-5,3.91090927084104e-8,0.0036498219897588453,-3.385230235314705e-5,3.887418894134722e-8,0.0036501985693956885,-3.367263505175776e-5,3.854000701640252e-8,0.0036504824684245895,-3.348382883038354e-5,3.819088250354824e-8,0.003650680396759058,-3.333785800459016e-5,3.792145205144569e-8,0.003650822939161007,-3.3279840876376515e-5,3.781338373671198e-8,0.003650959134371577,-3.3334613467666114e-5,3.791106516073476e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json new file mode 100644 index 0000000..3f54533 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":23000,"numberOfSamples":1000,"samples":[0.003651144035305788,-3.3496975736922465e-5,3.820410327566936e-8,0.0036514219143992843,-3.3730554777606135e-5,3.862552436820353e-8,0.0036518112676496577,-3.397791609056264e-5,3.907035721036122e-8,0.00365229870095008,-3.417907449598782e-5,3.9429383363913e-8,0.00365284489977173,-3.4290356787269744e-5,3.962343833009104e-8,0.0036533992613388363,-3.429527055965991e-5,3.962310443890886e-8,0.003653915601993734,-3.4204210437811016e-5,3.9448034728001705e-8,0.0036543625588809866,-3.404606217387052e-5,3.915149562803171e-8,0.003654726821743164,-3.385745548023324e-5,3.880065521411588e-8,0.003655011114586897,-3.367402646076845e-5,3.846060844958942e-8,0.003655229952491537,-3.352516388562213e-5,3.818482941081412e-8,0.0036554053665251193,-3.343165583497147e-5,3.8010946814686524e-8,0.0036555634966590643,-3.3404964167691095e-5,3.7959478606448984e-8,0.0036557319972541605,-3.3447035834001456e-5,3.803352192134055e-8,0.0036559377077366316,-3.355009646938942e-5,3.821840523078073e-8,0.003656203941986329,-3.3696494348695236e-5,3.848145228658821e-8,0.0036565469978612378,-3.3859223781751256e-5,3.877301569526761e-8,0.0036569720596978405,-3.4004124438745524e-5,3.9030579556823116e-8,0.003657469498455847,-3.40947073072433e-5,3.918763315500793e-8,0.003658013393850613,-3.409978236972752e-5,3.918760770228968e-8,0.0036585642841328063,-3.400250012732713e-5,3.9000338042948336e-8,0.003659077039174998,-3.380774452480385e-5,3.8635466490843415e-8,0.0036595124517896076,-3.354428513728769e-5,3.8146233975437406e-8,0.0036598488695074555,-3.325957393919969e-5,3.761980345160911e-8,0.0036600895177045143,-3.30080589998171e-5,3.7155744789631976e-8,0.0036602626699706706,-3.2836659874036776e-5,3.6839414480127626e-8,0.0036604145345912036,-3.277203283919482e-5,3.671875744486885e-8,0.003660597076071134,-3.281332359526204e-5,3.679128814107534e-8,0.0036608541980586175,-3.293230507705976e-5,3.700462952878297e-8,0.003661210012998719,-3.308093000187256e-5,3.7270537712529526e-8,0.003661662575751951,-3.320440094368456e-5,3.74888633727299e-8,0.003662185161327315,-3.325597408349231e-5,3.7574542846225874e-8,0.003662734729255613,-3.320874898829924e-5,3.747900861351535e-8,0.0036632644530644296,-3.3060666580031256e-5,3.719917570818271e-8,0.003663735688217234,-3.283177311008349e-5,3.677230797634811e-8,0.003664125550367317,-3.255600900274537e-5,3.6260899113540797e-8,0.0036644288159946347,-3.227144312843095e-5,3.573475239964142e-8,0.003664655379067319,-3.20122786606644e-5,3.525635740926294e-8,0.0036648256060508692,-3.180406776074698e-5,3.487218993328028e-8,0.0036649655917790954,-3.166186058055134e-5,3.460940215582945e-8,0.003665103342555086,-3.15901849968733e-5,3.4475849367541365e-8,0.003665265988254904,-3.158372346364206e-5,3.4461364201339914e-8,0.003665477540567749,-3.162801003528849e-5,3.4539055157405407e-8,0.0036657565338192736,-3.17000936026722e-5,3.466655892539428e-8,0.0036661130590637785,-3.176968248208968e-5,3.478820502904388e-8,0.003666545202793297,-3.180174937323968e-5,3.483986629008923e-8,0.003667035788941662,-3.1761745550580205e-5,3.475855435760227e-8,0.0036675514497473767,-3.162389916152661e-5,3.449759311569503e-8,0.003668046654744528,-3.138114071038292e-5,3.404470126419763e-8,0.0036684741721542814,-3.105261032794423e-5,3.343560777759723e-8,0.003668799974560434,-3.068345735179965e-5,3.2753539214570226e-8,0.0036690165364966303,-3.0334013759936222e-5,3.2109244036842246e-8,0.0036691474276989216,-3.0061206934846583e-5,3.160683200695938e-8,0.0036692401145173264,-2.9900241087574385e-5,3.131020806459519e-8,0.0036693503292834495,-2.9854613982101406e-5,3.122493185911916e-8,0.003669525187357138,-2.989751080207272e-5,3.1301037813817e-8,0.0036697912282753556,-2.9982013376298203e-5,3.1452001909760237e-8,0.003670149929656101,-3.0055069990531985e-5,3.15804774867729e-8,0.00367058012275416,-3.007069224005011e-5,3.160245845426072e-8,0.003671045233915078,-2.9999480736268876e-5,3.14646043020311e-8,0.00367150289146305,-2.9833136999524488e-5,3.1152343179196404e-8,0.0036719145236925356,-2.9583830819543413e-5,3.068856987855197e-8,0.0036722528819754623,-2.9279274289988172e-5,3.012451965536157e-8,0.0036725060723375516,-2.8955216659429878e-5,2.9525956515840337e-8,0.003672677754130943,-2.864755268356975e-5,2.895869275364607e-8,0.003672784291843022,-2.838594682136872e-5,2.8476927435519246e-8,0.0036728502871910297,-2.8189969093245898e-5,2.8116221838894727e-8,0.0036729039195573616,-2.8067750927584617e-5,2.7891105878276732e-8,0.0036729730472076353,-2.8016458620949784e-5,2.7795998669456532e-8,0.0036730823256591566,-2.8023639314141942e-5,2.7807699502206006e-8,0.0036732510393670506,-2.806876922500443e-5,2.7888233842029837e-8,0.0036734911388206174,-2.8124848250507907e-5,2.7987802985082756e-8,0.003673805048096844,-2.8160365318995213e-5,2.8048454388623762e-8,0.0036741831643614118,-2.8142417714421486e-5,2.800989211450284e-8,0.0036746017845311393,-2.8042014596425726e-5,2.781926303572099e-8,0.003675023305396148,-2.7842042600133794e-5,2.7445742165138232e-8,0.003675401277467576,-2.7546573380207877e-5,2.6897486202051013e-8,0.0036756920590245525,-2.718737099853137e-5,2.623340000871415e-8,0.0036758711240840844,-2.682142732552505e-5,2.555844943167183e-8,0.0036759465937811365,-2.6515692647237495e-5,2.499551903112205e-8,0.0036759605227197774,-2.6323182982489206e-5,2.464151777744949e-8,0.0036759744983032644,-2.6262593443452535e-5,2.4530039671133795e-8,0.0036760466285700347,-2.6312844659637143e-5,2.462156779143457e-8,0.0036762123044454384,-2.6424126112870143e-5,2.4824015221802194e-8,0.003676476786014314,-2.6537239075107872e-5,2.5028430559382807e-8,0.0036768192350094923,-2.6601221243758545e-5,2.5141395201407517e-8,0.0036772028513650874,-2.658386925131194e-5,2.5104237965815816e-8,0.0036775858883604795,-2.6474864491415744e-5,2.4898599976612817e-8,0.0036779306440379686,-2.6283647779182486e-5,2.4542371246482394e-8,0.003678209538973982,-2.603439997978615e-5,2.408037372138913e-8,0.003678408358108114,-2.5759783494692988e-5,2.357282896906436e-8,0.003678526948850447,-2.5494493653466036e-5,2.308351403533256e-8,0.0036785777355817883,-2.5269467883076505e-5,2.2669143006386352e-8,0.003678582593628918,-2.5107461818455048e-5,2.2371273529194018e-8,0.003678568782474355,-2.5020417507422695e-5,2.2211520779320994e-8,0.0036785647042003374,-2.500871973525351e-5,2.21902445854814e-8,0.0036785961805071692,-2.5062054156622615e-5,2.228816628316454e-8,0.003678683593958781,-2.5161266743696174e-5,2.24697994986493e-8,0.003678839813725382,-2.528068865976697e-5,2.268772363615898e-8,0.0036790686589521994,-2.5390721102639514e-5,2.28873548323344e-8,0.0036793636633603534,-2.5460766843175067e-5,2.301239734670839e-8,0.0036797070625050198,-2.5462938404665122e-5,2.3011746096490555e-8,0.0036800695540226,-2.5377224112577794e-5,2.2849032250097418e-8,0.0036804123072578534,-2.5198284596178738e-5,2.251506689142407e-8,0.003680693157902537,-2.4942526484895308E-05,2.2040681988927512e-8,0.003680878158399637,-2.4651854910035483e-5,2.150341156448466e-8,0.0036809565821238504,-2.4388619881055524e-5,2.101802531841774e-8,0.003680952179938686,-2.4218042502926116e-5,2.0704157135192892e-8,0.003680920788736872,-2.418258152607271e-5,2.063924897056901e-8,0.0036809307429876595,-2.428216159309294e-5,2.082238656290625e-8,0.0036810354111426534,-2.4473729304710523e-5,2.1173726237950885e-8,0.003681253971997315,-2.4690578711906134e-5,2.1570233191745147e-8,0.0036815697161010955,-2.4868511669727512e-5,2.1893875946001677e-8,0.00368194233743989,-2.4964629040890916e-5,2.2066135288962184e-8,0.003682324212490332,-2.496342898745231e-5,2.2059068741709067e-8,0.0036826731166814996,-2.4873277705717296e-5,2.1888636709994033e-8,0.0036829591588462465,-2.4718729832185195e-5,2.1600441398920033e-8,0.003683167023967205,-2.4532594782350245e-5,2.1255080252265367e-8,0.0036832954099022645,-2.4349370543578626e-5,2.0916081024659693e-8,0.0036833550335923348,-2.4200218198591833e-5,2.0640692551785886e-8,0.0036833658565634006,-2.410924176009306e-5,2.047307011231562e-8,0.00368335380237866,-2.4090944865297163e-5,2.0439619325797367e-8,0.0036833471475006176,-2.4148859135246296e-5,2.054650508300012e-8,0.003683372810946003,-2.4275435196936255e-5,2.07794955328708e-8,0.003683452919780664,-2.445325289733475e-5,2.110623168930102e-8,0.003683602046501696,-2.465734339942249e-5,2.1480525304410102e-8,0.003683825298735307,-2.4858264023953814e-5,2.184802813428788e-8,0.0036841172991974114,-2.5025683730293013e-5,2.2152849985111426e-8,0.0036844620856947494,-2.5132324086251992e-5,2.234486049199623e-8,0.003684833943600737,-2.5158192450841574e-5,2.2387540094785343e-8,0.0036851994497372497,-2.5095227283073492e-5,2.226654684123872e-8,0.003685521611166236,-2.495214102688181e-5,2.199854944989616e-8,0.0036857671361551635,-2.4758044853092278e-5,2.1637716007903936e-8,0.0036859169029455434,-2.4561976529873085E-05,2.127462522493109e-8,0.0036859772914223593,-2.44246555966739e-5,2.102094321803886e-8,0.0036859863765741317,-2.4400569866343113e-5,2.0976459090247287e-8,0.0036860072100742725,-2.451503865503077e-5,2.1187033549314085e-8,0.0036861059724534228,-2.4748908547852973e-5,2.1616674172997784e-8,0.003686324629094954,-2.504318975211854e-5,2.2156284356747038e-8,0.003686664486266351,-2.5323155005089623e-5,2.2668137696737203e-8,0.0036870898114569946,-2.5527244493044108e-5,2.303909962374833e-8,0.003687546149128421,-2.5624766795011134e-5,2.3213143420424893e-8,0.00368798044731879,-2.5617338941137874e-5,2.3193859568407812e-8,0.0036883539373483384,-2.5529670793774248e-5,2.3027315403045705e-8,0.0036886463867155743,-2.5397760191839542e-5,2.2780188658898496e-8,0.003688854693802478,-2.5259351496340612e-5,2.2522155643143783e-8,0.0036889891708466456,-2.5147850491353615e-5,2.231471497123031e-8,0.0036890695533378795,-2.5088946206269493e-5,2.2205016955307542e-8,0.0036891214131626097,-2.5098827308126288e-5,2.222261384963983e-8,0.0036891729137179556,-2.518329063537529e-5,2.2377841591020216e-8,0.0036892516769625227,-2.5337494371236543e-5,2.2661397865423784e-8,0.0036893816097385863,-2.554645169281843e-5,2.3045303929869593e-8,0.0036895797925711486,-2.578657672893664e-5,2.3485809567516533e-8,0.0036898538468566012,-2.6028463573269312e-5,2.392855402626147e-8,0.003690200266554174,-2.624073990187162e-5,2.431568410168666e-8,0.0036906040827712275,-2.6394652975592825e-5,2.4594312535909952e-8,0.0036910401320671615,-2.646892578198544e-5,2.4725481010514338e-8,0.0036914760290490357,-2.6454258869800837e-5,2.469246723504824e-8,0.0036918767628710283,-2.6356872170899155e-5,2.450728188668473e-8,0.003692210885339878,-2.6200462392483775e-5,2.4214168577148188e-8,0.0036924581686777775,-2.602543095805307e-5,2.388800430693621e-8,0.003692617733382483,-2.5883626505455566e-5,2.362443103435925e-8,0.0036927139953002153,-2.58271594885082e-5,2.3519158494680385e-8,0.0036927961075991973,-2.5891978747853797e-5,2.3637775773338626e-8,0.0036929267649546634,-2.6081277797364088e-5,2.398538810384016e-8,0.0036931609455419815,-2.6358161739026842e-5,2.4493348826303326e-8,0.0036935234174346435,-2.665549718890737e-5,2.5037572254635175e-8,0.003693998101314756,-2.6900775812927172e-5,2.5484402286752192e-8,0.0036945360219985063,-2.7042710855034788e-5,2.5739608547857825e-8,0.0036950760446270714,-2.7065371302568437e-5,2.57743737612283e-8,0.003695565661023816,-2.6985691375977797e-5,2.5620578062499176e-8,0.00369597274607554,-2.684069713273219e-5,2.5347080120574853e-8,0.003696287324292012,-2.667345195030066e-5,2.5033662232297028e-8,0.0036965173262114045,-2.6523010525635966e-5,2.4752456189175374e-8,0.0036966825886261623,-2.6419227346433036e-5,2.455840471365584e-8,0.003696809522700842,-2.6380986372349695e-5,2.4486064306819182e-8,0.0036969270936339123,-2.6416117172469423e-5,2.454950799475654e-8,0.0036970637745599656,-2.6521893503182198e-5,2.4743286277766767e-8,0.0036972449046433265,-2.6685737210574117e-5,2.504376987032764e-8,0.0036974900334030988,-2.6886274245188e-5,2.541115595707101e-8,0.003697810176347896,-2.7095219934198905e-5,2.5793006605434385e-8,0.0036982053804941253,-2.728057365079077e-5,2.613018555159297e-8,0.003698663356525077,-2.7411217452902692e-5,2.6365357275177697e-8,0.0036991599725369096,-2.7462484334453646e-5,2.6453253365305067e-8,0.0036996621606698965,-2.7421763096580724e-5,2.6370997112730044e-8,0.00370013328491362,-2.729281033021235e-5,2.6126029195423446e-8,0.0037005403211717563,-2.7097411250876837e-5,2.5759105766375958e-8,0.0037008616198824073,-2.6873458549975153e-5,2.534063229254157e-8,0.0037010937154705065,-2.6669054268328128e-5,2.4959623377691335e-8,0.0037012553893138378,-2.6532771677849146e-5,2.470560529795536e-8,0.003701386925754609,-2.6501162935385394e-5,2.464554459140342e-8,0.0037015427319560873,-2.65862451416973e-5,2.4800881221936585e-8,0.0037017770840136652,-2.6767600671031702e-5,2.5133175185444305e-8,0.003702126226889177,-2.6994365678892358e-5,2.5547991564237983e-8,0.003702594034496086,-2.7199503702774686e-5,2.5921361512321817e-8,0.003703149146929241,-2.7322124217394617e-5,2.6140992193989e-8,0.0037037362260185593,-2.732763109091641e-5,2.6143421934714618e-8,0.003704295665546802,-2.721607872496196e-5,2.5929372282700263e-8,0.0037047816795343263,-2.7016566312550213e-5,2.5553267597604028e-8,0.003705171555362991,-2.6773370862474705e-5,2.509745527697299e-8,0.003705465407158616,-2.6531809403462105e-5,2.4645955131628586e-8,0.0037056802842188206,-2.6328749558537203e-5,2.4266888380384873e-8,0.003705842962671197,-2.6188473724591307e-5,2.4004889346311846e-8,0.0037059839388316924,-2.6122241314280676e-5,2.3880388417301026e-8,0.0037061332623507665,-2.6129556128220352e-5,2.3892034999399584e-8,0.003706317770909461,-2.6199800840217618e-5,2.4019772205175913e-8,0.0037065589557418377,-2.6313745875571078e-5,2.4227665838511646e-8,0.003706870840343872,-2.644512355745995e-5,2.4466855843329514e-8,0.003707257688373799,-2.6562856852741105e-5,2.4679720562225874e-8,0.003707711915905993,-2.6634592082949376e-5,2.4806441695489335e-8,0.003708213120455237,-2.663186058357122e-5,2.479455939697902e-8,0.0037087294412449907,-2.6536451255494063e-5,2.4610743259413702e-8,0.003709222214515911,-2.6346543661015368e-5,2.4252099963225886e-8,0.0037096538724641567,-2.6080329046030495e-5,2.3752812169666824e-8,0.003709997524539029,-2.577492734907529e-5,2.3182040780489726e-8,0.0037102454227998637,-2.5479672505274922e-5,2.263137359655951e-8,0.0037104132986381126,-2.524481178501241e-5,2.219379012489409e-8,0.0037105385684950997,-2.5108446768208215e-5,2.1939440481081604e-8,0.003710672201591465,-2.5085405601484373e-5,2.1895121723236657e-8,0.0037108659074224157,-2.5161493732589e-5,2.2033822651041703e-8,0.0037111577917986476,-2.5295461489293446e-5,2.2278586025456243e-8,0.0037115606470070174,-2.542917933201141e-5,2.2521498478199035e-8,0.0037120571654388006,-2.5503837048517596e-5,2.2653719725711947e-8,0.003712604656330799,-2.5477070966070233e-5,2.259714366597435e-8,0.0037131481138471807,-2.5334611035146297e-5,2.232587717598007e-8,0.0037136365417578987,-2.509202414715311e-5,2.1869364929837613e-8,0.0037140360486028587,-2.4786787143587042e-5,2.1297584304020552e-8,0.0037143354755474435,-2.4465255139622436e-5,2.069678054959071e-8,0.003714544467024974,-2.4170306202152613e-5,2.0146497047207724e-8,0.003714687020580643,-2.393338515246342e-5,1.9704838425664365e-8,0.0037147941125955726,-2.3771532108372094e-5,1.9403042636394202e-8,0.0037148976705766875,-2.3687944947412868e-5,1.924662719845783e-8,0.0037150265340877417,-2.367419895466894e-5,1.9219583030809972e-8,0.003715204015883382,-2.37127525260934e-5,1.928905809182854e-8,0.0037154462776015544,-2.377915294824585e-5,1.9409457545578542e-8,0.0037157608120527794,-2.384409788521174e-5,1.9526274662557453e-8,0.0037161447586631148,-2.387597552240848e-5,1.9580823667812967e-8,0.003716583383528966,-2.384460787773986e-5,1.9517213785745727e-8,0.0037170496879362957,-2.372665990986959e-5,1.929240272445178e-8,0.003717506623292282,-2.3512366057301022e-5,1.8888665065491976e-8,0.003717913280569818,-2.3211764390501293e-5,1.832510925529357e-8,0.0037182350231976446,-2.2857213753819283e-5,1.766226069432184e-8,0.0037184549931704456,-2.2499015996168416e-5,1.69938183046161e-8,0.0037185822522199053,-2.2193400184984013e-5,1.642422937600723e-8,0.0037186520125712316,-2.1986125984029035e-5,1.6038180871423233e-8,0.0037187166025020217,-2.1897980951190913e-5,1.5873715102312037e-8,0.0037188302313518797,-2.1918094714878887e-5,1.5909975868926e-8,0.0037190333250862505,-2.200738683831528e-5,1.6073822676410523e-8,0.003719341736464505,-2.211021106517147e-5,1.6261616807192078e-8,0.003719743573072058,-2.216979978548509e-5,1.636795341593824e-8,0.0037202036700935363,-2.214280148765948e-5,1.631260873446929e-8,0.0037206737661205037,-2.2009147434640982e-5,1.6058763393847896e-8,0.0037211051970497504,-2.1775071201819367e-5,1.5618506174731158e-8,0.003721460458739193,-2.1469112666244478e-5,1.5045318183279198e-8,0.0037217205729197273,-2.113297412457324e-5,1.4417004888548999e-8,0.0037218868002361744,-2.081050254733132e-5,1.3815164650950308e-8,0.0037219772900882707,-2.0538209327698315e-5,1.3307554545741322e-8,0.003722020789722907,-2.033950176989565e-5,1.2937408851043707e-8,0.00372204987109083,-2.022296133826621e-5,1.2720322617019088e-8,0.0037220953992123298,-2.018363795951063e-5,1.2646747001885697e-8,0.0037221828649194387,-2.0205878245740093e-5,1.26873047206367e-8,0.0037223303313133104,-2.02664502220618e-5,1.2798609312135926e-8,0.003722547317866394,-2.0337344535813425e-5,1.292845264550573e-8,0.0037228339677174557,-2.0388317730423293e-5,1.3020518278734751e-8,0.003723180190839855,-2.0389705420379754e-5,1.3019629712220013e-8,0.0037235650128087322,-2.0316187736311858e-5,1.2878799919059847e-8,0.003723957027956693,-2.0152005616268402e-5,1.256897561523051e-8,0.003724317479797812,-1.9897320189773163e-5,1.2090860847159705e-8,0.0037246074892309214,-1.9573777293026863e-5,1.1485194896322013e-8,0.0037247994563825186,-1.922551672634567e-5,1.0834500081040653e-8,0.003724889413287953,-1.8911635022200557e-5,1.024891375539621e-8,0.003724903860006442,-1.8689419208005423e-5,9.834890386340725e-9,0.0037248950039658825,-1.8593936835862856e-5,9.657227552497414e-9,0.0037249241617011717,-1.8624070004157957e-5,9.713213497022367e-9,0.0037250406734058938,-1.874272347827841e-5,9.933231932671707e-9,0.003725266442256563,-1.889068343187049e-5,1.0206743013046786e-8,0.003725591957814072,-1.900639132302381e-5,1.0419161121580107e-8,0.0037259828367480837,-1.9042941445738243e-5,1.0483445088589561e-8,0.0037263919105630754,-1.8977532859680972e-5,1.0357575288150131e-8,0.0037267718541946424,-1.8812970780198845e-5,1.004722544629047e-8,0.0037270852122032435,-1.857321752592454e-5,9.597390829866145e-9,0.0037273105106150057,-1.829556589372417e-5,9.077766944676528e-9,0.0037274442822466383,-1.8021665816886436e-5,8.566019197106112e-9,0.003727499446205275,-1.7789180452793088e-5,8.132238797880786e-9,0.0037275009651962054,-1.762549477405663e-5,7.827238632585327e-9,0.003727480107433613,-1.7544324987777415e-5,7.676278027300595e-9,0.003727468693735596,-1.7545252223564655e-5,7.678260381961283e-9,0.0037274943796830745,-1.7615546114334517e-5,7.809198521585769e-9,0.0037275775048591624,-1.773333185341448e-5,8.028155894012631e-9,0.003727729461688348,-1.7871140037744037e-5,8.283855986333845e-9,0.0037279521045785026,-1.7999224672154963e-5,8.520831022886832e-9,0.0037282376812551145,-1.80885880022614e-5,8.685033780576021e-9,0.0037285690243083164,-1.8114038809190196e-5,8.729555432946514e-9,0.003728920113641478,-1.8057767593507887e-5,8.621345067804234e-9,0.0037292576952676747,-1.7913835381609194e-5,8.349624258909386e-9,0.0037295452618239825,-1.769325645659619e-5,7.935342096310923e-9,0.003729750685610381,-1.742782377238727e-5,7.438195143004906e-9,0.0037298573864923707,-1.7169070621178025e-5,6.954523489002591e-9,0.0037298756982351187,-1.6978346810287705e-5,6.598664526266755e-9,0.003729847357057938,-1.690734999300974e-5,6.466620041821976e-9,0.0037298361456615196,-1.6976011363689884e-5,6.594939654273422e-9,0.0037299052651525726,-1.716065001020904e-5,6.938856540972064e-9,0.003730092529452638,-1.7401587629302746e-5,7.386701385086378e-9,0.0037303974273488636,-1.7626624987369516e-5,7.803782958842304e-9,0.0037307856005640463,-1.7776600142330956e-5,8.080023637204767e-9,0.0037312048557727917,-1.782075236454326e-5,8.158500185359126e-9,0.0037316025984929033,-1.7758874434021704e-5,8.039315141398938e-9,0.003731938096263313,-1.7614499874872118e-5,7.76676690099454e-9,0.0037321881752387263,-1.7424800949631686e-5,7.410439462798648e-9,0.003732347832913049,-1.7230987288991442e-5,7.047285654047261e-9,0.003732427807332729,-1.7070752855394434e-5,6.747564430999931e-9,0.0037324505819447216,-1.6972951318685194e-5,6.564937105062063e-9,0.0037324456392299724,-1.695435236964585e-5,6.530439072511247e-9,0.003732444524964121,-1.701842445824136e-5,6.650238763256346e-9,0.0037324762624747466,-1.7155994000405556e-5,6.906918712508451e-9,0.003732563584080442,-1.734745000939961e-5,7.263649467205659e-9,0.003732720347862681,-1.7566052220995436e-5,7.670403442963853e-9,0.003732950305259306,-1.7781762662003478e-5,8.071102483695934e-9,0.003733247046701793,-1.796503766997897e-5,8.410658713739836e-9,0.003733594793483443,-1.8090329320746774e-5,8.641476568061361e-9,0.003733969829689655,-1.8139333953936072e-5,8.729522514097567e-9,0.0037343425695851745,-1.8104141430392796e-5,8.660245887318678e-9,0.003734680606263795,-1.7990430125363365e-5,8.444572497323546e-9,0.003734953553838489,-1.782034694147802e-5,8.124239420623847e-9,0.003735140403146867,-1.7633507226156773e-5,7.77352976095781e-9,0.003735238848109435,-1.748329459267977e-5,7.4921953391734e-9,0.003735273477531778,-1.742550583944127e-5,7.384151459049214e-9,0.0037352966592492363,-1.749922907883764e-5,7.52182191537506e-9,0.0037353759026406193,-1.7706708770883272e-5,7.908742842178216e-9,0.003735568740471046,-1.8005201420696946e-5,8.464598259716825e-9,0.003735897522340255,-1.8320262806021934e-5,9.050180658370451e-9,0.0037363400742964556,-1.8575326378219387e-5,9.522633384422312e-9,0.0037368415776035976,-1.8720037863678725e-5,9.788290822532997e-9,0.0037373380712256233,-1.874245668787921e-5,9.825363797506921e-9,0.0037377771555825133,-1.8663787364666786e-5,9.673974471483982e-9,0.0037381282616453346,-1.852433494079792e-5,9.409797508911304e-9,0.0037383834002827367,-1.8369540890756483e-5,9.117901324121186e-9,0.003738552757404369,-1.824019873721411e-5,8.874473223547163e-9,0.003738658809558917,-1.8167100505264942e-5,8.736870253285727e-9,0.003738730844138739,-1.8168783218842287e-5,8.739462794445459e-9,0.0037388003329487827,-1.8251037280980622e-5,8.892751862877826e-9,0.00373889698628947,-1.8407514500518183e-5,9.18453775255549e-9,0.0037390453516148825,-1.8621272393550024e-5,9.582855243041857e-9,0.0037392620029640536,-1.886722395403692e-5,1.0040612490717398e-8,0.0037395535311001136,-1.9115464924135617e-5,1.0501851379362463e-8,0.0037399156645016815,-1.9335279841595094e-5,1.0909231443508442e-8,0.003740333727271666,-1.949936503986908e-5,1.1211879486748627e-8,0.0037407843754003085,-1.9587781487259298e-5,1.1372730485053469e-8,0.00374123843967038,-1.9591286559904284e-5,1.1374739407503882e-8,0.003741664694071747,-1.951376722599113e-5,1.1225445494692067e-8,0.003742034426709988,-1.9373566096839915e-5,1.0959456056172562e-8,0.0037423268826330203,-1.9203348136011737e-5,1.0638143074060602e-8,0.0037425355319994974,-1.9047512251718933e-5,1.0344682395521544e-8,0.003742674153842459,-1.8955552707843683e-5,1.0171510875620036e-8,0.003742780075672932,-1.897020365172007e-5,1.0198117014107015e-8,0.003742910352084255,-1.91115247419747e-5,1.0461391980825988e-8,0.003743127236642866,-1.936274082819314e-5,1.0929372494595087e-8,0.0037434748877366456,-1.966787992300605e-5,1.1497025901544866e-8,0.0037439582292228346,-1.994830716850865e-5,1.2017239417133448e-8,0.0037445380916303205,-2.0132874757777342e-5,1.235715857869903e-8,0.003745147304945264,-2.018475709919423e-5,1.24483095139559e-8,0.003745717536123864,-2.0110039024257403e-5,1.2302602979977455e-8,0.0037462009957385913,-1.994718213155144e-5,1.1992528512288664e-8,0.003746578533952196,-1.9748112336383324e-5,1.1615631205305184e-8,0.0037468562058775336,-1.9561943110626034e-5,1.1263957057301948e-8,0.0037470568320752493,-1.942580720910747e-5,1.1006894832462288e-8,0.003747211591296955,-1.936188801722068e-5,1.0885690830408487e-8,0.0037473537091404366,-1.937798694893093e-5,1.0914592901045096e-8,0.00374751426169476,-1.9469411529319156e-5,1.1084443738119213e-8,0.003747719306811906,-1.9621107982094123e-5,1.1366715498674678e-8,0.003747987653823677,-1.98098865025236e-5,1.171772196127629e-8,0.0037483289877986337,-2.00069900657524e-5,1.2083476553019989e-8,0.0037487424409848157,-2.018133651430223e-5,1.2405790481457967e-8,0.003749216049729212,-2.0303576953806943e-5,1.262985740223278e-8,0.0037497276616432853,-2.0350656359240593e-5,1.2712744009555985e-8,0.0037502476097356495,-2.0310161881186038e-5,1.263147987969798e-8,0.0037507430698388022,-2.01836052339569e-5,1.238917732256602e-8,0.003751183640813286,-1.9987806416820744e-5,1.201762072309364e-8,0.003751547358372743,-1.975377558398845e-5,1.1575159589463945e-8,0.0037518262278624856,-1.9522888966651756e-5,1.1139487350292194e-8,0.003752030366449994,-1.9340357022812065e-5,1.0795307888503861e-8,0.003752189575101569,-1.9246075080711368e-5,1.0617115929008991e-8,0.00375235065514588,-1.926362082860626e-5,1.0648597353873207e-8,0.00375256874733072,-1.9389760757096198e-5,1.0883103913087454e-8,0.0037528923589819,-1.95889336244771e-5,1.1253515334163685e-8,0.003753345377221318,-1.9798233653190108e-5,1.1641722277737352e-8,0.003753914085684261,-1.9945444226348306e-5,1.1912441558529761e-8,0.0037545482183929373,-1.997468342657704e-5,1.1961217063101045e-8,0.003755178268860511,-1.9866841003214947e-5,1.1752664664935419e-8,0.003755740498054235,-1.9643572837075e-5,1.132790926630942e-8,0.003756196287862252,-1.9354386897528227e-5,1.078027677361611e-8,0.0037565380292510645,-1.9056473937833167e-5,1.02173374524946e-8,0.003756783287516352,-1.879808625982981e-5,9.729641408606765e-9,0.003756964059188642,-1.8610299848009276e-5,9.375278483928095e-9,0.0037571168822495586,-1.850601029274588e-5,9.178087064121487e-9,0.0037572761536310796,-1.8482743679660896e-5,9.133032553034088e-9,0.003757470458105261,-1.8526444575679007e-5,9.213386299761704e-9,0.003757720726876309,-1.8614862202039136e-5,9.377117285257808e-9,0.0037580391353763576,-1.8720347719301517e-5,9.572164083264661e-9,0.0037584281701537876,-1.88124868526117e-5,9.741392613497707e-9,0.003758879845331222,-1.886115999095588e-5,9.828343171502811e-9,0.003759375547369298,-1.884045521805883e-5,9.784556157303305e-9,0.0037598873171901443,-1.8733336140393533e-5,9.578297218737537e-9,0.0037603812993048536,-1.8536245409891986e-5,9.20316322759362e-9,0.003760823522734917,-1.826223272290799e-5,8.683933253519903e-9,0.0037611872682305502,-1.794102306496649e-5,8.07668074991078e-9,0.003761460322951104,-1.761495849043393e-5,7.461118830695648e-9,0.003761649939215854,-1.7330967802997768e-5,6.925453527388214e-9,0.003761783669047966,-1.7130080930370736e-5,6.546618226195867e-9,0.0037619052215471355,-1.7036850169632218e-5,6.370380696093653e-9,0.0037620655927134623,-1.7051287457088965e-5,6.396265383341771e-9,0.0037623107889809214,-1.7145824206739997e-5,6.571987750426438e-9,0.0037626686506996173,-1.7269316797664524e-5,6.8011328521040325e-9,0.0037631385620556235,-1.7358826009662052e-5,6.965369983083214e-9,0.003763688525936491,-1.735727517214488e-5,6.957620478797519e-9,0.0037642627046168722,-1.7231514285195872e-5,6.7159383377332736e-9,0.003764798192409383,-1.6983144070799588e-5,6.243784790204022e-9,0.003765244475384821,-1.6646684177942917e-5,5.606514320308481e-9,0.003765577041731878,-1.6276113749033035e-5,4.905976489211403e-9,0.0037658001496303955,-1.5926872483978327e-5,4.246574565661419e-9,0.003765940043113608,-1.5641428521669665e-5,3.7080826046676444e-9,0.0037660339883212393,-1.5442580188857785e-5,3.3330932819261697e-9,0.0037661202972565054,-1.533378212849883e-5,3.1277370664346276e-9,0.0037662317987403426,-1.530331931720143e-5,3.0696368494463564e-9,0.00376639269783391,-1.5329353706236113e-5,3.117459743615627e-9,0.0037666175999535394,-1.5384239766858776e-5,3.2190461479142756e-9,0.003766911424015544,-1.5437798596845338e-5,3.3175546155956647e-9,0.0037672694199051165,-1.5460010735471215e-5,3.3565118674225895e-9,0.003767677144880793,-1.5423844881946676e-5,3.285127707090549e-9,0.0037681108405431198,-1.5308808573030386e-5,3.0649759961602738e-9,0.00376853909328297,-1.5105335091860154e-5,2.678249819012819e-9,0.0037689267978603287,-1.4819271966290807e-5,2.1362017496681052e-9,0.0037692419464796334,-1.4474679157593949e-5,1.4843891964449467e-9,0.003769464408607395,-1.4112525842013234e-5,8.001758661740843e-10,0.0037695940570376656,-1.3783562552421724e-5,1.7924187200268179e-10,0.003769654513644912,-1.3535943066435279e-5,-2.877953882684514e-10,0.003769689655352273,-1.3401132828683478e-5,-5.419454827697908e-10,0.0037697528877103145,-1.3383352936094304e-5,-5.756719343471206e-10,0.0037698924838657317,-1.3456848768446041e-5,-4.379133873754168e-10,0.0037701379529232566,-1.3572133855236433e-5,-2.2219011005250034e-10,0.0037704917152187136,-1.36690613658659e-5,-4.190341608565942e-11,0.003770928286669406,-1.3692704936665648e-5,-4.184426881656405e-13,0.003771400984222682,-1.360764722503169e-5,-1.6419689144365008e-10,0.0037718542846100875,-1.3406801484918508e-5,-5.462400593197952e-10,0.0037722383742051645,-1.3112239502991186e-5,-1.1045888736203505e-9,0.0037725215280944423,-1.2767820548965187e-5,-1.756277314541145e-9,0.003772696517123917,-1.2426225277517897e-5,-2.4018373226817705e-9,0.003772779492258509,-1.2135018031827889e-5,-2.9516198186066968e-9,0.0037728027992608884,-1.1926333275018554e-5,-3.345233937647147e-9,0.003772805248437262,-1.1812618336310583e-5,-3.559509949169215e-9,0.0037728234022769208,-1.1787985186950563e-5,-3.605855082757096e-9,0.003772885871274732,-1.1832888997680663e-5,-3.5213519611769673e-9,0.0037730107830056705,-1.1919671821302818e-5,-3.3582733409701644e-9,0.0037732054834411486,-1.201738319949041e-5,-3.1750111515168823e-9,0.0037734672788120238,-1.2095393134790393e-5,-3.029308059715573e-9,0.0037737843623683997,-1.2126141515841897e-5,-2.9731078275435696e-9,0.0037741366633792803,-1.2087713479066177e-5,-3.0477005332985616e-9,0.0037744969434948855,-1.1966854684521575e-5,-3.2780044851181107e-9,0.0037748329505799573,-1.1762652811277419e-5,-3.665584516120736e-9,0.0037751117090649177,-1.1490296257088035e-5,-4.1815534879312055e-9,0.003775306671071242,-1.1183066734645489e-5,-4.762857357367671e-9,0.0037754069823609203,-1.0889694911885241e-5,-5.3173572358538974e-9,0.0037754256798606545,-1.0664706834353456e-5,-5.742147928915882e-9,0.003775401726689244,-1.0552455653838138e-5,-5.953742048116789e-9,0.003775391866454253,-1.0570337492320954e-5,-5.9196954740658214E-09,0.0037754533346908404,-1.069965404964022e-5,-5.6757115830877735e-9,0.0037756245234761812,-1.0889973474384802e-5,-5.3172574611983255e-9,0.0037759125769722722,-1.1075505491388981e-5,-4.9685789284492975e-9,0.0037762927653174714,-1.119569145297422e-5,-4.743856103245313e-9,0.0037767180710236953,-1.1211551456236634e-5,-4.716422581730153e-9,0.0037771336262513635,-1.1113289439129748e-5,-4.904484620551893e-9,0.0037774906920141566,-1.0919093669290008e-5,-5.273435637376515e-9,0.0037777568305629415,-1.0667562119560446e-5,-5.750186818487831e-9,0.0037779208867569462,-1.0406866195721732e-5,-6.243650787702565e-9,0.003777992767016646,-1.018352746019933e-5,-6.665958168127169e-9,0.0037779989182269913,-1.0033140590648544e-5,-6.949989656900959e-9,0.0037779751011073896,-9.97469904417571e-6,-7.060078675057539e-9,0.0037779584786724603,-1.0009194292538516e-5,-6.994608417451776e-9,0.0037779809048557934,-1.0121958368840203e-5,-6.781516708789922e-9,0.0037780645720082466,-1.0287344353781977e-5,-6.469394097223917e-9,0.003778220234630747,-1.047413085648688e-5,-6.1172540917545026e-9,0.003778447456985994,-1.0650388607779883e-5,-5.785368244403539e-9,0.003778735979536752,-1.078723859059365e-5,-5.528224279977244e-9,0.0037790674522738318,-1.086163687447547e-5,-5.3893085312301e-9,0.0037794172242492487,-1.0858682366088469e-5,-5.396741791551607e-9,0.003779756331525049,-1.0773944571270184e-5,-5.55883105247937e-9,0.0037800542820276006,-1.0616049404699768e-5,-5.859127603922072e-9,0.0037802835715694304,-1.0409041615552987e-5,-6.251958361016585e-9,0.0037804265587483227,-1.019284428731572e-5,-6.661632999833887e-9,0.0037804839392265306,-1.0019107510829138e-5,-6.990419724209726e-9,0.003780481632655872,-9.940027335123063e-6,-7.139785874260027e-9,0.003780470551458204,-9.990760852975178e-6,-7.043636122099973e-9,0.0037805145003715693,-1.0171924492472818e-5,-6.701260118724001e-9,0.0037806679024364473,-1.0443026877787217e-5,-6.189548974586507e-9,0.003780953749669685,-1.0734040814978671e-5,-5.640990002948598e-9,0.003781354446672115,-1.0970848138577473e-5,-5.195569712053512e-9,0.0037818202123343133,-1.1100878236964057e-5,-4.952398320323635e-9,0.0037822885451625726,-1.1106690075405191e-5,-4.9441331682067115e-9,0.0037827037918562686,-1.1004732221553931e-5,-5.139393429677356e-9,0.003783029580921028,-1.083450210581651e-5,-5.463297256101165e-9,0.0037832528926456414,-1.0645014240624529e-5,-5.8230619263333884E-09,0.003783382008619057,-1.0483107839539345e-5,-6.130107278142606e-9,0.0037834411521074293,-1.0385293670330903e-5,-6.315462602182711e-9,0.003783463866855065,-1.0373167422302901e-5,-6.338434431871988e-9,0.003783486346677699,-1.0451924135314523e-5,-6.1894075059543604e-9,0.0037835415059761126,-1.0611498941792025e-5,-5.887657773983901e-9,0.0037836543994592214,-1.0829747870240204e-5,-5.475280541301254e-9,0.0037838393893894684,-1.1076912436351042e-5,-5.00868499477498e-9,0.0037840991940355684,-1.1320547095963303e-5,-4.549244861849569e-9,0.0037844256115939245,-1.1530111692398709e-5,-4.154636535393267e-9,0.003784801380528869,-1.168067724546158e-5,-3.871892905681978e-9,0.0037852026131201958,-1.1755664641185652e-5,-3.732277813199833e-9,0.0037856015155439153,-1.1748839795853997e-5,-3.747515652641209e-9,0.003785969367532291,-1.166580442859177e-5,-3.906921033511718e-9,0.00378628001510182,-1.1525110745466617e-5,-4.175235589964458e-9,0.003786514449205436,-1.1358637205725354e-5,-4.491921267897067e-9,0.0037866667919770496,-1.1209875032777431e-5,-4.774493370527981e-9,0.0037867507548969247,-1.1128029735137191e-5,-4.929817589830909e-9,0.0037868036489551913,-1.1156279232741838e-5,-4.8764159931144795e-9,0.0037868831215570773,-1.1315159538627571e-5,-4.575860551166065e-9,0.0037870524179700496,-1.1587432273622035e-5,-4.061235434398263e-9,0.0037873563096598654,-1.1915434657407038e-5,-3.441960618087722e-9,0.0037877994416602927,-1.2218268853877623e-5,-2.871179678081107e-9,0.00378834159065941,-1.2422814649923206e-5,-2.4871089224278254e-9,0.0037889140278449785,-1.249102829822317e-5,-2.361451809750297e-9,0.0037894464319104034,-1.2428832387716597e-5,-2.4826372919214795e-9,0.003789888854569995,-1.2276000741283246e-5,-2.775033513542293e-9,0.003790220598166225,-1.2087372015433666e-5,-3.13458685349092e-9,0.003790447689810322,-1.1915907774812648e-5,-3.4609407828149515e-9,0.0037905948035725874,-1.1802236082212254e-5,-3.6772233896817644e-9,0.003790696401172688,-1.1770385986698964e-5,-3.73808626895047e-9,0.003790789335206898,-1.1827575732369238e-5,-3.6300747743801807e-9,0.003790907337032187,-1.1966138926110403e-5,-3.3679632150517645e-9,0.0037910770946163676,-1.2166553303929558e-5,-2.9889909055131355e-9,0.0037913156361942314,-1.2401135693384962e-5,-2.545809144827838e-9,0.0037916289168516333,-1.263815898674036e-5,-2.0986190900712304e-9,0.0037920116463947694,-1.2846175399722612e-5,-1.7069510131467538e-9,0.0037924484233062025,-1.299819527970367e-5,-1.4217770124520617e-9,0.0037929160329965078,-1.3075228465631499e-5,-1.2788768709480869e-9,0.0037933865555892653,-1.3068858631174979e-5,-1.294030013439374e-9,0.0037938309814365434,-1.2982776331081918e-5,-1.4601266957738199e-9,0.0037942231481280977,-1.283322743822306e-5,-1.7462770627408988e-9,0.003794543866539171,-1.2648304256008901e-5,-2.0991058430070644e-9,0.003794785242433129,-1.2465858940810928e-5,-2.4467144889246194e-9,0.0037949550625008244,-1.232927438422763e-5,-2.7067816859225326e-9,0.003795080187817642,-1.2279927284374798e-5,-2.8009626097236014e-9,0.0037952065161867134,-1.2345871523227187e-5,-2.6763892980301933e-9,0.0037953921373555235,-1.2528542983790664e-5,-2.3307936469979733e-9,0.0037956913857025054,-1.2793157015980988e-5,-1.8305356927816436e-9,0.003796132776286854,-1.3071563213552118e-5,-1.3050406169510527e-9,0.0037967017325761278,-1.328280143626571e-5,-9.077926254452141e-10,0.0037973411548898497,-1.3364516232244082e-5,-7.568234874396928e-10,0.0037979727650269374,-1.3297561018064426e-5,-8.881042448926196e-10,0.003798527090663047,-1.3109356495992466e-5,-1.2492122368724608e-9,0.003798964917021712,-1.28570520619648e-5,-1.7313517826797332e-9,0.0037992820034057637,-1.2603783737617608e-5,-2.2145093402545987e-9,0.003799500926082306,-1.240063635168012e-5,-2.6017407417391375e-9,0.0037996585584883936,-1.2278587025970907e-5,-2.8344302677579545e-9,0.0037997952173949366,-1.2248205620853774e-5,-2.892780987975255e-9,0.0037999474748775944,-1.2303191954665917e-5,-2.789037696090718e-9,0.003800144171209063,-1.2424890429828608e-5,-2.5588855394347242e-9,0.0038004044225855666,-1.2586549203308632e-5,-2.2533402981175947e-9,0.003800736709459013,-1.2757180681021012e-5,-1.9313801867040904e-9,0.0038011386726849684,-1.2905234943333781e-5,-1.6529274004774604e-9,0.0038015976307220777,-1.300228941643676e-5,-1.4718298071475957e-9,0.0038020920655212837,-1.3026745702081325e-5,-1.4288825387251392e-9,0.0038025942999659027,-1.2967137471847075e-5,-1.5456250913598982e-9,0.0038030742779153713,-1.2824453504739554e-5,-1.8199956009474816e-9,0.0038035040835843223,-1.2613005619355985e-5,-2.224696148359336e-9,0.003803862725819495,-1.2359515273662385e-5,-2.7088896073266286e-9,0.0038041406058219682,-1.210021971862752e-5,-3.203654961905564e-9,0.003804343039903815,-1.187601536262798e-5,-3.6312222314006306e-9,0.0038044921992625045,-1.172572264151848e-5,-3.9178384073525195e-9,0.00380462650870891,-1.1677577510893996e-5,-4.010014190249887e-9,0.0038047960105914956,-1.1739750231113836e-5,-3.892553967922982e-9,0.0038050522524015824,-1.1892359741202971e-5,-3.603641811340095e-9,0.0038054328722651374,-1.2085474055587181e-5,-3.238495369877979e-9,0.003805944893983198,-1.224821847258572e-5,-2.931950879082715e-9,0.003806555314129275,-1.2310374852742212e-5,-2.8173999266934114e-9,0.003807197680863527,-1.2229146407934576e-5,-2.9759540232212596e-9,0.0038077950074467274,-1.2006673466743497e-5,-3.4031768325958983e-9,0.003808287639007238,-1.1687444632760447e-5,-4.014049779331443e-9,0.003808650970431554,-1.1338022030420527e-5,-4.681632012604156e-9,0.003808896131037573,-1.1022265614456972e-5,-5.284306129734353e-9,0.0038090582406506883,-1.0784417102233183e-5,-5.738002868905132e-9,0.0038091815513970188,-1.0643809594594406e-5,-6.006202185145872e-9,0.003809307974440942,-1.0597903969188504e-5,-6.094047127429888e-9,0.0038094707196667066,-1.062865600428072e-5,-6.036147477861492e-9,0.0038096919065528753,-1.070881560223071e-5,-5.8845641294033734e-9,0.003809982306819115,-1.0806887438420577e-5,-5.699365884995947e-9,0.003810341878982876,-1.0890883083801036e-5,-5.541482188826337e-9,0.003810760558410313,-1.0931470433055232e-5,-5.466698369518253e-9,0.003811219360612792,-1.0905036479831683e-5,-5.5198308461602985e-9,0.003811692191355198,-1.0796853778255012e-5,-5.728734249431048e-9,0.0038121488378866334,-1.0604042188757008e-5,-6.098714331775193e-9,0.0038125593293713445,-1.0337543772812268e-5,-6.608803289335694e-9,0.003812899313522184,-1.0022178567600895e-5,-7.211652084835195e-9,0.003813155569947561,-9.694053505107579e-6,-7.838435889364233e-9,0.003813330410478557,-9.395101236701062e-6,-8.409236512806301e-9,0.0038134436413059824,-9.165292526420089e-6,-8.847896464769259e-9,0.0038135310890633975,-9.033789295919845e-6,-9.098924795496566e-9,0.0038136392405932478,-9.010703935907942e-6,-9.143237881021444e-9,0.0038138161247166904,-9.081404582108e-6,-9.008993457535895e-9,0.003814099382214336,-9.205645720023213e-6,-8.773169562587337e-9,0.0038145038512597245,-9.323767143029389e-6,-8.549656250554983e-9,0.003815012795942145,-9.370894020933878e-6,-8.462137200027408e-9,0.0038155779477628124,-9.29673571143693E-06,-8.606350895718982e-9,0.0038161315938342274,-9.08397255339519e-6,-9.015063906599803e-9,0.0038166080185463146,-8.755923206484596e-6,-9.64348405426532e-9,0.003816965037754244,-8.368207760136484e-6,-1.0385219024877421e-8,0.003817195248806939,-7.988222530295059e-6,-1.1111520776134655e-8,0.0038173229340541176,-7.673167559394442e-6,-1.1713278449963451e-8,0.0038173910001939285,-7.456361956860252e-6,-1.212711923818663e-8,0.0038174460930694254,-7.344703089557365e-6,-1.234016488954878e-8,0.0038175278039535875,-7.323953104584782e-6,-1.2379836417372083e-8,0.00381766349450458,-7.3667834734719346E-06,-1.2298441630227018e-8,0.003817867345920316,-7.44006181186134e-6,-1.2159268639340678e-8,0.003818141527292887,-7.510114938000029e-6,-1.2026573341010378e-8,0.003818477933177015,-7.546220680736763e-6,-1.1958946292781465e-8,0.003818859819405176,-7.523169308927341e-6,-1.2004439996582582e-8,0.0038192634063506886,-7.4236603910782554e-6,-1.2196000644852678e-8,0.0038196599709800997,-7.2408663983656445e-6,-1.254657877456703e-8,0.003820019070571289,-6.980898470168708e-6,-1.3044426574530458e-8,0.0038203132898458427,-6.664287919255013e-6,-1.3650268900585339e-8,0.0038205242460868597,-6.325154432293589e-6,-1.4298887743684189e-8,0.0038206486164603457,-6.006817141678243e-6,-1.4907506500728048e-8,0.0038207020750147184,-5.75354803338733e-6,-1.5391558345619086e-8,0.0038207189146382747,-5.599839594091006e-6,-1.568521212544733e-8,0.0038207461938191602,-5.560151445206347e-6,-1.5760970711142652e-8,0.00382083315281559,-5.622636517693993e-6,-1.5641635859755003e-8,0.003821018492077559,-5.749455228146534e-6,-1.5399662200224305e-8,0.0038213190875863523,-5.884391306755396e-6,-1.5142562499287096e-8,0.0038217235693960125,-5.966361142703782e-6,-1.4987076158289204e-8,0.0038221931563597426,-5.9456270845393625e-6,-1.502819170366169e-8,0.0038226704818977797,-5.798272337779563e-6,-1.531149257821805e-8,0.0038230947974088572,-5.5340664292121286e-6,-1.581812655956149e-8,0.0038234191450172406,-5.194116998158923e-6,-1.6469310260958883e-8,0.003823623312951976,-4.838285790666961e-6,-1.7150435861376128e-8,0.0038237175482825378,-4.526986941152714e-6,-1.7745939341755873e-8,0.0038237362016777052,-4.3046651521168036e-6,-1.8170927741837015e-8,0.003823725137708133,-4.1908453164058315e-6,-1.8388262055022257e-8,0.003823728754133948,-4.180212251173304e-6,-1.8408322336149633e-8,0.0038237809830387044,-4.2490079943162265e-6,-1.8276693046141356e-8,0.0038239015028385787,-4.363551982793333e-6,-1.8057833412152605e-8,0.003824095946593768,-4.487740674388706e-6,-1.7820751134813358e-8,0.003824358126063857,-4.588281903972761e-6,-1.7629039709488436e-8,0.0038246727136478013,-4.637862217435199e-6,-1.753487003336477e-8,0.003825017627068585,-4.61711276381841e-6,-1.7575256806811815e-8,0.003825366118825118,-4.516259894351772e-6,-1.7768895996776932e-8,0.0038256891088083935,-4.336919177129825e-6,-1.8112701958105336e-8,0.0038259584950023394,-4.093846046758095e-6,-1.8578421203903003e-8,0.00382615197722384,-3.815735474025295e-6,-1.9111084395452904e-8,0.0038262592364493595,-3.543489200549398e-6,-1.963234108463913e-8,0.0038262880282502877,-3.3242349858685718e-6,-2.005195595532296e-8,0.0038262672917729517,-3.200584377536259e-6,-2.0288421016364784e-8,0.0038262439982333636,-3.197318624244381e-6,-2.029444817156697e-8,0.003826272400189211,-3.3105522427901474e-6,-2.0077656752741834e-8,0.0038263982363601133,-3.505059768382942e-6,-1.9705603558615896e-8,0.003826643866615569,-3.7224637285441357e-6,-1.929005491723827e-8,0.003827000550067141,-3.897808129259171e-6,-1.8955276671465806e-8,0.0038274307773840765,-3.9781801362031975e-6,-1.8802446818552187e-8,0.0038278791501668245,-3.936838386802747e-6,-1.8882656721060616e-8,0.003828287511464482,-3.7789936758587133e-6,-1.91858484343628e-8,0.003828609599833306,-3.538639788532877e-6,-1.9646859993872794e-8,0.0038288214789188135,-3.2682591437941436e-6,-2.01651251887211e-8,0.0038289254924217973,-3.0247269062595245e-6,-2.0631684713590868e-8,0.0038289472814131997,-2.855414110560565e-6,-2.0955834728401942e-8,0.0038289273259179074,-2.788188187669053e-6,-2.108429624581785e-8,0.0038289100096469695,-2.827593307999e-6,-2.100851341943847e-8,0.0038289336504991763,-2.957270847791984e-6,-2.0759969177050435e-8,0.0038290239989857604,-3.1466075062872564e-6,-2.0397397678011425e-8,0.0038291919363631554,-3.358735621529485e-6,-1.9991428033826533e-8,0.0038294345412146105,-3.5575484015966483e-6,-1.9611153660184545e-8,0.0038297379974115684,-3.7126062375014595e-6,-1.931477643950267e-8,0.0038300809546290265,-3.8019422327944494e-6,-1.9144289526878937e-8,0.003830437556664625,-3.813471476213471e-6,-1.9122815383613343e-8,0.0038307800423785735,-3.7458453013279217e-6,-1.925296167705247e-8,0.0038310813355700818,-3.6092600087004904e-6,-1.951522260747604e-8,0.003831318289772106,-3.4261620143933223e-6,-1.9866570427390518e-8,0.0038314761727888578,-3.2310651372663914e-6,-2.024078705408704e-8,0.003831554328173983,-3.067891478985199e-6,-2.0553606536838275e-8,0.00383157155253598,-2.9829338185445362e-6,-2.071629056719002e-8,0.0038315679388297268,-3.0127134004410304e-6,-2.0658964500687748e-8,0.0038315991481782685,-3.1692879484097765e-6,-2.0358751628086406e-8,0.0038317214021556132,-3.429727904878386e-6,-1.9859827008455862e-8,0.0038319713636641617,-3.7377031114383478e-6,-1.9270251199510938e-8,0.003832350581616624,-4.0199454376947184e-6,-1.8730381252591345e-8,0.003832823444733821,-4.211063811726861e-6,-1.8365375552540856e-8,0.0038333298168283644,-4.2746105018214276e-6,-1.82449115700899e-8,0.0038338051698647065,-4.211439514210527e-6,-1.8367216874901712e-8,0.003834198761806769,-4.0546278942909735e-6,-1.8668806860764246e-8,0.003834484151940069,-3.856273197654131e-6,-1.9049773936193798e-8,0.0038346613147808603,-3.6724518049993973e-6,-1.940260611015573e-8,0.0038347524550533677,-3.550605899014387e-6,-1.9636361789940677e-8,0.0038347942577808274,-3.52127028068912e-6,-1.969253972068335e-8,0.0038348288874075678,-3.5944825007219915e-6,-1.9551978029488838e-8,0.0038348954913967792,-3.7604912766397788e-6,-1.9233502467926943e-8,0.0038350235792819626,-3.9939514459539405e-6,-1.8785861778853742e-8,0.0038352291926199416,-4.260277158951203e-6,-1.8275496622939114e-8,0.003835514073341714,-4.522523088560736e-6,-1.7773291753942183e-8,0.0038358673369616493,-4.7473979554075516E-06,-1.7343025332758908e-8,0.0038362687210526454,-4.9095732722181525e-6,-1.7033139263666595e-8,0.00383669236799276,-4.99408908331157e-6,-1.6872194841765404e-8,0.003837110381916312,-4.997253315309627e-6,-1.6867206012024054e-8,0.0038374959397268127,-4.926686817006647e-6,-1.7003556999435392e-8,0.003837826168240292,-4.800973729438346e-6,-1.724561889505605e-8,0.0038380852198412027,-4.64897087800454e-6,-1.7538006826362915e-8,0.0038382680055769084,-4.508244405378731e-6,-1.780856000998818e-8,0.0038383845372422826,-4.4213473667315845e-6,-1.7975542156029803e-8,0.0038384635487548452,-4.428331072852901e-6,-1.7962111992879813e-8,0.003838552412999034,-4.554891468079644e-6,-1.7719129920892407e-8,0.003838709449637709,-4.79857611780019e-6,-1.7251579776228027e-8,0.003838986727658379,-5.120008018211622e-6,-1.6635275122453434e-8,0.0038394080255532118,-5.448208410521412e-6,-1.6006525398447498e-8,0.0038399539523913803,-5.703228860578149e-6,-1.5518689679738132e-8,0.003840565607656355,-5.826728491288216e-6,-1.5283563189269852e-8,0.0038411666084649057,-5.803303992373885e-6,-1.5330502316579828e-8,0.003841690669226006,-5.6615015185918996e-6,-1.5604511736937722e-8,0.0038421002535852433,-5.457713918832178e-6,-1.5997183329700725e-8,0.0038423907809453407,-5.254822630049416e-6,-1.6387728287251544e-8,0.003842584084612968,-5.1054363205735894e-6,-1.6675159725889587e-8,0.0038427176193724898,-5.043044755021766e-6,-1.6795248365588627e-8,0.003842834018332966,-5.07989312250766e-6,-1.6724578044920652e-8,0.003842972942410085,-5.209054269116863e-6,-1.6476567824802356e-8,0.0038431654789848045,-5.4086399567047076e-6,-1.60933997922233e-8,0.00384343077449617,-5.647036470412883e-6,-1.563595510392797e-8,0.00384377466746861,-5.888566057774086e-6,-1.5172890552403953e-8,0.003844190175581018,-6.098988812967744e-6,-1.477000694122479e-8,0.0038446595948861905,-6.250255466342545e-6,-1.4481091439427506e-8,0.003845157818995818,-6.324023724179862e-6,-1.4341201409106802e-8,0.0038456562996112983,-6.313615647304992e-6,-1.4362989566193652e-8,0.003846127011783707,-6.224437602563978e-6,-1.4535971378501742e-8,0.003846546039512686,-6.073206328661482e-6,-1.4828020425045514e-8,0.0038468967151338742,-5.886318244836747e-6,-1.518844046641186e-8,0.0038471724104394123,-5.6974965543184785e-6,-1.5552409101517088e-8,0.0038473791476006172,-5.544524492413738e-6,-1.5847232591313744e-8,0.0038475379016441485,-5.464345014145458e-6,-1.6001824499551356e-8,0.0038476855030219305,-5.485613097100651e-6,-1.596112434254084e-8,0.003847871879727775,-5.6186931393504005e-6,-1.5705383768277254e-8,0.0038481508803807564,-5.845389848453475e-6,-1.526986177286528e-8,0.003848563503714657,-6.114171536753636e-6,-1.4753886498476955e-8,0.0038491178160156275,-6.348715588209728e-6,-1.4304328128888127e-8,0.0038497770085141143,-6.472740813382431e-6,-1.4067840281603289e-8,0.0038504673064347367,-6.441502007513236e-6,-1.4130328256331074e-8,0.0038511053849232322,-6.261082594443713e-6,-1.4479857491646347e-8,0.003851629844832358,-5.983091492067725e-6,-1.5016874116127136e-8,0.003852018859395578,-5.680152288202065e-6,-1.5601434430578248e-8,0.0038522882875718684,-5.418923444947771e-6,-1.6105201466218447e-8,0.0038524776393092323,-5.243503092060938e-6,-1.644339124890214e-8,0.0038526343526436983,-5.171293042120779e-6,-1.658266798991624e-8,0.0038528022610099396,-5.196803821713961e-6,-1.6533754071038998e-8,0.003853015203081441,-5.2983925912731155e-6,-1.6338444310091512e-8,0.003853294442269686,-5.444945618229092e-6,-1.6056762373860484e-8,0.0038536482567425854,-5.601504835855946e-6,-1.5756133822008962e-8,0.0038540726814287585,-5.7339517789242305e-6,-1.550233250246981e-8,0.0038545530770026947,-5.813032433141409e-6,-1.535167747524828e-8,0.003855066511348219,-5.817774971569551e-6,-1.5344433001374196e-8,0.0038555849763886965,-5.738119863076067e-6,-1.5499788248752717e-8,0.0038560793166990247,-5.576384824864866e-6,-1.5813120373490353e-8,0.0038565234608473496,-5.347216994734051e-6,-1.6256150387493468e-8,0.0038568984147355433,-5.075979025649893e-6,-1.678004601450871e-8,0.00385719557764678,-4.795731754718215e-6,-1.7321162029551486e-8,0.0038574190570229696,-4.543041028615571e-6,-1.780903983008837e-8,0.003857586762326891,-4.352859428110214e-6,-1.817625138390654e-8,0.003857730049101876,-4.252572787910336e-6,-1.8369938134093778e-8,0.0038578912513364937,-4.255213948707043e-6,-1.8364992404288677e-8,0.003858117874957074,-4.3525404651654585e-6,-1.8177456727680517e-8,0.003858452354547486,-4.510210597999658e-6,-1.7873784612501723e-8,0.003858917791777117,-4.669051428707108e-6,-1.756829129472984e-8,0.003859503672194377,-4.756979406824098e-6,-1.7400082133742694e-8,0.003860160107605068,-4.712384004790362e-6,-1.7487936966225806e-8,0.0038608091664962376,-4.510570068775836e-6,-1.7879323414882926e-8,0.003861372398538454,-4.177424357879907e-6,-1.8524047943606895e-8,0.003861800506333025,-3.7795425476321384e-6,-1.9293349565570984e-8,0.0038620880164654562,-3.396288792625095e-6,-2.0033913711143205e-8,0.003862267166860147,-3.0911799396654256e-6,-2.062317555474824e-8,0.0038623893494130436,-2.8966628210158406e-6,-2.099867596807234e-8,0.003862506563495998,-2.8140990119499413e-6,-2.115798768293966e-8,0.0038626598321244918,-2.822389550608056e-6,-2.114198102596278e-8,0.003862874873005275,-2.8882527356427605e-6,-2.1014973901108832e-8,0.003863162336153394,-2.9744902195046028e-6,-2.0848814677809523e-8,0.0038635199304515298,-3.045533830271848e-6,-2.0712205478631623e-8,0.0038639348992436243,-3.0710234770790767e-6,-2.066378398501029e-8,0.0038643864355204357,-3.028367117469868e-6,-2.0747147455070232e-8,0.00386484822728367,-2.904831494192115e-6,-2.0986801911394604e-8,0.0038652914752601592,-2.699236644680084e-6,-2.1384920240420773e-8,0.003865688624510196,-2.4228755743300013e-6,-2.191962018272638e-8,0.00386601767419727,-2.0990064949875313e-6,-2.2545976090700474e-8,0.003866266452299767,-1.760409030734062e-6,-2.3200715561079226e-8,0.0038664359843247702,-1.4449098341719433e-6,-2.3810796904036255e-8,0.0038665420780329414,-1.1892409375748905e-6,-2.4305217895457498e-8,0.003866614450261009,-1.0220808697119544e-6,-2.4628464023641513e-8,0.0038666931331427633,-9.574329517630934e-7,-2.4753373068809092e-8,0.00386682224894407,-9.894664267422647e-7,-2.469119648990868e-8,0.0038670414158975728,-1.0900193002419434e-6,-2.449647640784153e-8,0.0038673755149895308,-1.2103925169421118e-6,-2.4263553007702945e-8,0.0038678247276590877,-1.2892296045959293e-6,-2.4111252377403624e-8,0.003868358444959499,-1.267252656795297e-6,-2.4154311249935473e-8,0.0038689178723244452,-1.106609395965305e-6,-2.446591385034712e-8,0.0038694306364283385,-8.077989637281885e-7,-2.504494355576824e-8,0.0038698345342124824,-4.141703486132289e-7,-2.5807311711834674e-8,0.003870099809101716,1.7314109784301966e-9,-2.661245619101961e-8,0.0038702378083155316,3.6458720020279093e-7,-2.7314567339474627e-8,0.0038702920854368386,6.214663267685033e-7,-2.7811317375819918e-8,0.0038703190910244194,7.53858335647063e-7,-2.8067074676155508e-8,0.00387036974897286,7.748010931081934e-7,-2.8107228302703305e-8,0.0038704788581488724,7.175311052953002e-7,-2.7996153658333026e-8,0.0038706626331334653,6.232083040671878e-7,-2.781347285744613e-8,0.0038709211656908133,5.318687125353667e-7,-2.7636609917695287e-8,0.003871242513436442,4.772284502188831e-7,-2.753078648423058e-8,0.003871606525933271,4.841804967947889e-7,-2.754418615260003e-8,0.0038719879135084533,5.675785755217659e-7,-2.7705577960566147e-8,0.003872358880346966,7.314004543716178e-7,-2.8022675148351287e-8,0.0038726919022138077,9.680249185641712e-7,-2.8480732932027746e-8,0.003872963138652044,1.2579586782204766e-6,-2.9042030043767234e-8,0.00387315657601737,1.5708285211382788e-6,-2.9647789466682646e-8,0.0038732683373289547,1.86855923238929e-6,-3.0224309921934445e-8,0.0038733099271485473,2.1112153111972303e-6,-3.069424612561177e-8,0.003873308852725411,2.2650543922665764e-6,-3.0992188082449424e-8,0.0038733053736022243,2.3111642765606837e-6,-3.108140596859698e-8,0.003873345192169577,2.2521788410355123e-6,-3.0966904370240415e-8,0.0038734693367986866,2.1146262125177263e-6,-3.0700024716839653e-8,0.003873703593536369,1.9454980220390796e-6,-3.037183659191588e-8,0.0038740502205765353,1.8030645268901052e-6,-3.009534652539585e-8,0.003874484463380578,1.7433559304306285e-6,-2.997927136727451e-8,0.003874957745425761,1.805067475563303e-6,-3.009872427079351e-8,0.0038754081819814224,1.9969121911983876e-6,-3.0470633717663e-8,0.0038757768904046563,2.2921729176794824e-6,-3.104314330933098e-8,0.0038760255596562514,2.6342273406501153e-6,-3.1706344087442033e-8,0.003876148467003275,2.953007064522305e-6,-3.232426651598912e-8,0.003876173208269964,3.1867247516892045e-6,-3.2777089184574225e-8,0.0038761496228379723,3.299682974732298e-6,-3.2995681880150156e-8,0.0038761325461103228,3.2890272755367357e-6,-3.297463097922817e-8,0.003876166403606068,3.179714693762658e-6,-3.276239593634084e-8,0.003876276896591104,3.0126859225590633e-6,-3.243833774524097e-8,0.0038764701624275557,2.8325579269208208e-6,-3.208888404389721e-8,0.0038767365992111737,2.6787515873070964e-6,-3.1790385133102694e-8,0.003877056148306675,2.580816495240054e-6,-3.160009687833867e-8,0.003877403029010765,2.556826343211539e-6,-3.1553084495681475e-8,0.0038777493008821016,2.613289973686861e-6,-3.166203618942354e-8,0.0038780675614554605,2.745446505360736e-6,-3.191780672517262e-8,0.003878333476381656,2.937524412643369e-6,-3.2289889347489e-8,0.0038785287779384415,3.1632353044676755e-6,-3.2727348319001116e-8,0.0038786449743421613,3.38733667833281e-6,-3.3161835770498974e-8,0.0038786873128192818,3.569409484611795e-6,-3.351491898098499e-8,0.003878677591593657,3.6707118908738144e-6,-3.371139093728882e-8,0.003878653651155005,3.663736005572876e-6,-3.369782934114989e-8,0.003878663611183559,3.5420997935283253e-6,-3.346179770353897e-8,0.003878754731082063,3.3267106762652564e-6,-3.304380167421774e-8,0.003878959662882301,3.0642480397399228e-6,-3.2534349810315585e-8,0.0038792851193151815,2.8166766000497898e-6,-3.2053637071171815e-8,0.003879707781335941,2.644580007151263e-6,-3.171924924585675e-8,0.003880179414535661,2.590044261113597e-6,-3.161296170025512e-8,0.003880639462395093,2.664856929841553e-6,-3.175779169109812e-8,0.003881030963909623,2.847441295081661e-6,-3.211196330829822e-8,0.003881315132026455,3.088989773401876e-6,-3.258074793403881e-8,0.003881480673019954,3.3267950065992406e-6,-3.304234350010906e-8,0.0038815453906210946,3.500934082932849e-6,-3.33803219040278e-8,0.0038815497710628015,3.5694288741531944e-6,-3.3513127109619604e-8,0.003881544796778198,3.5173837589184617e-6,-3.341184114435914e-8,0.003881578212321525,3.3577257039687044e-6,-3.310159999772678e-8,0.0038816837406748395,3.1243817248589497e-6,-3.264830861127478e-8,0.0038818760151617553,2.8614164265762064e-6,-3.213752525507882e-8,0.0038821512694009203,2.612341272483004e-6,-3.165370238768937e-8,0.0038824917692874394,2.4124461107722537e-6,-3.1265314802538124e-8,0.003882871480346175,2.2849072067360234e-6,-3.1017329356398934e-8,0.0038832611824149987,2.2398928027330586e-6,-3.0929494207351274e-8,0.0038836323245214632,2.275318774487282e-6,-3.099781618751069e-8,0.0038839597921307414,2.378108423025778e-6,-3.119699030134757e-8,0.0038842242152507703,2.5254286212354412e-6,-3.148275781095068e-8,0.0038844144663355965,2.686059250390416e-6,-3.179451894543604e-8,0.0038845306688387576,2.822639547206788e-6,-3.2059675183163195e-8,0.003884587357003466,2.8959475224504465e-6,-3.220196455639171e-8,0.0038846153737523,2.8722310269464106e-6,-3.21557550736718e-8,0.003884660056959134,2.7333387608771316e-6,-3.18857668919105e-8,0.0038847732762158013,2.4869046599035173e-6,-3.1406851357082614e-8,0.0038849991252745794,2.1712642698410145e-6,-3.0793495921892944e-8,0.0038853574442500984,1.8496451423368823e-6,-3.016850650976043e-8,0.0038858330515733975,1.5925789224385644e-6,-2.9668865383990577e-8,0.003886377556622482,1.4547566015723252e-6,-2.940082528056271e-8,0.0038869241473787107,1.4569552475180457e-6,-2.9404819127186324e-8,0.0038874085176017156,1.5809669809562609e-6,-2.9645564220367717e-8,0.003887786800305342,1.7780034980890623e-6,-3.002832302171855e-8,0.0038880447159318995,1.9850173646662214e-6,-3.0430573951043864e-8,0.0038881971924163384,2.1420596256770285e-6,-3.073574438290413e-8,0.003888280961175994,2.205781072292864e-6,-3.085948449380518e-8,0.0038883435694981065,2.1568374784550173e-6,-3.076410840731744e-8,0.0038884319296096136,2.0009593416802778e-6,-3.0460718017368735e-8,0.00388858281744708,1.7646673454508626e-6,-3.000089846925649e-8,0.003888816937092785,1.487387634284406e-6,-2.9461380448588014e-8,0.003889137213009564,1.2122368285186793e-6,-2.8926083312790018e-8,0.0038895308769200843,9.77741933194379e-7,-2.8469964105098837e-8,0.0038899740437511265,8.120453633245923e-7,-2.81477220260484e-8,0.003890437171818333,7.300902557734322e-7,-2.7988343358411724e-8,0.0038908900772970704,7.333723847624609e-7,-2.7994672649499975e-8,0.0038913058202770783,8.11313345377628e-7,-2.8146131740211625e-8,0.003891663485624368,9.432958331578632e-7,-2.8402680159512044e-8,0.0038919502946732623,1.1008399990349611e-6,-2.8708996787877187e-8,0.0038921635340459903,1.2499486900889057e-6,-2.8998973546822423e-8,0.0038923125934744473,1.3541502616078596e-6,-2.9201603267134142e-8,0.0038924208408559866,1.379197734291158e-6,-2.9250157793629576e-8,0.0038925260361622285,1.3003034856014153e-6,-2.909634192665132e-8,0.0038926769630940033,1.1115916402400212e-6,-2.8728743103664676e-8,0.0038929238963934187,8.34996763450161e-7,-2.819013439953649e-8,0.003893302729372596,5.229491681716229e-7,-2.7582633768285374e-8,0.0038938176635446077,2.486270920040773e-7,-2.704868519022275e-8,0.0038944323474479204,8.290889866841129e-8,-2.6726217478885122e-8,0.0038950779585628413,6.71542862886964e-8,-2.6695708784190685e-8,0.0038956768103849595,1.9679611586948285e-7,-2.694825472718397e-8,0.003896169311776245,4.2495370109331924e-7,-2.73925766726845e-8,0.003896530677936019,6.822594553111313e-7,-2.7893606935094835e-8,0.0038967721729981984,9.007324311420936e-7,-2.8318972956552194e-8,0.003896930972109137,1.0312737312306008e-6,-2.8573056292209646e-8,0.0038970560356940956,1.0512333616440805e-6,-2.8611714898809007e-8,0.0038971954492596143,9.637576168076825e-7,-2.84410251401411e-8,0.0038973875128366286,7.922909732076531e-7,-2.8106623400673385e-8,0.003897655773663217,5.73039745366953e-7,-2.7679078820458593e-8,0.0038980074203048315,3.470975623162463e-7,-2.723855936562174e-8,0.003898434383602654,1.532557749678879e-7,-2.686076811069166e-8,0.003898916483642837,2.2273778031217942e-8,-2.6605698033749048e-8,0.003899425869944706,-2.6879705272445377e-8,-2.651026260606674e-8,0.003899931946443452,1.135752503116599e-8,-2.658517606455315e-8,0.003900405988380751,1.2952483923987927e-7,-2.6815784333920333e-8,0.0039008248607193337,3.0902597073996624e-7,-2.7165815642283763e-8,0.0039011736945926885,5.228355224148576e-7,-2.7582659172522265e-8,0.003901447733469793,7.385703341824681e-7,-2.800327930437387e-8,0.0039016535931530446,9.218576909926763e-7,-2.8360689234556944e-8,0.003901810063641041,1.0402342282423203e-6,-2.8591513682344532e-8,0.0039019482346590566,1.068114437545263e-6,-2.8645727584383664e-8,0.0039021099156309434,9.933162871447647e-7,-2.8499486010026745e-8,0.0039023425147539973,8.245733393134014e-7,-2.816985246159411e-8,0.0039026886667243655,5.973876226969504e-7,-2.7726207946250197e-8,0.0039031709184319144,3.732053312467776e-7,-2.728856993304565e-8,0.003903776436955178,2.2643689124575264e-7,-2.7002203145251322e-8,0.0039044517336320776,2.1908852626009318e-7,-2.6988107235954432e-8,0.0039051160269753435,3.7343990320735743e-7,-2.728970832405026e-8,0.0039056904602020087,6.597257455398579e-7,-2.7848816986833218e-8,0.0039061274952976715,1.008182754458275e-6,-2.8529159419230002e-8,0.003906424029832539,1.337864454440272e-6,-2.917267690733211e-8,0.0039066143239121455,1.584673185538172e-6,-2.9654276855512307e-8,0.003906751629333246,1.7160417124478927e-6,-2.991045051383723e-8,0.003906889981347287,1.7312807173328777e-6,-2.993987957694521e-8,0.003907072257425082,1.6535639424178371e-6,-2.978777180552823e-8,0.003907324953080964,1.5196860399174986e-6,-2.9525923596991393e-8,0.003907657617907691,1.3710174126904936e-6,-2.9235136326534077e-8,0.003908064791635279,1.246627938272527e-6,-2.8991808582392042e-8,0.003908529121213566,1.178355331974727e-6,-2.8858246582644022e-8,0.0039090251008069895,1.1874723538953122e-6,-2.8876064406570793e-8,0.0039095231741027164,1.2828026766380307e-6,-2.9062457134925734e-8,0.003909993971965604,1.4602429723720258e-6,-2.940930205385144e-8,0.003910412376088683,1.7037257014122688e-6,-2.9885126077279e-8,0.003910760972899444,1.9875614267849495e-6,-3.043974711070414e-8,0.003911032543742426,2.279815827653438e-6,-3.1010855542352346e-8,0.003911231493909528,2.5463069029857515e-6,-3.153173238001942e-8,0.003911374222650876,2.7549910335127733e-6,-3.193972170951845e-8,0.003911488384327841,2.880624085469085e-6,-3.218531726661661e-8,0.003911610864352182,2.909667982481857e-6,-3.224183476086153e-8,0.003911783886839922,2.84536194505679e-6,-3.211546429333361e-8,0.003912048236733935,2.7121190655270843e-6,-3.1853969077637996e-8,0.003912432956737331,2.5569177610852085e-6,-3.1549408250500364e-8,0.003912942711842446,2.4439948046497946e-6,-3.13276712957956e-8,0.003913547494005578,2.439525781374463e-6,-3.1318405148871284e-8,0.003914182801008766,2.587612510786791e-6,-3.160796365905382e-8,0.00391476670682019,2.8876813198392386e-6,-3.219515496038958e-8,0.003915229878465214,3.288612511808708e-6,-3.297977441605243e-8,0.00391554262842195,3.707168304776008e-6,-3.3798756641249064e-8,0.003915722816780819,4.061134667377567e-6,-3.449114586943816e-8,0.0039158221519932715,4.297554871760769e-6,-3.495337435976911e-8,0.003915902612886247,4.403020028690837e-6,-3.5159304982510026e-8,0.003916016771863963,4.3972762305046315e-6,-3.51476057496457e-8,0.003916198069716032,4.319425094326008e-6,-3.499472431255641e-8,0.003916459596845121,4.214738888555488e-6,-3.4789167335719515e-8,0.003916797401300606,4.125457418511884e-6,-3.46135897824814e-8,0.003917195121291198,4.085545626385126e-6,-3.453456558879286e-8,0.003917628376812855,4.118078743411213e-6,-3.459741276197698e-8,0.00391806864547818,4.234057023541767e-6,-3.4823781820516536e-8,0.0039184868549933145,4.432100524385358e-6,-3.521100643460954e-8,0.003918856894454718,4.698942282664103e-6,-3.5733089149345645e-8,0.003919159062997544,5.010909292212568e-6,-3.634366398414867e-8,0.003919383180819294,5.336673361384431e-6,-3.698142096457321e-8,0.003919530829987342,5.641296545403175e-6,-3.757799607711368e-8,0.0039196162213828035,5.891218249778886e-6,-3.8067651883344666e-8,0.0039196653747344806,6.059652716046391e-6,-3.8397777275256785E-08,0.003919713456096689,6.131770978781817e-6,-3.853905013964011e-8,0.003919800276775679,6.108967573413839e-6,-3.849390802272054e-8,0.003919964045053333,6.011521522845613e-6,-3.830191792649171e-8,0.003920233494230299,5.878730153642338e-6,-3.804014811232711e-8,0.003920618992780859,5.764983763374026e-6,-3.781547454419313e-8,0.00392110459247313,5.730010496430183e-6,-3.7745352062984805e-8,0.0039216448866342514,5.822802882578071e-6,-3.792614771435408e-8,0.00392217165582521,6.062441369382195e-6,-3.839540769990899e-8,0.003922612784897084,6.424343781374744e-6,-3.910483982583697e-8,0.003922918279510956,6.842549813656679e-6,-3.9924854655693004e-8,0.0039230801956615,7.231684285990491e-6,-4.068779460101494e-8,0.003923134148926395,7.5187772284920845e-6,-4.125047503163074e-8,0.003923141833425455,7.667435752105012e-6,-4.1541586012182924e-8,0.003923166269325025,7.683166138878378e-6,-4.1571999586433136e-8,0.003923253198934327,7.602234341381125e-6,-4.1412808153840096e-8,0.00392342418128479,7.474463541507354e-6,-4.1161593315289665e-8,0.003923678875818511,7.348774715809465e-6,-4.091417238620076e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json new file mode 100644 index 0000000..509a7d1 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":24000,"numberOfSamples":1000,"samples":[0.003924001349468574,7.264665173102422e-6,-4.0747989552475184e-8,0.003924366586169156,7.248790607297544e-6,-4.0715438046854016e-8,0.0039247455983737215,7.31449699975775e-6,-4.084288354023843e-8,0.003925109134008881,7.462510402409807e-6,-4.1131928535769936e-8,0.003925430619334403,7.681943579661476e-6,-4.156132990390201e-8,0.003925688916221978,7.9515663056217e-6,-4.208949033990723e-8,0.003925871139610513,8.241724001493012e-6,-4.26582543580377e-8,0.003925975343160025,8.517452558510482e-6,-4.319903585164052e-8,0.003926012408625573,8.743124708146312e-6,-4.364190844664137e-8,0.0039260062351111815,8.888393011087458e-6,-4.392721436513869e-8,0.0039259914819518545,8.934553769547599e-6,-4.401802379763859e-8,0.003926008601681654,8.87995541059872e-6,-4.391078722925618e-8,0.003926096603853184,8.742886424791559e-6,-4.364111335220435e-8,0.003926284700461693,8.560700555841224e-6,-4.328218871863738e-8,0.003926584419799495,8.38460458304358e-6,-4.293463839580567e-8,0.003926983982520055,8.27018419490559e-6,-4.270791978660203e-8,0.003927446933578442,8.26450952654458e-6,-4.269489056436631e-8,0.003927917035426422,8.392007583137403e-6,-4.294388907717355e-8,0.003928330548152765,8.643213090672838e-6,-4.343648270886796e-8,0.003928634404239271,8.97202431142347e-6,-4.4082022548759444e-8,0.003928804571353034,9.306016764539644e-6,-4.473798796749362e-8,0.003928855847415065,9.568840746130847e-6,-4.525415343428905e-8,0.0039288366735898165,9.705875342600683e-6,-4.552310678124801e-8,0.003928810708523999,9.70075387287824e-6,-4.5512697637589113e-8,0.003928834802404048,9.575566014901797e-6,-4.526632710582171e-8,0.003928943827175889,9.377534807333275e-6,-4.487669985208786e-8,0.003929146690245219,9.161289638700064e-6,-4.445102369531869e-8,0.003929431010766044,8.97479258527682e-6,-4.408344678591044e-8,0.003929771249439363,8.851942834798086e-6,-4.3840594450064106e-8,0.003930136299987928,8.810775413828423e-6,-4.375803213461219e-8,0.0039304949376361325,8.854733935909684e-6,-4.3842713182813283e-8,0.003930819251349883,8.97490756364095e-6,-4.4077307493303816e-8,0.003931086911330102,9.152169769274805e-6,-4.442436000944777e-8,0.0039312831240633185,9.359120650070548e-6,-4.4830096409770687e-8,0.003931402736278697,9.562353565431697e-6,-4.522888479978551e-8,0.0039314523679986994,9.725809891954073e-6,-4.554983213541918e-8,0.003931451821677968,9.81581544058732e-6,-4.572667330703574e-8,0.0039314335373014,9.807739373223678e-6,-4.5710846370490446e-8,0.003931438847422937,9.693139686684408e-6,-4.5485541526462294e-8,0.003931510540598468,9.485126741041124e-6,-4.507628154878644e-8,0.0039316827752822045,9.21922505098598e-6,-4.455269004539336e-8,0.003931971055312627,8.947933809120098e-6,-4.401789076476449e-8,0.0039323657307728825,8.729358784614993e-6,-4.358622919525109e-8,0.003932831731699162,8.612643855888081e-6,-4.335462841531593e-8,0.003933315344617792,8.62429738570606e-6,-4.337560654570439e-8,0.003933756715300976,8.759463349484685e-6,-4.363994931455601e-8,0.003934105106059232,8.981053856326873e-6,-4.407485811762412e-8,0.003934332913929343,9.227877438043526e-6,-4.4559891225405716e-8,0.0039344440871193175,9.430525068002884e-6,-4.4958286576969273e-8,0.003934473402796723,9.530858688927084e-6,-4.5155432327327116e-8,0.003934475863914978,9.498545685117723e-6,-4.509149078422063e-8,0.003934509718222492,9.33827824991407e-6,-4.47756142603218e-8,0.003934619792227327,9.085158588882537e-6,-4.427682786107174e-8,0.003934827415641757,8.791280140237335e-6,-4.369760258181166e-8,0.00393512933343696,8.510038014808986e-6,-4.31429928445453e-8,0.0039355035636141015,8.284081649552148e-6,-4.269695029529051e-8,0.003935918018543304,8.139406686077033e-6,-4.241070000822375e-8,0.003936338353846052,8.084775818140693e-6,-4.2301584302013366e-8,0.003936733445406277,8.114176353890525e-6,-4.235787766689351e-8,0.0039370785461212525,8.210197709692123e-6,-4.254541828860122e-8,0.003937356971767464,8.347130480599071e-6,-4.281369430236631e-8,0.003937561263758311,8.493567783692922e-6,-4.310094762045791e-8,0.003937694438031615,8.615002843389891e-6,-4.333926631812809e-8,0.003937771330134241,8.67725650150846e-6,-4.346131796842194e-8,0.003937819322870859,8.651508326884634e-6,-4.3410256470381495e-8,0.003937877058427044,8.521099894445721e-6,-4.3153137231452934e-8,0.003937989463885939,8.288931327634417e-6,-4.269550841092151e-8,0.003938198228981029,7.982475866423666e-6,-4.209131265757179e-8,0.003938529202136906,7.652421272823026e-6,-4.144024574779018e-8,0.003938981172624146,7.362348631112524e-6,-4.086748201679056e-8,0.003939521858698951,7.171057158621901e-6,-4.048891544782165e-8,0.003940094615197016,7.113880374154503e-6,-4.0374365707466556e-8,0.0039406342007793785,7.190918645244552e-6,-4.052432522098116e-8,0.003941085456845227,7.366953288287352e-6,-4.086966435709471e-8,0.003941417979926735,7.582297213206803e-6,-4.1292902967637985e-8,0.003941632550878733,7.769811582108233e-6,-4.1661704613367465e-8,0.0039417586573959,7.872367731094012e-6,-4.186332403044912e-8,0.00394184498935138,7.856147459827803e-6,-4.183089280710224e-8,0.003941946090056001,7.716963831159671e-6,-4.155595404739903e-8,0.003942108844751583,7.478721284531861e-6,-4.1085488184775086e-8,0.003942362280649743,7.1851264448118275e-6,-4.0505610055412035e-8,0.003942713056297738,6.887545188092401e-6,-3.9917635489093076e-8,0.003943147094181412,6.63285056822077e-6,-3.9414089140640513e-8,0.00394363576055283,6.45458746493619e-6,-3.906122521138246e-8,0.003944143851940386,6.3689698481875325e-6,-3.889108334065558e-8,0.003944636869159611,6.375238897636767e-6,-3.89021835862169e-8,0.003945086178514301,6.458758785510235e-6,-3.906566285644976e-8,0.003945471885644119,6.595087712929455e-6,-3.9333345409787816e-8,0.003945784062145488,6.75381682031183e-6,-3.96453240801719e-8,0.0039460231949269235,6.9018086924852714e-6,-3.993631138475404e-8,0.003946200484182494,7.0061699834473986e-6,-4.0141443325436696e-8,0.003946338123548155,7.037663514739489e-6,-4.020297398706976e-8,0.003946469030517169,6.975321308310946e-6,-4.007939202239149e-8,0.0039466347171631935,6.8125615268396335e-6,-3.9757548945000605e-8,0.003946879526314831,6.563781000662389e-6,-3.926572917290399e-8,0.003947240113576192,6.26832771088985e-6,-3.8681519815076635e-8,0.00394773162032693,5.987155767768718e-6,-3.8125213666258697e-8,0.00394833606959585,5.788678511154436e-6,-3.7731893344309e-8,0.0039490010315956,5.726070108611301e-6,-3.760663760887806e-8,0.003949653254363835,5.815841448021564e-6,-3.778221021701663e-8,0.003950222933085804,6.029784395114221e-6,-3.8203094717768544e-8,0.003950666763769117,6.305251283013329e-6,-3.874572335149639e-8,0.003950978997636163,6.567633107643007e-6,-3.926282625402561e-8,0.003951187946508848,6.753390037519353e-6,-3.9628897768472654e-8,0.003951342970045106,6.82499234587586e-6,-3.9769697357740485e-8,0.00395149899125544,6.775528812781524e-6,-3.9671369919487616e-8,0.003951703461040263,6.625121099539185e-6,-3.9373432374454456e-8,0.003951987858015527,6.412572497682793e-6,-3.8952382552237284e-8,0.003952363959429004,6.185216687773946e-6,-3.8501729618800614e-8,0.003952824318389738,5.9890392604355895e-6,-3.811248119847719e-8,0.003953346084383744,5.8605580191022866e-6,-3.7857015174201214e-8,0.003953896995412957,5.821583390244034e-6,-3.777860582122305e-8,0.003954442092751837,5.877359468380301e-6,-3.7887672658214384e-8,0.003954949781935346,6.017769412892624e-6,-3.816417373000497e-8,0.003955396289717578,6.220694202785564e-6,-3.856432318594815e-8,0.003955768174884203,6.456367672750993e-6,-3.902927598979735e-8,0.003956063179994125,6.691705169501888e-6,-3.949369249275251e-8,0.003956290051901221,6.894111093467348e-6,-3.989319559509603e-8,0.003956467854520423,7.034854759428582e-6,-4.017095218887658e-8,0.0039566249669400816,7.092436622888951e-6,-4.0284290088954386e-8,0.003956797478346305,7.056481487425291e-6,-4.021245059161304e-8,0.003957025994777186,6.932388600346256e-6,-3.996590300588929e-8,0.003957349414623954,6.7458410699163445e-6,-3.959537173887109e-8,0.003957794778545756,6.544498614818847e-6,-3.9195220973930975e-8,0.003958364489074411,6.392651543668574e-6,-3.889283923884582e-8,0.003959026190955713,6.355295837039837e-6,-3.881705762450065e-8,0.003959713978117959,6.473712946892012e-6,-3.904975388942963e-8,0.003960346658841707,6.743821961530491e-6,-3.958294960032686e-8,0.003960857575990237,7.112323350996538e-6,-4.031115186969541e-8,0.0039612197932018854,7.496174919039376e-6,-4.10699402100219e-8,0.003961452306299503,7.814588012843276e-6,-4.169936348567501e-8,0.003961606574536528,8.01530911676443e-6,-4.209596468724888e-8,0.003961744529834369,8.08439052342442e-6,-4.223205431160473e-8,0.003961919898203691,8.041055608842375e-6,-4.2145503385516964e-8,0.003962167934107929,7.92540646416268e-6,-4.1915471608097986e-8,0.003962502766954194,7.785608877629877e-6,-4.1637175222764884e-8,0.003962919504652272,7.667738377555936e-6,-4.140189174962666e-8,0.00396339860412415,7.6088866362392024e-6,-4.128330394764023e-8,0.003963911081389532,7.633028280277278e-6,-4.132919427751386e-8,0.003964423927548092,7.749152914604407e-6,-4.1557593105492124e-8,0.003964905318504584,7.951432583245587e-6,-4.1957026443146924e-8,0.003965329172806784,8.221199670866641e-6,-4.249046155503989e-8,0.0039656786145144665,8.530378408627668e-6,-4.310220299700377e-8,0.003965947990889918,8.845841392371245e-6,-4.37266017606286e-8,0.003966143368775138,9.134007815143316e-6,-4.429715430491004e-8,0.003966281763390242,9.365126081644348e-6,-4.475489492347632e-8,0.003966389432433808,9.517028569907252e-6,-4.50557398961551e-8,0.0039664994413490615,9.578380169243303e-6,-4.517691762130738e-8,0.003966648478154706,9.551562333274848e-6,-4.512279719134597e-8,0.003966872442131501,9.455213790585541e-6,-4.493010285476397e-8,0.003967200009096507,9.325645135291122e-6,-4.4670856835179115e-8,0.003967643942139405,9.215087087823338e-6,-4.4448923046119814e-8,0.0039681916280942,9.183905742556441e-6,-4.438445858297688e-8,0.003968799131557344,9.284666046934797e-6,-4.4582129386551373e-8,0.003969395714603861,9.540259293398974e-6,-4.508756258136944e-8,0.0039699037202130414,9.926237027984614e-6,-4.585222439096121e-8,0.003970268552470416,1.0371684773005795e-5,-4.673521137896835e-8,0.003970482142169558,1.078412203468818e-5,-4.755282003004367e-8,0.0039705843561092195,1.10860283048514e-5,-4.815115477383973e-8,0.003970642360386332,1.1241376583518066e-5,-4.845874452293147e-8,0.003970722821708415,1.125981504453911e-5,-4.8494689966727235e-8,0.0039708723071808566,1.11829441885822e-5,-4.834134805360363e-8,0.003971110919069601,1.1065211622363857e-5,-4.810650188240576e-8,0.003971435431608885,1.0958632735931508e-5,-4.7893216781566505e-8,0.003971826265812919,1.0903990546723049e-5,-4.778250186894762e-8,0.003972254586729742,1.0927283245886881e-5,-4.782624238951511e-8,0.003972688105211575,1.1039249843146977e-5,-4.8046116883982526e-8,0.0039730955939297884,1.1236386675066273e-5,-4.843545087392066e-8,0.00397345054557075,1.1502799362280447e-5,-4.8962807876693554e-8,0.003973734208169738,1.1812792318729848e-5,-4.9577158828296015e-8,0.003973937950405579,1.2134265111817801e-5,-5.021471558067026e-8,0.003974064679006379,1.2432918992578263e-5,-5.080734411592102e-8,0.003974128944467808,1.2676973960732623e-5,-5.129190491821449e-8,0.003974155556457899,1.2841827542246017e-5,-5.1619414061577866e-8,0.0039741767870729505,1.2914097734147498e-5,-5.1763003268766806e-8,0.003974228381508199,1.2894585117898373e-5,-5.1723840310494984e-8,0.0039743446740342315,1.2799778794775203e-5,-5.1534278839920305e-8,0.003974553031218095,1.2661651645222267e-5,-5.1257656952560386e-8,0.00397486770830553,1.252526192551265e-5,-5.0983665712715536e-8,0.003975283624309093,1.244306855380536e-5,-5.081702986908633e-8,0.003975771762776541,1.2464764616558008e-5,-5.085712444532777e-8,0.003976279358595454,1.2622668128129355e-5,-5.1168686224427466e-8,0.003976738806949802,1.2915806066879637e-5,-5.174997205879499e-8,0.00397708712480231,1.3300494013523065e-5,-5.251398213335525e-8,0.003977290708495544,1.3697307875515348e-5,-5.3302462984544026e-8,0.003977362035950759,1.4017395454687275e-5,-5.393846232144907e-8,0.003977355858695399,1.4196719691249908e-5,-5.429455632185751e-8,0.003977345605575303,1.4218583669657343e-5,-5.433755885903962e-8,0.003977394646971235,1.4112859234273654e-5,-5.412679978292305e-8,0.003977538120767945,1.3937040535825622e-5,-5.377637606636613e-8,0.003977780313015663,1.3753373811437281e-5,-5.3409789340420174E-08,0.0039781024005110955,1.361276026355333e-5,-5.312812805725196e-8,0.003978473023124186,1.3547849219766439e-5,-5.299644136530384e-8,0.003978857094370713,1.3572654477401475e-5,-5.304293291262342e-8,0.00397922161367756,1.3685187261991948e-5,-5.326404503945597e-8,0.0039795391090315735,1.387078103509612e-5,-5.363091484811033e-8,0.003979789799970764,1.4105237357237993e-5,-5.4095556401576257e-8,0.0039799632178153825,1.4357845076354077e-5,-5.45968922420498e-8,0.003980059500806607,1.4594673222991368e-5,-5.506737604277994e-8,0.003980090142970023,1.4782539911570218e-5,-5.5440930753357645e-8,0.003980077642195864,1.4893710156689642e-5,-5.566226817310781e-8,0.003980053468419345,1.4910803096605801e-5,-5.56965853216742e-8,0.0039800541106269635,1.4830983623911673e-5,-5.553787293347947e-8,0.0039801154418540406,1.466838142817004e-5,-5.5213797919344863e-8,0.003980266139921954,1.4453775388946017e-5,-5.478524269653043e-8,0.003980521287767714,1.4231023369268172e-5,-5.4339391697161045e-8,0.003980877353979621,1.4050315119139707e-5,-5.397640762167942e-8,0.003981309717837675,1.395868469966156e-5,-5.3790488944141864e-8,0.003981774090037387,1.3988628469092594e-5,-5.3846999457069773e-8,0.003982213281677193,1.4146764402475845e-5,-5.415961657859051e-8,0.003982570011449755,1.4406143821260008e-5,-5.467482526558627e-8,0.003982804131697453,1.47071498764841e-5,-5.527369286809923e-8,0.003982908778352366,1.4970992193698437e-5,-5.579891732093303e-8,0.003982916824397885,1.5124448073961797e-5,-5.6104337480320424e-8,0.003982891263406429,1.5126160410236833e-5,-5.610742482232311e-8,0.00398290215454356,1.4980743595872157e-5,-5.581730514030468e-8,0.0039830019202654705,1.4733222541316497e-5,-5.532354528930037e-8,0.003983211326857249,1.4448727937037265e-5,-5.4755680309660146e-8,0.003983520104257227,1.4189885389384998e-5,-5.423828496751849e-8,0.003983897259054235,1.4001826693159665e-5,-5.386125283385029e-8,0.003984303459136277,1.3907216352427944e-5,-5.366993275012876e-8,0.003984700579759181,1.3908279420985249e-5,-5.3669095525382856e-8,0.003985057207973846,1.399170223752423e-5,-5.3832563887307894e-8,0.00398535107067196,1.4133635001783242e-5,-5.411306762933109e-8,0.003985569881970607,1.4303771905497005e-5,-5.445033306625039e-8,0.0039857117052029475,1.4468652878353123e-5,-5.4777689929636526e-8,0.003985785248092382,1.4594817843348775e-5,-5.502840613731594e-8,0.003985809897015252,1.4652472383143383e-5,-5.514301337657362e-8,0.003985814826438397,1.4619974837042523e-5,-5.5078226609295487e-8,0.0039858363205629195,1.4488750116827408e-5,-5.481669944437828e-8,0.003985912714645442,1.426742833517886e-5,-5.4375274115178266e-8,0.003986077146685968,1.3983468945714063e-5,-5.380829619913038e-8,0.003986349418788184,1.3680607655818763e-5,-5.320267121504874e-8,0.003986729243878734,1.3411429492368585e-5,-5.266321054783875e-8,0.003987193368925278,1.3226052188088213e-5,-5.229014065094215e-8,0.0039876982347206835,1.3159498917999302e-5,-5.2153854337675876E-08,0.00398818833657533,1.3221106579292605e-5,-5.227358445765773e-8,0.003988608901007278,1.338916970518754e-5,-5.260647556617648e-8,0.003988920183252699,1.3613194193081244e-5,-5.3051916801022585e-8,0.003989109646982799,1.3824650626505712e-5,-5.347299765131535e-8,0.003989197746223967,1.3954767944424933e-5,-5.373215558025435e-8,0.003989233827788415,1.3954763566654355e-5,-5.373171638754063e-8,0.003989281800794039,1.3811236850979288e-5,-5.3444699852450874e-8,0.003989400134260441,1.3549823535973889e-5,-5.292209959911019e-8,0.003989624365284392,1.3225093106393183e-5,-5.227268643727621e-8,0.003989959279866753,1.290162083662521e-5,-5.1625249279043706e-8,0.0039903824814073756,1.2635093520500604e-5,-5.109093995112096e-8,0.00399085532254792,1.2460509228031144e-5,-5.0739748289693165e-8,0.003991335096141489,1.2389290014694273e-5,-5.0594703090057124e-8,0.003991784193685639,1.2412788238110021e-5,-5.063879306432595e-8,0.0039921750376531425,1.2508400657934924e-5,-5.082710027342623e-8,0.0039924916979013365,1.264552801312763e-5,-5.109866380876292e-8,0.003992729733420645,1.2790244411010073e-5,-5.138580639540977e-8,0.003992895505481774,1.2908774182592685e-5,-5.162109554086806e-8,0.003993005539841018,1.2970483448082949e-5,-5.1743325651077926e-8,0.003993085805853583,1.2951169554634605e-5,-5.170407528089941e-8,0.0039931702182065525,1.2837098930575677e-5,-5.1475750096119304e-8,0.003993297356816803,1.2629535465925717e-5,-5.106062222453551e-8,0.003993504537036869,1.2348458326471559e-5,-5.04982889205154e-8,0.00399381928261621,1.2033164964636035e-5,-4.9866956012253766e-8,0.003994250001187529,1.1737322154317254e-5,-4.9273662215669775e-8,0.0039947794474397376,1.1517572315967707e-5,-4.883161802180583e-8,0.003995364932969854,1.1417909076784898e-5,-4.8629022529340004e-8,0.0039959471867255245,1.145512467560501e-5,-4.8699907040692296e-8,0.003996465923696541,1.1611411554188564e-5,-4.9009176717670445e-8,0.003996876828671035,1.1837637422183225e-5,-4.9458966925161574e-8,0.003997163971009506,1.2066380201857806e-5,-4.991458667779847e-8,0.003997343759283495,1.2230228260355551e-5,-5.024110820721207e-8,0.003997459714537061,1.227962356731739e-5,-5.033913205513782e-8,0.0039975700174394516,1.2195246540345806e-5,-5.016966528746188e-8,0.0039977315793668896,1.199171433994848e-5,-4.9761614483588085e-8,0.003997985303974457,1.1711837911922054e-5,-4.920037428897476e-8,0.003998346858193554,1.1413566865496914e-5,-4.8601769213070115e-8,0.0039988053495900785,1.1154143067304714e-5,-4.808037527313077e-8,0.0039993293627035445,1.0976671983429418e-5,-4.7722620398013583e-8,0.003999877225762814,1.0902767894712806e-5,-4.7571985490559816e-8,0.004000407493370264,1.0931979187466173e-5,-4.762776490445662e-8,0.00400088668699902,1.1046120607170104e-5,-4.785368769200271e-8,0.0040012933178902805,1.1215681826101956e-5,-4.8190753288722657e-8,0.004001618824597613,1.140602944436198e-5,-4.856968419517292e-8,0.004001866716617343,1.1582292382143262e-5,-4.8920729394387654e-8,0.004002051089467816,1.1712900988527266e-5,-4.9180732644461024e-8,0.004002195134543225,1.1772393926335084e-5,-4.9298705411811596e-8,0.0040023296147842545,1.1744241358596293e-5,-4.9241438831947997e-8,0.004002490702025333,1.1624164492064202e-5,-4.9000150214148706e-8,0.004002716177242634,1.1423787492992013e-5,-4.859784391910101e-8,0.0040030390227214704,1.1173356864132723e-5,-4.8094833920023865e-8,0.004003478361347815,1.0920997712239193e-5,-4.7587334303852796e-8,0.004004029802038545,1.0725563863908767e-5,-4.719320099784125e-8,0.004004659792221574,1.0641953511935584e-5,-4.7022548424382676e-8,0.004005309358395405,1.0702231547952575e-5,-4.713991105371558e-8,0.004005909305357476,1.0900742430031743e-5,-4.7534332339053704e-8,0.004006402231050277,1.1192022790909333e-5,-4.8115061170983004e-8,0.004006761493609258,1.1504328555145381e-5,-4.8738556290387605e-8,0.004006998416788491,1.1762810600434922e-5,-4.925487801263246e-8,0.0040071557972175655,1.1911802199676452e-5,-4.955234189469917e-8,0.004007292492485376,1.1928068755813912e-5,-4.9584090451901684e-8,0.004007466154921649,1.182270536529946e-5,-4.9371962164986925e-8,0.004007719484345561,1.1633960677447274e-5,-4.8992235679285965e-8,0.004008072516982853,1.1415035698476774e-5,-4.855132546462214e-8,0.004008521247009628,1.1220739757355388e-5,-4.81591306861145e-8,0.004009041556486812,1.1095986552782165e-5,-4.790595409748483e-8,0.004009596684482728,1.1068126254001404e-5,-4.784699794194256e-8,0.004010146061004549,1.1144061978931795e-5,-4.799641499742937e-8,0.0040106533603855915,1.1311869844993711e-5,-4.833044905420133e-8,0.004011092236707525,1.1545566812726804e-5,-4.8796997573800546e-8,0.004011449171177877,1.1811239466230054e-5,-4.9327987188523245e-8,0.004011723764818403,1.2072971677857698e-5,-4.985134835693644e-8,0.00401192736389657,1.2297623888833959e-5,-5.0300619813788786e-8,0.004012080963416897,1.2458294160137046e-5,-5.06218316152855e-8,0.004012212952149902,1.2536886563441079e-5,-5.077857415701251e-8,0.004012356748830488,1.2526361690877996e-5,-5.075648134300845e-8,0.004012547921684051,1.2433048238960548e-5,-5.0567928963629637e-8,0.0040128199805693305,1.2278886932150372e-5,-5.025666471468604e-8,0.004013197985529161,1.2102470950470938e-5,-4.990002190519058e-8,0.00401369000353784,1.1956510006150005e-5,-4.960388878819715e-8,0.004014278532066863,1.1898883530667995e-5,-4.948472066423443e-8,0.0040149167491389135,1.197622246061075e-5,-4.963648586630433e-8,0.004015535619726837,1.2203997061740317e-5,-5.0090569001978953e-8,0.004016064005360639,1.2553240036393509e-5,-5.0789018255737813e-8,0.0040164548830214815,1.2954750430225737e-5,-5.1592962190804215e-8,0.004016703733644348,1.3322431746732769e-5,-5.232951731508461e-8,0.004016848431434354,1.3584310465564186e-5,-5.2854110685949694e-8,0.004016951977140229,1.3704978067918915e-5,-5.309550581731473e-8,0.00401707918422125,1.3690726517722423e-5,-5.3066050186417026e-8,0.004017278464444657,1.3580022117076173e-5,-5.284257367174307e-8,0.004017573349390648,1.3427603643939568e-5,-5.253461517336548e-8,0.004017962524787026,1.3289293461804937e-5,-5.2254123260796106e-8,0.004018424992325505,1.3210932934703492e-5,-5.2093339215260626e-8,0.0040189273729024705,1.3221997414880813e-5,-5.211190437947683e-8,0.0040194315062708425,1.3333214209773679e-5,-5.2331872879317006e-8,0.004019901334926071,1.3537385768781908e-5,-5.273915282943784e-8,0.00402030839443015,1.3812681913253474e-5,-5.3290015781132485e-8,0.004020635440219238,1.4127527132908653e-5,-5.392095666905157e-8,0.004020878035146411,1.4446146519830484e-5,-5.455996088115213e-8,0.004021044226821732,1.473392798977689e-5,-5.513737746601209e-8,0.00402115275112109,1.496191131793451e-5,-5.559493860655362e-8,0.004021230393628464,1.5110074592057919e-5,-5.589227823087387e-8,0.004021308993990323,1.5169566143298608e-5,-5.601133518705951e-8,0.004021422225284333,1.5144214158221058e-5,-5.595940175161358e-8,0.0040216019835709,1.505150937068162e-5,-5.57712373201424e-8,0.004021873939755527,1.4922916833095616e-5,-5.550989215428107e-8,0.0040222517467002885,1.4802621499919506e-5,-5.5264327043482085e-8,0.004022730175355548,1.4742845077977562e-5,-5.513999395696767e-8,0.00402327924617558,1.4793651408929851e-5,-5.5238179247849234e-8,0.004023843665981839,1.498685836194858e-5,-5.562340967782772e-8,0.004024352851506316,1.5318263529964064e-5,-5.62874975195311e-8,0.004024743118745088,1.573836892528872e-5,-5.7130821512435726e-8,0.004024984194842726,1.6162535861771282e-5,-5.7982877436069443E-08,0.004025094377176705,1.6501026274800637e-5,-5.866291758713605e-8,0.004025133037057492,1.6693810177365013e-5,-5.9050065212816505e-8,0.0040251747474465615,1.6730082192383597e-5,-5.912247029379822e-8,0.004025281332087344,1.6644195416193686e-5,-5.894897656672424e-8,0.004025485746450353,1.6495866969054968e-5,-5.864930998217878e-8,0.004025790429201538,1.634835179138792e-5,-5.8350370181822665e-8,0.0040261746462862255,1.6253223052331517e-5,-5.815584387978385e-8,0.0040266044641294775,1.624327250382378e-5,-5.813200951807451e-8,0.004027041638836209,1.633135361213576e-5,-5.8305293951082345e-8,0.00402745025711566,1.6512469372403883e-5,-5.866622925242898e-8,0.00402780134494779,1.6767326438795646e-5,-5.917637987828972e-8,0.004028075926393701,1.7066612366788847e-5,-5.977686171643531e-8,0.004028266748303052,1.7375686093179322e-5,-6.039784671300595e-8,0.004028378700267617,1.7659404592882538e-5,-6.096841423803015e-8,0.004028427921096438,1.7886793273255926e-5,-6.142604364033798e-8,0.00402843964084909,1.8035151508268353e-5,-6.172486403108444e-8,0.004028445012514573,1.809312331270539e-5,-6.184175008856881e-8,0.0040284773268235005,1.8062494703952662e-5,-6.177988665082503e-8,0.004028567910222432,1.7958723498241694e-5,-6.156990468255793e-8,0.004028741861400401,1.781021131030546e-5,-6.12686094634135e-8,0.0040290136622913525,1.765619786846825e-5,-6.095496322789188e-8,0.0040293826809504,1.754280016104753e-5,-6.07222216328837e-8,0.004029829124215082,1.751619084809753e-5,-6.066410876225836e-8,0.004030312256108125,1.7612020509539247e-5,-6.085324393616324e-8,0.004030774031389632,1.7841815454699297e-5,-6.131341293797681e-8,0.00403115142107213,1.8180564860966387e-5,-6.199433879515745e-8,0.0040313974300052735,1.8563852856182064e-5,-6.27659191383855e-8,0.004031503203472192,1.8902856758312773e-5,-6.344869780801121e-8,0.004031507215610012,1.9116091643266002e-5,-6.387812802255732e-8,0.004031481930153734,1.916242569246173e-5,-6.397118926916185e-8,0.004031503768949901,1.9055383830683572e-5,-6.375504333127174e-8,0.004031624504421274,1.885153534554923e-5,-6.334344369125224e-8,0.00403185885677837,1.8623798019755862e-5,-6.288296518438462e-8,0.004032189274944319,1.8436620157024645e-5,-6.250321630029159e-8,0.004032579178971542,1.83324637336343e-5,-6.228981683190497e-8,0.004032986090714059,1.8329161981569122e-5,-6.227911243671427e-8,0.0040333708125981456,1.8423493871162983e-5,-6.246522183995398e-8,0.004033702484811329,1.8596808258675e-5,-6.281112340841897e-8,0.0040339608469825575,1.882045266602357e-5,-6.325939983367222e-8,0.004034137070431829,1.906045203237547e-5,-6.374161530130195e-8,0.004034233855241526,1.928170635220029e-5,-6.41868612531973e-8,0.004034264876079334,1.9452018078757834e-5,-6.453000617107153e-8,0.004034253391531761,1.9546047063260236e-5,-6.47197441623075e-8,0.004034229755724816,1.9548977882390267e-5,-6.472596597020264e-8,0.004034227730682795,1.9459320969577683e-5,-6.454533452522716e-8,0.004034279865723162,1.9290186380915923e-5,-6.420383235003002e-8,0.004034412486171448,1.9068594732676885e-5,-6.375547510633614e-8,0.00403464093034948,1.8832637893526655e-5,-6.327679436677401e-8,0.004034965687074627,1.8626536313167505e-5,-6.285707244922939e-8,0.004035370034247165,1.8493819644007736e-5,-6.258465123000945e-8,0.004035819874790727,1.846886648562048e-5,-6.252971679787746e-8,0.004036266904185114,1.856732169763407e-5,-6.272465029492704e-8,0.0040366565598250765,1.8777113738250836e-5,-6.31455681508602e-8,0.0040369414612311345,1.9053783781087113e-5,-6.370271942688705e-8,0.004037098344333292,1.932539834606959e-5,-6.42504851948613e-8,0.004037141902942749,1.951083270094533e-5,-6.462457097034529e-8,0.004037125865169994,1.954813798447868e-5,-6.46995458547251e-8,0.004037125861820998,1.9419995141300983e-5,-6.444028053955575e-8,0.00403721048480607,1.9160768124473176e-5,-6.391602935018678e-8,0.004037416430514758,1.88403649270376e-5,-6.326771012194285e-8,0.0040377405727112705,1.853563684839144e-5,-6.265022145619625e-8,0.004038149143064464,1.8305856043064805e-5,-6.218312567891382e-8,0.004038594479970898,1.8181596820678142e-5,-6.192833669694351e-8,0.004039029805036155,1.8165835433560526e-5,-6.189230839848963e-8,0.004039418015136255,1.8241197474729e-5,-6.204049708155263e-8,0.0040397350446880215,1.837815198734788e-5,-6.231370568667206e-8,0.004039969999138671,1.8541650006683282e-5,-6.264136381327966e-8,0.004040124041563737,1.8695860404660215e-5,-6.295108921511804e-8,0.004040209074777056,1.8807706049100226e-5,-6.317591860236914e-8,0.004040246363654397,1.88500021655281e-5,-6.32607471793734e-8,0.004040264737547788,1.8804636954320954e-5,-6.316879237455187e-8,0.004040297831687618,1.866571824947087e-5,-6.288791561688243e-8,0.004040379958326903,1.844201983765977e-5,-6.243550964565625e-8,0.004040540705219954,1.8157672301950075e-5,-6.185990253089828e-8,0.004040799030115895,1.7850119174229367e-5,-6.123634554926798e-8,0.0040411581509778,1.7564868093298403e-5,-6.065660011340943e-8,0.004041602732207329,1.734741098407994e-5,-6.021277355052825e-8,0.0040420995762303815,1.7233639004230466e-5,-5.997796689164541e-8,0.004042602323436688,1.724067110935005e-5,-5.998756494201581e-8,0.00404305992163886,1.736012884995211e-5,-6.022533875758978e-8,0.004043427966196684,1.7555910433464828e-5,-6.061865961283453e-8,0.0040436810936756275,1.7768500926616962e-5,-6.104709566844615e-8,0.004043823230883101,1.7927149455153616e-5,-6.1367140862782e-8,0.004043891164479845,1.7968977540453174e-5,-6.145110341710769e-8,0.004043947176700689,1.7860007267002482e-5,-6.122984744605595e-8,0.0040440603521150744,1.760913353792817e-5,-6.072111082777755e-8,0.004044282997667049,1.726658843338252e-5,-6.002633777071843e-8,0.004044633306112802,1.6905912165610116e-5,-5.929416783466505e-8,0.0040450925842591984,1.6598297213721576e-5,-5.866858772554347e-8,0.004045616463144047,1.6391968202125593e-5,-5.824729428445154e-8,0.004046152091763345,1.630410509649094e-5,-5.80653572847142e-8,0.004046652760383014,1.6324348036651065e-5,-5.8102214711525505e-8,0.004047085929565268,1.6424100266681775e-5,-5.830035937199191e-8,0.004047435228495953,1.6566189179488793e-5,-5.8584786032397173e-8,0.004047698959744002,1.671216642566975e-5,-5.8877737365682856e-8,0.004047887444712365,1.6826943646276348e-5,-5.9108127517374904e-8,0.00404802049508203,1.6881670483517197e-5,-5.9217433706880595e-8,0.004048125273323472,1.6855947238255258e-5,-5.9164217502915826e-8,0.004048234127401434,1.674008799311883e-5,-5.8928701076803824e-8,0.004048381670060571,1.6537530470193916e-5,-5.851761039418674e-8,0.004048600436416601,1.6266746291805815e-5,-5.796802584768781e-8,0.004048914984056892,1.5961326425245878e-5,-5.734760338043135e-8,0.004049335282066074,1.566668088020222e-5,-5.674801447212363e-8,0.0040498513719114376,1.5432414454828066e-5,-5.626965875165331e-8,0.004050431921230339,1.5301075079280176e-5,-5.5998974280483204e-8,0.004051028668995067,1.5296083993458358e-5,-5.598395649797168e-8,0.004051586738790464,1.5412983005455173e-5,-5.62162478465142e-8,0.004052058328986434,1.5617600591062285e-5,-5.6627167195976384e-8,0.004052415758160085,1.5852514347711364e-5,-5.7100596870077054e-8,0.004052659913064241,1.6050494133565283e-5,-5.7500160816537554e-8,0.0040528214440387015,1.6151570852562244e-5,-5.7703907353645075e-8,0.004052953861013157,1.611931020329749e-5,-5.763746552942237e-8,0.004053119682835466,1.595162622613579e-5,-5.729612717276807e-8,0.004053373025435257,1.5682212292362576e-5,-5.6747852350428666e-8,0.004053744027610918,1.537106055446932e-5,-5.611410681536437e-8,0.004054230846152612,1.5086637935810276e-5,-5.553375453822118e-8,0.004054802304411898,1.488624806595296e-5,-5.5123232299645195e-8,0.0040554095026198176,1.4802029857689209e-5,-5.494808734565473e-8,0.004056000829014219,1.4836834906018199e-5,-5.501449222707493e-8,0.0040565344012080526,1.496913360261363e-5,-5.527907211829798e-8,0.004056984713435475,1.5162646600086324e-5,-5.5668377746635783e-8,0.004057343673139978,1.537616244421555e-5,-5.609881419197702e-8,0.004057618154709957,1.5570907870645105e-5,-5.6491651348612124e-8,0.004057826336088842,1.571498161585009e-5,-5.678207302107251e-8,0.004057994236563965,1.5785663812756403e-5,-5.692387796847087e-8,0.004058152876449292,1.5770755436499932e-5,-5.6892175274642595e-8,0.004058335730497766,1.56698047725992e-5,-5.6685842838322767e-8,0.004058575736492297,1.5495479753201927e-5,-5.6330312045967666e-8,0.004058901067412491,1.5274593050186677e-5,-5.587969998232432e-8,0.0040593292989023755,1.504744016568601e-5,-5.541556302293769e-8,0.004059860688647646,1.4863522530534258e-5,-5.5038323485976716e-8,0.004060472924789321,1.4772178278052189e-5,-5.484831991380623e-8,0.004061121016256655,1.4808824187926628e-5,-5.491786333355384e-8,0.004061745398388068,1.4980995070619321e-5,-5.526278213620586e-8,0.0040622878335508355,1.5260905424743596e-5,-5.58271445794069e-8,0.00406270977840194,1.5589957864201896e-5,-5.6492254117461846e-8,0.004063005280007226,1.5895053516072876e-5,-5.71096919262533e-8,0.004063202722944347,1.611033761314179e-5,-5.7545486920249105e-8,0.004063355322523949,1.6195737978189514e-5,-5.7717829505718655e-8,0.004063524982892078,1.614629397440836e-5,-5.761611433490631e-8,0.0040637654881181635,1.5990874718776372e-5,-5.729846921069878e-8,0.0040641096822484745,1.5782374878243806e-5,-5.687200018963553e-8,0.004064563196214051,1.558309622417832e-5,-5.646323142518138e-8,0.004065105372946402,1.5449401160722053e-5,-5.6186965778914343e-8,0.004065696400389077,1.5419375479983378e-5,-5.612111731815594e-8,0.004066288252635861,1.5506240841777267e-5,-5.6293121212787874e-8,0.004066836155862962,1.5698542971993716e-5,-5.668010909236039e-8,0.004067307459695976,1.5966009975132922e-5,-5.7220705532581126e-8,0.00406768613309999,1.6268363193234948e-5,-5.783296271933897e-8,0.004067972917711898,1.6564106468153707e-5,-5.8432340733695405e-8,0.004068182486831887,1.681727652571284e-5,-5.894554234053274e-8,0.00406833933892352,1.7001503611134662e-5,-5.931880776278692e-8,0.004068473756113949,1.7101841750667816e-5,-5.952159722920657e-8,0.004068618388467829,1.7115337876791556e-5,-5.9547687041123166e-8,0.004068805319711415,1.7051183194416186e-5,-5.941546370891142e-8,0.004069063045413328,1.693080237181354e-5,-5.9168176976249445e-8,0.004069412642286213,1.6787584460103433e-5,-5.887352588619779e-8,0.004069862675046376,1.6665125654505054e-5,-5.862021049541122e-8,0.0040704033862420915,1.6612132979317868e-5,-5.8507611354420696e-8,0.004071002433343476,1.6672362317351996e-5,-5.8625252169843815e-8,0.004071606146962371,1.6870078458229394e-5,-5.90230533337598e-8,0.004072150180031084,1.7195707718266797e-5,-5.968194828764344e-8,0.004072579327330133,1.7600304654934825e-5,-6.050250155157372e-8,0.004072869038903364,1.800622384140864e-5,-6.132663264350784e-8,0.004073036765467772,1.8332569931295446e-5,-6.1989505493645e-8,0.004073135737926338,1.852349328887892e-5,-6.237718185712606e-8,0.004073234663677566,1.85650892687075e-5,-6.246099877342193e-8,0.004073394556097025,1.848476914851136e-5,-6.229627231999442e-8,0.004073652726352091,1.833737723399551e-5,-6.199414171839608e-8,0.004074017372470005,1.818678426452505e-5,-6.168431508746106e-8,0.0040744707750797445,1.808984214398682e-5,-6.148259812586677e-8,0.004074977337424825,1.8085790232343694e-5,-6.14693541796517e-8,0.004075493263269258,1.8191439776279438e-5,-6.167952512829171e-8,0.004075975798354961,1.840124607827241e-5,-6.210249277646861e-8,0.004076390776901895,1.8691144047334405e-5,-6.268964660170682e-8,0.004076717622217568,1.902494399145827e-5,-6.336732629192284e-8,0.004076951353972912,1.9361837440099986e-5,-6.405219775676581e-8,0.004077101746210127,1.96635091438295e-5,-6.46659095300111e-8,0.0040771903314508785,1.989970237527024e-5,-6.514655672234517e-8,0.004077246262806788,2.005165635670929e-5,-6.545569860243698e-8,0.004077302032084395,2.0113486301099913e-5,-6.558109876386352e-8,0.0040773896466789,2.0092092019349717e-5,-6.553647593087778e-8,0.004077537342209875,2.0006253451383885e-5,-6.535969647604283e-8,0.004077766555167821,1.988527789663943e-5,-6.511016738314298e-8,0.004078088689458051,1.976710784085783e-5,-6.486516989220184e-8,0.004078501328342447,1.96951136887764e-5,-6.471343334262049e-8,0.004078984379126887,1.971216651307541e-5,-6.474300004433253e-8,0.004079498090171917,1.985082590723176e-5,-6.502100525056876e-8,0.004079986278779378,2.0120252289371937e-5,-6.55667052274478e-8,0.004080388235941525,2.0494122797303468e-5,-6.632662153528476e-8,0.004080659282108669,2.0908086133771597e-5,-6.716933519624624e-8,0.0040807921628955995,2.1274886377819846e-5,-6.791652262392293e-8,0.004080825530396653,2.151542116556529e-5,-6.840653341073122e-8,0.00408083076942298,2.1590301346052778e-5,-6.855881484240877e-8,0.00408088328291802,2.1513241158620907e-5,-6.84010788689678e-8,0.004081035155949392,2.134019848115492e-5,-6.804703209129059e-8,0.004081302546732209,2.1144355238359504e-5,-6.764545015636383e-8,0.004081668918553097,2.0992072249557375e-5,-6.733141248227607e-8,0.00408209685499066,2.092848134334002e-5,-6.719713964870882e-8,0.004082540990125184,2.09731231952271e-5,-6.72830951751148e-8,0.004082958197133572,2.112218615191573e-5,-6.758231956110174e-8,0.00408331422869279,2.1353847294547875e-5,-6.805099975797541e-8,0.0040835874057665485,2.1634567155020024e-5,-6.862106700376206e-8,0.004083770116681637,2.1925434668298697e-5,-6.921309213990532e-8,0.004083868551366543,2.218816882099307e-5,-6.974866033503243e-8,0.0040839008942840345,2.239039499761978e-5,-7.016132947403248e-8,0.004083894232067077,2.250978778831476e-5,-7.0405207142333e-8,0.004083880571241067,2.25366960163881e-5,-7.046030306590217e-8,0.00408389252947929,2.2475031488631666e-5,-7.033426314434203e-8,0.004083959249418965,2.2341562177163083e-5,-7.00608865512821e-8,0.004084102836943754,2.2163971654346905e-5,-6.969625158825354e-8,0.004084335399848269,2.1977972812721735e-5,-6.931302372966625e-8,0.004084656614019778,2.1823582213426522e-5,-6.899305140282665e-8,0.004085051725131036,2.1740298666453316e-5,-6.881758196303943e-8,0.00408549043013785,2.1760499615591525e-5,-6.88536205880247e-8,0.004085928134416261,2.1900671848150498e-5,-6.913569532030017e-8,0.0040863118371121795,2.215161693360532e-5,-6.964550832191338e-8,0.004086592559838579,2.2471365259167905e-5,-7.029728262333709e-8,0.004086743511323791,2.278742626781085e-5,-7.094245749548945e-8,0.004086777069432108,2.3014650869490377e-5,-7.140649996468963e-8,0.004086748324489586,2.3086554162397423e-5,-7.155319319147187e-8,0.004086737210606845,2.298478523801362e-5,-7.134486880118048e-8,0.0040868162246094596,2.274751838270059e-5,-7.085933294161156e-8,0.004087022774633262,2.245098166859568e-5,-7.025197183973786e-8,0.004087351063401967,2.21773293531232e-5,-6.969023534135919e-8,0.004087762942117613,2.1988078250473938e-5,-6.929965848306815e-8,0.004088206426731321,2.1912888693068682e-5,-6.914113536613453e-8,0.0040886315320029145,2.1951514131721826e-5,-6.921484527465759e-8,0.004088999563181579,2.2082048330308014e-5,-6.947683655171173e-8,0.004089286694209541,2.227007195705091e-5,-6.985740065000953e-8,0.0040894840997412005,2.2476260228544262e-5,-7.027641992708612e-8,0.004089596524746182,2.2662126678655353e-5,-7.065510425729817e-8,0.004089640201779963,2.2794420332461283e-5,-7.092513321189004e-8,0.0040896402838893646,2.284862699133553e-5,-7.103599943485881e-8,0.004089627705490863,2.2811697616913437e-5,-7.096068474456991e-8,0.004089635411507748,2.2683801109797253e-5,-7.069921973276663e-8,0.004089694115390104,2.2478677051700234e-5,-7.027932793650815e-8,0.004089828036207196,2.2222286505042233e-5,-6.975365444924291e-8,0.004090051161470819,2.1949786269337134e-5,-6.919369964114232e-8,0.004090364511991667,2.170103932630054e-5,-6.86808528694382e-8,0.004090754790796106,2.151498959955255e-5,-6.829506592183514e-8,0.004091194666195651,2.142330844766789e-5,-6.810185855541579e-8,0.004091644993372157,2.1443624281504225e-5,-6.813824314344391e-8,0.0040920596967446154,2.1572833523424404e-5,-6.83986719144852e-8,0.004092394222561333,2.1782031162445324e-5,-6.88243378416857e-8,0.00409261763274889,2.2016102025325163e-5,-6.93022303226837e-8,0.0040927261558925485,2.2201941671687712e-5,-6.968213454108016e-8,0.004092752390399775,2.226781056753669e-5,-6.98165868041908e-8,0.004092761828782771,2.217010941896625e-5,-6.961594162020133e-8,0.004092832347522563,2.191489742469643e-5,-6.90924145000651e-8,0.004093023916310563,2.1559197363135236e-5,-6.836256507621499e-8,0.004093355382863215,2.1188443825140062e-5,-6.760103065423595e-8,0.004093801442773309,2.0883140487863215e-5,-6.697239893387999e-8,0.004094308353665391,2.0693642127327703e-5,-6.657980636574702e-8,0.004094815962852751,2.0632674505226746e-5,-6.644971858931919e-8,0.0040952745320277885,2.068224872375703e-5,-6.654596569206641e-8,0.0040956524926629954,2.0806194730034872e-5,-6.67951505187713e-8,0.004095937126088291,2.0961685991746184e-5,-6.711000602505771e-8,0.004096131713874594,2.1107263596701378e-5,-6.740571701477901e-8,0.004096251810518326,2.1207630473032185e-5,-6.760979080112129e-8,0.004096321810660583,2.123646163530461e-5,-6.766796655208107e-8,0.004096371868974252,2.117828020698269e-5,-6.754820351325027e-8,0.004096434786498749,2.102987222746858e-5,-6.724363080817744e-8,0.0040965424713340064,2.0801158863912584e-5,-6.677428971329367e-8,0.004096721827951759,2.0514974467630822e-5,-6.618661611930796e-8,0.004096990403276643,2.0205057223031076e-5,-6.554934138305202e-8,0.004097352573177603,1.9911884762201487e-5,-6.494509874821933e-8,0.0040977972420050135,1.9676507214749987e-5,-6.445798705026133e-8,0.00409829795293573,1.953307645034436e-5,-6.415839226662203e-8,0.00409881595753222,1.950131413892924e-5,-6.408749767114518e-8,0.0040993062317397294,1.958041987144307e-5,-6.424454113672405e-8,0.004099725949858662,1.9745840788228674e-5,-6.457984351456717e-8,0.004100044534043069,1.9950335607570126e-5,-6.499672432697775e-8,0.004100253632198516,2.013084019847643e-5,-6.536554032319219e-8,0.004100374104936217,2.0221969791798727e-5,-6.555157283498206e-8,0.004100455954183344,2.017477740412432e-5,-6.545379905395303e-8,0.0041005675891791,1.9975516702515512e-5,-6.504358355699308e-8,0.004100774805833544,1.965545542492212e-5,-6.438482789008002e-8,0.004101116885460426,1.928372582152993e-5,-6.361922074229146e-8,0.004101591870619371,1.894360567216253e-5,-6.291755062884213e-8,0.004102159238000308,1.8703470116557066e-5,-6.242018269746027e-8,0.00410275747591571,1.859703517591237e-5,-6.219659152435074e-8,0.0041033257619690735,1.8620141853715126e-5,-6.223872071816769e-8,0.004103819526959297,1.874065523208672e-5,-6.248114525442182e-8,0.004104216341986781,1.8912959818053868e-5,-6.283064370406833e-8,0.004104514378076207,1.909031638156852e-5,-6.319144791179558e-8,0.004104727475774354,1.9232607115184218e-5,-6.348113509152911e-8,0.004104879851426564,1.931006277488053e-5,-6.363836365897142e-8,0.004105001750774871,1.9304641429037065e-5,-6.362581755356893e-8,0.004105126061105588,1.9210481227772614e-5,-6.343120965738759e-8,0.004105285298052878,1.903412670485694e-5,-6.306774716776545e-8,0.004105508333763851,1.879451414608241e-5,-6.257405625726658e-8,0.004105816518487927,1.8522105372562953e-5,-6.201237977882163e-8,0.004106219408261088,1.8256224455901378e-5,-6.146316659960243e-8,0.004106711031782206,1.8039834534071813e-5,-6.101448588822051e-8,0.00410726820104739,1.7911758794004197e-5,-6.074620274769431e-8,0.00410785241819564,1.7897526858302653e-5,-6.071123337928272e-8,0.004108416180285091,1.8001212401072268e-5,-6.091866896065255e-8,0.0041089130241994485,1.820113748087769e-5,-6.132469615222139e-8,0.004109309104207408,1.8451646262672002e-5,-6.183595690444914e-8,0.0041095931983087045,1.869153552715818e-5,-6.232669811154938e-8,0.004109782084836411,1.8857869433917337e-5,-6.266717936609684e-8,0.004109919049387194,1.890226775739589e-5,-6.275732940350907e-8,0.004110064678761718,1.8805497319272342e-5,-6.255697025959145e-8,0.004110281124285083,1.858555641793577e-5,-6.210261238000375e-8,0.004110613703963449,1.829511610327427e-5,-6.150227952510236e-8,0.004111076186029953,1.8007169267841526e-5,-6.090602884987728e-8,0.004111646199815092,1.779292050803584e-5,-6.046048759796877e-8,0.0041122733354077975,1.770055011084275e-5,-6.026514317284309e-8,0.0041128962379817155,1.774357289428051e-5,-6.034829633072815e-8,0.004113460777981091,1.790224628658376e-5,-6.06698069713779e-8,0.004113932211375858,1.8134726118468195e-5,-6.114390913053563e-8,0.004114298813701848,1.8391239948785017e-5,-6.166830949707429e-8,0.004114568894174971,1.862570592744579e-5,-6.214811466500701e-8,0.004114764817887481,1.8802594772439982e-5,-6.251002429640857e-8,0.004114916941016438,1.8899611324047082e-5,-6.270792853777051e-8,0.004115058788903396,1.8907892822336005e-5,-6.272336282371548e-8,0.004115223529956793,1.883126597625609e-5,-6.256398245923092e-8,0.00411544112890223,1.8685396522870248e-5,-6.226179188618023e-8,0.004115735426728429,1.8496880076378558e-5,-6.187126850283822e-8,0.004116120670135077,1.830166124887891e-5,-6.146615285795259e-8,0.0041165976094830435,1.8141735245261587e-5,-6.113275473128614e-8,0.0041171501459813615,1.8059102673713814e-5,-6.095761535265301e-8,0.0041177444298378775,1.808677278934742e-5,-6.100903876410642e-8,0.0041183326482072515,1.8238377845822922e-5,-6.131565461947553e-8,0.004118862644895194,1.8500025366803055e-5,-6.184947666116739e-8,0.004119291845670744,1.882888305936909e-5,-6.252277761117837e-8,0.004119600995524518,1.916129270179671e-5,-6.320463576506777e-8,0.004119802051454148,1.9429176950619105e-5,-6.375467477591138e-8,0.004119936452241972,1.9579389208801835e-5,-6.406297574667329e-8,0.004120063979010977,1.958911524116044e-5,-6.408192449547398e-8,0.004120246088908799,1.9472222424355246e-5,-6.383944294513096e-8,0.00412052913259154,1.927501773422856e-5,-6.343041897475507e-8,0.004120932292519319,1.906320686341203e-5,-6.299000026420115e-8,0.0041214433902594435,1.890409343719484e-5,-6.265701578056743e-8,0.004122023468462977,1.884920647966687e-5,-6.253815085908088e-8,0.004122618451191795,1.8922390072082127e-5,-6.268323571647604e-8,0.004123173897075194,1.911656377839061e-5,-6.307832429936484e-8,0.0041236480036418895,1.939920158835302e-5,-6.365677983994343e-8,0.004124019202185466,1.9723461236942205e-5,-6.432213367561228e-8,0.004124287288244285,2.0040448516884058e-5,-6.49734234542431e-8,0.004124469567213898,2.0308896945277934e-5,-6.552527867409888e-8,0.004124594685466592,2.050066336393985e-5,-6.591937018917111e-8,0.004124696486907284,2.0602417835979338e-5,-6.61279466825767e-8,0.004124809121272801,2.0614914334906605e-5,-6.615231627858997e-8,0.00412496354787499,2.055127128513555e-5,-6.601926590271963e-8,0.004125184918062037,2.0435134717556e-5,-6.57772755655983e-8,0.004125490124622406,2.029885113054249e-5,-6.549281651963915e-8,0.004125884999648892,2.0181120072676474e-5,-6.524562199853932e-8,0.004126361187835996,2.012312227810521e-5,-6.512079755335909e-8,0.004126893637683346,2.016202160381174e-5,-6.519543374690128e-8,0.0041274407643772945,2.0321520249793008e-5,-6.551902559572129e-8,0.0041279499280898095,2.0601210358685798e-5,-6.609131944530118e-8,0.00412836969991199,2.0969274287628928e-5,-6.684706034379096e-8,0.004128666706476001,2.1364544730577544e-5,-6.766013860494177e-8,0.0041288402130868545,2.1711284432474734e-5,-6.837410979895914e-8,0.0041289260941142205,2.1943052421982018e-5,-6.88515335136089e-8,0.0041289863790102055,2.2025323150899638e-5,-6.902071138081227e-8,0.004129088666642758,2.1966206179071726e-5,-6.889782614187511e-8,0.0041292849632450085,2.1811418243791324e-5,-6.857662713945957e-8,0.0041295982485091585,2.1627811881081866e-5,-6.819461136355642e-8,0.004130019713586947,2.1483464269815928e-5,-6.789215710034456e-8,0.004130514847826705,2.1431037977969292e-5,-6.777831067919666e-8,0.004131034556120914,2.1497848193685356e-5,-6.79102050168444e-8,0.0041315275855180284,2.1683260008845836e-5,-6.828741599827955e-8,0.0041319514162801475,2.196236627165169e-5,-6.885922779761631e-8,0.0041322797208666745,2.2294052841138688e-5,-6.95410620986726e-8,0.004132505435793167,2.2631076927335552e-5,-7.023526137874012e-8,0.004132639559466678,2.2929656701609897e-5,-7.085103297987233e-8,0.0041327068073958445,2.3156619956378226e-5,-7.131941152567361e-8,0.004132739789933165,2.329325563893979e-5,-7.160135080100659e-8,0.0041327732697304005,2.3336073204430915e-5,-7.168931655885992e-8,0.004132839498526474,2.3295362222597494e-5,-7.160425905283545e-8,0.00413296489491445,2.319267720853539e-5,-7.139037898864675e-8,0.004133167727447015,2.3058081690060263e-5,-7.110948143247038e-8,0.004133456251584568,2.2927368246838634e-5,-7.083536734083875e-8,0.004133826864680379,2.2838893766911416e-5,-7.064744138921729e-8,0.004134262246139552,2.2829234263837425e-5,-7.062178621276581e-8,0.004134730285875639,2.2926717969593375e-5,-7.081769093706275e-8,0.004135185707911027,2.31425991815179e-5,-7.125916402041035e-8,0.0041355769071945506,2.346164589422353e-5,-7.191520269449173e-8,0.004135859441965122,2.383687117408675e-5,-7.268874415754124e-8,0.00413601369908566,2.4195039750171892e-5,-7.342810252300716e-8,0.004136058529573073,2.4456681249135846e-5,-7.396855759155849e-8,0.004136050487278654,2.456513384479195e-5,-7.419258398190955e-8,0.004136065019007573,2.4509860369459744e-5,-7.407805053129414e-8,0.004136168231272512,2.4330162569653813e-5,-7.370577611668552e-8,0.004136394459822497,2.409789030051738e-5,-7.322376999160329e-8,0.0041367395368764786,2.389056192725738e-5,-7.279186780905995e-8,0.0041371686481556655,2.3768649735412706e-5,-7.253505860848046e-8,0.004137631091783037,2.3763952092816136e-5,-7.251957894397494e-8,0.0041380747660009765,2.3878490225956004e-5,-7.275049880309497e-8,0.004138456791204421,2.4090059448810835e-5,-7.318286374029693e-8,0.004138749601503419,2.4360668956780575e-5,-7.37387885346733e-8,0.004138943194899096,2.4645468588374668e-5,-7.4325712073413e-8,0.004139044422775969,2.49009409295305e-5,-7.485336553975188e-8,0.0041390740178470385,2.509158954761269e-5,-7.52478055388981e-8,0.004139062078858488,2.519450532721772e-5,-7.546109277291754e-8,0.004139042857680081,2.5201537323836e-5,-7.547591881161818e-8,0.004139049681730755,2.5119185084212284e-5,-7.530538123596477e-8,0.004139110696144454,2.4966623708413148e-5,-7.498882514872912e-8,0.004139245793706889,2.4772544989273615e-5,-7.458527889421062e-8,0.004139464664095014,2.4571523457755883e-5,-7.416602259172535e-8,0.0041397656452513715,2.4400247311316832e-5,-7.380696250121588e-8,0.004140135103394312,2.4293510720908743e-5,-7.358048043260725e-8,0.004140547313718007,2.427954414351527e-5,-7.354575599206736e-8,0.004140965413628404,2.4374141223041407e-5,-7.373639326420042e-8,0.004141344873455721,2.457362346913388e-5,-7.414551482757032e-8,0.004141641326420783,2.48483642172095e-5,-7.471205791422762e-8,0.0041418235765014145,2.5141002654557318e-5,-7.53169965475809e-8,0.004141889215372904,2.537511100337642e-5,-7.58014858398564e-8,0.004141874921065243,2.5477517766043897e-5,-7.601342829768719e-8,0.004141851043315424,2.5408217951499304e-5,-7.58696248028512e-8,0.004141897199717203,2.5181416417097176e-5,-7.539927233814727e-8,0.004142070032062376,2.4862233791190885e-5,-7.473692425033855e-8,0.004142382136416294,2.4539521848464896e-5,-7.406615519129582e-8,0.004142802962387187,2.4291862821753357e-5,-7.354938496791458e-8,0.004143276515293847,2.4165133492908547e-5,-7.328171206236878e-8,0.004143742610608551,2.416776805253065e-5,-7.328119646301892e-8,0.004144152149564842,2.427840550811608e-5,-7.350451056510971e-8,0.004144474270556827,2.4457891470911152e-5,-7.387144252687797e-8,0.004144697408744952,2.4660435604785124e-5,-7.428767698568889e-8,0.004144827026181618,2.484202674459949e-5,-7.466207837487929e-8,0.004144881994566124,2.4966196964502726e-5,-7.491871231531306e-8,0.0041448905048311665,2.500781452275799e-5,-7.500493400442998e-8,0.004144885711446158,2.4955282841337656e-5,-7.489617429690564e-8,0.004144901261135358,2.481120187725696e-5,-7.459741678649363e-8,0.004144966982912023,2.4591489692204364e-5,-7.41413441693972e-8,0.004145105121592094,2.4322991873659133e-5,-7.358329870301691e-8,0.004145327544473218,2.403980237268326e-5,-7.299364256044502e-8,0.004145634190738719,2.377879003345024e-5,-7.24485997969921e-8,0.0041460127758167105,2.3574818073592004e-5,-7.202053283003591e-8,0.00414643966336036,2.3455929817344242e-5,-7.17680808924154e-8,0.004146881876040019,2.343860803994068e-5,-7.172625974921142e-8,0.0041473004753961136,2.3523144481116746e-5,-7.189658153429537e-8,0.004147656007247302,2.3689506623327728e-5,-7.223811648289735e-8,0.004147916808771172,2.3895221603221915e-5,-7.266284458651311e-8,0.0041480699650081705,2.4078275121643128e-5,-7.304167053080141e-8,0.004148132195104441,2.4168654642653938e-5,-7.322864004199276e-8,0.004148154320381181,2.4109831376965727e-5,-7.310586674653458e-8,0.004148211444887462,2.388423375298592e-5,-7.263656875158706e-8,0.004148377033934869,2.3528252738308904e-5,-7.189610084153054e-8,0.004148691963497075,2.3123109596003326e-5,-7.105280147716092e-8,0.0041491473031022115,2.27629923552026e-5,-7.030185625864194e-8,0.004149691355374006,2.251899382813585e-5,-6.979067613092937e-8,0.004150253959921051,2.2418989460666156e-5,-6.957735617198645e-8,0.0041507716459602394,2.2449203170718728e-5,-6.963393426794152e-8,0.0041512023452277315,2.2568972898863263e-5,-6.987681903782312e-8,0.004151528686471275,2.2727414027209948e-5,-7.020106669410957e-8,0.004151754402958528,2.287579296648152e-5,-7.050582576156142e-8,0.004151898371708361,2.2974592076086222e-5,-7.070894000466604e-8,0.004151988885126911,2.2996670531363484e-5,-7.075363347500511e-8,0.004152058955955876,2.2928322974470473e-5,-7.061092750138042e-8,0.004152142382845093,2.2769356506527704e-5,-7.02799821925708e-8,0.0041522701226427315,2.253246200945357e-5,-6.978684571499767e-8,0.004152466791086021,2.2241707192617996e-5,-6.91812637823709e-8,0.004152747431065876,2.192983419561754e-5,-6.853098876725601e-8,0.004153115009949348,2.163416853510276e-5,-6.791329347391853e-8,0.004153559267504416,2.1391372281000134e-5,-6.740420502635174e-8,0.004154057371060857,2.1231670864169294e-5,-6.706668724391143e-8,0.004154576533781043,2.1173336928637963e-5,-6.693925978559595e-8,0.004155078480972005,2.121824985076246e-5,-6.702665399660066e-8,0.00415552544495053,2.1349266802329204e-5,-6.729405133405011e-8,0.004155887326128362,2.153005321203464e-5,-6.76663910045802e-8,0.004156149549489265,2.1708297200182368e-5,-6.803485371706521e-8,0.004156320429207047,2.18236504091612e-5,-6.827342868724723e-8,0.004156435436193511,2.1821325191162423e-5,-6.826745995209362e-8,0.004156554325266331,2.1670061717922965e-5,-6.795132318021076e-8,0.004156747395736589,2.137880483492358e-5,-6.734326680703699e-8,0.004157071827894007,2.100211751024774e-5,-6.655662407843876e-8,0.004157547507220719,2.0626045399976664e-5,-6.577030263586701e-8,0.004158146618620178,2.033725265562143e-5,-6.516458127082557e-8,0.0041588047435924405,2.0191197783449442e-5,-6.485500848833399e-8,0.00415944679960301,2.0196654226797564e-5,-6.486025586921148e-8,0.004160012347865569,2.0321627878139327e-5,-6.51143438105989e-8,0.004160468885463152,2.0512010737360385e-5,-6.550526134746365e-8,0.004160812154099564,2.071068901280456e-5,-6.591452917912113e-8,0.004161059067630895,2.087014425419266e-5,-6.624331294613351e-8,0.004161239040043181,2.095792204410952e-5,-6.642382604808944e-8,0.004161386829742425,2.095738077188751e-5,-6.642102047979822e-8,0.0041615375835493676,2.0866361049708102e-5,-6.622998144256762e-8,0.004161723445766619,2.069540030448162e-5,-6.587231810027344e-8,0.004161970833005958,2.0465957657424777e-5,-6.53924752623177e-8,0.004162297807662163,2.0208374532718804e-5,-6.485342857751e-8,0.004162711465524075,1.9958972538912966e-5,-6.433060157681065e-8,0.004163205788963567,1.9755721872438256e-5,-6.390289279020207e-8,0.004163760874885751,1.9632401292486634e-5,-6.364064398012052e-8,0.0041643445126078645,1.9611945515193513e-5,-6.359191191485507e-8,0.004164916661599382,1.9700370056451175e-5,-6.376982675484982e-8,0.004165436593260296,1.9883038081479463e-5,-6.414465536185601e-8,0.004165871533002719,2.0124840290481865e-5,-6.464389273479223e-8,0.004166204973161034,2.03750141868381e-5,-6.516203187808346e-8,0.0041664427071129,2.0576291719662896e-5,-6.557950750839939e-8,0.004166614831251215,2.067725739446178e-5,-6.578854573835485e-8,0.004166772201513261,2.064596860090837e-5,-6.572180046924913e-8,0.004166976394844767,2.0481684872547044e-5,-6.537706967734264e-8,0.004167283762105637,2.0220289969068403e-5,-6.482876722062341e-8,0.0041677270966903575,1.9928853053708316e-5,-6.42166276496646e-8,0.004168301889621721,1.9687639520167372e-5,-6.370817178698891e-8,0.004168964945397345,1.9564346141463034e-5,-6.344493463573707e-8,0.0041696482095524585,1.9591663234778752e-5,-6.349560115607152e-8,0.004170281928490304,1.975909669494271e-5,-6.383883261318782e-8,0.004170815776114936,2.002177562328637e-5,-6.438149484450375e-8,0.004171229165072177,2.0319307693815556e-5,-6.499787658365365e-8,0.004171529641595815,2.0594371506068787e-5,-6.556842529790701e-8,0.004171744205095692,2.08044574697309e-5,-6.600426377969002e-8,0.004171909319060356,2.0925909999591906e-5,-6.625570255367975e-8,0.004172063035543002,2.095283945319605e-5,-6.631007474738575e-8,0.004172240006446445,2.0893942567726186e-5,-6.618518936112582e-8,0.004172468631381149,2.0769185793469826e-5,-6.592244924085984e-8,0.00417276921141435,2.0606998287037323e-5,-6.558098507505531e-8,0.004173152263607924,2.044171213681954e-5,-6.523229587640529e-8,0.004173616699217774,2.0310521591751063e-5,-6.49539193513707e-8,0.004174148228173609,2.0249146804649307e-5,-6.482044670278411e-8,0.0041747190205534725,2.0285797724636808e-5,-6.489100076513135e-8,0.004175290038969232,2.043401685070224e-5,-6.519431780277011e-8,0.004175817138082009,2.0686286120805764e-5,-6.571531492271147e-8,0.004176260742955059,2.1011275247548487e-5,-6.638915896100802e-8,0.004176596947866172,2.135738903704526e-5,-6.710846106930013e-8,0.004176826283818876,2.1663316572518304e-5,-6.774516430718877e-8,0.004176976440504031,2.187329985370935e-5,-6.818241888125293e-8,0.004177097171342621,2.1952541600749897e-5,-6.834687461472092e-8,0.004177248393652027,2.1897850265493772e-5,-6.823110493770005e-8,0.004177484698447774,2.1740143881249863e-5,-6.789904756326871e-8,0.004177840456289382,2.153777152476557e-5,-6.74722389787032e-8,0.004178319648003268,2.1361956093379974e-5,-6.709951969906079e-8,0.004178893720907776,2.1277850737766288e-5,-6.69174602353876e-8,0.004179508920172153,2.1326593435868438e-5,-6.701273548062968e-8,0.00418010143870764,2.1514398644594126e-5,-6.739909921106913e-8,0.004180615325979776,2.181278040040501e-5,-6.801760816720763e-8,0.004181016588925626,2.2169477458321236e-5,-6.875930338309788e-8,0.004181298828271539,2.2524986894682156e-5,-6.949975199756988e-8,0.004181480040607371,2.282791399696808e-5,-7.013122390191389e-8,0.0041815939531634075,2.304443453220907e-5,-7.058260201965475e-8,0.004181680312312281,2.3160968578745368e-5,-7.082508197011263e-8,0.0041817771738139765,2.31820016723154e-5,-7.086767934850143e-8,0.004181916138040746,2.3125777208913207e-5,-7.074824050457918e-8,0.004182119981389813,2.301988109644779e-5,-7.052420786013162e-8,0.004182401587912403,2.2897560902910874e-5,-7.026493333350233e-8,0.004182763226082177,2.279464572132352e-5,-7.004528039888718e-8,0.004183195714757309,2.27463722411251e-5,-6.993905040066949e-8,0.0041836776903782045,2.2783245722880823e-5,-7.001037080800247e-8,0.004184175936522711,2.2925337371297516e-5,-7.030174363642383e-8,0.004184648351533992,2.3175376573468616e-5,-7.081948145094982e-8,0.00418505106926234,2.351265779926658e-5,-7.152078397866612e-8,0.00418534981740814,2.3891456557676195e-5,-7.231026107348822e-8,0.004185532699444083,2.4247798955379997e-5,-7.305402455302344e-8,0.0041856186975773695,2.4515523630203316e-5,-7.361333203789702e-8,0.004185656116733408,2.4647127383329684e-5,-7.388829334143641e-8,0.004185709463990267,2.4630561585255983e-5,-7.385309068068146e-8,0.004185839553237669,2.4494045601495442e-5,-7.356612233607162e-8,0.004186085175026919,2.4297013898756418e-5,-7.315119149276783e-8,0.004186453058714402,2.4111865678345753e-5,-7.275951997366621e-8,0.00418691819641979,2.4003918546233812e-5,-7.252797509274851e-8,0.004187432570247736,2.4015686123816057e-5,-7.254618294928173e-8,0.004187938527366445,2.4158751006996613e-5,-7.283932258420115e-8,0.00418838289655064,2.4413937365967342e-5,-7.336815666881627e-8,0.004188728513422404,2.4738606360928003e-5,-7.404399556996649e-8,0.00418896077263449,2.5078536869024493e-5,-7.475342352649681e-8,0.004189088187108331,2.5380979408035573e-5,-7.538568393181177e-8,0.004189137637378765,2.560542386655624e-5,-7.585541248978948e-8,0.004189146482758514,2.5729746333905715e-5,-7.611571356090715e-8,0.004189154226481784,2.5751295531856018e-5,-7.616056328669566e-8,0.004189195811872894,2.5684118435083626e-5,-7.601902615037475e-8,0.004189297432699497,2.55542284301067e-5,-7.574531169066045e-8,0.004189474640743976,2.539461358412779e-5,-7.54082984053367e-8,0.004189731923761839,2.5240920754474522e-5,-7.508253449426259e-8,0.004190062893369365,2.5127892543049684e-5,-7.484086743090381e-8,0.004190450577587119,2.508605327542561e-5,-7.474758404267058e-8,0.004190867863493793,2.5137902888573805e-5,-7.48504270355493e-8,0.004191278851066964,2.5293029167128904e-5,-7.517021445445091e-8,0.004191642553303303,2.55423836176811e-5,-7.568861108228818e-8,0.004191920429727899,2.585359199989586e-5,-7.633807975528864e-8,0.004192087961726734,2.6171043691637975e-5,-7.700197953776512e-8,0.0041921473996541884,2.6425138639552714e-5,-7.753404214212685e-8,0.004192134962329874,2.655208648022618e-5,-7.780007245043969e-8,0.004192114992464122,2.6518357750800253e-5,-7.772933711625707e-8,0.004192159595389882,2.6337159580545134e-5,-7.734907825665287e-8,0.0041923223662205,2.6066037508450072e-5,-7.677941655751047e-8,0.004192619875803577,2.578592305862587e-5,-7.618950486964727e-8,0.0041930293080447165,2.557321200031067e-5,-7.57392457018824e-8,0.004193500258489232,2.5478197525003033e-5,-7.553431849801728e-8,0.004193972401104941,2.5516253407646417e-5,-7.560771560475328e-8,0.004194391412284077,2.5670481527066318e-5,-7.592504671513956e-8,0.004194719476384159,2.5901118869691845e-5,-7.640387556528128e-8,0.004194939943894964,2.6157253045760205e-5,-7.693795310378307e-8,0.004195057196908215,2.6387965736528168e-5,-7.742045708403442e-8,0.004195093049339342,2.655137914482246e-5,-7.776307074307687e-8,0.0041950809049979216,2.662075619193178e-5,-7.790902792572845e-8,0.0041950589164355375,2.6587196549228087e-5,-7.783901651533447e-8,0.004195063418449753,2.6459035460426867e-5,-7.75700484300396e-8,0.004195123687424457,2.6258649342688074e-5,-7.714875237095379e-8,0.004195258624765763,2.6017731648806405e-5,-7.664139315682479e-8,0.0041954753979068695,2.5772178721423704e-5,-7.612311259338277e-8,0.004195769575099257,2.5557431308106203e-5,-7.566822001278618e-8,0.004196126138573454,2.540453466231477e-5,-7.534204817948078e-8,0.004196520954855405,2.53367037714102e-5,-7.51938225051339e-8,0.004196922622790946,2.5365966871741377e-5,-7.524954946219042e-8,0.004197295156724912,2.5489504985313087e-5,-7.550410520029874e-8,0.004197602564194241,2.5685951525308174e-5,-7.591317047680027e-8,0.004197816369561635,2.5913292788382522e-5,-7.638861304882352e-8,0.004197925960352721,2.6111518336327034e-5,-7.68040568734833e-8,0.004197949030411529,2.6213720596972247e-5,-7.701841069760118e-8,0.004197935777056729,2.6166841984154432e-5,-7.691972134593537e-8,0.004197959246279704,2.5955973534895593e-5,-7.647632694596954e-8,0.004198090449018128,2.561816100677808e-5,-7.576574198158926e-8,0.0041983690577137925,2.523320397695459e-5,-7.495518310321368e-8,0.00419878704502883,2.4893403872054307e-5,-7.423809664192561e-8,0.004199294657828197,2.466944744060831e-5,-7.37627848726335e-8,0.004199822567905109,2.4590529631573546e-5,-7.35909004360926e-8,0.004200305861270729,2.4644214422214637e-5,-7.369713717322046e-8,0.0042006995521685,2.478930388189759e-5,-7.399597656866322e-8,0.0042009837510207735,2.497203494463084e-5,-7.437531825774549e-8,0.004201161612568837,2.5139530804678885e-5,-7.472443695283559e-8,0.0042012538478359,2.524867550071118e-5,-7.495254886807737e-8,0.004201292331705662,2.527094607106964e-5,-7.49991216701699e-8,0.00420131393742547,2.5194311755950153e-5,-7.483814941996342e-8,0.004201354951284227,2.502295376661067e-5,-7.447781373617757e-8,0.0042014462866753815,2.4775206437341213e-5,-7.395626000164893e-8,0.004201609778427287,2.448005996210069e-5,-7.333420007618452e-8,0.004201855844869758,2.4172631007671907e-5,-7.268529378705414e-8,0.004202182698645817,2.3889171851144942e-5,-7.208562808425933e-8,0.004202577017310062,2.3662279170995062e-5,-7.160372968477706e-8,0.004203015758641201,2.351672818202007e-5,-7.129194406720078e-8,0.004203468829726377,2.3466037764782944e-5,-7.11792747736706e-8,0.004203902457944527,2.3509754658052647e-5,-7.126556074908164e-8,0.004204283346550584,2.3631449505063676e-5,-7.151698648158335e-8,0.004204584061959764,2.3797752657327603e-5,-7.186374646115213e-8,0.0042047900364866496,2.3959694992948275e-5,-7.22027000677904e-8,0.0042049075001769935,2.4058568751254713e-5,-7.240978381987185e-8,0.004204969667533672,2.4038460412971196e-5,-7.23666645880367e-8,0.004205036113172845,2.386531479855544e-5,-7.200115046387884e-8,0.004205179685910332,2.3546624248548318e-5,-7.132872503889457e-8,0.0042054607744250174,2.313929579412769e-5,-7.046897812798647e-8,0.00420589989798239,2.27347232082449e-5,-6.961404483515537e-8,0.004206466015888612,2.242427014344388e-5,-6.895601774624227e-8,0.004207089445384607,2.2264274521212205e-5,-6.861351443079364e-8,0.004207690765000283,2.2260358548173973e-5,-6.859880736537034e-8,0.004208207794816714,2.2375384589948536e-5,-6.883449347627073e-8,0.004208608832725967,2.2550256047354552e-5,-6.919700655526116e-8,0.004208892174623421,2.2724239908018644e-5,-6.955907850228315e-8,0.0042090782601795,2.284808125073127e-5,-6.981713891001085e-8,0.004209200296160906,2.2889691428958756e-5,-6.990328564693268e-8,0.004209296350094005,2.283492007234416e-5,-6.97870980120373e-8,0.004209403565906254,2.268592751806816e-5,-6.947247890090181e-8,0.004209554005893156,2.2458595057271006e-5,-6.899240475833879e-8,0.004209771538720962,2.2179411033598958e-5,-6.840241608206303e-8,0.00421006954601963,2.1881833085248087e-5,-6.777287276654248e-8,0.0042104495193963105,2.1602047665670182e-5,-6.717991814560981e-8,0.0042109008189892645,2.137421177667367e-5,-6.669544160393412e-8,0.004211401868604031,2.1225620883696596e-5,-6.637699983388579e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json new file mode 100644 index 0000000..ea90103 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":25000,"numberOfSamples":1000,"samples":[0.0042119228229227776,2.117242668988509e-5,-6.625892772821196e-8,0.00421242951621424,2.1216421815835606e-5,-6.634559593072919e-8,0.004212888396602669,2.1343324948057996e-5,-6.660764965178544e-8,0.004213272077688695,2.1522955697259163e-5,-6.698208934125665e-8,0.004213565153061029,2.171164617537871e-5,-6.737707330135306e-8,0.004213769823711238,2.1857483451438128e-5,-6.768286051317844e-8,0.004213910198871436,2.190927122349849e-5,-6.779084064030356e-8,0.004214032922657624,2.1829493537962127e-5,-6.762116816618272e-8,0.004214200852587069,2.160938196621095e-5,-6.71548148810529e-8,0.004214477322022827,2.1280462370500936e-5,-6.645802296286292e-8,0.004214903100503305,2.091373094832423e-5,-6.568048925307495e-8,0.004215475880773675,2.0600151223130995e-5,-6.501412598684065e-8,0.004216145898744334,2.0417442948628495e-5,-6.462301093688222e-8,0.004216833579580056,2.0400376819345232e-5,-6.458079850055622e-8,0.004217459970123071,2.053157579362677e-5,-6.485132807375522e-8,0.004217972502130171,2.0755398012646987e-5,-6.531780445307867e-8,0.004218354775674382,2.100283844312381e-5,-6.583514699901046e-8,0.004218621473875984,2.1213061032032433e-5,-6.627523661803764e-8,0.004218806437975746,2.1344829856945014e-5,-6.655094448616457e-8,0.0042189509605779895,2.1378863630848206e-5,-6.662115374902181e-8,0.004219095409105211,2.1315105530184897e-5,-6.648517553484988e-8,0.004219274283414654,2.1168357298914947e-5,-6.617374421911176e-8,0.0042195135261831026,2.0964046864058137e-5,-6.574021509881736e-8,0.0042198289277669875,2.0734467344645254e-5,-6.52526270229363e-8,0.004220225061155502,2.0515161357874974e-5,-6.478598265567233e-8,0.004220694716869642,2.0341013243499278e-5,-6.441392136515793e-8,0.004221219187507694,2.024179213121955e-5,-6.419932023758131e-8,0.004221769966808666,2.0237378693578086e-5,-6.418431147260425e-8,0.0042223122778394,2.033346797221274e-5,-6.438129961003437e-8,0.004222810379006872,2.051879431947242e-5,-6.47670814186124e-8,0.0042232340746766765,2.0764877854194254e-5,-6.528213506219293e-8,0.004223565395287756,2.1029006330211313e-5,-6.583665389689409e-8,0.004223804128873946,2.1260585340412296e-5,-6.632374566900979e-8,0.004223970876957566,2.1410361180324564e-5,-6.663887945834917e-8,0.004224106369310762,2.14415465441151e-5,-6.670356203916723e-8,0.0042242657983087495,2.134115638552841e-5,-6.648957977625455e-8,0.004224507399419219,2.112855412696634e-5,-6.603731852191216e-8,0.004224876159364572,2.085686994094544e-5,-6.545888489491197e-8,0.004225386732174476,2.0603067839644234e-5,-6.491709513429656e-8,0.004226013160943935,2.0446027498544085e-5,-6.457905743766462e-8,0.004226693128151923,2.043932475634994e-5,-6.45585312505897e-8,0.004227347974683707,2.059163946791718e-5,-6.487440472016235e-8,0.004227909703767054,2.086563813515611e-5,-6.544822544194953e-8,0.004228341362829596,2.1195202646072075e-5,-6.614053530613902e-8,0.004228642402086946,2.1510125092377255e-5,-6.680302045077538e-8,0.004228840647210552,2.1755805619472572e-5,-6.732012834688552e-8,0.004228978598476052,2.190213346099413e-5,-6.762786101905045e-8,0.0042291010496863166,2.194302357527711e-5,-6.771287814009528e-8,0.0042292470592518745,2.1891133200885374e-5,-6.760145956889963e-8,0.004229446049571827,2.1771621167792976e-5,-6.73464393792848e-8,0.004229716468222322,2.1616855272094037e-5,-6.701607817399818e-8,0.004230065522044785,2.146232151279719e-5,-6.668539495546459e-8,0.004230489183412082,2.134317016838142e-5,-6.642880367863476e-8,0.004230972374903851,2.12906866823376e-5,-6.631261090471438e-8,0.004231489771832401,2.132821216102119e-5,-6.638640134078987e-8,0.00423200798906628,2.1466603019303647e-5,-6.667347585959588e-8,0.004232489876042049,2.1700112891328544e-5,-6.716214332465655e-8,0.004232901078212662,2.2004253231900497e-5,-6.780110661848243e-8,0.0042332180115707534,2.233735468493118e-5,-6.850259405413669e-8,0.004233435294041164,2.264690582136456e-5,-6.915558955274176e-8,0.004233570081750011,2.288024682846949e-5,-6.964836523197342e-8,0.004233661175459219,2.299740945877807e-5,-6.989570010663392e-8,0.00423376212210765,2.298272324126421e-5,-6.986362270031153e-8,0.004233929261141872,2.2851697779811398e-5,-6.958422181245012e-8,0.004234207211841524,2.2650495622957343e-5,-6.915475814576002e-8,0.004234615425259081,2.2446809897144912e-5,-6.871849564593151e-8,0.004235140014210337,2.231313047848069e-5,-6.842929415254376e-8,0.004235734703969059,2.230620625541042e-5,-6.840801170460767e-8,0.004236332511029088,2.2449320169543877e-5,-6.870475534746973e-8,0.004236865352914913,2.2724777630289437e-5,-6.928273029224622e-8,0.004237284245080581,2.3080599212484498e-5,-7.003223837757029e-8,0.004237571736415137,2.3448608166368112E-05,-7.080893495957507e-8,0.004237742342841121,2.3765484141766943e-5,-7.147847424023432e-8,0.004237833085799702,2.3988137660734125e-5,-7.194917126202141e-8,0.004237890189882673,2.4099447950975766e-5,-7.218425790080511e-8,0.004237957595590428,2.4105773514283147e-5,-7.219670738284095e-8,0.004238069919582637,2.4030269658422523e-5,-7.203516533111505e-8,0.004238249618365501,2.39056679238968e-5,-7.176871236223504e-8,0.004238506777009503,2.376842054507791e-5,-7.14744782604305e-8,0.004238839960336995,2.3654485763485328e-5,-7.122870298290076e-8,0.004239237195182148,2.359612316887198e-5,-7.109993006965748e-8,0.00423967689584437,2.3618836515735366e-5,-7.114251881836275e-8,0.00424012919339875,2.3737839999153642e-5,-7.138914208350213e-8,0.004240558555859129,2.3954028829091893e-5,-7.184219988672258e-8,0.004240928632216016,2.425035359666654e-5,-7.246603747851151e-8,0.004241209686151803,2.4590515496345863e-5,-7.31840475098621e-8,0.004241387602314709,2.4922420371615704e-5,-7.388587732093796e-8,0.00424147157146284,2.5187961743731242e-5,-7.44481247159738e-8,0.004241496426214619,2.5338027012562994e-5,-7.476619148263978e-8,0.004241516665120159,2.53481927416961e-5,-7.478765248745461e-8,0.004241592614544567,2.5228750538790737e-5,-7.453362965654456e-8,0.004241773093309497,2.5024267468472517e-5,-7.409800415341168e-8,0.004242080828456248,2.480219962828495e-5,-7.362345063271682e-8,0.004242505642303187,2.463448176734963e-5,-7.326256531566072e-8,0.004243007230734643,2.4578174120876555e-5,-7.313688342900408e-8,0.004243526169055569,2.4660842178798045e-5,-7.330574786416262e-8,0.004243999680967984,2.4874463362710607e-5,-7.375310120416703e-8,0.0042443776570801894,2.5179193207145155e-5,-7.439515440950807e-8,0.004244634361830328,2.551555261019759e-5,-7.510602778954726e-8,0.0042447725833558445,2.5820973313206575e-5,-7.575282082432305e-8,0.004244819645713096,2.6045265557054406e-5,-7.622855268466984e-8,0.004244817657500771,2.6160427534331055e-5,-7.647316726976563e-8,0.004244812063322777,2.6162998914343238e-5,-7.647870316326475e-8,0.004244842201737484,2.6070232563465724e-5,-7.628128320228887e-8,0.004244935733735506,2.5913058455968382e-5,-7.594622609168704e-8,0.004245106822619801,2.572872050475992e-5,-7.555241538069889e-8,0.004245356804103788,2.5554802441117856e-5,-7.517960510152853e-8,0.004245675934005867,2.5425040582432493e-5,-7.48995353162313e-8,0.004246045266184226,2.53664067068817e-5,-7.47697603900719e-8,0.004246438382144604,2.5396616745149382e-5,-7.482836234073875e-8,0.004246823330043397,2.552139706651534e-5,-7.508808847131201e-8,0.004247165619004974,2.5731389115804212e-5,-7.55296442638736e-8,0.004247433275937945,2.5999499171301278e-5,-7.609589214748047e-8,0.0042476044631466715,2.6280705900143398e-5,-7.669131102787287e-8,0.004247676613223559,2.6517177808645175e-5,-7.719284879324458e-8,0.004247673609435171,2.6650746595202952e-5,-7.747651982304646e-8,0.004247645708001549,2.66412350943042e-5,-7.74564776254694e-8,0.004247658309913079,2.6483856580341366e-5,-7.712204781528955e-8,0.004247771456591539,2.6216061034290582e-5,-7.655226898516179e-8,0.004248018640476505,2.590800755606473e-5,-7.589568494417051e-8,0.004248395212570714,2.563994069145496e-5,-7.532244221725396e-8,0.004248861259489376,2.5477021622606432e-5,-7.497104067998361e-8,0.00424935590167607,2.5452038700586148e-5,-7.491170753332291e-8,0.004249815624233812,2.5560514080836893e-5,-7.513587325912593e-8,0.0042501900081495896,2.5766672608186727e-5,-7.556853344785969e-8,0.004250451383611506,2.6015861961209102e-5,-7.609427999654669e-8,0.0042505977356969114,2.6248914551540066e-5,-7.658758795271883e-8,0.0042506498090625795,2.6415031884901112e-5,-7.694017883491166e-8,0.004250644097952955,2.648096828203765e-5,-7.708071584908982e-8,0.0042506237812728765,2.6435303290169302e-5,-7.698415129034421e-8,0.004250629816343292,2.6287691938557887e-5,-7.667036324682085e-8,0.0042506940711203485,2.6064200669597658e-5,-7.619435383064163e-8,0.00425083548128867,2.5800616341765846e-5,-7.563201480582007e-8,0.004251059186062351,2.5535598231431913e-5,-7.506549954746807e-8,0.004251357853991461,2.5304981396812947e-5,-7.457106386619228e-8,0.004251714123475805,2.5137752884505912e-5,-7.421052674232194e-8,0.004252103288002902,2.5053445751813735e-5,-7.402578044122805e-8,0.0042524958808914486,2.5060282096586535e-5,-7.403485203242214e-8,0.004252860347046862,2.5153483119387155e-5,-7.422821487858902e-8,0.004253166420302202,2.5313592833064807e-5,-7.4565027741937e-8,0.004253390056795452,2.5505445065978426e-5,-7.497072826604751e-8,0.004253520373611728,2.567954717105097e-5,-7.533987563241299e-8,0.004253567583483577,2.5778553226866115e-5,-7.555000192971296e-8,0.004253568477479618,2.57508981459835e-5,-7.549083696491824e-8,0.004253583802551681,2.5570092233629636e-5,-7.51055603806773e-8,0.004253683035294351,2.5251865633977112e-5,-7.44273175308893e-8,0.0042539191944363595,2.4857202588394434e-5,-7.35855734003273e-8,0.004254305764216735,2.447438286380503e-5,-7.276784994537231e-8,0.004254809815918776,2.4186839495990022e-5,-7.215147164839955e-8,0.004255365549942023,2.40441206534225e-5,-7.184200794898621e-8,0.004255899200387112,2.4050089820884473e-5,-7.184826829956902e-8,0.0042563516080044266,2.416972185021108e-5,-7.209662433728606e-8,0.004256690396141003,2.434605252160264e-5,-7.246675786316027e-8,0.0042569115892744334,2.4517943449023026e-5,-7.282912443145628e-8,0.0042570344588616455,2.463347637775471e-5,-7.30732558512375e-8,0.0042570934805204125,2.465775417313392e-5,-7.312438614433928e-8,0.004257129932313604,2.4575925834567138e-5,-7.295011734563332e-8,0.0042571843494951115,2.4392667825468296e-5,-7.255962537821784e-8,0.00425729039774817,2.4129023933815476e-5,-7.199717208281165e-8,0.004257470606229811,2.3817370327804808e-5,-7.133146006679518e-8,0.004257734255741909,2.349544247400287e-5,-7.064283667735547e-8,0.004258077393204028,2.3200390137071024e-5,-7.001050679824002e-8,0.004258484618862725,2.2963666553012255e-5,-6.950158216921607e-8,0.004258932027056634,2.2807293789006354e-5,-6.916316297269846e-8,0.0042593906153518026,2.2741586385370254e-5,-6.901757022449099e-8,0.0042598297434363165,2.276399055898611e-5,-6.905989169541386e-8,0.004260220606168873,2.2858651267932304e-5,-6.925694232532747e-8,0.004260539991874552,2.2996585299082128e-5,-6.954740578872719e-8,0.004260774793749827,2.3136869567961894e-5,-6.984415171021355e-8,0.004260927452055153,2.3230106921002925e-5,-7.004155848425731e-8,0.004261021309681241,2.3226075701983406e-5,-7.003196358517582e-8,0.004261102938290243,2.308688722779646e-5,-6.9733984200722e-8,0.004261236712509181,2.2804045770392858e-5,-6.912910597515336e-8,0.004261487734137989,2.2412204909363093e-5,-6.829103484152083e-8,0.004261895857940792,2.1987951130290533e-5,-6.738297115674651e-8,0.004262453748847359,2.1626559517556065e-5,-6.660796308383029e-8,0.004263104835077354,2.14049565306401e-5,-6.613002381831203e-8,0.004263765230072934,2.1352073118542486e-5,-6.601108302348439e-8,0.004264356348996169,2.14434400684497e-5,-6.619951822339648e-8,0.00426482929740014,2.1618744627758198e-5,-6.656745990661841e-8,0.004265171943391067,2.1807560186110623e-5,-6.696539410340849e-8,0.004265402331610535,2.194966411597293e-5,-6.726522140368924e-8,0.004265556764276095,2.2005321336605362e-5,-6.738204521109695e-8,0.004265678484351986,2.1957407300082035e-5,-6.727876331639272e-8,0.004265809259589074,2.1808924150594526e-5,-6.696101507231523e-8,0.004265983904005325,2.1578682448027443e-5,-6.646826954849454e-8,0.004266226920993157,2.1296504146896058e-5,-6.586379168206377e-8,0.004266550629286272,2.0998265292050864e-5,-6.522408289024045e-8,0.004266954602654954,2.072086530767614e-5,-6.46280184319503e-8,0.0042674264408546,2.0497353315112702e-5,-6.414629674705478e-8,0.004267943861511287,2.0352576012947905e-5,-6.383209365453901e-8,0.004268477960877023,2.0299833661802612e-5,-6.371398436365584e-8,0.004268997253092252,2.0338959047789847e-5,-6.379193925228933e-8,0.004269472004022922,2.0455923406950072e-5,-6.403649435074647e-8,0.004269878504480831,2.0623872099556896e-5,-6.439082513227808e-8,0.004270203091943123,2.0805512560485156e-5,-6.477560803074754e-8,0.004270445852852126,2.0956944805511876e-5,-6.509700275244613e-8,0.004270623800199121,2.10334314266037e-5,-6.525895403540025e-8,0.004270772558072353,2.0997890319405713e-5,-6.518152289098647e-8,0.00427094441011345,2.083220432249813e-5,-6.482534637528951e-8,0.004271199798210908,2.05492416329248e-5,-6.421755267416815e-8,0.00427159041645784,2.0199863007888447e-5,-6.346677840095314e-8,0.004272137010630017,1.986641311092636e-5,-6.274914812415897e-8,0.004272812866192905,1.9637907019181664e-5,-6.225512618287865e-8,0.004273546661830289,1.957484111226967e-5,-6.211428300886088e-8,0.004274248084309201,1.9683554754882735e-5,-6.234052528862284e-8,0.004274842584556,1.9916585609271047e-5,-6.283284863669002e-8,0.004275294989396107,2.0196932839426866e-5,-6.34271221447608e-8,0.004275612111248886,2.044876157713103e-5,-6.396157774097112e-8,0.004275829854443942,2.0618302854561106e-5,-6.432132893338302e-8,0.004275996344867708,2.068048102350494e-5,-6.445246254988373e-8,0.004276158761153353,2.0635703336763096e-5,-6.435525871581819e-8,0.00427635575964747,2.050278681984088e-5,-6.406929194779216e-8,0.004276614264766545,2.03118344130943e-5,-6.365844604760266e-8,0.004276948681532183,2.0098462742130343e-5,-6.319870838452115e-8,0.00427736112987467,1.9899240304877655e-5,-6.276838480380487e-8,0.004277842211255956,1.974773290141609e-5,-6.243949971073313e-8,0.004278372391904025,1.967077619426468e-5,-6.226968673760751e-8,0.004278924276628769,1.9684968915617704e-5,-6.229464867897638e-8,0.00427946603046503,1.9793798937027695e-5,-6.252207128612635e-8,0.004279965907331355,1.9986115124125946e-5,-6.292842834492383e-8,0.004280397398965965,2.0236567080278434e-5,-6.345990398536185e-8,0.004280744247696593,2.0508303055502708e-5,-6.403801521126411e-8,0.004281004505802116,2.075787626038736e-5,-6.45698971255669e-8,0.004281192901995228,2.0941958152062637e-5,-6.496252518206134e-8,0.004281340930710332,2.1025255578912166e-5,-6.513969573609285e-8,0.004281494037741554,2.0988991621400003e-5,-6.506040387677097e-8,0.004281705020143845,2.083884172795236e-5,-6.473613988226346e-8,0.004282022932066112,2.0609966237029076e-5,-6.424190093837948e-8,0.004282478182800925,2.0365345667199266e-5,-6.371269223823294e-8,0.004283067616495902,2.018344302717714e-5,-6.331700549222439e-8,0.004283747241477742,2.0134651144824004e-5,-6.320619458649664e-8,0.0042844407554519515,2.0253973496551404e-5,-6.345578723847007e-8,0.004285064598384449,2.0524555265033713e-5,-6.403009214368057e-8,0.004285558228008341,2.0883667246896797e-5,-6.479498002189184e-8,0.004285903068305841,2.1248575485531713e-5,-6.557331881327865e-8,0.004286121591209917,2.1546759971092086e-5,-6.620971443688664e-8,0.004286261550244254,2.173512138139228e-5,-6.661161891835543e-8,0.004286377010822107,2.1803562222643158e-5,-6.675698118613891e-8,0.004286514639174886,2.1767962224157696e-5,-6.667927461907289e-8,0.004286707249844844,2.1659831340824737e-5,-6.644549978914754e-8,0.004286972651294204,2.1517288514130502e-5,-6.613702981233638e-8,0.004287315036407035,2.137879459328305e-5,-6.583625969488997e-8,0.004287726996196279,2.1279125575024203e-5,-6.561792724729806e-8,0.00428819142343141,2.1246497524740444e-5,-6.554282703858169e-8,0.004288683412819257,2.1300005175710134e-5,-6.56522121072733e-8,0.004289172646002349,2.144705325197606e-5,-6.596225331674356e-8,0.004289626831671317,2.1681083267848825e-5,-6.64591918001667e-8,0.004290016489747565,2.1980505883871905e-5,-6.709706780234995e-8,0.0042903207017423875,2.2309974166205005e-5,-6.780039689973465e-8,0.004290532704681695,2.2624802256956494e-5,-6.847351420232322e-8,0.004290663720481053,2.2878545281189634e-5,-6.901668815447957e-8,0.004290743428588021,2.3032647343331645e-5,-6.934675430215987e-8,0.004290816160740989,2.3066060527652307e-5,-6.941783186631997e-8,0.004290932973482719,2.298241860165485e-5,-6.923692897416443e-8,0.004291140720082246,2.281268438762679e-5,-6.886989001401675e-8,0.004291469988513568,2.261171092999127e-5,-6.843422945885471e-8,0.0042919245712092595,2.244789438370406e-5,-6.807700264279899e-8,0.004292475971297328,2.238658804783379e-5,-6.793912075922681e-8,0.004293066649609138,2.2470558774809148e-5,-6.811318501504072e-8,0.004293623937526895,2.2703998892035536e-5,-6.860890598586648e-8,0.0042940818493636184,2.304812006375384e-5,-6.934344898792616e-8,0.004294402362672422,2.3432831436448893e-5,-7.016645002765099e-8,0.004294586104386337,2.378055743966283e-5,-7.091121590795328e-8,0.004294667795317409,2.4030920659155234e-5,-7.144780929009046e-8,0.004294700566059802,2.4155324165777983e-5,-7.171440891510901e-8,0.004294738209100082,2.4157840931771394e-5,-7.171925710040148e-8,0.0042948226573763385,2.4066452881318333e-5,-7.152192906009953e-8,0.004294978812281802,2.3921337639631674e-5,-7.120830502904449e-8,0.004295214901080934,2.3765000948817973e-5,-7.08694876550506e-8,0.004295525436407369,2.363587044291823e-5,-7.058807624485363e-8,0.004295894601684546,2.3564786623837452E-05,-7.04305813207749e-8,0.004296299122201778,2.357308522950433e-5,-7.044321503200956e-8,0.004296710657229467,2.367115187319423e-5,-7.064870539544668e-8,0.004297098295590391,2.38568917503796e-5,-7.104295898373251e-8,0.004297431906932636,2.4114275885103977e-5,-7.159190498213205e-8,0.004297686870625992,2.4412901902798002e-5,-7.223050607165677e-8,0.004297849991681794,2.4710049162891303e-5,-7.286710575334312e-8,0.00429792530231652,2.4956591162591826e-5,-7.339606327152146e-8,0.004297937372396556,2.5107015043400802e-5,-7.371925088269417e-8,0.004297929510021779,2.5131737805527713e-5,-7.377254984435431e-8,0.004297955548234345,2.5027789983162344e-5,-7.354890403274291e-8,0.004298066575615005,2.4823310836198834e-5,-7.310812995376074e-8,0.004298296552607654,2.4573070322224938e-5,-7.256747872959403e-8,0.004298651648983001,2.434559188780995e-5,-7.207413756368472e-8,0.004299106911661393,2.4205518413300738e-5,-7.176741926718479e-8,0.004299611453430702,2.4196312655059432e-5,-7.174150839999789e-8,0.0043001009376553104,2.4328171010078167e-5,-7.201924724959771e-8,0.004300514215980978,2.45747458074727e-5,-7.254478183774332e-8,0.00430080955408668,2.4880164403869278e-5,-7.319841098782959e-8,0.00430097535914321,2.5174795560467062e-5,-7.383040760602065e-8,0.004301031639911904,2.5394822709818133e-5,-7.430318462394381e-8,0.004301021854896047,2.549876742515806e-5,-7.452698087324046e-8,0.004300998826632299,2.5475424898201563e-5,-7.447707677090092e-8,0.0043010105133326326,2.5341837209243172e-5,-7.418955573869462e-8,0.00430109035070397,2.513426620792213e-5,-7.374198268112992e-8,0.004301253742716078,2.48970164755011e-5,-7.32294267491531e-8,0.004301499427306543,2.467299592201586e-5,-7.274417707510015e-8,0.0043018132999952385,2.4497627550464064e-5,-7.236262240548909e-8,0.004302172657874503,2.4395814589290057e-5,-7.213867310051331e-8,0.004302549817683467,2.4380785913499932e-5,-7.210122313442096e-8,0.0043029149958991805,2.44536492446394e-5,-7.225313252007961e-8,0.004303238964457443,2.460296377691644e-5,-7.2570238773880585E-08,0.00430349625434463,2.4804348391217722e-5,-7.300042578258291e-8,0.0043036695281246816,2.50209511462533e-5,-7.34645445614565e-8,0.0043037550770795956,2.5206324498041653e-5,-7.386254745634518e-8,0.004303768148276709,2.5311391686062272e-5,-7.408849797523384e-8,0.004303745290754547,2.5296058710614142e-5,-7.405564302472968e-8,0.0043037402219377715,2.5143263129179642e-5,-7.372674513257676e-8,0.004303811401843918,2.486984655474745e-5,-7.31375476237472e-8,0.004304003924871586,2.452738717704159e-5,-7.239861410051003e-8,0.004304332998053507,2.4189634346796077e-5,-7.166837537127397e-8,0.004304777053220583,2.3930305794275484e-5,-7.110548942813876e-8,0.0043052839373079,2.380055815885997e-5,-7.082046368346776e-8,0.004305786979287081,2.381512406074437e-5,-7.084577599968396e-8,0.004306223908680077,2.3950918898359302e-5,-7.113265222969439e-8,0.0043065521824008435,2.4156359154944985e-5,-7.157081214482665e-8,0.00430675720105395,2.4366745878058644e-5,-7.202132826384251e-8,0.00430685272341944,2.452074994873828e-5,-7.235202054839195e-8,0.0043068746876313785,2.457397362237289e-5,-7.246674040986775e-8,0.004306870807432403,2.450692094765032e-5,-7.232274420159353e-8,0.0043068889333198876,2.4326274108967804e-5,-7.193368553734489e-8,0.004306967157178836,2.4060115372153373e-5,-7.135951482856131e-8,0.004307127792060001,2.3749312473508598e-5,-7.068800846487233e-8,0.004307375847549257,2.3437998378882705e-5,-7.001424126954424e-8,0.0043077011487614265,2.316559033074148e-5,-6.942331161839482e-8,0.004308082476774727,2.296156998550824e-5,-6.897901648309085e-8,0.004308492160407662,2.2843008936849732e-5,-6.871848008341235e-8,0.00430890014225028,2.2814028032551207e-5,-6.865098180169714e-8,0.004309277281921247,2.2866200020617407e-5,-6.875880227967708e-8,0.004309598220494261,2.2979234337591817e-5,-6.899862356038913e-8,0.004309844408536244,2.3121853538730567e-5,-6.930329429478826e-8,0.0043100078615668095,2.3253479651415424e-5,-6.95853524949172e-8,0.004310095640386761,2.3328083445441076e-5,-6.974529757037752e-8,0.0043101338257101485,2.3301787131791224e-5,-6.968807200575135e-8,0.004310168187241177,2.3144787924465443e-5,-6.934892854607553e-8,0.004310257826444425,2.285531683637069e-5,-6.872365125157918e-8,0.004310459684221365,2.2469228310805165e-5,-6.788925321183882e-8,0.0043108073193948325,2.2056750050369026e-5,-6.699692997284909e-8,0.004311294032439131,2.170255209789584e-5,-6.622910378436072e-8,0.004311871307369093,2.1476062378587954e-5,-6.573553756794064e-8,0.004312465198993063,2.1407057452158824e-5,-6.558081946270183e-8,0.004313001977162613,2.147859710794636e-5,-6.572910476913147e-8,0.00431343005920553,2.1637960989153616e-5,-6.606750631843108e-8,0.004313730316577628,2.181691089414023e-5,-6.644950764688654e-8,0.004313914738250244,2.1951418489715036e-5,-6.673726332891451e-8,0.004314017860593639,2.1995240270097538e-5,-6.6830778021755e-8,0.00431408563427076,2.1926188546349096e-5,-6.668152880876458e-8,0.004314164844430976,2.1746350005664837e-5,-6.62931915957548e-8,0.00431429466372932,2.1478088191753095e-5,-6.571331506627689e-8,0.004314501024681896,2.1157447735519515e-5,-6.501929657323107e-8,0.004314794068269408,2.0826407239506826e-5,-6.430170217264929e-8,0.004315168523400873,2.0525388218328684e-5,-6.364798919827755e-8,0.00431560642180513,2.0287173353931803e-5,-6.31292183912412e-8,0.0043160812455876356,2.0132909454777427e-5,-6.279132138753954e-8,0.004316562520177888,2.007033177327738e-5,-6.265126152698634e-8,0.00431702006617794,2.00938082788825e-5,-6.269717769742918e-8,0.004317427588706235,2.018551638500187e-5,-6.28909388180351e-8,0.004317765712734754,2.0317234227004703e-5,-6.317193328846631e-8,0.004318024775138963,2.0452628316515763e-5,-6.34618604024906e-8,0.00431820770093002,2.0550394730606987e-5,-6.367139110618334e-8,0.004318332893899484,2.0569188001987255e-5,-6.371081436092053e-8,0.004318436011644906,2.04754635624101e-5,-6.350712260775898e-8,0.0043185681789404615,2.0254385622796044e-5,-6.302778494565895e-8,0.004318787523787666,1.9921423273137004e-5,-6.230594134708772e-8,0.004319142414166795,1.9528518015015e-5,-6.145372829533996e-8,0.004319650180655444,1.9156534321257355e-5,-6.064588141621515e-8,0.004320282432594846,1.8890460254098007e-5,-6.006610839445816e-8,0.00432096924731175,1.8786257539194468e-5,-5.983551079099197e-8,0.004321623889974825,1.8848028753740572e-5,-5.996331107102821e-8,0.004322174856199251,1.9029232241916958e-5,-6.03494594472305e-8,0.004322587553187694,1.9254995930678356e-5,-6.083272565155132e-8,0.004322867520357473,1.9450265918529555e-5,-6.125132934634046e-8,0.004323049667978551,1.956007946768571e-5,-6.148655784160723e-8,0.004323182862961931,1.9557648041747735e-5,-6.148015369528662e-8,0.004323316556168647,1.9443050480583164e-5,-6.123159791433297e-8,0.004323491840940722,1.9237131005163212e-5,-6.0785188942898e-8,0.004323736659978244,1.8974013586600857e-5,-6.021415798447603e-8,0.00432406401637427,1.8693883726101143e-5,-5.960523413418266e-8,0.004324472264424686,1.8436553474490432e-5,-5.904470094336049e-8,0.004324946983099295,1.8236033860153257e-5,-5.860648003866715e-8,0.004325464084859797,1.811635649105119e-5,-5.8342897748555724e-8,0.004325993794135984,1.8088868183602328e-5,-5.8278740560323874e-8,0.004326505053826906,1.8151193617222837e-5,-5.84090469392405e-8,0.004326969827564337,1.8287871460248693e-5,-5.870057233852731e-8,0.004327366867667058,1.8472348280178974e-5,-5.909613070587311e-8,0.004327684784604043,1.8669955227489085e-5,-5.952094345795759e-8,0.004327924409123366,1.8841706401499647e-5,-5.989069354469142e-8,0.004328100446453682,1.8948978694444737e-5,-6.012153384588638e-8,0.004328242207755195,1.8959396499784854e-5,-6.014285604854431e-8,0.00432839251061342,1.8854306712077532e-5,-5.991366270790545e-8,0.004328602976287375,1.8637363771232864e-5,-5.9441399495521534e-8,0.004328923808193235,1.834172061702968e-5,-5.879768517306489e-8,0.0043293877420519525,1.803074398317214e-5,-5.8119858923673065e-8,0.004329992303019424,1.7786082973530267e-5,-5.7585025996974733e-8,0.0043306904239555155,1.768141014178147e-5,-5.735306902442807e-8,0.004331400140317573,1.7751344357086818e-5,-5.749928204325917e-8,0.00433203358321681,1.797402614272783e-5,-5.79766211094402e-8,0.004332530332663138,1.828016466901793e-5,-5.8635303908857e-8,0.004332875915402321,1.858298602165903e-5,-5.928765562337491e-8,0.00433309804217549,1.8810034258350935e-5,-5.977689798049865e-8,0.004333248483983109,1.8921204984793378e-5,-6.001607106531904e-8,0.00433338344031064,1.891050947589809e-5,-5.999178553599807e-8,0.004333550076056095,1.879802272931174e-5,-5.974688447449809e-8,0.00433378028617974,1.8619161178224815e-5,-5.935746777534596e-8,0.004334089547866698,1.841532739235039e-5,-5.891288378805079e-8,0.004334478361386218,1.8227051919153682e-5,-5.8500987248132956e-8,0.004334934676237755,1.8089192813388756e-5,-5.819765687811798e-8,0.004335436753461419,1.8027479513569926e-5,-5.805910095808496e-8,0.0043359564346629785,1.805604332199269e-5,-5.8116315662884676e-8,0.004336462854060841,1.8175905259323786e-5,-5.837173979925861e-8,0.0043369265589401195,1.8374650843245116e-5,-5.8798606028170783e-8,0.0043373237749320314,1.8627644789034814e-5,-5.9343665372251605e-8,0.004337640287689868,1.8900903887741546e-5,-5.993342885257249e-8,0.004337874393414731,1.915541028175581e-5,-6.0483416036833585E-08,0.004338038508031595,1.935252810257927e-5,-6.090974291052553e-8,0.004338159117798005,1.9460134108828392e-5,-6.114232980148806e-8,0.004338274774933433,1.9459013263327866e-5,-6.113884811203717e-8,0.004338431681466829,1.9348999136279857e-5,-6.089826911602292e-8,0.004338676165081497,1.9153806772625883e-5,-6.047161761109011e-8,0.004339043688685932,1.8922294391678095e-5,-5.996487910391701e-8,0.004339545635601907,1.872276095381814e-5,-5.952661815361361e-8,0.004340158161930944,1.8627380820978457e-5,-5.9314042383671195e-8,0.004340820587457169,1.8688023122385006e-5,-5.944030774359304e-8,0.0043414499059315215,1.8912570225124942e-5,-5.992294543545765e-8,0.004341969354982378,1.9256317958197064e-5,-6.066513104038634e-8,0.00434233727438235,1.963727956575248e-5,-6.148895689362684e-8,0.004342559700425284,1.9968375421524345e-5,-6.22053917653275e-8,0.004342681194553419,2.0187890581981525e-5,-6.268039485374884e-8,0.004342762928135588,2.0273446998614515e-5,-6.286515201466919e-8,0.004342861762115175,2.0238340874590014e-5,-6.278807051788223e-8,0.0043430181177510525,2.0118621313219873e-5,-6.25268278416331e-8,0.004343252686041884,1.9959504096147545e-5,-6.217910056180777e-8,0.004343568466291725,1.9805367104343365e-5,-6.184105171446118e-8,0.004343954731686096,1.9693836953182042e-5,-6.159455561595036e-8,0.004344390973704534,1.9652723436851773e-5,-6.150043408182522e-8,0.004344850331140559,1.969838524407601e-5,-6.159471002910778e-8,0.004345302792489047,1.9834740731576415e-5,-6.188629404236862e-8,0.004345718569954192,2.0052786388798823e-5,-6.235588467085406e-8,0.004346071890108299,2.0330942481172956e-5,-6.295676357140448e-8,0.004346345120939216,2.0636843362656404e-5,-6.361874562488397e-8,0.004346532649407227,2.0931092520010435e-5,-6.425633112670948e-8,0.004346643556812209,2.1172987348254808e-5,-6.478105282775598e-8,0.004346702139067369,2.1327622981692872e-5,-6.511679997367014e-8,0.004346745608778673,2.137326837845882e-5,-6.521581332631904e-8,0.004346818808370958,2.130755124320618e-5,-6.507223672428581e-8,0.004346966320702236,2.1150975510158874e-5,-6.472999399619078e-8,0.004347222824520035,2.0946473775532036e-5,-6.428207114555517e-8,0.004347603087958219,2.0753784072168932e-5,-6.385844812624413e-8,0.004348093942432825,2.0637814013072452e-5,-6.36007815326696e-8,0.004348651739160019,2.0651659508830847e-5,-6.36252925003523e-8,0.0043492091234758985,2.0818025289423062e-5,-6.398208836552688e-8,0.004349692649033529,2.1116545144798856e-5,-6.462735152225057e-8,0.004350046851532632,2.148558579412229e-5,-6.542717677117046e-8,0.004350254077818288,2.1841590704683874e-5,-6.619972247540033e-8,0.004350339218690546,2.2108334127427978e-5,-6.677897296497183e-8,0.0043503570289232605,2.2241363549602545e-5,-6.706795464383658e-8,0.004350370300956235,2.2236598604831392e-5,-6.705740408002692e-8,0.004350430646805905,2.2122994339245096e-5,-6.680980212150948e-8,0.004350568672542956,2.1947338186704e-5,-6.642641374111236e-8,0.004350793241612556,2.1759652050497017e-5,-6.601571687264844e-8,0.0043510958731244245,2.1603418432720286e-5,-6.567227801223937e-8,0.004351456464205779,2.1510811396030194e-5,-6.546638399293138e-8,0.004351848247956533,2.1501213936502228e-5,-6.544069492800358e-8,0.004352241536665431,2.1581184167779784e-5,-6.560999904068952e-8,0.00435260671995346,2.174478040527643e-5,-6.596178678053824e-8,0.004352917203110646,2.1974004373243897e-5,-6.645716600620018e-8,0.004353152776554337,2.2239771173006768e-5,-6.70329889115276e-8,0.0043533034557195595,2.250423557099356e-5,-6.760694213289382e-8,0.004353373159793762,2.2725320394767957e-5,-6.808739588456914e-8,0.004353381934028024,2.2863721397970617e-5,-6.838860655220757e-8,0.004353365144473504,2.2891593869259356e-5,-6.844958399294913e-8,0.004353368520464555,2.2800891768739177e-5,-6.825225963723115e-8,0.004353439178980252,2.2608536352457108e-5,-6.783284315230564e-8,0.004353614398994551,2.235592337679717e-5,-6.728093363331758e-8,0.004353911091254241,2.210179351953395e-5,-6.672420060605343e-8,0.004354319093981324,2.1909457854221882e-5,-6.63007028625976e-8,0.00435480070535855,2.183105798865961e-5,-6.612459579585697e-8,0.004355297564439238,2.1892701313526038e-5,-6.62535720399581e-8,0.004355744274261172,2.208486894760374e-5,-6.666768156040473e-8,0.004356085988373349,2.2362140804206785e-5,-6.72684784304803e-8,0.004356294790867451,2.265429960519879e-5,-6.790310472655907e-8,0.004356378446729466,2.2886711643210605e-5,-6.840875002736263e-8,0.004356377083974059,2.300287959510685e-5,-6.866191818023424e-8,0.004356348835649946,2.2979906602058662e-5,-6.861222380829316e-8,0.004356351070803769,2.283100298627068e-5,-6.828791603511024e-8,0.0043564253033482265,2.2596103437619816e-5,-6.777550831067574e-8,0.004356590438485916,2.232692894571213e-5,-6.71873398673657e-8,0.004356843977258533,2.207328036231141e-5,-6.663181407464889e-8,0.00435716773989199,2.1874255200302816e-5,-6.619429149558181e-8,0.0043575345277402245,2.17545974438534e-5,-6.592907552880914e-8,0.00435791364940389,2.1724473774609717e-5,-6.585880479157714e-8,0.004358274835255978,2.1780736857639492e-5,-6.597708420358102e-8,0.00435859102021611,2.190842428008057e-5,-6.625166759485598e-8,0.004358840788105637,2.2082124326210005e-5,-6.66273960160543e-8,0.004359011140673432,2.2267590761594875e-5,-6.702970759557112e-8,0.004359100770459174,2.2424521416654e-5,-6.737069654700543e-8,0.0043591232349589806,2.2511572931629804e-5,-6.756005138998922e-8,0.004359108521787183,2.2494178942973776e-5,-6.752211476792377e-8,0.004359100878157092,2.235434252364082e-5,-6.721725820444066e-8,0.004359151203790916,2.209952344550378e-5,-6.666129656422452e-8,0.004359304391648528,2.1766202486049173e-5,-6.59333189575158e-8,0.004359585156155929,2.141440124607869e-5,-6.516384241477555e-8,0.004359988028082468,2.1112991988769316e-5,-6.450292098818624e-8,0.004360476321122433,2.0920264451710092e-5,-6.407788779132097e-8,0.004360991139310915,2.0866833130000284e-5,-6.395608344448584e-8,0.0043614672632936585,2.094691373648151e-5,-6.412567446990825e-8,0.00436185047259702,2.1120373710730043e-5,-6.449986452881506e-8,0.004362111124733698,2.1324180464702604e-5,-6.4941620161576e-8,0.004362250570187353,2.1489435250093217e-5,-6.53007002748905e-8,0.004362299121386524,2.155913544719217e-5,-6.54524253343876e-8,0.004362306490900004,2.1501808725852057e-5,-6.532755100187959e-8,0.004362327761153033,2.131732881203479e-5,-6.492513324816661e-8,0.0043624093738372635,2.103373524474476e-5,-6.430576510522246e-8,0.0043625793884881775,2.0697054625575986e-5,-6.356950528095524e-8,0.004362844207020741,2.0358383999011046e-5,-6.282776240788013e-8,0.004363191208127825,2.006260880711081e-5,-6.217865603614356e-8,0.004363594835992581,1.984133466131531e-5,-6.169150041406605e-8,0.004364023394089613,1.971031936272081e-5,-6.140108548051583e-8,0.004364444713893855,1.9670147056786693e-5,-6.130906149278202e-8,0.004364830116595006,1.9708457183723877e-5,-6.13887614197793e-8,0.004365157008842049,1.9802456355045293e-5,-6.159066614971228e-8,0.0043654108447642925,1.9921222630134676e-5,-6.184741174273681e-8,0.004365587133171469,2.002805687530203e-5,-6.207888714985402e-8,0.004365693773882021,2.0083687956816993e-5,-6.219920719112305e-8,0.004365753261816067,2.0051413982690625e-5,-6.21279557727769e-8,0.004365803266929434,1.990492580654581e-5,-6.18073352015643e-8,0.004365893211815998,1.963812772857377e-5,-6.122369196067238e-8,0.00436607468587738,1.9273718051626967e-5,-6.042630561545666e-8,0.004366386030933518,1.8864892817626648e-5,-5.953112197574838e-8,0.004366836077417156,1.8485075349996475e-5,-5.869834534688314e-8,0.004367395636384049,1.8206114824510273e-5,-5.808489610024617e-8,0.0043680034475078715,1.807342018736887e-5,-5.779018629925774e-8,0.004368585429190273,1.8090183319349116e-5,-5.7821670584522674e-8,0.004369078205338029,1.8218018646954217e-5,-5.8096130493753056e-8,0.004369446485515545,1.8391914972714372e-5,-5.8472137246485704e-8,0.00436968898915749,1.854111673960781e-5,-5.879546235081837e-8,0.004369833869388169,1.8607666783746486e-5,-5.893945230499611e-8,0.004369927829734204,1.8558083076927652e-5,-5.883053071818364e-8,0.0043700232722843815,1.8387261432697222e-5,-5.845686139765173e-8,0.004370166642890487,1.8115771799109823e-5,-5.78626810222891e-8,0.004370389908592708,1.778250420799372e-5,-5.7132479090411445e-8,0.004370706190176643,1.7434832951346612e-5,-5.63696521066772e-8,0.004371109765100231,1.7118586178875612e-5,-5.5674571774707e-8,0.00437157972214823,1.6869939219546253e-5,-5.5126719806860253e-8,0.004372085769119738,1.671054970042191e-5,-5.477386649502183e-8,0.004372594495239376,1.6646123535862942e-5,-5.462880762363998e-8,0.004373074761423813,1.6667710334556395e-5,-5.467217352867607e-8,0.004373501568673639,1.675457816700928e-5,-5.485876153998176e-8,0.004373858478157565,1.687756120804058e-5,-5.5124896858937915e-8,0.004374139111879542,1.7002287531392034e-5,-5.5395470307775045e-8,0.0043743482958161295,1.7092346989803696e-5,-5.559079621301812e-8,0.004374503133939031,1.7112951246571128e-5,-5.5634563689226273e-8,0.004374633720251839,1.7035925052044434e-5,-5.546478116239983e-8,0.00437478225005965,1.6846665517467146e-5,-5.504911354774486e-8,0.0043749983953135655,1.6552475631203626e-5,-5.440324873724291e-8,0.004375328872488854,1.618927976830758e-5,-5.360566541222857e-8,0.0043758013925030695,1.5821068508656155e-5,-5.2796405543630164e-8,0.004376408267399701,1.552634116046679e-5,-5.214735730105396e-8,0.004377099954417064,1.5371900421595234E-05,-5.180488666204743e-8,0.004377797060914417,1.5385036173928835e-5,-5.182897065432117e-8,0.004378418187720637,1.5540645773084347e-5,-5.2165003016123936e-8,0.004378909008357041,1.5771884933839974e-5,-5.266706122898232e-8,0.0043792572209281865,1.599719360222389e-5,-5.315697219265368e-8,0.004379488986244382,1.6147744983164754e-5,-5.34842622002332e-8,0.004379653735493992,1.6183696763184442e-5,-5.356159676976171e-8,0.004379807029548539,1.6097454183882332e-5,-5.337188796430934e-8,0.004379997377027852,1.5908215829117925e-5,-5.2956489809098333e-8,0.004380258535441446,1.5652790384862128e-5,-5.239536296392365e-8,0.004380606499311609,1.5376010872551103e-5,-5.178635373794103e-8,0.00438103981704955,1.5122274389860483e-5,-5.122678455064238e-8,0.0043815422062817,1.4928716380928159e-5,-5.079841505994918e-8,0.0043820867949589636,1.4820349015323273e-5,-5.055656434916802e-8,0.004382641303252554,1.4807475268811135e-5,-5.052422039228374e-8,0.004383173380248949,1.4885420145896664e-5,-5.0691348370280644e-8,0.004383655356796422,1.5036302184118528e-5,-5.1018815625741976e-8,0.004384067847834171,1.5232293344004387e-5,-5.144564428159387e-8,0.0043844019828522774,1.543961315370945e-5,-5.1897827868784535e-8,0.004384660446837142,1.5622634657119858e-5,-5.229728990740927e-8,0.0043848576711448175,1.5747902572815793e-5,-5.257058563354719e-8,0.0043850193932531934,1.5788236658408824e-5,-5.2657827564574646e-8,0.0043851814481957125,1.572732220635757e-5,-5.252279948825495e-8,0.004385386970873339,1.5565072314536914e-5,-5.216487783723147e-8,0.004385680534183977,1.532309143986357e-5,-5.163119876709418e-8,0.004386097920633204,1.5047759637200314e-5,-5.102352030618483e-8,0.004386652021040343,1.4806503360449029e-5,-5.0490006751438264e-8,0.004387319473877426,1.4672634763753373e-5,-5.019184730718326e-8,0.004388037475553013,1.4699180145777687e-5,-5.024571194944651e-8,0.004388719358254085,1.4892581471994294e-5,-5.066597535539156e-8,0.004389286252243407,1.5203884862031068e-5,-5.1345376667470573e-8,0.00438969797548042,1.5546829342512437e-5,-5.209476228885879e-8,0.004389964650890107,1.583302129175502e-5,-5.272030351592314e-8,0.004390134913807563,1.6002864742013964e-5,-5.309129370757188e-8,0.004390272271287374,1.6037840528340582e-5,-5.3166940446750974e-8,0.004390434097429688,1.595511112825302e-5,-5.298445643173724e-8,0.004390660057645578,1.579392903294117e-5,-5.262936255347156e-8,0.004390969109008046,1.5602006407262715e-5,-5.220585215637865e-8,0.0043913615412258964,1.542537772061049e-5,-5.1814795817357e-8,0.004391823037389939,1.5302039558842245e-5,-5.153985439117854e-8,0.004392329121287766,1.5258332624760626e-5,-5.143939304550827e-8,0.004392849551497714,1.5307073316800725e-5,-5.1542117695367437e-8,0.004393352682154456,1.54470359086033e-5,-5.18457185429351e-8,0.00439380971458905,1.566375392426153e-5,-5.23185628529972e-8,0.004394198597306122,1.5931683059558592e-5,-5.2904527284831545e-8,0.004394507186734965,1.621768345692803e-5,-5.353077333402549e-8,0.004394735227108045,1.6485492657756142e-5,-5.411762647781867e-8,0.004394894902223298,1.6700626893534787e-5,-5.45892803278868e-8,0.004395009971871057,1.6835218512750443e-5,-5.48843068576531e-8,0.004395113603586854,1.687246367982367e-5,-5.496537371682426e-8,0.004395244949411491,1.6810475067017456e-5,-5.482779901120044e-8,0.0043954442427448425,1.6665347947444088e-5,-5.450649984627839e-8,0.004395745883391455,1.6472740140844224e-5,-5.407968384406357e-8,0.0043961693024316155,1.6286178870649144e-5,-5.366522773031633e-8,0.0043967088244268844,1.616943709032258e-5,-5.340384348847231e-8,0.00439732633496883,1.6180870696195093e-5,-5.342443633742838e-8,0.004397953375547895,1.635135413255929e-5,-5.379535836427356e-8,0.0043985084347460835,1.6664842817597192e-5,-5.448152340898046e-8,0.004398926535594353,1.7055762545965226e-5,-5.533868602056141e-8,0.004399186184162931,1.7430878674003617e-5,-5.616169045398201e-8,0.004399316502889809,1.7706012639717648e-5,-5.676535310620799e-8,0.004399380619391071,1.7836085828877507e-5,-5.7050496127308454e-8,0.0043994479138703985,1.782330059445976e-5,-5.70217692683362e-8,0.004399571685962228,1.7705329205192075e-5,-5.676158687960766e-8,0.004399779842592975,1.7535919356775476e-5,-5.6387604272475e-8,0.004400076250313624,1.736849329520766e-5,-5.601691660456328e-8,0.0044004470021380936,1.7246443601718784e-5,-5.574493496590799e-8,0.0044008672958289925,1.7199144884804796e-5,-5.5636639903815625e-8,0.004401307044890794,1.724130099925887e-5,-5.572497188992369e-8,0.00440173510197177,1.737368836590099e-5,-5.6012208288017816e-8,0.004402122691783258,1.7584415933249197e-5,-5.6472543144591716e-8,0.004402446537357039,1.785064042267672e-5,-5.705582151470724e-8,0.004402691816659508,1.8141037663291022e-5,-5.7693066337959046e-8,0.004402854735432183,1.841939830699297e-5,-5.8304506128850546e-8,0.0044029441466111215,1.86494319283523e-5,-5.88101859483882e-8,0.004402981550175842,1.8800342453498846e-5,-5.914217622460607e-8,0.004402999067764595,1.8852377164001726e-5,-5.925669183407802e-8,0.004403035359985339,1.8801411674438728e-5,-5.914416507577008e-8,0.0044031298139103415,1.866162281600663e-5,-5.883524829467042e-8,0.004403315601073636,1.8465518632622366e-5,-5.8401102927705954e-8,0.004403612303337892,1.8260820798133723e-5,-5.794674902359043e-8,0.00440401903455858,1.810360352195355e-5,-5.7596036212635465e-8,0.004404509752154576,1.8047165882872968e-5,-5.746702598309528e-8,0.004405033516436402,1.812725114889848e-5,-5.763917890945277e-8,0.004405522902615492,1.834684093381671e-5,-5.8119578846809494e-8,0.0044059119457882465,1.866727755270758e-5,-5.8823215461512124e-8,0.004406159440016461,1.9013925428711905e-5,-5.958550245976834e-8,0.004406266628248096,1.9299284542711648e-5,-6.021339687547807e-8,0.004406277737108989,1.945484969608813e-5,-6.055575571644973e-8,0.004406261496645234,1.9454837423611572e-5,-6.055559500071444e-8,0.004406284449775708,1.9319660877416878e-5,-6.025761062267969e-8,0.00440639062788073,1.910099176720538e-5,-5.977521664665257e-8,0.004406594829344743,1.886022453602534e-5,-5.924323335780905e-8,0.004406887078573716,1.8651292088100253e-5,-5.878025539400848e-8,0.004407241761031286,1.8511880264080445e-5,-5.846944211875105e-8,0.0044076263524043535,1.8461551898719056e-5,-5.835435137480919e-8,0.0044080076754981525,1.8503530268696664e-5,-5.8442683603324096e-8,0.00440835579500999,1.862755742929406e-5,-5.871235534719573e-8,0.004408646532290339,1.881262321625275e-5,-5.911736690258402e-8,0.004408863496128932,1.9029458207028737e-5,-5.959328119831901e-8,0.004409000066919958,1.924325840921723e-5,-6.006330961355848e-8,0.004409061253908856,1.9417302526743488e-5,-6.044637646552229e-8,0.004409064800155661,1.9517894893698925e-5,-6.066804549783033e-8,0.00440904055014602,1.9520391771617026e-5,-6.067376479634501e-8,0.004409027212339246,1.9415263477098266e-5,-6.044217579738232e-8,0.004409066265143777,1.9212538136596372e-5,-5.99949182565613e-8,0.004409193715141178,1.8942795303234154e-5,-5.939893403493536e-8,0.0044094314113227616,1.865344497733075e-5,-5.875845298339941e-8,0.004409780143242562,1.8400286623901103e-5,-5.8196555817766816e-8,0.004410216569539457,1.8235638567657733e-5,-5.782905216370578e-8,0.004410695422717016,1.8195238170461436e-5,-5.773546974239403e-8,0.004411157650944433,1.8286844900537162e-5,-5.7933659296607315e-8,0.004411543971861461,1.8484117436023682e-5,-5.836601541020027e-8,0.004411811395675748,1.8729348317482946e-5,-5.890535923731313e-8,0.004411947793992804,1.89470109132833e-5,-5.938486561457419e-8,0.0044119780011767805,1.906592214848751e-5,-5.964712702981143e-8,0.004411956808968038,1.9042277832868503e-5,-5.9595124411453214e-8,0.004411950401682743,1.8873156757466962e-5,-5.92220569871064e-8,0.004412014554899769,1.8594182067809693e-5,-5.8606156280090905e-8,0.004412179536671111,1.8263848967560027e-5,-5.7876134214088945e-8,0.0044124466739733125,1.7943581917926447e-5,-5.716729690606632e-8,0.004412794575472388,1.7682304086576782e-5,-5.6587619247160394e-8,0.004413189368832398,1.7509204078874898e-5,-5.6201810628385806e-8,0.004413594086340192,1.743345530047553e-5,-5.603059765879325e-8,0.004413975065031127,1.7447630029714103e-5,-5.605809066694707e-8,0.004414305472350097,1.7532025516451413e-5,-5.6241179923360305e-8,0.004414567041261399,1.7658503065552773e-5,-5.651793566777759e-8,0.004414751115520992,1.779363418722658e-5,-5.681456751260478e-8,0.004414859663338807,1.7901658854669397e-5,-5.7052019121006296e-8,0.0044149062993784445,1.794805755027884e-5,-5.7153915757579485e-8,0.004414916691840586,1.7904389601374315e-5,-5.7057269944060924e-8,0.004414927200000021,1.77543682378513e-5,-5.672588204884182e-8,0.0044149804922138025,1.750003314877578e-5,-5.616395099473292e-8,0.00441511759337999,1.7165714561544804e-5,-5.542484487782527e-8,0.004415367428776234,1.679696126662312e-5,-5.460881274387819e-8,0.0044157368984729635,1.64525946058128e-5,-5.3845568238601775e-8,0.0044162055472075626,1.6190716787134946e-5,-5.3263516737987664e-8,0.004416727899593218,1.6052589799655223e-5,-5.295419024084609e-8,0.0044172437234548155,1.6049869174066154e-5,-5.294395078197559e-8,0.004417693384688244,1.615974344870538e-5,-5.3183040430361466e-8,0.004418033663467096,1.6329784446188893e-5,-5.355607037861073e-8,0.004418249405605174,1.6491255741248804e-5,-5.391129234465096e-8,0.004418357633513688,1.657727659886784e-5,-5.41007360539825e-8,0.004418402673640693,1.6540796109409133e-5,-5.4020027084270734e-8,0.004418443391223361,1.636694373579072e-5,-5.3635805163711675e-8,0.004418536429934856,1.6075637077552477e-5,-5.2991599870440183e-8,0.004418721153570862,1.5713686813819345e-5,-5.219048380509432e-8,0.004419011327149181,1.5339827180016276e-5,-5.136208116526004e-8,0.004419395436149071,1.5008693642004086e-5,-5.062720950800594e-8,0.004419843763828487,1.475917925423041e-5,-5.0072119853676645e-8,0.004420318190940414,1.4609543041482485e-5,-4.973758066953034e-8,0.004420781006999231,1.455837640529271e-5,-4.9620879180614367e-8,0.004421200875707693,1.4588855571197866e-5,-4.9685116993361385e-8,0.004421555921818236,1.4673832615992423e-5,-4.9870423302738325e-8,0.004421834861138942,1.4780363310829798e-5,-5.0103979045361175e-8,0.004422037237442245,1.4873349197413976e-5,-5.030810679146616e-8,0.0044221735003303324,1.4918708687383351e-5,-5.0407314602882546e-8,0.004422265076734925,1.488684665139391e-5,-5.0335987892971714e-8,0.004422343894139628,1.4757129675741033e-5,-5.004829930915722e-8,0.004422450182798508,1.4523472760162985e-5,-4.953057889944237e-8,0.004422627129488367,1.4199935359410018e-5,-4.8813710361903955e-8,0.004422911606825086,1.382367526534905e-5,-4.7979688149729203e-8,0.004423322237828266,1.3451651182103001e-5,-4.715436315562399e-8,0.00442384901396835,1.3148639319550321e-5,-4.6480995689175956e-8,0.004424450465700748,1.2968277830758903e-5,-4.6078384882655163e-8,0.004425062411682258,1.2934115116972632e-5,-4.599895383332543e-8,0.004425616532075163,1.3029713949506274e-5,-4.620678002907812e-8,0.00442606125460747,1.3203026493029452e-5,-4.658713648167632e-8,0.004426376247492937,1.3382921571667098e-5,-4.698291956016331e-8,0.0044265757656095205,1.3500398155340669e-5,-4.7241493967355725e-8,0.0044267015746751685,1.3506656906523134e-5,-4.7254652877251136e-8,0.004426809564985756,1.3383317501207797e-5,-4.698127400556689e-8,0.004426954798878417,1.3143641854113754e-5,-4.645015416988944e-8,0.004427178862902963,1.282611238434304e-5,-4.574598280569655e-8,0.004427502065621027,1.248309395401886e-5,-4.498442593684408e-8,0.004427921557662274,1.2167909243147152e-5,-4.4283605507852286e-8,0.0044284149290582065,1.1923590626574095e-5,-4.373914849628887e-8,0.004428947492553156,1.1775726251332769e-5,-4.340818287378602e-8,0.0044294807498054785,1.1730276245194692e-5,-4.330431159108967e-8,0.00442997978210213,1.1775616157272551e-5,-4.3402016286169154e-8,0.004430418284203898,1.1887104697408922e-5,-4.3646763807176316e-8,0.004430781078167451,1.2032394059880673e-5,-4.396683813881441e-8,0.004431064723837474,1.2176260557030221e-5,-4.428411771350637e-8,0.0044312770935376515,1.228454666456542e-5,-4.452283720664672e-8,0.004431436570445023,1.2327479539015128e-5,-4.4616919616307796e-8,0.004431571073044788,1.2282959424570596e-5,-4.451723465126646e-8,0.004431716519505703,1.2140402085948442e-5,-4.420012359781004e-8,0.004431913708413011,1.190525144918933e-5,-4.367745401611296e-8,0.004432202271488714,1.1603137979985335e-5,-4.3005902031456583e-8,0.00443261096494701,1.128105558813796e-5,-4.228959825337529e-8,0.004433145658560025,1.1001798769206879e-5,-4.166779716993523e-8,0.004433779801368679,1.082900401217352e-5,-4.12817006687968e-8,0.004434454646972603,1.0805123199301839e-5,-4.122560821070611e-8,0.004435094025680583,1.093179184586048e-5,-4.1503363883340675e-8,0.004435629850168535,1.1164738583475233e-5,-4.20170322203088e-8,0.004436026030782993,1.1428372850655338e-5,-4.259921088755147e-8,0.004436288544140871,1.1642827137621819e-5,-4.30729574358741e-8,0.00443645852333741,1.1749408550127374e-5,-4.33081550485094e-8,0.004436594888881352,1.1724150687214207e-5,-4.3251474414460785e-8,0.004436755874140951,1.1577909422798677e-5,-4.292656969019233e-8,0.00443698556045168,1.134743368171151e-5,-4.241440383930332e-8,0.004437307141160754,1.1082923092713402e-5,-4.1825890935872864e-8,0.004437722000943753,1.0835997728485317e-5,-4.1275427325207346e-8,0.004438212894918262,1.0650076781292515e-5,-4.0859608303239765e-8,0.004438749638289341,1.055393982394728e-5,-4.0642808497137944e-8,0.004439295959152751,1.0558721353467244e-5,-4.065026502851615e-8,0.004439816265453436,1.065819146280534e-5,-4.0868482817672476e-8,0.004440281272009354,1.0831676496297347e-5,-4.1251640135869176e-8,0.004440671831938921,1.1048643543678123e-5,-4.173183848769729e-8,0.004440980777783971,1.1273898329578631e-5,-4.2230779881881195e-8,0.00444121303269828,1.1472474912977608e-5,-4.267071508775094e-8,0.004441384565236301,1.1613723431763203e-5,-4.298351149337096e-8,0.004441520716355006,1.1674659260946504e-5,-4.311801611635916e-8,0.004441654103827259,1.1642927188475744e-5,-4.304658575328331e-8,0.004441821893723169,1.151970903380154e-5,-4.277157863485106e-8,0.004442061733825511,1.1322569755221519e-5,-4.2331789891194374e-8,0.004442405367359218,1.1087324544257746e-5,-4.1806717475930976e-8,0.004442869542993695,1.0866655575333044e-5,-4.1313536007648224e-8,0.004443445735403163,1.0722317764963522e-5,-4.0989728756109695e-8,0.004444093284368835,1.0708865030730829e-5,-4.0956817567218523e-8,0.0044447430760904995,1.085167507562386e-5,-4.127142029165161e-8,0.004445316435740319,1.1129602124610225e-5,-4.1886642259513546e-8,0.004445754128237322,1.1475626607160576e-5,-4.2653546623268654e-8,0.004446040101964218,1.180003031512926e-5,-4.3372752883896014e-8,0.004446205530673317,1.2024629257590159e-5,-4.387057130415036e-8,0.004446312162708855,1.2108771182796773e-5,-4.405669777283164e-8,0.004446427135514646,1.2055740045207085e-5,-4.3938284164400834e-8,0.004446602819718554,1.1902415131929761e-5,-4.3596893302424874e-8,0.004446867462772274,1.1702280581489064e-5,-4.3150880569211476e-8,0.00444722502652385,1.1510013581017392e-5,-4.272141346034424e-8,0.004447660112373166,1.1371009258943887e-5,-4.240940734950581e-8,0.004448144592351008,1.1315808141326373e-5,-4.228315760058449e-8,0.00444864413440166,1.1358103698667109e-5,-4.237371725707588e-8,0.004449124029971733,1.1495141539025288e-5,-4.2675501313854964e-8,0.004449554153193063,1.1709878328814522e-5,-4.315087896932633e-8,0.004449912835517964,1.1974488478859295e-5,-4.373794004970734e-8,0.004450189440411732,1.2254789064169708e-5,-4.4360459045246395e-8,0.004450385488268202,1.2515133469631053e-5,-4.493894052335691e-8,0.004450514285615522,1.2723218588808307e-5,-4.540139076746559e-8,0.004450599251519201,1.285424788009527e-5,-4.569253626675187e-8,0.0044506713012207,1.2894201090678989e-5,-4.578100104332719e-8,0.004450765540459394,1.2842246866083047e-5,-4.5664633203186566e-8,0.004450917284953617,1.2712332911019386e-5,-4.537412450667041e-8,0.004451157155322636,1.2533780867555994e-5,-4.497450577626395e-8,0.004451504873237557,1.2350163721766086e-5,-4.45628020467471e-8,0.004451961919675364,1.2214876307893983e-5,-4.425820466465791e-8,0.004452504731610211,1.218142064773772e-5,-4.418032467973815e-8,0.004453082319776596,1.2287689702351628e-5,-4.441399178406356e-8,0.0044536237576869794,1.2537566429059222e-5,-4.496809227303929e-8,0.004454058600129623,1.2889221277017663e-5,-4.5749448011482285e-8,0.004454344557171657,1.3261764007055407e-5,-4.657774011379726e-8,0.004454487209756872,1.356321056345686e-5,-4.724799032523849e-8,0.004454537817108847,1.3726577222573843e-5,-4.761103975360433e-8,0.004454569953530231,1.3733042945322505e-5,-4.762500825386583e-8,0.0044546503114754445,1.3611019367534598e-5,-4.7353008192290663e-8,0.004454819540444871,1.3417353161617989e-5,-4.692121901981639e-8,0.004455088006355839,1.3214963151419203e-5,-4.6469264458608674e-8,0.0044554417320164475,1.3056798315819873e-5,-4.6114776888332594e-8,0.00445585181070049,1.2978205618864193e-5,-4.5936593073707565e-8,0.004456283063848414,1.2995515360089378e-5,-4.597157388372203e-8,0.004456700455403941,1.3107894323916252e-5,-4.621850553884396e-8,0.0044570734879752745,1.3300386432833933e-5,-4.664459015113946e-8,0.004457379329847273,1.354733210799182e-5,-4.719288460843296e-8,0.004457605083715164,1.381611653844664e-5,-4.779065425340231e-8,0.004457749208594007,1.4071308351959136e-5,-4.835873390854053e-8,0.004457821935847933,1.4279162754995978e-5,-4.882171487818592e-8,0.004457844413589892,1.4412244841220207e-5,-4.9118304592704225e-8,0.004457846392811299,1.4453606997495086e-5,-4.9210578647334747e-8,0.004457862579541846,1.4399892313824196e-5,-4.909080557286075e-8,0.004457928006711199,1.4262935015950712e-5,-4.878499921089497e-8,0.0044580728160356475,1.406956442522464e-5,-4.835259699152093e-8,0.004458316817654614,1.385936585539174e-5,-4.7881662798881046e-8,0.004458664213340158,1.3680097018682372e-5,-4.7478820736234354e-8,0.004459099197509258,1.3580228791160693e-5,-4.725262339870064e-8,0.004459584026033035,1.3598195514992196e-5,-4.728940689142557e-8,0.004460062199621417,1.3749252092781208e-5,-4.762371409222547e-8,0.0044604695823886415,1.4013664681784223e-5,-4.8211740969940616e-8,0.004460753777901616,1.4333327715772738e-5,-4.8923755358978294e-8,0.004460895857321044,1.4624178301927179e-5,-4.957195585635171e-8,0.00446092230560696,1.4804495669279922e-5,-4.997383459421404e-8,0.004460896977374359,1.4826692738442146e-5,-5.002318300311229e-8,0.004460895349738283,1.4694329378561483e-5,-4.972790533985917e-8,0.004460976016780967,1.4455254987504552e-5,-4.919452719357374e-8,0.0044611646111219405,1.4178234027314433e-5,-4.857603680579923e-8,0.004461454185855782,1.3928460573193122e-5,-4.801746458935442e-8,0.0044618157539403095,1.3752419469232318e-5,-4.7622364855750946e-8,0.0044622107137216325,1.3673354803297678e-5,-4.7442825841443116e-8,0.00446260043945746,1.369354382664959e-5,-4.7484455725649896e-8,0.004462952022908023,1.3799219006272274e-5,-4.7717131725367e-8,0.004463241121058138,1.3965553328710682e-5,-4.8085882901992276e-8,0.004463453324834858,1.4160873361938923e-5,-4.852016867099879e-8,0.0044635849469705675,1.435036495631774e-5,-4.894218569650978e-8,0.004463643417515637,1.4499782775240661e-5,-4.9275285274911396e-8,0.004463647051016639,1.4579493829923948e-5,-4.945312739285398e-8,0.004463623708041326,1.456882906403381e-5,-4.9429429021382195e-8,0.004463607842406662,1.4460176219189537e-5,-4.918704040982184e-8,0.0044636357910401445,1.4261818394534823e-5,-4.874420470914212e-8,0.0044637397511841466,1.3998495202235436e-5,-4.815581116683994e-8,0.004463941391235043,1.3708962880863763e-5,-4.7508063679370155e-8,0.004464246337336341,1.3440376771153735e-5,-4.6906117413019404e-8,0.0044646407956383674,1.3240001878015215e-5,-4.645569825673976e-8,0.004465091381001237,1.3145269848031426e-5,-4.624087973870854e-8,0.004465549066273715,1.3173598219246631e-5,-4.6301165592733985e-8,0.004465957939694511,1.3314136875100861e-5,-4.661280004540448e-8,0.004466268576327031,1.352468763662037e-5,-4.708169932958065e-8,0.00446645372428031,1.3737541360524216e-5,-4.7556478385599956e-8,0.004466520878302181,1.3876287526487771e-5,-4.786615773013864e-8,0.004466514326078782,1.3880445157377903e-5,-4.7875375783545784e-8,0.004466502142877897,1.3727918531229615e-5,-4.753461483998569e-8,0.004466552086217613,1.344312403337607e-5,-4.689826847344771e-8,0.0044667082651349286,1.3085819784721498e-5,-4.609959388131855e-8,0.004466980019477852,1.2727550786706039e-5,-4.529813388914731e-8,0.004467345755137234,1.2428783962732317e-5,-4.4628795806165725e-8,0.004467765779943532,1.2225982089979055e-5,-4.4173112494455235e-8,0.004468196005854024,1.2129693991677846e-5,-4.395498255353792e-8,0.004468597642816224,1.2129490543834448e-5,-4.395156917433471e-8,0.00446894206410521,1.2201011417455164e-5,-4.410885737385981e-8,0.00446921225500677,1.2312244640502023e-5,-4.43555394468987e-8,0.004469402654481283,1.2428213420078234e-5,-4.46134499502362e-8,0.0044695185950805304,1.2514503621319245e-5,-4.48055188286882e-8,0.004469575723049835,1.2540430548831996e-5,-4.486296672886854e-8,0.004469599148903078,1.2482479511679878e-5,-4.473308223481721e-8,0.004469621667375493,1.2328204497541601e-5,-4.4387945702341005e-8,0.004469680258111596,1.2080054076724377e-5,-4.38329250854799e-8,0.004469810440791369,1.1757832861630705e-5,-4.3112118745779403e-8,0.004470038938882233,1.139812552580378e-5,-4.2307071423256166e-8,0.004470376233823944,1.1049363336854192e-5,-4.1525836645826615e-8,0.004470811437085582,1.0762470256707936e-5,-4.088220096014905e-8,0.004471311827050345,1.057885493987764e-5,-4.046892914926202e-8,0.004471828174441778,1.0518954079644614e-5,-4.0332120643179816e-8,0.00447230517930829,1.057478045414597e-5,-4.045439322306815e-8,0.004472694773246646,1.0709058764895794e-5,-4.075274930775221e-8,0.004472969079340785,1.0862056909000877e-5,-4.1093716830421817e-8,0.004473129460972397,1.096542999972803e-5,-4.1324306385980915e-8,0.004473208349376754,1.0960344314636686e-5,-4.131265117419883e-8,0.004473261801176122,1.0814980769902441e-5,-4.098727821687716e-8,0.004473353611162491,1.0535090952922028e-5,-4.036078520359405e-8,0.004473535890618031,1.0162456216834655e-5,-3.952640941680167e-8,0.004473833792415958,9.760956408521302e-6,-3.862688960352953e-8,0.004474240602953426,9.396173414810474e-6,-3.7808898628385294e-8,0.004474724001444978,9.11738920258227e-6,-3.718281945206038e-8,0.004475238859403357,8.948272943174389e-6,-3.6801887768029544e-8,0.0044757402350894555,8.887048525787006e-6,-3.6662466891908055e-8,0.004476192324498001,8.912754115928486e-6,-3.6717928510436886e-8,0.004476572466872101,8.99328366656885e-6,-3.689655835364853e-8,0.004476871540255352,9.092325994737656e-6,-3.711706737226179e-8,0.0044770926280973825,9.174281950373387e-6,-3.7299643889725875e-8,0.004477249315061717,9.207572991317009e-6,-3.737343689531388e-8,0.0044773641629216165,9.167232096321902e-6,-3.7282422144220036e-8,0.004477467204936426,9.037578898248145e-6,-3.699141801660316e-8,0.004477593756950581,8.815347168589488e-6,-3.649307148880597e-8,0.00447778058690321,8.512872182307729e-6,-3.5814955514758316e-8,0.004478059745215661,8.159958224253264e-6,-3.502372164908136e-8,0.004478450365817333,7.802247766408065e-6,-3.4221459193305144e-8,0.004478950468601355,7.494062159631074e-6,-3.3529720730520204e-8,0.004479532465119492,7.285542176108168e-6,-3.3060801908352687e-8,0.004480146136971822,7.2072554470058906e-6,-3.288331103792207e-8,0.004480730224220354,7.258279349781589e-6,-3.2995444030558204e-8,0.004481229449583244,7.4035582392112385e-6,-3.331896233314279e-8,0.004481610689525678,7.582522644393277e-6,-3.371838931973838e-8,0.004481872292063173,7.725939025928392e-6,-3.403868938062639e-8,0.00448204374844317,7.774910697168804e-6,-3.414782399457034e-8,0.004482176671298304,7.696059172490782e-6,-3.397078855811176e-8,0.004482330435030019,7.4890430319435334e-6,-3.350650916046562e-8,0.004482556672721601,7.1850969128227755e-6,-3.282465246101726e-8,0.0044828866992572885,6.837522641746615e-6,-3.2044432737991846e-8,0.0044833250857910616,6.507056498926579e-6,-3.130192899832561e-8,0.004483850858172803,6.24650987263678e-6,-3.071570165203201e-8,0.004484425307959444,6.08924159396039e-6,-3.036088489326645e-8,0.004485003194359061,6.044356934728174e-6,-3.025827024763154e-8,0.004485543401858622,6.098712850233066e-6,-3.0378643182073185e-8,0.004486016219005494,6.2234233182378906e-6,-3.0657287324259747e-8,0.0044864064166258944,6.3817652026060565e-6,-3.1011736157922704e-8,0.004486712974298434,6.536100940869929e-6,-3.135738930785751e-8,0.004486946987567679,6.652794334948827e-6,-3.16186317416998e-8,0.0044871290855611435,6.705289352964788e-6,-3.173578594963119e-8,0.004487287039748156,6.676139966458214e-6,-3.1669660514816774e-8,0.004487453549021817,6.558809591876483e-6,-3.1405558068106883e-8,0.004487663626245549,6.359694715241642e-6,-3.095779699979666e-8,0.004487950667436226,6.100153211559874e-6,-3.0374268126452117e-8,0.004488340386805238,5.817319379742182e-6,-2.973828357636435e-8,0.004488842722498734,5.561454687988725e-6,-2.9162651978515495e-8,0.004489443758855133,5.387386078451001e-6,-2.87704753805209e-8,0.00449010207955269,5.339481305214199e-6,-2.866142686948672e-8,0.004490754688042762,5.434077367358827e-6,-2.887228736862537e-8,0.004491334130057058,5.647948607453723e-6,-2.9351019643881805e-8,0.004491791249757919,5.921297869142392e-6,-2.99634549511861e-8,0.004492112629279643,6.17644552752166e-6,-3.0535254824106297e-8,0.00449232388491216,6.343735825162951e-6,-3.0910079891972617e-8,0.004492478423788278,6.3824291151391336e-6,-3.0996454297399085e-8,0.0044926387333911215,6.288994539844147e-6,-3.078631234061721e-8,0.004492858636300761,6.092913739653983e-6,-3.0345562453837724e-8,0.004493171588724417,5.844789364045817e-6,-2.9787493231587065e-8,0.00449358619792652,5.60206433789655e-6,-2.9240893731404095e-8,0.004494087869175982,5.4161245069199806e-6,-2.882123891207294e-8,0.004494644740160421,5.322864554289205e-6,-2.8609503663609465e-8,0.004495216006784931,5.337654872160231e-6,-2.864069875751362e-8,0.004495760772876803,5.45491845871229e-6,-2.8902689986086383e-8,0.00449624562807949,5.6517357057193595e-6,-2.9344127629553888e-8,0.004496649625176552,5.894052353282223e-6,-2.988837234120634e-8,0.004496966197981279,6.14368973988668e-6,-3.044936038422412e-8,0.004497202413708704,6.364618307242032e-6,-3.094585642668188e-8,0.004497376491928267,6.527582409948589e-6,-3.131194447327545e-8,0.004497514640436966,6.6129278100694005e-6,-3.150337999113445e-8,0.004497647925917268,6.612117621637158e-6,-3.150093270015358e-8,0.004497809336845073,6.528610724443239e-6,-3.131231070153016e-8,0.004498030707089667,6.3785361876222695e-6,-3.09736925859592e-8,0.004498338829174895,6.191080665260008e-6,-3.055066942661581e-8,0.004498750077775436,6.0076683654676744e-6,-3.013646953689903e-8,0.004499263612814337,5.8780642609847445e-6,-2.9843203850422515e-8,0.004499854940636369,5.851244450515609e-6,-2.9781269629881294E-08,0.004500473936466841,5.960397636023314e-6,-3.002551100540538e-8,0.004501052719345036,6.205775394502228e-6,-3.057655086561226e-8,0.00450152565398311,6.544818406940442e-6,-3.133855594471292e-8,0.004501855052718436,6.89991925988118e-6,-3.213677936923044e-8,0.004502048299394567,7.184984577129539e-6,-3.277745584916125e-8,0.00450215485481849,7.337928245096862e-6,-3.312096524996092e-8,0.004502244939964075,7.34104622514252e-6,-3.31275673941889e-8,0.0045023832883471036,7.220589179745083e-6,-3.285626158580508e-8,0.0045026110823796145,7.030850470500054e-6,-3.2428926008768215e-8,0.0045029404092560505,6.834169236371335e-6,-3.198546698313869e-8,0.004503358106314494,6.685082210089396e-6,-3.1648403907449894e-8,0.004503833931529304,6.621199922123047e-6,-3.150250475699595e-8,0.004504329393182454,6.659916022098113e-6,-3.158735035096041e-8,0.004504805490228415,6.79906815339101e-6,-3.18986098972113e-8,0.0045052288712172945,7.020052500014815e-6,-3.239479081077634e-8,0.004505576291020284,7.292536290791366e-6,-3.300768877577651e-8,0.004505837190189702,7.580099251624076e-6,-3.3655110613896705e-8,0.0045060143045280365,7.846042790020471e-6,-3.42541110553583e-8,0.004506122446663604,8.058625318459529e-6,-3.473295260761845e-8,0.0045061858442556986,8.195104654863028e-6,-3.504028264202122e-8,0.004506234642510104,8.244233774000591e-6,-3.515070923594395e-8,0.004506301185498216,8.20730170658394e-6,-3.506705303538336e-8,0.004506416396345633,8.098093426558627e-6,-3.482021907021817e-8,0.004506606235169193,7.94206498498607e-6,-3.446740371929097e-8,0.004506887964378976,7.774744655900673e-6,-3.4088620681013444e-8,0.004507265898608951,7.63883680811971e-6,-3.378026681707891e-8,0.004507726866888514,7.578827637892328e-6,-3.364294154809401e-8,0.0045082369085281135,7.631796357853752e-6,-3.376059550196789e-8,0.0045087423408103665,7.81442404265071e-6,-3.4171064362557586e-8,0.004509179270358261,8.109527450340536e-6,-3.48355963905556e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json new file mode 100644 index 0000000..d989a12 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":26000,"numberOfSamples":1000,"samples":[0.004509493310776733,8.460255546355793e-6,-3.5625800851343465e-8,0.004509663584584268,8.78152154032578e-6,-3.634960149730122e-8,0.004509716789810693,8.989819707723907e-6,-3.681866430913203e-8,0.004509719059465651,9.037418772725032e-6,-3.692552117143939e-8,0.004509748243703133,8.930185223519827e-6,-3.668355434778159e-8,0.004509863647122957,8.719470842231082e-6,-3.620846132642241e-8,0.004510089653785742,8.476972036399517e-6,-3.5661533171045015e-8,0.004510416800722429,8.269299770251092e-6,-3.51925282944491e-8,0.004510813094911667,8.1427235238956e-6,-3.4905561743649874e-8,0.004511237012805131,8.118815983827459e-6,-3.4849442039030304e-8,0.004511647598100416,8.19695215375018e-6,-3.5023237901990346e-8,0.004512010754110658,8.359585736620415e-6,-3.538793530902102e-8,0.004512302608721269,8.577895407180773e-6,-3.5878908014654e-8,0.004512511101780664,8.817020399356672e-6,-3.6417590410461715e-8,0.004512636407156604,9.040913865577355e-6,-3.692247406897225e-8,0.004512690307657771,9.216869444768706e-6,-3.7319489010541575e-8,0.004512694498577715,9.319590010896785e-6,-3.755134208751638e-8,0.004512677812454461,9.33448051439994e-6,-3.758499305360356e-8,0.004512672525088187,9.259714461186162e-6,-3.74162487552752e-8,0.004512710155956202,9.106773676260358e-6,-3.7070886445067697e-8,0.004512817232229619,8.899452134994748e-6,-3.660239062283695e-8,0.004513011361703757,8.671416905011533e-6,-3.6086549932726506e-8,0.0045132978459024205,8.462410007400726e-6,-3.561303803422552e-8,0.00451366700674806,8.313087368408677e-6,-3.5273853268424084e-8,0.004514092641922462,8.258223307030978e-6,-3.5147920393724736e-8,0.004514532771288454,8.318077690988317e-6,-3.5281410931936163e-8,0.004514934630932754,8.4888481118899e-6,-3.566597134940736e-8,0.004515245854344678,8.735374126556136e-6,-3.622214330179837e-8,0.0045154316998782295,8.991891199064452e-6,-3.6801147360575755e-8,0.004515492902915043,9.176856590224277e-6,-3.7218586920753816e-8,0.004515473030595792,9.22132948769478e-6,-3.731873347690093e-8,0.004515445973338222,9.09843419372188e-6,-3.704104339955742e-8,0.00451548682469044,8.835578371895206e-6,-3.644751863773576e-8,0.00451564268107663,8.500985857177386e-6,-3.5692080359945736e-8,0.0045159197183348996,8.174205711565663e-6,-3.495399269113799e-8,0.004516289609363855,7.91891452501725e-6,-3.437668106843999e-8,0.004516706111846334,7.769533914623208e-6,-3.403776290168179e-8,0.004517121078763411,7.73134067417984e-6,-3.3949388348932536e-8,0.0045174946878258695,7.787734155315276e-6,-3.4074540770568025e-8,0.004517799867137044,7.908923469211388e-6,-3.434642142253354e-8,0.004518023021591153,8.059160327422076e-6,-3.468456742654183e-8,0.004518163140214663,8.202005982025426e-6,-3.50066650311153e-8,0.004518230411948181,8.30424890030949e-6,-3.523747823122548e-8,0.004518244570725208,8.33915192550796e-6,-3.531634932075353e-8,0.004518232782286238,8.28935594403696e-6,-3.5203891163581475e-8,0.004518226774465987,8.149365170645358e-6,-3.488762043767852e-8,0.004518259006711036,7.927116613346235e-6,-3.438542274392408e-8,0.004518358060544222,7.643963370228097e-6,-3.3745425584923236e-8,0.004518543856405558,7.332621283429884e-6,-3.3041356370972954e-8,0.004518823498710852,7.0329632269025115e-6,-3.236314547040654e-8,0.004519188579967757,6.785903929501321e-6,-3.180325247605029e-8,0.004519614661144808,6.626048418181081e-6,-3.14401232958339e-8,0.0045200634304379044,6.5740276672578925e-6,-3.132079397132222e-8,0.004520487966458727,6.62956304606739e-6,-3.144502131997278e-8,0.00452084147546764,6.766843341505083e-6,-3.175463526314589e-8,0.004521089187148414,6.934764185105069e-6,-3.2134004538126606e-8,0.004521221269959029,7.065025688552307e-6,-3.2428442843453624e-8,0.004521261859102045,7.089574850293132e-6,-3.248384715700535e-8,0.0045212674299407694,6.964089990219654e-6,-3.2199939344201606e-8,0.004521310513078177,6.687544084459722e-6,-3.1574464342686096e-8,0.004521453447203763,6.305670157088708e-6,-3.071085821791362e-8,0.0045217253573987225,5.893958647960642e-6,-2.9779688167653515e-8,0.004522114733755025,5.529133856038296e-6,-2.8954214723599135e-8,0.004522579377927455,5.264744210794258e-6,-2.8355366465152043e-8,0.004523065009217748,5.120982847527676e-6,-2.802885167464862e-8,0.004523521972907846,5.088150002782038e-6,-2.7952986672350293e-8,0.004523914736487703,5.136932989628306e-6,-2.8061821235107004e-8,0.004524224518460753,5.229079919518181e-6,-2.8269112293518485e-8,0.004524447866784532,5.325356167857952e-6,-2.8486202260608446e-8,0.004524593830297251,5.390497834119252e-6,-2.8633216627973057e-8,0.004524681160259874,5.396171432205578e-6,-2.864585654482284e-8,0.004524735849207278,5.323027317101781e-6,-2.8480176026552257e-8,0.0045247886943237964,5.16249823096028e-6,-2.8116730602371682e-8,0.004524872353940403,4.918444281738836e-6,-2.7564280225240977e-8,0.0045250174349796965,4.608134848323794e-6,-2.68619228883987e-8,0.004525247591606092,4.261615509273891e-6,-2.6077583364155316e-8,0.004525574321292053,3.918549452938378e-6,-2.530086898948843e-8,0.00452599277311532,3.622150479587777e-6,-2.462943302074595e-8,0.0045264801545203655,3.4107258886289212e-6,-2.4149954956603862e-8,0.004526998018263306,3.308450392319929e-6,-2.3917312554474847e-8,0.004527498775693957,3.317760005942039e-6,-2.3937301228621522e-8,0.00452793558120547,3.415707219466181e-6,-2.415823276235786e-8,0.00452827373820132,3.555942963102195e-6,-2.4475281614218993e-8,0.004528501076735233,3.677053577969154e-6,-2.4749321189987848e-8,0.004528634255226658,3.7166708540264696e-6,-2.4838951555615288e-8,0.00452871788049019,3.6288209284880697e-6,-2.4639908971730102e-8,0.004528814461392247,3.399578871249497e-6,-2.4120586107355082e-8,0.004528986348915549,3.0544546974012395e-6,-2.3338735228699577e-8,0.004529275447593868,2.652362755159554e-6,-2.2427751850493508e-8,0.0045296894826229355,2.266809562799965e-6,-2.1554061940523532e-8,0.004530201357681512,1.962172998408435e-6,-2.0863453384503786e-8,0.004530761107800889,1.7757792179593227e-6,-2.044053421769499e-8,0.004531313427122603,1.7122786235617054e-6,-2.0295983770420518e-8,0.0045318125655776954,1.749367675975404e-6,-2.037944352447753e-8,0.004532230187937357,1.8490802478591477e-6,-2.0605011670815894e-8,0.00453255650096998,1.968861091375431e-6,-2.08762767548505e-8,0.004532797413529103,2.069429992863889e-6,-2.1104137100273155e-8,0.004532970455627508,2.1191957801873115e-6,-2.121685754164669e-8,0.004533101006844266,2.0963386322046738e-6,-2.1164869031366592e-8,0.004533219236241922,1.9898190337828303e-6,-2.09231193072752e-8,0.004533357423629913,1.8001513809640854e-6,-2.0492836790277707e-8,0.004533546992225019,1.540165048997408e-6,-1.9903207651827864e-8,0.004533814625910253,1.2352637227640804e-6,-1.9211889086172134e-8,0.0045341773121543635,9.220902568912064e-7,-1.8501932634248034e-8,0.004534637007950439,6.443360771918933e-7,-1.7872295458798828e-8,0.004535176664792075,4.4499167138597644e-7,-1.7420339103780497e-8,0.004535760035304328,3.557925328380303e-7,-1.7217978115692215e-8,0.004536337215533742,3.866412902473646e-7,-1.728772350881937e-8,0.004536855876733859,5.191842687487436e-7,-1.7588072274695526e-8,0.004537275385870752,7.081369882607212e-7,-1.8016430469229954e-8,0.004537579125593926,8.912435030713721e-7,-1.8431639886474907e-8,0.004537780530744449,1.005317578228007e-6,-1.8690357071296403e-8,0.004537920538034231,1.0034699039837472e-6,-1.868616129977461e-8,0.0045380570398233745,8.682810605385142e-7,-1.837946472292758e-8,0.004538249294644987,6.169983072998986e-7,-1.780931248930263e-8,0.004538541670781989,2.970358272201004e-7,-1.708319176747392e-8,0.004538951579800054,-2.7231731686069303e-8,-1.634711520277816e-8,0.004539465565272268,-2.9245638234442717e-7,-1.5744867236873657e-8,0.004540044817016876,-4.530987714794202e-7,-1.537993968878856e-8,0.004540637691521912,-4.913904592554641e-7,-1.5292863661002783e-8,0.0045411941681401885,-4.179588426089708e-7,-1.545968048557915e-8,0.0045416771529875445,-2.646725790176748e-7,-1.580808820140591e-8,0.004542067915028178,-7.389589463817978e-8,-1.624181308946475e-8,0.004542365941693601,1.1161571806108388e-7,-1.6663601282918254e-8,0.004542585366851695,2.557719936323004e-7,-1.6991327574329404e-8,0.004542750301596352,3.328556897280507e-7,-1.7166487509062615e-8,0.004542890539772055,3.288339048433999e-7,-1.7157205799619142e-8,0.004543038110357333,2.4148307307612337e-7,-1.6958505979006495e-8,0.00454322442352209,8.020747945813414e-8,-1.659185787564851e-8,0.004543477357567356,-1.341554185295706e-7,-1.6104693284517906e-8,0.0045438176089469635,-3.6995599015852086e-7,-1.5568968349127696e-8,0.004544254057927853,-5.868612278189073e-7,-1.507632289085078e-8,0.004544778812882803,-7.409000787411416e-7,-1.4726631776247386e-8,0.0045453638821404034,-7.933529756111925e-7,-1.4607830316871693e-8,0.004545962512626217,-7.226259496806341e-7,-1.4768947865738407e-8,0.004546517831531095,-5.353354038386974e-7,-1.5194914668309396e-8,0.004546978401910495,-2.705801777601392e-7,-1.5796839796783648e-8,0.004547315606031961,7.426064280520287e-9,-1.6428760347708144e-8,0.00454753489003374,2.2771495362971647e-7,-1.6929398929145512e-8,0.004547674975302893,3.348200634734904e-7,-1.7172762210130373e-8,0.004547795269270398,3.0546407671952013e-7,-1.7106022758788838e-8,0.004547957342816333,1.5361082419481356e-7,-1.6760923023671023e-8,0.004548207818776337,-7.620926519655014e-8,-1.623857269178295e-8,0.004548567688113334,-3.2310178950335675e-7,-1.5677235728358874e-8,0.004549029689400049,-5.261904517049809e-7,-1.5215224434557068e-8,0.004549562879332015,-6.387181991297879e-7,-1.4958938590346338e-8,0.004550122119909111,-6.369676213818445e-7,-1.4962560924246113e-8,0.004550659547407562,-5.227487180281773e-7,-1.522226203843342e-8,0.00455113503524916,-3.198295674394947e-7,-1.568415057741117e-8,0.004551523306381531,-6.614611648123595e-8,-1.6261898726347644e-8,0.004551816641272785,1.9551328796095916e-7,-1.685796274830549e-8,0.004552023601182218,4.2580724108011224e-7,-1.7382583753550408e-8,0.004552165189758773,5.945892816202448e-7,-1.7766991018379748e-8,0.004552270093790798,6.837932410099917e-7,-1.7970026091410244e-8,0.004552370226282839,6.880617875256065e-7,-1.797954851084639e-8,0.004552497089156715,6.141061808103928e-7,-1.781091130786019e-8,0.004552678823971549,4.796156243032983e-7,-1.7504429067141582e-8,0.004552937441607541,3.1202357072442164e-7,-1.7122570952647516e-8,0.004553285657210565,1.4683488458868566e-7,-1.6746191281231358e-8,0.004553723072438308,2.461230159602889e-8,-1.6467701649164962e-8,0.004554232297584862,-1.4673606685835707e-8,-1.6378198838017022e-8,0.004554776931368462,5.916408340345163e-8,-1.654648595704409e-8,0.004555304544316013,2.5471410996338887e-7,-1.699210890005788e-8,0.004555757580182239,5.487508779098537e-7,-1.766206390844868e-8,0.00455609163018589,8.847980560550384e-7,-1.8427567403072217e-8,0.004556294266149341,1.1862585904106192e-6,-1.9114066338961307e-8,0.00455639356224145,1.3819276275300728e-6,-1.955944643880223e-8,0.004556449423840962,1.4320994076717743e-6,-1.967347844662727e-8,0.00455653146260646,1.3415196289400694e-6,-1.9467164239301853e-8,0.004556695250636879,1.1538974614742377e-6,-1.9040064669564954e-8,0.00455696762660136,9.337292242152009e-7,-1.8538868697838413e-8,0.004557344253094815,7.457228920368247e-7,-1.8110674855141883e-8,0.004557796262614695,6.393184058846508e-7,-1.7867944352973605e-8,0.004558280964655819,6.408021303045762e-7,-1.7870661006435703e-8,0.004558752717751708,7.521507776956689e-7,-1.812364701480733e-8,0.004559171865542613,9.545520907436515e-7,-1.8584396920373626e-8,0.004559510918417762,1.214685417394258e-6,-1.9177186559210626e-8,0.0045597577345257365,1.492268065989241e-6,-1.9810175736451022e-8,0.004559915758252532,1.747525782261627e-6,-2.0392490975707653e-8,0.004560001790681829,1.947399946982737e-6,-2.084852456530275e-8,0.004560042130719432,2.069755428846989e-6,-2.112766147211479e-8,0.004560068031127442,2.105379942421046e-6,-2.1208875035905857e-8,0.004560111313149676,2.0580137470542224e-6,-2.110073390215724e-8,0.004560200668904181,1.943025512553438e-6,-2.083829693588606e-8,0.004560358702285993,1.785412603296129e-6,-2.0478523102675264e-8,0.004560599413535639,1.6174458646150957e-6,-2.009495393525646e-8,0.004560925771429382,1.4758038902445344e-6,-1.977126696599221e-8,0.004561327227637577,1.3976103681723366e-6,-1.9592281027131787e-8,0.004561777687863393,1.414475222692563e-6,-1.963031184849548e-8,0.004562235579990404,1.5439760444566057e-6,-1.9925614673578647e-8,0.004562648675447503,1.7796412722016043e-6,-2.046341689014831e-8,0.004562966076598825,2.0834817290894464e-6,-2.1156859279096877e-8,0.004563156563769151,2.3880171788488707e-6,-2.1851733662215338e-8,0.004563226026995868,2.6134961406077906e-6,-2.236596297709388e-8,0.004563222002259049,2.697182257226839e-6,-2.255654425324677e-8,0.004563218140920344,2.6200473503104345e-6,-2.2380369070183947e-8,0.004563285177328307,2.4142697533356353e-6,-2.1911080480621846e-8,0.00456346510562536,2.1474700508499156e-6,-2.1302898831592876e-8,0.0045637614855055355,1.8952029862123072e-6,-2.0727876983910757e-8,0.004564146109374209,1.717390042126911e-6,-2.0322347502066937e-8,0.004564573586655692,1.6467160412382832e-6,-2.0160696512706902e-8,0.004564995621143562,1.6879982482464885e-6,-2.025403919365333e-8,0.004565371098880404,1.823849272809698e-6,-2.0563061761098215e-8,0.004565671575998424,2.0224636955771143e-6,-2.1015577494141815e-8,0.004565883304822525,2.2451570701558744e-6,-2.1523520714831093e-8,0.004566007062175339,2.4528861969496664e-6,-2.1997743592595424e-8,0.004566056469157245,2.6116666971517507e-6,-2.23604574329312e-8,0.004566055109573586,2.6967378051573467e-6,-2.2554903643749895e-8,0.004566032787591015,2.6952576374760298e-6,-2.2551638035756678e-8,0.004566021340058094,2.6074130943391173e-6,-2.2351082445335482e-8,0.004566050456020915,2.445916611802514e-6,-2.198229461679592e-8,0.004566143978834918,2.234071638222029e-6,-2.1498460356284963e-8,0.004566316991076654,2.002834908710053e-6,-2.0970174692905903e-8,0.004566573698773829,1.7872369419549948e-6,-2.047735188978444e-8,0.004566906025496633,1.6222415688750605e-6,-2.009987915744285e-8,0.004567292941820179,1.5378947751270364e-6,-1.9906572258774763e-8,0.0045677009482845456,1.5534732761251689e-6,-1.9941722705096247e-8,0.004568086845586504,1.6706423254153708e-6,-2.0209304708076832e-8,0.004568404479915657,1.8669001932336232e-6,-2.065787129431821e-8,0.004568616641222311,2.0927296815380814e-6,-2.1174057753546027e-8,0.004568710628782926,2.277737563029436e-6,-2.159677431671749e-8,0.004568710906383361,2.3496980887248315e-6,-2.1760931647364762e-8,0.004568678450507578,2.2627328227331568e-6,-2.1561913449607736e-8,0.004568690934995052,2.0202730399911163e-6,-2.100789416692359e-8,0.004568811461316786,1.6765736725135978e-6,-2.0223021008261412e-8,0.004569064102334118,1.3138502582226867e-6,-1.939501198865483e-8,0.00456942983638702,1.0095623883627573e-6,-1.870048308376553e-8,0.0045698609228537225,8.126805895776015e-7,-1.8250956905805127e-8,0.004570301299600792,7.370286449055343e-7,-1.8077863586350383e-8,0.004570702395164331,7.675146472653699e-7,-1.8146849034032396e-8,0.004571031105591736,8.712119800734532e-7,-1.838299920858834e-8,0.004571271553897738,1.0077872223193491e-6,-1.8694474593890068e-8,0.004571423431715869,1.1371794672960694e-6,-1.898988427190855e-8,0.00457149912894306,1.224623094486609e-6,-1.9189713805360918e-8,0.004571520661368493,1.2439529482437433e-6,-1.9233970167685107e-8,0.004571516461258664,1.1798659800376192e-6,-1.90875063062554e-8,0.004571517887299565,1.0292685411183112e-6,-1.874320617434184e-8,0.00457155544903053,8.015811947188519e-7,-1.822266996676711e-8,0.004571654890494846,5.177527012148897e-7,-1.757386049492885e-8,0.0045718335249696285,2.0776980474633583e-7,-1.686531683855287e-8,0.004572097388308316,-9.323396016944465e-8,-1.6177255542095043e-8,0.004572439665645757,-3.4987692521596087e-7,-1.5590463436344316e-8,0.004572840644505964,-5.31972816140779e-7,-1.5173961796713732e-8,0.004573269348815289,-6.200415053200593e-7,-1.4972436045635267e-8,0.004573687024026574,-6.10406095595246e-7,-1.4994491965318193e-8,0.004574052809641157,-5.192579563073559e-7,-1.520320779417572e-8,0.00457433198222599,-3.843987328357727e-7,-1.5512049283710714e-8,0.004574506433080039,-2.6231970700412053e-7,-1.57915871799184e-8,0.004574585098804139,-2.1787955603130257e-7,-1.5893271807468845e-8,0.0045746091849351205,-3.056827632750247e-7,-1.569220003592137e-8,0.004574645498676162,-5.476968892825376e-7,-1.513834525051923e-8,0.004574765267068838,-9.184797312588896e-7,-1.4290196294897466e-8,0.00457501606601899,-1.3499749934384158e-6,-1.3303575679860455e-8,0.004575402559457306,-1.7569182650377685e-6,-1.2373436343486388e-8,0.00457588755670308,-2.0690376161348062e-6,-1.1660288023729968e-8,0.004576410675222101,-2.2521266223356963e-6,-1.1242149216779647e-8,0.004576911396180024,-2.3103385627944873e-6,-1.1109414454615705e-8,0.004577344958268909,-2.275047092560445e-6,-1.119036156480763e-8,0.004577688009744958,-2.190125367673378e-6,-1.1384764724171442e-8,0.00457793703023403,-2.1001362793857524e-6,-1.1590799048558753e-8,0.004578103680851678,-2.0432033769984585e-6,-1.1721260373927869e-8,0.004578209903486739,-2.0476287663152695e-6,-1.1711299731405369e-8,0.00457828387494594,-2.1305649056463137e-6,-1.1521549135013692e-8,0.004578356691217041,-2.2974938653969773e-6,-1.113942510021554e-8,0.004578459254883159,-2.5420904405371936e-6,-1.0579494532798996e-8,0.004578618975408969,-2.8466169571197294e-6,-9.882523233547e-9,0.004578856169100808,-3.183321162571054e-6,-9.112167432714705e-9,0.004579180478803452,-3.5174083811508843e-6,-8.34808453913955e-9,0.004579588120477424,-3.8118316727193404e-6,-7.674971745318212e-9,0.004580060934558044,-4.03352156185739e-6,-7.168392305513895e-9,0.0045805679854873955,-4.1600968235078126e-6,-6.87951141941344e-9,0.0045810699651512255,-4.185692981165825e-6,-6.821782230335321e-9,0.00458152603375295,-4.124467505914989e-6,-6.962856854404446e-9,0.004581902189684743,-4.010657797913334e-6,-7.224349646031663e-9,0.004582179915574498,-3.894438306832133e-6,-7.491268811747432e-9,0.004582363424246814,-3.833098119282915e-6,-7.632267271587255e-9,0.004582483126184382,-3.8777855317296025e-6,-7.53011848341852e-9,0.004582592398102796,-4.057840675385612e-6,-7.117693448106915e-9,0.004582755475052093,-4.367487092300224e-6,-6.408428922268497e-9,0.004583027684494128,-4.761913130848646e-6,-5.505193981758026e-9,0.004583434904318093,-5.1682652158940795e-6,-4.575001218916299e-9,0.004583962740856525,-5.509717091332434e-6,-3.793847647778333e-9,0.004584562235224711,-5.731726984261732e-6,-3.286608037184449e-9,0.0045851690079899594,-5.8173444046123675e-6,-3.092013230972495e-9,0.004585724984926677,-5.785936446522613e-6,-3.1655856948169594e-9,0.004586192672434863,-5.680003803249362e-6,-3.4098510201368928e-9,0.004586558909587067,-5.549240041603622e-6,-3.710862720240599e-9,0.004586831090544941,-5.438473165345392e-6,-3.965824489806852e-9,0.004587030516411275,-5.381337431846182e-6,-4.097587491428378e-9,0.004587186126494469,-5.398361853965937e-6,-4.059053627389166e-9,0.0045873298103882906,-5.49731379182367e-6,-3.8324359563939324e-9,0.004587493095288864,-5.6741958005571095e-6,-3.427014054705955e-9,0.0045877044693880785,-5.914235263036652e-6,-2.876857912876998e-9,0.004587986651218072,-6.192958116809043e-6,-2.238299632400325e-9,0.004588353448843592,-6.477950803344133e-6,-1.5858038797377467e-9,0.004588806428404769,-6.73216177730537e-6,-1.0043412823020856e-9,0.00458933233628059,-6.919340188748711e-6,-5.769299288868636e-10,0.004589902743292579,-7.011376771941958e-6,-3.6786881572565e-10,0.004590477310455618,-6.996130497857601e-6,-4.0485922692968167e-10,0.004591011167147137,-6.883260760486553e-6,-6.656513658249578e-10,0.0045914652682251846,-6.705371049354524e-6,-1.075393733113511e-9,0.004591817010039603,-6.512924106794449e-6,-1.5182606557942965e-9,0.004592067796621043,-6.363468442006583e-6,-1.8621675068497396e-9,0.004592244944227824,-6.307637731525589e-6,-1.9909320328163395e-9,0.004592396800370081,-6.375463343972728e-6,-1.835720290287429e-9,0.004592581636072272,-6.566741952320174e-6,-1.397147556305703e-9,0.004592852503308843,-6.848670800862258e-6,-7.506592754098574e-10,0.0045932418347822595,-7.16265852740837e-6,-3.085310633349787e-11,0.004593750787773998,-7.439775464126724e-6,6.039907256439864e-10,0.004594348004365676,-7.620693551409611e-6,1.0176568839792315e-9,0.004594979307958952,-7.67285027729872e-6,1.1353900564086016e-9,0.004595584733360852,-7.597882344516838e-6,9.60993606260401e-10,0.004596115629330661,-7.427042036220201e-6,5.663444100107817e-10,0.004596545284004681,-7.208277314545172e-6,6.172570217697634e-11,0.004596870828408168,-6.9916428475073475e-6,-4.377209163440163e-10,0.004597108555701069,-6.818392915343977e-6,-8.371051908542961e-10,0.004597286586221487,-6.715617670183615e-6,-1.0741512526115635e-9,0.004597438018468549,-6.6953943241077795e-6,-1.1211643140079087e-9,0.004597595917342151,-6.7563461785649045e-6,-9.814428534041288e-10,0.0045977900559172604,-6.8858632210796456e-6,-6.841521467843064e-10,0.004598044659033155,-7.062128212677125e-6,-2.796287018101613e-10,0.004598376318128057,-7.255916920005681e-6,1.6480339335871812e-10,0.004598791545151504,-7.4327601793754e-6,5.698408862789437e-10,0.004599284036273952,-7.55641510487658e-6,8.521963256757693e-10,0.004599832545317101,-7.59449169585154e-6,9.37519703522967e-10,0.004600401089893143,-7.526267837569374e-6,7.783330705853753e-10,0.0046009435048163455,-7.351117380604259e-6,3.7337668699399923e-10,0.004601413323426574,-7.094082392306315e-6,-2.1959916877791475e-10,0.004601777276461345,-6.804398311453375e-6,-8.872456883447427e-10,0.004602027574734469,-6.544807205465784e-6,-1.4852269544859042e-9,0.004602187108824936,-6.373998484428838e-6,-1.878640796994688e-9,0.004602304305622246,-6.328662725555859e-6,-1.983290254130587e-9,0.004602439234285484,-6.4122851305789306e-6,-1.7913894121004542e-9,0.004602646341656962,-6.59454075292182e-6,-1.372856112257814e-9,0.004602959791749618,-6.820555679744346e-6,-8.539567811146143e-10,0.004603385401025903,-7.026168406663905e-6,-3.8223413598513426e-10,0.004603900535041509,-7.154432726648315e-6,-8.862971018962839e-11,0.004604461221360877,-7.16909923779504e-6,-5.6530923583887666e-11,0.004605014161836207,-7.061911347469658e-6,-3.0496913721986693e-10,0.004605510173710997,-6.852198505821913e-6,-7.894778705239851e-10,0.004605915231864156,-6.579480498016876e-6,-1.4190378636351609e-9,0.004606216233404941,-6.291994615044852e-6,-2.0824711583876744e-9,0.00460642071017142,-6.035108556079831e-6,-2.675171494544614e-9,0.00460655193149057,-5.842863718623184e-6,-3.1186589302558516e-9,0.004606641995139615,-5.733972110264688e-6,-3.369853455113043e-9,0.004606725264452894,-5.711711571864843e-6,-3.4213163304000836e-9,0.0046068334424430035,-5.7661813773756325e-6,-3.2960088168680032e-9,0.004606992447073734,-5.877366283212291e-6,-3.0401786490361465e-9,0.004607220525040382,-6.01804827384349e-6,-2.7166204947669695e-9,0.004607526828035787,-6.156368380259616e-6,-2.3987754818787228e-9,0.004607909878637184,-6.2584771004198995e-6,-2.1646433927517645e-9,0.004608355861891447,-6.292108699703443e-6,-2.0885544550141327e-9,0.004608837460403657,-6.231941022115572e-6,-2.2288041686048496e-9,0.004609314869247811,-6.066944432541149e-6,-2.610692390028512e-9,0.004609741181179981,-5.808287594175388e-6,-3.208296374163034e-9,0.004610073532643847,-5.494016982094601e-6,-3.9337217762102935e-9,0.004610288280096579,-5.185259144008995e-6,-4.645941435360547e-9,0.004610393895995997,-4.950873931477467e-6,-5.186269288801948e-9,0.004610433184336685,-4.844246198175972e-6,-5.431895389162019e-9,0.004610470758879338,-4.8829096485003395e-6,-5.342766223918112e-9,0.0046105707030473,-5.0419564476459976e-6,-4.976589310976798e-9,0.004610775446429694,-5.26417400954597e-6,-4.465310329754646e-9,0.004611094963682681,-5.480348310975678e-6,-3.968302033161426e-9,0.00461150823724263,-5.62972692844612e-6,-3.625329611994953e-9,0.004611973094222571,-5.673786679284628e-6,-3.524987578971608e-9,0.0046124390559712505,-5.60146915226002e-6,-3.692726761576285e-9,0.004612859222188488,-5.427288532920816e-6,-4.095184948750271e-9,0.004613199097686521,-5.184761096077944e-6,-4.655216115005645e-9,0.00461344157660515,-4.917463952163088e-6,-5.272388730713527e-9,0.004613587996069912,-4.669665926120923e-6,-5.844552407820035e-9,0.004613655691602776,-4.478251084401866e-6,-6.28652082530562e-9,0.004613673077859672,-4.367267921755222e-6,-6.542744128551488e-9,0.00461367367651798,-4.345651474038695e-6,-6.592631310893555e-9,0.0046136904516331,-4.407814373872608e-6,-6.449178045460803e-9,0.004613751389181142,-4.536239263420983e-6,-6.152919507168062e-9,0.004613876649815567,-4.704994955452618e-6,-5.763751856803909e-9,0.004614077028175075,-4.883303608630905e-6,-5.352690069082215e-9,0.004614353162834188,-5.038827337005442e-6,-4.994329710158694e-9,0.004614695036423012,-5.140875843306533e-6,-4.759499974144619e-9,0.004615081647533657,-5.164078436357073e-6,-4.706796509128987e-9,0.004615481345908867,-5.093156815280933e-6,-4.871507157630509e-9,0.004615854140456318,-4.928932317867542e-6,-5.251665030544923e-9,0.004616157793161933,-4.694284295014727e-6,-5.794263848231378e-9,0.004616358878782183,-4.436656622864292e-6,-6.389541647842568e-9,0.004616447225878722,-4.222062557520083e-6,-6.884973524270293e-9,0.004616447316459371,-4.117217975337249e-6,-7.126660174101772e-9,0.0046164171712829195,-4.163817419832329e-6,-7.018720722844495e-9,0.004616430002982171,-4.358091358751388e-6,-6.5703061256921416e-9,0.004616545920780777,-4.64955458388336e-6,-5.898225015384205e-9,0.004616789519416018,-4.961068379082266e-6,-5.180477898492885e-9,0.004617144952363664,-5.21797868115541e-6,-4.5890532040936815e-9,0.004617567428571435,-5.370589400078979e-6,-4.238257150629672e-9,0.004618001377383055,-5.4024523567296e-6,-4.165786813726474e-9,0.00461839617858386,-5.326689531338634e-6,-4.341319230810882e-9,0.004618715659086564,-5.176427103811998e-6,-4.688546619249612e-9,0.004618941704013463,-4.994299138923035e-6,-5.1092602716603065e-9,0.0046190738457956015,-4.823500218588578e-6,-5.503860695653606e-9,0.004619126539673815,-4.701021915286869e-6,-5.786919842108562e-9,0.00461912513350184,-4.6530002781485684e-6,-5.897985711351209e-9,0.004619101113456684,-4.692128922859444e-6,-5.8076723886911916e-9,0.004619087174435325,-4.817110070681227e-6,-5.5190059356818914e-9,0.004619112672785507,-5.013950645613634e-6,-5.064416509080086e-9,0.004619199956383798,-5.258745206492392e-6,-4.499227652478228e-9,0.004619361925076508,-5.521396310506229e-6,-3.892989039720409e-9,0.004619600861690062,-5.769630238686212e-6,-3.3201995651143257e-9,0.0046199082837785595,-5.972903127371703e-6,-2.851352592334347e-9,0.004620265553426885,-6.106140175320044e-6,-2.5443702178223045e-9,0.004620645157437597,-6.15344235394916e-6,-2.4360418005486742e-9,0.004621012910332626,-6.111969284666793e-6,-2.5329705998129033e-9,0.004621331889116244,-5.995896088586415e-6,-2.8023280874564467e-9,0.004621569196957076,-5.839257062531263e-6,-3.16525563366286e-9,0.004621705946598681,-5.6949592448301445e-6,-3.499245426945735e-9,0.0046217486369424686,-5.626269776579186e-6,-3.6579976183436843e-9,0.004621736346891752,-5.688589628394338e-6,-3.5136773121236357e-9,0.004621735560203208,-5.9056093086997374e-6,-3.011976455429588e-9,0.004621818663207311,-6.252544277839716e-6,-2.2106262735571202e-9,0.004622034186749106,-6.660327133482274e-6,-1.269447535738715e-9,0.004622386277920894,-7.0421296244785226e-6,-3.8895869566759596e-10,0.004622835921998608,-7.326987257096725e-6,2.672247922603419e-10,0.004623320597655784,-7.481387241366695e-6,6.22078154458821e-10,0.004623778166074979,-7.511256501722334e-6,6.895832720469361e-10,0.0046241631750252934,-7.4503005879202574e-6,5.476957123973267e-10,0.0046244526906444455,-7.344777280885875e-6,3.031921981158643e-10,0.004624644751104253,-7.241142852555951e-6,6.324918068849496e-11,0.0046247535293354415,-7.178329664083658e-6,-8.227089394819571e-11,0.004624803929537004,-7.1838293799132266e-6,-6.982495105222414e-11,0.004624826696230001,-7.272134715425384e-6,1.3414464882997706e-10,0.004624854095060916,-7.444583539571314e-6,5.327371256362688e-10,0.004624916026302616,-7.690267618702546e-6,1.1006291093985203e-9,0.004625036574007785,-7.98793405485864e-6,1.7885067099525766e-9,0.004625231133799637,-8.30888821439031e-6,2.5298802519654072e-9,0.004625504428824734,-8.620815020618825e-6,3.2500039740028935e-9,0.004625849747329165,-8.892151827359156e-6,3.875986187591585e-9,0.0046262495157665465,-9.09652545200698e-6,4.346970267559263e-9,0.004626677147753625,-9.216883627944467e-6,4.623605244888573e-9,0.004627100098948487,-9.249002221467704e-6,4.6961442314090165e-9,0.004627484100502901,-9.204044867914665e-6,4.590434874603475e-9,0.004627798689161824,-9.109776567161958e-6,4.3708109803278244e-9,0.004628024187515499,-9.0095003276215e-6,4.1376398888795614e-9,0.004628159602392367,-8.956974239448121e-6,4.015455545081188e-9,0.004628229255540625,-9.005485803645908e-6,4.127521100134283e-9,0.004628283803510658,-9.1910726190435e-6,4.556926589182645e-9,0.004628390435834369,-9.514454774165462e-6,5.304877259037512e-9,0.004628610918423801,-9.931843970056032e-6,6.269651296939101e-9,0.004628975503068454,-1.03648245865506e-5,7.2696549997176675e-9,0.004629467998225569,-1.0728850454589621e-5,8.10939549229837e-9,0.004630032512152586,-1.0965482676576773e-5,8.65397700401509e-9,0.004630597398772655,-1.1060056137677217e-5,8.86984853736169e-9,0.004631101082919748,-1.1038122203419039e-5,8.816457412620772e-9,0.004631507147841215,-1.0948389067229884e-5,8.606690701628071e-9,0.004631806481354592,-1.0844288661248472e-5,8.364204739480547e-9,0.004632011465302068,-1.0771358781577292e-5,8.194291991699351e-9,0.004632147892557216,-1.0761401585255883e-5,8.170455351365712e-9,0.004632247893263616,-1.0831308542105932e-5,8.331728476942694e-9,0.00463234477781505,-1.0984114505098195e-5,8.685073680741978e-9,0.004632469369290628,-1.1210771926742844e-5,9.209415190899736e-9,0.004632647141513031,-1.1492171204089592e-5,9.860291714348777e-9,0.004632895765556187,-1.1801489544677315e-5,1.0575356211698413e-8,0.004633222987185644,-1.2107161747595294e-5,1.1281365019742708e-8,0.004633625109689717,-1.2376748980879223e-5,1.1903214390625413e-8,0.004634086659004174,-1.2581610090192167e-5,1.2374746891829162e-8,0.004634581752502566,-1.2701806877036646e-5,1.2650024924146413e-8,0.004635077356706937,-1.273044813037253e-5,1.2713298103112125e-8,0.004635538281190807,-1.2676599340062202e-5,1.2585709492729057e-8,0.004635933426539173,-1.2565907068775515e-5,1.2326775887080312e-8,0.0046362425090470906,-1.2438342120984666e-5,1.202920592778017e-8,0.004636462294497865,-1.234271921279755e-5,1.1806193185873564e-8,0.004636611028747824,-1.232775517799123e-5,1.1770617073140064e-8,0.004636729067608224,-1.2429993538057063e-5,1.2006973681361427e-8,0.004636873204322435,-1.2660614669240317e-5,1.2540806146547426e-8,0.004637103047741207,-1.2995764214321633e-5,1.3316407776853431e-8,0.004637461294852211,-1.3376967540621544e-5,1.4197950262497705e-8,0.00463795534065098,-1.3726217412767458e-5,1.5004554273269622e-8,0.004638550845381015,-1.3972478316380603e-5,1.5571711376454045e-8,0.004639183148953752,-1.4077211752893863e-5,1.5810383357853653e-8,0.0046397812865391925,-1.4045280259926954e-5,1.5732214181573113e-8,0.0046402914283477465,-1.3917086868911308e-5,1.5431235497281092e-8,0.004640688992994678,-1.3749519789539588e-5,1.50396004361683e-8,0.004640977811977925,-1.3597154104758875e-5,1.4683939035007512e-8,0.0046411816590931215,-1.3500634643284917e-5,1.4458435271925997e-8,0.004641334337283517,-1.3482814716284878e-5,1.4415936504639937e-8,0.004641471841569615,-1.3549864644392499e-5,1.45705737914381e-8,0.004641627345314647,-1.36943373473814e-5,1.4904873429144573e-8,0.004641828265389255,-1.3898382253809021e-5,1.5377192152694978e-8,0.004642094369945667,-1.4136568493739574e-5,1.592827642183505e-8,0.004642436229981527,-1.4378530825307724e-5,1.648746362443435e-8,0.004642853793025203,-1.4591962398589605e-5,1.6979710468902657e-8,0.00464333536372152,-1.4746476784586312e-5,1.7334602810121096e-8,0.004643857739129038,-1.481845010519349e-5,1.749756817785199e-8,0.00464438837763796,-1.479624509342569e-5,1.7441917675913e-8,0.0046448901141322415,-1.4684572553892183e-5,1.7178880316379137e-8,0.00464532817306209,-1.4506395760338885e-5,1.676197448758261e-8,0.0046456782783954416,-1.4300948688484878e-5,1.628240091514535e-8,0.004645933875498211,-1.4117326680498562e-5,1.5854168093428857e-8,0.004646110289799332,-1.4004423473821114e-5,1.5590715394014384e-8,0.004646244116896511,-1.399911276381716e-5,1.5577449679665026e-8,0.004646387005593405,-1.41153100211975e-5,1.5846355805771457e-8,0.004646594141764705,-1.4337032558028205e-5,1.6359950354097322e-8,0.004646909305258094,-1.4618613247030586e-5,1.701188561366317e-8,0.0046473503812339495,-1.4894178333601433e-5,1.7649042879564176e-8,0.004647900916773948,-1.5095625610264924e-5,1.811329983033688e-8,0.004648512809389593,-1.5173842404411922e-5,1.829077431406508e-8,0.004649120903019922,-1.5114403601433032e-5,1.8148248545685655e-8,0.004649663817187577,-1.4940331193331636e-5,1.7739550224659373e-8,0.004650101646361556,-1.4701189768492982e-5,1.7180166575556488e-8,0.004650423559198932,-1.4455016176381626e-5,1.6605176919502795e-8,0.004650644665764515,-1.4251827770794912e-5,1.613086614501808e-8,0.004650796624019296,-1.4124141025250696e-5,1.583268895658235e-8,0.004650917415804542,-1.4084914955533756e-5,1.5740543813909623e-8,0.004651043598431591,-1.4130241265291127e-5,1.5845089278510927e-8,0.0046512057278376125,-1.4243729279101672e-5,1.6107974164142077e-8,0.0046514261340793615,-1.4400690454054686e-5,1.6471579916206996e-8,0.00465171789456136,-1.4571531090473221e-5,1.6866922638427443e-8,0.004652084137226091,-1.4724599130893931e-5,1.7220302263998086e-8,0.00465251732741125,-1.4829134893015994e-5,1.746020024223448e-8,0.004652998819609395,-1.4859005735948932e-5,1.7525983107701823e-8,0.004653499526234626,-1.4797478165342453e-5,1.7378984205893643e-8,0.004653982822792938,-1.4642447874902636e-5,1.701461884775316e-8,0.004654410522758944,-1.4410540357957179e-5,1.6471859896107837e-8,0.004654751676673082,-1.4137726039344877e-5,1.5834608479389963e-8,0.0046549921899199246,-1.3874312315314267e-5,1.5219993013443092e-8,0.004655141733859297,-1.3673984905797297e-5,1.4752835810267254e-8,0.004655234441725839,-1.3579420898515158e-5,1.4532174851046341e-8,0.00465532189043984,-1.3609191262358246e-5,1.460084197006534e-8,0.00465545992364021,-1.3750758727023153e-5,1.4929278998332993e-8,0.004655693328327301,-1.3962304090208998e-5,1.5419907146882814e-8,0.004656043110456753,-1.4183068768481111e-5,1.5931259431933548e-8,0.0046565001678516875,-1.434927671056179e-5,1.631501554350779e-8,0.004657027305155954,-1.4411158052329369e-5,1.6455548921583325e-8,0.004657569281103155,-1.434612452943196e-5,1.630052615942731e-8,0.004658068049326739,-1.41639120076071e-5,1.5872851697627348e-8,0.0046584782426453645,-1.3901969676808915e-5,1.525993191601153e-8,0.0046587776708922075,-1.3613082255371558e-5,1.458484088844579e-8,0.004658969832612916,-1.3350233172794423e-5,1.397103491590227e-8,0.004659079003760188,-1.3154157206487545e-5,1.3513330900768914e-8,0.004659141208384155,-1.3046837117797856e-5,1.3262761688597618e-8,0.004659194957403009,-1.3031068730407019e-5,1.3225604937819598e-8,0.004659274330167408,-1.3094026415269862e-5,1.3371747416260096e-8,0.0046594050651191455,-1.3212282800757067e-5,1.3646426315830232e-8,0.004659602999671059,-1.3356523513515203e-5,1.3981232874721674e-8,0.004659873789227049,-1.3495310852038219E-05,1.430287645128278e-8,0.004660213024776066,-1.359808005239616e-5,1.4540151248134795e-8,0.00466060633304002,-1.3637992835869933e-5,1.4630579714044076e-8,0.00466102965981684,-1.3595349253137439e-5,1.4528372069494455e-8,0.004661450563042212,-1.3461902340691184e-5,1.421449651710166e-8,0.004661831730217652,-1.3245578696188559e-5,1.3707678548966238e-8,0.004662137755511344,-1.2973872164911173e-5,1.307227092715899e-8,0.004662344999202101,-1.2693012432152884e-5,1.2416231574338447e-8,0.0046624519407560735,-1.2460082818593682E-05,1.1872648439435237e-8,0.004662485004202495,-1.2327880026386206e-5,1.1564379854227212e-8,0.004662494901102442,-1.2327021407297365e-5,1.1562375295099926e-8,0.004662542595555069,-1.24533420275431e-5,1.185644126351985e-8,0.0046626799506357805,-1.2667322066857839e-5,1.2354101779958266e-8,0.004662933402383711,-1.2906251170550697e-5,1.2909087247827492e-8,0.004663297073919368,-1.3103506845817271e-5,1.3366273288023952e-8,0.004663736575308624,-1.3207064274389993e-5,1.360471420722314e-8,0.00466420034455511,-1.3191474217760806e-5,1.3565421464328888e-8,0.004664633821846689,-1.3061257113502004e-5,1.3259181775894936e-8,0.0046649923454657955,-1.284657142486857e-5,1.2756441236261749e-8,0.0046652500093320995,-1.2593575575264028e-5,1.2164869400910327e-8,0.004665403125135055,-1.2352518526780268e-5,1.160163133759852e-8,0.004665468293837048,-1.2166612359423423e-5,1.1167452954822372e-8,0.004665476372929213,-1.2064179756235221e-5,1.092829431744967e-8,0.004665464527011558,-1.205536188602705e-5,1.090765701107904e-8,0.00466546866248559,-1.2133139463074206e-5,1.1088976843000324e-8,0.004665517840456056,-1.2277264814901737e-5,1.1424838647350068e-8,0.00466563119751025,-1.245936221956031e-5,1.1848924275875613e-8,0.004665817006354218,-1.2647802841822536e-5,1.2287410809984839e-8,0.004666073053110041,-1.281166414378168e-5,1.2668190698852117e-8,0.004666387542373383,-1.292381306206243e-5,1.2928022906658796e-8,0.004666740117300406,-1.2963606556451226e-5,1.3018805625924864e-8,0.004667103089208761,-1.2919782368290056e-5,1.2914336858847914e-8,0.004667443516313451,-1.2793855787151033e-5,1.261828935995056e-8,0.004667727216102982,-1.2603634007130076e-5,1.2172443742013038e-8,0.004667925717887047,-1.2385223968453717e-5,1.1661335221281164e-8,0.004668025982969037,-1.2190587373047782e-5,1.1206425769168459e-8,0.004668040124918859,-1.2077562615726495e-5,1.0942668267392677e-8,0.004668009332740903,-1.2092131257680859e-5,1.0977046211594681e-8,0.004667995963365245,-1.2248776168792324e-5,1.1342816317376177e-8,0.004668063394253834,-1.2519839245074089e-5,1.1974895693262607e-8,0.004668252213447853,-1.2842352538933383e-5,1.272604191553377e-8,0.004668565476656956,-1.3140346753934688e-5,1.3419026252516424e-8,0.004668970137839872,-1.3350798188378615e-5,1.390712963685913e-8,0.00466941145688206,-1.3440881943664238e-5,1.4114239617360718e-8,0.004669831352637258,-1.3411820715628956e-5,1.4043647933471819e-8,0.004670183125758375,-1.3292231840828618e-5,1.3762398499525709e-8,0.004670439551567326,-1.3126587614643615e-5,1.3374333363953765e-8,0.0046705947835942166,-1.2963357965618242e-5,1.2992486691062576e-8,0.004670661871582767,-1.2845325839862214e-5,1.2716578643366719e-8,0.004670667699865216,-1.2802931475699457e-5,1.2617538625965364e-8,0.004670646681376949,-1.2850763728081769e-5,1.2729307862896565e-8,0.00467063427678483,-1.2987111806417097e-5,1.304775137827414e-8,0.004670661343090428,-1.3196164916613432e-5,1.353577457443399e-8,0.004670750064167247,-1.3452020070287972e-5,1.4132715042564545e-8,0.004670911777831962,-1.3723508501828329e-5,1.4765677409608379e-8,0.004671146597861861,-1.397894625705489e-5,1.5360669460035923e-8,0.004671444375319671,-1.4190158848444865e-5,1.5851986140975655e-8,0.004671786392194452,-1.4335593144657587e-5,1.6189419371909977e-8,0.004672147385320302,-1.440277455442945e-5,1.634395024210514e-8,0.004672497882915822,-1.439047323877524e-5,1.63128171558708e-8,0.004672807221955093,-1.4310754474099981e-5,1.6124358297051074e-8,0.004673047967062916,-1.4190585450886653e-5,1.5841798023873977e-8,0.004673202402940901,-1.4071681804180103e-5,1.556283414706472e-8,0.004673270739720579,-1.4006175424222032e-5,1.5409373309145138e-8,0.004673278417874302,-1.4045585886180635e-5,1.5501616287218707e-8,0.0046732771097705355,-1.4223112429589761e-5,1.5916656213600744e-8,0.0046733335426375954,-1.4535231411889031e-5,1.6645637433110732e-8,0.0046735060396706435,-1.4934337773744007e-5,1.7576826633511244e-8,0.004673819189801707,-1.5341741234222534e-5,1.852618723245616e-8,0.004674252268579398,-1.5677278964770178e-5,1.9306615085994873e-8,0.004674748944885229,-1.5888924620635015e-5,1.9797027686382072e-8,0.004675240882951573,-1.5966460031890974e-5,1.997414641383107e-8,0.004675670613593522,-1.593625842060622e-5,1.9900119679567408e-8,0.0046760041793818975,-1.5845643844857367e-5,1.9685820881802324e-8,0.00467623309851158,-1.5746690960885734e-5,1.945294625392006e-8,0.004676369818220206,-1.568457041001168e-5,1.930686205008403e-8,0.004676440772138309,-1.5691203227189234e-5,1.932191376955323e-8,0.004676479528732202,-1.5782987495501686e-5,1.9536206216259085e-8,0.004676520954653062,-1.5961033347667108e-5,1.995215400474037e-8,0.004676596422060922,-1.6212951573783454e-5,2.0540610281932875e-8,0.004676730027189161,-1.6515837372076925e-5,2.1247813816331533e-8,0.004676935979999788,-1.6840152095742693e-5,2.2004505046599017e-8,0.004677217318990602,-1.7154102391278926e-5,2.2736247570911134e-8,0.00467756602649892,-1.7428077777037665e-5,2.3373860561672378e-8,0.004677964479425937,-1.763863379374355e-5,2.3862716425329537e-8,0.0046783879238457065,-1.7771596392012232e-5,2.4169923607945506e-8,0.004678807583239352,-1.782417897198473e-5,2.4289203675387195e-8,0.004679194192743565,-1.780618647288843e-5,2.4243687912563586e-8,0.004679521978008149,-1.7740311713799754e-5,2.4086639550366526e-8,0.0046797732769125674,-1.7661270247751158e-5,2.3899445231071237e-8,0.004679943926326737,-1.7612934963310745e-5,2.378485408762777e-8,0.00468004874105327,-1.76419904879494e-5,2.38520116422879e-8,0.0046801248137174605,-1.7786845602176726e-5,2.4190427202702886e-8,0.004680228593309382,-1.806263404032576e-5,2.4834927068767032e-8,0.004680422650323219,-1.844760764224442e-5,2.5734020536887993e-8,0.0046807527992763975,-1.8880759513499523e-5,2.674458018490809e-8,0.0046812254701966765,-1.9278549072575866e-5,2.7671099756894892e-8,0.004681800427430815,-1.9566523632612258e-5,2.8339657629219468e-8,0.004682406079741662,-1.9708395147643984e-5,2.8665861411746463e-8,0.004682968366748158,-1.9715465849410977e-5,2.867679352392317e-8,0.004683435608529261,-1.9634266355882566e-5,2.8481924313167707e-8,0.0046837883337889595,-1.952439154406978e-5,2.822106187628867e-8,0.004684035487230924,-1.9439673756009193e-5,2.8020203083391307e-8,0.004684204485088165,-1.941806770279495e-5,2.7967929163297136e-8,0.00468433116167156,-1.9479029937500837e-5,2.8109428435669545e-8,0.004684452186456466,-1.9625176187452407e-5,2.845049597540157e-8,0.004684600168465979,-1.984553498761316e-5,2.896517248241957e-8,0.0046848006032723915,-2.0118998764571928e-5,2.9603786467988204e-8,0.0046850698397548065,-2.041773635670475e-5,3.0300926191513015e-8,0.004685413783371999,-2.0710763850050337e-5,3.098384943257845e-8,0.00468582740770953,-2.096777642395736e-5,3.1581541361914726e-8,0.004686295292293071,-2.1163165376747107e-5,3.203417446835051e-8,0.004686793459251504,-2.127986172954694e-5,3.230208207219933e-8,0.004687292561605285,-2.1312386356273433e-5,3.2372809600881676e-8,0.0046877621105637915,-2.126854613740853e-5,3.2264991110637834e-8,0.004688175258111988,-2.1169442043346494e-5,3.202831932504239e-8,0.004688513640797768,-2.104761290672734e-5,3.173919627450822e-8,0.004688771804655766,-2.0943260277204035e-5,3.149188772523059e-8,0.004688960704666771,-2.089847309766487e-5,3.138494951118754e-8,0.004689109427812848,-2.0949239557927876e-5,3.150244410680444e-8,0.0046892635417487075,-2.111546408427255e-5,3.189053130139887e-8,0.004689477922148566,-2.139077308886334e-5,3.253367882818093e-8,0.004689802698454854,-2.1736387602686895e-5,3.3340499356742825e-8,0.004690264446209853,-2.2085256460148676e-5,3.415361339714332e-8,0.004690850572478942,-2.2360461861946586e-5,3.4792836260214054e-8,0.004691507905376526,-2.2503277074614084e-5,3.512087981369812e-8,0.0046921603699025816,-2.2496547289027997e-5,3.5098078105129547e-8,0.004692737515622717,-2.2369205648309436e-5,3.4792895698371355e-8,0.0046931977430484575,-2.218033828194287e-5,3.434443116540985e-8,0.004693535450245421,-2.19946049648199e-5,3.390460552743203e-8,0.004693773572452373,-2.1862829343110403e-5,3.359254933534034e-8,0.0046939501630360635,-2.181362607661693e-5,3.3475032195887265e-8,0.004694106408800557,-2.1853986931876104e-5,3.356800326714713e-8,0.004694278929507639,-2.1974145041739544e-5,3.384814078091561e-8,0.004694495986966662,-2.2153135943492177e-5,3.4265942399950725e-8,0.00469477605708682,-2.236343686777121e-5,3.475658838964401e-8,0.004695127385027143,-2.25745849279392e-5,3.5248415385464474e-8,0.004695547882976639,-2.2756322352379375e-5,3.567032900021728e-8,0.004696025355911659,-2.2881787560675736e-5,3.595935203368904e-8,0.004696538399017729,-2.2930998865573962e-5,3.6068830865346576e-8,0.0046970585118214685,-2.2894428695522926e-5,3.597678695177047e-8,0.0046975538398428066,-2.277591695522771e-5,3.569266368776685e-8,0.004697994417085737,-2.2593897361128732e-5,3.52601055038316e-8,0.004698358163045725,-2.238005741037552e-5,3.475374675121492e-8,0.0046986364344812365,-2.2175013783692378e-5,3.4269031535764016e-8,0.0046988377483364,-2.2021316841364653e-5,3.3905777612987485e-8,0.004698988505350433,-2.1954843872662592E-05,3.3747957039559153e-8,0.00469913001615439,-2.199603289469974e-5,3.384312019587815e-8,0.004699311555481439,-2.2142626039551497e-5,3.418542095617081e-8,0.004699579681160445,-2.2366028659942287e-5,3.470720003209844e-8,0.004699965159038889,-2.261379023439517e-5,3.528496641002932e-8,0.0047004707613474824,-2.2820209470544427e-5,3.576439822294622e-8,0.004701065275270101,-2.29245915141501e-5,3.600321104272019e-8,0.0047016890656927665,-2.2891951736126434e-5,3.591970431021748e-8,0.004702272011748362,-2.2726666777386748e-5,3.5524736397453896e-8,0.004702756920507253,-2.2470877734699576e-5,3.491788013206634e-8,0.004703116987165939,-2.2187808782063738e-5,3.4248104068405246e-8,0.004703359534640568,-2.193925935774467e-5,3.3660754039070295e-8,0.004703517130520162,-2.176842696306175e-5,3.325714330433221e-8,0.004703633418269326,-2.1693450292192006e-5,3.3079469125848756e-8,0.004703750784664788,-2.1710014565138826e-5,3.311710181821752e-8,0.004703902999268972,-2.1798210735348334e-5,3.332284229703271e-8,0.00470411241473192,-2.1929606093883388e-5,3.362958798550564e-8,0.004704389870876045,-2.207267688476105e-5,3.396308166894864e-8,0.0047047356012256255,-2.2196523423997598e-5,3.425061394883235e-8,0.004705140226676658,-2.2273583221930157e-5,3.4427402906015455e-8,0.004705585684179088,-2.2282131344618075e-5,3.444250019797068e-8,0.004706046484988976,-2.2209080754436687e-5,3.426539393023329e-8,0.004706492021561705,-2.205305499960459e-5,3.389321201807501e-8,0.004706890608130669,-2.182697129221664e-5,3.3356730967267744e-8,0.00470721539646339,-2.1558758464267093e-5,3.2721977504560417e-8,0.004707451321018943,-2.12887104727388e-5,3.208392178194558e-8,0.004707601124258925,-2.1062650368795808e-5,3.1550339335174934e-8,0.004707687923092548,-2.092164673284272e-5,3.1217597646232705e-8,0.004707752373939844,-2.0890881213821516e-5,3.1144495257733445e-8,0.004707844271649323,-2.097124597532204e-5,3.1332583670419434e-8,0.004708010475613604,-2.113670162270532e-5,3.172008981581706e-8,0.004708282385389394,-2.1338748014371744e-5,3.219257613945702e-8,0.0047086664359290925,-2.15173693706775e-5,3.2608780636782456e-8,0.0047091404880734164,-2.161606952423453e-5,3.283599569519555e-8,0.004709657840613588,-2.159728736032355e-5,3.278626927707014e-8,0.0047101587972046815,-2.14536381865304e-5,3.244275536750323e-8,0.004710587092019814,-2.1210639927389882e-5,3.1866026733256766e-8,0.004710905784652387,-2.0918934500008726e-5,3.11756702803512e-8,0.004711106530119068,-2.0638435018091832e-5,3.051288304831013e-8,0.004711208865517889,-2.0420804081158147e-5,2.999917704131898e-8,0.004711250995690448,-2.029710843358638e-5,2.9707348003223693e-8,0.004711277151420492,-2.0274053881011356e-5,2.9652724627549498e-8,0.00471132674977426,-2.033766978305856e-5,2.9801983439850805e-8,0.00471142806619857,-2.046071242907155e-5,3.009067825446045e-8,0.004711596296366146,-2.061020016312087e-5,3.044100612335261e-8,0.004711834389857875,-2.0753171954947886e-5,3.077533281366249e-8,0.004712134965726818,-2.086041685204148e-5,3.1024925417154556e-8,0.004712482251510385,-2.090882235568343e-5,3.1135456149055995e-8,0.004712853737906606,-2.0883211847782863e-5,3.107133595210802e-8,0.004713221881139335,-2.0778334625325025e-5,3.082042383122008e-8,0.004713556597760101,-2.0601134262572815e-5,3.0399376917884984e-8,0.004713829354068818,-2.037263915355485e-5,2.9858068237885336e-8,0.004714019207495355,-2.0127999853239356e-5,2.9279591365504785e-8,0.004714120040236812,-1.9912737159773322e-5,2.8771311538676714e-8,0.00471414655809,-1.9773869991005393e-5,2.8443873226592142e-8,0.004714135386249772,-1.9746861801332327e-5,2.83804276963628e-8,0.004714138370032906,-1.984258160661189e-5,2.8606000254505665e-8,0.004714208596707071,-2.004036454826956e-5,2.9071316232283385e-8,0.004714383927031075,-2.029154199139544e-5,2.966130936884501e-8,0.00471467478824134,-2.0532945180363846e-5,3.022705867006223e-8,0.004715061013315357,-2.070513244011117e-5,3.0628741349271914e-8,0.00471549819391272,-2.076855953990602e-5,3.0773644450018024e-8,0.004715930398805945,-2.0712828599232458e-5,3.06378229761092e-8,0.00471630479798327,-2.0557372487725065e-5,3.02675794944921e-8,0.00471658419168978,-2.0344538606421003e-5,2.9763064924636998e-8,0.004716754587575241,-2.012762846230072e-5,2.9250034311585e-8,0.004716826391143379,-1.9957347775696705e-5,2.8847903519089865e-8,0.004716829482927148,-1.9870328926400146e-5,2.8642734974974278e-8,0.004716804183631088,-1.9882591570309303e-5,2.8671899620700577e-8,0.004716791192796836,-1.9989005281011388e-5,2.8922902741116466e-8,0.004716823437325514,-2.016770532199581e-5,2.934387756265717e-8,0.004716921469150951,-2.0387043502867066e-5,2.986002387931219e-8,0.0047170924226144694,-2.0612596164450385e-5,3.0390138793191444e-8,0.004717331446500595,-2.081266616228881e-5,3.085955828244744e-8,0.00471762425529221,-2.0961852660023846e-5,3.120852397033979e-8,0.004717949786709429,-2.104309008518074e-5,3.139695112234478e-8,0.004718282560551554,-2.104890203008696e-5,3.1407378398035346e-8,0.00471859492533725,-2.0982516486430054e-5,3.1247623321056654e-8,0.004718859796079545,-2.0859052414961204e-5,3.0953605446153896e-8,0.004719054624823485,-2.0706285041295662e-5,3.059112867970817e-8,0.004719167008269947,-2.0563643657749342e-5,3.025342322589191e-8,0.0047192012609654915,-2.0477478018717793e-5,3.00498426889888e-8,0.00471918345441392,-2.0491050133859172e-5,3.0082155472353386e-8,0.004719160711673773,-2.0630138351970563e-5,3.041060704503147e-8,0.004719191097019601,-2.0889406258420564e-5,3.1021931692673706e-8,0.004719325043469325,-2.1227769789697886e-5,3.181866698159706e-8,0.0047195859260143365,-2.1578468896618452e-5,3.264310559084911e-8,0.004719960156972756,-2.187111814865657e-5,3.3329373513019146e-8,0.004720402230039262,-2.2055137896671795e-5,3.375863627291979e-8,0.004720851199728154,-2.211368644516015e-5,3.3891818178741824e-8,0.004721249742534635,-2.2064084478755165e-5,3.3770422384395773e-8,0.004721558271420089,-2.194802371751545e-5,3.349326327499581e-8,0.004721761248337392,-2.181765833721016e-5,3.318355542341268e-8,0.004721866556401599,-2.1722520963282726e-5,3.295805030285286e-8,0.004721900238871268,-2.169987115382176e-5,3.29043510790176e-8,0.004721898892204645,-2.176929055241197e-5,3.306826983285239e-8,0.004721901529417458,-2.193141803818353e-5,3.345092527192641e-8,0.004721942348745987,-2.2170269412426117e-5,3.401426136456454e-8,0.004722045516212493,-2.2458138717909424e-5,3.4692640398515564e-8,0.004722222546618573,-2.2761699487966296e-5,3.540726851507083e-8,0.0047224722135377,-2.3047940802877143e-5,3.6080226653327896e-8,0.004722782394577666,-2.3288951948910685e-5,3.6645758612571877e-8,0.004723132980101565,-2.3465103100195668e-5,3.7057739558551584e-8,0.004723499026608934,-2.3566743782828097e-5,3.729363200615465e-8,0.004723853726366984,-2.3594919509001365e-5,3.7356145869933e-8,0.004724171226410891,-2.356158846622636e-5,3.727375668144662e-8,0.00472442964344223,-2.3489522051841577e-5,3.710048713221879e-8,0.004724614776565834,-2.3411574874169688e-5,3.691415587823861e-8,0.004724724794459883,-2.3368277341243487e-5,3.6810591870453345e-8,0.0047247752100325596,-2.340213360934399e-5,3.6890033197833116e-8,0.004724801818033701,-2.354741153860014e-5,3.723294414462482e-8,0.00472485768521177,-2.3816423663497148e-5,3.786770260091306e-8,0.004725000635390749,-2.418751526032683e-5,3.8742466858000376e-8,0.004725272431033011,-2.4603620051597823e-5,3.972202334985268e-8,0.0047256788219663705,-2.4987702204493527e-5,4.062439541897351e-8,0.004726183285667441,-2.5270759185625143e-5,4.128696584233639e-8,0.004726720126803429,-2.541754230471784e-5,4.162712542300643e-8,0.004727219448344189,-2.5435941739691993e-5,4.166429361538732e-8,0.004727629770664268,-2.536784151980682e-5,4.149811650246318e-8,0.00472792886355938,-2.5270329894455154e-5,4.126387077300937e-8,0.00472812265068321,-2.5197835046972124e-5,4.109015364379114e-8,0.0047282373150355555,-2.5190669974525258e-5,4.1071880240448236e-8,0.004728309665470908,-2.5270343003186838e-5,4.125937504726307e-8,0.004728378624615121,-2.543968430350618e-5,4.165883422548709e-8,0.004728478767596398,-2.5685707126707573e-5,4.223916565564198e-8,0.004728635885651726,-2.5983880913205705e-5,4.294209090323031e-8,0.004728864409439411,-2.6303109090072288e-5,4.369389967187808e-8,0.00472916659618418,-2.6610845597161917e-5,4.44175634064523e-8,0.004729533321857145,-2.687781278328495e-5,4.5043926732075706e-8,0.00472994622235607,-2.708187235910797e-5,4.55208730022123e-8,0.004730380793270376,-2.721067737099242e-5,4.5819553184842186e-8,0.004730809906752847,-2.7262961196945158e-5,4.593735403726144e-8,0.004731207297948036,-2.724866569169805e-5,4.589813042879811e-8,0.004731550882303068,-2.7188193463415645e-5,4.5750407942570875e-8,0.004731825972564864,-2.7110878798737e-5,4.5563763450471336e-8,0.004732028530653421,-2.7052515132200603e-5,4.54229491228676e-8,0.004732168446389242,-2.7051350258781955e-5,4.541834024160813e-8,0.004732272116670077,-2.714157631827611e-5,4.563044734216501e-8,0.004732382358303023,-2.734381236381859e-5,4.610740117539504e-8,0.004732552676207028,-2.765400554259749e-5,4.6838853150868065e-8,0.004732833512182073,-2.803550331529912e-5,4.773748847006038e-8,0.004733252285295634,-2.842190019560124e-5,4.864598097253564e-8,0.004733796293531172,-2.8735835655547945e-5,4.9381511830951945e-8,0.004734411109839088,-2.891853713979851e-5,4.980557132802008e-8,0.004735019503554785,-2.895397730306729e-5,4.9880998252676156e-8,0.004735551138537044,-2.887270533546891e-5,4.9680920882470014e-8,0.00473596575267552,-2.873482839748109e-5,4.9348284107208375e-8,0.004736259519104328,-2.8605104853960317e-5,4.903667122874668e-8,0.004736457060975534,-2.8533821667809858e-5,4.886493863585071e-8,0.0047365979415711565,-2.85485921602435e-5,4.88979128990018e-8,0.004736724583238949,-2.8654807118183317e-5,4.914769787656253e-8,0.0047368742116397,-2.8840382877356432e-5,4.958511728727826e-8,0.004737074552126241,-2.9081541619000465e-5,5.015347478913712e-8,0.004737342012367782,-2.934812648323624e-5,5.078111482310837e-8,0.004737681309886265,-2.960821833601568e-5,5.139231870366264e-8,0.004738086098954303,-2.9832193363411564e-5,5.191692419486976e-8,0.004738540469209245,-2.9996259595434974e-5,5.229874245767923e-8,0.0047390212881655396,-3.0085394338945098e-5,5.2502529913061444e-8,0.004739501377336211,-3.0095423581682325e-5,5.251886124976056e-8,0.004739953305782397,-3.0033870472254683e-5,5.236603682676017e-8,0.004740353348319325,-2.9919407976351642e-5,5.208868447062693e-8,0.004740685200385828,-2.9779991128983356e-5,5.175327771239827e-8,0.004740943182403257,-2.9649741613378564e-5,5.1440738209547884e-8,0.004741134674185391,-2.9564621576085497e-5,5.1236171222247815e-8,0.004741281429687509,-2.955689735080932e-5,5.121571324845782e-8,0.004741419089674041,-2.9648317114137292e-5,5.1430346955513816e-8,0.004741593583568248,-2.984236535396184e-5,5.18876132323745e-8,0.0047418528064249385,-3.0117417530783683e-5,5.2535574522677666e-8,0.004742232999460031,-3.0424697664623252e-5,5.325821214909581e-8,0.004742742611363063,-3.069609207813721e-5,5.3894094209571386e-8,0.004743351393757184,-3.086414788615748e-5,5.4283751424790724e-8,0.004743994368040548,-3.088836563852584e-5,5.433186801908802e-8,0.004744593460110826,-3.0773559410401626e-5,5.4050676811265004e-8,0.004745086788273111,-3.0567784478253706e-5,5.3554919237006306e-8,0.004745448989905369,-3.034083898991905e-5,5.301067418598428e-8,0.0047456930853903715,-3.015732469647893e-5,5.257126350003612e-8,0.004745857698513026,-3.00585998089884e-5,5.233439298931279e-8,0.004745990240669041,-3.0058200221043662e-5,5.233146185427817e-8,0.004746133999600095,-3.01466801907586e-5,5.2539325380684306e-8,0.004746321325199566,-3.0299826522431672e-5,5.289999214373297e-8,0.004746571565708012,-3.048628868783824e-5,5.333878061980279e-8,0.004746891547053987,-3.067323831866283e-5,5.377769034777425e-8,0.004747276976592629,-3.083031101807034e-5,5.414468688672485e-8,0.0047477141402886116,-3.09325591886319E-05,5.4380693556431183e-8,0.004748181886555148,-3.096289364885244e-5,5.444541244979396e-8,0.004748654088097438,-3.09141513535335e-5,5.432224087989675e-8,0.004749102826477359,-3.079058892868887e-5,5.4021765189798875e-8,0.0047495023578297945,-3.060826542501298e-5,5.358256772490767e-8,0.004749833466407175,-3.0393770407297746e-5,5.306810148158317e-8,0.0047500874842839194,-3.018108231591561e-5,5.2559163277776153e-8,0.004750269208928283,-3.000667785776047e-5,5.214226026089898e-8,0.004750398005292498,-2.990333609399654e-5,5.1894905169507964e-8,0.004750506508683392,-2.9893424852776115e-5,5.186969825178604e-8,0.004750636541043871,-2.9982645840082855e-5,5.2079533030619567e-8,0.0047508320083346,-3.0155421919572188e-5,5.248676449937229e-8,0.004751128908639331,-3.037369192805859e-5,5.300052553271625e-8,0.0047515437134295745,-3.058146946640733e-5,5.348771766126394e-8,0.004752063484848125,-3.071700733657849e-5,5.380196084787112e-8,0.0047526432287152715,-3.073156493559227e-5,5.382809002665862e-8,0.004753215530274019,-3.060859876345908e-5,5.352758456900073e-8,0.004753711939495655,-3.0373149193153703e-5,5.2960713748294996e-8,0.004754087100048578,-3.0083973403278307e-5,5.226769683183297e-8,0.00475433293603724,-2.98112136590755e-5,5.1615475629158006e-8,0.004754476264544549,-2.9611822552670604e-5,5.113920082596975e-8,0.004754563953700199,-2.9514823359041654e-5,5.0907249040929476e-8,0.0047546455613278705,-2.9520016886330627e-5,5.0918372072733805e-8,0.004754761071596459,-2.9605722627759065e-5,5.112036823852704e-8,0.004754935662167024,-2.9739033755819657e-5,5.143462572713782e-8,0.0047551796096890735,-2.988434036747737e-5,5.1776389895648226e-8,0.004755490589258526,-3.0008869624587908e-5,5.206783588245407e-8,0.004755856442393838,-3.008584029224015e-5,5.224546763974042e-8,0.004756257668350731,-3.0096339668500227e-5,5.2264540791731686e-8,0.004756669706745484,-3.0030731792701057e-5,5.210242554479061e-8,0.004757065414585785,-2.9889908539192638e-5,5.176159886049536e-8,0.004757418195542284,-2.968619040159789e-5,5.1271759843174285e-8,0.00475770601363651,-2.9443203318333868e-5,5.0689459342253564e-8,0.004757915965546911,-2.9193873541743718e-5,5.009323271378707e-8,0.004758048438176281,-2.8975983699953833e-5,4.957295059706262e-8,0.0047581194741599594,-2.882542250153593e-5,4.921372935448555e-8,0.004758160019778779,-2.876818870394926e-5,4.9076934374705044e-8,0.004758211358591651,-2.8813062505827567e-5,4.9182827912228046e-8,0.004758317093348088,-2.894711954955259e-5,4.950002836532726e-8,0.004758513086696229,-2.913579719092093e-5,4.994582695633771e-8,0.004758817511140333,-2.932837760191171e-5,5.03993731608605e-8,0.004759223605850981,-2.9468701036464705e-5,5.072723219425754e-8,0.004759697867909933,-2.9509504216527897e-5,5.0817464553032814e-8,0.004760185864983653,-2.942696235017769e-5,5.061410130962157e-8,0.0047606259543624555,-2.9230317643366145e-5,5.0139889000795495e-8,0.004760967607467908,-2.896139174117637e-5,4.9494965504536796e-8,0.004761187350905263,-2.8682116608214554e-5,4.882704196243258e-8,0.004761294966547717,-2.8454389880011927e-5,4.828336259201367e-8,0.004761327275387122,-2.8321230768383856e-5,4.796585845162461e-8,0.004761333553681048,-2.829714704173953e-5,4.790836114893017e-8,0.0047613601652829966,-2.8369688621673795e-5,4.808053312846534e-8,0.004761440321646852,-2.8508399895063426e-5,4.8409387338905586e-8,0.004761590551451071,-2.8675522491192136e-5,4.880485640357133e-8,0.004761812082991868,-2.883449707617644e-5,4.917998782520274e-8,0.004762094385548418,-2.8955069947828657e-5,4.946298307321452e-8,0.004762418882065095,-2.9015693696433737e-5,4.960280392062293e-8,0.0047627620311700624,-2.9004461174501594e-5,4.95713500331758e-8,0.004763097828331392,-2.8919547543918302e-5,4.936452599578333e-8,0.004763400221147088,-2.8769621484632385e-5,4.90032528762637e-8,0.004763646058855578,-2.8574085268911304e-5,4.8534040160042696e-8,0.004763818946533213,-2.8362398774863e-5,4.802731915464349e-8,0.004763913739565946,-2.8171404920085826e-5,4.757097276326134e-8,0.004763940543520972,-2.8039773963918373e-5,4.725700354486537e-8,0.004763926283878361,-2.7999613583819032e-5,4.7161505527736824e-8,0.004763911790083301,-2.806694015820014e-5,4.732201788368541e-8,0.004763943561668426,-2.8234348316907707e-5,4.772020956502153e-8,0.004764061768513518,-2.846950262937871e-5,4.827848357257109e-8,0.004764288248044224,-2.8721294087771193e-5,4.8874818169044365e-8,0.004764618840848933,-2.893247019251986e-5,4.93729414401414e-8,0.004765022978940383,-2.905493603698263e-5,4.965875709174304e-8,0.004765450868508584,-2.9062967578863874e-5,4.967170122917772e-8,0.004765846191254104,-2.8960399760946087e-5,4.942169071629253e-8,0.00476616076776282,-2.8779715550303997e-5,4.8986766544630736e-8,0.004766367084636814,-2.8573141543301774e-5,4.849172329484978e-8,0.004766464911858467,-2.839814847115955e-5,4.807347695622499e-8,0.00476647980983421,-2.8301831799976193e-5,4.784386143983262e-8,0.004766454199070231,-2.830937480805551e-5,4.7862255367856655e-8,0.004766434603844106,-2.8420157629011527e-5,4.8126495550133353e-8,0.004766459867818386,-2.861169104607286e-5,4.8582435764613466e-8,0.004766553900979995,-2.8848469249434867e-5,4.9145161379864336e-8,0.004766723895020026,-2.9091731049801776e-5,4.9722271610959204e-8,0.004766962652236033,-2.9307102792118214e-5,5.023203099217928e-8,0.004767252783211253,-2.946903329270971e-5,5.061383669831442e-8,0.004767570966247876,-2.956252059197733e-5,5.083224211036534e-8,0.00476789143265435,-2.9583263200849124e-5,5.0877272768619633e-8,0.004768188657904238,-2.9537233992896767e-5,5.076341708753041e-8,0.004768439713838026,-2.9440208044921784e-5,5.0528530531352904e-8,0.004768626910754468,-2.9317193423369705e-5,5.0232483468787865e-8,0.004768741178477299,-2.9201099070795987e-5,4.9953931538163455e-8,0.004768786027644776,-2.9129513499080413e-5,4.978252629146496e-8,0.004768780936853772,-2.9138496012208616e-5,4.980400285879896e-8,0.0047687618966803106,-2.9253256552848995e-5,5.007792821246455e-8,0.004768776430770757,-2.94777909524039e-5,5.0613091054872876e-8,0.004768871988096792,-2.9788111750287958e-5,5.13515752527904e-8,0.004769080444607102,-3.013432954967566e-5,5.2173957718739495e-8,0.004769405284770623,-3.0453486715106665e-5,5.293006343952431e-8,0.004769818220406904,-3.0688999004594416e-5,5.3485350267577706e-8,0.00477026743433048,-3.080834002271513e-5,5.376298803352503e-8,0.004770693577738604,-3.081168201237658e-5,5.3764285152528835e-8,0.004771046589895863,-3.072935915638893e-5,5.3562407814568835e-8,0.004771297631526678,-3.0610999818195513e-5,5.3276237909610404e-8,0.004771443711692161,-3.051122681918304e-5,5.303613422492912e-8,0.004771505396973143,-3.047631542556714e-5,5.295212013490912e-8,0.004771519499267242,-3.0534710642808274e-5,5.3091406911566415e-8,0.004771529205577235,-3.0692816320908944e-5,5.346855026149306e-8,0.00477157418650815,-3.0936189653487376e-5,5.404847750248202e-8,0.004771682921045021,-3.123511651048176e-5,5.4759893534474465e-8,0.004771868687189363,-3.1552574400663744e-5,5.551430977654335e-8,0.004772129449714966,-3.1852223337845775e-5,5.622508871487745e-8,0.004772450721118148,-3.210457768014518e-5,5.682212037646142e-8,0.0047728099065585915,-3.2290564110685556e-5,5.726024480323222e-8,0.004773180754965365,-3.240266257319448e-5,5.752190311025016e-8,0.004773537085899212,-3.244442374528547e-5,5.761592957241243e-8,0.004773855633711976,-3.242925814099788e-5,5.757463774878549e-8,0.004774118342142201,-3.237905496994603e-5,5.7450525834272396e-8,0.004774314614586185,-3.23226647010406e-5,5.731264700502641e-8,0.004774443914942631,-3.2293765111534964e-5,5.724146147285952e-8,0.004774518652136438,-3.232717786829844e-5,5.731994509929363e-8,0.0047745663374796085,-3.245259117379958e-5,5.761852250142311e-8,0.004774628801644312,-3.268548015279706e-5,5.817341730913397e-8,0.004774755642402249,-3.301726301171104e-5,5.896332753649877e-8,0.004774990554962329,-3.340982109567715e-5,5.989660608993938e-8,0.004775353818295921,-3.3800784181514464e-5,6.082409330155231e-8,0.004775829687604098,-3.412186477507274e-5,6.158296115132251e-8,0.004776367868533359,-3.4323594773016025e-5,6.205572173406188e-8,0.004776900497853547,-3.439347655809735e-5,6.22134491263007e-8,0.004777365818310518,-3.435798439395554e-5,6.21203712505869e-8,0.004777726423271264,-3.426947678704886e-5,6.190234646575702e-8,0.004777975587727213,-3.418704078505039e-5,6.170085067616404e-8,0.004778133031878161,-3.416016772550692e-5,6.163388088984261e-8,0.004778235183303571,-3.42193194337018e-5,6.177353927618648e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json new file mode 100644 index 0000000..2cb2765 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":27000,"numberOfSamples":426,"samples":[0.004778324486778677,-3.437325503603603e-5,6.213990841775234e-8,0.0047784403655323285,-3.4611193149972956e-5,6.270647293317436e-8,0.004778612794687001,-3.490776213298559e-5,6.34120907874662e-8,0.004778858592736182,-3.52292773450405e-5,6.41760174740733e-8,0.004779180332297561,-3.554033000747647e-5,6.491361305699471e-8,0.0047795676373042825,-3.580972313910667e-5,6.555048782196374e-8,0.004780000304382801,-3.601491695515349e-5,6.603309632804475e-8,0.00478045244087296,-3.61445559073166e-5,6.63347373647879e-8,0.004780896788498023,-3.619907152539314e-5,6.64569282050896e-8,0.004781308537182374,-3.6189716300693844e-5,6.642701476463283e-8,0.004781668287402928,-3.613665338138569e-5,6.62935418736394e-8,0.004781964263597514,-3.606664631235279e-5,6.612070094818705e-8,0.004782194088007322,-3.6010502207012165e-5,6.598220199376154e-8,0.004782366358377176,-3.600003307813221e-5,6.595397202033107e-8,0.004782501973157172,-3.6063967015481664e-5,6.610431957871602e-8,0.004782634428155468,-3.622211612037997e-5,6.647996630880908e-8,0.004782807312744113,-3.647777437681964e-5,6.708796154697767e-8,0.004783066725500625,-3.681018070253991e-5,6.787788985789277e-8,0.004783447527929692,-3.717158351927006e-5,6.873512189479286e-8,0.004783956543699519,-3.749495769285591e-5,6.949941757309266e-8,0.004784561694818515,-3.7714824470447004e-5,7.001467512930746e-8,0.00478519734376055,-3.779386901530488e-5,7.019245393058328e-8,0.004785787298279908,-3.773988586048272e-5,7.005238005891471e-8,0.004786273540716633,-3.760159745695435e-5,6.971198893123057e-8,0.004786634261718939,-3.7446681679021194e-5,6.93338948131939e-8,0.004786883955125812,-3.7336538281738074e-5,6.90651418882107e-8,0.004787060855944783,-3.731025026111713e-5,6.89987545085644e-8,0.004787211498019626,-3.738052485901743e-5,6.916423518663561e-8,0.004787378723491085,-3.753768633517913e-5,6.953747098677388e-8,0.004787594743852002,-3.775688736390837e-5,7.005827277528313e-8,0.004787878341866488,-3.8005421267547694e-5,7.064797754466723e-8,0.004788234677867704,-3.824887091042978e-5,7.122411974828502e-8,0.004788656578890198,-3.845602832364749e-5,7.171211724931977e-8,0.004789126866304347,-3.8602762874008655e-5,7.205447458736902e-8,0.004789621527438917,-3.867476505188969e-5,7.221733392634786e-8,0.004790113453092092,-3.866900598852055e-5,7.219394452663505e-8,0.004790576389242894,-3.859380569021363e-5,7.200475975629059e-8,0.004790988658217021,-3.846749668906106e-5,7.169414035802423e-8,0.004791336185455692,-3.831592746623132e-5,7.132428928460062e-8,0.004791614602286293,-3.8169236193829984e-5,7.096748066882624e-8,0.004791830442019499,-3.8058199395276177E-05,7.069730505809583e-8,0.00479200147328233,-3.8010251494226334e-5,7.057912997799612e-8,0.00479215608282581,-3.8045112493544786e-5,7.065962097547686e-8,0.004792331243570715,-3.816988109148568e-5,7.095502401154791e-8,0.00479256801539422,-3.837391090721481e-5,7.143902873254914e-8,0.004792903356231363,-3.8625101009650084e-5,7.203412021826269e-8,0.00479335809982377,-3.887092912081732e-5,7.261428947824125e-8,0.004793923998139211,-3.904832069801235e-5,7.302876037880577e-8,0.004794557121329183,-3.910366330394545e-5,7.314982344552248e-8,0.004795186187943556,-3.901641098772414e-5,7.292918982979318e-8,0.004795737032643518,-3.881216157437762e-5,7.242916797983955e-8,0.004796161501972789,-3.855411099464743e-5,7.180203477009054e-8,0.004796453566145229,-3.831658356890081e-5,7.122636889591443e-8,0.004796644767523727,-3.815714860499036e-5,7.084000022037542e-8,0.004796785949434881,-3.8101951194646106e-5,7.070485098911682e-8,0.004796928139441377,-3.8146598603855446e-5,7.080934608157665e-8,0.004797110480654036,-3.8265789851055167e-5,7.109188904690533e-8,0.004797355877127002,-3.8424311612934556e-5,7.146748579270787e-8,0.004797671612426517,-3.8585616852327366e-5,7.184835086333892e-8,0.004798052093481322,-3.8717282547673696e-5,7.215687639979793e-8,0.004798481982683185,-3.879416904832568e-5,7.233306811500727e-8,0.0047989392109531745,-3.880032466659669e-5,7.233903786826962e-8,0.004799398014519919,-3.873014716490181e-5,7.216177815700216e-8,0.004799832156249859,-3.858883316916818e-5,7.181423253686315e-8,0.004800218353251468,-3.839193072968296e-5,7.133417138730679e-8,0.004800539728226463,-3.816370201797726e-5,7.07801739212383e-8,0.004800788798428815,-3.7934150450836535e-5,7.022440790334248e-8,0.004800969422381577,-3.773493298607536e-5,6.97427737273164e-8,0.004801097307136082,-3.7594608437565975e-5,6.940350057998089e-8,0.004801198860837516,-3.753375575082618e-5,6.925545753494772e-8,0.004801308307002621,-3.7560557353341817e-5,6.931760143740602e-8,0.004801463061629263,-3.766739513003747e-5,6.957089748412672e-8,0.0048016973159992595,-3.7829085241195104e-5,6.995424232825527e-8,0.004802033897188718,-3.800393663211438e-5,7.036721161540528e-8,0.004802475381486049,-3.8139426649914707e-5,7.068384881196978e-8,0.004802997237534293,-3.8183940325160886e-5,7.078086051437349e-8,0.0048035477616877155,-3.810365748834886e-5,7.057799420498539e-8,0.004804059432364746,-3.789890582121566e-5,7.007704800926735e-8,0.004804471058177286,-3.76100617891968e-5,6.93758159734603e-8,0.004804751226949466,-3.730566920695092e-5,6.863938578566553e-8,0.0048049094711126545,-3.705654492532993e-5,6.803781398940207e-8,0.004804988697932718,-3.691017647857788e-5,6.768458911635844e-8,0.004805045208603211,-3.687881976068849e-5,6.760819207952647e-8,0.004805128912216125,-3.6943695478478026e-5,6.776250536534154e-8,0.004805272128763522,-3.706800766501402e-5,6.805842303113509e-8,0.0048054875443432725,-3.72102043926267e-5,6.839587172762585e-8,0.004805771578807736,-3.733305531184578e-5,6.868556225257375e-8,0.004806109373196501,-3.740819210339049e-5,6.885971585954908e-8,0.004806479267214914,-3.741763766075652e-5,6.887556737614801e-8,0.00480685624919262,-3.7353970688048305e-5,6.871568343569287e-8,0.00480721474503835,-3.722005965565962e-5,6.838732853486281e-8,0.004807531254878627,-3.70285788369557e-5,6.792132402469517e-8,0.004807787168840347,-3.680107359176237e-5,6.736978068548045e-8,0.0048079717908961535,-3.656606685754552e-5,6.680147748275388e-8,0.004808085124176199,-3.635572067784862e-5,6.629375291303479e-8,0.0048081395655390005,-3.6201003683608846e-5,6.59208353445968e-8,0.004808159619935799,-3.61259119702826e-5,6.573995300854134e-8,0.004808179052187587,-3.614182096799145e-5,6.577781399967254e-8,0.0048082354644977225,-3.624339663861216e-5,6.602088125342372e-8,0.004808363016906486,-3.640739698014146e-5,6.641263422122376e-8,0.004808584568140996,-3.659514206004428e-5,6.685967165663355e-8,0.004808904762436531,-3.6758854267688404e-5,6.724710168628325e-8,0.00480930579650223,-3.685155258136531e-5,6.746239580653564e-8,0.0048097478566896616,-3.683927126708737e-5,6.742470100953433e-8,0.004810176029910032,-3.6712847565078014e-5,6.711298772615927e-8,0.0048105340254307105,-3.649482817530326e-5,6.658239512536003e-8,0.004810781727205723,-3.62365842449442e-5,6.595705126594526e-8,0.004810909644980501,-3.6003671889103674e-5,6.539470778083783e-8,0.004810942478516832,-3.5853999525254e-5,6.503419712779448e-8,0.004810929054258762,-3.581891665158464e-5,6.495006857326439e-8,0.0048109239580987374,-3.589619723046781e-5,6.513597488805307e-8,0.0048109704482596355,-3.605632765339819e-5,6.552011162684835e-8,0.004811091479469972,-3.625616637154878e-5,6.599830095926331e-8,0.0048112894999106535,-3.645235261818129e-5,6.646628961790225e-8,0.004811551496979631,-3.661003899809157e-5,6.684062633294758e-8,0.004811855326073649,-3.6706519877171644e-5,6.706718834733222e-8,0.004812175008010524,-3.673147922115121e-5,6.71216166824625e-8,0.00481248442724685,-3.668578285980148e-5,6.70063528600365e-8,0.004812759857408077,-3.6580011791983614e-5,6.67471364140862e-8,0.004812982021847438,-3.643312892218514e-5,6.638984182107787e-8,0.004813138260380984,-3.627105788419161e-5,6.599705939990736e-8,0.004813224984539436,-3.612453739463318e-5,6.56428706687843e-8,0.004813250027706149,-3.6025539008764395e-5,6.540413556464342e-8,0.004813233901618618,-3.600194055235022e-5,6.53476083256435e-8,0.004813208641342787,-3.6070981482546236e-5,6.55141956879046e-8,0.004813213185891162,-3.623309956685937e-5,6.590422431888505e-8,0.0048132853329533815,-3.6468577247922494e-5,6.646953796652841e-8,0.00481345196089862,-3.6739232782648675e-5,6.711775543238068e-8,0.004813720524850067,-3.699585543676539e-5,6.773031548224511e-8,0.004814074915372328,-3.718990777229592e-5,6.819070851646075e-8,0.004814477519636433,-3.7286327454266165e-5,6.841524919716474e-8,0.004814877412507499,-3.727371265226798e-5,6.837744468682739e-8,0.004815222824200392,-3.71687674239285e-5,6.811846623591315e-8,0.004815474776181273,-3.70132472069625e-5,6.773954080785747e-8,0.0048156180606356,-3.686348225678969e-5,6.737652512252384e-8,0.004815665783668138,-3.677486127562191e-5,6.716247159200004e-8,0.004815655222405848,-3.678604759224073e-5,6.718971555136587e-8,0.004815636005506843,-3.690868613654817e-5,6.74853269118757e-8,0.004815655154643246,-3.712641741469069e-5,6.800902880734398e-8,0.0048157448657402905,-3.740272786418989e-5,6.86723392503097e-8,0.004815916982414414,-3.769330697538445e-5,6.936842915828944e-8,0.004816164398472773,-3.79575991566434e-5,6.999989097850887e-8,0.004816466732888395,-3.8166161444911164e-5,7.049630552378684e-8,0.004816796998892661,-3.830332545250297e-5,7.082047667647441e-8,0.004817127128752034,-3.8366574426466915e-5,7.096680517792435e-8,0.004817431716377734,-3.8364425072400815e-5,7.095614538559232e-8,0.00481769031494261,-3.831406952629976e-5,7.0830151666776e-8,0.004817889007363463,-3.823930287395324e-5,7.064632660863894e-8,0.004818021924002364,-3.81685964240486e-5,7.047337979987863e-8,0.004818092995005395,-3.8132677946559405e-5,7.038533637487357e-8,0.004818117609598462,-3.8160829347254704e-5,7.045252292139183e-8,0.0048181231757472446,-3.8275439457385075e-5,7.072838433001155e-8,0.004818147032808319,-3.848524220234855e-5,7.123323584537503e-8,0.004818230263552585,-3.877913888410908e-5,7.193954194116859e-8,0.004818407376247594,-3.9123929426344404e-5,7.276667979907158e-8,0.004818694517905241,-3.946919365675648e-5,7.359290131063591e-8,0.004819081226702352,-3.975987623674142e-5,7.428575222689352e-8,0.004819530473516512,-3.99528372131395e-5,7.474192447320143e-8,0.004819988207444505,-4.003071053802827e-5,7.492052207630327e-8,0.0048203989246250615,-4.000728896884301e-5,7.485582965376748e-8,0.004820721175466344,-3.99227597487728e-5,7.464556945092878e-8,0.004820937782280773,-3.9831445677784674e-5,7.442110541926777e-8,0.004821058434419171,-3.978679151255124e-5,7.431111753324506e-8,0.004821115078288102,-3.982808284365596e-5,7.44096350669423e-8,0.0048211522270188,-3.9972043873461636e-5,7.475600152324611e-8,0.004821215190839854,-4.021085655268812e-5,7.533039650683856e-8,0.004821339447086454,-4.051642323333889e-5,7.606436621672032e-8,0.004821543793180569,-4.084903826994292e-5,7.686186217830935e-8,0.004821828560137223,-4.11675330397259e-5,7.762370019061549e-8,0.00482217843219588,-4.143791773110746e-5,7.826830249781045e-8,0.004822568060222116,-4.163862375087511e-5,7.874420409142698e-8,0.004822968276370532,-4.176204785493435e-5,7.903364411314588e-8,0.0048233512962861805,-4.1813332547424874e-5,7.914952587908982e-8,0.004823694268337095,-4.180773689787612e-5,7.912902718095061e-8,0.004823981341733217,-4.176770959006623e-5,7.902653839294732e-8,0.004824204843306262,-4.172022434438517e-5,7.890725119874452e-8,0.004824366170721857,-4.169434217802275e-5,7.884127164436675e-8,0.0048244767088938545,-4.1718500655906905e-5,7.889702962949885e-8,0.004824558542278362,-4.1816828861910714e-5,7.9132317175072e-8,0.004824644046356498,-4.2004005130913916e-5,7.958186192139638e-8,0.004824772810595939,-4.227902970506275e-5,8.02424031086156e-8,0.004824984330163837,-4.261986981161869e-5,8.105999852427741e-8,0.0048253063789773926,-4.2982701249766916e-5,8.192845535537351e-8,0.004825742302472369,-4.330968240475467e-5,8.2708249557431e-8,0.004826263889668254,-4.354578668059347e-5,8.326714000557609e-8,0.004826816164327769,-4.365883275531775e-5,8.352838122738419e-8,0.004827334389224904,-4.3652515189787744e-5,8.350199407923697e-8,0.0048277656748831246,-4.356505406150206e-5,8.328128245698638e-8,0.00482808475136242,-4.3454640222978786e-5,8.300742298950006e-8,0.0048282979694060126,-4.337986978855226e-5,8.282198985286413e-8,0.004828436715004647,-4.3383781338829196e-5,8.28283556019412e-8,0.004828545452468338,-4.3485739353153795e-5,8.307227830943268e-8,0.004828669442671055,-4.368097256269977e-5,8.354112596095182e-8,0.004828845131978453,-4.394543747541324e-5,8.417594361299053e-8,0.004829094332003,-4.42434357404026e-5,8.489003053203357e-8,0.004829422222056958,-4.453594609792681e-5,8.558908046994333e-8,0.004829818689134246,-4.4788154520325726e-5,8.618928271603903e-8,0.004830262162433468,-4.497503014521456e-5,8.663067376891177e-8,0.004830724791376845,-4.508429236527066e-5,8.688419593273334e-8,0.004831177763389958,-4.5116784857431304e-5,8.695250414418422e-8,0.0048315958105310045,-4.50848066644472e-5,8.686584714086303e-8,0.004831960372320328,-4.50092207251216e-5,8.667501419792826e-8,0.004832261385448886,-4.4916181410082026e-5,8.644339426785272e-8,0.004832498085672877,-4.4834021165063305e-5,8.623945104183476e-8,0.004832679280731162,-4.479034989518507e-5,8.612971656792317e-8,0.004832823322580668,-4.480906858922817e-5,8.61715560370843e-8,0.004832957631610085,-4.490685000713927e-5,8.640463908636807e-8,0.0048331170643941285,-4.508874878499018e-5,8.684036295819687e-8,0.004833339822081472,-4.5343323574385394e-5,8.745021561454051e-8,0.004833659599911437,-4.5639123415037367e-5,8.815754137046817e-8,0.004834094074838598,-4.592604139982e-5,8.884105976880853e-8,0.004834633097564738,-4.6145321609871045e-5,8.935914049205118e-8,0.004835233759482804,-4.624855257649796e-5,8.959560230484134e-8,0.004835829415303181,-4.621862951064732e-5,8.951018080070509e-8,0.004836352230776127,-4.6080232054244594e-5,8.916366565204528e-8,0.0048367583349983355,-4.589150422661235e-5,8.869757625100208e-8,0.004837041591904654,-4.572106996194247e-5,8.827831621545146e-8,0.004837230223456968,-4.562385027524527e-5,8.803847379686291e-8,0.004837371762779652,-4.562714338453696e-5,8.804318221037112e-8,0.004837516153686477,-4.572936473719342e-5,8.828738354028514e-8,0.004837703559825233,-4.590705729913291e-5,8.871321255880796e-8,0.00483795842100459,-4.6124666861455577e-5,8.923395641208231e-8,0.0048382884248457615,-4.634354743735913e-5,8.975592732878355e-8,0.004838686449812278,-4.652885932931713e-5,9.019505444720963e-8,0.004839134059291325,-4.6654302346770156e-5,9.048817401084265e-8,0.00483960577414928,-4.670490119196287e-5,9.059963781515475e-8,0.004840073592346507,-4.6677962776577816e-5,9.052354945919353e-8,0.004840511260350432,-4.6582397345525144e-5,9.028205993460479e-8,0.004840897899231785,-4.643670396318439e-5,8.992042145949509e-8,0.004841220660300779,-4.626596989787898e-5,8.949965282921296e-8,0.004841476202205037,-4.6098371678003375e-5,8.908802385796573e-8,0.004841671077489782,-4.596168029442229e-5,8.875259106524241e-8,0.004841821307091204,-4.587997080031785e-5,8.855125453694367e-8,0.004841951292609372,-4.587045888723051e-5,8.852512147964674e-8,0.004842091964053706,-4.5940344193465115e-5,8.869088863412212e-8,0.004842277739297711,-4.6083631809650075e-5,8.903322182845005e-8,0.004842541493972926,-4.627838807084122e-5,8.949828371537751e-8,0.004842906839177331,-4.648600438823033e-5,8.999219477976895e-8,0.004843378264295116,-4.665522221668618e-5,9.039097681872455e-8,0.004843932381435793,-4.6733606371812626e-5,9.056834871587784e-8,0.004844516593310677,-4.6686017948423326e-5,9.044026966797496e-8,0.004845061297440305,-4.651301745333522e-5,9.000924058638993e-8,0.004845504427784852,-4.6256995746914114e-5,8.93789350952813e-8,0.004845816313409309,-4.598827316210438e-5,8.872033893206934e-8,0.004846009719910427,-4.5777184591241536e-5,8.820391758061302e-8,0.004846129972474116,-4.566860671556084e-5,8.793778061329034e-8,0.0048462338316596935,-4.567181248329228e-5,8.794324136066889e-8,0.004846370227429732,-4.576600567215227e-5,8.816863162886767e-8,0.0048465699861102345,-4.591338738919411e-5,8.852141023091782e-8,0.004846844129874208,-4.6071908146491065e-5,8.889930925992923e-8,0.004847187112262369,-4.6204138643279386e-5,8.921179902089594e-8,0.004847581703514996,-4.6282067896565305e-5,8.939150694429025e-8,0.004848003735402131,-4.6289076937789076e-5,8.939877769506586e-8,0.004848426256645651,-4.6220321509909585e-5,8.922246700657916e-8,0.004848823209408606,-4.608209856359733e-5,8.887836627853265e-8,0.004849172664527739,-4.58903562975773e-5,8.840557932192903e-8,0.0048494595475039315,-4.5668426291373705e-5,8.786099087737668e-8,0.0048496777143903665,-4.544400174802944e-5,8.731188333905859e-8,0.004849831083297237,-4.524549703219852e-5,8.682706510070045e-8,0.0048499335706496585,-4.5098191704872816e-5,8.646751496052212e-8,0.004850007839811998,-4.502058698290767e-5,8.627758023189437e-8,0.004850082971399407,-4.502123491055191e-5,8.627733894012528e-8,0.00485019108473835,-4.509627653317102e-5,8.645669590689583e-8,0.004850362866722029,-4.522799803925022e-5,8.677198648497969e-8,0.004850621906510939,-4.5384910987798636e-5,8.71463393443206e-8,0.004850977946640694,-4.552441540774088e-5,8.747633199424684e-8,0.00485142013660625,-4.5599608404899196e-5,8.764862963748815e-8,0.0048519131380055204,-4.557121093968653e-5,8.756886324253519e-8,0.004852400538216197,-4.5422915883702246e-5,8.719862480298039e-8,0.004852819081156075,-4.517383633579113e-5,8.658536065820687e-8,0.004853121273694221,-4.4878623615075926e-5,8.586240756352643e-8,0.004853295526580276,-4.461012521329985e-5,8.52067471895604e-8,0.004853370910340709,-4.443133874108983e-5,8.477085726904584e-8,0.004853402989489355,-4.437253239360528e-5,8.462723494908248e-8,0.004853450340338429,-4.442557395851914e-5,8.475489986913897e-8,0.004853555566747505,-4.4554520782041413e-5,8.506551757055743e-8,0.004853737798332979,-4.471246662007726e-5,8.54446544743408e-8,0.00485399486389547,-4.485554721718429e-5,8.57858896141624e-8,0.004854309864890948,-4.495075979662197e-5,8.600964247263456e-8,0.00485465803028982,-4.497849770452831e-5,8.6069040778254e-8,0.00485501203358417,-4.493206747983682e-5,8.594850455856457e-8,0.00485534568228858,-4.481608527441229e-5,8.565974574854902e-8,0.004855636618776108,-4.464461889212684e-5,8.523726941055656e-8,0.004855868536584048,-4.4439150233652795e-5,8.473347207406128e-8,0.0048560330722339125,-4.422617519806977e-5,8.421282174134603e-8,0.004856131296365982,-4.4034205116743515e-5,8.374453608584602e-8,0.004856174444895931,-4.389004599187381e-5,8.339349699528367e-8,0.004856183359155293,-4.381463425405478e-5,8.321012126246628e-8,0.004856186304500604,-4.381908244061987e-5,8.322079181766202e-8,0.0048562152009108475,-4.3901681750652377e-5,8.342065742125228e-8,0.004856300584346492,-4.4046572784289005e-5,8.37705159905011e-8,0.004856465867596215,-4.422466583704176e-5,8.419918887759595e-8,0.004856721671702306,-4.439714167069116e-5,8.46121777512187e-8,0.004857061176355107,-4.452169624559631e-5,8.490696041970339e-8,0.004857457829840346,-4.456149265628484e-5,8.499476400738042e-8,0.00485786732258919,-4.4495941699599566e-5,8.482662558070934e-8,0.0048582357611451545,-4.433064375541632e-5,8.44172762033907e-8,0.004858514335168011,-4.4101716857274364e-5,8.385533918607352e-8,0.004858676764439197,-4.386931833014717e-5,8.32873433067394e-8,0.004858731337204977,-4.369916734671689e-5,8.287271910808891e-8,0.004858719353578516,-4.363884359422422e-5,8.272626402178683e-8,0.004858699079100403,-4.370113971203409e-5,8.287790899006382e-8,0.004858723862983524,-4.3863152455982114e-5,8.32708541147057e-8,0.004858826040038608,-4.4079389942548624e-5,8.379377681762571e-8,0.00485901243298159,-4.429951477497208e-5,8.432416681478761e-8,0.004859269289883763,-4.448198863401187e-5,8.476146671893096e-8,0.004859570954995191,-4.460045524794661e-5,8.504236029963514e-8,0.004859887795941977,-4.464428204949593e-5,8.514179476144743e-8,0.004860191622124641,-4.461614115330714e-5,8.506688634502332e-8,0.004860458789785439,-4.452889224023546e-5,8.48492775788132e-8,0.004860671945597038,-4.440278682495274e-5,8.453839235720549e-8,0.004860821241729715,-4.426305156165498e-5,8.419563819915824e-8,0.004860905419245433,-4.4137473414217795e-5,8.388856225560573e-8,0.004860932724572903,-4.405349915154474e-5,8.368376120026044e-8,0.004860921196088654,-4.403452027360999e-5,8.363778704610134e-8,0.004860897562807879,-4.4095524083173727e-5,8.378654746993848e-8,0.004860894101884112,-4.4238943389541296e-5,8.413526183041853e-8,0.0048609433408634845,-4.4451997534014956e-5,8.465211854456047e-8,0.004861071294856948,-4.470688491827875e-5,8.526891053304732e-8,0.004861290736213975,-4.4964675805282034e-5,8.589067031036176e-8,0.004861596402411748,-4.518269904195639e-5,8.641375721967553e-8,0.00486196380325942,-4.5324110154403064e-5,8.674916232953769e-8,0.0048623525742310615,-4.536760086172835e-5,8.684603658726279e-8,0.004862714420798966,-4.531482706925229e-5,8.670954354944289e-8,0.004863004623796651,-4.519303097661249e-5,8.640693812132527e-8,0.004863194723425296,-4.505076964306804e-5,8.605688184505726e-8,0.0048632825102846704,-4.494612337857568e-5,8.58005774809639e-8,0.004863294732214557,-4.492967036023607e-5,8.576036145889535e-8,0.004863279646140609,-4.50281209417457e-5,8.600009804265731e-8,0.004863291238192513,-4.5235972657266385e-5,8.650521261792416e-8,0.004863371875000471,-4.5519265521149334e-5,8.719217023603693e-8,0.004863541092600532,-4.5828989880735264e-5,8.794132978880563e-8,0.0048637941431590335,-4.611699389480268e-5,8.863570335939151e-8,0.004864108348633099,-4.6347665140982225e-5,8.918925654220265e-8,0.00486445241548828,-4.650270904600831e-5,8.95582979767788e-8,0.0048647945683711405,-4.658026758675538e-5,8.973908538631549e-8,0.004865107760312099,-4.659122884457311e-5,8.975868058567857e-8,0.004865372216069882,-4.655509521210519e-5,8.966485595145175e-8,0.004865576369720018,-4.649651590121914e-5,8.95177115085765e-8,0.004865717179949249,-4.644257685804242e-5,8.938315205316097e-8,0.004865800395588709,-4.642041241650156e-5,8.932709842864613e-8,0.004865840829426269,-4.6454505120622764e-5,8.940887781848442e-8,0.004865862139653059,-4.656317873149144e-5,8.967262906616372e-8,0.00486589520436499,-4.675433988431925e-5,9.013692766243163e-8,0.00486597415698355,-4.7021367342236717e-5,9.07848659725663e-8,0.004866129742279287,-4.7340909048838094e-5,9.15588685419079e-8,0.004866380968437412,-4.7674714425056845e-5,9.236536298478788e-8,0.004866727661902241,-4.797676853483728e-5,9.309231162293983e-8,0.004867147324684734,-4.8204752728047944e-5,9.363717379329655e-8,0.004867598631309231,-4.833237436364809e-5,9.393686151571851e-8,0.00486803127888161,-4.835807099496604e-5,9.398874966956663e-8,0.004868399226752945,-4.8306738611208255e-5,9.385460419655338e-8,0.0048686730911499205,-4.8223736532853264e-5,9.364566598366033e-8,0.004868847969216985,-4.816304071077976e-5,9.349354754634237e-8,0.0048689445715649204,-4.817300077705271e-5,9.351546946352385e-8,0.004869003383995121,-4.8283613222312364e-5,9.378341924616291e-8,0.004869073380924081,-4.849890638879081e-5,9.43059380023238e-8,0.0048691985524858695,-4.8796843985408144e-5,9.50282614209952e-8,0.004869406558763143,-4.9136789945777165e-5,9.585077822881535e-8,0.0048697031730176215,-4.947169627205198e-5,9.665881714263925e-8,0.004870073718317038,-4.9760441298475204e-5,9.735263346838005e-8,0.004870489786100687,-4.9976304469416066e-5,9.786787764373727e-8,0.004870917867218918,-5.010990840288102e-5,9.818254906626896e-8,0.004871326805083185,-5.016747905294032e-5,9.831256717497081e-8,0.004871692531052498,-5.016661596207553e-5,9.830134495028733e-8,0.004872000142688164,-5.0131652452055496e-5,9.820844897666668e-8,0.004872244237261572,-5.008976155652556e-5,9.810014547881626e-8,0.004872428488982316,-5.0068019068499616e-5,9.804229692860984e-8,0.004872565118915182,-5.0091037618228904e-5,9.809461966944169e-8,0.0048726744092658725,-5.017854275436142e-5,9.830475483883204e-8,0.004872783856378547,-5.034234927557437e-5,9.870086948139556e-8,0.00487292606572329,-5.058265619676878e-5,9.928265588588883e-8,0.0048731343054660824,-5.0884445663438285e-5,1.0001269113882292e-7,0.004873435129492483,-5.1215919899950034e-5,1.0081284930929764e-7,0.0048738390660209,-5.153170034332811e-5,1.015723136253397e-7,0.004874332805219763,-5.178266204412348e-5,1.0217165527867006e-7,0.004874877889632444,-5.1930947916088274e-5,1.0251939608479708e-7,0.004875419222669628,-5.196437324983978e-5,1.0258697726965176e-7,0.004875901546822159,-5.190279042143044e-5,1.0242405238386324e-7,0.004876286929160504,-5.179247995187442e-5,1.0214451691172397e-7,0.004876565554442809,-5.1691121210262656e-5,1.0188954108256096e-7,0.004876756238178176,-5.165032541885692e-5,1.0178476106510073e-7,0.004876898311797196,-5.170234825273362e-5,1.0190790776405611e-7,0.004877039291090606,-5.185415619525043e-5,1.0227463542533915e-7,0.004877222603926023,-5.20886997024062e-5,1.0284205932149231e-7,0.004877478233490123,-5.237148471881915e-5,1.0352515418660084e-7,0.004877817707882309,-5.2659998699574115e-5,1.0421992098956346e-7,0.004878233764547773,-5.291357147653802e-5,1.0482740644614637e-7,0.004878704103850562,-5.310151400306657e-5,1.0527339067231532e-7,0.0048791978095219886,-5.3207947753445196e-5,1.0551996632875121e-7,0.004879682486508378,-5.323275948828798e-5,1.055676880907866e-7,0.0048801303140343175,-5.318929968967715e-5,1.0544982140066945e-7,0.004880521970866183,-5.3100190207577814e-5,1.0522202640813102e-7,0.004880848294653186,-5.299267897057388e-5,1.0495098947741473e-7,0.0048811102117961675,-5.289457264711433e-5,1.0470451475918726e-7,0.004881317747189281,-5.2831136722353006e-5,1.045440020638691e-7,0.004881488756100408,-5.282274765893747e-5,1.0451875219165502e-7,0.004881647595748994,-5.2882791831743e-5,1.0466084584560046e-7,0.004881823499265498,-5.301535663747745e-5,1.0497951455693293e-7,0.004882047968987757,-5.321257874700818e-5,1.0545473459947656e-7,0.004882350207115018,-5.34522364381064e-5,1.0603152097503244e-7,0.004882749931583773,-5.3697319596594616e-5,1.0661911602920183e-7,0.004883248411975124,-5.390029444311228e-5,1.0710159048430002e-7,0.004883821223283848,-5.40142565780382e-5,1.0736509452548331e-7,0.004884418535029374,-5.400964585550486e-5,1.07338516263783e-7,0.004884977331862179,-5.388945231346987e-5,1.0703038492932809e-7,0.004885442982784979,-5.369291520334631e-5,1.0653767571805211e-7,0.0048857896031786405,-5.348285896525935e-5,1.060146273029446e-7,0.004886027899428079,-5.33225701704739e-5,1.0561598542362421e-7,0.004886197488183362,-5.3254761974328e-5,1.0544546399226637e-7,0.004886350220054461,-5.329186339414478e-5,1.0553216327134056e-7,0.00488653376420074,-5.341832436145469e-5,1.058366269418165e-7,0.004886780973520583,-5.3599972431194304e-5,1.0627419538425782e-7,0.004887105836022719,-5.379505921217329e-5,1.0674231474866518e-7,0.00488750437159898,-5.3963749688183614e-5,1.071437647657893e-7,0.004887958428542934,-5.4074868096297026e-5,1.074029666188478e-7,0.004888440866556042,-5.410987220354813e-5,1.0747544257958971e-7,0.004888921197063378,-5.406429862465683e-5,1.0735113586693954e-7,0.004889370931079509,-5.3946902121682926e-5,1.0705217492870693e-7,0.004889767913025726,-5.377692855867965e-5,1.0662613496775146e-7,0.004890099148351,-5.3580229669963764e-5,1.0613649899040003e-7,0.0048903619623596834,-5.3384985707783635e-5,1.0565218481282615e-7,0.004890563646224889,-5.321774155887791e-5,1.0523787065252472e-7,0.004890720050330306,-5.310023848256073e-5,1.0494629332969267e-7,0.00489085365033552,-5.304708763981897e-5,1.0481260896297154e-7,0.004890991351657461,-5.306401912048959e-5,1.0485014474108545e-7]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json new file mode 100644 index 0000000..9767b1b --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":3000,"numberOfSamples":1000,"samples":[-0.0016674126654346861,-5.729007527752374e-7,-1.4186514962201376e-8,-0.0016673064653587321,-6.734015165127343e-7,-1.4270276706700349e-8,-0.0016671184978181936,-7.942288639572809e-7,-1.4371055120518062e-8,-0.0016668581653082658,-8.937549802808163e-7,-1.4454094104781238e-8,-0.0016665462863460693,-9.416288807763305e-7,-1.4494058993362982e-8,-0.0016662092022260732,-9.201664606449159e-7,-1.4476216298494372e-8,-0.0016658745541862263,-8.237755484396502e-7,-1.4395945891238539e-8,-0.0016655683268689287,-6.578186550518726e-7,-1.4257765362438796e-8,-0.0016653124526036561,-4.3741842925891825e-7,-1.4074304544820363e-8,-0.0016651224530400707,-1.8607276082775895e-7,-1.3865132894139859e-8,-0.0016650049642489826,6.643303169026634e-8,-1.3655018765663274e-8,-0.0016649554928538104,2.8739437967418395e-7,-1.347113935991257e-8,-0.0016649572160637774,4.4604795424859426e-7,-1.3339056817593825e-8,-0.0016649817855313575,5.194876808583452e-7,-1.3277813795917761e-8,-0.0016649928181043465,4.985157505581373e-7,-1.329507262967021e-8,-0.00166495207648607,3.9179414860133283e-7,-1.3383654246342673e-8,-0.0016648274069321705,2.26664827416035e-7,-1.352084347660865e-8,-0.001664600739494372,4.5708357821865315e-8,-1.367124421905444e-8,-0.001664274219706894,-1.0088239670451744e-7,-1.3793127784445051e-8,-0.0016638726869829803,-1.6616023108150796e-7,-1.3847473701249546e-8,-0.0016634410124484337,-1.1869904209770958e-7,-1.3808176255662588e-8,-0.0016630354517974334,4.659577780072841e-8,-1.3671009811639623e-8,-0.001662709627560605,3.030262655914423e-7,-1.3458136463059741e-8,-0.0016624982880314673,5.958730436677693e-7,-1.3214963229037875e-8,-0.001662404794976831,8.568537842964569e-7,-1.2998163907749735e-8,-0.0016623988702162175,1.0254972177202318e-6,-1.2857973826241794e-8,-0.0016624271346917532,1.0685455003698803e-6,-1.2822084766277138e-8,-0.0016624319248438782,9.883600460942418e-7,-1.2888614390257493e-8,-0.001662369242835807,8.174787260993229e-7,-1.3030565315055226e-8,-0.0016622183938909184,6.041843871353809e-7,-1.3207794337616674e-8,-0.0016619818565370786,3.9717316279278375e-7,-1.3379782718210806e-8,-0.0016616789185444716,2.3502260822879676e-7,-1.3514435597222689e-8,-0.0016613377123989804,1.417265131744283e-7,-1.3591822041815075e-8,-0.0016609886089808544,1.2662367606576446e-7,-1.360423147824086e-8,-0.0016606598282278315,1.863922842656112e-7,-1.3554490273298172e-8,-0.0016603748199426104,3.0744517886406376e-7,-1.3453938412913645e-8,-0.0016601505255394024,4.680421085231016e-7,-1.3320649411749458e-8,-0.0016599957713533597,6.402384067973255e-7,-1.3177803860265977e-8,-0.0016599094977454972,7.922656339357963e-7,-1.3051723165875262e-8,-0.0016598791098382528,8.920717595398815e-7,-1.296895475612751e-8,-0.0016598798337515695,9.124839151887528e-7,-1.2952012505708826e-8,-0.001659876379622952,8.376861160842476e-7,-1.3014014454721298e-8,-0.0016598280484381447,6.695105801256583e-7,-1.3153456420237919e-8,-0.0016596973256014155,4.309782162426044e-7,-1.3351256087288848e-8,-0.001659460185844518,1.644717783767708e-7,-1.3572258355341262e-8,-0.0016591147270322442,-7.656124715275952e-8,-1.3772130406953462e-8,-0.0016586845140589572,-2.408327142852044e-7,-1.3908356700286018e-8,-0.0016582146152118225,-2.934361433791715e-7,-1.3952042824758485e-8,-0.0016577609941446497,-2.2641155822799227e-7,-1.3896646268225657e-8,-0.0016573762399432718,-6.21980795145008e-8,-1.3760786009222337e-8,-0.0016570956693766155,1.5125835864904947e-7,-1.3584155440668849e-8,-0.0016569277304044742,3.526938844470182e-7,-1.3417439166449944e-8,-0.0016568517179810498,4.838995413033776e-7,-1.3308801583491872e-8,-0.0016568239567060939,5.055051370474298e-7,-1.329085416886814e-8,-0.0016567907846579653,4.069873023778711e-7,-1.3372361772156796e-8,-0.0016567038867919353,2.0748592272561992e-7,-1.3537525963856996e-8,-0.001656532487673912,-5.231661404744325e-8,-1.375267653077842e-8,-0.0016562685745488837,-3.2332365832738283e-7,-1.3977143471321514e-8,-0.0016559247754694372,-5.607837026808751e-7,-1.4173848477561865e-8,-0.0016555275418913935,-7.327632792039998e-7,-1.4316343411791168e-8,-0.0016551092006448183,-8.233258722118555e-7,-1.4391445802169112e-8,-0.0016547013993568505,-8.316848376668471e-7,-1.439852456672699e-8,-0.0016543308264849162,-7.693391900307951e-7,-1.4347111821174578e-8,-0.0016540168884855639,-6.568154472154755e-7,-1.4254194224863743e-8,-0.00165377050241833,-5.208100635030763e-7,-1.4141844859881727e-8,-0.001653593196269087,-3.917048152325665e-7,-1.4035172614624135e-8,-0.001653476129350162,-3.0088888763530243e-7,-1.3960118899539777e-8,-0.0016533992421155022,-2.7714172882948965e-7,-1.3940479436687606e-8,-0.0016533313967630901,-3.4151069511884616e-7,-1.3993675666328718e-8,-0.001653232946576946,-5.008677652271779e-7,-1.4125420729844042e-8,-0.001653062183142646,-7.418000865678651e-7,-1.4324648124704472e-8,-0.0016527858361718897,-1.0281008249946432e-6,-1.456142157572885e-8,-0.0016523911376223348,-1.305464686483764e-6,-1.4790826634502255e-8,-0.0016518942603108112,-1.5146795210217696e-6,-1.4963914427081036e-8,-0.001651339688429203,-1.609920243457309e-6,-1.5042853245080335e-8,-0.0016507887609035258,-1.5746267527137686e-6,-1.501402985970417e-8,-0.0016503014049699613,-1.4275884845194972e-6,-1.4893009020259092e-8,-0.0016499186673924447,-1.2167625516751627e-6,-1.4719368976416159e-8,-0.0016496525262988243,-1.0042695210536724e-6,-1.4544312694847968e-8,-0.0016494852722868205,-8.488903215522008e-7,-1.4416272286595473e-8,-0.0016493768933366411,-7.916520763817829e-7,-1.4369068693422452e-8,-0.0016492770441696662,-8.477319335831267e-7,-1.441525088113211e-8,-0.0016491379089976894,-1.005586142802875e-6,-1.454535921366001e-8,-0.0016489247906258263,-1.2324077723442385e-6,-1.4732398295614608e-8,-0.0016486222435663186,-1.483745124523919e-6,-1.4939753931208416e-8,-0.0016482349077829455,-1.714387062746813e-6,-1.5130169934377415e-8,-0.0016477837047942081,-1.8876251196414704e-6,-1.5273388453025773e-8,-0.0016472992687706423,-1.9809318567924716e-6,-1.53508288088995e-8,-0.0016468148667739665,-1.987610693939075e-6,-1.5356941194346824e-8,-0.0016463605427636564,-1.915263460295526e-6,-1.529794271457019e-8,-0.0016459592556230336,-1.7824940981911972e-6,-1.5189110139549575e-8,-0.0016456248820582223,-1.6151699815473968e-6,-1.5051713360546717e-8,-0.0016453614347904178,-1.4430148462818047e-6,-1.4910218742385646e-8,-0.0016451628120618224,-1.2966201405178637e-6,-1.4789829372760213e-8,-0.0016450127057533186,-1.2044728826030512e-6,-1.4714032583746818e-8,-0.0016448847709624051,-1.1893868953393184e-6,-1.4701653351213367e-8,-0.0016447437874436506,-1.2638103881750775e-6,-1.4762980827432679e-8,-0.0016445491773054968,-1.4241708565546202e-6,-1.48951005064794e-8,-0.0016442623193067107,-1.645902905672155e-6,-1.5077791633897704e-8,-0.0016438578535539828,-1.8825890625995552e-6,-1.5272828105373147e-8,-0.0016433361724119703,-2.073293524915233e-6,-1.5430051194420875e-8,-0.0016427306855190664,-2.1595591992381907e-6,-1.5501400836018825e-8,-0.0016421028587470339,-2.107131410238427e-6,-1.545878784662949e-8,-0.0016415236596336047,-1.921503495197351e-6,-1.5306805835881395e-8,-0.0016410491716874508,-1.6475995048951014e-6,-1.508237666232406e-8,-0.0016407026930217476,-1.3532595827599134e-6,-1.4841150585489634e-8,-0.0016404710798181709,-1.1058220927750292e-6,-1.4638324030823384e-8,-0.0016403140434198668,-9.529880693486804e-7,-1.4513000663883932e-8,-0.0016401794241349037,-9.138189075949228e-7,-1.4480834585139251e-8,-0.001640017698453548,-9.79444485492997e-7,-1.4534599598191043e-8,-0.0016397921504842823,-1.1199629554508742e-6,-1.46498259445195e-8,-0.001639483962540219,-1.2938873374757163e-6,-1.4792536911725107e-8,-0.0016390929025693608,-1.4576102121358978e-6,-1.492701055511908e-8,-0.0016386346780947172,-1.5734220969873702e-6,-1.5022352898574618e-8,-0.0016381360741017184,-1.615194314249089e-6,-1.50571474431728e-8,-0.0016376290513289884,-1.5712506992188948e-6,-1.502179647791281e-8,-0.0016371449438908516,-1.4444928408342774e-6,-1.4918620999811586e-8,-0.0016367096648583616,-1.25031555175269e-6,-1.4760165902237422e-8,-0.0016363404739891797,-1.0131188796195411e-6,-1.4566365366279228e-8,-0.0016360443826047542,-7.623240043753878e-7,-1.4361298196704363e-8,-0.0016358178081207191,-5.285826195157557e-7,-1.4170084868955413e-8,-0.0016356469788772767,-3.4036970890659786e-7,-1.4016082203265821e-8,-0.001635508814606122,-2.207663722595964e-7,-1.3918227118982464e-8,-0.0016353723164385856,-1.840892669518823e-7,-1.3888261221685396e-8,-0.0016352009622329746,-2.3204470491520787e-7,-1.3927578205263703e-8,-0.0016349571713373055,-3.4963943026521634e-7,-1.4023883873503605e-8,-0.0016346099310555375,-5.023932688054426e-7,-1.4148931817790818e-8,-0.0016341454885156152,-6.3792299560969e-7,-1.4259849140121573e-8,-0.0016335782650784292,-6.955174267981529e-7,-1.4307009536395608e-8,-0.0016329555381133835,-6.248455078933967e-7,-1.4249353069369657e-8,-0.001632348566823429,-4.0811994916454653e-7,-1.4072462495238987e-8,-0.0016318292392897165,-7.307325909948915e-8,-1.3799065103672127e-8,-0.0016314426223732346,3.1411804635436726e-7,-1.348317422928833e-8,-0.0016311911484804568,6.740899862647185e-7,-1.3189486706427881e-8,-0.0016310385568320672,9.431757478148973e-7,-1.2969887537649966e-8,-0.0016309281956906096,1.0909595365989285e-6,-1.284917620325891e-8,-0.0016308035869936743,1.1218851358131656e-6,-1.2823744428951683e-8,-0.001630622539391083,1.0659851233981184e-6,-1.286910999649688e-8,-0.0016303628898681499,9.662126791094569e-7,-1.2950244535657924e-8,-0.0016300220532569065,8.673019924964457e-7,-1.303067628890683e-8,-0.0016296132995635643,8.078877149326865e-7,-1.3078931636879651e-8,-0.001629160810966706,8.157006448712503e-7,-1.3072446478192921e-8,-0.0016286945140845575,9.051596921306019e-7,-1.2999506114425888e-8,-0.001628245126395128,1.0769022975441644e-6,-1.285960415768863e-8,-0.0016278397306271277,1.3189544201936767e-6,-1.266248230864526e-8,-0.001627498165347806,1.6092434451098838e-6,-1.2426094284497363e-8,-0.0016272305284777825,1.919140067868813e-6,-1.2173739988352222e-8,-0.0016270360259148394,2.2175661941671596e-6,-1.1930728972988056e-8,-0.0016269031154630333,2.475096567993343e-6,-1.1721030329836182e-8,-0.0016268106690123906,2.6677037698851066e-6,-1.1564201830643506e-8,-0.0016267299509751117,2.7800877693262435e-6,-1.1472661493037969e-8,-0.0016266273869119789,2.808609891480967e-6,-1.1449301618478332e-8,-0.0016264683188791577,2.7638226285538478e-6,-1.148545475645509e-8,-0.001626222281076474,2.6722456015579204e-6,-1.1559486532781036e-8,-0.0016258702666007566,2.576093825543154e-6,-1.1637054006801947e-8,-0.001625413368763386,2.528652681956703e-6,-1.1674892793466553e-8,-0.0016248800163113045,2.5829769218688514e-6,-1.163000825805575e-8,-0.0016243264182511817,2.7739410660516134e-6,-1.147422855629942e-8,-0.001623824448257784,3.0994362029174313e-6,-1.1209399713251122e-8,-0.0016234371005962335,3.5125193005639037e-6,-1.0873674286989874e-8,-0.0016231924460283597,3.934280626806754e-6,-1.0531046713794774e-8,-0.0016230722116879442,4.2839261521980505e-6,-1.0247004462157263e-8,-0.0016230223920017024,4.509022315061528e-6,-1.0064052989792204e-8,-0.001622977701628644,4.599308318664541e-6,-9.990503166746648e-9,-0.0016228844735368534,4.580979504172208e-6,-1.0005062897292258e-8,-0.0016227124043607017,4.500425340947215e-6,-1.007001881606373e-8,-0.0016224552660553113,4.4079367639713336E-06,-1.0144494972609784e-8,-0.001622125516269599,4.346659224530802e-6,-1.0193467505461069e-8,-0.001621747326018003,4.347159211571133e-6,-1.0192193851439426e-8,-0.001621350394160166,4.425844840376646e-6,-1.0127472727933714e-8,-0.0016209651093993971,4.585398795260131e-6,-9.99724721593909e-9,-0.001620618755614523,4.816205832030953e-6,-9.809405621898151e-9,-0.0016203324293711152,5.0984795936064065e-6,-9.580037457445881e-9,-0.0016201185778446112,5.4050620808012625e-6,-9.331168050521922e-9,-0.0016199792751218015,5.7049341968223675e-6,-9.087925536625024e-9,-0.0016199055449921847,5.967355112173079e-6,-8.875191668941198e-9,-0.0016198780222882233,6.166231880713312e-6,-8.714053321567563e-9,-0.0016198689897785872,6.284171358720325e-6,-8.618507598772804e-9,-0.0016198456428020592,6.315766071306402e-6,-8.59280112903386e-9,-0.001619774385405621,6.26973000154361e-6,-8.629727496350617e-9,-0.0016196259296935819,6.169525357590731e-6,-8.710169915500509e-9,-0.0016193810015156772,6.052090182629365e-6,-8.804188184311565e-9,-0.0016190363271137104,5.963922429773775e-6,-8.87422587160706e-9,-0.0016186098081281857,5.953407381087274e-6,-8.88131796854117e-9,-0.0016181424573248472,6.058817784323751e-6,-8.794748910421731e-9,-0.0016176935536342239,6.293589642068541e-6,-8.60386918296675e-9,-0.001617326219104022,6.634329004002173e-6,-8.327694536227654e-9,-0.0016170853930605306,7.020289243504353e-6,-8.015286175478002e-9,-0.0016169778930223832,7.370415677596483e-6,-7.732028934152944e-9,-0.0016169675000937544,7.6131522800298654E-06,-7.535643904942126e-9,-0.0016169901136538418,7.713155380487486e-6,-7.454642010804234e-9,-0.0016169800837689205,7.679978347262525e-6,-7.481256003272846e-9,-0.0016168922572558102,7.556948303108508e-6,-7.580374851378752e-9,-0.0016167104555515727,7.400752728903742e-6,-7.706059646917471e-9,-0.0016164437683271215,7.26360821746386e-6,-7.816027752541982e-9,-0.0016161173530747812,7.183346466944154e-6,-7.879724076888564e-9,-0.0016157633104902577,7.180632707092512e-6,-7.880570755501255e-9,-0.0016154140207041772,7.260286490250837e-6,-7.814851788477083e-9,-0.001615098001463881,7.414069548772224e-6,-7.689396067402687e-9,-0.001614837378113596,7.623584166153096e-6,-7.519187049980965e-9,-0.0016146461104334338,7.863038966555796e-6,-7.325110558075486e-9,-0.0016145285922477045,8.102151822196889e-6,-7.13161729702838e-9,-0.0016144786655525626,8.30954750461279e-6,-6.963995681741373e-9,-0.0016144794389958994,8.456851025280304e-6,-6.8450772368244266e-9,-0.0016145044863076245,8.523247037034214e-6,-6.791555454796449e-9,-0.0016145208238440725,8.499790759989043e-6,-6.810504300559879e-9,-0.0016144936330299336,8.392510891781708e-6,-6.896885929710203e-9,-0.001614392228170857,8.223343280763281e-6,-7.032834909617165e-9,-0.0016141963521061268,8.028183732838383e-6,-7.189288356946133e-9,-0.0016139016436967962,7.851860839942969e-6,-7.330101133146092e-9,-0.0016135231106711163,7.740313336524296e-6,-7.4183830864822594e-9,-0.0016130954016894184,7.730606125699386e-6,-7.424519615650904e-9,-0.0016126685428214326,7.840105042654435e-6,-7.334806831697677e-9,-0.0016122981087462733,8.057474208610399e-6,-7.1585873366644e-9,-0.0016120303080747725,8.339676729142519e-6,-6.930579850289531e-9,-0.001611885615787256,8.619402313112867e-6,-6.704899178695777e-9,-0.0016118481928508355,8.824139607217275e-6,-6.539785116730204e-9,-0.001611868604140801,8.90107812285037e-6,-6.477642765675682e-9,-0.001611881154272387,8.835912981377337e-6,-6.529915716142489e-9,-0.0016118277460059921,8.655388821984905e-6,-6.674986610903632e-9,-0.001611675919713035,8.41338736769802e-6,-6.869352972909047e-9,-0.0016114237381993468,8.169993921702883e-6,-7.06452679210035e-9,-0.001611093177231819,7.974354515474472e-6,-7.220908293079042e-9,-0.0016107187721478148,7.856385780125358e-6,-7.3144902295771e-9,-0.0016103373933631776,7.826230747315016e-6,-7.33726541883732e-9,-0.0016099815773490676,7.877830737849756e-6,-7.294288237410739e-9,-0.0016096761674665666,7.993507370107692e-6,-7.199928950656389e-9,-0.0016094369744081014,8.147984768505116e-6,-7.074608444117655e-9,-0.0016092702451640983,8.311598200694667e-6,-6.942216930039938e-9,-0.00160917228355665,8.453152537768642e-6,-6.827830668858108e-9,-0.001609129179254943,8.543077992903146e-6,-6.755189047281374e-9,-0.0016091171262881026,8.557333011262786e-6,-6.743558851885236e-9,-0.0016091041391435737,8.481979668330493e-6,-6.804049103358642e-9,-0.0016090539129368906,8.317618601666572e-6,-6.9360391917084e-9,-0.0016089320065604345,8.082194724983374e-6,-7.1249350615802805e-9,-0.0016087135318696238,7.810443188597418e-6,-7.342654995567478e-9,-0.0016083904469439763,7.548814847622212e-6,-7.551773316743061e-9,-0.0016079759933311404,7.346151109873746e-6,-7.71307892483668e-9,-0.0016075042761180575,7.242056143792723e-6,-7.794939036152872e-9,-0.00160702430711951,7.255973870729432e-6,-7.782022387653911e-9,-0.0016065893832426634,7.380066935880531e-6,-7.680904798184895e-9,-0.0016062439692449664,7.578337494266571e-6,-7.520654677956422e-9,-0.0016060111996290365,7.793284040925081e-6,-7.347429731587253e-9,-0.001605884722251656,7.959699219668078e-6,-7.2134347447406345e-9,-0.0016058284903456366,8.02276170190471e-6,-7.162490523129645e-9,-0.001605786300256652,7.954794950983538e-6,-7.216659725347376e-9,-0.0016056989183379042,7.763856680531235e-6,-7.3693711382787e-9,-0.0016055223349501092,7.489910937153623e-6,-7.5884774454684e-9,-0.0016052394922760655,7.190282869697641e-6,-7.827929734487749e-9,-0.0016048613732839356,6.9214213509586415e-6,-8.042440056461898e-9,-0.0016044191014809085,6.724717813606781e-6,-8.19887721405118e-9,-0.0016039523942876091,6.620315668122966e-6,-8.281210552001504e-9,-0.0016034994404368291,6.608103489245576e-6,-8.289661775609236e-9,-0.00160309058100955,6.672612775449543e-6,-8.236730302719379e-9,-0.0016027456251598608,6.788717605477168e-6,-8.142605180973005e-9,-0.0016024734564696638,6.92643298585074e-6,-8.031328805630021e-9,-0.001602272562723833,7.054461000471735e-6,-7.927975303945096e-9,-0.0016021316395473646,7.1429733909865235e-6,-7.85643420942448e-9,-0.001602030096147785,7.166416618010949e-6,-7.837159326460504e-9,-0.0016019389325304322,7.106967943498292e-6,-7.884384590805072e-9,-0.001601822909317285,6.958748005321464e-6,-8.002733282683978e-9,-0.001601645025670833,6.732028706082511e-6,-8.183846196126166e-9,-0.0016013737843991493,6.455595568760507e-6,-8.404514185145453e-9,-0.0016009923060795966,6.174736476004758e-6,-8.628343547216521e-9,-0.0016005063926833,5.943025935706647e-6,-8.81240660038963e-9,-0.001599947436018963,5.80863970378304e-6,-8.918249717289788e-9,-0.0015993671346443959,5.799343297164342e-6,-8.923895711975885e-9,-0.001598824450917896,5.912206177088279e-6,-8.831981049727163e-9,-0.0015983691261643967,6.112691262219383e-6,-8.670353040535608e-9,-0.001598027750726865,6.34370842368762e-6,-8.484735141405814e-9,-0.001597796970333321,6.541210365541908e-6,-8.32624668865039e-9,-0.0015976453400901444,6.6511270032490696e-6,-8.237927113772566e-9,-0.0015975225826418882,6.642865882163979e-6,-8.244027233433758e-9,-0.0015973733172837778,6.5160674645092064e-6,-8.344671256899067e-9,-0.0015971514460371861,6.299134854850162e-6,-8.517063826659138e-9,-0.0015968312197721644,6.040236787256278e-6,-8.722695998097968e-9,-0.0015964119337554,5.793741677183589e-6,-8.918192024461737e-9,-0.0015959153524303371,5.606512708157547e-6,-9.066246268690955e-9,-0.0015953776009036073,5.508240931702783e-6,-9.143302312759663e-9,-0.0015948390145066778,5.5079279870896205e-6,-9.142302190616902e-9,-0.0015943353730508711,5.595937570596819e-6,-9.07100224242127E-09,-0.0015938924112206762,5.749295724445448e-6,-8.947734194601513e-9,-0.0015935237022038366,5.937745603497693e-6,-8.796600268425784e-9,-0.0015932308952599915,6.128923308494835e-6,-8.643381449495809e-9,-0.0015930050349990598,6.292138592490837e-6,-8.512542405787741e-9,-0.0015928280496299403,6.401112560124816e-6,-8.425039499555748e-9,-0.001592674118163697,6.436402325511549e-6,-8.396358552439093e-9,-0.001592511242825915,6.388162226916735e-6,-8.434284847973138e-9,-0.0015923038548076277,6.259479463662382e-6,-8.536238644079333e-9,-0.0015920175360308354,6.069704190545227e-6,-8.686647143544019e-9,-0.0015916265581974022,5.855945053772369e-6,-8.855809836079169e-9,-0.0015911234432686942,5.66982094337028e-6,-9.002557749844637e-9,-0.0015905271902137126,5.566980643098267e-6,-9.082660120678599e-9,-0.0015898846649755427,5.5901058549402035e-6,-9.062364074658102e-9,-0.0015892607401442954,5.751420421663427e-6,-8.932240034166934e-9,-0.0015887185141690312,6.0241142294602755e-6,-8.713870498328418e-9,-0.0015882979764191441,6.3490168297115175e-6,-8.454426383873467e-9,-0.0015880035039804617,6.654182728757788e-6,-8.211064945180594e-9,-0.0015878052699886624,6.877775058584288e-6,-8.032786882775957e-9,-0.0015876517590710897,6.984489838970192e-6,-7.947450754328946e-9,-0.0015874863779336544,6.971221701182685e-6,-7.957325293941682e-9,-0.0015872619917445506,6.863185748489404e-6,-8.042215733171648e-9,-0.0015869502414554443,6.704200258300083e-6,-8.167230467721707e-9,-0.0015865450265327885,6.544861833301743e-6,-8.292209810873044e-9,-0.001586060881771174,6.431419708027262e-6,-8.380562643969391e-9,-0.0015855275390838218,6.397223103243651e-6,-8.4060105625722e-9,-0.001584982293378186,6.457920516330214e-6,-8.356321717507075e-9,-0.0015844620349776742,6.61081898948137e-6,-8.233749425801078e-9,-0.0015839966677754043,6.837813403661317e-6,-8.052680242552925e-9,-0.0015836049744388627,7.110512974486875e-6,-7.83558877254055e-9,-0.00158329313272495,7.39599782801762e-6,-7.60852007937778e-9,-0.0015830553572955281,7.661943418484884e-6,-7.397063210929995e-9,-0.0015828757453601038,7.88048537908479e-6,-7.223288825216026e-9,-0.0015827305073950087,8.030921094971425e-6,-7.103576255489422e-9,-0.0015825902239223386,8.10175707948008e-6,-7.046953362750228e-9,-0.0015824222470464458,8.09261347207407e-6,-7.0535751904136625e-9,-0.0015821938020142208,8.016239439311893e-6,-7.1131587433406575e-9,-0.001581876678930113,7.90023529461386e-6,-7.203688583790658e-9,-0.0015814541506088944,7.786937005316729e-6,-7.291589958387156e-9,-0.001580929437716428,7.72886735500687e-6,-7.33539011103742e-9,-0.001580332627237802,7.777305469592599e-6,-7.294769075619663e-9,-0.0015797203731629178,7.964409090283794e-6,-7.144630568893987e-9,-0.0015791630814620142,8.285391603077017e-6,-6.889058321940481e-9,-0.001578720878001717,8.692298812053108e-6,-6.566101724486824e-9,-0.001578419502984907,9.10747486170557e-6,-6.2370916464480965e-9,-0.0015782405062512823,9.452091527792786e-6,-5.9641611304561455e-9,-0.0015781312909732138,9.674079549613374e-6,-5.7882606428250385e-9,-0.001578027360075597,9.761402781761969e-6,-5.718703551331627e-9,-0.0015778737449317608,9.738155742011253e-6,-5.736256424581671e-9,-0.0015776373992268053,9.650582774239132e-6,-5.804222309092312e-9,-0.0015773098917586672,9.551555633876995e-6,-5.88077278945436e-9,-0.0015769037319662415,9.488450878456881e-6,-5.928572703455147e-9,-0.001576445875891479,9.49569390768316e-6,-5.920653078048749e-9,-0.001575970674530697,9.591327497139855e-6,-5.84304192231517e-9,-0.0015755133171369835,9.77658865659438e-6,-5.694997471322311e-9,-0.0015751042615903047,1.003778163139329e-5,-5.487458624638412e-9,-0.001574765041689377,1.0349895109118027e-5,-5.240176643150512e-9,-0.0015745057554236149,1.0681318357532525e-5,-4.978030419643896e-9,-0.001574324361526077,1.0998934195309128e-5,-4.727059345412328e-9,-0.0015742076584801335,1.1272847997949395e-5,-4.510760254880358e-9,-0.0015741334933916324,1.148015300643822e-5,-4.347106597166391e-9,-0.0015740736145208995,1.1607546540740536e-5,-4.2464524410951475e-9,-0.0015739967905234456,1.165297766004052e-5,-4.210215818202505e-9,-0.0015738721019847755,1.1626573124438477e-5,-4.230176567081147e-9,-0.0015736725816667494,1.1550994953670337e-5,-4.288272760115865e-9,-0.0015733796828682138,1.1460984868635478e-5,-4.357060355334619e-9,-0.0015729888863822469,1.1400977627530216e-5,-4.401668546947189e-9,-0.001572515654131937,1.1418948321355508e-5,-4.38465144129614e-9,-0.0015719991378984194,1.155499016771094e-5,-4.27489553861985e-9,-0.0015714991590845522,1.1825387317786e-5,-4.059992614526739e-9,-0.0015710820407434478,1.2207971645261938e-5,-3.757587705347629e-9,-0.00157079647604091,1.2639630181296142e-5,-3.4172617851035963e-9,-0.0015706506457699233,1.3034205729014649e-5,-3.106531606911105e-9,-0.0015706061696304065,1.3315507185698884e-5,-2.885049906609442e-9,-0.0015705947849098492,1.3446774868260129e-5,-2.7815199812259615e-9,-0.0015705471798354855,1.3439686701807493e-5,-2.7865797392088607e-9,-0.0015704165589056223,1.3341690442592115e-5,-2.8627232184856177e-9,-0.0015701872847721412,1.3213818456770147e-5,-2.9617956699222407e-9,-0.0015698706765883304,1.3111683729022345e-5,-3.0400379076245207e-9,-0.0015694951802119525,1.3074916344619818e-5,-3.0664473087197053e-9,-0.0015690965559719964,1.3124045477720016e-5,-3.02518922812497E-09,-0.0015687104237655423,1.3261776187223445e-5,-2.914483963298332e-9,-0.0015683672849147719,1.3476135614623932e-5,-2.744017121960997e-9,-0.001568089331561201,1.3744221248213585e-5,-2.531925583923272e-9,-0.001567888481635352,1.4036199389495978e-5,-2.301652902586154e-9,-0.0015677654444036897,1.431949385617295e-5,-2.0787019259425203e-9,-0.001567709854690696,1.4563082634763757e-5,-1.8873090716874538e-9,-0.0015677016010537767,1.474164561397543e-5,-1.7472081474154697e-9,-0.0015677133377832947,1.4839081201440235e-5,-1.6708576042155112e-9,-0.0015677139033290711,1.4850945784761677e-5,-1.6615071481920558e-9,-0.001567672273456403,1.4785614343760266e-5,-1.712298071717079e-9,-0.001567561728035762,1.4664077909571058e-5,-1.8064872373507266e-9,-0.001567363964362006,1.4518342278869283e-5,-1.9188087740274477e-9,-0.0015670730416101715,1.4388371092908044e-5,-2.017975036911366e-9,-0.001566699009351379,1.4317124795163991e-5,-2.0706086887569183e-9,-0.001566270342050259,1.434288706438812e-5,-2.0471994116831762e-9,-0.0015658331609196012,1.4488670512990482e-5,-1.9302484376469083e-9,-0.0015654445000836176,1.4750408147840926e-5,-1.72331580198987e-9,-0.0015651576376926135,1.5088818242514955e-5,-1.4572399696723894e-9,-0.0015650016611725502,1.543273520838367e-5,-1.1875289074112136e-9,-0.0015649646525930018,1.5699315031914638e-5,-9.786981777112633e-10,-0.0015649932080395524,1.5825615668091956e-5,-8.797288461446118e-10,-0.0015650127561441629,1.5794360168681763e-5,-9.039460652179229e-10,-0.0015649578766231919,1.5637909598140213e-5,-1.0258340424130335e-9,-0.0015647946888691952,1.5419919015121727e-5,-1.1953572908828253e-9,-0.001564525408102832,1.5208671664966406e-5,-1.3589165068917122e-9,-0.0015641786040441487,1.5056893076463547e-5,-1.4752664574075088e-9,-0.00156379486909857,1.4993534545273575e-5,-1.521981552315444e-9,-0.0015634150399108117,1.5024788854757072e-5,-1.4945831313107964e-9,-0.0015630731490801214,1.5139317110787819e-5,-1.4023153307767539e-9,-0.0015627932503844573,1.5314097884522007e-5,-1.2634546568637839e-9,-0.0015625884467632353,1.5519419283943223e-5,-1.1013546330723007e-9,-0.001562460875346721,1.5722949233932406e-5,-9.412785609553453e-10,-0.0015624021479970563,1.5893311969822037e-5,-8.076525173200512e-10,-0.0015623942663999986,1.600355815982286e-5,-7.213957276926135e-10,-0.0015624113087739449,1.603464562664121e-5,-6.972120092446669e-10,-0.0015624222244725121,1.5978599480086515e-5,-7.411073308205331e-10,-0.0015623947894483653,1.5840685366149302e-5,-8.486840929629714e-10,-0.0015623003825704094,1.563995164582476e-5,-1.0047498832725248e-9,-0.00156211896716867,1.5407677934949402e-5,-1.1846143530044873e-9,-0.0015618434715127026,1.5183522199556461e-5,-1.3572122413585078e-9,-0.001561482731818114,1.5009579708722523e-5,-1.4898312300154014e-9,-0.0015610623229379093,1.492287455651844e-5,-1.553978673492256e-9,-0.0015606225925568506,1.4946887881331915e-5,-1.5318866836714567e-9,-0.001560212971251659,1.5083203136375069e-5,-1.422837639342225e-9,-0.0015598818401117295,1.530556706953706e-5,-1.2475983890907835e-9,-0.0015596626235708532,1.5560011265301256e-5,-1.0482226412439358e-9,-0.001559559627593272,1.577486934926789e-5,-8.802955933378288e-10,-0.0015595405570984476,1.5881538273988095e-5,-7.9692043926817e-10,-0.0015595430360532403,1.5839771966023374e-5,-8.291538101517867e-10,-0.0015594959955338393,1.5654660779172335e-5,-9.72801001056983e-10,-0.0015593463001946208,1.5374391353418983e-5,-1.190114515735307e-9,-0.0015590762116928854,1.5069709060576866e-5,-1.4258030022227316e-9,-0.001558703847788798,1.4807611900845037e-5,-1.6276153266680996e-9,-0.0015582703547364113,1.4632787290015397e-5,-1.7608768873779355e-9,-0.00155782354477752,1.4561962806159921e-5,-1.812864234105201e-9,-0.0015574055106049006,1.4587994709651823e-5,-1.7895075593158592e-9,-0.0015570463687551211,1.4687835068240819e-5,-1.7090593224017948e-9,-0.0015567627265973315,1.4830172836249719e-5,-1.5960694700656643e-9,-0.0015565585721585488,1.4981143223910987e-5,-1.4769346528028385e-9,-0.0015564268779924705,1.5108248878273527e-5,-1.3768878228299211e-9,-0.001556351184307716,1.5183283689987646e-5,-1.3177718726983572e-9,-0.0015563071846080817,1.518499355836712e-5,-1.3159931882651027e-9,-0.001556264759061091,1.5101840586844419e-5,-1.3803631127402186e-9,-0.0015561910289953722,1.493467497760959e-5,-1.5099983155967233e-9,-0.001556054769142461,1.4698525876528096e-5,-1.692928407678446e-9,-0.0015558319325716652,1.4422419435365395e-5,-1.9062865699394374e-9,-0.00155551134062967,1.4146276673803998e-5,-2.118820791349384e-9,-0.0015550990200105716,1.3914554215767493e-5,-2.2959501362179986e-9,-0.0015546195256492723,1.376733680242155e-5,-2.406755127218841e-9,-0.001554113115567492,1.3730683214261952e-5,-2.4314473667369036e-9,-0.001553628664032215,1.3808584379673326e-5,-2.367474165297039e-9,-0.0015532132442453931,1.3978822784027847e-5,-2.232532482775318e-9,-0.0015529002123789554,1.4194626461009348e-5,-2.063117347756414e-9,-0.0015526985302697924,1.439325938164884e-5,-1.907804521574992e-9,-0.0015525869004329388,1.4511149461068737e-5,-1.8155962076796212e-9,-0.0015525163561113226,1.4502518791870292e-5,-1.821618126894051e-9,-0.0015524229966605255,1.4355340596169604e-5,-1.934861536785402e-9,-0.0015522480046320417,1.4097085782131253e-5,-2.1337720574238567e-9,-0.0015519570630758844,1.3785964147240603e-5,-2.373056019133126e-9,-0.0015515502090884452,1.3490805690072358e-5,-2.5993134735632945e-9,-0.0015510581583219735,1.3269136012428824e-5,-2.7680732374480753e-9,-0.0015505287216183647,1.3153018247135854e-5,-2.8547493909096727e-9,-0.0015500111337097319,1.3146302784594268e-5,-2.8566824400189927e-9,-0.0015495446374244918,1.3230505435768768e-5,-2.788469542937826e-9,-0.001549153320614908,1.3373991814169866e-5,-2.6747740927702085e-9,-0.0015488458317407083,1.3540368315253085e-5,-2.543818936185515e-9,-0.0015486175736199625,1.3694424215569561e-5,-2.422826603784886e-9,-0.0015484534953238353,1.3805782453544893e-5,-2.335244042665086e-9,-0.0015483305799586244,1.3851194736815257e-5,-2.2989915178837034e-9,-0.0015482199989999771,1.3816427644258473e-5,-2.3249912029369815e-9,-0.001548089463216438,1.369826171317471e-5,-2.41558809311908e-9,-0.0015479064843226234,1.3506495043573231e-5,-2.5629790637511724e-9,-0.0015476430650823826,1.3265142070830212e-5,-2.748308110889761e-9,-0.0015472817047777522,1.3011433188873347e-5,-2.9425170054115522e-9,-0.0015468215378123499,1.2791153939947237e-5,-3.1100615838046316e-9,-0.0015462823008519895,1.264978126784404e-5,-3.2158634430605283e-9,-0.0015457034820694632,1.2620793299373853e-5,-3.23437207800151e-9,-0.0015451371557708795,1.271461979911524e-5,-3.1580199349164043e-9,-0.0015446354809309358,1.2912598720449401e-5,-3.001718234269623e-9,-0.0015442364302565255,1.3169086681883902e-5,-2.801040276875315e-9,-0.0015439524938185769,1.342193894043896e-5,-2.604019123633512e-9,-0.0015437662068975597,1.3608488064402962e-5,-2.4588197532468753e-9,-0.0015436340713854192,1.3682357584886e-5,-2.4008622169249547e-9,-0.001543497962354699,1.3626252232787606e-5,-2.4430807619033354e-9,-0.00154330101649021,1.3456844397511336e-5,-2.572263294225788e-9,-0.0015430034083978895,1.3219882326718478e-5,-2.7529027871083723e-9,-0.0015425929181858147,1.2976711436722279e-5,-2.937645646025132e-9,-0.0015420866882192013,1.278670592403656e-5,-3.080856310691857e-9,-0.00154152398796979,1.2691851204048305e-5,-3.1504613502583297e-9,-0.001540953480044075,1.2708519035282108e-5,-3.1341863973903237e-9,-0.0015404202334010281,1.2827867903263539e-5,-3.039126457904035e-9,-0.0015399566733843208,1.302256759212801e-5,-2.886485245993735e-9,-0.0015395788942260255,1.325586308652444e-5,-2.7045866919813093e-9,-0.0015392872954454852,1.3489692472678766e-5,-2.5226746116671805e-9,-0.0015390695180788213,1.3690362719305401e-5,-2.3666060094382767e-9,-0.0015389039426561332,1.3831829101966165e-5,-2.2563601055744896e-9,-0.0015387628159656927,1.3897428531583792e-5,-2.20469239650718e-9,-0.0015386148936828994,1.388103058929039e-5,-2.2162086122068876e-9,-0.0015384280799308537,1.3788188762037226e-5,-2.28644706084773e-9,-0.0015381727896268602,1.3637252599749298e-5,-2.4010335015984904e-9,-0.00153782662638598,1.3459685165893791e-5,-2.5355047694054314e-9,-0.0015373803606947806,1.3298103454663454e-5,-2.6569224773298658e-9,-0.0015368439449366434,1.3200271754010526e-5,-2.7285944715443808e-9,-0.0015362497069414172,1.3208268582747388e-5,-2.7184455758695063e-9,-0.0015356491281297727,1.3344727868614513e-5,-2.609535624585385e-9,-0.0015351012857119798,1.3601376685119754e-5,-2.4087144532296773e-9,-0.001534655333305587,1.3936432395579682e-5,-2.1484399499017215e-9,-0.0015343338675460306,1.4284442308400234e-5,-1.8790986065537597e-9,-0.001534124900712501,1.4575769360907748e-5,-1.6540268609434805e-9,-0.001533986063403117,1.4757650849527079e-5,-1.5134089313619608e-9,-0.0015338585577077514,1.4808523097929115e-5,-1.4733758294952858e-9,-0.001533684646016743,1.4741520547899112e-5,-1.5234227094639102e-9,-0.001533422629589494,1.4597945041350879e-5,-1.6315309243635806e-9,-0.0015330556633583313,1.4434363097761433e-5,-1.7541719141681908e-9,-0.0015325932941699795,1.43077142414427e-5,-1.8477863331828831e-9,-0.0015320665277323265,1.426230754346835e-5,-1.878725396982042e-9,-0.0015315185461519663,1.4321473573738102e-5,-1.8295328556822685e-9,-0.001530993934766879,1.4485180350014558e-5,-1.7006180859558923e-9,-0.001530529287402824,1.4733246178698408e-5,-1.5076755247691595e-9,-0.0015301472235543963,1.5032273750256648e-5,-1.2763383865137975e-9,-0.001529854434526647,1.5343751423442615e-5,-1.0360201232972493e-9,-0.0015296430494533845,1.5631173065596047e-5,-8.145421075795626e-10,-0.0015294939224596445,1.5865044960165455e-5,-6.343581941131169e-10,-0.0015293804665335667,1.6025681201232713e-5,-5.104211518947967e-10,-0.0015292721800424954,1.6104406698012555e-5,-4.492264661427397e-10,-0.0015291376898846022,1.610398838942385e-5,-4.484456737093128e-10,-0.0015289476443276155,1.6038826092304203e-5,-4.967851368558057e-10,-0.0015286780300962212,1.5934920116292352e-5,-5.7407767303816e-10,-0.0015283144581671828,1.5828995706173513e-5,-6.520649957069123e-10,-0.001527857433495814,1.5765420962771622e-5,-6.968641554284709e-10,-0.0015273273599870595,1.578919190086431e-5,-6.74377333345776e-10,-0.001526766307082904,1.5934197950098757e-5,-5.592021348606761e-10,-0.0015262325434225242,1.6208917896855537e-5,-3.454009983392546e-10,-0.0015257856016340661,1.6585900155219326e-5,-5.434009904032178e-11,-0.001525465322369261,1.7003376453317625e-5,2.6667254099619e-10,-0.0015252747715500247,1.738282006332563e-5,5.577945753003107e-10,-0.0015251774516648478,1.765614484759572e-5,7.673293029466002e-10,-0.0015251111941016761,1.778888314628154e-5,8.693422948032573e-10,-0.0015250108675460873,1.7788373699605145e-5,8.698678813149482e-10,-0.0015248284104435656,1.769597096092772e-5,8.008933904221264e-10,-0.001524543138352943,1.7570342537972436e-5,7.074837082249667e-10,-0.001524161958697962,1.747014596631279e-5,6.344307222398109e-10,-0.00152371290844506,1.7441141511317046e-5,6.163780060845438e-10,-0.001523235851785127,1.7509215448337496e-5,6.72585413499027e-10,-0.0015227730669315363,1.7678694633934106e-5,8.058200670495614e-10,-0.0015223612736943114,1.7934688640477055e-5,1.0043203383510617e-9,-0.0015220259505717274,1.82482101335355e-5,1.2458005545171251e-9,-0.0015217783771147274,1.858278154644696e-5,1.502482588468059e-9,-0.0015216153779278,1.8901176203271382e-5,1.7461563926156706e-9,-0.001521521286606779,1.9171184850908933e-5,1.9524855806838318e-9,-0.0015214713531420381,1.936973086375099e-5,2.1040967574472464e-9,-0.0015214357043695024,1.9485117407839795e-5,2.1923000740043392e-9,-0.001521383137404215,1.9517692447771478e-5,2.217627952739704e-9,-0.0015212844821984616,1.9479511468266107e-5,2.1895835175049778e-9,-0.0015211156742934025,1.939342867657197e-5,2.1258913140746853e-9,-0.0015208608563400331,1.9291673965034527e-5,2.0512979780619082e-9,-0.001520515854495682,1.9213505125941906e-5,1.995657851135691e-9,-0.0015200919884612346,1.9200901897949216e-5,1.9905876211772794e-9,-0.0015196190517206686,1.9290978781291798e-5,2.0637415938522103e-9,-0.001519144803733725,1.9504713196396947e-5,2.2304122471037216e-9,-0.001518727462232059,1.9834280591372538e-5,2.484141135478913e-9,-0.0015184192950395239,2.0235367514319987e-5,2.7910634415758664e-9,-0.0015182452262433325,2.0633099952696904e-5,3.0944338572009063e-9,-0.0015181877354138221,2.094520859440517e-5,3.3320858875781925e-9,-0.0015181899043198905,2.1113683302729238e-5,3.4603240998125803e-9,-0.0015181776587180065,2.1127106051478163e-5,3.4708520228233463e-9,-0.0015180885131474918,2.1021030404410242e-5,3.391091106264991e-9,-0.0015178909438639508,2.0859213783789e-5,3.2698730446144373e-9,-0.0015175877233646422,2.0709171992738493e-5,3.1587082248994756e-9,-0.0015172073558787026,2.0623842481949752e-5,3.0977101310951086e-9,-0.0015167914191089214,2.063317965218757e-5,3.109204821067375e-9,-0.0015163832619076432,2.0743705953134367e-5,3.1975368071754336e-9,-0.0015160200669873704,2.0942485608743105e-5,3.3523023756736195e-9,-0.0015157281682930876,2.1202788343014117e-5,3.5528268410564887e-9,-0.0015155208240000008,2.1490072546112796e-5,3.7727761422749006e-9,-0.0015153978329193042,2.1767775800983042e-5,3.984512020996164e-9,-0.0015153466823297202,2.2002561279956053e-5,4.162975427671088e-9,-0.0015153449752000046,2.2168662578104594e-5,4.2888951154383054e-9,-0.0015153638372301824,2.225102728825126e-5,4.351136659371982e-9,-0.001515371889179471,2.2246993016359994e-5,4.3479874066622305e-9,-0.0015153392563930425,2.216641597337143e-5,4.287271959233951e-9,-0.001515241213541778,2.2030490914074532e-5,4.1854284582402095e-9,-0.0015150613338686283,2.1869574703626888e-5,4.065761994294679e-9,-0.0015147941551076818,2.1720147110229897e-5,3.956004055400928e-9,-0.0015144474064621842,2.1620798118500058e-5,3.885163322724043e-9,-0.0015140436280418352,2.160676344805545e-5,3.879380610579873e-9,-0.0015136202312386242,2.1702388771875214e-5,3.956357484574458e-9,-0.001513226034844196,2.191177437422689e-5,4.1185205826258535e-9,-0.0015129120080209172,2.221001677650227e-5,4.346649078495528e-9,-0.001512715541928629,2.254041791686142e-5,4.597890678761155e-9,-0.001512642323751254,2.282451516198137e-5,4.8132638236435735e-9,-0.001512656112032841,2.2987226657755368e-5,4.936448725917021e-9,-0.0015126871339836351,2.2987814401065566e-5,4.937036368579893e-9,-0.0015126589666124984,2.283832816494508e-5,4.824488181507253e-9,-0.0015125191642603442,2.2596939508072832e-5,4.643164810446097e-9,-0.001512255771697461,2.234135481963672e-5,4.452159952580022e-9,-0.0015118937115124553,2.2139907404171068e-5,4.303255975411923e-9,-0.00151147883232571,2.203443093930126e-5,4.227845582902372e-9,-0.001511060993239207,2.2037202305538674e-5,4.234671953457867e-9,-0.0015106824975225093,2.213657085421608e-5,4.314282868663287e-9,-0.0015103725536317254,2.2305348342064856e-5,4.4455958177446396e-9,-0.001510145935250769,2.2508543748264166e-5,4.601885979825811e-9,-0.0015100037941396729,2.27093975733727e-5,4.75536669510632e-9,-0.0015099353530227085,2.2873996336669858e-5,4.880600371514767e-9,-0.0015099200916151164,2.2974973370313923e-5,4.957188134048892e-9,-0.0015099304637137257,2.2994496007904244e-5,4.971952359005194e-9,-0.0015099352286913673,2.2926461766264454e-5,4.920579998432417e-9,-0.0015099033645110472,2.277759522000927e-5,4.808472749402745e-9,-0.0015098082535331882,2.256704567886276e-5,4.650450638927179e-9,-0.0015096316019525189,2.2324318804894625e-5,4.469136915658275e-9,-0.0015093665766133704,2.208567924099814e-5,4.2921241199986e-9,-0.0015090197629728298,2.1889299652124044e-5,4.148176635499323e-9,-0.0015086116448405531,2.1769507934527783e-5,4.062815296740895e-9,-0.0015081753500045245,2.1750466832938717e-5,4.05360291565382e-9,-0.0015077531763032308,2.183960388547096e-5,4.125383508132904e-9,-0.0015073900399322092,2.202167990402843e-5,4.2660809956394935e-9,-0.0015071232263286609,2.225573764208077e-5,4.44462415416496e-9,-0.0015069693776782423,2.2478572667533146e-5,4.6136193435732875e-9,-0.0015069127900212765,2.261830809440704e-5,4.719430802140069e-9,-0.0015069025568193628,2.2617773461514468e-5,4.719545121206075e-9,-0.0015068654430890603,2.2459193836491986e-5,4.601005606662283e-9,-0.001506732732291867,2.2175454413684737e-5,4.388897633440769e-9,-0.0015064676102254564,2.1838262916960467e-5,4.1374773793336535e-9,-0.0015060770908259737,2.152899176668202e-5,3.9081543995164606e-9,-0.0015056034531821725,2.130964096087466e-5,3.747499605308365e-9,-0.0015051039831142801,2.120817745888039e-5,3.67616765940978e-9,-0.0015046318558587788,2.121994692951462e-5,3.6900798243215312e-9,-0.0015042251268647423,2.1317953608248667e-5,3.768369282876351e-9,-0.0015039036630436163,2.1464388035088392e-5,3.88222893943776e-9,-0.0015036707819547192,2.1619516091843104e-5,4.001665844105285e-9,-0.0015035165886605325,2.1747302655433718e-5,4.099689013291884e-9,-0.00150342132600212,2.1818716266063703e-5,4.154695925069204e-9,-0.001503358325448771,2.1813879500024203e-5,4.1519986156729824e-9,-0.0015032968462424501,2.1723736492507323e-5,4.08503905892022e-9,-0.0015032052341075262,2.155133538091197e-5,3.956368101994074e-9,-0.0015030546872407823,2.1312355770057032e-5,3.778071180337243e-9,-0.0015028235326783174,2.103420332333634e-5,3.5710789610787957e-9,-0.0015025013887804367,2.075307806093682e-5,3.362886440108658e-9,-0.0015020922453497882,2.0508886287330707e-5,3.183598559287639e-9,-0.0015016154742786625,2.0338452391119222e-5,3.0607104114683997e-9,-0.0015011040515861569,2.0268076034948164e-5,3.0134867470089806e-9,-0.001500599804274013,2.030688168146457e-5,3.04807733049152e-9,-0.0015001460726057133,2.044239395900025e-5,3.154424023362247e-9,-0.00149977856352969,2.0639604039527855e-5,3.305819021705255e-9,-0.0014995156172464786,2.0844817059723325e-5,3.461959279396227e-9,-0.0014993500137638414,2.0995399978085027e-5,3.576249789876038e-9,-0.0014992456432738306,2.1035335583678028e-5,3.60729449457631e-9,-0.0014991428844553212,2.0933644184201608e-5,3.532476786791916e-9,-0.0014989745730104767,2.0698804268457708e-5,3.3586078624101303e-9,-0.0014986888360896111,2.0380406021878866e-5,3.1231135922833585e-9,-0.0014982686733544998,2.0053717417477414e-5,2.88245886837212e-9,-0.001497737525690711,1.979300837962255e-5,2.692135997911263e-9,-0.001497148017881539,1.9647196210900128e-5,2.588415637713842e-9,-0.0014965613991866607,1.9629093705834248e-5,2.5803785904338805e-9,-0.0014960289411646245,1.971968706434261e-5,2.653283174951249e-9,-0.0014955820412908304,1.9880736800477454e-5,2.778157555940626e-9,-0.0014952309905867504,2.006787897714019e-5,2.9216817011335566e-9,-0.0014949687552116315,2.0239968863611068e-5,3.053154202397362e-9,-0.001494776174475137,2.0364131096063462e-5,3.1481831138080597e-9,-0.0014946265704327824,2.0417849223123522e-5,3.1901577490234746e-9,-0.0014944892845262566,2.038968095963877e-5,3.170735822070018e-9,-0.001494332545660484,2.0279629489477603e-5,3.090127645122555e-9,-0.0014941263545837618,2.009946410020862e-5,2.957370145196969e-9,-0.0014938459444002585,1.9872625600314708e-5,2.7902699955053625e-9,-0.0014934759328347927,1.9632856641228426e-5,2.614335134584265e-9,-0.0014930145655336932,1.9420569813598002e-5,2.4599538294097267e-9,-0.001492476702076429,1.9276431553751654e-5,2.3574741074222654e-9,-0.001491893815555032,1.923270705234934e-5,2.3306640563010123e-9,-0.0014913096645020614,1.930428755097455e-5,2.3900526656468323e-9,-0.0014907716135890666,1.9482318555866433e-5,2.5283426168944e-9,-0.0014903193643921373,1.973316438958572e-5,2.7198781518158167e-9,-0.0014899741448074898,2.0003956799043533e-5,2.9249937542774248e-9,-0.0014897315523588778,2.023395845028581e-5,3.098573729705269e-9,-0.0014895604078392077,2.036929696434408e-5,3.200967785115278e-9,-0.0014894086578894246,2.0377579597678796e-5,3.2087039570247428e-9,-0.0014892158047863976,2.0258385868426954e-5,3.122098731804692e-9,-0.001488929416536435,2.00457625312811e-5,2.9669485121319134e-9,-0.0014885210657221955,1.9800292408669174e-5,2.7885218058526498e-9,-0.0014879957071757151,1.9591794282292342e-5,2.6386436925550972e-9,-0.0014873899746012964,1.9478359809753334e-5,2.5601312681883347e-9,-0.0014867596618360918,1.949011570768919e-5,2.5748323704033555e-9,-0.0014861620498762876,1.96239922223134e-5,2.6799132147527057e-9,-0.0014856407320978139,1.9849868774778618e-5,2.8525944425785092e-9,-0.0014852179082245765,2.0123138972227992e-5,3.0595746869390322e-9,-0.001484894404555705,2.0397436089605455e-5,3.266468246613373e-9,-0.0014846544662120268,2.063358248057847e-5,3.444366312054756e-9,-0.0014844719149976677,2.080401172999627e-5,3.573026893968126e-9,-0.0014843155256631664,2.089389600951698e-5,3.6416569247405195e-9,-0.0014841529717873015,2.0900677734307805e-5,3.6485643076621275e-9,-0.0014839536957402732,2.083324538196875e-5,3.6005774495059056e-9,-0.0014836914694317035,2.0711220588510544e-5,3.5125354304605184e-9,-0.0014833473561297718,2.0564086382282243e-5,3.406608295349423e-9,-0.0014829133688975399,2.0429297886048457e-5,3.3108019367196984e-9,-0.0014823963710327067,2.0348185310062236e-5,3.25579730356668E-09,-0.0014818207428450856,2.0358734524199104e-5,3.269510016130022e-9,-0.0014812274772494347,2.048563738802864e-5,3.369725367338494e-9,-0.0014806675693328044,2.0730221397913308e-5,3.556767697544755e-9,-0.0014801896123771137,2.106481501301274e-5,3.809538836492915e-9,-0.0014798249253679303,2.143590416769047e-5,4.088059593597637e-9,-0.0014795761455542354,2.177709692752412e-5,4.3431788306475135e-9,-0.0014794146511569793,2.202796158292254e-5,4.530508461441201e-9,-0.0014792883061481331,2.21516328538685e-5,4.623353141774396e-9,-0.0014791364524373138,2.2144870224967428e-5,4.620002061129199e-9,-0.001478906684187595,2.203791530288745e-5,4.543444647931511e-9,-0.0014785683235115793,2.1885258092804413e-5,4.434360357647662e-9,-0.0014781193401062422,2.1750689691606835e-5,4.339933827235743e-9,-0.0014775854795386373,2.169092982823376e-5,4.3017291032046366e-9,-0.001477012299802205,2.1742145708306606e-5,4.345842348530162e-9,-0.0014764526498468376,2.191281179061359e-5,4.477843345187745e-9,-0.0014759534363243591,2.2184454181331846e-5,4.683549499194312e-9,-0.0014755455960484022,2.2519217855883682e-5,4.93475027814799e-9,-0.0014752396898019221,2.2870962823821085e-5,5.1974073013490225e-9,-0.0014750271342094889,2.3195958122338928e-5,5.439457561441334e-9,-0.0014748851544931095,2.3460421517391652e-5,5.636259530417908e-9,-0.0014747829673421675,2.3644120169039524e-5,5.773169265596725e-9,-0.001474687320693333,2.374080291527646e-5,5.845840169919798e-9,-0.0014745666070528286,2.3756880234768512e-5,5.859274017653767e-9,-0.0014743937130802754,2.370958754850038e-5,5.826487086509059e-9,-0.0014741482569230124,2.3625217663658505e-5,5.767179828898929e-9,-0.001473818894785108,2.353730629244631e-5,5.7063097259063755e-9,-0.0014734060778071696,2.3484074946004946e-5,5.672082995091509e-9,-0.001472924981874492,2.3504008874457454e-5,5.692603170476783e-9,-0.0014724072644037177,2.3628534088270373e-5,5.790480507708103e-9,-0.0014718991918354172,2.387197597384268e-5,5.975569281186334e-9,-0.0014714535304005726,2.422153315886059e-5,6.2378093646216116e-9,-0.0014711147480171334,2.463284924493281e-5,6.5441791770475725e-9,-0.0014709018005976526,2.5037149761910478e-5,6.844044438239558e-9,-0.0014707971735682401,2.5361087416693702e-5,7.08371765685339e-9,-0.0014707499231823534,2.5551998946229314e-5,7.224937628064112e-9,-0.0014706928556039132,2.559617122586235e-5,7.2582251778159335e-9,-0.0014705654035565266,2.5521412187611647e-5,7.204692681405604e-9,-0.0014703314954858874,2.5384704814681434e-5,7.106814374546921e-9,-0.001469986538679709,2.5252782134341083e-5,7.013936096625625e-9,-0.0014695540981764408,2.5183955143550453e-5,6.968766442288963e-9,-0.0014690762900327096,2.5215950258180403e-5,6.998456432120111e-9,-0.0014686020708823385,2.5360870206104967e-5,7.1110940673169154e-9,-0.001468176386598783,2.5606318665205407e-5,7.296811789583651e-9,-0.001467831922902369,2.592100301791191e-5,7.532134484148677e-9,-0.0014675843884544473,2.6263002803544234e-5,7.786145194716698e-9,-0.0014674316308986469,2.6588795756606222e-5,8.027060457500164e-9,-0.0014673561469447757,2.6861167542429433e-5,8.22790296065784e-9,-0.001467329858105644,2.7054651629686617e-5,8.370365121482301e-9,-0.0014673197245071011,2.7158013293985568e-5,8.446566196624374e-9,-0.0014672929285562525,2.717410966689769e-5,8.458950180331899e-9,-0.0014672208834997042,2.7118011201820044e-5,8.4189307986924e-9,-0.0014670820001531884,2.7014370775278294e-5,8.34495143072538e-9,-0.0014668636033767842,2.6894642929169563e-5,8.260369284515231e-9,-0.0014665634811135814,2.6794222102966245e-5,8.19123024785904e-9,-0.0014661914098972825,2.674909228562432e-5,8.163696466874626e-9,-0.001465770520724381,2.679114846664634e-5,8.200590836488431e-9,-0.001465337400999473,2.6941364730020337e-5,8.316505230393117e-9,-0.0014649388274165344,2.720105595585084e-5,8.511638713086152e-9,-0.0014646228477321868,2.7543744071366404e-5,8.766111014759959e-9,-0.0014644237187200332,2.791300341092992e-5,9.03854416039646e-9,-0.001464344966501293,2.8232690622237343e-5,9.273507511061049e-9,-0.00146435037296069,2.8431059296295023e-5,9.418980704214775e-9,-0.0014643722903750673,2.8469546292426055e-5,9.447272055057291e-9,-0.0014643365365555757,2.835968319109381e-5,9.367378735882624e-9,-0.0014641906956874835,2.8157374663821298e-5,9.220801767421116e-9,-0.0014639203699168175,2.793907130398366e-5,9.063972153156974e-9,-0.001463547743641747,2.777469392086682e-5,8.94819704622287e-9,-0.0014631181589848093,2.770971394278009e-5,8.906400483072525e-9,-0.0014626840013922983,2.7759615661242276e-5,8.949152904876544e-9,-0.0014622919778576426,2.7913376841285792e-5,9.067487925009645e-9,-0.0014619755187329977,2.8141209895819113e-5,9.238874894232356e-9,-0.0014617515941158011,2.840319839203045e-5,9.43374255358404e-9,-0.0014616206414562979,2.8657228590944903e-5,9.621316724398479e-9,-0.0014615686117483452,2.88656511750599e-5,9.77438646312151e-9,-0.0014615705063021332,2.9000359578134314e-5,9.872855466969257e-9,-0.0014615948598680729,2.9046009835060456e-5,9.905967029354836e-9,-0.001461608579480747,2.900124632155569e-5,9.873148682283592e-9,-0.0014615815016667387,2.8877991973552452e-5,9.783504838835818e-9,-0.001461490094774729,2.86991569091944e-5,9.65415693656674e-9,-0.0014613200429391873,2.8495379357004293e-5,9.507823393054517e-9,-0.0014610677949529376,2.8301325099769305e-5,9.370010304543687e-9,-0.0014607412749224225,2.8151769243240655e-5,9.266016170060544e-9,-0.001460359934266054,2.807741831222614e-5,9.217802419101563e-9,-0.001459954104262802,2.810012125881796e-5,9.240548810429125e-9,-0.0014595629027557774,2.8227079611997363e-5,9.338632920695437e-9,-0.001459229207373408,2.8444570378339046e-5,9.501348366973721e-9,-0.0014589903312328463,2.8713478214577256e-5,9.699906185659169e-9,-0.0014588646330113623,2.8970928160528702e-5,9.888704607981145e-9,-0.0014588380390138703,2.9143000527045176e-5,1.0014441084658272e-8,-0.0014588592510678298,2.916941323267889e-5,1.0033827086917958e-8,-0.0014588523821274818,2.9030953044343186e-5,9.933409035109415e-9,-0.0014587456644553276,2.8762477106263568e-5,9.739062259576716e-9,-0.001458501091057045,2.844024437257861e-5,9.506799999855063e-9,-0.001458127143420008,2.8150315430128008e-5,9.299622484807696e-9,-0.001457669435461303,2.7957472722960843e-5,9.164649386359438e-9,-0.0014571891196582215,2.788982620398424e-5,9.12181556433836e-9,-0.001456742655817562,2.7940470402478702e-5,9.1652351867303225E-09,-0.0014563700347164715,2.807848674258035e-5,9.271524962474886e-9,-0.0014560912588836175,2.826144010513699e-5,9.409190716108027e-9,-0.0014559078903742333,2.8445360201978687e-5,9.546033498517481e-9,-0.0014558067229891146,2.859145029300421e-5,9.65399985693406e-9,-0.0014557639343839687,2.867025540336573e-5,9.712068997365372e-9,-0.0014557492065120391,2.8664138594720785e-5,9.707890097359682e-9,-0.0014557298001960863,2.8568493551007577e-5,9.638560286519974e-9,-0.0014556745936851589,2.839177608483774e-5,9.510625422205857e-9,-0.0014555579370875656,2.815423714782051e-5,9.339183329667601e-9,-0.0014553629537277198,2.788526924195518e-5,9.14595894628804e-9,-0.0014550838573302906,2.7619586166606147e-5,8.95646433151999e-9,-0.0014547270310782067,2.7392671032165182e-5,8.796565507284847e-9,-0.0014543107698863327,2.7235881381529104e-5,8.688803061502544e-9,-0.0014538636547068316,2.7171559156514596e-5,8.648806078255112e-9,-0.0014534215710303232,2.7208440099601352e-5,8.68207399305285e-9,-0.001453023162629078,2.7337595874378007e-5,8.781285876904159e-9,-0.0014527031545351094,2.7529636906441165e-5,8.924571639210088e-9,-0.0014524833008458392,2.7735059993107925e-5,9.075970709988018e-9,-0.0014523621957538728,2.7890571544417234e-5,9.19001842577633e-9,-0.0014523077282724134,2.793379091660291e-5,9.22219677030714e-9,-0.0014522585937687897,2.7825223830983982e-5,9.144582317840528e-9,-0.0014521403795198652,2.7569149189017554e-5,8.960821255109384e-9,-0.001451893505617349,2.7219493141957345e-5,8.71038541518176e-9,-0.0014514989868257015,2.6862149989671336e-5,8.455773632611902e-9,-0.0014509858377754307,2.6581283086955036e-5,8.257991564297597e-9,-0.0014504161415827162,2.642918854125528e-5,8.154588223766253e-9,-0.0014498591074915373,2.6414918608475404e-5,8.151437565096828e-9,-0.0014493694267968629,2.6511849721997745e-5,8.228438049517682e-9,-0.001448977429522189,2.667403387196817e-5,8.351639483937653e-9,-0.0014486894408670674,2.6851542282472955e-5,8.484552463610772e-9,-0.0014484932417684118,2.700055872143433e-5,8.595494996252945e-9,-0.0014483645278005612,2.7088384874182358e-5,8.661115546099852e-9,-0.0014482724252906584,2.709519725146361e-5,8.667505390416874e-9,-0.0014481837922433506,2.7014246607076915e-5,8.610209915657879e-9,-0.0014480667630384213,2.6851367625677863e-5,8.493819386236972e-9,-0.0014478939985973695,2.6623968239600285e-5,8.331252341426477e-9,-0.0014476458307236476,2.635924813759418e-5,8.142498231074953e-9,-0.00144731311061095,2.6091231865376743e-5,7.952456649511876e-9,-0.0014468992107673786,2.5856444834127285e-5,7.787722099695875e-9,-0.0014464205463444633,2.5688537660867144e-5,7.672567457310853e-9,-0.0014459051593164764,2.5612502082256553e-5,7.624669465502379e-9,-0.0014453891705153014,2.5639343311066898e-5,7.651283894303304e-9,-0.0014449112632642608,2.5762226244715e-5,7.746636370364774e-9,-0.0014445057152640856,2.595501245227754e-5,7.891145026699935e-9,-0.0014441946694093064,2.6173960497131583e-5,8.052917461887092e-9,-0.0014439806475695987,2.636349963132186e-5,8.192048807278225e-9,-0.0014438411873451745,2.646690890427581e-5,8.268250609640819e-9,-0.0014437286296687954,2.6441511003512633e-5,8.251567637578792e-9,-0.001443578444853297,2.6275165731848128e-5,8.1339948899965e-9,-0.0014433273202660133,2.5997083928831833e-5,7.937096006765073e-9,-0.001442936409115405,2.567444219779277e-5,7.709508223593939e-9,-0.0014424086701659907,2.5391506100637698e-5,7.511889392046065e-9,-0.0014417892862947695,2.5219227646515815e-5,7.3950023164529674e-9,-0.001441147821285167,2.5191187270965408e-5,7.382424698161206e-9,-0.0014405525671188652,2.5297654232244746e-5,7.46642211059057e-9,-0.0014400506984845914,2.549697136888099e-5,7.616367322101587e-9,-0.0014396609875323325,2.573422047511667e-5,7.792362299919142e-9,-0.0014393770763216152,2.595731091946943e-5,7.956884889193762e-9,-0.0014391755390315833,2.6126299063856226e-5,8.081435414644157e-9,-0.0014390240648945822,2.621661961154909e-5,8.14872862017226e-9,-0.0014388876944924675,2.6218749094750767e-5,8.152319004850451e-9,-0.0014387330155882449,2.6136521805769236e-5,8.095315097039274e-9,-0.0014385310964584244,2.5985249879172986e-5,7.98902323659588e-9,-0.0014382599562942464,2.578984727441783e-5,7.851630723953415e-9,-0.001437907000473791,2.558258430097201e-5,7.706602007982529e-9,-0.0014374713475980292,2.539984818095332e-5,7.580298299298504e-9,-0.0014369654370357835,2.5277430919184726E-05,7.498481675769508e-9,-0.0014364149450387434,2.524445155724815e-5,7.481837634246073e-9,-0.0014358560907401488,2.531680732424275e-5,7.541239382042651e-9,-0.0014353299421923447,2.549174348391302e-5,7.67395063074306e-9,-0.0014348742608147498,2.5745447771436074e-5,7.862124322155557e-9,-0.0014345144552345818,2.6035180886781052e-5,8.074600559849243e-9,-0.0014342558619612528,2.6306381027453562e-5,8.272200047331242e-9,-0.001434079589311781,2.6503932782313694e-5,8.415841468953633e-9,-0.0014339437223416472,2.658569469617018e-5,8.476099349229682e-9,-0.0014337909162949274,2.653533090809111e-5,8.442148816768944e-9,-0.0014335620776601706,2.6370518693983798e-5,8.32738512813637e-9,-0.0014332136074441035,2.614232716045764e-5,8.16878953155742e-9,-0.0014327328436069065,2.592319956427502e-5,8.01823403658462e-9,-0.0014321447131647473,2.5785451237951414e-5,7.927095900408931e-9,-0.0014315049081303302,2.5778022969174607e-5,7.92972291182139e-9,-0.001430881462440153,2.591187567232032e-5,8.0331743458699e-9,-0.0014303331772278684,2.616035797685171e-5,8.217711692267238e-9,-0.0014298944934438224,2.6472481447071226e-5,8.446469961108673e-9,-0.0014295714210435305,2.6790920056085873e-5,8.67839265732808e-9,-0.0014293466416022695,2.706669905365202e-5,8.878682424407924e-9,-0.0014291886521796292,2.726698482237647e-5,9.024249768378522e-9,-0.0014290605250002484,2.7376714200605378e-5,9.104750656058354e-9,-0.0014289262535661926,2.7396668664601868e-5,9.121125674470142e-9,-0.0014287546376585928,2.734037378186705e-5,9.083361209742851e-9,-0.0014285215854872378,2.7231132652078738e-5,9.008387004102195e-9,-0.0014282118094740023,2.7099446056366132e-5,8.91824477219024e-9,-0.0014278205169719102,2.6980369162120895e-5,8.838165817857077e-9,-0.0014273551041353886,2.6910052790540644e-5,8.794014126806641e-9,-0.001426836217410468,2.692081607168585e-5,8.808668492982802e-9,-0.0014262969989791532,2.703467650249471e-5,8.897360695655925e-9,-0.0014257791653392638,2.7256366225002294e-5,9.062761040100194e-9,-0.0014253252294257476,2.7568169951920956e-5,9.291482753990074e-9,-0.0014249678412150235,2.7929586139618507e-5,9.554082763102208e-9,-0.001424719247272349,2.8283922152095817e-5,9.8099633515569e-9,-0.0014245649540888968,2.857138997614607e-5,1.0016784431585915e-8,-0.001424464819701088,2.874523105273305e-5,1.0141889729331605e-8,-0.0014243621807249333,2.8785614912595313e-5,1.0172034668321106e-8,-0.001424198594399113,2.8706550061364885e-5,1.0118076747905602e-8,-0.0014239298298215845,2.855338333973738e-5,1.0012952173362216e-8,-0.0014235384273948743,2.8391359153604704e-5,9.903332600293055e-9,-0.001423039068963574,2.8288237213866135e-5,9.837163726172813e-9,-0.0014224748046457894,2.8295862255426144e-5,9.850620457112531e-9,-0.0014219048911750486,2.8436423102220665e-5,9.95855573897215e-9,-0.0014213881167722824,2.8698019217145672e-5,1.0151643259449534e-8,-0.001420967450066756,2.9040746996965335e-5,1.0400951762124473e-8,-0.0014206611416994707,2.941022918094345e-5,1.066766982712532e-8,-0.001420462210050991,2.9752840746124096e-5,1.0913884054961945e-8,-0.0014203445464611544,3.0027360180390388e-5,1.111072374244291e-8,-0.0014202718523974758,3.0210625033603962e-5,1.1242230035220288e-8,-0.0014202059478694213,3.0297793467362173e-5,1.130543514634517e-8,-0.0014201126851082163,3.0299379741317255e-5,1.1308212546961511e-8,-0.001419965354967399,3.023722740125861e-5,1.126641797154726e-8,-0.0014197463754245395,3.0140745523510838e-5,1.1201222166966375e-8,-0.0014194482287997765,3.004374201377961e-5,1.1136832656018542e-8,-0.0014190743137684472,2.9981438465230445e-5,1.1098298258684281e-8,-0.001418639809555389,2.9986901963587264e-5,1.1108885328964141e-8,-0.001418171968272546,3.008617815680982e-5,1.1186579824169502e-8,-0.0014177085861886171,3.0291942135319834e-5,1.133964646008498e-8,-0.001417293059956346,3.05967206924271e-5,1.1562003200599675e-8,-0.0014169650708668305,3.0968510049347896e-5,1.1830355814926381e-8,-0.0014167481369272308,3.135278601208798e-5,1.210581797947972e-8,-0.0014166384270926171,3.168371673086619e-5,1.2341922339142801e-8,-0.001416601011852032,3.1903068064781095e-5,1.2497950944243014e-8,-0.001416577597530908,3.197990561297152e-5,1.2552765821321245e-8,-0.001416504023895075,3.192205189348772e-5,1.2512782170450044e-8,-0.0014163303334027324,3.177388113563488e-5,1.241023118085146e-8,-0.0014160352058320256,3.160197306166359e-5,1.2292773285630224e-8,-0.00141563020412267,3.147525183817631e-5,1.2209223647116733e-8,-0.001415154182806351,3.144686499940079e-5,1.219665427065755e-8,-0.0014146612944608804,3.1542588220823e-5,1.2272337128455885e-8,-0.0014142068212377667,3.17574992652059e-5,1.2431711044918489e-8,-0.0014138345495532411,3.206030619328251e-5,1.2651790954942593e-8,-0.0014135683760217552,3.240316711893786e-5,1.2898338055852669e-8,-0.0014134095167311366,3.273394154711765e-5,1.3134557510283644e-8,-0.0014133391618895421,3.300757270905415e-5,1.3329020931988017e-8,-0.0014133249690354472,3.31939594183018e-5,1.34610409333419e-8,-0.0014133289896605121,3.328119077205221e-5,1.3522794560786908e-8,-0.001413314822460721,3.3274656159752014e-5,1.3518607273504532e-8,-0.0014132527079583823,3.3193518643689525e-5,1.3462443644765452e-8,-0.0014131223461608018,3.3066195373724894e-5,1.3374722960227905e-8,-0.001412913992766144,3.292604615376844e-5,1.3279258055873786e-8,-0.0014126286522506636,3.2807704536436217e-5,1.3200599557144906e-8,-0.0014122779793304208,3.274378481004234e-5,1.3161617579820244e-8,-0.0014118840527596287,3.276134215889836e-5,1.318093997452497e-8,-0.0014114785988180107,3.287744387268909e-5,1.3269863918137662e-8,-0.0014111005438624472,3.309364278437632e-5,1.3428626290622916e-8,-0.0014107903444190032,3.339035361538781e-5,1.3642698341029341e-8,-0.0014105801213301545,3.372401496582465e-5,1.388102605623399e-8,-0.0014104809172316352,3.403140528598448e-5,1.4099169038639324e-8,-0.0014104721889999377,3.4244418459823575e-5,1.4249623837810556e-8,-0.0014105012730983308,3.431313016865975e-5,1.4297897851110098e-8,-0.0014104976530675871,3.4227232153276674e-5,1.4237483279052317e-8,-0.0014103978203613941,3.4023102917727105e-5,1.409478258989675e-8,-0.0014101683041605874,3.37710788967813e-5,1.3920030577394821e-8,-0.0014098152448564095,3.3549879175073367e-5,1.3769043937615413e-8,-0.0014093780596700428,3.342166325020871e-5,1.3685419104499984e-8,-0.0014089135400348065,3.341756238018929e-5,1.3690309226175862e-8,-0.0014084788334548454,3.3535493238112093e-5,1.37811189010826e-8,-0.0014081186845767038,3.374669781848928e-5,1.3936497322555077e-8,-0.0014078585339577186,3.400633332696204e-5,1.4124144409347155e-8,-0.0014077028508541673,3.42645878758073e-5,1.4308805334751806e-8,-0.0014076373664685578,3.4476340111075574e-5,1.4459025629545484e-8,-0.0014076339312917433,3.4608360343685586e-5,1.4552028310657353e-8,-0.0014076568208633863,3.464345854701809e-5,1.457641017245677e-8,-0.001407669277186434,3.458141606859998e-5,1.4532638817739162e-8,-0.0014076391876356137,3.443714237304597e-5,1.4431695615751243e-8,-0.0014075431589499628,3.42369134134312e-5,1.4292440206539112e-8,-0.0014073687088618709,3.401369363319955e-5,1.4138337135936162e-8,-0.0014071148025871514,3.380247774740365e-5,1.3994150056515684e-8,-0.0014067912957618034,3.363619137526845e-5,1.3882976655598566e-8,-0.001406417785833611,3.3542132876375727e-5,1.3823657520053249e-8,-0.0014060220696082155,3.3538605100390865e-5,1.3828389059174037e-8,-0.0014056380007306819,3.363132267047934e-5,1.3900311168766636e-8,-0.0014053019647113963,3.3809476163547754e-5,1.403098639393186e-8,-0.0014050467952829435,3.404235090138576e-5,1.4198316878603361e-8,-0.0014048925106380783,3.427900969237467e-5,1.4366522015636952e-8,-0.0014048352740607154,3.4454830578689884e-5,1.4490717899879615e-8,-0.0014048394576729162,3.450785686877302e-5,1.452817586539771e-8,-0.0014048405652307403,3.4402642110255266e-5,1.4454790297227312e-8,-0.001404764049178016,3.415061768516878e-5,1.4279243287251102e-8,-0.0014045544794032856,3.381223147440442e-5,1.4044512501709342e-8,-0.001404199019517501,3.34753415760048e-5,1.3812662721467575e-8,-0.0014037308928993113,3.322120032523223e-5,1.3640780805957817e-8,-0.0014032126628860826,3.309751484531842e-5,1.3561886833224022e-8,-0.0014027118105852483,3.311012467826726e-5,1.3579138976547671e-8,-0.0014022815504324637,3.3230920394382554e-5,1.3671690150678322e-8,-0.0014019518800177807,3.341272421638346e-5,1.3805518700988216e-8,-0.0014017290980962978,3.360354473780993e-5,1.3943711301648619e-8,-0.0014016000243125806,3.375694744860536e-5,1.4053807349603574e-8,-0.001401537920759662,3.383830386691697e-5,1.4112051071441454e-8,-0.001401508516602354,3.38278961316903e-5,1.4105333153706423e-8,-0.0014014756088146735,3.372177220527613e-5,1.4031568509718768e-8,-0.0014014060660440912,3.353076489929489e-5,1.3898885331730495e-8,-0.0014012739860668733,3.327793091957308e-5,1.3723815329935129e-8,-0.0014010636973225197,3.2994742987017955e-5,1.3528667448275764e-8,-0.0014007713279077503,3.271646976821572e-5,1.3338315101143095e-8,-0.0014004048383781237,3.247734073521475e-5,1.3176767910392181e-8,-0.001399982720160362,3.230609707347399e-5,1.3063963984102755e-8,-0.0013995317115542282,3.222223618554686e-5,1.3013065431940527e-8,-0.0013990837824146862,3.223298100013896e-5,1.3028362806501945e-8,-0.0013986724408224693,3.2330914871978444e-5,1.310378977963939e-8,-0.0013983280897938944,3.249234472603756e-5,1.3222059543851011e-8,-0.0013980719157413676,3.26771022098923e-5,1.3354806377875613e-8,-0.001397908301055983,3.2831582187595467E-05,1.3464847011626819e-8,-0.001397817347062273,3.289747667782527e-5,1.3512189019105797e-8,-0.001397751512132713,3.28277047548693e-5,1.3464871106866769e-8,-0.0013976423203658295,3.260691801970788e-5,1.3312974762696126e-8,-0.0013974208313565252,3.2266892279175194e-5,1.3079220779759064e-8,-0.0013970462170215551,3.188350281420138e-5,1.2816866134850941e-8,-0.001396526429072313,3.15504266134185e-5,1.2591347003175733e-8,-0.0013959162362914407,3.134208482490942e-5,1.2454319312828303e-8,-0.0013952934212709952,3.12876940613365e-5,1.2425488800691024e-8,-0.0013947290248052181,3.1368994960239776e-5,1.2491155941132685e-8,-0.0013942677926455445,3.153656609401135e-5,1.2615901943459306e-8,-0.001393923604268954,3.173094679442987e-5,1.2757639356311874e-8,-0.0013936850245932673,3.189863660685751e-5,1.287894027262053e-8,-0.0013935243292366379,3.20005016684368e-5,1.295286703830315e-8,-0.0013934059148908537,3.2014351751696166e-5,1.2964583482053157e-8,-0.0013932926868055352,3.193431439306784e-5,1.29106853876459e-8,-0.0013931506171936453,3.176890244780789e-5,1.279767711238989e-8,-0.0013929521622677431,3.153852371658084e-5,1.2640170940633758e-8,-0.0013926789463034916,3.1272453315631026e-5,1.2458806214965603e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json new file mode 100644 index 0000000..fb9e3f3 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":4000,"numberOfSamples":1000,"samples":[-0.0013923237156324762,3.10051313115372e-5,1.227772476593132e-8,-0.0013918913030339685,3.0771749723490945e-5,1.2121506307793586e-8,-0.0013913982265213998,3.060338976954708e-5,1.2011722091998317e-8,-0.0013908707040811456,3.052231698115309e-5,1.1963565646016446e-8,-0.001390341194667023,3.053811122326968e-5,1.198311590315129e-8,-0.0013898437960375297,3.064516965374932e-5,1.206567850949141e-8,-0.0013894089283486013,3.0821985171837794e-5,1.219550046257788e-8,-0.0013890577325521491,3.103246124664618e-5,1.234697235237071e-8,-0.001388796542557306,3.12295787680487e-5,1.2487412403812631e-8,-0.0013886120720738905,3.136210718279558e-5,1.2581786671309725e-8,-0.0013884688947041909,3.1385084006792996e-5,1.2599819994917749e-8,-0.0013883119458332274,3.127360474065753e-5,1.2525244839418013e-8,-0.0013880771300425396,3.103666131759266e-5,1.2365079707027838e-8,-0.0013877108551321243,3.072388276790292e-5,1.2154123117817592e-8,-0.0013871929430152989,3.0416606360292832e-5,1.1948741207200948e-8,-0.001386550391714903,3.0201205713724095e-5,1.1808429582903155e-8,-0.0013858506737383077,3.01357997768827e-5,1.1772803776767341e-8,-0.0013851759104291312,3.0229273883448915e-5,1.1847175892297428e-8,-0.001384592881220668,3.0443874540562336e-5,1.2004550146250928e-8,-0.0013841349373795028,3.0716035009628255e-5,1.2200281016361826e-8,-0.0013838008265632472,3.098058540822912e-5,1.2389009867920565e-8,-0.0013835645353088798,3.118712181259742e-5,1.2536034707260684e-8,-0.0013833877106148682,3.130621279611001e-5,1.2621499602221395e-8,-0.0013832296076505604,3.132862793970199e-5,1.2639667607070031e-8,-0.0013830533398082588,3.12615629520694e-5,1.2596119024238894e-8,-0.0013828292717648978,3.1124447793189026e-5,1.2504739208443173e-8,-0.001382536894290198,3.094526718665489e-5,1.238515875044467e-8,-0.001382166093661862,3.0757242436986546e-5,1.2260502826500002e-8,-0.0013817180828804721,3.059536687843876e-5,1.2155030689028627e-8,-0.0013812057662645032,3.0492356610198686e-5,1.2091316281131741e-8,-0.001380652965115511,3.0473944416237442e-5,1.2086924984252354e-8,-0.0013800918794172976,3.055405387965315e-5,1.2151015510603047e-8,-0.0013795585330693598,3.073089776278415e-5,1.2281664264941277e-8,-0.0013790865545975047,3.098519781713838e-5,1.2464780864846123e-8,-0.0013787002512115332,3.128152698517288e-5,1.2675280274755086e-8,-0.0013784083744284533,3.1573186320784075e-5,1.2880703491497357e-8,-0.0013782000273174174,3.181021399913377e-5,1.3046891803617532e-8,-0.0013780438976636682,3.19495350745652e-5,1.3144947940134445E-08,-0.0013778917807731484,3.1965865743675875e-5,1.3158522917130986e-8,-0.0013776871187557247,3.186125601721507e-5,1.3090054814128084e-8,-0.0013773784345414448,3.167005542915762e-5,1.2963872114938864e-8,-0.0013769355296510653,3.145540027821075e-5,1.2823586040322064e-8,-0.0013763632310821636,3.129451925350386e-5,1.2721957602677264e-8,-0.0013757051938257864,3.12548297658547e-5,1.2704580862237566e-8,-0.0013750325167593762,3.136980980661643e-5,1.2793513871866098e-8,-0.0013744200205683455,3.162705495398507e-5,1.297932656913296e-8,-0.001373921486003332,3.197529339541822e-5,1.3226141868971426e-8,-0.0013735559011152846,3.2345581764334165e-5,1.348632479099502e-8,-0.001373308834962327,3.267443076739067e-5,1.371638565723486e-8,-0.0013731440063741707,3.2918760928589506e-5,1.3887174851188765e-8,-0.0013730169969555664,3.306017025212218e-5,1.3986670884338575e-8,-0.001372885707505598,3.310177282032628e-5,1.4017645484980559e-8,-0.0013727161916267327,3.3062157152929236e-5,1.3993385650784678e-8,-0.0013724849650755444,3.2969528124314865e-5,1.3933613214447525e-8,-0.0013721795043743403,3.2857132549704686e-5,1.3861350571725312e-8,-0.001371798199420233,3.275975393211377e-5,1.3800541749182052e-8,-0.001371350267391638,3.2710546394120883e-5,1.3773879566233536e-8,-0.0013708554660210265,3.273748651144435e-5,1.3800332746004124e-8,-0.0013703429392595617,3.285908614832062e-5,1.3892159705457934e-8,-0.0013698482842253537,3.3079732505826116e-5,1.4051723281032588e-8,-0.0013694081789119867,3.33859216188847e-5,1.4269017354682299e-8,-0.0013690527752354515,3.3745292715916165e-5,1.4521206280880815e-8,-0.0013687973523058758,3.411026251376824e-5,1.4775341685527618e-8,-0.001368635864809167,3.442685430142285e-5,1.4994571911094206e-8,-0.001368539190809793,3.464725058126877e-5,1.5146764379461272e-8,-0.0013684596653155585,3.474271507765218e-5,1.5213225547749854e-8,-0.001368341412275528,3.471292842213015e-5,1.519483961915156e-8,-0.0013681340963783179,3.458864103148684e-5,1.5113572919781048e-8,-0.001367806641243441,3.442624486265195e-5,1.50084742827696e-8,-0.0013673571913396174,3.429481060775766e-5,1.492663952720893e-8,-0.0013668159712882611,3.425816744323766e-5,1.4910976651613327e-8,-0.0013662389537410337,3.4356679623137404e-5,1.4987969233571176e-8,-0.0013656929127156684,3.45948313307106e-5,1.5159539607809455e-8,-0.0013652362239514341,3.493996318255312e-5,1.540252269790559e-8,-0.0013649025854399397,3.533339206451559e-5,1.5676457844807535e-8,-0.001364694017006319,3.5709311516460834e-5,1.5936510012581336e-8,-0.0013645848390629765,3.6013317990182196e-5,1.6146000719145376e-8,-0.001364533006244744,3.6213785847992433e-5,1.6284003030435945e-8,-0.0013644928514191061,3.630413358810897e-5,1.6346724249025713e-8,-0.0013644247321696538,3.629841553527456e-5,1.6344369702902035e-8,-0.0013643001276189908,3.622421100892573e-5,1.6296216699097295e-8,-0.0013641030557909385,3.611585301733881e-5,1.6225972675099123e-8,-0.001363829489218644,3.6009284510185593e-5,1.6158272516967093e-8,-0.0013634861732545276,3.59384398039273e-5,1.6116209694143087e-8,-0.0013630895393642458,3.593237657339973e-5,1.6119355456194334e-8,-0.0013626646638417342,3.601230966247092e-5,1.618170797397962e-8,-0.001362243629102119,3.61880268938273e-5,1.6309266089582144e-8,-0.0013618622841067652,3.64538655276576e-5,1.6497393820657673e-8,-0.0013615544772974737,3.6785502430891855e-5,1.6728827194428735e-8,-0.0013613437161679772,3.713991173468955e-5,1.697386187057922e-8,-0.001361234021080087,3.746108911824493e-5,1.719439828116546e-8,-0.0013612037638524796,3.7692536866159856e-5,1.7352457140518053e-8,-0.001361206847971344,3.779396838960132e-5,1.742144636974678e-8,-0.0013611832374142226,3.7756031020244054e-5,1.7396011201743785e-8,-0.001361076191644119,3.7606086154550635e-5,1.7295762883204998e-8,-0.0013608496577971183,3.7401677631123275e-5,1.716059227166306e-8,-0.0013604990488915285,3.721408821670011e-5,1.7039232838343093e-8,-0.0013600520125571307,3.710835900255645e-5,1.697551683056106e-8,-0.0013595600099726545,3.712640498271043e-5,1.699695432191236e-8,-0.0013590841935409244,3.727760024130748e-5,1.71086275657347e-8,-0.001358679890204125,3.7538440708709115e-5,1.7293378278633092e-8,-0.00135838372132039,3.7860514706880266e-5,1.7517577456580113e-8,-0.0013582064390924846,3.818407848658802e-5,1.7740504047095585e-8,-0.0013581329272131877,3.845318903981301e-5,1.7924558906917483e-8,-0.0013581286541984837,3.862806850028087e-5,1.804345582610699e-8,-0.0013581498661130592,3.869159882723496e-5,1.8086397228283904e-8,-0.0013581539476281528,3.8649261142348775e-5,1.8057850041261867e-8,-0.0013581071226586598,3.8524189345567815e-5,1.7974088393725628e-8,-0.0013579883897526658,3.835008509330396e-5,1.7858356144320932e-8,-0.00135779018044884,3.8164384929534315e-5,1.7736239335068338e-8,-0.001357517027048097,3.800295694389865e-5,1.7632074255281237e-8,-0.0013571835099064594,3.789645286761099e-5,1.7566453802397066e-8,-0.0013568122323385436,3.786770844912354e-5,1.7554432313878906e-8,-0.0013564319146861178,3.792940545542113e-5,1.760394100218013e-8,-0.0013560751230173448,3.808144637277682e-5,1.771409396726125e-8,-0.001355774723096159,3.830809315615486e-5,1.7873437098055103e-8,-0.0013555581129589143,3.85759738967685e-5,1.805883775217439e-8,-0.0013554390847187276,3.883530834118127e-5,1.8236503204011578e-8,-0.001355409076240439,3.9027250633763036e-5,1.836699003058032e-8,-0.0013554321238842734,3.909874292882928e-5,1.8415131641263553e-8,-0.0013554490528045462,3.90218298649933e-5,1.836291168093209e-8,-0.0013553934777036426,3.88088274293409e-5,1.8219570358978306e-8,-0.0013552148739573212,3.8513364752411945e-5,1.8022193158569097e-8,-0.0013548976458011926,3.821394753241361e-5,1.7824422483376295e-8,-0.0013544662886432806,3.7987376502045904e-5,1.767824374087245e-8,-0.001353975167144596,3.788495877740173e-5,1.7617747380746665e-8,-0.0013534897169433626,3.792082265498023e-5,1.765132964873523e-8,-0.0013530679623867672,3.807359000944715e-5,1.776318309780284e-8,-0.0013527479846985185,3.82970266342332e-5,1.7920945154219862e-8,-0.0013525427737545379,3.8534126622979775e-5,1.8085549434599747e-8,-0.0013524413684721215,3.8730475725509086e-5,1.8220348872787433e-8,-0.0013524143580498815,3.8844550459139665e-5,1.829793515757917e-8,-0.0013524218120327396,3.885388259987187e-5,1.830403299861606e-8,-0.0013524218425320289,3.8756778190668846e-5,1.8238389323156565e-8,-0.0013523781464381873,3.857000249417001e-5,1.8113029207340084e-8,-0.0013522652859119853,3.832360437107422e-5,1.7948697828581297e-8,-0.0013520711816035556,3.805446144349454e-5,1.7770522740602527e-8,-0.0013517970474576544,3.7800026057570636e-5,1.760383303417335e-8,-0.0013514555502732262,3.759328234789039e-5,1.7470765883749638e-8,-0.0013510681406707162,3.745922197053802e-5,1.7387859156658665e-8,-0.0013506622145259056,3.741251692416933e-5,1.7364450412879974e-8,-0.0013502682953014952,3.7455843878886433e-5,1.7401577299135237e-8,-0.0013499170098815133,3.757843888576176e-5,1.749114206947162e-8,-0.0013496352319221148,3.775487577483726e-5,1.7615323797154796e-8,-0.001349440649488639,3.794495617766193e-5,1.7746750386563e-8,-0.0013493347424008647,3.809671819615431e-5,1.7850659872577422e-8,-0.001349295890582923,3.8155046902679206e-5,1.7890635669466993e-8,-0.0013492766959825838,3.807708327935155e-5,1.783874654599152e-8,-0.0013492110735612106,3.785133903622449e-5,1.768815260529381e-8,-0.001349033855976422,3.751108479626499e-5,1.7461969909133265e-8,-0.0013487069795288752,3.71303580506857e-5,1.7210535401503925e-8,-0.0013482379377772538,3.67993136705882e-5,1.6994726215196717e-8,-0.001347678208637462,3.659042766946213e-5,1.6863046213677397e-8,-0.0013471024913643088,3.6534216931232214e-5,1.6835204236635903e-8,-0.0013465817610538201,3.661531138061667e-5,1.6899639174625656e-8,-0.0013461637307948591,3.67855921967629e-5,1.702274689456107e-8,-0.0013458659040266978,3.698362593147122e-5,1.716236688366139e-8,-0.0013456786096961092,3.715150481672573e-5,1.7279353443021854e-8,-0.0013455729607305563,3.7245547989349e-5,1.7344764650321256e-8,-0.0013455098437546319,3.724113849988471e-5,1.7342896275356996e-8,-0.0013454479816408654,3.713333537401668e-5,1.7271384802952297e-8,-0.0013453504339775678,3.693472237791048e-5,1.7139497446621565e-8,-0.0013451893773290563,3.66714125531848e-5,1.69653115025737e-8,-0.001344949053305138,3.6377906041960216e-5,1.677225728879621e-8,-0.0013446268270830342,3.6091487557028635e-5,1.658542561013439e-8,-0.0013442324429496473,3.584683872566402e-5,1.642801203779135e-8,-0.0013437858000863968,3.567151610583387e-5,1.6318286339007397e-8,-0.0013433138090793446,3.5582718952246464e-5,1.6267381969080993e-8,-0.0013428468552322856,3.5585336135370534e-5,1.6277959343087233e-8,-0.0013424151246411572,3.567102736278635e-5,1.6343650045473796e-8,-0.0013420448217986622,3.581815905326798e-5,1.6449191850671144e-8,-0.0013417540843769415,3.5992621037087415e-5,1.6571231526067074e-8,-0.0013415482762467888,3.6150103914661236e-5,1.6680073457991738e-8,-0.0013414149103668283,3.624123041516313e-5,1.6743183400191018e-8,-0.0013413198868642417,3.622112481074397e-5,1.6731446982117347e-8,-0.00134120845189209,3.606369069563323e-5,1.662842184473864e-8,-0.0013410151654745213,3.577732086480887e-5,1.644054815603201e-8,-0.0013406846000409867,3.5413460407537786e-5,1.6202722853245097e-8,-0.0013401964609990825,3.505743910760731e-5,1.597215167212452e-8,-0.001339580425708274,3.479926151774641e-5,1.5808809507200667e-8,-0.0013389081886428587,3.4697739505285814e-5,1.5751417893888703e-8,-0.0013382653066040724,3.475913717423584e-5,1.5803205836748927e-8,-0.0013377198411129057,3.494136132320177e-5,1.593492656261746e-8,-0.0013373043650111932,3.517656334298736e-5,1.610030358752367e-8,-0.001337015439682562,3.5396327466275055e-5,1.6253166407767607e-8,-0.0013368239990238354,3.5548502293726705e-5,1.6358821610884963e-8,-0.0013366882809558854,3.560374914900627e-5,1.639832805964985e-8,-0.001336564467218173,3.55549452941308e-5,1.636783817572624e-8,-0.001336413776905145,3.541320348266067e-5,1.627564290331889e-8,-0.0013362066349266496,3.520293709170862e-5,1.6138666700184393e-8,-0.0013359249232274644,3.4956909941254224e-5,1.5979096337218204e-8,-0.001335562924155841,3.4711420854670354e-5,1.582122151313896e-8,-0.0013351271377057652,3.4501629448674695e-5,1.568840971408109e-8,-0.0013346349529169633,3.435711455278746e-5,1.5600199028356044e-8,-0.0013341121333342526,3.429797828590833e-5,1.5569686455152157e-8,-0.0013335892705868344,3.433199575848479e-5,1.5601580165570786e-8,-0.0013330975858291425,3.4453164621146024e-5,1.5691228226897585e-8,-0.0013326644706178011,3.464175000353744e-5,1.5824749599259128e-8,-0.0013323090899715643,3.4865868704546576e-5,1.5980301002253026e-8,-0.001332038338966892,3.508467362609938e-5,1.6130447896255385e-8,-0.0013318434113794785,3.525330077002587e-5,1.6245627748951825e-8,-0.0013316975322695253,3.5330051294305984e-5,1.629891139049964e-8,-0.001331556286785722,3.528619312938393e-5,1.6272293810409786e-8,-0.0013313628892067757,3.5117465072944155e-5,1.6163989779264318e-8,-0.0013310606240185723,3.485372509921916e-5,1.5994525193249938e-8,-0.001330612092239529,3.4560074860567006e-5,1.5807325007709106e-8,-0.0013300188819388664,3.432251695865668e-5,1.5659203035008636e-8,-0.0013293294672254824,3.4218415257834896e-5,1.5600856484188996e-8,-0.0013286258106659328,3.4284781738908746e-5,1.565595284409048e-8,-0.0013279927272366466,3.45034557497139e-5,1.5811466092247673e-8,-0.001327487245815521,3.481218305757908e-5,1.6025241776050835e-8,-0.0013271243297834456,3.5132573390047304e-5,1.6244759544611692e-8,-0.0013268819281744182,3.539726971412401e-5,1.6425301589944376e-8,-0.0013267165573191055,3.556482846968116e-5,1.6539830337867083e-8,-0.0013265791200544272,3.5621827657685704e-5,1.65802341767557e-8,-0.0013264257556151145,3.5577571686315266e-5,1.6553560503722946e-8,-0.0013262233226004878,3.5456646993180176e-5,1.6476832678516347e-8,-0.0013259512363842734,3.529220284957108e-5,1.637245418374682e-8,-0.001325601512184336,3.512067149730725e-5,1.626470172512635e-8,-0.0013251780734556981,3.497753493359976e-5,1.6177001160356565e-8,-0.0013246955832461917,3.4893601735033355e-5,1.6129548566876927e-8,-0.0013241776457557696,3.48914999010468e-5,1.6137021291032074e-8,-0.001323654076904617,3.4982458503977466e-5,1.6206426975212878e-8,-0.001323157041794967,3.5163901163299414e-5,1.633548781930137e-8,-0.0013227162371304468,3.5418581049974166e-5,1.651211397605036e-8,-0.001322353687199993,3.571581068946272e-5,1.6715367990939248e-8,-0.0013220789387146789,3.601504810064792e-5,1.6918061706656873e-8,-0.0013218855424575772,3.627176280866538e-5,1.7090842854582353e-8,-0.0013217496703317407,3.644508967537851e-5,1.720733490398808e-8,-0.0013216315923340778,3.65064979819164e-5,1.7249749168249524e-8,-0.0013214807524120568,3.644842841848515e-5,1.7214291107647377e-8,-0.0013212451222116156,3.6291038759722376e-5,1.711523751546295e-8,-0.0013208846495029996,3.60839095678969e-5,1.6985751198887913e-8,-0.0013203863550454039,3.5898854230369885e-5,1.6873006904681262e-8,-0.0013197752519399667,3.581166273538234e-5,1.682623169287687e-8,-0.0013191132255276836,3.587626651540886e-5,1.6879911863534467e-8,-0.0013184815790603076,3.610241659999537e-5,1.7039381967031404e-8,-0.0013179528033887597,3.645020189165614e-5,1.7277474450637978e-8,-0.0013175658344386403,3.684610326885073e-5,1.7545256584706124e-8,-0.0013173174371027003,3.721139594219093e-5,1.7790800848516823e-8,-0.0013171711591591722,3.7487162393554715e-5,1.797564920289059e-8,-0.0013170751083556422,3.764583818573417e-5,1.8082333520008842e-8,-0.0013169783809209286,3.768958704883004e-5,1.8113134460390254e-8,-0.001316841058972772,3.764169488899078e-5,1.8084193168326844e-8,-0.001316637900558923,3.7536910324560003e-5,1.8018963620713753e-8,-0.0013163581227781179,3.74137736701684e-5,1.7943079177386814e-8,-0.0013160036253867771,3.730942928907114e-5,1.7880963442603383e-8,-0.0013155869869080489,3.725613444561233e-5,1.7853614375631473e-8,-0.0013151295414577234,3.7278505354125304e-5,1.787686235519351e-8,-0.0013146592408699255,3.7390914042800114e-5,1.7959684433815758e-8,-0.0013142077768859126,3.759497729467439e-5,1.8102557862085905e-8,-0.0013138065061219567,3.787768395385184e-5,1.829626511989185e-8,-0.0013134811566555547,3.821118959139425e-5,1.852186865762894e-8,-0.0013132460042088404,3.855535190871637e-5,1.8752556581883928e-8,-0.0013130988888896927,3.886358760935178e-5,1.895768052314085e-8,-0.0013130187880983333,3.9091668685304416e-5,1.9108648012779857e-8,-0.0013129673945528086,3.920788927157972e-5,1.9185567048502283e-8,-0.001312895240496861,3.920217618512819e-5,1.918302681873874e-8,-0.001312751730863596,3.9091588709663886e-5,1.911338071545348e-8,-0.0013124973851131767,3.892009752658912e-5,1.9006243630838438e-8,-0.0013121156803837925,3.875132474201483e-5,1.8903462645629538e-8,-0.0013116210944716046,3.865427657691962e-5,1.884969011796569e-8,-0.0013110596023093825,3.868436788208665e-5,1.8880112079492577e-8,-0.0013104989534392041,3.8865074759319735e-5,1.9008779400316116e-8,-0.0013100096397849926,3.917783531577995e-5,1.9222392671536106e-8,-0.001309642829716195,3.9566441267412706e-5,1.9483464693369486e-8,-0.0013094148936341004,3.995569860122959e-5,1.974262974906959e-8,-0.0013093055437344233,4.027611457180882e-5,1.9954738594955732e-8,-0.001309269039156997,4.048329051082387e-5,2.0091415425642147e-8,-0.0013092512762208149,4.0565121305456764e-5,2.0145608286767512e-8,-0.001309204630257768,4.053753924890765e-5,2.012862157893427e-8,-0.0013090962818779034,4.043433842048082e-5,2.0063277178960123e-8,-0.0013089102465701447,4.029664197237238e-5,1.997689758602726e-8,-0.0013086455823332675,4.0164989376255385e-5,1.9896096938048397e-8,-0.0013083132488531785,4.0074480065967925e-5,1.984365052124649e-8,-0.0013079330725531747,4.005204604799757e-5,1.9836785608003348e-8,-0.0013075312073712847,4.011466197911539e-5,1.9886069633644747e-8,-0.001307137746835643,4.026767679567208e-5,1.9994358344677895e-8,-0.0013067837953618638,4.0503094151805196e-5,2.01557240211866e-8,-0.001306497350497541,4.079836018355392e-5,2.0354765247593485e-8,-0.0013062978171497592,4.111688713507512e-5,2.0567103458832157e-8,-0.0013061898867567608,4.141184316071489e-5,2.076202115095573e-8,-0.0013061586859034154,4.163420723263055e-5,2.0907824211338083e-8,-0.001306168888940125,4.174442656977121e-5,2.097944515467198e-8,-0.0013061699709006594,4.1724685296821706e-5,2.0966324787464215e-8,-0.0013061076049721034,4.1587191985985025e-5,2.0877595932876798e-8,-0.0013059383156452651,4.137443165518275e-5,2.0741958445759947e-8,-0.0013056425938951044,4.115010375057371e-5,2.060146632532868e-8,-0.0013052319085176942,4.098302152604378e-5,2.0500810520890916e-8,-0.001304747148248314,4.092874780265062e-5,2.0475326047336553e-8,-0.0013042487662768554,4.101434730128175e-5,2.0541288681716853e-8,-0.0013038012226081626,4.1230688242288156e-5,2.0691321547541416e-8,-0.0013034559571685768,4.153480564579156e-5,2.0896370294196396e-8,-0.0013032379646765557,4.186207205593781e-5,2.111390047210881e-8,-0.0013031404096450596,4.214456168589532e-5,2.1299885763046148e-8,-0.0013031290193728036,4.232935992827865e-5,2.1420571741681682e-8,-0.0013031540596875038,4.23905340975399e-5,2.1460031357444974e-8,-0.0013031647722243158,4.233156537247573e-5,2.1421513055924925e-8,-0.0013031210288061141,4.217942322107834e-5,2.132339132411696e-8,-0.0013029993698451085,4.19743987627646e-5,2.1192421768565933e-8,-0.0013027936105723457,4.175999540557228e-5,2.1057114924379603e-8,-0.0013025120277159838,4.157542941681899e-5,2.094288448231488e-8,-0.0013021733414850117,4.145125605159004e-5,2.0869268627645957e-8,-0.001301802931785606,4.1407329810052036e-5,2.08486684580033e-8,-0.0013014297605223135,4.1451908374797514e-5,2.0885812894513818e-8,-0.001301083724057496,4.158098532303902e-5,2.097737756976615e-8,-0.0013007927456693646,4.177756479690925e-5,2.1111607157953057e-8,-0.0013005788777021498,4.201134797256275e-5,2.126826146359011e-8,-0.0013004531008736547,4.224008178027535e-5,2.1419659516259312e-8,-0.0013004095063849311,4.241435176037529e-5,2.1533904163364884e-8,-0.001300421059288809,4.248719684661846e-5,2.1581120022324038e-8,-0.0013004404355749176,4.2427837091928494e-5,2.154224223145945e-8,-0.0013004089398097013,4.223528221728633e-5,2.1417667998620045e-8,-0.001300273032166463,4.194483810430357e-5,2.1231287584532605e-8,-0.0013000028044365167,4.162178844603964e-5,2.1026176296912758e-8,-0.0012996038559836165,4.13426408192214e-5,2.0852193780685487e-8,-0.0012991166051237216,4.117141562699113e-5,2.075042537733095e-8,-0.0012986036072820868,4.11409724530234e-5,2.0741091404972655e-8,-0.00129813093698426,4.1245817779201306e-5,2.0819172199719124e-8,-0.0012977508063343123,4.144686388868798e-5,2.095795336418839e-8,-0.001297490230837804,4.168441992169005e-5,2.1117875653405696e-8,-0.0012973474395914163,4.1894427134593377e-5,2.1257279803455193e-8,-0.001297295439153459,4.2023506126082147e-5,2.1342116234441085e-8,-0.001297290782074011,4.2039616230905444e-5,2.135260920238544e-8,-0.0012972848326498105,4.193654440887813e-5,2.1285844007437435e-8,-0.0012972345579685953,4.173200901824314e-5,2.1154255926592056e-8,-0.0012971103085002236,4.146082617494708e-5,2.0981029477300475e-8,-0.0012968992859630204,4.116578087591e-5,2.0794135694006106e-8,-0.0012966049398672192,4.0888917956883526e-5,2.062073980233298e-8,-0.0012962436295018886,4.066503581169255e-5,2.048307865442981e-8,-0.0012958401889284622,4.051793533458231e-5,2.039611146731544e-8,-0.0012954236654983476,4.045897416475759e-5,2.036662737785466e-8,-0.001295023782419015,4.0486965044612695e-5,2.039320583348045e-8,-0.0012946679941183582,4.058855472756083e-5,2.04665171281949e-8,-0.001294378612670228,4.0738730472340536e-5,2.056977240662803e-8,-0.0012941693814056939,4.0901748941956324e-5,2.0679500965812705e-8,-0.0012940411451917645,4.1033526442706687e-5,2.0767257575044023e-8,-0.0012939771911233996,4.108715604463087e-5,2.0803239961642293e-8,-0.0012939403977219072,4.102298074380838e-5,2.0762689854466084e-8,-0.0012938758566673656,4.082263405184535e-5,2.0634736809638925e-8,-0.0012937224662835883,4.050242606522025e-5,2.04308134609819e-8,-0.0012934330065076513,4.0117530900919203e-5,2.0187204767311665e-8,-0.00129299496709262,3.974958987689844e-5,1.995693470396842e-8,-0.0012924399284722028,3.947942732467301e-5,1.97920270271869e-8,-0.0012918341252307118,3.935776650460108e-5,1.9724509449887175e-8,-0.0012912547182092019,3.938930857514804e-5,1.97562193674393e-8,-0.001290764690673244,3.9536318616132313E-05,1.9861433777957795e-8,-0.0012903973760540492,3.973598386964465e-5,1.999850762256767e-8,-0.001290153512484858,3.992107605315687e-5,2.0123564778314824e-8,-0.0012900074223779303,4.003630507822636e-5,2.0201177921784495e-8,-0.0012899173653183767,4.0047651738485965e-5,2.0210256251888748e-8,-0.001289836338458807,3.9945200597234635e-5,2.0145554957262593e-8,-0.0012897212998023743,3.9741174964429464E-05,2.0016045030261284e-8,-0.0012895399514628268,3.946480109359224e-5,1.984132894245313e-8,-0.001289274703109967,3.915530609271689e-5,1.9647018285539673e-8,-0.0012889236983102278,3.885435148165427e-5,1.9459904493796818e-8,-0.0012884992067051736,3.8599204907948656e-5,1.9303690980758627e-8,-0.0012880241094008248,3.841760919532316e-5,1.919581678542283e-8,-0.0012875274288492854,3.832480054634275e-5,1.9145604099175267e-8,-0.0012870398381923532,3.8322598965528926e-5,1.9153682307136752e-8,-0.001286589752637628,3.840001624621069e-5,1.921238243257403e-8,-0.001286200095515784,3.853470660398659e-5,1.9306731004946026e-8,-0.0012858854886256378,3.86948874374072e-5,1.9415831342562718e-8,-0.001285649499877651,3.8841815281819475e-5,1.9514646939711093e-8,-0.0012854817125208561,3.893347048250045e-5,1.9576511347082232e-8,-0.0012853550995704204,3.893063802338816e-5,1.957702413451274e-8,-0.0012852255062502298,3.880636244566652e-5,1.9499927026725242e-8,-0.0012850362965845573,3.855807120421911e-5,1.9344575221523857e-8,-0.0012847311762881526,3.821819412132976e-5,1.9132471126811794e-8,-0.0012842747415224602,3.785512960173213e-5,1.8907745295762985e-8,-0.0012836727720354248,3.755682902569352e-5,1.8726620068053298e-8,-0.0012829784848701268,3.739895052372073e-5,1.863702330001396e-8,-0.0012822761530718633,3.7413406126274804e-5,1.86584821716486e-8,-0.0012816490975353263,3.7576622715437714e-5,1.8774747376732938e-8,-0.0012811506382189232,3.782352818577273e-5,1.8943030423325083e-8,-0.001280792436308164,3.8075703038799706e-5,1.9112370169816575e-8,-0.0012805506354879592,3.8266803390174146e-5,1.924016463208864e-8,-0.001280380738437669,3.835616719714332e-5,1.9300925603521577e-8,-0.0012802324630361284,3.833113206068958e-5,1.9287565495948508e-8,-0.0012800605197691444,3.820264194508425e-5,1.920823586964087e-8,-0.0012798308757682997,3.799830026151315e-5,1.9081529959526996e-8,-0.001279523586304221,3.775524645033635e-5,1.8931707405877297e-8,-0.0012791333774328948,3.751366233471992e-5,1.8784512978711527e-8,-0.0012786686262423056,3.731102412992637e-5,1.866362274807214e-8,-0.001278148993439162,3.717726455085912e-5,1.858772206348688e-8,-0.001277601942460214,3.7131143654458575e-5,1.8568311190285357e-8,-0.001277058498171101,3.717813474632904e-5,1.860839408251708e-8,-0.0012765487555219646,3.7310038774287194e-5,1.8702216632045073e-8,-0.0012760977084929888,3.750624505138479e-5,1.8836075192321827e-8,-0.0012757217769639956,3.773626898786361e-5,1.8990020553034313e-8,-0.0012754261510291623,3.796321117292025e-5,1.9140234836138346e-8,-0.0012752029370164196,3.814797161205375e-5,1.92619071682081e-8,-0.0012750300928311285,3.825433491231409e-5,1.9332571089335484e-8,-0.0012748715426223701,3.825537269909844e-5,1.933609650898041e-8,-0.0012746797344262949,3.814138317428424e-5,1.926746861138821e-8,-0.0012744025805871105,3.7928235466975745e-5,1.9137729803848053e-8,-0.0012739963106319753,3.76626292022581e-5,1.897701998328715e-8,-0.0012734431088101711,3.741827327675125e-5,1.8832033009774208e-8,-0.0012727667106644165,3.7277449564075795e-5,1.875439150470419e-8,-0.0012720341118107905,3.730026444876515e-5,1.8781318347441222e-8,-0.0012713356167803904,3.749648014380484e-5,1.8917966913490027e-8,-0.0012707503868975216,3.7818967997163176e-5,1.913345694695096e-8,-0.0012703173742792029,3.818460780063819e-5,1.937431495323869e-8,-0.0012700276843224567,3.850870965846999e-5,1.958648929745315e-8,-0.0012698377681131297,3.873234768920965e-5,1.9732821725893906e-8,-0.0012696906468235986,3.883226562099348e-5,1.9799315570624595e-8,-0.0012695333572401244,3.881646913695297e-5,1.9792123553590806e-8,-0.0012693264687479164,3.8713735516634753e-5,1.9730552119127156e-8,-0.0012690470332673868,3.856312435152506e-5,1.9640099461015192e-8,-0.0012686878191508922,3.840594630060172e-5,1.9547213377593627E-08,-0.0012682550883168057,3.8280251328920796e-5,1.9475836828836382e-8,-0.0012677659821863632,3.8216972883763434e-5,1.9445125675948716e-8,-0.0012672456478990807,3.823702573972687e-5,1.9467782522189376e-8,-0.0012667239315270157,3.834915450270301e-5,1.954879813655444e-8,-0.0012662315252516165,3.8548712365379255e-5,1.9684700622829385e-8,-0.0012657956741872701,3.881779556352557e-5,1.9863631777743846E-08,-0.0012654358895180374,3.9127111421915734e-5,2.0066562567351532e-8,-0.0012651603219259492,3.943960149495701e-5,2.0269701099621573e-8,-0.0012649633922718845,3.97155188282893e-5,2.044787773900412e-8,-0.0012648251191054683,3.991847051986315e-5,2.0578512385264233e-8,-0.0012647124020133814,4.002181530954318e-5,2.0645672703362345e-8,-0.0012645824423290432,4.0014854271467307e-5,2.0643806946391964e-8,-0.001264388687972703,3.99081829052254e-5,2.0580779083148893e-8,-0.001264089784429187,3.973682895821391e-5,2.0479457047750557e-8,-0.0012636612589438738,3.955863316563664e-5,2.0376410433125773e-8,-0.001263107692385635,3.944474943991824e-5,2.031587286383709e-8,-0.0012624700916807313,3.9460627398303827e-5,2.0337965483915675e-8,-0.0012618210646095807,3.9641206055020366e-5,2.0463436185732815e-8,-0.0012612438544760331,3.997186027742948e-5,2.0682014530823786e-8,-0.0012608019231333165,4.03889145758586e-5,2.095293879084057e-8,-0.001260515403514942,4.080331509500292e-5,2.1219900523197546e-8,-0.0012603580066779792,4.1134769690694334e-5,2.143251915066937e-8,-0.0012602736669382706,4.133709908764442e-5,2.156229199212994e-8,-0.0012602001674625438,4.140455790552599e-5,2.1606510199617428e-8,-0.0012600871138250655,4.13627425982667e-5,2.1582334626039323e-8,-0.0012599037723692542,4.125395520943257e-5,2.1517286350261602e-8,-0.001259639059405887,4.112448324373034e-5,2.1440993984703374e-8,-0.0012592978126801822,4.1016374406620794e-5,2.1379934028673295e-8,-0.0012588963729254486,4.096310517242658e-5,2.1354792900167895e-8,-0.0012584587728795547,4.0987516848376617e-5,2.13793433801656e-8,-0.0012580135545439072,4.110070043061135e-5,2.145990419081642e-8,-0.001257590729174874,4.130124851631068e-5,2.1594960240885516e-8,-0.0012572184068382751,4.1574933436424366e-5,2.1774990856265992e-8,-0.0012569188758809874,4.1895365866185666e-5,2.198290829395347e-8,-0.0012567044061644376,4.2226400284913416e-5,2.2195638913385633e-8,-0.0012565736154616957,4.252676325544257e-5,2.2387154231576545e-8,-0.0012565095347204847,4.275674007069808e-5,2.2532803702984725e-8,-0.001256480413149145,4.2886024148070224e-5,2.261430451888185e-8,-0.0012564438185601924,4.290116127527485e-5,2.262433259898739e-8,-0.0012563537977570908,4.2810748157597085e-5,2.256953566001536e-8,-0.0012561701266762151,4.264685474788228e-5,2.2471059965738813e-8,-0.001255868216795208,4.246161786198218e-5,2.2362052663867524e-8,-0.00125544775922725,4.2318356345838705e-5,2.2281882031267264e-8,-0.0012549374800614776,4.22774052795677e-5,2.226731056823057e-8,-0.0012543928884045982,4.237873413357958e-5,2.2341924508824796e-8,-0.0012538846382849707,4.262624486160383e-5,2.2506767656905367e-8,-0.0012534783871114205,4.2981135163356555e-5,2.2736596297391955e-8,-0.0012532126561929605,4.3370682260662835e-5,2.2985558206766268e-8,-0.0012530852538086268,4.3711798272939364e-5,2.3201876301994538e-8,-0.0012530559769681426,4.393918260812166e-5,2.3345305957001018e-8,-0.0012530638749481211,4.4024288239515566e-5,2.3398863033464984e-8,-0.0012530490271740113,4.3977672971138264e-5,2.3370162208987406e-8,-0.0012529684380834512,4.383778762251783e-5,2.3284209882351702e-8,-0.0012528018888721966,4.365500575092296e-5,2.317318439808869e-8,-0.001252549834499636,4.34782797526141e-5,2.3067930135885604e-8,-0.0012522276998212633,4.334721846604825e-5,2.2992993745712078e-8,-0.0012518599576908918,4.3288848879161106e-5,2.2964722563118695e-8,-0.0012514754687159037,4.331706400168195e-5,2.299109201556656e-8,-0.0012511041057524219,4.343305080609753e-5,2.3072114029472213e-8,-0.0012507740089569535,4.362583037811218e-5,2.3200256491004583e-8,-0.001250508740600051,4.387284960062057e-5,2.336086149484763e-8,-0.0012503238892904954,4.414121645053139e-5,2.353297738143989e-8,-0.0012502232383400124,4.439057639247119e-5,2.3691245534858623e-8,-0.0012501953913701654,4.4578519987771495e-5,2.380937649691334e-8,-0.0012502124466062187,4.466862199857083e-5,2.386522426953918e-8,-0.0012502324655709908,4.463985453790723e-5,2.38466230351851e-8,-0.0012502066668911443,4.449465916127025e-5,2.3756267679178933e-8,-0.0012500904907569506,4.4262301368479445e-5,2.3613540810084584e-8,-0.0012498556988007213,4.3995081325114545e-5,2.3451824758728542e-8,-0.0012494996714732477,4.375734202677175e-5,2.3311357072906797e-8,-0.0012490486343557058,4.360978994232384e-5,2.3229326501100328e-8,-0.0012485532799728183,4.359328030608507e-5,2.3229896399582473e-8,-0.001248077323762565,4.3716595091107244e-5,2.331696995481848e-8,-0.0012476814413027032,4.395208150458591e-5,2.3471965518926978e-8,-0.0012474066926813987,4.424143994728845e-5,2.3657815110514976e-8,-0.001247262641945451,4.4511219507711075e-5,2.3828756487483382e-8,-0.0012472248755787513,4.469382181566311e-5,2.3943301525145774e-8,-0.0012472435198697964,4.474664503382738e-5,2.3975912178036033e-8,-0.001247259506344416,4.466205719091103e-5,2.3922954185837815e-8,-0.0012472217473297215,4.446513739596869e-5,2.3801066644975018e-8,-0.0012470987187946957,4.420202198632878e-5,2.3639715221988536e-8,-0.0012468817729012385,4.392519162060175e-5,2.3471897838937096e-8,-0.0012465817445801888,4.368137901444268e-5,2.3326586331146017e-8,-0.0012462224178688196,4.3504603084736476e-5,2.3224476425034505e-8,-0.0012458339394664786,4.3413868956406416e-5,2.317671064191687e-8,-0.0012454477067935401,4.341371210977519e-5,2.318536732956266e-8,-0.001245092875503066,4.349582099726864e-5,2.3244572533892913e-8,-0.001244793861427751,4.364070138997217e-5,2.334159650208275e-8,-0.0012445680145702208,4.381919330597018e-5,2.3457855646996076e-8,-0.0012444228840729505,4.399437802864513e-5,2.35701808197754e-8,-0.0012443530695937283,4.4124913953168016e-5,2.3652983748257247e-8,-0.0012443375127046577,4.4170905959475854e-5,2.36819578137255e-8,-0.001244339050323051,4.410267397222573e-5,2.3639490947179656e-8,-0.0012443085409083597,4.391102098493597e-5,2.352090842966235e-8,-0.0012441949428326805,4.361529559426061e-5,2.3339274923289387e-8,-0.0012439599109511782,4.3264248999509696e-5,2.3125688607710063e-8,-0.0012435919172900148,4.292632418466513e-5,2.2923014333021052e-8,-0.0012431132807987672,4.2670863701421686e-5,2.2774032688701237e-8,-0.0012425758812366372,4.2547004754978845e-5,2.2708303443627026e-8,-0.001242046681417017,4.256875652229016e-5,2.273310098467663e-8,-0.0012415887940260054,4.2711639999148036e-5,2.2831736522023835e-8,-0.0012412448848635037,4.292095325018456e-5,2.2969151481539737e-8,-0.0012410276081992223,4.312771971755229e-5,2.310214052847942e-8,-0.0012409187405165644,4.3266945611404475e-5,2.3190749585606232e-8,-0.001240876179833917,4.329319757536537e-5,2.3207763152117412e-8,-0.0012408462077011405,4.3189822733976015e-5,2.314410023143346e-8,-0.001240777320283415,4.297005585476495e-5,2.3009154427995445e-8,-0.0012406317702474867,4.267059575677806e-5,2.2826536022629307e-8,-0.0012403919863629748,4.234042689642282e-5,2.26269926746929e-8,-0.0012400610415698615,4.2028799199970334e-5,2.2440951581700866e-8,-0.0012396584394359302,4.1775753442481906e-5,2.229275950494211e-8,-0.001239213642370792,4.160681735016447e-5,2.2197568374873713e-8,-0.001238759622997134,4.153164993599383e-5,2.21606545642313e-8,-0.0012383277669794706,4.154532626799311e-5,2.217831390256571e-8,-0.0012379443945620973,4.163077699858882e-5,2.223941511624005e-8,-0.0012376284470835346,4.17613701854737e-5,2.2327028899360917e-8,-0.0012373896362990083,4.190335157601163e-5,2.2420000164546246e-8,-0.001237226498897373,4.201852746249583e-5,2.2494706995441768e-8,-0.0012371242703294284,4.2068080603654364e-5,2.2527507113518604e-8,-0.0012370533291036505,4.201858038815096e-5,2.249845761104157e-8,-0.001236970018387961,4.18506164139745e-5,2.239652980094868e-8,-0.0012368223070618539,4.1568658962976625e-5,2.2225481522563593e-8,-0.0012365619116138991,4.120801712255095e-5,2.2007914498811416e-8,-0.0012361611416612153,4.083280694899721e-5,2.1783828379414836e-8,-0.001235627714205694,4.052073423663693e-5,2.1601104914924004e-8,-0.0012350082702082678,4.0337708897671565e-5,2.149979267276202e-8,-0.0012343757042772982,4.031356310619789e-5,2.1497194944095898e-8,-0.0012338050721628741,4.043155020851939e-5,2.1581628688838263e-8,-0.001233349834870539,4.063630930677973e-5,2.1717708568439122e-8,-0.0012330286624901638,4.0854394434720134e-5,2.1859385815913868e-8,-0.001232825543872876,4.1016780529853954e-5,2.1964061307544442e-8,-0.0012326994687433222,4.1075328421856106e-5,2.20027389188401e-8,-0.001232597984556413,4.1010377237678075e-5,2.196447509602127e-8,-0.0012324701701386766,4.083038763729262e-5,2.1855784862297425e-8,-0.0012322765508626758,4.0566046838917725e-5,2.1696628675659008e-8,-0.0012319949600370919,4.026131873137667e-5,2.151464212796346e-8,-0.0012316222127142264,3.996359807215556e-5,2.1339009160521587e-8,-0.0012311720726316338,3.971485937041825e-5,2.1195127901571155e-8,-0.001230670573013148,3.954524762662862e-5,2.1100877649413684e-8,-0.0012301501032358588,3.946977464651513e-5,2.1064790494578928e-8,-0.0012296436170803153,3.9487963552311815e-5,2.108595595697376e-8,-0.0012291799191749856,3.958568949318732e-5,2.1155185653788322e-8,-0.0012287803742935324,3.973818698101526e-5,2.1256853700710867e-8,-0.001228456809047748,3.991337515449703e-5,2.1370956879184295e-8,-0.0012282101383242943,4.007518264093764e-5,2.1475236423481508e-8,-0.0012280293349605576,4.0187061533075706e-5,2.1547450730279715e-8,-0.0012278906587169442,4.0216265386799466e-5,2.1568075140606426e-8,-0.001227757733952711,4.0139660658889306e-5,2.152381649965794e-8,-0.001227584040852701,3.995131561109933e-5,2.141206714008766e-8,-0.0012273199557392438,3.9670437193476325e-5,2.1245481814044025e-8,-0.0012269256617048919,3.934568255249432e-5,2.1054357934419238e-8,-0.001226387988600605,3.9049849819512705e-5,2.088324803621528e-8,-0.0012257337792927004,3.886073981427376e-5,2.077925099285005e-8,-0.001225029176986983,3.8832259555441034e-5,2.0774438780732722e-8,-0.0012243597146831978,3.897014608672804e-5,2.087118383561181e-8,-0.001223799174185458,3.922790438935534e-5,2.1039910874573118e-8,-0.0012233842237546633,3.952612757691313e-5,2.123118242844517e-8,-0.001223107335217403,3.9782946538246464e-5,2.139456934167179e-8,-0.0012229273220081428,3.993907780657064e-5,2.1494114292522025e-8,-0.001222787747765819,3.996887325239496e-5,2.1515041468992588e-8,-0.0012226337779387417,3.987869845089384e-5,2.1462498186417195e-8,-0.0012224231672501788,3.9698352797038394e-5,2.135591073507243e-8,-0.001222131287192134,3.94706075535104e-5,2.1222223071618265e-8,-0.0012217517999359017,3.924165377627985e-5,2.1089871554669243e-8,-0.0012212945943425393,3.905340977839935e-5,2.0984126176207197e-8,-0.0012207820344604945,3.8937868022761935e-5,2.0923847255017387e-8,-0.0012202442110411317,3.891356765329418e-5,2.0919587003276005e-8,-0.0012197138193019857,3.898419985757117e-5,2.0972925719657997e-8,-0.0012192212575737466,3.913919956043711e-5,2.1076902982625034e-8,-0.0012187904880345962,3.9356035455342134e-5,2.1217396945348294e-8,-0.001218436045934365,3.960367962125383e-5,2.1375213106972125e-8,-0.00121816125440768,3.9846620466140236e-5,2.1528562534707792e-8,-0.0012179574526165029,4.004903399140244e-5,2.165570613461297e-8,-0.0012178040605647724,4.0179078031285165e-5,2.1737684879836926e-8,-0.001217669467291421,4.021348370120589e-5,2.1761144819940345e-8,-0.0012175131332450237,4.014272182328031e-5,2.1721351070588032e-8,-0.001217289990042325,3.997662689165655e-5,2.162532349147562e-8,-0.0012169585457825218,3.9749007528304005e-5,2.1494297600574853e-8,-0.0012164931847068905,3.9517836703297245e-5,2.136358703249228e-8,-0.0012158983378917096,3.9356329110915773e-5,2.1277115324960004e-8,-0.0012152176438466392,3.9332104759699913E-05,2.127493647531436e-8,-0.001214528479586985,3.947928991470707e-5,2.1376600643727462e-8,-0.0012139177363669367,3.9778311663362115e-5,2.1569180758206194e-8,-0.0012134484162272517,4.015900048914238e-5,2.180933946924029e-8,-0.0012131363021741985,4.052837642935356e-5,2.2040280902569133e-8,-0.0012129497831343294,4.080665261167639e-5,2.2213672818770073e-8,-0.0012128291159121656,4.095125233841926e-5,2.230428148992462e-8,-0.001212710628911282,4.096082546243361e-5,2.2312340353820234e-8,-0.0012125440419645064,4.0864936103992574e-5,2.2257017392004202e-8,-0.0012122998065612566,4.070927702557695e-5,2.2167052698862267e-8,-0.001211969092054254,4.054291261138361e-5,2.207270204179144e-8,-0.0012115601294701622,4.04096307802744e-5,2.2000393390250897e-8,-0.0012110935055385707,4.034290695442932e-5,2.1969806882960636e-8,-0.001210597514896922,4.0363263803066746e-5,2.1992540281281542e-8,-0.001210103734529621,4.047720018381726e-5,2.2071717239761007e-8,-0.0012096427900898502,4.0677387217859966e-5,2.22022573473533e-8,-0.0012092403935229314,4.094407090176532e-5,2.237175494917936e-8,-0.0012089138646246408,4.124773087837309e-5,2.2562054742508997e-8,-0.001208669509931094,4.155294488543246e-5,2.2751575294808985e-8,-0.0012085012343950414,4.1823087158483395e-5,2.2918206290301382e-8,-0.0012083905541689021,4.20253509279023e-5,2.304245225579731e-8,-0.0012083080279941285,4.213570362400274e-5,2.3110503419034456e-8,-0.0012082161114372763,4.2143459888724324e-5,2.3116949841108062e-8,-0.0012080735324706796,4.2055159230597596e-5,2.3066900585552403e-8,-0.001207841533426535,4.189723091537656e-5,2.297724001603263e-8,-0.0012074923383279116,4.171613868549196e-5,2.2876363669851336e-8,-0.001207019283053891,4.157362669411139e-5,2.2801120538061767e-8,-0.0012064459189305014,4.1534493783767346e-5,2.2789521758592166e-8,-0.0012058286024298984,4.164656524482071e-5,2.2869009240234377e-8,-0.0012052460554162017,4.19184087749905e-5,2.3043477200400544e-8,-0.0012047743940046401,4.2307229374438395e-5,2.3286316882609802e-8,-0.0012044572585227797,4.272895499439604e-5,2.3546579750409415e-8,-0.001204288381331058,4.308962693418823e-5,2.376779519103741e-8,-0.0012042176630236775,4.332107815521141e-5,2.390938507508682e-8,-0.0012041753802073372,4.340093341660907e-5,2.3958706867713977e-8,-0.00120409843142815,4.335014281596996e-5,2.3929491995290315e-8,-0.0012039461046134032,4.3216266495513626e-5,2.3851510393422998e-8,-0.0012037033879847602,4.305483536435831e-5,2.3758982441867673e-8,-0.001203376539335363,4.291599030590616e-5,2.368228317218689e-8,-0.00120298613557427,4.283755592078561e-5,2.364376268900528e-8,-0.00120256066507784,4.2842730196850536e-5,2.365655954004364e-8,-0.0012021315896690958,4.29401323049733e-5,2.3724918753893763e-8,-0.0012017295357681474,4.3124764351869256e-5,2.384500705422323e-8,-0.0012013810188355309,4.3379445958178134e-5,2.400589014719376e-8,-0.0012011053959982453,4.367684303151363e-5,2.4190760318183176e-8,-0.0012009120711434845,4.3982426851927915e-5,2.4378686124360526e-8,-0.001200798320179096,4.4258666524398955e-5,2.4547135559008024e-8,-0.0012007483813156155,4.447035815567847e-5,2.4675237441635286e-8,-0.0012007344048218429,4.45904789956841e-5,2.4747373111654414e-8,-0.0012007195396916456,4.4605667043112055E-05,2.475647427648304e-8,-0.0012006630679124704,4.4520319606676825e-5,2.4706349244549025e-8,-0.0012005271433299393,4.435834252862902e-5,2.4612444809990292e-8,-0.0012002844344340745,4.416178423355356e-5,2.450065938028214e-8,-0.0011999257549066937,4.39856842762662e-5,2.4403951995426074e-8,-0.0011994662184232547,4.3888471317910234e-5,2.435650342589999e-8,-0.001198947460842372,4.3917923813857226e-5,2.43855173915342e-8,-0.001198432684587654,4.409482178445086e-5,2.4501884310528832e-8,-0.0011979921332492878,4.43998509534339e-5,2.469284335350204e-8,-0.00119768078598594,4.4772044938470945e-5,2.492136091235081e-8,-0.0011975168459692923,4.512476493318901e-5,2.5135693210741254e-8,-0.00119747326559844,4.53756385533257e-5,2.528710231716238e-8,-0.0011974888649364393,4.547604253094459e-5,2.5347319618533324e-8,-0.0011974930862349044,4.542451975687877e-5,2.5316491092253453e-8,-0.0011974302262546881,4.525952548655604e-5,2.5218719541367353e-8,-0.0011972721728209824,4.5039793706352555e-5,2.509006550443868e-8,-0.0011970183063790395,4.48245155389913e-5,2.4966396418741908e-8,-0.001196687932279745,4.4660550904328974e-5,2.487559033145641e-8,-0.0011963111623788396,4.457738285834904e-5,2.4834604037411308e-8,-0.0011959215436754737,4.45871920184613e-5,2.4849769736576936e-8,-0.0011955511692190652,4.468712727908596e-5,2.4918432734679642e-8,-0.0011952275920148667,4.486193679281758e-5,2.5030717037665653e-8,-0.001194971551310585,4.508639373150898e-5,2.5171047327290172e-8,-0.001194794863314542,4.5327777567539424e-5,2.5319623085596163e-8,-0.001194698341899172,4.554901617532855e-5,2.5454274898017947e-8,-0.0011946701458042791,4.5713081220382614e-5,2.555310251854561e-8,-0.0011946854231435274,4.5788787339589856e-5,2.5597980508971714e-8,-0.0011947082714650892,4.575734391539159e-5,2.5578493326096783e-8,-0.0011946966519119835,4.561819225984636e-5,2.5495358009355167e-8,-0.0011946100335258174,4.539218001394653e-5,2.536213072497259e-8,-0.0011944184455051122,4.512031317912244e-5,2.5204163446924352e-8,-0.0011941107653257608,4.485734384224478e-5,2.5054453515492776e-8,-0.0011936999083235803,4.466088478508766e-5,2.4946937452023213e-8,-0.0011932230592092813,4.457796164782929e-5,2.4908499047797812e-8,-0.001192735881163747,4.463180004644925e-5,2.4951402925395812e-8,-0.0011923007264965835,4.481237616870531e-5,2.506816181625162e-8,-0.001191970530689217,4.507461064861558e-5,2.523093820360962e-8,-0.0011917724140860335,4.5347229185161454e-5,2.5397066980609755e-8,-0.0011916972032087528,4.5552150560644986e-5,2.552053976524705e-8,-0.0011917008223672682,4.5628853227269786e-5,2.55662585680403e-8,-0.001191718836140086,4.55536438037028e-5,2.5521241678494558e-8,-0.0011916882079971906,4.534483429463704e-5,2.5397506076360736e-8,-0.0011915661764232738,4.50523352358896e-5,2.52256885925892e-8,-0.0011913387387294007,4.47385355732246e-5,2.504346293478613e-8,-0.0011910180546011024,4.446011631860293e-5,2.4884567965759092e-8,-0.0011906333941084394,4.425692301702829e-5,2.4772196056940904e-8,-0.0011902211184680275,4.414860982271032e-5,2.4717178867113547e-8,-0.0011898169790774708,4.4136455261757274e-5,2.4719329452121577e-8,-0.0011894514485054754,4.420725000515381e-5,2.4769977404092045e-8,-0.0011891472970888017,4.43372203473938e-5,2.4854416724191735e-8,-0.0011889182539292847,4.449528806773453e-5,2.4953861754942293e-8,-0.0011887678749798924,4.464592966057503e-5,2.504712463555681e-8,-0.0011886883030289687,4.4752380198887884e-5,2.5112510632544797e-8,-0.0011886592771498138,4.478098874931083e-5,2.5130424449580425e-8,-0.0011886483992062577,4.4707117457076194e-5,2.5086889829383304e-8,-0.0011886140329250244,4.4522010180780784e-5,2.4977592415005244e-8,-0.0011885119078034235,4.4238713784012066e-5,2.4811273251672534e-8,-0.0011883051844906306,4.3894051675223444e-5,2.461069041472246e-8,-0.0011879756183442926,4.354386275480496e-5,2.4409531085824178e-8,-0.0011875317045031677,4.3250911754683235e-5,2.4244998266980886e-8,-0.001187009814984017,4.306830808202916e-5,2.4147865942933328e-8,-0.0011864667588603476,4.302388062774488e-5,2.4133330210664937e-8,-0.0011859656180111609,4.3111034611001064e-5,2.4195943412766552e-8,-0.0011855592107146609,4.328925296709795e-5,2.4310387221332328e-8,-0.0011852761111206852,4.349413359054941e-5,2.443782423047731e-8,-0.0011851131455521931,4.3654131747047644e-5,2.4535986395746288e-8,-0.0011850365116463047,4.370946428713365e-5,2.4570271546609728e-8,-0.0011849914632903148,4.362784368851426e-5,2.4522773768495008e-8,-0.001184917896100419,4.341215487751708e-5,2.43964861556252e-8,-0.0011847668283073867,4.3097519747167916e-5,2.4213256739576758e-8,-0.001184512183165127,4.273915270154866e-5,2.400637699709233e-8,-0.001184154359433377,4.239606712181469e-5,2.381082880477647e-8,-0.001183715829325232,4.211673537541401e-5,2.3654834718410355e-8,-0.001183232091457753,4.193072848064575e-5,2.355508585492585e-8,-0.001182742076052658,4.184692919527811e-5,2.351593181722576e-8,-0.001182280783554334,4.185637277082278e-5,2.3531280291149167e-8,-0.0011818749650736491,4.193705913158789e-5,2.3587563717348847e-8,-0.0011815412371566454,4.20587459208501e-5,2.3666591547139997e-8,-0.001181285518418681,4.218688550045602e-5,2.374784651401943e-8,-0.0011811028444095974,4.2285853886151184e-5,2.381037385561812e-8,-0.001180977123076948,4.232217251513254e-5,2.3834703066651765e-8,-0.0011808810539391222,4.2268560697046846e-5,2.3805269882627502e-8,-0.0011807771612472478,4.2109361969074505e-5,2.3713602572318883e-8,-0.0011806214602274067,4.1846957049957275e-5,2.356200196449372e-8,-0.0011803711677501327,4.150714518977967e-5,2.3366529209186637e-8,-0.0011799963986054275,4.113978509884284e-5,2.3157162420999488e-8,-0.0011794927933482826,4.08108363408142e-5,2.2972909369344754e-8,-0.0011788890049142986,4.058504354233647e-5,2.2851491515976213e-8,-0.0011782430294203484,4.050438512482597e-5,2.2816671906510717e-8,-0.0011776263052778516,4.0571991173592686e-5,2.2868981508891815e-8,-0.0011771016155169122,4.074982996867079e-5,2.2984703383283737e-8,-0.0011767044632477951,4.097122380197114e-5,2.3123630234264177e-8,-0.0011764349839248737,4.1161829736862925e-5,2.3241707139593455e-8,-0.0011762614801303043,4.1260299791107996e-5,2.330328303434297e-8,-0.0011761320404088328,4.1232336783918625e-5,2.328924297558214e-8,-0.0011759893133244327,4.1075838938516295e-5,2.3199711124094704e-8,-0.0011757842580515552,4.081779203779472e-5,2.3051819147004552e-8,-0.001175486057786376,4.050513963720658e-5,2.2873984543674025e-8,-0.0011750866908770193,4.0192525827399625e-5,2.2698514425147638e-8,-0.0011745998913217442,3.9930000443378806e-5,2.2554401861589946e-8,-0.0011740555181366963,3.975350915748105e-5,2.2461942074838184e-8,-0.0011734914447389271,3.967996159531561e-5,2.2430123462058758e-8,-0.001172945410878914,3.970705295686038e-5,2.245677720924922e-8,-0.0011724486794790487,3.981662159239835e-5,2.2530685939862905e-8,-0.0011720222605774908,3.997974255206267e-5,2.263458529327139e-8,-0.0011716754580197422,4.0161947727554296e-5,2.274816904236688e-8,-0.0011714059108263474,4.032766224367516e-5,2.285064391621753e-8,-0.0011712002787532773,4.044378850159482e-5,2.2922839703133115e-8,-0.001171035100466492,4.048293650443117e-5,2.2949153547451752e-8,-0.0011708778846540614,4.042697766162125e-5,2.2919658210313572e-8,-0.0011706891457959967,4.0271429475899425e-5,2.2832600750891778e-8,-0.001170426728995793,4.0030416719605716e-5,2.269711830719015e-8,-0.0011700538042031948,3.9740414742010276e-5,2.253517245414926e-8,-0.0011695506069301434,3.945916078722506e-5,2.2380689483545792e-8,-0.0011689268944945577,3.9255517922141815e-5,2.227353935744273e-8,-0.001168228173677312,3.918909798715985e-5,2.224769728531718e-8,-0.0011675279781217165,3.9285907063139966e-5,2.2317220439852915e-8,-0.0011669049542857158,3.952322670802093e-5,2.24676871654407e-8,-0.0011664145207980038,3.9834885125080155e-5,2.265953681114611e-8,-0.001166070295452867,4.013563731944959e-5,2.2842517129925196e-8,-0.0011658440641923867,4.035108613749354e-5,2.2973299450432576e-8,-0.0011656808972777184,4.043846993678506e-5,2.302764914878378e-8,-0.0011655191438936243,4.039246802510346e-5,2.300366653105076e-8,-0.0011653067613803536,4.023909875147127e-5,2.291788321046429e-8,-0.001165010689103841,4.002390781978695e-5,2.2797942341975254e-8,-0.0011646197556137458,3.979940906101893e-5,2.2674938420648966e-8,-0.0011641429633779334,3.961443280877213e-5,2.2577103601577477e-8,-0.0011636049134929856,3.950632417993853e-5,2.252541402741315e-8,-0.0011630396411959254,3.9496218494349576e-5,2.253115281543781e-8,-0.001162483900516477,3.95874667786907e-5,2.2595320378682432e-8,-0.0011619709327954436,3.976699600781008e-5,2.2709638135691125e-8,-0.0011615255979191684,4.000893838449559e-5,2.2858712233979922e-8,-0.0011611613858706039,4.0279582776409567e-5,2.3022849008527116e-8,-0.001160879376169587,4.054263299169933e-5,2.3181024514051384e-8,-0.0011606687592218374,4.076394687408465e-5,2.3313608208272293e-8,-0.0011605083240079387,4.09154288041749e-5,2.3404666156265128e-8,-0.00116036847554564,4.097823517679709e-5,2.34438834621506e-8,-0.0011602136824594566,4.0945659648512586e-5,2.3428227761797474e-8,-0.0011600057215318002,4.0826012397539306e-5,2.3363471925632195e-8,-0.0011597086232655231,4.0645264473458956e-5,2.326545539839303e-8,-0.0011592962457193116,4.0447999006798314e-5,2.3160337368834338e-8,-0.00115876229853727,4.0293821820255384e-5,2.3082332980724006e-8,-0.0011581301558147067,4.0245920350732926e-5,2.3067127381392428e-8,-0.0011574563121098651,4.035081622828792e-5,2.3140425634618856e-8,-0.0011568199270357543,4.061526212816023e-5,2.3304961265381497e-8,-0.0011562968471505665,4.099409631845051e-5,2.353376588241085e-8,-0.0011559290458727804,4.140161770840252e-5,2.3776854904296303e-8,-0.0011557078806939019,4.1744238983237644e-5,2.3980097768470524e-8,-0.0011555814912751524,4.195588110422897e-5,2.4105697188319998E-08,-0.001155479481195814,4.201658493401853e-5,2.4142985129680127e-8,-0.00115533863075793,4.194919447273282e-5,2.4106395513946268e-8,-0.0011551182129401877,4.1802901903976074e-5,2.4025610864818883e-8,-0.0011548035981328402,4.163510488935334e-5,2.3934641492285587e-8,-0.0011544024679921467,4.149790402491649e-5,2.3863731188845464e-8,-0.0011539381598193543,4.143037373269924e-5,2.3834886083816383e-8,-0.0011534428504190312,4.145529592249755e-5,2.3860242372633465e-8,-0.0011529515734318722,4.157867605802834e-5,2.3942156152824156e-8,-0.001152497126030711,4.17910018793201e-5,2.407424330087287e-8,-0.00115210581430915,4.2069853360416185e-5,2.4243037050196697e-8,-0.001151794185245135,4.238365328686831e-5,2.4430139497299415e-8,-0.0011515669930675036,4.269628302794372e-5,2.461478437537122e-8,-0.0011514166348674099,4.2972125399724006e-5,2.4776661433350763e-8,-0.0011513241096236361,4.318091082678523e-5,2.4898702175336794e-8,-0.0011512612721551612,4.330181717597658e-5,2.496949457208967e-8,-0.001151194039557355,4.332656629776271e-5,2.4985098203453446e-8,-0.0011510862887999457,4.326145348232724e-5,2.4950132422663092e-8,-0.0011509043845628019,4.312830423117919e-5,2.4878096818187747e-8,-0.0011506225888506414,4.296414251839801e-5,2.4790856099194497e-8,-0.0011502295873348479,4.281860836006933e-5,2.4716871495239724e-8,-0.0011497354598191344,4.27473669523015e-5,2.4687324428481763e-8,-0.0011491767132249047,4.27998987093043e-5,2.4729297172923822e-8,-0.0011486149745644995,4.300208635109734e-5,2.4856210146960896e-8,-0.0011481242788471762,4.333890754543513e-5,2.505836780419132e-8,-0.0011477663805973333,4.37484335258334e-5,2.529978271595454e-8,-0.0011475638693054652,4.413754488074797e-5,2.552713565537854e-8,-0.0011474880690233208,4.441675095791563e-5,2.5689536506059154e-8,-0.0011474716437174161,4.4535329714636256e-5,2.5758576446798924e-8,-0.0011474381423005444,4.4496153607781065e-5,2.573686319342581e-8,-0.0011473298248947472,4.434525522139947e-5,2.5651963688180006e-8,-0.0011471206519927625,4.4148021131686344e-5,2.5542431090685233e-8,-0.0011468143867924144,4.396712744434881e-5,2.5444745012451112e-8,-0.001146435178096694,4.384958556407789e-5,2.538566338712817e-8,-0.0011460173053052653,4.382244135856911e-5,2.537984964690841e-8,-0.0011455972066733823,4.389369052636168e-5,2.543072424927479e-8,-0.001145208205189756,4.4055310810386594e-5,2.553258147049571e-8,-0.0011448771116926027,4.4286732802865605e-5,2.5672846892049696e-8,-0.001144621838537778,4.455834866317327e-5,2.5834176207532318e-8,-0.0011444496596464482,4.483524010238264e-5,2.5996533958276677e-8,-0.0011443561757723407,4.508136367107901e-5,2.6139484084071172e-8,-0.001144325302176957,4.526422796836885e-5,2.624479996609313e-8,-0.0011443306796744088,4.5359678801102835e-5,2.629920696942144e-8,-0.001144338684074093,4.535607232962796e-5,2.6296805202445227e-8,-0.0011443128443530714,4.525711697688811e-5,2.6240674007741413e-8,-0.0011442192204715602,4.5082805045375516e-5,2.6143256225398415e-8,-0.0011440321422607781,4.4868033997148654e-5,2.6025290536327584e-8,-0.0011437397009143968,4.465876200865301e-5,2.5913293776335838e-8,-0.0011433483936894827,4.450556201387472e-5,2.5835666573269417e-8,-0.0011428859132346458,4.4454301330230345e-5,2.5817407374967364e-8,-0.0011424002463549068,4.4534205124580296e-5,2.587362598157788e-8,-0.0011419527122034946,4.474530750720313e-5,2.600289980431649e-8,-0.0011416033368196802,4.505002810376823e-5,2.618294554588382e-8,-0.001141390428908636,4.5375931822066494e-5,2.6372385764556846e-8,-0.0011413123883100827,4.5634818511907473e-5,2.6521473534591453e-8,-0.001141323589395823,4.5754058078499044e-5,2.6589641295518906e-8,-0.0011413505127724332,4.570482861131677e-5,2.65614039044391e-8,-0.0011413207093381398,4.5510745451041515e-5,2.6451239643199213e-8,-0.001141188094617734,4.523323032317512e-5,2.6295158823665544e-8,-0.0011409425267060696,4.494512245552072e-5,2.613539055975473e-8,-0.0011406039242835295,4.470782444666231e-5,2.6007055239340012e-8,-0.001140209199720666,4.455976514490526e-5,2.5931497221064563e-8,-0.0011397998215520568,4.451513360626569e-5,2.591575701768682e-8,-0.001139413450043509,4.456814837601221e-5,2.595536246540539e-8,-0.0011390795966643849,4.469876670368622e-5,2.60379203690528e-8,-0.0011388178217883774,4.487777100093782e-5,2.614620234117578e-8,-0.001138637029323737,4.507087406977781e-5,2.6260499784491232e-8,-0.0011385351171898522,4.524231213375679e-5,2.636058011508952e-8,-0.001138498908997064,4.5358536475447353e-5,2.6427687830903223e-8,-0.001138504742717813,4.539239795883406e-5,2.6446876610957435e-8,-0.0011385203577618363,4.5327686077719404e-5,2.6409596426616204e-8,-0.001138508626476679,4.5163215308385346e-5,2.6316020938140107e-8,-0.001138433164520453,4.491524922861346e-5,2.617635271007851e-8,-0.0011382651611644248,4.461705208805853e-5,2.60103768433134e-8,-0.0011379901212315725,4.431475914112068e-5,2.5844832363761734e-8,-0.0011376128472153897,4.405962607495448e-5,2.5708742448517676e-8,-0.0011371591432191399,4.38977377850055e-5,2.5627459120037902e-8,-0.0011366732292220137,4.385892899825392e-5,2.561652405049774e-8,-0.0011362103950232623,4.394710877414942e-5,2.5676581411835278e-8,-0.0011358251542952108,4.413475261191414e-5,2.5790765942044402e-8,-0.0011355565320898134,4.436471443508226e-5,2.5926126309661128e-8,-0.0011354142388612493,4.456177182242592e-5,2.6040272006294392e-8,-0.0011353715564004837,4.4653360616528623e-5,2.6092925147649926e-8,-0.0011353705510015804,4.459362909579968e-5,2.605922322764486e-8,-0.0011353404038372476,4.4380227560943225e-5,2.5938971302698022e-8,-0.0011352217466509087,4.405454262243014e-5,2.5756616732937143e-8,-0.0011349852948189293,4.368490247039827e-5,2.5551578991552723e-8,-0.0011346366674042077,4.334216194977203e-5,2.5364227495662016e-8,-0.001134208126523297,4.307971922662928e-5,2.5224447033233243e-8,-0.0011337443916172296,4.292448780803408e-5,2.5146609857361533e-8,-0.0011332897864486306,4.287791196077834e-5,2.5130427988720302e-8,-0.0011328801743606684,4.292232941936807e-5,2.5164886702881576e-8,-0.0011325395437544183,4.302832693352377e-5,2.5232645329543546e-8,-0.0011322795036267984,4.316082969546979e-5,2.5313558114926845e-8,-0.0011320999644248192,4.328354167402069e-5,2.538712994851353e-8,-0.0011319900022255828,4.336233306022805e-5,2.5434328063291953e-8,-0.0011319286947636842,4.336840808418778e-5,2.5439298179225213e-8,-0.0011318863330729578,4.328188187579225e-5,2.5391365668682646e-8,-0.001131826798984989,4.309582777844892e-5,2.5287327028303578e-8,-0.0011317119237820342,4.282000536402383e-5,2.513352362103692e-8,-0.0011315081184450266,4.248267021715128e-5,2.4946745756693704e-8,-0.0011311944679122136,4.212855215251888e-5,2.47528810798855e-8,-0.001130770145740669,4.181171313272162e-5,2.458263730132284e-8,-0.0011302581872849279,4.158375073838242e-5,2.446470685820663e-8,-0.0011297031604086858,4.1480108144529596e-5,2.4418045723061402e-8,-0.001129162188693781,4.15087736209508e-5,2.4445738038119535e-8,-0.001128691235841923,4.164541695493883e-5,2.453267453652789e-8,-0.0011283303644603515,4.1837167858544846e-5,2.464812593336712e-8,-0.0011280922029762194,4.201470996660632e-5,2.4752841228200912e-8,-0.0011279572033331556,4.2109977185660934e-5,2.480903447905591e-8,-0.0011278777807429035,4.2074869072542864e-5,2.4790706388729773e-8,-0.0011277911058960631,4.189530837193729e-5,2.4691226160505966e-8,-0.0011276372138476932,4.15954194176583e-5,2.4525357679971217e-8,-0.0011273763094417542,4.1229584247699144e-5,2.4324526909304625e-8,-0.0011269987883137111,4.0865150594873515e-5,2.4126913313744505e-8,-0.0011265246487921932,4.056282496645149e-5,2.396636013648397e-8,-0.0011259939870450367,4.0362229990203176e-5,2.3864352719984643e-8,-0.0011254538280006646,4.027651035222083e-5,2.3827236887481313e-8,-0.0011249466443459084,4.029509964658356e-5,2.3848081936514294e-8,-0.0011245033782163948,4.0390924133027086e-5,2.3910968573532058e-8,-0.0011241409403492657,4.052829514471608e-5,2.3995517170635476e-8,-0.00112386263638038,4.066934213518109e-5,2.4080458369857855e-8,-0.001123659844043524,4.077852227744454e-5,2.4146059818045725e-8,-0.0011235138537491161,4.082575535334954e-5,2.417579891950277e-8,-0.0011233975399612892,4.078906093563617e-5,2.4157813543967808e-8,-0.0011232772130354719,4.065741806846923e-5,2.4086515680471002e-8,-0.0011231154772805123,4.043402590037051e-5,2.3964410167377178e-8,-0.0011228760409062776,4.0139252991621545e-5,2.380366568263808e-8,-0.0011225309508780508,3.9811507466245704e-5,2.362643573893063e-8,-0.0011220694021852218,3.9503593998477884e-5,2.3462607402847364e-8,-0.0011215052868612503,3.927276808058977e-5,2.334405693151438e-8,-0.0011208791815421717,3.916532907922445e-5,2.32959719470691e-8,-0.0011202512996662164,3.9200465609938846e-5,2.332793726446843e-8,-0.001119685750452599,3.936055511280073e-5,2.3428801926640012e-8,-0.0011192313624241938,3.959351310628623e-5,2.3568365483427852e-8,-0.0011189067970222813,3.982728786145331e-5,2.370580293829856e-8,-0.0011186957125675833,3.9990849821071303e-5,2.380156013682102e-8,-0.0011185529359586416,4.003380335406222e-5,2.382827657042045e-8,-0.0011184183604654927,3.9938559297950844e-5,2.3777363910180102e-8,-0.0011182335261142832,3.972257873820071e-5,2.365991178424167e-8,-0.0011179561348970367,3.943138742499119e-5,2.3502406776038373e-8,-0.0011175690250342211,3.9125231705559594e-5,2.333898219278873e-8,-0.0011170818909624026,3.8863484851492184e-5,2.3202592856615218e-8,-0.0011165261146400343,3.869113689297805e-5,2.3117576365828163e-8,-0.0011159450191786187,3.863070018781825e-5,2.309541688994295e-8,-0.001115382950846316,3.8680782729081375e-5,2.3134291481037248e-8,-0.0011148763323054643,3.88202433349568e-5,2.3221657136516122e-8,-0.0011144484116093652,3.9015366788503146e-5,2.333836405534532e-8,-0.0011141077300649053,3.922741200952648e-5,2.3462821981382622e-8,-0.0011138492060015412,3.941880989590515e-5,2.357433208540127e-8,-0.0011136564631223104,3.955748183796071e-5,2.3655382121537695e-8,-0.001113504398766395,3.961966181875024e-5,2.3693174947865333e-8,-0.0011133616119702572,3.9591985478981636e-5,2.3680806672121074e-8,-0.0011131929173312004,3.9473502927766754e-5,2.3618399758240768e-8,-0.001112962646214551,3.927781992830418e-5,2.3514237054040706e-8,-0.0011126396430199091,3.903476453581059e-5,2.338553477815076e-8,-0.0011122044622860591,3.878987372235069e-5,2.325794563447264e-8,-0.0011116579050496058,3.859916050478475e-5,2.3162471082326266e-8,-0.0011110277638066819,3.8517161490373446e-5,2.3128770665243614e-8,-0.0011103686318442126,3.857932217863279e-5,2.317550345585091e-8,-0.0011097504345893342,3.878498007287958e-5,2.3301147042226735e-8,-0.0011092368658773112,3.909083067031221e-5,2.348067606937274e-8,-0.001108862561025627,3.9421677057301995e-5,2.3671766690779e-8,-0.0011086207894536008,3.969541345367182e-5,2.3828789988108746e-8,-0.001108467784835197,3.9850203582443234e-5,2.3917930158623212e-8,-0.0011083400223898265,3.986149013467848e-5,2.3926558339224554e-8,-0.0011081749835332257,3.9744019406875444e-5,2.3864144977322292e-8,-0.0011079272311021648,3.954206227866765e-5,2.3756473773474773e-8,-0.0011075764036130426,3.9314276041815806e-5,2.3636846724881514e-8,-0.0011071276513506274,3.911872082508301e-5,2.353751460723729e-8,-0.001106606712234522,3.9001210256697606e-5,2.3483218868648787e-8,-0.0011060519911277476,3.8988244203939216e-5,2.3487531140898155e-8,-0.001105505670300844,3.908468395961993e-5,2.3551953376769463e-8,-0.001105005565791467,3.927568764132802e-5,2.3667339954019526e-8,-0.0011045790708096976,3.9531788880221474e-5,2.3816896490402398e-8,-0.0011042398847317478,3.9815546406795756e-5,2.397985579796228e-8,-0.0011039874767033147,4.008822786866677e-5,2.413504494817365e-8,-0.0011038086569949937,4.031539899273079e-5,2.4263827315283715e-8,-0.0011036803427045844,4.047087645509333e-5,2.4352204679952328e-8,-0.0011035726966564098,4.053916604625667e-5,2.4392162684179795e-8,-0.0011034522434320714,4.051692930416066e-5,2.438250815301555e-8,-0.0011032850399023103,4.041397991610771e-5,2.4329393420554233e-8,-0.0011030403485004744,4.0253960514007384e-5,2.424655679752155e-8,-0.001102695483905325,4.0074227905403326e-5,2.415503580398189e-8,-0.001102242193580227,3.992352368685253e-5,2.4081660659305638e-8,-0.0011016936673696796,3.985525563697915e-5,2.4055253488353385e-8,-0.0011010891641663526,3.991473667135059e-5,2.409971221190807e-8,-0.0011004912378463276,4.012168328025906e-5,2.422468321626409e-8,-0.0010999711538006204,4.045477360482803e-5,2.4417430252093232e-8,-0.0010995842055226655,4.084938248726866e-5,2.4641830821643385e-8,-0.0010993460929871167,4.121581701041971e-5,2.484844677700392e-8,-0.0010992250658169746,4.1472215284716905e-5,2.4992557013455944e-8,-0.0010991556460179283,4.1574464276116506e-5,2.505058969589844e-8,-0.0010990652089385281,4.1527398961356164e-5,2.5026265284520233e-8,-0.001098898156768374,4.1375312448001e-5,2.4945200752454744e-8,-0.0010986280334354423,4.118167475058328e-5,2.484337320183111e-8,-0.0010982574815838655,4.100937470290851e-5,2.4755843824772127e-8,-0.0010978110406426043,4.090738485072404e-5,2.4709226856153248e-8,-0.0010973257121964122,4.0904499228446404e-5,2.471836767874099e-8,-0.0010968421791160742,4.10083665738254e-5,2.4786177550209052e-8,-0.0010963977347210852,4.120779805968306e-5,2.4905329142025246e-8,-0.0010960210677344888,4.147702335351955e-5,2.506090255556026e-8,-0.0010957289251758702,4.178110279291195e-5,2.5233456325869303e-8,-0.001095524697387541,4.2081778366454555e-5,2.540215364575196e-8,-0.0010953988246681838,4.2343079153780506e-5,2.5547670181248777e-8,-0.0010953307583887954,4.253610901231246e-5,2.5654681311269465e-8,-0.0010952920447938042,4.264254236325311e-5,2.571372890267199e-8,-0.0010952499739452775,4.2656633559821643e-5,2.5722338660353446e-8,-0.0010951713587064734,4.2585944785351156e-5,2.5685421940828945e-8,-0.0010950263137780906,4.245110365085979e-5,2.5615053368196092e-8,-0.001094792159453469,4.2284683294743016e-5,2.5529653777638224e-8,-0.0010944577225138132,4.212890345796607e-5,2.5452477208888395e-8,-0.0010940280855575993,4.2031223829935575e-5,2.5409021613321293e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json new file mode 100644 index 0000000..3a71254 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":5000,"numberOfSamples":1000,"samples":[-0.001093528836966317,4.203642676149489e-5,2.5422725793163846e-8,-0.0010930072646208094,4.217440867148639e-5,2.5508574660559997e-8,-0.0010925265640548522,4.2445448281040656e-5,2.566549440168746e-8,-0.0010921498584701538,4.280927315836898e-5,2.5870776828536737e-8,-0.0010919163003251823,4.318794211770871e-5,2.6081780444674054e-8,-0.001091820523294629,4.348883154959585e-5,2.624831762871915e-8,-0.00109181029138295,4.364045659227296e-5,2.6331989440280285e-8,-0.0010918072934319603,4.362110831307491e-5,2.6321766949888615e-8,-0.0010917391971531742,4.346321105608486e-5,2.6236404835428295e-8,-0.0010915640090047574,4.323393624900339e-5,2.611370862534541e-8,-0.0010912766199280236,4.3007345034387695e-5,2.599493426705449e-8,-0.0010909009016498547,4.284299979150903e-5,2.5912727223068096e-8,-0.001090476431342811,4.277625215835485e-5,2.5885719367964947e-8,-0.0010900465218413144,4.2817753215300766e-5,2.5918503099339365e-8,-0.0010896499951765957,4.2957752709860237e-5,2.6004412180594708e-8,-0.0010893164869373976,4.3171842376795946e-5,2.612906955898042e-8,-0.0010890641035068592,4.34265580743787e-5,2.6273675178051805e-8,-0.0010888984776027527,4.3684563677071033e-5,2.6417842719480934e-8,-0.0010888129019089097,4.3909513777838174e-5,2.65421057988998e-8,-0.0010887895341848287,4.407054827337014e-5,2.663018859077577e-8,-0.0010888016920848876,4.4146217427231046e-5,2.667102788931276e-8,-0.001088817192482838,4.4127450376416946e-5,2.6660363442769395e-8,-0.0010888024752733671,4.401909753500576e-5,2.6601590837686793e-8,-0.0010887270459753056,4.383981898364833e-5,2.65056658451493e-8,-0.0010885677996571497,4.362036647066958e-5,2.639002532249307e-8,-0.0010883129235325867,4.3400346577718806e-5,2.627658759927833e-8,-0.0010879651578661836,4.322346930498476e-5,2.6188934255361087e-8,-0.001087544097987234,4.313109216854214e-5,2.6148709458164907e-8,-0.001087086674855694,4.315374123594729e-5,2.617116796712862e-8,-0.001086644066498112,4.330094126455337e-5,2.6260046435218025e-8,-0.0010862728381159504,4.3551620609182124e-5,2.640284239026193e-8,-0.00108601928226965,4.38502022017017e-5,2.656903579292576e-8,-0.0010859001135970722,4.411523709589743e-5,2.6714781887700585e-8,-0.0010858889754997796,4.426383145393484e-5,2.6795876138844725e-8,-0.0010859203351680025,4.424423453619814e-5,2.6785128110422738e-8,-0.001085913618912209,4.4058578601592776e-5,2.668460538734044e-8,-0.001085805393800295,4.376072785978275e-5,2.6524487039470494e-8,-0.0010855708545136362,4.343117507166159e-5,2.6349304657863846e-8,-0.0010852250584937636,4.314592290426317e-5,2.620071963961655e-8,-0.0010848090868554553,4.295570916633156e-5,2.6105975798650347e-8,-0.001084372654611788,4.2880291469861494e-5,2.6074830737518084e-8,-0.0010839610398885847,4.291308032542563e-5,2.6102403255115617e-8,-0.0010836081790852113,4.302959653013973e-5,2.6174200961517643e-8,-0.0010833344520610171,4.3195574161869046e-5,2.6270850944433867e-8,-0.001083146945167361,4.3373198164366636e-5,2.637160337223827e-8,-0.0010830405767407777,4.352569954505452e-5,2.645674242392391e-8,-0.0010829995124754573,4.3621083270509026e-5,2.6509425138913995e-8,-0.001082998991414148,4.363548696163819e-5,2.6517334874121295e-8,-0.0010830078695757855,4.3556232067080865e-5,2.6474252100274967e-8,-0.0010829921546684827,4.338421730365343e-5,2.638134536379059e-8,-0.0010829195457739626,4.313495597945831e-5,2.6247737743075178e-8,-0.0010827645199852117,4.2837568459182473e-5,2.6089894868217516e-8,-0.0010825131481838203,4.2531405839397756e-5,2.5929625306960433e-8,-0.0010821667257754604,4.2260415291339646e-5,2.5790800121408916e-8,-0.001081743391863589,4.2065789758412284e-5,2.5695202717475755e-8,-0.0010812771260442285,4.197779093233889e-5,2.5658116797976546e-8,-0.00108081368235774,4.2007788209395396e-5,2.5684279138019833e-8,-0.0010804030553122393,4.214188129809646e-5,2.5764875776401685e-8,-0.0010800884167244415,4.2338329128859495e-5,2.5876603076949472e-8,-0.001079892778156456,4.2531881372048156e-5,2.598424858567189e-8,-0.001079807154698478,4.264767562282009e-5,2.6048107274120274e-8,-0.0010797867060579334,4.262394191909685e-5,2.6035904077434437e-8,-0.001079760973783162,4.243610779021697e-5,2.593546226975552e-8,-0.0010796577282035234,4.210950720238184e-5,2.5761387251077892e-8,-0.00107942993302375,4.171117273294466e-5,2.555057096694696e-8,-0.001079071274203828,4.132383281774707e-5,2.5348037433669575e-8,-0.001078613065447523,4.101676275871758e-5,2.5191031444188244e-8,-0.0010781076445001167,4.082789625905243e-5,2.509930154443339e-8,-0.0010776094725232313,4.076147500814069e-5,2.507401361434535e-8,-0.0010771620659250866,4.079616385676292e-5,2.5102488709573008e-8,-0.001076792527426751,4.089624684549766e-5,2.5164595184415124e-8,-0.001076511483357941,4.102115014348993e-5,2.523807558214155e-8,-0.001076315486299618,4.1131846253385905e-5,2.530198861820359e-8,-0.00107618985214185,4.1194730844247526e-5,2.533864785318205e-8,-0.0010761111699562399,4.118418519494565e-5,2.5334821170315685e-8,-0.0010760496321073894,4.1084740905426734e-5,2.5282775112651636e-8,-0.0010759717151872302,4.089317638698599e-5,2.5181368331821842e-8,-0.0010758437806077928,4.062025720268964e-5,2.5037000465379675e-8,-0.001075636874965737,4.029124488214523e-5,2.4863872287821255e-8,-0.001075332344175619,3.994403311673042e-5,2.4682887122784044e-8,-0.0010749270772761371,3.962409533524119e-5,2.4518755050929554e-8,-0.0010744366625150808,3.937631781230898e-5,2.439541151761965e-8,-0.0010738948032005251,3.92350369958662e-5,2.433057466908826e-8,-0.0010733481764564313,3.9214698025557454e-5,2.433083409288902e-8,-0.0010728472503692334,3.930384295442124e-5,2.4388737863373705e-8,-0.0010724347731497891,3.94645175457536e-5,2.44828950313044e-8,-0.0010721343835682733,3.9638151634969455e-5,2.458148402653822e-8,-0.001071942205574794,3.9757775235519326e-5,2.4648932372444277e-8,-0.001071824440490328,3.976485588304506e-5,2.4654800605721794e-8,-0.0010717234455627444,3.962693202706781e-5,2.4582909766611626e-8,-0.0010715727554048086,3.935008138551149e-5,2.4437676459267312e-8,-0.0010713175244551965,3.8979848282591754e-5,2.4244352737564492e-8,-0.0010709326265880106,3.858785169979547e-5,2.4041693976913273e-8,-0.0010704300073954966,3.8248525783302696e-5,2.386941805332488e-8,-0.0010698520086136918,3.801636200014798e-5,2.375603419291011e-8,-0.0010692550526086402,3.791333074165718e-5,2.371227592816189e-8,-0.0010686922574283954,3.792939556885814e-5,2.3731673323543086e-8,-0.0010682017404291997,3.80320722103819e-5,2.379598347049132e-8,-0.0010678024504110503,3.8178531959137147e-5,2.3881867002065674e-8,-0.001067495548138812,3.832556322890049e-5,2.3966240581430207e-8,-0.001067268273277274,3.843582509864842e-5,2.4029501058277472e-8,-0.0010670980487706369,3.848102746680633e-5,2.4057051807740725e-8,-0.0010669558863532884,3.844342728250387e-5,2.4039967070581163e-8,-0.001066809160826231,3.8316803241082525e-5,2.3975457859135465e-8,-0.0010666243579828204,3.810746586828673e-5,2.386741669396789e-8,-0.0010663705574710293,3.7835149903862285e-5,2.3726898442079206e-8,-0.0010660241691441985,3.753288897009294e-5,2.3571997852970833e-8,-0.0010655747063436035,3.724442359481839e-5,2.3426335194630528e-8,-0.0010650302250668731,3.701779702157739e-5,2.331547794071486e-8,-0.0010644199291991467,3.68949742785659e-5,2.3261297539301097e-8,-0.001063791223981958,3.6899545236002384e-5,2.327544760228617e-8,-0.0010632000453968727,3.7026820203446666e-5,2.335429289972638e-8,-0.0010626963599818942,3.7241111127013385e-5,2.3477789197827204e-8,-0.0010623095681190381,3.748268981872828e-5,2.3613519575245354e-8,-0.0010620391726174265,3.768289862153553e-5,2.3724946388273585e-8,-0.0010618540779868658,3.7782581455481364e-5,2.3781234371721873e-8,-0.0010617006609737272,3.7748061352030124e-5,2.3765573920194672e-8,-0.0010615170480434892,3.758012724746697e-5,2.367965267011593e-8,-0.0010612495768359004,3.731371428715724e-5,2.3543130785882002e-8,-0.0010608669746345562,3.700835235428079e-5,2.3388256328231037e-8,-0.001060368182069979,3.6731912216637085e-5,2.325105313533104e-8,-0.0010597813426304625,3.654245594481344e-5,2.316169727120985e-8,-0.0010591544075762823,3.647402066316346e-5,2.313718174627855e-8,-0.0010585410167500333,3.653074230958909e-5,2.317853751683003e-8,-0.001057986920975386,3.669012758790272e-5,2.327290785733631e-8,-0.0010575211579176061,3.691257472653399e-5,2.339881300069309e-8,-0.001057153350837812,3.715260399430297e-5,2.3532138314401993e-8,-0.0010568758374386459,3.736812754225494e-5,2.365093104713143e-8,-0.0010566681914793606,3.752620921432137e-5,2.3738273286109503e-8,-0.0010565020401735535,3.760563844652094e-5,2.378349597906288e-8,-0.0010563451015339039,3.759754719033252e-5,2.3782437194464704e-8,-0.0010561643423562313,3.750528822528541e-5,2.3737377447389552e-8,-0.001055928777775758,3.734426906295574e-5,2.365696343832137e-8,-0.0010556126783150875,3.714173971895337e-5,2.3556054900511646e-8,-0.0010551998123746519,3.693577609363618e-5,2.3455071168099988e-8,-0.0010546886977346502,3.677200754758798e-5,2.3378106802298378e-8,-0.001054097575413405,3.66964742503015e-5,2.33490503669857e-8,-0.001053466266416154,3.674410830929957e-5,2.338552532428398e-8,-0.0010528513171096396,3.6925144473778674e-5,2.3491902560416617e-8,-0.0010523125721679219,3.721530665965493e-5,2.365441113669717e-8,-0.0010518941136466624,3.7556866487537555e-5,2.384196911473466e-8,-0.001051607652331739,3.787365765176419e-5,2.4014260649323585e-8,-0.0010514271013640408,3.809514403546298e-5,2.4134458275138142e-8,-0.001051297410707953,3.8178799703989044e-5,2.4180962088243847e-8,-0.001051153003686843,3.812136015142763e-5,2.415318391268279e-8,-0.00105093733776516,3.795628189484318e-5,2.4069945427589834e-8,-0.001050616809646753,3.7741095264425834e-5,2.396246019827039e-8,-0.0010501863481547247,3.754067586859115e-5,2.3865199592522806e-8,-0.0010496673073456411,3.7411575394765774e-5,2.380750812194908e-8,-0.0010490998191358019,3.739064048823195e-5,2.380774834712807e-8,-0.0010485322021737509,3.748944550858809e-5,2.38707245777141e-8,-0.0010480100257824426,3.769477583367159e-5,2.398835336975793e-8,-0.0010475672083879396,3.797425178348991e-5,2.4142928600404912e-8,-0.0010472208647171518,3.8285082197056416e-5,2.4311824887822292e-8,-0.0010469704046910332,3.858335909600687e-5,2.4472287017073512e-8,-0.0010468001087383734,3.883168894481607e-5,2.4605240478689e-8,-0.0010466836675630368,3.900401645641016e-5,2.469763622155349e-8,-0.0010465891449321784,3.9087623690885925e-5,2.4743396088065535e-8,-0.00104648333056439,3.908308679776768e-5,2.4743374271449885e-8,-0.0010463351903678341,3.900321589613522e-5,2.4704818833201865e-8,-0.0010461187174899236,3.887169112109677e-5,2.4640634398441143e-8,-0.0010458157657489216,3.872153411276594e-5,2.456847676636226e-8,-0.0010454194198092652,3.8592904649491364e-5,2.4509434847279802e-8,-0.0010449379598351336,3.85290470767447e-5,2.4485769249212857e-8,-0.0010443983417922637,3.8568960460999586e-5,2.4517067123617403e-8,-0.0010438466104127784,3.8736263817727636e-5,2.4614598497805885e-8,-0.0010433416549984493,3.902636136480175e-5,2.477493404220497e-8,-0.0010429399987465788,3.9398027050649106e-5,2.4975871277955936e-8,-0.0010426746362297934,3.9777843434769186e-5,2.5178904654138547e-8,-0.0010425380922074639,4.0081503788804406e-5,2.5340291710930592e-8,-0.0010424814444555638,4.0244644241275436e-5,2.5427023133151833e-8,-0.0010424322947735387,4.024690202392131e-5,2.5429321392407133e-8,-0.0010423219582340482,4.01162830340403e-5,2.5362869290134385e-8,-0.0010421073140257824,3.9914219183457514e-5,2.526080398688154e-8,-0.0010417790504298643,3.9712303792083824e-5,2.5161204349048078e-8,-0.001041357514815806,3.957206053756882e-5,2.509620077309175e-8,-0.0010408820867983744,3.953305791576254e-5,2.5085701841939114e-8,-0.0010403994183290342,3.960922925354849e-5,2.5135719972456448e-8,-0.001039953473752625,3.979097235888994e-5,2.5239903766051643e-8,-0.0010395783534878653,4.005056096735985e-5,2.538278306056733e-8,-0.0010392939602767437,4.034918264408066e-5,2.5543680164653243e-8,-0.001039104389012981,4.0644480901831106e-5,2.5700644896490313e-8,-0.0010389988421567525,4.089757785496551e-5,2.5833941072896978e-8,-0.0010389545970551956,4.107865514075927e-5,2.5928726316951552e-8,-0.0010389412824983889,4.11705030871186e-5,2.5976731161695342e-8,-0.001038925600905446,4.116986580467381e-5,2.5976894786312716e-8,-0.0010388757116827172,4.108687415422475e-5,2.5935077860987764e-8,-0.0010387648487817887,4.094320887370908e-5,2.586310945168862e-8,-0.0010385741873378635,4.0769583233729096e-5,2.5777407288912374e-8,-0.0010382952268426782,4.0602784133407614e-5,2.569728649515853e-8,-0.0010379320091739295,4.04820837611387e-5,2.564292327050562e-8,-0.0010375031926033312,4.0444330838904017e-5,2.56327270085341e-8,-0.0010370431136598767,4.0516825192555824e-5,2.5679750881275533e-8,-0.0010365998252919112,4.07078727032145e-5,2.5787103029239512e-8,-0.0010362274507746704,4.0997023108730364e-5,2.59432896351184e-8,-0.0010359711779905647,4.133023718538513e-5,2.6120005918730713e-8,-0.0010358476721283505,4.1627586877103866e-5,2.6276137158887212e-8,-0.0010358308191826967,4.180745449119192e-5,2.6370052259346927e-8,-0.0010358552027499252,4.18193769451226e-5,2.6376375102413223e-8,-0.0010358403135057738,4.166678727036104e-5,2.6297719124715485e-8,-0.0010357228189093813,4.140456572009227e-5,2.6163449539399887e-8,-0.0010354780401623975,4.111391003936417e-5,2.6016503918615263e-8,-0.0010351214402610947,4.0871490524131414e-5,2.5897043112633257e-8,-0.0010346952781462417,4.0728626709958974e-5,2.5831362930703574e-8,-0.0010342513894169626,4.070496768499591e-5,2.582864079884688e-8,-0.0010338376130666347,4.0792468598692156e-5,2.588333975697396e-8,-0.001033489928572441,4.09637112677769e-5,2.5979990127741127e-8,-0.0010332292836012598,4.118057987218832e-5,2.6098059615421084e-8,-0.0010330613284611158,4.140165888760393e-5,2.6215931638488723e-8,-0.0010329777530100068,4.158819846524718e-5,2.631390656871405e-8,-0.0010329586810779521,4.170886241656704e-5,2.6376437158564403e-8,-0.001032975936317296,4.1743274993385874e-5,2.6393736765147437e-8,-0.0010329969885598913,4.168421213030391e-5,2.636277559384442e-8,-0.0010329892783965391,4.153821954893292e-5,2.62875676595281e-8,-0.0010329244588995863,4.132454750884092e-5,2.6178635261370543e-8,-0.001032782060381272,4.10726094101633e-5,2.6051674387741775e-8,-0.0010325522769319654,4.0818357819433007e-5,2.5925576579428118e-8,-0.0010322377709549141,4.0599882712942876e-5,2.5819988038191913e-8,-0.0010318544785740738,4.045240035953763e-5,2.575258468299546e-8,-0.001031431325710975,4.0402610592020545e-5,2.5736166079833738e-8,-0.0010310082903914864,4.04622844238969e-5,2.577556155474702e-8,-0.0010306315696239265,4.062155526853457e-5,2.586455506912295e-8,-0.0010303445107737654,4.084394736602622e-5,2.5983723580936618e-8,-0.00103017415051348,4.106712011714914e-5,2.6101034286724267e-8,-0.00103011645990442,4.121429379152592e-5,2.617762452180817e-8,-0.0010301283373702107,4.1218183604357294e-5,2.617978519094077e-8,-0.0010301360479824519,4.1049891214193474e-5,2.6093535091742128e-8,-0.0010300617418679534,4.073592787552085e-5,2.5933314593629573e-8,-0.0010298552834028627,4.0349707833675383e-5,2.5737635695545288e-8,-0.0010295123624857808,3.9981058901976845e-5,2.555325702866578e-8,-0.0010290699371210256,3.970266737753418e-5,2.541762182017323e-8,-0.0010285862799355606,3.95510226577242e-5,2.5348871652570656e-8,-0.001028119665030133,3.952567217658717e-5,2.5345604153804084e-8,-0.0010277146398166707,3.9599592103778894e-5,2.5392608827923747e-8,-0.0010273969445857086,3.9732019239784237e-5,2.54679029136312e-8,-0.0010271741439923543,3.987889635605635e-5,2.554837330653049e-8,-0.0010270387420002831,3.999979218338487e-5,2.5613362144150908e-8,-0.0010269717730998133,4.006209216467498e-5,2.564665439659544e-8,-0.0010269462335600545,4.004361181148552e-5,2.563758062373979e-8,-0.001026930475247916,3.993429582593155e-5,2.5581696150718296e-8,-0.0010268917955752411,3.9737131056284514e-5,2.54811632465487e-8,-0.0010268003254188763,3.946803547779058e-5,2.5344696049297998e-8,-0.001026633045285693,3.9154302349015926e-5,2.51867793373167e-8,-0.001026377413673644,3.883136780108241e-5,2.502596843310329e-8,-0.0010260339595217747,3.8538067531633994e-5,2.4882331374804033e-8,-0.00102561729797183,3.8310807330376756e-5,2.477430480252826e-8,-0.0010251551932449294,3.8177261675103885e-5,2.471538175976041e-8,-0.001024685487708184,3.8150384280356484e-5,2.4711128828705612e-8,-0.0010242508292970316,3.822352571453758e-5,2.475696413222644e-8,-0.0010238910923221203,3.836763523516221e-5,2.4837113045173785e-8,-0.0010236336767047106,3.853222377882937e-5,2.492543131105467e-8,-0.0010234830537858264,3.865239008611646e-5,2.49891058187856e-8,-0.0010234129983969168,3.8663590948988006e-5,2.4996031285257513e-8,-0.0010233670245726736,3.852273512816904e-5,2.492524814844594e-8,-0.001023271959887443,3.822833359285693e-5,2.4776942964655382e-8,-0.0010230632432314934,3.782769524653137e-5,2.4575998844550145e-8,-0.0010227107525744934,3.740279961889332e-5,2.436473371991324e-8,-0.0010222302402959167,3.703969137491942e-5,2.418716232193019e-8,-0.0010216740030515826,3.6798124988745376e-5,2.4073362152007457e-8,-0.001021108290579188,3.669683896443461e-5,2.4031974626159863e-8,-0.0010205912572348655,3.6717350983459955e-5,2.4052398420585333e-8,-0.0010201604372997207,3.681830406381751e-5,2.411249122180296e-8,-0.0010198303307530497,3.6950727918991715e-5,2.418666800590093e-8,-0.0010195960756659162,3.706898533184759e-5,2.4251597017513103e-8,-0.001019439056359185,3.713670445797552e-5,2.4289132019925126e-8,-0.001019332059571601,3.7129221763336125e-5,2.428734485125245e-8,-0.0010192433493335681,3.70343141516297e-5,2.4240686043212892e-8,-0.0010191400194511332,3.685229866278754e-5,2.4149908608415946e-8,-0.0010189911883879065,3.659580376531763e-5,2.402192783224623e-8,-0.0010187714343872375,3.628895436908966e-5,2.3869435845986977e-8,-0.0010184645132939021,3.596533710163379e-5,2.3709873676371996e-8,-0.001018066855839815,3.566412672527142e-5,2.3563393719128077e-8,-0.0010175898667280023,3.542425031334137e-5,2.3449761052332165e-8,-0.0010170599390659412,3.5277162817117435e-5,2.3384558945173422e-8,-0.001016515394012989,3.523949770501541e-5,2.3375440811865953e-8,-0.0010160002224420199,3.530738001007149e-5,2.3419397704779323e-8,-0.0010155553831384591,3.545419198619564e-5,2.3501928264935122e-8,-0.001015209142874551,3.563302488615149e-5,2.3598624983890202e-8,-0.0010149684067089226,3.5784346527384886e-5,2.3679292211144022e-8,-0.0010148133891465872,3.584860072421633e-5,2.3714344288769612e-8,-0.0010146982630651578,3.5782055660811007E-05,2.3682629377636572e-8,-0.0010145599654888093,3.557207326886522e-5,2.3578848270284908e-8,-0.0010143351722388912,3.5245823371830506e-5,2.3417678410022003e-8,-0.0010139811800521554,3.486632047924191e-5,2.3231576085062046e-8,-0.001013492050599654,3.4513974439642034e-5,2.3061330561170134e-8,-0.0010129013184621315,3.4259974954934804e-5,2.2942555475658693e-8,-0.0010122691652813616,3.4143842428325755e-5,2.289440024171102e-8,-0.001011660964001645,3.416527319904436e-5,2.291564249859294e-8,-0.0010111280235503381,3.429134318278579e-5,2.2988645742694414e-8,-0.0010106976785511353,3.447205752042876e-5,2.3087503664077148e-8,-0.0010103730798261847,3.465571175252602e-5,2.3185940039964153e-8,-0.0010101387428839818,3.479919616418346e-5,2.3262469964226124e-8,-0.0010099675794849883,3.487271276682596e-5,2.3302608900919384e-8,-0.0010098269209837737,3.4860699206272e-5,2.3299134968487392e-8,-0.0010096829020666328,3.476102080226269e-5,2.3251535621906485e-8,-0.0010095036482449427,3.4583741581220033e-5,2.316533851284319e-8,-0.00100926202814437,3.434990375649573e-5,2.3051517011118484e-8,-0.0010089385902406682,3.409004467856952e-5,2.2925769286763956e-8,-0.0010085248696185096,3.384168830235557e-5,2.2807227493595864e-8,-0.0010080265806791115,3.3644931550302674e-5,2.2716140262856692e-8,-0.0010074654828322916,3.353571640167953e-5,2.26703687608163e-8,-0.0010068782778092742,3.353743271134205e-5,2.268110345686206e-8,-0.0010063112194841138,3.36528689313314e-5,2.274888894220196e-8,-0.0010058104572475534,3.3859569732431347e-5,2.286150383963712e-8,-0.0010054101212326877,3.411145176628525e-5,2.2995062591133473e-8,-0.0010051217418514823,3.434769733360527e-5,2.3118734876600543e-8,-0.0010049287823506632,3.450726125747007e-5,2.3202145373587556e-8,-0.0010047886815621875,3.454511779650876e-5,2.3223469127649264e-8,-0.001004642523791172,3.444551550645358e-5,2.317587375654054e-8,-0.0010044301777682276,3.4228082912857005e-5,2.307029016040388e-8,-0.0010041070053985303,3.394428660482434e-5,2.293333606477324e-8,-0.0010036572007801948,3.366424530591849e-5,2.280046957873214e-8,-0.0010030989670374397,3.3457142010512746e-5,2.2706067870780697e-8,-0.001002478977520436,3.3371580578821594e-5,2.2673661179006083e-8,-0.0010018578283530568,3.342312200493025e-5,2.2709939398912565e-8,-0.0010012922882052613,3.359334378293894e-5,2.2804621910948108e-8,-0.0010008212275209021,3.3839363188058443e-5,2.2935524319804295e-8,-0.0010004594328713067,3.410840614322706e-5,2.3076001992787873e-8,-0.0010001992187818722,3.4351274842747164e-5,2.320166356575127e-8,-0.0010000167281470184,3.453101661995363e-5,2.3294552412610813e-8,-9.998793317252265e-4,3.462633409658824e-5,2.3344654270450874e-8,-9.997518470452732e-4,3.4631318428131296e-5,2.3349607127017085e-8,-9.996009199043014e-4,3.455348552109253e-5,2.3313647478180466e-8,-9.9939795849614e-4,3.44114906802232e-5,2.3246470434010358e-8,-9.99121407187035e-4,3.4233040893128126e-5,2.3162210737379513e-8,-9.987590833800812e-4,3.405276743515656e-5,2.3078368950141786e-8,-9.983108679056524e-4,3.390926822320403e-5,2.3014265042933495e-8,-9.97791306534957e-4,3.384032770146051e-5,2.2988554306834156e-8,-9.972307991430098e-4,3.3875718713881964e-5,2.3015580148524872e-8,-9.966733564831009e-4,3.4028221102158114e-5,2.310094837163757e-8,-9.961691020362934e-4,3.428546408696686e-5,2.3237638825588425e-8,-9.957615865134595e-4,3.46069401339788e-5,2.3404762682669036e-8,-9.954733186501152e-4,3.493021100327155e-5,2.357086532821176e-8,-9.952956330342465e-4,3.5186762200118035e-5,2.370192787102682e-8,-9.95188477807128e-4,3.532262383638006e-5,2.377162507367407e-8,-9.950913872963697e-4,3.5315508210565336e-5,2.376975873492727e-8,-9.94941500795456e-4,3.518154860532421e-5,2.3705430116577784e-8,-9.946916452042978e-4,3.496972133573339e-5,2.3603993034892922e-8,-9.943224955306555e-4,3.4747072949003844e-5,2.3499389344168517e-8,-9.938459958236127e-4,3.458033160070616e-5,2.3424766870853507e-8,-9.933002965673123e-4,3.451936283405707e-5,2.3404222600228282e-8,-9.92738532106868e-4,3.4586492210376424e-5,2.34477123751599e-8,-9.922149570488884e-4,3.47737697346077e-5,2.35500702634693e-8,-9.917723365169562e-4,3.504802300243e-5,2.369389615669735e-8,-9.91433801696836e-4,3.536137626092322e-5,2.385500900287136e-8,-9.912006576782077e-4,3.566352992413874e-5,2.4008564476421496e-8,-9.910555099664157e-4,3.591217265700787e-5,2.4134077453991628e-8,-9.909685467225334e-4,3.607935109184319e-5,2.4218367354514807e-8,-9.90904493799253e-4,3.615353059249766e-5,2.4256393376223053e-8,-9.90828480212809e-4,3.613845925610944e-5,2.4250587005171246e-8,-9.90710154736621e-4,3.605041340979941e-5,2.420946428455628e-8,-9.905262925749175e-4,3.5915102415850375e-5,2.4146106990416895e-8,-9.902625674466235e-4,3.576480559520487e-5,2.407673810359449e-8,-9.899151595612757e-4,3.563558997580312e-5,2.4019285840091026e-8,-9.894925239248037e-4,3.556393259086711e-5,2.399161892926978e-8,-9.890169789091286e-4,3.558183032668142e-5,2.400906596769323e-8,-9.885248529442735e-4,3.570977187754583e-5,2.4080982598891237e-8,-9.880631022206629e-4,3.594816942793109e-5,2.4206693186517794e-8,-9.876803749587692e-4,3.6270078383065484e-5,2.4372152484305683e-8,-9.874125517596248e-4,3.662032117452578e-5,2.4549731590826265e-8,-9.872671120179847e-4,3.6926008414473374e-5,2.470348797116585e-8,-9.872146960178598e-4,3.7118461255131244e-5,2.4799926090503432e-8,-9.871951531337715e-4,3.715829143129886e-5,2.482028574407889e-8,-9.871375620403313e-4,3.705077677427379e-5,2.476806781996489e-8,-9.869847448893906e-4,3.684329236067619e-5,2.466765451933042e-8,-9.867105450566658e-4,3.660725536650436e-5,2.4555140657066402e-8,-9.86323904247596e-4,3.641469724773145e-5,2.4466432455541804e-8,-9.858615016007492e-4,3.631928880259697e-5,2.442766534764061e-8,-9.85374633250025e-4,3.634645237112784e-5,2.4450388419430107e-8,-9.849156337300748e-4,3.649235218034662e-5,2.453139904021426e-8,-9.845270231932197e-4,3.672923823051199e-5,2.465582036281864e-8,-9.842346708626541e-4,3.7014300862134964e-5,2.4801822245291615e-8,-9.840451716688692e-4,3.729969081586018e-5,2.4945700886248175e-8,-9.839470708571595e-4,3.754181375466232e-5,2.5066377411016933e-8,-9.839150653915634e-4,3.770836043790428e-5,2.514864253568232e-8,-9.83915845150665e-4,3.778218739727299e-5,2.5184832131647895e-8,-9.839141440703577e-4,3.776204586365129e-5,2.5175023720621267e-8,-9.838778946578378e-4,3.7660825559131726e-5,2.5126110722890017e-8,-9.837819111355383e-4,3.750231363693385e-5,2.5050212268447694e-8,-9.83610120160167e-4,3.731747931219535e-5,2.4962853060990782e-8,-9.833567922937184e-4,3.714089212336408e-5,2.4881163070795294e-8,-9.830272886633775e-4,3.700727412351498e-5,2.4822096717103307e-8,-9.826385911278707e-4,3.69477424015823e-5,2.4800505830703303e-8,-9.82219396284537e-4,3.698509836147771e-5,2.4826830050034716e-8,-9.818087670899545e-4,3.712771767756578e-5,2.4904243886600084e-8,-9.814515702841564e-4,3.7362648046258683e-5,2.5025539421476875e-8,-9.811889802018954e-4,3.7650571338024e-5,2.5170939795615703e-8,-9.810442154511204e-4,3.792755371116602e-5,2.5309102919604293e-8,-9.810080333830023e-4,3.811864493199592e-5,2.5403711739960307e-8,-9.81033207624282e-4,3.8163102204115404e-5,2.5425633123846726e-8,-9.810462359989666e-4,3.804100654306584e-5,2.5365828059548833e-8,-9.809743731534347e-4,3.778505688611488e-5,2.524112956896296e-8,-9.807739041156364e-4,3.746843502401319e-5,2.508825210734586e-8,-9.804438663459916e-4,3.717577379911337e-5,2.4949313572355698e-8,-9.800204118408863e-4,3.697428727925494e-5,2.485733884169189e-8,-9.795593431768212e-4,3.6897909348930136e-5,2.4828320900585492e-8,-9.791176972697106e-4,3.694613487266822e-5,2.4860822858248447e-8,-9.78740821256568e-4,3.709208601691692e-5,2.4940346749398108e-8,-9.784561041063255e-4,3.7293678129001164e-5,2.5045249521682385e-8,-9.782718489133458e-4,3.7504071244625615e-5,2.5152145120602866e-8,-9.781792758595254e-4,3.7679941882763186e-5,2.5239992535436655e-8,-9.781562333794412e-4,3.778745647138105e-5,2.5292850462091087e-8,-9.781718882523143e-4,3.780606999115621e-5,2.530147602469855e-8,-9.781918620216884e-4,3.773013883351006e-5,2.5263886480747403e-8,-9.781832167389938e-4,3.7568458080856365e-5,2.518501010675023e-8,-9.78118742072559e-4,3.7342042791065954e-5,2.507558218052921e-8,-9.779801236071979e-4,3.708061130398327e-5,2.4950452157285786e-8,-9.777597868775496e-4,3.681839353569755e-5,2.4826535622686178e-8,-9.774615375963498e-4,3.6589861622145944e-5,2.47206704952449e-8,-9.771002958644923e-4,3.642562803302159e-5,2.464752335844287e-8,-9.767011177636903e-4,3.6348412775412787e-5,2.461757103592887e-8,-9.762974059618317e-4,3.636884684333104e-5,2.463512177599872e-8,-9.759277035517238e-4,3.648101405343806e-5,2.4696356361916733e-8,-9.75629951246629e-4,3.665840901177218e-5,2.4787660934629145e-8,-9.754322748465593e-4,3.685252659570957e-5,2.4885193908702775e-8,-9.75340987613693e-4,3.699788916582287e-5,2.495739454375517e-8,-9.753299684090048e-4,3.702722840929396e-5,2.4972198717358794e-8,-9.753395265608093e-4,3.689599167738356e-5,2.490869287630752e-8,-9.752920720559031e-4,3.6606102877796636e-5,2.4768523544825133e-8,-9.751219280535475e-4,3.62127126348543e-5,2.457919604533296e-8,-9.748035378869218e-4,3.580501071706199e-5,2.4384716721739845e-8,-9.743604317943561e-4,3.5470563709328834E-05,2.4228018734390125e-8,-9.738510761405169e-4,3.526450154078282e-5,2.4135686744524703e-8,-9.733435765106256e-4,3.519840608946445e-5,2.411249078547065e-8,-9.728943634004211e-4,3.5247780682422384e-5,2.4145284649450995e-8,-9.725377477092212e-4,3.536768335651393e-5,2.4211049479849402e-8,-9.722848444423038e-4,3.550754893515966e-5,2.428448154165182e-8,-9.72127563371285e-4,3.562150854076412e-5,2.4343174928178926e-8,-9.720441769973178e-4,3.567417242302132e-5,2.437035998268252e-8,-9.720046367152485e-4,3.56432887461309e-5,2.4355963585866076e-8,-9.719752390974952e-4,3.552063301357858e-5,2.4296779131561367e-8,-9.719228596586245e-4,3.531171554305102e-5,2.4196141313711178e-8,-9.718188423673552e-4,3.503437202507118e-5,2.406317927089353e-8,-9.716423998941957e-4,3.471621408885309e-5,2.3911605715671775e-8,-9.713832408989576e-4,3.439096166140005e-5,2.3757978780585042e-8,-9.710430366130846e-4,3.409389102193965e-5,2.361948593481193e-8,-9.70635446133547e-4,3.3856923351839665e-5,2.3511491505683215e-8,-9.701846919981149e-4,3.370390574741038e-5,2.3445165212560717e-8,-9.697228228770885e-4,3.364647614797688e-5,2.342546325722505e-8,-9.692857745624962e-4,3.368081166293388e-5,2.3449670440655165e-8,-9.689081926968012e-4,3.378557365972413e-5,2.3506650641077334e-8,-9.686168099705691e-4,3.392170644199995e-5,2.357703705485365e-8,-9.684224658620934e-4,3.4035563171401795e-5,2.3634937383161203e-8,-9.68312113340623e-4,3.406746818840269e-5,2.3652061632635778e-8,-9.682443258694862e-4,3.396706662113197e-5,2.3604922859051918e-8,-9.681538286062369e-4,3.371329935534211e-5,2.348419799835916e-8,-9.679692761326831e-4,3.333058404686902e-5,2.330235800983941e-8,-9.676407409410866e-4,3.2888734991917684e-5,2.3093584924486144e-8,-9.671629996624705e-4,3.2480309923178234e-5,2.2902797651000153e-8,-9.665791080763037e-4,3.2184835146996645e-5,2.276825671546724e-8,-9.659613244934983e-4,3.204046428493923e-5,2.270778086296016e-8,-9.653822640887052e-4,3.203767611505963e-5,2.2715798323767404e-8,-9.648929276683705e-4,3.213287335072607e-5,2.2770213229558723e-8,-9.645149837962753e-4,3.226903530996189e-5,2.2842729866168465e-8,-9.642442355567376e-4,3.239247708087407e-5,2.2907171397624284e-8,-9.640587530216115e-4,3.24620993246358e-5,2.2943963859402317e-8,-9.639270001539048e-4,3.245248074250296e-5,2.2941464499432092e-8,-9.638140578411377e-4,3.235353569481727e-5,2.2895550510650823e-8,-9.6368595444148e-4,3.2168912493880215e-5,2.28086319018673e-8,-9.635128997527551e-4,3.191410788621952e-5,2.2688634455621677e-8,-9.632720633656184e-4,3.161432337084309e-5,2.2547969983926774e-8,-9.629500908473864e-4,3.1301728190777524e-5,2.2402276055104036e-8,-9.625451789726969e-4,3.101176374193039e-5,2.226867575507521e-8,-9.620681774777247e-4,3.077836455776551e-5,2.216345368450055e-8,-9.615420329416084e-4,3.0628500411465295e-5,2.209935540113096e-8,-9.609991467969121e-4,3.057690888665009e-5,2.2082994490797295e-8,-9.604766797714861e-4,3.062205911343596e-5,2.2112942498469528e-8,-9.600102747775835e-4,3.074434601472043e-5,2.2179018433807102e-8,-9.596270214263777e-4,3.090724439259373e-5,2.2263089974248304e-8,-9.593386562986945e-4,3.1061771792007744e-5,2.2341454918293274e-8,-9.591361349101454e-4,3.1154428547892235e-5,2.2388764734143828e-8,-9.589871735461636e-4,3.113854434292479e-5,2.2383389507898628e-8,-9.588390052667267e-4,3.0987899671081076e-5,2.23137088373979e-8,-9.586285812047179e-4,3.0709291166627064e-5,2.2183841699676357e-8,-9.583004549904042e-4,3.034807980718291e-5,2.20160808943815e-8,-9.578277490469907e-4,2.9980170319710332e-5,2.1846942684937246e-8,-9.572262091683876e-4,2.968886340238766e-5,2.1716059377740093e-8,-9.565515092747311e-4,2.953507814969651e-5,2.1651963566920276e-8,-9.558790138711099e-4,2.9536365304518656e-5,2.166217296734255e-8,-9.552767930981623e-4,2.9665583334704913e-5,2.173278583758932e-8,-9.547860467171304e-4,2.9867061406297094e-5,2.1836474927304304e-8,-9.544158266696612e-4,3.0078540975903094e-5,2.1943173400982044e-8,-9.541492278461368e-4,3.024805141205629e-5,2.20281932369835e-8,-9.539540335951516e-4,3.034185193150517e-5,2.2075920768301698e-8,-9.537924048895253e-4,3.0345247140230987e-5,2.208000983233228e-8,-9.536275311546465e-4,3.025982229495277e-5,2.204185499562896e-8,-9.534275077413425e-4,3.0099841725022342e-5,2.1968736705240954e-8,-9.531675967845711e-4,2.9889041402266785e-5,2.187225621318765e-8,-9.528318988517542e-4,2.9657867759765324e-5,2.1767059789256722e-8,-9.524149404686213e-4,2.9440645440285744e-5,2.1669541941369942e-8,-9.519231274636026e-4,2.9272003957849185e-5,2.1596154336982085e-8,-9.513754532627277e-4,2.9182105324352853e-5,2.156109047838405e-8,-9.508024505321581e-4,2.9190878090889825e-5,2.1573483188737836e-8,-9.502424663511357e-4,2.9302351813132366e-5,2.1634700321363326e-8,-9.49735030418587e-4,2.9500882232911995e-5,2.1736638845838566e-8,-9.493122042363756e-4,2.975120128025421e-5,2.1861931766478845e-8,-9.489899450602254e-4,3.0003488125871785e-5,2.19865714491652e-8,-9.487620601966599e-4,3.020311750055373e-5,2.2084695992892515e-8,-9.485988957950232e-4,3.030316317880326e-5,2.2134553407674564e-8,-9.484518091654521e-4,3.0276810472256283e-5,2.2124270364054122e-8,-9.482632222856166e-4,3.0126538386465414e-5,2.205597301242971e-8,-9.479807554179524e-4,2.9887047408005317e-5,2.194689841841948e-8,-9.475724436270446e-4,2.961960692398054e-5,2.1826477535904775e-8,-9.470384606933393e-4,2.9397309036501518e-5,2.1729216202936675e-8,-9.464140919087501e-4,2.9284117233135745e-5,2.168479093152599e-8,-9.457607135250013e-4,2.931474722874649e-5,2.1708699518209903e-8,-9.451468703045619e-4,2.948415363474355e-5,2.179756824154432e-8,-9.446272642077682e-4,2.975166154093429e-5,2.19313942223417e-8,-9.442287741878977e-4,3.005706659105484e-5,2.2081348790756766e-8,-9.439480612138644e-4,3.0340177706433605e-5,2.2219059244211306e-8,-9.437587330039747e-4,3.05555047742844e-5,2.232346391891961e-8,-9.436224123828684e-4,3.0678595514250895e-5,2.2383640253534496e-8,-9.434987028230832e-4,3.0705355294702186e-5,2.2398300631400305e-8,-9.433518093842979e-4,3.0647746413302585e-5,2.2373619930447855e-8,-9.431539596951896e-4,3.052879162175852e-5,2.2320812424416252e-8,-9.42886827941632e-4,3.0378337056025078e-5,2.2254139731918605e-8,-9.425421763466582e-4,3.0229750427711546e-5,2.2189391361884014e-8,-9.421224563862095e-4,3.011700715597695e-5,2.2142531937943215e-8,-9.416414774327706e-4,3.0071346469157127e-5,2.212810620989906e-8,-9.411245660268458e-4,3.0116816661240038e-5,2.215710354642401e-8,-9.406070615964384e-4,3.026467552618603e-5,2.2234316233793085e-8,-9.40129838692488e-4,3.050774422637882e-5,2.2355753528190237e-8,-9.397312194328286e-4,3.0817081031483444e-5,2.2507225708871276e-8,-9.394363651629871e-4,3.1143952690525606e-5,2.266544635054926e-8,-9.39247469629382e-4,3.14289902634384e-5,2.2802467253505157e-8,-9.391392811567771e-4,3.161734154321736e-5,2.28928419535772e-8,-9.390631834203985e-4,3.1675072753920046e-5,2.292128485717643e-8,-9.389595011470184e-4,3.160054917881444e-5,2.2887892684632222e-8,-9.38774017044829e-4,3.142629938669554e-5,2.2808821851867562E-08,-9.384731170441491e-4,3.121073248180759e-5,2.2712144428496986e-8,-9.380529653295315e-4,3.102263562512172e-5,2.2630329259409035e-8,-9.37540421932073e-4,3.0923179639618185e-5,2.2591680785415607e-8,-9.369857583175107e-4,3.095034383443137e-5,2.261312414301245e-8,-9.364492385837592e-4,3.1109898640259824e-5,2.269626110812058e-8,-9.359853619300495e-4,3.137546064701527e-5,2.2827755619925506e-8,-9.356295240548179e-4,3.16974681512932e-5,2.2983821119346855e-8,-9.353911527823038e-4,3.2017802198202046e-5,2.313717510433112e-8,-9.35254811672147e-4,3.228479107023496e-5,2.326399499414142e-8,-9.351875597689146e-4,3.2463820357644084e-5,2.3348709349042408e-8,-9.351488611202442e-4,3.2541398176328435e-5,2.338570291153537e-8,-9.350994833205346e-4,3.25234996917194e-5,2.3378386345866902e-8,-9.350074661012362e-4,3.2430678404906835e-5,2.333682380228043e-8,-9.348510276335349e-4,3.229243028857118e-5,2.3275080016553152e-8,-9.346193314669444e-4,3.214231620297721e-5,2.3208959235950077e-8,-9.34312262797197e-4,3.2014221186669155e-5,2.3154273367792384e-8,-9.339400414025882e-4,3.193933185076618e-5,2.3125418905859264e-8,-9.33522913696338e-4,3.194305448645945e-5,2.3133910756853474e-8,-9.330904862493931e-4,3.204115275895757e-5,2.3186578394138074e-8,-9.326796244283101e-4,3.223492294630654e-5,2.3283386135426127e-8,-9.323295184334296e-4,3.250635238251842e-5,2.3415326287966734e-8,-9.320730236673442e-4,3.281574833663746e-5,2.356349553000111e-8,-9.319252711366798e-4,3.310543782936856e-5,2.3700943505328696e-8,-9.318736216132645e-4,3.331219177128394e-5,2.3798471243414568e-8,-9.318752640651988e-4,3.338676318697942e-5,2.3833655432768257e-8,-9.31866963948998e-4,3.331301147491189e-5,2.3799668733206908e-8,-9.317849968972861e-4,3.311655040946259e-5,2.3709231637614105e-8,-9.315865645433877e-4,3.2857438239323513e-5,2.3591073380549135e-8,-9.312628626536916e-4,3.2610345594110236e-5,2.3480457903216238e-8,-9.308393005661033e-4,3.24417200448329e-5,2.3408301483171562e-8,-9.303651936824847e-4,3.239281090859414e-5,2.339318150193606e-8,-9.298986864069065e-4,3.24725338782039e-5,2.343818307136948e-8,-9.29492219127464e-4,3.265959531263871e-5,2.3532245846076462e-8,-9.291818021359038e-4,3.2911055999915944e-5,2.3654527540462002e-8,-9.289814804693926e-4,3.317408157338681e-5,2.3780107907133812e-8,-9.28883102878134e-4,3.339795710135585e-5,2.3885603751994195e-8,-9.288606081706539e-4,3.3543937048918637e-5,2.3953598676844333e-8,-9.288772589118661e-4,3.3591181371482934e-5,2.3975172255395918e-8,-9.288937419745458e-4,3.353814016920971e-5,2.395033272948154e-8,-9.288751893623011e-4,3.340004673214571e-5,2.3886721538417358e-8,-9.287959268978146e-4,3.320403594462646e-5,2.3797303763589087e-8,-9.286417064222096e-4,3.298355112980294e-5,2.369778683496962e-8,-9.284099392258089e-4,3.277328729013441e-5,2.3604298515993387e-8,-9.281087947963245e-4,3.260518664063019e-5,2.3531530406527254e-8,-9.277558922978596e-4,3.25053020042501e-5,2.3491259018736307e-8,-9.27376881127838e-4,3.2490978444289704E-05,2.349102519309791e-8,-9.270036743482587e-4,3.2567791005183e-5,2.3532761106056747e-8,-9.266715169341242e-4,3.2726055504754945e-5,2.361130945511728e-8,-9.264137151151058e-4,3.293770276831043e-5,2.3713172494102367e-8,-9.262532777753961e-4,3.315574465668824e-5,2.3816439311101114e-8,-9.261924253535585e-4,3.331972423030237e-5,2.389335984974595e-8,-9.262040127993932e-4,3.336992217268715e-5,2.3916815814377182e-8,-9.262317722939682e-4,3.326872605091641e-5,2.3870037451283865e-8,-9.26204733848964e-4,3.3020183443077696e-5,2.3755545743126395e-8,-9.260627882338456e-4,3.267485106444268e-5,2.3597373291928313e-8,-9.257806549268176e-4,3.2313603001887904e-5,2.343349628055146e-8,-9.253766285983505e-4,3.201794497161325e-5,2.3301884783205278e-8,-9.249026226141552e-4,3.1842977355389055e-5,2.3227766419155888e-8,-9.244236141866019e-4,3.1804942562237756e-5,2.321783898637054e-8,-9.239978305283136e-4,3.188429203691447e-5,2.3261932645223352e-8,-9.236643245273065e-4,3.203781785436325e-5,2.3339012154274225e-8,-9.234386977616611e-4,3.221281488408803e-5,2.3424069805742805e-8,-9.233147289125141e-4,3.235906739356297e-5,2.3493825767808208e-8,-9.232692914346888e-4,3.243722377144107e-5,2.3530540271546322e-8,-9.232686902572398e-4,3.242362191865267e-5,2.3524031114582375e-8,-9.232753070314963e-4,3.231198064538372e-5,2.347219924760264e-8,-9.232537561991422e-4,3.211234823824068e-5,2.3380345332508162e-8,-9.231758558037119e-4,3.1847866001873865e-5,2.3259584838009844e-8,-9.230239270817444e-4,3.155012781518374e-5,2.3124710835478002e-8,-9.227922362546493e-4,3.1253999746506684e-5,2.299185234886264e-8,-9.224867387452752e-4,3.0992724464646724e-5,2.2876250708263638e-8,-9.221236055597706e-4,3.079385597163362e-5,2.27903811393233e-8,-9.217270560533948e-4,3.067609570471294e-5,2.2742468990955336e-8,-9.213267796337176e-4,3.064680318714811e-5,2.2735346156833847e-8,-9.20954912564315e-4,3.0699934328855683e-5,2.2765581416612138e-8,-9.206421478418023e-4,3.08143607477365e-5,2.2822873109824424e-8,-9.204122660196305e-4,3.095320827010874e-5,2.2889943688910157e-8,-9.202747886912586e-4,3.106597764009101e-5,2.2943650815208422e-8,-9.20216936947342e-4,3.1095988189358365e-5,2.2958395502173376e-8,-9.201985234595585e-4,3.099497926622176e-5,2.2912665548665453e-8,-9.201557642877907e-4,3.074296687634402e-5,2.2797948208220792e-8,-9.200186966514138e-4,3.0364621739963786e-5,2.2626137511840795e-8,-9.197385636888824e-4,2.9929213138156976e-5,2.242949417390068e-8,-9.193108394574188e-4,2.9527970187913423e-5,2.225019669376877e-8,-9.187785340875029e-4,2.9238845703639758e-5,2.2123997801802605e-8,-9.182134225021054e-4,2.9098989670442113e-5,2.2067447146301895e-8,-9.176879830111815e-4,2.9098589555165532e-5,2.2075132170368005e-8,-9.17253784391652e-4,2.9193712335522423e-5,2.212586268610836e-8,-9.169332050515159e-4,2.932621852597383e-5,2.2192168520093514e-8,-9.167219505579218e-4,2.944065181810668e-5,2.224829932694638e-8,-9.165966656263807e-4,2.949439756587482e-5,2.2274934020959177e-8,-9.165233093736817e-4,2.9461840863147958e-5,2.226094758259148e-8,-9.164642868928159e-4,2.9334685108527463e-5,2.220331133229603e-8,-9.163839913645998e-4,2.9120232422900573e-5,2.2106066579955823e-8,-9.162530317647461e-4,2.883851348103519e-5,2.1978863978225656e-8,-9.160513185398048e-4,2.8518597058158136e-5,2.1835244906513958e-8,-9.15769988624412e-4,2.8194298243653313e-5,2.1690730238489156e-8,-9.154120664548803e-4,2.7899535170271005e-5,2.1560765750180442e-8,-9.149917488095805e-4,2.7663738874698725e-5,2.1458654195702416e-8,-9.145323801553542e-4,2.7507851429598272e-5,2.1393709233720136e-8,-9.140634112563936e-4,2.744128142921948e-5,2.136983448703116e-8,-9.136166435043148e-4,2.745994641856036e-5,2.1384644526880326e-8,-9.13221944692427e-4,2.754549808736449e-5,2.1429208794373388e-8,-9.129024910120398e-4,2.7665888640565562e-5,2.148847949703196e-8,-9.126694819496386e-4,2.7777706431344518e-5,2.154253176218981e-8,-9.125166098566058e-4,2.7831321553144563e-5,2.156899691685832e-8,-9.124157000485842e-4,2.7780165658292776e-5,2.1547232079309533e-8,-9.123165267733067e-4,2.759442992476146e-5,2.1464373542698462e-8,-9.121548623777333e-4,2.7276427140508372e-5,2.1322119221499095e-8,-9.118711019526034e-4,2.6870144591949852e-5,2.114094313683426e-8,-9.114350063079968e-4,2.6455006129514234e-5,2.0957209029743784e-8,-9.108634742462995e-4,2.6120092101343845e-5,2.081139801841706e-8,-9.102178200814272e-4,2.5929424367736944e-5,2.0732255869559906e-8,-9.095797117160946e-4,2.5898353086471822e-5,2.0726067368364644e-8,-9.090202329768966e-4,2.5993933266429337e-5,2.077699539719869e-8,-9.085793014011967e-4,2.615479802733407e-5,2.0856387709915296e-8,-9.082619863653898e-4,2.6315579246745158e-5,2.09341239475786e-8,-9.080467696016204e-4,2.6424152758084614e-5,2.098656643738969e-8,-9.078974977973308e-4,2.6448875948786817e-5,2.0999792057647626e-8,-9.077736775849799e-4,2.6378608518081082e-5,2.0969414117202983e-8,-9.076374388060467e-4,2.621931034153885e-5,2.089880711320176e-8,-9.074576563940846e-4,2.598981028468818e-5,2.0797007293920687e-8,-9.072123555606045e-4,2.5717763310892864e-5,2.067680801973962e-8,-9.068901702931364e-4,2.543581375595846e-5,2.055305287961445e-8,-9.064910919600087e-4,2.51777245706118e-5,2.044096225969404e-8,-9.060264239903059e-4,2.497429600456872e-5,2.0354350101638346e-8,-9.055176396903595e-4,2.4849147035049042e-5,2.0303725663131417e-8,-9.049938331462582e-4,2.48148520431951e-5,2.0294513960783498e-8,-9.044877759473634e-4,2.487013629166907e-5,2.0325761996341625e-8,-9.040309431041147e-4,2.4998716181532725e-5,2.0389648367651206e-8,-9.036480496186143e-4,2.5170219741609872e-5,2.0472012539751645e-8,-9.033517513971097e-4,2.534346091236584e-5,2.0553994872596846e-8,-9.031382345469437e-4,2.5472113323665762e-5,2.0614734900078757e-8,-9.029845516590252e-4,2.5512741628428336e-5,2.0635033273204925e-8,-9.028490149929373e-4,2.5434954827073677e-5,2.0601836238167363e-8,-9.026764902106563e-4,2.5232408447057923e-5,2.0513003051675774e-8,-9.02410173775587e-4,2.4931333305205534e-5,2.03809375747986e-8,-9.020092509206674e-4,2.459113424824214e-5,2.0232703367730958e-8,-9.014671775780341e-4,2.4291763948560345e-5,2.0104263036672917e-8,-9.008206650653747e-4,2.4108119510329703e-5,2.0028949316011377e-8,-9.001407652157997e-4,2.40815816794724e-5,2.002473027343289e-8,-8.995076036470077e-4,2.4204454860463047e-5,2.0087372224985797e-8,-8.989819618378563e-4,2.442640209534498e-5,2.0193550978397385e-8,-8.985886426926948e-4,2.4677367529835956e-5,2.0311351442965695e-8,-8.983168875609791e-4,2.489249041554455e-5,2.0411570672683616e-8,-8.981321994515865e-4,2.5027742305275945e-5,2.0474734817052442e-8,-8.979905680705888e-4,2.506411353886881e-5,2.0492861273368607e-8,-8.978493659111419e-4,2.50042478933684e-5,2.0467761838839778e-8,-8.976735626310779e-4,2.486629512223054e-5,2.040810250953443e-8,-8.974383807300419e-4,2.46779904367794e-5,2.0326637181998767e-8,-8.971300793370073e-4,2.447195277178342e-5,2.0238087853917463e-8,-8.967460299014721e-4,2.4281946492655756e-5,2.0157529321890946e-8,-8.962944874862408e-4,2.41394984040332e-5,2.009894778188007e-8,-8.957939342688571e-4,2.4070383811391924e-5,2.0073707412014148e-8,-8.952715333108823e-4,2.4090842783267837e-5,2.0088849549234874e-8,-8.94760107898572e-4,2.420397021695154e-5,2.014545178891125e-8,-8.942933680114259e-4,2.4397265038716906e-5,2.0237535845060154e-8,-8.938997498069575e-4,2.4642474151023778e-5,2.0352064205131918e-8,-8.935958998883974e-4,2.4898610660257977E-05,2.047041270308535e-8,-8.933813137979958e-4,2.5118392150347438e-5,2.057138082449648e-8,-8.932357382837027e-4,2.525738915614616e-5,2.0635360425476936e-8,-8.931205738507962e-4,2.5284299096435977e-5,2.0648906749984923e-8,-8.929848689198422e-4,2.5190265415252555e-5,2.0608774843090036e-8,-8.927757350545704e-4,2.4994824362930195e-5,2.052437537467493e-8,-8.924519189134882e-4,2.4745797708676503e-5,2.0417514294488545e-8,-8.919975931406865e-4,2.4510848006438183e-5,2.031846414448125e-8,-8.914314961573257e-4,2.436039906856739e-5,2.0258291785338553e-8,-8.908058509117407e-4,2.4345690900774747e-5,2.0259156353576073e-8,-8.901923458736179e-4,2.4480408023514104e-5,2.032632704668696e-8,-8.896591855754514e-4,2.473538117757218e-5,2.0446077286436584e-8,-8.892494467896753e-4,2.505003874490458e-5,2.0590986107984132e-8,-8.889707658958967e-4,2.5354671159387962e-5,2.0729934824061592e-8,-8.887992171195747e-4,2.5592069573353648e-5,2.0837712880844427e-8,-8.886922966930062e-4,2.572983863637043e-5,2.0900398514110002e-8,-8.886031916452067e-4,2.576187327548421e-5,2.0915874009217856e-8,-8.884910916697882e-4,2.5702806387382103e-5,2.0891201501616617e-8,-8.883263469942507e-4,2.5580247122862124e-5,2.0839048300129043e-8,-8.880918126579759e-4,2.5427917810549098e-5,2.0774582188619598e-8,-8.877822930623571e-4,2.528066113611859e-5,2.071327182632323e-8,-8.874034503409459e-4,2.51709375729389e-5,2.0669390176493168e-8,-8.869707261418254e-4,2.5125989723721748e-5,2.0654810035291582e-8,-8.865081500699982e-4,2.5164954314173364e-5,2.067774642510077e-8,-8.86046435520712e-4,2.5295625909005256e-5,2.074132329135633e-8,-8.856195799846079e-4,2.5511276908268373e-5,2.0842176511925037e-8,-8.852594627043434e-4,2.578871501824554e-5,2.0969645761179816e-8,-8.849887434082308e-4,2.6089236359805585e-5,2.1106290594163275e-8,-8.848135668142814e-4,2.6363915683878577e-5,2.12303363316089e-8,-8.847186517320325e-4,2.6563437790964064e-5,2.132009779085571e-8,-8.846674515235134e-4,2.6650601378864086e-5,2.1359523275735847e-8,-8.846087189309281e-4,2.66117823350549e-5,2.1343206192558952e-8,-8.844884826177575e-4,2.6463259603390726e-5,2.1279054822091283e-8,-8.84264302201615e-4,2.6249677950410016e-5,2.1187425909026206e-8,-8.839176546726403e-4,2.6034332006823362e-5,2.109662263366006e-8,-8.83460649868888e-4,2.588342561020468e-5,2.1035784916221402e-8,-8.82934630955511e-4,2.584833167410523e-5,2.102703848956324e-8,-8.824002202963414e-4,2.595091364572211e-5,2.1079174189276926e-8,-8.81920975885244e-4,2.61768927835987e-5,2.1185003004173495e-8,-8.815456299885851e-4,2.648030419312936e-5,2.132360042425762e-8,-8.812952960849518e-4,2.6797977084991984e-5,2.146685384949102e-8,-8.811602994497689e-4,2.7068443874576867e-5,2.1587808754275467e-8,-8.811068251980501e-4,2.7247856141716944e-5,2.1667584069800153e-8,-8.81089260979772e-4,2.7317788146902162e-5,2.169866440830599e-8,-8.810626671495409e-4,2.7284359038585255e-5,2.168436095027221e-8,-8.809914703339173e-4,2.7171697969967655e-5,2.1635803660338795e-8,-8.80853375306616e-4,2.7013728986054004e-5,2.1568241334736312e-8,-8.806396376131523e-4,2.6847076911299085e-5,2.14978976330453e-8,-8.803534902028214e-4,2.670608170906783e-5,2.1439805851815076e-8,-8.800081064751453e-4,2.661959400830792e-5,2.140644761622855e-8,-8.796247407013677e-4,2.6608697363742646e-5,2.1406789555317838e-8,-8.792309875330124e-4,2.668453948521081e-5,2.1445354689839482e-8,-8.788585456571649e-4,2.684586308158884e-5,2.152116684744657e-8,-8.78539601693883e-4,2.7076554888474195e-5,2.162673250547703e-8,-8.783011687268403e-4,2.7344451028370228e-5,2.1747606543339466e-8,-8.781575952511767e-4,2.760340690883203e-5,2.1863392752506867e-8,-8.781030584565838e-4,2.780060405021578e-5,2.1951002414711444e-8,-8.781075985026394e-4,2.7889387640801088e-5,2.1990279643567898e-8,-8.781205807905475e-4,2.7844561840664714e-5,2.197066505165757e-8,-8.780829418086908e-4,2.767387999018061e-5,2.1896173090185512e-8,-8.779448870805086e-4,2.74194206923248e-5,2.178590013371832e-8,-8.776820355245091e-4,2.7146767973214645e-5,2.166911671129024e-8,-8.773032995196551e-4,2.692589193920319e-5,2.157667830482182e-8,-8.768478522267831e-4,2.6811226903755186e-5,2.153215088316852e-8,-8.763733034865937e-4,2.6827771709541934e-5,2.1545755773169187e-8,-8.759398672705631e-4,2.6966612293309254e-5,2.1612637371882027e-8,-8.75595423955086e-4,2.718972268856917e-5,2.171528609991872e-8,-8.753651397527334e-4,2.744156484383133e-5,2.182888124213572e-8,-8.75247681912975e-4,2.766380317219204e-5,2.1927841507686533e-8,-8.752182834583848e-4,2.7809084316441637e-5,2.1991802394858896e-8,-8.752370705991506e-4,2.78503969031841e-5,2.2009553750829985e-8,-8.752596751637627e-4,2.7784140827711733e-5,2.1980196488628183e-8,-8.752468743315799e-4,2.7627256123099378e-5,2.1911727125109708e-8,-8.751709906385506e-4,2.741056684869909e-5,2.181802519722558e-8,-8.750184292407893e-4,2.717106230583093e-5,2.1715442258405405e-8,-8.747891179445456e-4,2.6945211256019782e-5,2.161989799005169e-8,-8.744942264117304e-4,2.6764246324536103e-5,2.1544865267399724e-8,-8.741534012510591e-4,2.6651298588158375e-5,2.1500162537119337e-8,-8.73792188217311e-4,2.6619664630001775e-5,2.1491228293641114e-8,-8.734396730616577e-4,2.6671435073366737e-5,2.1518551762450664e-8,-8.731258580016011e-4,2.679606382670435e-5,2.1577100432093963e-8,-8.7287798682881e-4,2.696908317973565e-5,2.165584590639723e-8,-8.727151324958717e-4,2.7152056798777518e-5,2.1737843898724333e-8,-8.726411876491597e-4,2.7295776371153268e-5,2.180169400597056e-8,-8.72638123277193e-4,2.7348884643569248e-5,2.1825288578833227e-8,-8.726635290724197e-4,2.7272385770363037e-5,2.1792059497611342e-8,-8.726572026318421e-4,2.7056308642078688e-5,2.16981558387545e-8,-8.725583379939474e-4,2.673014546177635e-5,2.1556946339519295e-8,-8.723277672615219e-4,2.6358529275551267e-5,2.1397083391496553e-8,-8.719640776249092e-4,2.6020955368897574e-5,2.1253534423843147e-8,-8.715045501738401e-4,2.5784651947306544e-5,2.1155571953329428e-8,-8.71011034255676e-4,2.5683903518439307e-5,2.1117663450457478e-8,-8.705491307552995e-4,2.5713812934991007e-5,2.113685431521052e-8,-8.701702166525884e-4,2.5837496324388218e-5,2.119617587482424e-8,-8.699014006819977e-4,2.6000426627921144e-5,2.1271201276789622e-8,-8.697436570127698e-4,2.6145631661998167e-5,2.1336868320268546e-8,-8.696759171271625e-4,2.6225891752515828E-05,2.137282593288771e-8,-8.696624900426764e-4,2.621144415050257e-5,2.136666972028361e-8,-8.696616766384265e-4,2.609309797451578e-5,2.1315093592520665e-8,-8.696339802855976e-4,2.58812240139253e-5,2.1223246173929514e-8,-8.695486258957221e-4,2.560145694153938e-5,2.1102720086846007e-8,-8.693875014404906e-4,2.5288439658636282e-5,2.096877998090809e-8,-8.691463110554454e-4,2.4979158898865863e-5,2.083749001199522e-8,-8.688333814216199e-4,2.4707133641329762e-5,2.0723252879501703e-8,-8.684669509396333e-4,2.449818770419122e-5,2.0637035505226535e-8,-8.680718625220174e-4,2.4367943926356345e-5,2.0585317375536392e-8,-8.676763190924599e-4,2.432063005736646e-5,2.0569587886541e-8,-8.673088635246923e-4,2.4348592526606557e-5,2.0586157121313442e-8,-8.669953180759233e-4,2.4432155464044134e-5,2.0626149014017224e-8,-8.667551694766482e-4,2.4539935083866278e-5,2.0675728630559995e-8,-8.665969051568935e-4,2.4630410220170644e-5,2.0716875446414914e-8,-8.665124727648299e-4,2.4656354944466406e-5,2.0729342915038327e-8,-8.664725697134575e-4,2.4573949994687252e-5,2.0694555012387574e-8,-8.664264664054185e-4,2.43569138231536e-5,2.0601608133330403e-8,-8.663110139622543e-4,2.401199304406164e-5,2.0453867175701917e-8,-8.660704693962533e-4,2.3586965902470763e-5,2.0272378725582345e-8,-8.656806366986982e-4,2.316147155005631e-5,2.0091868871878088e-8,-8.651633988921566e-4,2.281978312873848e-5,1.9948869925345905e-8,-8.645805810525198e-4,2.2618527290404762e-5,1.9867633866200034e-8,-8.640097643843145e-4,2.256770525095591e-5,1.9851904328723277e-8,-8.635166675543678e-4,2.2633614094821955e-5,1.9886336038762515e-8,-8.63137948012429e-4,2.2757311910044172e-5,1.9944743482180508e-8,-8.628781813717942e-4,2.2875933655872637e-5,1.9999555353413913e-8,-8.62716501594731e-4,2.2938215554097242e-5,2.0028639520069148e-8,-8.626167844185233e-4,2.291219190087368e-5,2.0018587878018706e-8,-8.625373867297079e-4,2.2786717609544522e-5,1.9965210231098124e-8,-8.624388179572647e-4,2.256927580919071e-5,1.987237287145151e-8,-8.62289189850553e-4,2.2281913356921493e-5,1.975006320331657e-8,-8.620677332013985e-4,2.195621272300181e-5,1.9612130462789248e-8,-8.617664966194991e-4,2.16277997444501e-5,1.9473928068892485e-8,-8.613902656342819e-4,2.1330954467429593e-5,1.935006757875441e-8,-8.609548908336364e-4,2.109389378252815e-5,1.9252475069560743e-8,-8.60484364617139e-4,2.0935189055747062e-5,1.9188905233103563e-8,-8.600071436128826e-4,2.086164348674763e-5,1.91620410767755e-8,-8.595522857630777e-4,2.086763182325774e-5,1.916920143547591e-8,-8.591457649603986e-4,2.0935595960451394e-5,1.9202563113239573e-8,-8.588070106868445e-4,2.103741778004402e-5,1.9249802291736785e-8,-8.585455278490724e-4,2.1136657572340328e-5,1.9295144248855717e-8,-8.583574459539792e-4,2.119206027325631e-5,1.9320951414396224e-8,-8.582223041875423e-4,2.1163256231024873e-5,1.9310193204886934e-8,-8.581015046639913e-4,2.1019633830437e-5,1.9250187621650533e-8,-8.579412331421961e-4,2.0752106826417253e-5,1.913751847356446e-8,-8.576831677947019e-4,2.0384459053393114e-5,1.898276909784322e-8,-8.572838524692297e-4,1.997686961930766e-5,1.8811952221028124e-8,-8.567366035007616e-4,1.9613260947646273e-5,1.8661045623987466e-8,-8.560824766647061e-4,1.9371935268362093e-5,1.8563376708157653e-8,-8.553990379155328e-4,1.9293084341216936e-5,1.8535706064271064e-8,-8.547703530167884e-4,1.936321412352537e-5,1.8571651992880513e-8,-8.542559556665059e-4,1.952555465174852e-5,1.864632532315067e-8,-8.538756727449201e-4,1.970687106733324e-5,1.8727989569739696e-8,-8.536133022643489e-4,1.9843141688829028e-5,1.8789169711081318e-8,-8.534305325201742e-4,1.989357508587466e-5,1.8812667709058706e-8,-8.532814843157356e-4,1.984307509264013e-5,1.879252452479186e-8,-8.531232008002682e-4,1.969807749884717e-5,1.8732068113313398e-8,-8.529215833508998e-4,1.9480194465247334e-5,1.864101205609392e-8,-8.526540395091069e-4,1.9220106769211913e-5,1.8532719999846374e-8,-8.523103008730304e-4,1.8952387630912345e-5,1.8421969114052342e-8,-8.518922166171214e-4,1.8711017815063302e-5,1.83230973754797e-8,-8.514126718644334e-4,1.8525339647629737e-5,1.8248378472723516e-8,-8.508935758492765e-4,1.8416482805648164e-5,1.820658103690855e-8,-8.503628746581636e-4,1.839451037204468e-5,1.8201787199229734e-8,-8.498506739728784e-4,1.8456726342008194e-5,1.823266217066025e-8,-8.493848597949864e-4,1.858755364818312e-5,1.8292382925859e-8,-8.489867877928165e-4,1.8760075533750793e-5,1.8369304773500778e-8,-8.486675197616957e-4,1.8939094885436825e-5,1.8448317961918758e-8,-8.484249414374999e-4,1.908551666785093e-5,1.8512794690847823e-8,-8.482420318448436e-4,1.9161892414962764e-5,1.854700959220887e-8,-8.480866947760388e-4,1.9139120485201888e-5,1.853898427741999e-8,-8.47914089849887e-4,1.9004229019293404e-5,1.8483705191242097e-8,-8.476729841454053e-4,1.8768219337488148e-5,1.8386304668266145e-8,-8.473174336537129e-4,1.847105600233066e-5,1.8264025543393118e-8,-8.46823043761053e-4,1.8178888378359918e-5,1.814493877116609e-8,-8.462024594710862e-4,1.7968779622830955e-5,1.8061442704564362e-8,-8.455100213327113e-4,1.790201857047041e-5,1.8039011781499097e-8,-8.44827387250912e-4,1.7997506299222376e-5,1.8085063263440332e-8,-8.442336473553949e-4,1.82219741246474e-5,1.8184995677384506e-8,-8.437761660142642e-4,1.8504766407932626e-5,1.8308588065556925e-8,-8.434584576481965e-4,1.8767662195956877e-5,1.842267679658266e-8,-8.4324815382798e-4,1.895151458304113e-5,1.8502419193258396e-8,-8.430953104809079e-4,1.9028223922689918e-5,1.853631028756183e-8,-8.429494942284543e-4,1.8998849917980934e-5,1.852528741826402e-8,-8.427701821877676e-4,1.8884905878580218e-5,1.8478909462789927E-08,-8.425307640973115e-4,1.8718917804788393e-5,1.8411232187863652e-8,-8.4221863676526e-4,1.853706175763964e-5,1.8337626368837928e-8,-8.418337179676496e-4,1.837420046907955e-5,1.827269721178165e-8,-8.413866423383756e-4,1.8260484347668602e-5,1.822893007494307e-8,-8.408968704231464e-4,1.8218648925198794e-5,1.821564458019552e-8,-8.403904546985228e-4,1.8261602613572497e-5,1.8238040596675744e-8,-8.398971047784783e-4,1.8390365569227584e-5,1.8296347683661744e-8,-8.394462933471349e-4,1.859286581010708e-5,1.8385307406524103e-8,-8.390625554693548e-4,1.8844349042141637e-5,1.849434016111365e-8,-8.387606740926772e-4,1.9109956838288736e-5,1.86086555425353e-8,-8.38541735765671e-4,1.934955354341349e-5,1.871133966197072e-8,-8.383910411803681e-4,1.9524369896896514e-5,1.8786212347626552e-8,-8.382786396254357e-4,1.9604517498810704e-5,1.882101552190826e-8,-8.381628606157513e-4,1.957613104080785e-5,1.8810378176449664e-8,-8.379968680478822e-4,1.9446885164135782e-5,1.8758024552986323e-8,-8.377380159940519e-4,1.924845999124919e-5,1.8677651607636933e-8,-8.373591718549969e-4,1.9034058927322546e-5,1.8591733411884385e-8,-8.368597531357094e-4,1.886904423475679e-5,1.8527502435010273e-8,-8.362722099438048e-4,1.881422597460021e-5,1.8509963766801086e-8,-8.356585036787218e-4,1.890516421021724e-5,1.8553367099453363e-8,-8.350935969910999e-4,1.913599743885326e-5,1.865465529485676e-8,-8.346403242080155e-4,1.945802313397077e-5,1.8793064946602195e-8,-8.34327545916489e-4,1.979670869488179e-5,1.893732043323308e-8,-8.341432058884843e-4,2.0079064624085877e-5,1.905704488089487e-8,-8.340443957116498e-4,2.0256813697895776e-5,1.9132370964305275e-8,-8.339762461212966e-4,2.0315496394862994e-5,1.915767659009268e-8,-8.338890176634837e-4,2.0269954024688864e-5,1.9139616310843984e-8,-8.337477088005211e-4,2.015310994528189e-5,1.9092327487425826e-8,-8.335344195487556e-4,2.0004740360878148e-5,1.9032641784256222e-8,-8.332464619472108e-4,1.9863456916696745e-5,1.897669433393755e-8,-8.328930721117551e-4,1.9762094713418337e-5,1.8938027533986976e-8,-8.32492297882966e-4,1.9725314418621403e-5,1.8926665101186917e-8,-8.32068415293489e-4,1.97681582273195e-5,1.8948588036477114e-8,-8.316495311428089e-4,1.9894810847537727e-5,1.900526818571205e-8,-8.312647852018803e-4,2.0097427747145573e-5,1.909320121864192e-8,-8.309406311115315e-4,2.0355522535096095e-5,1.9203660731413604e-8,-8.306961138447342e-4,2.0636898921431595e-5,1.9323105247655924e-8,-8.305378232200559e-4,2.0901137965268803e-5,1.9434664802670044e-8,-8.304559556956476e-4,2.1106081507306507e-5,1.9520878928693548e-8,-8.304232734093543e-4,2.121667553013109e-5,1.9567400873830927e-8,-8.303983658234531e-4,2.121422167099143e-5,1.9566836162855173e-8,-8.303333870477527e-4,2.1103220227911646e-5,1.952153119702011e-8,-8.301848490250651e-4,2.0913258553630374e-5,1.9444248405592745e-8,-8.299248979192241e-4,2.069466744819484e-5,1.935621254368111e-8,-8.295501421522738e-4,2.0508232040964325e-5,1.928269583340997e-8,-8.290853574454966e-4,2.0410715377186484e-5,1.9246942812164235e-8,-8.285801055587781e-4,2.0439332177392955e-5,1.9263794111536346e-8,-8.2809766077195e-4,2.059951905236773e-5,1.9334808940806114e-8,-8.276980402284858e-4,2.086083916102179e-5,1.944680759157122e-8,-8.274201421640853e-4,2.1164367562493242e-5,1.957510063623294e-8,-8.272700826664273e-4,2.1440488239337026e-5,1.9690891838981256e-8,-8.272211164209307e-4,2.163042771909038e-5,1.9770119508971764e-8,-8.272248984694739e-4,2.1702369405362463e-5,1.980002378644996e-8,-8.27228099796603e-4,2.1656229173428763e-5,1.9781034701150995e-8,-8.271868289199328e-4,2.151765544352276e-5,1.9724204114230814e-8,-8.270743741962598e-4,2.1326531390819485e-5,1.9646358599563786e-8,-8.26882219952542e-4,2.1125677324855516e-5,1.9565355735798533e-8,-8.266169368517766e-4,2.095292185174144e-5,1.94967870339568e-8,-8.262957480189584e-4,2.0836914464318622e-5,1.9452286083130493e-8,-8.25942474644233e-4,2.0795532754586838e-5,1.9438941053262905e-8,-8.255843718992038e-4,2.083550384946244e-5,1.9459206265133282e-8,-8.252495647333255e-4,2.095228065573517e-5,1.9510899184512012e-8,-8.249644062349847e-4,2.112985311313308e-5,1.958715392852858e-8,-8.247500865889223e-4,2.1340896571258705e-5,1.96765117319045e-8,-8.24618243855376e-4,2.1548299489712724e-5,1.9763583444848516e-8,-8.245661579256653e-4,2.1709369314150928e-5,1.983081139445514e-8,-8.245731982415894e-4,2.1783542272099323e-5,1.9861656355918796e-8,-8.246010337711906e-4,2.174293624505869e-5,1.9844932417100713e-8,-8.24599762693081e-4,2.1582829143363222e-5,1.9779092489063103e-8,-8.245199320168276e-4,2.1327443144663598e-5,1.9674559193285197e-8,-8.243271463267552e-4,2.1027056964939968e-5,1.9552443886955017e-8,-8.240137478913354e-4,2.0745880537874062E-05,1.9439417625111437e-8,-8.236027048837928e-4,2.054443207807126e-5,1.9360323569771445e-8,-8.231420981185931e-4,2.046260583006955e-5,1.9331166390175837e-8,-8.226923062309316e-4,2.050897293837082e-5,1.9354816716611825e-8,-8.223101620532402e-4,2.065914064149752e-5,1.9420558033546697e-8,-8.220346412416486e-4,2.0863033376546166e-5,1.9507310836051278e-8,-8.218778118280972e-4,2.1058697312165184e-5,1.958944171580837e-8,-8.218233231961076e-4,2.1188662210092975e-5,1.964349015093813e-8,-8.218326197553458e-4,2.1214125651217814e-5,1.9653903415513317e-8,-8.21856605729153e-4,2.112285109501725e-5,1.9616154125454246e-8,-8.218486723198633e-4,2.092896166987658e-5,1.9536534435121197e-8,-8.21774900682099e-4,2.0665900016862456e-5,1.9429164058162805e-8,-8.216189955439171e-4,2.0376078120981753e-5,1.9311669317101807e-8,-8.213819939742871e-4,2.010103213726683e-5,1.9201115798957357e-8,-8.210785719648872e-4,1.987447711399243e-5,1.911118281263017e-8,-8.20732153301422e-4,1.9718757169934105e-5,1.905076891931154e-8,-8.203703758138432e-4,1.964388881521585e-5,1.9023668998090353e-8,-8.200215277640999e-4,1.9647991667492965e-5,1.9028805308153496e-8,-8.197118007420141e-4,1.971813517172542e-5,1.906061049159396e-8,-8.194627667111748e-4,1.983118207998987e-5,1.910940136475893e-8,-8.192884188063901e-4,1.99548908795387e-5,1.9161861647232118e-8,-8.191914615513263e-4,2.005020377589606e-5,1.920200887423933e-8,-8.191593400069361e-4,2.0076033762683125e-5,1.92131658914827e-8,-8.191616964490206e-4,1.999753215727303e-5,1.918132541360626e-8,-8.191520734989105e-4,1.9797250015148836e-5,1.909967483876304e-8,-8.190765586708921e-4,1.948575838000759e-5,1.8972896885336155e-8,-8.188893026085382e-4,1.9105659284594878e-5,1.881876618035338e-8,-8.185698549347501e-4,1.8723588649551148e-5,1.8664805935860888e-8,-8.181336800547649e-4,1.8410527065246534e-5,1.8540121068539456e-8,-8.176292682317155e-4,1.8218322499468568e-5,1.8465698823274743e-8,-8.171225750854558e-4,1.816336880244077e-5,1.844774602721915e-8,-8.166763753560664e-4,1.8224017124166648e-5,1.8476781130729858e-8,-8.163333375780404e-4,1.8350561857245017e-5,1.853193523194076e-8,-8.16107745214289e-4,1.8481632209535812e-5,1.8587831243527868e-8,-8.159860616604793e-4,1.8560533642340127e-5,1.8621333711184525e-8,-8.159338548044192e-4,1.8547406867931718e-5,1.8616474714546974e-8,-8.159059685028022e-4,1.8425544094309115e-5,1.856691337547998e-8,-8.158571772717478e-4,1.8201877478809365e-5,1.8475986230218312e-8,-8.157511568267292e-4,1.790263037304738e-5,1.8354797984609146e-8,-8.155662647845826e-4,1.756578402681822e-5,1.8219061692464088e-8,-8.152974777324008e-4,1.7232463817564305e-5,1.80855624276064e-8,-8.149548380423059e-4,1.6939285910434784e-5,1.79690735294896e-8,-8.14559552341495e-4,1.6713010048744217e-5,1.7880250136234366e-8,-8.141391520903434e-4,1.6567887899189816e-5,1.7824625038532265e-8,-8.13722894907782e-4,1.65052911686815e-5,1.7802510165505718e-8,-8.133380240113629e-4,1.6514764792978118e-5,1.7809448528021547e-8,-8.130068823177181e-4,1.6575692411162992e-5,1.7836899066496914e-8,-8.127444898746023e-4,1.6659173301351172e-5,1.787301036505299e-8,-8.12556110967037e-4,1.6730231029844328e-5,1.79035428156178e-8,-8.1243455505061e-4,1.6751012160459823e-5,1.7913194389418595e-8,-8.123576337801389e-4,1.6686038010803166e-5,1.7887740556088877e-8,-8.122873281432063e-4,1.6510317217035855e-5,1.7817300812807638e-8,-8.12173296759821e-4,1.6219656866485414e-5,1.7700472205744483e-8,-8.119633169768517e-4,1.5839706948872637e-5,1.754794502201198e-8,-8.116204935794114e-4,1.5427302108426434e-5,1.7382995748216617e-8,-8.111412381260521e-4,1.5058049525129414e-5,1.723638629723847e-8,-8.105632272728717e-4,1.4801145884299286e-5,1.713607209252042e-8,-8.099554919138893e-4,1.4692744717581516e-5,1.7096374287795603e-8,-8.093939263332287e-4,1.4722847634811913e-5,1.7112747706322244e-8,-8.089353936498745e-4,1.484233801753127e-5,1.7164799969601408e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json new file mode 100644 index 0000000..36daa45 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":6000,"numberOfSamples":1000,"samples":[-8.086030009769924e-4,1.4983810405869992e-5,1.7224897231104907e-8,-8.083859978917138e-4,1.5083891420443416e-5,1.7267300877946733e-8,-8.082495498012613e-4,1.5098334698112563e-5,1.727428602498279e-8,-8.08147627922185e-4,1.5007880436382382e-5,1.72384405012867e-8,-8.080344588306433e-4,1.4817024022017442e-5,1.716203842239244e-8,-8.078727223656254e-4,1.4548770451198794e-5,1.705477562558989e-8,-8.076383715174149e-4,1.4237727414253643e-5,1.6930867623711068e-8,-8.07322519250199e-4,1.3922902257012772e-5,1.6806096847405343e-8,-8.069308512481781e-4,1.3641062334595963e-5,1.6695163186853533e-8,-8.064810674365431e-4,1.3421371907981373e-5,1.6609600165603765e-8,-8.059989962711845e-4,1.3281793410593358e-5,1.65564122262766e-8,-8.055140919096513e-4,1.3227437282497666e-5,1.6537470119423336e-8,-8.050550211507427e-4,1.3250758311506548e-5,1.654960752689265e-8,-8.046459011976815e-4,1.3333167640947059e-5,1.658525704041747e-8,-8.04303377210941e-4,1.3447472960351647e-5,1.6633415280209964e-8,-8.040343930544604e-4,1.3560785131852206e-5,1.6680814883554258e-8,-8.038344371049681e-4,1.3637887698738715e-5,1.6713305884428016e-8,-8.036861808400415e-4,1.3645376246194308e-5,1.6717552173535383e-8,-8.035588881624019e-4,1.355715046434086e-5,1.668324932697258e-8,-8.034098545481887e-4,1.3361633179672876e-5,1.660599824235996e-8,-8.031899161995416e-4,1.3069806636622722e-5,1.6490473396248044e-8,-8.028548171317579e-4,1.2720836118968e-5,1.635260915989386e-8,-8.023817298130074e-4,1.2379672673151174e-5,1.6218567533971117e-8,-8.017848916609258e-4,1.21214866090865e-5,1.6118432225501397e-8,-8.011195394685814e-4,1.2004672862047483e-5,1.6075358566152277e-8,-8.004664161243661e-4,1.2045064498369676e-5,1.6095295025865495e-8,-7.999018683719954e-4,1.2207888551202842e-5,1.6163899894807838e-8,-7.994702224832471e-4,1.242340488168506e-5,1.625294935668257e-8,-7.991732540075557e-4,1.2615665237930678e-5,1.6331930886767175e-8,-7.989782632286061e-4,1.2727385321542004e-5,1.6378010390939176e-8,-7.988353176257354e-4,1.2731278778766297e-5,1.6380533700705246e-8,-7.98693545654588e-4,1.262891363153558e-5,1.6340492793338305e-8,-7.985117563218257e-4,1.2443008649451221e-5,1.6267331548458157e-8,-7.982633092416262e-4,1.2208291416633506e-5,1.617517573988445e-8,-7.97937024226046e-4,1.1963551111059878e-5,1.6079587401967125e-8,-7.975359220318068e-4,1.1745517867734186e-5,1.5995123017000115e-8,-7.970748169146011e-4,1.1584298423249006e-5,1.5933578635139873e-8,-7.96577147084504e-4,1.1500116000004205e-5,1.59027823489698e-8,-7.960712612774264e-4,1.1501312858278244e-5,1.5905873133149612e-8,-7.955863788122124e-4,1.1583659586297626e-5,1.5941057128577827e-8,-7.951485028139105e-4,1.1731083070377464e-5,1.6001886167851592e-8,-7.947767272267163e-4,1.191780985300591e-5,1.607808021319529e-8,-7.944803671342594e-4,1.2111620389700717e-5,1.615680382240154e-8,-7.942570988685387e-4,1.2277833661532118e-5,1.622426162217438e-8,-7.940921495251726e-4,1.2383811890041994e-5,1.6267523534675877e-8,-7.939586304605242e-4,1.2403888228974189e-5,1.627651653757225e-8,-7.938193280601158e-4,1.2324675476991541e-5,1.6246136706354253e-8,-7.936307142675456e-4,1.2150538325271284e-5,1.6178380649204796e-8,-7.933502814410618e-4,1.1908091876990174e-5,1.608405253597014e-8,-7.929477558193591e-4,1.164701184564693e-5,1.5982993948326116e-8,-7.924185834346178e-4,1.1433225812865484e-5,1.5901308272972388e-8,-7.91794201526995e-4,1.1331683271163489e-5,1.5864503448445484e-8,-7.911404620961953e-4,1.1381697803054312e-5,1.5887775959579784e-8,-7.905387505296019e-4,1.1576581858174432e-5,1.5968081661271605e-8,-7.900557579253249e-4,1.1862063556780149e-5,1.6083659449037498e-8,-7.897185238722374e-4,1.2157584885353175e-5,1.6202533533502623e-8,-7.895090488599649e-4,1.238821600505574e-5,1.629512295943271e-8,-7.893784662655317e-4,1.2508703453700893e-5,1.6343711956180873e-8,-7.892687928634058e-4,1.2510154891614356e-5,1.6345059350363414e-8,-7.891303130012338e-4,1.2412762325594466e-5,1.630746636423513e-8,-7.889301607306106e-4,1.22532563576661e-5,1.6245726990312346e-8,-7.886537075923972e-4,1.207350096757021e-5,1.6176528951831164e-8,-7.883021088407754e-4,1.1912612868365128e-5,1.611529698390703e-8,-7.878886554381245e-4,1.1802366938175958e-5,1.6074404646753326e-8,-7.874351827903575e-4,1.1764678405500699e-5,1.606225725212218e-8,-7.869686785579548e-4,1.1810193745663737e-5,1.6082821884922013e-8,-7.865178808041266e-4,1.1937644143326378e-5,1.613543027797478e-8,-7.861097334099989e-4,1.2134002375285157e-5,1.621485643068633e-8,-7.857657050956631e-4,1.2375715139896458e-5,1.631178566628287e-8,-7.854982761710509e-4,1.2631342722271491e-5,1.6413830995212057e-8,-7.853082129742637e-4,1.2865627763957707e-5,1.650712800670973e-8,-7.851832404152557e-4,1.3044611801087987e-5,1.6578365268496393e-8,-7.850984979333072e-4,1.3141234772513003e-5,1.661701655440917e-8,-7.850189859904393e-4,1.314074642924285e-5,1.6617484545055545e-8,-7.849040783473408e-4,1.3045167089176555e-5,1.658083277620777e-8,-7.847140887854131e-4,1.2875989940709468e-5,1.6515781106734278e-8,-7.84418739673568e-4,1.2674020385660439e-5,1.643854403323704e-8,-7.840067264380274e-4,1.2494690124657561e-5,1.637089555624342e-8,-7.834940629310338e-4,1.2397202649814611e-5,1.633586078646625e-8,-7.829269123445694e-4,1.242762480633356e-5,1.6351121218225165e-8,-7.823738580167101e-4,1.2600199243328678e-5,1.6421819173272966e-8,-7.819059640317111e-4,1.2886068491034284e-5,1.6536310251172648e-8,-7.815711190078477e-4,1.3218908359013295e-5,1.6668481029581357e-8,-7.813760467322517e-4,1.3518369457025356e-5,1.678692018769316e-8,-7.812866097556989e-4,1.3719738169680302e-5,1.6866455278038853e-8,-7.81245043675736e-4,1.3793772038801468e-5,1.689586528796916e-8,-7.811924892995569e-4,1.3748855436262393e-5,1.6878708749903426e-8,-7.810853126995724e-4,1.3619700644445478e-5,1.6828864667497608e-8,-7.809012145161698e-4,1.3452099763330615e-5,1.6764485192192976e-8,-7.806376216935296e-4,1.3290653946538645e-5,1.6703112676782687e-8,-7.803066615377375e-4,1.31716120529323e-5,1.6658847878700447e-8,-7.799298430182615e-4,1.311988593603372e-5,1.6641219568441624e-8,-7.795337437080761e-4,1.3148379669826384e-5,1.665500141543589e-8,-7.791466519745774e-4,1.3258192670318894e-5,1.6700371540229692e-8,-7.787956166079658e-4,1.3439123013885566e-5,1.6773161126941902e-8,-7.785034521569552e-4,1.3670540636302536e-5,1.6865211246133127e-8,-7.782855194761558e-4,1.3923070098588027e-5,1.6965022456657025e-8,-7.781465158733033e-4,1.4161671472159447e-5,1.705894395665733e-8,-7.780780274644127e-4,1.4350439747166847e-5,1.713304166764391e-8,-7.780578724819625e-4,1.4458808126371696e-5,1.717552433911576e-8,-7.780520945693767e-4,1.4468165316748068e-5,1.7179332308174036e-8,-7.780199264883032e-4,1.4377381074197417e-5,1.7144283672725583e-8,-7.779212697790456e-4,1.42055818063788e-5,1.707811591367681e-8,-7.777254715128031e-4,1.399092160934568e-5,1.6995928407681764e-8,-7.774196852037493e-4,1.37848241088391e-5,1.691784077706239e-8,-7.770148281025337e-4,1.3641905255902624e-5,1.68649932739021e-8,-7.7654695118254e-4,1.3606723344494496e-5,1.6854386908037733e-8,-7.760719733956719e-4,1.3699981752654324e-5,1.6893614104122298e-8,-7.756528920660803e-4,1.3908611710779359e-5,1.6977171984468366e-8,-7.753414973715193e-4,1.4185135339496087e-5,1.708636928482128e-8,-7.751607783545031e-4,1.4459758828692502e-5,1.7194078255654558e-8,-7.750965022472446e-4,1.4662655192892729e-5,1.7273331572288793e-8,-7.751031768498831e-4,1.4747011345581016e-5,1.730618293517172e-8,-7.751215862559233e-4,1.4701900854900151e-5,1.7288656969080978e-8,-7.750986283316115e-4,1.45502732264208e-5,1.7229950783472687e-8,-7.750005720993924e-4,1.4336090541435382e-5,1.714739884303355e-8,-7.748166257563864e-4,1.4108830030091316e-5,1.7060381671628664e-8,-7.74555246270904e-4,1.3911680743308552e-5,1.6985680755460048e-8,-7.742375216046733e-4,1.3775437312394145e-5,1.6935101840957774e-8,-7.738908672395347e-4,1.3716934985120997e-5,1.691492118059338e-8,-7.735443296708602e-4,1.373987657547806e-5,1.6926288994825302e-8,-7.732253688257358e-4,1.3836379992091725e-5,1.6965903557041073e-8,-7.729574201870145e-4,1.398850143961783e-5,1.702664562074045e-8,-7.727575479089458e-4,1.41697546103367e-5,1.7098179346093112e-8,-7.726338127068317e-4,1.4347167415583573e-5,1.7167741915981117e-8,-7.72582526013079e-4,1.4484672906976143e-5,1.7221441721592798e-8,-7.725862452751478e-4,1.4548420666369706e-5,1.724630156120042e-8,-7.726138958417847e-4,1.4513823225779425e-5,1.723297684502607e-8,-7.726244080267737e-4,1.4372974279860863e-5,1.717861929269323e-8,-7.725743889406402e-4,1.4139927504773041e-5,1.708890500581759e-8,-7.724286327675101e-4,1.3851021527237483e-5,1.6978122122320604e-8,-7.721705055599232e-4,1.3558663671444288e-5,1.6866694872960056e-8,-7.718085762849863e-4,1.3319387181004731e-5,1.6776479385700888e-8,-7.713767987397502e-4,1.3179295367351444e-5,1.6725086614472134e-8,-7.709275714331829e-4,1.3161122848693512e-5,1.6720920077215314e-8,-7.705191844169844e-4,1.3256827859980563e-5,1.6760442718757147e-8,-7.702008063045723e-4,1.3428227793557443e-5,1.6828582942267516e-8,-7.699990644679152e-4,1.361618554202354e-5,1.6902388068197547e-8,-7.699104039245936e-4,1.3756467861176603e-5,1.6957151603506948e-8,-7.699023224946573e-4,1.3797806695198463e-5,1.697331252819716e-8,-7.69923693570122e-4,1.3715970518988264e-5,1.6941802014512077e-8,-7.699204730517889e-4,1.3518607018056203e-5,1.686585566047806e-8,-7.698506029324883e-4,1.3239647040700348e-5,1.675881321149357e-8,-7.696928309426752e-4,1.292679553392078e-5,1.663924458294889e-8,-7.694477547487295e-4,1.2627916951666916e-5,1.6525649634657365e-8,-7.691330174202381e-4,1.2380977939982187e-5,1.6432564147368763e-8,-7.687761526504343e-4,1.2209237379755138e-5,1.6368739832210366e-8,-7.684079653894965e-4,1.2120781661778011e-5,1.633703602331063e-8,-7.680577369530784e-4,1.2110432408898472e-5,1.6335228492463344e-8,-7.677501944254693e-4,1.21623329271923e-5,1.6357054465017322e-8,-7.675035516029946e-4,1.2252353588631538e-5,1.6393155437041988e-8,-7.673278510063229e-4,1.2350244031443248e-5,1.6431898304259127e-8,-7.672231013092557e-4,1.2422047112441263e-5,1.6460286860244704e-8,-7.671772688900853e-4,1.243363156115782e-5,1.6465302548663993e-8,-7.671649640707796e-4,1.2356108383738767e-5,1.6435971563363704e-8,-7.671484101972802e-4,1.2173134658280302e-5,1.6366160768870968e-8,-7.670825263514741e-4,1.188858814480631e-5,1.6257519307403445e-8,-7.669249561884815e-4,1.153125860759139e-5,1.6121270567197454e-8,-7.666492306156377e-4,1.115245465159126e-5,1.5977261511360678e-8,-7.662560978121537e-4,1.0814456656206232e-5,1.5849466079461248e-8,-7.657770512027595e-4,1.05724402594284e-5,1.5758977593618244e-8,-7.65267023298901e-4,1.0456872508954073e-5,1.571723833544501e-8,-7.647885985095952e-4,1.0463873633946137e-5,1.5722417018223885e-8,-7.643941100002343e-4,1.0557097979145212e-5,1.5760262592280024e-8,-7.641121194876584e-4,1.0679365871370066e-5,1.580868049828012e-8,-7.639418824019487e-4,1.0769014504534602e-5,1.5844044262621295e-8,-7.63856040874777e-4,1.0775642632836637e-5,1.5847200884499e-8,-7.638095816807227e-4,1.067134664327151e-5,1.5807708446849496e-8,-7.637520719001363e-4,1.0455341968064698e-5,1.5725533933861105e-8,-7.636398633410946e-4,1.015159717703648e-5,1.5610082730947348e-8,-7.634452271731003e-4,9.80080001717917e-6,1.547706895850993e-8,-7.63160419406769e-4,9.449412193445568e-6,1.5344290126782374e-8,-7.627963935193374e-4,9.13916163473737e-6,1.522760366709052e-8,-7.623775983584871e-4,8.899634906261868e-6,1.5138131787055436e-8,-7.619351862275943e-4,8.745021320744058e-6,1.5081084100568852e-8,-7.615007251523846e-4,8.674467790722235e-6,1.5055961298020598E-08,-7.611015754607918e-4,8.674636046522299e-6,1.5057573206547553e-8,-7.607580727699104e-4,8.723012138457471e-6,1.507730793528806e-8,-7.604819845856674e-4,8.79104729455283e-6,1.5104310215033872e-8,-7.602755220059144e-4,8.84693302571431e-6,1.512651308174354e-8,-7.60130395955743e-4,8.858401879917029e-6,1.5131688225382546e-8,-7.600268787531797e-4,8.796280560370882e-6,1.5108794499177295e-8,-7.599335469922736e-4,8.639531259323042e-6,1.5049899963453894e-8,-0.000759809210702789,8.381910431287344e-6,1.495271925500096e-8,-7.596089689111743e-4,8.038852722231386e-6,1.4823230368913413e-8,-7.592954714676379e-4,7.651012523481406e-6,1.4677004696445236e-8,-7.588534536653339e-4,7.279557888325591e-6,1.4537373653592984e-8,-7.583012167940397e-4,6.990438849818558e-6,1.4429384557414762e-8,-7.576907836367265e-4,6.831496399448591e-6,1.4371061617021388e-8,-7.570930731261787e-4,6.813281142864784e-6,1.4366159181078007e-8,-7.56573893838745e-4,6.904553518906711e-6,1.440256548875904e-8,-7.561728030269616e-4,7.044803405478948e-6,1.445716559337654e-8,-7.55894167206311e-4,7.166043359666975e-6,1.450415417168199e-8,-7.55711412564325e-4,7.212993883249746e-6,1.4522671727194704e-8,-7.555791656848098e-4,7.1549930276133835e-6,1.4501273602714309e-8,-7.554470640511585e-4,6.988776194001312e-6,1.443893097512812e-8,-7.552712370159999e-4,6.734529749762169e-6,1.4343479112262025e-8,-7.550218631592772e-4,6.428246653777687e-6,1.422866437274883e-8,-7.546866678361489e-4,6.112788824185316e-6,1.4110719482184918e-8,-7.542707923333388e-4,5.8292867079302145e-6,1.400510243390426e-8,-7.537936783321645e-4,5.610111184424559e-6,1.392387568318107e-8,-7.532839358400108e-4,5.474383321977379e-6,1.3874075234006555e-8,-7.527734587962739e-4,5.42640635004478e-6,1.3857186797906472e-8,-7.522919859404003e-4,5.45669894844625e-6,1.386957766596827e-8,-7.518629339501932e-4,5.544851652733658e-6,1.3903575419281547e-8,-7.515008253699221e-4,5.66324214311497e-6,1.3948838400251825e-8,-7.51210094786353e-4,5.780767390543559e-6,1.3993723032625362e-8,-7.509847483529711e-4,5.866229168685598e-6,1.4026532943938554e-8,-7.508084438557491e-4,5.891537175053618e-6,1.4036723339664531e-8,-7.506548991499108e-4,5.835186884660035e-6,1.4016225902040902e-8,-7.504890649576297e-4,5.6865153995048614e-6,1.3961069522205696e-8,-7.502702069824309e-4,5.450810519333698e-6,1.3873309470797243e-8,-7.499584705215199e-4,5.154093641144201e-6,1.376281194863296e-8,-7.495258303846799e-4,4.844492327076601e-6,1.3647730610076522e-8,-7.489697010459084e-4,4.585680212391129e-6,1.3551982235163058e-8,-7.483229773845283e-4,4.439424944083938e-6,1.3498642646116442e-8,-7.47651384167147e-4,4.441135789993236e-6,1.3500781498633393e-8,-7.47033630108719e-4,4.5810783550153105e-6,1.3554518828823992e-8,-7.465319640685318e-4,4.8048662841334895e-6,1.3639340521473976e-8,-7.461696806020518e-4,5.035072310667735e-6,1.3726250888424918e-8,-7.45927649234082e-4,5.200984456189078e-6,1.3788876550238137e-8,-7.457581262680648e-4,5.260058265685222e-6,1.3811432021938078e-8,-7.456046602651826e-4,5.203880705388684e-6,1.3790914319102578e-8,-7.454181631269655e-4,5.052110434397819e-6,1.373481274651468e-8,-7.451656280700271e-4,4.841472760620587e-6,1.3656958068869079e-8,-7.448325507537849e-4,4.61494382342504e-6,1.357343640410499e-8,-7.444214445461733e-4,4.413322175715639e-6,1.3499417669267064e-8,-7.439484346229335e-4,4.2694368736615086e-6,1.3447009746671435e-8,-7.434389857049532e-4,4.204518303627032e-6,1.3423957631836567e-8,-7.429232000552066e-4,4.22642353337615e-6,1.3433047936838739e-8,-7.424310713391792e-4,4.3296407656193255e-6,1.3472159698785832e-8,-7.419881612882491e-4,4.496920195240808e-6,1.3534885426142835e-8,-7.416121363128246e-4,4.702242436589464e-6,1.3611614172495427e-8,-7.413105280088105e-4,4.9146848337064315e-6,1.369092983616905e-8,-7.410798564648585e-4,5.102579289552534e-6,1.3761123342581654e-8,-7.409059284613239e-4,5.2374620959614515e-6,1.3811649751762265e-8,-7.40765021747722e-4,5.2976581500819286e-6,1.3834473325427858e-8,-7.406258251361314e-4,5.271569720175211e-6,1.3825313013330133e-8,-7.404522940607082e-4,5.16079816624066e-6,1.3784817350730312e-8,-7.402080188256512e-4,4.982998369865964e-6,1.3719616164717567e-8,-7.398629579022926e-4,4.773502162654375e-6,1.3642888630399176e-8,-7.394027814983437e-4,4.583451075155526e-6,1.3573616754794363e-8,-7.388391120671625e-4,4.471358391383276e-6,1.3533406453527241e-8,-7.382156353710173e-4,4.486293417993243e-6,1.3540246689754017e-8,-7.376025584177996e-4,4.646263952038066e-6,1.360057244394542e-8,-7.370753966750942e-4,4.923220958661702e-6,1.3703844593894654e-8,-7.366853493943496e-4,5.247831278658755e-6,1.3824412277992002e-8,-7.364384127765779e-4,5.535851078356583e-6,1.3931243008841947e-8,-7.362964904189415e-4,5.721421847439438e-6,1.400013251189647e-8,-7.361977969831083e-4,5.777834083495166e-6,1.4021317172913075e-8,-7.360817614101209e-4,5.717840477241389e-6,1.3999596259483795e-8,-7.359055977095308e-4,5.580085272187351e-6,1.3949330970951832e-8,-7.356494891230436e-4,5.412741838724204e-6,1.3888375540751401e-8,-7.353140711726487e-4,5.2611317114854454e-6,1.3833462198014537e-8,-7.349148352444343e-4,5.160747629068616e-6,1.3797605620566516e-8,-7.34476381499244e-4,5.134402307300587e-6,1.378907362699951e-8,-7.340275945238301e-4,5.1916865952263e-6,1.3811240956866352e-8,-7.335976379390709e-4,5.3295409738639065e-6,1.386285790594125e-8,-7.332124264851362e-4,5.533583318487555e-6,1.393857552488052e-8,-7.328914883847182e-4,5.780224195792896e-6,1.4029729175094004e-8,-7.326453464977734e-4,6.039657534633526e-6,1.412541622107681e-8,-7.324737353478441e-4,6.279722160979335e-6,1.4213885118568412e-8,-7.323650721376349e-4,6.470322863277057e-6,1.4284138014656952e-8,-7.322974036581984e-4,6.587844288483066e-6,1.4327549734585913e-8,-7.322407659586676e-4,6.619032470350085e-6,1.4339305787613665e-8,-7.321607813179032e-4,6.563928060747684e-6,1.4319492082724502e-8,-7.320233046863541e-4,6.4374966021072834e-6,1.4273690279829042e-8,-7.317999978283977e-4,6.269641412024475e-6,1.4212954276300681e-8,-7.314747508146167e-4,6.103003158628865e-6,1.415295567438129e-8,-7.310503956340962e-4,5.987372946262786e-6,1.4111888222525968e-8,-7.30553886574779e-4,5.969501086118192e-6,1.4106716472582734e-8,-7.300364338939657e-4,6.078516230287104e-6,1.4147877299553037e-8,-7.295642924788504e-4,6.3107236580662384e-6,1.4233817360402606e-8,-7.29198788762624e-4,6.622175486804494e-6,1.4348383535941494e-8,-7.289720333664855e-4,6.9380135239147e-6,1.4464270004578152e-8,-7.288720132220635e-4,7.178968146684719e-6,1.4552629285696456e-8,-7.288478475491566e-4,7.292033122646066e-6,1.4594189017363577e-8,-7.288324425920637e-4,7.267653302542506e-6,1.4585519239748402e-8,-7.287681356467766e-4,7.1358561174840265e-6,1.4537665753835853e-8,-7.286220514824529e-4,6.9483598487620115e-6,1.4469630977301123e-8,-7.28388085845522e-4,6.7592678922152605e-6,1.4401275496516345e-8,-7.280804913481166e-4,6.612273121504457e-6,1.4348581630811597e-8,-7.277252407959589e-4,6.5354231757555416e-6,1.4321716844225746e-8,-7.273527660572583e-4,6.540950211029966e-6,1.4324997142073501e-8,-7.269930114233965e-4,6.6273182842564705e-6,1.4357691570767854e-8,-7.26672240266485e-4,6.781718300136292e-6,1.4414990002890305e-8,-7.264107154812758e-4,6.982473886382033e-6,1.4488915944389668e-8,-7.262207318281119e-4,7.201524453767113e-6,1.4569238469116222e-8,-7.261048945983162e-4,7.407366857871365e-6,1.464452799757507e-8,-7.260549073749619e-4,7.568797659062485e-6,1.4703494431167381e-8,-7.26051465526772e-4,7.659436861891897e-6,1.4736614332348274e-8,-7.260658689683676e-4,7.662469338693832e-6,1.4737849783051846e-8,-7.260636091525101e-4,7.574690894230019e-6,1.4706123818166879e-8,-7.260097162467727e-4,7.408843381596091e-6,1.4646170303919831e-8,-7.258751869359084e-4,7.193327753172565e-6,1.4568414770672015e-8,-7.256434329193616e-4,6.968816351578809e-6,1.4487705994885722e-8,-7.253155606930208e-4,6.781829885047062e-6,1.4420936000282275e-8,-7.249132562182546e-4,6.6756763505280914e-6,1.4383719471977372e-8,-7.244778292372096e-4,6.679612946037396e-6,1.438647617104953e-8,-7.240638597492315e-4,6.798235959896041e-6,1.443065370266917e-8,-7.237266826504071e-4,7.004766318589259e-6,1.4506391489857573e-8,-7.235054613225411e-4,7.243025516191428e-6,1.4593301323513466e-8,-7.2340765660686e-4,7.441405783647142e-6,1.4665511557876749e-8,-7.234034010785615e-4,7.53631382926181e-6,1.4700082991218885e-8,-7.234351925205399e-4,7.495034347391305e-6,1.468523799630331e-8,-7.234393429224217e-4,7.325932982914151e-6,1.462407472647779e-8,-7.233679091640017e-4,7.071240070168453e-6,1.4531993918580552e-8,-7.2320061796834e-4,6.7884821942071435e-6,1.4429962503804012e-8,-7.229442000740695e-4,6.531515408382787e-6,1.4337580335722595e-8,-7.226237824510028e-4,6.338676971745417e-6,1.4268730878278133e-8,-7.222726609371696e-4,6.229186086844068e-6,1.4230270463511608e-8,-7.219243370456767e-4,6.204979076589403e-6,1.4222735101428858e-8,-7.216077209136364e-4,6.254637305234233e-6,1.424182454315981e-8,-7.213447052154808e-4,6.357313551246988e-6,1.427987548429127e-8,-7.211489353260135e-4,6.485977719230195e-6,1.432706196354135e-8,-7.210249390732579e-4,6.610178726644471e-6,1.4372391800318248e-8,-7.209673047686168e-4,6.69888928465445e-6,1.440471413451235e-8,-7.209601280974389e-4,6.7240278150433335e-6,1.4413965009805703e-8,-7.20977427897608e-4,6.664882671759e-6,1.4392744472576701e-8,-7.209854343714221e-4,6.51295128433434e-6,1.4338056762127022e-8,-7.209473640933031e-4,6.27595967171071e-6,1.4252764848687728e-8,-7.20830498270342e-4,5.979351536502665e-6,1.4146129546232638e-8,-7.206142541252474e-4,5.663667819126294e-6,1.4032848951131945e-8,-7.202969652261338e-4,5.377288241995543e-6,1.3930404038766788e-8,-7.198989165010806e-4,5.1656853148451214e-6,1.3855144520274798e-8,-7.194600346572165e-4,5.059761967389392e-6,1.381807600558674e-8,-7.190320840484526e-4,5.066413372274996e-6,1.3821501796020195e-8,-7.186667008859963e-4,5.164217116728777e-6,1.3857550892980985e-8,-7.184018625214499e-4,5.306290101127747e-6,1.3909277458429183e-8,-7.182503872805278e-4,5.430848543585556e-6,1.3954476928807232e-8,-7.181945402363831e-4,5.477745639924967e-6,1.3971593615188382e-8,-7.181899363308149e-4,5.406401461740874e-6,1.3946114620028615e-8,-7.181787956068019e-4,5.208432912413644e-6,1.3875092760960466e-8,-7.181080232052682e-4,4.909307597908525e-6,1.3767756999698908e-8,-7.179446434546303e-4,4.558250395919083e-6,1.3641890350548404e-8,-7.176825410055812e-4,4.2115104900122955e-6,1.3517783575060329e-8,-7.173394303115774e-4,3.9166207270580965e-6,1.3412530864261023e-8,-7.169476918402883e-4,3.7030604472824477e-6,1.3336657086835069e-8,-7.165441754546074e-4,3.5802790936875876e-6,1.3293434686648582e-8,-7.161624370313028e-4,3.540740334466443e-6,1.3280030267105057e-8,-7.158283342384227e-4,3.5648889198243974e-6,1.3289336702046267e-8,-7.155582446948228e-4,3.6259309695520506e-6,1.3311712356351884e-8,-7.153587035969551e-4,3.6936410852722728e-6,1.3336343509346127e-8,-7.152264834437153e-4,3.7373251672731826e-6,1.3352284086218272e-8,-7.151486443905965e-4,3.7285507918335262e-6,1.3349406474614047e-8,-7.151027106872547e-4,3.6443643170977546e-6,1.3319531867733131e-8,-7.150577088567976e-4,3.471371309569102e-6,1.3257885044742072e-8,-7.149771233861474e-4,3.2102934517910352e-6,1.3164734543938834e-8,-7.148246566289133e-4,2.879607352494538e-6,1.304671174381637e-8,-7.145727155168279e-4,2.5159715205526265e-6,1.2916970172838227e-8,-7.14211741474117e-4,2.1691340011926946e-6,1.2793345447593278e-8,-7.13756704294834e-4,1.8907340958244058e-6,1.2694309938959155e-8,-7.13246867286023e-4,1.7195895090076379e-6,1.263368292154631e-8,-7.127372110269032e-4,1.6687917986243744e-6,1.2616035558109819e-8,-7.122837106314069e-4,1.7200599947476228e-6,1.2634736954970411e-8,-7.11927625851379e-4,1.8279231828251246e-6,1.2673513419775649e-8,-7.116842639270483e-4,1.9322272870562014e-6,1.2710931582090524e-8,-7.115395372739504e-4,1.9745795969288553e-6,1.2726232447310445e-8,-7.114547557725002e-4,1.9136654302389338e-6,1.270474472926178e-8,-7.113777961538001e-4,1.735292690655213e-6,1.2641441637291946e-8,-7.112572859060644e-4,1.4546876493828617e-6,1.2541763992937194e-8,-7.110556761496227e-4,1.1107338000528394e-6,1.2419577806846834e-8,-7.107574398631749e-4,7.542984399074633e-7,1.2293006190122626e-8,-7.103703854584871e-4,4.3467766591549663e-7,1.2179579666103922e-8,-7.099206413352514e-4,1.8848792044254664e-7,1.209227121863942e-8,-7.094440058956009e-4,3.38112439872334e-8,1.2037433652280913e-8,-7.089770272256449e-4,-3.005946575574514e-8,1.2014751159396523e-8,-7.085502677011695e-4,-1.8942666134325098e-8,1.2018584823579895e-8,-7.081845728037587e-4,4.1504324056836106e-8,1.2039859175127503e-8,-7.078898530136206e-4,1.2085396250360532e-7,1.2067846450829226e-8,-7.07665357590904e-4,1.8796389173417595e-7,1.2091574008084617e-8,-7.075005062641622e-4,2.1404627281451953e-7,1.2100880394544461e-8,-7.073757642706145e-4,1.7527949313218791e-7,1.2087321949694448e-8,-7.072636271028598e-4,5.563556618695607e-8,1.2045175593473184e-8,-7.07130371455471e-4,-1.496666377152965e-7,1.1972682276401499e-8,-7.069396260706627e-4,-4.3038263800395507e-7,1.1873415802529695e-8,-7.06658736467273e-4,-7.585342773530107e-7,1.1757266370952408e-8,-7.062679103912365e-4,-1.0893111587869973e-6,1.164011958067034e-8,-7.057699493448573e-4,-1.3683565279279107e-6,1.1541242460665835e-8,-7.051958014848092e-4,-1.546143275736306e-6,1.1478149826314971e-8,-7.046006461074884e-4,-1.5955509000684547e-6,1.1460378253613378e-8,-7.040489785775769e-4,-1.5244730508863847e-6,1.1485082661954835e-8,-7.035938487042454e-4,-1.3758182686775965e-6,1.1537113738876136e-8,-7.032597812034259e-4,-1.2137575651664247e-6,1.1593901613711014e-8,-7.030369079407669e-4,-1.1027795845962554e-6,1.1632801609042198e-8,-7.028872532957906e-4,-1.0889580682558247e-6,1.1637630789638363e-8,-7.027584678100196e-4,-1.1897271998792792e-6,1.1602238033439061e-8,-7.025988796732991e-4,-1.3932883666335377e-6,1.1530725736851102e-8,-7.02369467900341e-4,-1.6652872066721532e-6,1.1435125811886794e-8,-7.020507465969052e-4,-1.959328698109832e-6,1.1331711320640786e-8,-7.016442939978633e-4,-2.2282184952551496e-6,1.1237034626369414e-8,-7.011697035243303e-4,-2.4335618600813347e-6,1.1164544945400339e-8,-7.006583801112918e-4,-2.5521150452073807e-6,1.1122365961218336e-8,-7.001460060304543e-4,-2.5781375982917395e-6,1.1112496075816941e-8,-6.996655112290227e-4,-2.5220161431554106e-6,1.1131319063948755e-8,-6.992418776281199e-4,-2.4062965783673872e-6,1.1171004748331547e-8,-6.988893060139256e-4,-2.260591788360715e-6,1.1221277939326513e-8,-6.986105278643894e-4,-2.1166353920163535e-6,1.1271116834225942e-8,-6.983975667488254e-4,-2.0042272969958953e-6,1.1310137596645092e-8,-6.982331775114807e-4,-1.948167868728002e-6,1.1329646935505253e-8,-6.980924984224593e-4,-1.9658036073505293e-6,1.1323502940205919e-8,-6.979449169280985e-4,-2.064692866216944e-6,1.128895545665963e-8,-6.977566158534427e-4,-2.240091878769088e-6,1.1227562045779688e-8,-6.974946560896657e-4,-2.4725062008836e-6,1.1146078731656455e-8,-6.971334322778307e-4,-2.7265579611108132e-6,1.1056870056968845e-8,-6.966634001809645e-4,-2.9535495920723803e-6,1.0976992639682918e-8,-6.960998225694706e-4,-3.1003923112501523e-6,1.0925024976391107e-8,-6.954864809875409e-4,-3.125514095301827e-6,1.0915470365326537e-8,-6.94888405730523e-4,-3.0171655312078273e-6,1.0952385872816837e-8,-6.943721615170897e-4,-2.8040956720319907e-6,1.1025740558355747e-8,-6.939812476892919e-4,-2.5493950355256136e-6,1.111363121856989e-8,-6.937199582600355e-4,-2.328052856844355e-6,1.119007794880418e-8,-6.935545525919977e-4,-2.199995786806156e-6,1.123431816683279e-8,-6.93429179173718e-4,-2.1924546956316556e-6,1.1236874298485071e-8,-6.932862200777068e-4,-2.2974342328778687e-6,1.1200440938200634e-8,-6.930818299262455e-4,-2.4806963116481874e-6,1.1136809772812793e-8,-6.927932877982263e-4,-2.69515791678022e-6,1.1062250907052743e-8,-6.924193527516066e-4,-2.8932872464684024e-6,1.0993214408490107e-8,-6.919763333906085e-4,-3.036081365862266e-6,1.0943205101581768e-8,-6.91492215226939e-4,-3.098326934476717e-6,1.0920952638432522e-8,-6.910002904512773e-4,-3.070683044984637e-6,1.0929697707612377e-8,-6.905331356871504e-4,-2.959140124946023e-6,1.0967394783237994e-8,-6.90117596465121e-4,-2.7823877442401985e-6,1.1027633804261848e-8,-6.897712626577218e-4,-2.567793687719598e-6,1.1101026790081565e-8,-6.895006358475275e-4,-2.3467550008997916e-6,1.1176795508382824e-8,-6.89300944615274e-4,-2.150115599113473e-6,1.1244329229978124e-8,-6.891573100006782e-4,-2.00424231133623e-6,1.1294520632905088e-8,-6.890467540316551e-4,-1.9280356409594636e-6,1.1320793607430406e-8,-6.889406381638624e-4,-1.930734024848246e-6,1.1319874885504703e-8,-6.888074504279619e-4,-2.0102414136189414e-6,1.1292397488351405e-8,-6.886161724085662e-4,-2.1518695593095066e-6,1.1243363432643985e-8,-6.883407101463712e-4,-2.327739840236361e-6,1.1182368829498123e-8,-6.879658514959947e-4,-2.497813089077346e-6,1.1123245267791766e-8,-6.874944007746656e-4,-2.6143891697839814e-6,1.108247815801189e-8,-6.869533275424424e-4,-2.6320148015926607e-6,1.1075749525894508e-8,-6.863944546199724e-4,-2.522826202578732e-6,1.1112635168862053e-8,-6.858844538666012e-4,-2.2926275030821306e-6,1.1191109583836215e-8,-6.854832279089802e-4,-1.9877298379677976e-6,1.1295269233710088e-8,-6.852191743942243e-4,-1.6834486218362717e-6,1.1399318636952878e-8,-6.850762207670568e-4,-1.4561494259965552e-6,1.1477115718733162e-8,-6.850017506227822e-4,-1.353885669014518e-6,1.1512169978020316e-8,-6.849299395502611e-4,-1.382232489232581e-6,1.1502489363880025e-8,-6.848057305429362e-4,-1.5099055715152289e-6,1.1458706325152704e-8,-6.845983153559325e-4,-1.6859188037799119e-6,1.1398245647313847e-8,-6.843027428170722e-4,-1.8571846721204412e-6,1.1339299333489303e-8,-6.839342878524915e-4,-1.9804742909492373e-6,1.1296704524613013e-8,-6.83520537940993e-4,-2.0280142608472192e-6,1.1280001238857747e-8,-6.830941226507634e-4,-1.9884992920636643e-6,1.1293074773063915e-8,-6.826870433621648e-4,-1.8656132505174621e-6,1.13346680053564e-8,-6.823264387413217e-4,-1.6753696630438363e-6,1.1399305110651174e-8,-6.82031487121087e-4,-1.4427423697938251e-6,1.1478456664893744e-8,-6.818114056550049e-4,-1.1978017957364357e-6,1.1561864398442774e-8,-6.816645845240956e-4,-9.716026242010502e-7,1.1638940368353777e-8,-6.81578901101889e-4,-7.920793248862827e-7,1.1700156773758746e-8,-6.815332503350359e-4,-6.803319074311323e-7,1.173830361103633e-8,-6.815001275355418e-4,-6.477490111422285e-7,1.1749467706559448e-8,-6.814489184104265e-4,-6.941843501332436e-7,1.1733661035226025e-8,-6.813496403718091e-4,-8.071935459534741e-7,1.1695093476635976e-8,-6.81177053403738e-4,-9.623862476189849e-7,1.164206416834527e-8,-6.809151476327394e-4,-1.1251098518570805e-6,1.158639073471916e-8,-6.80561933977751e-4,-1.254012468855875e-6,1.154218474453644e-8,-6.801338767888566e-4,-1.307464024167702e-6,1.1523643336190613e-8,-6.79668066854345e-4,-1.2535982747354408e-6,1.1541612761355467e-8,-6.792188902309273e-4,-1.0830088825351644e-6,1.1599275967291585e-8,-6.78845970446115e-4,-8.196398734036575e-7,1.1688487599342648e-8,-6.785938804680131e-4,-5.21865523976247e-7,1.1789443842818592e-8,-6.784716853381285e-4,-2.670917135713526e-7,1.1875898145539714e-8,-6.784454801674145e-4,-1.229862560247459e-7,1.1924869708763637e-8,-6.78451422731065e-4,-1.2039502744957288e-7,1.1925808501975738e-8,-6.784224136183189e-4,-2.4413852327126643e-7,1.188376744728601e-8,-6.783122474568518e-4,-4.450160638167141e-7,1.1815400961230667e-8,-6.781056774875232e-4,-6.622121589485789e-7,1.1741382274874111e-8,-6.778146379208505e-4,-8.426921141446391e-7,1.1679787181502826e-8,-6.774678679897052e-4,-9.513665380458594e-7,1.1642596348323024e-8,-6.771004646386013e-4,-9.730261227384026e-7,1.163500954750871e-8,-6.767463032638174e-4,-9.096388229470013e-7,1.165635793010542e-8,-6.764335621130428e-4,-7.761178639860844e-7,1.170155308564171e-8,-6.761823408651586e-4,-5.962181208590508e-7,1.1762500661860506e-8,-6.76003339470729e-4,-3.9886548663780184e-7,1.1829366116277767e-8,-6.758971746004418e-4,-2.1465214616865e-7,1.189177429067364e-8,-6.75854349008327e-4,-7.229850977163453e-8,1.1940006997847552e-8,-6.758560464209218e-4,4.947983413017979e-9,1.1966210837941946e-8,-6.75876029123182e-4,2.7488136745964224e-9,1.196554475242547e-8,-6.758837935815457e-4,-8.161918553295126e-8,1.1937085753012027e-8,-6.758487615666738e-4,-2.3790708629766936e-7,1.1884286585775744e-8,-6.757450114730958e-4,-4.432901815565406e-7,1.1814847546413683e-8,-6.75555981832124e-4,-6.647221873892998e-7,1.1739927591423942e-8,-6.752785440219556e-4,-8.632714013106472e-7,1.1672680443195546e-8,-6.749257989924772e-4,-1.0003070529774613e-6,1.1626159710092367e-8,-6.745277736728225e-4,-1.04533785405786e-6,1.1610666373841045e-8,-6.74128768082691e-4,-9.849061499935828e-7,1.1630749295767326e-8,-6.737798662443241e-4,-8.306924641557072e-7,1.1682486866486084e-8,-6.735259935027122e-4,-6.231378273326227e-7,1.1752281613645974e-8,-6.733897881249691e-4,-4.257941722485988e-7,1.1818755484053001e-8,-6.733589931298577e-4,-3.0779861157673254e-7,1.185861347121806e-8,-6.733862647382449e-4,-3.189045445843042e-7,1.1855019353474524e-8,-6.734052719418553e-4,-4.6933352922082787e-7,1.1804407956455615e-8,-6.73356095178138e-4,-7.26669545411652e-7,1.1717608951207223e-8,-6.732058920007578e-4,-1.03135768079192e-6,1.1614681309859787e-8,-6.729549688437168e-4,-1.3203085634674708e-6,1.1516948301661333e-8,-6.726292231984343e-4,-1.5456410863813466e-6,1.1440629950089799e-8,-6.722669138054278e-4,-1.6825813512472906e-6,1.1394139323916218e-8,-6.719069745690607e-4,-1.728292691642922e-6,1.1378462534167964e-8,-6.715817867987357e-4,-1.6963310651301452e-6,1.1389032635968985e-8,-6.713140269531039e-4,-1.6104898771342205e-6,1.1417818254359392e-8,-6.711159576172181e-4,-1.4997911391117643e-6,1.1455027849828653e-8,-6.7098967808978e-4,-1.3947627025395655e-6,1.1490377166722129e-8,-6.709276170943395e-4,-1.3244157649111584e-6,1.1514110299334853e-8,-6.709132260466664e-4,-1.3133527174552276e-6,1.1517964713543777e-8,-6.709221924822578e-4,-1.3787160274900425e-6,1.1496180968261428e-8,-6.709246793383498e-4,-1.5271024239717297e-6,1.144652479963841e-8,-6.708890101922466e-4,-1.7521057789037506e-6,1.1371108056069637e-8,-6.707867329827515e-4,-2.03349427394575e-6,1.1276673671676083e-8,-6.705983390374779e-4,-2.3389296906621046e-6,1.1174033427878806e-8,-6.703183942720542e-4,-2.6286525837106187e-6,1.1076507144233978e-8,-6.699586275639561e-4,-2.862764821608109e-6,1.0997482902064068e-8,-6.695477636789244e-4,-3.009877260332382e-6,1.0947514998244096e-8,-6.691275106414471e-4,-3.0553669347500317e-6,1.093155672567259e-8,-6.687448110835039e-4,-3.0073333148598256e-6,1.0946969098039167e-8,-6.684411914721439e-4,-2.8982694801256994e-6,1.09829603567278e-8,-6.682410506419115e-4,-2.7805932569171573e-6,1.1022061743662119e-8,-6.681420923177971e-4,-2.7151112480580224e-6,1.1043947687668447e-8,-6.681122430425281e-4,-2.7538322953627776e-6,1.103115103055556e-8,-6.680967532338296e-4,-2.922229780866871e-6,1.0975005824736362e-8,-6.680351768836946e-4,-3.208938989025025e-6,1.0879155445024393e-8,-6.678818198079746e-4,-3.569206800689314e-6,1.07584697087957e-8,-6.676199799142348e-4,-3.941264216912157e-6,1.0633592515886972e-8,-6.672637124200508e-4,-4.26723863883779e-6,1.0523919613312888e-8,-6.668484745365341e-4,-4.508722102625259e-6,1.0442353880863865e-8,-6.664173881818245e-4,-4.652194081672177e-6,1.0393476953270497e-8,-6.660096559372878e-4,-4.705856726945458e-6,1.0374609216835914e-8,-6.6565400917304e-4,-4.692450116383464e-6,1.0378215067070535e-8,-6.65366691378365e-4,-4.641992506869934e-6,1.0394325668100645e-8,-6.651520724436302e-4,-4.586289293999795e-6,1.0412367136578511e-8,-6.650041770194664e-4,-4.555288303349263e-6,1.0422370733593156e-8,-6.649082145975189e-4,-4.574557922642622e-6,1.0415807035090087e-8,-6.648419516531094e-4,-4.663098319825658e-6,1.0386306849815094e-8,-6.647772977923628e-4,-4.830967209773467e-6,1.0330446811403125e-8,-6.64682793482468e-4,-5.0767082913095886e-6,1.0248610310513204e-8,-6.645276535009935e-4,-5.385272368662441e-6,1.014569716509483e-8,-6.642874935506787e-4,-5.727739295789978e-6,1.0031241672519338e-8,-6.639508926581502e-4,-6.064303841982294e-6,9.918438764338643e-9,-6.635248175263377e-4,-6.351327713612035e-6,9.821803180388749e-9,-6.630363208422775e-4,-6.551644593751551e-6,9.753736842483382e-9,-6.625286011154107e-4,-6.6453412099685115e-6,9.720943269391243e-9,-6.620515220562129e-4,-6.637210765563028e-6,9.721958663164957e-9,-6.616490030515382e-4,-6.557815458928014e-6,9.746799934408593e-9,-6.613470434299081e-4,-6.457206611119339e-6,9.779019488102298e-9,-6.611460182660693e-4,-6.3927400851426745e-6,9.799687434697574e-9,-6.610196289517972e-4,-6.414181155194645e-6,9.79227361540468e-9,-6.609211623926225e-4,-6.550090663171576e-6,9.747151909141079e-9,-6.607958578615187e-4,-6.799453044112043e-6,9.664428684028409e-9,-6.605961968829965e-4,-7.131600161094896e-6,9.554052462247139e-9,-6.602952658559864e-4,-7.495192731900008e-6,9.432897717263338e-9,-6.59893337291204e-4,-7.833471097170003e-6,9.319721647992294e-9,-6.594154199307799e-4,-8.10003951822256e-6,9.229912967892944e-9,-6.589015974741606e-4,-8.26940720505979e-6,9.171982193286219e-9,-6.583948475325114e-4,-8.339570999084169e-6,9.146702941363071e-9,-6.579310057521284e-4,-8.32782653290947e-6,9.1484953460235e-9,-6.575332522116057e-4,-8.26326332931551e-6,9.167892353553748e-9,-6.572109057110091e-4,-8.179301464685762e-6,9.193979644439203e-9,-6.569608894446945e-4,-8.108097437895046e-6,9.21621770862212e-9,-6.56770170806039e-4,-8.077049399664383e-6,9.225578151807406e-9,-6.566181353193237e-4,-8.106736580969876e-6,9.2152178288862e-9,-6.56478602741209e-4,-8.209430423295186e-6,9.18097422655523e-9,-6.563217982510564e-4,-8.387533414582957e-6,9.121895607077113e-9,-6.561169927829369e-4,-8.631800308226666e-6,9.04085550962115e-9,-6.558365936151278e-4,-8.91992576094595e-6,8.945052981019506e-9,-6.55462020900297e-4,-9.216878126763627e-6,8.845932484547084e-9,-6.549905970801155e-4,-9.47883318251498e-6,8.757896962005024e-9,-6.544410174747893e-4,-9.66200422791736e-6,8.695387849400742e-9,-6.538536905887626e-4,-9.73541782277881e-6,8.668667779698704e-9,-6.532830284212719e-4,-9.693338183562016e-6,8.679746644976681e-9,-6.527824423394355e-4,-9.561069012846983e-6,8.72050444633388e-9,-6.523874598641779e-4,-9.389804754378765e-6,8.77438033627454e-9,-6.521043283306284e-4,-9.24162630277522e-6,8.821227300503736e-9,-6.519088365606864e-4,-9.170835057503315e-6,8.843328210896267e-9,-6.517549256998489e-4,-9.20896440435165e-6,8.83024338053133e-9,-6.515887679402991e-4,-9.35797527614904e-6,8.781065819974303e-9,-6.513631828401716e-4,-9.592194273994584e-6,8.703882366870197e-9,-6.510485784423071e-4,-9.866901365965093e-6,8.613066195460134e-9,-6.506383852720353e-4,-1.0130449155765347e-5,8.525370284901691e-9,-6.501484713535216e-4,-1.0336665778532513e-5,8.455876704000505e-9,-6.496113485493177e-4,-1.0454609877589606e-5,8.414782975243667e-9,-6.490671674646127e-4,-1.0473577830441985e-5,8.405737418544261e-9,-6.485542315122563e-4,-1.0402716045749107e-5,8.42594207718587e-9,-6.48101570190052e-4,-1.0266290315339773e-5,8.467673384414735e-9,-6.477249772667448e-4,-1.0096801161149698e-5,8.520499798179897e-9,-6.474264817325805e-4,-9.928189624151298e-6,8.573469231980985e-9,-6.471962142913522e-4,-9.790591753984345e-6,8.616798727509629e-9,-6.470153398393853e-4,-9.707072173579713e-6,8.642931881769316e-9,-6.4685902944632e-4,-9.691946903899617e-6,8.647090904414083e-9,-6.466990567131604e-4,-9.749935634588221e-6,8.627569008879582e-9,-6.465061945891082e-4,-9.875497327061216e-6,8.585973740369635e-9,-6.462529770962636e-4,-1.005213254042066e-5,8.527489357020453e-9,-6.459175297868126e-4,-1.0252057697941712e-5,8.46101921967877e-9,-6.454888874271263e-4,-1.0437434177263124e-5,8.398808897746156e-9,-6.449732096697071e-4,-1.0564966265109888e-5,8.354946495019238e-9,-6.4439852831923e-4,-1.0595381812212404e-5,8.34225639995346e-9,-6.438138844513587e-4,-1.0507072144502154e-5,8.367854756241516e-9,-6.432790367365826e-4,-1.0308974899831868e-5,8.428993979308454e-9,-6.428454586197086e-4,-1.0044472629606271e-5,8.511840347096126e-9,-6.425364546618369e-4,-9.780404242463435e-6,8.595019151624936e-9,-6.423374992473061e-4,-9.584105091257316e-6,8.656940621566346e-9,-6.422025862017104e-4,-9.499924509528801e-6,8.683268961814048e-9,-6.420723318815535e-4,-9.536788226021915e-6,8.6709032555823e-9,-6.418937058551346e-4,-9.670339340684684e-6,8.62736165406817e-9,-6.416333150807353e-4,-9.854985606826542e-6,8.567021549391805e-9,-6.412819489618678e-4,-1.0038675384978085e-5,8.506456394204669e-9,-6.40852233208935e-4,-1.0175358821881159e-5,8.460459308358457e-9,-6.403723843214741e-4,-1.0233119886925515e-5,8.439407583253215e-9,-6.398785177155639e-4,-1.0197922583846564e-5,8.44800812947473e-9,-6.394070755339369e-4,-1.0073651943128085e-5,8.485229457435074e-9,-6.389883923031362e-4,-9.879211991447938e-6,8.545190825663756e-9,-6.386421940044092e-4,-9.643564938301254e-6,8.61872891621823e-9,-6.383754932638375e-4,-9.399866438278023e-6,8.695270282083074e-9,-6.381828126059341e-4,-9.179868626602678e-6,8.764629424150486e-9,-6.380482197594612e-4,-9.009455497870036e-6,8.818449463555083e-9,-6.379484020972791e-4,-8.905757191846968e-6,8.851137444227476e-9,-6.378559844764216e-4,-8.875794396678722e-6,8.860308373744816e-9,-6.37742611576723e-4,-8.916182840260416e-6,8.846890961194638e-9,-6.375817826161573e-4,-9.013389503892508e-6,8.815063136955268e-9,-6.373517365413405e-4,-9.144324590548281e-6,8.772088767448038e-9,-6.37038822435467e-4,-9.277480646007872e-6,8.727983133697308e-9,-6.366416476230471e-4,-9.375433709051482e-6,8.69473010267958e-9,-6.361755073060954e-4,-9.400076070259292e-6,8.68460137525384e-9,-6.356751215483993e-4,-9.321725715954837e-6,8.70721463674457e-9,-6.351921226563311e-4,-9.131431137281154e-6,8.765577089452952e-9,-6.34783668220924e-4,-8.851983055038034e-6,8.852573074499977e-9,-6.34492590110691e-4,-8.53933103808297e-6,8.950528563696693e-9,-6.343273922649219e-4,-8.26772377613986e-6,9.035920785086607e-9,-6.342551582389573e-4,-8.102013804904856e-6,9.088118007656425e-9,-6.342142013915741e-4,-8.071933386762328e-6,9.097504097485443e-9,-6.341394360266019e-4,-8.163387841999844e-6,9.06827899549311e-9,-6.339853162802021e-4,-8.329403778276332e-6,9.01508325066568e-9,-6.337359214736137e-4,-8.510810762680521e-6,8.956528860220945e-9,-6.334023030696212e-4,-8.65473815155575e-6,8.909374863487501e-9,-6.330132471509208e-4,-8.725202991217194e-6,8.885158614041552e-9,-6.326051717095914e-4,-8.706169178413972e-6,8.889176992237429e-9,-6.32214019748295e-4,-8.599843727994052e-6,8.920959050065301e-9,-6.318697327111989e-4,-8.422780448879686e-6,8.975440229886825e-9,-6.315928418750007e-4,-8.20125617049522e-6,9.044392176943476e-9,-6.313926873838825e-4,-7.966459175451952e-6,9.117945199759327e-9,-6.31267082506243e-4,-7.749777386235528e-6,9.186104282521891e-9,-6.312033160743475e-4,-7.5785372180136775e-6,9.240130028371382e-9,-6.311803126735913e-4,-7.472534294452365e-6,9.273661681811642e-9,-6.311716770969148e-4,-7.441681249593242e-6,9.283469414099118e-9,-6.311491861629334e-4,-7.484987837433047e-6,9.269772409499044e-9,-6.310862639818491e-4,-7.590780571477355e-6,9.236162458649285e-9,-6.309612058273856e-4,-7.737892241529536e-6,9.189230845951367e-9,-6.307601275839634e-4,-7.897660405035442e-6,9.137956611667645e-9,-6.304796987183105e-4,-8.036756534142556e-6,9.09284140190737e-9,-6.301296693209371e-4,-8.121168651637492e-6,9.064674114885852e-9,-6.297347052073675e-4,-8.122014010732786e-6,9.062695008476826e-9,-6.293340333682221e-4,-8.02357893613418e-6,9.092032490280441e-9,-6.289764922907992e-4,-7.832498886235678e-6,9.150771158405365e-9,-6.287088356458074e-4,-7.584313389584958e-6,9.227855564074418e-9,-6.285582300395714e-4,-7.340955663643736e-6,9.303857526237659e-9,-6.285162181702288e-4,-7.173981894358338e-6,9.35622506385365e-9,-6.28535844534191e-4,-7.137050918742098e-6,9.367918818323381e-9,-6.285482266619833e-4,-7.242236086511384e-6,9.334891322630107e-9,-6.284908233474023e-4,-7.4556587282647425e-6,9.267547066221383e-9,-6.28330425274692e-4,-7.714648020679488e-6,9.185435045716488e-9,-6.28069302206002e-4,-7.95377724697567e-6,9.109102634548203e-9,-6.277362671666278e-4,-8.124785819023314e-6,9.053825972438715e-9,-6.273721375619873e-4,-8.204270724462586e-6,9.02715680817319e-9,-6.27017398081553e-4,-8.191793049541557e-6,9.029461806338658e-9,-6.267047725449272e-4,-8.103665827061228e-6,9.055810702686439e-9,-6.26456043916988e-4,-7.966249400547607e-6,9.098033223137005e-9,-6.26281416479543e-4,-7.810389877515416e-6,9.146451274581206e-9,-6.261800463441795e-4,-7.667092566462788e-6,9.191260130576387e-9,-6.261411718711373e-4,-7.564004290537873e-6,9.223675064183579e-9,-6.261457836463466e-4,-7.522438367703082e-6,9.23690378724907e-9,-6.261689058554466e-4,-7.554911651594159e-6,9.226935824039986e-9,-6.26182575765119e-4,-7.663394769762143e-6,9.193084339014298e-9,-6.261594321595429e-4,-7.83867655737204e-6,9.138166390547462e-9,-6.26076519398364e-4,-8.061135092227624e-6,9.068247870454783e-9,-6.259188201018052e-4,-8.302926480673475e-6,8.991964522431026e-9,-6.256821123187454e-4,-8.531474630101965e-6,8.919455933728389e-9,-6.253747887567023e-4,-8.714062415411706e-6,8.860964423618094e-9,-6.250183114255093e-4,-8.823240323023451e-6,8.825167866103795e-9,-6.246458882436894e-4,-8.842823215536685e-6,8.817300503612222e-9,-6.242985755887415e-4,-8.774026346559433e-6,8.837199099376945e-9,-6.240177934968095e-4,-8.640273119230142e-6,8.87774343727035e-9,-6.238340168367981e-4,-8.487734929015043e-6,8.924628410892147e-9,-6.237537835039231e-4,-8.37786762163323e-6,8.958649435262117e-9,-6.237508622334895e-4,-8.370050553809897e-6,8.961109428361436e-9,-6.237694285501078e-4,-8.498608243715725e-6,8.921029687418638e-9,-6.237425116459058e-4,-8.75592709653261e-6,8.840509552635665e-9,-6.236182223750581e-4,-9.0935440897417e-6,8.734482255018053e-9,-6.233789176946422e-4,-9.44210315649724e-6,8.62453087546554e-9,-6.230431618178639e-4,-9.738006393072087e-6,8.530559779025655e-9,-6.226528415322329e-4,-9.942072412796151e-6,8.464944949980187e-9,-6.222558156538971e-4,-1.0044216892862036e-5,8.431044644216811e-9,-6.218928123420268e-4,-1.0057759649626142e-5,8.424931676993069e-9,-6.215911924046659e-4,-1.0010051523072495e-5,8.438260126232764e-9,-6.213639804945358e-4,-9.934048776771606e-6,8.460847692598394e-9,-6.212115296909202e-4,-9.862436775050359e-6,8.482499035264433e-9,-6.211238864357817e-4,-9.823973462843352e-6,8.494171700339035e-9,-6.210830596535341e-4,-9.841115150435778e-6,8.488757155704299e-9,-6.210651942122257e-4,-9.928215073960674e-6,8.461672312188594e-9,-6.210429443543682e-4,-1.0090001829574346e-5,8.411340895070526e-9,-6.209883936927952e-4,-1.032045635967511e-5,8.339532086435201e-9,-6.208766895726924e-4,-1.0602611237518307e-5,8.251410557946112e-9,-6.206901011511374e-4,-1.0909904384581257e-5,8.155117882712867e-9,-6.204217801816662e-4,-1.1209428967393452e-5,8.060785794006027e-9,-6.200783346355796e-4,-1.1467000570356854e-5,7.978999665257574e-9,-6.196803527606607e-4,-1.1653487857353938e-5,7.918867885019981e-9,-6.192602675084233e-4,-1.1751341629004252e-5,7.886009589301413e-9,-6.18857430993645e-4,-1.1760013081941588e-5,7.880853644284182e-9,-6.185107199373036e-4,-1.1698990162283051e-5,7.897639687734814e-9,-6.182494033759342e-4,-1.1607106693188978e-5,7.924550386176266e-9,-6.180837782626559e-4,-1.1536704553317361e-5,7.945441153139379e-9,-6.17998354061986e-4,-1.1541930108901036e-5,7.943422534415343e-9,-6.179514865732182e-4,-1.1662608663681637e-5,7.905878369024749e-9,-6.178847530264709e-4,-1.1908666705688085e-5,7.829382187794986e-9,-6.177413716940561e-4,-1.225291771545529e-5,7.722050838337925e-9,-6.174866683392963e-4,-1.2638281908291842e-5,7.601388082277714e-9,-6.171202061499132e-4,-1.2997807711744528e-5,7.488094639614473e-9,-6.166733164451345e-4,-1.3277552122048224e-5,7.398956214429256e-9,-6.161948260617495e-4,-1.3451111439177265e-5,7.342324255674225e-9,-6.157338992816079e-4,-1.3521276834735159e-5,7.317585667968248e-9,-6.153277910312762e-4,-1.351221220619276e-5,7.3175400954822244e-9,-6.149969832299286e-4,-1.345864223227892e-5,7.331678474457581e-9,-6.147459001310118e-4,-1.3396792379450818e-5,7.3489284361196675e-9,-6.14566195981989e-4,-1.335865891362545e-5,7.3594093806847335e-9,-6.144404163975216e-4,-1.3369061432935648e-5,7.3553652588823905e-9,-6.143451013492217e-4,-1.3444276092296466e-5,7.331624223806665e-9,-6.142533201726146e-4,-1.3591271145411236e-5,7.285864502738724e-9,-6.141370824533147e-4,-1.3807054893883965e-5,7.2188286363125555e-9,-6.139701752177742e-4,-1.4078197634895255e-5,7.134475176715785e-9,-6.137317622253945e-4,-1.4381127354302392e-5,7.03989660873347e-9,-6.13410548401449e-4,-1.4684067691371548e-5,6.944744457685035e-9,-6.130086364730966e-4,-1.4951295234998012e-5,6.8599511266353936e-9,-6.125436581487522e-4,-1.5149749237378634e-5,6.795727421966501e-9,-6.120476639627279e-4,-1.5256983677622905e-5,6.759136642679807e-9,-6.115619176413706e-4,-1.5268340231572266e-5,6.751886205597447e-9,-6.111281095430912e-4,-1.520077746265615e-5,6.769114447606619e-9,-6.107779587857513e-4,-1.5091461683002552e-5,6.799746818271109e-9,-6.10524015294988e-4,-1.4990666324170982e-5,6.828571027830531e-9,-6.103544553284269e-4,-1.4950126437351983e-5,6.839718154874809e-9,-6.10233932630094e-4,-1.5009403395997819e-5,6.820816675408024e-9,-6.101112797303565e-4,-1.5183860384006196e-5,6.7667449207401965e-9,-6.099330136988942e-4,-1.5458296216177136e-5,6.6817180549403645e-9,-6.096591780398321e-4,-1.5789545255279567e-5,6.578625916310926e-9,-6.092759401267423e-4,-1.611861496564348e-5,6.475384794437283e-9,-6.087995316766636e-4,-1.638857118742033e-5,6.389456320634693e-9,-6.082696917744599e-4,-1.656102986792536e-5,6.332762451172584e-9,-6.07735931357823e-4,-1.6624724248411486e-5,6.309028251969762e-9,-6.07243028636269e-4,-1.659408062376702e-5,6.314176973263146e-9,-6.068212130456064e-4,-1.6500688633924005e-5,6.3388763395423195e-9,-6.064828882107512e-4,-1.6382732655089433e-5,6.3716957047222936e-9,-6.062244250029457e-4,-1.6276375396916556e-5,6.401688363734559e-9,-6.060303124501623e-4,-1.6210566121514825e-5,6.41997117246288e-9,-6.058775295989655e-4,-1.6204774019256874e-5,6.420448907864246e-9,-6.057391575612956e-4,-1.6268443228459086e-5,6.400024095330046e-9,-6.055871563899351e-4,-1.640110876257458e-5,6.358597590462493e-9,-6.053947651586242e-4,-1.6592563064539658e-5,6.299040120511544e-9,-6.051391799853258e-4,-1.6823062293831563e-5,6.2271479239230684e-9,-6.04804958969757e-4,-1.7064185629920318e-5,6.15140407656365e-9,-6.043880305658054e-4,-1.7281339145854306e-5,6.082244629251485e-9,-6.038993664978827e-4,-1.743882255386278e-5,6.03054138334135e-9,-6.033664982363028e-4,-1.7507647128342022e-5,6.005236775662678e-9,-6.028306776843586e-4,-1.747471621344875e-5,6.0105545030052955e-9,-6.02338498179153e-4,-1.7350074414647643e-5,6.043785475000533e-9,-6.019293636463869e-4,-1.7168208077473955e-5,6.094852354472843e-9,-6.016229799273229e-4,-1.6981102965108023e-5,6.148328418570691e-9,-6.014120043088848e-4,-1.6844415703121967e-5,6.1875079574704055e-9,-6.012631542790681e-4,-1.6801491798937394e-5,6.199152357907398e-9,-6.011264926259588e-4,-1.687094638850435e-5,6.177250027198649e-9,-6.009494858060641e-4,-1.7041783355707502e-5,6.124605564008008e-9,-6.006912495843881e-4,-1.7277030403387907e-5,6.051910031149934e-9,-6.003329547922971e-4,-1.7524265175610315e-5,5.974701125327572e-9,-5.998817609412311e-4,-1.7729749635034893e-5,5.909152133979997e-9,-5.993674834698096e-4,-1.7852060415235455e-5,5.8679359897686786e-9,-5.98833377167506e-4,-1.7871308208750187e-5,5.857377281089162e-9,-5.983242961249349e-4,-1.7791603804934904e-5,5.876628602108236e-9,-5.978761089750183e-4,-1.763692721889734e-5,5.9188348328191164e-9,-5.97509246371083e-4,-1.744281060909608e-5,5.973566370425565e-9,-5.972272340443155e-4,-1.724717783696112e-5,6.029530158965291e-9,-5.970191412732754e-4,-1.708303930127975e-5,6.076760853223087e-9,-5.968639601907031e-4,-1.6974182393121108e-5,6.107949062772968e-9,-5.967351618909186e-4,-1.6933562355692315e-5,6.1189757620988596e-9,-5.966044914543551e-4,-1.6963408114122988e-5,6.108924653343465e-9,-5.964448552706594e-4,-1.7056054741231575e-5,6.079858424794432e-9,-5.962326779452772e-4,-1.719488339402509e-5,6.036551327657856e-9,-5.959503269411983e-4,-1.7355296242159556e-5,5.9862122504836265e-9,-5.955890709894159e-4,-1.7506243438176608e-5,5.9380510048463094e-9,-5.951525234145372e-4,-1.7613258416163484e-5,5.902393637339857e-9,-5.946596553230791e-4,-1.764400034962936e-5,5.889033529766786e-9,-5.941454005656148e-4,-1.757658081028564e-5,5.9047300999132285e-9,-5.936562505153676e-4,-1.740909145309199e-5,5.9503386560754e-9,-5.932393300043767e-4,-1.7166185049999746e-5,6.018820818675055e-9,-5.929270253618056e-4,-1.6897363809678338e-5,6.095715953083003e-9,-5.927235829331455e-4,-1.6664334583585255e-5,6.162832492505709e-9,-5.926012168281408e-4,-1.6521086061127168e-5,6.204080876826821e-9,-5.925088318791681e-4,-1.6495650783895652e-5,6.2108462578212325e-9,-5.923893296595289e-4,-1.6581983910685432e-5,6.18445634623603e-9,-5.921973240230338e-4,-1.6744373968298434e-5,6.135018198325406e-9,-5.919105305805832e-4,-1.6930486544110382e-5,6.077709827522491e-9,-5.915325837551485e-4,-1.708674963487434e-5,6.028320742756395e-9,-5.910887401414671e-4,-1.7171114333858196e-5,5.999481940305171e-9,-5.906173977802621e-4,-1.7160751663905477e-5,5.998318193545036e-9,-5.901602907269286e-4,-1.7054266849847147e-5,6.025679671747184e-9,-5.897536026274595e-4,-1.6869186278252847e-5,6.076768658723353e-9,-5.894215706944987e-4,-1.6636088071657184e-5,6.142787676934763e-9,-5.891734417193177e-4,-1.639112845867565e-5,6.21311247089221e-9,-5.890037891503861e-4,-1.616881901687457e-5,6.277444531418832e-9,-5.888953870874903e-4,-1.599649526801642e-5,6.32750261058349e-9,-5.888234156540204e-4,-1.5891120266408232e-5,6.358035497480615e-9,-5.887598278097893e-4,-1.585830828911002e-5,6.36716114540014e-9,-5.886770911880141e-4,-1.5892951435849457e-5,6.356201350362242e-9,-5.88551067772663e-4,-1.598065881617845e-5,6.329251478975357e-9,-5.883632730491481e-4,-1.609944079656462e-5,6.292675486505938e-9,-5.881029486085081e-4,-1.622153632414498e-5,6.254574948934901e-9,-5.877692932525501e-4,-1.6315735016464423e-5,6.224131558643309e-9,-5.873738337045345e-4,-1.6350916709415508e-5,6.2105932820424296e-9,-5.869421485315761e-4,-1.630165097021894e-5,6.221632150191717e-9,-5.865131121598357e-4,-1.6156063475258574e-5,6.261002414793579e-9,-5.861331744440621e-4,-1.592434760802166e-5,6.325989749491587e-9,-5.858441940187316e-4,-1.5643598634390996e-5,6.405942312898085e-9,-5.856671951075539e-4,-1.5373106219251778e-5,6.483607719282582e-9,-5.855897763285556e-4,-1.517729276675414e-5,6.540086767802591e-9,-5.855664407766135e-4,-1.5101743305100796e-5,6.561819413722951e-9,-5.855345304499817e-4,-1.5154956209859986e-5,6.545946710766161e-9,-5.854378007236991e-4,-1.5306366023333386e-5,6.500984799091855e-9,-5.852448952227367e-4,-1.550045098503084e-5,6.442830961710452e-9,-5.849551516575722e-4,-1.567734639813534e-5,6.388848412759949e-9,-5.845930082893017e-4,-1.5789777542943528e-5,6.352965558410412e-9,-5.841969678310368e-4,-1.5811729052473348e-5,6.343113417189745e-9,-5.838084552194186e-4,-1.5739511632880423e-5,6.360814546463471e-9,-5.834633032295308e-4,-1.5588003820527e-5,6.402145833924053e-9,-5.831864760835484e-4,-1.538472081382847e-5,6.4593502606737386e-9,-5.829896181558738e-4,-1.5163375096637597e-5,6.5226561160815544e-9,-5.828708999533577e-4,-1.4957769589611858e-5,6.582074977801076e-9,-5.828167555766546e-4,-1.479662672105976e-5,6.628984531476504e-9,-5.828049993600993e-4,-1.46998740108272e-5,6.657304486326205e-9,-5.828086784632086e-4,-1.4676619073704028e-5,6.664156600488167e-9,-5.828000486403008e-4,-1.472477456925716e-5,6.649997471487258e-9,-5.827541399829672e-4,-1.4832100153552331e-5,6.618295601842242e-9,-5.826515746817173e-4,-1.4978198357449995e-5,6.574915976578972e-9,-5.824806499688132e-4,-1.5136975222470618e-5,6.5273858129103555e-9,-0.00058223891266244855,-1.5279382997478107e-5,6.484113573877451e-9,-5.819343932522649e-4,-1.537659130322262e-5,6.453510098108357e-9,-5.815864337643335e-4,-1.540395190071223e-5,6.442875322162274e-9,-5.812255138914551e-4,-1.5346207013270155e-5,6.456887019322757e-9,-5.808906783087563e-4,-1.5203879326331496e-5,6.495696015125998e-9,-5.806227398257667e-4,-1.4999252917115385e-5,6.553106536171523e-9,-5.804523980144355e-4,-1.4778150938693694E-05,6.6159779015583296e-9,-5.803857787226134e-4,-1.460244790593015e-5,6.666344613112382e-9,-5.803949019080188e-4,-1.453107430828226e-5,6.68691651811743e-9,-5.804222577193308e-4,-1.4595598468279076e-5,6.6681996557004115e-9,-5.804015691477434e-4,-1.4784365571006996e-5,6.613182223466211e-9,-5.802844416075218e-4,-1.504659664064087e-5,6.536251455252701e-9,-5.800572407115345e-4,-1.5314205201811868e-5,6.456956105272316e-9,-5.79740462121484e-4,-1.5527257460748158e-5,6.392682319350163e-9,-5.793754455308698e-4,-1.564997575685766e-5,6.354031421288331e-9,-5.79008526869674e-4,-1.5673984575231003E-05,6.3438332685434564e-9,-5.786793595545836e-4,-1.561305703577987e-5,6.358555023821292e-9,-5.78414926698478e-4,-1.5494822966848187e-5,6.390561211013941e-9,-5.782279782895778e-4,-1.535291284406682e-5,6.430282529202295e-9,-5.781179986625985e-4,-1.5220866757312826e-5,6.467953037038186e-9,-5.780733038593612e-4,-1.5127728821522725e-5,6.494942808591026e-9,-5.780737214613339e-4,-1.5094878202343984e-5,6.5047765753731806e-9,-5.780937304323509e-4,-1.5133945325895573e-5,6.493829724860568e-9,-5.781059012122124e-4,-1.5245845768728994e-5,6.461654192249107e-9,-5.780844231366714e-4,-1.5420967008494582E-05,6.410916404303534e-9,-5.780084375089962e-4,-1.5640566187065733e-5,6.346952753693187e-9,-5.778647777628711e-4,-1.5879285361295647e-5,6.277008199105833e-9,-5.776498175490725e-4,-1.6108436934896513e-5,6.209288793870668e-9,-5.773703656839252e-4,-1.6299721111280603e-5,6.151931069035016e-9,-5.770436111533959e-4,-1.6429208290678547e-5,6.111913238799296e-9,-5.766960225533119e-4,-1.6481506020845262e-5,6.093889659946264e-9,-5.763608734161528e-4,-1.6454038016908552e-5,6.098936037071565e-9,-5.760736744361726e-4,-1.6361021724264736e-5,6.123317511020036e-9,-5.758647102549619e-4,-1.6235696451862072e-5,6.157725998483951e-9,-5.757488547335339e-4,-1.612803540234014e-5,6.1878352067051535e-9,-5.757153315080947e-4,-1.609480237938911e-5,6.197125012537102e-9,-5.757234435926061e-4,-1.6181340271018654e-5,6.17217305833007e-9,-5.757111211388329e-4,-1.6400971995423106e-5,6.108703432860775e-9,-5.756170143529824e-4,-1.6724228696811727e-5,6.014819069588441e-9,-5.754058752564376e-4,-1.7087730422599016e-5,5.908527015219574e-9,-5.750819117894468e-4,-1.7419566737748216e-5,5.810457691770534e-9,-5.746829127406637e-4,-1.7665934924859706e-5,5.736209930949652e-9,-5.742617293776332e-4,-1.7804887133825812e-5,5.692403621165638e-9,-5.738676244788915e-4,-1.7844643668928444e-5,5.677123312045796e-9,-5.735352118200017e-4,-1.781324586487339e-5,5.682774688163753e-9,-5.732813705044003e-4,-1.774712544477777e-5,5.699224028512855e-9,-5.731070706253558e-4,-1.7682465513048927e-5,5.716183635261324e-9,-5.730010810481334e-4,-1.7650014543434743e-5,5.7246996299768535e-9,-5.729437243720952e-4,-1.7672436560521165e-5,5.717992329661441e-9,-5.729101327422091e-4,-1.77629912703616e-5,5.691943387538161e-9,-5.728732254490138e-4,-1.7924881686606425e-5,5.645364913125561e-9,-5.728066872098459e-4,-1.8151183111504288e-5,5.580046983978404e-9,-5.726880446715707e-4,-1.8425518479711568e-5,5.500544376149344e-9,-5.725017360320156e-4,-1.8723776519021976e-5,5.4136497171616706e-9,-5.722417478110209e-4,-1.901709758465021e-5,5.327525281669176e-9,-5.719132058612187e-4,-1.9275973453983113e-5,5.250556794951275e-9,-5.715324599224961e-4,-1.9474966424702655e-5,5.190061549896955e-9,-5.711254487065863e-4,-1.9597425970417595e-5,5.150993130292952e-9,-5.707243215314012e-4,-1.963951786184574e-5,5.134796911166756e-9,-5.703624645452386e-4,-1.961289496480425e-5,5.138582384870229e-9,-5.700681701023597e-4,-1.9545349551733103e-5,5.154808129149603e-9,-5.698573617980196e-4,-1.947850234148492e-5,5.171796776237571e-9,-5.697265168248463e-4,-1.946126166119291e-5,5.175504776714801e-9,-5.696483046445741e-4,-1.9538307489946467e-5,5.152814866181088e-9,-5.695737447050487e-4,-1.9735023712205888e-5,5.095954657144991e-9,-5.694440581573207e-4,-2.0044122435153433e-5,5.006492424902162e-9,-5.692107976121244e-4,-2.0422259733411498e-5,4.896447185420986e-9,-5.688556702159739e-4,-2.080239735784011e-5,4.784807248298537e-9,-5.683984430252771e-4,-2.1118146298752406e-5,4.69055903235853e-9,-5.678877874524411e-4,-2.1327200844530532e-5,4.6259837892894646e-9,-5.673813072802742e-4,-2.1421699487486857e-5,4.593705379214873e-9,-5.669266461901139e-4,-2.1423333992840117e-5,4.588040913127525e-9,-5.665515251973581e-4,-2.1370168449335505e-5,4.598631280140418e-9,-5.66262954244887e-4,-2.1303510202976556e-5,4.614029495947506e-9,-5.660516519242294e-4,-2.1259150169743164e-5,4.624106881604416e-9,-5.658977760906469e-4,-2.1263246516499423e-5,4.621241923637268e-9,-5.657758344743934e-4,-2.1331262909287216e-5,4.600715978969188e-9,-5.656582879656547e-4,-2.146824690958318e-5,4.560744399958647e-9,-5.655182799852074e-4,-2.166944979816653e-5,4.502372881234427e-9,-5.653320939464026e-4,-2.19210611198664e-5,4.429288721729575e-9,-5.650817267772786e-4,-2.2201302733604196e-5,4.347494108741701e-9,-5.647576281566446e-4,-2.248238891148829e-5,4.2647329227178e-9,-5.64361175875774e-4,-2.273385814627313e-5,4.1895539317782425e-9,-5.639060211063388e-4,-2.2927360460003696e-5,4.129994037758887e-9,-5.634173669126164e-4,-2.3042324624474837e-5,4.092025805841426e-9,-5.629285951340259e-4,-2.3071330028784256e-5,4.078067292741761e-9,-5.624753358397186e-4,-2.3023652525244365e-5,4.085953126634584e-9,-5.620879235594856e-4,-2.2925599059856908e-5,4.1087412604200885e-9,-5.617838311213657e-4,-2.2816948292584702e-5,4.13556726191145e-9,-5.615618506350042e-4,-2.274366245931516e-5,4.1535543827756625e-9,-5.613996862607292e-4,-2.2747751693369897e-5,4.150602400752755e-9,-5.61256426475516e-4,-2.2855979724977274e-5,4.1186293748158945e-9,-5.61080812039059e-4,-2.307016575944345e-5,4.056477812301431e-9,-5.608247544560862e-4,-2.3362823347901296e-5,3.971353014138016e-9,-5.6045888275338e-4,-2.3681771753724775e-5,3.877666551810311e-9,-5.599840255643514e-4,-2.3964648029816697e-5,3.7929726560466655e-9,-5.594323224548366e-4,-2.4158896301923775e-5,3.732284697554104e-9,-5.588562140180068e-4,-2.4238382403495358e-5,3.7033386543166194e-9,-5.583104935056323e-4,-2.4208922097151482e-5,3.7049913841555217e-9,-5.578362118896362e-4,-2.4101634993633252e-5,3.729013562684922e-9,-5.574526700823866e-4,-2.395959922159319e-5,3.763717738012945e-9,-5.571580150477938e-4,-2.3824918225424018e-5,3.7974724057465164e-9,-5.56934945270612e-4,-2.3730431642789787e-5,3.820986693463586e-9,-5.567575402096818e-4,-2.369650431855389e-5,3.828264474037562e-9,-5.565968561839238e-4,-2.3731175634325677e-5,3.81667238499676e-9,-5.564247258473144e-4,-2.383170766272784e-5,3.786608603817477e-9,-5.562162343773809e-4,-2.3986308687498875e-5,3.741076017959136e-9,-5.559516320965893e-4,-2.41756410521933e-5,3.6852669334650524e-9,-5.556182989939095e-4,-2.4374329729557413e-5,3.626126257835752e-9,-5.552129829469255e-4,-2.455308708972398e-5,3.5717509128408136e-9,-5.547439478003086e-4,-2.4682169708976556e-5,3.5304410056635687e-9,-5.542320441001034e-4,-2.4736519034990855e-5,3.509299202176376e-9,-5.537093394875636e-4,-2.470209240070845e-5,3.5124945121858324e-9,-5.532141884717492e-4,-2.4581739735308707e-5,3.539625413001244e-9,-5.527827987017785e-4,-2.4398065123244182e-5,3.584874043486559e-9,-5.524392207026548e-4,-2.419093064879187e-5,3.6375935558350362E-09,-5.521871673866484e-4,-2.400904254983496e-5,3.6845003460724823e-9,-5.52006996859421e-4,-2.3897600320895216e-5,3.7129769442225496e-9,-5.518594417411545e-4,-2.3885806156130697e-5,3.714505319352247e-9,-5.516952472542898e-4,-2.3978206075858976e-5,3.6871706513466653e-9,-5.514680023266997e-4,-2.415252676916681e-5,3.636467576060659e-9,-5.511466570996784e-4,-2.436472997812125e-5,3.5741160763841065e-9,-5.507243054631822e-4,-2.456016575596165e-5,3.5151030037156743e-9,-5.502204943898792e-4,-2.4688078368491355e-5,3.4736716022299434e-9,-5.49675845316952e-4,-2.4715297420699776e-5,3.4594450841273604e-9,-5.491403496431156e-4,-2.4634524609268043e-5,3.475010754579904e-9,-5.486594079579832e-4,-2.4464309834586896e-5,3.5158016687115214e-9,-5.482626949453814e-4,-2.424130364105868e-5,3.572121989232335e-9,-5.479593003710058e-4,-2.400859263852101e-5,3.6322781071167195e-9,-5.477393924139225e-4,-2.380483572567349e-5,3.685543859039702e-9,-5.475800136344878e-4,-2.365734300350956e-5,3.7241138416981567e-9,-5.47451900115605e-4,-2.3579686113701558e-5,3.743864278401933e-9,-5.473251545092862e-4,-2.3572576485177517e-5,3.744220422532077e-9,-5.471730460260657e-4,-2.3626248739021626e-5,3.727569108803425e-9,-5.469742478632765e-4,-2.3723043848052887e-5,3.6985616396725427e-9,-5.467142469598954e-4,-2.3839630731377964e-5,3.6634824609621807e-9,-5.463866264206015e-4,-2.3948973655604125e-5,3.6296880385067596e-9,-5.4599456793534e-4,-2.4022629138410048e-5,3.604980769764583e-9,-5.455523444943196e-4,-2.4034135649642785e-5,3.5967054365603564e-9,-5.450858818683846e-4,-2.396401744104895e-5,3.6104037986387385e-9,-5.446308564687652e-4,-2.380610222496027e-5,3.648086038965713e-9,-5.442267710418497e-4,-2.3573376044700058e-5,3.7065940327411654e-9,-5.43906780201333e-4,-2.3300037015731352e-5,3.776970362392915e-9,-5.436858585814063e-4,-2.303631065445945e-5,3.8457757017923984e-9,-5.43552613478327e-4,-2.28353475000358e-5,3.898554409891338e-9,-5.434699258623914e-4,-2.2736277504907688e-5,3.924381501274142e-9,-5.433855832143338e-4,-2.275078970747129e-5,3.919540539705527e-9,-5.43248646299094e-4,-2.285936214945721e-5,3.888688548443496e-9,-5.430245801652687e-4,-2.3018194797770242e-5,3.8431759853901846e-9,-5.427037893107168e-4,-2.3172944399802506e-5,3.7974973736510936e-9,-5.423020260258028e-4,-2.3273629234107787e-5,3.765329016282113e-9,-5.418542195221602e-4,-2.328631805513169e-5,3.756319626683319e-9,-5.414045400541133e-4,-2.3199382210688513e-5,3.774257587440266e-9,-5.409955890221134e-4,-2.302384304625818e-5,3.8167930066406206e-9,-5.406592269132189e-4,-2.2788582348018324e-5,3.876564618794517e-9,-5.404109156371855e-4,-2.253214165155441e-5,3.943315026925249e-9,-5.402484736817223e-4,-2.2293496058127136e-5,4.00637464546443e-9,-5.401548723226671e-4,-2.210423231623976e-5,4.056855142789439e-9]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json new file mode 100644 index 0000000..f56819c --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":7000,"numberOfSamples":1000,"samples":[-5.401035826582183e-4,-2.1983771746004456e-5,4.089071108861903e-9,-5.400645679375473e-4,-2.1937995914044596e-5,4.1010390739496695e-9,-5.400093979365809e-4,-2.1960549237341188e-5,4.094200825458988e-9,-5.399147607226752e-4,-2.203560775605646e-5,4.072680770337793e-9,-5.397644338651072e-4,-2.2140989396072942e-5,4.0424039620270295e-9,-5.395502643031555e-4,-2.2250959079911428e-5,4.010291455194114e-9,-5.392727708698771e-4,-2.233868896010399e-5,3.983582390762636e-9,-5.389417235021638e-4,-2.2378792834005243e-5,3.969178139964558e-9,-5.385766058145648e-4,-2.235055698671764e-5,3.972815745495291e-9,-5.382062428829531e-4,-2.2242365349685453e-5,3.9978965146973945e-9,-5.378662132655593e-4,-2.205712418011711e-5,4.043993326717811e-9,-5.375924932704364e-4,-2.181705877637256e-5,4.105479870305896e-9,-5.374109340395555e-4,-2.1564488189815053e-5,4.171221914461289e-9,-5.373252109046606e-4,-2.13546121672999e-5,4.226432351021938e-9,-5.373095626709229e-4,-2.123923851906108e-5,4.256999417283581e-9,-5.373130817418842e-4,-2.1246850964482913e-5,4.25485673473855e-9,-5.372765380678705e-4,-2.136960735856047e-5,4.221561718856039e-9,-5.371540300970259e-4,-2.156549994879516e-5,4.167859343731849e-9,-5.36928145915775e-4,-2.177449463181616e-5,4.109507993256763e-9,-5.36612298142394e-4,-2.193926959851254e-5,4.061836554881471e-9,-5.362421974391817e-4,-2.202084762893932e-5,4.035594559950374e-9,-5.358628658080441e-4,-2.200502185841941e-5,4.035163172736923e-9,-5.355167351147426e-4,-2.1900830823744038e-5,4.058798324504693e-9,-5.35235449411885e-4,-2.173439788390032e-5,4.100071676730384e-9,-5.350357193602122e-4,-2.15410881740401e-5,4.14980207032798e-9,-5.349185757880749e-4,-2.135782693181579e-5,4.198050291539687e-9,-5.348712290073628e-4,-2.121657442592248e-5,4.2359280087428855e-9,-5.348708000481933e-4,-2.1139615342117445e-5,4.257004944159546e-9,-5.348890826615417e-4,-2.113709309176623e-5,4.258128208977309e-9,-5.348974104172614e-4,-2.1206799246401138e-5,4.239584522007182e-9,-5.348708384321045e-4,-2.1335822917691524e-5,4.204678615706449e-9,-5.347911231697716e-4,-2.1503424398811796e-5,4.158913513206647e-9,-5.346483663470459e-4,-2.1684383203511062e-5,4.109023325019758e-9,-5.344415971986584e-4,-2.185222293312799e-5,4.062070768370815e-9,-5.341787121227865e-4,-2.198213649495927e-5,4.024683100836483e-9,-5.338760303296781e-4,-2.2053786749643512e-5,4.002365575691231e-9,-5.335574557412858e-4,-2.2054309116071213e-5,3.998758028608726e-9,-5.332528017860458e-4,-2.198181627770456e-5,4.014702338546216e-9,-5.32994271803446e-4,-2.1849184863030615e-5,4.047158626760407e-9,-5.328099775273082e-4,-2.1686695872980368E-05,4.088373074123842e-9,-5.327143982259301e-4,-2.1540670747909262e-5,4.1261167888255816e-9,-5.326982547305342e-4,-2.146472539588816e-5,4.145954976805639e-9,-5.327237676269208e-4,-2.150269819024173e-5,4.135827219007261e-9,-5.32732172820136e-4,-2.166880035547954e-5,4.091442962833996e-9,-5.32664363807273e-4,-2.193675634261866e-5,4.019307535221708e-9,-5.324850262715923e-4,-2.2247356034033065e-5,3.93482109123221e-9,-5.321959712692641e-4,-2.253169043764306e-5,3.856170494966331e-9,-5.318318024819819e-4,-2.2736299986202895e-5,3.797697407775919e-9,-5.314434001136979e-4,-2.283727543038531e-5,3.7661716224598815e-9,-5.310801862783224e-4,-2.2840328090950416e-5,3.760701663621395e-9,-5.307784695622606e-4,-2.277209911293882e-5,3.774865010501329e-9,-5.305570300482153e-4,-2.2669296597542187e-5,3.799377675031908e-9,-5.304177923198672e-4,-2.2569563199808032e-5,3.824373068544768e-9,-5.303490345079164e-4,-2.2505211219014473e-5,3.841055895162692e-9,-5.303294436667859e-4,-2.2499458669989806e-5,3.842819986704146e-9,-5.303323047521583e-4,-2.2564506861846283e-5,3.825934653411622e-9,-5.303295770130921e-4,-2.2701095439328812e-5,3.78981094362531e-9,-5.302956400451363e-4,-2.2899349303107257e-5,3.736840685640963e-9,-5.30210473665667e-4,-2.314073527658426e-5,3.6718507329490764e-9,-5.300620142371433e-4,-2.340093393614476e-5,3.601265981895817e-9,-5.298474349228372e-4,-2.3653284469214588e-5,3.532132956929273e-9,-5.29573308984056e-4,-2.3872320401723e-5,3.4711768964710575e-9,-5.292548431176042e-4,-2.403707365259649e-5,3.4239812057610383e-9,-5.289143407918906e-4,-2.4134058857944783e-5,3.3942741989696835e-9,-5.285789266630395e-4,-2.4159906281443744e-5,3.3832709646259577e-9,-5.282773952237134e-4,-2.4123609199085298e-5,3.389033411558258e-9,-5.280357364388392e-4,-2.404808982327215e-5,3.4059246595776906e-9,-5.278708810726782e-4,-2.3969949940549298e-5,3.4245089739342943e-9,-5.277831391864141e-4,-2.3935357712190903e-5,3.4325187746853774e-9,-5.277497546540487e-4,-2.3990053843999665e-5,3.417490568679712e-9,-5.277243373408124e-4,-2.416362760309801e-5,3.371043381811958e-9,-5.276472969010053e-4,-2.4453303594010498e-5,3.2933522318209953e-9,-5.274672038760931e-4,-2.4817592116745615e-5,3.1949762152372857e-9,-5.271634422555336e-4,-2.5188059386224728e-5,3.0937979755767632e-9,-5.267559068389037e-4,-2.549567899523349e-5,3.008057415556971e-9,-5.262952781608044e-4,-2.569664316277229e-5,2.9495561606916857e-9,-5.258412694183832e-4,-2.5783493066863733e-5,2.9207489680924703e-9,-5.254425066389419e-4,-2.5779503885456728e-5,2.9161612247094987e-9,-5.251263833011977e-4,-2.5724489785007588e-5,2.925940256027055e-9,-5.248986095698239e-4,-2.566102959629115e-5,2.9392604634341714e-9,-5.247480432907525e-4,-2.5625368004893986e-5,2.946595015690205e-9,-5.246528338231885e-4,-2.5643091786020372e-5,2.940887498147975e-9,-5.245858121778989e-4,-2.572797628618578e-5,2.918009092055048e-9,-5.245186697908287e-4,-2.5882406676612352e-5,2.8768303754599108e-9,-5.244252403009383e-4,-2.6098529986454154e-5,2.8190430572214277e-9,-5.242842104460674e-4,-2.6359918036558112e-5,2.748752781998075e-9,-5.240813809095547e-4,-2.664376012583758e-5,2.6718566779627634e-9,-5.23811405473642e-4,-2.6923697743507696e-5,2.5952305181850944e-9,-5.234786998958045e-4,-2.7173303690041893e-5,2.5257824612885647e-9,-5.230971720563157e-4,-2.7369871435687406e-5,2.4694878843742183e-9,-5.226886747385083e-4,-2.749801736194075e-5,2.4305157487672832e-9,-5.222802740203602e-4,-2.7552679878417226e-5,2.410501767346455e-9,-5.219004721067165e-4,-2.7541114744677728e-5,2.4080150610133087e-9,-5.215746064004773e-4,-2.748348611429587e-5,2.4182963593044943e-9,-5.213196916609409e-4,-2.741169261001642e-5,2.433387542607336e-9,-5.211390633776294e-4,-2.7365830864708946e-5,2.442883976030173e-9,-5.210177939670833e-4,-2.7387386588784694e-5,2.4356382416405185e-9,-5.2092103264559e-4,-2.7508753633437043e-5,2.4025749182162106e-9,-5.207983793056417e-4,-2.7740648686792387e-5,2.3401865242185253e-9,-5.205966266482828e-4,-2.806223642295004e-5,2.253350576167634e-9,-5.202789824851698e-4,-2.8421269302758358e-5,2.1554312055901617e-9,-5.198423209709797e-4,-2.8748981292602243e-5,2.064380772209385e-9,-5.193213569961983e-4,-2.8985277857182498e-5,1.996093068377223e-9,-5.187754286828383e-4,-2.9100856801229018e-5,1.95860814721846e-9,-5.182654734879904e-4,-2.910408008464851e-5,1.950328402209735e-9,-5.17834468885133e-4,-2.903146570281326e-5,1.9624204795998646e-9,-5.174994717055985e-4,-2.8930642345991606e-5,1.9830589980046977e-9,-5.172543344144145e-4,-2.8845521813800735e-5,2.0010793286060667e-9,-5.170775031307184e-4,-2.8808046397317225e-5,2.0080420772500573e-9,-5.169400421587481e-4,-2.883586587420426e-5,1.998918998843043e-9,-5.168116638617822e-4,-2.8933416322078027e-5,1.9719933681402133e-9,-5.166645952694134e-4,-2.9094191480639365e-5,1.928446821526537e-9,-5.16476024252827e-4,-2.930309443473024e-5,1.8718459878098334e-9,-5.162298604848831e-4,-2.9538674218475745e-5,1.8075644448687839e-9,-5.15918183163581e-4,-2.9775463189840496e-5,1.7421226458261029e-9,-5.155423951219354e-4,-2.9986754143992856e-5,1.682415416929058e-9,-5.151137407302886e-4,-3.0148054298078004e-5,1.6348102041026057e-9,-5.14652612618079e-4,-3.024103796625174e-5,1.6041685250154395e-9,-5.141862173715009e-4,-3.025736743569097e-5,1.5929194416540232e-9,-5.137445594032925e-4,-3.0201544061071227e-5,1.6003442662174793e-9,-5.133551073665073e-4,-3.0091913298744713e-5,1.6222546448333353e-9,-5.130369284461957e-4,-2.9959105712960137e-5,1.651244127376648e-9,-5.127954099507898e-4,-2.9841663506552026e-5,1.6776263789056898e-9,-5.126187743607301e-4,-2.977911818282605e-5,1.6910763709352394e-9,-5.124775920139699e-4,-2.980317215645477e-5,1.6828919402962205e-9,-5.123285291058596e-4,-2.992827896807966e-5,1.6485704768880652e-9,-5.121232184702717e-4,-3.0144080674584436e-5,1.5900146804836555e-9,-5.118216874803194e-4,-3.041333535976552e-5,1.5163090868023582e-9,-5.114069216089788e-4,-3.06788578426189e-5,1.4420450362417905e-9,-5.108941341159282e-4,-3.087997193374652e-5,1.383045829244638e-9,-5.103283884814538e-4,-3.097314754523197e-5,1.350950290890561e-9,-5.097696659935665e-4,-3.0946985077149386e-5,1.3492802047218747e-9,-5.092722871601308e-4,-3.0823751756630565e-5,1.3729826486285837e-9,-5.088689790088103e-4,-3.064783528784369e-5,1.4112787115572115e-9,-5.085657929059659e-4,-3.046880866802487e-5,1.4518356546063253e-9,-5.08346811352875e-4,-3.032757248561428e-5,1.4841879987672864e-9,-5.081833205273989e-4,-3.024951848205968e-5,1.5014927928567059e-9,-5.080425577921641e-4,-3.024389232124672e-5,1.5008319918093534e-9,-5.078937898414977e-4,-3.0306504584070308e-5,1.4827093655212703e-9,-5.077117106050379e-4,-3.042331137863873e-5,1.4502784815439696e-9,-5.074781087294359e-4,-3.0573627604291196e-5,1.4085697181512755e-9,-5.071827632231985e-4,-3.0732762305829554e-5,1.363783212066794e-9,-5.068241386956512e-4,-3.087440447664662e-5,1.322616276444108e-9,-5.064099743494193e-4,-3.097328317084115e-5,1.2915471371343079e-9,-5.059573813360568e-4,-3.100850766576199e-5,1.2759963019804067e-9,-5.054917280931815e-4,-3.09675266499804e-5,1.2793674539120017e-9,-5.050436028710859e-4,-3.085000943630236e-5,1.3021016279347987e-9,-5.046435847782699e-4,-3.067039629349787e-5,1.3410151010863194e-9,-5.043154041700915e-4,-3.0457621016956392e-5,1.3892739397176436e-9,-5.040690924503929e-4,-3.025093383015183e-5,1.4372920683562972e-9,-5.038963498673596e-4,-3.0091976510982597e-5,1.4745708467378526e-9,-5.037701041335682e-4,-3.001474285367648e-5,1.4921523724764496e-9,-5.036491510419384e-4,-3.0036038672483e-5,1.4850891219563646e-9,-5.034873278369172e-4,-3.0149240525066758e-5,1.4542250103523055e-9,-5.032453132593057e-4,-3.032361586041559e-5,1.4066373962624775e-9,-5.029021178492986e-4,-3.0510322165871625e-5,1.3543382658568904e-9,-5.024627404979756e-4,-3.06545113386691e-5,1.3112907864465489e-9,-5.01958677253733e-4,-3.0710749963624354e-5,1.2894420761309303e-9,-5.014397693770699e-4,-3.065674386674007e-5,1.2951067361437504e-9,-5.009594637119274e-4,-3.0499774007028698e-5,1.327181960804589e-9,-5.005591265624038e-4,-3.027289359707675e-5,1.3779593095465411e-9,-5.002577464773517e-4,-3.002286754188913e-5,1.4360302437884732e-9,-5.000502980916162e-4,-2.9795642680252517e-5,1.4898545010720947e-9,-4.999135018056022e-4,-2.96252177016554e-5,1.530564984614016e-9,-4.998148703059288e-4,-2.9528734833433275e-5,1.5533180663703762e-9,-4.997210391324866e-4,-2.9507108813167577e-5,1.557313949211449e-9,-4.996033580441727e-4,-2.95486805281199e-5,1.5450349761472517e-9,-4.994407134467235e-4,-2.963354086042027e-5,1.5212284427432084e-9,-4.99220513807549e-4,-2.9737275227078863e-5,1.4919412361183264e-9,-4.989388300780407e-4,-2.9833867578447486e-5,1.4637165471569636e-9,-4.986003615032496e-4,-2.989808300652266e-5,1.442933990607473e-9,-4.982184149831263e-4,-2.9907927865987277e-5,1.4351810441446417e-9,-4.978145252172193e-4,-2.9847712851288548e-5,1.4445248582206659e-9,-4.974169169914042e-4,-2.971176155615385e-5,1.4726359068551763e-9,-4.970569165391165e-4,-2.9508056286774713e-5,1.517893845763169e-9,-4.967628303390822e-4,-2.926026998042455e-5,1.574829976621728e-9,-4.96551978398408e-4,-2.900608455871382e-5,1.634431128285346e-9,-4.96423302209712e-4,-2.879027553840682e-5,1.6857146709917446e-9,-4.963541060645736e-4,-2.865323310167557e-5,1.7184681499924557e-9,-4.963036761354488e-4,-2.861842652841363e-5,1.7263462753477494e-9,-4.962236841992082e-4,-2.8683800491744274e-5,1.7091218148852898e-9,-4.960720233794146e-4,-2.8820919804120417e-5,1.673117417745899e-9,-4.958250916601518e-4,-2.898244031513813e-5,1.6295915726764063e-9,-4.954843911405692e-4,-2.911516518981793e-5,1.591663143962164e-9,-4.950757567029083e-4,-2.9174289607850693e-5,1.5708062654753593e-9,-4.946419883627445e-4,-2.9134683182893188e-5,1.5739443674704452e-9,-4.942313197632331e-4,-2.899634780038582e-5,1.601897900139963e-9,-4.938850760519116e-4,-2.8782878175581034e-5,1.6495407345080696e-9,-4.936280480341194e-4,-2.8533738897703263e-5,1.707525662802973e-9,-4.934641902772148e-4,-2.8293088750190768e-5,1.7649546067683797e-9,-4.933783032088761e-4,-2.80988640410467e-5,1.8121051613246878e-9,-4.933422254005704e-4,-2.7975289802310766e-5,1.8424210940995162e-9,-4.933227875226166e-4,-2.793022331205908e-5,1.853363241919422e-9,-4.932888738289174e-4,-2.7956735636432285e-5,1.8461872237371115e-9,-4.932160962554518e-4,-2.8037116641906087e-5,1.8250326211687373e-9,-4.930889594766327e-4,-2.8147435486230603e-5,1.7957702854856959e-9,-4.929012427190119e-4,-2.8261502965497104e-5,1.7649326447086253e-9,-4.926554961798312e-4,-2.835390391705434e-5,1.7388763334173934e-9,-4.923623095573031e-4,-2.8402349479687208e-5,1.7231683216680764e-9,-4.920395867133475e-4,-2.8389889647024718e-5,1.722073563894763e-9,-4.917115540492151e-4,-2.8307497965287012e-5,1.7379836944677346e-9,-4.914067695061618e-4,-2.815714883271202e-5,1.7707008124423624e-9,-4.911541935152892e-4,-2.7954758530073625e-5,1.8166878141640076e-9,-4.9097673506944e-4,-2.773135265619518e-5,1.868683014872907e-9,-4.908829819257416e-4,-2.753002578310636e-5,1.9163130986412e-9,-4.908600342594571e-4,-2.7396792960745575e-5,1.9482274136412787e-9,-4.908721173909682e-4,-2.736633164669827e-5,1.9555585722015448e-9,-4.908685218729858e-4,-2.7447945016454782e-5,1.935427847646306e-9,-4.907995565142859e-4,-2.7619289411182313e-5,1.8926347984558103e-9,-4.906336832509187e-4,-2.7832348344015255e-5,1.8383867655335314e-9,-4.903676923646972e-4,-2.802925951189207e-5,1.7865984348223615e-9,-4.900260027571856e-4,-2.81603898676814e-5,1.7495716625922467e-9,-4.89651135545775e-4,-2.8197278587712897e-5,1.7348223698973235e-9,-4.892906052692192e-4,-2.8137212384925217e-5,1.7438257478064728e-9,-4.889850187707911e-4,-2.800028120231637e-5,1.7725003438639047e-9,-4.887600631930353e-4,-2.782169608840279e-5,1.8128296668897378e-9,-4.886231415493295e-4,-2.764229676123075e-5,1.8550063239660704e-9,-4.885642484701803e-4,-2.7499550273375093e-5,1.8896080581632753e-9,-4.88560103003217e-4,-2.7420633789239168e-5,1.9094190965771907e-9,-4.885802098906471e-4,-2.741859369588705e-5,1.9105887095828677e-9,-4.885932963466409e-4,-2.749186494528233e-5,1.892958847920264e-9,-4.885727070221833e-4,-2.7626586385723848e-5,1.8596151082628022e-9,-4.884999125827284e-4,-2.780056601507957e-5,1.815912403162441e-9,-4.883659918181414e-4,-2.7987688626019622e-5,1.7683031663824352e-9,-4.881714965792303e-4,-2.8161857991136438e-5,1.7232621331153711e-9,-4.879253817230721e-4,-2.8300053385778088e-5,1.6864793191295907e-9,-4.876435954604153e-4,-2.838460913858599e-5,1.6623231380987314e-9,-4.87347570898538e-4,-2.8405127125376862e-5,1.6534487206287574e-9,-4.870624676766653e-4,-2.8360400428380635e-5,1.660397458157364e-9,-4.8681464921107224e-4,-2.8260451760282097e-5,1.6810999234867354e-9,-4.8662762504571956e-4,-2.8128194590838857e-5,1.710378936760407e-9,-4.865159493111669e-4,-2.7999259061439134e-5,1.7398402884595435e-9,-4.864778001628795e-4,-2.7917688216241995e-5,1.758782346831438e-9,-4.864891773662556e-4,-2.7925623648319725e-5,1.7566564873211407e-9,-4.8650469881442816e-4,-2.8048055389582203e-5,1.7268436941845679e-9,-4.8646900022718986e-4,-2.8278862045047066e-5,1.6701987909042514e-9,-4.863366661408441e-4,-2.8577505119019685e-5,1.596014686119699e-9,-4.8609095859314307e-4,-2.888149066944309e-5,1.5191180487893385e-9,-4.8575031131327785e-4,-2.9129303897496962e-5,1.4543917377772392e-9,-4.853594628443761e-4,-2.928127077721007e-5,1.4117786999065398e-9,-4.8497195747729835e-4,-2.932864068445588e-5,1.394071849831376e-9,-4.846337505125269e-4,-2.92901557766113e-5,1.397598481510503e-9,-4.8437354423659196e-4,-2.9201624636557654e-5,1.4144787727407432e-9,-4.842002284292061e-4,-2.9104393029698005e-5,1.4351477859261177e-9,-4.841052181270292e-4,-2.903609161431683e-5,1.4504558263885193e-9,-4.84067228217977e-4,-2.9024670479161186e-5,1.4531643834621424e-9,-4.840577748119623e-4,-2.90853939257728e-5,1.438879930124667e-9,-4.8404655015113853e-4,-2.9220176531956694e-5,1.4064663055144139e-9,-4.840061936266715e-4,-2.9418854952069273e-5,1.3579222509944927e-9,-4.839159970403585e-4,-2.9661986241126522e-5,1.2977592972372048e-9,-4.8376421255598803e-4,-2.99245694584744e-5,1.2320364517035848e-9,-4.8354887698368103e-4,-3.0180063885511402e-5,1.1672683012708056e-9,-4.832772700501507e-4,-3.0404142004948953e-5,1.1094257627540442e-9,-4.829643557323166e-4,-3.0577722626730395e-5,1.06319106972272e-9,-4.826306810340864e-4,-3.068915192762852e-5,1.0314937573263063e-9,-4.823000236618913e-4,-3.073572511170575e-5,1.0152261736262526e-9,-4.819967854440488e-4,-3.07247596187981e-5,1.0130129991719876e-9,-4.8174290438235536e-4,-3.067424662353938e-5,1.0209817846856487e-9,-4.8155387647187757e-4,-3.061273027346073e-5,1.032629336411569e-9,-4.814336608023644e-4,-3.057734555154527e-5,1.0391143981355627e-9,-4.813692597631775e-4,-3.060832201910778e-5,1.0304832601707698e-9,-4.813275459614071e-4,-3.073869463472397e-5,9.981998565152625e-10,-4.812585659790297e-4,-3.09804507134622e-5,9.386721541243323e-10,-4.811087866201458e-4,-3.1312961751180574e-5,8.56262021686922e-10,-4.8084200197442165e-4,-3.168291882514008e-5,7.634346976835111e-10,-4.804573453938174e-4,-3.202098523525012e-5,6.767668830172286e-10,-4.799919742448245e-4,-3.226863232885468e-5,6.104833504614054e-10,-4.7950561722214457e-4,-3.239963129412474e-5,5.713324640502453e-10,-4.7905711130771735e-4,-3.2424683834516966e-5,5.57489239643948e-10,-4.7868648919253005e-4,-3.2380572165611614e-5,5.61014998658449e-10,-4.78408756745913e-4,-3.231372536823076e-5,5.715060758294507e-10,-0.00047821695541208484,-3.226672810540936e-5,5.790543339561175e-10,-4.780892929635116e-4,-3.2270696159169436e-5,5.759797425532569e-10,-4.7799654019284706e-4,-3.2342694027153804e-5,5.575709307492149e-10,-4.7790798337904856e-4,-3.2486240286347094e-5,5.222191413059654e-10,-4.7779572256916394e-4,-3.269322339193252e-5,4.712137846897875e-10,-4.776377532430203e-4,-3.294643314889626e-5,4.0828191455557877e-10,-4.7742011900052996e-4,-3.322255415686779e-5,3.3887550315425643e-10,-4.7713813362436103e-4,-3.3495522236272236e-5,2.692723543611399e-10,-4.767966058786844e-4,-3.374005506219493e-5,2.0561845121165476e-10,-4.764089810761079e-4,-3.3935100660724256e-5,1.5304719488686107e-10,-4.759953978571277e-4,-3.4066794130658526e-5,1.150012473363178e-10,-4.75579914293648e-4,-3.4130529894258694e-5,9.281539758685568e-11,-4.7518726401693057e-4,-3.4132012358599385e-5,8.552166664277137e-11,-4.7483937947707337e-4,-3.4087283256587925e-5,8.9808001360197e-11,-4.745518134530909e-4,-3.402168289331611e-5,1.0012352749726892e-10,-4.743301302744044e-4,-3.396758918434555e-5,1.0901384685598315e-10,-4.7416643965561046e-4,-3.3960444197777966e-5,1.0790405985855532e-10,-4.740368979791793e-4,-3.4032281179469596e-5,8.86169595898152e-11,-4.739021227586955e-4,-3.420250408423377e-5,4.5725881072999446e-11,-4.7371326042227083e-4,-3.446757033559661e-5,-2.0710561717845824e-11,-4.734254927457585e-4,-3.479429725681101e-5,-1.0330249928567228e-10,-4.7301639236006836e-4,-3.5123672220509924e-5,-1.881476569178234e-10,-4.725000431178112e-4,-3.5388839961071916e-5,-2.591876480176443e-10,-4.7192604541348076e-4,-3.554105374407855e-5,-3.044707002743182e-10,-4.7136099969806975e-4,-3.556883779945993e-5,-3.206993534357789e-10,-4.7086294225468346e-4,-3.549888047725581e-5,-3.1342792392102554e-10,-4.7046352272326177e-4,-3.538050951555742e-5,-2.935213287305637e-10,-4.7016473226171217e-4,-3.5265590743997314e-5,-2.726806915020762e-10,-4.699464136836216e-4,-3.5194260656001715e-5,-2.6030955535709985e-10,-4.697770469616606e-4,-3.518932915329649e-5,-2.622205939252974e-10,-4.696228012465099e-4,-3.5256920462369833e-5,-2.8060094716625834e-10,-4.6945333703288087e-4,-3.538992906669341e-5,-3.145484253008059e-10,-4.69244867902677e-4,-3.5571919634512485e-5,-3.607624652693146e-10,-4.6898164086817774e-4,-3.5780529452895425e-5,-4.1425452821863957e-10,-4.686566863176195e-4,-3.5990449974228233e-5,-4.690962154934373e-10,-4.6827208786035787e-4,-3.617631589754077e-5,-5.192139267408718e-10,-4.678386863652773e-4,-3.631568320727738e-5,-5.591870571551936e-10,-4.6737497335989225e-4,-3.6392083291211825e-5,-5.849904896303589e-10,-4.6690488301707415e-4,-3.639782201853782e-5,-5.94602599597509e-10,-4.6645445102384944e-4,-3.633592139146378e-5,-5.883906819014525e-10,-4.660476945176547e-4,-3.6220661871468307e-5,-5.692228942796334e-10,-4.657022695838701e-4,-3.6076407131886816e-5,-5.422815071321678e-10,-4.6542554666657507e-4,-3.5934607127357874e-5,-5.145430862929582e-10,-4.6521176990474016e-4,-3.582914597600692e-5,-4.93889587145379e-10,-4.650408921003716e-4,-3.579037660247443e-5,-4.878228226654467e-10,-4.6487973809540686e-4,-3.583822677071e-5,-5.017887049330647e-10,-4.646864289969452e-4,-3.5975183793548686e-5,-5.37296846788472e-10,-4.64418929535433e-4,-3.618107017587765e-5,-5.903807450996709e-10,-4.640473748557744e-4,-3.641280549063968e-5,-6.513004445318026e-10,-4.6356706963375163e-4,-3.6612571972860786e-5,-7.064066461510136e-10,-4.6300573393137634e-4,-3.672503075757567e-5,-7.42296675743031e-10,-4.624182914159778e-4,-3.671797163766815e-5,-7.508047679955584e-10,-4.6186855565977626e-4,-3.659550128472903e-5,-7.321670756526646e-10,-4.614064225580401e-4,-3.6395389241618036e-5,-6.944563282812404e-10,-4.610528332327597e-4,-3.6172385710832e-5,-6.498299076742612e-10,-4.607987283925611e-4,-3.597801715887471e-5,-6.100320374056605e-10,-4.6061468507508637e-4,-3.5846959612404006e-5,-5.833503649471653e-10,-4.6046349004600013e-4,-3.579313229929127e-5,-5.736387227312834e-10,-4.6030994274539054e-4,-3.5812705095171745e-5,-5.807834219497946e-10,-4.601262422144594e-4,-3.588972134772124e-5,-6.017486078129592e-10,-4.5989390505752053e-4,-3.600142119002202e-5,-6.316505581854882e-10,-4.596038614192552e-4,-3.61222398339944e-5,-6.646706362294414e-10,-4.592559568531993e-4,-3.6226694452753686e-5,-6.948193567656552e-10,-4.5885834703375316e-4,-3.629175808199892e-5,-7.166060109300918e-10,-4.584267277797475e-4,-3.629920933167143e-5,-7.25651034334448e-10,-4.5798303120869814e-4,-3.623817319516776e-5,-7.192617233124736e-10,-4.575530806030977e-4,-3.610762730040304e-5,-6.969458465337379e-10,-4.571628892970559e-4,-3.591815255208761e-5,-6.607620683323364e-10,-4.56833823604343e-4,-3.569198142091502e-5,-6.153534493322551e-10,-4.5657747279228704e-4,-3.54605678450924e-5,-5.675121322431022e-10,-4.5639155317605325e-4,-3.525945503013983e-5,-5.251872676244543e-10,-4.562582877399368e-4,-3.5121101489857186e-5,-4.960025021303906e-10,-4.561462404911574e-4,-3.5067166813251846e-5,-4.855281510313871e-10,-4.560157354184803e-4,-3.510209657136758e-5,-4.956760285975314e-10,-4.558271844438492e-4,-3.520973052125918e-5,-5.23642942124648e-10,-4.555509722539143e-4,-3.5354377231198915e-5,-5.618485388203806e-10,-4.551767900011865e-4,-3.5487271728465515e-5,-5.99216862288837e-10,-4.547194931700101e-4,-3.555821241925147e-5,-6.238372524193589e-10,-4.5421824807652514e-4,-3.553016757808225e-5,-6.264728450339745e-10,-4.537270827198009e-4,-3.539206308847836e-5,-6.037125880351339e-10,-4.532987076358123e-4,-3.5163679660655164e-5,-5.592847955933052e-10,-4.5296792741134556e-4,-3.488912728160238e-5,-5.027086388929701e-10,-4.527422313081323e-4,-3.462138798450755e-5,-4.458766460131134e-10,-4.5260323410913533e-4,-3.4405453702598874e-5,-3.9926413768010085e-10,-4.5251644486876176e-4,-3.426740951649623e-5,-3.6938487658784766e-10,-4.5244332300902997e-4,-3.421213627964388e-5,-3.5808595438001316e-10,-4.523505626185003e-4,-3.4227480505678286e-5,-3.632636675315268e-10,-4.5221482312207624e-4,-3.4290899461766846e-5,-3.8020116677613763e-10,-4.5202375557595886e-4,-3.437554371425792e-5,-4.029081427514244e-10,-4.5177505774483904e-4,-3.445460262322402e-5,-4.251869797649234e-10,-4.514749547370295e-4,-3.4504079311446706e-5,-4.4139362238526164e-10,-4.5113679020358777e-4,-3.450468018923218e-5,-4.469651496899405e-10,-4.507797731939009e-4,-3.444350711070474e-5,-4.388225099902334e-10,-4.504274678763231e-4,-3.431595710739258e-5,-4.1574789980056126e-10,-4.501053968208255e-4,-3.412772239306382e-5,-3.7876689398194317e-10,-4.49837245052929e-4,-3.3896171321560205e-5,-3.3143923698792594e-10,-4.4963967883302245e-4,-3.364990241377015e-5,-2.7982500286964254e-10,-4.495167350280108e-4,-3.342519780636138e-5,-2.3182893325347959e-10,-4.494557916595384e-4,-3.32588698365336e-5,-1.9575098987866422e-10,-4.494275238613324e-4,-3.317868246084438e-5,-1.7822526619476317e-10,-4.493912544321645e-4,-3.319433112785999e-5,-1.8215182067943742e-10,-4.4930491559363935e-4,-3.329257874488547e-5,-2.0541584757431906e-10,-4.491366544886963e-4,-3.343893518934762e-5,-2.409915239755049e-10,-4.4887423428689434e-4,-3.358582747083409e-5,-2.785249749837473e-10,-4.4852918924545023e-4,-3.3684857564196356e-5,-3.069592004180854e-10,-4.481345025764483e-4,-3.3699547562141865E-05,-3.174400965017838e-10,-4.477364173205387e-4,-3.36150453685436e-5,-3.056899582009406e-10,-4.473824653024104e-4,-3.3442075559446554e-5,-2.731645840371916e-10,-4.471089794236686e-4,-3.3213746559910004e-5,-2.2659609678642381e-10,-4.4693193476726584e-4,-3.2975892326254515e-5,-1.7600234698550785e-10,-4.4684415933761597e-4,-3.2774072581832724e-5,-1.318180279743324e-10,-4.468195596048631e-4,-3.264180812728822e-5,-1.0215906621877542e-10,-4.468221350963377e-4,-3.259390394722096e-5,-9.111564082088563e-11,-4.468159270102211e-4,-3.262613831507543e-5,-9.843768488394674e-11,-4.4677253154619184e-4,-3.271981887431175e-5,-1.2037327381122013e-10,-4.466747593938944e-4,-3.2848326037323585e-5,-1.5107991793165482e-10,-4.465169535590928e-4,-3.298315215165685e-5,-1.8405170853296948e-10,-4.4630337571044507e-4,-3.309824656748056e-5,-2.1323351666357844e-10,-4.4604597579605345e-4,-3.317263929462189e-5,-2.337308573244723e-10,-4.45762317539977e-4,-3.3191928530204014e-5,-2.421841171496663e-10,-4.454738218877487e-4,-3.314935956184844e-5,-2.369644191333686e-10,-4.4520398080873634e-4,-3.304699535971351e-5,-2.1835135532547503e-10,-4.449759188950929e-4,-3.289697404544757e-5,-1.887628854791514e-10,-4.448087241116615e-4,-3.2722220146874976e-5,-1.529489231537002e-10,-4.4471242614531716e-4,-3.2555363695373645e-5,-1.1787226547448037e-10,-4.446825403539786e-4,-3.2434324371631275e-5,-9.188130706746193e-11,-4.4469655992664646e-4,-3.2393735943472714e-5,-8.291075104452407e-11,-4.4471563063769776e-4,-3.245364245052461e-5,-9.596818943647909e-11,-4.446933654754844e-4,-3.2609831845342675e-5,-1.3086158754423952e-10,-4.445900359888028e-4,-3.2831347836709934e-5,-1.814400172328324e-10,-4.4438642125605143e-4,-3.306811219248421e-5,-2.370680722983898e-10,-4.4409080264432883e-4,-3.326622792760892e-5,-2.858581212801058e-10,-4.437360837083105e-4,-3.33843518504114e-5,-3.1823887552277983e-10,-4.433690949210459e-4,-3.340463330407339e-5,-3.294487374573945e-10,-4.430370755530498e-4,-3.3335321031998855e-5,-3.203184353265311e-10,-4.427759960089928e-4,-3.320596713714179e-5,-2.9650278742528307e-10,-4.4260339341241914e-4,-3.305809413124731e-5,-2.666935334285821e-10,-4.425164934095727e-4,-3.293443729480453e-5,-2.403889490512539e-10,-4.424951037855245e-4,-3.286939195932481e-5,-2.2573681301802528e-10,-4.4250792553513906e-4,-3.2882577323854434e-5,-2.2789539745179735e-10,-4.425203905633074e-4,-3.297653466831185e-5,-2.4823497974085815e-10,-4.425019734590562e-4,-3.313848660280707e-5,-2.8448803781729026e-10,-4.424313311491289e-4,-3.334499881923905e-5,-3.3168004394333305e-10,-4.422985572981347e-4,-3.3567784931305844e-5,-3.834657566606249e-10,-4.4210484891880924e-4,-3.377905354369237e-5,-4.3346022827032136e-10,-4.4186050614891556e-4,-3.3955460677570604e-5,-4.762630706971752e-10,-0.00044158229376506733,-3.408047587119074e-5,-5.080560853142402e-10,-4.4129088951131405e-4,-3.4145537682724034e-5,-5.268328707022444e-10,-4.4100864451780675e-4,-3.415060214756904e-5,-5.324321778308508e-10,-4.4075744431709034e-4,-3.4104538515809105e-5,-5.265509515466792e-10,-4.405562048159596e-4,-3.402543308853396e-5,-5.128193797311413e-10,-4.4041749799388676e-4,-3.394031824044413e-5,-4.968520411437988e-10,-4.4034317371603764e-4,-3.388321666420194e-5,-4.859836819661576e-10,-4.4031985380117906e-4,-3.389003663385937e-5,-4.882781596747447e-10,-4.4031667309458187e-4,-3.398947734201114e-5,-5.105417250572887e-10,-4.40288726603928e-4,-3.419139460117802e-5,-5.556392875995702e-10,-4.4018852720764694e-4,-3.447763007612022e-5,-6.202734840122589e-10,-4.3998312776834925e-4,-3.4802253044518366e-5,-6.948530997978604e-10,-4.396688525708522e-4,-3.510470657110431e-5,-7.662719727894685e-10,-4.3927463938373874e-4,-3.533108692677226e-5,-8.225278615720626e-10,-4.388514849831018e-4,-3.545261924397217e-5,-8.567545923869293e-10,-4.384542114569926e-4,-3.5472467064472854e-5,-8.687704570663886e-10,-4.381250309194333e-4,-3.542007387575285e-5,-8.640367362840351e-10,-4.3788477725332484e-4,-3.533865244353876e-5,-8.512299465652137e-10,-4.377321566231613e-4,-3.52722511840646e-5,-8.396926899517458e-10,-4.3764830456916964e-4,-3.525614476523123e-5,-8.374333127536711e-10,-4.376036478383992e-4,-3.531151963905395e-5,-8.498330044244647e-10,-4.3756499698159503e-4,-3.544392307484552e-5,-8.790159276265403e-10,-4.3750174764789934e-4,-3.56445680225368e-5,-9.238259471745557e-10,-4.3739057794072914e-4,-3.5893675770702265e-5,-9.803621067461992e-10,-4.372182577922428e-4,-3.6165025749781834e-5,-1.042950971201023e-9,-4.369824734841252e-4,-3.6430802734025703e-5,-1.1053246753441703e-9,-4.36690901264442e-4,-3.6665949804834746e-5,-1.1617407465670032e-9,-4.3635900542241446e-4,-3.685147801086402e-5,-1.2078249534317108e-9,-4.360071976804138e-4,-3.697647114841903e-5,-1.2410262063482944e-9,-4.356579555231565e-4,-3.7038915732516285e-5,-1.260728985867218e-9,-4.353331667358742e-4,-3.704575670653252e-5,-1.2681800873321904e-9,-4.350516275750907e-4,-3.701249208677096e-5,-1.2663789075441324e-9,-4.348264748497907e-4,-3.696235632581322e-5,-1.2599873663792249e-9,-4.3466228069439307e-4,-3.692480626009468e-5,-1.2551736513394884e-9,-4.3455177288540366e-4,-3.6932510170417106e-5,-1.25912798564809e-9,-4.3447301468774706e-4,-3.701572674939781e-5,-1.278902275184977e-9,-4.3438916026796164e-4,-3.71935894381788e-5,-1.3194060826546412e-9,-4.3425376802956616e-4,-3.74638561498117e-5,-1.3809346111075104e-9,-4.340236163024067e-4,-3.779593543622154e-5,-1.4574024307369292e-9,-4.3367640876553675e-4,-3.8134118564692025e-5,-1.5369256916288049e-9,-4.332244241737091e-4,-3.8414502041651824e-5,-1.6055222702572017e-9,-4.3271386018431076e-4,-3.858948430017033e-5,-1.652481129483999e-9,-4.3220787923143326e-4,-3.864607462666557e-5,-1.6743270763616353e-9,-4.317629656468537e-4,-3.860761863456337e-5,-1.6752156913577408e-9,-4.3141176547786695e-4,-3.8520414864384305e-5,-1.6642240440609935e-9,-4.3115868222643985e-4,-3.8435327419660585e-5,-1.651702421749401e-9,-4.3098557996193025e-4,-3.8393580822086956e-5,-1.6464759363415677e-9,-4.3086147835504085e-4,-3.841992287116871e-5,-1.65440671246263e-9,-4.307516674336233e-4,-3.8521823132790755e-5,-1.6780078303099869e-9,-4.306243804306794e-4,-3.8692067403099935e-5,-1.716664885505569e-9,-4.3045497513185133e-4,-3.891267180424769e-5,-1.7671843133691706e-9,-4.302282105989142e-4,-3.9159095494623204e-5,-1.824566327370246e-9,-4.299390751286171e-4,-3.940438880534627e-5,-1.8829431790449586e-9,-4.295924025130069e-4,-3.9623034498814555e-5,-1.936562263178734e-9,-4.292014630930585e-4,-3.9794261037469396e-5,-1.9806593157273097e-9,-4.287856876623859e-4,-3.9904630596068394e-5,-2.0120950226613972e-9,-4.28367754503315e-4,-3.994964610903417e-5,-2.0296763544745215e-9,-4.279704452993792e-4,-3.9934237516808346e-5,-2.0341813886434956e-9,-4.276136265667553e-4,-3.987227137249826e-5,-2.0282039753249915e-9,-4.273114688402678e-4,-3.978527077197651e-5,-2.0159259234067885e-9,-4.2706992488113834e-4,-3.9700366198973295e-5,-2.002829069662559e-9,-4.268845197863682e-4,-3.964737840173896e-5,-1.9952647642030475e-9,-4.267386265969893e-4,-3.965471131576109e-5,-1.999700373052887e-9,-4.266029510717304e-4,-3.9743544324180614e-5,-2.0214358793739664e-9,-4.26437834568534e-4,-3.992039295746758e-5,-2.0627867533072652e-9,-4.2620038657907274e-4,-4.016980373449743e-5,-2.1212012265236316e-9,-4.2585728334790284e-4,-4.0451299582123726e-5,-2.1883606719571155e-9,-4.25400265363133e-4,-4.070596598753596e-5,-2.25155109322746e-9,-4.248561337280175e-4,-4.0874859811857436e-5,-2.2977411834001216e-9,-4.242820619720334e-4,-4.092274432793028e-5,-2.3187965446079723e-9,-4.237451316903482e-4,-4.085341822572131e-5,-2.3147791360394584e-9,-4.2329694415442286e-4,-4.070654441064251e-5,-2.2932869092235596e-9,-4.229578411734412e-4,-4.0538947222353454e-5,-2.2656447239000503e-9,-4.2271688421275413e-4,-4.040304127911455e-5,-2.2426165588610284e-9,-4.225427433080427e-4,-4.0333144803596924e-5,-2.231704275563879e-9,-4.223968689264773e-4,-4.0342043136537935e-5,-2.2363639652971267e-9,-4.222434398179648e-4,-4.042433106460874e-5,-2.256430112670042e-9,-4.220548334090586e-4,-4.056222883882198e-5,-2.2890006714688703e-9,-4.218136677594013e-4,-4.073117018433807e-5,-2.3293788637137593e-9,-4.21512946299068e-4,-4.0904258616967875e-5,-2.3719643641673716e-9,-4.2115531676598317e-4,-4.105575217512033e-5,-2.4111025484600863e-9,-4.207517952197999e-4,-4.1163907229954436e-5,-2.441863734119646e-9,-4.203200113401336e-4,-4.121333480514526e-5,-2.460678044086568e-9,-4.198819221794372e-4,-4.119688223171917e-5,-2.4657691210332674e-9,-4.194609188969578e-4,-4.111682572964086e-5,-2.4573520283086842e-9,-4.1907848888926417e-4,-4.0985005162454883e-5,-2.4375869987131062e-9,-4.1875086145044143e-4,-4.082171835588424e-5,-2.4103369791762464e-9,-4.1848604840921634e-4,-4.065342570658751e-5,-2.3807851127628465e-9,-4.182816061708275e-4,-4.050935427302264e-5,-2.3549026071762925e-9,-4.1812347686722286e-4,-4.041715861848515e-5,-2.3387103150409148e-9,-4.1798629068454416e-4,-4.039789505126642e-5,-2.337275945283984e-9,-4.178356307985684e-4,-4.046059638808345e-5,-2.353438615303446e-9,-4.1763304542852736e-4,-4.0597133531294696e-5,-2.3864309135234715e-9,-4.17344485054109e-4,-4.07791348421971e-5,-2.4308988000567276e-9,-4.1695157842682465e-4,-4.095991780817399e-5,-2.477108670627579e-9,-4.16462448119742e-4,-4.108433698392642e-5,-2.5130503328766345e-9,-4.15915771968092e-4,-4.1106404871525956e-5,-2.528346010590168e-9,-4.153721159190534e-4,-4.100833523430551e-5,-2.5184530965389194e-9,-4.1489323356661917e-4,-4.0810007275967356e-5,-2.4867440031700544e-9,-4.1451934265011636e-4,-4.056149998336314e-5,-2.443004015897615e-9,-4.14257057163492e-4,-4.032253315069391e-5,-2.399280027476654e-9,-4.140829643037679e-4,-4.014115402159914e-5,-2.365624213252662e-9,-4.139573594589503e-4,-4.004203540654317e-5,-2.347719850083814e-9,-4.1383883902764264e-4,-4.0026135838993726e-5,-2.346648557292666e-9,-4.1369395521428763e-4,-4.007714518494776e-5,-2.359918634965156e-9,-4.1350116283010187e-4,-4.0169438678037385e-5,-2.3828275358386247e-9,-4.132509204849382e-4,-4.02745458009851e-5,-2.409672202656709e-9,-4.12944098431814e-4,-4.036544899383293e-5,-2.434693727626981e-9,-4.1259003312596384e-4,-4.0419283786942026e-5,-2.4528076757501718e-9,-4.1220463180241106e-4,-4.041920894315126e-5,-2.460165886913844e-9,-4.118084241146482e-4,-4.035589750016881e-5,-2.4545551866637317e-9,-4.114243079808707e-4,-4.0228769440772255e-5,-2.4356339267987566e-9,-4.1107472547243434e-4,-4.004674770704506e-5,-2.4050065497151834e-9,-4.107782411517076e-4,-3.982801465533893e-5,-2.3661110631512318e-9,-4.1054594259781567e-4,-3.959827057314572e-5,-2.3238887851075064e-9,-4.10378395758591e-4,-3.938732383127705e-5,-2.2842171118400988e-9,-4.1026395191599125e-4,-3.922422342717951e-5,-2.2530908614786637e-9,-4.101791123460307e-4,-3.9131562701737556e-5,-2.23557803383868e-9,-4.100913745510124e-4,-3.911997116984464e-5,-2.2346619299068557e-9,-4.099645570075549e-4,-3.9183950507037974e-5,-2.250178149363926e-9,-4.097661972198411e-4,-3.930021397784681e-5,-2.278150153434694e-9,-4.0947612025577423e-4,-3.9429780090729804e-5,-2.310922006873919e-9,-4.090943862753506e-4,-3.952493336780649e-5,-2.338459230035468e-9,-4.086456517799025e-4,-3.954111611657848e-5,-2.3508883014153373e-9,-4.081763984351799e-4,-3.945141594102922e-5,-2.34172318966217e-9,-4.0774310491620253e-4,-3.9258165010706924e-5,-2.3105104000586573e-9,-4.0739410414728915e-4,-3.899487440782558e-5,-2.2634068239480487e-9,-4.071530517716821e-4,-3.8715380711305496e-5,-2.2110648360130516e-9,-4.07012517735472e-4,-3.8474663908117465e-5,-2.1647814676881445e-9,-4.0694031503661626e-4,-3.83111097332982e-5,-2.132885090794267e-9,-4.0689355328915437e-4,-3.823811500140989e-5,-2.118905391336737e-9,-4.0683245131795863e-4,-3.824611552137267e-5,-2.121744169365106e-9,-4.0672875066320724e-4,-3.83106584547127e-5,-2.137053712749919e-9,-4.065681541205749e-4,-3.8401284561318635e-5,-2.1588842425524963e-9,-4.063489170280104e-4,-3.848820200325258e-5,-2.181051087605659e-9,-4.0607899542711783e-4,-3.854620981262006e-5,-2.198080022710527e-9,-4.0577321760118843e-4,-3.855665233157998e-5,-2.2057933114142437e-9,-4.054509336224549e-4,-3.850839314776131e-5,-2.2016348705458945e-9,-4.051339790749997e-4,-3.839848304650612e-5,-2.1848218714545927e-9,-4.0484452728607707e-4,-3.8232763492249975e-5,-2.1563917184551757e-9,-4.046024009615301e-4,-3.8026166396044666e-5,-2.1191704389762e-9,-4.0442170184689123e-4,-3.780206287518215e-5,-2.0776109012345515e-9,-4.043071522932379e-4,-3.7589916539575194e-5,-2.037394588277785e-9,-4.0425112417486777e-4,-3.7420805564781884e-5,-2.0046841607319565e-9,-4.0423270413599097e-4,-3.732108474951415e-5,-1.9850017433876396e-9,-4.042199941499895e-4,-3.7305461211264305e-5,-1.9818909364028005e-9,-4.041759729458141e-4,-3.7371576180890595e-5,-1.995722476799383e-9,-4.040669367934563e-4,-3.749819781395151e-5,-2.023080949156707e-9,-4.038714430168704e-4,-3.764824543910441e-5,-2.0570719150784504e-9,-4.0358723837979936e-4,-3.777652245214125e-5,-2.088652532821821e-9,-4.0323392522940814e-4,-3.784066890271968e-5,-2.108786263221883e-9,-4.028499668827034e-4,-3.7812733764463005e-5,-2.110917795052249e-9,-4.024839213955273e-4,-3.768809159565209e-5,-2.0930452841422504e-9,-4.0218154105103323e-4,-3.748838143603014e-5,-2.0586134771402745e-9,-4.0197245691300375e-4,-3.7256296497542606e-5,-2.0156987881971886e-9,-4.0186148165965595e-4,-3.7042976733979594e-5,-1.974586200188155e-9,-4.018283808339541e-4,-3.6892494178303976e-5,-1.944623987475064e-9,-4.0183608868270894e-4,-3.6829760565161567e-5,-1.9316327261505804e-9,-4.0184323029191903e-4,-3.685629057238657e-5,-1.9367984159228025e-9,-4.0181540972463755e-4,-3.6953941902521246e-5,-1.9571606390107712e-9,-4.0173160962337696e-4,-3.7093205760581396e-5,-1.9871078224997477e-9,-4.015852743493223e-4,-3.724183204408453e-5,-2.0200937211791826e-9,-4.013819118193629e-4,-3.737112093517171e-5,-2.0500268935527753e-9,-4.0113546642722405e-4,-3.745934046666174e-5,-2.072145790532876e-9,-4.008649162475529e-4,-3.749303145455463e-5,-2.0834320591036338e-9,-4.005915876567197e-4,-3.746722429672266e-5,-2.0827005722215756e-9,-4.00337051736825e-4,-3.7385338843855984e-5,-2.0705219071079996e-9,-4.0012112723467486e-4,-3.725911600757237e-5,-2.0491068141487655e-9,-3.9995945006566694e-4,-3.710838880148392e-5,-2.02219878218256e-9,-3.9986036290861937e-4,-3.696000071532959e-5,-1.9948926212214277e-9,-3.9982147601925637e-4,-3.684496081292581e-5,-1.9731958999948373e-9,-3.998270224104261e-4,-3.6793151712941985e-5,-1.9631309255681626e-9,-3.9984782850540707e-4,-3.6825820017548094e-5,-1.9693326621769157e-9,-3.9984567314217234e-4,-3.6947721487253395e-5,-1.9934475370821446e-9,-3.997823060669654e-4,-3.714229558595796e-5,-2.0329994613703186e-9,-3.996308094008664e-4,-3.7373115060623765e-5,-2.0814266273117242e-9,-3.99384988712439e-4,-3.759249203934011e-5,-2.1295566994293455e-9,-3.9906271036433164e-4,-3.775472405457742e-5,-2.1681019565900638e-9,-3.987016202917927e-4,-3.7829193936713294e-5,-2.190272534708571e-9,-3.9834887836798216e-4,-3.780875269054671e-5,-2.193608295241445e-9,-3.980485538263064e-4,-3.7711034648837475e-5,-2.1805271009791155e-9,-3.978305141809676e-4,-3.75729460791574e-5,-2.157555028882998e-9,-3.9770366530245046e-4,-3.744037328616604e-5,-2.1335311050243456e-9,-3.9765504299890545e-4,-3.735613027207092e-5,-2.1172878104897155e-9,-3.976546923721489e-4,-3.7349520461290274e-5,-2.1154458093897077e-9,-3.976645841027215e-4,-3.7430385886824955e-5,-2.1309453027747796e-9,-3.9764857481630915e-4,-3.7588969553787584e-5,-2.16269710822895e-9,-3.975803240688057e-4,-3.78008285196242e-5,-2.206328545718188e-9,-3.9744725472712117e-4,-3.8034406317778884e-5,-2.2556260006985536e-9,-3.972504331599879e-4,-3.825848207709496e-5,-2.304116143937135e-9,-3.970016678082849e-4,-3.8447576129588216e-5,-2.346328968114079e-9,-3.967195597523896e-4,-3.85847761019194e-5,-2.378535140950185e-9,-3.9642580202908984e-4,-3.8662499543895226e-5,-2.3989805580658325e-9,-3.9614227617272086e-4,-3.8682093918056946e-5,-2.407778956750608e-9,-3.9588887819566896e-4,-3.865305185717903e-5,-2.406662527805749e-9,-3.9568165300506234e-4,-3.8592229765188354e-5,-2.3987512411946675e-9,-3.9553072846361295e-4,-3.852295871827556e-5,-2.3883867003944353e-9,-3.9543774790634314e-4,-3.847345808670505e-5,-2.3809297326839213e-9,-3.9539305003282924e-4,-3.847364136251777e-5,-2.382287114028292e-9,-3.9537371824626544e-4,-3.854948972135635e-5,-2.397910865159832e-9,-3.9534454501332527e-4,-3.8715107497318946e-5,-2.4312142198376576e-9,-3.952641095528031e-4,-3.896460770802551e-5,-2.4818178598376683e-9,-3.9509636929992376e-4,-3.9268210077471814e-5,-2.5445577437541576e-9,-3.9482433024793544e-4,-3.957704143478872e-5,-2.6102337078048142e-9,-3.944590437311957e-4,-3.983728465279895e-5,-2.66827632892777e-9,-3.9403811672779804e-4,-4.000826568398732e-5,-2.7102607573795425e-9,-3.936136334447647e-4,-4.007582516475161e-5,-2.732568246881595e-9,-3.932354489171214e-4,-4.005509986930359e-5,-2.7370829288428234e-9,-3.9293735005261444e-4,-3.9983124149450465e-5,-2.730028550413103e-9,-3.927304162113228e-4,-3.990616554842289e-5,-2.7198283129693987e-9,-3.926037104670152e-4,-3.986712394333029e-5,-2.7148744382944538e-9,-3.925300340245018e-4,-3.989630581245046e-5,-2.721726552456415e-9,-3.924740322961887e-4,-4.000673567964125e-5,-2.7439566656949624e-9,-3.9240044960224226e-4,-4.0193797020507027e-5,-2.781711773518208e-9,-3.9228100027058804e-4,-4.043835453992976e-5,-2.8319939335662753e-9,-3.920988397429943e-4,-4.071220949346134e-5,-2.8895632795737313e-9,-3.918501286346216e-4,-4.098447018044798e-5,-2.9482215655903276e-9,-3.915428759247042e-4,-4.1227354423628e-5,-3.002126932202798e-9,-3.911938860598323e-4,-4.142035578932055e-5,-3.0468184632871506e-9,-3.908248865257149e-4,-4.1552391217979064e-5,-3.079773043002786e-9,-3.904587877773441e-4,-4.162213920665322e-5,-3.100490246668063e-9,-3.901166540589265e-4,-4.163716629526032e-5,-3.1102498369570066e-9,-3.898154596295406e-4,-4.1612528206521545e-5,-3.1117545046976984e-9,-3.895663343014008e-4,-4.15692477287104e-5,-3.108816873159751e-9,-3.893729274795302e-4,-4.1532643167673676e-5,-3.106122424164249e-9,-3.8922964958095066e-4,-4.1530120920376783e-5,-3.108959796232942e-9,-3.8911993547672825e-4,-4.158773400879558e-5,-3.1226873440949273e-9,-3.890154780111431e-4,-4.172477613316137e-5,-3.1516937951170783e-9,-3.8887832398421657e-4,-4.1946490302301866e-5,-3.1978260954989524e-9,-3.8866798799491536e-4,-4.2236923527193535e-5,-3.2587392014650204e-9,-3.883541075724722e-4,-4.255643026767475e-5,-3.3271796700881e-9,-3.879309179981178e-4,-4.2848970224092304e-5,-3.3923178303223024e-9,-3.874252936797595e-4,-4.3060086306725585e-5,-3.4432808142227515e-9,-3.8689085406422015e-4,-4.315822428367038e-5,-3.473343383367832e-9,-3.863889877673784e-4,-4.3147231358598694e-5,-3.4823712443678767e-9,-3.859670303418556e-4,-4.306282988945449e-5,-3.476235200012914e-9,-3.856450179732965e-4,-4.29567332020061e-5,-3.4640108169692097e-9,-3.8541502948697586e-4,-4.287851646215824e-5,-3.4548315486565543e-9,-3.852493149355605e-4,-4.2863147399264384e-5,-3.4556957290431317e-9,-3.851111325842977e-4,-4.2926194690833945e-5,-3.4704676625369628e-9,-3.849641750666217e-4,-4.306488479653104e-5,-3.4997555963823663e-9,-3.8477904449105344e-4,-4.326230537360815e-5,-3.541315667419064e-9,-3.845368505256895e-4,-4.349269606106779e-5,-3.5907716079917845e-9,-3.842305470775176e-4,-4.372677264988809e-5,-3.6425556238611925e-9,-3.838644713396162e-4,-4.393662457551494e-5,-3.690971057311515e-9,-3.834524001017426e-4,-4.4099766813166904e-5,-3.731195660582228e-9,-3.8301455462920074e-4,-4.4201952462350065e-5,-3.760022682061001e-9,-3.8257407697839317e-4,-4.42385677285092e-5,-3.776219192075404e-9,-3.821534971407641e-4,-4.42146190699868e-5,-3.78049345493217e-9,-3.8177167811354886e-4,-4.414353188785048e-5,-3.775176115440497e-9,-3.814415037458072e-4,-4.404520966037506e-5,-3.763795599090132e-9,-3.811682438952999e-4,-4.3943745048884684e-5,-3.750686091708826e-9,-3.8094841874788385e-4,-4.3864881721126706e-5,-3.740645067077998e-9,-3.807690606418496e-4,-4.383310219135978e-5,-3.738542478624394e-9,-3.8060747113549404e-4,-4.3868015094879415e-5,-3.7487069852998005e-9,-3.8043212896826716e-4,-4.397964230952124e-5,-3.77392849591353e-9,-3.8020614214202126e-4,-4.416283549922484e-5,-3.814126337469046e-9,-3.7989477348660916e-4,-4.43925934432593e-5,-3.8651369785543476e-9,-3.7947723172862823e-4,-4.462397219530305e-5,-3.918497560033356e-9,-3.789593875598948e-4,-4.4800964639163135e-5,-3.96317158934382e-9,-3.783796554624242e-4,-4.487522211492297e-5,-3.989310173516736e-9,-3.7780028171270733e-4,-4.482731494297352e-5,-3.992457390009027e-9,-3.772848187336151e-4,-4.4677289049787794e-5,-3.975587279866091e-9,-3.768738589342568e-4,-4.4476302813578715e-5,-3.947557776892742e-9,-3.765731596693725e-4,-4.4284647088400656e-5,-3.919157973229763e-9,-3.763583684669076e-4,-4.415011216339383e-5,-3.8993178944763496e-9,-3.7618935482083637e-4,-4.409689236608701e-5,-3.893153730927883e-9,-3.760245905568384e-4,-4.412564418670974e-5,-3.901816527226052e-9,-3.758305281239963e-4,-4.4219737409461237e-5,-3.923290331122069e-9,-3.755856622553639e-4,-4.435289044370741e-5,-3.953443754350989e-9,-3.752809867131644e-4,-4.449563849145108e-5,-3.987032034029203e-9,-3.749186681115099e-4,-4.462002058569582e-5,-4.018598786101294e-9,-3.745100126286204e-4,-4.4702883418774216e-5,-4.043293546650498e-9,-3.740730272909859e-4,-4.472824114947566e-5,-4.057558558959361e-9,-3.736296275242296e-4,-4.4688796131403827e-5,-4.059581153155581e-9,-3.732025909944763e-4,-4.4586579231906474e-5,-4.049448013925343e-9,-3.7281240901532864e-4,-4.4432606619089756e-5,-4.029008414573869e-9,-3.724743361521061e-4,-4.4245446122239154e-5,-4.001513612609417e-9,-3.7219604683176886e-4,-4.404881315412431e-5,-3.971147889469539e-9,-3.719761559946201e-4,-4.386851506422404e-5,-3.942550572712875e-9,-3.718036869016746e-4,-4.3729011292962504e-5,-3.920339561133363e-9,-3.716585476438696e-4,-4.364979112255484e-5,-3.908574248164302e-9,-3.715130942800803e-4,-4.364173138022532e-5,-3.910078188684471e-9,-3.713350457921283e-4,-4.370352841575415e-5,-3.925586069346227e-9,-3.7109238380513845e-4,-4.3818651024463044e-5,-3.9528488394828995e-9,-3.707607845405598e-4,-4.395425389302266e-5,-3.986112633364346e-9,-3.7033298488081413e-4,-4.406449097933762e-5,-4.01659369367896e-9,-3.698271408886742e-4,-4.4100617660546984e-5,-4.034478858226037e-9,-3.6928850300559833e-4,-4.402761136944001e-5,-4.032309510928544e-9,-3.6877886950402043e-4,-4.3841161627626426e-5,-4.008397336623387e-9,-3.68354844176475e-4,-4.3574127073054776e-5,-3.9681227490621515e-9,-3.680456442399449e-4,-4.328536888044946e-5,-3.921896540270247e-9,-3.678438514995482e-4,-4.303605390842075e-5,-3.88088052714649e-9,-3.6771344272492777e-4,-4.286765668321312e-5,-3.853066475373028e-9,-3.6760744211130974e-4,-4.279271827029995e-5,-3.841571155142976e-9,-3.6748400287878505e-4,-4.279868404809011e-5,-3.845110101089603e-9,-3.6731503805980255e-4,-4.2858040425471004e-5,-3.859505188909107e-9,-3.670878782353395e-4,-4.293828963274571e-5,-3.879232548481663e-9,-3.668030259099282e-4,-4.300887457302174e-5,-3.8986149146387406e-9,-3.664707239972699e-4,-4.304497730933188e-5,-3.912649349560868e-9,-3.6610775839668016e-4,-4.302929792015812e-5,-3.917575783781463e-9,-3.657347454762509e-4,-4.295287241734541e-5,-3.911245377621743e-9,-3.653736412651876e-4,-4.2815417391808795e-5,-3.893281236926014e-9,-3.650452228879931e-4,-4.2625259277326516e-5,-3.865029786249455e-9,-3.6476641984123815e-4,-4.239866016669585e-5,-3.8293301914713776e-9,-3.645476115673927e-4,-4.215819173345968e-5,-3.790137077788593e-9,-3.643903517009124e-4,-4.192994909126311e-5,-3.752032661708107e-9,-3.642861036996599e-4,-4.173977362622034e-5,-3.71966635491313e-9,-3.642164327955368e-4,-4.160892942215545e-5,-3.697132215015159e-9,-3.641549093482707e-4,-4.1549858066543754e-5,-3.6872863278909777e-9,-3.6407072313266787e-4,-4.1562773802817286e-5,-3.6910546876715064e-9,-3.639337297548633e-4,-4.1633785245227165e-5,-3.706842402789998e-9,-3.637205402382895e-4,-4.17351263688552e-5,-3.730239026226662e-9,-3.634210733541716e-4,-4.182826882524199e-5,-3.7543125950062615e-9,-3.6304426985984744e-4,-4.187077889867399e-5,-3.770791848359487e-9,-3.626205679360432e-4,-4.1827023967553126e-5,-3.772195287003563e-9,-3.621980590998262e-4,-4.168082324199709e-5,-3.754465893092228e-9,-3.6183040236259707e-4,-4.144515737090433e-5,-3.719051514202747e-9,-3.615588707716338e-4,-4.1162290906568653e-5,-3.6731031521314867e-9,-3.61396538504054e-4,-4.089083947416614e-5,-3.627175685529882e-9,-3.6132387086853867e-4,-4.0684523717909506e-5,-3.5913642442355727e-9,-3.612984871112935e-4,-4.057381858184938e-5,-3.57191628278744e-9,-3.6127263538453984e-4,-4.0559572504084276e-5,-3.5699106570700582e-9,-3.6120844626298833e-4,-4.061897653845609e-5,-3.5820719173724824e-9,-3.610852118619653e-4,-4.0717434213808e-5,-3.6026558942381903e-9,-3.608991626924136e-4,-4.0819528038116416e-5,-3.625305177385425e-9,-3.6065929725962267e-4,-4.0895889554540754e-5,-3.644354040211268e-9,-3.6038248887045136e-4,-4.092611299111932e-5,-3.6555594903413846e-9,-3.6008948797461456e-4,-4.089924983103489e-5,-3.6564197922185135e-9,-3.598020583044798e-4,-4.0813324951301555e-5,-3.6462285238279096e-9,-3.5954081132138837e-4,-4.06746448702424e-5,-3.625955167087689e-9,-3.593232203764928e-4,-4.049706401005377e-5,-3.5980159849031315e-9,-3.591614767911618e-4,-4.030096233320472e-5,-3.5659792059672047e-9,-3.5906017581369425e-4,-4.011143008152642e-5,-3.5342021902016163e-9,-3.590142746293756e-4,-3.9955202075565014e-5,-3.5073577657903728e-9,-3.5900813493897933e-4,-3.9856294031816824e-5,-3.4898049410216977e-9,-3.590165228657977e-4,-3.9830885148132995e-5,-3.484809323888809e-9,-3.5900811619758537e-4,-3.988259608517585e-5,-3.4937187933879266e-9,-3.589513508368191e-4,-3.9999692692636196e-5,-3.515316951993148e-9,-3.588215300116031e-4,-4.015553409221791e-5,-3.5456245459726613e-9,-3.586074994236263e-4,-4.031277515563591e-5,-3.578347724118303e-9,-3.5831611404968134e-4,-4.0430887172238557e-5,-3.6060328154525907e-9,-3.5797300106842354e-4,-4.0475752013014714e-5,-3.621798180660383e-9,-3.5761860209188446e-4,-4.0429328523306393E-05,-3.6212892232579545e-9,-3.572993273213688e-4,-4.029669010026284e-5,-3.604282007806e-9,-3.5705516107877836e-4,-4.01074134564653e-5,-3.575261109336151e-9,-3.56907171864305e-4,-3.990910227757714e-5,-3.542466178765705e-9,-3.5685000952815797e-4,-3.975360446642084e-5,-3.51546370509442e-9,-3.568535768631939e-4,-3.968060851260814e-5,-3.502095452651505e-9,-3.568738387353768e-4,-3.9705767185260144e-5,-3.506123139270059e-9,-3.568676969066613e-4,-3.981847075560239e-5,-3.526548679024781e-9,-3.568050583051709e-4,-3.9988930782059254e-5,-3.558632436406407e-9,-3.56673931076042e-4,-4.017965642244248e-5,-3.595815124716367e-9,-3.564788653472729e-4,-4.035578451744323e-5,-3.631596410599711e-9,-3.562358193015023e-4,-4.049130472750036e-5,-3.6608170038248088e-9,-3.5596655047241536e-4,-4.057119598922274e-5,-3.6802591959901357e-9,-3.556941971200325e-4,-4.059099060777297e-5,-3.688733399766354e-9,-3.554403466676326e-4,-4.055530827745248e-5,-3.6868596918516015e-9,-3.552231502274103e-4,-4.047630480756108e-5,-3.6767210257453985e-9,-3.550558309426621e-4,-4.0372330118324426e-5,-3.6615103358701634e-9,-3.549450842029947e-4,-4.0266541812810685e-5,-3.6452166207126978e-9,-3.5488926874896996e-4,-4.018488717008979e-5,-3.6323023478007748e-9,-3.5487679855453013e-4,-4.0152863925988295e-5,-3.6272565039705226e-9,-3.5488564634128154e-4,-4.019082120417089e-5,-3.6339063053833576e-9,-3.548851821818268e-4,-4.030831790087331e-5,-3.6544836887830023e-9,-3.548412788564619e-4,-4.049915486044093e-5,-3.6886696467672877e-9,-3.547243771613122e-4,-4.073952000048624e-5,-3.733057102710848e-9,-3.5451840841679887e-4,-4.0991294984085655e-5,-3.781467494098887e-9,-3.5422725173712733e-4,-4.121070540757682e-5,-3.826258266543762e-9,-3.538757710829669e-4,-4.136004087638724e-5,-3.8603033376723175e-9,-3.53504443877645e-4,-4.1418554823238366e-5,-3.879000807542093e-9,-3.5315908496719346e-4,-4.1388813578662445e-5,-3.881636157749867e-9,-3.528788443462086e-4,-4.1296476166252965e-5,-3.871679975513234e-9,-3.5268596813342254e-4,-4.118364620333568e-5,-3.855939529728651e-9,-3.525801622010045e-4,-4.109766926615156e-5,-3.84277572321506e-9,-3.5253922633776333e-4,-4.107846753507557e-5,-3.839853266345332e-9,-3.5252589900936437e-4,-4.1148172477191464e-5,-3.852089139473279e-9,-3.5249873593641004e-4,-4.130635182893659e-5,-3.880468677924388e-9,-3.524232758040045e-4,-4.153215835850133e-5,-3.922098707575269e-9,-3.5227977421103506e-4,-4.179200475176239e-5,-3.971370515911904e-9,-3.5206553777650213e-4,-4.2049383308559924e-5,-4.02168889154195e-9,-3.517923456022032e-4,-4.22732706596802e-5,-4.067108127961648e-9,-3.5148116482799436e-4,-4.2443054420599876e-5,-4.103423630040207e-9,-3.5115656427665365e-4,-4.254990072284108e-5,-4.128602719456839e-9,-3.508422977149487e-4,-4.259571927212223e-5,-4.1426852963775e-9,-3.505584283820493e-4,-4.2591075740938084e-5,-4.1473814440995675e-9,-3.503196597354921e-4,-4.2553010117369735e-5,-4.145588069811775e-9,-3.5013425081355416e-4,-4.250315194947812e-5,-4.140977734111264e-9,-3.5000296732766683e-4,-4.246594915992028e-5,-4.1376949637137355e-9,-3.4991789475969336e-4,-4.2466442610266224e-5,-4.140069290235601e-9,-3.4986146693382345e-4,-4.252696515740907e-5,-4.152177172551735e-9,-3.498066307483597e-4,-4.266243723623054e-5,-4.177099698568324e-9,-3.497195305195477e-4,-4.287472041112924e-5,-4.215884841538455e-9,-3.495659175480646e-4,-4.31478811621325e-5,-4.266536865943841e-9,-3.4932096349046604e-4,-4.3447520413318964e-5,-4.323660910585198e-9,-3.4897946134101256e-4,-4.372699512012349e-5,-4.379354851830018e-9,-3.4856132871286715e-4,-4.394038767390347e-5,-4.425380590164783e-9,-3.481082489458901e-4,-4.4057719624662955e-5,-4.455829749739181e-9,-3.4767160295073125e-4,-4.407548988414973e-5,-4.469069235668393e-9,-3.4729671592580966e-4,-4.401761276765464e-5,-4.468122927844235e-9,-3.470101043459885e-4,-4.392694681445468e-5,-4.459514042827404e-9,-3.4681399513372885e-4,-4.3851866775344917e-5,-4.4512484058967996e-9,-3.466884675872167e-4,-4.383320048423082e-5,-4.450711814114548e-9,-3.465989335162038e-4,-4.3895141685846634e-5,-4.463003731704032e-9,-3.4650592936654275e-4,-4.404155435899953e-5,-4.4899789588464385e-9,-3.4637451628011674e-4,-4.425746261242522e-5,-4.53010146035591e-9,-3.46181278482088e-4,-4.451449326164072e-5,-4.579071229769213e-9,-3.459177599712526e-4,-4.477844122387709e-5,-4.631023039653653e-9,-3.4559013570456575e-4,-4.501691233562397e-5,-4.679952084717743e-9,-3.452158716119919e-4,-4.520525913805162e-5,-4.720973867124305e-9,-3.4481879495999203e-4,-4.532981541959789e-5,-4.7511223937350465e-9,-3.4442408015957925e-4,-4.538843813449534e-5,-4.769589480143558e-9,-3.440542089166945e-4,-4.5389084894805184e-5,-4.7774936884748956e-9,-3.437263070319252e-4,-4.534740102436488e-5,-4.77738576894948e-9,-3.4345067735983324e-4,-4.5284143124787143e-5,-4.772713716467364e-9,-3.4323003778487113e-4,-4.5222842054429787e-5,-4.76739691027074e-9,-3.4305901194424496e-4,-4.518761784714889e-5,-4.765524511352927e-9,-3.429236989818069e-4,-4.52007347246193e-5,-4.771068404277782e-9,-3.428015696217947e-4,-4.5279382227483e-5,-4.787430575127021e-9,-3.426625060919474e-4,-4.543136538951815e-5,-4.8166784633623644E-09,-3.424723163020663e-4,-4.565015092623224e-5,-4.858517932523486e-9,-3.4219991287895055e-4,-4.591113849483137e-5,-4.9093917591879784e-9,-3.418278103507178e-4,-4.6172490727433865e-5,-4.962406765475092e-9,-3.413624942079579e-4,-4.6383736833411844e-5,-5.008742784565768e-9,-3.408383536332906e-4,-4.650185695871724e-5,-5.040476506469633e-9,-3.4030994982600497e-4,-4.650853684917004e-5,-5.053640312983224e-9,-3.398339484712107e-4,-4.641889431496161e-5,-5.0498114969366615e-9,-3.394494690556336e-4,-4.627597601679743e-5,-5.03533340901495e-9,-3.3916682212753793e-4,-4.6134299214963423e-5,-5.018789578479401e-9,-3.389684970747851e-4,-4.60416761329767e-5,-5.0082068715226695e-9,-3.388189563580666e-4,-4.602714616208865e-5,-5.009119290870518e-9,-3.386770001401216e-4,-4.609734320211425e-5,-5.023773996416256e-9,-3.385060967047203e-4,-4.623938128036451e-5,-5.051224680335727e-9,-3.382808819877009e-4,-4.642712042057251e-5,-5.0879722483668916e-9,-3.3798991630609986e-4,-4.662831095629719e-5,-5.128915587919849e-9,-3.3763548039858775e-4,-4.6811176467318076e-5,-5.16845422831316e-9,-3.3723121913479214e-4,-4.694969103565298e-5,-5.201576989894772e-9,-3.367983998553216e-4,-4.7027084779648636e-5,-5.224733145745607e-9,-3.3636159656376993e-4,-4.703738149569362e-5,-5.236319126134027e-9,-3.359445418555763e-4,-4.698513068870385e-5,-5.236724866703748e-9,-3.3556670577894265e-4,-4.688372871358966e-5,-5.228009274195705e-9,-3.3524095168534554e-4,-4.675286146676685e-5,-5.213367901026198e-9,-3.3497229454820115e-4,-4.661567260074138e-5,-5.196589566113095e-9,-3.3475746495397114e-4,-4.6496053972731513e-5,-5.181629379466889e-9,-3.3458496403935856e-4,-4.6416067332450106e-5,-5.172290074158099e-9,-3.3443550989848553e-4,-4.639329367171046e-5,-5.171902756508261e-9,-3.3428303229029717e-4,-4.64378573046309e-5,-5.182859497219969e-9,-3.3409679136510515e-4,-4.654895942300463e-5,-5.205901867299847e-9,-3.3384565314112754e-4,-4.671137333713532e-5,-5.2392644177281354e-9,-3.3350538321036714e-4,-4.689360879171389e-5,-5.278078891925973e-9,-3.330683964243518e-4,-4.705068211910057e-5,-5.314688239576653e-9,-3.3255256023083976e-4,-4.713428191609814e-5,-5.340419822664278e-9,-3.320027438393118e-4,-4.71097541805525e-5,-5.3486420687704235e-9,-3.314797357602177e-4,-4.6972927801329136e-5,-5.337761831657595e-9,-3.3103860655846234e-4,-4.67558263411006e-5,-5.312260680512601e-9,-3.307076685003807e-4,-4.651535747158061e-5,-5.28090259224886e-9,-3.30480214378984e-4,-4.6310845214460665e-5,-5.2532057684234896e-9,-3.303220348953695e-4,-4.618357322333606e-5,-5.236272390095169e-9,-3.301874844254908e-4,-4.61477186883596e-5,-5.233313814606197e-9,-3.3003452239918076e-4,-4.619282888887948e-5,-5.243799607308075e-9,-3.2983367667361197e-4,-4.6292393090905275e-5,-5.264447531098321e-9,-3.2957087722242947e-4,-4.6413211027825386e-5,-5.2904004316313725e-9,-3.2924630863698787e-4,-4.652281087401979e-5,-5.316302669134748e-9,-3.288714144932077e-4,-4.659436358753661e-5,-5.337217434375077e-9,-3.284653025069503e-4,-4.6609576179093505e-5,-5.349376028202255e-9,-3.2805103471112654e-4,-4.656006986482792e-5,-5.35069069746132e-9,-3.2765205016821133e-4,-4.6447489372098676E-05,-5.340948027169847e-9,-3.2728894386480116e-4,-4.628254233746377e-5,-5.321669265696422e-9,-3.2697676918230653e-4,-4.608314579988514e-5,-5.295709141439522e-9,-3.2672307735294367e-4,-4.5871826451843845e-5,-5.266715731905392e-9,-3.265269163253492e-4,-4.567268490866273e-5,-5.238595811180517e-9,-3.263787833299249e-4,-4.5508326939279494e-5,-5.2150856928611045e-9,-3.262613612892449e-4,-4.5396953226487785e-5,-5.199410066665686e-9,-3.26150973687626e-4,-4.5349627530952965e-5,-5.193932690177878e-9,-3.2601983786595027e-4,-4.5367769831319596e-5,-5.1997081785981995e-9,-3.2583937029624085e-4,-4.544098475670977e-5,-5.215918457321146e-9,-3.2558503734766617e-4,-4.554569690961154e-5,-5.2393381578890325e-9,-3.252430307869566e-4,-4.5645933134909383e-5,-5.264196058241929e-9,-3.248178384294444e-4,-4.56983335628188e-5,-5.282923877448141e-9,-3.2433764411315686e-4,-4.566298738150629e-5,-5.288101154267343e-9,-3.238524934028116e-4,-4.55187894312056e-5,-5.275271384380036e-9,-3.2342122598822694e-4,-4.527677794176033e-5,-5.245365700942163e-9,-3.230898582700321e-4,-4.498163827286755e-5,-5.205044425823437e-9,-3.228725935037573e-4,-4.469651453348592e-5,-5.164266989512154e-9,-3.2274750094473347e-4,-4.4478159074842894e-5,-5.13235180184745e-9,-3.226689152698676e-4,-4.435700005748701e-5,-5.114830829337623e-9,-3.225871774071815e-4,-4.433186738587753e-5,-5.112508862693316e-9,-3.2246425807672813e-4,-4.437776497525427e-5,-5.1224162241922625e-9,-3.2228031504722966e-4,-4.445858657848031e-5,-5.139485592758135e-9,-3.2203286741891803e-4,-4.4538062588412724E-05,-5.1580709737048375e-9,-3.217324318411406e-4,-4.4586481028774453E-05,-5.173027330322962e-9,-3.213975733128406e-4,-4.458364652752997e-5,-5.180397855754135e-9,-3.210507152123642e-4,-4.451955192695055e-5,-5.177821168001773e-9,-3.20714821071863e-4,-4.43939735421001e-5,-5.164703758157465e-9,-3.2041064399458284e-4,-4.421548906702248e-5,-5.1421458139077516e-9,-3.2015437220027257e-4,-4.400000934734236e-5,-5.112638550353013e-9,-3.199556359923085e-4,-4.3768795235697604e-5,-5.079609309330488e-9,-3.1981598750983545e-4,-4.354585021416585e-5,-5.046904699548832e-9,-3.197281840014739e-4,-4.3354726543107915e-5,-5.018289250760496e-9,-3.196765829420705e-4,-4.321510531744181e-5,-4.997015044656991e-9,-3.1963870183165634e-4,-4.313959806056474e-5,-4.985452141399794e-9,-3.195878597550035e-4,-4.313112514042971e-5,-4.984725308729074e-9,-3.1949679113388595e-4,-4.318123126172128e-5,-4.994338339842217e-9,-3.1934206103072054e-4,-4.326970683766678e-5,-5.0118522340722995e-9,-3.191090769027233e-4,-4.336592775766331e-5,-5.032784985900198e-9,-3.1879727330728615e-4,-4.3432619842126424e-5,-5.0510003085641095e-9,-3.184242585414621e-4,-4.3432905625344e-5,-5.059844813029959e-9,-3.180265341602522e-4,-4.3340679734383175e-5,-5.054050804727019e-9,-3.1765375634226675e-4,-4.315212077889462e-5,-5.031931810784182e-9,-3.173550483018549e-4,-4.289299386726835e-5,-4.996837554368338e-9,-3.1716080997909414e-4,-4.261505262909454e-5,-4.9567039021442e-9,-3.170692069796597e-4,-4.237923706416617e-5,-4.921374850462595e-9,-3.170465026363197e-4,-4.223264659485568e-5,-4.898891858407981e-9,-3.170418960140496e-4,-4.21921256965402e-5,-4.892790866082162e-9,-3.1700761388347835e-4,-4.224278875220216e-5,-4.901672313350512e-9,-3.169131831034806e-4,-4.234911923149743e-5,-4.920678900423363e-9,-3.16749371627084e-4,-4.246978287171236e-5,-4.943593716023741e-9,-3.165243898644444e-4,-4.2568904032282556e-5,-4.964541739482594e-9,-3.1625720934575716e-4,-4.262161789567898e-5,-4.9789925323940574e-9,-3.159714090148497e-4,-4.2615163483100204e-5,-4.984192983307216e-9,-3.1569080936814757e-4,-4.254769010175503e-5,-4.979239205595006e-9,-3.154366980394452e-4,-4.242640923152246e-5,-4.964927408765917e-9,-3.1522594108550356e-4,-4.226576420878259e-5,-4.9434488536958256e-9,-3.150694594909588e-4,-4.2085617046374826e-5,-4.9179780034059015e-9,-3.1497088780468846e-4,-4.190919872197873e-5,-4.892216555795521e-9,-3.1492551795328115e-4,-4.1760510317359374e-5,-4.869937621819285e-9,-3.1491993926755705e-4,-4.166103135750512e-5,-4.85453930904946e-9,-3.1493292291119807e-4,-4.162602317937051e-5,-4.8486082924002386e-9,-3.149378852148921e-4,-4.166109759027768e-5,-4.853496717228234e-9,-3.149068763252208e-4,-4.1759869297922245e-5,-4.8689420569251265e-9,-3.1481563886056355e-4,-4.1903492821241635e-5,-4.892817724760096e-9,-3.146489018901334e-4,-4.206263788736928e-5,-4.921152563389806e-9,-3.1440486675449474e-4,-4.220199291018188e-5,-4.948556753677259e-9,-3.1409782736031844e-4,-4.2286972882281444e-5,-4.969141215356648e-9,-3.1375783301927705e-4,-4.229193221838251e-5,-4.9779020409811375e-9,-3.1342629281164673e-4,-4.2208473219180394e-5,-4.972322659694826e-9,-3.131469410284784e-4,-4.205134100763301e-5,-4.953675901336095e-9,-3.129532228356514e-4,-4.185850783786602e-5,-4.927339367737182e-9,-3.128559402293983e-4,-4.168268583803075e-5,-4.901590331357037e-9,-3.128372712174129e-4,-4.157504774094596e-5,-4.884996661975068e-9,-3.1285591758021213e-4,-4.1567376446027606e-5,-4.883435028626847e-9,-3.1286216261514294e-4,-4.166161325502891e-5,-4.898203035129861e-9,-3.128152510161355e-4,-4.1832011412133305e-5,-4.926093299613993e-9,-3.1269456478840265e-4,-4.2037319835952676e-5,-4.96108661782143e-9,-3.1250114325379443e-4,-4.2235381879465134e-5,-4.996540702951394e-9,-3.1225205877241923e-4,-4.239361488219513e-5,-5.026892948270938e-9,-3.119724750885652e-4,-4.249330688871886e-5,-5.048533140222312e-9,-3.116889276893549e-4,-4.252921835778996e-5,-5.059987008882629e-9,-3.1142503078342897e-4,-4.25069961860904e-5,-5.0616921955618265e-9,-3.111992283429283e-4,-4.244023805497469e-5,-5.055583300773006e-9,-3.1102368764590496e-4,-4.234797844643438e-5,-5.044617784933671e-9,-3.1090358734081304e-4,-4.22526006575234e-5,-5.032321067688745e-9,-3.108364399804756e-4,-4.217778740604939e-5,-5.022387283844178e-9,-3.108115257297438e-4,-4.214600986581236e-5,-5.018313830814128e-9,-3.1080993296466673e-4,-4.2175257475328325e-5,-5.023008475613783e-9,-3.1080593916080375e-4,-4.227521362395652e-5,-5.038322479284464e-9,-3.1077034837130563e-4,-4.244369565068855e-5,-5.06453984568056e-9,-3.1067585579162317e-4,-4.266468404943358e-5,-5.099969884051941e-9,-3.105035849258535e-4,-4.290936505875487e-5,-5.140877929168914e-9,-3.1024899896644803e-4,-4.314094465863473e-5,-5.181956628701638e-9,-3.0992505626402714e-4,-4.332264950955875e-5,-5.217361941575282e-9,-3.095610883380589e-4,-4.342700451466909e-5,-5.2421145403966415e-9,-3.091971222357173e-4,-4.3443817524911114e-5,-5.253502474396329e-9,-3.088746927985775e-4,-4.338445254519018e-5,-5.252067765269822e-9,-3.086262289687441e-4,-4.328075377912741e-5,-5.241813665026146e-9,-3.084657459880443e-4,-4.317815751980895e-5,-5.229427402694319e-9,-3.083838136062314e-4,-4.312402180818095e-5,-5.222569664693657e-9,-3.083492587428513e-4,-4.315408297432371e-5,-5.227650075739371e-9,-3.083181203766566e-4,-4.328165458806027e-5,-5.247856867561176e-9,-3.082471429138195e-4,-4.349411061585933e-5,-5.2822613795529054e-9,-3.081064848257633e-4,-4.375827146070421e-5,-5.3263709887758225e-9,-3.0788661043989416e-4,-4.403198008161343e-5,-5.373792020884821e-9,-3.0759759139367557e-4,-4.4276497491867025e-5,-5.418190385136207e-9,-3.072628362842785e-4,-4.4465056129220834e-5,-5.454790327401472e-9,-3.0691106900856074e-4,-4.458588788817899e-5,-5.481074258715986e-9,-3.0656967318466223e-4,-4.4640878311394534e-5,-5.496772186340735e-9,-3.0626062010192915e-4,-4.464213768265969e-5,-5.5034243148592386e-9,-3.0599865177202766e-4,-4.460833959835805e-5,-5.503787246380918e-9,-3.057908013060658e-4,-4.4561687503291136e-5,-5.501265100167681e-9,-3.0563641143263365e-4,-4.4525580714277986e-5,-5.4994619326435316e-9,-3.0552715792361276e-4,-4.4522582031122806e-5,-5.501861033144501e-9,-3.0544706109613843e-4,-4.457210286773981e-5,-5.511548919490009e-9,-0.00030537297561927964,-4.4687381552856436e-5,-5.5308628299553145e-9]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json new file mode 100644 index 0000000..2eec942 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":8000,"numberOfSamples":1000,"samples":[-3.0527640252829807e-4,-4.487182696660493e-5,-5.56088448082571e-9,-3.051274863200565e-4,-4.511556230951057e-5,-5.6008437940501195e-9,-3.049014822200931e-4,-4.5393887171247894e-5,-5.647698563779582e-9,-3.045865825423837e-4,-4.566978863347711e-5,-5.696284894052496e-9,-3.041902526794886e-4,-4.590165294193654e-5,-5.7403050551512475e-9,-3.0374053440293064e-4,-4.605480630272924e-5,-5.774008768966934e-9,-3.032803042778928e-4,-4.6112832816305496e-5,-5.793973590280497e-9,-3.028557483245855e-4,-4.608383761616052e-5,-5.800251345674449e-9,-3.025032355259023e-4,-4.599882516164128e-5,-5.796427523208801e-9,-3.022393949447573e-4,-4.5902896545994185e-5,-5.788631331365615e-9,-3.020574267495867e-4,-4.5842714571687194e-5,-5.7838921806700334e-9,-3.019300694661608e-4,-4.585434504667538e-5,-5.7883384069394884e-9,-3.0181769376023336e-4,-4.595468543172006e-5,-5.805682519418446e-9,-3.0167899235319e-4,-4.613834629665025e-5,-5.83635658405951e-9,-3.014813398322303e-4,-4.638044052124705e-5,-5.877534282545917e-9,-3.0120806044062887e-4,-4.664417952898078e-5,-5.924029708374941e-9,-3.008608032921932e-4,-4.689076983299546e-5,-5.969769115749644e-9,-3.004568895018775e-4,-4.70885065576558e-5,-6.009334760264992e-9,-3.000232042040917e-4,-4.7218579979817117e-5,-6.039104695872155e-9,-2.995891071912802e-4,-4.72766796425179e-5,-6.057736521969508e-9,-2.9918053358217385e-4,-4.7271135672653113e-5,-6.066024169441235e-9,-2.9881634126882297e-4,-4.721922325858296e-5,-6.066350982343671e-9,-2.9850682571005375e-4,-4.714317647578276e-5,-6.0620073426491385e-9,-2.982536857147729e-4,-4.706682514849363e-5,-6.056588919504954e-9,-2.9805063249734796e-4,-4.7013055973122464e-5,-6.053577596287479e-9,-2.978841024009395e-4,-4.700177778028711e-5,-6.0560846647952315e-9,-2.97733963612634e-4,-4.7047861809806975e-5,-6.066639640409404e-9,-2.975745746966664e-4,-4.715862391952254e-5,-6.086875521052076e-9,-2.9737697702912646e-4,-4.733079302488828e-5,-6.117026762619431e-9,-2.9711318240313096e-4,-4.754766231303244e-5,-6.1553289826818086e-9,-2.967630328757633e-4,-4.777820603997843e-5,-6.1976547684464505e-9,-2.963225516133362e-4,-4.7980702799556336e-5,-6.237878353608434e-9,-2.9581034269964766e-4,-4.8112531767448336e-5,-6.26929277722192e-9,-2.952671701271256e-4,-4.8144449769795835e-5,-6.286810452998715e-9,-2.9474584957997816e-4,-4.807330163392616e-5,-6.28897999422168e-9,-2.942942146728656e-4,-4.7925741507049555e-5,-6.278697823265868e-9,-2.939390776646052e-4,-4.774982986598883e-5,-6.2621933111198565e-9,-2.9367888471910724e-4,-4.759858957460034e-5,-6.246887112949443e-9,-2.9348722961036977e-4,-4.751366495959348e-5,-6.239195834786848e-9,-2.933236015115482e-4,-4.7515401306169104e-5,-6.243051945843658e-9,-2.9314581436119905e-4,-4.760093779409941e-5,-6.2593279168203955e-9,-2.9292007500896937e-4,-4.774844549298213e-5,-6.286013467788338e-9,-2.926269983387905e-4,-4.792463505513392e-5,-6.318926256564662e-9,-2.9226350769051096e-4,-4.80930810595307e-5,-6.352759512595941e-9,-2.918412941194005e-4,-4.822168516898902e-5,-6.382264012712696e-9,-2.9138274761924426e-4,-4.8288192173938596e-5,-6.4033284884177525e-9,-2.9091546827443674e-4,-4.828307144331461e-5,-6.4137142155758484e-9,-2.904666459630382e-4,-4.820960531850297e-5,-6.413290100567614e-9,-2.9005845372039675e-4,-4.808169188193544e-5,-6.403779607548024e-9,-2.897051121066428e-4,-4.7920298339887756e-5,-6.388175539851937e-9,-2.894117280467004e-4,-4.77495594070045e-5,-6.3700487926475646e-9,-2.891745460224369e-4,-4.7593309240161246e-5,-6.352958916462981e-9,-2.889819981834109e-4,-4.7472392700331755e-5,-6.340071065896678e-9,-2.8881605249833365e-4,-4.740260960082055e-5,-6.333942633116508e-9,-2.886536932128631e-4,-4.739292957383811e-5,-6.336355114475078e-9,-2.884687014832789e-4,-4.7443667570689896e-5,-6.348050662755428e-9,-2.8823427250380447e-4,-4.754452904089668e-5,-6.368308311532382e-9,-2.879272735231633e-4,-4.767303651414079e-5,-6.394467888137689e-9,-2.875345818250315e-4,-4.7794856179294424e-5,-6.4217381728864196e-9,-2.8706055734247936e-4,-4.786832012302628e-5,-6.443756519509059e-9,-2.865324198422822e-4,-4.785486234755549e-5,-6.4542037210419195e-9,-2.859983895327293e-4,-4.773390713864742e-5,-6.449179015088165e-9,-2.8551497623516194e-4,-4.7515537099475336e-5,-6.429222290163076e-9,-2.8512656698742036e-4,-4.724172825041583e-5,-6.399602792241161e-9,-2.8484791237568235e-4,-4.697228518879425e-5,-6.368414825098121e-9,-2.846599731981497e-4,-4.676227057336778e-5,-6.343524830079535e-9,-2.845204990113826e-4,-4.664360730421715e-5,-6.330077698450703e-9,-2.8438137789211793e-4,-4.661903031892221e-5,-6.32954910609419e-9,-2.842033332610527e-4,-4.666740117899054e-5,-6.340163616828402e-9,-2.8396352830062366e-4,-4.6754274987887116e-5,-6.357961127061933e-9,-2.836566692220362e-4,-4.684229725179311e-5,-6.377959739889069e-9,-2.8329216427076527e-4,-4.689886773239183e-5,-6.395189096969708e-9,-2.828896488527907e-4,-4.6900720390375284e-5,-6.405540596281919e-9,-2.824742018907562e-4,-4.6836037546351875e-5,-6.4064023526000905e-9,-2.8207178859335354e-4,-4.670471097933904e-5,-6.397002591025266e-9,-2.817052464373959e-4,-4.6517083949337426e-5,-6.378389721142845e-9,-2.8139115347079264e-4,-4.629149712487325e-5,-6.3530658178796655e-9,-2.811378256204399e-4,-4.605106192105769e-5,-6.324396845660935e-9,-2.8094456582733565e-4,-4.582011369839805e-5,-6.295969795469077e-9,-2.8080213121061873e-4,-4.562084808863251e-5,-6.271061910825657e-9,-2.806941282722342e-4,-4.547056083835451e-5,-6.252305778500468e-9,-2.805989529923734e-4,-4.537959014034061e-5,-6.241511789741509e-9,-2.80492067241958e-4,-4.5349843601162954e-5,-6.239532828776588e-9,-2.803485913613245e-4,-4.5373805665704785e-5,-6.246068068716576e-9,-2.8014639891832464e-4,-4.543399639996473e-5,-6.259380228216586e-9,-2.7987013346108646e-4,-4.550321157816095e-5,-6.276047783203556e-9,-2.795162996405821e-4,-4.5546626057891795e-5,-6.291045688354151e-9,-2.790984739623287e-4,-4.5527321372703615e-5,-6.298505516465384e-9,-2.7865004000894166e-4,-4.541620148794469e-5,-6.2933199008508685e-9,-2.7822043288384707e-4,-4.520484869900707e-5,-6.273276588202333e-9,-2.7786184532760936e-4,-4.4915535087074116e-5,-6.240723143326448e-9,-2.776091852793529e-4,-4.459975553570474e-5,-6.202458787212566e-9,-2.774638632702066e-4,-4.432123225548417e-5,-6.167368360824802e-9,-2.7739275622409024e-4,-4.41307893297388e-5,-6.142942429461774e-9,-2.7734363791847937e-4,-4.404793703195258e-5,-6.132712569902154e-9,-2.772666481119829e-4,-4.405873879426259e-5,-6.135803693451539e-9,-2.7712954630060494e-4,-4.41272344392883e-5,-6.148198003690473e-9,-2.769220926915838e-4,-4.421078330515423e-5,-6.164515668643785e-9,-2.7665243775120893e-4,-4.4271847046803456e-5,-6.179465722684056e-9,-2.7634044414996943e-4,-4.42840858576599e-5,-6.188763867311319e-9,-2.760112787880964e-4,-4.4233969441495255e-5,-6.1896325079837635e-9,-2.7569053678467995e-4,-4.4119908832911274e-5,-6.1810143630256235e-9,-2.7540081443001705e-4,-4.395037973603709e-5,-6.1635500652351195e-9,-2.7515925763830574e-4,-4.374163186724933e-5,-6.13931893200916e-9,-2.7497583229343773e-4,-4.351509382685275e-5,-6.1113765985356755e-9,-2.7485228599034487e-4,-4.3294504323835476e-5,-6.083191373407955e-9,-2.747818899337699e-4,-4.3102814240736015e-5,-6.0580978536060394e-9,-2.7475014030275356e-4,-4.2959058861573174e-5,-6.038863549547172e-9,-2.747364727847155e-4,-4.287561578709453e-5,-6.027414092691353e-9,-2.7471679197166814e-4,-4.2856211898555225e-5,-6.024680664675889e-9,-2.74666552518033e-4,-4.2894856634732136e-5,-6.0304870842090665e-9,-2.745641634544586e-4,-4.297583426922976e-5,-6.043429961128174e-9,-2.7439449831047824e-4,-4.307484329777695e-5,-6.060781782144661e-9,-2.7415239183585174e-4,-4.316139154284506e-5,-6.078538519547611e-9,-2.738458939963984e-4,-4.320289628151456e-5,-6.0918223659286445e-9,-2.7349833665268886e-4,-4.317111271140737e-5,-6.095829254040278e-9,-2.731473286401864e-4,-4.305077016877184e-5,-6.087300751131777e-9,-2.728384066406977e-4,-4.284850797286421e-5,-6.0661306830069746e-9,-2.726122464122091e-4,-4.2597682445614436e-5,-6.036317211131248e-9,-2.724883882208636e-4,-4.2353186226421395e-5,-6.005346149629137e-9,-2.724538993112942e-4,-4.21739660621937e-5,-5.981721324392774e-9,-2.7246601864680027e-4,-4.209994110375406e-5,-5.971667694606237e-9,-2.724694960632973e-4,-4.2136627145050584e-5,-5.976871636177898e-9,-2.724184831524113e-4,-4.225643997788255e-5,-5.9944559253544774e-9,-2.7229051896981396e-4,-4.241362759713718e-5,-6.018773549341146e-9,-2.720878961454436e-4,-4.2562043557314734e-5,-6.043635716054438e-9,-2.718303929497391e-4,-4.266714123706157e-5,-6.063913242192316e-9,-2.715458512132313e-4,-4.271024379125761e-5,-6.076285881259704e-9,-2.712626659453091e-4,-4.268748746246162e-5,-6.07938776767281e-9,-2.710052329722968e-4,-4.260653559518088e-5,-6.073631332430156e-9,-2.707916949070718e-4,-4.248307887576607e-5,-6.060863861100873e-9,-2.7063291676093104e-4,-4.233782096456377e-5,-6.043919283576518e-9,-2.70531999054325e-4,-4.2193858972839276e-5,-6.026112658845783e-9,-2.7048412159524855e-4,-4.207417276834723e-5,-6.010749252660998e-9,-2.704768085276078e-4,-4.199898085891688e-5,-6.0007083249929064e-9,-2.7049091718653486e-4,-4.198292846456885e-5,-5.998122765150181e-9,-2.705026716692996e-4,-4.203245930769175e-5,-6.0041500657964715e-9,-2.704867786001442e-4,-4.2143960157053555e-5,-6.018813110137525e-9,-2.7042033326989443e-4,-4.2303217237346e-5,-6.0408918160634616e-9,-2.702869966792254e-4,-4.248659500899885e-5,-6.067897441023674e-9,-2.7008072908028737e-4,-4.26641123975258e-5,-6.096212887106141e-9,-2.698083301299173e-4,-4.2804202514864496e-5,-6.121495193355481e-9,-2.6949017078992116e-4,-4.287971029548579e-5,-6.139410707238995e-9,-2.6915846953213103e-4,-4.287457712691834e-5,-6.146692366322419e-9,-2.688523188530164e-4,-4.2790136468926805e-5,-6.142330933965789e-9,-2.6860905054935876e-4,-4.2648942394378234e-5,-6.128480097984698e-9,-2.684529386021688e-4,-4.249325511328419e-5,-6.110525799006696e-9,-2.683846561272461e-4,-4.237577162193681e-5,-6.0958916495610374e-9,-2.6837713845480256e-4,-4.2343242447415576e-5,-6.091676533973367e-9,-2.6838259865424467e-4,-4.241897119821026e-5,-6.1020278393601044e-9,-2.6834954243159544e-4,-4.259356052706968e-5,-6.126618946744287e-9,-2.682414538672124e-4,-4.282968580925502e-5,-6.161071746178656e-9,-2.680473788683876e-4,-4.307777590451198e-5,-6.198928228542621e-9,-2.6778068952418554e-4,-4.329323584064263e-5,-6.233932842908828e-9,-2.6746984498891765e-4,-4.3447294758245534e-5,-6.261585257801009e-9,-2.6714767994234935e-4,-4.3529579126087075e-5,-6.279696539448954e-9,-2.6684354540698494e-4,-4.3545106782298875e-5,-6.288235271926127e-9,-2.6657927046700944e-4,-4.3509317188260445e-5,-6.288838671033637e-9,-2.6636794026195363e-4,-4.3443465401146905e-5,-6.284232359286678e-9,-2.662140688653375e-4,-4.33711394559145e-5,-6.277670357631493e-9,-2.661141777281877e-4,-4.331570058397092e-5,-6.272450417208355e-9,-2.660574130223562e-4,-4.329813146063895e-5,-6.271533343649169e-9,-2.6602631028516745e-4,-4.3334832510506525e-5,-6.277259574999488e-9,-2.6599810856047266e-4,-4.3435186752350394e-5,-6.291119283070944e-9,-2.6594709819864e-4,-4.35991710667151e-5,-6.313534449691571e-9,-2.6584826187483416e-4,-4.3815728146144786e-5,-6.3436577175095264e-9,-2.6568197080015167e-4,-4.406282185693006e-5,-6.379260979809167e-9,-2.654388737832523e-4,-4.4309976961368614e-5,-6.416844899921613e-9,-2.651235904796523e-4,-4.452352360454744e-5,-6.45208973946681e-9,-2.6475574490715504e-4,-4.467379291793127e-5,-6.480660100582804e-9,-2.643674413816663e-4,-4.474263772198858e-5,-6.499235785255884e-9,-2.639972203386808e-4,-4.472932230357101e-5,-6.506524425656316e-9,-2.636814333534693e-4,-4.4652981742684745e-5,-6.50394943475184e-9,-2.6344474410546685e-4,-4.455031096217054e-5,-6.4957052750673075e-9,-2.6329215242018296e-4,-4.446797824163044e-5,-6.487971527226249e-9,-2.6320539661309406e-4,-4.445066132419316e-5,-6.487318143828218e-9,-2.63146231141766e-4,-4.452761326611089e-5,-6.498693327228091e-9,-2.630670795117471e-4,-4.4702593314460794e-5,-6.523735117410233e-9,-2.629259962418986e-4,-4.495205403355389e-5,-6.560195481816707e-9,-2.626998326199566e-4,-4.523322969000845e-5,-6.6028055138425835e-9,-2.6238984542081514e-4,-4.5498615964264204e-5,-6.645151128486782e-9,-2.620181139265042e-4,-4.57101034480172e-5,-6.681643636040315e-9,-2.6161796896905014e-4,-4.584720776675456e-5,-6.7088001834994565e-9,-2.6122365300701173e-4,-4.590801043953323e-5,-6.725594759670876e-9,-2.608629732320002e-4,-4.590508421570969e-5,-6.733110680725014e-9,-2.605538971319134e-4,-4.585973386898697e-5,-6.733869753505527e-9,-2.6030410219870376e-4,-4.5796853823059685e-5,-6.731122265893311e-9,-2.601120119629486e-4,-4.574121346938611e-5,-6.728248726724007e-9,-2.5996821459528486e-4,-4.571499884470834e-5,-6.728333811525041e-9,-2.5985675252670267e-4,-4.573601546615178e-5,-6.733900781581118e-9,-2.597563470776258e-4,-4.581593891770877e-5,-6.7467347208660815e-9,-2.596420276961034e-4,-4.5958327928148174e-5,-6.76770494879153e-9,-2.594877524327709e-4,-4.6156630892450285e-5,-6.796534200413236e-9,-2.5927042693107434e-4,-4.6392942692009576e-5,-6.8315565589601714e-9,-2.589751849875842e-4,-4.663871238482509e-5,-6.86962752289666e-9,-2.586008062635789e-4,-4.685864046342157e-5,-6.906416881867135e-9,-2.5816311466290005e-4,-4.7018104873896896e-5,-6.937219567577798e-9,-2.5769402554871504e-4,-4.70926588010539e-5,-6.9581636155644655e-9,-2.5723517884218273e-4,-4.707644773329669e-5,-6.967428938305518e-9,-2.568273908815006e-4,-4.6986025040791123e-5,-6.966001210496018e-9,-2.564992393431867e-4,-4.685748280218821e-5,-6.957630999254399e-9,-2.5625871902160277e-4,-4.6737400412949545e-5,-6.947966529409689e-9,-2.5609074998136574e-4,-4.667043573132832e-5,-6.943105351110571e-9,-2.5596122517727485e-4,-4.6687347367702306e-5,-6.947967062704738e-9,-2.5582634783583117e-4,-4.6796866950713174e-5,-6.964938644351132e-9,-2.5564461158371896e-4,-4.698373076282578e-5,-6.993209196686726e-9,-2.553879109156633e-4,-4.7213518226825917E-05,-7.029044733220987e-9,-2.5504832832596024e-4,-4.744277599023395e-5,-7.066933407213379e-9,-2.5463858429774843e-4,-4.7630969964505535e-5,-7.1011838454172516e-9,-2.541865650862485e-4,-4.775023325017012e-5,-7.127396703046114e-9,-2.537265402404863e-4,-4.7790107831489385e-5,-7.143345909601783e-9,-2.532904918374822e-4,-4.775683549761495e-5,-7.1491178104008635e-9,-2.529021042786563e-4,-4.766889086299671e-5,-7.146663004807935e-9,-2.525741732148423e-4,-4.7551249353078e-5,-7.139062192878236e-9,-2.5230871169483677e-4,-4.743029000875771e-5,-7.129782907503167e-9,-2.5209851175530824e-4,-4.733012368995658e-5,-7.12209759254885e-9,-2.519291245187472e-4,-4.7270279788107355e-5,-7.1187265860613594e-9,-2.517806968882801e-4,-4.726422556842384e-5,-7.12166746585097e-9,-2.5162963986732293e-4,-4.731809415808857e-5,-7.132097650423624e-9,-2.514505510713131e-4,-4.742927313984141e-5,-7.1502341423829864e-9,-2.512190030433243e-4,-4.758501628393123e-5,-7.175103678264232e-9,-2.5091568236328035e-4,-4.7761815907209246e-5,-7.204305121348925e-9,-2.5053181294401e-4,-4.7926849500478765e-5,-7.233991717484305e-9,-2.500746237911642e-4,-4.804301276238442e-5,-7.259360514494356e-9,-2.495701519604955e-4,-4.8078046570921506e-5,-7.275783141609628e-9,-2.490601882212913e-4,-4.8015746621047336e-5,-7.280321967292176e-9,-2.4859206990471175e-4,-4.786450499113676e-5,-7.272987851368456e-9,-2.4820404096295365e-4,-4.7657974491023386e-5,-7.2570490683069305e-9,-2.479123719305355e-4,-4.744593983612639e-5,-7.238137844085153e-9,-2.477062542180496e-4,-4.7278801363755583e-5,-7.2225323219480234e-9,-2.475523859045091e-4,-4.719243023421515e-5,-7.2153509223338515e-9,-2.4740634073176207e-4,-4.7199163254914456e-5,-7.21928276128765e-9,-2.472256149075255e-4,-4.728689651818537e-5,-7.234113502680999e-9,-2.469800996566623e-4,-4.742481447800407e-5,-7.2570090226968695e-9,-2.4665781472638505e-4,-4.757279635380423e-5,-7.283374548153914e-9,-2.462655369996502e-4,-4.769151536169288e-5,-7.308038135183422e-9,-2.458251322065457e-4,-4.775085456159175e-5,-7.326465854721028e-9,-2.4536711100036463e-4,-4.77350886691006e-5,-7.3357152755733405e-9,-2.4492329122390537e-4,-4.764420066221715e-5,-7.334911212083219e-9,-2.4452039783219196e-4,-4.749169496663902e-5,-7.3251748443696005e-9,-2.441758732145271e-4,-4.7300134577938174e-5,-7.309112821670338e-9,-2.4389627170717684e-4,-4.7095968591426874e-5,-7.2900891206745445e-9,-2.4367780651202367e-4,-4.6904922721911e-5,-7.2715143086660904e-9,-2.4350820404063506e-4,-4.674862028056588e-5,-7.2563236900772534e-9,-2.4336901910568495e-4,-4.6642494199979074e-5,-7.246701350541432e-9,-2.4323787902715116e-4,-4.6594604978692496e-5,-7.243991435989502e-9,-2.4309057272598025e-4,-4.6604855006113405e-5,-7.248666445835073e-9,-2.4290326713360635e-4,-4.666429753503088e-5,-7.260234391154556e-9,-2.4265533867043101e-4,-4.67546250155109e-5,-7.2770527231963495e-9,-2.4233328045250883e-4,-4.684845105661854e-5,-7.29615811529741e-9,-2.4193563237893614e-4,-4.6911622727816726e-5,-7.313363425619466e-9,-2.4147769061437337e-4,-4.690904210391057e-5,-7.323911274472526e-9,-2.409931846698145e-4,-4.68145030450435e-5,-7.3237831866979765e-9,-2.405293638181594e-4,-4.6622304985804496e-5,-7.311327256640174e-9,-2.4013397134164407e-4,-4.6354911420302454e-5,-7.288398575368516e-9,-2.3983792521253927e-4,-4.606009583001144e-5,-7.260171753226957e-9,-2.396424964711392e-4,-4.579591722183568e-5,-7.233460507133913e-9,-2.3951876787466002e-4,-4.561007369104896e-5,-7.21434469153871e-9,-2.394196251219914e-4,-4.552433842374012e-5,-7.206304347525716e-9,-2.3929702425245816e-4,-4.553082614515197e-5,-7.209572961363757e-9,-2.3911604156302504e-4,-4.559902693265397e-5,-7.221607636814043e-9,-2.3886148969033618e-4,-4.56878141259867e-5,-7.238141334743658e-9,-2.385376124584638e-4,-4.57569458542221e-5,-7.25434375948497e-9,-2.381635151221613e-4,-4.5775227331894453e-5,-7.265844606590987e-9,-2.3776689984276165e-4,-4.57248113055291e-5,-7.26951760352044e-9,-2.3737775512568452e-4,-4.560224089873021e-5,-7.26396202658587e-9,-2.3702288262502963e-4,-4.541701560695537e-5,-7.249620171308552e-9,-2.3672182048234104e-4,-4.518837706556744e-5,-7.228512886555455e-9,-2.3648451210419064e-4,-4.494110071809932e-5,-7.203679129923876e-9,-2.3631073766417756e-4,-4.470112417759971e-5,-7.1784915077864556e-9,-2.3619104748406788e-4,-4.449166637344944e-5,-7.156032804897266e-9,-2.361087730659606e-4,-4.433028327220373e-5,-7.138674148007875e-9,-2.3604256281260482e-4,-4.422705852302139e-5,-7.1278965459513375e-9,-2.3596896071219697e-4,-4.41837594790764e-5,-7.124282211477298e-9,-2.358648734407393e-4,-4.419359846967748e-5,-7.127541904743606e-9,-2.3571005457793368e-4,-4.424139308519803e-5,-7.136477505700135e-9,-2.3548986076137152e-4,-4.4304182265018096e-5,-7.148875985336727e-9,-2.3519855436410849e-4,-4.435271161882365e-5,-7.16145714276836e-9,-2.348430390860336e-4,-4.4354724701945077e-5,-7.170110582162483e-9,-2.3444587375598763e-4,-4.428117792866847e-5,-7.170657306550671e-9,-2.3404509111068765e-4,-4.411557127942225e-5,-7.1601656476032516e-9,-2.3368771973065835e-4,-4.386412570504797e-5,-7.138447255205115e-9,-2.334157329157928e-4,-4.356117057573164e-5,-7.108920211252188e-9,-2.3324859251575434e-4,-4.326304457334257e-5,-7.077986722810363e-9,-2.3317225159038513e-4,-4.3029164658112595e-5,-7.0528241170588876e-9,-2.3314325821755143e-4,-4.289880884221161e-5,-7.038651316312173e-9,-2.3310674475310233e-4,-4.287707539508815e-5,-7.037006731343113e-9,-2.330173793949718e-4,-4.2937138101060195e-5,-7.045793591462278e-9,-2.3285221519255721e-4,-4.303448249497462e-5,-7.060613085178226e-9,-2.3261221161084732e-4,-4.312326355963217e-5,-7.076380098752534e-9,-2.3231616237874106e-4,-4.3167782922615494e-5,-7.0885642907420745e-9,-2.3199226213489643e-4,-4.3147504709399666e-5,-7.093925360427784e-9,-2.3167066135599025e-4,-4.305722178644823e-5,-7.090854405127532e-9,-2.3137815592412457e-4,-4.290464072813479e-5,-7.079431225173229e-9,-2.3113482317374794e-4,-4.2706990561187926e-5,-7.061239222047379e-9,-2.3095210624270325e-4,-4.248733394858226e-5,-7.0389514644621475e-9,-2.3083209319112942e-4,-4.22708356697799e-5,-7.0157556508521975e-9,-2.3076787058155768e-4,-4.208124244565444e-5,-6.994754152444318e-9,-2.3074481404720975e-4,-4.193779429781794e-5,-6.978475418029599e-9,-2.3074269629111773e-4,-4.185278131262165e-5,-6.9685812919441475e-9,-2.3073838954341724e-4,-4.183002690679065e-5,-6.9657828504140465e-9,-2.307087773182823e-4,-4.1864416184094224e-5,-6.969890191920407e-9,-2.3063358371772487e-4,-4.19423194920427e-5,-6.979881232260712e-9,-2.304980447362638e-4,-4.204276810737836e-5,-6.993919691136392e-9,-2.3029541532778425e-4,-4.2139396145542684e-5,-7.00935383163725e-9,-2.3002929420596648e-4,-4.220331442258605e-5,-7.022821179996584e-9,-2.297155277725766e-4,-4.220735882242904e-5,-7.0306406913778314e-9,-2.2938274641947577e-4,-4.2132214476566026e-5,-7.029632424365228e-9,-2.2906972807424893e-4,-4.197407643695822e-5,-7.018296801761733e-9,-2.2881761972917472e-4,-4.175160042946605e-5,-6.997961873684011e-9,-2.286567093282979e-4,-4.15075256296687e-5,-6.9732029722847966e-9,-2.2859182172845228e-4,-4.129977684881916e-5,-6.9508561159118375e-9,-2.2859518852719337e-4,-4.118158264999498e-5,-6.937623078004585e-9,-2.2861445669427582e-4,-4.1179317366699686e-5,-6.937368890191579e-9,-2.2859373178187907e-4,-4.128165726085842e-5,-6.949709434593278e-9,-2.2849535207625107e-4,-4.144683429672747e-5,-6.970641653126126e-9,-2.283102601143957e-4,-4.162180946726997e-5,-6.994513297007544e-9,-2.280546314648973e-4,-4.1760936140705576e-5,-7.015996457807604e-9,-2.2775905137933017e-4,-4.1836162324814815e-5,-7.0312662464705675e-9,-2.2745750303615093e-4,-4.183854159207291e-5,-7.038384862713035e-9,-2.2717978153226345e-4,-4.1774688473891304e-5,-7.037214328561364e-9,-2.269476550317656e-4,-4.166168283592476e-5,-7.029107904443636e-9,-2.2677360769187676e-4,-4.152239765949198e-5,-7.016489998134974e-9,-2.2666086428735168e-4,-4.13817553708349e-5,-7.002360297324509e-9,-2.2660400530891817e-4,-4.126365474609324e-5,-6.989766583218536e-9,-2.2659004542151717e-4,-4.1188304668478054e-5,-6.981333927974789e-9,-2.266000219235072e-4,-4.116989011754661e-5,-6.978931288333946e-9,-2.266111881676761e-4,-4.12146495166316e-5,-6.9835033237536505e-9,-2.2659985001449061e-4,-4.131967774449151e-5,-6.9950455254666655e-9,-2.2654460748588225e-4,-4.147283960401956e-5,-7.012666563520272e-9,-2.264295628693442e-4,-4.165394006870694e-5,-7.034672741319516e-9,-2.2624709886908756e-4,-4.183709352380845e-5,-7.058654437906543e-9,-2.259998866238783e-4,-4.1994173550205136e-5,-7.081632424729571e-9,-2.2570180047419192e-4,-4.20991362790095e-5,-7.100361989265034e-9,-2.2537742095192945e-4,-4.213298776272619e-5,-7.111886301353217e-9,-2.2505959382885995e-4,-4.208912506154797e-5,-7.114348718520941e-9,-2.2478421898691062e-4,-4.197821401236689e-5,-7.107904138739319e-9,-2.2458174592226204e-4,-4.1830607186345735e-5,-7.0953504217620375e-9,-2.244663606137209e-4,-4.169327376221295e-5,-7.081979987657558e-9,-2.2442665203386655e-4,-4.1618683723854355e-5,-7.074284006802257e-9,-2.2442408061700852e-4,-4.1646821969372816e-5,-7.077692877238242e-9,-2.2440397415766895e-4,-4.178786877968106e-5,-7.0943342038050634e-9,-2.2431615173148974e-4,-4.201628734466668e-5,-7.122132208245681e-9,-2.2413418489370047e-4,-4.2281316841771065e-5,-7.155838491573877e-9,-2.238625036955378e-4,-4.252762716447894e-5,-7.189267752364687e-9,-2.2352958981585374e-4,-4.271389191467571e-5,-7.217364886846549e-9,-2.231742512295794e-4,-4.2821232086966055e-5,-7.2372470959088515e-9,-2.2283320562756947e-4,-4.285179730744506e-5,-7.2482661351785805e-9,-2.2253387205703278e-4,-4.282232746248896e-5,-7.2515555960049095e-9,-2.2229206566917885e-4,-4.275713751688142e-5,-7.2494356512215224e-9,-2.2211260756237194e-4,-4.2682685880708425e-5,-7.244838453971768e-9,-2.2199099538278396e-4,-4.262399641811782e-5,-7.240796077498677e-9,-2.2191514949620428e-4,-4.260230497054901e-5,-7.240011891369483e-9,-2.2186707232957353e-4,-4.26332616889838e-5,-7.244543832697758e-9,-2.2182464125580366e-4,-4.2725338241283515e-5,-7.255615619695993e-9,-2.217638453501513e-4,-4.287842690194515e-5,-7.273534478793906e-9,-2.2166170729793913e-4,-4.308298693357485e-5,-7.2976765517466445e-9,-2.2149980429336165e-4,-4.332033803452491e-5,-7.326522432477613e-9,-2.2126785688274673e-4,-4.3564584276414805e-5,-7.357751075488498e-9,-2.20966584781167e-4,-4.3786290015324124e-5,-7.388436436288333e-9,-2.2060898292754956e-4,-4.395759483340187e-5,-7.415404439706891e-9,-2.202193504707468e-4,-4.405796910551689e-5,-7.435775583366592e-9,-2.1982983813928416e-4,-4.407947682940211e-5,-7.4476444040565705e-9,-2.1947474914701923e-4,-4.403040203489803e-5,-7.450766846569757e-9,-2.1918316392070605e-4,-4.393615767618415e-5,-7.447040423172644e-9,-2.1897091886597989e-4,-4.3836355658260945e-5,-7.440501159279104e-9,-2.188338255077648e-4,-4.3777167322247025e-5,-7.4366017543605706e-9,-2.187450180632313e-4,-4.379926707359548e-5,-7.440747299185002e-9,-2.1865951766138927e-4,-4.3924079338995526e-5,-7.456451577868975e-9,-2.1852701523895825e-4,-4.414394644131482e-5,-7.48388495394003e-9,-2.1830915181893224e-4,-4.442241000664643e-5,-7.51964660486929e-9,-2.1799327092026865e-4,-4.47064341649404e-5,-7.558021886353412e-9,-2.1759542948186208e-4,-4.4945093539923776e-5,-7.593080121112747e-9,-2.1715190572061313e-4,-4.510525927973701e-5,-7.62051102463403e-9,-2.1670511352975532e-4,-4.5177775919498044e-5,-7.63846614779529e-9,-2.1629130702600425e-4,-4.5174263035486545e-5,-7.647414111500688e-9,-2.1593400226015044e-4,-4.511913434864514e-5,-7.649461867526958e-9,-2.1564283671687278e-4,-4.504151932089862e-5,-7.647573809127245e-9,-2.1541555700511315e-4,-4.496945565191675e-5,-7.644907915657562e-9,-2.152409460728591e-4,-4.4926547873120016E-05,-7.644326527091175e-9,-2.1510150205944102e-4,-4.493027145003056e-5,-7.648080390942638e-9,-2.1497560662559327e-4,-4.499101379307958e-5,-7.65764086825275e-9,-2.1483945926710325e-4,-4.511125926355644e-5,-7.673632641449619e-9,-2.1466926637521481e-4,-4.528477274004901e-5,-7.695803268049495e-9,-2.144441173207301e-4,-4.549613641988964e-5,-7.722992976764426e-9,-2.1414962209211983e-4,-4.572138551931352e-5,-7.753133503949428e-9,-2.137817825713578e-4,-4.5930557875204e-5,-7.783365806364265e-9,-2.1334992695909555e-4,-4.609259275443571e-5,-7.810385927253544e-9,-2.1287718132165904e-4,-4.6182138061975344e-5,-7.831058043246478e-9,-2.123972901802133e-4,-4.618667111745394e-5,-7.843194529569795e-9,-2.1194776550871445e-4,-4.611156504767954e-5,-7.846275859882824e-9,-2.1156084382754122e-4,-4.598097245517623e-5,-7.841849026160612e-9,-2.1125475027746477e-4,-4.5833615902049135e-5,-7.833415837621815e-9,-2.1102786191385352e-4,-4.57141563789811e-5,-7.825754714870187e-9,-2.1085766176323766e-4,-4.5662121102797614e-5,-7.823773717687805e-9,-2.1070526783781765e-4,-4.570112440445812e-5,-7.831148800367581e-9,-2.1052503260910168e-4,-4.5831388471697066e-5,-7.84914193292144e-9,-2.1027715631769618e-4,-4.602835716858338e-5,-7.876058836978009e-9,-2.0993957436240816e-4,-4.6248926026246374e-5,-7.90766713758257e-9,-2.095146194759454e-4,-4.644402823389973e-5,-7.938509723459188e-9,-2.0902749841148404e-4,-4.6573103373786205e-5,-7.963593692431587e-9,-2.085173003005473e-4,-4.6614726939852604e-5,-7.979751223426029e-9,-2.080247685004384e-4,-4.656971988276465e-5,-7.986202202748241e-9,-2.0758195037667867e-4,-4.645702153575651e-5,-7.984303236040702e-9,-2.0720680107128868e-4,-4.630568678322192e-5,-7.976805592462343e-9,-2.069027746736158e-4,-4.6146864470554793E-05,-7.967006829227965e-9,-2.0666149949068237e-4,-4.6008053738656595e-5,-7.958051544835984e-9,-2.0646643337144435e-4,-4.591001322147901e-5,-7.952478950941206e-9,-2.0629619473845173e-4,-4.586558575032321e-5,-7.952010523962518e-9,-2.0612715730170046e-4,-4.587946155808738e-5,-7.957511462395227e-9,-2.0593551752786214e-4,-4.594814009737746e-5,-7.969025447952002e-9,-2.0569936999224403e-4,-4.6059814191126656e-5,-7.985789917193825e-9,-2.054013396767555e-4,-4.619444426954505e-5,-8.006201300389058e-9,-2.0503200586908336e-4,-4.632476440606799e-5,-8.027795774410303e-9,-2.0459370977526643e-4,-4.6419232557928356e-5,-8.04739911864323e-9,-2.0410341514187733e-4,-4.644771828424737e-5,-8.061606874456355e-9,-2.0359249297940358e-4,-4.6389591386022976e-5,-8.06761967917358e-9,-2.0310152417526018e-4,-4.6241943470151586e-5,-8.064208675557398e-9,-2.026701314330422e-4,-4.602412220191169e-5,-8.05238930586289e-9,-2.0232482212882342e-4,-4.5775201703916056e-5,-8.035415203185357e-9,-2.0206981769589567e-4,-4.5543952383211005e-5,-8.017995799141722e-9,-2.0188503857131567e-4,-4.5374719563007136e-5,-8.005002937932091e-9,-2.0173208974531864e-4,-4.5294685661682146e-5,-8.000132839061242e-9,-2.0156558865288865e-4,-4.530694102432007e-5,-8.004940251523124e-9,-2.0134563404935994e-4,-4.5390862347908655e-5,-8.018476540387911e-9,-2.010477628284383e-4,-4.5508700213428396e-5,-8.037583629336856e-9,-2.0066816008643582e-4,-4.56159424839469e-5,-8.05775420557668e-9,-2.002233040454102e-4,-4.5672547498502866e-5,-8.074324603901956e-9,-1.9974456130923202e-4,-4.5652156194690424e-5,-8.083656540042794e-9,-1.992695170896543e-4,-4.554701856445397e-5,-8.083957366931921e-9,-1.9883270591920156e-4,-4.5367698049175715e-5,-8.075522287619769e-9,-1.9845841745310465e-4,-4.513832170771045e-5,-8.060398815725766e-9,-1.981572124953109e-4,-4.488951139782889e-5,-8.041672208553757e-9,-1.9792619199168255e-4,-4.46514605035761e-5,-8.022654713173082e-9,-1.97751818665741e-4,-4.444885607769098e-5,-8.006221420156825e-9,-1.9761372928278598e-4,-4.429815409582809e-5,-7.994418534127477e-9,-1.9748834183331958e-4,-4.4206787770554826e-5,-7.988349103172298e-9,-1.9735172150645567e-4,-4.417347840913245e-5,-7.988243219864344e-9,-1.9718177685405577e-4,-4.4188897515318655e-5,-7.993577576316224e-9,-1.969602185929472e-4,-4.423633228093872e-5,-8.003137811219496e-9,-1.96674791367231e-4,-4.429249144944042e-5,-8.01500158984719e-9,-1.9632209229852586e-4,-4.43290434847933e-5,-8.026530943997656e-9,-1.9591072087203853e-4,-4.4315855466975366e-5,-8.03455558004738e-9,-1.9546352222861362e-4,-4.422685189198833e-5,-8.035926730100295e-9,-1.9501665604001342e-4,-4.404835137258371e-5,-8.028456381532183e-9,-1.9461311284592976e-4,-4.3787482447394696e-5,-8.011956426634773e-9,-1.9429036612252486e-4,-4.3475903590539156e-5,-7.988819905738023e-9,-1.9406609579109184e-4,-4.31641133352837e-5,-7.963631507898714e-9,-1.939293801808378e-4,-4.290607476846081e-5,-7.941776010191559e-9,-1.9384326424020214e-4,-4.274050836180446e-5,-7.927647618378034e-9,-1.9375801371840964e-4,-4.267820492195053e-5,-7.923311832665135e-9,-1.9362806935360174e-4,-4.270088509049269e-5,-7.928124868965717e-9,-1.934249241067107e-4,-4.277008015595093e-5,-7.93923136862352e-9,-1.931422172148227e-4,-4.284026359050476e-5,-7.952533831849908e-9,-1.9279378906395382e-4,-4.287086605432226e-5,-7.963753390058145e-9,-1.9240746774724533e-4,-4.283438753175265e-5,-7.96935681810304e-9,-1.9201729184363728e-4,-4.272004332166115e-5,-7.967224995384466e-9,-1.9165604145344355e-4,-4.253352928312996e-5,-7.956980058119363e-9,-1.9134921912310286e-4,-4.229384282667856e-5,-7.939923003820991e-9,-1.9111121492372828e-4,-4.202818834980984e-5,-7.91860535841166e-9,-1.9094402083634387e-4,-4.176615800307559e-5,-7.896162848299419e-9,-1.9083831639714896e-4,-4.1534410208336746e-5,-7.87561120850624e-9,-1.9077625422079947e-4,-4.1352743879738196e-5,-7.859295143438076e-9,-1.9073505303328413e-4,-4.123196142628293e-5,-7.848605195695082e-9,-1.9069054410135802e-4,-4.1173414159399545e-5,-7.843964753064974e-9,-1.906201224278099e-4,-4.116971136664543e-5,-7.844982280018888e-9,-1.905050256123524e-4,-4.1205978856558556e-5,-7.850625899117948e-9,-1.9033218543530693e-4,-4.126132493487268e-5,-7.859318656901609e-9,-1.9009597946679268e-4,-4.131052250053904e-5,-7.868951080561997e-9,-1.8980014139863044e-4,-4.1326260782891054e-5,-7.876912836277283e-9,-1.8945967012305145e-4,-4.128269700216912e-5,-7.880323549005257e-9,-1.8910169760086778e-4,-4.116102678475968e-5,-7.876614821307504e-9,-0.00018876338867391296,-4.0956863108143176e-5,-7.864445949430287e-9,-1.884847853602136e-4,-4.0687258733253435e-5,-7.844654109638144e-9,-1.8829616966925856e-4,-4.039278804799636e-5,-7.820672655457958e-9,-1.88203845813791e-4,-4.012954778719805e-5,-7.797856014628003e-9,-1.8818277508791647e-4,-3.995054240701812e-5,-7.781684520999545e-9,-1.881832875362198e-4,-3.988448188439229e-5,-7.77566376533795e-9,-1.8815018874959586e-4,-3.992443525486756e-5,-7.780096416824334e-9,-1.880434791354815e-4,-4.003285000490112e-5,-7.792321866458137e-9,-1.8784973035415947e-4,-4.015822215563545e-5,-7.808013539986401e-9,-1.8758115050261835e-4,-4.025292234742e-5,-7.822655543413694e-9,-1.872668184883031e-4,-4.02846843903453e-5,-7.832609350063291e-9,-1.869421745375567e-4,-4.024036343886389e-5,-7.835668960723405e-9,-1.866405011096358e-4,-4.012421563344865e-5,-7.831233109466725e-9,-1.8638746606769327e-4,-3.9953517066443375e-5,-7.820209997762073e-9,-1.8619833336478678e-4,-3.9753447846682424E-05,-7.804705559277455e-9,-1.8607713456172942e-4,-3.955211791223761e-5,-7.787528077260694e-9,-1.8601733956143633e-4,-3.937609305312275e-5,-7.771594675631029e-9,-1.8600372362801028e-4,-3.924671808006975e-5,-7.759377516311174e-9,-1.860151033940145e-4,-3.9177490549839045e-5,-7.752521038826082e-9,-1.86027579535179e-4,-3.917265795237302e-5,-7.751697825195558e-9,-1.8601784500762417e-4,-3.922712275877602e-5,-7.756683939980297e-9,-1.859660991240961e-4,-3.932748873083235e-5,-7.76655338904938e-9,-1.858583415306685e-4,-3.945386020008228e-5,-7.779863803220138e-9,-1.856880765199331e-4,-3.9582104032858643e-5,-7.794764745634513e-9,-1.8545751111847034e-4,-3.968648336286518e-5,-7.80905273811186e-9,-1.8517832726768282e-4,-3.974272194646584e-5,-7.820277095975539e-9,-1.8487191715710737e-4,-3.973182286832981e-5,-7.826043324454552e-9,-1.84568326062585e-4,-3.964498003485806e-5,-7.824607063924266e-9,-1.8430252736954805e-4,-3.948909619720772e-5,-7.81567723225054e-9,-1.841068015813026e-4,-3.9290916557531185e-5,-7.801120265142914e-9,-1.8399941650295114e-4,-3.9096168023688346e-5,-7.785080204503404e-9,-1.8397315757144196e-4,-3.8959732030985414e-5,-7.773061430941858e-9,-1.8399121969710352e-4,-3.892667494260442e-5,-7.769999153806498e-9,-1.8399720413110593e-4,-3.9012062532908605e-5,-7.778165646339316e-9,-1.8393709799280938e-4,-3.919247414624714e-5,-7.796192327999907e-9,-1.837809253347292e-4,-3.94159913142451e-5,-7.81983562463752e-9,-1.835314504140859e-4,-3.9624174692404916e-5,-7.843866044999501e-9,-1.832175926465497e-4,-3.9772376929694886e-5,-7.863852973816922e-9,-0.00018288007799367867,-3.983939802399363e-5,-7.877101234873762e-9,-1.825581525567214e-4,-3.9826609012344015e-5,-7.88278698428171e-9,-1.8228153953364634e-4,-3.975151493070294e-5,-7.881673076367993e-9,-1.8206747389102235e-4,-3.96403257759107e-5,-7.87567869457065e-9,-1.8192093438847728e-4,-3.952183195728649e-5,-7.867403264403688e-9,-1.818363144226791e-4,-3.94230088792691e-5,-7.859627774104685e-9,-1.8179960057993597e-4,-3.9365938879669173e-5,-7.854836651382487e-9,-1.817908037429815e-4,-3.9365650403408574e-5,-7.85483970570868e-9,-1.817866154295425e-4,-3.9428705477013426e-5,-7.860566324909944e-9,-1.81763290141203e-4,-3.955254076382139e-5,-7.872043997922005e-9,-1.8169966125836646e-4,-3.9725745338659054e-5,-7.888521312020506e-9,-1.8157997375724025e-4,-3.992943179925509e-5,-7.908654800013727e-9,-1.8139615201193202e-4,-4.01395859443014e-5,-7.930677800847704e-9,-1.8114926843234067e-4,-4.0330149429537525e-5,-7.952524911278175e-9,-1.808500494869329e-4,-4.047662276442048e-5,-7.971962158343955e-9,-1.8051827933978514e-4,-4.055992560857808e-5,-7.986810256067089e-9,-1.8018101316444614e-4,-4.0570277674346596e-5,-7.995336625795394e-9,-1.7986930754112723e-4,-4.0510916503467394e-5,-7.996822725172099e-9,-1.796128754203871e-4,-4.0400967753350356e-5,-7.992167447243349e-9,-1.7943243126465743e-4,-4.027577035424067e-5,-7.984224841668468e-9,-1.793308527151646e-4,-4.0182267013651894e-5,-7.97751603843064e-9,-1.7928650189256697e-4,-4.016762654034507e-5,-7.977085620844553e-9,-1.7925412028238575e-4,-4.026237728195528e-5,-7.986681974367066e-9,-1.791774416147169e-4,-4.046502137035069e-5,-8.007050548514257e-9,-1.79010578141659e-4,-4.07384889308924e-5,-8.03541534862946e-9,-1.7873692411944845e-4,-4.102346717380981e-5,-8.066621496285543e-9,-1.783741420058078e-4,-4.1261830836882335e-5,-8.095249938080533e-9,-1.7796361074475225e-4,-4.1416463164230464e-5,-8.117421582789139e-9,-1.7755290410782594e-4,-4.1478368578888085e-5,-8.131520449449486e-9,-1.7718135033389617e-4,-4.146198733197798e-5,-8.13797055610707e-9,-1.768730990346715e-4,-4.139529321745453e-5,-8.138602365296292e-9,-1.766365818208645e-4,-4.131042648440153e-5,-8.135996394797593e-9,-1.7646729539195152e-4,-4.123728457209718e-5,-8.132931548149722e-9,-1.7635140912427015e-4,-4.119998363428822e-5,-8.131940782911007e-9,-1.7626901592075078e-4,-4.1215139264067615e-5,-8.13497319552361e-9,-1.7619688175239353e-4,-4.129104627639256e-5,-8.143187102834443e-9,-1.7611095329391106e-4,-4.142731358893801e-5,-8.156888519239014e-9,-1.7598889716912629e-4,-4.1614887437690714e-5,-8.17558928584182e-9,-1.7581281192462515e-4,-4.183670829192403e-5,-8.198133122013413e-9,-1.7557194116890116e-4,-4.206939570725801e-5,-8.222846596370708e-9,-1.7526489185315834e-4,-4.2286145337228534e-5,-8.247693685378518e-9,-1.749007892130791e-4,-4.246067239676419e-5,-8.27045287578726e-9,-1.7449889291473196e-4,-4.257177890837406e-5,-8.288966601271894e-9,-1.7408636134491067e-4,-4.260785569445014e-5,-8.301502622549816e-9,-1.7369417612683185e-4,-4.257044116629862e-5,-8.307207425135431e-9,-1.733515749373912e-4,-4.247603925671317e-5,-8.306560538240727e-9,-1.7307951561946385e-4,-4.235546258407321e-5,-8.301660768772593e-9,-1.7288404300892215e-4,-4.224980670333177e-5,-8.296116391034056e-9,-1.7275126742316764e-4,-4.220232082429011e-5,-8.29435675977847e-9,-1.7264662508130276e-4,-4.2246603872407674e-5,-8.300377709365537e-9,-1.7252121501086634e-4,-4.239390927424923e-5,-8.316260399484159e-9,-1.723259194563172e-4,-4.262512746453453e-5,-8.341125038747223e-9,-1.7202921853819408e-4,-4.289359303196469e-5,-8.371205255110296e-9,-1.7163005621497463e-4,-4.314027956941037e-5,-8.401196120311941e-9,-1.7115808212438073e-4,-4.3314891182245837e-5,-8.426208336859534e-9,-1.706611339045414e-4,-4.3391899781138715e-5,-8.4432830383759e-9,-1.701876762651756e-4,-4.3374419715413495e-5,-8.4518562411058e-9,-1.6977323193821857e-4,-4.328714577136297e-5,-8.4533209117178e-9,-1.6943492968409378e-4,-4.316484300779904e-5,-8.450215049832509e-9,-1.691728141266524e-4,-4.304229490465962e-5,-8.445454567334958e-9,-1.689743734967421e-4,-4.294814563749508e-5,-8.441762371783732e-9,-1.6881942342299218e-4,-4.2902261156559144e-5,-8.441296223429344e-9,-1.6868404487941965e-4,-4.291519214458628e-5,-8.445444774098598e-9,-1.6854347563705814e-4,-4.2988495594045744e-5,-8.454766529152133e-9,-1.6837439851704656e-4,-4.3115257163194266e-5,-8.469036389597806e-9,-1.681571293442517e-4,-4.3280710287122344e-5,-8.487346444855007e-9,-1.6787800682957013e-4,-4.3463272785180736e-5,-8.508217625345404e-9,-1.675319055511752e-4,-4.363653952219832e-5,-8.529718093993882e-9,-1.6712433065999726e-4,-4.3772654109465174e-5,-8.549625270960761e-9,-1.6667221550076703e-4,-4.3847053130506195e-5,-8.565688893545171e-9,-1.6620251090174813e-4,-4.384394863589244e-5,-8.576022891083493e-9,-1.6574805161057994e-4,-4.3761243185843136e-5,-8.57958137502147e-9,-1.653410166729793e-4,-4.361321227414499e-5,-8.57659196538238e-9,-1.6500526069332353e-4,-4.3429595920686075e-5,-8.568780938240553e-9,-1.6474941938175833e-4,-4.325061380526027e-5,-8.559242374508827e-9,-1.6456278474184848e-4,-4.311845658282386e-5,-8.551872091484495e-9,-1.6441558827007797e-4,-4.306679435913246e-5,-8.55041163875152e-9,-1.6426459590353389e-4,-4.31107428021797e-5,-8.55731514316368e-9,-1.6406370565747632e-4,-4.324040567689213e-5,-8.572814975918328e-9,-1.6377738091422734e-4,-4.3421136814201817e-5,-8.594619277300757e-9,-1.6339259528422065e-4,-4.360218549923664e-5,-8.618509053213847e-9,-1.6292403742707357e-4,-4.3731933663244515e-5,-8.639692356752142e-9,-1.6240945516230828e-4,-4.3773994492029846e-5,-8.654343911008955e-9,-1.618968607756375e-4,-4.371721460881521e-5,-8.660647603934844e-9,-1.614295836691662e-4,-4.357579691594396e-5,-8.658990171403235e-9,-1.6103554540079272e-4,-4.338116258064244e-5,-8.65143750147207e-9,-1.6072371734170566e-4,-4.317072694826411e-5,-8.640899300411265e-9,-1.60486597377181e-4,-4.2978486922922624e-5,-8.630346264051817e-9,-1.6030553083480994e-4,-4.28295955015562e-5,-8.622255741822829e-9,-1.6015613527411944e-4,-4.2738546072660895e-5,-8.618310231123223e-9,-1.6001252941236853e-4,-4.270953342717434e-5,-8.619310983523769e-9,-1.5985023392522713e-4,-4.27376696865566e-5,-8.62524258194941e-9,-1.5964820616548375e-4,-4.281026269130828e-5,-8.635407427994393e-9,-1.5939063606626693e-4,-4.290797545834162e-5,-8.648555381100611e-9,-1.5906893911632526e-4,-4.300622619989431e-5,-8.662980381924239e-9,-1.586839320425307e-4,-4.307745905419132e-5,-8.6766176574788e-9,-1.5824763893893554e-4,-4.309485149551601e-5,-8.687224944489166e-9,-1.577836553301402e-4,-4.303761508032331e-5,-8.692728743322592e-9,-1.5732473003351639e-4,-4.2897150815443866e-5,-8.691735505534104e-9,-1.5690673041701025e-4,-4.2682099455994495e-5,-8.684069583127032e-9,-1.5655967783061677e-4,-4.241963218334136e-5,-8.671100768675983e-9,-1.5629842252569848e-4,-4.215106331379977e-5,-8.65564776892293e-9,-1.5611654367897435e-4,-4.1922027222526855e-5,-8.641393519477788e-9,-1.5598634365727104e-4,-4.1769990723229766e-5,-8.631943434242865e-9,-1.558655337576891e-4,-4.171332468953909e-5,-8.62980875112357e-9,-1.55708599326998e-4,-4.1745676230751626e-5,-8.635639653747643e-9,-1.5547926756793228e-4,-4.183738871643539e-5,-8.64796410233513e-9,-1.5516040876164026e-4,-4.194344529267842e-5,-8.663544317198107e-9,-1.5475857077794318e-4,-4.2015642345345564e-5,-8.678275332417251e-9,-1.5430178219828054e-4,-4.2015487508945786e-5,-8.688346657903147e-9,-1.538312653883322e-4,-4.1923888974596855e-5,-8.691272266061803e-9,-1.5338985144061818e-4,-4.174464729428951e-5,-8.686443715723425e-9,-1.5301108912570144e-4,-4.150107912857046e-5,-8.675074640975934e-9,-1.5271247020407983e-4,-4.1227745509928506e-5,-8.659650972450587e-9,-1.5249412865362623e-4,-4.096082102643691e-5,-8.643154944543995e-9,-1.5234202142190386e-4,-4.0730361657362306e-5,-8.628341074666747e-9,-1.522332666590427e-4,-4.0556036818412694e-5,-8.617240877586801e-9,-1.5214146355814283e-4,-4.044607832465574e-5,-8.610948820189256e-9,-1.5204082770238207e-4,-4.0398276306418136e-5,-8.609649713449356e-9,-1.5190894966737008e-4,-4.040182404940597e-5,-8.612791693953891e-9,-1.5172855998777816e-4,-4.04392073340307e-5,-8.619289651721801e-9,-1.5148890221367985e-4,-4.048788673301634e-5,-8.627671304566296e-9,-1.511871960678653e-4,-4.052207249406931e-5,-8.636154913727928e-9,-1.5083025434630082e-4,-4.051521495503619e-5,-8.642725787473477e-9,-1.5043574158394175e-4,-4.044383852156764e-5,-8.645327734018624e-9,-1.500319353466808e-4,-4.029297377626192e-5,-8.642261093560134e-9,-1.496544166579292e-4,-4.006242686937451e-5,-8.632759521112276e-9,-1.4933857066749907e-4,-3.9771500609913104e-5,-8.61753525645397e-9,-1.4910878327908136e-4,-3.9458613965874134e-5,-8.598961074703302e-9,-1.4896817540041468e-4,-3.9173255620837376e-5,-8.580634729706417e-9,-1.4889434793359147e-4,-3.896143953895252e-5,-8.566369717397555e-9,-1.488446779231985e-4,-3.885027635490195e-5,-8.558992598500318e-9,-1.4876971971684565e-4,-3.883878985692342e-5,-8.559461170923111e-9,-1.4862882605840358e-4,-3.889897430693147e-5,-8.566637964807312e-9,-1.484015496846831e-4,-3.8985699273179814e-5,-8.577719545041904e-9,-1.4809146958670756e-4,-3.9050500471712874e-5,-8.589075917670951e-9,-1.4772283139077166e-4,-3.90541832810773e-5,-8.597200861671296e-9,-1.4733252302452735e-4,-3.8975093804996464e-5,-8.599531021666814e-9,-1.46960319709348e-4,-3.8811988524448995e-5,-8.594969943036304e-9,-1.4663989849332713e-4,-3.8581911562734315e-5,-8.58402541962936e-9,-1.4639243737691714e-4,-3.831439622032589e-5,-8.568556760394407e-9,-1.4622381432699978e-4,-3.8043832331238845e-5,-8.551221326080342e-9,-1.4612546696149864e-4,-3.780203085357788e-5,-8.534793996272362e-9,-1.4607800835754142e-4,-3.761267871861787e-5,-8.521560570514165e-9,-1.46056126596556e-4,-3.748848840769632e-5,-8.512936995642796e-9,-1.4603336462438332e-4,-3.743087337648366e-5,-8.509368863912567e-9,-1.4598588657925202e-4,-3.743138625583485e-5,-8.510465027645555e-9,-1.4589496353338089e-4,-3.747399290628529e-5,-8.515247763091069e-9,-1.4574843347403674e-4,-3.753744263121957e-5,-8.522385868843517e-9,-1.4554162934537264e-4,-3.759745129656199e-5,-8.530332304446479e-9,-1.4527818133022795e-4,-3.7628889350479104e-5,-8.537375532161534e-9,-1.4497079464529807e-4,-3.76084521534279e-5,-8.541699439939246e-9,-1.446416124057033e-4,-3.751836753687077e-5,-8.541581339326527e-9,-1.4432111704455668e-4,-3.7351398285757994e-5,-8.535812444372269e-9,-1.4404404714688575e-4,-3.711638518574359e-5,-8.524282605408122e-9,-1.438412079624837e-4,-3.684187866182322e-5,-8.508477097627533e-9,-1.4372811461076546e-4,-3.657397293866363e-5,-8.491503673689153e-9,-1.436949746655447e-4,-3.636532952138359e-5,-8.477371791217123e-9,-1.437049148338037e-4,-3.625715011489158e-5,-8.469647157873269e-9,-1.4370460041685984e-4,-3.626225419817731e-5,-8.470096677118393e-9,-1.436435657655829e-4,-3.6359182629031623e-5,-8.478059693349249e-9,-1.4349217679652826e-4,-3.650097828056397e-5,-8.49083875172551e-9,-1.4324944734727836e-4,-3.663301747612782e-5,-8.50476357027434e-9,-1.4293924274250757e-4,-3.6710244446883646e-5,-8.516318183217591e-9,-1.42599606440927e-4,-3.670734481993864e-5,-8.522934387042323e-9,-1.4227107692698355e-4,-3.66208983276144e-5,-8.523380609554418e-9,-1.4198762087161575e-4,-3.646586091026803e-5,-8.517827359725516e-9,-1.4177127123896665e-4,-3.626931158012475e-5,-8.507668428407443e-9,-1.4163010445375599e-4,-3.606360234221836e-5,-8.495144285064709e-9,-1.4155881398565556e-4,-3.588006957388633e-5,-8.482821921176052e-9,-1.4154122929864088e-4,-3.574396664003745e-5,-8.473039059830415e-9,-1.4155410250967632e-4,-3.5671120527783085e-5,-8.467454781925923e-9,-1.4157137341078065e-4,-3.5666522461359366e-5,-8.46681890030178e-9,-1.4156819516112225e-4,-3.572468450852716e-5,-8.4709875707388e-9,-1.4152418460917606e-4,-3.58313730753767e-5,-8.47912807725831e-9,-1.4142558873947818e-4,-3.59661705458511e-5,-8.489992557926502e-9,-1.412664184643966e-4,-3.6105261696455e-5,-8.502137383045136e-9,-1.4104888166358994e-4,-3.6224110895191465e-5,-8.514032189748423e-9,-1.4078340386514088e-4,-3.630008132933925e-5,-8.524097794432883e-9,-1.4048831120426743e-4,-3.6315244359799485e-5,-8.530777751256682e-9,-1.4018893987105985e-4,-3.6259700669489686e-5,-8.532761075544734e-9,-1.399154045802046e-4,-3.613554770648095e-5,-8.529406358796928e-9,-1.396978493880879e-4,-3.5960758369385744e-5,-8.5212719609298e-9,-1.395584274220083e-4,-3.5770777754258144e-5,-8.510484614118273e-9,-1.395010799090941e-4,-3.5614419533547606e-5,-8.500584815712752e-9,-1.3950347955379841e-4,-3.554134224026499e-5,-8.495600252331792e-9,-1.395181326667312e-4,-3.5583057711782186e-5,-8.49852886633527e-9,-1.3948692048425989e-4,-3.573661667274257e-5,-8.509976577861838e-9,-1.3936409233349114e-4,-3.596248146847602e-5,-8.52783178092342e-9,-1.3913464178440764e-4,-3.6200002121230084e-5,-8.548219699136488e-9,-1.3881747770678196e-4,-3.6391341144876804e-5,-8.567072309384218e-9,-1.384540237025143e-4,-3.650005380239695e-5,-8.581375137160207e-9,-1.380914704582618e-4,-3.6517145395985524e-5,-8.589669620504838e-9,-1.3776939627770373e-4,-3.645667302158028e-5,-8.591982763540148e-9,-1.375129529417687e-4,-3.634680402050186e-5,-8.589508759325445e-9,-1.373315794560991e-4,-3.622095854655851e-5,-8.584220023840957e-9,-1.3722091216789167e-4,-3.61110737959683e-5,-8.578448656336925e-9,-1.3716598999432205e-4,-3.6043161150447865e-5,-8.574449379800085e-9,-1.37144819913883e-4,-3.6034601772228566e-5,-8.573995788120039e-9,-1.3713202193536196e-4,-3.60927847497726e-5,-8.578098184526851e-9,-1.3710237308793484e-4,-3.621495858814332e-5,-8.586914569799196e-9,-1.3703402980724396e-4,-3.6389181641333254e-5,-8.5998516774355e-9,-1.36911205202354e-4,-3.65962542961265e-5,-8.615789199981454e-9,-1.3672602214730465e-4,-3.68124573584491e-5,-8.633327431858329e-9,-1.36479349089764e-4,-3.701271677512592e-5,-8.650970819822634e-9,-1.3618068653054776e-4,-3.717379627140313e-5,-8.667222550115315e-9,-1.358472662707308e-4,-3.7277344343605105e-5,-8.680647089426607e-9,-1.3550242612119607e-4,-3.731274903926245e-5,-8.68999424871703e-9,-1.3517320152061808e-4,-3.727978006702851e-5,-8.694459140313209e-9,-1.3488680793789882e-4,-3.719092897384664e-5,-8.694073713436727e-9,-1.3466544021457864e-4,-3.707279073129639e-5,-8.69010051987593e-9,-1.3451925275556113e-4,-3.696481485133304e-5,-8.685177236944263e-9,-1.344388658671642e-4,-3.69131046298267e-5,-8.682934876706395e-9,-1.3439108416693466e-4,-3.695778715724225e-5,-8.68695839392729e-9,-1.3432331140892352e-4,-3.7116200157038535e-5,-8.699334814541392e-9,-1.3417981211901297e-4,-3.737010340084863e-5,-8.71951455375979e-9,-1.339246580951755e-4,-3.7667420214442775e-5,-8.744316749020727e-9,-1.3355816900488716e-4,-3.7941435370631326e-5,-8.769244026211392e-9,-1.3311593340372153e-4,-3.813725721253883e-5,-8.79029609068621e-9,-1.3265197371800877e-4,-3.8229929052285945e-5,-8.80518898519348e-9,-1.3221793913426716e-4,-3.822643977336777e-5,-8.813555366407018e-9,-1.318492290963614e-4,-3.8155740932226004e-5,-8.816480101901048e-9,-1.3156091565529496e-4,-3.8055615871408505e-5,-8.815891247203971e-9,-1.3135036452187486e-4,-3.796239043644523e-5,-8.814051427765528e-9,-1.31202438800492e-4,-3.7905049072083586e-5,-8.813160873514698e-9,-1.3109463784149872e-4,-3.79028210263575e-5,-8.81503385420893e-9,-1.3100122611687848e-4,-3.796469387651649e-5,-8.820852830416448e-9,-1.3089648863076503e-4,-3.80897908046812e-5,-8.83104051118581e-9,-1.3075748536931842e-4,-3.826825886682798e-5,-8.84527997381368e-9,-1.3056648321026467e-4,-3.848267424904795e-5,-8.862659526172724e-9,-1.3031305885508222e-4,-3.871009371470224e-5,-8.881878607082005e-9,-1.2999564462678402e-4,-3.8924886973358905e-5,-8.90144922639146e-9,-1.296221126551315e-4,-3.9102224081252054e-5,-8.919852317394064e-9,-1.292091137554164e-4,-3.9221787764163894e-5,-8.935653170963314e-9,-1.287801342980387e-4,-3.9271231345139034e-5,-8.947626178113364e-9,-1.2836237102655372e-4,-3.924893370147562e-5,-8.954946573809908e-9,-1.2798264289840097e-4,-3.916561004732102e-5,-8.957459750970044e-9,-1.2766262594780724e-4,-3.9044431207776e-5,-8.955969094344736e-9,-1.2741366297480022e-4,-3.891923161696911e-5,-8.952404162384802e-9,-1.2723168997357461e-4,-3.883000967390067e-5,-8.949679509496966e-9,-1.27093748029005e-4,-3.881487829910734e-5,-8.951097831921052e-9,-1.2695870357679422e-4,-3.8898685950468335e-5,-8.959323326278861e-9,-1.267751555869125e-4,-3.908106724078372e-5,-8.975233990146882e-9,-1.2649729890266872e-4,-3.933002315131596e-5,-8.997238422616873e-9,-1.2610380646318407e-4,-3.958793924368254e-5,-9.021623338742478e-9,-1.2560933231630603e-4,-3.979117636916569e-5,-9.043949542052622e-9,-1.250601064281325e-4,-3.989428803618717e-5,-9.060747657363913e-9,-1.2451535807132656e-4,-3.988519479442612e-5,-9.070550347589108e-9,-1.2402584828578883e-4,-3.978414776435241e-5,-9.073886011159246e-9,-1.236205981940215e-4,-3.963065544738354e-5,-9.07260038223968e-9,-1.2330492479386814e-4,-3.946804731107443e-5,-9.06907791995821e-9,-1.2306592379153069e-4,-3.9332584341514184e-5,-9.065663183276685e-9,-1.228800828847495e-4,-3.9248605036294036e-5,-9.064298093394783e-9,-1.2271974809462355e-4,-3.9227959023930204e-5,-9.066308761174449e-9,-1.2255751932836511e-4,-3.9271422800291845e-5,-9.07230522767062e-9,-1.2236902385258616e-4,-3.937056825807537e-5,-9.082190481665708e-9,-1.2213485314795255e-4,-3.950953825587356e-5,-9.0952670217167e-9,-1.2184219766310128e-4,-3.966680598205627e-5,-9.110401741288104e-9,-1.2148636162885278e-4,-3.981726696521993e-5,-9.12619905571748e-9,-1.2107197250418744e-4,-3.9935062083796264e-5,-9.141156188037495e-9,-1.2061333772280514e-4,-3.9997258003077964e-5,-9.153805898123638e-9,-1.2013331124746263e-4,-3.998800386203117e-5,-9.162873756252375e-9,-1.1966030668005657e-4,-3.990236796499482e-5,-9.167476141008514e-9,-1.1922355711720542e-4,-3.9748848224879454e-5,-9.16735668291749e-9,-1.1884727409519039e-4,-3.9549573910041856e-5,-9.163106709226148e-9,-1.1854484500946807e-4,-3.9337626281964046e-5,-9.156273357353645e-9,-1.1831435745928925e-4,-3.9151554868869843e-5,-9.149247534449742e-9,-1.1813661119487769e-4,-3.9027669333984225e-5,-9.144851147026704e-9,-1.1797667960421902e-4,-3.899110483450793e-5,-9.145628060950681e-9,-1.1778991790734548e-4,-3.904737063700308e-5,-9.15299150810211e-9,-1.175325624741728e-4,-3.9177091689939015e-5,-9.166537396277783e-9,-1.1717523308225653e-4,-3.933731131848976e-5,-9.183898816605155e-9,-1.1671489921126038e-4,-3.947171279421601e-5,-9.20137620436505e-9,-1.1617906373001206e-4,-3.952820645458404e-5,-9.215188158288917e-9,-1.1561807446250038e-4,-3.947694802803824e-5,-9.222771080593783e-9,-1.1508795403832579e-4,-3.931977427169145e-5,-9.223487247363517e-9,-1.1463218392673738e-4,-3.9086539305895255e-5,-9.21849929028679e-9,-1.142709592978943e-4,-3.8821745934336895e-5,-9.210076040428456e-9,-1.1400074179654687e-4,-3.856946273893001e-5,-9.20078618611514e-9,-1.1380094799943816e-4,-3.836294492571193e-5,-9.192886631995141e-9,-1.1364261812623197e-4,-3.822069459714716e-5,-9.1879765359956e-9,-1.1349551541127026e-4,-3.814719957123449e-5,-9.186871306246775e-9,-1.1333258761490281e-4,-3.8135736535814055e-5,-9.189633338269424e-9,-1.1313230069867286e-4,-3.817141008984336e-5,-9.195706259883106e-9,-1.1287982382393343e-4,-3.823369291997683e-5,-9.204097657482591e-9,-1.1256786310513337e-4,-3.829851605574717e-5,-9.213553802888529e-9,-1.1219751803139118e-4,-3.8340376762559447e-5,-9.22269414066259e-9,-1.1177904223869293e-4,-3.833503671167999e-5,-9.230116686601745e-9,-1.1133191698447232e-4,-3.826315103578705e-5,-9.234523255112086e-9,-1.1088335748373442e-4,-3.811461096830071e-5,-9.234910233392347e-9,-1.1046449079987319e-4,-3.789262697562118e-5,-9.230826308386785e-9,-1.1010413601670693e-4,-3.7615910350771354e-5,-9.222627139411862e-9,-1.0982130517158393e-4,-3.731722308065027e-5,-9.21160402770721e-9,-1.0961868889767661e-4,-3.703748088216355e-5,-9.199872312326249e-9,-1.0947969429209346e-4,-3.681630820680492e-5,-9.189976537874282e-9,-1.0937067838856088e-4,-3.668157414423921e-5,-9.184272074658242e-9,-1.0924829447019257e-4,-3.664109554625678e-5,-9.18424056176897e-9,-1.0907020550257687e-4,-3.667913877536005e-5,-9.189954915184103e-9,-1.0880642515705916e-4,-3.6759033088402764e-5,-9.199907267392656e-9,-1.0844824947981108e-4,-3.683171835853091e-5,-9.211326762762983e-9,-1.0801195079731945e-4,-3.684853152381634e-5,-9.220949393187014e-9,-1.0753533107081977e-4,-3.6774884340293415e-5,-9.225997564122934e-9,-1.0706735543311275e-4,-3.6600269285523224e-5,-9.22499909034669e-9,-1.0665405844386353e-4,-3.634060345263345e-5,-9.218128116932532e-9,-1.0632599695639417e-4,-3.6031911809698865e-5,-9.206981038369621e-9,-1.0609189824736788e-4,-3.5718319405997615e-5,-9.19395506438557e-9,-1.0593992002165717e-4,-3.543962353913638e-5,-9.181522987160879e-9,-1.0584432970216088e-4,-3.5222894444418944e-5,-9.171654265312317e-9,-1.0577377509585269e-4,-3.5079615353876484e-5,-9.165501882736301e-9,-1.0569811427307857e-4,-3.500714701067259e-5,-9.163352800650679e-9,-1.0559264518508524e-4,-3.499226206662488e-5,-9.164771801813917e-9,-1.0544004786505433e-4,-3.5014920510423576e-5,-9.16883982493074e-9,-1.0523095671395252e-4,-3.5051391464275926e-5,-9.174389778026609e-9,-1.0496405295401565e-4,-3.507665669286638e-5,-9.180172150801203e-9,-1.0464618835727268e-4,-3.506655725701059e-5,-9.184939032839345e-9,-1.0429252092118758e-4,-3.500030193581135e-5,-9.187495988674884e-9,-1.039261276946598e-4,-3.48637823947789e-5,-9.186800523449334e-9,-1.0357615793353864e-4,-3.46536541858101e-5,-9.182170455832e-9,-1.0327350441689744e-4,-3.4381246691956354e-5,-9.173580720955574e-9,-1.0304364939716516e-4,-3.4074253186413085e-5,-9.161923230549191e-9,-1.0289802766204464e-4,-3.3773697803369534e-5,-9.149039646343281e-9,-1.0282725778280255e-4,-3.3524929232600696e-5,-9.137394421723031e-9,-1.0280029662432293e-4,-3.336441855594974e-5,-9.129418606410994e-9,-1.0277162008556858e-4,-3.3307298589755e-5,-9.126750143428798e-9,-1.0269452672034878e-4,-3.334132380659976e-5,-9.129679824022376e-9,-1.0253530901109662e-4,-3.3430128766657056e-5,-9.137028969170211e-9,-1.0228281327026914e-4,-3.352418168582912e-5,-9.146483951023313e-9,-1.0195058478501845e-4,-3.357486167811767e-5,-9.155243273725392e-9,-1.0157200536431759e-4,-3.354696552794696e-5,-9.160762004820197e-9,-1.0119077576295845e-4,-3.3426523116505044e-5,-9.161389983981338e-9,-1.0084972538708518e-4,-3.322258471680729e-5,-9.1567428994038e-9,-1.0058085340582454e-4,-3.296319855077416e-5,-9.1477233287177e-9,-1.0039895151362752e-4,-3.268715204906611e-5,-9.13620386476633e-9,-1.0030009479870362e-4,-3.243403248359135e-5,-9.124482475916777e-9,-1.0026481761500761e-4,-3.2235448634192776e-5,-9.114685797381227e-9,-1.002643617789796e-4,-3.210959204158094e-5,-9.108299298278605e-9,-1.0026767382911762e-4,-3.205986487873324e-5,-9.105941746310106e-9,-1.0024717983614368e-4,-3.207681406252085e-5,-9.107401083971613e-9,-1.0018239318013028e-4,-3.214184576455504e-5,-9.111860642617299e-9,-1.0006142614792553e-4,-3.223125875718116e-5,-9.118191582072067e-9,-9.988108258667136e-5,-3.2319691729833556e-5,-9.1251948611398e-9,-9.964632646321523e-5,-3.238278403756544e-5,-9.131729422340635e-9,-9.936964829441685e-5,-3.239938756272473e-5,-9.136742201877834e-9,-9.907040628933112e-5,-3.2353857807257145e-5,-9.139278262243717e-9,-9.877374852922494e-5,-3.22388541842853e-5,-9.138569270716463e-9,-9.850827687016545e-5,-3.2058685656720396e-5,-9.13425646517205e-9,-9.830143939364078e-5,-3.1832365719454527e-5,-9.126703455871307e-9,-9.817223068137955e-5,-3.159432274657247e-5,-9.117234559865558e-9,-9.812252419680496e-5,-3.138997708142053e-5,-9.108071823699427e-9,-9.813089016549055e-5,-3.126452109365012e-5,-9.10182146027846e-9,-9.815412222958905e-5,-3.124710157480261e-5,-9.100604093125194e-9,-9.813914491830552e-5,-3.1337456387429606e-5,-9.105211374499513e-9,-9.804153498796248e-5,-3.150322611607172e-5,-9.11475449547984e-9,-9.784154686536156e-5,-3.1690737195221436e-5,-9.127000792101932e-9,-9.754967528636868e-5,-3.1843765894223964e-5,-9.139172281973027e-9,-9.720055366819144e-5,-3.192085559051927e-5,-9.148776150107598e-9,-9.684015327249356e-5,-3.1904655488520306e-5,-9.154172659673398e-9,-9.651257696551535e-5,-3.180236177111936e-5,-9.154822358487452e-9,-9.62504127431069e-5,-3.163996841124646e-5,-9.151274976782774e-9,-9.60698168291565e-5,-3.145374077091899e-5,-9.144961054288212e-9,-9.596984265486474e-5,-3.128151423757891e-5,-9.137828523893096e-9,-9.593497386265119e-5,-3.115537334164327e-5,-9.131885483864583e-9,-9.593976606922285e-5,-3.109656681303233e-5,-9.128751308860314e-9,-9.595447136657913e-5,-3.111310201829616e-5,-9.129337933414458e-9,-9.595049936624177e-5,-3.119999178987712e-5,-9.133745810921736e-9,-9.590477548725535e-5,-3.134160856925637e-5,-9.141380171958168e-9,-9.580246226255177e-5,-3.151529116825042e-5,-9.151211708597388e-9,-9.563797539391283e-5,-3.16952830703858e-5,-9.162060481302314e-9,-9.541467373049275e-5,-3.185625961327806e-5,-9.172796825714589e-9,-9.514380915860319e-5,-3.197615493895167e-5,-9.182419310694514e-9,-9.48431552537596e-5,-3.2038443093745316e-5,-9.190051974883061e-9,-9.453543133902659e-5,-3.2034182987011704e-5,-9.194952520053085e-9,-9.424633486772374e-5,-3.1964113362905855e-5,-9.19662086089252e-9,-9.400158823504068e-5,-3.18408340759899e-5,-9.195038235111904e-9,-9.382220633420554e-5,-3.169033305608827e-5,-9.19095818861579e-9,-9.371778135278529e-5,-3.155104568024974e-5,-9.186065400464665e-9,-9.367914980804929e-5,-3.1468046822899884e-5,-9.182785199579648e-9,-9.367412170350315e-5,-3.1480918711509026e-5,-9.183626205872267e-9,-9.365156347345576e-5,-3.160755715402989e-5,-9.19020294586336e-9,-9.355668865963729e-5,-3.183175941432533e-5,-9.202419571888166e-9,-9.335267713728581e-5,-3.210430056471749e-5,-9.218371347956345e-9,-9.303667906521569e-5,-3.236020861117679e-5,-9.235103819495216e-9,-9.264032211325917e-5,-3.2543385860012626e-5,-9.249755228307922e-9,-9.221548591093086e-5,-3.262483810785695e-5,-9.26041652356236e-9,-9.181507378196565e-5,-3.260698117914955e-5,-9.266413523353581e-9,-9.147845491400025e-5,-3.251632942914815e-5,-9.268166415699002e-9,-9.122520847559706e-5,-3.239154168921172e-5,-9.266889513425695e-9,-9.105564635912965e-5,-3.227244723700269e-5,-9.2642646836748e-9,-9.095498913811478e-5,-3.219240887699171e-5,-9.262101784399266e-9,-9.08987318910297e-5,-3.217406213098664e-5,-9.261994204243429e-9,-9.085793054099272e-5,-3.222762121230062e-5,-9.265019829464496e-9,-9.080392835417925e-5,-3.2351052738033134e-5,-9.271567916967034e-9,-9.071228168806134e-5,-3.253168391369461e-5,-9.28134185774094e-9,-9.056569168800201e-5,-3.2748874236925676e-5,-9.293522462109239e-9,-9.035578936575062e-5,-3.297739074658915e-5,-9.307015941925984e-9,-9.008365802729651e-5,-3.319108369388331e-5,-9.32068773621464e-9,-8.975916266917992e-5,-3.336636099032471e-5,-9.33350717957054e-9,-8.939940883763627e-5,-3.348509546284864e-5,-9.344592008056796e-9,-8.902663953210632e-5,-3.353691102753202e-5,-9.353211946825554e-9,-8.866569313938621e-5,-3.352090126483869e-5,-9.35883336145802e-9,-8.834103551839693e-5,-3.3446806313605515e-5,-9.361261938630803e-9,-8.807317448099914e-5,-3.333560303798455e-5,-9.360872293875294e-9,-8.787408489854848e-5,-3.321895898344246e-5,-9.35881896249169e-9,-8.774178162211213e-5,-3.313618048205553e-5,-9.357051719661311e-9,-8.765551941425548e-5,-3.312704407820512e-5,-9.357971217288903e-9,-8.75747733839315e-5,-3.3219976944643985e-5,-9.363691049098633e-9,-8.74461410016907e-5,-3.341812218722618e-5,-9.375114762347986e-9,-8.7220065678816e-5,-3.3690479945789706e-5,-9.391311854138805e-9,-8.687212463896635e-5,-3.397702246395055e-5,-9.409699673510456e-9,-8.641654285989432e-5,-3.420979174434094e-5,-9.427069578077248e-9,-8.590181922728967e-5,-3.433967242416912e-5,-9.440848661633535e-9,-8.539061620032401e-5,-3.435314501297649e-5,-9.44984340985916e-9,-8.493672097339013e-5,-3.4271269582614564e-5,-9.454233252297501e-9,-8.45709727893319e-5,-3.413584988272384e-5,-9.45513539359531e-9,-8.429907159057472e-5,-3.399315338192215e-5,-9.454135610822126e-9,-8.410710066635141e-5,-3.388222278476255e-5,-9.452932691116559e-9,-8.39694300761685e-5,-3.382927951155617e-5,-9.453065287658341e-9,-8.385576288840835e-5,-3.384661045247159e-5,-9.455682021020762e-9,-8.373632656338405e-5,-3.39337961074905e-5,-9.461372860972362e-9,-8.358545827544782e-5,-3.407987563331084e-5,-9.470111676055729e-9,-8.338408132706894e-5,-3.426590539557689e-5,-9.481331913003121e-9,-8.312136430352067e-5,-3.446778153328366e-5,-9.494105686910258e-9,-8.279564587432089e-5,-3.465932720987703e-5,-9.507355644814983e-9,-8.241450667287213e-5,-3.481564090403858e-5,-9.520030613693909e-9,-8.19937854235765e-5,-3.491646452503521e-5,-9.531207314372736e-9,-8.155553782746594e-5,-3.494912799250977e-5,-9.540129776878508e-9,-8.112514759519504e-5,-3.491073158250606e-5,-9.546243568285508e-9,-8.072780222779476e-5,-3.480934834136822e-5,-9.549283156140592e-9,-8.038456389393579e-5,-3.466401475530754e-5,-9.549426224657887e-9,-8.010831362600719e-5,-3.450333338545574e-5,-9.54746360191402e-9,-7.989980971585162e-5,-3.4362440274271346e-5,-9.544875278633311e-9,-7.974437782718713e-5,-3.427773727254322e-5,-9.543676237437192e-9,-7.961061805952735e-5,-3.427884237468908e-5,-9.545950110564333e-9,-7.945341861300056e-5,-3.437837958684637e-5,-9.553132576768602e-9,-7.922353858236074e-5,-3.456254513569184e-5,-9.56529984876067e-9,-7.888371631202135e-5,-3.478810345141471e-5,-9.580865713138687e-9,-7.842594949679023e-5,-3.499174125974583e-5,-9.597013547859506e-9,-7.787972052612896e-5,-3.5111823238104886e-5,-9.61077091176288e-9,-7.730339317992335e-5,-3.5112654366270275e-5,-9.620133730535203e-9,-7.676190727235558e-5,-3.4997103078953485e-5,-9.624598331243174e-9,-7.630368913524509e-5,-3.480106932702219e-5,-9.62496228087358e-9,-7.594864786183333e-5,-3.457584341541249e-5,-9.622755990773589e-9,-7.568955618661085e-5,-3.4369955647098174e-5,-9.619710536672963e-9,-7.550120699012476e-5,-3.4218070735318946e-5,-9.617407235355379e-9,-7.53506844299028e-5,-3.4137703834965904e-5,-9.617061902570326e-9,-7.520512620818642e-5,-3.4130887726558557e-5,-9.619389347609227e-9,-7.503635353608889e-5,-3.4187713250424024e-5,-9.624544759331411e-9,-7.482323554456231e-5,-3.4289930549698735e-5,-9.63216195796353e-9,-7.455284746952063e-5,-3.441408243113663e-5,-9.641484197830746e-9,-7.422104933606681e-5,-3.4534311144901265e-5,-9.651545196785234e-9,-7.383266982034839e-5,-3.4625139821498456e-5,-9.661340808730684e-9,-7.340115252227199e-5,-3.466447763315732e-5,-9.669951148188559e-9,-7.29472860281118e-5,-3.4636811794840895e-5,-9.676610258024069e-9,-7.249670181575391e-5,-3.453612755069931e-5,-9.680751536488109e-9,-7.207617225320659e-5,-3.436789907206864e-5,-9.682071150846721e-9,-7.170907254595313e-5,-3.414954611457939e-5,-9.680633872207702e-9,-7.141062395474628e-5,-3.39088790257861e-5,-9.676997430229804e-9,-7.118375946617258e-5,-3.3680346460547944e-5,-9.672282908069223e-9,-7.101650731517465e-5,-3.349931488623629e-5,-9.668098481187566e-9,-7.088172523947388e-5,-3.33948756399492e-5,-9.666247026220778e-9,-7.074007291564022e-5,-3.3381977619494795e-5,-9.668224096412342e-9,-7.054706001923604e-5,-3.345448175111133e-5,-9.674640120668145e-9,-7.026421186175586e-5,-3.358188659485631e-5,-9.68481262676929e-9,-6.987236648803186e-5,-3.371310919852034e-5,-9.69679586348801e-9,-6.938216497629712e-5,-3.3789366876241454e-5,-9.707962916374584e-9,-6.883511643281062e-5,-3.376368965928737e-5,-9.715940864866819e-9,-6.829161852117123e-5,-3.3618736578177726e-5,-9.719434092883315e-9,-6.781005922500603e-5,-3.337302815858778e-5,-9.718519685799377e-9,-6.742756648217968e-5,-3.307197650765509e-5,-9.714369050431293e-9,-6.715167109481134e-5,-3.276964162612763e-5,-9.70868572509175e-9,-6.696431540140377e-5,-3.251149483555875e-5,-9.703181489926008e-9,-6.683272014943683e-5,-3.23249804831107e-5,-9.699229967536756e-9,-6.672046595425307e-5,-3.221830593712131e-5,-9.69768646622021e-9,-6.659514882482948e-5,-3.218413792480631e-5,-9.69883261424372e-9,-6.643222102070501e-5,-3.2204715407059465e-5,-9.702422223220024e-9,-6.621623206383647e-5,-3.225639014403438e-5,-9.707811412099236e-9,-6.594084229704343e-5,-3.231307689206832e-5,-9.714134303646899e-9,-6.560847130759857e-5,-3.234892257240772e-5,-9.720473000120565e-9,-6.522984548096849e-5,-3.2340745725612146e-5,-9.725978398839142e-9,-6.482324202400488e-5,-3.227068092840828e-5,-9.72993539962299e-9,-6.441292964570893e-5,-3.212909927557402e-5,-9.731798587080863e-9,-6.402628163536215e-5,-3.1917364877182857e-5,-9.731239839313383e-9,-6.368937200887575e-5,-3.164953586182567e-5,-9.728232443086724e-9,-6.342148728367543e-5,-3.135192586641782e-5,-9.723155862069091e-9,-6.3229704409613e-5,-3.105968506127635e-5,-9.716864968224381e-9,-6.310518395759158e-5,-3.081035792541784e-5,-9.710646408580894e-9,-6.302274843342547e-5,-3.0635492967811876e-5,-9.706009068758345e-9,-6.294459210654977e-5,-3.055226083848084e-5,-9.704313675315504e-9,-6.282790628516361e-5,-3.0557342633427204e-5,-9.706329094269245e-9,-6.263513206345579e-5,-3.062513212686725e-5,-9.711875217337033e-9]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json new file mode 100644 index 0000000..76c3a68 --- /dev/null +++ b/public/assets/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json @@ -0,0 +1 @@ +{"version":"1.0","updated":"2008 Dec 02 20:00:00 UTC","interpolationOrder":9,"xysAlgorithm":"SOFA_DEL_PSI_EPS","sampleZeroJulianEphemerisDate":2442396.5,"stepSizeDays":1,"startIndex":9000,"numberOfSamples":1000,"samples":[-6.23446137633139e-5,-3.071164556992463e-5,-9.719731332151204e-9,-6.19586809157847e-5,-3.076438157665265e-5,-9.727914890125598e-9,-6.150587794551883e-5,-3.073654937098242e-5,-9.734280833128142e-9,-6.1034943329782044e-5,-3.060168191808949e-5,-9.737216476929997e-9,-6.0601038606681665e-5,-3.036287029042388e-5,-9.736134809126074e-9,-6.024888746053323e-5,-3.0051869736974383e-5,-9.731565682588457e-9,-5.999994090928063e-5,-2.971789522758825e-5,-9.724862066857019e-9,-5.9848834314815545e-5,-2.9411354882677176e-5,-9.71770907732456e-9,-5.976923198886019e-5,-2.916989718887004e-5,-9.711648469978378e-9,-5.972462316432335e-5,-2.9011586735457638e-5,-9.707751149758674e-9,-5.967870819510338e-5,-2.8935387308633597e-5,-9.70647628370283e-9,-5.9602228253192676e-5,-2.89259970676844e-5,-9.707695687073557e-9,-5.947591112549622e-5,-2.8959747148304846e-5,-9.710838540242717e-9,-5.929077173354268e-5,-2.9009608654381066e-5,-9.715094525623705e-9,-5.904719567985657e-5,-2.9048773862964067e-5,-9.71960852884578e-9,-5.8753773367436014e-5,-2.9053136374370507e-5,-9.72361187781754e-9,-5.842624685184096e-5,-2.9003338061866847e-5,-9.726475623750488e-9,-5.8086360356536405e-5,-2.8886966009567993e-5,-9.727714468149827e-9,-5.776002754298137e-5,-2.870105742876016e-5,-9.726995392498005e-9,-5.74741651198525e-5,-2.845449366073143e-5,-9.72419549652686e-9,-5.725183467800746e-5,-2.8169256139263426e-5,-9.71951151762819e-9,-5.7106100541113594e-5,-2.7879041181757347e-5,-9.713564114276547e-9,-5.7034227249689176e-5,-2.7623923778951554e-5,-9.707405962417725e-9,-5.7014849044397024e-5,-2.744114170465607e-5,-9.702361282140308e-9,-5.701050918052841e-5,-2.735425399096375e-5,-9.699698830847758e-9,-5.697609718243167e-5,-2.7364576162975244e-5,-9.700232368303819e-9,-5.6871038817050416e-5,-2.7448633497066595e-5,-9.704002376450864e-9,-5.667116781282969e-5,-2.7563221973356075e-5,-9.710182005555758e-9,-5.637617678776307e-5,-2.765667320675218e-5,-9.717264987992663e-9,-5.601027591624169e-5,-2.7682736375781414e-5,-9.723480590272698e-9,-5.561600483675091e-5,-2.7612936285683867e-5,-9.727297528384073e-9,-5.524303937361784e-5,-2.7443956618506687e-5,-9.727850312943274e-9,-5.493513840003189e-5,-2.7197955922928915e-5,-9.725154651913568e-9,-5.471906725691787e-5,-2.6915691607899557e-5,-9.72005407261872e-9,-5.4598911019501836e-5,-2.6644703453075705e-5,-9.713934027115233e-9,-5.455730383150816e-5,-2.64266189741069e-5,-9.708311206523093e-9,-5.4562420129529145e-5,-2.6287768574123053e-5,-9.704433569738843e-9,-5.457752704343605e-5,-2.623553492658023e-5,-9.703008653848694e-9,-5.456957532646678e-5,-2.6260220049275858e-5,-9.704121931504624e-9,-5.451464446828428e-5,-2.6340246599419492e-5,-9.707335422027123e-9,-5.439995050230707e-5,-2.6448131932234545e-5,-9.711898924726039e-9,-5.422339633670513e-5,-2.6555532499365036e-5,-9.716981565914689e-9,-5.399194066121386e-5,-2.663678226094542e-5,-9.721842938139277e-9,-5.37197431734721e-5,-2.667116151947731e-5,-9.725902670942154e-9,-5.342650643560834e-5,-2.6644534881516494e-5,-9.728727486336505e-9,-5.313587618209729e-5,-2.655097739679037e-5,-9.729995225631237e-9,-5.287334596399925e-5,-2.639462790136861e-5,-9.72950469114869e-9,-5.266297173036476e-5,-2.619143036945524e-5,-9.727266597271218e-9,-5.252243553464907e-5,-2.596971389861331e-5,-9.723645863256587e-9,-5.245681707745194e-5,-2.5767877042401753e-5,-9.719459836489783e-9,-5.245295661436816e-5,-2.562748717562385e-5,-9.715914975816248e-9,-5.247784135201871e-5,-2.558182145120203e-5,-9.714321344765071e-9,-5.248433005910525e-5,-2.5643167778965002e-5,-9.71565414605581e-9,-5.242443255043768e-5,-2.5794981125069657e-5,-9.720157774265109e-9,-5.2265507859568556e-5,-2.599424952537427e-5,-9.727205074415084e-9,-5.200192042456586e-5,-2.6184413784918434e-5,-9.735490249337039e-9,-5.165673914621095e-5,-2.6313264574752945e-5,-9.743443035999223e-9,-5.127351919687404e-5,-2.6348054742647138e-5,-9.749667801257827e-9,-5.0902725125982576e-5,-2.6282713166082426e-5,-9.75326720347049e-9,-5.0588284184408174e-5,-2.6136491038281e-5,-9.754009356253531e-9,-5.0357993370069754e-5,-2.5946393683606597e-5,-9.752342082004198e-9,-5.0219232993974796e-5,-2.5756667981670227e-5,-9.749262933352734e-9,-5.015982106504244e-5,-2.5608303159542794e-5,-9.746061951023208e-9,-5.0152906269271166e-5,-2.5530759317958693e-5,-9.743991748123502e-9,-5.016424167598713e-5,-2.5537314473559887e-5,-9.743957229389409e-9,-5.015987799753719e-5,-2.5624510658344092e-5,-9.746324283706057e-9,-5.011244865581866e-5,-2.5775123374663638e-5,-9.750904754883811e-9,-5.000492623338741e-5,-2.596321755352963e-5,-9.757101352467545e-9,-4.9831698223674514e-5,-2.6159651038122543e-5,-9.764134932390347e-9,-4.959756293540752e-5,-2.6336794409959954e-5,-9.77125471218565e-9,-4.9315586018946434e-5,-2.6471880876366733e-5,-9.777857341227311e-9,-4.900467765247903e-5,-2.6549048296052148e-5,-9.78350042703132e-9,-4.868733505302663e-5,-2.6560573645593127e-5,-9.787854781108205e-9,-4.8387507995782974e-5,-2.6507830841147043e-5,-9.790671063781774e-9,-4.812820015775109e-5,-2.640221991296037e-5,-9.791823659827242e-9,-4.792822925558667e-5,-2.626586053182433e-5,-9.791440657019166e-9,-4.7797688235235664e-5,-2.6131146731513124e-5,-9.790058210807481e-9,-4.7732434736905576e-5,-2.603750245204811e-5,-9.788680030956192e-9,-4.770949127982192e-5,-2.602362103765612e-5,-9.788622629016349e-9,-4.768699088683465e-5,-2.6115132800391774e-5,-9.791115783371455e-9,-4.7612514838547504e-5,-2.6311416798164514e-5,-9.796791594098938e-9,-4.744004786748611e-5,-2.6579162837951064e-5,-9.805340798551625e-9,-4.714894275327642e-5,-2.68596183979786e-5,-9.81558384504337e-9,-4.675409408145582e-5,-2.7088789244523173e-5,-9.82593563524379e-9,-4.63007016373858e-5,-2.7220538865820394e-5,-9.834966162719081e-9,-4.584698755933853e-5,-2.7240537539346205e-5,-9.841756608580806e-9,-4.544489497457328e-5,-2.716612358051693e-5,-9.845989371386469e-9,-4.512720869220526e-5,-2.7035870592725035e-5,-9.847894204339548e-9,-4.490350340869352e-5,-2.6895966227287968e-5,-9.848150476851382e-9,-4.4762813526265216e-5,-2.6788619054627426e-5,-9.847749002642056e-9,-4.467974944751262e-5,-2.6744535726717833e-5,-9.847788854326644e-9,-4.4621551529998665e-5,-2.67793858092927e-5,-9.849227199555758e-9,-4.4554711427458415e-5,-2.6893402551401513e-5,-9.852654250504786e-9,-4.445048423814215e-5,-2.7073346152810357e-5,-9.858177344922723e-9,-4.428881976659844e-5,-2.7296183901073322e-5,-9.865455416384905e-9,-4.406041691263042e-5,-2.753370714423536e-5,-9.873857188997167e-9,-4.376691930956634e-5,-2.7757247847319554e-5,-9.882664459772306e-9,-4.3419538053046194e-5,-2.7941805347373132e-5,-9.891234414250543e-9,-4.303660454191013e-5,-2.8069095603610774e-5,-9.899069051818642e-9,-4.264069174434751e-5,-2.8129368229640377e-5,-9.90579879900749e-9,-4.2255769073996823e-5,-2.8122238695490774e-5,-9.911139409555858e-9,-4.1904486407320275e-5,-2.8056896725693683e-5,-9.914892497705433e-9,-4.160543814119917e-5,-2.7951878164291356e-5,-9.9170275201943e-9,-4.137010911506443e-5,-2.783431847991674e-5,-9.917825281106567e-9,-4.119921521788755e-5,-2.7738086497587085e-5,-9.917998408072091e-9,-4.107878264055179e-5,-2.769954625238172e-5,-9.91867215364473e-9,-4.097763615938715e-5,-2.7749689768273665e-5,-9.921139370467895e-9,-4.0849404904229084e-5,-2.7902797854934692e-5,-9.926407792259145e-9,-4.0642441010064514e-5,-2.8145057541786642e-5,-9.934713814169385e-9,-4.031787237599612e-5,-2.8430538779043658e-5,-9.945298702787681e-9,-3.9868810330146976e-5,-2.8691908882654146e-5,-9.9566665170196e-9,-3.932833565054289e-5,-2.8864961803409028e-5,-9.967212572062042e-9,-3.875854394725441e-5,-2.891437192128338e-5,-9.975808367109482e-9,-3.822616913640833e-5,-2.8845330760606945e-5,-9.98201180056612e-9,-3.777943806979286e-5,-2.869613572190929e-5,-9.98594693625295e-9,-3.743725664498184e-5,-2.8519754654329504e-5,-9.98810862349428e-9,-3.719134397363045e-5,-2.8366020937962917e-5,-9.989234069973608e-9,-3.701525587842487e-5,-2.8270836040562245e-5,-9.99020103086058e-9,-3.6874340673262915e-5,-2.8252557552493445E-05,-9.991881928374356e-9,-3.6733633947777075e-5,-2.831302992680173e-5,-9.994958846882884e-9,-3.656313374093195e-5,-2.844073037686516e-5,-9.999766501751608e-9,-3.634100881655143e-5,-2.8614561011922926e-5,-1.000623541918002e-8,-3.605533964519792e-5,-2.8807801587885512e-5,-1.0013957531492734e-8,-3.570465334841229e-5,-2.8992079074828512e-5,-1.0022338457116705e-8,-3.529734816247884e-5,-2.914116709250595e-5,-1.0030762046344616e-8,-3.485006993645185e-5,-2.92343805861204e-5,-1.0038702615702036e-8,-3.4385142229079815e-5,-2.9259238226273796e-5,-1.0045757091094494e-8,-3.3927359255493513e-5,-2.9213049460563632e-5,-1.0051621058011619e-8,-3.350058407226353e-5,-2.9103332940466208e-5,-1.0056066702504657e-8,-3.3124457063630464e-5,-2.8947189972084985e-5,-1.0058976990550987e-8,-3.2811366323358286e-5,-2.8769735723801098e-5,-1.0060445345746964e-8,-3.256375787328263e-5,-2.8601623226662544e-5,-1.0060897143616392e-8,-3.2371816097269846e-5,-2.8475488693954947e-5,-1.0061145174295647e-8,-3.221189052935458e-5,-2.842075314931494e-5,-1.0062287880142022e-8,-3.204694100578321e-5,-2.8456309260332803e-5,-1.0065415316236122e-8,-3.183109485034811e-5,-2.8581804503757855e-5,-1.007118993199182e-8,-3.152026648812525e-5,-2.877048997646703e-5,-1.0079484318373714e-8,-3.108835216793204e-5,-2.8969238348406404e-5,-1.0089312218910324e-8,-3.0542974461299724e-5,-2.911131486583659e-5,-1.0099182540644034e-8,-2.992994780628945e-5,-2.9140766616140142e-5,-1.0107715115987456e-8,-2.9319253695152042e-5,-2.9036541761832005e-5,-1.0114124886146775e-8,-2.877809393386789e-5,-2.8820960229194144e-5,-1.0118307228329601e-8,-2.8346852894650365e-5,-2.8547443251060635e-5,-1.0120625267983092e-8,-2.803055359693186e-5,-2.8277133796314353e-5,-1.0121677071264258e-8,-2.7805852942645365e-5,-2.8058810315545394e-5,-1.0122171969069935e-8,-2.7634885870697304e-5,-2.7919586021142028e-5,-1.0122851241518537e-8,-2.7477784344898564e-5,-2.7865136011979794e-5,-1.0124374041290903e-8,-2.73005681768325e-5,-2.788470342701019e-5,-1.0127178785398857e-8,-2.707876938176712e-5,-2.7957027015369363e-5,-1.0131386580299943e-8,-2.6798428484780897e-5,-2.8055381987984983e-5,-1.0136799525049531e-8,-2.6455880523470634e-5,-2.8151496961065997e-5,-1.0142993650083491e-8,-2.6056989964450905e-5,-2.8218751221123247e-5,-1.0149458252670142e-8,-2.5615936366383297e-5,-2.82350089513246e-5,-1.0155717100330529e-8,-2.5153423477268736e-5,-2.8185218808561722e-5,-1.0161389371918144e-8,-2.469410784372093e-5,-2.80636100261117e-5,-1.0166188348621973e-8,-2.426321414819864e-5,-2.787501653366006e-5,-1.0169893731105325e-8,-2.3882668480529245e-5,-2.763487038497263e-5,-1.01723489245492e-8,-2.3567286234310905e-5,-2.7367666919278267e-5,-1.017351616196784e-8,-2.332156842397692e-5,-2.7103905438103306e-5,-1.017357593949472e-8,-2.3137641969046203e-5,-2.6875705732266855e-5,-1.0173013410180529e-8,-2.299476051584912e-5,-2.6711500845227497E-05,-1.017261329344951e-8,-2.2860705750699917e-5,-2.663018704620786e-5,-1.0173308322342749e-8,-2.2695665047880168e-5,-2.663518611623227e-5,-1.017589092482202e-8,-2.2459337873909423e-5,-2.6709603552242226e-5,-1.0180685150351775e-8,-2.212140867809451e-5,-2.6814846177850375e-5,-1.0187337375833014e-8,-2.1673671732367735e-5,-2.6895869468464378e-5,-1.0194873028803975e-8,-2.1139047774474032e-5,-2.68952440266726e-5,-1.0202044877588625e-8,-2.0570501852735378e-5,-2.6773653165214853e-5,-1.0207808391111026e-8,-2.0035779945461135e-5,-2.6527596262472074e-5,-1.0211650200164242e-8,-1.95929968856085e-5,-2.6192859779762135e-5,-1.0213616507492086e-8,-1.9270119523824262e-5,-2.5830075681245798e-5,-1.021413380368983e-8,-1.905933904298975e-5,-2.5500927912146165e-5,-1.021381348729072e-8,-1.892657043021345e-5,-2.5248592103061754e-5,-1.0213321886218076e-8,-1.8827443033921196e-5,-2.5090146839981592e-5,-1.0213277816654462e-8,-1.8720869387209668e-5,-2.5019585350191788e-5,-1.0214142627298827e-8,-1.8576464284264876e-5,-2.5015668692887527e-5,-1.0216127260583814e-8,-1.8376611843414558e-5,-2.504980617624261e-5,-1.0219166169699748e-8,-1.8115567499788158e-5,-2.5091878000311348e-5,-1.022297593256864e-8,-1.77975879404375e-5,-2.511396168920078e-5,-1.0227169183059294e-8,-1.743505293856026e-5,-2.5092754555130803e-5,-1.0231368833090536e-8,-1.7046707371919865e-5,-2.5011456803880348e-5,-1.0235274298180084e-8,-1.6655740859370975e-5,-2.4861532084328557e-5,-1.023866489114029e-8,-1.6287282974612118e-5,-2.464432330060455e-5,-1.0241365206381334e-8,-1.596501252310151e-5,-2.4372025169081737e-5,-1.024321801882643e-8,-1.570702113141324e-5,-2.406725812436014e-5,-1.0244103967347291e-8,-1.552160951313559e-5,-2.376063009939192e-5,-1.0244017040254267e-8,-1.5404061827608693e-5,-2.3486101581026236e-5,-1.0243161489551215e-8,-1.5335535519959935e-5,-2.327460877469775e-5,-1.0242006517918706e-8,-1.5284891552236783e-5,-2.314712391361825e-5,-1.0241237021644048e-8,-1.5213603604440276e-5,-2.3108728191468194e-5,-1.0241580512137116e-8,-1.5083201808082548e-5,-2.3145172717351075e-5,-1.0243555303704379e-8,-1.4864218209902013e-5,-2.32231622645874e-5,-1.0247243960115732e-8,-1.4545036900022462e-5,-2.3295366098052616e-5,-1.0252208937023976e-8,-1.4138251105215157e-5,-2.3310524416851092e-5,-1.0257614027791928e-8,-1.368146422366092e-5,-2.322748601135849e-5,-1.0262512342819018e-8,-1.322989051622768e-5,-2.3029486169829173e-5,-1.0266164007946504e-8,-1.2840855736179594e-5,-2.2732545405069593e-5,-1.0268236392507776e-8,-1.2555169579427251e-5,-2.238231187733215e-5,-1.0268825150242116e-8,-1.2383914527037539e-5,-2.2038912589209548e-5,-1.0268347802691693e-8,-1.2307249887307113e-5,-2.1756613087809175e-5,-1.0267393640885903e-8,-1.2284812012886326e-5,-2.156813016555327e-5,-1.0266572608916944e-8,-1.2270971936084373e-5,-2.1479552451146128e-5,-1.0266376938115249e-8,-1.2227457536302338e-5,-2.1474911265539056e-5,-1.0267077590847187e-8,-1.2129749205895953e-5,-2.1525263563921737e-5,-1.0268689111523196e-8,-1.1967892292312714e-5,-2.1597450054922837e-5,-1.0271017429226725e-8,-1.174422548889918e-5,-2.166023896731968e-5,-1.0273764819876203e-8,-1.1470257655664928e-5,-2.1687790859828148e-5,-1.0276640831595281e-8,-1.1163872918540682e-5,-2.16613873970703e-5,-1.0279429528370393e-8,-1.0847087574647729e-5,-2.1570437594962387e-5,-1.0281991235380007e-8,-1.0544002989509588e-5,-2.141339145539365e-5,-1.0284216045362617e-8,-1.0278390240021108e-5,-2.1198652865103365e-5,-1.0285974464584003e-8,-1.0070447996162899e-5,-2.0945037086426453e-5,-1.028711043152021e-8,-9.932690801530476e-6,-2.068088652200719e-5,-1.028749799157689e-8,-9.86563644678306e-6,-2.0440844298465255e-5,-1.0287141168707594e-8,-9.854764583517574e-6,-2.0259766952748523e-5,-1.028626273479879e-8,-9.870619619233569e-6,-2.01644508838674e-5,-1.0285319481300823e-8,-9.8733786193769e-6,-2.0165339281957866e-5,-1.0284908068411034e-8,-9.821625784056985e-6,-2.0251252759600633e-5,-1.0285579389915266e-8,-9.683168074476673e-6,-2.0389683901633625e-5,-1.0287635145367275e-8,-9.444561568473699e-6,-2.053338593781372e-5,-1.0290997813059452e-8,-9.116224347150207e-6,-2.063177957102368e-5,-1.0295216467786993e-8,-8.731339354531077e-6,-2.0644132770129046e-5,-1.0299605534523448e-8,-8.338457137712565e-6,-2.055092931652111e-5,-1.030345694288755e-8,-7.98933323349338e-6,-2.0360097137701205e-5,-1.0306242488373733e-8,-7.72506620945875e-6,-2.0105711184980106e-5,-1.0307743277604975e-8,-7.564775484823967e-6,-1.983876173135379e-5,-1.0308080804889762e-8,-7.500921681843046e-6,-1.9612526930376168e-5,-1.0307656350511951e-8,-7.503139782780013e-6,-1.946768074753192e-5,-1.0307019062928134e-8,-7.528820005869814e-6,-1.9422601531502887e-5,-1.0306699910081859e-8,-7.535794278292598e-6,-1.947177763761887e-5,-1.0307063665786794e-8,-7.492269894596984e-6,-1.959128917115925e-5,-1.0308233957531626e-8,-7.381486721375345e-6,-1.974765598713154e-5,-1.0310113143840973e-8,-7.201498312177095e-6,-1.990624677978869e-5,-1.031247670749912e-8,-6.962107167616799e-6,-2.0037161470478344e-5,-1.031508699283958e-8,-6.680993863389137e-6,-2.011834907841151e-5,-1.0317770097194946e-8,-6.380273436048308e-6,-2.0136768138740442e-5,-1.032042648831648e-8,-6.0838277247680745e-6,-2.0088636779103125e-5,-1.0322983928965702e-8,-5.815108860030673e-6,-1.9979521669310532e-5,-1.0325335032912242e-8,-5.594817165694961e-6,-1.9824453315227466e-5,-1.0327309582072665e-8,-5.437930590768389e-6,-1.9647685779100526e-5,-1.0328712972235372e-8,-5.349939383493514e-6,-1.948122710398913e-5,-1.0329423078834094e-8,-5.3228826376455855e-6,-1.936095973346019e-5,-1.0329498903693821e-8,-5.332864110333339e-6,-1.9319532507723174e-5,-1.0329235310495402e-8,-5.341522628441661e-6,-1.9376734531154476e-5,-1.0329117209882681e-8,-5.303353476159965e-6,-1.953039383977173e-5,-1.0329676054612896e-8,-5.17823507516099e-6,-1.9752454282041895e-5,-1.0331308373795825e-8,-4.945019491343102e-6,-1.9993909540435985e-5,-1.0334140752283602e-8,-4.610138350751177e-6,-2.019829297048899e-5,-1.0337995748268947e-8,-4.206914461260477e-6,-2.0318725218684748e-5,-1.0342450652703292e-8,-3.7858145479968068e-6,-2.033162353691172e-5,-1.0346947057188743e-8,-3.3999204340748854e-6,-2.0242322080569558e-5,-1.0350921705190584e-8,-3.090978422107698e-6,-2.0081863583639396e-5,-1.035394277316305e-8,-2.879939472361453e-6,-1.9897267305424163e-5,-1.0355827001534681e-8,-2.7637461044958318e-6,-1.9738805558921248e-5,-1.035669501194934e-8,-2.7182918430026305e-6,-1.9647845328083208e-5,-1.0356930437472887e-8,-2.706078182001334e-6,-1.964815539595743e-5,-1.0357046501868146e-8,-2.6861280184476436e-6,-1.9742416449230415e-5,-1.035751449251452e-8,-2.623356484294166e-6,-1.9914165200530054e-5,-1.0358627867133187e-8,-2.495051690997066e-6,-2.0133848461016657e-5,-1.0360457505484327e-8,-2.2933525948354025e-6,-2.0366613404506264e-5,-1.0362901596694904e-8,-2.024101506874866e-6,-2.057945330065126e-5,-1.036578541391425e-8,-1.703438490176005e-6,-2.0746243231691587e-5,-1.0368950180661795e-8,-1.353670649395772e-6,-2.085034603832491e-5,-1.0372285844231933e-8,-9.995092065925437e-7,-2.0885306200609506e-5,-1.0375703780683756e-8,-6.650892091385618e-7,-2.085449651147433e-5,-1.0379079635308058e-8,-3.715968940342627e-7,-2.0770428531116953e-5,-1.0382217349452199e-8,-1.3503446063713592e-7,-2.065397945826239e-5,-1.0384871607393536e-8,3.635039213145238e-8,-2.053328258334241e-5,-1.0386834569506982e-8,1.451554926153161e-7,-2.0441523455916053e-5,-1.038805057918194e-8,2.0789280435282035e-7,-2.041250688557186e-5,-1.0388697272151172e-8,2.56355366977416e-7,-2.047315309918241e-5,-1.0389176849844525e-8,3.3464806040304173e-7,-2.0633626967615144e-5,-1.039000389350313e-8,4.896682666698106e-7,-2.0878520990299207e-5,-1.0391635630909641e-8,7.558554175414243e-7,-2.1164864508976094e-5,-1.0394332164603972e-8,1.1400137473200676e-6,-2.143168146622313e-5,-1.039811235383832e-8,1.6149011662753742e-6,-2.161972150492724e-5,-1.040278944838272e-8,2.1267889603254867e-6,-2.169252145724684e-5,-1.0408016370122865e-8,2.613791080986166e-6,-2.1648099623553002e-5,-1.0413314414030032e-8,3.0255611796536674e-6,-2.1516600834236966e-5,-1.0418136661790554e-8,3.335896657502066e-6,-2.1347475609993867e-5,-1.0422008383847894e-8,3.5455028334495375e-6,-2.1193595706788387e-5,-1.0424695027343131e-8,3.6771057866818085e-6,-2.1098205117584193e-5,-1.0426297045670991e-8,3.766730983759074e-6,-2.1087212163472165e-5,-1.0427207186394536e-8,3.8543118584060025e-6,-2.116678673670468e-5,-1.0427955059979016e-8,3.97556153049034e-6,-2.1325112935168602e-5,-1.0429021553114722e-8,4.156112148298531e-6,-2.1536968915716497e-5,-1.043071137120023e-8,4.4083884967787636e-6,-2.1769858276116903e-5,-1.0433124870667529e-8,4.731238299426264e-6,-2.199039967092715e-5,-1.0436213182297564e-8,5.111871251593329e-6,-2.216982148981789e-5,-1.0439862617282118e-8,5.5293180610449155e-6,-2.228781360239789e-5,-1.0443951826756803e-8,5.958483105439134e-6,-2.2334471279948907e-5,-1.0448355486385057e-8,6.3739591557127685e-6,-2.2310548005592115e-5,-1.0452908274701619e-8,6.753167656295747e-6,-2.2226596306971968e-5,-1.0457371227043073e-8,7.0788641774440105e-6,-2.2101555638768476e-5,-1.0461442256004719e-8,7.341270437022586e-6,-2.19610250197676e-5,-1.0464828194753588e-8,7.540107011405848e-6,-2.18351220744106e-5,-1.0467357564690674e-8,7.686656069240698e-6,-2.1755428418429816e-5,-1.0469080980364281e-8,7.805377469636384e-6,-2.175014455624397e-5,-1.047029980195859e-8,7.933563002743403e-6,-2.1836872868918745e-5,-1.0471493607166954e-8,8.116719413656968e-6,-2.2013889674084526e-5,-1.0473170238320335e-8,8.397782946960609e-6,-2.2253242470900754e-5,-1.0475713376965965e-8,8.801167458084262e-6,-2.2501424654771112e-5,-1.0479313312473675e-8,9.31809147430383e-6,-2.2692544610459407e-5,-1.0483994091602052e-8,9.903277804372193e-6,-2.2771894060168208e-5,-1.0489651043077342e-8,1.0488693236733184e-5,-2.2718401944810526e-5,-1.0496011071352977e-8,1.1008517592282977e-5,-2.2552507598399298e-5,-1.0502567400688094e-8,1.14214527653244e-5,-2.2325484053898436e-5,-1.0508639692043991e-8,1.1719729539192924e-5,-2.2098427892878435e-5,-1.051360321451119e-8,1.192434757606461e-5,-2.192293983959106e-5,-1.0517149141774825e-8,1.2073148493867486e-5,-2.1830348879371115e-5,-1.0519399549919799e-8,1.2208507379845121e-5,-2.1829582167914723e-5,-1.0520823108331641e-8,1.2368142087573956e-5,-2.1910517424363665e-5,-1.0522026852220468e-8,1.2579647860001937e-5,-2.204963465047748e-5,-1.0523548294514526e-8,1.2858046046948135e-5,-2.2216044306126058e-5,-1.052573427092128e-8,1.3205504635807662e-5,-2.2377097194277054e-5,-1.0528728383253077e-8,1.3612660353343853e-5,-2.2503232700248113e-5,-1.0532528837699294e-8,1.4061128311368573e-5,-2.257179941745656e-5,-1.053705767622001e-8,1.4526835423976653e-5,-2.2569659248670465e-5,-1.0542194374134102e-8,1.4983796312142356e-5,-2.2494425657141477e-5,-1.0547763574333112e-8,1.5407831934948618e-5,-2.2354282969079747e-5,-1.0553504640982075e-8,1.5779770461427512e-5,-2.2166624359187616e-5,-1.0559067684047334e-8,1.608797482690634e-5,-2.195590135189993e-5,-1.0564065337397685e-8,1.6330245854374478e-5,-2.1750905552668204e-5,-1.0568177866410433e-8,1.6515130621988764e-5,-2.1581513602797013e-5,-1.0571271898841906e-8,1.6662595891771928e-5,-2.1474755707688038e-5,-1.0573475716392125e-8,1.680367989659793e-5,-2.144982680559584e-5,-1.0575164031555221e-8,1.6977991855744892e-5,-2.15119081550659e-5,-1.0576851619497795e-8,1.7227451460833117e-5,-2.164590037929872e-5,-1.0579043607594197e-8,1.758528349482335e-5,-2.1813063305720084e-5,-1.0582122319913347e-8,1.8061786594786307e-5,-2.1955189701945334e-5,-1.058632473338257e-8,1.8632948981106676e-5,-2.200995658499017e-5,-1.0591773118012249e-8,1.9241195983456193e-5,-2.193466323120593e-5,-1.0598445172373046e-8,1.981317133003406e-5,-2.1726452282952587e-5,-1.0606040069575834e-8,2.0287448616256157e-5,-2.1425281858291863e-5,-1.061388459734303e-8,2.0636332778655594e-5,-2.109672690297479e-5,-1.0621077002227759e-8,2.087033260256244e-5,-2.0805852875933422e-5,-1.0626847060734854e-8,2.1026869693195923e-5,-2.0597119217422514e-5,-1.0630882019558624e-8,2.115329294074093e-5,-2.0487273010198692e-5,-1.0633405474768798e-8,2.129300028400665e-5,-2.0468775249628576e-5,-1.0635008899056331e-8,2.1477766769687902e-5,-2.0517857674518222e-5,-1.0636384654839218e-8,2.172530639983127e-5,-2.0602735888928814e-5,-1.0638109815842078e-8,2.203989369531137e-5,-2.0690072956350867e-5,-1.0640550610319622e-8,2.2414327228279076e-5,-2.0749586688981025e-5,-1.0643876480653403e-8,2.2832428864176618e-5,-2.075731437602081e-5,-1.0648123545462657e-8,2.327186373709147e-5,-2.06979052512023e-5,-1.065324691100052e-8,2.370725263408254e-5,-2.056607264478361e-5,-1.065912813728469e-8,2.4113571523498897e-5,-2.0367140342581537e-5,-1.0665546197757955e-8,2.4469666599175597e-5,-2.011644324456059e-5,-1.067215081453571e-8,2.4761457155718238e-5,-1.9837455761494462e-5,-1.0678483547801098e-8,2.4984396740016067e-5,-1.9558825643028435e-5,-1.0684064625935296e-8,2.5144939672969598e-5,-1.9310587473940774e-5,-1.0688525639022025e-8,2.5260818881569855e-5,-1.9119802585786575e-5,-1.06917361236997e-8,2.535994562171527e-5,-1.9005914717674657e-5,-1.069386581323808e-8,2.5477696466233576e-5,-1.897609088271257e-5,-1.0695349149176802e-8,2.5652094341733997e-5,-1.902096367210599e-5,-1.0696767956414568e-8,2.5916298087693046e-5,-1.9111975005796678e-5,-1.0698709732170148e-8,2.628859728374691e-5,-1.9202643001807574e-5,-1.0701666562329869e-8,2.6762094197675117e-5,-1.9236556751696734e-5,-1.0705996336353121e-8,2.729911355674748e-5,-1.9163344524585584e-5,-1.0711891767678148e-8,2.783684602254258e-5,-1.895885387153898e-5,-1.0719277613221644e-8,2.8306670586864564e-5,-1.8639334239086277e-5,-1.072766183557865e-8,2.8659855505782475e-5,-1.8258763113995928e-5,-1.073612159190717e-8,2.8885279659063856e-5,-1.7888184927921706e-5,-1.0743575505291491e-8,2.9009231738796605e-5,-1.7588764782654586e-5,-1.0749225136080199e-8,2.908000233439939e-5,-1.7393518711195572e-5,-1.0752864147570606e-8,2.914855079008243e-5,-1.7304111401313012e-5,-1.0754868997586099e-8,2.9254770735155143e-5,-1.7298721919266967e-5,-1.0755947029287413e-8,2.9421960148790195e-5,-1.73433769434448e-5,-1.0756840443938963e-8,2.9657262395368594e-5,-1.7401543433202763e-5,-1.075813349050785e-8,2.9954830790562838e-5,-1.7440335048629465e-5,-1.0760197584755174e-8,3.0299471035757358e-5,-1.7433879737981824e-5,-1.0763229561035464e-8,3.066988743140981e-5,-1.7365039408173015e-5,-1.0767308977273792e-8,3.104156445903691e-5,-1.7226340848682806e-5,-1.0772421289059723e-8,3.138958150404849e-5,-1.7020431608455362e-5,-1.0778433463519163e-8,3.169160978062888e-5,-1.67599800034654e-5,-1.0785050830896731e-8,3.193113385062856e-5,-1.6466649719056538e-5,-1.0791801522036606e-8,3.2100549457274216e-5,-1.6168735086317945e-5,-1.0798090040294278e-8,3.2203473041458363e-5,-1.5897357896149383e-5,-1.080332573716205e-8,3.225558795119785e-5,-1.568153341658853e-5,-1.0807089151843031e-8,3.2283527758016355e-5,-1.5542734995758057e-5,-1.0809272801144117e-8,3.232156973954858e-5,-1.548986537631878e-5,-1.0810136690642487e-8,3.24062788787755e-5,-1.551564386066977e-5,-1.0810253821627843E-08,3.256954672694955e-5,-1.5595319915829232e-5,-1.0810370807169095e-8,3.2830743045217534e-5,-1.5688646392023816e-5,-1.0811243374832355e-8,3.318930936264058e-5,-1.5746136030541182e-5,-1.0813499406816032e-8,3.362016828548337e-5,-1.572010074949781e-5,-1.0817540474292183e-8,3.4075238666891787e-5,-1.5579179787124913e-5,-1.0823450353064908e-8,3.449382518613816e-5,-1.532196370613026e-5,-1.0830892582439516e-8,3.482107455406541e-5,-1.498254328611866e-5,-1.0839063244369992e-8,3.502767239053273e-5,-1.4622079522363778e-5,-1.0846829814097262e-8,3.5120439857015004e-5,-1.4307820231652071e-5,-1.085309302508078e-8,3.51375862864246e-5,-1.4089687106817873e-5,-1.085719959088525e-8,3.513199200269295e-5,-1.3986345854532377e-5,-1.085914650566585e-8,3.51525500412995e-5,-1.3985560988209588e-5,-1.085947705163363e-8,3.523209339490654e-5,-1.4054646803086456e-5,-1.0858988747294016e-8,3.5384088933798624e-5,-1.4153334684894148e-5,-1.0858452300955869e-8,3.560538153213612e-5,-1.4243709791482467e-5,-1.0858457682387729e-8,3.5881218350812025e-5,-1.4295764431560704e-5,-1.0859389106431877e-8,3.619005612992247e-5,-1.4289538747822578e-5,-1.0861464399875234e-8,3.650727263331189e-5,-1.4215445163763979e-5,-1.0864770150441248e-8,3.680795793798622e-5,-1.4073968871802461e-5,-1.0869255064842456e-8,3.7069338849790505e-5,-1.3875233842953704e-5,-1.0874690311021376e-8,3.7273324238066565e-5,-1.3638322204225281e-5,-1.0880636211450608e-8,3.740935211446729e-5,-1.338984019635138e-5,-1.0886460859978193e-8,3.747723555199965e-5,-1.3161108246832657e-5,-1.0891439508632244e-8,3.748918890039127e-5,-1.2983612439641286e-5,-1.0894923864558378e-8,3.746992648426565e-5,-1.2882969889767162e-5,-1.0896531846094513e-8,3.745388166964016e-5,-1.2872486930655807e-5,-1.089628939077259e-8,3.7479301400060466e-5,-1.2948111531254483e-5,-1.089466332568615e-8,3.758006931596514e-5,-1.3086710784613064e-5,-1.0892467653005773e-8,3.7777099336497654e-5,-1.3248905734680901e-5,-1.0890674230236611e-8,3.807156828641263e-5,-1.3386503835473725e-5,-1.0890190192257392e-8,3.844207700891592e-5,-1.3453370708504295e-5,-1.0891659080748418e-8,3.8847217212184006e-5,-1.341755372714709e-5,-1.0895313751720727e-8,3.9234030267991595e-5,-1.3271607631699584e-5,-1.090089279363746e-8,3.955132226947631e-5,-1.3037539781839813e-5,-1.0907643242370493e-8,3.976462669241938e-5,-1.2763223288738137e-5,-1.0914452499003047e-8,3.9867493531828635e-5,-1.250952451713426e-5,-1.0920130006578416e-8,3.988372523989806e-5,-1.2331758085782543e-5,-1.0923768775661982e-8,3.9858740281902724e-5,-1.226291312067013e-5,-1.0925025267279314e-8,3.98438771345933e-5,-1.2305852412647015e-5,-1.0924174807119913e-8,3.988096864166715e-5,-1.2436775734862486e-5,-1.092193559817097e-8,3.9993234799773925e-5,-1.2616327199137168e-5,-1.0919186656117713e-8,4.0184029323987886e-5,-1.2802124998079611e-5,-1.0916728214422174e-8,4.0441034122307655e-5,-1.295806215039957e-5,-1.0915158387722742e-8,4.07423430323965e-5,-1.3059008181614689e-5,-1.0914851840032176e-8,4.106194258997215e-5,-1.309190696252388e-5,-1.0915982377055156e-8,4.137369026554492e-5,-1.305496471159586e-5,-1.0918538217819229e-8,4.165397699143815e-5,-1.295627528662622e-5,-1.0922312589289403e-8,4.188372567499801e-5,-1.281253335343146e-5,-1.0926886273075621e-8,4.205038798547874e-5,-1.2647779157268254e-5,-1.0931637253225023e-8,4.2150263329725885e-5,-1.2491600175957169e-5,-1.0935808929506866e-8,4.219089514943613e-5,-1.2376014975777942e-5,-1.0938645719799141e-8,4.219264556971658e-5,-1.2330443038611213e-5,-1.0939574041035733e-8,4.2187994684927e-5,-1.2374868917154073e-5,-1.0938381011529256e-8,4.221708942536862e-5,-1.251262722220375e-5,-1.0935330563847715e-8,4.2319148750577894e-5,-1.272563608677644e-5,-1.0931164753811414e-8,4.252146931834362e-5,-1.2975210570017808e-5,-1.0926967333923104e-8,4.282981205890698e-5,-1.3209939979367455e-5,-1.0923913734952636e-8,4.3224317253663856e-5,-1.3379021269503886e-5,-1.092296888156952e-8,4.3663191015489984e-5,-1.3446687017306154e-5,-1.0924616375420668e-8,4.40932553261884e-5,-1.3402692615521834e-5,-1.0928699864093918e-8,4.446391154055205e-5,-1.3265486287865059e-5,-1.0934436131087437e-8,4.4740262897078254e-5,-1.3077370375528966e-5,-1.0940609312170373e-8,4.491180449520049e-5,-1.2893262674070154e-5,-1.0945898968800855e-8,4.49944176700801e-5,-1.2766207079580588e-5,-1.0949239480507803e-8,4.502512200115446e-5,-1.273370298418019e-5,-1.0950092267772875e-8,4.505116850684658e-5,-1.2808910095088956e-5,-1.0948539845884595e-8,4.511705275984765e-5,-1.2979305349759284e-5,-1.0945188231944347e-8,4.5253768849291526e-5,-1.3212635289537497e-5,-1.0940942427650663e-8,4.547343858202198e-5,-1.3467274984818715e-5,-1.093675586758881e-8,4.576991139681106e-5,-1.370288962080165e-5,-1.0933437996680767e-8,4.6123562686564354e-5,-1.3888173614010929e-5,-1.0931552459312198e-8,4.6507586318521756e-5,-1.4004532581867268e-5,-1.0931388495325245e-8,4.689364295154041e-5,-1.404638935558007e-5,-1.0932970781736282e-8,4.725592017948633e-5,-1.401955872819049e-5,-1.0936077710211673e-8,4.7573669880768315e-5,-1.3939013934426217e-5,-1.0940262282537435e-8,4.783282623871706e-5,-1.3826794886489019e-5,-1.0944887017204275e-8,4.8027394648472436e-5,-1.3710116999369636e-5,-1.0949190756732851e-8,4.816102679731794e-5,-1.361918978051325e-5,-1.095239527820225e-8,4.824866180786038e-5,-1.3583965343721564e-5,-1.0953844774146032e-8,4.8317389669767263E-05,-1.3629077500997938e-5,-1.0953156144793383e-8,4.8404937665998705e-5,-1.3766894228811147e-5,-1.0950352515756894e-8,4.85539270343216e-5,-1.3990186698127629e-5,-1.094594628661613e-8,4.880120852726276e-5,-1.4267952993854126e-5,-1.0940929580088114e-8,4.9164604434804093e-5,-1.4548760923785778e-5,-1.0936627198037842e-8,4.963284107903462e-5,-1.4773613411439147e-5,-1.0934389782899522e-8,5.016508945338154e-5,-1.4894876338232566e-5,-1.0935178671721424e-8,5.070227547728938e-5,-1.4892932210451892e-5,-1.0939190020118924e-8,5.118560276541905e-5,-1.4782534477633037e-5,-1.0945713139716886e-8,5.157392379064546e-5,-1.4606625431828425e-5,-1.095332893238933e-8,5.185338963389235e-5,-1.4421810233716862e-5,-1.0960371481365232e-8,5.203770610741841e-5,-1.4282157086463557e-5,-1.0965440644733544e-8,5.216122418436789e-5,-1.422646572966351e-5,-1.0967760623641757e-8,5.226841451573015e-5,-1.4271353392898255e-5,-1.0967288706004566e-8,5.2402901302713924e-5,-1.4410350265664105e-5,-1.0964601820102489e-8,5.2598368352539667e-5,-1.4617978010402564e-5,-1.0960658830434025e-8,5.2872840342696726e-5,-1.4857176091440661e-5,-1.0956540629101209e-8,5.322704970841118e-5,-1.5088075305254894e-5,-1.0953236332976238e-8,5.364663492512684e-5,-1.5275993367745722e-5,-1.0951500603035131e-8,5.410696514106418e-5,-1.539698624027727e-5,-1.095178087382418e-8,5.457893133346143e-5,-1.5440298921740233e-5,-1.0954194761142424e-8,5.50342383558213e-5,-1.540806131983914e-5,-1.0958542424790509e-8,5.544932692850507e-5,-1.5313173657149106e-5,-1.096434545062792e-8,5.580777697902618e-5,-1.5176465955951547e-5,-1.0970910845978872e-8,5.610161114139606e-5,-1.502389729946295e-5,-1.0977420875607443e-8,5.633207828382777e-5,-1.4883981469539802e-5,-1.0983045974823884e-8,5.651030827952544e-5,-1.4785143953867945e-5,-1.0987069782932988e-8,5.6657843445042456E-05,-1.475241870537396e-5,-1.098900869828785e-8,5.68064043339674e-5,-1.480281230944594e-5,-1.0988713689162896e-8,5.6995445257911e-5,-1.493919710310919e-5,-1.0986451645489575e-8,5.726569833881333e-5,-1.5144085304198487e-5,-1.0982961665724738e-8,5.7647873217573626e-5,-1.537676462498628e-5,-1.097945336000276e-8,5.8148783022304093e-5,-1.5578618482013747e-5,-1.0977468969124607e-8,5.8741629395056166e-5,-1.5689303712884644e-5,-1.0978518978595156e-8,5.936880170599819e-5,-1.5669452550320848e-5,-1.0983516728908241e-8,5.995982222233368e-5,-1.5518212400740367e-5,-1.0992265385709335e-8,6.045655109961612e-5,-1.5274524989521094e-5,-1.100336461316192e-8,6.083213388443301e-5,-1.500128721893175e-5,-1.1014687824535179e-8,6.109517706905173e-5,-1.476232162248893e-5,-1.1024177858417426e-8,6.128078642644321e-5,-1.4603933293794295e-5,-1.1030515003487311e-8,6.14360565632286e-5,-1.4546623392676997e-5,-1.1033379525122147e-8,6.160676979381152e-5,-1.4585862441534919e-5,-1.1033325129027129e-8,6.182836446050053e-5,-1.4698115916188576e-5,-1.103144492460905e-8,6.212137962144658e-5,-1.4848716247797194e-5,-1.1029016395917635e-8,6.249043218855688e-5,-1.499957486442772e-5,-1.1027231651313366e-8,6.292575713367833e-5,-1.5115848315998846e-5,-1.1027035010884309e-8,6.340659244996193e-5,-1.5171078050374148e-5,-1.1029042575856415e-8,6.39057084276371e-5,-1.5150397168465046e-5,-1.1033511588368882e-8,6.439430170432664e-5,-1.5051632264841132e-5,-1.1040338007405747e-8,6.484651366485014e-5,-1.4884453987230887e-5,-1.1049078955669309e-8,6.524295871579131e-5,-1.4668006957840344e-5,-1.1059009733669053e-8,6.557293822920603e-5,-1.4427696477046931e-5,-1.106922243082436e-8,6.583546021894932e-5,-1.4191801641639522e-5,-1.1078757988711264e-8,6.603942429151922e-5,-1.3988227254888844e-5,-1.1086754263160646e-8,6.620324712438544e-5,-1.3841351539194972e-5,-1.1092584244638724e-8,6.635399675116738e-5,-1.376871069724712e-5,-1.1095960923446284e-8,6.652567539394843e-5,-1.377713360613599e-5,-1.1097002545640146e-8,6.675562941069513e-5,-1.3858317394900903e-5,-1.109626926494747e-8,6.707780774668518e-5,-1.3985038180359028e-5,-1.1094780789983727e-8,6.751241829499467e-5,-1.4110813964274978e-5,-1.1093985695546706e-8,6.805398404589733e-5,-1.4176969697956724e-5,-1.1095592658974113e-8,6.866384590550756e-5,-1.4129570457204582e-5,-1.1101140430408416e-8,6.927548828970987e-5,-1.3942193950697216e-5,-1.1111323602410547e-8,6.981586375490909e-5,-1.3632135932979031e-5,-1.1125409233657399e-8,7.023376113526364e-5,-1.3257268294156674e-5,-1.1141255562749935e-8,7.051856313032443e-5,-1.2893039413830864e-5,-1.1156102060587921e-8,7.06990864524921e-5,-1.2603544775620664e-5,-1.1167680283957444e-8,7.082667807448929e-5,-1.2422764469719474e-5,-1.1174960488599823e-8,7.095499623308146e-5,-1.2351727669469376e-5,-1.1178226969257668e-8,7.112590319904138e-5,-1.2366745927631601e-5,-1.1178667858819269e-8,7.136360199813396e-5,-1.2431038164156497e-5,-1.117783577309838e-8,7.167471562637514e-5,-1.2504825814492575e-5,-1.1177222677717251e-8,7.20513073116622e-5,-1.2552337068439892e-5,-1.1178022183958767e-8,7.247483939519828e-5,-1.2546082636510993e-5,-1.1181041603564716e-8,7.292025057925622e-5,-1.2469246626440453e-5,-1.1186692155499417e-8,7.335996924164086e-5,-1.2316707228409032e-5,-1.1195001134773114e-8,7.376777185043507e-5,-1.2094851223874839e-5,-1.1205627668886617e-8,7.41223204444516e-5,-1.1820215935622424e-5,-1.1217891224875756e-8,7.441008632046292e-5,-1.1516986111407657e-5,-1.1230839822596301e-8,7.462727595584035e-5,-1.121357421653002e-5,-1.1243374292470443e-8,7.478054238337684e-5,-1.0938760084437633e-5,-1.1254418929902535e-8,7.48865297826223e-5,-1.0717820966566956e-5,-1.1263107130437595e-8,7.497036903850236e-5,-1.0568904309436396e-5,-1.1268942299422062e-8,7.506321783824891e-5,-1.0499811842188604e-5,-1.1271900341615984e-8,7.519881869817697e-5,-1.0505257389349248e-5,-1.1272463646632064e-8,7.540869080999105e-5,-1.056479190521469e-5,-1.1271600290428743e-8,7.571546174872404e-5,-1.0642370424357846e-5,-1.1270700670162078e-8,7.61246291272292e-5,-1.0689513165947758e-5,-1.1271446895380041e-8,7.661678435223831e-5,-1.0654320433158899e-5,-1.1275546237460665e-8,7.71448147730922e-5,-1.0497201563490087e-5,-1.1284249952033519e-8,7.764205458950148e-5,-1.0209521680141907e-5,-1.1297711821998253e-8,7.804347387462571e-5,-9.824875614952504e-6,-1.1314530735816466e-8,7.831185681715099e-5,-9.411967862924406e-6,-1.133196933848187e-8,7.84533388443129e-5,-9.048847109690942e-6,-1.134696307423481e-8,7.851205357156255e-5,-8.792740654590127e-6,-1.1357361358067248e-8,7.854866512846068e-5,-8.662856311024963e-6,-1.1362623719687482e-8,7.861729582289454e-5,-8.642245361453145e-6,-1.1363680031735883e-8,7.875197622822127e-5,-8.691794929389404e-6,-1.1362277223349593e-8,7.896418283479847e-5,-8.765841602924702e-6,-1.1360297098831838e-8,7.924709191886245e-5,-8.823284793479496e-6,-1.1359315593534433e-8,7.95818503140842e-5,-8.833269852576455e-6,-1.1360426738010168e-8,7.994322616848324e-5,-8.777041367256928e-6,-1.1364233495034238e-8,8.030394161526125e-5,-8.647855079034407e-6,-1.1370898907447606e-8,8.063800618353983e-5,-8.450099063104403e-6,-1.13801913797548e-8,8.092351739561471e-5,-8.197986994855086e-6,-1.139151507594174e-8,8.114517708580553e-5,-7.913748681025796e-6,-1.1403947928868321e-8,8.129649091610874e-5,-7.625053643838189e-6,-1.1416325803923466e-8,8.13812925714093e-5,-7.361498470228608e-6,-1.1427396960663914e-8,8.141408671042445e-5,-7.150374877007221e-6,-1.143603391639288e-8,8.141887617018724e-5,-7.012246466696308e-6,-1.1441458496670813e-8,8.142639354204631e-5,-6.9569547070524565e-6,-1.1443423882852663e-8,8.146989071188947e-5,-6.980733178277085e-6,-1.1442305223764873e-8,8.157988588747373e-5,-7.0650386142183395e-6,-1.1439079612900346e-8,8.177834068751832e-5,-7.177494714956207e-6,-1.1435206339439226e-8,8.207274310460953e-5,-7.275416748518267e-6,-1.1432431508335396e-8,8.24510452990543e-5,-7.312655501458012e-6,-1.1432513684254343e-8,8.287939415777408e-5,-7.250137973215447e-6,-1.14368513607406e-8,8.330545375814392e-5,-7.068926237825051e-6,-1.1446018896562171e-8,8.366980628525399e-5,-6.781801504635946e-6,-1.1459328098698728e-8,8.392475651610919e-5,-6.436424280153653e-6,-1.147469615909485e-8,8.405365240588183e-5,-6.103856380286995e-6,-1.1489120917511639e-8,8.407948845031888e-5,-5.853970011362507e-6,-1.1499731792143241e-8,8.405583920133282e-5,-5.729599983451548e-6,-1.1504887252346792e-8,8.404479026302159e-5,-5.733734864168806e-6,-1.1504668019600196e-8,8.409487550610288e-5,-5.8348805222652595e-6,-1.1500567610929476e-8,8.422953279231353e-5,-5.983832090974439e-6,-1.1494726575699467e-8,8.44475135877195e-5,-6.130958240035688e-6,-1.1489203384318796e-8,8.473016954110671e-5,-6.237308506807428e-6,-1.1485549198160168e-8,8.504997460131159e-5,-6.278822698858891e-6,-1.1484684339034437e-8,8.537722202659041e-5,-6.24604350020151e-6,-1.1486947837148801e-8,8.56843216611937e-5,-6.141962433049987e-6,-1.149219497561945e-8,8.594839135529726e-5,-5.979584647913548e-6,-1.1499878642207251e-8,8.615303700245352e-5,-5.7797022876110846e-6,-1.1509108282661373e-8,8.628989016331793e-5,-5.568700527437504e-6,-1.1518717192858226e-8,8.636003840534361e-5,-5.3759285752394796e-6,-1.1527377565087991e-8,8.637502793286532e-5,-5.230188533993722e-6,-1.1533784620290696e-8,8.635675385529202e-5,-5.155286769746592e-6,-1.1536897415011626e-8,8.63355224875678e-5,-5.165182714998419e-6,-1.1536184302568082e-8,8.634591892159362e-5,-5.259775561616308e-6,-1.1531803962477889e-8,8.642073115040163e-5,-5.4226586174864975e-6,-1.152465872996433e-8,8.65839351077441e-5,-5.622046886179956e-6,-1.1516287597576716e-8,8.684430755827092e-5,-5.8153923203604484e-6,-1.1508609070013934e-8,8.719130249188195e-5,-5.95728092691672e-6,-1.1503558232602766e-8,8.759455242721197e-5,-6.009491974966764e-6,-1.150267039330855e-8,8.800800850055604e-5,-5.95147211987009e-6,-1.1506668360848453e-8,8.837913286366379e-5,-5.7886627769627485e-6,-1.1515138637633855e-8,8.866225574551908e-5,-5.555373933240397e-6,-1.1526431984484355e-8,8.883301404506053e-5,-5.309063543337344e-6,-1.1537937388838975e-8,8.889840023466499e-5,-5.115164449411993e-6,-1.1546777723907165e-8,8.889656623832367e-5,-5.026383401286591e-6,-1.1550737585091733e-8,8.888441107440784e-5,-5.065123260574208e-6,-1.154900893343037e-8,8.891787950494431e-5,-5.21765631045529e-6,-1.1542374452129857e-8,8.903443511633252e-5,-5.442337151279303e-6,-1.1532775965427147e-8,8.924516874443352e-5,-5.686194762207577e-6,-1.1522563607641413e-8,8.953744138069596e-5,-5.90108623252899e-6,-1.1513813593362013e-8,8.988360538093972e-5,-6.053558073616242e-6,-1.1507938669655695e-8,9.025045498071756e-5,-6.127657333921901e-6,-1.1505594789433005e-8,9.06062942791196e-5,-6.123105910016481e-6,-1.1506768232466762e-8,9.092503624012695e-5,-6.051676523403866e-6,-1.1510921388865986e-8,9.118813404710323e-5,-5.933591903961702e-6,-1.1517128603869335e-8,9.138545565664259e-5,-5.794575433039127e-6,-1.1524189430321015e-8,9.151591271894805e-5,-5.66334449111308e-6,-1.1530742462923101e-8,9.158811085003475e-5,-5.568946066028995e-6,-1.1535410442970295e-8,9.162072310193748e-5,-5.537335450390624e-6,-1.1536995250412474e-8,9.164182458652515e-5,-5.58694690455087e-6,-1.1534711584048976e-8,9.168620213239225e-5,-5.723696108466005e-6,-1.152841879943091e-8,9.178992959661302e-5,-5.936777568263604e-6,-1.1518779345972147e-8,9.198249027190544e-5,-6.197337314678204e-6,-1.1507263760530225e-8,9.227820821065515e-5,-6.461935833751877e-6,-1.1495944136778205e-8,9.266993147833276e-5,-6.6812950165578724e-6,-1.1487076652143873e-8,9.31278874804674e-5,-6.8125918600802576e-6,-1.1482550916430714e-8,9.360510332344588e-5,-6.831677883244499e-6,-1.1483350519634967e-8,9.404841563306238e-5,-6.741163582188049e-6,-1.1489195433374426e-8,9.441208477567966e-5,-6.57151688468949e-6,-1.1498505989231926e-8,9.467017588287623e-5,-6.374429642810231e-6,-1.1508741618074349e-8,9.482411049793587e-5,-6.20983930092064e-6,-1.1517053215341923e-8,9.490280063124226e-5,-6.12986333255191e-6,-1.1521069363394867e-8,9.49546446025167e-5,-6.164351503798526e-6,-1.1519561592846616e-8,9.503343971679581e-5,-6.312991752990002e-6,-1.1512751366586703e-8,9.518296893644879e-5,-6.546957614728857e-6,-1.1502154648514587e-8,9.54258618892581e-5,-6.819249442704191e-6,-1.1490053068776307e-8,9.576033063758811e-5,-7.079181183195936e-6,-1.147882172959562e-8,9.616458460450145e-5,-7.285251177458946e-6,-1.1470361003639736e-8,9.660557779129375e-5,-7.412533789784719e-6,-1.1465779950685564e-8,9.70480253349657e-5,-7.454061673847203e-6,-1.1465342600263835e-8,9.746107955264904e-5,-7.418094434670623e-6,-1.1468592015480105e-8,9.782204348641294e-5,-7.323724614127018e-6,-1.1474549309030842e-8,9.811778004559563e-5,-7.196576837891347e-6,-1.1481914889362466e-8,9.834488254743438e-5,-7.065336659585935e-6,-1.1489242896633806e-8,9.85094970832235e-5,-6.958985648334306e-6,-1.1495095179541215e-8,9.862717385640469e-5,-6.90413645241066e-6,-1.1498196338733799e-8,9.8722513616579e-5,-6.921815594705209e-6,-1.1497607920369037e-8,9.882784972662761e-5,-7.023345607949021e-6,-1.1492923262731212e-8,9.897986411696639e-5,-7.205665995436498e-6,-1.148446098537155e-8,9.921318771121227e-5,-7.447586546246423e-6,-1.1473395307025696e-8,9.955120060763667e-5,-7.709619295232465e-6,-1.146172404791077e-8,9.999642762624879e-5,-7.940035443749168e-6,-1.1451968869426325e-8,1.0052494732063333e-4,-8.087647613726074e-6,-1.1446579632065744e-8,1.0108913471724907e-4,-8.117933472199266e-6,-1.1447169892722494e-8,1.016297505105532e-4,-8.025879558080473e-6,-1.1453875399227287e-8,1.0209339869072522e-4,-7.839290063002508e-6,-1.1465163461608666e-8,1.0244827762320929e-4,-7.610760831100816e-6,-1.1478236898852096e-8,1.0269227243374284e-4,-7.4019405703705335e-6,-1.1489879553959839e-8,1.0285149371859283e-4,-7.266368505272329e-6,-1.1497391887392736e-8,1.0297118136782965e-4,-7.236336161787715e-6,-1.1499280042755185e-8,1.0310270675950262e-4,-7.316726316035047e-6,-1.1495523318503002e-8,1.0329056362595021e-4,-7.486349598341804e-6,-1.148742159707798e-8,1.0356255453322497e-4,-7.705430672579288e-6,-1.1477144225777614e-8,1.0392519544575366e-4,-7.926623660176716e-6,-1.1467147125266295e-8,1.0436481553339658e-4,-8.106347722194308e-6,-1.1459615835618466e-8,1.048532139215313e-4,-8.213492770649762e-6,-1.1456056721422704e-8,1.0535556460250918e-4,-8.23373787288498e-6,-1.1457100913129077e-8,1.0583805546501133e-4,-8.169439622731186e-6,-1.1462518463608636e-8,1.0627352735391126e-4,-8.036400609196678e-6,-1.1471385560392026e-8,1.066445607363988e-4,-7.859266130393587e-6,-1.1482325768957206e-8,1.0694441306334356e-4,-7.666977342055716e-6,-1.1493758257334187e-8,1.0717666268625118e-4,-7.489017281889044e-6,-1.1504111986789331e-8,1.0735435490295485e-4,-7.35244966639261e-6,-1.1511999323604564e-8,1.0749903983642938e-4,-7.2792806829164845e-6,-1.1516363131548234e-8,1.0763957831135115e-4,-7.283580274524651e-6,-1.151661702847303e-8,1.0781007680501017e-4,-7.368012685883945e-6,-1.1512793302970118e-8,1.0804590054700001e-4,-7.520061810504988e-6,-1.1505692043057436e-8,1.0837680611466255e-4,-7.709425069854278e-6,-1.1496977420176755e-8,1.0881740161785823e-4,-7.889347522041987e-6,-1.1489103221812277e-8,1.0935759791410143e-4,-8.004876957400208e-6,-1.1484917776821892e-8,1.099584343313986e-4,-8.008601428695032e-6,-1.1486882532745956e-8,1.1055881062444225e-4,-7.879155597116695e-6,-1.1496092004950944e-8,1.1109371258594231e-4,-7.633039843956237e-6,-1.1511581608136922E-08,1.1151663459051103e-4,-7.321605202687162e-6,-1.1530431309502565e-8,1.1181492903404441e-4,-7.013454241810893e-6,-1.1548741122352925e-8,1.1201106022014476e-4,-6.771340174468865e-6,-1.1562985724005811e-8,1.1215140197415839e-4,-6.634405209780007e-6,-1.1571068149846324e-8,1.1228984212495073e-4,-6.611278102413541e-6,-1.1572697123814852e-8,1.1247315925664164e-4,-6.6831267112462406e-6,-1.1569144942454731e-8,1.127316993096942e-4,-6.812598750203812e-6,-1.156266778319374e-8,1.1307579932787652e-4,-6.954602663343077e-6,-1.1555859496188551e-8,1.1349688400417341e-4,-7.066217820959545e-6,-1.1551101049908461e-8,1.139717903089487e-4,-7.114299397794903e-6,-1.1550167056351804e-8,1.1446891416054345e-4,-7.080077937874377e-6,-1.1554002562827165e-8,1.149548174283551e-4,-6.960537575809596e-6,-1.1562667346861427e-8,1.1540007923220339e-4,-6.766933444370123e-6,-1.1575426285469924e-8,1.1578354861211906e-4,-6.521295786051894e-6,-1.1590947546989276e-8,1.1609463410885247e-4,-6.2519478086589645e-6,-1.160756007562344e-8,1.1633376296363593e-4,-5.989012039941205e-6,-1.1623518348194946e-8,1.1651156393922294e-4,-5.760573051355079e-6,-1.1637234212047214e-8,1.1664740182339614e-4,-5.589622358594828e-6,-1.1647459659802337e-8,1.1676759334021895e-4,-5.4915067272458905e-6,-1.1653428976732367e-8,1.1690326783015823e-4,-5.471531648050538e-6,-1.1654974611229112e-8,1.1708746557034123e-4,-5.5225030012895636e-6,-1.1652632718742514e-8,1.1735068033667883e-4,-5.622479874781477e-6,-1.1647735276380047e-8,1.1771412944112854e-4,-5.734062550996382e-6,-1.1642435438662262e-8,1.1818113725851937e-4,-5.8076621481172495e-6,-1.163954187668793e-8,1.1872926880585935e-4,-5.791344442245663e-6,-1.1642004245374285e-8,1.1930855430309953e-4,-5.647553044674574e-6,-1.1651984086518556e-8,1.1985155215788543e-4,-5.371443175151925e-6,-1.1669760410394222e-8,1.2029547121095116e-4,-4.99995084485974e-6,-1.1693115291372944e-8,1.2060678781026997e-4,-4.6024408688642385e-6,-1.1717833613867049e-8,1.2079400904598451e-4,-4.255199093046226e-6,-1.173926368756903e-8,1.2090126966665237e-4,-4.0137842781003e-6,-1.1754062382778059e-8,1.2098843584166365e-4,-3.897678566972292e-6,-1.176115704922468e-8,1.2111008984554611e-4,-3.891400665164609e-6,-1.1761637208694449e-8,1.213022496940009e-4,-3.95630760713687e-6,-1.1757971241563372e-8,1.2157839399120963e-4,-4.044896229076136e-6,-1.1753097167220337e-8,1.2193195516922581e-4,-4.112420305157807e-6,-1.1749718015863004e-8,1.2234182152848596e-4,-4.124267718560327e-6,-1.174987984666976e-8,1.227785275255919e-4,-4.059624660286843e-6,-1.1754780294877045e-8,1.2321007408265877e-4,-3.9124489345179326e-6,-1.1764728817057517e-8,1.2360698042256985e-4,-3.6904598768444323e-6,-1.1779212189448352e-8,1.2394631226203136e-4,-3.4126109266878824e-6,-1.1797041115608418e-8,1.242144823774108e-4,-3.1055077065965403e-6,-1.1816559520484416e-8,1.2440867826661164e-4,-2.799226073876711e-6,-1.1835897138338729e-8,1.2453685337986063e-4,-2.523031477587932e-6,-1.1853238148010125e-8,1.2461646512564885e-4,-2.301547896694e-6,-1.186706784611472e-8,1.2467235994619418e-4,-2.1516861724259745e-6,-1.1876371614580685e-8,1.2473410454800834e-4,-2.0803083645591164e-6,-1.1880779589050701e-8,1.2483283115915695e-4,-2.0825349597226646e-6,-1.1880660082478308e-8,1.2499748069359724e-4,-2.14069314709482e-6,-1.1877165836353078e-8,1.2525010295091812e-4,-2.2241823656063393e-6,-1.1872226457607199e-8,1.2559995192754653e-4,-2.2912602137460035e-6,-1.1868437590207958e-8,1.2603705811992328e-4,-2.2945068883105327e-6,-1.1868742828901586e-8,1.2652772420829495e-4,-2.191539426597471e-6,-1.1875794007561012e-8,1.2701630641300356e-4,-1.9604423994929207e-6,-1.1890987874401511e-8,1.2743771444703272e-4,-1.6147035257241735e-6,-1.1913481241468902e-8,1.2774003479321577e-4,-1.2075860053489198e-6,-1.1939854087612531e-8,1.2790733523272295e-4,-8.17705683285339e-7,-1.1965019553764724e-8,1.279679628288094e-4,-5.194673008425952e-7,-1.1984174542305361e-8,1.279816584662349e-4,-3.5470155045429583e-7,-1.1994671485721905e-8,1.280138942373341e-4,-3.2155917529888203e-7,-1.1996712018024326e-8,1.2811314916667707e-4,-3.832848611376374e-7,-1.1992721904466058e-8,1.2830082617175774e-4,-4.869902782138533e-7,-1.198611016092719e-8,1.2857305116365837e-4,-5.810461096132203e-7,-1.1980164163535222E-08,1.289084172136336e-4,-6.257202090277428e-7,-1.197740043466469e-8,1.2927653296285668e-4,-5.972525154990381e-7,-1.1979329944634138e-8,1.2964491995966202e-4,-4.877474608997493e-7,-1.1986472365228349e-8,1.2998387075651414e-4,-3.031311612369654e-7,-1.1998477370081351e-8,1.3026979244258862e-4,-6.038288953220458e-8,-1.2014282732417834e-8,1.3048752957989842e-4,2.1562191863560383e-7,-1.2032296857404085e-8,1.3063183983413705e-4,4.956069602951913e-7,-1.2050612633462722e-8,1.3070798712429174e-4,7.49696777087375e-7,-1.2067254493324593e-8,1.3073127127371782e-4,9.513984761652111e-7,-1.2080450782354818e-8,1.3072533232997706e-4,1.0813761032640532e-6,-1.2088898078971734e-8,1.3071932425519906e-4,1.1305045965556356e-6,-1.2091976791290884e-8,1.3074424349902703e-4,1.1018477731859764e-6,-1.2089887050399828e-8,1.3082870101893535e-4,1.0113362985932872e-6,-1.2083690937629776e-8,1.3099441618179766e-4,8.869501908669666e-7,-1.2075251931326807e-8,1.3125168068481923e-4,7.662116754938402e-7,-1.2067066918911372e-8,1.3159510738595574e-4,6.915586905267705e-7,-1.2061965515433264e-8,1.3200056820097142e-4,7.028841658829567e-7,-1.2062624571151364e-8,1.3242528918228636e-4,8.270198550287169e-7,-1.2070869118686841e-8,1.3281385380364976e-4,1.0657937989025924e-6,-1.2086852795495238e-8,1.3311208615874337e-4,1.3873940278361398e-6,-1.2108442324416934e-8,1.3328674475046086e-4,1.728378788589479e-6,-1.2131335420364398e-8,1.333423026531807e-4,2.011359960326922e-6,-1.2150284217646462e-8,1.333230859574093e-4,2.173641367897251e-6,-1.2161076558038903e-8,1.3329628509418603e-4,2.1916886718834704e-6,-1.2162183678561086e-8,1.3332488742110422e-4,2.0869799011873835e-6,-1.2155091872515184e-8,1.3344631607287334e-4,1.9118834458728775e-6,-1.214330168860428e-8,1.3366614959370036e-4,1.7270017762180142e-6,-1.213081977253317e-8,1.339647660819936e-4,1.5827822630531564e-6,-1.2120978054806648e-8,1.3430900171919165e-4,1.5107505188582636e-6,-1.2115885232530696e-8,1.346625507586368e-4,1.5227555156633589e-6,-1.2116379839448163e-8,1.3499278908367805e-4,1.6143357752029857e-6,-1.2122232655650623e-8,1.352743630890875e-4,1.7691319425712106e-6,-1.2132411706736463e-8,1.3549082147805045e-4,1.9628976716705375e-6,-1.214532559179744e-8,1.3563536205606977e-4,2.1669414090184472e-6,-1.2159041601093816e-8,1.3571114539193986e-4,2.3513531864422336e-6,-1.2171504657912729e-8,1.3573115122892719e-4,2.488365757099318e-6,-1.218077928907646e-8,1.3571726302195615e-4,2.555989521491244e-6,-1.2185316078541546e-8,1.3569814446294577e-4,2.5416602671032738e-6,-1.2184217684665625e-8,1.3570568585111713e-4,2.4452206623935392e-6,-1.2177449976565543e-8,1.3577024230789847e-4,2.280427964073108e-6,-1.216594442676682e-8,1.3591527737192273e-4,2.0743135607314645e-6,-1.2151550454018783e-8,1.361522991152803e-4,1.8640121265254014e-6,-1.213681987513195e-8,1.3647708727637718e-4,1.6911483786144465e-6,-1.2124630980449703e-8,1.3686810998498884e-4,1.5943000966245994e-6,-1.211767957644585e-8,1.3728794824521178e-4,1.6002951590033876e-6,-1.2117875538135754e-8,1.376885995265603e-4,1.715563961241601e-6,-1.2125719871977474e-8,1.380212492054774e-4,1.9198116421548985e-6,-1.2139827416802713e-8,1.3824979653251647e-4,2.16545754172393e-6,-1.2156862702966804e-8,1.3836476748777283e-4,2.3863798766054845e-6,-1.2172165361997345e-8,1.3839118089512586e-4,2.516681597723158e-6,-1.2181109204786456e-8,1.383836958661086e-4,2.5139173425388923e-6,-1.2180756018019766e-8,1.3840809682379775e-4,2.3754960365028225e-6,-1.2170971847677191e-8,1.3851731397930713e-4,2.1385549249810985e-6,-1.2154358737266609e-8,1.387345180742526e-4,1.8635150257748393e-6,-1.2135089041809021e-8,0.00013905061657867654,1.6115027181214983e-6,-1.21173713319074e-8,1.3943376606727773e-4,1.4271981388203693e-6,-1.2104305360794658e-8,1.3984300364040437e-4,1.3321511005655048e-6,-1.2097427842395805e-8,1.4023941764179271e-4,1.3266107575433846e-6,-1.2096814698533307e-8,1.4059252722173118e-4,1.3952876797859035e-6,-1.2101447432625885e-8,1.4088264636512158e-4,1.5134604515907064e-6,-1.2109616882522158e-8,1.4110100645417162e-4,1.651840139911393e-6,-1.211925900245617e-8,1.4124909369002032e-4,1.780117071596497e-6,-1.212821380203447e-8,1.41337902381737e-4,1.8698047521882043e-6,-1.2134441476175163e-8,1.413871243968482e-4,1.897057213198281e-6,-1.2136236886680415e-8,1.4142383018431504e-4,1.845841427761066e-6,-1.2132461012287831e-8,1.4147997719204125e-4,1.7113175489430788e-6,-1.2122777537746821e-8,1.4158823504138685e-4,1.502646517645388e-6,-1.2107840476713205e-8,1.4177619737628733e-4,1.2439767012537168e-6,-1.2089354094720186e-8,1.420599003828967e-4,9.723315462248096e-7,-1.206992596215161e-8,1.4243837480090518e-4,7.317359454874271e-7,-1.205266945550483e-8,1.428912639706557e-4,5.641719353741576e-7,-1.2040586686537376e-8,1.4338097885540922e-4,4.993306811954009e-7,-1.2035847099509482e-8,1.4385960277296563e-4,5.458783176763343e-7,-1.2039139663143369e-8,1.4427940471458366e-4,6.868122641353136e-7,-1.2049291370737595e-8,1.4460478846783334e-4,8.807411239238364e-7,-1.2063317321420302e-8,1.4482281559751307e-4,1.069839105541091e-6,-1.2076991054963683e-8,0.00014494904837242869,1.1937309248725323e-6,-1.2085887289049307e-8,1.4502568900064648e-4,1.2064426101944527e-6,-1.208665562177113e-8,1.4511070047506638e-4,1.0911379333922037e-6,-1.2078100163221958e-8,1.4526028585175462e-4,8.663198283372468e-7,-1.2061600256805915e-8,1.4551122674497707e-4,5.797058648325919e-7,-1.204063541031233e-8,1.45870714182893e-4,2.919007977922922e-7,-1.2019605889673682e-8,1.4631756661427476e-4,5.7383281304037876e-8,-1.2002481688680475e-8,1.4681257082234934e-4,-8.908235910099019e-8,-1.199182771411262e-8,1.4731178048653533e-4,-1.3681974382092278e-7,-1.1988462719314775e-8,1.4777718123388823e-4,-9.589928020150776e-8,-1.1991666707489123e-8,1.4818241807458256e-4,9.827970495226143e-9,-1.1999669866292774e-8,1.4851424057603252e-4,1.4975826284681487e-7,-1.2010174857616424e-8,1.4877150780700368e-4,2.9190903564939884e-7,-1.2020776035974408e-8,1.4896338718739874e-4,4.064988238931833e-7,-1.2029249027716422e-8,1.491076446423247e-4,4.6841038637613003e-7,-1.2033745868534184e-8,1.4922916257107874e-4,4.5938546572257956e-7,-1.2032953779941988e-8,1.493582247095228e-4,3.705242197180493e-7,-1.2026262139108474e-8,1.4952777954767635e-4,2.051005400277564e-7,-1.2013946805018194e-8,1.4976894050346446e-4,-1.904479417246828e-8,-1.19973299130609e-8,1.5010454947427974e-4,-2.6906541765304796e-7,-1.1978814248321542e-8,1.5054183504320976e-4,-5.005400438808663e-7,-1.1961656886072548e-8,1.510667193509588e-4,-6.659267765992611e-7,-1.1949384554955782e-8,1.5164312623254563e-4,-7.269820831206918e-7,-1.1944897119523432e-8,1.5221953156980696e-4,-6.673181911368249e-7,-1.1949511382214759e-8,1.5274192731700445e-4,-4.998737686083151e-7,-1.1962335916114308e-8,1.5316902981055573e-4,-2.655106490847173e-7,-1.198030645635063e-8,1.5348421088217352e-4,-2.266891378647792e-8,-1.1998944827432675e-8,1.537000877768807e-4,1.6834438575237464e-7,-1.2013585861232607e-8,1.538547110431581e-4,2.613132906223005e-7,-1.2020649305678164e-8,1.5400096519828458e-4,2.3581112219275996e-7,-1.2018566303697278e-8,1.5419235863208593e-4,1.0173672189554832e-7,-1.2008120314198619e-8,1.5446908544374386e-4,-1.043344103221339e-7,-1.1992147545698048e-8,1.548482390991489e-4,-3.2985719788034745e-7,-1.1974709621771796e-8,1.5532098094650596e-4,-5.207662508907146e-7,-1.1959996690102956e-8,1.5585716932915963e-4,-6.350241871756243e-7,-1.1951293605787887e-8,1.5641522266013897e-4,-6.511187991959759e-7,-1.1950307300835039e-8,1.569532769257661e-4,-5.697016549164902e-7,-1.1957005001839564e-8,1.5743798528095797e-4,-4.09469379855435e-7,-1.1969906863521253e-8,1.5784917981561064e-4,-2.0015710169451744e-7,-1.1986632887038163e-8,1.5818066995231428e-4,2.4528128874972442e-8,-1.2004482272335572e-8,1.584385964221662e-4,2.3238212408654543e-7,-1.2020894960770384e-8,1.5863886107822444e-4,3.9624199560292434e-7,-1.2033748244121223e-8,1.588046247824748e-4,4.961257588820515e-7,-1.2041519855910776e-8,1.5896414577085214e-4,5.208075434900433e-7,-1.2043387212766305e-8,1.5914861628490783e-4,4.6946391491526275e-7,-1.2039325589190074e-8,1.5938926955830503e-4,3.53541008361074e-7,-1.2030232908600866e-8,1.5971294009466412e-4,1.982741610365036e-7,-1.2018050074089633e-8,1.601357000258253e-4,4.2346553631336995e-8,-1.2005764507559371e-8,1.6065547610377416e-4,-6.653262914643824e-8,-1.199711354071502e-8,1.6124655500583345e-4,-8.178371801242496e-8,-1.1995829366236498e-8,1.618604147678731e-4,2.7237558855628032e-8,-1.200446695222325e-8,1.624361983654284e-4,2.6113543526894443e-7,-1.2023214939678597e-8,1.6291924082183584e-4,5.850389636777833e-7,-1.2049358081100115e-8,1.6328002909722807e-4,9.37029053897171e-7,-1.2077889657121621e-8,1.6352419934365228e-4,1.2479123374621913e-6,-1.2103126439366304e-8,1.6368904604779273e-4,1.4631281062483648e-6,-1.2120552485357369e-8,1.6382956183236765e-4,1.557395384432055e-6,-1.2128060940280816e-8,1.6400122926582002e-4,1.5381144862877748e-6,-1.2126239058948575e-8,1.6424588726093894e-4,1.439208355081074e-6,-1.2117853915445577e-8,1.6458370748174056e-4,1.3096328102448778e-6,-1.2106913755361764e-8,1.6501154402339606e-4,1.200644338827852e-6,-1.2097641160415495e-8,1.6550648589063686e-4,1.1547586852730628e-6,-1.2093577694547275e-8,1.6603290776267415e-4,1.198176070928625e-6,-1.209694831318382e-8,1.665511035023388e-4,1.3375614745420673e-6,-1.2108362039271342e-8,1.6702550418416318e-4,1.5612138983333382e-6,-1.2126873437650308e-8,1.674307780932752e-4,1.8436692523999273e-6,-1.2150349328123835e-8,1.677549195800197e-4,2.152050182706575e-6,-1.2176009110305286e-8,1.6799940801179606e-4,2.4524165413076667e-6,-1.2200981766056503e-8,1.6817724583540448e-4,2.7148658232038214e-6,-1.2222754118217347e-8,1.683099873280913e-4,2.9168866968960664e-6,-1.2239454785978735e-8,1.6842467146592558e-4,3.0452180407235236e-6,-1.224999322944638e-8,1.6855102695086848e-4,3.0968539557096263e-6,-1.2254119042353992e-8,1.6871880126855085e-4,3.079744230574199e-6,-1.2252464324778996e-8,1.6895472067160068e-4,3.0133940896606534e-6,-1.2246598903420829e-8,1.6927840464195295e-4,2.9289893043908684e-6,-1.2239070910506032e-8,1.6969685867088022e-4,2.8677904600524987e-6,-1.2233319274918822e-8,1.7019831718506845e-4,2.875824828445984e-6,-1.2233272151029017e-8,1.7074810284391787e-4,2.993272269193482e-6,-1.224246480019927e-8,1.7129098425295404e-4,3.2394101336393448e-6,-1.2262719249205929e-8,1.7176398102373194e-4,3.5987654038797006e-6,-1.2292867630372567e-8,1.7211809981800891e-4,4.018086806079489e-6,-1.2328398800877828e-8,1.723391427347796e-4,4.420818917734477e-6,-1.2362681188303285e-8,1.7245473153053103e-4,4.734662467285292e-6,-1.2389396409868513e-8,1.7252252726735316e-4,4.917578549027333e-6,-1.2404843785782865e-8,1.726071540897258e-4,4.968749604148368e-6,-1.2408893192054333e-8,1.727589046978858e-4,4.9221724964740185e-6,-1.2404411962237101e-8,1.7300260344177033e-4,4.83048076677902e-6,-1.2395876284086118e-8,1.7333699122422784e-4,4.748210739532242e-6,-1.2387966354953343e-8,1.7374060169450008e-4,4.719717242328655e-6,-1.2384556320964524e-8,1.7417998643729247e-4,4.77276442662093e-6,-1.2388155529251713e-8,1.7461775716833916e-4,4.916710446013261e-6,-1.2399710045232228e-8,1.7501937203030822e-4,5.1438468128633355e-6,-1.24186647572412e-8,1.7535828951289732e-4,5.432860035887848e-6,-1.2443225854658522e-8,1.756192629618798e-4,5.753664444472852e-6,-1.247077258016822e-8,1.7579965373443565e-4,6.07283129609336e-6,-1.249834752183416e-8,1.7590884946030766e-4,6.358829228718526e-6,-1.2523139875377372e-8,1.759661130968674e-4,6.586381943570775e-6,-1.2542883039875933e-8,1.759974500115724e-4,6.739459298134962e-6,-1.2556116611078232e-8,1.760321637278397e-4,6.812845618154416e-6,-1.2562313354106072e-8,1.7609950601134763e-4,6.812603660833107e-6,-1.2561914546371991e-8,1.7622548831381987e-4,6.755770295736606e-6,-1.2556315384687489e-8,1.7642970412317874e-4,6.669448359319251e-6,-1.2547819558221092e-8,1.7672181959903853e-4,6.589129298634931e-6,-1.2539538164845853e-8,1.7709754531837021e-4,6.555409184978373e-6,-1.253513882005936e-8,1.7753484841258758e-4,6.6077367992058346e-6,-1.2538298544744623e-8,1.7799261074736457e-4,6.774298835042637e-6,-1.2551762208519981e-8,1.7841520147040621e-4,7.059131678797954e-6,-1.2576102085454612e-8,1.7874610453487877e-4,7.431432411420299e-6,-1.2608660039097732e-8,1.7894917443968755e-4,7.825953175386766e-6,-1.264353962001558e-8,1.7902774380033063e-4,8.161207083206408e-6,-1.2673296174765145e-8,1.790278108183074e-4,8.37057801926549e-6,-1.2691829535203863e-8,1.7902000252517539e-4,8.429111940731165e-6,-1.2696822098010562e-8,1.7907052731275117e-4,8.359865779353108e-6,-1.2690259514578959e-8,1.792184376056174e-4,8.218710920752939e-6,-1.2677033409507345e-8,1.7946899122588982e-4,8.070217272528202e-6,-1.2662824877992331e-8,1.798005516314884e-4,7.968098174834111e-6,-1.2652431102927129e-8,1.8017678902342154e-4,7.945639373964074e-6,-1.2648941656457344e-8,1.8055783018827178e-4,8.014489469180937e-6,-1.2653594995131369e-8,1.809079743025977e-4,8.167991049630246e-6,-1.2666002492302427e-8,1.8120015594670137e-4,8.386055770599257e-6,-1.2684515636010646e-8,1.81418169137406e-4,8.640136272423779e-6,-1.2706635648062213e-8,1.8155745362714864e-4,8.897929471115659e-6,-1.2729437938407207e-8,1.816247890930127e-4,9.127778918254038e-6,-1.2749994232411722e-8,1.8163698371062952e-4,9.302709168045539e-6,-1.2765766433492419e-8,1.8161856182727902e-4,9.403888438419948e-6,-1.2774938041748913e-8,1.815985642893323e-4,9.423138551089404e-6,-1.2776645313126941e-8,1.8160681506560852e-4,9.36415692920561e-6,-1.2771087603012172e-8,1.8167007529985502e-4,9.242389932513445e-6,-1.2759527269267482e-8,1.8180839374719023e-4,9.083630182385395e-6,-1.2744194260900506e-8,1.8203189191582484e-4,8.921407254932055e-6,-1.272809684680252e-8,1.8233811686921964e-4,8.793234923543979e-6,-1.271472568547752e-8,1.8271007573164471e-4,8.735513832696627e-6,-1.2707603433132443e-8,1.831156226205783e-4,8.776587215035303e-6,-1.2709611967731912e-8,1.835098044135818e-4,8.927979072561361e-6,-1.2722097762312471e-8,1.8384221630675696e-4,9.175500192615347e-6,-1.27439367278731e-8,1.840705475552472e-4,9.474371020128938e-6,-1.2771002906062082e-8,1.841780628060236e-4,9.754616948466088e-6,-1.279667951127827e-8,1.8418683651227492e-4,9.940934290960093e-6,-1.281380356682737e-8,1.8415563603335129e-4,9.98187460304554e-6,-1.281747050358581e-8,1.8415861263877017e-4,9.872544364405676e-6,-1.2807136409084753e-8,1.842552921475183e-4,9.65575714304891e-6,-1.278665574601449e-8,1.8446960989311107e-4,9.401323160175794e-6,-1.2762350921109002e-8,1.847878917819339e-4,9.177921705907351e-6,-1.274048999348862e-8,1.851716145817177e-4,9.033077144764868e-6,-1.2725517880425859e-8,1.8557404333119885e-4,8.98674862545095e-6,-1.2719465951244568e-8,1.8595285565285299e-4,9.03489153155634e-6,-1.2722206457539776e-8,1.8627673471227903e-4,9.156961441484826e-6,-1.2732052732514901e-8,1.8652737698281774e-4,9.323291635298407e-6,-1.2746379558568107e-8,1.8669908398996258e-4,9.500851281252383e-6,-1.276214259667023e-8,1.867974540649122e-4,9.657494220093313e-6,-1.2776296198795173e-8,1.868377674238962e-4,9.765290802188679e-6,-1.2786140679959678e-8,1.8684306967336814e-4,9.803397871508996e-6,-1.2789619363565743e-8,1.868417147083351e-4,9.760610094037025e-6,-1.2785567727151342e-8,1.8686412458466885e-4,9.637324414561794e-6,-1.2773894189412115e-8,1.8693880886411663e-4,9.44635537749392e-6,-1.2755655110877828e-8,1.8708806034181723e-4,9.212124471751703e-6,-1.2732996276901077e-8,1.873239407935784e-4,8.968006164774606e-6,-1.2708946706398693e-8,1.8764524855502274e-4,8.751851247504868e-6,-1.2687053344743047e-8,1.8803613506589658e-4,8.600047003777075e-6,-1.267086308882513e-8,1.884668350213392e-4,8.540750156571121e-6,-1.266327943929974e-8,1.8889688401037388e-4,8.586957156317759e-6,-1.2665841049346619e-8,1.892813662336039e-4,8.7303677532984365E-06,-1.2678028004774141e-8,1.8958055151708885e-4,8.937957777496288e-6,-1.269682650981506e-8,1.8977205698003573e-4,9.154221964303619e-6,-1.2716894887330907e-8,1.8986226816951858e-4,9.312023948278568e-6,-1.2731645634466873e-8,1.8989097282145473e-4,9.3523306591095e-6,-1.2735235873700964e-8,1.899229344963519e-4,9.246977657328054e-6,-1.2724818924541804e-8,1.9002600500419477e-4,9.012639158824845e-6,-1.2701873808086355e-8,1.90245267253111e-4,8.705899735453676e-6,-1.267169944090641e-8,1.9058743747324758e-4,8.400731767561984e-6,-1.2641284800066107e-8,1.9102317062649488e-4,8.161375525659737e-6,-1.261678823134974e-8,1.915028135995743e-4,8.024638131175617e-6,-1.2601877107848063e-8]} \ No newline at end of file diff --git a/public/assets/cesium/Assets/Images/bing_maps_credit.png b/public/assets/cesium/Assets/Images/bing_maps_credit.png new file mode 100644 index 0000000000000000000000000000000000000000..15109db3cd4937eddafbb1400e5cd778cc4cb7e6 GIT binary patch literal 18831 zcmeI3c{G%7`2Qb~eJK%=vPLpy!7!60#?E99Nf|R^OpF<fY$XzrJ|x*A+H6sgDIrUu zl_<hkDkO<MA3~-0jW#v)ne#d4_x=9!Ju~ObJagUG{l4z!e%;r7&GXDTPrU7RGa>$U z`~Uz5S(qE!Gmb8d_ZnVq#-|wny==yTk7Di`2mk_Wmfjpd)+tE<;I|>7P`0+-WGXq( zn@o|lK%rzQ0c0<tFCG9wdUG5Ijt*mM_2vfN8Ck_ep0py{i}T9b8zn@FC2vxd<6C7J zCzszNZr8Bd#Dq)wPF@^mVq)YmaXU4^qx{`G!*XX5qtC`2y*K|n{H#w`&D_g}3zbjx zM=wt2RJ8Hb^9rV!YuIT;3Kkh{Sp6)zrK$P(u==(renkqfinjtM7x-C$19%^ytGh+M zp64dO5%O4o7pO;P*F)AHSrmC~l(~x|@-Rm|HCe}sH&P7P7M5sq0oZ2B5t);*$pOgY z0zB?xJ%<2W5a6MF@a1D5GUt6}I0xW%Qcj#BFBy<sgO4)?yte`u+jbl^0bC$}n3q)( z0_X+-5DRB7bKvqdpuTmLKsmrG2te%OVm1R@;ef{-1%(jca3&yTI_0eU&z7=PqpA#2 zndQ1wiU^Y^H(roGkF&G-29;I|i7jGq%nD4_Huc8POet8DrpUAD2LO<lEY6ti^yiRP z;j-3Ncp^=B59oCr_oBR~=g`7PTM1<w06eEgv@fWEE7nDB<&GpRoKc$O^4=|w7c`gP zRW7ov6383tb)Kdyu`$U%Ue(hxGCbUE*<|E~x#xUffzY_8-ubidhX~zIb2HCwzEF&U zxks6Cy?@sD;GOmP^=&8k4tw^!Ofvg)O<?hp%wzc`3(qPSRk0yEQU65atYg!#^YZaV zCpO<!>R80R7*w0*)F0FWF7MUn2u}tTx??$Kt&~@}Q0rgJ0l-u>x#5WlFK488^z*jh z#kU5Z&GM9hNH2>M{s6GsSW(^aUWGvmF8~<lMX6pklz!JBsaDUuzF}owgTN;b_+cZ( zrbeSxM*O(Q^#LB6FCH>diG6rkM%4rSWSfj;y`6V#3Po7G(doLd9!2CMhBvoCr6!7x z%kU2G8jM_T9Eayo7llM#iOiVyat-EOq6vz!cjLtD<gJpm%%S#29c7)&Wv283Rv?b- zGQE+!^$q|#^eMK+40<xE+)nR_U?r-mP<!2B(=!5(a8zhk(%QW2M*&yY=^caTk3K5# z7U@mWN3}reUrF+4H2Ff*n{OFi(NW_|!QQ_je^IccdEMn57dflrXRvKog1JPaOzQdI zT){@Nm<@*JF4ivFyUhz_*DGqS?&Z_w<2-EFs4SmSXmxedjnyBTBt2o!BQEA@3SFW} zYrw0*<4{f7ilXr-m~z$e6&6>{Id+J4n0ENtD~zcXWow$RQ%Jeni}NYxL7Y^R-Et>p zIA{3Qu*R_Tu-udze~#xi|8wshUZ~jL+iNK`vT8(ggd3j$GjuweW#3<z@3>kkX{S+X zKF$7;-I2mInn78JhtX>-tj?F7NqxM|Tf%#ec<B}O#_Imm4cpTnId|M2GkcZ(it}Bt zpir!MbW0pTMJij8N0J~FEO{xz`hwKs1gREBh&FUQV>DAFlkDW8N>kl0o_vo#)iQNc zs<bNDv8eb$@j$VF)3nol$E2d&4hPCioirSViuj(Sl{gjW*p53$I}nPt79J@k6p|ec z&PBL>j^}p0Wqr#Ab<QsD%ATQ`W?2EOR7HrIoR3gRY*3U|)21sAd-m^Bt<Lx?Q=On! zT$GPMX;^AFSJ+RV^fKTX%J6@Gin^U|RHYz&I^yVn*xSu7HcMa7w622Ucli{jrKh=+ zn3vd<n2p!M%O(nPF4US-yUs@m8@5;~?@~4+B(<*08FlD!=r7<eSc}#}&XlPa`<$1~ zuQm>@^DCIl$i2BcGS`}1Fc4Zh`f>dM@Mp)*q>lwNW`Zu<6@rS~bir0h-P>CJWL+6> z3;iEEl>4o1sPmXqO#1V~$yM#TXFE;*G8H*SY~D4bI7DhDHJ{zYy-9A975X)LGRq!a zbz$>`t=3zuTOK}mc;;bOrdGBd^eJpKdo=rL_TV*-ogq8bXoa-vc#HDkofljuX*GT^ zI}xtuU7U8hSD2ROlqz*qmsS_7E~wg`vb`j?i*W1mKeW5FqH9u@N4mM`Wi%4)0EXZx zLAZ9i?AByTZOVZg2mbo3$0Ky4N4P|0r%XiP)c`T%4&*>q>#0eD1GnF$je!X+ZL8Y4 zHHK(w?r&})<~U?OHX}$7ssf{@;}YVn4&7Hz*H_P$ZtlNRJ8Vgv@ppe7)-jWlU6I{5 zQAocu37;fR9_c&%K=btGTvv_2N4M^vp4pAG8wi|Eh4>6!jIcr3L=h@S6~I_<vUBOv z%h%2a7tdkdO6bq(2b><#AJWwxfDO3rd7xc??asCPHn+&RdtwGr2Nf1^i(!lHKtZGu z2Z1v_$}q}p#r*rQ{c?4Q21q)7w!CM;@K|1zp}1kvq0&Pm4W)A4citQ?m75#QXiaV< z3dh(+yy|+ygL#QbxD_F&9CIYbIo2SN66dn69h$Bc+}?)@95nuDoMt?bO@P`UE`cny zRP~G1_v-d)-_X2a(5&v|`k>P#$Hl_eYCS?-wG8g(dvoy9#PpFDIWGi;!X+}mcibtV z`K^ubVhYw4sf(&1)3#a1ZPz*Zx8W+)!nMbgrq%>2CGv+h$}|$>!R_$&xNg)g)eYOH z%vI50C*CC2XoV`?);O;=Qgv9l=y;8_kad4HGIwp(K3Nh>4_OP1K9PLf->6s)okAnL zCcO08cmE<jrhMVHU&1x;hE$%rJ{89=u5<<Q(~K^>a@?u%RF$WkfOqz)dl-KYkyets z<>ADGihK0q+Na*0UYrnZ6n%bzc0Sh186@NKvi9O$M7geiD4l;ueC3wd9o!dnuOFqU zk~(clCY;mDB5F5<p?#uuH{3haP|4vlF5tvJ5_4d@@9BiQjSJXyuoCkzHb+`tJpO2z z7+oS={9w0AU&x5`5%Rsd%)XOXi%OcRaBW^4USlr@K)G(hX~pR;(}n$ndU~%44eq!) zF*9pI2d6(&p;t%KP*rE^bg$Ro3+}c)+-l%>&hee&M@RT%M}H;e>3hHSN$K#KS<N?{ zbhnzh&-!<7(w#V*(4AhL_<4)@iaCR__~NnmY4ara((NSwi5AWd&d)pw!nCJVPda5f z^c?Mzy0(m)3Ab##xsdZV7$gK2a{B93^9u!vap>^a9N*yF1|ekczGLARpYuH4xKD;4 z1Kw+tHI-$W?T|I^=IM6B=7D~D*Xx0>PiFLuBBwNUT|+IW9q$r*#|}MCAxyO$%Sp{S z5TX8|&x3x37Cwq?9o#EIetTmT^?8TMV#4Uwnysz7rmj<`%IPC(oUc1)T|(|5y{5j_ zT}XLs(^7q^I;*T|mrvDXSZ!sv*W8$Nu6AqxyV}ry)-HB+<|6d^Yp27=bGPSa2G{mS z1So%Qy<goEtUOs-V^g!|-L?tC9#sF4P6M}vzV5eu2lv(o=S{cwnay#>M7J#@&m@VU zRwiX8-H#QD9naO#M<8Ap1biO*RDf#3wQb6kSU9tAzf58+IO2Wh_|w+*jQ0HWsq~aO z(*E<GU)PUIU7|NPHgC9jH$(%v``wQDiH6|5V41gP2Ssd#_sbqsS@iyJWyaxA!F-BT zO3ES^XU6m=tOke<07y8|(S_=Qwnk#fBy|jq?1@(oAyF6?q5z<45JJIVeehISPdtI> zrziimx=vn}h|`mI)<Q$j6cpZ@XdV`TcL>|=hz;|>B5?8s`uw^fNJan>o{EtTA^G|R zB181#zr;l{zArU{<z>Hgq59~_8!inf>w>nGMUeyWvRdkJ5EcU0meoe6L$$QEHMP}b zVGyVm7@`5zfPi2cNKFV*6DIrZC9luV_@*0x^FrDin|>RPVd=?xQ>hdr7#tiNtRAeP zP7WY|p$G&541s}RFc6~$C@|EIiU|Sv1uA?E@;#0*J`fu~q)>@uKiQ?Y7*BE#RZm`i zX`mmkZ}TEiehlOn_>CQdA~*y?0YlXx;C~UJ(X3@8(jS$9RFi#-Gx;{NKMok^7)rr| z?eT%+pa3l1WFOv-s_>_iz+r#Hp#%l^e&K_|g7Ln15<?QmIC<zFPl59N4&;aYm(%#+ z{@2-4iC)W#^NV)L^RF^|2=QNJOP;T?FRAc#g>)JDheQS7F;sGZBbn^0|24~&@1GdA zPfJ-PtAfU0iGE8rRhxCe%%bHLUyg@2#!&J43@sc4fr4NVN2nGOhCo80AczhU0{JP( z*Pcu<(2VTIVW^n@66Ke^%yGy#qF3mDin84E*BEFt(!wv0it)qZEsXUUb5|!4aYzIX zs)^UeX@FpG2n?hNhvPvA7#;({!r+=%7(^4N1I2xr<gfDILK~B@K})H`2>o^I<H%S> z_#X*^)PX}av>*sgke9X>1_Xs_>wqv=C=R3pgTOsKHQ-uUtj70&ehT*6KsEtHMrFeI z{?un_E;z<ua7`#&1FwSzX(8~QAWbbS9E8xu<3Sh=jFuM;1Jyx5q2Gu2Lzv%&GA9Ny z@+tJEJY!_rm)hfi_y4u^yTh0GrG`*20fG3Xt*IyfeQ*9KIzMX4lIF`6M`Ex`)khz@ zl)!if?q6D$PwR*Bn~eDTa{f02U*rEI|MxM1z43mm(*J9yFTMUfNFdpZ8jK0R8xj~9 z^56F6*SNn5nFr7XFV$;b;{U=@1Y-96|1HFS+gJZb7GgP*vECRz0v@Li{+`6&8~)qc zeO=LCch~nF`}=Ox#bJ?N<Ny+es!t?g2zW5XkDv=)Zd@KycexIs$iCzNG#Q82XOx>i zHUCk?`2WrJ>)&tsf%axbvKA&NI1~YggJ9~6lCm7;r+z=hS^B9%GAa%u`!Qd3Iz#hY z8*_h`rOM$O^rgQx48nMUp-Z3Nq(8fvrLL@{Kf9Tw%StCdB2^#uZ8WClpHxe~$H*^G z9T=C6czwpyn46e;+Y&?YzAnZ@#_vVoQr*+h`KDoZ{88w-EQBI{7XIY;Cj6RCKV9H` zsT5yZ8JCZYD_8K3OV{6u$d79KKlx>OM*ovhnPRaAVFJS1WaDDZhsn#v#RP=4$;QQ+ z50jUTiwOv8lZ}ftA0{sw7ZVWHCL0%PK1^OVE+!zXO*Sspe3-m!TueY%n`~UH`7n9e zxR`*jHrcpX^I`I`aWMg5ZL)E(=ELM=<6;8B+GOKm&4<a$#>E7LwaLcCnh%qgjf)8g zYm<$OH6JD~8y6E0)+QSlYd%a~HZCS0tW7p9)_j<}Y+Ou0SetBItobl`*|?a1ur}Ga zSo2}>vT-p1VQsQ;vF5|%W#eK3!rElxV$Fxi%f`h7gtf`W#hMS3myL@F2y2s#i!~o6 zFB=yV5Y{G3T>Q%qgW~-dPk;t99`)?imVz@L6P3l9+oJ&>ObGxYqXFQ<BI7s)06`D{ zc<sS>!ZZT_B*-WB+%^ROt`G}jL&uQbHyQ46JDkK~PY0j!S}(nLNK+H!b5HHByQY^r z{x+@Hm~VJaUUW0>-2_cTO~E&3GGT%@iUczAFWXj68Cf1vaopPht&pl{G(~?JYdlF= zzu0^&d*=2SwN)D#k&!Q;-`eBzwzlizz;s#VQ$+Vd=d3iXB>-&+UMSe_FO=M2>AH9S zyq3A;mJy}aSPQ=Ff+%5&I^~!1oPm)}CldGkrQ|uN)Qik54<49RrHexsaj#C_*y%&r z4D9v{KR$u+C)2^V_iv=HA<b3o^nuW}kia6cPXw~vPb69)6^mBuaQE@a7P;9coSR%< zhnn8sTNd|WDk0=qG%3lt_iF#(KJ)-eIG_(xT^`rZfjJ8!L|mVEo~h;1L8NPQ4gxZ? zr$C8P<=mlmZ4S<;F3BWLIA@AdWzT}-`!(-5U3eW=%=<pI`gpTG>>1i)gYC-om9@Mf zJRwFMX(!vF>ci_X9y*i_l3w9n-66a>z>}Vc-5rVD+N!fT@wF+wb@D{)12FeZ&eu`- z^>)t;>01=FlzsPez2PV(rQ_3h=?<UB#DtR@J5ll8<$8~2jpzpS-R>Sa6TO$6q=$lN zNj-ivy~cex6MD2dbhq!-10A!04bO^bbFn#_5rVpy`LV;3Qgk<x_9p6C650A#OK+LQ zF|*!*R7r3}zi0UVDNOG|!)z^dp?>yV(|)H7_5746+>X_e)i1&}MSi$^Tpa<tMPDeH z2)%M)&nF}ajQ$W>!xK4op6ayPCdjg`<cMJ3+8i5>XU)g7+In|ym^<Blv(8&65r*-I zu+_6F1B*TtwTM=90z`l{kuxS;WSh?6#OphNp~wiSdAIPw?bQy81p?imG2^}cJz_3e z|3o@-SNlZbO8xHsUCDVJG&#tf<=aMcPZOYU%}7Dkg;ZTrE<BgBO~KY@KJ65K%%DH@ z`lX}ecdw3Z*mb&99w*}K4qOBh0ipV{^{r3JTaT5d#$+gw5)KSSmD0xVCFr~nPy=?? zHf<k?Rio|7TOU6z`7Hf#gmt`Ir=^EF#TiF7G*GOh;+kjYBWYYk!kp8jB#y4s5uH=w z#4f;*0P#JT98z*dSon$_r;DKP32LE))ZY$G|J;~pi0Rt$LUl%Z;)59XW0=0o15k~o zlDUqAi<?fh=#{svdmnRm4{%wx^5KLon|DOXH^9#U-N1vJhYbvreW~4kJd+#)D>tR_ zyIbVY+#*wH1}i7IO>s~9gzCBJ54UOmE&un;b1R-_`CePeQLthhPnTGA3+{3A+$Hb} zw<al%x^vO-ANJ-6d#6(6^^<c2E-dt~1S;#-T8xU`81ujG$6dzR8-=u>J3vpG6<;fO z7j$ChG}T`Poe)h*KL<WbC#F+dXJOAublz_ih%`ul=hir2`z-m+N4Q0{zdu4!`ONi0 zO|u=Zg64Odp1xn++bB?^x8}vW{W|#u;-D6{6Uap@WIRebsx&`~qlR149659F<12@a zU<n`6VA#srGe$N2IhFmS`Ic8sL779Z#G@D20sEoc>Kx|>$CsXKw=mgmTxR5P=>GvN Cq<O;t literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Images/cesium_credit.png b/public/assets/cesium/Assets/Images/cesium_credit.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1722b6ba90c22061980474bbca6a435188a29f GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Images/google_earth_credit.png b/public/assets/cesium/Assets/Images/google_earth_credit.png new file mode 100644 index 0000000000000000000000000000000000000000..a7622d822d38c661a56b32be271b815691b6df7f GIT binary patch literal 7703 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 Rvh4r>002ovPDHLkV1jBLV0Hii literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Images/ion-credit.png b/public/assets/cesium/Assets/Images/ion-credit.png new file mode 100644 index 0000000000000000000000000000000000000000..71b7bdf1c993b6a03d5ee7e021a3116173b2fd62 GIT binary patch literal 6028 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/LensFlare/DirtMask.jpg b/public/assets/cesium/Assets/Textures/LensFlare/DirtMask.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53299020e675adea12c23b08ea11f710881504e4 GIT binary patch literal 113718 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 S00;pC0|7q}{{ZYDfB)I(##Q40 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/LensFlare/StarBurst.jpg b/public/assets/cesium/Assets/Textures/LensFlare/StarBurst.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b54ac09104fd1c2cfa60b9445989ca085ba7ee06 GIT binary patch literal 195728 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%0AGV@2|d;eeu^iq@gYmFr!di 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 Ue(pGrfPY{g0^s0K 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%0DUz<)3u)Mq?O05Y3|nMn{x%p?;Ula0o30%ZgN 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0cad64662c7fa9980eebcf2204b25004032851aa GIT binary patch literal 12067 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e63bd63e15e41ae5cc6de1cf5c9d16ce6a3ac48 GIT binary patch literal 14055 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�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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e65f1c78bbe8452384b85d7c668e9c6e2a45fdf7 GIT binary patch literal 7278 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 N=ZW^Fvg+)|e*opc=PUpK literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..605f63f13ae6f7304fca2ebffa0420afdc3e1f8c GIT binary patch literal 11399 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 M%z23(+5O!A0yWH#b^rhX literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..319458e12a338f54f662f01f8a5966acbb26a891 GIT binary patch literal 10652 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 O(89*{jodQtXa5H+guAo= literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6a3859d6c448595bf674abb88bc3c51c7d083b2 GIT binary patch literal 13142 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 I`Q!5c09|P>?*IS* literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6913a2b087bcaab44d4b1cb2a4cf7e92cea59062 GIT binary patch literal 9643 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df89ed220abff86b7a6ebde048cd6427533a1e68 GIT binary patch literal 15312 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f27415e273302f8e68b11f041dabc05d323e8f7 GIT binary patch literal 10532 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 CbCZDp literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce2b06ecb08af6d7f0ed5a71aede2e75d7c1da79 GIT binary patch literal 13262 zcmbWdbx>Pf^!FQFN`bb};u>6vOR*YWptw_t77OkL3bduASb*S!;sgj33Ber_EV#P_ ziaQj4dEVcZnfuqhcbz$B&YZnx&;Fb}v({c~fA6O5mH?D$N~%f#92^{g<^2V?n+3c9 z5a8b%-hWR*0s=zfhs4B0M8uR2$VeVOp`?29nDX&ss%MO}R8JY6K7LHcPRGE+%*x72 zMGNEtvT!o8u(JF&2o3=uAu$m#1u-!N3-x1amjBOo*9v$<j03;{;Nh?Va3A5|J;J%` z1TX^tI0W~z{cpnmhvDGj;S&%N5tEQUxbJ|V1mNP};o;uT{~qAJchG%10RIueV^-l; zgio|T60x~ciG+f)iP>LQv{CB}9{@$IJi<swpFX3ZrQ_h_;^yHM6PJ*bl78{#t)h~$ zimIBfp1y&hk+F%jjjf&iCkIDQFK-`TKmUO6uiw5${P-CepO6SiN=`{l%gN2lFDNX6 z6<1bOBWjSfb@lBXon751bWiWd=-Bwg<ka-c^2+KOc75aT=GNiS@yY4g`M-<H|G56+ z{6Fn~!2TaxkM6l}@0SIi=szwTT;KZ}?-4!$t1#i?SK34$-Jh_Dgc4J|24`2ak+6&E z98g<%43j<uiY;>-{)hIz$^PGgh5i2``@g{cZ>|{t86M94;^934C;*lnq+yMSy%1h4 zexJdWm*r&@N1bNF7kbbSlgIf-DCey9FYJROk->xISk*rv0ijX(*A6~+fNJie+3k~@ zRxZX_swK)hK;L_XC9Z3pe4`MOT&EDPA^ddfI{-BINMTuxJ?g$$Ya}N(65r_P<G#=x zp!u8ZE1Ww(QtGA19UxjSm#Vc{0DiTvpk(4Z4G-BY+_(cwly14%G183ImR_YX+aYeZ zZw2l@=I%^n-PRPVi)Agi_K)?+cKnN7)za+TGP)8dN8X&KeW+-g_Pn?sQyj!0XLbiz zWWVOMwFCKt-vI!{l~40NSZfZ)4&DLEHJog<Z*vtkwhe+^_hLKP!g^o8nAN1;dy0hf zJKX^U7YDB$S{m*ESs$+bCSuMMw$5+GM%kI@9WK+%a@R%A-zs3of(0EUJMIATtG8F; zRywJ70R0QeJAldWqhHL4*0bUgyeqB|w?U|zvyk@W{`<FxoAY~w-){p?3;mrI#dh#M zqgytnLKZ`A9A(iV8`B~Cxwq78U9`8)#G1_%=3OzrNY|`XTK=bj${!pu*cg%uYy6>g zkkvWbjAG8dz5`s2840R5YgtiTlP2su-@TYfd~DLgd(()fWQxlv3t_&kD1SACpunA% zj=g%^J=a~g80evgtVOq79~+OucE&GE1v8`<JHc3`-gh@6!HJ`etHpGu15O<?<du4# zj*X1WpY%j(iAbDaM%+S{#8Ll#btKC(H`Y{}Vw>aL+*p;CE(33=sVb<pHmi2@)x>$W z>!tDVxUXspAR+s7n|VXtXde=>I;0d@-@ISBj7X}qhmCaBE*jiKA2~18x9ltOdH5eB zswI7h87}E~2cU8cAsv=DNNBs>lBjZBrlq=2?APY~x?#zzrjZx4m@bd-+^G!lN!Zy_ z_&S1R><vubi!Ta7=W#bBbIp`iv)rr=PNc70x~uj3@=<qj$`vmrWSMBOjQ%kziFGtD zfCpt<jZVy8@hE(I`T$}e!CBts(&|!o%`@ELKFgvX%d2(qX^GiW5B%`QBJa%@HLb{_ z=nkf^yrblX*!Dzz3xp3F*2gONOzWC>)H5cW+Vzp|dfX3%`cHrM^sENXD}!Kttct99 zHs|8j&O{YdP(AtT(r0|OTKf1SAKjyKsqN9fsz!oReB2cyJj%vTx&+5hN|^0}J9Xa) z%4l2Gk&mO)-WR{H(e0JYr#FJ)<aE>uF5UsmWkCL`n>xI^=a(aU=huHLB<a)AWK3bg zl?#S<0B@3VJ97n%Si*-A^MSUkuOd^8^{9<{WA{QsEuLVW{QLM1TG<zfK9s0Q#vCQl zl4VLHvQ}+I&W<==tAcjKX6?Ss;>>k7j4_)<g?0tRH-I6(VttB}Kg<OFnpUQ<6!Dd$ zxE-9R^3N@*^Ed2Ae0l$QZg9=6BiFI}(b@i!t;bKstvCSJ$3~aPuls^|#<^o0b+$Bw zTXu0pC(HugU{sMRp<O(UdBnUPzv1b&rqMv@%Xu@tA_nxv$HAjAnpG|mbMcTjWqLfl z5)M#1S&niQ<K|xKSKY?rp8Eqp=%dM1jm3|PJC!i@g8|<UvuTc<`E=@amsHh1D((Oj z6FKq6rgrnLx%HiXf&+D^YXIcdd+{dw=QdT7*NrCE*X&{BX8B+LsGo8T7arZi$Xwiq zlKrQ&W#NXS-n(z~y(K*QuwMX1VFZJ6IP9mzTFaUK0h^v#=Sm@vK%q`ucTF9`Q`sKv zG*^g1ZU6C;tJL3O{#Pk^@jR@MT(D0)g9x-cUTVQuhkMeqj`X)LXT2Aq-+Ri(YOf&K z%Xo!<rCekA#&KRhZ`6K9$)lu!+03iB%HjNMxHS2xZfBGT?J5i1fL@_MURFPn1U}51 zF}JJ#;dkC~-rhJPH4N{%hd#RBVdRxNT}dC=5BRw{4`6KKyvoGfbp9=R<hA_!zBt4P zGDiHt?>IzePM8}OoaugoaZ1bE>MB#2515*vECgQU+yC|8k13`Fe~}|$pmXu5ob&ts zHpU3<b+HnWlEkS4xC40lZpQGXjES4V)f59EKdA40xBIuj$q5MWNYU8`zb)OU7cI5< zi)Gw!np2hb%E7#8jRx2hI^<!V^+EBZA*H5rg7w29=Hr2kjoV9WQy#T5_v@%MgL+#> z?wo2McTOa})Z-UAd-p!UmWnJP@Z9J6@0`|Quvf3>ONyQ|vC+NSTyOd&7|z}l%U;Km zZSBU{7u~3XQtmx(ZW~vzI_7yF{9B0qU`nmO{QgVYO3_>Ki@w;@Gm^Q{XS8M)t})Zp zbU$g({r!i?19UFl2{TMwM;aLIi!X)u&s6G~S38JaiJl1BsAn<%x^ro8{dvk3)g8bq zIJK~vvd#dk-+Pqb?S3)gg<SBFjrWAswdP+r_kDA=X70)uJI=3=R4N<iLt;^d7h)q_ zGGPk&_5%I=zisPIR={%%v8hcjfms{MawxA)xcH@gL#IU9Vs`)`GTWDzp2qL0Y>3BO zPv=KZi~93Emtj=48)S7noTW=0duu8)t5Eb=%J;wjMVWK;1o(5qC;afZcHyH-&q&NO zKFW5Oft;q6xPgY!>%Itn&mp@sIQQRFa_ucIkss8-4iZ-hu^W1VJGawz+hkql0j>gw zrhhEA%5afMugJ<iR$m&a9u~bUN4vNZ9)P!O<OIan;%^C$fR?oUlS##`*>n+K3E3`| z-%NRDaHp(@^T<2E-}<i<Gz_U8Ujt4Cd{&m(HTp4uyZd@&u9;ts)~1?6E47f+n}gDw z5_Qfo%thMK`!KZRms2uk!A+V_sNR>wH;X55f#<F3^k0LNdul_I`BQCe<ue!z)t%hn zUt=`o>evdMe&;8m7X?XXq;B{m)2!^D(WfaBD9Srg&vsl&NIn#qPvL%V>^VAl9WYM6 zNW7U041&_^-ngYQe;2;qwlo9LLojppo)kwsm1dqt@mhreYcYb==3}YDykcopD);gD z>+@GfY8N^`h1&!}AeIY$<X8Sqw5y+5H(6N{cDsC>fPL&WN2;xN0Q;7JPmLJ~brB59 zPJVVNk)Z3z)3J6V6A_c{g^2rb-Y#11I(w7JvOz0_cRXOk^ziTz?G-Uox85Cq?!>hQ z{UVn<0~+?DT=NdV&nLw^zkzpDhJqRdDh4a8dzKOi!lCBA%Qtpiw0q9x`bz7(Z@$QB zl9aamqYk8=`PJvJ<TnKb?>Y-nM0Wh@NCWyl7MmbQTy+#h_FYceGVIBg&kB5QS;hpU z5QWS)$=(5$W2JJ_PVNBzl)Y$G=JR%$nyt%M+hA4)n6Std`Zo+wQob_1H+XBzy-4G6 z!fLI9JAg<?Rq?rUlIOOnMY8p>LY3ow08(fGbV10&q79A(5y^)kX5Ws8JlIT%3UH?( zI@#8jT}U*~DZlam>TwzExZ}5LT#bxbe_d(u#xXa3Wa9+DFbPx7{sfY!fdD?d_sJSs zuiU$4|BZ&PrNTcjIJ>k4z1saZYK-6!(0zGy`Agr<fgfD$+Ud6%(>hZ6C(K7)II7HV zb@ZB#);3D$m>75m@UzRaLxP?vK7^*Siyt%(Lo17%IoiLqXM|7D#TZ04+gSv9W??F6 zKimdp__XC6+ZtX}J!gDFC*8e8kCPim__`sYsEZ5wwX)KEF2OkK6X;i5P><OBkyyA0 zg$_Vmw(~gGR#2do@6YpEs{Ca`DeZ)R6j-D5%#?OhQbKk6$R7*y0_g8jD{&rg_$Y-G z$Pw<1HBX9@);rH}^olE2|1emU&==aGQg)PO%f*e$IHYIkPIeY=9CP}&S#4d)=9smO zkIgXpGS9y5HzkG<zJRvmzcXgStq864gq|vDr_&co4`@{g<@S3h7ycWmBYoFIfEmKG zmXm<;juDAGJ363mxfrmP;j!@OxG6s@0Hs@Yrmh`mI;rSkC8C`^VPgDr)`h@vnHX|a zswo$9$`U@xQa^@!_dJeioFt{Uj!ij^I=&p8xZD!G>W;g@yWu(RY;htS_`4h;Rarhi z*sFB!Ube>~0{TCYN0cv^QJ{`X(@pC#$qwsgp<fv`wi8U=FM<qI35B7`juROTbX|oN z7ArnP7=69Zdt?!(Z16lJf0kS)Nb2^<9bmF3ZA3aVk1WP-DMo=VrTb&-o}lNqDO4I9 z`DRPvKBjbFbL^xTppJR5yu0*D3n*rBP1nR;ZOHqZ(S$Cg(USO*rw5+xlFYFi#%hBf z#h{%$?o_NaA78C<(MsRy+u9pb(e#kb?SWLUi<x=yT`D=-pkEJTHw+-`2DVoDFEO6c zzeiMma!O{V3Rf|#L3$M6Diw+>^A*Q8yHj_7Q(d~tr!v+anhFtRyzN!WL>bmN?hT$b z6sso20)2l@V>sx;>LFXxbD!*K1db`CFCv)L(1>vtZ$i5oonCtSvzoaHNb`lw!v<ox z4@GAs@ot~t#*rew41WPdQDJY$?f_LNg>Ra%-*tIrB4+VU3($WuKwzVofK_USSo+WD ziLg~Xd}d6+PLnFo@4Z+&x*~fCcPcw=gr<4uxD^()Z;jeW!_-ZRWlFGAX;9iMDG~EG zr)ZDV-T^38m*>?cchkHMP3Jh(mDqS~Ihz<H==5z86I4$T!viKQRhkp7h#uvnX|3A% zEA1oL&D=)lD1+`-bEte{baj@UytNWd_$Xl`eTHh3aZOfo_}>7%oC}{=u=|e2^XdBq zIgC1&zJ(ZCK2K=7;V~C#c%DBrkEVgiwng9nI#P@Q_p$;1Wrb{Hph_>k&ECmM#3R_# z;Gwsre)xx>bMGfj4a-M<e_wEF2+vBiXV9-G?7;gDK2pZ>Z{60*F^Ph9x^s;E^IL6Y zXMvuaMS5AUFRhj><iPp-*&PRI@NK*{u5ZPn4r+0-=b@n@M#q~I)mU-8`_xdp52D9T zg^f4pX0RU}J%#JKf+(LNSSO1MNUj6*v}fM{$<S@|Tv$71xVizy=%?J;HBcPh4)+FZ zF1P@}iVPDnQ1PwX>jx;r@Jb+SW^du2J4VBZHr3kCoC}nD8bYXPF(i2GCnZd(G}d&~ zr~`Z2%QOST+I4j8QdvMG-JeW}7gH`uM|Ef#{1Dzs`g4%v=jJ>QLf$-~UaBeyN^8z4 z*G3IjP?mjVM8DTk-BsPbIZc4LQ(t_1gV<SQhAWq~!OAA#MEv_-8Q2s-NAdCBA{Tr` zsA@Mr97D$B19xwCf5}u&K9z-=Vy5wv19aB&eO{+EH+3Q3bAyO%iF}Y1|K!s$l3i|K zOf!P9<%ifP+mDpTLI7YCw06yn@5=yAYOt*pMG^d|q6U|LOKa9H$(fvli;m*AweK`@ zE`r7I_{CRQlhj>X_1Lp)c4e-;CsN!L(wjZEkm%zE@19ff{QOOit!Frf9-Z>n(5zLH z;l96132+nD*#pi3-uw^`(n%gg;4hJCYfrqP<Azzr?XvGEz45tuM`SnVQEv{zlYc(f zj@X!=g`1@yAco4mKcVQ-Ydy0#&o|BbPyHv1|4(w7D2C@XA*9C@(wQ$#*<gGj{_tS+ z%L_&-w~?===@-<whvX6Yn+2F|+B|Nx?+|6o^tK-7;d(3k_c8Po{Z9|T86IBY#;)1h zoulTSKFK5%qq#M%AunojEF+-;>FHDB*E$<%4Z$G?D20h)j!%Dmt-D49;u0OM_9)OL z?4N75p$g=D=}nW~GVKdq|FkaFvv^|<i|`7k-{5MMQ$vk{sYliEUjJ%jFJG|bS2QkB zjZd|4ZJcISgKz@8udl{mtL6>(q!^tB76BoUk1V*N;5c%b5U{>=txZrgU4(_CP|x+| z(d>c?#fJZbP1Xmfk>s5L5uPhOdxi{&kq`z$><bPD(Z6yDO*_I9?#T<dOt*<|e{^iL zXDQ`Z0Nz!gIoN3)Aw#m!Xt?ymTyap2#Le~vx7Mp}&)qK+vJ)A}!z8*IW*vcAY#M*V zorJM|w_cI)vfs|)0O+%l1`vDf`MY@KsG`N5Yj=I1<RsajVq$jo^`l!mg&1LdYMvJV za)UcSfz5K?P}tF7Zp2PfrPY>Q+mxGj&<!6*Doi!A2wu$_*CM<Dy8|eEc$Mz@k@2?( zr{uYtuh6w;mwC*}qaPQRGR=Hy<FKM)FN0s@zPIMlJTShx$34{*l*zt(JN}n$0YMHG zuqDuilIF;Zjj7S^7lw~^Ndsd}7P&~3Mo942jud!T&Z5TWY!XTU1sbqvWzUzjNPvsZ z;yy!&Nr}4?YgFZGxkdMnH6awji0qP_K>uV8vxgn5QOWfRM4w6DB8<#6IQn>DvCQ2Y zw3qG!Y*ket{SF@%YXy_)^bCgQ&VL5gsOo&*N-Sz;fj+gdZQ5vuB4r$c$GwH{A<@Jb z&(Qy3RM}_9I~A1NA9w8%n#q*z<541k3-4l0EKH?;oIG2|Fm0&^M`3G)z^(Z<>$bSt z^Z|@jRGDNNL+F29QWTwqzDU7+krnbrWkfhS_Fc&5qo9j&-v?=9*#yLjAs;3-2ux&; z8thprWcE(+WXF`HS+&$Qy{1=dO|hXW_B{lbUZ{VQQpLTRJLD+w(^@mV5>2;6e>0bV zxr2$)I#wZ2ZmN4v_;sUrGRKA&FXOBX)qdPvA6UHf0_|%*6ocsY*$6e6VchZ2?LEgY zC2zcfE@q3bt&f>I^Cx;c_HVThye@X$+*`wz7i5tT8f(9lalZ*kMz}Kp4}p?r#qS4j zz8z^^6JGjqDXfjVcv=`gw@JYqb_OVAbp{D<n<a=P)c1MD$glY=hg_awmnu)y#(6(~ zNQTWDw8%Kh(D5RN$}@@z{d)}GzhYiBP&`c>p{8u4$g167KQ0zpK<9#dDc%^;Ei5>> z3fC>Thg%%oZc8zzeuOl_iwi*>TF!b>#V<7|o=yt>nxvh3aj92QY(d=VIm^EkLKl^_ zsRf;l;Bk28bPmayVj#`5j<o3wi~egWu82^_L0CLfvhHCiV$S>!p);Br>*Y82o@DT- zL^syMBq&z<)3Q;G8jSZKo=|5N>5dwJ&ex~SB94RG9yb~kut}6B8Ih3_J%l>35Q69M zDA0}H<H(6w4sYd814#0bcK~HF7_Ck(%~Mo~oAB6`A$FuX*CwbwraosBC@gQdj>nE< z8aHrVq$U=^>DDS73yFR{``F$nxexpWbHbauJ(0<v^G>rpYPx%9QHZt(E9^BpReXlm zcLy*d4*<t*IYc{Kx7)17<J=<3;O>B%HGU$G4w{0CtE@!&Soa=k%tZp%lsUs#oS8b0 zvvthedf~5kK5=4MtlJYvIx&`==oIMMsu<Qh;>KV!CeQvfN1ww<`K6I2){lSnE$K5~ z?0`V8YQ<BUSABr~foks4`@$n4k8M>Z_6n8HI@7V2yb+^dg4G-}*YJOAAe@iHW39z& z7EMFPJ%@g7%s6MOf2bxwnaBlN9jSuz8_x;j-|!h}4mU{I6JoP<*B`bsrCbgP8c<pK z$ps@y_}Tj|lA&L5M*i$S@t09CZ&H<0;2ohzSMt=9&3hu5$vu;w&OoYFiRtY>qN2SB zdotux@;)W^r?FcHE%5N|arIC*1G)lop|*6381@~eb$+?>z%3dH8Xh_xDO$96TZ0+o z0x}i{#>*q9`}=Uks(QXLoUBbekWG$H&6CmnBM;fd){<D+`yRj-|9Vao{caq1C}C4w zS({Glj(o74G2z|64a{%<O6K_`aJ(zI_YYWpunuUMk6yA2k-yLOTsC4zfQC~ed5{1I zykz8j)AkbT=^Ode@?E5~`#VYXYX!-XuT_w^9;9Q;Zg&tYS;WNXi%o5;8y0CpQ3$)? zgJU|261sgUM|c1?<9iEt0JW|$L>-fB<#eocMD|k1X>sDr_(Znbuu0J9Q6uUL(eM24 z+`FqYnYYJG@Kf<Yp5trIUWR&f3ASh5KcOX+>u-yifi+YatBdxDEY)1S6@OY$utX2_ zJ1;SqG!t)(|7ffNAj`P&y7g9Xelcon^f56`nI+Qjk5L0~;Nj@(MFg?W-fd8enp?<1 z=-iV1<o3H}P6z9HL%Vkb{7NDnup7sk-Cs%0;S0aM{VL}ISckpPqj#Bw*9W=3lVu3d z&UmEdCjTXA#57FpuX}qTGoN~G!UdV$hiMn8P{k;)f5fe^M{phUjpMdO&jdAp=_pji z`Wq3`*haVxX@dbii)F*plWT?4a*Q0bMt(HwO;(_49P#vgduXh%I?g|xk}P2Lum*o> zJ6k6}N9GuP&8MjU8=SPVE}PX6K8h5pC{4#q;o?MnT?4CG{2hIlQw2&vAac3!AaMsF z<l#-y&+WlAL0R$cUm1d%9M23?wNja0EJ38Ni@hE=+XPAtX&`;hX!Xx8Pgg4En!a<? zU>}<`ehG2I<@NpvqW68&Ej3`*!*R&EHYPiv(5^XrNwKM+p8lN!m?Q+?ipm(10F%FK zbjevfs$(C=I3%Dgk)G@2j5HZmMH)dsZpO&aFkeabgN^H}3E<?Yxs3dZo*Q5($lXZX zGYxJ^w|(Ys*2CYfyVW@!D<Y<2J&Vfscvhd^ltv+*nx`NX<t=97q$8dRJphuT*805R z!PzEyH<hss$nwGvaO<Iv4tC4yS#so7o96mv=uF)vV`iVqH0t2QV1s5bUkS<QVbsBk z7Ebtca?K}yuBWbNqi?y!n41yne#=?U{gG>6XZ6{@ENtLKq{VT-lLbegGv|lHG=mSo zQGxn=S(FYi(hGiiJkp<Ifq}kdAbtDH{E);tAlU}qNJdiE7dtme2Ar{q@`_xr&U=gD zhEv&TEAtcfx~AI3^!^0Wx(nU1VT01IND*oxEFeh^H}c!=xH{*aGUzlne^$8er^)M# z!!M$vP{eMpaL4fHH12ZrdW$S#%f$%gnDls7YzTv`H1tvaXf%1eDbZIy^V)_2&F*$h zlB<U>mHGYjT?Fmm8#BcY#Qa*jGAH*`k=bea^M^|N+rq^&(3)xgx%urqai?d`5u59t z1W~rL1uJtDu+lc`b%j)a;gqZ;25wjk`^#d$hgV&ktC1&ZEu9>N?Fv{$61uP2L!@@A zH#=z`t^D!^oA8)X0U+s>FzJC8Qd3BVA>2GN)Agl*(HW_;HF5dZQ^YMXyj7reXghy> z(#VCKjVd9IEZ%L%U>*l`HocOkmeY>}b)l~YP-R9LoVnY?e~oqQ4;q|s)ZKW#DEBV< zxu52;Fa?ZNzU@`ZpmT&_aJJ+e9KQ$I;>Z081FdJd1B+9M-^-AbQydo~-%pp0s{P6H zknF2i=}njgj}-eqd8#w{ur2_?z!0Q>r~AwQ>>_Ms)iE}GgMG2^{>-RZ&1>hxewa72 zANdo+KF<L?H6sMcH(ju&;e$=)UsssZKownT_EZc`@3Z-b&SH|Z0#4qwOth&N%r9Tv zTID#oarM{vDKF5rF{iF(9XZi<Z!e5#e(2q?Z!1-HJ5m&-nS0nvL-ywk^`Se@?s)al z9_Pc^m;eb8;rqif-V)gKE2~Yv%A_BU>DQ&0GFAU7y!fu6O3>ghqi!9=bmOK#v0<TT zbkvY3RJLpPiB>x{Wqy#zl{(Yi3zzDf$C1QBgBxHlc>IC6s>CoQfRIS$4}rc2x)|%u zUiB#T1=%_C7iPEz-yFs}{XWDztADUAR_F?22|3-OPf7Yj$Jj3!W&0vh-vRo1=Y56? z4TBZ*qts??!q|uoHXd@S49p+M?pMz-M;w~36^O3)hNunHBje}3#rv(bvEVze9_*Sw zt$m(b&7`DQ%iQP<3KBjk(`ixe<y{dLTQ$hbwat&8+?c*#B4-o&T4$A-U9k1Qa_@6A z_8(eG3a+6uAo$T(UqZFbEJg+O#%!ruX)krxG+`U;I*aeTML492THQ9gfIh8u7b^ey zYa_5Z&16Aw2*#vL8v6#oTXUx0$Gjp}q0Y+~CN*`{y!)H9%9UQBx8adz9}-{?F<tuB zYW4hR30LdYDJ}CvQ{=yTJpo$t77kCSP$ELfwkbWOrtOixmW+PTp=pvtmc6@dWnsn~ z?_SS`V7Znz+N!=z1;y=^HNcDBum>JegUAp0+P5<@QQ+4=BA*2}mHVWcdfCcds?^3@ zR!rd8WZfjOZsEShmYq|5o&$dsdN%Cy&zMz&htQr8vVJ)u>AY}ZA^k>Ww$j;1X(i7y zV+>RZM1@#e^s{AC6Ynw-BMln}K@JTmMJELnt$Dlp?y-fuRT4xdmU5yqrR|GSES`FZ zN79vkW3=Q%2&3>GJ(gR$f}@R8$zDUtVo6Vao1Bmrqb~2x>HgW<&H;8bL@ninBTLp9 zQR~;R-hbkmdk$9Z9ZV=DQ`t_+LUug%k(_9EgVObAkYT@;C>Onk7Pd>gvn}`~{G09q zj4#1`n^e`2d`@^%FaKKt5fNc|e)TVry&mmL(#na3F*J%;&PmfW=ehOYKEG-G$cmZY ztCk!g&oL$Di%P%F{A1b+i`U3*9@=)e4K-HMtVR(5bLz|J>$+vqRuHj|*ygMzF5j>? zCmUi0%|hGuZ~e=o6ZV40Q2~OpyJS{20#$xoaZA3d*_#70S0DPTj;Z8nunaL26&Sua z<Rp9AG>F~msJmfGLWqL7oS{5qBL8-(CQG&MnB;LP$$NNs67bfXkB}hRvx`X+%+V76 zt&e6FNEsv?i)wLft&G{;fvrD5U*+9z<n91)?S@nk!r?jORj8RWV<?J?=5)Zhja8_e zUMT=7Y~jPEAx`xs;jbd_CrBZPS^hqWn;cMmFgw5-wT~AjtYtU1Q-a1w2E=Y^gp!(7 zN2v?b&?_nMuKQq*si5C~ELWBsofP`_A#dyqr#yHQTU(NB_!$_ASzB)l6$-`pJwd5w zf23)yn_33*Kkkf|O=n(zOX!Pv@*sY=?`YQt81KKoowoMeB|3lfwJM7j&~l}|Tzohk zQwunmg(@>OBYGDr#kW(AV|}<3GJ{;nF>2M>L39nbEhQN==qnhcgPJ9VI1jin23?PQ zOP?;+)G#?)H6WIDYCQ~$^|JlhYUZ_jPgEALt&?VdwCXbTK0kJz=4@Z_B$<3cqxnI= zbA@PKutc{X9}6~lcA~M^&%_JMBLLdp{Offr0p>gh0TXN7!9&6Nc@a-P8e#|WFDG8e zyM^??rPlh5bTM-WA%h4XCG<}Q_?h(~yTtG@YIBk*YKjP9JON)b${tHtf7CoJ_fp(& zKPq%GZQXGoH`_7p7q;e24M{8h*?I=<5~N%1YRpunuuOO&?un8$zN^^{pXRj78~=ze zGNe6AoIdfMlZXdA2CMldke`n0ySrmr<Wm))Gk<J2rjlew_N}`$d2095Jd%YtKBl{4 z9QsBQ$wq6I>=nM*y+657v1JJVr(fXZ)@%atjLL8yy>`s08R6NMnwh5M%9bnMW9!rK z#_k={C~1m9xv$=K`J|?-Srg{ylzLE%iq+BZwe?_vcoM9KZ&AT;zDyI_W0AbQHk6x? zBfFEsM|xEjkw@q6E$v4On?AKnuPfQ>J<n{=(#9xc8df7se~sg^_;@t0#U9)uE|Asf zhFNdMbk;>}kq%|DC>(N{-Ip)%$>~pTy};Sl2)zme>pv%QF9(++=dUC-{LY_x5VQE; zwOpKvtL~mVGyA+rKrw%FB5mHxdFKMJy7*CvYi*_aQb?{vZPK96-{mNDq3ZFn_ETwK z8*>*@VWeP@=>}X!v$STP)}HIZr?crr<UqsJoS{P!uJSf89V$9{z&!E$4Mtu!yzM0W zxHid*;uVI-5rxit5bah`&-yvzvHQEs=`qedlFj?=+(je}dW3hmvMWY-_fp?!{x#M6 zKOcKeoL9Hase}+t8cG=;G(<(wyrLd59qa7&jXs%{Nc=~a-sgc>xOtU+!`SLGtvHW? zJ;0`s;mpLY(uym$2<QT!iF;Pw*g6_RI^|?x&=3N~>Vc3gqc#@w1v1uGO;eZprZ=x; zoZKqbMBQ+Yvp#O?aZK8P84U<6WthPsf~uu|(|l{4dMHxv0G;z+PME@)X!V-GqS5l$ z>d^Ip4iz?^?pMn%FNZ6QA}_wFfFxaM<i{9au~Sf*Z>?sW74RuaJQXK)M@tbM7Y#dG zWJ~T9*tSk}L`j6SmraSPex>R5j5*D!R>@n+U}`!vfE%F%cf9WaQum&vdgYX`ntw~8 z*(cT0DL&HZdI6eY5HwI~VA)>vu$Rb+LNoQ+$>a`j!!}_wUe#!`#MC5J2J%TGd*cPL zls~stROjS2&mMR}Fqh68^UPPl0znr==@X`GJp!Sv=%ADUx9v_+bN)Naxd>EQ`g31K z9`t<8NwMW~#whwvS9lO^!KNT!GZ!^*^mR{R@U-ZwBMlKqX16WhvhKsbpv~SwxkKo< zJbIj%){dr)QEuyHHaPjlh+*keHstdDRMZDIo7HcC1^9WoZIEc;`-ijy#uVQz8NDd_ z-?W2p7K@W?6*N2al&yPUB=d`+OCc1(d8irado}BpXA|_o{<x^IX7JrO@!oE^Y(tCq z8ov?c+}g1@Q`GPcY>L{(lKA8H;w9-?E$ZDwa{_<l2B}&ZjaSbp^TtS{+41uz*o%`B z2h%lvaYI^<%m<hXbFm+be!FLzX}`O$II(kPAZwKL?uBlFvl-u62SWfkike>_{R2dE zw9ki@=-O$;I!75!Yff#!kyz!{=0ErWE^KQgkXg|7D24*I!#n2Vse=2nrf7R#&-;Oa z#JWJfvHZt9r-HD2ol=J}NN$iSjPv)LujswhsvMXuyhI)f7*O~3_htxvec==Z<9#I? zI3B28Q(1fbRH&28@~j910zEGj+0(veR~TvDzIqYasmRL*7PxBB8iy()5`KN2iAu8r zM<uA%HEFy87C+gi)Ox3<bJ2CyeSy*;RLIn~x9>KUD*tH0m&A+io*YjChiNvba@4NE zO8frJh^rDAlA1D#-WTlErbk>1ws!cVf~}D(M??t4GSlK8?MDocDPVu8LbB9WVHO#V zyaHE))<#{kDeEGtD3gT#2hWn8#rt!@o5Ei)r|bwR`R(h?d1knv)_A6KP3Owf-tW%h z$tOlhuZ?EM_Q&D6k#uXQ3=sPY)F;HIb7sJ+Ll>!OKlWHqxvOsuTHo-!en{LWOW*KT z6j_lEouS{h0^*CrsiN{l2Kg(wWMP{pF!)#vmT?m4IO!=D^#iW=tj1uTt!A8*WR4=h zrY4?ql%7BJc5`r9J&4;}NorNQ_pvfau7xhnlmK~b<719`R5s%K1a(>}8~wT0snzgk zs>n4ZJnAY?zrj03WleVNkN$@h)I`oFpg+Fj?37L7-j{%Jt4~bWE;|R=AK924+`P4o z16WP0G(^S5U@a!RoH}b=^l?{=X}RN{7!1^ejGO+)rSI=IKz;sMVm@dt_@rQG!y_yg zq0!>F!|>hGjr<``98Ds~dbUg%@ASF|w^p~s*W!8tQjII}dAXL|qmG8_a@5(b=4UK4 zeNdn2h8Hy>V0?SNz)>+2%n1jo2R*>=5<ceqAwf(^F4U55;J}hXee{~rZ-e$4Ho#Uv zuVgsHFz!$Nj5*MqA*SQ7#3tAIu_h64e62oy>RS|S_WZk)xXyTTzb}TgoY~}Os!!;6 zY9&#H^dMGWM+o*zGpF88?dGAA42)ho#yF$KqgGBnE7MCtYokL1DGTm7D^n>?`q8?y zD(eF$apefLJerI8f_=5chdqv}n}BO*t4hGn9lhVf`=0fCB@K}BNgSvS4y1*hCbIG& zLU;0*LfR{LPZg?d8T?(RVjM5k*If(<zFf6>ZGK=keW**J-CbOz>{y&vE$q6iqy!1L zJp9i5&9=Hluyd6$BH*t#*Ebhq!=yFujWjGrTnFwBzKkylw|RrDT&I8*b`lT*?)VX@ zI~3^@@rZ_6uPSJhqz9G%lAb6Vh2YJrOyWxdZA4Z*%m|a3|AG?(kaL<x^w)^X%7|&t zOJ>#S`Uur=Nik(bE5l|~Jz+^s@oY#AYx4{OIk^`@Nr$Gr92Y;)7oHt@8~qNzG@+G6 zciNBO$(GNP=>`#;9EOOKng-X=fy6?;quiv%hD>`W!zjKez$=A(orL|YIBup)K0|XP zWgFA)%BM3|W=tIj>nhNDO($<{%`*W3!uYx#)Uv_Og!n_w{nS^Ma=a06vnn?ruP1s( zbOr{J{IlCc1Zpt}B=-%pXWrOWJxb>Ivj{hi!Dp@Lo_mTnO6>!L_Qx?+wCXNWTd}cL zr>(p>R~pA_@F^B?H1V!@TJ8o$8W@1I?$uRX2zv|17vD~l9;lc+`21x3&)QY&NJase z_hFdUx)%F4a;wgd|Lysb2wv5FUiyc|r}IEPY${Bk;kZH;ZELSojE#Y5egEKqjn1T{ z^1Vf>2FM7dh~8z~HY3P+RaSMWVi73?631Wi&VQ4z5u5pc0b^d>dW%^}Z5Y@-rvY{B zQ{=yVhFxM(VDdCDkPgOFQ4;I#cZ=R@H|VN4S)v=e-W*jdB^(`V@UT0xyT{6S&dS=A zmbwT%1m?0|p%_BImt&(-eRQSHSSv1eS?~SW_L9W()Ob9q(uQ!$Rld<}rQQDDf>PI8 z{WVvwGvUWJQDua3j=3<hK>LwAyHXt&gkYB@#Rro@*#@kP7ESTGvM}$Hqo}2TG0Vy@ zTv!iAr2zYzJJTCRpC216x;Wb;B7U<L)v?~Y6r}k2C<TPajvKgAUcB3Y5y>U^xfc+k zwkdta83(cqj|Y6{E*N9;TQ_hf;Kf}XA}wwBX)nE<kyc0IgeEAFr<K-G*4{Mp>(NYH z{&6K-9~?7tT}oM{DQB!|oETP!ZxCidvlH&$(j*IzYjR8+YNSBa`><zIQ@{B4PF`L( zecaW1+=t4R*Cl&&P%KvvJJ_NIKQrH>vu}?HpIj)AMlm|{(L*I4o5nj;=tMn^qK@AY zv>&tUdbA=n#3vC%LiN}Bn3=zojog1JP{-fZYmE;~d4<t3skY>t{+#&W@y+mj(>5=J zRn=2twy-}heX3Br7a}4`yh?<Xx=24bfr-sxlNQ!F9}BN_r+diYsxltl@Ma_>Xb2O8 zl}p?0$O$W-#f|2enm#4-P)EB3Ov<y7>s{!y+?ONF!ETOgGnpC50s5UTOjG^#pn#3* z%YaF05N4u?c^@bIl)>=#oTE14PdwkZIw@fY7rnf0Xlz*s@6xU>cdfD+B(>_|&?1-| zt`=i9T&dZ2dJ7->TdDpk+jx#wP!+Du?bDZJ;d3t?qPCbnQ=9XqDLH~5!!$~+rk`0V z%ncp}1<Bn)HuJ~6Uy^?xFGy9v^t;YY(coR5=6&Zg;N1H3E?Opd_lGRkyIU5Di4>8x zT!9~1`+_2-Q)xB!a}7R3x8VmRYFBY+`gb)v%_I18FP4>5PYZvTsJn6(+{e5pkrkAd zbb2@vG2s~_;%%$nT4h(+v$BgT-_Ao6Di_rK8F=iNeHZ7lFvX05`e{-}G-w<ElcKZ0 zSee@hWh#o%{olCm^JKRHHa>d=u9rlGRB3NCQbkS0bW$)Pg$$mWk01o@QK4BICY;Zc z2ck)rD5n%MWqKU)=X#4MWXbf7ApQ1lbENenH;81%S0%J3cUsq?2tiqW6Y)lR(!wPK z=lk#LtAvRXFoA2A!*=2B6=*uGEKBC>l81=Fl>SNy_iFdFLS$MRrwvD<4S8-wHV()o zLGeetxQu8_zEWUXAH;9K0pt}F?|k2m_eFH-v`a6O(5MWs*<r(+y|3|;I_!XA%aP>8 z?tBJ=T_O13*X;W2zk9hjTw8ub*jV(f*Rv1&1>#H3Jr~NS&0P6J<bjMYW!Ec#$)7Pd zKUd`w2Up0V^qUmD_C8v}kGpz*yi<^tLes3>tF<?@d3)@=nk`%Zs{B>7+w_guQcmj= zvoG3^ht!4&vYKBR$687c23+*NgA&Lr=oRLg8)OQClB<v6uU{W(O&evUGY(EvZoi6} z*h1qZ@q3+=-Zr<_S3dVi{GB<zm$eCsLQ!7iyZh~`k#rL}3>Ei?<TCJxXS=#k>Dnis z5QUqkTw{{R50fepBX@u>#TPm$voexN!t3GK4V(Zw_`GJ#p9^p|;Oe(Ea-v`XMiYA| zb)TB(?b$|kuq*V@l?T_BN5Fr<ewF4M>Ib#F4FDIwUd?(!T3Vo1i}J00OGhDeee;+h zzmpUA@JA<iZ~mhvXKu<|?Bxgvb1qG1s#>E6^UkGU#JSnYQli1H;X8oJlA<Y%Fnx5L zy*J+FEyUusSG+;;y<j*0+b<r%_qvZPlj&CukAXgw{wv}#`8!52;RgdowJ{1i!*o5^ zhB(caa@`87m*aIPuzJJOVkLZoWuQ)9Zw3;ZHA?vNPp?Ed##Hu<Q6b-~7HMQ90L-Yu z>Dj*ZaBRT)Zi|0BYzRCyL0D>H-57$FBU6K|p1CsU>W^sMHW^0>O4`9#C5%&(=xz1? z`g2wpSD8FsQ8~K<_`t--l$3<^+1`(GP7S=I)zmv!S}mv2IBM-DRQuS1GoYj}$>7U% zFJl@TW>;H~uqEzXmG1T{d99G{$wajMekQK#bySAWmg7IIxW~d-CVwME61e+Q6G9=l z*$Jc`5l#Uyh~L{^f*#uSyG@DZm6FVru`fNE0qYU2*?6PiD)dph^%-fup1C)8C|D3E zyM;S4kY$}!YRVPApVCcg&7S@Y;iYo1GX4oTg9VadQYGK|qgb*!#EH!Up%6zi4{7Or Q{d+fdY9K(zemDKU0L;K*x&QzG literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3c0312010a8ff72e5d03f840ec730869f9d7642 GIT binary patch literal 8157 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3ec3215035c09e69bb908d948cf84ac199f847d GIT binary patch literal 9307 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b59816c01e1ff2e69ea11c313a197a3ff69e7c63 GIT binary patch literal 7891 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..795f21227b0e8e5b2c0d91692cd02aa669b72888 GIT binary patch literal 10341 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 RwNhq1j%MvZnd)}#e*nPRmC67B literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..822b0651461a786d0d389dc6d5677aaef22dfa39 GIT binary patch literal 7852 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dd18ea4e04acb2ab6f177b55201286a4f3f1ae4 GIT binary patch literal 6850 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4540c7c9418013b85a24f431c468945ce8aa878c GIT binary patch literal 11581 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32c6e5ae28e354be0e2bc54ad06cdd5421087c4f GIT binary patch literal 15862 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c390948178866dcbea9f05c0726c306ef073385 GIT binary patch literal 10657 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 M*_KK>`gZ!i0SZmd6aWAK literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e7abe713796c195cd9b2fdd35bab1a56d93d923 GIT binary patch literal 12456 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e0f1e9b196e078a4f513705e50309bf3358c4cf GIT binary patch literal 12262 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 J*6C*Me*liy%M1Vj literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..732c32f954742a50ed13b6e2411fcd5ee6826c53 GIT binary patch literal 14940 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 F{a+$VI>G<| literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..576ec70e73593bd2838014bb941e5a0af455f10f GIT binary patch literal 9531 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 LFYq;#*MI&SphA6C literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6347041f95c17d40e9d1003e727896eb9f173fcc GIT binary patch literal 10234 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 W%8nNzoKGv)PeMBG4$7z>kNyu9Ah4ML literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..300aa5803058740c23a2f7feacdffc885fbc0d59 GIT binary patch literal 11678 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd70fcad165330997fd48ec799aef92a95eb81d5 GIT binary patch literal 10754 zcmbWdWmHsO81OrUfQTTeNDL*7bf>7KbP7lfAt2p3AR>|@4MU7H3?(^q!_XkzAu*C7 z%`gKm|9jt9>wdcTK4+bCKAgSw+P}S@^TdAk-Td7;;E9@&suBPP2M1tze*x~60IvZL z@b3lhzbC<i2LwcqiHHaZiJm+ndH9&}2^A&96AB8drwp`IH1sqS6wg_o(=!5@nVG3* z**Msk*cq6Znf~hp=K%o$5g`#75fK>^H3c=(|7W@D1dtQq0B`_!I4l5MavVHzoV#8C z5CFh=a6j7r2K+w-2Nw_j0RbV=L*hsG4eFl&aB=YPaPP-|4{+Z)`2ITppZoy@v*0TN zN*yag7I!M4u!LM9R>kTrYTaMQY{J$apC1y_Jbgy{`~^D)Cl|MfsF=8fq}1y-Z<Ul) zRMqtK4GfKp-<yDJZ0+nnIyicIdHeYK`3Ho5iTE1%Eh;)ODLExIEj<I8mtRm=R9sRD zuc@u8Z$LCQHFx*)_VptN28Sl6re|j7<`)(>es6AV@1Xwd?)^JCJv+a+yt+pJ$MqlQ z|C0Y3?Ek?<e$Rz_zbyEK|8e2q`rhAo<oFMm1qmo#=@44EQ?dw!5m6~7<W_e*WEIvu zrndI@MNGpcvhm{Ie`x;~+5bDR&;P&3{x{hF;aUWc;Njda9v(SB9<cFGHM-_K*68+{ zYIM>bfj!|lAWLOlI#gP7%%lhmd5z&Ba@9d=v+%V~gBA;V0(B2vUB|LRV;HAFSZLDY zKk`yqnG+#i<$~#V0K24HJY8^39SpMnHq;(N0J(ZB4KsOn^UIR*7EgIY9TxEJW)er@ zEFYrg<G@9t)eY%RjRxGmI(2WoVA%j*X#O!(YXDTv!VuGeJ_EoafD!z|*qu8-I~aWi z<G9Scz5aoBoPV6ZeJ-EEfl_#MrE{edt?4lT0K<vl%!>i&yrnXJj4ONx;6<YD0CPpx z;Dg(G-@&AxzzUAUwUtq)AzP2MRQYCkVWsJ^-$L@Avl}!A9?+12q#bW=_5J-1)>0gt z(<VZw+RX~iL_A{BM^3;Cu0xPo#3dQ_)TCYgQtxWgpS2k>h2ipmqz|5uU21KsSl<C` zZVjroV?iI$ItT_<$UlO3?H$3^s*A@Q$>2t(kF}e?7K<MRtATZ19+84E+pr_x5QOs% z;B`MkpRU`7*52I#B4~Z?0I5#b;PaAgpkOqJ5mv}(al>&^G1^{T0p#$G1$Rc!=Z;xj z+usx=4Z9w}h7dCIPpi`I0Kvo#Ee*is`&laW_^~7CBc5BZWO7)tL@LgS2BS+mTw}2_ zhIfEa#Fg$;<IxSR#AQCjq<t}lLU9p!&XRet>)F?;m>ND^x{bIrJ;}Ga1Dwx%ZEdl; z=`#8S0?y_+u!GyTAm|<WA3q5EU3XOsB6YMLKwL4tR9{FjAyk0T;>ox=><{c}$mh7o zDWC~~Fc2l8R}InXj5de`u7AfqU}DWHe-v~F!0#yJPwZT01$X`g7XrN8chSA2?b44j zp3Yd=0e_Tk{Hk9Fe|B~~w)&%p2=h3AAUw}}S&6N2ie|~lDz|B}Q##le7dCua`J11# z=lO=njduDiEhGQdWB+r(BdPZcI$gzO_MwBIGR0nXTd4%3Abp5mNyEw$O$j_Uv{5U6 z_$L|%wj1@A7t8r08BjSXo=8HV+4RImKHC8H7}G?XMT6X?k?2*d2ic~o9e=eJeoM|H zXIFP0;4t(B&%*M{kc@p(pLWtYQ6fWi=@^Ik^EmclvMSfvwuZ-YW3<n`YHQ=|Z$?S= ze493*FAJK9ao=~b__ABOW6C7$C~r7R*7Ij_6hr9tqX{!hjFq(P5^CiCEmnB1e^8qz z5T6~(|0|Fbh6TSe&+xRTx&!Q=Wj;)9SclNZCCY_E3j>%_G+GyJ%ejpn(C{?@6@}ji zhg5+(S1d~}Fj{gJ1Vtw`R}hVFq<>$op`v4M$yJ7_EuQRF-T_ujzp!EDT%4L$9IW$R zm-zF_X_xK{87(=M>1no<yz4peNvnl5%QU`!c&|a9C#vfgo3S_>oW*wlQg`+B;S4=5 zlP@I7I@?Xit;hOFJx|>Sx3LZ5zPWaaaxKY5L5s+!=|hc|r{GJILv2WpyU0?omW6`y zMUZyV@WYosJ^zOKml+T32ZrFczIa-H2cR4;I=;;%x&wT0yv=-}2Q6CEtOzw6^T)XZ z<fwOC+qJQvbmnmACh<8Y|G;)qGTj5cFDqH<T>MWfr$hWr8aMY4w$zt-jKokQXY9!7 zLdELCcj7F@HVitqhQP1F+H~rM+o?+Erpg`XkKJ#yuY6`veq+vC?+JG(U=9pBd6C1% z*#)m87#$Dq01Hl4`$9Uc8&~<6d%G=)7U2@Mh$tl%1m2prXdbL4Ho%p7Zq3i$DCI*$ z5zH~4jc6eZIN9{z{fEz$#z~=oF{h#wV}0}8aow!a4!^Jp7y3Iu={Ioa9RPjC_vH(w zOJ1r?v{o^!^(^Qdj|tKlhSuk!hf}4v(dDuNusm<_&<SwnU>W$9=NbI3i;^Vm**>N$ zVEonW-wD~A3|}eAxLrDD4BDXM>P@Q>+31fI1O_nO^vc0Yq;P&~1VCyKg<c19Lk2(x zJY{J;&3#Q+RHVz)vO;f&U-?ap@|VLVL?eQuwrFjK(=bqQrQ%oAmUsn!>i&%11#JZ( z!ce}257MbeLPGfHTFkMWCncp~E<>CQ{+;`kY}2!^)Jbcs7%mfb<Otor0r)8XC(p$8 zO;IU`Vpm2arp6mB036VF_7{RR4j&nLzltLNSz8-O0!`Q8wc#BgyXh{l##XD)6@iPB z0k`@a-lXzzkQ*8OvMm+KN3ctWpcL5`?}FV8?0E9`VZD=7N_$P{Y158HN08+mfV?WP z`V7Au7dwxGab!<@HMvAJ8in0d9+DC)Q%MwqZptX;@71kI>0Ew>{3ykAOHb0~lx?v9 zMceKGGI}4ZK+VSap0|@bMZ$;xnaySX-&~k4iZ#fm<cg)YfBN2-%&SZWLj?{mGd~WZ zp*55F!Rz&Oq8*r1$O&B42bWA}+Wt~ac-O!dQTttNnpjH_-UKW(=lK)>kJe~dfmbkg z`NT@{y3A-T96hwq=%vK+FggqEt;BXO;D8dfL$&7cFiy2gM1Q7plf8m&><YVNWAy9^ z)*KxG<N~ZW%fNAtYXduoen$Lt>KKKb^@6XwLL>E`8eY9OzlNfR0(Pp4CO`d(QTE?L zA@FZgV6_eXIlpAjBtM>gc<?=2-LSo5+*qAT4^s+?)ToUssGa~JqF?&fCDh{Vsfz=% zT^nGo+rYC0o6EO4SDw)B>9Y>f<?erbw7StY6f!U&oHZgMjy;~YhYa}~w%fN#t_gv| zVEI$p2N#h%bm6uP)3G6z?TY?cV7~?p3#IxSGdnWeMUecyO(F@*J!#bc%iLkn-lthU zs(&<Vz(q?6F)5NXg?lYDoaL|Q1l`y)Y`kXp*+WsZ<{5?=4G`#3R}Ln9_&dM;-sSw8 zh2@vM7=uozNDw6|_Cm~flFYEkKKqZf&LV58o?pMaqs71`rw>>wxLhl|k$4)erNg`* zl&cp;|MB<MfCfwhKY4SPFWj4{s7kQ*Kbki9k?EoCZyQh&BewJo5EM&1JYEKt(kw2; z@DzzS^lU_Zfsa{GKHa$}T-_{{S8!;P$9lP&(#9{Bd;F@t1B5+i6Zm-pheeHYm>1ju zq~3KLBW|TtbH876ulc+>lgGO2sFJSg3c?H|InK(I$HrGNYETEerNnvU4J(G5*I)?F z0ZLWO$1X#&lrb8}>DZ~7;;U*^1P60RAq~Sg{N!V?^W`Xingw^@7B~)g%<ZpcW#;?i zwbspa&+WhB2_IjRTyhW=?f^X0FCH#>lA@qww3@jM(bGM&_-p;S6pJnkBTH^Cf?A(B zCVT;}Vd4bRksX`*EW&sRUC)Z>{Hu|;g%rI~iG)8(>|4Ju8*itW&KSv$=uH!!utm%1 zmaismg<n4(Ph7nXE@N5xPU=pTs6@Cf42@QOnezeeawIs&S7!<AC2q3^g;dwpWr~xq zbc}{yf#Y5}wFp&!=sw&|BVrCxO)Tvibvqn=e)9)0g4Is>lvUKZhRiIg(mm8gTu*_+ z=c7K&70Bo>kmnVxm#o_??AsDYbWFFPU9)L)ar8#Qmy<6`kc4i|%4X7n55H&Hd@;0x zritpSZCEjZm!JD;*aU@fwK6Cvh-3-Pm(lt{J@ksQh=*L>%Zhj>f%KumXQN))eu;)t zl`$soMV4)z0hY<|&$s4;q}J)7XS<Tpr98%`aLzJ`mgNt{wa+ywup8=M8Ix^8QKA#p z>~rVio9d@HgF8uX=Tt%MKPGS*(UV)hQt-aZbA!|=?f_55f6(SzGF&$6gvvTnx+904 z-BLeIKOo&<3ecBiNwgWUO=#%vCDYN6v&NM7VjYFqe}%4vQuTQ9YZ9G_igWj7+yNvD zR>n;nhbppn5xb)@oSr8Vp8|Xe2xn~qr&R6$j!97Gpr*e+kvICFRcJ^ZK@qb<WYubM z)&(`CT`7@+D4lAwd%<55qS%2MIu&ecIi?+!E!c1=QS8Q*ntXxWc!%APnLgF{8I%Fq zMTn~XJ~0gxYf3N*kM(~8>&bDfvV1Xrco`k`SC`klWO>YekCZ2={ojkW)?Mn!@|!L; z-cX^NPr51?FukEhKf+1G+HWiBwcyFRKwZ<tMwsLw5~Vk0#GmoUq13o9J5eNk{ZP6I zJ~yYg_LhxipXEpwz!!V_OcKj8RybG5XZ5YCK<ZuGsY*ti;vJy&lpZ#mbzVvs1^O<Y z!CJIAxsl0sF>FaTJuT;Ck?fRu(IhjA_+_T{90hvg)@4KRLS~b>Hg;2n7><rFrFDwp z<Fl`eYp79t_H+}Tqa=?$*Vf2i80YJn2|{|v`3+=r-M%bwle)J&pgpOA?;qHjT`FYC zhffC*uGzpfZu#;<l_?MPQ!0w{F(Z3(+VOXQXv{Y#pWFw{J@x&-Ode~nFFnZJP-guI z*;IZ#J56)L^}R?zdkBZMNkU}s$gVkUv<a$Ou-mM}3pRlu2--hCah$V{;^L?w0oBvB zNtA45x(+pQ>}uDvhNC<o3W6q{J}fJP=6j;juU%YUjVjJjN_65V?`!HC(CJ(1{w`j% z{rHWzma;MFykO~%prN43P&hyk^at+7?f=POKn$j*ilCNHz7NZgvyd0Hb5(^jxb2)v z@%`ogY``{1A)_wAb~;Rrm!*CASQu(16fY#(ReDiGHY9vI^Ku67DCEn8@ZLBS+7}t% zZ}pB>uKtwsQYA)GWMvc@DCUq+@g#JRqe5v?yh0M1&tA%G_TlgyA2SD^(qBgn)J<Kd z6RkT^^x^yVQxg3hL-T}FgQAucWjDf4224B}BGtitypCU>^{o^~9bc`Ud${l+2B>nf z!sc?arV�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 E1AMk3J^%m! literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eabb83c797f17f2d050def7490a89ec0dadfd923 GIT binary patch literal 8474 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 DwUaJM literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54e6b007638c5635711fd66bf0e865cf2d293713 GIT binary patch literal 12265 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 L57JeI-u?a`tsc*t literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311241c8d8dd68f5e0c9e6bdd93c92450720fc7d GIT binary patch literal 16477 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 S3<^Viw&ZU<o`(Nh`ab|^W_@h{ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ba398c58a3c086277da6f16260bbca71dc14813 GIT binary patch literal 11888 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e03c0c07743e7437915cceb6871f85322851ffb4 GIT binary patch literal 7540 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 ONjPipD?QNFkN*H+1YbM= literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01a1caf81b392c69579a146845461cb84fa24c72 GIT binary patch literal 10274 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 P@U#|km?501Pe%U-gjnYn literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..372e3ef5b9f10ff2becee88d8d7f63da3df80cb7 GIT binary patch literal 16112 zcmbVzWl&qu_id13rBJj`w8gc!OMw<E4#A<gTS#$-BBdc%@c^Z`yStR&!QB%`@!~~F z|NNfLyif1FedpdU_sp5I=G@t5uf5j&xA<=p@LW|<MG=63fdR01ya4}J01AL7*pGqr zpC`_fCpdV|@bGYP@t!{=#D7NioScmGIVmam3p#3YN?J-%(w9sxY3UhWy?RAX&CJHk z$V$ifit#^_U_8OW!NbKP#=|3Kq#&hW{C|#rJpd9s3;+fI3*$8alLP~c1moWTfB^u& zc=EW~|19`_1O_G+_7fajJbZ$uj{_Q?128eLurMFj{|Ml5bkO5_05-`J(pUU)IAq$E zxUWIv0%3`HcuexOy%aiAznKNCJj3w`C|^)fzhq%$W9Q%$5*85^6PHkU_g+y+Sw&S> z52$ZoXk=_{V{2#c;OGSY<mK(->*pWwIWj6b=1Xi+^0$=KwDgS3ANd7^Ma3nhWp(up zjZMuht!;h%13w4hL&GD}GqZE^3yVw3TiZy~&Mx}b-u~&?`Niec^`D#D|KR!$&i@(z z9oYYYi{ud(=Hs?t<NgO12By#BjYWd}<P|>-shl>hC5Y^`Ko}mmd}3a0FFuo?&Tk4U z&nW^*W}z*X)BiyGZ^-`dfQA2mA^Tsz{x_~=03jB}<K|(J0Av9dYg>w7cqhnQc<Q+K zWw}{~)x-u*3rW2Dd1hN?DNweXR8ivj4XxMkT|U<8Oe06NusZ4S@)ovAB<DteyTWW} z0P_365n_DjtTKE+zUqrPqAEUQk9zw>Q^EGaz4-1;X~k}H)E;wt)197z_*Xx*(|t~^ zn1ZInybJ>6V(gbzUc>0+Zo|NOXuQ(O{nT06X>fFnug?0QI@3|6?$E1{PG{!!RMumR z!JxnA(`_s!e$UH)z83q1kIi3AJt_4*;JZ2X_c)u#A%TI7L7afA1M}9cZi=7VG~&5; zLd)qxI%W~&q~g6jdw-ob&$;UgUnW&tMhADxG@r}lK7m9k59UlCs=K>&IWs3Eq0oR+ z<HQxZb|x&QJgMpTj#pol($0QB8L-5!D%t1qskVlWxqik8PJbI2wn;oXm(lSM0EIg< z=}dAP3^cW^^;$D)Q@qU&^}C7Rbq?O&moyapSoahEmBLW3pERx$BFiR`^Tu@tQo^(9 zLostt;ky^Im%g$bsKjQumC|?$%RD4YBn*Qtso1Zt1xK6;&kivsb^(XzK<nl3*FTtD zXF(AgtH6{Nl5imCuQO-kj<L#Y09WAGLRCKV?F}8OBP*x^Gu%y6VLrbzXPK^yyw$yj z0O~jfeQJ|CQLenlB&wrC3o&2{B9+jSOtEW?XK05EBJ)ds3Vb;Dk{GxoZXO5aKUvQb zK*2z<)nreyz&7lACq^QUL(T7-GT&rPeCuZ`r^hcMZ*k8eFsMDqv~eo93Gi%TkwYIW z9Oz@~;`Pbnql*Ic)xI4XSh7BNgb-+Eq=!r7q=3EZj*U=pHX7x-gz?pdI--e!-$jzj zL@|L$BG3NdAold~*d}wGNqzI5G1B<RUbn~6uk$LXX<Z{!tLcl2q8*lUeW{mbbAr1c z%AiPK!{;z}PQ|x~G;SWm&BM0<&fF3Eqm&D7yi|a#HJa^Ok5V?2VI*@o^|gE5(%LX1 z;Ir~ezHXg<hE&Z)>y1BiF1CGpU|7)fXrsxg7?Z4m=CrV@z3FR^E3<yYiKHpHlDk~w zFr9DJW!i#XXTyB%LgL7&HW<}C<dT}1GK-`NXBl!|3xqRmfbM;Ton}<$c#r}tWA)G5 zwapAUiQPg58?HI!X#E3MJO_p>wfdz8k;8w9yPe9ewIc1?=Bn@~)=JsmYX~C7Gc_m* zDod-S{9h-@CUZ}IG|rk0=G!s6IK)TFqA8eto-dc!)~2{l1?#=H>ZkSEdjO3q{p~DP zXrjtOps_yfy2P6cNK0%deEijnts;yPDQA@zYT9|~f8WnYJQAs>Vyx^Iq#fj?&NDln zp~DYrNK61wqjIvlwbv`YR8T!jBe@IgzrT`Au~=JoaBoow07(Vu$+dY|Uo5L$-P!;t za$SmS>sup7DdI(rP26zDG;ky=h<7v$odSw2bW1KJ4!(Xhd`^?CL-Pracg{(9YZF^? z>+&*Zi7A8Ddt-rO=pUfi$>64|GgZ=-O5X$=b~zC;TqzdF+bwA9EUJw72aqZ}JJ0RE ze_*Y<(pDXB&*m6+%8=(_rNlH`>S46Zzaf$yK|=olgx@Ul{)iqH=p19isHO7EU-P~0 zrSG_%&kS=eUKLd5NHnET5$R5qjEF)o9MNZ7mo@}cH}ad5G9`J*t|4&~_#c8h9rcp) z>vxsD<+GpUO^jPxmKz-j$gZS)_Q56%Y3r{!%Jtt-3$Wq*H8k3*!zWj5lRCK6tUM25 z0-a+F(-#<|{fRKVvnvFXdpB(hdzS4zC+gJ@FsTeuB0@UrdFDI+^gH_NEj1Q|$6RJU z{=jNLyE*^EX(9JFl#Z7{n3N-M*LN|j;WX+WAdKW@{#`(gXLrgcbISRDfZD2}mEulR zeP|hzEZ?A~^j$FUvZZ?KyaX&<rj(|D+}W-3H(mS95X(GMAORc@9H~=jHIj3UtPw{t z+B0PPuNtVftP&k=b(W{ap0T^m=tN<M74^R`47SpAu@K!e_|a)6S-cTN4|^~r`Lobt z4bnT%ze<Sb3b@TRit3-pmN8O2_};}e;~J=4-0yHLApa`O|J$+uCwP&Quk{(X4o*vw zHEHDfALa*zN?;Un^jU)P(UIx`o-P*Co~akVAdEs>nq-cE1OiK%gE~IvP<g@WyPL;T z1Bf;BhY};Tl>J7!f=bK=?7i`-XtHU)ep02Xnqgpm_>q^nmBm?88i*{$Iy=x&`kZZe zU*ZW~d>QMQxI!{e@n>RNGRVOg%Z8cs^NlZD7wRnY;SO&}$L})>6gQo~=0Uh%!_hE4 z^-e=J(lew|ejXui1G{OTafpfQr{8ySr@344BjHe8rf@ysS>M(BoJxRs6KX4y!C>6# zcNKrQz&_)(5|hR)_wd$Bb|R5w%5`Bh^Fh)p9#3izKW7yaY;@Z?Dg0E<`EQlEFyc5r z9RsS#ge#K{cbX>O;V7nRfS6v?+e;L>9j9`U>vN?FjFi95WBcRJMc*ps<~Q6^T0H5N z!<<lYR>S5<>dJh@y*ME*g^`oe>0IvUo$xosD)tSBfc)Q|JrBQerN9PEbF3ZeO)t%6 zntZMC32>{F;Tm((^DHBKh7+bu;#c9@k4L0XI7MH&P1-AjhQ?d0YU=Cq)1UqpO5p)d zfS~R}$J*y14J)Dl0Q7y|=XjZ$GoNGvW>8I29vEmbD(YdlOUUIpQFEE8X44by7o3p8 zDgaW7F!`@oRSJ#br4TDg^5U;dmHf}ctc6tifgFK^cRTT8A(~Eu9rNj5UNsqAiZTYy zw{Ru+^9nWupl3m9L9&M3xf9*9Y&}|KuU4q<`G<Z<&ZS>awji>TLR~Tap4KpE$UTIp zQnEf(&g3Naqi%EYIlD>b&8L7tWRdHv=OSl*%(bhUG95YDW#i3JukB==T2lA2U`Ymv zGhzoDm7i|iA{^af`mi_t0i>mB3PL`f&o`23d{#9K9DsUy$a11mRFeXJxjR%QBH&wh z0WMSnPKI>rIxxr;bMk$p#7ciE58JqdQ9MQr4;=aP(*`$x%;eF>_xWQ(J;S$|qiJJ4 ziAfI(lgOBgWkVxL2}bOY4XOBvdejtrNoM@z&}k_l_L*`I>=q@uHU8;mdVE@}+Y%nS zP$wlDIhk7BI*t)U63Zd9Sx$vvs5U06rTJ$*V$}X=xtZL{R5VHL=08BY37<U(XbQb4 z=kIl<&2eb{Jp8c9+6<{;%iG<_pF3KW^Aa4SarOgkT971;Y<i2a$*R^m5+@}V*l{_) zaX!S27-G!c=hGq!CEwMwG_|+2#a_rgnIII|7dJg0^ri0o#p&FSdS8D8p*f-S^KND< zf&T+kGZX;zZdx7N^K&@H&7H>J3ysnr)Ti~2M^Ik_qDbIuoZwjtdOwVK>GFx5RnPI^ zgUky}636-vgxb}&rm8!MXJ%oW6c0h-4;`pmZU)<P9=gxPxjYLzGt&Ht9~F|29)Aoa zyeMEfSNDI38Tk73zRiBGs<4U(RiUEV^w$;j(eJ&akTh0j7(1=Og(dbDD-^G(@{<#x z{sFvHD6Y(xli~%FngeoPa92A!1>p84^Pr=*lWrATl#NnEiQDpjpi3*i4l~F8jm!Jg z1pLJZpbxcbLEx^fE&Y09Eh${iTp8Dc*%RuE=yKLEGdZfTuEX&H97{fBX9#1+4t9=D z^8Hfc>QlCON66L5eqAg0k)xI9xEG%>MLY8L7C7gS>!?InIrR<o67Ecsv3Qf}U0e0R z(zKM;8$hygb1^P3=a#q1vu-hP|9dDOdjFU;DbP!mP!y_JB;D1$v-h4~<F4hV{@^Dt z>UP4O^3VpVKeY0i<aWDKK!S`GR&($moNO2SP6x*Y`lB44j#_Kpk$y`7cGG?O^C|tz zT_3^Sbjx}{;=?(n2t%a(!3)YOelDJ}Ra4porLlhcP)|v)@l#wx8wa(IH-*97lgJfQ zH+>&1%o;|{c#Zy?;6`ozz(LJ1R4QDrr8##0%)zxkbtPeCP#HUtmWWS+>^zu)?MiJ% zoJ>`XKm5=G^S27T3P+rYmbmA_-CiiUVytAS!1CJGcY;3x!8~iAe{_Y9Og>TD50g8a z(`8IhIhef|cRwlv8}E9?{sM<@ua8B?;>-HAk9wA<NXua-=~;MsYJMl*?Tpnjo}jkP zQOjWQT8)qb5PABcy`{yE6bqTT!^Q11`E8)D56(IN&Wm9uPePzb8JN<uzLPj3x-b3g zb|aC5G8Ppp6Pkeg*2AEnk&i^tg6Ayyu_{SaT6yo6Cr<gE4c)<M39XCIc45~#j%O-- znbL)IzmxE>#Bp(pO}(Ya_Od9iDRGp1k!KO8-_KLA{(i#}M|Zm<fnv+qQbHVAel~#A zclwmcqTDl-djXLEA|>-qf1n2K$T((7oU5!(L$|zj0{)~Wa>Bz8mp(sUZq`7-5dd6Y zZKciJx)(XJDre@QdAE7&8|u1r6N_w~5g+$*u3lVeT8VV_wq3>Aw6Ld^MQ5Jbeg-A) z7}J^0Nsm{g%CzKr_xS#_SE_Kl=9C%r{oG1Gq@)8f=3+P&85G^Le^qbTG9vx7&E|b` z^3huzPUTA80*HWo4+wUuGfXQoH0~oYNZ}cRFrU*d<T(7ioA^R(NOvzx=WmW2e&+VO z<`}|M>)3LlN}F76hHe&ctEnsXp`kstzrOljvKE;6k=`6hYMTS~0O2yn7!wjcmzPJy z5$;A*s?F9R6ZKj(D>W@yvLYI@=AD{bdNvE@g4`Z!Chaznd`l{fwAYLY{3k{@PY--o zP2_O!*H95jDi7Q_*~CnlU6yuUtpNuOpQz5J-&%{qwR+BH?swa*<@pzX&bChUbz2A& zSTH+$u!kvjn{VV+n#Of4{>0p5*Vog)M?w-23b}*TPTqV9Pn-HC76F^L@tT^a74fWG zdXN=U#n_);^v%}divp@kuB)?(c_I6Yox<H|E>reW6zuup=!JW*9_r<%ge=FeYKwz7 zL>n$4F~#q}+yd|~TKC`UtkHp>g_)I{&RXC}s(4^|kpm?BEy0I#vgASBgC2z2Wo4Bk zPKNFs{SLhfw^i&mDTe!Fg^blCOAr6WS-^V0h0U+d-QE=c?f&nu-5@zp`h;`Yj9tA7 zFZaWUmEj*2k0`ZErWtC6Z1rbzm8e8G%XU7d;{8_ZudcZ|*F7GU6n2$E@Tk2tVO{R? zFLd(ZOk~fCv3~<(`O!BZgCF%B-QVEFE2b>9a@VJ%B=J}No1bU{7Ibjp9iO*2M)2Pi zDXoSO=5XGNYIm6A6P6KkuYw*Z>I!{M_|HqKy=Yy3=426my=vDc8vxue+qiWuTFbPY zXbppkk5;_UkzCEV0oK0;++<5C?^a6O?c?(L>PBmqh{t*e6Nt?h{{b$6e(shZKF1wR z>D}jDoiJZf@5_=Isgjs|*mciKdG@ozBYpY9mv180NjlcjcgW@~W08d-M^p@l-8))7 zPEd{nG=v~(clqg7jIKK_Hynbd(cD%tokQ?CxQ6D)a>_+gy&4t${ts~QkTS6~MKS3K z=c?t2JevOz@D(rm_WcYcRbPdRKXQe7_eWdDtSgg6GbO1Q)3pnY_{k(VUPCg-DPvBU zsY$7!IZ6S-?^;K4C>bO!HP=rZWMi{Ct~e($sJ}WuBc?55;6OE@M0-bgs%JZYc+8w^ zqtoHiZu5;-6mlM3EJk}i0~O3H^b=st+O?P&5nGM$mdGIj9l-Q;))fe14zKE!W#=eY z1)&u$sHkNBIvvIl1VN6+Lylt14Kum?C^wQhY$PcFuYg}EhS`$g0P8MiF1@)QZH~M; zr(=##Qnl~<_{_u^T^9TZE&or|B_^h-l;WSsMht7A?*uR)9Ab9jSO9O@Pe1NdYrpVt zyVcSTlbc%*2+*)VJ&LI(G~GDP`e3a|WOLMM#-B$Cr}{z6N#k6^Z8)@$vT9SZ8F4ZC z?+G-tll^Yzg7xiges0)hqB}JviIZ-FZ{g+|>JI+^HoYt;MVgkA;7Qe@xt_NMR6}%p zM1E||VC{X0r;7cDk-SFCW<S9xj2CP*)Ck&Zp@){%Ru@a*kt%x=IP=u^*a=@Omu0P+ zum{%>Jl$6C2DbP8o0atsc2gb8E;zE;0{9lh%*U3=@tryFJv~%Q7u2rtg`IN7X<sM} z)DKrCTW|q3_lI}wNM?j)G}&>q1lMCwSr=k)YoNx-dd-wA{fz6)Vf!djK#0vAo05>6 zmINwBdx0*(#cVWC`#O}8$pNWNgkZK3XyD5#z?mTn?62Ev23&Vl2V558cABj~VNtXf zQr3&xjV{O8uOcQ!*l|RC22CcrFaWtjkTb4Inb5mT*5QtC+4*0ek9J~(D<1czdDGln zA}Sr1g?DpZYK=Q#9?Cw!N8xk>sNW{y6CuRL;Tz`lNi&k$G%9w!xjq&u{T7#uA(6~J zsm)*LW|pLf&32UEOVQ&pEfh)4czk6&V-+wpGb292FM{D<=<pF#2dhvsXm%c~NRX8B z9T`eBZiafA><9e=^wm@D6mp<ej(}z>86p<93>uv{g8Cgduk`&E-}yt_;BEkfl+7o& zW}#Vy`my=qipkCd?pq8y8Q3g$9s3isL+b-euWa#I5zTN%qw6mLqB);lw!J;|*sW_f zL%enG(yjP~_|qb+&nC*I>P*SWsl)#OaA=4`#k#H-sS;CNDI?uLLNLs#n$&D|l(qNT z;{|pOI_KNGt~(iV13p&vR1uzq_`&e8w4@G>CeP2xwdSQNYlor<j}Z;o=Umyz>K#p_ z!<ZF&tl)+nlYfA@y@-Y1Rk6-tFS*S6uFe!!;?p~<^H87}p{43qU%r_r*HuLS)j|^n z#NK?-nNj#5Tv-5B+<G&m?;IrkD#jvcZA??cckc+=_^hgEY(I`X*psxFP_>DerY$Il zYcelZQBfsD+07S?)6z}p=%MgZjY{#u5t}&er5Ll#1-jZvD~+pORO9X$RQ8Aib5w9( zG`un~^1>AIT>7WX_J`4clyDOui^)zx75KOS_<`mNrD9}O08uV07Dl|jRFL4tdfQWz zAHQ67t#@ntq`odRY54nGR2~HxHP|jzB(5sBqE$S3EWaoSW@p?IhRbSPN~r1^x=yzG z$&r5O5Y<ow4f>T;)tN-kxW86#7UXyRd=m>=pgwl$i~K<2^_54$iVt1RD+v3Izmfwd zKeDR!bWSz=gd`Xuv%X1GK7q)(<jQN{70djlwj<H#oLg~Vi$z3jnqfz|VOUjX;PscR zMN*+i5Kb8xu~=sbf+z8+AI5AYTTyG&p?Hfnkq)<nWWzFD`7@PHGR6Fjafw*v;cw0H zF8_uggtLUmgt!FK(*m&j!p9e&FpS=#Kl4>_E-cPb7Nrq6<knrjM-%MzZbRxN<@Kz$ zBfBQTiT5#dv#>0P@;Z_lZVngz(tb$vs;N$tw0T5?k4YxigI-fAx#vQ7Z<o9o%r#iC zql9Q?%ejA`&~T{S$q~nPu)&Rh9F=LN$-e=I2E9Js-$AwzP2aqueO5-@(u1(THAVgd z$Z_M<j$cW>CmpNfwBoKSX7Gzw3{J<o2{W5p&m}yMJ9iDWW^x#o@;Lz7)!flOb+;)e z9Y2487Yw|*mg%0TqF|6WKGtoR9?!{O%?nf;8-?Oo#K=Z^$k<(9vbL@?D|V47Tf~VQ zeqS|YlcLM-rXFUK2AMQ3Bm!LRU?cqz^oNlbdxim&G*qZF;98MRLEMsAkIf~W1OsCJ zM}C_FC|*}Xn!B*$g=%fbf~?07KU6?d9DTND%qlH0zvk+L!)Q_9WSIO5l-cSwW$G05 z@!Myu@<ara>^y7~Z8|pf>^oh148m=0SKYy8!uVX}JjVzbKkCPSMsX8ga_hmB)-`ka zOoFjaMew_Yx6(OTxH24lfS}lC8r9<<4G(DDyF~cs`#58Nk6X27Nk__RJ~XOJz1!<% z%JkR=QC?4~yY$_Qr}+?hXy6SJyF5fN<Wy9@NNZC0tO25t+2Lxwt7z$ENW2MdjPxsl zV^`I}`I25UjD3k>z-5wxoQbnFzQ6kN2K`j<C-G7b@p+Q>8!d3CVDckp4ibL3?=UFP zh1TG?!b2vp+c4v-KJNw&=|phSh#htiaUSYc4Md{_zKF%;ubge(Z-@lpYOkD@wHam| z3aazRb<9&Gz;|G126lJ})zKmmCrVIp@+ifd6f@O!xx=4qMkcq?i|0e<7pv%r-g7#F zq_@M2WCze}erQg%x^d{>f=N*tZ$G2^(ni>I{X@u0t6rf*Kkrd0P-w-CIGZ&8qz#e( zoFA`kb0S4$&g(Pmpd`T)=B8~vK}aZn*pOSJzKiMb%kdP`pgeu1<l(`$bb`4DxrNLN zWTwis1ylK$hW`L~Vw={mhmL?b@i#mcw)V}<a=fzshmVC~b@19>POh)*T>8ozquQK; zk|j^%u?AJoH%d<~3+=8briF}vc7qpI!4??WEkrGw$-}g{=8d#d^7E*150aRh0)=LW ztCN3#`7&&i<%i!gi>7Dm<{wD$aTy`(bVIV*`a<cpW@k=mKXm>qCYEZ!JOww-%2Y=) zx7}_HkG~b5jsXy_ihwxc50cAVLa{n4kVIR2>3BM);|l_jBxy&rlD(Y<Ys-DS3Fn?T zx3NPHO)v0xqdV=Y<6wXgk(+i+)qcV6MYeDyF)?JzcEz$UT7AI_kK4BXPEZ2GT*YT| zn165pFZ5iOog`CQpxmD4r^{YGeh(xdi3axE6C;mILsahw#AS%dqI68Ux<Y;v=jI4> zzN~tacOYtP1Ij285L@*mRsLNP6niFd^;ojadceIpT+<K)C;>$kON3eHU68CqR{!nP ze1oK)ogDX-3sWw$4Jxh@f&t}^4cBjhZYtT|m3$R^ZbEMy))$t$^OtM8OumS|pk#JU zaF0V>FBax)7YUmgW==hvs3<?v<h(eF$lVoGPtdea$pN;hm%SKO$X=Q_d;l68f`_q= zvc}FH{9eA}ENqYaDF@g1d<rjoyPSzK>9=oDY3*p$*i`9RJAnKHNOT2cnbdrgpV>Pf zY1X9cgKz*b&cj=*!=>xPR!S;|+%0E?hKhU*xoiUapC}(>ZeJ=03H<1HW!4=5lUrYx z^_nn2aRX2HjP+%_qJFdmp-@bNn5t9>M;nYDMCt|tCPW<FF?01sfb=1PXpgV0HGpIP zTm6a51Ik?KoJ}@CF_vLmY9s@?6PPvZJF|NpSS-&!7aua2SqK(6IDOqK@Gg{u(X!D` zDhJI{_M=rxb6tWazCmN4zRKTCeD9)c<MgEEWHo?PX+&~PI9{iPi(C{tQnIN;w*@1o zQPq`Qr4bF?-7|_ljxr_N2miEZ336dyas)d87U~sinyh5`Er(VPGA9;}N!R;KN{+1B z+L-;`ygn<I)Yc<Qxx5cL&=GHpXX%=v_4YokB9-3Cj&}*=!)<<Si!L7~u9+<_mIBAZ zIhZZ*CF92zVC+by>S_v)*l;V?;d02#6BJ>Q15>D){|^g}LI3BVKVXenAn}@ak{>^9 zfTt*_FQQsHD6FdQZY1+fecg_=`?uVYT0_N!QWSfR;Y|<ViC7QYZ(#(-$C49Q#bw@M zRE!J_BWY(%zSsjWNS`DfX^`;71s2SjL6l9Xium;ITznXL{0|WM5g04hH<*QaMR$;+ zx~n4E3W)cN+j`5;*C~5@vCHH(zbCh9cvZ4$t32VH>M^6`Xb7L@M&^*EY~Fe}M|Dmu zuW6<Zgr&Ond&@-7`TgaZtg1(eQo|Vot|~^q>2q*G$|2f{6{Rj7v(RFkG*OXi=E&X7 z<w9UlG6At^7(#xPxVX#9z%26<l;<tCk|c$U?W(fWv8e}<zdzWZy1}7{-o|#@-EhSf zd~FOI@Z^$XT+VmU>A3U68>S0xJeq`?FK39lQqS*oy{eu4ex46A&Zp&_U(A+B@Q*;q zMpruJFy8FqhK$q!@CIi>`4_OHgHFvon?+Nbc7;-`LM`7px0=T5cx)6AqYao&LzPuk zDB#JIsukAGf)rdif{;fBr=z51)yb}}v#*c#V$KZeAF+8pr02%PfYHLh>-P(M^XW)O ziCM)nB(Mat;vJJ^Jq#8=oD2XZtv3!C{fXA>?2g@V>Z#ZfO&U0jSYV=}UwiLbbx`2< z%Ds7j+#^YxYC^yu8DSm}>@`{JWzp0u{6a5N8MQ(6w%9R&I2~qR$_66^LFb${be^Wa z??@E5Z%@pK0wBi2U|~l&#FgNyrW$j#l~28|EK^qE#w18_-xlA9&WME6A0iV|CCTHW zM|zYZ5J78x6B1BaqgHzmc{vCBJ%grkGdX{P#JmwOSmKssIi@%hcZrF#bu;Jkod4QK znnV5{0N;8*hOYjU^4q*9?^LKlK`f45d`b0_`HN?oa$O?Jk?o3tXUgJA^n+aqO^LQZ zi#2D+pOoUpjp(D})CB}|*<;2<$42=dAf{SuZ-Ma=K~-Ho0;(?*);t{g4QlZcYrRy0 z7&#f-f+dYiJ0u5b+!b#ldaJtSPZO43&sQ<*Y}qK^aQZ_fALtv?N_=(HC3{8aU*~M4 zekc{WA^dDXn<9S8AsbU=-x$Oa$ohhTa(Vu$Z9`LVq}aTPx?DC*VFBH89-Zb^X7S`> zk?5Ohx1gRuVw_UbRiRqGBn7uDs>TjLL|C}S=HpaezxcrB_O4!Fd$E@KmZWvtJ!Umv z^fs50`t&7_V_^cdO>;~JYswc!ADLF`n}tYjD7kK_esNnzys>z}zA^dMiD1RFb^R=1 z{ocYyhup|?P3rZ~TT+d!g(`odjPXzNartJBqt5<!sJOr;+gBPmA)0&UmRs4zD=M=n z=S_X;Er($(s=+nAc+=-x<&9bW=YBH!l|;0bI-te~w|z~jYDwzUiAa;FuOR<x$(okM zxyZ6%4m##cqNwMEg~*{1U^r!uK3w-C7LoAx8&CN<cLMBK=Y~dQ4{>v#+muCE_Q+jl zu|Jcwz&~jaw~nhjZ#jQ)jU4c7_!4%exFN~GhC7MQaUS<bv+mUUdI0)#_YY9hnqo2$ z_l2GG9X5D{nPAd!XOT_hP7PMNmJmYw*womM{q^i=7b`xa_L=3{?;z!szfN5%U%x~q zS1f2`umG=Jv=>fDaoymRy!saoZ|J62^UCPLX|Z4^98?mq_yJtH%?1heI8HY+E6{E_ z?X=b(W+q+1r@cd8RC4faHM;X|y_W9>DQ$({C7)c-&+%l(!D@{*_LARADdBm0sfbx= zRuKyoQnQS^VrYmqUJBWeuCEWfu{h+#M|tgQ77GVcSvQ7RM&j`6MF_p<aRHbn{bA^P zi`k&Koh};*k``j|v9LBpV&|HFn_*N##`h(?UHdXzLZ{(fi>Bkk6$#(Ypw6Noud`H* zfDi@k4a6*f_Wg;C^O^X9iDxr=>sbd}5eci0%Df)0$Y73X?mmLk{~^UrG4ZRb3#+(` zr{B?Ayu45(o#A=rR}(P4llG#vX!HgNx(ajxJm#583xj!b9ww&9{u*r-=cc_cxFeb~ zY94sY70DL1a3(vQdB*QBmZcem6tm7LApTvkbm66fojCL>BxWn5uZ?GFEH8}^mzu7u zy+xeFPWSJsO|Vx7r@D(RGt}-xB}tD1_5O8Yd~UVdKR|S${qWz?V)+9{p;RQ1_jm4s z1U(NW+wHbX?t=1nL)~g&H{L}<mb~BVkR|9&Zv`^3TCm|R&49#Zc4%$mY>eb*3)t}> zz7=Rth3eKCLJ+Te%38{d!vUF6j5JlLM<+x?9!v()5^fT1w*}R<9jjMJzt>Ii_R#eh z!a6W}O2am3J`JxLSk$tnR^d}rdR_6vDDP~{@1Tc5afmy$s+hA?Ogg6Wsn^+2Uvl#5 zyrV;aptnt?f~%ut!tdzVZXxYe6Dd-5hgAv-|L6X5K_cA49_YBSCnmJ~bkY8MMVaB^ zWe2Q&{{Zm~e}RG2j)jii<6wIy@)1<{ehFVbou*qvqn~YeRG^%XOS8x=4{C~^Q9vFp zcF(mZ*5mj)AhsMN9?wNXp?zS!M!4?lWZF@>@7KsjQYpFmdmO7LbG@{zmtr>;<Y?PM zU6|<YYW@ciye4*Ho?Gd7CGj!pqw2J!q18Jvz}b31^6Y%R6Cv6nJ=e<VY02ji{)j{< zk@Ez67s%hF`L2!bj}*Db#9e)l7oBkBj>?pR0^^M`isQI=Rp0b0_oLtlw{DNUdS;-M zGpM|w9!Y15JxrL5>lR%JUbxjWj;xJxrI$2XM328;esz!g?6G#ds{Z&iN0Bd1;&jgI zBMP)I0xLkj|8-06)6GT&@0Oiz;JF;v8C>nRFEjl~V(ZQ==sJV~<;<CHPng(qurC9f z?CVK-;nfPjtMiW<t@h;er8!SK%$jUlz2bDXb%mBIQFXALrTAb?<51I&LOE8$Osals zFxp&y>K|cpmPr9#Y`-||os&w;HS6-QU65?|cR<g=@6{m7rep`l-DTq6)ng_LduDH< z0^fu3*D4!=b(Rr~=TD(ZF6c(^hek3NquzaZ`O6SRf>q+#+4($zi)_xXiqA_q!Mf02 zSCtZ*8|%`eTnum6BUW1PLsGeHhMS)@9AEtOEsCyEFWBecj@)Tt_DeuVVKI964k0Lh z!3T}8dXf}`;yD<(KTr$U&rtmg4uOtvS?+$*O$ySvM-=oU^YlfNRkA5}-=tCjkf$YX zEEaO_adTC_NDY3SNFt%3xGU^>q#x#q1=u#C8ja^(%&Bm%kve7DR_{b808R}E;%w{} z_eDl}6n44wQ<by$yh+~x*IZtgwJwi%;xq6D)fyGsgDIsqu&N{(3g6nSu^*QY7x?Ki z_%fL45uDK;nfeUxsc<DMJzAZ-t2DvOd5*2i1Bo*ZbU~#WsE=7xh~Le!BYC`);S}K! z3p2mVmB(w(Ts_Syk=B!B!w-779n8G5agqt1AsDfc4o`u)5&j2+f0W~yEI5r}<LHn7 zoM94rsC1IpT3e#0X9tV^rX-`k50?fiQKh+~@hq%y!8u4`dc{%zvX!4Up?p@nV@s!5 z#EJh>{54VKknNDP|J+K%8O{Tv96frvq&ao0pC&`Y!~e10PysgST{DB#P1Vo+h#vt$ zlE%P@Mu$h|Ulstsf9zEEjf~o?Mrj1&K;H*H-G*NJy$@@=w{fzG=FUKAb16%l;acx9 zC$oka6$Kjsm);uGc>2JOqS*^CHDXm|r*Y`%C!`BLE6j|<@xm4GJUg3f~sf;i@s zLYo5B5(95#xY%}K_;|2RNAhxG<;BHXs@8x{q3XA+$>l=Z+S~wl*1&q|M5SUmJ#+R< z4qn!$q{X}@Vez_qCf6#oCI$N9atPtA2cFZ5G!coY<R{&?lIo4jO1tl=siZ!!!EOny zIwhz$w(XE~sSiqYrg{#2C&5v~P~md34+H#5d$u1n8&-j#J$5cO@os>7gg-hD=xLJ@ zKG;!DxhyMDCd$8l-%d9X5P+c(*gUk#PDkwCzut8~tSH1$=CQ=^M!%qJe8L18iwrE< z7a|zX<<9Zukh0z&KTJ&?^A;Eh`7!}|Apg0iNp(><EyxznjbxK<DgEgBw&HNhpIGi4 z<O4?gL2P@Xm5;9#7j*_0il)B5UC93<X<nP1IvDUFAmEIzzQ8i@#44oo{$Pv=YmDYC zE$Y;u;3*A9JOQqHhgA!xg&pb8rt5w94^TP&OaBwwIN2I2o7=|kD&7xEnsEhnCW+iK zhBsK>fYKh1-np%f#Ra-IF~X%s?;F}aNAbfg1_GLOZ)Q3qUu0Ap=L*^lo<9u|uTC!R zKkJ(=H||*IJ90-9Z~6oI_bc+LcuOt<GT7LyA^1cx_JfnM4F3RTz?GLptX4rGL%S7H zkukJ&$w^AGstE#q3OgIQJqCm3@S?`|T2`9toXESv;RmH;WtFVsL6y7SA+Gqo3R?jm zMtCDGq09+|)WElOf#BbRAzv$%UNZ=~d>6n<k`yhzxhkKgEA(jDL!6ftrqm`$BIjWy z4$-YdxcBGp5thq&RtFxjlck?gFNm*wFMb-joGjzwCMj9|37FND0&xh`&?tg(A~w35 z4R4=cQPug`9GkKpMnFKos%mYsV`fRlIGKL{aW+}>IXS##g-UQFhW5Vfo+Nj$<}ywP zyV2ROfSAc^*#{sy*h$Dr>YF(gu7L>AD3&%ZBe6!GVs_L@Y1KZ>?Oa9DamkqJ_$fbJ ziOY0Y=fX2b&!LD^5iun5Wud+o?zJDcKh_GvL)%}>9QE+XN}83~GZy`VX8Wm<mV|mA z@k(~S(d3?r(?%^p+Q+Q<vnc6xZK+zY*A42E%>0M+R-Wl<0)M@aPDu)9@I<4?&w`xo zkM83_7x}3I)h!L=;(YCHDyoJ3M?vCRJ6)|skQ0`xH=XBqtY6ORy!iq*sw0M8uVFL1 zzblG!ZpyDf$1LJJ+=jK$qtT>b=$vcuyJ&IDR_E>)zWzTmpT_Bvr(dnXXAaCYx2wOj zRStGaNw7?QpnCh>p)VUv&6W_H8(rz&qAJYUZU5oK{+Ux^@rl|=p!O*yTyE|e#QSVb zBUC6<=BFtn3`PdCxHvJ#2=Hi&DwXaVc>P&<><bLZeEP>O7hLx7qghAu)7^1F+w3gn z<b5XqP@v>HTG~Ize_`Iz<J<4kYoCCd915rNvcE@d#QH#s@oOd4j82qy;vYM4DK!1; z4Vh~TcrMG~{>wuOvC{>SmDZ|m#LJkMzCr_P)U}W!x>I$Yb6Q<doqU{wg{CI}F_C8` zO5SlESPbCllH=W+B<onmFKH`KiOlArk;#2Ni5gt*)!blC=q{t^lK^C+as@CVBAiI6 zk#q8@p-{8U`GiHrh}GXzz)q{j24kUHxTMQ8eYNG<{25r^hb9yM^qbcN!RaK){Xza0 zPr|R^YjCxN?Mn+J7lVPy`Ku$hrIF#p<5t;;?;%2O*7e}Qmkuf|M>{5KzW4k1hE?Fl z6QZ@TE8n5;4NSY0$dkz52OXQ29ExCiBbm;Q2syvePaAJ${{7xwEm9>h*yU1paQ|1) zEtRI+>BvBug&xPyFtu>%wWO>0P7lEnsO9hK?W{!PUM#@PhKm*!^JDX`;L2lqVG1c# z3F41p+UcblB>Qp8etju?vU3Ae)74p){s$OBmd9x8n<P0Imwz0peYMu$YA$n9%C-<& zR#SFCdwV-AU;Yx1k6C~V%l!L-Sf2bb59%wQ*|M>L_FJirRDE6E&|hRBD(MbN#%@{X zLOx}!nTB1b6(1O|`ZZC;yc!y2sWnwE$_E$k(sIvFK}u!WwP!C5ahx@-2fUj}6`nv> zps^mK4g80m&S!dvZjjGpE~0}p?M&Nd0*mrl{HV;O(=&N5_lxlXP!wb{zW+WGbs0}B zlH&H0JCVg;C3P4JD~CwB{XBD9n3!fi4cfPEk}|ZF`8F$LlM_c)(9F<<B2ckGKZ@d% zykrlU)96)VM4x2FDJE6Dj;uEKt)@LCjuEC)FzRe->~0AkWaBRYsrK;U0+MsU3v^tp z2imi|On$s>JAn||=5=(~$poiZ+E63Lw}vVeF;wnES2f1BGE&cKM_KjmYK7jP$iF{! z@;}8MVdAdd`0RhkhF=zvY$on4tj_l7-Q6i}be?-^TE@d=QwUL*R5;Qm;o=t$DJO*# zwWzgAc8PDJ_IYrmvgt7cZ^+Ax9t&y%s+*=<<F5>CggCzIem(o@DhkI1L(LHHb>;iF z{{Szeg(gX~<v9@M{xc<NxZe3*qC$;UbS+v{dgxApSU?Jj_pVkR1-sQVD$R50no)ix z7BYvv(QOTc*`P}{37DwA($AKy$nC{HIx8{+3#Z;#^C?!wO~IZANe1VRv`gB?ZGB{c zxI$Zp?&JJi3;T`NY~S_=MlTxV@3}lnht#g}b$yP#@0aS85@8t*6qpMxZV#&*tGIoU zBTnV&h%dfbg?nB$JvLeUkzMT2DD+;ed>k)UL|J7^MKZls_RDVV`aF7!R1oK4-1p_j zp$krt*boPSia540W@!Nr9DcYoSMIEo!jn3&aP>2L0vcxf?)hf6coOAk&-(%#W^XEl z@wr-Qs)2i^`Xcqia|wePR11M&t12*fykYPBE}n@@TydDvz1qzS^M@xUuf`k|wJ_#u z2xke9E>g&c8I|cPMsYn`D*sK-q9PG3vcyBT7rRtgIm771F0^bu_tyQRa}>wR^*Lmx z*>|BNjy{q>GHD5~vS$CI%P}r;k>5*Yp;%QPp!Z~x=t+W!rzw4d<N;o#Ixj-fdBykr z9t~t4{{a@vrMZirsv=U4yh7&U<%=w1O1;KyQ9v7=jgFK83s1kb_=iquA5>(Vf$X~M zr(nAM{lyWWVd>MvnT6(?t4b4wXXb0GKZ0`J$F<rod*m-XYK-Qe(Hcp+up}i~Yfk8t zfgKJ!QLll?Nk$Kq4W|o^xIs=wL6z*53(%+I&VQmN=$LdwPB$w1B6U-AFwwP$;J*h< zcXF>nyAF{_0XdG-<pecA#^dy2e0dE4;~&&X4yvVbVRs|M=Vg&AV}H@wE7R4c&i+Le zeariPQh7aUP)!%)>bzU9y)DaRjw!@leE43rul{q<LRaNp^{=l^9CrmrtiR5qM)~$N z#UCvKmCP}o-@#$9(@^3|u~LB^YSXw9PY*Hr$Ij*3=Z6B#BQ`Ean-<=*K>k-Nbw^=g zlOefPj$pNk^~FM*65OjFS(&Djm{Tg5g714cl{J`YxAVrui6>+_9p1YAeE7b(n{HTM zN<9cl9^~Kqll(rP>3#1Blmn8dovAZWZiBL?MptWGR*rr7fFmu_xae@5<VX2al+=&g zkD9(4-3Z#>WIYUQDZh1HQQWZS1=3z#U)($QB0Q1?EN}A4q20Vie;m&=XD`KU<RjZ_ zcH*bMw`G&ccmS~WpI8~~^95z|zdHZu$?fD}6s?8((F&vwEPk%S)8o3*RHcml#u|Zj ze^EV7%b@$~<|a`G)d4l_>Qm&0=4$$%b441S99x^#tkQ@b4Lzj%dO1GO<S$jn8M=ss zZRQkj9GH7Wj|wK4)fncwg$CPotwimq$b0#Vy0<^jp4NJHB++v?wr<DXk%b2DdkE7} z7h$*VW@|-^i_tq!#2acp+2c29a23ydKWHeX(TR8P_&pjoR9?`@s>i*CJ_+h^_vuf* zkmd`{<}@S~u^>2Ip*yf!U-?A6OzfuN!F9IWn!{QL`nGia^ojge_4nkd6Jo3EnI^7r z2{9A~7qr0?%&A-~BWp^*z>qK0ijOL9xvQ&es!<)N$Gn9ivBZh8O+9k_a^bcmY8zMo z5O6JJ@Y<~)X{|obvt<32X<W+7%U(3b_ADVX;yDaSD94<;a8X5FU}UhX^#a6b;XfB= zqL-}Ik%=7b%~)3448<4ksn}fc;7^b=*!$xfz^Prl#2lz@1fKnNSJyXGTf<0@*yGU8 z)29^Cp2Ge10;|}+h$<N>c%;9LNV#r;JpktKGKk~!9gr#vHZ*l({m&S&tuJK@RfNK( zj66mpo?J@Ho=!dXA9Um=Y~(1-Y8&++0BQ9Pv@S$GZX|%!=fPI|E0ZC{&jny#n|EXb zRyz4xq~>bEm<VJ}kpP?ce*mrP5^BDIH>2^!-<eK6w9I(C-TO1G+d{l1=Va%bFE!;s znFGOsKw@LFsa7|2u#BfQ*K^u6X+b*o<BWtoIIm)@a|FXf7*Nuj5LvELs)xqXRDKSg zdZwD;TY@Pkn+s~@vIVh^Z7)J!6w6K&nj&}h#fOf7xzW8;aEyRZX{RyXFYZkIsNb3w zWyZ%JBr19LNhxnq!t`Fno<qFhy6erEyIe6*uM#~$=T$QhFZhMjodHFm8K;7jbLb*B zuB<41Zlv>?Q|+ENi45V&AMECJ=?UkvRXa@3Pbq1!gCJ=M`n8v%OXlzVch=gJgfkrJ z?X|#zFA^RVgluXz6P|unr3K+e+N6#Burq5vo3-3y)PtA(z_OZ0g-=s$Xo<(Z$)h;_ z50Jxk=+On|(fgegd~td6t9vV6LIY@$`wnbYGS06Fn7+HJ_U#FF1Zz+4rjruj8oN0u z_plW?V6ARLDk8vS(1=1K6`4R*g*&g3wc4}DVJxB345d^)s%tFj>YtRwzd|T0eA`+q zYt#lFiaMINDH~aSZccB0qq1Zgzc?3v_=q%5EH{6j_e<0mGW{e;=(W^&nyk+O;<6f} zrOUfDrI)l8J6dWp2Q7TLghQgCNg|W^=HnmS$V`JBRfxo~R;H$aLKOGcK~1psRe_d# z80_wLru+~A5Rki3!JYLkr-6XrlqMcGG3cGOnG1%JBDOSIXRiARI7!|fTwkXDGLL`v zg}3Bl8cQb_KA%pBBqRyF`EYtpA6`+8^Da`3K=PB+Ic!eYrD?L2jf(O2+Y{Y9&Mb|f zK@ZJ8pN@`<S?#7Q)9XEoN8?F;yjf#|pl<b^QLm()Y|#0kDP#^WQS3c%xqZ-|Oq(p- zaDrMXj8!0B`Rn??RSX!i+9~cE=ci%%^-Ib4HpQvL9;D114cqAIUthY`Quc_0bqLww z?QA6ZCu-}kxDC{;&e2Hrcnj7bk+dX%0rhipT%4lMme(QP300!}qr+i+Rhagxw=+{_ zHj=-=Inmvkzl%X+??U_#l`gJ408V(3ClMDtqg1bni;oFAkQOUdn%w$keo7!w0U+MD z=^vnX`VUa%f~+(!D-rR*r334~zJol|A)~GHv-fP8f7XjrzG|l8<&l@(5)aGCxF~L- zf<d6^!e*K5=|AGi!ye@ryjG5e>WvcQ;`(GtNW+g*bGgggmm9M$#hD#ghaiI=XrJTl zJ&K;HNFFbt#uR#mhF8yEr^Y_!jMGaG(~lKud`hqjG2+%>*xt~%5yV%j%CqMxA@mRM zY@&@+l}JFm73mysbCi|K)56vw%~9~6*DsW2Ah@n3(lHLRrlKnaf7DjWT7u^W7ZHQN zsxPzF!-L8_m3E7p&Bpws{DH=;PQ}hzOdAxybkX2TDbSDF6e#(pf_E4z(qdA<z}*MY z)2dU}uldR}We5RS*#6hQnp>CmK3JbiAr+-FH(f(_5{v0m(Sic^;OgNjC%cgsy4G$R z?7IE*S)F%}y_{-O;Fz_wC_$NoT@LlE{TQ!5Y|c4?IaUKt-aC1@8<;0g<*)jUGUi5n zHbtd%wA3s-920h$2?X}~(YQE2ig}a7U<H7UWjhs;t+`Std$Fevnv2xO%IFwY%kqxj zGDSNa$|5?&{TZ@yx{WO_$XgHONo>6bekP!P^ZDXF>IVXjd#~d<rK6?hyjEbfCrQ%X z6CC@VRIZGmWT+<K6j;;Dqc|39XSt`FpL8%R{l^94vP^YDM1xOkNJq&y!-MK{CSv8W zNSdw`a4|ZY=;`NNq`SF-%SJc89Z?nWWuwBP8dq&M7obTHlN}|G)tG5!qov!#*c+7I zi}|bwVDcI9G+`LMD0W>{5ZLsllllB$N>D>7;Jp<KIo?D<Lt#FDWnb#+Q@Iu7Y@mgh zUvMVi1nkr!#D(U$860++!Gj?Pcle%83yLUrIuB_{^Y&_j?~xVtMTHUJK3fnjCEDXz zs_!dSyq!1D9qMH(E_7VscXoUYu%@<h`k@xnbkv^qDQgkq4`Imde$dvdYu5Y&A6|jC z{bV_)PxsLW+GC3oPN|=dMaNi8?IF8)?Ry=cHto_sqOtYro;Y;bZQg=)+t^Fq!d2gX zg&}cQVn1$;GYX4vhseEWbr=Uo5r3=QBu1;OCs&EzC_4Puej#jY?()PGJP9;CHx?-y z+gHuWIM8b(lW>3j=k{DD%7l(pq_HuWUbnyI>fz+TRDpp<q*_;#CoFOk=;Oxq^;tyz z=V%tH#pObyxfIlZBN0J_mU6IGd-qpHof(=E+@_GiPs-m!Z*->K+wmRfye17QeNkxy z#EWMN*Wn+c8%7bk%rP=Oy4lLX8_9}-Etkla0=py?dKIb{E}u3Dy|Jc4$8d2<@ywIx z#v|gEXwP+uR3`Yo2X;Ij1q@m$fL$1l=DMEtBzW(G1-JVv6Q{rU)c0Y<O6h%N)?o`Z zgCT!IBIOv?xT!GUV~T)Bf|F<{5LX;A7c+S1P2X3NG$Kl4@V!UNKUeos=-L*5vUx)T zPSO<r>%mE3H}T>LVhtg8^2e)Gg#C+D-A{p#uPnd$bK#BJEFSH8;G_=wS!j3Yo;r$M z?hF#H>FK0KxCO(MmSA`*i;$Xm3ZQX%fNdwr6Y*(M9j%639w^Q{vbZush;0<esKw=s ze{a3v(+!h`>0c!sr){-xT8;$H6tjVyG)L=IWOJdM2l&;v+5(O)Q@M>zBwWo}cD_DS z>03S7224A^f%&uBXEga&P~=CaScSn=(24eSNo(Pk=Ado3`0(W;yPo~j`W;_T@z_Db zBxUVL-AXV~W1IdZ43UFNAT2qoXBU>rWJ~lEY^>d`jO~;a^!V?k{iBD}&6o!K8lF6p MtS(79^>69F0GRHO1ONa4 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbcfa628f1d8b16cb5923858a851722ac939ab2d GIT binary patch literal 11877 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�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 bIl1ie$J5y!#kB{r>L`lu6K13!ALjlW031w_ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..334ab2581e88ff5d677a0f9d27b6647242f5d6bb GIT binary patch literal 6636 zcmbW5c{tQ>)bPIyM#z#O>kJV_C0lkw`q@T|ousnHOp!s>tR=t1FovuVGh<B%G0Bz~ zvM<?_tl77*mF3a<Jn#En*Ynr&zUO;=zt??V=X~$$eC~5y=f2N589A8(IFWjWdH@|A z9pG^K04L+X4S<p1R6u{fOpJ_7%x9UI!C+=iR<<)|xj7-+=Qz)ugPa%UhwuvVo;xQX zCLjcbiHeFs_{Al~MI?kpL`D8CLdVF�+NUU}okJ;W@`6^8YL+jQ|%j9Y6<w=q>>C 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebbc3a099b5bbe6d8d22b0e79231e6ccf595a969 GIT binary patch literal 11564 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3a8e97c87b91e3dfd53501aec18385b34ad3f5a GIT binary patch literal 16411 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f730f364ebd0a3db37383a638b4384662f1f733 GIT binary patch literal 12756 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 V@<3z0L8+)r-_^Uk2K+GpKL7*R`uP9= literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75235d6f8763163e1aff35b916422c00cc3a12a2 GIT binary patch literal 9032 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..036d682ec89d85ce8bd3a0aaf645ad008a621850 GIT binary patch literal 12957 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfd214467650c8d131973094a957ea395bdbb9a1 GIT binary patch literal 11362 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg b/public/assets/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82c2a34aae83ac3608136b3b6faaf132a409dc25 GIT binary patch literal 11859 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 DcH2J` literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml b/public/assets/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml new file mode 100644 index 0000000..d7734cc --- /dev/null +++ b/public/assets/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> + <TileMap version="1.0.0" tilemapservice="http://tms.osgeo.org/1.0.0"> + <Title>NE2_HR_LC_SR_W_DR_recolored.tif + + EPSG:4326 + + + + + + + + + diff --git a/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg b/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67192282d950d99c8a6e46de20c6e2291295be2b GIT binary patch literal 118775 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 KC|1t+AOG1BP&b$W literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg b/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dfe883b32634e08fef90982bbfe4f75388bdb0b GIT binary patch literal 152501 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 eF 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®J-Y=N_BX>PM&2>Pl*4dvTzM zoh^+F5=|+1_0{z{*9bc{MnEzHo7U(Mk4a<^>PM(jynB_B^h#Y`w2MYjXoYc)@CVC5 F|Jn05A1?p^ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg b/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ef2363f27a8b6743202502fa4183362e9540def GIT binary patch literal 167980 zcmb4qcU%*}w{H-nh)NNp2}tiCO={@9_a2ZYNHuhjqJq@Wn{=dwj&uo4=|y?~Arz@0 zL7GXV!{c|~yZ8S6CZEkrW@lz|cIWJz^F80W{dM~rK(3{xsRqEq!vkpCeE_!`fLhg{ zH?IKzU0nb#001Bckl@h+?%$R0?v4;VhW{yl#N!6w|5yFJyOY9zyKeyH-4TzE_djj& z@$vtw-+%f749Wj*`9D7lDF6g_*$GpMZ$)J|Qs?5%B{G(g!3Y52(q=A5zd#)6>yX z)6y_7aj`Hkaxl`+vI??taP#o-^U*&S5*6YV;o{}v{m&qHM8w1oNFGp;l2Y+LqkYEv z|DA5X11N|I?&QG7V+Gu!z{97&yBz>9{O890SNbox{v+Bw06xLpKfOCCOO6M)hlhWU z;66UVJv@SY03y756f6KrVSGhaLwoR(52;^{MH+t)D9voJofzGx5_M4aVgE>&RwCAP z*PHro*#92%|KhGSw|0W7N7GXv3?K0ruUG+T*dkMkkRKqH@wqrN_r7FVWcOM46O3qBQlB3QVV z&vidA_?h%T8h?(pOxNxeHUnEQmamozMX0cxIMZUcd}5jGv+Wi@ zKa%}$b3slo&6aa@4enjov;aG>-|)aT~dMybhmgC*YDfTQw^a*t(> zaT}y!neeq`f?uvf(^Hv8Uq@~MftQnoU$#=hKWq<`FDW^6$l|EfD~FT-kI{di^!xbL z?3+yN%kFtCx}P>WCp-Pynh~?k^Qgs-9sy&K--Iwjky!^{Lwvt&tBkJP_{Sb{mtWYH zFLTo*T`V-77^}(R3~J!HjU<||M>j|u0q zNH|lH?%;3&@IK9F7VDqrq3SVjpRpifwA4fpJ>$Eb!F%jrmUgC4cLPNDT1biDkWW0F3KSGU2mn{njEy;B=n%Y!X<+DrpVZN(#xw4elqw}K*5kt0*w)9=SvF@Z? zeidyih3CO=GtM+fm9r(^hN;MBt$E&R(t71E5_nXE8QYqophg_gCv(;nWBSNzS7PXqVD#8m0V zoeB#NUw*@0-bkmjjV8zyoz|yT*|5=6nRD7W^fD?^e(r1QtUnb(9MoUiXZP>>lV;TL zzkKh|9Fqvn`Zez9kca67zKWNBy6@gr$b5N?B^%J|kc%_yqV!4@@}zWT=b+9OIOU_C zam|pfVB5jWQ#ey(eAG$o%x5}9C|KMA{%Y!hue-KP37i(@Qy>~^Ym)Fr-D^!pr$|?G zS=6#e#)WlMrp1gtv&7Y&Q1x&qT^*j%dR-Xvx=kNYhR?^+-x+<8SI%m{!5H%?)x@Re zQ{}Knph$2R=qAjMp&Xv?0?#}sT-ffigHD-!kAO-y+8aIkJ{M>wFKah$)5GC6QT|q9 zRosNl)#PnM_E92{66c_hNbnBeph&_R`e@ZPRCe^OHa7y|TN$5e1xeyGRdlY@R{A>=3oAz;*(sc?#hV3;>*)C7%J1Lfn!Wh3DUA}{rSYOB#Bq4}d zULld=`<0M3Y$pEwFX8@)_s8GB3y&ejVx~xB|D~IQO?(dTfgYK_?i#U{hC;8tgsaUam90tx16uNE%GFyV}5K8rw2PCK+aM?HIUj1vp(T#;`4X5z}8xX z5#A`rq=I~yA|E;h^tC$ECnr3FG{lJm#%OZfM2fck)=(KLKgti~mfzf^oK&fEpSk^VBnrGeVqCiPy-ukOKZ^%qtQrUVOPb!4Wss0x{ zC8c`Amff)}%tyMuJX9}N<+b{NskQ&Xpago4_ud&Bo41VfQqS7A#dm2xb(A$8bV=hRKPJUc#pfkLo;;-N(|T5KApK7~jV6`HbBVY>Z;hKg8#z(8rm+ z;uTH6TNsi95^z|8A!C<60?9EQ)`mRXx@WAY-oM<4*;1uE9!b4N(7@)H*We}fcaCR; zYp%*{QzaO1-4PD^kcHg(m0a}h@J)s@dA5mqwMAyyEkG{!J$j@l$&}LQcezY&Pb%8q z!819&{QaMzBYiVP9={DjaUmN0shid(yc7g!Lz_vy77g{)bl;gu>4vM?ti5D44(Eyl zUZnHJ=uw#WjZV~9Tomd0KIMVGn8i#gKSW;K2)w4>AqSIzI4|z;t<5EiA$fxP3!$q;9%>BM`D;k z!Yer1FKM|C_sJ~}qCTSQj?VTFO)^oLz|I@9_nZR4U;a31&N@Mq%70XNIKM#knLa1( zP@h{j)BElBPfd=4kIcOnx;hPJRh7*0Ww>Y^@Qb#SYe$VznJT74O)dh~Qmm)O}__zMHD2bqP#D2fW zd`g7l+%8<{GCZDm+MF;Gp+KCDNehv z`#=w^=LaS4U(6I~!~Hh3WSsfijHbbP7yG5$jOP7t`%saS^1ur>@*rX}rr;}aYQ83Z zS%LgTWLr%gtrCTVkmo#YZP0mascu5bj~ysov@rel z_(%?<#9q@e)R~syNSlN(_csHtcUZA$d9cW3tFF$8blD+KDnOh-5gyOK$uZB|{nJD~ z;#kB_#M6=3EkimSluk|REV20AwKx@pg{TwnG@;!|g>WHCX_n&D6|1Uf=LOcPpP&k4)XW1!Mx%T3_maXyN_>qx2+y$7orB|i!eK3- zf`xcH0dxIIH6Ito8DHJV>N?hqIo4>QWRRVnL5RLCYUqb$OZz4zY5LRkO;;Wg*mNq4ecejheBv@le_~r0r z=lHsGN2t&z5>d@jGvQ4+yMk7#Np?+YhA;E|<$`4#BDuUeYjP0+CMt(fDVvSkZsF{e zPx})CLsC%eBu|#9c4K;bI@n=p&MGNwjfsStk8Ibk%wsI}wO$Z+G=42>0BN%um>h+? zCQ!-ny@qz8AzAUlmzHQ1N+i?%W4i?T&euUfq#KtHA${OU$y@vV@hPF zAA~WQe@fs{M?N#I#c@2Y`@t69+)*93s@OK*)$+rh3!L=N4c3NZ{mQl+Q&boWxrid~ z5#_yv0e%JySdtEB-I+1Sh>h8iWi|d%W@BTB*XZ8PbU=QWaq=xdkkmUrcgN^g;(mu~uJ7g66+pJLW^f!ZnAmbI=?5!(nJ2RX}L zPrUxkA(>n#m|NS^a%16Tr)~AYSNB{jyh$7K7L@zA7)PrKDSbN9xcRfUciqsmZ30@b zJth6bud=U!R!kys0n{;V#x|GJb}(?5KDTH^(9qA&g&a2${$(yuS)Hr~sCl^71%4=ub8U*&rV(DXt1J?C|ybr3- zlzr_?M29yQ6FACkJLV!?$2S+vuOo%oR8q}WJ4$sfVvMYREtn-q^=4JP-(5jH$S>_k z_Q>Dk%pVhW|2LoaxlASTutDJQ`H-*mMB60_(W(-dXpB%aMn#OMR}_HY>K=Aa4ysU` ze?AhS-l5xtGulSL*$Lg|=3fMp&8ucIV46%7L*N|lrGzKxaJY#_h$`+mB>B}>iA`!%&FBgWqC6=LvD1tG8WfD16HI3+`_g2He!N1!ftzJ%%ZTQpTJP_zd&8;?Es|`KDOHN&0 z)d`6>frLapwRX{ewg7CUQYF+qjx$A`@7K|1JpdRl8iF|5tAUzvJU_b|iaM)r0m*eU zdyV1D22L6*F)t-T+fCn>PT3?=&$TA01i4?kUHG7e%jZ!)o!Lv$ch1*Zm1VVH1)7@6 zT3oEHG2?U>?jESA@>zsHqG!RjwJ)~e^Ipbgf4Q?~(%Wai!iyYrx2FDWLffFfqm}$D zbE_}QypNMbPvYcU9 z#>ZtB^6>t;X;kWxz%_8=`H4A6+9VK1iN@U!1bQ#4#<_Tr4?~%5U(xZFjVR@fU&|&7l2x=T`&r=F;AbK~ zU}|IrWV*h|Rt7Qs9M5UMqo&1eB52VJ=v>AwhKJ48eJIR-(j3kvSY~F{MjOE>vz8wa z2#G?j;KuUvYFbYNtI2)=l~11|Cr(=Z*kIP{Bsf7=qk7X$7qB&tDWGG}fXiv~&^ zr1kLcPR>uk7bW{ZcBo=My&UlhaU<^j@V1LH|F_b&01EW?Raegss+b>1i+|x{dgLLs zy;XKGJcH=eN89fXaOL8|K?}` zVEuer-Ar@t%stg}rDOOk92TEWGU2hgJ|$q|A_%oipAE@_c6$3qOrRZk6z~Y;*yQ}e z{OEylWfzUfI;&D6Y-*-|&(Vv1B{~kw)tYWQy_hOURn+H$WETHmBxc-1@9~06Y0Jdx z?jEoA8K;e$hbYQz-m|Vt_Zb)Cs`gFJ5w&tIe?ybd)*(?YK%8dV_AAK=b6I8~kRA@A zc(1QKXxh#IB8_mbq65`T$Qokc_&yLvDK&KZ;`r3nzLxMRk62877!H=k0aHkYeU(D) z6o*p<96_>Y1Xo?X%?0Er((O$X{*kqH%(SK1*fN0#9R!124~h>c;-pySG7U_BC1Tbw zZQmq=+12A0y=qwt#0s}7Q$8KwPj3Ob^pzM1Uq36yPXC?o z+?a|h{TS}D3?&Qe8OErBEuBzcbC5p*e9!u|nqkV4AoJ9gp^XKD(xGM$Z&%`*AIXN0 z&$YUlLlKNN8hZFIs)Dqzw}9TCZe-IYZOKx<=Lwv_8L$GC6b6sh1LcEDH<(XcoVEw; zGG?=)cc|iJlOw&{+IpeY_klve=b+#lX*NBbe?bbhgu?FU2Q_CAPn}BJp`K*!_42Z~ z`x;wZOjb^I`rO*1*EnkG7OLi4zu`MeWP^64?2|gO_K-B+wVJOGS9wqb4rHmkZ0s zp>#s`U0Kaa1usxDQ7$5k>Yl&d_7@F3GD)$Et_4zleMp{`N3SqA5P_D2n4>p;!qsFa zjs(lnyyf>xPgc#`W_~gB8b_vI(`Lvzh#C$waH0ayp6a+4j>?e$vX4SO!rn4YwAg3g zNb3t0=n!}egsytkN~bRC$HedIOPtQUT=d|M6?%IMc(x~~3@3b8p>%&yMlbB!!g_C& zP~Z3=c++GC0!(Sw?L0=HI;AS7<=r18W+Y=$t@YSs8i8C=ovxGM~|`o3>{C@++0{ zXL8;BR;SI5W=p^v)TDQCkjxd$1^r>hRdYnn>5dvF1w}9dB|PBCsEOWv6Rnp({dv2OV6uCyMK<2sbcf6)An;}(!u73 z+)TTz;?FuKX}#p1WZla29vaDLHKvXtD=jrR=WLhen-B!~j#645R^O35pI5@twzV=n z&FvNN;d$acb-w5V7R)o0c=q_=@wwY`ugp7O?{B_q?Qp;m$rEZ%Gw~W%&w7Dgpj$r7 zqm=H&CojD?8ywIaPk=tfr<%4HjT2zOf0n z+Q=eG*cwwTnLOvY{a<#=#Er-mhD3*xKfr`yAC_P*KFmkO?+P}HN6R=SJ#r7$HkO*9 zW2dls7cdepXRa3YP{c8KZ`)m}s?rT)5H`j~9{M0=(~>GFd$SK(RsR z=XrY~2NgPc>4X$(TBitqn_#m@#hlpHB)+yH3WC&&GGGiw`txBdTdVIB=T|ku*0QZd z#SAK)3iBzea%L*;`vRuYh&d?t)}TIfX0`n-fU&(Z|C>H0=$1n z=d6|A@Y;#&8%u&FWdiE(_^-v|gml?{UASEDNqeuuAGd75M7)dyuh%ZN(=%*K-@Nm} zfh6lVd@_YRwVxUqfb(fju?Hp9TzbuUzVuV0Gdv=3bds$i800_rYAGAC8a)ZptGFp? zU-b;bDm?Ol331g|beg$Ke^be?35QFi$Be7r0$4#kF`iVW7;}HCjwxS`*0LKJD zhRE@@GQy?M8Wr1#fig-*CU6QS9J;9AxBj?nbHx!fE_4dd=JtR%yZgPpxCwTZU~hY5 z+ABac^Q0eU2p)84D|c+~hR*5K>o_>QkeaMFd?~o78wxoo~$3w&>rQ$L{47+?17PFSPV2jR-ZEID{uF6juf8!VsfNT zlm!#y705D4OIJ`pcvNaBCY~PE94jf^lcoG)%YTJ57_r}!Ito5I|2y-P%kziLxhti9 z->dr~Pc>0Pu?*!}=5z~M$~_E>Cia|8uLVB3VCEE5lCC?PZD|&f*g5#uB;IkJ&f)7l z_V>1=om*;f6aF5ZJ!z#(b_|V2R>R`y!necYv{bJJ^+z|hu?OsFyuuhH0yA#TT~^N2 zu4h=dt-A5BAv~f$RT18&EcdMY99|2W=gcZ~X$S)ml=-W$CH}~T&jivt?#C!JF11$+ zI|h+BHR$;r=9hM-Z+4o^?@X3VAT$X~r?TpwjvayZy#so~48?__zM9?9&`=7-B;$3tcHl&<7%0sA_iVhmFm5_k7|Vt-bmI+Mw=+XV}zlg&g?KcCrDe>jS4 zKc87d<9aL6>YF$Y&KGQ(5gGyK?(B{{YUUJ!5nJhoMgtJX3lQ$FxM3RMh&ouNTnJ&# zlu^zpQySYG-(q-lUFH%WT_J-=CIYxg%uGI0NRjq^nx zW{{}6YqIa^Zs-?QP;kx1k9%0rBk_uQ-sjiRsd3m3t}~z36dt{|rlT^Gw4GWn5_l6~ zhLe5~^-5L3${IEWQqlrL+&$I)LD}*y_XN%5+J0q!`$J`IF$d2!;v5A^i-I5X-U15c zhdQPirozUvL7*?Zj_`!m?`P&C=hrPy9)F=q(F%K={G>mu<{Sg>dA`K_(8!kg;75hV za-MTbcll?eHtl$se=XVU;JaHu*R>eFl$K5z>C=YyNW7sOzp3a!2dWVf+iDl%T88bF zE{c`Uu~aTe%UjIR8XR}=u~F4e`JpY0{IAukSYzK4HD0>4jfD~NTQJHz1bZ`w`R(gQ zAxZoKf@<0CZ9O&L*`HcOD;Z~m_`H-l`U`Afa4J*17tHo`SC`3hZZ4|NIG#d8(@-=Z z;uO+LDTS-w z>|EOGgXaAmXPt=5NQiTuLXpWuOPED&zl*3i@;vU+!I<7TlfZ0qZ|h157uw=MscI2B zx`Ps+<`ndI?zltUF2^mPp`wIhb&*Z!@JkK0`pO?_7>%OR=B7=JIK{#lIk{B!^{gG| zQ_|v{o{k~Miv+-sP{C!6C*AV-*R8WI{d-vDYOh3%)$3A3vfSFmM<2BHJ@O|$N+;TP z#?+6Z61eRytm|D&vx589z>B>n+HIFZ%pbRsJT<&FYA(WDN_Qx~;punN z@PL(11i-`?rS0HqKoTXOU_Pwr^Kgw_S#6%XeC9qwNYSNZm5=Ijxh+|HL{`O%UPtj%wnTj@^L5V%MIKk+{p5xt?4qPXQL?i_ zBed7s`*N{FG-Ni9d0yCAf{EjWUAL?3B4cTw9EGrLZj~nx&+u5KgXv8>8>qV=WAqPN`KJ&L+bz5Lx#E;?NB$&+Bb4# z6~k5BjkRh`#=%|JK>s0j4dDkFd7gm&^>xL$4J><8*4_`D1wEnN2rl~A-}$eQEIVw8 z&lx50USy-Y9xeWLR};xL(_uX``uzFvdKfijW`jbJu^~uPgRN7MBUcI~)7d#z=TT*9EwI7uDgtG|z>?*^Q)Smc9Z2Rmg zu1g$Lx>6dd-2(KHQ)b###D{FHMoJD{trQ&GW8dOjyITNWKWvu5a0{Xd!UZanBmV@K z@4PjUjD)m*2W9bN;ObJblS=-moNf!h9l-BTt#-J&uqWl@39D&8y~o>R_Rvbf>8#dW zxmQTV#>AKEZcBN-`V}8xDa7hkPrnFVc{=W0-q|hF=qGPI9lI-4fYsu7F21yp_pY9(x}@_^MI{(BhOs-ncG@#EEDwVTL> z-(Aekw{Qh?2>vTC<6i49L}tZY*|&ZdWlhxA0<#Wpq(xlH`g*z%$32fR`^eUI-u)tf zJCsf{iX8#kpPJI) zt*VgUKQi8HdX>m|2L7F6&l>e>G&~^`wZiu>5=Co^8mYa#?Aj|(41ao%B+uwoR!_Ls z=$u>4_j6G%#^~)TZD(RVJJqw(f78BaK=TXlg!UUsYfDpxnnaz7F%bmE$|q2rTiJNk zyrxab*wn#gz(F0cMo2(v;!Q16?xP;xp;=Z_6;kY7K!krcR1u<27PWCuM;1f%dWpqq ze4W1eiv;u*@Qsz+DK#Tybo(yGQb$DhBz90M99IY1`fX?xab#ucso8x0{LUGC-!1jy z*Wazc^+Xfq$C@63FF(mv)Ieb%4XiYneVnMXYOh9y=N@hY@+($G>^FzLYs%H>45DgWPjr2n3yb>&ou7e@kY6*WLZTfls?_xjw4Mo?9mzbJFz&t&v zz=;I)Ca9IFjxeaSr)nTzF8UA~pyrR7*yF1Z*;h+3kB6PRIn3Eywc0(tATtl;Pw`yc z^upL$T(^Y2e8Ghw)0dehi`HVx8x9k8&Wd{5B#Rxc_~{Ij%@XuIf(|o5O8LIL*q#y}+XEWT&0jo>(6A1|8hf_b4Xg0Tup05ctT0MThE1?e-PP&+lQlK+# zo9*0-DyLI>!!GX~h94>LuMUv9y3xTHQ(zGKQjmH|*43Hbs=RukV~p2J>%^7zV`Gh5 zjqJYKGRfOB-�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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg b/public/assets/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8421113e0b4a7a51160372eb19a6f2ab2e35884 GIT binary patch literal 152999 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 UE9TaW1e4Xu)s0izmhVrFn?oG1&1>9)rdqYW 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� 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

    b*&C#e?R-c!Y+IkGbf!#zix}h$ez$2xDZM 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
  1. 1gDa_Mei!z}iDsxNWvxUXUPBWjvR%B0?&YB26}8}w^22-X3p z)tut4rs+oaA<*9nqLGr&qQ4BAhw%8!59Jh|uQ@+s z=NzBXNAh~5MnnSIl!sS9NZAQv`T1IgZlF`>Zs$+L(F{|Ap1kntG&0B+J9#oh!o`yg zLL)Xnex{KO6P8+M&HCPtfvFwNJCQ0!wU zs!?CL894SSf9F-r*9|u1vE;v6_s(W*`aJ`v#Q0WE?yT8v^ z`b1|$aqqz{UYWi|ihB1ul;_(ti>Ie<$q_)FgqH4yRrmonWy7)Od^D-nBWA+{Oxbi? zxz^hiqgJ)qRMWy%ncq`U!QX8ZBwQ1wll-Yh!$B5ARH0!;GPi#FvmO(Kw`?1PrRSWp zmuR2_+V0{`3y++eVNrZ_Bpu_$FM>N;xsikJ{_a-?jrTP@oE7AVX9%$7pRlnP&EwJP z!{*WQUPK_F*8t@`m|M>j%_KS*X!`);Yd5%kiejzv8W4fanQ%(`Wp1mM3B5m=hN(gw zex!eSnSXQ*HUTsQ4P9dG-z{Cev2}dD6eLEOjt-B@t>fnZN0h_NJyXZ{sn1tX-cB|h zHnn{q691wD|E&o)yU&pPr*Lrh&fma;qI3U&y;DZ z60ktfLbaH9pi@sBbzI5c(S5Y4U8`w?NmY5YIp5-YAOU~(M)bi{Ou3oKy+Acm<)S7` zX;6WI;kjq&2m*G~#d6S)Rz|+8iKfQlTH1PIn6?C%TcsT@7lZ!9@Ose$p4rBq)Z6sJ zdFNLie2PsJ6|r9bZX$2t!4eRz{$0FHnRT7A??-dpH?o?;zQ&o<*$B&gvA-FT5A=8zt!|q3mpxv{y@jT5H&*e&DWd)%L;~{k)L~oF zB5li-*}JD_%guS;8(%xwDUYSfp{thjL-a)NV1MDnLd}9w50*-tw))O|yI)@nsck*! zeuLe!_pc;H{+s%PGpX~{E>B9gGOJLd!^;H<;#kYDgz`2ToZ+klEeY4@;dD*GCsIPM zWQNz_`GQ5W+z|gn6$+}?AyeRebxX*kUg5OE{D-2sp88~0^`(Fivd}=E_NZ{IQENdEM93;*;R;+Ju|j-!BCNYl4Q+ri20i@0~hWg?Oo^)uZaPd*;xfB193DM&MXzcKaW3vQiIx+Q_jy&BX4Cyf=yHgIB1 zi)nkAhHk217?CK9#^&kYZy`_Pm}CJhC)B<`2vh1__2SCd$I8e*)5H}8*-WN}2{(

    U+p|UPy^_6=WSVr}?kN_M8tN`>HdZ_u>u!JY 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 M5gp@4I2{N7*#rT|-v9sr literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/airfield.png b/public/assets/cesium/Assets/Textures/maki/airfield.png new file mode 100644 index 0000000000000000000000000000000000000000..b7746842450337edd3077787e78714d54613eac1 GIT binary patch literal 1188 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 Ef)m}|HUIzs literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/alcohol-shop.png b/public/assets/cesium/Assets/Textures/maki/alcohol-shop.png new file mode 100644 index 0000000000000000000000000000000000000000..b75a5d9eaa9f28c1903123abfb7e53f381abe74e GIT binary patch literal 1293 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 FV1ko^?Tr8c literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/art-gallery.png b/public/assets/cesium/Assets/Textures/maki/art-gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..a663512ef383476c5371146562eb372718a0936d GIT binary patch literal 3159 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/bank.png b/public/assets/cesium/Assets/Textures/maki/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..a67cee06eb706317409be669ca47654565aca264 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49vEkE{-7;x8BZ;^$1RsIDVa7R8XW;P$JMJ zJa$S#S+K~ZZBf}bRisT8`k0BnVa{K6K|H5Pg7+Z5T4O-?B&pPJrQK4BPUfBFuI5fX z@7Ut5nQbLj zwE=b4IntjL%1$|A`EW`>$g3T%GS}6H%;GTXkK#x=X%DLDzKcZ8bqqtJ7N>`^j zmz`g~&_eX_o(;C~2OcI#>+9&;>2O=TZ{|!%`xnW1dGFGUX6^}EvTbX9_x{igS>_V* z^80V!xbfp++GgG8wbyv29MPYC`s>!^%b#a5GWsRXcdZM_{BL1qR(3ycd;Ri;wu$dv zy{cNbcJrGbSF_kcp7XELynNxpht5Tk-7=n&Hb%VJ=GGK@w&C*6=2thC_5_+d=44?~ zz7?5pQct3Yd7{S?#-m2<+qP{p&*qYlk*V?7c;?{y@B5t@m;@RcdKDbzntlELoxQ!i zUEZm3$K7}5cd@Q$jj)m1f2?%&r;imj@&XMEED8*a91buIcR61JL1?$3M*pv0zw~3e z9z+Si6(FfaVTy=exN=40^@|r3OWVJF`*z)Iwyx_#UI7CGgAXq6doxO%=kxzkWMCAL zW8_%DvUcs-e0O(u=GU#)U)TPR=YH|-om}Mk^8G6xDFGc~;M(x&o1wk^`>V~bx)qq} zLcAQ()1Q0qU4PLdDk^H3ukeDfEw9e*viceM@|uC_9=F32{_j7uRYC6tb%!1nWR#VC3!8XaJU#XK{W;n9R~tG&3EE#Uk9ySpymVO!_+$xbtytlqqd{9MhFa(M5dk2(ICDN~NOzPZjM kb3*nrCvxhYaO#FVdQ&MBb@0JrL$(*X{S~Knx0v0)W;cxF|w$-$6+@4;P?$So8C~z!E%zlK?>W&+mZxaolDU< z-fx}b4eV-*ON+5CRdz7C7Z&S+P>P(8180KrA(?pdV#=vQx8|BxoI8A|yrC~&Si@A( zc1}?an!sl9Dk_CSwq~EfV3Z{^mCCxR%KWH7olg}1o~M?-H>QxmzM0_4 z=P*2wW>>m@gYO|Sy5vVhaX@&NB3Qh5BRwcIv`I@{{l)0?^p3mn{T)M+@9YyAZBI7h z_`0>N?d+AfxR*AzwtR74U*B0viSyIK=;P(uupF1*Y&L# zu#da(JR3I!2@DLJg+xK;SK2dwc_uS7G7<*Jd_vhu*%_lGhlMd%E~yGKl9LcV19#y@lT(2 zgXQLbr95!!>B*Zy&dL`u2_GgVlAS!cb#--TVS;GZk&ms#JZEkK79*vxQ zO;z4P1UsU5Rw4$2Q6wcOYKhF>;5IhuE+kTQ=6S8_>hIPZ-xMHALi9|qj@o+zeq09! zhj=-gJ*gz0Zh$r*t(@6j@+n zZvHk}Qan0}do|8My-hdNJp62#n(%z(3@eEu;ffs>O{gsBp@ySW?YTr536aUzdYxoC~pui4x(wx>6kX=D;Zf-meuQ%9R z)V~NfKI-~mbo6Ttqcw*P>=BKv4u#w$lgVMX;V&gBp6(t+qu7&*F$e9Sv+`a;dmoG7 z_RLyq!dQl@1H7%Pizqc6o7z0oUK5i+RP~~I32YoE!1Y^(S&H6a!X4cix;v`LMlHLg l-Mc}esmip9dtGU8T_^QbC-5%0ym|jn0WWuqTeC}e=6|d!rZfNm literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/baseball.png b/public/assets/cesium/Assets/Textures/maki/baseball.png new file mode 100644 index 0000000000000000000000000000000000000000..23f344bbfab9618ca1eb6d1390c104547211f9ab GIT binary patch literal 1838 zcmV+}2hsS6P)Px#32;bRa{vGi!vFvd!vV){sAK>D2E$22K~#9!?VWo_ zWK|r;$F*{)WDBF(h~3zww%x7WUQ4(ewUv(Z&>SamOeGb~K&8?me3We=>pBR&(0m|< zsG#K^4U`ZWNSTFFlOQY~x z3{?!G_?zr@RFtv!OG`^Bb8~a9si~=~g@uJwivKx@%IXwl@L7#9DyoOqJJmmu*snQwJ>A;)!r`tK^gIVS^y9$ zDJkgzAUuYuE42R3&dzeJ;%``1R@P@gOn4BL2LR|5f5Xz!(!K^f;V`Pt833{T{QM69 zPdFgD_(_N0EksoRI~w}aI?q&9`G0BoOH1UK&-d7_hkUWb)o_=`-_p2lk+hT z0K_~VPZ0niN<;v${zBB$)YS3WB`zw4sQU&a6Z8#Kjm0mU0sI|f?SMqI2=D30O1kH zkogE4837PTe;vd`Ede1&mXwtAQxJ26TM&X|85tR$2MdA}4|X90$%>1M2YCW;I-TEQ z%}4=4U0vN-o)88G242KvE|($LmLXb3uY2+(gbvIWcBu zXP@B(z~OLwkMZCNgky4IEH5u7^McUY+WNZCl~X?mcPb=oM&}3jiU{F0h5FH|!SP_X za1f*~eLVz$jOAGau-om67!S63LKFm{s;a7)HH6B_%C`~1R!@k8Ak56nWEi-_CDtVB zrL=DhlNcj+ zjDqM8B9!7ndV2a7oRhS@CebfaK87HW4d4tQ_=KO-SMY|Ll)OQ2_MDlS`6&ivon4aN z>CVBy!I!XTr(76{GF&1Zxg83oz|$jU4h%LTO%yk4(E zm~sViZC>JUSW!{YyJ{goXBr7plAf5D$WBg9{$aB)wY9Z1S|ChLPCm=9Tw&iS;s-26 zukS$y3vY#mh41l>3(%G*$#dg&Z0n~LC^0edycP%v2?-Zi%qfR;q9%QTQ!GXc9XK3$Xv)TRtKI@?!)B0U5*H;X)*chc%7^S79?=U)4>d1}&ptX!36PWEZqbxPE zZ3P7d?*pH8G@QhbGNP8_cTd?B+lz~fPt)F~yu7>}fN(5q3v1)!<2gJ5tV2jpnDV5$ zS6f@#Yhew6$MH9`2~(iczqEKEuo;BdJz+V~qE&p7tf|RZ$>u!;2tJ)FutPs4u-w*4 zGUfoEcS4~N>{giW{Fmn5_4V~{h2<)2GD`7(;OXh zG&D543B?4GolABfd6AK1_e;Ou7_xH$DlMA#^GKfXD-DE>j*bcq&;NKxdxApC-(^&z zpe<)BBx~Fo64RIvj8~pO^&{HRQG0uPrA7z`gFQsGD?H#SgFI6ff^;n~NY)^)-V-Wi zi|F+NUR0>XC^9QY1EHy@>5V{3?cHwoIXn|pCj^_#_B#!Po}QjpHpLMyML9*xP32mK zsIyn;6 zf4$}3jp}Ml&QelRzSG(AkD{{l0Jg0&B0Fq!OkLv3OI5~zYXS*L7W1kd?MQYPD#|b) z$ji(7khaf9@%4GZwa}VVx7&RddOs!xTsB^ybxQRJs>cq3MWy&S&gTFjmQsA|^Nk)E cX??ZI|7*Dd*pJ!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1quc4ZA&E978H@y`AgtArdHaeEFp}@-1#IWh*{} z1Xg?$`r8;&e%n4TReM>`t|XU9>=&IKQ>r%lxhioe-Q`jIG9@KZT##AtkX|L%eY5BN^Ru(Rr?uVppX8(WvBKv5t4VXhJQn*2 zx8|&1QlBBeX=jbWeWp!QKT1nWN6$&ww^m_-@ZGgnI!>NE`8sU+rJs|}ZM}Nx*>ml= zHJ+X)<@=9sPAqLb{7_PqWA_@1HzHbdO)_uHl0D;p;{EskL6VdBqE>e zq6f@cm(P@%&zLXpGRHn7@0_L5S^K3)b$5K9sXzJrQ!G^Bjd@Am{w-TdPWB!ZxU1?T6RcGan z!w0@R{rQ&&^Z{P0uDod?1xM*WN>+!M9OGl0z;cbh2oyO#$ z{AS68=QwyD+q&F+|`-i+)(K2t(8R?ZSk4=RRym^yzEiFblcc$Q6Al5E)?U2#3{rmTOF8OJq&Q!Jk*ip&a zD$PTGrcIj`=l5Q};kTBvpzji&;_0r7FPcxCI`#3F)q6!u;=;qf?^?e6xt#CONf-a@ zFPlG2YK6>>d5;284p`rG+Hto1fvJRpU`$xN{1d4wpUWfGuB~VM6h3uUQEOs0D3y7- L`njxgN@xNAi`h+a literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/beer.png b/public/assets/cesium/Assets/Textures/maki/beer.png new file mode 100644 index 0000000000000000000000000000000000000000..a15cf99119df13c3f50968f637e6df3170134342 GIT binary patch literal 1403 zcmV->1%&#EP)Px#32;bRa{vGi!vFvd!vV){sAK>D1rSL@K~#9!?VVdl zltC27*X&}Z(M?T5iry-^5SG1^L3?+#%vDpe+{M5mkZ4gN5)75dkbDu$$`|v=hm>%; z;6qO)A{Lq9qalT135I5vZZr6xjpI7sef;JO{NMJQ@67ql?#!7vGi$LhmbtmP1f(Po zvl1;z3#udz$pccXWXaACg+e>Paq0>AbC1;C4~|n=QhI+hILtr*=)=3nhsVdqv-jA(9dE;Ez!@d~FA0Ni9nd3kw#EJg$Zfv08yP*+!1#nNuK z+dZZxfE2Q#^78V>EQaLf=JqR|3ma6BohM1#OG-+fv$Wgi^Sz?9`;1&elF7>2+S*DP zzlw9J^#uI^EU`N?Gjo`w-8D5e_bJaGkYxy(ipFp;7;ylAwavY~y_YD@Cm3RkhyYZJ z0RR9eZB}9oZC6N9Z_uHjpWQXw18_Q>zvQloAjNXt`!^~{NYDa+jjYh?^$sWq#`bd# zAfB{27z~!MwAbVDeA5EJak9eF($Z%v2KoK|AjKdj=Kzk8Hdj?uJz!~Xetv#8WfkKvo|Lv=RHe%F(?XvBT4~8iM}eTZ~-z=lU@M;bewhr z00000NZIZ7DHfxqr>8Slv-5E<$p~OpO8|DV;`H?N?~nnpAQYTVPyo2q0+2>lURGB2 z1RTF0G*$gTnSxr?0)x)cyq2UhY8<3*b0#yX$iprX7Y~x~y7LsuR000000Kj|z zGBPs0fb;bOuq0Qey1Kd+oNo;k78btM13&`#g2BPTd;nk#wYRrlrvNyt_GWb?`I3o= ziE{wJ8X6fH$)QBSQECH#U`#^x2hOhGDqjW$U;qFB0DuMnSkDWXRSt(^N>2bO5DWaT z;^N{L6aWt0vc@_)JFkiips}&>HU+>wtrAzG73`UsQawFAmnl=wtz4#Vi!uNs0P6vO z*=9fhfMWo5yZtu+&<}u$rop5 zXMchiK&R_?(2G*Zmj?m?q0S57;8XV)Al!KYG$j)%N2s>8wp#Tw!4iIg)`~t5FLNFs z&d?L(Fat99NIw7o0Ad5M*=*B-0GQkY$V02qjuU51VU0HVx*00000004kf0A8>6BW%Rz2Vlv*Kz)7v zU6bbm1q~0v76I5!8q?q3f6>eU@GZK!=K{gLK=?cGG)+gBGY+`j?jL4!K9@HEE4}J* zwfBA=0L0Ra!p54(`S=R^Wjb5D#pn|5-c6i8iBA&ZEP~Z0pU?MtU|^siT>C7%6f^#H z;Yz~yXK(`m8M96>0GlnmmF50_#e_Y7y@lt3j67sg=clUetAEZ&&<#%~#s~la002ov JPDHLkV1oGCVwV5_ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/bicycle.png b/public/assets/cesium/Assets/Textures/maki/bicycle.png new file mode 100644 index 0000000000000000000000000000000000000000..fb871be483a439271a6a9ec1123dcd82729f1ce8 GIT binary patch literal 3989 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/building.png b/public/assets/cesium/Assets/Textures/maki/building.png new file mode 100644 index 0000000000000000000000000000000000000000..885f1128a60dd5382036528c43f8fde8a1a432d9 GIT binary patch literal 1765 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 UyCZWW6#xJL07*qoM6N<$g0*?N_5c6? literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/camera.png b/public/assets/cesium/Assets/Textures/maki/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54e12a21c131a7d455fc6735e0b48356b0d1be GIT binary patch literal 1976 zcmV;p2S@mcP)Px#32;bRa{vGi!vFvd!vV){sAK>D2Te&tK~#9!?Oh8@ z990yhAL~Cx>L;nS(U>$Q8f~nfCMNX@?7s-REG#q#Xjv8#@B=Lgh!)!NiM657)Gwha zrXXsIO)F7Cup%a!U=gXL4F*F|6h%=hN?Cj-F3mEX-FdUjEDUpRaISKo@idAR&sCWBEdK`Z89y+ZZ0_+I{Nzhl9H2?JENkaybRMyBPAu}Q`itG``U%({A*-5{-U-OH^g)-k+AWw z|8)}+6E?fu{*4-r_lLvb=p7#)kM*~WvPhLToX)?N70RGM`+8Rp8&?S1{_^tjO0}Io z1K1Ll7iC%q&c7^ByBrFbu3G{$Kas+7Q&Ush!bLz@TH41V<&B(=fzR~}cQD+`utC@? z0F#rG*4oC;Y;o5GW{K?ECx=O!g3eGx7K zU`wQ|8v~S83isn_M~8&@Zv~IzmtZvL8*K)y!DyFRZQ-h!X0!R{BS((pg!;53CMJFv zE&^anrEaZ}`Si;Me~oTm8GFwxP`ks%-<8c)E3{s&uI zTQk*)x9A<)wrzV&_!LA4<2w8H?JFi{sROs$eOQu!nwpvta+W$kFOUcz0*C-2fCx|) zY|QeP)9L&wFE8(HHt4B1aNxl6M~@!$w6wHj<2#PwH$-gbb9}Sd2=KD;N`Gl->F)mi z{zTq5%$YN161Q*P{tB)QcXxZy5U^>}rop{?_r8evh)@G!xE4B~iwNMy`RwfMcSc7? z(4BcwKA2dsV!C?6F;K75>sU4@UudmN%w*DXj zW(TqU*}s2(QMfYVU<+YnA|OZrOKmWluM+{j>A^rVN@@Z&)tCm=6ai=k5E_^3xTdD2 zJUlfXkLO(gwHe3c5_#;{u`D!yx+NeZBjZCkj^DX+XQkC@JsTt|; zDcupUb?eqQc%0*QyWbDhMpjnVdptG@3JTuT9RZDvjk!F{!(3jH?Apm73o|YNFL0%r zAx#i~aKO;ekb|T4A68?IR*2!@VY^Zx3QZ7Tv)P8EqMZ0WSdT}JEuLNx&eIJ6>;-&E z${|RXM4pWjVGf=i5jq9BApo;hQVuzB;zT+-cS;F+ot>R&Qua_L-4K9vT2c<_?(R-e zC}1`fU}4@YurhtE8v>Bb%G3Wh8jZir)fUq+#xovZWg5^80Vb2_cb*xq&6_uWGFMyB z!9%veU>MiaIKYcGUdl1m)zvS})fVQ2rR=n~w?C!SbfsnnVr6AzFY^T8un=%A3o&>` z!pOSN-AI@<4IMnrLArM+?*i7$jiF}q*ifRW(;NXvv_k$4kAoT-8lE+q&7-`!aW1am z(apvi2}+DNG&vu@8;}Fgm-p=>5o~NQ#m@PRr{AweAWm}xpr#@YBWD(?v9a+P;1n?cl@S7Z6h(}?4v##fakuWu1`vv)uwe&qHk5~JUl$PQLWHO^iqPFv~sfd~@L^Yio3ddmOxtcX!?d7?e&yGf~MvZp@bTZu| zlpW2Pu!U|VZ)%BDN{h$iX;v#2bWyL6VSV&puw_nfZ?8+P<8ckHg$`OFqresb7~vKb z71d&07;3fuoHD-S7}kpw7Z=yKT&^xPx|p;|(l4t5BUqcw_C0{_3uWUGTBb?_5CKF0 z5ujgWW@fgC5wKA>!9mVa2f4Yq4Ppe`=YL>iWF+2XGW|*pQ$E?CuCA^?xR*8vxK+ps z`pe`nWr4AZNY3j6Gn-`_#WrSDaz0egH6IiE0W!XCp4l+_PO%|7qL0{391GnD@=;P! zQXOcim2dObr89ent`OUto1hwu7wyQ-4qVCbC^;uA&R-SiuR|{NZC7t5N2&G~S&=;d z;j$9@-uwQrfykH}Vtifw)$}KEBqSsxBqSsxBqSsxBqSvBEdK%j+k|KG;WoVh0000< KMNUMnLSTZ}C8~D- literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/campsite.png b/public/assets/cesium/Assets/Textures/maki/campsite.png new file mode 100644 index 0000000000000000000000000000000000000000..36e0a92deb342424d23a58fe325c74c07b11deb4 GIT binary patch literal 2411 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 A7XSbN literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/cemetery.png b/public/assets/cesium/Assets/Textures/maki/cemetery.png new file mode 100644 index 0000000000000000000000000000000000000000..df244fda024b8220e1b9e4dc496c24dedb952efa GIT binary patch literal 967 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/chemist.png b/public/assets/cesium/Assets/Textures/maki/chemist.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1ea3574940e0d0fb4332518e3393016880bcfe GIT binary patch literal 1603 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/circle-stroked.png b/public/assets/cesium/Assets/Textures/maki/circle-stroked.png new file mode 100644 index 0000000000000000000000000000000000000000..88689e47fcd3e61645900d6b2f763264df148c45 GIT binary patch literal 2126 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 N002ovPDHLkV1g;=myiGe literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/city.png b/public/assets/cesium/Assets/Textures/maki/city.png new file mode 100644 index 0000000000000000000000000000000000000000..37d8fad8850f8e449ca94b0848c5d46d3ea7d99a GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-3`{FMT^vIyZoR#0*e&HKa-h(3f{PQ!&K8mI zmSzW!T_WN;PMKuKl-P1abQH)x$hox4E4_5<()$N)ou6<_Yihz&Jy(HslSJ~;{8=}@ zd3F14VS4%d{U4;xOCJATTz3DAXt0**jT>^}PFbcxm8OOlQpDfPC@_kIW)%kb@w zp7!(=56~w-(4)Tl75`U(x^ymu6dV3zF=76uU%?+eE^HGrns(f3)tvM|?;|3N-;TOJ z{Qg_v&3eHL-?nbZ)z14g|M<#_#!LkTN7wv|>%aBf@AhYj?CD-tqWdNnGpN52TNGC> zxOqSK)DuN#ww=}3|8F`gV?p1B+Mvsp(+n6+->)#6U8=hJ+QEc^#nKMnyDVSSUi!Br zclzn4OH16k*lxW3TKB?l&B`Lv7qy;gaX0$azNsleoQohOSzmnroqUqPeep%}yT9#r zeeVfkx*er0s1yG#}1VRO%%mCKZ6E5`U8Qg;0K(kFk#PH4?(Vz)N;R71 z{YzAQdA?hPVe-i*Q9_pty?A{-5c9Juv+M z0UzUyf8xg6fiJ^TFXPK)-mo`e7KnB!@b{p Z{~2!INpjQb4|osK^j!HCg}w literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/clothing-store.png b/public/assets/cesium/Assets/Textures/maki/clothing-store.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5f8a2b18022fa2455b1c539a72a7e3599687e3 GIT binary patch literal 2037 zcmbW2`9IT-1IOQ+jg977QG^v*nj=lt{~OLIiA=1!Sf z7M8^3C~}{DB-gM|R=z&JeSZGF9*^hi`FQ;WuT&drON6MLC;$KmJkG*y&!m5V3Gekx zLD<#N7UT#&>FDeG^#Ay%W#sXB*WTHl4OZ-5e2nLgVTT-)G) zqU<7g(APa0^(iUpT^*$};$sYpr}64)W&KmNy~uOwOXF1HRQ^(|KTE z;P%480@YweBqb|rw~4`E-16`^YRa+)4YhQ*kl#9ukkpEEdI$1ybD2lTRCmO*iJRL5 zp3{uE@@>|VlkQa$!vEGcAHD@?Z*LbkySfSnc|6{LH7@0jw-f(Uc7ugx{UHT~7m9}A zwc5J6n~9x(xD$O)>+Fydt=`=A6hvC+?ZVQZzP`Tvt(Ec7&!eLhWpl9P;_8`9hy61M zaq)^#|E4YCu>mEH9A}^Td6vzQW`|nQH-oqz!wueCe0gMc$r`o0yIYZm1WS`9>LW{{ z{?JQ%b2DgKSSU zg=dd&w+|dRP?I=wLT*QiKp;#^5&u%OlS^vtc8L5_Y5#N`8*2&I(a|xM%9bqai0=6O zcvUMjDD!yRt(R}P78b;m+QWYWLVa&n|>pX{IOYX%1t zKlBzXEiGj=`k-bZyT-R?EJ{#;4fiT^1-@Btlc%&N>Ub(Sb-R`tp;kEDwm5hn2rh4A z1`e2e1Rv~3mqmWq{zCHVmQ zyztm(Wo2bRv=p)QZ+pG6zO%#q{dPyYluQlWE^;SPU2ZEQFBW$qbeX5G1%2>)5eq+c z1*YYG@cy(34Mr@tj?>lEb$~^`L#E-2jpC52W-&1_!-RGHAq*<`rjJj!8&AbQ#DMaY zEg?guJ;^7Rl@!fqqY%m{_m-eH@);7-$klcZ$C@(i{|AA1UT}Y*tE~k^zREflmTP@lu zd`u59Z0zxhiaQd5VM5Y7blP3I?(-&d!o{ZPt1FXlcdx0ij7)?bYcmi3jJuU0?W+z7so$&n?aVQJIMo;BUm99lB$~4YIkzMtFT2JKJI5};L=N7+;_B63^xGpXC zA2|FZ#axJ{$DFadU~u@hp6-|BO&Qfo;BM7o(L&M}5X0~5XW`Rw`MG>Rzkje=e;?)?U6GYrVK!Ly&#yzFZLY`Y}AdO02(*`Cml|C@69K zOoe_)#h^-So{h8fNc&u7b?5Ws?}Y&HS5HHff}OoR7Z%C1JvG~)f2|EXnOf_ z^s8tE-x>f2suBtY{Pnu)?;juV=M7A3=hAWRemBp=BmhwP?o}S2ol)+G=iLSy21b7n zekF+(O(F~xh7wz4&@O>(^D*-(8Z)Bt<8yo?vA)x7A}t?>`iGDQWA4WTzq;;`3boQJ zv;;6!>f}=f;Ao{Y^#WL8Lm0lJ-mt00&)lh=85-o<0#*SBNXJ7^p#NL(Y>0X;(_O(0 z{D4Z`P0%yvRlmFDt{j29rBpUUp*s&y*M9Cye82cxga?Q5j{&!|a n`7&TH1_(RJwlw`$9%6REODgbgc`LT!-cG literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/college.png b/public/assets/cesium/Assets/Textures/maki/college.png new file mode 100644 index 0000000000000000000000000000000000000000..102638704ac3a302655240bc8b51071492960438 GIT binary patch literal 2502 zcmV;%2|4zOP)Px#32;bRa{vGi!vFvd!vV){sAK>D30p}-K~#9!?Oh8{ zRAm&#@R3=Tr8y>LS~{7NrDd9BfSeM@I-tA)p|~ z%#3l+&@3{F95KtWEGLV!ED$=MU6|!^@BRN}ciFqU|Cu=h!!UPuzw*OR% zm@r|&gb5QSOqeiX!h{JECQQqknwoBJY-}7x{sQ>~@)6{H1TvNf{#F9|F>+7xDGEM@ z{->8f%KX50A%BDbc2@!3(7ot?pTsN?$e9j&X9DygayJg(<&If0oV>e0(slpb7=gg78A{LVDv;#>p1|ryKVQ@W_44J*ev1|@%J%T^_|4VT_1}ny zh?2_6%Gr!SOeTLAvq~VXJmPy3K+kG{cw;N?!U;!1LI@^;J;#xuv0 z--qBkaxOm-S&JG-_4V~rb8>Q${r&yFB5)g7;2XM^m)FnBmoHyeS6Ao52*fz@dmSba z9J%~WFD@>Q4G9T3Mqu7B26(won>Ov-x^?T)5KKlOz#;CkXW+Z?@C&a?l&x$* zF5iK`w{mcZdGqGIfBg9IFb)neSoa*l)LhZzdqI5 z+xx6ufLGuUzb7Up?!fHi;1K<-p1N8(m$#PdoGBVQAxxBT!5gcOQzI|LAf-t+S z!*coa=g$YupFcm3a`~%v2z(nd7aAIR4QmmTGTaiQjLmc7* zvvUZZT>kp?>(eNgU#+KH-pU*zzqYnE$RrLS)#b;qa``oD)};CP_?&Ze;1xK;AK(xd zFJAO#%!mnXI0XISeyz;L7IS%Pa)@QimaXUD5W{Z@=6RDu*a5D~px~0RebM z{>SX>?ALvLeQN}8=5cp-_qwE{r0rL(T=A8w_z-|0YGvcM$fi!6`lA4`{r!fBh=}4- zr%ugM*#n-tS>MrOx`^76B}+DWdV2mUK;>U@LPA0+l$IQshP8J~S((Lpu{SJSxNs-( zT>-GV`}z6RY}>Xig;BTzJMO1ca2rVOsuhT;s;Zf>v9a$G1N>V6-YWn9B`qy&4VG@L zQO|7lON!(nQj}B!ff~r1IdeY5I_Jp1qX3zZkg$t`0i$Es)7YlVFjnoqq@*Nf=FFMp zw%T+tVS}xw0a(T%3dSj(zU}Usp{`B-gjU-TzGu&#g@J*ApF7B?uPZ7liemupYE}`j zRI(Vw>i>fEVI#8V0H6xYp(W~Kk+vi~{2ubLEa{0oa|o3HU|^0kODBvo5Piv?X9WTr z0vUp>*81b(;`TyU$`OFUR*@gl3%f`<8BO_NVq#*Bt#Ake{;!yrm;&^;@&1E?f=;jk zfM$!e1-MKOar*S>8G7arXfsAdMHS22jJgj%J2^xdKCoVZpF4MM>CvM{Us8I%HWL7Y z{h=EVhd`|)G&J;6YjFtV^5Nm(2U!XSn+t$UGs-;Eo0pgO3Vq0v9oTh)JpJ&20|%mb z-k;3|K+?r<9jrFs5Z_ub5Dl|t%_@gv(wIZvHW>g(TQuI-6Yl7tu2``mlQ_f=<}44- zm@(rRhpNr40^lq^54L;v?nGV?z#*0{UAmDt#3d7tB%Qz#$Mc#q0cdq{ao4V0Nj#$!90EDJj6*bH z^WMC9^Aar`PP5~J58N-Ir2KHi0JH=G?@#1WAFk8qbY2!_A4#fWb z`{Pm6GX?l&r_}f}g#c8_0`QZ<02raG+g7AzO{+tFnVFd@%vsyPp>J~^gM~0z4z5(O zZ6!s~SPsYO=C&1i%My}zJ zWMr&VSO(AFbg0$|7(E1_kCJ}K9BZ|?Rm`}WKn={Anwk)$5(sYN0{d1ujx<5HC25F! z^#VRr-#j;IMMXswYCPj|R#sMK8|}YN_JRINA1Em)DaXn)p#gnq2nBe!1*)>RJ3{Sw z$ne^ne$i25W|UehQj#-voHVdv)NCNOS68Ld=3rOd0=rUGElq*v{ZL1&54Xlc0$ zG3u{5YD`Z_PHc0IInDshzlbUR~>T{@9-X6SlWGQCb%0D0DOmmlb%f~RrHgT z)?PfFFkFd)lurZrGln%H4WB4ooZ)Q5?Crsl=gTDOJ)LaDF#V-NAfBubhbwYYQ&ZOh zY=fFmEtV`6@Y2oc1C0S*ArLqxF-&@vS{cGNzt2Y6BZg>vxK=_gv@ch!T9v^AJnm&M z1$dREw1;%B5}rLsx{cl0$<|HM6uHQ+QE1Obh^yAbmo}I-EAGaI#owfne^5kW()C>{83lk!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49xYOE{-7;x8C0M_n2HLbNplE1kTd+-U_8J z1fD9sJ-;%i`dO9PaWg@0GlMr5l7yGJHd?zlaVp9k>b`Mnp?!k-($jjPWn6D2t=TVd zMN#a~f~b(yYwrtNpD{gpzyG-9_V3K{aw6Yq>d$}Q`uyYb{NgB`u4udY_a~ixI?MHz z%PrR}Rb3YKt8d7Q{@$Ck|8CGqUy(a1T<^p-c3Yg>|6-B8?y<>5YiI9|6v^|Sl_;gD1&a7EJ>>78<{%P;nvE#+uS+jPT7#S5Uo@ZodSC^WY`0$I7Ks&2T z^USmPI_2l*&zR9+HTRr<*lN@G{);AWt5t+L(>F(k&(uzApUH6c>8$+CH#dE~_2&^w z^Fj8f>zIrgr``E|`Q?`7^XC6d{Zw65Wfj9zaLK3P+oR^=k3Vvo)Mh#@yzuwZ>H|Iu zYkwSAym;~Tj9-_&eEq7b#a0lTV8}^(=qAtA zlIp!TWvytZOWt*z0~an_(4A`fZQZ(c;#>^&lTSX;ycuO|Z2X*&fuUg*i-d&4j${*8 zGrRfvE14#EsGK`>t?Ou#_)JzqZYE%K!aze5(~o4GNhjTG^p*$tFP-*k_E|F)2Mv*3 z=JxjQr}zHw{jt>PbN$(K=jKgbYiem(IdiMRwI-0}&y0WS{!jMWr(|Yhb4EMK#~ElX z94y$!SQ7jH&DW~LEbNq3ocJ%7an?Kun3+lLn6<(2Pxc#2d-v}7Ui&MPd)K|zoO-^{*v`j)TUdSl zf9GjR5nW)lD=Zl%VXHv5`A3ebv>5!7J&{a=V+UPeZhxYOh&>999Se4jf}V@%;0(N#Fh14nO>G*DEzI z@7)=$vt?6$*Qre|k z)V{Y1W-`n^!Wg~!CCkwneVw(7ZKBvc46gR8gIwn6>gTe~DWM4fpr)u0 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/cricket.png b/public/assets/cesium/Assets/Textures/maki/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..6642a3af2a8342896188779f3b75939d26565cc0 GIT binary patch literal 1677 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/disability.png b/public/assets/cesium/Assets/Textures/maki/disability.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc355097788c5fe5252fe1958f04d492b68c279 GIT binary patch literal 3437 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/embassy.png b/public/assets/cesium/Assets/Textures/maki/embassy.png new file mode 100644 index 0000000000000000000000000000000000000000..46b7e1e1cd9a0e7a5a4eb7b18fd6b68ccaf59ad2 GIT binary patch literal 1680 zcmb7?YgEz)7{>pYre$v45(Uc4dF^PKnP91FX~Gs>7)F6b<}EKI>QXXwG%v$~Fg3F@ zZ`jmK$y*H5jCrZN;2EYS^Va?r;VnQ^YAUnu`?B|(=Y7s|-uKIM&M({F*GF$VY&!q| zdKk19Zqv_yk;;j$w}hKm%KMEm&(aLlSU4-vRYPgmg1(qoU6w0KiwB zUj%s(TOA4jTdgo&$M7`q!u{xzh(O~PcSd~nMNv3)6l`tXZ`Lj~BSh~ylgzMd@2qsL ze@lP7)qnEqPD@1=z4iLGz=~f~^HAmxD0GER8YSUs6c?nwX1TxuXf;Q*Gmh`DuzO=LyXJlkF=;-L^@jzcQHh81tCYiQ>jJ@l`&z=<|5W}-~ zD#3CeJ!;d3!;b_Xyz8i~t*zb#gC*NpTZg;Z*hnt;`3>GUn3|Duvo*n`no&AM)>a+{ zzjiBhDmvusY(x$UTHAeh-N)ZQXCQk6i$<&JIULaHuE$_*;?qu=mHdXXkYMI{H~us{5@4wRYu!&b*HM#Ix0mf zYy~BXUta$9c1uf(j!#HH&}wddV$#~tII&oKZUjL;5Mr!-&fi}qIK|=(CF5|S=?@<+ z=H@k&&X_)!)QbY4euylt84xhd?$h#caalf@mbUS$v8wdap|m_2yop$MS$Ha4HV~I{ zq2qeneJrMg`|x3M-bXXc*%IQ}v#gmN zcVEAL4G|VY09VNL)#9UlcM1wF>ZTJc6}dU0_vh`Z(6Yic}+^v`F7BEDIJ6K2FiIa#7mpNbZUdI-;sQbbp*$bl}C z$;fkabL1b9pn3CHjBCQ-qwcHQQG9{$)RyJ-hc^4Q^W>gOroz7^KiN)byzK4$d{Pi2 zneR#cN@0lPyz{l#8Q91!FE4LasZ<{)B2z*`XV`6{o9uhN>QZ+-$@i1#)0>VC?Y!Ah zL||~9y{Q(7L`fein_IoX2sj*0GQM;>;z?a%W)Vb_s$~oXk+U%_%GK3~?(S|@jf;o9 z{jB!0KZGyNY3*Bq5WrDgdMAn5J$0rY#@#x}lfpqLU!^+E<@5O%!KsjuE}FZBepvKw zsNu(N^gv3+YFx4>6UOSf%__WDLqvhB~Zs^21j3e(u>RB;t^)f%YS*+4+< zwLfDJTsgF3uuSqE3wZ5Gj01ZxATEd-Igq_~w10sNk;Mvfbb@^YFo00n55 zxBM@F{_9y52{c}Y{r;Y0_4bObfcalJvxMh%S1lb(`k=yo zNh2gZJzZ*eg||V)yVE;YfS#V767V|VX4>24%F3Cu*}Z!u?FYTl+9Z9oNo)@Of#E;m z9oBhLu0o;UJ;*JuVTVwMF6;OphQmM1&f3>hSJQ4pACmP_a|~fGF~ijOXwsjNP@{6} zy`8PHhQP-|nK4TL;*@b+fuA=eE1}hn_BQ=5gV6<)ojm@%QVobGO5QH&Z10MBa_8yN U_qHjIzLdmx`+C)Xcm9`u0ez_m1^@s6 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/emergency-telephone.png b/public/assets/cesium/Assets/Textures/maki/emergency-telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..fac62396845e81e45b98752d76b3cd6cc35f1910 GIT binary patch literal 1533 zcmVPx#32;bRa{vGi!vFvd!vV){sAK>D1(HcbK~#9!?OaVr zRY4Sf_CuObN=XDoY5vfUErbXmiolya-m`jXkz&>>7ZSM9+_@;Ql_4m!EdrrcySJ%L zhzk=D7s*?_jU<&I2!bFzdapa=gWL7qnYs7QnYlk_;4CWh&V1jQ?|d`&&ctF8Td`Oy z)8llZP&g99Ca>v$SL%^8hfYQtq5}{9Nh|OT(T*s=fnUo2zZ8{{B(O?<)@9B1NbNGI+)Al9uV-M2_RNi0r;RZ*>mO_!G|P32Y)XMpqZJOr@g(sv&R1LL^7HD zF+M*2%9kXtG~YZJh)xq7rhzgwHTBXd=yuW3(Xq-PA>j+RV+B400j$hVBoeG4X>Dz-ld~{afVv&8 z1o*w+T7kc{wRPKxJCdULZU_h>_(XQ>ezv>2dyb0$k#5H=0UWaP$B&xtIq{$~pSL4H zb2~iXlbD~Me`Gsu2)E;gfS|b@E6ulyp`oGomg6SX7^>j%5)eeU<1{hH#>QUT5g-kG z2aA=!xgFOtUxw_sCBP>Ix8O$exd_mwe!0~@bar-Tp(0@57e#Y%lw_} zuQo5jTEi?mcHmo(P!N&%3kwTotc2 zRG`~&Av=s&UBeG&v$)F(Uy$YXJg2Phmy^fWhY=p&1E~bo`%sze0p|Li13X&$G=PH3D{h3Ebb` zpHX?`i*G&!mqb8|d9ayG<{5Sjz^?fUbF=#vl-z>=>2{pFu#du)MBHlNBO@bkWnFMbIsSh(vKw7ivfvv?Xy6?;5(dE+?T*O%1V+ZA>_ECB&Oo;#W1WC*2bP2u7k8{xA#wuS j&RuJ94)9wLt$*z=x$v=T>eQds00000NkvXXu0mjfj>pns literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/entrance.png b/public/assets/cesium/Assets/Textures/maki/entrance.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ba8c5d6ad858d5b79edfe30fb0cefd28ddaf26 GIT binary patch literal 1307 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 BqFDd{ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/ferry.png b/public/assets/cesium/Assets/Textures/maki/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..58c2f27a8567c693ec875537330915b00cafa33b GIT binary patch literal 2879 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/garden.png b/public/assets/cesium/Assets/Textures/maki/garden.png new file mode 100644 index 0000000000000000000000000000000000000000..265edb8d6751d7cc9a4d15f4b81af52ab10e9163 GIT binary patch literal 2057 zcmV+k2=@1hP)Px#32;bRa{vGi!vFvd!vV){sAK>D2cAhpK~#9!?Ol6J z97P!47VE3NpS8yNjIr@Wv6k9mQz^$C$D89gI1V^SN-#b`fW%fHsSQ3Lxf)4>z#nL0 z|7g<03V)PDG-*V{hz3QXL5QghYKRXaDUm`8&NO%C#GToh-I?8;WxnJK$+7#*%D-QupU}YEBS_d={XbP~u9sFI-(l)S}1oSDOw<{tFsJI(w z7D9I!04EV+7wT>Ub$%RU*DVtGStP2%ZYD?DT{Q7p_{pjOe!%E}MpfhsO8{zBvF z+8DL<2g@$q21&6xK0_t#+T?u>%J0at!aP0jo9Hhn(dcR~{YVLDdv-xV^#}xJqjNK$$xq(37OBI{TLKA=j3KFAd{KbJE)4931JX*Vjg@xau>^YJE zs9vx4ch=zJKtpMMe*OflEk_UlH6tVAFGBDy&=7zcI#z2=PR)Mmf*)t__KQMTXO{1O(g-607-x(KoTGc zkOW8q=m~JSTnmx_3kfJKEgcdW{M_8!GeQ&4)z#G~G64+@4Lu?e;C9+PKy%P<2LkRe zy7Oo!h4UAJfX9UL3xY?4A`*Z)U$(nrR=QfHL!r>8B7qOjA%q%!NW9G)F!n>=rOOq& z3(A{qX=y221n@Cl6&Z>sf_j4NP6E!QMG;9rg>TjHMmTFH;5{DCISseT`xMbcE12Tc zsZ-C|0sNkxo|iP-S9U3)3aq@AZ%#)?N3#{czX626cPLd6T?oR8F6qq7j4vDxf5a2? zl9G~P=-f-_HMdJ~ih#!4M(eLRFfdTv+}wQB@ArQL-b&BYI%WBMzV8nnJlNIO*Y})` zc!e#B(lrr!fVSc03mpW&=$M-&y7WC`yAc8anR_LQk^o776iI+2K#C+l5+FqqAPJBn z2_W7QfQj+$0S)mG?yqD-vz%P(L;`@VtD}iT+@!gRfIdK-tPq#2gf>|c&^tvY0A@|3 z09@;wA(5oOOh(}U?|4to?xPh1M4ii?OuCW=s3XM|_O_wy2fas8$W&#G8sK#cQ zrLduPA^=>w$ISMtRp2_*#S04yIfoA)e$(&wf9-O)7FBXF{BY>dp|^&Ihr>E5bFY;I zpj_&4IyN>IYH4YS6c!eatJLEH{Jp8EsRL&Bq9I@_LxOplgef_6Gui5kmy9aw~_vm#{$u zB<$r$0LkiRettgJ>-GM|)6E@4zz(&G>+9>^VHkDz6U`*Wk^qtyO7O&f#j360aCiVw z&OY3vWJ+*FcX#*81ic}F1py@E{mGLjUob1kLu)y+Q(e&E1?ZZimIZ*PBvR~z86n@NZhxZx@*q8+QN zt9yA80Nvd!imu$GXDimFW^8b9u!?6RDk>^I=0O0Q77< z2P_HT{p2$ndQ=Fw+p56p#>U3CSrE|K+1X@OU^mc*SsV*`P_OK~8-`jPkrFUEIvV0# z$LZ;5Kh?fJ%b{p!XsD8R1J&LWNC+?^C>%z3niALz4Bmt)C=?2vHoJ?H5CFHuElTJC z^)4PRBD+xq>P-tws(E>NKhh8Y773qm&Lwo-=xLu`61=E_X+ueMboV9_0(idVM)jhl zU)y8+r3+m{5sm=P;4fSLkvCA#6&fU57>Gri`n$5jSKs`CN@wfuzy zSOvaO2QFIyd{LXvKho8ZgZ3A(^f)KY0j{%A|V-9$*QWV zei6YhDk>TkCY259C^M!fPMmmAB=94V$g3LQ?@{a~Bwp1V$7xnCSc?Sb5y^^Og(LyT zkt0W1>QkH&Y)2e<)7#toJnJuSz{wSU%Yf2jJ3(=hXf0Jy3NtCv z5(0;pU@$nOGk7FLak7{c3Z*NkP+3btGD(}HnWk(b+n9)b76I>3r2J>aw1H!o?7vSt n(2WvpvYxSn5$I3bwT=G(+JH4uNBw=x00000NkvXXu0mjfmN2@u literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/gift.png b/public/assets/cesium/Assets/Textures/maki/gift.png new file mode 100644 index 0000000000000000000000000000000000000000..866263e16b72f6bf5abdf6ffede21aeddc5a7c79 GIT binary patch literal 1606 zcmV-M2D$l(P)Px#32;bRa{vGi!vFvd!vV){sAK>D1=~qPK~#9!?VVpp zB~=)}N3FfGq*A505+iBQUy6np8#EPM#e zSHVXK^g&FBz`!6PF$|FvM35reySeMGtM+|xh0EQ0&dixRbIvz&zkv@$XXg9!JLfxR z&U`atSq8R)gM$b6_xGOwc?F~f1#@*fBw+{DTUtez+9v&Wa5{#9V zmF7ZPKI%bzhsU8EtE;O`km~MY3eSP1m45BS9EkBEbkxHemXYX5ASGO$Mx3#tPCl$R74Gq65 z08EktFf=sug-RZ^xo)^+*P^$#w^O2h;P`D-otTpHooi%d_U*~fmd)lcgkY@f;nYZKqZgq*qfWg7Rp+Eqbot=F@ zp9A&v^?$ex%HrbUyD9*1f492O&V1*bo15z-2LLWaUQ$UJ0|Nu!c%6p4Oh0I!$~n=0 z(>>svYOrw085|vUa$%$c0NR1}pk0!4?g;>#A-NVbJw5$_A8RtEWO;e{8rc<5$#U@R zFa*E3x%n4?k8u(Jpc|gjxgx4l;7U3zxieO7QQ2fUwzjtR&maaLrk!6&{EAzYHfRkG z*bR2Qy}e`L*goZ;<5KzP=;&t-?hBV#)HX2eaZQy8Mg@ZZFy+dKr$Qe56G5mAIu_F4 zmsvsDz~~o368K6h$QzcP2QcvQK%^T%z)SEF9m~S8#5`Lv_mE$P-`{Xi#`t<>pg${- zNAdis!3KF1=r5JPmu6a!i8N7>v7y{x znkqFJ{7Tcg+U_bmw1adeH&PfZj}e(EUDP?fJWpu0a+Q!R=Z!DCO-)UG7>mVj>a5Sy zwF--Vp?`%wLRDz+6OtmTw4V!QrU5uvqW1L(8c`vxu62JZ0PO7XZDu5zZYC0me~J+R z`mOa|K|W#yR=tB6nkBeE&xf2juHgm z&pU))TS?e6KeQ0MKu(Z%e^a5Pn~fqxS{*_ljd#Wdwd_rAPqmX|ITI zS{*SqHukAsAP4~1L;sAvGcE(*0-*|o*9h67@6)!B=c5yV4;n~D#H!uIbN~PV07*qoM6N<$ Ef(ec2SpWb4 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/golf.png b/public/assets/cesium/Assets/Textures/maki/golf.png new file mode 100644 index 0000000000000000000000000000000000000000..2169d91589d4f1e5de6ef5d7fa32ccec863040dd GIT binary patch literal 1999 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/harbor.png b/public/assets/cesium/Assets/Textures/maki/harbor.png new file mode 100644 index 0000000000000000000000000000000000000000..2814f3cd541ec74cc62887ac81597d334a21dd38 GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/hospital.png b/public/assets/cesium/Assets/Textures/maki/hospital.png new file mode 100644 index 0000000000000000000000000000000000000000..faf294e870656bbc24bb750a80e42df7d219ed7b GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49rTNE{-7;x8B~}m@S+rbL`{lrs&1q?MkBN zTW7ektSq@;=KFpPr=rJ&7J-grw*PFcK7J?nCw}welVsVRcTjPKLdsgvRv*jz@)Z(~ z@0uExzn@#VpZ)xm3(xB2pDw)cyf!&f(({@cc8m!}EQ<2}|u0zkTE3>e~)_4q|{pP3Mu#5Na zhids(7k_M;$S~FGsf&683ozJlf)BDWZucH+@-%KZbyee>;i|^_7p|W66m*a|sb^B5 zTH#x6n01u#nSQ-$sJID>!XCDj8|Cth8tj{N5ngwhWmk+nE9l(2oJ~`^)M@>{pp{=HDjtjG;A465{r7pv zxDw7)$4$J;W3q ze{U|@`KNKA>#ZJ(*cGCNGJNxmcDzuM7Sv-=SQ)nZz2v=56MH$Fs~y+9e#f?V!NrU{ zsU832ZgvhHvElQM=5{Y^}n^Nv=&W;imb*EQTTZ$~_tDxaKh$T(-W%sZjlZ_0MmEWR-?@ZrgHPGCobOlv9mtp3=+V``_;2*(F>D zHwiurnmadiKX2vLA1kh_pOC8nidZgP$*sn?M*Ys&Is5f?9OAInl>DcB`ik;Nrw{8b troD7;y82_c*l~G*-Lu&K8|Xg&BYZe;o8YC=yNf{X@O1TaS?83{1OSi{ej)$> literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/ice-cream.png b/public/assets/cesium/Assets/Textures/maki/ice-cream.png new file mode 100644 index 0000000000000000000000000000000000000000..323c964948a2a1fd4cad80d51262d13b60b3b242 GIT binary patch literal 1602 zcmV-I2EF--P)Px#32;bRa{vGi!vFvd!vV){sAK>D1=mSLK~#9!?Okt3 z97h!2R3X&XK$GS}C?rrqghC`FCLte$hM2p0|Ee(;bN1}lsFc{$1O%@IK`5d0OTkuJ zLMs$S2&ErH@N@emfzVQlVkriS(Ao+ng5_Ehuk%_DuHMYt&hE_ao7ow7pyIxH@AsSc zX7|nPtm7bSrBbPm$csBtFH7(C_V$4topp|F{{sCC0i~HpN<_$Yhl%VVKQ|F+6}_Gz z&0tR?fG5r#k_4J6Ib`aHKa3pssz@^h_nEB{=ok8Tsi##Z@ME75HVDo}PZk4GGz7_D8om!ETPOz1Rq#8ag#Kbwf4yW%>Nhoncw2s4QSV zOAjXSkJAiXT3X5l1%6pbpI2)UaAR=rOF^AEhOXnNM}N@Zmqm6I@N{B$(mg>l>{4gv z&tVaePA31TML{bRNf)`$gx1?B&Y~l61z=q@Us8;ZLy;@b>lVQ#=ADCns-->LmVs zh9(U$M*mYR1gJ1c09yBA{wV!}kv! z^hSXI@Dl?8uT<5378Y_*AOQTtK)_3O4hVM+sIvsv+fYluZt3jkc!-FAr#$diS6914 zb+Xos(GUQuQdkHWA0K~@N5DXT|5u_qCnhEemhjxcFA>mb%!3Y1azaMbY@X>z~ zH32*C@R}R}dmQY|PQKw2aKumojySqBngdXuff_t^VbzfwofVIw!&9TwZ(T^~J5B3bB<|^=IGV#?(f0`ANn_b^z)txyzEex zDbT-h_x>CL4q{6~jP!HRF}2Ygez#EgI1KQi-^iq&TFaG~wlEq^0BcM8Yw`G>L4ptc zq1$R6W)$3=nHda{0O&7rqrV~wPKBL@7^DAGR0yE%9eSgu=Ux!tLqFQ?`B9mMR37f? z=1^8AN)0|K5>^^w-2EJIqSk0Y6cj%b6ryUq|W zfc=cuTZ=Nl2R&%ta>ty8W+Z+5VTSP$28;Ut2{@}N4KYUlS&O=h0$n1Jc={uYa_k0|Kt>-*Xb`0#&r^!q0u;WY}hIbsYs0gYb1 z%*y!!YNJI}oCIo_I-k!|*9ze8w(KnTnV^AHN*Ea#`J@tj_?>geQiDa)dla<#JmaU; zqNu1yXUqv#rjlS$lTSjsOYqw*S|Lo#I!?I%09b?*A1i|?9{>OV07*qoM6N<$f_oR< AT>t<8 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/industrial.png b/public/assets/cesium/Assets/Textures/maki/industrial.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3b525db81c45627bcd6719793834151e035a1d GIT binary patch literal 1092 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49qt@T^vIyZoQrBogwVV&~{sE>%If*FGAmV zuD;UEK3~*xk>@Ovi_WtaY?>(3n!xAe@3odw%_-A0bwa;N5ABe9Qru^y zM)BLtYp!NF?)_jMDDqTx9c%2XIyE)5eH&O-I5(-V^q!ss zjf(O$3}Mrig=RR;-1R?no45nt3mx4ly}i8+CnofrxO1E@e&MG?77}j6^?d(=NP5i*GTW%{usx+iTyc^#9+I9D= z;SMK@OH(^THAGfP@OrN{JegvoyLn%((t@dpn%S0n7RyXLHsMojTJ7zShOXJ7`(}q7 z{Pd~lMoz%m-j&y1+s*tM>Co_RFaM{u?r#e-On!xhMQ9yOGF04br_HGllf_@}a*VM_ zx5n=N_10F_)}rHi=AUOLZP_Ywz}-ON&x*%oiSRf*vs42%pwSqI`J6&&0f zmj87vEmmYvo4<7FQtO!AOFQ2D=lKyhfAIp<1O{oduWSotHwUe}Qrx1}fAr|lYA2?U zPe1<%x1`UzdiAR3+#dIx+n3FsJ-gb*+S;1;hlU7Oe@of<(D_N~h2aqgo~^ic?P$25 zkH3ZM?LEIum|kfeub4mKiDN|2!OhPD1FTNPAI^7;m+tLX0OouKPgg&ebxsLQ0D`K| Ai2wiq literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/land-use.png b/public/assets/cesium/Assets/Textures/maki/land-use.png new file mode 100644 index 0000000000000000000000000000000000000000..f86b21bcd08af8c9ba96eda25409fe0357bd6245 GIT binary patch literal 1773 zcmVPx#32;bRa{vGi!vFvd!vV){sAK>D27*aMK~#9!?VVjr z9Yqv?(Q345YOy~?s|hBJ+L&OgR;#Hsid=r~DuML!FW^r|6o|%zAP;CTQi7ByQt|0FB$Y?v0}1+oxh*&+xi`68c4lXH=XZB*a$aEX-E+=2J9FmD z%-NhAPM_V~-NQ&uQp!U)A^RYk9uaCM`thfbyvayP_V)G;=;m~!^Jxz@9%AMAqYNE? zhaiJq(Wu2g=fl1uL2vpDFXv~ACIH0RhQ6F9!udKtK>EET)GqYs+)et??d|RIWHMQ^ zva-@ZBWr7G^_!cUmt2&6UE#jJ(5^4oWVdr?XQzw_0GyMSmX_WrEG*m$A`J}<^MpP# zSJ5XRX4loStWCRZ03k2{Xo*hF86O}2G^q145{t!lbn1$P0YG0kfpZKi=Vzp@uI?J< zUhyac5aRrdtgf!Ujk)Kk$N|7Pzp}FOIxheqgz?}mh7Pcd0MG>mPCwq>-aanU`Dxh=(iNfWE{L4D2L^x(IboJ7!TFicbP;2)<t(nZvIiU-c$h4A79{==V6$tNYO%o?#X`5`uci}482_es1S0}%IN6m=NMft zx;@QBMMWtk0T7&jTQvYKp=mD3CRzFt0Vo!7(#kEju1E_2xOH6!&lGlkX8qtQDKymu zfEN9}7sJwWRCxfnFs-VpYE>5igz>;q9)MF;aCv#TNhjy0L(~6g(*&wL0r`IO9S{o2 zjCTBrHe)~t0F>$izzQP(-R1%DkO4TX6@aWAy_V(x&b!U-l?C8+DNiPVAe#vc00Y1P zFaQhy1Hb?<01N;FzyL4+3;+XwYB%u_kz4y%9d1)e=RiBW5rBIXQv71%0Hlp6RY7Su zrRkyJ+^aAEOW1*AhR#3kL+2;7Z~Zod@@2G^AoU~C$B}>Q8}?N|oSvTkNcHXLtmA#J zvazvI#iaNk`qDXvqe|b02>{Od6%`dXIGtNNZUDH%`;(KCpYS}VKpiNA830tT<$Z3T zv9a;zK!b9~0SGyY3v(sRy$T`=fKc`855c>-k8uN#NF@HWe|KhP=0jQqc>%yxdz_!2 ze_uw49pZQpHUPMIU&P#|zP|n!&*MP|0Z6U-1-11sI$Q`n09?q4X0E@hT4EDEIdE4vKn8sTOC#3c%@IFFex`6B831z8Xqc0XTi9udnY*2{YjHkplpa zzKmpCe}Dgg=f)BQKyh*LzW^ayaOp(b0LHn-n=;*j2F%NVuG7B=e5LA?|XmmrK>nhB=v5VG01<>$Jl?^3dP!S0))J`+NYavNo6};9wAC3;+Yb z05AYl0x&o@*bA>2cayfZwkfBVz|nlyi--U~t4lJOtYHcOMrs{S$TJ4Ov?N22(mGm{ z`f@P%@qqR|rd0U^^drwkrS-FJbl4fLkFMyfCas@Y5huTCi!6E6%l-ZbAf3MZbLKKk P00000NkvXXu0mjfJQXlO literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/laundry.png b/public/assets/cesium/Assets/Textures/maki/laundry.png new file mode 100644 index 0000000000000000000000000000000000000000..53fd20de4216737841f12430ee9fb6d7d338b0be GIT binary patch literal 2407 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/lighthouse.png b/public/assets/cesium/Assets/Textures/maki/lighthouse.png new file mode 100644 index 0000000000000000000000000000000000000000..a78e21a5b5a78a08a78d660a0129a7e0eaffbda5 GIT binary patch literal 1944 zcmV;J2WR++P)Px#32;bRa{vGi!vFvd!vV){sAK>D2Q5iNK~#9!?VWo} z990yD`+!!hq}AGLmDbuet;M!hYO&U)wUyvt%$hZ;^fNm<>tVOs_ahxb+PH>&M05OFp`SV%yTQh?s#0m!NC(bIXUH5u3QOq z0wM@$ui~dA$DaO(v#F!Gx!Gbc7(R!oW-;gU6&f0PxvHuvdy$3O4+1(R-}wiHoHH;m zV2Y2Ae;+w>W+{%xWRHxD?CI|Aj(4&)98=^-Kt|t2+SgA^Oz5pvYZaPG{#b$I=LxMD z|D>d(ygM>7^0)wqol2Z~7DTkIt*y`Mbh^ve%kj808qLqu)z!}t06eCsV+>@l7k>A{ zl%rOwe|4Ah`J+K#%X+(#M!;^|0m;e9&F*&ooJ=ND4*|e^N*V$8^Noi{R;$(iAQph2 zprAh?roaH4R1$!Bk?z>om;p@^o2?+@o;B1H#P-SOlS1 z1i*3JPY@{!9V@_Y%3v^j!2q}k0K^K5JqgRp%PV65+yo#$KmWDG0KicL1K=hA1qB7K zE(QP=WCnl%U;r2Z20%8>-U+E8eBlq?WdcA$_@4WzJbK0@6962QN7M`e1Hb^_hE-Np zK5w(xUYS#FZtm+UmFmC6oE94!`vLztk}MX>JFWo8$jGSUUsqC6Vp9wNIL#FE?B5kZ z(ia2305AXy00Y1PFaQhy1Hb?<0PX`|GMPS>8vv*$Pz(S_CDH5k!*X#xWKDN;bR}ZaPN02T;c!;H^OACP22Pl06Kt(17;GB{GoWYxKEVUATr6QE81}UOc)lnln zum4YdeSL=5+t9+o!V*GW&<#qs`#0i=SYyfF#X>Ss?pj(sxzza7#Gc)rIu>r)! z#&!?@+@S;j+i}Aa6BAp+1^`FmggD?HB>=b^Hyk>eNN^PKJ?RKS2>=e@hU@kEZ^Z@> z7#R2$q1T+R5_UmHaRAWeN`lkS8N9t2^p#V>2zZ!p^yuhl#Bz(RS15Z+OG^r&ZOvMm z?|z5@&hm}!?CeYsI|!RoSy|Z&7yvc&Dy12~I!D92C08}NLy#0q*oxjndk{9yV2DVi z0sw8y2s@#zG>?ESxWN#SN(I1dHg^#K+(q*U*nt}i5vf!F;CVE)58?$zz#cgzX>lC) zBOw+zO!Elv!2v)-Dir_-#t5y;j?+8>j^RB*Q4sdKgn2>s{{H?aF#xA&25^dR?9kBA z6D#bDyJ9sqHl|?!0;mnf9L3MqjD<*4>dd&};^G(a7eAoyxq(LKdpO=|am`qWM5P8` zwOXqQJ0UL`7vN2JJ`l8-ml{A)Qqp?_0NZE;uoX8HB2lRUL`6k?LO71tMI!)j+)ziS zLrDRIg@t`h7y$=p1h5Y`6h)$6N)14*R{usA0Y_;Ba2Pifx*$po0Fr{Cbu#wdPS6Oz z4-dk`&V~~T#uU*<8X`=-kryvsjFCDBn^R3qjg=4!P*t3w20cx|vNP5Q)Cdwcsc_Px#32;bRa{vGi!vFvd!vV){sAK>D1m{UaK~#9!?VV3d z6jvO_vDgM1t@Tf0s;wt$TBF3IX>3If7-)8Ofd*Q3af1+OQTWfKuYIEXPsB4TK%Xq1GMX4iShL>S(id9(9&7WRF=$yefJ=I!MB znVI+I?d)%ok{}3zAP9mW2!bF8;#4FO*`YcaNjMYs(Qr7N&Ef9=MWEC`PjUvYw+rdn z3;wexgV+0Oq-p(fb3#z~nolBC{v$ubEYQWp#hkghxxA^Vse;+r*?jVU4hRa;H9zwA z8--Y2UVbw(Gc&?+VPRp&1VSoOW{1Ct6;nyad+t})Jn?MR*D=(iKTX2x0IRv~OA;MbYS zJ|!>v11ABj3CZjAj)(xDD9Q`LL)v&dUG?WGppRn;Kt%W^XF(!4P4%{Dum4;14U+M_ zNB~VuO|=q0(41lE@}+KYMBhkzd;0~E0LseBf)W9+Hri8H%+ha60uu=!FE8&AZ6_xu zC%x;%)6>&Gle_zcg@s(fAY5hu()AmW;iE_Ze!qW6{~5!>!>2`lh7-=t&VF85S$Vy? zyE|YN1hdm7J-UA7k&%%ikvm>dQPH9QjMmoHOB)RU&AGX`Px|`$e&qzQFD|1X+G$-{ zT6#MX0O&5Yk2xUhS{K96L<@hVb8>Q?8bRO!(A(Sln~0rhXlVFdHUOGQr_KdIU9gw7 zl6n{W(&kQtY3;VOv{cIgfOueFpo{_Gpy^p)_ehOJn;X%rp{*Xk7Y2cat$rx$Te7yc zwu`a>Q2jsGtT4HIV?n5?skzE|*L%yT1ClWOB?p7Svr%`*D?KI!(h-unoeZ8FKZ27vm{Cm1d|V=@I#1CXX) zSYKcN2Lf{rz?!4q@Auz9VDSYogunm*0AK)+7QkHu<{W@;F=rn~0OT<`#su1HgysN% zSWU#ieAWOQLl|)cfU{s7004yeho6B^9QC1<;csEB7z_r_D2nn5qnN0krhYa*KmVh_ z6VsavFFhWQ=WhgQ-z6m_e=#!tfe9c#KmQ@Z6X)96+N;!lKs^mU)h{HE(jhd5o{FGV zMyac-`xAkQ_r%1653`||js^e#00000fJ6XLP*Ct-e0={b+IE-nCkKHo6rbe4Wg z_W}R_000000NxcZibNtQiRz62;QIuxuLl4C0001xNC4dWg~i3ieVmoB?nns0L-`H# zKX!g2ma1P!Dtz!XNQ(PW034RBx;*bMifH9)Y!z%`eAAzj;ANh_5}8-j1)D}kM~k>> zA4t*YmoY$nEw9$UucbmLZK3w-;_b?H;J2@n=jMyA{7G|SBw2zk0s8` z%=|>&2|)f@s)Z)uyB3H^4N?NbsAL)K(ZoGA=R~$8NhB4*H+J$OmD;&G7!H3a>3bKV zec91YqegdIY;2e0?_M}y@yP#(x8XFC#*X9F7pwXN1@BXXAP9mW2!bF8f*>=!1(!7Q UuL~I(Px#32;bRa{vGi!vFvd!vV){sAK>D1oufqK~#9!?VU?c zQ$ZMpi&1D)bfp*;{s0qWT!1n0LQG3(p*L3s>|byTE(nXVG+h`Mn*Id-g^7t9!kUW` z2wHbV6_<0)^Ul2Aywjm168MVsYPZ|tJk{xRZXhi< z==Xw}lc*7-C=P!{5`I`?NYfnru&yIje)u_H_+ec`x@`E70N2;oD?HU`G@jy203P|} za(O$IN_BW^b93_<_5>i$FO^E4;=m7UV`JkvMTAR8odbUG`YHmSM+7AQAO5T=_$)g@ z_>_h#YCBQYuQB@$KMU1xd5Wx#Pyi0kFBA%U(C|?J&XF(T`Sp7JB?{jozzA7eIy~Q70T>}`*93gB%JO0_2s&iRcz#%9PsxkjP)5i)FfsCp=#=}K z@M5(iu+DF5fIovFOX0|;*^W2xP1#OV!|hhii@hCF4VP?X(|VB#2qQt=4eCj!(@EOU za0Ql{Iy@hCf*GD}ISy`rSmS=%N?KIt{q zcz*BA(L@Ml(M73!l@DlHFN1g&|7;e9p#v)wYnuupRJ* zJERhRSciv)nXHPyV6B?~|Fc!-|RV?SR8I%IX> zKa#om-VqJ7Iy$XfF4xe}a2eYR>W+^Dzx+<`#ZFF6@}i?I&cpN0gz4$&-v&K@Hlgwr zG~o07E=)p{2>de;{sPa0?*n^uBtPfexsaPfaxHEy+5#XUI zyN(NzoywplgL-(Tz->oYSYvp8Heve~VB>R*L@H3Q#`@=@~oFcgKxtz8vH5DCsN!kwowhNvwdH8GCsnI__ zKmXAs_&g$@0EU;Ss{UvY1>m0vV<>=zB1t{MhQ?6<#YOh0um>0_vSg;Lf~HUaweVZc zZos)N0Bz(uyZh;i05s2c=JVKG6@a`4>^%Ig0O{VFuhnW*^n85>vHJdf*6Ql&D}--& zH*|S<`3>5R9szDeJ=Egj;yY}(dPJCrdbpL9mDjk`)FVRV|IIbk69&@r86rd;!mU=T zH5~bRRz?q^9(rkM=`DJ`o|!OdN(9Q5vUmUZWX}U4XqKgl|D( kM)>-A!c9r|Szp=x1Fx6P|JMc2bN~PV07*qoM6N<$g7KY;ga7~l literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/london-underground.png b/public/assets/cesium/Assets/Textures/maki/london-underground.png new file mode 100644 index 0000000000000000000000000000000000000000..94972f7dd657dc83ea14b64875909009c651aedf GIT binary patch literal 2979 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/marker.png b/public/assets/cesium/Assets/Textures/maki/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..825eeca6997b7946c5308d0208d9a39fbcf2bb77 GIT binary patch literal 2448 zcmV;B32*j^P)Px#32;bRa{vGi!vFvd!vV){sAK>D2_;EHK~#9!?Oh8@ z)>Rb$i<*zrOr;c4QO$ z(cRrWg2?!;uCB+3%qQ|J5oaQ6iEIENf4`o5t|qdQ$U-7cL?)6yA1T;}O`wk?06tD+ zDfzyUe7X_YVuR?&zh6aUHj%M*Wcy#~lL2%h1{(plCT6;GX4rQI13Wb^>xKbzp1eqY zcOH>Zng*W$;YjWGpa5)dZ}+@;^QQOp>(_m+UAwjozPGitZSCyrbRW$BLw?(pe9k4G z4q99FW2wXJ*S2?bbaHc+fb-hcz-!Yrb zH$6Q)8$&}wE92tg-YqF9No;9p@fn~pT!>83%Br8$pN$95j~zRfuw%!L3Ig`81mt@} zx(6$uq`<(yOIcZ2hXyLWFfIBzQ^X+A`0N?!TX>1wigz~<&=zwq$zPi(dC zLnYqc-rtv%l|@_G4bLc23G^gu#vbbA$&;^;RsXY;z_Vs4EiEnAN*JpwC6LKZ0JP8R2`HJHcR?EsMlL%gV~iRGQQ6Pr|~&KINnYQ@FHNysi(C8h1RSp9qU z?0HXx;NKS?AD;%ORmfr&&~!r|@ayX8f=njUpK4VA?1J3f+;l8gB!&4|sioE5YZrWn zB<=K~R?=w7!ORxQY5A~Q<4rM)+hMrtA1gs4tB%LgV0>)!GAGIC4`jgn$ z*bfjhG*_%rW1k;ROiV1&68Io~etxxx0+xxPfT!3W4i69iSZfM^{1BU}2AZWL4%pk< z`-;{S045hQz6=%yF?N76693=OpaQyq-N7zKF%+VEWUpq z1!QMuXJ}0UK&?ko5sSsx0i#$F)`bff!eL8lNdX5B9?VCwq0_~x2drm#KwGzN{ZUKy zzp}D25-HA)6RRS&Sc~=GUbkwlAm(R-XnaxHQlQTSDk>_Xv{DmDNJw}aQNTj6IYFCQ zGvw*%*`xsl+(XO{*#Aewrlma1PU66U18=Hb0sj8}HOT7UBn2_c!VEPuGz1t7hC6Cj z0Ed{hKoV*q)@TDL8)^lA%a$$ISvCaaM~xGt7#KMh8f&Q48OO)RzatxRF5Lwqv0Lzg zfq@s*20j#>;Bq;lfN4_S5m>}d>coi?acZj(z%5U#v4`Y$#c1yzBO8*EXrWp~tN%7I zzYzt%_gkirgLvga0Y zkt3Oi?O!k3)-|**oGUx&ef#z)j=byV=l3mAa)g|}qaf!&COC&x0Nfu?Qo#oN7N?7r zvmp0DQ`Ii)c=;%{es~TuNC@5jj!o8akuQ5S?i>9U~f5mppvPNSEhYWGG z0`CEDR$QNH8kSmg$W2dA&yj1kG&nf8iqp8yNl@Z|9&1=zVmaoCj7H-vPBT|$L8*f} zohzteU?*fSMF9Z; zmt>G^`=h$LI+SzbRmXb;Xk(`r*oTA%hg;`TMm^ct*{>lh-=w+@>a?M&g(-qtCQ_NA zu&}VtI1Tyc32GelHB=V;<;Vf;a|sv@zi{&WYZToveE?C>8jMdQa)-sc*bPTjL_Gu8 z1!#}af`Woq#mW^$MMa(FL_M;z{P1gJhi zOR(X5Yeso_`O8=nRw82rEe)D0(y?Fw^Vnc8+#ZgQGb1A-o74MqhM>hkTi;lutq&bK z^!iYTrVw&+5^YNbEf0+5KGem0cr6x2E2PXeZNFEN@=Gn=BMFXjC@y?Jd6CoQ&?sr! zVHt*|283xH4UY3c>^{5#QPUykAe7*Q0R@iJR(}v08u}&DYFPTN=Q38pQjR}3X9KC~ zDu+%EoX*j9wE6zP1@i~w05#yYXe5knKXc|x43^~-{W6_G3phsXd@#Vq;JkPrWR4x- zfhl1oc0S0>%}s+unl%ML_{vE!+wJ}!m9PW@GA1VGBWv%4GZ8=cJe?*b%i&3FEPRQB6%v2sBRZeS1AGFE5Rg=W((l`Cz8V5%UM|&iI~g zjo1|;$=+37= literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/minefield.png b/public/assets/cesium/Assets/Textures/maki/minefield.png new file mode 100644 index 0000000000000000000000000000000000000000..60e174abbcb228c0a069449a161e8d777fc7621e GIT binary patch literal 1907 zcmV-(2aNcMP)Px#32;bRa{vGi!vFvd!vV){sAK>D2M9?-K~#9!?Oj_; zV?`J)yRe|^eb)q|LR{Urn%##@$ZpiQ>jes>7bpS+DHo$4ay10CMj~Xn2?_+cB$bqy z00KUUgr`Ok#gK>~F@^^*E2cqFOp!=LK@^-ZttrQr&YW{*=CqwZ`5s8yGc(^e^Us-o z{uxv%Zrr$W+dBbp5#WB#23_J~0d!t)iL*o4_V@Q=e2~vYpw#2E(r#ke0gfSuwjQgA=M1Sl#h8s{uha6iCSy$JvjXhZ%8T*LrGD4;GkOX>Y? z?Ck8EQ$Sn7UA!Li^@S)Ofvr;vdw(Jd`Kzm|>4yoBo0~h$uni}C@OskoOOgH>sbu$~ z*Xvgf6TmeYhcl?Z+E3kMu^I})0ThR9v>fiojp^y>B#Ok}f?9W60jP}z)Vd4|47`9M z0GOnIpj7Wi@M76I(!%lpjNB@KoP*@h9U^o_j=rpj6DJp5)!rrLTF)_n04e6 z6$=XsPZAeuRc5XneM|pYquowZr$o-Rcug}iT{>;Zq z!FAXTH=E5L`)XWcW8>>mMgv?dk?j2*ZYY+9ulKh?7pfa4X46B6#Kgqk1iwkf=wX*= z2vAZ|@-9Z59v9i`KR>JvrKP1KLX{)rYsd%7#KoUQXjS7$!>z=LXL= zCDd|LQ&Yc{Ljc!X$Wf2-9}`1940Yp{3j~W}vIv4`YHDf~?l-{LI8FEC#@yUof>>X_ zwY8N(Wc~pU*Pv8jW@hFou@&&Liblf7$jI|@3IOLaG4)7KPhS*UrbeUr)t>;j(dv!; z{rxZDG#t3G9XSPXtqG9JUt3#yLTY*Q^Yccgu^5y$B^vI>4X4wYhEg_|v_F)iJXym5 zFe)k+5v{GQO^20bv)L>p1n@Tspg?k#g(|>(a;%DRk(89QNwfF+6CfuiXGYF)tXAtQ zsIiYQmTqBaXsC*&06jfDuafLo9zsXT9+i~KH+p$f`fvBGqN3s*k^;c8Jc5m%k}3x` z^m-8^_CbuCuCA^+lFxU;;c#SG7z+xv{aaa!$6_fZxwj1&HNtNIV7y z2XhsjC>89GC3O=cbFP<@egN_u76;^>7n}VR%4lwGevNv(i!7IK!CedN;RB?8Y=qw`d&7h&7T+y28T|k`!P8=*$EFhNKFC;&sm2DG~i`V z@W2JUao5X@FuriB63M?&3ehmP2oSQSv>h#&(d?tn7nDSPlo-;7hli^IDack?Svg4a z&Lm=Mf~u;jw*xua30&4!Ebr12l7E&})R8rydjg|BK45x(FvkAt>gqZJLV#f2fMIq` zzSN7gg9RxmDGzf27$PexD^Bq)2qvip@dkW2pM)6!o{?j{2#dxML8H<95-fS2t~Q-l z!dd`phYaSBVqE&9H2h_^+n-g;LQLuoS#@=_Ef9!@DVOlF4#8ePgkl81IbH7yQ&UsV z6c-o2rv$=HCes(Aqob9+BBYA_Pkkg}|L}@5cxeW_t_+IQ-Q8VVUtixL7A-9;&Ew9AMBi4-Fgts`+?w%nuPB#K))t-Ei)wRtU}p?LUTg tZQz_%7~$t&mWPTPH*VaxapM*m_74Whh|T#d9P0o8002ovPDHLkV1hw3Z7=`; literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/mobilephone.png b/public/assets/cesium/Assets/Textures/maki/mobilephone.png new file mode 100644 index 0000000000000000000000000000000000000000..a40ef9c1f6a026e82e340c37c3dcb7667399555e GIT binary patch literal 1474 zcmZWoXHXMp5dDH8k)o8LoeBXYaMCWK5I~fYUJW_M?Qy!Uoz-bPznT@(@gO%MPeVva%C@cQ+= zgdXD6iS!^OuN`zXwloHyB2kFz#Lt@{B%6ySpzQte8QyT%2V+kH;7IdcLfXBb5&_`1 zGe;T!b9;nCyN4m#9&dM*m$WcWbQq~o4#W=$$2^A(J-VURl|l1ulWl)h6_eO!(}zN1 ziarG{C(0G9t4bzgl zR~Zc^W~LmGQe$enunc$G)437`t4EO1IcgzmA!kAy4j){ABiDB!*`iF&{5<(R+b?+D z2ic%}r>d&z!YqdqY{u7w2rn1WytUIqdVJG8IC#5sX=%x$Ff^~ft*s5W^fxNk_dqu5 zT&QV%es6EDJv?P5IdWsSgHXXeZ(xuGH$nmx-QD%t2f9@Z2E*|^H(+IL%}xkRjDMem zu)4E`2L@Kd#Y1y)a`YjMN`(Ric}j&0%&SkddWX`)ysc(nBtnRuaMI5`aRouS_~TS% zD-`V9s(0i}dKY2ksQO_tpm7=LmX--&Y1l4xc6MH(QmNjjAgZdWGR0+O3$ZnvL+1VN0GkYaHBg5Qva#qU7)YKIJax3VNfI#k( zy7d+4b>`fPi`lWpt}d)1)&4UiPpgR@6~$lVL)cQyX9TLX)}^AgFWJ~M@P&q`xNxG4 z+8QMGHu--nL&uXpOj+O#0J`Q(IwwI+UOq%|1V~9srwqN0)P$s_rq&$K#xMypxbPlKjK4fHBV)r2hZ|7ws~qKMPmC@vzY@wP>SXPX zJ5R4&pb}CKP4x(xs6qFufF^;^=Y!3#j^dJ%SrJHM6iW|(dG9s$DRBZEYZf?4>Pg3spyKlFCTdEhwdMZA8 z%~xj=$8^~eV_Kgvh3r>_DN0mn4)*uInG9qYuv=>0NaC)nMd{~6zssI<&bFG;#Ukcg zj}n_YBKKghXJ9N=0Zdhcanw_(xJSx8$(1~V2a}am;Bdj0bq@-WeuHCUV=!?0asc29 zYxJ7%>cTaPKY&)dQ0(o8WusXNR`H;QU)ONVdN@BnKZeC(9eswI`{2o?YKT1vtRP2N z9(U35wMh4dJGfdqD?oK)@gqO)RjV?stYe9*Vvd85h)f~dAAx#ML>@9iO3-#$$~VY1 zz8f{-{n6&|g4Wv$uRoOAM?9%wtRrdd3N?Lf+{UslWx>Dh@|)D2z0=LnR;V(Q>*46G==`!I=i?(ehDRa~;!Aa6ClAGk5)eKM* zw?$cM&LnCc!!XokmT3f%i%^`Ih1tNVsez9Eh@Epk_j5i!+;i^v+|Rk^q9Q2>xFZ|@ z00cFR7-QlCUjSQU>VMZ12ABvuLZA@Agu<=7uHH0l>QF z3m|tQ- z=a88;D$cwbdj7gS3O5&(0OKxU$yf;txuA)KRT06e!hO z6%`ewUh6NkO*`LHLkb{c$hv0>S?TF-YBZ}(zYWzOUT7nR$VfwH zXXm5-?&`}t-a?YU?e!^eSBs_Q_Ig~pJqo21&a0glXOD7fYnSko-JPi3j-ZXQg-{xe zrnegp>IUH;F$Ps)7?X8zOBG5bFI$)-IR;I=PckYM3PvRM;5wclDSo%#fwKQdbqf^8)g^`#>gp1a0G!M zrAZds$Cqt%&{rx|>}e9dsHh0{#c79_V#VavvVT5JT0nV`s+CKMtRwdn+oMKQvOe?8 zJq5?VT~VRTPr~D-^^-TDoCaOVe9BaHtgDA8Z?Y8n=79ilqSAm}dFc&{;@Y%)WBBUS z&9$gMqT^FjnJze-5vkJB!ouENvc+IlA0>iqH?BURA2Nj}(|hYyi8Szjvk&FpyZcV? z^qB5Fl{Rl)O75urhKUpk)8;N&R^XW?W*RKokeVUQamy_H>;vz6`&j&sda+n+>+xOl z`$EqxTYi6Q(ZqxD9cN6zP5~KH*KgbimeGpm0?$ogQUzwu>o4>91}7*MfMOq_&2{K; zrBYeZ($ezz@mO49VzqXs*}}2K(90o@nkTJbYogk1n;VL2Uu+lzf|e2;rl$371A#JC kPMO<>jKk$Y8}hn<{9 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/museum.png b/public/assets/cesium/Assets/Textures/maki/museum.png new file mode 100644 index 0000000000000000000000000000000000000000..23c179003a5028a6345a3240900e1837ef04b8ca GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/music.png b/public/assets/cesium/Assets/Textures/maki/music.png new file mode 100644 index 0000000000000000000000000000000000000000..dbef56f228820e5b9270f81cba7fb9eac3fbe0e5 GIT binary patch literal 1371 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�a=nmM0A^3^Z z)RF~IJYqoIwIX=#LX83pRS^alWd{7jiJS@!D1Iix#UDC!Xfa$omD?&`O4LlAJh@sU z2LQ=~FDrOM^%pK&NF~~N$jI5>OZ*^cS``HxJ$iJZH#d?S;+)RVguCAV@)sKRLf^R4o z_WjDr$~59o*1-q^JRx=#^sEYIQUk|bKyGesu~DaJtviSX3lk31l zTM4XuK_%4t^y$;-SoSJ=hPOdapFaJUNP9)$56oELu?{QZ&fK|k%g|R978OJxv7Zdk z(*Pc&hPkUK9rMX%{JVP0cpUo5%E}f{61$CMmw2!OKrk;6wF71~7u~7(Jj# zMnIDj{diIj@5cjvIEiMY;@=0ZBaqhLE6KBG&(2CuPyaF7d+r$7XQ$Ko2H_2j@v8WFVY;t%}v5gP;zYlPw%ZlBN? zKs-^)t$*_@6&@ZRCS!!x_pb#PTWR_3f5NK7gF&v`waPzq0%M}#gSLKZtZiwD8hQQ$q zr(vB8;nG;ekNRSOzW&D5Q%8RsbN~YqiU*wZ@uyf43;_;{s#_-t_BMV{^y?)LjfWuy z`r`eJBBxrGg&=t`e;xH7d(%}xG_XEsSeP{u! zB5;;s9jT|JxZ(|~%frj4^%M)qQi8)K3QYOHSv64S7Nz%Ts2A=)yDGAbuer%B3B~s| zvo0Hd$E=5pA;8*lx?CEXaG~V$i+%ik$I)W7E6}d88BFR2F_bd}mqj2W82KI?UorroF6G0*pgbcW;KkBt$NQ>?ABNFV7;{c}xa= zJl=UhfUFMLj>!4yY2{an_=@O8z4WB&1p>B|->32N&dckvtffY_W0;+uhiV2*9xSlz zbtPhq2yQ6KD-3yg=cPe1Sm}4c^h6+)U8xWQ+o@7daFGP`WOuh30UPBgs zK=oR_s)%p&O0ldrbmYj9T&eeIDEI-rD*GXgN+-5|shX++sqz33XbmYCqHew> zPMr9rw8c#vB4}ujCN}ZSymMEL~Nx9^d0iwjPL)nv`#(ikeyvazNjZ{JyDcYU- zNHk%9R`DNMDntsue^+tVTLm6hv&cJ^j2&{x8X%n51HS7eo~JP}G4an-xH-6_kRba} z`avub=g1ngXm~KH#N>>S3O{itV1S5%|BE^hNasOT3vS1>DqLB*wx;i^ptBZ7gcCBH z5aDm7_~1m5+4g#rVc(6g@(;!U!It^XZT__T!#W nKb|$J6_14T!!YcLT9fntSflJP1jA9f00000NkvXXu0mjf3%pY& literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/park.png b/public/assets/cesium/Assets/Textures/maki/park.png new file mode 100644 index 0000000000000000000000000000000000000000..741110e37e065804f2460167763c03760291687c GIT binary patch literal 2059 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 W83OF7@gwd40000!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49sslT^vIyZoQp*He1+HrY(Ewwulw-x*bXt z9}+TOuho#t`Fmnk&f-iT?oP(rBDb0=M59~;PC71OuYR%cNc8^}E=!F?;*R_~GuCn_ zR(uKId8--ZIj2#l?dHt8H{Y0?eYelPfZ`>n z$y=k|N@Q%|tI|K2>$u3pOypba`+qauKk@6=FXel-DjYxV|IYp``=(8Sfe8~evF(d4N&mEf<%;{MzTZ+d zKO5$T9q!9xk5AdWY15}OX(u*a?%x}?S-PypMd@i6#{>z@#XH|kkF!_!yyeiFH*a=_ z9bA6V*UB8XROw4xd(WJQ}lR0mp*fv7vi-ek3olpEYNWj_E$lPrEV-7aEDNFqXtMX1toR z?)84@+a61U=Ig4=5&TxSdvzE$r=vi^t$n+8{n|3~_WgBjY_4H{bsC;DdButR3)uWU z$IQ%3u1IR{t768-b7ptHpS^eQ!MRFXHf;D1wd|me+UIHJ?@v8vQoE6RG2_d0pX%AO zXJ^i1xTn(TZ^WxM`DD|Xi}%u*d=mNhEV^LJ&Emj7CDibrWyZ6Tr$sxD-^}^8H1^uH zYx6!_>rdD|)obYzpX#?_7k^2-*(Sau<<{f1{_1;IEo|2O(X4el`*2Ly&3T(rx!$N5 z{Z>hwzCT|_#9-BmgA=Q&YwJW3*8E)jp}g<6^!09uqMJ81beERwVc6dtdFRQp(`NqV j3xGL}tJP}9FZSpA`Bn$LE&L2D3>Z9J{an^LB{Ts5?4$8s literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/playground.png b/public/assets/cesium/Assets/Textures/maki/playground.png new file mode 100644 index 0000000000000000000000000000000000000000..5270d3c424195b82c728422293fc4589edfebe11 GIT binary patch literal 3856 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 UK|+Dz9{>OV07*qoM6N<$g531-egFUf literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/polling-place.png b/public/assets/cesium/Assets/Textures/maki/polling-place.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d02a9041f5e01f43c9b4f73359efcfd8e51ad3 GIT binary patch literal 1772 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/prison.png b/public/assets/cesium/Assets/Textures/maki/prison.png new file mode 100644 index 0000000000000000000000000000000000000000..355cba44adc86fa9820f59fe440e1c0d99d05702 GIT binary patch literal 1371 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 X_$`j+;@B!`00000NkvXXu0mjfxTOP= literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/rail-underground.png b/public/assets/cesium/Assets/Textures/maki/rail-underground.png new file mode 100644 index 0000000000000000000000000000000000000000..42cfeb7e18d5bfa514901f2417063be45cb6f3f7 GIT binary patch literal 1996 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 D-P^wD literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/religious-christian.png b/public/assets/cesium/Assets/Textures/maki/religious-christian.png new file mode 100644 index 0000000000000000000000000000000000000000..201bc81ca35ce5287e40f87e5974a3fef1f77a97 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49uRME{-7;x8B}8pMAMN;`m3asSAUT_y(vM z2^{&Eyx@UL!R)-hFIR0{)Wl&`y&scd+Q0UIB6ZRU8 zzj9mtFF(Ag=dns=@srhocQo#JEftE4kKey{+qSawNIC#1?NJiNBJ-a$TQ zVL*id58LUqL)UjLJHWH8>9We5DsG8u?90FX6g%|)?!}BRiy04y3gzu(?RnKang7oD zFvcrk6HcZ)+LanB{2+G89hroh;*3`U!Ll!JFs#tm(Xlc9u|Gjy)BHYb>|L2#r%s)+ zEiFlAPsq!AxAb7%ivB5#3=K>S48TO7!N9P90mwPH_j48H9U{8zXA(0e0>tIl~0b4ow^mP$5U|0?gZ z>gucBq>UB#SDs7T-2awoNzh7jzje_oLv}57FJMk6`pms<-MV{Qh0m3}xOwwtI4~_? z0|(65W?Y!Rf4<-H`PNrIsm0HpE4}Q!i_*t)CreL1E$X*oESM*sA{DQ8uy?Z<-^!V4 z3=-R{Co^pAPGtD-UgU;h`1&i0mi^D3&wly8VZ*HAXTiqS)GXV=XZCH$ zVTQlCG1ud!GNvCZ%u>SU1RP=xj0_CG>>$Fx5Wv8I;6PMg*l4tC{)bDKE?qu)^yrkU zVcVUa*B!dHy`h*dF6OZQ>HD6i&Ten0V`uc6xWTezGGC0yE2G8tr49wY6^o4Cx4!#J fXJ5?u<1T-hk`4c;O8@(n2r|{v)z4*}Q$iB}k9V4L literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/religious-jewish.png b/public/assets/cesium/Assets/Textures/maki/religious-jewish.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c75f6b3087ab511b5d5b1f75c391633b7d5f2b GIT binary patch literal 2384 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%0AZtWr z)nphO^i;rNm_;QAB4Q9izzuop)~%aw^1c~FRqKY$jd>QGwmN}?cF~({_3G6N;L!rF z$qVT|3nYJl03j4A@Ibg2I)J-o+&r;T(e*SvTr5SZ8f+Ndunm(IZ2;hv0yLbPo4XRX z8{yV%z{AlF1{REwSW$$oTRPGiJ=6=qZ{dq_I+Uz%sG8W`gtZtfL@AySX`;FYR}&@j zwvjc%-mG-Wn?@RtBhxzB-Hy@=XxoDODivHMk8(lE^HgD7o}29uz$r=Km>=ME8gi)O jv&G(;DS1ksr~3Inte7zh<8AW#00000NkvXXu0mjf$I5Zq literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/restaurant.png b/public/assets/cesium/Assets/Textures/maki/restaurant.png new file mode 100644 index 0000000000000000000000000000000000000000..816282a6e07e44e9e667a42d5c4e8759b0438144 GIT binary patch literal 2499 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/school.png b/public/assets/cesium/Assets/Textures/maki/school.png new file mode 100644 index 0000000000000000000000000000000000000000..fb20bf4e24eb49d5b4acfae16c143e714274f338 GIT binary patch literal 3838 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 Af&c&j literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/scooter.png b/public/assets/cesium/Assets/Textures/maki/scooter.png new file mode 100644 index 0000000000000000000000000000000000000000..41f74164946dfdadec10b1851bd68a6a2cc58b3e GIT binary patch literal 2942 zcmV-^3xV{BP)Px#32;bRa{vGi!vFvd!vV){sAK>D3lm91K~#9!?Oh3Q zRn-|rKtvH21hiPBI0i&EmnfZqq;N5fX|DALG z{l6_**ux(7u!lYDVGn!Q!yfi9Ycw}E-^A#?rlzJojN%!245mc({K4$c-i$h6KAY=& zFoxX9XrKv9mm@c$rx~@gcYbqo8^(y|LdbkyN?`MMjP>3Blts+{{%T@$N38Dt+t|yy zq)cgSY)sy_Z(rW7UArb4LA!VFo^b5gv5{AJXu!uRfT>fbzC{>egJoS2+-LqmgfjmI zIl)AoHiO>=tgEZbU~-^Al<^LS=bO$u9VN5J+v_# zneRhQGH&0;bO3ON^m!XMZk!>qo)s%rERbP-SEak}N$C&akP36=Unh^p^Cg^X(&&>; z0Q@3o=g*%{$K5Vqcu{))qau?IlzIzsr$qt)I0Xj}9?T&E;Vm@?;g*b^l`;`mi__`+ zT4^m_ulH{R00Tt;807n-ix)3?MJ5av+PimezSKa|VkNWR^^`IY+6)B0pj^6KQ&W>k ztfjRQ@_nU~rl+U>B@&pQn3z}(mx1J^Ur?(FA(4s--j|k^mf@6%uBW1+f{F)sP?|hW z`XeUXUR5)(Rg|BfUroGlKb2QcYbs`dtBu|L^#%lC;zR_GTY3s|a&q>BGxKpuW%TZ@ zDtG_mRMbpF|Cdr)TG}bqa)4Wa1E}1Yg$ozHjvzKyNt=8qWJ1=Lp#LW&CHQYCoY7Vyeh`;vxURUkxC+cLllkMujoYok9nn<< z^KYS&bgQeY3*k)Dy6#o0R?Sl_2l#@zsd?G4W5@0bGXS2@>vp(s;X+z!YU*h{>z*`e z(sp8P4~aUX`is7>)?;cC0KL`d{yfMO@EizHz3ax6O+0&m=%R$;rV!G@hYvpz1^_&- zHq`?@dCKj+Zr!>PHt#h9{8X1~Yioz8vP~!x+*czwaNxi=cpyO=Hf)%got?ecY++0R z03pjQ_s1A@R%`L{Q$9%gTqZb&dpw>xqt?E9_3F9A+V57a1(lSPRJvTQ3s$I^G5|cF zGwc{gon|J_eq-d?3kwV16_x|+AKFuPKyGgCFRj$`jRpV-26Aq9qfaxlQECVPo)*rZ zT(V@zGOI0NBLU!v1_80|!-o%#bvm6Fjb1ylDP;UYtweo6HC9`?Mgl-Z{BXrGMdCBF z)?Zm!Ih!~IJw&~s|BV&^Agn3vZuaciYs_4~j9r5BES)Qqn&ydY`N1 z<>ia1QxJ6ku>aSK+HF<`n2_i|#4wyu1pt*`3#zE7SQri=R?0^dH30AgvjBY`<)Uo& zeH9L2RK(h&5&-T>cTpo4ZpphTH~OeiqYh}9o4x-fcu42Y zox8HEtZb=Kbm-8b>_`W|BN{LoKYsj9t;Q3@D6=T)008sz^YcH@GABSIa!qXjLAYAJ_xw*N! zM3|5G!M1JNrl4SB#E21}0_^1E>MU`bDRZ(C{K{2h5rC|$ ztWRO21!F#fDY#zr%mal$=7bH1Spd){2=5q-`P_p3lM(Zw*jr|v&ano-RcJd9rb>5y zUS3|cf%9I2Gce);GDZ?oPh_eX18Dp9?Jol?gNq64AWx(L`l#1}pq1br4pPG#KukD) zV#ZqL&!1mGX3Iq*0Bpzq2WcT_&Z@>J0#JHemB~>?M#i5>VJrmz0tnJSB_-vHNFX#z zMSC$+GftmAef^d#TZ)u~ELR14$OLZ8I*s3TO% znW8HqiV3^E+l`cVsz?L=Co=&kFE1~RIRJQOTu)@lDV1bpXJ`M~OaPWHUHVF_0Fc1T zt?rkrOra9D3JMB7FcSc|pnOlB!skm4${~fcbu(zso;?Lr_>ou_Mfg6zu7A<vOPM$oOWmT7P-X$dWO2_>HMM#J z6%ceqMMZDw?e}2NDdA@nWo z`%xeurCd$lP|41(4dM*!re<;7HBkl5&RfhxqJ@+brs=-bSuvGlVDa zA>Aap!H^0sbM1hhQnktWRV4c{wByH*k3g!1*X#W|)oTGe2z@2W%F0TEWFWY%SBqHt zp@;VTqibYJ%9=H6=0N_j4fm~_o{vZxrS160w`aBVv%Asu{Yj;iK={)kz+g3_|2`I@ z6#V8_oTbc{C>}vS^a*twmOB7JG8l|V6nra%Iyv*(>eU!}Y55#T5PC7(zAVJMsTlq3 z$v%qR6IFhRLT{sQH%~8b(;^H9+Me-_EP6MagMV=1CZiYFio0{wexb|qak*u$LhfA~oKMOqXA*#H0l07*qoM6N<$f(|2xI{*Lx literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/shop.png b/public/assets/cesium/Assets/Textures/maki/shop.png new file mode 100644 index 0000000000000000000000000000000000000000..11a6b755a2b887a911ba0833071d857352fd307a GIT binary patch literal 1544 zcmV+j2KV`iP)Px#32;bRa{vGi!vFvd!vV){sAK>D1)WJmK~#9!?VVd_ zV?`LptLuucyC}QL>WX&+7jLY)EGsK6?j~)LUQN;~y`+-XqD$2h@u9JW7Ao~Yi(>7I z#rC1JFV)s66s>}_R9tI)s6`(X!5WBEBE@Rlu8C)q#qH!f$;p{HC+Ru=!2d1zCiDNz zne)w@nK=aodHzWx68jY$63~GHe6)R%$>bG^VW$+87$v0)hoURtc4|xa7->8uxc*HY!$ES8JD+mKyYGWo4x<7K=Tu0Yb5z%)dLG z8I_flUppL*q->RymHn6j!g0G~I-~(ZLqlOBjOP^&hX>O@*k|?DPgcCOwROr2^DnBZ zs_HA-Wk+gVk6A6BS6f@#J1P(!vQ6uc$Kz$`Ome&3zZDl3NA*hieJox4wY9ZMTU-T7 z-@litXklUDpOi77Q0Oh0sb+tF|4S+m5-PtrXtmbw7$oE-VN|iS@ zHujw5uL7!qN*D19Z-&?F{m#fiS0E7hh=6dxmH?>MXvWA_Yq?6dd6`xE|J{NBoC4BR zZZsP85dijB_6EGXyj*WaS3t${cs%QT*)uaUPZ8feWR>pcF1~W(>vDp zV1q;AKOEi(E&N0_b1}oi!!Piacez}@o4FD~8FMTV4`|-aGS10d8-GS;<-g=B9}EUR zFcW~vQ@DiActv?}V-=Z=oSU0#F?&6b?Ach;W>532;`#JH%($sK03fa0Mw-7T&9ajB za08m{<^MGss$M`}91_pWoz>y3D0v{T_+@0!v>gwt~2Y`R|x8XNp^#9psLjV8( z000000001xBLLDy!x#l;Ry-armA$6vQUJH|!6T7~561s5wgZO%a7-ByM_JLpvqVR;!f181w6wfW0C-d{fRuxlnwpwEhSBP(sHpf}+KreB zq*%61U88vyhv5{dYQx2-Bax(3@)^=Wo?_DQ1g9?13z zxRDRShS@MUvjztTUnBtBpY0WJgb&i!*Y`3E&a7ZCI70v^6h3FIp`qbZ7@S!ikLOq6 zOh{!x?s*t&QYwlJ2mk;800000G95PzX+OkC2mpJvER5AI>ZL&0n13^|FW3)bwTqq1 zD+1tf7Ow(?2sJl1&*=t0%>%8kuX|yv*n}Lipq-wE&d<+30dq5JWMt%d830aFLD(th zFj-yf-3Thn6J1gsNnUz2G&VMV!cI=KyV%yG$;rvH(vP-Resp~4N9 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/skiing.png b/public/assets/cesium/Assets/Textures/maki/skiing.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc11e2e5edaede5a1efa409aca19b46619e7149 GIT binary patch literal 3345 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 bNwxn1+}=3eX&$w^00000NkvXXu0mjfOz$Od literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/slaughterhouse.png b/public/assets/cesium/Assets/Textures/maki/slaughterhouse.png new file mode 100644 index 0000000000000000000000000000000000000000..9b094cabd1d164d2d71bd420993478ed4a355baf GIT binary patch literal 2270 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/soccer.png b/public/assets/cesium/Assets/Textures/maki/soccer.png new file mode 100644 index 0000000000000000000000000000000000000000..2385daf916c328a4581974f3793f9d0d48a617d5 GIT binary patch literal 2420 zcmV-)35)iLP)Px#32;bRa{vGi!vFvd!vV){sAK>D2?&^7?e%~kc;{Gdd8C^1}%wz~oOkLjx< z+RKUQO0-*AY0H)x<98U$bS3g|b-Dg5DU+tAru@gp$AgB4hr_O3y&84p%9WVG!NJIp zk&#e%KRrF|M*#>=SDW!W^)dk%Sz20J=IiS_;^pNvhfBf1!CzHXRlR}(gfw9uclH^- zUeAClD=Uj^Hro#*4A-K-z`$?LpFf|j6Nr1Aan@T=XS$D%&-W~uu0;O+{?~PY;N>ig z-+(e85DP{yU4dpnpCE#0fhI$uqoaE}Iy%z& z`}P z(9)_I2L{tP;f{`uhV0+J|5uX!96EHUK?8*4JjKo$rH;UC!5w5kK)`iMCt1~#H11i$ zY&PFCd?iR9S*bQSoPlL$XV)8H`$SPqb~}0pQ&Lh=E`kv*K0dxnZ{H08 zftJ_-c`TYG6vp7~?L9*Y1RD$HTWN?L*s%y|ivE|*o;{mO352aQnZJp2=I`6L?+=j~ zFEg%L3OZpGQ@M}I{HUm?Pn?DMcapSQ`jK>ZL}T{b6i&B4qjWAaGqc$lnZH0`VPT(> zoD+zws8R!u$u-*4)bs*Mr{GlT%*b&rf#RGtXf`V$wyP;WvmA4xi07=&UrS^e}ii%>Afn2e<4I&NPT+FYkO`_t3YThtmpaNxj) z&LDnB0f>%{?j!lOLM-ZbO#pc8EJOwX*T*dv5UeVOlpO6E4c{hZeoalyOQHe*b|}`{ z;5%o(r{f=cdU_Jo8qCVdYNTM?8Wj-$76(IBJs|f-yWRe=tB4=H0I>MJLXya~B_aPs z001&|6vdDc0311T@4Mfe0=-|ya9lH zz0m;3h1&xFTV&Ej3t0jX8you(ZvY^n+h_nFi9}8WEviTY;o>X-7#bRi;0=HX`Uyn4 z+zMFafRBlZ>1BNeK=G^6BE2Sao~sZ5c*gN%Mn=Y4yxe=Nncvvh_@drErKF_1%c3uG zE=mC43CEY^<>e(j{j0ULwTEdBHZn5uQ_&^{6c~}y0gvd-Ze$hi0TB$OgA57^`kF>x z<{dCxc0u<$zJ#Ts)(~VJvI3#FxVQpma1h1JBB75a0MH)NNf?k)YpAcUFP=lX&@{@R zA|fI_V;v0#ajHVug0ix*ns|f(0?u0J2M@Xdpm(T*@@p~?a=R7)c-rxgZEbBCY7Ij988`Fq zif{c*uO$?U)2dcIp}h}IN=oWC@QQSP*OR1GTb| z67zTj&$4DbPL!LpZTt=~N8lZ`c3^cNCuzw2Bgkvf940)inh-uu(!N4^)Ltb3JdBKB zpvm}#hK5{P{elo0T;I0tA|7%-2n-Ay;sF3H#VqZ~Cs_2azP>&Ob?2iJj_9M6q-Qa5 z73AmV*NW_6Ti8;f=thM;?!d|u_Ve@mR&-IsJK9c-ph7Tqw!G2NY>*W04AFLaClTDA zfLbeJxm*JU1qD^2t^zGD9#2xTlTj(u#4D*zF94`Dj93$tX;$dtPQB%7?vZNY)6 zXv!r-59%#QEcF2n08pdH2Ml-~wQ=SbjHH?6AE@K>EN#Jj4+$0LP9UJ8GcV0p_pZaec`qr4G1LTM4vJ%n%R^!Ma+Z@vs7Ep9jFsq;YqQ zaaXFV>4ZB((yU0PVjUj3DTFJmR*G<$+Zrvgz|)jXgP=?^!UdmV-NcO|pLu%L7&?Qj zCQ%>M%bR&Q`cVmr(;_PQP0nzo?ON0w%Y59CAvyv|azb5H#J<{u6FCS#Y!$JD0aSz3 zd878DCTD%-J!>|-dwIxD&`J_PB`CiJHSjR*l=m{Z%A@4y*F%sW2F`czJV7!!Wb{K> z1*mNS1xBFC3)EwPdPjucvO1l((J7iNA|_e5)Qm?2!b1?|Z!|6CXFfE33umTpHn|_g mm9bhbagdNag)kd9JpTY$dWdjeo!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-3{3K#E{-7;x8B~}*d^>J!~P&f`9|l`x2Eao z3tN3x@d~|L-02Z7U`-pt!xtz_=~T(3W%O7P#wsVS#FyB%#8K0mc|M~nHl#k)T3 z_R3QA5B5ISn$-8jbH}}u@ALM=t-rr6Y<2nRr=Rwkc)!Wsd~?sr*I(~1eQs2GD97w~ zh={9Z`RSyMKLU0eE}u8YM=gFzc|}Xazr$CAy-v?paftXoKa~I6^UwWUr{`apHzB6( z*yE4ktxx^$%#dc}X+QiPDE#9s2QVZU{8$%UfBpB>_uuyKs-495_cIwt@Jw6x`pvp^ zf*@%IhK9w=d*00XzzpHhf;^DR80Xp|+$W#+_3&Dd1qC$?9}d|oAFB1AqmtCtqiDy( z(2&9?(d%|!`jwVQu)2o-Jo*Tgd%$ zV-WbH+Sl&?HF{d=M{$Ke9~0!AV)`D<6EJ`FTKn! zJpXvZwM(MQPoGtP*uZ)E@6r1A)z{u~7QK#Xi#xw6_CMn${@LdfjZ&OIF7$Nub6Mw< G&;$SjWBh^u literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/square.png b/public/assets/cesium/Assets/Textures/maki/square.png new file mode 100644 index 0000000000000000000000000000000000000000..babc9c531005241fba7a844629e8acc4abff26a1 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1quc1-Ct2978H@y}i3I?@)k5+r#EaqwPNDl4i`l zp|dJ2aRuvTC#&>zO@SltXBMJX9yH|D{-dY_x+@rRrNELy_|LMPx!Q_XIKlO|8H2eO0)Ur`j1~+>H&%5o>g(CiXowIv zvHR=(&Ube?mMcE_d)u-)mnSn5^)B5ok^RT{ciAfC&zCc+)h?``z2en^eP69x9Uqo; Su*@+4IndM9&t;ucLK6V=cF+_6 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/star-stroked.png b/public/assets/cesium/Assets/Textures/maki/star-stroked.png new file mode 100644 index 0000000000000000000000000000000000000000..242e42e206ac917a8f6f2115291f97e9ecffc2d7 GIT binary patch literal 3460 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/telephone.png b/public/assets/cesium/Assets/Textures/maki/telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..6d57dc61a8a62c84825a83c8fae7c1ddcc6d694b GIT binary patch literal 1702 zcmV;X23h%uP)Px#32;bRa{vGi!vFvd!vV){sAK>D20KYaK~#9!?VVpp zWK|r;XSb!7AcB3V-g+pamW{2pjh$LC9c8sqM|XBni;5nkfB0WVt#&nEL&twPGp&}X z=z~6p2tG=P`5=anwX01#IS7Iv2$E#XbPsgvdb;=AKXcDL=g#jO_~GE(nS0LXd*^rl z|BlB4ETz-whf}H43zA)vtXQ%)b?kNNGtWwP&Lff~;13yqY}S0z_nsAWod=Iwu@FKf zNnl=d0KU>L3F`mBFLW6GzrO|nKb0yn0&9PNzkGRl`MrgOg%9TD=04K0`T6+|S65fx zIXpZpGb#jR_{0{?z`(%m{QUfMhL)O`m}t-wL8=$dK!dLdBOZ_6v;qA8Ykl z!Nc$G@4rI>zHFgTC<isjI8|ju-gD!^59u zU5}Ymi2C~aF<#(DqtSL{-bzbLw~@Je?1%)vp`qa$Uf_?6jI?6#i`n`mX?+nFYt$khCa&_zR%}7;Yt9vwDZwiGS<$2VC8#`kB>{Z z5x^}y+}_^aPG#Q8%F5z4&mZT38rum5gFnjms;Q}&BVF6m)6=EQTObhFwsOy8G8yEi z7tC^06Ricp@430TS*dnyI2^{|-?tmSWKZ%mors6@00k|1CrKxr#h`wXQ=xJku5ymp-5NiZvadpQn=7C$z3dPqdMH z>MUL72Yz#N^Vc-t>-gV%LY^;ZeGb7T-4n04F}uvuG-AZ*PL>h)a+0ojO|OMiRaLd@ z^ZEX)uCD%G2RyPXV8-(g4h{ll+>TWdOc+1#+uPfR7{brBP!@02!0+hj7-R@PCxbFw zvLe`jas26XsEtl%dS ziJ+71d>-NFvhw*Tum;T@t{dQ=Cv>u64B_W^AS5jS-QC?^GK8NC1%93y02DcjmCt9g zc9OTJpH*we$V^r?!GBr}0$S6~XjBspe66Q{YisKki?y1d+zv?qtBX<%L=)KtU*Q@N zfY#H$wzl>*=%%I${70P>U}IyWS_D2lEx=Q1>tHCxSNmB+pFJ(WB^(5LN}b&D3Az$i z3v|7{zW$ceo1XEQ{Xzf+JI_J7BbEXnL)(Kui@;I<}13!fkefWx1io&A^~!W%*W zx;xPCtA+o<#)lpg0@z^TaQKcIeAy-^C+k5Sj^JcJps%m*HVM9LOG``dYy1k%WupL& z^n~${FIwh%YzIh~cLV`ThRi&3wL~px_Tk0z9MPhW@ewe|mbl)@)EygZqAqK+TF- zsSE6YujPIm--YO8`e)x$M(cvCMwB(W10BM^oa(QjtE;QWY!q>;@CkbYK#Yu@C+q>c zODm$Rk-fiQjt4{|k7j}_sYH}bQdlc=(E}-w_6H~r%)!r0p#=X`55z>;A%jG~PYY5z zIl_iRF=4{jtCVq5o|$4}bipegk@Q7CCk0V}|B4`QPy{R6mUQ4>7Q{`~31&8Ha~0Io zg(7$}30I&~;R^Vfx}%wynNQTf7Zw&Cot&KbxrwU@p>>2pNa{qj67Zd9qUxA%I}Ak- w@NE*oXBNKXb{-exY)t5=ZiDc>g4XHuH{NepCC=3qnE(I)07*qoM6N<$g31Lx@&Et; literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/tennis.png b/public/assets/cesium/Assets/Textures/maki/tennis.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb63205403a91c1a22f1bc01fd498ae0da7865e GIT binary patch literal 1658 zcmV-=28H>FP)Px#32;bRa{vGi!vFvd!vV){sAK>D1`kO@K~#9!?VW8% zWK|f)$8|TU*r?rFqM(8z0;9g!Zbh}Ncizmo^R#)RcI(>X9h!*tKNFLUm_=Q;OWcvwFybI^ZWfb$H&LtHVC3vto)<&)D?z^hHuV zcyIlxg&rFl8-^l&#+H|tTS@Ckpn~q~?CcxR#Lw8?-d+s>!h>LDxlqN=7zkG+s`%*% zTY^wOFE8R3sTHuZv-1-X0ARx_u7puh0S^Gm)Yf%G5nsa-=srA!(0dmE6aMAi9EjO68xw*O5 zx!6T>W9v`bEyvvudf}Ze29R(YZn~f5Hg8+7R zc4{R62LYrH*h&C$7%Bls01|*p0mNdlFC+l_mZP7@efh$|LWcxkAAl2XcSAhviv6zu zUavPH0XTRjXmWD$P0@r#v2BT00H;NFLs)!Lowzt3q*jQ=#>Ov25I-7?eobpsya0GX z#9okl4wPE}q+Zb6+`I@?{HCU+D|#9fPXPR)^aAAbKi69qu1-p;6=r^Z{xwMAH#9VS zW#mgA-T<6eD^P81?Iz^2|6l-Ud?$7bYRiWP;0&~n^+-M+B!Ki9(MzOUKoCYd-~rHF z5&q~Iiq8iPfChnwz2oc|uCM^KvLZSam@{iTRsle!@YD;a$yi%jT0VmyzCi%|K)~na zwJHYrI7=uL`h~m9i)veydaSRn?|q06@I;df2&64aqc$`&^e*IOYey1#pqD(rI;S%p zvewnrtwDhh4u`*|q&X|KQvBPkPOyz9aWgYB7t71buk#F{qN3tDr5=7O+)e>axRsTa zR~1G1E4z@ry}cjgkzm^~>+kQM&;y~SrshZ6VgmMWYA@3BwM=_^`=_EpKrvz6@}59S zQ)A>q4V=_NR0xqs1z!1uq0x&yzz}a-UO9l2{Jxi=~N2VdL{7jV;3piTSDzP{)D@Of)A?vRsdC$w4 zc7aw7QI))UK%O7z{R1IKGYbeBleM5DF`%uj?J|^mTxb_k=!HOAw$NQ~0svFjknHd8 zSF8Nq;~q{QMlpf5fafy>z|6Yq%-1lm<4c&ib)m*3T1*wfSVp-7jg*)UHC&|c1T z&Bg=tVKF+=IIHwB?d43?XrSMU%_1gLRaIT3X!MxjBZ;E7d@CS?LZP2c>11+y@~lU& zheb@NudiPr{KkuV){5>W?H9P>+E_*qMn*>7Vd5>)i+4pHmpv?os3N;-5HUgRRzIn# zjYCwN07U|@I3^4X42)AQ7mZ2)HuMCwR6pTx_y-vSY>Ww+t=;wY^%(wF^f?okJwb;( zEEQw};b{}%D^fXz51Jp{V?g{1QZeg#L$QYVXR`nQzfY;c1)GgeumAu607*qoM6N<$ Eg3(O{?*IS* literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/theatre.png b/public/assets/cesium/Assets/Textures/maki/theatre.png new file mode 100644 index 0000000000000000000000000000000000000000..772c96e4e31b501c5ec76fd5838bcc98d7c4214e GIT binary patch literal 3233 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 CG6nJg literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/toilets.png b/public/assets/cesium/Assets/Textures/maki/toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..e87cf19c072126f496cc1918a344fc3d595d8a0a GIT binary patch literal 2917 zcmai0`8U*!7yir`W0x2T$>g;j{i9$loppV zgOzCs;(;(l06=vT%O59t8U_X4G1LJnhpw#C0F%FwZ6E-!cm3y}KEF~|0AQvd^$?aJ z)0_4z{+3^P*~3q?3mEZtK-@5?k;R@ciRK!v9tjf)RGI|&uIQP9So`(df`6Ja*cK`(7(3p+{faO_hKj~%J9uM z8r2DIq%7GNY6{4YayvGp;JjqFn*ed;H{${5w_KVvTJVorW~z*VXQ>sodu51`p`9%a zhNN`FuCb;K21E?Qnxg|%-~CD8SAyoKV;)=D+S=|CGoLEMil(psEkT$2`=y#E5nM?>l%{oS-|5c}S zA`B3HA|fKvF3O4(?fB&f1!WwD+90Q6EI36c*p<>uW{9j$SJCd@c;8s>wx5R)oConF$N~qRj7;92o z4IeKyoiVP!N7DlbH4ed>(;u(Jhn`DX2(AvC9rvgFwVa}P)!qwMUVVEpocE^Z$bu_f za&9gb1m!$k1p5ujQ06~)S)@FCrcL7Y$c_q0r{sW1WgtH(*#_T*wr5&~(Br=jUiL+R z=hK-1gZRq<(+wuEX%BrSE6-jqyCAG9Y^qaj_NtBY7MN*;wFCR&MzNB(ANr1N7bGbV%eet}3nWap)(<%8F z^xO{6DVdrq+|n4Z-20-N)b82@AI~ZKn8>fRb>@Hf)Awo@E#SP^yZTxMQF(r0`M9}b zW_^8~%2>|>C_Y4_%s(uFTxMnt@+Cf-@7 z(C)u)6UEwJyhWSXL=c`*>}3+1zqpv6t{!^exmAQrlWcL=ehq3kloC%B)ciXHPq>=x zTz}9Pme#)&fB17!#vL*JQu{^WHQlHQX__RoI*Q=cw?7QUoa)18hramHnADppVuH1> zv1#Ci>>1KzBnMfPwM(k6YZRK%anv(Uu_`MsuO*1ktIETB2CX0Pnz5n&fj^QM+1L}_ zZfTf7!atA%TxWlQ>|J1Bw4GaGu@P%^W0-ZiJ*yTgKan2uIcYoe4UX zPVwsqbDc4g-P{m5Jl>f)X+D8-(}CX_V+Z^7Z}Om2c6>YZKN@qKQ!7~#&(U8r#&E_`BP-{gnBBhe5mZ=E04^Ak5%R<}G2W1JN+&-}yRp!-WT-M&Pc?~G2hI79d4C93bYPCQYI3X5QdTzpPN81Zj1@pV|TfNW`Q&udl=}A-K)Ha!dSd7$9 z{#q079P~IbMz2+!d#iqr5co+LSnf+&DB%Xm;9Ww*NjLsmfvbb2k>!&YgSGeDin59U z9FNf)pdROU*|$!vf1kiJt9c)A+PjH`M$TYw2pWGK= z^b?M|5ZteFCcq%^%5RS)+ry%bj?Xf?P&GSC-iDy{F-1!@9fnzY7DKp+VZC91Rhwp#Fh@Q4=k8 zIylcb$I2dkv)o6FmhpNY67cuH73ALz!e~i@hd$Yd5o`0&;Ep1tqPf!maiCgRGU^sg zV4mYwr5F%Hb)Zd4P9zK(?fkF=P$S85lxpFnmMBn6EssYKgWGh3Ou;UavK5lmygG9& z=L1H!3PH#4U?P|Pk!fQ`BXd37*RG?x&W6Uf3;1GPw2PWzr6~B-lDf!8L0o#l@oIMmr+YsoiTO_bvhXBgw{o zMparBadH%uptTV_tFQ?Dd5!>YD>FVk0TrdBHW5mlWh2YoN+I~UY zR6YA|o@Fw&MV=Lc`C=`Qx{3Q(W)_x(TVEk>v!dGSJ6}Ka6Q8x;r z4hkAO969Jr*~JSGdW}n_z=y)4pP$}UbHs1XHU>`DJ(^+G=Nt;hRCRGa?T$GYo#omR zAnB`Z77nl_^pGQ_FNPRJ)rv{?%K_m-UTaDBc=(^gdoQ>c`$B+_ou8%!V8FM3Q)%?~ z6-HcAdtnVmR;*wY>?kLmD=0V~A$SM!{?*23FK>bl0KKdPPvRuAcr-Ygx){rM<=gQXj2X IspE+MA2>mI{Qv*} literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/town-hall.png b/public/assets/cesium/Assets/Textures/maki/town-hall.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5c7ce4d8f5c83c0f596136ec9b8995874d52d GIT binary patch literal 2005 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/triangle.png b/public/assets/cesium/Assets/Textures/maki/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c47f42180c8f91fa40e5d77abbd3bcf4bdb253 GIT binary patch literal 2137 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 VA@*_T;r3eq93@h$sw_Q|{|C9P$Q%Fw literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/warehouse.png b/public/assets/cesium/Assets/Textures/maki/warehouse.png new file mode 100644 index 0000000000000000000000000000000000000000..910f1e4c940c73334fe62ac0845f2783189dc191 GIT binary patch literal 1908 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 Dn66b{ literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/maki/water.png b/public/assets/cesium/Assets/Textures/maki/water.png new file mode 100644 index 0000000000000000000000000000000000000000..159a557de69a1b2f8998b56d3ebc85aec3203a6a GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/moonSmall.jpg b/public/assets/cesium/Assets/Textures/moonSmall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47f52522ea7501f58eb0cf14bd89e4f90c32fde5 GIT binary patch literal 18196 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/pin.svg b/public/assets/cesium/Assets/Textures/pin.svg new file mode 100644 index 0000000..7892c36 --- /dev/null +++ b/public/assets/cesium/Assets/Textures/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/cesium/Assets/Textures/waterNormals.jpg b/public/assets/cesium/Assets/Textures/waterNormals.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb1baa2d62829297680a99ef890ef719599965cc GIT binary patch literal 294196 zcmbTdc{p3!|3B)So=#MIT2)2MX$@_SHH5a5 uQswqg2qvk}UhM39cv_(sC%oWoy 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�+MF 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

    wyy2=a9FLQ8h}6#D77{rNRn8IRs)5W|CzsVe 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𝔒gs%v+c8CCNCS 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 z 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μIQx;WX$u4%gJFapyp|Y{1Dl@m|WUV^%GTBy0yP>VxX3}ctWThcyDNsDS ze&li0NR1w#x-d}_g3vFXaMfUAxk8}r)}AlQodusBmAabz2Ib!gC)K>0{;fD~z+YJJ zn)0*!tzpQ9=FUU4g(LA4{SMBmU9<7`oMOtwn5}v)ZQH?3n2{|0E#C$o+p8;JWRc+c zV7-#23J!x+Tb5k8;;P)Wbj=|VA7{J#xZ5{X4kKgnp9k5#vw)U5%>Tf{(d5nT1_w(Z za*OED#r<7PbO1^w!)#KFIv)j!|}EDh{B+-Zky+jHs0LiSy6GwsFuDR;K2Y+$5brYAX{l4b)SPF!O~LE>e*9=c++gscZ~0h=U(p8(zB7lMo7OG@**vWZ!MU_^%Jzwc*& zj*H_hlJ{Nl?5@a?NeMZY_`zR@erL@>3AMiO?KTVL72Ojwrbp>$*qgdB1^c8YoMjgS zY(>w|{U=D=c=M6$<%jRSj^g!nZR&}pn?Gvpv6PUsA&0Y?zbr~$+I7~=vJI+}4IJP9t-Ve&azfS1*-)g$QgCiZ< zAXZD~M0(t{ZD8TI-PnletUF1c>guYua=guL#BC;8!at&RcTEY9gAuQEn^MM-ih8?b zNB^wmj3(uy;S>?1?NL@eNnhRZ5J$cH-S$iN%>w)31v2!mXb@GvsGa62 zLF`4e(!2LtCdxZT%CsX+e_haqcM@-|Y=kGd7!nsw78AaYhbj8nKX3pfNmEroeA%Sq z^A5ElH`%@}0V6ML))%ci^Hefc&5_0eN+WVx(~h zt@-`Q3mwa==0U%i<{GC|=B2flZ48uu-F|Ar_Xx8Z+leNK+a6lEDh1%mn@2`AQO$5# zjH?(u#p)9yx5=m5{EX?9xBFSU6VmgPj$ZZ4zWggxg`O4;(RnB;NQej4Rh?cOHpV#?Oa0p7FFvrK|;ei?Uq%UN6b*(WpY(w4mDWTQ@dR?I9a zbf{mp=bvM|gMW;IuXu9pzNW=0y@G=lYTVSx^@eBVu@|7ZjU4r9>QdDEVphnr6^?a% zX}LWuAK&Nr!K=ZyEw|`BrtWwRl^mK|hg&a!dqS~uhj_5GLG-!Hc0xg0JT4Ux_;S_y zAbi_h<&Sq<4N3m-?MS6+jce|Huhsixc?7q_66Kdo-wym^G$Q(fTe~=MKz`i!mIFmN zU)DJ;Z}zQ8&gHZXg*_in1;t0!EVjp^@sGjpTc-wvE(3?izY;q_7`0;aH<1#L4^ z59{}+U4qy)$9>kr9av|$SMq_iHgVQ?Bn%SyDf&a!tk>aN!dJAW_k9#pn`&#k2L~%JR0oQzwn`GcO@W%NQyp=uvVcpI0n#m6;aP(#q1{OING$&s%i6U7(3*weigY zT~sDlSIAj(zGET1Jd%ZWeZkYsCbAr}lFED^7%Zlx^atHbY91O6W15GJEdyAij=D@o z2Cnv)oTnSd`!kN)`x1vjC)@a)-Z9683Vd=Ddq{S$q3Us&nTZd511Vc;+JpUXORENd zx`KE3eML6{zseo@PG&cTHgspROhui-+Q)FWs6P=IqTc`njjPFbtqk6}Gr8*x`h&}~ z%OI7f7?lYh&BUw^{w%8(M2J+6Tr(;}(2y`kZ6o#X3k%5yf)a&k3)u~^1a<(n@KEe=K7x6kos#(Nn#9gMP0+#1G5Fw3fjHm zP5h)T(o>vmw;W7BRwE~3U4OM-v#cDmF5Fb(jxW~xsrZy|gR}xmb!O`MT3TZaS6L8N zusaKmZATcsYk#Q}$B{Jm#QB@Vn?>~-=f3)+h@cMg9x4ZQ&Q!2KE9`LBr&|OY^8)j6NzFiNY@^k0`>tpG?ov;3cSMq7 zM9j2B?j!c&kuB0eDnh109hZY!Ldh5<=m#Uw_!P%oZ~-d5O&?^|6D!JwNW!OO*Fo3y zo|my2^E}$rFZ4)UBd(KMN>{F!`s_Dn+q0Xq#DH{`_r|!&nXx*G+-D^abOW z$c`VM7h0J;m^{305_G%mTRoe3BuKm0FuG9PWOw*KbmXYMuv^?RAiFMg;88De2btYK6g5rp8Wb~{*6Y6+3D(6V#t-o&)C^&Zz zIF#E^yEg>MbPL0X9k=+SI!PcHvc^SrPS!0Ng0Ahp6)>-o&s0|nC5Jv8YrEP1zZMO~ zH}uPmub;cMTc2=IhHVgYxe8kZCFp78Hvn`K`mr3}?>ybf7Bb)O%|({sK*yTn*;~Cm zx$7BE58D7e7WeG3N(BT!Oq6hrW5eKWp-!OV)wJ6H2m~;dF%D2OVT18=jsc2Dl>_)< zt+TZA6G&0fY5mQFn<-thw_9KB*Y7ZUtCwB>({$RF^C@0QKx2jlGf|SMh4P11{#z%p zNtG-48Zvj%5ah`zIA+XPz%a5LC%b4nV^V!0xOmDGN%O}y8D-&E-JB!dO~v>ZB!v=t zhbV0E2D<4@>uq;I@Aehv1@Z=RjWRIh@Bv4;4O>SvJ4Hs`gTHm7D7Spsuk5TQNZBPp zRr>7@9dp-8k~>Co%}GYt5o;FbFJ~g6xi8q@#Vg3~#qoovo_7RR;d}F}qH_TPE(c(J z&DAm`TICY#4*y$KaK%@>tf#iEp>mIybpLhM3$vx;L5+GHg5!NV6egA=Klp~J7eJ_g zA+qV+6#dXotJIEZOX$7NDFA3`tvm?_F$9I4%5ExU`N-GB zMhA@FpfVrLkP@O|Xo0-1bg#&rDXG{CT=Q!Zi8uu2W6;&Rnd{*th_v$Q<_lhGQ7NqT zmLUd1|9Q_^diNV-PKZ-4AxD<)$pgSRB#;}u*1A`6y~02AuJ#AtH=d**2NCbW$}NLd zeCv0{$a3hD`U*UlT2%9#Z2od|o|3BOG(ojLE%4E99?;KvbnHY>8g^@{R$r)}KfPqs zp=?bt`mR~EeD9tvzA@!HPVj+u$HmQV-KD;OWFh6{n*fcgqy}3%}cTn$S#*JoilV+ag2U z+38M2yDHmut1jU6)FJk3I}YTFZaB41qdEa)Ia4Jj@Gc0gs7{I%?{$5RHz|JDs}np6 z?-DV7oY$D20GSq4RL$PU0t|Ey0XatSvMGZjY0H-Vn`qfamxD(qB<>Yyq8mv@wL|{9 z_-lC!>1-A~_S&?`r!edQcP{dt==s_`o8?nXYRp5cY?H0zGe~Ui)W$J3-%+4hD+>K! zLq@(%2@}EjgedWO_GfXWE8vU8t>taMw6h7GZ^=tvY|2~|e{s6cDKwG3$h9Ad4b{&PCx=kz5*brIKLo^v9m0#N%~RAY zY9aL~%nm_zy}bc}y>wiFx<_z(M|y1eekz$6vVKRKmMU$_F?OQnqssjr)Z^JIl=3P( zAg0UN`_hP6oe*ygXOZbUtTuj#WA0*GMNx0-$7qKDp`=^)qwha3)QQ;ccT2`qU>>5= zL>WbzD(ZcS)KX3*+0ydOx9%o+8U;mqF>WB!t+ViFA#EI35dJdx%~kD6aKLgsz3Uuq z2rqP7KF7VhaY}92M0k%Ja{a$gsaCXKdu_FaR-==Hr)_oj@%0TGNcN4x@h68-2%@>; zhH4M-%D^RHQVqyZJKPpOg;x_COvrP2MZ^}SO(sJdedFkc{1Mg%c z!NBr|GS;Wt7m{KVPq*z|E2f#F{A`O_J)a8j&T`d52VZKz{rHlE_A#tHn&N;YBwHOD zW6j5!i_`OT04Z`5&GH|EJ6Lf2)8f0IYW7LLY}O~ldiO@cDLzxMwbM&*>y_-Kj71sz+SC?w%1lp40u{Utfa#y!YRfR2?Xb~ zxm-1bk11^h=(HDvd5VeyO2mDz>iD*KbL`K#ht9&r3FVFR`!PO4-q(D!Z(2KKlV0ST zVpk>g%-jd}>U((pXNhOc`L%st`3fyyzP??_@Whr$Q53l>YtVi}Kbr}T(o*}}R7n!`aoynWl~lxXdZ|=GWZD<*?=Ue{ zcQ~RjI(IMce&LuF(Bt+Euw$0M+d=8sGG!X5hkdzqVv=`~n+Yp}dV=fu(sbz524UZW zpaOj>o*lvizAxVCI&4*}zMj%cb}ZP3tJrU_SKguVrAGVpqHGs~@w_K_wwM=||FxUr z*fGts^o=*qBOb*(nrosQpRcqaSP)dzgBH&svEeH-`eATFgwIO{OYY4nM6#pR@gHLf zh*UfA5t?4av!K#4A;+T&zy8)k)ULb))+QB%j23R%8c2)@;iqHYQtfbqZ^vC#6MpYc zfHqsfyS;{pXyco>Ae5Za)Vho8n;o3Ug;r@b@I03P6V<+9bz0P}uMRUf?CW)K;gdPb zoW&UL2C0ShPe)2EMrUnF9dJ+%x-+EnM66uD(4@uBx_wsRpS9fDm3(J*b9rv|xNEb&>RiOItt9@K`P7uW2 zP&_A7w;)k`zG^X>#C98zHK2zeKjMH;6rIQ1gA1;`m7*1mx8FKM3n^0jDu*@EZ3w@mQ`K4~Nq_ZmA+Y=l zZ&aCqqqVS2M+E@v=$f|#(d~R_Kt*ZB_O`Z^bzDn`eysXbxqP+2WG*gH0u>0OePoL3 zr9al6gDtIxG9fOXNtwMX6YR(5x@t^Ky`QGba_Tcnt^x13F1i!ah zaELAV9!0FcJ5E}V&7Z!bF?me+nKY3Og#s0|&RwvJx?|kcVq??(V}y$<7GAoV?WSfj zL5od5L<}vqkwJ*DllZ zHHgl;h7IS*A661mW_J8UW4H=zTuGFAlK#(SaLM~v&s&@S{vZMVI*b-6opM}D9nsA- zSZax)<=$)3D5_+Kv~_sjQ`J$Kd`)!#t9PAV#~HmhXWnqwMmIX}FM$c4maAFEuguHR z0kfyDH|4(pb>kPaEv}s&2*?zV>n~Zc#kHDUCxcYyFlTYv3kTCIoDVGUh<0CRe%NqJ zPvio-v#R%Uq?-dQX`wl?a77jtDQ9BK87FI5iYw+9C%qleMS<6OfVagSHWfbZ1*l%4 z8j?PMSAxNJM+pL~^6-8UdAE9-l&s1lf+p%sY0Y2l%1j{SN9RyW0UCi=QPDqI_h#NA3h>=Io*~0bn z0l+_Fk`8SA$jSO$-2kP{S?PTx`0?AfD=`EYgEZ;9jv`V&4NF{SOuGkWE|U%Ha}CPG zm9M~sp9!nwvA1vJBGo!%er*WaN97JQjcFT#($&1bak@4btM_Hbv>r%$BAbMrD9yf} zp3xC|>#QP#Z-M%gfoJ)HBG2vyS+F7d8lh6Ft4?XSa@VKg2O=CIv8^M`2UayS=M!Mz z4%`3fG8=J9&7RU)wT;$4VCW2A%@+cfQYoZwup!W3!XDSDXW& zqo6@_^rHIx^DW8is}AdI?L+{2XOAp zo6Tclwp;s0=M&oKcbXbLC`_9ytSAo@mYpl|L+5eTA36QL%!h~8s#?pb!*+{)i#9Nq zwaEM)xY6D;oHXCE>rujx5^C#K=4?`nFL3V#N3ZeUAj=Qt@xw)#1Cu zp9bLWCem+Gw*MrnVQ0?Nj_FXlTT!^JBj z?bFLuPvm19NQFC2XZ@5#y(~)j1pTIKN6Zeq@QZ#cW(;H9HEhOG5(44IEJ#!@+o8p$ zIY#aFcY6`n-$cT{LTN6)aDU_P{)XzwfMf{ z%lW>^4?d#wFb3HNP=U;>|7Tz{yKVn_*EHUmIkSGE`K5E=>Ya>`so;qyTvI@H?%#** zaTi%dRgV2dlTW~BLOI8xFQ$%Wm@g5pW_@Zwez4xX^;?>UYrx1Tob7y3RMfcdWE|aE z1d+OV&d@OZ*JFjz_*Pz`)aSBgy)lE(LpO_j+}@p{U;Nv#?DuxPyp_O@<%l-yi-OOz4x5|2<2$ zY<3CFo=v;RcEq2l-^z2Czsa}%1rbb@QOSGFfiD>*7F_gieiYDu$>sDfe1|qaju{@J zdZ+dlXMzqBRN-}tl8SNRF+Mt8J=GRam&+|7xRhMBHP+p1p_>xIgp?eh50WfuRm8nc z4YS~BNTJnmUEHvz8i~Pb`Vat+3ztNOXZyw=xdgyfs%bb!MuRF1-jlP~_5l*F(z+xd2MVXtJQ!llA&m2y}c-UY5_$XjZMn;$>1Uv(nZ7OlnGb7VPZ8zC;* zk*7ldRL0qbz8FP-dGko2cUSb%(`(K_wWK)Fi z@W-hF)^;kxR8S#ajz9g+0ZIWY6WmIoo>byqYzVg}XP-}^6CB68zAuW}TR3l5H36!EZe^L#)%Wvb-QlI8Vjgcmt7es@*+jQ!0sUFtLG#U`^2myD5M_8dY^Dz^!mZF=#^ci7}<1RK8; zc&}Ma>9%nhvVEL(UiWr+Qn4WiaKh(6l7t(b(bGg&ImbyO^M9Wg)s# zhxqc^W=ymtR2TM?78i9b(fu>oLuYR|Ki)+$v)oJvYa5u0jI%cnK`I!ASE|Pc>@>cm zU=o3duZ7wMGF{OrTo-Q@7WNxd*(41$bqN0!Z&1P`KR@VW-mlyNH!P)w2n_6O_Tufr zpuh*WFtl#?Z2yPotT&HbRPKx^YzdZ+!fU@{{;2-Jer^SC1#szAEw zDKT|J4@^}E#4?58pW7BR5bSga{pZb&#RRY?d!g+nXZ!X(>%3E2t#a9@fQ&`zYd#%5 zq9C=FRPG9i^ zxv$iEARZS{1(g7e(xB|}yPDcj+CF63_*Hlwa$LGLLyBn%l5+lE?|)9!=Gd#~*-4<>9Ri4)Y| zJ8qet*Hoo{ecLhiB4l}c2_rsTkf!!|J^z|>Y=kzX`QU9>3gJRf*`{|h%Bb2xx*!^v zLVqbV&cjtg5GRbjAT7*m0=iQ^KJZfcigkR;UtIlKp|^o0FT{QP%F$06?QFvwi=ndw zkqgJ}RA2qfEyTNIqlJWcP`>?GzMkVW zlpCo=qcGcM8*D@+Cl8z&A_G#@D`!@xPvUfa)Nud)0G2)}c(X8!a-Z=QI%W1gA0wAl zzrzD3Z`yFo?MX9vxqgX5YW>ROm?S2+Bkx8WMcry2A5Vn5EwVRst+ga}jmN|*#PFK66 z+T%XL_K)?|S}l@l`E0vc7p~69E=8$YsnLU+KV`>ehPmk1M1T|7oZSbD?@hl&OJ{)d zz3>NZf}3_%bY>-wK;H2D2hoWl+4eJMUA|3hJNW6oaRKH>psCyU1dR7V-|^<*S?<}Q z*nqVFus{{$FIS(7^Nb8Xo2A%)(dTAJT+_Ikn%1FQwD)=L8dIX^fW>b;y(JixLke&) zU|v}7L;FtCll7L&e(H~OST_?bc6y6qmNnK_MSVrafFwrd_cLlAD(~D@9?mllQ9%vI z=5W3pqw6{I-B$vjI7K{h==7lpp z!PQkYjwFXRrv8fcU5bCo(culO)Z&-$^K`rC+-Sb-pPzR&vLxT&ppjbu5AK(fqu>Rr z%be1O^xw61ECQHTB2dk@tz*TEyivp8=>Tc`P36(? zuO&16N-j=NckkPVDPqlAvu#l^xWHvCjoX~lYUTpzY5WWZtQ{R97aMlD9433whe=k1 z6e>N)BQHDPIj7Xt2ClpgO?;MH89 zyP?O7)osO&u76EifW}T&30y8dR60-*DLANU0Y!&y+Ll>#JgA-4G*D_g@!qis-#+{u zk@QDgmKz2j&HmoEf1a?Fz8`XI_a3jRp>aiW@g#|Q5eI7ZPni&nKEF^t3SNrwNbMZ! z@|Z^vv)5AIt|1mvrY6ECd55*mvG1By!iWlqfr!)n9vRZozdx`f)hZfqWXuC$oge_M zSMsxq2Cai~G-x?pUOI15nz}eVf8c1`^H0b+`d(DF;eqY5K;n4 zY`@^aXETH4bFL>r-{H|E$SJdGDnda1_4q&GHm!fL+=ur$uDSj0<7FfBIU|3M*-&@% zO}K5FZT~G&U$H@;3`G7{pY4`y;IZTZuAW5-w|M|=HZj+A+h%owVzK&#AMM@C6*%La{Dj@xbu`Bs)pVeI$Iy4fGNvAG)zqjICo{t$>4lXD#CE}L zrzVlydM(4Nj&(xw4}cw2Hc5>x#p#cfccSp*rG|P-N-fb$@C6~PFFfe z!u&K;)VtO9&xB~8t*IlPp0?>%P&W2%2XC9=nu%@>E>yc!?Kl#BxgawrG>Gh3Zn493 zjW2t*Q@$&$Bi4}eO1GyNhgktZ5ubr?Rb=w$b z!t}w&CwzCg5e5~zA!6FlLLNqp+h3yWr>?L!T9T^B-IDhLV!~bj!VlENUNDO-F4x32 z?HP7B=DtDYOEueD-aCWDxvzs+_ikC-gWB}>O}_}XD||44PAh8G4Z@YBa6|CQM9C%u zylwBOGs7t_!`QW;%~kZf>~$FScR;ut4$b)syeoXO1Ke3%TB)xh!^hsBucL{6SVkFG zGx=HH!k1R0u=W7Khj4TxhCts(L>E7#*6>f4VKegE`Va8>chF^+P#f@SAa{LhHk3_` zS*gGzCl@D8i`}0+r0|G+S|8O>efjlx!e+J=YJLPz^vR;-CssdEt=sc|0=t5P z$2_gW`>Eo8(YM8_puet)2XRDp190^f!mgu*juR`{x3CXT>r3zj&F2G-W~k()w1JI} zPZ!^2^7*0Wg^TIO_tWg+a))QP9r$)Q=?ly2*LCGR)Pr2&re3igj*a|LKP_HEnW{oS z>@6M-6<1aRN=dF=x4A|I^a)?KLl*gdQ2g!d3^ue;Gkf#q8&9gorSJ?fK?CVN6aBNF zPsGZwvlwSRLIvpRw4up9uNx&z+c-!6T&9HpZBol{z*5>Bo zprW!fxh-<=1VNNko%ni%$4}$ilM;?Kw4}QmULW8|uZ>(lIbw=|+%Vno(t-<7 zneK+Qsv+t{4#xfy4fJaL$ufOHa{G4Y9zFLs)r$Od&GRuR>-_)Uh%j_M2vWAtGkJyw zL;fD&YC=b9%LC^Pqo3oeX&m}VVQ@2WmvC*k@_pm#OyCabc0Y%Ev=VNQ_aHc$(QeoS ztpg(XXg}^xgdoSxFahD~8zbKA0z~EdBXbfnh$~>BTM}Muz@OXwEM|aem7l<*SPEfH zelGx=6sFP_{<|iJ{hUyt=qHP!fQ+jLeqf# zA&RD(T$;CbVkvYku>^yAzru^mntL}Pvd`rIyfwypL3`M=77tY=5nvJ2e+*&o?@rdV z{0&=N--(XcS72UHbY-mBGR zf?{n2uxf^i^7Ed8HaaoZW74Vey@H}R;OURVYt4#f7~rx~&O7J2>{NH2H1W;SDJE6eGhONc5O(hO(rF5sQlo$82sa)-?#_GdhmT9^jR!lj2p zr@XUSPEqzl9nq|hd@1F+Ly#}YsCS)z-1xduhfB@iYC9sVSb|{lZC!%zRD^f5lMB5o zFtLEgxV1h$wYne33p+gtYwRdce@i%bt3##H%-41F_))o^KSYSa1SCM}afVW<1yzp~ z!;SI)ztq-42zac}`(*HI{|Rd_)vR=^=!1ov^a@*N{N6`ly`4#A1s+E1SEZN{ZM>5c zff|6hzaccc%Y7{$-!m_tEqdsXv|oSFT>{HqQi?a6Qs0NqKY*SY#5@qw;|Fnfvbw(vo2f%)q8?!!H9dp1g3R_=E4 zko`O<9u)T5#K?&DB(-)Q-yX^pSNs@IJ6Mf9_=#ybjeHlltXali@U1`TIhaIVocXim z8^4TLHu&cq2Bxws&Jw#2Wx03Vep3~y49q@j9iy=ER=dAC6*;7|B=c?S4X>*1o=Ngd zcNgA9gdbKEY}8e)@pGJWtY|8oWeI&1-7MjjRnqYlXNV`GR5Mle&2I9by~t{&Pr_qy;Pb2*@%9UbM&YS?hi3vJZ+tW47%CmC)sXF)G33vocM9J z(F`y$ejlaW`gC6&!_B4raiCM;M|$Vmk*Rv?r>84jjAq$rAGF;>R_$q(b~H9V06HJ)(o3cEg28)O zH+)T1_7EQk@94)~wJUO}XkFgZS8aO->-~-GkaglTt)mz1*vf8CI*nUJwd$=mr&jAd zeGllwxbhA@<>>phjj48a@BaM(CA1IE8`l>{m3);HDS#thW^pcziX1B3w^X;!()gMR(qgx?_wilZ-iQ>XiHRieV=XUrAw}B?nwu zpUs(w9rq`lFO>;Zn#;(9dPiQ%&1g4g_4FU*=%&;5-qUV)h6hkr2IF^%%2nk1HFS%# zyY3v9^;@bT4W8M7=o=G^m)tGZKk&k!E=_l9uDo< z$mtUj-Ru>m=VvroJ1s@sBPCDb)zO)%hY;81R7-WKwy2S1x++4)1t%`N^;vt^R5@l~ z*S$=Bspk3XZ!@^cMlRIGvYq?8_PHu9TGcIJp%F?k3qsP)LVz}mupZ+2>WDFWqo#L) z4xW*6JRNKZx?H=y?n;NgN=hlTcya`ukR^9^X6c3V15Vxo@!;|;X|V%s3j!RVu}o2N z5|yB1T69#-0_e7kfUTm5?Ets>no@*W*qdC(<`3-uUp7Gh`24?&S~J;C^Y?$b_0qbs z=$cX!4>f+O^a?%(`3ns_;b+1BX4Z*rD&@}qe1?6(&uzq9luG`Z&KMIr#Az=_VJe;d zd;@!xruw(Y=ztJG?%0aa3;US&|Lya8*~*AhPl8)2R?me;85B-u8zB*QjgdLM4uuD% z9afHO(f_n)0IqNE2;6#sPeZEou;~AzgmWEv$Jt!5ZR)~JzC*S3-Odr3Ih-9bI|(1F ztgtBWP@y8(n-5iNab`?QY?WEZ47!=aB}{_MKj zig!Hh;rbrx?3DS%$S0UJgqd)GB|6D9%>QRnv2)#_Y`SHER7&RG^I!7?zG;sU>Xu^! z?ppS658;&I1%8qXi$r=>EALkk3_E0=v#a*yj?S-YJ@wvvVo1-pDisxQh#w%Go0j7^ z@D3>`p%yQ?az51q5fj*mDdFHq@HNg zE+bOA!K%WVQZ4P?&A;`{y}pAt6R^?N;!F(@k`gn49x zX>0E%2lwy8n>P(!Ul_^$%VUZgDbq*`nf}O%tDICYmt0?!au~BBm|}C0G4mdQ-~3hO zB}rU!{5LXEH*X#hnInPvlZQVFNSFQSlJ1hz(o&!Hb40+=H4mqj2weRf(+U2a{U~U= z$fVzyu^BoWS}+;qWD=4vzqb*k*7YFdQ*Y4CZiTOgZ{*SB#K`Z5pPH@tN&xCzgXXS& zzAR%|mahwFDlE^hn1?#a*;-C(_b2pu+zu{HmqaNgj?}$9KGtwUa;dIBnAVO| ztTmkj$SYBF$o)O*PqQ{XOoOx=`0K8U%BjQ5*vIv>*<^&1i-c#^Nq=DO6!t2%LUp)5 z&7$AsMd9~D`EBc~?g9$3DyJ$y0$m{u@bC+!N#<&y%U%1HMy-QWGOzbSwcxRk^|?nE zUn5i%M?^b0jp4B69Yf&`nQWhwF@*CSQ=+MLb$0)A%djooz6JrqvUN4gN1Mf7nkN8~$NkmIgKal0$Hdp~Q1}L$+$OAT z(>Q3t+VJiJ;D|CWUe+Vb4`ukI8zu|JtgTaYCK)+95iIjxZ`p*&i%Lbcth%SYt)uBk z&22Z&7{0aDX|gZ4K7f$(ZSFYTg&!2P=`zLKy~A0Yem5;75GbaHk9P2qsQ3bQSZ+K# zHK?ncRhZV9Bts@Zsra^93pi5w<^ZlGwP-W7VS_95yrJSot2^|m?bP}b+wKclIaM)OxK9}b8%8;hn4b}yL9tp6=W_~1#| zRJh6HEr!`JK6x3Ec~RJ@)Qxj0xx znV4xr5WYQhJBWQWR(JBW3$VO^wid%z_{WcmTi?B}N~sNBlN{b4cf_Zm^MkcMcW>WO z0jt7ObVjJv({l|S7pC=s77)dCOTk!~ON|o7s0thv>P13~Mzb;?y*#?oGHIEU|l{K_^=RT{wbr4+?n=s`+67pU zBU5se`1jX})4kjNJR$h#H|M zlIunzOL9<^n&`@(9rEbOA)r}=luOL=>24GwJ1MnPC!Yz|?cENjY@)oXVq_h6hOCiC z<2yTLsj=y_3&z(KH$%pYxJH>H=$jWSyc0F<=0u+e{N4eV>=9BaCJ#B-JSjW6*dfh`C6$>hFhSgtj!{^Z#py zaL`}5-}<_bFR;VU@5B2+x*Bfj4%OfVqL!}H`yZ2Zr&<|S{j8L{e0D~n;l=Ga7fEj%?r!iiqyDv|tEOchwbu$Dp zf39vZT~s@3hvjSKx@J~pCX1xyk+dCy2&VoO{DCX74%`-a12{+*r-{`St2z}|*msb2 z2*zYYk>h6u=(&SPZ>%ICcuF>P_7P3P4+YW!n1TRlIEl(Zfs?K6eU`4F$LnRU(Mq)I zDfH8_$l`;G_GCX{z$uRYRvESb#(R`6?=U(6*rbHR=;t=$Iyyd@&40~MpE^s~jcXR5 zbu~X7s%+o2<3Mj;uyB6pU5s@tbGWhz0*_haobgyve!YHH=m*5Er-x5qKDQ0r)b$#1 z{In_&G5581il%G5u@hCA`@VI!=wz*Bs)}P|8oweMhQZz;_1N&pe%IMK6(C6i2Z1+H z@x(O=Jqlw}L219ch|PZ4hh&c+sC2;7iJUHY8`ySUr~q{3G%}6$Vl%9Y8IH)gR&(+l zzmIt|kE8RB zOM36$|9ziXS=mxkQ%{*z&T^LXKAD;tnhO*hnHxfK;`VzgwVbJ`DUQr7A~^sRgp*s5 z%z-8d95FNp?u~l?KKJi${*Z@{&xiN>b-k|ZdRBg?Yrg9#Fi2{MiUkEU3bQ67xGz$% zNle9krEj_EYEsRFhRoN)pXxd+$|L(?nlH@uX6+#!XWXp{c!c_@&&5O5Xg$}nC8DbQ zfH82IjqRa;W-z*BSGScYLncs)wU}DX5sQ*8k=%xkHh2QqOjWo2`16C$x9>2oH_V1L zOnU!tztK(SBThO@5&!!y;_xQexf@lz|IuDM4~W6xPx6$LL#c8-uI)ki`(rCoJ%u*) zBm1ycuE}<6-nC37{9a|GVQeP*O08qrX=4dr|E0yy2$t;P#PY;Oiy^FP5nC51rT4b{ z<&F2W$W;v>I={JDKrYjKPtWeo4t`jF);V(R73 zPN8Nwd5KJ_kLoVAz3Oaeb>#A3=aah5^2ZTr9`o4g00Rv|vXze+X|9V9a!~!Ud?fri z*C(f&i?>MRi&F(8WqUfzyjkxfU#>aM z1ipc_`!)$dxo5D#XH`tT2nQ60s|hbA{$s@8aV3HVH$kNRVrd}m1C4%ln(h0d554YPq(A4#Y`@0O@qUtTx^p-_b zKVT$6u;M?`x_PST`dd1(#MaF#B>J>&w2O67BS)^ObFAFs9LQBClmtCf{Jr44n{Ujo z`*7LJQ!J~qd$~n;4#)j^;iFNjR$(t^nwdC)#H;!Ex=KErB!mr1^^>%|Y);y0rR2=z zZn;Yx-XX|0UR$W$^bW-v#=|SU`TG}L!_s$~BaYPxO3aR9%r(nkam=MS28=KQ8e*vF zeeGPD*5u-q<9k)PR=lD8M?N)=bMFo)Gh1j`m!K8;QW?$q!@F&jt>d)jIV-(h`Zb}0 zOv~8kU8zagLZ$9fRb#gassw?M7Lw$g9s?XO%`QboKION9;`Crf>N48%`5k0Z!|Upg zi#9cGzb1zaVRwOATtW*wrl8>`Q0V4L{Yka4KMPJx`{vKNIR{b@!Pf`g2a{S+h3|e? zSG5o&m2vQ|wy&Py$-?T;(dD4BQNcc{P}&LN4O9hPcAtiQN)dX}|2JFq)*r$QRseRl zu{#=^R4{w%*=imlA!~BaG>Mv^kR201&_&Ptg?;^OowCE!jb24&K4AB z={LIP?#|!!7(m5|9S}cJ#oo_Q`gh}(#W4b0v1wlxA}=Pr;wG>ViZV^5xYouceohS` z?Mk-E{ocn)i_Xth%#xtGks)JdNfOc4AtbG((66N@Y|bcsVV1&5@3Z&X&*;r+b(4+F zf^hT%Ii>Mmy)vVtCtoid^a#83F@hmX^eOh&?WF;!!Tk@O9j%kO=`({UNc*Nq{?-1Q zkE_+3Eeat7ZoaX>eD}zG9+fnxzn%!pmli0s>8=e$jTLxia`<&}x))}s;CNFCzKB~! z5>%BRaA-kX6ZqO<&6Bwn_KJz8Tv}Hf!`!{2!&c13Rj1%(#~82}cn(2+!0+T#zh9(j z4wnrRZ=k?hjJD*P}j^%Hg+!LXz+>T*vepGPmOxs=WS6n{Pwb-G|iR zWzyX`F)be|XbRm2h2ww&u8dyovAl`1{<9TFZvxCu0vte6QO0B%`1%}Q0Zy$e16~aQ zD7ACV?Eotdr8G{;iUPGudgcS5knOwH7y2A`b6&u3ravc@KvH`6GG_}gsO=1ANja^7ysH^`Jz}i)T zxb%EofG9iy68VY~m0hi|vO8>|5KXOiuYqIv%8p_d=`uUzppmEJvIW<Iv6jeT-bD4_taf!{#*-G6<-jI zl9zCm_b&i!p^V?eh^1%|KG+Dmz1fi;i|o-=Up#Fk3>wyd}K8cPHWwE_7m~+*Cv%UC;=7A@o{#ytIe&8y#06{seaz# zl2(qDh(bg$=I~-r(UF)Ul^fHH2f~h)uf^l;@>zBDQ!nb>!e|rkg63RHC@}nVVX2`M~ zdJBK%>F&3uY_TPhX1hcRbc|qyFz3A%>2`fq<+-i?k9d6N<(Zpm zibWWN{vZMeq+1cPY=~906Oz}pi!I#C1^PmSXEYvqC*4hr?e_+FL80cPi7mM(N^O-p z-qXhJXB)Ys7T>|hY0G@wH;GE7{!+Ak1&`i=VEJ+N>&WS&#eT|KjJsNYR{v+JuM%R2 za%25IkT+`ngKDL0_jr5KJ@&a2cqY&44|&37coW4#rm_}Z>d5L3iQcYS{F*)kGLBC8 zd>ino?~HhJuG?&haBiWI?*sLejnlsaycq7@M}d)ldAXS$ko+5fuhV1$(Cvn%t9}ug zM19EE6A0nsth0!dnK66ibnT{7t?HolKy*pYKS$Oq#9b0&LpZyK2wH-Yh+eM(A>)(T zdkSu?txgxU|3%};A|_hmaI4b z>I8$X9VpqM>h$m^;$=z!am7n9sOJ0ExyHY;xu`p^qrxPfMTzY29ZngL0KMqsQM&{X z6zZ}*3Qidt>}M@Bd8l{pPb=z8^jPste;=rcZG1FvG$9dY7LNFL!Yy}`olO|g}!j5c^THd{LGs5%TL`2zIrG}=~2msfk#NtgW6KzYb z3Y%9vV&2c(B;4xIL=%_Sj2#xLa_C`QbvsaZQ!BFb=2P(T&QB1U)tWYF{N&M?Dj;V4 z>OCE+gy{;V@Aw5ujZAb5Uh(~_zN7et|9m6;-MStiO^jD`^z-6z@~(1o<-g4rDt)7G zbn}yByqdQ6(L9_8&Ibqa75<8)shc z>a;ORo-*O6i;nz!lpb}HG`5O61XWVbHsa|7#1{%;M$W8DN;WpHa0CD6IiDdd68v3r!6kl;0fmIHr4o(um)k2QM{_OS zMC`f~ZWM?6hi|$)9HQ^4HZog8SYxlLDW8`pcY;o#J7q#N`*6Z}_0ajpQMATrpw4h> zWu{BCLmI!WflXSR>U48c8&kL^h3YWqg8*MN`$9^m9Y*s|m(&m$zLHC-8V2x_p@oxw zeYZN#vg4?1OK?uL)LG_|6-xXszh+__a~oEK?8XG>9XL4V+^w9wV23@=P7*73v`3eA zcv_#~cKDW98ua;k0oSwu>c9i>xOsZ)1i@-9xtF%?mKPM zo{?~OlbMefkSe7ba6)F{+~g%yLll_Z17A4UgiE~^p4|o_siTQ`+_k&TARPH8s$V#~ zSDvxzz18Y>p$r^ZVA#Th)U|9isd2J-3hi0iTm&TYFJeREY{*|{t61FjKnQ?;2hw4d;gsy*Wa zP_!2l!i#w#A}o&fwociB<5QL#K95m&+K|m}8!@=2e6H^%jvXXyYsmkT5<`FdK5G`h z;3b@Sw#bzux=9eh2_3@>rma3A2A%VbJ921{ zw-ZdmTm^`v4GCU^@2ON}L)uh5M&XUrEAc*xj1UBFm(loZ+r3RpaD`V zUO8O#o@;Yg?`-hpynh7MsD<}3iDbI`K-SZPSOV$+i7l%W`cQAS+<7d{zYa>aR=k?P z+Q-7o))?u`LL+1n%Ayi>xlGmx6mL0D-+82J6DzHo=YDvZsYfL#ImO(l-p`3-TZ$se zcT!!;dpSJvKDLCmrp6+zDo5O>Egvm*Tw#2iMkd`myCSOVmcQOAGE=L)hCkZ&=+Oli zIXziLQH~&D3d;vtVGh>2WWwsvv(R17(|ihMP~LCbgHWv5RiNXl*p`0%EdEepL6WOR zN}6$|TB3FkH6yxW#?cI61<{Sf2?kC;V(9C#_516Kv1fgITvA#K%z3#U2Ztk{Bf&fe zk=eaFuX0unX~5E0qx4E1R)RBBs_*3-bZCm2!SKnuDtI$@spN2VgNMk&9d|YrzQ0V@ z4iB$r*?^X+XY%2Dh1lOgP|+0HxAJS)zB-g8gu@fH11fp^vq#(nDDv|JX-6& z4%VvR2kjVcq}1{_$pw#l$G$=$#Z59`(J3;LgdTl(g!sc_FtukC)EbE2{yN`aBELT& z-0+RqRwcHjBmO3iG(Sj{HEmzPKN{WEn^ZrJ01ER(Y_u~7VV=bQJ;43}78pZYpN$f3 zZ8-VI8JW91=)hTqwTJDOnnu3-`%X)boTLYC{KBd+MpP_ z<|M0EklXtXnh5~Fs_bFARoSMA=d8{*9aG`L)hM6+<6R!xqsX%rNYIz(J`vbfH-!ku zp26+mHfMATZx)w?d%imrpFg|X_;2}{ci147d?{jWYcX#xnJyc%vR`Mq=Ol)D{w2u! zLfsLEjUA|UJUf;)CHn1b$**?@9grPT5Y$&fU92^ci5xCQ{gG`td%PVIUERH^M1ANN zCTbIdrT)`4qfP}#*Bm8;CUo?Xo=C|&*Eo;VY4IYq@mqao#&0^)<+3y|7$tMmaQ+&w zb4nmU!X`4^#yBHJwWOfFU93FfUi}QJnSGcJ*dujHq>zpv%6?9m8po20zaN&b`20sK z)6Q@G+=~`(WcWCRRVjFvC^Pc*09fzbSGA zoyb;iIsjiNw4V#Uh6@;PSlD3QLj3@HDyY}1_$jCmrxPS1;^p>Qkvd1Od2POa15g35 zIX;u@kk&b>O%(DXs>Tjw^>W(0EOJoZhq_%UWrKoi7_qBj74~KX=FqJ~y1Npb*-T>vcdIFrwjW*gGcj@eocHpip@PDW0^JKbR`I zi^qC>tkp+^nKO*bGAuVfuz-E38_WfN)kmwYsX-u-8|SZFD*Yfqw6s@OSye&Y)IR)s z{wcpP%xzM~b#0&F>Qoe{PHUL|vur@A=v(fk>h`0>(RNAnx#kDiFfv3b3TI3Kj0F@V zl@LALYY&nizV%)>ubb$mWC_nYJS+1J{^{c2+@ zKZs%*rMZJer+^k97@Iiz$Mm3z=#)~#;HrLg?YuS9e|cX0;-sf`5|iNLH`V5(u8|p~ zgFdme8~+2ou$`H_L&`S%_%H)7R$phu&85CS29#e19tRIjjMnuEh`&)LJyNLwx8YjKtiE45Q71rR)7- zsW&A}=>03-BTm*q2Z*3ynXUShAIT$N|EX)``tF3uz)-U}g&RTp#p=<*8=HiJ#2bR1Xjejh| z78Q^0xJCrca&jnx5U|&(+ib&b2W*y)w)K# z%0T79ufuZ&`sEM_@l<)MpYEi4`8Fh55?~^2fldbOcpsh8ey6 zYwWiQaHJ@ua;EfR0?sM$7y9(1#x-ZGCTGFB3!m0A+xWK2epFqiy)XH=ORHfZgZD0$ zSzSHVQA}M`*58RZR_Pz7{848=!qfDa8AF@~Yt>Jscm-0Qy(?H{m5ImIs1|Qg; z1=`7X7UhboJ_qAut2tMi2C9>)2kc{3xAlMvuK1hW*=%>f5)|DmT(y16F0?atrn*5S zfJ+#3I%+C_haP-U&tfk^z@k_tD(AyKqAt(Tx(F$)0gk$SC8LxWXqA95wzJ)Pk=38M zdrmVP2Q$5(QP%s7BfF{_S%T3Ore)--ZfdSeVuKH@F(Bqo`%TyIgZ)@H=e?i{=t`_f zU4|n(el(j>u`8V3<~6cir?o25YHx6%e^0cqk($m!pZbC?rEdWLnI_BE86RE*_&#fn z1y1TD5hRcAD=xX~F++vUcm1Q%38hb#jie1$nw{n84cnHE>gZzS424%JFtTz9NuRa> z`!oX;CeL!tyQLa<_-LuB`B9!o>Zq9EmXJbN!p0iEbn)^P0@mXI1tS&_|2kkkMkjf1bu};2n3N6#vKL4cotZg=|WJ0elcId zLx}CTzMleG7r6h9hi(?%aAJnz{^O?n&HCtj1J5dHkuM+1V8?s8g|B6oo2J_KElFG0 zTWWUQwfz`!n7^Mt$5am&Q@(hZfgPXJtc$}uF2I%L+*oOlByJ;hI_cC~^2!Ywd&;SN z&8?`2SdJKYKg8i(IY@{f`oXx_nm@5%#l64{26Bh7ZIIA*ung( zQ~3n;OHW-y1ioQvwIFokup*XlWy~{R2Y*SyAmJR_9N}DFt@$S4(GtGSKt?B*=gXe6 z`oQs|ll|X+BH@q&g> z_WYcM*MzLhh=E$)qwzha7OrCA?#?rf_>=F z#!+E|uGe$^jjSU;MLm%G{L{NHZu3OyQ9av}hl&wDM)%oF>Ji)}@?f~T5OG!O`Z|8l z`e<=P5cbdhLZ9tCYhv&!xT!L^`s2jT;aQe~^a=L!Bz+d`GfYM^RhfxQ3nU{nrsG%} zbkFl{Jy#R;nuLoGWEj+2x&{QFvQZGIXB|)e+X@enIpYT%WtrG@Uc?e0SK2^*putZ zOh`+JCjId>jPq21L)S0td&MEZgTo!r$cmErNoU4PzQDE!21)O5Rmv!>3|tr22pC~T z$|4FTx26bz%3Xbp`E}~i%E|xarWagqadix0Ud0vyO`IhP;{{jUR7gOq)JEZV`(Dgk ze!;%@`MJRs#btI8o3rE>H6DG%z!#&IeJE-d0;ueRt_5Q7JN4&voV9N|W-WKb3jNs|uL0?LTIeA7^5^efK3!!k3A@q&KKzUyWSz%;QH$-q+p z%nL1Z5BqK%-$fXwy88Lsb)*w=z1Q!H%*L--C9STW66)~YfLUYz*0E1#^66sl|4~tS zmpl7?_@eZwZKdTWEg;Rs`9uU%%|mMac0l$&qHDT#I|Is|_Z&cEESqA#wtIXbRjQDY zi`Im1AQ68@e|gz)PFpAhnmQ*0Q9BBF#>2}^c?1XbRo8yH4ybocsjie13*-S zH~aGDd-_hS-~Be4mrwRH>6mk2P*2c8IIMI@W{|Yc1Lx?`$(A+;xn_eQ3Qcfzj=9>5TETf#7D8w|hq6$Wi)(&%g}y9ysLN zVFt1UW{g@#@&x1om-+B>@U0DaM+D#d|sk>r|9`wMCxG>d})&B_4Zo%i2`CR zyc^Ra^w+MnspEq^gXluAG{lbjFG(y45k;X*l@vW+Yx7x9vm&SAqVX{kT z`;aC@O|wJYc|i9`f`^Tf$}-#w?Oz;JNr!X$3fx@*qeD}k^(Fl&)97WIZiI*OsMnbD z;NbuO71}Q=aQ&FTUm&)BYAr?nGWvC%(I^3@fBVxF26oQ#ZJ+)m1V~%OgskUvc_igjl%y-uWw8wPEIwva&A7r06`D&GmxoXvAc zq$~xv?i}*e9Vm@4vLDteg3ZYvYD*%Ylt$$}K$&~yl~Kpb9v*)m1u}DxOJnWd_(Mwr z4pfpssrYKEZ*HZ}!9=>CnAxp#C2Czaly@fl0gRDtF?#KQ5bZ|XLF)-d!FH=kvBw7F zGH3Vr-}CeRvXU-@`{4Bx@+&h{FkOx8X|3+;2OIhzp1S*3ths(7;Y8Nh?jz$i;pCRPR{xd1{ks?_y>(xxb9`m^xr zd;4ljmVIKrSw;)d#mAyGNzz$J#K8-n>7Re2K9deXF%lc9hRun^@7zE%bR5AEy0$;& zZ2}tdm8L#srVN!Cyiu**Y@7uT3Erey3wdAqis2KI5Gl_Nl(Mf!t=sne8x14vx{olB z;tlQ`*;6J`95$hRfn|BN7x+}+wb2>e6u`GjMB_P(I7u0z+!$r?#&^!Jp?2rj&t6K7 z=k4!xAVVq5>y@OGu<+cBDJg(uR+bEQtrq)jN`c#!@Gmwm(C}JY>Ye7GCx|+d`@L{G zPS-W&2XrVXVP-ib#Y>ccK1$g zR7m`oMnAU5#!$>^%FE`BO&mX772F}3t4)dR($@KotAu!;jp z9V24bvXB5Xdo4Y88HPkhPbNNLHbfldJ&Fd*N>nMB(rhl`uWfwv<-w5j%5sC-p%v@4 z&OQ_E-!L}o_ot?5IdfX1wV;O5u49vwzQB$#=bsbgg$%cDmO4J!+tg$Z&`gLrQ%H*0 z)0(WB@Z;Oed48=!5lSh1`k+0$>@{|Ip{EkLb7VV#x)cBv)F8qFIAnb>ZDt?TwTsWx{48FBg%_WQ6bAo@p83U!Y0s-KCJZG%vQy;!B+2e38`)dh@7 z&O*rRIa$a5{!6Z!)wvWVa}T1>E!iOkCTTB=%q*|rpXUBm7Z5R_&yN(i*yqpL&ESLb z?t!2-j++PX_mvmzV#*D;bCT0a&VZ+`3sQMr!|&{ zP#xc=3Yu$znt2C^ZJ&pvR<|Li;@IMyiArN^Z0hOMqu~w**F~GC@b`GV(*F=rQB}jb zBd$-<^$zQ|bu$XX*n->BR<}GUr4dcJGSO4V)i~#wwMK^yL4sp~LpI;WXw^01aN2Uy z;m5%{oQx2FtfQh!`W_S8eO;vn3Ltxh4bVCjQl6J<0tav4V4tb_W+SAx?tLFDZ{ea^ z!ZXKtwLtQUfC?8-yMj^S0_0N+$*(?k{*5U z=0`cyGX-eis#9IPz+ZPY@ec>uYO2{k5_~bcWQ$cG@#{y)d_>*6_NKrU60GhnGkmtv zCmCKKf!0c@$4(R(OK-MP2CI#7qCe_=<@^47&vP{e7IUwq?RE~zb7#rZhIw%S0NCBc za`CczJ}%UUo%;0R+*!J`y}p#}$6MYikbFar#d|Oz9CoiPYo|_=+c`0j$+w9~jV!*w zVn;ho9!n%GO8Kh*nzai$4>1$rS)y-_%9jYvJ$+x0G;-&->*#PQ-Zo7|g@sM?Bh@Meq>yoRqKm>*J}=(o zFnLF0Lz{W+Erw3$m$WkTF>Gav(U?Q~F?}K{`_@PI`f2sRK=c?~k34$og*K9_igx-c zXbt=%1+N|ig_g)AJB>aVQN+Gx!(Vz-AjWbHvF>R9p z#{R{SrWM>7m`!rexz43I^DXFX?C*%PwO7m-8;67?_u|BH)+LoH=SUafz_E<;&Cay^ z#!<`KcV99t{(i#VLv*Nz-u|O`tqAIPj((<7KXikD2xx!Bx_9eTpCDSi@B`8~Ts1Qr zm1l?f3CG&=^?tj8`87r%uWfNWEf;IZ>pyV2bc{b6y*XEV12||G*J!97jg`pcr+x^>zjPvwwc751&7!zs@g1F7}QBPS)Phs@Gl6;XU>9R9_V*0k09 z8^%A|A63c(w`}=0HQ)4t8|3QbBxKD)tGo7A%hYnzw1O68@-4?SVwH#1-S)}x9`V8m zKmn@{Yts`V7dh-zXTMe=p&*+t@z7_LNXqb4X>8j47@KiJ50}zyMckLfpaj!ja=P{P z(@MfA+P``J10A4dI=8k4KTE%aJRTk*v_8X8r`jjnZr~7>aS}yp^Yl2HrpT!rs#8BB zH~eAXs!V8mMX{B!ly6X9!IYavAbPJbP}z`*x`VJMi0O|1?0NkvY-|xc}Y;s9f&a(v)5kM~LQ=VjzOdV;{ z_|!L*E8GDraf|k}A)imjibZ)-P#n_Hwre!$P5H+66MnhWjfpD2Wf-K1*=>qnPv~$4 zs>ZJvj-c;&FxzXbJj%AG;+>OTR3~Rsh)rK-H7L%JqjEs^2Uj9q`i}{9*KWoy+@zXF z`e%~96l_L4fLqYuXFiVHnn;aJS2>t$w!V#(xT#IPc)vuU*fH>C^-+Yee%F$5N5iJh zlfG$)!=zNU*~MBBJ4)hvg7{&SUS1Q7Yk^$!;AcHuxI9lVL`Ji zli^i+Ua0Dq<+$!MGpW2< znL}QeyEFc!hp~yhE_HXip>uY|AYk`=Y~97ZB7IIZH_~Jt)cUJjiR7x=cI%5oe};uk z+veT)>v_KRUIA1nd~%ak@Ey&9o7G>6T$5_U8OtRVmfviuCNW?pI%_F$WmSQ}q&bdT z&v!&s-Mdy+IxjqC3(jAPxm*M>wgE*0Qxq#N;njNqKxAt*$bxmO5%eub4$m~EU zls%pqysHxE+=QAh!(lyK_b^tzg}2V{#(n|1P=z;U*sExwUxBPB*CaVgDMJ)kk>SH0 zslkBBBi|v!;wR~)b6r6=ha$&Um)COrVVA0tM$frNjIHa3(ZoBjnJuh=L|?E{-~n*t z_)HrS8=Ebc>?0GLN)G%2@rOSu_CLYrYDD#}UPw_KB5~8=BXD*4zZhqgaol}}nw9N1 zWYz1BtnCf~`4Hpdyx-{fBjL&9^>1Em?Fe)|q89qlzTDLge?MU!F4^3CA`D(KI zE~%k^W<19}!X%n1^O%67`q#4d0M;eN`Tl@xgn}-DwXm_U`xhPXeO#E7_;6@ZfQ+qe zI7R{#P$v!QZI%9~QTnl>D7;F8*hTwRvckm@O8iq+_2J#^E#ti5o*eeH%263aum~+* z|FsYS&b*xq_3WU92S@8?07B7lsJUo$Mu`e#8kFB3b9}8 z8#|+dlop7)Zp@X;H@RUQehS9BnZ7t6O&>aAj0IF7qK0AmfL&3`5`8a zzDtLcx<_ib>&;vjR~|3`JVq^RnTb$YXH#mzO8!2!zfVQwOsBtvqml8WUY%RR505nu zQ{xp!)iui>J$mRlFV~2)F^aEuZ9vn>vi!j_E_ug)OkObGl#NyE zxPQoWvDOO9c{S$o?7%3<6I`X5rv+~3thkfLtXoP0;;(zWXw(&N3EYTnW~B3!CF=uK zLv&BCWLst>WRQ?8JfYH^hfRJa%&Fn!$|%F~XUZ19p_QGY-<+vIa7w&# zzMUrzV69p&L`vA}5hOLwY(wwl#Ez2q(OKED0}|6UaUC8w*zitBT7Od#V6Wy*y2)g3 z&OJlrx)CBgE~2!4vk#T;ITk_EQ$NSt5!%0A{Q_eH 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 Ql)4Vfg;7(EzyCA+|7<^4(EtDd literal 0 HcmV?d00001 diff --git a/public/assets/cesium/Assets/Textures/waterNormalsSmall.jpg b/public/assets/cesium/Assets/Textures/waterNormalsSmall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57b19d8f46fdc4a7e6fe249da37f0fe9c3c461e8 GIT binary patch literal 34121 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�MKo&Lj{(*y=W)D+k z1YZEH#0F9xPW8@d!7WkJiW6+*hA(mNPqZ2%c{BK7a+c0woL$drk`<4n2!O_H19ed8 z$rzra;(iBZ;fv`07_F1ZL|2`FtlHTd20aMdw14T*6aFh*PV1$n9gEEb+=&O>pmYca z%6;t}Z#{xOp71OC3A=wn4G2Bp89OGP?O_ zbS?UdNk6>O>3gj%?O1#{zM@$}Cy;uZgnzsWnvDAPKQh!CW2?O@*2?8}8krk@V!N}g zhnF;E%Q3bq_nXsee^i02EOhC8Q};X+GI%5eI)w{Y?na^~N_gJ|YfA}xhP>B35Fbx` z;G9Tz%(ADmgy~+v%^aVnuXuA3l=_UAtW2oi(-h-!+yqeemXg zG!~8jXe>3sVvC5hxylqT%7aNtoi(>GfGr*0V+1N}6eYM6AcD%9+~2GXRorX}iFkeb zq7lngn;bKvMiN|DShPZ`4lukH(rPyS;LV$Ikw{8)b`x7P-f|)~*pB1VtGUWt-})V_ zmdLALa6m!}0FWqD2Bq-#Xu-9TnetHz4<>OTy_-7K=>@`G>-%XHsC{n;W9kh`SC6j~ z8;>0cpDR!w-DQbcc;yJwIs>XtgjPUsG{lh{P(;ENiZ7K=97q=2Ez%>sk(TOFd(WLtp(O%*3};DM$7_N8cG zgK*s2c*o9bMaFYByd$48D5hwh@5cJFFm&90lq|(_<4VfVr=5{9G^^Xf+@$3EDm~IU z$V`-;l={xM{5rt1z(>{~YA{fEy0EWvpbxmt{dh}c|B-Day@A=Ss#yIM3T$*J0RKqoO1w2Kon~cileBf6|pY1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="basis_transcoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["K"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["O"];addOnInit(Module["asm"]["L"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>2)+i])}return array}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _setTempRet0($i){setTempRet0($i|0)}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"t":__embind_finalize_value_object,"I":__embind_register_bool,"x":__embind_register_class,"w":__embind_register_class_constructor,"d":__embind_register_class_function,"k":__embind_register_constant,"H":__embind_register_emval,"n":__embind_register_enum,"a":__embind_register_enum_value,"A":__embind_register_float,"i":__embind_register_function,"j":__embind_register_integer,"h":__embind_register_memory_view,"B":__embind_register_std_string,"v":__embind_register_std_wstring,"u":__embind_register_value_object,"c":__embind_register_value_object_field,"J":__embind_register_void,"m":__emval_as,"s":__emval_call_void_method,"b":__emval_decref,"y":__emval_get_global,"p":__emval_get_method_caller,"r":__emval_get_module_property,"e":__emval_get_property,"g":__emval_incref,"q":__emval_new,"f":__emval_new_cstring,"l":__emval_run_destructors,"o":_abort,"E":_emscripten_memcpy_big,"F":_emscripten_resize_heap,"G":_fd_close,"C":_fd_seek,"z":_fd_write,"D":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["L"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["M"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["N"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["P"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["Q"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["R"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); + + + return BASIS.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = BASIS; +else if (typeof define === 'function' && define['amd']) + define([], function() { return BASIS; }); +else if (typeof exports === 'object') + exports["BASIS"] = BASIS; diff --git a/public/assets/cesium/ThirdParty/Workers/package.json b/public/assets/cesium/ThirdParty/Workers/package.json new file mode 100644 index 0000000..0292b99 --- /dev/null +++ b/public/assets/cesium/ThirdParty/Workers/package.json @@ -0,0 +1 @@ +{"type":"commonjs"} \ No newline at end of file diff --git a/public/assets/cesium/ThirdParty/Workers/pako_deflate.min.js b/public/assets/cesium/ThirdParty/Workers/pako_deflate.min.js new file mode 100644 index 0000000..b560534 --- /dev/null +++ b/public/assets/cesium/ThirdParty/Workers/pako_deflate.min.js @@ -0,0 +1,2 @@ +/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){let e=t.length;for(;--e>=0;)t[e]=0}const a=256,s=286,n=30,r=15,i=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),o=new Array(576);e(o);const d=new Array(60);e(d);const u=new Array(512);e(u);const f=new Array(256);e(f);const c=new Array(29);e(c);const p=new Array(n);function g(t,e,a,s,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=s,this.max_length=n,this.has_stree=t&&t.length}let w,m,b;function y(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(p);const v=t=>t<256?u[t]:u[256+(t>>>7)],z=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},k=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{k(t,a[2*e],a[2*e+1])},A=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},E=(t,e,a)=>{const s=new Array(16);let n,i,_=0;for(n=1;n<=r;n++)_=_+a[n-1]<<1,s[n]=_;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=A(s[e]++,e))}},Z=t=>{let e;for(e=0;e{t.bi_valid>8?z(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},R=(t,e,a,s)=>{const n=2*e,r=2*a;return t[n]{const s=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n{let n,r,l,h,o=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+o++],n+=(255&t.pending_buf[t.sym_buf+o++])<<8,r=t.pending_buf[t.sym_buf+o++],0===n?x(t,r,e):(l=f[r],x(t,l+a+1,e),h=i[l],0!==h&&(r-=c[l],k(t,r,h)),n--,l=v(n),x(t,l,s),h=_[l],0!==h&&(n-=p[l],k(t,n,h)))}while(o{const a=e.dyn_tree,s=e.stat_desc.static_tree,n=e.stat_desc.has_stree,i=e.stat_desc.elems;let _,l,h,o=-1;for(t.heap_len=0,t.heap_max=573,_=0;_>1;_>=1;_--)S(t,a,_);h=i;do{_=t.heap[1],t.heap[1]=t.heap[t.heap_len--],S(t,a,1),l=t.heap[1],t.heap[--t.heap_max]=_,t.heap[--t.heap_max]=l,a[2*h]=a[2*_]+a[2*l],t.depth[h]=(t.depth[_]>=t.depth[l]?t.depth[_]:t.depth[l])+1,a[2*_+1]=a[2*l+1]=h,t.heap[1]=h++,S(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,s=e.max_code,n=e.stat_desc.static_tree,i=e.stat_desc.has_stree,_=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,h=e.stat_desc.max_length;let o,d,u,f,c,p,g=0;for(f=0;f<=r;f++)t.bl_count[f]=0;for(a[2*t.heap[t.heap_max]+1]=0,o=t.heap_max+1;o<573;o++)d=t.heap[o],f=a[2*a[2*d+1]+1]+1,f>h&&(f=h,g++),a[2*d+1]=f,d>s||(t.bl_count[f]++,c=0,d>=l&&(c=_[d-l]),p=a[2*d],t.opt_len+=p*(f+c),i&&(t.static_len+=p*(n[2*d+1]+c)));if(0!==g){do{for(f=h-1;0===t.bl_count[f];)f--;t.bl_count[f]--,t.bl_count[f+1]+=2,t.bl_count[h]--,g-=2}while(g>0);for(f=h;0!==f;f--)for(d=t.bl_count[f];0!==d;)u=t.heap[--o],u>s||(a[2*u+1]!==f&&(t.opt_len+=(f-a[2*u+1])*a[2*u],a[2*u+1]=f),d--)}})(t,e),E(a,o,t.bl_count)},F=(t,e,a)=>{let s,n,r=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),e[2*(a+1)+1]=65535,s=0;s<=a;s++)n=i,i=e[2*(s+1)+1],++_{let s,n,r=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),s=0;s<=a;s++)if(n=i,i=e[2*(s+1)+1],!(++_{k(t,0+(s?1:0),3),U(t),z(t,a),z(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var I=(t,e,s,n)=>{let r,i,_=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,s=4093624447;for(e=0;e<=31;e++,s>>>=1)if(1&s&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e{let e;for(F(t,t.dyn_ltree,t.l_desc.max_code),F(t,t.dyn_dtree,t.d_desc.max_code),L(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=s+5,s+4<=r&&-1!==e?N(t,e,s,n):4===t.strategy||i===r?(k(t,2+(n?1:0),3),T(t,o,d)):(k(t,4+(n?1:0),3),((t,e,a,s)=>{let n;for(k(t,e-257,5),k(t,a-1,5),k(t,s-4,4),n=0;n{D||((()=>{let t,e,a,h,y;const v=new Array(16);for(a=0,h=0;h<28;h++)for(c[h]=a,t=0;t<1<>=7;h(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=s,0===e?t.dyn_ltree[2*s]++:(t.matches++,e--,t.dyn_ltree[2*(f[s]+a+1)]++,t.dyn_dtree[2*v(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{k(t,2,3),x(t,256,o),(t=>{16===t.bi_valid?(z(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var B=(t,e,a,s)=>{let n=65535&t|0,r=t>>>16&65535|0,i=0;for(;0!==a;){i=a>2e3?2e3:a,a-=i;do{n=n+e[s++]|0,r=r+n|0}while(--i);n%=65521,r%=65521}return n|r<<16|0};const H=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var M=(t,e,a,s)=>{const n=H,r=s+a;t^=-1;for(let a=s;a>>8^n[255&(t^e[a])];return-1^t},P={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},j={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:K,_tr_stored_block:Y,_tr_flush_block:G,_tr_tally:X,_tr_align:W}=C,{Z_NO_FLUSH:q,Z_PARTIAL_FLUSH:J,Z_FULL_FLUSH:Q,Z_FINISH:V,Z_BLOCK:$,Z_OK:tt,Z_STREAM_END:et,Z_STREAM_ERROR:at,Z_DATA_ERROR:st,Z_BUF_ERROR:nt,Z_DEFAULT_COMPRESSION:rt,Z_FILTERED:it,Z_HUFFMAN_ONLY:_t,Z_RLE:lt,Z_FIXED:ht,Z_DEFAULT_STRATEGY:ot,Z_UNKNOWN:dt,Z_DEFLATED:ut}=j,ft=258,ct=262,pt=42,gt=113,wt=666,mt=(t,e)=>(t.msg=P[e],e),bt=t=>2*t-(t>4?9:0),yt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},vt=t=>{let e,a,s,n=t.w_size;e=t.hash_size,s=e;do{a=t.head[--s],t.head[s]=a>=n?a-n:0}while(--e);e=n,s=e;do{a=t.prev[--s],t.prev[s]=a>=n?a-n:0}while(--e)};let zt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},xt=(t,e)=>{G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,kt(t.strm)},At=(t,e)=>{t.pending_buf[t.pending++]=e},Et=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Zt=(t,e,a,s)=>{let n=t.avail_in;return n>s&&(n=s),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=B(t.adler,e,n,a):2===t.state.wrap&&(t.adler=M(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},Ut=(t,e)=>{let a,s,n=t.max_chain_length,r=t.strstart,i=t.prev_length,_=t.nice_match;const l=t.strstart>t.w_size-ct?t.strstart-(t.w_size-ct):0,h=t.window,o=t.w_mask,d=t.prev,u=t.strstart+ft;let f=h[r+i-1],c=h[r+i];t.prev_length>=t.good_match&&(n>>=2),_>t.lookahead&&(_=t.lookahead);do{if(a=e,h[a+i]===c&&h[a+i-1]===f&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&ri){if(t.match_start=e,i=s,s>=_)break;f=h[r+i-1],c=h[r+i]}}}while((e=d[e&o])>l&&0!=--n);return i<=t.lookahead?i:t.lookahead},Rt=t=>{const e=t.w_size;let a,s,n;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-ct)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),vt(t),s+=e),0===t.strm.avail_in)break;if(a=Zt(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=a,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=zt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=zt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead{let a,s,n,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,i=0,_=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_outs+t.strm.avail_in&&(a=s+t.strm.avail_in),a>n&&(a=n),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,kt(t.strm),s&&(s>a&&(s=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,a-=s),a&&(Zt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===i);return _-=t.strm.avail_in,_&&(_>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=_&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-_,t.strm.next_in),t.strstart),t.strstart+=_,t.insert+=_>t.w_size-t.insert?t.w_size-t.insert:_),t.block_start=t.strstart),t.high_watern&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Zt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water>3,n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n,r=n>t.w_size?t.w_size:n,s=t.strstart-t.block_start,(s>=r||(s||e===V)&&e!==q&&0===t.strm.avail_in&&s<=n)&&(a=s>n?n:s,i=e===V&&0===t.strm.avail_in&&a===s?1:0,Y(t,t.block_start,a,i),t.block_start+=a,kt(t.strm)),i?3:1)},Tt=(t,e)=>{let a,s;for(;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ct&&(t.match_length=Ut(t,a)),t.match_length>=3)if(s=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=zt(t,t.ins_h,t.window[t.strstart+1]);else s=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2},Lt=(t,e)=>{let a,s,n;for(;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,s=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(xt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=X(t,0,t.window[t.strstart-1]),s&&xt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2};function Ft(t,e,a,s,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=s,this.func=n}const Ot=[new Ft(0,0,0,0,St),new Ft(4,4,8,4,Tt),new Ft(4,5,16,8,Tt),new Ft(4,6,32,32,Tt),new Ft(4,4,16,16,Lt),new Ft(8,16,32,32,Lt),new Ft(8,16,128,128,Lt),new Ft(8,32,128,256,Lt),new Ft(32,128,258,1024,Lt),new Ft(32,258,258,4096,Lt)];function Dt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ut,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),yt(this.dyn_ltree),yt(this.dyn_dtree),yt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),yt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),yt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Nt=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==pt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==gt&&e.status!==wt?1:0},It=t=>{if(Nt(t))return mt(t,at);t.total_in=t.total_out=0,t.data_type=dt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?pt:gt,t.adler=2===e.wrap?0:1,e.last_flush=-2,K(e),tt},Ct=t=>{const e=It(t);var a;return e===tt&&((a=t.state).window_size=2*a.w_size,yt(a.head),a.max_lazy_match=Ot[a.level].max_lazy,a.good_match=Ot[a.level].good_length,a.nice_match=Ot[a.level].nice_length,a.max_chain_length=Ot[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Bt=(t,e,a,s,n,r)=>{if(!t)return at;let i=1;if(e===rt&&(e=6),s<0?(i=0,s=-s):s>15&&(i=2,s-=16),n<1||n>9||a!==ut||s<8||s>15||e<0||e>9||r<0||r>ht||8===s&&1!==i)return mt(t,at);8===s&&(s=9);const _=new Dt;return t.state=_,_.strm=t,_.status=pt,_.wrap=i,_.gzhead=null,_.w_bits=s,_.w_size=1<<_.w_bits,_.w_mask=_.w_size-1,_.hash_bits=n+7,_.hash_size=1<<_.hash_bits,_.hash_mask=_.hash_size-1,_.hash_shift=~~((_.hash_bits+3-1)/3),_.window=new Uint8Array(2*_.w_size),_.head=new Uint16Array(_.hash_size),_.prev=new Uint16Array(_.w_size),_.lit_bufsize=1<Bt(t,e,ut,15,8,ot),deflateInit2:Bt,deflateReset:Ct,deflateResetKeep:It,deflateSetHeader:(t,e)=>Nt(t)||2!==t.state.wrap?at:(t.state.gzhead=e,tt),deflate:(t,e)=>{if(Nt(t)||e>$||e<0)return t?mt(t,at):at;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===wt&&e!==V)return mt(t,0===t.avail_out?nt:at);const s=a.last_flush;if(a.last_flush=e,0!==a.pending){if(kt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&bt(e)<=bt(s)&&e!==V)return mt(t,nt);if(a.status===wt&&0!==t.avail_in)return mt(t,nt);if(a.status===pt&&0===a.wrap&&(a.status=gt),a.status===pt){let e=ut+(a.w_bits-8<<4)<<8,s=-1;if(s=a.strategy>=_t||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=s<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Et(a,e),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=M(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,3),a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){let e=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+s>a.pending_buf_size;){let n=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+n),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=M(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=n,kt(t),0!==a.pending)return a.last_flush=-1,tt;e=0,s-=n}let n=new Uint8Array(a.gzhead.extra);a.pending_buf.set(n.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>e&&(t.adler=M(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),kt(t),0!==a.pending)return a.last_flush=-1,tt;s=0}e=a.gzindexs&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),kt(t),0!==a.pending)return a.last_flush=-1,tt;s=0}e=a.gzindexs&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(kt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==wt){let s=0===a.level?St(a,e):a.strategy===_t?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Rt(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===lt?((t,e)=>{let a,s,n,r;const i=t.window;for(;;){if(t.lookahead<=ft){if(Rt(t),t.lookahead<=ft&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,s=i[n],s===i[++n]&&s===i[++n]&&s===i[++n])){r=t.strstart+ft;do{}while(s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2})(a,e):Ot[a.level].func(a,e);if(3!==s&&4!==s||(a.status=wt),1===s||3===s)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===s&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(yt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),kt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),kt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:t=>{if(Nt(t))return at;const e=t.state.status;return t.state=null,e===gt?mt(t,st):tt},deflateSetDictionary:(t,e)=>{let a=e.length;if(Nt(t))return at;const s=t.state,n=s.wrap;if(2===n||1===n&&s.status!==pt||s.lookahead)return at;if(1===n&&(t.adler=B(t.adler,e,a,0)),s.wrap=0,a>=s.w_size){0===n&&(yt(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(a-s.w_size,a),0),e=t,a=s.w_size}const r=t.avail_in,i=t.next_in,_=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Rt(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{s.ins_h=zt(s,s.ins_h,s.window[t+3-1]),s.prev[t&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=t,t++}while(--e);s.strstart=t,s.lookahead=2,Rt(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=i,t.input=_,t.avail_in=r,s.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};const Mt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Pt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Mt(a,e)&&(t[e]=a[e])}}return t},jt=t=>{let e=0;for(let a=0,s=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Yt[254]=Yt[254]=1;var Gt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,s,n,r,i=t.length,_=0;for(n=0;n>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e};var Xt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Wt=Object.prototype.toString,{Z_NO_FLUSH:qt,Z_SYNC_FLUSH:Jt,Z_FULL_FLUSH:Qt,Z_FINISH:Vt,Z_OK:$t,Z_STREAM_END:te,Z_DEFAULT_COMPRESSION:ee,Z_DEFAULT_STRATEGY:ae,Z_DEFLATED:se}=j;function ne(t){this.options=Pt({level:ee,method:se,chunkSize:16384,windowBits:15,memLevel:8,strategy:ae},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Xt,this.strm.avail_out=0;let a=Ht.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==$t)throw new Error(P[a]);if(e.header&&Ht.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Gt(e.dictionary):"[object ArrayBuffer]"===Wt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Ht.deflateSetDictionary(this.strm,t),a!==$t)throw new Error(P[a]);this._dict_set=!0}}function re(t,e){const a=new ne(e);if(a.push(t,!0),a.err)throw a.msg||P[a.err];return a.result}ne.prototype.push=function(t,e){const a=this.strm,s=this.options.chunkSize;let n,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?Vt:qt,"string"==typeof t?a.input=Gt(t):"[object ArrayBuffer]"===Wt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(s),a.next_out=0,a.avail_out=s),(r===Jt||r===Qt)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Ht.deflate(a,r),n===te)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Ht.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===$t;if(0!==a.avail_out){if(r>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},ne.prototype.onData=function(t){this.chunks.push(t)},ne.prototype.onEnd=function(t){t===$t&&(this.result=jt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ie=ne,_e=re,le=function(t,e){return(e=e||{}).raw=!0,re(t,e)},he=function(t,e){return(e=e||{}).gzip=!0,re(t,e)},oe=j,de={Deflate:ie,deflate:_e,deflateRaw:le,gzip:he,constants:oe};t.Deflate=ie,t.constants=oe,t.default=de,t.deflate=_e,t.deflateRaw=le,t.gzip=he,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/public/assets/cesium/ThirdParty/Workers/pako_inflate.min.js b/public/assets/cesium/ThirdParty/Workers/pako_inflate.min.js new file mode 100644 index 0000000..587fbdd --- /dev/null +++ b/public/assets/cesium/ThirdParty/Workers/pako_inflate.min.js @@ -0,0 +1,2 @@ +/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){"use strict";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{a=a+t[n++]|0,r=r+a|0}while(--o);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,o=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};const a=16209;var r=function(e,t){let i,n,r,o,s,l,d,f,c,h,u,w,b,m,k,_,g,p,v,x,y,E,R,A;const Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,d=Z.wsize,f=Z.whave,c=Z.wnext,h=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<>>24,u>>>=p,w-=p,p=g>>>16&255,0===p)A[r++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=b[(65535&g)+(u&(1<>>=p,w-=p),w<15&&(u+=R[i++]<>>24,u>>>=p,w-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=m[(65535&g)+(u&(1<l){e.msg="invalid distance too far back",Z.mode=a;break e}if(u>>>=p,w-=p,p=r-o,x>p){if(p=x-p,p>f&&Z.sane){e.msg="invalid distance too far back",Z.mode=a;break e}if(y=0,E=h,0===c){if(y+=d-p,p2;)A[r++]=E[y++],A[r++]=E[y++],A[r++]=E[y++],v-=3;v&&(A[r++]=E[y++],v>1&&(A[r++]=E[y++]))}else{y=r-x;do{A[r++]=A[y++],A[r++]=A[y++],A[r++]=A[y++],v-=3}while(v>2);v&&(A[r++]=A[y++],v>1&&(A[r++]=A[y++]))}break}}break}}while(i>3,i-=v,w-=v<<3,u&=(1<{const u=h.bits;let w,b,m,k,_,g,p=0,v=0,x=0,y=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=null;const U=new Uint16Array(16),D=new Uint16Array(16);let I,B,N,C=null;for(p=0;p<=o;p++)U[p]=0;for(v=0;v=1&&0===U[y];y--);if(E>y&&(E=y),0===y)return a[r++]=20971520,a[r++]=20971520,h.bits=1,0;for(x=1;x0&&(0===e||1!==y))return-1;for(D[1]=0,p=1;p852||2===e&&S>592)return 1;for(;;){I=p-A,c[v]+1=g?(B=C[c[v]-g],N=O[c[v]-g]):(B=96,N=0),w=1<>A)+b]=I<<24|B<<16|N|0}while(0!==b);for(w=1<>=1;if(0!==w?(T&=w-1,T+=w):T=0,v++,0==--U[p]){if(p===y)break;p=t[i+c[v]]}if(p>E&&(T&k)!==m){for(0===A&&(A=E),_+=x,R=p-A,Z=1<852||2===e&&S>592)return 1;m=T&k,a[m]=E<<24|R<<16|_-r|0}}return 0!==T&&(a[_+T]=p-A<<24|64<<16|0),h.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:u,Z_BLOCK:w,Z_TREES:b,Z_OK:m,Z_STREAM_END:k,Z_NEED_DICT:_,Z_STREAM_ERROR:g,Z_DATA_ERROR:p,Z_MEM_ERROR:v,Z_BUF_ERROR:x,Z_DEFLATED:y}=h,E=16180,R=16190,A=16191,Z=16192,S=16194,T=16199,O=16200,U=16206,D=16209,I=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function B(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const N=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.mode16211?1:0},C=e=>{if(N(e))return g;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,m},z=e=>{if(N(e))return g;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},F=(e,t)=>{let i;if(N(e))return g;const n=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?g:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,z(e))},L=(e,t)=>{if(!e)return g;const i=new B;e.state=i,i.strm=e,i.window=null,i.mode=E;const n=F(e,t);return n!==m&&(e.state=null),n};let M,H,j=!0;const K=e=>{if(j){M=new Int32Array(512),H=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(c(1,e.lens,0,288,M,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;c(2,e.lens,0,32,H,0,e.work,{bits:5}),j=!1}e.lencode=M,e.lenbits=9,e.distcode=H,e.distbits=5},P=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveL(e,15),inflateInit2:L,inflate:(e,i)=>{let a,o,s,l,d,f,h,B,C,z,F,L,M,H,j,Y,G,X,W,q,J,Q,V=0;const $=new Uint8Array(4);let ee,te;const ie=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(N(e)||!e.output||!e.input&&0!==e.avail_in)return g;a=e.state,a.mode===A&&(a.mode=Z),d=e.next_out,s=e.output,h=e.avail_out,l=e.next_in,o=e.input,f=e.avail_in,B=a.hold,C=a.bits,z=f,F=h,Q=m;e:for(;;)switch(a.mode){case E:if(0===a.wrap){a.mode=Z;break}for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>>8&255,a.check=n(a.check,$,2,0),B=0,C=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&B)<<8)+(B>>8))%31){e.msg="incorrect header check",a.mode=D;break}if((15&B)!==y){e.msg="unknown compression method",a.mode=D;break}if(B>>>=4,C-=4,J=8+(15&B),0===a.wbits&&(a.wbits=J),J>15||J>a.wbits){e.msg="invalid window size",a.mode=D;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&($[0]=255&B,$[1]=B>>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0,a.mode=16182;case 16182:for(;C<32;){if(0===f)break e;f--,B+=o[l++]<>>8&255,$[2]=B>>>16&255,$[3]=B>>>24&255,a.check=n(a.check,$,4,0)),B=0,C=0,a.mode=16183;case 16183:for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>8),512&a.flags&&4&a.wrap&&($[0]=255&B,$[1]=B>>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0,a.mode=16184;case 16184:if(1024&a.flags){for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&(L=a.length,L>f&&(L=f),L&&(a.head&&(J=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(o.subarray(l,l+L),J)),512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),f-=L,l+=L,a.length-=L),a.length))break e;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===f)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.name+=String.fromCharCode(J))}while(J&&L>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=A;break;case 16189:for(;C<32;){if(0===f)break e;f--,B+=o[l++]<>>=7&C,C-=7&C,a.mode=U;break}for(;C<3;){if(0===f)break e;f--,B+=o[l++]<>>=1,C-=1,3&B){case 0:a.mode=16193;break;case 1:if(K(a),a.mode=T,i===b){B>>>=2,C-=2;break e}break;case 2:a.mode=16196;break;case 3:e.msg="invalid block type",a.mode=D}B>>>=2,C-=2;break;case 16193:for(B>>>=7&C,C-=7&C;C<32;){if(0===f)break e;f--,B+=o[l++]<>>16^65535)){e.msg="invalid stored block lengths",a.mode=D;break}if(a.length=65535&B,B=0,C=0,a.mode=S,i===b)break e;case S:a.mode=16195;case 16195:if(L=a.length,L){if(L>f&&(L=f),L>h&&(L=h),0===L)break e;s.set(o.subarray(l,l+L),d),f-=L,l+=L,h-=L,d+=L,a.length-=L;break}a.mode=A;break;case 16196:for(;C<14;){if(0===f)break e;f--,B+=o[l++]<>>=5,C-=5,a.ndist=1+(31&B),B>>>=5,C-=5,a.ncode=4+(15&B),B>>>=4,C-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=D;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,C-=3}for(;a.have<19;)a.lens[ie[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,ee={bits:a.lenbits},Q=c(0,a.lens,0,19,a.lencode,0,a.work,ee),a.lenbits=ee.bits,Q){e.msg="invalid code lengths set",a.mode=D;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=j,C-=j,a.lens[a.have++]=G;else{if(16===G){for(te=j+2;C>>=j,C-=j,0===a.have){e.msg="invalid bit length repeat",a.mode=D;break}J=a.lens[a.have-1],L=3+(3&B),B>>>=2,C-=2}else if(17===G){for(te=j+3;C>>=j,C-=j,J=0,L=3+(7&B),B>>>=3,C-=3}else{for(te=j+7;C>>=j,C-=j,J=0,L=11+(127&B),B>>>=7,C-=7}if(a.have+L>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=D;break}for(;L--;)a.lens[a.have++]=J}}if(a.mode===D)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=D;break}if(a.lenbits=9,ee={bits:a.lenbits},Q=c(1,a.lens,0,a.nlen,a.lencode,0,a.work,ee),a.lenbits=ee.bits,Q){e.msg="invalid literal/lengths set",a.mode=D;break}if(a.distbits=6,a.distcode=a.distdyn,ee={bits:a.distbits},Q=c(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,ee),a.distbits=ee.bits,Q){e.msg="invalid distances set",a.mode=D;break}if(a.mode=T,i===b)break e;case T:a.mode=O;case O:if(f>=6&&h>=258){e.next_out=d,e.avail_out=h,e.next_in=l,e.avail_in=f,a.hold=B,a.bits=C,r(e,F),d=e.next_out,s=e.output,h=e.avail_out,l=e.next_in,o=e.input,f=e.avail_in,B=a.hold,C=a.bits,a.mode===A&&(a.back=-1);break}for(a.back=0;V=a.lencode[B&(1<>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>X)],j=V>>>24,Y=V>>>16&255,G=65535&V,!(X+j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=X,C-=X,a.back+=X}if(B>>>=j,C-=j,a.back+=j,a.length=G,0===Y){a.mode=16205;break}if(32&Y){a.back=-1,a.mode=A;break}if(64&Y){e.msg="invalid literal/length code",a.mode=D;break}a.extra=15&Y,a.mode=16201;case 16201:if(a.extra){for(te=a.extra;C>>=a.extra,C-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;V=a.distcode[B&(1<>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>X)],j=V>>>24,Y=V>>>16&255,G=65535&V,!(X+j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=X,C-=X,a.back+=X}if(B>>>=j,C-=j,a.back+=j,64&Y){e.msg="invalid distance code",a.mode=D;break}a.offset=G,a.extra=15&Y,a.mode=16203;case 16203:if(a.extra){for(te=a.extra;C>>=a.extra,C-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=D;break}a.mode=16204;case 16204:if(0===h)break e;if(L=F-h,a.offset>L){if(L=a.offset-L,L>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=D;break}L>a.wnext?(L-=a.wnext,M=a.wsize-L):M=a.wnext-L,L>a.length&&(L=a.length),H=a.window}else H=s,M=d-a.offset,L=a.length;L>h&&(L=h),h-=L,a.length-=L;do{s[d++]=H[M++]}while(--L);0===a.length&&(a.mode=O);break;case 16205:if(0===h)break e;s[d++]=a.length,h--,a.mode=O;break;case U:if(a.wrap){for(;C<32;){if(0===f)break e;f--,B|=o[l++]<{if(N(e))return g;let t=e.state;return t.window&&(t.window=null),e.state=null,m},inflateGetHeader:(e,t)=>{if(N(e))return g;const i=e.state;return 0==(2&i.wrap)?g:(i.head=t,t.done=!1,m)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,o;return N(e)?g:(a=e.state,0!==a.wrap&&a.mode!==R?g:a.mode===R&&(r=1,r=t(r,i,n,0),r!==a.check)?p:(o=P(e,i,n,n),o?(a.mode=16210,v):(a.havedict=1,m)))},inflateInfo:"pako inflate (from Nodeca project)"};const G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var X=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const t in i)G(i,t)&&(e[t]=i[t])}}return e},W=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;J[254]=J[254]=1;var Q=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,a,r,o=e.length,s=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},V=(e,t)=>{const i=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,a;const r=new Array(2*i);for(a=0,n=0;n4)r[a++]=65533,n+=o-1;else{for(t&=2===o?31:3===o?15:7;o>1&&n1?r[a++]=65533:t<65536?r[a++]=t:(t-=65536,r[a++]=55296|t>>10&1023,r[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&q)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+J[e[i]]>t?i:t},ee={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var te=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};var ie=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const ne=Object.prototype.toString,{Z_NO_FLUSH:ae,Z_FINISH:re,Z_OK:oe,Z_STREAM_END:se,Z_NEED_DICT:le,Z_STREAM_ERROR:de,Z_DATA_ERROR:fe,Z_MEM_ERROR:ce}=h;function he(e){this.options=X({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new te,this.strm.avail_out=0;let i=Y.inflateInit2(this.strm,t.windowBits);if(i!==oe)throw new Error(ee[i]);if(this.header=new ie,Y.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Q(t.dictionary):"[object ArrayBuffer]"===ne.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Y.inflateSetDictionary(this.strm,t.dictionary),i!==oe)))throw new Error(ee[i])}function ue(e,t){const i=new he(t);if(i.push(e),i.err)throw i.msg||ee[i.err];return i.result}he.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,o,s;if(this.ended)return!1;for(o=t===~~t?t:!0===t?re:ae,"[object ArrayBuffer]"===ne.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=Y.inflate(i,o),r===le&&a&&(r=Y.inflateSetDictionary(i,a),r===oe?r=Y.inflate(i,o):r===fe&&(r=le));i.avail_in>0&&r===se&&i.state.wrap>0&&0!==e[i.next_in];)Y.inflateReset(i),r=Y.inflate(i,o);switch(r){case de:case fe:case le:case ce:return this.onEnd(r),this.ended=!0,!1}if(s=i.avail_out,i.next_out&&(0===i.avail_out||r===se))if("string"===this.options.to){let e=$(i.output,i.next_out),t=i.next_out-e,a=V(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==oe||0!==s){if(r===se)return r=Y.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},he.prototype.onData=function(e){this.chunks.push(e)},he.prototype.onEnd=function(e){e===oe&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=W(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var we=he,be=ue,me=function(e,t){return(t=t||{}).raw=!0,ue(e,t)},ke=ue,_e=h,ge={Inflate:we,inflate:be,inflateRaw:me,ungzip:ke,constants:_e};e.Inflate=we,e.constants=_e,e.default=ge,e.inflate=be,e.inflateRaw=me,e.ungzip=ke,Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/public/assets/cesium/ThirdParty/Workers/z-worker-pako.js b/public/assets/cesium/ThirdParty/Workers/z-worker-pako.js new file mode 100644 index 0000000..3ea6d6e --- /dev/null +++ b/public/assets/cesium/ThirdParty/Workers/z-worker-pako.js @@ -0,0 +1 @@ +!function(){"use strict";const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:o,Uint32Array:i,Int32Array:c,Map:l,DataView:u,Promise:h,TextEncoder:f,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:m,DecompressionStream:_}=self,b=void 0,S="undefined",v="function";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new u(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const I={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=I.getPartial(n);return 32===s?e.concat(t):I._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+I.getPartial(n)},clamp(e,t){if(32*e.length0&&t&&(e[n-1]=I.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=I.getPartial(r);return s.push(I.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},A={bytes:{fromBits(e){const t=I.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const o=new i(n);let c=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(o.subarray(16*c,16*(c+1))),c+=1;return n.splice(0,16*c),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=I.concat(t,[I.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let o=r[0],i=r[1],c=r[2],l=r[3],u=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,o)+n._f(e,i,c,l)+u+a[e]+n._key[s.floor(e/20)]|0;u=l,l=c,c=n._S(30,i),i=o,o=t}r[0]=r[0]+o|0,r[1]=r[1]+i|0,r[2]=r[2]+c|0,r[3]=r[3]+l|0,r[4]=r[4]+u|0}},R={getRandomValues(e){const t=new i(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;anew H.hmacSha1(A.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const a=1+(s>>5)<<2;let o,i,c,l,h;const f=new ArrayBuffer(a),p=new u(f);let d=0;const g=I;for(t=A.bytes.toBits(t),h=1;(a||1)>d;h++){for(o=i=e.encrypt(g.concat(t,[h])),c=1;n>c;c++)for(i=e.encrypt(i),l=0;ld&&cr&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},P=typeof p!=S&&typeof p.getRandomValues==v,B="Invalid password",K="Invalid signature",T="zipjs-abort-check-password";function V(e){return P?p.getRandomValues(e):R.getRandomValues(e)}const x=16,E={name:"PBKDF2"},U=t.assign({hash:{name:"HMAC"}},E),W=t.assign({iterations:1e3,hash:{name:"SHA-1"}},E),M=["deriveBits"],N=[8,12,16],O=[16,24,32],L=10,F=[0,0,0,0],j=typeof p!=S,G=j&&p.subtle,X=j&&typeof G!=S,J=A.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let o,i,c,l=1;if(4!==a&&6!==a&&8!==a)throw new r("invalid aes key size");for(t._key=[i=e.slice(0),c=[]],o=a;4*a+28>o;o++){let e=i[o-1];(o%a==0||8===a&&o%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],o%a==0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),i[o]=i[o-a]^e}for(let e=0;o;e++,o--){const t=i[3&e?o:o-4];c[e]=4>=o||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let o,i,c,l;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let u=o=0;!n[u];u^=i||1,o=a[o]||1){let a=o^o<<1^o<<2^o<<3^o<<4;a=a>>8^255&a^99,n[u]=a,s[a]=u,l=r[c=r[i=r[u]]];let h=16843009*l^65537*c^257*i^16843008*u,f=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][u]=f=f<<24^f>>>8,t[n][a]=h=h<<24^h>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r("invalid aes block size");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],o=this._tables[t],i=o[0],c=o[1],l=o[2],u=o[3],h=o[4];let f,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],m=e[t?1:3]^n[3],_=4;for(let e=0;s>e;e++)f=i[g>>>24]^c[w>>16&255]^l[y>>8&255]^u[255&m]^n[_],p=i[w>>>24]^c[y>>16&255]^l[m>>8&255]^u[255&g]^n[_+1],d=i[y>>>24]^c[m>>16&255]^l[g>>8&255]^u[255&w]^n[_+2],m=i[m>>>24]^c[g>>16&255]^l[w>>8&255]^u[255&y]^n[_+3],_+=4,g=f,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=h[g>>>24]<<24^h[w>>16&255]<<16^h[y>>8&255]<<8^h[255&m]^n[_++],f=g,g=w,w=y,y=m,m=f;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=I.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return I.clamp(t,r)}},Z=H.hmacSha1;let $=j&&X&&typeof G.importKey==v,ee=j&&X&&typeof G.deriveBits==v;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:o,checkPasswordOnly:i}){super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:o-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:o,resolveReady:c,ready:l}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,ie(s,0,N[t])),o=ie(s,N[t]);if(a[0]!=o[0]||a[1]!=o[1])throw new r(B)})(n,o,s,ie(e,0,N[o]+2)),e=ie(e,N[o]+2),i?t.error(new r(T)):c()):await l;const u=new a(e.length-L-(e.length-L)%x);t.enqueue(se(n,e,u,0,L,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:o,ready:i}=this;if(s&&n){await i;const c=ie(o,0,o.length-L),l=ie(o,o.length-L);let u=new a;if(c.length){const e=le(J,c);s.update(e);const t=n.update(e);u=ce(J,t)}if(t){const e=ie(ce(J,s.digest()),0,L);for(let t=0;L>t;t++)if(e[t]!=l[t])throw new r(K)}e.enqueue(u)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:o,ready:i}=n;let c=new a;s?(c=await(async(e,t,n)=>{const s=V(new a(N[t]));return oe(s,await re(e,t,n,s))})(n,r,s),o()):await i;const l=new a(c.length+e.length-e.length%x);l.set(c,0),t.enqueue(se(n,e,l,c.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:o}=this;if(n&&t){await o;let i=new a;if(s.length){const e=t.update(le(J,s));n.update(e),i=ce(J,e)}r.signature=ce(J,n.digest()).slice(0,L),e.enqueue(oe(i,r.signature))}}}),r=this}}function se(e,t,n,s,r,o){const{ctr:i,hmac:c,pending:l}=e,u=t.length-r;let h;for(l.length&&(t=oe(l,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,u-u%x)),h=0;u-x>=h;h+=x){const e=le(J,ie(t,h,h+x));o&&c.update(e);const r=i.update(e);o||c.update(r),n.set(ce(J,r),h+s)}return e.pending=ie(t,h),n}async function re(n,s,r,o){n.password=null;const i=await(async(e,t,n,s,r)=>{if(!$)return H.importKey(t);try{return await G.importKey("raw",t,n,!1,r)}catch(e){return $=!1,H.importKey(t)}})(0,r,U,0,M),c=await(async(e,t,n)=>{if(!ee)return H.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,H.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:o},W),i,8*(2*O[s]+2)),l=new a(c),u=le(J,ie(l,0,O[s])),h=le(J,ie(l,O[s],2*O[s])),f=ie(l,2*O[s]);return t.assign(n,{keys:{key:u,authentication:h,passwordVerification:f},ctr:new Y(new Q(u),e.from(F)),hmac:new Z(h)}),f}function ae(e,t){return t===b?(e=>{if(typeof f==S){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function me(e){return 4294967295&e}const _e="deflate-raw";class be extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:o,zipCrypto:i,signed:c,level:l}=e,h=this;let f,p,d=ve(super.readable);a&&!i||!c||(f=new C,d=De(d,f)),r&&(d=ze(d,o,{level:l,chunkSize:t},s,n)),a&&(i?d=De(d,new he(e)):(p=new ne(e),d=De(d,p))),ke(h,d,(()=>{let e;a&&!i&&(e=p.signature),a&&!i||!c||(e=new u(f.value.buffer).getUint32(0)),h.signature=e}))}}class Se extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:o,signed:i,signature:c,compressed:l,useCompressionStream:h}=e;let f,p,d=ve(super.readable);o&&(a?d=De(d,new ue(e)):(p=new te(e),d=De(d,p))),l&&(d=ze(d,h,{chunkSize:t},s,n)),o&&!a||!i||(f=new C,d=De(d,f)),ke(this,d,(()=>{if((!o||a)&&i){const e=new u(f.value.buffer);if(c!=e.getUint32(0,!1))throw new r(K)}}))}}function ve(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,"readable",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(_e,n))}catch(s){if(!t)return e;try{e=De(e,new r(_e,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce="data",Ie="close";class Ae extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith("deflate")?a=be:r.startsWith("inflate")&&(a=Se);let o=0,i=0;const c=new a(e,n),l=super.readable,u=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:i})}}),h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){const{signature:e}=c;t.assign(s,{signature:e,outputSize:o,inputSize:i})}});t.defineProperty(s,"readable",{get:()=>l.pipeThrough(u).pipeThrough(c).pipeThrough(h)})}}class qe extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Re=new l,He=new l;let Pe,Be=0,Ke=!0;async function Te(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Ke?importScripts.apply(b,s):await Ve(s)}catch(e){Ke=!1,await Ve(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},o=e.readable||new w({async pull(e){const t=new h((e=>Re.set(Be,e)));xe({type:"pull",messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),i=e.writable||new y({async write(e){let t;const s=new h((e=>t=e));He.set(Be,t),xe({type:Ce,value:e,messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER,await s}},a),c=new Ae(t,r);Pe=new AbortController;const{signal:l}=Pe;await o.pipeThrough(c).pipeThrough(new qe(r.chunkSize)).pipeTo(i,{signal:l,preventClose:!0,preventAbort:!0}),await i.getWriter().close();const{signature:u,inputSize:f,outputSize:p}=c;xe({type:Ie,result:{signature:u,inputSize:f,outputSize:p}})}catch(e){Ee(e)}}async function Ve(e){for(const t of e)await import(t)}function xe(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r("Unknown error")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}function Ue(e,n,s){return class{constructor(r){const o=this;var i,c;i=r,c="level",(typeof t.hasOwn===v?t.hasOwn(i,c):i.hasOwnProperty(c))&&r.level===b&&delete r.level,o.codec=new e(t.assign({},n,r)),s(o.codec,(e=>{if(o.pendingData){const t=o.pendingData;o.pendingData=new a(t.length+e.length);const{pendingData:n}=o;n.set(t,0),n.set(e,t.length)}else o.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}addEventListener("message",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if("start"==t&&Te(e),t==Ce){const e=Re.get(n);Re.delete(n),e({value:new a(s),done:r})}if("ack"==t){const e=He.get(n);He.delete(n),e()}t==Ie&&Pe.abort()}catch(e){Ee(e)}})),self.initCodec=()=>{const{Deflate:e,Inflate:t}=((e,t={},n)=>({Deflate:Ue(e.Deflate,t.deflate,n),Inflate:Ue(e.Inflate,t.inflate,n)}))(pako,{deflate:{raw:!0},inflate:{raw:!0}},((e,t)=>e.onData=t));self.Deflate=e,self.Inflate=t}}(); diff --git a/public/assets/cesium/ThirdParty/basis_transcoder.wasm b/public/assets/cesium/ThirdParty/basis_transcoder.wasm new file mode 100644 index 0000000000000000000000000000000000000000..71328587dfdfaa13f30072ca2bd8d658938ab415 GIT binary patch literal 500839 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

    p={AyovsD$zv@J>UY{B&w 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%0AE8r7Pddr!xOz@H2nYEofc!|_CNZ^S$^2Sx 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ⅅ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%0A|_Zcaav1H>G(>H(G9d3Np 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

    &3_)eib&RyWihF>+lN6ZX?BF+fXrAx@5^(COSMg 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 literal 0 HcmV?d00001 diff --git a/public/assets/cesium/ThirdParty/draco_decoder.wasm b/public/assets/cesium/ThirdParty/draco_decoder.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e5a5e06eb51fb061a94a9682cc7e338038fae25c GIT binary patch literal 285747 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 z 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 jI`!dwO0TC5&f<9B@5#l>$GA4>>> 3) { + case 1: { + message.stringId = reader.fixed32(); + break; + } + case 2: { + message.stringValue = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("stringId")) + throw $util.ProtocolError("missing required 'stringId'", { instance: message }); + if (!message.hasOwnProperty("stringValue")) + throw $util.ProtocolError("missing required 'stringValue'", { instance: message }); + return message; + }; + + StringEntryProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.stringId)) + return "stringId: integer expected"; + if (!$util.isString(message.stringValue)) + return "stringValue: string expected"; + return null; + }; + + StringEntryProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.StringEntryProto) + return object; + var message = new $root.keyhole.dbroot.StringEntryProto(); + if (object.stringId != null) + message.stringId = object.stringId >>> 0; + if (object.stringValue != null) + message.stringValue = String(object.stringValue); + return message; + }; + + StringEntryProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.stringId = 0; + object.stringValue = ""; + } + if (message.stringId != null && message.hasOwnProperty("stringId")) + object.stringId = message.stringId; + if (message.stringValue != null && message.hasOwnProperty("stringValue")) + object.stringValue = message.stringValue; + return object; + }; + + StringEntryProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + StringEntryProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.StringEntryProto"; + }; + + return StringEntryProto; + })(); + + dbroot.StringIdOrValueProto = (function() { + + function StringIdOrValueProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + StringIdOrValueProto.prototype.stringId = 0; + StringIdOrValueProto.prototype.value = ""; + + StringIdOrValueProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.StringIdOrValueProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.stringId = reader.fixed32(); + break; + } + case 2: { + message.value = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + StringIdOrValueProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stringId != null && message.hasOwnProperty("stringId")) + if (!$util.isInteger(message.stringId)) + return "stringId: integer expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (!$util.isString(message.value)) + return "value: string expected"; + return null; + }; + + StringIdOrValueProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.StringIdOrValueProto) + return object; + var message = new $root.keyhole.dbroot.StringIdOrValueProto(); + if (object.stringId != null) + message.stringId = object.stringId >>> 0; + if (object.value != null) + message.value = String(object.value); + return message; + }; + + StringIdOrValueProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.stringId = 0; + object.value = ""; + } + if (message.stringId != null && message.hasOwnProperty("stringId")) + object.stringId = message.stringId; + if (message.value != null && message.hasOwnProperty("value")) + object.value = message.value; + return object; + }; + + StringIdOrValueProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + StringIdOrValueProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.StringIdOrValueProto"; + }; + + return StringIdOrValueProto; + })(); + + dbroot.PlanetModelProto = (function() { + + function PlanetModelProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + PlanetModelProto.prototype.radius = 6378.137; + PlanetModelProto.prototype.flattening = 0.00335281066474748; + PlanetModelProto.prototype.elevationBias = 0; + PlanetModelProto.prototype.negativeAltitudeExponentBias = 0; + PlanetModelProto.prototype.compressedNegativeAltitudeThreshold = 0; + + PlanetModelProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.PlanetModelProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.radius = reader.double(); + break; + } + case 2: { + message.flattening = reader.double(); + break; + } + case 4: { + message.elevationBias = reader.double(); + break; + } + case 5: { + message.negativeAltitudeExponentBias = reader.int32(); + break; + } + case 6: { + message.compressedNegativeAltitudeThreshold = reader.double(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + PlanetModelProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.radius != null && message.hasOwnProperty("radius")) + if (typeof message.radius !== "number") + return "radius: number expected"; + if (message.flattening != null && message.hasOwnProperty("flattening")) + if (typeof message.flattening !== "number") + return "flattening: number expected"; + if (message.elevationBias != null && message.hasOwnProperty("elevationBias")) + if (typeof message.elevationBias !== "number") + return "elevationBias: number expected"; + if (message.negativeAltitudeExponentBias != null && message.hasOwnProperty("negativeAltitudeExponentBias")) + if (!$util.isInteger(message.negativeAltitudeExponentBias)) + return "negativeAltitudeExponentBias: integer expected"; + if (message.compressedNegativeAltitudeThreshold != null && message.hasOwnProperty("compressedNegativeAltitudeThreshold")) + if (typeof message.compressedNegativeAltitudeThreshold !== "number") + return "compressedNegativeAltitudeThreshold: number expected"; + return null; + }; + + PlanetModelProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.PlanetModelProto) + return object; + var message = new $root.keyhole.dbroot.PlanetModelProto(); + if (object.radius != null) + message.radius = Number(object.radius); + if (object.flattening != null) + message.flattening = Number(object.flattening); + if (object.elevationBias != null) + message.elevationBias = Number(object.elevationBias); + if (object.negativeAltitudeExponentBias != null) + message.negativeAltitudeExponentBias = object.negativeAltitudeExponentBias | 0; + if (object.compressedNegativeAltitudeThreshold != null) + message.compressedNegativeAltitudeThreshold = Number(object.compressedNegativeAltitudeThreshold); + return message; + }; + + PlanetModelProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.radius = 6378.137; + object.flattening = 0.00335281066474748; + object.elevationBias = 0; + object.negativeAltitudeExponentBias = 0; + object.compressedNegativeAltitudeThreshold = 0; + } + if (message.radius != null && message.hasOwnProperty("radius")) + object.radius = options.json && !isFinite(message.radius) ? String(message.radius) : message.radius; + if (message.flattening != null && message.hasOwnProperty("flattening")) + object.flattening = options.json && !isFinite(message.flattening) ? String(message.flattening) : message.flattening; + if (message.elevationBias != null && message.hasOwnProperty("elevationBias")) + object.elevationBias = options.json && !isFinite(message.elevationBias) ? String(message.elevationBias) : message.elevationBias; + if (message.negativeAltitudeExponentBias != null && message.hasOwnProperty("negativeAltitudeExponentBias")) + object.negativeAltitudeExponentBias = message.negativeAltitudeExponentBias; + if (message.compressedNegativeAltitudeThreshold != null && message.hasOwnProperty("compressedNegativeAltitudeThreshold")) + object.compressedNegativeAltitudeThreshold = options.json && !isFinite(message.compressedNegativeAltitudeThreshold) ? String(message.compressedNegativeAltitudeThreshold) : message.compressedNegativeAltitudeThreshold; + return object; + }; + + PlanetModelProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PlanetModelProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.PlanetModelProto"; + }; + + return PlanetModelProto; + })(); + + dbroot.ProviderInfoProto = (function() { + + function ProviderInfoProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + ProviderInfoProto.prototype.providerId = 0; + ProviderInfoProto.prototype.copyrightString = null; + ProviderInfoProto.prototype.verticalPixelOffset = -1; + + ProviderInfoProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ProviderInfoProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.providerId = reader.int32(); + break; + } + case 2: { + message.copyrightString = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.verticalPixelOffset = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("providerId")) + throw $util.ProtocolError("missing required 'providerId'", { instance: message }); + return message; + }; + + ProviderInfoProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.providerId)) + return "providerId: integer expected"; + if (message.copyrightString != null && message.hasOwnProperty("copyrightString")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.copyrightString); + if (error) + return "copyrightString." + error; + } + if (message.verticalPixelOffset != null && message.hasOwnProperty("verticalPixelOffset")) + if (!$util.isInteger(message.verticalPixelOffset)) + return "verticalPixelOffset: integer expected"; + return null; + }; + + ProviderInfoProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ProviderInfoProto) + return object; + var message = new $root.keyhole.dbroot.ProviderInfoProto(); + if (object.providerId != null) + message.providerId = object.providerId | 0; + if (object.copyrightString != null) { + if (typeof object.copyrightString !== "object") + throw TypeError(".keyhole.dbroot.ProviderInfoProto.copyrightString: object expected"); + message.copyrightString = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.copyrightString); + } + if (object.verticalPixelOffset != null) + message.verticalPixelOffset = object.verticalPixelOffset | 0; + return message; + }; + + ProviderInfoProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.providerId = 0; + object.copyrightString = null; + object.verticalPixelOffset = -1; + } + if (message.providerId != null && message.hasOwnProperty("providerId")) + object.providerId = message.providerId; + if (message.copyrightString != null && message.hasOwnProperty("copyrightString")) + object.copyrightString = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.copyrightString, options); + if (message.verticalPixelOffset != null && message.hasOwnProperty("verticalPixelOffset")) + object.verticalPixelOffset = message.verticalPixelOffset; + return object; + }; + + ProviderInfoProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ProviderInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ProviderInfoProto"; + }; + + return ProviderInfoProto; + })(); + + dbroot.PopUpProto = (function() { + + function PopUpProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + PopUpProto.prototype.isBalloonStyle = false; + PopUpProto.prototype.text = null; + PopUpProto.prototype.backgroundColorAbgr = 4294967295; + PopUpProto.prototype.textColorAbgr = 4278190080; + + PopUpProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.PopUpProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.isBalloonStyle = reader.bool(); + break; + } + case 2: { + message.text = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.backgroundColorAbgr = reader.fixed32(); + break; + } + case 4: { + message.textColorAbgr = reader.fixed32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + PopUpProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.isBalloonStyle != null && message.hasOwnProperty("isBalloonStyle")) + if (typeof message.isBalloonStyle !== "boolean") + return "isBalloonStyle: boolean expected"; + if (message.text != null && message.hasOwnProperty("text")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.text); + if (error) + return "text." + error; + } + if (message.backgroundColorAbgr != null && message.hasOwnProperty("backgroundColorAbgr")) + if (!$util.isInteger(message.backgroundColorAbgr)) + return "backgroundColorAbgr: integer expected"; + if (message.textColorAbgr != null && message.hasOwnProperty("textColorAbgr")) + if (!$util.isInteger(message.textColorAbgr)) + return "textColorAbgr: integer expected"; + return null; + }; + + PopUpProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.PopUpProto) + return object; + var message = new $root.keyhole.dbroot.PopUpProto(); + if (object.isBalloonStyle != null) + message.isBalloonStyle = Boolean(object.isBalloonStyle); + if (object.text != null) { + if (typeof object.text !== "object") + throw TypeError(".keyhole.dbroot.PopUpProto.text: object expected"); + message.text = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.text); + } + if (object.backgroundColorAbgr != null) + message.backgroundColorAbgr = object.backgroundColorAbgr >>> 0; + if (object.textColorAbgr != null) + message.textColorAbgr = object.textColorAbgr >>> 0; + return message; + }; + + PopUpProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.isBalloonStyle = false; + object.text = null; + object.backgroundColorAbgr = 4294967295; + object.textColorAbgr = 4278190080; + } + if (message.isBalloonStyle != null && message.hasOwnProperty("isBalloonStyle")) + object.isBalloonStyle = message.isBalloonStyle; + if (message.text != null && message.hasOwnProperty("text")) + object.text = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.text, options); + if (message.backgroundColorAbgr != null && message.hasOwnProperty("backgroundColorAbgr")) + object.backgroundColorAbgr = message.backgroundColorAbgr; + if (message.textColorAbgr != null && message.hasOwnProperty("textColorAbgr")) + object.textColorAbgr = message.textColorAbgr; + return object; + }; + + PopUpProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PopUpProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.PopUpProto"; + }; + + return PopUpProto; + })(); + + dbroot.StyleAttributeProto = (function() { + + function StyleAttributeProto(properties) { + this.drawFlag = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + StyleAttributeProto.prototype.styleId = ""; + StyleAttributeProto.prototype.providerId = 0; + StyleAttributeProto.prototype.polyColorAbgr = 4294967295; + StyleAttributeProto.prototype.lineColorAbgr = 4294967295; + StyleAttributeProto.prototype.lineWidth = 1; + StyleAttributeProto.prototype.labelColorAbgr = 4294967295; + StyleAttributeProto.prototype.labelScale = 1; + StyleAttributeProto.prototype.placemarkIconColorAbgr = 4294967295; + StyleAttributeProto.prototype.placemarkIconScale = 1; + StyleAttributeProto.prototype.placemarkIconPath = null; + StyleAttributeProto.prototype.placemarkIconX = 0; + StyleAttributeProto.prototype.placemarkIconY = 0; + StyleAttributeProto.prototype.placemarkIconWidth = 32; + StyleAttributeProto.prototype.placemarkIconHeight = 32; + StyleAttributeProto.prototype.popUp = null; + StyleAttributeProto.prototype.drawFlag = $util.emptyArray; + + StyleAttributeProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.StyleAttributeProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.styleId = reader.string(); + break; + } + case 3: { + message.providerId = reader.int32(); + break; + } + case 4: { + message.polyColorAbgr = reader.fixed32(); + break; + } + case 5: { + message.lineColorAbgr = reader.fixed32(); + break; + } + case 6: { + message.lineWidth = reader.float(); + break; + } + case 7: { + message.labelColorAbgr = reader.fixed32(); + break; + } + case 8: { + message.labelScale = reader.float(); + break; + } + case 9: { + message.placemarkIconColorAbgr = reader.fixed32(); + break; + } + case 10: { + message.placemarkIconScale = reader.float(); + break; + } + case 11: { + message.placemarkIconPath = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 12: { + message.placemarkIconX = reader.int32(); + break; + } + case 13: { + message.placemarkIconY = reader.int32(); + break; + } + case 14: { + message.placemarkIconWidth = reader.int32(); + break; + } + case 15: { + message.placemarkIconHeight = reader.int32(); + break; + } + case 16: { + message.popUp = $root.keyhole.dbroot.PopUpProto.decode(reader, reader.uint32()); + break; + } + case 17: { + if (!(message.drawFlag && message.drawFlag.length)) + message.drawFlag = []; + message.drawFlag.push($root.keyhole.dbroot.DrawFlagProto.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("styleId")) + throw $util.ProtocolError("missing required 'styleId'", { instance: message }); + return message; + }; + + StyleAttributeProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.styleId)) + return "styleId: string expected"; + if (message.providerId != null && message.hasOwnProperty("providerId")) + if (!$util.isInteger(message.providerId)) + return "providerId: integer expected"; + if (message.polyColorAbgr != null && message.hasOwnProperty("polyColorAbgr")) + if (!$util.isInteger(message.polyColorAbgr)) + return "polyColorAbgr: integer expected"; + if (message.lineColorAbgr != null && message.hasOwnProperty("lineColorAbgr")) + if (!$util.isInteger(message.lineColorAbgr)) + return "lineColorAbgr: integer expected"; + if (message.lineWidth != null && message.hasOwnProperty("lineWidth")) + if (typeof message.lineWidth !== "number") + return "lineWidth: number expected"; + if (message.labelColorAbgr != null && message.hasOwnProperty("labelColorAbgr")) + if (!$util.isInteger(message.labelColorAbgr)) + return "labelColorAbgr: integer expected"; + if (message.labelScale != null && message.hasOwnProperty("labelScale")) + if (typeof message.labelScale !== "number") + return "labelScale: number expected"; + if (message.placemarkIconColorAbgr != null && message.hasOwnProperty("placemarkIconColorAbgr")) + if (!$util.isInteger(message.placemarkIconColorAbgr)) + return "placemarkIconColorAbgr: integer expected"; + if (message.placemarkIconScale != null && message.hasOwnProperty("placemarkIconScale")) + if (typeof message.placemarkIconScale !== "number") + return "placemarkIconScale: number expected"; + if (message.placemarkIconPath != null && message.hasOwnProperty("placemarkIconPath")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.placemarkIconPath); + if (error) + return "placemarkIconPath." + error; + } + if (message.placemarkIconX != null && message.hasOwnProperty("placemarkIconX")) + if (!$util.isInteger(message.placemarkIconX)) + return "placemarkIconX: integer expected"; + if (message.placemarkIconY != null && message.hasOwnProperty("placemarkIconY")) + if (!$util.isInteger(message.placemarkIconY)) + return "placemarkIconY: integer expected"; + if (message.placemarkIconWidth != null && message.hasOwnProperty("placemarkIconWidth")) + if (!$util.isInteger(message.placemarkIconWidth)) + return "placemarkIconWidth: integer expected"; + if (message.placemarkIconHeight != null && message.hasOwnProperty("placemarkIconHeight")) + if (!$util.isInteger(message.placemarkIconHeight)) + return "placemarkIconHeight: integer expected"; + if (message.popUp != null && message.hasOwnProperty("popUp")) { + var error = $root.keyhole.dbroot.PopUpProto.verify(message.popUp); + if (error) + return "popUp." + error; + } + if (message.drawFlag != null && message.hasOwnProperty("drawFlag")) { + if (!Array.isArray(message.drawFlag)) + return "drawFlag: array expected"; + for (var i = 0; i < message.drawFlag.length; ++i) { + var error = $root.keyhole.dbroot.DrawFlagProto.verify(message.drawFlag[i]); + if (error) + return "drawFlag." + error; + } + } + return null; + }; + + StyleAttributeProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.StyleAttributeProto) + return object; + var message = new $root.keyhole.dbroot.StyleAttributeProto(); + if (object.styleId != null) + message.styleId = String(object.styleId); + if (object.providerId != null) + message.providerId = object.providerId | 0; + if (object.polyColorAbgr != null) + message.polyColorAbgr = object.polyColorAbgr >>> 0; + if (object.lineColorAbgr != null) + message.lineColorAbgr = object.lineColorAbgr >>> 0; + if (object.lineWidth != null) + message.lineWidth = Number(object.lineWidth); + if (object.labelColorAbgr != null) + message.labelColorAbgr = object.labelColorAbgr >>> 0; + if (object.labelScale != null) + message.labelScale = Number(object.labelScale); + if (object.placemarkIconColorAbgr != null) + message.placemarkIconColorAbgr = object.placemarkIconColorAbgr >>> 0; + if (object.placemarkIconScale != null) + message.placemarkIconScale = Number(object.placemarkIconScale); + if (object.placemarkIconPath != null) { + if (typeof object.placemarkIconPath !== "object") + throw TypeError(".keyhole.dbroot.StyleAttributeProto.placemarkIconPath: object expected"); + message.placemarkIconPath = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.placemarkIconPath); + } + if (object.placemarkIconX != null) + message.placemarkIconX = object.placemarkIconX | 0; + if (object.placemarkIconY != null) + message.placemarkIconY = object.placemarkIconY | 0; + if (object.placemarkIconWidth != null) + message.placemarkIconWidth = object.placemarkIconWidth | 0; + if (object.placemarkIconHeight != null) + message.placemarkIconHeight = object.placemarkIconHeight | 0; + if (object.popUp != null) { + if (typeof object.popUp !== "object") + throw TypeError(".keyhole.dbroot.StyleAttributeProto.popUp: object expected"); + message.popUp = $root.keyhole.dbroot.PopUpProto.fromObject(object.popUp); + } + if (object.drawFlag) { + if (!Array.isArray(object.drawFlag)) + throw TypeError(".keyhole.dbroot.StyleAttributeProto.drawFlag: array expected"); + message.drawFlag = []; + for (var i = 0; i < object.drawFlag.length; ++i) { + if (typeof object.drawFlag[i] !== "object") + throw TypeError(".keyhole.dbroot.StyleAttributeProto.drawFlag: object expected"); + message.drawFlag[i] = $root.keyhole.dbroot.DrawFlagProto.fromObject(object.drawFlag[i]); + } + } + return message; + }; + + StyleAttributeProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.drawFlag = []; + if (options.defaults) { + object.styleId = ""; + object.providerId = 0; + object.polyColorAbgr = 4294967295; + object.lineColorAbgr = 4294967295; + object.lineWidth = 1; + object.labelColorAbgr = 4294967295; + object.labelScale = 1; + object.placemarkIconColorAbgr = 4294967295; + object.placemarkIconScale = 1; + object.placemarkIconPath = null; + object.placemarkIconX = 0; + object.placemarkIconY = 0; + object.placemarkIconWidth = 32; + object.placemarkIconHeight = 32; + object.popUp = null; + } + if (message.styleId != null && message.hasOwnProperty("styleId")) + object.styleId = message.styleId; + if (message.providerId != null && message.hasOwnProperty("providerId")) + object.providerId = message.providerId; + if (message.polyColorAbgr != null && message.hasOwnProperty("polyColorAbgr")) + object.polyColorAbgr = message.polyColorAbgr; + if (message.lineColorAbgr != null && message.hasOwnProperty("lineColorAbgr")) + object.lineColorAbgr = message.lineColorAbgr; + if (message.lineWidth != null && message.hasOwnProperty("lineWidth")) + object.lineWidth = options.json && !isFinite(message.lineWidth) ? String(message.lineWidth) : message.lineWidth; + if (message.labelColorAbgr != null && message.hasOwnProperty("labelColorAbgr")) + object.labelColorAbgr = message.labelColorAbgr; + if (message.labelScale != null && message.hasOwnProperty("labelScale")) + object.labelScale = options.json && !isFinite(message.labelScale) ? String(message.labelScale) : message.labelScale; + if (message.placemarkIconColorAbgr != null && message.hasOwnProperty("placemarkIconColorAbgr")) + object.placemarkIconColorAbgr = message.placemarkIconColorAbgr; + if (message.placemarkIconScale != null && message.hasOwnProperty("placemarkIconScale")) + object.placemarkIconScale = options.json && !isFinite(message.placemarkIconScale) ? String(message.placemarkIconScale) : message.placemarkIconScale; + if (message.placemarkIconPath != null && message.hasOwnProperty("placemarkIconPath")) + object.placemarkIconPath = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.placemarkIconPath, options); + if (message.placemarkIconX != null && message.hasOwnProperty("placemarkIconX")) + object.placemarkIconX = message.placemarkIconX; + if (message.placemarkIconY != null && message.hasOwnProperty("placemarkIconY")) + object.placemarkIconY = message.placemarkIconY; + if (message.placemarkIconWidth != null && message.hasOwnProperty("placemarkIconWidth")) + object.placemarkIconWidth = message.placemarkIconWidth; + if (message.placemarkIconHeight != null && message.hasOwnProperty("placemarkIconHeight")) + object.placemarkIconHeight = message.placemarkIconHeight; + if (message.popUp != null && message.hasOwnProperty("popUp")) + object.popUp = $root.keyhole.dbroot.PopUpProto.toObject(message.popUp, options); + if (message.drawFlag && message.drawFlag.length) { + object.drawFlag = []; + for (var j = 0; j < message.drawFlag.length; ++j) + object.drawFlag[j] = $root.keyhole.dbroot.DrawFlagProto.toObject(message.drawFlag[j], options); + } + return object; + }; + + StyleAttributeProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + StyleAttributeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.StyleAttributeProto"; + }; + + return StyleAttributeProto; + })(); + + dbroot.StyleMapProto = (function() { + + function StyleMapProto(properties) { + this.channelId = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + StyleMapProto.prototype.styleMapId = 0; + StyleMapProto.prototype.channelId = $util.emptyArray; + StyleMapProto.prototype.normalStyleAttribute = 0; + StyleMapProto.prototype.highlightStyleAttribute = 0; + + StyleMapProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.StyleMapProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.styleMapId = reader.int32(); + break; + } + case 2: { + if (!(message.channelId && message.channelId.length)) + message.channelId = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.channelId.push(reader.int32()); + } else + message.channelId.push(reader.int32()); + break; + } + case 3: { + message.normalStyleAttribute = reader.int32(); + break; + } + case 4: { + message.highlightStyleAttribute = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("styleMapId")) + throw $util.ProtocolError("missing required 'styleMapId'", { instance: message }); + return message; + }; + + StyleMapProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.styleMapId)) + return "styleMapId: integer expected"; + if (message.channelId != null && message.hasOwnProperty("channelId")) { + if (!Array.isArray(message.channelId)) + return "channelId: array expected"; + for (var i = 0; i < message.channelId.length; ++i) + if (!$util.isInteger(message.channelId[i])) + return "channelId: integer[] expected"; + } + if (message.normalStyleAttribute != null && message.hasOwnProperty("normalStyleAttribute")) + if (!$util.isInteger(message.normalStyleAttribute)) + return "normalStyleAttribute: integer expected"; + if (message.highlightStyleAttribute != null && message.hasOwnProperty("highlightStyleAttribute")) + if (!$util.isInteger(message.highlightStyleAttribute)) + return "highlightStyleAttribute: integer expected"; + return null; + }; + + StyleMapProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.StyleMapProto) + return object; + var message = new $root.keyhole.dbroot.StyleMapProto(); + if (object.styleMapId != null) + message.styleMapId = object.styleMapId | 0; + if (object.channelId) { + if (!Array.isArray(object.channelId)) + throw TypeError(".keyhole.dbroot.StyleMapProto.channelId: array expected"); + message.channelId = []; + for (var i = 0; i < object.channelId.length; ++i) + message.channelId[i] = object.channelId[i] | 0; + } + if (object.normalStyleAttribute != null) + message.normalStyleAttribute = object.normalStyleAttribute | 0; + if (object.highlightStyleAttribute != null) + message.highlightStyleAttribute = object.highlightStyleAttribute | 0; + return message; + }; + + StyleMapProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.channelId = []; + if (options.defaults) { + object.styleMapId = 0; + object.normalStyleAttribute = 0; + object.highlightStyleAttribute = 0; + } + if (message.styleMapId != null && message.hasOwnProperty("styleMapId")) + object.styleMapId = message.styleMapId; + if (message.channelId && message.channelId.length) { + object.channelId = []; + for (var j = 0; j < message.channelId.length; ++j) + object.channelId[j] = message.channelId[j]; + } + if (message.normalStyleAttribute != null && message.hasOwnProperty("normalStyleAttribute")) + object.normalStyleAttribute = message.normalStyleAttribute; + if (message.highlightStyleAttribute != null && message.hasOwnProperty("highlightStyleAttribute")) + object.highlightStyleAttribute = message.highlightStyleAttribute; + return object; + }; + + StyleMapProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + StyleMapProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.StyleMapProto"; + }; + + return StyleMapProto; + })(); + + dbroot.ZoomRangeProto = (function() { + + function ZoomRangeProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + ZoomRangeProto.prototype.minZoom = 0; + ZoomRangeProto.prototype.maxZoom = 0; + + ZoomRangeProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ZoomRangeProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.minZoom = reader.int32(); + break; + } + case 2: { + message.maxZoom = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("minZoom")) + throw $util.ProtocolError("missing required 'minZoom'", { instance: message }); + if (!message.hasOwnProperty("maxZoom")) + throw $util.ProtocolError("missing required 'maxZoom'", { instance: message }); + return message; + }; + + ZoomRangeProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.minZoom)) + return "minZoom: integer expected"; + if (!$util.isInteger(message.maxZoom)) + return "maxZoom: integer expected"; + return null; + }; + + ZoomRangeProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ZoomRangeProto) + return object; + var message = new $root.keyhole.dbroot.ZoomRangeProto(); + if (object.minZoom != null) + message.minZoom = object.minZoom | 0; + if (object.maxZoom != null) + message.maxZoom = object.maxZoom | 0; + return message; + }; + + ZoomRangeProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.minZoom = 0; + object.maxZoom = 0; + } + if (message.minZoom != null && message.hasOwnProperty("minZoom")) + object.minZoom = message.minZoom; + if (message.maxZoom != null && message.hasOwnProperty("maxZoom")) + object.maxZoom = message.maxZoom; + return object; + }; + + ZoomRangeProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ZoomRangeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ZoomRangeProto"; + }; + + return ZoomRangeProto; + })(); + + dbroot.DrawFlagProto = (function() { + + function DrawFlagProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + DrawFlagProto.prototype.drawFlagType = 1; + + DrawFlagProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.DrawFlagProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.drawFlagType = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("drawFlagType")) + throw $util.ProtocolError("missing required 'drawFlagType'", { instance: message }); + return message; + }; + + DrawFlagProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + switch (message.drawFlagType) { + default: + return "drawFlagType: enum value expected"; + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + return null; + }; + + DrawFlagProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.DrawFlagProto) + return object; + var message = new $root.keyhole.dbroot.DrawFlagProto(); + switch (object.drawFlagType) { + case "TYPE_FILL_ONLY": + case 1: + message.drawFlagType = 1; + break; + case "TYPE_OUTLINE_ONLY": + case 2: + message.drawFlagType = 2; + break; + case "TYPE_FILL_AND_OUTLINE": + case 3: + message.drawFlagType = 3; + break; + case "TYPE_ANTIALIASING": + case 4: + message.drawFlagType = 4; + break; + case "TYPE_CENTER_LABEL": + case 5: + message.drawFlagType = 5; + break; + } + return message; + }; + + DrawFlagProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.drawFlagType = options.enums === String ? "TYPE_FILL_ONLY" : 1; + if (message.drawFlagType != null && message.hasOwnProperty("drawFlagType")) + object.drawFlagType = options.enums === String ? $root.keyhole.dbroot.DrawFlagProto.DrawFlagType[message.drawFlagType] : message.drawFlagType; + return object; + }; + + DrawFlagProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DrawFlagProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.DrawFlagProto"; + }; + + DrawFlagProto.DrawFlagType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "TYPE_FILL_ONLY"] = 1; + values[valuesById[2] = "TYPE_OUTLINE_ONLY"] = 2; + values[valuesById[3] = "TYPE_FILL_AND_OUTLINE"] = 3; + values[valuesById[4] = "TYPE_ANTIALIASING"] = 4; + values[valuesById[5] = "TYPE_CENTER_LABEL"] = 5; + return values; + })(); + + return DrawFlagProto; + })(); + + dbroot.LayerProto = (function() { + + function LayerProto(properties) { + this.zoomRange = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + LayerProto.prototype.zoomRange = $util.emptyArray; + LayerProto.prototype.preserveTextLevel = 30; + LayerProto.prototype.lodBeginTransition = false; + LayerProto.prototype.lodEndTransition = false; + + LayerProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.LayerProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (!(message.zoomRange && message.zoomRange.length)) + message.zoomRange = []; + message.zoomRange.push($root.keyhole.dbroot.ZoomRangeProto.decode(reader, reader.uint32())); + break; + } + case 2: { + message.preserveTextLevel = reader.int32(); + break; + } + case 4: { + message.lodBeginTransition = reader.bool(); + break; + } + case 5: { + message.lodEndTransition = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + LayerProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.zoomRange != null && message.hasOwnProperty("zoomRange")) { + if (!Array.isArray(message.zoomRange)) + return "zoomRange: array expected"; + for (var i = 0; i < message.zoomRange.length; ++i) { + var error = $root.keyhole.dbroot.ZoomRangeProto.verify(message.zoomRange[i]); + if (error) + return "zoomRange." + error; + } + } + if (message.preserveTextLevel != null && message.hasOwnProperty("preserveTextLevel")) + if (!$util.isInteger(message.preserveTextLevel)) + return "preserveTextLevel: integer expected"; + if (message.lodBeginTransition != null && message.hasOwnProperty("lodBeginTransition")) + if (typeof message.lodBeginTransition !== "boolean") + return "lodBeginTransition: boolean expected"; + if (message.lodEndTransition != null && message.hasOwnProperty("lodEndTransition")) + if (typeof message.lodEndTransition !== "boolean") + return "lodEndTransition: boolean expected"; + return null; + }; + + LayerProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.LayerProto) + return object; + var message = new $root.keyhole.dbroot.LayerProto(); + if (object.zoomRange) { + if (!Array.isArray(object.zoomRange)) + throw TypeError(".keyhole.dbroot.LayerProto.zoomRange: array expected"); + message.zoomRange = []; + for (var i = 0; i < object.zoomRange.length; ++i) { + if (typeof object.zoomRange[i] !== "object") + throw TypeError(".keyhole.dbroot.LayerProto.zoomRange: object expected"); + message.zoomRange[i] = $root.keyhole.dbroot.ZoomRangeProto.fromObject(object.zoomRange[i]); + } + } + if (object.preserveTextLevel != null) + message.preserveTextLevel = object.preserveTextLevel | 0; + if (object.lodBeginTransition != null) + message.lodBeginTransition = Boolean(object.lodBeginTransition); + if (object.lodEndTransition != null) + message.lodEndTransition = Boolean(object.lodEndTransition); + return message; + }; + + LayerProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.zoomRange = []; + if (options.defaults) { + object.preserveTextLevel = 30; + object.lodBeginTransition = false; + object.lodEndTransition = false; + } + if (message.zoomRange && message.zoomRange.length) { + object.zoomRange = []; + for (var j = 0; j < message.zoomRange.length; ++j) + object.zoomRange[j] = $root.keyhole.dbroot.ZoomRangeProto.toObject(message.zoomRange[j], options); + } + if (message.preserveTextLevel != null && message.hasOwnProperty("preserveTextLevel")) + object.preserveTextLevel = message.preserveTextLevel; + if (message.lodBeginTransition != null && message.hasOwnProperty("lodBeginTransition")) + object.lodBeginTransition = message.lodBeginTransition; + if (message.lodEndTransition != null && message.hasOwnProperty("lodEndTransition")) + object.lodEndTransition = message.lodEndTransition; + return object; + }; + + LayerProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + LayerProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.LayerProto"; + }; + + return LayerProto; + })(); + + dbroot.FolderProto = (function() { + + function FolderProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + FolderProto.prototype.isExpandable = true; + + FolderProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.FolderProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.isExpandable = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + FolderProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.isExpandable != null && message.hasOwnProperty("isExpandable")) + if (typeof message.isExpandable !== "boolean") + return "isExpandable: boolean expected"; + return null; + }; + + FolderProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.FolderProto) + return object; + var message = new $root.keyhole.dbroot.FolderProto(); + if (object.isExpandable != null) + message.isExpandable = Boolean(object.isExpandable); + return message; + }; + + FolderProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.isExpandable = true; + if (message.isExpandable != null && message.hasOwnProperty("isExpandable")) + object.isExpandable = message.isExpandable; + return object; + }; + + FolderProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + FolderProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.FolderProto"; + }; + + return FolderProto; + })(); + + dbroot.RequirementProto = (function() { + + function RequirementProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + RequirementProto.prototype.requiredVram = ""; + RequirementProto.prototype.requiredClientVer = ""; + RequirementProto.prototype.probability = ""; + RequirementProto.prototype.requiredUserAgent = ""; + RequirementProto.prototype.requiredClientCapabilities = ""; + + RequirementProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.RequirementProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 3: { + message.requiredVram = reader.string(); + break; + } + case 4: { + message.requiredClientVer = reader.string(); + break; + } + case 5: { + message.probability = reader.string(); + break; + } + case 6: { + message.requiredUserAgent = reader.string(); + break; + } + case 7: { + message.requiredClientCapabilities = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + RequirementProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.requiredVram != null && message.hasOwnProperty("requiredVram")) + if (!$util.isString(message.requiredVram)) + return "requiredVram: string expected"; + if (message.requiredClientVer != null && message.hasOwnProperty("requiredClientVer")) + if (!$util.isString(message.requiredClientVer)) + return "requiredClientVer: string expected"; + if (message.probability != null && message.hasOwnProperty("probability")) + if (!$util.isString(message.probability)) + return "probability: string expected"; + if (message.requiredUserAgent != null && message.hasOwnProperty("requiredUserAgent")) + if (!$util.isString(message.requiredUserAgent)) + return "requiredUserAgent: string expected"; + if (message.requiredClientCapabilities != null && message.hasOwnProperty("requiredClientCapabilities")) + if (!$util.isString(message.requiredClientCapabilities)) + return "requiredClientCapabilities: string expected"; + return null; + }; + + RequirementProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.RequirementProto) + return object; + var message = new $root.keyhole.dbroot.RequirementProto(); + if (object.requiredVram != null) + message.requiredVram = String(object.requiredVram); + if (object.requiredClientVer != null) + message.requiredClientVer = String(object.requiredClientVer); + if (object.probability != null) + message.probability = String(object.probability); + if (object.requiredUserAgent != null) + message.requiredUserAgent = String(object.requiredUserAgent); + if (object.requiredClientCapabilities != null) + message.requiredClientCapabilities = String(object.requiredClientCapabilities); + return message; + }; + + RequirementProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.requiredVram = ""; + object.requiredClientVer = ""; + object.probability = ""; + object.requiredUserAgent = ""; + object.requiredClientCapabilities = ""; + } + if (message.requiredVram != null && message.hasOwnProperty("requiredVram")) + object.requiredVram = message.requiredVram; + if (message.requiredClientVer != null && message.hasOwnProperty("requiredClientVer")) + object.requiredClientVer = message.requiredClientVer; + if (message.probability != null && message.hasOwnProperty("probability")) + object.probability = message.probability; + if (message.requiredUserAgent != null && message.hasOwnProperty("requiredUserAgent")) + object.requiredUserAgent = message.requiredUserAgent; + if (message.requiredClientCapabilities != null && message.hasOwnProperty("requiredClientCapabilities")) + object.requiredClientCapabilities = message.requiredClientCapabilities; + return object; + }; + + RequirementProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + RequirementProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.RequirementProto"; + }; + + return RequirementProto; + })(); + + dbroot.LookAtProto = (function() { + + function LookAtProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + LookAtProto.prototype.longitude = 0; + LookAtProto.prototype.latitude = 0; + LookAtProto.prototype.range = 0; + LookAtProto.prototype.tilt = 0; + LookAtProto.prototype.heading = 0; + + LookAtProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.LookAtProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.longitude = reader.float(); + break; + } + case 2: { + message.latitude = reader.float(); + break; + } + case 3: { + message.range = reader.float(); + break; + } + case 4: { + message.tilt = reader.float(); + break; + } + case 5: { + message.heading = reader.float(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("longitude")) + throw $util.ProtocolError("missing required 'longitude'", { instance: message }); + if (!message.hasOwnProperty("latitude")) + throw $util.ProtocolError("missing required 'latitude'", { instance: message }); + return message; + }; + + LookAtProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (typeof message.longitude !== "number") + return "longitude: number expected"; + if (typeof message.latitude !== "number") + return "latitude: number expected"; + if (message.range != null && message.hasOwnProperty("range")) + if (typeof message.range !== "number") + return "range: number expected"; + if (message.tilt != null && message.hasOwnProperty("tilt")) + if (typeof message.tilt !== "number") + return "tilt: number expected"; + if (message.heading != null && message.hasOwnProperty("heading")) + if (typeof message.heading !== "number") + return "heading: number expected"; + return null; + }; + + LookAtProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.LookAtProto) + return object; + var message = new $root.keyhole.dbroot.LookAtProto(); + if (object.longitude != null) + message.longitude = Number(object.longitude); + if (object.latitude != null) + message.latitude = Number(object.latitude); + if (object.range != null) + message.range = Number(object.range); + if (object.tilt != null) + message.tilt = Number(object.tilt); + if (object.heading != null) + message.heading = Number(object.heading); + return message; + }; + + LookAtProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.longitude = 0; + object.latitude = 0; + object.range = 0; + object.tilt = 0; + object.heading = 0; + } + if (message.longitude != null && message.hasOwnProperty("longitude")) + object.longitude = options.json && !isFinite(message.longitude) ? String(message.longitude) : message.longitude; + if (message.latitude != null && message.hasOwnProperty("latitude")) + object.latitude = options.json && !isFinite(message.latitude) ? String(message.latitude) : message.latitude; + if (message.range != null && message.hasOwnProperty("range")) + object.range = options.json && !isFinite(message.range) ? String(message.range) : message.range; + if (message.tilt != null && message.hasOwnProperty("tilt")) + object.tilt = options.json && !isFinite(message.tilt) ? String(message.tilt) : message.tilt; + if (message.heading != null && message.hasOwnProperty("heading")) + object.heading = options.json && !isFinite(message.heading) ? String(message.heading) : message.heading; + return object; + }; + + LookAtProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + LookAtProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.LookAtProto"; + }; + + return LookAtProto; + })(); + + dbroot.NestedFeatureProto = (function() { + + function NestedFeatureProto(properties) { + this.children = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + NestedFeatureProto.prototype.featureType = 1; + NestedFeatureProto.prototype.kmlUrl = null; + NestedFeatureProto.prototype.databaseUrl = ""; + NestedFeatureProto.prototype.layer = null; + NestedFeatureProto.prototype.folder = null; + NestedFeatureProto.prototype.requirement = null; + NestedFeatureProto.prototype.channelId = 0; + NestedFeatureProto.prototype.displayName = null; + NestedFeatureProto.prototype.isVisible = true; + NestedFeatureProto.prototype.isEnabled = true; + NestedFeatureProto.prototype.isChecked = false; + NestedFeatureProto.prototype.layerMenuIconPath = "icons/773_l.png"; + NestedFeatureProto.prototype.description = null; + NestedFeatureProto.prototype.lookAt = null; + NestedFeatureProto.prototype.assetUuid = ""; + NestedFeatureProto.prototype.isSaveLocked = true; + NestedFeatureProto.prototype.children = $util.emptyArray; + NestedFeatureProto.prototype.clientConfigScriptName = ""; + NestedFeatureProto.prototype.dioramaDataChannelBase = -1; + NestedFeatureProto.prototype.replicaDataChannelBase = -1; + + NestedFeatureProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.NestedFeatureProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.featureType = reader.int32(); + break; + } + case 2: { + message.kmlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 21: { + message.databaseUrl = reader.string(); + break; + } + case 3: { + message.layer = $root.keyhole.dbroot.LayerProto.decode(reader, reader.uint32()); + break; + } + case 4: { + message.folder = $root.keyhole.dbroot.FolderProto.decode(reader, reader.uint32()); + break; + } + case 5: { + message.requirement = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + case 6: { + message.channelId = reader.int32(); + break; + } + case 7: { + message.displayName = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 8: { + message.isVisible = reader.bool(); + break; + } + case 9: { + message.isEnabled = reader.bool(); + break; + } + case 10: { + message.isChecked = reader.bool(); + break; + } + case 11: { + message.layerMenuIconPath = reader.string(); + break; + } + case 12: { + message.description = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 13: { + message.lookAt = $root.keyhole.dbroot.LookAtProto.decode(reader, reader.uint32()); + break; + } + case 15: { + message.assetUuid = reader.string(); + break; + } + case 16: { + message.isSaveLocked = reader.bool(); + break; + } + case 17: { + if (!(message.children && message.children.length)) + message.children = []; + message.children.push($root.keyhole.dbroot.NestedFeatureProto.decode(reader, reader.uint32())); + break; + } + case 18: { + message.clientConfigScriptName = reader.string(); + break; + } + case 19: { + message.dioramaDataChannelBase = reader.int32(); + break; + } + case 20: { + message.replicaDataChannelBase = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("channelId")) + throw $util.ProtocolError("missing required 'channelId'", { instance: message }); + return message; + }; + + NestedFeatureProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.featureType != null && message.hasOwnProperty("featureType")) + switch (message.featureType) { + default: + return "featureType: enum value expected"; + case 1: + case 2: + case 3: + case 4: + break; + } + if (message.kmlUrl != null && message.hasOwnProperty("kmlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlUrl); + if (error) + return "kmlUrl." + error; + } + if (message.databaseUrl != null && message.hasOwnProperty("databaseUrl")) + if (!$util.isString(message.databaseUrl)) + return "databaseUrl: string expected"; + if (message.layer != null && message.hasOwnProperty("layer")) { + var error = $root.keyhole.dbroot.LayerProto.verify(message.layer); + if (error) + return "layer." + error; + } + if (message.folder != null && message.hasOwnProperty("folder")) { + var error = $root.keyhole.dbroot.FolderProto.verify(message.folder); + if (error) + return "folder." + error; + } + if (message.requirement != null && message.hasOwnProperty("requirement")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirement); + if (error) + return "requirement." + error; + } + if (!$util.isInteger(message.channelId)) + return "channelId: integer expected"; + if (message.displayName != null && message.hasOwnProperty("displayName")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.displayName); + if (error) + return "displayName." + error; + } + if (message.isVisible != null && message.hasOwnProperty("isVisible")) + if (typeof message.isVisible !== "boolean") + return "isVisible: boolean expected"; + if (message.isEnabled != null && message.hasOwnProperty("isEnabled")) + if (typeof message.isEnabled !== "boolean") + return "isEnabled: boolean expected"; + if (message.isChecked != null && message.hasOwnProperty("isChecked")) + if (typeof message.isChecked !== "boolean") + return "isChecked: boolean expected"; + if (message.layerMenuIconPath != null && message.hasOwnProperty("layerMenuIconPath")) + if (!$util.isString(message.layerMenuIconPath)) + return "layerMenuIconPath: string expected"; + if (message.description != null && message.hasOwnProperty("description")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.description); + if (error) + return "description." + error; + } + if (message.lookAt != null && message.hasOwnProperty("lookAt")) { + var error = $root.keyhole.dbroot.LookAtProto.verify(message.lookAt); + if (error) + return "lookAt." + error; + } + if (message.assetUuid != null && message.hasOwnProperty("assetUuid")) + if (!$util.isString(message.assetUuid)) + return "assetUuid: string expected"; + if (message.isSaveLocked != null && message.hasOwnProperty("isSaveLocked")) + if (typeof message.isSaveLocked !== "boolean") + return "isSaveLocked: boolean expected"; + if (message.children != null && message.hasOwnProperty("children")) { + if (!Array.isArray(message.children)) + return "children: array expected"; + for (var i = 0; i < message.children.length; ++i) { + var error = $root.keyhole.dbroot.NestedFeatureProto.verify(message.children[i]); + if (error) + return "children." + error; + } + } + if (message.clientConfigScriptName != null && message.hasOwnProperty("clientConfigScriptName")) + if (!$util.isString(message.clientConfigScriptName)) + return "clientConfigScriptName: string expected"; + if (message.dioramaDataChannelBase != null && message.hasOwnProperty("dioramaDataChannelBase")) + if (!$util.isInteger(message.dioramaDataChannelBase)) + return "dioramaDataChannelBase: integer expected"; + if (message.replicaDataChannelBase != null && message.hasOwnProperty("replicaDataChannelBase")) + if (!$util.isInteger(message.replicaDataChannelBase)) + return "replicaDataChannelBase: integer expected"; + return null; + }; + + NestedFeatureProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.NestedFeatureProto) + return object; + var message = new $root.keyhole.dbroot.NestedFeatureProto(); + switch (object.featureType) { + case "TYPE_POINT_Z": + case 1: + message.featureType = 1; + break; + case "TYPE_POLYGON_Z": + case 2: + message.featureType = 2; + break; + case "TYPE_LINE_Z": + case 3: + message.featureType = 3; + break; + case "TYPE_TERRAIN": + case 4: + message.featureType = 4; + break; + } + if (object.kmlUrl != null) { + if (typeof object.kmlUrl !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.kmlUrl: object expected"); + message.kmlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlUrl); + } + if (object.databaseUrl != null) + message.databaseUrl = String(object.databaseUrl); + if (object.layer != null) { + if (typeof object.layer !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.layer: object expected"); + message.layer = $root.keyhole.dbroot.LayerProto.fromObject(object.layer); + } + if (object.folder != null) { + if (typeof object.folder !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.folder: object expected"); + message.folder = $root.keyhole.dbroot.FolderProto.fromObject(object.folder); + } + if (object.requirement != null) { + if (typeof object.requirement !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.requirement: object expected"); + message.requirement = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirement); + } + if (object.channelId != null) + message.channelId = object.channelId | 0; + if (object.displayName != null) { + if (typeof object.displayName !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.displayName: object expected"); + message.displayName = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.displayName); + } + if (object.isVisible != null) + message.isVisible = Boolean(object.isVisible); + if (object.isEnabled != null) + message.isEnabled = Boolean(object.isEnabled); + if (object.isChecked != null) + message.isChecked = Boolean(object.isChecked); + if (object.layerMenuIconPath != null) + message.layerMenuIconPath = String(object.layerMenuIconPath); + if (object.description != null) { + if (typeof object.description !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.description: object expected"); + message.description = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.description); + } + if (object.lookAt != null) { + if (typeof object.lookAt !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.lookAt: object expected"); + message.lookAt = $root.keyhole.dbroot.LookAtProto.fromObject(object.lookAt); + } + if (object.assetUuid != null) + message.assetUuid = String(object.assetUuid); + if (object.isSaveLocked != null) + message.isSaveLocked = Boolean(object.isSaveLocked); + if (object.children) { + if (!Array.isArray(object.children)) + throw TypeError(".keyhole.dbroot.NestedFeatureProto.children: array expected"); + message.children = []; + for (var i = 0; i < object.children.length; ++i) { + if (typeof object.children[i] !== "object") + throw TypeError(".keyhole.dbroot.NestedFeatureProto.children: object expected"); + message.children[i] = $root.keyhole.dbroot.NestedFeatureProto.fromObject(object.children[i]); + } + } + if (object.clientConfigScriptName != null) + message.clientConfigScriptName = String(object.clientConfigScriptName); + if (object.dioramaDataChannelBase != null) + message.dioramaDataChannelBase = object.dioramaDataChannelBase | 0; + if (object.replicaDataChannelBase != null) + message.replicaDataChannelBase = object.replicaDataChannelBase | 0; + return message; + }; + + NestedFeatureProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.children = []; + if (options.defaults) { + object.featureType = options.enums === String ? "TYPE_POINT_Z" : 1; + object.kmlUrl = null; + object.layer = null; + object.folder = null; + object.requirement = null; + object.channelId = 0; + object.displayName = null; + object.isVisible = true; + object.isEnabled = true; + object.isChecked = false; + object.layerMenuIconPath = "icons/773_l.png"; + object.description = null; + object.lookAt = null; + object.assetUuid = ""; + object.isSaveLocked = true; + object.clientConfigScriptName = ""; + object.dioramaDataChannelBase = -1; + object.replicaDataChannelBase = -1; + object.databaseUrl = ""; + } + if (message.featureType != null && message.hasOwnProperty("featureType")) + object.featureType = options.enums === String ? $root.keyhole.dbroot.NestedFeatureProto.FeatureType[message.featureType] : message.featureType; + if (message.kmlUrl != null && message.hasOwnProperty("kmlUrl")) + object.kmlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlUrl, options); + if (message.layer != null && message.hasOwnProperty("layer")) + object.layer = $root.keyhole.dbroot.LayerProto.toObject(message.layer, options); + if (message.folder != null && message.hasOwnProperty("folder")) + object.folder = $root.keyhole.dbroot.FolderProto.toObject(message.folder, options); + if (message.requirement != null && message.hasOwnProperty("requirement")) + object.requirement = $root.keyhole.dbroot.RequirementProto.toObject(message.requirement, options); + if (message.channelId != null && message.hasOwnProperty("channelId")) + object.channelId = message.channelId; + if (message.displayName != null && message.hasOwnProperty("displayName")) + object.displayName = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.displayName, options); + if (message.isVisible != null && message.hasOwnProperty("isVisible")) + object.isVisible = message.isVisible; + if (message.isEnabled != null && message.hasOwnProperty("isEnabled")) + object.isEnabled = message.isEnabled; + if (message.isChecked != null && message.hasOwnProperty("isChecked")) + object.isChecked = message.isChecked; + if (message.layerMenuIconPath != null && message.hasOwnProperty("layerMenuIconPath")) + object.layerMenuIconPath = message.layerMenuIconPath; + if (message.description != null && message.hasOwnProperty("description")) + object.description = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.description, options); + if (message.lookAt != null && message.hasOwnProperty("lookAt")) + object.lookAt = $root.keyhole.dbroot.LookAtProto.toObject(message.lookAt, options); + if (message.assetUuid != null && message.hasOwnProperty("assetUuid")) + object.assetUuid = message.assetUuid; + if (message.isSaveLocked != null && message.hasOwnProperty("isSaveLocked")) + object.isSaveLocked = message.isSaveLocked; + if (message.children && message.children.length) { + object.children = []; + for (var j = 0; j < message.children.length; ++j) + object.children[j] = $root.keyhole.dbroot.NestedFeatureProto.toObject(message.children[j], options); + } + if (message.clientConfigScriptName != null && message.hasOwnProperty("clientConfigScriptName")) + object.clientConfigScriptName = message.clientConfigScriptName; + if (message.dioramaDataChannelBase != null && message.hasOwnProperty("dioramaDataChannelBase")) + object.dioramaDataChannelBase = message.dioramaDataChannelBase; + if (message.replicaDataChannelBase != null && message.hasOwnProperty("replicaDataChannelBase")) + object.replicaDataChannelBase = message.replicaDataChannelBase; + if (message.databaseUrl != null && message.hasOwnProperty("databaseUrl")) + object.databaseUrl = message.databaseUrl; + return object; + }; + + NestedFeatureProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + NestedFeatureProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.NestedFeatureProto"; + }; + + NestedFeatureProto.FeatureType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "TYPE_POINT_Z"] = 1; + values[valuesById[2] = "TYPE_POLYGON_Z"] = 2; + values[valuesById[3] = "TYPE_LINE_Z"] = 3; + values[valuesById[4] = "TYPE_TERRAIN"] = 4; + return values; + })(); + + return NestedFeatureProto; + })(); + + dbroot.MfeDomainFeaturesProto = (function() { + + function MfeDomainFeaturesProto(properties) { + this.supportedFeatures = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + MfeDomainFeaturesProto.prototype.countryCode = ""; + MfeDomainFeaturesProto.prototype.domainName = ""; + MfeDomainFeaturesProto.prototype.supportedFeatures = $util.emptyArray; + + MfeDomainFeaturesProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.MfeDomainFeaturesProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.countryCode = reader.string(); + break; + } + case 2: { + message.domainName = reader.string(); + break; + } + case 3: { + if (!(message.supportedFeatures && message.supportedFeatures.length)) + message.supportedFeatures = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.supportedFeatures.push(reader.int32()); + } else + message.supportedFeatures.push(reader.int32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("countryCode")) + throw $util.ProtocolError("missing required 'countryCode'", { instance: message }); + if (!message.hasOwnProperty("domainName")) + throw $util.ProtocolError("missing required 'domainName'", { instance: message }); + return message; + }; + + MfeDomainFeaturesProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.countryCode)) + return "countryCode: string expected"; + if (!$util.isString(message.domainName)) + return "domainName: string expected"; + if (message.supportedFeatures != null && message.hasOwnProperty("supportedFeatures")) { + if (!Array.isArray(message.supportedFeatures)) + return "supportedFeatures: array expected"; + for (var i = 0; i < message.supportedFeatures.length; ++i) + switch (message.supportedFeatures[i]) { + default: + return "supportedFeatures: enum value[] expected"; + case 0: + case 1: + case 2: + break; + } + } + return null; + }; + + MfeDomainFeaturesProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.MfeDomainFeaturesProto) + return object; + var message = new $root.keyhole.dbroot.MfeDomainFeaturesProto(); + if (object.countryCode != null) + message.countryCode = String(object.countryCode); + if (object.domainName != null) + message.domainName = String(object.domainName); + if (object.supportedFeatures) { + if (!Array.isArray(object.supportedFeatures)) + throw TypeError(".keyhole.dbroot.MfeDomainFeaturesProto.supportedFeatures: array expected"); + message.supportedFeatures = []; + for (var i = 0; i < object.supportedFeatures.length; ++i) + switch (object.supportedFeatures[i]) { + default: + case "GEOCODING": + case 0: + message.supportedFeatures[i] = 0; + break; + case "LOCAL_SEARCH": + case 1: + message.supportedFeatures[i] = 1; + break; + case "DRIVING_DIRECTIONS": + case 2: + message.supportedFeatures[i] = 2; + break; + } + } + return message; + }; + + MfeDomainFeaturesProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.supportedFeatures = []; + if (options.defaults) { + object.countryCode = ""; + object.domainName = ""; + } + if (message.countryCode != null && message.hasOwnProperty("countryCode")) + object.countryCode = message.countryCode; + if (message.domainName != null && message.hasOwnProperty("domainName")) + object.domainName = message.domainName; + if (message.supportedFeatures && message.supportedFeatures.length) { + object.supportedFeatures = []; + for (var j = 0; j < message.supportedFeatures.length; ++j) + object.supportedFeatures[j] = options.enums === String ? $root.keyhole.dbroot.MfeDomainFeaturesProto.SupportedFeature[message.supportedFeatures[j]] : message.supportedFeatures[j]; + } + return object; + }; + + MfeDomainFeaturesProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + MfeDomainFeaturesProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.MfeDomainFeaturesProto"; + }; + + MfeDomainFeaturesProto.SupportedFeature = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "GEOCODING"] = 0; + values[valuesById[1] = "LOCAL_SEARCH"] = 1; + values[valuesById[2] = "DRIVING_DIRECTIONS"] = 2; + return values; + })(); + + return MfeDomainFeaturesProto; + })(); + + dbroot.ClientOptionsProto = (function() { + + function ClientOptionsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + ClientOptionsProto.prototype.disableDiskCache = false; + ClientOptionsProto.prototype.disableEmbeddedBrowserVista = false; + ClientOptionsProto.prototype.drawAtmosphere = true; + ClientOptionsProto.prototype.drawStars = true; + ClientOptionsProto.prototype.shaderFilePrefix = ""; + ClientOptionsProto.prototype.useProtobufQuadtreePackets = false; + ClientOptionsProto.prototype.useExtendedCopyrightIds = true; + ClientOptionsProto.prototype.precipitationsOptions = null; + ClientOptionsProto.prototype.captureOptions = null; + ClientOptionsProto.prototype.show_2dMapsIcon = true; + ClientOptionsProto.prototype.disableInternalBrowser = false; + ClientOptionsProto.prototype.internalBrowserBlacklist = ""; + ClientOptionsProto.prototype.internalBrowserOriginWhitelist = "*"; + ClientOptionsProto.prototype.polarTileMergingLevel = 0; + ClientOptionsProto.prototype.jsBridgeRequestWhitelist = "http://*.google.com/*"; + ClientOptionsProto.prototype.mapsOptions = null; + + ClientOptionsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ClientOptionsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.disableDiskCache = reader.bool(); + break; + } + case 2: { + message.disableEmbeddedBrowserVista = reader.bool(); + break; + } + case 3: { + message.drawAtmosphere = reader.bool(); + break; + } + case 4: { + message.drawStars = reader.bool(); + break; + } + case 5: { + message.shaderFilePrefix = reader.string(); + break; + } + case 6: { + message.useProtobufQuadtreePackets = reader.bool(); + break; + } + case 7: { + message.useExtendedCopyrightIds = reader.bool(); + break; + } + case 8: { + message.precipitationsOptions = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.decode(reader, reader.uint32()); + break; + } + case 9: { + message.captureOptions = $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions.decode(reader, reader.uint32()); + break; + } + case 10: { + message.show_2dMapsIcon = reader.bool(); + break; + } + case 11: { + message.disableInternalBrowser = reader.bool(); + break; + } + case 12: { + message.internalBrowserBlacklist = reader.string(); + break; + } + case 13: { + message.internalBrowserOriginWhitelist = reader.string(); + break; + } + case 14: { + message.polarTileMergingLevel = reader.int32(); + break; + } + case 15: { + message.jsBridgeRequestWhitelist = reader.string(); + break; + } + case 16: { + message.mapsOptions = $root.keyhole.dbroot.ClientOptionsProto.MapsOptions.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + ClientOptionsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.disableDiskCache != null && message.hasOwnProperty("disableDiskCache")) + if (typeof message.disableDiskCache !== "boolean") + return "disableDiskCache: boolean expected"; + if (message.disableEmbeddedBrowserVista != null && message.hasOwnProperty("disableEmbeddedBrowserVista")) + if (typeof message.disableEmbeddedBrowserVista !== "boolean") + return "disableEmbeddedBrowserVista: boolean expected"; + if (message.drawAtmosphere != null && message.hasOwnProperty("drawAtmosphere")) + if (typeof message.drawAtmosphere !== "boolean") + return "drawAtmosphere: boolean expected"; + if (message.drawStars != null && message.hasOwnProperty("drawStars")) + if (typeof message.drawStars !== "boolean") + return "drawStars: boolean expected"; + if (message.shaderFilePrefix != null && message.hasOwnProperty("shaderFilePrefix")) + if (!$util.isString(message.shaderFilePrefix)) + return "shaderFilePrefix: string expected"; + if (message.useProtobufQuadtreePackets != null && message.hasOwnProperty("useProtobufQuadtreePackets")) + if (typeof message.useProtobufQuadtreePackets !== "boolean") + return "useProtobufQuadtreePackets: boolean expected"; + if (message.useExtendedCopyrightIds != null && message.hasOwnProperty("useExtendedCopyrightIds")) + if (typeof message.useExtendedCopyrightIds !== "boolean") + return "useExtendedCopyrightIds: boolean expected"; + if (message.precipitationsOptions != null && message.hasOwnProperty("precipitationsOptions")) { + var error = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.verify(message.precipitationsOptions); + if (error) + return "precipitationsOptions." + error; + } + if (message.captureOptions != null && message.hasOwnProperty("captureOptions")) { + var error = $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions.verify(message.captureOptions); + if (error) + return "captureOptions." + error; + } + if (message.show_2dMapsIcon != null && message.hasOwnProperty("show_2dMapsIcon")) + if (typeof message.show_2dMapsIcon !== "boolean") + return "show_2dMapsIcon: boolean expected"; + if (message.disableInternalBrowser != null && message.hasOwnProperty("disableInternalBrowser")) + if (typeof message.disableInternalBrowser !== "boolean") + return "disableInternalBrowser: boolean expected"; + if (message.internalBrowserBlacklist != null && message.hasOwnProperty("internalBrowserBlacklist")) + if (!$util.isString(message.internalBrowserBlacklist)) + return "internalBrowserBlacklist: string expected"; + if (message.internalBrowserOriginWhitelist != null && message.hasOwnProperty("internalBrowserOriginWhitelist")) + if (!$util.isString(message.internalBrowserOriginWhitelist)) + return "internalBrowserOriginWhitelist: string expected"; + if (message.polarTileMergingLevel != null && message.hasOwnProperty("polarTileMergingLevel")) + if (!$util.isInteger(message.polarTileMergingLevel)) + return "polarTileMergingLevel: integer expected"; + if (message.jsBridgeRequestWhitelist != null && message.hasOwnProperty("jsBridgeRequestWhitelist")) + if (!$util.isString(message.jsBridgeRequestWhitelist)) + return "jsBridgeRequestWhitelist: string expected"; + if (message.mapsOptions != null && message.hasOwnProperty("mapsOptions")) { + var error = $root.keyhole.dbroot.ClientOptionsProto.MapsOptions.verify(message.mapsOptions); + if (error) + return "mapsOptions." + error; + } + return null; + }; + + ClientOptionsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ClientOptionsProto) + return object; + var message = new $root.keyhole.dbroot.ClientOptionsProto(); + if (object.disableDiskCache != null) + message.disableDiskCache = Boolean(object.disableDiskCache); + if (object.disableEmbeddedBrowserVista != null) + message.disableEmbeddedBrowserVista = Boolean(object.disableEmbeddedBrowserVista); + if (object.drawAtmosphere != null) + message.drawAtmosphere = Boolean(object.drawAtmosphere); + if (object.drawStars != null) + message.drawStars = Boolean(object.drawStars); + if (object.shaderFilePrefix != null) + message.shaderFilePrefix = String(object.shaderFilePrefix); + if (object.useProtobufQuadtreePackets != null) + message.useProtobufQuadtreePackets = Boolean(object.useProtobufQuadtreePackets); + if (object.useExtendedCopyrightIds != null) + message.useExtendedCopyrightIds = Boolean(object.useExtendedCopyrightIds); + if (object.precipitationsOptions != null) { + if (typeof object.precipitationsOptions !== "object") + throw TypeError(".keyhole.dbroot.ClientOptionsProto.precipitationsOptions: object expected"); + message.precipitationsOptions = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.fromObject(object.precipitationsOptions); + } + if (object.captureOptions != null) { + if (typeof object.captureOptions !== "object") + throw TypeError(".keyhole.dbroot.ClientOptionsProto.captureOptions: object expected"); + message.captureOptions = $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions.fromObject(object.captureOptions); + } + if (object.show_2dMapsIcon != null) + message.show_2dMapsIcon = Boolean(object.show_2dMapsIcon); + if (object.disableInternalBrowser != null) + message.disableInternalBrowser = Boolean(object.disableInternalBrowser); + if (object.internalBrowserBlacklist != null) + message.internalBrowserBlacklist = String(object.internalBrowserBlacklist); + if (object.internalBrowserOriginWhitelist != null) + message.internalBrowserOriginWhitelist = String(object.internalBrowserOriginWhitelist); + if (object.polarTileMergingLevel != null) + message.polarTileMergingLevel = object.polarTileMergingLevel | 0; + if (object.jsBridgeRequestWhitelist != null) + message.jsBridgeRequestWhitelist = String(object.jsBridgeRequestWhitelist); + if (object.mapsOptions != null) { + if (typeof object.mapsOptions !== "object") + throw TypeError(".keyhole.dbroot.ClientOptionsProto.mapsOptions: object expected"); + message.mapsOptions = $root.keyhole.dbroot.ClientOptionsProto.MapsOptions.fromObject(object.mapsOptions); + } + return message; + }; + + ClientOptionsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.disableDiskCache = false; + object.disableEmbeddedBrowserVista = false; + object.drawAtmosphere = true; + object.drawStars = true; + object.shaderFilePrefix = ""; + object.useProtobufQuadtreePackets = false; + object.useExtendedCopyrightIds = true; + object.precipitationsOptions = null; + object.captureOptions = null; + object.show_2dMapsIcon = true; + object.disableInternalBrowser = false; + object.internalBrowserBlacklist = ""; + object.internalBrowserOriginWhitelist = "*"; + object.polarTileMergingLevel = 0; + object.jsBridgeRequestWhitelist = "http://*.google.com/*"; + object.mapsOptions = null; + } + if (message.disableDiskCache != null && message.hasOwnProperty("disableDiskCache")) + object.disableDiskCache = message.disableDiskCache; + if (message.disableEmbeddedBrowserVista != null && message.hasOwnProperty("disableEmbeddedBrowserVista")) + object.disableEmbeddedBrowserVista = message.disableEmbeddedBrowserVista; + if (message.drawAtmosphere != null && message.hasOwnProperty("drawAtmosphere")) + object.drawAtmosphere = message.drawAtmosphere; + if (message.drawStars != null && message.hasOwnProperty("drawStars")) + object.drawStars = message.drawStars; + if (message.shaderFilePrefix != null && message.hasOwnProperty("shaderFilePrefix")) + object.shaderFilePrefix = message.shaderFilePrefix; + if (message.useProtobufQuadtreePackets != null && message.hasOwnProperty("useProtobufQuadtreePackets")) + object.useProtobufQuadtreePackets = message.useProtobufQuadtreePackets; + if (message.useExtendedCopyrightIds != null && message.hasOwnProperty("useExtendedCopyrightIds")) + object.useExtendedCopyrightIds = message.useExtendedCopyrightIds; + if (message.precipitationsOptions != null && message.hasOwnProperty("precipitationsOptions")) + object.precipitationsOptions = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.toObject(message.precipitationsOptions, options); + if (message.captureOptions != null && message.hasOwnProperty("captureOptions")) + object.captureOptions = $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions.toObject(message.captureOptions, options); + if (message.show_2dMapsIcon != null && message.hasOwnProperty("show_2dMapsIcon")) + object.show_2dMapsIcon = message.show_2dMapsIcon; + if (message.disableInternalBrowser != null && message.hasOwnProperty("disableInternalBrowser")) + object.disableInternalBrowser = message.disableInternalBrowser; + if (message.internalBrowserBlacklist != null && message.hasOwnProperty("internalBrowserBlacklist")) + object.internalBrowserBlacklist = message.internalBrowserBlacklist; + if (message.internalBrowserOriginWhitelist != null && message.hasOwnProperty("internalBrowserOriginWhitelist")) + object.internalBrowserOriginWhitelist = message.internalBrowserOriginWhitelist; + if (message.polarTileMergingLevel != null && message.hasOwnProperty("polarTileMergingLevel")) + object.polarTileMergingLevel = message.polarTileMergingLevel; + if (message.jsBridgeRequestWhitelist != null && message.hasOwnProperty("jsBridgeRequestWhitelist")) + object.jsBridgeRequestWhitelist = message.jsBridgeRequestWhitelist; + if (message.mapsOptions != null && message.hasOwnProperty("mapsOptions")) + object.mapsOptions = $root.keyhole.dbroot.ClientOptionsProto.MapsOptions.toObject(message.mapsOptions, options); + return object; + }; + + ClientOptionsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ClientOptionsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ClientOptionsProto"; + }; + + ClientOptionsProto.PrecipitationsOptions = (function() { + + function PrecipitationsOptions(properties) { + this.weatherMapping = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + PrecipitationsOptions.prototype.imageUrl = ""; + PrecipitationsOptions.prototype.imageExpireTime = 900; + PrecipitationsOptions.prototype.maxColorDistance = 20; + PrecipitationsOptions.prototype.imageLevel = 5; + PrecipitationsOptions.prototype.weatherMapping = $util.emptyArray; + PrecipitationsOptions.prototype.cloudsLayerUrl = ""; + PrecipitationsOptions.prototype.animationDecelerationDelay = 20; + + PrecipitationsOptions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.imageUrl = reader.string(); + break; + } + case 2: { + message.imageExpireTime = reader.int32(); + break; + } + case 3: { + message.maxColorDistance = reader.int32(); + break; + } + case 4: { + message.imageLevel = reader.int32(); + break; + } + case 5: { + if (!(message.weatherMapping && message.weatherMapping.length)) + message.weatherMapping = []; + message.weatherMapping.push($root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.decode(reader, reader.uint32())); + break; + } + case 6: { + message.cloudsLayerUrl = reader.string(); + break; + } + case 7: { + message.animationDecelerationDelay = reader.float(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + PrecipitationsOptions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.imageUrl != null && message.hasOwnProperty("imageUrl")) + if (!$util.isString(message.imageUrl)) + return "imageUrl: string expected"; + if (message.imageExpireTime != null && message.hasOwnProperty("imageExpireTime")) + if (!$util.isInteger(message.imageExpireTime)) + return "imageExpireTime: integer expected"; + if (message.maxColorDistance != null && message.hasOwnProperty("maxColorDistance")) + if (!$util.isInteger(message.maxColorDistance)) + return "maxColorDistance: integer expected"; + if (message.imageLevel != null && message.hasOwnProperty("imageLevel")) + if (!$util.isInteger(message.imageLevel)) + return "imageLevel: integer expected"; + if (message.weatherMapping != null && message.hasOwnProperty("weatherMapping")) { + if (!Array.isArray(message.weatherMapping)) + return "weatherMapping: array expected"; + for (var i = 0; i < message.weatherMapping.length; ++i) { + var error = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.verify(message.weatherMapping[i]); + if (error) + return "weatherMapping." + error; + } + } + if (message.cloudsLayerUrl != null && message.hasOwnProperty("cloudsLayerUrl")) + if (!$util.isString(message.cloudsLayerUrl)) + return "cloudsLayerUrl: string expected"; + if (message.animationDecelerationDelay != null && message.hasOwnProperty("animationDecelerationDelay")) + if (typeof message.animationDecelerationDelay !== "number") + return "animationDecelerationDelay: number expected"; + return null; + }; + + PrecipitationsOptions.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions) + return object; + var message = new $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions(); + if (object.imageUrl != null) + message.imageUrl = String(object.imageUrl); + if (object.imageExpireTime != null) + message.imageExpireTime = object.imageExpireTime | 0; + if (object.maxColorDistance != null) + message.maxColorDistance = object.maxColorDistance | 0; + if (object.imageLevel != null) + message.imageLevel = object.imageLevel | 0; + if (object.weatherMapping) { + if (!Array.isArray(object.weatherMapping)) + throw TypeError(".keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.weatherMapping: array expected"); + message.weatherMapping = []; + for (var i = 0; i < object.weatherMapping.length; ++i) { + if (typeof object.weatherMapping[i] !== "object") + throw TypeError(".keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.weatherMapping: object expected"); + message.weatherMapping[i] = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.fromObject(object.weatherMapping[i]); + } + } + if (object.cloudsLayerUrl != null) + message.cloudsLayerUrl = String(object.cloudsLayerUrl); + if (object.animationDecelerationDelay != null) + message.animationDecelerationDelay = Number(object.animationDecelerationDelay); + return message; + }; + + PrecipitationsOptions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.weatherMapping = []; + if (options.defaults) { + object.imageUrl = ""; + object.imageExpireTime = 900; + object.maxColorDistance = 20; + object.imageLevel = 5; + object.cloudsLayerUrl = ""; + object.animationDecelerationDelay = 20; + } + if (message.imageUrl != null && message.hasOwnProperty("imageUrl")) + object.imageUrl = message.imageUrl; + if (message.imageExpireTime != null && message.hasOwnProperty("imageExpireTime")) + object.imageExpireTime = message.imageExpireTime; + if (message.maxColorDistance != null && message.hasOwnProperty("maxColorDistance")) + object.maxColorDistance = message.maxColorDistance; + if (message.imageLevel != null && message.hasOwnProperty("imageLevel")) + object.imageLevel = message.imageLevel; + if (message.weatherMapping && message.weatherMapping.length) { + object.weatherMapping = []; + for (var j = 0; j < message.weatherMapping.length; ++j) + object.weatherMapping[j] = $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.toObject(message.weatherMapping[j], options); + } + if (message.cloudsLayerUrl != null && message.hasOwnProperty("cloudsLayerUrl")) + object.cloudsLayerUrl = message.cloudsLayerUrl; + if (message.animationDecelerationDelay != null && message.hasOwnProperty("animationDecelerationDelay")) + object.animationDecelerationDelay = options.json && !isFinite(message.animationDecelerationDelay) ? String(message.animationDecelerationDelay) : message.animationDecelerationDelay; + return object; + }; + + PrecipitationsOptions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PrecipitationsOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions"; + }; + + PrecipitationsOptions.WeatherMapping = (function() { + + function WeatherMapping(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + WeatherMapping.prototype.colorAbgr = 0; + WeatherMapping.prototype.weatherType = 0; + WeatherMapping.prototype.elongation = 1; + WeatherMapping.prototype.opacity = 0; + WeatherMapping.prototype.fogDensity = 0; + WeatherMapping.prototype.speed0 = 0; + WeatherMapping.prototype.speed1 = 0; + WeatherMapping.prototype.speed2 = 0; + WeatherMapping.prototype.speed3 = 0; + + WeatherMapping.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.colorAbgr = reader.uint32(); + break; + } + case 2: { + message.weatherType = reader.int32(); + break; + } + case 3: { + message.elongation = reader.float(); + break; + } + case 4: { + message.opacity = reader.float(); + break; + } + case 5: { + message.fogDensity = reader.float(); + break; + } + case 6: { + message.speed0 = reader.float(); + break; + } + case 7: { + message.speed1 = reader.float(); + break; + } + case 8: { + message.speed2 = reader.float(); + break; + } + case 9: { + message.speed3 = reader.float(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("colorAbgr")) + throw $util.ProtocolError("missing required 'colorAbgr'", { instance: message }); + if (!message.hasOwnProperty("weatherType")) + throw $util.ProtocolError("missing required 'weatherType'", { instance: message }); + return message; + }; + + WeatherMapping.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.colorAbgr)) + return "colorAbgr: integer expected"; + switch (message.weatherType) { + default: + return "weatherType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.elongation != null && message.hasOwnProperty("elongation")) + if (typeof message.elongation !== "number") + return "elongation: number expected"; + if (message.opacity != null && message.hasOwnProperty("opacity")) + if (typeof message.opacity !== "number") + return "opacity: number expected"; + if (message.fogDensity != null && message.hasOwnProperty("fogDensity")) + if (typeof message.fogDensity !== "number") + return "fogDensity: number expected"; + if (message.speed0 != null && message.hasOwnProperty("speed0")) + if (typeof message.speed0 !== "number") + return "speed0: number expected"; + if (message.speed1 != null && message.hasOwnProperty("speed1")) + if (typeof message.speed1 !== "number") + return "speed1: number expected"; + if (message.speed2 != null && message.hasOwnProperty("speed2")) + if (typeof message.speed2 !== "number") + return "speed2: number expected"; + if (message.speed3 != null && message.hasOwnProperty("speed3")) + if (typeof message.speed3 !== "number") + return "speed3: number expected"; + return null; + }; + + WeatherMapping.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping) + return object; + var message = new $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping(); + if (object.colorAbgr != null) + message.colorAbgr = object.colorAbgr >>> 0; + switch (object.weatherType) { + case "NO_PRECIPITATION": + case 0: + message.weatherType = 0; + break; + case "RAIN": + case 1: + message.weatherType = 1; + break; + case "SNOW": + case 2: + message.weatherType = 2; + break; + } + if (object.elongation != null) + message.elongation = Number(object.elongation); + if (object.opacity != null) + message.opacity = Number(object.opacity); + if (object.fogDensity != null) + message.fogDensity = Number(object.fogDensity); + if (object.speed0 != null) + message.speed0 = Number(object.speed0); + if (object.speed1 != null) + message.speed1 = Number(object.speed1); + if (object.speed2 != null) + message.speed2 = Number(object.speed2); + if (object.speed3 != null) + message.speed3 = Number(object.speed3); + return message; + }; + + WeatherMapping.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.colorAbgr = 0; + object.weatherType = options.enums === String ? "NO_PRECIPITATION" : 0; + object.elongation = 1; + object.opacity = 0; + object.fogDensity = 0; + object.speed0 = 0; + object.speed1 = 0; + object.speed2 = 0; + object.speed3 = 0; + } + if (message.colorAbgr != null && message.hasOwnProperty("colorAbgr")) + object.colorAbgr = message.colorAbgr; + if (message.weatherType != null && message.hasOwnProperty("weatherType")) + object.weatherType = options.enums === String ? $root.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.WeatherType[message.weatherType] : message.weatherType; + if (message.elongation != null && message.hasOwnProperty("elongation")) + object.elongation = options.json && !isFinite(message.elongation) ? String(message.elongation) : message.elongation; + if (message.opacity != null && message.hasOwnProperty("opacity")) + object.opacity = options.json && !isFinite(message.opacity) ? String(message.opacity) : message.opacity; + if (message.fogDensity != null && message.hasOwnProperty("fogDensity")) + object.fogDensity = options.json && !isFinite(message.fogDensity) ? String(message.fogDensity) : message.fogDensity; + if (message.speed0 != null && message.hasOwnProperty("speed0")) + object.speed0 = options.json && !isFinite(message.speed0) ? String(message.speed0) : message.speed0; + if (message.speed1 != null && message.hasOwnProperty("speed1")) + object.speed1 = options.json && !isFinite(message.speed1) ? String(message.speed1) : message.speed1; + if (message.speed2 != null && message.hasOwnProperty("speed2")) + object.speed2 = options.json && !isFinite(message.speed2) ? String(message.speed2) : message.speed2; + if (message.speed3 != null && message.hasOwnProperty("speed3")) + object.speed3 = options.json && !isFinite(message.speed3) ? String(message.speed3) : message.speed3; + return object; + }; + + WeatherMapping.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + WeatherMapping.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping"; + }; + + WeatherMapping.WeatherType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NO_PRECIPITATION"] = 0; + values[valuesById[1] = "RAIN"] = 1; + values[valuesById[2] = "SNOW"] = 2; + return values; + })(); + + return WeatherMapping; + })(); + + return PrecipitationsOptions; + })(); + + ClientOptionsProto.CaptureOptions = (function() { + + function CaptureOptions(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + CaptureOptions.prototype.allowSaveAsImage = true; + CaptureOptions.prototype.maxFreeCaptureRes = 2400; + CaptureOptions.prototype.maxPremiumCaptureRes = 4800; + + CaptureOptions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.allowSaveAsImage = reader.bool(); + break; + } + case 2: { + message.maxFreeCaptureRes = reader.int32(); + break; + } + case 3: { + message.maxPremiumCaptureRes = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + CaptureOptions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.allowSaveAsImage != null && message.hasOwnProperty("allowSaveAsImage")) + if (typeof message.allowSaveAsImage !== "boolean") + return "allowSaveAsImage: boolean expected"; + if (message.maxFreeCaptureRes != null && message.hasOwnProperty("maxFreeCaptureRes")) + if (!$util.isInteger(message.maxFreeCaptureRes)) + return "maxFreeCaptureRes: integer expected"; + if (message.maxPremiumCaptureRes != null && message.hasOwnProperty("maxPremiumCaptureRes")) + if (!$util.isInteger(message.maxPremiumCaptureRes)) + return "maxPremiumCaptureRes: integer expected"; + return null; + }; + + CaptureOptions.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions) + return object; + var message = new $root.keyhole.dbroot.ClientOptionsProto.CaptureOptions(); + if (object.allowSaveAsImage != null) + message.allowSaveAsImage = Boolean(object.allowSaveAsImage); + if (object.maxFreeCaptureRes != null) + message.maxFreeCaptureRes = object.maxFreeCaptureRes | 0; + if (object.maxPremiumCaptureRes != null) + message.maxPremiumCaptureRes = object.maxPremiumCaptureRes | 0; + return message; + }; + + CaptureOptions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.allowSaveAsImage = true; + object.maxFreeCaptureRes = 2400; + object.maxPremiumCaptureRes = 4800; + } + if (message.allowSaveAsImage != null && message.hasOwnProperty("allowSaveAsImage")) + object.allowSaveAsImage = message.allowSaveAsImage; + if (message.maxFreeCaptureRes != null && message.hasOwnProperty("maxFreeCaptureRes")) + object.maxFreeCaptureRes = message.maxFreeCaptureRes; + if (message.maxPremiumCaptureRes != null && message.hasOwnProperty("maxPremiumCaptureRes")) + object.maxPremiumCaptureRes = message.maxPremiumCaptureRes; + return object; + }; + + CaptureOptions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + CaptureOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ClientOptionsProto.CaptureOptions"; + }; + + return CaptureOptions; + })(); + + ClientOptionsProto.MapsOptions = (function() { + + function MapsOptions(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + MapsOptions.prototype.enableMaps = false; + MapsOptions.prototype.docsAutoDownloadEnabled = false; + MapsOptions.prototype.docsAutoDownloadInterval = 0; + MapsOptions.prototype.docsAutoUploadEnabled = false; + MapsOptions.prototype.docsAutoUploadDelay = 0; + + MapsOptions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ClientOptionsProto.MapsOptions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.enableMaps = reader.bool(); + break; + } + case 2: { + message.docsAutoDownloadEnabled = reader.bool(); + break; + } + case 3: { + message.docsAutoDownloadInterval = reader.int32(); + break; + } + case 4: { + message.docsAutoUploadEnabled = reader.bool(); + break; + } + case 5: { + message.docsAutoUploadDelay = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + MapsOptions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.enableMaps != null && message.hasOwnProperty("enableMaps")) + if (typeof message.enableMaps !== "boolean") + return "enableMaps: boolean expected"; + if (message.docsAutoDownloadEnabled != null && message.hasOwnProperty("docsAutoDownloadEnabled")) + if (typeof message.docsAutoDownloadEnabled !== "boolean") + return "docsAutoDownloadEnabled: boolean expected"; + if (message.docsAutoDownloadInterval != null && message.hasOwnProperty("docsAutoDownloadInterval")) + if (!$util.isInteger(message.docsAutoDownloadInterval)) + return "docsAutoDownloadInterval: integer expected"; + if (message.docsAutoUploadEnabled != null && message.hasOwnProperty("docsAutoUploadEnabled")) + if (typeof message.docsAutoUploadEnabled !== "boolean") + return "docsAutoUploadEnabled: boolean expected"; + if (message.docsAutoUploadDelay != null && message.hasOwnProperty("docsAutoUploadDelay")) + if (!$util.isInteger(message.docsAutoUploadDelay)) + return "docsAutoUploadDelay: integer expected"; + return null; + }; + + MapsOptions.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ClientOptionsProto.MapsOptions) + return object; + var message = new $root.keyhole.dbroot.ClientOptionsProto.MapsOptions(); + if (object.enableMaps != null) + message.enableMaps = Boolean(object.enableMaps); + if (object.docsAutoDownloadEnabled != null) + message.docsAutoDownloadEnabled = Boolean(object.docsAutoDownloadEnabled); + if (object.docsAutoDownloadInterval != null) + message.docsAutoDownloadInterval = object.docsAutoDownloadInterval | 0; + if (object.docsAutoUploadEnabled != null) + message.docsAutoUploadEnabled = Boolean(object.docsAutoUploadEnabled); + if (object.docsAutoUploadDelay != null) + message.docsAutoUploadDelay = object.docsAutoUploadDelay | 0; + return message; + }; + + MapsOptions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.enableMaps = false; + object.docsAutoDownloadEnabled = false; + object.docsAutoDownloadInterval = 0; + object.docsAutoUploadEnabled = false; + object.docsAutoUploadDelay = 0; + } + if (message.enableMaps != null && message.hasOwnProperty("enableMaps")) + object.enableMaps = message.enableMaps; + if (message.docsAutoDownloadEnabled != null && message.hasOwnProperty("docsAutoDownloadEnabled")) + object.docsAutoDownloadEnabled = message.docsAutoDownloadEnabled; + if (message.docsAutoDownloadInterval != null && message.hasOwnProperty("docsAutoDownloadInterval")) + object.docsAutoDownloadInterval = message.docsAutoDownloadInterval; + if (message.docsAutoUploadEnabled != null && message.hasOwnProperty("docsAutoUploadEnabled")) + object.docsAutoUploadEnabled = message.docsAutoUploadEnabled; + if (message.docsAutoUploadDelay != null && message.hasOwnProperty("docsAutoUploadDelay")) + object.docsAutoUploadDelay = message.docsAutoUploadDelay; + return object; + }; + + MapsOptions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + MapsOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ClientOptionsProto.MapsOptions"; + }; + + return MapsOptions; + })(); + + return ClientOptionsProto; + })(); + + dbroot.FetchingOptionsProto = (function() { + + function FetchingOptionsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + FetchingOptionsProto.prototype.maxRequestsPerQuery = 1; + FetchingOptionsProto.prototype.forceMaxRequestsPerQuery = false; + FetchingOptionsProto.prototype.sortBatches = false; + FetchingOptionsProto.prototype.maxDrawable = 2; + FetchingOptionsProto.prototype.maxImagery = 2; + FetchingOptionsProto.prototype.maxTerrain = 5; + FetchingOptionsProto.prototype.maxQuadtree = 5; + FetchingOptionsProto.prototype.maxDioramaMetadata = 1; + FetchingOptionsProto.prototype.maxDioramaData = 0; + FetchingOptionsProto.prototype.maxConsumerFetchRatio = 1; + FetchingOptionsProto.prototype.maxProEcFetchRatio = 0; + FetchingOptionsProto.prototype.safeOverallQps = 0; + FetchingOptionsProto.prototype.safeImageryQps = 0; + FetchingOptionsProto.prototype.domainsForHttps = "google.com gstatic.com"; + FetchingOptionsProto.prototype.hostsForHttp = ""; + + FetchingOptionsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.FetchingOptionsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.maxRequestsPerQuery = reader.int32(); + break; + } + case 12: { + message.forceMaxRequestsPerQuery = reader.bool(); + break; + } + case 13: { + message.sortBatches = reader.bool(); + break; + } + case 2: { + message.maxDrawable = reader.int32(); + break; + } + case 3: { + message.maxImagery = reader.int32(); + break; + } + case 4: { + message.maxTerrain = reader.int32(); + break; + } + case 5: { + message.maxQuadtree = reader.int32(); + break; + } + case 6: { + message.maxDioramaMetadata = reader.int32(); + break; + } + case 7: { + message.maxDioramaData = reader.int32(); + break; + } + case 8: { + message.maxConsumerFetchRatio = reader.float(); + break; + } + case 9: { + message.maxProEcFetchRatio = reader.float(); + break; + } + case 10: { + message.safeOverallQps = reader.float(); + break; + } + case 11: { + message.safeImageryQps = reader.float(); + break; + } + case 14: { + message.domainsForHttps = reader.string(); + break; + } + case 15: { + message.hostsForHttp = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + FetchingOptionsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.maxRequestsPerQuery != null && message.hasOwnProperty("maxRequestsPerQuery")) + if (!$util.isInteger(message.maxRequestsPerQuery)) + return "maxRequestsPerQuery: integer expected"; + if (message.forceMaxRequestsPerQuery != null && message.hasOwnProperty("forceMaxRequestsPerQuery")) + if (typeof message.forceMaxRequestsPerQuery !== "boolean") + return "forceMaxRequestsPerQuery: boolean expected"; + if (message.sortBatches != null && message.hasOwnProperty("sortBatches")) + if (typeof message.sortBatches !== "boolean") + return "sortBatches: boolean expected"; + if (message.maxDrawable != null && message.hasOwnProperty("maxDrawable")) + if (!$util.isInteger(message.maxDrawable)) + return "maxDrawable: integer expected"; + if (message.maxImagery != null && message.hasOwnProperty("maxImagery")) + if (!$util.isInteger(message.maxImagery)) + return "maxImagery: integer expected"; + if (message.maxTerrain != null && message.hasOwnProperty("maxTerrain")) + if (!$util.isInteger(message.maxTerrain)) + return "maxTerrain: integer expected"; + if (message.maxQuadtree != null && message.hasOwnProperty("maxQuadtree")) + if (!$util.isInteger(message.maxQuadtree)) + return "maxQuadtree: integer expected"; + if (message.maxDioramaMetadata != null && message.hasOwnProperty("maxDioramaMetadata")) + if (!$util.isInteger(message.maxDioramaMetadata)) + return "maxDioramaMetadata: integer expected"; + if (message.maxDioramaData != null && message.hasOwnProperty("maxDioramaData")) + if (!$util.isInteger(message.maxDioramaData)) + return "maxDioramaData: integer expected"; + if (message.maxConsumerFetchRatio != null && message.hasOwnProperty("maxConsumerFetchRatio")) + if (typeof message.maxConsumerFetchRatio !== "number") + return "maxConsumerFetchRatio: number expected"; + if (message.maxProEcFetchRatio != null && message.hasOwnProperty("maxProEcFetchRatio")) + if (typeof message.maxProEcFetchRatio !== "number") + return "maxProEcFetchRatio: number expected"; + if (message.safeOverallQps != null && message.hasOwnProperty("safeOverallQps")) + if (typeof message.safeOverallQps !== "number") + return "safeOverallQps: number expected"; + if (message.safeImageryQps != null && message.hasOwnProperty("safeImageryQps")) + if (typeof message.safeImageryQps !== "number") + return "safeImageryQps: number expected"; + if (message.domainsForHttps != null && message.hasOwnProperty("domainsForHttps")) + if (!$util.isString(message.domainsForHttps)) + return "domainsForHttps: string expected"; + if (message.hostsForHttp != null && message.hasOwnProperty("hostsForHttp")) + if (!$util.isString(message.hostsForHttp)) + return "hostsForHttp: string expected"; + return null; + }; + + FetchingOptionsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.FetchingOptionsProto) + return object; + var message = new $root.keyhole.dbroot.FetchingOptionsProto(); + if (object.maxRequestsPerQuery != null) + message.maxRequestsPerQuery = object.maxRequestsPerQuery | 0; + if (object.forceMaxRequestsPerQuery != null) + message.forceMaxRequestsPerQuery = Boolean(object.forceMaxRequestsPerQuery); + if (object.sortBatches != null) + message.sortBatches = Boolean(object.sortBatches); + if (object.maxDrawable != null) + message.maxDrawable = object.maxDrawable | 0; + if (object.maxImagery != null) + message.maxImagery = object.maxImagery | 0; + if (object.maxTerrain != null) + message.maxTerrain = object.maxTerrain | 0; + if (object.maxQuadtree != null) + message.maxQuadtree = object.maxQuadtree | 0; + if (object.maxDioramaMetadata != null) + message.maxDioramaMetadata = object.maxDioramaMetadata | 0; + if (object.maxDioramaData != null) + message.maxDioramaData = object.maxDioramaData | 0; + if (object.maxConsumerFetchRatio != null) + message.maxConsumerFetchRatio = Number(object.maxConsumerFetchRatio); + if (object.maxProEcFetchRatio != null) + message.maxProEcFetchRatio = Number(object.maxProEcFetchRatio); + if (object.safeOverallQps != null) + message.safeOverallQps = Number(object.safeOverallQps); + if (object.safeImageryQps != null) + message.safeImageryQps = Number(object.safeImageryQps); + if (object.domainsForHttps != null) + message.domainsForHttps = String(object.domainsForHttps); + if (object.hostsForHttp != null) + message.hostsForHttp = String(object.hostsForHttp); + return message; + }; + + FetchingOptionsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.maxRequestsPerQuery = 1; + object.maxDrawable = 2; + object.maxImagery = 2; + object.maxTerrain = 5; + object.maxQuadtree = 5; + object.maxDioramaMetadata = 1; + object.maxDioramaData = 0; + object.maxConsumerFetchRatio = 1; + object.maxProEcFetchRatio = 0; + object.safeOverallQps = 0; + object.safeImageryQps = 0; + object.forceMaxRequestsPerQuery = false; + object.sortBatches = false; + object.domainsForHttps = "google.com gstatic.com"; + object.hostsForHttp = ""; + } + if (message.maxRequestsPerQuery != null && message.hasOwnProperty("maxRequestsPerQuery")) + object.maxRequestsPerQuery = message.maxRequestsPerQuery; + if (message.maxDrawable != null && message.hasOwnProperty("maxDrawable")) + object.maxDrawable = message.maxDrawable; + if (message.maxImagery != null && message.hasOwnProperty("maxImagery")) + object.maxImagery = message.maxImagery; + if (message.maxTerrain != null && message.hasOwnProperty("maxTerrain")) + object.maxTerrain = message.maxTerrain; + if (message.maxQuadtree != null && message.hasOwnProperty("maxQuadtree")) + object.maxQuadtree = message.maxQuadtree; + if (message.maxDioramaMetadata != null && message.hasOwnProperty("maxDioramaMetadata")) + object.maxDioramaMetadata = message.maxDioramaMetadata; + if (message.maxDioramaData != null && message.hasOwnProperty("maxDioramaData")) + object.maxDioramaData = message.maxDioramaData; + if (message.maxConsumerFetchRatio != null && message.hasOwnProperty("maxConsumerFetchRatio")) + object.maxConsumerFetchRatio = options.json && !isFinite(message.maxConsumerFetchRatio) ? String(message.maxConsumerFetchRatio) : message.maxConsumerFetchRatio; + if (message.maxProEcFetchRatio != null && message.hasOwnProperty("maxProEcFetchRatio")) + object.maxProEcFetchRatio = options.json && !isFinite(message.maxProEcFetchRatio) ? String(message.maxProEcFetchRatio) : message.maxProEcFetchRatio; + if (message.safeOverallQps != null && message.hasOwnProperty("safeOverallQps")) + object.safeOverallQps = options.json && !isFinite(message.safeOverallQps) ? String(message.safeOverallQps) : message.safeOverallQps; + if (message.safeImageryQps != null && message.hasOwnProperty("safeImageryQps")) + object.safeImageryQps = options.json && !isFinite(message.safeImageryQps) ? String(message.safeImageryQps) : message.safeImageryQps; + if (message.forceMaxRequestsPerQuery != null && message.hasOwnProperty("forceMaxRequestsPerQuery")) + object.forceMaxRequestsPerQuery = message.forceMaxRequestsPerQuery; + if (message.sortBatches != null && message.hasOwnProperty("sortBatches")) + object.sortBatches = message.sortBatches; + if (message.domainsForHttps != null && message.hasOwnProperty("domainsForHttps")) + object.domainsForHttps = message.domainsForHttps; + if (message.hostsForHttp != null && message.hasOwnProperty("hostsForHttp")) + object.hostsForHttp = message.hostsForHttp; + return object; + }; + + FetchingOptionsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + FetchingOptionsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.FetchingOptionsProto"; + }; + + return FetchingOptionsProto; + })(); + + dbroot.TimeMachineOptionsProto = (function() { + + function TimeMachineOptionsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + TimeMachineOptionsProto.prototype.serverUrl = ""; + TimeMachineOptionsProto.prototype.isTimemachine = false; + TimeMachineOptionsProto.prototype.dwellTimeMs = 500; + TimeMachineOptionsProto.prototype.discoverabilityAltitudeMeters = 15000; + + TimeMachineOptionsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.TimeMachineOptionsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.serverUrl = reader.string(); + break; + } + case 2: { + message.isTimemachine = reader.bool(); + break; + } + case 3: { + message.dwellTimeMs = reader.int32(); + break; + } + case 4: { + message.discoverabilityAltitudeMeters = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + TimeMachineOptionsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serverUrl != null && message.hasOwnProperty("serverUrl")) + if (!$util.isString(message.serverUrl)) + return "serverUrl: string expected"; + if (message.isTimemachine != null && message.hasOwnProperty("isTimemachine")) + if (typeof message.isTimemachine !== "boolean") + return "isTimemachine: boolean expected"; + if (message.dwellTimeMs != null && message.hasOwnProperty("dwellTimeMs")) + if (!$util.isInteger(message.dwellTimeMs)) + return "dwellTimeMs: integer expected"; + if (message.discoverabilityAltitudeMeters != null && message.hasOwnProperty("discoverabilityAltitudeMeters")) + if (!$util.isInteger(message.discoverabilityAltitudeMeters)) + return "discoverabilityAltitudeMeters: integer expected"; + return null; + }; + + TimeMachineOptionsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.TimeMachineOptionsProto) + return object; + var message = new $root.keyhole.dbroot.TimeMachineOptionsProto(); + if (object.serverUrl != null) + message.serverUrl = String(object.serverUrl); + if (object.isTimemachine != null) + message.isTimemachine = Boolean(object.isTimemachine); + if (object.dwellTimeMs != null) + message.dwellTimeMs = object.dwellTimeMs | 0; + if (object.discoverabilityAltitudeMeters != null) + message.discoverabilityAltitudeMeters = object.discoverabilityAltitudeMeters | 0; + return message; + }; + + TimeMachineOptionsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.serverUrl = ""; + object.isTimemachine = false; + object.dwellTimeMs = 500; + object.discoverabilityAltitudeMeters = 15000; + } + if (message.serverUrl != null && message.hasOwnProperty("serverUrl")) + object.serverUrl = message.serverUrl; + if (message.isTimemachine != null && message.hasOwnProperty("isTimemachine")) + object.isTimemachine = message.isTimemachine; + if (message.dwellTimeMs != null && message.hasOwnProperty("dwellTimeMs")) + object.dwellTimeMs = message.dwellTimeMs; + if (message.discoverabilityAltitudeMeters != null && message.hasOwnProperty("discoverabilityAltitudeMeters")) + object.discoverabilityAltitudeMeters = message.discoverabilityAltitudeMeters; + return object; + }; + + TimeMachineOptionsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + TimeMachineOptionsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.TimeMachineOptionsProto"; + }; + + return TimeMachineOptionsProto; + })(); + + dbroot.AutopiaOptionsProto = (function() { + + function AutopiaOptionsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + AutopiaOptionsProto.prototype.metadataServerUrl = "http://cbk0.google.com/cbk"; + AutopiaOptionsProto.prototype.depthmapServerUrl = "http://cbk0.google.com/cbk"; + AutopiaOptionsProto.prototype.coverageOverlayUrl = ""; + AutopiaOptionsProto.prototype.maxImageryQps = 0; + AutopiaOptionsProto.prototype.maxMetadataDepthmapQps = 0; + + AutopiaOptionsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.AutopiaOptionsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.metadataServerUrl = reader.string(); + break; + } + case 2: { + message.depthmapServerUrl = reader.string(); + break; + } + case 3: { + message.coverageOverlayUrl = reader.string(); + break; + } + case 4: { + message.maxImageryQps = reader.float(); + break; + } + case 5: { + message.maxMetadataDepthmapQps = reader.float(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + AutopiaOptionsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.metadataServerUrl != null && message.hasOwnProperty("metadataServerUrl")) + if (!$util.isString(message.metadataServerUrl)) + return "metadataServerUrl: string expected"; + if (message.depthmapServerUrl != null && message.hasOwnProperty("depthmapServerUrl")) + if (!$util.isString(message.depthmapServerUrl)) + return "depthmapServerUrl: string expected"; + if (message.coverageOverlayUrl != null && message.hasOwnProperty("coverageOverlayUrl")) + if (!$util.isString(message.coverageOverlayUrl)) + return "coverageOverlayUrl: string expected"; + if (message.maxImageryQps != null && message.hasOwnProperty("maxImageryQps")) + if (typeof message.maxImageryQps !== "number") + return "maxImageryQps: number expected"; + if (message.maxMetadataDepthmapQps != null && message.hasOwnProperty("maxMetadataDepthmapQps")) + if (typeof message.maxMetadataDepthmapQps !== "number") + return "maxMetadataDepthmapQps: number expected"; + return null; + }; + + AutopiaOptionsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.AutopiaOptionsProto) + return object; + var message = new $root.keyhole.dbroot.AutopiaOptionsProto(); + if (object.metadataServerUrl != null) + message.metadataServerUrl = String(object.metadataServerUrl); + if (object.depthmapServerUrl != null) + message.depthmapServerUrl = String(object.depthmapServerUrl); + if (object.coverageOverlayUrl != null) + message.coverageOverlayUrl = String(object.coverageOverlayUrl); + if (object.maxImageryQps != null) + message.maxImageryQps = Number(object.maxImageryQps); + if (object.maxMetadataDepthmapQps != null) + message.maxMetadataDepthmapQps = Number(object.maxMetadataDepthmapQps); + return message; + }; + + AutopiaOptionsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.metadataServerUrl = "http://cbk0.google.com/cbk"; + object.depthmapServerUrl = "http://cbk0.google.com/cbk"; + object.coverageOverlayUrl = ""; + object.maxImageryQps = 0; + object.maxMetadataDepthmapQps = 0; + } + if (message.metadataServerUrl != null && message.hasOwnProperty("metadataServerUrl")) + object.metadataServerUrl = message.metadataServerUrl; + if (message.depthmapServerUrl != null && message.hasOwnProperty("depthmapServerUrl")) + object.depthmapServerUrl = message.depthmapServerUrl; + if (message.coverageOverlayUrl != null && message.hasOwnProperty("coverageOverlayUrl")) + object.coverageOverlayUrl = message.coverageOverlayUrl; + if (message.maxImageryQps != null && message.hasOwnProperty("maxImageryQps")) + object.maxImageryQps = options.json && !isFinite(message.maxImageryQps) ? String(message.maxImageryQps) : message.maxImageryQps; + if (message.maxMetadataDepthmapQps != null && message.hasOwnProperty("maxMetadataDepthmapQps")) + object.maxMetadataDepthmapQps = options.json && !isFinite(message.maxMetadataDepthmapQps) ? String(message.maxMetadataDepthmapQps) : message.maxMetadataDepthmapQps; + return object; + }; + + AutopiaOptionsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + AutopiaOptionsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.AutopiaOptionsProto"; + }; + + return AutopiaOptionsProto; + })(); + + dbroot.CSIOptionsProto = (function() { + + function CSIOptionsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + CSIOptionsProto.prototype.samplingPercentage = 0; + CSIOptionsProto.prototype.experimentId = ""; + + CSIOptionsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.CSIOptionsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.samplingPercentage = reader.int32(); + break; + } + case 2: { + message.experimentId = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + CSIOptionsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.samplingPercentage != null && message.hasOwnProperty("samplingPercentage")) + if (!$util.isInteger(message.samplingPercentage)) + return "samplingPercentage: integer expected"; + if (message.experimentId != null && message.hasOwnProperty("experimentId")) + if (!$util.isString(message.experimentId)) + return "experimentId: string expected"; + return null; + }; + + CSIOptionsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.CSIOptionsProto) + return object; + var message = new $root.keyhole.dbroot.CSIOptionsProto(); + if (object.samplingPercentage != null) + message.samplingPercentage = object.samplingPercentage | 0; + if (object.experimentId != null) + message.experimentId = String(object.experimentId); + return message; + }; + + CSIOptionsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.samplingPercentage = 0; + object.experimentId = ""; + } + if (message.samplingPercentage != null && message.hasOwnProperty("samplingPercentage")) + object.samplingPercentage = message.samplingPercentage; + if (message.experimentId != null && message.hasOwnProperty("experimentId")) + object.experimentId = message.experimentId; + return object; + }; + + CSIOptionsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + CSIOptionsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.CSIOptionsProto"; + }; + + return CSIOptionsProto; + })(); + + dbroot.SearchTabProto = (function() { + + function SearchTabProto(properties) { + this.inputBox = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SearchTabProto.prototype.isVisible = false; + SearchTabProto.prototype.tabLabel = null; + SearchTabProto.prototype.baseUrl = ""; + SearchTabProto.prototype.viewportPrefix = ""; + SearchTabProto.prototype.inputBox = $util.emptyArray; + SearchTabProto.prototype.requirement = null; + + SearchTabProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.SearchTabProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.isVisible = reader.bool(); + break; + } + case 2: { + message.tabLabel = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.baseUrl = reader.string(); + break; + } + case 4: { + message.viewportPrefix = reader.string(); + break; + } + case 5: { + if (!(message.inputBox && message.inputBox.length)) + message.inputBox = []; + message.inputBox.push($root.keyhole.dbroot.SearchTabProto.InputBoxInfo.decode(reader, reader.uint32())); + break; + } + case 6: { + message.requirement = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("isVisible")) + throw $util.ProtocolError("missing required 'isVisible'", { instance: message }); + return message; + }; + + SearchTabProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (typeof message.isVisible !== "boolean") + return "isVisible: boolean expected"; + if (message.tabLabel != null && message.hasOwnProperty("tabLabel")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.tabLabel); + if (error) + return "tabLabel." + error; + } + if (message.baseUrl != null && message.hasOwnProperty("baseUrl")) + if (!$util.isString(message.baseUrl)) + return "baseUrl: string expected"; + if (message.viewportPrefix != null && message.hasOwnProperty("viewportPrefix")) + if (!$util.isString(message.viewportPrefix)) + return "viewportPrefix: string expected"; + if (message.inputBox != null && message.hasOwnProperty("inputBox")) { + if (!Array.isArray(message.inputBox)) + return "inputBox: array expected"; + for (var i = 0; i < message.inputBox.length; ++i) { + var error = $root.keyhole.dbroot.SearchTabProto.InputBoxInfo.verify(message.inputBox[i]); + if (error) + return "inputBox." + error; + } + } + if (message.requirement != null && message.hasOwnProperty("requirement")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirement); + if (error) + return "requirement." + error; + } + return null; + }; + + SearchTabProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.SearchTabProto) + return object; + var message = new $root.keyhole.dbroot.SearchTabProto(); + if (object.isVisible != null) + message.isVisible = Boolean(object.isVisible); + if (object.tabLabel != null) { + if (typeof object.tabLabel !== "object") + throw TypeError(".keyhole.dbroot.SearchTabProto.tabLabel: object expected"); + message.tabLabel = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.tabLabel); + } + if (object.baseUrl != null) + message.baseUrl = String(object.baseUrl); + if (object.viewportPrefix != null) + message.viewportPrefix = String(object.viewportPrefix); + if (object.inputBox) { + if (!Array.isArray(object.inputBox)) + throw TypeError(".keyhole.dbroot.SearchTabProto.inputBox: array expected"); + message.inputBox = []; + for (var i = 0; i < object.inputBox.length; ++i) { + if (typeof object.inputBox[i] !== "object") + throw TypeError(".keyhole.dbroot.SearchTabProto.inputBox: object expected"); + message.inputBox[i] = $root.keyhole.dbroot.SearchTabProto.InputBoxInfo.fromObject(object.inputBox[i]); + } + } + if (object.requirement != null) { + if (typeof object.requirement !== "object") + throw TypeError(".keyhole.dbroot.SearchTabProto.requirement: object expected"); + message.requirement = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirement); + } + return message; + }; + + SearchTabProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.inputBox = []; + if (options.defaults) { + object.isVisible = false; + object.tabLabel = null; + object.baseUrl = ""; + object.viewportPrefix = ""; + object.requirement = null; + } + if (message.isVisible != null && message.hasOwnProperty("isVisible")) + object.isVisible = message.isVisible; + if (message.tabLabel != null && message.hasOwnProperty("tabLabel")) + object.tabLabel = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.tabLabel, options); + if (message.baseUrl != null && message.hasOwnProperty("baseUrl")) + object.baseUrl = message.baseUrl; + if (message.viewportPrefix != null && message.hasOwnProperty("viewportPrefix")) + object.viewportPrefix = message.viewportPrefix; + if (message.inputBox && message.inputBox.length) { + object.inputBox = []; + for (var j = 0; j < message.inputBox.length; ++j) + object.inputBox[j] = $root.keyhole.dbroot.SearchTabProto.InputBoxInfo.toObject(message.inputBox[j], options); + } + if (message.requirement != null && message.hasOwnProperty("requirement")) + object.requirement = $root.keyhole.dbroot.RequirementProto.toObject(message.requirement, options); + return object; + }; + + SearchTabProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SearchTabProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.SearchTabProto"; + }; + + SearchTabProto.InputBoxInfo = (function() { + + function InputBoxInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + InputBoxInfo.prototype.label = null; + InputBoxInfo.prototype.queryVerb = ""; + InputBoxInfo.prototype.queryPrepend = ""; + + InputBoxInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.SearchTabProto.InputBoxInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.label = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.queryVerb = reader.string(); + break; + } + case 3: { + message.queryPrepend = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("label")) + throw $util.ProtocolError("missing required 'label'", { instance: message }); + if (!message.hasOwnProperty("queryVerb")) + throw $util.ProtocolError("missing required 'queryVerb'", { instance: message }); + return message; + }; + + InputBoxInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.label); + if (error) + return "label." + error; + } + if (!$util.isString(message.queryVerb)) + return "queryVerb: string expected"; + if (message.queryPrepend != null && message.hasOwnProperty("queryPrepend")) + if (!$util.isString(message.queryPrepend)) + return "queryPrepend: string expected"; + return null; + }; + + InputBoxInfo.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.SearchTabProto.InputBoxInfo) + return object; + var message = new $root.keyhole.dbroot.SearchTabProto.InputBoxInfo(); + if (object.label != null) { + if (typeof object.label !== "object") + throw TypeError(".keyhole.dbroot.SearchTabProto.InputBoxInfo.label: object expected"); + message.label = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.label); + } + if (object.queryVerb != null) + message.queryVerb = String(object.queryVerb); + if (object.queryPrepend != null) + message.queryPrepend = String(object.queryPrepend); + return message; + }; + + InputBoxInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.label = null; + object.queryVerb = ""; + object.queryPrepend = ""; + } + if (message.label != null && message.hasOwnProperty("label")) + object.label = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.label, options); + if (message.queryVerb != null && message.hasOwnProperty("queryVerb")) + object.queryVerb = message.queryVerb; + if (message.queryPrepend != null && message.hasOwnProperty("queryPrepend")) + object.queryPrepend = message.queryPrepend; + return object; + }; + + InputBoxInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + InputBoxInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.SearchTabProto.InputBoxInfo"; + }; + + return InputBoxInfo; + })(); + + return SearchTabProto; + })(); + + dbroot.CobrandProto = (function() { + + function CobrandProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + CobrandProto.prototype.logoUrl = ""; + CobrandProto.prototype.xCoord = null; + CobrandProto.prototype.yCoord = null; + CobrandProto.prototype.tiePoint = 6; + CobrandProto.prototype.screenSize = 0; + + CobrandProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.CobrandProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.logoUrl = reader.string(); + break; + } + case 2: { + message.xCoord = $root.keyhole.dbroot.CobrandProto.Coord.decode(reader, reader.uint32()); + break; + } + case 3: { + message.yCoord = $root.keyhole.dbroot.CobrandProto.Coord.decode(reader, reader.uint32()); + break; + } + case 4: { + message.tiePoint = reader.int32(); + break; + } + case 5: { + message.screenSize = reader.double(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("logoUrl")) + throw $util.ProtocolError("missing required 'logoUrl'", { instance: message }); + return message; + }; + + CobrandProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.logoUrl)) + return "logoUrl: string expected"; + if (message.xCoord != null && message.hasOwnProperty("xCoord")) { + var error = $root.keyhole.dbroot.CobrandProto.Coord.verify(message.xCoord); + if (error) + return "xCoord." + error; + } + if (message.yCoord != null && message.hasOwnProperty("yCoord")) { + var error = $root.keyhole.dbroot.CobrandProto.Coord.verify(message.yCoord); + if (error) + return "yCoord." + error; + } + if (message.tiePoint != null && message.hasOwnProperty("tiePoint")) + switch (message.tiePoint) { + default: + return "tiePoint: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + break; + } + if (message.screenSize != null && message.hasOwnProperty("screenSize")) + if (typeof message.screenSize !== "number") + return "screenSize: number expected"; + return null; + }; + + CobrandProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.CobrandProto) + return object; + var message = new $root.keyhole.dbroot.CobrandProto(); + if (object.logoUrl != null) + message.logoUrl = String(object.logoUrl); + if (object.xCoord != null) { + if (typeof object.xCoord !== "object") + throw TypeError(".keyhole.dbroot.CobrandProto.xCoord: object expected"); + message.xCoord = $root.keyhole.dbroot.CobrandProto.Coord.fromObject(object.xCoord); + } + if (object.yCoord != null) { + if (typeof object.yCoord !== "object") + throw TypeError(".keyhole.dbroot.CobrandProto.yCoord: object expected"); + message.yCoord = $root.keyhole.dbroot.CobrandProto.Coord.fromObject(object.yCoord); + } + switch (object.tiePoint) { + case "TOP_LEFT": + case 0: + message.tiePoint = 0; + break; + case "TOP_CENTER": + case 1: + message.tiePoint = 1; + break; + case "TOP_RIGHT": + case 2: + message.tiePoint = 2; + break; + case "MID_LEFT": + case 3: + message.tiePoint = 3; + break; + case "MID_CENTER": + case 4: + message.tiePoint = 4; + break; + case "MID_RIGHT": + case 5: + message.tiePoint = 5; + break; + case "BOTTOM_LEFT": + case 6: + message.tiePoint = 6; + break; + case "BOTTOM_CENTER": + case 7: + message.tiePoint = 7; + break; + case "BOTTOM_RIGHT": + case 8: + message.tiePoint = 8; + break; + } + if (object.screenSize != null) + message.screenSize = Number(object.screenSize); + return message; + }; + + CobrandProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.logoUrl = ""; + object.xCoord = null; + object.yCoord = null; + object.tiePoint = options.enums === String ? "BOTTOM_LEFT" : 6; + object.screenSize = 0; + } + if (message.logoUrl != null && message.hasOwnProperty("logoUrl")) + object.logoUrl = message.logoUrl; + if (message.xCoord != null && message.hasOwnProperty("xCoord")) + object.xCoord = $root.keyhole.dbroot.CobrandProto.Coord.toObject(message.xCoord, options); + if (message.yCoord != null && message.hasOwnProperty("yCoord")) + object.yCoord = $root.keyhole.dbroot.CobrandProto.Coord.toObject(message.yCoord, options); + if (message.tiePoint != null && message.hasOwnProperty("tiePoint")) + object.tiePoint = options.enums === String ? $root.keyhole.dbroot.CobrandProto.TiePoint[message.tiePoint] : message.tiePoint; + if (message.screenSize != null && message.hasOwnProperty("screenSize")) + object.screenSize = options.json && !isFinite(message.screenSize) ? String(message.screenSize) : message.screenSize; + return object; + }; + + CobrandProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + CobrandProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.CobrandProto"; + }; + + CobrandProto.Coord = (function() { + + function Coord(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + Coord.prototype.value = 0; + Coord.prototype.isRelative = false; + + Coord.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.CobrandProto.Coord(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.value = reader.double(); + break; + } + case 2: { + message.isRelative = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("value")) + throw $util.ProtocolError("missing required 'value'", { instance: message }); + return message; + }; + + Coord.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (typeof message.value !== "number") + return "value: number expected"; + if (message.isRelative != null && message.hasOwnProperty("isRelative")) + if (typeof message.isRelative !== "boolean") + return "isRelative: boolean expected"; + return null; + }; + + Coord.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.CobrandProto.Coord) + return object; + var message = new $root.keyhole.dbroot.CobrandProto.Coord(); + if (object.value != null) + message.value = Number(object.value); + if (object.isRelative != null) + message.isRelative = Boolean(object.isRelative); + return message; + }; + + Coord.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.value = 0; + object.isRelative = false; + } + if (message.value != null && message.hasOwnProperty("value")) + object.value = options.json && !isFinite(message.value) ? String(message.value) : message.value; + if (message.isRelative != null && message.hasOwnProperty("isRelative")) + object.isRelative = message.isRelative; + return object; + }; + + Coord.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + Coord.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.CobrandProto.Coord"; + }; + + return Coord; + })(); + + CobrandProto.TiePoint = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "TOP_LEFT"] = 0; + values[valuesById[1] = "TOP_CENTER"] = 1; + values[valuesById[2] = "TOP_RIGHT"] = 2; + values[valuesById[3] = "MID_LEFT"] = 3; + values[valuesById[4] = "MID_CENTER"] = 4; + values[valuesById[5] = "MID_RIGHT"] = 5; + values[valuesById[6] = "BOTTOM_LEFT"] = 6; + values[valuesById[7] = "BOTTOM_CENTER"] = 7; + values[valuesById[8] = "BOTTOM_RIGHT"] = 8; + return values; + })(); + + return CobrandProto; + })(); + + dbroot.DatabaseDescriptionProto = (function() { + + function DatabaseDescriptionProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + DatabaseDescriptionProto.prototype.databaseName = null; + DatabaseDescriptionProto.prototype.databaseUrl = ""; + + DatabaseDescriptionProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.DatabaseDescriptionProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.databaseUrl = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("databaseUrl")) + throw $util.ProtocolError("missing required 'databaseUrl'", { instance: message }); + return message; + }; + + DatabaseDescriptionProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.databaseName != null && message.hasOwnProperty("databaseName")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.databaseName); + if (error) + return "databaseName." + error; + } + if (!$util.isString(message.databaseUrl)) + return "databaseUrl: string expected"; + return null; + }; + + DatabaseDescriptionProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.DatabaseDescriptionProto) + return object; + var message = new $root.keyhole.dbroot.DatabaseDescriptionProto(); + if (object.databaseName != null) { + if (typeof object.databaseName !== "object") + throw TypeError(".keyhole.dbroot.DatabaseDescriptionProto.databaseName: object expected"); + message.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.databaseName); + } + if (object.databaseUrl != null) + message.databaseUrl = String(object.databaseUrl); + return message; + }; + + DatabaseDescriptionProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.databaseName = null; + object.databaseUrl = ""; + } + if (message.databaseName != null && message.hasOwnProperty("databaseName")) + object.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.databaseName, options); + if (message.databaseUrl != null && message.hasOwnProperty("databaseUrl")) + object.databaseUrl = message.databaseUrl; + return object; + }; + + DatabaseDescriptionProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DatabaseDescriptionProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.DatabaseDescriptionProto"; + }; + + return DatabaseDescriptionProto; + })(); + + dbroot.ConfigScriptProto = (function() { + + function ConfigScriptProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + ConfigScriptProto.prototype.scriptName = ""; + ConfigScriptProto.prototype.scriptData = ""; + + ConfigScriptProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.ConfigScriptProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.scriptName = reader.string(); + break; + } + case 2: { + message.scriptData = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("scriptName")) + throw $util.ProtocolError("missing required 'scriptName'", { instance: message }); + if (!message.hasOwnProperty("scriptData")) + throw $util.ProtocolError("missing required 'scriptData'", { instance: message }); + return message; + }; + + ConfigScriptProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.scriptName)) + return "scriptName: string expected"; + if (!$util.isString(message.scriptData)) + return "scriptData: string expected"; + return null; + }; + + ConfigScriptProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.ConfigScriptProto) + return object; + var message = new $root.keyhole.dbroot.ConfigScriptProto(); + if (object.scriptName != null) + message.scriptName = String(object.scriptName); + if (object.scriptData != null) + message.scriptData = String(object.scriptData); + return message; + }; + + ConfigScriptProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.scriptName = ""; + object.scriptData = ""; + } + if (message.scriptName != null && message.hasOwnProperty("scriptName")) + object.scriptName = message.scriptName; + if (message.scriptData != null && message.hasOwnProperty("scriptData")) + object.scriptData = message.scriptData; + return object; + }; + + ConfigScriptProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ConfigScriptProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.ConfigScriptProto"; + }; + + return ConfigScriptProto; + })(); + + dbroot.SwoopParamsProto = (function() { + + function SwoopParamsProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SwoopParamsProto.prototype.startDistInMeters = 0; + + SwoopParamsProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.SwoopParamsProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.startDistInMeters = reader.double(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SwoopParamsProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.startDistInMeters != null && message.hasOwnProperty("startDistInMeters")) + if (typeof message.startDistInMeters !== "number") + return "startDistInMeters: number expected"; + return null; + }; + + SwoopParamsProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.SwoopParamsProto) + return object; + var message = new $root.keyhole.dbroot.SwoopParamsProto(); + if (object.startDistInMeters != null) + message.startDistInMeters = Number(object.startDistInMeters); + return message; + }; + + SwoopParamsProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.startDistInMeters = 0; + if (message.startDistInMeters != null && message.hasOwnProperty("startDistInMeters")) + object.startDistInMeters = options.json && !isFinite(message.startDistInMeters) ? String(message.startDistInMeters) : message.startDistInMeters; + return object; + }; + + SwoopParamsProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SwoopParamsProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.SwoopParamsProto"; + }; + + return SwoopParamsProto; + })(); + + dbroot.PostingServerProto = (function() { + + function PostingServerProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + PostingServerProto.prototype.name = null; + PostingServerProto.prototype.baseUrl = null; + PostingServerProto.prototype.postWizardPath = null; + PostingServerProto.prototype.fileSubmitPath = null; + + PostingServerProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.PostingServerProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.name = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.baseUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.postWizardPath = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 4: { + message.fileSubmitPath = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + PostingServerProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.name); + if (error) + return "name." + error; + } + if (message.baseUrl != null && message.hasOwnProperty("baseUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.baseUrl); + if (error) + return "baseUrl." + error; + } + if (message.postWizardPath != null && message.hasOwnProperty("postWizardPath")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.postWizardPath); + if (error) + return "postWizardPath." + error; + } + if (message.fileSubmitPath != null && message.hasOwnProperty("fileSubmitPath")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.fileSubmitPath); + if (error) + return "fileSubmitPath." + error; + } + return null; + }; + + PostingServerProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.PostingServerProto) + return object; + var message = new $root.keyhole.dbroot.PostingServerProto(); + if (object.name != null) { + if (typeof object.name !== "object") + throw TypeError(".keyhole.dbroot.PostingServerProto.name: object expected"); + message.name = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.name); + } + if (object.baseUrl != null) { + if (typeof object.baseUrl !== "object") + throw TypeError(".keyhole.dbroot.PostingServerProto.baseUrl: object expected"); + message.baseUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.baseUrl); + } + if (object.postWizardPath != null) { + if (typeof object.postWizardPath !== "object") + throw TypeError(".keyhole.dbroot.PostingServerProto.postWizardPath: object expected"); + message.postWizardPath = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.postWizardPath); + } + if (object.fileSubmitPath != null) { + if (typeof object.fileSubmitPath !== "object") + throw TypeError(".keyhole.dbroot.PostingServerProto.fileSubmitPath: object expected"); + message.fileSubmitPath = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.fileSubmitPath); + } + return message; + }; + + PostingServerProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = null; + object.baseUrl = null; + object.postWizardPath = null; + object.fileSubmitPath = null; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.name, options); + if (message.baseUrl != null && message.hasOwnProperty("baseUrl")) + object.baseUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.baseUrl, options); + if (message.postWizardPath != null && message.hasOwnProperty("postWizardPath")) + object.postWizardPath = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.postWizardPath, options); + if (message.fileSubmitPath != null && message.hasOwnProperty("fileSubmitPath")) + object.fileSubmitPath = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.fileSubmitPath, options); + return object; + }; + + PostingServerProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PostingServerProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.PostingServerProto"; + }; + + return PostingServerProto; + })(); + + dbroot.PlanetaryDatabaseProto = (function() { + + function PlanetaryDatabaseProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + PlanetaryDatabaseProto.prototype.url = null; + PlanetaryDatabaseProto.prototype.name = null; + + PlanetaryDatabaseProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.PlanetaryDatabaseProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.name = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("url")) + throw $util.ProtocolError("missing required 'url'", { instance: message }); + if (!message.hasOwnProperty("name")) + throw $util.ProtocolError("missing required 'name'", { instance: message }); + return message; + }; + + PlanetaryDatabaseProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.name); + if (error) + return "name." + error; + } + return null; + }; + + PlanetaryDatabaseProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.PlanetaryDatabaseProto) + return object; + var message = new $root.keyhole.dbroot.PlanetaryDatabaseProto(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.PlanetaryDatabaseProto.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + if (object.name != null) { + if (typeof object.name !== "object") + throw TypeError(".keyhole.dbroot.PlanetaryDatabaseProto.name: object expected"); + message.name = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.name); + } + return message; + }; + + PlanetaryDatabaseProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = null; + object.name = null; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + if (message.name != null && message.hasOwnProperty("name")) + object.name = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.name, options); + return object; + }; + + PlanetaryDatabaseProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PlanetaryDatabaseProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.PlanetaryDatabaseProto"; + }; + + return PlanetaryDatabaseProto; + })(); + + dbroot.LogServerProto = (function() { + + function LogServerProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + LogServerProto.prototype.url = null; + LogServerProto.prototype.enable = false; + LogServerProto.prototype.throttlingFactor = 1; + + LogServerProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.LogServerProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.enable = reader.bool(); + break; + } + case 3: { + message.throttlingFactor = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + LogServerProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + if (message.enable != null && message.hasOwnProperty("enable")) + if (typeof message.enable !== "boolean") + return "enable: boolean expected"; + if (message.throttlingFactor != null && message.hasOwnProperty("throttlingFactor")) + if (!$util.isInteger(message.throttlingFactor)) + return "throttlingFactor: integer expected"; + return null; + }; + + LogServerProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.LogServerProto) + return object; + var message = new $root.keyhole.dbroot.LogServerProto(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.LogServerProto.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + if (object.enable != null) + message.enable = Boolean(object.enable); + if (object.throttlingFactor != null) + message.throttlingFactor = object.throttlingFactor | 0; + return message; + }; + + LogServerProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = null; + object.enable = false; + object.throttlingFactor = 1; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + if (message.enable != null && message.hasOwnProperty("enable")) + object.enable = message.enable; + if (message.throttlingFactor != null && message.hasOwnProperty("throttlingFactor")) + object.throttlingFactor = message.throttlingFactor; + return object; + }; + + LogServerProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + LogServerProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.LogServerProto"; + }; + + return LogServerProto; + })(); + + dbroot.EndSnippetProto = (function() { + + function EndSnippetProto(properties) { + this.mfeDomains = []; + this.searchTab = []; + this.cobrandInfo = []; + this.validDatabase = []; + this.configScript = []; + this.planetaryDatabase = []; + this.filmstripConfig = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + EndSnippetProto.prototype.model = null; + EndSnippetProto.prototype.authServerUrl = null; + EndSnippetProto.prototype.disableAuthentication = false; + EndSnippetProto.prototype.mfeDomains = $util.emptyArray; + EndSnippetProto.prototype.mfeLangParam = "hl=$5Bhl5D"; + EndSnippetProto.prototype.adsUrlPatterns = ""; + EndSnippetProto.prototype.reverseGeocoderUrl = null; + EndSnippetProto.prototype.reverseGeocoderProtocolVersion = 3; + EndSnippetProto.prototype.skyDatabaseIsAvailable = true; + EndSnippetProto.prototype.skyDatabaseUrl = null; + EndSnippetProto.prototype.defaultWebPageIntlUrl = null; + EndSnippetProto.prototype.numStartUpTips = 17; + EndSnippetProto.prototype.startUpTipsUrl = null; + EndSnippetProto.prototype.numProStartUpTips = 0; + EndSnippetProto.prototype.proStartUpTipsUrl = null; + EndSnippetProto.prototype.startupTipsIntlUrl = null; + EndSnippetProto.prototype.userGuideIntlUrl = null; + EndSnippetProto.prototype.supportCenterIntlUrl = null; + EndSnippetProto.prototype.businessListingIntlUrl = null; + EndSnippetProto.prototype.supportAnswerIntlUrl = null; + EndSnippetProto.prototype.supportTopicIntlUrl = null; + EndSnippetProto.prototype.supportRequestIntlUrl = null; + EndSnippetProto.prototype.earthIntlUrl = null; + EndSnippetProto.prototype.addContentUrl = null; + EndSnippetProto.prototype.sketchupNotInstalledUrl = null; + EndSnippetProto.prototype.sketchupErrorUrl = null; + EndSnippetProto.prototype.freeLicenseUrl = null; + EndSnippetProto.prototype.proLicenseUrl = null; + EndSnippetProto.prototype.tutorialUrl = null; + EndSnippetProto.prototype.keyboardShortcutsUrl = null; + EndSnippetProto.prototype.releaseNotesUrl = null; + EndSnippetProto.prototype.hideUserData = false; + EndSnippetProto.prototype.useGeLogo = true; + EndSnippetProto.prototype.dioramaDescriptionUrlBase = null; + EndSnippetProto.prototype.dioramaDefaultColor = 4291281607; + EndSnippetProto.prototype.dioramaBlacklistUrl = null; + EndSnippetProto.prototype.clientOptions = null; + EndSnippetProto.prototype.fetchingOptions = null; + EndSnippetProto.prototype.timeMachineOptions = null; + EndSnippetProto.prototype.csiOptions = null; + EndSnippetProto.prototype.searchTab = $util.emptyArray; + EndSnippetProto.prototype.cobrandInfo = $util.emptyArray; + EndSnippetProto.prototype.validDatabase = $util.emptyArray; + EndSnippetProto.prototype.configScript = $util.emptyArray; + EndSnippetProto.prototype.deauthServerUrl = null; + EndSnippetProto.prototype.swoopParameters = null; + EndSnippetProto.prototype.bbsServerInfo = null; + EndSnippetProto.prototype.dataErrorServerInfo = null; + EndSnippetProto.prototype.planetaryDatabase = $util.emptyArray; + EndSnippetProto.prototype.logServer = null; + EndSnippetProto.prototype.autopiaOptions = null; + EndSnippetProto.prototype.searchConfig = null; + EndSnippetProto.prototype.searchInfo = null; + EndSnippetProto.prototype.elevationServiceBaseUrl = "http://maps.google.com/maps/api/elevation/"; + EndSnippetProto.prototype.elevationProfileQueryDelay = 500; + EndSnippetProto.prototype.proUpgradeUrl = null; + EndSnippetProto.prototype.earthCommunityUrl = null; + EndSnippetProto.prototype.googleMapsUrl = null; + EndSnippetProto.prototype.sharingUrl = null; + EndSnippetProto.prototype.privacyPolicyUrl = null; + EndSnippetProto.prototype.doGplusUserCheck = false; + EndSnippetProto.prototype.rocktreeDataProto = null; + EndSnippetProto.prototype.filmstripConfig = $util.emptyArray; + EndSnippetProto.prototype.showSigninButton = false; + EndSnippetProto.prototype.proMeasureUpsellUrl = null; + EndSnippetProto.prototype.proPrintUpsellUrl = null; + EndSnippetProto.prototype.starDataProto = null; + EndSnippetProto.prototype.feedbackUrl = null; + EndSnippetProto.prototype.oauth2LoginUrl = null; + + EndSnippetProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.model = $root.keyhole.dbroot.PlanetModelProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.authServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.disableAuthentication = reader.bool(); + break; + } + case 4: { + if (!(message.mfeDomains && message.mfeDomains.length)) + message.mfeDomains = []; + message.mfeDomains.push($root.keyhole.dbroot.MfeDomainFeaturesProto.decode(reader, reader.uint32())); + break; + } + case 5: { + message.mfeLangParam = reader.string(); + break; + } + case 6: { + message.adsUrlPatterns = reader.string(); + break; + } + case 7: { + message.reverseGeocoderUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 8: { + message.reverseGeocoderProtocolVersion = reader.int32(); + break; + } + case 9: { + message.skyDatabaseIsAvailable = reader.bool(); + break; + } + case 10: { + message.skyDatabaseUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 11: { + message.defaultWebPageIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 12: { + message.numStartUpTips = reader.int32(); + break; + } + case 13: { + message.startUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 51: { + message.numProStartUpTips = reader.int32(); + break; + } + case 52: { + message.proStartUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 64: { + message.startupTipsIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 14: { + message.userGuideIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 15: { + message.supportCenterIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 16: { + message.businessListingIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 17: { + message.supportAnswerIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 18: { + message.supportTopicIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 19: { + message.supportRequestIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 20: { + message.earthIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 21: { + message.addContentUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 22: { + message.sketchupNotInstalledUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 23: { + message.sketchupErrorUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 24: { + message.freeLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 25: { + message.proLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 48: { + message.tutorialUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 49: { + message.keyboardShortcutsUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 50: { + message.releaseNotesUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 26: { + message.hideUserData = reader.bool(); + break; + } + case 27: { + message.useGeLogo = reader.bool(); + break; + } + case 28: { + message.dioramaDescriptionUrlBase = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 29: { + message.dioramaDefaultColor = reader.uint32(); + break; + } + case 53: { + message.dioramaBlacklistUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 30: { + message.clientOptions = $root.keyhole.dbroot.ClientOptionsProto.decode(reader, reader.uint32()); + break; + } + case 31: { + message.fetchingOptions = $root.keyhole.dbroot.FetchingOptionsProto.decode(reader, reader.uint32()); + break; + } + case 32: { + message.timeMachineOptions = $root.keyhole.dbroot.TimeMachineOptionsProto.decode(reader, reader.uint32()); + break; + } + case 33: { + message.csiOptions = $root.keyhole.dbroot.CSIOptionsProto.decode(reader, reader.uint32()); + break; + } + case 34: { + if (!(message.searchTab && message.searchTab.length)) + message.searchTab = []; + message.searchTab.push($root.keyhole.dbroot.SearchTabProto.decode(reader, reader.uint32())); + break; + } + case 35: { + if (!(message.cobrandInfo && message.cobrandInfo.length)) + message.cobrandInfo = []; + message.cobrandInfo.push($root.keyhole.dbroot.CobrandProto.decode(reader, reader.uint32())); + break; + } + case 36: { + if (!(message.validDatabase && message.validDatabase.length)) + message.validDatabase = []; + message.validDatabase.push($root.keyhole.dbroot.DatabaseDescriptionProto.decode(reader, reader.uint32())); + break; + } + case 37: { + if (!(message.configScript && message.configScript.length)) + message.configScript = []; + message.configScript.push($root.keyhole.dbroot.ConfigScriptProto.decode(reader, reader.uint32())); + break; + } + case 38: { + message.deauthServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 39: { + message.swoopParameters = $root.keyhole.dbroot.SwoopParamsProto.decode(reader, reader.uint32()); + break; + } + case 40: { + message.bbsServerInfo = $root.keyhole.dbroot.PostingServerProto.decode(reader, reader.uint32()); + break; + } + case 41: { + message.dataErrorServerInfo = $root.keyhole.dbroot.PostingServerProto.decode(reader, reader.uint32()); + break; + } + case 42: { + if (!(message.planetaryDatabase && message.planetaryDatabase.length)) + message.planetaryDatabase = []; + message.planetaryDatabase.push($root.keyhole.dbroot.PlanetaryDatabaseProto.decode(reader, reader.uint32())); + break; + } + case 43: { + message.logServer = $root.keyhole.dbroot.LogServerProto.decode(reader, reader.uint32()); + break; + } + case 44: { + message.autopiaOptions = $root.keyhole.dbroot.AutopiaOptionsProto.decode(reader, reader.uint32()); + break; + } + case 54: { + message.searchConfig = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.decode(reader, reader.uint32()); + break; + } + case 45: { + message.searchInfo = $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto.decode(reader, reader.uint32()); + break; + } + case 46: { + message.elevationServiceBaseUrl = reader.string(); + break; + } + case 47: { + message.elevationProfileQueryDelay = reader.int32(); + break; + } + case 55: { + message.proUpgradeUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 56: { + message.earthCommunityUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 57: { + message.googleMapsUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 58: { + message.sharingUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 59: { + message.privacyPolicyUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 60: { + message.doGplusUserCheck = reader.bool(); + break; + } + case 61: { + message.rocktreeDataProto = $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto.decode(reader, reader.uint32()); + break; + } + case 62: { + if (!(message.filmstripConfig && message.filmstripConfig.length)) + message.filmstripConfig = []; + message.filmstripConfig.push($root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.decode(reader, reader.uint32())); + break; + } + case 63: { + message.showSigninButton = reader.bool(); + break; + } + case 65: { + message.proMeasureUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 66: { + message.proPrintUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 67: { + message.starDataProto = $root.keyhole.dbroot.EndSnippetProto.StarDataProto.decode(reader, reader.uint32()); + break; + } + case 68: { + message.feedbackUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 69: { + message.oauth2LoginUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + EndSnippetProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.model != null && message.hasOwnProperty("model")) { + var error = $root.keyhole.dbroot.PlanetModelProto.verify(message.model); + if (error) + return "model." + error; + } + if (message.authServerUrl != null && message.hasOwnProperty("authServerUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.authServerUrl); + if (error) + return "authServerUrl." + error; + } + if (message.disableAuthentication != null && message.hasOwnProperty("disableAuthentication")) + if (typeof message.disableAuthentication !== "boolean") + return "disableAuthentication: boolean expected"; + if (message.mfeDomains != null && message.hasOwnProperty("mfeDomains")) { + if (!Array.isArray(message.mfeDomains)) + return "mfeDomains: array expected"; + for (var i = 0; i < message.mfeDomains.length; ++i) { + var error = $root.keyhole.dbroot.MfeDomainFeaturesProto.verify(message.mfeDomains[i]); + if (error) + return "mfeDomains." + error; + } + } + if (message.mfeLangParam != null && message.hasOwnProperty("mfeLangParam")) + if (!$util.isString(message.mfeLangParam)) + return "mfeLangParam: string expected"; + if (message.adsUrlPatterns != null && message.hasOwnProperty("adsUrlPatterns")) + if (!$util.isString(message.adsUrlPatterns)) + return "adsUrlPatterns: string expected"; + if (message.reverseGeocoderUrl != null && message.hasOwnProperty("reverseGeocoderUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.reverseGeocoderUrl); + if (error) + return "reverseGeocoderUrl." + error; + } + if (message.reverseGeocoderProtocolVersion != null && message.hasOwnProperty("reverseGeocoderProtocolVersion")) + if (!$util.isInteger(message.reverseGeocoderProtocolVersion)) + return "reverseGeocoderProtocolVersion: integer expected"; + if (message.skyDatabaseIsAvailable != null && message.hasOwnProperty("skyDatabaseIsAvailable")) + if (typeof message.skyDatabaseIsAvailable !== "boolean") + return "skyDatabaseIsAvailable: boolean expected"; + if (message.skyDatabaseUrl != null && message.hasOwnProperty("skyDatabaseUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.skyDatabaseUrl); + if (error) + return "skyDatabaseUrl." + error; + } + if (message.defaultWebPageIntlUrl != null && message.hasOwnProperty("defaultWebPageIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.defaultWebPageIntlUrl); + if (error) + return "defaultWebPageIntlUrl." + error; + } + if (message.numStartUpTips != null && message.hasOwnProperty("numStartUpTips")) + if (!$util.isInteger(message.numStartUpTips)) + return "numStartUpTips: integer expected"; + if (message.startUpTipsUrl != null && message.hasOwnProperty("startUpTipsUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.startUpTipsUrl); + if (error) + return "startUpTipsUrl." + error; + } + if (message.numProStartUpTips != null && message.hasOwnProperty("numProStartUpTips")) + if (!$util.isInteger(message.numProStartUpTips)) + return "numProStartUpTips: integer expected"; + if (message.proStartUpTipsUrl != null && message.hasOwnProperty("proStartUpTipsUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.proStartUpTipsUrl); + if (error) + return "proStartUpTipsUrl." + error; + } + if (message.startupTipsIntlUrl != null && message.hasOwnProperty("startupTipsIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.startupTipsIntlUrl); + if (error) + return "startupTipsIntlUrl." + error; + } + if (message.userGuideIntlUrl != null && message.hasOwnProperty("userGuideIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.userGuideIntlUrl); + if (error) + return "userGuideIntlUrl." + error; + } + if (message.supportCenterIntlUrl != null && message.hasOwnProperty("supportCenterIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.supportCenterIntlUrl); + if (error) + return "supportCenterIntlUrl." + error; + } + if (message.businessListingIntlUrl != null && message.hasOwnProperty("businessListingIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.businessListingIntlUrl); + if (error) + return "businessListingIntlUrl." + error; + } + if (message.supportAnswerIntlUrl != null && message.hasOwnProperty("supportAnswerIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.supportAnswerIntlUrl); + if (error) + return "supportAnswerIntlUrl." + error; + } + if (message.supportTopicIntlUrl != null && message.hasOwnProperty("supportTopicIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.supportTopicIntlUrl); + if (error) + return "supportTopicIntlUrl." + error; + } + if (message.supportRequestIntlUrl != null && message.hasOwnProperty("supportRequestIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.supportRequestIntlUrl); + if (error) + return "supportRequestIntlUrl." + error; + } + if (message.earthIntlUrl != null && message.hasOwnProperty("earthIntlUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.earthIntlUrl); + if (error) + return "earthIntlUrl." + error; + } + if (message.addContentUrl != null && message.hasOwnProperty("addContentUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.addContentUrl); + if (error) + return "addContentUrl." + error; + } + if (message.sketchupNotInstalledUrl != null && message.hasOwnProperty("sketchupNotInstalledUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.sketchupNotInstalledUrl); + if (error) + return "sketchupNotInstalledUrl." + error; + } + if (message.sketchupErrorUrl != null && message.hasOwnProperty("sketchupErrorUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.sketchupErrorUrl); + if (error) + return "sketchupErrorUrl." + error; + } + if (message.freeLicenseUrl != null && message.hasOwnProperty("freeLicenseUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.freeLicenseUrl); + if (error) + return "freeLicenseUrl." + error; + } + if (message.proLicenseUrl != null && message.hasOwnProperty("proLicenseUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.proLicenseUrl); + if (error) + return "proLicenseUrl." + error; + } + if (message.tutorialUrl != null && message.hasOwnProperty("tutorialUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.tutorialUrl); + if (error) + return "tutorialUrl." + error; + } + if (message.keyboardShortcutsUrl != null && message.hasOwnProperty("keyboardShortcutsUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.keyboardShortcutsUrl); + if (error) + return "keyboardShortcutsUrl." + error; + } + if (message.releaseNotesUrl != null && message.hasOwnProperty("releaseNotesUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.releaseNotesUrl); + if (error) + return "releaseNotesUrl." + error; + } + if (message.hideUserData != null && message.hasOwnProperty("hideUserData")) + if (typeof message.hideUserData !== "boolean") + return "hideUserData: boolean expected"; + if (message.useGeLogo != null && message.hasOwnProperty("useGeLogo")) + if (typeof message.useGeLogo !== "boolean") + return "useGeLogo: boolean expected"; + if (message.dioramaDescriptionUrlBase != null && message.hasOwnProperty("dioramaDescriptionUrlBase")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.dioramaDescriptionUrlBase); + if (error) + return "dioramaDescriptionUrlBase." + error; + } + if (message.dioramaDefaultColor != null && message.hasOwnProperty("dioramaDefaultColor")) + if (!$util.isInteger(message.dioramaDefaultColor)) + return "dioramaDefaultColor: integer expected"; + if (message.dioramaBlacklistUrl != null && message.hasOwnProperty("dioramaBlacklistUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.dioramaBlacklistUrl); + if (error) + return "dioramaBlacklistUrl." + error; + } + if (message.clientOptions != null && message.hasOwnProperty("clientOptions")) { + var error = $root.keyhole.dbroot.ClientOptionsProto.verify(message.clientOptions); + if (error) + return "clientOptions." + error; + } + if (message.fetchingOptions != null && message.hasOwnProperty("fetchingOptions")) { + var error = $root.keyhole.dbroot.FetchingOptionsProto.verify(message.fetchingOptions); + if (error) + return "fetchingOptions." + error; + } + if (message.timeMachineOptions != null && message.hasOwnProperty("timeMachineOptions")) { + var error = $root.keyhole.dbroot.TimeMachineOptionsProto.verify(message.timeMachineOptions); + if (error) + return "timeMachineOptions." + error; + } + if (message.csiOptions != null && message.hasOwnProperty("csiOptions")) { + var error = $root.keyhole.dbroot.CSIOptionsProto.verify(message.csiOptions); + if (error) + return "csiOptions." + error; + } + if (message.searchTab != null && message.hasOwnProperty("searchTab")) { + if (!Array.isArray(message.searchTab)) + return "searchTab: array expected"; + for (var i = 0; i < message.searchTab.length; ++i) { + var error = $root.keyhole.dbroot.SearchTabProto.verify(message.searchTab[i]); + if (error) + return "searchTab." + error; + } + } + if (message.cobrandInfo != null && message.hasOwnProperty("cobrandInfo")) { + if (!Array.isArray(message.cobrandInfo)) + return "cobrandInfo: array expected"; + for (var i = 0; i < message.cobrandInfo.length; ++i) { + var error = $root.keyhole.dbroot.CobrandProto.verify(message.cobrandInfo[i]); + if (error) + return "cobrandInfo." + error; + } + } + if (message.validDatabase != null && message.hasOwnProperty("validDatabase")) { + if (!Array.isArray(message.validDatabase)) + return "validDatabase: array expected"; + for (var i = 0; i < message.validDatabase.length; ++i) { + var error = $root.keyhole.dbroot.DatabaseDescriptionProto.verify(message.validDatabase[i]); + if (error) + return "validDatabase." + error; + } + } + if (message.configScript != null && message.hasOwnProperty("configScript")) { + if (!Array.isArray(message.configScript)) + return "configScript: array expected"; + for (var i = 0; i < message.configScript.length; ++i) { + var error = $root.keyhole.dbroot.ConfigScriptProto.verify(message.configScript[i]); + if (error) + return "configScript." + error; + } + } + if (message.deauthServerUrl != null && message.hasOwnProperty("deauthServerUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.deauthServerUrl); + if (error) + return "deauthServerUrl." + error; + } + if (message.swoopParameters != null && message.hasOwnProperty("swoopParameters")) { + var error = $root.keyhole.dbroot.SwoopParamsProto.verify(message.swoopParameters); + if (error) + return "swoopParameters." + error; + } + if (message.bbsServerInfo != null && message.hasOwnProperty("bbsServerInfo")) { + var error = $root.keyhole.dbroot.PostingServerProto.verify(message.bbsServerInfo); + if (error) + return "bbsServerInfo." + error; + } + if (message.dataErrorServerInfo != null && message.hasOwnProperty("dataErrorServerInfo")) { + var error = $root.keyhole.dbroot.PostingServerProto.verify(message.dataErrorServerInfo); + if (error) + return "dataErrorServerInfo." + error; + } + if (message.planetaryDatabase != null && message.hasOwnProperty("planetaryDatabase")) { + if (!Array.isArray(message.planetaryDatabase)) + return "planetaryDatabase: array expected"; + for (var i = 0; i < message.planetaryDatabase.length; ++i) { + var error = $root.keyhole.dbroot.PlanetaryDatabaseProto.verify(message.planetaryDatabase[i]); + if (error) + return "planetaryDatabase." + error; + } + } + if (message.logServer != null && message.hasOwnProperty("logServer")) { + var error = $root.keyhole.dbroot.LogServerProto.verify(message.logServer); + if (error) + return "logServer." + error; + } + if (message.autopiaOptions != null && message.hasOwnProperty("autopiaOptions")) { + var error = $root.keyhole.dbroot.AutopiaOptionsProto.verify(message.autopiaOptions); + if (error) + return "autopiaOptions." + error; + } + if (message.searchConfig != null && message.hasOwnProperty("searchConfig")) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.verify(message.searchConfig); + if (error) + return "searchConfig." + error; + } + if (message.searchInfo != null && message.hasOwnProperty("searchInfo")) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto.verify(message.searchInfo); + if (error) + return "searchInfo." + error; + } + if (message.elevationServiceBaseUrl != null && message.hasOwnProperty("elevationServiceBaseUrl")) + if (!$util.isString(message.elevationServiceBaseUrl)) + return "elevationServiceBaseUrl: string expected"; + if (message.elevationProfileQueryDelay != null && message.hasOwnProperty("elevationProfileQueryDelay")) + if (!$util.isInteger(message.elevationProfileQueryDelay)) + return "elevationProfileQueryDelay: integer expected"; + if (message.proUpgradeUrl != null && message.hasOwnProperty("proUpgradeUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.proUpgradeUrl); + if (error) + return "proUpgradeUrl." + error; + } + if (message.earthCommunityUrl != null && message.hasOwnProperty("earthCommunityUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.earthCommunityUrl); + if (error) + return "earthCommunityUrl." + error; + } + if (message.googleMapsUrl != null && message.hasOwnProperty("googleMapsUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.googleMapsUrl); + if (error) + return "googleMapsUrl." + error; + } + if (message.sharingUrl != null && message.hasOwnProperty("sharingUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.sharingUrl); + if (error) + return "sharingUrl." + error; + } + if (message.privacyPolicyUrl != null && message.hasOwnProperty("privacyPolicyUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.privacyPolicyUrl); + if (error) + return "privacyPolicyUrl." + error; + } + if (message.doGplusUserCheck != null && message.hasOwnProperty("doGplusUserCheck")) + if (typeof message.doGplusUserCheck !== "boolean") + return "doGplusUserCheck: boolean expected"; + if (message.rocktreeDataProto != null && message.hasOwnProperty("rocktreeDataProto")) { + var error = $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto.verify(message.rocktreeDataProto); + if (error) + return "rocktreeDataProto." + error; + } + if (message.filmstripConfig != null && message.hasOwnProperty("filmstripConfig")) { + if (!Array.isArray(message.filmstripConfig)) + return "filmstripConfig: array expected"; + for (var i = 0; i < message.filmstripConfig.length; ++i) { + var error = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.verify(message.filmstripConfig[i]); + if (error) + return "filmstripConfig." + error; + } + } + if (message.showSigninButton != null && message.hasOwnProperty("showSigninButton")) + if (typeof message.showSigninButton !== "boolean") + return "showSigninButton: boolean expected"; + if (message.proMeasureUpsellUrl != null && message.hasOwnProperty("proMeasureUpsellUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.proMeasureUpsellUrl); + if (error) + return "proMeasureUpsellUrl." + error; + } + if (message.proPrintUpsellUrl != null && message.hasOwnProperty("proPrintUpsellUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.proPrintUpsellUrl); + if (error) + return "proPrintUpsellUrl." + error; + } + if (message.starDataProto != null && message.hasOwnProperty("starDataProto")) { + var error = $root.keyhole.dbroot.EndSnippetProto.StarDataProto.verify(message.starDataProto); + if (error) + return "starDataProto." + error; + } + if (message.feedbackUrl != null && message.hasOwnProperty("feedbackUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.feedbackUrl); + if (error) + return "feedbackUrl." + error; + } + if (message.oauth2LoginUrl != null && message.hasOwnProperty("oauth2LoginUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.oauth2LoginUrl); + if (error) + return "oauth2LoginUrl." + error; + } + return null; + }; + + EndSnippetProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto(); + if (object.model != null) { + if (typeof object.model !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.model: object expected"); + message.model = $root.keyhole.dbroot.PlanetModelProto.fromObject(object.model); + } + if (object.authServerUrl != null) { + if (typeof object.authServerUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.authServerUrl: object expected"); + message.authServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.authServerUrl); + } + if (object.disableAuthentication != null) + message.disableAuthentication = Boolean(object.disableAuthentication); + if (object.mfeDomains) { + if (!Array.isArray(object.mfeDomains)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.mfeDomains: array expected"); + message.mfeDomains = []; + for (var i = 0; i < object.mfeDomains.length; ++i) { + if (typeof object.mfeDomains[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.mfeDomains: object expected"); + message.mfeDomains[i] = $root.keyhole.dbroot.MfeDomainFeaturesProto.fromObject(object.mfeDomains[i]); + } + } + if (object.mfeLangParam != null) + message.mfeLangParam = String(object.mfeLangParam); + if (object.adsUrlPatterns != null) + message.adsUrlPatterns = String(object.adsUrlPatterns); + if (object.reverseGeocoderUrl != null) { + if (typeof object.reverseGeocoderUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.reverseGeocoderUrl: object expected"); + message.reverseGeocoderUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.reverseGeocoderUrl); + } + if (object.reverseGeocoderProtocolVersion != null) + message.reverseGeocoderProtocolVersion = object.reverseGeocoderProtocolVersion | 0; + if (object.skyDatabaseIsAvailable != null) + message.skyDatabaseIsAvailable = Boolean(object.skyDatabaseIsAvailable); + if (object.skyDatabaseUrl != null) { + if (typeof object.skyDatabaseUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.skyDatabaseUrl: object expected"); + message.skyDatabaseUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.skyDatabaseUrl); + } + if (object.defaultWebPageIntlUrl != null) { + if (typeof object.defaultWebPageIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.defaultWebPageIntlUrl: object expected"); + message.defaultWebPageIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.defaultWebPageIntlUrl); + } + if (object.numStartUpTips != null) + message.numStartUpTips = object.numStartUpTips | 0; + if (object.startUpTipsUrl != null) { + if (typeof object.startUpTipsUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.startUpTipsUrl: object expected"); + message.startUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.startUpTipsUrl); + } + if (object.numProStartUpTips != null) + message.numProStartUpTips = object.numProStartUpTips | 0; + if (object.proStartUpTipsUrl != null) { + if (typeof object.proStartUpTipsUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.proStartUpTipsUrl: object expected"); + message.proStartUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.proStartUpTipsUrl); + } + if (object.startupTipsIntlUrl != null) { + if (typeof object.startupTipsIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.startupTipsIntlUrl: object expected"); + message.startupTipsIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.startupTipsIntlUrl); + } + if (object.userGuideIntlUrl != null) { + if (typeof object.userGuideIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.userGuideIntlUrl: object expected"); + message.userGuideIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.userGuideIntlUrl); + } + if (object.supportCenterIntlUrl != null) { + if (typeof object.supportCenterIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.supportCenterIntlUrl: object expected"); + message.supportCenterIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.supportCenterIntlUrl); + } + if (object.businessListingIntlUrl != null) { + if (typeof object.businessListingIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.businessListingIntlUrl: object expected"); + message.businessListingIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.businessListingIntlUrl); + } + if (object.supportAnswerIntlUrl != null) { + if (typeof object.supportAnswerIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.supportAnswerIntlUrl: object expected"); + message.supportAnswerIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.supportAnswerIntlUrl); + } + if (object.supportTopicIntlUrl != null) { + if (typeof object.supportTopicIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.supportTopicIntlUrl: object expected"); + message.supportTopicIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.supportTopicIntlUrl); + } + if (object.supportRequestIntlUrl != null) { + if (typeof object.supportRequestIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.supportRequestIntlUrl: object expected"); + message.supportRequestIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.supportRequestIntlUrl); + } + if (object.earthIntlUrl != null) { + if (typeof object.earthIntlUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.earthIntlUrl: object expected"); + message.earthIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.earthIntlUrl); + } + if (object.addContentUrl != null) { + if (typeof object.addContentUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.addContentUrl: object expected"); + message.addContentUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.addContentUrl); + } + if (object.sketchupNotInstalledUrl != null) { + if (typeof object.sketchupNotInstalledUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.sketchupNotInstalledUrl: object expected"); + message.sketchupNotInstalledUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.sketchupNotInstalledUrl); + } + if (object.sketchupErrorUrl != null) { + if (typeof object.sketchupErrorUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.sketchupErrorUrl: object expected"); + message.sketchupErrorUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.sketchupErrorUrl); + } + if (object.freeLicenseUrl != null) { + if (typeof object.freeLicenseUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.freeLicenseUrl: object expected"); + message.freeLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.freeLicenseUrl); + } + if (object.proLicenseUrl != null) { + if (typeof object.proLicenseUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.proLicenseUrl: object expected"); + message.proLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.proLicenseUrl); + } + if (object.tutorialUrl != null) { + if (typeof object.tutorialUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.tutorialUrl: object expected"); + message.tutorialUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.tutorialUrl); + } + if (object.keyboardShortcutsUrl != null) { + if (typeof object.keyboardShortcutsUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.keyboardShortcutsUrl: object expected"); + message.keyboardShortcutsUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.keyboardShortcutsUrl); + } + if (object.releaseNotesUrl != null) { + if (typeof object.releaseNotesUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.releaseNotesUrl: object expected"); + message.releaseNotesUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.releaseNotesUrl); + } + if (object.hideUserData != null) + message.hideUserData = Boolean(object.hideUserData); + if (object.useGeLogo != null) + message.useGeLogo = Boolean(object.useGeLogo); + if (object.dioramaDescriptionUrlBase != null) { + if (typeof object.dioramaDescriptionUrlBase !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.dioramaDescriptionUrlBase: object expected"); + message.dioramaDescriptionUrlBase = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.dioramaDescriptionUrlBase); + } + if (object.dioramaDefaultColor != null) + message.dioramaDefaultColor = object.dioramaDefaultColor >>> 0; + if (object.dioramaBlacklistUrl != null) { + if (typeof object.dioramaBlacklistUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.dioramaBlacklistUrl: object expected"); + message.dioramaBlacklistUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.dioramaBlacklistUrl); + } + if (object.clientOptions != null) { + if (typeof object.clientOptions !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.clientOptions: object expected"); + message.clientOptions = $root.keyhole.dbroot.ClientOptionsProto.fromObject(object.clientOptions); + } + if (object.fetchingOptions != null) { + if (typeof object.fetchingOptions !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.fetchingOptions: object expected"); + message.fetchingOptions = $root.keyhole.dbroot.FetchingOptionsProto.fromObject(object.fetchingOptions); + } + if (object.timeMachineOptions != null) { + if (typeof object.timeMachineOptions !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.timeMachineOptions: object expected"); + message.timeMachineOptions = $root.keyhole.dbroot.TimeMachineOptionsProto.fromObject(object.timeMachineOptions); + } + if (object.csiOptions != null) { + if (typeof object.csiOptions !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.csiOptions: object expected"); + message.csiOptions = $root.keyhole.dbroot.CSIOptionsProto.fromObject(object.csiOptions); + } + if (object.searchTab) { + if (!Array.isArray(object.searchTab)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.searchTab: array expected"); + message.searchTab = []; + for (var i = 0; i < object.searchTab.length; ++i) { + if (typeof object.searchTab[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.searchTab: object expected"); + message.searchTab[i] = $root.keyhole.dbroot.SearchTabProto.fromObject(object.searchTab[i]); + } + } + if (object.cobrandInfo) { + if (!Array.isArray(object.cobrandInfo)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.cobrandInfo: array expected"); + message.cobrandInfo = []; + for (var i = 0; i < object.cobrandInfo.length; ++i) { + if (typeof object.cobrandInfo[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.cobrandInfo: object expected"); + message.cobrandInfo[i] = $root.keyhole.dbroot.CobrandProto.fromObject(object.cobrandInfo[i]); + } + } + if (object.validDatabase) { + if (!Array.isArray(object.validDatabase)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.validDatabase: array expected"); + message.validDatabase = []; + for (var i = 0; i < object.validDatabase.length; ++i) { + if (typeof object.validDatabase[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.validDatabase: object expected"); + message.validDatabase[i] = $root.keyhole.dbroot.DatabaseDescriptionProto.fromObject(object.validDatabase[i]); + } + } + if (object.configScript) { + if (!Array.isArray(object.configScript)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.configScript: array expected"); + message.configScript = []; + for (var i = 0; i < object.configScript.length; ++i) { + if (typeof object.configScript[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.configScript: object expected"); + message.configScript[i] = $root.keyhole.dbroot.ConfigScriptProto.fromObject(object.configScript[i]); + } + } + if (object.deauthServerUrl != null) { + if (typeof object.deauthServerUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.deauthServerUrl: object expected"); + message.deauthServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.deauthServerUrl); + } + if (object.swoopParameters != null) { + if (typeof object.swoopParameters !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.swoopParameters: object expected"); + message.swoopParameters = $root.keyhole.dbroot.SwoopParamsProto.fromObject(object.swoopParameters); + } + if (object.bbsServerInfo != null) { + if (typeof object.bbsServerInfo !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.bbsServerInfo: object expected"); + message.bbsServerInfo = $root.keyhole.dbroot.PostingServerProto.fromObject(object.bbsServerInfo); + } + if (object.dataErrorServerInfo != null) { + if (typeof object.dataErrorServerInfo !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.dataErrorServerInfo: object expected"); + message.dataErrorServerInfo = $root.keyhole.dbroot.PostingServerProto.fromObject(object.dataErrorServerInfo); + } + if (object.planetaryDatabase) { + if (!Array.isArray(object.planetaryDatabase)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.planetaryDatabase: array expected"); + message.planetaryDatabase = []; + for (var i = 0; i < object.planetaryDatabase.length; ++i) { + if (typeof object.planetaryDatabase[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.planetaryDatabase: object expected"); + message.planetaryDatabase[i] = $root.keyhole.dbroot.PlanetaryDatabaseProto.fromObject(object.planetaryDatabase[i]); + } + } + if (object.logServer != null) { + if (typeof object.logServer !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.logServer: object expected"); + message.logServer = $root.keyhole.dbroot.LogServerProto.fromObject(object.logServer); + } + if (object.autopiaOptions != null) { + if (typeof object.autopiaOptions !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.autopiaOptions: object expected"); + message.autopiaOptions = $root.keyhole.dbroot.AutopiaOptionsProto.fromObject(object.autopiaOptions); + } + if (object.searchConfig != null) { + if (typeof object.searchConfig !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.searchConfig: object expected"); + message.searchConfig = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.fromObject(object.searchConfig); + } + if (object.searchInfo != null) { + if (typeof object.searchInfo !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.searchInfo: object expected"); + message.searchInfo = $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto.fromObject(object.searchInfo); + } + if (object.elevationServiceBaseUrl != null) + message.elevationServiceBaseUrl = String(object.elevationServiceBaseUrl); + if (object.elevationProfileQueryDelay != null) + message.elevationProfileQueryDelay = object.elevationProfileQueryDelay | 0; + if (object.proUpgradeUrl != null) { + if (typeof object.proUpgradeUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.proUpgradeUrl: object expected"); + message.proUpgradeUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.proUpgradeUrl); + } + if (object.earthCommunityUrl != null) { + if (typeof object.earthCommunityUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.earthCommunityUrl: object expected"); + message.earthCommunityUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.earthCommunityUrl); + } + if (object.googleMapsUrl != null) { + if (typeof object.googleMapsUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.googleMapsUrl: object expected"); + message.googleMapsUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.googleMapsUrl); + } + if (object.sharingUrl != null) { + if (typeof object.sharingUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.sharingUrl: object expected"); + message.sharingUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.sharingUrl); + } + if (object.privacyPolicyUrl != null) { + if (typeof object.privacyPolicyUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.privacyPolicyUrl: object expected"); + message.privacyPolicyUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.privacyPolicyUrl); + } + if (object.doGplusUserCheck != null) + message.doGplusUserCheck = Boolean(object.doGplusUserCheck); + if (object.rocktreeDataProto != null) { + if (typeof object.rocktreeDataProto !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.rocktreeDataProto: object expected"); + message.rocktreeDataProto = $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto.fromObject(object.rocktreeDataProto); + } + if (object.filmstripConfig) { + if (!Array.isArray(object.filmstripConfig)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.filmstripConfig: array expected"); + message.filmstripConfig = []; + for (var i = 0; i < object.filmstripConfig.length; ++i) { + if (typeof object.filmstripConfig[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.filmstripConfig: object expected"); + message.filmstripConfig[i] = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.fromObject(object.filmstripConfig[i]); + } + } + if (object.showSigninButton != null) + message.showSigninButton = Boolean(object.showSigninButton); + if (object.proMeasureUpsellUrl != null) { + if (typeof object.proMeasureUpsellUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.proMeasureUpsellUrl: object expected"); + message.proMeasureUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.proMeasureUpsellUrl); + } + if (object.proPrintUpsellUrl != null) { + if (typeof object.proPrintUpsellUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.proPrintUpsellUrl: object expected"); + message.proPrintUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.proPrintUpsellUrl); + } + if (object.starDataProto != null) { + if (typeof object.starDataProto !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.starDataProto: object expected"); + message.starDataProto = $root.keyhole.dbroot.EndSnippetProto.StarDataProto.fromObject(object.starDataProto); + } + if (object.feedbackUrl != null) { + if (typeof object.feedbackUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.feedbackUrl: object expected"); + message.feedbackUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.feedbackUrl); + } + if (object.oauth2LoginUrl != null) { + if (typeof object.oauth2LoginUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.oauth2LoginUrl: object expected"); + message.oauth2LoginUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.oauth2LoginUrl); + } + return message; + }; + + EndSnippetProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.mfeDomains = []; + object.searchTab = []; + object.cobrandInfo = []; + object.validDatabase = []; + object.configScript = []; + object.planetaryDatabase = []; + object.filmstripConfig = []; + } + if (options.defaults) { + object.model = null; + object.authServerUrl = null; + object.disableAuthentication = false; + object.mfeLangParam = "hl=$5Bhl5D"; + object.adsUrlPatterns = ""; + object.reverseGeocoderUrl = null; + object.reverseGeocoderProtocolVersion = 3; + object.skyDatabaseIsAvailable = true; + object.skyDatabaseUrl = null; + object.defaultWebPageIntlUrl = null; + object.numStartUpTips = 17; + object.startUpTipsUrl = null; + object.userGuideIntlUrl = null; + object.supportCenterIntlUrl = null; + object.businessListingIntlUrl = null; + object.supportAnswerIntlUrl = null; + object.supportTopicIntlUrl = null; + object.supportRequestIntlUrl = null; + object.earthIntlUrl = null; + object.addContentUrl = null; + object.sketchupNotInstalledUrl = null; + object.sketchupErrorUrl = null; + object.freeLicenseUrl = null; + object.proLicenseUrl = null; + object.hideUserData = false; + object.useGeLogo = true; + object.dioramaDescriptionUrlBase = null; + object.dioramaDefaultColor = 4291281607; + object.clientOptions = null; + object.fetchingOptions = null; + object.timeMachineOptions = null; + object.csiOptions = null; + object.deauthServerUrl = null; + object.swoopParameters = null; + object.bbsServerInfo = null; + object.dataErrorServerInfo = null; + object.logServer = null; + object.autopiaOptions = null; + object.searchInfo = null; + object.elevationServiceBaseUrl = "http://maps.google.com/maps/api/elevation/"; + object.elevationProfileQueryDelay = 500; + object.tutorialUrl = null; + object.keyboardShortcutsUrl = null; + object.releaseNotesUrl = null; + object.numProStartUpTips = 0; + object.proStartUpTipsUrl = null; + object.dioramaBlacklistUrl = null; + object.searchConfig = null; + object.proUpgradeUrl = null; + object.earthCommunityUrl = null; + object.googleMapsUrl = null; + object.sharingUrl = null; + object.privacyPolicyUrl = null; + object.doGplusUserCheck = false; + object.rocktreeDataProto = null; + object.showSigninButton = false; + object.startupTipsIntlUrl = null; + object.proMeasureUpsellUrl = null; + object.proPrintUpsellUrl = null; + object.starDataProto = null; + object.feedbackUrl = null; + object.oauth2LoginUrl = null; + } + if (message.model != null && message.hasOwnProperty("model")) + object.model = $root.keyhole.dbroot.PlanetModelProto.toObject(message.model, options); + if (message.authServerUrl != null && message.hasOwnProperty("authServerUrl")) + object.authServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.authServerUrl, options); + if (message.disableAuthentication != null && message.hasOwnProperty("disableAuthentication")) + object.disableAuthentication = message.disableAuthentication; + if (message.mfeDomains && message.mfeDomains.length) { + object.mfeDomains = []; + for (var j = 0; j < message.mfeDomains.length; ++j) + object.mfeDomains[j] = $root.keyhole.dbroot.MfeDomainFeaturesProto.toObject(message.mfeDomains[j], options); + } + if (message.mfeLangParam != null && message.hasOwnProperty("mfeLangParam")) + object.mfeLangParam = message.mfeLangParam; + if (message.adsUrlPatterns != null && message.hasOwnProperty("adsUrlPatterns")) + object.adsUrlPatterns = message.adsUrlPatterns; + if (message.reverseGeocoderUrl != null && message.hasOwnProperty("reverseGeocoderUrl")) + object.reverseGeocoderUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.reverseGeocoderUrl, options); + if (message.reverseGeocoderProtocolVersion != null && message.hasOwnProperty("reverseGeocoderProtocolVersion")) + object.reverseGeocoderProtocolVersion = message.reverseGeocoderProtocolVersion; + if (message.skyDatabaseIsAvailable != null && message.hasOwnProperty("skyDatabaseIsAvailable")) + object.skyDatabaseIsAvailable = message.skyDatabaseIsAvailable; + if (message.skyDatabaseUrl != null && message.hasOwnProperty("skyDatabaseUrl")) + object.skyDatabaseUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.skyDatabaseUrl, options); + if (message.defaultWebPageIntlUrl != null && message.hasOwnProperty("defaultWebPageIntlUrl")) + object.defaultWebPageIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.defaultWebPageIntlUrl, options); + if (message.numStartUpTips != null && message.hasOwnProperty("numStartUpTips")) + object.numStartUpTips = message.numStartUpTips; + if (message.startUpTipsUrl != null && message.hasOwnProperty("startUpTipsUrl")) + object.startUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.startUpTipsUrl, options); + if (message.userGuideIntlUrl != null && message.hasOwnProperty("userGuideIntlUrl")) + object.userGuideIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.userGuideIntlUrl, options); + if (message.supportCenterIntlUrl != null && message.hasOwnProperty("supportCenterIntlUrl")) + object.supportCenterIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.supportCenterIntlUrl, options); + if (message.businessListingIntlUrl != null && message.hasOwnProperty("businessListingIntlUrl")) + object.businessListingIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.businessListingIntlUrl, options); + if (message.supportAnswerIntlUrl != null && message.hasOwnProperty("supportAnswerIntlUrl")) + object.supportAnswerIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.supportAnswerIntlUrl, options); + if (message.supportTopicIntlUrl != null && message.hasOwnProperty("supportTopicIntlUrl")) + object.supportTopicIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.supportTopicIntlUrl, options); + if (message.supportRequestIntlUrl != null && message.hasOwnProperty("supportRequestIntlUrl")) + object.supportRequestIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.supportRequestIntlUrl, options); + if (message.earthIntlUrl != null && message.hasOwnProperty("earthIntlUrl")) + object.earthIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.earthIntlUrl, options); + if (message.addContentUrl != null && message.hasOwnProperty("addContentUrl")) + object.addContentUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.addContentUrl, options); + if (message.sketchupNotInstalledUrl != null && message.hasOwnProperty("sketchupNotInstalledUrl")) + object.sketchupNotInstalledUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.sketchupNotInstalledUrl, options); + if (message.sketchupErrorUrl != null && message.hasOwnProperty("sketchupErrorUrl")) + object.sketchupErrorUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.sketchupErrorUrl, options); + if (message.freeLicenseUrl != null && message.hasOwnProperty("freeLicenseUrl")) + object.freeLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.freeLicenseUrl, options); + if (message.proLicenseUrl != null && message.hasOwnProperty("proLicenseUrl")) + object.proLicenseUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.proLicenseUrl, options); + if (message.hideUserData != null && message.hasOwnProperty("hideUserData")) + object.hideUserData = message.hideUserData; + if (message.useGeLogo != null && message.hasOwnProperty("useGeLogo")) + object.useGeLogo = message.useGeLogo; + if (message.dioramaDescriptionUrlBase != null && message.hasOwnProperty("dioramaDescriptionUrlBase")) + object.dioramaDescriptionUrlBase = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.dioramaDescriptionUrlBase, options); + if (message.dioramaDefaultColor != null && message.hasOwnProperty("dioramaDefaultColor")) + object.dioramaDefaultColor = message.dioramaDefaultColor; + if (message.clientOptions != null && message.hasOwnProperty("clientOptions")) + object.clientOptions = $root.keyhole.dbroot.ClientOptionsProto.toObject(message.clientOptions, options); + if (message.fetchingOptions != null && message.hasOwnProperty("fetchingOptions")) + object.fetchingOptions = $root.keyhole.dbroot.FetchingOptionsProto.toObject(message.fetchingOptions, options); + if (message.timeMachineOptions != null && message.hasOwnProperty("timeMachineOptions")) + object.timeMachineOptions = $root.keyhole.dbroot.TimeMachineOptionsProto.toObject(message.timeMachineOptions, options); + if (message.csiOptions != null && message.hasOwnProperty("csiOptions")) + object.csiOptions = $root.keyhole.dbroot.CSIOptionsProto.toObject(message.csiOptions, options); + if (message.searchTab && message.searchTab.length) { + object.searchTab = []; + for (var j = 0; j < message.searchTab.length; ++j) + object.searchTab[j] = $root.keyhole.dbroot.SearchTabProto.toObject(message.searchTab[j], options); + } + if (message.cobrandInfo && message.cobrandInfo.length) { + object.cobrandInfo = []; + for (var j = 0; j < message.cobrandInfo.length; ++j) + object.cobrandInfo[j] = $root.keyhole.dbroot.CobrandProto.toObject(message.cobrandInfo[j], options); + } + if (message.validDatabase && message.validDatabase.length) { + object.validDatabase = []; + for (var j = 0; j < message.validDatabase.length; ++j) + object.validDatabase[j] = $root.keyhole.dbroot.DatabaseDescriptionProto.toObject(message.validDatabase[j], options); + } + if (message.configScript && message.configScript.length) { + object.configScript = []; + for (var j = 0; j < message.configScript.length; ++j) + object.configScript[j] = $root.keyhole.dbroot.ConfigScriptProto.toObject(message.configScript[j], options); + } + if (message.deauthServerUrl != null && message.hasOwnProperty("deauthServerUrl")) + object.deauthServerUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.deauthServerUrl, options); + if (message.swoopParameters != null && message.hasOwnProperty("swoopParameters")) + object.swoopParameters = $root.keyhole.dbroot.SwoopParamsProto.toObject(message.swoopParameters, options); + if (message.bbsServerInfo != null && message.hasOwnProperty("bbsServerInfo")) + object.bbsServerInfo = $root.keyhole.dbroot.PostingServerProto.toObject(message.bbsServerInfo, options); + if (message.dataErrorServerInfo != null && message.hasOwnProperty("dataErrorServerInfo")) + object.dataErrorServerInfo = $root.keyhole.dbroot.PostingServerProto.toObject(message.dataErrorServerInfo, options); + if (message.planetaryDatabase && message.planetaryDatabase.length) { + object.planetaryDatabase = []; + for (var j = 0; j < message.planetaryDatabase.length; ++j) + object.planetaryDatabase[j] = $root.keyhole.dbroot.PlanetaryDatabaseProto.toObject(message.planetaryDatabase[j], options); + } + if (message.logServer != null && message.hasOwnProperty("logServer")) + object.logServer = $root.keyhole.dbroot.LogServerProto.toObject(message.logServer, options); + if (message.autopiaOptions != null && message.hasOwnProperty("autopiaOptions")) + object.autopiaOptions = $root.keyhole.dbroot.AutopiaOptionsProto.toObject(message.autopiaOptions, options); + if (message.searchInfo != null && message.hasOwnProperty("searchInfo")) + object.searchInfo = $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto.toObject(message.searchInfo, options); + if (message.elevationServiceBaseUrl != null && message.hasOwnProperty("elevationServiceBaseUrl")) + object.elevationServiceBaseUrl = message.elevationServiceBaseUrl; + if (message.elevationProfileQueryDelay != null && message.hasOwnProperty("elevationProfileQueryDelay")) + object.elevationProfileQueryDelay = message.elevationProfileQueryDelay; + if (message.tutorialUrl != null && message.hasOwnProperty("tutorialUrl")) + object.tutorialUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.tutorialUrl, options); + if (message.keyboardShortcutsUrl != null && message.hasOwnProperty("keyboardShortcutsUrl")) + object.keyboardShortcutsUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.keyboardShortcutsUrl, options); + if (message.releaseNotesUrl != null && message.hasOwnProperty("releaseNotesUrl")) + object.releaseNotesUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.releaseNotesUrl, options); + if (message.numProStartUpTips != null && message.hasOwnProperty("numProStartUpTips")) + object.numProStartUpTips = message.numProStartUpTips; + if (message.proStartUpTipsUrl != null && message.hasOwnProperty("proStartUpTipsUrl")) + object.proStartUpTipsUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.proStartUpTipsUrl, options); + if (message.dioramaBlacklistUrl != null && message.hasOwnProperty("dioramaBlacklistUrl")) + object.dioramaBlacklistUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.dioramaBlacklistUrl, options); + if (message.searchConfig != null && message.hasOwnProperty("searchConfig")) + object.searchConfig = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.toObject(message.searchConfig, options); + if (message.proUpgradeUrl != null && message.hasOwnProperty("proUpgradeUrl")) + object.proUpgradeUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.proUpgradeUrl, options); + if (message.earthCommunityUrl != null && message.hasOwnProperty("earthCommunityUrl")) + object.earthCommunityUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.earthCommunityUrl, options); + if (message.googleMapsUrl != null && message.hasOwnProperty("googleMapsUrl")) + object.googleMapsUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.googleMapsUrl, options); + if (message.sharingUrl != null && message.hasOwnProperty("sharingUrl")) + object.sharingUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.sharingUrl, options); + if (message.privacyPolicyUrl != null && message.hasOwnProperty("privacyPolicyUrl")) + object.privacyPolicyUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.privacyPolicyUrl, options); + if (message.doGplusUserCheck != null && message.hasOwnProperty("doGplusUserCheck")) + object.doGplusUserCheck = message.doGplusUserCheck; + if (message.rocktreeDataProto != null && message.hasOwnProperty("rocktreeDataProto")) + object.rocktreeDataProto = $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto.toObject(message.rocktreeDataProto, options); + if (message.filmstripConfig && message.filmstripConfig.length) { + object.filmstripConfig = []; + for (var j = 0; j < message.filmstripConfig.length; ++j) + object.filmstripConfig[j] = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.toObject(message.filmstripConfig[j], options); + } + if (message.showSigninButton != null && message.hasOwnProperty("showSigninButton")) + object.showSigninButton = message.showSigninButton; + if (message.startupTipsIntlUrl != null && message.hasOwnProperty("startupTipsIntlUrl")) + object.startupTipsIntlUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.startupTipsIntlUrl, options); + if (message.proMeasureUpsellUrl != null && message.hasOwnProperty("proMeasureUpsellUrl")) + object.proMeasureUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.proMeasureUpsellUrl, options); + if (message.proPrintUpsellUrl != null && message.hasOwnProperty("proPrintUpsellUrl")) + object.proPrintUpsellUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.proPrintUpsellUrl, options); + if (message.starDataProto != null && message.hasOwnProperty("starDataProto")) + object.starDataProto = $root.keyhole.dbroot.EndSnippetProto.StarDataProto.toObject(message.starDataProto, options); + if (message.feedbackUrl != null && message.hasOwnProperty("feedbackUrl")) + object.feedbackUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.feedbackUrl, options); + if (message.oauth2LoginUrl != null && message.hasOwnProperty("oauth2LoginUrl")) + object.oauth2LoginUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.oauth2LoginUrl, options); + return object; + }; + + EndSnippetProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + EndSnippetProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto"; + }; + + EndSnippetProto.SearchConfigProto = (function() { + + function SearchConfigProto(properties) { + this.searchServer = []; + this.oneboxService = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SearchConfigProto.prototype.searchServer = $util.emptyArray; + SearchConfigProto.prototype.oneboxService = $util.emptyArray; + SearchConfigProto.prototype.kmlSearchUrl = null; + SearchConfigProto.prototype.kmlRenderUrl = null; + SearchConfigProto.prototype.searchHistoryUrl = null; + SearchConfigProto.prototype.errorPageUrl = null; + + SearchConfigProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (!(message.searchServer && message.searchServer.length)) + message.searchServer = []; + message.searchServer.push($root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.decode(reader, reader.uint32())); + break; + } + case 2: { + if (!(message.oneboxService && message.oneboxService.length)) + message.oneboxService = []; + message.oneboxService.push($root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.decode(reader, reader.uint32())); + break; + } + case 3: { + message.kmlSearchUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 4: { + message.kmlRenderUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 6: { + message.searchHistoryUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 5: { + message.errorPageUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SearchConfigProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.searchServer != null && message.hasOwnProperty("searchServer")) { + if (!Array.isArray(message.searchServer)) + return "searchServer: array expected"; + for (var i = 0; i < message.searchServer.length; ++i) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.verify(message.searchServer[i]); + if (error) + return "searchServer." + error; + } + } + if (message.oneboxService != null && message.hasOwnProperty("oneboxService")) { + if (!Array.isArray(message.oneboxService)) + return "oneboxService: array expected"; + for (var i = 0; i < message.oneboxService.length; ++i) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.verify(message.oneboxService[i]); + if (error) + return "oneboxService." + error; + } + } + if (message.kmlSearchUrl != null && message.hasOwnProperty("kmlSearchUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlSearchUrl); + if (error) + return "kmlSearchUrl." + error; + } + if (message.kmlRenderUrl != null && message.hasOwnProperty("kmlRenderUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlRenderUrl); + if (error) + return "kmlRenderUrl." + error; + } + if (message.searchHistoryUrl != null && message.hasOwnProperty("searchHistoryUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.searchHistoryUrl); + if (error) + return "searchHistoryUrl." + error; + } + if (message.errorPageUrl != null && message.hasOwnProperty("errorPageUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.errorPageUrl); + if (error) + return "errorPageUrl." + error; + } + return null; + }; + + SearchConfigProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto(); + if (object.searchServer) { + if (!Array.isArray(object.searchServer)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchServer: array expected"); + message.searchServer = []; + for (var i = 0; i < object.searchServer.length; ++i) { + if (typeof object.searchServer[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchServer: object expected"); + message.searchServer[i] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.fromObject(object.searchServer[i]); + } + } + if (object.oneboxService) { + if (!Array.isArray(object.oneboxService)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.oneboxService: array expected"); + message.oneboxService = []; + for (var i = 0; i < object.oneboxService.length; ++i) { + if (typeof object.oneboxService[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.oneboxService: object expected"); + message.oneboxService[i] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.fromObject(object.oneboxService[i]); + } + } + if (object.kmlSearchUrl != null) { + if (typeof object.kmlSearchUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.kmlSearchUrl: object expected"); + message.kmlSearchUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlSearchUrl); + } + if (object.kmlRenderUrl != null) { + if (typeof object.kmlRenderUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.kmlRenderUrl: object expected"); + message.kmlRenderUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlRenderUrl); + } + if (object.searchHistoryUrl != null) { + if (typeof object.searchHistoryUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchHistoryUrl: object expected"); + message.searchHistoryUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.searchHistoryUrl); + } + if (object.errorPageUrl != null) { + if (typeof object.errorPageUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.errorPageUrl: object expected"); + message.errorPageUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.errorPageUrl); + } + return message; + }; + + SearchConfigProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.searchServer = []; + object.oneboxService = []; + } + if (options.defaults) { + object.kmlSearchUrl = null; + object.kmlRenderUrl = null; + object.errorPageUrl = null; + object.searchHistoryUrl = null; + } + if (message.searchServer && message.searchServer.length) { + object.searchServer = []; + for (var j = 0; j < message.searchServer.length; ++j) + object.searchServer[j] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.toObject(message.searchServer[j], options); + } + if (message.oneboxService && message.oneboxService.length) { + object.oneboxService = []; + for (var j = 0; j < message.oneboxService.length; ++j) + object.oneboxService[j] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.toObject(message.oneboxService[j], options); + } + if (message.kmlSearchUrl != null && message.hasOwnProperty("kmlSearchUrl")) + object.kmlSearchUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlSearchUrl, options); + if (message.kmlRenderUrl != null && message.hasOwnProperty("kmlRenderUrl")) + object.kmlRenderUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlRenderUrl, options); + if (message.errorPageUrl != null && message.hasOwnProperty("errorPageUrl")) + object.errorPageUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.errorPageUrl, options); + if (message.searchHistoryUrl != null && message.hasOwnProperty("searchHistoryUrl")) + object.searchHistoryUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.searchHistoryUrl, options); + return object; + }; + + SearchConfigProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SearchConfigProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchConfigProto"; + }; + + SearchConfigProto.SearchServer = (function() { + + function SearchServer(properties) { + this.suggestion = []; + this.searchlet = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SearchServer.prototype.name = null; + SearchServer.prototype.url = null; + SearchServer.prototype.type = 0; + SearchServer.prototype.htmlTransformUrl = null; + SearchServer.prototype.kmlTransformUrl = null; + SearchServer.prototype.supplementalUi = null; + SearchServer.prototype.suggestion = $util.emptyArray; + SearchServer.prototype.searchlet = $util.emptyArray; + SearchServer.prototype.requirements = null; + SearchServer.prototype.suggestServer = null; + + SearchServer.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.name = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.type = reader.int32(); + break; + } + case 4: { + message.htmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 5: { + message.kmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 6: { + message.supplementalUi = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.decode(reader, reader.uint32()); + break; + } + case 9: { + if (!(message.suggestion && message.suggestion.length)) + message.suggestion = []; + message.suggestion.push($root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32())); + break; + } + case 7: { + if (!(message.searchlet && message.searchlet.length)) + message.searchlet = []; + message.searchlet.push($root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.decode(reader, reader.uint32())); + break; + } + case 8: { + message.requirements = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + case 10: { + message.suggestServer = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SearchServer.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.name); + if (error) + return "name." + error; + } + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + break; + } + if (message.htmlTransformUrl != null && message.hasOwnProperty("htmlTransformUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.htmlTransformUrl); + if (error) + return "htmlTransformUrl." + error; + } + if (message.kmlTransformUrl != null && message.hasOwnProperty("kmlTransformUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlTransformUrl); + if (error) + return "kmlTransformUrl." + error; + } + if (message.supplementalUi != null && message.hasOwnProperty("supplementalUi")) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.verify(message.supplementalUi); + if (error) + return "supplementalUi." + error; + } + if (message.suggestion != null && message.hasOwnProperty("suggestion")) { + if (!Array.isArray(message.suggestion)) + return "suggestion: array expected"; + for (var i = 0; i < message.suggestion.length; ++i) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.suggestion[i]); + if (error) + return "suggestion." + error; + } + } + if (message.searchlet != null && message.hasOwnProperty("searchlet")) { + if (!Array.isArray(message.searchlet)) + return "searchlet: array expected"; + for (var i = 0; i < message.searchlet.length; ++i) { + var error = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.verify(message.searchlet[i]); + if (error) + return "searchlet." + error; + } + } + if (message.requirements != null && message.hasOwnProperty("requirements")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirements); + if (error) + return "requirements." + error; + } + if (message.suggestServer != null && message.hasOwnProperty("suggestServer")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.suggestServer); + if (error) + return "suggestServer." + error; + } + return null; + }; + + SearchServer.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer(); + if (object.name != null) { + if (typeof object.name !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.name: object expected"); + message.name = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.name); + } + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + switch (object.type) { + case "RESULT_TYPE_KML": + case 0: + message.type = 0; + break; + case "RESULT_TYPE_XML": + case 1: + message.type = 1; + break; + } + if (object.htmlTransformUrl != null) { + if (typeof object.htmlTransformUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.htmlTransformUrl: object expected"); + message.htmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.htmlTransformUrl); + } + if (object.kmlTransformUrl != null) { + if (typeof object.kmlTransformUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.kmlTransformUrl: object expected"); + message.kmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlTransformUrl); + } + if (object.supplementalUi != null) { + if (typeof object.supplementalUi !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.supplementalUi: object expected"); + message.supplementalUi = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.fromObject(object.supplementalUi); + } + if (object.suggestion) { + if (!Array.isArray(object.suggestion)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestion: array expected"); + message.suggestion = []; + for (var i = 0; i < object.suggestion.length; ++i) { + if (typeof object.suggestion[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestion: object expected"); + message.suggestion[i] = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.suggestion[i]); + } + } + if (object.searchlet) { + if (!Array.isArray(object.searchlet)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.searchlet: array expected"); + message.searchlet = []; + for (var i = 0; i < object.searchlet.length; ++i) { + if (typeof object.searchlet[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.searchlet: object expected"); + message.searchlet[i] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.fromObject(object.searchlet[i]); + } + } + if (object.requirements != null) { + if (typeof object.requirements !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.requirements: object expected"); + message.requirements = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirements); + } + if (object.suggestServer != null) { + if (typeof object.suggestServer !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestServer: object expected"); + message.suggestServer = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.suggestServer); + } + return message; + }; + + SearchServer.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.searchlet = []; + object.suggestion = []; + } + if (options.defaults) { + object.name = null; + object.url = null; + object.type = options.enums === String ? "RESULT_TYPE_KML" : 0; + object.htmlTransformUrl = null; + object.kmlTransformUrl = null; + object.supplementalUi = null; + object.requirements = null; + object.suggestServer = null; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.name, options); + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.ResultType[message.type] : message.type; + if (message.htmlTransformUrl != null && message.hasOwnProperty("htmlTransformUrl")) + object.htmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.htmlTransformUrl, options); + if (message.kmlTransformUrl != null && message.hasOwnProperty("kmlTransformUrl")) + object.kmlTransformUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlTransformUrl, options); + if (message.supplementalUi != null && message.hasOwnProperty("supplementalUi")) + object.supplementalUi = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.toObject(message.supplementalUi, options); + if (message.searchlet && message.searchlet.length) { + object.searchlet = []; + for (var j = 0; j < message.searchlet.length; ++j) + object.searchlet[j] = $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.toObject(message.searchlet[j], options); + } + if (message.requirements != null && message.hasOwnProperty("requirements")) + object.requirements = $root.keyhole.dbroot.RequirementProto.toObject(message.requirements, options); + if (message.suggestion && message.suggestion.length) { + object.suggestion = []; + for (var j = 0; j < message.suggestion.length; ++j) + object.suggestion[j] = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.suggestion[j], options); + } + if (message.suggestServer != null && message.hasOwnProperty("suggestServer")) + object.suggestServer = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.suggestServer, options); + return object; + }; + + SearchServer.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SearchServer.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer"; + }; + + SearchServer.ResultType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "RESULT_TYPE_KML"] = 0; + values[valuesById[1] = "RESULT_TYPE_XML"] = 1; + return values; + })(); + + SearchServer.SupplementalUi = (function() { + + function SupplementalUi(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SupplementalUi.prototype.url = null; + SupplementalUi.prototype.label = null; + SupplementalUi.prototype.height = 160; + + SupplementalUi.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.label = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.height = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SupplementalUi.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + if (message.label != null && message.hasOwnProperty("label")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.label); + if (error) + return "label." + error; + } + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + return null; + }; + + SupplementalUi.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + if (object.label != null) { + if (typeof object.label !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.label: object expected"); + message.label = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.label); + } + if (object.height != null) + message.height = object.height | 0; + return message; + }; + + SupplementalUi.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = null; + object.label = null; + object.height = 160; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + if (message.label != null && message.hasOwnProperty("label")) + object.label = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.label, options); + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + return object; + }; + + SupplementalUi.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SupplementalUi.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi"; + }; + + return SupplementalUi; + })(); + + SearchServer.SearchletProto = (function() { + + function SearchletProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SearchletProto.prototype.url = null; + SearchletProto.prototype.name = null; + SearchletProto.prototype.requirements = null; + + SearchletProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.name = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.requirements = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SearchletProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + if (message.name != null && message.hasOwnProperty("name")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.name); + if (error) + return "name." + error; + } + if (message.requirements != null && message.hasOwnProperty("requirements")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirements); + if (error) + return "requirements." + error; + } + return null; + }; + + SearchletProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + if (object.name != null) { + if (typeof object.name !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.name: object expected"); + message.name = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.name); + } + if (object.requirements != null) { + if (typeof object.requirements !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.requirements: object expected"); + message.requirements = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirements); + } + return message; + }; + + SearchletProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = null; + object.name = null; + object.requirements = null; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + if (message.name != null && message.hasOwnProperty("name")) + object.name = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.name, options); + if (message.requirements != null && message.hasOwnProperty("requirements")) + object.requirements = $root.keyhole.dbroot.RequirementProto.toObject(message.requirements, options); + return object; + }; + + SearchletProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SearchletProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto"; + }; + + return SearchletProto; + })(); + + return SearchServer; + })(); + + SearchConfigProto.OneboxServiceProto = (function() { + + function OneboxServiceProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + OneboxServiceProto.prototype.serviceUrl = null; + OneboxServiceProto.prototype.requirements = null; + + OneboxServiceProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.serviceUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.requirements = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + OneboxServiceProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serviceUrl != null && message.hasOwnProperty("serviceUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.serviceUrl); + if (error) + return "serviceUrl." + error; + } + if (message.requirements != null && message.hasOwnProperty("requirements")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirements); + if (error) + return "requirements." + error; + } + return null; + }; + + OneboxServiceProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto(); + if (object.serviceUrl != null) { + if (typeof object.serviceUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.serviceUrl: object expected"); + message.serviceUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.serviceUrl); + } + if (object.requirements != null) { + if (typeof object.requirements !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.requirements: object expected"); + message.requirements = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirements); + } + return message; + }; + + OneboxServiceProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.serviceUrl = null; + object.requirements = null; + } + if (message.serviceUrl != null && message.hasOwnProperty("serviceUrl")) + object.serviceUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.serviceUrl, options); + if (message.requirements != null && message.hasOwnProperty("requirements")) + object.requirements = $root.keyhole.dbroot.RequirementProto.toObject(message.requirements, options); + return object; + }; + + OneboxServiceProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + OneboxServiceProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto"; + }; + + return OneboxServiceProto; + })(); + + return SearchConfigProto; + })(); + + EndSnippetProto.SearchInfoProto = (function() { + + function SearchInfoProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + SearchInfoProto.prototype.defaultUrl = "http://maps.google.com/maps"; + SearchInfoProto.prototype.geocodeParam = "q"; + + SearchInfoProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.defaultUrl = reader.string(); + break; + } + case 2: { + message.geocodeParam = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + SearchInfoProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.defaultUrl != null && message.hasOwnProperty("defaultUrl")) + if (!$util.isString(message.defaultUrl)) + return "defaultUrl: string expected"; + if (message.geocodeParam != null && message.hasOwnProperty("geocodeParam")) + if (!$util.isString(message.geocodeParam)) + return "geocodeParam: string expected"; + return null; + }; + + SearchInfoProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.SearchInfoProto(); + if (object.defaultUrl != null) + message.defaultUrl = String(object.defaultUrl); + if (object.geocodeParam != null) + message.geocodeParam = String(object.geocodeParam); + return message; + }; + + SearchInfoProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.defaultUrl = "http://maps.google.com/maps"; + object.geocodeParam = "q"; + } + if (message.defaultUrl != null && message.hasOwnProperty("defaultUrl")) + object.defaultUrl = message.defaultUrl; + if (message.geocodeParam != null && message.hasOwnProperty("geocodeParam")) + object.geocodeParam = message.geocodeParam; + return object; + }; + + SearchInfoProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SearchInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.SearchInfoProto"; + }; + + return SearchInfoProto; + })(); + + EndSnippetProto.RockTreeDataProto = (function() { + + function RockTreeDataProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + RockTreeDataProto.prototype.url = null; + + RockTreeDataProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + RockTreeDataProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + return null; + }; + + RockTreeDataProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.RockTreeDataProto(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.RockTreeDataProto.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + return message; + }; + + RockTreeDataProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.url = null; + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + return object; + }; + + RockTreeDataProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + RockTreeDataProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.RockTreeDataProto"; + }; + + return RockTreeDataProto; + })(); + + EndSnippetProto.FilmstripConfigProto = (function() { + + function FilmstripConfigProto(properties) { + this.imageryType = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + FilmstripConfigProto.prototype.requirements = null; + FilmstripConfigProto.prototype.alleycatUrlTemplate = null; + FilmstripConfigProto.prototype.fallbackAlleycatUrlTemplate = null; + FilmstripConfigProto.prototype.metadataUrlTemplate = null; + FilmstripConfigProto.prototype.thumbnailUrlTemplate = null; + FilmstripConfigProto.prototype.kmlUrlTemplate = null; + FilmstripConfigProto.prototype.featuredToursUrl = null; + FilmstripConfigProto.prototype.enableViewportFallback = false; + FilmstripConfigProto.prototype.viewportFallbackDistance = 0; + FilmstripConfigProto.prototype.imageryType = $util.emptyArray; + + FilmstripConfigProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.requirements = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + case 2: { + message.alleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 9: { + message.fallbackAlleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 3: { + message.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 4: { + message.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 5: { + message.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 6: { + message.featuredToursUrl = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 7: { + message.enableViewportFallback = reader.bool(); + break; + } + case 8: { + message.viewportFallbackDistance = reader.uint32(); + break; + } + case 10: { + if (!(message.imageryType && message.imageryType.length)) + message.imageryType = []; + message.imageryType.push($root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + FilmstripConfigProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.requirements != null && message.hasOwnProperty("requirements")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirements); + if (error) + return "requirements." + error; + } + if (message.alleycatUrlTemplate != null && message.hasOwnProperty("alleycatUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.alleycatUrlTemplate); + if (error) + return "alleycatUrlTemplate." + error; + } + if (message.fallbackAlleycatUrlTemplate != null && message.hasOwnProperty("fallbackAlleycatUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.fallbackAlleycatUrlTemplate); + if (error) + return "fallbackAlleycatUrlTemplate." + error; + } + if (message.metadataUrlTemplate != null && message.hasOwnProperty("metadataUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.metadataUrlTemplate); + if (error) + return "metadataUrlTemplate." + error; + } + if (message.thumbnailUrlTemplate != null && message.hasOwnProperty("thumbnailUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.thumbnailUrlTemplate); + if (error) + return "thumbnailUrlTemplate." + error; + } + if (message.kmlUrlTemplate != null && message.hasOwnProperty("kmlUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlUrlTemplate); + if (error) + return "kmlUrlTemplate." + error; + } + if (message.featuredToursUrl != null && message.hasOwnProperty("featuredToursUrl")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.featuredToursUrl); + if (error) + return "featuredToursUrl." + error; + } + if (message.enableViewportFallback != null && message.hasOwnProperty("enableViewportFallback")) + if (typeof message.enableViewportFallback !== "boolean") + return "enableViewportFallback: boolean expected"; + if (message.viewportFallbackDistance != null && message.hasOwnProperty("viewportFallbackDistance")) + if (!$util.isInteger(message.viewportFallbackDistance)) + return "viewportFallbackDistance: integer expected"; + if (message.imageryType != null && message.hasOwnProperty("imageryType")) { + if (!Array.isArray(message.imageryType)) + return "imageryType: array expected"; + for (var i = 0; i < message.imageryType.length; ++i) { + var error = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.verify(message.imageryType[i]); + if (error) + return "imageryType." + error; + } + } + return null; + }; + + FilmstripConfigProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto(); + if (object.requirements != null) { + if (typeof object.requirements !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.requirements: object expected"); + message.requirements = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirements); + } + if (object.alleycatUrlTemplate != null) { + if (typeof object.alleycatUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.alleycatUrlTemplate: object expected"); + message.alleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.alleycatUrlTemplate); + } + if (object.fallbackAlleycatUrlTemplate != null) { + if (typeof object.fallbackAlleycatUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.fallbackAlleycatUrlTemplate: object expected"); + message.fallbackAlleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.fallbackAlleycatUrlTemplate); + } + if (object.metadataUrlTemplate != null) { + if (typeof object.metadataUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.metadataUrlTemplate: object expected"); + message.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.metadataUrlTemplate); + } + if (object.thumbnailUrlTemplate != null) { + if (typeof object.thumbnailUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.thumbnailUrlTemplate: object expected"); + message.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.thumbnailUrlTemplate); + } + if (object.kmlUrlTemplate != null) { + if (typeof object.kmlUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.kmlUrlTemplate: object expected"); + message.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlUrlTemplate); + } + if (object.featuredToursUrl != null) { + if (typeof object.featuredToursUrl !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.featuredToursUrl: object expected"); + message.featuredToursUrl = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.featuredToursUrl); + } + if (object.enableViewportFallback != null) + message.enableViewportFallback = Boolean(object.enableViewportFallback); + if (object.viewportFallbackDistance != null) + message.viewportFallbackDistance = object.viewportFallbackDistance >>> 0; + if (object.imageryType) { + if (!Array.isArray(object.imageryType)) + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.imageryType: array expected"); + message.imageryType = []; + for (var i = 0; i < object.imageryType.length; ++i) { + if (typeof object.imageryType[i] !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.imageryType: object expected"); + message.imageryType[i] = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.fromObject(object.imageryType[i]); + } + } + return message; + }; + + FilmstripConfigProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.imageryType = []; + if (options.defaults) { + object.requirements = null; + object.alleycatUrlTemplate = null; + object.metadataUrlTemplate = null; + object.thumbnailUrlTemplate = null; + object.kmlUrlTemplate = null; + object.featuredToursUrl = null; + object.enableViewportFallback = false; + object.viewportFallbackDistance = 0; + object.fallbackAlleycatUrlTemplate = null; + } + if (message.requirements != null && message.hasOwnProperty("requirements")) + object.requirements = $root.keyhole.dbroot.RequirementProto.toObject(message.requirements, options); + if (message.alleycatUrlTemplate != null && message.hasOwnProperty("alleycatUrlTemplate")) + object.alleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.alleycatUrlTemplate, options); + if (message.metadataUrlTemplate != null && message.hasOwnProperty("metadataUrlTemplate")) + object.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.metadataUrlTemplate, options); + if (message.thumbnailUrlTemplate != null && message.hasOwnProperty("thumbnailUrlTemplate")) + object.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.thumbnailUrlTemplate, options); + if (message.kmlUrlTemplate != null && message.hasOwnProperty("kmlUrlTemplate")) + object.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlUrlTemplate, options); + if (message.featuredToursUrl != null && message.hasOwnProperty("featuredToursUrl")) + object.featuredToursUrl = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.featuredToursUrl, options); + if (message.enableViewportFallback != null && message.hasOwnProperty("enableViewportFallback")) + object.enableViewportFallback = message.enableViewportFallback; + if (message.viewportFallbackDistance != null && message.hasOwnProperty("viewportFallbackDistance")) + object.viewportFallbackDistance = message.viewportFallbackDistance; + if (message.fallbackAlleycatUrlTemplate != null && message.hasOwnProperty("fallbackAlleycatUrlTemplate")) + object.fallbackAlleycatUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.fallbackAlleycatUrlTemplate, options); + if (message.imageryType && message.imageryType.length) { + object.imageryType = []; + for (var j = 0; j < message.imageryType.length; ++j) + object.imageryType[j] = $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.toObject(message.imageryType[j], options); + } + return object; + }; + + FilmstripConfigProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + FilmstripConfigProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.FilmstripConfigProto"; + }; + + FilmstripConfigProto.AlleycatImageryTypeProto = (function() { + + function AlleycatImageryTypeProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + AlleycatImageryTypeProto.prototype.imageryTypeId = 0; + AlleycatImageryTypeProto.prototype.imageryTypeLabel = ""; + AlleycatImageryTypeProto.prototype.metadataUrlTemplate = null; + AlleycatImageryTypeProto.prototype.thumbnailUrlTemplate = null; + AlleycatImageryTypeProto.prototype.kmlUrlTemplate = null; + + AlleycatImageryTypeProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.imageryTypeId = reader.int32(); + break; + } + case 2: { + message.imageryTypeLabel = reader.string(); + break; + } + case 3: { + message.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 4: { + message.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 5: { + message.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + AlleycatImageryTypeProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.imageryTypeId != null && message.hasOwnProperty("imageryTypeId")) + if (!$util.isInteger(message.imageryTypeId)) + return "imageryTypeId: integer expected"; + if (message.imageryTypeLabel != null && message.hasOwnProperty("imageryTypeLabel")) + if (!$util.isString(message.imageryTypeLabel)) + return "imageryTypeLabel: string expected"; + if (message.metadataUrlTemplate != null && message.hasOwnProperty("metadataUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.metadataUrlTemplate); + if (error) + return "metadataUrlTemplate." + error; + } + if (message.thumbnailUrlTemplate != null && message.hasOwnProperty("thumbnailUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.thumbnailUrlTemplate); + if (error) + return "thumbnailUrlTemplate." + error; + } + if (message.kmlUrlTemplate != null && message.hasOwnProperty("kmlUrlTemplate")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.kmlUrlTemplate); + if (error) + return "kmlUrlTemplate." + error; + } + return null; + }; + + AlleycatImageryTypeProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto(); + if (object.imageryTypeId != null) + message.imageryTypeId = object.imageryTypeId | 0; + if (object.imageryTypeLabel != null) + message.imageryTypeLabel = String(object.imageryTypeLabel); + if (object.metadataUrlTemplate != null) { + if (typeof object.metadataUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.metadataUrlTemplate: object expected"); + message.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.metadataUrlTemplate); + } + if (object.thumbnailUrlTemplate != null) { + if (typeof object.thumbnailUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.thumbnailUrlTemplate: object expected"); + message.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.thumbnailUrlTemplate); + } + if (object.kmlUrlTemplate != null) { + if (typeof object.kmlUrlTemplate !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.kmlUrlTemplate: object expected"); + message.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.kmlUrlTemplate); + } + return message; + }; + + AlleycatImageryTypeProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.imageryTypeId = 0; + object.imageryTypeLabel = ""; + object.metadataUrlTemplate = null; + object.thumbnailUrlTemplate = null; + object.kmlUrlTemplate = null; + } + if (message.imageryTypeId != null && message.hasOwnProperty("imageryTypeId")) + object.imageryTypeId = message.imageryTypeId; + if (message.imageryTypeLabel != null && message.hasOwnProperty("imageryTypeLabel")) + object.imageryTypeLabel = message.imageryTypeLabel; + if (message.metadataUrlTemplate != null && message.hasOwnProperty("metadataUrlTemplate")) + object.metadataUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.metadataUrlTemplate, options); + if (message.thumbnailUrlTemplate != null && message.hasOwnProperty("thumbnailUrlTemplate")) + object.thumbnailUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.thumbnailUrlTemplate, options); + if (message.kmlUrlTemplate != null && message.hasOwnProperty("kmlUrlTemplate")) + object.kmlUrlTemplate = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.kmlUrlTemplate, options); + return object; + }; + + AlleycatImageryTypeProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + AlleycatImageryTypeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto"; + }; + + return AlleycatImageryTypeProto; + })(); + + return FilmstripConfigProto; + })(); + + EndSnippetProto.StarDataProto = (function() { + + function StarDataProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + StarDataProto.prototype.url = null; + + StarDataProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EndSnippetProto.StarDataProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.url = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + StarDataProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.url); + if (error) + return "url." + error; + } + return null; + }; + + StarDataProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EndSnippetProto.StarDataProto) + return object; + var message = new $root.keyhole.dbroot.EndSnippetProto.StarDataProto(); + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".keyhole.dbroot.EndSnippetProto.StarDataProto.url: object expected"); + message.url = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.url); + } + return message; + }; + + StarDataProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.url = null; + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.url, options); + return object; + }; + + StarDataProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + StarDataProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EndSnippetProto.StarDataProto"; + }; + + return StarDataProto; + })(); + + return EndSnippetProto; + })(); + + dbroot.DbRootRefProto = (function() { + + function DbRootRefProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + DbRootRefProto.prototype.url = ""; + DbRootRefProto.prototype.isCritical = false; + DbRootRefProto.prototype.requirements = null; + + DbRootRefProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.DbRootRefProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + message.url = reader.string(); + break; + } + case 1: { + message.isCritical = reader.bool(); + break; + } + case 3: { + message.requirements = $root.keyhole.dbroot.RequirementProto.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("url")) + throw $util.ProtocolError("missing required 'url'", { instance: message }); + return message; + }; + + DbRootRefProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.isCritical != null && message.hasOwnProperty("isCritical")) + if (typeof message.isCritical !== "boolean") + return "isCritical: boolean expected"; + if (message.requirements != null && message.hasOwnProperty("requirements")) { + var error = $root.keyhole.dbroot.RequirementProto.verify(message.requirements); + if (error) + return "requirements." + error; + } + return null; + }; + + DbRootRefProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.DbRootRefProto) + return object; + var message = new $root.keyhole.dbroot.DbRootRefProto(); + if (object.url != null) + message.url = String(object.url); + if (object.isCritical != null) + message.isCritical = Boolean(object.isCritical); + if (object.requirements != null) { + if (typeof object.requirements !== "object") + throw TypeError(".keyhole.dbroot.DbRootRefProto.requirements: object expected"); + message.requirements = $root.keyhole.dbroot.RequirementProto.fromObject(object.requirements); + } + return message; + }; + + DbRootRefProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.isCritical = false; + object.url = ""; + object.requirements = null; + } + if (message.isCritical != null && message.hasOwnProperty("isCritical")) + object.isCritical = message.isCritical; + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.requirements != null && message.hasOwnProperty("requirements")) + object.requirements = $root.keyhole.dbroot.RequirementProto.toObject(message.requirements, options); + return object; + }; + + DbRootRefProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DbRootRefProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.DbRootRefProto"; + }; + + return DbRootRefProto; + })(); + + dbroot.DatabaseVersionProto = (function() { + + function DatabaseVersionProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + DatabaseVersionProto.prototype.quadtreeVersion = 0; + + DatabaseVersionProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.DatabaseVersionProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.quadtreeVersion = reader.uint32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("quadtreeVersion")) + throw $util.ProtocolError("missing required 'quadtreeVersion'", { instance: message }); + return message; + }; + + DatabaseVersionProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.quadtreeVersion)) + return "quadtreeVersion: integer expected"; + return null; + }; + + DatabaseVersionProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.DatabaseVersionProto) + return object; + var message = new $root.keyhole.dbroot.DatabaseVersionProto(); + if (object.quadtreeVersion != null) + message.quadtreeVersion = object.quadtreeVersion >>> 0; + return message; + }; + + DatabaseVersionProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.quadtreeVersion = 0; + if (message.quadtreeVersion != null && message.hasOwnProperty("quadtreeVersion")) + object.quadtreeVersion = message.quadtreeVersion; + return object; + }; + + DatabaseVersionProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DatabaseVersionProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.DatabaseVersionProto"; + }; + + return DatabaseVersionProto; + })(); + + dbroot.DbRootProto = (function() { + + function DbRootProto(properties) { + this.providerInfo = []; + this.nestedFeature = []; + this.styleAttribute = []; + this.styleMap = []; + this.translationEntry = []; + this.dbrootReference = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + DbRootProto.prototype.databaseName = null; + DbRootProto.prototype.imageryPresent = true; + DbRootProto.prototype.protoImagery = false; + DbRootProto.prototype.terrainPresent = false; + DbRootProto.prototype.providerInfo = $util.emptyArray; + DbRootProto.prototype.nestedFeature = $util.emptyArray; + DbRootProto.prototype.styleAttribute = $util.emptyArray; + DbRootProto.prototype.styleMap = $util.emptyArray; + DbRootProto.prototype.endSnippet = null; + DbRootProto.prototype.translationEntry = $util.emptyArray; + DbRootProto.prototype.language = "en"; + DbRootProto.prototype.version = 5; + DbRootProto.prototype.dbrootReference = $util.emptyArray; + DbRootProto.prototype.databaseVersion = null; + DbRootProto.prototype.refreshTimeout = 0; + + DbRootProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.DbRootProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 15: { + message.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.decode(reader, reader.uint32()); + break; + } + case 1: { + message.imageryPresent = reader.bool(); + break; + } + case 14: { + message.protoImagery = reader.bool(); + break; + } + case 2: { + message.terrainPresent = reader.bool(); + break; + } + case 3: { + if (!(message.providerInfo && message.providerInfo.length)) + message.providerInfo = []; + message.providerInfo.push($root.keyhole.dbroot.ProviderInfoProto.decode(reader, reader.uint32())); + break; + } + case 4: { + if (!(message.nestedFeature && message.nestedFeature.length)) + message.nestedFeature = []; + message.nestedFeature.push($root.keyhole.dbroot.NestedFeatureProto.decode(reader, reader.uint32())); + break; + } + case 5: { + if (!(message.styleAttribute && message.styleAttribute.length)) + message.styleAttribute = []; + message.styleAttribute.push($root.keyhole.dbroot.StyleAttributeProto.decode(reader, reader.uint32())); + break; + } + case 6: { + if (!(message.styleMap && message.styleMap.length)) + message.styleMap = []; + message.styleMap.push($root.keyhole.dbroot.StyleMapProto.decode(reader, reader.uint32())); + break; + } + case 7: { + message.endSnippet = $root.keyhole.dbroot.EndSnippetProto.decode(reader, reader.uint32()); + break; + } + case 8: { + if (!(message.translationEntry && message.translationEntry.length)) + message.translationEntry = []; + message.translationEntry.push($root.keyhole.dbroot.StringEntryProto.decode(reader, reader.uint32())); + break; + } + case 9: { + message.language = reader.string(); + break; + } + case 10: { + message.version = reader.int32(); + break; + } + case 11: { + if (!(message.dbrootReference && message.dbrootReference.length)) + message.dbrootReference = []; + message.dbrootReference.push($root.keyhole.dbroot.DbRootRefProto.decode(reader, reader.uint32())); + break; + } + case 13: { + message.databaseVersion = $root.keyhole.dbroot.DatabaseVersionProto.decode(reader, reader.uint32()); + break; + } + case 16: { + message.refreshTimeout = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + DbRootProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.databaseName != null && message.hasOwnProperty("databaseName")) { + var error = $root.keyhole.dbroot.StringIdOrValueProto.verify(message.databaseName); + if (error) + return "databaseName." + error; + } + if (message.imageryPresent != null && message.hasOwnProperty("imageryPresent")) + if (typeof message.imageryPresent !== "boolean") + return "imageryPresent: boolean expected"; + if (message.protoImagery != null && message.hasOwnProperty("protoImagery")) + if (typeof message.protoImagery !== "boolean") + return "protoImagery: boolean expected"; + if (message.terrainPresent != null && message.hasOwnProperty("terrainPresent")) + if (typeof message.terrainPresent !== "boolean") + return "terrainPresent: boolean expected"; + if (message.providerInfo != null && message.hasOwnProperty("providerInfo")) { + if (!Array.isArray(message.providerInfo)) + return "providerInfo: array expected"; + for (var i = 0; i < message.providerInfo.length; ++i) { + var error = $root.keyhole.dbroot.ProviderInfoProto.verify(message.providerInfo[i]); + if (error) + return "providerInfo." + error; + } + } + if (message.nestedFeature != null && message.hasOwnProperty("nestedFeature")) { + if (!Array.isArray(message.nestedFeature)) + return "nestedFeature: array expected"; + for (var i = 0; i < message.nestedFeature.length; ++i) { + var error = $root.keyhole.dbroot.NestedFeatureProto.verify(message.nestedFeature[i]); + if (error) + return "nestedFeature." + error; + } + } + if (message.styleAttribute != null && message.hasOwnProperty("styleAttribute")) { + if (!Array.isArray(message.styleAttribute)) + return "styleAttribute: array expected"; + for (var i = 0; i < message.styleAttribute.length; ++i) { + var error = $root.keyhole.dbroot.StyleAttributeProto.verify(message.styleAttribute[i]); + if (error) + return "styleAttribute." + error; + } + } + if (message.styleMap != null && message.hasOwnProperty("styleMap")) { + if (!Array.isArray(message.styleMap)) + return "styleMap: array expected"; + for (var i = 0; i < message.styleMap.length; ++i) { + var error = $root.keyhole.dbroot.StyleMapProto.verify(message.styleMap[i]); + if (error) + return "styleMap." + error; + } + } + if (message.endSnippet != null && message.hasOwnProperty("endSnippet")) { + var error = $root.keyhole.dbroot.EndSnippetProto.verify(message.endSnippet); + if (error) + return "endSnippet." + error; + } + if (message.translationEntry != null && message.hasOwnProperty("translationEntry")) { + if (!Array.isArray(message.translationEntry)) + return "translationEntry: array expected"; + for (var i = 0; i < message.translationEntry.length; ++i) { + var error = $root.keyhole.dbroot.StringEntryProto.verify(message.translationEntry[i]); + if (error) + return "translationEntry." + error; + } + } + if (message.language != null && message.hasOwnProperty("language")) + if (!$util.isString(message.language)) + return "language: string expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isInteger(message.version)) + return "version: integer expected"; + if (message.dbrootReference != null && message.hasOwnProperty("dbrootReference")) { + if (!Array.isArray(message.dbrootReference)) + return "dbrootReference: array expected"; + for (var i = 0; i < message.dbrootReference.length; ++i) { + var error = $root.keyhole.dbroot.DbRootRefProto.verify(message.dbrootReference[i]); + if (error) + return "dbrootReference." + error; + } + } + if (message.databaseVersion != null && message.hasOwnProperty("databaseVersion")) { + var error = $root.keyhole.dbroot.DatabaseVersionProto.verify(message.databaseVersion); + if (error) + return "databaseVersion." + error; + } + if (message.refreshTimeout != null && message.hasOwnProperty("refreshTimeout")) + if (!$util.isInteger(message.refreshTimeout)) + return "refreshTimeout: integer expected"; + return null; + }; + + DbRootProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.DbRootProto) + return object; + var message = new $root.keyhole.dbroot.DbRootProto(); + if (object.databaseName != null) { + if (typeof object.databaseName !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.databaseName: object expected"); + message.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.fromObject(object.databaseName); + } + if (object.imageryPresent != null) + message.imageryPresent = Boolean(object.imageryPresent); + if (object.protoImagery != null) + message.protoImagery = Boolean(object.protoImagery); + if (object.terrainPresent != null) + message.terrainPresent = Boolean(object.terrainPresent); + if (object.providerInfo) { + if (!Array.isArray(object.providerInfo)) + throw TypeError(".keyhole.dbroot.DbRootProto.providerInfo: array expected"); + message.providerInfo = []; + for (var i = 0; i < object.providerInfo.length; ++i) { + if (typeof object.providerInfo[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.providerInfo: object expected"); + message.providerInfo[i] = $root.keyhole.dbroot.ProviderInfoProto.fromObject(object.providerInfo[i]); + } + } + if (object.nestedFeature) { + if (!Array.isArray(object.nestedFeature)) + throw TypeError(".keyhole.dbroot.DbRootProto.nestedFeature: array expected"); + message.nestedFeature = []; + for (var i = 0; i < object.nestedFeature.length; ++i) { + if (typeof object.nestedFeature[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.nestedFeature: object expected"); + message.nestedFeature[i] = $root.keyhole.dbroot.NestedFeatureProto.fromObject(object.nestedFeature[i]); + } + } + if (object.styleAttribute) { + if (!Array.isArray(object.styleAttribute)) + throw TypeError(".keyhole.dbroot.DbRootProto.styleAttribute: array expected"); + message.styleAttribute = []; + for (var i = 0; i < object.styleAttribute.length; ++i) { + if (typeof object.styleAttribute[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.styleAttribute: object expected"); + message.styleAttribute[i] = $root.keyhole.dbroot.StyleAttributeProto.fromObject(object.styleAttribute[i]); + } + } + if (object.styleMap) { + if (!Array.isArray(object.styleMap)) + throw TypeError(".keyhole.dbroot.DbRootProto.styleMap: array expected"); + message.styleMap = []; + for (var i = 0; i < object.styleMap.length; ++i) { + if (typeof object.styleMap[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.styleMap: object expected"); + message.styleMap[i] = $root.keyhole.dbroot.StyleMapProto.fromObject(object.styleMap[i]); + } + } + if (object.endSnippet != null) { + if (typeof object.endSnippet !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.endSnippet: object expected"); + message.endSnippet = $root.keyhole.dbroot.EndSnippetProto.fromObject(object.endSnippet); + } + if (object.translationEntry) { + if (!Array.isArray(object.translationEntry)) + throw TypeError(".keyhole.dbroot.DbRootProto.translationEntry: array expected"); + message.translationEntry = []; + for (var i = 0; i < object.translationEntry.length; ++i) { + if (typeof object.translationEntry[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.translationEntry: object expected"); + message.translationEntry[i] = $root.keyhole.dbroot.StringEntryProto.fromObject(object.translationEntry[i]); + } + } + if (object.language != null) + message.language = String(object.language); + if (object.version != null) + message.version = object.version | 0; + if (object.dbrootReference) { + if (!Array.isArray(object.dbrootReference)) + throw TypeError(".keyhole.dbroot.DbRootProto.dbrootReference: array expected"); + message.dbrootReference = []; + for (var i = 0; i < object.dbrootReference.length; ++i) { + if (typeof object.dbrootReference[i] !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.dbrootReference: object expected"); + message.dbrootReference[i] = $root.keyhole.dbroot.DbRootRefProto.fromObject(object.dbrootReference[i]); + } + } + if (object.databaseVersion != null) { + if (typeof object.databaseVersion !== "object") + throw TypeError(".keyhole.dbroot.DbRootProto.databaseVersion: object expected"); + message.databaseVersion = $root.keyhole.dbroot.DatabaseVersionProto.fromObject(object.databaseVersion); + } + if (object.refreshTimeout != null) + message.refreshTimeout = object.refreshTimeout | 0; + return message; + }; + + DbRootProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.providerInfo = []; + object.nestedFeature = []; + object.styleAttribute = []; + object.styleMap = []; + object.translationEntry = []; + object.dbrootReference = []; + } + if (options.defaults) { + object.imageryPresent = true; + object.terrainPresent = false; + object.endSnippet = null; + object.language = "en"; + object.version = 5; + object.databaseVersion = null; + object.protoImagery = false; + object.databaseName = null; + object.refreshTimeout = 0; + } + if (message.imageryPresent != null && message.hasOwnProperty("imageryPresent")) + object.imageryPresent = message.imageryPresent; + if (message.terrainPresent != null && message.hasOwnProperty("terrainPresent")) + object.terrainPresent = message.terrainPresent; + if (message.providerInfo && message.providerInfo.length) { + object.providerInfo = []; + for (var j = 0; j < message.providerInfo.length; ++j) + object.providerInfo[j] = $root.keyhole.dbroot.ProviderInfoProto.toObject(message.providerInfo[j], options); + } + if (message.nestedFeature && message.nestedFeature.length) { + object.nestedFeature = []; + for (var j = 0; j < message.nestedFeature.length; ++j) + object.nestedFeature[j] = $root.keyhole.dbroot.NestedFeatureProto.toObject(message.nestedFeature[j], options); + } + if (message.styleAttribute && message.styleAttribute.length) { + object.styleAttribute = []; + for (var j = 0; j < message.styleAttribute.length; ++j) + object.styleAttribute[j] = $root.keyhole.dbroot.StyleAttributeProto.toObject(message.styleAttribute[j], options); + } + if (message.styleMap && message.styleMap.length) { + object.styleMap = []; + for (var j = 0; j < message.styleMap.length; ++j) + object.styleMap[j] = $root.keyhole.dbroot.StyleMapProto.toObject(message.styleMap[j], options); + } + if (message.endSnippet != null && message.hasOwnProperty("endSnippet")) + object.endSnippet = $root.keyhole.dbroot.EndSnippetProto.toObject(message.endSnippet, options); + if (message.translationEntry && message.translationEntry.length) { + object.translationEntry = []; + for (var j = 0; j < message.translationEntry.length; ++j) + object.translationEntry[j] = $root.keyhole.dbroot.StringEntryProto.toObject(message.translationEntry[j], options); + } + if (message.language != null && message.hasOwnProperty("language")) + object.language = message.language; + if (message.version != null && message.hasOwnProperty("version")) + object.version = message.version; + if (message.dbrootReference && message.dbrootReference.length) { + object.dbrootReference = []; + for (var j = 0; j < message.dbrootReference.length; ++j) + object.dbrootReference[j] = $root.keyhole.dbroot.DbRootRefProto.toObject(message.dbrootReference[j], options); + } + if (message.databaseVersion != null && message.hasOwnProperty("databaseVersion")) + object.databaseVersion = $root.keyhole.dbroot.DatabaseVersionProto.toObject(message.databaseVersion, options); + if (message.protoImagery != null && message.hasOwnProperty("protoImagery")) + object.protoImagery = message.protoImagery; + if (message.databaseName != null && message.hasOwnProperty("databaseName")) + object.databaseName = $root.keyhole.dbroot.StringIdOrValueProto.toObject(message.databaseName, options); + if (message.refreshTimeout != null && message.hasOwnProperty("refreshTimeout")) + object.refreshTimeout = message.refreshTimeout; + return object; + }; + + DbRootProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DbRootProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.DbRootProto"; + }; + + return DbRootProto; + })(); + + dbroot.EncryptedDbRootProto = (function() { + + function EncryptedDbRootProto(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + EncryptedDbRootProto.prototype.encryptionType = 0; + EncryptedDbRootProto.prototype.encryptionData = $util.newBuffer([]); + EncryptedDbRootProto.prototype.dbrootData = $util.newBuffer([]); + + EncryptedDbRootProto.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.keyhole.dbroot.EncryptedDbRootProto(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.encryptionType = reader.int32(); + break; + } + case 2: { + message.encryptionData = reader.bytes(); + break; + } + case 3: { + message.dbrootData = reader.bytes(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + EncryptedDbRootProto.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.encryptionType != null && message.hasOwnProperty("encryptionType")) + switch (message.encryptionType) { + default: + return "encryptionType: enum value expected"; + case 0: + break; + } + if (message.encryptionData != null && message.hasOwnProperty("encryptionData")) + if (!(message.encryptionData && typeof message.encryptionData.length === "number" || $util.isString(message.encryptionData))) + return "encryptionData: buffer expected"; + if (message.dbrootData != null && message.hasOwnProperty("dbrootData")) + if (!(message.dbrootData && typeof message.dbrootData.length === "number" || $util.isString(message.dbrootData))) + return "dbrootData: buffer expected"; + return null; + }; + + EncryptedDbRootProto.fromObject = function fromObject(object) { + if (object instanceof $root.keyhole.dbroot.EncryptedDbRootProto) + return object; + var message = new $root.keyhole.dbroot.EncryptedDbRootProto(); + switch (object.encryptionType) { + case "ENCRYPTION_XOR": + case 0: + message.encryptionType = 0; + break; + } + if (object.encryptionData != null) + if (typeof object.encryptionData === "string") + $util.base64.decode(object.encryptionData, message.encryptionData = $util.newBuffer($util.base64.length(object.encryptionData)), 0); + else if (object.encryptionData.length >= 0) + message.encryptionData = object.encryptionData; + if (object.dbrootData != null) + if (typeof object.dbrootData === "string") + $util.base64.decode(object.dbrootData, message.dbrootData = $util.newBuffer($util.base64.length(object.dbrootData)), 0); + else if (object.dbrootData.length >= 0) + message.dbrootData = object.dbrootData; + return message; + }; + + EncryptedDbRootProto.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.encryptionType = options.enums === String ? "ENCRYPTION_XOR" : 0; + if (options.bytes === String) + object.encryptionData = ""; + else { + object.encryptionData = []; + if (options.bytes !== Array) + object.encryptionData = $util.newBuffer(object.encryptionData); + } + if (options.bytes === String) + object.dbrootData = ""; + else { + object.dbrootData = []; + if (options.bytes !== Array) + object.dbrootData = $util.newBuffer(object.dbrootData); + } + } + if (message.encryptionType != null && message.hasOwnProperty("encryptionType")) + object.encryptionType = options.enums === String ? $root.keyhole.dbroot.EncryptedDbRootProto.EncryptionType[message.encryptionType] : message.encryptionType; + if (message.encryptionData != null && message.hasOwnProperty("encryptionData")) + object.encryptionData = options.bytes === String ? $util.base64.encode(message.encryptionData, 0, message.encryptionData.length) : options.bytes === Array ? Array.prototype.slice.call(message.encryptionData) : message.encryptionData; + if (message.dbrootData != null && message.hasOwnProperty("dbrootData")) + object.dbrootData = options.bytes === String ? $util.base64.encode(message.dbrootData, 0, message.dbrootData.length) : options.bytes === Array ? Array.prototype.slice.call(message.dbrootData) : message.dbrootData; + return object; + }; + + EncryptedDbRootProto.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + EncryptedDbRootProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/keyhole.dbroot.EncryptedDbRootProto"; + }; + + EncryptedDbRootProto.EncryptionType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ENCRYPTION_XOR"] = 0; + return values; + })(); + + return EncryptedDbRootProto; + })(); + + return dbroot; + })(); + + return keyhole; + })(); + + // End generated code + + return $root.keyhole.dbroot; +}; diff --git a/public/assets/cesium/Workers/chunk-2LOWCAMW.js b/public/assets/cesium/Workers/chunk-2LOWCAMW.js new file mode 100644 index 0000000..6e1ae81 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-2LOWCAMW.js @@ -0,0 +1,390 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseGeometryLibrary_default +} from "./chunk-JISPSEF3.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipseOutlineGeometry.js +var scratchCartesian1 = new Cartesian3_default(); +var boundingSphereCenter = new Cartesian3_default(); +function computeEllipse(options) { + const center = options.center; + boundingSphereCenter = Cartesian3_default.multiplyByScalar( + options.ellipsoid.geodeticSurfaceNormal(center, boundingSphereCenter), + options.height, + boundingSphereCenter + ); + boundingSphereCenter = Cartesian3_default.add( + center, + boundingSphereCenter, + boundingSphereCenter + ); + const boundingSphere = new BoundingSphere_default( + boundingSphereCenter, + options.semiMajorAxis + ); + const positions = EllipseGeometryLibrary_default.computeEllipsePositions( + options, + false, + true + ).outerPositions; + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: EllipseGeometryLibrary_default.raisePositionsToHeight( + positions, + options, + false + ) + }) + }); + const length = positions.length / 3; + const indices = IndexDatatype_default.createTypedArray(length, length * 2); + let index = 0; + for (let i = 0; i < length; ++i) { + indices[index++] = i; + indices[index++] = (i + 1) % length; + } + return { + boundingSphere, + attributes, + indices + }; +} +var topBoundingSphere = new BoundingSphere_default(); +var bottomBoundingSphere = new BoundingSphere_default(); +function computeExtrudedEllipse(options) { + const center = options.center; + const ellipsoid = options.ellipsoid; + const semiMajorAxis = options.semiMajorAxis; + let scaledNormal = Cartesian3_default.multiplyByScalar( + ellipsoid.geodeticSurfaceNormal(center, scratchCartesian1), + options.height, + scratchCartesian1 + ); + topBoundingSphere.center = Cartesian3_default.add( + center, + scaledNormal, + topBoundingSphere.center + ); + topBoundingSphere.radius = semiMajorAxis; + scaledNormal = Cartesian3_default.multiplyByScalar( + ellipsoid.geodeticSurfaceNormal(center, scaledNormal), + options.extrudedHeight, + scaledNormal + ); + bottomBoundingSphere.center = Cartesian3_default.add( + center, + scaledNormal, + bottomBoundingSphere.center + ); + bottomBoundingSphere.radius = semiMajorAxis; + let positions = EllipseGeometryLibrary_default.computeEllipsePositions( + options, + false, + true + ).outerPositions; + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: EllipseGeometryLibrary_default.raisePositionsToHeight( + positions, + options, + true + ) + }) + }); + positions = attributes.position.values; + const boundingSphere = BoundingSphere_default.union( + topBoundingSphere, + bottomBoundingSphere + ); + let length = positions.length / 3; + if (defined_default(options.offsetAttribute)) { + let applyOffset = new Uint8Array(length); + if (options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + applyOffset = applyOffset.fill(1, 0, length / 2); + } else { + const offsetValue = options.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + applyOffset = applyOffset.fill(offsetValue); + } + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + let numberOfVerticalLines = defaultValue_default(options.numberOfVerticalLines, 16); + numberOfVerticalLines = Math_default.clamp( + numberOfVerticalLines, + 0, + length / 2 + ); + const indices = IndexDatatype_default.createTypedArray( + length, + length * 2 + numberOfVerticalLines * 2 + ); + length /= 2; + let index = 0; + let i; + for (i = 0; i < length; ++i) { + indices[index++] = i; + indices[index++] = (i + 1) % length; + indices[index++] = i + length; + indices[index++] = (i + 1) % length + length; + } + let numSide; + if (numberOfVerticalLines > 0) { + const numSideLines = Math.min(numberOfVerticalLines, length); + numSide = Math.round(length / numSideLines); + const maxI = Math.min(numSide * numberOfVerticalLines, length); + for (i = 0; i < maxI; i += numSide) { + indices[index++] = i; + indices[index++] = i + length; + } + } + return { + boundingSphere, + attributes, + indices + }; +} +function EllipseOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const center = options.center; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const semiMajorAxis = options.semiMajorAxis; + const semiMinorAxis = options.semiMinorAxis; + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + if (!defined_default(center)) { + throw new DeveloperError_default("center is required."); + } + if (!defined_default(semiMajorAxis)) { + throw new DeveloperError_default("semiMajorAxis is required."); + } + if (!defined_default(semiMinorAxis)) { + throw new DeveloperError_default("semiMinorAxis is required."); + } + if (semiMajorAxis < semiMinorAxis) { + throw new DeveloperError_default( + "semiMajorAxis must be greater than or equal to the semiMinorAxis." + ); + } + if (granularity <= 0) { + throw new DeveloperError_default("granularity must be greater than zero."); + } + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._center = Cartesian3_default.clone(center); + this._semiMajorAxis = semiMajorAxis; + this._semiMinorAxis = semiMinorAxis; + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._rotation = defaultValue_default(options.rotation, 0); + this._height = Math.max(extrudedHeight, height); + this._granularity = granularity; + this._extrudedHeight = Math.min(extrudedHeight, height); + this._numberOfVerticalLines = Math.max( + defaultValue_default(options.numberOfVerticalLines, 16), + 0 + ); + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createEllipseOutlineGeometry"; +} +EllipseOutlineGeometry.packedLength = Cartesian3_default.packedLength + Ellipsoid_default.packedLength + 8; +EllipseOutlineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._center, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._semiMajorAxis; + array[startingIndex++] = value._semiMinorAxis; + array[startingIndex++] = value._rotation; + array[startingIndex++] = value._height; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._numberOfVerticalLines; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchCenter = new Cartesian3_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchOptions = { + center: scratchCenter, + ellipsoid: scratchEllipsoid, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + rotation: void 0, + height: void 0, + granularity: void 0, + extrudedHeight: void 0, + numberOfVerticalLines: void 0, + offsetAttribute: void 0 +}; +EllipseOutlineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + const center = Cartesian3_default.unpack(array, startingIndex, scratchCenter); + startingIndex += Cartesian3_default.packedLength; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const semiMajorAxis = array[startingIndex++]; + const semiMinorAxis = array[startingIndex++]; + const rotation = array[startingIndex++]; + const height = array[startingIndex++]; + const granularity = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const numberOfVerticalLines = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.height = height; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.granularity = granularity; + scratchOptions.rotation = rotation; + scratchOptions.semiMajorAxis = semiMajorAxis; + scratchOptions.semiMinorAxis = semiMinorAxis; + scratchOptions.numberOfVerticalLines = numberOfVerticalLines; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new EllipseOutlineGeometry(scratchOptions); + } + result._center = Cartesian3_default.clone(center, result._center); + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._semiMajorAxis = semiMajorAxis; + result._semiMinorAxis = semiMinorAxis; + result._rotation = rotation; + result._height = height; + result._granularity = granularity; + result._extrudedHeight = extrudedHeight; + result._numberOfVerticalLines = numberOfVerticalLines; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +EllipseOutlineGeometry.createGeometry = function(ellipseGeometry) { + if (ellipseGeometry._semiMajorAxis <= 0 || ellipseGeometry._semiMinorAxis <= 0) { + return; + } + const height = ellipseGeometry._height; + const extrudedHeight = ellipseGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + height, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + ellipseGeometry._center = ellipseGeometry._ellipsoid.scaleToGeodeticSurface( + ellipseGeometry._center, + ellipseGeometry._center + ); + const options = { + center: ellipseGeometry._center, + semiMajorAxis: ellipseGeometry._semiMajorAxis, + semiMinorAxis: ellipseGeometry._semiMinorAxis, + ellipsoid: ellipseGeometry._ellipsoid, + rotation: ellipseGeometry._rotation, + height, + granularity: ellipseGeometry._granularity, + numberOfVerticalLines: ellipseGeometry._numberOfVerticalLines + }; + let geometry; + if (extrude) { + options.extrudedHeight = extrudedHeight; + options.offsetAttribute = ellipseGeometry._offsetAttribute; + geometry = computeExtrudedEllipse(options); + } else { + geometry = computeEllipse(options); + if (defined_default(ellipseGeometry._offsetAttribute)) { + const length = geometry.attributes.position.values.length; + const offsetValue = ellipseGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + } + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: geometry.boundingSphere, + offsetAttribute: ellipseGeometry._offsetAttribute + }); +}; +var EllipseOutlineGeometry_default = EllipseOutlineGeometry; + +export { + EllipseOutlineGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-2PTKXHJB.js b/public/assets/cesium/Workers/chunk-2PTKXHJB.js new file mode 100644 index 0000000..8a16c7e --- /dev/null +++ b/public/assets/cesium/Workers/chunk-2PTKXHJB.js @@ -0,0 +1,834 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidTangentPlane_default +} from "./chunk-YK3QIKY7.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + BoundingSphere_default, + Intersect_default, + Interval_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/OrientedBoundingBox.js +function OrientedBoundingBox(center, halfAxes) { + this.center = Cartesian3_default.clone(defaultValue_default(center, Cartesian3_default.ZERO)); + this.halfAxes = Matrix3_default.clone(defaultValue_default(halfAxes, Matrix3_default.ZERO)); +} +OrientedBoundingBox.packedLength = Cartesian3_default.packedLength + Matrix3_default.packedLength; +OrientedBoundingBox.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value.center, array, startingIndex); + Matrix3_default.pack(value.halfAxes, array, startingIndex + Cartesian3_default.packedLength); + return array; +}; +OrientedBoundingBox.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new OrientedBoundingBox(); + } + Cartesian3_default.unpack(array, startingIndex, result.center); + Matrix3_default.unpack( + array, + startingIndex + Cartesian3_default.packedLength, + result.halfAxes + ); + return result; +}; +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartesian3 = new Cartesian3_default(); +var scratchCartesian4 = new Cartesian3_default(); +var scratchCartesian5 = new Cartesian3_default(); +var scratchCartesian6 = new Cartesian3_default(); +var scratchCovarianceResult = new Matrix3_default(); +var scratchEigenResult = { + unitary: new Matrix3_default(), + diagonal: new Matrix3_default() +}; +OrientedBoundingBox.fromPoints = function(positions, result) { + if (!defined_default(result)) { + result = new OrientedBoundingBox(); + } + if (!defined_default(positions) || positions.length === 0) { + result.halfAxes = Matrix3_default.ZERO; + result.center = Cartesian3_default.ZERO; + return result; + } + let i; + const length = positions.length; + const meanPoint = Cartesian3_default.clone(positions[0], scratchCartesian1); + for (i = 1; i < length; i++) { + Cartesian3_default.add(meanPoint, positions[i], meanPoint); + } + const invLength = 1 / length; + Cartesian3_default.multiplyByScalar(meanPoint, invLength, meanPoint); + let exx = 0; + let exy = 0; + let exz = 0; + let eyy = 0; + let eyz = 0; + let ezz = 0; + let p; + for (i = 0; i < length; i++) { + p = Cartesian3_default.subtract(positions[i], meanPoint, scratchCartesian2); + exx += p.x * p.x; + exy += p.x * p.y; + exz += p.x * p.z; + eyy += p.y * p.y; + eyz += p.y * p.z; + ezz += p.z * p.z; + } + exx *= invLength; + exy *= invLength; + exz *= invLength; + eyy *= invLength; + eyz *= invLength; + ezz *= invLength; + const covarianceMatrix = scratchCovarianceResult; + covarianceMatrix[0] = exx; + covarianceMatrix[1] = exy; + covarianceMatrix[2] = exz; + covarianceMatrix[3] = exy; + covarianceMatrix[4] = eyy; + covarianceMatrix[5] = eyz; + covarianceMatrix[6] = exz; + covarianceMatrix[7] = eyz; + covarianceMatrix[8] = ezz; + const eigenDecomposition = Matrix3_default.computeEigenDecomposition( + covarianceMatrix, + scratchEigenResult + ); + const rotation = Matrix3_default.clone(eigenDecomposition.unitary, result.halfAxes); + let v1 = Matrix3_default.getColumn(rotation, 0, scratchCartesian4); + let v2 = Matrix3_default.getColumn(rotation, 1, scratchCartesian5); + let v3 = Matrix3_default.getColumn(rotation, 2, scratchCartesian6); + let u1 = -Number.MAX_VALUE; + let u2 = -Number.MAX_VALUE; + let u3 = -Number.MAX_VALUE; + let l1 = Number.MAX_VALUE; + let l2 = Number.MAX_VALUE; + let l3 = Number.MAX_VALUE; + for (i = 0; i < length; i++) { + p = positions[i]; + u1 = Math.max(Cartesian3_default.dot(v1, p), u1); + u2 = Math.max(Cartesian3_default.dot(v2, p), u2); + u3 = Math.max(Cartesian3_default.dot(v3, p), u3); + l1 = Math.min(Cartesian3_default.dot(v1, p), l1); + l2 = Math.min(Cartesian3_default.dot(v2, p), l2); + l3 = Math.min(Cartesian3_default.dot(v3, p), l3); + } + v1 = Cartesian3_default.multiplyByScalar(v1, 0.5 * (l1 + u1), v1); + v2 = Cartesian3_default.multiplyByScalar(v2, 0.5 * (l2 + u2), v2); + v3 = Cartesian3_default.multiplyByScalar(v3, 0.5 * (l3 + u3), v3); + const center = Cartesian3_default.add(v1, v2, result.center); + Cartesian3_default.add(center, v3, center); + const scale = scratchCartesian3; + scale.x = u1 - l1; + scale.y = u2 - l2; + scale.z = u3 - l3; + Cartesian3_default.multiplyByScalar(scale, 0.5, scale); + Matrix3_default.multiplyByScale(result.halfAxes, scale, result.halfAxes); + return result; +}; +var scratchOffset = new Cartesian3_default(); +var scratchScale = new Cartesian3_default(); +function fromPlaneExtents(planeOrigin, planeXAxis, planeYAxis, planeZAxis, minimumX, maximumX, minimumY, maximumY, minimumZ, maximumZ, result) { + if (!defined_default(minimumX) || !defined_default(maximumX) || !defined_default(minimumY) || !defined_default(maximumY) || !defined_default(minimumZ) || !defined_default(maximumZ)) { + throw new DeveloperError_default( + "all extents (minimum/maximum X/Y/Z) are required." + ); + } + if (!defined_default(result)) { + result = new OrientedBoundingBox(); + } + const halfAxes = result.halfAxes; + Matrix3_default.setColumn(halfAxes, 0, planeXAxis, halfAxes); + Matrix3_default.setColumn(halfAxes, 1, planeYAxis, halfAxes); + Matrix3_default.setColumn(halfAxes, 2, planeZAxis, halfAxes); + let centerOffset = scratchOffset; + centerOffset.x = (minimumX + maximumX) / 2; + centerOffset.y = (minimumY + maximumY) / 2; + centerOffset.z = (minimumZ + maximumZ) / 2; + const scale = scratchScale; + scale.x = (maximumX - minimumX) / 2; + scale.y = (maximumY - minimumY) / 2; + scale.z = (maximumZ - minimumZ) / 2; + const center = result.center; + centerOffset = Matrix3_default.multiplyByVector(halfAxes, centerOffset, centerOffset); + Cartesian3_default.add(planeOrigin, centerOffset, center); + Matrix3_default.multiplyByScale(halfAxes, scale, halfAxes); + return result; +} +var scratchRectangleCenterCartographic = new Cartographic_default(); +var scratchRectangleCenter = new Cartesian3_default(); +var scratchPerimeterCartographicNC = new Cartographic_default(); +var scratchPerimeterCartographicNW = new Cartographic_default(); +var scratchPerimeterCartographicCW = new Cartographic_default(); +var scratchPerimeterCartographicSW = new Cartographic_default(); +var scratchPerimeterCartographicSC = new Cartographic_default(); +var scratchPerimeterCartesianNC = new Cartesian3_default(); +var scratchPerimeterCartesianNW = new Cartesian3_default(); +var scratchPerimeterCartesianCW = new Cartesian3_default(); +var scratchPerimeterCartesianSW = new Cartesian3_default(); +var scratchPerimeterCartesianSC = new Cartesian3_default(); +var scratchPerimeterProjectedNC = new Cartesian2_default(); +var scratchPerimeterProjectedNW = new Cartesian2_default(); +var scratchPerimeterProjectedCW = new Cartesian2_default(); +var scratchPerimeterProjectedSW = new Cartesian2_default(); +var scratchPerimeterProjectedSC = new Cartesian2_default(); +var scratchPlaneOrigin = new Cartesian3_default(); +var scratchPlaneNormal = new Cartesian3_default(); +var scratchPlaneXAxis = new Cartesian3_default(); +var scratchHorizonCartesian = new Cartesian3_default(); +var scratchHorizonProjected = new Cartesian2_default(); +var scratchMaxY = new Cartesian3_default(); +var scratchMinY = new Cartesian3_default(); +var scratchZ = new Cartesian3_default(); +var scratchPlane = new Plane_default(Cartesian3_default.UNIT_X, 0); +OrientedBoundingBox.fromRectangle = function(rectangle, minimumHeight, maximumHeight, ellipsoid, result) { + if (!defined_default(rectangle)) { + throw new DeveloperError_default("rectangle is required"); + } + if (rectangle.width < 0 || rectangle.width > Math_default.TWO_PI) { + throw new DeveloperError_default("Rectangle width must be between 0 and 2 * pi"); + } + if (rectangle.height < 0 || rectangle.height > Math_default.PI) { + throw new DeveloperError_default("Rectangle height must be between 0 and pi"); + } + if (defined_default(ellipsoid) && !Math_default.equalsEpsilon( + ellipsoid.radii.x, + ellipsoid.radii.y, + Math_default.EPSILON15 + )) { + throw new DeveloperError_default( + "Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)" + ); + } + minimumHeight = defaultValue_default(minimumHeight, 0); + maximumHeight = defaultValue_default(maximumHeight, 0); + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + let minX, maxX, minY, maxY, minZ, maxZ, plane; + if (rectangle.width <= Math_default.PI) { + const tangentPointCartographic = Rectangle_default.center( + rectangle, + scratchRectangleCenterCartographic + ); + const tangentPoint = ellipsoid.cartographicToCartesian( + tangentPointCartographic, + scratchRectangleCenter + ); + const tangentPlane = new EllipsoidTangentPlane_default(tangentPoint, ellipsoid); + plane = tangentPlane.plane; + const lonCenter = tangentPointCartographic.longitude; + const latCenter = rectangle.south < 0 && rectangle.north > 0 ? 0 : tangentPointCartographic.latitude; + const perimeterCartographicNC = Cartographic_default.fromRadians( + lonCenter, + rectangle.north, + maximumHeight, + scratchPerimeterCartographicNC + ); + const perimeterCartographicNW = Cartographic_default.fromRadians( + rectangle.west, + rectangle.north, + maximumHeight, + scratchPerimeterCartographicNW + ); + const perimeterCartographicCW = Cartographic_default.fromRadians( + rectangle.west, + latCenter, + maximumHeight, + scratchPerimeterCartographicCW + ); + const perimeterCartographicSW = Cartographic_default.fromRadians( + rectangle.west, + rectangle.south, + maximumHeight, + scratchPerimeterCartographicSW + ); + const perimeterCartographicSC = Cartographic_default.fromRadians( + lonCenter, + rectangle.south, + maximumHeight, + scratchPerimeterCartographicSC + ); + const perimeterCartesianNC = ellipsoid.cartographicToCartesian( + perimeterCartographicNC, + scratchPerimeterCartesianNC + ); + let perimeterCartesianNW = ellipsoid.cartographicToCartesian( + perimeterCartographicNW, + scratchPerimeterCartesianNW + ); + const perimeterCartesianCW = ellipsoid.cartographicToCartesian( + perimeterCartographicCW, + scratchPerimeterCartesianCW + ); + let perimeterCartesianSW = ellipsoid.cartographicToCartesian( + perimeterCartographicSW, + scratchPerimeterCartesianSW + ); + const perimeterCartesianSC = ellipsoid.cartographicToCartesian( + perimeterCartographicSC, + scratchPerimeterCartesianSC + ); + const perimeterProjectedNC = tangentPlane.projectPointToNearestOnPlane( + perimeterCartesianNC, + scratchPerimeterProjectedNC + ); + const perimeterProjectedNW = tangentPlane.projectPointToNearestOnPlane( + perimeterCartesianNW, + scratchPerimeterProjectedNW + ); + const perimeterProjectedCW = tangentPlane.projectPointToNearestOnPlane( + perimeterCartesianCW, + scratchPerimeterProjectedCW + ); + const perimeterProjectedSW = tangentPlane.projectPointToNearestOnPlane( + perimeterCartesianSW, + scratchPerimeterProjectedSW + ); + const perimeterProjectedSC = tangentPlane.projectPointToNearestOnPlane( + perimeterCartesianSC, + scratchPerimeterProjectedSC + ); + minX = Math.min( + perimeterProjectedNW.x, + perimeterProjectedCW.x, + perimeterProjectedSW.x + ); + maxX = -minX; + maxY = Math.max(perimeterProjectedNW.y, perimeterProjectedNC.y); + minY = Math.min(perimeterProjectedSW.y, perimeterProjectedSC.y); + perimeterCartographicNW.height = perimeterCartographicSW.height = minimumHeight; + perimeterCartesianNW = ellipsoid.cartographicToCartesian( + perimeterCartographicNW, + scratchPerimeterCartesianNW + ); + perimeterCartesianSW = ellipsoid.cartographicToCartesian( + perimeterCartographicSW, + scratchPerimeterCartesianSW + ); + minZ = Math.min( + Plane_default.getPointDistance(plane, perimeterCartesianNW), + Plane_default.getPointDistance(plane, perimeterCartesianSW) + ); + maxZ = maximumHeight; + return fromPlaneExtents( + tangentPlane.origin, + tangentPlane.xAxis, + tangentPlane.yAxis, + tangentPlane.zAxis, + minX, + maxX, + minY, + maxY, + minZ, + maxZ, + result + ); + } + const fullyAboveEquator = rectangle.south > 0; + const fullyBelowEquator = rectangle.north < 0; + const latitudeNearestToEquator = fullyAboveEquator ? rectangle.south : fullyBelowEquator ? rectangle.north : 0; + const centerLongitude = Rectangle_default.center( + rectangle, + scratchRectangleCenterCartographic + ).longitude; + const planeOrigin = Cartesian3_default.fromRadians( + centerLongitude, + latitudeNearestToEquator, + maximumHeight, + ellipsoid, + scratchPlaneOrigin + ); + planeOrigin.z = 0; + const isPole = Math.abs(planeOrigin.x) < Math_default.EPSILON10 && Math.abs(planeOrigin.y) < Math_default.EPSILON10; + const planeNormal = !isPole ? Cartesian3_default.normalize(planeOrigin, scratchPlaneNormal) : Cartesian3_default.UNIT_X; + const planeYAxis = Cartesian3_default.UNIT_Z; + const planeXAxis = Cartesian3_default.cross( + planeNormal, + planeYAxis, + scratchPlaneXAxis + ); + plane = Plane_default.fromPointNormal(planeOrigin, planeNormal, scratchPlane); + const horizonCartesian = Cartesian3_default.fromRadians( + centerLongitude + Math_default.PI_OVER_TWO, + latitudeNearestToEquator, + maximumHeight, + ellipsoid, + scratchHorizonCartesian + ); + maxX = Cartesian3_default.dot( + Plane_default.projectPointOntoPlane( + plane, + horizonCartesian, + scratchHorizonProjected + ), + planeXAxis + ); + minX = -maxX; + maxY = Cartesian3_default.fromRadians( + 0, + rectangle.north, + fullyBelowEquator ? minimumHeight : maximumHeight, + ellipsoid, + scratchMaxY + ).z; + minY = Cartesian3_default.fromRadians( + 0, + rectangle.south, + fullyAboveEquator ? minimumHeight : maximumHeight, + ellipsoid, + scratchMinY + ).z; + const farZ = Cartesian3_default.fromRadians( + rectangle.east, + latitudeNearestToEquator, + maximumHeight, + ellipsoid, + scratchZ + ); + minZ = Plane_default.getPointDistance(plane, farZ); + maxZ = 0; + return fromPlaneExtents( + planeOrigin, + planeXAxis, + planeYAxis, + planeNormal, + minX, + maxX, + minY, + maxY, + minZ, + maxZ, + result + ); +}; +OrientedBoundingBox.fromTransformation = function(transformation, result) { + Check_default.typeOf.object("transformation", transformation); + if (!defined_default(result)) { + result = new OrientedBoundingBox(); + } + result.center = Matrix4_default.getTranslation(transformation, result.center); + result.halfAxes = Matrix4_default.getMatrix3(transformation, result.halfAxes); + result.halfAxes = Matrix3_default.multiplyByScalar( + result.halfAxes, + 0.5, + result.halfAxes + ); + return result; +}; +OrientedBoundingBox.clone = function(box, result) { + if (!defined_default(box)) { + return void 0; + } + if (!defined_default(result)) { + return new OrientedBoundingBox(box.center, box.halfAxes); + } + Cartesian3_default.clone(box.center, result.center); + Matrix3_default.clone(box.halfAxes, result.halfAxes); + return result; +}; +OrientedBoundingBox.intersectPlane = function(box, plane) { + if (!defined_default(box)) { + throw new DeveloperError_default("box is required."); + } + if (!defined_default(plane)) { + throw new DeveloperError_default("plane is required."); + } + const center = box.center; + const normal = plane.normal; + const halfAxes = box.halfAxes; + const normalX = normal.x, normalY = normal.y, normalZ = normal.z; + const radEffective = Math.abs( + normalX * halfAxes[Matrix3_default.COLUMN0ROW0] + normalY * halfAxes[Matrix3_default.COLUMN0ROW1] + normalZ * halfAxes[Matrix3_default.COLUMN0ROW2] + ) + Math.abs( + normalX * halfAxes[Matrix3_default.COLUMN1ROW0] + normalY * halfAxes[Matrix3_default.COLUMN1ROW1] + normalZ * halfAxes[Matrix3_default.COLUMN1ROW2] + ) + Math.abs( + normalX * halfAxes[Matrix3_default.COLUMN2ROW0] + normalY * halfAxes[Matrix3_default.COLUMN2ROW1] + normalZ * halfAxes[Matrix3_default.COLUMN2ROW2] + ); + const distanceToPlane = Cartesian3_default.dot(normal, center) + plane.distance; + if (distanceToPlane <= -radEffective) { + return Intersect_default.OUTSIDE; + } else if (distanceToPlane >= radEffective) { + return Intersect_default.INSIDE; + } + return Intersect_default.INTERSECTING; +}; +var scratchCartesianU = new Cartesian3_default(); +var scratchCartesianV = new Cartesian3_default(); +var scratchCartesianW = new Cartesian3_default(); +var scratchValidAxis2 = new Cartesian3_default(); +var scratchValidAxis3 = new Cartesian3_default(); +var scratchPPrime = new Cartesian3_default(); +OrientedBoundingBox.distanceSquaredTo = function(box, cartesian) { + if (!defined_default(box)) { + throw new DeveloperError_default("box is required."); + } + if (!defined_default(cartesian)) { + throw new DeveloperError_default("cartesian is required."); + } + const offset = Cartesian3_default.subtract(cartesian, box.center, scratchOffset); + const halfAxes = box.halfAxes; + let u = Matrix3_default.getColumn(halfAxes, 0, scratchCartesianU); + let v = Matrix3_default.getColumn(halfAxes, 1, scratchCartesianV); + let w = Matrix3_default.getColumn(halfAxes, 2, scratchCartesianW); + const uHalf = Cartesian3_default.magnitude(u); + const vHalf = Cartesian3_default.magnitude(v); + const wHalf = Cartesian3_default.magnitude(w); + let uValid = true; + let vValid = true; + let wValid = true; + if (uHalf > 0) { + Cartesian3_default.divideByScalar(u, uHalf, u); + } else { + uValid = false; + } + if (vHalf > 0) { + Cartesian3_default.divideByScalar(v, vHalf, v); + } else { + vValid = false; + } + if (wHalf > 0) { + Cartesian3_default.divideByScalar(w, wHalf, w); + } else { + wValid = false; + } + const numberOfDegenerateAxes = !uValid + !vValid + !wValid; + let validAxis1; + let validAxis2; + let validAxis3; + if (numberOfDegenerateAxes === 1) { + let degenerateAxis = u; + validAxis1 = v; + validAxis2 = w; + if (!vValid) { + degenerateAxis = v; + validAxis1 = u; + } else if (!wValid) { + degenerateAxis = w; + validAxis2 = u; + } + validAxis3 = Cartesian3_default.cross(validAxis1, validAxis2, scratchValidAxis3); + if (degenerateAxis === u) { + u = validAxis3; + } else if (degenerateAxis === v) { + v = validAxis3; + } else if (degenerateAxis === w) { + w = validAxis3; + } + } else if (numberOfDegenerateAxes === 2) { + validAxis1 = u; + if (vValid) { + validAxis1 = v; + } else if (wValid) { + validAxis1 = w; + } + let crossVector = Cartesian3_default.UNIT_Y; + if (crossVector.equalsEpsilon(validAxis1, Math_default.EPSILON3)) { + crossVector = Cartesian3_default.UNIT_X; + } + validAxis2 = Cartesian3_default.cross(validAxis1, crossVector, scratchValidAxis2); + Cartesian3_default.normalize(validAxis2, validAxis2); + validAxis3 = Cartesian3_default.cross(validAxis1, validAxis2, scratchValidAxis3); + Cartesian3_default.normalize(validAxis3, validAxis3); + if (validAxis1 === u) { + v = validAxis2; + w = validAxis3; + } else if (validAxis1 === v) { + w = validAxis2; + u = validAxis3; + } else if (validAxis1 === w) { + u = validAxis2; + v = validAxis3; + } + } else if (numberOfDegenerateAxes === 3) { + u = Cartesian3_default.UNIT_X; + v = Cartesian3_default.UNIT_Y; + w = Cartesian3_default.UNIT_Z; + } + const pPrime = scratchPPrime; + pPrime.x = Cartesian3_default.dot(offset, u); + pPrime.y = Cartesian3_default.dot(offset, v); + pPrime.z = Cartesian3_default.dot(offset, w); + let distanceSquared = 0; + let d; + if (pPrime.x < -uHalf) { + d = pPrime.x + uHalf; + distanceSquared += d * d; + } else if (pPrime.x > uHalf) { + d = pPrime.x - uHalf; + distanceSquared += d * d; + } + if (pPrime.y < -vHalf) { + d = pPrime.y + vHalf; + distanceSquared += d * d; + } else if (pPrime.y > vHalf) { + d = pPrime.y - vHalf; + distanceSquared += d * d; + } + if (pPrime.z < -wHalf) { + d = pPrime.z + wHalf; + distanceSquared += d * d; + } else if (pPrime.z > wHalf) { + d = pPrime.z - wHalf; + distanceSquared += d * d; + } + return distanceSquared; +}; +var scratchCorner = new Cartesian3_default(); +var scratchToCenter = new Cartesian3_default(); +OrientedBoundingBox.computePlaneDistances = function(box, position, direction, result) { + if (!defined_default(box)) { + throw new DeveloperError_default("box is required."); + } + if (!defined_default(position)) { + throw new DeveloperError_default("position is required."); + } + if (!defined_default(direction)) { + throw new DeveloperError_default("direction is required."); + } + if (!defined_default(result)) { + result = new Interval_default(); + } + let minDist = Number.POSITIVE_INFINITY; + let maxDist = Number.NEGATIVE_INFINITY; + const center = box.center; + const halfAxes = box.halfAxes; + const u = Matrix3_default.getColumn(halfAxes, 0, scratchCartesianU); + const v = Matrix3_default.getColumn(halfAxes, 1, scratchCartesianV); + const w = Matrix3_default.getColumn(halfAxes, 2, scratchCartesianW); + const corner = Cartesian3_default.add(u, v, scratchCorner); + Cartesian3_default.add(corner, w, corner); + Cartesian3_default.add(corner, center, corner); + const toCenter = Cartesian3_default.subtract(corner, position, scratchToCenter); + let mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.add(center, u, corner); + Cartesian3_default.add(corner, v, corner); + Cartesian3_default.subtract(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.add(center, u, corner); + Cartesian3_default.subtract(corner, v, corner); + Cartesian3_default.add(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.add(center, u, corner); + Cartesian3_default.subtract(corner, v, corner); + Cartesian3_default.subtract(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.subtract(center, u, corner); + Cartesian3_default.add(corner, v, corner); + Cartesian3_default.add(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.subtract(center, u, corner); + Cartesian3_default.add(corner, v, corner); + Cartesian3_default.subtract(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.subtract(center, u, corner); + Cartesian3_default.subtract(corner, v, corner); + Cartesian3_default.add(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + Cartesian3_default.subtract(center, u, corner); + Cartesian3_default.subtract(corner, v, corner); + Cartesian3_default.subtract(corner, w, corner); + Cartesian3_default.subtract(corner, position, toCenter); + mag = Cartesian3_default.dot(direction, toCenter); + minDist = Math.min(mag, minDist); + maxDist = Math.max(mag, maxDist); + result.start = minDist; + result.stop = maxDist; + return result; +}; +var scratchXAxis = new Cartesian3_default(); +var scratchYAxis = new Cartesian3_default(); +var scratchZAxis = new Cartesian3_default(); +OrientedBoundingBox.computeCorners = function(box, result) { + Check_default.typeOf.object("box", box); + if (!defined_default(result)) { + result = [ + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default() + ]; + } + const center = box.center; + const halfAxes = box.halfAxes; + const xAxis = Matrix3_default.getColumn(halfAxes, 0, scratchXAxis); + const yAxis = Matrix3_default.getColumn(halfAxes, 1, scratchYAxis); + const zAxis = Matrix3_default.getColumn(halfAxes, 2, scratchZAxis); + Cartesian3_default.clone(center, result[0]); + Cartesian3_default.subtract(result[0], xAxis, result[0]); + Cartesian3_default.subtract(result[0], yAxis, result[0]); + Cartesian3_default.subtract(result[0], zAxis, result[0]); + Cartesian3_default.clone(center, result[1]); + Cartesian3_default.subtract(result[1], xAxis, result[1]); + Cartesian3_default.subtract(result[1], yAxis, result[1]); + Cartesian3_default.add(result[1], zAxis, result[1]); + Cartesian3_default.clone(center, result[2]); + Cartesian3_default.subtract(result[2], xAxis, result[2]); + Cartesian3_default.add(result[2], yAxis, result[2]); + Cartesian3_default.subtract(result[2], zAxis, result[2]); + Cartesian3_default.clone(center, result[3]); + Cartesian3_default.subtract(result[3], xAxis, result[3]); + Cartesian3_default.add(result[3], yAxis, result[3]); + Cartesian3_default.add(result[3], zAxis, result[3]); + Cartesian3_default.clone(center, result[4]); + Cartesian3_default.add(result[4], xAxis, result[4]); + Cartesian3_default.subtract(result[4], yAxis, result[4]); + Cartesian3_default.subtract(result[4], zAxis, result[4]); + Cartesian3_default.clone(center, result[5]); + Cartesian3_default.add(result[5], xAxis, result[5]); + Cartesian3_default.subtract(result[5], yAxis, result[5]); + Cartesian3_default.add(result[5], zAxis, result[5]); + Cartesian3_default.clone(center, result[6]); + Cartesian3_default.add(result[6], xAxis, result[6]); + Cartesian3_default.add(result[6], yAxis, result[6]); + Cartesian3_default.subtract(result[6], zAxis, result[6]); + Cartesian3_default.clone(center, result[7]); + Cartesian3_default.add(result[7], xAxis, result[7]); + Cartesian3_default.add(result[7], yAxis, result[7]); + Cartesian3_default.add(result[7], zAxis, result[7]); + return result; +}; +var scratchRotationScale = new Matrix3_default(); +OrientedBoundingBox.computeTransformation = function(box, result) { + Check_default.typeOf.object("box", box); + if (!defined_default(result)) { + result = new Matrix4_default(); + } + const translation = box.center; + const rotationScale = Matrix3_default.multiplyByUniformScale( + box.halfAxes, + 2, + scratchRotationScale + ); + return Matrix4_default.fromRotationTranslation(rotationScale, translation, result); +}; +var scratchBoundingSphere = new BoundingSphere_default(); +OrientedBoundingBox.isOccluded = function(box, occluder) { + if (!defined_default(box)) { + throw new DeveloperError_default("box is required."); + } + if (!defined_default(occluder)) { + throw new DeveloperError_default("occluder is required."); + } + const sphere = BoundingSphere_default.fromOrientedBoundingBox( + box, + scratchBoundingSphere + ); + return !occluder.isBoundingSphereVisible(sphere); +}; +OrientedBoundingBox.prototype.intersectPlane = function(plane) { + return OrientedBoundingBox.intersectPlane(this, plane); +}; +OrientedBoundingBox.prototype.distanceSquaredTo = function(cartesian) { + return OrientedBoundingBox.distanceSquaredTo(this, cartesian); +}; +OrientedBoundingBox.prototype.computePlaneDistances = function(position, direction, result) { + return OrientedBoundingBox.computePlaneDistances( + this, + position, + direction, + result + ); +}; +OrientedBoundingBox.prototype.computeCorners = function(result) { + return OrientedBoundingBox.computeCorners(this, result); +}; +OrientedBoundingBox.prototype.computeTransformation = function(result) { + return OrientedBoundingBox.computeTransformation(this, result); +}; +OrientedBoundingBox.prototype.isOccluded = function(occluder) { + return OrientedBoundingBox.isOccluded(this, occluder); +}; +OrientedBoundingBox.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && Cartesian3_default.equals(left.center, right.center) && Matrix3_default.equals(left.halfAxes, right.halfAxes); +}; +OrientedBoundingBox.prototype.clone = function(result) { + return OrientedBoundingBox.clone(this, result); +}; +OrientedBoundingBox.prototype.equals = function(right) { + return OrientedBoundingBox.equals(this, right); +}; +var OrientedBoundingBox_default = OrientedBoundingBox; + +export { + OrientedBoundingBox_default +}; diff --git a/public/assets/cesium/Workers/chunk-3HQMMUPU.js b/public/assets/cesium/Workers/chunk-3HQMMUPU.js new file mode 100644 index 0000000..1ce5c1d --- /dev/null +++ b/public/assets/cesium/Workers/chunk-3HQMMUPU.js @@ -0,0 +1,629 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + + +// packages/engine/Source/Core/WebGLConstants.js +var WebGLConstants = { + DEPTH_BUFFER_BIT: 256, + STENCIL_BUFFER_BIT: 1024, + COLOR_BUFFER_BIT: 16384, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + ZERO: 0, + ONE: 1, + SRC_COLOR: 768, + ONE_MINUS_SRC_COLOR: 769, + SRC_ALPHA: 770, + ONE_MINUS_SRC_ALPHA: 771, + DST_ALPHA: 772, + ONE_MINUS_DST_ALPHA: 773, + DST_COLOR: 774, + ONE_MINUS_DST_COLOR: 775, + SRC_ALPHA_SATURATE: 776, + FUNC_ADD: 32774, + BLEND_EQUATION: 32777, + BLEND_EQUATION_RGB: 32777, + // same as BLEND_EQUATION + BLEND_EQUATION_ALPHA: 34877, + FUNC_SUBTRACT: 32778, + FUNC_REVERSE_SUBTRACT: 32779, + BLEND_DST_RGB: 32968, + BLEND_SRC_RGB: 32969, + BLEND_DST_ALPHA: 32970, + BLEND_SRC_ALPHA: 32971, + CONSTANT_COLOR: 32769, + ONE_MINUS_CONSTANT_COLOR: 32770, + CONSTANT_ALPHA: 32771, + ONE_MINUS_CONSTANT_ALPHA: 32772, + BLEND_COLOR: 32773, + ARRAY_BUFFER: 34962, + ELEMENT_ARRAY_BUFFER: 34963, + ARRAY_BUFFER_BINDING: 34964, + ELEMENT_ARRAY_BUFFER_BINDING: 34965, + STREAM_DRAW: 35040, + STATIC_DRAW: 35044, + DYNAMIC_DRAW: 35048, + BUFFER_SIZE: 34660, + BUFFER_USAGE: 34661, + CURRENT_VERTEX_ATTRIB: 34342, + FRONT: 1028, + BACK: 1029, + FRONT_AND_BACK: 1032, + CULL_FACE: 2884, + BLEND: 3042, + DITHER: 3024, + STENCIL_TEST: 2960, + DEPTH_TEST: 2929, + SCISSOR_TEST: 3089, + POLYGON_OFFSET_FILL: 32823, + SAMPLE_ALPHA_TO_COVERAGE: 32926, + SAMPLE_COVERAGE: 32928, + NO_ERROR: 0, + INVALID_ENUM: 1280, + INVALID_VALUE: 1281, + INVALID_OPERATION: 1282, + OUT_OF_MEMORY: 1285, + CW: 2304, + CCW: 2305, + LINE_WIDTH: 2849, + ALIASED_POINT_SIZE_RANGE: 33901, + ALIASED_LINE_WIDTH_RANGE: 33902, + CULL_FACE_MODE: 2885, + FRONT_FACE: 2886, + DEPTH_RANGE: 2928, + DEPTH_WRITEMASK: 2930, + DEPTH_CLEAR_VALUE: 2931, + DEPTH_FUNC: 2932, + STENCIL_CLEAR_VALUE: 2961, + STENCIL_FUNC: 2962, + STENCIL_FAIL: 2964, + STENCIL_PASS_DEPTH_FAIL: 2965, + STENCIL_PASS_DEPTH_PASS: 2966, + STENCIL_REF: 2967, + STENCIL_VALUE_MASK: 2963, + STENCIL_WRITEMASK: 2968, + STENCIL_BACK_FUNC: 34816, + STENCIL_BACK_FAIL: 34817, + STENCIL_BACK_PASS_DEPTH_FAIL: 34818, + STENCIL_BACK_PASS_DEPTH_PASS: 34819, + STENCIL_BACK_REF: 36003, + STENCIL_BACK_VALUE_MASK: 36004, + STENCIL_BACK_WRITEMASK: 36005, + VIEWPORT: 2978, + SCISSOR_BOX: 3088, + COLOR_CLEAR_VALUE: 3106, + COLOR_WRITEMASK: 3107, + UNPACK_ALIGNMENT: 3317, + PACK_ALIGNMENT: 3333, + MAX_TEXTURE_SIZE: 3379, + MAX_VIEWPORT_DIMS: 3386, + SUBPIXEL_BITS: 3408, + RED_BITS: 3410, + GREEN_BITS: 3411, + BLUE_BITS: 3412, + ALPHA_BITS: 3413, + DEPTH_BITS: 3414, + STENCIL_BITS: 3415, + POLYGON_OFFSET_UNITS: 10752, + POLYGON_OFFSET_FACTOR: 32824, + TEXTURE_BINDING_2D: 32873, + SAMPLE_BUFFERS: 32936, + SAMPLES: 32937, + SAMPLE_COVERAGE_VALUE: 32938, + SAMPLE_COVERAGE_INVERT: 32939, + COMPRESSED_TEXTURE_FORMATS: 34467, + DONT_CARE: 4352, + FASTEST: 4353, + NICEST: 4354, + GENERATE_MIPMAP_HINT: 33170, + BYTE: 5120, + UNSIGNED_BYTE: 5121, + SHORT: 5122, + UNSIGNED_SHORT: 5123, + INT: 5124, + UNSIGNED_INT: 5125, + FLOAT: 5126, + DEPTH_COMPONENT: 6402, + ALPHA: 6406, + RGB: 6407, + RGBA: 6408, + LUMINANCE: 6409, + LUMINANCE_ALPHA: 6410, + UNSIGNED_SHORT_4_4_4_4: 32819, + UNSIGNED_SHORT_5_5_5_1: 32820, + UNSIGNED_SHORT_5_6_5: 33635, + FRAGMENT_SHADER: 35632, + VERTEX_SHADER: 35633, + MAX_VERTEX_ATTRIBS: 34921, + MAX_VERTEX_UNIFORM_VECTORS: 36347, + MAX_VARYING_VECTORS: 36348, + MAX_COMBINED_TEXTURE_IMAGE_UNITS: 35661, + MAX_VERTEX_TEXTURE_IMAGE_UNITS: 35660, + MAX_TEXTURE_IMAGE_UNITS: 34930, + MAX_FRAGMENT_UNIFORM_VECTORS: 36349, + SHADER_TYPE: 35663, + DELETE_STATUS: 35712, + LINK_STATUS: 35714, + VALIDATE_STATUS: 35715, + ATTACHED_SHADERS: 35717, + ACTIVE_UNIFORMS: 35718, + ACTIVE_ATTRIBUTES: 35721, + SHADING_LANGUAGE_VERSION: 35724, + CURRENT_PROGRAM: 35725, + NEVER: 512, + LESS: 513, + EQUAL: 514, + LEQUAL: 515, + GREATER: 516, + NOTEQUAL: 517, + GEQUAL: 518, + ALWAYS: 519, + KEEP: 7680, + REPLACE: 7681, + INCR: 7682, + DECR: 7683, + INVERT: 5386, + INCR_WRAP: 34055, + DECR_WRAP: 34056, + VENDOR: 7936, + RENDERER: 7937, + VERSION: 7938, + NEAREST: 9728, + LINEAR: 9729, + NEAREST_MIPMAP_NEAREST: 9984, + LINEAR_MIPMAP_NEAREST: 9985, + NEAREST_MIPMAP_LINEAR: 9986, + LINEAR_MIPMAP_LINEAR: 9987, + TEXTURE_MAG_FILTER: 10240, + TEXTURE_MIN_FILTER: 10241, + TEXTURE_WRAP_S: 10242, + TEXTURE_WRAP_T: 10243, + TEXTURE_2D: 3553, + TEXTURE: 5890, + TEXTURE_CUBE_MAP: 34067, + TEXTURE_BINDING_CUBE_MAP: 34068, + TEXTURE_CUBE_MAP_POSITIVE_X: 34069, + TEXTURE_CUBE_MAP_NEGATIVE_X: 34070, + TEXTURE_CUBE_MAP_POSITIVE_Y: 34071, + TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072, + TEXTURE_CUBE_MAP_POSITIVE_Z: 34073, + TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074, + MAX_CUBE_MAP_TEXTURE_SIZE: 34076, + TEXTURE0: 33984, + TEXTURE1: 33985, + TEXTURE2: 33986, + TEXTURE3: 33987, + TEXTURE4: 33988, + TEXTURE5: 33989, + TEXTURE6: 33990, + TEXTURE7: 33991, + TEXTURE8: 33992, + TEXTURE9: 33993, + TEXTURE10: 33994, + TEXTURE11: 33995, + TEXTURE12: 33996, + TEXTURE13: 33997, + TEXTURE14: 33998, + TEXTURE15: 33999, + TEXTURE16: 34e3, + TEXTURE17: 34001, + TEXTURE18: 34002, + TEXTURE19: 34003, + TEXTURE20: 34004, + TEXTURE21: 34005, + TEXTURE22: 34006, + TEXTURE23: 34007, + TEXTURE24: 34008, + TEXTURE25: 34009, + TEXTURE26: 34010, + TEXTURE27: 34011, + TEXTURE28: 34012, + TEXTURE29: 34013, + TEXTURE30: 34014, + TEXTURE31: 34015, + ACTIVE_TEXTURE: 34016, + REPEAT: 10497, + CLAMP_TO_EDGE: 33071, + MIRRORED_REPEAT: 33648, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + INT_VEC2: 35667, + INT_VEC3: 35668, + INT_VEC4: 35669, + BOOL: 35670, + BOOL_VEC2: 35671, + BOOL_VEC3: 35672, + BOOL_VEC4: 35673, + FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + SAMPLER_2D: 35678, + SAMPLER_CUBE: 35680, + VERTEX_ATTRIB_ARRAY_ENABLED: 34338, + VERTEX_ATTRIB_ARRAY_SIZE: 34339, + VERTEX_ATTRIB_ARRAY_STRIDE: 34340, + VERTEX_ATTRIB_ARRAY_TYPE: 34341, + VERTEX_ATTRIB_ARRAY_NORMALIZED: 34922, + VERTEX_ATTRIB_ARRAY_POINTER: 34373, + VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 34975, + IMPLEMENTATION_COLOR_READ_TYPE: 35738, + IMPLEMENTATION_COLOR_READ_FORMAT: 35739, + COMPILE_STATUS: 35713, + LOW_FLOAT: 36336, + MEDIUM_FLOAT: 36337, + HIGH_FLOAT: 36338, + LOW_INT: 36339, + MEDIUM_INT: 36340, + HIGH_INT: 36341, + FRAMEBUFFER: 36160, + RENDERBUFFER: 36161, + RGBA4: 32854, + RGB5_A1: 32855, + RGB565: 36194, + DEPTH_COMPONENT16: 33189, + STENCIL_INDEX: 6401, + STENCIL_INDEX8: 36168, + DEPTH_STENCIL: 34041, + RENDERBUFFER_WIDTH: 36162, + RENDERBUFFER_HEIGHT: 36163, + RENDERBUFFER_INTERNAL_FORMAT: 36164, + RENDERBUFFER_RED_SIZE: 36176, + RENDERBUFFER_GREEN_SIZE: 36177, + RENDERBUFFER_BLUE_SIZE: 36178, + RENDERBUFFER_ALPHA_SIZE: 36179, + RENDERBUFFER_DEPTH_SIZE: 36180, + RENDERBUFFER_STENCIL_SIZE: 36181, + FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 36048, + FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 36049, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 36050, + FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 36051, + COLOR_ATTACHMENT0: 36064, + DEPTH_ATTACHMENT: 36096, + STENCIL_ATTACHMENT: 36128, + DEPTH_STENCIL_ATTACHMENT: 33306, + NONE: 0, + FRAMEBUFFER_COMPLETE: 36053, + FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 36054, + FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 36055, + FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 36057, + FRAMEBUFFER_UNSUPPORTED: 36061, + FRAMEBUFFER_BINDING: 36006, + RENDERBUFFER_BINDING: 36007, + MAX_RENDERBUFFER_SIZE: 34024, + INVALID_FRAMEBUFFER_OPERATION: 1286, + UNPACK_FLIP_Y_WEBGL: 37440, + UNPACK_PREMULTIPLY_ALPHA_WEBGL: 37441, + CONTEXT_LOST_WEBGL: 37442, + UNPACK_COLORSPACE_CONVERSION_WEBGL: 37443, + BROWSER_DEFAULT_WEBGL: 37444, + // WEBGL_compressed_texture_s3tc + COMPRESSED_RGB_S3TC_DXT1_EXT: 33776, + COMPRESSED_RGBA_S3TC_DXT1_EXT: 33777, + COMPRESSED_RGBA_S3TC_DXT3_EXT: 33778, + COMPRESSED_RGBA_S3TC_DXT5_EXT: 33779, + // WEBGL_compressed_texture_pvrtc + COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 35840, + COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 35841, + COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 35842, + COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 35843, + // WEBGL_compressed_texture_astc + COMPRESSED_RGBA_ASTC_4x4_WEBGL: 37808, + // WEBGL_compressed_texture_etc1 + COMPRESSED_RGB_ETC1_WEBGL: 36196, + // EXT_texture_compression_bptc + COMPRESSED_RGBA_BPTC_UNORM: 36492, + // EXT_color_buffer_half_float + HALF_FLOAT_OES: 36193, + // Desktop OpenGL + DOUBLE: 5130, + // WebGL 2 + READ_BUFFER: 3074, + UNPACK_ROW_LENGTH: 3314, + UNPACK_SKIP_ROWS: 3315, + UNPACK_SKIP_PIXELS: 3316, + PACK_ROW_LENGTH: 3330, + PACK_SKIP_ROWS: 3331, + PACK_SKIP_PIXELS: 3332, + COLOR: 6144, + DEPTH: 6145, + STENCIL: 6146, + RED: 6403, + RGB8: 32849, + RGBA8: 32856, + RGB10_A2: 32857, + TEXTURE_BINDING_3D: 32874, + UNPACK_SKIP_IMAGES: 32877, + UNPACK_IMAGE_HEIGHT: 32878, + TEXTURE_3D: 32879, + TEXTURE_WRAP_R: 32882, + MAX_3D_TEXTURE_SIZE: 32883, + UNSIGNED_INT_2_10_10_10_REV: 33640, + MAX_ELEMENTS_VERTICES: 33e3, + MAX_ELEMENTS_INDICES: 33001, + TEXTURE_MIN_LOD: 33082, + TEXTURE_MAX_LOD: 33083, + TEXTURE_BASE_LEVEL: 33084, + TEXTURE_MAX_LEVEL: 33085, + MIN: 32775, + MAX: 32776, + DEPTH_COMPONENT24: 33190, + MAX_TEXTURE_LOD_BIAS: 34045, + TEXTURE_COMPARE_MODE: 34892, + TEXTURE_COMPARE_FUNC: 34893, + CURRENT_QUERY: 34917, + QUERY_RESULT: 34918, + QUERY_RESULT_AVAILABLE: 34919, + STREAM_READ: 35041, + STREAM_COPY: 35042, + STATIC_READ: 35045, + STATIC_COPY: 35046, + DYNAMIC_READ: 35049, + DYNAMIC_COPY: 35050, + MAX_DRAW_BUFFERS: 34852, + DRAW_BUFFER0: 34853, + DRAW_BUFFER1: 34854, + DRAW_BUFFER2: 34855, + DRAW_BUFFER3: 34856, + DRAW_BUFFER4: 34857, + DRAW_BUFFER5: 34858, + DRAW_BUFFER6: 34859, + DRAW_BUFFER7: 34860, + DRAW_BUFFER8: 34861, + DRAW_BUFFER9: 34862, + DRAW_BUFFER10: 34863, + DRAW_BUFFER11: 34864, + DRAW_BUFFER12: 34865, + DRAW_BUFFER13: 34866, + DRAW_BUFFER14: 34867, + DRAW_BUFFER15: 34868, + MAX_FRAGMENT_UNIFORM_COMPONENTS: 35657, + MAX_VERTEX_UNIFORM_COMPONENTS: 35658, + SAMPLER_3D: 35679, + SAMPLER_2D_SHADOW: 35682, + FRAGMENT_SHADER_DERIVATIVE_HINT: 35723, + PIXEL_PACK_BUFFER: 35051, + PIXEL_UNPACK_BUFFER: 35052, + PIXEL_PACK_BUFFER_BINDING: 35053, + PIXEL_UNPACK_BUFFER_BINDING: 35055, + FLOAT_MAT2x3: 35685, + FLOAT_MAT2x4: 35686, + FLOAT_MAT3x2: 35687, + FLOAT_MAT3x4: 35688, + FLOAT_MAT4x2: 35689, + FLOAT_MAT4x3: 35690, + SRGB: 35904, + SRGB8: 35905, + SRGB8_ALPHA8: 35907, + COMPARE_REF_TO_TEXTURE: 34894, + RGBA32F: 34836, + RGB32F: 34837, + RGBA16F: 34842, + RGB16F: 34843, + VERTEX_ATTRIB_ARRAY_INTEGER: 35069, + MAX_ARRAY_TEXTURE_LAYERS: 35071, + MIN_PROGRAM_TEXEL_OFFSET: 35076, + MAX_PROGRAM_TEXEL_OFFSET: 35077, + MAX_VARYING_COMPONENTS: 35659, + TEXTURE_2D_ARRAY: 35866, + TEXTURE_BINDING_2D_ARRAY: 35869, + R11F_G11F_B10F: 35898, + UNSIGNED_INT_10F_11F_11F_REV: 35899, + RGB9_E5: 35901, + UNSIGNED_INT_5_9_9_9_REV: 35902, + TRANSFORM_FEEDBACK_BUFFER_MODE: 35967, + MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 35968, + TRANSFORM_FEEDBACK_VARYINGS: 35971, + TRANSFORM_FEEDBACK_BUFFER_START: 35972, + TRANSFORM_FEEDBACK_BUFFER_SIZE: 35973, + TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 35976, + RASTERIZER_DISCARD: 35977, + MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 35978, + MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 35979, + INTERLEAVED_ATTRIBS: 35980, + SEPARATE_ATTRIBS: 35981, + TRANSFORM_FEEDBACK_BUFFER: 35982, + TRANSFORM_FEEDBACK_BUFFER_BINDING: 35983, + RGBA32UI: 36208, + RGB32UI: 36209, + RGBA16UI: 36214, + RGB16UI: 36215, + RGBA8UI: 36220, + RGB8UI: 36221, + RGBA32I: 36226, + RGB32I: 36227, + RGBA16I: 36232, + RGB16I: 36233, + RGBA8I: 36238, + RGB8I: 36239, + RED_INTEGER: 36244, + RGB_INTEGER: 36248, + RGBA_INTEGER: 36249, + SAMPLER_2D_ARRAY: 36289, + SAMPLER_2D_ARRAY_SHADOW: 36292, + SAMPLER_CUBE_SHADOW: 36293, + UNSIGNED_INT_VEC2: 36294, + UNSIGNED_INT_VEC3: 36295, + UNSIGNED_INT_VEC4: 36296, + INT_SAMPLER_2D: 36298, + INT_SAMPLER_3D: 36299, + INT_SAMPLER_CUBE: 36300, + INT_SAMPLER_2D_ARRAY: 36303, + UNSIGNED_INT_SAMPLER_2D: 36306, + UNSIGNED_INT_SAMPLER_3D: 36307, + UNSIGNED_INT_SAMPLER_CUBE: 36308, + UNSIGNED_INT_SAMPLER_2D_ARRAY: 36311, + DEPTH_COMPONENT32F: 36012, + DEPTH32F_STENCIL8: 36013, + FLOAT_32_UNSIGNED_INT_24_8_REV: 36269, + FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 33296, + FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 33297, + FRAMEBUFFER_ATTACHMENT_RED_SIZE: 33298, + FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 33299, + FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 33300, + FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 33301, + FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 33302, + FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 33303, + FRAMEBUFFER_DEFAULT: 33304, + UNSIGNED_INT_24_8: 34042, + DEPTH24_STENCIL8: 35056, + UNSIGNED_NORMALIZED: 35863, + DRAW_FRAMEBUFFER_BINDING: 36006, + // Same as FRAMEBUFFER_BINDING + READ_FRAMEBUFFER: 36008, + DRAW_FRAMEBUFFER: 36009, + READ_FRAMEBUFFER_BINDING: 36010, + RENDERBUFFER_SAMPLES: 36011, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 36052, + MAX_COLOR_ATTACHMENTS: 36063, + COLOR_ATTACHMENT1: 36065, + COLOR_ATTACHMENT2: 36066, + COLOR_ATTACHMENT3: 36067, + COLOR_ATTACHMENT4: 36068, + COLOR_ATTACHMENT5: 36069, + COLOR_ATTACHMENT6: 36070, + COLOR_ATTACHMENT7: 36071, + COLOR_ATTACHMENT8: 36072, + COLOR_ATTACHMENT9: 36073, + COLOR_ATTACHMENT10: 36074, + COLOR_ATTACHMENT11: 36075, + COLOR_ATTACHMENT12: 36076, + COLOR_ATTACHMENT13: 36077, + COLOR_ATTACHMENT14: 36078, + COLOR_ATTACHMENT15: 36079, + FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 36182, + MAX_SAMPLES: 36183, + HALF_FLOAT: 5131, + RG: 33319, + RG_INTEGER: 33320, + R8: 33321, + RG8: 33323, + R16F: 33325, + R32F: 33326, + RG16F: 33327, + RG32F: 33328, + R8I: 33329, + R8UI: 33330, + R16I: 33331, + R16UI: 33332, + R32I: 33333, + R32UI: 33334, + RG8I: 33335, + RG8UI: 33336, + RG16I: 33337, + RG16UI: 33338, + RG32I: 33339, + RG32UI: 33340, + VERTEX_ARRAY_BINDING: 34229, + R8_SNORM: 36756, + RG8_SNORM: 36757, + RGB8_SNORM: 36758, + RGBA8_SNORM: 36759, + SIGNED_NORMALIZED: 36764, + COPY_READ_BUFFER: 36662, + COPY_WRITE_BUFFER: 36663, + COPY_READ_BUFFER_BINDING: 36662, + // Same as COPY_READ_BUFFER + COPY_WRITE_BUFFER_BINDING: 36663, + // Same as COPY_WRITE_BUFFER + UNIFORM_BUFFER: 35345, + UNIFORM_BUFFER_BINDING: 35368, + UNIFORM_BUFFER_START: 35369, + UNIFORM_BUFFER_SIZE: 35370, + MAX_VERTEX_UNIFORM_BLOCKS: 35371, + MAX_FRAGMENT_UNIFORM_BLOCKS: 35373, + MAX_COMBINED_UNIFORM_BLOCKS: 35374, + MAX_UNIFORM_BUFFER_BINDINGS: 35375, + MAX_UNIFORM_BLOCK_SIZE: 35376, + MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 35377, + MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 35379, + UNIFORM_BUFFER_OFFSET_ALIGNMENT: 35380, + ACTIVE_UNIFORM_BLOCKS: 35382, + UNIFORM_TYPE: 35383, + UNIFORM_SIZE: 35384, + UNIFORM_BLOCK_INDEX: 35386, + UNIFORM_OFFSET: 35387, + UNIFORM_ARRAY_STRIDE: 35388, + UNIFORM_MATRIX_STRIDE: 35389, + UNIFORM_IS_ROW_MAJOR: 35390, + UNIFORM_BLOCK_BINDING: 35391, + UNIFORM_BLOCK_DATA_SIZE: 35392, + UNIFORM_BLOCK_ACTIVE_UNIFORMS: 35394, + UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 35395, + UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 35396, + UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 35398, + INVALID_INDEX: 4294967295, + MAX_VERTEX_OUTPUT_COMPONENTS: 37154, + MAX_FRAGMENT_INPUT_COMPONENTS: 37157, + MAX_SERVER_WAIT_TIMEOUT: 37137, + OBJECT_TYPE: 37138, + SYNC_CONDITION: 37139, + SYNC_STATUS: 37140, + SYNC_FLAGS: 37141, + SYNC_FENCE: 37142, + SYNC_GPU_COMMANDS_COMPLETE: 37143, + UNSIGNALED: 37144, + SIGNALED: 37145, + ALREADY_SIGNALED: 37146, + TIMEOUT_EXPIRED: 37147, + CONDITION_SATISFIED: 37148, + WAIT_FAILED: 37149, + SYNC_FLUSH_COMMANDS_BIT: 1, + VERTEX_ATTRIB_ARRAY_DIVISOR: 35070, + ANY_SAMPLES_PASSED: 35887, + ANY_SAMPLES_PASSED_CONSERVATIVE: 36202, + SAMPLER_BINDING: 35097, + RGB10_A2UI: 36975, + INT_2_10_10_10_REV: 36255, + TRANSFORM_FEEDBACK: 36386, + TRANSFORM_FEEDBACK_PAUSED: 36387, + TRANSFORM_FEEDBACK_ACTIVE: 36388, + TRANSFORM_FEEDBACK_BINDING: 36389, + COMPRESSED_R11_EAC: 37488, + COMPRESSED_SIGNED_R11_EAC: 37489, + COMPRESSED_RG11_EAC: 37490, + COMPRESSED_SIGNED_RG11_EAC: 37491, + COMPRESSED_RGB8_ETC2: 37492, + COMPRESSED_SRGB8_ETC2: 37493, + COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37494, + COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37495, + COMPRESSED_RGBA8_ETC2_EAC: 37496, + COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 37497, + TEXTURE_IMMUTABLE_FORMAT: 37167, + MAX_ELEMENT_INDEX: 36203, + TEXTURE_IMMUTABLE_LEVELS: 33503, + // Extensions + MAX_TEXTURE_MAX_ANISOTROPY_EXT: 34047 +}; +var WebGLConstants_default = Object.freeze(WebGLConstants); + +export { + WebGLConstants_default +}; diff --git a/public/assets/cesium/Workers/chunk-3IFRSGEY.js b/public/assets/cesium/Workers/chunk-3IFRSGEY.js new file mode 100644 index 0000000..bac5f48 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-3IFRSGEY.js @@ -0,0 +1,691 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + PolylinePipeline_default +} from "./chunk-QN6TBED4.js"; +import { + EllipsoidTangentPlane_default +} from "./chunk-YK3QIKY7.js"; +import { + Cartesian4_default, + Matrix4_default, + Quaternion_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CornerType.js +var CornerType = { + /** + * + * + * Corner has a smooth edge. + * @type {number} + * @constant + */ + ROUNDED: 0, + /** + * + * + * Corner point is the intersection of adjacent edges. + * @type {number} + * @constant + */ + MITERED: 1, + /** + * + * + * Corner is clipped. + * @type {number} + * @constant + */ + BEVELED: 2 +}; +var CornerType_default = Object.freeze(CornerType); + +// packages/engine/Source/Core/oneTimeWarning.js +var warnings = {}; +function oneTimeWarning(identifier, message) { + if (!defined_default(identifier)) { + throw new DeveloperError_default("identifier is required."); + } + if (!defined_default(warnings[identifier])) { + warnings[identifier] = true; + console.warn(defaultValue_default(message, identifier)); + } +} +oneTimeWarning.geometryOutlines = "Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0."; +oneTimeWarning.geometryZIndex = "Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored"; +oneTimeWarning.geometryHeightReference = "Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored"; +oneTimeWarning.geometryExtrudedHeightReference = "Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored"; +var oneTimeWarning_default = oneTimeWarning; + +// packages/engine/Source/Core/PolylineVolumeGeometryLibrary.js +var scratch2Array = [new Cartesian3_default(), new Cartesian3_default()]; +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartesian3 = new Cartesian3_default(); +var scratchCartesian4 = new Cartesian3_default(); +var scratchCartesian5 = new Cartesian3_default(); +var scratchCartesian6 = new Cartesian3_default(); +var scratchCartesian7 = new Cartesian3_default(); +var scratchCartesian8 = new Cartesian3_default(); +var scratchCartesian9 = new Cartesian3_default(); +var scratch1 = new Cartesian3_default(); +var scratch2 = new Cartesian3_default(); +var PolylineVolumeGeometryLibrary = {}; +var cartographic = new Cartographic_default(); +function scaleToSurface(positions, ellipsoid) { + const heights = new Array(positions.length); + for (let i = 0; i < positions.length; i++) { + const pos = positions[i]; + cartographic = ellipsoid.cartesianToCartographic(pos, cartographic); + heights[i] = cartographic.height; + positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos); + } + return heights; +} +function subdivideHeights(points, h0, h1, granularity) { + const p0 = points[0]; + const p1 = points[1]; + const angleBetween = Cartesian3_default.angleBetween(p0, p1); + const numPoints = Math.ceil(angleBetween / granularity); + const heights = new Array(numPoints); + let i; + if (h0 === h1) { + for (i = 0; i < numPoints; i++) { + heights[i] = h0; + } + heights.push(h1); + return heights; + } + const dHeight = h1 - h0; + const heightPerVertex = dHeight / numPoints; + for (i = 1; i < numPoints; i++) { + const h = h0 + i * heightPerVertex; + heights[i] = h; + } + heights[0] = h0; + heights.push(h1); + return heights; +} +var nextScratch = new Cartesian3_default(); +var prevScratch = new Cartesian3_default(); +function computeRotationAngle(start, end, position, ellipsoid) { + const tangentPlane = new EllipsoidTangentPlane_default(position, ellipsoid); + const next = tangentPlane.projectPointOntoPlane( + Cartesian3_default.add(position, start, nextScratch), + nextScratch + ); + const prev = tangentPlane.projectPointOntoPlane( + Cartesian3_default.add(position, end, prevScratch), + prevScratch + ); + const angle = Cartesian2_default.angleBetween(next, prev); + return prev.x * next.y - prev.y * next.x >= 0 ? -angle : angle; +} +var negativeX = new Cartesian3_default(-1, 0, 0); +var transform = new Matrix4_default(); +var translation = new Matrix4_default(); +var rotationZ = new Matrix3_default(); +var scaleMatrix = Matrix3_default.IDENTITY.clone(); +var westScratch = new Cartesian3_default(); +var finalPosScratch = new Cartesian4_default(); +var heightCartesian = new Cartesian3_default(); +function addPosition(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat) { + let west = westScratch; + let finalPosition = finalPosScratch; + transform = Transforms_default.eastNorthUpToFixedFrame(center, ellipsoid, transform); + west = Matrix4_default.multiplyByPointAsVector(transform, negativeX, west); + west = Cartesian3_default.normalize(west, west); + const angle = computeRotationAngle(west, left, center, ellipsoid); + rotationZ = Matrix3_default.fromRotationZ(angle, rotationZ); + heightCartesian.z = height; + transform = Matrix4_default.multiplyTransformation( + transform, + Matrix4_default.fromRotationTranslation(rotationZ, heightCartesian, translation), + transform + ); + const scale = scaleMatrix; + scale[0] = xScalar; + for (let j = 0; j < repeat; j++) { + for (let i = 0; i < shape.length; i += 3) { + finalPosition = Cartesian3_default.fromArray(shape, i, finalPosition); + finalPosition = Matrix3_default.multiplyByVector( + scale, + finalPosition, + finalPosition + ); + finalPosition = Matrix4_default.multiplyByPoint( + transform, + finalPosition, + finalPosition + ); + finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z); + } + } + return finalPositions; +} +var centerScratch = new Cartesian3_default(); +function addPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar) { + for (let i = 0; i < centers.length; i += 3) { + const center = Cartesian3_default.fromArray(centers, i, centerScratch); + finalPositions = addPosition( + center, + left, + shape, + finalPositions, + ellipsoid, + heights[i / 3], + xScalar, + 1 + ); + } + return finalPositions; +} +function convertShapeTo3DDuplicate(shape2D, boundingRectangle) { + const length = shape2D.length; + const shape = new Array(length * 6); + let index = 0; + const xOffset = boundingRectangle.x + boundingRectangle.width / 2; + const yOffset = boundingRectangle.y + boundingRectangle.height / 2; + let point = shape2D[0]; + shape[index++] = point.x - xOffset; + shape[index++] = 0; + shape[index++] = point.y - yOffset; + for (let i = 1; i < length; i++) { + point = shape2D[i]; + const x = point.x - xOffset; + const z = point.y - yOffset; + shape[index++] = x; + shape[index++] = 0; + shape[index++] = z; + shape[index++] = x; + shape[index++] = 0; + shape[index++] = z; + } + point = shape2D[0]; + shape[index++] = point.x - xOffset; + shape[index++] = 0; + shape[index++] = point.y - yOffset; + return shape; +} +function convertShapeTo3D(shape2D, boundingRectangle) { + const length = shape2D.length; + const shape = new Array(length * 3); + let index = 0; + const xOffset = boundingRectangle.x + boundingRectangle.width / 2; + const yOffset = boundingRectangle.y + boundingRectangle.height / 2; + for (let i = 0; i < length; i++) { + shape[index++] = shape2D[i].x - xOffset; + shape[index++] = 0; + shape[index++] = shape2D[i].y - yOffset; + } + return shape; +} +var quaterion = new Quaternion_default(); +var startPointScratch = new Cartesian3_default(); +var rotMatrix = new Matrix3_default(); +function computeRoundCorner(pivot, startPoint, endPoint, cornerType, leftIsOutside, ellipsoid, finalPositions, shape, height, duplicatePoints) { + const angle = Cartesian3_default.angleBetween( + Cartesian3_default.subtract(startPoint, pivot, scratch1), + Cartesian3_default.subtract(endPoint, pivot, scratch2) + ); + const granularity = cornerType === CornerType_default.BEVELED ? 0 : Math.ceil(angle / Math_default.toRadians(5)); + let m; + if (leftIsOutside) { + m = Matrix3_default.fromQuaternion( + Quaternion_default.fromAxisAngle( + Cartesian3_default.negate(pivot, scratch1), + angle / (granularity + 1), + quaterion + ), + rotMatrix + ); + } else { + m = Matrix3_default.fromQuaternion( + Quaternion_default.fromAxisAngle(pivot, angle / (granularity + 1), quaterion), + rotMatrix + ); + } + let left; + let surfacePoint; + startPoint = Cartesian3_default.clone(startPoint, startPointScratch); + if (granularity > 0) { + const repeat = duplicatePoints ? 2 : 1; + for (let i = 0; i < granularity; i++) { + startPoint = Matrix3_default.multiplyByVector(m, startPoint, startPoint); + left = Cartesian3_default.subtract(startPoint, pivot, scratch1); + left = Cartesian3_default.normalize(left, left); + if (!leftIsOutside) { + left = Cartesian3_default.negate(left, left); + } + surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2); + finalPositions = addPosition( + surfacePoint, + left, + shape, + finalPositions, + ellipsoid, + height, + 1, + repeat + ); + } + } else { + left = Cartesian3_default.subtract(startPoint, pivot, scratch1); + left = Cartesian3_default.normalize(left, left); + if (!leftIsOutside) { + left = Cartesian3_default.negate(left, left); + } + surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2); + finalPositions = addPosition( + surfacePoint, + left, + shape, + finalPositions, + ellipsoid, + height, + 1, + 1 + ); + endPoint = Cartesian3_default.clone(endPoint, startPointScratch); + left = Cartesian3_default.subtract(endPoint, pivot, scratch1); + left = Cartesian3_default.normalize(left, left); + if (!leftIsOutside) { + left = Cartesian3_default.negate(left, left); + } + surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2); + finalPositions = addPosition( + surfacePoint, + left, + shape, + finalPositions, + ellipsoid, + height, + 1, + 1 + ); + } + return finalPositions; +} +PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(shapePositions) { + const length = shapePositions.length; + const cleanedPositions = []; + for (let i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) { + const v0 = shapePositions[i0]; + const v1 = shapePositions[i1]; + if (!Cartesian2_default.equals(v0, v1)) { + cleanedPositions.push(v1); + } + } + return cleanedPositions; +}; +PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(forward, backward, position, ellipsoid) { + const tangentPlane = new EllipsoidTangentPlane_default(position, ellipsoid); + const next = tangentPlane.projectPointOntoPlane( + Cartesian3_default.add(position, forward, nextScratch), + nextScratch + ); + const prev = tangentPlane.projectPointOntoPlane( + Cartesian3_default.add(position, backward, prevScratch), + prevScratch + ); + return prev.x * next.y - prev.y * next.x >= 0; +}; +var scratchForwardProjection = new Cartesian3_default(); +var scratchBackwardProjection = new Cartesian3_default(); +PolylineVolumeGeometryLibrary.computePositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints) { + const ellipsoid = geometry._ellipsoid; + const heights = scaleToSurface(positions, ellipsoid); + const granularity = geometry._granularity; + const cornerType = geometry._cornerType; + const shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle); + const shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : void 0; + const heightOffset = boundingRectangle.height / 2; + const width = boundingRectangle.width / 2; + let length = positions.length; + let finalPositions = []; + let ends = duplicatePoints ? [] : void 0; + let forward = scratchCartesian1; + let backward = scratchCartesian2; + let cornerDirection = scratchCartesian3; + let surfaceNormal = scratchCartesian4; + let pivot = scratchCartesian5; + let start = scratchCartesian6; + let end = scratchCartesian7; + let left = scratchCartesian8; + let previousPosition = scratchCartesian9; + let position = positions[0]; + let nextPosition = positions[1]; + surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal); + forward = Cartesian3_default.subtract(nextPosition, position, forward); + forward = Cartesian3_default.normalize(forward, forward); + left = Cartesian3_default.cross(surfaceNormal, forward, left); + left = Cartesian3_default.normalize(left, left); + let h0 = heights[0]; + let h1 = heights[1]; + if (duplicatePoints) { + ends = addPosition( + position, + left, + shapeForEnds, + ends, + ellipsoid, + h0 + heightOffset, + 1, + 1 + ); + } + previousPosition = Cartesian3_default.clone(position, previousPosition); + position = nextPosition; + backward = Cartesian3_default.negate(forward, backward); + let subdividedHeights; + let subdividedPositions; + for (let i = 1; i < length - 1; i++) { + const repeat = duplicatePoints ? 2 : 1; + nextPosition = positions[i + 1]; + if (position.equals(nextPosition)) { + oneTimeWarning_default( + "Positions are too close and are considered equivalent with rounding error." + ); + continue; + } + forward = Cartesian3_default.subtract(nextPosition, position, forward); + forward = Cartesian3_default.normalize(forward, forward); + cornerDirection = Cartesian3_default.add(forward, backward, cornerDirection); + cornerDirection = Cartesian3_default.normalize(cornerDirection, cornerDirection); + surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal); + const forwardProjection = Cartesian3_default.multiplyByScalar( + surfaceNormal, + Cartesian3_default.dot(forward, surfaceNormal), + scratchForwardProjection + ); + Cartesian3_default.subtract(forward, forwardProjection, forwardProjection); + Cartesian3_default.normalize(forwardProjection, forwardProjection); + const backwardProjection = Cartesian3_default.multiplyByScalar( + surfaceNormal, + Cartesian3_default.dot(backward, surfaceNormal), + scratchBackwardProjection + ); + Cartesian3_default.subtract(backward, backwardProjection, backwardProjection); + Cartesian3_default.normalize(backwardProjection, backwardProjection); + const doCorner = !Math_default.equalsEpsilon( + Math.abs(Cartesian3_default.dot(forwardProjection, backwardProjection)), + 1, + Math_default.EPSILON7 + ); + if (doCorner) { + cornerDirection = Cartesian3_default.cross( + cornerDirection, + surfaceNormal, + cornerDirection + ); + cornerDirection = Cartesian3_default.cross( + surfaceNormal, + cornerDirection, + cornerDirection + ); + cornerDirection = Cartesian3_default.normalize(cornerDirection, cornerDirection); + const scalar = 1 / Math.max( + 0.25, + Cartesian3_default.magnitude( + Cartesian3_default.cross(cornerDirection, backward, scratch1) + ) + ); + const leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi( + forward, + backward, + position, + ellipsoid + ); + if (leftIsOutside) { + pivot = Cartesian3_default.add( + position, + Cartesian3_default.multiplyByScalar( + cornerDirection, + scalar * width, + cornerDirection + ), + pivot + ); + start = Cartesian3_default.add( + pivot, + Cartesian3_default.multiplyByScalar(left, width, start), + start + ); + scratch2Array[0] = Cartesian3_default.clone(previousPosition, scratch2Array[0]); + scratch2Array[1] = Cartesian3_default.clone(start, scratch2Array[1]); + subdividedHeights = subdivideHeights( + scratch2Array, + h0 + heightOffset, + h1 + heightOffset, + granularity + ); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scratch2Array, + granularity, + ellipsoid + }); + finalPositions = addPositions( + subdividedPositions, + left, + shapeForSides, + finalPositions, + ellipsoid, + subdividedHeights, + 1 + ); + left = Cartesian3_default.cross(surfaceNormal, forward, left); + left = Cartesian3_default.normalize(left, left); + end = Cartesian3_default.add( + pivot, + Cartesian3_default.multiplyByScalar(left, width, end), + end + ); + if (cornerType === CornerType_default.ROUNDED || cornerType === CornerType_default.BEVELED) { + computeRoundCorner( + pivot, + start, + end, + cornerType, + leftIsOutside, + ellipsoid, + finalPositions, + shapeForSides, + h1 + heightOffset, + duplicatePoints + ); + } else { + cornerDirection = Cartesian3_default.negate(cornerDirection, cornerDirection); + finalPositions = addPosition( + position, + cornerDirection, + shapeForSides, + finalPositions, + ellipsoid, + h1 + heightOffset, + scalar, + repeat + ); + } + previousPosition = Cartesian3_default.clone(end, previousPosition); + } else { + pivot = Cartesian3_default.add( + position, + Cartesian3_default.multiplyByScalar( + cornerDirection, + scalar * width, + cornerDirection + ), + pivot + ); + start = Cartesian3_default.add( + pivot, + Cartesian3_default.multiplyByScalar(left, -width, start), + start + ); + scratch2Array[0] = Cartesian3_default.clone(previousPosition, scratch2Array[0]); + scratch2Array[1] = Cartesian3_default.clone(start, scratch2Array[1]); + subdividedHeights = subdivideHeights( + scratch2Array, + h0 + heightOffset, + h1 + heightOffset, + granularity + ); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scratch2Array, + granularity, + ellipsoid + }); + finalPositions = addPositions( + subdividedPositions, + left, + shapeForSides, + finalPositions, + ellipsoid, + subdividedHeights, + 1 + ); + left = Cartesian3_default.cross(surfaceNormal, forward, left); + left = Cartesian3_default.normalize(left, left); + end = Cartesian3_default.add( + pivot, + Cartesian3_default.multiplyByScalar(left, -width, end), + end + ); + if (cornerType === CornerType_default.ROUNDED || cornerType === CornerType_default.BEVELED) { + computeRoundCorner( + pivot, + start, + end, + cornerType, + leftIsOutside, + ellipsoid, + finalPositions, + shapeForSides, + h1 + heightOffset, + duplicatePoints + ); + } else { + finalPositions = addPosition( + position, + cornerDirection, + shapeForSides, + finalPositions, + ellipsoid, + h1 + heightOffset, + scalar, + repeat + ); + } + previousPosition = Cartesian3_default.clone(end, previousPosition); + } + backward = Cartesian3_default.negate(forward, backward); + } else { + finalPositions = addPosition( + previousPosition, + left, + shapeForSides, + finalPositions, + ellipsoid, + h0 + heightOffset, + 1, + 1 + ); + previousPosition = position; + } + h0 = h1; + h1 = heights[i + 1]; + position = nextPosition; + } + scratch2Array[0] = Cartesian3_default.clone(previousPosition, scratch2Array[0]); + scratch2Array[1] = Cartesian3_default.clone(position, scratch2Array[1]); + subdividedHeights = subdivideHeights( + scratch2Array, + h0 + heightOffset, + h1 + heightOffset, + granularity + ); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scratch2Array, + granularity, + ellipsoid + }); + finalPositions = addPositions( + subdividedPositions, + left, + shapeForSides, + finalPositions, + ellipsoid, + subdividedHeights, + 1 + ); + if (duplicatePoints) { + ends = addPosition( + position, + left, + shapeForEnds, + ends, + ellipsoid, + h1 + heightOffset, + 1, + 1 + ); + } + length = finalPositions.length; + const posLength = duplicatePoints ? length + ends.length : length; + const combinedPositions = new Float64Array(posLength); + combinedPositions.set(finalPositions); + if (duplicatePoints) { + combinedPositions.set(ends, length); + } + return combinedPositions; +}; +var PolylineVolumeGeometryLibrary_default = PolylineVolumeGeometryLibrary; + +export { + CornerType_default, + oneTimeWarning_default, + PolylineVolumeGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-44QAAS4P.js b/public/assets/cesium/Workers/chunk-44QAAS4P.js new file mode 100644 index 0000000..296e62a --- /dev/null +++ b/public/assets/cesium/Workers/chunk-44QAAS4P.js @@ -0,0 +1,220 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeographicProjection_default, + Intersect_default +} from "./chunk-KHZNBFOH.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian2_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/BoundingRectangle.js +function BoundingRectangle(x, y, width, height) { + this.x = defaultValue_default(x, 0); + this.y = defaultValue_default(y, 0); + this.width = defaultValue_default(width, 0); + this.height = defaultValue_default(height, 0); +} +BoundingRectangle.packedLength = 4; +BoundingRectangle.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.x; + array[startingIndex++] = value.y; + array[startingIndex++] = value.width; + array[startingIndex] = value.height; + return array; +}; +BoundingRectangle.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new BoundingRectangle(); + } + result.x = array[startingIndex++]; + result.y = array[startingIndex++]; + result.width = array[startingIndex++]; + result.height = array[startingIndex]; + return result; +}; +BoundingRectangle.fromPoints = function(positions, result) { + if (!defined_default(result)) { + result = new BoundingRectangle(); + } + if (!defined_default(positions) || positions.length === 0) { + result.x = 0; + result.y = 0; + result.width = 0; + result.height = 0; + return result; + } + const length = positions.length; + let minimumX = positions[0].x; + let minimumY = positions[0].y; + let maximumX = positions[0].x; + let maximumY = positions[0].y; + for (let i = 1; i < length; i++) { + const p = positions[i]; + const x = p.x; + const y = p.y; + minimumX = Math.min(x, minimumX); + maximumX = Math.max(x, maximumX); + minimumY = Math.min(y, minimumY); + maximumY = Math.max(y, maximumY); + } + result.x = minimumX; + result.y = minimumY; + result.width = maximumX - minimumX; + result.height = maximumY - minimumY; + return result; +}; +var defaultProjection = new GeographicProjection_default(); +var fromRectangleLowerLeft = new Cartographic_default(); +var fromRectangleUpperRight = new Cartographic_default(); +BoundingRectangle.fromRectangle = function(rectangle, projection, result) { + if (!defined_default(result)) { + result = new BoundingRectangle(); + } + if (!defined_default(rectangle)) { + result.x = 0; + result.y = 0; + result.width = 0; + result.height = 0; + return result; + } + defaultProjection._ellipsoid = Ellipsoid_default.default; + projection = defaultValue_default(projection, defaultProjection); + const lowerLeft = projection.project( + Rectangle_default.southwest(rectangle, fromRectangleLowerLeft) + ); + const upperRight = projection.project( + Rectangle_default.northeast(rectangle, fromRectangleUpperRight) + ); + Cartesian2_default.subtract(upperRight, lowerLeft, upperRight); + result.x = lowerLeft.x; + result.y = lowerLeft.y; + result.width = upperRight.x; + result.height = upperRight.y; + return result; +}; +BoundingRectangle.clone = function(rectangle, result) { + if (!defined_default(rectangle)) { + return void 0; + } + if (!defined_default(result)) { + return new BoundingRectangle( + rectangle.x, + rectangle.y, + rectangle.width, + rectangle.height + ); + } + result.x = rectangle.x; + result.y = rectangle.y; + result.width = rectangle.width; + result.height = rectangle.height; + return result; +}; +BoundingRectangle.union = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + if (!defined_default(result)) { + result = new BoundingRectangle(); + } + const lowerLeftX = Math.min(left.x, right.x); + const lowerLeftY = Math.min(left.y, right.y); + const upperRightX = Math.max(left.x + left.width, right.x + right.width); + const upperRightY = Math.max(left.y + left.height, right.y + right.height); + result.x = lowerLeftX; + result.y = lowerLeftY; + result.width = upperRightX - lowerLeftX; + result.height = upperRightY - lowerLeftY; + return result; +}; +BoundingRectangle.expand = function(rectangle, point, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("point", point); + result = BoundingRectangle.clone(rectangle, result); + const width = point.x - result.x; + const height = point.y - result.y; + if (width > result.width) { + result.width = width; + } else if (width < 0) { + result.width -= width; + result.x = point.x; + } + if (height > result.height) { + result.height = height; + } else if (height < 0) { + result.height -= height; + result.y = point.y; + } + return result; +}; +BoundingRectangle.intersect = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + const leftX = left.x; + const leftY = left.y; + const rightX = right.x; + const rightY = right.y; + if (!(leftX > rightX + right.width || leftX + left.width < rightX || leftY + left.height < rightY || leftY > rightY + right.height)) { + return Intersect_default.INTERSECTING; + } + return Intersect_default.OUTSIDE; +}; +BoundingRectangle.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.x === right.x && left.y === right.y && left.width === right.width && left.height === right.height; +}; +BoundingRectangle.prototype.clone = function(result) { + return BoundingRectangle.clone(this, result); +}; +BoundingRectangle.prototype.intersect = function(right) { + return BoundingRectangle.intersect(this, right); +}; +BoundingRectangle.prototype.equals = function(right) { + return BoundingRectangle.equals(this, right); +}; +var BoundingRectangle_default = BoundingRectangle; + +export { + BoundingRectangle_default +}; diff --git a/public/assets/cesium/Workers/chunk-56EDBCGT.js b/public/assets/cesium/Workers/chunk-56EDBCGT.js new file mode 100644 index 0000000..95e33b9 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-56EDBCGT.js @@ -0,0 +1,768 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidalOccluder.js +function EllipsoidalOccluder(ellipsoid, cameraPosition) { + Check_default.typeOf.object("ellipsoid", ellipsoid); + this._ellipsoid = ellipsoid; + this._cameraPosition = new Cartesian3_default(); + this._cameraPositionInScaledSpace = new Cartesian3_default(); + this._distanceToLimbInScaledSpaceSquared = 0; + if (defined_default(cameraPosition)) { + this.cameraPosition = cameraPosition; + } +} +Object.defineProperties(EllipsoidalOccluder.prototype, { + /** + * Gets the occluding ellipsoid. + * @memberof EllipsoidalOccluder.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets or sets the position of the camera. + * @memberof EllipsoidalOccluder.prototype + * @type {Cartesian3} + */ + cameraPosition: { + get: function() { + return this._cameraPosition; + }, + set: function(cameraPosition) { + const ellipsoid = this._ellipsoid; + const cv = ellipsoid.transformPositionToScaledSpace( + cameraPosition, + this._cameraPositionInScaledSpace + ); + const vhMagnitudeSquared = Cartesian3_default.magnitudeSquared(cv) - 1; + Cartesian3_default.clone(cameraPosition, this._cameraPosition); + this._cameraPositionInScaledSpace = cv; + this._distanceToLimbInScaledSpaceSquared = vhMagnitudeSquared; + } + } +}); +var scratchCartesian = new Cartesian3_default(); +EllipsoidalOccluder.prototype.isPointVisible = function(occludee) { + const ellipsoid = this._ellipsoid; + const occludeeScaledSpacePosition = ellipsoid.transformPositionToScaledSpace( + occludee, + scratchCartesian + ); + return isScaledSpacePointVisible( + occludeeScaledSpacePosition, + this._cameraPositionInScaledSpace, + this._distanceToLimbInScaledSpaceSquared + ); +}; +EllipsoidalOccluder.prototype.isScaledSpacePointVisible = function(occludeeScaledSpacePosition) { + return isScaledSpacePointVisible( + occludeeScaledSpacePosition, + this._cameraPositionInScaledSpace, + this._distanceToLimbInScaledSpaceSquared + ); +}; +var scratchCameraPositionInScaledSpaceShrunk = new Cartesian3_default(); +EllipsoidalOccluder.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid = function(occludeeScaledSpacePosition, minimumHeight) { + const ellipsoid = this._ellipsoid; + let vhMagnitudeSquared; + let cv; + if (defined_default(minimumHeight) && minimumHeight < 0 && ellipsoid.minimumRadius > -minimumHeight) { + cv = scratchCameraPositionInScaledSpaceShrunk; + cv.x = this._cameraPosition.x / (ellipsoid.radii.x + minimumHeight); + cv.y = this._cameraPosition.y / (ellipsoid.radii.y + minimumHeight); + cv.z = this._cameraPosition.z / (ellipsoid.radii.z + minimumHeight); + vhMagnitudeSquared = cv.x * cv.x + cv.y * cv.y + cv.z * cv.z - 1; + } else { + cv = this._cameraPositionInScaledSpace; + vhMagnitudeSquared = this._distanceToLimbInScaledSpaceSquared; + } + return isScaledSpacePointVisible( + occludeeScaledSpacePosition, + cv, + vhMagnitudeSquared + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPoint = function(directionToPoint, positions, result) { + return computeHorizonCullingPointFromPositions( + this._ellipsoid, + directionToPoint, + positions, + result + ); +}; +var scratchEllipsoidShrunk = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +EllipsoidalOccluder.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid = function(directionToPoint, positions, minimumHeight, result) { + const possiblyShrunkEllipsoid = getPossiblyShrunkEllipsoid( + this._ellipsoid, + minimumHeight, + scratchEllipsoidShrunk + ); + return computeHorizonCullingPointFromPositions( + possiblyShrunkEllipsoid, + directionToPoint, + positions, + result + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVertices = function(directionToPoint, vertices, stride, center, result) { + return computeHorizonCullingPointFromVertices( + this._ellipsoid, + directionToPoint, + vertices, + stride, + center, + result + ); +}; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid = function(directionToPoint, vertices, stride, center, minimumHeight, result) { + const possiblyShrunkEllipsoid = getPossiblyShrunkEllipsoid( + this._ellipsoid, + minimumHeight, + scratchEllipsoidShrunk + ); + return computeHorizonCullingPointFromVertices( + possiblyShrunkEllipsoid, + directionToPoint, + vertices, + stride, + center, + result + ); +}; +var subsampleScratch = []; +EllipsoidalOccluder.prototype.computeHorizonCullingPointFromRectangle = function(rectangle, ellipsoid, result) { + Check_default.typeOf.object("rectangle", rectangle); + const positions = Rectangle_default.subsample( + rectangle, + ellipsoid, + 0, + subsampleScratch + ); + const bs = BoundingSphere_default.fromPoints(positions); + if (Cartesian3_default.magnitude(bs.center) < 0.1 * ellipsoid.minimumRadius) { + return void 0; + } + return this.computeHorizonCullingPoint(bs.center, positions, result); +}; +var scratchEllipsoidShrunkRadii = new Cartesian3_default(); +function getPossiblyShrunkEllipsoid(ellipsoid, minimumHeight, result) { + if (defined_default(minimumHeight) && minimumHeight < 0 && ellipsoid.minimumRadius > -minimumHeight) { + const ellipsoidShrunkRadii = Cartesian3_default.fromElements( + ellipsoid.radii.x + minimumHeight, + ellipsoid.radii.y + minimumHeight, + ellipsoid.radii.z + minimumHeight, + scratchEllipsoidShrunkRadii + ); + ellipsoid = Ellipsoid_default.fromCartesian3(ellipsoidShrunkRadii, result); + } + return ellipsoid; +} +function computeHorizonCullingPointFromPositions(ellipsoid, directionToPoint, positions, result) { + Check_default.typeOf.object("directionToPoint", directionToPoint); + Check_default.defined("positions", positions); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const scaledSpaceDirectionToPoint = computeScaledSpaceDirectionToPoint( + ellipsoid, + directionToPoint + ); + let resultMagnitude = 0; + for (let i = 0, len = positions.length; i < len; ++i) { + const position = positions[i]; + const candidateMagnitude = computeMagnitude( + ellipsoid, + position, + scaledSpaceDirectionToPoint + ); + if (candidateMagnitude < 0) { + return void 0; + } + resultMagnitude = Math.max(resultMagnitude, candidateMagnitude); + } + return magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result); +} +var positionScratch = new Cartesian3_default(); +function computeHorizonCullingPointFromVertices(ellipsoid, directionToPoint, vertices, stride, center, result) { + Check_default.typeOf.object("directionToPoint", directionToPoint); + Check_default.defined("vertices", vertices); + Check_default.typeOf.number("stride", stride); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + stride = defaultValue_default(stride, 3); + center = defaultValue_default(center, Cartesian3_default.ZERO); + const scaledSpaceDirectionToPoint = computeScaledSpaceDirectionToPoint( + ellipsoid, + directionToPoint + ); + let resultMagnitude = 0; + for (let i = 0, len = vertices.length; i < len; i += stride) { + positionScratch.x = vertices[i] + center.x; + positionScratch.y = vertices[i + 1] + center.y; + positionScratch.z = vertices[i + 2] + center.z; + const candidateMagnitude = computeMagnitude( + ellipsoid, + positionScratch, + scaledSpaceDirectionToPoint + ); + if (candidateMagnitude < 0) { + return void 0; + } + resultMagnitude = Math.max(resultMagnitude, candidateMagnitude); + } + return magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result); +} +function isScaledSpacePointVisible(occludeeScaledSpacePosition, cameraPositionInScaledSpace, distanceToLimbInScaledSpaceSquared) { + const cv = cameraPositionInScaledSpace; + const vhMagnitudeSquared = distanceToLimbInScaledSpaceSquared; + const vt = Cartesian3_default.subtract( + occludeeScaledSpacePosition, + cv, + scratchCartesian + ); + const vtDotVc = -Cartesian3_default.dot(vt, cv); + const isOccluded = vhMagnitudeSquared < 0 ? vtDotVc > 0 : vtDotVc > vhMagnitudeSquared && vtDotVc * vtDotVc / Cartesian3_default.magnitudeSquared(vt) > vhMagnitudeSquared; + return !isOccluded; +} +var scaledSpaceScratch = new Cartesian3_default(); +var directionScratch = new Cartesian3_default(); +function computeMagnitude(ellipsoid, position, scaledSpaceDirectionToPoint) { + const scaledSpacePosition = ellipsoid.transformPositionToScaledSpace( + position, + scaledSpaceScratch + ); + let magnitudeSquared = Cartesian3_default.magnitudeSquared(scaledSpacePosition); + let magnitude = Math.sqrt(magnitudeSquared); + const direction = Cartesian3_default.divideByScalar( + scaledSpacePosition, + magnitude, + directionScratch + ); + magnitudeSquared = Math.max(1, magnitudeSquared); + magnitude = Math.max(1, magnitude); + const cosAlpha = Cartesian3_default.dot(direction, scaledSpaceDirectionToPoint); + const sinAlpha = Cartesian3_default.magnitude( + Cartesian3_default.cross(direction, scaledSpaceDirectionToPoint, direction) + ); + const cosBeta = 1 / magnitude; + const sinBeta = Math.sqrt(magnitudeSquared - 1) * cosBeta; + return 1 / (cosAlpha * cosBeta - sinAlpha * sinBeta); +} +function magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result) { + if (resultMagnitude <= 0 || resultMagnitude === 1 / 0 || resultMagnitude !== resultMagnitude) { + return void 0; + } + return Cartesian3_default.multiplyByScalar( + scaledSpaceDirectionToPoint, + resultMagnitude, + result + ); +} +var directionToPointScratch = new Cartesian3_default(); +function computeScaledSpaceDirectionToPoint(ellipsoid, directionToPoint) { + if (Cartesian3_default.equals(directionToPoint, Cartesian3_default.ZERO)) { + return directionToPoint; + } + ellipsoid.transformPositionToScaledSpace( + directionToPoint, + directionToPointScratch + ); + return Cartesian3_default.normalize(directionToPointScratch, directionToPointScratch); +} +var EllipsoidalOccluder_default = EllipsoidalOccluder; + +// packages/engine/Source/Core/VerticalExaggeration.js +var VerticalExaggeration = {}; +VerticalExaggeration.getHeight = function(height, scale, relativeHeight) { + if (!Number.isFinite(scale)) { + throw new DeveloperError_default("scale must be a finite number."); + } + if (!Number.isFinite(relativeHeight)) { + throw new DeveloperError_default("relativeHeight must be a finite number."); + } + return (height - relativeHeight) * scale + relativeHeight; +}; +var scratchCartographic = new Cartographic_default(); +VerticalExaggeration.getPosition = function(position, ellipsoid, verticalExaggeration, verticalExaggerationRelativeHeight, result) { + const cartographic = ellipsoid.cartesianToCartographic( + position, + scratchCartographic + ); + if (!defined_default(cartographic)) { + return Cartesian3_default.clone(position, result); + } + const newHeight = VerticalExaggeration.getHeight( + cartographic.height, + verticalExaggeration, + verticalExaggerationRelativeHeight + ); + return Cartesian3_default.fromRadians( + cartographic.longitude, + cartographic.latitude, + newHeight, + ellipsoid, + result + ); +}; +var VerticalExaggeration_default = VerticalExaggeration; + +// packages/engine/Source/Core/TerrainQuantization.js +var TerrainQuantization = { + /** + * The vertices are not compressed. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * The vertices are compressed to 12 bits. + * + * @type {number} + * @constant + */ + BITS12: 1 +}; +var TerrainQuantization_default = Object.freeze(TerrainQuantization); + +// packages/engine/Source/Core/TerrainEncoding.js +var cartesian3Scratch = new Cartesian3_default(); +var cartesian3DimScratch = new Cartesian3_default(); +var cartesian2Scratch = new Cartesian2_default(); +var matrix4Scratch = new Matrix4_default(); +var matrix4Scratch2 = new Matrix4_default(); +var SHIFT_LEFT_12 = Math.pow(2, 12); +function TerrainEncoding(center, axisAlignedBoundingBox, minimumHeight, maximumHeight, fromENU, hasVertexNormals, hasWebMercatorT, hasGeodeticSurfaceNormals, exaggeration, exaggerationRelativeHeight) { + let quantization = TerrainQuantization_default.NONE; + let toENU; + let matrix; + if (defined_default(axisAlignedBoundingBox) && defined_default(minimumHeight) && defined_default(maximumHeight) && defined_default(fromENU)) { + const minimum = axisAlignedBoundingBox.minimum; + const maximum = axisAlignedBoundingBox.maximum; + const dimensions = Cartesian3_default.subtract( + maximum, + minimum, + cartesian3DimScratch + ); + const hDim = maximumHeight - minimumHeight; + const maxDim = Math.max(Cartesian3_default.maximumComponent(dimensions), hDim); + if (maxDim < SHIFT_LEFT_12 - 1) { + quantization = TerrainQuantization_default.BITS12; + } else { + quantization = TerrainQuantization_default.NONE; + } + toENU = Matrix4_default.inverseTransformation(fromENU, new Matrix4_default()); + const translation = Cartesian3_default.negate(minimum, cartesian3Scratch); + Matrix4_default.multiply( + Matrix4_default.fromTranslation(translation, matrix4Scratch), + toENU, + toENU + ); + const scale = cartesian3Scratch; + scale.x = 1 / dimensions.x; + scale.y = 1 / dimensions.y; + scale.z = 1 / dimensions.z; + Matrix4_default.multiply(Matrix4_default.fromScale(scale, matrix4Scratch), toENU, toENU); + matrix = Matrix4_default.clone(fromENU); + Matrix4_default.setTranslation(matrix, Cartesian3_default.ZERO, matrix); + fromENU = Matrix4_default.clone(fromENU, new Matrix4_default()); + const translationMatrix = Matrix4_default.fromTranslation(minimum, matrix4Scratch); + const scaleMatrix = Matrix4_default.fromScale(dimensions, matrix4Scratch2); + const st = Matrix4_default.multiply(translationMatrix, scaleMatrix, matrix4Scratch); + Matrix4_default.multiply(fromENU, st, fromENU); + Matrix4_default.multiply(matrix, st, matrix); + } + this.quantization = quantization; + this.minimumHeight = minimumHeight; + this.maximumHeight = maximumHeight; + this.center = Cartesian3_default.clone(center); + this.toScaledENU = toENU; + this.fromScaledENU = fromENU; + this.matrix = matrix; + this.hasVertexNormals = hasVertexNormals; + this.hasWebMercatorT = defaultValue_default(hasWebMercatorT, false); + this.hasGeodeticSurfaceNormals = defaultValue_default( + hasGeodeticSurfaceNormals, + false + ); + this.exaggeration = defaultValue_default(exaggeration, 1); + this.exaggerationRelativeHeight = defaultValue_default( + exaggerationRelativeHeight, + 0 + ); + this.stride = 0; + this._offsetGeodeticSurfaceNormal = 0; + this._offsetVertexNormal = 0; + this._calculateStrideAndOffsets(); +} +TerrainEncoding.prototype.encode = function(vertexBuffer, bufferIndex, position, uv, height, normalToPack, webMercatorT, geodeticSurfaceNormal) { + const u = uv.x; + const v = uv.y; + if (this.quantization === TerrainQuantization_default.BITS12) { + position = Matrix4_default.multiplyByPoint( + this.toScaledENU, + position, + cartesian3Scratch + ); + position.x = Math_default.clamp(position.x, 0, 1); + position.y = Math_default.clamp(position.y, 0, 1); + position.z = Math_default.clamp(position.z, 0, 1); + const hDim = this.maximumHeight - this.minimumHeight; + const h = Math_default.clamp((height - this.minimumHeight) / hDim, 0, 1); + Cartesian2_default.fromElements(position.x, position.y, cartesian2Scratch); + const compressed0 = AttributeCompression_default.compressTextureCoordinates( + cartesian2Scratch + ); + Cartesian2_default.fromElements(position.z, h, cartesian2Scratch); + const compressed1 = AttributeCompression_default.compressTextureCoordinates( + cartesian2Scratch + ); + Cartesian2_default.fromElements(u, v, cartesian2Scratch); + const compressed2 = AttributeCompression_default.compressTextureCoordinates( + cartesian2Scratch + ); + vertexBuffer[bufferIndex++] = compressed0; + vertexBuffer[bufferIndex++] = compressed1; + vertexBuffer[bufferIndex++] = compressed2; + if (this.hasWebMercatorT) { + Cartesian2_default.fromElements(webMercatorT, 0, cartesian2Scratch); + const compressed3 = AttributeCompression_default.compressTextureCoordinates( + cartesian2Scratch + ); + vertexBuffer[bufferIndex++] = compressed3; + } + } else { + Cartesian3_default.subtract(position, this.center, cartesian3Scratch); + vertexBuffer[bufferIndex++] = cartesian3Scratch.x; + vertexBuffer[bufferIndex++] = cartesian3Scratch.y; + vertexBuffer[bufferIndex++] = cartesian3Scratch.z; + vertexBuffer[bufferIndex++] = height; + vertexBuffer[bufferIndex++] = u; + vertexBuffer[bufferIndex++] = v; + if (this.hasWebMercatorT) { + vertexBuffer[bufferIndex++] = webMercatorT; + } + } + if (this.hasVertexNormals) { + vertexBuffer[bufferIndex++] = AttributeCompression_default.octPackFloat( + normalToPack + ); + } + if (this.hasGeodeticSurfaceNormals) { + vertexBuffer[bufferIndex++] = geodeticSurfaceNormal.x; + vertexBuffer[bufferIndex++] = geodeticSurfaceNormal.y; + vertexBuffer[bufferIndex++] = geodeticSurfaceNormal.z; + } + return bufferIndex; +}; +var scratchPosition = new Cartesian3_default(); +var scratchGeodeticSurfaceNormal = new Cartesian3_default(); +TerrainEncoding.prototype.addGeodeticSurfaceNormals = function(oldBuffer, newBuffer, ellipsoid) { + if (this.hasGeodeticSurfaceNormals) { + return; + } + const oldStride = this.stride; + const vertexCount = oldBuffer.length / oldStride; + this.hasGeodeticSurfaceNormals = true; + this._calculateStrideAndOffsets(); + const newStride = this.stride; + for (let index = 0; index < vertexCount; index++) { + for (let offset = 0; offset < oldStride; offset++) { + const oldIndex = index * oldStride + offset; + const newIndex = index * newStride + offset; + newBuffer[newIndex] = oldBuffer[oldIndex]; + } + const position = this.decodePosition(newBuffer, index, scratchPosition); + const geodeticSurfaceNormal = ellipsoid.geodeticSurfaceNormal( + position, + scratchGeodeticSurfaceNormal + ); + const bufferIndex = index * newStride + this._offsetGeodeticSurfaceNormal; + newBuffer[bufferIndex] = geodeticSurfaceNormal.x; + newBuffer[bufferIndex + 1] = geodeticSurfaceNormal.y; + newBuffer[bufferIndex + 2] = geodeticSurfaceNormal.z; + } +}; +TerrainEncoding.prototype.removeGeodeticSurfaceNormals = function(oldBuffer, newBuffer) { + if (!this.hasGeodeticSurfaceNormals) { + return; + } + const oldStride = this.stride; + const vertexCount = oldBuffer.length / oldStride; + this.hasGeodeticSurfaceNormals = false; + this._calculateStrideAndOffsets(); + const newStride = this.stride; + for (let index = 0; index < vertexCount; index++) { + for (let offset = 0; offset < newStride; offset++) { + const oldIndex = index * oldStride + offset; + const newIndex = index * newStride + offset; + newBuffer[newIndex] = oldBuffer[oldIndex]; + } + } +}; +TerrainEncoding.prototype.decodePosition = function(buffer, index, result) { + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + index *= this.stride; + if (this.quantization === TerrainQuantization_default.BITS12) { + const xy = AttributeCompression_default.decompressTextureCoordinates( + buffer[index], + cartesian2Scratch + ); + result.x = xy.x; + result.y = xy.y; + const zh = AttributeCompression_default.decompressTextureCoordinates( + buffer[index + 1], + cartesian2Scratch + ); + result.z = zh.x; + return Matrix4_default.multiplyByPoint(this.fromScaledENU, result, result); + } + result.x = buffer[index]; + result.y = buffer[index + 1]; + result.z = buffer[index + 2]; + return Cartesian3_default.add(result, this.center, result); +}; +TerrainEncoding.prototype.getExaggeratedPosition = function(buffer, index, result) { + result = this.decodePosition(buffer, index, result); + const exaggeration = this.exaggeration; + const exaggerationRelativeHeight = this.exaggerationRelativeHeight; + const hasExaggeration = exaggeration !== 1; + if (hasExaggeration && this.hasGeodeticSurfaceNormals) { + const geodeticSurfaceNormal = this.decodeGeodeticSurfaceNormal( + buffer, + index, + scratchGeodeticSurfaceNormal + ); + const rawHeight = this.decodeHeight(buffer, index); + const heightDifference = VerticalExaggeration_default.getHeight( + rawHeight, + exaggeration, + exaggerationRelativeHeight + ) - rawHeight; + result.x += geodeticSurfaceNormal.x * heightDifference; + result.y += geodeticSurfaceNormal.y * heightDifference; + result.z += geodeticSurfaceNormal.z * heightDifference; + } + return result; +}; +TerrainEncoding.prototype.decodeTextureCoordinates = function(buffer, index, result) { + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + index *= this.stride; + if (this.quantization === TerrainQuantization_default.BITS12) { + return AttributeCompression_default.decompressTextureCoordinates( + buffer[index + 2], + result + ); + } + return Cartesian2_default.fromElements(buffer[index + 4], buffer[index + 5], result); +}; +TerrainEncoding.prototype.decodeHeight = function(buffer, index) { + index *= this.stride; + if (this.quantization === TerrainQuantization_default.BITS12) { + const zh = AttributeCompression_default.decompressTextureCoordinates( + buffer[index + 1], + cartesian2Scratch + ); + return zh.y * (this.maximumHeight - this.minimumHeight) + this.minimumHeight; + } + return buffer[index + 3]; +}; +TerrainEncoding.prototype.decodeWebMercatorT = function(buffer, index) { + index *= this.stride; + if (this.quantization === TerrainQuantization_default.BITS12) { + return AttributeCompression_default.decompressTextureCoordinates( + buffer[index + 3], + cartesian2Scratch + ).x; + } + return buffer[index + 6]; +}; +TerrainEncoding.prototype.getOctEncodedNormal = function(buffer, index, result) { + index = index * this.stride + this._offsetVertexNormal; + const temp = buffer[index] / 256; + const x = Math.floor(temp); + const y = (temp - x) * 256; + return Cartesian2_default.fromElements(x, y, result); +}; +TerrainEncoding.prototype.decodeGeodeticSurfaceNormal = function(buffer, index, result) { + index = index * this.stride + this._offsetGeodeticSurfaceNormal; + result.x = buffer[index]; + result.y = buffer[index + 1]; + result.z = buffer[index + 2]; + return result; +}; +TerrainEncoding.prototype._calculateStrideAndOffsets = function() { + let vertexStride = 0; + switch (this.quantization) { + case TerrainQuantization_default.BITS12: + vertexStride += 3; + break; + default: + vertexStride += 6; + } + if (this.hasWebMercatorT) { + vertexStride += 1; + } + if (this.hasVertexNormals) { + this._offsetVertexNormal = vertexStride; + vertexStride += 1; + } + if (this.hasGeodeticSurfaceNormals) { + this._offsetGeodeticSurfaceNormal = vertexStride; + vertexStride += 3; + } + this.stride = vertexStride; +}; +var attributesIndicesNone = { + position3DAndHeight: 0, + textureCoordAndEncodedNormals: 1, + geodeticSurfaceNormal: 2 +}; +var attributesIndicesBits12 = { + compressed0: 0, + compressed1: 1, + geodeticSurfaceNormal: 2 +}; +TerrainEncoding.prototype.getAttributes = function(buffer) { + const datatype = ComponentDatatype_default.FLOAT; + const sizeInBytes = ComponentDatatype_default.getSizeInBytes(datatype); + const strideInBytes = this.stride * sizeInBytes; + let offsetInBytes = 0; + const attributes = []; + function addAttribute(index, componentsPerAttribute) { + attributes.push({ + index, + vertexBuffer: buffer, + componentDatatype: datatype, + componentsPerAttribute, + offsetInBytes, + strideInBytes + }); + offsetInBytes += componentsPerAttribute * sizeInBytes; + } + if (this.quantization === TerrainQuantization_default.NONE) { + addAttribute(attributesIndicesNone.position3DAndHeight, 4); + let componentsTexCoordAndNormals = 2; + componentsTexCoordAndNormals += this.hasWebMercatorT ? 1 : 0; + componentsTexCoordAndNormals += this.hasVertexNormals ? 1 : 0; + addAttribute( + attributesIndicesNone.textureCoordAndEncodedNormals, + componentsTexCoordAndNormals + ); + if (this.hasGeodeticSurfaceNormals) { + addAttribute(attributesIndicesNone.geodeticSurfaceNormal, 3); + } + } else { + const usingAttribute0Component4 = this.hasWebMercatorT || this.hasVertexNormals; + const usingAttribute1Component1 = this.hasWebMercatorT && this.hasVertexNormals; + addAttribute( + attributesIndicesBits12.compressed0, + usingAttribute0Component4 ? 4 : 3 + ); + if (usingAttribute1Component1) { + addAttribute(attributesIndicesBits12.compressed1, 1); + } + if (this.hasGeodeticSurfaceNormals) { + addAttribute(attributesIndicesBits12.geodeticSurfaceNormal, 3); + } + } + return attributes; +}; +TerrainEncoding.prototype.getAttributeLocations = function() { + if (this.quantization === TerrainQuantization_default.NONE) { + return attributesIndicesNone; + } + return attributesIndicesBits12; +}; +TerrainEncoding.clone = function(encoding, result) { + if (!defined_default(encoding)) { + return void 0; + } + if (!defined_default(result)) { + result = new TerrainEncoding(); + } + result.quantization = encoding.quantization; + result.minimumHeight = encoding.minimumHeight; + result.maximumHeight = encoding.maximumHeight; + result.center = Cartesian3_default.clone(encoding.center); + result.toScaledENU = Matrix4_default.clone(encoding.toScaledENU); + result.fromScaledENU = Matrix4_default.clone(encoding.fromScaledENU); + result.matrix = Matrix4_default.clone(encoding.matrix); + result.hasVertexNormals = encoding.hasVertexNormals; + result.hasWebMercatorT = encoding.hasWebMercatorT; + result.hasGeodeticSurfaceNormals = encoding.hasGeodeticSurfaceNormals; + result.exaggeration = encoding.exaggeration; + result.exaggerationRelativeHeight = encoding.exaggerationRelativeHeight; + result._calculateStrideAndOffsets(); + return result; +}; +var TerrainEncoding_default = TerrainEncoding; + +export { + EllipsoidalOccluder_default, + TerrainEncoding_default +}; diff --git a/public/assets/cesium/Workers/chunk-57H6I3SV.js b/public/assets/cesium/Workers/chunk-57H6I3SV.js new file mode 100644 index 0000000..2232ec1 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-57H6I3SV.js @@ -0,0 +1,100 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/arrayRemoveDuplicates.js +var removeDuplicatesEpsilon = Math_default.EPSILON10; +function arrayRemoveDuplicates(values, equalsEpsilon, wrapAround, removedIndices) { + Check_default.defined("equalsEpsilon", equalsEpsilon); + if (!defined_default(values)) { + return void 0; + } + wrapAround = defaultValue_default(wrapAround, false); + const storeRemovedIndices = defined_default(removedIndices); + const length = values.length; + if (length < 2) { + return values; + } + let i; + let v0 = values[0]; + let v1; + let cleanedValues; + let lastCleanIndex = 0; + let removedIndexLCI = -1; + for (i = 1; i < length; ++i) { + v1 = values[i]; + if (equalsEpsilon(v0, v1, removeDuplicatesEpsilon)) { + if (!defined_default(cleanedValues)) { + cleanedValues = values.slice(0, i); + lastCleanIndex = i - 1; + removedIndexLCI = 0; + } + if (storeRemovedIndices) { + removedIndices.push(i); + } + } else { + if (defined_default(cleanedValues)) { + cleanedValues.push(v1); + lastCleanIndex = i; + if (storeRemovedIndices) { + removedIndexLCI = removedIndices.length; + } + } + v0 = v1; + } + } + if (wrapAround && equalsEpsilon(values[0], values[length - 1], removeDuplicatesEpsilon)) { + if (storeRemovedIndices) { + if (defined_default(cleanedValues)) { + removedIndices.splice(removedIndexLCI, 0, lastCleanIndex); + } else { + removedIndices.push(length - 1); + } + } + if (defined_default(cleanedValues)) { + cleanedValues.length -= 1; + } else { + cleanedValues = values.slice(0, -1); + } + } + return defined_default(cleanedValues) ? cleanedValues : values; +} +var arrayRemoveDuplicates_default = arrayRemoveDuplicates; + +export { + arrayRemoveDuplicates_default +}; diff --git a/public/assets/cesium/Workers/chunk-6SQMLVGV.js b/public/assets/cesium/Workers/chunk-6SQMLVGV.js new file mode 100644 index 0000000..889d19e --- /dev/null +++ b/public/assets/cesium/Workers/chunk-6SQMLVGV.js @@ -0,0 +1,10367 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + FeatureDetection_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + __commonJS, + __require, + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// node_modules/urijs/src/punycode.js +var require_punycode = __commonJS({ + "node_modules/urijs/src/punycode.js"(exports, module) { + /*! https://mths.be/punycode v1.4.0 by @mathias */ + (function(root) { + var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule = typeof module == "object" && module && !module.nodeType && module; + var freeGlobal = typeof global == "object" && global; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) { + root = freeGlobal; + } + var punycode, maxInt = 2147483647, base = 36, tMin = 1, tMax = 26, skew = 38, damp = 700, initialBias = 72, initialN = 128, delimiter = "-", regexPunycode = /^xn--/, regexNonASCII = /[^\x20-\x7E]/, regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, errors = { + "overflow": "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, baseMinusTMin = base - tMin, floor = Math.floor, stringFromCharCode = String.fromCharCode, key; + function error(type) { + throw new RangeError(errors[type]); + } + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + function mapDomain(string, fn) { + var parts = string.split("@"); + var result = ""; + if (parts.length > 1) { + result = parts[0] + "@"; + string = parts[1]; + } + string = string.replace(regexSeparators, "."); + var labels = string.split("."); + var encoded = map(labels, fn).join("."); + return result + encoded; + } + function ucs2decode(string) { + var output = [], counter = 0, length = string.length, value, extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 55296 && value <= 56319 && counter < length) { + extra = string.charCodeAt(counter++); + if ((extra & 64512) == 56320) { + output.push(((value & 1023) << 10) + (extra & 1023) + 65536); + } else { + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + function ucs2encode(array) { + return map(array, function(value) { + var output = ""; + if (value > 65535) { + value -= 65536; + output += stringFromCharCode(value >>> 10 & 1023 | 55296); + value = 56320 | value & 1023; + } + output += stringFromCharCode(value); + return output; + }).join(""); + } + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + function digitToBasic(digit, flag) { + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + function decode(input) { + var output = [], inputLength = input.length, out, i = 0, n = initialN, bias = initialBias, basic, j, index, oldi, w, k, digit, t, baseMinusT; + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + for (j = 0; j < basic; ++j) { + if (input.charCodeAt(j) >= 128) { + error("not-basic"); + } + output.push(input.charCodeAt(j)); + } + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; ) { + for (oldi = i, w = 1, k = base; ; k += base) { + if (index >= inputLength) { + error("invalid-input"); + } + digit = basicToDigit(input.charCodeAt(index++)); + if (digit >= base || digit > floor((maxInt - i) / w)) { + error("overflow"); + } + i += digit * w; + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (digit < t) { + break; + } + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error("overflow"); + } + w *= baseMinusT; + } + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + if (floor(i / out) > maxInt - n) { + error("overflow"); + } + n += floor(i / out); + i %= out; + output.splice(i++, 0, n); + } + return ucs2encode(output); + } + function encode(input) { + var n, delta, handledCPCount, basicLength, bias, j, m, q, k, t, currentValue, output = [], inputLength, handledCPCountPlusOne, baseMinusT, qMinusT; + input = ucs2decode(input); + inputLength = input.length; + n = initialN; + delta = 0; + bias = initialBias; + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 128) { + output.push(stringFromCharCode(currentValue)); + } + } + handledCPCount = basicLength = output.length; + if (basicLength) { + output.push(delimiter); + } + while (handledCPCount < inputLength) { + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error("overflow"); + } + delta += (m - n) * handledCPCountPlusOne; + n = m; + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < n && ++delta > maxInt) { + error("overflow"); + } + if (currentValue == n) { + for (q = delta, k = base; ; k += base) { + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + ++delta; + ++n; + } + return output.join(""); + } + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); + } + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) ? "xn--" + encode(string) : string; + }); + } + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + "version": "1.3.2", + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + "ucs2": { + "decode": ucs2decode, + "encode": ucs2encode + }, + "decode": decode, + "encode": encode, + "toASCII": toASCII, + "toUnicode": toUnicode + }; + if (typeof define == "function" && typeof define.amd == "object" && define.amd) { + define("punycode", function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + freeModule.exports = punycode; + } else { + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + root.punycode = punycode; + } + })(exports); + } +}); + +// node_modules/urijs/src/IPv6.js +var require_IPv6 = __commonJS({ + "node_modules/urijs/src/IPv6.js"(exports, module) { + /*! + * URI.js - Mutating URLs + * IPv6 Support + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + (function(root, factory) { + "use strict"; + if (typeof module === "object" && module.exports) { + module.exports = factory(); + } else if (typeof define === "function" && define.amd) { + define(factory); + } else { + root.IPv6 = factory(root); + } + })(exports, function(root) { + "use strict"; + var _IPv6 = root && root.IPv6; + function bestPresentation(address) { + var _address = address.toLowerCase(); + var segments = _address.split(":"); + var length = segments.length; + var total = 8; + if (segments[0] === "" && segments[1] === "" && segments[2] === "") { + segments.shift(); + segments.shift(); + } else if (segments[0] === "" && segments[1] === "") { + segments.shift(); + } else if (segments[length - 1] === "" && segments[length - 2] === "") { + segments.pop(); + } + length = segments.length; + if (segments[length - 1].indexOf(".") !== -1) { + total = 7; + } + var pos; + for (pos = 0; pos < length; pos++) { + if (segments[pos] === "") { + break; + } + } + if (pos < total) { + segments.splice(pos, 1, "0000"); + while (segments.length < total) { + segments.splice(pos, 0, "0000"); + } + } + var _segments; + for (var i = 0; i < total; i++) { + _segments = segments[i].split(""); + for (var j = 0; j < 3; j++) { + if (_segments[0] === "0" && _segments.length > 1) { + _segments.splice(0, 1); + } else { + break; + } + } + segments[i] = _segments.join(""); + } + var best = -1; + var _best = 0; + var _current = 0; + var current = -1; + var inzeroes = false; + for (i = 0; i < total; i++) { + if (inzeroes) { + if (segments[i] === "0") { + _current += 1; + } else { + inzeroes = false; + if (_current > _best) { + best = current; + _best = _current; + } + } + } else { + if (segments[i] === "0") { + inzeroes = true; + current = i; + _current = 1; + } + } + } + if (_current > _best) { + best = current; + _best = _current; + } + if (_best > 1) { + segments.splice(best, _best, ""); + } + length = segments.length; + var result = ""; + if (segments[0] === "") { + result = ":"; + } + for (i = 0; i < length; i++) { + result += segments[i]; + if (i === length - 1) { + break; + } + result += ":"; + } + if (segments[length - 1] === "") { + result += ":"; + } + return result; + } + function noConflict() { + if (root.IPv6 === this) { + root.IPv6 = _IPv6; + } + return this; + } + return { + best: bestPresentation, + noConflict + }; + }); + } +}); + +// node_modules/urijs/src/SecondLevelDomains.js +var require_SecondLevelDomains = __commonJS({ + "node_modules/urijs/src/SecondLevelDomains.js"(exports, module) { + /*! + * URI.js - Mutating URLs + * Second Level Domain (SLD) Support + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + (function(root, factory) { + "use strict"; + if (typeof module === "object" && module.exports) { + module.exports = factory(); + } else if (typeof define === "function" && define.amd) { + define(factory); + } else { + root.SecondLevelDomains = factory(root); + } + })(exports, function(root) { + "use strict"; + var _SecondLevelDomains = root && root.SecondLevelDomains; + var SLD = { + // list of known Second Level Domains + // converted list of SLDs from https://github.com/gavingmiller/second-level-domains + // ---- + // publicsuffix.org is more current and actually used by a couple of browsers internally. + // downside is it also contains domains like "dyndns.org" - which is fine for the security + // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js + // ---- + list: { + "ac": " com gov mil net org ", + "ae": " ac co gov mil name net org pro sch ", + "af": " com edu gov net org ", + "al": " com edu gov mil net org ", + "ao": " co ed gv it og pb ", + "ar": " com edu gob gov int mil net org tur ", + "at": " ac co gv or ", + "au": " asn com csiro edu gov id net org ", + "ba": " co com edu gov mil net org rs unbi unmo unsa untz unze ", + "bb": " biz co com edu gov info net org store tv ", + "bh": " biz cc com edu gov info net org ", + "bn": " com edu gov net org ", + "bo": " com edu gob gov int mil net org tv ", + "br": " adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ", + "bs": " com edu gov net org ", + "bz": " du et om ov rg ", + "ca": " ab bc mb nb nf nl ns nt nu on pe qc sk yk ", + "ck": " biz co edu gen gov info net org ", + "cn": " ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ", + "co": " com edu gov mil net nom org ", + "cr": " ac c co ed fi go or sa ", + "cy": " ac biz com ekloges gov ltd name net org parliament press pro tm ", + "do": " art com edu gob gov mil net org sld web ", + "dz": " art asso com edu gov net org pol ", + "ec": " com edu fin gov info med mil net org pro ", + "eg": " com edu eun gov mil name net org sci ", + "er": " com edu gov ind mil net org rochest w ", + "es": " com edu gob nom org ", + "et": " biz com edu gov info name net org ", + "fj": " ac biz com info mil name net org pro ", + "fk": " ac co gov net nom org ", + "fr": " asso com f gouv nom prd presse tm ", + "gg": " co net org ", + "gh": " com edu gov mil org ", + "gn": " ac com gov net org ", + "gr": " com edu gov mil net org ", + "gt": " com edu gob ind mil net org ", + "gu": " com edu gov net org ", + "hk": " com edu gov idv net org ", + "hu": " 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ", + "id": " ac co go mil net or sch web ", + "il": " ac co gov idf k12 muni net org ", + "in": " ac co edu ernet firm gen gov i ind mil net nic org res ", + "iq": " com edu gov i mil net org ", + "ir": " ac co dnssec gov i id net org sch ", + "it": " edu gov ", + "je": " co net org ", + "jo": " com edu gov mil name net org sch ", + "jp": " ac ad co ed go gr lg ne or ", + "ke": " ac co go info me mobi ne or sc ", + "kh": " com edu gov mil net org per ", + "ki": " biz com de edu gov info mob net org tel ", + "km": " asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ", + "kn": " edu gov net org ", + "kr": " ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ", + "kw": " com edu gov net org ", + "ky": " com edu gov net org ", + "kz": " com edu gov mil net org ", + "lb": " com edu gov net org ", + "lk": " assn com edu gov grp hotel int ltd net ngo org sch soc web ", + "lr": " com edu gov net org ", + "lv": " asn com conf edu gov id mil net org ", + "ly": " com edu gov id med net org plc sch ", + "ma": " ac co gov m net org press ", + "mc": " asso tm ", + "me": " ac co edu gov its net org priv ", + "mg": " com edu gov mil nom org prd tm ", + "mk": " com edu gov inf name net org pro ", + "ml": " com edu gov net org presse ", + "mn": " edu gov org ", + "mo": " com edu gov net org ", + "mt": " com edu gov net org ", + "mv": " aero biz com coop edu gov info int mil museum name net org pro ", + "mw": " ac co com coop edu gov int museum net org ", + "mx": " com edu gob net org ", + "my": " com edu gov mil name net org sch ", + "nf": " arts com firm info net other per rec store web ", + "ng": " biz com edu gov mil mobi name net org sch ", + "ni": " ac co com edu gob mil net nom org ", + "np": " com edu gov mil net org ", + "nr": " biz com edu gov info net org ", + "om": " ac biz co com edu gov med mil museum net org pro sch ", + "pe": " com edu gob mil net nom org sld ", + "ph": " com edu gov i mil net ngo org ", + "pk": " biz com edu fam gob gok gon gop gos gov net org web ", + "pl": " art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ", + "pr": " ac biz com edu est gov info isla name net org pro prof ", + "ps": " com edu gov net org plo sec ", + "pw": " belau co ed go ne or ", + "ro": " arts com firm info nom nt org rec store tm www ", + "rs": " ac co edu gov in org ", + "sb": " com edu gov net org ", + "sc": " com edu gov net org ", + "sh": " co com edu gov net nom org ", + "sl": " com edu gov net org ", + "st": " co com consulado edu embaixada gov mil net org principe saotome store ", + "sv": " com edu gob org red ", + "sz": " ac co org ", + "tr": " av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ", + "tt": " aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ", + "tw": " club com ebiz edu game gov idv mil net org ", + "mu": " ac co com gov net or org ", + "mz": " ac co edu gov org ", + "na": " co com ", + "nz": " ac co cri geek gen govt health iwi maori mil net org parliament school ", + "pa": " abo ac com edu gob ing med net nom org sld ", + "pt": " com edu gov int net nome org publ ", + "py": " com edu gov mil net org ", + "qa": " com edu gov mil net org ", + "re": " asso com nom ", + "ru": " ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ", + "rw": " ac co com edu gouv gov int mil net ", + "sa": " com edu gov med net org pub sch ", + "sd": " com edu gov info med net org tv ", + "se": " a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ", + "sg": " com edu gov idn net org per ", + "sn": " art com edu gouv org perso univ ", + "sy": " com edu gov mil net news org ", + "th": " ac co go in mi net or ", + "tj": " ac biz co com edu go gov info int mil name net nic org test web ", + "tn": " agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ", + "tz": " ac co go ne or ", + "ua": " biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ", + "ug": " ac co go ne or org sc ", + "uk": " ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ", + "us": " dni fed isa kids nsn ", + "uy": " com edu gub mil net org ", + "ve": " co com edu gob info mil net org web ", + "vi": " co com k12 net org ", + "vn": " ac biz com edu gov health info int name net org pro ", + "ye": " co com gov ltd me net org plc ", + "yu": " ac co edu gov org ", + "za": " ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ", + "zm": " ac co com edu gov net org sch ", + // https://en.wikipedia.org/wiki/CentralNic#Second-level_domains + "com": "ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ", + "net": "gb jp se uk ", + "org": "ae", + "de": "com " + }, + // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost + // in both performance and memory footprint. No initialization required. + // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4 + // Following methods use lastIndexOf() rather than array.split() in order + // to avoid any memory allocations. + has: function(domain) { + var tldOffset = domain.lastIndexOf("."); + if (tldOffset <= 0 || tldOffset >= domain.length - 1) { + return false; + } + var sldOffset = domain.lastIndexOf(".", tldOffset - 1); + if (sldOffset <= 0 || sldOffset >= tldOffset - 1) { + return false; + } + var sldList = SLD.list[domain.slice(tldOffset + 1)]; + if (!sldList) { + return false; + } + return sldList.indexOf(" " + domain.slice(sldOffset + 1, tldOffset) + " ") >= 0; + }, + is: function(domain) { + var tldOffset = domain.lastIndexOf("."); + if (tldOffset <= 0 || tldOffset >= domain.length - 1) { + return false; + } + var sldOffset = domain.lastIndexOf(".", tldOffset - 1); + if (sldOffset >= 0) { + return false; + } + var sldList = SLD.list[domain.slice(tldOffset + 1)]; + if (!sldList) { + return false; + } + return sldList.indexOf(" " + domain.slice(0, tldOffset) + " ") >= 0; + }, + get: function(domain) { + var tldOffset = domain.lastIndexOf("."); + if (tldOffset <= 0 || tldOffset >= domain.length - 1) { + return null; + } + var sldOffset = domain.lastIndexOf(".", tldOffset - 1); + if (sldOffset <= 0 || sldOffset >= tldOffset - 1) { + return null; + } + var sldList = SLD.list[domain.slice(tldOffset + 1)]; + if (!sldList) { + return null; + } + if (sldList.indexOf(" " + domain.slice(sldOffset + 1, tldOffset) + " ") < 0) { + return null; + } + return domain.slice(sldOffset + 1); + }, + noConflict: function() { + if (root.SecondLevelDomains === this) { + root.SecondLevelDomains = _SecondLevelDomains; + } + return this; + } + }; + return SLD; + }); + } +}); + +// node_modules/urijs/src/URI.js +var require_URI = __commonJS({ + "node_modules/urijs/src/URI.js"(exports, module) { + /*! + * URI.js - Mutating URLs + * + * Version: 1.19.11 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + (function(root, factory) { + "use strict"; + if (typeof module === "object" && module.exports) { + module.exports = factory(require_punycode(), require_IPv6(), require_SecondLevelDomains()); + } else if (typeof define === "function" && define.amd) { + define(["./punycode", "./IPv6", "./SecondLevelDomains"], factory); + } else { + root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root); + } + })(exports, function(punycode, IPv6, SLD, root) { + "use strict"; + var _URI = root && root.URI; + function URI(url, base) { + var _urlSupplied = arguments.length >= 1; + var _baseSupplied = arguments.length >= 2; + if (!(this instanceof URI)) { + if (_urlSupplied) { + if (_baseSupplied) { + return new URI(url, base); + } + return new URI(url); + } + return new URI(); + } + if (url === void 0) { + if (_urlSupplied) { + throw new TypeError("undefined is not a valid argument for URI"); + } + if (typeof location !== "undefined") { + url = location.href + ""; + } else { + url = ""; + } + } + if (url === null) { + if (_urlSupplied) { + throw new TypeError("null is not a valid argument for URI"); + } + } + this.href(url); + if (base !== void 0) { + return this.absoluteTo(base); + } + return this; + } + function isInteger(value) { + return /^[0-9]+$/.test(value); + } + URI.version = "1.19.11"; + var p = URI.prototype; + var hasOwn = Object.prototype.hasOwnProperty; + function escapeRegEx(string) { + return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); + } + function getType(value) { + if (value === void 0) { + return "Undefined"; + } + return String(Object.prototype.toString.call(value)).slice(8, -1); + } + function isArray(obj) { + return getType(obj) === "Array"; + } + function filterArrayValues(data, value) { + var lookup = {}; + var i, length; + if (getType(value) === "RegExp") { + lookup = null; + } else if (isArray(value)) { + for (i = 0, length = value.length; i < length; i++) { + lookup[value[i]] = true; + } + } else { + lookup[value] = true; + } + for (i = 0, length = data.length; i < length; i++) { + var _match = lookup && lookup[data[i]] !== void 0 || !lookup && value.test(data[i]); + if (_match) { + data.splice(i, 1); + length--; + i--; + } + } + return data; + } + function arrayContains(list, value) { + var i, length; + if (isArray(value)) { + for (i = 0, length = value.length; i < length; i++) { + if (!arrayContains(list, value[i])) { + return false; + } + } + return true; + } + var _type = getType(value); + for (i = 0, length = list.length; i < length; i++) { + if (_type === "RegExp") { + if (typeof list[i] === "string" && list[i].match(value)) { + return true; + } + } else if (list[i] === value) { + return true; + } + } + return false; + } + function arraysEqual(one, two) { + if (!isArray(one) || !isArray(two)) { + return false; + } + if (one.length !== two.length) { + return false; + } + one.sort(); + two.sort(); + for (var i = 0, l = one.length; i < l; i++) { + if (one[i] !== two[i]) { + return false; + } + } + return true; + } + function trimSlashes(text) { + var trim_expression = /^\/+|\/+$/g; + return text.replace(trim_expression, ""); + } + URI._parts = function() { + return { + protocol: null, + username: null, + password: null, + hostname: null, + urn: null, + port: null, + path: null, + query: null, + fragment: null, + // state + preventInvalidHostname: URI.preventInvalidHostname, + duplicateQueryParameters: URI.duplicateQueryParameters, + escapeQuerySpace: URI.escapeQuerySpace + }; + }; + URI.preventInvalidHostname = false; + URI.duplicateQueryParameters = false; + URI.escapeQuerySpace = true; + URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i; + URI.idn_expression = /[^a-z0-9\._-]/i; + URI.punycode_expression = /(xn--)/i; + URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; + URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/; + URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; + URI.findUri = { + // valid "scheme://" or "www." + start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi, + // everything up to the next whitespace + end: /[\s\r\n]|$/, + // trim trailing punctuation captured by end RegExp + trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/, + // balanced parens inclusion (), [], {}, <> + parens: /(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g + }; + URI.leading_whitespace_expression = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/; + URI.ascii_tab_whitespace = /[\u0009\u000A\u000D]+/g; + URI.defaultPorts = { + http: "80", + https: "443", + ftp: "21", + gopher: "70", + ws: "80", + wss: "443" + }; + URI.hostProtocols = [ + "http", + "https" + ]; + URI.invalid_hostname_characters = /[^a-zA-Z0-9\.\-:_]/; + URI.domAttributes = { + "a": "href", + "blockquote": "cite", + "link": "href", + "base": "href", + "script": "src", + "form": "action", + "img": "src", + "area": "href", + "iframe": "src", + "embed": "src", + "source": "src", + "track": "src", + "input": "src", + // but only if type="image" + "audio": "src", + "video": "src" + }; + URI.getDomAttribute = function(node) { + if (!node || !node.nodeName) { + return void 0; + } + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input" && node.type !== "image") { + return void 0; + } + return URI.domAttributes[nodeName]; + }; + function escapeForDumbFirefox36(value) { + return escape(value); + } + function strictEncodeURIComponent(string) { + return encodeURIComponent(string).replace(/[!'()*]/g, escapeForDumbFirefox36).replace(/\*/g, "%2A"); + } + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + URI.iso8859 = function() { + URI.encode = escape; + URI.decode = unescape; + }; + URI.unicode = function() { + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + }; + URI.characters = { + pathname: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig, + map: { + // -._~!'()* + "%24": "$", + "%26": "&", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=", + "%3A": ":", + "%40": "@" + } + }, + decode: { + expression: /[\/\?#]/g, + map: { + "/": "%2F", + "?": "%3F", + "#": "%23" + } + } + }, + reserved: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig, + map: { + // gen-delims + "%3A": ":", + "%2F": "/", + "%3F": "?", + "%23": "#", + "%5B": "[", + "%5D": "]", + "%40": "@", + // sub-delims + "%21": "!", + "%24": "$", + "%26": "&", + "%27": "'", + "%28": "(", + "%29": ")", + "%2A": "*", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=" + } + } + }, + urnpath: { + // The characters under `encode` are the characters called out by RFC 2141 as being acceptable + // for usage in a URN. RFC2141 also calls out "-", ".", and "_" as acceptable characters, but + // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also + // note that the colon character is not featured in the encoding map; this is because URI.js + // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it + // should not appear unencoded in a segment itself. + // See also the note above about RFC3986 and capitalalized hex digits. + encode: { + expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig, + map: { + "%21": "!", + "%24": "$", + "%27": "'", + "%28": "(", + "%29": ")", + "%2A": "*", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=", + "%40": "@" + } + }, + // These characters are the characters called out by RFC2141 as "reserved" characters that + // should never appear in a URN, plus the colon character (see note above). + decode: { + expression: /[\/\?#:]/g, + map: { + "/": "%2F", + "?": "%3F", + "#": "%23", + ":": "%3A" + } + } + } + }; + URI.encodeQuery = function(string, escapeQuerySpace) { + var escaped = URI.encode(string + ""); + if (escapeQuerySpace === void 0) { + escapeQuerySpace = URI.escapeQuerySpace; + } + return escapeQuerySpace ? escaped.replace(/%20/g, "+") : escaped; + }; + URI.decodeQuery = function(string, escapeQuerySpace) { + string += ""; + if (escapeQuerySpace === void 0) { + escapeQuerySpace = URI.escapeQuerySpace; + } + try { + return URI.decode(escapeQuerySpace ? string.replace(/\+/g, "%20") : string); + } catch (e) { + return string; + } + }; + var _parts = { "encode": "encode", "decode": "decode" }; + var _part; + var generateAccessor = function(_group, _part2) { + return function(string) { + try { + return URI[_part2](string + "").replace(URI.characters[_group][_part2].expression, function(c) { + return URI.characters[_group][_part2].map[c]; + }); + } catch (e) { + return string; + } + }; + }; + for (_part in _parts) { + URI[_part + "PathSegment"] = generateAccessor("pathname", _parts[_part]); + URI[_part + "UrnPathSegment"] = generateAccessor("urnpath", _parts[_part]); + } + var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) { + return function(string) { + var actualCodingFunc; + if (!_innerCodingFuncName) { + actualCodingFunc = URI[_codingFuncName]; + } else { + actualCodingFunc = function(string2) { + return URI[_codingFuncName](URI[_innerCodingFuncName](string2)); + }; + } + var segments = (string + "").split(_sep); + for (var i = 0, length = segments.length; i < length; i++) { + segments[i] = actualCodingFunc(segments[i]); + } + return segments.join(_sep); + }; + }; + URI.decodePath = generateSegmentedPathFunction("/", "decodePathSegment"); + URI.decodeUrnPath = generateSegmentedPathFunction(":", "decodeUrnPathSegment"); + URI.recodePath = generateSegmentedPathFunction("/", "encodePathSegment", "decode"); + URI.recodeUrnPath = generateSegmentedPathFunction(":", "encodeUrnPathSegment", "decode"); + URI.encodeReserved = generateAccessor("reserved", "encode"); + URI.parse = function(string, parts) { + var pos; + if (!parts) { + parts = { + preventInvalidHostname: URI.preventInvalidHostname + }; + } + string = string.replace(URI.leading_whitespace_expression, ""); + string = string.replace(URI.ascii_tab_whitespace, ""); + pos = string.indexOf("#"); + if (pos > -1) { + parts.fragment = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + pos = string.indexOf("?"); + if (pos > -1) { + parts.query = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + string = string.replace(/^(https?|ftp|wss?)?:+[/\\]*/i, "$1://"); + string = string.replace(/^[/\\]{2,}/i, "//"); + if (string.substring(0, 2) === "//") { + parts.protocol = null; + string = string.substring(2); + string = URI.parseAuthority(string, parts); + } else { + pos = string.indexOf(":"); + if (pos > -1) { + parts.protocol = string.substring(0, pos) || null; + if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) { + parts.protocol = void 0; + } else if (string.substring(pos + 1, pos + 3).replace(/\\/g, "/") === "//") { + string = string.substring(pos + 3); + string = URI.parseAuthority(string, parts); + } else { + string = string.substring(pos + 1); + parts.urn = true; + } + } + } + parts.path = string; + return parts; + }; + URI.parseHost = function(string, parts) { + if (!string) { + string = ""; + } + string = string.replace(/\\/g, "/"); + var pos = string.indexOf("/"); + var bracketPos; + var t; + if (pos === -1) { + pos = string.length; + } + if (string.charAt(0) === "[") { + bracketPos = string.indexOf("]"); + parts.hostname = string.substring(1, bracketPos) || null; + parts.port = string.substring(bracketPos + 2, pos) || null; + if (parts.port === "/") { + parts.port = null; + } + } else { + var firstColon = string.indexOf(":"); + var firstSlash = string.indexOf("/"); + var nextColon = string.indexOf(":", firstColon + 1); + if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) { + parts.hostname = string.substring(0, pos) || null; + parts.port = null; + } else { + t = string.substring(0, pos).split(":"); + parts.hostname = t[0] || null; + parts.port = t[1] || null; + } + } + if (parts.hostname && string.substring(pos).charAt(0) !== "/") { + pos++; + string = "/" + string; + } + if (parts.preventInvalidHostname) { + URI.ensureValidHostname(parts.hostname, parts.protocol); + } + if (parts.port) { + URI.ensureValidPort(parts.port); + } + return string.substring(pos) || "/"; + }; + URI.parseAuthority = function(string, parts) { + string = URI.parseUserinfo(string, parts); + return URI.parseHost(string, parts); + }; + URI.parseUserinfo = function(string, parts) { + var _string = string; + var firstBackSlash = string.indexOf("\\"); + if (firstBackSlash !== -1) { + string = string.replace(/\\/g, "/"); + } + var firstSlash = string.indexOf("/"); + var pos = string.lastIndexOf("@", firstSlash > -1 ? firstSlash : string.length - 1); + var t; + if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) { + t = string.substring(0, pos).split(":"); + parts.username = t[0] ? URI.decode(t[0]) : null; + t.shift(); + parts.password = t[0] ? URI.decode(t.join(":")) : null; + string = _string.substring(pos + 1); + } else { + parts.username = null; + parts.password = null; + } + return string; + }; + URI.parseQuery = function(string, escapeQuerySpace) { + if (!string) { + return {}; + } + string = string.replace(/&+/g, "&").replace(/^\?*&*|&+$/g, ""); + if (!string) { + return {}; + } + var items = {}; + var splits = string.split("&"); + var length = splits.length; + var v2, name, value; + for (var i = 0; i < length; i++) { + v2 = splits[i].split("="); + name = URI.decodeQuery(v2.shift(), escapeQuerySpace); + value = v2.length ? URI.decodeQuery(v2.join("="), escapeQuerySpace) : null; + if (name === "__proto__") { + continue; + } else if (hasOwn.call(items, name)) { + if (typeof items[name] === "string" || items[name] === null) { + items[name] = [items[name]]; + } + items[name].push(value); + } else { + items[name] = value; + } + } + return items; + }; + URI.build = function(parts) { + var t = ""; + var requireAbsolutePath = false; + if (parts.protocol) { + t += parts.protocol + ":"; + } + if (!parts.urn && (t || parts.hostname)) { + t += "//"; + requireAbsolutePath = true; + } + t += URI.buildAuthority(parts) || ""; + if (typeof parts.path === "string") { + if (parts.path.charAt(0) !== "/" && requireAbsolutePath) { + t += "/"; + } + t += parts.path; + } + if (typeof parts.query === "string" && parts.query) { + t += "?" + parts.query; + } + if (typeof parts.fragment === "string" && parts.fragment) { + t += "#" + parts.fragment; + } + return t; + }; + URI.buildHost = function(parts) { + var t = ""; + if (!parts.hostname) { + return ""; + } else if (URI.ip6_expression.test(parts.hostname)) { + t += "[" + parts.hostname + "]"; + } else { + t += parts.hostname; + } + if (parts.port) { + t += ":" + parts.port; + } + return t; + }; + URI.buildAuthority = function(parts) { + return URI.buildUserinfo(parts) + URI.buildHost(parts); + }; + URI.buildUserinfo = function(parts) { + var t = ""; + if (parts.username) { + t += URI.encode(parts.username); + } + if (parts.password) { + t += ":" + URI.encode(parts.password); + } + if (t) { + t += "@"; + } + return t; + }; + URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) { + var t = ""; + var unique, key, i, length; + for (key in data) { + if (key === "__proto__") { + continue; + } else if (hasOwn.call(data, key)) { + if (isArray(data[key])) { + unique = {}; + for (i = 0, length = data[key].length; i < length; i++) { + if (data[key][i] !== void 0 && unique[data[key][i] + ""] === void 0) { + t += "&" + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace); + if (duplicateQueryParameters !== true) { + unique[data[key][i] + ""] = true; + } + } + } + } else if (data[key] !== void 0) { + t += "&" + URI.buildQueryParameter(key, data[key], escapeQuerySpace); + } + } + } + return t.substring(1); + }; + URI.buildQueryParameter = function(name, value, escapeQuerySpace) { + return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? "=" + URI.encodeQuery(value, escapeQuerySpace) : ""); + }; + URI.addQuery = function(data, name, value) { + if (typeof name === "object") { + for (var key in name) { + if (hasOwn.call(name, key)) { + URI.addQuery(data, key, name[key]); + } + } + } else if (typeof name === "string") { + if (data[name] === void 0) { + data[name] = value; + return; + } else if (typeof data[name] === "string") { + data[name] = [data[name]]; + } + if (!isArray(value)) { + value = [value]; + } + data[name] = (data[name] || []).concat(value); + } else { + throw new TypeError("URI.addQuery() accepts an object, string as the name parameter"); + } + }; + URI.setQuery = function(data, name, value) { + if (typeof name === "object") { + for (var key in name) { + if (hasOwn.call(name, key)) { + URI.setQuery(data, key, name[key]); + } + } + } else if (typeof name === "string") { + data[name] = value === void 0 ? null : value; + } else { + throw new TypeError("URI.setQuery() accepts an object, string as the name parameter"); + } + }; + URI.removeQuery = function(data, name, value) { + var i, length, key; + if (isArray(name)) { + for (i = 0, length = name.length; i < length; i++) { + data[name[i]] = void 0; + } + } else if (getType(name) === "RegExp") { + for (key in data) { + if (name.test(key)) { + data[key] = void 0; + } + } + } else if (typeof name === "object") { + for (key in name) { + if (hasOwn.call(name, key)) { + URI.removeQuery(data, key, name[key]); + } + } + } else if (typeof name === "string") { + if (value !== void 0) { + if (getType(value) === "RegExp") { + if (!isArray(data[name]) && value.test(data[name])) { + data[name] = void 0; + } else { + data[name] = filterArrayValues(data[name], value); + } + } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) { + data[name] = void 0; + } else if (isArray(data[name])) { + data[name] = filterArrayValues(data[name], value); + } + } else { + data[name] = void 0; + } + } else { + throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter"); + } + }; + URI.hasQuery = function(data, name, value, withinArray) { + switch (getType(name)) { + case "String": + break; + case "RegExp": + for (var key in data) { + if (hasOwn.call(data, key)) { + if (name.test(key) && (value === void 0 || URI.hasQuery(data, key, value))) { + return true; + } + } + } + return false; + case "Object": + for (var _key in name) { + if (hasOwn.call(name, _key)) { + if (!URI.hasQuery(data, _key, name[_key])) { + return false; + } + } + } + return true; + default: + throw new TypeError("URI.hasQuery() accepts a string, regular expression or object as the name parameter"); + } + switch (getType(value)) { + case "Undefined": + return name in data; + // data[name] !== undefined; + case "Boolean": + var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]); + return value === _booly; + case "Function": + return !!value(data[name], name, data); + case "Array": + if (!isArray(data[name])) { + return false; + } + var op = withinArray ? arrayContains : arraysEqual; + return op(data[name], value); + case "RegExp": + if (!isArray(data[name])) { + return Boolean(data[name] && data[name].match(value)); + } + if (!withinArray) { + return false; + } + return arrayContains(data[name], value); + case "Number": + value = String(value); + /* falls through */ + case "String": + if (!isArray(data[name])) { + return data[name] === value; + } + if (!withinArray) { + return false; + } + return arrayContains(data[name], value); + default: + throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter"); + } + }; + URI.joinPaths = function() { + var input = []; + var segments = []; + var nonEmptySegments = 0; + for (var i = 0; i < arguments.length; i++) { + var url = new URI(arguments[i]); + input.push(url); + var _segments = url.segment(); + for (var s = 0; s < _segments.length; s++) { + if (typeof _segments[s] === "string") { + segments.push(_segments[s]); + } + if (_segments[s]) { + nonEmptySegments++; + } + } + } + if (!segments.length || !nonEmptySegments) { + return new URI(""); + } + var uri = new URI("").segment(segments); + if (input[0].path() === "" || input[0].path().slice(0, 1) === "/") { + uri.path("/" + uri.path()); + } + return uri.normalize(); + }; + URI.commonPath = function(one, two) { + var length = Math.min(one.length, two.length); + var pos; + for (pos = 0; pos < length; pos++) { + if (one.charAt(pos) !== two.charAt(pos)) { + pos--; + break; + } + } + if (pos < 1) { + return one.charAt(0) === two.charAt(0) && one.charAt(0) === "/" ? "/" : ""; + } + if (one.charAt(pos) !== "/" || two.charAt(pos) !== "/") { + pos = one.substring(0, pos).lastIndexOf("/"); + } + return one.substring(0, pos + 1); + }; + URI.withinString = function(string, callback, options) { + options || (options = {}); + var _start = options.start || URI.findUri.start; + var _end = options.end || URI.findUri.end; + var _trim = options.trim || URI.findUri.trim; + var _parens = options.parens || URI.findUri.parens; + var _attributeOpen = /[a-z0-9-]=["']?$/i; + _start.lastIndex = 0; + while (true) { + var match = _start.exec(string); + if (!match) { + break; + } + var start = match.index; + if (options.ignoreHtml) { + var attributeOpen = string.slice(Math.max(start - 3, 0), start); + if (attributeOpen && _attributeOpen.test(attributeOpen)) { + continue; + } + } + var end = start + string.slice(start).search(_end); + var slice = string.slice(start, end); + var parensEnd = -1; + while (true) { + var parensMatch = _parens.exec(slice); + if (!parensMatch) { + break; + } + var parensMatchEnd = parensMatch.index + parensMatch[0].length; + parensEnd = Math.max(parensEnd, parensMatchEnd); + } + if (parensEnd > -1) { + slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, ""); + } else { + slice = slice.replace(_trim, ""); + } + if (slice.length <= match[0].length) { + continue; + } + if (options.ignore && options.ignore.test(slice)) { + continue; + } + end = start + slice.length; + var result = callback(slice, start, end, string); + if (result === void 0) { + _start.lastIndex = end; + continue; + } + result = String(result); + string = string.slice(0, start) + result + string.slice(end); + _start.lastIndex = start + result.length; + } + _start.lastIndex = 0; + return string; + }; + URI.ensureValidHostname = function(v2, protocol) { + var hasHostname = !!v2; + var hasProtocol = !!protocol; + var rejectEmptyHostname = false; + if (hasProtocol) { + rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol); + } + if (rejectEmptyHostname && !hasHostname) { + throw new TypeError("Hostname cannot be empty, if protocol is " + protocol); + } else if (v2 && v2.match(URI.invalid_hostname_characters)) { + if (!punycode) { + throw new TypeError('Hostname "' + v2 + '" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available'); + } + if (punycode.toASCII(v2).match(URI.invalid_hostname_characters)) { + throw new TypeError('Hostname "' + v2 + '" contains characters other than [A-Z0-9.-:_]'); + } + } + }; + URI.ensureValidPort = function(v2) { + if (!v2) { + return; + } + var port = Number(v2); + if (isInteger(port) && port > 0 && port < 65536) { + return; + } + throw new TypeError('Port "' + v2 + '" is not a valid port'); + }; + URI.noConflict = function(removeAll) { + if (removeAll) { + var unconflicted = { + URI: this.noConflict() + }; + if (root.URITemplate && typeof root.URITemplate.noConflict === "function") { + unconflicted.URITemplate = root.URITemplate.noConflict(); + } + if (root.IPv6 && typeof root.IPv6.noConflict === "function") { + unconflicted.IPv6 = root.IPv6.noConflict(); + } + if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === "function") { + unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict(); + } + return unconflicted; + } else if (root.URI === this) { + root.URI = _URI; + } + return this; + }; + p.build = function(deferBuild) { + if (deferBuild === true) { + this._deferred_build = true; + } else if (deferBuild === void 0 || this._deferred_build) { + this._string = URI.build(this._parts); + this._deferred_build = false; + } + return this; + }; + p.clone = function() { + return new URI(this); + }; + p.valueOf = p.toString = function() { + return this.build(false)._string; + }; + function generateSimpleAccessor(_part2) { + return function(v2, build) { + if (v2 === void 0) { + return this._parts[_part2] || ""; + } else { + this._parts[_part2] = v2 || null; + this.build(!build); + return this; + } + }; + } + function generatePrefixAccessor(_part2, _key) { + return function(v2, build) { + if (v2 === void 0) { + return this._parts[_part2] || ""; + } else { + if (v2 !== null) { + v2 = v2 + ""; + if (v2.charAt(0) === _key) { + v2 = v2.substring(1); + } + } + this._parts[_part2] = v2; + this.build(!build); + return this; + } + }; + } + p.protocol = generateSimpleAccessor("protocol"); + p.username = generateSimpleAccessor("username"); + p.password = generateSimpleAccessor("password"); + p.hostname = generateSimpleAccessor("hostname"); + p.port = generateSimpleAccessor("port"); + p.query = generatePrefixAccessor("query", "?"); + p.fragment = generatePrefixAccessor("fragment", "#"); + p.search = function(v2, build) { + var t = this.query(v2, build); + return typeof t === "string" && t.length ? "?" + t : t; + }; + p.hash = function(v2, build) { + var t = this.fragment(v2, build); + return typeof t === "string" && t.length ? "#" + t : t; + }; + p.pathname = function(v2, build) { + if (v2 === void 0 || v2 === true) { + var res = this._parts.path || (this._parts.hostname ? "/" : ""); + return v2 ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res; + } else { + if (this._parts.urn) { + this._parts.path = v2 ? URI.recodeUrnPath(v2) : ""; + } else { + this._parts.path = v2 ? URI.recodePath(v2) : "/"; + } + this.build(!build); + return this; + } + }; + p.path = p.pathname; + p.href = function(href, build) { + var key; + if (href === void 0) { + return this.toString(); + } + this._string = ""; + this._parts = URI._parts(); + var _URI2 = href instanceof URI; + var _object = typeof href === "object" && (href.hostname || href.path || href.pathname); + if (href.nodeName) { + var attribute = URI.getDomAttribute(href); + href = href[attribute] || ""; + _object = false; + } + if (!_URI2 && _object && href.pathname !== void 0) { + href = href.toString(); + } + if (typeof href === "string" || href instanceof String) { + this._parts = URI.parse(String(href), this._parts); + } else if (_URI2 || _object) { + var src = _URI2 ? href._parts : href; + for (key in src) { + if (key === "query") { + continue; + } + if (hasOwn.call(this._parts, key)) { + this._parts[key] = src[key]; + } + } + if (src.query) { + this.query(src.query, false); + } + } else { + throw new TypeError("invalid input"); + } + this.build(!build); + return this; + }; + p.is = function(what) { + var ip = false; + var ip4 = false; + var ip6 = false; + var name = false; + var sld = false; + var idn = false; + var punycode2 = false; + var relative = !this._parts.urn; + if (this._parts.hostname) { + relative = false; + ip4 = URI.ip4_expression.test(this._parts.hostname); + ip6 = URI.ip6_expression.test(this._parts.hostname); + ip = ip4 || ip6; + name = !ip; + sld = name && SLD && SLD.has(this._parts.hostname); + idn = name && URI.idn_expression.test(this._parts.hostname); + punycode2 = name && URI.punycode_expression.test(this._parts.hostname); + } + switch (what.toLowerCase()) { + case "relative": + return relative; + case "absolute": + return !relative; + // hostname identification + case "domain": + case "name": + return name; + case "sld": + return sld; + case "ip": + return ip; + case "ip4": + case "ipv4": + case "inet4": + return ip4; + case "ip6": + case "ipv6": + case "inet6": + return ip6; + case "idn": + return idn; + case "url": + return !this._parts.urn; + case "urn": + return !!this._parts.urn; + case "punycode": + return punycode2; + } + return null; + }; + var _protocol = p.protocol; + var _port = p.port; + var _hostname = p.hostname; + p.protocol = function(v2, build) { + if (v2) { + v2 = v2.replace(/:(\/\/)?$/, ""); + if (!v2.match(URI.protocol_expression)) { + throw new TypeError('Protocol "' + v2 + `" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]`); + } + } + return _protocol.call(this, v2, build); + }; + p.scheme = p.protocol; + p.port = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 !== void 0) { + if (v2 === 0) { + v2 = null; + } + if (v2) { + v2 += ""; + if (v2.charAt(0) === ":") { + v2 = v2.substring(1); + } + URI.ensureValidPort(v2); + } + } + return _port.call(this, v2, build); + }; + p.hostname = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 !== void 0) { + var x = { preventInvalidHostname: this._parts.preventInvalidHostname }; + var res = URI.parseHost(v2, x); + if (res !== "/") { + throw new TypeError('Hostname "' + v2 + '" contains characters other than [A-Z0-9.-]'); + } + v2 = x.hostname; + if (this._parts.preventInvalidHostname) { + URI.ensureValidHostname(v2, this._parts.protocol); + } + } + return _hostname.call(this, v2, build); + }; + p.origin = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0) { + var protocol = this.protocol(); + var authority = this.authority(); + if (!authority) { + return ""; + } + return (protocol ? protocol + "://" : "") + this.authority(); + } else { + var origin = URI(v2); + this.protocol(origin.protocol()).authority(origin.authority()).build(!build); + return this; + } + }; + p.host = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0) { + return this._parts.hostname ? URI.buildHost(this._parts) : ""; + } else { + var res = URI.parseHost(v2, this._parts); + if (res !== "/") { + throw new TypeError('Hostname "' + v2 + '" contains characters other than [A-Z0-9.-]'); + } + this.build(!build); + return this; + } + }; + p.authority = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0) { + return this._parts.hostname ? URI.buildAuthority(this._parts) : ""; + } else { + var res = URI.parseAuthority(v2, this._parts); + if (res !== "/") { + throw new TypeError('Hostname "' + v2 + '" contains characters other than [A-Z0-9.-]'); + } + this.build(!build); + return this; + } + }; + p.userinfo = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0) { + var t = URI.buildUserinfo(this._parts); + return t ? t.substring(0, t.length - 1) : t; + } else { + if (v2[v2.length - 1] !== "@") { + v2 += "@"; + } + URI.parseUserinfo(v2, this._parts); + this.build(!build); + return this; + } + }; + p.resource = function(v2, build) { + var parts; + if (v2 === void 0) { + return this.path() + this.search() + this.hash(); + } + parts = URI.parse(v2); + this._parts.path = parts.path; + this._parts.query = parts.query; + this._parts.fragment = parts.fragment; + this.build(!build); + return this; + }; + p.subdomain = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0) { + if (!this._parts.hostname || this.is("IP")) { + return ""; + } + var end = this._parts.hostname.length - this.domain().length - 1; + return this._parts.hostname.substring(0, end) || ""; + } else { + var e = this._parts.hostname.length - this.domain().length; + var sub = this._parts.hostname.substring(0, e); + var replace = new RegExp("^" + escapeRegEx(sub)); + if (v2 && v2.charAt(v2.length - 1) !== ".") { + v2 += "."; + } + if (v2.indexOf(":") !== -1) { + throw new TypeError("Domains cannot contain colons"); + } + if (v2) { + URI.ensureValidHostname(v2, this._parts.protocol); + } + this._parts.hostname = this._parts.hostname.replace(replace, v2); + this.build(!build); + return this; + } + }; + p.domain = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (typeof v2 === "boolean") { + build = v2; + v2 = void 0; + } + if (v2 === void 0) { + if (!this._parts.hostname || this.is("IP")) { + return ""; + } + var t = this._parts.hostname.match(/\./g); + if (t && t.length < 2) { + return this._parts.hostname; + } + var end = this._parts.hostname.length - this.tld(build).length - 1; + end = this._parts.hostname.lastIndexOf(".", end - 1) + 1; + return this._parts.hostname.substring(end) || ""; + } else { + if (!v2) { + throw new TypeError("cannot set domain empty"); + } + if (v2.indexOf(":") !== -1) { + throw new TypeError("Domains cannot contain colons"); + } + URI.ensureValidHostname(v2, this._parts.protocol); + if (!this._parts.hostname || this.is("IP")) { + this._parts.hostname = v2; + } else { + var replace = new RegExp(escapeRegEx(this.domain()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v2); + } + this.build(!build); + return this; + } + }; + p.tld = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (typeof v2 === "boolean") { + build = v2; + v2 = void 0; + } + if (v2 === void 0) { + if (!this._parts.hostname || this.is("IP")) { + return ""; + } + var pos = this._parts.hostname.lastIndexOf("."); + var tld = this._parts.hostname.substring(pos + 1); + if (build !== true && SLD && SLD.list[tld.toLowerCase()]) { + return SLD.get(this._parts.hostname) || tld; + } + return tld; + } else { + var replace; + if (!v2) { + throw new TypeError("cannot set TLD empty"); + } else if (v2.match(/[^a-zA-Z0-9-]/)) { + if (SLD && SLD.is(v2)) { + replace = new RegExp(escapeRegEx(this.tld()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v2); + } else { + throw new TypeError('TLD "' + v2 + '" contains characters other than [A-Z0-9]'); + } + } else if (!this._parts.hostname || this.is("IP")) { + throw new ReferenceError("cannot set TLD on non-domain host"); + } else { + replace = new RegExp(escapeRegEx(this.tld()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v2); + } + this.build(!build); + return this; + } + }; + p.directory = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0 || v2 === true) { + if (!this._parts.path && !this._parts.hostname) { + return ""; + } + if (this._parts.path === "/") { + return "/"; + } + var end = this._parts.path.length - this.filename().length - 1; + var res = this._parts.path.substring(0, end) || (this._parts.hostname ? "/" : ""); + return v2 ? URI.decodePath(res) : res; + } else { + var e = this._parts.path.length - this.filename().length; + var directory = this._parts.path.substring(0, e); + var replace = new RegExp("^" + escapeRegEx(directory)); + if (!this.is("relative")) { + if (!v2) { + v2 = "/"; + } + if (v2.charAt(0) !== "/") { + v2 = "/" + v2; + } + } + if (v2 && v2.charAt(v2.length - 1) !== "/") { + v2 += "/"; + } + v2 = URI.recodePath(v2); + this._parts.path = this._parts.path.replace(replace, v2); + this.build(!build); + return this; + } + }; + p.filename = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (typeof v2 !== "string") { + if (!this._parts.path || this._parts.path === "/") { + return ""; + } + var pos = this._parts.path.lastIndexOf("/"); + var res = this._parts.path.substring(pos + 1); + return v2 ? URI.decodePathSegment(res) : res; + } else { + var mutatedDirectory = false; + if (v2.charAt(0) === "/") { + v2 = v2.substring(1); + } + if (v2.match(/\.?\//)) { + mutatedDirectory = true; + } + var replace = new RegExp(escapeRegEx(this.filename()) + "$"); + v2 = URI.recodePath(v2); + this._parts.path = this._parts.path.replace(replace, v2); + if (mutatedDirectory) { + this.normalizePath(build); + } else { + this.build(!build); + } + return this; + } + }; + p.suffix = function(v2, build) { + if (this._parts.urn) { + return v2 === void 0 ? "" : this; + } + if (v2 === void 0 || v2 === true) { + if (!this._parts.path || this._parts.path === "/") { + return ""; + } + var filename = this.filename(); + var pos = filename.lastIndexOf("."); + var s, res; + if (pos === -1) { + return ""; + } + s = filename.substring(pos + 1); + res = /^[a-z0-9%]+$/i.test(s) ? s : ""; + return v2 ? URI.decodePathSegment(res) : res; + } else { + if (v2.charAt(0) === ".") { + v2 = v2.substring(1); + } + var suffix = this.suffix(); + var replace; + if (!suffix) { + if (!v2) { + return this; + } + this._parts.path += "." + URI.recodePath(v2); + } else if (!v2) { + replace = new RegExp(escapeRegEx("." + suffix) + "$"); + } else { + replace = new RegExp(escapeRegEx(suffix) + "$"); + } + if (replace) { + v2 = URI.recodePath(v2); + this._parts.path = this._parts.path.replace(replace, v2); + } + this.build(!build); + return this; + } + }; + p.segment = function(segment, v2, build) { + var separator = this._parts.urn ? ":" : "/"; + var path = this.path(); + var absolute = path.substring(0, 1) === "/"; + var segments = path.split(separator); + if (segment !== void 0 && typeof segment !== "number") { + build = v2; + v2 = segment; + segment = void 0; + } + if (segment !== void 0 && typeof segment !== "number") { + throw new Error('Bad segment "' + segment + '", must be 0-based integer'); + } + if (absolute) { + segments.shift(); + } + if (segment < 0) { + segment = Math.max(segments.length + segment, 0); + } + if (v2 === void 0) { + return segment === void 0 ? segments : segments[segment]; + } else if (segment === null || segments[segment] === void 0) { + if (isArray(v2)) { + segments = []; + for (var i = 0, l = v2.length; i < l; i++) { + if (!v2[i].length && (!segments.length || !segments[segments.length - 1].length)) { + continue; + } + if (segments.length && !segments[segments.length - 1].length) { + segments.pop(); + } + segments.push(trimSlashes(v2[i])); + } + } else if (v2 || typeof v2 === "string") { + v2 = trimSlashes(v2); + if (segments[segments.length - 1] === "") { + segments[segments.length - 1] = v2; + } else { + segments.push(v2); + } + } + } else { + if (v2) { + segments[segment] = trimSlashes(v2); + } else { + segments.splice(segment, 1); + } + } + if (absolute) { + segments.unshift(""); + } + return this.path(segments.join(separator), build); + }; + p.segmentCoded = function(segment, v2, build) { + var segments, i, l; + if (typeof segment !== "number") { + build = v2; + v2 = segment; + segment = void 0; + } + if (v2 === void 0) { + segments = this.segment(segment, v2, build); + if (!isArray(segments)) { + segments = segments !== void 0 ? URI.decode(segments) : void 0; + } else { + for (i = 0, l = segments.length; i < l; i++) { + segments[i] = URI.decode(segments[i]); + } + } + return segments; + } + if (!isArray(v2)) { + v2 = typeof v2 === "string" || v2 instanceof String ? URI.encode(v2) : v2; + } else { + for (i = 0, l = v2.length; i < l; i++) { + v2[i] = URI.encode(v2[i]); + } + } + return this.segment(segment, v2, build); + }; + var q = p.query; + p.query = function(v2, build) { + if (v2 === true) { + return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + } else if (typeof v2 === "function") { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + var result = v2.call(this, data); + this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + this.build(!build); + return this; + } else if (v2 !== void 0 && typeof v2 !== "string") { + this._parts.query = URI.buildQuery(v2, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + this.build(!build); + return this; + } else { + return q.call(this, v2, build); + } + }; + p.setQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + if (typeof name === "string" || name instanceof String) { + data[name] = value !== void 0 ? value : null; + } else if (typeof name === "object") { + for (var key in name) { + if (hasOwn.call(name, key)) { + data[key] = name[key]; + } + } + } else { + throw new TypeError("URI.addQuery() accepts an object, string as the name parameter"); + } + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== "string") { + build = value; + } + this.build(!build); + return this; + }; + p.addQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + URI.addQuery(data, name, value === void 0 ? null : value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== "string") { + build = value; + } + this.build(!build); + return this; + }; + p.removeQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + URI.removeQuery(data, name, value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== "string") { + build = value; + } + this.build(!build); + return this; + }; + p.hasQuery = function(name, value, withinArray) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + return URI.hasQuery(data, name, value, withinArray); + }; + p.setSearch = p.setQuery; + p.addSearch = p.addQuery; + p.removeSearch = p.removeQuery; + p.hasSearch = p.hasQuery; + p.normalize = function() { + if (this._parts.urn) { + return this.normalizeProtocol(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build(); + } + return this.normalizeProtocol(false).normalizeHostname(false).normalizePort(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build(); + }; + p.normalizeProtocol = function(build) { + if (typeof this._parts.protocol === "string") { + this._parts.protocol = this._parts.protocol.toLowerCase(); + this.build(!build); + } + return this; + }; + p.normalizeHostname = function(build) { + if (this._parts.hostname) { + if (this.is("IDN") && punycode) { + this._parts.hostname = punycode.toASCII(this._parts.hostname); + } else if (this.is("IPv6") && IPv6) { + this._parts.hostname = IPv6.best(this._parts.hostname); + } + this._parts.hostname = this._parts.hostname.toLowerCase(); + this.build(!build); + } + return this; + }; + p.normalizePort = function(build) { + if (typeof this._parts.protocol === "string" && this._parts.port === URI.defaultPorts[this._parts.protocol]) { + this._parts.port = null; + this.build(!build); + } + return this; + }; + p.normalizePath = function(build) { + var _path = this._parts.path; + if (!_path) { + return this; + } + if (this._parts.urn) { + this._parts.path = URI.recodeUrnPath(this._parts.path); + this.build(!build); + return this; + } + if (this._parts.path === "/") { + return this; + } + _path = URI.recodePath(_path); + var _was_relative; + var _leadingParents = ""; + var _parent, _pos; + if (_path.charAt(0) !== "/") { + _was_relative = true; + _path = "/" + _path; + } + if (_path.slice(-3) === "/.." || _path.slice(-2) === "/.") { + _path += "/"; + } + _path = _path.replace(/(\/(\.\/)+)|(\/\.$)/g, "/").replace(/\/{2,}/g, "/"); + if (_was_relative) { + _leadingParents = _path.substring(1).match(/^(\.\.\/)+/) || ""; + if (_leadingParents) { + _leadingParents = _leadingParents[0]; + } + } + while (true) { + _parent = _path.search(/\/\.\.(\/|$)/); + if (_parent === -1) { + break; + } else if (_parent === 0) { + _path = _path.substring(3); + continue; + } + _pos = _path.substring(0, _parent).lastIndexOf("/"); + if (_pos === -1) { + _pos = _parent; + } + _path = _path.substring(0, _pos) + _path.substring(_parent + 3); + } + if (_was_relative && this.is("relative")) { + _path = _leadingParents + _path.substring(1); + } + this._parts.path = _path; + this.build(!build); + return this; + }; + p.normalizePathname = p.normalizePath; + p.normalizeQuery = function(build) { + if (typeof this._parts.query === "string") { + if (!this._parts.query.length) { + this._parts.query = null; + } else { + this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace)); + } + this.build(!build); + } + return this; + }; + p.normalizeFragment = function(build) { + if (!this._parts.fragment) { + this._parts.fragment = null; + this.build(!build); + } + return this; + }; + p.normalizeSearch = p.normalizeQuery; + p.normalizeHash = p.normalizeFragment; + p.iso8859 = function() { + var e = URI.encode; + var d = URI.decode; + URI.encode = escape; + URI.decode = decodeURIComponent; + try { + this.normalize(); + } finally { + URI.encode = e; + URI.decode = d; + } + return this; + }; + p.unicode = function() { + var e = URI.encode; + var d = URI.decode; + URI.encode = strictEncodeURIComponent; + URI.decode = unescape; + try { + this.normalize(); + } finally { + URI.encode = e; + URI.decode = d; + } + return this; + }; + p.readable = function() { + var uri = this.clone(); + uri.username("").password("").normalize(); + var t = ""; + if (uri._parts.protocol) { + t += uri._parts.protocol + "://"; + } + if (uri._parts.hostname) { + if (uri.is("punycode") && punycode) { + t += punycode.toUnicode(uri._parts.hostname); + if (uri._parts.port) { + t += ":" + uri._parts.port; + } + } else { + t += uri.host(); + } + } + if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== "/") { + t += "/"; + } + t += uri.path(true); + if (uri._parts.query) { + var q2 = ""; + for (var i = 0, qp = uri._parts.query.split("&"), l = qp.length; i < l; i++) { + var kv = (qp[i] || "").split("="); + q2 += "&" + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace).replace(/&/g, "%26"); + if (kv[1] !== void 0) { + q2 += "=" + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace).replace(/&/g, "%26"); + } + } + t += "?" + q2.substring(1); + } + t += URI.decodeQuery(uri.hash(), true); + return t; + }; + p.absoluteTo = function(base) { + var resolved = this.clone(); + var properties = ["protocol", "username", "password", "hostname", "port"]; + var basedir, i, p2; + if (this._parts.urn) { + throw new Error("URNs do not have any generally defined hierarchical components"); + } + if (!(base instanceof URI)) { + base = new URI(base); + } + if (resolved._parts.protocol) { + return resolved; + } else { + resolved._parts.protocol = base._parts.protocol; + } + if (this._parts.hostname) { + return resolved; + } + for (i = 0; p2 = properties[i]; i++) { + resolved._parts[p2] = base._parts[p2]; + } + if (!resolved._parts.path) { + resolved._parts.path = base._parts.path; + if (!resolved._parts.query) { + resolved._parts.query = base._parts.query; + } + } else { + if (resolved._parts.path.substring(-2) === "..") { + resolved._parts.path += "/"; + } + if (resolved.path().charAt(0) !== "/") { + basedir = base.directory(); + basedir = basedir ? basedir : base.path().indexOf("/") === 0 ? "/" : ""; + resolved._parts.path = (basedir ? basedir + "/" : "") + resolved._parts.path; + resolved.normalizePath(); + } + } + resolved.build(); + return resolved; + }; + p.relativeTo = function(base) { + var relative = this.clone().normalize(); + var relativeParts, baseParts, common, relativePath, basePath; + if (relative._parts.urn) { + throw new Error("URNs do not have any generally defined hierarchical components"); + } + base = new URI(base).normalize(); + relativeParts = relative._parts; + baseParts = base._parts; + relativePath = relative.path(); + basePath = base.path(); + if (relativePath.charAt(0) !== "/") { + throw new Error("URI is already relative"); + } + if (basePath.charAt(0) !== "/") { + throw new Error("Cannot calculate a URI relative to another relative URI"); + } + if (relativeParts.protocol === baseParts.protocol) { + relativeParts.protocol = null; + } + if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) { + return relative.build(); + } + if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) { + return relative.build(); + } + if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) { + relativeParts.hostname = null; + relativeParts.port = null; + } else { + return relative.build(); + } + if (relativePath === basePath) { + relativeParts.path = ""; + return relative.build(); + } + common = URI.commonPath(relativePath, basePath); + if (!common) { + return relative.build(); + } + var parents = baseParts.path.substring(common.length).replace(/[^\/]*$/, "").replace(/.*?\//g, "../"); + relativeParts.path = parents + relativeParts.path.substring(common.length) || "./"; + return relative.build(); + }; + p.equals = function(uri) { + var one = this.clone(); + var two = new URI(uri); + var one_map = {}; + var two_map = {}; + var checked = {}; + var one_query, two_query, key; + one.normalize(); + two.normalize(); + if (one.toString() === two.toString()) { + return true; + } + one_query = one.query(); + two_query = two.query(); + one.query(""); + two.query(""); + if (one.toString() !== two.toString()) { + return false; + } + if (one_query.length !== two_query.length) { + return false; + } + one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace); + two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace); + for (key in one_map) { + if (hasOwn.call(one_map, key)) { + if (!isArray(one_map[key])) { + if (one_map[key] !== two_map[key]) { + return false; + } + } else if (!arraysEqual(one_map[key], two_map[key])) { + return false; + } + checked[key] = true; + } + } + for (key in two_map) { + if (hasOwn.call(two_map, key)) { + if (!checked[key]) { + return false; + } + } + } + return true; + }; + p.preventInvalidHostname = function(v2) { + this._parts.preventInvalidHostname = !!v2; + return this; + }; + p.duplicateQueryParameters = function(v2) { + this._parts.duplicateQueryParameters = !!v2; + return this; + }; + p.escapeQuerySpace = function(v2) { + this._parts.escapeQuerySpace = !!v2; + return this; + }; + return URI; + }); + } +}); + +// packages/engine/Source/Core/Cartesian4.js +function Cartesian4(x, y, z, w) { + this.x = defaultValue_default(x, 0); + this.y = defaultValue_default(y, 0); + this.z = defaultValue_default(z, 0); + this.w = defaultValue_default(w, 0); +} +Cartesian4.fromElements = function(x, y, z, w, result) { + if (!defined_default(result)) { + return new Cartesian4(x, y, z, w); + } + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Cartesian4.fromColor = function(color, result) { + Check_default.typeOf.object("color", color); + if (!defined_default(result)) { + return new Cartesian4(color.red, color.green, color.blue, color.alpha); + } + result.x = color.red; + result.y = color.green; + result.z = color.blue; + result.w = color.alpha; + return result; +}; +Cartesian4.clone = function(cartesian, result) { + if (!defined_default(cartesian)) { + return void 0; + } + if (!defined_default(result)) { + return new Cartesian4(cartesian.x, cartesian.y, cartesian.z, cartesian.w); + } + result.x = cartesian.x; + result.y = cartesian.y; + result.z = cartesian.z; + result.w = cartesian.w; + return result; +}; +Cartesian4.packedLength = 4; +Cartesian4.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.x; + array[startingIndex++] = value.y; + array[startingIndex++] = value.z; + array[startingIndex] = value.w; + return array; +}; +Cartesian4.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Cartesian4(); + } + result.x = array[startingIndex++]; + result.y = array[startingIndex++]; + result.z = array[startingIndex++]; + result.w = array[startingIndex]; + return result; +}; +Cartesian4.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 4; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 4 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Cartesian4.pack(array[i], result, i * 4); + } + return result; +}; +Cartesian4.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 4); + if (array.length % 4 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 4."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 4); + } else { + result.length = length / 4; + } + for (let i = 0; i < length; i += 4) { + const index = i / 4; + result[index] = Cartesian4.unpack(array, i, result[index]); + } + return result; +}; +Cartesian4.fromArray = Cartesian4.unpack; +Cartesian4.maximumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w); +}; +Cartesian4.minimumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w); +}; +Cartesian4.minimumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.min(first.x, second.x); + result.y = Math.min(first.y, second.y); + result.z = Math.min(first.z, second.z); + result.w = Math.min(first.w, second.w); + return result; +}; +Cartesian4.maximumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.max(first.x, second.x); + result.y = Math.max(first.y, second.y); + result.z = Math.max(first.z, second.z); + result.w = Math.max(first.w, second.w); + return result; +}; +Cartesian4.clamp = function(value, min, max, result) { + Check_default.typeOf.object("value", value); + Check_default.typeOf.object("min", min); + Check_default.typeOf.object("max", max); + Check_default.typeOf.object("result", result); + const x = Math_default.clamp(value.x, min.x, max.x); + const y = Math_default.clamp(value.y, min.y, max.y); + const z = Math_default.clamp(value.z, min.z, max.z); + const w = Math_default.clamp(value.w, min.w, max.w); + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Cartesian4.magnitudeSquared = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z + cartesian.w * cartesian.w; +}; +Cartesian4.magnitude = function(cartesian) { + return Math.sqrt(Cartesian4.magnitudeSquared(cartesian)); +}; +var distanceScratch = new Cartesian4(); +Cartesian4.distance = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian4.subtract(left, right, distanceScratch); + return Cartesian4.magnitude(distanceScratch); +}; +Cartesian4.distanceSquared = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian4.subtract(left, right, distanceScratch); + return Cartesian4.magnitudeSquared(distanceScratch); +}; +Cartesian4.normalize = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const magnitude = Cartesian4.magnitude(cartesian); + result.x = cartesian.x / magnitude; + result.y = cartesian.y / magnitude; + result.z = cartesian.z / magnitude; + result.w = cartesian.w / magnitude; + if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z) || isNaN(result.w)) { + throw new DeveloperError_default("normalized result is not a number"); + } + return result; +}; +Cartesian4.dot = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; +}; +Cartesian4.multiplyComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x * right.x; + result.y = left.y * right.y; + result.z = left.z * right.z; + result.w = left.w * right.w; + return result; +}; +Cartesian4.divideComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + result.w = left.w / right.w; + return result; +}; +Cartesian4.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x + right.x; + result.y = left.y + right.y; + result.z = left.z + right.z; + result.w = left.w + right.w; + return result; +}; +Cartesian4.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x - right.x; + result.y = left.y - right.y; + result.z = left.z - right.z; + result.w = left.w - right.w; + return result; +}; +Cartesian4.multiplyByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x * scalar; + result.y = cartesian.y * scalar; + result.z = cartesian.z * scalar; + result.w = cartesian.w * scalar; + return result; +}; +Cartesian4.divideByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x / scalar; + result.y = cartesian.y / scalar; + result.z = cartesian.z / scalar; + result.w = cartesian.w / scalar; + return result; +}; +Cartesian4.negate = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = -cartesian.x; + result.y = -cartesian.y; + result.z = -cartesian.z; + result.w = -cartesian.w; + return result; +}; +Cartesian4.abs = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = Math.abs(cartesian.x); + result.y = Math.abs(cartesian.y); + result.z = Math.abs(cartesian.z); + result.w = Math.abs(cartesian.w); + return result; +}; +var lerpScratch = new Cartesian4(); +Cartesian4.lerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + Cartesian4.multiplyByScalar(end, t, lerpScratch); + result = Cartesian4.multiplyByScalar(start, 1 - t, result); + return Cartesian4.add(lerpScratch, result, result); +}; +var mostOrthogonalAxisScratch = new Cartesian4(); +Cartesian4.mostOrthogonalAxis = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch); + Cartesian4.abs(f, f); + if (f.x <= f.y) { + if (f.x <= f.z) { + if (f.x <= f.w) { + result = Cartesian4.clone(Cartesian4.UNIT_X, result); + } else { + result = Cartesian4.clone(Cartesian4.UNIT_W, result); + } + } else if (f.z <= f.w) { + result = Cartesian4.clone(Cartesian4.UNIT_Z, result); + } else { + result = Cartesian4.clone(Cartesian4.UNIT_W, result); + } + } else if (f.y <= f.z) { + if (f.y <= f.w) { + result = Cartesian4.clone(Cartesian4.UNIT_Y, result); + } else { + result = Cartesian4.clone(Cartesian4.UNIT_W, result); + } + } else if (f.z <= f.w) { + result = Cartesian4.clone(Cartesian4.UNIT_Z, result); + } else { + result = Cartesian4.clone(Cartesian4.UNIT_W, result); + } + return result; +}; +Cartesian4.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.x === right.x && left.y === right.y && left.z === right.z && left.w === right.w; +}; +Cartesian4.equalsArray = function(cartesian, array, offset) { + return cartesian.x === array[offset] && cartesian.y === array[offset + 1] && cartesian.z === array[offset + 2] && cartesian.w === array[offset + 3]; +}; +Cartesian4.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) { + return left === right || defined_default(left) && defined_default(right) && Math_default.equalsEpsilon( + left.x, + right.x, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.y, + right.y, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.z, + right.z, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.w, + right.w, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian4.ZERO = Object.freeze(new Cartesian4(0, 0, 0, 0)); +Cartesian4.ONE = Object.freeze(new Cartesian4(1, 1, 1, 1)); +Cartesian4.UNIT_X = Object.freeze(new Cartesian4(1, 0, 0, 0)); +Cartesian4.UNIT_Y = Object.freeze(new Cartesian4(0, 1, 0, 0)); +Cartesian4.UNIT_Z = Object.freeze(new Cartesian4(0, 0, 1, 0)); +Cartesian4.UNIT_W = Object.freeze(new Cartesian4(0, 0, 0, 1)); +Cartesian4.prototype.clone = function(result) { + return Cartesian4.clone(this, result); +}; +Cartesian4.prototype.equals = function(right) { + return Cartesian4.equals(this, right); +}; +Cartesian4.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) { + return Cartesian4.equalsEpsilon( + this, + right, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian4.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`; +}; +var scratchF32Array = new Float32Array(1); +var scratchU8Array = new Uint8Array(scratchF32Array.buffer); +var testU32 = new Uint32Array([287454020]); +var testU8 = new Uint8Array(testU32.buffer); +var littleEndian = testU8[0] === 68; +Cartesian4.packFloat = function(value, result) { + Check_default.typeOf.number("value", value); + if (!defined_default(result)) { + result = new Cartesian4(); + } + scratchF32Array[0] = value; + if (littleEndian) { + result.x = scratchU8Array[0]; + result.y = scratchU8Array[1]; + result.z = scratchU8Array[2]; + result.w = scratchU8Array[3]; + } else { + result.x = scratchU8Array[3]; + result.y = scratchU8Array[2]; + result.z = scratchU8Array[1]; + result.w = scratchU8Array[0]; + } + return result; +}; +Cartesian4.unpackFloat = function(packedFloat) { + Check_default.typeOf.object("packedFloat", packedFloat); + if (littleEndian) { + scratchU8Array[0] = packedFloat.x; + scratchU8Array[1] = packedFloat.y; + scratchU8Array[2] = packedFloat.z; + scratchU8Array[3] = packedFloat.w; + } else { + scratchU8Array[0] = packedFloat.w; + scratchU8Array[1] = packedFloat.z; + scratchU8Array[2] = packedFloat.y; + scratchU8Array[3] = packedFloat.x; + } + return scratchF32Array[0]; +}; +var Cartesian4_default = Cartesian4; + +// packages/engine/Source/Core/Matrix4.js +function Matrix4(column0Row0, column1Row0, column2Row0, column3Row0, column0Row1, column1Row1, column2Row1, column3Row1, column0Row2, column1Row2, column2Row2, column3Row2, column0Row3, column1Row3, column2Row3, column3Row3) { + this[0] = defaultValue_default(column0Row0, 0); + this[1] = defaultValue_default(column0Row1, 0); + this[2] = defaultValue_default(column0Row2, 0); + this[3] = defaultValue_default(column0Row3, 0); + this[4] = defaultValue_default(column1Row0, 0); + this[5] = defaultValue_default(column1Row1, 0); + this[6] = defaultValue_default(column1Row2, 0); + this[7] = defaultValue_default(column1Row3, 0); + this[8] = defaultValue_default(column2Row0, 0); + this[9] = defaultValue_default(column2Row1, 0); + this[10] = defaultValue_default(column2Row2, 0); + this[11] = defaultValue_default(column2Row3, 0); + this[12] = defaultValue_default(column3Row0, 0); + this[13] = defaultValue_default(column3Row1, 0); + this[14] = defaultValue_default(column3Row2, 0); + this[15] = defaultValue_default(column3Row3, 0); +} +Matrix4.packedLength = 16; +Matrix4.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value[0]; + array[startingIndex++] = value[1]; + array[startingIndex++] = value[2]; + array[startingIndex++] = value[3]; + array[startingIndex++] = value[4]; + array[startingIndex++] = value[5]; + array[startingIndex++] = value[6]; + array[startingIndex++] = value[7]; + array[startingIndex++] = value[8]; + array[startingIndex++] = value[9]; + array[startingIndex++] = value[10]; + array[startingIndex++] = value[11]; + array[startingIndex++] = value[12]; + array[startingIndex++] = value[13]; + array[startingIndex++] = value[14]; + array[startingIndex] = value[15]; + return array; +}; +Matrix4.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Matrix4(); + } + result[0] = array[startingIndex++]; + result[1] = array[startingIndex++]; + result[2] = array[startingIndex++]; + result[3] = array[startingIndex++]; + result[4] = array[startingIndex++]; + result[5] = array[startingIndex++]; + result[6] = array[startingIndex++]; + result[7] = array[startingIndex++]; + result[8] = array[startingIndex++]; + result[9] = array[startingIndex++]; + result[10] = array[startingIndex++]; + result[11] = array[startingIndex++]; + result[12] = array[startingIndex++]; + result[13] = array[startingIndex++]; + result[14] = array[startingIndex++]; + result[15] = array[startingIndex]; + return result; +}; +Matrix4.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 16; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 16 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Matrix4.pack(array[i], result, i * 16); + } + return result; +}; +Matrix4.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 16); + if (array.length % 16 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 16."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 16); + } else { + result.length = length / 16; + } + for (let i = 0; i < length; i += 16) { + const index = i / 16; + result[index] = Matrix4.unpack(array, i, result[index]); + } + return result; +}; +Matrix4.clone = function(matrix, result) { + if (!defined_default(matrix)) { + return void 0; + } + if (!defined_default(result)) { + return new Matrix4( + matrix[0], + matrix[4], + matrix[8], + matrix[12], + matrix[1], + matrix[5], + matrix[9], + matrix[13], + matrix[2], + matrix[6], + matrix[10], + matrix[14], + matrix[3], + matrix[7], + matrix[11], + matrix[15] + ); + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + result[9] = matrix[9]; + result[10] = matrix[10]; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +Matrix4.fromArray = Matrix4.unpack; +Matrix4.fromColumnMajorArray = function(values, result) { + Check_default.defined("values", values); + return Matrix4.clone(values, result); +}; +Matrix4.fromRowMajorArray = function(values, result) { + Check_default.defined("values", values); + if (!defined_default(result)) { + return new Matrix4( + values[0], + values[1], + values[2], + values[3], + values[4], + values[5], + values[6], + values[7], + values[8], + values[9], + values[10], + values[11], + values[12], + values[13], + values[14], + values[15] + ); + } + result[0] = values[0]; + result[1] = values[4]; + result[2] = values[8]; + result[3] = values[12]; + result[4] = values[1]; + result[5] = values[5]; + result[6] = values[9]; + result[7] = values[13]; + result[8] = values[2]; + result[9] = values[6]; + result[10] = values[10]; + result[11] = values[14]; + result[12] = values[3]; + result[13] = values[7]; + result[14] = values[11]; + result[15] = values[15]; + return result; +}; +Matrix4.fromRotationTranslation = function(rotation, translation, result) { + Check_default.typeOf.object("rotation", rotation); + translation = defaultValue_default(translation, Cartesian3_default.ZERO); + if (!defined_default(result)) { + return new Matrix4( + rotation[0], + rotation[3], + rotation[6], + translation.x, + rotation[1], + rotation[4], + rotation[7], + translation.y, + rotation[2], + rotation[5], + rotation[8], + translation.z, + 0, + 0, + 0, + 1 + ); + } + result[0] = rotation[0]; + result[1] = rotation[1]; + result[2] = rotation[2]; + result[3] = 0; + result[4] = rotation[3]; + result[5] = rotation[4]; + result[6] = rotation[5]; + result[7] = 0; + result[8] = rotation[6]; + result[9] = rotation[7]; + result[10] = rotation[8]; + result[11] = 0; + result[12] = translation.x; + result[13] = translation.y; + result[14] = translation.z; + result[15] = 1; + return result; +}; +Matrix4.fromTranslationQuaternionRotationScale = function(translation, rotation, scale, result) { + Check_default.typeOf.object("translation", translation); + Check_default.typeOf.object("rotation", rotation); + Check_default.typeOf.object("scale", scale); + if (!defined_default(result)) { + result = new Matrix4(); + } + const scaleX = scale.x; + const scaleY = scale.y; + const scaleZ = scale.z; + const x2 = rotation.x * rotation.x; + const xy = rotation.x * rotation.y; + const xz = rotation.x * rotation.z; + const xw = rotation.x * rotation.w; + const y2 = rotation.y * rotation.y; + const yz = rotation.y * rotation.z; + const yw = rotation.y * rotation.w; + const z2 = rotation.z * rotation.z; + const zw = rotation.z * rotation.w; + const w2 = rotation.w * rotation.w; + const m00 = x2 - y2 - z2 + w2; + const m01 = 2 * (xy - zw); + const m02 = 2 * (xz + yw); + const m10 = 2 * (xy + zw); + const m11 = -x2 + y2 - z2 + w2; + const m12 = 2 * (yz - xw); + const m20 = 2 * (xz - yw); + const m21 = 2 * (yz + xw); + const m22 = -x2 - y2 + z2 + w2; + result[0] = m00 * scaleX; + result[1] = m10 * scaleX; + result[2] = m20 * scaleX; + result[3] = 0; + result[4] = m01 * scaleY; + result[5] = m11 * scaleY; + result[6] = m21 * scaleY; + result[7] = 0; + result[8] = m02 * scaleZ; + result[9] = m12 * scaleZ; + result[10] = m22 * scaleZ; + result[11] = 0; + result[12] = translation.x; + result[13] = translation.y; + result[14] = translation.z; + result[15] = 1; + return result; +}; +Matrix4.fromTranslationRotationScale = function(translationRotationScale, result) { + Check_default.typeOf.object("translationRotationScale", translationRotationScale); + return Matrix4.fromTranslationQuaternionRotationScale( + translationRotationScale.translation, + translationRotationScale.rotation, + translationRotationScale.scale, + result + ); +}; +Matrix4.fromTranslation = function(translation, result) { + Check_default.typeOf.object("translation", translation); + return Matrix4.fromRotationTranslation(Matrix3_default.IDENTITY, translation, result); +}; +Matrix4.fromScale = function(scale, result) { + Check_default.typeOf.object("scale", scale); + if (!defined_default(result)) { + return new Matrix4( + scale.x, + 0, + 0, + 0, + 0, + scale.y, + 0, + 0, + 0, + 0, + scale.z, + 0, + 0, + 0, + 0, + 1 + ); + } + result[0] = scale.x; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = scale.y; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = scale.z; + result[11] = 0; + result[12] = 0; + result[13] = 0; + result[14] = 0; + result[15] = 1; + return result; +}; +Matrix4.fromUniformScale = function(scale, result) { + Check_default.typeOf.number("scale", scale); + if (!defined_default(result)) { + return new Matrix4( + scale, + 0, + 0, + 0, + 0, + scale, + 0, + 0, + 0, + 0, + scale, + 0, + 0, + 0, + 0, + 1 + ); + } + result[0] = scale; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = scale; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = scale; + result[11] = 0; + result[12] = 0; + result[13] = 0; + result[14] = 0; + result[15] = 1; + return result; +}; +Matrix4.fromRotation = function(rotation, result) { + Check_default.typeOf.object("rotation", rotation); + if (!defined_default(result)) { + result = new Matrix4(); + } + result[0] = rotation[0]; + result[1] = rotation[1]; + result[2] = rotation[2]; + result[3] = 0; + result[4] = rotation[3]; + result[5] = rotation[4]; + result[6] = rotation[5]; + result[7] = 0; + result[8] = rotation[6]; + result[9] = rotation[7]; + result[10] = rotation[8]; + result[11] = 0; + result[12] = 0; + result[13] = 0; + result[14] = 0; + result[15] = 1; + return result; +}; +var fromCameraF = new Cartesian3_default(); +var fromCameraR = new Cartesian3_default(); +var fromCameraU = new Cartesian3_default(); +Matrix4.fromCamera = function(camera, result) { + Check_default.typeOf.object("camera", camera); + const position = camera.position; + const direction = camera.direction; + const up = camera.up; + Check_default.typeOf.object("camera.position", position); + Check_default.typeOf.object("camera.direction", direction); + Check_default.typeOf.object("camera.up", up); + Cartesian3_default.normalize(direction, fromCameraF); + Cartesian3_default.normalize( + Cartesian3_default.cross(fromCameraF, up, fromCameraR), + fromCameraR + ); + Cartesian3_default.normalize( + Cartesian3_default.cross(fromCameraR, fromCameraF, fromCameraU), + fromCameraU + ); + const sX = fromCameraR.x; + const sY = fromCameraR.y; + const sZ = fromCameraR.z; + const fX = fromCameraF.x; + const fY = fromCameraF.y; + const fZ = fromCameraF.z; + const uX = fromCameraU.x; + const uY = fromCameraU.y; + const uZ = fromCameraU.z; + const positionX = position.x; + const positionY = position.y; + const positionZ = position.z; + const t0 = sX * -positionX + sY * -positionY + sZ * -positionZ; + const t1 = uX * -positionX + uY * -positionY + uZ * -positionZ; + const t2 = fX * positionX + fY * positionY + fZ * positionZ; + if (!defined_default(result)) { + return new Matrix4( + sX, + sY, + sZ, + t0, + uX, + uY, + uZ, + t1, + -fX, + -fY, + -fZ, + t2, + 0, + 0, + 0, + 1 + ); + } + result[0] = sX; + result[1] = uX; + result[2] = -fX; + result[3] = 0; + result[4] = sY; + result[5] = uY; + result[6] = -fY; + result[7] = 0; + result[8] = sZ; + result[9] = uZ; + result[10] = -fZ; + result[11] = 0; + result[12] = t0; + result[13] = t1; + result[14] = t2; + result[15] = 1; + return result; +}; +Matrix4.computePerspectiveFieldOfView = function(fovY, aspectRatio, near, far, result) { + Check_default.typeOf.number.greaterThan("fovY", fovY, 0); + Check_default.typeOf.number.lessThan("fovY", fovY, Math.PI); + Check_default.typeOf.number.greaterThan("near", near, 0); + Check_default.typeOf.number.greaterThan("far", far, 0); + Check_default.typeOf.object("result", result); + const bottom = Math.tan(fovY * 0.5); + const column1Row1 = 1 / bottom; + const column0Row0 = column1Row1 / aspectRatio; + const column2Row2 = (far + near) / (near - far); + const column3Row2 = 2 * far * near / (near - far); + result[0] = column0Row0; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = column1Row1; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = column2Row2; + result[11] = -1; + result[12] = 0; + result[13] = 0; + result[14] = column3Row2; + result[15] = 0; + return result; +}; +Matrix4.computeOrthographicOffCenter = function(left, right, bottom, top, near, far, result) { + Check_default.typeOf.number("left", left); + Check_default.typeOf.number("right", right); + Check_default.typeOf.number("bottom", bottom); + Check_default.typeOf.number("top", top); + Check_default.typeOf.number("near", near); + Check_default.typeOf.number("far", far); + Check_default.typeOf.object("result", result); + let a3 = 1 / (right - left); + let b = 1 / (top - bottom); + let c = 1 / (far - near); + const tx = -(right + left) * a3; + const ty = -(top + bottom) * b; + const tz = -(far + near) * c; + a3 *= 2; + b *= 2; + c *= -2; + result[0] = a3; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = b; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = c; + result[11] = 0; + result[12] = tx; + result[13] = ty; + result[14] = tz; + result[15] = 1; + return result; +}; +Matrix4.computePerspectiveOffCenter = function(left, right, bottom, top, near, far, result) { + Check_default.typeOf.number("left", left); + Check_default.typeOf.number("right", right); + Check_default.typeOf.number("bottom", bottom); + Check_default.typeOf.number("top", top); + Check_default.typeOf.number("near", near); + Check_default.typeOf.number("far", far); + Check_default.typeOf.object("result", result); + const column0Row0 = 2 * near / (right - left); + const column1Row1 = 2 * near / (top - bottom); + const column2Row0 = (right + left) / (right - left); + const column2Row1 = (top + bottom) / (top - bottom); + const column2Row2 = -(far + near) / (far - near); + const column2Row3 = -1; + const column3Row2 = -2 * far * near / (far - near); + result[0] = column0Row0; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = column1Row1; + result[6] = 0; + result[7] = 0; + result[8] = column2Row0; + result[9] = column2Row1; + result[10] = column2Row2; + result[11] = column2Row3; + result[12] = 0; + result[13] = 0; + result[14] = column3Row2; + result[15] = 0; + return result; +}; +Matrix4.computeInfinitePerspectiveOffCenter = function(left, right, bottom, top, near, result) { + Check_default.typeOf.number("left", left); + Check_default.typeOf.number("right", right); + Check_default.typeOf.number("bottom", bottom); + Check_default.typeOf.number("top", top); + Check_default.typeOf.number("near", near); + Check_default.typeOf.object("result", result); + const column0Row0 = 2 * near / (right - left); + const column1Row1 = 2 * near / (top - bottom); + const column2Row0 = (right + left) / (right - left); + const column2Row1 = (top + bottom) / (top - bottom); + const column2Row2 = -1; + const column2Row3 = -1; + const column3Row2 = -2 * near; + result[0] = column0Row0; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = column1Row1; + result[6] = 0; + result[7] = 0; + result[8] = column2Row0; + result[9] = column2Row1; + result[10] = column2Row2; + result[11] = column2Row3; + result[12] = 0; + result[13] = 0; + result[14] = column3Row2; + result[15] = 0; + return result; +}; +Matrix4.computeViewportTransformation = function(viewport, nearDepthRange, farDepthRange, result) { + if (!defined_default(result)) { + result = new Matrix4(); + } + viewport = defaultValue_default(viewport, defaultValue_default.EMPTY_OBJECT); + const x = defaultValue_default(viewport.x, 0); + const y = defaultValue_default(viewport.y, 0); + const width = defaultValue_default(viewport.width, 0); + const height = defaultValue_default(viewport.height, 0); + nearDepthRange = defaultValue_default(nearDepthRange, 0); + farDepthRange = defaultValue_default(farDepthRange, 1); + const halfWidth = width * 0.5; + const halfHeight = height * 0.5; + const halfDepth = (farDepthRange - nearDepthRange) * 0.5; + const column0Row0 = halfWidth; + const column1Row1 = halfHeight; + const column2Row2 = halfDepth; + const column3Row0 = x + halfWidth; + const column3Row1 = y + halfHeight; + const column3Row2 = nearDepthRange + halfDepth; + const column3Row3 = 1; + result[0] = column0Row0; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = column1Row1; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = column2Row2; + result[11] = 0; + result[12] = column3Row0; + result[13] = column3Row1; + result[14] = column3Row2; + result[15] = column3Row3; + return result; +}; +Matrix4.computeView = function(position, direction, up, right, result) { + Check_default.typeOf.object("position", position); + Check_default.typeOf.object("direction", direction); + Check_default.typeOf.object("up", up); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = right.x; + result[1] = up.x; + result[2] = -direction.x; + result[3] = 0; + result[4] = right.y; + result[5] = up.y; + result[6] = -direction.y; + result[7] = 0; + result[8] = right.z; + result[9] = up.z; + result[10] = -direction.z; + result[11] = 0; + result[12] = -Cartesian3_default.dot(right, position); + result[13] = -Cartesian3_default.dot(up, position); + result[14] = Cartesian3_default.dot(direction, position); + result[15] = 1; + return result; +}; +Matrix4.toArray = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + if (!defined_default(result)) { + return [ + matrix[0], + matrix[1], + matrix[2], + matrix[3], + matrix[4], + matrix[5], + matrix[6], + matrix[7], + matrix[8], + matrix[9], + matrix[10], + matrix[11], + matrix[12], + matrix[13], + matrix[14], + matrix[15] + ]; + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + result[9] = matrix[9]; + result[10] = matrix[10]; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +Matrix4.getElementIndex = function(column, row) { + Check_default.typeOf.number.greaterThanOrEquals("row", row, 0); + Check_default.typeOf.number.lessThanOrEquals("row", row, 3); + Check_default.typeOf.number.greaterThanOrEquals("column", column, 0); + Check_default.typeOf.number.lessThanOrEquals("column", column, 3); + return column * 4 + row; +}; +Matrix4.getColumn = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 3); + Check_default.typeOf.object("result", result); + const startIndex = index * 4; + const x = matrix[startIndex]; + const y = matrix[startIndex + 1]; + const z = matrix[startIndex + 2]; + const w = matrix[startIndex + 3]; + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Matrix4.setColumn = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 3); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix4.clone(matrix, result); + const startIndex = index * 4; + result[startIndex] = cartesian.x; + result[startIndex + 1] = cartesian.y; + result[startIndex + 2] = cartesian.z; + result[startIndex + 3] = cartesian.w; + return result; +}; +Matrix4.getRow = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 3); + Check_default.typeOf.object("result", result); + const x = matrix[index]; + const y = matrix[index + 4]; + const z = matrix[index + 8]; + const w = matrix[index + 12]; + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Matrix4.setRow = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 3); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix4.clone(matrix, result); + result[index] = cartesian.x; + result[index + 4] = cartesian.y; + result[index + 8] = cartesian.z; + result[index + 12] = cartesian.w; + return result; +}; +Matrix4.setTranslation = function(matrix, translation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("translation", translation); + Check_default.typeOf.object("result", result); + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + result[9] = matrix[9]; + result[10] = matrix[10]; + result[11] = matrix[11]; + result[12] = translation.x; + result[13] = translation.y; + result[14] = translation.z; + result[15] = matrix[15]; + return result; +}; +var scaleScratch1 = new Cartesian3_default(); +Matrix4.setScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix4.getScale(matrix, scaleScratch1); + const scaleRatioX = scale.x / existingScale.x; + const scaleRatioY = scale.y / existingScale.y; + const scaleRatioZ = scale.z / existingScale.z; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioX; + result[3] = matrix[3]; + result[4] = matrix[4] * scaleRatioY; + result[5] = matrix[5] * scaleRatioY; + result[6] = matrix[6] * scaleRatioY; + result[7] = matrix[7]; + result[8] = matrix[8] * scaleRatioZ; + result[9] = matrix[9] * scaleRatioZ; + result[10] = matrix[10] * scaleRatioZ; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +var scaleScratch2 = new Cartesian3_default(); +Matrix4.setUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix4.getScale(matrix, scaleScratch2); + const scaleRatioX = scale / existingScale.x; + const scaleRatioY = scale / existingScale.y; + const scaleRatioZ = scale / existingScale.z; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioX; + result[3] = matrix[3]; + result[4] = matrix[4] * scaleRatioY; + result[5] = matrix[5] * scaleRatioY; + result[6] = matrix[6] * scaleRatioY; + result[7] = matrix[7]; + result[8] = matrix[8] * scaleRatioZ; + result[9] = matrix[9] * scaleRatioZ; + result[10] = matrix[10] * scaleRatioZ; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +var scratchColumn = new Cartesian3_default(); +Matrix4.getScale = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result.x = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn) + ); + result.y = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[4], matrix[5], matrix[6], scratchColumn) + ); + result.z = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[8], matrix[9], matrix[10], scratchColumn) + ); + return result; +}; +var scaleScratch3 = new Cartesian3_default(); +Matrix4.getMaximumScale = function(matrix) { + Matrix4.getScale(matrix, scaleScratch3); + return Cartesian3_default.maximumComponent(scaleScratch3); +}; +var scaleScratch4 = new Cartesian3_default(); +Matrix4.setRotation = function(matrix, rotation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix4.getScale(matrix, scaleScratch4); + result[0] = rotation[0] * scale.x; + result[1] = rotation[1] * scale.x; + result[2] = rotation[2] * scale.x; + result[3] = matrix[3]; + result[4] = rotation[3] * scale.y; + result[5] = rotation[4] * scale.y; + result[6] = rotation[5] * scale.y; + result[7] = matrix[7]; + result[8] = rotation[6] * scale.z; + result[9] = rotation[7] * scale.z; + result[10] = rotation[8] * scale.z; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +var scaleScratch5 = new Cartesian3_default(); +Matrix4.getRotation = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix4.getScale(matrix, scaleScratch5); + result[0] = matrix[0] / scale.x; + result[1] = matrix[1] / scale.x; + result[2] = matrix[2] / scale.x; + result[3] = matrix[4] / scale.y; + result[4] = matrix[5] / scale.y; + result[5] = matrix[6] / scale.y; + result[6] = matrix[8] / scale.z; + result[7] = matrix[9] / scale.z; + result[8] = matrix[10] / scale.z; + return result; +}; +Matrix4.multiply = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const left0 = left[0]; + const left1 = left[1]; + const left2 = left[2]; + const left3 = left[3]; + const left4 = left[4]; + const left5 = left[5]; + const left6 = left[6]; + const left7 = left[7]; + const left8 = left[8]; + const left9 = left[9]; + const left10 = left[10]; + const left11 = left[11]; + const left12 = left[12]; + const left13 = left[13]; + const left14 = left[14]; + const left15 = left[15]; + const right0 = right[0]; + const right1 = right[1]; + const right2 = right[2]; + const right3 = right[3]; + const right4 = right[4]; + const right5 = right[5]; + const right6 = right[6]; + const right7 = right[7]; + const right8 = right[8]; + const right9 = right[9]; + const right10 = right[10]; + const right11 = right[11]; + const right12 = right[12]; + const right13 = right[13]; + const right14 = right[14]; + const right15 = right[15]; + const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2 + left12 * right3; + const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2 + left13 * right3; + const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2 + left14 * right3; + const column0Row3 = left3 * right0 + left7 * right1 + left11 * right2 + left15 * right3; + const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6 + left12 * right7; + const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6 + left13 * right7; + const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6 + left14 * right7; + const column1Row3 = left3 * right4 + left7 * right5 + left11 * right6 + left15 * right7; + const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10 + left12 * right11; + const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10 + left13 * right11; + const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10 + left14 * right11; + const column2Row3 = left3 * right8 + left7 * right9 + left11 * right10 + left15 * right11; + const column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12 * right15; + const column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13 * right15; + const column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14 * right15; + const column3Row3 = left3 * right12 + left7 * right13 + left11 * right14 + left15 * right15; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column0Row2; + result[3] = column0Row3; + result[4] = column1Row0; + result[5] = column1Row1; + result[6] = column1Row2; + result[7] = column1Row3; + result[8] = column2Row0; + result[9] = column2Row1; + result[10] = column2Row2; + result[11] = column2Row3; + result[12] = column3Row0; + result[13] = column3Row1; + result[14] = column3Row2; + result[15] = column3Row3; + return result; +}; +Matrix4.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] + right[0]; + result[1] = left[1] + right[1]; + result[2] = left[2] + right[2]; + result[3] = left[3] + right[3]; + result[4] = left[4] + right[4]; + result[5] = left[5] + right[5]; + result[6] = left[6] + right[6]; + result[7] = left[7] + right[7]; + result[8] = left[8] + right[8]; + result[9] = left[9] + right[9]; + result[10] = left[10] + right[10]; + result[11] = left[11] + right[11]; + result[12] = left[12] + right[12]; + result[13] = left[13] + right[13]; + result[14] = left[14] + right[14]; + result[15] = left[15] + right[15]; + return result; +}; +Matrix4.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] - right[0]; + result[1] = left[1] - right[1]; + result[2] = left[2] - right[2]; + result[3] = left[3] - right[3]; + result[4] = left[4] - right[4]; + result[5] = left[5] - right[5]; + result[6] = left[6] - right[6]; + result[7] = left[7] - right[7]; + result[8] = left[8] - right[8]; + result[9] = left[9] - right[9]; + result[10] = left[10] - right[10]; + result[11] = left[11] - right[11]; + result[12] = left[12] - right[12]; + result[13] = left[13] - right[13]; + result[14] = left[14] - right[14]; + result[15] = left[15] - right[15]; + return result; +}; +Matrix4.multiplyTransformation = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const left0 = left[0]; + const left1 = left[1]; + const left2 = left[2]; + const left4 = left[4]; + const left5 = left[5]; + const left6 = left[6]; + const left8 = left[8]; + const left9 = left[9]; + const left10 = left[10]; + const left12 = left[12]; + const left13 = left[13]; + const left14 = left[14]; + const right0 = right[0]; + const right1 = right[1]; + const right2 = right[2]; + const right4 = right[4]; + const right5 = right[5]; + const right6 = right[6]; + const right8 = right[8]; + const right9 = right[9]; + const right10 = right[10]; + const right12 = right[12]; + const right13 = right[13]; + const right14 = right[14]; + const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2; + const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2; + const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2; + const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6; + const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6; + const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6; + const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10; + const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10; + const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10; + const column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12; + const column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13; + const column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column0Row2; + result[3] = 0; + result[4] = column1Row0; + result[5] = column1Row1; + result[6] = column1Row2; + result[7] = 0; + result[8] = column2Row0; + result[9] = column2Row1; + result[10] = column2Row2; + result[11] = 0; + result[12] = column3Row0; + result[13] = column3Row1; + result[14] = column3Row2; + result[15] = 1; + return result; +}; +Matrix4.multiplyByMatrix3 = function(matrix, rotation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("rotation", rotation); + Check_default.typeOf.object("result", result); + const left0 = matrix[0]; + const left1 = matrix[1]; + const left2 = matrix[2]; + const left4 = matrix[4]; + const left5 = matrix[5]; + const left6 = matrix[6]; + const left8 = matrix[8]; + const left9 = matrix[9]; + const left10 = matrix[10]; + const right0 = rotation[0]; + const right1 = rotation[1]; + const right2 = rotation[2]; + const right4 = rotation[3]; + const right5 = rotation[4]; + const right6 = rotation[5]; + const right8 = rotation[6]; + const right9 = rotation[7]; + const right10 = rotation[8]; + const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2; + const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2; + const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2; + const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6; + const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6; + const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6; + const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10; + const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10; + const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column0Row2; + result[3] = 0; + result[4] = column1Row0; + result[5] = column1Row1; + result[6] = column1Row2; + result[7] = 0; + result[8] = column2Row0; + result[9] = column2Row1; + result[10] = column2Row2; + result[11] = 0; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +Matrix4.multiplyByTranslation = function(matrix, translation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("translation", translation); + Check_default.typeOf.object("result", result); + const x = translation.x; + const y = translation.y; + const z = translation.z; + const tx = x * matrix[0] + y * matrix[4] + z * matrix[8] + matrix[12]; + const ty = x * matrix[1] + y * matrix[5] + z * matrix[9] + matrix[13]; + const tz = x * matrix[2] + y * matrix[6] + z * matrix[10] + matrix[14]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + result[9] = matrix[9]; + result[10] = matrix[10]; + result[11] = matrix[11]; + result[12] = tx; + result[13] = ty; + result[14] = tz; + result[15] = matrix[15]; + return result; +}; +Matrix4.multiplyByScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + const scaleX = scale.x; + const scaleY = scale.y; + const scaleZ = scale.z; + if (scaleX === 1 && scaleY === 1 && scaleZ === 1) { + return Matrix4.clone(matrix, result); + } + result[0] = scaleX * matrix[0]; + result[1] = scaleX * matrix[1]; + result[2] = scaleX * matrix[2]; + result[3] = matrix[3]; + result[4] = scaleY * matrix[4]; + result[5] = scaleY * matrix[5]; + result[6] = scaleY * matrix[6]; + result[7] = matrix[7]; + result[8] = scaleZ * matrix[8]; + result[9] = scaleZ * matrix[9]; + result[10] = scaleZ * matrix[10]; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +Matrix4.multiplyByUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scale; + result[1] = matrix[1] * scale; + result[2] = matrix[2] * scale; + result[3] = matrix[3]; + result[4] = matrix[4] * scale; + result[5] = matrix[5] * scale; + result[6] = matrix[6] * scale; + result[7] = matrix[7]; + result[8] = matrix[8] * scale; + result[9] = matrix[9] * scale; + result[10] = matrix[10] * scale; + result[11] = matrix[11]; + result[12] = matrix[12]; + result[13] = matrix[13]; + result[14] = matrix[14]; + result[15] = matrix[15]; + return result; +}; +Matrix4.multiplyByVector = function(matrix, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const vX = cartesian.x; + const vY = cartesian.y; + const vZ = cartesian.z; + const vW = cartesian.w; + const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12] * vW; + const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13] * vW; + const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14] * vW; + const w = matrix[3] * vX + matrix[7] * vY + matrix[11] * vZ + matrix[15] * vW; + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Matrix4.multiplyByPointAsVector = function(matrix, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const vX = cartesian.x; + const vY = cartesian.y; + const vZ = cartesian.z; + const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ; + const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ; + const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Matrix4.multiplyByPoint = function(matrix, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const vX = cartesian.x; + const vY = cartesian.y; + const vZ = cartesian.z; + const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12]; + const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13]; + const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14]; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Matrix4.multiplyByScalar = function(matrix, scalar, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scalar; + result[1] = matrix[1] * scalar; + result[2] = matrix[2] * scalar; + result[3] = matrix[3] * scalar; + result[4] = matrix[4] * scalar; + result[5] = matrix[5] * scalar; + result[6] = matrix[6] * scalar; + result[7] = matrix[7] * scalar; + result[8] = matrix[8] * scalar; + result[9] = matrix[9] * scalar; + result[10] = matrix[10] * scalar; + result[11] = matrix[11] * scalar; + result[12] = matrix[12] * scalar; + result[13] = matrix[13] * scalar; + result[14] = matrix[14] * scalar; + result[15] = matrix[15] * scalar; + return result; +}; +Matrix4.negate = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = -matrix[0]; + result[1] = -matrix[1]; + result[2] = -matrix[2]; + result[3] = -matrix[3]; + result[4] = -matrix[4]; + result[5] = -matrix[5]; + result[6] = -matrix[6]; + result[7] = -matrix[7]; + result[8] = -matrix[8]; + result[9] = -matrix[9]; + result[10] = -matrix[10]; + result[11] = -matrix[11]; + result[12] = -matrix[12]; + result[13] = -matrix[13]; + result[14] = -matrix[14]; + result[15] = -matrix[15]; + return result; +}; +Matrix4.transpose = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const matrix1 = matrix[1]; + const matrix2 = matrix[2]; + const matrix3 = matrix[3]; + const matrix6 = matrix[6]; + const matrix7 = matrix[7]; + const matrix11 = matrix[11]; + result[0] = matrix[0]; + result[1] = matrix[4]; + result[2] = matrix[8]; + result[3] = matrix[12]; + result[4] = matrix1; + result[5] = matrix[5]; + result[6] = matrix[9]; + result[7] = matrix[13]; + result[8] = matrix2; + result[9] = matrix6; + result[10] = matrix[10]; + result[11] = matrix[14]; + result[12] = matrix3; + result[13] = matrix7; + result[14] = matrix11; + result[15] = matrix[15]; + return result; +}; +Matrix4.abs = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = Math.abs(matrix[0]); + result[1] = Math.abs(matrix[1]); + result[2] = Math.abs(matrix[2]); + result[3] = Math.abs(matrix[3]); + result[4] = Math.abs(matrix[4]); + result[5] = Math.abs(matrix[5]); + result[6] = Math.abs(matrix[6]); + result[7] = Math.abs(matrix[7]); + result[8] = Math.abs(matrix[8]); + result[9] = Math.abs(matrix[9]); + result[10] = Math.abs(matrix[10]); + result[11] = Math.abs(matrix[11]); + result[12] = Math.abs(matrix[12]); + result[13] = Math.abs(matrix[13]); + result[14] = Math.abs(matrix[14]); + result[15] = Math.abs(matrix[15]); + return result; +}; +Matrix4.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && // Translation + left[12] === right[12] && left[13] === right[13] && left[14] === right[14] && // Rotation/scale + left[0] === right[0] && left[1] === right[1] && left[2] === right[2] && left[4] === right[4] && left[5] === right[5] && left[6] === right[6] && left[8] === right[8] && left[9] === right[9] && left[10] === right[10] && // Bottom row + left[3] === right[3] && left[7] === right[7] && left[11] === right[11] && left[15] === right[15]; +}; +Matrix4.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left[0] - right[0]) <= epsilon && Math.abs(left[1] - right[1]) <= epsilon && Math.abs(left[2] - right[2]) <= epsilon && Math.abs(left[3] - right[3]) <= epsilon && Math.abs(left[4] - right[4]) <= epsilon && Math.abs(left[5] - right[5]) <= epsilon && Math.abs(left[6] - right[6]) <= epsilon && Math.abs(left[7] - right[7]) <= epsilon && Math.abs(left[8] - right[8]) <= epsilon && Math.abs(left[9] - right[9]) <= epsilon && Math.abs(left[10] - right[10]) <= epsilon && Math.abs(left[11] - right[11]) <= epsilon && Math.abs(left[12] - right[12]) <= epsilon && Math.abs(left[13] - right[13]) <= epsilon && Math.abs(left[14] - right[14]) <= epsilon && Math.abs(left[15] - right[15]) <= epsilon; +}; +Matrix4.getTranslation = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result.x = matrix[12]; + result.y = matrix[13]; + result.z = matrix[14]; + return result; +}; +Matrix4.getMatrix3 = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[4]; + result[4] = matrix[5]; + result[5] = matrix[6]; + result[6] = matrix[8]; + result[7] = matrix[9]; + result[8] = matrix[10]; + return result; +}; +var scratchInverseRotation = new Matrix3_default(); +var scratchMatrix3Zero = new Matrix3_default(); +var scratchBottomRow = new Cartesian4_default(); +var scratchExpectedBottomRow = new Cartesian4_default(0, 0, 0, 1); +Matrix4.inverse = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const src0 = matrix[0]; + const src1 = matrix[4]; + const src2 = matrix[8]; + const src3 = matrix[12]; + const src4 = matrix[1]; + const src5 = matrix[5]; + const src6 = matrix[9]; + const src7 = matrix[13]; + const src8 = matrix[2]; + const src9 = matrix[6]; + const src10 = matrix[10]; + const src11 = matrix[14]; + const src12 = matrix[3]; + const src13 = matrix[7]; + const src14 = matrix[11]; + const src15 = matrix[15]; + let tmp0 = src10 * src15; + let tmp1 = src11 * src14; + let tmp2 = src9 * src15; + let tmp3 = src11 * src13; + let tmp4 = src9 * src14; + let tmp5 = src10 * src13; + let tmp6 = src8 * src15; + let tmp7 = src11 * src12; + let tmp8 = src8 * src14; + let tmp9 = src10 * src12; + let tmp10 = src8 * src13; + let tmp11 = src9 * src12; + const dst0 = tmp0 * src5 + tmp3 * src6 + tmp4 * src7 - (tmp1 * src5 + tmp2 * src6 + tmp5 * src7); + const dst1 = tmp1 * src4 + tmp6 * src6 + tmp9 * src7 - (tmp0 * src4 + tmp7 * src6 + tmp8 * src7); + const dst2 = tmp2 * src4 + tmp7 * src5 + tmp10 * src7 - (tmp3 * src4 + tmp6 * src5 + tmp11 * src7); + const dst3 = tmp5 * src4 + tmp8 * src5 + tmp11 * src6 - (tmp4 * src4 + tmp9 * src5 + tmp10 * src6); + const dst4 = tmp1 * src1 + tmp2 * src2 + tmp5 * src3 - (tmp0 * src1 + tmp3 * src2 + tmp4 * src3); + const dst5 = tmp0 * src0 + tmp7 * src2 + tmp8 * src3 - (tmp1 * src0 + tmp6 * src2 + tmp9 * src3); + const dst6 = tmp3 * src0 + tmp6 * src1 + tmp11 * src3 - (tmp2 * src0 + tmp7 * src1 + tmp10 * src3); + const dst7 = tmp4 * src0 + tmp9 * src1 + tmp10 * src2 - (tmp5 * src0 + tmp8 * src1 + tmp11 * src2); + tmp0 = src2 * src7; + tmp1 = src3 * src6; + tmp2 = src1 * src7; + tmp3 = src3 * src5; + tmp4 = src1 * src6; + tmp5 = src2 * src5; + tmp6 = src0 * src7; + tmp7 = src3 * src4; + tmp8 = src0 * src6; + tmp9 = src2 * src4; + tmp10 = src0 * src5; + tmp11 = src1 * src4; + const dst8 = tmp0 * src13 + tmp3 * src14 + tmp4 * src15 - (tmp1 * src13 + tmp2 * src14 + tmp5 * src15); + const dst9 = tmp1 * src12 + tmp6 * src14 + tmp9 * src15 - (tmp0 * src12 + tmp7 * src14 + tmp8 * src15); + const dst10 = tmp2 * src12 + tmp7 * src13 + tmp10 * src15 - (tmp3 * src12 + tmp6 * src13 + tmp11 * src15); + const dst11 = tmp5 * src12 + tmp8 * src13 + tmp11 * src14 - (tmp4 * src12 + tmp9 * src13 + tmp10 * src14); + const dst12 = tmp2 * src10 + tmp5 * src11 + tmp1 * src9 - (tmp4 * src11 + tmp0 * src9 + tmp3 * src10); + const dst13 = tmp8 * src11 + tmp0 * src8 + tmp7 * src10 - (tmp6 * src10 + tmp9 * src11 + tmp1 * src8); + const dst14 = tmp6 * src9 + tmp11 * src11 + tmp3 * src8 - (tmp10 * src11 + tmp2 * src8 + tmp7 * src9); + const dst15 = tmp10 * src10 + tmp4 * src8 + tmp9 * src9 - (tmp8 * src9 + tmp11 * src10 + tmp5 * src8); + let det = src0 * dst0 + src1 * dst1 + src2 * dst2 + src3 * dst3; + if (Math.abs(det) < Math_default.EPSILON21) { + if (Matrix3_default.equalsEpsilon( + Matrix4.getMatrix3(matrix, scratchInverseRotation), + scratchMatrix3Zero, + Math_default.EPSILON7 + ) && Cartesian4_default.equals( + Matrix4.getRow(matrix, 3, scratchBottomRow), + scratchExpectedBottomRow + )) { + result[0] = 0; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = 0; + result[5] = 0; + result[6] = 0; + result[7] = 0; + result[8] = 0; + result[9] = 0; + result[10] = 0; + result[11] = 0; + result[12] = -matrix[12]; + result[13] = -matrix[13]; + result[14] = -matrix[14]; + result[15] = 1; + return result; + } + throw new RuntimeError_default( + "matrix is not invertible because its determinate is zero." + ); + } + det = 1 / det; + result[0] = dst0 * det; + result[1] = dst1 * det; + result[2] = dst2 * det; + result[3] = dst3 * det; + result[4] = dst4 * det; + result[5] = dst5 * det; + result[6] = dst6 * det; + result[7] = dst7 * det; + result[8] = dst8 * det; + result[9] = dst9 * det; + result[10] = dst10 * det; + result[11] = dst11 * det; + result[12] = dst12 * det; + result[13] = dst13 * det; + result[14] = dst14 * det; + result[15] = dst15 * det; + return result; +}; +Matrix4.inverseTransformation = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const matrix0 = matrix[0]; + const matrix1 = matrix[1]; + const matrix2 = matrix[2]; + const matrix4 = matrix[4]; + const matrix5 = matrix[5]; + const matrix6 = matrix[6]; + const matrix8 = matrix[8]; + const matrix9 = matrix[9]; + const matrix10 = matrix[10]; + const vX = matrix[12]; + const vY = matrix[13]; + const vZ = matrix[14]; + const x = -matrix0 * vX - matrix1 * vY - matrix2 * vZ; + const y = -matrix4 * vX - matrix5 * vY - matrix6 * vZ; + const z = -matrix8 * vX - matrix9 * vY - matrix10 * vZ; + result[0] = matrix0; + result[1] = matrix4; + result[2] = matrix8; + result[3] = 0; + result[4] = matrix1; + result[5] = matrix5; + result[6] = matrix9; + result[7] = 0; + result[8] = matrix2; + result[9] = matrix6; + result[10] = matrix10; + result[11] = 0; + result[12] = x; + result[13] = y; + result[14] = z; + result[15] = 1; + return result; +}; +var scratchTransposeMatrix = new Matrix4(); +Matrix4.inverseTranspose = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + return Matrix4.inverse( + Matrix4.transpose(matrix, scratchTransposeMatrix), + result + ); +}; +Matrix4.IDENTITY = Object.freeze( + new Matrix4( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ) +); +Matrix4.ZERO = Object.freeze( + new Matrix4( + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ) +); +Matrix4.COLUMN0ROW0 = 0; +Matrix4.COLUMN0ROW1 = 1; +Matrix4.COLUMN0ROW2 = 2; +Matrix4.COLUMN0ROW3 = 3; +Matrix4.COLUMN1ROW0 = 4; +Matrix4.COLUMN1ROW1 = 5; +Matrix4.COLUMN1ROW2 = 6; +Matrix4.COLUMN1ROW3 = 7; +Matrix4.COLUMN2ROW0 = 8; +Matrix4.COLUMN2ROW1 = 9; +Matrix4.COLUMN2ROW2 = 10; +Matrix4.COLUMN2ROW3 = 11; +Matrix4.COLUMN3ROW0 = 12; +Matrix4.COLUMN3ROW1 = 13; +Matrix4.COLUMN3ROW2 = 14; +Matrix4.COLUMN3ROW3 = 15; +Object.defineProperties(Matrix4.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix4.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix4.packedLength; + } + } +}); +Matrix4.prototype.clone = function(result) { + return Matrix4.clone(this, result); +}; +Matrix4.prototype.equals = function(right) { + return Matrix4.equals(this, right); +}; +Matrix4.equalsArray = function(matrix, array, offset) { + return matrix[0] === array[offset] && matrix[1] === array[offset + 1] && matrix[2] === array[offset + 2] && matrix[3] === array[offset + 3] && matrix[4] === array[offset + 4] && matrix[5] === array[offset + 5] && matrix[6] === array[offset + 6] && matrix[7] === array[offset + 7] && matrix[8] === array[offset + 8] && matrix[9] === array[offset + 9] && matrix[10] === array[offset + 10] && matrix[11] === array[offset + 11] && matrix[12] === array[offset + 12] && matrix[13] === array[offset + 13] && matrix[14] === array[offset + 14] && matrix[15] === array[offset + 15]; +}; +Matrix4.prototype.equalsEpsilon = function(right, epsilon) { + return Matrix4.equalsEpsilon(this, right, epsilon); +}; +Matrix4.prototype.toString = function() { + return `(${this[0]}, ${this[4]}, ${this[8]}, ${this[12]}) +(${this[1]}, ${this[5]}, ${this[9]}, ${this[13]}) +(${this[2]}, ${this[6]}, ${this[10]}, ${this[14]}) +(${this[3]}, ${this[7]}, ${this[11]}, ${this[15]})`; +}; +var Matrix4_default = Matrix4; + +// packages/engine/Source/Core/combine.js +function combine(object1, object2, deep) { + deep = defaultValue_default(deep, false); + const result = {}; + const object1Defined = defined_default(object1); + const object2Defined = defined_default(object2); + let property; + let object1Value; + let object2Value; + if (object1Defined) { + for (property in object1) { + if (object1.hasOwnProperty(property)) { + object1Value = object1[property]; + if (object2Defined && deep && typeof object1Value === "object" && object2.hasOwnProperty(property)) { + object2Value = object2[property]; + if (typeof object2Value === "object") { + result[property] = combine(object1Value, object2Value, deep); + } else { + result[property] = object1Value; + } + } else { + result[property] = object1Value; + } + } + } + } + if (object2Defined) { + for (property in object2) { + if (object2.hasOwnProperty(property) && !result.hasOwnProperty(property)) { + object2Value = object2[property]; + result[property] = object2Value; + } + } + } + return result; +} +var combine_default = combine; + +// packages/engine/Source/Core/binarySearch.js +function binarySearch(array, itemToFind, comparator) { + Check_default.defined("array", array); + Check_default.defined("itemToFind", itemToFind); + Check_default.defined("comparator", comparator); + let low = 0; + let high = array.length - 1; + let i; + let comparison; + while (low <= high) { + i = ~~((low + high) / 2); + comparison = comparator(array[i], itemToFind); + if (comparison < 0) { + low = i + 1; + continue; + } + if (comparison > 0) { + high = i - 1; + continue; + } + return i; + } + return ~(high + 1); +} +var binarySearch_default = binarySearch; + +// packages/engine/Source/Core/EarthOrientationParametersSample.js +function EarthOrientationParametersSample(xPoleWander, yPoleWander, xPoleOffset, yPoleOffset, ut1MinusUtc) { + this.xPoleWander = xPoleWander; + this.yPoleWander = yPoleWander; + this.xPoleOffset = xPoleOffset; + this.yPoleOffset = yPoleOffset; + this.ut1MinusUtc = ut1MinusUtc; +} +var EarthOrientationParametersSample_default = EarthOrientationParametersSample; + +// packages/engine/Source/Core/isLeapYear.js +function isLeapYear(year) { + if (year === null || isNaN(year)) { + throw new DeveloperError_default("year is required and must be a number."); + } + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; +} +var isLeapYear_default = isLeapYear; + +// packages/engine/Source/Core/GregorianDate.js +var daysInYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +function GregorianDate(year, month, day, hour, minute, second, millisecond, isLeapSecond) { + const minimumYear = 1; + const minimumMonth = 1; + const minimumDay = 1; + const minimumHour = 0; + const minimumMinute = 0; + const minimumSecond = 0; + const minimumMillisecond = 0; + year = defaultValue_default(year, minimumYear); + month = defaultValue_default(month, minimumMonth); + day = defaultValue_default(day, minimumDay); + hour = defaultValue_default(hour, minimumHour); + minute = defaultValue_default(minute, minimumMinute); + second = defaultValue_default(second, minimumSecond); + millisecond = defaultValue_default(millisecond, minimumMillisecond); + isLeapSecond = defaultValue_default(isLeapSecond, false); + validateRange(); + validateDate(); + this.year = year; + this.month = month; + this.day = day; + this.hour = hour; + this.minute = minute; + this.second = second; + this.millisecond = millisecond; + this.isLeapSecond = isLeapSecond; + function validateRange() { + const maximumYear = 9999; + const maximumMonth = 12; + const maximumDay = 31; + const maximumHour = 23; + const maximumMinute = 59; + const maximumSecond = 59; + const excludedMaximumMilisecond = 1e3; + Check_default.typeOf.number.greaterThanOrEquals("Year", year, minimumYear); + Check_default.typeOf.number.lessThanOrEquals("Year", year, maximumYear); + Check_default.typeOf.number.greaterThanOrEquals("Month", month, minimumMonth); + Check_default.typeOf.number.lessThanOrEquals("Month", month, maximumMonth); + Check_default.typeOf.number.greaterThanOrEquals("Day", day, minimumDay); + Check_default.typeOf.number.lessThanOrEquals("Day", day, maximumDay); + Check_default.typeOf.number.greaterThanOrEquals("Hour", hour, minimumHour); + Check_default.typeOf.number.lessThanOrEquals("Hour", hour, maximumHour); + Check_default.typeOf.number.greaterThanOrEquals("Minute", minute, minimumMinute); + Check_default.typeOf.number.lessThanOrEquals("Minute", minute, maximumMinute); + Check_default.typeOf.bool("IsLeapSecond", isLeapSecond); + Check_default.typeOf.number.greaterThanOrEquals("Second", second, minimumSecond); + Check_default.typeOf.number.lessThanOrEquals( + "Second", + second, + isLeapSecond ? maximumSecond + 1 : maximumSecond + ); + Check_default.typeOf.number.greaterThanOrEquals( + "Millisecond", + millisecond, + minimumMillisecond + ); + Check_default.typeOf.number.lessThan( + "Millisecond", + millisecond, + excludedMaximumMilisecond + ); + } + function validateDate() { + const daysInMonth2 = month === 2 && isLeapYear_default(year) ? daysInYear[month - 1] + 1 : daysInYear[month - 1]; + if (day > daysInMonth2) { + throw new DeveloperError_default("Month and Day represents invalid date"); + } + } +} +var GregorianDate_default = GregorianDate; + +// packages/engine/Source/Core/LeapSecond.js +function LeapSecond(date, offset) { + this.julianDate = date; + this.offset = offset; +} +var LeapSecond_default = LeapSecond; + +// packages/engine/Source/Core/TimeConstants.js +var TimeConstants = { + /** + * The number of seconds in one millisecond: 0.001 + * @type {number} + * @constant + */ + SECONDS_PER_MILLISECOND: 1e-3, + /** + * The number of seconds in one minute: 60. + * @type {number} + * @constant + */ + SECONDS_PER_MINUTE: 60, + /** + * The number of minutes in one hour: 60. + * @type {number} + * @constant + */ + MINUTES_PER_HOUR: 60, + /** + * The number of hours in one day: 24. + * @type {number} + * @constant + */ + HOURS_PER_DAY: 24, + /** + * The number of seconds in one hour: 3600. + * @type {number} + * @constant + */ + SECONDS_PER_HOUR: 3600, + /** + * The number of minutes in one day: 1440. + * @type {number} + * @constant + */ + MINUTES_PER_DAY: 1440, + /** + * The number of seconds in one day, ignoring leap seconds: 86400. + * @type {number} + * @constant + */ + SECONDS_PER_DAY: 86400, + /** + * The number of days in one Julian century: 36525. + * @type {number} + * @constant + */ + DAYS_PER_JULIAN_CENTURY: 36525, + /** + * One trillionth of a second. + * @type {number} + * @constant + */ + PICOSECOND: 1e-9, + /** + * The number of days to subtract from a Julian date to determine the + * modified Julian date, which gives the number of days since midnight + * on November 17, 1858. + * @type {number} + * @constant + */ + MODIFIED_JULIAN_DATE_DIFFERENCE: 24000005e-1 +}; +var TimeConstants_default = Object.freeze(TimeConstants); + +// packages/engine/Source/Core/TimeStandard.js +var TimeStandard = { + /** + * Represents the coordinated Universal Time (UTC) time standard. + * + * UTC is related to TAI according to the relationship + * UTC = TAI - deltaT where deltaT is the number of leap + * seconds which have been introduced as of the time in TAI. + * + * @type {number} + * @constant + */ + UTC: 0, + /** + * Represents the International Atomic Time (TAI) time standard. + * TAI is the principal time standard to which the other time standards are related. + * + * @type {number} + * @constant + */ + TAI: 1 +}; +var TimeStandard_default = Object.freeze(TimeStandard); + +// packages/engine/Source/Core/JulianDate.js +var gregorianDateScratch = new GregorianDate_default(); +var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +var daysInLeapFeburary = 29; +function compareLeapSecondDates(leapSecond, dateToFind) { + return JulianDate.compare(leapSecond.julianDate, dateToFind.julianDate); +} +var binarySearchScratchLeapSecond = new LeapSecond_default(); +function convertUtcToTai(julianDate) { + binarySearchScratchLeapSecond.julianDate = julianDate; + const leapSeconds = JulianDate.leapSeconds; + let index = binarySearch_default( + leapSeconds, + binarySearchScratchLeapSecond, + compareLeapSecondDates + ); + if (index < 0) { + index = ~index; + } + if (index >= leapSeconds.length) { + index = leapSeconds.length - 1; + } + let offset = leapSeconds[index].offset; + if (index > 0) { + const difference = JulianDate.secondsDifference( + leapSeconds[index].julianDate, + julianDate + ); + if (difference > offset) { + index--; + offset = leapSeconds[index].offset; + } + } + JulianDate.addSeconds(julianDate, offset, julianDate); +} +function convertTaiToUtc(julianDate, result) { + binarySearchScratchLeapSecond.julianDate = julianDate; + const leapSeconds = JulianDate.leapSeconds; + let index = binarySearch_default( + leapSeconds, + binarySearchScratchLeapSecond, + compareLeapSecondDates + ); + if (index < 0) { + index = ~index; + } + if (index === 0) { + return JulianDate.addSeconds(julianDate, -leapSeconds[0].offset, result); + } + if (index >= leapSeconds.length) { + return JulianDate.addSeconds( + julianDate, + -leapSeconds[index - 1].offset, + result + ); + } + const difference = JulianDate.secondsDifference( + leapSeconds[index].julianDate, + julianDate + ); + if (difference === 0) { + return JulianDate.addSeconds( + julianDate, + -leapSeconds[index].offset, + result + ); + } + if (difference <= 1) { + return void 0; + } + return JulianDate.addSeconds( + julianDate, + -leapSeconds[--index].offset, + result + ); +} +function setComponents(wholeDays, secondsOfDay, julianDate) { + const extraDays = secondsOfDay / TimeConstants_default.SECONDS_PER_DAY | 0; + wholeDays += extraDays; + secondsOfDay -= TimeConstants_default.SECONDS_PER_DAY * extraDays; + if (secondsOfDay < 0) { + wholeDays--; + secondsOfDay += TimeConstants_default.SECONDS_PER_DAY; + } + julianDate.dayNumber = wholeDays; + julianDate.secondsOfDay = secondsOfDay; + return julianDate; +} +function computeJulianDateComponents(year, month, day, hour, minute, second, millisecond) { + const a3 = (month - 14) / 12 | 0; + const b = year + 4800 + a3; + let dayNumber = (1461 * b / 4 | 0) + (367 * (month - 2 - 12 * a3) / 12 | 0) - (3 * ((b + 100) / 100 | 0) / 4 | 0) + day - 32075; + hour = hour - 12; + if (hour < 0) { + hour += 24; + } + const secondsOfDay = second + (hour * TimeConstants_default.SECONDS_PER_HOUR + minute * TimeConstants_default.SECONDS_PER_MINUTE + millisecond * TimeConstants_default.SECONDS_PER_MILLISECOND); + if (secondsOfDay >= 43200) { + dayNumber -= 1; + } + return [dayNumber, secondsOfDay]; +} +var matchCalendarYear = /^(\d{4})$/; +var matchCalendarMonth = /^(\d{4})-(\d{2})$/; +var matchOrdinalDate = /^(\d{4})-?(\d{3})$/; +var matchWeekDate = /^(\d{4})-?W(\d{2})-?(\d{1})?$/; +var matchCalendarDate = /^(\d{4})-?(\d{2})-?(\d{2})$/; +var utcOffset = /([Z+\-])?(\d{2})?:?(\d{2})?$/; +var matchHours = /^(\d{2})(\.\d+)?/.source + utcOffset.source; +var matchHoursMinutes = /^(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source; +var matchHoursMinutesSeconds = /^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source; +var iso8601ErrorMessage = "Invalid ISO 8601 date."; +function JulianDate(julianDayNumber, secondsOfDay, timeStandard) { + this.dayNumber = void 0; + this.secondsOfDay = void 0; + julianDayNumber = defaultValue_default(julianDayNumber, 0); + secondsOfDay = defaultValue_default(secondsOfDay, 0); + timeStandard = defaultValue_default(timeStandard, TimeStandard_default.UTC); + const wholeDays = julianDayNumber | 0; + secondsOfDay = secondsOfDay + (julianDayNumber - wholeDays) * TimeConstants_default.SECONDS_PER_DAY; + setComponents(wholeDays, secondsOfDay, this); + if (timeStandard === TimeStandard_default.UTC) { + convertUtcToTai(this); + } +} +JulianDate.fromGregorianDate = function(date, result) { + if (!(date instanceof GregorianDate_default)) { + throw new DeveloperError_default("date must be a valid GregorianDate."); + } + const components = computeJulianDateComponents( + date.year, + date.month, + date.day, + date.hour, + date.minute, + date.second, + date.millisecond + ); + if (!defined_default(result)) { + return new JulianDate(components[0], components[1], TimeStandard_default.UTC); + } + setComponents(components[0], components[1], result); + convertUtcToTai(result); + return result; +}; +JulianDate.fromDate = function(date, result) { + if (!(date instanceof Date) || isNaN(date.getTime())) { + throw new DeveloperError_default("date must be a valid JavaScript Date."); + } + const components = computeJulianDateComponents( + date.getUTCFullYear(), + date.getUTCMonth() + 1, + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + date.getUTCMilliseconds() + ); + if (!defined_default(result)) { + return new JulianDate(components[0], components[1], TimeStandard_default.UTC); + } + setComponents(components[0], components[1], result); + convertUtcToTai(result); + return result; +}; +JulianDate.fromIso8601 = function(iso8601String, result) { + if (typeof iso8601String !== "string") { + throw new DeveloperError_default(iso8601ErrorMessage); + } + iso8601String = iso8601String.replace(",", "."); + let tokens = iso8601String.split("T"); + let year; + let month = 1; + let day = 1; + let hour = 0; + let minute = 0; + let second = 0; + let millisecond = 0; + const date = tokens[0]; + const time = tokens[1]; + let tmp; + let inLeapYear; + if (!defined_default(date)) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + let dashCount; + tokens = date.match(matchCalendarDate); + if (tokens !== null) { + dashCount = date.split("-").length - 1; + if (dashCount > 0 && dashCount !== 2) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + year = +tokens[1]; + month = +tokens[2]; + day = +tokens[3]; + } else { + tokens = date.match(matchCalendarMonth); + if (tokens !== null) { + year = +tokens[1]; + month = +tokens[2]; + } else { + tokens = date.match(matchCalendarYear); + if (tokens !== null) { + year = +tokens[1]; + } else { + let dayOfYear; + tokens = date.match(matchOrdinalDate); + if (tokens !== null) { + year = +tokens[1]; + dayOfYear = +tokens[2]; + inLeapYear = isLeapYear_default(year); + if (dayOfYear < 1 || inLeapYear && dayOfYear > 366 || !inLeapYear && dayOfYear > 365) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + } else { + tokens = date.match(matchWeekDate); + if (tokens !== null) { + year = +tokens[1]; + const weekNumber = +tokens[2]; + const dayOfWeek = +tokens[3] || 0; + dashCount = date.split("-").length - 1; + if (dashCount > 0 && (!defined_default(tokens[3]) && dashCount !== 1 || defined_default(tokens[3]) && dashCount !== 2)) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + const january4 = new Date(Date.UTC(year, 0, 4)); + dayOfYear = weekNumber * 7 + dayOfWeek - january4.getUTCDay() - 3; + } else { + throw new DeveloperError_default(iso8601ErrorMessage); + } + } + tmp = new Date(Date.UTC(year, 0, 1)); + tmp.setUTCDate(dayOfYear); + month = tmp.getUTCMonth() + 1; + day = tmp.getUTCDate(); + } + } + } + inLeapYear = isLeapYear_default(year); + if (month < 1 || month > 12 || day < 1 || (month !== 2 || !inLeapYear) && day > daysInMonth[month - 1] || inLeapYear && month === 2 && day > daysInLeapFeburary) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + let offsetIndex; + if (defined_default(time)) { + tokens = time.match(matchHoursMinutesSeconds); + if (tokens !== null) { + dashCount = time.split(":").length - 1; + if (dashCount > 0 && dashCount !== 2 && dashCount !== 3) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + hour = +tokens[1]; + minute = +tokens[2]; + second = +tokens[3]; + millisecond = +(tokens[4] || 0) * 1e3; + offsetIndex = 5; + } else { + tokens = time.match(matchHoursMinutes); + if (tokens !== null) { + dashCount = time.split(":").length - 1; + if (dashCount > 2) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + hour = +tokens[1]; + minute = +tokens[2]; + second = +(tokens[3] || 0) * 60; + offsetIndex = 4; + } else { + tokens = time.match(matchHours); + if (tokens !== null) { + hour = +tokens[1]; + minute = +(tokens[2] || 0) * 60; + offsetIndex = 3; + } else { + throw new DeveloperError_default(iso8601ErrorMessage); + } + } + } + if (minute >= 60 || second >= 61 || hour > 24 || hour === 24 && (minute > 0 || second > 0 || millisecond > 0)) { + throw new DeveloperError_default(iso8601ErrorMessage); + } + const offset = tokens[offsetIndex]; + const offsetHours = +tokens[offsetIndex + 1]; + const offsetMinutes = +(tokens[offsetIndex + 2] || 0); + switch (offset) { + case "+": + hour = hour - offsetHours; + minute = minute - offsetMinutes; + break; + case "-": + hour = hour + offsetHours; + minute = minute + offsetMinutes; + break; + case "Z": + break; + default: + minute = minute + new Date( + Date.UTC(year, month - 1, day, hour, minute) + ).getTimezoneOffset(); + break; + } + } + const isLeapSecond = second === 60; + if (isLeapSecond) { + second--; + } + while (minute >= 60) { + minute -= 60; + hour++; + } + while (hour >= 24) { + hour -= 24; + day++; + } + tmp = inLeapYear && month === 2 ? daysInLeapFeburary : daysInMonth[month - 1]; + while (day > tmp) { + day -= tmp; + month++; + if (month > 12) { + month -= 12; + year++; + } + tmp = inLeapYear && month === 2 ? daysInLeapFeburary : daysInMonth[month - 1]; + } + while (minute < 0) { + minute += 60; + hour--; + } + while (hour < 0) { + hour += 24; + day--; + } + while (day < 1) { + month--; + if (month < 1) { + month += 12; + year--; + } + tmp = inLeapYear && month === 2 ? daysInLeapFeburary : daysInMonth[month - 1]; + day += tmp; + } + const components = computeJulianDateComponents( + year, + month, + day, + hour, + minute, + second, + millisecond + ); + if (!defined_default(result)) { + result = new JulianDate(components[0], components[1], TimeStandard_default.UTC); + } else { + setComponents(components[0], components[1], result); + convertUtcToTai(result); + } + if (isLeapSecond) { + JulianDate.addSeconds(result, 1, result); + } + return result; +}; +JulianDate.now = function(result) { + return JulianDate.fromDate(/* @__PURE__ */ new Date(), result); +}; +var toGregorianDateScratch = new JulianDate(0, 0, TimeStandard_default.TAI); +JulianDate.toGregorianDate = function(julianDate, result) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + let isLeapSecond = false; + let thisUtc = convertTaiToUtc(julianDate, toGregorianDateScratch); + if (!defined_default(thisUtc)) { + JulianDate.addSeconds(julianDate, -1, toGregorianDateScratch); + thisUtc = convertTaiToUtc(toGregorianDateScratch, toGregorianDateScratch); + isLeapSecond = true; + } + let julianDayNumber = thisUtc.dayNumber; + const secondsOfDay = thisUtc.secondsOfDay; + if (secondsOfDay >= 43200) { + julianDayNumber += 1; + } + let L = julianDayNumber + 68569 | 0; + const N = 4 * L / 146097 | 0; + L = L - ((146097 * N + 3) / 4 | 0) | 0; + const I = 4e3 * (L + 1) / 1461001 | 0; + L = L - (1461 * I / 4 | 0) + 31 | 0; + const J = 80 * L / 2447 | 0; + const day = L - (2447 * J / 80 | 0) | 0; + L = J / 11 | 0; + const month = J + 2 - 12 * L | 0; + const year = 100 * (N - 49) + I + L | 0; + let hour = secondsOfDay / TimeConstants_default.SECONDS_PER_HOUR | 0; + let remainingSeconds = secondsOfDay - hour * TimeConstants_default.SECONDS_PER_HOUR; + const minute = remainingSeconds / TimeConstants_default.SECONDS_PER_MINUTE | 0; + remainingSeconds = remainingSeconds - minute * TimeConstants_default.SECONDS_PER_MINUTE; + let second = remainingSeconds | 0; + const millisecond = (remainingSeconds - second) / TimeConstants_default.SECONDS_PER_MILLISECOND; + hour += 12; + if (hour > 23) { + hour -= 24; + } + if (isLeapSecond) { + second += 1; + } + if (!defined_default(result)) { + return new GregorianDate_default( + year, + month, + day, + hour, + minute, + second, + millisecond, + isLeapSecond + ); + } + result.year = year; + result.month = month; + result.day = day; + result.hour = hour; + result.minute = minute; + result.second = second; + result.millisecond = millisecond; + result.isLeapSecond = isLeapSecond; + return result; +}; +JulianDate.toDate = function(julianDate) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + const gDate = JulianDate.toGregorianDate(julianDate, gregorianDateScratch); + let second = gDate.second; + if (gDate.isLeapSecond) { + second -= 1; + } + return new Date( + Date.UTC( + gDate.year, + gDate.month - 1, + gDate.day, + gDate.hour, + gDate.minute, + second, + gDate.millisecond + ) + ); +}; +JulianDate.toIso8601 = function(julianDate, precision) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + const gDate = JulianDate.toGregorianDate(julianDate, gregorianDateScratch); + let year = gDate.year; + let month = gDate.month; + let day = gDate.day; + let hour = gDate.hour; + const minute = gDate.minute; + const second = gDate.second; + const millisecond = gDate.millisecond; + if (year === 1e4 && month === 1 && day === 1 && hour === 0 && minute === 0 && second === 0 && millisecond === 0) { + year = 9999; + month = 12; + day = 31; + hour = 24; + } + let millisecondStr; + if (!defined_default(precision) && millisecond !== 0) { + millisecondStr = (millisecond * 0.01).toString().replace(".", ""); + return `${year.toString().padStart(4, "0")}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}T${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:${second.toString().padStart(2, "0")}.${millisecondStr}Z`; + } + if (!defined_default(precision) || precision === 0) { + return `${year.toString().padStart(4, "0")}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}T${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:${second.toString().padStart(2, "0")}Z`; + } + millisecondStr = (millisecond * 0.01).toFixed(precision).replace(".", "").slice(0, precision); + return `${year.toString().padStart(4, "0")}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}T${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:${second.toString().padStart(2, "0")}.${millisecondStr}Z`; +}; +JulianDate.clone = function(julianDate, result) { + if (!defined_default(julianDate)) { + return void 0; + } + if (!defined_default(result)) { + return new JulianDate( + julianDate.dayNumber, + julianDate.secondsOfDay, + TimeStandard_default.TAI + ); + } + result.dayNumber = julianDate.dayNumber; + result.secondsOfDay = julianDate.secondsOfDay; + return result; +}; +JulianDate.compare = function(left, right) { + if (!defined_default(left)) { + throw new DeveloperError_default("left is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("right is required."); + } + const julianDayNumberDifference = left.dayNumber - right.dayNumber; + if (julianDayNumberDifference !== 0) { + return julianDayNumberDifference; + } + return left.secondsOfDay - right.secondsOfDay; +}; +JulianDate.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.dayNumber === right.dayNumber && left.secondsOfDay === right.secondsOfDay; +}; +JulianDate.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(JulianDate.secondsDifference(left, right)) <= epsilon; +}; +JulianDate.totalDays = function(julianDate) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + return julianDate.dayNumber + julianDate.secondsOfDay / TimeConstants_default.SECONDS_PER_DAY; +}; +JulianDate.secondsDifference = function(left, right) { + if (!defined_default(left)) { + throw new DeveloperError_default("left is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("right is required."); + } + const dayDifference = (left.dayNumber - right.dayNumber) * TimeConstants_default.SECONDS_PER_DAY; + return dayDifference + (left.secondsOfDay - right.secondsOfDay); +}; +JulianDate.daysDifference = function(left, right) { + if (!defined_default(left)) { + throw new DeveloperError_default("left is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("right is required."); + } + const dayDifference = left.dayNumber - right.dayNumber; + const secondDifference = (left.secondsOfDay - right.secondsOfDay) / TimeConstants_default.SECONDS_PER_DAY; + return dayDifference + secondDifference; +}; +JulianDate.computeTaiMinusUtc = function(julianDate) { + binarySearchScratchLeapSecond.julianDate = julianDate; + const leapSeconds = JulianDate.leapSeconds; + let index = binarySearch_default( + leapSeconds, + binarySearchScratchLeapSecond, + compareLeapSecondDates + ); + if (index < 0) { + index = ~index; + --index; + if (index < 0) { + index = 0; + } + } + return leapSeconds[index].offset; +}; +JulianDate.addSeconds = function(julianDate, seconds, result) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + if (!defined_default(seconds)) { + throw new DeveloperError_default("seconds is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + return setComponents( + julianDate.dayNumber, + julianDate.secondsOfDay + seconds, + result + ); +}; +JulianDate.addMinutes = function(julianDate, minutes, result) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + if (!defined_default(minutes)) { + throw new DeveloperError_default("minutes is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + const newSecondsOfDay = julianDate.secondsOfDay + minutes * TimeConstants_default.SECONDS_PER_MINUTE; + return setComponents(julianDate.dayNumber, newSecondsOfDay, result); +}; +JulianDate.addHours = function(julianDate, hours, result) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + if (!defined_default(hours)) { + throw new DeveloperError_default("hours is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + const newSecondsOfDay = julianDate.secondsOfDay + hours * TimeConstants_default.SECONDS_PER_HOUR; + return setComponents(julianDate.dayNumber, newSecondsOfDay, result); +}; +JulianDate.addDays = function(julianDate, days, result) { + if (!defined_default(julianDate)) { + throw new DeveloperError_default("julianDate is required."); + } + if (!defined_default(days)) { + throw new DeveloperError_default("days is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + const newJulianDayNumber = julianDate.dayNumber + days; + return setComponents(newJulianDayNumber, julianDate.secondsOfDay, result); +}; +JulianDate.lessThan = function(left, right) { + return JulianDate.compare(left, right) < 0; +}; +JulianDate.lessThanOrEquals = function(left, right) { + return JulianDate.compare(left, right) <= 0; +}; +JulianDate.greaterThan = function(left, right) { + return JulianDate.compare(left, right) > 0; +}; +JulianDate.greaterThanOrEquals = function(left, right) { + return JulianDate.compare(left, right) >= 0; +}; +JulianDate.prototype.clone = function(result) { + return JulianDate.clone(this, result); +}; +JulianDate.prototype.equals = function(right) { + return JulianDate.equals(this, right); +}; +JulianDate.prototype.equalsEpsilon = function(right, epsilon) { + return JulianDate.equalsEpsilon(this, right, epsilon); +}; +JulianDate.prototype.toString = function() { + return JulianDate.toIso8601(this); +}; +JulianDate.leapSeconds = [ + new LeapSecond_default(new JulianDate(2441317, 43210, TimeStandard_default.TAI), 10), + // January 1, 1972 00:00:00 UTC + new LeapSecond_default(new JulianDate(2441499, 43211, TimeStandard_default.TAI), 11), + // July 1, 1972 00:00:00 UTC + new LeapSecond_default(new JulianDate(2441683, 43212, TimeStandard_default.TAI), 12), + // January 1, 1973 00:00:00 UTC + new LeapSecond_default(new JulianDate(2442048, 43213, TimeStandard_default.TAI), 13), + // January 1, 1974 00:00:00 UTC + new LeapSecond_default(new JulianDate(2442413, 43214, TimeStandard_default.TAI), 14), + // January 1, 1975 00:00:00 UTC + new LeapSecond_default(new JulianDate(2442778, 43215, TimeStandard_default.TAI), 15), + // January 1, 1976 00:00:00 UTC + new LeapSecond_default(new JulianDate(2443144, 43216, TimeStandard_default.TAI), 16), + // January 1, 1977 00:00:00 UTC + new LeapSecond_default(new JulianDate(2443509, 43217, TimeStandard_default.TAI), 17), + // January 1, 1978 00:00:00 UTC + new LeapSecond_default(new JulianDate(2443874, 43218, TimeStandard_default.TAI), 18), + // January 1, 1979 00:00:00 UTC + new LeapSecond_default(new JulianDate(2444239, 43219, TimeStandard_default.TAI), 19), + // January 1, 1980 00:00:00 UTC + new LeapSecond_default(new JulianDate(2444786, 43220, TimeStandard_default.TAI), 20), + // July 1, 1981 00:00:00 UTC + new LeapSecond_default(new JulianDate(2445151, 43221, TimeStandard_default.TAI), 21), + // July 1, 1982 00:00:00 UTC + new LeapSecond_default(new JulianDate(2445516, 43222, TimeStandard_default.TAI), 22), + // July 1, 1983 00:00:00 UTC + new LeapSecond_default(new JulianDate(2446247, 43223, TimeStandard_default.TAI), 23), + // July 1, 1985 00:00:00 UTC + new LeapSecond_default(new JulianDate(2447161, 43224, TimeStandard_default.TAI), 24), + // January 1, 1988 00:00:00 UTC + new LeapSecond_default(new JulianDate(2447892, 43225, TimeStandard_default.TAI), 25), + // January 1, 1990 00:00:00 UTC + new LeapSecond_default(new JulianDate(2448257, 43226, TimeStandard_default.TAI), 26), + // January 1, 1991 00:00:00 UTC + new LeapSecond_default(new JulianDate(2448804, 43227, TimeStandard_default.TAI), 27), + // July 1, 1992 00:00:00 UTC + new LeapSecond_default(new JulianDate(2449169, 43228, TimeStandard_default.TAI), 28), + // July 1, 1993 00:00:00 UTC + new LeapSecond_default(new JulianDate(2449534, 43229, TimeStandard_default.TAI), 29), + // July 1, 1994 00:00:00 UTC + new LeapSecond_default(new JulianDate(2450083, 43230, TimeStandard_default.TAI), 30), + // January 1, 1996 00:00:00 UTC + new LeapSecond_default(new JulianDate(2450630, 43231, TimeStandard_default.TAI), 31), + // July 1, 1997 00:00:00 UTC + new LeapSecond_default(new JulianDate(2451179, 43232, TimeStandard_default.TAI), 32), + // January 1, 1999 00:00:00 UTC + new LeapSecond_default(new JulianDate(2453736, 43233, TimeStandard_default.TAI), 33), + // January 1, 2006 00:00:00 UTC + new LeapSecond_default(new JulianDate(2454832, 43234, TimeStandard_default.TAI), 34), + // January 1, 2009 00:00:00 UTC + new LeapSecond_default(new JulianDate(2456109, 43235, TimeStandard_default.TAI), 35), + // July 1, 2012 00:00:00 UTC + new LeapSecond_default(new JulianDate(2457204, 43236, TimeStandard_default.TAI), 36), + // July 1, 2015 00:00:00 UTC + new LeapSecond_default(new JulianDate(2457754, 43237, TimeStandard_default.TAI), 37) + // January 1, 2017 00:00:00 UTC +]; +var JulianDate_default = JulianDate; + +// packages/engine/Source/Core/Resource.js +var import_urijs6 = __toESM(require_URI(), 1); + +// packages/engine/Source/Core/appendForwardSlash.js +function appendForwardSlash(url) { + if (url.length === 0 || url[url.length - 1] !== "/") { + url = `${url}/`; + } + return url; +} +var appendForwardSlash_default = appendForwardSlash; + +// packages/engine/Source/Core/clone.js +function clone(object, deep) { + if (object === null || typeof object !== "object") { + return object; + } + deep = defaultValue_default(deep, false); + const result = new object.constructor(); + for (const propertyName in object) { + if (object.hasOwnProperty(propertyName)) { + let value = object[propertyName]; + if (deep) { + value = clone(value, deep); + } + result[propertyName] = value; + } + } + return result; +} +var clone_default = clone; + +// packages/engine/Source/Core/defer.js +function defer() { + let resolve; + let reject; + const promise = new Promise(function(res, rej) { + resolve = res; + reject = rej; + }); + return { + resolve, + reject, + promise + }; +} +var defer_default = defer; + +// packages/engine/Source/Core/getAbsoluteUri.js +var import_urijs = __toESM(require_URI(), 1); +function getAbsoluteUri(relative, base) { + let documentObject; + if (typeof document !== "undefined") { + documentObject = document; + } + return getAbsoluteUri._implementation(relative, base, documentObject); +} +getAbsoluteUri._implementation = function(relative, base, documentObject) { + if (!defined_default(relative)) { + throw new DeveloperError_default("relative uri is required."); + } + if (!defined_default(base)) { + if (typeof documentObject === "undefined") { + return relative; + } + base = defaultValue_default(documentObject.baseURI, documentObject.location.href); + } + const relativeUri = new import_urijs.default(relative); + if (relativeUri.scheme() !== "") { + return relativeUri.toString(); + } + return relativeUri.absoluteTo(base).toString(); +}; +var getAbsoluteUri_default = getAbsoluteUri; + +// packages/engine/Source/Core/getBaseUri.js +var import_urijs2 = __toESM(require_URI(), 1); +function getBaseUri(uri, includeQuery) { + if (!defined_default(uri)) { + throw new DeveloperError_default("uri is required."); + } + let basePath = ""; + const i = uri.lastIndexOf("/"); + if (i !== -1) { + basePath = uri.substring(0, i + 1); + } + if (!includeQuery) { + return basePath; + } + uri = new import_urijs2.default(uri); + if (uri.query().length !== 0) { + basePath += `?${uri.query()}`; + } + if (uri.fragment().length !== 0) { + basePath += `#${uri.fragment()}`; + } + return basePath; +} +var getBaseUri_default = getBaseUri; + +// packages/engine/Source/Core/getExtensionFromUri.js +var import_urijs3 = __toESM(require_URI(), 1); +function getExtensionFromUri(uri) { + if (!defined_default(uri)) { + throw new DeveloperError_default("uri is required."); + } + const uriObject = new import_urijs3.default(uri); + uriObject.normalize(); + let path = uriObject.path(); + let index = path.lastIndexOf("/"); + if (index !== -1) { + path = path.substr(index + 1); + } + index = path.lastIndexOf("."); + if (index === -1) { + path = ""; + } else { + path = path.substr(index + 1); + } + return path; +} +var getExtensionFromUri_default = getExtensionFromUri; + +// packages/engine/Source/Core/getImagePixels.js +var context2DsByWidthAndHeight = {}; +function getImagePixels(image, width, height) { + if (!defined_default(width)) { + width = image.width; + } + if (!defined_default(height)) { + height = image.height; + } + let context2DsByHeight = context2DsByWidthAndHeight[width]; + if (!defined_default(context2DsByHeight)) { + context2DsByHeight = {}; + context2DsByWidthAndHeight[width] = context2DsByHeight; + } + let context2d = context2DsByHeight[height]; + if (!defined_default(context2d)) { + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + context2d = canvas.getContext("2d", { willReadFrequently: true }); + context2d.globalCompositeOperation = "copy"; + context2DsByHeight[height] = context2d; + } + context2d.drawImage(image, 0, 0, width, height); + return context2d.getImageData(0, 0, width, height).data; +} +var getImagePixels_default = getImagePixels; + +// packages/engine/Source/Core/isBlobUri.js +var blobUriRegex = /^blob:/i; +function isBlobUri(uri) { + Check_default.typeOf.string("uri", uri); + return blobUriRegex.test(uri); +} +var isBlobUri_default = isBlobUri; + +// packages/engine/Source/Core/isCrossOriginUrl.js +var a; +function isCrossOriginUrl(url) { + if (!defined_default(a)) { + a = document.createElement("a"); + } + a.href = window.location.href; + const host = a.host; + const protocol = a.protocol; + a.href = url; + a.href = a.href; + return protocol !== a.protocol || host !== a.host; +} +var isCrossOriginUrl_default = isCrossOriginUrl; + +// packages/engine/Source/Core/isDataUri.js +var dataUriRegex = /^data:/i; +function isDataUri(uri) { + Check_default.typeOf.string("uri", uri); + return dataUriRegex.test(uri); +} +var isDataUri_default = isDataUri; + +// packages/engine/Source/Core/loadAndExecuteScript.js +function loadAndExecuteScript(url) { + const script = document.createElement("script"); + script.async = true; + script.src = url; + return new Promise((resolve, reject) => { + if (window.crossOriginIsolated) { + script.setAttribute("crossorigin", "anonymous"); + } + const head = document.getElementsByTagName("head")[0]; + script.onload = function() { + script.onload = void 0; + head.removeChild(script); + resolve(); + }; + script.onerror = function(e) { + reject(e); + }; + head.appendChild(script); + }); +} +var loadAndExecuteScript_default = loadAndExecuteScript; + +// packages/engine/Source/Core/objectToQuery.js +function objectToQuery(obj) { + if (!defined_default(obj)) { + throw new DeveloperError_default("obj is required."); + } + let result = ""; + for (const propName in obj) { + if (obj.hasOwnProperty(propName)) { + const value = obj[propName]; + const part = `${encodeURIComponent(propName)}=`; + if (Array.isArray(value)) { + for (let i = 0, len = value.length; i < len; ++i) { + result += `${part + encodeURIComponent(value[i])}&`; + } + } else { + result += `${part + encodeURIComponent(value)}&`; + } + } + } + result = result.slice(0, -1); + return result; +} +var objectToQuery_default = objectToQuery; + +// packages/engine/Source/Core/queryToObject.js +function queryToObject(queryString) { + if (!defined_default(queryString)) { + throw new DeveloperError_default("queryString is required."); + } + const result = {}; + if (queryString === "") { + return result; + } + const parts = queryString.replace(/\+/g, "%20").split(/[&;]/); + for (let i = 0, len = parts.length; i < len; ++i) { + const subparts = parts[i].split("="); + const name = decodeURIComponent(subparts[0]); + let value = subparts[1]; + if (defined_default(value)) { + value = decodeURIComponent(value); + } else { + value = ""; + } + const resultValue = result[name]; + if (typeof resultValue === "string") { + result[name] = [resultValue, value]; + } else if (Array.isArray(resultValue)) { + resultValue.push(value); + } else { + result[name] = value; + } + } + return result; +} +var queryToObject_default = queryToObject; + +// packages/engine/Source/Core/RequestState.js +var RequestState = { + /** + * Initial unissued state. + * + * @type {number} + * @constant + */ + UNISSUED: 0, + /** + * Issued but not yet active. Will become active when open slots are available. + * + * @type {number} + * @constant + */ + ISSUED: 1, + /** + * Actual http request has been sent. + * + * @type {number} + * @constant + */ + ACTIVE: 2, + /** + * Request completed successfully. + * + * @type {number} + * @constant + */ + RECEIVED: 3, + /** + * Request was cancelled, either explicitly or automatically because of low priority. + * + * @type {number} + * @constant + */ + CANCELLED: 4, + /** + * Request failed. + * + * @type {number} + * @constant + */ + FAILED: 5 +}; +var RequestState_default = Object.freeze(RequestState); + +// packages/engine/Source/Core/RequestType.js +var RequestType = { + /** + * Terrain request. + * + * @type {number} + * @constant + */ + TERRAIN: 0, + /** + * Imagery request. + * + * @type {number} + * @constant + */ + IMAGERY: 1, + /** + * 3D Tiles request. + * + * @type {number} + * @constant + */ + TILES3D: 2, + /** + * Other request. + * + * @type {number} + * @constant + */ + OTHER: 3 +}; +var RequestType_default = Object.freeze(RequestType); + +// packages/engine/Source/Core/Request.js +function Request(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const throttleByServer = defaultValue_default(options.throttleByServer, false); + const throttle = defaultValue_default(options.throttle, false); + this.url = options.url; + this.requestFunction = options.requestFunction; + this.cancelFunction = options.cancelFunction; + this.priorityFunction = options.priorityFunction; + this.priority = defaultValue_default(options.priority, 0); + this.throttle = throttle; + this.throttleByServer = throttleByServer; + this.type = defaultValue_default(options.type, RequestType_default.OTHER); + this.serverKey = options.serverKey; + this.state = RequestState_default.UNISSUED; + this.deferred = void 0; + this.cancelled = false; +} +Request.prototype.cancel = function() { + this.cancelled = true; +}; +Request.prototype.clone = function(result) { + if (!defined_default(result)) { + return new Request(this); + } + result.url = this.url; + result.requestFunction = this.requestFunction; + result.cancelFunction = this.cancelFunction; + result.priorityFunction = this.priorityFunction; + result.priority = this.priority; + result.throttle = this.throttle; + result.throttleByServer = this.throttleByServer; + result.type = this.type; + result.serverKey = this.serverKey; + result.state = RequestState_default.UNISSUED; + result.deferred = void 0; + result.cancelled = false; + return result; +}; +var Request_default = Request; + +// packages/engine/Source/Core/parseResponseHeaders.js +function parseResponseHeaders(headerString) { + const headers = {}; + if (!headerString) { + return headers; + } + const headerPairs = headerString.split("\r\n"); + for (let i = 0; i < headerPairs.length; ++i) { + const headerPair = headerPairs[i]; + const index = headerPair.indexOf(": "); + if (index > 0) { + const key = headerPair.substring(0, index); + const val = headerPair.substring(index + 2); + headers[key] = val; + } + } + return headers; +} +var parseResponseHeaders_default = parseResponseHeaders; + +// packages/engine/Source/Core/RequestErrorEvent.js +function RequestErrorEvent(statusCode, response, responseHeaders) { + this.statusCode = statusCode; + this.response = response; + this.responseHeaders = responseHeaders; + if (typeof this.responseHeaders === "string") { + this.responseHeaders = parseResponseHeaders_default(this.responseHeaders); + } +} +RequestErrorEvent.prototype.toString = function() { + let str = "Request has failed."; + if (defined_default(this.statusCode)) { + str += ` Status Code: ${this.statusCode}`; + } + return str; +}; +var RequestErrorEvent_default = RequestErrorEvent; + +// packages/engine/Source/Core/RequestScheduler.js +var import_urijs4 = __toESM(require_URI(), 1); + +// packages/engine/Source/Core/Event.js +function Event() { + this._listeners = []; + this._scopes = []; + this._toRemove = []; + this._insideRaiseEvent = false; +} +Object.defineProperties(Event.prototype, { + /** + * The number of listeners currently subscribed to the event. + * @memberof Event.prototype + * @type {number} + * @readonly + */ + numberOfListeners: { + get: function() { + return this._listeners.length - this._toRemove.length; + } + } +}); +Event.prototype.addEventListener = function(listener, scope) { + Check_default.typeOf.func("listener", listener); + this._listeners.push(listener); + this._scopes.push(scope); + const event = this; + return function() { + event.removeEventListener(listener, scope); + }; +}; +Event.prototype.removeEventListener = function(listener, scope) { + Check_default.typeOf.func("listener", listener); + const listeners = this._listeners; + const scopes = this._scopes; + let index = -1; + for (let i = 0; i < listeners.length; i++) { + if (listeners[i] === listener && scopes[i] === scope) { + index = i; + break; + } + } + if (index !== -1) { + if (this._insideRaiseEvent) { + this._toRemove.push(index); + listeners[index] = void 0; + scopes[index] = void 0; + } else { + listeners.splice(index, 1); + scopes.splice(index, 1); + } + return true; + } + return false; +}; +function compareNumber(a3, b) { + return b - a3; +} +Event.prototype.raiseEvent = function() { + this._insideRaiseEvent = true; + let i; + const listeners = this._listeners; + const scopes = this._scopes; + let length = listeners.length; + for (i = 0; i < length; i++) { + const listener = listeners[i]; + if (defined_default(listener)) { + listeners[i].apply(scopes[i], arguments); + } + } + const toRemove = this._toRemove; + length = toRemove.length; + if (length > 0) { + toRemove.sort(compareNumber); + for (i = 0; i < length; i++) { + const index = toRemove[i]; + listeners.splice(index, 1); + scopes.splice(index, 1); + } + toRemove.length = 0; + } + this._insideRaiseEvent = false; +}; +var Event_default = Event; + +// packages/engine/Source/Core/Heap.js +function Heap(options) { + Check_default.typeOf.object("options", options); + Check_default.defined("options.comparator", options.comparator); + this._comparator = options.comparator; + this._array = []; + this._length = 0; + this._maximumLength = void 0; +} +Object.defineProperties(Heap.prototype, { + /** + * Gets the length of the heap. + * + * @memberof Heap.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + }, + /** + * Gets the internal array. + * + * @memberof Heap.prototype + * + * @type {Array} + * @readonly + */ + internalArray: { + get: function() { + return this._array; + } + }, + /** + * Gets and sets the maximum length of the heap. + * + * @memberof Heap.prototype + * + * @type {number} + */ + maximumLength: { + get: function() { + return this._maximumLength; + }, + set: function(value) { + Check_default.typeOf.number.greaterThanOrEquals("maximumLength", value, 0); + const originalLength = this._length; + if (value < originalLength) { + const array = this._array; + for (let i = value; i < originalLength; ++i) { + array[i] = void 0; + } + this._length = value; + array.length = value; + } + this._maximumLength = value; + } + }, + /** + * The comparator to use for the heap. If comparator(a, b) is less than 0, sort a to a lower index than b, otherwise sort to a higher index. + * + * @memberof Heap.prototype + * + * @type {Heap.ComparatorCallback} + */ + comparator: { + get: function() { + return this._comparator; + } + } +}); +function swap(array, a3, b) { + const temp = array[a3]; + array[a3] = array[b]; + array[b] = temp; +} +Heap.prototype.reserve = function(length) { + length = defaultValue_default(length, this._length); + this._array.length = length; +}; +Heap.prototype.heapify = function(index) { + index = defaultValue_default(index, 0); + const length = this._length; + const comparator = this._comparator; + const array = this._array; + let candidate = -1; + let inserting = true; + while (inserting) { + const right = 2 * (index + 1); + const left = right - 1; + if (left < length && comparator(array[left], array[index]) < 0) { + candidate = left; + } else { + candidate = index; + } + if (right < length && comparator(array[right], array[candidate]) < 0) { + candidate = right; + } + if (candidate !== index) { + swap(array, candidate, index); + index = candidate; + } else { + inserting = false; + } + } +}; +Heap.prototype.resort = function() { + const length = this._length; + for (let i = Math.ceil(length / 2); i >= 0; --i) { + this.heapify(i); + } +}; +Heap.prototype.insert = function(element) { + Check_default.defined("element", element); + const array = this._array; + const comparator = this._comparator; + const maximumLength = this._maximumLength; + let index = this._length++; + if (index < array.length) { + array[index] = element; + } else { + array.push(element); + } + while (index !== 0) { + const parent = Math.floor((index - 1) / 2); + if (comparator(array[index], array[parent]) < 0) { + swap(array, index, parent); + index = parent; + } else { + break; + } + } + let removedElement; + if (defined_default(maximumLength) && this._length > maximumLength) { + removedElement = array[maximumLength]; + this._length = maximumLength; + } + return removedElement; +}; +Heap.prototype.pop = function(index) { + index = defaultValue_default(index, 0); + if (this._length === 0) { + return void 0; + } + Check_default.typeOf.number.lessThan("index", index, this._length); + const array = this._array; + const root = array[index]; + swap(array, index, --this._length); + this.heapify(index); + array[this._length] = void 0; + return root; +}; +var Heap_default = Heap; + +// packages/engine/Source/Core/RequestScheduler.js +function sortRequests(a3, b) { + return a3.priority - b.priority; +} +var statistics = { + numberOfAttemptedRequests: 0, + numberOfActiveRequests: 0, + numberOfCancelledRequests: 0, + numberOfCancelledActiveRequests: 0, + numberOfFailedRequests: 0, + numberOfActiveRequestsEver: 0, + lastNumberOfActiveRequests: 0 +}; +var priorityHeapLength = 20; +var requestHeap = new Heap_default({ + comparator: sortRequests +}); +requestHeap.maximumLength = priorityHeapLength; +requestHeap.reserve(priorityHeapLength); +var activeRequests = []; +var numberOfActiveRequestsByServer = {}; +var pageUri = typeof document !== "undefined" ? new import_urijs4.default(document.location.href) : new import_urijs4.default(); +var requestCompletedEvent = new Event_default(); +function RequestScheduler() { +} +RequestScheduler.maximumRequests = 50; +RequestScheduler.maximumRequestsPerServer = 18; +RequestScheduler.requestsByServer = {}; +RequestScheduler.throttleRequests = true; +RequestScheduler.debugShowStatistics = false; +RequestScheduler.requestCompletedEvent = requestCompletedEvent; +Object.defineProperties(RequestScheduler, { + /** + * Returns the statistics used by the request scheduler. + * + * @memberof RequestScheduler + * + * @type {object} + * @readonly + * @private + */ + statistics: { + get: function() { + return statistics; + } + }, + /** + * The maximum size of the priority heap. This limits the number of requests that are sorted by priority. Only applies to requests that are not yet active. + * + * @memberof RequestScheduler + * + * @type {number} + * @default 20 + * @private + */ + priorityHeapLength: { + get: function() { + return priorityHeapLength; + }, + set: function(value) { + if (value < priorityHeapLength) { + while (requestHeap.length > value) { + const request = requestHeap.pop(); + cancelRequest(request); + } + } + priorityHeapLength = value; + requestHeap.maximumLength = value; + requestHeap.reserve(value); + } + } +}); +function updatePriority(request) { + if (defined_default(request.priorityFunction)) { + request.priority = request.priorityFunction(); + } +} +RequestScheduler.serverHasOpenSlots = function(serverKey, desiredRequests) { + desiredRequests = defaultValue_default(desiredRequests, 1); + const maxRequests = defaultValue_default( + RequestScheduler.requestsByServer[serverKey], + RequestScheduler.maximumRequestsPerServer + ); + const hasOpenSlotsServer = numberOfActiveRequestsByServer[serverKey] + desiredRequests <= maxRequests; + return hasOpenSlotsServer; +}; +RequestScheduler.heapHasOpenSlots = function(desiredRequests) { + const hasOpenSlotsHeap = requestHeap.length + desiredRequests <= priorityHeapLength; + return hasOpenSlotsHeap; +}; +function issueRequest(request) { + if (request.state === RequestState_default.UNISSUED) { + request.state = RequestState_default.ISSUED; + request.deferred = defer_default(); + } + return request.deferred.promise; +} +function getRequestReceivedFunction(request) { + return function(results) { + if (request.state === RequestState_default.CANCELLED) { + return; + } + const deferred = request.deferred; + --statistics.numberOfActiveRequests; + --numberOfActiveRequestsByServer[request.serverKey]; + requestCompletedEvent.raiseEvent(); + request.state = RequestState_default.RECEIVED; + request.deferred = void 0; + deferred.resolve(results); + }; +} +function getRequestFailedFunction(request) { + return function(error) { + if (request.state === RequestState_default.CANCELLED) { + return; + } + ++statistics.numberOfFailedRequests; + --statistics.numberOfActiveRequests; + --numberOfActiveRequestsByServer[request.serverKey]; + requestCompletedEvent.raiseEvent(error); + request.state = RequestState_default.FAILED; + request.deferred.reject(error); + }; +} +function startRequest(request) { + const promise = issueRequest(request); + request.state = RequestState_default.ACTIVE; + activeRequests.push(request); + ++statistics.numberOfActiveRequests; + ++statistics.numberOfActiveRequestsEver; + ++numberOfActiveRequestsByServer[request.serverKey]; + request.requestFunction().then(getRequestReceivedFunction(request)).catch(getRequestFailedFunction(request)); + return promise; +} +function cancelRequest(request) { + const active = request.state === RequestState_default.ACTIVE; + request.state = RequestState_default.CANCELLED; + ++statistics.numberOfCancelledRequests; + if (defined_default(request.deferred)) { + const deferred = request.deferred; + request.deferred = void 0; + deferred.reject(); + } + if (active) { + --statistics.numberOfActiveRequests; + --numberOfActiveRequestsByServer[request.serverKey]; + ++statistics.numberOfCancelledActiveRequests; + } + if (defined_default(request.cancelFunction)) { + request.cancelFunction(); + } +} +RequestScheduler.update = function() { + let i; + let request; + let removeCount = 0; + const activeLength = activeRequests.length; + for (i = 0; i < activeLength; ++i) { + request = activeRequests[i]; + if (request.cancelled) { + cancelRequest(request); + } + if (request.state !== RequestState_default.ACTIVE) { + ++removeCount; + continue; + } + if (removeCount > 0) { + activeRequests[i - removeCount] = request; + } + } + activeRequests.length -= removeCount; + const issuedRequests = requestHeap.internalArray; + const issuedLength = requestHeap.length; + for (i = 0; i < issuedLength; ++i) { + updatePriority(issuedRequests[i]); + } + requestHeap.resort(); + const openSlots = Math.max( + RequestScheduler.maximumRequests - activeRequests.length, + 0 + ); + let filledSlots = 0; + while (filledSlots < openSlots && requestHeap.length > 0) { + request = requestHeap.pop(); + if (request.cancelled) { + cancelRequest(request); + continue; + } + if (request.throttleByServer && !RequestScheduler.serverHasOpenSlots(request.serverKey)) { + cancelRequest(request); + continue; + } + startRequest(request); + ++filledSlots; + } + updateStatistics(); +}; +RequestScheduler.getServerKey = function(url) { + Check_default.typeOf.string("url", url); + let uri = new import_urijs4.default(url); + if (uri.scheme() === "") { + uri = uri.absoluteTo(pageUri); + uri.normalize(); + } + let serverKey = uri.authority(); + if (!/:/.test(serverKey)) { + serverKey = `${serverKey}:${uri.scheme() === "https" ? "443" : "80"}`; + } + const length = numberOfActiveRequestsByServer[serverKey]; + if (!defined_default(length)) { + numberOfActiveRequestsByServer[serverKey] = 0; + } + return serverKey; +}; +RequestScheduler.request = function(request) { + Check_default.typeOf.object("request", request); + Check_default.typeOf.string("request.url", request.url); + Check_default.typeOf.func("request.requestFunction", request.requestFunction); + if (isDataUri_default(request.url) || isBlobUri_default(request.url)) { + requestCompletedEvent.raiseEvent(); + request.state = RequestState_default.RECEIVED; + return request.requestFunction(); + } + ++statistics.numberOfAttemptedRequests; + if (!defined_default(request.serverKey)) { + request.serverKey = RequestScheduler.getServerKey(request.url); + } + if (RequestScheduler.throttleRequests && request.throttleByServer && !RequestScheduler.serverHasOpenSlots(request.serverKey)) { + return void 0; + } + if (!RequestScheduler.throttleRequests || !request.throttle) { + return startRequest(request); + } + if (activeRequests.length >= RequestScheduler.maximumRequests) { + return void 0; + } + updatePriority(request); + const removedRequest = requestHeap.insert(request); + if (defined_default(removedRequest)) { + if (removedRequest === request) { + return void 0; + } + cancelRequest(removedRequest); + } + return issueRequest(request); +}; +function updateStatistics() { + if (!RequestScheduler.debugShowStatistics) { + return; + } + if (statistics.numberOfActiveRequests === 0 && statistics.lastNumberOfActiveRequests > 0) { + if (statistics.numberOfAttemptedRequests > 0) { + console.log( + `Number of attempted requests: ${statistics.numberOfAttemptedRequests}` + ); + statistics.numberOfAttemptedRequests = 0; + } + if (statistics.numberOfCancelledRequests > 0) { + console.log( + `Number of cancelled requests: ${statistics.numberOfCancelledRequests}` + ); + statistics.numberOfCancelledRequests = 0; + } + if (statistics.numberOfCancelledActiveRequests > 0) { + console.log( + `Number of cancelled active requests: ${statistics.numberOfCancelledActiveRequests}` + ); + statistics.numberOfCancelledActiveRequests = 0; + } + if (statistics.numberOfFailedRequests > 0) { + console.log( + `Number of failed requests: ${statistics.numberOfFailedRequests}` + ); + statistics.numberOfFailedRequests = 0; + } + } + statistics.lastNumberOfActiveRequests = statistics.numberOfActiveRequests; +} +RequestScheduler.clearForSpecs = function() { + while (requestHeap.length > 0) { + const request = requestHeap.pop(); + cancelRequest(request); + } + const length = activeRequests.length; + for (let i = 0; i < length; ++i) { + cancelRequest(activeRequests[i]); + } + activeRequests.length = 0; + numberOfActiveRequestsByServer = {}; + statistics.numberOfAttemptedRequests = 0; + statistics.numberOfActiveRequests = 0; + statistics.numberOfCancelledRequests = 0; + statistics.numberOfCancelledActiveRequests = 0; + statistics.numberOfFailedRequests = 0; + statistics.numberOfActiveRequestsEver = 0; + statistics.lastNumberOfActiveRequests = 0; +}; +RequestScheduler.numberOfActiveRequestsByServer = function(serverKey) { + return numberOfActiveRequestsByServer[serverKey]; +}; +RequestScheduler.requestHeap = requestHeap; +var RequestScheduler_default = RequestScheduler; + +// packages/engine/Source/Core/TrustedServers.js +var import_urijs5 = __toESM(require_URI(), 1); +var TrustedServers = {}; +var _servers = {}; +TrustedServers.add = function(host, port) { + if (!defined_default(host)) { + throw new DeveloperError_default("host is required."); + } + if (!defined_default(port) || port <= 0) { + throw new DeveloperError_default("port is required to be greater than 0."); + } + const authority = `${host.toLowerCase()}:${port}`; + if (!defined_default(_servers[authority])) { + _servers[authority] = true; + } +}; +TrustedServers.remove = function(host, port) { + if (!defined_default(host)) { + throw new DeveloperError_default("host is required."); + } + if (!defined_default(port) || port <= 0) { + throw new DeveloperError_default("port is required to be greater than 0."); + } + const authority = `${host.toLowerCase()}:${port}`; + if (defined_default(_servers[authority])) { + delete _servers[authority]; + } +}; +function getAuthority(url) { + const uri = new import_urijs5.default(url); + uri.normalize(); + let authority = uri.authority(); + if (authority.length === 0) { + return void 0; + } + uri.authority(authority); + if (authority.indexOf("@") !== -1) { + const parts = authority.split("@"); + authority = parts[1]; + } + if (authority.indexOf(":") === -1) { + let scheme = uri.scheme(); + if (scheme.length === 0) { + scheme = window.location.protocol; + scheme = scheme.substring(0, scheme.length - 1); + } + if (scheme === "http") { + authority += ":80"; + } else if (scheme === "https") { + authority += ":443"; + } else { + return void 0; + } + } + return authority; +} +TrustedServers.contains = function(url) { + if (!defined_default(url)) { + throw new DeveloperError_default("url is required."); + } + const authority = getAuthority(url); + if (defined_default(authority) && defined_default(_servers[authority])) { + return true; + } + return false; +}; +TrustedServers.clear = function() { + _servers = {}; +}; +var TrustedServers_default = TrustedServers; + +// packages/engine/Source/Core/Resource.js +var xhrBlobSupported = function() { + try { + const xhr = new XMLHttpRequest(); + xhr.open("GET", "#", true); + xhr.responseType = "blob"; + return xhr.responseType === "blob"; + } catch (e) { + return false; + } +}(); +function Resource(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + if (typeof options === "string") { + options = { + url: options + }; + } + Check_default.typeOf.string("options.url", options.url); + this._url = void 0; + this._templateValues = defaultClone(options.templateValues, {}); + this._queryParameters = defaultClone(options.queryParameters, {}); + this.headers = defaultClone(options.headers, {}); + this.request = defaultValue_default(options.request, new Request_default()); + this.proxy = options.proxy; + this.retryCallback = options.retryCallback; + this.retryAttempts = defaultValue_default(options.retryAttempts, 0); + this._retryCount = 0; + const parseUrl = defaultValue_default(options.parseUrl, true); + if (parseUrl) { + this.parseUrl(options.url, true, true); + } else { + this._url = options.url; + } + this._credits = options.credits; +} +function defaultClone(value, defaultValue) { + return defined_default(value) ? clone_default(value) : defaultValue; +} +Resource.createIfNeeded = function(resource) { + if (resource instanceof Resource) { + return resource.getDerivedResource({ + request: resource.request + }); + } + if (typeof resource !== "string") { + return resource; + } + return new Resource({ + url: resource + }); +}; +var supportsImageBitmapOptionsPromise; +Resource.supportsImageBitmapOptions = function() { + if (defined_default(supportsImageBitmapOptionsPromise)) { + return supportsImageBitmapOptionsPromise; + } + if (typeof createImageBitmap !== "function") { + supportsImageBitmapOptionsPromise = Promise.resolve(false); + return supportsImageBitmapOptionsPromise; + } + const imageDataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAABGdBTUEAAE4g3rEiDgAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADElEQVQI12Ng6GAAAAEUAIngE3ZiAAAAAElFTkSuQmCC"; + supportsImageBitmapOptionsPromise = Resource.fetchBlob({ + url: imageDataUri + }).then(function(blob) { + const imageBitmapOptions = { + imageOrientation: "flipY", + // default is "none" + premultiplyAlpha: "none", + // default is "default" + colorSpaceConversion: "none" + // default is "default" + }; + return Promise.all([ + createImageBitmap(blob, imageBitmapOptions), + createImageBitmap(blob) + ]); + }).then(function(imageBitmaps) { + const colorWithOptions = getImagePixels_default(imageBitmaps[0]); + const colorWithDefaults = getImagePixels_default(imageBitmaps[1]); + return colorWithOptions[1] !== colorWithDefaults[1]; + }).catch(function() { + return false; + }); + return supportsImageBitmapOptionsPromise; +}; +Object.defineProperties(Resource, { + /** + * Returns true if blobs are supported. + * + * @memberof Resource + * @type {boolean} + * + * @readonly + */ + isBlobSupported: { + get: function() { + return xhrBlobSupported; + } + } +}); +Object.defineProperties(Resource.prototype, { + /** + * Query parameters appended to the url. + * + * @memberof Resource.prototype + * @type {object} + * + * @readonly + */ + queryParameters: { + get: function() { + return this._queryParameters; + } + }, + /** + * The key/value pairs used to replace template parameters in the url. + * + * @memberof Resource.prototype + * @type {object} + * + * @readonly + */ + templateValues: { + get: function() { + return this._templateValues; + } + }, + /** + * The url to the resource with template values replaced, query string appended and encoded by proxy if one was set. + * + * @memberof Resource.prototype + * @type {string} + */ + url: { + get: function() { + return this.getUrlComponent(true, true); + }, + set: function(value) { + this.parseUrl(value, false, false); + } + }, + /** + * The file extension of the resource. + * + * @memberof Resource.prototype + * @type {string} + * + * @readonly + */ + extension: { + get: function() { + return getExtensionFromUri_default(this._url); + } + }, + /** + * True if the Resource refers to a data URI. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isDataUri: { + get: function() { + return isDataUri_default(this._url); + } + }, + /** + * True if the Resource refers to a blob URI. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isBlobUri: { + get: function() { + return isBlobUri_default(this._url); + } + }, + /** + * True if the Resource refers to a cross origin URL. + * + * @memberof Resource.prototype + * @type {boolean} + */ + isCrossOriginUrl: { + get: function() { + return isCrossOriginUrl_default(this._url); + } + }, + /** + * True if the Resource has request headers. This is equivalent to checking if the headers property has any keys. + * + * @memberof Resource.prototype + * @type {boolean} + */ + hasHeaders: { + get: function() { + return Object.keys(this.headers).length > 0; + } + }, + /** + * Gets the credits required for attribution of an asset. + * @private + */ + credits: { + get: function() { + return this._credits; + } + } +}); +Resource.prototype.toString = function() { + return this.getUrlComponent(true, true); +}; +Resource.prototype.parseUrl = function(url, merge, preserveQuery, baseUrl) { + let uri = new import_urijs6.default(url); + const query = parseQueryString(uri.query()); + this._queryParameters = merge ? combineQueryParameters(query, this.queryParameters, preserveQuery) : query; + uri.search(""); + uri.fragment(""); + if (defined_default(baseUrl) && uri.scheme() === "") { + uri = uri.absoluteTo(getAbsoluteUri_default(baseUrl)); + } + this._url = uri.toString(); +}; +function parseQueryString(queryString) { + if (queryString.length === 0) { + return {}; + } + if (queryString.indexOf("=") === -1) { + return { [queryString]: void 0 }; + } + return queryToObject_default(queryString); +} +function combineQueryParameters(q1, q2, preserveQueryParameters) { + if (!preserveQueryParameters) { + return combine_default(q1, q2); + } + const result = clone_default(q1, true); + for (const param in q2) { + if (q2.hasOwnProperty(param)) { + let value = result[param]; + const q2Value = q2[param]; + if (defined_default(value)) { + if (!Array.isArray(value)) { + value = result[param] = [value]; + } + result[param] = value.concat(q2Value); + } else { + result[param] = Array.isArray(q2Value) ? q2Value.slice() : q2Value; + } + } + } + return result; +} +Resource.prototype.getUrlComponent = function(query, proxy) { + if (this.isDataUri) { + return this._url; + } + let url = this._url; + if (query) { + url = `${url}${stringifyQuery(this.queryParameters)}`; + } + url = url.replace(/%7B/g, "{").replace(/%7D/g, "}"); + const templateValues = this._templateValues; + if (Object.keys(templateValues).length > 0) { + url = url.replace(/{(.*?)}/g, function(match, key) { + const replacement = templateValues[key]; + if (defined_default(replacement)) { + return encodeURIComponent(replacement); + } + return match; + }); + } + if (proxy && defined_default(this.proxy)) { + url = this.proxy.getURL(url); + } + return url; +}; +function stringifyQuery(queryObject) { + const keys = Object.keys(queryObject); + if (keys.length === 0) { + return ""; + } + if (keys.length === 1 && !defined_default(queryObject[keys[0]])) { + return `?${keys[0]}`; + } + return `?${objectToQuery_default(queryObject)}`; +} +Resource.prototype.setQueryParameters = function(params, useAsDefault) { + if (useAsDefault) { + this._queryParameters = combineQueryParameters( + this._queryParameters, + params, + false + ); + } else { + this._queryParameters = combineQueryParameters( + params, + this._queryParameters, + false + ); + } +}; +Resource.prototype.appendQueryParameters = function(params) { + this._queryParameters = combineQueryParameters( + params, + this._queryParameters, + true + ); +}; +Resource.prototype.setTemplateValues = function(template, useAsDefault) { + if (useAsDefault) { + this._templateValues = combine_default(this._templateValues, template); + } else { + this._templateValues = combine_default(template, this._templateValues); + } +}; +Resource.prototype.getDerivedResource = function(options) { + const resource = this.clone(); + resource._retryCount = 0; + if (defined_default(options.url)) { + const preserveQuery = defaultValue_default(options.preserveQueryParameters, false); + resource.parseUrl(options.url, true, preserveQuery, this._url); + } + if (defined_default(options.queryParameters)) { + resource._queryParameters = combine_default( + options.queryParameters, + resource.queryParameters + ); + } + if (defined_default(options.templateValues)) { + resource._templateValues = combine_default( + options.templateValues, + resource.templateValues + ); + } + if (defined_default(options.headers)) { + resource.headers = combine_default(options.headers, resource.headers); + } + if (defined_default(options.proxy)) { + resource.proxy = options.proxy; + } + if (defined_default(options.request)) { + resource.request = options.request; + } + if (defined_default(options.retryCallback)) { + resource.retryCallback = options.retryCallback; + } + if (defined_default(options.retryAttempts)) { + resource.retryAttempts = options.retryAttempts; + } + return resource; +}; +Resource.prototype.retryOnError = function(error) { + const retryCallback = this.retryCallback; + if (typeof retryCallback !== "function" || this._retryCount >= this.retryAttempts) { + return Promise.resolve(false); + } + const that = this; + return Promise.resolve(retryCallback(this, error)).then(function(result) { + ++that._retryCount; + return result; + }); +}; +Resource.prototype.clone = function(result) { + if (!defined_default(result)) { + return new Resource({ + url: this._url, + queryParameters: this.queryParameters, + templateValues: this.templateValues, + headers: this.headers, + proxy: this.proxy, + retryCallback: this.retryCallback, + retryAttempts: this.retryAttempts, + request: this.request.clone(), + parseUrl: false, + credits: defined_default(this.credits) ? this.credits.slice() : void 0 + }); + } + result._url = this._url; + result._queryParameters = clone_default(this._queryParameters); + result._templateValues = clone_default(this._templateValues); + result.headers = clone_default(this.headers); + result.proxy = this.proxy; + result.retryCallback = this.retryCallback; + result.retryAttempts = this.retryAttempts; + result._retryCount = 0; + result.request = this.request.clone(); + return result; +}; +Resource.prototype.getBaseUri = function(includeQuery) { + return getBaseUri_default(this.getUrlComponent(includeQuery), includeQuery); +}; +Resource.prototype.appendForwardSlash = function() { + this._url = appendForwardSlash_default(this._url); +}; +Resource.prototype.fetchArrayBuffer = function() { + return this.fetch({ + responseType: "arraybuffer" + }); +}; +Resource.fetchArrayBuffer = function(options) { + const resource = new Resource(options); + return resource.fetchArrayBuffer(); +}; +Resource.prototype.fetchBlob = function() { + return this.fetch({ + responseType: "blob" + }); +}; +Resource.fetchBlob = function(options) { + const resource = new Resource(options); + return resource.fetchBlob(); +}; +Resource.prototype.fetchImage = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const preferImageBitmap = defaultValue_default(options.preferImageBitmap, false); + const preferBlob = defaultValue_default(options.preferBlob, false); + const flipY = defaultValue_default(options.flipY, false); + const skipColorSpaceConversion = defaultValue_default( + options.skipColorSpaceConversion, + false + ); + checkAndResetRequest(this.request); + if (!xhrBlobSupported || this.isDataUri || this.isBlobUri || !this.hasHeaders && !preferBlob) { + return fetchImage({ + resource: this, + flipY, + skipColorSpaceConversion, + preferImageBitmap + }); + } + const blobPromise = this.fetchBlob(); + if (!defined_default(blobPromise)) { + return; + } + let supportsImageBitmap; + let useImageBitmap; + let generatedBlobResource; + let generatedBlob; + return Resource.supportsImageBitmapOptions().then(function(result) { + supportsImageBitmap = result; + useImageBitmap = supportsImageBitmap && preferImageBitmap; + return blobPromise; + }).then(function(blob) { + if (!defined_default(blob)) { + return; + } + generatedBlob = blob; + if (useImageBitmap) { + return Resource.createImageBitmapFromBlob(blob, { + flipY, + premultiplyAlpha: false, + skipColorSpaceConversion + }); + } + const blobUrl = window.URL.createObjectURL(blob); + generatedBlobResource = new Resource({ + url: blobUrl + }); + return fetchImage({ + resource: generatedBlobResource, + flipY, + skipColorSpaceConversion, + preferImageBitmap: false + }); + }).then(function(image) { + if (!defined_default(image)) { + return; + } + image.blob = generatedBlob; + if (useImageBitmap) { + return image; + } + window.URL.revokeObjectURL(generatedBlobResource.url); + return image; + }).catch(function(error) { + if (defined_default(generatedBlobResource)) { + window.URL.revokeObjectURL(generatedBlobResource.url); + } + error.blob = generatedBlob; + return Promise.reject(error); + }); +}; +function fetchImage(options) { + const resource = options.resource; + const flipY = options.flipY; + const skipColorSpaceConversion = options.skipColorSpaceConversion; + const preferImageBitmap = options.preferImageBitmap; + const request = resource.request; + request.url = resource.url; + request.requestFunction = function() { + let crossOrigin = false; + if (!resource.isDataUri && !resource.isBlobUri) { + crossOrigin = resource.isCrossOriginUrl; + } + const deferred = defer_default(); + Resource._Implementations.createImage( + request, + crossOrigin, + deferred, + flipY, + skipColorSpaceConversion, + preferImageBitmap + ); + return deferred.promise; + }; + const promise = RequestScheduler_default.request(request); + if (!defined_default(promise)) { + return; + } + return promise.catch(function(e) { + if (request.state !== RequestState_default.FAILED) { + return Promise.reject(e); + } + return resource.retryOnError(e).then(function(retry) { + if (retry) { + request.state = RequestState_default.UNISSUED; + request.deferred = void 0; + return fetchImage({ + resource, + flipY, + skipColorSpaceConversion, + preferImageBitmap + }); + } + return Promise.reject(e); + }); + }); +} +Resource.fetchImage = function(options) { + const resource = new Resource(options); + return resource.fetchImage({ + flipY: options.flipY, + skipColorSpaceConversion: options.skipColorSpaceConversion, + preferBlob: options.preferBlob, + preferImageBitmap: options.preferImageBitmap + }); +}; +Resource.prototype.fetchText = function() { + return this.fetch({ + responseType: "text" + }); +}; +Resource.fetchText = function(options) { + const resource = new Resource(options); + return resource.fetchText(); +}; +Resource.prototype.fetchJson = function() { + const promise = this.fetch({ + responseType: "text", + headers: { + Accept: "application/json,*/*;q=0.01" + } + }); + if (!defined_default(promise)) { + return void 0; + } + return promise.then(function(value) { + if (!defined_default(value)) { + return; + } + return JSON.parse(value); + }); +}; +Resource.fetchJson = function(options) { + const resource = new Resource(options); + return resource.fetchJson(); +}; +Resource.prototype.fetchXML = function() { + return this.fetch({ + responseType: "document", + overrideMimeType: "text/xml" + }); +}; +Resource.fetchXML = function(options) { + const resource = new Resource(options); + return resource.fetchXML(); +}; +Resource.prototype.fetchJsonp = function(callbackParameterName) { + callbackParameterName = defaultValue_default(callbackParameterName, "callback"); + checkAndResetRequest(this.request); + let functionName; + do { + functionName = `loadJsonp${Math_default.nextRandomNumber().toString().substring(2, 8)}`; + } while (defined_default(window[functionName])); + return fetchJsonp(this, callbackParameterName, functionName); +}; +function fetchJsonp(resource, callbackParameterName, functionName) { + const callbackQuery = {}; + callbackQuery[callbackParameterName] = functionName; + resource.setQueryParameters(callbackQuery); + const request = resource.request; + const url = resource.url; + request.url = url; + request.requestFunction = function() { + const deferred = defer_default(); + window[functionName] = function(data) { + deferred.resolve(data); + try { + delete window[functionName]; + } catch (e) { + window[functionName] = void 0; + } + }; + Resource._Implementations.loadAndExecuteScript(url, functionName, deferred); + return deferred.promise; + }; + const promise = RequestScheduler_default.request(request); + if (!defined_default(promise)) { + return; + } + return promise.catch(function(e) { + if (request.state !== RequestState_default.FAILED) { + return Promise.reject(e); + } + return resource.retryOnError(e).then(function(retry) { + if (retry) { + request.state = RequestState_default.UNISSUED; + request.deferred = void 0; + return fetchJsonp(resource, callbackParameterName, functionName); + } + return Promise.reject(e); + }); + }); +} +Resource.fetchJsonp = function(options) { + const resource = new Resource(options); + return resource.fetchJsonp(options.callbackParameterName); +}; +Resource.prototype._makeRequest = function(options) { + const resource = this; + checkAndResetRequest(resource.request); + const request = resource.request; + const url = resource.url; + request.url = url; + request.requestFunction = function() { + const responseType = options.responseType; + const headers = combine_default(options.headers, resource.headers); + const overrideMimeType = options.overrideMimeType; + const method = options.method; + const data = options.data; + const deferred = defer_default(); + const xhr = Resource._Implementations.loadWithXhr( + url, + responseType, + method, + data, + headers, + deferred, + overrideMimeType + ); + if (defined_default(xhr) && defined_default(xhr.abort)) { + request.cancelFunction = function() { + xhr.abort(); + }; + } + return deferred.promise; + }; + const promise = RequestScheduler_default.request(request); + if (!defined_default(promise)) { + return; + } + return promise.then(function(data) { + request.cancelFunction = void 0; + return data; + }).catch(function(e) { + request.cancelFunction = void 0; + if (request.state !== RequestState_default.FAILED) { + return Promise.reject(e); + } + return resource.retryOnError(e).then(function(retry) { + if (retry) { + request.state = RequestState_default.UNISSUED; + request.deferred = void 0; + return resource.fetch(options); + } + return Promise.reject(e); + }); + }); +}; +function checkAndResetRequest(request) { + if (request.state === RequestState_default.ISSUED || request.state === RequestState_default.ACTIVE) { + throw new RuntimeError_default("The Resource is already being fetched."); + } + request.state = RequestState_default.UNISSUED; + request.deferred = void 0; +} +var dataUriRegex2 = /^data:(.*?)(;base64)?,(.*)$/; +function decodeDataUriText(isBase64, data) { + const result = decodeURIComponent(data); + if (isBase64) { + return atob(result); + } + return result; +} +function decodeDataUriArrayBuffer(isBase64, data) { + const byteString = decodeDataUriText(isBase64, data); + const buffer = new ArrayBuffer(byteString.length); + const view = new Uint8Array(buffer); + for (let i = 0; i < byteString.length; i++) { + view[i] = byteString.charCodeAt(i); + } + return buffer; +} +function decodeDataUri(dataUriRegexResult, responseType) { + responseType = defaultValue_default(responseType, ""); + const mimeType = dataUriRegexResult[1]; + const isBase64 = !!dataUriRegexResult[2]; + const data = dataUriRegexResult[3]; + let buffer; + let parser; + switch (responseType) { + case "": + case "text": + return decodeDataUriText(isBase64, data); + case "arraybuffer": + return decodeDataUriArrayBuffer(isBase64, data); + case "blob": + buffer = decodeDataUriArrayBuffer(isBase64, data); + return new Blob([buffer], { + type: mimeType + }); + case "document": + parser = new DOMParser(); + return parser.parseFromString( + decodeDataUriText(isBase64, data), + mimeType + ); + case "json": + return JSON.parse(decodeDataUriText(isBase64, data)); + default: + throw new DeveloperError_default(`Unhandled responseType: ${responseType}`); + } +} +Resource.prototype.fetch = function(options) { + options = defaultClone(options, {}); + options.method = "GET"; + return this._makeRequest(options); +}; +Resource.fetch = function(options) { + const resource = new Resource(options); + return resource.fetch({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource.prototype.delete = function(options) { + options = defaultClone(options, {}); + options.method = "DELETE"; + return this._makeRequest(options); +}; +Resource.delete = function(options) { + const resource = new Resource(options); + return resource.delete({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: options.responseType, + overrideMimeType: options.overrideMimeType, + data: options.data + }); +}; +Resource.prototype.head = function(options) { + options = defaultClone(options, {}); + options.method = "HEAD"; + return this._makeRequest(options); +}; +Resource.head = function(options) { + const resource = new Resource(options); + return resource.head({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource.prototype.options = function(options) { + options = defaultClone(options, {}); + options.method = "OPTIONS"; + return this._makeRequest(options); +}; +Resource.options = function(options) { + const resource = new Resource(options); + return resource.options({ + // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource.prototype.post = function(data, options) { + Check_default.defined("data", data); + options = defaultClone(options, {}); + options.method = "POST"; + options.data = data; + return this._makeRequest(options); +}; +Resource.post = function(options) { + const resource = new Resource(options); + return resource.post(options.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource.prototype.put = function(data, options) { + Check_default.defined("data", data); + options = defaultClone(options, {}); + options.method = "PUT"; + options.data = data; + return this._makeRequest(options); +}; +Resource.put = function(options) { + const resource = new Resource(options); + return resource.put(options.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource.prototype.patch = function(data, options) { + Check_default.defined("data", data); + options = defaultClone(options, {}); + options.method = "PATCH"; + options.data = data; + return this._makeRequest(options); +}; +Resource.patch = function(options) { + const resource = new Resource(options); + return resource.patch(options.data, { + // Make copy of just the needed fields because headers can be passed to both the constructor and to post + responseType: options.responseType, + overrideMimeType: options.overrideMimeType + }); +}; +Resource._Implementations = {}; +Resource._Implementations.loadImageElement = function(url, crossOrigin, deferred) { + const image = new Image(); + image.onload = function() { + if (image.naturalWidth === 0 && image.naturalHeight === 0 && image.width === 0 && image.height === 0) { + image.width = 300; + image.height = 150; + } + deferred.resolve(image); + }; + image.onerror = function(e) { + deferred.reject(e); + }; + if (crossOrigin) { + if (TrustedServers_default.contains(url)) { + image.crossOrigin = "use-credentials"; + } else { + image.crossOrigin = ""; + } + } + image.src = url; +}; +Resource._Implementations.createImage = function(request, crossOrigin, deferred, flipY, skipColorSpaceConversion, preferImageBitmap) { + const url = request.url; + Resource.supportsImageBitmapOptions().then(function(supportsImageBitmap) { + if (!(supportsImageBitmap && preferImageBitmap)) { + Resource._Implementations.loadImageElement(url, crossOrigin, deferred); + return; + } + const responseType = "blob"; + const method = "GET"; + const xhrDeferred = defer_default(); + const xhr = Resource._Implementations.loadWithXhr( + url, + responseType, + method, + void 0, + void 0, + xhrDeferred, + void 0, + void 0, + void 0 + ); + if (defined_default(xhr) && defined_default(xhr.abort)) { + request.cancelFunction = function() { + xhr.abort(); + }; + } + return xhrDeferred.promise.then(function(blob) { + if (!defined_default(blob)) { + deferred.reject( + new RuntimeError_default( + `Successfully retrieved ${url} but it contained no content.` + ) + ); + return; + } + return Resource.createImageBitmapFromBlob(blob, { + flipY, + premultiplyAlpha: false, + skipColorSpaceConversion + }); + }).then(function(image) { + deferred.resolve(image); + }); + }).catch(function(e) { + deferred.reject(e); + }); +}; +Resource.createImageBitmapFromBlob = function(blob, options) { + Check_default.defined("options", options); + Check_default.typeOf.bool("options.flipY", options.flipY); + Check_default.typeOf.bool("options.premultiplyAlpha", options.premultiplyAlpha); + Check_default.typeOf.bool( + "options.skipColorSpaceConversion", + options.skipColorSpaceConversion + ); + return createImageBitmap(blob, { + imageOrientation: options.flipY ? "flipY" : "none", + premultiplyAlpha: options.premultiplyAlpha ? "premultiply" : "none", + colorSpaceConversion: options.skipColorSpaceConversion ? "none" : "default" + }); +}; +function loadWithHttpRequest(url, responseType, method, data, headers, deferred, overrideMimeType) { + fetch(url, { + method, + headers + }).then(async (response) => { + if (!response.ok) { + const responseHeaders = {}; + response.headers.forEach((value, key) => { + responseHeaders[key] = value; + }); + deferred.reject( + new RequestErrorEvent_default(response.status, response, responseHeaders) + ); + return; + } + switch (responseType) { + case "text": + deferred.resolve(response.text()); + break; + case "json": + deferred.resolve(response.json()); + break; + default: + deferred.resolve(new Uint8Array(await response.arrayBuffer()).buffer); + break; + } + }).catch(() => { + deferred.reject(new RequestErrorEvent_default()); + }); +} +var noXMLHttpRequest = typeof XMLHttpRequest === "undefined"; +Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { + const dataUriRegexResult = dataUriRegex2.exec(url); + if (dataUriRegexResult !== null) { + deferred.resolve(decodeDataUri(dataUriRegexResult, responseType)); + return; + } + if (noXMLHttpRequest) { + loadWithHttpRequest( + url, + responseType, + method, + data, + headers, + deferred, + overrideMimeType + ); + return; + } + const xhr = new XMLHttpRequest(); + if (TrustedServers_default.contains(url)) { + xhr.withCredentials = true; + } + xhr.open(method, url, true); + if (defined_default(overrideMimeType) && defined_default(xhr.overrideMimeType)) { + xhr.overrideMimeType(overrideMimeType); + } + if (defined_default(headers)) { + for (const key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } + if (defined_default(responseType)) { + xhr.responseType = responseType; + } + let localFile = false; + if (typeof url === "string") { + localFile = url.indexOf("file://") === 0 || typeof window !== "undefined" && window.location.origin === "file://"; + } + xhr.onload = function() { + if ((xhr.status < 200 || xhr.status >= 300) && !(localFile && xhr.status === 0)) { + deferred.reject( + new RequestErrorEvent_default( + xhr.status, + xhr.response, + xhr.getAllResponseHeaders() + ) + ); + return; + } + const response = xhr.response; + const browserResponseType = xhr.responseType; + if (method === "HEAD" || method === "OPTIONS") { + const responseHeaderString = xhr.getAllResponseHeaders(); + const splitHeaders = responseHeaderString.trim().split(/[\r\n]+/); + const responseHeaders = {}; + splitHeaders.forEach(function(line) { + const parts = line.split(": "); + const header = parts.shift(); + responseHeaders[header] = parts.join(": "); + }); + deferred.resolve(responseHeaders); + return; + } + if (xhr.status === 204) { + deferred.resolve(void 0); + } else if (defined_default(response) && (!defined_default(responseType) || browserResponseType === responseType)) { + deferred.resolve(response); + } else if (responseType === "json" && typeof response === "string") { + try { + deferred.resolve(JSON.parse(response)); + } catch (e) { + deferred.reject(e); + } + } else if ((browserResponseType === "" || browserResponseType === "document") && defined_default(xhr.responseXML) && xhr.responseXML.hasChildNodes()) { + deferred.resolve(xhr.responseXML); + } else if ((browserResponseType === "" || browserResponseType === "text") && defined_default(xhr.responseText)) { + deferred.resolve(xhr.responseText); + } else { + deferred.reject( + new RuntimeError_default("Invalid XMLHttpRequest response type.") + ); + } + }; + xhr.onerror = function(e) { + deferred.reject(new RequestErrorEvent_default()); + }; + xhr.send(data); + return xhr; +}; +Resource._Implementations.loadAndExecuteScript = function(url, functionName, deferred) { + return loadAndExecuteScript_default(url, functionName).catch(function(e) { + deferred.reject(e); + }); +}; +Resource._DefaultImplementations = {}; +Resource._DefaultImplementations.createImage = Resource._Implementations.createImage; +Resource._DefaultImplementations.loadWithXhr = Resource._Implementations.loadWithXhr; +Resource._DefaultImplementations.loadAndExecuteScript = Resource._Implementations.loadAndExecuteScript; +Resource.DEFAULT = Object.freeze( + new Resource({ + url: typeof document === "undefined" ? "" : document.location.href.split("?")[0] + }) +); +var Resource_default = Resource; + +// packages/engine/Source/Core/EarthOrientationParameters.js +function EarthOrientationParameters(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this._dates = void 0; + this._samples = void 0; + this._dateColumn = -1; + this._xPoleWanderRadiansColumn = -1; + this._yPoleWanderRadiansColumn = -1; + this._ut1MinusUtcSecondsColumn = -1; + this._xCelestialPoleOffsetRadiansColumn = -1; + this._yCelestialPoleOffsetRadiansColumn = -1; + this._taiMinusUtcSecondsColumn = -1; + this._columnCount = 0; + this._lastIndex = -1; + this._addNewLeapSeconds = defaultValue_default(options.addNewLeapSeconds, true); + if (defined_default(options.data)) { + onDataReady(this, options.data); + } else { + onDataReady(this, { + columnNames: [ + "dateIso8601", + "modifiedJulianDateUtc", + "xPoleWanderRadians", + "yPoleWanderRadians", + "ut1MinusUtcSeconds", + "lengthOfDayCorrectionSeconds", + "xCelestialPoleOffsetRadians", + "yCelestialPoleOffsetRadians", + "taiMinusUtcSeconds" + ], + samples: [] + }); + } +} +EarthOrientationParameters.fromUrl = async function(url, options) { + Check_default.defined("url", url); + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const resource = Resource_default.createIfNeeded(url); + let eopData; + try { + eopData = await resource.fetchJson(); + } catch (e) { + throw new RuntimeError_default( + `An error occurred while retrieving the EOP data from the URL ${resource.url}.` + ); + } + return new EarthOrientationParameters({ + addNewLeapSeconds: options.addNewLeapSeconds, + data: eopData + }); +}; +EarthOrientationParameters.NONE = Object.freeze({ + compute: function(date, result) { + if (!defined_default(result)) { + result = new EarthOrientationParametersSample_default(0, 0, 0, 0, 0); + } else { + result.xPoleWander = 0; + result.yPoleWander = 0; + result.xPoleOffset = 0; + result.yPoleOffset = 0; + result.ut1MinusUtc = 0; + } + return result; + } +}); +EarthOrientationParameters.prototype.compute = function(date, result) { + if (!defined_default(this._samples)) { + return void 0; + } + if (!defined_default(result)) { + result = new EarthOrientationParametersSample_default(0, 0, 0, 0, 0); + } + if (this._samples.length === 0) { + result.xPoleWander = 0; + result.yPoleWander = 0; + result.xPoleOffset = 0; + result.yPoleOffset = 0; + result.ut1MinusUtc = 0; + return result; + } + const dates = this._dates; + const lastIndex = this._lastIndex; + let before = 0; + let after = 0; + if (defined_default(lastIndex)) { + const previousIndexDate = dates[lastIndex]; + const nextIndexDate = dates[lastIndex + 1]; + const isAfterPrevious = JulianDate_default.lessThanOrEquals( + previousIndexDate, + date + ); + const isAfterLastSample = !defined_default(nextIndexDate); + const isBeforeNext = isAfterLastSample || JulianDate_default.greaterThanOrEquals(nextIndexDate, date); + if (isAfterPrevious && isBeforeNext) { + before = lastIndex; + if (!isAfterLastSample && nextIndexDate.equals(date)) { + ++before; + } + after = before + 1; + interpolate(this, dates, this._samples, date, before, after, result); + return result; + } + } + let index = binarySearch_default(dates, date, JulianDate_default.compare, this._dateColumn); + if (index >= 0) { + if (index < dates.length - 1 && dates[index + 1].equals(date)) { + ++index; + } + before = index; + after = index; + } else { + after = ~index; + before = after - 1; + if (before < 0) { + before = 0; + } + } + this._lastIndex = before; + interpolate(this, dates, this._samples, date, before, after, result); + return result; +}; +function compareLeapSecondDates2(leapSecond, dateToFind) { + return JulianDate_default.compare(leapSecond.julianDate, dateToFind); +} +function onDataReady(eop, eopData) { + if (!defined_default(eopData.columnNames)) { + throw new RuntimeError_default( + "Error in loaded EOP data: The columnNames property is required." + ); + } + if (!defined_default(eopData.samples)) { + throw new RuntimeError_default( + "Error in loaded EOP data: The samples property is required." + ); + } + const dateColumn = eopData.columnNames.indexOf("modifiedJulianDateUtc"); + const xPoleWanderRadiansColumn = eopData.columnNames.indexOf( + "xPoleWanderRadians" + ); + const yPoleWanderRadiansColumn = eopData.columnNames.indexOf( + "yPoleWanderRadians" + ); + const ut1MinusUtcSecondsColumn = eopData.columnNames.indexOf( + "ut1MinusUtcSeconds" + ); + const xCelestialPoleOffsetRadiansColumn = eopData.columnNames.indexOf( + "xCelestialPoleOffsetRadians" + ); + const yCelestialPoleOffsetRadiansColumn = eopData.columnNames.indexOf( + "yCelestialPoleOffsetRadians" + ); + const taiMinusUtcSecondsColumn = eopData.columnNames.indexOf( + "taiMinusUtcSeconds" + ); + if (dateColumn < 0 || xPoleWanderRadiansColumn < 0 || yPoleWanderRadiansColumn < 0 || ut1MinusUtcSecondsColumn < 0 || xCelestialPoleOffsetRadiansColumn < 0 || yCelestialPoleOffsetRadiansColumn < 0 || taiMinusUtcSecondsColumn < 0) { + throw new RuntimeError_default( + "Error in loaded EOP data: The columnNames property must include modifiedJulianDateUtc, xPoleWanderRadians, yPoleWanderRadians, ut1MinusUtcSeconds, xCelestialPoleOffsetRadians, yCelestialPoleOffsetRadians, and taiMinusUtcSeconds columns" + ); + } + const samples = eop._samples = eopData.samples; + const dates = eop._dates = []; + eop._dateColumn = dateColumn; + eop._xPoleWanderRadiansColumn = xPoleWanderRadiansColumn; + eop._yPoleWanderRadiansColumn = yPoleWanderRadiansColumn; + eop._ut1MinusUtcSecondsColumn = ut1MinusUtcSecondsColumn; + eop._xCelestialPoleOffsetRadiansColumn = xCelestialPoleOffsetRadiansColumn; + eop._yCelestialPoleOffsetRadiansColumn = yCelestialPoleOffsetRadiansColumn; + eop._taiMinusUtcSecondsColumn = taiMinusUtcSecondsColumn; + eop._columnCount = eopData.columnNames.length; + eop._lastIndex = void 0; + let lastTaiMinusUtc; + const addNewLeapSeconds = eop._addNewLeapSeconds; + for (let i = 0, len = samples.length; i < len; i += eop._columnCount) { + const mjd = samples[i + dateColumn]; + const taiMinusUtc = samples[i + taiMinusUtcSecondsColumn]; + const day = mjd + TimeConstants_default.MODIFIED_JULIAN_DATE_DIFFERENCE; + const date = new JulianDate_default(day, taiMinusUtc, TimeStandard_default.TAI); + dates.push(date); + if (addNewLeapSeconds) { + if (taiMinusUtc !== lastTaiMinusUtc && defined_default(lastTaiMinusUtc)) { + const leapSeconds = JulianDate_default.leapSeconds; + const leapSecondIndex = binarySearch_default( + leapSeconds, + date, + compareLeapSecondDates2 + ); + if (leapSecondIndex < 0) { + const leapSecond = new LeapSecond_default(date, taiMinusUtc); + leapSeconds.splice(~leapSecondIndex, 0, leapSecond); + } + } + lastTaiMinusUtc = taiMinusUtc; + } + } +} +function fillResultFromIndex(eop, samples, index, columnCount, result) { + const start = index * columnCount; + result.xPoleWander = samples[start + eop._xPoleWanderRadiansColumn]; + result.yPoleWander = samples[start + eop._yPoleWanderRadiansColumn]; + result.xPoleOffset = samples[start + eop._xCelestialPoleOffsetRadiansColumn]; + result.yPoleOffset = samples[start + eop._yCelestialPoleOffsetRadiansColumn]; + result.ut1MinusUtc = samples[start + eop._ut1MinusUtcSecondsColumn]; +} +function linearInterp(dx, y1, y2) { + return y1 + dx * (y2 - y1); +} +function interpolate(eop, dates, samples, date, before, after, result) { + const columnCount = eop._columnCount; + if (after > dates.length - 1) { + result.xPoleWander = 0; + result.yPoleWander = 0; + result.xPoleOffset = 0; + result.yPoleOffset = 0; + result.ut1MinusUtc = 0; + return result; + } + const beforeDate = dates[before]; + const afterDate = dates[after]; + if (beforeDate.equals(afterDate) || date.equals(beforeDate)) { + fillResultFromIndex(eop, samples, before, columnCount, result); + return result; + } else if (date.equals(afterDate)) { + fillResultFromIndex(eop, samples, after, columnCount, result); + return result; + } + const factor = JulianDate_default.secondsDifference(date, beforeDate) / JulianDate_default.secondsDifference(afterDate, beforeDate); + const startBefore = before * columnCount; + const startAfter = after * columnCount; + let beforeUt1MinusUtc = samples[startBefore + eop._ut1MinusUtcSecondsColumn]; + let afterUt1MinusUtc = samples[startAfter + eop._ut1MinusUtcSecondsColumn]; + const offsetDifference = afterUt1MinusUtc - beforeUt1MinusUtc; + if (offsetDifference > 0.5 || offsetDifference < -0.5) { + const beforeTaiMinusUtc = samples[startBefore + eop._taiMinusUtcSecondsColumn]; + const afterTaiMinusUtc = samples[startAfter + eop._taiMinusUtcSecondsColumn]; + if (beforeTaiMinusUtc !== afterTaiMinusUtc) { + if (afterDate.equals(date)) { + beforeUt1MinusUtc = afterUt1MinusUtc; + } else { + afterUt1MinusUtc -= afterTaiMinusUtc - beforeTaiMinusUtc; + } + } + } + result.xPoleWander = linearInterp( + factor, + samples[startBefore + eop._xPoleWanderRadiansColumn], + samples[startAfter + eop._xPoleWanderRadiansColumn] + ); + result.yPoleWander = linearInterp( + factor, + samples[startBefore + eop._yPoleWanderRadiansColumn], + samples[startAfter + eop._yPoleWanderRadiansColumn] + ); + result.xPoleOffset = linearInterp( + factor, + samples[startBefore + eop._xCelestialPoleOffsetRadiansColumn], + samples[startAfter + eop._xCelestialPoleOffsetRadiansColumn] + ); + result.yPoleOffset = linearInterp( + factor, + samples[startBefore + eop._yCelestialPoleOffsetRadiansColumn], + samples[startAfter + eop._yCelestialPoleOffsetRadiansColumn] + ); + result.ut1MinusUtc = linearInterp( + factor, + beforeUt1MinusUtc, + afterUt1MinusUtc + ); + return result; +} +var EarthOrientationParameters_default = EarthOrientationParameters; + +// packages/engine/Source/Core/HeadingPitchRoll.js +function HeadingPitchRoll(heading, pitch, roll) { + this.heading = defaultValue_default(heading, 0); + this.pitch = defaultValue_default(pitch, 0); + this.roll = defaultValue_default(roll, 0); +} +HeadingPitchRoll.fromQuaternion = function(quaternion, result) { + if (!defined_default(quaternion)) { + throw new DeveloperError_default("quaternion is required"); + } + if (!defined_default(result)) { + result = new HeadingPitchRoll(); + } + const test = 2 * (quaternion.w * quaternion.y - quaternion.z * quaternion.x); + const denominatorRoll = 1 - 2 * (quaternion.x * quaternion.x + quaternion.y * quaternion.y); + const numeratorRoll = 2 * (quaternion.w * quaternion.x + quaternion.y * quaternion.z); + const denominatorHeading = 1 - 2 * (quaternion.y * quaternion.y + quaternion.z * quaternion.z); + const numeratorHeading = 2 * (quaternion.w * quaternion.z + quaternion.x * quaternion.y); + result.heading = -Math.atan2(numeratorHeading, denominatorHeading); + result.roll = Math.atan2(numeratorRoll, denominatorRoll); + result.pitch = -Math_default.asinClamped(test); + return result; +}; +HeadingPitchRoll.fromDegrees = function(heading, pitch, roll, result) { + if (!defined_default(heading)) { + throw new DeveloperError_default("heading is required"); + } + if (!defined_default(pitch)) { + throw new DeveloperError_default("pitch is required"); + } + if (!defined_default(roll)) { + throw new DeveloperError_default("roll is required"); + } + if (!defined_default(result)) { + result = new HeadingPitchRoll(); + } + result.heading = heading * Math_default.RADIANS_PER_DEGREE; + result.pitch = pitch * Math_default.RADIANS_PER_DEGREE; + result.roll = roll * Math_default.RADIANS_PER_DEGREE; + return result; +}; +HeadingPitchRoll.clone = function(headingPitchRoll, result) { + if (!defined_default(headingPitchRoll)) { + return void 0; + } + if (!defined_default(result)) { + return new HeadingPitchRoll( + headingPitchRoll.heading, + headingPitchRoll.pitch, + headingPitchRoll.roll + ); + } + result.heading = headingPitchRoll.heading; + result.pitch = headingPitchRoll.pitch; + result.roll = headingPitchRoll.roll; + return result; +}; +HeadingPitchRoll.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.heading === right.heading && left.pitch === right.pitch && left.roll === right.roll; +}; +HeadingPitchRoll.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) { + return left === right || defined_default(left) && defined_default(right) && Math_default.equalsEpsilon( + left.heading, + right.heading, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.pitch, + right.pitch, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.roll, + right.roll, + relativeEpsilon, + absoluteEpsilon + ); +}; +HeadingPitchRoll.prototype.clone = function(result) { + return HeadingPitchRoll.clone(this, result); +}; +HeadingPitchRoll.prototype.equals = function(right) { + return HeadingPitchRoll.equals(this, right); +}; +HeadingPitchRoll.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) { + return HeadingPitchRoll.equalsEpsilon( + this, + right, + relativeEpsilon, + absoluteEpsilon + ); +}; +HeadingPitchRoll.prototype.toString = function() { + return `(${this.heading}, ${this.pitch}, ${this.roll})`; +}; +var HeadingPitchRoll_default = HeadingPitchRoll; + +// packages/engine/Source/Core/buildModuleUrl.js +var cesiumScriptRegex = /((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/; +function getBaseUrlFromCesiumScript() { + const scripts = document.getElementsByTagName("script"); + for (let i = 0, len = scripts.length; i < len; ++i) { + const src = scripts[i].getAttribute("src"); + const result = cesiumScriptRegex.exec(src); + if (result !== null) { + return result[1]; + } + } + return void 0; +} +var a2; +function tryMakeAbsolute(url) { + if (typeof document === "undefined") { + return url; + } + if (!defined_default(a2)) { + a2 = document.createElement("a"); + } + a2.href = url; + return a2.href; +} +var baseResource; +function getCesiumBaseUrl() { + if (defined_default(baseResource)) { + return baseResource; + } + let baseUrlString; + if (typeof CESIUM_BASE_URL !== "undefined") { + baseUrlString = CESIUM_BASE_URL; + } else if (defined_default(import.meta?.url)) { + baseUrlString = getAbsoluteUri_default(".", import.meta.url); + } else if (typeof define === "object" && defined_default(define.amd) && !define.amd.toUrlUndefined && defined_default(__require.toUrl)) { + baseUrlString = getAbsoluteUri_default( + "..", + buildModuleUrl("Core/buildModuleUrl.js") + ); + } else { + baseUrlString = getBaseUrlFromCesiumScript(); + } + if (!defined_default(baseUrlString)) { + throw new DeveloperError_default( + "Unable to determine Cesium base URL automatically, try defining a global variable called CESIUM_BASE_URL." + ); + } + baseResource = new Resource_default({ + url: tryMakeAbsolute(baseUrlString) + }); + baseResource.appendForwardSlash(); + return baseResource; +} +function buildModuleUrlFromRequireToUrl(moduleID) { + return tryMakeAbsolute(__require.toUrl(`../${moduleID}`)); +} +function buildModuleUrlFromBaseUrl(moduleID) { + const resource = getCesiumBaseUrl().getDerivedResource({ + url: moduleID + }); + return resource.url; +} +var implementation; +function buildModuleUrl(relativeUrl) { + if (!defined_default(implementation)) { + if (typeof define === "object" && defined_default(define.amd) && !define.amd.toUrlUndefined && defined_default(__require.toUrl)) { + implementation = buildModuleUrlFromRequireToUrl; + } else { + implementation = buildModuleUrlFromBaseUrl; + } + } + const url = implementation(relativeUrl); + return url; +} +buildModuleUrl._cesiumScriptRegex = cesiumScriptRegex; +buildModuleUrl._buildModuleUrlFromBaseUrl = buildModuleUrlFromBaseUrl; +buildModuleUrl._clearBaseResource = function() { + baseResource = void 0; +}; +buildModuleUrl.setBaseUrl = function(value) { + baseResource = Resource_default.DEFAULT.getDerivedResource({ + url: value + }); +}; +buildModuleUrl.getCesiumBaseUrl = getCesiumBaseUrl; +var buildModuleUrl_default = buildModuleUrl; + +// packages/engine/Source/Core/Iau2006XysSample.js +function Iau2006XysSample(x, y, s) { + this.x = x; + this.y = y; + this.s = s; +} +var Iau2006XysSample_default = Iau2006XysSample; + +// packages/engine/Source/Core/Iau2006XysData.js +function Iau2006XysData(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this._xysFileUrlTemplate = Resource_default.createIfNeeded( + options.xysFileUrlTemplate + ); + this._interpolationOrder = defaultValue_default(options.interpolationOrder, 9); + this._sampleZeroJulianEphemerisDate = defaultValue_default( + options.sampleZeroJulianEphemerisDate, + 24423965e-1 + ); + this._sampleZeroDateTT = new JulianDate_default( + this._sampleZeroJulianEphemerisDate, + 0, + TimeStandard_default.TAI + ); + this._stepSizeDays = defaultValue_default(options.stepSizeDays, 1); + this._samplesPerXysFile = defaultValue_default(options.samplesPerXysFile, 1e3); + this._totalSamples = defaultValue_default(options.totalSamples, 27426); + this._samples = new Array(this._totalSamples * 3); + this._chunkDownloadsInProgress = []; + const order = this._interpolationOrder; + const denom = this._denominators = new Array(order + 1); + const xTable = this._xTable = new Array(order + 1); + const stepN = Math.pow(this._stepSizeDays, order); + for (let i = 0; i <= order; ++i) { + denom[i] = stepN; + xTable[i] = i * this._stepSizeDays; + for (let j = 0; j <= order; ++j) { + if (j !== i) { + denom[i] *= i - j; + } + } + denom[i] = 1 / denom[i]; + } + this._work = new Array(order + 1); + this._coef = new Array(order + 1); +} +var julianDateScratch = new JulianDate_default(0, 0, TimeStandard_default.TAI); +function getDaysSinceEpoch(xys, dayTT, secondTT) { + const dateTT = julianDateScratch; + dateTT.dayNumber = dayTT; + dateTT.secondsOfDay = secondTT; + return JulianDate_default.daysDifference(dateTT, xys._sampleZeroDateTT); +} +Iau2006XysData.prototype.preload = function(startDayTT, startSecondTT, stopDayTT, stopSecondTT) { + const startDaysSinceEpoch = getDaysSinceEpoch( + this, + startDayTT, + startSecondTT + ); + const stopDaysSinceEpoch = getDaysSinceEpoch(this, stopDayTT, stopSecondTT); + let startIndex = startDaysSinceEpoch / this._stepSizeDays - this._interpolationOrder / 2 | 0; + if (startIndex < 0) { + startIndex = 0; + } + let stopIndex = stopDaysSinceEpoch / this._stepSizeDays - this._interpolationOrder / 2 | 0 + this._interpolationOrder; + if (stopIndex >= this._totalSamples) { + stopIndex = this._totalSamples - 1; + } + const startChunk = startIndex / this._samplesPerXysFile | 0; + const stopChunk = stopIndex / this._samplesPerXysFile | 0; + const promises = []; + for (let i = startChunk; i <= stopChunk; ++i) { + promises.push(requestXysChunk(this, i)); + } + return Promise.all(promises); +}; +Iau2006XysData.prototype.computeXysRadians = function(dayTT, secondTT, result) { + const daysSinceEpoch = getDaysSinceEpoch(this, dayTT, secondTT); + if (daysSinceEpoch < 0) { + return void 0; + } + const centerIndex = daysSinceEpoch / this._stepSizeDays | 0; + if (centerIndex >= this._totalSamples) { + return void 0; + } + const degree = this._interpolationOrder; + let firstIndex = centerIndex - (degree / 2 | 0); + if (firstIndex < 0) { + firstIndex = 0; + } + let lastIndex = firstIndex + degree; + if (lastIndex >= this._totalSamples) { + lastIndex = this._totalSamples - 1; + firstIndex = lastIndex - degree; + if (firstIndex < 0) { + firstIndex = 0; + } + } + let isDataMissing = false; + const samples = this._samples; + if (!defined_default(samples[firstIndex * 3])) { + requestXysChunk(this, firstIndex / this._samplesPerXysFile | 0); + isDataMissing = true; + } + if (!defined_default(samples[lastIndex * 3])) { + requestXysChunk(this, lastIndex / this._samplesPerXysFile | 0); + isDataMissing = true; + } + if (isDataMissing) { + return void 0; + } + if (!defined_default(result)) { + result = new Iau2006XysSample_default(0, 0, 0); + } else { + result.x = 0; + result.y = 0; + result.s = 0; + } + const x = daysSinceEpoch - firstIndex * this._stepSizeDays; + const work = this._work; + const denom = this._denominators; + const coef = this._coef; + const xTable = this._xTable; + let i, j; + for (i = 0; i <= degree; ++i) { + work[i] = x - xTable[i]; + } + for (i = 0; i <= degree; ++i) { + coef[i] = 1; + for (j = 0; j <= degree; ++j) { + if (j !== i) { + coef[i] *= work[j]; + } + } + coef[i] *= denom[i]; + let sampleIndex = (firstIndex + i) * 3; + result.x += coef[i] * samples[sampleIndex++]; + result.y += coef[i] * samples[sampleIndex++]; + result.s += coef[i] * samples[sampleIndex]; + } + return result; +}; +function requestXysChunk(xysData, chunkIndex) { + if (xysData._chunkDownloadsInProgress[chunkIndex]) { + return xysData._chunkDownloadsInProgress[chunkIndex]; + } + let chunkUrl; + const xysFileUrlTemplate = xysData._xysFileUrlTemplate; + if (defined_default(xysFileUrlTemplate)) { + chunkUrl = xysFileUrlTemplate.getDerivedResource({ + templateValues: { + 0: chunkIndex + } + }); + } else { + chunkUrl = new Resource_default({ + url: buildModuleUrl_default(`Assets/IAU2006_XYS/IAU2006_XYS_${chunkIndex}.json`) + }); + } + const promise = chunkUrl.fetchJson().then(function(chunk) { + xysData._chunkDownloadsInProgress[chunkIndex] = false; + const samples = xysData._samples; + const newSamples = chunk.samples; + const startIndex = chunkIndex * xysData._samplesPerXysFile * 3; + for (let i = 0, len = newSamples.length; i < len; ++i) { + samples[startIndex + i] = newSamples[i]; + } + }); + xysData._chunkDownloadsInProgress[chunkIndex] = promise; + return promise; +} +var Iau2006XysData_default = Iau2006XysData; + +// packages/engine/Source/Core/Quaternion.js +function Quaternion(x, y, z, w) { + this.x = defaultValue_default(x, 0); + this.y = defaultValue_default(y, 0); + this.z = defaultValue_default(z, 0); + this.w = defaultValue_default(w, 0); +} +var fromAxisAngleScratch = new Cartesian3_default(); +Quaternion.fromAxisAngle = function(axis, angle, result) { + Check_default.typeOf.object("axis", axis); + Check_default.typeOf.number("angle", angle); + const halfAngle = angle / 2; + const s = Math.sin(halfAngle); + fromAxisAngleScratch = Cartesian3_default.normalize(axis, fromAxisAngleScratch); + const x = fromAxisAngleScratch.x * s; + const y = fromAxisAngleScratch.y * s; + const z = fromAxisAngleScratch.z * s; + const w = Math.cos(halfAngle); + if (!defined_default(result)) { + return new Quaternion(x, y, z, w); + } + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +var fromRotationMatrixNext = [1, 2, 0]; +var fromRotationMatrixQuat = new Array(3); +Quaternion.fromRotationMatrix = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + let root; + let x; + let y; + let z; + let w; + const m00 = matrix[Matrix3_default.COLUMN0ROW0]; + const m11 = matrix[Matrix3_default.COLUMN1ROW1]; + const m22 = matrix[Matrix3_default.COLUMN2ROW2]; + const trace = m00 + m11 + m22; + if (trace > 0) { + root = Math.sqrt(trace + 1); + w = 0.5 * root; + root = 0.5 / root; + x = (matrix[Matrix3_default.COLUMN1ROW2] - matrix[Matrix3_default.COLUMN2ROW1]) * root; + y = (matrix[Matrix3_default.COLUMN2ROW0] - matrix[Matrix3_default.COLUMN0ROW2]) * root; + z = (matrix[Matrix3_default.COLUMN0ROW1] - matrix[Matrix3_default.COLUMN1ROW0]) * root; + } else { + const next = fromRotationMatrixNext; + let i = 0; + if (m11 > m00) { + i = 1; + } + if (m22 > m00 && m22 > m11) { + i = 2; + } + const j = next[i]; + const k = next[j]; + root = Math.sqrt( + matrix[Matrix3_default.getElementIndex(i, i)] - matrix[Matrix3_default.getElementIndex(j, j)] - matrix[Matrix3_default.getElementIndex(k, k)] + 1 + ); + const quat = fromRotationMatrixQuat; + quat[i] = 0.5 * root; + root = 0.5 / root; + w = (matrix[Matrix3_default.getElementIndex(k, j)] - matrix[Matrix3_default.getElementIndex(j, k)]) * root; + quat[j] = (matrix[Matrix3_default.getElementIndex(j, i)] + matrix[Matrix3_default.getElementIndex(i, j)]) * root; + quat[k] = (matrix[Matrix3_default.getElementIndex(k, i)] + matrix[Matrix3_default.getElementIndex(i, k)]) * root; + x = -quat[0]; + y = -quat[1]; + z = -quat[2]; + } + if (!defined_default(result)) { + return new Quaternion(x, y, z, w); + } + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +var scratchHPRQuaternion = new Quaternion(); +var scratchHeadingQuaternion = new Quaternion(); +var scratchPitchQuaternion = new Quaternion(); +var scratchRollQuaternion = new Quaternion(); +Quaternion.fromHeadingPitchRoll = function(headingPitchRoll, result) { + Check_default.typeOf.object("headingPitchRoll", headingPitchRoll); + scratchRollQuaternion = Quaternion.fromAxisAngle( + Cartesian3_default.UNIT_X, + headingPitchRoll.roll, + scratchHPRQuaternion + ); + scratchPitchQuaternion = Quaternion.fromAxisAngle( + Cartesian3_default.UNIT_Y, + -headingPitchRoll.pitch, + result + ); + result = Quaternion.multiply( + scratchPitchQuaternion, + scratchRollQuaternion, + scratchPitchQuaternion + ); + scratchHeadingQuaternion = Quaternion.fromAxisAngle( + Cartesian3_default.UNIT_Z, + -headingPitchRoll.heading, + scratchHPRQuaternion + ); + return Quaternion.multiply(scratchHeadingQuaternion, result, result); +}; +var sampledQuaternionAxis = new Cartesian3_default(); +var sampledQuaternionRotation = new Cartesian3_default(); +var sampledQuaternionTempQuaternion = new Quaternion(); +var sampledQuaternionQuaternion0 = new Quaternion(); +var sampledQuaternionQuaternion0Conjugate = new Quaternion(); +Quaternion.packedLength = 4; +Quaternion.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.x; + array[startingIndex++] = value.y; + array[startingIndex++] = value.z; + array[startingIndex] = value.w; + return array; +}; +Quaternion.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Quaternion(); + } + result.x = array[startingIndex]; + result.y = array[startingIndex + 1]; + result.z = array[startingIndex + 2]; + result.w = array[startingIndex + 3]; + return result; +}; +Quaternion.packedInterpolationLength = 3; +Quaternion.convertPackedArrayForInterpolation = function(packedArray, startingIndex, lastIndex, result) { + Quaternion.unpack( + packedArray, + lastIndex * 4, + sampledQuaternionQuaternion0Conjugate + ); + Quaternion.conjugate( + sampledQuaternionQuaternion0Conjugate, + sampledQuaternionQuaternion0Conjugate + ); + for (let i = 0, len = lastIndex - startingIndex + 1; i < len; i++) { + const offset = i * 3; + Quaternion.unpack( + packedArray, + (startingIndex + i) * 4, + sampledQuaternionTempQuaternion + ); + Quaternion.multiply( + sampledQuaternionTempQuaternion, + sampledQuaternionQuaternion0Conjugate, + sampledQuaternionTempQuaternion + ); + if (sampledQuaternionTempQuaternion.w < 0) { + Quaternion.negate( + sampledQuaternionTempQuaternion, + sampledQuaternionTempQuaternion + ); + } + Quaternion.computeAxis( + sampledQuaternionTempQuaternion, + sampledQuaternionAxis + ); + const angle = Quaternion.computeAngle(sampledQuaternionTempQuaternion); + if (!defined_default(result)) { + result = []; + } + result[offset] = sampledQuaternionAxis.x * angle; + result[offset + 1] = sampledQuaternionAxis.y * angle; + result[offset + 2] = sampledQuaternionAxis.z * angle; + } +}; +Quaternion.unpackInterpolationResult = function(array, sourceArray, firstIndex, lastIndex, result) { + if (!defined_default(result)) { + result = new Quaternion(); + } + Cartesian3_default.fromArray(array, 0, sampledQuaternionRotation); + const magnitude = Cartesian3_default.magnitude(sampledQuaternionRotation); + Quaternion.unpack(sourceArray, lastIndex * 4, sampledQuaternionQuaternion0); + if (magnitude === 0) { + Quaternion.clone(Quaternion.IDENTITY, sampledQuaternionTempQuaternion); + } else { + Quaternion.fromAxisAngle( + sampledQuaternionRotation, + magnitude, + sampledQuaternionTempQuaternion + ); + } + return Quaternion.multiply( + sampledQuaternionTempQuaternion, + sampledQuaternionQuaternion0, + result + ); +}; +Quaternion.clone = function(quaternion, result) { + if (!defined_default(quaternion)) { + return void 0; + } + if (!defined_default(result)) { + return new Quaternion( + quaternion.x, + quaternion.y, + quaternion.z, + quaternion.w + ); + } + result.x = quaternion.x; + result.y = quaternion.y; + result.z = quaternion.z; + result.w = quaternion.w; + return result; +}; +Quaternion.conjugate = function(quaternion, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.object("result", result); + result.x = -quaternion.x; + result.y = -quaternion.y; + result.z = -quaternion.z; + result.w = quaternion.w; + return result; +}; +Quaternion.magnitudeSquared = function(quaternion) { + Check_default.typeOf.object("quaternion", quaternion); + return quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w; +}; +Quaternion.magnitude = function(quaternion) { + return Math.sqrt(Quaternion.magnitudeSquared(quaternion)); +}; +Quaternion.normalize = function(quaternion, result) { + Check_default.typeOf.object("result", result); + const inverseMagnitude = 1 / Quaternion.magnitude(quaternion); + const x = quaternion.x * inverseMagnitude; + const y = quaternion.y * inverseMagnitude; + const z = quaternion.z * inverseMagnitude; + const w = quaternion.w * inverseMagnitude; + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Quaternion.inverse = function(quaternion, result) { + Check_default.typeOf.object("result", result); + const magnitudeSquared = Quaternion.magnitudeSquared(quaternion); + result = Quaternion.conjugate(quaternion, result); + return Quaternion.multiplyByScalar(result, 1 / magnitudeSquared, result); +}; +Quaternion.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x + right.x; + result.y = left.y + right.y; + result.z = left.z + right.z; + result.w = left.w + right.w; + return result; +}; +Quaternion.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x - right.x; + result.y = left.y - right.y; + result.z = left.z - right.z; + result.w = left.w - right.w; + return result; +}; +Quaternion.negate = function(quaternion, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.object("result", result); + result.x = -quaternion.x; + result.y = -quaternion.y; + result.z = -quaternion.z; + result.w = -quaternion.w; + return result; +}; +Quaternion.dot = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; +}; +Quaternion.multiply = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const leftX = left.x; + const leftY = left.y; + const leftZ = left.z; + const leftW = left.w; + const rightX = right.x; + const rightY = right.y; + const rightZ = right.z; + const rightW = right.w; + const x = leftW * rightX + leftX * rightW + leftY * rightZ - leftZ * rightY; + const y = leftW * rightY - leftX * rightZ + leftY * rightW + leftZ * rightX; + const z = leftW * rightZ + leftX * rightY - leftY * rightX + leftZ * rightW; + const w = leftW * rightW - leftX * rightX - leftY * rightY - leftZ * rightZ; + result.x = x; + result.y = y; + result.z = z; + result.w = w; + return result; +}; +Quaternion.multiplyByScalar = function(quaternion, scalar, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = quaternion.x * scalar; + result.y = quaternion.y * scalar; + result.z = quaternion.z * scalar; + result.w = quaternion.w * scalar; + return result; +}; +Quaternion.divideByScalar = function(quaternion, scalar, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = quaternion.x / scalar; + result.y = quaternion.y / scalar; + result.z = quaternion.z / scalar; + result.w = quaternion.w / scalar; + return result; +}; +Quaternion.computeAxis = function(quaternion, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.object("result", result); + const w = quaternion.w; + if (Math.abs(w - 1) < Math_default.EPSILON6 || Math.abs(w + 1) < Math_default.EPSILON6) { + result.x = 1; + result.y = result.z = 0; + return result; + } + const scalar = 1 / Math.sqrt(1 - w * w); + result.x = quaternion.x * scalar; + result.y = quaternion.y * scalar; + result.z = quaternion.z * scalar; + return result; +}; +Quaternion.computeAngle = function(quaternion) { + Check_default.typeOf.object("quaternion", quaternion); + if (Math.abs(quaternion.w - 1) < Math_default.EPSILON6) { + return 0; + } + return 2 * Math.acos(quaternion.w); +}; +var lerpScratch2 = new Quaternion(); +Quaternion.lerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + lerpScratch2 = Quaternion.multiplyByScalar(end, t, lerpScratch2); + result = Quaternion.multiplyByScalar(start, 1 - t, result); + return Quaternion.add(lerpScratch2, result, result); +}; +var slerpEndNegated = new Quaternion(); +var slerpScaledP = new Quaternion(); +var slerpScaledR = new Quaternion(); +Quaternion.slerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + let dot = Quaternion.dot(start, end); + let r = end; + if (dot < 0) { + dot = -dot; + r = slerpEndNegated = Quaternion.negate(end, slerpEndNegated); + } + if (1 - dot < Math_default.EPSILON6) { + return Quaternion.lerp(start, r, t, result); + } + const theta = Math.acos(dot); + slerpScaledP = Quaternion.multiplyByScalar( + start, + Math.sin((1 - t) * theta), + slerpScaledP + ); + slerpScaledR = Quaternion.multiplyByScalar( + r, + Math.sin(t * theta), + slerpScaledR + ); + result = Quaternion.add(slerpScaledP, slerpScaledR, result); + return Quaternion.multiplyByScalar(result, 1 / Math.sin(theta), result); +}; +Quaternion.log = function(quaternion, result) { + Check_default.typeOf.object("quaternion", quaternion); + Check_default.typeOf.object("result", result); + const theta = Math_default.acosClamped(quaternion.w); + let thetaOverSinTheta = 0; + if (theta !== 0) { + thetaOverSinTheta = theta / Math.sin(theta); + } + return Cartesian3_default.multiplyByScalar(quaternion, thetaOverSinTheta, result); +}; +Quaternion.exp = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const theta = Cartesian3_default.magnitude(cartesian); + let sinThetaOverTheta = 0; + if (theta !== 0) { + sinThetaOverTheta = Math.sin(theta) / theta; + } + result.x = cartesian.x * sinThetaOverTheta; + result.y = cartesian.y * sinThetaOverTheta; + result.z = cartesian.z * sinThetaOverTheta; + result.w = Math.cos(theta); + return result; +}; +var squadScratchCartesian0 = new Cartesian3_default(); +var squadScratchCartesian1 = new Cartesian3_default(); +var squadScratchQuaternion0 = new Quaternion(); +var squadScratchQuaternion1 = new Quaternion(); +Quaternion.computeInnerQuadrangle = function(q0, q1, q2, result) { + Check_default.typeOf.object("q0", q0); + Check_default.typeOf.object("q1", q1); + Check_default.typeOf.object("q2", q2); + Check_default.typeOf.object("result", result); + const qInv = Quaternion.conjugate(q1, squadScratchQuaternion0); + Quaternion.multiply(qInv, q2, squadScratchQuaternion1); + const cart0 = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian0); + Quaternion.multiply(qInv, q0, squadScratchQuaternion1); + const cart1 = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian1); + Cartesian3_default.add(cart0, cart1, cart0); + Cartesian3_default.multiplyByScalar(cart0, 0.25, cart0); + Cartesian3_default.negate(cart0, cart0); + Quaternion.exp(cart0, squadScratchQuaternion0); + return Quaternion.multiply(q1, squadScratchQuaternion0, result); +}; +Quaternion.squad = function(q0, q1, s0, s1, t, result) { + Check_default.typeOf.object("q0", q0); + Check_default.typeOf.object("q1", q1); + Check_default.typeOf.object("s0", s0); + Check_default.typeOf.object("s1", s1); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + const slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0); + const slerp1 = Quaternion.slerp(s0, s1, t, squadScratchQuaternion1); + return Quaternion.slerp(slerp0, slerp1, 2 * t * (1 - t), result); +}; +var fastSlerpScratchQuaternion = new Quaternion(); +var opmu = 1.9011074535173003; +var u = FeatureDetection_default.supportsTypedArrays() ? new Float32Array(8) : []; +var v = FeatureDetection_default.supportsTypedArrays() ? new Float32Array(8) : []; +var bT = FeatureDetection_default.supportsTypedArrays() ? new Float32Array(8) : []; +var bD = FeatureDetection_default.supportsTypedArrays() ? new Float32Array(8) : []; +for (let i = 0; i < 7; ++i) { + const s = i + 1; + const t = 2 * s + 1; + u[i] = 1 / (s * t); + v[i] = s / t; +} +u[7] = opmu / (8 * 17); +v[7] = opmu * 8 / 17; +Quaternion.fastSlerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + let x = Quaternion.dot(start, end); + let sign; + if (x >= 0) { + sign = 1; + } else { + sign = -1; + x = -x; + } + const xm1 = x - 1; + const d = 1 - t; + const sqrT = t * t; + const sqrD = d * d; + for (let i = 7; i >= 0; --i) { + bT[i] = (u[i] * sqrT - v[i]) * xm1; + bD[i] = (u[i] * sqrD - v[i]) * xm1; + } + const cT = sign * t * (1 + bT[0] * (1 + bT[1] * (1 + bT[2] * (1 + bT[3] * (1 + bT[4] * (1 + bT[5] * (1 + bT[6] * (1 + bT[7])))))))); + const cD = d * (1 + bD[0] * (1 + bD[1] * (1 + bD[2] * (1 + bD[3] * (1 + bD[4] * (1 + bD[5] * (1 + bD[6] * (1 + bD[7])))))))); + const temp = Quaternion.multiplyByScalar( + start, + cD, + fastSlerpScratchQuaternion + ); + Quaternion.multiplyByScalar(end, cT, result); + return Quaternion.add(temp, result, result); +}; +Quaternion.fastSquad = function(q0, q1, s0, s1, t, result) { + Check_default.typeOf.object("q0", q0); + Check_default.typeOf.object("q1", q1); + Check_default.typeOf.object("s0", s0); + Check_default.typeOf.object("s1", s1); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + const slerp0 = Quaternion.fastSlerp(q0, q1, t, squadScratchQuaternion0); + const slerp1 = Quaternion.fastSlerp(s0, s1, t, squadScratchQuaternion1); + return Quaternion.fastSlerp(slerp0, slerp1, 2 * t * (1 - t), result); +}; +Quaternion.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.x === right.x && left.y === right.y && left.z === right.z && left.w === right.w; +}; +Quaternion.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left.x - right.x) <= epsilon && Math.abs(left.y - right.y) <= epsilon && Math.abs(left.z - right.z) <= epsilon && Math.abs(left.w - right.w) <= epsilon; +}; +Quaternion.ZERO = Object.freeze(new Quaternion(0, 0, 0, 0)); +Quaternion.IDENTITY = Object.freeze(new Quaternion(0, 0, 0, 1)); +Quaternion.prototype.clone = function(result) { + return Quaternion.clone(this, result); +}; +Quaternion.prototype.equals = function(right) { + return Quaternion.equals(this, right); +}; +Quaternion.prototype.equalsEpsilon = function(right, epsilon) { + return Quaternion.equalsEpsilon(this, right, epsilon); +}; +Quaternion.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`; +}; +var Quaternion_default = Quaternion; + +// packages/engine/Source/Core/Transforms.js +var Transforms = {}; +var vectorProductLocalFrame = { + up: { + south: "east", + north: "west", + west: "south", + east: "north" + }, + down: { + south: "west", + north: "east", + west: "north", + east: "south" + }, + south: { + up: "west", + down: "east", + west: "down", + east: "up" + }, + north: { + up: "east", + down: "west", + west: "up", + east: "down" + }, + west: { + up: "north", + down: "south", + north: "down", + south: "up" + }, + east: { + up: "south", + down: "north", + north: "up", + south: "down" + } +}; +var degeneratePositionLocalFrame = { + north: [-1, 0, 0], + east: [0, 1, 0], + up: [0, 0, 1], + south: [1, 0, 0], + west: [0, -1, 0], + down: [0, 0, -1] +}; +var localFrameToFixedFrameCache = {}; +var scratchCalculateCartesian = { + east: new Cartesian3_default(), + north: new Cartesian3_default(), + up: new Cartesian3_default(), + west: new Cartesian3_default(), + south: new Cartesian3_default(), + down: new Cartesian3_default() +}; +var scratchFirstCartesian = new Cartesian3_default(); +var scratchSecondCartesian = new Cartesian3_default(); +var scratchThirdCartesian = new Cartesian3_default(); +Transforms.localFrameToFixedFrameGenerator = function(firstAxis, secondAxis) { + if (!vectorProductLocalFrame.hasOwnProperty(firstAxis) || !vectorProductLocalFrame[firstAxis].hasOwnProperty(secondAxis)) { + throw new DeveloperError_default( + "firstAxis and secondAxis must be east, north, up, west, south or down." + ); + } + const thirdAxis = vectorProductLocalFrame[firstAxis][secondAxis]; + let resultat; + const hashAxis = firstAxis + secondAxis; + if (defined_default(localFrameToFixedFrameCache[hashAxis])) { + resultat = localFrameToFixedFrameCache[hashAxis]; + } else { + resultat = function(origin, ellipsoid, result) { + if (!defined_default(origin)) { + throw new DeveloperError_default("origin is required."); + } + if (isNaN(origin.x) || isNaN(origin.y) || isNaN(origin.z)) { + throw new DeveloperError_default("origin has a NaN component"); + } + if (!defined_default(result)) { + result = new Matrix4_default(); + } + if (Cartesian3_default.equalsEpsilon(origin, Cartesian3_default.ZERO, Math_default.EPSILON14)) { + Cartesian3_default.unpack( + degeneratePositionLocalFrame[firstAxis], + 0, + scratchFirstCartesian + ); + Cartesian3_default.unpack( + degeneratePositionLocalFrame[secondAxis], + 0, + scratchSecondCartesian + ); + Cartesian3_default.unpack( + degeneratePositionLocalFrame[thirdAxis], + 0, + scratchThirdCartesian + ); + } else if (Math_default.equalsEpsilon(origin.x, 0, Math_default.EPSILON14) && Math_default.equalsEpsilon(origin.y, 0, Math_default.EPSILON14)) { + const sign = Math_default.sign(origin.z); + Cartesian3_default.unpack( + degeneratePositionLocalFrame[firstAxis], + 0, + scratchFirstCartesian + ); + if (firstAxis !== "east" && firstAxis !== "west") { + Cartesian3_default.multiplyByScalar( + scratchFirstCartesian, + sign, + scratchFirstCartesian + ); + } + Cartesian3_default.unpack( + degeneratePositionLocalFrame[secondAxis], + 0, + scratchSecondCartesian + ); + if (secondAxis !== "east" && secondAxis !== "west") { + Cartesian3_default.multiplyByScalar( + scratchSecondCartesian, + sign, + scratchSecondCartesian + ); + } + Cartesian3_default.unpack( + degeneratePositionLocalFrame[thirdAxis], + 0, + scratchThirdCartesian + ); + if (thirdAxis !== "east" && thirdAxis !== "west") { + Cartesian3_default.multiplyByScalar( + scratchThirdCartesian, + sign, + scratchThirdCartesian + ); + } + } else { + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + ellipsoid.geodeticSurfaceNormal(origin, scratchCalculateCartesian.up); + const up = scratchCalculateCartesian.up; + const east = scratchCalculateCartesian.east; + east.x = -origin.y; + east.y = origin.x; + east.z = 0; + Cartesian3_default.normalize(east, scratchCalculateCartesian.east); + Cartesian3_default.cross(up, east, scratchCalculateCartesian.north); + Cartesian3_default.multiplyByScalar( + scratchCalculateCartesian.up, + -1, + scratchCalculateCartesian.down + ); + Cartesian3_default.multiplyByScalar( + scratchCalculateCartesian.east, + -1, + scratchCalculateCartesian.west + ); + Cartesian3_default.multiplyByScalar( + scratchCalculateCartesian.north, + -1, + scratchCalculateCartesian.south + ); + scratchFirstCartesian = scratchCalculateCartesian[firstAxis]; + scratchSecondCartesian = scratchCalculateCartesian[secondAxis]; + scratchThirdCartesian = scratchCalculateCartesian[thirdAxis]; + } + result[0] = scratchFirstCartesian.x; + result[1] = scratchFirstCartesian.y; + result[2] = scratchFirstCartesian.z; + result[3] = 0; + result[4] = scratchSecondCartesian.x; + result[5] = scratchSecondCartesian.y; + result[6] = scratchSecondCartesian.z; + result[7] = 0; + result[8] = scratchThirdCartesian.x; + result[9] = scratchThirdCartesian.y; + result[10] = scratchThirdCartesian.z; + result[11] = 0; + result[12] = origin.x; + result[13] = origin.y; + result[14] = origin.z; + result[15] = 1; + return result; + }; + localFrameToFixedFrameCache[hashAxis] = resultat; + } + return resultat; +}; +Transforms.eastNorthUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "east", + "north" +); +Transforms.northEastDownToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "east" +); +Transforms.northUpEastToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "up" +); +Transforms.northWestUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator( + "north", + "west" +); +var scratchHPRQuaternion2 = new Quaternion_default(); +var scratchScale = new Cartesian3_default(1, 1, 1); +var scratchHPRMatrix4 = new Matrix4_default(); +Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result) { + Check_default.typeOf.object("HeadingPitchRoll", headingPitchRoll); + fixedFrameTransform = defaultValue_default( + fixedFrameTransform, + Transforms.eastNorthUpToFixedFrame + ); + const hprQuaternion = Quaternion_default.fromHeadingPitchRoll( + headingPitchRoll, + scratchHPRQuaternion2 + ); + const hprMatrix = Matrix4_default.fromTranslationQuaternionRotationScale( + Cartesian3_default.ZERO, + hprQuaternion, + scratchScale, + scratchHPRMatrix4 + ); + result = fixedFrameTransform(origin, ellipsoid, result); + return Matrix4_default.multiply(result, hprMatrix, result); +}; +var scratchENUMatrix4 = new Matrix4_default(); +var scratchHPRMatrix3 = new Matrix3_default(); +Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result) { + Check_default.typeOf.object("HeadingPitchRoll", headingPitchRoll); + const transform = Transforms.headingPitchRollToFixedFrame( + origin, + headingPitchRoll, + ellipsoid, + fixedFrameTransform, + scratchENUMatrix4 + ); + const rotation = Matrix4_default.getMatrix3(transform, scratchHPRMatrix3); + return Quaternion_default.fromRotationMatrix(rotation, result); +}; +var noScale = new Cartesian3_default(1, 1, 1); +var hprCenterScratch = new Cartesian3_default(); +var ffScratch = new Matrix4_default(); +var hprTransformScratch = new Matrix4_default(); +var hprRotationScratch = new Matrix3_default(); +var hprQuaternionScratch = new Quaternion_default(); +Transforms.fixedFrameToHeadingPitchRoll = function(transform, ellipsoid, fixedFrameTransform, result) { + Check_default.defined("transform", transform); + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + fixedFrameTransform = defaultValue_default( + fixedFrameTransform, + Transforms.eastNorthUpToFixedFrame + ); + if (!defined_default(result)) { + result = new HeadingPitchRoll_default(); + } + const center = Matrix4_default.getTranslation(transform, hprCenterScratch); + if (Cartesian3_default.equals(center, Cartesian3_default.ZERO)) { + result.heading = 0; + result.pitch = 0; + result.roll = 0; + return result; + } + let toFixedFrame = Matrix4_default.inverseTransformation( + fixedFrameTransform(center, ellipsoid, ffScratch), + ffScratch + ); + let transformCopy = Matrix4_default.setScale(transform, noScale, hprTransformScratch); + transformCopy = Matrix4_default.setTranslation( + transformCopy, + Cartesian3_default.ZERO, + transformCopy + ); + toFixedFrame = Matrix4_default.multiply(toFixedFrame, transformCopy, toFixedFrame); + let quaternionRotation = Quaternion_default.fromRotationMatrix( + Matrix4_default.getMatrix3(toFixedFrame, hprRotationScratch), + hprQuaternionScratch + ); + quaternionRotation = Quaternion_default.normalize( + quaternionRotation, + quaternionRotation + ); + return HeadingPitchRoll_default.fromQuaternion(quaternionRotation, result); +}; +var gmstConstant0 = 6 * 3600 + 41 * 60 + 50.54841; +var gmstConstant1 = 8640184812866e-6; +var gmstConstant2 = 0.093104; +var gmstConstant3 = -62e-7; +var rateCoef = 11772758384668e-32; +var wgs84WRPrecessing = 72921158553e-15; +var twoPiOverSecondsInDay = Math_default.TWO_PI / 86400; +var dateInUtc = new JulianDate_default(); +Transforms.computeIcrfToCentralBodyFixedMatrix = function(date, result) { + let transformMatrix = Transforms.computeIcrfToFixedMatrix(date, result); + if (!defined_default(transformMatrix)) { + transformMatrix = Transforms.computeTemeToPseudoFixedMatrix(date, result); + } + return transformMatrix; +}; +Transforms.computeTemeToPseudoFixedMatrix = function(date, result) { + if (!defined_default(date)) { + throw new DeveloperError_default("date is required."); + } + dateInUtc = JulianDate_default.addSeconds( + date, + -JulianDate_default.computeTaiMinusUtc(date), + dateInUtc + ); + const utcDayNumber = dateInUtc.dayNumber; + const utcSecondsIntoDay = dateInUtc.secondsOfDay; + let t; + const diffDays = utcDayNumber - 2451545; + if (utcSecondsIntoDay >= 43200) { + t = (diffDays + 0.5) / TimeConstants_default.DAYS_PER_JULIAN_CENTURY; + } else { + t = (diffDays - 0.5) / TimeConstants_default.DAYS_PER_JULIAN_CENTURY; + } + const gmst0 = gmstConstant0 + t * (gmstConstant1 + t * (gmstConstant2 + t * gmstConstant3)); + const angle = gmst0 * twoPiOverSecondsInDay % Math_default.TWO_PI; + const ratio = wgs84WRPrecessing + rateCoef * (utcDayNumber - 24515455e-1); + const secondsSinceMidnight = (utcSecondsIntoDay + TimeConstants_default.SECONDS_PER_DAY * 0.5) % TimeConstants_default.SECONDS_PER_DAY; + const gha = angle + ratio * secondsSinceMidnight; + const cosGha = Math.cos(gha); + const sinGha = Math.sin(gha); + if (!defined_default(result)) { + return new Matrix3_default( + cosGha, + sinGha, + 0, + -sinGha, + cosGha, + 0, + 0, + 0, + 1 + ); + } + result[0] = cosGha; + result[1] = -sinGha; + result[2] = 0; + result[3] = sinGha; + result[4] = cosGha; + result[5] = 0; + result[6] = 0; + result[7] = 0; + result[8] = 1; + return result; +}; +Transforms.iau2006XysData = new Iau2006XysData_default(); +Transforms.earthOrientationParameters = EarthOrientationParameters_default.NONE; +var ttMinusTai = 32.184; +var j2000ttDays = 2451545; +Transforms.preloadIcrfFixed = function(timeInterval) { + const startDayTT = timeInterval.start.dayNumber; + const startSecondTT = timeInterval.start.secondsOfDay + ttMinusTai; + const stopDayTT = timeInterval.stop.dayNumber; + const stopSecondTT = timeInterval.stop.secondsOfDay + ttMinusTai; + return Transforms.iau2006XysData.preload( + startDayTT, + startSecondTT, + stopDayTT, + stopSecondTT + ); +}; +Transforms.computeIcrfToFixedMatrix = function(date, result) { + if (!defined_default(date)) { + throw new DeveloperError_default("date is required."); + } + if (!defined_default(result)) { + result = new Matrix3_default(); + } + const fixedToIcrfMtx = Transforms.computeFixedToIcrfMatrix(date, result); + if (!defined_default(fixedToIcrfMtx)) { + return void 0; + } + return Matrix3_default.transpose(fixedToIcrfMtx, result); +}; +var TdtMinusTai = 32.184; +var J2000d = 2451545; +var scratchHpr = new HeadingPitchRoll_default(); +var scratchRotationMatrix = new Matrix3_default(); +var dateScratch = new JulianDate_default(); +Transforms.computeMoonFixedToIcrfMatrix = function(date, result) { + if (!defined_default(date)) { + throw new DeveloperError_default("date is required."); + } + if (!defined_default(result)) { + result = new Matrix3_default(); + } + const secondsTT = JulianDate_default.addSeconds(date, TdtMinusTai, dateScratch); + const d = JulianDate_default.totalDays(secondsTT) - J2000d; + const e1 = Math_default.toRadians(12.112) - Math_default.toRadians(0.052992) * d; + const e2 = Math_default.toRadians(24.224) - Math_default.toRadians(0.105984) * d; + const e3 = Math_default.toRadians(227.645) + Math_default.toRadians(13.012) * d; + const e4 = Math_default.toRadians(261.105) + Math_default.toRadians(13.340716) * d; + const e5 = Math_default.toRadians(358) + Math_default.toRadians(0.9856) * d; + scratchHpr.pitch = Math_default.toRadians(270 - 90) - Math_default.toRadians(3.878) * Math.sin(e1) - Math_default.toRadians(0.12) * Math.sin(e2) + Math_default.toRadians(0.07) * Math.sin(e3) - Math_default.toRadians(0.017) * Math.sin(e4); + scratchHpr.roll = Math_default.toRadians(66.53 - 90) + Math_default.toRadians(1.543) * Math.cos(e1) + Math_default.toRadians(0.24) * Math.cos(e2) - Math_default.toRadians(0.028) * Math.cos(e3) + Math_default.toRadians(7e-3) * Math.cos(e4); + scratchHpr.heading = Math_default.toRadians(244.375 - 90) + Math_default.toRadians(13.17635831) * d + Math_default.toRadians(3.558) * Math.sin(e1) + Math_default.toRadians(0.121) * Math.sin(e2) - Math_default.toRadians(0.064) * Math.sin(e3) + Math_default.toRadians(0.016) * Math.sin(e4) + Math_default.toRadians(0.025) * Math.sin(e5); + return Matrix3_default.fromHeadingPitchRoll(scratchHpr, scratchRotationMatrix); +}; +Transforms.computeIcrfToMoonFixedMatrix = function(date, result) { + if (!defined_default(date)) { + throw new DeveloperError_default("date is required."); + } + if (!defined_default(result)) { + result = new Matrix3_default(); + } + const fixedToIcrfMtx = Transforms.computeMoonFixedToIcrfMatrix(date, result); + if (!defined_default(fixedToIcrfMtx)) { + return void 0; + } + return Matrix3_default.transpose(fixedToIcrfMtx, result); +}; +var xysScratch = new Iau2006XysSample_default(0, 0, 0); +var eopScratch = new EarthOrientationParametersSample_default( + 0, + 0, + 0, + 0, + 0, + 0 +); +var rotation1Scratch = new Matrix3_default(); +var rotation2Scratch = new Matrix3_default(); +Transforms.computeFixedToIcrfMatrix = function(date, result) { + if (!defined_default(date)) { + throw new DeveloperError_default("date is required."); + } + if (!defined_default(result)) { + result = new Matrix3_default(); + } + const eop = Transforms.earthOrientationParameters.compute(date, eopScratch); + if (!defined_default(eop)) { + return void 0; + } + const dayTT = date.dayNumber; + const secondTT = date.secondsOfDay + ttMinusTai; + const xys = Transforms.iau2006XysData.computeXysRadians( + dayTT, + secondTT, + xysScratch + ); + if (!defined_default(xys)) { + return void 0; + } + const x = xys.x + eop.xPoleOffset; + const y = xys.y + eop.yPoleOffset; + const a3 = 1 / (1 + Math.sqrt(1 - x * x - y * y)); + const rotation1 = rotation1Scratch; + rotation1[0] = 1 - a3 * x * x; + rotation1[3] = -a3 * x * y; + rotation1[6] = x; + rotation1[1] = -a3 * x * y; + rotation1[4] = 1 - a3 * y * y; + rotation1[7] = y; + rotation1[2] = -x; + rotation1[5] = -y; + rotation1[8] = 1 - a3 * (x * x + y * y); + const rotation2 = Matrix3_default.fromRotationZ(-xys.s, rotation2Scratch); + const matrixQ = Matrix3_default.multiply(rotation1, rotation2, rotation1Scratch); + const dateUt1day = date.dayNumber; + const dateUt1sec = date.secondsOfDay - JulianDate_default.computeTaiMinusUtc(date) + eop.ut1MinusUtc; + const daysSinceJ2000 = dateUt1day - 2451545; + const fractionOfDay = dateUt1sec / TimeConstants_default.SECONDS_PER_DAY; + let era = 0.779057273264 + fractionOfDay + 0.00273781191135448 * (daysSinceJ2000 + fractionOfDay); + era = era % 1 * Math_default.TWO_PI; + const earthRotation = Matrix3_default.fromRotationZ(era, rotation2Scratch); + const pfToIcrf = Matrix3_default.multiply(matrixQ, earthRotation, rotation1Scratch); + const cosxp = Math.cos(eop.xPoleWander); + const cosyp = Math.cos(eop.yPoleWander); + const sinxp = Math.sin(eop.xPoleWander); + const sinyp = Math.sin(eop.yPoleWander); + let ttt = dayTT - j2000ttDays + secondTT / TimeConstants_default.SECONDS_PER_DAY; + ttt /= 36525; + const sp = -47e-6 * ttt * Math_default.RADIANS_PER_DEGREE / 3600; + const cossp = Math.cos(sp); + const sinsp = Math.sin(sp); + const fToPfMtx = rotation2Scratch; + fToPfMtx[0] = cosxp * cossp; + fToPfMtx[1] = cosxp * sinsp; + fToPfMtx[2] = sinxp; + fToPfMtx[3] = -cosyp * sinsp + sinyp * sinxp * cossp; + fToPfMtx[4] = cosyp * cossp + sinyp * sinxp * sinsp; + fToPfMtx[5] = -sinyp * cosxp; + fToPfMtx[6] = -sinyp * sinsp - cosyp * sinxp * cossp; + fToPfMtx[7] = sinyp * cossp - cosyp * sinxp * sinsp; + fToPfMtx[8] = cosyp * cosxp; + return Matrix3_default.multiply(pfToIcrf, fToPfMtx, result); +}; +var pointToWindowCoordinatesTemp = new Cartesian4_default(); +Transforms.pointToWindowCoordinates = function(modelViewProjectionMatrix, viewportTransformation, point, result) { + result = Transforms.pointToGLWindowCoordinates( + modelViewProjectionMatrix, + viewportTransformation, + point, + result + ); + result.y = 2 * viewportTransformation[5] - result.y; + return result; +}; +Transforms.pointToGLWindowCoordinates = function(modelViewProjectionMatrix, viewportTransformation, point, result) { + if (!defined_default(modelViewProjectionMatrix)) { + throw new DeveloperError_default("modelViewProjectionMatrix is required."); + } + if (!defined_default(viewportTransformation)) { + throw new DeveloperError_default("viewportTransformation is required."); + } + if (!defined_default(point)) { + throw new DeveloperError_default("point is required."); + } + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + const tmp = pointToWindowCoordinatesTemp; + Matrix4_default.multiplyByVector( + modelViewProjectionMatrix, + Cartesian4_default.fromElements(point.x, point.y, point.z, 1, tmp), + tmp + ); + Cartesian4_default.multiplyByScalar(tmp, 1 / tmp.w, tmp); + Matrix4_default.multiplyByVector(viewportTransformation, tmp, tmp); + return Cartesian2_default.fromCartesian4(tmp, result); +}; +var normalScratch = new Cartesian3_default(); +var rightScratch = new Cartesian3_default(); +var upScratch = new Cartesian3_default(); +Transforms.rotationMatrixFromPositionVelocity = function(position, velocity, ellipsoid, result) { + if (!defined_default(position)) { + throw new DeveloperError_default("position is required."); + } + if (!defined_default(velocity)) { + throw new DeveloperError_default("velocity is required."); + } + const normal = defaultValue_default( + ellipsoid, + Ellipsoid_default.default + ).geodeticSurfaceNormal(position, normalScratch); + let right = Cartesian3_default.cross(velocity, normal, rightScratch); + if (Cartesian3_default.equalsEpsilon(right, Cartesian3_default.ZERO, Math_default.EPSILON6)) { + right = Cartesian3_default.clone(Cartesian3_default.UNIT_X, right); + } + const up = Cartesian3_default.cross(right, velocity, upScratch); + Cartesian3_default.normalize(up, up); + Cartesian3_default.cross(velocity, up, right); + Cartesian3_default.negate(right, right); + Cartesian3_default.normalize(right, right); + if (!defined_default(result)) { + result = new Matrix3_default(); + } + result[0] = velocity.x; + result[1] = velocity.y; + result[2] = velocity.z; + result[3] = right.x; + result[4] = right.y; + result[5] = right.z; + result[6] = up.x; + result[7] = up.y; + result[8] = up.z; + return result; +}; +var swizzleMatrix = new Matrix4_default( + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 +); +var scratchCartographic = new Cartographic_default(); +var scratchCartesian3Projection = new Cartesian3_default(); +var scratchCenter = new Cartesian3_default(); +var scratchRotation = new Matrix3_default(); +var scratchFromENU = new Matrix4_default(); +var scratchToENU = new Matrix4_default(); +Transforms.basisTo2D = function(projection, matrix, result) { + if (!defined_default(projection)) { + throw new DeveloperError_default("projection is required."); + } + if (!defined_default(matrix)) { + throw new DeveloperError_default("matrix is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + const rtcCenter = Matrix4_default.getTranslation(matrix, scratchCenter); + const ellipsoid = projection.ellipsoid; + let projectedPosition; + if (Cartesian3_default.equals(rtcCenter, Cartesian3_default.ZERO)) { + projectedPosition = Cartesian3_default.clone( + Cartesian3_default.ZERO, + scratchCartesian3Projection + ); + } else { + const cartographic = ellipsoid.cartesianToCartographic( + rtcCenter, + scratchCartographic + ); + projectedPosition = projection.project( + cartographic, + scratchCartesian3Projection + ); + Cartesian3_default.fromElements( + projectedPosition.z, + projectedPosition.x, + projectedPosition.y, + projectedPosition + ); + } + const fromENU = Transforms.eastNorthUpToFixedFrame( + rtcCenter, + ellipsoid, + scratchFromENU + ); + const toENU = Matrix4_default.inverseTransformation(fromENU, scratchToENU); + const rotation = Matrix4_default.getMatrix3(matrix, scratchRotation); + const local = Matrix4_default.multiplyByMatrix3(toENU, rotation, result); + Matrix4_default.multiply(swizzleMatrix, local, result); + Matrix4_default.setTranslation(result, projectedPosition, result); + return result; +}; +Transforms.ellipsoidTo2DModelMatrix = function(projection, center, result) { + if (!defined_default(projection)) { + throw new DeveloperError_default("projection is required."); + } + if (!defined_default(center)) { + throw new DeveloperError_default("center is required."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("result is required."); + } + const ellipsoid = projection.ellipsoid; + const fromENU = Transforms.eastNorthUpToFixedFrame( + center, + ellipsoid, + scratchFromENU + ); + const toENU = Matrix4_default.inverseTransformation(fromENU, scratchToENU); + const cartographic = ellipsoid.cartesianToCartographic( + center, + scratchCartographic + ); + const projectedPosition = projection.project( + cartographic, + scratchCartesian3Projection + ); + Cartesian3_default.fromElements( + projectedPosition.z, + projectedPosition.x, + projectedPosition.y, + projectedPosition + ); + const translation = Matrix4_default.fromTranslation( + projectedPosition, + scratchFromENU + ); + Matrix4_default.multiply(swizzleMatrix, toENU, result); + Matrix4_default.multiply(translation, result, result); + return result; +}; +var Transforms_default = Transforms; + +// packages/engine/Source/Core/Rectangle.js +function Rectangle(west, south, east, north) { + this.west = defaultValue_default(west, 0); + this.south = defaultValue_default(south, 0); + this.east = defaultValue_default(east, 0); + this.north = defaultValue_default(north, 0); +} +Object.defineProperties(Rectangle.prototype, { + /** + * Gets the width of the rectangle in radians. + * @memberof Rectangle.prototype + * @type {number} + * @readonly + */ + width: { + get: function() { + return Rectangle.computeWidth(this); + } + }, + /** + * Gets the height of the rectangle in radians. + * @memberof Rectangle.prototype + * @type {number} + * @readonly + */ + height: { + get: function() { + return Rectangle.computeHeight(this); + } + } +}); +Rectangle.packedLength = 4; +Rectangle.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.west; + array[startingIndex++] = value.south; + array[startingIndex++] = value.east; + array[startingIndex] = value.north; + return array; +}; +Rectangle.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Rectangle(); + } + result.west = array[startingIndex++]; + result.south = array[startingIndex++]; + result.east = array[startingIndex++]; + result.north = array[startingIndex]; + return result; +}; +Rectangle.computeWidth = function(rectangle) { + Check_default.typeOf.object("rectangle", rectangle); + let east = rectangle.east; + const west = rectangle.west; + if (east < west) { + east += Math_default.TWO_PI; + } + return east - west; +}; +Rectangle.computeHeight = function(rectangle) { + Check_default.typeOf.object("rectangle", rectangle); + return rectangle.north - rectangle.south; +}; +Rectangle.fromDegrees = function(west, south, east, north, result) { + west = Math_default.toRadians(defaultValue_default(west, 0)); + south = Math_default.toRadians(defaultValue_default(south, 0)); + east = Math_default.toRadians(defaultValue_default(east, 0)); + north = Math_default.toRadians(defaultValue_default(north, 0)); + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +Rectangle.fromRadians = function(west, south, east, north, result) { + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = defaultValue_default(west, 0); + result.south = defaultValue_default(south, 0); + result.east = defaultValue_default(east, 0); + result.north = defaultValue_default(north, 0); + return result; +}; +Rectangle.fromCartographicArray = function(cartographics, result) { + Check_default.defined("cartographics", cartographics); + let west = Number.MAX_VALUE; + let east = -Number.MAX_VALUE; + let westOverIDL = Number.MAX_VALUE; + let eastOverIDL = -Number.MAX_VALUE; + let south = Number.MAX_VALUE; + let north = -Number.MAX_VALUE; + for (let i = 0, len = cartographics.length; i < len; i++) { + const position = cartographics[i]; + west = Math.min(west, position.longitude); + east = Math.max(east, position.longitude); + south = Math.min(south, position.latitude); + north = Math.max(north, position.latitude); + const lonAdjusted = position.longitude >= 0 ? position.longitude : position.longitude + Math_default.TWO_PI; + westOverIDL = Math.min(westOverIDL, lonAdjusted); + eastOverIDL = Math.max(eastOverIDL, lonAdjusted); + } + if (east - west > eastOverIDL - westOverIDL) { + west = westOverIDL; + east = eastOverIDL; + if (east > Math_default.PI) { + east = east - Math_default.TWO_PI; + } + if (west > Math_default.PI) { + west = west - Math_default.TWO_PI; + } + } + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) { + Check_default.defined("cartesians", cartesians); + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + let west = Number.MAX_VALUE; + let east = -Number.MAX_VALUE; + let westOverIDL = Number.MAX_VALUE; + let eastOverIDL = -Number.MAX_VALUE; + let south = Number.MAX_VALUE; + let north = -Number.MAX_VALUE; + for (let i = 0, len = cartesians.length; i < len; i++) { + const position = ellipsoid.cartesianToCartographic(cartesians[i]); + west = Math.min(west, position.longitude); + east = Math.max(east, position.longitude); + south = Math.min(south, position.latitude); + north = Math.max(north, position.latitude); + const lonAdjusted = position.longitude >= 0 ? position.longitude : position.longitude + Math_default.TWO_PI; + westOverIDL = Math.min(westOverIDL, lonAdjusted); + eastOverIDL = Math.max(eastOverIDL, lonAdjusted); + } + if (east - west > eastOverIDL - westOverIDL) { + west = westOverIDL; + east = eastOverIDL; + if (east > Math_default.PI) { + east = east - Math_default.TWO_PI; + } + if (west > Math_default.PI) { + west = west - Math_default.TWO_PI; + } + } + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +var fromBoundingSphereMatrixScratch = new Cartesian3_default(); +var fromBoundingSphereEastScratch = new Cartesian3_default(); +var fromBoundingSphereNorthScratch = new Cartesian3_default(); +var fromBoundingSphereWestScratch = new Cartesian3_default(); +var fromBoundingSphereSouthScratch = new Cartesian3_default(); +var fromBoundingSpherePositionsScratch = new Array(5); +for (let n = 0; n < fromBoundingSpherePositionsScratch.length; ++n) { + fromBoundingSpherePositionsScratch[n] = new Cartesian3_default(); +} +Rectangle.fromBoundingSphere = function(boundingSphere, ellipsoid, result) { + Check_default.typeOf.object("boundingSphere", boundingSphere); + const center = boundingSphere.center; + const radius = boundingSphere.radius; + if (!defined_default(ellipsoid)) { + ellipsoid = Ellipsoid_default.default; + } + if (!defined_default(result)) { + result = new Rectangle(); + } + if (Cartesian3_default.equals(center, Cartesian3_default.ZERO)) { + Rectangle.clone(Rectangle.MAX_VALUE, result); + return result; + } + const fromENU = Transforms_default.eastNorthUpToFixedFrame( + center, + ellipsoid, + fromBoundingSphereMatrixScratch + ); + const east = Matrix4_default.multiplyByPointAsVector( + fromENU, + Cartesian3_default.UNIT_X, + fromBoundingSphereEastScratch + ); + Cartesian3_default.normalize(east, east); + const north = Matrix4_default.multiplyByPointAsVector( + fromENU, + Cartesian3_default.UNIT_Y, + fromBoundingSphereNorthScratch + ); + Cartesian3_default.normalize(north, north); + Cartesian3_default.multiplyByScalar(north, radius, north); + Cartesian3_default.multiplyByScalar(east, radius, east); + const south = Cartesian3_default.negate(north, fromBoundingSphereSouthScratch); + const west = Cartesian3_default.negate(east, fromBoundingSphereWestScratch); + const positions = fromBoundingSpherePositionsScratch; + let corner = positions[0]; + Cartesian3_default.add(center, north, corner); + corner = positions[1]; + Cartesian3_default.add(center, west, corner); + corner = positions[2]; + Cartesian3_default.add(center, south, corner); + corner = positions[3]; + Cartesian3_default.add(center, east, corner); + positions[4] = center; + return Rectangle.fromCartesianArray(positions, ellipsoid, result); +}; +Rectangle.clone = function(rectangle, result) { + if (!defined_default(rectangle)) { + return void 0; + } + if (!defined_default(result)) { + return new Rectangle( + rectangle.west, + rectangle.south, + rectangle.east, + rectangle.north + ); + } + result.west = rectangle.west; + result.south = rectangle.south; + result.east = rectangle.east; + result.north = rectangle.north; + return result; +}; +Rectangle.equalsEpsilon = function(left, right, absoluteEpsilon) { + absoluteEpsilon = defaultValue_default(absoluteEpsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left.west - right.west) <= absoluteEpsilon && Math.abs(left.south - right.south) <= absoluteEpsilon && Math.abs(left.east - right.east) <= absoluteEpsilon && Math.abs(left.north - right.north) <= absoluteEpsilon; +}; +Rectangle.prototype.clone = function(result) { + return Rectangle.clone(this, result); +}; +Rectangle.prototype.equals = function(other) { + return Rectangle.equals(this, other); +}; +Rectangle.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.west === right.west && left.south === right.south && left.east === right.east && left.north === right.north; +}; +Rectangle.prototype.equalsEpsilon = function(other, epsilon) { + return Rectangle.equalsEpsilon(this, other, epsilon); +}; +Rectangle.validate = function(rectangle) { + Check_default.typeOf.object("rectangle", rectangle); + const north = rectangle.north; + Check_default.typeOf.number.greaterThanOrEquals( + "north", + north, + -Math_default.PI_OVER_TWO + ); + Check_default.typeOf.number.lessThanOrEquals("north", north, Math_default.PI_OVER_TWO); + const south = rectangle.south; + Check_default.typeOf.number.greaterThanOrEquals( + "south", + south, + -Math_default.PI_OVER_TWO + ); + Check_default.typeOf.number.lessThanOrEquals("south", south, Math_default.PI_OVER_TWO); + const west = rectangle.west; + Check_default.typeOf.number.greaterThanOrEquals("west", west, -Math.PI); + Check_default.typeOf.number.lessThanOrEquals("west", west, Math.PI); + const east = rectangle.east; + Check_default.typeOf.number.greaterThanOrEquals("east", east, -Math.PI); + Check_default.typeOf.number.lessThanOrEquals("east", east, Math.PI); +}; +Rectangle.southwest = function(rectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + if (!defined_default(result)) { + return new Cartographic_default(rectangle.west, rectangle.south); + } + result.longitude = rectangle.west; + result.latitude = rectangle.south; + result.height = 0; + return result; +}; +Rectangle.northwest = function(rectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + if (!defined_default(result)) { + return new Cartographic_default(rectangle.west, rectangle.north); + } + result.longitude = rectangle.west; + result.latitude = rectangle.north; + result.height = 0; + return result; +}; +Rectangle.northeast = function(rectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + if (!defined_default(result)) { + return new Cartographic_default(rectangle.east, rectangle.north); + } + result.longitude = rectangle.east; + result.latitude = rectangle.north; + result.height = 0; + return result; +}; +Rectangle.southeast = function(rectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + if (!defined_default(result)) { + return new Cartographic_default(rectangle.east, rectangle.south); + } + result.longitude = rectangle.east; + result.latitude = rectangle.south; + result.height = 0; + return result; +}; +Rectangle.center = function(rectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + let east = rectangle.east; + const west = rectangle.west; + if (east < west) { + east += Math_default.TWO_PI; + } + const longitude = Math_default.negativePiToPi((west + east) * 0.5); + const latitude = (rectangle.south + rectangle.north) * 0.5; + if (!defined_default(result)) { + return new Cartographic_default(longitude, latitude); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = 0; + return result; +}; +Rectangle.intersection = function(rectangle, otherRectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("otherRectangle", otherRectangle); + let rectangleEast = rectangle.east; + let rectangleWest = rectangle.west; + let otherRectangleEast = otherRectangle.east; + let otherRectangleWest = otherRectangle.west; + if (rectangleEast < rectangleWest && otherRectangleEast > 0) { + rectangleEast += Math_default.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0) { + otherRectangleEast += Math_default.TWO_PI; + } + if (rectangleEast < rectangleWest && otherRectangleWest < 0) { + otherRectangleWest += Math_default.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0) { + rectangleWest += Math_default.TWO_PI; + } + const west = Math_default.negativePiToPi( + Math.max(rectangleWest, otherRectangleWest) + ); + const east = Math_default.negativePiToPi( + Math.min(rectangleEast, otherRectangleEast) + ); + if ((rectangle.west < rectangle.east || otherRectangle.west < otherRectangle.east) && east <= west) { + return void 0; + } + const south = Math.max(rectangle.south, otherRectangle.south); + const north = Math.min(rectangle.north, otherRectangle.north); + if (south >= north) { + return void 0; + } + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +Rectangle.simpleIntersection = function(rectangle, otherRectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("otherRectangle", otherRectangle); + const west = Math.max(rectangle.west, otherRectangle.west); + const south = Math.max(rectangle.south, otherRectangle.south); + const east = Math.min(rectangle.east, otherRectangle.east); + const north = Math.min(rectangle.north, otherRectangle.north); + if (south >= north || west >= east) { + return void 0; + } + if (!defined_default(result)) { + return new Rectangle(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +Rectangle.union = function(rectangle, otherRectangle, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("otherRectangle", otherRectangle); + if (!defined_default(result)) { + result = new Rectangle(); + } + let rectangleEast = rectangle.east; + let rectangleWest = rectangle.west; + let otherRectangleEast = otherRectangle.east; + let otherRectangleWest = otherRectangle.west; + if (rectangleEast < rectangleWest && otherRectangleEast > 0) { + rectangleEast += Math_default.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0) { + otherRectangleEast += Math_default.TWO_PI; + } + if (rectangleEast < rectangleWest && otherRectangleWest < 0) { + otherRectangleWest += Math_default.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0) { + rectangleWest += Math_default.TWO_PI; + } + const west = Math_default.negativePiToPi( + Math.min(rectangleWest, otherRectangleWest) + ); + const east = Math_default.negativePiToPi( + Math.max(rectangleEast, otherRectangleEast) + ); + result.west = west; + result.south = Math.min(rectangle.south, otherRectangle.south); + result.east = east; + result.north = Math.max(rectangle.north, otherRectangle.north); + return result; +}; +Rectangle.expand = function(rectangle, cartographic, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("cartographic", cartographic); + if (!defined_default(result)) { + result = new Rectangle(); + } + result.west = Math.min(rectangle.west, cartographic.longitude); + result.south = Math.min(rectangle.south, cartographic.latitude); + result.east = Math.max(rectangle.east, cartographic.longitude); + result.north = Math.max(rectangle.north, cartographic.latitude); + return result; +}; +Rectangle.contains = function(rectangle, cartographic) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.object("cartographic", cartographic); + let longitude = cartographic.longitude; + const latitude = cartographic.latitude; + const west = rectangle.west; + let east = rectangle.east; + if (east < west) { + east += Math_default.TWO_PI; + if (longitude < 0) { + longitude += Math_default.TWO_PI; + } + } + return (longitude > west || Math_default.equalsEpsilon(longitude, west, Math_default.EPSILON14)) && (longitude < east || Math_default.equalsEpsilon(longitude, east, Math_default.EPSILON14)) && latitude >= rectangle.south && latitude <= rectangle.north; +}; +var subsampleLlaScratch = new Cartographic_default(); +Rectangle.subsample = function(rectangle, ellipsoid, surfaceHeight, result) { + Check_default.typeOf.object("rectangle", rectangle); + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + surfaceHeight = defaultValue_default(surfaceHeight, 0); + if (!defined_default(result)) { + result = []; + } + let length = 0; + const north = rectangle.north; + const south = rectangle.south; + const east = rectangle.east; + const west = rectangle.west; + const lla = subsampleLlaScratch; + lla.height = surfaceHeight; + lla.longitude = west; + lla.latitude = north; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + lla.longitude = east; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + lla.latitude = south; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + lla.longitude = west; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + if (north < 0) { + lla.latitude = north; + } else if (south > 0) { + lla.latitude = south; + } else { + lla.latitude = 0; + } + for (let i = 1; i < 8; ++i) { + lla.longitude = -Math.PI + i * Math_default.PI_OVER_TWO; + if (Rectangle.contains(rectangle, lla)) { + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + } + } + if (lla.latitude === 0) { + lla.longitude = west; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + lla.longitude = east; + result[length] = ellipsoid.cartographicToCartesian(lla, result[length]); + length++; + } + result.length = length; + return result; +}; +Rectangle.subsection = function(rectangle, westLerp, southLerp, eastLerp, northLerp, result) { + Check_default.typeOf.object("rectangle", rectangle); + Check_default.typeOf.number.greaterThanOrEquals("westLerp", westLerp, 0); + Check_default.typeOf.number.lessThanOrEquals("westLerp", westLerp, 1); + Check_default.typeOf.number.greaterThanOrEquals("southLerp", southLerp, 0); + Check_default.typeOf.number.lessThanOrEquals("southLerp", southLerp, 1); + Check_default.typeOf.number.greaterThanOrEquals("eastLerp", eastLerp, 0); + Check_default.typeOf.number.lessThanOrEquals("eastLerp", eastLerp, 1); + Check_default.typeOf.number.greaterThanOrEquals("northLerp", northLerp, 0); + Check_default.typeOf.number.lessThanOrEquals("northLerp", northLerp, 1); + Check_default.typeOf.number.lessThanOrEquals("westLerp", westLerp, eastLerp); + Check_default.typeOf.number.lessThanOrEquals("southLerp", southLerp, northLerp); + if (!defined_default(result)) { + result = new Rectangle(); + } + if (rectangle.west <= rectangle.east) { + const width = rectangle.east - rectangle.west; + result.west = rectangle.west + westLerp * width; + result.east = rectangle.west + eastLerp * width; + } else { + const width = Math_default.TWO_PI + rectangle.east - rectangle.west; + result.west = Math_default.negativePiToPi(rectangle.west + westLerp * width); + result.east = Math_default.negativePiToPi(rectangle.west + eastLerp * width); + } + const height = rectangle.north - rectangle.south; + result.south = rectangle.south + southLerp * height; + result.north = rectangle.south + northLerp * height; + if (westLerp === 1) { + result.west = rectangle.east; + } + if (eastLerp === 1) { + result.east = rectangle.east; + } + if (southLerp === 1) { + result.south = rectangle.north; + } + if (northLerp === 1) { + result.north = rectangle.north; + } + return result; +}; +Rectangle.MAX_VALUE = Object.freeze( + new Rectangle( + -Math.PI, + -Math_default.PI_OVER_TWO, + Math.PI, + Math_default.PI_OVER_TWO + ) +); +var Rectangle_default = Rectangle; + +// packages/engine/Source/Core/Matrix2.js +function Matrix2(column0Row0, column1Row0, column0Row1, column1Row1) { + this[0] = defaultValue_default(column0Row0, 0); + this[1] = defaultValue_default(column0Row1, 0); + this[2] = defaultValue_default(column1Row0, 0); + this[3] = defaultValue_default(column1Row1, 0); +} +Matrix2.packedLength = 4; +Matrix2.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value[0]; + array[startingIndex++] = value[1]; + array[startingIndex++] = value[2]; + array[startingIndex++] = value[3]; + return array; +}; +Matrix2.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Matrix2(); + } + result[0] = array[startingIndex++]; + result[1] = array[startingIndex++]; + result[2] = array[startingIndex++]; + result[3] = array[startingIndex++]; + return result; +}; +Matrix2.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 4; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 4 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Matrix2.pack(array[i], result, i * 4); + } + return result; +}; +Matrix2.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 4); + if (array.length % 4 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 4."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 4); + } else { + result.length = length / 4; + } + for (let i = 0; i < length; i += 4) { + const index = i / 4; + result[index] = Matrix2.unpack(array, i, result[index]); + } + return result; +}; +Matrix2.clone = function(matrix, result) { + if (!defined_default(matrix)) { + return void 0; + } + if (!defined_default(result)) { + return new Matrix2(matrix[0], matrix[2], matrix[1], matrix[3]); + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + return result; +}; +Matrix2.fromArray = Matrix2.unpack; +Matrix2.fromColumnMajorArray = function(values, result) { + Check_default.defined("values", values); + return Matrix2.clone(values, result); +}; +Matrix2.fromRowMajorArray = function(values, result) { + Check_default.defined("values", values); + if (!defined_default(result)) { + return new Matrix2(values[0], values[1], values[2], values[3]); + } + result[0] = values[0]; + result[1] = values[2]; + result[2] = values[1]; + result[3] = values[3]; + return result; +}; +Matrix2.fromScale = function(scale, result) { + Check_default.typeOf.object("scale", scale); + if (!defined_default(result)) { + return new Matrix2(scale.x, 0, 0, scale.y); + } + result[0] = scale.x; + result[1] = 0; + result[2] = 0; + result[3] = scale.y; + return result; +}; +Matrix2.fromUniformScale = function(scale, result) { + Check_default.typeOf.number("scale", scale); + if (!defined_default(result)) { + return new Matrix2(scale, 0, 0, scale); + } + result[0] = scale; + result[1] = 0; + result[2] = 0; + result[3] = scale; + return result; +}; +Matrix2.fromRotation = function(angle, result) { + Check_default.typeOf.number("angle", angle); + const cosAngle = Math.cos(angle); + const sinAngle = Math.sin(angle); + if (!defined_default(result)) { + return new Matrix2(cosAngle, -sinAngle, sinAngle, cosAngle); + } + result[0] = cosAngle; + result[1] = sinAngle; + result[2] = -sinAngle; + result[3] = cosAngle; + return result; +}; +Matrix2.toArray = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + if (!defined_default(result)) { + return [matrix[0], matrix[1], matrix[2], matrix[3]]; + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + return result; +}; +Matrix2.getElementIndex = function(column, row) { + Check_default.typeOf.number.greaterThanOrEquals("row", row, 0); + Check_default.typeOf.number.lessThanOrEquals("row", row, 1); + Check_default.typeOf.number.greaterThanOrEquals("column", column, 0); + Check_default.typeOf.number.lessThanOrEquals("column", column, 1); + return column * 2 + row; +}; +Matrix2.getColumn = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 1); + Check_default.typeOf.object("result", result); + const startIndex = index * 2; + const x = matrix[startIndex]; + const y = matrix[startIndex + 1]; + result.x = x; + result.y = y; + return result; +}; +Matrix2.setColumn = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 1); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix2.clone(matrix, result); + const startIndex = index * 2; + result[startIndex] = cartesian.x; + result[startIndex + 1] = cartesian.y; + return result; +}; +Matrix2.getRow = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 1); + Check_default.typeOf.object("result", result); + const x = matrix[index]; + const y = matrix[index + 2]; + result.x = x; + result.y = y; + return result; +}; +Matrix2.setRow = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 1); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix2.clone(matrix, result); + result[index] = cartesian.x; + result[index + 2] = cartesian.y; + return result; +}; +var scaleScratch12 = new Cartesian2_default(); +Matrix2.setScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix2.getScale(matrix, scaleScratch12); + const scaleRatioX = scale.x / existingScale.x; + const scaleRatioY = scale.y / existingScale.y; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioY; + result[3] = matrix[3] * scaleRatioY; + return result; +}; +var scaleScratch22 = new Cartesian2_default(); +Matrix2.setUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix2.getScale(matrix, scaleScratch22); + const scaleRatioX = scale / existingScale.x; + const scaleRatioY = scale / existingScale.y; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioY; + result[3] = matrix[3] * scaleRatioY; + return result; +}; +var scratchColumn2 = new Cartesian2_default(); +Matrix2.getScale = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result.x = Cartesian2_default.magnitude( + Cartesian2_default.fromElements(matrix[0], matrix[1], scratchColumn2) + ); + result.y = Cartesian2_default.magnitude( + Cartesian2_default.fromElements(matrix[2], matrix[3], scratchColumn2) + ); + return result; +}; +var scaleScratch32 = new Cartesian2_default(); +Matrix2.getMaximumScale = function(matrix) { + Matrix2.getScale(matrix, scaleScratch32); + return Cartesian2_default.maximumComponent(scaleScratch32); +}; +var scaleScratch42 = new Cartesian2_default(); +Matrix2.setRotation = function(matrix, rotation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix2.getScale(matrix, scaleScratch42); + result[0] = rotation[0] * scale.x; + result[1] = rotation[1] * scale.x; + result[2] = rotation[2] * scale.y; + result[3] = rotation[3] * scale.y; + return result; +}; +var scaleScratch52 = new Cartesian2_default(); +Matrix2.getRotation = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix2.getScale(matrix, scaleScratch52); + result[0] = matrix[0] / scale.x; + result[1] = matrix[1] / scale.x; + result[2] = matrix[2] / scale.y; + result[3] = matrix[3] / scale.y; + return result; +}; +Matrix2.multiply = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const column0Row0 = left[0] * right[0] + left[2] * right[1]; + const column1Row0 = left[0] * right[2] + left[2] * right[3]; + const column0Row1 = left[1] * right[0] + left[3] * right[1]; + const column1Row1 = left[1] * right[2] + left[3] * right[3]; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column1Row0; + result[3] = column1Row1; + return result; +}; +Matrix2.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] + right[0]; + result[1] = left[1] + right[1]; + result[2] = left[2] + right[2]; + result[3] = left[3] + right[3]; + return result; +}; +Matrix2.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] - right[0]; + result[1] = left[1] - right[1]; + result[2] = left[2] - right[2]; + result[3] = left[3] - right[3]; + return result; +}; +Matrix2.multiplyByVector = function(matrix, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const x = matrix[0] * cartesian.x + matrix[2] * cartesian.y; + const y = matrix[1] * cartesian.x + matrix[3] * cartesian.y; + result.x = x; + result.y = y; + return result; +}; +Matrix2.multiplyByScalar = function(matrix, scalar, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scalar; + result[1] = matrix[1] * scalar; + result[2] = matrix[2] * scalar; + result[3] = matrix[3] * scalar; + return result; +}; +Matrix2.multiplyByScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scale.x; + result[1] = matrix[1] * scale.x; + result[2] = matrix[2] * scale.y; + result[3] = matrix[3] * scale.y; + return result; +}; +Matrix2.multiplyByUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scale; + result[1] = matrix[1] * scale; + result[2] = matrix[2] * scale; + result[3] = matrix[3] * scale; + return result; +}; +Matrix2.negate = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = -matrix[0]; + result[1] = -matrix[1]; + result[2] = -matrix[2]; + result[3] = -matrix[3]; + return result; +}; +Matrix2.transpose = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const column0Row0 = matrix[0]; + const column0Row1 = matrix[2]; + const column1Row0 = matrix[1]; + const column1Row1 = matrix[3]; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column1Row0; + result[3] = column1Row1; + return result; +}; +Matrix2.abs = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = Math.abs(matrix[0]); + result[1] = Math.abs(matrix[1]); + result[2] = Math.abs(matrix[2]); + result[3] = Math.abs(matrix[3]); + return result; +}; +Matrix2.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left[0] === right[0] && left[1] === right[1] && left[2] === right[2] && left[3] === right[3]; +}; +Matrix2.equalsArray = function(matrix, array, offset) { + return matrix[0] === array[offset] && matrix[1] === array[offset + 1] && matrix[2] === array[offset + 2] && matrix[3] === array[offset + 3]; +}; +Matrix2.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left[0] - right[0]) <= epsilon && Math.abs(left[1] - right[1]) <= epsilon && Math.abs(left[2] - right[2]) <= epsilon && Math.abs(left[3] - right[3]) <= epsilon; +}; +Matrix2.IDENTITY = Object.freeze(new Matrix2(1, 0, 0, 1)); +Matrix2.ZERO = Object.freeze(new Matrix2(0, 0, 0, 0)); +Matrix2.COLUMN0ROW0 = 0; +Matrix2.COLUMN0ROW1 = 1; +Matrix2.COLUMN1ROW0 = 2; +Matrix2.COLUMN1ROW1 = 3; +Object.defineProperties(Matrix2.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix2.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix2.packedLength; + } + } +}); +Matrix2.prototype.clone = function(result) { + return Matrix2.clone(this, result); +}; +Matrix2.prototype.equals = function(right) { + return Matrix2.equals(this, right); +}; +Matrix2.prototype.equalsEpsilon = function(right, epsilon) { + return Matrix2.equalsEpsilon(this, right, epsilon); +}; +Matrix2.prototype.toString = function() { + return `(${this[0]}, ${this[2]}) +(${this[1]}, ${this[3]})`; +}; +var Matrix2_default = Matrix2; + +export { + Cartesian4_default, + Matrix4_default, + combine_default, + Resource_default, + buildModuleUrl_default, + Quaternion_default, + Transforms_default, + Rectangle_default, + Matrix2_default +}; diff --git a/public/assets/cesium/Workers/chunk-7YIOHQWH.js b/public/assets/cesium/Workers/chunk-7YIOHQWH.js new file mode 100644 index 0000000..8f80884 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-7YIOHQWH.js @@ -0,0 +1,1477 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default, + Intersect_default +} from "./chunk-KHZNBFOH.js"; +import { + Cartesian4_default, + Matrix4_default, + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CullingVolume.js +function CullingVolume(planes) { + this.planes = defaultValue_default(planes, []); +} +var faces = [new Cartesian3_default(), new Cartesian3_default(), new Cartesian3_default()]; +Cartesian3_default.clone(Cartesian3_default.UNIT_X, faces[0]); +Cartesian3_default.clone(Cartesian3_default.UNIT_Y, faces[1]); +Cartesian3_default.clone(Cartesian3_default.UNIT_Z, faces[2]); +var scratchPlaneCenter = new Cartesian3_default(); +var scratchPlaneNormal = new Cartesian3_default(); +var scratchPlane = new Plane_default(new Cartesian3_default(1, 0, 0), 0); +CullingVolume.fromBoundingSphere = function(boundingSphere, result) { + if (!defined_default(boundingSphere)) { + throw new DeveloperError_default("boundingSphere is required."); + } + if (!defined_default(result)) { + result = new CullingVolume(); + } + const length = faces.length; + const planes = result.planes; + planes.length = 2 * length; + const center = boundingSphere.center; + const radius = boundingSphere.radius; + let planeIndex = 0; + for (let i = 0; i < length; ++i) { + const faceNormal = faces[i]; + let plane0 = planes[planeIndex]; + let plane1 = planes[planeIndex + 1]; + if (!defined_default(plane0)) { + plane0 = planes[planeIndex] = new Cartesian4_default(); + } + if (!defined_default(plane1)) { + plane1 = planes[planeIndex + 1] = new Cartesian4_default(); + } + Cartesian3_default.multiplyByScalar(faceNormal, -radius, scratchPlaneCenter); + Cartesian3_default.add(center, scratchPlaneCenter, scratchPlaneCenter); + plane0.x = faceNormal.x; + plane0.y = faceNormal.y; + plane0.z = faceNormal.z; + plane0.w = -Cartesian3_default.dot(faceNormal, scratchPlaneCenter); + Cartesian3_default.multiplyByScalar(faceNormal, radius, scratchPlaneCenter); + Cartesian3_default.add(center, scratchPlaneCenter, scratchPlaneCenter); + plane1.x = -faceNormal.x; + plane1.y = -faceNormal.y; + plane1.z = -faceNormal.z; + plane1.w = -Cartesian3_default.dot( + Cartesian3_default.negate(faceNormal, scratchPlaneNormal), + scratchPlaneCenter + ); + planeIndex += 2; + } + return result; +}; +CullingVolume.prototype.computeVisibility = function(boundingVolume) { + if (!defined_default(boundingVolume)) { + throw new DeveloperError_default("boundingVolume is required."); + } + const planes = this.planes; + let intersecting = false; + for (let k = 0, len = planes.length; k < len; ++k) { + const result = boundingVolume.intersectPlane( + Plane_default.fromCartesian4(planes[k], scratchPlane) + ); + if (result === Intersect_default.OUTSIDE) { + return Intersect_default.OUTSIDE; + } else if (result === Intersect_default.INTERSECTING) { + intersecting = true; + } + } + return intersecting ? Intersect_default.INTERSECTING : Intersect_default.INSIDE; +}; +CullingVolume.prototype.computeVisibilityWithPlaneMask = function(boundingVolume, parentPlaneMask) { + if (!defined_default(boundingVolume)) { + throw new DeveloperError_default("boundingVolume is required."); + } + if (!defined_default(parentPlaneMask)) { + throw new DeveloperError_default("parentPlaneMask is required."); + } + if (parentPlaneMask === CullingVolume.MASK_OUTSIDE || parentPlaneMask === CullingVolume.MASK_INSIDE) { + return parentPlaneMask; + } + let mask = CullingVolume.MASK_INSIDE; + const planes = this.planes; + for (let k = 0, len = planes.length; k < len; ++k) { + const flag = k < 31 ? 1 << k : 0; + if (k < 31 && (parentPlaneMask & flag) === 0) { + continue; + } + const result = boundingVolume.intersectPlane( + Plane_default.fromCartesian4(planes[k], scratchPlane) + ); + if (result === Intersect_default.OUTSIDE) { + return CullingVolume.MASK_OUTSIDE; + } else if (result === Intersect_default.INTERSECTING) { + mask |= flag; + } + } + return mask; +}; +CullingVolume.MASK_OUTSIDE = 4294967295; +CullingVolume.MASK_INSIDE = 0; +CullingVolume.MASK_INDETERMINATE = 2147483647; +var CullingVolume_default = CullingVolume; + +// packages/engine/Source/Core/OrthographicOffCenterFrustum.js +function OrthographicOffCenterFrustum(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this.left = options.left; + this._left = void 0; + this.right = options.right; + this._right = void 0; + this.top = options.top; + this._top = void 0; + this.bottom = options.bottom; + this._bottom = void 0; + this.near = defaultValue_default(options.near, 1); + this._near = this.near; + this.far = defaultValue_default(options.far, 5e8); + this._far = this.far; + this._cullingVolume = new CullingVolume_default(); + this._orthographicMatrix = new Matrix4_default(); +} +function update(frustum) { + if (!defined_default(frustum.right) || !defined_default(frustum.left) || !defined_default(frustum.top) || !defined_default(frustum.bottom) || !defined_default(frustum.near) || !defined_default(frustum.far)) { + throw new DeveloperError_default( + "right, left, top, bottom, near, or far parameters are not set." + ); + } + if (frustum.top !== frustum._top || frustum.bottom !== frustum._bottom || frustum.left !== frustum._left || frustum.right !== frustum._right || frustum.near !== frustum._near || frustum.far !== frustum._far) { + if (frustum.left > frustum.right) { + throw new DeveloperError_default("right must be greater than left."); + } + if (frustum.bottom > frustum.top) { + throw new DeveloperError_default("top must be greater than bottom."); + } + if (frustum.near <= 0 || frustum.near > frustum.far) { + throw new DeveloperError_default( + "near must be greater than zero and less than far." + ); + } + frustum._left = frustum.left; + frustum._right = frustum.right; + frustum._top = frustum.top; + frustum._bottom = frustum.bottom; + frustum._near = frustum.near; + frustum._far = frustum.far; + frustum._orthographicMatrix = Matrix4_default.computeOrthographicOffCenter( + frustum.left, + frustum.right, + frustum.bottom, + frustum.top, + frustum.near, + frustum.far, + frustum._orthographicMatrix + ); + } +} +Object.defineProperties(OrthographicOffCenterFrustum.prototype, { + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + */ + projectionMatrix: { + get: function() { + update(this); + return this._orthographicMatrix; + } + } +}); +var getPlanesRight = new Cartesian3_default(); +var getPlanesNearCenter = new Cartesian3_default(); +var getPlanesPoint = new Cartesian3_default(); +var negateScratch = new Cartesian3_default(); +OrthographicOffCenterFrustum.prototype.computeCullingVolume = function(position, direction, up) { + if (!defined_default(position)) { + throw new DeveloperError_default("position is required."); + } + if (!defined_default(direction)) { + throw new DeveloperError_default("direction is required."); + } + if (!defined_default(up)) { + throw new DeveloperError_default("up is required."); + } + const planes = this._cullingVolume.planes; + const t = this.top; + const b = this.bottom; + const r = this.right; + const l = this.left; + const n = this.near; + const f = this.far; + const right = Cartesian3_default.cross(direction, up, getPlanesRight); + Cartesian3_default.normalize(right, right); + const nearCenter = getPlanesNearCenter; + Cartesian3_default.multiplyByScalar(direction, n, nearCenter); + Cartesian3_default.add(position, nearCenter, nearCenter); + const point = getPlanesPoint; + Cartesian3_default.multiplyByScalar(right, l, point); + Cartesian3_default.add(nearCenter, point, point); + let plane = planes[0]; + if (!defined_default(plane)) { + plane = planes[0] = new Cartesian4_default(); + } + plane.x = right.x; + plane.y = right.y; + plane.z = right.z; + plane.w = -Cartesian3_default.dot(right, point); + Cartesian3_default.multiplyByScalar(right, r, point); + Cartesian3_default.add(nearCenter, point, point); + plane = planes[1]; + if (!defined_default(plane)) { + plane = planes[1] = new Cartesian4_default(); + } + plane.x = -right.x; + plane.y = -right.y; + plane.z = -right.z; + plane.w = -Cartesian3_default.dot(Cartesian3_default.negate(right, negateScratch), point); + Cartesian3_default.multiplyByScalar(up, b, point); + Cartesian3_default.add(nearCenter, point, point); + plane = planes[2]; + if (!defined_default(plane)) { + plane = planes[2] = new Cartesian4_default(); + } + plane.x = up.x; + plane.y = up.y; + plane.z = up.z; + plane.w = -Cartesian3_default.dot(up, point); + Cartesian3_default.multiplyByScalar(up, t, point); + Cartesian3_default.add(nearCenter, point, point); + plane = planes[3]; + if (!defined_default(plane)) { + plane = planes[3] = new Cartesian4_default(); + } + plane.x = -up.x; + plane.y = -up.y; + plane.z = -up.z; + plane.w = -Cartesian3_default.dot(Cartesian3_default.negate(up, negateScratch), point); + plane = planes[4]; + if (!defined_default(plane)) { + plane = planes[4] = new Cartesian4_default(); + } + plane.x = direction.x; + plane.y = direction.y; + plane.z = direction.z; + plane.w = -Cartesian3_default.dot(direction, nearCenter); + Cartesian3_default.multiplyByScalar(direction, f, point); + Cartesian3_default.add(position, point, point); + plane = planes[5]; + if (!defined_default(plane)) { + plane = planes[5] = new Cartesian4_default(); + } + plane.x = -direction.x; + plane.y = -direction.y; + plane.z = -direction.z; + plane.w = -Cartesian3_default.dot(Cartesian3_default.negate(direction, negateScratch), point); + return this._cullingVolume; +}; +OrthographicOffCenterFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) { + update(this); + if (!defined_default(drawingBufferWidth) || !defined_default(drawingBufferHeight)) { + throw new DeveloperError_default( + "Both drawingBufferWidth and drawingBufferHeight are required." + ); + } + if (drawingBufferWidth <= 0) { + throw new DeveloperError_default("drawingBufferWidth must be greater than zero."); + } + if (drawingBufferHeight <= 0) { + throw new DeveloperError_default("drawingBufferHeight must be greater than zero."); + } + if (!defined_default(distance)) { + throw new DeveloperError_default("distance is required."); + } + if (!defined_default(pixelRatio)) { + throw new DeveloperError_default("pixelRatio is required."); + } + if (pixelRatio <= 0) { + throw new DeveloperError_default("pixelRatio must be greater than zero."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("A result object is required."); + } + const frustumWidth = this.right - this.left; + const frustumHeight = this.top - this.bottom; + const pixelWidth = pixelRatio * frustumWidth / drawingBufferWidth; + const pixelHeight = pixelRatio * frustumHeight / drawingBufferHeight; + result.x = pixelWidth; + result.y = pixelHeight; + return result; +}; +OrthographicOffCenterFrustum.prototype.clone = function(result) { + if (!defined_default(result)) { + result = new OrthographicOffCenterFrustum(); + } + result.left = this.left; + result.right = this.right; + result.top = this.top; + result.bottom = this.bottom; + result.near = this.near; + result.far = this.far; + result._left = void 0; + result._right = void 0; + result._top = void 0; + result._bottom = void 0; + result._near = void 0; + result._far = void 0; + return result; +}; +OrthographicOffCenterFrustum.prototype.equals = function(other) { + return defined_default(other) && other instanceof OrthographicOffCenterFrustum && this.right === other.right && this.left === other.left && this.top === other.top && this.bottom === other.bottom && this.near === other.near && this.far === other.far; +}; +OrthographicOffCenterFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) { + return other === this || defined_default(other) && other instanceof OrthographicOffCenterFrustum && Math_default.equalsEpsilon( + this.right, + other.right, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.left, + other.left, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.top, + other.top, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.bottom, + other.bottom, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.near, + other.near, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.far, + other.far, + relativeEpsilon, + absoluteEpsilon + ); +}; +var OrthographicOffCenterFrustum_default = OrthographicOffCenterFrustum; + +// packages/engine/Source/Core/OrthographicFrustum.js +function OrthographicFrustum(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this._offCenterFrustum = new OrthographicOffCenterFrustum_default(); + this.width = options.width; + this._width = void 0; + this.aspectRatio = options.aspectRatio; + this._aspectRatio = void 0; + this.near = defaultValue_default(options.near, 1); + this._near = this.near; + this.far = defaultValue_default(options.far, 5e8); + this._far = this.far; +} +OrthographicFrustum.packedLength = 4; +OrthographicFrustum.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.width; + array[startingIndex++] = value.aspectRatio; + array[startingIndex++] = value.near; + array[startingIndex] = value.far; + return array; +}; +OrthographicFrustum.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new OrthographicFrustum(); + } + result.width = array[startingIndex++]; + result.aspectRatio = array[startingIndex++]; + result.near = array[startingIndex++]; + result.far = array[startingIndex]; + return result; +}; +function update2(frustum) { + if (!defined_default(frustum.width) || !defined_default(frustum.aspectRatio) || !defined_default(frustum.near) || !defined_default(frustum.far)) { + throw new DeveloperError_default( + "width, aspectRatio, near, or far parameters are not set." + ); + } + const f = frustum._offCenterFrustum; + if (frustum.width !== frustum._width || frustum.aspectRatio !== frustum._aspectRatio || frustum.near !== frustum._near || frustum.far !== frustum._far) { + if (frustum.aspectRatio < 0) { + throw new DeveloperError_default("aspectRatio must be positive."); + } + if (frustum.near < 0 || frustum.near > frustum.far) { + throw new DeveloperError_default( + "near must be greater than zero and less than far." + ); + } + frustum._aspectRatio = frustum.aspectRatio; + frustum._width = frustum.width; + frustum._near = frustum.near; + frustum._far = frustum.far; + const ratio = 1 / frustum.aspectRatio; + f.right = frustum.width * 0.5; + f.left = -f.right; + f.top = ratio * f.right; + f.bottom = -f.top; + f.near = frustum.near; + f.far = frustum.far; + } +} +Object.defineProperties(OrthographicFrustum.prototype, { + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicFrustum.prototype + * @type {Matrix4} + * @readonly + */ + projectionMatrix: { + get: function() { + update2(this); + return this._offCenterFrustum.projectionMatrix; + } + }, + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof OrthographicFrustum.prototype + * @type {OrthographicOffCenterFrustum} + * @readonly + * @private + */ + offCenterFrustum: { + get: function() { + update2(this); + return this._offCenterFrustum; + } + } +}); +OrthographicFrustum.prototype.computeCullingVolume = function(position, direction, up) { + update2(this); + return this._offCenterFrustum.computeCullingVolume(position, direction, up); +}; +OrthographicFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) { + update2(this); + return this._offCenterFrustum.getPixelDimensions( + drawingBufferWidth, + drawingBufferHeight, + distance, + pixelRatio, + result + ); +}; +OrthographicFrustum.prototype.clone = function(result) { + if (!defined_default(result)) { + result = new OrthographicFrustum(); + } + result.aspectRatio = this.aspectRatio; + result.width = this.width; + result.near = this.near; + result.far = this.far; + result._aspectRatio = void 0; + result._width = void 0; + result._near = void 0; + result._far = void 0; + this._offCenterFrustum.clone(result._offCenterFrustum); + return result; +}; +OrthographicFrustum.prototype.equals = function(other) { + if (!defined_default(other) || !(other instanceof OrthographicFrustum)) { + return false; + } + update2(this); + update2(other); + return this.width === other.width && this.aspectRatio === other.aspectRatio && this._offCenterFrustum.equals(other._offCenterFrustum); +}; +OrthographicFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) { + if (!defined_default(other) || !(other instanceof OrthographicFrustum)) { + return false; + } + update2(this); + update2(other); + return Math_default.equalsEpsilon( + this.width, + other.width, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.aspectRatio, + other.aspectRatio, + relativeEpsilon, + absoluteEpsilon + ) && this._offCenterFrustum.equalsEpsilon( + other._offCenterFrustum, + relativeEpsilon, + absoluteEpsilon + ); +}; +var OrthographicFrustum_default = OrthographicFrustum; + +// packages/engine/Source/Core/PerspectiveOffCenterFrustum.js +function PerspectiveOffCenterFrustum(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this.left = options.left; + this._left = void 0; + this.right = options.right; + this._right = void 0; + this.top = options.top; + this._top = void 0; + this.bottom = options.bottom; + this._bottom = void 0; + this.near = defaultValue_default(options.near, 1); + this._near = this.near; + this.far = defaultValue_default(options.far, 5e8); + this._far = this.far; + this._cullingVolume = new CullingVolume_default(); + this._perspectiveMatrix = new Matrix4_default(); + this._infinitePerspective = new Matrix4_default(); +} +function update3(frustum) { + if (!defined_default(frustum.right) || !defined_default(frustum.left) || !defined_default(frustum.top) || !defined_default(frustum.bottom) || !defined_default(frustum.near) || !defined_default(frustum.far)) { + throw new DeveloperError_default( + "right, left, top, bottom, near, or far parameters are not set." + ); + } + const t = frustum.top; + const b = frustum.bottom; + const r = frustum.right; + const l = frustum.left; + const n = frustum.near; + const f = frustum.far; + if (t !== frustum._top || b !== frustum._bottom || l !== frustum._left || r !== frustum._right || n !== frustum._near || f !== frustum._far) { + if (frustum.near <= 0 || frustum.near > frustum.far) { + throw new DeveloperError_default( + "near must be greater than zero and less than far." + ); + } + frustum._left = l; + frustum._right = r; + frustum._top = t; + frustum._bottom = b; + frustum._near = n; + frustum._far = f; + frustum._perspectiveMatrix = Matrix4_default.computePerspectiveOffCenter( + l, + r, + b, + t, + n, + f, + frustum._perspectiveMatrix + ); + frustum._infinitePerspective = Matrix4_default.computeInfinitePerspectiveOffCenter( + l, + r, + b, + t, + n, + frustum._infinitePerspective + ); + } +} +Object.defineProperties(PerspectiveOffCenterFrustum.prototype, { + /** + * Gets the perspective projection matrix computed from the view frustum. + * @memberof PerspectiveOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveOffCenterFrustum#infiniteProjectionMatrix + */ + projectionMatrix: { + get: function() { + update3(this); + return this._perspectiveMatrix; + } + }, + /** + * Gets the perspective projection matrix computed from the view frustum with an infinite far plane. + * @memberof PerspectiveOffCenterFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveOffCenterFrustum#projectionMatrix + */ + infiniteProjectionMatrix: { + get: function() { + update3(this); + return this._infinitePerspective; + } + } +}); +var getPlanesRight2 = new Cartesian3_default(); +var getPlanesNearCenter2 = new Cartesian3_default(); +var getPlanesFarCenter = new Cartesian3_default(); +var getPlanesNormal = new Cartesian3_default(); +PerspectiveOffCenterFrustum.prototype.computeCullingVolume = function(position, direction, up) { + if (!defined_default(position)) { + throw new DeveloperError_default("position is required."); + } + if (!defined_default(direction)) { + throw new DeveloperError_default("direction is required."); + } + if (!defined_default(up)) { + throw new DeveloperError_default("up is required."); + } + const planes = this._cullingVolume.planes; + const t = this.top; + const b = this.bottom; + const r = this.right; + const l = this.left; + const n = this.near; + const f = this.far; + const right = Cartesian3_default.cross(direction, up, getPlanesRight2); + const nearCenter = getPlanesNearCenter2; + Cartesian3_default.multiplyByScalar(direction, n, nearCenter); + Cartesian3_default.add(position, nearCenter, nearCenter); + const farCenter = getPlanesFarCenter; + Cartesian3_default.multiplyByScalar(direction, f, farCenter); + Cartesian3_default.add(position, farCenter, farCenter); + const normal = getPlanesNormal; + Cartesian3_default.multiplyByScalar(right, l, normal); + Cartesian3_default.add(nearCenter, normal, normal); + Cartesian3_default.subtract(normal, position, normal); + Cartesian3_default.normalize(normal, normal); + Cartesian3_default.cross(normal, up, normal); + Cartesian3_default.normalize(normal, normal); + let plane = planes[0]; + if (!defined_default(plane)) { + plane = planes[0] = new Cartesian4_default(); + } + plane.x = normal.x; + plane.y = normal.y; + plane.z = normal.z; + plane.w = -Cartesian3_default.dot(normal, position); + Cartesian3_default.multiplyByScalar(right, r, normal); + Cartesian3_default.add(nearCenter, normal, normal); + Cartesian3_default.subtract(normal, position, normal); + Cartesian3_default.cross(up, normal, normal); + Cartesian3_default.normalize(normal, normal); + plane = planes[1]; + if (!defined_default(plane)) { + plane = planes[1] = new Cartesian4_default(); + } + plane.x = normal.x; + plane.y = normal.y; + plane.z = normal.z; + plane.w = -Cartesian3_default.dot(normal, position); + Cartesian3_default.multiplyByScalar(up, b, normal); + Cartesian3_default.add(nearCenter, normal, normal); + Cartesian3_default.subtract(normal, position, normal); + Cartesian3_default.cross(right, normal, normal); + Cartesian3_default.normalize(normal, normal); + plane = planes[2]; + if (!defined_default(plane)) { + plane = planes[2] = new Cartesian4_default(); + } + plane.x = normal.x; + plane.y = normal.y; + plane.z = normal.z; + plane.w = -Cartesian3_default.dot(normal, position); + Cartesian3_default.multiplyByScalar(up, t, normal); + Cartesian3_default.add(nearCenter, normal, normal); + Cartesian3_default.subtract(normal, position, normal); + Cartesian3_default.cross(normal, right, normal); + Cartesian3_default.normalize(normal, normal); + plane = planes[3]; + if (!defined_default(plane)) { + plane = planes[3] = new Cartesian4_default(); + } + plane.x = normal.x; + plane.y = normal.y; + plane.z = normal.z; + plane.w = -Cartesian3_default.dot(normal, position); + plane = planes[4]; + if (!defined_default(plane)) { + plane = planes[4] = new Cartesian4_default(); + } + plane.x = direction.x; + plane.y = direction.y; + plane.z = direction.z; + plane.w = -Cartesian3_default.dot(direction, nearCenter); + Cartesian3_default.negate(direction, normal); + plane = planes[5]; + if (!defined_default(plane)) { + plane = planes[5] = new Cartesian4_default(); + } + plane.x = normal.x; + plane.y = normal.y; + plane.z = normal.z; + plane.w = -Cartesian3_default.dot(normal, farCenter); + return this._cullingVolume; +}; +PerspectiveOffCenterFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) { + update3(this); + if (!defined_default(drawingBufferWidth) || !defined_default(drawingBufferHeight)) { + throw new DeveloperError_default( + "Both drawingBufferWidth and drawingBufferHeight are required." + ); + } + if (drawingBufferWidth <= 0) { + throw new DeveloperError_default("drawingBufferWidth must be greater than zero."); + } + if (drawingBufferHeight <= 0) { + throw new DeveloperError_default("drawingBufferHeight must be greater than zero."); + } + if (!defined_default(distance)) { + throw new DeveloperError_default("distance is required."); + } + if (!defined_default(pixelRatio)) { + throw new DeveloperError_default("pixelRatio is required"); + } + if (pixelRatio <= 0) { + throw new DeveloperError_default("pixelRatio must be greater than zero."); + } + if (!defined_default(result)) { + throw new DeveloperError_default("A result object is required."); + } + const inverseNear = 1 / this.near; + let tanTheta = this.top * inverseNear; + const pixelHeight = 2 * pixelRatio * distance * tanTheta / drawingBufferHeight; + tanTheta = this.right * inverseNear; + const pixelWidth = 2 * pixelRatio * distance * tanTheta / drawingBufferWidth; + result.x = pixelWidth; + result.y = pixelHeight; + return result; +}; +PerspectiveOffCenterFrustum.prototype.clone = function(result) { + if (!defined_default(result)) { + result = new PerspectiveOffCenterFrustum(); + } + result.right = this.right; + result.left = this.left; + result.top = this.top; + result.bottom = this.bottom; + result.near = this.near; + result.far = this.far; + result._left = void 0; + result._right = void 0; + result._top = void 0; + result._bottom = void 0; + result._near = void 0; + result._far = void 0; + return result; +}; +PerspectiveOffCenterFrustum.prototype.equals = function(other) { + return defined_default(other) && other instanceof PerspectiveOffCenterFrustum && this.right === other.right && this.left === other.left && this.top === other.top && this.bottom === other.bottom && this.near === other.near && this.far === other.far; +}; +PerspectiveOffCenterFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) { + return other === this || defined_default(other) && other instanceof PerspectiveOffCenterFrustum && Math_default.equalsEpsilon( + this.right, + other.right, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.left, + other.left, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.top, + other.top, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.bottom, + other.bottom, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.near, + other.near, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.far, + other.far, + relativeEpsilon, + absoluteEpsilon + ); +}; +var PerspectiveOffCenterFrustum_default = PerspectiveOffCenterFrustum; + +// packages/engine/Source/Core/PerspectiveFrustum.js +function PerspectiveFrustum(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this._offCenterFrustum = new PerspectiveOffCenterFrustum_default(); + this.fov = options.fov; + this._fov = void 0; + this._fovy = void 0; + this._sseDenominator = void 0; + this.aspectRatio = options.aspectRatio; + this._aspectRatio = void 0; + this.near = defaultValue_default(options.near, 1); + this._near = this.near; + this.far = defaultValue_default(options.far, 5e8); + this._far = this.far; + this.xOffset = defaultValue_default(options.xOffset, 0); + this._xOffset = this.xOffset; + this.yOffset = defaultValue_default(options.yOffset, 0); + this._yOffset = this.yOffset; +} +PerspectiveFrustum.packedLength = 6; +PerspectiveFrustum.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.fov; + array[startingIndex++] = value.aspectRatio; + array[startingIndex++] = value.near; + array[startingIndex++] = value.far; + array[startingIndex++] = value.xOffset; + array[startingIndex] = value.yOffset; + return array; +}; +PerspectiveFrustum.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new PerspectiveFrustum(); + } + result.fov = array[startingIndex++]; + result.aspectRatio = array[startingIndex++]; + result.near = array[startingIndex++]; + result.far = array[startingIndex++]; + result.xOffset = array[startingIndex++]; + result.yOffset = array[startingIndex]; + return result; +}; +function update4(frustum) { + if (!defined_default(frustum.fov) || !defined_default(frustum.aspectRatio) || !defined_default(frustum.near) || !defined_default(frustum.far)) { + throw new DeveloperError_default( + "fov, aspectRatio, near, or far parameters are not set." + ); + } + const f = frustum._offCenterFrustum; + if (frustum.fov !== frustum._fov || frustum.aspectRatio !== frustum._aspectRatio || frustum.near !== frustum._near || frustum.far !== frustum._far || frustum.xOffset !== frustum._xOffset || frustum.yOffset !== frustum._yOffset) { + if (frustum.fov < 0 || frustum.fov >= Math.PI) { + throw new DeveloperError_default("fov must be in the range [0, PI)."); + } + if (frustum.aspectRatio < 0) { + throw new DeveloperError_default("aspectRatio must be positive."); + } + if (frustum.near < 0 || frustum.near > frustum.far) { + throw new DeveloperError_default( + "near must be greater than zero and less than far." + ); + } + frustum._aspectRatio = frustum.aspectRatio; + frustum._fov = frustum.fov; + frustum._fovy = frustum.aspectRatio <= 1 ? frustum.fov : Math.atan(Math.tan(frustum.fov * 0.5) / frustum.aspectRatio) * 2; + frustum._near = frustum.near; + frustum._far = frustum.far; + frustum._sseDenominator = 2 * Math.tan(0.5 * frustum._fovy); + frustum._xOffset = frustum.xOffset; + frustum._yOffset = frustum.yOffset; + f.top = frustum.near * Math.tan(0.5 * frustum._fovy); + f.bottom = -f.top; + f.right = frustum.aspectRatio * f.top; + f.left = -f.right; + f.near = frustum.near; + f.far = frustum.far; + f.right += frustum.xOffset; + f.left += frustum.xOffset; + f.top += frustum.yOffset; + f.bottom += frustum.yOffset; + } +} +Object.defineProperties(PerspectiveFrustum.prototype, { + /** + * Gets the perspective projection matrix computed from the view frustum. + * @memberof PerspectiveFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveFrustum#infiniteProjectionMatrix + */ + projectionMatrix: { + get: function() { + update4(this); + return this._offCenterFrustum.projectionMatrix; + } + }, + /** + * The perspective projection matrix computed from the view frustum with an infinite far plane. + * @memberof PerspectiveFrustum.prototype + * @type {Matrix4} + * @readonly + * + * @see PerspectiveFrustum#projectionMatrix + */ + infiniteProjectionMatrix: { + get: function() { + update4(this); + return this._offCenterFrustum.infiniteProjectionMatrix; + } + }, + /** + * Gets the angle of the vertical field of view, in radians. + * @memberof PerspectiveFrustum.prototype + * @type {number} + * @readonly + * @default undefined + */ + fovy: { + get: function() { + update4(this); + return this._fovy; + } + }, + /** + * @readonly + * @private + */ + sseDenominator: { + get: function() { + update4(this); + return this._sseDenominator; + } + }, + /** + * Gets the orthographic projection matrix computed from the view frustum. + * @memberof PerspectiveFrustum.prototype + * @type {PerspectiveOffCenterFrustum} + * @readonly + * @private + */ + offCenterFrustum: { + get: function() { + update4(this); + return this._offCenterFrustum; + } + } +}); +PerspectiveFrustum.prototype.computeCullingVolume = function(position, direction, up) { + update4(this); + return this._offCenterFrustum.computeCullingVolume(position, direction, up); +}; +PerspectiveFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) { + update4(this); + return this._offCenterFrustum.getPixelDimensions( + drawingBufferWidth, + drawingBufferHeight, + distance, + pixelRatio, + result + ); +}; +PerspectiveFrustum.prototype.clone = function(result) { + if (!defined_default(result)) { + result = new PerspectiveFrustum(); + } + result.aspectRatio = this.aspectRatio; + result.fov = this.fov; + result.near = this.near; + result.far = this.far; + result._aspectRatio = void 0; + result._fov = void 0; + result._near = void 0; + result._far = void 0; + this._offCenterFrustum.clone(result._offCenterFrustum); + return result; +}; +PerspectiveFrustum.prototype.equals = function(other) { + if (!defined_default(other) || !(other instanceof PerspectiveFrustum)) { + return false; + } + update4(this); + update4(other); + return this.fov === other.fov && this.aspectRatio === other.aspectRatio && this._offCenterFrustum.equals(other._offCenterFrustum); +}; +PerspectiveFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) { + if (!defined_default(other) || !(other instanceof PerspectiveFrustum)) { + return false; + } + update4(this); + update4(other); + return Math_default.equalsEpsilon( + this.fov, + other.fov, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + this.aspectRatio, + other.aspectRatio, + relativeEpsilon, + absoluteEpsilon + ) && this._offCenterFrustum.equalsEpsilon( + other._offCenterFrustum, + relativeEpsilon, + absoluteEpsilon + ); +}; +var PerspectiveFrustum_default = PerspectiveFrustum; + +// packages/engine/Source/Core/FrustumGeometry.js +var PERSPECTIVE = 0; +var ORTHOGRAPHIC = 1; +function FrustumGeometry(options) { + Check_default.typeOf.object("options", options); + Check_default.typeOf.object("options.frustum", options.frustum); + Check_default.typeOf.object("options.origin", options.origin); + Check_default.typeOf.object("options.orientation", options.orientation); + const frustum = options.frustum; + const orientation = options.orientation; + const origin = options.origin; + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + const drawNearPlane = defaultValue_default(options._drawNearPlane, true); + let frustumType; + let frustumPackedLength; + if (frustum instanceof PerspectiveFrustum_default) { + frustumType = PERSPECTIVE; + frustumPackedLength = PerspectiveFrustum_default.packedLength; + } else if (frustum instanceof OrthographicFrustum_default) { + frustumType = ORTHOGRAPHIC; + frustumPackedLength = OrthographicFrustum_default.packedLength; + } + this._frustumType = frustumType; + this._frustum = frustum.clone(); + this._origin = Cartesian3_default.clone(origin); + this._orientation = Quaternion_default.clone(orientation); + this._drawNearPlane = drawNearPlane; + this._vertexFormat = vertexFormat; + this._workerName = "createFrustumGeometry"; + this.packedLength = 2 + frustumPackedLength + Cartesian3_default.packedLength + Quaternion_default.packedLength + VertexFormat_default.packedLength; +} +FrustumGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const frustumType = value._frustumType; + const frustum = value._frustum; + array[startingIndex++] = frustumType; + if (frustumType === PERSPECTIVE) { + PerspectiveFrustum_default.pack(frustum, array, startingIndex); + startingIndex += PerspectiveFrustum_default.packedLength; + } else { + OrthographicFrustum_default.pack(frustum, array, startingIndex); + startingIndex += OrthographicFrustum_default.packedLength; + } + Cartesian3_default.pack(value._origin, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Quaternion_default.pack(value._orientation, array, startingIndex); + startingIndex += Quaternion_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex] = value._drawNearPlane ? 1 : 0; + return array; +}; +var scratchPackPerspective = new PerspectiveFrustum_default(); +var scratchPackOrthographic = new OrthographicFrustum_default(); +var scratchPackQuaternion = new Quaternion_default(); +var scratchPackorigin = new Cartesian3_default(); +var scratchVertexFormat = new VertexFormat_default(); +FrustumGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const frustumType = array[startingIndex++]; + let frustum; + if (frustumType === PERSPECTIVE) { + frustum = PerspectiveFrustum_default.unpack( + array, + startingIndex, + scratchPackPerspective + ); + startingIndex += PerspectiveFrustum_default.packedLength; + } else { + frustum = OrthographicFrustum_default.unpack( + array, + startingIndex, + scratchPackOrthographic + ); + startingIndex += OrthographicFrustum_default.packedLength; + } + const origin = Cartesian3_default.unpack(array, startingIndex, scratchPackorigin); + startingIndex += Cartesian3_default.packedLength; + const orientation = Quaternion_default.unpack( + array, + startingIndex, + scratchPackQuaternion + ); + startingIndex += Quaternion_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const drawNearPlane = array[startingIndex] === 1; + if (!defined_default(result)) { + return new FrustumGeometry({ + frustum, + origin, + orientation, + vertexFormat, + _drawNearPlane: drawNearPlane + }); + } + const frustumResult = frustumType === result._frustumType ? result._frustum : void 0; + result._frustum = frustum.clone(frustumResult); + result._frustumType = frustumType; + result._origin = Cartesian3_default.clone(origin, result._origin); + result._orientation = Quaternion_default.clone(orientation, result._orientation); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._drawNearPlane = drawNearPlane; + return result; +}; +function getAttributes(offset, normals, tangents, bitangents, st, normal, tangent, bitangent) { + const stOffset = offset / 3 * 2; + for (let i = 0; i < 4; ++i) { + if (defined_default(normals)) { + normals[offset] = normal.x; + normals[offset + 1] = normal.y; + normals[offset + 2] = normal.z; + } + if (defined_default(tangents)) { + tangents[offset] = tangent.x; + tangents[offset + 1] = tangent.y; + tangents[offset + 2] = tangent.z; + } + if (defined_default(bitangents)) { + bitangents[offset] = bitangent.x; + bitangents[offset + 1] = bitangent.y; + bitangents[offset + 2] = bitangent.z; + } + offset += 3; + } + st[stOffset] = 0; + st[stOffset + 1] = 0; + st[stOffset + 2] = 1; + st[stOffset + 3] = 0; + st[stOffset + 4] = 1; + st[stOffset + 5] = 1; + st[stOffset + 6] = 0; + st[stOffset + 7] = 1; +} +var scratchRotationMatrix = new Matrix3_default(); +var scratchViewMatrix = new Matrix4_default(); +var scratchInverseMatrix = new Matrix4_default(); +var scratchXDirection = new Cartesian3_default(); +var scratchYDirection = new Cartesian3_default(); +var scratchZDirection = new Cartesian3_default(); +var scratchNegativeX = new Cartesian3_default(); +var scratchNegativeY = new Cartesian3_default(); +var scratchNegativeZ = new Cartesian3_default(); +var frustumSplits = new Array(3); +var frustumCornersNDC = new Array(4); +frustumCornersNDC[0] = new Cartesian4_default(-1, -1, 1, 1); +frustumCornersNDC[1] = new Cartesian4_default(1, -1, 1, 1); +frustumCornersNDC[2] = new Cartesian4_default(1, 1, 1, 1); +frustumCornersNDC[3] = new Cartesian4_default(-1, 1, 1, 1); +var scratchFrustumCorners = new Array(4); +for (let i = 0; i < 4; ++i) { + scratchFrustumCorners[i] = new Cartesian4_default(); +} +FrustumGeometry._computeNearFarPlanes = function(origin, orientation, frustumType, frustum, positions, xDirection, yDirection, zDirection) { + const rotationMatrix = Matrix3_default.fromQuaternion( + orientation, + scratchRotationMatrix + ); + let x = defaultValue_default(xDirection, scratchXDirection); + let y = defaultValue_default(yDirection, scratchYDirection); + let z = defaultValue_default(zDirection, scratchZDirection); + x = Matrix3_default.getColumn(rotationMatrix, 0, x); + y = Matrix3_default.getColumn(rotationMatrix, 1, y); + z = Matrix3_default.getColumn(rotationMatrix, 2, z); + Cartesian3_default.normalize(x, x); + Cartesian3_default.normalize(y, y); + Cartesian3_default.normalize(z, z); + Cartesian3_default.negate(x, x); + const view = Matrix4_default.computeView(origin, z, y, x, scratchViewMatrix); + let inverseView; + let inverseViewProjection; + const projection = frustum.projectionMatrix; + if (frustumType === PERSPECTIVE) { + const viewProjection = Matrix4_default.multiply( + projection, + view, + scratchInverseMatrix + ); + inverseViewProjection = Matrix4_default.inverse( + viewProjection, + scratchInverseMatrix + ); + } else { + inverseView = Matrix4_default.inverseTransformation(view, scratchInverseMatrix); + } + if (defined_default(inverseViewProjection)) { + frustumSplits[0] = frustum.near; + frustumSplits[1] = frustum.far; + } else { + frustumSplits[0] = 0; + frustumSplits[1] = frustum.near; + frustumSplits[2] = frustum.far; + } + for (let i = 0; i < 2; ++i) { + for (let j = 0; j < 4; ++j) { + let corner = Cartesian4_default.clone( + frustumCornersNDC[j], + scratchFrustumCorners[j] + ); + if (!defined_default(inverseViewProjection)) { + const offCenterFrustum = frustum.offCenterFrustum; + if (defined_default(offCenterFrustum)) { + frustum = offCenterFrustum; + } + const near = frustumSplits[i]; + const far = frustumSplits[i + 1]; + corner.x = (corner.x * (frustum.right - frustum.left) + frustum.left + frustum.right) * 0.5; + corner.y = (corner.y * (frustum.top - frustum.bottom) + frustum.bottom + frustum.top) * 0.5; + corner.z = (corner.z * (near - far) - near - far) * 0.5; + corner.w = 1; + Matrix4_default.multiplyByVector(inverseView, corner, corner); + } else { + corner = Matrix4_default.multiplyByVector( + inverseViewProjection, + corner, + corner + ); + const w = 1 / corner.w; + Cartesian3_default.multiplyByScalar(corner, w, corner); + Cartesian3_default.subtract(corner, origin, corner); + Cartesian3_default.normalize(corner, corner); + const fac = Cartesian3_default.dot(z, corner); + Cartesian3_default.multiplyByScalar(corner, frustumSplits[i] / fac, corner); + Cartesian3_default.add(corner, origin, corner); + } + positions[12 * i + j * 3] = corner.x; + positions[12 * i + j * 3 + 1] = corner.y; + positions[12 * i + j * 3 + 2] = corner.z; + } + } +}; +FrustumGeometry.createGeometry = function(frustumGeometry) { + const frustumType = frustumGeometry._frustumType; + const frustum = frustumGeometry._frustum; + const origin = frustumGeometry._origin; + const orientation = frustumGeometry._orientation; + const drawNearPlane = frustumGeometry._drawNearPlane; + const vertexFormat = frustumGeometry._vertexFormat; + const numberOfPlanes = drawNearPlane ? 6 : 5; + let positions = new Float64Array(3 * 4 * 6); + FrustumGeometry._computeNearFarPlanes( + origin, + orientation, + frustumType, + frustum, + positions + ); + let offset = 3 * 4 * 2; + positions[offset] = positions[3 * 4]; + positions[offset + 1] = positions[3 * 4 + 1]; + positions[offset + 2] = positions[3 * 4 + 2]; + positions[offset + 3] = positions[0]; + positions[offset + 4] = positions[1]; + positions[offset + 5] = positions[2]; + positions[offset + 6] = positions[3 * 3]; + positions[offset + 7] = positions[3 * 3 + 1]; + positions[offset + 8] = positions[3 * 3 + 2]; + positions[offset + 9] = positions[3 * 7]; + positions[offset + 10] = positions[3 * 7 + 1]; + positions[offset + 11] = positions[3 * 7 + 2]; + offset += 3 * 4; + positions[offset] = positions[3 * 5]; + positions[offset + 1] = positions[3 * 5 + 1]; + positions[offset + 2] = positions[3 * 5 + 2]; + positions[offset + 3] = positions[3]; + positions[offset + 4] = positions[3 + 1]; + positions[offset + 5] = positions[3 + 2]; + positions[offset + 6] = positions[0]; + positions[offset + 7] = positions[1]; + positions[offset + 8] = positions[2]; + positions[offset + 9] = positions[3 * 4]; + positions[offset + 10] = positions[3 * 4 + 1]; + positions[offset + 11] = positions[3 * 4 + 2]; + offset += 3 * 4; + positions[offset] = positions[3]; + positions[offset + 1] = positions[3 + 1]; + positions[offset + 2] = positions[3 + 2]; + positions[offset + 3] = positions[3 * 5]; + positions[offset + 4] = positions[3 * 5 + 1]; + positions[offset + 5] = positions[3 * 5 + 2]; + positions[offset + 6] = positions[3 * 6]; + positions[offset + 7] = positions[3 * 6 + 1]; + positions[offset + 8] = positions[3 * 6 + 2]; + positions[offset + 9] = positions[3 * 2]; + positions[offset + 10] = positions[3 * 2 + 1]; + positions[offset + 11] = positions[3 * 2 + 2]; + offset += 3 * 4; + positions[offset] = positions[3 * 2]; + positions[offset + 1] = positions[3 * 2 + 1]; + positions[offset + 2] = positions[3 * 2 + 2]; + positions[offset + 3] = positions[3 * 6]; + positions[offset + 4] = positions[3 * 6 + 1]; + positions[offset + 5] = positions[3 * 6 + 2]; + positions[offset + 6] = positions[3 * 7]; + positions[offset + 7] = positions[3 * 7 + 1]; + positions[offset + 8] = positions[3 * 7 + 2]; + positions[offset + 9] = positions[3 * 3]; + positions[offset + 10] = positions[3 * 3 + 1]; + positions[offset + 11] = positions[3 * 3 + 2]; + if (!drawNearPlane) { + positions = positions.subarray(3 * 4); + } + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }) + }); + if (defined_default(vertexFormat.normal) || defined_default(vertexFormat.tangent) || defined_default(vertexFormat.bitangent) || defined_default(vertexFormat.st)) { + const normals = defined_default(vertexFormat.normal) ? new Float32Array(3 * 4 * numberOfPlanes) : void 0; + const tangents = defined_default(vertexFormat.tangent) ? new Float32Array(3 * 4 * numberOfPlanes) : void 0; + const bitangents = defined_default(vertexFormat.bitangent) ? new Float32Array(3 * 4 * numberOfPlanes) : void 0; + const st = defined_default(vertexFormat.st) ? new Float32Array(2 * 4 * numberOfPlanes) : void 0; + const x = scratchXDirection; + const y = scratchYDirection; + const z = scratchZDirection; + const negativeX = Cartesian3_default.negate(x, scratchNegativeX); + const negativeY = Cartesian3_default.negate(y, scratchNegativeY); + const negativeZ = Cartesian3_default.negate(z, scratchNegativeZ); + offset = 0; + if (drawNearPlane) { + getAttributes(offset, normals, tangents, bitangents, st, negativeZ, x, y); + offset += 3 * 4; + } + getAttributes(offset, normals, tangents, bitangents, st, z, negativeX, y); + offset += 3 * 4; + getAttributes( + offset, + normals, + tangents, + bitangents, + st, + negativeX, + negativeZ, + y + ); + offset += 3 * 4; + getAttributes( + offset, + normals, + tangents, + bitangents, + st, + negativeY, + negativeZ, + negativeX + ); + offset += 3 * 4; + getAttributes(offset, normals, tangents, bitangents, st, x, z, y); + offset += 3 * 4; + getAttributes(offset, normals, tangents, bitangents, st, y, z, negativeX); + if (defined_default(normals)) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (defined_default(tangents)) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (defined_default(bitangents)) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (defined_default(st)) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: st + }); + } + } + const indices = new Uint16Array(6 * numberOfPlanes); + for (let i = 0; i < numberOfPlanes; ++i) { + const indexOffset = i * 6; + const index = i * 4; + indices[indexOffset] = index; + indices[indexOffset + 1] = index + 1; + indices[indexOffset + 2] = index + 2; + indices[indexOffset + 3] = index; + indices[indexOffset + 4] = index + 2; + indices[indexOffset + 5] = index + 3; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: BoundingSphere_default.fromVertices(positions) + }); +}; +var FrustumGeometry_default = FrustumGeometry; + +export { + OrthographicFrustum_default, + PerspectiveFrustum_default, + FrustumGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-7ZZ5LMZY.js b/public/assets/cesium/Workers/chunk-7ZZ5LMZY.js new file mode 100644 index 0000000..48b0c75 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-7ZZ5LMZY.js @@ -0,0 +1,2717 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import { + EncodedCartesian3_default +} from "./chunk-NGZJIN5Z.js"; +import { + IntersectionTests_default +} from "./chunk-QQOZO7KO.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttribute_default, + GeometryType_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default, + GeographicProjection_default, + Intersect_default +} from "./chunk-KHZNBFOH.js"; +import { + Cartesian4_default, + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/barycentricCoordinates.js +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartesian3 = new Cartesian3_default(); +function barycentricCoordinates(point, p0, p1, p2, result) { + Check_default.defined("point", point); + Check_default.defined("p0", p0); + Check_default.defined("p1", p1); + Check_default.defined("p2", p2); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + let v02; + let v12; + let v22; + let dot00; + let dot01; + let dot02; + let dot11; + let dot12; + if (!defined_default(p0.z)) { + if (Cartesian2_default.equalsEpsilon(point, p0, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_X, result); + } + if (Cartesian2_default.equalsEpsilon(point, p1, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_Y, result); + } + if (Cartesian2_default.equalsEpsilon(point, p2, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_Z, result); + } + v02 = Cartesian2_default.subtract(p1, p0, scratchCartesian1); + v12 = Cartesian2_default.subtract(p2, p0, scratchCartesian2); + v22 = Cartesian2_default.subtract(point, p0, scratchCartesian3); + dot00 = Cartesian2_default.dot(v02, v02); + dot01 = Cartesian2_default.dot(v02, v12); + dot02 = Cartesian2_default.dot(v02, v22); + dot11 = Cartesian2_default.dot(v12, v12); + dot12 = Cartesian2_default.dot(v12, v22); + } else { + if (Cartesian3_default.equalsEpsilon(point, p0, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_X, result); + } + if (Cartesian3_default.equalsEpsilon(point, p1, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_Y, result); + } + if (Cartesian3_default.equalsEpsilon(point, p2, Math_default.EPSILON14)) { + return Cartesian3_default.clone(Cartesian3_default.UNIT_Z, result); + } + v02 = Cartesian3_default.subtract(p1, p0, scratchCartesian1); + v12 = Cartesian3_default.subtract(p2, p0, scratchCartesian2); + v22 = Cartesian3_default.subtract(point, p0, scratchCartesian3); + dot00 = Cartesian3_default.dot(v02, v02); + dot01 = Cartesian3_default.dot(v02, v12); + dot02 = Cartesian3_default.dot(v02, v22); + dot11 = Cartesian3_default.dot(v12, v12); + dot12 = Cartesian3_default.dot(v12, v22); + } + result.y = dot11 * dot02 - dot01 * dot12; + result.z = dot00 * dot12 - dot01 * dot02; + const q = dot00 * dot11 - dot01 * dot01; + if (q === 0) { + return void 0; + } + result.y /= q; + result.z /= q; + result.x = 1 - result.y - result.z; + return result; +} +var barycentricCoordinates_default = barycentricCoordinates; + +// packages/engine/Source/Core/Tipsify.js +var Tipsify = {}; +Tipsify.calculateACMR = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const indices = options.indices; + let maximumIndex = options.maximumIndex; + const cacheSize = defaultValue_default(options.cacheSize, 24); + if (!defined_default(indices)) { + throw new DeveloperError_default("indices is required."); + } + const numIndices = indices.length; + if (numIndices < 3 || numIndices % 3 !== 0) { + throw new DeveloperError_default("indices length must be a multiple of three."); + } + if (maximumIndex <= 0) { + throw new DeveloperError_default("maximumIndex must be greater than zero."); + } + if (cacheSize < 3) { + throw new DeveloperError_default("cacheSize must be greater than two."); + } + if (!defined_default(maximumIndex)) { + maximumIndex = 0; + let currentIndex = 0; + let intoIndices = indices[currentIndex]; + while (currentIndex < numIndices) { + if (intoIndices > maximumIndex) { + maximumIndex = intoIndices; + } + ++currentIndex; + intoIndices = indices[currentIndex]; + } + } + const vertexTimeStamps = []; + for (let i = 0; i < maximumIndex + 1; i++) { + vertexTimeStamps[i] = 0; + } + let s = cacheSize + 1; + for (let j = 0; j < numIndices; ++j) { + if (s - vertexTimeStamps[indices[j]] > cacheSize) { + vertexTimeStamps[indices[j]] = s; + ++s; + } + } + return (s - cacheSize + 1) / (numIndices / 3); +}; +Tipsify.tipsify = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const indices = options.indices; + const maximumIndex = options.maximumIndex; + const cacheSize = defaultValue_default(options.cacheSize, 24); + let cursor; + function skipDeadEnd(vertices2, deadEnd2, indices2, maximumIndexPlusOne2) { + while (deadEnd2.length >= 1) { + const d = deadEnd2[deadEnd2.length - 1]; + deadEnd2.splice(deadEnd2.length - 1, 1); + if (vertices2[d].numLiveTriangles > 0) { + return d; + } + } + while (cursor < maximumIndexPlusOne2) { + if (vertices2[cursor].numLiveTriangles > 0) { + ++cursor; + return cursor - 1; + } + ++cursor; + } + return -1; + } + function getNextVertex(indices2, cacheSize2, oneRing2, vertices2, s2, deadEnd2, maximumIndexPlusOne2) { + let n = -1; + let p; + let m = -1; + let itOneRing = 0; + while (itOneRing < oneRing2.length) { + const index2 = oneRing2[itOneRing]; + if (vertices2[index2].numLiveTriangles) { + p = 0; + if (s2 - vertices2[index2].timeStamp + 2 * vertices2[index2].numLiveTriangles <= cacheSize2) { + p = s2 - vertices2[index2].timeStamp; + } + if (p > m || m === -1) { + m = p; + n = index2; + } + } + ++itOneRing; + } + if (n === -1) { + return skipDeadEnd(vertices2, deadEnd2, indices2, maximumIndexPlusOne2); + } + return n; + } + if (!defined_default(indices)) { + throw new DeveloperError_default("indices is required."); + } + const numIndices = indices.length; + if (numIndices < 3 || numIndices % 3 !== 0) { + throw new DeveloperError_default("indices length must be a multiple of three."); + } + if (maximumIndex <= 0) { + throw new DeveloperError_default("maximumIndex must be greater than zero."); + } + if (cacheSize < 3) { + throw new DeveloperError_default("cacheSize must be greater than two."); + } + let maximumIndexPlusOne = 0; + let currentIndex = 0; + let intoIndices = indices[currentIndex]; + const endIndex = numIndices; + if (defined_default(maximumIndex)) { + maximumIndexPlusOne = maximumIndex + 1; + } else { + while (currentIndex < endIndex) { + if (intoIndices > maximumIndexPlusOne) { + maximumIndexPlusOne = intoIndices; + } + ++currentIndex; + intoIndices = indices[currentIndex]; + } + if (maximumIndexPlusOne === -1) { + return 0; + } + ++maximumIndexPlusOne; + } + const vertices = []; + let i; + for (i = 0; i < maximumIndexPlusOne; i++) { + vertices[i] = { + numLiveTriangles: 0, + timeStamp: 0, + vertexTriangles: [] + }; + } + currentIndex = 0; + let triangle = 0; + while (currentIndex < endIndex) { + vertices[indices[currentIndex]].vertexTriangles.push(triangle); + ++vertices[indices[currentIndex]].numLiveTriangles; + vertices[indices[currentIndex + 1]].vertexTriangles.push(triangle); + ++vertices[indices[currentIndex + 1]].numLiveTriangles; + vertices[indices[currentIndex + 2]].vertexTriangles.push(triangle); + ++vertices[indices[currentIndex + 2]].numLiveTriangles; + ++triangle; + currentIndex += 3; + } + let f = 0; + let s = cacheSize + 1; + cursor = 1; + let oneRing = []; + const deadEnd = []; + let vertex; + let intoVertices; + let currentOutputIndex = 0; + const outputIndices = []; + const numTriangles = numIndices / 3; + const triangleEmitted = []; + for (i = 0; i < numTriangles; i++) { + triangleEmitted[i] = false; + } + let index; + let limit; + while (f !== -1) { + oneRing = []; + intoVertices = vertices[f]; + limit = intoVertices.vertexTriangles.length; + for (let k = 0; k < limit; ++k) { + triangle = intoVertices.vertexTriangles[k]; + if (!triangleEmitted[triangle]) { + triangleEmitted[triangle] = true; + currentIndex = triangle + triangle + triangle; + for (let j = 0; j < 3; ++j) { + index = indices[currentIndex]; + oneRing.push(index); + deadEnd.push(index); + outputIndices[currentOutputIndex] = index; + ++currentOutputIndex; + vertex = vertices[index]; + --vertex.numLiveTriangles; + if (s - vertex.timeStamp > cacheSize) { + vertex.timeStamp = s; + ++s; + } + ++currentIndex; + } + } + } + f = getNextVertex( + indices, + cacheSize, + oneRing, + vertices, + s, + deadEnd, + maximumIndexPlusOne + ); + } + return outputIndices; +}; +var Tipsify_default = Tipsify; + +// packages/engine/Source/Core/GeometryPipeline.js +var GeometryPipeline = {}; +function addTriangle(lines, index, i0, i1, i2) { + lines[index++] = i0; + lines[index++] = i1; + lines[index++] = i1; + lines[index++] = i2; + lines[index++] = i2; + lines[index] = i0; +} +function trianglesToLines(triangles) { + const count = triangles.length; + const size = count / 3 * 6; + const lines = IndexDatatype_default.createTypedArray(count, size); + let index = 0; + for (let i = 0; i < count; i += 3, index += 6) { + addTriangle(lines, index, triangles[i], triangles[i + 1], triangles[i + 2]); + } + return lines; +} +function triangleStripToLines(triangles) { + const count = triangles.length; + if (count >= 3) { + const size = (count - 2) * 6; + const lines = IndexDatatype_default.createTypedArray(count, size); + addTriangle(lines, 0, triangles[0], triangles[1], triangles[2]); + let index = 6; + for (let i = 3; i < count; ++i, index += 6) { + addTriangle( + lines, + index, + triangles[i - 1], + triangles[i], + triangles[i - 2] + ); + } + return lines; + } + return new Uint16Array(); +} +function triangleFanToLines(triangles) { + if (triangles.length > 0) { + const count = triangles.length - 1; + const size = (count - 1) * 6; + const lines = IndexDatatype_default.createTypedArray(count, size); + const base = triangles[0]; + let index = 0; + for (let i = 1; i < count; ++i, index += 6) { + addTriangle(lines, index, base, triangles[i], triangles[i + 1]); + } + return lines; + } + return new Uint16Array(); +} +GeometryPipeline.toWireframe = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const indices = geometry.indices; + if (defined_default(indices)) { + switch (geometry.primitiveType) { + case PrimitiveType_default.TRIANGLES: + geometry.indices = trianglesToLines(indices); + break; + case PrimitiveType_default.TRIANGLE_STRIP: + geometry.indices = triangleStripToLines(indices); + break; + case PrimitiveType_default.TRIANGLE_FAN: + geometry.indices = triangleFanToLines(indices); + break; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default( + "geometry.primitiveType must be TRIANGLES, TRIANGLE_STRIP, or TRIANGLE_FAN." + ); + } + geometry.primitiveType = PrimitiveType_default.LINES; + } + return geometry; +}; +GeometryPipeline.createLineSegmentsForVectors = function(geometry, attributeName, length) { + attributeName = defaultValue_default(attributeName, "normal"); + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + if (!defined_default(geometry.attributes.position)) { + throw new DeveloperError_default("geometry.attributes.position is required."); + } + if (!defined_default(geometry.attributes[attributeName])) { + throw new DeveloperError_default( + `geometry.attributes must have an attribute with the same name as the attributeName parameter, ${attributeName}.` + ); + } + length = defaultValue_default(length, 1e4); + const positions = geometry.attributes.position.values; + const vectors = geometry.attributes[attributeName].values; + const positionsLength = positions.length; + const newPositions = new Float64Array(2 * positionsLength); + let j = 0; + for (let i = 0; i < positionsLength; i += 3) { + newPositions[j++] = positions[i]; + newPositions[j++] = positions[i + 1]; + newPositions[j++] = positions[i + 2]; + newPositions[j++] = positions[i] + vectors[i] * length; + newPositions[j++] = positions[i + 1] + vectors[i + 1] * length; + newPositions[j++] = positions[i + 2] + vectors[i + 2] * length; + } + let newBoundingSphere; + const bs = geometry.boundingSphere; + if (defined_default(bs)) { + newBoundingSphere = new BoundingSphere_default(bs.center, bs.radius + length); + } + return new Geometry_default({ + attributes: { + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: newPositions + }) + }, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: newBoundingSphere + }); +}; +GeometryPipeline.createAttributeLocations = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const semantics = [ + "position", + "positionHigh", + "positionLow", + // From VertexFormat.position - after 2D projection and high-precision encoding + "position3DHigh", + "position3DLow", + "position2DHigh", + "position2DLow", + // From Primitive + "pickColor", + // From VertexFormat + "normal", + "st", + "tangent", + "bitangent", + // For shadow volumes + "extrudeDirection", + // From compressing texture coordinates and normals + "compressedAttributes" + ]; + const attributes = geometry.attributes; + const indices = {}; + let j = 0; + let i; + const len = semantics.length; + for (i = 0; i < len; ++i) { + const semantic = semantics[i]; + if (defined_default(attributes[semantic])) { + indices[semantic] = j++; + } + } + for (const name in attributes) { + if (attributes.hasOwnProperty(name) && !defined_default(indices[name])) { + indices[name] = j++; + } + } + return indices; +}; +GeometryPipeline.reorderForPreVertexCache = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const numVertices = Geometry_default.computeNumberOfVertices(geometry); + const indices = geometry.indices; + if (defined_default(indices)) { + const indexCrossReferenceOldToNew = new Int32Array(numVertices); + for (let i = 0; i < numVertices; i++) { + indexCrossReferenceOldToNew[i] = -1; + } + const indicesIn = indices; + const numIndices = indicesIn.length; + const indicesOut = IndexDatatype_default.createTypedArray(numVertices, numIndices); + let intoIndicesIn = 0; + let intoIndicesOut = 0; + let nextIndex = 0; + let tempIndex; + while (intoIndicesIn < numIndices) { + tempIndex = indexCrossReferenceOldToNew[indicesIn[intoIndicesIn]]; + if (tempIndex !== -1) { + indicesOut[intoIndicesOut] = tempIndex; + } else { + tempIndex = indicesIn[intoIndicesIn]; + indexCrossReferenceOldToNew[tempIndex] = nextIndex; + indicesOut[intoIndicesOut] = nextIndex; + ++nextIndex; + } + ++intoIndicesIn; + ++intoIndicesOut; + } + geometry.indices = indicesOut; + const attributes = geometry.attributes; + for (const property in attributes) { + if (attributes.hasOwnProperty(property) && defined_default(attributes[property]) && defined_default(attributes[property].values)) { + const attribute = attributes[property]; + const elementsIn = attribute.values; + let intoElementsIn = 0; + const numComponents = attribute.componentsPerAttribute; + const elementsOut = ComponentDatatype_default.createTypedArray( + attribute.componentDatatype, + nextIndex * numComponents + ); + while (intoElementsIn < numVertices) { + const temp = indexCrossReferenceOldToNew[intoElementsIn]; + if (temp !== -1) { + for (let j = 0; j < numComponents; j++) { + elementsOut[numComponents * temp + j] = elementsIn[numComponents * intoElementsIn + j]; + } + } + ++intoElementsIn; + } + attribute.values = elementsOut; + } + } + } + return geometry; +}; +GeometryPipeline.reorderForPostVertexCache = function(geometry, cacheCapacity) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const indices = geometry.indices; + if (geometry.primitiveType === PrimitiveType_default.TRIANGLES && defined_default(indices)) { + const numIndices = indices.length; + let maximumIndex = 0; + for (let j = 0; j < numIndices; j++) { + if (indices[j] > maximumIndex) { + maximumIndex = indices[j]; + } + } + geometry.indices = Tipsify_default.tipsify({ + indices, + maximumIndex, + cacheSize: cacheCapacity + }); + } + return geometry; +}; +function copyAttributesDescriptions(attributes) { + const newAttributes = {}; + for (const attribute in attributes) { + if (attributes.hasOwnProperty(attribute) && defined_default(attributes[attribute]) && defined_default(attributes[attribute].values)) { + const attr = attributes[attribute]; + newAttributes[attribute] = new GeometryAttribute_default({ + componentDatatype: attr.componentDatatype, + componentsPerAttribute: attr.componentsPerAttribute, + normalize: attr.normalize, + values: [] + }); + } + } + return newAttributes; +} +function copyVertex(destinationAttributes, sourceAttributes, index) { + for (const attribute in sourceAttributes) { + if (sourceAttributes.hasOwnProperty(attribute) && defined_default(sourceAttributes[attribute]) && defined_default(sourceAttributes[attribute].values)) { + const attr = sourceAttributes[attribute]; + for (let k = 0; k < attr.componentsPerAttribute; ++k) { + destinationAttributes[attribute].values.push( + attr.values[index * attr.componentsPerAttribute + k] + ); + } + } + } +} +GeometryPipeline.fitToUnsignedShortIndices = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + if (defined_default(geometry.indices) && geometry.primitiveType !== PrimitiveType_default.TRIANGLES && geometry.primitiveType !== PrimitiveType_default.LINES && geometry.primitiveType !== PrimitiveType_default.POINTS) { + throw new DeveloperError_default( + "geometry.primitiveType must equal to PrimitiveType.TRIANGLES, PrimitiveType.LINES, or PrimitiveType.POINTS." + ); + } + const geometries = []; + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (defined_default(geometry.indices) && numberOfVertices >= Math_default.SIXTY_FOUR_KILOBYTES) { + let oldToNewIndex = []; + let newIndices = []; + let currentIndex = 0; + let newAttributes = copyAttributesDescriptions(geometry.attributes); + const originalIndices = geometry.indices; + const numberOfIndices = originalIndices.length; + let indicesPerPrimitive; + if (geometry.primitiveType === PrimitiveType_default.TRIANGLES) { + indicesPerPrimitive = 3; + } else if (geometry.primitiveType === PrimitiveType_default.LINES) { + indicesPerPrimitive = 2; + } else if (geometry.primitiveType === PrimitiveType_default.POINTS) { + indicesPerPrimitive = 1; + } + for (let j = 0; j < numberOfIndices; j += indicesPerPrimitive) { + for (let k = 0; k < indicesPerPrimitive; ++k) { + const x = originalIndices[j + k]; + let i = oldToNewIndex[x]; + if (!defined_default(i)) { + i = currentIndex++; + oldToNewIndex[x] = i; + copyVertex(newAttributes, geometry.attributes, x); + } + newIndices.push(i); + } + if (currentIndex + indicesPerPrimitive >= Math_default.SIXTY_FOUR_KILOBYTES) { + geometries.push( + new Geometry_default({ + attributes: newAttributes, + indices: newIndices, + primitiveType: geometry.primitiveType, + boundingSphere: geometry.boundingSphere, + boundingSphereCV: geometry.boundingSphereCV + }) + ); + oldToNewIndex = []; + newIndices = []; + currentIndex = 0; + newAttributes = copyAttributesDescriptions(geometry.attributes); + } + } + if (newIndices.length !== 0) { + geometries.push( + new Geometry_default({ + attributes: newAttributes, + indices: newIndices, + primitiveType: geometry.primitiveType, + boundingSphere: geometry.boundingSphere, + boundingSphereCV: geometry.boundingSphereCV + }) + ); + } + } else { + geometries.push(geometry); + } + return geometries; +}; +var scratchProjectTo2DCartesian3 = new Cartesian3_default(); +var scratchProjectTo2DCartographic = new Cartographic_default(); +GeometryPipeline.projectTo2D = function(geometry, attributeName, attributeName3D, attributeName2D, projection) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + if (!defined_default(attributeName)) { + throw new DeveloperError_default("attributeName is required."); + } + if (!defined_default(attributeName3D)) { + throw new DeveloperError_default("attributeName3D is required."); + } + if (!defined_default(attributeName2D)) { + throw new DeveloperError_default("attributeName2D is required."); + } + if (!defined_default(geometry.attributes[attributeName])) { + throw new DeveloperError_default( + `geometry must have attribute matching the attributeName argument: ${attributeName}.` + ); + } + if (geometry.attributes[attributeName].componentDatatype !== ComponentDatatype_default.DOUBLE) { + throw new DeveloperError_default( + "The attribute componentDatatype must be ComponentDatatype.DOUBLE." + ); + } + const attribute = geometry.attributes[attributeName]; + projection = defined_default(projection) ? projection : new GeographicProjection_default(); + const ellipsoid = projection.ellipsoid; + const values3D = attribute.values; + const projectedValues = new Float64Array(values3D.length); + let index = 0; + for (let i = 0; i < values3D.length; i += 3) { + const value = Cartesian3_default.fromArray( + values3D, + i, + scratchProjectTo2DCartesian3 + ); + const lonLat = ellipsoid.cartesianToCartographic( + value, + scratchProjectTo2DCartographic + ); + if (!defined_default(lonLat)) { + throw new DeveloperError_default( + `Could not project point (${value.x}, ${value.y}, ${value.z}) to 2D.` + ); + } + const projectedLonLat = projection.project( + lonLat, + scratchProjectTo2DCartesian3 + ); + projectedValues[index++] = projectedLonLat.x; + projectedValues[index++] = projectedLonLat.y; + projectedValues[index++] = projectedLonLat.z; + } + geometry.attributes[attributeName3D] = attribute; + geometry.attributes[attributeName2D] = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: projectedValues + }); + delete geometry.attributes[attributeName]; + return geometry; +}; +var encodedResult = { + high: 0, + low: 0 +}; +GeometryPipeline.encodeAttribute = function(geometry, attributeName, attributeHighName, attributeLowName) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + if (!defined_default(attributeName)) { + throw new DeveloperError_default("attributeName is required."); + } + if (!defined_default(attributeHighName)) { + throw new DeveloperError_default("attributeHighName is required."); + } + if (!defined_default(attributeLowName)) { + throw new DeveloperError_default("attributeLowName is required."); + } + if (!defined_default(geometry.attributes[attributeName])) { + throw new DeveloperError_default( + `geometry must have attribute matching the attributeName argument: ${attributeName}.` + ); + } + if (geometry.attributes[attributeName].componentDatatype !== ComponentDatatype_default.DOUBLE) { + throw new DeveloperError_default( + "The attribute componentDatatype must be ComponentDatatype.DOUBLE." + ); + } + const attribute = geometry.attributes[attributeName]; + const values = attribute.values; + const length = values.length; + const highValues = new Float32Array(length); + const lowValues = new Float32Array(length); + for (let i = 0; i < length; ++i) { + EncodedCartesian3_default.encode(values[i], encodedResult); + highValues[i] = encodedResult.high; + lowValues[i] = encodedResult.low; + } + const componentsPerAttribute = attribute.componentsPerAttribute; + geometry.attributes[attributeHighName] = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute, + values: highValues + }); + geometry.attributes[attributeLowName] = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute, + values: lowValues + }); + delete geometry.attributes[attributeName]; + return geometry; +}; +var scratchCartesian32 = new Cartesian3_default(); +function transformPoint(matrix, attribute) { + if (defined_default(attribute)) { + const values = attribute.values; + const length = values.length; + for (let i = 0; i < length; i += 3) { + Cartesian3_default.unpack(values, i, scratchCartesian32); + Matrix4_default.multiplyByPoint(matrix, scratchCartesian32, scratchCartesian32); + Cartesian3_default.pack(scratchCartesian32, values, i); + } + } +} +function transformVector(matrix, attribute) { + if (defined_default(attribute)) { + const values = attribute.values; + const length = values.length; + for (let i = 0; i < length; i += 3) { + Cartesian3_default.unpack(values, i, scratchCartesian32); + Matrix3_default.multiplyByVector(matrix, scratchCartesian32, scratchCartesian32); + scratchCartesian32 = Cartesian3_default.normalize( + scratchCartesian32, + scratchCartesian32 + ); + Cartesian3_default.pack(scratchCartesian32, values, i); + } + } +} +var inverseTranspose = new Matrix4_default(); +var normalMatrix = new Matrix3_default(); +GeometryPipeline.transformToWorldCoordinates = function(instance) { + if (!defined_default(instance)) { + throw new DeveloperError_default("instance is required."); + } + const modelMatrix = instance.modelMatrix; + if (Matrix4_default.equals(modelMatrix, Matrix4_default.IDENTITY)) { + return instance; + } + const attributes = instance.geometry.attributes; + transformPoint(modelMatrix, attributes.position); + transformPoint(modelMatrix, attributes.prevPosition); + transformPoint(modelMatrix, attributes.nextPosition); + if (defined_default(attributes.normal) || defined_default(attributes.tangent) || defined_default(attributes.bitangent)) { + Matrix4_default.inverse(modelMatrix, inverseTranspose); + Matrix4_default.transpose(inverseTranspose, inverseTranspose); + Matrix4_default.getMatrix3(inverseTranspose, normalMatrix); + transformVector(normalMatrix, attributes.normal); + transformVector(normalMatrix, attributes.tangent); + transformVector(normalMatrix, attributes.bitangent); + } + const boundingSphere = instance.geometry.boundingSphere; + if (defined_default(boundingSphere)) { + instance.geometry.boundingSphere = BoundingSphere_default.transform( + boundingSphere, + modelMatrix, + boundingSphere + ); + } + instance.modelMatrix = Matrix4_default.clone(Matrix4_default.IDENTITY); + return instance; +}; +function findAttributesInAllGeometries(instances, propertyName) { + const length = instances.length; + const attributesInAllGeometries = {}; + const attributes0 = instances[0][propertyName].attributes; + let name; + for (name in attributes0) { + if (attributes0.hasOwnProperty(name) && defined_default(attributes0[name]) && defined_default(attributes0[name].values)) { + const attribute = attributes0[name]; + let numberOfComponents = attribute.values.length; + let inAllGeometries = true; + for (let i = 1; i < length; ++i) { + const otherAttribute = instances[i][propertyName].attributes[name]; + if (!defined_default(otherAttribute) || attribute.componentDatatype !== otherAttribute.componentDatatype || attribute.componentsPerAttribute !== otherAttribute.componentsPerAttribute || attribute.normalize !== otherAttribute.normalize) { + inAllGeometries = false; + break; + } + numberOfComponents += otherAttribute.values.length; + } + if (inAllGeometries) { + attributesInAllGeometries[name] = new GeometryAttribute_default({ + componentDatatype: attribute.componentDatatype, + componentsPerAttribute: attribute.componentsPerAttribute, + normalize: attribute.normalize, + values: ComponentDatatype_default.createTypedArray( + attribute.componentDatatype, + numberOfComponents + ) + }); + } + } + } + return attributesInAllGeometries; +} +var tempScratch = new Cartesian3_default(); +function combineGeometries(instances, propertyName) { + const length = instances.length; + let name; + let i; + let j; + let k; + const m = instances[0].modelMatrix; + const haveIndices = defined_default(instances[0][propertyName].indices); + const primitiveType = instances[0][propertyName].primitiveType; + for (i = 1; i < length; ++i) { + if (!Matrix4_default.equals(instances[i].modelMatrix, m)) { + throw new DeveloperError_default("All instances must have the same modelMatrix."); + } + if (defined_default(instances[i][propertyName].indices) !== haveIndices) { + throw new DeveloperError_default( + "All instance geometries must have an indices or not have one." + ); + } + if (instances[i][propertyName].primitiveType !== primitiveType) { + throw new DeveloperError_default( + "All instance geometries must have the same primitiveType." + ); + } + } + const attributes = findAttributesInAllGeometries(instances, propertyName); + let values; + let sourceValues; + let sourceValuesLength; + for (name in attributes) { + if (attributes.hasOwnProperty(name)) { + values = attributes[name].values; + k = 0; + for (i = 0; i < length; ++i) { + sourceValues = instances[i][propertyName].attributes[name].values; + sourceValuesLength = sourceValues.length; + for (j = 0; j < sourceValuesLength; ++j) { + values[k++] = sourceValues[j]; + } + } + } + } + let indices; + if (haveIndices) { + let numberOfIndices = 0; + for (i = 0; i < length; ++i) { + numberOfIndices += instances[i][propertyName].indices.length; + } + const numberOfVertices = Geometry_default.computeNumberOfVertices( + new Geometry_default({ + attributes, + primitiveType: PrimitiveType_default.POINTS + }) + ); + const destIndices = IndexDatatype_default.createTypedArray( + numberOfVertices, + numberOfIndices + ); + let destOffset = 0; + let offset = 0; + for (i = 0; i < length; ++i) { + const sourceIndices = instances[i][propertyName].indices; + const sourceIndicesLen = sourceIndices.length; + for (k = 0; k < sourceIndicesLen; ++k) { + destIndices[destOffset++] = offset + sourceIndices[k]; + } + offset += Geometry_default.computeNumberOfVertices(instances[i][propertyName]); + } + indices = destIndices; + } + let center = new Cartesian3_default(); + let radius = 0; + let bs; + for (i = 0; i < length; ++i) { + bs = instances[i][propertyName].boundingSphere; + if (!defined_default(bs)) { + center = void 0; + break; + } + Cartesian3_default.add(bs.center, center, center); + } + if (defined_default(center)) { + Cartesian3_default.divideByScalar(center, length, center); + for (i = 0; i < length; ++i) { + bs = instances[i][propertyName].boundingSphere; + const tempRadius = Cartesian3_default.magnitude( + Cartesian3_default.subtract(bs.center, center, tempScratch) + ) + bs.radius; + if (tempRadius > radius) { + radius = tempRadius; + } + } + } + return new Geometry_default({ + attributes, + indices, + primitiveType, + boundingSphere: defined_default(center) ? new BoundingSphere_default(center, radius) : void 0 + }); +} +GeometryPipeline.combineInstances = function(instances) { + if (!defined_default(instances) || instances.length < 1) { + throw new DeveloperError_default( + "instances is required and must have length greater than zero." + ); + } + const instanceGeometry = []; + const instanceSplitGeometry = []; + const length = instances.length; + for (let i = 0; i < length; ++i) { + const instance = instances[i]; + if (defined_default(instance.geometry)) { + instanceGeometry.push(instance); + } else if (defined_default(instance.westHemisphereGeometry) && defined_default(instance.eastHemisphereGeometry)) { + instanceSplitGeometry.push(instance); + } + } + const geometries = []; + if (instanceGeometry.length > 0) { + geometries.push(combineGeometries(instanceGeometry, "geometry")); + } + if (instanceSplitGeometry.length > 0) { + geometries.push( + combineGeometries(instanceSplitGeometry, "westHemisphereGeometry") + ); + geometries.push( + combineGeometries(instanceSplitGeometry, "eastHemisphereGeometry") + ); + } + return geometries; +}; +var normal = new Cartesian3_default(); +var v0 = new Cartesian3_default(); +var v1 = new Cartesian3_default(); +var v2 = new Cartesian3_default(); +GeometryPipeline.computeNormal = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + if (!defined_default(geometry.attributes.position) || !defined_default(geometry.attributes.position.values)) { + throw new DeveloperError_default( + "geometry.attributes.position.values is required." + ); + } + if (!defined_default(geometry.indices)) { + throw new DeveloperError_default("geometry.indices is required."); + } + if (geometry.indices.length < 2 || geometry.indices.length % 3 !== 0) { + throw new DeveloperError_default( + "geometry.indices length must be greater than 0 and be a multiple of 3." + ); + } + if (geometry.primitiveType !== PrimitiveType_default.TRIANGLES) { + throw new DeveloperError_default( + "geometry.primitiveType must be PrimitiveType.TRIANGLES." + ); + } + const indices = geometry.indices; + const attributes = geometry.attributes; + const vertices = attributes.position.values; + const numVertices = attributes.position.values.length / 3; + const numIndices = indices.length; + const normalsPerVertex = new Array(numVertices); + const normalsPerTriangle = new Array(numIndices / 3); + const normalIndices = new Array(numIndices); + let i; + for (i = 0; i < numVertices; i++) { + normalsPerVertex[i] = { + indexOffset: 0, + count: 0, + currentCount: 0 + }; + } + let j = 0; + for (i = 0; i < numIndices; i += 3) { + const i0 = indices[i]; + const i1 = indices[i + 1]; + const i2 = indices[i + 2]; + const i03 = i0 * 3; + const i13 = i1 * 3; + const i23 = i2 * 3; + v0.x = vertices[i03]; + v0.y = vertices[i03 + 1]; + v0.z = vertices[i03 + 2]; + v1.x = vertices[i13]; + v1.y = vertices[i13 + 1]; + v1.z = vertices[i13 + 2]; + v2.x = vertices[i23]; + v2.y = vertices[i23 + 1]; + v2.z = vertices[i23 + 2]; + normalsPerVertex[i0].count++; + normalsPerVertex[i1].count++; + normalsPerVertex[i2].count++; + Cartesian3_default.subtract(v1, v0, v1); + Cartesian3_default.subtract(v2, v0, v2); + normalsPerTriangle[j] = Cartesian3_default.cross(v1, v2, new Cartesian3_default()); + j++; + } + let indexOffset = 0; + for (i = 0; i < numVertices; i++) { + normalsPerVertex[i].indexOffset += indexOffset; + indexOffset += normalsPerVertex[i].count; + } + j = 0; + let vertexNormalData; + for (i = 0; i < numIndices; i += 3) { + vertexNormalData = normalsPerVertex[indices[i]]; + let index = vertexNormalData.indexOffset + vertexNormalData.currentCount; + normalIndices[index] = j; + vertexNormalData.currentCount++; + vertexNormalData = normalsPerVertex[indices[i + 1]]; + index = vertexNormalData.indexOffset + vertexNormalData.currentCount; + normalIndices[index] = j; + vertexNormalData.currentCount++; + vertexNormalData = normalsPerVertex[indices[i + 2]]; + index = vertexNormalData.indexOffset + vertexNormalData.currentCount; + normalIndices[index] = j; + vertexNormalData.currentCount++; + j++; + } + const normalValues = new Float32Array(numVertices * 3); + for (i = 0; i < numVertices; i++) { + const i3 = i * 3; + vertexNormalData = normalsPerVertex[i]; + Cartesian3_default.clone(Cartesian3_default.ZERO, normal); + if (vertexNormalData.count > 0) { + for (j = 0; j < vertexNormalData.count; j++) { + Cartesian3_default.add( + normal, + normalsPerTriangle[normalIndices[vertexNormalData.indexOffset + j]], + normal + ); + } + if (Cartesian3_default.equalsEpsilon(Cartesian3_default.ZERO, normal, Math_default.EPSILON10)) { + Cartesian3_default.clone( + normalsPerTriangle[normalIndices[vertexNormalData.indexOffset]], + normal + ); + } + } + if (Cartesian3_default.equalsEpsilon(Cartesian3_default.ZERO, normal, Math_default.EPSILON10)) { + normal.z = 1; + } + Cartesian3_default.normalize(normal, normal); + normalValues[i3] = normal.x; + normalValues[i3 + 1] = normal.y; + normalValues[i3 + 2] = normal.z; + } + geometry.attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normalValues + }); + return geometry; +}; +var normalScratch = new Cartesian3_default(); +var normalScale = new Cartesian3_default(); +var tScratch = new Cartesian3_default(); +GeometryPipeline.computeTangentAndBitangent = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const attributes = geometry.attributes; + const indices = geometry.indices; + if (!defined_default(attributes.position) || !defined_default(attributes.position.values)) { + throw new DeveloperError_default( + "geometry.attributes.position.values is required." + ); + } + if (!defined_default(attributes.normal) || !defined_default(attributes.normal.values)) { + throw new DeveloperError_default("geometry.attributes.normal.values is required."); + } + if (!defined_default(attributes.st) || !defined_default(attributes.st.values)) { + throw new DeveloperError_default("geometry.attributes.st.values is required."); + } + if (!defined_default(indices)) { + throw new DeveloperError_default("geometry.indices is required."); + } + if (indices.length < 2 || indices.length % 3 !== 0) { + throw new DeveloperError_default( + "geometry.indices length must be greater than 0 and be a multiple of 3." + ); + } + if (geometry.primitiveType !== PrimitiveType_default.TRIANGLES) { + throw new DeveloperError_default( + "geometry.primitiveType must be PrimitiveType.TRIANGLES." + ); + } + const vertices = geometry.attributes.position.values; + const normals = geometry.attributes.normal.values; + const st = geometry.attributes.st.values; + const numVertices = geometry.attributes.position.values.length / 3; + const numIndices = indices.length; + const tan1 = new Array(numVertices * 3); + let i; + for (i = 0; i < tan1.length; i++) { + tan1[i] = 0; + } + let i03; + let i13; + let i23; + for (i = 0; i < numIndices; i += 3) { + const i0 = indices[i]; + const i1 = indices[i + 1]; + const i2 = indices[i + 2]; + i03 = i0 * 3; + i13 = i1 * 3; + i23 = i2 * 3; + const i02 = i0 * 2; + const i12 = i1 * 2; + const i22 = i2 * 2; + const ux = vertices[i03]; + const uy = vertices[i03 + 1]; + const uz = vertices[i03 + 2]; + const wx = st[i02]; + const wy = st[i02 + 1]; + const t1 = st[i12 + 1] - wy; + const t2 = st[i22 + 1] - wy; + const r = 1 / ((st[i12] - wx) * t2 - (st[i22] - wx) * t1); + const sdirx = (t2 * (vertices[i13] - ux) - t1 * (vertices[i23] - ux)) * r; + const sdiry = (t2 * (vertices[i13 + 1] - uy) - t1 * (vertices[i23 + 1] - uy)) * r; + const sdirz = (t2 * (vertices[i13 + 2] - uz) - t1 * (vertices[i23 + 2] - uz)) * r; + tan1[i03] += sdirx; + tan1[i03 + 1] += sdiry; + tan1[i03 + 2] += sdirz; + tan1[i13] += sdirx; + tan1[i13 + 1] += sdiry; + tan1[i13 + 2] += sdirz; + tan1[i23] += sdirx; + tan1[i23 + 1] += sdiry; + tan1[i23 + 2] += sdirz; + } + const tangentValues = new Float32Array(numVertices * 3); + const bitangentValues = new Float32Array(numVertices * 3); + for (i = 0; i < numVertices; i++) { + i03 = i * 3; + i13 = i03 + 1; + i23 = i03 + 2; + const n = Cartesian3_default.fromArray(normals, i03, normalScratch); + const t = Cartesian3_default.fromArray(tan1, i03, tScratch); + const scalar = Cartesian3_default.dot(n, t); + Cartesian3_default.multiplyByScalar(n, scalar, normalScale); + Cartesian3_default.normalize(Cartesian3_default.subtract(t, normalScale, t), t); + tangentValues[i03] = t.x; + tangentValues[i13] = t.y; + tangentValues[i23] = t.z; + Cartesian3_default.normalize(Cartesian3_default.cross(n, t, t), t); + bitangentValues[i03] = t.x; + bitangentValues[i13] = t.y; + bitangentValues[i23] = t.z; + } + geometry.attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangentValues + }); + geometry.attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangentValues + }); + return geometry; +}; +var scratchCartesian22 = new Cartesian2_default(); +var toEncode1 = new Cartesian3_default(); +var toEncode2 = new Cartesian3_default(); +var toEncode3 = new Cartesian3_default(); +var encodeResult2 = new Cartesian2_default(); +GeometryPipeline.compressVertices = function(geometry) { + if (!defined_default(geometry)) { + throw new DeveloperError_default("geometry is required."); + } + const extrudeAttribute = geometry.attributes.extrudeDirection; + let i; + let numVertices; + if (defined_default(extrudeAttribute)) { + const extrudeDirections = extrudeAttribute.values; + numVertices = extrudeDirections.length / 3; + const compressedDirections = new Float32Array(numVertices * 2); + let i2 = 0; + for (i = 0; i < numVertices; ++i) { + Cartesian3_default.fromArray(extrudeDirections, i * 3, toEncode1); + if (Cartesian3_default.equals(toEncode1, Cartesian3_default.ZERO)) { + i2 += 2; + continue; + } + encodeResult2 = AttributeCompression_default.octEncodeInRange( + toEncode1, + 65535, + encodeResult2 + ); + compressedDirections[i2++] = encodeResult2.x; + compressedDirections[i2++] = encodeResult2.y; + } + geometry.attributes.compressedAttributes = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: compressedDirections + }); + delete geometry.attributes.extrudeDirection; + return geometry; + } + const normalAttribute = geometry.attributes.normal; + const stAttribute = geometry.attributes.st; + const hasNormal = defined_default(normalAttribute); + const hasSt = defined_default(stAttribute); + if (!hasNormal && !hasSt) { + return geometry; + } + const tangentAttribute = geometry.attributes.tangent; + const bitangentAttribute = geometry.attributes.bitangent; + const hasTangent = defined_default(tangentAttribute); + const hasBitangent = defined_default(bitangentAttribute); + let normals; + let st; + let tangents; + let bitangents; + if (hasNormal) { + normals = normalAttribute.values; + } + if (hasSt) { + st = stAttribute.values; + } + if (hasTangent) { + tangents = tangentAttribute.values; + } + if (hasBitangent) { + bitangents = bitangentAttribute.values; + } + const length = hasNormal ? normals.length : st.length; + const numComponents = hasNormal ? 3 : 2; + numVertices = length / numComponents; + let compressedLength = numVertices; + let numCompressedComponents = hasSt && hasNormal ? 2 : 1; + numCompressedComponents += hasTangent || hasBitangent ? 1 : 0; + compressedLength *= numCompressedComponents; + const compressedAttributes = new Float32Array(compressedLength); + let normalIndex = 0; + for (i = 0; i < numVertices; ++i) { + if (hasSt) { + Cartesian2_default.fromArray(st, i * 2, scratchCartesian22); + compressedAttributes[normalIndex++] = AttributeCompression_default.compressTextureCoordinates(scratchCartesian22); + } + const index = i * 3; + if (hasNormal && defined_default(tangents) && defined_default(bitangents)) { + Cartesian3_default.fromArray(normals, index, toEncode1); + Cartesian3_default.fromArray(tangents, index, toEncode2); + Cartesian3_default.fromArray(bitangents, index, toEncode3); + AttributeCompression_default.octPack( + toEncode1, + toEncode2, + toEncode3, + scratchCartesian22 + ); + compressedAttributes[normalIndex++] = scratchCartesian22.x; + compressedAttributes[normalIndex++] = scratchCartesian22.y; + } else { + if (hasNormal) { + Cartesian3_default.fromArray(normals, index, toEncode1); + compressedAttributes[normalIndex++] = AttributeCompression_default.octEncodeFloat(toEncode1); + } + if (hasTangent) { + Cartesian3_default.fromArray(tangents, index, toEncode1); + compressedAttributes[normalIndex++] = AttributeCompression_default.octEncodeFloat(toEncode1); + } + if (hasBitangent) { + Cartesian3_default.fromArray(bitangents, index, toEncode1); + compressedAttributes[normalIndex++] = AttributeCompression_default.octEncodeFloat(toEncode1); + } + } + } + geometry.attributes.compressedAttributes = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: numCompressedComponents, + values: compressedAttributes + }); + if (hasNormal) { + delete geometry.attributes.normal; + } + if (hasSt) { + delete geometry.attributes.st; + } + if (hasBitangent) { + delete geometry.attributes.bitangent; + } + if (hasTangent) { + delete geometry.attributes.tangent; + } + return geometry; +}; +function indexTriangles(geometry) { + if (defined_default(geometry.indices)) { + return geometry; + } + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 3) { + throw new DeveloperError_default("The number of vertices must be at least three."); + } + if (numberOfVertices % 3 !== 0) { + throw new DeveloperError_default( + "The number of vertices must be a multiple of three." + ); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + numberOfVertices + ); + for (let i = 0; i < numberOfVertices; ++i) { + indices[i] = i; + } + geometry.indices = indices; + return geometry; +} +function indexTriangleFan(geometry) { + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 3) { + throw new DeveloperError_default("The number of vertices must be at least three."); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + (numberOfVertices - 2) * 3 + ); + indices[0] = 1; + indices[1] = 0; + indices[2] = 2; + let indicesIndex = 3; + for (let i = 3; i < numberOfVertices; ++i) { + indices[indicesIndex++] = i - 1; + indices[indicesIndex++] = 0; + indices[indicesIndex++] = i; + } + geometry.indices = indices; + geometry.primitiveType = PrimitiveType_default.TRIANGLES; + return geometry; +} +function indexTriangleStrip(geometry) { + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 3) { + throw new DeveloperError_default("The number of vertices must be at least 3."); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + (numberOfVertices - 2) * 3 + ); + indices[0] = 0; + indices[1] = 1; + indices[2] = 2; + if (numberOfVertices > 3) { + indices[3] = 0; + indices[4] = 2; + indices[5] = 3; + } + let indicesIndex = 6; + for (let i = 3; i < numberOfVertices - 1; i += 2) { + indices[indicesIndex++] = i; + indices[indicesIndex++] = i - 1; + indices[indicesIndex++] = i + 1; + if (i + 2 < numberOfVertices) { + indices[indicesIndex++] = i; + indices[indicesIndex++] = i + 1; + indices[indicesIndex++] = i + 2; + } + } + geometry.indices = indices; + geometry.primitiveType = PrimitiveType_default.TRIANGLES; + return geometry; +} +function indexLines(geometry) { + if (defined_default(geometry.indices)) { + return geometry; + } + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 2) { + throw new DeveloperError_default("The number of vertices must be at least two."); + } + if (numberOfVertices % 2 !== 0) { + throw new DeveloperError_default("The number of vertices must be a multiple of 2."); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + numberOfVertices + ); + for (let i = 0; i < numberOfVertices; ++i) { + indices[i] = i; + } + geometry.indices = indices; + return geometry; +} +function indexLineStrip(geometry) { + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 2) { + throw new DeveloperError_default("The number of vertices must be at least two."); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + (numberOfVertices - 1) * 2 + ); + indices[0] = 0; + indices[1] = 1; + let indicesIndex = 2; + for (let i = 2; i < numberOfVertices; ++i) { + indices[indicesIndex++] = i - 1; + indices[indicesIndex++] = i; + } + geometry.indices = indices; + geometry.primitiveType = PrimitiveType_default.LINES; + return geometry; +} +function indexLineLoop(geometry) { + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + if (numberOfVertices < 2) { + throw new DeveloperError_default("The number of vertices must be at least two."); + } + const indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + numberOfVertices * 2 + ); + indices[0] = 0; + indices[1] = 1; + let indicesIndex = 2; + for (let i = 2; i < numberOfVertices; ++i) { + indices[indicesIndex++] = i - 1; + indices[indicesIndex++] = i; + } + indices[indicesIndex++] = numberOfVertices - 1; + indices[indicesIndex] = 0; + geometry.indices = indices; + geometry.primitiveType = PrimitiveType_default.LINES; + return geometry; +} +function indexPrimitive(geometry) { + switch (geometry.primitiveType) { + case PrimitiveType_default.TRIANGLE_FAN: + return indexTriangleFan(geometry); + case PrimitiveType_default.TRIANGLE_STRIP: + return indexTriangleStrip(geometry); + case PrimitiveType_default.TRIANGLES: + return indexTriangles(geometry); + case PrimitiveType_default.LINE_STRIP: + return indexLineStrip(geometry); + case PrimitiveType_default.LINE_LOOP: + return indexLineLoop(geometry); + case PrimitiveType_default.LINES: + return indexLines(geometry); + } + return geometry; +} +function offsetPointFromXZPlane(p, isBehind) { + if (Math.abs(p.y) < Math_default.EPSILON6) { + if (isBehind) { + p.y = -Math_default.EPSILON6; + } else { + p.y = Math_default.EPSILON6; + } + } +} +function offsetTriangleFromXZPlane(p0, p1, p2) { + if (p0.y !== 0 && p1.y !== 0 && p2.y !== 0) { + offsetPointFromXZPlane(p0, p0.y < 0); + offsetPointFromXZPlane(p1, p1.y < 0); + offsetPointFromXZPlane(p2, p2.y < 0); + return; + } + const p0y = Math.abs(p0.y); + const p1y = Math.abs(p1.y); + const p2y = Math.abs(p2.y); + let sign; + if (p0y > p1y) { + if (p0y > p2y) { + sign = Math_default.sign(p0.y); + } else { + sign = Math_default.sign(p2.y); + } + } else if (p1y > p2y) { + sign = Math_default.sign(p1.y); + } else { + sign = Math_default.sign(p2.y); + } + const isBehind = sign < 0; + offsetPointFromXZPlane(p0, isBehind); + offsetPointFromXZPlane(p1, isBehind); + offsetPointFromXZPlane(p2, isBehind); +} +var c3 = new Cartesian3_default(); +function getXZIntersectionOffsetPoints(p, p1, u12, v12) { + Cartesian3_default.add( + p, + Cartesian3_default.multiplyByScalar( + Cartesian3_default.subtract(p1, p, c3), + p.y / (p.y - p1.y), + c3 + ), + u12 + ); + Cartesian3_default.clone(u12, v12); + offsetPointFromXZPlane(u12, true); + offsetPointFromXZPlane(v12, false); +} +var u1 = new Cartesian3_default(); +var u2 = new Cartesian3_default(); +var q1 = new Cartesian3_default(); +var q2 = new Cartesian3_default(); +var splitTriangleResult = { + positions: new Array(7), + indices: new Array(3 * 3) +}; +function splitTriangle(p0, p1, p2) { + if (p0.x >= 0 || p1.x >= 0 || p2.x >= 0) { + return void 0; + } + offsetTriangleFromXZPlane(p0, p1, p2); + const p0Behind = p0.y < 0; + const p1Behind = p1.y < 0; + const p2Behind = p2.y < 0; + let numBehind = 0; + numBehind += p0Behind ? 1 : 0; + numBehind += p1Behind ? 1 : 0; + numBehind += p2Behind ? 1 : 0; + const indices = splitTriangleResult.indices; + if (numBehind === 1) { + indices[1] = 3; + indices[2] = 4; + indices[5] = 6; + indices[7] = 6; + indices[8] = 5; + if (p0Behind) { + getXZIntersectionOffsetPoints(p0, p1, u1, q1); + getXZIntersectionOffsetPoints(p0, p2, u2, q2); + indices[0] = 0; + indices[3] = 1; + indices[4] = 2; + indices[6] = 1; + } else if (p1Behind) { + getXZIntersectionOffsetPoints(p1, p2, u1, q1); + getXZIntersectionOffsetPoints(p1, p0, u2, q2); + indices[0] = 1; + indices[3] = 2; + indices[4] = 0; + indices[6] = 2; + } else if (p2Behind) { + getXZIntersectionOffsetPoints(p2, p0, u1, q1); + getXZIntersectionOffsetPoints(p2, p1, u2, q2); + indices[0] = 2; + indices[3] = 0; + indices[4] = 1; + indices[6] = 0; + } + } else if (numBehind === 2) { + indices[2] = 4; + indices[4] = 4; + indices[5] = 3; + indices[7] = 5; + indices[8] = 6; + if (!p0Behind) { + getXZIntersectionOffsetPoints(p0, p1, u1, q1); + getXZIntersectionOffsetPoints(p0, p2, u2, q2); + indices[0] = 1; + indices[1] = 2; + indices[3] = 1; + indices[6] = 0; + } else if (!p1Behind) { + getXZIntersectionOffsetPoints(p1, p2, u1, q1); + getXZIntersectionOffsetPoints(p1, p0, u2, q2); + indices[0] = 2; + indices[1] = 0; + indices[3] = 2; + indices[6] = 1; + } else if (!p2Behind) { + getXZIntersectionOffsetPoints(p2, p0, u1, q1); + getXZIntersectionOffsetPoints(p2, p1, u2, q2); + indices[0] = 0; + indices[1] = 1; + indices[3] = 0; + indices[6] = 2; + } + } + const positions = splitTriangleResult.positions; + positions[0] = p0; + positions[1] = p1; + positions[2] = p2; + positions.length = 3; + if (numBehind === 1 || numBehind === 2) { + positions[3] = u1; + positions[4] = u2; + positions[5] = q1; + positions[6] = q2; + positions.length = 7; + } + return splitTriangleResult; +} +function updateGeometryAfterSplit(geometry, computeBoundingSphere) { + const attributes = geometry.attributes; + if (attributes.position.values.length === 0) { + return void 0; + } + for (const property in attributes) { + if (attributes.hasOwnProperty(property) && defined_default(attributes[property]) && defined_default(attributes[property].values)) { + const attribute = attributes[property]; + attribute.values = ComponentDatatype_default.createTypedArray( + attribute.componentDatatype, + attribute.values + ); + } + } + const numberOfVertices = Geometry_default.computeNumberOfVertices(geometry); + geometry.indices = IndexDatatype_default.createTypedArray( + numberOfVertices, + geometry.indices + ); + if (computeBoundingSphere) { + geometry.boundingSphere = BoundingSphere_default.fromVertices( + attributes.position.values + ); + } + return geometry; +} +function copyGeometryForSplit(geometry) { + const attributes = geometry.attributes; + const copiedAttributes = {}; + for (const property in attributes) { + if (attributes.hasOwnProperty(property) && defined_default(attributes[property]) && defined_default(attributes[property].values)) { + const attribute = attributes[property]; + copiedAttributes[property] = new GeometryAttribute_default({ + componentDatatype: attribute.componentDatatype, + componentsPerAttribute: attribute.componentsPerAttribute, + normalize: attribute.normalize, + values: [] + }); + } + } + return new Geometry_default({ + attributes: copiedAttributes, + indices: [], + primitiveType: geometry.primitiveType + }); +} +function updateInstanceAfterSplit(instance, westGeometry, eastGeometry) { + const computeBoundingSphere = defined_default(instance.geometry.boundingSphere); + westGeometry = updateGeometryAfterSplit(westGeometry, computeBoundingSphere); + eastGeometry = updateGeometryAfterSplit(eastGeometry, computeBoundingSphere); + if (defined_default(eastGeometry) && !defined_default(westGeometry)) { + instance.geometry = eastGeometry; + } else if (!defined_default(eastGeometry) && defined_default(westGeometry)) { + instance.geometry = westGeometry; + } else { + instance.westHemisphereGeometry = westGeometry; + instance.eastHemisphereGeometry = eastGeometry; + instance.geometry = void 0; + } +} +function generateBarycentricInterpolateFunction(CartesianType, numberOfComponents) { + const v0Scratch = new CartesianType(); + const v1Scratch = new CartesianType(); + const v2Scratch = new CartesianType(); + return function(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex, normalize) { + const v02 = CartesianType.fromArray( + sourceValues, + i0 * numberOfComponents, + v0Scratch + ); + const v12 = CartesianType.fromArray( + sourceValues, + i1 * numberOfComponents, + v1Scratch + ); + const v22 = CartesianType.fromArray( + sourceValues, + i2 * numberOfComponents, + v2Scratch + ); + CartesianType.multiplyByScalar(v02, coords.x, v02); + CartesianType.multiplyByScalar(v12, coords.y, v12); + CartesianType.multiplyByScalar(v22, coords.z, v22); + const value = CartesianType.add(v02, v12, v02); + CartesianType.add(value, v22, value); + if (normalize) { + CartesianType.normalize(value, value); + } + CartesianType.pack( + value, + currentValues, + insertedIndex * numberOfComponents + ); + }; +} +var interpolateAndPackCartesian4 = generateBarycentricInterpolateFunction( + Cartesian4_default, + 4 +); +var interpolateAndPackCartesian3 = generateBarycentricInterpolateFunction( + Cartesian3_default, + 3 +); +var interpolateAndPackCartesian2 = generateBarycentricInterpolateFunction( + Cartesian2_default, + 2 +); +var interpolateAndPackBoolean = function(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex) { + const v12 = sourceValues[i0] * coords.x; + const v22 = sourceValues[i1] * coords.y; + const v3 = sourceValues[i2] * coords.z; + currentValues[insertedIndex] = v12 + v22 + v3 > Math_default.EPSILON6 ? 1 : 0; +}; +var p0Scratch = new Cartesian3_default(); +var p1Scratch = new Cartesian3_default(); +var p2Scratch = new Cartesian3_default(); +var barycentricScratch = new Cartesian3_default(); +function computeTriangleAttributes(i0, i1, i2, point, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, allAttributes, insertedIndex) { + if (!defined_default(normals) && !defined_default(tangents) && !defined_default(bitangents) && !defined_default(texCoords) && !defined_default(extrudeDirections) && customAttributesLength === 0) { + return; + } + const p0 = Cartesian3_default.fromArray(positions, i0 * 3, p0Scratch); + const p1 = Cartesian3_default.fromArray(positions, i1 * 3, p1Scratch); + const p2 = Cartesian3_default.fromArray(positions, i2 * 3, p2Scratch); + const coords = barycentricCoordinates_default(point, p0, p1, p2, barycentricScratch); + if (!defined_default(coords)) { + return; + } + if (defined_default(normals)) { + interpolateAndPackCartesian3( + i0, + i1, + i2, + coords, + normals, + currentAttributes.normal.values, + insertedIndex, + true + ); + } + if (defined_default(extrudeDirections)) { + const d0 = Cartesian3_default.fromArray(extrudeDirections, i0 * 3, p0Scratch); + const d1 = Cartesian3_default.fromArray(extrudeDirections, i1 * 3, p1Scratch); + const d2 = Cartesian3_default.fromArray(extrudeDirections, i2 * 3, p2Scratch); + Cartesian3_default.multiplyByScalar(d0, coords.x, d0); + Cartesian3_default.multiplyByScalar(d1, coords.y, d1); + Cartesian3_default.multiplyByScalar(d2, coords.z, d2); + let direction; + if (!Cartesian3_default.equals(d0, Cartesian3_default.ZERO) || !Cartesian3_default.equals(d1, Cartesian3_default.ZERO) || !Cartesian3_default.equals(d2, Cartesian3_default.ZERO)) { + direction = Cartesian3_default.add(d0, d1, d0); + Cartesian3_default.add(direction, d2, direction); + Cartesian3_default.normalize(direction, direction); + } else { + direction = p0Scratch; + direction.x = 0; + direction.y = 0; + direction.z = 0; + } + Cartesian3_default.pack( + direction, + currentAttributes.extrudeDirection.values, + insertedIndex * 3 + ); + } + if (defined_default(applyOffset)) { + interpolateAndPackBoolean( + i0, + i1, + i2, + coords, + applyOffset, + currentAttributes.applyOffset.values, + insertedIndex + ); + } + if (defined_default(tangents)) { + interpolateAndPackCartesian3( + i0, + i1, + i2, + coords, + tangents, + currentAttributes.tangent.values, + insertedIndex, + true + ); + } + if (defined_default(bitangents)) { + interpolateAndPackCartesian3( + i0, + i1, + i2, + coords, + bitangents, + currentAttributes.bitangent.values, + insertedIndex, + true + ); + } + if (defined_default(texCoords)) { + interpolateAndPackCartesian2( + i0, + i1, + i2, + coords, + texCoords, + currentAttributes.st.values, + insertedIndex + ); + } + if (customAttributesLength > 0) { + for (let i = 0; i < customAttributesLength; i++) { + const attributeName = customAttributeNames[i]; + genericInterpolate( + i0, + i1, + i2, + coords, + insertedIndex, + allAttributes[attributeName], + currentAttributes[attributeName] + ); + } + } +} +function genericInterpolate(i0, i1, i2, coords, insertedIndex, sourceAttribute, currentAttribute) { + const componentsPerAttribute = sourceAttribute.componentsPerAttribute; + const sourceValues = sourceAttribute.values; + const currentValues = currentAttribute.values; + switch (componentsPerAttribute) { + case 4: + interpolateAndPackCartesian4( + i0, + i1, + i2, + coords, + sourceValues, + currentValues, + insertedIndex, + false + ); + break; + case 3: + interpolateAndPackCartesian3( + i0, + i1, + i2, + coords, + sourceValues, + currentValues, + insertedIndex, + false + ); + break; + case 2: + interpolateAndPackCartesian2( + i0, + i1, + i2, + coords, + sourceValues, + currentValues, + insertedIndex, + false + ); + break; + default: + currentValues[insertedIndex] = sourceValues[i0] * coords.x + sourceValues[i1] * coords.y + sourceValues[i2] * coords.z; + } +} +function insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, currentIndex, point) { + const insertIndex = currentAttributes.position.values.length / 3; + if (currentIndex !== -1) { + const prevIndex = indices[currentIndex]; + const newIndex = currentIndexMap[prevIndex]; + if (newIndex === -1) { + currentIndexMap[prevIndex] = insertIndex; + currentAttributes.position.values.push(point.x, point.y, point.z); + currentIndices.push(insertIndex); + return insertIndex; + } + currentIndices.push(newIndex); + return newIndex; + } + currentAttributes.position.values.push(point.x, point.y, point.z); + currentIndices.push(insertIndex); + return insertIndex; +} +var NAMED_ATTRIBUTES = { + position: true, + normal: true, + bitangent: true, + tangent: true, + st: true, + extrudeDirection: true, + applyOffset: true +}; +function splitLongitudeTriangles(instance) { + const geometry = instance.geometry; + const attributes = geometry.attributes; + const positions = attributes.position.values; + const normals = defined_default(attributes.normal) ? attributes.normal.values : void 0; + const bitangents = defined_default(attributes.bitangent) ? attributes.bitangent.values : void 0; + const tangents = defined_default(attributes.tangent) ? attributes.tangent.values : void 0; + const texCoords = defined_default(attributes.st) ? attributes.st.values : void 0; + const extrudeDirections = defined_default(attributes.extrudeDirection) ? attributes.extrudeDirection.values : void 0; + const applyOffset = defined_default(attributes.applyOffset) ? attributes.applyOffset.values : void 0; + const indices = geometry.indices; + const customAttributeNames = []; + for (const attributeName in attributes) { + if (attributes.hasOwnProperty(attributeName) && !NAMED_ATTRIBUTES[attributeName] && defined_default(attributes[attributeName])) { + customAttributeNames.push(attributeName); + } + } + const customAttributesLength = customAttributeNames.length; + const eastGeometry = copyGeometryForSplit(geometry); + const westGeometry = copyGeometryForSplit(geometry); + let currentAttributes; + let currentIndices; + let currentIndexMap; + let insertedIndex; + let i; + const westGeometryIndexMap = []; + westGeometryIndexMap.length = positions.length / 3; + const eastGeometryIndexMap = []; + eastGeometryIndexMap.length = positions.length / 3; + for (i = 0; i < westGeometryIndexMap.length; ++i) { + westGeometryIndexMap[i] = -1; + eastGeometryIndexMap[i] = -1; + } + const len = indices.length; + for (i = 0; i < len; i += 3) { + const i0 = indices[i]; + const i1 = indices[i + 1]; + const i2 = indices[i + 2]; + let p0 = Cartesian3_default.fromArray(positions, i0 * 3); + let p1 = Cartesian3_default.fromArray(positions, i1 * 3); + let p2 = Cartesian3_default.fromArray(positions, i2 * 3); + const result = splitTriangle(p0, p1, p2); + if (defined_default(result) && result.positions.length > 3) { + const resultPositions = result.positions; + const resultIndices = result.indices; + const resultLength = resultIndices.length; + for (let j = 0; j < resultLength; ++j) { + const resultIndex = resultIndices[j]; + const point = resultPositions[resultIndex]; + if (point.y < 0) { + currentAttributes = westGeometry.attributes; + currentIndices = westGeometry.indices; + currentIndexMap = westGeometryIndexMap; + } else { + currentAttributes = eastGeometry.attributes; + currentIndices = eastGeometry.indices; + currentIndexMap = eastGeometryIndexMap; + } + insertedIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + resultIndex < 3 ? i + resultIndex : -1, + point + ); + computeTriangleAttributes( + i0, + i1, + i2, + point, + positions, + normals, + tangents, + bitangents, + texCoords, + extrudeDirections, + applyOffset, + currentAttributes, + customAttributeNames, + customAttributesLength, + attributes, + insertedIndex + ); + } + } else { + if (defined_default(result)) { + p0 = result.positions[0]; + p1 = result.positions[1]; + p2 = result.positions[2]; + } + if (p0.y < 0) { + currentAttributes = westGeometry.attributes; + currentIndices = westGeometry.indices; + currentIndexMap = westGeometryIndexMap; + } else { + currentAttributes = eastGeometry.attributes; + currentIndices = eastGeometry.indices; + currentIndexMap = eastGeometryIndexMap; + } + insertedIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + i, + p0 + ); + computeTriangleAttributes( + i0, + i1, + i2, + p0, + positions, + normals, + tangents, + bitangents, + texCoords, + extrudeDirections, + applyOffset, + currentAttributes, + customAttributeNames, + customAttributesLength, + attributes, + insertedIndex + ); + insertedIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + i + 1, + p1 + ); + computeTriangleAttributes( + i0, + i1, + i2, + p1, + positions, + normals, + tangents, + bitangents, + texCoords, + extrudeDirections, + applyOffset, + currentAttributes, + customAttributeNames, + customAttributesLength, + attributes, + insertedIndex + ); + insertedIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + i + 2, + p2 + ); + computeTriangleAttributes( + i0, + i1, + i2, + p2, + positions, + normals, + tangents, + bitangents, + texCoords, + extrudeDirections, + applyOffset, + currentAttributes, + customAttributeNames, + customAttributesLength, + attributes, + insertedIndex + ); + } + } + updateInstanceAfterSplit(instance, westGeometry, eastGeometry); +} +var xzPlane = Plane_default.fromPointNormal(Cartesian3_default.ZERO, Cartesian3_default.UNIT_Y); +var offsetScratch = new Cartesian3_default(); +var offsetPointScratch = new Cartesian3_default(); +function computeLineAttributes(i0, i1, point, positions, insertIndex, currentAttributes, applyOffset) { + if (!defined_default(applyOffset)) { + return; + } + const p0 = Cartesian3_default.fromArray(positions, i0 * 3, p0Scratch); + if (Cartesian3_default.equalsEpsilon(p0, point, Math_default.EPSILON10)) { + currentAttributes.applyOffset.values[insertIndex] = applyOffset[i0]; + } else { + currentAttributes.applyOffset.values[insertIndex] = applyOffset[i1]; + } +} +function splitLongitudeLines(instance) { + const geometry = instance.geometry; + const attributes = geometry.attributes; + const positions = attributes.position.values; + const applyOffset = defined_default(attributes.applyOffset) ? attributes.applyOffset.values : void 0; + const indices = geometry.indices; + const eastGeometry = copyGeometryForSplit(geometry); + const westGeometry = copyGeometryForSplit(geometry); + let i; + const length = indices.length; + const westGeometryIndexMap = []; + westGeometryIndexMap.length = positions.length / 3; + const eastGeometryIndexMap = []; + eastGeometryIndexMap.length = positions.length / 3; + for (i = 0; i < westGeometryIndexMap.length; ++i) { + westGeometryIndexMap[i] = -1; + eastGeometryIndexMap[i] = -1; + } + for (i = 0; i < length; i += 2) { + const i0 = indices[i]; + const i1 = indices[i + 1]; + const p0 = Cartesian3_default.fromArray(positions, i0 * 3, p0Scratch); + const p1 = Cartesian3_default.fromArray(positions, i1 * 3, p1Scratch); + let insertIndex; + if (Math.abs(p0.y) < Math_default.EPSILON6) { + if (p0.y < 0) { + p0.y = -Math_default.EPSILON6; + } else { + p0.y = Math_default.EPSILON6; + } + } + if (Math.abs(p1.y) < Math_default.EPSILON6) { + if (p1.y < 0) { + p1.y = -Math_default.EPSILON6; + } else { + p1.y = Math_default.EPSILON6; + } + } + let p0Attributes = eastGeometry.attributes; + let p0Indices = eastGeometry.indices; + let p0IndexMap = eastGeometryIndexMap; + let p1Attributes = westGeometry.attributes; + let p1Indices = westGeometry.indices; + let p1IndexMap = westGeometryIndexMap; + const intersection = IntersectionTests_default.lineSegmentPlane( + p0, + p1, + xzPlane, + p2Scratch + ); + if (defined_default(intersection)) { + const offset = Cartesian3_default.multiplyByScalar( + Cartesian3_default.UNIT_Y, + 5 * Math_default.EPSILON9, + offsetScratch + ); + if (p0.y < 0) { + Cartesian3_default.negate(offset, offset); + p0Attributes = westGeometry.attributes; + p0Indices = westGeometry.indices; + p0IndexMap = westGeometryIndexMap; + p1Attributes = eastGeometry.attributes; + p1Indices = eastGeometry.indices; + p1IndexMap = eastGeometryIndexMap; + } + const offsetPoint = Cartesian3_default.add( + intersection, + offset, + offsetPointScratch + ); + insertIndex = insertSplitPoint( + p0Attributes, + p0Indices, + p0IndexMap, + indices, + i, + p0 + ); + computeLineAttributes( + i0, + i1, + p0, + positions, + insertIndex, + p0Attributes, + applyOffset + ); + insertIndex = insertSplitPoint( + p0Attributes, + p0Indices, + p0IndexMap, + indices, + -1, + offsetPoint + ); + computeLineAttributes( + i0, + i1, + offsetPoint, + positions, + insertIndex, + p0Attributes, + applyOffset + ); + Cartesian3_default.negate(offset, offset); + Cartesian3_default.add(intersection, offset, offsetPoint); + insertIndex = insertSplitPoint( + p1Attributes, + p1Indices, + p1IndexMap, + indices, + -1, + offsetPoint + ); + computeLineAttributes( + i0, + i1, + offsetPoint, + positions, + insertIndex, + p1Attributes, + applyOffset + ); + insertIndex = insertSplitPoint( + p1Attributes, + p1Indices, + p1IndexMap, + indices, + i + 1, + p1 + ); + computeLineAttributes( + i0, + i1, + p1, + positions, + insertIndex, + p1Attributes, + applyOffset + ); + } else { + let currentAttributes; + let currentIndices; + let currentIndexMap; + if (p0.y < 0) { + currentAttributes = westGeometry.attributes; + currentIndices = westGeometry.indices; + currentIndexMap = westGeometryIndexMap; + } else { + currentAttributes = eastGeometry.attributes; + currentIndices = eastGeometry.indices; + currentIndexMap = eastGeometryIndexMap; + } + insertIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + i, + p0 + ); + computeLineAttributes( + i0, + i1, + p0, + positions, + insertIndex, + currentAttributes, + applyOffset + ); + insertIndex = insertSplitPoint( + currentAttributes, + currentIndices, + currentIndexMap, + indices, + i + 1, + p1 + ); + computeLineAttributes( + i0, + i1, + p1, + positions, + insertIndex, + currentAttributes, + applyOffset + ); + } + } + updateInstanceAfterSplit(instance, westGeometry, eastGeometry); +} +var cartesian2Scratch0 = new Cartesian2_default(); +var cartesian2Scratch1 = new Cartesian2_default(); +var cartesian3Scratch0 = new Cartesian3_default(); +var cartesian3Scratch2 = new Cartesian3_default(); +var cartesian3Scratch3 = new Cartesian3_default(); +var cartesian3Scratch4 = new Cartesian3_default(); +var cartesian3Scratch5 = new Cartesian3_default(); +var cartesian3Scratch6 = new Cartesian3_default(); +var cartesian4Scratch0 = new Cartesian4_default(); +function updateAdjacencyAfterSplit(geometry) { + const attributes = geometry.attributes; + const positions = attributes.position.values; + const prevPositions = attributes.prevPosition.values; + const nextPositions = attributes.nextPosition.values; + const length = positions.length; + for (let j = 0; j < length; j += 3) { + const position = Cartesian3_default.unpack(positions, j, cartesian3Scratch0); + if (position.x > 0) { + continue; + } + const prevPosition = Cartesian3_default.unpack( + prevPositions, + j, + cartesian3Scratch2 + ); + if (position.y < 0 && prevPosition.y > 0 || position.y > 0 && prevPosition.y < 0) { + if (j - 3 > 0) { + prevPositions[j] = positions[j - 3]; + prevPositions[j + 1] = positions[j - 2]; + prevPositions[j + 2] = positions[j - 1]; + } else { + Cartesian3_default.pack(position, prevPositions, j); + } + } + const nextPosition = Cartesian3_default.unpack( + nextPositions, + j, + cartesian3Scratch3 + ); + if (position.y < 0 && nextPosition.y > 0 || position.y > 0 && nextPosition.y < 0) { + if (j + 3 < length) { + nextPositions[j] = positions[j + 3]; + nextPositions[j + 1] = positions[j + 4]; + nextPositions[j + 2] = positions[j + 5]; + } else { + Cartesian3_default.pack(position, nextPositions, j); + } + } + } +} +var offsetScalar = 5 * Math_default.EPSILON9; +var coplanarOffset = Math_default.EPSILON6; +function splitLongitudePolyline(instance) { + const geometry = instance.geometry; + const attributes = geometry.attributes; + const positions = attributes.position.values; + const prevPositions = attributes.prevPosition.values; + const nextPositions = attributes.nextPosition.values; + const expandAndWidths = attributes.expandAndWidth.values; + const texCoords = defined_default(attributes.st) ? attributes.st.values : void 0; + const colors = defined_default(attributes.color) ? attributes.color.values : void 0; + const eastGeometry = copyGeometryForSplit(geometry); + const westGeometry = copyGeometryForSplit(geometry); + let i; + let j; + let index; + let intersectionFound = false; + const length = positions.length / 3; + for (i = 0; i < length; i += 4) { + const i0 = i; + const i2 = i + 2; + const p0 = Cartesian3_default.fromArray(positions, i0 * 3, cartesian3Scratch0); + const p2 = Cartesian3_default.fromArray(positions, i2 * 3, cartesian3Scratch2); + if (Math.abs(p0.y) < coplanarOffset) { + p0.y = coplanarOffset * (p2.y < 0 ? -1 : 1); + positions[i * 3 + 1] = p0.y; + positions[(i + 1) * 3 + 1] = p0.y; + for (j = i0 * 3; j < i0 * 3 + 4 * 3; j += 3) { + prevPositions[j] = positions[i * 3]; + prevPositions[j + 1] = positions[i * 3 + 1]; + prevPositions[j + 2] = positions[i * 3 + 2]; + } + } + if (Math.abs(p2.y) < coplanarOffset) { + p2.y = coplanarOffset * (p0.y < 0 ? -1 : 1); + positions[(i + 2) * 3 + 1] = p2.y; + positions[(i + 3) * 3 + 1] = p2.y; + for (j = i0 * 3; j < i0 * 3 + 4 * 3; j += 3) { + nextPositions[j] = positions[(i + 2) * 3]; + nextPositions[j + 1] = positions[(i + 2) * 3 + 1]; + nextPositions[j + 2] = positions[(i + 2) * 3 + 2]; + } + } + let p0Attributes = eastGeometry.attributes; + let p0Indices = eastGeometry.indices; + let p2Attributes = westGeometry.attributes; + let p2Indices = westGeometry.indices; + const intersection = IntersectionTests_default.lineSegmentPlane( + p0, + p2, + xzPlane, + cartesian3Scratch4 + ); + if (defined_default(intersection)) { + intersectionFound = true; + const offset = Cartesian3_default.multiplyByScalar( + Cartesian3_default.UNIT_Y, + offsetScalar, + cartesian3Scratch5 + ); + if (p0.y < 0) { + Cartesian3_default.negate(offset, offset); + p0Attributes = westGeometry.attributes; + p0Indices = westGeometry.indices; + p2Attributes = eastGeometry.attributes; + p2Indices = eastGeometry.indices; + } + const offsetPoint = Cartesian3_default.add( + intersection, + offset, + cartesian3Scratch6 + ); + p0Attributes.position.values.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z); + p0Attributes.position.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p0Attributes.position.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p0Attributes.prevPosition.values.push( + prevPositions[i0 * 3], + prevPositions[i0 * 3 + 1], + prevPositions[i0 * 3 + 2] + ); + p0Attributes.prevPosition.values.push( + prevPositions[i0 * 3 + 3], + prevPositions[i0 * 3 + 4], + prevPositions[i0 * 3 + 5] + ); + p0Attributes.prevPosition.values.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z); + p0Attributes.nextPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p0Attributes.nextPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p0Attributes.nextPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p0Attributes.nextPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + Cartesian3_default.negate(offset, offset); + Cartesian3_default.add(intersection, offset, offsetPoint); + p2Attributes.position.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.position.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.position.values.push(p2.x, p2.y, p2.z, p2.x, p2.y, p2.z); + p2Attributes.prevPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.prevPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.prevPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.prevPosition.values.push( + offsetPoint.x, + offsetPoint.y, + offsetPoint.z + ); + p2Attributes.nextPosition.values.push(p2.x, p2.y, p2.z, p2.x, p2.y, p2.z); + p2Attributes.nextPosition.values.push( + nextPositions[i2 * 3], + nextPositions[i2 * 3 + 1], + nextPositions[i2 * 3 + 2] + ); + p2Attributes.nextPosition.values.push( + nextPositions[i2 * 3 + 3], + nextPositions[i2 * 3 + 4], + nextPositions[i2 * 3 + 5] + ); + const ew0 = Cartesian2_default.fromArray( + expandAndWidths, + i0 * 2, + cartesian2Scratch0 + ); + const width = Math.abs(ew0.y); + p0Attributes.expandAndWidth.values.push(-1, width, 1, width); + p0Attributes.expandAndWidth.values.push(-1, -width, 1, -width); + p2Attributes.expandAndWidth.values.push(-1, width, 1, width); + p2Attributes.expandAndWidth.values.push(-1, -width, 1, -width); + let t = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(intersection, p0, cartesian3Scratch3) + ); + t /= Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(p2, p0, cartesian3Scratch3) + ); + if (defined_default(colors)) { + const c0 = Cartesian4_default.fromArray(colors, i0 * 4, cartesian4Scratch0); + const c2 = Cartesian4_default.fromArray(colors, i2 * 4, cartesian4Scratch0); + const r = Math_default.lerp(c0.x, c2.x, t); + const g = Math_default.lerp(c0.y, c2.y, t); + const b = Math_default.lerp(c0.z, c2.z, t); + const a = Math_default.lerp(c0.w, c2.w, t); + for (j = i0 * 4; j < i0 * 4 + 2 * 4; ++j) { + p0Attributes.color.values.push(colors[j]); + } + p0Attributes.color.values.push(r, g, b, a); + p0Attributes.color.values.push(r, g, b, a); + p2Attributes.color.values.push(r, g, b, a); + p2Attributes.color.values.push(r, g, b, a); + for (j = i2 * 4; j < i2 * 4 + 2 * 4; ++j) { + p2Attributes.color.values.push(colors[j]); + } + } + if (defined_default(texCoords)) { + const s0 = Cartesian2_default.fromArray(texCoords, i0 * 2, cartesian2Scratch0); + const s3 = Cartesian2_default.fromArray( + texCoords, + (i + 3) * 2, + cartesian2Scratch1 + ); + const sx = Math_default.lerp(s0.x, s3.x, t); + for (j = i0 * 2; j < i0 * 2 + 2 * 2; ++j) { + p0Attributes.st.values.push(texCoords[j]); + } + p0Attributes.st.values.push(sx, s0.y); + p0Attributes.st.values.push(sx, s3.y); + p2Attributes.st.values.push(sx, s0.y); + p2Attributes.st.values.push(sx, s3.y); + for (j = i2 * 2; j < i2 * 2 + 2 * 2; ++j) { + p2Attributes.st.values.push(texCoords[j]); + } + } + index = p0Attributes.position.values.length / 3 - 4; + p0Indices.push(index, index + 2, index + 1); + p0Indices.push(index + 1, index + 2, index + 3); + index = p2Attributes.position.values.length / 3 - 4; + p2Indices.push(index, index + 2, index + 1); + p2Indices.push(index + 1, index + 2, index + 3); + } else { + let currentAttributes; + let currentIndices; + if (p0.y < 0) { + currentAttributes = westGeometry.attributes; + currentIndices = westGeometry.indices; + } else { + currentAttributes = eastGeometry.attributes; + currentIndices = eastGeometry.indices; + } + currentAttributes.position.values.push(p0.x, p0.y, p0.z); + currentAttributes.position.values.push(p0.x, p0.y, p0.z); + currentAttributes.position.values.push(p2.x, p2.y, p2.z); + currentAttributes.position.values.push(p2.x, p2.y, p2.z); + for (j = i * 3; j < i * 3 + 4 * 3; ++j) { + currentAttributes.prevPosition.values.push(prevPositions[j]); + currentAttributes.nextPosition.values.push(nextPositions[j]); + } + for (j = i * 2; j < i * 2 + 4 * 2; ++j) { + currentAttributes.expandAndWidth.values.push(expandAndWidths[j]); + if (defined_default(texCoords)) { + currentAttributes.st.values.push(texCoords[j]); + } + } + if (defined_default(colors)) { + for (j = i * 4; j < i * 4 + 4 * 4; ++j) { + currentAttributes.color.values.push(colors[j]); + } + } + index = currentAttributes.position.values.length / 3 - 4; + currentIndices.push(index, index + 2, index + 1); + currentIndices.push(index + 1, index + 2, index + 3); + } + } + if (intersectionFound) { + updateAdjacencyAfterSplit(westGeometry); + updateAdjacencyAfterSplit(eastGeometry); + } + updateInstanceAfterSplit(instance, westGeometry, eastGeometry); +} +GeometryPipeline.splitLongitude = function(instance) { + if (!defined_default(instance)) { + throw new DeveloperError_default("instance is required."); + } + const geometry = instance.geometry; + const boundingSphere = geometry.boundingSphere; + if (defined_default(boundingSphere)) { + const minX = boundingSphere.center.x - boundingSphere.radius; + if (minX > 0 || BoundingSphere_default.intersectPlane(boundingSphere, Plane_default.ORIGIN_ZX_PLANE) !== Intersect_default.INTERSECTING) { + return instance; + } + } + if (geometry.geometryType !== GeometryType_default.NONE) { + switch (geometry.geometryType) { + case GeometryType_default.POLYLINES: + splitLongitudePolyline(instance); + break; + case GeometryType_default.TRIANGLES: + splitLongitudeTriangles(instance); + break; + case GeometryType_default.LINES: + splitLongitudeLines(instance); + break; + } + } else { + indexPrimitive(geometry); + if (geometry.primitiveType === PrimitiveType_default.TRIANGLES) { + splitLongitudeTriangles(instance); + } else if (geometry.primitiveType === PrimitiveType_default.LINES) { + splitLongitudeLines(instance); + } + } + return instance; +}; +var GeometryPipeline_default = GeometryPipeline; + +export { + GeometryPipeline_default +}; diff --git a/public/assets/cesium/Workers/chunk-BVKITG4N.js b/public/assets/cesium/Workers/chunk-BVKITG4N.js new file mode 100644 index 0000000..f2a34c1 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-BVKITG4N.js @@ -0,0 +1,239 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeographicProjection_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix2_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/RectangleGeometryLibrary.js +var cos = Math.cos; +var sin = Math.sin; +var sqrt = Math.sqrt; +var RectangleGeometryLibrary = {}; +RectangleGeometryLibrary.computePosition = function(computedOptions, ellipsoid, computeST, row, col, position, st) { + const radiiSquared = ellipsoid.radiiSquared; + const nwCorner = computedOptions.nwCorner; + const rectangle = computedOptions.boundingRectangle; + let stLatitude = nwCorner.latitude - computedOptions.granYCos * row + col * computedOptions.granXSin; + const cosLatitude = cos(stLatitude); + const nZ = sin(stLatitude); + const kZ = radiiSquared.z * nZ; + let stLongitude = nwCorner.longitude + row * computedOptions.granYSin + col * computedOptions.granXCos; + const nX = cosLatitude * cos(stLongitude); + const nY = cosLatitude * sin(stLongitude); + const kX = radiiSquared.x * nX; + const kY = radiiSquared.y * nY; + const gamma = sqrt(kX * nX + kY * nY + kZ * nZ); + position.x = kX / gamma; + position.y = kY / gamma; + position.z = kZ / gamma; + if (computeST) { + const stNwCorner = computedOptions.stNwCorner; + if (defined_default(stNwCorner)) { + stLatitude = stNwCorner.latitude - computedOptions.stGranYCos * row + col * computedOptions.stGranXSin; + stLongitude = stNwCorner.longitude + row * computedOptions.stGranYSin + col * computedOptions.stGranXCos; + st.x = (stLongitude - computedOptions.stWest) * computedOptions.lonScalar; + st.y = (stLatitude - computedOptions.stSouth) * computedOptions.latScalar; + } else { + st.x = (stLongitude - rectangle.west) * computedOptions.lonScalar; + st.y = (stLatitude - rectangle.south) * computedOptions.latScalar; + } + } +}; +var rotationMatrixScratch = new Matrix2_default(); +var nwCartesian = new Cartesian3_default(); +var centerScratch = new Cartographic_default(); +var centerCartesian = new Cartesian3_default(); +var proj = new GeographicProjection_default(); +function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) { + const cosRotation = Math.cos(rotation); + const granYCos = granularityY * cosRotation; + const granXCos = granularityX * cosRotation; + const sinRotation = Math.sin(rotation); + const granYSin = granularityY * sinRotation; + const granXSin = granularityX * sinRotation; + proj._ellipsoid = Ellipsoid_default.default; + nwCartesian = proj.project(nwCorner, nwCartesian); + nwCartesian = Cartesian3_default.subtract(nwCartesian, centerCartesian, nwCartesian); + const rotationMatrix = Matrix2_default.fromRotation(rotation, rotationMatrixScratch); + nwCartesian = Matrix2_default.multiplyByVector( + rotationMatrix, + nwCartesian, + nwCartesian + ); + nwCartesian = Cartesian3_default.add(nwCartesian, centerCartesian, nwCartesian); + nwCorner = proj.unproject(nwCartesian, nwCorner); + width -= 1; + height -= 1; + const latitude = nwCorner.latitude; + const latitude0 = latitude + width * granXSin; + const latitude1 = latitude - granYCos * height; + const latitude2 = latitude - granYCos * height + width * granXSin; + const north = Math.max(latitude, latitude0, latitude1, latitude2); + const south = Math.min(latitude, latitude0, latitude1, latitude2); + const longitude = nwCorner.longitude; + const longitude0 = longitude + width * granXCos; + const longitude1 = longitude + height * granYSin; + const longitude2 = longitude + height * granYSin + width * granXCos; + const east = Math.max(longitude, longitude0, longitude1, longitude2); + const west = Math.min(longitude, longitude0, longitude1, longitude2); + return { + north, + south, + east, + west, + granYCos, + granYSin, + granXCos, + granXSin, + nwCorner + }; +} +RectangleGeometryLibrary.computeOptions = function(rectangle, granularity, rotation, stRotation, boundingRectangleScratch, nwCornerResult, stNwCornerResult) { + let east = rectangle.east; + let west = rectangle.west; + let north = rectangle.north; + let south = rectangle.south; + let northCap = false; + let southCap = false; + if (north === Math_default.PI_OVER_TWO) { + northCap = true; + } + if (south === -Math_default.PI_OVER_TWO) { + southCap = true; + } + let dx; + const dy = north - south; + if (west > east) { + dx = Math_default.TWO_PI - west + east; + } else { + dx = east - west; + } + const width = Math.ceil(dx / granularity) + 1; + const height = Math.ceil(dy / granularity) + 1; + const granularityX = dx / (width - 1); + const granularityY = dy / (height - 1); + const nwCorner = Rectangle_default.northwest(rectangle, nwCornerResult); + const center = Rectangle_default.center(rectangle, centerScratch); + if (rotation !== 0 || stRotation !== 0) { + if (center.longitude < nwCorner.longitude) { + center.longitude += Math_default.TWO_PI; + } + proj._ellipsoid = Ellipsoid_default.default; + centerCartesian = proj.project(center, centerCartesian); + } + const granYCos = granularityY; + const granXCos = granularityX; + const granYSin = 0; + const granXSin = 0; + const boundingRectangle = Rectangle_default.clone( + rectangle, + boundingRectangleScratch + ); + const computedOptions = { + granYCos, + granYSin, + granXCos, + granXSin, + nwCorner, + boundingRectangle, + width, + height, + northCap, + southCap + }; + if (rotation !== 0) { + const rotationOptions = getRotationOptions( + nwCorner, + rotation, + granularityX, + granularityY, + center, + width, + height + ); + north = rotationOptions.north; + south = rotationOptions.south; + east = rotationOptions.east; + west = rotationOptions.west; + if (north < -Math_default.PI_OVER_TWO || north > Math_default.PI_OVER_TWO || south < -Math_default.PI_OVER_TWO || south > Math_default.PI_OVER_TWO) { + throw new DeveloperError_default( + "Rotated rectangle is invalid. It crosses over either the north or south pole." + ); + } + computedOptions.granYCos = rotationOptions.granYCos; + computedOptions.granYSin = rotationOptions.granYSin; + computedOptions.granXCos = rotationOptions.granXCos; + computedOptions.granXSin = rotationOptions.granXSin; + boundingRectangle.north = north; + boundingRectangle.south = south; + boundingRectangle.east = east; + boundingRectangle.west = west; + } + if (stRotation !== 0) { + rotation = rotation - stRotation; + const stNwCorner = Rectangle_default.northwest(boundingRectangle, stNwCornerResult); + const stRotationOptions = getRotationOptions( + stNwCorner, + rotation, + granularityX, + granularityY, + center, + width, + height + ); + computedOptions.stGranYCos = stRotationOptions.granYCos; + computedOptions.stGranXCos = stRotationOptions.granXCos; + computedOptions.stGranYSin = stRotationOptions.granYSin; + computedOptions.stGranXSin = stRotationOptions.granXSin; + computedOptions.stNwCorner = stNwCorner; + computedOptions.stWest = stRotationOptions.west; + computedOptions.stSouth = stRotationOptions.south; + } + return computedOptions; +}; +var RectangleGeometryLibrary_default = RectangleGeometryLibrary; + +export { + RectangleGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-C3EQ27WF.js b/public/assets/cesium/Workers/chunk-C3EQ27WF.js new file mode 100644 index 0000000..c4ad745 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-C3EQ27WF.js @@ -0,0 +1,353 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidGeodesic.js +function setConstants(ellipsoidGeodesic) { + const uSquared = ellipsoidGeodesic._uSquared; + const a = ellipsoidGeodesic._ellipsoid.maximumRadius; + const b = ellipsoidGeodesic._ellipsoid.minimumRadius; + const f = (a - b) / a; + const cosineHeading = Math.cos(ellipsoidGeodesic._startHeading); + const sineHeading = Math.sin(ellipsoidGeodesic._startHeading); + const tanU = (1 - f) * Math.tan(ellipsoidGeodesic._start.latitude); + const cosineU = 1 / Math.sqrt(1 + tanU * tanU); + const sineU = cosineU * tanU; + const sigma = Math.atan2(tanU, cosineHeading); + const sineAlpha = cosineU * sineHeading; + const sineSquaredAlpha = sineAlpha * sineAlpha; + const cosineSquaredAlpha = 1 - sineSquaredAlpha; + const cosineAlpha = Math.sqrt(cosineSquaredAlpha); + const u2Over4 = uSquared / 4; + const u4Over16 = u2Over4 * u2Over4; + const u6Over64 = u4Over16 * u2Over4; + const u8Over256 = u4Over16 * u4Over16; + const a0 = 1 + u2Over4 - 3 * u4Over16 / 4 + 5 * u6Over64 / 4 - 175 * u8Over256 / 64; + const a1 = 1 - u2Over4 + 15 * u4Over16 / 8 - 35 * u6Over64 / 8; + const a2 = 1 - 3 * u2Over4 + 35 * u4Over16 / 4; + const a3 = 1 - 5 * u2Over4; + const distanceRatio = a0 * sigma - a1 * Math.sin(2 * sigma) * u2Over4 / 2 - a2 * Math.sin(4 * sigma) * u4Over16 / 16 - a3 * Math.sin(6 * sigma) * u6Over64 / 48 - Math.sin(8 * sigma) * 5 * u8Over256 / 512; + const constants = ellipsoidGeodesic._constants; + constants.a = a; + constants.b = b; + constants.f = f; + constants.cosineHeading = cosineHeading; + constants.sineHeading = sineHeading; + constants.tanU = tanU; + constants.cosineU = cosineU; + constants.sineU = sineU; + constants.sigma = sigma; + constants.sineAlpha = sineAlpha; + constants.sineSquaredAlpha = sineSquaredAlpha; + constants.cosineSquaredAlpha = cosineSquaredAlpha; + constants.cosineAlpha = cosineAlpha; + constants.u2Over4 = u2Over4; + constants.u4Over16 = u4Over16; + constants.u6Over64 = u6Over64; + constants.u8Over256 = u8Over256; + constants.a0 = a0; + constants.a1 = a1; + constants.a2 = a2; + constants.a3 = a3; + constants.distanceRatio = distanceRatio; +} +function computeC(f, cosineSquaredAlpha) { + return f * cosineSquaredAlpha * (4 + f * (4 - 3 * cosineSquaredAlpha)) / 16; +} +function computeDeltaLambda(f, sineAlpha, cosineSquaredAlpha, sigma, sineSigma, cosineSigma, cosineTwiceSigmaMidpoint) { + const C = computeC(f, cosineSquaredAlpha); + return (1 - C) * f * sineAlpha * (sigma + C * sineSigma * (cosineTwiceSigmaMidpoint + C * cosineSigma * (2 * cosineTwiceSigmaMidpoint * cosineTwiceSigmaMidpoint - 1))); +} +function vincentyInverseFormula(ellipsoidGeodesic, major, minor, firstLongitude, firstLatitude, secondLongitude, secondLatitude) { + const eff = (major - minor) / major; + const l = secondLongitude - firstLongitude; + const u1 = Math.atan((1 - eff) * Math.tan(firstLatitude)); + const u2 = Math.atan((1 - eff) * Math.tan(secondLatitude)); + const cosineU1 = Math.cos(u1); + const sineU1 = Math.sin(u1); + const cosineU2 = Math.cos(u2); + const sineU2 = Math.sin(u2); + const cc = cosineU1 * cosineU2; + const cs = cosineU1 * sineU2; + const ss = sineU1 * sineU2; + const sc = sineU1 * cosineU2; + let lambda = l; + let lambdaDot = Math_default.TWO_PI; + let cosineLambda = Math.cos(lambda); + let sineLambda = Math.sin(lambda); + let sigma; + let cosineSigma; + let sineSigma; + let cosineSquaredAlpha; + let cosineTwiceSigmaMidpoint; + do { + cosineLambda = Math.cos(lambda); + sineLambda = Math.sin(lambda); + const temp = cs - sc * cosineLambda; + sineSigma = Math.sqrt( + cosineU2 * cosineU2 * sineLambda * sineLambda + temp * temp + ); + cosineSigma = ss + cc * cosineLambda; + sigma = Math.atan2(sineSigma, cosineSigma); + let sineAlpha; + if (sineSigma === 0) { + sineAlpha = 0; + cosineSquaredAlpha = 1; + } else { + sineAlpha = cc * sineLambda / sineSigma; + cosineSquaredAlpha = 1 - sineAlpha * sineAlpha; + } + lambdaDot = lambda; + cosineTwiceSigmaMidpoint = cosineSigma - 2 * ss / cosineSquaredAlpha; + if (!isFinite(cosineTwiceSigmaMidpoint)) { + cosineTwiceSigmaMidpoint = 0; + } + lambda = l + computeDeltaLambda( + eff, + sineAlpha, + cosineSquaredAlpha, + sigma, + sineSigma, + cosineSigma, + cosineTwiceSigmaMidpoint + ); + } while (Math.abs(lambda - lambdaDot) > Math_default.EPSILON12); + const uSquared = cosineSquaredAlpha * (major * major - minor * minor) / (minor * minor); + const A = 1 + uSquared * (4096 + uSquared * (uSquared * (320 - 175 * uSquared) - 768)) / 16384; + const B = uSquared * (256 + uSquared * (uSquared * (74 - 47 * uSquared) - 128)) / 1024; + const cosineSquaredTwiceSigmaMidpoint = cosineTwiceSigmaMidpoint * cosineTwiceSigmaMidpoint; + const deltaSigma = B * sineSigma * (cosineTwiceSigmaMidpoint + B * (cosineSigma * (2 * cosineSquaredTwiceSigmaMidpoint - 1) - B * cosineTwiceSigmaMidpoint * (4 * sineSigma * sineSigma - 3) * (4 * cosineSquaredTwiceSigmaMidpoint - 3) / 6) / 4); + const distance = minor * A * (sigma - deltaSigma); + const startHeading = Math.atan2( + cosineU2 * sineLambda, + cs - sc * cosineLambda + ); + const endHeading = Math.atan2(cosineU1 * sineLambda, cs * cosineLambda - sc); + ellipsoidGeodesic._distance = distance; + ellipsoidGeodesic._startHeading = startHeading; + ellipsoidGeodesic._endHeading = endHeading; + ellipsoidGeodesic._uSquared = uSquared; +} +var scratchCart1 = new Cartesian3_default(); +var scratchCart2 = new Cartesian3_default(); +function computeProperties(ellipsoidGeodesic, start, end, ellipsoid) { + const firstCartesian = Cartesian3_default.normalize( + ellipsoid.cartographicToCartesian(start, scratchCart2), + scratchCart1 + ); + const lastCartesian = Cartesian3_default.normalize( + ellipsoid.cartographicToCartesian(end, scratchCart2), + scratchCart2 + ); + Check_default.typeOf.number.greaterThanOrEquals( + "value", + Math.abs( + Math.abs(Cartesian3_default.angleBetween(firstCartesian, lastCartesian)) - Math.PI + ), + 0.0125 + ); + vincentyInverseFormula( + ellipsoidGeodesic, + ellipsoid.maximumRadius, + ellipsoid.minimumRadius, + start.longitude, + start.latitude, + end.longitude, + end.latitude + ); + ellipsoidGeodesic._start = Cartographic_default.clone( + start, + ellipsoidGeodesic._start + ); + ellipsoidGeodesic._end = Cartographic_default.clone(end, ellipsoidGeodesic._end); + ellipsoidGeodesic._start.height = 0; + ellipsoidGeodesic._end.height = 0; + setConstants(ellipsoidGeodesic); +} +function EllipsoidGeodesic(start, end, ellipsoid) { + const e = defaultValue_default(ellipsoid, Ellipsoid_default.default); + this._ellipsoid = e; + this._start = new Cartographic_default(); + this._end = new Cartographic_default(); + this._constants = {}; + this._startHeading = void 0; + this._endHeading = void 0; + this._distance = void 0; + this._uSquared = void 0; + if (defined_default(start) && defined_default(end)) { + computeProperties(this, start, end, e); + } +} +Object.defineProperties(EllipsoidGeodesic.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidGeodesic.prototype + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the surface distance between the start and end point + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + surfaceDistance: { + get: function() { + Check_default.defined("distance", this._distance); + return this._distance; + } + }, + /** + * Gets the initial planetodetic point on the path. + * @memberof EllipsoidGeodesic.prototype + * @type {Cartographic} + * @readonly + */ + start: { + get: function() { + return this._start; + } + }, + /** + * Gets the final planetodetic point on the path. + * @memberof EllipsoidGeodesic.prototype + * @type {Cartographic} + * @readonly + */ + end: { + get: function() { + return this._end; + } + }, + /** + * Gets the heading at the initial point. + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + startHeading: { + get: function() { + Check_default.defined("distance", this._distance); + return this._startHeading; + } + }, + /** + * Gets the heading at the final point. + * @memberof EllipsoidGeodesic.prototype + * @type {number} + * @readonly + */ + endHeading: { + get: function() { + Check_default.defined("distance", this._distance); + return this._endHeading; + } + } +}); +EllipsoidGeodesic.prototype.setEndPoints = function(start, end) { + Check_default.defined("start", start); + Check_default.defined("end", end); + computeProperties(this, start, end, this._ellipsoid); +}; +EllipsoidGeodesic.prototype.interpolateUsingFraction = function(fraction, result) { + return this.interpolateUsingSurfaceDistance( + this._distance * fraction, + result + ); +}; +EllipsoidGeodesic.prototype.interpolateUsingSurfaceDistance = function(distance, result) { + Check_default.defined("distance", this._distance); + const constants = this._constants; + const s = constants.distanceRatio + distance / constants.b; + const cosine2S = Math.cos(2 * s); + const cosine4S = Math.cos(4 * s); + const cosine6S = Math.cos(6 * s); + const sine2S = Math.sin(2 * s); + const sine4S = Math.sin(4 * s); + const sine6S = Math.sin(6 * s); + const sine8S = Math.sin(8 * s); + const s2 = s * s; + const s3 = s * s2; + const u8Over256 = constants.u8Over256; + const u2Over4 = constants.u2Over4; + const u6Over64 = constants.u6Over64; + const u4Over16 = constants.u4Over16; + let sigma = 2 * s3 * u8Over256 * cosine2S / 3 + s * (1 - u2Over4 + 7 * u4Over16 / 4 - 15 * u6Over64 / 4 + 579 * u8Over256 / 64 - (u4Over16 - 15 * u6Over64 / 4 + 187 * u8Over256 / 16) * cosine2S - (5 * u6Over64 / 4 - 115 * u8Over256 / 16) * cosine4S - 29 * u8Over256 * cosine6S / 16) + (u2Over4 / 2 - u4Over16 + 71 * u6Over64 / 32 - 85 * u8Over256 / 16) * sine2S + (5 * u4Over16 / 16 - 5 * u6Over64 / 4 + 383 * u8Over256 / 96) * sine4S - s2 * ((u6Over64 - 11 * u8Over256 / 2) * sine2S + 5 * u8Over256 * sine4S / 2) + (29 * u6Over64 / 96 - 29 * u8Over256 / 16) * sine6S + 539 * u8Over256 * sine8S / 1536; + const theta = Math.asin(Math.sin(sigma) * constants.cosineAlpha); + const latitude = Math.atan(constants.a / constants.b * Math.tan(theta)); + sigma = sigma - constants.sigma; + const cosineTwiceSigmaMidpoint = Math.cos(2 * constants.sigma + sigma); + const sineSigma = Math.sin(sigma); + const cosineSigma = Math.cos(sigma); + const cc = constants.cosineU * cosineSigma; + const ss = constants.sineU * sineSigma; + const lambda = Math.atan2( + sineSigma * constants.sineHeading, + cc - ss * constants.cosineHeading + ); + const l = lambda - computeDeltaLambda( + constants.f, + constants.sineAlpha, + constants.cosineSquaredAlpha, + sigma, + sineSigma, + cosineSigma, + cosineTwiceSigmaMidpoint + ); + if (defined_default(result)) { + result.longitude = this._start.longitude + l; + result.latitude = latitude; + result.height = 0; + return result; + } + return new Cartographic_default(this._start.longitude + l, latitude, 0); +}; +var EllipsoidGeodesic_default = EllipsoidGeodesic; + +export { + EllipsoidGeodesic_default +}; diff --git a/public/assets/cesium/Workers/chunk-C4WPMOKT.js b/public/assets/cesium/Workers/chunk-C4WPMOKT.js new file mode 100644 index 0000000..e4b1326 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-C4WPMOKT.js @@ -0,0 +1,139 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + WebGLConstants_default +} from "./chunk-3HQMMUPU.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/IndexDatatype.js +var IndexDatatype = { + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + * + * @type {number} + * @constant + */ + UNSIGNED_BYTE: WebGLConstants_default.UNSIGNED_BYTE, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + * + * @type {number} + * @constant + */ + UNSIGNED_SHORT: WebGLConstants_default.UNSIGNED_SHORT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + * + * @type {number} + * @constant + */ + UNSIGNED_INT: WebGLConstants_default.UNSIGNED_INT +}; +IndexDatatype.getSizeInBytes = function(indexDatatype) { + switch (indexDatatype) { + case IndexDatatype.UNSIGNED_BYTE: + return Uint8Array.BYTES_PER_ELEMENT; + case IndexDatatype.UNSIGNED_SHORT: + return Uint16Array.BYTES_PER_ELEMENT; + case IndexDatatype.UNSIGNED_INT: + return Uint32Array.BYTES_PER_ELEMENT; + } + throw new DeveloperError_default( + "indexDatatype is required and must be a valid IndexDatatype constant." + ); +}; +IndexDatatype.fromSizeInBytes = function(sizeInBytes) { + switch (sizeInBytes) { + case 2: + return IndexDatatype.UNSIGNED_SHORT; + case 4: + return IndexDatatype.UNSIGNED_INT; + case 1: + return IndexDatatype.UNSIGNED_BYTE; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default( + "Size in bytes cannot be mapped to an IndexDatatype" + ); + } +}; +IndexDatatype.validate = function(indexDatatype) { + return defined_default(indexDatatype) && (indexDatatype === IndexDatatype.UNSIGNED_BYTE || indexDatatype === IndexDatatype.UNSIGNED_SHORT || indexDatatype === IndexDatatype.UNSIGNED_INT); +}; +IndexDatatype.createTypedArray = function(numberOfVertices, indicesLengthOrArray) { + if (!defined_default(numberOfVertices)) { + throw new DeveloperError_default("numberOfVertices is required."); + } + if (numberOfVertices >= Math_default.SIXTY_FOUR_KILOBYTES) { + return new Uint32Array(indicesLengthOrArray); + } + return new Uint16Array(indicesLengthOrArray); +}; +IndexDatatype.createTypedArrayFromArrayBuffer = function(numberOfVertices, sourceArray, byteOffset, length) { + if (!defined_default(numberOfVertices)) { + throw new DeveloperError_default("numberOfVertices is required."); + } + if (!defined_default(sourceArray)) { + throw new DeveloperError_default("sourceArray is required."); + } + if (!defined_default(byteOffset)) { + throw new DeveloperError_default("byteOffset is required."); + } + if (numberOfVertices >= Math_default.SIXTY_FOUR_KILOBYTES) { + return new Uint32Array(sourceArray, byteOffset, length); + } + return new Uint16Array(sourceArray, byteOffset, length); +}; +IndexDatatype.fromTypedArray = function(array) { + if (array instanceof Uint8Array) { + return IndexDatatype.UNSIGNED_BYTE; + } + if (array instanceof Uint16Array) { + return IndexDatatype.UNSIGNED_SHORT; + } + if (array instanceof Uint32Array) { + return IndexDatatype.UNSIGNED_INT; + } + throw new DeveloperError_default( + "array must be a Uint8Array, Uint16Array, or Uint32Array." + ); +}; +var IndexDatatype_default = Object.freeze(IndexDatatype); + +export { + IndexDatatype_default +}; diff --git a/public/assets/cesium/Workers/chunk-EDLRS3AW.js b/public/assets/cesium/Workers/chunk-EDLRS3AW.js new file mode 100644 index 0000000..a4d295c --- /dev/null +++ b/public/assets/cesium/Workers/chunk-EDLRS3AW.js @@ -0,0 +1,171 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian4_default, + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/Plane.js +function Plane(normal, distance) { + Check_default.typeOf.object("normal", normal); + if (!Math_default.equalsEpsilon( + Cartesian3_default.magnitude(normal), + 1, + Math_default.EPSILON6 + )) { + throw new DeveloperError_default("normal must be normalized."); + } + Check_default.typeOf.number("distance", distance); + this.normal = Cartesian3_default.clone(normal); + this.distance = distance; +} +Plane.fromPointNormal = function(point, normal, result) { + Check_default.typeOf.object("point", point); + Check_default.typeOf.object("normal", normal); + if (!Math_default.equalsEpsilon( + Cartesian3_default.magnitude(normal), + 1, + Math_default.EPSILON6 + )) { + throw new DeveloperError_default("normal must be normalized."); + } + const distance = -Cartesian3_default.dot(normal, point); + if (!defined_default(result)) { + return new Plane(normal, distance); + } + Cartesian3_default.clone(normal, result.normal); + result.distance = distance; + return result; +}; +var scratchNormal = new Cartesian3_default(); +Plane.fromCartesian4 = function(coefficients, result) { + Check_default.typeOf.object("coefficients", coefficients); + const normal = Cartesian3_default.fromCartesian4(coefficients, scratchNormal); + const distance = coefficients.w; + if (!Math_default.equalsEpsilon( + Cartesian3_default.magnitude(normal), + 1, + Math_default.EPSILON6 + )) { + throw new DeveloperError_default("normal must be normalized."); + } + if (!defined_default(result)) { + return new Plane(normal, distance); + } + Cartesian3_default.clone(normal, result.normal); + result.distance = distance; + return result; +}; +Plane.getPointDistance = function(plane, point) { + Check_default.typeOf.object("plane", plane); + Check_default.typeOf.object("point", point); + return Cartesian3_default.dot(plane.normal, point) + plane.distance; +}; +var scratchCartesian = new Cartesian3_default(); +Plane.projectPointOntoPlane = function(plane, point, result) { + Check_default.typeOf.object("plane", plane); + Check_default.typeOf.object("point", point); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const pointDistance = Plane.getPointDistance(plane, point); + const scaledNormal = Cartesian3_default.multiplyByScalar( + plane.normal, + pointDistance, + scratchCartesian + ); + return Cartesian3_default.subtract(point, scaledNormal, result); +}; +var scratchInverseTranspose = new Matrix4_default(); +var scratchPlaneCartesian4 = new Cartesian4_default(); +var scratchTransformNormal = new Cartesian3_default(); +Plane.transform = function(plane, transform, result) { + Check_default.typeOf.object("plane", plane); + Check_default.typeOf.object("transform", transform); + const normal = plane.normal; + const distance = plane.distance; + const inverseTranspose = Matrix4_default.inverseTranspose( + transform, + scratchInverseTranspose + ); + let planeAsCartesian4 = Cartesian4_default.fromElements( + normal.x, + normal.y, + normal.z, + distance, + scratchPlaneCartesian4 + ); + planeAsCartesian4 = Matrix4_default.multiplyByVector( + inverseTranspose, + planeAsCartesian4, + planeAsCartesian4 + ); + const transformedNormal = Cartesian3_default.fromCartesian4( + planeAsCartesian4, + scratchTransformNormal + ); + planeAsCartesian4 = Cartesian4_default.divideByScalar( + planeAsCartesian4, + Cartesian3_default.magnitude(transformedNormal), + planeAsCartesian4 + ); + return Plane.fromCartesian4(planeAsCartesian4, result); +}; +Plane.clone = function(plane, result) { + Check_default.typeOf.object("plane", plane); + if (!defined_default(result)) { + return new Plane(plane.normal, plane.distance); + } + Cartesian3_default.clone(plane.normal, result.normal); + result.distance = plane.distance; + return result; +}; +Plane.equals = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.distance === right.distance && Cartesian3_default.equals(left.normal, right.normal); +}; +Plane.ORIGIN_XY_PLANE = Object.freeze(new Plane(Cartesian3_default.UNIT_Z, 0)); +Plane.ORIGIN_YZ_PLANE = Object.freeze(new Plane(Cartesian3_default.UNIT_X, 0)); +Plane.ORIGIN_ZX_PLANE = Object.freeze(new Plane(Cartesian3_default.UNIT_Y, 0)); +var Plane_default = Plane; + +export { + Plane_default +}; diff --git a/public/assets/cesium/Workers/chunk-EJVGYGLF.js b/public/assets/cesium/Workers/chunk-EJVGYGLF.js new file mode 100644 index 0000000..5167ceb --- /dev/null +++ b/public/assets/cesium/Workers/chunk-EJVGYGLF.js @@ -0,0 +1,476 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CornerType_default, + PolylineVolumeGeometryLibrary_default +} from "./chunk-3IFRSGEY.js"; +import { + PolylinePipeline_default +} from "./chunk-QN6TBED4.js"; +import { + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CorridorGeometryLibrary.js +var CorridorGeometryLibrary = {}; +var scratch1 = new Cartesian3_default(); +var scratch2 = new Cartesian3_default(); +var scratch3 = new Cartesian3_default(); +var scratch4 = new Cartesian3_default(); +var scaleArray2 = [new Cartesian3_default(), new Cartesian3_default()]; +var cartesian1 = new Cartesian3_default(); +var cartesian2 = new Cartesian3_default(); +var cartesian3 = new Cartesian3_default(); +var cartesian4 = new Cartesian3_default(); +var cartesian5 = new Cartesian3_default(); +var cartesian6 = new Cartesian3_default(); +var cartesian7 = new Cartesian3_default(); +var cartesian8 = new Cartesian3_default(); +var cartesian9 = new Cartesian3_default(); +var cartesian10 = new Cartesian3_default(); +var quaterion = new Quaternion_default(); +var rotMatrix = new Matrix3_default(); +function computeRoundCorner(cornerPoint, startPoint, endPoint, cornerType, leftIsOutside) { + const angle = Cartesian3_default.angleBetween( + Cartesian3_default.subtract(startPoint, cornerPoint, scratch1), + Cartesian3_default.subtract(endPoint, cornerPoint, scratch2) + ); + const granularity = cornerType === CornerType_default.BEVELED ? 1 : Math.ceil(angle / Math_default.toRadians(5)) + 1; + const size = granularity * 3; + const array = new Array(size); + array[size - 3] = endPoint.x; + array[size - 2] = endPoint.y; + array[size - 1] = endPoint.z; + let m; + if (leftIsOutside) { + m = Matrix3_default.fromQuaternion( + Quaternion_default.fromAxisAngle( + Cartesian3_default.negate(cornerPoint, scratch1), + angle / granularity, + quaterion + ), + rotMatrix + ); + } else { + m = Matrix3_default.fromQuaternion( + Quaternion_default.fromAxisAngle(cornerPoint, angle / granularity, quaterion), + rotMatrix + ); + } + let index = 0; + startPoint = Cartesian3_default.clone(startPoint, scratch1); + for (let i = 0; i < granularity; i++) { + startPoint = Matrix3_default.multiplyByVector(m, startPoint, startPoint); + array[index++] = startPoint.x; + array[index++] = startPoint.y; + array[index++] = startPoint.z; + } + return array; +} +function addEndCaps(calculatedPositions) { + let cornerPoint = cartesian1; + let startPoint = cartesian2; + let endPoint = cartesian3; + let leftEdge = calculatedPositions[1]; + startPoint = Cartesian3_default.fromArray( + calculatedPositions[1], + leftEdge.length - 3, + startPoint + ); + endPoint = Cartesian3_default.fromArray(calculatedPositions[0], 0, endPoint); + cornerPoint = Cartesian3_default.midpoint(startPoint, endPoint, cornerPoint); + const firstEndCap = computeRoundCorner( + cornerPoint, + startPoint, + endPoint, + CornerType_default.ROUNDED, + false + ); + const length = calculatedPositions.length - 1; + const rightEdge = calculatedPositions[length - 1]; + leftEdge = calculatedPositions[length]; + startPoint = Cartesian3_default.fromArray( + rightEdge, + rightEdge.length - 3, + startPoint + ); + endPoint = Cartesian3_default.fromArray(leftEdge, 0, endPoint); + cornerPoint = Cartesian3_default.midpoint(startPoint, endPoint, cornerPoint); + const lastEndCap = computeRoundCorner( + cornerPoint, + startPoint, + endPoint, + CornerType_default.ROUNDED, + false + ); + return [firstEndCap, lastEndCap]; +} +function computeMiteredCorner(position, leftCornerDirection, lastPoint, leftIsOutside) { + let cornerPoint = scratch1; + if (leftIsOutside) { + cornerPoint = Cartesian3_default.add(position, leftCornerDirection, cornerPoint); + } else { + leftCornerDirection = Cartesian3_default.negate( + leftCornerDirection, + leftCornerDirection + ); + cornerPoint = Cartesian3_default.add(position, leftCornerDirection, cornerPoint); + } + return [ + cornerPoint.x, + cornerPoint.y, + cornerPoint.z, + lastPoint.x, + lastPoint.y, + lastPoint.z + ]; +} +function addShiftedPositions(positions, left, scalar, calculatedPositions) { + const rightPositions = new Array(positions.length); + const leftPositions = new Array(positions.length); + const scaledLeft = Cartesian3_default.multiplyByScalar(left, scalar, scratch1); + const scaledRight = Cartesian3_default.negate(scaledLeft, scratch2); + let rightIndex = 0; + let leftIndex = positions.length - 1; + for (let i = 0; i < positions.length; i += 3) { + const pos = Cartesian3_default.fromArray(positions, i, scratch3); + const rightPos = Cartesian3_default.add(pos, scaledRight, scratch4); + rightPositions[rightIndex++] = rightPos.x; + rightPositions[rightIndex++] = rightPos.y; + rightPositions[rightIndex++] = rightPos.z; + const leftPos = Cartesian3_default.add(pos, scaledLeft, scratch4); + leftPositions[leftIndex--] = leftPos.z; + leftPositions[leftIndex--] = leftPos.y; + leftPositions[leftIndex--] = leftPos.x; + } + calculatedPositions.push(rightPositions, leftPositions); + return calculatedPositions; +} +CorridorGeometryLibrary.addAttribute = function(attribute, value, front, back) { + const x = value.x; + const y = value.y; + const z = value.z; + if (defined_default(front)) { + attribute[front] = x; + attribute[front + 1] = y; + attribute[front + 2] = z; + } + if (defined_default(back)) { + attribute[back] = z; + attribute[back - 1] = y; + attribute[back - 2] = x; + } +}; +var scratchForwardProjection = new Cartesian3_default(); +var scratchBackwardProjection = new Cartesian3_default(); +CorridorGeometryLibrary.computePositions = function(params) { + const granularity = params.granularity; + const positions = params.positions; + const ellipsoid = params.ellipsoid; + const width = params.width / 2; + const cornerType = params.cornerType; + const saveAttributes = params.saveAttributes; + let normal = cartesian1; + let forward = cartesian2; + let backward = cartesian3; + let left = cartesian4; + let cornerDirection = cartesian5; + let startPoint = cartesian6; + let previousPos = cartesian7; + let rightPos = cartesian8; + let leftPos = cartesian9; + let center = cartesian10; + let calculatedPositions = []; + const calculatedLefts = saveAttributes ? [] : void 0; + const calculatedNormals = saveAttributes ? [] : void 0; + let position = positions[0]; + let nextPosition = positions[1]; + forward = Cartesian3_default.normalize( + Cartesian3_default.subtract(nextPosition, position, forward), + forward + ); + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + left = Cartesian3_default.normalize(Cartesian3_default.cross(normal, forward, left), left); + if (saveAttributes) { + calculatedLefts.push(left.x, left.y, left.z); + calculatedNormals.push(normal.x, normal.y, normal.z); + } + previousPos = Cartesian3_default.clone(position, previousPos); + position = nextPosition; + backward = Cartesian3_default.negate(forward, backward); + let subdividedPositions; + const corners = []; + let i; + const length = positions.length; + for (i = 1; i < length - 1; i++) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + nextPosition = positions[i + 1]; + forward = Cartesian3_default.normalize( + Cartesian3_default.subtract(nextPosition, position, forward), + forward + ); + cornerDirection = Cartesian3_default.normalize( + Cartesian3_default.add(forward, backward, cornerDirection), + cornerDirection + ); + const forwardProjection = Cartesian3_default.multiplyByScalar( + normal, + Cartesian3_default.dot(forward, normal), + scratchForwardProjection + ); + Cartesian3_default.subtract(forward, forwardProjection, forwardProjection); + Cartesian3_default.normalize(forwardProjection, forwardProjection); + const backwardProjection = Cartesian3_default.multiplyByScalar( + normal, + Cartesian3_default.dot(backward, normal), + scratchBackwardProjection + ); + Cartesian3_default.subtract(backward, backwardProjection, backwardProjection); + Cartesian3_default.normalize(backwardProjection, backwardProjection); + const doCorner = !Math_default.equalsEpsilon( + Math.abs(Cartesian3_default.dot(forwardProjection, backwardProjection)), + 1, + Math_default.EPSILON7 + ); + if (doCorner) { + cornerDirection = Cartesian3_default.cross( + cornerDirection, + normal, + cornerDirection + ); + cornerDirection = Cartesian3_default.cross( + normal, + cornerDirection, + cornerDirection + ); + cornerDirection = Cartesian3_default.normalize(cornerDirection, cornerDirection); + const scalar = width / Math.max( + 0.25, + Cartesian3_default.magnitude( + Cartesian3_default.cross(cornerDirection, backward, scratch1) + ) + ); + const leftIsOutside = PolylineVolumeGeometryLibrary_default.angleIsGreaterThanPi( + forward, + backward, + position, + ellipsoid + ); + cornerDirection = Cartesian3_default.multiplyByScalar( + cornerDirection, + scalar, + cornerDirection + ); + if (leftIsOutside) { + rightPos = Cartesian3_default.add(position, cornerDirection, rightPos); + center = Cartesian3_default.add( + rightPos, + Cartesian3_default.multiplyByScalar(left, width, center), + center + ); + leftPos = Cartesian3_default.add( + rightPos, + Cartesian3_default.multiplyByScalar(left, width * 2, leftPos), + leftPos + ); + scaleArray2[0] = Cartesian3_default.clone(previousPos, scaleArray2[0]); + scaleArray2[1] = Cartesian3_default.clone(center, scaleArray2[1]); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scaleArray2, + granularity, + ellipsoid + }); + calculatedPositions = addShiftedPositions( + subdividedPositions, + left, + width, + calculatedPositions + ); + if (saveAttributes) { + calculatedLefts.push(left.x, left.y, left.z); + calculatedNormals.push(normal.x, normal.y, normal.z); + } + startPoint = Cartesian3_default.clone(leftPos, startPoint); + left = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, forward, left), + left + ); + leftPos = Cartesian3_default.add( + rightPos, + Cartesian3_default.multiplyByScalar(left, width * 2, leftPos), + leftPos + ); + previousPos = Cartesian3_default.add( + rightPos, + Cartesian3_default.multiplyByScalar(left, width, previousPos), + previousPos + ); + if (cornerType === CornerType_default.ROUNDED || cornerType === CornerType_default.BEVELED) { + corners.push({ + leftPositions: computeRoundCorner( + rightPos, + startPoint, + leftPos, + cornerType, + leftIsOutside + ) + }); + } else { + corners.push({ + leftPositions: computeMiteredCorner( + position, + Cartesian3_default.negate(cornerDirection, cornerDirection), + leftPos, + leftIsOutside + ) + }); + } + } else { + leftPos = Cartesian3_default.add(position, cornerDirection, leftPos); + center = Cartesian3_default.add( + leftPos, + Cartesian3_default.negate( + Cartesian3_default.multiplyByScalar(left, width, center), + center + ), + center + ); + rightPos = Cartesian3_default.add( + leftPos, + Cartesian3_default.negate( + Cartesian3_default.multiplyByScalar(left, width * 2, rightPos), + rightPos + ), + rightPos + ); + scaleArray2[0] = Cartesian3_default.clone(previousPos, scaleArray2[0]); + scaleArray2[1] = Cartesian3_default.clone(center, scaleArray2[1]); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scaleArray2, + granularity, + ellipsoid + }); + calculatedPositions = addShiftedPositions( + subdividedPositions, + left, + width, + calculatedPositions + ); + if (saveAttributes) { + calculatedLefts.push(left.x, left.y, left.z); + calculatedNormals.push(normal.x, normal.y, normal.z); + } + startPoint = Cartesian3_default.clone(rightPos, startPoint); + left = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, forward, left), + left + ); + rightPos = Cartesian3_default.add( + leftPos, + Cartesian3_default.negate( + Cartesian3_default.multiplyByScalar(left, width * 2, rightPos), + rightPos + ), + rightPos + ); + previousPos = Cartesian3_default.add( + leftPos, + Cartesian3_default.negate( + Cartesian3_default.multiplyByScalar(left, width, previousPos), + previousPos + ), + previousPos + ); + if (cornerType === CornerType_default.ROUNDED || cornerType === CornerType_default.BEVELED) { + corners.push({ + rightPositions: computeRoundCorner( + leftPos, + startPoint, + rightPos, + cornerType, + leftIsOutside + ) + }); + } else { + corners.push({ + rightPositions: computeMiteredCorner( + position, + cornerDirection, + rightPos, + leftIsOutside + ) + }); + } + } + backward = Cartesian3_default.negate(forward, backward); + } + position = nextPosition; + } + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + scaleArray2[0] = Cartesian3_default.clone(previousPos, scaleArray2[0]); + scaleArray2[1] = Cartesian3_default.clone(position, scaleArray2[1]); + subdividedPositions = PolylinePipeline_default.generateArc({ + positions: scaleArray2, + granularity, + ellipsoid + }); + calculatedPositions = addShiftedPositions( + subdividedPositions, + left, + width, + calculatedPositions + ); + if (saveAttributes) { + calculatedLefts.push(left.x, left.y, left.z); + calculatedNormals.push(normal.x, normal.y, normal.z); + } + let endPositions; + if (cornerType === CornerType_default.ROUNDED) { + endPositions = addEndCaps(calculatedPositions); + } + return { + positions: calculatedPositions, + corners, + lefts: calculatedLefts, + normals: calculatedNormals, + endPositions + }; +}; +var CorridorGeometryLibrary_default = CorridorGeometryLibrary; + +export { + CorridorGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-FFLMY4TE.js b/public/assets/cesium/Workers/chunk-FFLMY4TE.js new file mode 100644 index 0000000..2db084a --- /dev/null +++ b/public/assets/cesium/Workers/chunk-FFLMY4TE.js @@ -0,0 +1,2857 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/Cartesian3.js +function Cartesian3(x, y, z) { + this.x = defaultValue_default(x, 0); + this.y = defaultValue_default(y, 0); + this.z = defaultValue_default(z, 0); +} +Cartesian3.fromSpherical = function(spherical, result) { + Check_default.typeOf.object("spherical", spherical); + if (!defined_default(result)) { + result = new Cartesian3(); + } + const clock = spherical.clock; + const cone = spherical.cone; + const magnitude = defaultValue_default(spherical.magnitude, 1); + const radial = magnitude * Math.sin(cone); + result.x = radial * Math.cos(clock); + result.y = radial * Math.sin(clock); + result.z = magnitude * Math.cos(cone); + return result; +}; +Cartesian3.fromElements = function(x, y, z, result) { + if (!defined_default(result)) { + return new Cartesian3(x, y, z); + } + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Cartesian3.clone = function(cartesian, result) { + if (!defined_default(cartesian)) { + return void 0; + } + if (!defined_default(result)) { + return new Cartesian3(cartesian.x, cartesian.y, cartesian.z); + } + result.x = cartesian.x; + result.y = cartesian.y; + result.z = cartesian.z; + return result; +}; +Cartesian3.fromCartesian4 = Cartesian3.clone; +Cartesian3.packedLength = 3; +Cartesian3.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.x; + array[startingIndex++] = value.y; + array[startingIndex] = value.z; + return array; +}; +Cartesian3.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Cartesian3(); + } + result.x = array[startingIndex++]; + result.y = array[startingIndex++]; + result.z = array[startingIndex]; + return result; +}; +Cartesian3.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 3; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 3 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Cartesian3.pack(array[i], result, i * 3); + } + return result; +}; +Cartesian3.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 3); + if (array.length % 3 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 3."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 3); + } else { + result.length = length / 3; + } + for (let i = 0; i < length; i += 3) { + const index = i / 3; + result[index] = Cartesian3.unpack(array, i, result[index]); + } + return result; +}; +Cartesian3.fromArray = Cartesian3.unpack; +Cartesian3.maximumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.max(cartesian.x, cartesian.y, cartesian.z); +}; +Cartesian3.minimumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.min(cartesian.x, cartesian.y, cartesian.z); +}; +Cartesian3.minimumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.min(first.x, second.x); + result.y = Math.min(first.y, second.y); + result.z = Math.min(first.z, second.z); + return result; +}; +Cartesian3.maximumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.max(first.x, second.x); + result.y = Math.max(first.y, second.y); + result.z = Math.max(first.z, second.z); + return result; +}; +Cartesian3.clamp = function(value, min, max, result) { + Check_default.typeOf.object("value", value); + Check_default.typeOf.object("min", min); + Check_default.typeOf.object("max", max); + Check_default.typeOf.object("result", result); + const x = Math_default.clamp(value.x, min.x, max.x); + const y = Math_default.clamp(value.y, min.y, max.y); + const z = Math_default.clamp(value.z, min.z, max.z); + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Cartesian3.magnitudeSquared = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; +}; +Cartesian3.magnitude = function(cartesian) { + return Math.sqrt(Cartesian3.magnitudeSquared(cartesian)); +}; +var distanceScratch = new Cartesian3(); +Cartesian3.distance = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian3.subtract(left, right, distanceScratch); + return Cartesian3.magnitude(distanceScratch); +}; +Cartesian3.distanceSquared = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian3.subtract(left, right, distanceScratch); + return Cartesian3.magnitudeSquared(distanceScratch); +}; +Cartesian3.normalize = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const magnitude = Cartesian3.magnitude(cartesian); + result.x = cartesian.x / magnitude; + result.y = cartesian.y / magnitude; + result.z = cartesian.z / magnitude; + if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z)) { + throw new DeveloperError_default("normalized result is not a number"); + } + return result; +}; +Cartesian3.dot = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.x * right.x + left.y * right.y + left.z * right.z; +}; +Cartesian3.multiplyComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x * right.x; + result.y = left.y * right.y; + result.z = left.z * right.z; + return result; +}; +Cartesian3.divideComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + return result; +}; +Cartesian3.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x + right.x; + result.y = left.y + right.y; + result.z = left.z + right.z; + return result; +}; +Cartesian3.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x - right.x; + result.y = left.y - right.y; + result.z = left.z - right.z; + return result; +}; +Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x * scalar; + result.y = cartesian.y * scalar; + result.z = cartesian.z * scalar; + return result; +}; +Cartesian3.divideByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x / scalar; + result.y = cartesian.y / scalar; + result.z = cartesian.z / scalar; + return result; +}; +Cartesian3.negate = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = -cartesian.x; + result.y = -cartesian.y; + result.z = -cartesian.z; + return result; +}; +Cartesian3.abs = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = Math.abs(cartesian.x); + result.y = Math.abs(cartesian.y); + result.z = Math.abs(cartesian.z); + return result; +}; +var lerpScratch = new Cartesian3(); +Cartesian3.lerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + Cartesian3.multiplyByScalar(end, t, lerpScratch); + result = Cartesian3.multiplyByScalar(start, 1 - t, result); + return Cartesian3.add(lerpScratch, result, result); +}; +var angleBetweenScratch = new Cartesian3(); +var angleBetweenScratch2 = new Cartesian3(); +Cartesian3.angleBetween = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian3.normalize(left, angleBetweenScratch); + Cartesian3.normalize(right, angleBetweenScratch2); + const cosine = Cartesian3.dot(angleBetweenScratch, angleBetweenScratch2); + const sine = Cartesian3.magnitude( + Cartesian3.cross( + angleBetweenScratch, + angleBetweenScratch2, + angleBetweenScratch + ) + ); + return Math.atan2(sine, cosine); +}; +var mostOrthogonalAxisScratch = new Cartesian3(); +Cartesian3.mostOrthogonalAxis = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); + Cartesian3.abs(f, f); + if (f.x <= f.y) { + if (f.x <= f.z) { + result = Cartesian3.clone(Cartesian3.UNIT_X, result); + } else { + result = Cartesian3.clone(Cartesian3.UNIT_Z, result); + } + } else if (f.y <= f.z) { + result = Cartesian3.clone(Cartesian3.UNIT_Y, result); + } else { + result = Cartesian3.clone(Cartesian3.UNIT_Z, result); + } + return result; +}; +Cartesian3.projectVector = function(a, b, result) { + Check_default.defined("a", a); + Check_default.defined("b", b); + Check_default.defined("result", result); + const scalar = Cartesian3.dot(a, b) / Cartesian3.dot(b, b); + return Cartesian3.multiplyByScalar(b, scalar, result); +}; +Cartesian3.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.x === right.x && left.y === right.y && left.z === right.z; +}; +Cartesian3.equalsArray = function(cartesian, array, offset) { + return cartesian.x === array[offset] && cartesian.y === array[offset + 1] && cartesian.z === array[offset + 2]; +}; +Cartesian3.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) { + return left === right || defined_default(left) && defined_default(right) && Math_default.equalsEpsilon( + left.x, + right.x, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.y, + right.y, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.z, + right.z, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian3.cross = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const leftX = left.x; + const leftY = left.y; + const leftZ = left.z; + const rightX = right.x; + const rightY = right.y; + const rightZ = right.z; + const x = leftY * rightZ - leftZ * rightY; + const y = leftZ * rightX - leftX * rightZ; + const z = leftX * rightY - leftY * rightX; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Cartesian3.midpoint = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = (left.x + right.x) * 0.5; + result.y = (left.y + right.y) * 0.5; + result.z = (left.z + right.z) * 0.5; + return result; +}; +Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { + Check_default.typeOf.number("longitude", longitude); + Check_default.typeOf.number("latitude", latitude); + longitude = Math_default.toRadians(longitude); + latitude = Math_default.toRadians(latitude); + return Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result); +}; +var scratchN = new Cartesian3(); +var scratchK = new Cartesian3(); +Cartesian3._ellipsoidRadiiSquared = new Cartesian3( + 6378137 * 6378137, + 6378137 * 6378137, + 6356752314245179e-9 * 6356752314245179e-9 +); +Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { + Check_default.typeOf.number("longitude", longitude); + Check_default.typeOf.number("latitude", latitude); + height = defaultValue_default(height, 0); + const radiiSquared = !defined_default(ellipsoid) ? Cartesian3._ellipsoidRadiiSquared : ellipsoid.radiiSquared; + const cosLatitude = Math.cos(latitude); + scratchN.x = cosLatitude * Math.cos(longitude); + scratchN.y = cosLatitude * Math.sin(longitude); + scratchN.z = Math.sin(latitude); + scratchN = Cartesian3.normalize(scratchN, scratchN); + Cartesian3.multiplyComponents(radiiSquared, scratchN, scratchK); + const gamma = Math.sqrt(Cartesian3.dot(scratchN, scratchK)); + scratchK = Cartesian3.divideByScalar(scratchK, gamma, scratchK); + scratchN = Cartesian3.multiplyByScalar(scratchN, height, scratchN); + if (!defined_default(result)) { + result = new Cartesian3(); + } + return Cartesian3.add(scratchK, scratchN, result); +}; +Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { + Check_default.defined("coordinates", coordinates); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError_default( + "the number of coordinates must be a multiple of 2 and at least 2" + ); + } + const length = coordinates.length; + if (!defined_default(result)) { + result = new Array(length / 2); + } else { + result.length = length / 2; + } + for (let i = 0; i < length; i += 2) { + const longitude = coordinates[i]; + const latitude = coordinates[i + 1]; + const index = i / 2; + result[index] = Cartesian3.fromDegrees( + longitude, + latitude, + 0, + ellipsoid, + result[index] + ); + } + return result; +}; +Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { + Check_default.defined("coordinates", coordinates); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError_default( + "the number of coordinates must be a multiple of 2 and at least 2" + ); + } + const length = coordinates.length; + if (!defined_default(result)) { + result = new Array(length / 2); + } else { + result.length = length / 2; + } + for (let i = 0; i < length; i += 2) { + const longitude = coordinates[i]; + const latitude = coordinates[i + 1]; + const index = i / 2; + result[index] = Cartesian3.fromRadians( + longitude, + latitude, + 0, + ellipsoid, + result[index] + ); + } + return result; +}; +Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { + Check_default.defined("coordinates", coordinates); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError_default( + "the number of coordinates must be a multiple of 3 and at least 3" + ); + } + const length = coordinates.length; + if (!defined_default(result)) { + result = new Array(length / 3); + } else { + result.length = length / 3; + } + for (let i = 0; i < length; i += 3) { + const longitude = coordinates[i]; + const latitude = coordinates[i + 1]; + const height = coordinates[i + 2]; + const index = i / 3; + result[index] = Cartesian3.fromDegrees( + longitude, + latitude, + height, + ellipsoid, + result[index] + ); + } + return result; +}; +Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) { + Check_default.defined("coordinates", coordinates); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError_default( + "the number of coordinates must be a multiple of 3 and at least 3" + ); + } + const length = coordinates.length; + if (!defined_default(result)) { + result = new Array(length / 3); + } else { + result.length = length / 3; + } + for (let i = 0; i < length; i += 3) { + const longitude = coordinates[i]; + const latitude = coordinates[i + 1]; + const height = coordinates[i + 2]; + const index = i / 3; + result[index] = Cartesian3.fromRadians( + longitude, + latitude, + height, + ellipsoid, + result[index] + ); + } + return result; +}; +Cartesian3.ZERO = Object.freeze(new Cartesian3(0, 0, 0)); +Cartesian3.ONE = Object.freeze(new Cartesian3(1, 1, 1)); +Cartesian3.UNIT_X = Object.freeze(new Cartesian3(1, 0, 0)); +Cartesian3.UNIT_Y = Object.freeze(new Cartesian3(0, 1, 0)); +Cartesian3.UNIT_Z = Object.freeze(new Cartesian3(0, 0, 1)); +Cartesian3.prototype.clone = function(result) { + return Cartesian3.clone(this, result); +}; +Cartesian3.prototype.equals = function(right) { + return Cartesian3.equals(this, right); +}; +Cartesian3.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) { + return Cartesian3.equalsEpsilon( + this, + right, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian3.prototype.toString = function() { + return `(${this.x}, ${this.y}, ${this.z})`; +}; +var Cartesian3_default = Cartesian3; + +// packages/engine/Source/Core/scaleToGeodeticSurface.js +var scaleToGeodeticSurfaceIntersection = new Cartesian3_default(); +var scaleToGeodeticSurfaceGradient = new Cartesian3_default(); +function scaleToGeodeticSurface(cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared, result) { + if (!defined_default(cartesian)) { + throw new DeveloperError_default("cartesian is required."); + } + if (!defined_default(oneOverRadii)) { + throw new DeveloperError_default("oneOverRadii is required."); + } + if (!defined_default(oneOverRadiiSquared)) { + throw new DeveloperError_default("oneOverRadiiSquared is required."); + } + if (!defined_default(centerToleranceSquared)) { + throw new DeveloperError_default("centerToleranceSquared is required."); + } + const positionX = cartesian.x; + const positionY = cartesian.y; + const positionZ = cartesian.z; + const oneOverRadiiX = oneOverRadii.x; + const oneOverRadiiY = oneOverRadii.y; + const oneOverRadiiZ = oneOverRadii.z; + const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX; + const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY; + const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ; + const squaredNorm = x2 + y2 + z2; + const ratio = Math.sqrt(1 / squaredNorm); + const intersection = Cartesian3_default.multiplyByScalar( + cartesian, + ratio, + scaleToGeodeticSurfaceIntersection + ); + if (squaredNorm < centerToleranceSquared) { + return !isFinite(ratio) ? void 0 : Cartesian3_default.clone(intersection, result); + } + const oneOverRadiiSquaredX = oneOverRadiiSquared.x; + const oneOverRadiiSquaredY = oneOverRadiiSquared.y; + const oneOverRadiiSquaredZ = oneOverRadiiSquared.z; + const gradient = scaleToGeodeticSurfaceGradient; + gradient.x = intersection.x * oneOverRadiiSquaredX * 2; + gradient.y = intersection.y * oneOverRadiiSquaredY * 2; + gradient.z = intersection.z * oneOverRadiiSquaredZ * 2; + let lambda = (1 - ratio) * Cartesian3_default.magnitude(cartesian) / (0.5 * Cartesian3_default.magnitude(gradient)); + let correction = 0; + let func; + let denominator; + let xMultiplier; + let yMultiplier; + let zMultiplier; + let xMultiplier2; + let yMultiplier2; + let zMultiplier2; + let xMultiplier3; + let yMultiplier3; + let zMultiplier3; + do { + lambda -= correction; + xMultiplier = 1 / (1 + lambda * oneOverRadiiSquaredX); + yMultiplier = 1 / (1 + lambda * oneOverRadiiSquaredY); + zMultiplier = 1 / (1 + lambda * oneOverRadiiSquaredZ); + xMultiplier2 = xMultiplier * xMultiplier; + yMultiplier2 = yMultiplier * yMultiplier; + zMultiplier2 = zMultiplier * zMultiplier; + xMultiplier3 = xMultiplier2 * xMultiplier; + yMultiplier3 = yMultiplier2 * yMultiplier; + zMultiplier3 = zMultiplier2 * zMultiplier; + func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1; + denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ; + const derivative = -2 * denominator; + correction = func / derivative; + } while (Math.abs(func) > Math_default.EPSILON12); + if (!defined_default(result)) { + return new Cartesian3_default( + positionX * xMultiplier, + positionY * yMultiplier, + positionZ * zMultiplier + ); + } + result.x = positionX * xMultiplier; + result.y = positionY * yMultiplier; + result.z = positionZ * zMultiplier; + return result; +} +var scaleToGeodeticSurface_default = scaleToGeodeticSurface; + +// packages/engine/Source/Core/Cartographic.js +function Cartographic(longitude, latitude, height) { + this.longitude = defaultValue_default(longitude, 0); + this.latitude = defaultValue_default(latitude, 0); + this.height = defaultValue_default(height, 0); +} +Cartographic.fromRadians = function(longitude, latitude, height, result) { + Check_default.typeOf.number("longitude", longitude); + Check_default.typeOf.number("latitude", latitude); + height = defaultValue_default(height, 0); + if (!defined_default(result)) { + return new Cartographic(longitude, latitude, height); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = height; + return result; +}; +Cartographic.fromDegrees = function(longitude, latitude, height, result) { + Check_default.typeOf.number("longitude", longitude); + Check_default.typeOf.number("latitude", latitude); + longitude = Math_default.toRadians(longitude); + latitude = Math_default.toRadians(latitude); + return Cartographic.fromRadians(longitude, latitude, height, result); +}; +var cartesianToCartographicN = new Cartesian3_default(); +var cartesianToCartographicP = new Cartesian3_default(); +var cartesianToCartographicH = new Cartesian3_default(); +Cartographic._ellipsoidOneOverRadii = new Cartesian3_default( + 1 / 6378137, + 1 / 6378137, + 1 / 6356752314245179e-9 +); +Cartographic._ellipsoidOneOverRadiiSquared = new Cartesian3_default( + 1 / (6378137 * 6378137), + 1 / (6378137 * 6378137), + 1 / (6356752314245179e-9 * 6356752314245179e-9) +); +Cartographic._ellipsoidCenterToleranceSquared = Math_default.EPSILON1; +Cartographic.fromCartesian = function(cartesian, ellipsoid, result) { + const oneOverRadii = defined_default(ellipsoid) ? ellipsoid.oneOverRadii : Cartographic._ellipsoidOneOverRadii; + const oneOverRadiiSquared = defined_default(ellipsoid) ? ellipsoid.oneOverRadiiSquared : Cartographic._ellipsoidOneOverRadiiSquared; + const centerToleranceSquared = defined_default(ellipsoid) ? ellipsoid._centerToleranceSquared : Cartographic._ellipsoidCenterToleranceSquared; + const p = scaleToGeodeticSurface_default( + cartesian, + oneOverRadii, + oneOverRadiiSquared, + centerToleranceSquared, + cartesianToCartographicP + ); + if (!defined_default(p)) { + return void 0; + } + let n = Cartesian3_default.multiplyComponents( + p, + oneOverRadiiSquared, + cartesianToCartographicN + ); + n = Cartesian3_default.normalize(n, n); + const h = Cartesian3_default.subtract(cartesian, p, cartesianToCartographicH); + const longitude = Math.atan2(n.y, n.x); + const latitude = Math.asin(n.z); + const height = Math_default.sign(Cartesian3_default.dot(h, cartesian)) * Cartesian3_default.magnitude(h); + if (!defined_default(result)) { + return new Cartographic(longitude, latitude, height); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = height; + return result; +}; +Cartographic.toCartesian = function(cartographic, ellipsoid, result) { + Check_default.defined("cartographic", cartographic); + return Cartesian3_default.fromRadians( + cartographic.longitude, + cartographic.latitude, + cartographic.height, + ellipsoid, + result + ); +}; +Cartographic.clone = function(cartographic, result) { + if (!defined_default(cartographic)) { + return void 0; + } + if (!defined_default(result)) { + return new Cartographic( + cartographic.longitude, + cartographic.latitude, + cartographic.height + ); + } + result.longitude = cartographic.longitude; + result.latitude = cartographic.latitude; + result.height = cartographic.height; + return result; +}; +Cartographic.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.longitude === right.longitude && left.latitude === right.latitude && left.height === right.height; +}; +Cartographic.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left.longitude - right.longitude) <= epsilon && Math.abs(left.latitude - right.latitude) <= epsilon && Math.abs(left.height - right.height) <= epsilon; +}; +Cartographic.ZERO = Object.freeze(new Cartographic(0, 0, 0)); +Cartographic.prototype.clone = function(result) { + return Cartographic.clone(this, result); +}; +Cartographic.prototype.equals = function(right) { + return Cartographic.equals(this, right); +}; +Cartographic.prototype.equalsEpsilon = function(right, epsilon) { + return Cartographic.equalsEpsilon(this, right, epsilon); +}; +Cartographic.prototype.toString = function() { + return `(${this.longitude}, ${this.latitude}, ${this.height})`; +}; +var Cartographic_default = Cartographic; + +// packages/engine/Source/Core/Cartesian2.js +function Cartesian2(x, y) { + this.x = defaultValue_default(x, 0); + this.y = defaultValue_default(y, 0); +} +Cartesian2.fromElements = function(x, y, result) { + if (!defined_default(result)) { + return new Cartesian2(x, y); + } + result.x = x; + result.y = y; + return result; +}; +Cartesian2.clone = function(cartesian, result) { + if (!defined_default(cartesian)) { + return void 0; + } + if (!defined_default(result)) { + return new Cartesian2(cartesian.x, cartesian.y); + } + result.x = cartesian.x; + result.y = cartesian.y; + return result; +}; +Cartesian2.fromCartesian3 = Cartesian2.clone; +Cartesian2.fromCartesian4 = Cartesian2.clone; +Cartesian2.packedLength = 2; +Cartesian2.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.x; + array[startingIndex] = value.y; + return array; +}; +Cartesian2.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Cartesian2(); + } + result.x = array[startingIndex++]; + result.y = array[startingIndex]; + return result; +}; +Cartesian2.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 2; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 2 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Cartesian2.pack(array[i], result, i * 2); + } + return result; +}; +Cartesian2.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 2); + if (array.length % 2 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 2."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 2); + } else { + result.length = length / 2; + } + for (let i = 0; i < length; i += 2) { + const index = i / 2; + result[index] = Cartesian2.unpack(array, i, result[index]); + } + return result; +}; +Cartesian2.fromArray = Cartesian2.unpack; +Cartesian2.maximumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.max(cartesian.x, cartesian.y); +}; +Cartesian2.minimumComponent = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return Math.min(cartesian.x, cartesian.y); +}; +Cartesian2.minimumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.min(first.x, second.x); + result.y = Math.min(first.y, second.y); + return result; +}; +Cartesian2.maximumByComponent = function(first, second, result) { + Check_default.typeOf.object("first", first); + Check_default.typeOf.object("second", second); + Check_default.typeOf.object("result", result); + result.x = Math.max(first.x, second.x); + result.y = Math.max(first.y, second.y); + return result; +}; +Cartesian2.clamp = function(value, min, max, result) { + Check_default.typeOf.object("value", value); + Check_default.typeOf.object("min", min); + Check_default.typeOf.object("max", max); + Check_default.typeOf.object("result", result); + const x = Math_default.clamp(value.x, min.x, max.x); + const y = Math_default.clamp(value.y, min.y, max.y); + result.x = x; + result.y = y; + return result; +}; +Cartesian2.magnitudeSquared = function(cartesian) { + Check_default.typeOf.object("cartesian", cartesian); + return cartesian.x * cartesian.x + cartesian.y * cartesian.y; +}; +Cartesian2.magnitude = function(cartesian) { + return Math.sqrt(Cartesian2.magnitudeSquared(cartesian)); +}; +var distanceScratch2 = new Cartesian2(); +Cartesian2.distance = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian2.subtract(left, right, distanceScratch2); + return Cartesian2.magnitude(distanceScratch2); +}; +Cartesian2.distanceSquared = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian2.subtract(left, right, distanceScratch2); + return Cartesian2.magnitudeSquared(distanceScratch2); +}; +Cartesian2.normalize = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const magnitude = Cartesian2.magnitude(cartesian); + result.x = cartesian.x / magnitude; + result.y = cartesian.y / magnitude; + if (isNaN(result.x) || isNaN(result.y)) { + throw new DeveloperError_default("normalized result is not a number"); + } + return result; +}; +Cartesian2.dot = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.x * right.x + left.y * right.y; +}; +Cartesian2.cross = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + return left.x * right.y - left.y * right.x; +}; +Cartesian2.multiplyComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x * right.x; + result.y = left.y * right.y; + return result; +}; +Cartesian2.divideComponents = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x / right.x; + result.y = left.y / right.y; + return result; +}; +Cartesian2.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x + right.x; + result.y = left.y + right.y; + return result; +}; +Cartesian2.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.x = left.x - right.x; + result.y = left.y - right.y; + return result; +}; +Cartesian2.multiplyByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x * scalar; + result.y = cartesian.y * scalar; + return result; +}; +Cartesian2.divideByScalar = function(cartesian, scalar, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.x = cartesian.x / scalar; + result.y = cartesian.y / scalar; + return result; +}; +Cartesian2.negate = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = -cartesian.x; + result.y = -cartesian.y; + return result; +}; +Cartesian2.abs = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result.x = Math.abs(cartesian.x); + result.y = Math.abs(cartesian.y); + return result; +}; +var lerpScratch2 = new Cartesian2(); +Cartesian2.lerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + Cartesian2.multiplyByScalar(end, t, lerpScratch2); + result = Cartesian2.multiplyByScalar(start, 1 - t, result); + return Cartesian2.add(lerpScratch2, result, result); +}; +var angleBetweenScratch3 = new Cartesian2(); +var angleBetweenScratch22 = new Cartesian2(); +Cartesian2.angleBetween = function(left, right) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Cartesian2.normalize(left, angleBetweenScratch3); + Cartesian2.normalize(right, angleBetweenScratch22); + return Math_default.acosClamped( + Cartesian2.dot(angleBetweenScratch3, angleBetweenScratch22) + ); +}; +var mostOrthogonalAxisScratch2 = new Cartesian2(); +Cartesian2.mostOrthogonalAxis = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch2); + Cartesian2.abs(f, f); + if (f.x <= f.y) { + result = Cartesian2.clone(Cartesian2.UNIT_X, result); + } else { + result = Cartesian2.clone(Cartesian2.UNIT_Y, result); + } + return result; +}; +Cartesian2.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left.x === right.x && left.y === right.y; +}; +Cartesian2.equalsArray = function(cartesian, array, offset) { + return cartesian.x === array[offset] && cartesian.y === array[offset + 1]; +}; +Cartesian2.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) { + return left === right || defined_default(left) && defined_default(right) && Math_default.equalsEpsilon( + left.x, + right.x, + relativeEpsilon, + absoluteEpsilon + ) && Math_default.equalsEpsilon( + left.y, + right.y, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian2.ZERO = Object.freeze(new Cartesian2(0, 0)); +Cartesian2.ONE = Object.freeze(new Cartesian2(1, 1)); +Cartesian2.UNIT_X = Object.freeze(new Cartesian2(1, 0)); +Cartesian2.UNIT_Y = Object.freeze(new Cartesian2(0, 1)); +Cartesian2.prototype.clone = function(result) { + return Cartesian2.clone(this, result); +}; +Cartesian2.prototype.equals = function(right) { + return Cartesian2.equals(this, right); +}; +Cartesian2.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) { + return Cartesian2.equalsEpsilon( + this, + right, + relativeEpsilon, + absoluteEpsilon + ); +}; +Cartesian2.prototype.toString = function() { + return `(${this.x}, ${this.y})`; +}; +var Cartesian2_default = Cartesian2; + +// packages/engine/Source/Core/Ellipsoid.js +function initialize(ellipsoid, x, y, z) { + x = defaultValue_default(x, 0); + y = defaultValue_default(y, 0); + z = defaultValue_default(z, 0); + Check_default.typeOf.number.greaterThanOrEquals("x", x, 0); + Check_default.typeOf.number.greaterThanOrEquals("y", y, 0); + Check_default.typeOf.number.greaterThanOrEquals("z", z, 0); + ellipsoid._radii = new Cartesian3_default(x, y, z); + ellipsoid._radiiSquared = new Cartesian3_default(x * x, y * y, z * z); + ellipsoid._radiiToTheFourth = new Cartesian3_default( + x * x * x * x, + y * y * y * y, + z * z * z * z + ); + ellipsoid._oneOverRadii = new Cartesian3_default( + x === 0 ? 0 : 1 / x, + y === 0 ? 0 : 1 / y, + z === 0 ? 0 : 1 / z + ); + ellipsoid._oneOverRadiiSquared = new Cartesian3_default( + x === 0 ? 0 : 1 / (x * x), + y === 0 ? 0 : 1 / (y * y), + z === 0 ? 0 : 1 / (z * z) + ); + ellipsoid._minimumRadius = Math.min(x, y, z); + ellipsoid._maximumRadius = Math.max(x, y, z); + ellipsoid._centerToleranceSquared = Math_default.EPSILON1; + if (ellipsoid._radiiSquared.z !== 0) { + ellipsoid._squaredXOverSquaredZ = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; + } +} +function Ellipsoid(x, y, z) { + this._radii = void 0; + this._radiiSquared = void 0; + this._radiiToTheFourth = void 0; + this._oneOverRadii = void 0; + this._oneOverRadiiSquared = void 0; + this._minimumRadius = void 0; + this._maximumRadius = void 0; + this._centerToleranceSquared = void 0; + this._squaredXOverSquaredZ = void 0; + initialize(this, x, y, z); +} +Object.defineProperties(Ellipsoid.prototype, { + /** + * Gets the radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radii: { + get: function() { + return this._radii; + } + }, + /** + * Gets the squared radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radiiSquared: { + get: function() { + return this._radiiSquared; + } + }, + /** + * Gets the radii of the ellipsoid raise to the fourth power. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + radiiToTheFourth: { + get: function() { + return this._radiiToTheFourth; + } + }, + /** + * Gets one over the radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + oneOverRadii: { + get: function() { + return this._oneOverRadii; + } + }, + /** + * Gets one over the squared radii of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {Cartesian3} + * @readonly + */ + oneOverRadiiSquared: { + get: function() { + return this._oneOverRadiiSquared; + } + }, + /** + * Gets the minimum radius of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {number} + * @readonly + */ + minimumRadius: { + get: function() { + return this._minimumRadius; + } + }, + /** + * Gets the maximum radius of the ellipsoid. + * @memberof Ellipsoid.prototype + * @type {number} + * @readonly + */ + maximumRadius: { + get: function() { + return this._maximumRadius; + } + } +}); +Ellipsoid.clone = function(ellipsoid, result) { + if (!defined_default(ellipsoid)) { + return void 0; + } + const radii = ellipsoid._radii; + if (!defined_default(result)) { + return new Ellipsoid(radii.x, radii.y, radii.z); + } + Cartesian3_default.clone(radii, result._radii); + Cartesian3_default.clone(ellipsoid._radiiSquared, result._radiiSquared); + Cartesian3_default.clone(ellipsoid._radiiToTheFourth, result._radiiToTheFourth); + Cartesian3_default.clone(ellipsoid._oneOverRadii, result._oneOverRadii); + Cartesian3_default.clone(ellipsoid._oneOverRadiiSquared, result._oneOverRadiiSquared); + result._minimumRadius = ellipsoid._minimumRadius; + result._maximumRadius = ellipsoid._maximumRadius; + result._centerToleranceSquared = ellipsoid._centerToleranceSquared; + return result; +}; +Ellipsoid.fromCartesian3 = function(cartesian, result) { + if (!defined_default(result)) { + result = new Ellipsoid(); + } + if (!defined_default(cartesian)) { + return result; + } + initialize(result, cartesian.x, cartesian.y, cartesian.z); + return result; +}; +Ellipsoid.WGS84 = Object.freeze( + new Ellipsoid(6378137, 6378137, 6356752314245179e-9) +); +Ellipsoid.UNIT_SPHERE = Object.freeze(new Ellipsoid(1, 1, 1)); +Ellipsoid.MOON = Object.freeze( + new Ellipsoid( + Math_default.LUNAR_RADIUS, + Math_default.LUNAR_RADIUS, + Math_default.LUNAR_RADIUS + ) +); +Ellipsoid._default = Ellipsoid.WGS84; +Object.defineProperties(Ellipsoid, { + /** + * The default ellipsoid used when not otherwise specified. + * @memberof Ellipsoid + * @type {Ellipsoid} + * @example + * Cesium.Ellipsoid.default = Cesium.Ellipsoid.MOON; + * + * // Apollo 11 landing site + * const position = Cesium.Cartesian3.fromRadians( + * 0.67416, + * 23.47315, + * ); + */ + default: { + get: function() { + return Ellipsoid._default; + }, + set: function(value) { + Check_default.typeOf.object("value", value); + Ellipsoid._default = value; + Cartesian3_default._ellipsoidRadiiSquared = value.radiiSquared; + Cartographic_default._ellipsoidOneOverRadii = value.oneOverRadii; + Cartographic_default._ellipsoidOneOverRadiiSquared = value.oneOverRadiiSquared; + Cartographic_default._ellipsoidCenterToleranceSquared = value._centerToleranceSquared; + } + } +}); +Ellipsoid.prototype.clone = function(result) { + return Ellipsoid.clone(this, result); +}; +Ellipsoid.packedLength = Cartesian3_default.packedLength; +Ellipsoid.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._radii, array, startingIndex); + return array; +}; +Ellipsoid.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const radii = Cartesian3_default.unpack(array, startingIndex); + return Ellipsoid.fromCartesian3(radii, result); +}; +Ellipsoid.prototype.geocentricSurfaceNormal = Cartesian3_default.normalize; +Ellipsoid.prototype.geodeticSurfaceNormalCartographic = function(cartographic, result) { + Check_default.typeOf.object("cartographic", cartographic); + const longitude = cartographic.longitude; + const latitude = cartographic.latitude; + const cosLatitude = Math.cos(latitude); + const x = cosLatitude * Math.cos(longitude); + const y = cosLatitude * Math.sin(longitude); + const z = Math.sin(latitude); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + result.x = x; + result.y = y; + result.z = z; + return Cartesian3_default.normalize(result, result); +}; +Ellipsoid.prototype.geodeticSurfaceNormal = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + if (isNaN(cartesian.x) || isNaN(cartesian.y) || isNaN(cartesian.z)) { + throw new DeveloperError_default("cartesian has a NaN component"); + } + if (Cartesian3_default.equalsEpsilon(cartesian, Cartesian3_default.ZERO, Math_default.EPSILON14)) { + return void 0; + } + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + result = Cartesian3_default.multiplyComponents( + cartesian, + this._oneOverRadiiSquared, + result + ); + return Cartesian3_default.normalize(result, result); +}; +var cartographicToCartesianNormal = new Cartesian3_default(); +var cartographicToCartesianK = new Cartesian3_default(); +Ellipsoid.prototype.cartographicToCartesian = function(cartographic, result) { + const n = cartographicToCartesianNormal; + const k = cartographicToCartesianK; + this.geodeticSurfaceNormalCartographic(cartographic, n); + Cartesian3_default.multiplyComponents(this._radiiSquared, n, k); + const gamma = Math.sqrt(Cartesian3_default.dot(n, k)); + Cartesian3_default.divideByScalar(k, gamma, k); + Cartesian3_default.multiplyByScalar(n, cartographic.height, n); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + return Cartesian3_default.add(k, n, result); +}; +Ellipsoid.prototype.cartographicArrayToCartesianArray = function(cartographics, result) { + Check_default.defined("cartographics", cartographics); + const length = cartographics.length; + if (!defined_default(result)) { + result = new Array(length); + } else { + result.length = length; + } + for (let i = 0; i < length; i++) { + result[i] = this.cartographicToCartesian(cartographics[i], result[i]); + } + return result; +}; +var cartesianToCartographicN2 = new Cartesian3_default(); +var cartesianToCartographicP2 = new Cartesian3_default(); +var cartesianToCartographicH2 = new Cartesian3_default(); +Ellipsoid.prototype.cartesianToCartographic = function(cartesian, result) { + const p = this.scaleToGeodeticSurface(cartesian, cartesianToCartographicP2); + if (!defined_default(p)) { + return void 0; + } + const n = this.geodeticSurfaceNormal(p, cartesianToCartographicN2); + const h = Cartesian3_default.subtract(cartesian, p, cartesianToCartographicH2); + const longitude = Math.atan2(n.y, n.x); + const latitude = Math.asin(n.z); + const height = Math_default.sign(Cartesian3_default.dot(h, cartesian)) * Cartesian3_default.magnitude(h); + if (!defined_default(result)) { + return new Cartographic_default(longitude, latitude, height); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = height; + return result; +}; +Ellipsoid.prototype.cartesianArrayToCartographicArray = function(cartesians, result) { + Check_default.defined("cartesians", cartesians); + const length = cartesians.length; + if (!defined_default(result)) { + result = new Array(length); + } else { + result.length = length; + } + for (let i = 0; i < length; ++i) { + result[i] = this.cartesianToCartographic(cartesians[i], result[i]); + } + return result; +}; +Ellipsoid.prototype.scaleToGeodeticSurface = function(cartesian, result) { + return scaleToGeodeticSurface_default( + cartesian, + this._oneOverRadii, + this._oneOverRadiiSquared, + this._centerToleranceSquared, + result + ); +}; +Ellipsoid.prototype.scaleToGeocentricSurface = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const positionX = cartesian.x; + const positionY = cartesian.y; + const positionZ = cartesian.z; + const oneOverRadiiSquared = this._oneOverRadiiSquared; + const beta = 1 / Math.sqrt( + positionX * positionX * oneOverRadiiSquared.x + positionY * positionY * oneOverRadiiSquared.y + positionZ * positionZ * oneOverRadiiSquared.z + ); + return Cartesian3_default.multiplyByScalar(cartesian, beta, result); +}; +Ellipsoid.prototype.transformPositionToScaledSpace = function(position, result) { + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + return Cartesian3_default.multiplyComponents(position, this._oneOverRadii, result); +}; +Ellipsoid.prototype.transformPositionFromScaledSpace = function(position, result) { + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + return Cartesian3_default.multiplyComponents(position, this._radii, result); +}; +Ellipsoid.prototype.equals = function(right) { + return this === right || defined_default(right) && Cartesian3_default.equals(this._radii, right._radii); +}; +Ellipsoid.prototype.toString = function() { + return this._radii.toString(); +}; +Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { + Check_default.typeOf.object("position", position); + if (!Math_default.equalsEpsilon( + this._radii.x, + this._radii.y, + Math_default.EPSILON15 + )) { + throw new DeveloperError_default( + "Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)" + ); + } + Check_default.typeOf.number.greaterThan("Ellipsoid.radii.z", this._radii.z, 0); + buffer = defaultValue_default(buffer, 0); + const squaredXOverSquaredZ = this._squaredXOverSquaredZ; + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + result.x = 0; + result.y = 0; + result.z = position.z * (1 - squaredXOverSquaredZ); + if (Math.abs(result.z) >= this._radii.z - buffer) { + return void 0; + } + return result; +}; +var scratchEndpoint = new Cartesian3_default(); +Ellipsoid.prototype.getLocalCurvature = function(surfacePosition, result) { + Check_default.typeOf.object("surfacePosition", surfacePosition); + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + const primeVerticalEndpoint = this.getSurfaceNormalIntersectionWithZAxis( + surfacePosition, + 0, + scratchEndpoint + ); + const primeVerticalRadius = Cartesian3_default.distance( + surfacePosition, + primeVerticalEndpoint + ); + const radiusRatio = this.minimumRadius * primeVerticalRadius / this.maximumRadius ** 2; + const meridionalRadius = primeVerticalRadius * radiusRatio ** 2; + return Cartesian2_default.fromElements( + 1 / primeVerticalRadius, + 1 / meridionalRadius, + result + ); +}; +var abscissas = [ + 0.14887433898163, + 0.43339539412925, + 0.67940956829902, + 0.86506336668898, + 0.97390652851717, + 0 +]; +var weights = [ + 0.29552422471475, + 0.26926671930999, + 0.21908636251598, + 0.14945134915058, + 0.066671344308684, + 0 +]; +function gaussLegendreQuadrature(a, b, func) { + Check_default.typeOf.number("a", a); + Check_default.typeOf.number("b", b); + Check_default.typeOf.func("func", func); + const xMean = 0.5 * (b + a); + const xRange = 0.5 * (b - a); + let sum = 0; + for (let i = 0; i < 5; i++) { + const dx = xRange * abscissas[i]; + sum += weights[i] * (func(xMean + dx) + func(xMean - dx)); + } + sum *= xRange; + return sum; +} +Ellipsoid.prototype.surfaceArea = function(rectangle) { + Check_default.typeOf.object("rectangle", rectangle); + const minLongitude = rectangle.west; + let maxLongitude = rectangle.east; + const minLatitude = rectangle.south; + const maxLatitude = rectangle.north; + while (maxLongitude < minLongitude) { + maxLongitude += Math_default.TWO_PI; + } + const radiiSquared = this._radiiSquared; + const a2 = radiiSquared.x; + const b2 = radiiSquared.y; + const c2 = radiiSquared.z; + const a2b2 = a2 * b2; + return gaussLegendreQuadrature(minLatitude, maxLatitude, function(lat) { + const sinPhi = Math.cos(lat); + const cosPhi = Math.sin(lat); + return Math.cos(lat) * gaussLegendreQuadrature(minLongitude, maxLongitude, function(lon) { + const cosTheta = Math.cos(lon); + const sinTheta = Math.sin(lon); + return Math.sqrt( + a2b2 * cosPhi * cosPhi + c2 * (b2 * cosTheta * cosTheta + a2 * sinTheta * sinTheta) * sinPhi * sinPhi + ); + }); + }); +}; +var Ellipsoid_default = Ellipsoid; + +// packages/engine/Source/Core/Matrix3.js +function Matrix3(column0Row0, column1Row0, column2Row0, column0Row1, column1Row1, column2Row1, column0Row2, column1Row2, column2Row2) { + this[0] = defaultValue_default(column0Row0, 0); + this[1] = defaultValue_default(column0Row1, 0); + this[2] = defaultValue_default(column0Row2, 0); + this[3] = defaultValue_default(column1Row0, 0); + this[4] = defaultValue_default(column1Row1, 0); + this[5] = defaultValue_default(column1Row2, 0); + this[6] = defaultValue_default(column2Row0, 0); + this[7] = defaultValue_default(column2Row1, 0); + this[8] = defaultValue_default(column2Row2, 0); +} +Matrix3.packedLength = 9; +Matrix3.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value[0]; + array[startingIndex++] = value[1]; + array[startingIndex++] = value[2]; + array[startingIndex++] = value[3]; + array[startingIndex++] = value[4]; + array[startingIndex++] = value[5]; + array[startingIndex++] = value[6]; + array[startingIndex++] = value[7]; + array[startingIndex++] = value[8]; + return array; +}; +Matrix3.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Matrix3(); + } + result[0] = array[startingIndex++]; + result[1] = array[startingIndex++]; + result[2] = array[startingIndex++]; + result[3] = array[startingIndex++]; + result[4] = array[startingIndex++]; + result[5] = array[startingIndex++]; + result[6] = array[startingIndex++]; + result[7] = array[startingIndex++]; + result[8] = array[startingIndex++]; + return result; +}; +Matrix3.packArray = function(array, result) { + Check_default.defined("array", array); + const length = array.length; + const resultLength = length * 9; + if (!defined_default(result)) { + result = new Array(resultLength); + } else if (!Array.isArray(result) && result.length !== resultLength) { + throw new DeveloperError_default( + "If result is a typed array, it must have exactly array.length * 9 elements" + ); + } else if (result.length !== resultLength) { + result.length = resultLength; + } + for (let i = 0; i < length; ++i) { + Matrix3.pack(array[i], result, i * 9); + } + return result; +}; +Matrix3.unpackArray = function(array, result) { + Check_default.defined("array", array); + Check_default.typeOf.number.greaterThanOrEquals("array.length", array.length, 9); + if (array.length % 9 !== 0) { + throw new DeveloperError_default("array length must be a multiple of 9."); + } + const length = array.length; + if (!defined_default(result)) { + result = new Array(length / 9); + } else { + result.length = length / 9; + } + for (let i = 0; i < length; i += 9) { + const index = i / 9; + result[index] = Matrix3.unpack(array, i, result[index]); + } + return result; +}; +Matrix3.clone = function(matrix, result) { + if (!defined_default(matrix)) { + return void 0; + } + if (!defined_default(result)) { + return new Matrix3( + matrix[0], + matrix[3], + matrix[6], + matrix[1], + matrix[4], + matrix[7], + matrix[2], + matrix[5], + matrix[8] + ); + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + return result; +}; +Matrix3.fromArray = Matrix3.unpack; +Matrix3.fromColumnMajorArray = function(values, result) { + Check_default.defined("values", values); + return Matrix3.clone(values, result); +}; +Matrix3.fromRowMajorArray = function(values, result) { + Check_default.defined("values", values); + if (!defined_default(result)) { + return new Matrix3( + values[0], + values[1], + values[2], + values[3], + values[4], + values[5], + values[6], + values[7], + values[8] + ); + } + result[0] = values[0]; + result[1] = values[3]; + result[2] = values[6]; + result[3] = values[1]; + result[4] = values[4]; + result[5] = values[7]; + result[6] = values[2]; + result[7] = values[5]; + result[8] = values[8]; + return result; +}; +Matrix3.fromQuaternion = function(quaternion, result) { + Check_default.typeOf.object("quaternion", quaternion); + const x2 = quaternion.x * quaternion.x; + const xy = quaternion.x * quaternion.y; + const xz = quaternion.x * quaternion.z; + const xw = quaternion.x * quaternion.w; + const y2 = quaternion.y * quaternion.y; + const yz = quaternion.y * quaternion.z; + const yw = quaternion.y * quaternion.w; + const z2 = quaternion.z * quaternion.z; + const zw = quaternion.z * quaternion.w; + const w2 = quaternion.w * quaternion.w; + const m00 = x2 - y2 - z2 + w2; + const m01 = 2 * (xy - zw); + const m02 = 2 * (xz + yw); + const m10 = 2 * (xy + zw); + const m11 = -x2 + y2 - z2 + w2; + const m12 = 2 * (yz - xw); + const m20 = 2 * (xz - yw); + const m21 = 2 * (yz + xw); + const m22 = -x2 - y2 + z2 + w2; + if (!defined_default(result)) { + return new Matrix3(m00, m01, m02, m10, m11, m12, m20, m21, m22); + } + result[0] = m00; + result[1] = m10; + result[2] = m20; + result[3] = m01; + result[4] = m11; + result[5] = m21; + result[6] = m02; + result[7] = m12; + result[8] = m22; + return result; +}; +Matrix3.fromHeadingPitchRoll = function(headingPitchRoll, result) { + Check_default.typeOf.object("headingPitchRoll", headingPitchRoll); + const cosTheta = Math.cos(-headingPitchRoll.pitch); + const cosPsi = Math.cos(-headingPitchRoll.heading); + const cosPhi = Math.cos(headingPitchRoll.roll); + const sinTheta = Math.sin(-headingPitchRoll.pitch); + const sinPsi = Math.sin(-headingPitchRoll.heading); + const sinPhi = Math.sin(headingPitchRoll.roll); + const m00 = cosTheta * cosPsi; + const m01 = -cosPhi * sinPsi + sinPhi * sinTheta * cosPsi; + const m02 = sinPhi * sinPsi + cosPhi * sinTheta * cosPsi; + const m10 = cosTheta * sinPsi; + const m11 = cosPhi * cosPsi + sinPhi * sinTheta * sinPsi; + const m12 = -sinPhi * cosPsi + cosPhi * sinTheta * sinPsi; + const m20 = -sinTheta; + const m21 = sinPhi * cosTheta; + const m22 = cosPhi * cosTheta; + if (!defined_default(result)) { + return new Matrix3(m00, m01, m02, m10, m11, m12, m20, m21, m22); + } + result[0] = m00; + result[1] = m10; + result[2] = m20; + result[3] = m01; + result[4] = m11; + result[5] = m21; + result[6] = m02; + result[7] = m12; + result[8] = m22; + return result; +}; +Matrix3.fromScale = function(scale, result) { + Check_default.typeOf.object("scale", scale); + if (!defined_default(result)) { + return new Matrix3(scale.x, 0, 0, 0, scale.y, 0, 0, 0, scale.z); + } + result[0] = scale.x; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = scale.y; + result[5] = 0; + result[6] = 0; + result[7] = 0; + result[8] = scale.z; + return result; +}; +Matrix3.fromUniformScale = function(scale, result) { + Check_default.typeOf.number("scale", scale); + if (!defined_default(result)) { + return new Matrix3(scale, 0, 0, 0, scale, 0, 0, 0, scale); + } + result[0] = scale; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = scale; + result[5] = 0; + result[6] = 0; + result[7] = 0; + result[8] = scale; + return result; +}; +Matrix3.fromCrossProduct = function(vector, result) { + Check_default.typeOf.object("vector", vector); + if (!defined_default(result)) { + return new Matrix3( + 0, + -vector.z, + vector.y, + vector.z, + 0, + -vector.x, + -vector.y, + vector.x, + 0 + ); + } + result[0] = 0; + result[1] = vector.z; + result[2] = -vector.y; + result[3] = -vector.z; + result[4] = 0; + result[5] = vector.x; + result[6] = vector.y; + result[7] = -vector.x; + result[8] = 0; + return result; +}; +Matrix3.fromRotationX = function(angle, result) { + Check_default.typeOf.number("angle", angle); + const cosAngle = Math.cos(angle); + const sinAngle = Math.sin(angle); + if (!defined_default(result)) { + return new Matrix3( + 1, + 0, + 0, + 0, + cosAngle, + -sinAngle, + 0, + sinAngle, + cosAngle + ); + } + result[0] = 1; + result[1] = 0; + result[2] = 0; + result[3] = 0; + result[4] = cosAngle; + result[5] = sinAngle; + result[6] = 0; + result[7] = -sinAngle; + result[8] = cosAngle; + return result; +}; +Matrix3.fromRotationY = function(angle, result) { + Check_default.typeOf.number("angle", angle); + const cosAngle = Math.cos(angle); + const sinAngle = Math.sin(angle); + if (!defined_default(result)) { + return new Matrix3( + cosAngle, + 0, + sinAngle, + 0, + 1, + 0, + -sinAngle, + 0, + cosAngle + ); + } + result[0] = cosAngle; + result[1] = 0; + result[2] = -sinAngle; + result[3] = 0; + result[4] = 1; + result[5] = 0; + result[6] = sinAngle; + result[7] = 0; + result[8] = cosAngle; + return result; +}; +Matrix3.fromRotationZ = function(angle, result) { + Check_default.typeOf.number("angle", angle); + const cosAngle = Math.cos(angle); + const sinAngle = Math.sin(angle); + if (!defined_default(result)) { + return new Matrix3( + cosAngle, + -sinAngle, + 0, + sinAngle, + cosAngle, + 0, + 0, + 0, + 1 + ); + } + result[0] = cosAngle; + result[1] = sinAngle; + result[2] = 0; + result[3] = -sinAngle; + result[4] = cosAngle; + result[5] = 0; + result[6] = 0; + result[7] = 0; + result[8] = 1; + return result; +}; +Matrix3.toArray = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + if (!defined_default(result)) { + return [ + matrix[0], + matrix[1], + matrix[2], + matrix[3], + matrix[4], + matrix[5], + matrix[6], + matrix[7], + matrix[8] + ]; + } + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; + return result; +}; +Matrix3.getElementIndex = function(column, row) { + Check_default.typeOf.number.greaterThanOrEquals("row", row, 0); + Check_default.typeOf.number.lessThanOrEquals("row", row, 2); + Check_default.typeOf.number.greaterThanOrEquals("column", column, 0); + Check_default.typeOf.number.lessThanOrEquals("column", column, 2); + return column * 3 + row; +}; +Matrix3.getColumn = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 2); + Check_default.typeOf.object("result", result); + const startIndex = index * 3; + const x = matrix[startIndex]; + const y = matrix[startIndex + 1]; + const z = matrix[startIndex + 2]; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Matrix3.setColumn = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 2); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix3.clone(matrix, result); + const startIndex = index * 3; + result[startIndex] = cartesian.x; + result[startIndex + 1] = cartesian.y; + result[startIndex + 2] = cartesian.z; + return result; +}; +Matrix3.getRow = function(matrix, index, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 2); + Check_default.typeOf.object("result", result); + const x = matrix[index]; + const y = matrix[index + 3]; + const z = matrix[index + 6]; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Matrix3.setRow = function(matrix, index, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + Check_default.typeOf.number.lessThanOrEquals("index", index, 2); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + result = Matrix3.clone(matrix, result); + result[index] = cartesian.x; + result[index + 3] = cartesian.y; + result[index + 6] = cartesian.z; + return result; +}; +var scaleScratch1 = new Cartesian3_default(); +Matrix3.setScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix3.getScale(matrix, scaleScratch1); + const scaleRatioX = scale.x / existingScale.x; + const scaleRatioY = scale.y / existingScale.y; + const scaleRatioZ = scale.z / existingScale.z; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioX; + result[3] = matrix[3] * scaleRatioY; + result[4] = matrix[4] * scaleRatioY; + result[5] = matrix[5] * scaleRatioY; + result[6] = matrix[6] * scaleRatioZ; + result[7] = matrix[7] * scaleRatioZ; + result[8] = matrix[8] * scaleRatioZ; + return result; +}; +var scaleScratch2 = new Cartesian3_default(); +Matrix3.setUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + const existingScale = Matrix3.getScale(matrix, scaleScratch2); + const scaleRatioX = scale / existingScale.x; + const scaleRatioY = scale / existingScale.y; + const scaleRatioZ = scale / existingScale.z; + result[0] = matrix[0] * scaleRatioX; + result[1] = matrix[1] * scaleRatioX; + result[2] = matrix[2] * scaleRatioX; + result[3] = matrix[3] * scaleRatioY; + result[4] = matrix[4] * scaleRatioY; + result[5] = matrix[5] * scaleRatioY; + result[6] = matrix[6] * scaleRatioZ; + result[7] = matrix[7] * scaleRatioZ; + result[8] = matrix[8] * scaleRatioZ; + return result; +}; +var scratchColumn = new Cartesian3_default(); +Matrix3.getScale = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result.x = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn) + ); + result.y = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[3], matrix[4], matrix[5], scratchColumn) + ); + result.z = Cartesian3_default.magnitude( + Cartesian3_default.fromElements(matrix[6], matrix[7], matrix[8], scratchColumn) + ); + return result; +}; +var scaleScratch3 = new Cartesian3_default(); +Matrix3.getMaximumScale = function(matrix) { + Matrix3.getScale(matrix, scaleScratch3); + return Cartesian3_default.maximumComponent(scaleScratch3); +}; +var scaleScratch4 = new Cartesian3_default(); +Matrix3.setRotation = function(matrix, rotation, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix3.getScale(matrix, scaleScratch4); + result[0] = rotation[0] * scale.x; + result[1] = rotation[1] * scale.x; + result[2] = rotation[2] * scale.x; + result[3] = rotation[3] * scale.y; + result[4] = rotation[4] * scale.y; + result[5] = rotation[5] * scale.y; + result[6] = rotation[6] * scale.z; + result[7] = rotation[7] * scale.z; + result[8] = rotation[8] * scale.z; + return result; +}; +var scaleScratch5 = new Cartesian3_default(); +Matrix3.getRotation = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const scale = Matrix3.getScale(matrix, scaleScratch5); + result[0] = matrix[0] / scale.x; + result[1] = matrix[1] / scale.x; + result[2] = matrix[2] / scale.x; + result[3] = matrix[3] / scale.y; + result[4] = matrix[4] / scale.y; + result[5] = matrix[5] / scale.y; + result[6] = matrix[6] / scale.z; + result[7] = matrix[7] / scale.z; + result[8] = matrix[8] / scale.z; + return result; +}; +Matrix3.multiply = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + const column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2]; + const column0Row1 = left[1] * right[0] + left[4] * right[1] + left[7] * right[2]; + const column0Row2 = left[2] * right[0] + left[5] * right[1] + left[8] * right[2]; + const column1Row0 = left[0] * right[3] + left[3] * right[4] + left[6] * right[5]; + const column1Row1 = left[1] * right[3] + left[4] * right[4] + left[7] * right[5]; + const column1Row2 = left[2] * right[3] + left[5] * right[4] + left[8] * right[5]; + const column2Row0 = left[0] * right[6] + left[3] * right[7] + left[6] * right[8]; + const column2Row1 = left[1] * right[6] + left[4] * right[7] + left[7] * right[8]; + const column2Row2 = left[2] * right[6] + left[5] * right[7] + left[8] * right[8]; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column0Row2; + result[3] = column1Row0; + result[4] = column1Row1; + result[5] = column1Row2; + result[6] = column2Row0; + result[7] = column2Row1; + result[8] = column2Row2; + return result; +}; +Matrix3.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] + right[0]; + result[1] = left[1] + right[1]; + result[2] = left[2] + right[2]; + result[3] = left[3] + right[3]; + result[4] = left[4] + right[4]; + result[5] = left[5] + right[5]; + result[6] = left[6] + right[6]; + result[7] = left[7] + right[7]; + result[8] = left[8] + right[8]; + return result; +}; +Matrix3.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result[0] = left[0] - right[0]; + result[1] = left[1] - right[1]; + result[2] = left[2] - right[2]; + result[3] = left[3] - right[3]; + result[4] = left[4] - right[4]; + result[5] = left[5] - right[5]; + result[6] = left[6] - right[6]; + result[7] = left[7] - right[7]; + result[8] = left[8] - right[8]; + return result; +}; +Matrix3.multiplyByVector = function(matrix, cartesian, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("cartesian", cartesian); + Check_default.typeOf.object("result", result); + const vX = cartesian.x; + const vY = cartesian.y; + const vZ = cartesian.z; + const x = matrix[0] * vX + matrix[3] * vY + matrix[6] * vZ; + const y = matrix[1] * vX + matrix[4] * vY + matrix[7] * vZ; + const z = matrix[2] * vX + matrix[5] * vY + matrix[8] * vZ; + result.x = x; + result.y = y; + result.z = z; + return result; +}; +Matrix3.multiplyByScalar = function(matrix, scalar, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scalar; + result[1] = matrix[1] * scalar; + result[2] = matrix[2] * scalar; + result[3] = matrix[3] * scalar; + result[4] = matrix[4] * scalar; + result[5] = matrix[5] * scalar; + result[6] = matrix[6] * scalar; + result[7] = matrix[7] * scalar; + result[8] = matrix[8] * scalar; + return result; +}; +Matrix3.multiplyByScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("scale", scale); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scale.x; + result[1] = matrix[1] * scale.x; + result[2] = matrix[2] * scale.x; + result[3] = matrix[3] * scale.y; + result[4] = matrix[4] * scale.y; + result[5] = matrix[5] * scale.y; + result[6] = matrix[6] * scale.z; + result[7] = matrix[7] * scale.z; + result[8] = matrix[8] * scale.z; + return result; +}; +Matrix3.multiplyByUniformScale = function(matrix, scale, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.number("scale", scale); + Check_default.typeOf.object("result", result); + result[0] = matrix[0] * scale; + result[1] = matrix[1] * scale; + result[2] = matrix[2] * scale; + result[3] = matrix[3] * scale; + result[4] = matrix[4] * scale; + result[5] = matrix[5] * scale; + result[6] = matrix[6] * scale; + result[7] = matrix[7] * scale; + result[8] = matrix[8] * scale; + return result; +}; +Matrix3.negate = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = -matrix[0]; + result[1] = -matrix[1]; + result[2] = -matrix[2]; + result[3] = -matrix[3]; + result[4] = -matrix[4]; + result[5] = -matrix[5]; + result[6] = -matrix[6]; + result[7] = -matrix[7]; + result[8] = -matrix[8]; + return result; +}; +Matrix3.transpose = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const column0Row0 = matrix[0]; + const column0Row1 = matrix[3]; + const column0Row2 = matrix[6]; + const column1Row0 = matrix[1]; + const column1Row1 = matrix[4]; + const column1Row2 = matrix[7]; + const column2Row0 = matrix[2]; + const column2Row1 = matrix[5]; + const column2Row2 = matrix[8]; + result[0] = column0Row0; + result[1] = column0Row1; + result[2] = column0Row2; + result[3] = column1Row0; + result[4] = column1Row1; + result[5] = column1Row2; + result[6] = column2Row0; + result[7] = column2Row1; + result[8] = column2Row2; + return result; +}; +function computeFrobeniusNorm(matrix) { + let norm = 0; + for (let i = 0; i < 9; ++i) { + const temp = matrix[i]; + norm += temp * temp; + } + return Math.sqrt(norm); +} +var rowVal = [1, 0, 0]; +var colVal = [2, 2, 1]; +function offDiagonalFrobeniusNorm(matrix) { + let norm = 0; + for (let i = 0; i < 3; ++i) { + const temp = matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])]; + norm += 2 * temp * temp; + } + return Math.sqrt(norm); +} +function shurDecomposition(matrix, result) { + const tolerance = Math_default.EPSILON15; + let maxDiagonal = 0; + let rotAxis = 1; + for (let i = 0; i < 3; ++i) { + const temp = Math.abs( + matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])] + ); + if (temp > maxDiagonal) { + rotAxis = i; + maxDiagonal = temp; + } + } + let c = 1; + let s = 0; + const p = rowVal[rotAxis]; + const q = colVal[rotAxis]; + if (Math.abs(matrix[Matrix3.getElementIndex(q, p)]) > tolerance) { + const qq = matrix[Matrix3.getElementIndex(q, q)]; + const pp = matrix[Matrix3.getElementIndex(p, p)]; + const qp = matrix[Matrix3.getElementIndex(q, p)]; + const tau = (qq - pp) / 2 / qp; + let t; + if (tau < 0) { + t = -1 / (-tau + Math.sqrt(1 + tau * tau)); + } else { + t = 1 / (tau + Math.sqrt(1 + tau * tau)); + } + c = 1 / Math.sqrt(1 + t * t); + s = t * c; + } + result = Matrix3.clone(Matrix3.IDENTITY, result); + result[Matrix3.getElementIndex(p, p)] = result[Matrix3.getElementIndex(q, q)] = c; + result[Matrix3.getElementIndex(q, p)] = s; + result[Matrix3.getElementIndex(p, q)] = -s; + return result; +} +var jMatrix = new Matrix3(); +var jMatrixTranspose = new Matrix3(); +Matrix3.computeEigenDecomposition = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + const tolerance = Math_default.EPSILON20; + const maxSweeps = 10; + let count = 0; + let sweep = 0; + if (!defined_default(result)) { + result = {}; + } + const unitaryMatrix = result.unitary = Matrix3.clone( + Matrix3.IDENTITY, + result.unitary + ); + const diagMatrix = result.diagonal = Matrix3.clone(matrix, result.diagonal); + const epsilon = tolerance * computeFrobeniusNorm(diagMatrix); + while (sweep < maxSweeps && offDiagonalFrobeniusNorm(diagMatrix) > epsilon) { + shurDecomposition(diagMatrix, jMatrix); + Matrix3.transpose(jMatrix, jMatrixTranspose); + Matrix3.multiply(diagMatrix, jMatrix, diagMatrix); + Matrix3.multiply(jMatrixTranspose, diagMatrix, diagMatrix); + Matrix3.multiply(unitaryMatrix, jMatrix, unitaryMatrix); + if (++count > 2) { + ++sweep; + count = 0; + } + } + return result; +}; +Matrix3.abs = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + result[0] = Math.abs(matrix[0]); + result[1] = Math.abs(matrix[1]); + result[2] = Math.abs(matrix[2]); + result[3] = Math.abs(matrix[3]); + result[4] = Math.abs(matrix[4]); + result[5] = Math.abs(matrix[5]); + result[6] = Math.abs(matrix[6]); + result[7] = Math.abs(matrix[7]); + result[8] = Math.abs(matrix[8]); + return result; +}; +Matrix3.determinant = function(matrix) { + Check_default.typeOf.object("matrix", matrix); + const m11 = matrix[0]; + const m21 = matrix[3]; + const m31 = matrix[6]; + const m12 = matrix[1]; + const m22 = matrix[4]; + const m32 = matrix[7]; + const m13 = matrix[2]; + const m23 = matrix[5]; + const m33 = matrix[8]; + return m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 * (m21 * m32 - m22 * m31); +}; +Matrix3.inverse = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + const m11 = matrix[0]; + const m21 = matrix[1]; + const m31 = matrix[2]; + const m12 = matrix[3]; + const m22 = matrix[4]; + const m32 = matrix[5]; + const m13 = matrix[6]; + const m23 = matrix[7]; + const m33 = matrix[8]; + const determinant = Matrix3.determinant(matrix); + if (Math.abs(determinant) <= Math_default.EPSILON15) { + throw new DeveloperError_default("matrix is not invertible"); + } + result[0] = m22 * m33 - m23 * m32; + result[1] = m23 * m31 - m21 * m33; + result[2] = m21 * m32 - m22 * m31; + result[3] = m13 * m32 - m12 * m33; + result[4] = m11 * m33 - m13 * m31; + result[5] = m12 * m31 - m11 * m32; + result[6] = m12 * m23 - m13 * m22; + result[7] = m13 * m21 - m11 * m23; + result[8] = m11 * m22 - m12 * m21; + const scale = 1 / determinant; + return Matrix3.multiplyByScalar(result, scale, result); +}; +var scratchTransposeMatrix = new Matrix3(); +Matrix3.inverseTranspose = function(matrix, result) { + Check_default.typeOf.object("matrix", matrix); + Check_default.typeOf.object("result", result); + return Matrix3.inverse( + Matrix3.transpose(matrix, scratchTransposeMatrix), + result + ); +}; +Matrix3.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && left[0] === right[0] && left[1] === right[1] && left[2] === right[2] && left[3] === right[3] && left[4] === right[4] && left[5] === right[5] && left[6] === right[6] && left[7] === right[7] && left[8] === right[8]; +}; +Matrix3.equalsEpsilon = function(left, right, epsilon) { + epsilon = defaultValue_default(epsilon, 0); + return left === right || defined_default(left) && defined_default(right) && Math.abs(left[0] - right[0]) <= epsilon && Math.abs(left[1] - right[1]) <= epsilon && Math.abs(left[2] - right[2]) <= epsilon && Math.abs(left[3] - right[3]) <= epsilon && Math.abs(left[4] - right[4]) <= epsilon && Math.abs(left[5] - right[5]) <= epsilon && Math.abs(left[6] - right[6]) <= epsilon && Math.abs(left[7] - right[7]) <= epsilon && Math.abs(left[8] - right[8]) <= epsilon; +}; +Matrix3.IDENTITY = Object.freeze( + new Matrix3(1, 0, 0, 0, 1, 0, 0, 0, 1) +); +Matrix3.ZERO = Object.freeze( + new Matrix3(0, 0, 0, 0, 0, 0, 0, 0, 0) +); +Matrix3.COLUMN0ROW0 = 0; +Matrix3.COLUMN0ROW1 = 1; +Matrix3.COLUMN0ROW2 = 2; +Matrix3.COLUMN1ROW0 = 3; +Matrix3.COLUMN1ROW1 = 4; +Matrix3.COLUMN1ROW2 = 5; +Matrix3.COLUMN2ROW0 = 6; +Matrix3.COLUMN2ROW1 = 7; +Matrix3.COLUMN2ROW2 = 8; +Object.defineProperties(Matrix3.prototype, { + /** + * Gets the number of items in the collection. + * @memberof Matrix3.prototype + * + * @type {number} + */ + length: { + get: function() { + return Matrix3.packedLength; + } + } +}); +Matrix3.prototype.clone = function(result) { + return Matrix3.clone(this, result); +}; +Matrix3.prototype.equals = function(right) { + return Matrix3.equals(this, right); +}; +Matrix3.equalsArray = function(matrix, array, offset) { + return matrix[0] === array[offset] && matrix[1] === array[offset + 1] && matrix[2] === array[offset + 2] && matrix[3] === array[offset + 3] && matrix[4] === array[offset + 4] && matrix[5] === array[offset + 5] && matrix[6] === array[offset + 6] && matrix[7] === array[offset + 7] && matrix[8] === array[offset + 8]; +}; +Matrix3.prototype.equalsEpsilon = function(right, epsilon) { + return Matrix3.equalsEpsilon(this, right, epsilon); +}; +Matrix3.prototype.toString = function() { + return `(${this[0]}, ${this[3]}, ${this[6]}) +(${this[1]}, ${this[4]}, ${this[7]}) +(${this[2]}, ${this[5]}, ${this[8]})`; +}; +var Matrix3_default = Matrix3; + +// packages/engine/Source/Core/Fullscreen.js +var _supportsFullscreen; +var _names = { + requestFullscreen: void 0, + exitFullscreen: void 0, + fullscreenEnabled: void 0, + fullscreenElement: void 0, + fullscreenchange: void 0, + fullscreenerror: void 0 +}; +var Fullscreen = {}; +Object.defineProperties(Fullscreen, { + /** + * The element that is currently fullscreen, if any. To simply check if the + * browser is in fullscreen mode or not, use {@link Fullscreen#fullscreen}. + * @memberof Fullscreen + * @type {object} + * @readonly + */ + element: { + get: function() { + if (!Fullscreen.supportsFullscreen()) { + return void 0; + } + return document[_names.fullscreenElement]; + } + }, + /** + * The name of the event on the document that is fired when fullscreen is + * entered or exited. This event name is intended for use with addEventListener. + * In your event handler, to determine if the browser is in fullscreen mode or not, + * use {@link Fullscreen#fullscreen}. + * @memberof Fullscreen + * @type {string} + * @readonly + */ + changeEventName: { + get: function() { + if (!Fullscreen.supportsFullscreen()) { + return void 0; + } + return _names.fullscreenchange; + } + }, + /** + * The name of the event that is fired when a fullscreen error + * occurs. This event name is intended for use with addEventListener. + * @memberof Fullscreen + * @type {string} + * @readonly + */ + errorEventName: { + get: function() { + if (!Fullscreen.supportsFullscreen()) { + return void 0; + } + return _names.fullscreenerror; + } + }, + /** + * Determine whether the browser will allow an element to be made fullscreen, or not. + * For example, by default, iframes cannot go fullscreen unless the containing page + * adds an "allowfullscreen" attribute (or prefixed equivalent). + * @memberof Fullscreen + * @type {boolean} + * @readonly + */ + enabled: { + get: function() { + if (!Fullscreen.supportsFullscreen()) { + return void 0; + } + return document[_names.fullscreenEnabled]; + } + }, + /** + * Determines if the browser is currently in fullscreen mode. + * @memberof Fullscreen + * @type {boolean} + * @readonly + */ + fullscreen: { + get: function() { + if (!Fullscreen.supportsFullscreen()) { + return void 0; + } + return Fullscreen.element !== null; + } + } +}); +Fullscreen.supportsFullscreen = function() { + if (defined_default(_supportsFullscreen)) { + return _supportsFullscreen; + } + _supportsFullscreen = false; + const body = document.body; + if (typeof body.requestFullscreen === "function") { + _names.requestFullscreen = "requestFullscreen"; + _names.exitFullscreen = "exitFullscreen"; + _names.fullscreenEnabled = "fullscreenEnabled"; + _names.fullscreenElement = "fullscreenElement"; + _names.fullscreenchange = "fullscreenchange"; + _names.fullscreenerror = "fullscreenerror"; + _supportsFullscreen = true; + return _supportsFullscreen; + } + const prefixes = ["webkit", "moz", "o", "ms", "khtml"]; + let name; + for (let i = 0, len = prefixes.length; i < len; ++i) { + const prefix = prefixes[i]; + name = `${prefix}RequestFullscreen`; + if (typeof body[name] === "function") { + _names.requestFullscreen = name; + _supportsFullscreen = true; + } else { + name = `${prefix}RequestFullScreen`; + if (typeof body[name] === "function") { + _names.requestFullscreen = name; + _supportsFullscreen = true; + } + } + name = `${prefix}ExitFullscreen`; + if (typeof document[name] === "function") { + _names.exitFullscreen = name; + } else { + name = `${prefix}CancelFullScreen`; + if (typeof document[name] === "function") { + _names.exitFullscreen = name; + } + } + name = `${prefix}FullscreenEnabled`; + if (document[name] !== void 0) { + _names.fullscreenEnabled = name; + } else { + name = `${prefix}FullScreenEnabled`; + if (document[name] !== void 0) { + _names.fullscreenEnabled = name; + } + } + name = `${prefix}FullscreenElement`; + if (document[name] !== void 0) { + _names.fullscreenElement = name; + } else { + name = `${prefix}FullScreenElement`; + if (document[name] !== void 0) { + _names.fullscreenElement = name; + } + } + name = `${prefix}fullscreenchange`; + if (document[`on${name}`] !== void 0) { + if (prefix === "ms") { + name = "MSFullscreenChange"; + } + _names.fullscreenchange = name; + } + name = `${prefix}fullscreenerror`; + if (document[`on${name}`] !== void 0) { + if (prefix === "ms") { + name = "MSFullscreenError"; + } + _names.fullscreenerror = name; + } + } + return _supportsFullscreen; +}; +Fullscreen.requestFullscreen = function(element, vrDevice) { + if (!Fullscreen.supportsFullscreen()) { + return; + } + element[_names.requestFullscreen]({ vrDisplay: vrDevice }); +}; +Fullscreen.exitFullscreen = function() { + if (!Fullscreen.supportsFullscreen()) { + return; + } + document[_names.exitFullscreen](); +}; +Fullscreen._names = _names; +var Fullscreen_default = Fullscreen; + +// packages/engine/Source/Core/FeatureDetection.js +var theNavigator; +if (typeof navigator !== "undefined") { + theNavigator = navigator; +} else { + theNavigator = {}; +} +function extractVersion(versionString) { + const parts = versionString.split("."); + for (let i = 0, len = parts.length; i < len; ++i) { + parts[i] = parseInt(parts[i], 10); + } + return parts; +} +var isChromeResult; +var chromeVersionResult; +function isChrome() { + if (!defined_default(isChromeResult)) { + isChromeResult = false; + if (!isEdge()) { + const fields = / Chrome\/([\.0-9]+)/.exec(theNavigator.userAgent); + if (fields !== null) { + isChromeResult = true; + chromeVersionResult = extractVersion(fields[1]); + } + } + } + return isChromeResult; +} +function chromeVersion() { + return isChrome() && chromeVersionResult; +} +var isSafariResult; +var safariVersionResult; +function isSafari() { + if (!defined_default(isSafariResult)) { + isSafariResult = false; + if (!isChrome() && !isEdge() && / Safari\/[\.0-9]+/.test(theNavigator.userAgent)) { + const fields = / Version\/([\.0-9]+)/.exec(theNavigator.userAgent); + if (fields !== null) { + isSafariResult = true; + safariVersionResult = extractVersion(fields[1]); + } + } + } + return isSafariResult; +} +function safariVersion() { + return isSafari() && safariVersionResult; +} +var isWebkitResult; +var webkitVersionResult; +function isWebkit() { + if (!defined_default(isWebkitResult)) { + isWebkitResult = false; + const fields = / AppleWebKit\/([\.0-9]+)(\+?)/.exec(theNavigator.userAgent); + if (fields !== null) { + isWebkitResult = true; + webkitVersionResult = extractVersion(fields[1]); + webkitVersionResult.isNightly = !!fields[2]; + } + } + return isWebkitResult; +} +function webkitVersion() { + return isWebkit() && webkitVersionResult; +} +var isInternetExplorerResult; +var internetExplorerVersionResult; +function isInternetExplorer() { + if (!defined_default(isInternetExplorerResult)) { + isInternetExplorerResult = false; + let fields; + if (theNavigator.appName === "Microsoft Internet Explorer") { + fields = /MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent); + if (fields !== null) { + isInternetExplorerResult = true; + internetExplorerVersionResult = extractVersion(fields[1]); + } + } else if (theNavigator.appName === "Netscape") { + fields = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec( + theNavigator.userAgent + ); + if (fields !== null) { + isInternetExplorerResult = true; + internetExplorerVersionResult = extractVersion(fields[1]); + } + } + } + return isInternetExplorerResult; +} +function internetExplorerVersion() { + return isInternetExplorer() && internetExplorerVersionResult; +} +var isEdgeResult; +var edgeVersionResult; +function isEdge() { + if (!defined_default(isEdgeResult)) { + isEdgeResult = false; + const fields = / Edg\/([\.0-9]+)/.exec(theNavigator.userAgent); + if (fields !== null) { + isEdgeResult = true; + edgeVersionResult = extractVersion(fields[1]); + } + } + return isEdgeResult; +} +function edgeVersion() { + return isEdge() && edgeVersionResult; +} +var isFirefoxResult; +var firefoxVersionResult; +function isFirefox() { + if (!defined_default(isFirefoxResult)) { + isFirefoxResult = false; + const fields = /Firefox\/([\.0-9]+)/.exec(theNavigator.userAgent); + if (fields !== null) { + isFirefoxResult = true; + firefoxVersionResult = extractVersion(fields[1]); + } + } + return isFirefoxResult; +} +var isWindowsResult; +function isWindows() { + if (!defined_default(isWindowsResult)) { + isWindowsResult = /Windows/i.test(theNavigator.appVersion); + } + return isWindowsResult; +} +var isIPadOrIOSResult; +function isIPadOrIOS() { + if (!defined_default(isIPadOrIOSResult)) { + isIPadOrIOSResult = navigator.platform === "iPhone" || navigator.platform === "iPod" || navigator.platform === "iPad"; + } + return isIPadOrIOSResult; +} +function firefoxVersion() { + return isFirefox() && firefoxVersionResult; +} +var hasPointerEvents; +function supportsPointerEvents() { + if (!defined_default(hasPointerEvents)) { + hasPointerEvents = typeof PointerEvent !== "undefined" && (!defined_default(theNavigator.pointerEnabled) || theNavigator.pointerEnabled); + } + return hasPointerEvents; +} +var imageRenderingValueResult; +var supportsImageRenderingPixelatedResult; +function supportsImageRenderingPixelated() { + if (!defined_default(supportsImageRenderingPixelatedResult)) { + const canvas = document.createElement("canvas"); + canvas.setAttribute( + "style", + "image-rendering: -moz-crisp-edges;image-rendering: pixelated;" + ); + const tmp = canvas.style.imageRendering; + supportsImageRenderingPixelatedResult = defined_default(tmp) && tmp !== ""; + if (supportsImageRenderingPixelatedResult) { + imageRenderingValueResult = tmp; + } + } + return supportsImageRenderingPixelatedResult; +} +function imageRenderingValue() { + return supportsImageRenderingPixelated() ? imageRenderingValueResult : void 0; +} +function supportsWebP() { + if (!supportsWebP.initialized) { + throw new DeveloperError_default( + "You must call FeatureDetection.supportsWebP.initialize and wait for the promise to resolve before calling FeatureDetection.supportsWebP" + ); + } + return supportsWebP._result; +} +supportsWebP._promise = void 0; +supportsWebP._result = void 0; +supportsWebP.initialize = function() { + if (defined_default(supportsWebP._promise)) { + return supportsWebP._promise; + } + supportsWebP._promise = new Promise((resolve) => { + const image = new Image(); + image.onload = function() { + supportsWebP._result = image.width > 0 && image.height > 0; + resolve(supportsWebP._result); + }; + image.onerror = function() { + supportsWebP._result = false; + resolve(supportsWebP._result); + }; + image.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"; + }); + return supportsWebP._promise; +}; +Object.defineProperties(supportsWebP, { + initialized: { + get: function() { + return defined_default(supportsWebP._result); + } + } +}); +var typedArrayTypes = []; +if (typeof ArrayBuffer !== "undefined") { + typedArrayTypes.push( + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array + ); + if (typeof Uint8ClampedArray !== "undefined") { + typedArrayTypes.push(Uint8ClampedArray); + } + if (typeof Uint8ClampedArray !== "undefined") { + typedArrayTypes.push(Uint8ClampedArray); + } + if (typeof BigInt64Array !== "undefined") { + typedArrayTypes.push(BigInt64Array); + } + if (typeof BigUint64Array !== "undefined") { + typedArrayTypes.push(BigUint64Array); + } +} +var FeatureDetection = { + isChrome, + chromeVersion, + isSafari, + safariVersion, + isWebkit, + webkitVersion, + isInternetExplorer, + internetExplorerVersion, + isEdge, + edgeVersion, + isFirefox, + firefoxVersion, + isWindows, + isIPadOrIOS, + hardwareConcurrency: defaultValue_default(theNavigator.hardwareConcurrency, 3), + supportsPointerEvents, + supportsImageRenderingPixelated, + supportsWebP, + imageRenderingValue, + typedArrayTypes +}; +FeatureDetection.supportsBasis = function(scene) { + return FeatureDetection.supportsWebAssembly() && scene.context.supportsBasis; +}; +FeatureDetection.supportsFullscreen = function() { + return Fullscreen_default.supportsFullscreen(); +}; +FeatureDetection.supportsTypedArrays = function() { + return typeof ArrayBuffer !== "undefined"; +}; +FeatureDetection.supportsBigInt64Array = function() { + return typeof BigInt64Array !== "undefined"; +}; +FeatureDetection.supportsBigUint64Array = function() { + return typeof BigUint64Array !== "undefined"; +}; +FeatureDetection.supportsBigInt = function() { + return typeof BigInt !== "undefined"; +}; +FeatureDetection.supportsWebWorkers = function() { + return typeof Worker !== "undefined"; +}; +FeatureDetection.supportsWebAssembly = function() { + return typeof WebAssembly !== "undefined"; +}; +FeatureDetection.supportsWebgl2 = function(scene) { + Check_default.defined("scene", scene); + return scene.context.webgl2; +}; +FeatureDetection.supportsEsmWebWorkers = function() { + return !isFirefox() || parseInt(firefoxVersionResult) >= 114; +}; +var FeatureDetection_default = FeatureDetection; + +export { + Cartesian3_default, + Cartographic_default, + Cartesian2_default, + Ellipsoid_default, + Matrix3_default, + FeatureDetection_default +}; diff --git a/public/assets/cesium/Workers/chunk-GBT7MJ6X.js b/public/assets/cesium/Workers/chunk-GBT7MJ6X.js new file mode 100644 index 0000000..30498e9 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-GBT7MJ6X.js @@ -0,0 +1,37 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + + +// packages/engine/Source/Core/GeometryOffsetAttribute.js +var GeometryOffsetAttribute = { + NONE: 0, + TOP: 1, + ALL: 2 +}; +var GeometryOffsetAttribute_default = Object.freeze(GeometryOffsetAttribute); + +export { + GeometryOffsetAttribute_default +}; diff --git a/public/assets/cesium/Workers/chunk-HJMNR3GC.js b/public/assets/cesium/Workers/chunk-HJMNR3GC.js new file mode 100644 index 0000000..677ee83 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-HJMNR3GC.js @@ -0,0 +1,684 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/BoxGeometry.js +var diffScratch = new Cartesian3_default(); +function BoxGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const min = options.minimum; + const max = options.maximum; + Check_default.typeOf.object("min", min); + Check_default.typeOf.object("max", max); + if (defined_default(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + throw new DeveloperError_default( + "GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry." + ); + } + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + this._minimum = Cartesian3_default.clone(min); + this._maximum = Cartesian3_default.clone(max); + this._vertexFormat = vertexFormat; + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createBoxGeometry"; +} +BoxGeometry.fromDimensions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const dimensions = options.dimensions; + Check_default.typeOf.object("dimensions", dimensions); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.x", dimensions.x, 0); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.y", dimensions.y, 0); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.z", dimensions.z, 0); + const corner = Cartesian3_default.multiplyByScalar(dimensions, 0.5, new Cartesian3_default()); + return new BoxGeometry({ + minimum: Cartesian3_default.negate(corner, new Cartesian3_default()), + maximum: corner, + vertexFormat: options.vertexFormat, + offsetAttribute: options.offsetAttribute + }); +}; +BoxGeometry.fromAxisAlignedBoundingBox = function(boundingBox) { + Check_default.typeOf.object("boundingBox", boundingBox); + return new BoxGeometry({ + minimum: boundingBox.minimum, + maximum: boundingBox.maximum + }); +}; +BoxGeometry.packedLength = 2 * Cartesian3_default.packedLength + VertexFormat_default.packedLength + 1; +BoxGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._minimum, array, startingIndex); + Cartesian3_default.pack( + value._maximum, + array, + startingIndex + Cartesian3_default.packedLength + ); + VertexFormat_default.pack( + value._vertexFormat, + array, + startingIndex + 2 * Cartesian3_default.packedLength + ); + array[startingIndex + 2 * Cartesian3_default.packedLength + VertexFormat_default.packedLength] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchMin = new Cartesian3_default(); +var scratchMax = new Cartesian3_default(); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + minimum: scratchMin, + maximum: scratchMax, + vertexFormat: scratchVertexFormat, + offsetAttribute: void 0 +}; +BoxGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const min = Cartesian3_default.unpack(array, startingIndex, scratchMin); + const max = Cartesian3_default.unpack( + array, + startingIndex + Cartesian3_default.packedLength, + scratchMax + ); + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex + 2 * Cartesian3_default.packedLength, + scratchVertexFormat + ); + const offsetAttribute = array[startingIndex + 2 * Cartesian3_default.packedLength + VertexFormat_default.packedLength]; + if (!defined_default(result)) { + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new BoxGeometry(scratchOptions); + } + result._minimum = Cartesian3_default.clone(min, result._minimum); + result._maximum = Cartesian3_default.clone(max, result._maximum); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +BoxGeometry.createGeometry = function(boxGeometry) { + const min = boxGeometry._minimum; + const max = boxGeometry._maximum; + const vertexFormat = boxGeometry._vertexFormat; + if (Cartesian3_default.equals(min, max)) { + return; + } + const attributes = new GeometryAttributes_default(); + let indices; + let positions; + if (vertexFormat.position && (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent)) { + if (vertexFormat.position) { + positions = new Float64Array(6 * 4 * 3); + positions[0] = min.x; + positions[1] = min.y; + positions[2] = max.z; + positions[3] = max.x; + positions[4] = min.y; + positions[5] = max.z; + positions[6] = max.x; + positions[7] = max.y; + positions[8] = max.z; + positions[9] = min.x; + positions[10] = max.y; + positions[11] = max.z; + positions[12] = min.x; + positions[13] = min.y; + positions[14] = min.z; + positions[15] = max.x; + positions[16] = min.y; + positions[17] = min.z; + positions[18] = max.x; + positions[19] = max.y; + positions[20] = min.z; + positions[21] = min.x; + positions[22] = max.y; + positions[23] = min.z; + positions[24] = max.x; + positions[25] = min.y; + positions[26] = min.z; + positions[27] = max.x; + positions[28] = max.y; + positions[29] = min.z; + positions[30] = max.x; + positions[31] = max.y; + positions[32] = max.z; + positions[33] = max.x; + positions[34] = min.y; + positions[35] = max.z; + positions[36] = min.x; + positions[37] = min.y; + positions[38] = min.z; + positions[39] = min.x; + positions[40] = max.y; + positions[41] = min.z; + positions[42] = min.x; + positions[43] = max.y; + positions[44] = max.z; + positions[45] = min.x; + positions[46] = min.y; + positions[47] = max.z; + positions[48] = min.x; + positions[49] = max.y; + positions[50] = min.z; + positions[51] = max.x; + positions[52] = max.y; + positions[53] = min.z; + positions[54] = max.x; + positions[55] = max.y; + positions[56] = max.z; + positions[57] = min.x; + positions[58] = max.y; + positions[59] = max.z; + positions[60] = min.x; + positions[61] = min.y; + positions[62] = min.z; + positions[63] = max.x; + positions[64] = min.y; + positions[65] = min.z; + positions[66] = max.x; + positions[67] = min.y; + positions[68] = max.z; + positions[69] = min.x; + positions[70] = min.y; + positions[71] = max.z; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + } + if (vertexFormat.normal) { + const normals = new Float32Array(6 * 4 * 3); + normals[0] = 0; + normals[1] = 0; + normals[2] = 1; + normals[3] = 0; + normals[4] = 0; + normals[5] = 1; + normals[6] = 0; + normals[7] = 0; + normals[8] = 1; + normals[9] = 0; + normals[10] = 0; + normals[11] = 1; + normals[12] = 0; + normals[13] = 0; + normals[14] = -1; + normals[15] = 0; + normals[16] = 0; + normals[17] = -1; + normals[18] = 0; + normals[19] = 0; + normals[20] = -1; + normals[21] = 0; + normals[22] = 0; + normals[23] = -1; + normals[24] = 1; + normals[25] = 0; + normals[26] = 0; + normals[27] = 1; + normals[28] = 0; + normals[29] = 0; + normals[30] = 1; + normals[31] = 0; + normals[32] = 0; + normals[33] = 1; + normals[34] = 0; + normals[35] = 0; + normals[36] = -1; + normals[37] = 0; + normals[38] = 0; + normals[39] = -1; + normals[40] = 0; + normals[41] = 0; + normals[42] = -1; + normals[43] = 0; + normals[44] = 0; + normals[45] = -1; + normals[46] = 0; + normals[47] = 0; + normals[48] = 0; + normals[49] = 1; + normals[50] = 0; + normals[51] = 0; + normals[52] = 1; + normals[53] = 0; + normals[54] = 0; + normals[55] = 1; + normals[56] = 0; + normals[57] = 0; + normals[58] = 1; + normals[59] = 0; + normals[60] = 0; + normals[61] = -1; + normals[62] = 0; + normals[63] = 0; + normals[64] = -1; + normals[65] = 0; + normals[66] = 0; + normals[67] = -1; + normals[68] = 0; + normals[69] = 0; + normals[70] = -1; + normals[71] = 0; + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.st) { + const texCoords = new Float32Array(6 * 4 * 2); + texCoords[0] = 0; + texCoords[1] = 0; + texCoords[2] = 1; + texCoords[3] = 0; + texCoords[4] = 1; + texCoords[5] = 1; + texCoords[6] = 0; + texCoords[7] = 1; + texCoords[8] = 1; + texCoords[9] = 0; + texCoords[10] = 0; + texCoords[11] = 0; + texCoords[12] = 0; + texCoords[13] = 1; + texCoords[14] = 1; + texCoords[15] = 1; + texCoords[16] = 0; + texCoords[17] = 0; + texCoords[18] = 1; + texCoords[19] = 0; + texCoords[20] = 1; + texCoords[21] = 1; + texCoords[22] = 0; + texCoords[23] = 1; + texCoords[24] = 1; + texCoords[25] = 0; + texCoords[26] = 0; + texCoords[27] = 0; + texCoords[28] = 0; + texCoords[29] = 1; + texCoords[30] = 1; + texCoords[31] = 1; + texCoords[32] = 1; + texCoords[33] = 0; + texCoords[34] = 0; + texCoords[35] = 0; + texCoords[36] = 0; + texCoords[37] = 1; + texCoords[38] = 1; + texCoords[39] = 1; + texCoords[40] = 0; + texCoords[41] = 0; + texCoords[42] = 1; + texCoords[43] = 0; + texCoords[44] = 1; + texCoords[45] = 1; + texCoords[46] = 0; + texCoords[47] = 1; + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: texCoords + }); + } + if (vertexFormat.tangent) { + const tangents = new Float32Array(6 * 4 * 3); + tangents[0] = 1; + tangents[1] = 0; + tangents[2] = 0; + tangents[3] = 1; + tangents[4] = 0; + tangents[5] = 0; + tangents[6] = 1; + tangents[7] = 0; + tangents[8] = 0; + tangents[9] = 1; + tangents[10] = 0; + tangents[11] = 0; + tangents[12] = -1; + tangents[13] = 0; + tangents[14] = 0; + tangents[15] = -1; + tangents[16] = 0; + tangents[17] = 0; + tangents[18] = -1; + tangents[19] = 0; + tangents[20] = 0; + tangents[21] = -1; + tangents[22] = 0; + tangents[23] = 0; + tangents[24] = 0; + tangents[25] = 1; + tangents[26] = 0; + tangents[27] = 0; + tangents[28] = 1; + tangents[29] = 0; + tangents[30] = 0; + tangents[31] = 1; + tangents[32] = 0; + tangents[33] = 0; + tangents[34] = 1; + tangents[35] = 0; + tangents[36] = 0; + tangents[37] = -1; + tangents[38] = 0; + tangents[39] = 0; + tangents[40] = -1; + tangents[41] = 0; + tangents[42] = 0; + tangents[43] = -1; + tangents[44] = 0; + tangents[45] = 0; + tangents[46] = -1; + tangents[47] = 0; + tangents[48] = -1; + tangents[49] = 0; + tangents[50] = 0; + tangents[51] = -1; + tangents[52] = 0; + tangents[53] = 0; + tangents[54] = -1; + tangents[55] = 0; + tangents[56] = 0; + tangents[57] = -1; + tangents[58] = 0; + tangents[59] = 0; + tangents[60] = 1; + tangents[61] = 0; + tangents[62] = 0; + tangents[63] = 1; + tangents[64] = 0; + tangents[65] = 0; + tangents[66] = 1; + tangents[67] = 0; + tangents[68] = 0; + tangents[69] = 1; + tangents[70] = 0; + tangents[71] = 0; + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + const bitangents = new Float32Array(6 * 4 * 3); + bitangents[0] = 0; + bitangents[1] = 1; + bitangents[2] = 0; + bitangents[3] = 0; + bitangents[4] = 1; + bitangents[5] = 0; + bitangents[6] = 0; + bitangents[7] = 1; + bitangents[8] = 0; + bitangents[9] = 0; + bitangents[10] = 1; + bitangents[11] = 0; + bitangents[12] = 0; + bitangents[13] = 1; + bitangents[14] = 0; + bitangents[15] = 0; + bitangents[16] = 1; + bitangents[17] = 0; + bitangents[18] = 0; + bitangents[19] = 1; + bitangents[20] = 0; + bitangents[21] = 0; + bitangents[22] = 1; + bitangents[23] = 0; + bitangents[24] = 0; + bitangents[25] = 0; + bitangents[26] = 1; + bitangents[27] = 0; + bitangents[28] = 0; + bitangents[29] = 1; + bitangents[30] = 0; + bitangents[31] = 0; + bitangents[32] = 1; + bitangents[33] = 0; + bitangents[34] = 0; + bitangents[35] = 1; + bitangents[36] = 0; + bitangents[37] = 0; + bitangents[38] = 1; + bitangents[39] = 0; + bitangents[40] = 0; + bitangents[41] = 1; + bitangents[42] = 0; + bitangents[43] = 0; + bitangents[44] = 1; + bitangents[45] = 0; + bitangents[46] = 0; + bitangents[47] = 1; + bitangents[48] = 0; + bitangents[49] = 0; + bitangents[50] = 1; + bitangents[51] = 0; + bitangents[52] = 0; + bitangents[53] = 1; + bitangents[54] = 0; + bitangents[55] = 0; + bitangents[56] = 1; + bitangents[57] = 0; + bitangents[58] = 0; + bitangents[59] = 1; + bitangents[60] = 0; + bitangents[61] = 0; + bitangents[62] = 1; + bitangents[63] = 0; + bitangents[64] = 0; + bitangents[65] = 1; + bitangents[66] = 0; + bitangents[67] = 0; + bitangents[68] = 1; + bitangents[69] = 0; + bitangents[70] = 0; + bitangents[71] = 1; + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + indices = new Uint16Array(6 * 2 * 3); + indices[0] = 0; + indices[1] = 1; + indices[2] = 2; + indices[3] = 0; + indices[4] = 2; + indices[5] = 3; + indices[6] = 4 + 2; + indices[7] = 4 + 1; + indices[8] = 4 + 0; + indices[9] = 4 + 3; + indices[10] = 4 + 2; + indices[11] = 4 + 0; + indices[12] = 8 + 0; + indices[13] = 8 + 1; + indices[14] = 8 + 2; + indices[15] = 8 + 0; + indices[16] = 8 + 2; + indices[17] = 8 + 3; + indices[18] = 12 + 2; + indices[19] = 12 + 1; + indices[20] = 12 + 0; + indices[21] = 12 + 3; + indices[22] = 12 + 2; + indices[23] = 12 + 0; + indices[24] = 16 + 2; + indices[25] = 16 + 1; + indices[26] = 16 + 0; + indices[27] = 16 + 3; + indices[28] = 16 + 2; + indices[29] = 16 + 0; + indices[30] = 20 + 0; + indices[31] = 20 + 1; + indices[32] = 20 + 2; + indices[33] = 20 + 0; + indices[34] = 20 + 2; + indices[35] = 20 + 3; + } else { + positions = new Float64Array(8 * 3); + positions[0] = min.x; + positions[1] = min.y; + positions[2] = min.z; + positions[3] = max.x; + positions[4] = min.y; + positions[5] = min.z; + positions[6] = max.x; + positions[7] = max.y; + positions[8] = min.z; + positions[9] = min.x; + positions[10] = max.y; + positions[11] = min.z; + positions[12] = min.x; + positions[13] = min.y; + positions[14] = max.z; + positions[15] = max.x; + positions[16] = min.y; + positions[17] = max.z; + positions[18] = max.x; + positions[19] = max.y; + positions[20] = max.z; + positions[21] = min.x; + positions[22] = max.y; + positions[23] = max.z; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + indices = new Uint16Array(6 * 2 * 3); + indices[0] = 4; + indices[1] = 5; + indices[2] = 6; + indices[3] = 4; + indices[4] = 6; + indices[5] = 7; + indices[6] = 1; + indices[7] = 0; + indices[8] = 3; + indices[9] = 1; + indices[10] = 3; + indices[11] = 2; + indices[12] = 1; + indices[13] = 6; + indices[14] = 5; + indices[15] = 1; + indices[16] = 2; + indices[17] = 6; + indices[18] = 2; + indices[19] = 3; + indices[20] = 7; + indices[21] = 2; + indices[22] = 7; + indices[23] = 6; + indices[24] = 3; + indices[25] = 0; + indices[26] = 4; + indices[27] = 3; + indices[28] = 4; + indices[29] = 7; + indices[30] = 0; + indices[31] = 1; + indices[32] = 5; + indices[33] = 0; + indices[34] = 5; + indices[35] = 4; + } + const diff = Cartesian3_default.subtract(max, min, diffScratch); + const radius = Cartesian3_default.magnitude(diff) * 0.5; + if (defined_default(boxGeometry._offsetAttribute)) { + const length = positions.length; + const offsetValue = boxGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: new BoundingSphere_default(Cartesian3_default.ZERO, radius), + offsetAttribute: boxGeometry._offsetAttribute + }); +}; +var unitBoxGeometry; +BoxGeometry.getUnitBox = function() { + if (!defined_default(unitBoxGeometry)) { + unitBoxGeometry = BoxGeometry.createGeometry( + BoxGeometry.fromDimensions({ + dimensions: new Cartesian3_default(1, 1, 1), + vertexFormat: VertexFormat_default.POSITION_ONLY + }) + ); + } + return unitBoxGeometry; +}; +var BoxGeometry_default = BoxGeometry; + +export { + BoxGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-HP5XLODI.js b/public/assets/cesium/Workers/chunk-HP5XLODI.js new file mode 100644 index 0000000..82850c3 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-HP5XLODI.js @@ -0,0 +1,634 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + FeatureDetection_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/Color.js +function hue2rgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + if (h > 1) { + h -= 1; + } + if (h * 6 < 1) { + return m1 + (m2 - m1) * 6 * h; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + return m1; +} +function Color(red, green, blue, alpha) { + this.red = defaultValue_default(red, 1); + this.green = defaultValue_default(green, 1); + this.blue = defaultValue_default(blue, 1); + this.alpha = defaultValue_default(alpha, 1); +} +Color.fromCartesian4 = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + if (!defined_default(result)) { + return new Color(cartesian.x, cartesian.y, cartesian.z, cartesian.w); + } + result.red = cartesian.x; + result.green = cartesian.y; + result.blue = cartesian.z; + result.alpha = cartesian.w; + return result; +}; +Color.fromBytes = function(red, green, blue, alpha, result) { + red = Color.byteToFloat(defaultValue_default(red, 255)); + green = Color.byteToFloat(defaultValue_default(green, 255)); + blue = Color.byteToFloat(defaultValue_default(blue, 255)); + alpha = Color.byteToFloat(defaultValue_default(alpha, 255)); + if (!defined_default(result)) { + return new Color(red, green, blue, alpha); + } + result.red = red; + result.green = green; + result.blue = blue; + result.alpha = alpha; + return result; +}; +Color.fromAlpha = function(color, alpha, result) { + Check_default.typeOf.object("color", color); + Check_default.typeOf.number("alpha", alpha); + if (!defined_default(result)) { + return new Color(color.red, color.green, color.blue, alpha); + } + result.red = color.red; + result.green = color.green; + result.blue = color.blue; + result.alpha = alpha; + return result; +}; +var scratchArrayBuffer; +var scratchUint32Array; +var scratchUint8Array; +if (FeatureDetection_default.supportsTypedArrays()) { + scratchArrayBuffer = new ArrayBuffer(4); + scratchUint32Array = new Uint32Array(scratchArrayBuffer); + scratchUint8Array = new Uint8Array(scratchArrayBuffer); +} +Color.fromRgba = function(rgba, result) { + scratchUint32Array[0] = rgba; + return Color.fromBytes( + scratchUint8Array[0], + scratchUint8Array[1], + scratchUint8Array[2], + scratchUint8Array[3], + result + ); +}; +Color.fromHsl = function(hue, saturation, lightness, alpha, result) { + hue = defaultValue_default(hue, 0) % 1; + saturation = defaultValue_default(saturation, 0); + lightness = defaultValue_default(lightness, 0); + alpha = defaultValue_default(alpha, 1); + let red = lightness; + let green = lightness; + let blue = lightness; + if (saturation !== 0) { + let m2; + if (lightness < 0.5) { + m2 = lightness * (1 + saturation); + } else { + m2 = lightness + saturation - lightness * saturation; + } + const m1 = 2 * lightness - m2; + red = hue2rgb(m1, m2, hue + 1 / 3); + green = hue2rgb(m1, m2, hue); + blue = hue2rgb(m1, m2, hue - 1 / 3); + } + if (!defined_default(result)) { + return new Color(red, green, blue, alpha); + } + result.red = red; + result.green = green; + result.blue = blue; + result.alpha = alpha; + return result; +}; +Color.fromRandom = function(options, result) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + let red = options.red; + if (!defined_default(red)) { + const minimumRed = defaultValue_default(options.minimumRed, 0); + const maximumRed = defaultValue_default(options.maximumRed, 1); + Check_default.typeOf.number.lessThanOrEquals("minimumRed", minimumRed, maximumRed); + red = minimumRed + Math_default.nextRandomNumber() * (maximumRed - minimumRed); + } + let green = options.green; + if (!defined_default(green)) { + const minimumGreen = defaultValue_default(options.minimumGreen, 0); + const maximumGreen = defaultValue_default(options.maximumGreen, 1); + Check_default.typeOf.number.lessThanOrEquals( + "minimumGreen", + minimumGreen, + maximumGreen + ); + green = minimumGreen + Math_default.nextRandomNumber() * (maximumGreen - minimumGreen); + } + let blue = options.blue; + if (!defined_default(blue)) { + const minimumBlue = defaultValue_default(options.minimumBlue, 0); + const maximumBlue = defaultValue_default(options.maximumBlue, 1); + Check_default.typeOf.number.lessThanOrEquals( + "minimumBlue", + minimumBlue, + maximumBlue + ); + blue = minimumBlue + Math_default.nextRandomNumber() * (maximumBlue - minimumBlue); + } + let alpha = options.alpha; + if (!defined_default(alpha)) { + const minimumAlpha = defaultValue_default(options.minimumAlpha, 0); + const maximumAlpha = defaultValue_default(options.maximumAlpha, 1); + Check_default.typeOf.number.lessThanOrEquals( + "minumumAlpha", + minimumAlpha, + maximumAlpha + ); + alpha = minimumAlpha + Math_default.nextRandomNumber() * (maximumAlpha - minimumAlpha); + } + if (!defined_default(result)) { + return new Color(red, green, blue, alpha); + } + result.red = red; + result.green = green; + result.blue = blue; + result.alpha = alpha; + return result; +}; +var rgbaMatcher = /^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i; +var rrggbbaaMatcher = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i; +var rgbParenthesesMatcher = /^rgba?\s*\(\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i; +var hslParenthesesMatcher = /^hsla?\s*\(\s*([0-9.]+)\s*[,\s]+\s*([0-9.]+%)\s*[,\s]+\s*([0-9.]+%)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i; +Color.fromCssColorString = function(color, result) { + Check_default.typeOf.string("color", color); + if (!defined_default(result)) { + result = new Color(); + } + color = color.trim(); + const namedColor = Color[color.toUpperCase()]; + if (defined_default(namedColor)) { + Color.clone(namedColor, result); + return result; + } + let matches = rgbaMatcher.exec(color); + if (matches !== null) { + result.red = parseInt(matches[1], 16) / 15; + result.green = parseInt(matches[2], 16) / 15; + result.blue = parseInt(matches[3], 16) / 15; + result.alpha = parseInt(defaultValue_default(matches[4], "f"), 16) / 15; + return result; + } + matches = rrggbbaaMatcher.exec(color); + if (matches !== null) { + result.red = parseInt(matches[1], 16) / 255; + result.green = parseInt(matches[2], 16) / 255; + result.blue = parseInt(matches[3], 16) / 255; + result.alpha = parseInt(defaultValue_default(matches[4], "ff"), 16) / 255; + return result; + } + matches = rgbParenthesesMatcher.exec(color); + if (matches !== null) { + result.red = parseFloat(matches[1]) / ("%" === matches[1].substr(-1) ? 100 : 255); + result.green = parseFloat(matches[2]) / ("%" === matches[2].substr(-1) ? 100 : 255); + result.blue = parseFloat(matches[3]) / ("%" === matches[3].substr(-1) ? 100 : 255); + result.alpha = parseFloat(defaultValue_default(matches[4], "1.0")); + return result; + } + matches = hslParenthesesMatcher.exec(color); + if (matches !== null) { + return Color.fromHsl( + parseFloat(matches[1]) / 360, + parseFloat(matches[2]) / 100, + parseFloat(matches[3]) / 100, + parseFloat(defaultValue_default(matches[4], "1.0")), + result + ); + } + result = void 0; + return result; +}; +Color.packedLength = 4; +Color.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.red; + array[startingIndex++] = value.green; + array[startingIndex++] = value.blue; + array[startingIndex] = value.alpha; + return array; +}; +Color.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new Color(); + } + result.red = array[startingIndex++]; + result.green = array[startingIndex++]; + result.blue = array[startingIndex++]; + result.alpha = array[startingIndex]; + return result; +}; +Color.byteToFloat = function(number) { + return number / 255; +}; +Color.floatToByte = function(number) { + return number === 1 ? 255 : number * 256 | 0; +}; +Color.clone = function(color, result) { + if (!defined_default(color)) { + return void 0; + } + if (!defined_default(result)) { + return new Color(color.red, color.green, color.blue, color.alpha); + } + result.red = color.red; + result.green = color.green; + result.blue = color.blue; + result.alpha = color.alpha; + return result; +}; +Color.equals = function(left, right) { + return left === right || // + defined_default(left) && // + defined_default(right) && // + left.red === right.red && // + left.green === right.green && // + left.blue === right.blue && // + left.alpha === right.alpha; +}; +Color.equalsArray = function(color, array, offset) { + return color.red === array[offset] && color.green === array[offset + 1] && color.blue === array[offset + 2] && color.alpha === array[offset + 3]; +}; +Color.prototype.clone = function(result) { + return Color.clone(this, result); +}; +Color.prototype.equals = function(other) { + return Color.equals(this, other); +}; +Color.prototype.equalsEpsilon = function(other, epsilon) { + return this === other || // + defined_default(other) && // + Math.abs(this.red - other.red) <= epsilon && // + Math.abs(this.green - other.green) <= epsilon && // + Math.abs(this.blue - other.blue) <= epsilon && // + Math.abs(this.alpha - other.alpha) <= epsilon; +}; +Color.prototype.toString = function() { + return `(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`; +}; +Color.prototype.toCssColorString = function() { + const red = Color.floatToByte(this.red); + const green = Color.floatToByte(this.green); + const blue = Color.floatToByte(this.blue); + if (this.alpha === 1) { + return `rgb(${red},${green},${blue})`; + } + return `rgba(${red},${green},${blue},${this.alpha})`; +}; +Color.prototype.toCssHexString = function() { + let r = Color.floatToByte(this.red).toString(16); + if (r.length < 2) { + r = `0${r}`; + } + let g = Color.floatToByte(this.green).toString(16); + if (g.length < 2) { + g = `0${g}`; + } + let b = Color.floatToByte(this.blue).toString(16); + if (b.length < 2) { + b = `0${b}`; + } + if (this.alpha < 1) { + let hexAlpha = Color.floatToByte(this.alpha).toString(16); + if (hexAlpha.length < 2) { + hexAlpha = `0${hexAlpha}`; + } + return `#${r}${g}${b}${hexAlpha}`; + } + return `#${r}${g}${b}`; +}; +Color.prototype.toBytes = function(result) { + const red = Color.floatToByte(this.red); + const green = Color.floatToByte(this.green); + const blue = Color.floatToByte(this.blue); + const alpha = Color.floatToByte(this.alpha); + if (!defined_default(result)) { + return [red, green, blue, alpha]; + } + result[0] = red; + result[1] = green; + result[2] = blue; + result[3] = alpha; + return result; +}; +Color.prototype.toRgba = function() { + scratchUint8Array[0] = Color.floatToByte(this.red); + scratchUint8Array[1] = Color.floatToByte(this.green); + scratchUint8Array[2] = Color.floatToByte(this.blue); + scratchUint8Array[3] = Color.floatToByte(this.alpha); + return scratchUint32Array[0]; +}; +Color.prototype.brighten = function(magnitude, result) { + Check_default.typeOf.number("magnitude", magnitude); + Check_default.typeOf.number.greaterThanOrEquals("magnitude", magnitude, 0); + Check_default.typeOf.object("result", result); + magnitude = 1 - magnitude; + result.red = 1 - (1 - this.red) * magnitude; + result.green = 1 - (1 - this.green) * magnitude; + result.blue = 1 - (1 - this.blue) * magnitude; + result.alpha = this.alpha; + return result; +}; +Color.prototype.darken = function(magnitude, result) { + Check_default.typeOf.number("magnitude", magnitude); + Check_default.typeOf.number.greaterThanOrEquals("magnitude", magnitude, 0); + Check_default.typeOf.object("result", result); + magnitude = 1 - magnitude; + result.red = this.red * magnitude; + result.green = this.green * magnitude; + result.blue = this.blue * magnitude; + result.alpha = this.alpha; + return result; +}; +Color.prototype.withAlpha = function(alpha, result) { + return Color.fromAlpha(this, alpha, result); +}; +Color.add = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.red = left.red + right.red; + result.green = left.green + right.green; + result.blue = left.blue + right.blue; + result.alpha = left.alpha + right.alpha; + return result; +}; +Color.subtract = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.red = left.red - right.red; + result.green = left.green - right.green; + result.blue = left.blue - right.blue; + result.alpha = left.alpha - right.alpha; + return result; +}; +Color.multiply = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.red = left.red * right.red; + result.green = left.green * right.green; + result.blue = left.blue * right.blue; + result.alpha = left.alpha * right.alpha; + return result; +}; +Color.divide = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.red = left.red / right.red; + result.green = left.green / right.green; + result.blue = left.blue / right.blue; + result.alpha = left.alpha / right.alpha; + return result; +}; +Color.mod = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + Check_default.typeOf.object("result", result); + result.red = left.red % right.red; + result.green = left.green % right.green; + result.blue = left.blue % right.blue; + result.alpha = left.alpha % right.alpha; + return result; +}; +Color.lerp = function(start, end, t, result) { + Check_default.typeOf.object("start", start); + Check_default.typeOf.object("end", end); + Check_default.typeOf.number("t", t); + Check_default.typeOf.object("result", result); + result.red = Math_default.lerp(start.red, end.red, t); + result.green = Math_default.lerp(start.green, end.green, t); + result.blue = Math_default.lerp(start.blue, end.blue, t); + result.alpha = Math_default.lerp(start.alpha, end.alpha, t); + return result; +}; +Color.multiplyByScalar = function(color, scalar, result) { + Check_default.typeOf.object("color", color); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.red = color.red * scalar; + result.green = color.green * scalar; + result.blue = color.blue * scalar; + result.alpha = color.alpha * scalar; + return result; +}; +Color.divideByScalar = function(color, scalar, result) { + Check_default.typeOf.object("color", color); + Check_default.typeOf.number("scalar", scalar); + Check_default.typeOf.object("result", result); + result.red = color.red / scalar; + result.green = color.green / scalar; + result.blue = color.blue / scalar; + result.alpha = color.alpha / scalar; + return result; +}; +Color.ALICEBLUE = Object.freeze(Color.fromCssColorString("#F0F8FF")); +Color.ANTIQUEWHITE = Object.freeze(Color.fromCssColorString("#FAEBD7")); +Color.AQUA = Object.freeze(Color.fromCssColorString("#00FFFF")); +Color.AQUAMARINE = Object.freeze(Color.fromCssColorString("#7FFFD4")); +Color.AZURE = Object.freeze(Color.fromCssColorString("#F0FFFF")); +Color.BEIGE = Object.freeze(Color.fromCssColorString("#F5F5DC")); +Color.BISQUE = Object.freeze(Color.fromCssColorString("#FFE4C4")); +Color.BLACK = Object.freeze(Color.fromCssColorString("#000000")); +Color.BLANCHEDALMOND = Object.freeze(Color.fromCssColorString("#FFEBCD")); +Color.BLUE = Object.freeze(Color.fromCssColorString("#0000FF")); +Color.BLUEVIOLET = Object.freeze(Color.fromCssColorString("#8A2BE2")); +Color.BROWN = Object.freeze(Color.fromCssColorString("#A52A2A")); +Color.BURLYWOOD = Object.freeze(Color.fromCssColorString("#DEB887")); +Color.CADETBLUE = Object.freeze(Color.fromCssColorString("#5F9EA0")); +Color.CHARTREUSE = Object.freeze(Color.fromCssColorString("#7FFF00")); +Color.CHOCOLATE = Object.freeze(Color.fromCssColorString("#D2691E")); +Color.CORAL = Object.freeze(Color.fromCssColorString("#FF7F50")); +Color.CORNFLOWERBLUE = Object.freeze(Color.fromCssColorString("#6495ED")); +Color.CORNSILK = Object.freeze(Color.fromCssColorString("#FFF8DC")); +Color.CRIMSON = Object.freeze(Color.fromCssColorString("#DC143C")); +Color.CYAN = Object.freeze(Color.fromCssColorString("#00FFFF")); +Color.DARKBLUE = Object.freeze(Color.fromCssColorString("#00008B")); +Color.DARKCYAN = Object.freeze(Color.fromCssColorString("#008B8B")); +Color.DARKGOLDENROD = Object.freeze(Color.fromCssColorString("#B8860B")); +Color.DARKGRAY = Object.freeze(Color.fromCssColorString("#A9A9A9")); +Color.DARKGREEN = Object.freeze(Color.fromCssColorString("#006400")); +Color.DARKGREY = Color.DARKGRAY; +Color.DARKKHAKI = Object.freeze(Color.fromCssColorString("#BDB76B")); +Color.DARKMAGENTA = Object.freeze(Color.fromCssColorString("#8B008B")); +Color.DARKOLIVEGREEN = Object.freeze(Color.fromCssColorString("#556B2F")); +Color.DARKORANGE = Object.freeze(Color.fromCssColorString("#FF8C00")); +Color.DARKORCHID = Object.freeze(Color.fromCssColorString("#9932CC")); +Color.DARKRED = Object.freeze(Color.fromCssColorString("#8B0000")); +Color.DARKSALMON = Object.freeze(Color.fromCssColorString("#E9967A")); +Color.DARKSEAGREEN = Object.freeze(Color.fromCssColorString("#8FBC8F")); +Color.DARKSLATEBLUE = Object.freeze(Color.fromCssColorString("#483D8B")); +Color.DARKSLATEGRAY = Object.freeze(Color.fromCssColorString("#2F4F4F")); +Color.DARKSLATEGREY = Color.DARKSLATEGRAY; +Color.DARKTURQUOISE = Object.freeze(Color.fromCssColorString("#00CED1")); +Color.DARKVIOLET = Object.freeze(Color.fromCssColorString("#9400D3")); +Color.DEEPPINK = Object.freeze(Color.fromCssColorString("#FF1493")); +Color.DEEPSKYBLUE = Object.freeze(Color.fromCssColorString("#00BFFF")); +Color.DIMGRAY = Object.freeze(Color.fromCssColorString("#696969")); +Color.DIMGREY = Color.DIMGRAY; +Color.DODGERBLUE = Object.freeze(Color.fromCssColorString("#1E90FF")); +Color.FIREBRICK = Object.freeze(Color.fromCssColorString("#B22222")); +Color.FLORALWHITE = Object.freeze(Color.fromCssColorString("#FFFAF0")); +Color.FORESTGREEN = Object.freeze(Color.fromCssColorString("#228B22")); +Color.FUCHSIA = Object.freeze(Color.fromCssColorString("#FF00FF")); +Color.GAINSBORO = Object.freeze(Color.fromCssColorString("#DCDCDC")); +Color.GHOSTWHITE = Object.freeze(Color.fromCssColorString("#F8F8FF")); +Color.GOLD = Object.freeze(Color.fromCssColorString("#FFD700")); +Color.GOLDENROD = Object.freeze(Color.fromCssColorString("#DAA520")); +Color.GRAY = Object.freeze(Color.fromCssColorString("#808080")); +Color.GREEN = Object.freeze(Color.fromCssColorString("#008000")); +Color.GREENYELLOW = Object.freeze(Color.fromCssColorString("#ADFF2F")); +Color.GREY = Color.GRAY; +Color.HONEYDEW = Object.freeze(Color.fromCssColorString("#F0FFF0")); +Color.HOTPINK = Object.freeze(Color.fromCssColorString("#FF69B4")); +Color.INDIANRED = Object.freeze(Color.fromCssColorString("#CD5C5C")); +Color.INDIGO = Object.freeze(Color.fromCssColorString("#4B0082")); +Color.IVORY = Object.freeze(Color.fromCssColorString("#FFFFF0")); +Color.KHAKI = Object.freeze(Color.fromCssColorString("#F0E68C")); +Color.LAVENDER = Object.freeze(Color.fromCssColorString("#E6E6FA")); +Color.LAVENDAR_BLUSH = Object.freeze(Color.fromCssColorString("#FFF0F5")); +Color.LAWNGREEN = Object.freeze(Color.fromCssColorString("#7CFC00")); +Color.LEMONCHIFFON = Object.freeze(Color.fromCssColorString("#FFFACD")); +Color.LIGHTBLUE = Object.freeze(Color.fromCssColorString("#ADD8E6")); +Color.LIGHTCORAL = Object.freeze(Color.fromCssColorString("#F08080")); +Color.LIGHTCYAN = Object.freeze(Color.fromCssColorString("#E0FFFF")); +Color.LIGHTGOLDENRODYELLOW = Object.freeze(Color.fromCssColorString("#FAFAD2")); +Color.LIGHTGRAY = Object.freeze(Color.fromCssColorString("#D3D3D3")); +Color.LIGHTGREEN = Object.freeze(Color.fromCssColorString("#90EE90")); +Color.LIGHTGREY = Color.LIGHTGRAY; +Color.LIGHTPINK = Object.freeze(Color.fromCssColorString("#FFB6C1")); +Color.LIGHTSEAGREEN = Object.freeze(Color.fromCssColorString("#20B2AA")); +Color.LIGHTSKYBLUE = Object.freeze(Color.fromCssColorString("#87CEFA")); +Color.LIGHTSLATEGRAY = Object.freeze(Color.fromCssColorString("#778899")); +Color.LIGHTSLATEGREY = Color.LIGHTSLATEGRAY; +Color.LIGHTSTEELBLUE = Object.freeze(Color.fromCssColorString("#B0C4DE")); +Color.LIGHTYELLOW = Object.freeze(Color.fromCssColorString("#FFFFE0")); +Color.LIME = Object.freeze(Color.fromCssColorString("#00FF00")); +Color.LIMEGREEN = Object.freeze(Color.fromCssColorString("#32CD32")); +Color.LINEN = Object.freeze(Color.fromCssColorString("#FAF0E6")); +Color.MAGENTA = Object.freeze(Color.fromCssColorString("#FF00FF")); +Color.MAROON = Object.freeze(Color.fromCssColorString("#800000")); +Color.MEDIUMAQUAMARINE = Object.freeze(Color.fromCssColorString("#66CDAA")); +Color.MEDIUMBLUE = Object.freeze(Color.fromCssColorString("#0000CD")); +Color.MEDIUMORCHID = Object.freeze(Color.fromCssColorString("#BA55D3")); +Color.MEDIUMPURPLE = Object.freeze(Color.fromCssColorString("#9370DB")); +Color.MEDIUMSEAGREEN = Object.freeze(Color.fromCssColorString("#3CB371")); +Color.MEDIUMSLATEBLUE = Object.freeze(Color.fromCssColorString("#7B68EE")); +Color.MEDIUMSPRINGGREEN = Object.freeze(Color.fromCssColorString("#00FA9A")); +Color.MEDIUMTURQUOISE = Object.freeze(Color.fromCssColorString("#48D1CC")); +Color.MEDIUMVIOLETRED = Object.freeze(Color.fromCssColorString("#C71585")); +Color.MIDNIGHTBLUE = Object.freeze(Color.fromCssColorString("#191970")); +Color.MINTCREAM = Object.freeze(Color.fromCssColorString("#F5FFFA")); +Color.MISTYROSE = Object.freeze(Color.fromCssColorString("#FFE4E1")); +Color.MOCCASIN = Object.freeze(Color.fromCssColorString("#FFE4B5")); +Color.NAVAJOWHITE = Object.freeze(Color.fromCssColorString("#FFDEAD")); +Color.NAVY = Object.freeze(Color.fromCssColorString("#000080")); +Color.OLDLACE = Object.freeze(Color.fromCssColorString("#FDF5E6")); +Color.OLIVE = Object.freeze(Color.fromCssColorString("#808000")); +Color.OLIVEDRAB = Object.freeze(Color.fromCssColorString("#6B8E23")); +Color.ORANGE = Object.freeze(Color.fromCssColorString("#FFA500")); +Color.ORANGERED = Object.freeze(Color.fromCssColorString("#FF4500")); +Color.ORCHID = Object.freeze(Color.fromCssColorString("#DA70D6")); +Color.PALEGOLDENROD = Object.freeze(Color.fromCssColorString("#EEE8AA")); +Color.PALEGREEN = Object.freeze(Color.fromCssColorString("#98FB98")); +Color.PALETURQUOISE = Object.freeze(Color.fromCssColorString("#AFEEEE")); +Color.PALEVIOLETRED = Object.freeze(Color.fromCssColorString("#DB7093")); +Color.PAPAYAWHIP = Object.freeze(Color.fromCssColorString("#FFEFD5")); +Color.PEACHPUFF = Object.freeze(Color.fromCssColorString("#FFDAB9")); +Color.PERU = Object.freeze(Color.fromCssColorString("#CD853F")); +Color.PINK = Object.freeze(Color.fromCssColorString("#FFC0CB")); +Color.PLUM = Object.freeze(Color.fromCssColorString("#DDA0DD")); +Color.POWDERBLUE = Object.freeze(Color.fromCssColorString("#B0E0E6")); +Color.PURPLE = Object.freeze(Color.fromCssColorString("#800080")); +Color.RED = Object.freeze(Color.fromCssColorString("#FF0000")); +Color.ROSYBROWN = Object.freeze(Color.fromCssColorString("#BC8F8F")); +Color.ROYALBLUE = Object.freeze(Color.fromCssColorString("#4169E1")); +Color.SADDLEBROWN = Object.freeze(Color.fromCssColorString("#8B4513")); +Color.SALMON = Object.freeze(Color.fromCssColorString("#FA8072")); +Color.SANDYBROWN = Object.freeze(Color.fromCssColorString("#F4A460")); +Color.SEAGREEN = Object.freeze(Color.fromCssColorString("#2E8B57")); +Color.SEASHELL = Object.freeze(Color.fromCssColorString("#FFF5EE")); +Color.SIENNA = Object.freeze(Color.fromCssColorString("#A0522D")); +Color.SILVER = Object.freeze(Color.fromCssColorString("#C0C0C0")); +Color.SKYBLUE = Object.freeze(Color.fromCssColorString("#87CEEB")); +Color.SLATEBLUE = Object.freeze(Color.fromCssColorString("#6A5ACD")); +Color.SLATEGRAY = Object.freeze(Color.fromCssColorString("#708090")); +Color.SLATEGREY = Color.SLATEGRAY; +Color.SNOW = Object.freeze(Color.fromCssColorString("#FFFAFA")); +Color.SPRINGGREEN = Object.freeze(Color.fromCssColorString("#00FF7F")); +Color.STEELBLUE = Object.freeze(Color.fromCssColorString("#4682B4")); +Color.TAN = Object.freeze(Color.fromCssColorString("#D2B48C")); +Color.TEAL = Object.freeze(Color.fromCssColorString("#008080")); +Color.THISTLE = Object.freeze(Color.fromCssColorString("#D8BFD8")); +Color.TOMATO = Object.freeze(Color.fromCssColorString("#FF6347")); +Color.TURQUOISE = Object.freeze(Color.fromCssColorString("#40E0D0")); +Color.VIOLET = Object.freeze(Color.fromCssColorString("#EE82EE")); +Color.WHEAT = Object.freeze(Color.fromCssColorString("#F5DEB3")); +Color.WHITE = Object.freeze(Color.fromCssColorString("#FFFFFF")); +Color.WHITESMOKE = Object.freeze(Color.fromCssColorString("#F5F5F5")); +Color.YELLOW = Object.freeze(Color.fromCssColorString("#FFFF00")); +Color.YELLOWGREEN = Object.freeze(Color.fromCssColorString("#9ACD32")); +Color.TRANSPARENT = Object.freeze(new Color(0, 0, 0, 0)); +var Color_default = Color; + +export { + Color_default +}; diff --git a/public/assets/cesium/Workers/chunk-IBRIWOCM.js b/public/assets/cesium/Workers/chunk-IBRIWOCM.js new file mode 100644 index 0000000..9067ee4 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-IBRIWOCM.js @@ -0,0 +1,781 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default, + GeographicProjection_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/OffsetGeometryInstanceAttribute.js +function OffsetGeometryInstanceAttribute(x, y, z) { + x = defaultValue_default(x, 0); + y = defaultValue_default(y, 0); + z = defaultValue_default(z, 0); + this.value = new Float32Array([x, y, z]); +} +Object.defineProperties(OffsetGeometryInstanceAttribute.prototype, { + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link OffsetGeometryInstanceAttribute#value}. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {ComponentDatatype} + * @readonly + * + * @default {@link ComponentDatatype.FLOAT} + */ + componentDatatype: { + get: function() { + return ComponentDatatype_default.FLOAT; + } + }, + /** + * The number of components in the attributes, i.e., {@link OffsetGeometryInstanceAttribute#value}. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {number} + * @readonly + * + * @default 3 + */ + componentsPerAttribute: { + get: function() { + return 3; + } + }, + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * + * @memberof OffsetGeometryInstanceAttribute.prototype + * + * @type {boolean} + * @readonly + * + * @default false + */ + normalize: { + get: function() { + return false; + } + } +}); +OffsetGeometryInstanceAttribute.fromCartesian3 = function(offset) { + Check_default.defined("offset", offset); + return new OffsetGeometryInstanceAttribute(offset.x, offset.y, offset.z); +}; +OffsetGeometryInstanceAttribute.toValue = function(offset, result) { + Check_default.defined("offset", offset); + if (!defined_default(result)) { + result = new Float32Array([offset.x, offset.y, offset.z]); + } + result[0] = offset.x; + result[1] = offset.y; + result[2] = offset.z; + return result; +}; +var OffsetGeometryInstanceAttribute_default = OffsetGeometryInstanceAttribute; + +// packages/engine/Source/Scene/PrimitivePipeline.js +function transformToWorldCoordinates(instances, primitiveModelMatrix, scene3DOnly) { + let toWorld = !scene3DOnly; + const length = instances.length; + let i; + if (!toWorld && length > 1) { + const modelMatrix = instances[0].modelMatrix; + for (i = 1; i < length; ++i) { + if (!Matrix4_default.equals(modelMatrix, instances[i].modelMatrix)) { + toWorld = true; + break; + } + } + } + if (toWorld) { + for (i = 0; i < length; ++i) { + if (defined_default(instances[i].geometry)) { + GeometryPipeline_default.transformToWorldCoordinates(instances[i]); + } + } + } else { + Matrix4_default.multiplyTransformation( + primitiveModelMatrix, + instances[0].modelMatrix, + primitiveModelMatrix + ); + } +} +function addGeometryBatchId(geometry, batchId) { + const attributes = geometry.attributes; + const positionAttr = attributes.position; + const numberOfComponents = positionAttr.values.length / positionAttr.componentsPerAttribute; + attributes.batchId = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 1, + values: new Float32Array(numberOfComponents) + }); + const values = attributes.batchId.values; + for (let j = 0; j < numberOfComponents; ++j) { + values[j] = batchId; + } +} +function addBatchIds(instances) { + const length = instances.length; + for (let i = 0; i < length; ++i) { + const instance = instances[i]; + if (defined_default(instance.geometry)) { + addGeometryBatchId(instance.geometry, i); + } else if (defined_default(instance.westHemisphereGeometry) && defined_default(instance.eastHemisphereGeometry)) { + addGeometryBatchId(instance.westHemisphereGeometry, i); + addGeometryBatchId(instance.eastHemisphereGeometry, i); + } + } +} +function geometryPipeline(parameters) { + const instances = parameters.instances; + const projection = parameters.projection; + const uintIndexSupport = parameters.elementIndexUintSupported; + const scene3DOnly = parameters.scene3DOnly; + const vertexCacheOptimize = parameters.vertexCacheOptimize; + const compressVertices = parameters.compressVertices; + const modelMatrix = parameters.modelMatrix; + let i; + let geometry; + let primitiveType; + let length = instances.length; + for (i = 0; i < length; ++i) { + if (defined_default(instances[i].geometry)) { + primitiveType = instances[i].geometry.primitiveType; + break; + } + } + for (i = 1; i < length; ++i) { + if (defined_default(instances[i].geometry) && instances[i].geometry.primitiveType !== primitiveType) { + throw new DeveloperError_default( + "All instance geometries must have the same primitiveType." + ); + } + } + transformToWorldCoordinates(instances, modelMatrix, scene3DOnly); + if (!scene3DOnly) { + for (i = 0; i < length; ++i) { + if (defined_default(instances[i].geometry)) { + GeometryPipeline_default.splitLongitude(instances[i]); + } + } + } + addBatchIds(instances); + if (vertexCacheOptimize) { + for (i = 0; i < length; ++i) { + const instance = instances[i]; + if (defined_default(instance.geometry)) { + GeometryPipeline_default.reorderForPostVertexCache(instance.geometry); + GeometryPipeline_default.reorderForPreVertexCache(instance.geometry); + } else if (defined_default(instance.westHemisphereGeometry) && defined_default(instance.eastHemisphereGeometry)) { + GeometryPipeline_default.reorderForPostVertexCache( + instance.westHemisphereGeometry + ); + GeometryPipeline_default.reorderForPreVertexCache( + instance.westHemisphereGeometry + ); + GeometryPipeline_default.reorderForPostVertexCache( + instance.eastHemisphereGeometry + ); + GeometryPipeline_default.reorderForPreVertexCache( + instance.eastHemisphereGeometry + ); + } + } + } + let geometries = GeometryPipeline_default.combineInstances(instances); + length = geometries.length; + for (i = 0; i < length; ++i) { + geometry = geometries[i]; + const attributes = geometry.attributes; + if (!scene3DOnly) { + for (const name in attributes) { + if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype_default.DOUBLE) { + const name3D = `${name}3D`; + const name2D = `${name}2D`; + GeometryPipeline_default.projectTo2D( + geometry, + name, + name3D, + name2D, + projection + ); + if (defined_default(geometry.boundingSphere) && name === "position") { + geometry.boundingSphereCV = BoundingSphere_default.fromVertices( + geometry.attributes.position2D.values + ); + } + GeometryPipeline_default.encodeAttribute( + geometry, + name3D, + `${name3D}High`, + `${name3D}Low` + ); + GeometryPipeline_default.encodeAttribute( + geometry, + name2D, + `${name2D}High`, + `${name2D}Low` + ); + } + } + } else { + for (const name in attributes) { + if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype_default.DOUBLE) { + GeometryPipeline_default.encodeAttribute( + geometry, + name, + `${name}3DHigh`, + `${name}3DLow` + ); + } + } + } + if (compressVertices) { + GeometryPipeline_default.compressVertices(geometry); + } + } + if (!uintIndexSupport) { + let splitGeometries = []; + length = geometries.length; + for (i = 0; i < length; ++i) { + geometry = geometries[i]; + splitGeometries = splitGeometries.concat( + GeometryPipeline_default.fitToUnsignedShortIndices(geometry) + ); + } + geometries = splitGeometries; + } + return geometries; +} +function createPickOffsets(instances, geometryName, geometries, pickOffsets) { + let offset; + let indexCount; + let geometryIndex; + const offsetIndex = pickOffsets.length - 1; + if (offsetIndex >= 0) { + const pickOffset = pickOffsets[offsetIndex]; + offset = pickOffset.offset + pickOffset.count; + geometryIndex = pickOffset.index; + indexCount = geometries[geometryIndex].indices.length; + } else { + offset = 0; + geometryIndex = 0; + indexCount = geometries[geometryIndex].indices.length; + } + const length = instances.length; + for (let i = 0; i < length; ++i) { + const instance = instances[i]; + const geometry = instance[geometryName]; + if (!defined_default(geometry)) { + continue; + } + const count = geometry.indices.length; + if (offset + count > indexCount) { + offset = 0; + indexCount = geometries[++geometryIndex].indices.length; + } + pickOffsets.push({ + index: geometryIndex, + offset, + count + }); + offset += count; + } +} +function createInstancePickOffsets(instances, geometries) { + const pickOffsets = []; + createPickOffsets(instances, "geometry", geometries, pickOffsets); + createPickOffsets( + instances, + "westHemisphereGeometry", + geometries, + pickOffsets + ); + createPickOffsets( + instances, + "eastHemisphereGeometry", + geometries, + pickOffsets + ); + return pickOffsets; +} +var PrimitivePipeline = {}; +PrimitivePipeline.combineGeometry = function(parameters) { + let geometries; + let attributeLocations; + const instances = parameters.instances; + const length = instances.length; + let pickOffsets; + let offsetInstanceExtend; + let hasOffset = false; + if (length > 0) { + geometries = geometryPipeline(parameters); + if (geometries.length > 0) { + attributeLocations = GeometryPipeline_default.createAttributeLocations( + geometries[0] + ); + if (parameters.createPickOffsets) { + pickOffsets = createInstancePickOffsets(instances, geometries); + } + } + if (defined_default(instances[0].attributes) && defined_default(instances[0].attributes.offset)) { + offsetInstanceExtend = new Array(length); + hasOffset = true; + } + } + const boundingSpheres = new Array(length); + const boundingSpheresCV = new Array(length); + for (let i = 0; i < length; ++i) { + const instance = instances[i]; + const geometry = instance.geometry; + if (defined_default(geometry)) { + boundingSpheres[i] = geometry.boundingSphere; + boundingSpheresCV[i] = geometry.boundingSphereCV; + if (hasOffset) { + offsetInstanceExtend[i] = instance.geometry.offsetAttribute; + } + } + const eastHemisphereGeometry = instance.eastHemisphereGeometry; + const westHemisphereGeometry = instance.westHemisphereGeometry; + if (defined_default(eastHemisphereGeometry) && defined_default(westHemisphereGeometry)) { + if (defined_default(eastHemisphereGeometry.boundingSphere) && defined_default(westHemisphereGeometry.boundingSphere)) { + boundingSpheres[i] = BoundingSphere_default.union( + eastHemisphereGeometry.boundingSphere, + westHemisphereGeometry.boundingSphere + ); + } + if (defined_default(eastHemisphereGeometry.boundingSphereCV) && defined_default(westHemisphereGeometry.boundingSphereCV)) { + boundingSpheresCV[i] = BoundingSphere_default.union( + eastHemisphereGeometry.boundingSphereCV, + westHemisphereGeometry.boundingSphereCV + ); + } + } + } + return { + geometries, + modelMatrix: parameters.modelMatrix, + attributeLocations, + pickOffsets, + offsetInstanceExtend, + boundingSpheres, + boundingSpheresCV + }; +}; +function transferGeometry(geometry, transferableObjects) { + const attributes = geometry.attributes; + for (const name in attributes) { + if (attributes.hasOwnProperty(name)) { + const attribute = attributes[name]; + if (defined_default(attribute) && defined_default(attribute.values)) { + transferableObjects.push(attribute.values.buffer); + } + } + } + if (defined_default(geometry.indices)) { + transferableObjects.push(geometry.indices.buffer); + } +} +function transferGeometries(geometries, transferableObjects) { + const length = geometries.length; + for (let i = 0; i < length; ++i) { + transferGeometry(geometries[i], transferableObjects); + } +} +function countCreateGeometryResults(items) { + let count = 1; + const length = items.length; + for (let i = 0; i < length; i++) { + const geometry = items[i]; + ++count; + if (!defined_default(geometry)) { + continue; + } + const attributes = geometry.attributes; + count += 7 + 2 * BoundingSphere_default.packedLength + (defined_default(geometry.indices) ? geometry.indices.length : 0); + for (const property in attributes) { + if (attributes.hasOwnProperty(property) && defined_default(attributes[property])) { + const attribute = attributes[property]; + count += 5 + attribute.values.length; + } + } + } + return count; +} +PrimitivePipeline.packCreateGeometryResults = function(items, transferableObjects) { + const packedData = new Float64Array(countCreateGeometryResults(items)); + const stringTable = []; + const stringHash = {}; + const length = items.length; + let count = 0; + packedData[count++] = length; + for (let i = 0; i < length; i++) { + const geometry = items[i]; + const validGeometry = defined_default(geometry); + packedData[count++] = validGeometry ? 1 : 0; + if (!validGeometry) { + continue; + } + packedData[count++] = geometry.primitiveType; + packedData[count++] = geometry.geometryType; + packedData[count++] = defaultValue_default(geometry.offsetAttribute, -1); + const validBoundingSphere = defined_default(geometry.boundingSphere) ? 1 : 0; + packedData[count++] = validBoundingSphere; + if (validBoundingSphere) { + BoundingSphere_default.pack(geometry.boundingSphere, packedData, count); + } + count += BoundingSphere_default.packedLength; + const validBoundingSphereCV = defined_default(geometry.boundingSphereCV) ? 1 : 0; + packedData[count++] = validBoundingSphereCV; + if (validBoundingSphereCV) { + BoundingSphere_default.pack(geometry.boundingSphereCV, packedData, count); + } + count += BoundingSphere_default.packedLength; + const attributes = geometry.attributes; + const attributesToWrite = []; + for (const property in attributes) { + if (attributes.hasOwnProperty(property) && defined_default(attributes[property])) { + attributesToWrite.push(property); + if (!defined_default(stringHash[property])) { + stringHash[property] = stringTable.length; + stringTable.push(property); + } + } + } + packedData[count++] = attributesToWrite.length; + for (let q = 0; q < attributesToWrite.length; q++) { + const name = attributesToWrite[q]; + const attribute = attributes[name]; + packedData[count++] = stringHash[name]; + packedData[count++] = attribute.componentDatatype; + packedData[count++] = attribute.componentsPerAttribute; + packedData[count++] = attribute.normalize ? 1 : 0; + packedData[count++] = attribute.values.length; + packedData.set(attribute.values, count); + count += attribute.values.length; + } + const indicesLength = defined_default(geometry.indices) ? geometry.indices.length : 0; + packedData[count++] = indicesLength; + if (indicesLength > 0) { + packedData.set(geometry.indices, count); + count += indicesLength; + } + } + transferableObjects.push(packedData.buffer); + return { + stringTable, + packedData + }; +}; +PrimitivePipeline.unpackCreateGeometryResults = function(createGeometryResult) { + const stringTable = createGeometryResult.stringTable; + const packedGeometry = createGeometryResult.packedData; + let i; + const result = new Array(packedGeometry[0]); + let resultIndex = 0; + let packedGeometryIndex = 1; + while (packedGeometryIndex < packedGeometry.length) { + const valid = packedGeometry[packedGeometryIndex++] === 1; + if (!valid) { + result[resultIndex++] = void 0; + continue; + } + const primitiveType = packedGeometry[packedGeometryIndex++]; + const geometryType = packedGeometry[packedGeometryIndex++]; + let offsetAttribute = packedGeometry[packedGeometryIndex++]; + if (offsetAttribute === -1) { + offsetAttribute = void 0; + } + let boundingSphere; + let boundingSphereCV; + const validBoundingSphere = packedGeometry[packedGeometryIndex++] === 1; + if (validBoundingSphere) { + boundingSphere = BoundingSphere_default.unpack( + packedGeometry, + packedGeometryIndex + ); + } + packedGeometryIndex += BoundingSphere_default.packedLength; + const validBoundingSphereCV = packedGeometry[packedGeometryIndex++] === 1; + if (validBoundingSphereCV) { + boundingSphereCV = BoundingSphere_default.unpack( + packedGeometry, + packedGeometryIndex + ); + } + packedGeometryIndex += BoundingSphere_default.packedLength; + let length; + let values; + let componentsPerAttribute; + const attributes = new GeometryAttributes_default(); + const numAttributes = packedGeometry[packedGeometryIndex++]; + for (i = 0; i < numAttributes; i++) { + const name = stringTable[packedGeometry[packedGeometryIndex++]]; + const componentDatatype = packedGeometry[packedGeometryIndex++]; + componentsPerAttribute = packedGeometry[packedGeometryIndex++]; + const normalize = packedGeometry[packedGeometryIndex++] !== 0; + length = packedGeometry[packedGeometryIndex++]; + values = ComponentDatatype_default.createTypedArray(componentDatatype, length); + for (let valuesIndex = 0; valuesIndex < length; valuesIndex++) { + values[valuesIndex] = packedGeometry[packedGeometryIndex++]; + } + attributes[name] = new GeometryAttribute_default({ + componentDatatype, + componentsPerAttribute, + normalize, + values + }); + } + let indices; + length = packedGeometry[packedGeometryIndex++]; + if (length > 0) { + const numberOfVertices = values.length / componentsPerAttribute; + indices = IndexDatatype_default.createTypedArray(numberOfVertices, length); + for (i = 0; i < length; i++) { + indices[i] = packedGeometry[packedGeometryIndex++]; + } + } + result[resultIndex++] = new Geometry_default({ + primitiveType, + geometryType, + boundingSphere, + boundingSphereCV, + indices, + attributes, + offsetAttribute + }); + } + return result; +}; +function packInstancesForCombine(instances, transferableObjects) { + const length = instances.length; + const packedData = new Float64Array(1 + length * 19); + let count = 0; + packedData[count++] = length; + for (let i = 0; i < length; i++) { + const instance = instances[i]; + Matrix4_default.pack(instance.modelMatrix, packedData, count); + count += Matrix4_default.packedLength; + if (defined_default(instance.attributes) && defined_default(instance.attributes.offset)) { + const values = instance.attributes.offset.value; + packedData[count] = values[0]; + packedData[count + 1] = values[1]; + packedData[count + 2] = values[2]; + } + count += 3; + } + transferableObjects.push(packedData.buffer); + return packedData; +} +function unpackInstancesForCombine(data) { + const packedInstances = data; + const result = new Array(packedInstances[0]); + let count = 0; + let i = 1; + while (i < packedInstances.length) { + const modelMatrix = Matrix4_default.unpack(packedInstances, i); + let attributes; + i += Matrix4_default.packedLength; + if (defined_default(packedInstances[i])) { + attributes = { + offset: new OffsetGeometryInstanceAttribute_default( + packedInstances[i], + packedInstances[i + 1], + packedInstances[i + 2] + ) + }; + } + i += 3; + result[count++] = { + modelMatrix, + attributes + }; + } + return result; +} +PrimitivePipeline.packCombineGeometryParameters = function(parameters, transferableObjects) { + const createGeometryResults = parameters.createGeometryResults; + const length = createGeometryResults.length; + for (let i = 0; i < length; i++) { + transferableObjects.push(createGeometryResults[i].packedData.buffer); + } + return { + createGeometryResults: parameters.createGeometryResults, + packedInstances: packInstancesForCombine( + parameters.instances, + transferableObjects + ), + ellipsoid: parameters.ellipsoid, + isGeographic: parameters.projection instanceof GeographicProjection_default, + elementIndexUintSupported: parameters.elementIndexUintSupported, + scene3DOnly: parameters.scene3DOnly, + vertexCacheOptimize: parameters.vertexCacheOptimize, + compressVertices: parameters.compressVertices, + modelMatrix: parameters.modelMatrix, + createPickOffsets: parameters.createPickOffsets + }; +}; +PrimitivePipeline.unpackCombineGeometryParameters = function(packedParameters) { + const instances = unpackInstancesForCombine(packedParameters.packedInstances); + const createGeometryResults = packedParameters.createGeometryResults; + const length = createGeometryResults.length; + let instanceIndex = 0; + for (let resultIndex = 0; resultIndex < length; resultIndex++) { + const geometries = PrimitivePipeline.unpackCreateGeometryResults( + createGeometryResults[resultIndex] + ); + const geometriesLength = geometries.length; + for (let geometryIndex = 0; geometryIndex < geometriesLength; geometryIndex++) { + const geometry = geometries[geometryIndex]; + const instance = instances[instanceIndex]; + instance.geometry = geometry; + ++instanceIndex; + } + } + const ellipsoid = Ellipsoid_default.clone(packedParameters.ellipsoid); + const projection = packedParameters.isGeographic ? new GeographicProjection_default(ellipsoid) : new WebMercatorProjection_default(ellipsoid); + return { + instances, + ellipsoid, + projection, + elementIndexUintSupported: packedParameters.elementIndexUintSupported, + scene3DOnly: packedParameters.scene3DOnly, + vertexCacheOptimize: packedParameters.vertexCacheOptimize, + compressVertices: packedParameters.compressVertices, + modelMatrix: Matrix4_default.clone(packedParameters.modelMatrix), + createPickOffsets: packedParameters.createPickOffsets + }; +}; +function packBoundingSpheres(boundingSpheres) { + const length = boundingSpheres.length; + const bufferLength = 1 + (BoundingSphere_default.packedLength + 1) * length; + const buffer = new Float32Array(bufferLength); + let bufferIndex = 0; + buffer[bufferIndex++] = length; + for (let i = 0; i < length; ++i) { + const bs = boundingSpheres[i]; + if (!defined_default(bs)) { + buffer[bufferIndex++] = 0; + } else { + buffer[bufferIndex++] = 1; + BoundingSphere_default.pack(boundingSpheres[i], buffer, bufferIndex); + } + bufferIndex += BoundingSphere_default.packedLength; + } + return buffer; +} +function unpackBoundingSpheres(buffer) { + const result = new Array(buffer[0]); + let count = 0; + let i = 1; + while (i < buffer.length) { + if (buffer[i++] === 1) { + result[count] = BoundingSphere_default.unpack(buffer, i); + } + ++count; + i += BoundingSphere_default.packedLength; + } + return result; +} +PrimitivePipeline.packCombineGeometryResults = function(results, transferableObjects) { + if (defined_default(results.geometries)) { + transferGeometries(results.geometries, transferableObjects); + } + const packedBoundingSpheres = packBoundingSpheres(results.boundingSpheres); + const packedBoundingSpheresCV = packBoundingSpheres( + results.boundingSpheresCV + ); + transferableObjects.push( + packedBoundingSpheres.buffer, + packedBoundingSpheresCV.buffer + ); + return { + geometries: results.geometries, + attributeLocations: results.attributeLocations, + modelMatrix: results.modelMatrix, + pickOffsets: results.pickOffsets, + offsetInstanceExtend: results.offsetInstanceExtend, + boundingSpheres: packedBoundingSpheres, + boundingSpheresCV: packedBoundingSpheresCV + }; +}; +PrimitivePipeline.unpackCombineGeometryResults = function(packedResult) { + return { + geometries: packedResult.geometries, + attributeLocations: packedResult.attributeLocations, + modelMatrix: packedResult.modelMatrix, + pickOffsets: packedResult.pickOffsets, + offsetInstanceExtend: packedResult.offsetInstanceExtend, + boundingSpheres: unpackBoundingSpheres(packedResult.boundingSpheres), + boundingSpheresCV: unpackBoundingSpheres(packedResult.boundingSpheresCV) + }; +}; +var PrimitivePipeline_default = PrimitivePipeline; + +export { + PrimitivePipeline_default +}; diff --git a/public/assets/cesium/Workers/chunk-IZGUQO6Q.js b/public/assets/cesium/Workers/chunk-IZGUQO6Q.js new file mode 100644 index 0000000..f000725 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-IZGUQO6Q.js @@ -0,0 +1,511 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidGeometry.js +var scratchPosition = new Cartesian3_default(); +var scratchNormal = new Cartesian3_default(); +var scratchTangent = new Cartesian3_default(); +var scratchBitangent = new Cartesian3_default(); +var scratchNormalST = new Cartesian3_default(); +var defaultRadii = new Cartesian3_default(1, 1, 1); +var cos = Math.cos; +var sin = Math.sin; +function EllipsoidGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const radii = defaultValue_default(options.radii, defaultRadii); + const innerRadii = defaultValue_default(options.innerRadii, radii); + const minimumClock = defaultValue_default(options.minimumClock, 0); + const maximumClock = defaultValue_default(options.maximumClock, Math_default.TWO_PI); + const minimumCone = defaultValue_default(options.minimumCone, 0); + const maximumCone = defaultValue_default(options.maximumCone, Math_default.PI); + const stackPartitions = Math.round(defaultValue_default(options.stackPartitions, 64)); + const slicePartitions = Math.round(defaultValue_default(options.slicePartitions, 64)); + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + if (slicePartitions < 3) { + throw new DeveloperError_default( + "options.slicePartitions cannot be less than three." + ); + } + if (stackPartitions < 3) { + throw new DeveloperError_default( + "options.stackPartitions cannot be less than three." + ); + } + this._radii = Cartesian3_default.clone(radii); + this._innerRadii = Cartesian3_default.clone(innerRadii); + this._minimumClock = minimumClock; + this._maximumClock = maximumClock; + this._minimumCone = minimumCone; + this._maximumCone = maximumCone; + this._stackPartitions = stackPartitions; + this._slicePartitions = slicePartitions; + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createEllipsoidGeometry"; +} +EllipsoidGeometry.packedLength = 2 * Cartesian3_default.packedLength + VertexFormat_default.packedLength + 7; +EllipsoidGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._radii, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Cartesian3_default.pack(value._innerRadii, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._minimumClock; + array[startingIndex++] = value._maximumClock; + array[startingIndex++] = value._minimumCone; + array[startingIndex++] = value._maximumCone; + array[startingIndex++] = value._stackPartitions; + array[startingIndex++] = value._slicePartitions; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchRadii = new Cartesian3_default(); +var scratchInnerRadii = new Cartesian3_default(); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + radii: scratchRadii, + innerRadii: scratchInnerRadii, + vertexFormat: scratchVertexFormat, + minimumClock: void 0, + maximumClock: void 0, + minimumCone: void 0, + maximumCone: void 0, + stackPartitions: void 0, + slicePartitions: void 0, + offsetAttribute: void 0 +}; +EllipsoidGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + const radii = Cartesian3_default.unpack(array, startingIndex, scratchRadii); + startingIndex += Cartesian3_default.packedLength; + const innerRadii = Cartesian3_default.unpack(array, startingIndex, scratchInnerRadii); + startingIndex += Cartesian3_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const minimumClock = array[startingIndex++]; + const maximumClock = array[startingIndex++]; + const minimumCone = array[startingIndex++]; + const maximumCone = array[startingIndex++]; + const stackPartitions = array[startingIndex++]; + const slicePartitions = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.minimumClock = minimumClock; + scratchOptions.maximumClock = maximumClock; + scratchOptions.minimumCone = minimumCone; + scratchOptions.maximumCone = maximumCone; + scratchOptions.stackPartitions = stackPartitions; + scratchOptions.slicePartitions = slicePartitions; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new EllipsoidGeometry(scratchOptions); + } + result._radii = Cartesian3_default.clone(radii, result._radii); + result._innerRadii = Cartesian3_default.clone(innerRadii, result._innerRadii); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._minimumClock = minimumClock; + result._maximumClock = maximumClock; + result._minimumCone = minimumCone; + result._maximumCone = maximumCone; + result._stackPartitions = stackPartitions; + result._slicePartitions = slicePartitions; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) { + const radii = ellipsoidGeometry._radii; + if (radii.x <= 0 || radii.y <= 0 || radii.z <= 0) { + return; + } + const innerRadii = ellipsoidGeometry._innerRadii; + if (innerRadii.x <= 0 || innerRadii.y <= 0 || innerRadii.z <= 0) { + return; + } + const minimumClock = ellipsoidGeometry._minimumClock; + const maximumClock = ellipsoidGeometry._maximumClock; + const minimumCone = ellipsoidGeometry._minimumCone; + const maximumCone = ellipsoidGeometry._maximumCone; + const vertexFormat = ellipsoidGeometry._vertexFormat; + let slicePartitions = ellipsoidGeometry._slicePartitions + 1; + let stackPartitions = ellipsoidGeometry._stackPartitions + 1; + slicePartitions = Math.round( + slicePartitions * Math.abs(maximumClock - minimumClock) / Math_default.TWO_PI + ); + stackPartitions = Math.round( + stackPartitions * Math.abs(maximumCone - minimumCone) / Math_default.PI + ); + if (slicePartitions < 2) { + slicePartitions = 2; + } + if (stackPartitions < 2) { + stackPartitions = 2; + } + let i; + let j; + let index = 0; + const phis = [minimumCone]; + const thetas = [minimumClock]; + for (i = 0; i < stackPartitions; i++) { + phis.push( + minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1) + ); + } + phis.push(maximumCone); + for (j = 0; j < slicePartitions; j++) { + thetas.push( + minimumClock + j * (maximumClock - minimumClock) / (slicePartitions - 1) + ); + } + thetas.push(maximumClock); + const numPhis = phis.length; + const numThetas = thetas.length; + let extraIndices = 0; + let vertexMultiplier = 1; + const hasInnerSurface = innerRadii.x !== radii.x || innerRadii.y !== radii.y || innerRadii.z !== radii.z; + let isTopOpen = false; + let isBotOpen = false; + let isClockOpen = false; + if (hasInnerSurface) { + vertexMultiplier = 2; + if (minimumCone > 0) { + isTopOpen = true; + extraIndices += slicePartitions - 1; + } + if (maximumCone < Math.PI) { + isBotOpen = true; + extraIndices += slicePartitions - 1; + } + if ((maximumClock - minimumClock) % Math_default.TWO_PI) { + isClockOpen = true; + extraIndices += (stackPartitions - 1) * 2 + 1; + } else { + extraIndices += 1; + } + } + const vertexCount = numThetas * numPhis * vertexMultiplier; + const positions = new Float64Array(vertexCount * 3); + const isInner = new Array(vertexCount).fill(false); + const negateNormal = new Array(vertexCount).fill(false); + const indexCount = slicePartitions * stackPartitions * vertexMultiplier; + const numIndices = 6 * (indexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier); + const indices = IndexDatatype_default.createTypedArray(indexCount, numIndices); + const normals = vertexFormat.normal ? new Float32Array(vertexCount * 3) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(vertexCount * 3) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(vertexCount * 3) : void 0; + const st = vertexFormat.st ? new Float32Array(vertexCount * 2) : void 0; + const sinPhi = new Array(numPhis); + const cosPhi = new Array(numPhis); + for (i = 0; i < numPhis; i++) { + sinPhi[i] = sin(phis[i]); + cosPhi[i] = cos(phis[i]); + } + const sinTheta = new Array(numThetas); + const cosTheta = new Array(numThetas); + for (j = 0; j < numThetas; j++) { + cosTheta[j] = cos(thetas[j]); + sinTheta[j] = sin(thetas[j]); + } + for (i = 0; i < numPhis; i++) { + for (j = 0; j < numThetas; j++) { + positions[index++] = radii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = radii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = radii.z * cosPhi[i]; + } + } + let vertexIndex = vertexCount / 2; + if (hasInnerSurface) { + for (i = 0; i < numPhis; i++) { + for (j = 0; j < numThetas; j++) { + positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = innerRadii.z * cosPhi[i]; + isInner[vertexIndex] = true; + if (i > 0 && i !== numPhis - 1 && j !== 0 && j !== numThetas - 1) { + negateNormal[vertexIndex] = true; + } + vertexIndex++; + } + } + } + index = 0; + let topOffset; + let bottomOffset; + for (i = 1; i < numPhis - 2; i++) { + topOffset = i * numThetas; + bottomOffset = (i + 1) * numThetas; + for (j = 1; j < numThetas - 2; j++) { + indices[index++] = bottomOffset + j; + indices[index++] = bottomOffset + j + 1; + indices[index++] = topOffset + j + 1; + indices[index++] = bottomOffset + j; + indices[index++] = topOffset + j + 1; + indices[index++] = topOffset + j; + } + } + if (hasInnerSurface) { + const offset = numPhis * numThetas; + for (i = 1; i < numPhis - 2; i++) { + topOffset = offset + i * numThetas; + bottomOffset = offset + (i + 1) * numThetas; + for (j = 1; j < numThetas - 2; j++) { + indices[index++] = bottomOffset + j; + indices[index++] = topOffset + j; + indices[index++] = topOffset + j + 1; + indices[index++] = bottomOffset + j; + indices[index++] = topOffset + j + 1; + indices[index++] = bottomOffset + j + 1; + } + } + } + let outerOffset; + let innerOffset; + if (hasInnerSurface) { + if (isTopOpen) { + innerOffset = numPhis * numThetas; + for (i = 1; i < numThetas - 2; i++) { + indices[index++] = i; + indices[index++] = i + 1; + indices[index++] = innerOffset + i + 1; + indices[index++] = i; + indices[index++] = innerOffset + i + 1; + indices[index++] = innerOffset + i; + } + } + if (isBotOpen) { + outerOffset = numPhis * numThetas - numThetas; + innerOffset = numPhis * numThetas * vertexMultiplier - numThetas; + for (i = 1; i < numThetas - 2; i++) { + indices[index++] = outerOffset + i + 1; + indices[index++] = outerOffset + i; + indices[index++] = innerOffset + i; + indices[index++] = outerOffset + i + 1; + indices[index++] = innerOffset + i; + indices[index++] = innerOffset + i + 1; + } + } + } + if (isClockOpen) { + for (i = 1; i < numPhis - 2; i++) { + innerOffset = numThetas * numPhis + numThetas * i; + outerOffset = numThetas * i; + indices[index++] = innerOffset; + indices[index++] = outerOffset + numThetas; + indices[index++] = outerOffset; + indices[index++] = innerOffset; + indices[index++] = innerOffset + numThetas; + indices[index++] = outerOffset + numThetas; + } + for (i = 1; i < numPhis - 2; i++) { + innerOffset = numThetas * numPhis + numThetas * (i + 1) - 1; + outerOffset = numThetas * (i + 1) - 1; + indices[index++] = outerOffset + numThetas; + indices[index++] = innerOffset; + indices[index++] = outerOffset; + indices[index++] = outerOffset + numThetas; + indices[index++] = innerOffset + numThetas; + indices[index++] = innerOffset; + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + } + let stIndex = 0; + let normalIndex = 0; + let tangentIndex = 0; + let bitangentIndex = 0; + const vertexCountHalf = vertexCount / 2; + let ellipsoid; + const ellipsoidOuter = Ellipsoid_default.fromCartesian3(radii); + const ellipsoidInner = Ellipsoid_default.fromCartesian3(innerRadii); + if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + for (i = 0; i < vertexCount; i++) { + ellipsoid = isInner[i] ? ellipsoidInner : ellipsoidOuter; + const position = Cartesian3_default.fromArray(positions, i * 3, scratchPosition); + const normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal); + if (negateNormal[i]) { + Cartesian3_default.negate(normal, normal); + } + if (vertexFormat.st) { + const normalST = Cartesian2_default.negate(normal, scratchNormalST); + st[stIndex++] = Math.atan2(normalST.y, normalST.x) / Math_default.TWO_PI + 0.5; + st[stIndex++] = Math.asin(normal.z) / Math.PI + 0.5; + } + if (vertexFormat.normal) { + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + } + if (vertexFormat.tangent || vertexFormat.bitangent) { + const tangent = scratchTangent; + let tangetOffset = 0; + let unit; + if (isInner[i]) { + tangetOffset = vertexCountHalf; + } + if (!isTopOpen && i >= tangetOffset && i < tangetOffset + numThetas * 2) { + unit = Cartesian3_default.UNIT_X; + } else { + unit = Cartesian3_default.UNIT_Z; + } + Cartesian3_default.cross(unit, normal, tangent); + Cartesian3_default.normalize(tangent, tangent); + if (vertexFormat.tangent) { + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + } + if (vertexFormat.bitangent) { + const bitangent = Cartesian3_default.cross(normal, tangent, scratchBitangent); + Cartesian3_default.normalize(bitangent, bitangent); + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + } + } + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: st + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + } + if (defined_default(ellipsoidGeometry._offsetAttribute)) { + const length = positions.length; + const offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: BoundingSphere_default.fromEllipsoid(ellipsoidOuter), + offsetAttribute: ellipsoidGeometry._offsetAttribute + }); +}; +var unitEllipsoidGeometry; +EllipsoidGeometry.getUnitEllipsoid = function() { + if (!defined_default(unitEllipsoidGeometry)) { + unitEllipsoidGeometry = EllipsoidGeometry.createGeometry( + new EllipsoidGeometry({ + radii: new Cartesian3_default(1, 1, 1), + vertexFormat: VertexFormat_default.POSITION_ONLY + }) + ); + } + return unitEllipsoidGeometry; +}; +var EllipsoidGeometry_default = EllipsoidGeometry; + +export { + EllipsoidGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-IZJ42N4W.js b/public/assets/cesium/Workers/chunk-IZJ42N4W.js new file mode 100644 index 0000000..f4a3dee --- /dev/null +++ b/public/assets/cesium/Workers/chunk-IZJ42N4W.js @@ -0,0 +1,1052 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import { + PolygonPipeline_default, + WindingOrder_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import { + EllipsoidRhumbLine_default +} from "./chunk-JSQJDZI4.js"; +import { + IntersectionTests_default +} from "./chunk-QQOZO7KO.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolygonHierarchy.js +function PolygonHierarchy(positions, holes) { + this.positions = defined_default(positions) ? positions : []; + this.holes = defined_default(holes) ? holes : []; +} +var PolygonHierarchy_default = PolygonHierarchy; + +// packages/engine/Source/Core/Queue.js +function Queue() { + this._array = []; + this._offset = 0; + this._length = 0; +} +Object.defineProperties(Queue.prototype, { + /** + * The length of the queue. + * + * @memberof Queue.prototype + * + * @type {number} + * @readonly + */ + length: { + get: function() { + return this._length; + } + } +}); +Queue.prototype.enqueue = function(item) { + this._array.push(item); + this._length++; +}; +Queue.prototype.dequeue = function() { + if (this._length === 0) { + return void 0; + } + const array = this._array; + let offset = this._offset; + const item = array[offset]; + array[offset] = void 0; + offset++; + if (offset > 10 && offset * 2 > array.length) { + this._array = array.slice(offset); + offset = 0; + } + this._offset = offset; + this._length--; + return item; +}; +Queue.prototype.peek = function() { + if (this._length === 0) { + return void 0; + } + return this._array[this._offset]; +}; +Queue.prototype.contains = function(item) { + return this._array.indexOf(item) !== -1; +}; +Queue.prototype.clear = function() { + this._array.length = this._offset = this._length = 0; +}; +Queue.prototype.sort = function(compareFunction) { + if (this._offset > 0) { + this._array = this._array.slice(this._offset); + this._offset = 0; + } + this._array.sort(compareFunction); +}; +var Queue_default = Queue; + +// packages/engine/Source/Core/PolygonGeometryLibrary.js +var PolygonGeometryLibrary = {}; +PolygonGeometryLibrary.computeHierarchyPackedLength = function(polygonHierarchy, CartesianX) { + let numComponents = 0; + const stack = [polygonHierarchy]; + while (stack.length > 0) { + const hierarchy = stack.pop(); + if (!defined_default(hierarchy)) { + continue; + } + numComponents += 2; + const positions = hierarchy.positions; + const holes = hierarchy.holes; + if (defined_default(positions) && positions.length > 0) { + numComponents += positions.length * CartesianX.packedLength; + } + if (defined_default(holes)) { + const length = holes.length; + for (let i = 0; i < length; ++i) { + stack.push(holes[i]); + } + } + } + return numComponents; +}; +PolygonGeometryLibrary.packPolygonHierarchy = function(polygonHierarchy, array, startingIndex, CartesianX) { + const stack = [polygonHierarchy]; + while (stack.length > 0) { + const hierarchy = stack.pop(); + if (!defined_default(hierarchy)) { + continue; + } + const positions = hierarchy.positions; + const holes = hierarchy.holes; + array[startingIndex++] = defined_default(positions) ? positions.length : 0; + array[startingIndex++] = defined_default(holes) ? holes.length : 0; + if (defined_default(positions)) { + const positionsLength = positions.length; + for (let i = 0; i < positionsLength; ++i, startingIndex += CartesianX.packedLength) { + CartesianX.pack(positions[i], array, startingIndex); + } + } + if (defined_default(holes)) { + const holesLength = holes.length; + for (let j = 0; j < holesLength; ++j) { + stack.push(holes[j]); + } + } + } + return startingIndex; +}; +PolygonGeometryLibrary.unpackPolygonHierarchy = function(array, startingIndex, CartesianX) { + const positionsLength = array[startingIndex++]; + const holesLength = array[startingIndex++]; + const positions = new Array(positionsLength); + const holes = holesLength > 0 ? new Array(holesLength) : void 0; + for (let i = 0; i < positionsLength; ++i, startingIndex += CartesianX.packedLength) { + positions[i] = CartesianX.unpack(array, startingIndex); + } + for (let j = 0; j < holesLength; ++j) { + holes[j] = PolygonGeometryLibrary.unpackPolygonHierarchy( + array, + startingIndex, + CartesianX + ); + startingIndex = holes[j].startingIndex; + delete holes[j].startingIndex; + } + return { + positions, + holes, + startingIndex + }; +}; +var distance2DScratch = new Cartesian2_default(); +function getPointAtDistance2D(p0, p1, distance, length) { + Cartesian2_default.subtract(p1, p0, distance2DScratch); + Cartesian2_default.multiplyByScalar( + distance2DScratch, + distance / length, + distance2DScratch + ); + Cartesian2_default.add(p0, distance2DScratch, distance2DScratch); + return [distance2DScratch.x, distance2DScratch.y]; +} +var distanceScratch = new Cartesian3_default(); +function getPointAtDistance(p0, p1, distance, length) { + Cartesian3_default.subtract(p1, p0, distanceScratch); + Cartesian3_default.multiplyByScalar( + distanceScratch, + distance / length, + distanceScratch + ); + Cartesian3_default.add(p0, distanceScratch, distanceScratch); + return [distanceScratch.x, distanceScratch.y, distanceScratch.z]; +} +PolygonGeometryLibrary.subdivideLineCount = function(p0, p1, minDistance) { + const distance = Cartesian3_default.distance(p0, p1); + const n = distance / minDistance; + const countDivide = Math.max(0, Math.ceil(Math_default.log2(n))); + return Math.pow(2, countDivide); +}; +var scratchCartographic0 = new Cartographic_default(); +var scratchCartographic1 = new Cartographic_default(); +var scratchCartographic2 = new Cartographic_default(); +var scratchCartesian0 = new Cartesian3_default(); +var scratchRhumbLine = new EllipsoidRhumbLine_default(); +PolygonGeometryLibrary.subdivideRhumbLineCount = function(ellipsoid, p0, p1, minDistance) { + const c0 = ellipsoid.cartesianToCartographic(p0, scratchCartographic0); + const c1 = ellipsoid.cartesianToCartographic(p1, scratchCartographic1); + const rhumb = new EllipsoidRhumbLine_default(c0, c1, ellipsoid); + const n = rhumb.surfaceDistance / minDistance; + const countDivide = Math.max(0, Math.ceil(Math_default.log2(n))); + return Math.pow(2, countDivide); +}; +PolygonGeometryLibrary.subdivideTexcoordLine = function(t0, t1, p0, p1, minDistance, result) { + const subdivisions = PolygonGeometryLibrary.subdivideLineCount( + p0, + p1, + minDistance + ); + const length2D = Cartesian2_default.distance(t0, t1); + const distanceBetweenCoords = length2D / subdivisions; + const texcoords = result; + texcoords.length = subdivisions * 2; + let index = 0; + for (let i = 0; i < subdivisions; i++) { + const t = getPointAtDistance2D(t0, t1, i * distanceBetweenCoords, length2D); + texcoords[index++] = t[0]; + texcoords[index++] = t[1]; + } + return texcoords; +}; +PolygonGeometryLibrary.subdivideLine = function(p0, p1, minDistance, result) { + const numVertices = PolygonGeometryLibrary.subdivideLineCount( + p0, + p1, + minDistance + ); + const length = Cartesian3_default.distance(p0, p1); + const distanceBetweenVertices = length / numVertices; + if (!defined_default(result)) { + result = []; + } + const positions = result; + positions.length = numVertices * 3; + let index = 0; + for (let i = 0; i < numVertices; i++) { + const p = getPointAtDistance(p0, p1, i * distanceBetweenVertices, length); + positions[index++] = p[0]; + positions[index++] = p[1]; + positions[index++] = p[2]; + } + return positions; +}; +PolygonGeometryLibrary.subdivideTexcoordRhumbLine = function(t0, t1, ellipsoid, p0, p1, minDistance, result) { + const c0 = ellipsoid.cartesianToCartographic(p0, scratchCartographic0); + const c1 = ellipsoid.cartesianToCartographic(p1, scratchCartographic1); + scratchRhumbLine.setEndPoints(c0, c1); + const n = scratchRhumbLine.surfaceDistance / minDistance; + const countDivide = Math.max(0, Math.ceil(Math_default.log2(n))); + const subdivisions = Math.pow(2, countDivide); + const length2D = Cartesian2_default.distance(t0, t1); + const distanceBetweenCoords = length2D / subdivisions; + const texcoords = result; + texcoords.length = subdivisions * 2; + let index = 0; + for (let i = 0; i < subdivisions; i++) { + const t = getPointAtDistance2D(t0, t1, i * distanceBetweenCoords, length2D); + texcoords[index++] = t[0]; + texcoords[index++] = t[1]; + } + return texcoords; +}; +PolygonGeometryLibrary.subdivideRhumbLine = function(ellipsoid, p0, p1, minDistance, result) { + const c0 = ellipsoid.cartesianToCartographic(p0, scratchCartographic0); + const c1 = ellipsoid.cartesianToCartographic(p1, scratchCartographic1); + const rhumb = new EllipsoidRhumbLine_default(c0, c1, ellipsoid); + const n = rhumb.surfaceDistance / minDistance; + const countDivide = Math.max(0, Math.ceil(Math_default.log2(n))); + const numVertices = Math.pow(2, countDivide); + const distanceBetweenVertices = rhumb.surfaceDistance / numVertices; + if (!defined_default(result)) { + result = []; + } + const positions = result; + positions.length = numVertices * 3; + let index = 0; + for (let i = 0; i < numVertices; i++) { + const c = rhumb.interpolateUsingSurfaceDistance( + i * distanceBetweenVertices, + scratchCartographic2 + ); + const p = ellipsoid.cartographicToCartesian(c, scratchCartesian0); + positions[index++] = p.x; + positions[index++] = p.y; + positions[index++] = p.z; + } + return positions; +}; +var scaleToGeodeticHeightN1 = new Cartesian3_default(); +var scaleToGeodeticHeightN2 = new Cartesian3_default(); +var scaleToGeodeticHeightP1 = new Cartesian3_default(); +var scaleToGeodeticHeightP2 = new Cartesian3_default(); +PolygonGeometryLibrary.scaleToGeodeticHeightExtruded = function(geometry, maxHeight, minHeight, ellipsoid, perPositionHeight) { + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + const n1 = scaleToGeodeticHeightN1; + let n2 = scaleToGeodeticHeightN2; + const p = scaleToGeodeticHeightP1; + let p2 = scaleToGeodeticHeightP2; + if (defined_default(geometry) && defined_default(geometry.attributes) && defined_default(geometry.attributes.position)) { + const positions = geometry.attributes.position.values; + const length = positions.length / 2; + for (let i = 0; i < length; i += 3) { + Cartesian3_default.fromArray(positions, i, p); + ellipsoid.geodeticSurfaceNormal(p, n1); + p2 = ellipsoid.scaleToGeodeticSurface(p, p2); + n2 = Cartesian3_default.multiplyByScalar(n1, minHeight, n2); + n2 = Cartesian3_default.add(p2, n2, n2); + positions[i + length] = n2.x; + positions[i + 1 + length] = n2.y; + positions[i + 2 + length] = n2.z; + if (perPositionHeight) { + p2 = Cartesian3_default.clone(p, p2); + } + n2 = Cartesian3_default.multiplyByScalar(n1, maxHeight, n2); + n2 = Cartesian3_default.add(p2, n2, n2); + positions[i] = n2.x; + positions[i + 1] = n2.y; + positions[i + 2] = n2.z; + } + } + return geometry; +}; +PolygonGeometryLibrary.polygonOutlinesFromHierarchy = function(polygonHierarchy, scaleToEllipsoidSurface, ellipsoid) { + const polygons = []; + const queue = new Queue_default(); + queue.enqueue(polygonHierarchy); + let i; + let j; + let length; + while (queue.length !== 0) { + const outerNode = queue.dequeue(); + let outerRing = outerNode.positions; + if (scaleToEllipsoidSurface) { + length = outerRing.length; + for (i = 0; i < length; i++) { + ellipsoid.scaleToGeodeticSurface(outerRing[i], outerRing[i]); + } + } + outerRing = arrayRemoveDuplicates_default( + outerRing, + Cartesian3_default.equalsEpsilon, + true + ); + if (outerRing.length < 3) { + continue; + } + const numChildren = outerNode.holes ? outerNode.holes.length : 0; + for (i = 0; i < numChildren; i++) { + const hole = outerNode.holes[i]; + let holePositions = hole.positions; + if (scaleToEllipsoidSurface) { + length = holePositions.length; + for (j = 0; j < length; ++j) { + ellipsoid.scaleToGeodeticSurface(holePositions[j], holePositions[j]); + } + } + holePositions = arrayRemoveDuplicates_default( + holePositions, + Cartesian3_default.equalsEpsilon, + true + ); + if (holePositions.length < 3) { + continue; + } + polygons.push(holePositions); + let numGrandchildren = 0; + if (defined_default(hole.holes)) { + numGrandchildren = hole.holes.length; + } + for (j = 0; j < numGrandchildren; j++) { + queue.enqueue(hole.holes[j]); + } + } + polygons.push(outerRing); + } + return polygons; +}; +var scratchRhumbIntersection = new Cartographic_default(); +function computeEquatorIntersectionRhumb(start, end, ellipsoid) { + const c0 = ellipsoid.cartesianToCartographic(start, scratchCartographic0); + const c1 = ellipsoid.cartesianToCartographic(end, scratchCartographic1); + if (Math.sign(c0.latitude) === Math.sign(c1.latitude)) { + return; + } + scratchRhumbLine.setEndPoints(c0, c1); + const intersection = scratchRhumbLine.findIntersectionWithLatitude( + 0, + scratchRhumbIntersection + ); + if (!defined_default(intersection)) { + return; + } + let minLongitude = Math.min(c0.longitude, c1.longitude); + let maxLongitude = Math.max(c0.longitude, c1.longitude); + if (Math.abs(maxLongitude - minLongitude) > Math_default.PI) { + const swap = minLongitude; + minLongitude = maxLongitude; + maxLongitude = swap; + } + if (intersection.longitude < minLongitude || intersection.longitude > maxLongitude) { + return; + } + return ellipsoid.cartographicToCartesian(intersection); +} +function computeEquatorIntersection(start, end, ellipsoid, arcType) { + if (arcType === ArcType_default.RHUMB) { + return computeEquatorIntersectionRhumb(start, end, ellipsoid); + } + const intersection = IntersectionTests_default.lineSegmentPlane( + start, + end, + Plane_default.ORIGIN_XY_PLANE + ); + if (!defined_default(intersection)) { + return; + } + return ellipsoid.scaleToGeodeticSurface(intersection, intersection); +} +var scratchCartographic = new Cartographic_default(); +function computeEdgesOnPlane(positions, ellipsoid, arcType) { + const edgesOnPlane = []; + let startPoint, endPoint, type, next, intersection, i = 0; + while (i < positions.length) { + startPoint = positions[i]; + endPoint = positions[(i + 1) % positions.length]; + type = Math_default.sign(startPoint.z); + next = Math_default.sign(endPoint.z); + const getLongitude = (position) => { + const cartographic = ellipsoid.cartesianToCartographic( + position, + scratchCartographic + ); + return cartographic.longitude; + }; + if (type === 0) { + edgesOnPlane.push({ + position: i, + type, + visited: false, + next, + theta: getLongitude(startPoint) + }); + } else if (next !== 0) { + intersection = computeEquatorIntersection( + startPoint, + endPoint, + ellipsoid, + arcType + ); + ++i; + if (!defined_default(intersection)) { + continue; + } + positions.splice(i, 0, intersection); + edgesOnPlane.push({ + position: i, + type, + visited: false, + next, + theta: getLongitude(intersection) + }); + } + ++i; + } + return edgesOnPlane; +} +function wirePolygon(polygons, polygonIndex, positions, edgesOnPlane, toDelete, startIndex, abovePlane) { + const polygon = []; + let i = startIndex; + const getMatchingEdge = (i2) => (edge) => edge.position === i2; + const polygonsToWire = []; + do { + const position = positions[i]; + polygon.push(position); + const edgeIndex = edgesOnPlane.findIndex(getMatchingEdge(i)); + const edge = edgesOnPlane[edgeIndex]; + if (!defined_default(edge)) { + ++i; + continue; + } + const { visited: hasBeenVisited, type, next } = edge; + edge.visited = true; + if (type === 0) { + if (next === 0) { + const previousEdge = edgesOnPlane[edgeIndex - (abovePlane ? 1 : -1)]; + if (previousEdge?.position === i + 1) { + previousEdge.visited = true; + } else { + ++i; + continue; + } + } + if (!hasBeenVisited && abovePlane && next > 0 || startIndex === i && !abovePlane && next < 0) { + ++i; + continue; + } + } + const followEdge = abovePlane ? type >= 0 : type <= 0; + if (!followEdge) { + ++i; + continue; + } + if (!hasBeenVisited) { + polygonsToWire.push(i); + } + const nextEdgeIndex = edgeIndex + (abovePlane ? 1 : -1); + const nextEdge = edgesOnPlane[nextEdgeIndex]; + if (!defined_default(nextEdge)) { + ++i; + continue; + } + i = nextEdge.position; + } while (i < positions.length && i >= 0 && i !== startIndex && polygon.length < positions.length); + polygons.splice(polygonIndex, toDelete, polygon); + for (const index of polygonsToWire) { + polygonIndex = wirePolygon( + polygons, + ++polygonIndex, + positions, + edgesOnPlane, + 0, + index, + !abovePlane + ); + } + return polygonIndex; +} +PolygonGeometryLibrary.splitPolygonsOnEquator = function(outerRings, ellipsoid, arcType, result) { + if (!defined_default(result)) { + result = []; + } + result.splice(0, 0, ...outerRings); + result.length = outerRings.length; + let currentPolygon = 0; + while (currentPolygon < result.length) { + const outerRing = result[currentPolygon]; + const positions = outerRing.slice(); + if (outerRing.length < 3) { + result[currentPolygon] = positions; + ++currentPolygon; + continue; + } + const edgesOnPlane = computeEdgesOnPlane(positions, ellipsoid, arcType); + if (positions.length === outerRing.length || edgesOnPlane.length <= 1) { + result[currentPolygon] = positions; + ++currentPolygon; + continue; + } + edgesOnPlane.sort((a, b) => { + return a.theta - b.theta; + }); + const north = positions[0].z >= 0; + currentPolygon = wirePolygon( + result, + currentPolygon, + positions, + edgesOnPlane, + 1, + 0, + north + ); + } + return result; +}; +PolygonGeometryLibrary.polygonsFromHierarchy = function(polygonHierarchy, keepDuplicates, projectPointsTo2D, scaleToEllipsoidSurface, ellipsoid, splitPolygons) { + const hierarchy = []; + const polygons = []; + const queue = new Queue_default(); + queue.enqueue(polygonHierarchy); + let split = defined_default(splitPolygons); + while (queue.length !== 0) { + const outerNode = queue.dequeue(); + let outerRing = outerNode.positions; + const holes = outerNode.holes; + let i; + let length; + if (scaleToEllipsoidSurface) { + length = outerRing.length; + for (i = 0; i < length; i++) { + ellipsoid.scaleToGeodeticSurface(outerRing[i], outerRing[i]); + } + } + if (!keepDuplicates) { + outerRing = arrayRemoveDuplicates_default( + outerRing, + Cartesian3_default.equalsEpsilon, + true + ); + } + if (outerRing.length < 3) { + continue; + } + let positions2D = projectPointsTo2D(outerRing); + if (!defined_default(positions2D)) { + continue; + } + const holeIndices = []; + let originalWindingOrder = PolygonPipeline_default.computeWindingOrder2D( + positions2D + ); + if (originalWindingOrder === WindingOrder_default.CLOCKWISE) { + positions2D.reverse(); + outerRing = outerRing.slice().reverse(); + } + if (split) { + split = false; + let polygons2 = [outerRing]; + polygons2 = splitPolygons(polygons2, polygons2); + if (polygons2.length > 1) { + for (const positions2 of polygons2) { + queue.enqueue(new PolygonHierarchy_default(positions2, holes)); + } + continue; + } + } + let positions = outerRing.slice(); + const numChildren = defined_default(holes) ? holes.length : 0; + const polygonHoles = []; + let j; + for (i = 0; i < numChildren; i++) { + const hole = holes[i]; + let holePositions = hole.positions; + if (scaleToEllipsoidSurface) { + length = holePositions.length; + for (j = 0; j < length; ++j) { + ellipsoid.scaleToGeodeticSurface(holePositions[j], holePositions[j]); + } + } + if (!keepDuplicates) { + holePositions = arrayRemoveDuplicates_default( + holePositions, + Cartesian3_default.equalsEpsilon, + true + ); + } + if (holePositions.length < 3) { + continue; + } + const holePositions2D = projectPointsTo2D(holePositions); + if (!defined_default(holePositions2D)) { + continue; + } + originalWindingOrder = PolygonPipeline_default.computeWindingOrder2D( + holePositions2D + ); + if (originalWindingOrder === WindingOrder_default.CLOCKWISE) { + holePositions2D.reverse(); + holePositions = holePositions.slice().reverse(); + } + polygonHoles.push(holePositions); + holeIndices.push(positions.length); + positions = positions.concat(holePositions); + positions2D = positions2D.concat(holePositions2D); + let numGrandchildren = 0; + if (defined_default(hole.holes)) { + numGrandchildren = hole.holes.length; + } + for (j = 0; j < numGrandchildren; j++) { + queue.enqueue(hole.holes[j]); + } + } + hierarchy.push({ + outerRing, + holes: polygonHoles + }); + polygons.push({ + positions, + positions2D, + holes: holeIndices + }); + } + return { + hierarchy, + polygons + }; +}; +var computeBoundingRectangleCartesian2 = new Cartesian2_default(); +var computeBoundingRectangleCartesian3 = new Cartesian3_default(); +var computeBoundingRectangleQuaternion = new Quaternion_default(); +var computeBoundingRectangleMatrix3 = new Matrix3_default(); +PolygonGeometryLibrary.computeBoundingRectangle = function(planeNormal, projectPointTo2D, positions, angle, result) { + const rotation = Quaternion_default.fromAxisAngle( + planeNormal, + angle, + computeBoundingRectangleQuaternion + ); + const textureMatrix = Matrix3_default.fromQuaternion( + rotation, + computeBoundingRectangleMatrix3 + ); + let minX = Number.POSITIVE_INFINITY; + let maxX = Number.NEGATIVE_INFINITY; + let minY = Number.POSITIVE_INFINITY; + let maxY = Number.NEGATIVE_INFINITY; + const length = positions.length; + for (let i = 0; i < length; ++i) { + const p = Cartesian3_default.clone( + positions[i], + computeBoundingRectangleCartesian3 + ); + Matrix3_default.multiplyByVector(textureMatrix, p, p); + const st = projectPointTo2D(p, computeBoundingRectangleCartesian2); + if (defined_default(st)) { + minX = Math.min(minX, st.x); + maxX = Math.max(maxX, st.x); + minY = Math.min(minY, st.y); + maxY = Math.max(maxY, st.y); + } + } + result.x = minX; + result.y = minY; + result.width = maxX - minX; + result.height = maxY - minY; + return result; +}; +PolygonGeometryLibrary.createGeometryFromPositions = function(ellipsoid, polygon, textureCoordinates, granularity, perPositionHeight, vertexFormat, arcType) { + let indices = PolygonPipeline_default.triangulate(polygon.positions2D, polygon.holes); + if (indices.length < 3) { + indices = [0, 1, 2]; + } + const positions = polygon.positions; + const hasTexcoords = defined_default(textureCoordinates); + const texcoords = hasTexcoords ? textureCoordinates.positions : void 0; + if (perPositionHeight) { + const length = positions.length; + const flattenedPositions = new Array(length * 3); + let index = 0; + for (let i = 0; i < length; i++) { + const p = positions[i]; + flattenedPositions[index++] = p.x; + flattenedPositions[index++] = p.y; + flattenedPositions[index++] = p.z; + } + const geometryOptions = { + attributes: { + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: flattenedPositions + }) + }, + indices, + primitiveType: PrimitiveType_default.TRIANGLES + }; + if (hasTexcoords) { + geometryOptions.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: Cartesian2_default.packArray(texcoords) + }); + } + const geometry = new Geometry_default(geometryOptions); + if (vertexFormat.normal) { + return GeometryPipeline_default.computeNormal(geometry); + } + return geometry; + } + if (arcType === ArcType_default.GEODESIC) { + return PolygonPipeline_default.computeSubdivision( + ellipsoid, + positions, + indices, + texcoords, + granularity + ); + } else if (arcType === ArcType_default.RHUMB) { + return PolygonPipeline_default.computeRhumbLineSubdivision( + ellipsoid, + positions, + indices, + texcoords, + granularity + ); + } +}; +var computeWallTexcoordsSubdivided = []; +var computeWallIndicesSubdivided = []; +var p1Scratch = new Cartesian3_default(); +var p2Scratch = new Cartesian3_default(); +PolygonGeometryLibrary.computeWallGeometry = function(positions, textureCoordinates, ellipsoid, granularity, perPositionHeight, arcType) { + let edgePositions; + let topEdgeLength; + let i; + let p1; + let p2; + let t1; + let t2; + let edgeTexcoords; + let topEdgeTexcoordLength; + let length = positions.length; + let index = 0; + let textureIndex = 0; + const hasTexcoords = defined_default(textureCoordinates); + const texcoords = hasTexcoords ? textureCoordinates.positions : void 0; + if (!perPositionHeight) { + const minDistance = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + let numVertices = 0; + if (arcType === ArcType_default.GEODESIC) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary.subdivideLineCount( + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } else if (arcType === ArcType_default.RHUMB) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary.subdivideRhumbLineCount( + ellipsoid, + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } + topEdgeLength = (numVertices + length) * 3; + edgePositions = new Array(topEdgeLength * 2); + if (hasTexcoords) { + topEdgeTexcoordLength = (numVertices + length) * 2; + edgeTexcoords = new Array(topEdgeTexcoordLength * 2); + } + for (i = 0; i < length; i++) { + p1 = positions[i]; + p2 = positions[(i + 1) % length]; + let tempPositions; + let tempTexcoords; + if (hasTexcoords) { + t1 = texcoords[i]; + t2 = texcoords[(i + 1) % length]; + } + if (arcType === ArcType_default.GEODESIC) { + tempPositions = PolygonGeometryLibrary.subdivideLine( + p1, + p2, + minDistance, + computeWallIndicesSubdivided + ); + if (hasTexcoords) { + tempTexcoords = PolygonGeometryLibrary.subdivideTexcoordLine( + t1, + t2, + p1, + p2, + minDistance, + computeWallTexcoordsSubdivided + ); + } + } else if (arcType === ArcType_default.RHUMB) { + tempPositions = PolygonGeometryLibrary.subdivideRhumbLine( + ellipsoid, + p1, + p2, + minDistance, + computeWallIndicesSubdivided + ); + if (hasTexcoords) { + tempTexcoords = PolygonGeometryLibrary.subdivideTexcoordRhumbLine( + t1, + t2, + ellipsoid, + p1, + p2, + minDistance, + computeWallTexcoordsSubdivided + ); + } + } + const tempPositionsLength = tempPositions.length; + for (let j = 0; j < tempPositionsLength; ++j, ++index) { + edgePositions[index] = tempPositions[j]; + edgePositions[index + topEdgeLength] = tempPositions[j]; + } + edgePositions[index] = p2.x; + edgePositions[index + topEdgeLength] = p2.x; + ++index; + edgePositions[index] = p2.y; + edgePositions[index + topEdgeLength] = p2.y; + ++index; + edgePositions[index] = p2.z; + edgePositions[index + topEdgeLength] = p2.z; + ++index; + if (hasTexcoords) { + const tempTexcoordsLength = tempTexcoords.length; + for (let k = 0; k < tempTexcoordsLength; ++k, ++textureIndex) { + edgeTexcoords[textureIndex] = tempTexcoords[k]; + edgeTexcoords[textureIndex + topEdgeTexcoordLength] = tempTexcoords[k]; + } + edgeTexcoords[textureIndex] = t2.x; + edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t2.x; + ++textureIndex; + edgeTexcoords[textureIndex] = t2.y; + edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t2.y; + ++textureIndex; + } + } + } else { + topEdgeLength = length * 3 * 2; + edgePositions = new Array(topEdgeLength * 2); + if (hasTexcoords) { + topEdgeTexcoordLength = length * 2 * 2; + edgeTexcoords = new Array(topEdgeTexcoordLength * 2); + } + for (i = 0; i < length; i++) { + p1 = positions[i]; + p2 = positions[(i + 1) % length]; + edgePositions[index] = edgePositions[index + topEdgeLength] = p1.x; + ++index; + edgePositions[index] = edgePositions[index + topEdgeLength] = p1.y; + ++index; + edgePositions[index] = edgePositions[index + topEdgeLength] = p1.z; + ++index; + edgePositions[index] = edgePositions[index + topEdgeLength] = p2.x; + ++index; + edgePositions[index] = edgePositions[index + topEdgeLength] = p2.y; + ++index; + edgePositions[index] = edgePositions[index + topEdgeLength] = p2.z; + ++index; + if (hasTexcoords) { + t1 = texcoords[i]; + t2 = texcoords[(i + 1) % length]; + edgeTexcoords[textureIndex] = edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t1.x; + ++textureIndex; + edgeTexcoords[textureIndex] = edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t1.y; + ++textureIndex; + edgeTexcoords[textureIndex] = edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t2.x; + ++textureIndex; + edgeTexcoords[textureIndex] = edgeTexcoords[textureIndex + topEdgeTexcoordLength] = t2.y; + ++textureIndex; + } + } + } + length = edgePositions.length; + const indices = IndexDatatype_default.createTypedArray( + length / 3, + length - positions.length * 6 + ); + let edgeIndex = 0; + length /= 6; + for (i = 0; i < length; i++) { + const UL = i; + const UR = UL + 1; + const LL = UL + length; + const LR = LL + 1; + p1 = Cartesian3_default.fromArray(edgePositions, UL * 3, p1Scratch); + p2 = Cartesian3_default.fromArray(edgePositions, UR * 3, p2Scratch); + if (Cartesian3_default.equalsEpsilon( + p1, + p2, + Math_default.EPSILON10, + Math_default.EPSILON10 + )) { + continue; + } + indices[edgeIndex++] = UL; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = UR; + indices[edgeIndex++] = UR; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = LR; + } + const geometryOptions = { + attributes: new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: edgePositions + }) + }), + indices, + primitiveType: PrimitiveType_default.TRIANGLES + }; + if (hasTexcoords) { + geometryOptions.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: edgeTexcoords + }); + } + const geometry = new Geometry_default(geometryOptions); + return geometry; +}; +var PolygonGeometryLibrary_default = PolygonGeometryLibrary; + +export { + PolygonGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-JBSKHTNX.js b/public/assets/cesium/Workers/chunk-JBSKHTNX.js new file mode 100644 index 0000000..29a1fa2 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-JBSKHTNX.js @@ -0,0 +1,138 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/VertexFormat.js +function VertexFormat(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this.position = defaultValue_default(options.position, false); + this.normal = defaultValue_default(options.normal, false); + this.st = defaultValue_default(options.st, false); + this.bitangent = defaultValue_default(options.bitangent, false); + this.tangent = defaultValue_default(options.tangent, false); + this.color = defaultValue_default(options.color, false); +} +VertexFormat.POSITION_ONLY = Object.freeze( + new VertexFormat({ + position: true + }) +); +VertexFormat.POSITION_AND_NORMAL = Object.freeze( + new VertexFormat({ + position: true, + normal: true + }) +); +VertexFormat.POSITION_NORMAL_AND_ST = Object.freeze( + new VertexFormat({ + position: true, + normal: true, + st: true + }) +); +VertexFormat.POSITION_AND_ST = Object.freeze( + new VertexFormat({ + position: true, + st: true + }) +); +VertexFormat.POSITION_AND_COLOR = Object.freeze( + new VertexFormat({ + position: true, + color: true + }) +); +VertexFormat.ALL = Object.freeze( + new VertexFormat({ + position: true, + normal: true, + st: true, + tangent: true, + bitangent: true + }) +); +VertexFormat.DEFAULT = VertexFormat.POSITION_NORMAL_AND_ST; +VertexFormat.packedLength = 6; +VertexFormat.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value.position ? 1 : 0; + array[startingIndex++] = value.normal ? 1 : 0; + array[startingIndex++] = value.st ? 1 : 0; + array[startingIndex++] = value.tangent ? 1 : 0; + array[startingIndex++] = value.bitangent ? 1 : 0; + array[startingIndex] = value.color ? 1 : 0; + return array; +}; +VertexFormat.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new VertexFormat(); + } + result.position = array[startingIndex++] === 1; + result.normal = array[startingIndex++] === 1; + result.st = array[startingIndex++] === 1; + result.tangent = array[startingIndex++] === 1; + result.bitangent = array[startingIndex++] === 1; + result.color = array[startingIndex] === 1; + return result; +}; +VertexFormat.clone = function(vertexFormat, result) { + if (!defined_default(vertexFormat)) { + return void 0; + } + if (!defined_default(result)) { + result = new VertexFormat(); + } + result.position = vertexFormat.position; + result.normal = vertexFormat.normal; + result.st = vertexFormat.st; + result.tangent = vertexFormat.tangent; + result.bitangent = vertexFormat.bitangent; + result.color = vertexFormat.color; + return result; +}; +var VertexFormat_default = VertexFormat; + +export { + VertexFormat_default +}; diff --git a/public/assets/cesium/Workers/chunk-JISPSEF3.js b/public/assets/cesium/Workers/chunk-JISPSEF3.js new file mode 100644 index 0000000..f535b56 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-JISPSEF3.js @@ -0,0 +1,305 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; + +// packages/engine/Source/Core/EllipseGeometryLibrary.js +var EllipseGeometryLibrary = {}; +var rotAxis = new Cartesian3_default(); +var tempVec = new Cartesian3_default(); +var unitQuat = new Quaternion_default(); +var rotMtx = new Matrix3_default(); +function pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, result) { + const azimuth = theta + rotation; + Cartesian3_default.multiplyByScalar(eastVec, Math.cos(azimuth), rotAxis); + Cartesian3_default.multiplyByScalar(northVec, Math.sin(azimuth), tempVec); + Cartesian3_default.add(rotAxis, tempVec, rotAxis); + let cosThetaSquared = Math.cos(theta); + cosThetaSquared = cosThetaSquared * cosThetaSquared; + let sinThetaSquared = Math.sin(theta); + sinThetaSquared = sinThetaSquared * sinThetaSquared; + const radius = ab / Math.sqrt(bSqr * cosThetaSquared + aSqr * sinThetaSquared); + const angle = radius / mag; + Quaternion_default.fromAxisAngle(rotAxis, angle, unitQuat); + Matrix3_default.fromQuaternion(unitQuat, rotMtx); + Matrix3_default.multiplyByVector(rotMtx, unitPos, result); + Cartesian3_default.normalize(result, result); + Cartesian3_default.multiplyByScalar(result, mag, result); + return result; +} +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartesian3 = new Cartesian3_default(); +var scratchNormal = new Cartesian3_default(); +EllipseGeometryLibrary.raisePositionsToHeight = function(positions, options, extrude) { + const ellipsoid = options.ellipsoid; + const height = options.height; + const extrudedHeight = options.extrudedHeight; + const size = extrude ? positions.length / 3 * 2 : positions.length / 3; + const finalPositions = new Float64Array(size * 3); + const length = positions.length; + const bottomOffset = extrude ? length : 0; + for (let i = 0; i < length; i += 3) { + const i1 = i + 1; + const i2 = i + 2; + const position = Cartesian3_default.fromArray(positions, i, scratchCartesian1); + ellipsoid.scaleToGeodeticSurface(position, position); + const extrudedPosition = Cartesian3_default.clone(position, scratchCartesian2); + const normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal); + const scaledNormal = Cartesian3_default.multiplyByScalar( + normal, + height, + scratchCartesian3 + ); + Cartesian3_default.add(position, scaledNormal, position); + if (extrude) { + Cartesian3_default.multiplyByScalar(normal, extrudedHeight, scaledNormal); + Cartesian3_default.add(extrudedPosition, scaledNormal, extrudedPosition); + finalPositions[i + bottomOffset] = extrudedPosition.x; + finalPositions[i1 + bottomOffset] = extrudedPosition.y; + finalPositions[i2 + bottomOffset] = extrudedPosition.z; + } + finalPositions[i] = position.x; + finalPositions[i1] = position.y; + finalPositions[i2] = position.z; + } + return finalPositions; +}; +var unitPosScratch = new Cartesian3_default(); +var eastVecScratch = new Cartesian3_default(); +var northVecScratch = new Cartesian3_default(); +EllipseGeometryLibrary.computeEllipsePositions = function(options, addFillPositions, addEdgePositions) { + const semiMinorAxis = options.semiMinorAxis; + const semiMajorAxis = options.semiMajorAxis; + const rotation = options.rotation; + const center = options.center; + const granularity = options.granularity * 8; + const aSqr = semiMinorAxis * semiMinorAxis; + const bSqr = semiMajorAxis * semiMajorAxis; + const ab = semiMajorAxis * semiMinorAxis; + const mag = Cartesian3_default.magnitude(center); + const unitPos = Cartesian3_default.normalize(center, unitPosScratch); + let eastVec = Cartesian3_default.cross(Cartesian3_default.UNIT_Z, center, eastVecScratch); + eastVec = Cartesian3_default.normalize(eastVec, eastVec); + const northVec = Cartesian3_default.cross(unitPos, eastVec, northVecScratch); + let numPts = 1 + Math.ceil(Math_default.PI_OVER_TWO / granularity); + const deltaTheta = Math_default.PI_OVER_TWO / (numPts - 1); + let theta = Math_default.PI_OVER_TWO - numPts * deltaTheta; + if (theta < 0) { + numPts -= Math.ceil(Math.abs(theta) / deltaTheta); + } + const size = 2 * (numPts * (numPts + 2)); + const positions = addFillPositions ? new Array(size * 3) : void 0; + let positionIndex = 0; + let position = scratchCartesian1; + let reflectedPosition = scratchCartesian2; + const outerPositionsLength = numPts * 4 * 3; + let outerRightIndex = outerPositionsLength - 1; + let outerLeftIndex = 0; + const outerPositions = addEdgePositions ? new Array(outerPositionsLength) : void 0; + let i; + let j; + let numInterior; + let t; + let interiorPosition; + theta = Math_default.PI_OVER_TWO; + position = pointOnEllipsoid( + theta, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + position + ); + if (addFillPositions) { + positions[positionIndex++] = position.x; + positions[positionIndex++] = position.y; + positions[positionIndex++] = position.z; + } + if (addEdgePositions) { + outerPositions[outerRightIndex--] = position.z; + outerPositions[outerRightIndex--] = position.y; + outerPositions[outerRightIndex--] = position.x; + } + theta = Math_default.PI_OVER_TWO - deltaTheta; + for (i = 1; i < numPts + 1; ++i) { + position = pointOnEllipsoid( + theta, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + position + ); + reflectedPosition = pointOnEllipsoid( + Math.PI - theta, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + reflectedPosition + ); + if (addFillPositions) { + positions[positionIndex++] = position.x; + positions[positionIndex++] = position.y; + positions[positionIndex++] = position.z; + numInterior = 2 * i + 2; + for (j = 1; j < numInterior - 1; ++j) { + t = j / (numInterior - 1); + interiorPosition = Cartesian3_default.lerp( + position, + reflectedPosition, + t, + scratchCartesian3 + ); + positions[positionIndex++] = interiorPosition.x; + positions[positionIndex++] = interiorPosition.y; + positions[positionIndex++] = interiorPosition.z; + } + positions[positionIndex++] = reflectedPosition.x; + positions[positionIndex++] = reflectedPosition.y; + positions[positionIndex++] = reflectedPosition.z; + } + if (addEdgePositions) { + outerPositions[outerRightIndex--] = position.z; + outerPositions[outerRightIndex--] = position.y; + outerPositions[outerRightIndex--] = position.x; + outerPositions[outerLeftIndex++] = reflectedPosition.x; + outerPositions[outerLeftIndex++] = reflectedPosition.y; + outerPositions[outerLeftIndex++] = reflectedPosition.z; + } + theta = Math_default.PI_OVER_TWO - (i + 1) * deltaTheta; + } + for (i = numPts; i > 1; --i) { + theta = Math_default.PI_OVER_TWO - (i - 1) * deltaTheta; + position = pointOnEllipsoid( + -theta, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + position + ); + reflectedPosition = pointOnEllipsoid( + theta + Math.PI, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + reflectedPosition + ); + if (addFillPositions) { + positions[positionIndex++] = position.x; + positions[positionIndex++] = position.y; + positions[positionIndex++] = position.z; + numInterior = 2 * (i - 1) + 2; + for (j = 1; j < numInterior - 1; ++j) { + t = j / (numInterior - 1); + interiorPosition = Cartesian3_default.lerp( + position, + reflectedPosition, + t, + scratchCartesian3 + ); + positions[positionIndex++] = interiorPosition.x; + positions[positionIndex++] = interiorPosition.y; + positions[positionIndex++] = interiorPosition.z; + } + positions[positionIndex++] = reflectedPosition.x; + positions[positionIndex++] = reflectedPosition.y; + positions[positionIndex++] = reflectedPosition.z; + } + if (addEdgePositions) { + outerPositions[outerRightIndex--] = position.z; + outerPositions[outerRightIndex--] = position.y; + outerPositions[outerRightIndex--] = position.x; + outerPositions[outerLeftIndex++] = reflectedPosition.x; + outerPositions[outerLeftIndex++] = reflectedPosition.y; + outerPositions[outerLeftIndex++] = reflectedPosition.z; + } + } + theta = Math_default.PI_OVER_TWO; + position = pointOnEllipsoid( + -theta, + rotation, + northVec, + eastVec, + aSqr, + ab, + bSqr, + mag, + unitPos, + position + ); + const r = {}; + if (addFillPositions) { + positions[positionIndex++] = position.x; + positions[positionIndex++] = position.y; + positions[positionIndex++] = position.z; + r.positions = positions; + r.numPts = numPts; + } + if (addEdgePositions) { + outerPositions[outerRightIndex--] = position.z; + outerPositions[outerRightIndex--] = position.y; + outerPositions[outerRightIndex--] = position.x; + r.outerPositions = outerPositions; + } + return r; +}; +var EllipseGeometryLibrary_default = EllipseGeometryLibrary; + +export { + EllipseGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-JSQJDZI4.js b/public/assets/cesium/Workers/chunk-JSQJDZI4.js new file mode 100644 index 0000000..6650575 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-JSQJDZI4.js @@ -0,0 +1,456 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidRhumbLine.js +function calculateM(ellipticity, major, latitude) { + if (ellipticity === 0) { + return major * latitude; + } + const e2 = ellipticity * ellipticity; + const e4 = e2 * e2; + const e6 = e4 * e2; + const e8 = e6 * e2; + const e10 = e8 * e2; + const e12 = e10 * e2; + const phi = latitude; + const sin2Phi = Math.sin(2 * phi); + const sin4Phi = Math.sin(4 * phi); + const sin6Phi = Math.sin(6 * phi); + const sin8Phi = Math.sin(8 * phi); + const sin10Phi = Math.sin(10 * phi); + const sin12Phi = Math.sin(12 * phi); + return major * ((1 - e2 / 4 - 3 * e4 / 64 - 5 * e6 / 256 - 175 * e8 / 16384 - 441 * e10 / 65536 - 4851 * e12 / 1048576) * phi - (3 * e2 / 8 + 3 * e4 / 32 + 45 * e6 / 1024 + 105 * e8 / 4096 + 2205 * e10 / 131072 + 6237 * e12 / 524288) * sin2Phi + (15 * e4 / 256 + 45 * e6 / 1024 + 525 * e8 / 16384 + 1575 * e10 / 65536 + 155925 * e12 / 8388608) * sin4Phi - (35 * e6 / 3072 + 175 * e8 / 12288 + 3675 * e10 / 262144 + 13475 * e12 / 1048576) * sin6Phi + (315 * e8 / 131072 + 2205 * e10 / 524288 + 43659 * e12 / 8388608) * sin8Phi - (693 * e10 / 1310720 + 6237 * e12 / 5242880) * sin10Phi + 1001 * e12 / 8388608 * sin12Phi); +} +function calculateInverseM(M, ellipticity, major) { + const d = M / major; + if (ellipticity === 0) { + return d; + } + const d2 = d * d; + const d3 = d2 * d; + const d4 = d3 * d; + const e = ellipticity; + const e2 = e * e; + const e4 = e2 * e2; + const e6 = e4 * e2; + const e8 = e6 * e2; + const e10 = e8 * e2; + const e12 = e10 * e2; + const sin2D = Math.sin(2 * d); + const cos2D = Math.cos(2 * d); + const sin4D = Math.sin(4 * d); + const cos4D = Math.cos(4 * d); + const sin6D = Math.sin(6 * d); + const cos6D = Math.cos(6 * d); + const sin8D = Math.sin(8 * d); + const cos8D = Math.cos(8 * d); + const sin10D = Math.sin(10 * d); + const cos10D = Math.cos(10 * d); + const sin12D = Math.sin(12 * d); + return d + d * e2 / 4 + 7 * d * e4 / 64 + 15 * d * e6 / 256 + 579 * d * e8 / 16384 + 1515 * d * e10 / 65536 + 16837 * d * e12 / 1048576 + (3 * d * e4 / 16 + 45 * d * e6 / 256 - d * (32 * d2 - 561) * e8 / 4096 - d * (232 * d2 - 1677) * e10 / 16384 + d * (399985 - 90560 * d2 + 512 * d4) * e12 / 5242880) * cos2D + (21 * d * e6 / 256 + 483 * d * e8 / 4096 - d * (224 * d2 - 1969) * e10 / 16384 - d * (33152 * d2 - 112599) * e12 / 1048576) * cos4D + (151 * d * e8 / 4096 + 4681 * d * e10 / 65536 + 1479 * d * e12 / 16384 - 453 * d3 * e12 / 32768) * cos6D + (1097 * d * e10 / 65536 + 42783 * d * e12 / 1048576) * cos8D + 8011 * d * e12 / 1048576 * cos10D + (3 * e2 / 8 + 3 * e4 / 16 + 213 * e6 / 2048 - 3 * d2 * e6 / 64 + 255 * e8 / 4096 - 33 * d2 * e8 / 512 + 20861 * e10 / 524288 - 33 * d2 * e10 / 512 + d4 * e10 / 1024 + 28273 * e12 / 1048576 - 471 * d2 * e12 / 8192 + 9 * d4 * e12 / 4096) * sin2D + (21 * e4 / 256 + 21 * e6 / 256 + 533 * e8 / 8192 - 21 * d2 * e8 / 512 + 197 * e10 / 4096 - 315 * d2 * e10 / 4096 + 584039 * e12 / 16777216 - 12517 * d2 * e12 / 131072 + 7 * d4 * e12 / 2048) * sin4D + (151 * e6 / 6144 + 151 * e8 / 4096 + 5019 * e10 / 131072 - 453 * d2 * e10 / 16384 + 26965 * e12 / 786432 - 8607 * d2 * e12 / 131072) * sin6D + (1097 * e8 / 131072 + 1097 * e10 / 65536 + 225797 * e12 / 10485760 - 1097 * d2 * e12 / 65536) * sin8D + (8011 * e10 / 2621440 + 8011 * e12 / 1048576) * sin10D + 293393 * e12 / 251658240 * sin12D; +} +function calculateSigma(ellipticity, latitude) { + if (ellipticity === 0) { + return Math.log(Math.tan(0.5 * (Math_default.PI_OVER_TWO + latitude))); + } + const eSinL = ellipticity * Math.sin(latitude); + return Math.log(Math.tan(0.5 * (Math_default.PI_OVER_TWO + latitude))) - ellipticity / 2 * Math.log((1 + eSinL) / (1 - eSinL)); +} +function calculateHeading(ellipsoidRhumbLine, firstLongitude, firstLatitude, secondLongitude, secondLatitude) { + const sigma1 = calculateSigma(ellipsoidRhumbLine._ellipticity, firstLatitude); + const sigma2 = calculateSigma( + ellipsoidRhumbLine._ellipticity, + secondLatitude + ); + return Math.atan2( + Math_default.negativePiToPi(secondLongitude - firstLongitude), + sigma2 - sigma1 + ); +} +function calculateArcLength(ellipsoidRhumbLine, major, minor, firstLongitude, firstLatitude, secondLongitude, secondLatitude) { + const heading = ellipsoidRhumbLine._heading; + const deltaLongitude = secondLongitude - firstLongitude; + let distance = 0; + if (Math_default.equalsEpsilon( + Math.abs(heading), + Math_default.PI_OVER_TWO, + Math_default.EPSILON8 + )) { + if (major === minor) { + distance = major * Math.cos(firstLatitude) * Math_default.negativePiToPi(deltaLongitude); + } else { + const sinPhi = Math.sin(firstLatitude); + distance = major * Math.cos(firstLatitude) * Math_default.negativePiToPi(deltaLongitude) / Math.sqrt(1 - ellipsoidRhumbLine._ellipticitySquared * sinPhi * sinPhi); + } + } else { + const M1 = calculateM( + ellipsoidRhumbLine._ellipticity, + major, + firstLatitude + ); + const M2 = calculateM( + ellipsoidRhumbLine._ellipticity, + major, + secondLatitude + ); + distance = (M2 - M1) / Math.cos(heading); + } + return Math.abs(distance); +} +var scratchCart1 = new Cartesian3_default(); +var scratchCart2 = new Cartesian3_default(); +function computeProperties(ellipsoidRhumbLine, start, end, ellipsoid) { + const firstCartesian = Cartesian3_default.normalize( + ellipsoid.cartographicToCartesian(start, scratchCart2), + scratchCart1 + ); + const lastCartesian = Cartesian3_default.normalize( + ellipsoid.cartographicToCartesian(end, scratchCart2), + scratchCart2 + ); + Check_default.typeOf.number.greaterThanOrEquals( + "value", + Math.abs( + Math.abs(Cartesian3_default.angleBetween(firstCartesian, lastCartesian)) - Math.PI + ), + 0.0125 + ); + const major = ellipsoid.maximumRadius; + const minor = ellipsoid.minimumRadius; + const majorSquared = major * major; + const minorSquared = minor * minor; + ellipsoidRhumbLine._ellipticitySquared = (majorSquared - minorSquared) / majorSquared; + ellipsoidRhumbLine._ellipticity = Math.sqrt( + ellipsoidRhumbLine._ellipticitySquared + ); + ellipsoidRhumbLine._start = Cartographic_default.clone( + start, + ellipsoidRhumbLine._start + ); + ellipsoidRhumbLine._start.height = 0; + ellipsoidRhumbLine._end = Cartographic_default.clone(end, ellipsoidRhumbLine._end); + ellipsoidRhumbLine._end.height = 0; + ellipsoidRhumbLine._heading = calculateHeading( + ellipsoidRhumbLine, + start.longitude, + start.latitude, + end.longitude, + end.latitude + ); + ellipsoidRhumbLine._distance = calculateArcLength( + ellipsoidRhumbLine, + ellipsoid.maximumRadius, + ellipsoid.minimumRadius, + start.longitude, + start.latitude, + end.longitude, + end.latitude + ); +} +function interpolateUsingSurfaceDistance(start, heading, distance, major, ellipticity, result) { + if (distance === 0) { + return Cartographic_default.clone(start, result); + } + const ellipticitySquared = ellipticity * ellipticity; + let longitude; + let latitude; + let deltaLongitude; + if (Math.abs(Math_default.PI_OVER_TWO - Math.abs(heading)) > Math_default.EPSILON8) { + const M1 = calculateM(ellipticity, major, start.latitude); + const deltaM = distance * Math.cos(heading); + const M2 = M1 + deltaM; + latitude = calculateInverseM(M2, ellipticity, major); + if (Math.abs(heading) < Math_default.EPSILON10) { + longitude = Math_default.negativePiToPi(start.longitude); + } else { + const sigma1 = calculateSigma(ellipticity, start.latitude); + const sigma2 = calculateSigma(ellipticity, latitude); + deltaLongitude = Math.tan(heading) * (sigma2 - sigma1); + longitude = Math_default.negativePiToPi(start.longitude + deltaLongitude); + } + } else { + latitude = start.latitude; + let localRad; + if (ellipticity === 0) { + localRad = major * Math.cos(start.latitude); + } else { + const sinPhi = Math.sin(start.latitude); + localRad = major * Math.cos(start.latitude) / Math.sqrt(1 - ellipticitySquared * sinPhi * sinPhi); + } + deltaLongitude = distance / localRad; + if (heading > 0) { + longitude = Math_default.negativePiToPi(start.longitude + deltaLongitude); + } else { + longitude = Math_default.negativePiToPi(start.longitude - deltaLongitude); + } + } + if (defined_default(result)) { + result.longitude = longitude; + result.latitude = latitude; + result.height = 0; + return result; + } + return new Cartographic_default(longitude, latitude, 0); +} +function EllipsoidRhumbLine(start, end, ellipsoid) { + const e = defaultValue_default(ellipsoid, Ellipsoid_default.default); + this._ellipsoid = e; + this._start = new Cartographic_default(); + this._end = new Cartographic_default(); + this._heading = void 0; + this._distance = void 0; + this._ellipticity = void 0; + this._ellipticitySquared = void 0; + if (defined_default(start) && defined_default(end)) { + computeProperties(this, start, end, e); + } +} +Object.defineProperties(EllipsoidRhumbLine.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidRhumbLine.prototype + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the surface distance between the start and end point + * @memberof EllipsoidRhumbLine.prototype + * @type {number} + * @readonly + */ + surfaceDistance: { + get: function() { + Check_default.defined("distance", this._distance); + return this._distance; + } + }, + /** + * Gets the initial planetodetic point on the path. + * @memberof EllipsoidRhumbLine.prototype + * @type {Cartographic} + * @readonly + */ + start: { + get: function() { + return this._start; + } + }, + /** + * Gets the final planetodetic point on the path. + * @memberof EllipsoidRhumbLine.prototype + * @type {Cartographic} + * @readonly + */ + end: { + get: function() { + return this._end; + } + }, + /** + * Gets the heading from the start point to the end point. + * @memberof EllipsoidRhumbLine.prototype + * @type {number} + * @readonly + */ + heading: { + get: function() { + Check_default.defined("distance", this._distance); + return this._heading; + } + } +}); +EllipsoidRhumbLine.fromStartHeadingDistance = function(start, heading, distance, ellipsoid, result) { + Check_default.defined("start", start); + Check_default.defined("heading", heading); + Check_default.defined("distance", distance); + Check_default.typeOf.number.greaterThan("distance", distance, 0); + const e = defaultValue_default(ellipsoid, Ellipsoid_default.default); + const major = e.maximumRadius; + const minor = e.minimumRadius; + const majorSquared = major * major; + const minorSquared = minor * minor; + const ellipticity = Math.sqrt((majorSquared - minorSquared) / majorSquared); + heading = Math_default.negativePiToPi(heading); + const end = interpolateUsingSurfaceDistance( + start, + heading, + distance, + e.maximumRadius, + ellipticity + ); + if (!defined_default(result) || defined_default(ellipsoid) && !ellipsoid.equals(result.ellipsoid)) { + return new EllipsoidRhumbLine(start, end, e); + } + result.setEndPoints(start, end); + return result; +}; +EllipsoidRhumbLine.prototype.setEndPoints = function(start, end) { + Check_default.defined("start", start); + Check_default.defined("end", end); + computeProperties(this, start, end, this._ellipsoid); +}; +EllipsoidRhumbLine.prototype.interpolateUsingFraction = function(fraction, result) { + return this.interpolateUsingSurfaceDistance( + fraction * this._distance, + result + ); +}; +EllipsoidRhumbLine.prototype.interpolateUsingSurfaceDistance = function(distance, result) { + Check_default.typeOf.number("distance", distance); + if (!defined_default(this._distance) || this._distance === 0) { + throw new DeveloperError_default( + "EllipsoidRhumbLine must have distinct start and end set." + ); + } + return interpolateUsingSurfaceDistance( + this._start, + this._heading, + distance, + this._ellipsoid.maximumRadius, + this._ellipticity, + result + ); +}; +EllipsoidRhumbLine.prototype.findIntersectionWithLongitude = function(intersectionLongitude, result) { + Check_default.typeOf.number("intersectionLongitude", intersectionLongitude); + if (!defined_default(this._distance) || this._distance === 0) { + throw new DeveloperError_default( + "EllipsoidRhumbLine must have distinct start and end set." + ); + } + const ellipticity = this._ellipticity; + const heading = this._heading; + const absHeading = Math.abs(heading); + const start = this._start; + intersectionLongitude = Math_default.negativePiToPi(intersectionLongitude); + if (Math_default.equalsEpsilon( + Math.abs(intersectionLongitude), + Math.PI, + Math_default.EPSILON14 + )) { + intersectionLongitude = Math_default.sign(start.longitude) * Math.PI; + } + if (!defined_default(result)) { + result = new Cartographic_default(); + } + if (Math.abs(Math_default.PI_OVER_TWO - absHeading) <= Math_default.EPSILON8) { + result.longitude = intersectionLongitude; + result.latitude = start.latitude; + result.height = 0; + return result; + } else if (Math_default.equalsEpsilon( + Math.abs(Math_default.PI_OVER_TWO - absHeading), + Math_default.PI_OVER_TWO, + Math_default.EPSILON8 + )) { + if (Math_default.equalsEpsilon( + intersectionLongitude, + start.longitude, + Math_default.EPSILON12 + )) { + return void 0; + } + result.longitude = intersectionLongitude; + result.latitude = Math_default.PI_OVER_TWO * Math_default.sign(Math_default.PI_OVER_TWO - heading); + result.height = 0; + return result; + } + const phi1 = start.latitude; + const eSinPhi1 = ellipticity * Math.sin(phi1); + const leftComponent = Math.tan(0.5 * (Math_default.PI_OVER_TWO + phi1)) * Math.exp((intersectionLongitude - start.longitude) / Math.tan(heading)); + const denominator = (1 + eSinPhi1) / (1 - eSinPhi1); + let newPhi = start.latitude; + let phi; + do { + phi = newPhi; + const eSinPhi = ellipticity * Math.sin(phi); + const numerator = (1 + eSinPhi) / (1 - eSinPhi); + newPhi = 2 * Math.atan( + leftComponent * Math.pow(numerator / denominator, ellipticity / 2) + ) - Math_default.PI_OVER_TWO; + } while (!Math_default.equalsEpsilon(newPhi, phi, Math_default.EPSILON12)); + result.longitude = intersectionLongitude; + result.latitude = newPhi; + result.height = 0; + return result; +}; +EllipsoidRhumbLine.prototype.findIntersectionWithLatitude = function(intersectionLatitude, result) { + Check_default.typeOf.number("intersectionLatitude", intersectionLatitude); + if (!defined_default(this._distance) || this._distance === 0) { + throw new DeveloperError_default( + "EllipsoidRhumbLine must have distinct start and end set." + ); + } + const ellipticity = this._ellipticity; + const heading = this._heading; + const start = this._start; + if (Math_default.equalsEpsilon( + Math.abs(heading), + Math_default.PI_OVER_TWO, + Math_default.EPSILON8 + )) { + return; + } + const sigma1 = calculateSigma(ellipticity, start.latitude); + const sigma2 = calculateSigma(ellipticity, intersectionLatitude); + const deltaLongitude = Math.tan(heading) * (sigma2 - sigma1); + const longitude = Math_default.negativePiToPi(start.longitude + deltaLongitude); + if (defined_default(result)) { + result.longitude = longitude; + result.latitude = intersectionLatitude; + result.height = 0; + return result; + } + return new Cartographic_default(longitude, intersectionLatitude, 0); +}; +var EllipsoidRhumbLine_default = EllipsoidRhumbLine; + +export { + EllipsoidRhumbLine_default +}; diff --git a/public/assets/cesium/Workers/chunk-JXVLNVXC.js b/public/assets/cesium/Workers/chunk-JXVLNVXC.js new file mode 100644 index 0000000..28863d1 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-JXVLNVXC.js @@ -0,0 +1,300 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Matrix2_default, + Matrix4_default, + Quaternion_default, + Rectangle_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + WebGLConstants_default +} from "./chunk-3HQMMUPU.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/GeometryType.js +var GeometryType = { + NONE: 0, + TRIANGLES: 1, + LINES: 2, + POLYLINES: 3 +}; +var GeometryType_default = Object.freeze(GeometryType); + +// packages/engine/Source/Core/PrimitiveType.js +var PrimitiveType = { + /** + * Points primitive where each vertex (or index) is a separate point. + * + * @type {number} + * @constant + */ + POINTS: WebGLConstants_default.POINTS, + /** + * Lines primitive where each two vertices (or indices) is a line segment. Line segments are not necessarily connected. + * + * @type {number} + * @constant + */ + LINES: WebGLConstants_default.LINES, + /** + * Line loop primitive where each vertex (or index) after the first connects a line to + * the previous vertex, and the last vertex implicitly connects to the first. + * + * @type {number} + * @constant + */ + LINE_LOOP: WebGLConstants_default.LINE_LOOP, + /** + * Line strip primitive where each vertex (or index) after the first connects a line to the previous vertex. + * + * @type {number} + * @constant + */ + LINE_STRIP: WebGLConstants_default.LINE_STRIP, + /** + * Triangles primitive where each three vertices (or indices) is a triangle. Triangles do not necessarily share edges. + * + * @type {number} + * @constant + */ + TRIANGLES: WebGLConstants_default.TRIANGLES, + /** + * Triangle strip primitive where each vertex (or index) after the first two connect to + * the previous two vertices forming a triangle. For example, this can be used to model a wall. + * + * @type {number} + * @constant + */ + TRIANGLE_STRIP: WebGLConstants_default.TRIANGLE_STRIP, + /** + * Triangle fan primitive where each vertex (or index) after the first two connect to + * the previous vertex and the first vertex forming a triangle. For example, this can be used + * to model a cone or circle. + * + * @type {number} + * @constant + */ + TRIANGLE_FAN: WebGLConstants_default.TRIANGLE_FAN +}; +PrimitiveType.isLines = function(primitiveType) { + return primitiveType === PrimitiveType.LINES || primitiveType === PrimitiveType.LINE_LOOP || primitiveType === PrimitiveType.LINE_STRIP; +}; +PrimitiveType.isTriangles = function(primitiveType) { + return primitiveType === PrimitiveType.TRIANGLES || primitiveType === PrimitiveType.TRIANGLE_STRIP || primitiveType === PrimitiveType.TRIANGLE_FAN; +}; +PrimitiveType.validate = function(primitiveType) { + return primitiveType === PrimitiveType.POINTS || primitiveType === PrimitiveType.LINES || primitiveType === PrimitiveType.LINE_LOOP || primitiveType === PrimitiveType.LINE_STRIP || primitiveType === PrimitiveType.TRIANGLES || primitiveType === PrimitiveType.TRIANGLE_STRIP || primitiveType === PrimitiveType.TRIANGLE_FAN; +}; +var PrimitiveType_default = Object.freeze(PrimitiveType); + +// packages/engine/Source/Core/Geometry.js +function Geometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + Check_default.typeOf.object("options.attributes", options.attributes); + this.attributes = options.attributes; + this.indices = options.indices; + this.primitiveType = defaultValue_default( + options.primitiveType, + PrimitiveType_default.TRIANGLES + ); + this.boundingSphere = options.boundingSphere; + this.geometryType = defaultValue_default(options.geometryType, GeometryType_default.NONE); + this.boundingSphereCV = options.boundingSphereCV; + this.offsetAttribute = options.offsetAttribute; +} +Geometry.computeNumberOfVertices = function(geometry) { + Check_default.typeOf.object("geometry", geometry); + let numberOfVertices = -1; + for (const property in geometry.attributes) { + if (geometry.attributes.hasOwnProperty(property) && defined_default(geometry.attributes[property]) && defined_default(geometry.attributes[property].values)) { + const attribute = geometry.attributes[property]; + const num = attribute.values.length / attribute.componentsPerAttribute; + if (numberOfVertices !== num && numberOfVertices !== -1) { + throw new DeveloperError_default( + "All attribute lists must have the same number of attributes." + ); + } + numberOfVertices = num; + } + } + return numberOfVertices; +}; +var rectangleCenterScratch = new Cartographic_default(); +var enuCenterScratch = new Cartesian3_default(); +var fixedFrameToEnuScratch = new Matrix4_default(); +var boundingRectanglePointsCartographicScratch = [ + new Cartographic_default(), + new Cartographic_default(), + new Cartographic_default() +]; +var boundingRectanglePointsEnuScratch = [ + new Cartesian2_default(), + new Cartesian2_default(), + new Cartesian2_default() +]; +var points2DScratch = [new Cartesian2_default(), new Cartesian2_default(), new Cartesian2_default()]; +var pointEnuScratch = new Cartesian3_default(); +var enuRotationScratch = new Quaternion_default(); +var enuRotationMatrixScratch = new Matrix4_default(); +var rotation2DScratch = new Matrix2_default(); +Geometry._textureCoordinateRotationPoints = function(positions, stRotation, ellipsoid, boundingRectangle) { + let i; + const rectangleCenter = Rectangle_default.center( + boundingRectangle, + rectangleCenterScratch + ); + const enuCenter = Cartographic_default.toCartesian( + rectangleCenter, + ellipsoid, + enuCenterScratch + ); + const enuToFixedFrame = Transforms_default.eastNorthUpToFixedFrame( + enuCenter, + ellipsoid, + fixedFrameToEnuScratch + ); + const fixedFrameToEnu = Matrix4_default.inverse( + enuToFixedFrame, + fixedFrameToEnuScratch + ); + const boundingPointsEnu = boundingRectanglePointsEnuScratch; + const boundingPointsCarto = boundingRectanglePointsCartographicScratch; + boundingPointsCarto[0].longitude = boundingRectangle.west; + boundingPointsCarto[0].latitude = boundingRectangle.south; + boundingPointsCarto[1].longitude = boundingRectangle.west; + boundingPointsCarto[1].latitude = boundingRectangle.north; + boundingPointsCarto[2].longitude = boundingRectangle.east; + boundingPointsCarto[2].latitude = boundingRectangle.south; + let posEnu = pointEnuScratch; + for (i = 0; i < 3; i++) { + Cartographic_default.toCartesian(boundingPointsCarto[i], ellipsoid, posEnu); + posEnu = Matrix4_default.multiplyByPointAsVector(fixedFrameToEnu, posEnu, posEnu); + boundingPointsEnu[i].x = posEnu.x; + boundingPointsEnu[i].y = posEnu.y; + } + const rotation = Quaternion_default.fromAxisAngle( + Cartesian3_default.UNIT_Z, + -stRotation, + enuRotationScratch + ); + const textureMatrix = Matrix3_default.fromQuaternion( + rotation, + enuRotationMatrixScratch + ); + const positionsLength = positions.length; + let enuMinX = Number.POSITIVE_INFINITY; + let enuMinY = Number.POSITIVE_INFINITY; + let enuMaxX = Number.NEGATIVE_INFINITY; + let enuMaxY = Number.NEGATIVE_INFINITY; + for (i = 0; i < positionsLength; i++) { + posEnu = Matrix4_default.multiplyByPointAsVector( + fixedFrameToEnu, + positions[i], + posEnu + ); + posEnu = Matrix3_default.multiplyByVector(textureMatrix, posEnu, posEnu); + enuMinX = Math.min(enuMinX, posEnu.x); + enuMinY = Math.min(enuMinY, posEnu.y); + enuMaxX = Math.max(enuMaxX, posEnu.x); + enuMaxY = Math.max(enuMaxY, posEnu.y); + } + const toDesiredInComputed = Matrix2_default.fromRotation( + stRotation, + rotation2DScratch + ); + const points2D = points2DScratch; + points2D[0].x = enuMinX; + points2D[0].y = enuMinY; + points2D[1].x = enuMinX; + points2D[1].y = enuMaxY; + points2D[2].x = enuMaxX; + points2D[2].y = enuMinY; + const boundingEnuMin = boundingPointsEnu[0]; + const boundingPointsWidth = boundingPointsEnu[2].x - boundingEnuMin.x; + const boundingPointsHeight = boundingPointsEnu[1].y - boundingEnuMin.y; + for (i = 0; i < 3; i++) { + const point2D = points2D[i]; + Matrix2_default.multiplyByVector(toDesiredInComputed, point2D, point2D); + point2D.x = (point2D.x - boundingEnuMin.x) / boundingPointsWidth; + point2D.y = (point2D.y - boundingEnuMin.y) / boundingPointsHeight; + } + const minXYCorner = points2D[0]; + const maxYCorner = points2D[1]; + const maxXCorner = points2D[2]; + const result = new Array(6); + Cartesian2_default.pack(minXYCorner, result); + Cartesian2_default.pack(maxYCorner, result, 2); + Cartesian2_default.pack(maxXCorner, result, 4); + return result; +}; +var Geometry_default = Geometry; + +// packages/engine/Source/Core/GeometryAttribute.js +function GeometryAttribute(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + if (!defined_default(options.componentDatatype)) { + throw new DeveloperError_default("options.componentDatatype is required."); + } + if (!defined_default(options.componentsPerAttribute)) { + throw new DeveloperError_default("options.componentsPerAttribute is required."); + } + if (options.componentsPerAttribute < 1 || options.componentsPerAttribute > 4) { + throw new DeveloperError_default( + "options.componentsPerAttribute must be between 1 and 4." + ); + } + if (!defined_default(options.values)) { + throw new DeveloperError_default("options.values is required."); + } + this.componentDatatype = options.componentDatatype; + this.componentsPerAttribute = options.componentsPerAttribute; + this.normalize = defaultValue_default(options.normalize, false); + this.values = options.values; +} +var GeometryAttribute_default = GeometryAttribute; + +export { + GeometryType_default, + PrimitiveType_default, + Geometry_default, + GeometryAttribute_default +}; diff --git a/public/assets/cesium/Workers/chunk-KHZNBFOH.js b/public/assets/cesium/Workers/chunk-KHZNBFOH.js new file mode 100644 index 0000000..f69c279 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-KHZNBFOH.js @@ -0,0 +1,963 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Matrix4_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/GeographicProjection.js +function GeographicProjection(ellipsoid) { + this._ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + this._semimajorAxis = this._ellipsoid.maximumRadius; + this._oneOverSemimajorAxis = 1 / this._semimajorAxis; +} +Object.defineProperties(GeographicProjection.prototype, { + /** + * Gets the {@link Ellipsoid}. + * + * @memberof GeographicProjection.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +GeographicProjection.prototype.project = function(cartographic, result) { + const semimajorAxis = this._semimajorAxis; + const x = cartographic.longitude * semimajorAxis; + const y = cartographic.latitude * semimajorAxis; + const z = cartographic.height; + if (!defined_default(result)) { + return new Cartesian3_default(x, y, z); + } + result.x = x; + result.y = y; + result.z = z; + return result; +}; +GeographicProjection.prototype.unproject = function(cartesian, result) { + if (!defined_default(cartesian)) { + throw new DeveloperError_default("cartesian is required"); + } + const oneOverEarthSemimajorAxis = this._oneOverSemimajorAxis; + const longitude = cartesian.x * oneOverEarthSemimajorAxis; + const latitude = cartesian.y * oneOverEarthSemimajorAxis; + const height = cartesian.z; + if (!defined_default(result)) { + return new Cartographic_default(longitude, latitude, height); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = height; + return result; +}; +var GeographicProjection_default = GeographicProjection; + +// packages/engine/Source/Core/Intersect.js +var Intersect = { + /** + * Represents that an object is not contained within the frustum. + * + * @type {number} + * @constant + */ + OUTSIDE: -1, + /** + * Represents that an object intersects one of the frustum's planes. + * + * @type {number} + * @constant + */ + INTERSECTING: 0, + /** + * Represents that an object is fully within the frustum. + * + * @type {number} + * @constant + */ + INSIDE: 1 +}; +var Intersect_default = Object.freeze(Intersect); + +// packages/engine/Source/Core/Interval.js +function Interval(start, stop) { + this.start = defaultValue_default(start, 0); + this.stop = defaultValue_default(stop, 0); +} +var Interval_default = Interval; + +// packages/engine/Source/Core/BoundingSphere.js +function BoundingSphere(center, radius) { + this.center = Cartesian3_default.clone(defaultValue_default(center, Cartesian3_default.ZERO)); + this.radius = defaultValue_default(radius, 0); +} +var fromPointsXMin = new Cartesian3_default(); +var fromPointsYMin = new Cartesian3_default(); +var fromPointsZMin = new Cartesian3_default(); +var fromPointsXMax = new Cartesian3_default(); +var fromPointsYMax = new Cartesian3_default(); +var fromPointsZMax = new Cartesian3_default(); +var fromPointsCurrentPos = new Cartesian3_default(); +var fromPointsScratch = new Cartesian3_default(); +var fromPointsRitterCenter = new Cartesian3_default(); +var fromPointsMinBoxPt = new Cartesian3_default(); +var fromPointsMaxBoxPt = new Cartesian3_default(); +var fromPointsNaiveCenterScratch = new Cartesian3_default(); +var volumeConstant = 4 / 3 * Math_default.PI; +BoundingSphere.fromPoints = function(positions, result) { + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(positions) || positions.length === 0) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + const currentPos = Cartesian3_default.clone(positions[0], fromPointsCurrentPos); + const xMin = Cartesian3_default.clone(currentPos, fromPointsXMin); + const yMin = Cartesian3_default.clone(currentPos, fromPointsYMin); + const zMin = Cartesian3_default.clone(currentPos, fromPointsZMin); + const xMax = Cartesian3_default.clone(currentPos, fromPointsXMax); + const yMax = Cartesian3_default.clone(currentPos, fromPointsYMax); + const zMax = Cartesian3_default.clone(currentPos, fromPointsZMax); + const numPositions = positions.length; + let i; + for (i = 1; i < numPositions; i++) { + Cartesian3_default.clone(positions[i], currentPos); + const x = currentPos.x; + const y = currentPos.y; + const z = currentPos.z; + if (x < xMin.x) { + Cartesian3_default.clone(currentPos, xMin); + } + if (x > xMax.x) { + Cartesian3_default.clone(currentPos, xMax); + } + if (y < yMin.y) { + Cartesian3_default.clone(currentPos, yMin); + } + if (y > yMax.y) { + Cartesian3_default.clone(currentPos, yMax); + } + if (z < zMin.z) { + Cartesian3_default.clone(currentPos, zMin); + } + if (z > zMax.z) { + Cartesian3_default.clone(currentPos, zMax); + } + } + const xSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(xMax, xMin, fromPointsScratch) + ); + const ySpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(yMax, yMin, fromPointsScratch) + ); + const zSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(zMax, zMin, fromPointsScratch) + ); + let diameter1 = xMin; + let diameter2 = xMax; + let maxSpan = xSpan; + if (ySpan > maxSpan) { + maxSpan = ySpan; + diameter1 = yMin; + diameter2 = yMax; + } + if (zSpan > maxSpan) { + maxSpan = zSpan; + diameter1 = zMin; + diameter2 = zMax; + } + const ritterCenter = fromPointsRitterCenter; + ritterCenter.x = (diameter1.x + diameter2.x) * 0.5; + ritterCenter.y = (diameter1.y + diameter2.y) * 0.5; + ritterCenter.z = (diameter1.z + diameter2.z) * 0.5; + let radiusSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(diameter2, ritterCenter, fromPointsScratch) + ); + let ritterRadius = Math.sqrt(radiusSquared); + const minBoxPt = fromPointsMinBoxPt; + minBoxPt.x = xMin.x; + minBoxPt.y = yMin.y; + minBoxPt.z = zMin.z; + const maxBoxPt = fromPointsMaxBoxPt; + maxBoxPt.x = xMax.x; + maxBoxPt.y = yMax.y; + maxBoxPt.z = zMax.z; + const naiveCenter = Cartesian3_default.midpoint( + minBoxPt, + maxBoxPt, + fromPointsNaiveCenterScratch + ); + let naiveRadius = 0; + for (i = 0; i < numPositions; i++) { + Cartesian3_default.clone(positions[i], currentPos); + const r = Cartesian3_default.magnitude( + Cartesian3_default.subtract(currentPos, naiveCenter, fromPointsScratch) + ); + if (r > naiveRadius) { + naiveRadius = r; + } + const oldCenterToPointSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(currentPos, ritterCenter, fromPointsScratch) + ); + if (oldCenterToPointSquared > radiusSquared) { + const oldCenterToPoint = Math.sqrt(oldCenterToPointSquared); + ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5; + radiusSquared = ritterRadius * ritterRadius; + const oldToNew = oldCenterToPoint - ritterRadius; + ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint; + ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint; + ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint; + } + } + if (ritterRadius < naiveRadius) { + Cartesian3_default.clone(ritterCenter, result.center); + result.radius = ritterRadius; + } else { + Cartesian3_default.clone(naiveCenter, result.center); + result.radius = naiveRadius; + } + return result; +}; +var defaultProjection = new GeographicProjection_default(); +var fromRectangle2DLowerLeft = new Cartesian3_default(); +var fromRectangle2DUpperRight = new Cartesian3_default(); +var fromRectangle2DSouthwest = new Cartographic_default(); +var fromRectangle2DNortheast = new Cartographic_default(); +BoundingSphere.fromRectangle2D = function(rectangle, projection, result) { + return BoundingSphere.fromRectangleWithHeights2D( + rectangle, + projection, + 0, + 0, + result + ); +}; +BoundingSphere.fromRectangleWithHeights2D = function(rectangle, projection, minimumHeight, maximumHeight, result) { + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(rectangle)) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + defaultProjection._ellipsoid = Ellipsoid_default.default; + projection = defaultValue_default(projection, defaultProjection); + Rectangle_default.southwest(rectangle, fromRectangle2DSouthwest); + fromRectangle2DSouthwest.height = minimumHeight; + Rectangle_default.northeast(rectangle, fromRectangle2DNortheast); + fromRectangle2DNortheast.height = maximumHeight; + const lowerLeft = projection.project( + fromRectangle2DSouthwest, + fromRectangle2DLowerLeft + ); + const upperRight = projection.project( + fromRectangle2DNortheast, + fromRectangle2DUpperRight + ); + const width = upperRight.x - lowerLeft.x; + const height = upperRight.y - lowerLeft.y; + const elevation = upperRight.z - lowerLeft.z; + result.radius = Math.sqrt(width * width + height * height + elevation * elevation) * 0.5; + const center = result.center; + center.x = lowerLeft.x + width * 0.5; + center.y = lowerLeft.y + height * 0.5; + center.z = lowerLeft.z + elevation * 0.5; + return result; +}; +var fromRectangle3DScratch = []; +BoundingSphere.fromRectangle3D = function(rectangle, ellipsoid, surfaceHeight, result) { + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + surfaceHeight = defaultValue_default(surfaceHeight, 0); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(rectangle)) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + const positions = Rectangle_default.subsample( + rectangle, + ellipsoid, + surfaceHeight, + fromRectangle3DScratch + ); + return BoundingSphere.fromPoints(positions, result); +}; +BoundingSphere.fromVertices = function(positions, center, stride, result) { + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(positions) || positions.length === 0) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + center = defaultValue_default(center, Cartesian3_default.ZERO); + stride = defaultValue_default(stride, 3); + Check_default.typeOf.number.greaterThanOrEquals("stride", stride, 3); + const currentPos = fromPointsCurrentPos; + currentPos.x = positions[0] + center.x; + currentPos.y = positions[1] + center.y; + currentPos.z = positions[2] + center.z; + const xMin = Cartesian3_default.clone(currentPos, fromPointsXMin); + const yMin = Cartesian3_default.clone(currentPos, fromPointsYMin); + const zMin = Cartesian3_default.clone(currentPos, fromPointsZMin); + const xMax = Cartesian3_default.clone(currentPos, fromPointsXMax); + const yMax = Cartesian3_default.clone(currentPos, fromPointsYMax); + const zMax = Cartesian3_default.clone(currentPos, fromPointsZMax); + const numElements = positions.length; + let i; + for (i = 0; i < numElements; i += stride) { + const x = positions[i] + center.x; + const y = positions[i + 1] + center.y; + const z = positions[i + 2] + center.z; + currentPos.x = x; + currentPos.y = y; + currentPos.z = z; + if (x < xMin.x) { + Cartesian3_default.clone(currentPos, xMin); + } + if (x > xMax.x) { + Cartesian3_default.clone(currentPos, xMax); + } + if (y < yMin.y) { + Cartesian3_default.clone(currentPos, yMin); + } + if (y > yMax.y) { + Cartesian3_default.clone(currentPos, yMax); + } + if (z < zMin.z) { + Cartesian3_default.clone(currentPos, zMin); + } + if (z > zMax.z) { + Cartesian3_default.clone(currentPos, zMax); + } + } + const xSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(xMax, xMin, fromPointsScratch) + ); + const ySpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(yMax, yMin, fromPointsScratch) + ); + const zSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(zMax, zMin, fromPointsScratch) + ); + let diameter1 = xMin; + let diameter2 = xMax; + let maxSpan = xSpan; + if (ySpan > maxSpan) { + maxSpan = ySpan; + diameter1 = yMin; + diameter2 = yMax; + } + if (zSpan > maxSpan) { + maxSpan = zSpan; + diameter1 = zMin; + diameter2 = zMax; + } + const ritterCenter = fromPointsRitterCenter; + ritterCenter.x = (diameter1.x + diameter2.x) * 0.5; + ritterCenter.y = (diameter1.y + diameter2.y) * 0.5; + ritterCenter.z = (diameter1.z + diameter2.z) * 0.5; + let radiusSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(diameter2, ritterCenter, fromPointsScratch) + ); + let ritterRadius = Math.sqrt(radiusSquared); + const minBoxPt = fromPointsMinBoxPt; + minBoxPt.x = xMin.x; + minBoxPt.y = yMin.y; + minBoxPt.z = zMin.z; + const maxBoxPt = fromPointsMaxBoxPt; + maxBoxPt.x = xMax.x; + maxBoxPt.y = yMax.y; + maxBoxPt.z = zMax.z; + const naiveCenter = Cartesian3_default.midpoint( + minBoxPt, + maxBoxPt, + fromPointsNaiveCenterScratch + ); + let naiveRadius = 0; + for (i = 0; i < numElements; i += stride) { + currentPos.x = positions[i] + center.x; + currentPos.y = positions[i + 1] + center.y; + currentPos.z = positions[i + 2] + center.z; + const r = Cartesian3_default.magnitude( + Cartesian3_default.subtract(currentPos, naiveCenter, fromPointsScratch) + ); + if (r > naiveRadius) { + naiveRadius = r; + } + const oldCenterToPointSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(currentPos, ritterCenter, fromPointsScratch) + ); + if (oldCenterToPointSquared > radiusSquared) { + const oldCenterToPoint = Math.sqrt(oldCenterToPointSquared); + ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5; + radiusSquared = ritterRadius * ritterRadius; + const oldToNew = oldCenterToPoint - ritterRadius; + ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint; + ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint; + ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint; + } + } + if (ritterRadius < naiveRadius) { + Cartesian3_default.clone(ritterCenter, result.center); + result.radius = ritterRadius; + } else { + Cartesian3_default.clone(naiveCenter, result.center); + result.radius = naiveRadius; + } + return result; +}; +BoundingSphere.fromEncodedCartesianVertices = function(positionsHigh, positionsLow, result) { + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(positionsHigh) || !defined_default(positionsLow) || positionsHigh.length !== positionsLow.length || positionsHigh.length === 0) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + const currentPos = fromPointsCurrentPos; + currentPos.x = positionsHigh[0] + positionsLow[0]; + currentPos.y = positionsHigh[1] + positionsLow[1]; + currentPos.z = positionsHigh[2] + positionsLow[2]; + const xMin = Cartesian3_default.clone(currentPos, fromPointsXMin); + const yMin = Cartesian3_default.clone(currentPos, fromPointsYMin); + const zMin = Cartesian3_default.clone(currentPos, fromPointsZMin); + const xMax = Cartesian3_default.clone(currentPos, fromPointsXMax); + const yMax = Cartesian3_default.clone(currentPos, fromPointsYMax); + const zMax = Cartesian3_default.clone(currentPos, fromPointsZMax); + const numElements = positionsHigh.length; + let i; + for (i = 0; i < numElements; i += 3) { + const x = positionsHigh[i] + positionsLow[i]; + const y = positionsHigh[i + 1] + positionsLow[i + 1]; + const z = positionsHigh[i + 2] + positionsLow[i + 2]; + currentPos.x = x; + currentPos.y = y; + currentPos.z = z; + if (x < xMin.x) { + Cartesian3_default.clone(currentPos, xMin); + } + if (x > xMax.x) { + Cartesian3_default.clone(currentPos, xMax); + } + if (y < yMin.y) { + Cartesian3_default.clone(currentPos, yMin); + } + if (y > yMax.y) { + Cartesian3_default.clone(currentPos, yMax); + } + if (z < zMin.z) { + Cartesian3_default.clone(currentPos, zMin); + } + if (z > zMax.z) { + Cartesian3_default.clone(currentPos, zMax); + } + } + const xSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(xMax, xMin, fromPointsScratch) + ); + const ySpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(yMax, yMin, fromPointsScratch) + ); + const zSpan = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(zMax, zMin, fromPointsScratch) + ); + let diameter1 = xMin; + let diameter2 = xMax; + let maxSpan = xSpan; + if (ySpan > maxSpan) { + maxSpan = ySpan; + diameter1 = yMin; + diameter2 = yMax; + } + if (zSpan > maxSpan) { + maxSpan = zSpan; + diameter1 = zMin; + diameter2 = zMax; + } + const ritterCenter = fromPointsRitterCenter; + ritterCenter.x = (diameter1.x + diameter2.x) * 0.5; + ritterCenter.y = (diameter1.y + diameter2.y) * 0.5; + ritterCenter.z = (diameter1.z + diameter2.z) * 0.5; + let radiusSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(diameter2, ritterCenter, fromPointsScratch) + ); + let ritterRadius = Math.sqrt(radiusSquared); + const minBoxPt = fromPointsMinBoxPt; + minBoxPt.x = xMin.x; + minBoxPt.y = yMin.y; + minBoxPt.z = zMin.z; + const maxBoxPt = fromPointsMaxBoxPt; + maxBoxPt.x = xMax.x; + maxBoxPt.y = yMax.y; + maxBoxPt.z = zMax.z; + const naiveCenter = Cartesian3_default.midpoint( + minBoxPt, + maxBoxPt, + fromPointsNaiveCenterScratch + ); + let naiveRadius = 0; + for (i = 0; i < numElements; i += 3) { + currentPos.x = positionsHigh[i] + positionsLow[i]; + currentPos.y = positionsHigh[i + 1] + positionsLow[i + 1]; + currentPos.z = positionsHigh[i + 2] + positionsLow[i + 2]; + const r = Cartesian3_default.magnitude( + Cartesian3_default.subtract(currentPos, naiveCenter, fromPointsScratch) + ); + if (r > naiveRadius) { + naiveRadius = r; + } + const oldCenterToPointSquared = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(currentPos, ritterCenter, fromPointsScratch) + ); + if (oldCenterToPointSquared > radiusSquared) { + const oldCenterToPoint = Math.sqrt(oldCenterToPointSquared); + ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5; + radiusSquared = ritterRadius * ritterRadius; + const oldToNew = oldCenterToPoint - ritterRadius; + ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint; + ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint; + ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint; + } + } + if (ritterRadius < naiveRadius) { + Cartesian3_default.clone(ritterCenter, result.center); + result.radius = ritterRadius; + } else { + Cartesian3_default.clone(naiveCenter, result.center); + result.radius = naiveRadius; + } + return result; +}; +BoundingSphere.fromCornerPoints = function(corner, oppositeCorner, result) { + Check_default.typeOf.object("corner", corner); + Check_default.typeOf.object("oppositeCorner", oppositeCorner); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + const center = Cartesian3_default.midpoint(corner, oppositeCorner, result.center); + result.radius = Cartesian3_default.distance(center, oppositeCorner); + return result; +}; +BoundingSphere.fromEllipsoid = function(ellipsoid, result) { + Check_default.typeOf.object("ellipsoid", ellipsoid); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = ellipsoid.maximumRadius; + return result; +}; +var fromBoundingSpheresScratch = new Cartesian3_default(); +BoundingSphere.fromBoundingSpheres = function(boundingSpheres, result) { + if (!defined_default(result)) { + result = new BoundingSphere(); + } + if (!defined_default(boundingSpheres) || boundingSpheres.length === 0) { + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + result.radius = 0; + return result; + } + const length = boundingSpheres.length; + if (length === 1) { + return BoundingSphere.clone(boundingSpheres[0], result); + } + if (length === 2) { + return BoundingSphere.union(boundingSpheres[0], boundingSpheres[1], result); + } + const positions = []; + let i; + for (i = 0; i < length; i++) { + positions.push(boundingSpheres[i].center); + } + result = BoundingSphere.fromPoints(positions, result); + const center = result.center; + let radius = result.radius; + for (i = 0; i < length; i++) { + const tmp = boundingSpheres[i]; + radius = Math.max( + radius, + Cartesian3_default.distance(center, tmp.center, fromBoundingSpheresScratch) + tmp.radius + ); + } + result.radius = radius; + return result; +}; +var fromOrientedBoundingBoxScratchU = new Cartesian3_default(); +var fromOrientedBoundingBoxScratchV = new Cartesian3_default(); +var fromOrientedBoundingBoxScratchW = new Cartesian3_default(); +BoundingSphere.fromOrientedBoundingBox = function(orientedBoundingBox, result) { + Check_default.defined("orientedBoundingBox", orientedBoundingBox); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + const halfAxes = orientedBoundingBox.halfAxes; + const u = Matrix3_default.getColumn(halfAxes, 0, fromOrientedBoundingBoxScratchU); + const v = Matrix3_default.getColumn(halfAxes, 1, fromOrientedBoundingBoxScratchV); + const w = Matrix3_default.getColumn(halfAxes, 2, fromOrientedBoundingBoxScratchW); + Cartesian3_default.add(u, v, u); + Cartesian3_default.add(u, w, u); + result.center = Cartesian3_default.clone(orientedBoundingBox.center, result.center); + result.radius = Cartesian3_default.magnitude(u); + return result; +}; +var scratchFromTransformationCenter = new Cartesian3_default(); +var scratchFromTransformationScale = new Cartesian3_default(); +BoundingSphere.fromTransformation = function(transformation, result) { + Check_default.typeOf.object("transformation", transformation); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + const center = Matrix4_default.getTranslation( + transformation, + scratchFromTransformationCenter + ); + const scale = Matrix4_default.getScale( + transformation, + scratchFromTransformationScale + ); + const radius = 0.5 * Cartesian3_default.magnitude(scale); + result.center = Cartesian3_default.clone(center, result.center); + result.radius = radius; + return result; +}; +BoundingSphere.clone = function(sphere, result) { + if (!defined_default(sphere)) { + return void 0; + } + if (!defined_default(result)) { + return new BoundingSphere(sphere.center, sphere.radius); + } + result.center = Cartesian3_default.clone(sphere.center, result.center); + result.radius = sphere.radius; + return result; +}; +BoundingSphere.packedLength = 4; +BoundingSphere.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const center = value.center; + array[startingIndex++] = center.x; + array[startingIndex++] = center.y; + array[startingIndex++] = center.z; + array[startingIndex] = value.radius; + return array; +}; +BoundingSphere.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + const center = result.center; + center.x = array[startingIndex++]; + center.y = array[startingIndex++]; + center.z = array[startingIndex++]; + result.radius = array[startingIndex]; + return result; +}; +var unionScratch = new Cartesian3_default(); +var unionScratchCenter = new Cartesian3_default(); +BoundingSphere.union = function(left, right, result) { + Check_default.typeOf.object("left", left); + Check_default.typeOf.object("right", right); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + const leftCenter = left.center; + const leftRadius = left.radius; + const rightCenter = right.center; + const rightRadius = right.radius; + const toRightCenter = Cartesian3_default.subtract( + rightCenter, + leftCenter, + unionScratch + ); + const centerSeparation = Cartesian3_default.magnitude(toRightCenter); + if (leftRadius >= centerSeparation + rightRadius) { + left.clone(result); + return result; + } + if (rightRadius >= centerSeparation + leftRadius) { + right.clone(result); + return result; + } + const halfDistanceBetweenTangentPoints = (leftRadius + centerSeparation + rightRadius) * 0.5; + const center = Cartesian3_default.multiplyByScalar( + toRightCenter, + (-leftRadius + halfDistanceBetweenTangentPoints) / centerSeparation, + unionScratchCenter + ); + Cartesian3_default.add(center, leftCenter, center); + Cartesian3_default.clone(center, result.center); + result.radius = halfDistanceBetweenTangentPoints; + return result; +}; +var expandScratch = new Cartesian3_default(); +BoundingSphere.expand = function(sphere, point, result) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("point", point); + result = BoundingSphere.clone(sphere, result); + const radius = Cartesian3_default.magnitude( + Cartesian3_default.subtract(point, result.center, expandScratch) + ); + if (radius > result.radius) { + result.radius = radius; + } + return result; +}; +BoundingSphere.intersectPlane = function(sphere, plane) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("plane", plane); + const center = sphere.center; + const radius = sphere.radius; + const normal = plane.normal; + const distanceToPlane = Cartesian3_default.dot(normal, center) + plane.distance; + if (distanceToPlane < -radius) { + return Intersect_default.OUTSIDE; + } else if (distanceToPlane < radius) { + return Intersect_default.INTERSECTING; + } + return Intersect_default.INSIDE; +}; +BoundingSphere.transform = function(sphere, transform, result) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("transform", transform); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + result.center = Matrix4_default.multiplyByPoint( + transform, + sphere.center, + result.center + ); + result.radius = Matrix4_default.getMaximumScale(transform) * sphere.radius; + return result; +}; +var distanceSquaredToScratch = new Cartesian3_default(); +BoundingSphere.distanceSquaredTo = function(sphere, cartesian) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("cartesian", cartesian); + const diff = Cartesian3_default.subtract( + sphere.center, + cartesian, + distanceSquaredToScratch + ); + const distance = Cartesian3_default.magnitude(diff) - sphere.radius; + if (distance <= 0) { + return 0; + } + return distance * distance; +}; +BoundingSphere.transformWithoutScale = function(sphere, transform, result) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("transform", transform); + if (!defined_default(result)) { + result = new BoundingSphere(); + } + result.center = Matrix4_default.multiplyByPoint( + transform, + sphere.center, + result.center + ); + result.radius = sphere.radius; + return result; +}; +var scratchCartesian3 = new Cartesian3_default(); +BoundingSphere.computePlaneDistances = function(sphere, position, direction, result) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("position", position); + Check_default.typeOf.object("direction", direction); + if (!defined_default(result)) { + result = new Interval_default(); + } + const toCenter = Cartesian3_default.subtract( + sphere.center, + position, + scratchCartesian3 + ); + const mag = Cartesian3_default.dot(direction, toCenter); + result.start = mag - sphere.radius; + result.stop = mag + sphere.radius; + return result; +}; +var projectTo2DNormalScratch = new Cartesian3_default(); +var projectTo2DEastScratch = new Cartesian3_default(); +var projectTo2DNorthScratch = new Cartesian3_default(); +var projectTo2DWestScratch = new Cartesian3_default(); +var projectTo2DSouthScratch = new Cartesian3_default(); +var projectTo2DCartographicScratch = new Cartographic_default(); +var projectTo2DPositionsScratch = new Array(8); +for (let n = 0; n < 8; ++n) { + projectTo2DPositionsScratch[n] = new Cartesian3_default(); +} +var projectTo2DProjection = new GeographicProjection_default(); +BoundingSphere.projectTo2D = function(sphere, projection, result) { + Check_default.typeOf.object("sphere", sphere); + projectTo2DProjection._ellipsoid = Ellipsoid_default.default; + projection = defaultValue_default(projection, projectTo2DProjection); + const ellipsoid = projection.ellipsoid; + let center = sphere.center; + const radius = sphere.radius; + let normal; + if (Cartesian3_default.equals(center, Cartesian3_default.ZERO)) { + normal = Cartesian3_default.clone(Cartesian3_default.UNIT_X, projectTo2DNormalScratch); + } else { + normal = ellipsoid.geodeticSurfaceNormal(center, projectTo2DNormalScratch); + } + const east = Cartesian3_default.cross( + Cartesian3_default.UNIT_Z, + normal, + projectTo2DEastScratch + ); + Cartesian3_default.normalize(east, east); + const north = Cartesian3_default.cross(normal, east, projectTo2DNorthScratch); + Cartesian3_default.normalize(north, north); + Cartesian3_default.multiplyByScalar(normal, radius, normal); + Cartesian3_default.multiplyByScalar(north, radius, north); + Cartesian3_default.multiplyByScalar(east, radius, east); + const south = Cartesian3_default.negate(north, projectTo2DSouthScratch); + const west = Cartesian3_default.negate(east, projectTo2DWestScratch); + const positions = projectTo2DPositionsScratch; + let corner = positions[0]; + Cartesian3_default.add(normal, north, corner); + Cartesian3_default.add(corner, east, corner); + corner = positions[1]; + Cartesian3_default.add(normal, north, corner); + Cartesian3_default.add(corner, west, corner); + corner = positions[2]; + Cartesian3_default.add(normal, south, corner); + Cartesian3_default.add(corner, west, corner); + corner = positions[3]; + Cartesian3_default.add(normal, south, corner); + Cartesian3_default.add(corner, east, corner); + Cartesian3_default.negate(normal, normal); + corner = positions[4]; + Cartesian3_default.add(normal, north, corner); + Cartesian3_default.add(corner, east, corner); + corner = positions[5]; + Cartesian3_default.add(normal, north, corner); + Cartesian3_default.add(corner, west, corner); + corner = positions[6]; + Cartesian3_default.add(normal, south, corner); + Cartesian3_default.add(corner, west, corner); + corner = positions[7]; + Cartesian3_default.add(normal, south, corner); + Cartesian3_default.add(corner, east, corner); + const length = positions.length; + for (let i = 0; i < length; ++i) { + const position = positions[i]; + Cartesian3_default.add(center, position, position); + const cartographic = ellipsoid.cartesianToCartographic( + position, + projectTo2DCartographicScratch + ); + projection.project(cartographic, position); + } + result = BoundingSphere.fromPoints(positions, result); + center = result.center; + const x = center.x; + const y = center.y; + const z = center.z; + center.x = z; + center.y = x; + center.z = y; + return result; +}; +BoundingSphere.isOccluded = function(sphere, occluder) { + Check_default.typeOf.object("sphere", sphere); + Check_default.typeOf.object("occluder", occluder); + return !occluder.isBoundingSphereVisible(sphere); +}; +BoundingSphere.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && Cartesian3_default.equals(left.center, right.center) && left.radius === right.radius; +}; +BoundingSphere.prototype.intersectPlane = function(plane) { + return BoundingSphere.intersectPlane(this, plane); +}; +BoundingSphere.prototype.distanceSquaredTo = function(cartesian) { + return BoundingSphere.distanceSquaredTo(this, cartesian); +}; +BoundingSphere.prototype.computePlaneDistances = function(position, direction, result) { + return BoundingSphere.computePlaneDistances( + this, + position, + direction, + result + ); +}; +BoundingSphere.prototype.isOccluded = function(occluder) { + return BoundingSphere.isOccluded(this, occluder); +}; +BoundingSphere.prototype.equals = function(right) { + return BoundingSphere.equals(this, right); +}; +BoundingSphere.prototype.clone = function(result) { + return BoundingSphere.clone(this, result); +}; +BoundingSphere.prototype.volume = function() { + const radius = this.radius; + return volumeConstant * radius * radius * radius; +}; +var BoundingSphere_default = BoundingSphere; + +export { + GeographicProjection_default, + Intersect_default, + Interval_default, + BoundingSphere_default +}; diff --git a/public/assets/cesium/Workers/chunk-L5GODJAR.js b/public/assets/cesium/Workers/chunk-L5GODJAR.js new file mode 100644 index 0000000..9e58ea9 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-L5GODJAR.js @@ -0,0 +1,398 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CylinderGeometryLibrary_default +} from "./chunk-O72GZTSE.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CylinderGeometry.js +var radiusScratch = new Cartesian2_default(); +var normalScratch = new Cartesian3_default(); +var bitangentScratch = new Cartesian3_default(); +var tangentScratch = new Cartesian3_default(); +var positionScratch = new Cartesian3_default(); +function CylinderGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const length = options.length; + const topRadius = options.topRadius; + const bottomRadius = options.bottomRadius; + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + const slices = defaultValue_default(options.slices, 128); + if (!defined_default(length)) { + throw new DeveloperError_default("options.length must be defined."); + } + if (!defined_default(topRadius)) { + throw new DeveloperError_default("options.topRadius must be defined."); + } + if (!defined_default(bottomRadius)) { + throw new DeveloperError_default("options.bottomRadius must be defined."); + } + if (slices < 3) { + throw new DeveloperError_default( + "options.slices must be greater than or equal to 3." + ); + } + if (defined_default(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + throw new DeveloperError_default( + "GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry." + ); + } + this._length = length; + this._topRadius = topRadius; + this._bottomRadius = bottomRadius; + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._slices = slices; + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createCylinderGeometry"; +} +CylinderGeometry.packedLength = VertexFormat_default.packedLength + 5; +CylinderGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._length; + array[startingIndex++] = value._topRadius; + array[startingIndex++] = value._bottomRadius; + array[startingIndex++] = value._slices; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + vertexFormat: scratchVertexFormat, + length: void 0, + topRadius: void 0, + bottomRadius: void 0, + slices: void 0, + offsetAttribute: void 0 +}; +CylinderGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const length = array[startingIndex++]; + const topRadius = array[startingIndex++]; + const bottomRadius = array[startingIndex++]; + const slices = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.length = length; + scratchOptions.topRadius = topRadius; + scratchOptions.bottomRadius = bottomRadius; + scratchOptions.slices = slices; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new CylinderGeometry(scratchOptions); + } + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._length = length; + result._topRadius = topRadius; + result._bottomRadius = bottomRadius; + result._slices = slices; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +CylinderGeometry.createGeometry = function(cylinderGeometry) { + let length = cylinderGeometry._length; + const topRadius = cylinderGeometry._topRadius; + const bottomRadius = cylinderGeometry._bottomRadius; + const vertexFormat = cylinderGeometry._vertexFormat; + const slices = cylinderGeometry._slices; + if (length <= 0 || topRadius < 0 || bottomRadius < 0 || topRadius === 0 && bottomRadius === 0) { + return; + } + const twoSlices = slices + slices; + const threeSlices = slices + twoSlices; + const numVertices = twoSlices + twoSlices; + const positions = CylinderGeometryLibrary_default.computePositions( + length, + topRadius, + bottomRadius, + slices, + true + ); + const st = vertexFormat.st ? new Float32Array(numVertices * 2) : void 0; + const normals = vertexFormat.normal ? new Float32Array(numVertices * 3) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(numVertices * 3) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(numVertices * 3) : void 0; + let i; + const computeNormal = vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent; + if (computeNormal) { + const computeTangent = vertexFormat.tangent || vertexFormat.bitangent; + let normalIndex = 0; + let tangentIndex = 0; + let bitangentIndex = 0; + const theta = Math.atan2(bottomRadius - topRadius, length); + const normal = normalScratch; + normal.z = Math.sin(theta); + const normalScale = Math.cos(theta); + let tangent = tangentScratch; + let bitangent = bitangentScratch; + for (i = 0; i < slices; i++) { + const angle = i / slices * Math_default.TWO_PI; + const x = normalScale * Math.cos(angle); + const y = normalScale * Math.sin(angle); + if (computeNormal) { + normal.x = x; + normal.y = y; + if (computeTangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(Cartesian3_default.UNIT_Z, normal, tangent), + tangent + ); + } + if (vertexFormat.normal) { + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + } + } + } + for (i = 0; i < slices; i++) { + if (vertexFormat.normal) { + normals[normalIndex++] = 0; + normals[normalIndex++] = 0; + normals[normalIndex++] = -1; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = 1; + tangents[tangentIndex++] = 0; + tangents[tangentIndex++] = 0; + } + if (vertexFormat.bitangent) { + bitangents[bitangentIndex++] = 0; + bitangents[bitangentIndex++] = -1; + bitangents[bitangentIndex++] = 0; + } + } + for (i = 0; i < slices; i++) { + if (vertexFormat.normal) { + normals[normalIndex++] = 0; + normals[normalIndex++] = 0; + normals[normalIndex++] = 1; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = 1; + tangents[tangentIndex++] = 0; + tangents[tangentIndex++] = 0; + } + if (vertexFormat.bitangent) { + bitangents[bitangentIndex++] = 0; + bitangents[bitangentIndex++] = 1; + bitangents[bitangentIndex++] = 0; + } + } + } + const numIndices = 12 * slices - 12; + const indices = IndexDatatype_default.createTypedArray(numVertices, numIndices); + let index = 0; + let j = 0; + for (i = 0; i < slices - 1; i++) { + indices[index++] = j; + indices[index++] = j + 2; + indices[index++] = j + 3; + indices[index++] = j; + indices[index++] = j + 3; + indices[index++] = j + 1; + j += 2; + } + indices[index++] = twoSlices - 2; + indices[index++] = 0; + indices[index++] = 1; + indices[index++] = twoSlices - 2; + indices[index++] = 1; + indices[index++] = twoSlices - 1; + for (i = 1; i < slices - 1; i++) { + indices[index++] = twoSlices + i + 1; + indices[index++] = twoSlices + i; + indices[index++] = twoSlices; + } + for (i = 1; i < slices - 1; i++) { + indices[index++] = threeSlices; + indices[index++] = threeSlices + i; + indices[index++] = threeSlices + i + 1; + } + let textureCoordIndex = 0; + if (vertexFormat.st) { + const rad = Math.max(topRadius, bottomRadius); + for (i = 0; i < numVertices; i++) { + const position = Cartesian3_default.fromArray(positions, i * 3, positionScratch); + st[textureCoordIndex++] = (position.x + rad) / (2 * rad); + st[textureCoordIndex++] = (position.y + rad) / (2 * rad); + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: st + }); + } + radiusScratch.x = length * 0.5; + radiusScratch.y = Math.max(bottomRadius, topRadius); + const boundingSphere = new BoundingSphere_default( + Cartesian3_default.ZERO, + Cartesian2_default.magnitude(radiusScratch) + ); + if (defined_default(cylinderGeometry._offsetAttribute)) { + length = positions.length; + const offsetValue = cylinderGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere, + offsetAttribute: cylinderGeometry._offsetAttribute + }); +}; +var unitCylinderGeometry; +CylinderGeometry.getUnitCylinder = function() { + if (!defined_default(unitCylinderGeometry)) { + unitCylinderGeometry = CylinderGeometry.createGeometry( + new CylinderGeometry({ + topRadius: 1, + bottomRadius: 1, + length: 1, + vertexFormat: VertexFormat_default.POSITION_ONLY + }) + ); + } + return unitCylinderGeometry; +}; +var CylinderGeometry_default = CylinderGeometry; + +export { + CylinderGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-LJ2JQHJT.js b/public/assets/cesium/Workers/chunk-LJ2JQHJT.js new file mode 100644 index 0000000..cb1d717 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-LJ2JQHJT.js @@ -0,0 +1,435 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian4_default, + Matrix2_default, + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Scene/AttributeType.js +var AttributeType = { + /** + * The attribute is a single component. + * + * @type {string} + * @constant + */ + SCALAR: "SCALAR", + /** + * The attribute is a two-component vector. + * + * @type {string} + * @constant + */ + VEC2: "VEC2", + /** + * The attribute is a three-component vector. + * + * @type {string} + * @constant + */ + VEC3: "VEC3", + /** + * The attribute is a four-component vector. + * + * @type {string} + * @constant + */ + VEC4: "VEC4", + /** + * The attribute is a 2x2 matrix. + * + * @type {string} + * @constant + */ + MAT2: "MAT2", + /** + * The attribute is a 3x3 matrix. + * + * @type {string} + * @constant + */ + MAT3: "MAT3", + /** + * The attribute is a 4x4 matrix. + * + * @type {string} + * @constant + */ + MAT4: "MAT4" +}; +AttributeType.getMathType = function(attributeType) { + switch (attributeType) { + case AttributeType.SCALAR: + return Number; + case AttributeType.VEC2: + return Cartesian2_default; + case AttributeType.VEC3: + return Cartesian3_default; + case AttributeType.VEC4: + return Cartesian4_default; + case AttributeType.MAT2: + return Matrix2_default; + case AttributeType.MAT3: + return Matrix3_default; + case AttributeType.MAT4: + return Matrix4_default; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("attributeType is not a valid value."); + } +}; +AttributeType.getNumberOfComponents = function(attributeType) { + switch (attributeType) { + case AttributeType.SCALAR: + return 1; + case AttributeType.VEC2: + return 2; + case AttributeType.VEC3: + return 3; + case AttributeType.VEC4: + case AttributeType.MAT2: + return 4; + case AttributeType.MAT3: + return 9; + case AttributeType.MAT4: + return 16; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("attributeType is not a valid value."); + } +}; +AttributeType.getAttributeLocationCount = function(attributeType) { + switch (attributeType) { + case AttributeType.SCALAR: + case AttributeType.VEC2: + case AttributeType.VEC3: + case AttributeType.VEC4: + return 1; + case AttributeType.MAT2: + return 2; + case AttributeType.MAT3: + return 3; + case AttributeType.MAT4: + return 4; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("attributeType is not a valid value."); + } +}; +AttributeType.getGlslType = function(attributeType) { + Check_default.typeOf.string("attributeType", attributeType); + switch (attributeType) { + case AttributeType.SCALAR: + return "float"; + case AttributeType.VEC2: + return "vec2"; + case AttributeType.VEC3: + return "vec3"; + case AttributeType.VEC4: + return "vec4"; + case AttributeType.MAT2: + return "mat2"; + case AttributeType.MAT3: + return "mat3"; + case AttributeType.MAT4: + return "mat4"; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("attributeType is not a valid value."); + } +}; +var AttributeType_default = Object.freeze(AttributeType); + +// packages/engine/Source/Core/AttributeCompression.js +var RIGHT_SHIFT = 1 / 256; +var LEFT_SHIFT = 256; +var AttributeCompression = {}; +AttributeCompression.octEncodeInRange = function(vector, rangeMax, result) { + Check_default.defined("vector", vector); + Check_default.defined("result", result); + const magSquared = Cartesian3_default.magnitudeSquared(vector); + if (Math.abs(magSquared - 1) > Math_default.EPSILON6) { + throw new DeveloperError_default("vector must be normalized."); + } + result.x = vector.x / (Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z)); + result.y = vector.y / (Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z)); + if (vector.z < 0) { + const x = result.x; + const y = result.y; + result.x = (1 - Math.abs(y)) * Math_default.signNotZero(x); + result.y = (1 - Math.abs(x)) * Math_default.signNotZero(y); + } + result.x = Math_default.toSNorm(result.x, rangeMax); + result.y = Math_default.toSNorm(result.y, rangeMax); + return result; +}; +AttributeCompression.octEncode = function(vector, result) { + return AttributeCompression.octEncodeInRange(vector, 255, result); +}; +var octEncodeScratch = new Cartesian2_default(); +var uint8ForceArray = new Uint8Array(1); +function forceUint8(value) { + uint8ForceArray[0] = value; + return uint8ForceArray[0]; +} +AttributeCompression.octEncodeToCartesian4 = function(vector, result) { + AttributeCompression.octEncodeInRange(vector, 65535, octEncodeScratch); + result.x = forceUint8(octEncodeScratch.x * RIGHT_SHIFT); + result.y = forceUint8(octEncodeScratch.x); + result.z = forceUint8(octEncodeScratch.y * RIGHT_SHIFT); + result.w = forceUint8(octEncodeScratch.y); + return result; +}; +AttributeCompression.octDecodeInRange = function(x, y, rangeMax, result) { + Check_default.defined("result", result); + if (x < 0 || x > rangeMax || y < 0 || y > rangeMax) { + throw new DeveloperError_default( + `x and y must be unsigned normalized integers between 0 and ${rangeMax}` + ); + } + result.x = Math_default.fromSNorm(x, rangeMax); + result.y = Math_default.fromSNorm(y, rangeMax); + result.z = 1 - (Math.abs(result.x) + Math.abs(result.y)); + if (result.z < 0) { + const oldVX = result.x; + result.x = (1 - Math.abs(result.y)) * Math_default.signNotZero(oldVX); + result.y = (1 - Math.abs(oldVX)) * Math_default.signNotZero(result.y); + } + return Cartesian3_default.normalize(result, result); +}; +AttributeCompression.octDecode = function(x, y, result) { + return AttributeCompression.octDecodeInRange(x, y, 255, result); +}; +AttributeCompression.octDecodeFromCartesian4 = function(encoded, result) { + Check_default.typeOf.object("encoded", encoded); + Check_default.typeOf.object("result", result); + const x = encoded.x; + const y = encoded.y; + const z = encoded.z; + const w = encoded.w; + if (x < 0 || x > 255 || y < 0 || y > 255 || z < 0 || z > 255 || w < 0 || w > 255) { + throw new DeveloperError_default( + "x, y, z, and w must be unsigned normalized integers between 0 and 255" + ); + } + const xOct16 = x * LEFT_SHIFT + y; + const yOct16 = z * LEFT_SHIFT + w; + return AttributeCompression.octDecodeInRange(xOct16, yOct16, 65535, result); +}; +AttributeCompression.octPackFloat = function(encoded) { + Check_default.defined("encoded", encoded); + return 256 * encoded.x + encoded.y; +}; +var scratchEncodeCart2 = new Cartesian2_default(); +AttributeCompression.octEncodeFloat = function(vector) { + AttributeCompression.octEncode(vector, scratchEncodeCart2); + return AttributeCompression.octPackFloat(scratchEncodeCart2); +}; +AttributeCompression.octDecodeFloat = function(value, result) { + Check_default.defined("value", value); + const temp = value / 256; + const x = Math.floor(temp); + const y = (temp - x) * 256; + return AttributeCompression.octDecode(x, y, result); +}; +AttributeCompression.octPack = function(v1, v2, v3, result) { + Check_default.defined("v1", v1); + Check_default.defined("v2", v2); + Check_default.defined("v3", v3); + Check_default.defined("result", result); + const encoded1 = AttributeCompression.octEncodeFloat(v1); + const encoded2 = AttributeCompression.octEncodeFloat(v2); + const encoded3 = AttributeCompression.octEncode(v3, scratchEncodeCart2); + result.x = 65536 * encoded3.x + encoded1; + result.y = 65536 * encoded3.y + encoded2; + return result; +}; +AttributeCompression.octUnpack = function(packed, v1, v2, v3) { + Check_default.defined("packed", packed); + Check_default.defined("v1", v1); + Check_default.defined("v2", v2); + Check_default.defined("v3", v3); + let temp = packed.x / 65536; + const x = Math.floor(temp); + const encodedFloat1 = (temp - x) * 65536; + temp = packed.y / 65536; + const y = Math.floor(temp); + const encodedFloat2 = (temp - y) * 65536; + AttributeCompression.octDecodeFloat(encodedFloat1, v1); + AttributeCompression.octDecodeFloat(encodedFloat2, v2); + AttributeCompression.octDecode(x, y, v3); +}; +AttributeCompression.compressTextureCoordinates = function(textureCoordinates) { + Check_default.defined("textureCoordinates", textureCoordinates); + const x = textureCoordinates.x * 4095 | 0; + const y = textureCoordinates.y * 4095 | 0; + return 4096 * x + y; +}; +AttributeCompression.decompressTextureCoordinates = function(compressed, result) { + Check_default.defined("compressed", compressed); + Check_default.defined("result", result); + const temp = compressed / 4096; + const xZeroTo4095 = Math.floor(temp); + result.x = xZeroTo4095 / 4095; + result.y = (compressed - xZeroTo4095 * 4096) / 4095; + return result; +}; +function zigZagDecode(value) { + return value >> 1 ^ -(value & 1); +} +AttributeCompression.zigZagDeltaDecode = function(uBuffer, vBuffer, heightBuffer) { + Check_default.defined("uBuffer", uBuffer); + Check_default.defined("vBuffer", vBuffer); + Check_default.typeOf.number.equals( + "uBuffer.length", + "vBuffer.length", + uBuffer.length, + vBuffer.length + ); + if (defined_default(heightBuffer)) { + Check_default.typeOf.number.equals( + "uBuffer.length", + "heightBuffer.length", + uBuffer.length, + heightBuffer.length + ); + } + const count = uBuffer.length; + let u = 0; + let v = 0; + let height = 0; + for (let i = 0; i < count; ++i) { + u += zigZagDecode(uBuffer[i]); + v += zigZagDecode(vBuffer[i]); + uBuffer[i] = u; + vBuffer[i] = v; + if (defined_default(heightBuffer)) { + height += zigZagDecode(heightBuffer[i]); + heightBuffer[i] = height; + } + } +}; +AttributeCompression.dequantize = function(typedArray, componentDatatype, type, count) { + Check_default.defined("typedArray", typedArray); + Check_default.defined("componentDatatype", componentDatatype); + Check_default.defined("type", type); + Check_default.defined("count", count); + const componentsPerAttribute = AttributeType_default.getNumberOfComponents(type); + let divisor; + switch (componentDatatype) { + case ComponentDatatype_default.BYTE: + divisor = 127; + break; + case ComponentDatatype_default.UNSIGNED_BYTE: + divisor = 255; + break; + case ComponentDatatype_default.SHORT: + divisor = 32767; + break; + case ComponentDatatype_default.UNSIGNED_SHORT: + divisor = 65535; + break; + case ComponentDatatype_default.INT: + divisor = 2147483647; + break; + case ComponentDatatype_default.UNSIGNED_INT: + divisor = 4294967295; + break; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default( + `Cannot dequantize component datatype: ${componentDatatype}` + ); + } + const dequantizedTypedArray = new Float32Array( + count * componentsPerAttribute + ); + for (let i = 0; i < count; i++) { + for (let j = 0; j < componentsPerAttribute; j++) { + const index = i * componentsPerAttribute + j; + dequantizedTypedArray[index] = Math.max( + typedArray[index] / divisor, + -1 + ); + } + } + return dequantizedTypedArray; +}; +AttributeCompression.decodeRGB565 = function(typedArray, result) { + Check_default.defined("typedArray", typedArray); + const expectedLength = typedArray.length * 3; + if (defined_default(result)) { + Check_default.typeOf.number.equals( + "result.length", + "typedArray.length * 3", + result.length, + expectedLength + ); + } + const count = typedArray.length; + if (!defined_default(result)) { + result = new Float32Array(count * 3); + } + const mask5 = (1 << 5) - 1; + const mask6 = (1 << 6) - 1; + const normalize5 = 1 / 31; + const normalize6 = 1 / 63; + for (let i = 0; i < count; i++) { + const value = typedArray[i]; + const red = value >> 11; + const green = value >> 5 & mask6; + const blue = value & mask5; + const offset = 3 * i; + result[offset] = red * normalize5; + result[offset + 1] = green * normalize6; + result[offset + 2] = blue * normalize5; + } + return result; +}; +var AttributeCompression_default = AttributeCompression; + +export { + AttributeCompression_default +}; diff --git a/public/assets/cesium/Workers/chunk-LLAF3CPH.js b/public/assets/cesium/Workers/chunk-LLAF3CPH.js new file mode 100644 index 0000000..887d713 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-LLAF3CPH.js @@ -0,0 +1,58 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/RuntimeError.js +function RuntimeError(message) { + this.name = "RuntimeError"; + this.message = message; + let stack; + try { + throw new Error(); + } catch (e) { + stack = e.stack; + } + this.stack = stack; +} +if (defined_default(Object.create)) { + RuntimeError.prototype = Object.create(Error.prototype); + RuntimeError.prototype.constructor = RuntimeError; +} +RuntimeError.prototype.toString = function() { + let str = `${this.name}: ${this.message}`; + if (defined_default(this.stack)) { + str += ` +${this.stack.toString()}`; + } + return str; +}; +var RuntimeError_default = RuntimeError; + +export { + RuntimeError_default +}; diff --git a/public/assets/cesium/Workers/chunk-M24KHENR.js b/public/assets/cesium/Workers/chunk-M24KHENR.js new file mode 100644 index 0000000..7279ab8 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-M24KHENR.js @@ -0,0 +1,1800 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + __commonJS, + __require +} from "./chunk-YCDZX5LS.js"; + +// node_modules/draco3d/draco_decoder_nodejs.js +var require_draco_decoder_nodejs = __commonJS({ + "node_modules/draco3d/draco_decoder_nodejs.js"(exports, module) { + var $jscomp = $jscomp || {}; + $jscomp.scope = {}; + $jscomp.arrayIteratorImpl = function(k) { + var n = 0; + return function() { + return n < k.length ? { done: false, value: k[n++] } : { done: true }; + }; + }; + $jscomp.arrayIterator = function(k) { + return { next: $jscomp.arrayIteratorImpl(k) }; + }; + $jscomp.makeIterator = function(k) { + var n = "undefined" != typeof Symbol && Symbol.iterator && k[Symbol.iterator]; + return n ? n.call(k) : $jscomp.arrayIterator(k); + }; + $jscomp.ASSUME_ES5 = false; + $jscomp.ASSUME_NO_NATIVE_MAP = false; + $jscomp.ASSUME_NO_NATIVE_SET = false; + $jscomp.SIMPLE_FROUND_POLYFILL = false; + $jscomp.ISOLATE_POLYFILLS = false; + $jscomp.FORCE_POLYFILL_PROMISE = false; + $jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION = false; + $jscomp.getGlobal = function(k) { + k = ["object" == typeof globalThis && globalThis, k, "object" == typeof window && window, "object" == typeof self && self, "object" == typeof global && global]; + for (var n = 0; n < k.length; ++n) { + var l = k[n]; + if (l && l.Math == Math) return l; + } + throw Error("Cannot find global object"); + }; + $jscomp.global = $jscomp.getGlobal(exports); + $jscomp.defineProperty = $jscomp.ASSUME_ES5 || "function" == typeof Object.defineProperties ? Object.defineProperty : function(k, n, l) { + if (k == Array.prototype || k == Object.prototype) return k; + k[n] = l.value; + return k; + }; + $jscomp.IS_SYMBOL_NATIVE = "function" === typeof Symbol && "symbol" === typeof Symbol("x"); + $jscomp.TRUST_ES6_POLYFILLS = !$jscomp.ISOLATE_POLYFILLS || $jscomp.IS_SYMBOL_NATIVE; + $jscomp.polyfills = {}; + $jscomp.propertyToPolyfillSymbol = {}; + $jscomp.POLYFILL_PREFIX = "$jscp$"; + $jscomp.polyfill = function(k, n, l, p) { + n && ($jscomp.ISOLATE_POLYFILLS ? $jscomp.polyfillIsolated(k, n, l, p) : $jscomp.polyfillUnisolated(k, n, l, p)); + }; + $jscomp.polyfillUnisolated = function(k, n, l, p) { + l = $jscomp.global; + k = k.split("."); + for (p = 0; p < k.length - 1; p++) { + var h = k[p]; + if (!(h in l)) return; + l = l[h]; + } + k = k[k.length - 1]; + p = l[k]; + n = n(p); + n != p && null != n && $jscomp.defineProperty(l, k, { configurable: true, writable: true, value: n }); + }; + $jscomp.polyfillIsolated = function(k, n, l, p) { + var h = k.split("."); + k = 1 === h.length; + p = h[0]; + p = !k && p in $jscomp.polyfills ? $jscomp.polyfills : $jscomp.global; + for (var A = 0; A < h.length - 1; A++) { + var f = h[A]; + if (!(f in p)) return; + p = p[f]; + } + h = h[h.length - 1]; + l = $jscomp.IS_SYMBOL_NATIVE && "es6" === l ? p[h] : null; + n = n(l); + null != n && (k ? $jscomp.defineProperty($jscomp.polyfills, h, { configurable: true, writable: true, value: n }) : n !== l && (void 0 === $jscomp.propertyToPolyfillSymbol[h] && (l = 1e9 * Math.random() >>> 0, $jscomp.propertyToPolyfillSymbol[h] = $jscomp.IS_SYMBOL_NATIVE ? $jscomp.global.Symbol(h) : $jscomp.POLYFILL_PREFIX + l + "$" + h), $jscomp.defineProperty(p, $jscomp.propertyToPolyfillSymbol[h], { configurable: true, writable: true, value: n }))); + }; + $jscomp.polyfill("Promise", function(k) { + function n() { + this.batch_ = null; + } + function l(f) { + return f instanceof h ? f : new h(function(q, v) { + q(f); + }); + } + if (k && (!($jscomp.FORCE_POLYFILL_PROMISE || $jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION && "undefined" === typeof $jscomp.global.PromiseRejectionEvent) || !$jscomp.global.Promise || -1 === $jscomp.global.Promise.toString().indexOf("[native code]"))) return k; + n.prototype.asyncExecute = function(f) { + if (null == this.batch_) { + this.batch_ = []; + var q = this; + this.asyncExecuteFunction(function() { + q.executeBatch_(); + }); + } + this.batch_.push(f); + }; + var p = $jscomp.global.setTimeout; + n.prototype.asyncExecuteFunction = function(f) { + p(f, 0); + }; + n.prototype.executeBatch_ = function() { + for (; this.batch_ && this.batch_.length; ) { + var f = this.batch_; + this.batch_ = []; + for (var q = 0; q < f.length; ++q) { + var v = f[q]; + f[q] = null; + try { + v(); + } catch (z) { + this.asyncThrow_(z); + } + } + } + this.batch_ = null; + }; + n.prototype.asyncThrow_ = function(f) { + this.asyncExecuteFunction(function() { + throw f; + }); + }; + var h = function(f) { + this.state_ = 0; + this.result_ = void 0; + this.onSettledCallbacks_ = []; + this.isRejectionHandled_ = false; + var q = this.createResolveAndReject_(); + try { + f(q.resolve, q.reject); + } catch (v) { + q.reject(v); + } + }; + h.prototype.createResolveAndReject_ = function() { + function f(z) { + return function(O) { + v || (v = true, z.call(q, O)); + }; + } + var q = this, v = false; + return { resolve: f(this.resolveTo_), reject: f(this.reject_) }; + }; + h.prototype.resolveTo_ = function(f) { + if (f === this) this.reject_(new TypeError("A Promise cannot resolve to itself")); + else if (f instanceof h) this.settleSameAsPromise_(f); + else { + a: switch (typeof f) { + case "object": + var q = null != f; + break a; + case "function": + q = true; + break a; + default: + q = false; + } + q ? this.resolveToNonPromiseObj_(f) : this.fulfill_(f); + } + }; + h.prototype.resolveToNonPromiseObj_ = function(f) { + var q = void 0; + try { + q = f.then; + } catch (v) { + this.reject_(v); + return; + } + "function" == typeof q ? this.settleSameAsThenable_(q, f) : this.fulfill_(f); + }; + h.prototype.reject_ = function(f) { + this.settle_(2, f); + }; + h.prototype.fulfill_ = function(f) { + this.settle_(1, f); + }; + h.prototype.settle_ = function(f, q) { + if (0 != this.state_) throw Error("Cannot settle(" + f + ", " + q + "): Promise already settled in state" + this.state_); + this.state_ = f; + this.result_ = q; + 2 === this.state_ && this.scheduleUnhandledRejectionCheck_(); + this.executeOnSettledCallbacks_(); + }; + h.prototype.scheduleUnhandledRejectionCheck_ = function() { + var f = this; + p(function() { + if (f.notifyUnhandledRejection_()) { + var q = $jscomp.global.console; + "undefined" !== typeof q && q.error(f.result_); + } + }, 1); + }; + h.prototype.notifyUnhandledRejection_ = function() { + if (this.isRejectionHandled_) return false; + var f = $jscomp.global.CustomEvent, q = $jscomp.global.Event, v = $jscomp.global.dispatchEvent; + if ("undefined" === typeof v) return true; + "function" === typeof f ? f = new f("unhandledrejection", { cancelable: true }) : "function" === typeof q ? f = new q("unhandledrejection", { cancelable: true }) : (f = $jscomp.global.document.createEvent("CustomEvent"), f.initCustomEvent("unhandledrejection", false, true, f)); + f.promise = this; + f.reason = this.result_; + return v(f); + }; + h.prototype.executeOnSettledCallbacks_ = function() { + if (null != this.onSettledCallbacks_) { + for (var f = 0; f < this.onSettledCallbacks_.length; ++f) A.asyncExecute(this.onSettledCallbacks_[f]); + this.onSettledCallbacks_ = null; + } + }; + var A = new n(); + h.prototype.settleSameAsPromise_ = function(f) { + var q = this.createResolveAndReject_(); + f.callWhenSettled_(q.resolve, q.reject); + }; + h.prototype.settleSameAsThenable_ = function(f, q) { + var v = this.createResolveAndReject_(); + try { + f.call(q, v.resolve, v.reject); + } catch (z) { + v.reject(z); + } + }; + h.prototype.then = function(f, q) { + function v(t, x) { + return "function" == typeof t ? function(D) { + try { + z(t(D)); + } catch (R) { + O(R); + } + } : x; + } + var z, O, ba = new h(function(t, x) { + z = t; + O = x; + }); + this.callWhenSettled_(v(f, z), v(q, O)); + return ba; + }; + h.prototype.catch = function(f) { + return this.then(void 0, f); + }; + h.prototype.callWhenSettled_ = function(f, q) { + function v() { + switch (z.state_) { + case 1: + f(z.result_); + break; + case 2: + q(z.result_); + break; + default: + throw Error("Unexpected state: " + z.state_); + } + } + var z = this; + null == this.onSettledCallbacks_ ? A.asyncExecute(v) : this.onSettledCallbacks_.push(v); + this.isRejectionHandled_ = true; + }; + h.resolve = l; + h.reject = function(f) { + return new h(function(q, v) { + v(f); + }); + }; + h.race = function(f) { + return new h(function(q, v) { + for (var z = $jscomp.makeIterator(f), O = z.next(); !O.done; O = z.next()) l(O.value).callWhenSettled_(q, v); + }); + }; + h.all = function(f) { + var q = $jscomp.makeIterator(f), v = q.next(); + return v.done ? l([]) : new h(function(z, O) { + function ba(D) { + return function(R) { + t[D] = R; + x--; + 0 == x && z(t); + }; + } + var t = [], x = 0; + do + t.push(void 0), x++, l(v.value).callWhenSettled_(ba(t.length - 1), O), v = q.next(); + while (!v.done); + }); + }; + return h; + }, "es6", "es3"); + $jscomp.owns = function(k, n) { + return Object.prototype.hasOwnProperty.call(k, n); + }; + $jscomp.assign = $jscomp.TRUST_ES6_POLYFILLS && "function" == typeof Object.assign ? Object.assign : function(k, n) { + for (var l = 1; l < arguments.length; l++) { + var p = arguments[l]; + if (p) for (var h in p) $jscomp.owns(p, h) && (k[h] = p[h]); + } + return k; + }; + $jscomp.polyfill("Object.assign", function(k) { + return k || $jscomp.assign; + }, "es6", "es3"); + $jscomp.checkStringArgs = function(k, n, l) { + if (null == k) throw new TypeError("The 'this' value for String.prototype." + l + " must not be null or undefined"); + if (n instanceof RegExp) throw new TypeError("First argument to String.prototype." + l + " must not be a regular expression"); + return k + ""; + }; + $jscomp.polyfill("String.prototype.startsWith", function(k) { + return k ? k : function(n, l) { + var p = $jscomp.checkStringArgs(this, n, "startsWith"); + n += ""; + var h = p.length, A = n.length; + l = Math.max(0, Math.min(l | 0, p.length)); + for (var f = 0; f < A && l < h; ) if (p[l++] != n[f++]) return false; + return f >= A; + }; + }, "es6", "es3"); + $jscomp.polyfill("Array.prototype.copyWithin", function(k) { + function n(l) { + l = Number(l); + return Infinity === l || -Infinity === l ? l : l | 0; + } + return k ? k : function(l, p, h) { + var A = this.length; + l = n(l); + p = n(p); + h = void 0 === h ? A : n(h); + l = 0 > l ? Math.max(A + l, 0) : Math.min(l, A); + p = 0 > p ? Math.max(A + p, 0) : Math.min(p, A); + h = 0 > h ? Math.max(A + h, 0) : Math.min(h, A); + if (l < p) for (; p < h; ) p in this ? this[l++] = this[p++] : (delete this[l++], p++); + else for (h = Math.min(h, A + p - l), l += h - p; h > p; ) --h in this ? this[--l] = this[h] : delete this[--l]; + return this; + }; + }, "es6", "es3"); + $jscomp.typedArrayCopyWithin = function(k) { + return k ? k : Array.prototype.copyWithin; + }; + $jscomp.polyfill("Int8Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Uint8Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Uint8ClampedArray.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Int16Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Uint16Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Int32Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Uint32Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Float32Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + $jscomp.polyfill("Float64Array.prototype.copyWithin", $jscomp.typedArrayCopyWithin, "es6", "es5"); + var DracoDecoderModule = function() { + var k = "undefined" !== typeof document && document.currentScript ? document.currentScript.src : void 0; + "undefined" !== typeof __filename && (k = k || __filename); + return function(n) { + function l(e) { + return a.locateFile ? a.locateFile(e, U) : U + e; + } + function p(e, b, c) { + var d = b + c; + for (c = b; e[c] && !(c >= d); ) ++c; + if (16 < c - b && e.buffer && va) return va.decode(e.subarray(b, c)); + for (d = ""; b < c; ) { + var g = e[b++]; + if (g & 128) { + var u = e[b++] & 63; + if (192 == (g & 224)) d += String.fromCharCode((g & 31) << 6 | u); + else { + var X = e[b++] & 63; + g = 224 == (g & 240) ? (g & 15) << 12 | u << 6 | X : (g & 7) << 18 | u << 12 | X << 6 | e[b++] & 63; + 65536 > g ? d += String.fromCharCode(g) : (g -= 65536, d += String.fromCharCode(55296 | g >> 10, 56320 | g & 1023)); + } + } else d += String.fromCharCode(g); + } + return d; + } + function h(e, b) { + return e ? p(ea, e, b) : ""; + } + function A() { + var e = ja.buffer; + a.HEAP8 = Y = new Int8Array(e); + a.HEAP16 = new Int16Array(e); + a.HEAP32 = ca = new Int32Array(e); + a.HEAPU8 = ea = new Uint8Array(e); + a.HEAPU16 = new Uint16Array(e); + a.HEAPU32 = V = new Uint32Array(e); + a.HEAPF32 = new Float32Array(e); + a.HEAPF64 = new Float64Array(e); + } + function f(e) { + if (a.onAbort) a.onAbort(e); + e = "Aborted(" + e + ")"; + da(e); + wa = true; + e = new WebAssembly.RuntimeError(e + ". Build with -sASSERTIONS for more info."); + ka(e); + throw e; + } + function q(e) { + try { + if (e == P && fa) return new Uint8Array(fa); + if (ma) return ma(e); + throw "both async and sync fetching of the wasm failed"; + } catch (b) { + f(b); + } + } + function v() { + if (!fa && (xa || ha)) { + if ("function" == typeof fetch && !P.startsWith("file://")) return fetch(P, { credentials: "same-origin" }).then(function(e) { + if (!e.ok) throw "failed to load wasm binary file at '" + P + "'"; + return e.arrayBuffer(); + }).catch(function() { + return q(P); + }); + if (na) return new Promise(function(e, b) { + na(P, function(c) { + e(new Uint8Array(c)); + }, b); + }); + } + return Promise.resolve().then(function() { + return q(P); + }); + } + function z(e) { + for (; 0 < e.length; ) e.shift()(a); + } + function O(e) { + this.excPtr = e; + this.ptr = e - 24; + this.set_type = function(b) { + V[this.ptr + 4 >> 2] = b; + }; + this.get_type = function() { + return V[this.ptr + 4 >> 2]; + }; + this.set_destructor = function(b) { + V[this.ptr + 8 >> 2] = b; + }; + this.get_destructor = function() { + return V[this.ptr + 8 >> 2]; + }; + this.set_refcount = function(b) { + ca[this.ptr >> 2] = b; + }; + this.set_caught = function(b) { + Y[this.ptr + 12 >> 0] = b ? 1 : 0; + }; + this.get_caught = function() { + return 0 != Y[this.ptr + 12 >> 0]; + }; + this.set_rethrown = function(b) { + Y[this.ptr + 13 >> 0] = b ? 1 : 0; + }; + this.get_rethrown = function() { + return 0 != Y[this.ptr + 13 >> 0]; + }; + this.init = function(b, c) { + this.set_adjusted_ptr(0); + this.set_type(b); + this.set_destructor(c); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + }; + this.add_ref = function() { + ca[this.ptr >> 2] += 1; + }; + this.release_ref = function() { + var b = ca[this.ptr >> 2]; + ca[this.ptr >> 2] = b - 1; + return 1 === b; + }; + this.set_adjusted_ptr = function(b) { + V[this.ptr + 16 >> 2] = b; + }; + this.get_adjusted_ptr = function() { + return V[this.ptr + 16 >> 2]; + }; + this.get_exception_ptr = function() { + if (ya(this.get_type())) return V[this.excPtr >> 2]; + var b = this.get_adjusted_ptr(); + return 0 !== b ? b : this.excPtr; + }; + } + function ba() { + function e() { + if (!la && (la = true, a.calledRun = true, !wa)) { + za = true; + z(oa); + Aa(a); + if (a.onRuntimeInitialized) a.onRuntimeInitialized(); + if (a.postRun) for ("function" == typeof a.postRun && (a.postRun = [a.postRun]); a.postRun.length; ) Ba.unshift(a.postRun.shift()); + z(Ba); + } + } + if (!(0 < aa)) { + if (a.preRun) for ("function" == typeof a.preRun && (a.preRun = [a.preRun]); a.preRun.length; ) Ca.unshift(a.preRun.shift()); + z(Ca); + 0 < aa || (a.setStatus ? (a.setStatus("Running..."), setTimeout(function() { + setTimeout(function() { + a.setStatus(""); + }, 1); + e(); + }, 1)) : e()); + } + } + function t() { + } + function x(e) { + return (e || t).__cache__; + } + function D(e, b) { + var c = x(b), d = c[e]; + if (d) return d; + d = Object.create((b || t).prototype); + d.ptr = e; + return c[e] = d; + } + function R(e) { + if ("string" === typeof e) { + for (var b = 0, c = 0; c < e.length; ++c) { + var d = e.charCodeAt(c); + 127 >= d ? b++ : 2047 >= d ? b += 2 : 55296 <= d && 57343 >= d ? (b += 4, ++c) : b += 3; + } + b = Array(b + 1); + c = 0; + d = b.length; + if (0 < d) { + d = c + d - 1; + for (var g = 0; g < e.length; ++g) { + var u = e.charCodeAt(g); + if (55296 <= u && 57343 >= u) { + var X = e.charCodeAt(++g); + u = 65536 + ((u & 1023) << 10) | X & 1023; + } + if (127 >= u) { + if (c >= d) break; + b[c++] = u; + } else { + if (2047 >= u) { + if (c + 1 >= d) break; + b[c++] = 192 | u >> 6; + } else { + if (65535 >= u) { + if (c + 2 >= d) break; + b[c++] = 224 | u >> 12; + } else { + if (c + 3 >= d) break; + b[c++] = 240 | u >> 18; + b[c++] = 128 | u >> 12 & 63; + } + b[c++] = 128 | u >> 6 & 63; + } + b[c++] = 128 | u & 63; + } + } + b[c] = 0; + } + e = r.alloc(b, Y); + r.copy(b, Y, e); + return e; + } + return e; + } + function pa(e) { + if ("object" === typeof e) { + var b = r.alloc(e, Y); + r.copy(e, Y, b); + return b; + } + return e; + } + function Z() { + throw "cannot construct a VoidPtr, no constructor in IDL"; + } + function S() { + this.ptr = Da(); + x(S)[this.ptr] = this; + } + function Q() { + this.ptr = Ea(); + x(Q)[this.ptr] = this; + } + function W() { + this.ptr = Fa(); + x(W)[this.ptr] = this; + } + function w() { + this.ptr = Ga(); + x(w)[this.ptr] = this; + } + function C() { + this.ptr = Ha(); + x(C)[this.ptr] = this; + } + function F() { + this.ptr = Ia(); + x(F)[this.ptr] = this; + } + function G() { + this.ptr = Ja(); + x(G)[this.ptr] = this; + } + function E() { + this.ptr = Ka(); + x(E)[this.ptr] = this; + } + function T() { + this.ptr = La(); + x(T)[this.ptr] = this; + } + function B() { + throw "cannot construct a Status, no constructor in IDL"; + } + function H() { + this.ptr = Ma(); + x(H)[this.ptr] = this; + } + function I() { + this.ptr = Na(); + x(I)[this.ptr] = this; + } + function J() { + this.ptr = Oa(); + x(J)[this.ptr] = this; + } + function K() { + this.ptr = Pa(); + x(K)[this.ptr] = this; + } + function L() { + this.ptr = Qa(); + x(L)[this.ptr] = this; + } + function M() { + this.ptr = Ra(); + x(M)[this.ptr] = this; + } + function N() { + this.ptr = Sa(); + x(N)[this.ptr] = this; + } + function y() { + this.ptr = Ta(); + x(y)[this.ptr] = this; + } + function m() { + this.ptr = Ua(); + x(m)[this.ptr] = this; + } + n = void 0 === n ? {} : n; + var a = "undefined" != typeof n ? n : {}, Aa, ka; + a.ready = new Promise(function(e, b) { + Aa = e; + ka = b; + }); + var Va = false, Wa = false; + a.onRuntimeInitialized = function() { + Va = true; + if (Wa && "function" === typeof a.onModuleLoaded) a.onModuleLoaded(a); + }; + a.onModuleParsed = function() { + Wa = true; + if (Va && "function" === typeof a.onModuleLoaded) a.onModuleLoaded(a); + }; + a.isVersionSupported = function(e) { + if ("string" !== typeof e) return false; + e = e.split("."); + return 2 > e.length || 3 < e.length ? false : 1 == e[0] && 0 <= e[1] && 5 >= e[1] ? true : 0 != e[0] || 10 < e[1] ? false : true; + }; + var Xa = Object.assign({}, a), xa = "object" == typeof window, ha = "function" == typeof importScripts, Ya = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, U = ""; + if (Ya) { + var Za = __require("fs"), qa = __require("path"); + U = ha ? qa.dirname(U) + "/" : __dirname + "/"; + var $a = function(e, b) { + e = e.startsWith("file://") ? new URL(e) : qa.normalize(e); + return Za.readFileSync(e, b ? void 0 : "utf8"); + }; + var ma = function(e) { + e = $a(e, true); + e.buffer || (e = new Uint8Array(e)); + return e; + }; + var na = function(e, b, c) { + e = e.startsWith("file://") ? new URL(e) : qa.normalize(e); + Za.readFile(e, function(d, g) { + d ? c(d) : b(g.buffer); + }); + }; + 1 < process.argv.length && process.argv[1].replace(/\\/g, "/"); + process.argv.slice(2); + a.inspect = function() { + return "[Emscripten Module object]"; + }; + } else if (xa || ha) ha ? U = self.location.href : "undefined" != typeof document && document.currentScript && (U = document.currentScript.src), k && (U = k), U = 0 !== U.indexOf("blob:") ? U.substr(0, U.replace(/[?#].*/, "").lastIndexOf("/") + 1) : "", $a = function(e) { + var b = new XMLHttpRequest(); + b.open("GET", e, false); + b.send(null); + return b.responseText; + }, ha && (ma = function(e) { + var b = new XMLHttpRequest(); + b.open("GET", e, false); + b.responseType = "arraybuffer"; + b.send(null); + return new Uint8Array(b.response); + }), na = function(e, b, c) { + var d = new XMLHttpRequest(); + d.open("GET", e, true); + d.responseType = "arraybuffer"; + d.onload = function() { + 200 == d.status || 0 == d.status && d.response ? b(d.response) : c(); + }; + d.onerror = c; + d.send(null); + }; + var ud = a.print || console.log.bind(console), da = a.printErr || console.warn.bind(console); + Object.assign(a, Xa); + Xa = null; + var fa; + a.wasmBinary && (fa = a.wasmBinary); + "object" != typeof WebAssembly && f("no native wasm support detected"); + var ja, wa = false, va = "undefined" != typeof TextDecoder ? new TextDecoder("utf8") : void 0, Y, ea, ca, V, Ca = [], oa = [], Ba = [], za = false, aa = 0, ra = null, ia = null; + var P = "draco_decoder.wasm"; + P.startsWith("data:application/octet-stream;base64,") || (P = l(P)); + var vd = 0, wd = [null, [], []], xd = { b: function(e, b, c) { + new O(e).init(b, c); + vd++; + throw e; + }, a: function() { + f(""); + }, g: function(e, b, c) { + ea.copyWithin(e, b, b + c); + }, e: function(e) { + var b = ea.length; + e >>>= 0; + if (2147483648 < e) return false; + for (var c = 1; 4 >= c; c *= 2) { + var d = b * (1 + 0.2 / c); + d = Math.min(d, e + 100663296); + var g = Math; + d = Math.max(e, d); + g = g.min.call(g, 2147483648, d + (65536 - d % 65536) % 65536); + a: { + d = ja.buffer; + try { + ja.grow(g - d.byteLength + 65535 >>> 16); + A(); + var u = 1; + break a; + } catch (X) { + } + u = void 0; + } + if (u) return true; + } + return false; + }, f: function(e) { + return 52; + }, d: function(e, b, c, d, g) { + return 70; + }, c: function(e, b, c, d) { + for (var g = 0, u = 0; u < c; u++) { + var X = V[b >> 2], ab = V[b + 4 >> 2]; + b += 8; + for (var sa = 0; sa < ab; sa++) { + var ta = ea[X + sa], ua = wd[e]; + 0 === ta || 10 === ta ? ((1 === e ? ud : da)(p(ua, 0)), ua.length = 0) : ua.push(ta); + } + g += ab; + } + V[d >> 2] = g; + return 0; + } }; + (function() { + function e(g, u) { + a.asm = g.exports; + ja = a.asm.h; + A(); + oa.unshift(a.asm.i); + aa--; + a.monitorRunDependencies && a.monitorRunDependencies(aa); + 0 == aa && (null !== ra && (clearInterval(ra), ra = null), ia && (g = ia, ia = null, g())); + } + function b(g) { + e(g.instance); + } + function c(g) { + return v().then(function(u) { + return WebAssembly.instantiate(u, d); + }).then(function(u) { + return u; + }).then(g, function(u) { + da("failed to asynchronously prepare wasm: " + u); + f(u); + }); + } + var d = { a: xd }; + aa++; + a.monitorRunDependencies && a.monitorRunDependencies(aa); + if (a.instantiateWasm) try { + return a.instantiateWasm(d, e); + } catch (g) { + da("Module.instantiateWasm callback failed with error: " + g), ka(g); + } + (function() { + return fa || "function" != typeof WebAssembly.instantiateStreaming || P.startsWith("data:application/octet-stream;base64,") || P.startsWith("file://") || Ya || "function" != typeof fetch ? c(b) : fetch(P, { credentials: "same-origin" }).then(function(g) { + return WebAssembly.instantiateStreaming(g, d).then(b, function(u) { + da("wasm streaming compile failed: " + u); + da("falling back to ArrayBuffer instantiation"); + return c(b); + }); + }); + })().catch(ka); + return {}; + })(); + var bb = a._emscripten_bind_VoidPtr___destroy___0 = function() { + return (bb = a._emscripten_bind_VoidPtr___destroy___0 = a.asm.k).apply(null, arguments); + }, Da = a._emscripten_bind_DecoderBuffer_DecoderBuffer_0 = function() { + return (Da = a._emscripten_bind_DecoderBuffer_DecoderBuffer_0 = a.asm.l).apply(null, arguments); + }, cb = a._emscripten_bind_DecoderBuffer_Init_2 = function() { + return (cb = a._emscripten_bind_DecoderBuffer_Init_2 = a.asm.m).apply(null, arguments); + }, db = a._emscripten_bind_DecoderBuffer___destroy___0 = function() { + return (db = a._emscripten_bind_DecoderBuffer___destroy___0 = a.asm.n).apply(null, arguments); + }, Ea = a._emscripten_bind_AttributeTransformData_AttributeTransformData_0 = function() { + return (Ea = a._emscripten_bind_AttributeTransformData_AttributeTransformData_0 = a.asm.o).apply(null, arguments); + }, eb = a._emscripten_bind_AttributeTransformData_transform_type_0 = function() { + return (eb = a._emscripten_bind_AttributeTransformData_transform_type_0 = a.asm.p).apply(null, arguments); + }, fb = a._emscripten_bind_AttributeTransformData___destroy___0 = function() { + return (fb = a._emscripten_bind_AttributeTransformData___destroy___0 = a.asm.q).apply(null, arguments); + }, Fa = a._emscripten_bind_GeometryAttribute_GeometryAttribute_0 = function() { + return (Fa = a._emscripten_bind_GeometryAttribute_GeometryAttribute_0 = a.asm.r).apply(null, arguments); + }, gb = a._emscripten_bind_GeometryAttribute___destroy___0 = function() { + return (gb = a._emscripten_bind_GeometryAttribute___destroy___0 = a.asm.s).apply(null, arguments); + }, Ga = a._emscripten_bind_PointAttribute_PointAttribute_0 = function() { + return (Ga = a._emscripten_bind_PointAttribute_PointAttribute_0 = a.asm.t).apply(null, arguments); + }, hb = a._emscripten_bind_PointAttribute_size_0 = function() { + return (hb = a._emscripten_bind_PointAttribute_size_0 = a.asm.u).apply(null, arguments); + }, ib = a._emscripten_bind_PointAttribute_GetAttributeTransformData_0 = function() { + return (ib = a._emscripten_bind_PointAttribute_GetAttributeTransformData_0 = a.asm.v).apply(null, arguments); + }, jb = a._emscripten_bind_PointAttribute_attribute_type_0 = function() { + return (jb = a._emscripten_bind_PointAttribute_attribute_type_0 = a.asm.w).apply(null, arguments); + }, kb = a._emscripten_bind_PointAttribute_data_type_0 = function() { + return (kb = a._emscripten_bind_PointAttribute_data_type_0 = a.asm.x).apply(null, arguments); + }, lb = a._emscripten_bind_PointAttribute_num_components_0 = function() { + return (lb = a._emscripten_bind_PointAttribute_num_components_0 = a.asm.y).apply(null, arguments); + }, mb = a._emscripten_bind_PointAttribute_normalized_0 = function() { + return (mb = a._emscripten_bind_PointAttribute_normalized_0 = a.asm.z).apply(null, arguments); + }, nb = a._emscripten_bind_PointAttribute_byte_stride_0 = function() { + return (nb = a._emscripten_bind_PointAttribute_byte_stride_0 = a.asm.A).apply(null, arguments); + }, ob = a._emscripten_bind_PointAttribute_byte_offset_0 = function() { + return (ob = a._emscripten_bind_PointAttribute_byte_offset_0 = a.asm.B).apply(null, arguments); + }, pb = a._emscripten_bind_PointAttribute_unique_id_0 = function() { + return (pb = a._emscripten_bind_PointAttribute_unique_id_0 = a.asm.C).apply(null, arguments); + }, qb = a._emscripten_bind_PointAttribute___destroy___0 = function() { + return (qb = a._emscripten_bind_PointAttribute___destroy___0 = a.asm.D).apply(null, arguments); + }, Ha = a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0 = function() { + return (Ha = a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0 = a.asm.E).apply(null, arguments); + }, rb = a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1 = function() { + return (rb = a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1 = a.asm.F).apply(null, arguments); + }, sb = a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0 = function() { + return (sb = a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0 = a.asm.G).apply(null, arguments); + }, tb = a._emscripten_bind_AttributeQuantizationTransform_min_value_1 = function() { + return (tb = a._emscripten_bind_AttributeQuantizationTransform_min_value_1 = a.asm.H).apply(null, arguments); + }, ub = a._emscripten_bind_AttributeQuantizationTransform_range_0 = function() { + return (ub = a._emscripten_bind_AttributeQuantizationTransform_range_0 = a.asm.I).apply(null, arguments); + }, vb = a._emscripten_bind_AttributeQuantizationTransform___destroy___0 = function() { + return (vb = a._emscripten_bind_AttributeQuantizationTransform___destroy___0 = a.asm.J).apply(null, arguments); + }, Ia = a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0 = function() { + return (Ia = a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0 = a.asm.K).apply(null, arguments); + }, wb = a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1 = function() { + return (wb = a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1 = a.asm.L).apply( + null, + arguments + ); + }, xb = a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0 = function() { + return (xb = a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0 = a.asm.M).apply(null, arguments); + }, yb = a._emscripten_bind_AttributeOctahedronTransform___destroy___0 = function() { + return (yb = a._emscripten_bind_AttributeOctahedronTransform___destroy___0 = a.asm.N).apply(null, arguments); + }, Ja = a._emscripten_bind_PointCloud_PointCloud_0 = function() { + return (Ja = a._emscripten_bind_PointCloud_PointCloud_0 = a.asm.O).apply( + null, + arguments + ); + }, zb = a._emscripten_bind_PointCloud_num_attributes_0 = function() { + return (zb = a._emscripten_bind_PointCloud_num_attributes_0 = a.asm.P).apply(null, arguments); + }, Ab = a._emscripten_bind_PointCloud_num_points_0 = function() { + return (Ab = a._emscripten_bind_PointCloud_num_points_0 = a.asm.Q).apply(null, arguments); + }, Bb = a._emscripten_bind_PointCloud___destroy___0 = function() { + return (Bb = a._emscripten_bind_PointCloud___destroy___0 = a.asm.R).apply(null, arguments); + }, Ka = a._emscripten_bind_Mesh_Mesh_0 = function() { + return (Ka = a._emscripten_bind_Mesh_Mesh_0 = a.asm.S).apply(null, arguments); + }, Cb = a._emscripten_bind_Mesh_num_faces_0 = function() { + return (Cb = a._emscripten_bind_Mesh_num_faces_0 = a.asm.T).apply(null, arguments); + }, Db = a._emscripten_bind_Mesh_num_attributes_0 = function() { + return (Db = a._emscripten_bind_Mesh_num_attributes_0 = a.asm.U).apply(null, arguments); + }, Eb = a._emscripten_bind_Mesh_num_points_0 = function() { + return (Eb = a._emscripten_bind_Mesh_num_points_0 = a.asm.V).apply(null, arguments); + }, Fb = a._emscripten_bind_Mesh___destroy___0 = function() { + return (Fb = a._emscripten_bind_Mesh___destroy___0 = a.asm.W).apply(null, arguments); + }, La = a._emscripten_bind_Metadata_Metadata_0 = function() { + return (La = a._emscripten_bind_Metadata_Metadata_0 = a.asm.X).apply(null, arguments); + }, Gb = a._emscripten_bind_Metadata___destroy___0 = function() { + return (Gb = a._emscripten_bind_Metadata___destroy___0 = a.asm.Y).apply(null, arguments); + }, Hb = a._emscripten_bind_Status_code_0 = function() { + return (Hb = a._emscripten_bind_Status_code_0 = a.asm.Z).apply(null, arguments); + }, Ib = a._emscripten_bind_Status_ok_0 = function() { + return (Ib = a._emscripten_bind_Status_ok_0 = a.asm._).apply(null, arguments); + }, Jb = a._emscripten_bind_Status_error_msg_0 = function() { + return (Jb = a._emscripten_bind_Status_error_msg_0 = a.asm.$).apply(null, arguments); + }, Kb = a._emscripten_bind_Status___destroy___0 = function() { + return (Kb = a._emscripten_bind_Status___destroy___0 = a.asm.aa).apply(null, arguments); + }, Ma = a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0 = function() { + return (Ma = a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0 = a.asm.ba).apply(null, arguments); + }, Lb = a._emscripten_bind_DracoFloat32Array_GetValue_1 = function() { + return (Lb = a._emscripten_bind_DracoFloat32Array_GetValue_1 = a.asm.ca).apply(null, arguments); + }, Mb = a._emscripten_bind_DracoFloat32Array_size_0 = function() { + return (Mb = a._emscripten_bind_DracoFloat32Array_size_0 = a.asm.da).apply(null, arguments); + }, Nb = a._emscripten_bind_DracoFloat32Array___destroy___0 = function() { + return (Nb = a._emscripten_bind_DracoFloat32Array___destroy___0 = a.asm.ea).apply(null, arguments); + }, Na = a._emscripten_bind_DracoInt8Array_DracoInt8Array_0 = function() { + return (Na = a._emscripten_bind_DracoInt8Array_DracoInt8Array_0 = a.asm.fa).apply(null, arguments); + }, Ob = a._emscripten_bind_DracoInt8Array_GetValue_1 = function() { + return (Ob = a._emscripten_bind_DracoInt8Array_GetValue_1 = a.asm.ga).apply(null, arguments); + }, Pb = a._emscripten_bind_DracoInt8Array_size_0 = function() { + return (Pb = a._emscripten_bind_DracoInt8Array_size_0 = a.asm.ha).apply(null, arguments); + }, Qb = a._emscripten_bind_DracoInt8Array___destroy___0 = function() { + return (Qb = a._emscripten_bind_DracoInt8Array___destroy___0 = a.asm.ia).apply(null, arguments); + }, Oa = a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0 = function() { + return (Oa = a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0 = a.asm.ja).apply(null, arguments); + }, Rb = a._emscripten_bind_DracoUInt8Array_GetValue_1 = function() { + return (Rb = a._emscripten_bind_DracoUInt8Array_GetValue_1 = a.asm.ka).apply(null, arguments); + }, Sb = a._emscripten_bind_DracoUInt8Array_size_0 = function() { + return (Sb = a._emscripten_bind_DracoUInt8Array_size_0 = a.asm.la).apply(null, arguments); + }, Tb = a._emscripten_bind_DracoUInt8Array___destroy___0 = function() { + return (Tb = a._emscripten_bind_DracoUInt8Array___destroy___0 = a.asm.ma).apply(null, arguments); + }, Pa = a._emscripten_bind_DracoInt16Array_DracoInt16Array_0 = function() { + return (Pa = a._emscripten_bind_DracoInt16Array_DracoInt16Array_0 = a.asm.na).apply(null, arguments); + }, Ub = a._emscripten_bind_DracoInt16Array_GetValue_1 = function() { + return (Ub = a._emscripten_bind_DracoInt16Array_GetValue_1 = a.asm.oa).apply(null, arguments); + }, Vb = a._emscripten_bind_DracoInt16Array_size_0 = function() { + return (Vb = a._emscripten_bind_DracoInt16Array_size_0 = a.asm.pa).apply(null, arguments); + }, Wb = a._emscripten_bind_DracoInt16Array___destroy___0 = function() { + return (Wb = a._emscripten_bind_DracoInt16Array___destroy___0 = a.asm.qa).apply(null, arguments); + }, Qa = a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0 = function() { + return (Qa = a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0 = a.asm.ra).apply(null, arguments); + }, Xb = a._emscripten_bind_DracoUInt16Array_GetValue_1 = function() { + return (Xb = a._emscripten_bind_DracoUInt16Array_GetValue_1 = a.asm.sa).apply(null, arguments); + }, Yb = a._emscripten_bind_DracoUInt16Array_size_0 = function() { + return (Yb = a._emscripten_bind_DracoUInt16Array_size_0 = a.asm.ta).apply(null, arguments); + }, Zb = a._emscripten_bind_DracoUInt16Array___destroy___0 = function() { + return (Zb = a._emscripten_bind_DracoUInt16Array___destroy___0 = a.asm.ua).apply(null, arguments); + }, Ra = a._emscripten_bind_DracoInt32Array_DracoInt32Array_0 = function() { + return (Ra = a._emscripten_bind_DracoInt32Array_DracoInt32Array_0 = a.asm.va).apply(null, arguments); + }, $b = a._emscripten_bind_DracoInt32Array_GetValue_1 = function() { + return ($b = a._emscripten_bind_DracoInt32Array_GetValue_1 = a.asm.wa).apply(null, arguments); + }, ac = a._emscripten_bind_DracoInt32Array_size_0 = function() { + return (ac = a._emscripten_bind_DracoInt32Array_size_0 = a.asm.xa).apply(null, arguments); + }, bc = a._emscripten_bind_DracoInt32Array___destroy___0 = function() { + return (bc = a._emscripten_bind_DracoInt32Array___destroy___0 = a.asm.ya).apply(null, arguments); + }, Sa = a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0 = function() { + return (Sa = a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0 = a.asm.za).apply(null, arguments); + }, cc = a._emscripten_bind_DracoUInt32Array_GetValue_1 = function() { + return (cc = a._emscripten_bind_DracoUInt32Array_GetValue_1 = a.asm.Aa).apply(null, arguments); + }, dc = a._emscripten_bind_DracoUInt32Array_size_0 = function() { + return (dc = a._emscripten_bind_DracoUInt32Array_size_0 = a.asm.Ba).apply(null, arguments); + }, ec = a._emscripten_bind_DracoUInt32Array___destroy___0 = function() { + return (ec = a._emscripten_bind_DracoUInt32Array___destroy___0 = a.asm.Ca).apply(null, arguments); + }, Ta = a._emscripten_bind_MetadataQuerier_MetadataQuerier_0 = function() { + return (Ta = a._emscripten_bind_MetadataQuerier_MetadataQuerier_0 = a.asm.Da).apply(null, arguments); + }, fc = a._emscripten_bind_MetadataQuerier_HasEntry_2 = function() { + return (fc = a._emscripten_bind_MetadataQuerier_HasEntry_2 = a.asm.Ea).apply(null, arguments); + }, gc = a._emscripten_bind_MetadataQuerier_GetIntEntry_2 = function() { + return (gc = a._emscripten_bind_MetadataQuerier_GetIntEntry_2 = a.asm.Fa).apply(null, arguments); + }, hc = a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3 = function() { + return (hc = a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3 = a.asm.Ga).apply(null, arguments); + }, ic = a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2 = function() { + return (ic = a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2 = a.asm.Ha).apply(null, arguments); + }, jc = a._emscripten_bind_MetadataQuerier_GetStringEntry_2 = function() { + return (jc = a._emscripten_bind_MetadataQuerier_GetStringEntry_2 = a.asm.Ia).apply(null, arguments); + }, kc = a._emscripten_bind_MetadataQuerier_NumEntries_1 = function() { + return (kc = a._emscripten_bind_MetadataQuerier_NumEntries_1 = a.asm.Ja).apply(null, arguments); + }, lc = a._emscripten_bind_MetadataQuerier_GetEntryName_2 = function() { + return (lc = a._emscripten_bind_MetadataQuerier_GetEntryName_2 = a.asm.Ka).apply(null, arguments); + }, mc = a._emscripten_bind_MetadataQuerier___destroy___0 = function() { + return (mc = a._emscripten_bind_MetadataQuerier___destroy___0 = a.asm.La).apply(null, arguments); + }, Ua = a._emscripten_bind_Decoder_Decoder_0 = function() { + return (Ua = a._emscripten_bind_Decoder_Decoder_0 = a.asm.Ma).apply(null, arguments); + }, nc = a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3 = function() { + return (nc = a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3 = a.asm.Na).apply(null, arguments); + }, oc = a._emscripten_bind_Decoder_DecodeArrayToMesh_3 = function() { + return (oc = a._emscripten_bind_Decoder_DecodeArrayToMesh_3 = a.asm.Oa).apply(null, arguments); + }, pc = a._emscripten_bind_Decoder_GetAttributeId_2 = function() { + return (pc = a._emscripten_bind_Decoder_GetAttributeId_2 = a.asm.Pa).apply(null, arguments); + }, qc = a._emscripten_bind_Decoder_GetAttributeIdByName_2 = function() { + return (qc = a._emscripten_bind_Decoder_GetAttributeIdByName_2 = a.asm.Qa).apply(null, arguments); + }, rc = a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3 = function() { + return (rc = a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3 = a.asm.Ra).apply(null, arguments); + }, sc = a._emscripten_bind_Decoder_GetAttribute_2 = function() { + return (sc = a._emscripten_bind_Decoder_GetAttribute_2 = a.asm.Sa).apply(null, arguments); + }, tc = a._emscripten_bind_Decoder_GetAttributeByUniqueId_2 = function() { + return (tc = a._emscripten_bind_Decoder_GetAttributeByUniqueId_2 = a.asm.Ta).apply(null, arguments); + }, uc = a._emscripten_bind_Decoder_GetMetadata_1 = function() { + return (uc = a._emscripten_bind_Decoder_GetMetadata_1 = a.asm.Ua).apply(null, arguments); + }, vc = a._emscripten_bind_Decoder_GetAttributeMetadata_2 = function() { + return (vc = a._emscripten_bind_Decoder_GetAttributeMetadata_2 = a.asm.Va).apply(null, arguments); + }, wc = a._emscripten_bind_Decoder_GetFaceFromMesh_3 = function() { + return (wc = a._emscripten_bind_Decoder_GetFaceFromMesh_3 = a.asm.Wa).apply(null, arguments); + }, xc = a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2 = function() { + return (xc = a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2 = a.asm.Xa).apply(null, arguments); + }, yc = a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3 = function() { + return (yc = a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3 = a.asm.Ya).apply(null, arguments); + }, zc = a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3 = function() { + return (zc = a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3 = a.asm.Za).apply(null, arguments); + }, Ac = a._emscripten_bind_Decoder_GetAttributeFloat_3 = function() { + return (Ac = a._emscripten_bind_Decoder_GetAttributeFloat_3 = a.asm._a).apply(null, arguments); + }, Bc = a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3 = function() { + return (Bc = a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3 = a.asm.$a).apply(null, arguments); + }, Cc = a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3 = function() { + return (Cc = a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3 = a.asm.ab).apply(null, arguments); + }, Dc = a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3 = function() { + return (Dc = a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3 = a.asm.bb).apply(null, arguments); + }, Ec = a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3 = function() { + return (Ec = a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3 = a.asm.cb).apply(null, arguments); + }, Fc = a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3 = function() { + return (Fc = a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3 = a.asm.db).apply(null, arguments); + }, Gc = a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3 = function() { + return (Gc = a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3 = a.asm.eb).apply(null, arguments); + }, Hc = a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3 = function() { + return (Hc = a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3 = a.asm.fb).apply(null, arguments); + }, Ic = a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3 = function() { + return (Ic = a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3 = a.asm.gb).apply(null, arguments); + }, Jc = a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5 = function() { + return (Jc = a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5 = a.asm.hb).apply(null, arguments); + }, Kc = a._emscripten_bind_Decoder_SkipAttributeTransform_1 = function() { + return (Kc = a._emscripten_bind_Decoder_SkipAttributeTransform_1 = a.asm.ib).apply(null, arguments); + }, Lc = a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1 = function() { + return (Lc = a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1 = a.asm.jb).apply(null, arguments); + }, Mc = a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2 = function() { + return (Mc = a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2 = a.asm.kb).apply(null, arguments); + }, Nc = a._emscripten_bind_Decoder_DecodeBufferToMesh_2 = function() { + return (Nc = a._emscripten_bind_Decoder_DecodeBufferToMesh_2 = a.asm.lb).apply(null, arguments); + }, Oc = a._emscripten_bind_Decoder___destroy___0 = function() { + return (Oc = a._emscripten_bind_Decoder___destroy___0 = a.asm.mb).apply(null, arguments); + }, Pc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM = function() { + return (Pc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM = a.asm.nb).apply(null, arguments); + }, Qc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM = function() { + return (Qc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM = a.asm.ob).apply(null, arguments); + }, Rc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM = function() { + return (Rc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM = a.asm.pb).apply(null, arguments); + }, Sc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM = function() { + return (Sc = a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM = a.asm.qb).apply(null, arguments); + }, Tc = a._emscripten_enum_draco_GeometryAttribute_Type_INVALID = function() { + return (Tc = a._emscripten_enum_draco_GeometryAttribute_Type_INVALID = a.asm.rb).apply(null, arguments); + }, Uc = a._emscripten_enum_draco_GeometryAttribute_Type_POSITION = function() { + return (Uc = a._emscripten_enum_draco_GeometryAttribute_Type_POSITION = a.asm.sb).apply(null, arguments); + }, Vc = a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL = function() { + return (Vc = a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL = a.asm.tb).apply(null, arguments); + }, Wc = a._emscripten_enum_draco_GeometryAttribute_Type_COLOR = function() { + return (Wc = a._emscripten_enum_draco_GeometryAttribute_Type_COLOR = a.asm.ub).apply(null, arguments); + }, Xc = a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD = function() { + return (Xc = a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD = a.asm.vb).apply(null, arguments); + }, Yc = a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC = function() { + return (Yc = a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC = a.asm.wb).apply(null, arguments); + }, Zc = a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE = function() { + return (Zc = a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE = a.asm.xb).apply(null, arguments); + }, $c = a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD = function() { + return ($c = a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD = a.asm.yb).apply(null, arguments); + }, ad = a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH = function() { + return (ad = a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH = a.asm.zb).apply(null, arguments); + }, bd = a._emscripten_enum_draco_DataType_DT_INVALID = function() { + return (bd = a._emscripten_enum_draco_DataType_DT_INVALID = a.asm.Ab).apply(null, arguments); + }, cd = a._emscripten_enum_draco_DataType_DT_INT8 = function() { + return (cd = a._emscripten_enum_draco_DataType_DT_INT8 = a.asm.Bb).apply(null, arguments); + }, dd = a._emscripten_enum_draco_DataType_DT_UINT8 = function() { + return (dd = a._emscripten_enum_draco_DataType_DT_UINT8 = a.asm.Cb).apply(null, arguments); + }, ed = a._emscripten_enum_draco_DataType_DT_INT16 = function() { + return (ed = a._emscripten_enum_draco_DataType_DT_INT16 = a.asm.Db).apply(null, arguments); + }, fd = a._emscripten_enum_draco_DataType_DT_UINT16 = function() { + return (fd = a._emscripten_enum_draco_DataType_DT_UINT16 = a.asm.Eb).apply(null, arguments); + }, gd = a._emscripten_enum_draco_DataType_DT_INT32 = function() { + return (gd = a._emscripten_enum_draco_DataType_DT_INT32 = a.asm.Fb).apply(null, arguments); + }, hd = a._emscripten_enum_draco_DataType_DT_UINT32 = function() { + return (hd = a._emscripten_enum_draco_DataType_DT_UINT32 = a.asm.Gb).apply(null, arguments); + }, id = a._emscripten_enum_draco_DataType_DT_INT64 = function() { + return (id = a._emscripten_enum_draco_DataType_DT_INT64 = a.asm.Hb).apply(null, arguments); + }, jd = a._emscripten_enum_draco_DataType_DT_UINT64 = function() { + return (jd = a._emscripten_enum_draco_DataType_DT_UINT64 = a.asm.Ib).apply(null, arguments); + }, kd = a._emscripten_enum_draco_DataType_DT_FLOAT32 = function() { + return (kd = a._emscripten_enum_draco_DataType_DT_FLOAT32 = a.asm.Jb).apply( + null, + arguments + ); + }, ld = a._emscripten_enum_draco_DataType_DT_FLOAT64 = function() { + return (ld = a._emscripten_enum_draco_DataType_DT_FLOAT64 = a.asm.Kb).apply(null, arguments); + }, md = a._emscripten_enum_draco_DataType_DT_BOOL = function() { + return (md = a._emscripten_enum_draco_DataType_DT_BOOL = a.asm.Lb).apply(null, arguments); + }, nd = a._emscripten_enum_draco_DataType_DT_TYPES_COUNT = function() { + return (nd = a._emscripten_enum_draco_DataType_DT_TYPES_COUNT = a.asm.Mb).apply(null, arguments); + }, od = a._emscripten_enum_draco_StatusCode_OK = function() { + return (od = a._emscripten_enum_draco_StatusCode_OK = a.asm.Nb).apply(null, arguments); + }, pd = a._emscripten_enum_draco_StatusCode_DRACO_ERROR = function() { + return (pd = a._emscripten_enum_draco_StatusCode_DRACO_ERROR = a.asm.Ob).apply(null, arguments); + }, qd = a._emscripten_enum_draco_StatusCode_IO_ERROR = function() { + return (qd = a._emscripten_enum_draco_StatusCode_IO_ERROR = a.asm.Pb).apply(null, arguments); + }, rd = a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER = function() { + return (rd = a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER = a.asm.Qb).apply(null, arguments); + }, sd = a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION = function() { + return (sd = a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION = a.asm.Rb).apply(null, arguments); + }, td = a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION = function() { + return (td = a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION = a.asm.Sb).apply(null, arguments); + }; + a._malloc = function() { + return (a._malloc = a.asm.Tb).apply(null, arguments); + }; + a._free = function() { + return (a._free = a.asm.Ub).apply(null, arguments); + }; + var ya = function() { + return (ya = a.asm.Vb).apply(null, arguments); + }; + a.___start_em_js = 15856; + a.___stop_em_js = 15954; + var la; + ia = function b() { + la || ba(); + la || (ia = b); + }; + if (a.preInit) for ("function" == typeof a.preInit && (a.preInit = [a.preInit]); 0 < a.preInit.length; ) a.preInit.pop()(); + ba(); + t.prototype = Object.create(t.prototype); + t.prototype.constructor = t; + t.prototype.__class__ = t; + t.__cache__ = {}; + a.WrapperObject = t; + a.getCache = x; + a.wrapPointer = D; + a.castObject = function(b, c) { + return D(b.ptr, c); + }; + a.NULL = D(0); + a.destroy = function(b) { + if (!b.__destroy__) throw "Error: Cannot destroy object. (Did you create it yourself?)"; + b.__destroy__(); + delete x(b.__class__)[b.ptr]; + }; + a.compare = function(b, c) { + return b.ptr === c.ptr; + }; + a.getPointer = function(b) { + return b.ptr; + }; + a.getClass = function(b) { + return b.__class__; + }; + var r = { buffer: 0, size: 0, pos: 0, temps: [], needed: 0, prepare: function() { + if (r.needed) { + for (var b = 0; b < r.temps.length; b++) a._free(r.temps[b]); + r.temps.length = 0; + a._free(r.buffer); + r.buffer = 0; + r.size += r.needed; + r.needed = 0; + } + r.buffer || (r.size += 128, r.buffer = a._malloc(r.size), r.buffer || f(void 0)); + r.pos = 0; + }, alloc: function(b, c) { + r.buffer || f(void 0); + b = b.length * c.BYTES_PER_ELEMENT; + b = b + 7 & -8; + r.pos + b >= r.size ? (0 < b || f(void 0), r.needed += b, c = a._malloc(b), r.temps.push(c)) : (c = r.buffer + r.pos, r.pos += b); + return c; + }, copy: function(b, c, d) { + d >>>= 0; + switch (c.BYTES_PER_ELEMENT) { + case 2: + d >>>= 1; + break; + case 4: + d >>>= 2; + break; + case 8: + d >>>= 3; + } + for (var g = 0; g < b.length; g++) c[d + g] = b[g]; + } }; + Z.prototype = Object.create(t.prototype); + Z.prototype.constructor = Z; + Z.prototype.__class__ = Z; + Z.__cache__ = {}; + a.VoidPtr = Z; + Z.prototype.__destroy__ = Z.prototype.__destroy__ = function() { + bb(this.ptr); + }; + S.prototype = Object.create(t.prototype); + S.prototype.constructor = S; + S.prototype.__class__ = S; + S.__cache__ = {}; + a.DecoderBuffer = S; + S.prototype.Init = S.prototype.Init = function(b, c) { + var d = this.ptr; + r.prepare(); + "object" == typeof b && (b = pa(b)); + c && "object" === typeof c && (c = c.ptr); + cb(d, b, c); + }; + S.prototype.__destroy__ = S.prototype.__destroy__ = function() { + db(this.ptr); + }; + Q.prototype = Object.create(t.prototype); + Q.prototype.constructor = Q; + Q.prototype.__class__ = Q; + Q.__cache__ = {}; + a.AttributeTransformData = Q; + Q.prototype.transform_type = Q.prototype.transform_type = function() { + return eb(this.ptr); + }; + Q.prototype.__destroy__ = Q.prototype.__destroy__ = function() { + fb(this.ptr); + }; + W.prototype = Object.create(t.prototype); + W.prototype.constructor = W; + W.prototype.__class__ = W; + W.__cache__ = {}; + a.GeometryAttribute = W; + W.prototype.__destroy__ = W.prototype.__destroy__ = function() { + gb(this.ptr); + }; + w.prototype = Object.create(t.prototype); + w.prototype.constructor = w; + w.prototype.__class__ = w; + w.__cache__ = {}; + a.PointAttribute = w; + w.prototype.size = w.prototype.size = function() { + return hb(this.ptr); + }; + w.prototype.GetAttributeTransformData = w.prototype.GetAttributeTransformData = function() { + return D(ib(this.ptr), Q); + }; + w.prototype.attribute_type = w.prototype.attribute_type = function() { + return jb(this.ptr); + }; + w.prototype.data_type = w.prototype.data_type = function() { + return kb(this.ptr); + }; + w.prototype.num_components = w.prototype.num_components = function() { + return lb(this.ptr); + }; + w.prototype.normalized = w.prototype.normalized = function() { + return !!mb(this.ptr); + }; + w.prototype.byte_stride = w.prototype.byte_stride = function() { + return nb(this.ptr); + }; + w.prototype.byte_offset = w.prototype.byte_offset = function() { + return ob(this.ptr); + }; + w.prototype.unique_id = w.prototype.unique_id = function() { + return pb(this.ptr); + }; + w.prototype.__destroy__ = w.prototype.__destroy__ = function() { + qb(this.ptr); + }; + C.prototype = Object.create(t.prototype); + C.prototype.constructor = C; + C.prototype.__class__ = C; + C.__cache__ = {}; + a.AttributeQuantizationTransform = C; + C.prototype.InitFromAttribute = C.prototype.InitFromAttribute = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return !!rb(c, b); + }; + C.prototype.quantization_bits = C.prototype.quantization_bits = function() { + return sb(this.ptr); + }; + C.prototype.min_value = C.prototype.min_value = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return tb(c, b); + }; + C.prototype.range = C.prototype.range = function() { + return ub(this.ptr); + }; + C.prototype.__destroy__ = C.prototype.__destroy__ = function() { + vb(this.ptr); + }; + F.prototype = Object.create(t.prototype); + F.prototype.constructor = F; + F.prototype.__class__ = F; + F.__cache__ = {}; + a.AttributeOctahedronTransform = F; + F.prototype.InitFromAttribute = F.prototype.InitFromAttribute = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return !!wb(c, b); + }; + F.prototype.quantization_bits = F.prototype.quantization_bits = function() { + return xb(this.ptr); + }; + F.prototype.__destroy__ = F.prototype.__destroy__ = function() { + yb(this.ptr); + }; + G.prototype = Object.create(t.prototype); + G.prototype.constructor = G; + G.prototype.__class__ = G; + G.__cache__ = {}; + a.PointCloud = G; + G.prototype.num_attributes = G.prototype.num_attributes = function() { + return zb(this.ptr); + }; + G.prototype.num_points = G.prototype.num_points = function() { + return Ab(this.ptr); + }; + G.prototype.__destroy__ = G.prototype.__destroy__ = function() { + Bb(this.ptr); + }; + E.prototype = Object.create(t.prototype); + E.prototype.constructor = E; + E.prototype.__class__ = E; + E.__cache__ = {}; + a.Mesh = E; + E.prototype.num_faces = E.prototype.num_faces = function() { + return Cb(this.ptr); + }; + E.prototype.num_attributes = E.prototype.num_attributes = function() { + return Db(this.ptr); + }; + E.prototype.num_points = E.prototype.num_points = function() { + return Eb(this.ptr); + }; + E.prototype.__destroy__ = E.prototype.__destroy__ = function() { + Fb(this.ptr); + }; + T.prototype = Object.create(t.prototype); + T.prototype.constructor = T; + T.prototype.__class__ = T; + T.__cache__ = {}; + a.Metadata = T; + T.prototype.__destroy__ = T.prototype.__destroy__ = function() { + Gb(this.ptr); + }; + B.prototype = Object.create(t.prototype); + B.prototype.constructor = B; + B.prototype.__class__ = B; + B.__cache__ = {}; + a.Status = B; + B.prototype.code = B.prototype.code = function() { + return Hb(this.ptr); + }; + B.prototype.ok = B.prototype.ok = function() { + return !!Ib(this.ptr); + }; + B.prototype.error_msg = B.prototype.error_msg = function() { + return h(Jb(this.ptr)); + }; + B.prototype.__destroy__ = B.prototype.__destroy__ = function() { + Kb(this.ptr); + }; + H.prototype = Object.create(t.prototype); + H.prototype.constructor = H; + H.prototype.__class__ = H; + H.__cache__ = {}; + a.DracoFloat32Array = H; + H.prototype.GetValue = H.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Lb(c, b); + }; + H.prototype.size = H.prototype.size = function() { + return Mb(this.ptr); + }; + H.prototype.__destroy__ = H.prototype.__destroy__ = function() { + Nb(this.ptr); + }; + I.prototype = Object.create(t.prototype); + I.prototype.constructor = I; + I.prototype.__class__ = I; + I.__cache__ = {}; + a.DracoInt8Array = I; + I.prototype.GetValue = I.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Ob(c, b); + }; + I.prototype.size = I.prototype.size = function() { + return Pb(this.ptr); + }; + I.prototype.__destroy__ = I.prototype.__destroy__ = function() { + Qb(this.ptr); + }; + J.prototype = Object.create(t.prototype); + J.prototype.constructor = J; + J.prototype.__class__ = J; + J.__cache__ = {}; + a.DracoUInt8Array = J; + J.prototype.GetValue = J.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Rb(c, b); + }; + J.prototype.size = J.prototype.size = function() { + return Sb(this.ptr); + }; + J.prototype.__destroy__ = J.prototype.__destroy__ = function() { + Tb(this.ptr); + }; + K.prototype = Object.create(t.prototype); + K.prototype.constructor = K; + K.prototype.__class__ = K; + K.__cache__ = {}; + a.DracoInt16Array = K; + K.prototype.GetValue = K.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Ub(c, b); + }; + K.prototype.size = K.prototype.size = function() { + return Vb(this.ptr); + }; + K.prototype.__destroy__ = K.prototype.__destroy__ = function() { + Wb(this.ptr); + }; + L.prototype = Object.create(t.prototype); + L.prototype.constructor = L; + L.prototype.__class__ = L; + L.__cache__ = {}; + a.DracoUInt16Array = L; + L.prototype.GetValue = L.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Xb(c, b); + }; + L.prototype.size = L.prototype.size = function() { + return Yb(this.ptr); + }; + L.prototype.__destroy__ = L.prototype.__destroy__ = function() { + Zb(this.ptr); + }; + M.prototype = Object.create(t.prototype); + M.prototype.constructor = M; + M.prototype.__class__ = M; + M.__cache__ = {}; + a.DracoInt32Array = M; + M.prototype.GetValue = M.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return $b(c, b); + }; + M.prototype.size = M.prototype.size = function() { + return ac(this.ptr); + }; + M.prototype.__destroy__ = M.prototype.__destroy__ = function() { + bc(this.ptr); + }; + N.prototype = Object.create(t.prototype); + N.prototype.constructor = N; + N.prototype.__class__ = N; + N.__cache__ = {}; + a.DracoUInt32Array = N; + N.prototype.GetValue = N.prototype.GetValue = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return cc(c, b); + }; + N.prototype.size = N.prototype.size = function() { + return dc(this.ptr); + }; + N.prototype.__destroy__ = N.prototype.__destroy__ = function() { + ec(this.ptr); + }; + y.prototype = Object.create(t.prototype); + y.prototype.constructor = y; + y.prototype.__class__ = y; + y.__cache__ = {}; + a.MetadataQuerier = y; + y.prototype.HasEntry = y.prototype.HasEntry = function(b, c) { + var d = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + return !!fc(d, b, c); + }; + y.prototype.GetIntEntry = y.prototype.GetIntEntry = function(b, c) { + var d = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + return gc(d, b, c); + }; + y.prototype.GetIntEntryArray = y.prototype.GetIntEntryArray = function(b, c, d) { + var g = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + d && "object" === typeof d && (d = d.ptr); + hc(g, b, c, d); + }; + y.prototype.GetDoubleEntry = y.prototype.GetDoubleEntry = function(b, c) { + var d = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + return ic(d, b, c); + }; + y.prototype.GetStringEntry = y.prototype.GetStringEntry = function(b, c) { + var d = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + return h(jc(d, b, c)); + }; + y.prototype.NumEntries = y.prototype.NumEntries = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return kc(c, b); + }; + y.prototype.GetEntryName = y.prototype.GetEntryName = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return h(lc(d, b, c)); + }; + y.prototype.__destroy__ = y.prototype.__destroy__ = function() { + mc(this.ptr); + }; + m.prototype = Object.create(t.prototype); + m.prototype.constructor = m; + m.prototype.__class__ = m; + m.__cache__ = {}; + a.Decoder = m; + m.prototype.DecodeArrayToPointCloud = m.prototype.DecodeArrayToPointCloud = function(b, c, d) { + var g = this.ptr; + r.prepare(); + "object" == typeof b && (b = pa(b)); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return D(nc(g, b, c, d), B); + }; + m.prototype.DecodeArrayToMesh = m.prototype.DecodeArrayToMesh = function(b, c, d) { + var g = this.ptr; + r.prepare(); + "object" == typeof b && (b = pa(b)); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return D(oc(g, b, c, d), B); + }; + m.prototype.GetAttributeId = m.prototype.GetAttributeId = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return pc(d, b, c); + }; + m.prototype.GetAttributeIdByName = m.prototype.GetAttributeIdByName = function(b, c) { + var d = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + return qc(d, b, c); + }; + m.prototype.GetAttributeIdByMetadataEntry = m.prototype.GetAttributeIdByMetadataEntry = function(b, c, d) { + var g = this.ptr; + r.prepare(); + b && "object" === typeof b && (b = b.ptr); + c = c && "object" === typeof c ? c.ptr : R(c); + d = d && "object" === typeof d ? d.ptr : R(d); + return rc(g, b, c, d); + }; + m.prototype.GetAttribute = m.prototype.GetAttribute = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return D(sc(d, b, c), w); + }; + m.prototype.GetAttributeByUniqueId = m.prototype.GetAttributeByUniqueId = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return D(tc(d, b, c), w); + }; + m.prototype.GetMetadata = m.prototype.GetMetadata = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return D(uc(c, b), T); + }; + m.prototype.GetAttributeMetadata = m.prototype.GetAttributeMetadata = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return D(vc(d, b, c), T); + }; + m.prototype.GetFaceFromMesh = m.prototype.GetFaceFromMesh = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!wc(g, b, c, d); + }; + m.prototype.GetTriangleStripsFromMesh = m.prototype.GetTriangleStripsFromMesh = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return xc(d, b, c); + }; + m.prototype.GetTrianglesUInt16Array = m.prototype.GetTrianglesUInt16Array = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!yc(g, b, c, d); + }; + m.prototype.GetTrianglesUInt32Array = m.prototype.GetTrianglesUInt32Array = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!zc(g, b, c, d); + }; + m.prototype.GetAttributeFloat = m.prototype.GetAttributeFloat = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Ac(g, b, c, d); + }; + m.prototype.GetAttributeFloatForAllPoints = m.prototype.GetAttributeFloatForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Bc(g, b, c, d); + }; + m.prototype.GetAttributeIntForAllPoints = m.prototype.GetAttributeIntForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Cc(g, b, c, d); + }; + m.prototype.GetAttributeInt8ForAllPoints = m.prototype.GetAttributeInt8ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Dc(g, b, c, d); + }; + m.prototype.GetAttributeUInt8ForAllPoints = m.prototype.GetAttributeUInt8ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Ec(g, b, c, d); + }; + m.prototype.GetAttributeInt16ForAllPoints = m.prototype.GetAttributeInt16ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Fc(g, b, c, d); + }; + m.prototype.GetAttributeUInt16ForAllPoints = m.prototype.GetAttributeUInt16ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Gc(g, b, c, d); + }; + m.prototype.GetAttributeInt32ForAllPoints = m.prototype.GetAttributeInt32ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Hc(g, b, c, d); + }; + m.prototype.GetAttributeUInt32ForAllPoints = m.prototype.GetAttributeUInt32ForAllPoints = function(b, c, d) { + var g = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + return !!Ic(g, b, c, d); + }; + m.prototype.GetAttributeDataArrayForAllPoints = m.prototype.GetAttributeDataArrayForAllPoints = function(b, c, d, g, u) { + var X = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + d && "object" === typeof d && (d = d.ptr); + g && "object" === typeof g && (g = g.ptr); + u && "object" === typeof u && (u = u.ptr); + return !!Jc(X, b, c, d, g, u); + }; + m.prototype.SkipAttributeTransform = m.prototype.SkipAttributeTransform = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + Kc(c, b); + }; + m.prototype.GetEncodedGeometryType_Deprecated = m.prototype.GetEncodedGeometryType_Deprecated = function(b) { + var c = this.ptr; + b && "object" === typeof b && (b = b.ptr); + return Lc(c, b); + }; + m.prototype.DecodeBufferToPointCloud = m.prototype.DecodeBufferToPointCloud = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return D(Mc(d, b, c), B); + }; + m.prototype.DecodeBufferToMesh = m.prototype.DecodeBufferToMesh = function(b, c) { + var d = this.ptr; + b && "object" === typeof b && (b = b.ptr); + c && "object" === typeof c && (c = c.ptr); + return D(Nc(d, b, c), B); + }; + m.prototype.__destroy__ = m.prototype.__destroy__ = function() { + Oc(this.ptr); + }; + (function() { + function b() { + a.ATTRIBUTE_INVALID_TRANSFORM = Pc(); + a.ATTRIBUTE_NO_TRANSFORM = Qc(); + a.ATTRIBUTE_QUANTIZATION_TRANSFORM = Rc(); + a.ATTRIBUTE_OCTAHEDRON_TRANSFORM = Sc(); + a.INVALID = Tc(); + a.POSITION = Uc(); + a.NORMAL = Vc(); + a.COLOR = Wc(); + a.TEX_COORD = Xc(); + a.GENERIC = Yc(); + a.INVALID_GEOMETRY_TYPE = Zc(); + a.POINT_CLOUD = $c(); + a.TRIANGULAR_MESH = ad(); + a.DT_INVALID = bd(); + a.DT_INT8 = cd(); + a.DT_UINT8 = dd(); + a.DT_INT16 = ed(); + a.DT_UINT16 = fd(); + a.DT_INT32 = gd(); + a.DT_UINT32 = hd(); + a.DT_INT64 = id(); + a.DT_UINT64 = jd(); + a.DT_FLOAT32 = kd(); + a.DT_FLOAT64 = ld(); + a.DT_BOOL = md(); + a.DT_TYPES_COUNT = nd(); + a.OK = od(); + a.DRACO_ERROR = pd(); + a.IO_ERROR = qd(); + a.INVALID_PARAMETER = rd(); + a.UNSUPPORTED_VERSION = sd(); + a.UNKNOWN_VERSION = td(); + } + za ? b() : oa.unshift(b); + })(); + if ("function" === typeof a.onModuleParsed) a.onModuleParsed(); + a.Decoder.prototype.GetEncodedGeometryType = function(b) { + if (b.__class__ && b.__class__ === a.DecoderBuffer) return a.Decoder.prototype.GetEncodedGeometryType_Deprecated(b); + if (8 > b.byteLength) return a.INVALID_GEOMETRY_TYPE; + switch (b[7]) { + case 0: + return a.POINT_CLOUD; + case 1: + return a.TRIANGULAR_MESH; + default: + return a.INVALID_GEOMETRY_TYPE; + } + }; + return n.ready; + }; + }(); + "object" === typeof exports && "object" === typeof module ? module.exports = DracoDecoderModule : "function" === typeof define && define.amd ? define([], function() { + return DracoDecoderModule; + }) : "object" === typeof exports && (exports.DracoDecoderModule = DracoDecoderModule); + } +}); + +export { + require_draco_decoder_nodejs +}; diff --git a/public/assets/cesium/Workers/chunk-NDDI2LWR.js b/public/assets/cesium/Workers/chunk-NDDI2LWR.js new file mode 100644 index 0000000..6fdbe3a --- /dev/null +++ b/public/assets/cesium/Workers/chunk-NDDI2LWR.js @@ -0,0 +1,157 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Intersect_default +} from "./chunk-KHZNBFOH.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/AxisAlignedBoundingBox.js +function AxisAlignedBoundingBox(minimum, maximum, center) { + this.minimum = Cartesian3_default.clone(defaultValue_default(minimum, Cartesian3_default.ZERO)); + this.maximum = Cartesian3_default.clone(defaultValue_default(maximum, Cartesian3_default.ZERO)); + if (!defined_default(center)) { + center = Cartesian3_default.midpoint(this.minimum, this.maximum, new Cartesian3_default()); + } else { + center = Cartesian3_default.clone(center); + } + this.center = center; +} +AxisAlignedBoundingBox.fromCorners = function(minimum, maximum, result) { + Check_default.defined("minimum", minimum); + Check_default.defined("maximum", maximum); + if (!defined_default(result)) { + result = new AxisAlignedBoundingBox(); + } + result.minimum = Cartesian3_default.clone(minimum, result.minimum); + result.maximum = Cartesian3_default.clone(maximum, result.maximum); + result.center = Cartesian3_default.midpoint(minimum, maximum, result.center); + return result; +}; +AxisAlignedBoundingBox.fromPoints = function(positions, result) { + if (!defined_default(result)) { + result = new AxisAlignedBoundingBox(); + } + if (!defined_default(positions) || positions.length === 0) { + result.minimum = Cartesian3_default.clone(Cartesian3_default.ZERO, result.minimum); + result.maximum = Cartesian3_default.clone(Cartesian3_default.ZERO, result.maximum); + result.center = Cartesian3_default.clone(Cartesian3_default.ZERO, result.center); + return result; + } + let minimumX = positions[0].x; + let minimumY = positions[0].y; + let minimumZ = positions[0].z; + let maximumX = positions[0].x; + let maximumY = positions[0].y; + let maximumZ = positions[0].z; + const length = positions.length; + for (let i = 1; i < length; i++) { + const p = positions[i]; + const x = p.x; + const y = p.y; + const z = p.z; + minimumX = Math.min(x, minimumX); + maximumX = Math.max(x, maximumX); + minimumY = Math.min(y, minimumY); + maximumY = Math.max(y, maximumY); + minimumZ = Math.min(z, minimumZ); + maximumZ = Math.max(z, maximumZ); + } + const minimum = result.minimum; + minimum.x = minimumX; + minimum.y = minimumY; + minimum.z = minimumZ; + const maximum = result.maximum; + maximum.x = maximumX; + maximum.y = maximumY; + maximum.z = maximumZ; + result.center = Cartesian3_default.midpoint(minimum, maximum, result.center); + return result; +}; +AxisAlignedBoundingBox.clone = function(box, result) { + if (!defined_default(box)) { + return void 0; + } + if (!defined_default(result)) { + return new AxisAlignedBoundingBox(box.minimum, box.maximum, box.center); + } + result.minimum = Cartesian3_default.clone(box.minimum, result.minimum); + result.maximum = Cartesian3_default.clone(box.maximum, result.maximum); + result.center = Cartesian3_default.clone(box.center, result.center); + return result; +}; +AxisAlignedBoundingBox.equals = function(left, right) { + return left === right || defined_default(left) && defined_default(right) && Cartesian3_default.equals(left.center, right.center) && Cartesian3_default.equals(left.minimum, right.minimum) && Cartesian3_default.equals(left.maximum, right.maximum); +}; +var intersectScratch = new Cartesian3_default(); +AxisAlignedBoundingBox.intersectPlane = function(box, plane) { + Check_default.defined("box", box); + Check_default.defined("plane", plane); + intersectScratch = Cartesian3_default.subtract( + box.maximum, + box.minimum, + intersectScratch + ); + const h = Cartesian3_default.multiplyByScalar( + intersectScratch, + 0.5, + intersectScratch + ); + const normal = plane.normal; + const e = h.x * Math.abs(normal.x) + h.y * Math.abs(normal.y) + h.z * Math.abs(normal.z); + const s = Cartesian3_default.dot(box.center, normal) + plane.distance; + if (s - e > 0) { + return Intersect_default.INSIDE; + } + if (s + e < 0) { + return Intersect_default.OUTSIDE; + } + return Intersect_default.INTERSECTING; +}; +AxisAlignedBoundingBox.prototype.clone = function(result) { + return AxisAlignedBoundingBox.clone(this, result); +}; +AxisAlignedBoundingBox.prototype.intersectPlane = function(plane) { + return AxisAlignedBoundingBox.intersectPlane(this, plane); +}; +AxisAlignedBoundingBox.prototype.equals = function(right) { + return AxisAlignedBoundingBox.equals(this, right); +}; +var AxisAlignedBoundingBox_default = AxisAlignedBoundingBox; + +export { + AxisAlignedBoundingBox_default +}; diff --git a/public/assets/cesium/Workers/chunk-NGZJIN5Z.js b/public/assets/cesium/Workers/chunk-NGZJIN5Z.js new file mode 100644 index 0000000..34241b3 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-NGZJIN5Z.js @@ -0,0 +1,102 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EncodedCartesian3.js +function EncodedCartesian3() { + this.high = Cartesian3_default.clone(Cartesian3_default.ZERO); + this.low = Cartesian3_default.clone(Cartesian3_default.ZERO); +} +EncodedCartesian3.encode = function(value, result) { + Check_default.typeOf.number("value", value); + if (!defined_default(result)) { + result = { + high: 0, + low: 0 + }; + } + let doubleHigh; + if (value >= 0) { + doubleHigh = Math.floor(value / 65536) * 65536; + result.high = doubleHigh; + result.low = value - doubleHigh; + } else { + doubleHigh = Math.floor(-value / 65536) * 65536; + result.high = -doubleHigh; + result.low = value + doubleHigh; + } + return result; +}; +var scratchEncode = { + high: 0, + low: 0 +}; +EncodedCartesian3.fromCartesian = function(cartesian, result) { + Check_default.typeOf.object("cartesian", cartesian); + if (!defined_default(result)) { + result = new EncodedCartesian3(); + } + const high = result.high; + const low = result.low; + EncodedCartesian3.encode(cartesian.x, scratchEncode); + high.x = scratchEncode.high; + low.x = scratchEncode.low; + EncodedCartesian3.encode(cartesian.y, scratchEncode); + high.y = scratchEncode.high; + low.y = scratchEncode.low; + EncodedCartesian3.encode(cartesian.z, scratchEncode); + high.z = scratchEncode.high; + low.z = scratchEncode.low; + return result; +}; +var encodedP = new EncodedCartesian3(); +EncodedCartesian3.writeElements = function(cartesian, cartesianArray, index) { + Check_default.defined("cartesianArray", cartesianArray); + Check_default.typeOf.number("index", index); + Check_default.typeOf.number.greaterThanOrEquals("index", index, 0); + EncodedCartesian3.fromCartesian(cartesian, encodedP); + const high = encodedP.high; + const low = encodedP.low; + cartesianArray[index] = high.x; + cartesianArray[index + 1] = high.y; + cartesianArray[index + 2] = high.z; + cartesianArray[index + 3] = low.x; + cartesianArray[index + 4] = low.y; + cartesianArray[index + 5] = low.z; +}; +var EncodedCartesian3_default = EncodedCartesian3; + +export { + EncodedCartesian3_default +}; diff --git a/public/assets/cesium/Workers/chunk-O72GZTSE.js b/public/assets/cesium/Workers/chunk-O72GZTSE.js new file mode 100644 index 0000000..cc00b9c --- /dev/null +++ b/public/assets/cesium/Workers/chunk-O72GZTSE.js @@ -0,0 +1,73 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Math_default +} from "./chunk-WGDFYAGC.js"; + +// packages/engine/Source/Core/CylinderGeometryLibrary.js +var CylinderGeometryLibrary = {}; +CylinderGeometryLibrary.computePositions = function(length, topRadius, bottomRadius, slices, fill) { + const topZ = length * 0.5; + const bottomZ = -topZ; + const twoSlice = slices + slices; + const size = fill ? 2 * twoSlice : twoSlice; + const positions = new Float64Array(size * 3); + let i; + let index = 0; + let tbIndex = 0; + const bottomOffset = fill ? twoSlice * 3 : 0; + const topOffset = fill ? (twoSlice + slices) * 3 : slices * 3; + for (i = 0; i < slices; i++) { + const angle = i / slices * Math_default.TWO_PI; + const x = Math.cos(angle); + const y = Math.sin(angle); + const bottomX = x * bottomRadius; + const bottomY = y * bottomRadius; + const topX = x * topRadius; + const topY = y * topRadius; + positions[tbIndex + bottomOffset] = bottomX; + positions[tbIndex + bottomOffset + 1] = bottomY; + positions[tbIndex + bottomOffset + 2] = bottomZ; + positions[tbIndex + topOffset] = topX; + positions[tbIndex + topOffset + 1] = topY; + positions[tbIndex + topOffset + 2] = topZ; + tbIndex += 3; + if (fill) { + positions[index++] = bottomX; + positions[index++] = bottomY; + positions[index++] = bottomZ; + positions[index++] = topX; + positions[index++] = topY; + positions[index++] = topZ; + } + } + return positions; +}; +var CylinderGeometryLibrary_default = CylinderGeometryLibrary; + +export { + CylinderGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-OPP2SKMA.js b/public/assets/cesium/Workers/chunk-OPP2SKMA.js new file mode 100644 index 0000000..b295059 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-OPP2SKMA.js @@ -0,0 +1,368 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidOutlineGeometry.js +var defaultRadii = new Cartesian3_default(1, 1, 1); +var cos = Math.cos; +var sin = Math.sin; +function EllipsoidOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const radii = defaultValue_default(options.radii, defaultRadii); + const innerRadii = defaultValue_default(options.innerRadii, radii); + const minimumClock = defaultValue_default(options.minimumClock, 0); + const maximumClock = defaultValue_default(options.maximumClock, Math_default.TWO_PI); + const minimumCone = defaultValue_default(options.minimumCone, 0); + const maximumCone = defaultValue_default(options.maximumCone, Math_default.PI); + const stackPartitions = Math.round(defaultValue_default(options.stackPartitions, 10)); + const slicePartitions = Math.round(defaultValue_default(options.slicePartitions, 8)); + const subdivisions = Math.round(defaultValue_default(options.subdivisions, 128)); + if (stackPartitions < 1) { + throw new DeveloperError_default("options.stackPartitions cannot be less than 1"); + } + if (slicePartitions < 0) { + throw new DeveloperError_default("options.slicePartitions cannot be less than 0"); + } + if (subdivisions < 0) { + throw new DeveloperError_default( + "options.subdivisions must be greater than or equal to zero." + ); + } + if (defined_default(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + throw new DeveloperError_default( + "GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry." + ); + } + this._radii = Cartesian3_default.clone(radii); + this._innerRadii = Cartesian3_default.clone(innerRadii); + this._minimumClock = minimumClock; + this._maximumClock = maximumClock; + this._minimumCone = minimumCone; + this._maximumCone = maximumCone; + this._stackPartitions = stackPartitions; + this._slicePartitions = slicePartitions; + this._subdivisions = subdivisions; + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createEllipsoidOutlineGeometry"; +} +EllipsoidOutlineGeometry.packedLength = 2 * Cartesian3_default.packedLength + 8; +EllipsoidOutlineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._radii, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Cartesian3_default.pack(value._innerRadii, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + array[startingIndex++] = value._minimumClock; + array[startingIndex++] = value._maximumClock; + array[startingIndex++] = value._minimumCone; + array[startingIndex++] = value._maximumCone; + array[startingIndex++] = value._stackPartitions; + array[startingIndex++] = value._slicePartitions; + array[startingIndex++] = value._subdivisions; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchRadii = new Cartesian3_default(); +var scratchInnerRadii = new Cartesian3_default(); +var scratchOptions = { + radii: scratchRadii, + innerRadii: scratchInnerRadii, + minimumClock: void 0, + maximumClock: void 0, + minimumCone: void 0, + maximumCone: void 0, + stackPartitions: void 0, + slicePartitions: void 0, + subdivisions: void 0, + offsetAttribute: void 0 +}; +EllipsoidOutlineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + const radii = Cartesian3_default.unpack(array, startingIndex, scratchRadii); + startingIndex += Cartesian3_default.packedLength; + const innerRadii = Cartesian3_default.unpack(array, startingIndex, scratchInnerRadii); + startingIndex += Cartesian3_default.packedLength; + const minimumClock = array[startingIndex++]; + const maximumClock = array[startingIndex++]; + const minimumCone = array[startingIndex++]; + const maximumCone = array[startingIndex++]; + const stackPartitions = array[startingIndex++]; + const slicePartitions = array[startingIndex++]; + const subdivisions = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.minimumClock = minimumClock; + scratchOptions.maximumClock = maximumClock; + scratchOptions.minimumCone = minimumCone; + scratchOptions.maximumCone = maximumCone; + scratchOptions.stackPartitions = stackPartitions; + scratchOptions.slicePartitions = slicePartitions; + scratchOptions.subdivisions = subdivisions; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new EllipsoidOutlineGeometry(scratchOptions); + } + result._radii = Cartesian3_default.clone(radii, result._radii); + result._innerRadii = Cartesian3_default.clone(innerRadii, result._innerRadii); + result._minimumClock = minimumClock; + result._maximumClock = maximumClock; + result._minimumCone = minimumCone; + result._maximumCone = maximumCone; + result._stackPartitions = stackPartitions; + result._slicePartitions = slicePartitions; + result._subdivisions = subdivisions; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +EllipsoidOutlineGeometry.createGeometry = function(ellipsoidGeometry) { + const radii = ellipsoidGeometry._radii; + if (radii.x <= 0 || radii.y <= 0 || radii.z <= 0) { + return; + } + const innerRadii = ellipsoidGeometry._innerRadii; + if (innerRadii.x <= 0 || innerRadii.y <= 0 || innerRadii.z <= 0) { + return; + } + const minimumClock = ellipsoidGeometry._minimumClock; + const maximumClock = ellipsoidGeometry._maximumClock; + const minimumCone = ellipsoidGeometry._minimumCone; + const maximumCone = ellipsoidGeometry._maximumCone; + const subdivisions = ellipsoidGeometry._subdivisions; + const ellipsoid = Ellipsoid_default.fromCartesian3(radii); + let slicePartitions = ellipsoidGeometry._slicePartitions + 1; + let stackPartitions = ellipsoidGeometry._stackPartitions + 1; + slicePartitions = Math.round( + slicePartitions * Math.abs(maximumClock - minimumClock) / Math_default.TWO_PI + ); + stackPartitions = Math.round( + stackPartitions * Math.abs(maximumCone - minimumCone) / Math_default.PI + ); + if (slicePartitions < 2) { + slicePartitions = 2; + } + if (stackPartitions < 2) { + stackPartitions = 2; + } + let extraIndices = 0; + let vertexMultiplier = 1; + const hasInnerSurface = innerRadii.x !== radii.x || innerRadii.y !== radii.y || innerRadii.z !== radii.z; + let isTopOpen = false; + let isBotOpen = false; + if (hasInnerSurface) { + vertexMultiplier = 2; + if (minimumCone > 0) { + isTopOpen = true; + extraIndices += slicePartitions; + } + if (maximumCone < Math.PI) { + isBotOpen = true; + extraIndices += slicePartitions; + } + } + const vertexCount = subdivisions * vertexMultiplier * (stackPartitions + slicePartitions); + const positions = new Float64Array(vertexCount * 3); + const numIndices = 2 * (vertexCount + extraIndices - (slicePartitions + stackPartitions) * vertexMultiplier); + const indices = IndexDatatype_default.createTypedArray(vertexCount, numIndices); + let i; + let j; + let theta; + let phi; + let index = 0; + const sinPhi = new Array(stackPartitions); + const cosPhi = new Array(stackPartitions); + for (i = 0; i < stackPartitions; i++) { + phi = minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1); + sinPhi[i] = sin(phi); + cosPhi[i] = cos(phi); + } + const sinTheta = new Array(subdivisions); + const cosTheta = new Array(subdivisions); + for (i = 0; i < subdivisions; i++) { + theta = minimumClock + i * (maximumClock - minimumClock) / (subdivisions - 1); + sinTheta[i] = sin(theta); + cosTheta[i] = cos(theta); + } + for (i = 0; i < stackPartitions; i++) { + for (j = 0; j < subdivisions; j++) { + positions[index++] = radii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = radii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = radii.z * cosPhi[i]; + } + } + if (hasInnerSurface) { + for (i = 0; i < stackPartitions; i++) { + for (j = 0; j < subdivisions; j++) { + positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = innerRadii.z * cosPhi[i]; + } + } + } + sinPhi.length = subdivisions; + cosPhi.length = subdivisions; + for (i = 0; i < subdivisions; i++) { + phi = minimumCone + i * (maximumCone - minimumCone) / (subdivisions - 1); + sinPhi[i] = sin(phi); + cosPhi[i] = cos(phi); + } + sinTheta.length = slicePartitions; + cosTheta.length = slicePartitions; + for (i = 0; i < slicePartitions; i++) { + theta = minimumClock + i * (maximumClock - minimumClock) / (slicePartitions - 1); + sinTheta[i] = sin(theta); + cosTheta[i] = cos(theta); + } + for (i = 0; i < subdivisions; i++) { + for (j = 0; j < slicePartitions; j++) { + positions[index++] = radii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = radii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = radii.z * cosPhi[i]; + } + } + if (hasInnerSurface) { + for (i = 0; i < subdivisions; i++) { + for (j = 0; j < slicePartitions; j++) { + positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j]; + positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j]; + positions[index++] = innerRadii.z * cosPhi[i]; + } + } + } + index = 0; + for (i = 0; i < stackPartitions * vertexMultiplier; i++) { + const topOffset = i * subdivisions; + for (j = 0; j < subdivisions - 1; j++) { + indices[index++] = topOffset + j; + indices[index++] = topOffset + j + 1; + } + } + let offset = stackPartitions * subdivisions * vertexMultiplier; + for (i = 0; i < slicePartitions; i++) { + for (j = 0; j < subdivisions - 1; j++) { + indices[index++] = offset + i + j * slicePartitions; + indices[index++] = offset + i + (j + 1) * slicePartitions; + } + } + if (hasInnerSurface) { + offset = stackPartitions * subdivisions * vertexMultiplier + slicePartitions * subdivisions; + for (i = 0; i < slicePartitions; i++) { + for (j = 0; j < subdivisions - 1; j++) { + indices[index++] = offset + i + j * slicePartitions; + indices[index++] = offset + i + (j + 1) * slicePartitions; + } + } + } + if (hasInnerSurface) { + let outerOffset = stackPartitions * subdivisions * vertexMultiplier; + let innerOffset = outerOffset + subdivisions * slicePartitions; + if (isTopOpen) { + for (i = 0; i < slicePartitions; i++) { + indices[index++] = outerOffset + i; + indices[index++] = innerOffset + i; + } + } + if (isBotOpen) { + outerOffset += subdivisions * slicePartitions - slicePartitions; + innerOffset += subdivisions * slicePartitions - slicePartitions; + for (i = 0; i < slicePartitions; i++) { + indices[index++] = outerOffset + i; + indices[index++] = innerOffset + i; + } + } + } + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }) + }); + if (defined_default(ellipsoidGeometry._offsetAttribute)) { + const length = positions.length; + const offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: BoundingSphere_default.fromEllipsoid(ellipsoid), + offsetAttribute: ellipsoidGeometry._offsetAttribute + }); +}; +var EllipsoidOutlineGeometry_default = EllipsoidOutlineGeometry; + +export { + EllipsoidOutlineGeometry_default +}; diff --git a/public/assets/cesium/Workers/chunk-P6TRGU3S.js b/public/assets/cesium/Workers/chunk-P6TRGU3S.js new file mode 100644 index 0000000..435f93d --- /dev/null +++ b/public/assets/cesium/Workers/chunk-P6TRGU3S.js @@ -0,0 +1,163 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/DeveloperError.js +function DeveloperError(message) { + this.name = "DeveloperError"; + this.message = message; + let stack; + try { + throw new Error(); + } catch (e) { + stack = e.stack; + } + this.stack = stack; +} +if (defined_default(Object.create)) { + DeveloperError.prototype = Object.create(Error.prototype); + DeveloperError.prototype.constructor = DeveloperError; +} +DeveloperError.prototype.toString = function() { + let str = `${this.name}: ${this.message}`; + if (defined_default(this.stack)) { + str += ` +${this.stack.toString()}`; + } + return str; +}; +DeveloperError.throwInstantiationError = function() { + throw new DeveloperError( + "This function defines an interface and should not be called directly." + ); +}; +var DeveloperError_default = DeveloperError; + +// packages/engine/Source/Core/Check.js +var Check = {}; +Check.typeOf = {}; +function getUndefinedErrorMessage(name) { + return `${name} is required, actual value was undefined`; +} +function getFailedTypeErrorMessage(actual, expected, name) { + return `Expected ${name} to be typeof ${expected}, actual typeof was ${actual}`; +} +Check.defined = function(name, test) { + if (!defined_default(test)) { + throw new DeveloperError_default(getUndefinedErrorMessage(name)); + } +}; +Check.typeOf.func = function(name, test) { + if (typeof test !== "function") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "function", name) + ); + } +}; +Check.typeOf.string = function(name, test) { + if (typeof test !== "string") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "string", name) + ); + } +}; +Check.typeOf.number = function(name, test) { + if (typeof test !== "number") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "number", name) + ); + } +}; +Check.typeOf.number.lessThan = function(name, test, limit) { + Check.typeOf.number(name, test); + if (test >= limit) { + throw new DeveloperError_default( + `Expected ${name} to be less than ${limit}, actual value was ${test}` + ); + } +}; +Check.typeOf.number.lessThanOrEquals = function(name, test, limit) { + Check.typeOf.number(name, test); + if (test > limit) { + throw new DeveloperError_default( + `Expected ${name} to be less than or equal to ${limit}, actual value was ${test}` + ); + } +}; +Check.typeOf.number.greaterThan = function(name, test, limit) { + Check.typeOf.number(name, test); + if (test <= limit) { + throw new DeveloperError_default( + `Expected ${name} to be greater than ${limit}, actual value was ${test}` + ); + } +}; +Check.typeOf.number.greaterThanOrEquals = function(name, test, limit) { + Check.typeOf.number(name, test); + if (test < limit) { + throw new DeveloperError_default( + `Expected ${name} to be greater than or equal to ${limit}, actual value was ${test}` + ); + } +}; +Check.typeOf.object = function(name, test) { + if (typeof test !== "object") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "object", name) + ); + } +}; +Check.typeOf.bool = function(name, test) { + if (typeof test !== "boolean") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "boolean", name) + ); + } +}; +Check.typeOf.bigint = function(name, test) { + if (typeof test !== "bigint") { + throw new DeveloperError_default( + getFailedTypeErrorMessage(typeof test, "bigint", name) + ); + } +}; +Check.typeOf.number.equals = function(name1, name2, test1, test2) { + Check.typeOf.number(name1, test1); + Check.typeOf.number(name2, test2); + if (test1 !== test2) { + throw new DeveloperError_default( + `${name1} must be equal to ${name2}, the actual values are ${test1} and ${test2}` + ); + } +}; +var Check_default = Check; + +export { + DeveloperError_default, + Check_default +}; diff --git a/public/assets/cesium/Workers/chunk-QN6TBED4.js b/public/assets/cesium/Workers/chunk-QN6TBED4.js new file mode 100644 index 0000000..bd1e595 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-QN6TBED4.js @@ -0,0 +1,421 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidGeodesic_default +} from "./chunk-C3EQ27WF.js"; +import { + EllipsoidRhumbLine_default +} from "./chunk-JSQJDZI4.js"; +import { + IntersectionTests_default +} from "./chunk-QQOZO7KO.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolylinePipeline.js +var PolylinePipeline = {}; +PolylinePipeline.numberOfPoints = function(p0, p1, minDistance) { + const distance = Cartesian3_default.distance(p0, p1); + return Math.ceil(distance / minDistance); +}; +PolylinePipeline.numberOfPointsRhumbLine = function(p0, p1, granularity) { + const radiansDistanceSquared = Math.pow(p0.longitude - p1.longitude, 2) + Math.pow(p0.latitude - p1.latitude, 2); + return Math.max( + 1, + Math.ceil(Math.sqrt(radiansDistanceSquared / (granularity * granularity))) + ); +}; +var cartoScratch = new Cartographic_default(); +PolylinePipeline.extractHeights = function(positions, ellipsoid) { + const length = positions.length; + const heights = new Array(length); + for (let i = 0; i < length; i++) { + const p = positions[i]; + heights[i] = ellipsoid.cartesianToCartographic(p, cartoScratch).height; + } + return heights; +}; +var wrapLongitudeInversMatrix = new Matrix4_default(); +var wrapLongitudeOrigin = new Cartesian3_default(); +var wrapLongitudeXZNormal = new Cartesian3_default(); +var wrapLongitudeXZPlane = new Plane_default(Cartesian3_default.UNIT_X, 0); +var wrapLongitudeYZNormal = new Cartesian3_default(); +var wrapLongitudeYZPlane = new Plane_default(Cartesian3_default.UNIT_X, 0); +var wrapLongitudeIntersection = new Cartesian3_default(); +var wrapLongitudeOffset = new Cartesian3_default(); +var subdivideHeightsScratchArray = []; +function subdivideHeights(numPoints, h0, h1) { + const heights = subdivideHeightsScratchArray; + heights.length = numPoints; + let i; + if (h0 === h1) { + for (i = 0; i < numPoints; i++) { + heights[i] = h0; + } + return heights; + } + const dHeight = h1 - h0; + const heightPerVertex = dHeight / numPoints; + for (i = 0; i < numPoints; i++) { + const h = h0 + i * heightPerVertex; + heights[i] = h; + } + return heights; +} +var carto1 = new Cartographic_default(); +var carto2 = new Cartographic_default(); +var cartesian = new Cartesian3_default(); +var scaleFirst = new Cartesian3_default(); +var scaleLast = new Cartesian3_default(); +var ellipsoidGeodesic = new EllipsoidGeodesic_default(); +var ellipsoidRhumb = new EllipsoidRhumbLine_default(); +function generateCartesianArc(p0, p1, minDistance, ellipsoid, h0, h1, array, offset) { + const first = ellipsoid.scaleToGeodeticSurface(p0, scaleFirst); + const last = ellipsoid.scaleToGeodeticSurface(p1, scaleLast); + const numPoints = PolylinePipeline.numberOfPoints(p0, p1, minDistance); + const start = ellipsoid.cartesianToCartographic(first, carto1); + const end = ellipsoid.cartesianToCartographic(last, carto2); + const heights = subdivideHeights(numPoints, h0, h1); + ellipsoidGeodesic.setEndPoints(start, end); + const surfaceDistanceBetweenPoints = ellipsoidGeodesic.surfaceDistance / numPoints; + let index = offset; + start.height = h0; + let cart = ellipsoid.cartographicToCartesian(start, cartesian); + Cartesian3_default.pack(cart, array, index); + index += 3; + for (let i = 1; i < numPoints; i++) { + const carto = ellipsoidGeodesic.interpolateUsingSurfaceDistance( + i * surfaceDistanceBetweenPoints, + carto2 + ); + carto.height = heights[i]; + cart = ellipsoid.cartographicToCartesian(carto, cartesian); + Cartesian3_default.pack(cart, array, index); + index += 3; + } + return index; +} +function generateCartesianRhumbArc(p0, p1, granularity, ellipsoid, h0, h1, array, offset) { + const start = ellipsoid.cartesianToCartographic(p0, carto1); + const end = ellipsoid.cartesianToCartographic(p1, carto2); + const numPoints = PolylinePipeline.numberOfPointsRhumbLine( + start, + end, + granularity + ); + start.height = 0; + end.height = 0; + const heights = subdivideHeights(numPoints, h0, h1); + if (!ellipsoidRhumb.ellipsoid.equals(ellipsoid)) { + ellipsoidRhumb = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid); + } + ellipsoidRhumb.setEndPoints(start, end); + const surfaceDistanceBetweenPoints = ellipsoidRhumb.surfaceDistance / numPoints; + let index = offset; + start.height = h0; + let cart = ellipsoid.cartographicToCartesian(start, cartesian); + Cartesian3_default.pack(cart, array, index); + index += 3; + for (let i = 1; i < numPoints; i++) { + const carto = ellipsoidRhumb.interpolateUsingSurfaceDistance( + i * surfaceDistanceBetweenPoints, + carto2 + ); + carto.height = heights[i]; + cart = ellipsoid.cartographicToCartesian(carto, cartesian); + Cartesian3_default.pack(cart, array, index); + index += 3; + } + return index; +} +PolylinePipeline.wrapLongitude = function(positions, modelMatrix) { + const cartesians = []; + const segments = []; + if (defined_default(positions) && positions.length > 0) { + modelMatrix = defaultValue_default(modelMatrix, Matrix4_default.IDENTITY); + const inverseModelMatrix = Matrix4_default.inverseTransformation( + modelMatrix, + wrapLongitudeInversMatrix + ); + const origin = Matrix4_default.multiplyByPoint( + inverseModelMatrix, + Cartesian3_default.ZERO, + wrapLongitudeOrigin + ); + const xzNormal = Cartesian3_default.normalize( + Matrix4_default.multiplyByPointAsVector( + inverseModelMatrix, + Cartesian3_default.UNIT_Y, + wrapLongitudeXZNormal + ), + wrapLongitudeXZNormal + ); + const xzPlane = Plane_default.fromPointNormal( + origin, + xzNormal, + wrapLongitudeXZPlane + ); + const yzNormal = Cartesian3_default.normalize( + Matrix4_default.multiplyByPointAsVector( + inverseModelMatrix, + Cartesian3_default.UNIT_X, + wrapLongitudeYZNormal + ), + wrapLongitudeYZNormal + ); + const yzPlane = Plane_default.fromPointNormal( + origin, + yzNormal, + wrapLongitudeYZPlane + ); + let count = 1; + cartesians.push(Cartesian3_default.clone(positions[0])); + let prev = cartesians[0]; + const length = positions.length; + for (let i = 1; i < length; ++i) { + const cur = positions[i]; + if (Plane_default.getPointDistance(yzPlane, prev) < 0 || Plane_default.getPointDistance(yzPlane, cur) < 0) { + const intersection = IntersectionTests_default.lineSegmentPlane( + prev, + cur, + xzPlane, + wrapLongitudeIntersection + ); + if (defined_default(intersection)) { + const offset = Cartesian3_default.multiplyByScalar( + xzNormal, + 5e-9, + wrapLongitudeOffset + ); + if (Plane_default.getPointDistance(xzPlane, prev) < 0) { + Cartesian3_default.negate(offset, offset); + } + cartesians.push( + Cartesian3_default.add(intersection, offset, new Cartesian3_default()) + ); + segments.push(count + 1); + Cartesian3_default.negate(offset, offset); + cartesians.push( + Cartesian3_default.add(intersection, offset, new Cartesian3_default()) + ); + count = 1; + } + } + cartesians.push(Cartesian3_default.clone(positions[i])); + count++; + prev = cur; + } + segments.push(count); + } + return { + positions: cartesians, + lengths: segments + }; +}; +PolylinePipeline.generateArc = function(options) { + if (!defined_default(options)) { + options = {}; + } + const positions = options.positions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.positions is required."); + } + const length = positions.length; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + let height = defaultValue_default(options.height, 0); + const hasHeightArray = Array.isArray(height); + if (length < 1) { + return []; + } else if (length === 1) { + const p = ellipsoid.scaleToGeodeticSurface(positions[0], scaleFirst); + height = hasHeightArray ? height[0] : height; + if (height !== 0) { + const n = ellipsoid.geodeticSurfaceNormal(p, cartesian); + Cartesian3_default.multiplyByScalar(n, height, n); + Cartesian3_default.add(p, n, p); + } + return [p.x, p.y, p.z]; + } + let minDistance = options.minDistance; + if (!defined_default(minDistance)) { + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + minDistance = Math_default.chordLength(granularity, ellipsoid.maximumRadius); + } + let numPoints = 0; + let i; + for (i = 0; i < length - 1; i++) { + numPoints += PolylinePipeline.numberOfPoints( + positions[i], + positions[i + 1], + minDistance + ); + } + const arrayLength = (numPoints + 1) * 3; + const newPositions = new Array(arrayLength); + let offset = 0; + for (i = 0; i < length - 1; i++) { + const p0 = positions[i]; + const p1 = positions[i + 1]; + const h0 = hasHeightArray ? height[i] : height; + const h1 = hasHeightArray ? height[i + 1] : height; + offset = generateCartesianArc( + p0, + p1, + minDistance, + ellipsoid, + h0, + h1, + newPositions, + offset + ); + } + subdivideHeightsScratchArray.length = 0; + const lastPoint = positions[length - 1]; + const carto = ellipsoid.cartesianToCartographic(lastPoint, carto1); + carto.height = hasHeightArray ? height[length - 1] : height; + const cart = ellipsoid.cartographicToCartesian(carto, cartesian); + Cartesian3_default.pack(cart, newPositions, arrayLength - 3); + return newPositions; +}; +var scratchCartographic0 = new Cartographic_default(); +var scratchCartographic1 = new Cartographic_default(); +PolylinePipeline.generateRhumbArc = function(options) { + if (!defined_default(options)) { + options = {}; + } + const positions = options.positions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.positions is required."); + } + const length = positions.length; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + let height = defaultValue_default(options.height, 0); + const hasHeightArray = Array.isArray(height); + if (length < 1) { + return []; + } else if (length === 1) { + const p = ellipsoid.scaleToGeodeticSurface(positions[0], scaleFirst); + height = hasHeightArray ? height[0] : height; + if (height !== 0) { + const n = ellipsoid.geodeticSurfaceNormal(p, cartesian); + Cartesian3_default.multiplyByScalar(n, height, n); + Cartesian3_default.add(p, n, p); + } + return [p.x, p.y, p.z]; + } + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + let numPoints = 0; + let i; + let c0 = ellipsoid.cartesianToCartographic( + positions[0], + scratchCartographic0 + ); + let c1; + for (i = 0; i < length - 1; i++) { + c1 = ellipsoid.cartesianToCartographic( + positions[i + 1], + scratchCartographic1 + ); + numPoints += PolylinePipeline.numberOfPointsRhumbLine(c0, c1, granularity); + c0 = Cartographic_default.clone(c1, scratchCartographic0); + } + const arrayLength = (numPoints + 1) * 3; + const newPositions = new Array(arrayLength); + let offset = 0; + for (i = 0; i < length - 1; i++) { + const p0 = positions[i]; + const p1 = positions[i + 1]; + const h0 = hasHeightArray ? height[i] : height; + const h1 = hasHeightArray ? height[i + 1] : height; + offset = generateCartesianRhumbArc( + p0, + p1, + granularity, + ellipsoid, + h0, + h1, + newPositions, + offset + ); + } + subdivideHeightsScratchArray.length = 0; + const lastPoint = positions[length - 1]; + const carto = ellipsoid.cartesianToCartographic(lastPoint, carto1); + carto.height = hasHeightArray ? height[length - 1] : height; + const cart = ellipsoid.cartographicToCartesian(carto, cartesian); + Cartesian3_default.pack(cart, newPositions, arrayLength - 3); + return newPositions; +}; +PolylinePipeline.generateCartesianArc = function(options) { + const numberArray = PolylinePipeline.generateArc(options); + const size = numberArray.length / 3; + const newPositions = new Array(size); + for (let i = 0; i < size; i++) { + newPositions[i] = Cartesian3_default.unpack(numberArray, i * 3); + } + return newPositions; +}; +PolylinePipeline.generateCartesianRhumbArc = function(options) { + const numberArray = PolylinePipeline.generateRhumbArc(options); + const size = numberArray.length / 3; + const newPositions = new Array(size); + for (let i = 0; i < size; i++) { + newPositions[i] = Cartesian3_default.unpack(numberArray, i * 3); + } + return newPositions; +}; +var PolylinePipeline_default = PolylinePipeline; + +export { + PolylinePipeline_default +}; diff --git a/public/assets/cesium/Workers/chunk-QQOZO7KO.js b/public/assets/cesium/Workers/chunk-QQOZO7KO.js new file mode 100644 index 0000000..bf9b338 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-QQOZO7KO.js @@ -0,0 +1,1258 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Interval_default +} from "./chunk-KHZNBFOH.js"; +import { + Cartesian3_default, + Cartographic_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/QuadraticRealPolynomial.js +var QuadraticRealPolynomial = {}; +QuadraticRealPolynomial.computeDiscriminant = function(a, b, c) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + const discriminant = b * b - 4 * a * c; + return discriminant; +}; +function addWithCancellationCheck(left, right, tolerance) { + const difference = left + right; + if (Math_default.sign(left) !== Math_default.sign(right) && Math.abs(difference / Math.max(Math.abs(left), Math.abs(right))) < tolerance) { + return 0; + } + return difference; +} +QuadraticRealPolynomial.computeRealRoots = function(a, b, c) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + let ratio; + if (a === 0) { + if (b === 0) { + return []; + } + return [-c / b]; + } else if (b === 0) { + if (c === 0) { + return [0, 0]; + } + const cMagnitude = Math.abs(c); + const aMagnitude = Math.abs(a); + if (cMagnitude < aMagnitude && cMagnitude / aMagnitude < Math_default.EPSILON14) { + return [0, 0]; + } else if (cMagnitude > aMagnitude && aMagnitude / cMagnitude < Math_default.EPSILON14) { + return []; + } + ratio = -c / a; + if (ratio < 0) { + return []; + } + const root = Math.sqrt(ratio); + return [-root, root]; + } else if (c === 0) { + ratio = -b / a; + if (ratio < 0) { + return [ratio, 0]; + } + return [0, ratio]; + } + const b2 = b * b; + const four_ac = 4 * a * c; + const radicand = addWithCancellationCheck(b2, -four_ac, Math_default.EPSILON14); + if (radicand < 0) { + return []; + } + const q = -0.5 * addWithCancellationCheck( + b, + Math_default.sign(b) * Math.sqrt(radicand), + Math_default.EPSILON14 + ); + if (b > 0) { + return [q / a, c / q]; + } + return [c / q, q / a]; +}; +var QuadraticRealPolynomial_default = QuadraticRealPolynomial; + +// packages/engine/Source/Core/CubicRealPolynomial.js +var CubicRealPolynomial = {}; +CubicRealPolynomial.computeDiscriminant = function(a, b, c, d) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + if (typeof d !== "number") { + throw new DeveloperError_default("d is a required number."); + } + const a2 = a * a; + const b2 = b * b; + const c2 = c * c; + const d2 = d * d; + const discriminant = 18 * a * b * c * d + b2 * c2 - 27 * a2 * d2 - 4 * (a * c2 * c + b2 * b * d); + return discriminant; +}; +function computeRealRoots(a, b, c, d) { + const A = a; + const B = b / 3; + const C = c / 3; + const D = d; + const AC = A * C; + const BD = B * D; + const B2 = B * B; + const C2 = C * C; + const delta1 = A * C - B2; + const delta2 = A * D - B * C; + const delta3 = B * D - C2; + const discriminant = 4 * delta1 * delta3 - delta2 * delta2; + let temp; + let temp1; + if (discriminant < 0) { + let ABar; + let CBar; + let DBar; + if (B2 * BD >= AC * C2) { + ABar = A; + CBar = delta1; + DBar = -2 * B * delta1 + A * delta2; + } else { + ABar = D; + CBar = delta3; + DBar = -D * delta2 + 2 * C * delta3; + } + const s = DBar < 0 ? -1 : 1; + const temp0 = -s * Math.abs(ABar) * Math.sqrt(-discriminant); + temp1 = -DBar + temp0; + const x = temp1 / 2; + const p = x < 0 ? -Math.pow(-x, 1 / 3) : Math.pow(x, 1 / 3); + const q = temp1 === temp0 ? -p : -CBar / p; + temp = CBar <= 0 ? p + q : -DBar / (p * p + q * q + CBar); + if (B2 * BD >= AC * C2) { + return [(temp - B) / A]; + } + return [-D / (temp + C)]; + } + const CBarA = delta1; + const DBarA = -2 * B * delta1 + A * delta2; + const CBarD = delta3; + const DBarD = -D * delta2 + 2 * C * delta3; + const squareRootOfDiscriminant = Math.sqrt(discriminant); + const halfSquareRootOf3 = Math.sqrt(3) / 2; + let theta = Math.abs(Math.atan2(A * squareRootOfDiscriminant, -DBarA) / 3); + temp = 2 * Math.sqrt(-CBarA); + let cosine = Math.cos(theta); + temp1 = temp * cosine; + let temp3 = temp * (-cosine / 2 - halfSquareRootOf3 * Math.sin(theta)); + const numeratorLarge = temp1 + temp3 > 2 * B ? temp1 - B : temp3 - B; + const denominatorLarge = A; + const root1 = numeratorLarge / denominatorLarge; + theta = Math.abs(Math.atan2(D * squareRootOfDiscriminant, -DBarD) / 3); + temp = 2 * Math.sqrt(-CBarD); + cosine = Math.cos(theta); + temp1 = temp * cosine; + temp3 = temp * (-cosine / 2 - halfSquareRootOf3 * Math.sin(theta)); + const numeratorSmall = -D; + const denominatorSmall = temp1 + temp3 < 2 * C ? temp1 + C : temp3 + C; + const root3 = numeratorSmall / denominatorSmall; + const E = denominatorLarge * denominatorSmall; + const F = -numeratorLarge * denominatorSmall - denominatorLarge * numeratorSmall; + const G = numeratorLarge * numeratorSmall; + const root2 = (C * F - B * G) / (-B * F + C * E); + if (root1 <= root2) { + if (root1 <= root3) { + if (root2 <= root3) { + return [root1, root2, root3]; + } + return [root1, root3, root2]; + } + return [root3, root1, root2]; + } + if (root1 <= root3) { + return [root2, root1, root3]; + } + if (root2 <= root3) { + return [root2, root3, root1]; + } + return [root3, root2, root1]; +} +CubicRealPolynomial.computeRealRoots = function(a, b, c, d) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + if (typeof d !== "number") { + throw new DeveloperError_default("d is a required number."); + } + let roots; + let ratio; + if (a === 0) { + return QuadraticRealPolynomial_default.computeRealRoots(b, c, d); + } else if (b === 0) { + if (c === 0) { + if (d === 0) { + return [0, 0, 0]; + } + ratio = -d / a; + const root = ratio < 0 ? -Math.pow(-ratio, 1 / 3) : Math.pow(ratio, 1 / 3); + return [root, root, root]; + } else if (d === 0) { + roots = QuadraticRealPolynomial_default.computeRealRoots(a, 0, c); + if (roots.Length === 0) { + return [0]; + } + return [roots[0], 0, roots[1]]; + } + return computeRealRoots(a, 0, c, d); + } else if (c === 0) { + if (d === 0) { + ratio = -b / a; + if (ratio < 0) { + return [ratio, 0, 0]; + } + return [0, 0, ratio]; + } + return computeRealRoots(a, b, 0, d); + } else if (d === 0) { + roots = QuadraticRealPolynomial_default.computeRealRoots(a, b, c); + if (roots.length === 0) { + return [0]; + } else if (roots[1] <= 0) { + return [roots[0], roots[1], 0]; + } else if (roots[0] >= 0) { + return [0, roots[0], roots[1]]; + } + return [roots[0], 0, roots[1]]; + } + return computeRealRoots(a, b, c, d); +}; +var CubicRealPolynomial_default = CubicRealPolynomial; + +// packages/engine/Source/Core/QuarticRealPolynomial.js +var QuarticRealPolynomial = {}; +QuarticRealPolynomial.computeDiscriminant = function(a, b, c, d, e) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + if (typeof d !== "number") { + throw new DeveloperError_default("d is a required number."); + } + if (typeof e !== "number") { + throw new DeveloperError_default("e is a required number."); + } + const a2 = a * a; + const a3 = a2 * a; + const b2 = b * b; + const b3 = b2 * b; + const c2 = c * c; + const c3 = c2 * c; + const d2 = d * d; + const d3 = d2 * d; + const e2 = e * e; + const e3 = e2 * e; + const discriminant = b2 * c2 * d2 - 4 * b3 * d3 - 4 * a * c3 * d2 + 18 * a * b * c * d3 - 27 * a2 * d2 * d2 + 256 * a3 * e3 + e * (18 * b3 * c * d - 4 * b2 * c3 + 16 * a * c2 * c2 - 80 * a * b * c2 * d - 6 * a * b2 * d2 + 144 * a2 * c * d2) + e2 * (144 * a * b2 * c - 27 * b2 * b2 - 128 * a2 * c2 - 192 * a2 * b * d); + return discriminant; +}; +function original(a3, a2, a1, a0) { + const a3Squared = a3 * a3; + const p = a2 - 3 * a3Squared / 8; + const q = a1 - a2 * a3 / 2 + a3Squared * a3 / 8; + const r = a0 - a1 * a3 / 4 + a2 * a3Squared / 16 - 3 * a3Squared * a3Squared / 256; + const cubicRoots = CubicRealPolynomial_default.computeRealRoots( + 1, + 2 * p, + p * p - 4 * r, + -q * q + ); + if (cubicRoots.length > 0) { + const temp = -a3 / 4; + const hSquared = cubicRoots[cubicRoots.length - 1]; + if (Math.abs(hSquared) < Math_default.EPSILON14) { + const roots = QuadraticRealPolynomial_default.computeRealRoots(1, p, r); + if (roots.length === 2) { + const root0 = roots[0]; + const root1 = roots[1]; + let y; + if (root0 >= 0 && root1 >= 0) { + const y0 = Math.sqrt(root0); + const y1 = Math.sqrt(root1); + return [temp - y1, temp - y0, temp + y0, temp + y1]; + } else if (root0 >= 0 && root1 < 0) { + y = Math.sqrt(root0); + return [temp - y, temp + y]; + } else if (root0 < 0 && root1 >= 0) { + y = Math.sqrt(root1); + return [temp - y, temp + y]; + } + } + return []; + } else if (hSquared > 0) { + const h = Math.sqrt(hSquared); + const m = (p + hSquared - q / h) / 2; + const n = (p + hSquared + q / h) / 2; + const roots1 = QuadraticRealPolynomial_default.computeRealRoots(1, h, m); + const roots2 = QuadraticRealPolynomial_default.computeRealRoots(1, -h, n); + if (roots1.length !== 0) { + roots1[0] += temp; + roots1[1] += temp; + if (roots2.length !== 0) { + roots2[0] += temp; + roots2[1] += temp; + if (roots1[1] <= roots2[0]) { + return [roots1[0], roots1[1], roots2[0], roots2[1]]; + } else if (roots2[1] <= roots1[0]) { + return [roots2[0], roots2[1], roots1[0], roots1[1]]; + } else if (roots1[0] >= roots2[0] && roots1[1] <= roots2[1]) { + return [roots2[0], roots1[0], roots1[1], roots2[1]]; + } else if (roots2[0] >= roots1[0] && roots2[1] <= roots1[1]) { + return [roots1[0], roots2[0], roots2[1], roots1[1]]; + } else if (roots1[0] > roots2[0] && roots1[0] < roots2[1]) { + return [roots2[0], roots1[0], roots2[1], roots1[1]]; + } + return [roots1[0], roots2[0], roots1[1], roots2[1]]; + } + return roots1; + } + if (roots2.length !== 0) { + roots2[0] += temp; + roots2[1] += temp; + return roots2; + } + return []; + } + } + return []; +} +function neumark(a3, a2, a1, a0) { + const a1Squared = a1 * a1; + const a2Squared = a2 * a2; + const a3Squared = a3 * a3; + const p = -2 * a2; + const q = a1 * a3 + a2Squared - 4 * a0; + const r = a3Squared * a0 - a1 * a2 * a3 + a1Squared; + const cubicRoots = CubicRealPolynomial_default.computeRealRoots(1, p, q, r); + if (cubicRoots.length > 0) { + const y = cubicRoots[0]; + const temp = a2 - y; + const tempSquared = temp * temp; + const g1 = a3 / 2; + const h1 = temp / 2; + const m = tempSquared - 4 * a0; + const mError = tempSquared + 4 * Math.abs(a0); + const n = a3Squared - 4 * y; + const nError = a3Squared + 4 * Math.abs(y); + let g2; + let h2; + if (y < 0 || m * nError < n * mError) { + const squareRootOfN = Math.sqrt(n); + g2 = squareRootOfN / 2; + h2 = squareRootOfN === 0 ? 0 : (a3 * h1 - a1) / squareRootOfN; + } else { + const squareRootOfM = Math.sqrt(m); + g2 = squareRootOfM === 0 ? 0 : (a3 * h1 - a1) / squareRootOfM; + h2 = squareRootOfM / 2; + } + let G; + let g; + if (g1 === 0 && g2 === 0) { + G = 0; + g = 0; + } else if (Math_default.sign(g1) === Math_default.sign(g2)) { + G = g1 + g2; + g = y / G; + } else { + g = g1 - g2; + G = y / g; + } + let H; + let h; + if (h1 === 0 && h2 === 0) { + H = 0; + h = 0; + } else if (Math_default.sign(h1) === Math_default.sign(h2)) { + H = h1 + h2; + h = a0 / H; + } else { + h = h1 - h2; + H = a0 / h; + } + const roots1 = QuadraticRealPolynomial_default.computeRealRoots(1, G, H); + const roots2 = QuadraticRealPolynomial_default.computeRealRoots(1, g, h); + if (roots1.length !== 0) { + if (roots2.length !== 0) { + if (roots1[1] <= roots2[0]) { + return [roots1[0], roots1[1], roots2[0], roots2[1]]; + } else if (roots2[1] <= roots1[0]) { + return [roots2[0], roots2[1], roots1[0], roots1[1]]; + } else if (roots1[0] >= roots2[0] && roots1[1] <= roots2[1]) { + return [roots2[0], roots1[0], roots1[1], roots2[1]]; + } else if (roots2[0] >= roots1[0] && roots2[1] <= roots1[1]) { + return [roots1[0], roots2[0], roots2[1], roots1[1]]; + } else if (roots1[0] > roots2[0] && roots1[0] < roots2[1]) { + return [roots2[0], roots1[0], roots2[1], roots1[1]]; + } + return [roots1[0], roots2[0], roots1[1], roots2[1]]; + } + return roots1; + } + if (roots2.length !== 0) { + return roots2; + } + } + return []; +} +QuarticRealPolynomial.computeRealRoots = function(a, b, c, d, e) { + if (typeof a !== "number") { + throw new DeveloperError_default("a is a required number."); + } + if (typeof b !== "number") { + throw new DeveloperError_default("b is a required number."); + } + if (typeof c !== "number") { + throw new DeveloperError_default("c is a required number."); + } + if (typeof d !== "number") { + throw new DeveloperError_default("d is a required number."); + } + if (typeof e !== "number") { + throw new DeveloperError_default("e is a required number."); + } + if (Math.abs(a) < Math_default.EPSILON15) { + return CubicRealPolynomial_default.computeRealRoots(b, c, d, e); + } + const a3 = b / a; + const a2 = c / a; + const a1 = d / a; + const a0 = e / a; + let k = a3 < 0 ? 1 : 0; + k += a2 < 0 ? k + 1 : k; + k += a1 < 0 ? k + 1 : k; + k += a0 < 0 ? k + 1 : k; + switch (k) { + case 0: + return original(a3, a2, a1, a0); + case 1: + return neumark(a3, a2, a1, a0); + case 2: + return neumark(a3, a2, a1, a0); + case 3: + return original(a3, a2, a1, a0); + case 4: + return original(a3, a2, a1, a0); + case 5: + return neumark(a3, a2, a1, a0); + case 6: + return original(a3, a2, a1, a0); + case 7: + return original(a3, a2, a1, a0); + case 8: + return neumark(a3, a2, a1, a0); + case 9: + return original(a3, a2, a1, a0); + case 10: + return original(a3, a2, a1, a0); + case 11: + return neumark(a3, a2, a1, a0); + case 12: + return original(a3, a2, a1, a0); + case 13: + return original(a3, a2, a1, a0); + case 14: + return original(a3, a2, a1, a0); + case 15: + return original(a3, a2, a1, a0); + default: + return void 0; + } +}; +var QuarticRealPolynomial_default = QuarticRealPolynomial; + +// packages/engine/Source/Core/Ray.js +function Ray(origin, direction) { + direction = Cartesian3_default.clone(defaultValue_default(direction, Cartesian3_default.ZERO)); + if (!Cartesian3_default.equals(direction, Cartesian3_default.ZERO)) { + Cartesian3_default.normalize(direction, direction); + } + this.origin = Cartesian3_default.clone(defaultValue_default(origin, Cartesian3_default.ZERO)); + this.direction = direction; +} +Ray.clone = function(ray, result) { + if (!defined_default(ray)) { + return void 0; + } + if (!defined_default(result)) { + return new Ray(ray.origin, ray.direction); + } + result.origin = Cartesian3_default.clone(ray.origin); + result.direction = Cartesian3_default.clone(ray.direction); + return result; +}; +Ray.getPoint = function(ray, t, result) { + Check_default.typeOf.object("ray", ray); + Check_default.typeOf.number("t", t); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + result = Cartesian3_default.multiplyByScalar(ray.direction, t, result); + return Cartesian3_default.add(ray.origin, result, result); +}; +var Ray_default = Ray; + +// packages/engine/Source/Core/IntersectionTests.js +var IntersectionTests = {}; +IntersectionTests.rayPlane = function(ray, plane, result) { + if (!defined_default(ray)) { + throw new DeveloperError_default("ray is required."); + } + if (!defined_default(plane)) { + throw new DeveloperError_default("plane is required."); + } + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const origin = ray.origin; + const direction = ray.direction; + const normal = plane.normal; + const denominator = Cartesian3_default.dot(normal, direction); + if (Math.abs(denominator) < Math_default.EPSILON15) { + return void 0; + } + const t = (-plane.distance - Cartesian3_default.dot(normal, origin)) / denominator; + if (t < 0) { + return void 0; + } + result = Cartesian3_default.multiplyByScalar(direction, t, result); + return Cartesian3_default.add(origin, result, result); +}; +var scratchEdge0 = new Cartesian3_default(); +var scratchEdge1 = new Cartesian3_default(); +var scratchPVec = new Cartesian3_default(); +var scratchTVec = new Cartesian3_default(); +var scratchQVec = new Cartesian3_default(); +IntersectionTests.rayTriangleParametric = function(ray, p0, p1, p2, cullBackFaces) { + if (!defined_default(ray)) { + throw new DeveloperError_default("ray is required."); + } + if (!defined_default(p0)) { + throw new DeveloperError_default("p0 is required."); + } + if (!defined_default(p1)) { + throw new DeveloperError_default("p1 is required."); + } + if (!defined_default(p2)) { + throw new DeveloperError_default("p2 is required."); + } + cullBackFaces = defaultValue_default(cullBackFaces, false); + const origin = ray.origin; + const direction = ray.direction; + const edge0 = Cartesian3_default.subtract(p1, p0, scratchEdge0); + const edge1 = Cartesian3_default.subtract(p2, p0, scratchEdge1); + const p = Cartesian3_default.cross(direction, edge1, scratchPVec); + const det = Cartesian3_default.dot(edge0, p); + let tvec; + let q; + let u; + let v; + let t; + if (cullBackFaces) { + if (det < Math_default.EPSILON6) { + return void 0; + } + tvec = Cartesian3_default.subtract(origin, p0, scratchTVec); + u = Cartesian3_default.dot(tvec, p); + if (u < 0 || u > det) { + return void 0; + } + q = Cartesian3_default.cross(tvec, edge0, scratchQVec); + v = Cartesian3_default.dot(direction, q); + if (v < 0 || u + v > det) { + return void 0; + } + t = Cartesian3_default.dot(edge1, q) / det; + } else { + if (Math.abs(det) < Math_default.EPSILON6) { + return void 0; + } + const invDet = 1 / det; + tvec = Cartesian3_default.subtract(origin, p0, scratchTVec); + u = Cartesian3_default.dot(tvec, p) * invDet; + if (u < 0 || u > 1) { + return void 0; + } + q = Cartesian3_default.cross(tvec, edge0, scratchQVec); + v = Cartesian3_default.dot(direction, q) * invDet; + if (v < 0 || u + v > 1) { + return void 0; + } + t = Cartesian3_default.dot(edge1, q) * invDet; + } + return t; +}; +IntersectionTests.rayTriangle = function(ray, p0, p1, p2, cullBackFaces, result) { + const t = IntersectionTests.rayTriangleParametric( + ray, + p0, + p1, + p2, + cullBackFaces + ); + if (!defined_default(t) || t < 0) { + return void 0; + } + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + Cartesian3_default.multiplyByScalar(ray.direction, t, result); + return Cartesian3_default.add(ray.origin, result, result); +}; +var scratchLineSegmentTriangleRay = new Ray_default(); +IntersectionTests.lineSegmentTriangle = function(v0, v1, p0, p1, p2, cullBackFaces, result) { + if (!defined_default(v0)) { + throw new DeveloperError_default("v0 is required."); + } + if (!defined_default(v1)) { + throw new DeveloperError_default("v1 is required."); + } + if (!defined_default(p0)) { + throw new DeveloperError_default("p0 is required."); + } + if (!defined_default(p1)) { + throw new DeveloperError_default("p1 is required."); + } + if (!defined_default(p2)) { + throw new DeveloperError_default("p2 is required."); + } + const ray = scratchLineSegmentTriangleRay; + Cartesian3_default.clone(v0, ray.origin); + Cartesian3_default.subtract(v1, v0, ray.direction); + Cartesian3_default.normalize(ray.direction, ray.direction); + const t = IntersectionTests.rayTriangleParametric( + ray, + p0, + p1, + p2, + cullBackFaces + ); + if (!defined_default(t) || t < 0 || t > Cartesian3_default.distance(v0, v1)) { + return void 0; + } + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + Cartesian3_default.multiplyByScalar(ray.direction, t, result); + return Cartesian3_default.add(ray.origin, result, result); +}; +function solveQuadratic(a, b, c, result) { + const det = b * b - 4 * a * c; + if (det < 0) { + return void 0; + } else if (det > 0) { + const denom = 1 / (2 * a); + const disc = Math.sqrt(det); + const root0 = (-b + disc) * denom; + const root1 = (-b - disc) * denom; + if (root0 < root1) { + result.root0 = root0; + result.root1 = root1; + } else { + result.root0 = root1; + result.root1 = root0; + } + return result; + } + const root = -b / (2 * a); + if (root === 0) { + return void 0; + } + result.root0 = result.root1 = root; + return result; +} +var raySphereRoots = { + root0: 0, + root1: 0 +}; +function raySphere(ray, sphere, result) { + if (!defined_default(result)) { + result = new Interval_default(); + } + const origin = ray.origin; + const direction = ray.direction; + const center = sphere.center; + const radiusSquared = sphere.radius * sphere.radius; + const diff = Cartesian3_default.subtract(origin, center, scratchPVec); + const a = Cartesian3_default.dot(direction, direction); + const b = 2 * Cartesian3_default.dot(direction, diff); + const c = Cartesian3_default.magnitudeSquared(diff) - radiusSquared; + const roots = solveQuadratic(a, b, c, raySphereRoots); + if (!defined_default(roots)) { + return void 0; + } + result.start = roots.root0; + result.stop = roots.root1; + return result; +} +IntersectionTests.raySphere = function(ray, sphere, result) { + if (!defined_default(ray)) { + throw new DeveloperError_default("ray is required."); + } + if (!defined_default(sphere)) { + throw new DeveloperError_default("sphere is required."); + } + result = raySphere(ray, sphere, result); + if (!defined_default(result) || result.stop < 0) { + return void 0; + } + result.start = Math.max(result.start, 0); + return result; +}; +var scratchLineSegmentRay = new Ray_default(); +IntersectionTests.lineSegmentSphere = function(p0, p1, sphere, result) { + if (!defined_default(p0)) { + throw new DeveloperError_default("p0 is required."); + } + if (!defined_default(p1)) { + throw new DeveloperError_default("p1 is required."); + } + if (!defined_default(sphere)) { + throw new DeveloperError_default("sphere is required."); + } + const ray = scratchLineSegmentRay; + Cartesian3_default.clone(p0, ray.origin); + const direction = Cartesian3_default.subtract(p1, p0, ray.direction); + const maxT = Cartesian3_default.magnitude(direction); + Cartesian3_default.normalize(direction, direction); + result = raySphere(ray, sphere, result); + if (!defined_default(result) || result.stop < 0 || result.start > maxT) { + return void 0; + } + result.start = Math.max(result.start, 0); + result.stop = Math.min(result.stop, maxT); + return result; +}; +var scratchQ = new Cartesian3_default(); +var scratchW = new Cartesian3_default(); +IntersectionTests.rayEllipsoid = function(ray, ellipsoid) { + if (!defined_default(ray)) { + throw new DeveloperError_default("ray is required."); + } + if (!defined_default(ellipsoid)) { + throw new DeveloperError_default("ellipsoid is required."); + } + const inverseRadii = ellipsoid.oneOverRadii; + const q = Cartesian3_default.multiplyComponents(inverseRadii, ray.origin, scratchQ); + const w = Cartesian3_default.multiplyComponents( + inverseRadii, + ray.direction, + scratchW + ); + const q2 = Cartesian3_default.magnitudeSquared(q); + const qw = Cartesian3_default.dot(q, w); + let difference, w2, product, discriminant, temp; + if (q2 > 1) { + if (qw >= 0) { + return void 0; + } + const qw2 = qw * qw; + difference = q2 - 1; + w2 = Cartesian3_default.magnitudeSquared(w); + product = w2 * difference; + if (qw2 < product) { + return void 0; + } else if (qw2 > product) { + discriminant = qw * qw - product; + temp = -qw + Math.sqrt(discriminant); + const root0 = temp / w2; + const root1 = difference / temp; + if (root0 < root1) { + return new Interval_default(root0, root1); + } + return { + start: root1, + stop: root0 + }; + } + const root = Math.sqrt(difference / w2); + return new Interval_default(root, root); + } else if (q2 < 1) { + difference = q2 - 1; + w2 = Cartesian3_default.magnitudeSquared(w); + product = w2 * difference; + discriminant = qw * qw - product; + temp = -qw + Math.sqrt(discriminant); + return new Interval_default(0, temp / w2); + } + if (qw < 0) { + w2 = Cartesian3_default.magnitudeSquared(w); + return new Interval_default(0, -qw / w2); + } + return void 0; +}; +function addWithCancellationCheck2(left, right, tolerance) { + const difference = left + right; + if (Math_default.sign(left) !== Math_default.sign(right) && Math.abs(difference / Math.max(Math.abs(left), Math.abs(right))) < tolerance) { + return 0; + } + return difference; +} +IntersectionTests.quadraticVectorExpression = function(A, b, c, x, w) { + const xSquared = x * x; + const wSquared = w * w; + const l2 = (A[Matrix3_default.COLUMN1ROW1] - A[Matrix3_default.COLUMN2ROW2]) * wSquared; + const l1 = w * (x * addWithCancellationCheck2( + A[Matrix3_default.COLUMN1ROW0], + A[Matrix3_default.COLUMN0ROW1], + Math_default.EPSILON15 + ) + b.y); + const l0 = A[Matrix3_default.COLUMN0ROW0] * xSquared + A[Matrix3_default.COLUMN2ROW2] * wSquared + x * b.x + c; + const r1 = wSquared * addWithCancellationCheck2( + A[Matrix3_default.COLUMN2ROW1], + A[Matrix3_default.COLUMN1ROW2], + Math_default.EPSILON15 + ); + const r0 = w * (x * addWithCancellationCheck2(A[Matrix3_default.COLUMN2ROW0], A[Matrix3_default.COLUMN0ROW2]) + b.z); + let cosines; + const solutions = []; + if (r0 === 0 && r1 === 0) { + cosines = QuadraticRealPolynomial_default.computeRealRoots(l2, l1, l0); + if (cosines.length === 0) { + return solutions; + } + const cosine0 = cosines[0]; + const sine0 = Math.sqrt(Math.max(1 - cosine0 * cosine0, 0)); + solutions.push(new Cartesian3_default(x, w * cosine0, w * -sine0)); + solutions.push(new Cartesian3_default(x, w * cosine0, w * sine0)); + if (cosines.length === 2) { + const cosine1 = cosines[1]; + const sine1 = Math.sqrt(Math.max(1 - cosine1 * cosine1, 0)); + solutions.push(new Cartesian3_default(x, w * cosine1, w * -sine1)); + solutions.push(new Cartesian3_default(x, w * cosine1, w * sine1)); + } + return solutions; + } + const r0Squared = r0 * r0; + const r1Squared = r1 * r1; + const l2Squared = l2 * l2; + const r0r1 = r0 * r1; + const c4 = l2Squared + r1Squared; + const c3 = 2 * (l1 * l2 + r0r1); + const c2 = 2 * l0 * l2 + l1 * l1 - r1Squared + r0Squared; + const c1 = 2 * (l0 * l1 - r0r1); + const c0 = l0 * l0 - r0Squared; + if (c4 === 0 && c3 === 0 && c2 === 0 && c1 === 0) { + return solutions; + } + cosines = QuarticRealPolynomial_default.computeRealRoots(c4, c3, c2, c1, c0); + const length = cosines.length; + if (length === 0) { + return solutions; + } + for (let i = 0; i < length; ++i) { + const cosine = cosines[i]; + const cosineSquared = cosine * cosine; + const sineSquared = Math.max(1 - cosineSquared, 0); + const sine = Math.sqrt(sineSquared); + let left; + if (Math_default.sign(l2) === Math_default.sign(l0)) { + left = addWithCancellationCheck2( + l2 * cosineSquared + l0, + l1 * cosine, + Math_default.EPSILON12 + ); + } else if (Math_default.sign(l0) === Math_default.sign(l1 * cosine)) { + left = addWithCancellationCheck2( + l2 * cosineSquared, + l1 * cosine + l0, + Math_default.EPSILON12 + ); + } else { + left = addWithCancellationCheck2( + l2 * cosineSquared + l1 * cosine, + l0, + Math_default.EPSILON12 + ); + } + const right = addWithCancellationCheck2( + r1 * cosine, + r0, + Math_default.EPSILON15 + ); + const product = left * right; + if (product < 0) { + solutions.push(new Cartesian3_default(x, w * cosine, w * sine)); + } else if (product > 0) { + solutions.push(new Cartesian3_default(x, w * cosine, w * -sine)); + } else if (sine !== 0) { + solutions.push(new Cartesian3_default(x, w * cosine, w * -sine)); + solutions.push(new Cartesian3_default(x, w * cosine, w * sine)); + ++i; + } else { + solutions.push(new Cartesian3_default(x, w * cosine, w * sine)); + } + } + return solutions; +}; +var firstAxisScratch = new Cartesian3_default(); +var secondAxisScratch = new Cartesian3_default(); +var thirdAxisScratch = new Cartesian3_default(); +var referenceScratch = new Cartesian3_default(); +var bCart = new Cartesian3_default(); +var bScratch = new Matrix3_default(); +var btScratch = new Matrix3_default(); +var diScratch = new Matrix3_default(); +var dScratch = new Matrix3_default(); +var cScratch = new Matrix3_default(); +var tempMatrix = new Matrix3_default(); +var aScratch = new Matrix3_default(); +var sScratch = new Cartesian3_default(); +var closestScratch = new Cartesian3_default(); +var surfPointScratch = new Cartographic_default(); +IntersectionTests.grazingAltitudeLocation = function(ray, ellipsoid) { + if (!defined_default(ray)) { + throw new DeveloperError_default("ray is required."); + } + if (!defined_default(ellipsoid)) { + throw new DeveloperError_default("ellipsoid is required."); + } + const position = ray.origin; + const direction = ray.direction; + if (!Cartesian3_default.equals(position, Cartesian3_default.ZERO)) { + const normal = ellipsoid.geodeticSurfaceNormal(position, firstAxisScratch); + if (Cartesian3_default.dot(direction, normal) >= 0) { + return position; + } + } + const intersects = defined_default(this.rayEllipsoid(ray, ellipsoid)); + const f = ellipsoid.transformPositionToScaledSpace( + direction, + firstAxisScratch + ); + const firstAxis = Cartesian3_default.normalize(f, f); + const reference = Cartesian3_default.mostOrthogonalAxis(f, referenceScratch); + const secondAxis = Cartesian3_default.normalize( + Cartesian3_default.cross(reference, firstAxis, secondAxisScratch), + secondAxisScratch + ); + const thirdAxis = Cartesian3_default.normalize( + Cartesian3_default.cross(firstAxis, secondAxis, thirdAxisScratch), + thirdAxisScratch + ); + const B = bScratch; + B[0] = firstAxis.x; + B[1] = firstAxis.y; + B[2] = firstAxis.z; + B[3] = secondAxis.x; + B[4] = secondAxis.y; + B[5] = secondAxis.z; + B[6] = thirdAxis.x; + B[7] = thirdAxis.y; + B[8] = thirdAxis.z; + const B_T = Matrix3_default.transpose(B, btScratch); + const D_I = Matrix3_default.fromScale(ellipsoid.radii, diScratch); + const D = Matrix3_default.fromScale(ellipsoid.oneOverRadii, dScratch); + const C = cScratch; + C[0] = 0; + C[1] = -direction.z; + C[2] = direction.y; + C[3] = direction.z; + C[4] = 0; + C[5] = -direction.x; + C[6] = -direction.y; + C[7] = direction.x; + C[8] = 0; + const temp = Matrix3_default.multiply( + Matrix3_default.multiply(B_T, D, tempMatrix), + C, + tempMatrix + ); + const A = Matrix3_default.multiply( + Matrix3_default.multiply(temp, D_I, aScratch), + B, + aScratch + ); + const b = Matrix3_default.multiplyByVector(temp, position, bCart); + const solutions = IntersectionTests.quadraticVectorExpression( + A, + Cartesian3_default.negate(b, firstAxisScratch), + 0, + 0, + 1 + ); + let s; + let altitude; + const length = solutions.length; + if (length > 0) { + let closest = Cartesian3_default.clone(Cartesian3_default.ZERO, closestScratch); + let maximumValue = Number.NEGATIVE_INFINITY; + for (let i = 0; i < length; ++i) { + s = Matrix3_default.multiplyByVector( + D_I, + Matrix3_default.multiplyByVector(B, solutions[i], sScratch), + sScratch + ); + const v = Cartesian3_default.normalize( + Cartesian3_default.subtract(s, position, referenceScratch), + referenceScratch + ); + const dotProduct = Cartesian3_default.dot(v, direction); + if (dotProduct > maximumValue) { + maximumValue = dotProduct; + closest = Cartesian3_default.clone(s, closest); + } + } + const surfacePoint = ellipsoid.cartesianToCartographic( + closest, + surfPointScratch + ); + maximumValue = Math_default.clamp(maximumValue, 0, 1); + altitude = Cartesian3_default.magnitude( + Cartesian3_default.subtract(closest, position, referenceScratch) + ) * Math.sqrt(1 - maximumValue * maximumValue); + altitude = intersects ? -altitude : altitude; + surfacePoint.height = altitude; + return ellipsoid.cartographicToCartesian(surfacePoint, new Cartesian3_default()); + } + return void 0; +}; +var lineSegmentPlaneDifference = new Cartesian3_default(); +IntersectionTests.lineSegmentPlane = function(endPoint0, endPoint1, plane, result) { + if (!defined_default(endPoint0)) { + throw new DeveloperError_default("endPoint0 is required."); + } + if (!defined_default(endPoint1)) { + throw new DeveloperError_default("endPoint1 is required."); + } + if (!defined_default(plane)) { + throw new DeveloperError_default("plane is required."); + } + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const difference = Cartesian3_default.subtract( + endPoint1, + endPoint0, + lineSegmentPlaneDifference + ); + const normal = plane.normal; + const nDotDiff = Cartesian3_default.dot(normal, difference); + if (Math.abs(nDotDiff) < Math_default.EPSILON6) { + return void 0; + } + const nDotP0 = Cartesian3_default.dot(normal, endPoint0); + const t = -(plane.distance + nDotP0) / nDotDiff; + if (t < 0 || t > 1) { + return void 0; + } + Cartesian3_default.multiplyByScalar(difference, t, result); + Cartesian3_default.add(endPoint0, result, result); + return result; +}; +IntersectionTests.trianglePlaneIntersection = function(p0, p1, p2, plane) { + if (!defined_default(p0) || !defined_default(p1) || !defined_default(p2) || !defined_default(plane)) { + throw new DeveloperError_default("p0, p1, p2, and plane are required."); + } + const planeNormal = plane.normal; + const planeD = plane.distance; + const p0Behind = Cartesian3_default.dot(planeNormal, p0) + planeD < 0; + const p1Behind = Cartesian3_default.dot(planeNormal, p1) + planeD < 0; + const p2Behind = Cartesian3_default.dot(planeNormal, p2) + planeD < 0; + let numBehind = 0; + numBehind += p0Behind ? 1 : 0; + numBehind += p1Behind ? 1 : 0; + numBehind += p2Behind ? 1 : 0; + let u1, u2; + if (numBehind === 1 || numBehind === 2) { + u1 = new Cartesian3_default(); + u2 = new Cartesian3_default(); + } + if (numBehind === 1) { + if (p0Behind) { + IntersectionTests.lineSegmentPlane(p0, p1, plane, u1); + IntersectionTests.lineSegmentPlane(p0, p2, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 0, + 3, + 4, + // In front + 1, + 2, + 4, + 1, + 4, + 3 + ] + }; + } else if (p1Behind) { + IntersectionTests.lineSegmentPlane(p1, p2, plane, u1); + IntersectionTests.lineSegmentPlane(p1, p0, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 1, + 3, + 4, + // In front + 2, + 0, + 4, + 2, + 4, + 3 + ] + }; + } else if (p2Behind) { + IntersectionTests.lineSegmentPlane(p2, p0, plane, u1); + IntersectionTests.lineSegmentPlane(p2, p1, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 2, + 3, + 4, + // In front + 0, + 1, + 4, + 0, + 4, + 3 + ] + }; + } + } else if (numBehind === 2) { + if (!p0Behind) { + IntersectionTests.lineSegmentPlane(p1, p0, plane, u1); + IntersectionTests.lineSegmentPlane(p2, p0, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 1, + 2, + 4, + 1, + 4, + 3, + // In front + 0, + 3, + 4 + ] + }; + } else if (!p1Behind) { + IntersectionTests.lineSegmentPlane(p2, p1, plane, u1); + IntersectionTests.lineSegmentPlane(p0, p1, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 2, + 0, + 4, + 2, + 4, + 3, + // In front + 1, + 3, + 4 + ] + }; + } else if (!p2Behind) { + IntersectionTests.lineSegmentPlane(p0, p2, plane, u1); + IntersectionTests.lineSegmentPlane(p1, p2, plane, u2); + return { + positions: [p0, p1, p2, u1, u2], + indices: [ + // Behind + 0, + 1, + 4, + 0, + 4, + 3, + // In front + 2, + 3, + 4 + ] + }; + } + } + return void 0; +}; +var IntersectionTests_default = IntersectionTests; + +export { + Ray_default, + IntersectionTests_default +}; diff --git a/public/assets/cesium/Workers/chunk-RJM36CNY.js b/public/assets/cesium/Workers/chunk-RJM36CNY.js new file mode 100644 index 0000000..ba9d31b --- /dev/null +++ b/public/assets/cesium/Workers/chunk-RJM36CNY.js @@ -0,0 +1,117 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/WebMercatorProjection.js +function WebMercatorProjection(ellipsoid) { + this._ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.WGS84); + this._semimajorAxis = this._ellipsoid.maximumRadius; + this._oneOverSemimajorAxis = 1 / this._semimajorAxis; +} +Object.defineProperties(WebMercatorProjection.prototype, { + /** + * Gets the {@link Ellipsoid}. + * + * @memberof WebMercatorProjection.prototype + * + * @type {Ellipsoid} + * @readonly + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + } +}); +WebMercatorProjection.mercatorAngleToGeodeticLatitude = function(mercatorAngle) { + return Math_default.PI_OVER_TWO - 2 * Math.atan(Math.exp(-mercatorAngle)); +}; +WebMercatorProjection.geodeticLatitudeToMercatorAngle = function(latitude) { + if (latitude > WebMercatorProjection.MaximumLatitude) { + latitude = WebMercatorProjection.MaximumLatitude; + } else if (latitude < -WebMercatorProjection.MaximumLatitude) { + latitude = -WebMercatorProjection.MaximumLatitude; + } + const sinLatitude = Math.sin(latitude); + return 0.5 * Math.log((1 + sinLatitude) / (1 - sinLatitude)); +}; +WebMercatorProjection.MaximumLatitude = WebMercatorProjection.mercatorAngleToGeodeticLatitude( + Math.PI +); +WebMercatorProjection.prototype.project = function(cartographic, result) { + const semimajorAxis = this._semimajorAxis; + const x = cartographic.longitude * semimajorAxis; + const y = WebMercatorProjection.geodeticLatitudeToMercatorAngle( + cartographic.latitude + ) * semimajorAxis; + const z = cartographic.height; + if (!defined_default(result)) { + return new Cartesian3_default(x, y, z); + } + result.x = x; + result.y = y; + result.z = z; + return result; +}; +WebMercatorProjection.prototype.unproject = function(cartesian, result) { + if (!defined_default(cartesian)) { + throw new DeveloperError_default("cartesian is required"); + } + const oneOverEarthSemimajorAxis = this._oneOverSemimajorAxis; + const longitude = cartesian.x * oneOverEarthSemimajorAxis; + const latitude = WebMercatorProjection.mercatorAngleToGeodeticLatitude( + cartesian.y * oneOverEarthSemimajorAxis + ); + const height = cartesian.z; + if (!defined_default(result)) { + return new Cartographic_default(longitude, latitude, height); + } + result.longitude = longitude; + result.latitude = latitude; + result.height = height; + return result; +}; +var WebMercatorProjection_default = WebMercatorProjection; + +export { + WebMercatorProjection_default +}; diff --git a/public/assets/cesium/Workers/chunk-RTJKHZWU.js b/public/assets/cesium/Workers/chunk-RTJKHZWU.js new file mode 100644 index 0000000..4972a8b --- /dev/null +++ b/public/assets/cesium/Workers/chunk-RTJKHZWU.js @@ -0,0 +1,196 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + PolylinePipeline_default +} from "./chunk-QN6TBED4.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import { + Cartesian3_default, + Cartographic_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/WallGeometryLibrary.js +var WallGeometryLibrary = {}; +function latLonEquals(c0, c1) { + return Math_default.equalsEpsilon(c0.latitude, c1.latitude, Math_default.EPSILON10) && Math_default.equalsEpsilon(c0.longitude, c1.longitude, Math_default.EPSILON10); +} +var scratchCartographic1 = new Cartographic_default(); +var scratchCartographic2 = new Cartographic_default(); +function removeDuplicates(ellipsoid, positions, topHeights, bottomHeights) { + positions = arrayRemoveDuplicates_default(positions, Cartesian3_default.equalsEpsilon); + const length = positions.length; + if (length < 2) { + return; + } + const hasBottomHeights = defined_default(bottomHeights); + const hasTopHeights = defined_default(topHeights); + const cleanedPositions = new Array(length); + const cleanedTopHeights = new Array(length); + const cleanedBottomHeights = new Array(length); + const v0 = positions[0]; + cleanedPositions[0] = v0; + const c0 = ellipsoid.cartesianToCartographic(v0, scratchCartographic1); + if (hasTopHeights) { + c0.height = topHeights[0]; + } + cleanedTopHeights[0] = c0.height; + if (hasBottomHeights) { + cleanedBottomHeights[0] = bottomHeights[0]; + } else { + cleanedBottomHeights[0] = 0; + } + const startTopHeight = cleanedTopHeights[0]; + const startBottomHeight = cleanedBottomHeights[0]; + let hasAllSameHeights = startTopHeight === startBottomHeight; + let index = 1; + for (let i = 1; i < length; ++i) { + const v1 = positions[i]; + const c1 = ellipsoid.cartesianToCartographic(v1, scratchCartographic2); + if (hasTopHeights) { + c1.height = topHeights[i]; + } + hasAllSameHeights = hasAllSameHeights && c1.height === 0; + if (!latLonEquals(c0, c1)) { + cleanedPositions[index] = v1; + cleanedTopHeights[index] = c1.height; + if (hasBottomHeights) { + cleanedBottomHeights[index] = bottomHeights[i]; + } else { + cleanedBottomHeights[index] = 0; + } + hasAllSameHeights = hasAllSameHeights && cleanedTopHeights[index] === cleanedBottomHeights[index]; + Cartographic_default.clone(c1, c0); + ++index; + } else if (c0.height < c1.height) { + cleanedTopHeights[index - 1] = c1.height; + } + } + if (hasAllSameHeights || index < 2) { + return; + } + cleanedPositions.length = index; + cleanedTopHeights.length = index; + cleanedBottomHeights.length = index; + return { + positions: cleanedPositions, + topHeights: cleanedTopHeights, + bottomHeights: cleanedBottomHeights + }; +} +var positionsArrayScratch = new Array(2); +var heightsArrayScratch = new Array(2); +var generateArcOptionsScratch = { + positions: void 0, + height: void 0, + granularity: void 0, + ellipsoid: void 0 +}; +WallGeometryLibrary.computePositions = function(ellipsoid, wallPositions, maximumHeights, minimumHeights, granularity, duplicateCorners) { + const o = removeDuplicates( + ellipsoid, + wallPositions, + maximumHeights, + minimumHeights + ); + if (!defined_default(o)) { + return; + } + wallPositions = o.positions; + maximumHeights = o.topHeights; + minimumHeights = o.bottomHeights; + const length = wallPositions.length; + const numCorners = length - 2; + let topPositions; + let bottomPositions; + const minDistance = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + const generateArcOptions = generateArcOptionsScratch; + generateArcOptions.minDistance = minDistance; + generateArcOptions.ellipsoid = ellipsoid; + if (duplicateCorners) { + let count = 0; + let i; + for (i = 0; i < length - 1; i++) { + count += PolylinePipeline_default.numberOfPoints( + wallPositions[i], + wallPositions[i + 1], + minDistance + ) + 1; + } + topPositions = new Float64Array(count * 3); + bottomPositions = new Float64Array(count * 3); + const generateArcPositions = positionsArrayScratch; + const generateArcHeights = heightsArrayScratch; + generateArcOptions.positions = generateArcPositions; + generateArcOptions.height = generateArcHeights; + let offset = 0; + for (i = 0; i < length - 1; i++) { + generateArcPositions[0] = wallPositions[i]; + generateArcPositions[1] = wallPositions[i + 1]; + generateArcHeights[0] = maximumHeights[i]; + generateArcHeights[1] = maximumHeights[i + 1]; + const pos = PolylinePipeline_default.generateArc(generateArcOptions); + topPositions.set(pos, offset); + generateArcHeights[0] = minimumHeights[i]; + generateArcHeights[1] = minimumHeights[i + 1]; + bottomPositions.set( + PolylinePipeline_default.generateArc(generateArcOptions), + offset + ); + offset += pos.length; + } + } else { + generateArcOptions.positions = wallPositions; + generateArcOptions.height = maximumHeights; + topPositions = new Float64Array( + PolylinePipeline_default.generateArc(generateArcOptions) + ); + generateArcOptions.height = minimumHeights; + bottomPositions = new Float64Array( + PolylinePipeline_default.generateArc(generateArcOptions) + ); + } + return { + bottomPositions, + topPositions, + numCorners + }; +}; +var WallGeometryLibrary_default = WallGeometryLibrary; + +export { + WallGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-TI3TRKIC.js b/public/assets/cesium/Workers/chunk-TI3TRKIC.js new file mode 100644 index 0000000..c1b6478 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-TI3TRKIC.js @@ -0,0 +1,945 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidRhumbLine_default +} from "./chunk-JSQJDZI4.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + WebGLConstants_default +} from "./chunk-3HQMMUPU.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/WindingOrder.js +var WindingOrder = { + /** + * Vertices are in clockwise order. + * + * @type {number} + * @constant + */ + CLOCKWISE: WebGLConstants_default.CW, + /** + * Vertices are in counter-clockwise order. + * + * @type {number} + * @constant + */ + COUNTER_CLOCKWISE: WebGLConstants_default.CCW +}; +WindingOrder.validate = function(windingOrder) { + return windingOrder === WindingOrder.CLOCKWISE || windingOrder === WindingOrder.COUNTER_CLOCKWISE; +}; +var WindingOrder_default = Object.freeze(WindingOrder); + +// node_modules/earcut/src/earcut.js +function earcut(data, holeIndices, dim = 2) { + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[0] * dim : data.length; + let outerNode = linkedList(data, 0, outerLen, dim, true); + const triangles = []; + if (!outerNode || outerNode.next === outerNode.prev) return triangles; + let minX, minY, invSize; + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + if (data.length > 80 * dim) { + minX = Infinity; + minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (let i = dim; i < outerLen; i += dim) { + const x = data[i]; + const y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 32767 / invSize : 0; + } + earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0); + return triangles; +} +function linkedList(data, start, end, dim, clockwise) { + let last; + if (clockwise === signedArea(data, start, end, dim) > 0) { + for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last); + } else { + for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last); + } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + return last; +} +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + let p = start, again; + do { + again = false; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) break; + again = true; + } else { + p = p.next; + } + } while (again || p !== end); + return end; +} +function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) return; + if (!pass && invSize) indexCurve(ear, minX, minY, invSize); + let stop = ear; + while (ear.prev !== ear.next) { + const prev = ear.prev; + const next = ear.next; + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + triangles.push(prev.i, ear.i, next.i); + removeNode(ear); + ear = next.next; + stop = next.next; + continue; + } + ear = next; + if (ear === stop) { + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + } else if (pass === 1) { + ear = cureLocalIntersections(filterPoints(ear), triangles); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize); + } + break; + } + } +} +function isEar(ear) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; + let p = c.next; + while (p !== a) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + return true; +} +function isEarHashed(ear, minX, minY, invSize) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; + const minZ = zOrder(x0, y0, minX, minY, invSize), maxZ = zOrder(x1, y1, minX, minY, invSize); + let p = ear.prevZ, n = ear.nextZ; + while (p && p.z >= minZ && n && n.z <= maxZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + while (p && p.z >= minZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + while (n && n.z <= maxZ) { + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + return true; +} +function cureLocalIntersections(start, triangles) { + let p = start; + do { + const a = p.prev, b = p.next.next; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + triangles.push(a.i, p.i, b.i); + removeNode(p); + removeNode(p.next); + p = start = b; + } + p = p.next; + } while (p !== start); + return filterPoints(p); +} +function splitEarcut(start, triangles, dim, minX, minY, invSize) { + let a = start; + do { + let b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + let c = splitPolygon(a, b); + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + earcutLinked(a, triangles, dim, minX, minY, invSize, 0); + earcutLinked(c, triangles, dim, minX, minY, invSize, 0); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} +function eliminateHoles(data, holeIndices, outerNode, dim) { + const queue = []; + for (let i = 0, len = holeIndices.length; i < len; i++) { + const start = holeIndices[i] * dim; + const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + const list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); + } + queue.sort(compareX); + for (let i = 0; i < queue.length; i++) { + outerNode = eliminateHole(queue[i], outerNode); + } + return outerNode; +} +function compareX(a, b) { + return a.x - b.x; +} +function eliminateHole(hole, outerNode) { + const bridge = findHoleBridge(hole, outerNode); + if (!bridge) { + return outerNode; + } + const bridgeReverse = splitPolygon(bridge, hole); + filterPoints(bridgeReverse, bridgeReverse.next); + return filterPoints(bridge, bridge.next); +} +function findHoleBridge(hole, outerNode) { + let p = outerNode; + const hx = hole.x; + const hy = hole.y; + let qx = -Infinity; + let m; + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + m = p.x < p.next.x ? p : p.next; + if (x === hx) return m; + } + } + p = p.next; + } while (p !== outerNode); + if (!m) return null; + const stop = m; + const mx = m.x; + const my = m.y; + let tanMin = Infinity; + p = m; + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + const tan = Math.abs(hy - p.y) / (hx - p.x); + if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { + m = p; + tanMin = tan; + } + } + p = p.next; + } while (p !== stop); + return m; +} +function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; +} +function indexCurve(start, minX, minY, invSize) { + let p = start; + do { + if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + p.prevZ.nextZ = null; + p.prevZ = null; + sortLinked(p); +} +function sortLinked(list) { + let numMerges; + let inSize = 1; + do { + let p = list; + let e; + list = null; + let tail = null; + numMerges = 0; + while (p) { + numMerges++; + let q = p; + let pSize = 0; + for (let i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } + let qSize = inSize; + while (pSize > 0 || qSize > 0 && q) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + if (tail) tail.nextZ = e; + else list = e; + e.prevZ = tail; + tail = e; + } + p = q; + } + tail.nextZ = null; + inSize *= 2; + } while (numMerges > 1); + return list; +} +function zOrder(x, y, minX, minY, invSize) { + x = (x - minX) * invSize | 0; + y = (y - minY) * invSize | 0; + x = (x | x << 8) & 16711935; + x = (x | x << 4) & 252645135; + x = (x | x << 2) & 858993459; + x = (x | x << 1) & 1431655765; + y = (y | y << 8) & 16711935; + y = (y | y << 4) & 252645135; + y = (y | y << 2) & 858993459; + y = (y | y << 1) & 1431655765; + return x | y << 1; +} +function getLeftmost(start) { + let p = start, leftmost = start; + do { + if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p; + p = p.next; + } while (p !== start); + return leftmost; +} +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) >= (ax - px) * (cy - py) && (ax - px) * (by - py) >= (bx - px) * (ay - py) && (bx - px) * (cy - py) >= (cx - px) * (by - py); +} +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges + (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); +} +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} +function intersects(p1, q1, p2, q2) { + const o1 = sign(area(p1, q1, p2)); + const o2 = sign(area(p1, q1, q2)); + const o3 = sign(area(p2, q2, p1)); + const o4 = sign(area(p2, q2, q1)); + if (o1 !== o2 && o3 !== o4) return true; + if (o1 === 0 && onSegment(p1, p2, q1)) return true; + if (o2 === 0 && onSegment(p1, q2, q1)) return true; + if (o3 === 0 && onSegment(p2, p1, q2)) return true; + if (o4 === 0 && onSegment(p2, q1, q2)) return true; + return false; +} +function onSegment(p, q, r) { + return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); +} +function sign(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; +} +function intersectsPolygon(a, b) { + let p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); + return false; +} +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} +function middleInside(a, b) { + let p = a; + let inside = false; + const px = (a.x + b.x) / 2; + const py = (a.y + b.y) / 2; + do { + if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) + inside = !inside; + p = p.next; + } while (p !== a); + return inside; +} +function splitPolygon(a, b) { + const a2 = createNode(a.i, a.x, a.y), b2 = createNode(b.i, b.x, b.y), an = a.next, bp = b.prev; + a.next = b; + b.prev = a; + a2.next = an; + an.prev = a2; + b2.next = a2; + a2.prev = b2; + bp.next = b2; + b2.prev = bp; + return b2; +} +function insertNode(i, x, y, last) { + const p = createNode(i, x, y); + if (!last) { + p.prev = p; + p.next = p; + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; +} +function createNode(i, x, y) { + return { + i, + // vertex index in coordinates array + x, + y, + // vertex coordinates + prev: null, + // previous and next vertex nodes in a polygon ring + next: null, + z: 0, + // z-order curve value + prevZ: null, + // previous and next nodes in z-order + nextZ: null, + steiner: false + // indicates whether this is a steiner point + }; +} +function signedArea(data, start, end, dim) { + let sum = 0; + for (let i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} + +// packages/engine/Source/Core/PolygonPipeline.js +var scaleToGeodeticHeightN = new Cartesian3_default(); +var scaleToGeodeticHeightP = new Cartesian3_default(); +var PolygonPipeline = {}; +PolygonPipeline.computeArea2D = function(positions) { + Check_default.defined("positions", positions); + Check_default.typeOf.number.greaterThanOrEquals( + "positions.length", + positions.length, + 3 + ); + const length = positions.length; + let area2 = 0; + for (let i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) { + const v0 = positions[i0]; + const v1 = positions[i1]; + area2 += v0.x * v1.y - v1.x * v0.y; + } + return area2 * 0.5; +}; +PolygonPipeline.computeWindingOrder2D = function(positions) { + const area2 = PolygonPipeline.computeArea2D(positions); + return area2 > 0 ? WindingOrder_default.COUNTER_CLOCKWISE : WindingOrder_default.CLOCKWISE; +}; +PolygonPipeline.triangulate = function(positions, holes) { + Check_default.defined("positions", positions); + const flattenedPositions = Cartesian2_default.packArray(positions); + return earcut(flattenedPositions, holes, 2); +}; +var subdivisionV0Scratch = new Cartesian3_default(); +var subdivisionV1Scratch = new Cartesian3_default(); +var subdivisionV2Scratch = new Cartesian3_default(); +var subdivisionS0Scratch = new Cartesian3_default(); +var subdivisionS1Scratch = new Cartesian3_default(); +var subdivisionS2Scratch = new Cartesian3_default(); +var subdivisionMidScratch = new Cartesian3_default(); +var subdivisionT0Scratch = new Cartesian2_default(); +var subdivisionT1Scratch = new Cartesian2_default(); +var subdivisionT2Scratch = new Cartesian2_default(); +var subdivisionTexcoordMidScratch = new Cartesian2_default(); +PolygonPipeline.computeSubdivision = function(ellipsoid, positions, indices, texcoords, granularity) { + granularity = defaultValue_default(granularity, Math_default.RADIANS_PER_DEGREE); + const hasTexcoords = defined_default(texcoords); + Check_default.typeOf.object("ellipsoid", ellipsoid); + Check_default.defined("positions", positions); + Check_default.defined("indices", indices); + Check_default.typeOf.number.greaterThanOrEquals("indices.length", indices.length, 3); + Check_default.typeOf.number.equals("indices.length % 3", "0", indices.length % 3, 0); + Check_default.typeOf.number.greaterThan("granularity", granularity, 0); + const triangles = indices.slice(0); + let i; + const length = positions.length; + const subdividedPositions = new Array(length * 3); + const subdividedTexcoords = new Array(length * 2); + let q = 0; + let p = 0; + for (i = 0; i < length; i++) { + const item = positions[i]; + subdividedPositions[q++] = item.x; + subdividedPositions[q++] = item.y; + subdividedPositions[q++] = item.z; + if (hasTexcoords) { + const texcoordItem = texcoords[i]; + subdividedTexcoords[p++] = texcoordItem.x; + subdividedTexcoords[p++] = texcoordItem.y; + } + } + const subdividedIndices = []; + const edges = {}; + const radius = ellipsoid.maximumRadius; + const minDistance = Math_default.chordLength(granularity, radius); + const minDistanceSqrd = minDistance * minDistance; + while (triangles.length > 0) { + const i2 = triangles.pop(); + const i1 = triangles.pop(); + const i0 = triangles.pop(); + const v0 = Cartesian3_default.fromArray( + subdividedPositions, + i0 * 3, + subdivisionV0Scratch + ); + const v1 = Cartesian3_default.fromArray( + subdividedPositions, + i1 * 3, + subdivisionV1Scratch + ); + const v2 = Cartesian3_default.fromArray( + subdividedPositions, + i2 * 3, + subdivisionV2Scratch + ); + let t0, t1, t2; + if (hasTexcoords) { + t0 = Cartesian2_default.fromArray( + subdividedTexcoords, + i0 * 2, + subdivisionT0Scratch + ); + t1 = Cartesian2_default.fromArray( + subdividedTexcoords, + i1 * 2, + subdivisionT1Scratch + ); + t2 = Cartesian2_default.fromArray( + subdividedTexcoords, + i2 * 2, + subdivisionT2Scratch + ); + } + const s0 = Cartesian3_default.multiplyByScalar( + Cartesian3_default.normalize(v0, subdivisionS0Scratch), + radius, + subdivisionS0Scratch + ); + const s1 = Cartesian3_default.multiplyByScalar( + Cartesian3_default.normalize(v1, subdivisionS1Scratch), + radius, + subdivisionS1Scratch + ); + const s2 = Cartesian3_default.multiplyByScalar( + Cartesian3_default.normalize(v2, subdivisionS2Scratch), + radius, + subdivisionS2Scratch + ); + const g0 = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(s0, s1, subdivisionMidScratch) + ); + const g1 = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(s1, s2, subdivisionMidScratch) + ); + const g2 = Cartesian3_default.magnitudeSquared( + Cartesian3_default.subtract(s2, s0, subdivisionMidScratch) + ); + const max = Math.max(g0, g1, g2); + let edge; + let mid; + let midTexcoord; + if (max > minDistanceSqrd) { + if (g0 === max) { + edge = `${Math.min(i0, i1)} ${Math.max(i0, i1)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = Cartesian3_default.add(v0, v1, subdivisionMidScratch); + Cartesian3_default.multiplyByScalar(mid, 0.5, mid); + subdividedPositions.push(mid.x, mid.y, mid.z); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t0, t1, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i0, i, i2); + triangles.push(i, i1, i2); + } else if (g1 === max) { + edge = `${Math.min(i1, i2)} ${Math.max(i1, i2)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = Cartesian3_default.add(v1, v2, subdivisionMidScratch); + Cartesian3_default.multiplyByScalar(mid, 0.5, mid); + subdividedPositions.push(mid.x, mid.y, mid.z); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t1, t2, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i1, i, i0); + triangles.push(i, i2, i0); + } else if (g2 === max) { + edge = `${Math.min(i2, i0)} ${Math.max(i2, i0)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = Cartesian3_default.add(v2, v0, subdivisionMidScratch); + Cartesian3_default.multiplyByScalar(mid, 0.5, mid); + subdividedPositions.push(mid.x, mid.y, mid.z); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t2, t0, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i2, i, i1); + triangles.push(i, i0, i1); + } + } else { + subdividedIndices.push(i0); + subdividedIndices.push(i1); + subdividedIndices.push(i2); + } + } + const geometryOptions = { + attributes: { + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: subdividedPositions + }) + }, + indices: subdividedIndices, + primitiveType: PrimitiveType_default.TRIANGLES + }; + if (hasTexcoords) { + geometryOptions.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: subdividedTexcoords + }); + } + return new Geometry_default(geometryOptions); +}; +var subdivisionC0Scratch = new Cartographic_default(); +var subdivisionC1Scratch = new Cartographic_default(); +var subdivisionC2Scratch = new Cartographic_default(); +var subdivisionCartographicScratch = new Cartographic_default(); +PolygonPipeline.computeRhumbLineSubdivision = function(ellipsoid, positions, indices, texcoords, granularity) { + granularity = defaultValue_default(granularity, Math_default.RADIANS_PER_DEGREE); + const hasTexcoords = defined_default(texcoords); + Check_default.typeOf.object("ellipsoid", ellipsoid); + Check_default.defined("positions", positions); + Check_default.defined("indices", indices); + Check_default.typeOf.number.greaterThanOrEquals("indices.length", indices.length, 3); + Check_default.typeOf.number.equals("indices.length % 3", "0", indices.length % 3, 0); + Check_default.typeOf.number.greaterThan("granularity", granularity, 0); + const triangles = indices.slice(0); + let i; + const length = positions.length; + const subdividedPositions = new Array(length * 3); + const subdividedTexcoords = new Array(length * 2); + let q = 0; + let p = 0; + for (i = 0; i < length; i++) { + const item = positions[i]; + subdividedPositions[q++] = item.x; + subdividedPositions[q++] = item.y; + subdividedPositions[q++] = item.z; + if (hasTexcoords) { + const texcoordItem = texcoords[i]; + subdividedTexcoords[p++] = texcoordItem.x; + subdividedTexcoords[p++] = texcoordItem.y; + } + } + const subdividedIndices = []; + const edges = {}; + const radius = ellipsoid.maximumRadius; + const minDistance = Math_default.chordLength(granularity, radius); + const rhumb0 = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid); + const rhumb1 = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid); + const rhumb2 = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid); + while (triangles.length > 0) { + const i2 = triangles.pop(); + const i1 = triangles.pop(); + const i0 = triangles.pop(); + const v0 = Cartesian3_default.fromArray( + subdividedPositions, + i0 * 3, + subdivisionV0Scratch + ); + const v1 = Cartesian3_default.fromArray( + subdividedPositions, + i1 * 3, + subdivisionV1Scratch + ); + const v2 = Cartesian3_default.fromArray( + subdividedPositions, + i2 * 3, + subdivisionV2Scratch + ); + let t0, t1, t2; + if (hasTexcoords) { + t0 = Cartesian2_default.fromArray( + subdividedTexcoords, + i0 * 2, + subdivisionT0Scratch + ); + t1 = Cartesian2_default.fromArray( + subdividedTexcoords, + i1 * 2, + subdivisionT1Scratch + ); + t2 = Cartesian2_default.fromArray( + subdividedTexcoords, + i2 * 2, + subdivisionT2Scratch + ); + } + const c0 = ellipsoid.cartesianToCartographic(v0, subdivisionC0Scratch); + const c1 = ellipsoid.cartesianToCartographic(v1, subdivisionC1Scratch); + const c2 = ellipsoid.cartesianToCartographic(v2, subdivisionC2Scratch); + rhumb0.setEndPoints(c0, c1); + const g0 = rhumb0.surfaceDistance; + rhumb1.setEndPoints(c1, c2); + const g1 = rhumb1.surfaceDistance; + rhumb2.setEndPoints(c2, c0); + const g2 = rhumb2.surfaceDistance; + const max = Math.max(g0, g1, g2); + let edge; + let mid; + let midHeight; + let midCartesian3; + let midTexcoord; + if (max > minDistance) { + if (g0 === max) { + edge = `${Math.min(i0, i1)} ${Math.max(i0, i1)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = rhumb0.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ); + midHeight = (c0.height + c1.height) * 0.5; + midCartesian3 = Cartesian3_default.fromRadians( + mid.longitude, + mid.latitude, + midHeight, + ellipsoid, + subdivisionMidScratch + ); + subdividedPositions.push( + midCartesian3.x, + midCartesian3.y, + midCartesian3.z + ); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t0, t1, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i0, i, i2); + triangles.push(i, i1, i2); + } else if (g1 === max) { + edge = `${Math.min(i1, i2)} ${Math.max(i1, i2)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = rhumb1.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ); + midHeight = (c1.height + c2.height) * 0.5; + midCartesian3 = Cartesian3_default.fromRadians( + mid.longitude, + mid.latitude, + midHeight, + ellipsoid, + subdivisionMidScratch + ); + subdividedPositions.push( + midCartesian3.x, + midCartesian3.y, + midCartesian3.z + ); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t1, t2, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i1, i, i0); + triangles.push(i, i2, i0); + } else if (g2 === max) { + edge = `${Math.min(i2, i0)} ${Math.max(i2, i0)}`; + i = edges[edge]; + if (!defined_default(i)) { + mid = rhumb2.interpolateUsingFraction( + 0.5, + subdivisionCartographicScratch + ); + midHeight = (c2.height + c0.height) * 0.5; + midCartesian3 = Cartesian3_default.fromRadians( + mid.longitude, + mid.latitude, + midHeight, + ellipsoid, + subdivisionMidScratch + ); + subdividedPositions.push( + midCartesian3.x, + midCartesian3.y, + midCartesian3.z + ); + i = subdividedPositions.length / 3 - 1; + edges[edge] = i; + if (hasTexcoords) { + midTexcoord = Cartesian2_default.add(t2, t0, subdivisionTexcoordMidScratch); + Cartesian2_default.multiplyByScalar(midTexcoord, 0.5, midTexcoord); + subdividedTexcoords.push(midTexcoord.x, midTexcoord.y); + } + } + triangles.push(i2, i, i1); + triangles.push(i, i0, i1); + } + } else { + subdividedIndices.push(i0); + subdividedIndices.push(i1); + subdividedIndices.push(i2); + } + } + const geometryOptions = { + attributes: { + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: subdividedPositions + }) + }, + indices: subdividedIndices, + primitiveType: PrimitiveType_default.TRIANGLES + }; + if (hasTexcoords) { + geometryOptions.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: subdividedTexcoords + }); + } + return new Geometry_default(geometryOptions); +}; +PolygonPipeline.scaleToGeodeticHeight = function(positions, height, ellipsoid, scaleToSurface) { + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + let n = scaleToGeodeticHeightN; + let p = scaleToGeodeticHeightP; + height = defaultValue_default(height, 0); + scaleToSurface = defaultValue_default(scaleToSurface, true); + if (defined_default(positions)) { + const length = positions.length; + for (let i = 0; i < length; i += 3) { + Cartesian3_default.fromArray(positions, i, p); + if (scaleToSurface) { + p = ellipsoid.scaleToGeodeticSurface(p, p); + } + if (height !== 0) { + n = ellipsoid.geodeticSurfaceNormal(p, n); + Cartesian3_default.multiplyByScalar(n, height, n); + Cartesian3_default.add(p, n, p); + } + positions[i] = p.x; + positions[i + 1] = p.y; + positions[i + 2] = p.z; + } + } + return positions; +}; +var PolygonPipeline_default = PolygonPipeline; + +export { + WindingOrder_default, + PolygonPipeline_default +}; diff --git a/public/assets/cesium/Workers/chunk-TK5IIG2F.js b/public/assets/cesium/Workers/chunk-TK5IIG2F.js new file mode 100644 index 0000000..c6c22f3 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-TK5IIG2F.js @@ -0,0 +1,122 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + OrientedBoundingBox_default +} from "./chunk-2PTKXHJB.js"; +import { + Cartesian2_default, + Cartesian3_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; + +// packages/engine/Source/Core/CoplanarPolygonGeometryLibrary.js +var CoplanarPolygonGeometryLibrary = {}; +var scratchIntersectionPoint = new Cartesian3_default(); +var scratchXAxis = new Cartesian3_default(); +var scratchYAxis = new Cartesian3_default(); +var scratchZAxis = new Cartesian3_default(); +var obbScratch = new OrientedBoundingBox_default(); +CoplanarPolygonGeometryLibrary.validOutline = function(positions) { + Check_default.defined("positions", positions); + const orientedBoundingBox = OrientedBoundingBox_default.fromPoints( + positions, + obbScratch + ); + const halfAxes = orientedBoundingBox.halfAxes; + const xAxis = Matrix3_default.getColumn(halfAxes, 0, scratchXAxis); + const yAxis = Matrix3_default.getColumn(halfAxes, 1, scratchYAxis); + const zAxis = Matrix3_default.getColumn(halfAxes, 2, scratchZAxis); + const xMag = Cartesian3_default.magnitude(xAxis); + const yMag = Cartesian3_default.magnitude(yAxis); + const zMag = Cartesian3_default.magnitude(zAxis); + return !(xMag === 0 && (yMag === 0 || zMag === 0) || yMag === 0 && zMag === 0); +}; +CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments = function(positions, centerResult, planeAxis1Result, planeAxis2Result) { + Check_default.defined("positions", positions); + Check_default.defined("centerResult", centerResult); + Check_default.defined("planeAxis1Result", planeAxis1Result); + Check_default.defined("planeAxis2Result", planeAxis2Result); + const orientedBoundingBox = OrientedBoundingBox_default.fromPoints( + positions, + obbScratch + ); + const halfAxes = orientedBoundingBox.halfAxes; + const xAxis = Matrix3_default.getColumn(halfAxes, 0, scratchXAxis); + const yAxis = Matrix3_default.getColumn(halfAxes, 1, scratchYAxis); + const zAxis = Matrix3_default.getColumn(halfAxes, 2, scratchZAxis); + const xMag = Cartesian3_default.magnitude(xAxis); + const yMag = Cartesian3_default.magnitude(yAxis); + const zMag = Cartesian3_default.magnitude(zAxis); + const min = Math.min(xMag, yMag, zMag); + if (xMag === 0 && (yMag === 0 || zMag === 0) || yMag === 0 && zMag === 0) { + return false; + } + let planeAxis1; + let planeAxis2; + if (min === yMag || min === zMag) { + planeAxis1 = xAxis; + } + if (min === xMag) { + planeAxis1 = yAxis; + } else if (min === zMag) { + planeAxis2 = yAxis; + } + if (min === xMag || min === yMag) { + planeAxis2 = zAxis; + } + Cartesian3_default.normalize(planeAxis1, planeAxis1Result); + Cartesian3_default.normalize(planeAxis2, planeAxis2Result); + Cartesian3_default.clone(orientedBoundingBox.center, centerResult); + return true; +}; +function projectTo2D(position, center, axis1, axis2, result) { + const v = Cartesian3_default.subtract(position, center, scratchIntersectionPoint); + const x = Cartesian3_default.dot(axis1, v); + const y = Cartesian3_default.dot(axis2, v); + return Cartesian2_default.fromElements(x, y, result); +} +CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction = function(center, axis1, axis2) { + return function(positions) { + const positionResults = new Array(positions.length); + for (let i = 0; i < positions.length; i++) { + positionResults[i] = projectTo2D(positions[i], center, axis1, axis2); + } + return positionResults; + }; +}; +CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction = function(center, axis1, axis2) { + return function(position, result) { + return projectTo2D(position, center, axis1, axis2, result); + }; +}; +var CoplanarPolygonGeometryLibrary_default = CoplanarPolygonGeometryLibrary; + +export { + CoplanarPolygonGeometryLibrary_default +}; diff --git a/public/assets/cesium/Workers/chunk-U5HSOKPQ.js b/public/assets/cesium/Workers/chunk-U5HSOKPQ.js new file mode 100644 index 0000000..577ee61 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-U5HSOKPQ.js @@ -0,0 +1,39 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + + +// packages/engine/Source/Core/defaultValue.js +function defaultValue(a, b) { + if (a !== void 0 && a !== null) { + return a; + } + return b; +} +defaultValue.EMPTY_OBJECT = Object.freeze({}); +var defaultValue_default = defaultValue; + +export { + defaultValue_default +}; diff --git a/public/assets/cesium/Workers/chunk-WGDFYAGC.js b/public/assets/cesium/Workers/chunk-WGDFYAGC.js new file mode 100644 index 0000000..6e85ec3 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-WGDFYAGC.js @@ -0,0 +1,500 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + __commonJS, + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// node_modules/mersenne-twister/src/mersenne-twister.js +var require_mersenne_twister = __commonJS({ + "node_modules/mersenne-twister/src/mersenne-twister.js"(exports, module) { + var MersenneTwister2 = function(seed) { + if (seed == void 0) { + seed = (/* @__PURE__ */ new Date()).getTime(); + } + this.N = 624; + this.M = 397; + this.MATRIX_A = 2567483615; + this.UPPER_MASK = 2147483648; + this.LOWER_MASK = 2147483647; + this.mt = new Array(this.N); + this.mti = this.N + 1; + if (seed.constructor == Array) { + this.init_by_array(seed, seed.length); + } else { + this.init_seed(seed); + } + }; + MersenneTwister2.prototype.init_seed = function(s) { + this.mt[0] = s >>> 0; + for (this.mti = 1; this.mti < this.N; this.mti++) { + var s = this.mt[this.mti - 1] ^ this.mt[this.mti - 1] >>> 30; + this.mt[this.mti] = (((s & 4294901760) >>> 16) * 1812433253 << 16) + (s & 65535) * 1812433253 + this.mti; + this.mt[this.mti] >>>= 0; + } + }; + MersenneTwister2.prototype.init_by_array = function(init_key, key_length) { + var i, j, k; + this.init_seed(19650218); + i = 1; + j = 0; + k = this.N > key_length ? this.N : key_length; + for (; k; k--) { + var s = this.mt[i - 1] ^ this.mt[i - 1] >>> 30; + this.mt[i] = (this.mt[i] ^ (((s & 4294901760) >>> 16) * 1664525 << 16) + (s & 65535) * 1664525) + init_key[j] + j; + this.mt[i] >>>= 0; + i++; + j++; + if (i >= this.N) { + this.mt[0] = this.mt[this.N - 1]; + i = 1; + } + if (j >= key_length) j = 0; + } + for (k = this.N - 1; k; k--) { + var s = this.mt[i - 1] ^ this.mt[i - 1] >>> 30; + this.mt[i] = (this.mt[i] ^ (((s & 4294901760) >>> 16) * 1566083941 << 16) + (s & 65535) * 1566083941) - i; + this.mt[i] >>>= 0; + i++; + if (i >= this.N) { + this.mt[0] = this.mt[this.N - 1]; + i = 1; + } + } + this.mt[0] = 2147483648; + }; + MersenneTwister2.prototype.random_int = function() { + var y; + var mag01 = new Array(0, this.MATRIX_A); + if (this.mti >= this.N) { + var kk; + if (this.mti == this.N + 1) + this.init_seed(5489); + for (kk = 0; kk < this.N - this.M; kk++) { + y = this.mt[kk] & this.UPPER_MASK | this.mt[kk + 1] & this.LOWER_MASK; + this.mt[kk] = this.mt[kk + this.M] ^ y >>> 1 ^ mag01[y & 1]; + } + for (; kk < this.N - 1; kk++) { + y = this.mt[kk] & this.UPPER_MASK | this.mt[kk + 1] & this.LOWER_MASK; + this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ y >>> 1 ^ mag01[y & 1]; + } + y = this.mt[this.N - 1] & this.UPPER_MASK | this.mt[0] & this.LOWER_MASK; + this.mt[this.N - 1] = this.mt[this.M - 1] ^ y >>> 1 ^ mag01[y & 1]; + this.mti = 0; + } + y = this.mt[this.mti++]; + y ^= y >>> 11; + y ^= y << 7 & 2636928640; + y ^= y << 15 & 4022730752; + y ^= y >>> 18; + return y >>> 0; + }; + MersenneTwister2.prototype.random_int31 = function() { + return this.random_int() >>> 1; + }; + MersenneTwister2.prototype.random_incl = function() { + return this.random_int() * (1 / 4294967295); + }; + MersenneTwister2.prototype.random = function() { + return this.random_int() * (1 / 4294967296); + }; + MersenneTwister2.prototype.random_excl = function() { + return (this.random_int() + 0.5) * (1 / 4294967296); + }; + MersenneTwister2.prototype.random_long = function() { + var a = this.random_int() >>> 5, b = this.random_int() >>> 6; + return (a * 67108864 + b) * (1 / 9007199254740992); + }; + module.exports = MersenneTwister2; + } +}); + +// packages/engine/Source/Core/Math.js +var import_mersenne_twister = __toESM(require_mersenne_twister(), 1); +var CesiumMath = {}; +CesiumMath.EPSILON1 = 0.1; +CesiumMath.EPSILON2 = 0.01; +CesiumMath.EPSILON3 = 1e-3; +CesiumMath.EPSILON4 = 1e-4; +CesiumMath.EPSILON5 = 1e-5; +CesiumMath.EPSILON6 = 1e-6; +CesiumMath.EPSILON7 = 1e-7; +CesiumMath.EPSILON8 = 1e-8; +CesiumMath.EPSILON9 = 1e-9; +CesiumMath.EPSILON10 = 1e-10; +CesiumMath.EPSILON11 = 1e-11; +CesiumMath.EPSILON12 = 1e-12; +CesiumMath.EPSILON13 = 1e-13; +CesiumMath.EPSILON14 = 1e-14; +CesiumMath.EPSILON15 = 1e-15; +CesiumMath.EPSILON16 = 1e-16; +CesiumMath.EPSILON17 = 1e-17; +CesiumMath.EPSILON18 = 1e-18; +CesiumMath.EPSILON19 = 1e-19; +CesiumMath.EPSILON20 = 1e-20; +CesiumMath.EPSILON21 = 1e-21; +CesiumMath.GRAVITATIONALPARAMETER = 3986004418e5; +CesiumMath.SOLAR_RADIUS = 6955e5; +CesiumMath.LUNAR_RADIUS = 1737400; +CesiumMath.SIXTY_FOUR_KILOBYTES = 64 * 1024; +CesiumMath.FOUR_GIGABYTES = 4 * 1024 * 1024 * 1024; +CesiumMath.sign = defaultValue_default(Math.sign, function sign(value) { + value = +value; + if (value === 0 || value !== value) { + return value; + } + return value > 0 ? 1 : -1; +}); +CesiumMath.signNotZero = function(value) { + return value < 0 ? -1 : 1; +}; +CesiumMath.toSNorm = function(value, rangeMaximum) { + rangeMaximum = defaultValue_default(rangeMaximum, 255); + return Math.round( + (CesiumMath.clamp(value, -1, 1) * 0.5 + 0.5) * rangeMaximum + ); +}; +CesiumMath.fromSNorm = function(value, rangeMaximum) { + rangeMaximum = defaultValue_default(rangeMaximum, 255); + return CesiumMath.clamp(value, 0, rangeMaximum) / rangeMaximum * 2 - 1; +}; +CesiumMath.normalize = function(value, rangeMinimum, rangeMaximum) { + rangeMaximum = Math.max(rangeMaximum - rangeMinimum, 0); + return rangeMaximum === 0 ? 0 : CesiumMath.clamp((value - rangeMinimum) / rangeMaximum, 0, 1); +}; +CesiumMath.sinh = defaultValue_default(Math.sinh, function sinh(value) { + return (Math.exp(value) - Math.exp(-value)) / 2; +}); +CesiumMath.cosh = defaultValue_default(Math.cosh, function cosh(value) { + return (Math.exp(value) + Math.exp(-value)) / 2; +}); +CesiumMath.lerp = function(p, q, time) { + return (1 - time) * p + time * q; +}; +CesiumMath.PI = Math.PI; +CesiumMath.ONE_OVER_PI = 1 / Math.PI; +CesiumMath.PI_OVER_TWO = Math.PI / 2; +CesiumMath.PI_OVER_THREE = Math.PI / 3; +CesiumMath.PI_OVER_FOUR = Math.PI / 4; +CesiumMath.PI_OVER_SIX = Math.PI / 6; +CesiumMath.THREE_PI_OVER_TWO = 3 * Math.PI / 2; +CesiumMath.TWO_PI = 2 * Math.PI; +CesiumMath.ONE_OVER_TWO_PI = 1 / (2 * Math.PI); +CesiumMath.RADIANS_PER_DEGREE = Math.PI / 180; +CesiumMath.DEGREES_PER_RADIAN = 180 / Math.PI; +CesiumMath.RADIANS_PER_ARCSECOND = CesiumMath.RADIANS_PER_DEGREE / 3600; +CesiumMath.toRadians = function(degrees) { + if (!defined_default(degrees)) { + throw new DeveloperError_default("degrees is required."); + } + return degrees * CesiumMath.RADIANS_PER_DEGREE; +}; +CesiumMath.toDegrees = function(radians) { + if (!defined_default(radians)) { + throw new DeveloperError_default("radians is required."); + } + return radians * CesiumMath.DEGREES_PER_RADIAN; +}; +CesiumMath.convertLongitudeRange = function(angle) { + if (!defined_default(angle)) { + throw new DeveloperError_default("angle is required."); + } + const twoPi = CesiumMath.TWO_PI; + const simplified = angle - Math.floor(angle / twoPi) * twoPi; + if (simplified < -Math.PI) { + return simplified + twoPi; + } + if (simplified >= Math.PI) { + return simplified - twoPi; + } + return simplified; +}; +CesiumMath.clampToLatitudeRange = function(angle) { + if (!defined_default(angle)) { + throw new DeveloperError_default("angle is required."); + } + return CesiumMath.clamp( + angle, + -1 * CesiumMath.PI_OVER_TWO, + CesiumMath.PI_OVER_TWO + ); +}; +CesiumMath.negativePiToPi = function(angle) { + if (!defined_default(angle)) { + throw new DeveloperError_default("angle is required."); + } + if (angle >= -CesiumMath.PI && angle <= CesiumMath.PI) { + return angle; + } + return CesiumMath.zeroToTwoPi(angle + CesiumMath.PI) - CesiumMath.PI; +}; +CesiumMath.zeroToTwoPi = function(angle) { + if (!defined_default(angle)) { + throw new DeveloperError_default("angle is required."); + } + if (angle >= 0 && angle <= CesiumMath.TWO_PI) { + return angle; + } + const mod = CesiumMath.mod(angle, CesiumMath.TWO_PI); + if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(angle) > CesiumMath.EPSILON14) { + return CesiumMath.TWO_PI; + } + return mod; +}; +CesiumMath.mod = function(m, n) { + if (!defined_default(m)) { + throw new DeveloperError_default("m is required."); + } + if (!defined_default(n)) { + throw new DeveloperError_default("n is required."); + } + if (n === 0) { + throw new DeveloperError_default("divisor cannot be 0."); + } + if (CesiumMath.sign(m) === CesiumMath.sign(n) && Math.abs(m) < Math.abs(n)) { + return m; + } + return (m % n + n) % n; +}; +CesiumMath.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) { + if (!defined_default(left)) { + throw new DeveloperError_default("left is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("right is required."); + } + relativeEpsilon = defaultValue_default(relativeEpsilon, 0); + absoluteEpsilon = defaultValue_default(absoluteEpsilon, relativeEpsilon); + const absDiff = Math.abs(left - right); + return absDiff <= absoluteEpsilon || absDiff <= relativeEpsilon * Math.max(Math.abs(left), Math.abs(right)); +}; +CesiumMath.lessThan = function(left, right, absoluteEpsilon) { + if (!defined_default(left)) { + throw new DeveloperError_default("first is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("second is required."); + } + if (!defined_default(absoluteEpsilon)) { + throw new DeveloperError_default("absoluteEpsilon is required."); + } + return left - right < -absoluteEpsilon; +}; +CesiumMath.lessThanOrEquals = function(left, right, absoluteEpsilon) { + if (!defined_default(left)) { + throw new DeveloperError_default("first is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("second is required."); + } + if (!defined_default(absoluteEpsilon)) { + throw new DeveloperError_default("absoluteEpsilon is required."); + } + return left - right < absoluteEpsilon; +}; +CesiumMath.greaterThan = function(left, right, absoluteEpsilon) { + if (!defined_default(left)) { + throw new DeveloperError_default("first is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("second is required."); + } + if (!defined_default(absoluteEpsilon)) { + throw new DeveloperError_default("absoluteEpsilon is required."); + } + return left - right > absoluteEpsilon; +}; +CesiumMath.greaterThanOrEquals = function(left, right, absoluteEpsilon) { + if (!defined_default(left)) { + throw new DeveloperError_default("first is required."); + } + if (!defined_default(right)) { + throw new DeveloperError_default("second is required."); + } + if (!defined_default(absoluteEpsilon)) { + throw new DeveloperError_default("absoluteEpsilon is required."); + } + return left - right > -absoluteEpsilon; +}; +var factorials = [1]; +CesiumMath.factorial = function(n) { + if (typeof n !== "number" || n < 0) { + throw new DeveloperError_default( + "A number greater than or equal to 0 is required." + ); + } + const length = factorials.length; + if (n >= length) { + let sum = factorials[length - 1]; + for (let i = length; i <= n; i++) { + const next = sum * i; + factorials.push(next); + sum = next; + } + } + return factorials[n]; +}; +CesiumMath.incrementWrap = function(n, maximumValue, minimumValue) { + minimumValue = defaultValue_default(minimumValue, 0); + if (!defined_default(n)) { + throw new DeveloperError_default("n is required."); + } + if (maximumValue <= minimumValue) { + throw new DeveloperError_default("maximumValue must be greater than minimumValue."); + } + ++n; + if (n > maximumValue) { + n = minimumValue; + } + return n; +}; +CesiumMath.isPowerOfTwo = function(n) { + if (typeof n !== "number" || n < 0 || n > 4294967295) { + throw new DeveloperError_default("A number between 0 and (2^32)-1 is required."); + } + return n !== 0 && (n & n - 1) === 0; +}; +CesiumMath.nextPowerOfTwo = function(n) { + if (typeof n !== "number" || n < 0 || n > 2147483648) { + throw new DeveloperError_default("A number between 0 and 2^31 is required."); + } + --n; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + ++n; + return n; +}; +CesiumMath.previousPowerOfTwo = function(n) { + if (typeof n !== "number" || n < 0 || n > 4294967295) { + throw new DeveloperError_default("A number between 0 and (2^32)-1 is required."); + } + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n |= n >> 32; + n = (n >>> 0) - (n >>> 1); + return n; +}; +CesiumMath.clamp = function(value, min, max) { + Check_default.typeOf.number("value", value); + Check_default.typeOf.number("min", min); + Check_default.typeOf.number("max", max); + return value < min ? min : value > max ? max : value; +}; +var randomNumberGenerator = new import_mersenne_twister.default(); +CesiumMath.setRandomNumberSeed = function(seed) { + if (!defined_default(seed)) { + throw new DeveloperError_default("seed is required."); + } + randomNumberGenerator = new import_mersenne_twister.default(seed); +}; +CesiumMath.nextRandomNumber = function() { + return randomNumberGenerator.random(); +}; +CesiumMath.randomBetween = function(min, max) { + return CesiumMath.nextRandomNumber() * (max - min) + min; +}; +CesiumMath.acosClamped = function(value) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required."); + } + return Math.acos(CesiumMath.clamp(value, -1, 1)); +}; +CesiumMath.asinClamped = function(value) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required."); + } + return Math.asin(CesiumMath.clamp(value, -1, 1)); +}; +CesiumMath.chordLength = function(angle, radius) { + if (!defined_default(angle)) { + throw new DeveloperError_default("angle is required."); + } + if (!defined_default(radius)) { + throw new DeveloperError_default("radius is required."); + } + return 2 * radius * Math.sin(angle * 0.5); +}; +CesiumMath.logBase = function(number, base) { + if (!defined_default(number)) { + throw new DeveloperError_default("number is required."); + } + if (!defined_default(base)) { + throw new DeveloperError_default("base is required."); + } + return Math.log(number) / Math.log(base); +}; +CesiumMath.cbrt = defaultValue_default(Math.cbrt, function cbrt(number) { + const result = Math.pow(Math.abs(number), 1 / 3); + return number < 0 ? -result : result; +}); +CesiumMath.log2 = defaultValue_default(Math.log2, function log2(number) { + return Math.log(number) * Math.LOG2E; +}); +CesiumMath.fog = function(distanceToCamera, density) { + const scalar = distanceToCamera * density; + return 1 - Math.exp(-(scalar * scalar)); +}; +CesiumMath.fastApproximateAtan = function(x) { + Check_default.typeOf.number("x", x); + return x * (-0.1784 * Math.abs(x) - 0.0663 * x * x + 1.0301); +}; +CesiumMath.fastApproximateAtan2 = function(x, y) { + Check_default.typeOf.number("x", x); + Check_default.typeOf.number("y", y); + let opposite; + let t = Math.abs(x); + opposite = Math.abs(y); + const adjacent = Math.max(t, opposite); + opposite = Math.min(t, opposite); + const oppositeOverAdjacent = opposite / adjacent; + if (isNaN(oppositeOverAdjacent)) { + throw new DeveloperError_default("either x or y must be nonzero"); + } + t = CesiumMath.fastApproximateAtan(oppositeOverAdjacent); + t = Math.abs(y) > Math.abs(x) ? CesiumMath.PI_OVER_TWO - t : t; + t = x < 0 ? CesiumMath.PI - t : t; + t = y < 0 ? -t : t; + return t; +}; +var Math_default = CesiumMath; + +export { + Math_default +}; diff --git a/public/assets/cesium/Workers/chunk-X7IQYYHF.js b/public/assets/cesium/Workers/chunk-X7IQYYHF.js new file mode 100644 index 0000000..91c474f --- /dev/null +++ b/public/assets/cesium/Workers/chunk-X7IQYYHF.js @@ -0,0 +1,44 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; + +// packages/engine/Source/Core/GeometryAttributes.js +function GeometryAttributes(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this.position = options.position; + this.normal = options.normal; + this.st = options.st; + this.bitangent = options.bitangent; + this.tangent = options.tangent; + this.color = options.color; +} +var GeometryAttributes_default = GeometryAttributes; + +export { + GeometryAttributes_default +}; diff --git a/public/assets/cesium/Workers/chunk-XIUSRWL6.js b/public/assets/cesium/Workers/chunk-XIUSRWL6.js new file mode 100644 index 0000000..6980631 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-XIUSRWL6.js @@ -0,0 +1,262 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + WebGLConstants_default +} from "./chunk-3HQMMUPU.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/ComponentDatatype.js +var ComponentDatatype = { + /** + * 8-bit signed byte corresponding to gl.BYTE and the type + * of an element in Int8Array. + * + * @type {number} + * @constant + */ + BYTE: WebGLConstants_default.BYTE, + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + * + * @type {number} + * @constant + */ + UNSIGNED_BYTE: WebGLConstants_default.UNSIGNED_BYTE, + /** + * 16-bit signed short corresponding to SHORT and the type + * of an element in Int16Array. + * + * @type {number} + * @constant + */ + SHORT: WebGLConstants_default.SHORT, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + * + * @type {number} + * @constant + */ + UNSIGNED_SHORT: WebGLConstants_default.UNSIGNED_SHORT, + /** + * 32-bit signed int corresponding to INT and the type + * of an element in Int32Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + */ + INT: WebGLConstants_default.INT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + */ + UNSIGNED_INT: WebGLConstants_default.UNSIGNED_INT, + /** + * 32-bit floating-point corresponding to FLOAT and the type + * of an element in Float32Array. + * + * @type {number} + * @constant + */ + FLOAT: WebGLConstants_default.FLOAT, + /** + * 64-bit floating-point corresponding to gl.DOUBLE (in Desktop OpenGL; + * this is not supported in WebGL, and is emulated in Cesium via {@link GeometryPipeline.encodeAttribute}) + * and the type of an element in Float64Array. + * + * @memberOf ComponentDatatype + * + * @type {number} + * @constant + * @default 0x140A + */ + DOUBLE: WebGLConstants_default.DOUBLE +}; +ComponentDatatype.getSizeInBytes = function(componentDatatype) { + if (!defined_default(componentDatatype)) { + throw new DeveloperError_default("value is required."); + } + switch (componentDatatype) { + case ComponentDatatype.BYTE: + return Int8Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_BYTE: + return Uint8Array.BYTES_PER_ELEMENT; + case ComponentDatatype.SHORT: + return Int16Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_SHORT: + return Uint16Array.BYTES_PER_ELEMENT; + case ComponentDatatype.INT: + return Int32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.UNSIGNED_INT: + return Uint32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.FLOAT: + return Float32Array.BYTES_PER_ELEMENT; + case ComponentDatatype.DOUBLE: + return Float64Array.BYTES_PER_ELEMENT; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("componentDatatype is not a valid value."); + } +}; +ComponentDatatype.fromTypedArray = function(array) { + if (array instanceof Int8Array) { + return ComponentDatatype.BYTE; + } + if (array instanceof Uint8Array) { + return ComponentDatatype.UNSIGNED_BYTE; + } + if (array instanceof Int16Array) { + return ComponentDatatype.SHORT; + } + if (array instanceof Uint16Array) { + return ComponentDatatype.UNSIGNED_SHORT; + } + if (array instanceof Int32Array) { + return ComponentDatatype.INT; + } + if (array instanceof Uint32Array) { + return ComponentDatatype.UNSIGNED_INT; + } + if (array instanceof Float32Array) { + return ComponentDatatype.FLOAT; + } + if (array instanceof Float64Array) { + return ComponentDatatype.DOUBLE; + } + throw new DeveloperError_default( + "array must be an Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, or Float64Array." + ); +}; +ComponentDatatype.validate = function(componentDatatype) { + return defined_default(componentDatatype) && (componentDatatype === ComponentDatatype.BYTE || componentDatatype === ComponentDatatype.UNSIGNED_BYTE || componentDatatype === ComponentDatatype.SHORT || componentDatatype === ComponentDatatype.UNSIGNED_SHORT || componentDatatype === ComponentDatatype.INT || componentDatatype === ComponentDatatype.UNSIGNED_INT || componentDatatype === ComponentDatatype.FLOAT || componentDatatype === ComponentDatatype.DOUBLE); +}; +ComponentDatatype.createTypedArray = function(componentDatatype, valuesOrLength) { + if (!defined_default(componentDatatype)) { + throw new DeveloperError_default("componentDatatype is required."); + } + if (!defined_default(valuesOrLength)) { + throw new DeveloperError_default("valuesOrLength is required."); + } + switch (componentDatatype) { + case ComponentDatatype.BYTE: + return new Int8Array(valuesOrLength); + case ComponentDatatype.UNSIGNED_BYTE: + return new Uint8Array(valuesOrLength); + case ComponentDatatype.SHORT: + return new Int16Array(valuesOrLength); + case ComponentDatatype.UNSIGNED_SHORT: + return new Uint16Array(valuesOrLength); + case ComponentDatatype.INT: + return new Int32Array(valuesOrLength); + case ComponentDatatype.UNSIGNED_INT: + return new Uint32Array(valuesOrLength); + case ComponentDatatype.FLOAT: + return new Float32Array(valuesOrLength); + case ComponentDatatype.DOUBLE: + return new Float64Array(valuesOrLength); + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("componentDatatype is not a valid value."); + } +}; +ComponentDatatype.createArrayBufferView = function(componentDatatype, buffer, byteOffset, length) { + if (!defined_default(componentDatatype)) { + throw new DeveloperError_default("componentDatatype is required."); + } + if (!defined_default(buffer)) { + throw new DeveloperError_default("buffer is required."); + } + byteOffset = defaultValue_default(byteOffset, 0); + length = defaultValue_default( + length, + (buffer.byteLength - byteOffset) / ComponentDatatype.getSizeInBytes(componentDatatype) + ); + switch (componentDatatype) { + case ComponentDatatype.BYTE: + return new Int8Array(buffer, byteOffset, length); + case ComponentDatatype.UNSIGNED_BYTE: + return new Uint8Array(buffer, byteOffset, length); + case ComponentDatatype.SHORT: + return new Int16Array(buffer, byteOffset, length); + case ComponentDatatype.UNSIGNED_SHORT: + return new Uint16Array(buffer, byteOffset, length); + case ComponentDatatype.INT: + return new Int32Array(buffer, byteOffset, length); + case ComponentDatatype.UNSIGNED_INT: + return new Uint32Array(buffer, byteOffset, length); + case ComponentDatatype.FLOAT: + return new Float32Array(buffer, byteOffset, length); + case ComponentDatatype.DOUBLE: + return new Float64Array(buffer, byteOffset, length); + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("componentDatatype is not a valid value."); + } +}; +ComponentDatatype.fromName = function(name) { + switch (name) { + case "BYTE": + return ComponentDatatype.BYTE; + case "UNSIGNED_BYTE": + return ComponentDatatype.UNSIGNED_BYTE; + case "SHORT": + return ComponentDatatype.SHORT; + case "UNSIGNED_SHORT": + return ComponentDatatype.UNSIGNED_SHORT; + case "INT": + return ComponentDatatype.INT; + case "UNSIGNED_INT": + return ComponentDatatype.UNSIGNED_INT; + case "FLOAT": + return ComponentDatatype.FLOAT; + case "DOUBLE": + return ComponentDatatype.DOUBLE; + //>>includeStart('debug', pragmas.debug); + default: + throw new DeveloperError_default("name is not a valid value."); + } +}; +var ComponentDatatype_default = Object.freeze(ComponentDatatype); + +export { + ComponentDatatype_default +}; diff --git a/public/assets/cesium/Workers/chunk-XWOUPGUF.js b/public/assets/cesium/Workers/chunk-XWOUPGUF.js new file mode 100644 index 0000000..40fdad1 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-XWOUPGUF.js @@ -0,0 +1,55 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + + +// packages/engine/Source/Core/ArcType.js +var ArcType = { + /** + * Straight line that does not conform to the surface of the ellipsoid. + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * Follow geodesic path. + * + * @type {number} + * @constant + */ + GEODESIC: 1, + /** + * Follow rhumb or loxodrome path. + * + * @type {number} + * @constant + */ + RHUMB: 2 +}; +var ArcType_default = Object.freeze(ArcType); + +export { + ArcType_default +}; diff --git a/public/assets/cesium/Workers/chunk-YCDZX5LS.js b/public/assets/cesium/Workers/chunk-YCDZX5LS.js new file mode 100644 index 0000000..dedd37d --- /dev/null +++ b/public/assets/cesium/Workers/chunk-YCDZX5LS.js @@ -0,0 +1,75 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); +}); +var __glob = (map) => (path) => { + var fn = map[path]; + if (fn) return fn(); + throw new Error("Module not found in bundle: " + path); +}; +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// packages/engine/Source/Core/defined.js +function defined(value) { + return value !== void 0 && value !== null; +} +var defined_default = defined; + +export { + __require, + __glob, + __commonJS, + __toESM, + defined_default +}; diff --git a/public/assets/cesium/Workers/chunk-YK3QIKY7.js b/public/assets/cesium/Workers/chunk-YK3QIKY7.js new file mode 100644 index 0000000..662b26e --- /dev/null +++ b/public/assets/cesium/Workers/chunk-YK3QIKY7.js @@ -0,0 +1,287 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + AxisAlignedBoundingBox_default +} from "./chunk-NDDI2LWR.js"; +import { + IntersectionTests_default, + Ray_default +} from "./chunk-QQOZO7KO.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + Cartesian4_default, + Matrix4_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipsoidTangentPlane.js +var scratchCart4 = new Cartesian4_default(); +function EllipsoidTangentPlane(origin, ellipsoid) { + Check_default.defined("origin", origin); + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + origin = ellipsoid.scaleToGeodeticSurface(origin); + if (!defined_default(origin)) { + throw new DeveloperError_default( + "origin must not be at the center of the ellipsoid." + ); + } + const eastNorthUp = Transforms_default.eastNorthUpToFixedFrame(origin, ellipsoid); + this._ellipsoid = ellipsoid; + this._origin = origin; + this._xAxis = Cartesian3_default.fromCartesian4( + Matrix4_default.getColumn(eastNorthUp, 0, scratchCart4) + ); + this._yAxis = Cartesian3_default.fromCartesian4( + Matrix4_default.getColumn(eastNorthUp, 1, scratchCart4) + ); + const normal = Cartesian3_default.fromCartesian4( + Matrix4_default.getColumn(eastNorthUp, 2, scratchCart4) + ); + this._plane = Plane_default.fromPointNormal(origin, normal); +} +Object.defineProperties(EllipsoidTangentPlane.prototype, { + /** + * Gets the ellipsoid. + * @memberof EllipsoidTangentPlane.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the origin. + * @memberof EllipsoidTangentPlane.prototype + * @type {Cartesian3} + */ + origin: { + get: function() { + return this._origin; + } + }, + /** + * Gets the plane which is tangent to the ellipsoid. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Plane} + */ + plane: { + get: function() { + return this._plane; + } + }, + /** + * Gets the local X-axis (east) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + xAxis: { + get: function() { + return this._xAxis; + } + }, + /** + * Gets the local Y-axis (north) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + yAxis: { + get: function() { + return this._yAxis; + } + }, + /** + * Gets the local Z-axis (up) of the tangent plane. + * @memberof EllipsoidTangentPlane.prototype + * @readonly + * @type {Cartesian3} + */ + zAxis: { + get: function() { + return this._plane.normal; + } + } +}); +var tmp = new AxisAlignedBoundingBox_default(); +EllipsoidTangentPlane.fromPoints = function(cartesians, ellipsoid) { + Check_default.defined("cartesians", cartesians); + const box = AxisAlignedBoundingBox_default.fromPoints(cartesians, tmp); + return new EllipsoidTangentPlane(box.center, ellipsoid); +}; +var scratchProjectPointOntoPlaneRay = new Ray_default(); +var scratchProjectPointOntoPlaneCartesian3 = new Cartesian3_default(); +EllipsoidTangentPlane.prototype.projectPointOntoPlane = function(cartesian, result) { + Check_default.defined("cartesian", cartesian); + const ray = scratchProjectPointOntoPlaneRay; + ray.origin = cartesian; + Cartesian3_default.normalize(cartesian, ray.direction); + let intersectionPoint = IntersectionTests_default.rayPlane( + ray, + this._plane, + scratchProjectPointOntoPlaneCartesian3 + ); + if (!defined_default(intersectionPoint)) { + Cartesian3_default.negate(ray.direction, ray.direction); + intersectionPoint = IntersectionTests_default.rayPlane( + ray, + this._plane, + scratchProjectPointOntoPlaneCartesian3 + ); + } + if (defined_default(intersectionPoint)) { + const v = Cartesian3_default.subtract( + intersectionPoint, + this._origin, + intersectionPoint + ); + const x = Cartesian3_default.dot(this._xAxis, v); + const y = Cartesian3_default.dot(this._yAxis, v); + if (!defined_default(result)) { + return new Cartesian2_default(x, y); + } + result.x = x; + result.y = y; + return result; + } + return void 0; +}; +EllipsoidTangentPlane.prototype.projectPointsOntoPlane = function(cartesians, result) { + Check_default.defined("cartesians", cartesians); + if (!defined_default(result)) { + result = []; + } + let count = 0; + const length = cartesians.length; + for (let i = 0; i < length; i++) { + const p = this.projectPointOntoPlane(cartesians[i], result[count]); + if (defined_default(p)) { + result[count] = p; + count++; + } + } + result.length = count; + return result; +}; +EllipsoidTangentPlane.prototype.projectPointToNearestOnPlane = function(cartesian, result) { + Check_default.defined("cartesian", cartesian); + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + const ray = scratchProjectPointOntoPlaneRay; + ray.origin = cartesian; + Cartesian3_default.clone(this._plane.normal, ray.direction); + let intersectionPoint = IntersectionTests_default.rayPlane( + ray, + this._plane, + scratchProjectPointOntoPlaneCartesian3 + ); + if (!defined_default(intersectionPoint)) { + Cartesian3_default.negate(ray.direction, ray.direction); + intersectionPoint = IntersectionTests_default.rayPlane( + ray, + this._plane, + scratchProjectPointOntoPlaneCartesian3 + ); + } + const v = Cartesian3_default.subtract( + intersectionPoint, + this._origin, + intersectionPoint + ); + const x = Cartesian3_default.dot(this._xAxis, v); + const y = Cartesian3_default.dot(this._yAxis, v); + result.x = x; + result.y = y; + return result; +}; +EllipsoidTangentPlane.prototype.projectPointsToNearestOnPlane = function(cartesians, result) { + Check_default.defined("cartesians", cartesians); + if (!defined_default(result)) { + result = []; + } + const length = cartesians.length; + result.length = length; + for (let i = 0; i < length; i++) { + result[i] = this.projectPointToNearestOnPlane(cartesians[i], result[i]); + } + return result; +}; +var projectPointsOntoEllipsoidScratch = new Cartesian3_default(); +EllipsoidTangentPlane.prototype.projectPointOntoEllipsoid = function(cartesian, result) { + Check_default.defined("cartesian", cartesian); + if (!defined_default(result)) { + result = new Cartesian3_default(); + } + const ellipsoid = this._ellipsoid; + const origin = this._origin; + const xAxis = this._xAxis; + const yAxis = this._yAxis; + const tmp2 = projectPointsOntoEllipsoidScratch; + Cartesian3_default.multiplyByScalar(xAxis, cartesian.x, tmp2); + result = Cartesian3_default.add(origin, tmp2, result); + Cartesian3_default.multiplyByScalar(yAxis, cartesian.y, tmp2); + Cartesian3_default.add(result, tmp2, result); + ellipsoid.scaleToGeocentricSurface(result, result); + return result; +}; +EllipsoidTangentPlane.prototype.projectPointsOntoEllipsoid = function(cartesians, result) { + Check_default.defined("cartesians", cartesians); + const length = cartesians.length; + if (!defined_default(result)) { + result = new Array(length); + } else { + result.length = length; + } + for (let i = 0; i < length; ++i) { + result[i] = this.projectPointOntoEllipsoid(cartesians[i], result[i]); + } + return result; +}; +var EllipsoidTangentPlane_default = EllipsoidTangentPlane; + +export { + EllipsoidTangentPlane_default +}; diff --git a/public/assets/cesium/Workers/chunk-YSIJTJ7N.js b/public/assets/cesium/Workers/chunk-YSIJTJ7N.js new file mode 100644 index 0000000..111206f --- /dev/null +++ b/public/assets/cesium/Workers/chunk-YSIJTJ7N.js @@ -0,0 +1,59 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/GeometryInstance.js +function GeometryInstance(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + if (!defined_default(options.geometry)) { + throw new DeveloperError_default("options.geometry is required."); + } + this.geometry = options.geometry; + this.modelMatrix = Matrix4_default.clone( + defaultValue_default(options.modelMatrix, Matrix4_default.IDENTITY) + ); + this.id = options.id; + this.pickPrimitive = options.pickPrimitive; + this.attributes = defaultValue_default(options.attributes, {}); + this.westHemisphereGeometry = void 0; + this.eastHemisphereGeometry = void 0; +} +var GeometryInstance_default = GeometryInstance; + +export { + GeometryInstance_default +}; diff --git a/public/assets/cesium/Workers/chunk-Z2QP3CXW.js b/public/assets/cesium/Workers/chunk-Z2QP3CXW.js new file mode 100644 index 0000000..4b92d4c --- /dev/null +++ b/public/assets/cesium/Workers/chunk-Z2QP3CXW.js @@ -0,0 +1,101 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/formatError.js +function formatError(object) { + let result; + const name = object.name; + const message = object.message; + if (defined_default(name) && defined_default(message)) { + result = `${name}: ${message}`; + } else { + result = object.toString(); + } + const stack = object.stack; + if (defined_default(stack)) { + result += ` +${stack}`; + } + return result; +} +var formatError_default = formatError; + +// packages/engine/Source/Workers/createTaskProcessorWorker.js +function createTaskProcessorWorker(workerFunction) { + async function onMessageHandler({ data }) { + const transferableObjects = []; + const responseMessage = { + id: data.id, + result: void 0, + error: void 0 + }; + self.CESIUM_BASE_URL = data.baseUrl; + try { + const result = await workerFunction(data.parameters, transferableObjects); + responseMessage.result = result; + } catch (error) { + if (error instanceof Error) { + responseMessage.error = { + name: error.name, + message: error.message, + stack: error.stack + }; + } else { + responseMessage.error = error; + } + } + if (!data.canTransferArrayBuffer) { + transferableObjects.length = 0; + } + try { + postMessage(responseMessage, transferableObjects); + } catch (error) { + responseMessage.result = void 0; + responseMessage.error = `postMessage failed with error: ${formatError_default( + error + )} + with responseMessage: ${JSON.stringify(responseMessage)}`; + postMessage(responseMessage); + } + } + function onMessageErrorHandler(event) { + postMessage({ + id: event.data?.id, + error: `postMessage failed with error: ${JSON.stringify(event)}` + }); + } + self.onmessage = onMessageHandler; + self.onmessageerror = onMessageErrorHandler; + return self; +} +var createTaskProcessorWorker_default = createTaskProcessorWorker; + +export { + createTaskProcessorWorker_default +}; diff --git a/public/assets/cesium/Workers/chunk-ZVUUPJEM.js b/public/assets/cesium/Workers/chunk-ZVUUPJEM.js new file mode 100644 index 0000000..51ac879 --- /dev/null +++ b/public/assets/cesium/Workers/chunk-ZVUUPJEM.js @@ -0,0 +1,1075 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseGeometryLibrary_default +} from "./chunk-JISPSEF3.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default, + GeographicProjection_default +} from "./chunk-KHZNBFOH.js"; +import { + Quaternion_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/EllipseGeometry.js +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartesian3 = new Cartesian3_default(); +var scratchCartesian4 = new Cartesian3_default(); +var texCoordScratch = new Cartesian2_default(); +var textureMatrixScratch = new Matrix3_default(); +var tangentMatrixScratch = new Matrix3_default(); +var quaternionScratch = new Quaternion_default(); +var scratchNormal = new Cartesian3_default(); +var scratchTangent = new Cartesian3_default(); +var scratchBitangent = new Cartesian3_default(); +var scratchCartographic = new Cartographic_default(); +var projectedCenterScratch = new Cartesian3_default(); +var scratchMinTexCoord = new Cartesian2_default(); +var scratchMaxTexCoord = new Cartesian2_default(); +function computeTopBottomAttributes(positions, options, extrude) { + const vertexFormat = options.vertexFormat; + const center = options.center; + const semiMajorAxis = options.semiMajorAxis; + const semiMinorAxis = options.semiMinorAxis; + const ellipsoid = options.ellipsoid; + const stRotation = options.stRotation; + const size = extrude ? positions.length / 3 * 2 : positions.length / 3; + const shadowVolume = options.shadowVolume; + const textureCoordinates = vertexFormat.st ? new Float32Array(size * 2) : void 0; + const normals = vertexFormat.normal ? new Float32Array(size * 3) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(size * 3) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(size * 3) : void 0; + const extrudeNormals = shadowVolume ? new Float32Array(size * 3) : void 0; + let textureCoordIndex = 0; + let normal = scratchNormal; + let tangent = scratchTangent; + let bitangent = scratchBitangent; + const projection = new GeographicProjection_default(ellipsoid); + const projectedCenter = projection.project( + ellipsoid.cartesianToCartographic(center, scratchCartographic), + projectedCenterScratch + ); + const geodeticNormal = ellipsoid.scaleToGeodeticSurface( + center, + scratchCartesian1 + ); + ellipsoid.geodeticSurfaceNormal(geodeticNormal, geodeticNormal); + let textureMatrix = textureMatrixScratch; + let tangentMatrix = tangentMatrixScratch; + if (stRotation !== 0) { + let rotation = Quaternion_default.fromAxisAngle( + geodeticNormal, + stRotation, + quaternionScratch + ); + textureMatrix = Matrix3_default.fromQuaternion(rotation, textureMatrix); + rotation = Quaternion_default.fromAxisAngle( + geodeticNormal, + -stRotation, + quaternionScratch + ); + tangentMatrix = Matrix3_default.fromQuaternion(rotation, tangentMatrix); + } else { + textureMatrix = Matrix3_default.clone(Matrix3_default.IDENTITY, textureMatrix); + tangentMatrix = Matrix3_default.clone(Matrix3_default.IDENTITY, tangentMatrix); + } + const minTexCoord = Cartesian2_default.fromElements( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + scratchMinTexCoord + ); + const maxTexCoord = Cartesian2_default.fromElements( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + scratchMaxTexCoord + ); + let length = positions.length; + const bottomOffset = extrude ? length : 0; + const stOffset = bottomOffset / 3 * 2; + for (let i = 0; i < length; i += 3) { + const i1 = i + 1; + const i2 = i + 2; + const position = Cartesian3_default.fromArray(positions, i, scratchCartesian1); + if (vertexFormat.st) { + const rotatedPoint = Matrix3_default.multiplyByVector( + textureMatrix, + position, + scratchCartesian2 + ); + const projectedPoint = projection.project( + ellipsoid.cartesianToCartographic(rotatedPoint, scratchCartographic), + scratchCartesian3 + ); + Cartesian3_default.subtract(projectedPoint, projectedCenter, projectedPoint); + texCoordScratch.x = (projectedPoint.x + semiMajorAxis) / (2 * semiMajorAxis); + texCoordScratch.y = (projectedPoint.y + semiMinorAxis) / (2 * semiMinorAxis); + minTexCoord.x = Math.min(texCoordScratch.x, minTexCoord.x); + minTexCoord.y = Math.min(texCoordScratch.y, minTexCoord.y); + maxTexCoord.x = Math.max(texCoordScratch.x, maxTexCoord.x); + maxTexCoord.y = Math.max(texCoordScratch.y, maxTexCoord.y); + if (extrude) { + textureCoordinates[textureCoordIndex + stOffset] = texCoordScratch.x; + textureCoordinates[textureCoordIndex + 1 + stOffset] = texCoordScratch.y; + } + textureCoordinates[textureCoordIndex++] = texCoordScratch.x; + textureCoordinates[textureCoordIndex++] = texCoordScratch.y; + } + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (shadowVolume) { + extrudeNormals[i + bottomOffset] = -normal.x; + extrudeNormals[i1 + bottomOffset] = -normal.y; + extrudeNormals[i2 + bottomOffset] = -normal.z; + } + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + if (vertexFormat.tangent || vertexFormat.bitangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(Cartesian3_default.UNIT_Z, normal, tangent), + tangent + ); + Matrix3_default.multiplyByVector(tangentMatrix, tangent, tangent); + } + if (vertexFormat.normal) { + normals[i] = normal.x; + normals[i1] = normal.y; + normals[i2] = normal.z; + if (extrude) { + normals[i + bottomOffset] = -normal.x; + normals[i1 + bottomOffset] = -normal.y; + normals[i2 + bottomOffset] = -normal.z; + } + } + if (vertexFormat.tangent) { + tangents[i] = tangent.x; + tangents[i1] = tangent.y; + tangents[i2] = tangent.z; + if (extrude) { + tangents[i + bottomOffset] = -tangent.x; + tangents[i1 + bottomOffset] = -tangent.y; + tangents[i2 + bottomOffset] = -tangent.z; + } + } + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + bitangents[i] = bitangent.x; + bitangents[i1] = bitangent.y; + bitangents[i2] = bitangent.z; + if (extrude) { + bitangents[i + bottomOffset] = bitangent.x; + bitangents[i1 + bottomOffset] = bitangent.y; + bitangents[i2 + bottomOffset] = bitangent.z; + } + } + } + } + } + if (vertexFormat.st) { + length = textureCoordinates.length; + for (let k = 0; k < length; k += 2) { + textureCoordinates[k] = (textureCoordinates[k] - minTexCoord.x) / (maxTexCoord.x - minTexCoord.x); + textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minTexCoord.y) / (maxTexCoord.y - minTexCoord.y); + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + const finalPositions = EllipseGeometryLibrary_default.raisePositionsToHeight( + positions, + options, + extrude + ); + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: finalPositions + }); + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: extrudeNormals + }); + } + if (extrude && defined_default(options.offsetAttribute)) { + let offsetAttribute = new Uint8Array(size); + if (options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else { + const offsetValue = options.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + }); + } + return attributes; +} +function topIndices(numPts) { + const indices = new Array(12 * (numPts * (numPts + 1)) - 6); + let indicesIndex = 0; + let prevIndex; + let numInterior; + let positionIndex; + let i; + let j; + prevIndex = 0; + positionIndex = 1; + for (i = 0; i < 3; i++) { + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + for (i = 2; i < numPts + 1; ++i) { + positionIndex = i * (i + 1) - 1; + prevIndex = (i - 1) * i - 1; + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + numInterior = 2 * i; + for (j = 0; j < numInterior - 1; ++j) { + indices[indicesIndex++] = positionIndex; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + numInterior = numPts * 2; + ++positionIndex; + ++prevIndex; + for (i = 0; i < numInterior - 1; ++i) { + indices[indicesIndex++] = positionIndex; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + indices[indicesIndex++] = positionIndex; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + ++prevIndex; + for (i = numPts - 1; i > 1; --i) { + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + numInterior = 2 * i; + for (j = 0; j < numInterior - 1; ++j) { + indices[indicesIndex++] = positionIndex; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = positionIndex++; + } + for (i = 0; i < 3; i++) { + indices[indicesIndex++] = prevIndex++; + indices[indicesIndex++] = prevIndex; + indices[indicesIndex++] = positionIndex; + } + return indices; +} +var boundingSphereCenter = new Cartesian3_default(); +function computeEllipse(options) { + const center = options.center; + boundingSphereCenter = Cartesian3_default.multiplyByScalar( + options.ellipsoid.geodeticSurfaceNormal(center, boundingSphereCenter), + options.height, + boundingSphereCenter + ); + boundingSphereCenter = Cartesian3_default.add( + center, + boundingSphereCenter, + boundingSphereCenter + ); + const boundingSphere = new BoundingSphere_default( + boundingSphereCenter, + options.semiMajorAxis + ); + const cep = EllipseGeometryLibrary_default.computeEllipsePositions( + options, + true, + false + ); + const positions = cep.positions; + const numPts = cep.numPts; + const attributes = computeTopBottomAttributes(positions, options, false); + let indices = topIndices(numPts); + indices = IndexDatatype_default.createTypedArray(positions.length / 3, indices); + return { + boundingSphere, + attributes, + indices + }; +} +function computeWallAttributes(positions, options) { + const vertexFormat = options.vertexFormat; + const center = options.center; + const semiMajorAxis = options.semiMajorAxis; + const semiMinorAxis = options.semiMinorAxis; + const ellipsoid = options.ellipsoid; + const height = options.height; + const extrudedHeight = options.extrudedHeight; + const stRotation = options.stRotation; + const size = positions.length / 3 * 2; + const finalPositions = new Float64Array(size * 3); + const textureCoordinates = vertexFormat.st ? new Float32Array(size * 2) : void 0; + const normals = vertexFormat.normal ? new Float32Array(size * 3) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(size * 3) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(size * 3) : void 0; + const shadowVolume = options.shadowVolume; + const extrudeNormals = shadowVolume ? new Float32Array(size * 3) : void 0; + let textureCoordIndex = 0; + let normal = scratchNormal; + let tangent = scratchTangent; + let bitangent = scratchBitangent; + const projection = new GeographicProjection_default(ellipsoid); + const projectedCenter = projection.project( + ellipsoid.cartesianToCartographic(center, scratchCartographic), + projectedCenterScratch + ); + const geodeticNormal = ellipsoid.scaleToGeodeticSurface( + center, + scratchCartesian1 + ); + ellipsoid.geodeticSurfaceNormal(geodeticNormal, geodeticNormal); + const rotation = Quaternion_default.fromAxisAngle( + geodeticNormal, + stRotation, + quaternionScratch + ); + const textureMatrix = Matrix3_default.fromQuaternion(rotation, textureMatrixScratch); + const minTexCoord = Cartesian2_default.fromElements( + Number.POSITIVE_INFINITY, + Number.POSITIVE_INFINITY, + scratchMinTexCoord + ); + const maxTexCoord = Cartesian2_default.fromElements( + Number.NEGATIVE_INFINITY, + Number.NEGATIVE_INFINITY, + scratchMaxTexCoord + ); + let length = positions.length; + const stOffset = length / 3 * 2; + for (let i = 0; i < length; i += 3) { + const i1 = i + 1; + const i2 = i + 2; + let position = Cartesian3_default.fromArray(positions, i, scratchCartesian1); + let extrudedPosition; + if (vertexFormat.st) { + const rotatedPoint = Matrix3_default.multiplyByVector( + textureMatrix, + position, + scratchCartesian2 + ); + const projectedPoint = projection.project( + ellipsoid.cartesianToCartographic(rotatedPoint, scratchCartographic), + scratchCartesian3 + ); + Cartesian3_default.subtract(projectedPoint, projectedCenter, projectedPoint); + texCoordScratch.x = (projectedPoint.x + semiMajorAxis) / (2 * semiMajorAxis); + texCoordScratch.y = (projectedPoint.y + semiMinorAxis) / (2 * semiMinorAxis); + minTexCoord.x = Math.min(texCoordScratch.x, minTexCoord.x); + minTexCoord.y = Math.min(texCoordScratch.y, minTexCoord.y); + maxTexCoord.x = Math.max(texCoordScratch.x, maxTexCoord.x); + maxTexCoord.y = Math.max(texCoordScratch.y, maxTexCoord.y); + textureCoordinates[textureCoordIndex + stOffset] = texCoordScratch.x; + textureCoordinates[textureCoordIndex + 1 + stOffset] = texCoordScratch.y; + textureCoordinates[textureCoordIndex++] = texCoordScratch.x; + textureCoordinates[textureCoordIndex++] = texCoordScratch.y; + } + position = ellipsoid.scaleToGeodeticSurface(position, position); + extrudedPosition = Cartesian3_default.clone(position, scratchCartesian2); + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (shadowVolume) { + extrudeNormals[i + length] = -normal.x; + extrudeNormals[i1 + length] = -normal.y; + extrudeNormals[i2 + length] = -normal.z; + } + let scaledNormal = Cartesian3_default.multiplyByScalar( + normal, + height, + scratchCartesian4 + ); + position = Cartesian3_default.add(position, scaledNormal, position); + scaledNormal = Cartesian3_default.multiplyByScalar( + normal, + extrudedHeight, + scaledNormal + ); + extrudedPosition = Cartesian3_default.add( + extrudedPosition, + scaledNormal, + extrudedPosition + ); + if (vertexFormat.position) { + finalPositions[i + length] = extrudedPosition.x; + finalPositions[i1 + length] = extrudedPosition.y; + finalPositions[i2 + length] = extrudedPosition.z; + finalPositions[i] = position.x; + finalPositions[i1] = position.y; + finalPositions[i2] = position.z; + } + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + bitangent = Cartesian3_default.clone(normal, bitangent); + const next = Cartesian3_default.fromArray( + positions, + (i + 3) % length, + scratchCartesian4 + ); + Cartesian3_default.subtract(next, position, next); + const bottom = Cartesian3_default.subtract( + extrudedPosition, + position, + scratchCartesian3 + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.cross(bottom, next, normal), + normal + ); + if (vertexFormat.normal) { + normals[i] = normal.x; + normals[i1] = normal.y; + normals[i2] = normal.z; + normals[i + length] = normal.x; + normals[i1 + length] = normal.y; + normals[i2 + length] = normal.z; + } + if (vertexFormat.tangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(bitangent, normal, tangent), + tangent + ); + tangents[i] = tangent.x; + tangents[i1] = tangent.y; + tangents[i2] = tangent.z; + tangents[i + length] = tangent.x; + tangents[i + 1 + length] = tangent.y; + tangents[i + 2 + length] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangents[i] = bitangent.x; + bitangents[i1] = bitangent.y; + bitangents[i2] = bitangent.z; + bitangents[i + length] = bitangent.x; + bitangents[i1 + length] = bitangent.y; + bitangents[i2 + length] = bitangent.z; + } + } + } + if (vertexFormat.st) { + length = textureCoordinates.length; + for (let k = 0; k < length; k += 2) { + textureCoordinates[k] = (textureCoordinates[k] - minTexCoord.x) / (maxTexCoord.x - minTexCoord.x); + textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minTexCoord.y) / (maxTexCoord.y - minTexCoord.y); + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: finalPositions + }); + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: extrudeNormals + }); + } + if (defined_default(options.offsetAttribute)) { + let offsetAttribute = new Uint8Array(size); + if (options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else { + const offsetValue = options.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + }); + } + return attributes; +} +function computeWallIndices(positions) { + const length = positions.length / 3; + const indices = IndexDatatype_default.createTypedArray(length, length * 6); + let index = 0; + for (let i = 0; i < length; i++) { + const UL = i; + const LL = i + length; + const UR = (UL + 1) % length; + const LR = UR + length; + indices[index++] = UL; + indices[index++] = LL; + indices[index++] = UR; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + } + return indices; +} +var topBoundingSphere = new BoundingSphere_default(); +var bottomBoundingSphere = new BoundingSphere_default(); +function computeExtrudedEllipse(options) { + const center = options.center; + const ellipsoid = options.ellipsoid; + const semiMajorAxis = options.semiMajorAxis; + let scaledNormal = Cartesian3_default.multiplyByScalar( + ellipsoid.geodeticSurfaceNormal(center, scratchCartesian1), + options.height, + scratchCartesian1 + ); + topBoundingSphere.center = Cartesian3_default.add( + center, + scaledNormal, + topBoundingSphere.center + ); + topBoundingSphere.radius = semiMajorAxis; + scaledNormal = Cartesian3_default.multiplyByScalar( + ellipsoid.geodeticSurfaceNormal(center, scaledNormal), + options.extrudedHeight, + scaledNormal + ); + bottomBoundingSphere.center = Cartesian3_default.add( + center, + scaledNormal, + bottomBoundingSphere.center + ); + bottomBoundingSphere.radius = semiMajorAxis; + const cep = EllipseGeometryLibrary_default.computeEllipsePositions( + options, + true, + true + ); + const positions = cep.positions; + const numPts = cep.numPts; + const outerPositions = cep.outerPositions; + const boundingSphere = BoundingSphere_default.union( + topBoundingSphere, + bottomBoundingSphere + ); + const topBottomAttributes = computeTopBottomAttributes( + positions, + options, + true + ); + let indices = topIndices(numPts); + const length = indices.length; + indices.length = length * 2; + const posLength = positions.length / 3; + for (let i = 0; i < length; i += 3) { + indices[i + length] = indices[i + 2] + posLength; + indices[i + 1 + length] = indices[i + 1] + posLength; + indices[i + 2 + length] = indices[i] + posLength; + } + const topBottomIndices = IndexDatatype_default.createTypedArray( + posLength * 2 / 3, + indices + ); + const topBottomGeo = new Geometry_default({ + attributes: topBottomAttributes, + indices: topBottomIndices, + primitiveType: PrimitiveType_default.TRIANGLES + }); + const wallAttributes = computeWallAttributes(outerPositions, options); + indices = computeWallIndices(outerPositions); + const wallIndices = IndexDatatype_default.createTypedArray( + outerPositions.length * 2 / 3, + indices + ); + const wallGeo = new Geometry_default({ + attributes: wallAttributes, + indices: wallIndices, + primitiveType: PrimitiveType_default.TRIANGLES + }); + const geo = GeometryPipeline_default.combineInstances([ + new GeometryInstance_default({ + geometry: topBottomGeo + }), + new GeometryInstance_default({ + geometry: wallGeo + }) + ]); + return { + boundingSphere, + attributes: geo[0].attributes, + indices: geo[0].indices + }; +} +function computeRectangle(center, semiMajorAxis, semiMinorAxis, rotation, granularity, ellipsoid, result) { + const cep = EllipseGeometryLibrary_default.computeEllipsePositions( + { + center, + semiMajorAxis, + semiMinorAxis, + rotation, + granularity + }, + false, + true + ); + const positionsFlat = cep.outerPositions; + const positionsCount = positionsFlat.length / 3; + const positions = new Array(positionsCount); + for (let i = 0; i < positionsCount; ++i) { + positions[i] = Cartesian3_default.fromArray(positionsFlat, i * 3); + } + const rectangle = Rectangle_default.fromCartesianArray(positions, ellipsoid, result); + if (rectangle.width > Math_default.PI) { + rectangle.north = rectangle.north > 0 ? Math_default.PI_OVER_TWO - Math_default.EPSILON7 : rectangle.north; + rectangle.south = rectangle.south < 0 ? Math_default.EPSILON7 - Math_default.PI_OVER_TWO : rectangle.south; + rectangle.east = Math_default.PI; + rectangle.west = -Math_default.PI; + } + return rectangle; +} +function EllipseGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const center = options.center; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const semiMajorAxis = options.semiMajorAxis; + const semiMinorAxis = options.semiMinorAxis; + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + Check_default.defined("options.center", center); + Check_default.typeOf.number("options.semiMajorAxis", semiMajorAxis); + Check_default.typeOf.number("options.semiMinorAxis", semiMinorAxis); + if (semiMajorAxis < semiMinorAxis) { + throw new DeveloperError_default( + "semiMajorAxis must be greater than or equal to the semiMinorAxis." + ); + } + if (granularity <= 0) { + throw new DeveloperError_default("granularity must be greater than zero."); + } + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._center = Cartesian3_default.clone(center); + this._semiMajorAxis = semiMajorAxis; + this._semiMinorAxis = semiMinorAxis; + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._rotation = defaultValue_default(options.rotation, 0); + this._stRotation = defaultValue_default(options.stRotation, 0); + this._height = Math.max(extrudedHeight, height); + this._granularity = granularity; + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._extrudedHeight = Math.min(extrudedHeight, height); + this._shadowVolume = defaultValue_default(options.shadowVolume, false); + this._workerName = "createEllipseGeometry"; + this._offsetAttribute = options.offsetAttribute; + this._rectangle = void 0; + this._textureCoordinateRotationPoints = void 0; +} +EllipseGeometry.packedLength = Cartesian3_default.packedLength + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 9; +EllipseGeometry.pack = function(value, array, startingIndex) { + Check_default.defined("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._center, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._semiMajorAxis; + array[startingIndex++] = value._semiMinorAxis; + array[startingIndex++] = value._rotation; + array[startingIndex++] = value._stRotation; + array[startingIndex++] = value._height; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._shadowVolume ? 1 : 0; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchCenter = new Cartesian3_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + center: scratchCenter, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + rotation: void 0, + stRotation: void 0, + height: void 0, + granularity: void 0, + extrudedHeight: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +EllipseGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const center = Cartesian3_default.unpack(array, startingIndex, scratchCenter); + startingIndex += Cartesian3_default.packedLength; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const semiMajorAxis = array[startingIndex++]; + const semiMinorAxis = array[startingIndex++]; + const rotation = array[startingIndex++]; + const stRotation = array[startingIndex++]; + const height = array[startingIndex++]; + const granularity = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const shadowVolume = array[startingIndex++] === 1; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.height = height; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.granularity = granularity; + scratchOptions.stRotation = stRotation; + scratchOptions.rotation = rotation; + scratchOptions.semiMajorAxis = semiMajorAxis; + scratchOptions.semiMinorAxis = semiMinorAxis; + scratchOptions.shadowVolume = shadowVolume; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new EllipseGeometry(scratchOptions); + } + result._center = Cartesian3_default.clone(center, result._center); + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._semiMajorAxis = semiMajorAxis; + result._semiMinorAxis = semiMinorAxis; + result._rotation = rotation; + result._stRotation = stRotation; + result._height = height; + result._granularity = granularity; + result._extrudedHeight = extrudedHeight; + result._shadowVolume = shadowVolume; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +EllipseGeometry.computeRectangle = function(options, result) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const center = options.center; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const semiMajorAxis = options.semiMajorAxis; + const semiMinorAxis = options.semiMinorAxis; + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const rotation = defaultValue_default(options.rotation, 0); + Check_default.defined("options.center", center); + Check_default.typeOf.number("options.semiMajorAxis", semiMajorAxis); + Check_default.typeOf.number("options.semiMinorAxis", semiMinorAxis); + if (semiMajorAxis < semiMinorAxis) { + throw new DeveloperError_default( + "semiMajorAxis must be greater than or equal to the semiMinorAxis." + ); + } + if (granularity <= 0) { + throw new DeveloperError_default("granularity must be greater than zero."); + } + return computeRectangle( + center, + semiMajorAxis, + semiMinorAxis, + rotation, + granularity, + ellipsoid, + result + ); +}; +EllipseGeometry.createGeometry = function(ellipseGeometry) { + if (ellipseGeometry._semiMajorAxis <= 0 || ellipseGeometry._semiMinorAxis <= 0) { + return; + } + const height = ellipseGeometry._height; + const extrudedHeight = ellipseGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + height, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + ellipseGeometry._center = ellipseGeometry._ellipsoid.scaleToGeodeticSurface( + ellipseGeometry._center, + ellipseGeometry._center + ); + const options = { + center: ellipseGeometry._center, + semiMajorAxis: ellipseGeometry._semiMajorAxis, + semiMinorAxis: ellipseGeometry._semiMinorAxis, + ellipsoid: ellipseGeometry._ellipsoid, + rotation: ellipseGeometry._rotation, + height, + granularity: ellipseGeometry._granularity, + vertexFormat: ellipseGeometry._vertexFormat, + stRotation: ellipseGeometry._stRotation + }; + let geometry; + if (extrude) { + options.extrudedHeight = extrudedHeight; + options.shadowVolume = ellipseGeometry._shadowVolume; + options.offsetAttribute = ellipseGeometry._offsetAttribute; + geometry = computeExtrudedEllipse(options); + } else { + geometry = computeEllipse(options); + if (defined_default(ellipseGeometry._offsetAttribute)) { + const length = geometry.attributes.position.values.length; + const offsetValue = ellipseGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + } + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: geometry.boundingSphere, + offsetAttribute: ellipseGeometry._offsetAttribute + }); +}; +EllipseGeometry.createShadowVolume = function(ellipseGeometry, minHeightFunc, maxHeightFunc) { + const granularity = ellipseGeometry._granularity; + const ellipsoid = ellipseGeometry._ellipsoid; + const minHeight = minHeightFunc(granularity, ellipsoid); + const maxHeight = maxHeightFunc(granularity, ellipsoid); + return new EllipseGeometry({ + center: ellipseGeometry._center, + semiMajorAxis: ellipseGeometry._semiMajorAxis, + semiMinorAxis: ellipseGeometry._semiMinorAxis, + ellipsoid, + rotation: ellipseGeometry._rotation, + stRotation: ellipseGeometry._stRotation, + granularity, + extrudedHeight: minHeight, + height: maxHeight, + vertexFormat: VertexFormat_default.POSITION_ONLY, + shadowVolume: true + }); +}; +function textureCoordinateRotationPoints(ellipseGeometry) { + const stRotation = -ellipseGeometry._stRotation; + if (stRotation === 0) { + return [0, 0, 0, 1, 1, 0]; + } + const cep = EllipseGeometryLibrary_default.computeEllipsePositions( + { + center: ellipseGeometry._center, + semiMajorAxis: ellipseGeometry._semiMajorAxis, + semiMinorAxis: ellipseGeometry._semiMinorAxis, + rotation: ellipseGeometry._rotation, + granularity: ellipseGeometry._granularity + }, + false, + true + ); + const positionsFlat = cep.outerPositions; + const positionsCount = positionsFlat.length / 3; + const positions = new Array(positionsCount); + for (let i = 0; i < positionsCount; ++i) { + positions[i] = Cartesian3_default.fromArray(positionsFlat, i * 3); + } + const ellipsoid = ellipseGeometry._ellipsoid; + const boundingRectangle = ellipseGeometry.rectangle; + return Geometry_default._textureCoordinateRotationPoints( + positions, + stRotation, + ellipsoid, + boundingRectangle + ); +} +Object.defineProperties(EllipseGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + if (!defined_default(this._rectangle)) { + this._rectangle = computeRectangle( + this._center, + this._semiMajorAxis, + this._semiMinorAxis, + this._rotation, + this._granularity, + this._ellipsoid + ); + } + return this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering EllipseGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + if (!defined_default(this._textureCoordinateRotationPoints)) { + this._textureCoordinateRotationPoints = textureCoordinateRotationPoints( + this + ); + } + return this._textureCoordinateRotationPoints; + } + } +}); +var EllipseGeometry_default = EllipseGeometry; + +export { + EllipseGeometry_default +}; diff --git a/public/assets/cesium/Workers/combineGeometry.js b/public/assets/cesium/Workers/combineGeometry.js new file mode 100644 index 0000000..141fc3a --- /dev/null +++ b/public/assets/cesium/Workers/combineGeometry.js @@ -0,0 +1,66 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + PrimitivePipeline_default +} from "./chunk-IBRIWOCM.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import "./chunk-RJM36CNY.js"; +import "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/combineGeometry.js +function combineGeometry(packedParameters, transferableObjects) { + const parameters = PrimitivePipeline_default.unpackCombineGeometryParameters( + packedParameters + ); + const results = PrimitivePipeline_default.combineGeometry(parameters); + return PrimitivePipeline_default.packCombineGeometryResults( + results, + transferableObjects + ); +} +var combineGeometry_default = createTaskProcessorWorker_default(combineGeometry); +export { + combineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createBoxGeometry.js b/public/assets/cesium/Workers/createBoxGeometry.js new file mode 100644 index 0000000..9a8f8a1 --- /dev/null +++ b/public/assets/cesium/Workers/createBoxGeometry.js @@ -0,0 +1,56 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + BoxGeometry_default +} from "./chunk-HJMNR3GC.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createBoxGeometry.js +function createBoxGeometry(boxGeometry, offset) { + if (defined_default(offset)) { + boxGeometry = BoxGeometry_default.unpack(boxGeometry, offset); + } + return BoxGeometry_default.createGeometry(boxGeometry); +} +var createBoxGeometry_default = createBoxGeometry; +export { + createBoxGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createBoxOutlineGeometry.js b/public/assets/cesium/Workers/createBoxOutlineGeometry.js new file mode 100644 index 0000000..cf5e2db --- /dev/null +++ b/public/assets/cesium/Workers/createBoxOutlineGeometry.js @@ -0,0 +1,233 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/BoxOutlineGeometry.js +var diffScratch = new Cartesian3_default(); +function BoxOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const min = options.minimum; + const max = options.maximum; + Check_default.typeOf.object("min", min); + Check_default.typeOf.object("max", max); + if (defined_default(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + throw new DeveloperError_default( + "GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry." + ); + } + this._min = Cartesian3_default.clone(min); + this._max = Cartesian3_default.clone(max); + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createBoxOutlineGeometry"; +} +BoxOutlineGeometry.fromDimensions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const dimensions = options.dimensions; + Check_default.typeOf.object("dimensions", dimensions); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.x", dimensions.x, 0); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.y", dimensions.y, 0); + Check_default.typeOf.number.greaterThanOrEquals("dimensions.z", dimensions.z, 0); + const corner = Cartesian3_default.multiplyByScalar(dimensions, 0.5, new Cartesian3_default()); + return new BoxOutlineGeometry({ + minimum: Cartesian3_default.negate(corner, new Cartesian3_default()), + maximum: corner, + offsetAttribute: options.offsetAttribute + }); +}; +BoxOutlineGeometry.fromAxisAlignedBoundingBox = function(boundingBox) { + Check_default.typeOf.object("boundindBox", boundingBox); + return new BoxOutlineGeometry({ + minimum: boundingBox.minimum, + maximum: boundingBox.maximum + }); +}; +BoxOutlineGeometry.packedLength = 2 * Cartesian3_default.packedLength + 1; +BoxOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Cartesian3_default.pack(value._min, array, startingIndex); + Cartesian3_default.pack(value._max, array, startingIndex + Cartesian3_default.packedLength); + array[startingIndex + Cartesian3_default.packedLength * 2] = defaultValue_default( + value._offsetAttribute, + -1 + ); + return array; +}; +var scratchMin = new Cartesian3_default(); +var scratchMax = new Cartesian3_default(); +var scratchOptions = { + minimum: scratchMin, + maximum: scratchMax, + offsetAttribute: void 0 +}; +BoxOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const min = Cartesian3_default.unpack(array, startingIndex, scratchMin); + const max = Cartesian3_default.unpack( + array, + startingIndex + Cartesian3_default.packedLength, + scratchMax + ); + const offsetAttribute = array[startingIndex + Cartesian3_default.packedLength * 2]; + if (!defined_default(result)) { + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new BoxOutlineGeometry(scratchOptions); + } + result._min = Cartesian3_default.clone(min, result._min); + result._max = Cartesian3_default.clone(max, result._max); + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +BoxOutlineGeometry.createGeometry = function(boxGeometry) { + const min = boxGeometry._min; + const max = boxGeometry._max; + if (Cartesian3_default.equals(min, max)) { + return; + } + const attributes = new GeometryAttributes_default(); + const indices = new Uint16Array(12 * 2); + const positions = new Float64Array(8 * 3); + positions[0] = min.x; + positions[1] = min.y; + positions[2] = min.z; + positions[3] = max.x; + positions[4] = min.y; + positions[5] = min.z; + positions[6] = max.x; + positions[7] = max.y; + positions[8] = min.z; + positions[9] = min.x; + positions[10] = max.y; + positions[11] = min.z; + positions[12] = min.x; + positions[13] = min.y; + positions[14] = max.z; + positions[15] = max.x; + positions[16] = min.y; + positions[17] = max.z; + positions[18] = max.x; + positions[19] = max.y; + positions[20] = max.z; + positions[21] = min.x; + positions[22] = max.y; + positions[23] = max.z; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + indices[0] = 4; + indices[1] = 5; + indices[2] = 5; + indices[3] = 6; + indices[4] = 6; + indices[5] = 7; + indices[6] = 7; + indices[7] = 4; + indices[8] = 0; + indices[9] = 1; + indices[10] = 1; + indices[11] = 2; + indices[12] = 2; + indices[13] = 3; + indices[14] = 3; + indices[15] = 0; + indices[16] = 0; + indices[17] = 4; + indices[18] = 1; + indices[19] = 5; + indices[20] = 2; + indices[21] = 6; + indices[22] = 3; + indices[23] = 7; + const diff = Cartesian3_default.subtract(max, min, diffScratch); + const radius = Cartesian3_default.magnitude(diff) * 0.5; + if (defined_default(boxGeometry._offsetAttribute)) { + const length = positions.length; + const offsetValue = boxGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: new BoundingSphere_default(Cartesian3_default.ZERO, radius), + offsetAttribute: boxGeometry._offsetAttribute + }); +}; +var BoxOutlineGeometry_default = BoxOutlineGeometry; + +// packages/engine/Source/Workers/createBoxOutlineGeometry.js +function createBoxOutlineGeometry(boxGeometry, offset) { + if (defined_default(offset)) { + boxGeometry = BoxOutlineGeometry_default.unpack(boxGeometry, offset); + } + return BoxOutlineGeometry_default.createGeometry(boxGeometry); +} +var createBoxOutlineGeometry_default = createBoxOutlineGeometry; +export { + createBoxOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCircleGeometry.js b/public/assets/cesium/Workers/createCircleGeometry.js new file mode 100644 index 0000000..eb7ae5b --- /dev/null +++ b/public/assets/cesium/Workers/createCircleGeometry.js @@ -0,0 +1,199 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseGeometry_default +} from "./chunk-ZVUUPJEM.js"; +import "./chunk-JISPSEF3.js"; +import "./chunk-YSIJTJ7N.js"; +import "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CircleGeometry.js +function CircleGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const radius = options.radius; + Check_default.typeOf.number("radius", radius); + const ellipseGeometryOptions = { + center: options.center, + semiMajorAxis: radius, + semiMinorAxis: radius, + ellipsoid: options.ellipsoid, + height: options.height, + extrudedHeight: options.extrudedHeight, + granularity: options.granularity, + vertexFormat: options.vertexFormat, + stRotation: options.stRotation, + shadowVolume: options.shadowVolume + }; + this._ellipseGeometry = new EllipseGeometry_default(ellipseGeometryOptions); + this._workerName = "createCircleGeometry"; +} +CircleGeometry.packedLength = EllipseGeometry_default.packedLength; +CircleGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + return EllipseGeometry_default.pack(value._ellipseGeometry, array, startingIndex); +}; +var scratchEllipseGeometry = new EllipseGeometry_default({ + center: new Cartesian3_default(), + semiMajorAxis: 1, + semiMinorAxis: 1 +}); +var scratchOptions = { + center: new Cartesian3_default(), + radius: void 0, + ellipsoid: Ellipsoid_default.clone(Ellipsoid_default.default), + height: void 0, + extrudedHeight: void 0, + granularity: void 0, + vertexFormat: new VertexFormat_default(), + stRotation: void 0, + semiMajorAxis: void 0, + semiMinorAxis: void 0, + shadowVolume: void 0 +}; +CircleGeometry.unpack = function(array, startingIndex, result) { + const ellipseGeometry = EllipseGeometry_default.unpack( + array, + startingIndex, + scratchEllipseGeometry + ); + scratchOptions.center = Cartesian3_default.clone( + ellipseGeometry._center, + scratchOptions.center + ); + scratchOptions.ellipsoid = Ellipsoid_default.clone( + ellipseGeometry._ellipsoid, + scratchOptions.ellipsoid + ); + scratchOptions.ellipsoid = Ellipsoid_default.clone( + ellipseGeometry._ellipsoid, + scratchEllipseGeometry._ellipsoid + ); + scratchOptions.height = ellipseGeometry._height; + scratchOptions.extrudedHeight = ellipseGeometry._extrudedHeight; + scratchOptions.granularity = ellipseGeometry._granularity; + scratchOptions.vertexFormat = VertexFormat_default.clone( + ellipseGeometry._vertexFormat, + scratchOptions.vertexFormat + ); + scratchOptions.stRotation = ellipseGeometry._stRotation; + scratchOptions.shadowVolume = ellipseGeometry._shadowVolume; + if (!defined_default(result)) { + scratchOptions.radius = ellipseGeometry._semiMajorAxis; + return new CircleGeometry(scratchOptions); + } + scratchOptions.semiMajorAxis = ellipseGeometry._semiMajorAxis; + scratchOptions.semiMinorAxis = ellipseGeometry._semiMinorAxis; + result._ellipseGeometry = new EllipseGeometry_default(scratchOptions); + return result; +}; +CircleGeometry.createGeometry = function(circleGeometry) { + return EllipseGeometry_default.createGeometry(circleGeometry._ellipseGeometry); +}; +CircleGeometry.createShadowVolume = function(circleGeometry, minHeightFunc, maxHeightFunc) { + const granularity = circleGeometry._ellipseGeometry._granularity; + const ellipsoid = circleGeometry._ellipseGeometry._ellipsoid; + const minHeight = minHeightFunc(granularity, ellipsoid); + const maxHeight = maxHeightFunc(granularity, ellipsoid); + return new CircleGeometry({ + center: circleGeometry._ellipseGeometry._center, + radius: circleGeometry._ellipseGeometry._semiMajorAxis, + ellipsoid, + stRotation: circleGeometry._ellipseGeometry._stRotation, + granularity, + extrudedHeight: minHeight, + height: maxHeight, + vertexFormat: VertexFormat_default.POSITION_ONLY, + shadowVolume: true + }); +}; +Object.defineProperties(CircleGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + return this._ellipseGeometry.rectangle; + } + }, + /** + * For remapping texture coordinates when rendering CircleGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return this._ellipseGeometry.textureCoordinateRotationPoints; + } + } +}); +var CircleGeometry_default = CircleGeometry; + +// packages/engine/Source/Workers/createCircleGeometry.js +function createCircleGeometry(circleGeometry, offset) { + if (defined_default(offset)) { + circleGeometry = CircleGeometry_default.unpack(circleGeometry, offset); + } + circleGeometry._ellipseGeometry._center = Cartesian3_default.clone( + circleGeometry._ellipseGeometry._center + ); + circleGeometry._ellipseGeometry._ellipsoid = Ellipsoid_default.clone( + circleGeometry._ellipseGeometry._ellipsoid + ); + return CircleGeometry_default.createGeometry(circleGeometry); +} +var createCircleGeometry_default = createCircleGeometry; +export { + createCircleGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCircleOutlineGeometry.js b/public/assets/cesium/Workers/createCircleOutlineGeometry.js new file mode 100644 index 0000000..7eeafd5 --- /dev/null +++ b/public/assets/cesium/Workers/createCircleOutlineGeometry.js @@ -0,0 +1,145 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseOutlineGeometry_default +} from "./chunk-2LOWCAMW.js"; +import "./chunk-JISPSEF3.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CircleOutlineGeometry.js +function CircleOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const radius = options.radius; + Check_default.typeOf.number("radius", radius); + const ellipseGeometryOptions = { + center: options.center, + semiMajorAxis: radius, + semiMinorAxis: radius, + ellipsoid: options.ellipsoid, + height: options.height, + extrudedHeight: options.extrudedHeight, + granularity: options.granularity, + numberOfVerticalLines: options.numberOfVerticalLines + }; + this._ellipseGeometry = new EllipseOutlineGeometry_default(ellipseGeometryOptions); + this._workerName = "createCircleOutlineGeometry"; +} +CircleOutlineGeometry.packedLength = EllipseOutlineGeometry_default.packedLength; +CircleOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + return EllipseOutlineGeometry_default.pack( + value._ellipseGeometry, + array, + startingIndex + ); +}; +var scratchEllipseGeometry = new EllipseOutlineGeometry_default({ + center: new Cartesian3_default(), + semiMajorAxis: 1, + semiMinorAxis: 1 +}); +var scratchOptions = { + center: new Cartesian3_default(), + radius: void 0, + ellipsoid: Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE), + height: void 0, + extrudedHeight: void 0, + granularity: void 0, + numberOfVerticalLines: void 0, + semiMajorAxis: void 0, + semiMinorAxis: void 0 +}; +CircleOutlineGeometry.unpack = function(array, startingIndex, result) { + const ellipseGeometry = EllipseOutlineGeometry_default.unpack( + array, + startingIndex, + scratchEllipseGeometry + ); + scratchOptions.center = Cartesian3_default.clone( + ellipseGeometry._center, + scratchOptions.center + ); + scratchOptions.ellipsoid = Ellipsoid_default.clone( + ellipseGeometry._ellipsoid, + scratchOptions.ellipsoid + ); + scratchOptions.height = ellipseGeometry._height; + scratchOptions.extrudedHeight = ellipseGeometry._extrudedHeight; + scratchOptions.granularity = ellipseGeometry._granularity; + scratchOptions.numberOfVerticalLines = ellipseGeometry._numberOfVerticalLines; + if (!defined_default(result)) { + scratchOptions.radius = ellipseGeometry._semiMajorAxis; + return new CircleOutlineGeometry(scratchOptions); + } + scratchOptions.semiMajorAxis = ellipseGeometry._semiMajorAxis; + scratchOptions.semiMinorAxis = ellipseGeometry._semiMinorAxis; + result._ellipseGeometry = new EllipseOutlineGeometry_default(scratchOptions); + return result; +}; +CircleOutlineGeometry.createGeometry = function(circleGeometry) { + return EllipseOutlineGeometry_default.createGeometry(circleGeometry._ellipseGeometry); +}; +var CircleOutlineGeometry_default = CircleOutlineGeometry; + +// packages/engine/Source/Workers/createCircleOutlineGeometry.js +function createCircleOutlineGeometry(circleGeometry, offset) { + if (defined_default(offset)) { + circleGeometry = CircleOutlineGeometry_default.unpack(circleGeometry, offset); + } + circleGeometry._ellipseGeometry._center = Cartesian3_default.clone( + circleGeometry._ellipseGeometry._center + ); + circleGeometry._ellipseGeometry._ellipsoid = Ellipsoid_default.clone( + circleGeometry._ellipseGeometry._ellipsoid + ); + return CircleOutlineGeometry_default.createGeometry(circleGeometry); +} +var createCircleOutlineGeometry_default = createCircleOutlineGeometry; +export { + createCircleOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCoplanarPolygonGeometry.js b/public/assets/cesium/Workers/createCoplanarPolygonGeometry.js new file mode 100644 index 0000000..eb3d492 --- /dev/null +++ b/public/assets/cesium/Workers/createCoplanarPolygonGeometry.js @@ -0,0 +1,505 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + BoundingRectangle_default +} from "./chunk-44QAAS4P.js"; +import { + CoplanarPolygonGeometryLibrary_default +} from "./chunk-TK5IIG2F.js"; +import "./chunk-2PTKXHJB.js"; +import { + PolygonGeometryLibrary_default +} from "./chunk-IZJ42N4W.js"; +import "./chunk-XWOUPGUF.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CoplanarPolygonGeometry.js +var scratchPosition = new Cartesian3_default(); +var scratchBR = new BoundingRectangle_default(); +var stScratch = new Cartesian2_default(); +var textureCoordinatesOrigin = new Cartesian2_default(); +var scratchNormal = new Cartesian3_default(); +var scratchTangent = new Cartesian3_default(); +var scratchBitangent = new Cartesian3_default(); +var centerScratch = new Cartesian3_default(); +var axis1Scratch = new Cartesian3_default(); +var axis2Scratch = new Cartesian3_default(); +var quaternionScratch = new Quaternion_default(); +var textureMatrixScratch = new Matrix3_default(); +var tangentRotationScratch = new Matrix3_default(); +var surfaceNormalScratch = new Cartesian3_default(); +function createGeometryFromPolygon(polygon, vertexFormat, boundingRectangle, stRotation, hardcodedTextureCoordinates, projectPointTo2D, normal, tangent, bitangent) { + const positions = polygon.positions; + let indices = PolygonPipeline_default.triangulate(polygon.positions2D, polygon.holes); + if (indices.length < 3) { + indices = [0, 1, 2]; + } + const newIndices = IndexDatatype_default.createTypedArray( + positions.length, + indices.length + ); + newIndices.set(indices); + let textureMatrix = textureMatrixScratch; + if (stRotation !== 0) { + let rotation = Quaternion_default.fromAxisAngle( + normal, + stRotation, + quaternionScratch + ); + textureMatrix = Matrix3_default.fromQuaternion(rotation, textureMatrix); + if (vertexFormat.tangent || vertexFormat.bitangent) { + rotation = Quaternion_default.fromAxisAngle( + normal, + -stRotation, + quaternionScratch + ); + const tangentRotation = Matrix3_default.fromQuaternion( + rotation, + tangentRotationScratch + ); + tangent = Cartesian3_default.normalize( + Matrix3_default.multiplyByVector(tangentRotation, tangent, tangent), + tangent + ); + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + } + } + } else { + textureMatrix = Matrix3_default.clone(Matrix3_default.IDENTITY, textureMatrix); + } + const stOrigin = textureCoordinatesOrigin; + if (vertexFormat.st) { + stOrigin.x = boundingRectangle.x; + stOrigin.y = boundingRectangle.y; + } + const length = positions.length; + const size = length * 3; + const flatPositions = new Float64Array(size); + const normals = vertexFormat.normal ? new Float32Array(size) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(size) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(size) : void 0; + const textureCoordinates = vertexFormat.st ? new Float32Array(length * 2) : void 0; + let positionIndex = 0; + let normalIndex = 0; + let bitangentIndex = 0; + let tangentIndex = 0; + let stIndex = 0; + for (let i = 0; i < length; i++) { + const position = positions[i]; + flatPositions[positionIndex++] = position.x; + flatPositions[positionIndex++] = position.y; + flatPositions[positionIndex++] = position.z; + if (vertexFormat.st) { + if (defined_default(hardcodedTextureCoordinates) && hardcodedTextureCoordinates.positions.length === length) { + textureCoordinates[stIndex++] = hardcodedTextureCoordinates.positions[i].x; + textureCoordinates[stIndex++] = hardcodedTextureCoordinates.positions[i].y; + } else { + const p = Matrix3_default.multiplyByVector( + textureMatrix, + position, + scratchPosition + ); + const st = projectPointTo2D(p, stScratch); + Cartesian2_default.subtract(st, stOrigin, st); + const stx = Math_default.clamp(st.x / boundingRectangle.width, 0, 1); + const sty = Math_default.clamp(st.y / boundingRectangle.height, 0, 1); + textureCoordinates[stIndex++] = stx; + textureCoordinates[stIndex++] = sty; + } + } + if (vertexFormat.normal) { + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: flatPositions + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + return new Geometry_default({ + attributes, + indices: newIndices, + primitiveType: PrimitiveType_default.TRIANGLES + }); +} +function CoplanarPolygonGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const polygonHierarchy = options.polygonHierarchy; + const textureCoordinates = options.textureCoordinates; + Check_default.defined("options.polygonHierarchy", polygonHierarchy); + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._polygonHierarchy = polygonHierarchy; + this._stRotation = defaultValue_default(options.stRotation, 0); + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._workerName = "createCoplanarPolygonGeometry"; + this._textureCoordinates = textureCoordinates; + this.packedLength = PolygonGeometryLibrary_default.computeHierarchyPackedLength( + polygonHierarchy, + Cartesian3_default + ) + VertexFormat_default.packedLength + Ellipsoid_default.packedLength + (defined_default(textureCoordinates) ? PolygonGeometryLibrary_default.computeHierarchyPackedLength( + textureCoordinates, + Cartesian2_default + ) : 1) + 2; +} +CoplanarPolygonGeometry.fromPositions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + Check_default.defined("options.positions", options.positions); + const newOptions = { + polygonHierarchy: { + positions: options.positions + }, + vertexFormat: options.vertexFormat, + stRotation: options.stRotation, + ellipsoid: options.ellipsoid, + textureCoordinates: options.textureCoordinates + }; + return new CoplanarPolygonGeometry(newOptions); +}; +CoplanarPolygonGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._polygonHierarchy, + array, + startingIndex, + Cartesian3_default + ); + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._stRotation; + if (defined_default(value._textureCoordinates)) { + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._textureCoordinates, + array, + startingIndex, + Cartesian2_default + ); + } else { + array[startingIndex++] = -1; + } + array[startingIndex++] = value.packedLength; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + polygonHierarchy: {} +}; +CoplanarPolygonGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const polygonHierarchy = PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian3_default + ); + startingIndex = polygonHierarchy.startingIndex; + delete polygonHierarchy.startingIndex; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const stRotation = array[startingIndex++]; + const textureCoordinates = array[startingIndex] === -1 ? void 0 : PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian2_default + ); + if (defined_default(textureCoordinates)) { + startingIndex = textureCoordinates.startingIndex; + delete textureCoordinates.startingIndex; + } else { + startingIndex++; + } + const packedLength = array[startingIndex++]; + if (!defined_default(result)) { + result = new CoplanarPolygonGeometry(scratchOptions); + } + result._polygonHierarchy = polygonHierarchy; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._stRotation = stRotation; + result._textureCoordinates = textureCoordinates; + result.packedLength = packedLength; + return result; +}; +CoplanarPolygonGeometry.createGeometry = function(polygonGeometry) { + const vertexFormat = polygonGeometry._vertexFormat; + const polygonHierarchy = polygonGeometry._polygonHierarchy; + const stRotation = polygonGeometry._stRotation; + const textureCoordinates = polygonGeometry._textureCoordinates; + const hasTextureCoordinates = defined_default(textureCoordinates); + let outerPositions = polygonHierarchy.positions; + outerPositions = arrayRemoveDuplicates_default( + outerPositions, + Cartesian3_default.equalsEpsilon, + true + ); + if (outerPositions.length < 3) { + return; + } + let normal = scratchNormal; + let tangent = scratchTangent; + let bitangent = scratchBitangent; + let axis1 = axis1Scratch; + const axis2 = axis2Scratch; + const validGeometry = CoplanarPolygonGeometryLibrary_default.computeProjectTo2DArguments( + outerPositions, + centerScratch, + axis1, + axis2 + ); + if (!validGeometry) { + return void 0; + } + normal = Cartesian3_default.cross(axis1, axis2, normal); + normal = Cartesian3_default.normalize(normal, normal); + if (!Cartesian3_default.equalsEpsilon( + centerScratch, + Cartesian3_default.ZERO, + Math_default.EPSILON6 + )) { + const surfaceNormal = polygonGeometry._ellipsoid.geodeticSurfaceNormal( + centerScratch, + surfaceNormalScratch + ); + if (Cartesian3_default.dot(normal, surfaceNormal) < 0) { + normal = Cartesian3_default.negate(normal, normal); + axis1 = Cartesian3_default.negate(axis1, axis1); + } + } + const projectPoints = CoplanarPolygonGeometryLibrary_default.createProjectPointsTo2DFunction( + centerScratch, + axis1, + axis2 + ); + const projectPoint = CoplanarPolygonGeometryLibrary_default.createProjectPointTo2DFunction( + centerScratch, + axis1, + axis2 + ); + if (vertexFormat.tangent) { + tangent = Cartesian3_default.clone(axis1, tangent); + } + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.clone(axis2, bitangent); + } + const results = PolygonGeometryLibrary_default.polygonsFromHierarchy( + polygonHierarchy, + hasTextureCoordinates, + projectPoints, + false + ); + const hierarchy = results.hierarchy; + const polygons = results.polygons; + const dummyFunction = function(identity) { + return identity; + }; + const textureCoordinatePolygons = hasTextureCoordinates ? PolygonGeometryLibrary_default.polygonsFromHierarchy( + textureCoordinates, + true, + dummyFunction, + false + ).polygons : void 0; + if (hierarchy.length === 0) { + return; + } + outerPositions = hierarchy[0].outerRing; + const boundingSphere = BoundingSphere_default.fromPoints(outerPositions); + const boundingRectangle = PolygonGeometryLibrary_default.computeBoundingRectangle( + normal, + projectPoint, + outerPositions, + stRotation, + scratchBR + ); + const geometries = []; + for (let i = 0; i < polygons.length; i++) { + const geometryInstance = new GeometryInstance_default({ + geometry: createGeometryFromPolygon( + polygons[i], + vertexFormat, + boundingRectangle, + stRotation, + hasTextureCoordinates ? textureCoordinatePolygons[i] : void 0, + projectPoint, + normal, + tangent, + bitangent + ) + }); + geometries.push(geometryInstance); + } + const geometry = GeometryPipeline_default.combineInstances(geometries)[0]; + geometry.attributes.position.values = new Float64Array( + geometry.attributes.position.values + ); + geometry.indices = IndexDatatype_default.createTypedArray( + geometry.attributes.position.values.length / 3, + geometry.indices + ); + const attributes = geometry.attributes; + if (!vertexFormat.position) { + delete attributes.position; + } + return new Geometry_default({ + attributes, + indices: geometry.indices, + primitiveType: geometry.primitiveType, + boundingSphere + }); +}; +var CoplanarPolygonGeometry_default = CoplanarPolygonGeometry; + +// packages/engine/Source/Workers/createCoplanarPolygonGeometry.js +function createCoplanarPolygonGeometry(polygonGeometry, offset) { + if (defined_default(offset)) { + polygonGeometry = CoplanarPolygonGeometry_default.unpack(polygonGeometry, offset); + } + return CoplanarPolygonGeometry_default.createGeometry(polygonGeometry); +} +var createCoplanarPolygonGeometry_default = createCoplanarPolygonGeometry; +export { + createCoplanarPolygonGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js b/public/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js new file mode 100644 index 0000000..053f862 --- /dev/null +++ b/public/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js @@ -0,0 +1,223 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CoplanarPolygonGeometryLibrary_default +} from "./chunk-TK5IIG2F.js"; +import "./chunk-2PTKXHJB.js"; +import { + PolygonGeometryLibrary_default +} from "./chunk-IZJ42N4W.js"; +import "./chunk-XWOUPGUF.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CoplanarPolygonOutlineGeometry.js +function createGeometryFromPositions(positions) { + const length = positions.length; + const flatPositions = new Float64Array(length * 3); + const indices = IndexDatatype_default.createTypedArray(length, length * 2); + let positionIndex = 0; + let index = 0; + for (let i = 0; i < length; i++) { + const position = positions[i]; + flatPositions[positionIndex++] = position.x; + flatPositions[positionIndex++] = position.y; + flatPositions[positionIndex++] = position.z; + indices[index++] = i; + indices[index++] = (i + 1) % length; + } + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: flatPositions + }) + }); + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES + }); +} +function CoplanarPolygonOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const polygonHierarchy = options.polygonHierarchy; + Check_default.defined("options.polygonHierarchy", polygonHierarchy); + this._polygonHierarchy = polygonHierarchy; + this._workerName = "createCoplanarPolygonOutlineGeometry"; + this.packedLength = PolygonGeometryLibrary_default.computeHierarchyPackedLength( + polygonHierarchy, + Cartesian3_default + ) + 1; +} +CoplanarPolygonOutlineGeometry.fromPositions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + Check_default.defined("options.positions", options.positions); + const newOptions = { + polygonHierarchy: { + positions: options.positions + } + }; + return new CoplanarPolygonOutlineGeometry(newOptions); +}; +CoplanarPolygonOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._polygonHierarchy, + array, + startingIndex, + Cartesian3_default + ); + array[startingIndex] = value.packedLength; + return array; +}; +var scratchOptions = { + polygonHierarchy: {} +}; +CoplanarPolygonOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const polygonHierarchy = PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian3_default + ); + startingIndex = polygonHierarchy.startingIndex; + delete polygonHierarchy.startingIndex; + const packedLength = array[startingIndex]; + if (!defined_default(result)) { + result = new CoplanarPolygonOutlineGeometry(scratchOptions); + } + result._polygonHierarchy = polygonHierarchy; + result.packedLength = packedLength; + return result; +}; +CoplanarPolygonOutlineGeometry.createGeometry = function(polygonGeometry) { + const polygonHierarchy = polygonGeometry._polygonHierarchy; + let outerPositions = polygonHierarchy.positions; + outerPositions = arrayRemoveDuplicates_default( + outerPositions, + Cartesian3_default.equalsEpsilon, + true + ); + if (outerPositions.length < 3) { + return; + } + const isValid = CoplanarPolygonGeometryLibrary_default.validOutline(outerPositions); + if (!isValid) { + return void 0; + } + const polygons = PolygonGeometryLibrary_default.polygonOutlinesFromHierarchy( + polygonHierarchy, + false + ); + if (polygons.length === 0) { + return void 0; + } + const geometries = []; + for (let i = 0; i < polygons.length; i++) { + const geometryInstance = new GeometryInstance_default({ + geometry: createGeometryFromPositions(polygons[i]) + }); + geometries.push(geometryInstance); + } + const geometry = GeometryPipeline_default.combineInstances(geometries)[0]; + const boundingSphere = BoundingSphere_default.fromPoints(polygonHierarchy.positions); + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: geometry.primitiveType, + boundingSphere + }); +}; +var CoplanarPolygonOutlineGeometry_default = CoplanarPolygonOutlineGeometry; + +// packages/engine/Source/Workers/createCoplanarPolygonOutlineGeometry.js +function createCoplanarPolygonOutlineGeometry(polygonGeometry, offset) { + if (defined_default(offset)) { + polygonGeometry = CoplanarPolygonOutlineGeometry_default.unpack( + polygonGeometry, + offset + ); + } + polygonGeometry._ellipsoid = Ellipsoid_default.clone(polygonGeometry._ellipsoid); + return CoplanarPolygonOutlineGeometry_default.createGeometry(polygonGeometry); +} +var createCoplanarPolygonOutlineGeometry_default = createCoplanarPolygonOutlineGeometry; +export { + createCoplanarPolygonOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCorridorGeometry.js b/public/assets/cesium/Workers/createCorridorGeometry.js new file mode 100644 index 0000000..b716149 --- /dev/null +++ b/public/assets/cesium/Workers/createCorridorGeometry.js @@ -0,0 +1,1261 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CorridorGeometryLibrary_default +} from "./chunk-EJVGYGLF.js"; +import { + CornerType_default +} from "./chunk-3IFRSGEY.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CorridorGeometry.js +var cartesian1 = new Cartesian3_default(); +var cartesian2 = new Cartesian3_default(); +var cartesian3 = new Cartesian3_default(); +var cartesian4 = new Cartesian3_default(); +var cartesian5 = new Cartesian3_default(); +var cartesian6 = new Cartesian3_default(); +var scratch1 = new Cartesian3_default(); +var scratch2 = new Cartesian3_default(); +function scaleToSurface(positions, ellipsoid) { + for (let i = 0; i < positions.length; i++) { + positions[i] = ellipsoid.scaleToGeodeticSurface(positions[i], positions[i]); + } + return positions; +} +function addNormals(attr, normal, left, front, back, vertexFormat) { + const normals = attr.normals; + const tangents = attr.tangents; + const bitangents = attr.bitangents; + const forward = Cartesian3_default.normalize( + Cartesian3_default.cross(left, normal, scratch1), + scratch1 + ); + if (vertexFormat.normal) { + CorridorGeometryLibrary_default.addAttribute(normals, normal, front, back); + } + if (vertexFormat.tangent) { + CorridorGeometryLibrary_default.addAttribute(tangents, forward, front, back); + } + if (vertexFormat.bitangent) { + CorridorGeometryLibrary_default.addAttribute(bitangents, left, front, back); + } +} +function combine(computedPositions, vertexFormat, ellipsoid) { + const positions = computedPositions.positions; + const corners = computedPositions.corners; + const endPositions = computedPositions.endPositions; + const computedLefts = computedPositions.lefts; + const computedNormals = computedPositions.normals; + const attributes = new GeometryAttributes_default(); + let corner; + let leftCount = 0; + let rightCount = 0; + let i; + let indicesLength = 0; + let length; + for (i = 0; i < positions.length; i += 2) { + length = positions[i].length - 3; + leftCount += length; + indicesLength += length * 2; + rightCount += positions[i + 1].length - 3; + } + leftCount += 3; + rightCount += 3; + for (i = 0; i < corners.length; i++) { + corner = corners[i]; + const leftSide = corners[i].leftPositions; + if (defined_default(leftSide)) { + length = leftSide.length; + leftCount += length; + indicesLength += length; + } else { + length = corners[i].rightPositions.length; + rightCount += length; + indicesLength += length; + } + } + const addEndPositions = defined_default(endPositions); + let endPositionLength; + if (addEndPositions) { + endPositionLength = endPositions[0].length - 3; + leftCount += endPositionLength; + rightCount += endPositionLength; + endPositionLength /= 3; + indicesLength += endPositionLength * 6; + } + const size = leftCount + rightCount; + const finalPositions = new Float64Array(size); + const normals = vertexFormat.normal ? new Float32Array(size) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(size) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(size) : void 0; + const attr = { + normals, + tangents, + bitangents + }; + let front = 0; + let back = size - 1; + let UL, LL, UR, LR; + let normal = cartesian1; + let left = cartesian2; + let rightPos, leftPos; + const halfLength = endPositionLength / 2; + const indices = IndexDatatype_default.createTypedArray(size / 3, indicesLength); + let index = 0; + if (addEndPositions) { + leftPos = cartesian3; + rightPos = cartesian4; + const firstEndPositions = endPositions[0]; + normal = Cartesian3_default.fromArray(computedNormals, 0, normal); + left = Cartesian3_default.fromArray(computedLefts, 0, left); + for (i = 0; i < halfLength; i++) { + leftPos = Cartesian3_default.fromArray( + firstEndPositions, + (halfLength - 1 - i) * 3, + leftPos + ); + rightPos = Cartesian3_default.fromArray( + firstEndPositions, + (halfLength + i) * 3, + rightPos + ); + CorridorGeometryLibrary_default.addAttribute(finalPositions, rightPos, front); + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + leftPos, + void 0, + back + ); + addNormals(attr, normal, left, front, back, vertexFormat); + LL = front / 3; + LR = LL + 1; + UL = (back - 2) / 3; + UR = UL - 1; + indices[index++] = UL; + indices[index++] = LL; + indices[index++] = UR; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + } + let posIndex = 0; + let compIndex = 0; + let rightEdge = positions[posIndex++]; + let leftEdge = positions[posIndex++]; + finalPositions.set(rightEdge, front); + finalPositions.set(leftEdge, back - leftEdge.length + 1); + left = Cartesian3_default.fromArray(computedLefts, compIndex, left); + let rightNormal; + let leftNormal; + length = leftEdge.length - 3; + for (i = 0; i < length; i += 3) { + rightNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(rightEdge, i, scratch1), + scratch1 + ); + leftNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(leftEdge, length - i, scratch2), + scratch2 + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.add(rightNormal, leftNormal, normal), + normal + ); + addNormals(attr, normal, left, front, back, vertexFormat); + LL = front / 3; + LR = LL + 1; + UL = (back - 2) / 3; + UR = UL - 1; + indices[index++] = UL; + indices[index++] = LL; + indices[index++] = UR; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + rightNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(rightEdge, length, scratch1), + scratch1 + ); + leftNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(leftEdge, length, scratch2), + scratch2 + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.add(rightNormal, leftNormal, normal), + normal + ); + compIndex += 3; + for (i = 0; i < corners.length; i++) { + let j; + corner = corners[i]; + const l = corner.leftPositions; + const r = corner.rightPositions; + let pivot; + let start; + let outsidePoint = cartesian6; + let previousPoint = cartesian3; + let nextPoint = cartesian4; + normal = Cartesian3_default.fromArray(computedNormals, compIndex, normal); + if (defined_default(l)) { + addNormals(attr, normal, left, void 0, back, vertexFormat); + back -= 3; + pivot = LR; + start = UR; + for (j = 0; j < l.length / 3; j++) { + outsidePoint = Cartesian3_default.fromArray(l, j * 3, outsidePoint); + indices[index++] = pivot; + indices[index++] = start - j - 1; + indices[index++] = start - j; + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + outsidePoint, + void 0, + back + ); + previousPoint = Cartesian3_default.fromArray( + finalPositions, + (start - j - 1) * 3, + previousPoint + ); + nextPoint = Cartesian3_default.fromArray(finalPositions, pivot * 3, nextPoint); + left = Cartesian3_default.normalize( + Cartesian3_default.subtract(previousPoint, nextPoint, left), + left + ); + addNormals(attr, normal, left, void 0, back, vertexFormat); + back -= 3; + } + outsidePoint = Cartesian3_default.fromArray( + finalPositions, + pivot * 3, + outsidePoint + ); + previousPoint = Cartesian3_default.subtract( + Cartesian3_default.fromArray(finalPositions, start * 3, previousPoint), + outsidePoint, + previousPoint + ); + nextPoint = Cartesian3_default.subtract( + Cartesian3_default.fromArray(finalPositions, (start - j) * 3, nextPoint), + outsidePoint, + nextPoint + ); + left = Cartesian3_default.normalize( + Cartesian3_default.add(previousPoint, nextPoint, left), + left + ); + addNormals(attr, normal, left, front, void 0, vertexFormat); + front += 3; + } else { + addNormals(attr, normal, left, front, void 0, vertexFormat); + front += 3; + pivot = UR; + start = LR; + for (j = 0; j < r.length / 3; j++) { + outsidePoint = Cartesian3_default.fromArray(r, j * 3, outsidePoint); + indices[index++] = pivot; + indices[index++] = start + j; + indices[index++] = start + j + 1; + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + outsidePoint, + front + ); + previousPoint = Cartesian3_default.fromArray( + finalPositions, + pivot * 3, + previousPoint + ); + nextPoint = Cartesian3_default.fromArray( + finalPositions, + (start + j) * 3, + nextPoint + ); + left = Cartesian3_default.normalize( + Cartesian3_default.subtract(previousPoint, nextPoint, left), + left + ); + addNormals(attr, normal, left, front, void 0, vertexFormat); + front += 3; + } + outsidePoint = Cartesian3_default.fromArray( + finalPositions, + pivot * 3, + outsidePoint + ); + previousPoint = Cartesian3_default.subtract( + Cartesian3_default.fromArray(finalPositions, (start + j) * 3, previousPoint), + outsidePoint, + previousPoint + ); + nextPoint = Cartesian3_default.subtract( + Cartesian3_default.fromArray(finalPositions, start * 3, nextPoint), + outsidePoint, + nextPoint + ); + left = Cartesian3_default.normalize( + Cartesian3_default.negate(Cartesian3_default.add(nextPoint, previousPoint, left), left), + left + ); + addNormals(attr, normal, left, void 0, back, vertexFormat); + back -= 3; + } + rightEdge = positions[posIndex++]; + leftEdge = positions[posIndex++]; + rightEdge.splice(0, 3); + leftEdge.splice(leftEdge.length - 3, 3); + finalPositions.set(rightEdge, front); + finalPositions.set(leftEdge, back - leftEdge.length + 1); + length = leftEdge.length - 3; + compIndex += 3; + left = Cartesian3_default.fromArray(computedLefts, compIndex, left); + for (j = 0; j < leftEdge.length; j += 3) { + rightNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(rightEdge, j, scratch1), + scratch1 + ); + leftNormal = ellipsoid.geodeticSurfaceNormal( + Cartesian3_default.fromArray(leftEdge, length - j, scratch2), + scratch2 + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.add(rightNormal, leftNormal, normal), + normal + ); + addNormals(attr, normal, left, front, back, vertexFormat); + LR = front / 3; + LL = LR - 1; + UR = (back - 2) / 3; + UL = UR + 1; + indices[index++] = UL; + indices[index++] = LL; + indices[index++] = UR; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + front -= 3; + back += 3; + } + normal = Cartesian3_default.fromArray( + computedNormals, + computedNormals.length - 3, + normal + ); + addNormals(attr, normal, left, front, back, vertexFormat); + if (addEndPositions) { + front += 3; + back -= 3; + leftPos = cartesian3; + rightPos = cartesian4; + const lastEndPositions = endPositions[1]; + for (i = 0; i < halfLength; i++) { + leftPos = Cartesian3_default.fromArray( + lastEndPositions, + (endPositionLength - i - 1) * 3, + leftPos + ); + rightPos = Cartesian3_default.fromArray(lastEndPositions, i * 3, rightPos); + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + leftPos, + void 0, + back + ); + CorridorGeometryLibrary_default.addAttribute(finalPositions, rightPos, front); + addNormals(attr, normal, left, front, back, vertexFormat); + LR = front / 3; + LL = LR - 1; + UR = (back - 2) / 3; + UL = UR + 1; + indices[index++] = UL; + indices[index++] = LL; + indices[index++] = UR; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + } + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: finalPositions + }); + if (vertexFormat.st) { + const st = new Float32Array(size / 3 * 2); + let rightSt; + let leftSt; + let stIndex = 0; + if (addEndPositions) { + leftCount /= 3; + rightCount /= 3; + const theta = Math.PI / (endPositionLength + 1); + leftSt = 1 / (leftCount - endPositionLength + 1); + rightSt = 1 / (rightCount - endPositionLength + 1); + let a; + const halfEndPos = endPositionLength / 2; + for (i = halfEndPos + 1; i < endPositionLength + 1; i++) { + a = Math_default.PI_OVER_TWO + theta * i; + st[stIndex++] = rightSt * (1 + Math.cos(a)); + st[stIndex++] = 0.5 * (1 + Math.sin(a)); + } + for (i = 1; i < rightCount - endPositionLength + 1; i++) { + st[stIndex++] = i * rightSt; + st[stIndex++] = 0; + } + for (i = endPositionLength; i > halfEndPos; i--) { + a = Math_default.PI_OVER_TWO - i * theta; + st[stIndex++] = 1 - rightSt * (1 + Math.cos(a)); + st[stIndex++] = 0.5 * (1 + Math.sin(a)); + } + for (i = halfEndPos; i > 0; i--) { + a = Math_default.PI_OVER_TWO - theta * i; + st[stIndex++] = 1 - leftSt * (1 + Math.cos(a)); + st[stIndex++] = 0.5 * (1 + Math.sin(a)); + } + for (i = leftCount - endPositionLength; i > 0; i--) { + st[stIndex++] = i * leftSt; + st[stIndex++] = 1; + } + for (i = 1; i < halfEndPos + 1; i++) { + a = Math_default.PI_OVER_TWO + theta * i; + st[stIndex++] = leftSt * (1 + Math.cos(a)); + st[stIndex++] = 0.5 * (1 + Math.sin(a)); + } + } else { + leftCount /= 3; + rightCount /= 3; + leftSt = 1 / (leftCount - 1); + rightSt = 1 / (rightCount - 1); + for (i = 0; i < rightCount; i++) { + st[stIndex++] = i * rightSt; + st[stIndex++] = 0; + } + for (i = leftCount; i > 0; i--) { + st[stIndex++] = (i - 1) * leftSt; + st[stIndex++] = 1; + } + } + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: st + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attr.normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attr.tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attr.bitangents + }); + } + return { + attributes, + indices + }; +} +function extrudedAttributes(attributes, vertexFormat) { + if (!vertexFormat.normal && !vertexFormat.tangent && !vertexFormat.bitangent && !vertexFormat.st) { + return attributes; + } + const positions = attributes.position.values; + let topNormals; + let topBitangents; + if (vertexFormat.normal || vertexFormat.bitangent) { + topNormals = attributes.normal.values; + topBitangents = attributes.bitangent.values; + } + const size = attributes.position.values.length / 18; + const threeSize = size * 3; + const twoSize = size * 2; + const sixSize = threeSize * 2; + let i; + if (vertexFormat.normal || vertexFormat.bitangent || vertexFormat.tangent) { + const normals = vertexFormat.normal ? new Float32Array(threeSize * 6) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(threeSize * 6) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(threeSize * 6) : void 0; + let topPosition = cartesian1; + let bottomPosition = cartesian2; + let previousPosition = cartesian3; + let normal = cartesian4; + let tangent = cartesian5; + let bitangent = cartesian6; + let attrIndex = sixSize; + for (i = 0; i < threeSize; i += 3) { + const attrIndexOffset = attrIndex + sixSize; + topPosition = Cartesian3_default.fromArray(positions, i, topPosition); + bottomPosition = Cartesian3_default.fromArray( + positions, + i + threeSize, + bottomPosition + ); + previousPosition = Cartesian3_default.fromArray( + positions, + (i + 3) % threeSize, + previousPosition + ); + bottomPosition = Cartesian3_default.subtract( + bottomPosition, + topPosition, + bottomPosition + ); + previousPosition = Cartesian3_default.subtract( + previousPosition, + topPosition, + previousPosition + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.cross(bottomPosition, previousPosition, normal), + normal + ); + if (vertexFormat.normal) { + CorridorGeometryLibrary_default.addAttribute(normals, normal, attrIndexOffset); + CorridorGeometryLibrary_default.addAttribute( + normals, + normal, + attrIndexOffset + 3 + ); + CorridorGeometryLibrary_default.addAttribute(normals, normal, attrIndex); + CorridorGeometryLibrary_default.addAttribute(normals, normal, attrIndex + 3); + } + if (vertexFormat.tangent || vertexFormat.bitangent) { + bitangent = Cartesian3_default.fromArray(topNormals, i, bitangent); + if (vertexFormat.bitangent) { + CorridorGeometryLibrary_default.addAttribute( + bitangents, + bitangent, + attrIndexOffset + ); + CorridorGeometryLibrary_default.addAttribute( + bitangents, + bitangent, + attrIndexOffset + 3 + ); + CorridorGeometryLibrary_default.addAttribute( + bitangents, + bitangent, + attrIndex + ); + CorridorGeometryLibrary_default.addAttribute( + bitangents, + bitangent, + attrIndex + 3 + ); + } + if (vertexFormat.tangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(bitangent, normal, tangent), + tangent + ); + CorridorGeometryLibrary_default.addAttribute( + tangents, + tangent, + attrIndexOffset + ); + CorridorGeometryLibrary_default.addAttribute( + tangents, + tangent, + attrIndexOffset + 3 + ); + CorridorGeometryLibrary_default.addAttribute(tangents, tangent, attrIndex); + CorridorGeometryLibrary_default.addAttribute( + tangents, + tangent, + attrIndex + 3 + ); + } + } + attrIndex += 6; + } + if (vertexFormat.normal) { + normals.set(topNormals); + for (i = 0; i < threeSize; i += 3) { + normals[i + threeSize] = -topNormals[i]; + normals[i + threeSize + 1] = -topNormals[i + 1]; + normals[i + threeSize + 2] = -topNormals[i + 2]; + } + attributes.normal.values = normals; + } else { + attributes.normal = void 0; + } + if (vertexFormat.bitangent) { + bitangents.set(topBitangents); + bitangents.set(topBitangents, threeSize); + attributes.bitangent.values = bitangents; + } else { + attributes.bitangent = void 0; + } + if (vertexFormat.tangent) { + const topTangents = attributes.tangent.values; + tangents.set(topTangents); + tangents.set(topTangents, threeSize); + attributes.tangent.values = tangents; + } + } + if (vertexFormat.st) { + const topSt = attributes.st.values; + const st = new Float32Array(twoSize * 6); + st.set(topSt); + st.set(topSt, twoSize); + let index = twoSize * 2; + for (let j = 0; j < 2; j++) { + st[index++] = topSt[0]; + st[index++] = topSt[1]; + for (i = 2; i < twoSize; i += 2) { + const s = topSt[i]; + const t = topSt[i + 1]; + st[index++] = s; + st[index++] = t; + st[index++] = s; + st[index++] = t; + } + st[index++] = topSt[0]; + st[index++] = topSt[1]; + } + attributes.st.values = st; + } + return attributes; +} +function addWallPositions(positions, index, wallPositions) { + wallPositions[index++] = positions[0]; + wallPositions[index++] = positions[1]; + wallPositions[index++] = positions[2]; + for (let i = 3; i < positions.length; i += 3) { + const x = positions[i]; + const y = positions[i + 1]; + const z = positions[i + 2]; + wallPositions[index++] = x; + wallPositions[index++] = y; + wallPositions[index++] = z; + wallPositions[index++] = x; + wallPositions[index++] = y; + wallPositions[index++] = z; + } + wallPositions[index++] = positions[0]; + wallPositions[index++] = positions[1]; + wallPositions[index++] = positions[2]; + return wallPositions; +} +function computePositionsExtruded(params, vertexFormat) { + const topVertexFormat = new VertexFormat_default({ + position: vertexFormat.position, + normal: vertexFormat.normal || vertexFormat.bitangent || params.shadowVolume, + tangent: vertexFormat.tangent, + bitangent: vertexFormat.normal || vertexFormat.bitangent, + st: vertexFormat.st + }); + const ellipsoid = params.ellipsoid; + const computedPositions = CorridorGeometryLibrary_default.computePositions(params); + const attr = combine(computedPositions, topVertexFormat, ellipsoid); + const height = params.height; + const extrudedHeight = params.extrudedHeight; + let attributes = attr.attributes; + const indices = attr.indices; + let positions = attributes.position.values; + let length = positions.length; + const newPositions = new Float64Array(length * 6); + let extrudedPositions = new Float64Array(length); + extrudedPositions.set(positions); + let wallPositions = new Float64Array(length * 4); + positions = PolygonPipeline_default.scaleToGeodeticHeight( + positions, + height, + ellipsoid + ); + wallPositions = addWallPositions(positions, 0, wallPositions); + extrudedPositions = PolygonPipeline_default.scaleToGeodeticHeight( + extrudedPositions, + extrudedHeight, + ellipsoid + ); + wallPositions = addWallPositions( + extrudedPositions, + length * 2, + wallPositions + ); + newPositions.set(positions); + newPositions.set(extrudedPositions, length); + newPositions.set(wallPositions, length * 2); + attributes.position.values = newPositions; + attributes = extrudedAttributes(attributes, vertexFormat); + let i; + const size = length / 3; + if (params.shadowVolume) { + const topNormals = attributes.normal.values; + length = topNormals.length; + let extrudeNormals = new Float32Array(length * 6); + for (i = 0; i < length; i++) { + topNormals[i] = -topNormals[i]; + } + extrudeNormals.set(topNormals, length); + extrudeNormals = addWallPositions(topNormals, length * 4, extrudeNormals); + attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: extrudeNormals + }); + if (!vertexFormat.normal) { + attributes.normal = void 0; + } + } + if (defined_default(params.offsetAttribute)) { + let applyOffset = new Uint8Array(size * 6); + if (params.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + applyOffset = applyOffset.fill(1, 0, size).fill(1, size * 2, size * 4); + } else { + const applyOffsetValue = params.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + applyOffset = applyOffset.fill(applyOffsetValue); + } + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + const iLength = indices.length; + const twoSize = size + size; + const newIndices = IndexDatatype_default.createTypedArray( + newPositions.length / 3, + iLength * 2 + twoSize * 3 + ); + newIndices.set(indices); + let index = iLength; + for (i = 0; i < iLength; i += 3) { + const v0 = indices[i]; + const v1 = indices[i + 1]; + const v2 = indices[i + 2]; + newIndices[index++] = v2 + size; + newIndices[index++] = v1 + size; + newIndices[index++] = v0 + size; + } + let UL, LL, UR, LR; + for (i = 0; i < twoSize; i += 2) { + UL = i + twoSize; + LL = UL + twoSize; + UR = UL + 1; + LR = LL + 1; + newIndices[index++] = UL; + newIndices[index++] = LL; + newIndices[index++] = UR; + newIndices[index++] = UR; + newIndices[index++] = LL; + newIndices[index++] = LR; + } + return { + attributes, + indices: newIndices + }; +} +var scratchCartesian1 = new Cartesian3_default(); +var scratchCartesian2 = new Cartesian3_default(); +var scratchCartographic = new Cartographic_default(); +function computeOffsetPoints(position1, position2, ellipsoid, halfWidth, min, max) { + const direction = Cartesian3_default.subtract( + position2, + position1, + scratchCartesian1 + ); + Cartesian3_default.normalize(direction, direction); + const normal = ellipsoid.geodeticSurfaceNormal(position1, scratchCartesian2); + const offsetDirection = Cartesian3_default.cross( + direction, + normal, + scratchCartesian1 + ); + Cartesian3_default.multiplyByScalar(offsetDirection, halfWidth, offsetDirection); + let minLat = min.latitude; + let minLon = min.longitude; + let maxLat = max.latitude; + let maxLon = max.longitude; + Cartesian3_default.add(position1, offsetDirection, scratchCartesian2); + ellipsoid.cartesianToCartographic(scratchCartesian2, scratchCartographic); + let lat = scratchCartographic.latitude; + let lon = scratchCartographic.longitude; + minLat = Math.min(minLat, lat); + minLon = Math.min(minLon, lon); + maxLat = Math.max(maxLat, lat); + maxLon = Math.max(maxLon, lon); + Cartesian3_default.subtract(position1, offsetDirection, scratchCartesian2); + ellipsoid.cartesianToCartographic(scratchCartesian2, scratchCartographic); + lat = scratchCartographic.latitude; + lon = scratchCartographic.longitude; + minLat = Math.min(minLat, lat); + minLon = Math.min(minLon, lon); + maxLat = Math.max(maxLat, lat); + maxLon = Math.max(maxLon, lon); + min.latitude = minLat; + min.longitude = minLon; + max.latitude = maxLat; + max.longitude = maxLon; +} +var scratchCartesianOffset = new Cartesian3_default(); +var scratchCartesianEnds = new Cartesian3_default(); +var scratchCartographicMin = new Cartographic_default(); +var scratchCartographicMax = new Cartographic_default(); +function computeRectangle(positions, ellipsoid, width, cornerType, result) { + positions = scaleToSurface(positions, ellipsoid); + const cleanPositions = arrayRemoveDuplicates_default( + positions, + Cartesian3_default.equalsEpsilon + ); + const length = cleanPositions.length; + if (length < 2 || width <= 0) { + return new Rectangle_default(); + } + const halfWidth = width * 0.5; + scratchCartographicMin.latitude = Number.POSITIVE_INFINITY; + scratchCartographicMin.longitude = Number.POSITIVE_INFINITY; + scratchCartographicMax.latitude = Number.NEGATIVE_INFINITY; + scratchCartographicMax.longitude = Number.NEGATIVE_INFINITY; + let lat, lon; + if (cornerType === CornerType_default.ROUNDED) { + const first = cleanPositions[0]; + Cartesian3_default.subtract(first, cleanPositions[1], scratchCartesianOffset); + Cartesian3_default.normalize(scratchCartesianOffset, scratchCartesianOffset); + Cartesian3_default.multiplyByScalar( + scratchCartesianOffset, + halfWidth, + scratchCartesianOffset + ); + Cartesian3_default.add(first, scratchCartesianOffset, scratchCartesianEnds); + ellipsoid.cartesianToCartographic( + scratchCartesianEnds, + scratchCartographic + ); + lat = scratchCartographic.latitude; + lon = scratchCartographic.longitude; + scratchCartographicMin.latitude = Math.min( + scratchCartographicMin.latitude, + lat + ); + scratchCartographicMin.longitude = Math.min( + scratchCartographicMin.longitude, + lon + ); + scratchCartographicMax.latitude = Math.max( + scratchCartographicMax.latitude, + lat + ); + scratchCartographicMax.longitude = Math.max( + scratchCartographicMax.longitude, + lon + ); + } + for (let i = 0; i < length - 1; ++i) { + computeOffsetPoints( + cleanPositions[i], + cleanPositions[i + 1], + ellipsoid, + halfWidth, + scratchCartographicMin, + scratchCartographicMax + ); + } + const last = cleanPositions[length - 1]; + Cartesian3_default.subtract(last, cleanPositions[length - 2], scratchCartesianOffset); + Cartesian3_default.normalize(scratchCartesianOffset, scratchCartesianOffset); + Cartesian3_default.multiplyByScalar( + scratchCartesianOffset, + halfWidth, + scratchCartesianOffset + ); + Cartesian3_default.add(last, scratchCartesianOffset, scratchCartesianEnds); + computeOffsetPoints( + last, + scratchCartesianEnds, + ellipsoid, + halfWidth, + scratchCartographicMin, + scratchCartographicMax + ); + if (cornerType === CornerType_default.ROUNDED) { + ellipsoid.cartesianToCartographic( + scratchCartesianEnds, + scratchCartographic + ); + lat = scratchCartographic.latitude; + lon = scratchCartographic.longitude; + scratchCartographicMin.latitude = Math.min( + scratchCartographicMin.latitude, + lat + ); + scratchCartographicMin.longitude = Math.min( + scratchCartographicMin.longitude, + lon + ); + scratchCartographicMax.latitude = Math.max( + scratchCartographicMax.latitude, + lat + ); + scratchCartographicMax.longitude = Math.max( + scratchCartographicMax.longitude, + lon + ); + } + const rectangle = defined_default(result) ? result : new Rectangle_default(); + rectangle.north = scratchCartographicMax.latitude; + rectangle.south = scratchCartographicMin.latitude; + rectangle.east = scratchCartographicMax.longitude; + rectangle.west = scratchCartographicMin.longitude; + return rectangle; +} +function CorridorGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + const width = options.width; + Check_default.defined("options.positions", positions); + Check_default.defined("options.width", width); + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._positions = positions; + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._vertexFormat = VertexFormat_default.clone( + defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT) + ); + this._width = width; + this._height = Math.max(height, extrudedHeight); + this._extrudedHeight = Math.min(height, extrudedHeight); + this._cornerType = defaultValue_default(options.cornerType, CornerType_default.ROUNDED); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._shadowVolume = defaultValue_default(options.shadowVolume, false); + this._workerName = "createCorridorGeometry"; + this._offsetAttribute = options.offsetAttribute; + this._rectangle = void 0; + this.packedLength = 1 + positions.length * Cartesian3_default.packedLength + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 7; +} +CorridorGeometry.pack = function(value, array, startingIndex) { + Check_default.defined("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const positions = value._positions; + const length = positions.length; + array[startingIndex++] = length; + for (let i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._width; + array[startingIndex++] = value._height; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._cornerType; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._shadowVolume ? 1 : 0; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + positions: void 0, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + width: void 0, + height: void 0, + extrudedHeight: void 0, + cornerType: void 0, + granularity: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +CorridorGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const length = array[startingIndex++]; + const positions = new Array(length); + for (let i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const width = array[startingIndex++]; + const height = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const cornerType = array[startingIndex++]; + const granularity = array[startingIndex++]; + const shadowVolume = array[startingIndex++] === 1; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.positions = positions; + scratchOptions.width = width; + scratchOptions.height = height; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.cornerType = cornerType; + scratchOptions.granularity = granularity; + scratchOptions.shadowVolume = shadowVolume; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new CorridorGeometry(scratchOptions); + } + result._positions = positions; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._width = width; + result._height = height; + result._extrudedHeight = extrudedHeight; + result._cornerType = cornerType; + result._granularity = granularity; + result._shadowVolume = shadowVolume; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +CorridorGeometry.computeRectangle = function(options, result) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + const width = options.width; + Check_default.defined("options.positions", positions); + Check_default.defined("options.width", width); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const cornerType = defaultValue_default(options.cornerType, CornerType_default.ROUNDED); + return computeRectangle(positions, ellipsoid, width, cornerType, result); +}; +CorridorGeometry.createGeometry = function(corridorGeometry) { + let positions = corridorGeometry._positions; + const width = corridorGeometry._width; + const ellipsoid = corridorGeometry._ellipsoid; + positions = scaleToSurface(positions, ellipsoid); + const cleanPositions = arrayRemoveDuplicates_default( + positions, + Cartesian3_default.equalsEpsilon + ); + if (cleanPositions.length < 2 || width <= 0) { + return; + } + const height = corridorGeometry._height; + const extrudedHeight = corridorGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + height, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + const vertexFormat = corridorGeometry._vertexFormat; + const params = { + ellipsoid, + positions: cleanPositions, + width, + cornerType: corridorGeometry._cornerType, + granularity: corridorGeometry._granularity, + saveAttributes: true + }; + let attr; + if (extrude) { + params.height = height; + params.extrudedHeight = extrudedHeight; + params.shadowVolume = corridorGeometry._shadowVolume; + params.offsetAttribute = corridorGeometry._offsetAttribute; + attr = computePositionsExtruded(params, vertexFormat); + } else { + const computedPositions = CorridorGeometryLibrary_default.computePositions(params); + attr = combine(computedPositions, vertexFormat, ellipsoid); + attr.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + attr.attributes.position.values, + height, + ellipsoid + ); + if (defined_default(corridorGeometry._offsetAttribute)) { + const applyOffsetValue = corridorGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const length = attr.attributes.position.values.length; + const applyOffset = new Uint8Array(length / 3).fill(applyOffsetValue); + attr.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + } + const attributes = attr.attributes; + const boundingSphere = BoundingSphere_default.fromVertices( + attributes.position.values, + void 0, + 3 + ); + if (!vertexFormat.position) { + attr.attributes.position.values = void 0; + } + return new Geometry_default({ + attributes, + indices: attr.indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere, + offsetAttribute: corridorGeometry._offsetAttribute + }); +}; +CorridorGeometry.createShadowVolume = function(corridorGeometry, minHeightFunc, maxHeightFunc) { + const granularity = corridorGeometry._granularity; + const ellipsoid = corridorGeometry._ellipsoid; + const minHeight = minHeightFunc(granularity, ellipsoid); + const maxHeight = maxHeightFunc(granularity, ellipsoid); + return new CorridorGeometry({ + positions: corridorGeometry._positions, + width: corridorGeometry._width, + cornerType: corridorGeometry._cornerType, + ellipsoid, + granularity, + extrudedHeight: minHeight, + height: maxHeight, + vertexFormat: VertexFormat_default.POSITION_ONLY, + shadowVolume: true + }); +}; +Object.defineProperties(CorridorGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + if (!defined_default(this._rectangle)) { + this._rectangle = computeRectangle( + this._positions, + this._ellipsoid, + this._width, + this._cornerType + ); + } + return this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering CorridorGeometries as GroundPrimitives. + * + * Corridors don't support stRotation, + * so just return the corners of the original system. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + return [0, 0, 0, 1, 1, 0]; + } + } +}); +var CorridorGeometry_default = CorridorGeometry; + +// packages/engine/Source/Workers/createCorridorGeometry.js +function createCorridorGeometry(corridorGeometry, offset) { + if (defined_default(offset)) { + corridorGeometry = CorridorGeometry_default.unpack(corridorGeometry, offset); + } + corridorGeometry._ellipsoid = Ellipsoid_default.clone(corridorGeometry._ellipsoid); + return CorridorGeometry_default.createGeometry(corridorGeometry); +} +var createCorridorGeometry_default = createCorridorGeometry; +export { + createCorridorGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCorridorOutlineGeometry.js b/public/assets/cesium/Workers/createCorridorOutlineGeometry.js new file mode 100644 index 0000000..6a99d3f --- /dev/null +++ b/public/assets/cesium/Workers/createCorridorOutlineGeometry.js @@ -0,0 +1,566 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CorridorGeometryLibrary_default +} from "./chunk-EJVGYGLF.js"; +import { + CornerType_default +} from "./chunk-3IFRSGEY.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CorridorOutlineGeometry.js +var cartesian1 = new Cartesian3_default(); +var cartesian2 = new Cartesian3_default(); +var cartesian3 = new Cartesian3_default(); +function scaleToSurface(positions, ellipsoid) { + for (let i = 0; i < positions.length; i++) { + positions[i] = ellipsoid.scaleToGeodeticSurface(positions[i], positions[i]); + } + return positions; +} +function combine(computedPositions, cornerType) { + const wallIndices = []; + const positions = computedPositions.positions; + const corners = computedPositions.corners; + const endPositions = computedPositions.endPositions; + const attributes = new GeometryAttributes_default(); + let corner; + let leftCount = 0; + let rightCount = 0; + let i; + let indicesLength = 0; + let length; + for (i = 0; i < positions.length; i += 2) { + length = positions[i].length - 3; + leftCount += length; + indicesLength += length / 3 * 4; + rightCount += positions[i + 1].length - 3; + } + leftCount += 3; + rightCount += 3; + for (i = 0; i < corners.length; i++) { + corner = corners[i]; + const leftSide = corners[i].leftPositions; + if (defined_default(leftSide)) { + length = leftSide.length; + leftCount += length; + indicesLength += length / 3 * 2; + } else { + length = corners[i].rightPositions.length; + rightCount += length; + indicesLength += length / 3 * 2; + } + } + const addEndPositions = defined_default(endPositions); + let endPositionLength; + if (addEndPositions) { + endPositionLength = endPositions[0].length - 3; + leftCount += endPositionLength; + rightCount += endPositionLength; + endPositionLength /= 3; + indicesLength += endPositionLength * 4; + } + const size = leftCount + rightCount; + const finalPositions = new Float64Array(size); + let front = 0; + let back = size - 1; + let UL, LL, UR, LR; + let rightPos, leftPos; + const halfLength = endPositionLength / 2; + const indices = IndexDatatype_default.createTypedArray(size / 3, indicesLength + 4); + let index = 0; + indices[index++] = front / 3; + indices[index++] = (back - 2) / 3; + if (addEndPositions) { + wallIndices.push(front / 3); + leftPos = cartesian1; + rightPos = cartesian2; + const firstEndPositions = endPositions[0]; + for (i = 0; i < halfLength; i++) { + leftPos = Cartesian3_default.fromArray( + firstEndPositions, + (halfLength - 1 - i) * 3, + leftPos + ); + rightPos = Cartesian3_default.fromArray( + firstEndPositions, + (halfLength + i) * 3, + rightPos + ); + CorridorGeometryLibrary_default.addAttribute(finalPositions, rightPos, front); + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + leftPos, + void 0, + back + ); + LL = front / 3; + LR = LL + 1; + UL = (back - 2) / 3; + UR = UL - 1; + indices[index++] = UL; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + } + let posIndex = 0; + let rightEdge = positions[posIndex++]; + let leftEdge = positions[posIndex++]; + finalPositions.set(rightEdge, front); + finalPositions.set(leftEdge, back - leftEdge.length + 1); + length = leftEdge.length - 3; + wallIndices.push(front / 3, (back - 2) / 3); + for (i = 0; i < length; i += 3) { + LL = front / 3; + LR = LL + 1; + UL = (back - 2) / 3; + UR = UL - 1; + indices[index++] = UL; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + for (i = 0; i < corners.length; i++) { + let j; + corner = corners[i]; + const l = corner.leftPositions; + const r = corner.rightPositions; + let start; + let outsidePoint = cartesian3; + if (defined_default(l)) { + back -= 3; + start = UR; + wallIndices.push(LR); + for (j = 0; j < l.length / 3; j++) { + outsidePoint = Cartesian3_default.fromArray(l, j * 3, outsidePoint); + indices[index++] = start - j - 1; + indices[index++] = start - j; + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + outsidePoint, + void 0, + back + ); + back -= 3; + } + wallIndices.push(start - Math.floor(l.length / 6)); + if (cornerType === CornerType_default.BEVELED) { + wallIndices.push((back - 2) / 3 + 1); + } + front += 3; + } else { + front += 3; + start = LR; + wallIndices.push(UR); + for (j = 0; j < r.length / 3; j++) { + outsidePoint = Cartesian3_default.fromArray(r, j * 3, outsidePoint); + indices[index++] = start + j; + indices[index++] = start + j + 1; + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + outsidePoint, + front + ); + front += 3; + } + wallIndices.push(start + Math.floor(r.length / 6)); + if (cornerType === CornerType_default.BEVELED) { + wallIndices.push(front / 3 - 1); + } + back -= 3; + } + rightEdge = positions[posIndex++]; + leftEdge = positions[posIndex++]; + rightEdge.splice(0, 3); + leftEdge.splice(leftEdge.length - 3, 3); + finalPositions.set(rightEdge, front); + finalPositions.set(leftEdge, back - leftEdge.length + 1); + length = leftEdge.length - 3; + for (j = 0; j < leftEdge.length; j += 3) { + LR = front / 3; + LL = LR - 1; + UR = (back - 2) / 3; + UL = UR + 1; + indices[index++] = UL; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + front -= 3; + back += 3; + wallIndices.push(front / 3, (back - 2) / 3); + } + if (addEndPositions) { + front += 3; + back -= 3; + leftPos = cartesian1; + rightPos = cartesian2; + const lastEndPositions = endPositions[1]; + for (i = 0; i < halfLength; i++) { + leftPos = Cartesian3_default.fromArray( + lastEndPositions, + (endPositionLength - i - 1) * 3, + leftPos + ); + rightPos = Cartesian3_default.fromArray(lastEndPositions, i * 3, rightPos); + CorridorGeometryLibrary_default.addAttribute( + finalPositions, + leftPos, + void 0, + back + ); + CorridorGeometryLibrary_default.addAttribute(finalPositions, rightPos, front); + LR = front / 3; + LL = LR - 1; + UR = (back - 2) / 3; + UL = UR + 1; + indices[index++] = UL; + indices[index++] = UR; + indices[index++] = LL; + indices[index++] = LR; + front += 3; + back -= 3; + } + wallIndices.push(front / 3); + } else { + wallIndices.push(front / 3, (back - 2) / 3); + } + indices[index++] = front / 3; + indices[index++] = (back - 2) / 3; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: finalPositions + }); + return { + attributes, + indices, + wallIndices + }; +} +function computePositionsExtruded(params) { + const ellipsoid = params.ellipsoid; + const computedPositions = CorridorGeometryLibrary_default.computePositions(params); + const attr = combine(computedPositions, params.cornerType); + const wallIndices = attr.wallIndices; + const height = params.height; + const extrudedHeight = params.extrudedHeight; + const attributes = attr.attributes; + const indices = attr.indices; + let positions = attributes.position.values; + let length = positions.length; + let extrudedPositions = new Float64Array(length); + extrudedPositions.set(positions); + const newPositions = new Float64Array(length * 2); + positions = PolygonPipeline_default.scaleToGeodeticHeight( + positions, + height, + ellipsoid + ); + extrudedPositions = PolygonPipeline_default.scaleToGeodeticHeight( + extrudedPositions, + extrudedHeight, + ellipsoid + ); + newPositions.set(positions); + newPositions.set(extrudedPositions, length); + attributes.position.values = newPositions; + length /= 3; + if (defined_default(params.offsetAttribute)) { + let applyOffset = new Uint8Array(length * 2); + if (params.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + applyOffset = applyOffset.fill(1, 0, length); + } else { + const applyOffsetValue = params.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + applyOffset = applyOffset.fill(applyOffsetValue); + } + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + let i; + const iLength = indices.length; + const newIndices = IndexDatatype_default.createTypedArray( + newPositions.length / 3, + (iLength + wallIndices.length) * 2 + ); + newIndices.set(indices); + let index = iLength; + for (i = 0; i < iLength; i += 2) { + const v0 = indices[i]; + const v1 = indices[i + 1]; + newIndices[index++] = v0 + length; + newIndices[index++] = v1 + length; + } + let UL, LL; + for (i = 0; i < wallIndices.length; i++) { + UL = wallIndices[i]; + LL = UL + length; + newIndices[index++] = UL; + newIndices[index++] = LL; + } + return { + attributes, + indices: newIndices + }; +} +function CorridorOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + const width = options.width; + Check_default.typeOf.object("options.positions", positions); + Check_default.typeOf.number("options.width", width); + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._positions = positions; + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._width = width; + this._height = Math.max(height, extrudedHeight); + this._extrudedHeight = Math.min(height, extrudedHeight); + this._cornerType = defaultValue_default(options.cornerType, CornerType_default.ROUNDED); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createCorridorOutlineGeometry"; + this.packedLength = 1 + positions.length * Cartesian3_default.packedLength + Ellipsoid_default.packedLength + 6; +} +CorridorOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.typeOf.object("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const positions = value._positions; + const length = positions.length; + array[startingIndex++] = length; + for (let i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._width; + array[startingIndex++] = value._height; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._cornerType; + array[startingIndex++] = value._granularity; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchOptions = { + positions: void 0, + ellipsoid: scratchEllipsoid, + width: void 0, + height: void 0, + extrudedHeight: void 0, + cornerType: void 0, + granularity: void 0, + offsetAttribute: void 0 +}; +CorridorOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.typeOf.object("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const length = array[startingIndex++]; + const positions = new Array(length); + for (let i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const width = array[startingIndex++]; + const height = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const cornerType = array[startingIndex++]; + const granularity = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.positions = positions; + scratchOptions.width = width; + scratchOptions.height = height; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.cornerType = cornerType; + scratchOptions.granularity = granularity; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new CorridorOutlineGeometry(scratchOptions); + } + result._positions = positions; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._width = width; + result._height = height; + result._extrudedHeight = extrudedHeight; + result._cornerType = cornerType; + result._granularity = granularity; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +CorridorOutlineGeometry.createGeometry = function(corridorOutlineGeometry) { + let positions = corridorOutlineGeometry._positions; + const width = corridorOutlineGeometry._width; + const ellipsoid = corridorOutlineGeometry._ellipsoid; + positions = scaleToSurface(positions, ellipsoid); + const cleanPositions = arrayRemoveDuplicates_default( + positions, + Cartesian3_default.equalsEpsilon + ); + if (cleanPositions.length < 2 || width <= 0) { + return; + } + const height = corridorOutlineGeometry._height; + const extrudedHeight = corridorOutlineGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + height, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + const params = { + ellipsoid, + positions: cleanPositions, + width, + cornerType: corridorOutlineGeometry._cornerType, + granularity: corridorOutlineGeometry._granularity, + saveAttributes: false + }; + let attr; + if (extrude) { + params.height = height; + params.extrudedHeight = extrudedHeight; + params.offsetAttribute = corridorOutlineGeometry._offsetAttribute; + attr = computePositionsExtruded(params); + } else { + const computedPositions = CorridorGeometryLibrary_default.computePositions(params); + attr = combine(computedPositions, params.cornerType); + attr.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + attr.attributes.position.values, + height, + ellipsoid + ); + if (defined_default(corridorOutlineGeometry._offsetAttribute)) { + const length = attr.attributes.position.values.length; + const offsetValue = corridorOutlineGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attr.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + } + const attributes = attr.attributes; + const boundingSphere = BoundingSphere_default.fromVertices( + attributes.position.values, + void 0, + 3 + ); + return new Geometry_default({ + attributes, + indices: attr.indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere, + offsetAttribute: corridorOutlineGeometry._offsetAttribute + }); +}; +var CorridorOutlineGeometry_default = CorridorOutlineGeometry; + +// packages/engine/Source/Workers/createCorridorOutlineGeometry.js +function createCorridorOutlineGeometry(corridorOutlineGeometry, offset) { + if (defined_default(offset)) { + corridorOutlineGeometry = CorridorOutlineGeometry_default.unpack( + corridorOutlineGeometry, + offset + ); + } + corridorOutlineGeometry._ellipsoid = Ellipsoid_default.clone( + corridorOutlineGeometry._ellipsoid + ); + return CorridorOutlineGeometry_default.createGeometry(corridorOutlineGeometry); +} +var createCorridorOutlineGeometry_default = createCorridorOutlineGeometry; +export { + createCorridorOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCylinderGeometry.js b/public/assets/cesium/Workers/createCylinderGeometry.js new file mode 100644 index 0000000..9c0cd24 --- /dev/null +++ b/public/assets/cesium/Workers/createCylinderGeometry.js @@ -0,0 +1,58 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CylinderGeometry_default +} from "./chunk-L5GODJAR.js"; +import "./chunk-O72GZTSE.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createCylinderGeometry.js +function createCylinderGeometry(cylinderGeometry, offset) { + if (defined_default(offset)) { + cylinderGeometry = CylinderGeometry_default.unpack(cylinderGeometry, offset); + } + return CylinderGeometry_default.createGeometry(cylinderGeometry); +} +var createCylinderGeometry_default = createCylinderGeometry; +export { + createCylinderGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createCylinderOutlineGeometry.js b/public/assets/cesium/Workers/createCylinderOutlineGeometry.js new file mode 100644 index 0000000..781fa34 --- /dev/null +++ b/public/assets/cesium/Workers/createCylinderOutlineGeometry.js @@ -0,0 +1,229 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + CylinderGeometryLibrary_default +} from "./chunk-O72GZTSE.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/CylinderOutlineGeometry.js +var radiusScratch = new Cartesian2_default(); +function CylinderOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const length = options.length; + const topRadius = options.topRadius; + const bottomRadius = options.bottomRadius; + const slices = defaultValue_default(options.slices, 128); + const numberOfVerticalLines = Math.max( + defaultValue_default(options.numberOfVerticalLines, 16), + 0 + ); + Check_default.typeOf.number("options.positions", length); + Check_default.typeOf.number("options.topRadius", topRadius); + Check_default.typeOf.number("options.bottomRadius", bottomRadius); + Check_default.typeOf.number.greaterThanOrEquals("options.slices", slices, 3); + if (defined_default(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + throw new DeveloperError_default( + "GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry." + ); + } + this._length = length; + this._topRadius = topRadius; + this._bottomRadius = bottomRadius; + this._slices = slices; + this._numberOfVerticalLines = numberOfVerticalLines; + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createCylinderOutlineGeometry"; +} +CylinderOutlineGeometry.packedLength = 6; +CylinderOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + array[startingIndex++] = value._length; + array[startingIndex++] = value._topRadius; + array[startingIndex++] = value._bottomRadius; + array[startingIndex++] = value._slices; + array[startingIndex++] = value._numberOfVerticalLines; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchOptions = { + length: void 0, + topRadius: void 0, + bottomRadius: void 0, + slices: void 0, + numberOfVerticalLines: void 0, + offsetAttribute: void 0 +}; +CylinderOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const length = array[startingIndex++]; + const topRadius = array[startingIndex++]; + const bottomRadius = array[startingIndex++]; + const slices = array[startingIndex++]; + const numberOfVerticalLines = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.length = length; + scratchOptions.topRadius = topRadius; + scratchOptions.bottomRadius = bottomRadius; + scratchOptions.slices = slices; + scratchOptions.numberOfVerticalLines = numberOfVerticalLines; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new CylinderOutlineGeometry(scratchOptions); + } + result._length = length; + result._topRadius = topRadius; + result._bottomRadius = bottomRadius; + result._slices = slices; + result._numberOfVerticalLines = numberOfVerticalLines; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +CylinderOutlineGeometry.createGeometry = function(cylinderGeometry) { + let length = cylinderGeometry._length; + const topRadius = cylinderGeometry._topRadius; + const bottomRadius = cylinderGeometry._bottomRadius; + const slices = cylinderGeometry._slices; + const numberOfVerticalLines = cylinderGeometry._numberOfVerticalLines; + if (length <= 0 || topRadius < 0 || bottomRadius < 0 || topRadius === 0 && bottomRadius === 0) { + return; + } + const numVertices = slices * 2; + const positions = CylinderGeometryLibrary_default.computePositions( + length, + topRadius, + bottomRadius, + slices, + false + ); + let numIndices = slices * 2; + let numSide; + if (numberOfVerticalLines > 0) { + const numSideLines = Math.min(numberOfVerticalLines, slices); + numSide = Math.round(slices / numSideLines); + numIndices += numSideLines; + } + const indices = IndexDatatype_default.createTypedArray(numVertices, numIndices * 2); + let index = 0; + let i; + for (i = 0; i < slices - 1; i++) { + indices[index++] = i; + indices[index++] = i + 1; + indices[index++] = i + slices; + indices[index++] = i + 1 + slices; + } + indices[index++] = slices - 1; + indices[index++] = 0; + indices[index++] = slices + slices - 1; + indices[index++] = slices; + if (numberOfVerticalLines > 0) { + for (i = 0; i < slices; i += numSide) { + indices[index++] = i; + indices[index++] = i + slices; + } + } + const attributes = new GeometryAttributes_default(); + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + radiusScratch.x = length * 0.5; + radiusScratch.y = Math.max(bottomRadius, topRadius); + const boundingSphere = new BoundingSphere_default( + Cartesian3_default.ZERO, + Cartesian2_default.magnitude(radiusScratch) + ); + if (defined_default(cylinderGeometry._offsetAttribute)) { + length = positions.length; + const offsetValue = cylinderGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere, + offsetAttribute: cylinderGeometry._offsetAttribute + }); +}; +var CylinderOutlineGeometry_default = CylinderOutlineGeometry; + +// packages/engine/Source/Workers/createCylinderOutlineGeometry.js +function createCylinderOutlineGeometry(cylinderGeometry, offset) { + if (defined_default(offset)) { + cylinderGeometry = CylinderOutlineGeometry_default.unpack(cylinderGeometry, offset); + } + return CylinderOutlineGeometry_default.createGeometry(cylinderGeometry); +} +var createCylinderOutlineGeometry_default = createCylinderOutlineGeometry; +export { + createCylinderOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createEllipseGeometry.js b/public/assets/cesium/Workers/createEllipseGeometry.js new file mode 100644 index 0000000..290a348 --- /dev/null +++ b/public/assets/cesium/Workers/createEllipseGeometry.js @@ -0,0 +1,69 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseGeometry_default +} from "./chunk-ZVUUPJEM.js"; +import "./chunk-JISPSEF3.js"; +import "./chunk-YSIJTJ7N.js"; +import "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createEllipseGeometry.js +function createEllipseGeometry(ellipseGeometry, offset) { + if (defined_default(offset)) { + ellipseGeometry = EllipseGeometry_default.unpack(ellipseGeometry, offset); + } + ellipseGeometry._center = Cartesian3_default.clone(ellipseGeometry._center); + ellipseGeometry._ellipsoid = Ellipsoid_default.clone(ellipseGeometry._ellipsoid); + return EllipseGeometry_default.createGeometry(ellipseGeometry); +} +var createEllipseGeometry_default = createEllipseGeometry; +export { + createEllipseGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createEllipseOutlineGeometry.js b/public/assets/cesium/Workers/createEllipseOutlineGeometry.js new file mode 100644 index 0000000..26a9556 --- /dev/null +++ b/public/assets/cesium/Workers/createEllipseOutlineGeometry.js @@ -0,0 +1,62 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipseOutlineGeometry_default +} from "./chunk-2LOWCAMW.js"; +import "./chunk-JISPSEF3.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createEllipseOutlineGeometry.js +function createEllipseOutlineGeometry(ellipseGeometry, offset) { + if (defined_default(offset)) { + ellipseGeometry = EllipseOutlineGeometry_default.unpack(ellipseGeometry, offset); + } + ellipseGeometry._center = Cartesian3_default.clone(ellipseGeometry._center); + ellipseGeometry._ellipsoid = Ellipsoid_default.clone(ellipseGeometry._ellipsoid); + return EllipseOutlineGeometry_default.createGeometry(ellipseGeometry); +} +var createEllipseOutlineGeometry_default = createEllipseOutlineGeometry; +export { + createEllipseOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createEllipsoidGeometry.js b/public/assets/cesium/Workers/createEllipsoidGeometry.js new file mode 100644 index 0000000..05158f3 --- /dev/null +++ b/public/assets/cesium/Workers/createEllipsoidGeometry.js @@ -0,0 +1,57 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidGeometry_default +} from "./chunk-IZGUQO6Q.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createEllipsoidGeometry.js +function createEllipsoidGeometry(ellipsoidGeometry, offset) { + if (defined_default(offset)) { + ellipsoidGeometry = EllipsoidGeometry_default.unpack(ellipsoidGeometry, offset); + } + return EllipsoidGeometry_default.createGeometry(ellipsoidGeometry); +} +var createEllipsoidGeometry_default = createEllipsoidGeometry; +export { + createEllipsoidGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createEllipsoidOutlineGeometry.js b/public/assets/cesium/Workers/createEllipsoidOutlineGeometry.js new file mode 100644 index 0000000..7d98040 --- /dev/null +++ b/public/assets/cesium/Workers/createEllipsoidOutlineGeometry.js @@ -0,0 +1,59 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidOutlineGeometry_default +} from "./chunk-OPP2SKMA.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createEllipsoidOutlineGeometry.js +function createEllipsoidOutlineGeometry(ellipsoidGeometry, offset) { + if (defined_default(ellipsoidGeometry.buffer, offset)) { + ellipsoidGeometry = EllipsoidOutlineGeometry_default.unpack( + ellipsoidGeometry, + offset + ); + } + return EllipsoidOutlineGeometry_default.createGeometry(ellipsoidGeometry); +} +var createEllipsoidOutlineGeometry_default = createEllipsoidOutlineGeometry; +export { + createEllipsoidOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createFrustumGeometry.js b/public/assets/cesium/Workers/createFrustumGeometry.js new file mode 100644 index 0000000..4a3b884 --- /dev/null +++ b/public/assets/cesium/Workers/createFrustumGeometry.js @@ -0,0 +1,56 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + FrustumGeometry_default +} from "./chunk-7YIOHQWH.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-EDLRS3AW.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createFrustumGeometry.js +function createFrustumGeometry(frustumGeometry, offset) { + if (defined_default(offset)) { + frustumGeometry = FrustumGeometry_default.unpack(frustumGeometry, offset); + } + return FrustumGeometry_default.createGeometry(frustumGeometry); +} +var createFrustumGeometry_default = createFrustumGeometry; +export { + createFrustumGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createFrustumOutlineGeometry.js b/public/assets/cesium/Workers/createFrustumOutlineGeometry.js new file mode 100644 index 0000000..bd9a938 --- /dev/null +++ b/public/assets/cesium/Workers/createFrustumOutlineGeometry.js @@ -0,0 +1,234 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + FrustumGeometry_default, + OrthographicFrustum_default, + PerspectiveFrustum_default +} from "./chunk-7YIOHQWH.js"; +import "./chunk-JBSKHTNX.js"; +import "./chunk-EDLRS3AW.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Quaternion_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/FrustumOutlineGeometry.js +var PERSPECTIVE = 0; +var ORTHOGRAPHIC = 1; +function FrustumOutlineGeometry(options) { + Check_default.typeOf.object("options", options); + Check_default.typeOf.object("options.frustum", options.frustum); + Check_default.typeOf.object("options.origin", options.origin); + Check_default.typeOf.object("options.orientation", options.orientation); + const frustum = options.frustum; + const orientation = options.orientation; + const origin = options.origin; + const drawNearPlane = defaultValue_default(options._drawNearPlane, true); + let frustumType; + let frustumPackedLength; + if (frustum instanceof PerspectiveFrustum_default) { + frustumType = PERSPECTIVE; + frustumPackedLength = PerspectiveFrustum_default.packedLength; + } else if (frustum instanceof OrthographicFrustum_default) { + frustumType = ORTHOGRAPHIC; + frustumPackedLength = OrthographicFrustum_default.packedLength; + } + this._frustumType = frustumType; + this._frustum = frustum.clone(); + this._origin = Cartesian3_default.clone(origin); + this._orientation = Quaternion_default.clone(orientation); + this._drawNearPlane = drawNearPlane; + this._workerName = "createFrustumOutlineGeometry"; + this.packedLength = 2 + frustumPackedLength + Cartesian3_default.packedLength + Quaternion_default.packedLength; +} +FrustumOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const frustumType = value._frustumType; + const frustum = value._frustum; + array[startingIndex++] = frustumType; + if (frustumType === PERSPECTIVE) { + PerspectiveFrustum_default.pack(frustum, array, startingIndex); + startingIndex += PerspectiveFrustum_default.packedLength; + } else { + OrthographicFrustum_default.pack(frustum, array, startingIndex); + startingIndex += OrthographicFrustum_default.packedLength; + } + Cartesian3_default.pack(value._origin, array, startingIndex); + startingIndex += Cartesian3_default.packedLength; + Quaternion_default.pack(value._orientation, array, startingIndex); + startingIndex += Quaternion_default.packedLength; + array[startingIndex] = value._drawNearPlane ? 1 : 0; + return array; +}; +var scratchPackPerspective = new PerspectiveFrustum_default(); +var scratchPackOrthographic = new OrthographicFrustum_default(); +var scratchPackQuaternion = new Quaternion_default(); +var scratchPackorigin = new Cartesian3_default(); +FrustumOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const frustumType = array[startingIndex++]; + let frustum; + if (frustumType === PERSPECTIVE) { + frustum = PerspectiveFrustum_default.unpack( + array, + startingIndex, + scratchPackPerspective + ); + startingIndex += PerspectiveFrustum_default.packedLength; + } else { + frustum = OrthographicFrustum_default.unpack( + array, + startingIndex, + scratchPackOrthographic + ); + startingIndex += OrthographicFrustum_default.packedLength; + } + const origin = Cartesian3_default.unpack(array, startingIndex, scratchPackorigin); + startingIndex += Cartesian3_default.packedLength; + const orientation = Quaternion_default.unpack( + array, + startingIndex, + scratchPackQuaternion + ); + startingIndex += Quaternion_default.packedLength; + const drawNearPlane = array[startingIndex] === 1; + if (!defined_default(result)) { + return new FrustumOutlineGeometry({ + frustum, + origin, + orientation, + _drawNearPlane: drawNearPlane + }); + } + const frustumResult = frustumType === result._frustumType ? result._frustum : void 0; + result._frustum = frustum.clone(frustumResult); + result._frustumType = frustumType; + result._origin = Cartesian3_default.clone(origin, result._origin); + result._orientation = Quaternion_default.clone(orientation, result._orientation); + result._drawNearPlane = drawNearPlane; + return result; +}; +FrustumOutlineGeometry.createGeometry = function(frustumGeometry) { + const frustumType = frustumGeometry._frustumType; + const frustum = frustumGeometry._frustum; + const origin = frustumGeometry._origin; + const orientation = frustumGeometry._orientation; + const drawNearPlane = frustumGeometry._drawNearPlane; + const positions = new Float64Array(3 * 4 * 2); + FrustumGeometry_default._computeNearFarPlanes( + origin, + orientation, + frustumType, + frustum, + positions + ); + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }) + }); + let offset; + let index; + const numberOfPlanes = drawNearPlane ? 2 : 1; + const indices = new Uint16Array(8 * (numberOfPlanes + 1)); + let i = drawNearPlane ? 0 : 1; + for (; i < 2; ++i) { + offset = drawNearPlane ? i * 8 : 0; + index = i * 4; + indices[offset] = index; + indices[offset + 1] = index + 1; + indices[offset + 2] = index + 1; + indices[offset + 3] = index + 2; + indices[offset + 4] = index + 2; + indices[offset + 5] = index + 3; + indices[offset + 6] = index + 3; + indices[offset + 7] = index; + } + for (i = 0; i < 2; ++i) { + offset = (numberOfPlanes + i) * 8; + index = i * 4; + indices[offset] = index; + indices[offset + 1] = index + 4; + indices[offset + 2] = index + 1; + indices[offset + 3] = index + 5; + indices[offset + 4] = index + 2; + indices[offset + 5] = index + 6; + indices[offset + 6] = index + 3; + indices[offset + 7] = index + 7; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: BoundingSphere_default.fromVertices(positions) + }); +}; +var FrustumOutlineGeometry_default = FrustumOutlineGeometry; + +// packages/engine/Source/Workers/createFrustumOutlineGeometry.js +function createFrustumOutlineGeometry(frustumGeometry, offset) { + if (defined_default(offset)) { + frustumGeometry = FrustumOutlineGeometry_default.unpack(frustumGeometry, offset); + } + return FrustumOutlineGeometry_default.createGeometry(frustumGeometry); +} +var createFrustumOutlineGeometry_default = createFrustumOutlineGeometry; +export { + createFrustumOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createGeometry.js b/public/assets/cesium/Workers/createGeometry.js new file mode 100644 index 0000000..9c37e4d --- /dev/null +++ b/public/assets/cesium/Workers/createGeometry.js @@ -0,0 +1,169 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + PrimitivePipeline_default +} from "./chunk-IBRIWOCM.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import "./chunk-RJM36CNY.js"; +import "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + __glob, + __require, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// import("./**/*.js") in packages/engine/Source/Workers/createGeometry.js +var globImport_js = __glob({ + "./combineGeometry.js": () => import("./combineGeometry.js"), + "./createBoxGeometry.js": () => import("./createBoxGeometry.js"), + "./createBoxOutlineGeometry.js": () => import("./createBoxOutlineGeometry.js"), + "./createCircleGeometry.js": () => import("./createCircleGeometry.js"), + "./createCircleOutlineGeometry.js": () => import("./createCircleOutlineGeometry.js"), + "./createCoplanarPolygonGeometry.js": () => import("./createCoplanarPolygonGeometry.js"), + "./createCoplanarPolygonOutlineGeometry.js": () => import("./createCoplanarPolygonOutlineGeometry.js"), + "./createCorridorGeometry.js": () => import("./createCorridorGeometry.js"), + "./createCorridorOutlineGeometry.js": () => import("./createCorridorOutlineGeometry.js"), + "./createCylinderGeometry.js": () => import("./createCylinderGeometry.js"), + "./createCylinderOutlineGeometry.js": () => import("./createCylinderOutlineGeometry.js"), + "./createEllipseGeometry.js": () => import("./createEllipseGeometry.js"), + "./createEllipseOutlineGeometry.js": () => import("./createEllipseOutlineGeometry.js"), + "./createEllipsoidGeometry.js": () => import("./createEllipsoidGeometry.js"), + "./createEllipsoidOutlineGeometry.js": () => import("./createEllipsoidOutlineGeometry.js"), + "./createFrustumGeometry.js": () => import("./createFrustumGeometry.js"), + "./createFrustumOutlineGeometry.js": () => import("./createFrustumOutlineGeometry.js"), + "./createGeometry.js": () => import("./createGeometry.js"), + "./createGroundPolylineGeometry.js": () => import("./createGroundPolylineGeometry.js"), + "./createPlaneGeometry.js": () => import("./createPlaneGeometry.js"), + "./createPlaneOutlineGeometry.js": () => import("./createPlaneOutlineGeometry.js"), + "./createPolygonGeometry.js": () => import("./createPolygonGeometry.js"), + "./createPolygonOutlineGeometry.js": () => import("./createPolygonOutlineGeometry.js"), + "./createPolylineGeometry.js": () => import("./createPolylineGeometry.js"), + "./createPolylineVolumeGeometry.js": () => import("./createPolylineVolumeGeometry.js"), + "./createPolylineVolumeOutlineGeometry.js": () => import("./createPolylineVolumeOutlineGeometry.js"), + "./createRectangleGeometry.js": () => import("./createRectangleGeometry.js"), + "./createRectangleOutlineGeometry.js": () => import("./createRectangleOutlineGeometry.js"), + "./createSimplePolylineGeometry.js": () => import("./createSimplePolylineGeometry.js"), + "./createSphereGeometry.js": () => import("./createSphereGeometry.js"), + "./createSphereOutlineGeometry.js": () => import("./createSphereOutlineGeometry.js"), + "./createTaskProcessorWorker.js": () => import("./createTaskProcessorWorker.js"), + "./createVectorTileClampedPolylines.js": () => import("./createVectorTileClampedPolylines.js"), + "./createVectorTileGeometries.js": () => import("./createVectorTileGeometries.js"), + "./createVectorTilePoints.js": () => import("./createVectorTilePoints.js"), + "./createVectorTilePolygons.js": () => import("./createVectorTilePolygons.js"), + "./createVectorTilePolylines.js": () => import("./createVectorTilePolylines.js"), + "./createVerticesFromGoogleEarthEnterpriseBuffer.js": () => import("./createVerticesFromGoogleEarthEnterpriseBuffer.js"), + "./createVerticesFromHeightmap.js": () => import("./createVerticesFromHeightmap.js"), + "./createVerticesFromQuantizedTerrainMesh.js": () => import("./createVerticesFromQuantizedTerrainMesh.js"), + "./createWallGeometry.js": () => import("./createWallGeometry.js"), + "./createWallOutlineGeometry.js": () => import("./createWallOutlineGeometry.js"), + "./decodeDraco.js": () => import("./decodeDraco.js"), + "./decodeGoogleEarthEnterprisePacket.js": () => import("./decodeGoogleEarthEnterprisePacket.js"), + "./decodeI3S.js": () => import("./decodeI3S.js"), + "./transcodeKTX2.js": () => import("./transcodeKTX2.js"), + "./transferTypedArrayTest.js": () => import("./transferTypedArrayTest.js"), + "./upsampleQuantizedTerrainMesh.js": () => import("./upsampleQuantizedTerrainMesh.js") +}); + +// packages/engine/Source/Workers/createGeometry.js +var moduleCache = {}; +async function getModule(moduleName, modulePath) { + let module = defaultValue_default(moduleCache[modulePath], moduleCache[moduleName]); + if (defined_default(module)) { + return module; + } + if (defined_default(modulePath)) { + if (typeof exports === "object") { + module = __require(modulePath); + } else { + const result = await import(modulePath); + module = result.default; + } + moduleCache[modulePath] = module; + return module; + } + if (typeof exports === "object") { + module = __require(`Workers/${moduleName}`); + } else { + const result = defined_default(modulePath) ? await import(modulePath) : await globImport_js(`./${moduleName}.js`); + module = result.default; + } + moduleCache[moduleName] = module; + return module; +} +async function createGeometry(parameters, transferableObjects) { + const subTasks = parameters.subTasks; + const length = subTasks.length; + const resultsOrPromises = new Array(length); + for (let i = 0; i < length; i++) { + const task = subTasks[i]; + const geometry = task.geometry; + const moduleName = task.moduleName; + const modulePath = task.modulePath; + if (defined_default(moduleName) && defined_default(modulePath)) { + throw new DeveloperError_default("Must only set moduleName or modulePath"); + } + if (defined_default(moduleName) || defined_default(modulePath)) { + resultsOrPromises[i] = getModule( + moduleName, + modulePath + ).then((createFunction) => createFunction(geometry, task.offset)); + } else { + resultsOrPromises[i] = geometry; + } + } + return Promise.all(resultsOrPromises).then(function(results) { + return PrimitivePipeline_default.packCreateGeometryResults( + results, + transferableObjects + ); + }); +} +var createGeometry_default = createTaskProcessorWorker_default(createGeometry); +export { + createGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createGroundPolylineGeometry.js b/public/assets/cesium/Workers/createGroundPolylineGeometry.js new file mode 100644 index 0000000..bd71dce --- /dev/null +++ b/public/assets/cesium/Workers/createGroundPolylineGeometry.js @@ -0,0 +1,1606 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + EncodedCartesian3_default +} from "./chunk-NGZJIN5Z.js"; +import { + EllipsoidGeodesic_default +} from "./chunk-C3EQ27WF.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import { + EllipsoidRhumbLine_default +} from "./chunk-JSQJDZI4.js"; +import { + IntersectionTests_default +} from "./chunk-QQOZO7KO.js"; +import { + Plane_default +} from "./chunk-EDLRS3AW.js"; +import { + GeometryAttribute_default, + Geometry_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default, + GeographicProjection_default +} from "./chunk-KHZNBFOH.js"; +import { + Quaternion_default, + Rectangle_default, + Resource_default, + buildModuleUrl_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/GeographicTilingScheme.js +function GeographicTilingScheme(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + this._ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + this._rectangle = defaultValue_default(options.rectangle, Rectangle_default.MAX_VALUE); + this._projection = new GeographicProjection_default(this._ellipsoid); + this._numberOfLevelZeroTilesX = defaultValue_default( + options.numberOfLevelZeroTilesX, + 2 + ); + this._numberOfLevelZeroTilesY = defaultValue_default( + options.numberOfLevelZeroTilesY, + 1 + ); +} +Object.defineProperties(GeographicTilingScheme.prototype, { + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this._ellipsoid; + } + }, + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {Rectangle} + */ + rectangle: { + get: function() { + return this._rectangle; + } + }, + /** + * Gets the map projection used by this tiling scheme. + * @memberof GeographicTilingScheme.prototype + * @type {MapProjection} + */ + projection: { + get: function() { + return this._projection; + } + } +}); +GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function(level) { + return this._numberOfLevelZeroTilesX << level; +}; +GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function(level) { + return this._numberOfLevelZeroTilesY << level; +}; +GeographicTilingScheme.prototype.rectangleToNativeRectangle = function(rectangle, result) { + Check_default.defined("rectangle", rectangle); + const west = Math_default.toDegrees(rectangle.west); + const south = Math_default.toDegrees(rectangle.south); + const east = Math_default.toDegrees(rectangle.east); + const north = Math_default.toDegrees(rectangle.north); + if (!defined_default(result)) { + return new Rectangle_default(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +GeographicTilingScheme.prototype.tileXYToNativeRectangle = function(x, y, level, result) { + const rectangleRadians = this.tileXYToRectangle(x, y, level, result); + rectangleRadians.west = Math_default.toDegrees(rectangleRadians.west); + rectangleRadians.south = Math_default.toDegrees(rectangleRadians.south); + rectangleRadians.east = Math_default.toDegrees(rectangleRadians.east); + rectangleRadians.north = Math_default.toDegrees(rectangleRadians.north); + return rectangleRadians; +}; +GeographicTilingScheme.prototype.tileXYToRectangle = function(x, y, level, result) { + const rectangle = this._rectangle; + const xTiles = this.getNumberOfXTilesAtLevel(level); + const yTiles = this.getNumberOfYTilesAtLevel(level); + const xTileWidth = rectangle.width / xTiles; + const west = x * xTileWidth + rectangle.west; + const east = (x + 1) * xTileWidth + rectangle.west; + const yTileHeight = rectangle.height / yTiles; + const north = rectangle.north - y * yTileHeight; + const south = rectangle.north - (y + 1) * yTileHeight; + if (!defined_default(result)) { + result = new Rectangle_default(west, south, east, north); + } + result.west = west; + result.south = south; + result.east = east; + result.north = north; + return result; +}; +GeographicTilingScheme.prototype.positionToTileXY = function(position, level, result) { + const rectangle = this._rectangle; + if (!Rectangle_default.contains(rectangle, position)) { + return void 0; + } + const xTiles = this.getNumberOfXTilesAtLevel(level); + const yTiles = this.getNumberOfYTilesAtLevel(level); + const xTileWidth = rectangle.width / xTiles; + const yTileHeight = rectangle.height / yTiles; + let longitude = position.longitude; + if (rectangle.east < rectangle.west) { + longitude += Math_default.TWO_PI; + } + let xTileCoordinate = (longitude - rectangle.west) / xTileWidth | 0; + if (xTileCoordinate >= xTiles) { + xTileCoordinate = xTiles - 1; + } + let yTileCoordinate = (rectangle.north - position.latitude) / yTileHeight | 0; + if (yTileCoordinate >= yTiles) { + yTileCoordinate = yTiles - 1; + } + if (!defined_default(result)) { + return new Cartesian2_default(xTileCoordinate, yTileCoordinate); + } + result.x = xTileCoordinate; + result.y = yTileCoordinate; + return result; +}; +var GeographicTilingScheme_default = GeographicTilingScheme; + +// packages/engine/Source/Core/ApproximateTerrainHeights.js +var scratchDiagonalCartesianNE = new Cartesian3_default(); +var scratchDiagonalCartesianSW = new Cartesian3_default(); +var scratchDiagonalCartographic = new Cartographic_default(); +var scratchCenterCartesian = new Cartesian3_default(); +var scratchSurfaceCartesian = new Cartesian3_default(); +var scratchBoundingSphere = new BoundingSphere_default(); +var tilingScheme = new GeographicTilingScheme_default(); +var scratchCorners = [ + new Cartographic_default(), + new Cartographic_default(), + new Cartographic_default(), + new Cartographic_default() +]; +var scratchTileXY = new Cartesian2_default(); +var ApproximateTerrainHeights = {}; +ApproximateTerrainHeights.initialize = function() { + let initPromise = ApproximateTerrainHeights._initPromise; + if (defined_default(initPromise)) { + return initPromise; + } + initPromise = Resource_default.fetchJson( + buildModuleUrl_default("Assets/approximateTerrainHeights.json") + ).then(function(json) { + ApproximateTerrainHeights._terrainHeights = json; + }); + ApproximateTerrainHeights._initPromise = initPromise; + return initPromise; +}; +ApproximateTerrainHeights.getMinimumMaximumHeights = function(rectangle, ellipsoid) { + Check_default.defined("rectangle", rectangle); + if (!defined_default(ApproximateTerrainHeights._terrainHeights)) { + throw new DeveloperError_default( + "You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function" + ); + } + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + const xyLevel = getTileXYLevel(rectangle); + let minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight; + let maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight; + if (defined_default(xyLevel)) { + const key = `${xyLevel.level}-${xyLevel.x}-${xyLevel.y}`; + const heights = ApproximateTerrainHeights._terrainHeights[key]; + if (defined_default(heights)) { + minTerrainHeight = heights[0]; + maxTerrainHeight = heights[1]; + } + ellipsoid.cartographicToCartesian( + Rectangle_default.northeast(rectangle, scratchDiagonalCartographic), + scratchDiagonalCartesianNE + ); + ellipsoid.cartographicToCartesian( + Rectangle_default.southwest(rectangle, scratchDiagonalCartographic), + scratchDiagonalCartesianSW + ); + Cartesian3_default.midpoint( + scratchDiagonalCartesianSW, + scratchDiagonalCartesianNE, + scratchCenterCartesian + ); + const surfacePosition = ellipsoid.scaleToGeodeticSurface( + scratchCenterCartesian, + scratchSurfaceCartesian + ); + if (defined_default(surfacePosition)) { + const distance = Cartesian3_default.distance( + scratchCenterCartesian, + surfacePosition + ); + minTerrainHeight = Math.min(minTerrainHeight, -distance); + } else { + minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight; + } + } + minTerrainHeight = Math.max( + ApproximateTerrainHeights._defaultMinTerrainHeight, + minTerrainHeight + ); + return { + minimumTerrainHeight: minTerrainHeight, + maximumTerrainHeight: maxTerrainHeight + }; +}; +ApproximateTerrainHeights.getBoundingSphere = function(rectangle, ellipsoid) { + Check_default.defined("rectangle", rectangle); + if (!defined_default(ApproximateTerrainHeights._terrainHeights)) { + throw new DeveloperError_default( + "You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function" + ); + } + ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.default); + const xyLevel = getTileXYLevel(rectangle); + let maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight; + if (defined_default(xyLevel)) { + const key = `${xyLevel.level}-${xyLevel.x}-${xyLevel.y}`; + const heights = ApproximateTerrainHeights._terrainHeights[key]; + if (defined_default(heights)) { + maxTerrainHeight = heights[1]; + } + } + const result = BoundingSphere_default.fromRectangle3D(rectangle, ellipsoid, 0); + BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + maxTerrainHeight, + scratchBoundingSphere + ); + return BoundingSphere_default.union(result, scratchBoundingSphere, result); +}; +function getTileXYLevel(rectangle) { + Cartographic_default.fromRadians( + rectangle.east, + rectangle.north, + 0, + scratchCorners[0] + ); + Cartographic_default.fromRadians( + rectangle.west, + rectangle.north, + 0, + scratchCorners[1] + ); + Cartographic_default.fromRadians( + rectangle.east, + rectangle.south, + 0, + scratchCorners[2] + ); + Cartographic_default.fromRadians( + rectangle.west, + rectangle.south, + 0, + scratchCorners[3] + ); + let lastLevelX = 0, lastLevelY = 0; + let currentX = 0, currentY = 0; + const maxLevel = ApproximateTerrainHeights._terrainHeightsMaxLevel; + let i; + for (i = 0; i <= maxLevel; ++i) { + let failed = false; + for (let j = 0; j < 4; ++j) { + const corner = scratchCorners[j]; + tilingScheme.positionToTileXY(corner, i, scratchTileXY); + if (j === 0) { + currentX = scratchTileXY.x; + currentY = scratchTileXY.y; + } else if (currentX !== scratchTileXY.x || currentY !== scratchTileXY.y) { + failed = true; + break; + } + } + if (failed) { + break; + } + lastLevelX = currentX; + lastLevelY = currentY; + } + if (i === 0) { + return void 0; + } + return { + x: lastLevelX, + y: lastLevelY, + level: i > maxLevel ? maxLevel : i - 1 + }; +} +ApproximateTerrainHeights._terrainHeightsMaxLevel = 6; +ApproximateTerrainHeights._defaultMaxTerrainHeight = 9e3; +ApproximateTerrainHeights._defaultMinTerrainHeight = -1e5; +ApproximateTerrainHeights._terrainHeights = void 0; +ApproximateTerrainHeights._initPromise = void 0; +Object.defineProperties(ApproximateTerrainHeights, { + /** + * Determines if the terrain heights are initialized and ready to use. To initialize the terrain heights, + * call {@link ApproximateTerrainHeights#initialize} and wait for the returned promise to resolve. + * @type {boolean} + * @readonly + * @memberof ApproximateTerrainHeights + */ + initialized: { + get: function() { + return defined_default(ApproximateTerrainHeights._terrainHeights); + } + } +}); +var ApproximateTerrainHeights_default = ApproximateTerrainHeights; + +// packages/engine/Source/Core/GroundPolylineGeometry.js +var PROJECTIONS = [GeographicProjection_default, WebMercatorProjection_default]; +var PROJECTION_COUNT = PROJECTIONS.length; +var MITER_BREAK_SMALL = Math.cos(Math_default.toRadians(30)); +var MITER_BREAK_LARGE = Math.cos(Math_default.toRadians(150)); +var WALL_INITIAL_MIN_HEIGHT = 0; +var WALL_INITIAL_MAX_HEIGHT = 1e3; +function GroundPolylineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + if (!defined_default(positions) || positions.length < 2) { + throw new DeveloperError_default("At least two positions are required."); + } + if (defined_default(options.arcType) && options.arcType !== ArcType_default.GEODESIC && options.arcType !== ArcType_default.RHUMB) { + throw new DeveloperError_default( + "Valid options for arcType are ArcType.GEODESIC and ArcType.RHUMB." + ); + } + this.width = defaultValue_default(options.width, 1); + this._positions = positions; + this.granularity = defaultValue_default(options.granularity, 9999); + this.loop = defaultValue_default(options.loop, false); + this.arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC); + this._ellipsoid = Ellipsoid_default.default; + this._projectionIndex = 0; + this._workerName = "createGroundPolylineGeometry"; + this._scene3DOnly = false; +} +Object.defineProperties(GroundPolylineGeometry.prototype, { + /** + * The number of elements used to pack the object into an array. + * @memberof GroundPolylineGeometry.prototype + * @type {number} + * @readonly + * @private + */ + packedLength: { + get: function() { + return 1 + this._positions.length * 3 + 1 + 1 + 1 + Ellipsoid_default.packedLength + 1 + 1; + } + } +}); +GroundPolylineGeometry.setProjectionAndEllipsoid = function(groundPolylineGeometry, mapProjection) { + let projectionIndex = 0; + for (let i = 0; i < PROJECTION_COUNT; i++) { + if (mapProjection instanceof PROJECTIONS[i]) { + projectionIndex = i; + break; + } + } + groundPolylineGeometry._projectionIndex = projectionIndex; + groundPolylineGeometry._ellipsoid = mapProjection.ellipsoid; +}; +var cart3Scratch1 = new Cartesian3_default(); +var cart3Scratch2 = new Cartesian3_default(); +var cart3Scratch3 = new Cartesian3_default(); +function computeRightNormal(start, end, maxHeight, ellipsoid, result) { + const startBottom = getPosition(ellipsoid, start, 0, cart3Scratch1); + const startTop = getPosition(ellipsoid, start, maxHeight, cart3Scratch2); + const endBottom = getPosition(ellipsoid, end, 0, cart3Scratch3); + const up = direction(startTop, startBottom, cart3Scratch2); + const forward = direction(endBottom, startBottom, cart3Scratch3); + Cartesian3_default.cross(forward, up, result); + return Cartesian3_default.normalize(result, result); +} +var interpolatedCartographicScratch = new Cartographic_default(); +var interpolatedBottomScratch = new Cartesian3_default(); +var interpolatedTopScratch = new Cartesian3_default(); +var interpolatedNormalScratch = new Cartesian3_default(); +function interpolateSegment(start, end, minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray) { + if (granularity === 0) { + return; + } + let ellipsoidLine; + if (arcType === ArcType_default.GEODESIC) { + ellipsoidLine = new EllipsoidGeodesic_default(start, end, ellipsoid); + } else if (arcType === ArcType_default.RHUMB) { + ellipsoidLine = new EllipsoidRhumbLine_default(start, end, ellipsoid); + } + const surfaceDistance = ellipsoidLine.surfaceDistance; + if (surfaceDistance < granularity) { + return; + } + const interpolatedNormal = computeRightNormal( + start, + end, + maxHeight, + ellipsoid, + interpolatedNormalScratch + ); + const segments = Math.ceil(surfaceDistance / granularity); + const interpointDistance = surfaceDistance / segments; + let distanceFromStart = interpointDistance; + const pointsToAdd = segments - 1; + let packIndex = normalsArray.length; + for (let i = 0; i < pointsToAdd; i++) { + const interpolatedCartographic = ellipsoidLine.interpolateUsingSurfaceDistance( + distanceFromStart, + interpolatedCartographicScratch + ); + const interpolatedBottom = getPosition( + ellipsoid, + interpolatedCartographic, + minHeight, + interpolatedBottomScratch + ); + const interpolatedTop = getPosition( + ellipsoid, + interpolatedCartographic, + maxHeight, + interpolatedTopScratch + ); + Cartesian3_default.pack(interpolatedNormal, normalsArray, packIndex); + Cartesian3_default.pack(interpolatedBottom, bottomPositionsArray, packIndex); + Cartesian3_default.pack(interpolatedTop, topPositionsArray, packIndex); + cartographicsArray.push(interpolatedCartographic.latitude); + cartographicsArray.push(interpolatedCartographic.longitude); + packIndex += 3; + distanceFromStart += interpointDistance; + } +} +var heightlessCartographicScratch = new Cartographic_default(); +function getPosition(ellipsoid, cartographic, height, result) { + Cartographic_default.clone(cartographic, heightlessCartographicScratch); + heightlessCartographicScratch.height = height; + return Cartographic_default.toCartesian( + heightlessCartographicScratch, + ellipsoid, + result + ); +} +GroundPolylineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + let index = defaultValue_default(startingIndex, 0); + const positions = value._positions; + const positionsLength = positions.length; + array[index++] = positionsLength; + for (let i = 0; i < positionsLength; ++i) { + const cartesian = positions[i]; + Cartesian3_default.pack(cartesian, array, index); + index += 3; + } + array[index++] = value.granularity; + array[index++] = value.loop ? 1 : 0; + array[index++] = value.arcType; + Ellipsoid_default.pack(value._ellipsoid, array, index); + index += Ellipsoid_default.packedLength; + array[index++] = value._projectionIndex; + array[index++] = value._scene3DOnly ? 1 : 0; + return array; +}; +GroundPolylineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + let index = defaultValue_default(startingIndex, 0); + const positionsLength = array[index++]; + const positions = new Array(positionsLength); + for (let i = 0; i < positionsLength; i++) { + positions[i] = Cartesian3_default.unpack(array, index); + index += 3; + } + const granularity = array[index++]; + const loop = array[index++] === 1; + const arcType = array[index++]; + const ellipsoid = Ellipsoid_default.unpack(array, index); + index += Ellipsoid_default.packedLength; + const projectionIndex = array[index++]; + const scene3DOnly = array[index++] === 1; + if (!defined_default(result)) { + result = new GroundPolylineGeometry({ + positions + }); + } + result._positions = positions; + result.granularity = granularity; + result.loop = loop; + result.arcType = arcType; + result._ellipsoid = ellipsoid; + result._projectionIndex = projectionIndex; + result._scene3DOnly = scene3DOnly; + return result; +}; +function direction(target, origin, result) { + Cartesian3_default.subtract(target, origin, result); + Cartesian3_default.normalize(result, result); + return result; +} +function tangentDirection(target, origin, up, result) { + result = direction(target, origin, result); + result = Cartesian3_default.cross(result, up, result); + result = Cartesian3_default.normalize(result, result); + result = Cartesian3_default.cross(up, result, result); + return result; +} +var toPreviousScratch = new Cartesian3_default(); +var toNextScratch = new Cartesian3_default(); +var forwardScratch = new Cartesian3_default(); +var vertexUpScratch = new Cartesian3_default(); +var cosine90 = 0; +var cosine180 = -1; +function computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, result) { + const up = direction(vertexTop, vertexBottom, vertexUpScratch); + const toPrevious = tangentDirection( + previousBottom, + vertexBottom, + up, + toPreviousScratch + ); + const toNext = tangentDirection(nextBottom, vertexBottom, up, toNextScratch); + if (Math_default.equalsEpsilon( + Cartesian3_default.dot(toPrevious, toNext), + cosine180, + Math_default.EPSILON5 + )) { + result = Cartesian3_default.cross(up, toPrevious, result); + result = Cartesian3_default.normalize(result, result); + return result; + } + result = Cartesian3_default.add(toNext, toPrevious, result); + result = Cartesian3_default.normalize(result, result); + const forward = Cartesian3_default.cross(up, result, forwardScratch); + if (Cartesian3_default.dot(toNext, forward) < cosine90) { + result = Cartesian3_default.negate(result, result); + } + return result; +} +var XZ_PLANE = Plane_default.fromPointNormal(Cartesian3_default.ZERO, Cartesian3_default.UNIT_Y); +var previousBottomScratch = new Cartesian3_default(); +var vertexBottomScratch = new Cartesian3_default(); +var vertexTopScratch = new Cartesian3_default(); +var nextBottomScratch = new Cartesian3_default(); +var vertexNormalScratch = new Cartesian3_default(); +var intersectionScratch = new Cartesian3_default(); +var cartographicScratch0 = new Cartographic_default(); +var cartographicScratch1 = new Cartographic_default(); +var cartographicIntersectionScratch = new Cartographic_default(); +GroundPolylineGeometry.createGeometry = function(groundPolylineGeometry) { + const compute2dAttributes = !groundPolylineGeometry._scene3DOnly; + let loop = groundPolylineGeometry.loop; + const ellipsoid = groundPolylineGeometry._ellipsoid; + const granularity = groundPolylineGeometry.granularity; + const arcType = groundPolylineGeometry.arcType; + const projection = new PROJECTIONS[groundPolylineGeometry._projectionIndex]( + ellipsoid + ); + const minHeight = WALL_INITIAL_MIN_HEIGHT; + const maxHeight = WALL_INITIAL_MAX_HEIGHT; + let index; + let i; + const positions = groundPolylineGeometry._positions; + const positionsLength = positions.length; + if (positionsLength === 2) { + loop = false; + } + let p0; + let p1; + let c0; + let c1; + const rhumbLine = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid); + let intersection; + let intersectionCartographic; + let intersectionLongitude; + const splitPositions = [positions[0]]; + for (i = 0; i < positionsLength - 1; i++) { + p0 = positions[i]; + p1 = positions[i + 1]; + intersection = IntersectionTests_default.lineSegmentPlane( + p0, + p1, + XZ_PLANE, + intersectionScratch + ); + if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) { + if (groundPolylineGeometry.arcType === ArcType_default.GEODESIC) { + splitPositions.push(Cartesian3_default.clone(intersection)); + } else if (groundPolylineGeometry.arcType === ArcType_default.RHUMB) { + intersectionLongitude = ellipsoid.cartesianToCartographic( + intersection, + cartographicScratch0 + ).longitude; + c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0); + c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1); + rhumbLine.setEndPoints(c0, c1); + intersectionCartographic = rhumbLine.findIntersectionWithLongitude( + intersectionLongitude, + cartographicIntersectionScratch + ); + intersection = ellipsoid.cartographicToCartesian( + intersectionCartographic, + intersectionScratch + ); + if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) { + splitPositions.push(Cartesian3_default.clone(intersection)); + } + } + } + splitPositions.push(p1); + } + if (loop) { + p0 = positions[positionsLength - 1]; + p1 = positions[0]; + intersection = IntersectionTests_default.lineSegmentPlane( + p0, + p1, + XZ_PLANE, + intersectionScratch + ); + if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) { + if (groundPolylineGeometry.arcType === ArcType_default.GEODESIC) { + splitPositions.push(Cartesian3_default.clone(intersection)); + } else if (groundPolylineGeometry.arcType === ArcType_default.RHUMB) { + intersectionLongitude = ellipsoid.cartesianToCartographic( + intersection, + cartographicScratch0 + ).longitude; + c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0); + c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1); + rhumbLine.setEndPoints(c0, c1); + intersectionCartographic = rhumbLine.findIntersectionWithLongitude( + intersectionLongitude, + cartographicIntersectionScratch + ); + intersection = ellipsoid.cartographicToCartesian( + intersectionCartographic, + intersectionScratch + ); + if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) { + splitPositions.push(Cartesian3_default.clone(intersection)); + } + } + } + } + let cartographicsLength = splitPositions.length; + let cartographics = new Array(cartographicsLength); + for (i = 0; i < cartographicsLength; i++) { + const cartographic = Cartographic_default.fromCartesian( + splitPositions[i], + ellipsoid + ); + cartographic.height = 0; + cartographics[i] = cartographic; + } + cartographics = arrayRemoveDuplicates_default( + cartographics, + Cartographic_default.equalsEpsilon + ); + cartographicsLength = cartographics.length; + if (cartographicsLength < 2) { + return void 0; + } + const cartographicsArray = []; + const normalsArray = []; + const bottomPositionsArray = []; + const topPositionsArray = []; + let previousBottom = previousBottomScratch; + let vertexBottom = vertexBottomScratch; + let vertexTop = vertexTopScratch; + let nextBottom = nextBottomScratch; + let vertexNormal = vertexNormalScratch; + const startCartographic = cartographics[0]; + const nextCartographic = cartographics[1]; + const prestartCartographic = cartographics[cartographicsLength - 1]; + previousBottom = getPosition( + ellipsoid, + prestartCartographic, + minHeight, + previousBottom + ); + nextBottom = getPosition(ellipsoid, nextCartographic, minHeight, nextBottom); + vertexBottom = getPosition( + ellipsoid, + startCartographic, + minHeight, + vertexBottom + ); + vertexTop = getPosition(ellipsoid, startCartographic, maxHeight, vertexTop); + if (loop) { + vertexNormal = computeVertexMiterNormal( + previousBottom, + vertexBottom, + vertexTop, + nextBottom, + vertexNormal + ); + } else { + vertexNormal = computeRightNormal( + startCartographic, + nextCartographic, + maxHeight, + ellipsoid, + vertexNormal + ); + } + Cartesian3_default.pack(vertexNormal, normalsArray, 0); + Cartesian3_default.pack(vertexBottom, bottomPositionsArray, 0); + Cartesian3_default.pack(vertexTop, topPositionsArray, 0); + cartographicsArray.push(startCartographic.latitude); + cartographicsArray.push(startCartographic.longitude); + interpolateSegment( + startCartographic, + nextCartographic, + minHeight, + maxHeight, + granularity, + arcType, + ellipsoid, + normalsArray, + bottomPositionsArray, + topPositionsArray, + cartographicsArray + ); + for (i = 1; i < cartographicsLength - 1; ++i) { + previousBottom = Cartesian3_default.clone(vertexBottom, previousBottom); + vertexBottom = Cartesian3_default.clone(nextBottom, vertexBottom); + const vertexCartographic = cartographics[i]; + getPosition(ellipsoid, vertexCartographic, maxHeight, vertexTop); + getPosition(ellipsoid, cartographics[i + 1], minHeight, nextBottom); + computeVertexMiterNormal( + previousBottom, + vertexBottom, + vertexTop, + nextBottom, + vertexNormal + ); + index = normalsArray.length; + Cartesian3_default.pack(vertexNormal, normalsArray, index); + Cartesian3_default.pack(vertexBottom, bottomPositionsArray, index); + Cartesian3_default.pack(vertexTop, topPositionsArray, index); + cartographicsArray.push(vertexCartographic.latitude); + cartographicsArray.push(vertexCartographic.longitude); + interpolateSegment( + cartographics[i], + cartographics[i + 1], + minHeight, + maxHeight, + granularity, + arcType, + ellipsoid, + normalsArray, + bottomPositionsArray, + topPositionsArray, + cartographicsArray + ); + } + const endCartographic = cartographics[cartographicsLength - 1]; + const preEndCartographic = cartographics[cartographicsLength - 2]; + vertexBottom = getPosition( + ellipsoid, + endCartographic, + minHeight, + vertexBottom + ); + vertexTop = getPosition(ellipsoid, endCartographic, maxHeight, vertexTop); + if (loop) { + const postEndCartographic = cartographics[0]; + previousBottom = getPosition( + ellipsoid, + preEndCartographic, + minHeight, + previousBottom + ); + nextBottom = getPosition( + ellipsoid, + postEndCartographic, + minHeight, + nextBottom + ); + vertexNormal = computeVertexMiterNormal( + previousBottom, + vertexBottom, + vertexTop, + nextBottom, + vertexNormal + ); + } else { + vertexNormal = computeRightNormal( + preEndCartographic, + endCartographic, + maxHeight, + ellipsoid, + vertexNormal + ); + } + index = normalsArray.length; + Cartesian3_default.pack(vertexNormal, normalsArray, index); + Cartesian3_default.pack(vertexBottom, bottomPositionsArray, index); + Cartesian3_default.pack(vertexTop, topPositionsArray, index); + cartographicsArray.push(endCartographic.latitude); + cartographicsArray.push(endCartographic.longitude); + if (loop) { + interpolateSegment( + endCartographic, + startCartographic, + minHeight, + maxHeight, + granularity, + arcType, + ellipsoid, + normalsArray, + bottomPositionsArray, + topPositionsArray, + cartographicsArray + ); + index = normalsArray.length; + for (i = 0; i < 3; ++i) { + normalsArray[index + i] = normalsArray[i]; + bottomPositionsArray[index + i] = bottomPositionsArray[i]; + topPositionsArray[index + i] = topPositionsArray[i]; + } + cartographicsArray.push(startCartographic.latitude); + cartographicsArray.push(startCartographic.longitude); + } + return generateGeometryAttributes( + loop, + projection, + bottomPositionsArray, + topPositionsArray, + normalsArray, + cartographicsArray, + compute2dAttributes + ); +}; +var lineDirectionScratch = new Cartesian3_default(); +var matrix3Scratch = new Matrix3_default(); +var quaternionScratch = new Quaternion_default(); +function breakMiter(endGeometryNormal, startBottom, endBottom, endTop) { + const lineDirection = direction(endBottom, startBottom, lineDirectionScratch); + const dot = Cartesian3_default.dot(lineDirection, endGeometryNormal); + if (dot > MITER_BREAK_SMALL || dot < MITER_BREAK_LARGE) { + const vertexUp = direction(endTop, endBottom, vertexUpScratch); + const angle = dot < MITER_BREAK_LARGE ? Math_default.PI_OVER_TWO : -Math_default.PI_OVER_TWO; + const quaternion = Quaternion_default.fromAxisAngle( + vertexUp, + angle, + quaternionScratch + ); + const rotationMatrix = Matrix3_default.fromQuaternion(quaternion, matrix3Scratch); + Matrix3_default.multiplyByVector( + rotationMatrix, + endGeometryNormal, + endGeometryNormal + ); + return true; + } + return false; +} +var endPosCartographicScratch = new Cartographic_default(); +var normalStartpointScratch = new Cartesian3_default(); +var normalEndpointScratch = new Cartesian3_default(); +function projectNormal(projection, cartographic, normal, projectedPosition, result) { + const position = Cartographic_default.toCartesian( + cartographic, + projection._ellipsoid, + normalStartpointScratch + ); + let normalEndpoint = Cartesian3_default.add(position, normal, normalEndpointScratch); + let flipNormal = false; + const ellipsoid = projection._ellipsoid; + let normalEndpointCartographic = ellipsoid.cartesianToCartographic( + normalEndpoint, + endPosCartographicScratch + ); + if (Math.abs(cartographic.longitude - normalEndpointCartographic.longitude) > Math_default.PI_OVER_TWO) { + flipNormal = true; + normalEndpoint = Cartesian3_default.subtract( + position, + normal, + normalEndpointScratch + ); + normalEndpointCartographic = ellipsoid.cartesianToCartographic( + normalEndpoint, + endPosCartographicScratch + ); + } + normalEndpointCartographic.height = 0; + const normalEndpointProjected = projection.project( + normalEndpointCartographic, + result + ); + result = Cartesian3_default.subtract( + normalEndpointProjected, + projectedPosition, + result + ); + result.z = 0; + result = Cartesian3_default.normalize(result, result); + if (flipNormal) { + Cartesian3_default.negate(result, result); + } + return result; +} +var adjustHeightNormalScratch = new Cartesian3_default(); +var adjustHeightOffsetScratch = new Cartesian3_default(); +function adjustHeights(bottom, top, minHeight, maxHeight, adjustHeightBottom, adjustHeightTop) { + const adjustHeightNormal = Cartesian3_default.subtract( + top, + bottom, + adjustHeightNormalScratch + ); + Cartesian3_default.normalize(adjustHeightNormal, adjustHeightNormal); + const distanceForBottom = minHeight - WALL_INITIAL_MIN_HEIGHT; + let adjustHeightOffset = Cartesian3_default.multiplyByScalar( + adjustHeightNormal, + distanceForBottom, + adjustHeightOffsetScratch + ); + Cartesian3_default.add(bottom, adjustHeightOffset, adjustHeightBottom); + const distanceForTop = maxHeight - WALL_INITIAL_MAX_HEIGHT; + adjustHeightOffset = Cartesian3_default.multiplyByScalar( + adjustHeightNormal, + distanceForTop, + adjustHeightOffsetScratch + ); + Cartesian3_default.add(top, adjustHeightOffset, adjustHeightTop); +} +var nudgeDirectionScratch = new Cartesian3_default(); +function nudgeXZ(start, end) { + const startToXZdistance = Plane_default.getPointDistance(XZ_PLANE, start); + const endToXZdistance = Plane_default.getPointDistance(XZ_PLANE, end); + let offset = nudgeDirectionScratch; + if (Math_default.equalsEpsilon(startToXZdistance, 0, Math_default.EPSILON2)) { + offset = direction(end, start, offset); + Cartesian3_default.multiplyByScalar(offset, Math_default.EPSILON2, offset); + Cartesian3_default.add(start, offset, start); + } else if (Math_default.equalsEpsilon(endToXZdistance, 0, Math_default.EPSILON2)) { + offset = direction(start, end, offset); + Cartesian3_default.multiplyByScalar(offset, Math_default.EPSILON2, offset); + Cartesian3_default.add(end, offset, end); + } +} +function nudgeCartographic(start, end) { + const absStartLon = Math.abs(start.longitude); + const absEndLon = Math.abs(end.longitude); + if (Math_default.equalsEpsilon(absStartLon, Math_default.PI, Math_default.EPSILON11)) { + const endSign = Math_default.sign(end.longitude); + start.longitude = endSign * (absStartLon - Math_default.EPSILON11); + return 1; + } else if (Math_default.equalsEpsilon(absEndLon, Math_default.PI, Math_default.EPSILON11)) { + const startSign = Math_default.sign(start.longitude); + end.longitude = startSign * (absEndLon - Math_default.EPSILON11); + return 2; + } + return 0; +} +var startCartographicScratch = new Cartographic_default(); +var endCartographicScratch = new Cartographic_default(); +var segmentStartTopScratch = new Cartesian3_default(); +var segmentEndTopScratch = new Cartesian3_default(); +var segmentStartBottomScratch = new Cartesian3_default(); +var segmentEndBottomScratch = new Cartesian3_default(); +var segmentStartNormalScratch = new Cartesian3_default(); +var segmentEndNormalScratch = new Cartesian3_default(); +var getHeightCartographics = [ + startCartographicScratch, + endCartographicScratch +]; +var getHeightRectangleScratch = new Rectangle_default(); +var adjustHeightStartTopScratch = new Cartesian3_default(); +var adjustHeightEndTopScratch = new Cartesian3_default(); +var adjustHeightStartBottomScratch = new Cartesian3_default(); +var adjustHeightEndBottomScratch = new Cartesian3_default(); +var segmentStart2DScratch = new Cartesian3_default(); +var segmentEnd2DScratch = new Cartesian3_default(); +var segmentStartNormal2DScratch = new Cartesian3_default(); +var segmentEndNormal2DScratch = new Cartesian3_default(); +var offsetScratch = new Cartesian3_default(); +var startUpScratch = new Cartesian3_default(); +var endUpScratch = new Cartesian3_default(); +var rightScratch = new Cartesian3_default(); +var startPlaneNormalScratch = new Cartesian3_default(); +var endPlaneNormalScratch = new Cartesian3_default(); +var encodeScratch = new EncodedCartesian3_default(); +var encodeScratch2D = new EncodedCartesian3_default(); +var forwardOffset2DScratch = new Cartesian3_default(); +var right2DScratch = new Cartesian3_default(); +var normalNudgeScratch = new Cartesian3_default(); +var scratchBoundingSpheres = [new BoundingSphere_default(), new BoundingSphere_default()]; +var REFERENCE_INDICES = [ + 0, + 2, + 1, + 0, + 3, + 2, + // right + 0, + 7, + 3, + 0, + 4, + 7, + // start + 0, + 5, + 4, + 0, + 1, + 5, + // bottom + 5, + 7, + 4, + 5, + 6, + 7, + // left + 5, + 2, + 6, + 5, + 1, + 2, + // end + 3, + 6, + 2, + 3, + 7, + 6 + // top +]; +var REFERENCE_INDICES_LENGTH = REFERENCE_INDICES.length; +function generateGeometryAttributes(loop, projection, bottomPositionsArray, topPositionsArray, normalsArray, cartographicsArray, compute2dAttributes) { + let i; + let index; + const ellipsoid = projection._ellipsoid; + const segmentCount = bottomPositionsArray.length / 3 - 1; + const vertexCount = segmentCount * 8; + const arraySizeVec4 = vertexCount * 4; + const indexCount = segmentCount * 36; + const indices = vertexCount > 65535 ? new Uint32Array(indexCount) : new Uint16Array(indexCount); + const positionsArray = new Float64Array(vertexCount * 3); + const startHiAndForwardOffsetX = new Float32Array(arraySizeVec4); + const startLoAndForwardOffsetY = new Float32Array(arraySizeVec4); + const startNormalAndForwardOffsetZ = new Float32Array(arraySizeVec4); + const endNormalAndTextureCoordinateNormalizationX = new Float32Array( + arraySizeVec4 + ); + const rightNormalAndTextureCoordinateNormalizationY = new Float32Array( + arraySizeVec4 + ); + let startHiLo2D; + let offsetAndRight2D; + let startEndNormals2D; + let texcoordNormalization2D; + if (compute2dAttributes) { + startHiLo2D = new Float32Array(arraySizeVec4); + offsetAndRight2D = new Float32Array(arraySizeVec4); + startEndNormals2D = new Float32Array(arraySizeVec4); + texcoordNormalization2D = new Float32Array(vertexCount * 2); + } + const cartographicsLength = cartographicsArray.length / 2; + let length2D = 0; + const startCartographic = startCartographicScratch; + startCartographic.height = 0; + const endCartographic = endCartographicScratch; + endCartographic.height = 0; + let segmentStartCartesian = segmentStartTopScratch; + let segmentEndCartesian = segmentEndTopScratch; + if (compute2dAttributes) { + index = 0; + for (i = 1; i < cartographicsLength; i++) { + startCartographic.latitude = cartographicsArray[index]; + startCartographic.longitude = cartographicsArray[index + 1]; + endCartographic.latitude = cartographicsArray[index + 2]; + endCartographic.longitude = cartographicsArray[index + 3]; + segmentStartCartesian = projection.project( + startCartographic, + segmentStartCartesian + ); + segmentEndCartesian = projection.project( + endCartographic, + segmentEndCartesian + ); + length2D += Cartesian3_default.distance( + segmentStartCartesian, + segmentEndCartesian + ); + index += 2; + } + } + const positionsLength = topPositionsArray.length / 3; + segmentEndCartesian = Cartesian3_default.unpack( + topPositionsArray, + 0, + segmentEndCartesian + ); + let length3D = 0; + index = 3; + for (i = 1; i < positionsLength; i++) { + segmentStartCartesian = Cartesian3_default.clone( + segmentEndCartesian, + segmentStartCartesian + ); + segmentEndCartesian = Cartesian3_default.unpack( + topPositionsArray, + index, + segmentEndCartesian + ); + length3D += Cartesian3_default.distance(segmentStartCartesian, segmentEndCartesian); + index += 3; + } + let j; + index = 3; + let cartographicsIndex = 0; + let vec2sWriteIndex = 0; + let vec3sWriteIndex = 0; + let vec4sWriteIndex = 0; + let miterBroken = false; + let endBottom = Cartesian3_default.unpack( + bottomPositionsArray, + 0, + segmentEndBottomScratch + ); + let endTop = Cartesian3_default.unpack(topPositionsArray, 0, segmentEndTopScratch); + let endGeometryNormal = Cartesian3_default.unpack( + normalsArray, + 0, + segmentEndNormalScratch + ); + if (loop) { + const preEndBottom = Cartesian3_default.unpack( + bottomPositionsArray, + bottomPositionsArray.length - 6, + segmentStartBottomScratch + ); + if (breakMiter(endGeometryNormal, preEndBottom, endBottom, endTop)) { + endGeometryNormal = Cartesian3_default.negate( + endGeometryNormal, + endGeometryNormal + ); + } + } + let lengthSoFar3D = 0; + let lengthSoFar2D = 0; + let sumHeights = 0; + for (i = 0; i < segmentCount; i++) { + const startBottom = Cartesian3_default.clone(endBottom, segmentStartBottomScratch); + const startTop = Cartesian3_default.clone(endTop, segmentStartTopScratch); + let startGeometryNormal = Cartesian3_default.clone( + endGeometryNormal, + segmentStartNormalScratch + ); + if (miterBroken) { + startGeometryNormal = Cartesian3_default.negate( + startGeometryNormal, + startGeometryNormal + ); + } + endBottom = Cartesian3_default.unpack( + bottomPositionsArray, + index, + segmentEndBottomScratch + ); + endTop = Cartesian3_default.unpack(topPositionsArray, index, segmentEndTopScratch); + endGeometryNormal = Cartesian3_default.unpack( + normalsArray, + index, + segmentEndNormalScratch + ); + miterBroken = breakMiter(endGeometryNormal, startBottom, endBottom, endTop); + startCartographic.latitude = cartographicsArray[cartographicsIndex]; + startCartographic.longitude = cartographicsArray[cartographicsIndex + 1]; + endCartographic.latitude = cartographicsArray[cartographicsIndex + 2]; + endCartographic.longitude = cartographicsArray[cartographicsIndex + 3]; + let start2D; + let end2D; + let startGeometryNormal2D; + let endGeometryNormal2D; + if (compute2dAttributes) { + const nudgeResult = nudgeCartographic(startCartographic, endCartographic); + start2D = projection.project(startCartographic, segmentStart2DScratch); + end2D = projection.project(endCartographic, segmentEnd2DScratch); + const direction2D = direction(end2D, start2D, forwardOffset2DScratch); + direction2D.y = Math.abs(direction2D.y); + startGeometryNormal2D = segmentStartNormal2DScratch; + endGeometryNormal2D = segmentEndNormal2DScratch; + if (nudgeResult === 0 || Cartesian3_default.dot(direction2D, Cartesian3_default.UNIT_Y) > MITER_BREAK_SMALL) { + startGeometryNormal2D = projectNormal( + projection, + startCartographic, + startGeometryNormal, + start2D, + segmentStartNormal2DScratch + ); + endGeometryNormal2D = projectNormal( + projection, + endCartographic, + endGeometryNormal, + end2D, + segmentEndNormal2DScratch + ); + } else if (nudgeResult === 1) { + endGeometryNormal2D = projectNormal( + projection, + endCartographic, + endGeometryNormal, + end2D, + segmentEndNormal2DScratch + ); + startGeometryNormal2D.x = 0; + startGeometryNormal2D.y = Math_default.sign( + startCartographic.longitude - Math.abs(endCartographic.longitude) + ); + startGeometryNormal2D.z = 0; + } else { + startGeometryNormal2D = projectNormal( + projection, + startCartographic, + startGeometryNormal, + start2D, + segmentStartNormal2DScratch + ); + endGeometryNormal2D.x = 0; + endGeometryNormal2D.y = Math_default.sign( + startCartographic.longitude - endCartographic.longitude + ); + endGeometryNormal2D.z = 0; + } + } + const segmentLength3D = Cartesian3_default.distance(startTop, endTop); + const encodedStart = EncodedCartesian3_default.fromCartesian( + startBottom, + encodeScratch + ); + const forwardOffset = Cartesian3_default.subtract( + endBottom, + startBottom, + offsetScratch + ); + const forward = Cartesian3_default.normalize(forwardOffset, rightScratch); + let startUp = Cartesian3_default.subtract(startTop, startBottom, startUpScratch); + startUp = Cartesian3_default.normalize(startUp, startUp); + let rightNormal = Cartesian3_default.cross(forward, startUp, rightScratch); + rightNormal = Cartesian3_default.normalize(rightNormal, rightNormal); + let startPlaneNormal = Cartesian3_default.cross( + startUp, + startGeometryNormal, + startPlaneNormalScratch + ); + startPlaneNormal = Cartesian3_default.normalize(startPlaneNormal, startPlaneNormal); + let endUp = Cartesian3_default.subtract(endTop, endBottom, endUpScratch); + endUp = Cartesian3_default.normalize(endUp, endUp); + let endPlaneNormal = Cartesian3_default.cross( + endGeometryNormal, + endUp, + endPlaneNormalScratch + ); + endPlaneNormal = Cartesian3_default.normalize(endPlaneNormal, endPlaneNormal); + const texcoordNormalization3DX = segmentLength3D / length3D; + const texcoordNormalization3DY = lengthSoFar3D / length3D; + let segmentLength2D = 0; + let encodedStart2D; + let forwardOffset2D; + let right2D; + let texcoordNormalization2DX = 0; + let texcoordNormalization2DY = 0; + if (compute2dAttributes) { + segmentLength2D = Cartesian3_default.distance(start2D, end2D); + encodedStart2D = EncodedCartesian3_default.fromCartesian( + start2D, + encodeScratch2D + ); + forwardOffset2D = Cartesian3_default.subtract( + end2D, + start2D, + forwardOffset2DScratch + ); + right2D = Cartesian3_default.normalize(forwardOffset2D, right2DScratch); + const swap = right2D.x; + right2D.x = right2D.y; + right2D.y = -swap; + texcoordNormalization2DX = segmentLength2D / length2D; + texcoordNormalization2DY = lengthSoFar2D / length2D; + } + for (j = 0; j < 8; j++) { + const vec4Index = vec4sWriteIndex + j * 4; + const vec2Index = vec2sWriteIndex + j * 2; + const wIndex = vec4Index + 3; + const rightPlaneSide = j < 4 ? 1 : -1; + const topBottomSide = j === 2 || j === 3 || j === 6 || j === 7 ? 1 : -1; + Cartesian3_default.pack(encodedStart.high, startHiAndForwardOffsetX, vec4Index); + startHiAndForwardOffsetX[wIndex] = forwardOffset.x; + Cartesian3_default.pack(encodedStart.low, startLoAndForwardOffsetY, vec4Index); + startLoAndForwardOffsetY[wIndex] = forwardOffset.y; + Cartesian3_default.pack( + startPlaneNormal, + startNormalAndForwardOffsetZ, + vec4Index + ); + startNormalAndForwardOffsetZ[wIndex] = forwardOffset.z; + Cartesian3_default.pack( + endPlaneNormal, + endNormalAndTextureCoordinateNormalizationX, + vec4Index + ); + endNormalAndTextureCoordinateNormalizationX[wIndex] = texcoordNormalization3DX * rightPlaneSide; + Cartesian3_default.pack( + rightNormal, + rightNormalAndTextureCoordinateNormalizationY, + vec4Index + ); + let texcoordNormalization = texcoordNormalization3DY * topBottomSide; + if (texcoordNormalization === 0 && topBottomSide < 0) { + texcoordNormalization = 9; + } + rightNormalAndTextureCoordinateNormalizationY[wIndex] = texcoordNormalization; + if (compute2dAttributes) { + startHiLo2D[vec4Index] = encodedStart2D.high.x; + startHiLo2D[vec4Index + 1] = encodedStart2D.high.y; + startHiLo2D[vec4Index + 2] = encodedStart2D.low.x; + startHiLo2D[vec4Index + 3] = encodedStart2D.low.y; + startEndNormals2D[vec4Index] = -startGeometryNormal2D.y; + startEndNormals2D[vec4Index + 1] = startGeometryNormal2D.x; + startEndNormals2D[vec4Index + 2] = endGeometryNormal2D.y; + startEndNormals2D[vec4Index + 3] = -endGeometryNormal2D.x; + offsetAndRight2D[vec4Index] = forwardOffset2D.x; + offsetAndRight2D[vec4Index + 1] = forwardOffset2D.y; + offsetAndRight2D[vec4Index + 2] = right2D.x; + offsetAndRight2D[vec4Index + 3] = right2D.y; + texcoordNormalization2D[vec2Index] = texcoordNormalization2DX * rightPlaneSide; + texcoordNormalization = texcoordNormalization2DY * topBottomSide; + if (texcoordNormalization === 0 && topBottomSide < 0) { + texcoordNormalization = 9; + } + texcoordNormalization2D[vec2Index + 1] = texcoordNormalization; + } + } + const adjustHeightStartBottom = adjustHeightStartBottomScratch; + const adjustHeightEndBottom = adjustHeightEndBottomScratch; + const adjustHeightStartTop = adjustHeightStartTopScratch; + const adjustHeightEndTop = adjustHeightEndTopScratch; + const getHeightsRectangle = Rectangle_default.fromCartographicArray( + getHeightCartographics, + getHeightRectangleScratch + ); + const minMaxHeights = ApproximateTerrainHeights_default.getMinimumMaximumHeights( + getHeightsRectangle, + ellipsoid + ); + const minHeight = minMaxHeights.minimumTerrainHeight; + const maxHeight = minMaxHeights.maximumTerrainHeight; + sumHeights += Math.abs(minHeight); + sumHeights += Math.abs(maxHeight); + adjustHeights( + startBottom, + startTop, + minHeight, + maxHeight, + adjustHeightStartBottom, + adjustHeightStartTop + ); + adjustHeights( + endBottom, + endTop, + minHeight, + maxHeight, + adjustHeightEndBottom, + adjustHeightEndTop + ); + let normalNudge = Cartesian3_default.multiplyByScalar( + rightNormal, + Math_default.EPSILON5, + normalNudgeScratch + ); + Cartesian3_default.add( + adjustHeightStartBottom, + normalNudge, + adjustHeightStartBottom + ); + Cartesian3_default.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom); + Cartesian3_default.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop); + Cartesian3_default.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop); + nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom); + nudgeXZ(adjustHeightStartTop, adjustHeightEndTop); + Cartesian3_default.pack(adjustHeightStartBottom, positionsArray, vec3sWriteIndex); + Cartesian3_default.pack(adjustHeightEndBottom, positionsArray, vec3sWriteIndex + 3); + Cartesian3_default.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 6); + Cartesian3_default.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 9); + normalNudge = Cartesian3_default.multiplyByScalar( + rightNormal, + -2 * Math_default.EPSILON5, + normalNudgeScratch + ); + Cartesian3_default.add( + adjustHeightStartBottom, + normalNudge, + adjustHeightStartBottom + ); + Cartesian3_default.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom); + Cartesian3_default.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop); + Cartesian3_default.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop); + nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom); + nudgeXZ(adjustHeightStartTop, adjustHeightEndTop); + Cartesian3_default.pack( + adjustHeightStartBottom, + positionsArray, + vec3sWriteIndex + 12 + ); + Cartesian3_default.pack( + adjustHeightEndBottom, + positionsArray, + vec3sWriteIndex + 15 + ); + Cartesian3_default.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 18); + Cartesian3_default.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 21); + cartographicsIndex += 2; + index += 3; + vec2sWriteIndex += 16; + vec3sWriteIndex += 24; + vec4sWriteIndex += 32; + lengthSoFar3D += segmentLength3D; + lengthSoFar2D += segmentLength2D; + } + index = 0; + let indexOffset = 0; + for (i = 0; i < segmentCount; i++) { + for (j = 0; j < REFERENCE_INDICES_LENGTH; j++) { + indices[index + j] = REFERENCE_INDICES[j] + indexOffset; + } + indexOffset += 8; + index += REFERENCE_INDICES_LENGTH; + } + const boundingSpheres = scratchBoundingSpheres; + BoundingSphere_default.fromVertices( + bottomPositionsArray, + Cartesian3_default.ZERO, + 3, + boundingSpheres[0] + ); + BoundingSphere_default.fromVertices( + topPositionsArray, + Cartesian3_default.ZERO, + 3, + boundingSpheres[1] + ); + const boundingSphere = BoundingSphere_default.fromBoundingSpheres(boundingSpheres); + boundingSphere.radius += sumHeights / (segmentCount * 2); + const attributes = { + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + normalize: false, + values: positionsArray + }), + startHiAndForwardOffsetX: getVec4GeometryAttribute( + startHiAndForwardOffsetX + ), + startLoAndForwardOffsetY: getVec4GeometryAttribute( + startLoAndForwardOffsetY + ), + startNormalAndForwardOffsetZ: getVec4GeometryAttribute( + startNormalAndForwardOffsetZ + ), + endNormalAndTextureCoordinateNormalizationX: getVec4GeometryAttribute( + endNormalAndTextureCoordinateNormalizationX + ), + rightNormalAndTextureCoordinateNormalizationY: getVec4GeometryAttribute( + rightNormalAndTextureCoordinateNormalizationY + ) + }; + if (compute2dAttributes) { + attributes.startHiLo2D = getVec4GeometryAttribute(startHiLo2D); + attributes.offsetAndRight2D = getVec4GeometryAttribute(offsetAndRight2D); + attributes.startEndNormals2D = getVec4GeometryAttribute(startEndNormals2D); + attributes.texcoordNormalization2D = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + normalize: false, + values: texcoordNormalization2D + }); + } + return new Geometry_default({ + attributes, + indices, + boundingSphere + }); +} +function getVec4GeometryAttribute(typedArray) { + return new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 4, + normalize: false, + values: typedArray + }); +} +GroundPolylineGeometry._projectNormal = projectNormal; +var GroundPolylineGeometry_default = GroundPolylineGeometry; + +// packages/engine/Source/Workers/createGroundPolylineGeometry.js +function createGroundPolylineGeometry(groundPolylineGeometry, offset) { + return ApproximateTerrainHeights_default.initialize().then(function() { + if (defined_default(offset)) { + groundPolylineGeometry = GroundPolylineGeometry_default.unpack( + groundPolylineGeometry, + offset + ); + } + return GroundPolylineGeometry_default.createGeometry(groundPolylineGeometry); + }); +} +var createGroundPolylineGeometry_default = createGroundPolylineGeometry; +export { + createGroundPolylineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPlaneGeometry.js b/public/assets/cesium/Workers/createPlaneGeometry.js new file mode 100644 index 0000000..8ef92c6 --- /dev/null +++ b/public/assets/cesium/Workers/createPlaneGeometry.js @@ -0,0 +1,222 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PlaneGeometry.js +function PlaneGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + this._vertexFormat = vertexFormat; + this._workerName = "createPlaneGeometry"; +} +PlaneGeometry.packedLength = VertexFormat_default.packedLength; +PlaneGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + return array; +}; +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + vertexFormat: scratchVertexFormat +}; +PlaneGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + if (!defined_default(result)) { + return new PlaneGeometry(scratchOptions); + } + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + return result; +}; +var min = new Cartesian3_default(-0.5, -0.5, 0); +var max = new Cartesian3_default(0.5, 0.5, 0); +PlaneGeometry.createGeometry = function(planeGeometry) { + const vertexFormat = planeGeometry._vertexFormat; + const attributes = new GeometryAttributes_default(); + let indices; + let positions; + if (vertexFormat.position) { + positions = new Float64Array(4 * 3); + positions[0] = min.x; + positions[1] = min.y; + positions[2] = 0; + positions[3] = max.x; + positions[4] = min.y; + positions[5] = 0; + positions[6] = max.x; + positions[7] = max.y; + positions[8] = 0; + positions[9] = min.x; + positions[10] = max.y; + positions[11] = 0; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + if (vertexFormat.normal) { + const normals = new Float32Array(4 * 3); + normals[0] = 0; + normals[1] = 0; + normals[2] = 1; + normals[3] = 0; + normals[4] = 0; + normals[5] = 1; + normals[6] = 0; + normals[7] = 0; + normals[8] = 1; + normals[9] = 0; + normals[10] = 0; + normals[11] = 1; + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.st) { + const texCoords = new Float32Array(4 * 2); + texCoords[0] = 0; + texCoords[1] = 0; + texCoords[2] = 1; + texCoords[3] = 0; + texCoords[4] = 1; + texCoords[5] = 1; + texCoords[6] = 0; + texCoords[7] = 1; + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: texCoords + }); + } + if (vertexFormat.tangent) { + const tangents = new Float32Array(4 * 3); + tangents[0] = 1; + tangents[1] = 0; + tangents[2] = 0; + tangents[3] = 1; + tangents[4] = 0; + tangents[5] = 0; + tangents[6] = 1; + tangents[7] = 0; + tangents[8] = 0; + tangents[9] = 1; + tangents[10] = 0; + tangents[11] = 0; + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + const bitangents = new Float32Array(4 * 3); + bitangents[0] = 0; + bitangents[1] = 1; + bitangents[2] = 0; + bitangents[3] = 0; + bitangents[4] = 1; + bitangents[5] = 0; + bitangents[6] = 0; + bitangents[7] = 1; + bitangents[8] = 0; + bitangents[9] = 0; + bitangents[10] = 1; + bitangents[11] = 0; + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + indices = new Uint16Array(2 * 3); + indices[0] = 0; + indices[1] = 1; + indices[2] = 2; + indices[3] = 0; + indices[4] = 2; + indices[5] = 3; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: new BoundingSphere_default(Cartesian3_default.ZERO, Math.sqrt(2)) + }); +}; +var PlaneGeometry_default = PlaneGeometry; + +// packages/engine/Source/Workers/createPlaneGeometry.js +function createPlaneGeometry(planeGeometry, offset) { + if (defined_default(offset)) { + planeGeometry = PlaneGeometry_default.unpack(planeGeometry, offset); + } + return PlaneGeometry_default.createGeometry(planeGeometry); +} +var createPlaneGeometry_default = createPlaneGeometry; +export { + createPlaneGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPlaneOutlineGeometry.js b/public/assets/cesium/Workers/createPlaneOutlineGeometry.js new file mode 100644 index 0000000..118c1ae --- /dev/null +++ b/public/assets/cesium/Workers/createPlaneOutlineGeometry.js @@ -0,0 +1,122 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PlaneOutlineGeometry.js +function PlaneOutlineGeometry() { + this._workerName = "createPlaneOutlineGeometry"; +} +PlaneOutlineGeometry.packedLength = 0; +PlaneOutlineGeometry.pack = function(value, array) { + Check_default.defined("value", value); + Check_default.defined("array", array); + return array; +}; +PlaneOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + if (!defined_default(result)) { + return new PlaneOutlineGeometry(); + } + return result; +}; +var min = new Cartesian3_default(-0.5, -0.5, 0); +var max = new Cartesian3_default(0.5, 0.5, 0); +PlaneOutlineGeometry.createGeometry = function() { + const attributes = new GeometryAttributes_default(); + const indices = new Uint16Array(4 * 2); + const positions = new Float64Array(4 * 3); + positions[0] = min.x; + positions[1] = min.y; + positions[2] = min.z; + positions[3] = max.x; + positions[4] = min.y; + positions[5] = min.z; + positions[6] = max.x; + positions[7] = max.y; + positions[8] = min.z; + positions[9] = min.x; + positions[10] = max.y; + positions[11] = min.z; + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + indices[0] = 0; + indices[1] = 1; + indices[2] = 1; + indices[3] = 2; + indices[4] = 2; + indices[5] = 3; + indices[6] = 3; + indices[7] = 0; + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: new BoundingSphere_default(Cartesian3_default.ZERO, Math.sqrt(2)) + }); +}; +var PlaneOutlineGeometry_default = PlaneOutlineGeometry; + +// packages/engine/Source/Workers/createPlaneOutlineGeometry.js +function createPlaneOutlineGeometry(planeGeometry, offset) { + if (defined_default(offset)) { + planeGeometry = PlaneOutlineGeometry_default.unpack(planeGeometry, offset); + } + return PlaneOutlineGeometry_default.createGeometry(planeGeometry); +} +var createPlaneOutlineGeometry_default = createPlaneOutlineGeometry; +export { + createPlaneOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPolygonGeometry.js b/public/assets/cesium/Workers/createPolygonGeometry.js new file mode 100644 index 0000000..c9a853d --- /dev/null +++ b/public/assets/cesium/Workers/createPolygonGeometry.js @@ -0,0 +1,1409 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + BoundingRectangle_default +} from "./chunk-44QAAS4P.js"; +import { + PolygonGeometryLibrary_default +} from "./chunk-IZJ42N4W.js"; +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + EllipsoidTangentPlane_default +} from "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default, + WindingOrder_default +} from "./chunk-TI3TRKIC.js"; +import "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import { + IntersectionTests_default, + Ray_default +} from "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Quaternion_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/Stereographic.js +function Stereographic(position, tangentPlane) { + this.position = position; + if (!defined_default(this.position)) { + this.position = new Cartesian2_default(); + } + this.tangentPlane = tangentPlane; + if (!defined_default(this.tangentPlane)) { + this.tangentPlane = Stereographic.NORTH_POLE_TANGENT_PLANE; + } +} +Object.defineProperties(Stereographic.prototype, { + /** + * Gets the ellipsoid. + * @memberof Stereographic.prototype + * @type {Ellipsoid} + */ + ellipsoid: { + get: function() { + return this.tangentPlane.ellipsoid; + } + }, + /** + * Gets the x coordinate + * @memberof Stereographic.prototype + * @type {number} + */ + x: { + get: function() { + return this.position.x; + } + }, + /** + * Gets the y coordinate + * @memberof Stereographic.prototype + * @type {number} + */ + y: { + get: function() { + return this.position.y; + } + }, + /** + * Computes the conformal latitude, or the ellipsoidal latitude projected onto an arbitrary sphere. + * @memberof Stereographic.prototype + * @type {number} + */ + conformalLatitude: { + get: function() { + const r = Cartesian2_default.magnitude(this.position); + const d = 2 * this.ellipsoid.maximumRadius; + const sign = this.tangentPlane.plane.normal.z; + return sign * (Math_default.PI_OVER_TWO - 2 * Math.atan2(r, d)); + } + }, + /** + * Computes the longitude + * @memberof Stereographic.prototype + * @type {number} + */ + longitude: { + get: function() { + let longitude = Math_default.PI_OVER_TWO + Math.atan2(this.y, this.x); + if (longitude > Math.PI) { + longitude -= Math_default.TWO_PI; + } + return longitude; + } + } +}); +var scratchCartographic = new Cartographic_default(); +var scratchCartesian = new Cartesian3_default(); +Stereographic.prototype.getLatitude = function(ellipsoid) { + if (!defined_default(ellipsoid)) { + ellipsoid = Ellipsoid_default.default; + } + scratchCartographic.latitude = this.conformalLatitude; + scratchCartographic.longitude = this.longitude; + scratchCartographic.height = 0; + const cartesian = this.ellipsoid.cartographicToCartesian( + scratchCartographic, + scratchCartesian + ); + ellipsoid.cartesianToCartographic(cartesian, scratchCartographic); + return scratchCartographic.latitude; +}; +var scratchProjectPointOntoPlaneRay = new Ray_default(); +var scratchProjectPointOntoPlaneRayDirection = new Cartesian3_default(); +var scratchProjectPointOntoPlaneCartesian3 = new Cartesian3_default(); +Stereographic.fromCartesian = function(cartesian, result) { + Check_default.defined("cartesian", cartesian); + const sign = Math_default.signNotZero(cartesian.z); + let tangentPlane = Stereographic.NORTH_POLE_TANGENT_PLANE; + let origin = Stereographic.SOUTH_POLE; + if (sign < 0) { + tangentPlane = Stereographic.SOUTH_POLE_TANGENT_PLANE; + origin = Stereographic.NORTH_POLE; + } + const ray = scratchProjectPointOntoPlaneRay; + ray.origin = tangentPlane.ellipsoid.scaleToGeocentricSurface( + cartesian, + ray.origin + ); + ray.direction = Cartesian3_default.subtract( + ray.origin, + origin, + scratchProjectPointOntoPlaneRayDirection + ); + Cartesian3_default.normalize(ray.direction, ray.direction); + const intersectionPoint = IntersectionTests_default.rayPlane( + ray, + tangentPlane.plane, + scratchProjectPointOntoPlaneCartesian3 + ); + const v = Cartesian3_default.subtract(intersectionPoint, origin, intersectionPoint); + const x = Cartesian3_default.dot(tangentPlane.xAxis, v); + const y = sign * Cartesian3_default.dot(tangentPlane.yAxis, v); + if (!defined_default(result)) { + return new Stereographic(new Cartesian2_default(x, y), tangentPlane); + } + result.position = new Cartesian2_default(x, y); + result.tangentPlane = tangentPlane; + return result; +}; +Stereographic.fromCartesianArray = function(cartesians, result) { + Check_default.defined("cartesians", cartesians); + const length = cartesians.length; + if (!defined_default(result)) { + result = new Array(length); + } else { + result.length = length; + } + for (let i = 0; i < length; i++) { + result[i] = Stereographic.fromCartesian(cartesians[i], result[i]); + } + return result; +}; +Stereographic.clone = function(stereographic, result) { + if (!defined_default(stereographic)) { + return void 0; + } + if (!defined_default(result)) { + return new Stereographic( + stereographic.position, + stereographic.tangentPlane + ); + } + result.position = stereographic.position; + result.tangentPlane = stereographic.tangentPlane; + return result; +}; +Stereographic.HALF_UNIT_SPHERE = Object.freeze(new Ellipsoid_default(0.5, 0.5, 0.5)); +Stereographic.NORTH_POLE = Object.freeze(new Cartesian3_default(0, 0, 0.5)); +Stereographic.SOUTH_POLE = Object.freeze(new Cartesian3_default(0, 0, -0.5)); +Stereographic.NORTH_POLE_TANGENT_PLANE = Object.freeze( + new EllipsoidTangentPlane_default( + Stereographic.NORTH_POLE, + Stereographic.HALF_UNIT_SPHERE + ) +); +Stereographic.SOUTH_POLE_TANGENT_PLANE = Object.freeze( + new EllipsoidTangentPlane_default( + Stereographic.SOUTH_POLE, + Stereographic.HALF_UNIT_SPHERE + ) +); +var Stereographic_default = Stereographic; + +// packages/engine/Source/Core/PolygonGeometry.js +var scratchCarto1 = new Cartographic_default(); +var scratchCarto2 = new Cartographic_default(); +function adjustPosHeightsForNormal(position, p1, p2, ellipsoid) { + const carto1 = ellipsoid.cartesianToCartographic(position, scratchCarto1); + const height = carto1.height; + const p1Carto = ellipsoid.cartesianToCartographic(p1, scratchCarto2); + p1Carto.height = height; + ellipsoid.cartographicToCartesian(p1Carto, p1); + const p2Carto = ellipsoid.cartesianToCartographic(p2, scratchCarto2); + p2Carto.height = height - 100; + ellipsoid.cartographicToCartesian(p2Carto, p2); +} +var scratchBoundingRectangle = new BoundingRectangle_default(); +var scratchPosition = new Cartesian3_default(); +var scratchNormal = new Cartesian3_default(); +var scratchTangent = new Cartesian3_default(); +var scratchBitangent = new Cartesian3_default(); +var p1Scratch = new Cartesian3_default(); +var p2Scratch = new Cartesian3_default(); +var scratchPerPosNormal = new Cartesian3_default(); +var scratchPerPosTangent = new Cartesian3_default(); +var scratchPerPosBitangent = new Cartesian3_default(); +var appendTextureCoordinatesOrigin = new Cartesian2_default(); +var appendTextureCoordinatesCartesian2 = new Cartesian2_default(); +var appendTextureCoordinatesCartesian3 = new Cartesian3_default(); +var appendTextureCoordinatesQuaternion = new Quaternion_default(); +var appendTextureCoordinatesMatrix3 = new Matrix3_default(); +var tangentMatrixScratch = new Matrix3_default(); +function computeAttributes(options) { + const vertexFormat = options.vertexFormat; + const geometry = options.geometry; + const shadowVolume = options.shadowVolume; + const flatPositions = geometry.attributes.position.values; + const flatTexcoords = defined_default(geometry.attributes.st) ? geometry.attributes.st.values : void 0; + let length = flatPositions.length; + const wall = options.wall; + const top = options.top || wall; + const bottom = options.bottom || wall; + if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) { + const boundingRectangle = options.boundingRectangle; + const rotationAxis = options.rotationAxis; + const projectTo2d = options.projectTo2d; + const ellipsoid = options.ellipsoid; + const stRotation = options.stRotation; + const perPositionHeight = options.perPositionHeight; + const origin = appendTextureCoordinatesOrigin; + origin.x = boundingRectangle.x; + origin.y = boundingRectangle.y; + const textureCoordinates = vertexFormat.st ? new Float32Array(2 * (length / 3)) : void 0; + let normals; + if (vertexFormat.normal) { + if (perPositionHeight && top && !wall) { + normals = geometry.attributes.normal.values; + } else { + normals = new Float32Array(length); + } + } + const tangents = vertexFormat.tangent ? new Float32Array(length) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(length) : void 0; + const extrudeNormals = shadowVolume ? new Float32Array(length) : void 0; + let textureCoordIndex = 0; + let attrIndex = 0; + let normal = scratchNormal; + let tangent = scratchTangent; + let bitangent = scratchBitangent; + let recomputeNormal = true; + let textureMatrix = appendTextureCoordinatesMatrix3; + let tangentRotationMatrix = tangentMatrixScratch; + if (stRotation !== 0) { + let rotation = Quaternion_default.fromAxisAngle( + rotationAxis, + stRotation, + appendTextureCoordinatesQuaternion + ); + textureMatrix = Matrix3_default.fromQuaternion(rotation, textureMatrix); + rotation = Quaternion_default.fromAxisAngle( + rotationAxis, + -stRotation, + appendTextureCoordinatesQuaternion + ); + tangentRotationMatrix = Matrix3_default.fromQuaternion( + rotation, + tangentRotationMatrix + ); + } else { + textureMatrix = Matrix3_default.clone(Matrix3_default.IDENTITY, textureMatrix); + tangentRotationMatrix = Matrix3_default.clone( + Matrix3_default.IDENTITY, + tangentRotationMatrix + ); + } + let bottomOffset = 0; + let bottomOffset2 = 0; + if (top && bottom) { + bottomOffset = length / 2; + bottomOffset2 = length / 3; + length /= 2; + } + for (let i = 0; i < length; i += 3) { + const position = Cartesian3_default.fromArray( + flatPositions, + i, + appendTextureCoordinatesCartesian3 + ); + if (vertexFormat.st) { + if (!defined_default(flatTexcoords)) { + let p = Matrix3_default.multiplyByVector( + textureMatrix, + position, + scratchPosition + ); + p = ellipsoid.scaleToGeodeticSurface(p, p); + const st = projectTo2d([p], appendTextureCoordinatesCartesian2)[0]; + Cartesian2_default.subtract(st, origin, st); + const stx = Math_default.clamp(st.x / boundingRectangle.width, 0, 1); + const sty = Math_default.clamp(st.y / boundingRectangle.height, 0, 1); + if (bottom) { + textureCoordinates[textureCoordIndex + bottomOffset2] = stx; + textureCoordinates[textureCoordIndex + 1 + bottomOffset2] = sty; + } + if (top) { + textureCoordinates[textureCoordIndex] = stx; + textureCoordinates[textureCoordIndex + 1] = sty; + } + textureCoordIndex += 2; + } + } + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) { + const attrIndex1 = attrIndex + 1; + const attrIndex2 = attrIndex + 2; + if (wall) { + if (i + 3 < length) { + const p1 = Cartesian3_default.fromArray(flatPositions, i + 3, p1Scratch); + if (recomputeNormal) { + const p2 = Cartesian3_default.fromArray( + flatPositions, + i + length, + p2Scratch + ); + if (perPositionHeight) { + adjustPosHeightsForNormal(position, p1, p2, ellipsoid); + } + Cartesian3_default.subtract(p1, position, p1); + Cartesian3_default.subtract(p2, position, p2); + normal = Cartesian3_default.normalize( + Cartesian3_default.cross(p2, p1, normal), + normal + ); + recomputeNormal = false; + } + if (Cartesian3_default.equalsEpsilon(p1, position, Math_default.EPSILON10)) { + recomputeNormal = true; + } + } + if (vertexFormat.tangent || vertexFormat.bitangent) { + bitangent = ellipsoid.geodeticSurfaceNormal(position, bitangent); + if (vertexFormat.tangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(bitangent, normal, tangent), + tangent + ); + } + } + } else { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (vertexFormat.tangent || vertexFormat.bitangent) { + if (perPositionHeight) { + scratchPerPosNormal = Cartesian3_default.fromArray( + normals, + attrIndex, + scratchPerPosNormal + ); + scratchPerPosTangent = Cartesian3_default.cross( + Cartesian3_default.UNIT_Z, + scratchPerPosNormal, + scratchPerPosTangent + ); + scratchPerPosTangent = Cartesian3_default.normalize( + Matrix3_default.multiplyByVector( + tangentRotationMatrix, + scratchPerPosTangent, + scratchPerPosTangent + ), + scratchPerPosTangent + ); + if (vertexFormat.bitangent) { + scratchPerPosBitangent = Cartesian3_default.normalize( + Cartesian3_default.cross( + scratchPerPosNormal, + scratchPerPosTangent, + scratchPerPosBitangent + ), + scratchPerPosBitangent + ); + } + } + tangent = Cartesian3_default.cross(Cartesian3_default.UNIT_Z, normal, tangent); + tangent = Cartesian3_default.normalize( + Matrix3_default.multiplyByVector(tangentRotationMatrix, tangent, tangent), + tangent + ); + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + } + } + } + if (vertexFormat.normal) { + if (options.wall) { + normals[attrIndex + bottomOffset] = normal.x; + normals[attrIndex1 + bottomOffset] = normal.y; + normals[attrIndex2 + bottomOffset] = normal.z; + } else if (bottom) { + normals[attrIndex + bottomOffset] = -normal.x; + normals[attrIndex1 + bottomOffset] = -normal.y; + normals[attrIndex2 + bottomOffset] = -normal.z; + } + if (top && !perPositionHeight || wall) { + normals[attrIndex] = normal.x; + normals[attrIndex1] = normal.y; + normals[attrIndex2] = normal.z; + } + } + if (shadowVolume) { + if (wall) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + } + extrudeNormals[attrIndex + bottomOffset] = -normal.x; + extrudeNormals[attrIndex1 + bottomOffset] = -normal.y; + extrudeNormals[attrIndex2 + bottomOffset] = -normal.z; + } + if (vertexFormat.tangent) { + if (options.wall) { + tangents[attrIndex + bottomOffset] = tangent.x; + tangents[attrIndex1 + bottomOffset] = tangent.y; + tangents[attrIndex2 + bottomOffset] = tangent.z; + } else if (bottom) { + tangents[attrIndex + bottomOffset] = -tangent.x; + tangents[attrIndex1 + bottomOffset] = -tangent.y; + tangents[attrIndex2 + bottomOffset] = -tangent.z; + } + if (top) { + if (perPositionHeight) { + tangents[attrIndex] = scratchPerPosTangent.x; + tangents[attrIndex1] = scratchPerPosTangent.y; + tangents[attrIndex2] = scratchPerPosTangent.z; + } else { + tangents[attrIndex] = tangent.x; + tangents[attrIndex1] = tangent.y; + tangents[attrIndex2] = tangent.z; + } + } + } + if (vertexFormat.bitangent) { + if (bottom) { + bitangents[attrIndex + bottomOffset] = bitangent.x; + bitangents[attrIndex1 + bottomOffset] = bitangent.y; + bitangents[attrIndex2 + bottomOffset] = bitangent.z; + } + if (top) { + if (perPositionHeight) { + bitangents[attrIndex] = scratchPerPosBitangent.x; + bitangents[attrIndex1] = scratchPerPosBitangent.y; + bitangents[attrIndex2] = scratchPerPosBitangent.z; + } else { + bitangents[attrIndex] = bitangent.x; + bitangents[attrIndex1] = bitangent.y; + bitangents[attrIndex2] = bitangent.z; + } + } + } + attrIndex += 3; + } + } + if (vertexFormat.st && !defined_default(flatTexcoords)) { + geometry.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + if (vertexFormat.normal) { + geometry.attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + geometry.attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + geometry.attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (shadowVolume) { + geometry.attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: extrudeNormals + }); + } + } + if (options.extrude && defined_default(options.offsetAttribute)) { + const size = flatPositions.length / 3; + let offsetAttribute = new Uint8Array(size); + if (options.offsetAttribute === GeometryOffsetAttribute_default.TOP) { + if (top && bottom || wall) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else if (top) { + offsetAttribute = offsetAttribute.fill(1); + } + } else { + const offsetValue = options.offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + }); + } + return geometry; +} +var createGeometryFromPositionsExtrudedPositions = []; +function createGeometryFromPositionsExtruded(ellipsoid, polygon2, textureCoordinates, granularity, hierarchy, perPositionHeight, closeTop, closeBottom, vertexFormat, arcType) { + const geos = { + walls: [] + }; + let i; + if (closeTop || closeBottom) { + const topGeo = PolygonGeometryLibrary_default.createGeometryFromPositions( + ellipsoid, + polygon2, + textureCoordinates, + granularity, + perPositionHeight, + vertexFormat, + arcType + ); + const edgePoints = topGeo.attributes.position.values; + const indices = topGeo.indices; + let numPositions; + let newIndices; + if (closeTop && closeBottom) { + const topBottomPositions = edgePoints.concat(edgePoints); + numPositions = topBottomPositions.length / 3; + newIndices = IndexDatatype_default.createTypedArray( + numPositions, + indices.length * 2 + ); + newIndices.set(indices); + const ilength = indices.length; + const length = numPositions / 2; + for (i = 0; i < ilength; i += 3) { + const i0 = newIndices[i] + length; + const i1 = newIndices[i + 1] + length; + const i2 = newIndices[i + 2] + length; + newIndices[i + ilength] = i2; + newIndices[i + 1 + ilength] = i1; + newIndices[i + 2 + ilength] = i0; + } + topGeo.attributes.position.values = topBottomPositions; + if (perPositionHeight && vertexFormat.normal) { + const normals = topGeo.attributes.normal.values; + topGeo.attributes.normal.values = new Float32Array( + topBottomPositions.length + ); + topGeo.attributes.normal.values.set(normals); + } + if (vertexFormat.st && defined_default(textureCoordinates)) { + const texcoords = topGeo.attributes.st.values; + topGeo.attributes.st.values = new Float32Array(numPositions * 2); + topGeo.attributes.st.values = texcoords.concat(texcoords); + } + topGeo.indices = newIndices; + } else if (closeBottom) { + numPositions = edgePoints.length / 3; + newIndices = IndexDatatype_default.createTypedArray(numPositions, indices.length); + for (i = 0; i < indices.length; i += 3) { + newIndices[i] = indices[i + 2]; + newIndices[i + 1] = indices[i + 1]; + newIndices[i + 2] = indices[i]; + } + topGeo.indices = newIndices; + } + geos.topAndBottom = new GeometryInstance_default({ + geometry: topGeo + }); + } + let outerRing = hierarchy.outerRing; + const tangentPlane = EllipsoidTangentPlane_default.fromPoints(outerRing, ellipsoid); + let positions2D = tangentPlane.projectPointsOntoPlane( + outerRing, + createGeometryFromPositionsExtrudedPositions + ); + let windingOrder = PolygonPipeline_default.computeWindingOrder2D(positions2D); + if (windingOrder === WindingOrder_default.CLOCKWISE) { + outerRing = outerRing.slice().reverse(); + } + let wallGeo = PolygonGeometryLibrary_default.computeWallGeometry( + outerRing, + textureCoordinates, + ellipsoid, + granularity, + perPositionHeight, + arcType + ); + geos.walls.push( + new GeometryInstance_default({ + geometry: wallGeo + }) + ); + const holes = hierarchy.holes; + for (i = 0; i < holes.length; i++) { + let hole = holes[i]; + positions2D = tangentPlane.projectPointsOntoPlane( + hole, + createGeometryFromPositionsExtrudedPositions + ); + windingOrder = PolygonPipeline_default.computeWindingOrder2D(positions2D); + if (windingOrder === WindingOrder_default.COUNTER_CLOCKWISE) { + hole = hole.slice().reverse(); + } + wallGeo = PolygonGeometryLibrary_default.computeWallGeometry( + hole, + textureCoordinates, + ellipsoid, + granularity, + perPositionHeight, + arcType + ); + geos.walls.push( + new GeometryInstance_default({ + geometry: wallGeo + }) + ); + } + return geos; +} +function PolygonGeometry(options) { + Check_default.typeOf.object("options", options); + Check_default.typeOf.object("options.polygonHierarchy", options.polygonHierarchy); + if (defined_default(options.perPositionHeight) && options.perPositionHeight && defined_default(options.height)) { + throw new DeveloperError_default( + "Cannot use both options.perPositionHeight and options.height" + ); + } + if (defined_default(options.arcType) && options.arcType !== ArcType_default.GEODESIC && options.arcType !== ArcType_default.RHUMB) { + throw new DeveloperError_default( + "Invalid arcType. Valid options are ArcType.GEODESIC and ArcType.RHUMB." + ); + } + const polygonHierarchy = options.polygonHierarchy; + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const stRotation = defaultValue_default(options.stRotation, 0); + const textureCoordinates = options.textureCoordinates; + const perPositionHeight = defaultValue_default(options.perPositionHeight, false); + const perPositionHeightExtrude = perPositionHeight && defined_default(options.extrudedHeight); + let height = defaultValue_default(options.height, 0); + let extrudedHeight = defaultValue_default(options.extrudedHeight, height); + if (!perPositionHeightExtrude) { + const h = Math.max(height, extrudedHeight); + extrudedHeight = Math.min(height, extrudedHeight); + height = h; + } + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._granularity = granularity; + this._stRotation = stRotation; + this._height = height; + this._extrudedHeight = extrudedHeight; + this._closeTop = defaultValue_default(options.closeTop, true); + this._closeBottom = defaultValue_default(options.closeBottom, true); + this._polygonHierarchy = polygonHierarchy; + this._perPositionHeight = perPositionHeight; + this._perPositionHeightExtrude = perPositionHeightExtrude; + this._shadowVolume = defaultValue_default(options.shadowVolume, false); + this._workerName = "createPolygonGeometry"; + this._offsetAttribute = options.offsetAttribute; + this._arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC); + this._rectangle = void 0; + this._textureCoordinateRotationPoints = void 0; + this._textureCoordinates = textureCoordinates; + this.packedLength = PolygonGeometryLibrary_default.computeHierarchyPackedLength( + polygonHierarchy, + Cartesian3_default + ) + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + (textureCoordinates ? PolygonGeometryLibrary_default.computeHierarchyPackedLength( + textureCoordinates, + Cartesian2_default + ) : 1) + 12; +} +PolygonGeometry.fromPositions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + Check_default.defined("options.positions", options.positions); + const newOptions = { + polygonHierarchy: { + positions: options.positions + }, + height: options.height, + extrudedHeight: options.extrudedHeight, + vertexFormat: options.vertexFormat, + stRotation: options.stRotation, + ellipsoid: options.ellipsoid, + granularity: options.granularity, + perPositionHeight: options.perPositionHeight, + closeTop: options.closeTop, + closeBottom: options.closeBottom, + offsetAttribute: options.offsetAttribute, + arcType: options.arcType, + textureCoordinates: options.textureCoordinates + }; + return new PolygonGeometry(newOptions); +}; +PolygonGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._polygonHierarchy, + array, + startingIndex, + Cartesian3_default + ); + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._height; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._stRotation; + array[startingIndex++] = value._perPositionHeightExtrude ? 1 : 0; + array[startingIndex++] = value._perPositionHeight ? 1 : 0; + array[startingIndex++] = value._closeTop ? 1 : 0; + array[startingIndex++] = value._closeBottom ? 1 : 0; + array[startingIndex++] = value._shadowVolume ? 1 : 0; + array[startingIndex++] = defaultValue_default(value._offsetAttribute, -1); + array[startingIndex++] = value._arcType; + if (defined_default(value._textureCoordinates)) { + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._textureCoordinates, + array, + startingIndex, + Cartesian2_default + ); + } else { + array[startingIndex++] = -1; + } + array[startingIndex++] = value.packedLength; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var dummyOptions = { + polygonHierarchy: {} +}; +PolygonGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const polygonHierarchy = PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian3_default + ); + startingIndex = polygonHierarchy.startingIndex; + delete polygonHierarchy.startingIndex; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const height = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const granularity = array[startingIndex++]; + const stRotation = array[startingIndex++]; + const perPositionHeightExtrude = array[startingIndex++] === 1; + const perPositionHeight = array[startingIndex++] === 1; + const closeTop = array[startingIndex++] === 1; + const closeBottom = array[startingIndex++] === 1; + const shadowVolume = array[startingIndex++] === 1; + const offsetAttribute = array[startingIndex++]; + const arcType = array[startingIndex++]; + const textureCoordinates = array[startingIndex] === -1 ? void 0 : PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian2_default + ); + if (defined_default(textureCoordinates)) { + startingIndex = textureCoordinates.startingIndex; + delete textureCoordinates.startingIndex; + } else { + startingIndex++; + } + const packedLength = array[startingIndex++]; + if (!defined_default(result)) { + result = new PolygonGeometry(dummyOptions); + } + result._polygonHierarchy = polygonHierarchy; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._height = height; + result._extrudedHeight = extrudedHeight; + result._granularity = granularity; + result._stRotation = stRotation; + result._perPositionHeightExtrude = perPositionHeightExtrude; + result._perPositionHeight = perPositionHeight; + result._closeTop = closeTop; + result._closeBottom = closeBottom; + result._shadowVolume = shadowVolume; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + result._arcType = arcType; + result._textureCoordinates = textureCoordinates; + result.packedLength = packedLength; + return result; +}; +var scratchCartesian0 = new Cartesian2_default(); +var scratchCartesian1 = new Cartesian2_default(); +var scratchPolarClosest = new Stereographic_default(); +function expandRectangle(polar, lastPolar, ellipsoid, arcType, polygon2, result) { + const longitude = polar.longitude; + const lonAdjusted = longitude >= 0 ? longitude : longitude + Math_default.TWO_PI; + polygon2.westOverIdl = Math.min(polygon2.westOverIdl, lonAdjusted); + polygon2.eastOverIdl = Math.max(polygon2.eastOverIdl, lonAdjusted); + result.west = Math.min(result.west, longitude); + result.east = Math.max(result.east, longitude); + const latitude = polar.getLatitude(ellipsoid); + let segmentLatitude = latitude; + result.south = Math.min(result.south, latitude); + result.north = Math.max(result.north, latitude); + if (arcType !== ArcType_default.RHUMB) { + const segment = Cartesian2_default.subtract( + lastPolar.position, + polar.position, + scratchCartesian0 + ); + const t = Cartesian2_default.dot(lastPolar.position, segment) / Cartesian2_default.dot(segment, segment); + if (t > 0 && t < 1) { + const projected = Cartesian2_default.add( + lastPolar.position, + Cartesian2_default.multiplyByScalar(segment, -t, segment), + scratchCartesian1 + ); + const closestPolar = Stereographic_default.clone(lastPolar, scratchPolarClosest); + closestPolar.position = projected; + const adjustedLatitude = closestPolar.getLatitude(ellipsoid); + result.south = Math.min(result.south, adjustedLatitude); + result.north = Math.max(result.north, adjustedLatitude); + if (Math.abs(latitude) > Math.abs(adjustedLatitude)) { + segmentLatitude = adjustedLatitude; + } + } + } + const direction = lastPolar.x * polar.y - polar.x * lastPolar.y; + let angle = Math.sign(direction); + if (angle !== 0) { + angle *= Cartesian2_default.angleBetween(lastPolar.position, polar.position); + } + if (segmentLatitude >= 0) { + polygon2.northAngle += angle; + } + if (segmentLatitude <= 0) { + polygon2.southAngle += angle; + } +} +var scratchPolar = new Stereographic_default(); +var scratchPolarPrevious = new Stereographic_default(); +var polygon = { + northAngle: 0, + southAngle: 0, + westOverIdl: 0, + eastOverIdl: 0 +}; +PolygonGeometry.computeRectangleFromPositions = function(positions, ellipsoid, arcType, result) { + Check_default.defined("positions", positions); + if (!defined_default(result)) { + result = new Rectangle_default(); + } + if (positions.length < 3) { + return result; + } + result.west = Number.POSITIVE_INFINITY; + result.east = Number.NEGATIVE_INFINITY; + result.south = Number.POSITIVE_INFINITY; + result.north = Number.NEGATIVE_INFINITY; + polygon.northAngle = 0; + polygon.southAngle = 0; + polygon.westOverIdl = Number.POSITIVE_INFINITY; + polygon.eastOverIdl = Number.NEGATIVE_INFINITY; + const positionsLength = positions.length; + let lastPolarPosition = Stereographic_default.fromCartesian( + positions[0], + scratchPolarPrevious + ); + for (let i = 1; i < positionsLength; i++) { + const polarPosition = Stereographic_default.fromCartesian( + positions[i], + scratchPolar + ); + expandRectangle( + polarPosition, + lastPolarPosition, + ellipsoid, + arcType, + polygon, + result + ); + lastPolarPosition = Stereographic_default.clone(polarPosition, lastPolarPosition); + } + expandRectangle( + Stereographic_default.fromCartesian(positions[0], scratchPolar), + lastPolarPosition, + ellipsoid, + arcType, + polygon, + result + ); + if (result.east - result.west > polygon.eastOverIdl - polygon.westOverIdl) { + result.west = polygon.westOverIdl; + result.east = polygon.eastOverIdl; + if (result.east > Math_default.PI) { + result.east = result.east - Math_default.TWO_PI; + } + if (result.west > Math_default.PI) { + result.west = result.west - Math_default.TWO_PI; + } + } + if (Math_default.equalsEpsilon( + Math.abs(polygon.northAngle), + Math_default.TWO_PI, + Math_default.EPSILON10 + )) { + result.north = Math_default.PI_OVER_TWO; + result.east = Math_default.PI; + result.west = -Math_default.PI; + } + if (Math_default.equalsEpsilon( + Math.abs(polygon.southAngle), + Math_default.TWO_PI, + Math_default.EPSILON10 + )) { + result.south = -Math_default.PI_OVER_TWO; + result.east = Math_default.PI; + result.west = -Math_default.PI; + } + return result; +}; +var scratchPolarForPlane = new Stereographic_default(); +function getTangentPlane(rectangle, positions, ellipsoid) { + if (rectangle.height >= Math_default.PI || rectangle.width >= Math_default.PI) { + const polar = Stereographic_default.fromCartesian( + positions[0], + scratchPolarForPlane + ); + return polar.tangentPlane; + } + return EllipsoidTangentPlane_default.fromPoints(positions, ellipsoid); +} +var scratchCartographicCyllindrical = new Cartographic_default(); +function createProjectTo2d(rectangle, outerPositions, ellipsoid) { + return (positions, results) => { + if (rectangle.height >= Math_default.PI || rectangle.width >= Math_default.PI) { + if (rectangle.south < 0 && rectangle.north > 0) { + if (!defined_default(results)) { + results = []; + } + for (let i = 0; i < positions.length; ++i) { + const cartographic = ellipsoid.cartesianToCartographic( + positions[i], + scratchCartographicCyllindrical + ); + results[i] = new Cartesian2_default( + cartographic.longitude / Math_default.PI, + cartographic.latitude / Math_default.PI_OVER_TWO + ); + } + results.length = positions.length; + return results; + } + return Stereographic_default.fromCartesianArray(positions, results); + } + const tangentPlane = EllipsoidTangentPlane_default.fromPoints( + outerPositions, + ellipsoid + ); + return tangentPlane.projectPointsOntoPlane(positions, results); + }; +} +function createProjectPositionTo2d(rectangle, outerRing, ellipsoid) { + if (rectangle.height >= Math_default.PI || rectangle.width >= Math_default.PI) { + return (position, result) => { + if (rectangle.south < 0 && rectangle.north > 0) { + const cartographic = ellipsoid.cartesianToCartographic( + position, + scratchCartographicCyllindrical + ); + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + result.x = cartographic.longitude / Math_default.PI; + result.y = cartographic.latitude / Math_default.PI_OVER_TWO; + return result; + } + return Stereographic_default.fromCartesian(position, result); + }; + } + const tangentPlane = EllipsoidTangentPlane_default.fromPoints(outerRing, ellipsoid); + return (position, result) => { + return tangentPlane.projectPointsOntoPlane(position, result); + }; +} +function createSplitPolygons(rectangle, ellipsoid, arcType, perPositionHeight) { + return (polygons, results) => { + if (!perPositionHeight && (rectangle.height >= Math_default.PI_OVER_TWO || rectangle.width >= 2 * Math_default.PI_OVER_THREE)) { + return PolygonGeometryLibrary_default.splitPolygonsOnEquator( + polygons, + ellipsoid, + arcType, + results + ); + } + return polygons; + }; +} +function computeBoundingRectangle(outerRing, rectangle, ellipsoid, stRotation) { + if (rectangle.height >= Math_default.PI || rectangle.width >= Math_default.PI) { + return BoundingRectangle_default.fromRectangle( + rectangle, + void 0, + scratchBoundingRectangle + ); + } + const outerPositions = outerRing; + const tangentPlane = EllipsoidTangentPlane_default.fromPoints( + outerPositions, + ellipsoid + ); + return PolygonGeometryLibrary_default.computeBoundingRectangle( + tangentPlane.plane.normal, + tangentPlane.projectPointOntoPlane.bind(tangentPlane), + outerPositions, + stRotation, + scratchBoundingRectangle + ); +} +PolygonGeometry.createGeometry = function(polygonGeometry) { + const vertexFormat = polygonGeometry._vertexFormat; + const ellipsoid = polygonGeometry._ellipsoid; + const granularity = polygonGeometry._granularity; + const stRotation = polygonGeometry._stRotation; + const polygonHierarchy = polygonGeometry._polygonHierarchy; + const perPositionHeight = polygonGeometry._perPositionHeight; + const closeTop = polygonGeometry._closeTop; + const closeBottom = polygonGeometry._closeBottom; + const arcType = polygonGeometry._arcType; + const textureCoordinates = polygonGeometry._textureCoordinates; + const hasTextureCoordinates = defined_default(textureCoordinates); + const outerPositions = polygonHierarchy.positions; + if (outerPositions.length < 3) { + return; + } + const rectangle = polygonGeometry.rectangle; + const results = PolygonGeometryLibrary_default.polygonsFromHierarchy( + polygonHierarchy, + hasTextureCoordinates, + createProjectTo2d(rectangle, outerPositions, ellipsoid), + !perPositionHeight, + ellipsoid, + createSplitPolygons(rectangle, ellipsoid, arcType, perPositionHeight) + ); + const hierarchy = results.hierarchy; + const polygons = results.polygons; + const dummyFunction = function(identity) { + return identity; + }; + const textureCoordinatePolygons = hasTextureCoordinates ? PolygonGeometryLibrary_default.polygonsFromHierarchy( + textureCoordinates, + true, + dummyFunction, + false, + ellipsoid + ).polygons : void 0; + if (hierarchy.length === 0) { + return; + } + const outerRing = hierarchy[0].outerRing; + const boundingRectangle = computeBoundingRectangle( + outerRing, + rectangle, + ellipsoid, + stRotation + ); + const geometries = []; + const height = polygonGeometry._height; + const extrudedHeight = polygonGeometry._extrudedHeight; + const extrude = polygonGeometry._perPositionHeightExtrude || !Math_default.equalsEpsilon(height, extrudedHeight, 0, Math_default.EPSILON2); + const options = { + perPositionHeight, + vertexFormat, + geometry: void 0, + rotationAxis: getTangentPlane(rectangle, outerRing, ellipsoid).plane.normal, + projectTo2d: createProjectPositionTo2d(rectangle, outerRing, ellipsoid), + boundingRectangle, + ellipsoid, + stRotation, + textureCoordinates: void 0, + bottom: false, + top: true, + wall: false, + extrude: false, + arcType + }; + let i; + if (extrude) { + options.extrude = true; + options.top = closeTop; + options.bottom = closeBottom; + options.shadowVolume = polygonGeometry._shadowVolume; + options.offsetAttribute = polygonGeometry._offsetAttribute; + for (i = 0; i < polygons.length; i++) { + const splitGeometry = createGeometryFromPositionsExtruded( + ellipsoid, + polygons[i], + hasTextureCoordinates ? textureCoordinatePolygons[i] : void 0, + granularity, + hierarchy[i], + perPositionHeight, + closeTop, + closeBottom, + vertexFormat, + arcType + ); + let topAndBottom; + if (closeTop && closeBottom) { + topAndBottom = splitGeometry.topAndBottom; + options.geometry = PolygonGeometryLibrary_default.scaleToGeodeticHeightExtruded( + topAndBottom.geometry, + height, + extrudedHeight, + ellipsoid, + perPositionHeight + ); + } else if (closeTop) { + topAndBottom = splitGeometry.topAndBottom; + topAndBottom.geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + topAndBottom.geometry.attributes.position.values, + height, + ellipsoid, + !perPositionHeight + ); + options.geometry = topAndBottom.geometry; + } else if (closeBottom) { + topAndBottom = splitGeometry.topAndBottom; + topAndBottom.geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + topAndBottom.geometry.attributes.position.values, + extrudedHeight, + ellipsoid, + true + ); + options.geometry = topAndBottom.geometry; + } + if (closeTop || closeBottom) { + options.wall = false; + topAndBottom.geometry = computeAttributes(options); + geometries.push(topAndBottom); + } + const walls = splitGeometry.walls; + options.wall = true; + for (let k = 0; k < walls.length; k++) { + const wall = walls[k]; + options.geometry = PolygonGeometryLibrary_default.scaleToGeodeticHeightExtruded( + wall.geometry, + height, + extrudedHeight, + ellipsoid, + perPositionHeight + ); + wall.geometry = computeAttributes(options); + geometries.push(wall); + } + } + } else { + for (i = 0; i < polygons.length; i++) { + const geometryInstance = new GeometryInstance_default({ + geometry: PolygonGeometryLibrary_default.createGeometryFromPositions( + ellipsoid, + polygons[i], + hasTextureCoordinates ? textureCoordinatePolygons[i] : void 0, + granularity, + perPositionHeight, + vertexFormat, + arcType + ) + }); + geometryInstance.geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + geometryInstance.geometry.attributes.position.values, + height, + ellipsoid, + !perPositionHeight + ); + options.geometry = geometryInstance.geometry; + geometryInstance.geometry = computeAttributes(options); + if (defined_default(polygonGeometry._offsetAttribute)) { + const length = geometryInstance.geometry.attributes.position.values.length; + const offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute_default( + { + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + } + ); + } + geometries.push(geometryInstance); + } + } + const geometry = GeometryPipeline_default.combineInstances(geometries)[0]; + geometry.attributes.position.values = new Float64Array( + geometry.attributes.position.values + ); + geometry.indices = IndexDatatype_default.createTypedArray( + geometry.attributes.position.values.length / 3, + geometry.indices + ); + const attributes = geometry.attributes; + const boundingSphere = BoundingSphere_default.fromVertices( + attributes.position.values + ); + if (!vertexFormat.position) { + delete attributes.position; + } + return new Geometry_default({ + attributes, + indices: geometry.indices, + primitiveType: geometry.primitiveType, + boundingSphere, + offsetAttribute: polygonGeometry._offsetAttribute + }); +}; +PolygonGeometry.createShadowVolume = function(polygonGeometry, minHeightFunc, maxHeightFunc) { + const granularity = polygonGeometry._granularity; + const ellipsoid = polygonGeometry._ellipsoid; + const minHeight = minHeightFunc(granularity, ellipsoid); + const maxHeight = maxHeightFunc(granularity, ellipsoid); + return new PolygonGeometry({ + polygonHierarchy: polygonGeometry._polygonHierarchy, + ellipsoid, + stRotation: polygonGeometry._stRotation, + granularity, + perPositionHeight: false, + extrudedHeight: minHeight, + height: maxHeight, + vertexFormat: VertexFormat_default.POSITION_ONLY, + shadowVolume: true, + arcType: polygonGeometry._arcType + }); +}; +function textureCoordinateRotationPoints(polygonGeometry) { + const stRotation = -polygonGeometry._stRotation; + if (stRotation === 0) { + return [0, 0, 0, 1, 1, 0]; + } + const ellipsoid = polygonGeometry._ellipsoid; + const positions = polygonGeometry._polygonHierarchy.positions; + const boundingRectangle = polygonGeometry.rectangle; + return Geometry_default._textureCoordinateRotationPoints( + positions, + stRotation, + ellipsoid, + boundingRectangle + ); +} +Object.defineProperties(PolygonGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + if (!defined_default(this._rectangle)) { + const positions = this._polygonHierarchy.positions; + this._rectangle = PolygonGeometry.computeRectangleFromPositions( + positions, + this._ellipsoid, + this._arcType + ); + } + return this._rectangle; + } + }, + /** + * For remapping texture coordinates when rendering PolygonGeometries as GroundPrimitives. + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + if (!defined_default(this._textureCoordinateRotationPoints)) { + this._textureCoordinateRotationPoints = textureCoordinateRotationPoints( + this + ); + } + return this._textureCoordinateRotationPoints; + } + } +}); +var PolygonGeometry_default = PolygonGeometry; + +// packages/engine/Source/Workers/createPolygonGeometry.js +function createPolygonGeometry(polygonGeometry, offset) { + if (defined_default(offset)) { + polygonGeometry = PolygonGeometry_default.unpack(polygonGeometry, offset); + } + polygonGeometry._ellipsoid = Ellipsoid_default.clone(polygonGeometry._ellipsoid); + return PolygonGeometry_default.createGeometry(polygonGeometry); +} +var createPolygonGeometry_default = createPolygonGeometry; +export { + createPolygonGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPolygonOutlineGeometry.js b/public/assets/cesium/Workers/createPolygonOutlineGeometry.js new file mode 100644 index 0000000..046dacd --- /dev/null +++ b/public/assets/cesium/Workers/createPolygonOutlineGeometry.js @@ -0,0 +1,541 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + PolygonGeometryLibrary_default +} from "./chunk-IZJ42N4W.js"; +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + EllipsoidTangentPlane_default +} from "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default, + WindingOrder_default +} from "./chunk-TI3TRKIC.js"; +import "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolygonOutlineGeometry.js +var createGeometryFromPositionsPositions = []; +var createGeometryFromPositionsSubdivided = []; +function createGeometryFromPositions(ellipsoid, positions, minDistance, perPositionHeight, arcType) { + const tangentPlane = EllipsoidTangentPlane_default.fromPoints(positions, ellipsoid); + const positions2D = tangentPlane.projectPointsOntoPlane( + positions, + createGeometryFromPositionsPositions + ); + const originalWindingOrder = PolygonPipeline_default.computeWindingOrder2D( + positions2D + ); + if (originalWindingOrder === WindingOrder_default.CLOCKWISE) { + positions2D.reverse(); + positions = positions.slice().reverse(); + } + let subdividedPositions; + let i; + let length = positions.length; + let index = 0; + if (!perPositionHeight) { + let numVertices = 0; + if (arcType === ArcType_default.GEODESIC) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary_default.subdivideLineCount( + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } else if (arcType === ArcType_default.RHUMB) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary_default.subdivideRhumbLineCount( + ellipsoid, + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } + subdividedPositions = new Float64Array(numVertices * 3); + for (i = 0; i < length; i++) { + let tempPositions; + if (arcType === ArcType_default.GEODESIC) { + tempPositions = PolygonGeometryLibrary_default.subdivideLine( + positions[i], + positions[(i + 1) % length], + minDistance, + createGeometryFromPositionsSubdivided + ); + } else if (arcType === ArcType_default.RHUMB) { + tempPositions = PolygonGeometryLibrary_default.subdivideRhumbLine( + ellipsoid, + positions[i], + positions[(i + 1) % length], + minDistance, + createGeometryFromPositionsSubdivided + ); + } + const tempPositionsLength = tempPositions.length; + for (let j = 0; j < tempPositionsLength; ++j) { + subdividedPositions[index++] = tempPositions[j]; + } + } + } else { + subdividedPositions = new Float64Array(length * 2 * 3); + for (i = 0; i < length; i++) { + const p0 = positions[i]; + const p1 = positions[(i + 1) % length]; + subdividedPositions[index++] = p0.x; + subdividedPositions[index++] = p0.y; + subdividedPositions[index++] = p0.z; + subdividedPositions[index++] = p1.x; + subdividedPositions[index++] = p1.y; + subdividedPositions[index++] = p1.z; + } + } + length = subdividedPositions.length / 3; + const indicesSize = length * 2; + const indices = IndexDatatype_default.createTypedArray(length, indicesSize); + index = 0; + for (i = 0; i < length - 1; i++) { + indices[index++] = i; + indices[index++] = i + 1; + } + indices[index++] = length - 1; + indices[index++] = 0; + return new GeometryInstance_default({ + geometry: new Geometry_default({ + attributes: new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: subdividedPositions + }) + }), + indices, + primitiveType: PrimitiveType_default.LINES + }) + }); +} +function createGeometryFromPositionsExtruded(ellipsoid, positions, minDistance, perPositionHeight, arcType) { + const tangentPlane = EllipsoidTangentPlane_default.fromPoints(positions, ellipsoid); + const positions2D = tangentPlane.projectPointsOntoPlane( + positions, + createGeometryFromPositionsPositions + ); + const originalWindingOrder = PolygonPipeline_default.computeWindingOrder2D( + positions2D + ); + if (originalWindingOrder === WindingOrder_default.CLOCKWISE) { + positions2D.reverse(); + positions = positions.slice().reverse(); + } + let subdividedPositions; + let i; + let length = positions.length; + const corners = new Array(length); + let index = 0; + if (!perPositionHeight) { + let numVertices = 0; + if (arcType === ArcType_default.GEODESIC) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary_default.subdivideLineCount( + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } else if (arcType === ArcType_default.RHUMB) { + for (i = 0; i < length; i++) { + numVertices += PolygonGeometryLibrary_default.subdivideRhumbLineCount( + ellipsoid, + positions[i], + positions[(i + 1) % length], + minDistance + ); + } + } + subdividedPositions = new Float64Array(numVertices * 3 * 2); + for (i = 0; i < length; ++i) { + corners[i] = index / 3; + let tempPositions; + if (arcType === ArcType_default.GEODESIC) { + tempPositions = PolygonGeometryLibrary_default.subdivideLine( + positions[i], + positions[(i + 1) % length], + minDistance, + createGeometryFromPositionsSubdivided + ); + } else if (arcType === ArcType_default.RHUMB) { + tempPositions = PolygonGeometryLibrary_default.subdivideRhumbLine( + ellipsoid, + positions[i], + positions[(i + 1) % length], + minDistance, + createGeometryFromPositionsSubdivided + ); + } + const tempPositionsLength = tempPositions.length; + for (let j = 0; j < tempPositionsLength; ++j) { + subdividedPositions[index++] = tempPositions[j]; + } + } + } else { + subdividedPositions = new Float64Array(length * 2 * 3 * 2); + for (i = 0; i < length; ++i) { + corners[i] = index / 3; + const p0 = positions[i]; + const p1 = positions[(i + 1) % length]; + subdividedPositions[index++] = p0.x; + subdividedPositions[index++] = p0.y; + subdividedPositions[index++] = p0.z; + subdividedPositions[index++] = p1.x; + subdividedPositions[index++] = p1.y; + subdividedPositions[index++] = p1.z; + } + } + length = subdividedPositions.length / (3 * 2); + const cornersLength = corners.length; + const indicesSize = (length * 2 + cornersLength) * 2; + const indices = IndexDatatype_default.createTypedArray( + length + cornersLength, + indicesSize + ); + index = 0; + for (i = 0; i < length; ++i) { + indices[index++] = i; + indices[index++] = (i + 1) % length; + indices[index++] = i + length; + indices[index++] = (i + 1) % length + length; + } + for (i = 0; i < cornersLength; i++) { + const corner = corners[i]; + indices[index++] = corner; + indices[index++] = corner + length; + } + return new GeometryInstance_default({ + geometry: new Geometry_default({ + attributes: new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: subdividedPositions + }) + }), + indices, + primitiveType: PrimitiveType_default.LINES + }) + }); +} +function PolygonOutlineGeometry(options) { + Check_default.typeOf.object("options", options); + Check_default.typeOf.object("options.polygonHierarchy", options.polygonHierarchy); + if (options.perPositionHeight && defined_default(options.height)) { + throw new DeveloperError_default( + "Cannot use both options.perPositionHeight and options.height" + ); + } + if (defined_default(options.arcType) && options.arcType !== ArcType_default.GEODESIC && options.arcType !== ArcType_default.RHUMB) { + throw new DeveloperError_default( + "Invalid arcType. Valid options are ArcType.GEODESIC and ArcType.RHUMB." + ); + } + const polygonHierarchy = options.polygonHierarchy; + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const perPositionHeight = defaultValue_default(options.perPositionHeight, false); + const perPositionHeightExtrude = perPositionHeight && defined_default(options.extrudedHeight); + const arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC); + let height = defaultValue_default(options.height, 0); + let extrudedHeight = defaultValue_default(options.extrudedHeight, height); + if (!perPositionHeightExtrude) { + const h = Math.max(height, extrudedHeight); + extrudedHeight = Math.min(height, extrudedHeight); + height = h; + } + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._granularity = granularity; + this._height = height; + this._extrudedHeight = extrudedHeight; + this._arcType = arcType; + this._polygonHierarchy = polygonHierarchy; + this._perPositionHeight = perPositionHeight; + this._perPositionHeightExtrude = perPositionHeightExtrude; + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createPolygonOutlineGeometry"; + this.packedLength = PolygonGeometryLibrary_default.computeHierarchyPackedLength( + polygonHierarchy, + Cartesian3_default + ) + Ellipsoid_default.packedLength + 8; +} +PolygonOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + startingIndex = PolygonGeometryLibrary_default.packPolygonHierarchy( + value._polygonHierarchy, + array, + startingIndex, + Cartesian3_default + ); + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._height; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._perPositionHeightExtrude ? 1 : 0; + array[startingIndex++] = value._perPositionHeight ? 1 : 0; + array[startingIndex++] = value._arcType; + array[startingIndex++] = defaultValue_default(value._offsetAttribute, -1); + array[startingIndex] = value.packedLength; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var dummyOptions = { + polygonHierarchy: {} +}; +PolygonOutlineGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const polygonHierarchy = PolygonGeometryLibrary_default.unpackPolygonHierarchy( + array, + startingIndex, + Cartesian3_default + ); + startingIndex = polygonHierarchy.startingIndex; + delete polygonHierarchy.startingIndex; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const height = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const granularity = array[startingIndex++]; + const perPositionHeightExtrude = array[startingIndex++] === 1; + const perPositionHeight = array[startingIndex++] === 1; + const arcType = array[startingIndex++]; + const offsetAttribute = array[startingIndex++]; + const packedLength = array[startingIndex]; + if (!defined_default(result)) { + result = new PolygonOutlineGeometry(dummyOptions); + } + result._polygonHierarchy = polygonHierarchy; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._height = height; + result._extrudedHeight = extrudedHeight; + result._granularity = granularity; + result._perPositionHeight = perPositionHeight; + result._perPositionHeightExtrude = perPositionHeightExtrude; + result._arcType = arcType; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + result.packedLength = packedLength; + return result; +}; +PolygonOutlineGeometry.fromPositions = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + Check_default.defined("options.positions", options.positions); + const newOptions = { + polygonHierarchy: { + positions: options.positions + }, + height: options.height, + extrudedHeight: options.extrudedHeight, + ellipsoid: options.ellipsoid, + granularity: options.granularity, + perPositionHeight: options.perPositionHeight, + arcType: options.arcType, + offsetAttribute: options.offsetAttribute + }; + return new PolygonOutlineGeometry(newOptions); +}; +PolygonOutlineGeometry.createGeometry = function(polygonGeometry) { + const ellipsoid = polygonGeometry._ellipsoid; + const granularity = polygonGeometry._granularity; + const polygonHierarchy = polygonGeometry._polygonHierarchy; + const perPositionHeight = polygonGeometry._perPositionHeight; + const arcType = polygonGeometry._arcType; + const polygons = PolygonGeometryLibrary_default.polygonOutlinesFromHierarchy( + polygonHierarchy, + !perPositionHeight, + ellipsoid + ); + if (polygons.length === 0) { + return void 0; + } + let geometryInstance; + const geometries = []; + const minDistance = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + const height = polygonGeometry._height; + const extrudedHeight = polygonGeometry._extrudedHeight; + const extrude = polygonGeometry._perPositionHeightExtrude || !Math_default.equalsEpsilon(height, extrudedHeight, 0, Math_default.EPSILON2); + let offsetValue; + let i; + if (extrude) { + for (i = 0; i < polygons.length; i++) { + geometryInstance = createGeometryFromPositionsExtruded( + ellipsoid, + polygons[i], + minDistance, + perPositionHeight, + arcType + ); + geometryInstance.geometry = PolygonGeometryLibrary_default.scaleToGeodeticHeightExtruded( + geometryInstance.geometry, + height, + extrudedHeight, + ellipsoid, + perPositionHeight + ); + if (defined_default(polygonGeometry._offsetAttribute)) { + const size = geometryInstance.geometry.attributes.position.values.length / 3; + let offsetAttribute = new Uint8Array(size); + if (polygonGeometry._offsetAttribute === GeometryOffsetAttribute_default.TOP) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else { + offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute_default( + { + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + } + ); + } + geometries.push(geometryInstance); + } + } else { + for (i = 0; i < polygons.length; i++) { + geometryInstance = createGeometryFromPositions( + ellipsoid, + polygons[i], + minDistance, + perPositionHeight, + arcType + ); + geometryInstance.geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + geometryInstance.geometry.attributes.position.values, + height, + ellipsoid, + !perPositionHeight + ); + if (defined_default(polygonGeometry._offsetAttribute)) { + const length = geometryInstance.geometry.attributes.position.values.length; + offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute_default( + { + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + } + ); + } + geometries.push(geometryInstance); + } + } + const geometry = GeometryPipeline_default.combineInstances(geometries)[0]; + const boundingSphere = BoundingSphere_default.fromVertices( + geometry.attributes.position.values + ); + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: geometry.primitiveType, + boundingSphere, + offsetAttribute: polygonGeometry._offsetAttribute + }); +}; +var PolygonOutlineGeometry_default = PolygonOutlineGeometry; + +// packages/engine/Source/Workers/createPolygonOutlineGeometry.js +function createPolygonOutlineGeometry(polygonGeometry, offset) { + if (defined_default(offset)) { + polygonGeometry = PolygonOutlineGeometry_default.unpack(polygonGeometry, offset); + } + polygonGeometry._ellipsoid = Ellipsoid_default.clone(polygonGeometry._ellipsoid); + return PolygonOutlineGeometry_default.createGeometry(polygonGeometry); +} +var createPolygonOutlineGeometry_default = createPolygonOutlineGeometry; +export { + createPolygonOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPolylineGeometry.js b/public/assets/cesium/Workers/createPolylineGeometry.js new file mode 100644 index 0000000..cd27c45 --- /dev/null +++ b/public/assets/cesium/Workers/createPolylineGeometry.js @@ -0,0 +1,494 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Color_default +} from "./chunk-HP5XLODI.js"; +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + PolylinePipeline_default +} from "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + GeometryType_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolylineGeometry.js +var scratchInterpolateColorsArray = []; +function interpolateColors(p0, p1, color0, color1, numPoints) { + const colors = scratchInterpolateColorsArray; + colors.length = numPoints; + let i; + const r0 = color0.red; + const g0 = color0.green; + const b0 = color0.blue; + const a0 = color0.alpha; + const r1 = color1.red; + const g1 = color1.green; + const b1 = color1.blue; + const a1 = color1.alpha; + if (Color_default.equals(color0, color1)) { + for (i = 0; i < numPoints; i++) { + colors[i] = Color_default.clone(color0); + } + return colors; + } + const redPerVertex = (r1 - r0) / numPoints; + const greenPerVertex = (g1 - g0) / numPoints; + const bluePerVertex = (b1 - b0) / numPoints; + const alphaPerVertex = (a1 - a0) / numPoints; + for (i = 0; i < numPoints; i++) { + colors[i] = new Color_default( + r0 + i * redPerVertex, + g0 + i * greenPerVertex, + b0 + i * bluePerVertex, + a0 + i * alphaPerVertex + ); + } + return colors; +} +function PolylineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + const colors = options.colors; + const width = defaultValue_default(options.width, 1); + const colorsPerVertex = defaultValue_default(options.colorsPerVertex, false); + if (!defined_default(positions) || positions.length < 2) { + throw new DeveloperError_default("At least two positions are required."); + } + if (typeof width !== "number") { + throw new DeveloperError_default("width must be a number"); + } + if (defined_default(colors) && (colorsPerVertex && colors.length < positions.length || !colorsPerVertex && colors.length < positions.length - 1)) { + throw new DeveloperError_default("colors has an invalid length."); + } + this._positions = positions; + this._colors = colors; + this._width = width; + this._colorsPerVertex = colorsPerVertex; + this._vertexFormat = VertexFormat_default.clone( + defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT) + ); + this._arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._workerName = "createPolylineGeometry"; + let numComponents = 1 + positions.length * Cartesian3_default.packedLength; + numComponents += defined_default(colors) ? 1 + colors.length * Color_default.packedLength : 1; + this.packedLength = numComponents + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 4; +} +PolylineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const colors = value._colors; + length = defined_default(colors) ? colors.length : 0; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Color_default.packedLength) { + Color_default.pack(colors[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._width; + array[startingIndex++] = value._colorsPerVertex ? 1 : 0; + array[startingIndex++] = value._arcType; + array[startingIndex] = value._granularity; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + positions: void 0, + colors: void 0, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + width: void 0, + colorsPerVertex: void 0, + arcType: void 0, + granularity: void 0 +}; +PolylineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + const colors = length > 0 ? new Array(length) : void 0; + for (i = 0; i < length; ++i, startingIndex += Color_default.packedLength) { + colors[i] = Color_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const width = array[startingIndex++]; + const colorsPerVertex = array[startingIndex++] === 1; + const arcType = array[startingIndex++]; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.positions = positions; + scratchOptions.colors = colors; + scratchOptions.width = width; + scratchOptions.colorsPerVertex = colorsPerVertex; + scratchOptions.arcType = arcType; + scratchOptions.granularity = granularity; + return new PolylineGeometry(scratchOptions); + } + result._positions = positions; + result._colors = colors; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._width = width; + result._colorsPerVertex = colorsPerVertex; + result._arcType = arcType; + result._granularity = granularity; + return result; +}; +var scratchCartesian3 = new Cartesian3_default(); +var scratchPosition = new Cartesian3_default(); +var scratchPrevPosition = new Cartesian3_default(); +var scratchNextPosition = new Cartesian3_default(); +PolylineGeometry.createGeometry = function(polylineGeometry) { + const width = polylineGeometry._width; + const vertexFormat = polylineGeometry._vertexFormat; + let colors = polylineGeometry._colors; + const colorsPerVertex = polylineGeometry._colorsPerVertex; + const arcType = polylineGeometry._arcType; + const granularity = polylineGeometry._granularity; + const ellipsoid = polylineGeometry._ellipsoid; + let i; + let j; + let k; + const removedIndices = []; + let positions = arrayRemoveDuplicates_default( + polylineGeometry._positions, + Cartesian3_default.equalsEpsilon, + false, + removedIndices + ); + if (defined_default(colors) && removedIndices.length > 0) { + let removedArrayIndex = 0; + let nextRemovedIndex = removedIndices[0]; + colors = colors.filter(function(color, index2) { + let remove = false; + if (colorsPerVertex) { + remove = index2 === nextRemovedIndex || index2 === 0 && nextRemovedIndex === 1; + } else { + remove = index2 + 1 === nextRemovedIndex; + } + if (remove) { + removedArrayIndex++; + nextRemovedIndex = removedIndices[removedArrayIndex]; + return false; + } + return true; + }); + } + let positionsLength = positions.length; + if (positionsLength < 2 || width <= 0) { + return void 0; + } + if (arcType === ArcType_default.GEODESIC || arcType === ArcType_default.RHUMB) { + let subdivisionSize; + let numberOfPointsFunction; + if (arcType === ArcType_default.GEODESIC) { + subdivisionSize = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + numberOfPointsFunction = PolylinePipeline_default.numberOfPoints; + } else { + subdivisionSize = granularity; + numberOfPointsFunction = PolylinePipeline_default.numberOfPointsRhumbLine; + } + const heights = PolylinePipeline_default.extractHeights(positions, ellipsoid); + if (defined_default(colors)) { + let colorLength = 1; + for (i = 0; i < positionsLength - 1; ++i) { + colorLength += numberOfPointsFunction( + positions[i], + positions[i + 1], + subdivisionSize + ); + } + const newColors = new Array(colorLength); + let newColorIndex = 0; + for (i = 0; i < positionsLength - 1; ++i) { + const p0 = positions[i]; + const p1 = positions[i + 1]; + const c0 = colors[i]; + const numColors = numberOfPointsFunction(p0, p1, subdivisionSize); + if (colorsPerVertex && i < colorLength) { + const c1 = colors[i + 1]; + const interpolatedColors = interpolateColors( + p0, + p1, + c0, + c1, + numColors + ); + const interpolatedColorsLength = interpolatedColors.length; + for (j = 0; j < interpolatedColorsLength; ++j) { + newColors[newColorIndex++] = interpolatedColors[j]; + } + } else { + for (j = 0; j < numColors; ++j) { + newColors[newColorIndex++] = Color_default.clone(c0); + } + } + } + newColors[newColorIndex] = Color_default.clone(colors[colors.length - 1]); + colors = newColors; + scratchInterpolateColorsArray.length = 0; + } + if (arcType === ArcType_default.GEODESIC) { + positions = PolylinePipeline_default.generateCartesianArc({ + positions, + minDistance: subdivisionSize, + ellipsoid, + height: heights + }); + } else { + positions = PolylinePipeline_default.generateCartesianRhumbArc({ + positions, + granularity: subdivisionSize, + ellipsoid, + height: heights + }); + } + } + positionsLength = positions.length; + const size = positionsLength * 4 - 4; + const finalPositions = new Float64Array(size * 3); + const prevPositions = new Float64Array(size * 3); + const nextPositions = new Float64Array(size * 3); + const expandAndWidth = new Float32Array(size * 2); + const st = vertexFormat.st ? new Float32Array(size * 2) : void 0; + const finalColors = defined_default(colors) ? new Uint8Array(size * 4) : void 0; + let positionIndex = 0; + let expandAndWidthIndex = 0; + let stIndex = 0; + let colorIndex = 0; + let position; + for (j = 0; j < positionsLength; ++j) { + if (j === 0) { + position = scratchCartesian3; + Cartesian3_default.subtract(positions[0], positions[1], position); + Cartesian3_default.add(positions[0], position, position); + } else { + position = positions[j - 1]; + } + Cartesian3_default.clone(position, scratchPrevPosition); + Cartesian3_default.clone(positions[j], scratchPosition); + if (j === positionsLength - 1) { + position = scratchCartesian3; + Cartesian3_default.subtract( + positions[positionsLength - 1], + positions[positionsLength - 2], + position + ); + Cartesian3_default.add(positions[positionsLength - 1], position, position); + } else { + position = positions[j + 1]; + } + Cartesian3_default.clone(position, scratchNextPosition); + let color0, color1; + if (defined_default(finalColors)) { + if (j !== 0 && !colorsPerVertex) { + color0 = colors[j - 1]; + } else { + color0 = colors[j]; + } + if (j !== positionsLength - 1) { + color1 = colors[j]; + } + } + const startK = j === 0 ? 2 : 0; + const endK = j === positionsLength - 1 ? 2 : 4; + for (k = startK; k < endK; ++k) { + Cartesian3_default.pack(scratchPosition, finalPositions, positionIndex); + Cartesian3_default.pack(scratchPrevPosition, prevPositions, positionIndex); + Cartesian3_default.pack(scratchNextPosition, nextPositions, positionIndex); + positionIndex += 3; + const direction = k - 2 < 0 ? -1 : 1; + expandAndWidth[expandAndWidthIndex++] = 2 * (k % 2) - 1; + expandAndWidth[expandAndWidthIndex++] = direction * width; + if (vertexFormat.st) { + st[stIndex++] = j / (positionsLength - 1); + st[stIndex++] = Math.max(expandAndWidth[expandAndWidthIndex - 2], 0); + } + if (defined_default(finalColors)) { + const color = k < 2 ? color0 : color1; + finalColors[colorIndex++] = Color_default.floatToByte(color.red); + finalColors[colorIndex++] = Color_default.floatToByte(color.green); + finalColors[colorIndex++] = Color_default.floatToByte(color.blue); + finalColors[colorIndex++] = Color_default.floatToByte(color.alpha); + } + } + } + const attributes = new GeometryAttributes_default(); + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: finalPositions + }); + attributes.prevPosition = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: prevPositions + }); + attributes.nextPosition = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: nextPositions + }); + attributes.expandAndWidth = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: expandAndWidth + }); + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: st + }); + } + if (defined_default(finalColors)) { + attributes.color = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 4, + values: finalColors, + normalize: true + }); + } + const indices = IndexDatatype_default.createTypedArray(size, positionsLength * 6 - 6); + let index = 0; + let indicesIndex = 0; + const length = positionsLength - 1; + for (j = 0; j < length; ++j) { + indices[indicesIndex++] = index; + indices[indicesIndex++] = index + 2; + indices[indicesIndex++] = index + 1; + indices[indicesIndex++] = index + 1; + indices[indicesIndex++] = index + 2; + indices[indicesIndex++] = index + 3; + index += 4; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: BoundingSphere_default.fromPoints(positions), + geometryType: GeometryType_default.POLYLINES + }); +}; +var PolylineGeometry_default = PolylineGeometry; + +// packages/engine/Source/Workers/createPolylineGeometry.js +function createPolylineGeometry(polylineGeometry, offset) { + if (defined_default(offset)) { + polylineGeometry = PolylineGeometry_default.unpack(polylineGeometry, offset); + } + polylineGeometry._ellipsoid = Ellipsoid_default.clone(polylineGeometry._ellipsoid); + return PolylineGeometry_default.createGeometry(polylineGeometry); +} +var createPolylineGeometry_default = createPolylineGeometry; +export { + createPolylineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPolylineVolumeGeometry.js b/public/assets/cesium/Workers/createPolylineVolumeGeometry.js new file mode 100644 index 0000000..f6233d2 --- /dev/null +++ b/public/assets/cesium/Workers/createPolylineVolumeGeometry.js @@ -0,0 +1,377 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + BoundingRectangle_default +} from "./chunk-44QAAS4P.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import { + CornerType_default, + PolylineVolumeGeometryLibrary_default, + oneTimeWarning_default +} from "./chunk-3IFRSGEY.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default, + WindingOrder_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolylineVolumeGeometry.js +function computeAttributes(combinedPositions, shape, boundingRectangle, vertexFormat) { + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: combinedPositions + }); + } + const shapeLength = shape.length; + const vertexCount = combinedPositions.length / 3; + const length = (vertexCount - shapeLength * 2) / (shapeLength * 2); + const firstEndIndices = PolygonPipeline_default.triangulate(shape); + const indicesCount = (length - 1) * shapeLength * 6 + firstEndIndices.length * 2; + const indices = IndexDatatype_default.createTypedArray(vertexCount, indicesCount); + let i, j; + let ll, ul, ur, lr; + const offset = shapeLength * 2; + let index = 0; + for (i = 0; i < length - 1; i++) { + for (j = 0; j < shapeLength - 1; j++) { + ll = j * 2 + i * shapeLength * 2; + lr = ll + offset; + ul = ll + 1; + ur = ul + offset; + indices[index++] = ul; + indices[index++] = ll; + indices[index++] = ur; + indices[index++] = ur; + indices[index++] = ll; + indices[index++] = lr; + } + ll = shapeLength * 2 - 2 + i * shapeLength * 2; + ul = ll + 1; + ur = ul + offset; + lr = ll + offset; + indices[index++] = ul; + indices[index++] = ll; + indices[index++] = ur; + indices[index++] = ur; + indices[index++] = ll; + indices[index++] = lr; + } + if (vertexFormat.st || vertexFormat.tangent || vertexFormat.bitangent) { + const st = new Float32Array(vertexCount * 2); + const lengthSt = 1 / (length - 1); + const heightSt = 1 / boundingRectangle.height; + const heightOffset = boundingRectangle.height / 2; + let s, t; + let stindex = 0; + for (i = 0; i < length; i++) { + s = i * lengthSt; + t = heightSt * (shape[0].y + heightOffset); + st[stindex++] = s; + st[stindex++] = t; + for (j = 1; j < shapeLength; j++) { + t = heightSt * (shape[j].y + heightOffset); + st[stindex++] = s; + st[stindex++] = t; + st[stindex++] = s; + st[stindex++] = t; + } + t = heightSt * (shape[0].y + heightOffset); + st[stindex++] = s; + st[stindex++] = t; + } + for (j = 0; j < shapeLength; j++) { + s = 0; + t = heightSt * (shape[j].y + heightOffset); + st[stindex++] = s; + st[stindex++] = t; + } + for (j = 0; j < shapeLength; j++) { + s = (length - 1) * lengthSt; + t = heightSt * (shape[j].y + heightOffset); + st[stindex++] = s; + st[stindex++] = t; + } + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: new Float32Array(st) + }); + } + const endOffset = vertexCount - shapeLength * 2; + for (i = 0; i < firstEndIndices.length; i += 3) { + const v0 = firstEndIndices[i] + endOffset; + const v1 = firstEndIndices[i + 1] + endOffset; + const v2 = firstEndIndices[i + 2] + endOffset; + indices[index++] = v0; + indices[index++] = v1; + indices[index++] = v2; + indices[index++] = v2 + shapeLength; + indices[index++] = v1 + shapeLength; + indices[index++] = v0 + shapeLength; + } + let geometry = new Geometry_default({ + attributes, + indices, + boundingSphere: BoundingSphere_default.fromVertices(combinedPositions), + primitiveType: PrimitiveType_default.TRIANGLES + }); + if (vertexFormat.normal) { + geometry = GeometryPipeline_default.computeNormal(geometry); + } + if (vertexFormat.tangent || vertexFormat.bitangent) { + try { + geometry = GeometryPipeline_default.computeTangentAndBitangent(geometry); + } catch (e) { + oneTimeWarning_default( + "polyline-volume-tangent-bitangent", + "Unable to compute tangents and bitangents for polyline volume geometry" + ); + } + if (!vertexFormat.tangent) { + geometry.attributes.tangent = void 0; + } + if (!vertexFormat.bitangent) { + geometry.attributes.bitangent = void 0; + } + if (!vertexFormat.st) { + geometry.attributes.st = void 0; + } + } + return geometry; +} +function PolylineVolumeGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.polylinePositions; + const shape = options.shapePositions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.polylinePositions is required."); + } + if (!defined_default(shape)) { + throw new DeveloperError_default("options.shapePositions is required."); + } + this._positions = positions; + this._shape = shape; + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._cornerType = defaultValue_default(options.cornerType, CornerType_default.ROUNDED); + this._vertexFormat = VertexFormat_default.clone( + defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT) + ); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._workerName = "createPolylineVolumeGeometry"; + let numComponents = 1 + positions.length * Cartesian3_default.packedLength; + numComponents += 1 + shape.length * Cartesian2_default.packedLength; + this.packedLength = numComponents + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 2; +} +PolylineVolumeGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const shape = value._shape; + length = shape.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian2_default.packedLength) { + Cartesian2_default.pack(shape[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._cornerType; + array[startingIndex] = value._granularity; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + polylinePositions: void 0, + shapePositions: void 0, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + cornerType: void 0, + granularity: void 0 +}; +PolylineVolumeGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + const shape = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian2_default.packedLength) { + shape[i] = Cartesian2_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const cornerType = array[startingIndex++]; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.polylinePositions = positions; + scratchOptions.shapePositions = shape; + scratchOptions.cornerType = cornerType; + scratchOptions.granularity = granularity; + return new PolylineVolumeGeometry(scratchOptions); + } + result._positions = positions; + result._shape = shape; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._cornerType = cornerType; + result._granularity = granularity; + return result; +}; +var brScratch = new BoundingRectangle_default(); +PolylineVolumeGeometry.createGeometry = function(polylineVolumeGeometry) { + const positions = polylineVolumeGeometry._positions; + const cleanPositions = arrayRemoveDuplicates_default( + positions, + Cartesian3_default.equalsEpsilon + ); + let shape2D = polylineVolumeGeometry._shape; + shape2D = PolylineVolumeGeometryLibrary_default.removeDuplicatesFromShape(shape2D); + if (cleanPositions.length < 2 || shape2D.length < 3) { + return void 0; + } + if (PolygonPipeline_default.computeWindingOrder2D(shape2D) === WindingOrder_default.CLOCKWISE) { + shape2D.reverse(); + } + const boundingRectangle = BoundingRectangle_default.fromPoints(shape2D, brScratch); + const computedPositions = PolylineVolumeGeometryLibrary_default.computePositions( + cleanPositions, + shape2D, + boundingRectangle, + polylineVolumeGeometry, + true + ); + return computeAttributes( + computedPositions, + shape2D, + boundingRectangle, + polylineVolumeGeometry._vertexFormat + ); +}; +var PolylineVolumeGeometry_default = PolylineVolumeGeometry; + +// packages/engine/Source/Workers/createPolylineVolumeGeometry.js +function createPolylineVolumeGeometry(polylineVolumeGeometry, offset) { + if (defined_default(offset)) { + polylineVolumeGeometry = PolylineVolumeGeometry_default.unpack( + polylineVolumeGeometry, + offset + ); + } + polylineVolumeGeometry._ellipsoid = Ellipsoid_default.clone( + polylineVolumeGeometry._ellipsoid + ); + return PolylineVolumeGeometry_default.createGeometry(polylineVolumeGeometry); +} +var createPolylineVolumeGeometry_default = createPolylineVolumeGeometry; +export { + createPolylineVolumeGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js b/public/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js new file mode 100644 index 0000000..e7861ff --- /dev/null +++ b/public/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js @@ -0,0 +1,275 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + BoundingRectangle_default +} from "./chunk-44QAAS4P.js"; +import { + CornerType_default, + PolylineVolumeGeometryLibrary_default +} from "./chunk-3IFRSGEY.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import { + PolygonPipeline_default, + WindingOrder_default +} from "./chunk-TI3TRKIC.js"; +import { + arrayRemoveDuplicates_default +} from "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/PolylineVolumeOutlineGeometry.js +function computeAttributes(positions, shape) { + const attributes = new GeometryAttributes_default(); + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + const shapeLength = shape.length; + const vertexCount = attributes.position.values.length / 3; + const positionLength = positions.length / 3; + const shapeCount = positionLength / shapeLength; + const indices = IndexDatatype_default.createTypedArray( + vertexCount, + 2 * shapeLength * (shapeCount + 1) + ); + let i, j; + let index = 0; + i = 0; + let offset = i * shapeLength; + for (j = 0; j < shapeLength - 1; j++) { + indices[index++] = j + offset; + indices[index++] = j + offset + 1; + } + indices[index++] = shapeLength - 1 + offset; + indices[index++] = offset; + i = shapeCount - 1; + offset = i * shapeLength; + for (j = 0; j < shapeLength - 1; j++) { + indices[index++] = j + offset; + indices[index++] = j + offset + 1; + } + indices[index++] = shapeLength - 1 + offset; + indices[index++] = offset; + for (i = 0; i < shapeCount - 1; i++) { + const firstOffset = shapeLength * i; + const secondOffset = firstOffset + shapeLength; + for (j = 0; j < shapeLength; j++) { + indices[index++] = j + firstOffset; + indices[index++] = j + secondOffset; + } + } + const geometry = new Geometry_default({ + attributes, + indices: IndexDatatype_default.createTypedArray(vertexCount, indices), + boundingSphere: BoundingSphere_default.fromVertices(positions), + primitiveType: PrimitiveType_default.LINES + }); + return geometry; +} +function PolylineVolumeOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.polylinePositions; + const shape = options.shapePositions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.polylinePositions is required."); + } + if (!defined_default(shape)) { + throw new DeveloperError_default("options.shapePositions is required."); + } + this._positions = positions; + this._shape = shape; + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._cornerType = defaultValue_default(options.cornerType, CornerType_default.ROUNDED); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._workerName = "createPolylineVolumeOutlineGeometry"; + let numComponents = 1 + positions.length * Cartesian3_default.packedLength; + numComponents += 1 + shape.length * Cartesian2_default.packedLength; + this.packedLength = numComponents + Ellipsoid_default.packedLength + 2; +} +PolylineVolumeOutlineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const shape = value._shape; + length = shape.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian2_default.packedLength) { + Cartesian2_default.pack(shape[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._cornerType; + array[startingIndex] = value._granularity; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchOptions = { + polylinePositions: void 0, + shapePositions: void 0, + ellipsoid: scratchEllipsoid, + height: void 0, + cornerType: void 0, + granularity: void 0 +}; +PolylineVolumeOutlineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + const shape = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian2_default.packedLength) { + shape[i] = Cartesian2_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const cornerType = array[startingIndex++]; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.polylinePositions = positions; + scratchOptions.shapePositions = shape; + scratchOptions.cornerType = cornerType; + scratchOptions.granularity = granularity; + return new PolylineVolumeOutlineGeometry(scratchOptions); + } + result._positions = positions; + result._shape = shape; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._cornerType = cornerType; + result._granularity = granularity; + return result; +}; +var brScratch = new BoundingRectangle_default(); +PolylineVolumeOutlineGeometry.createGeometry = function(polylineVolumeOutlineGeometry) { + const positions = polylineVolumeOutlineGeometry._positions; + const cleanPositions = arrayRemoveDuplicates_default( + positions, + Cartesian3_default.equalsEpsilon + ); + let shape2D = polylineVolumeOutlineGeometry._shape; + shape2D = PolylineVolumeGeometryLibrary_default.removeDuplicatesFromShape(shape2D); + if (cleanPositions.length < 2 || shape2D.length < 3) { + return void 0; + } + if (PolygonPipeline_default.computeWindingOrder2D(shape2D) === WindingOrder_default.CLOCKWISE) { + shape2D.reverse(); + } + const boundingRectangle = BoundingRectangle_default.fromPoints(shape2D, brScratch); + const computedPositions = PolylineVolumeGeometryLibrary_default.computePositions( + cleanPositions, + shape2D, + boundingRectangle, + polylineVolumeOutlineGeometry, + false + ); + return computeAttributes(computedPositions, shape2D); +}; +var PolylineVolumeOutlineGeometry_default = PolylineVolumeOutlineGeometry; + +// packages/engine/Source/Workers/createPolylineVolumeOutlineGeometry.js +function createPolylineVolumeOutlineGeometry(polylineVolumeOutlineGeometry, offset) { + if (defined_default(offset)) { + polylineVolumeOutlineGeometry = PolylineVolumeOutlineGeometry_default.unpack( + polylineVolumeOutlineGeometry, + offset + ); + } + polylineVolumeOutlineGeometry._ellipsoid = Ellipsoid_default.clone( + polylineVolumeOutlineGeometry._ellipsoid + ); + return PolylineVolumeOutlineGeometry_default.createGeometry( + polylineVolumeOutlineGeometry + ); +} +var createPolylineVolumeOutlineGeometry_default = createPolylineVolumeOutlineGeometry; +export { + createPolylineVolumeOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createRectangleGeometry.js b/public/assets/cesium/Workers/createRectangleGeometry.js new file mode 100644 index 0000000..fe38f98 --- /dev/null +++ b/public/assets/cesium/Workers/createRectangleGeometry.js @@ -0,0 +1,1272 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + RectangleGeometryLibrary_default +} from "./chunk-BVKITG4N.js"; +import { + GeometryInstance_default +} from "./chunk-YSIJTJ7N.js"; +import { + GeometryPipeline_default +} from "./chunk-7ZZ5LMZY.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-NGZJIN5Z.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import { + PolygonPipeline_default +} from "./chunk-TI3TRKIC.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix2_default, + Quaternion_default, + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/RectangleGeometry.js +var positionScratch = new Cartesian3_default(); +var normalScratch = new Cartesian3_default(); +var tangentScratch = new Cartesian3_default(); +var bitangentScratch = new Cartesian3_default(); +var rectangleScratch = new Rectangle_default(); +var stScratch = new Cartesian2_default(); +var bottomBoundingSphere = new BoundingSphere_default(); +var topBoundingSphere = new BoundingSphere_default(); +function createAttributes(vertexFormat, attributes) { + const geo = new Geometry_default({ + attributes: new GeometryAttributes_default(), + primitiveType: PrimitiveType_default.TRIANGLES + }); + geo.attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: attributes.positions + }); + if (vertexFormat.normal) { + geo.attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attributes.normals + }); + } + if (vertexFormat.tangent) { + geo.attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attributes.tangents + }); + } + if (vertexFormat.bitangent) { + geo.attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: attributes.bitangents + }); + } + return geo; +} +function calculateAttributes(positions, vertexFormat, ellipsoid, tangentRotationMatrix) { + const length = positions.length; + const normals = vertexFormat.normal ? new Float32Array(length) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(length) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(length) : void 0; + let attrIndex = 0; + const bitangent = bitangentScratch; + const tangent = tangentScratch; + let normal = normalScratch; + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + for (let i = 0; i < length; i += 3) { + const p = Cartesian3_default.fromArray(positions, i, positionScratch); + const attrIndex1 = attrIndex + 1; + const attrIndex2 = attrIndex + 2; + normal = ellipsoid.geodeticSurfaceNormal(p, normal); + if (vertexFormat.tangent || vertexFormat.bitangent) { + Cartesian3_default.cross(Cartesian3_default.UNIT_Z, normal, tangent); + Matrix3_default.multiplyByVector(tangentRotationMatrix, tangent, tangent); + Cartesian3_default.normalize(tangent, tangent); + if (vertexFormat.bitangent) { + Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + } + } + if (vertexFormat.normal) { + normals[attrIndex] = normal.x; + normals[attrIndex1] = normal.y; + normals[attrIndex2] = normal.z; + } + if (vertexFormat.tangent) { + tangents[attrIndex] = tangent.x; + tangents[attrIndex1] = tangent.y; + tangents[attrIndex2] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangents[attrIndex] = bitangent.x; + bitangents[attrIndex1] = bitangent.y; + bitangents[attrIndex2] = bitangent.z; + } + attrIndex += 3; + } + } + return createAttributes(vertexFormat, { + positions, + normals, + tangents, + bitangents + }); +} +var v1Scratch = new Cartesian3_default(); +var v2Scratch = new Cartesian3_default(); +function calculateAttributesWall(positions, vertexFormat, ellipsoid) { + const length = positions.length; + const normals = vertexFormat.normal ? new Float32Array(length) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(length) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(length) : void 0; + let normalIndex = 0; + let tangentIndex = 0; + let bitangentIndex = 0; + let recomputeNormal = true; + let bitangent = bitangentScratch; + let tangent = tangentScratch; + let normal = normalScratch; + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + for (let i = 0; i < length; i += 6) { + const p = Cartesian3_default.fromArray(positions, i, positionScratch); + const p1 = Cartesian3_default.fromArray(positions, (i + 6) % length, v1Scratch); + if (recomputeNormal) { + const p2 = Cartesian3_default.fromArray(positions, (i + 3) % length, v2Scratch); + Cartesian3_default.subtract(p1, p, p1); + Cartesian3_default.subtract(p2, p, p2); + normal = Cartesian3_default.normalize(Cartesian3_default.cross(p2, p1, normal), normal); + recomputeNormal = false; + } + if (Cartesian3_default.equalsEpsilon(p1, p, Math_default.EPSILON10)) { + recomputeNormal = true; + } + if (vertexFormat.tangent || vertexFormat.bitangent) { + bitangent = ellipsoid.geodeticSurfaceNormal(p, bitangent); + if (vertexFormat.tangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.cross(bitangent, normal, tangent), + tangent + ); + } + } + if (vertexFormat.normal) { + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + } + } + } + return createAttributes(vertexFormat, { + positions, + normals, + tangents, + bitangents + }); +} +function constructRectangle(rectangleGeometry, computedOptions) { + const vertexFormat = rectangleGeometry._vertexFormat; + const ellipsoid = rectangleGeometry._ellipsoid; + const height = computedOptions.height; + const width = computedOptions.width; + const northCap = computedOptions.northCap; + const southCap = computedOptions.southCap; + let rowStart = 0; + let rowEnd = height; + let rowHeight = height; + let size = 0; + if (northCap) { + rowStart = 1; + rowHeight -= 1; + size += 1; + } + if (southCap) { + rowEnd -= 1; + rowHeight -= 1; + size += 1; + } + size += width * rowHeight; + const positions = vertexFormat.position ? new Float64Array(size * 3) : void 0; + const textureCoordinates = vertexFormat.st ? new Float32Array(size * 2) : void 0; + let posIndex = 0; + let stIndex = 0; + const position = positionScratch; + const st = stScratch; + let minX = Number.MAX_VALUE; + let minY = Number.MAX_VALUE; + let maxX = -Number.MAX_VALUE; + let maxY = -Number.MAX_VALUE; + for (let row = rowStart; row < rowEnd; ++row) { + for (let col = 0; col < width; ++col) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + vertexFormat.st, + row, + col, + position, + st + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + if (vertexFormat.st) { + textureCoordinates[stIndex++] = st.x; + textureCoordinates[stIndex++] = st.y; + minX = Math.min(minX, st.x); + minY = Math.min(minY, st.y); + maxX = Math.max(maxX, st.x); + maxY = Math.max(maxY, st.y); + } + } + } + if (northCap) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + vertexFormat.st, + 0, + 0, + position, + st + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + if (vertexFormat.st) { + textureCoordinates[stIndex++] = st.x; + textureCoordinates[stIndex++] = st.y; + minX = st.x; + minY = st.y; + maxX = st.x; + maxY = st.y; + } + } + if (southCap) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + vertexFormat.st, + height - 1, + 0, + position, + st + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex] = position.z; + if (vertexFormat.st) { + textureCoordinates[stIndex++] = st.x; + textureCoordinates[stIndex] = st.y; + minX = Math.min(minX, st.x); + minY = Math.min(minY, st.y); + maxX = Math.max(maxX, st.x); + maxY = Math.max(maxY, st.y); + } + } + if (vertexFormat.st && (minX < 0 || minY < 0 || maxX > 1 || maxY > 1)) { + for (let k = 0; k < textureCoordinates.length; k += 2) { + textureCoordinates[k] = (textureCoordinates[k] - minX) / (maxX - minX); + textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minY) / (maxY - minY); + } + } + const geo = calculateAttributes( + positions, + vertexFormat, + ellipsoid, + computedOptions.tangentRotationMatrix + ); + let indicesSize = 6 * (width - 1) * (rowHeight - 1); + if (northCap) { + indicesSize += 3 * (width - 1); + } + if (southCap) { + indicesSize += 3 * (width - 1); + } + const indices = IndexDatatype_default.createTypedArray(size, indicesSize); + let index = 0; + let indicesIndex = 0; + let i; + for (i = 0; i < rowHeight - 1; ++i) { + for (let j = 0; j < width - 1; ++j) { + const upperLeft = index; + const lowerLeft = upperLeft + width; + const lowerRight = lowerLeft + 1; + const upperRight = upperLeft + 1; + indices[indicesIndex++] = upperLeft; + indices[indicesIndex++] = lowerLeft; + indices[indicesIndex++] = upperRight; + indices[indicesIndex++] = upperRight; + indices[indicesIndex++] = lowerLeft; + indices[indicesIndex++] = lowerRight; + ++index; + } + ++index; + } + if (northCap || southCap) { + let northIndex = size - 1; + const southIndex = size - 1; + if (northCap && southCap) { + northIndex = size - 2; + } + let p1; + let p2; + index = 0; + if (northCap) { + for (i = 0; i < width - 1; i++) { + p1 = index; + p2 = p1 + 1; + indices[indicesIndex++] = northIndex; + indices[indicesIndex++] = p1; + indices[indicesIndex++] = p2; + ++index; + } + } + if (southCap) { + index = (rowHeight - 1) * width; + for (i = 0; i < width - 1; i++) { + p1 = index; + p2 = p1 + 1; + indices[indicesIndex++] = p1; + indices[indicesIndex++] = southIndex; + indices[indicesIndex++] = p2; + ++index; + } + } + } + geo.indices = indices; + if (vertexFormat.st) { + geo.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + return geo; +} +function addWallPositions(wallPositions, posIndex, i, topPositions, bottomPositions) { + wallPositions[posIndex++] = topPositions[i]; + wallPositions[posIndex++] = topPositions[i + 1]; + wallPositions[posIndex++] = topPositions[i + 2]; + wallPositions[posIndex++] = bottomPositions[i]; + wallPositions[posIndex++] = bottomPositions[i + 1]; + wallPositions[posIndex] = bottomPositions[i + 2]; + return wallPositions; +} +function addWallTextureCoordinates(wallTextures, stIndex, i, st) { + wallTextures[stIndex++] = st[i]; + wallTextures[stIndex++] = st[i + 1]; + wallTextures[stIndex++] = st[i]; + wallTextures[stIndex] = st[i + 1]; + return wallTextures; +} +var scratchVertexFormat = new VertexFormat_default(); +function constructExtrudedRectangle(rectangleGeometry, computedOptions) { + const shadowVolume = rectangleGeometry._shadowVolume; + const offsetAttributeValue = rectangleGeometry._offsetAttribute; + const vertexFormat = rectangleGeometry._vertexFormat; + const minHeight = rectangleGeometry._extrudedHeight; + const maxHeight = rectangleGeometry._surfaceHeight; + const ellipsoid = rectangleGeometry._ellipsoid; + const height = computedOptions.height; + const width = computedOptions.width; + let i; + if (shadowVolume) { + const newVertexFormat = VertexFormat_default.clone( + vertexFormat, + scratchVertexFormat + ); + newVertexFormat.normal = true; + rectangleGeometry._vertexFormat = newVertexFormat; + } + const topBottomGeo = constructRectangle(rectangleGeometry, computedOptions); + if (shadowVolume) { + rectangleGeometry._vertexFormat = vertexFormat; + } + let topPositions = PolygonPipeline_default.scaleToGeodeticHeight( + topBottomGeo.attributes.position.values, + maxHeight, + ellipsoid, + false + ); + topPositions = new Float64Array(topPositions); + let length = topPositions.length; + const newLength = length * 2; + const positions = new Float64Array(newLength); + positions.set(topPositions); + const bottomPositions = PolygonPipeline_default.scaleToGeodeticHeight( + topBottomGeo.attributes.position.values, + minHeight, + ellipsoid + ); + positions.set(bottomPositions, length); + topBottomGeo.attributes.position.values = positions; + const normals = vertexFormat.normal ? new Float32Array(newLength) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(newLength) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(newLength) : void 0; + const textures = vertexFormat.st ? new Float32Array(newLength / 3 * 2) : void 0; + let topSt; + let topNormals; + if (vertexFormat.normal) { + topNormals = topBottomGeo.attributes.normal.values; + normals.set(topNormals); + for (i = 0; i < length; i++) { + topNormals[i] = -topNormals[i]; + } + normals.set(topNormals, length); + topBottomGeo.attributes.normal.values = normals; + } + if (shadowVolume) { + topNormals = topBottomGeo.attributes.normal.values; + if (!vertexFormat.normal) { + topBottomGeo.attributes.normal = void 0; + } + const extrudeNormals = new Float32Array(newLength); + for (i = 0; i < length; i++) { + topNormals[i] = -topNormals[i]; + } + extrudeNormals.set(topNormals, length); + topBottomGeo.attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: extrudeNormals + }); + } + let offsetValue; + const hasOffsets = defined_default(offsetAttributeValue); + if (hasOffsets) { + const size = length / 3 * 2; + let offsetAttribute = new Uint8Array(size); + if (offsetAttributeValue === GeometryOffsetAttribute_default.TOP) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else { + offsetValue = offsetAttributeValue === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + topBottomGeo.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + }); + } + if (vertexFormat.tangent) { + const topTangents = topBottomGeo.attributes.tangent.values; + tangents.set(topTangents); + for (i = 0; i < length; i++) { + topTangents[i] = -topTangents[i]; + } + tangents.set(topTangents, length); + topBottomGeo.attributes.tangent.values = tangents; + } + if (vertexFormat.bitangent) { + const topBitangents = topBottomGeo.attributes.bitangent.values; + bitangents.set(topBitangents); + bitangents.set(topBitangents, length); + topBottomGeo.attributes.bitangent.values = bitangents; + } + if (vertexFormat.st) { + topSt = topBottomGeo.attributes.st.values; + textures.set(topSt); + textures.set(topSt, length / 3 * 2); + topBottomGeo.attributes.st.values = textures; + } + const indices = topBottomGeo.indices; + const indicesLength = indices.length; + const posLength = length / 3; + const newIndices = IndexDatatype_default.createTypedArray( + newLength / 3, + indicesLength * 2 + ); + newIndices.set(indices); + for (i = 0; i < indicesLength; i += 3) { + newIndices[i + indicesLength] = indices[i + 2] + posLength; + newIndices[i + 1 + indicesLength] = indices[i + 1] + posLength; + newIndices[i + 2 + indicesLength] = indices[i] + posLength; + } + topBottomGeo.indices = newIndices; + const northCap = computedOptions.northCap; + const southCap = computedOptions.southCap; + let rowHeight = height; + let widthMultiplier = 2; + let perimeterPositions = 0; + let corners = 4; + let dupliateCorners = 4; + if (northCap) { + widthMultiplier -= 1; + rowHeight -= 1; + perimeterPositions += 1; + corners -= 2; + dupliateCorners -= 1; + } + if (southCap) { + widthMultiplier -= 1; + rowHeight -= 1; + perimeterPositions += 1; + corners -= 2; + dupliateCorners -= 1; + } + perimeterPositions += widthMultiplier * width + 2 * rowHeight - corners; + const wallCount = (perimeterPositions + dupliateCorners) * 2; + let wallPositions = new Float64Array(wallCount * 3); + const wallExtrudeNormals = shadowVolume ? new Float32Array(wallCount * 3) : void 0; + let wallOffsetAttribute = hasOffsets ? new Uint8Array(wallCount) : void 0; + let wallTextures = vertexFormat.st ? new Float32Array(wallCount * 2) : void 0; + const computeTopOffsets = offsetAttributeValue === GeometryOffsetAttribute_default.TOP; + if (hasOffsets && !computeTopOffsets) { + offsetValue = offsetAttributeValue === GeometryOffsetAttribute_default.ALL ? 1 : 0; + wallOffsetAttribute = wallOffsetAttribute.fill(offsetValue); + } + let posIndex = 0; + let stIndex = 0; + let extrudeNormalIndex = 0; + let wallOffsetIndex = 0; + const area = width * rowHeight; + let threeI; + for (i = 0; i < area; i += width) { + threeI = i * 3; + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + i * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + if (!southCap) { + for (i = area - width; i < area; i++) { + threeI = i * 3; + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + i * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + } else { + const southIndex = northCap ? area + 1 : area; + threeI = southIndex * 3; + for (i = 0; i < 2; i++) { + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + southIndex * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + } + for (i = area - 1; i > 0; i -= width) { + threeI = i * 3; + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + i * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + if (!northCap) { + for (i = width - 1; i >= 0; i--) { + threeI = i * 3; + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + i * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + } else { + const northIndex = area; + threeI = northIndex * 3; + for (i = 0; i < 2; i++) { + wallPositions = addWallPositions( + wallPositions, + posIndex, + threeI, + topPositions, + bottomPositions + ); + posIndex += 6; + if (vertexFormat.st) { + wallTextures = addWallTextureCoordinates( + wallTextures, + stIndex, + northIndex * 2, + topSt + ); + stIndex += 4; + } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } + if (computeTopOffsets) { + wallOffsetAttribute[wallOffsetIndex++] = 1; + wallOffsetIndex += 1; + } + } + } + let geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid); + if (vertexFormat.st) { + geo.attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: wallTextures + }); + } + if (shadowVolume) { + geo.attributes.extrudeDirection = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: wallExtrudeNormals + }); + } + if (hasOffsets) { + geo.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: wallOffsetAttribute + }); + } + const wallIndices = IndexDatatype_default.createTypedArray( + wallCount, + perimeterPositions * 6 + ); + let upperLeft; + let lowerLeft; + let lowerRight; + let upperRight; + length = wallPositions.length / 3; + let index = 0; + for (i = 0; i < length - 1; i += 2) { + upperLeft = i; + upperRight = (upperLeft + 2) % length; + const p1 = Cartesian3_default.fromArray(wallPositions, upperLeft * 3, v1Scratch); + const p2 = Cartesian3_default.fromArray(wallPositions, upperRight * 3, v2Scratch); + if (Cartesian3_default.equalsEpsilon(p1, p2, Math_default.EPSILON10)) { + continue; + } + lowerLeft = (upperLeft + 1) % length; + lowerRight = (lowerLeft + 2) % length; + wallIndices[index++] = upperLeft; + wallIndices[index++] = lowerLeft; + wallIndices[index++] = upperRight; + wallIndices[index++] = upperRight; + wallIndices[index++] = lowerLeft; + wallIndices[index++] = lowerRight; + } + geo.indices = wallIndices; + geo = GeometryPipeline_default.combineInstances([ + new GeometryInstance_default({ + geometry: topBottomGeo + }), + new GeometryInstance_default({ + geometry: geo + }) + ]); + return geo[0]; +} +var scratchRectanglePoints = [ + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default(), + new Cartesian3_default() +]; +var nwScratch = new Cartographic_default(); +var stNwScratch = new Cartographic_default(); +function computeRectangle(rectangle, granularity, rotation, ellipsoid, result) { + if (rotation === 0) { + return Rectangle_default.clone(rectangle, result); + } + const computedOptions = RectangleGeometryLibrary_default.computeOptions( + rectangle, + granularity, + rotation, + 0, + rectangleScratch, + nwScratch + ); + const height = computedOptions.height; + const width = computedOptions.width; + const positions = scratchRectanglePoints; + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + 0, + 0, + positions[0] + ); + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + 0, + width - 1, + positions[1] + ); + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + height - 1, + 0, + positions[2] + ); + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + height - 1, + width - 1, + positions[3] + ); + return Rectangle_default.fromCartesianArray(positions, ellipsoid, result); +} +function RectangleGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const rectangle = options.rectangle; + Check_default.typeOf.object("rectangle", rectangle); + Rectangle_default.validate(rectangle); + if (rectangle.north < rectangle.south) { + throw new DeveloperError_default( + "options.rectangle.north must be greater than or equal to options.rectangle.south" + ); + } + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._rectangle = Rectangle_default.clone(rectangle); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._ellipsoid = Ellipsoid_default.clone( + defaultValue_default(options.ellipsoid, Ellipsoid_default.default) + ); + this._surfaceHeight = Math.max(height, extrudedHeight); + this._rotation = defaultValue_default(options.rotation, 0); + this._stRotation = defaultValue_default(options.stRotation, 0); + this._vertexFormat = VertexFormat_default.clone( + defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT) + ); + this._extrudedHeight = Math.min(height, extrudedHeight); + this._shadowVolume = defaultValue_default(options.shadowVolume, false); + this._workerName = "createRectangleGeometry"; + this._offsetAttribute = options.offsetAttribute; + this._rotatedRectangle = void 0; + this._textureCoordinateRotationPoints = void 0; +} +RectangleGeometry.packedLength = Rectangle_default.packedLength + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 7; +RectangleGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + Rectangle_default.pack(value._rectangle, array, startingIndex); + startingIndex += Rectangle_default.packedLength; + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._surfaceHeight; + array[startingIndex++] = value._rotation; + array[startingIndex++] = value._stRotation; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex++] = value._shadowVolume ? 1 : 0; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchRectangle = new Rectangle_default(); +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchOptions = { + rectangle: scratchRectangle, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + granularity: void 0, + height: void 0, + rotation: void 0, + stRotation: void 0, + extrudedHeight: void 0, + shadowVolume: void 0, + offsetAttribute: void 0 +}; +RectangleGeometry.unpack = function(array, startingIndex, result) { + Check_default.defined("array", array); + startingIndex = defaultValue_default(startingIndex, 0); + const rectangle = Rectangle_default.unpack(array, startingIndex, scratchRectangle); + startingIndex += Rectangle_default.packedLength; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const granularity = array[startingIndex++]; + const surfaceHeight = array[startingIndex++]; + const rotation = array[startingIndex++]; + const stRotation = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const shadowVolume = array[startingIndex++] === 1; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.granularity = granularity; + scratchOptions.height = surfaceHeight; + scratchOptions.rotation = rotation; + scratchOptions.stRotation = stRotation; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.shadowVolume = shadowVolume; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new RectangleGeometry(scratchOptions); + } + result._rectangle = Rectangle_default.clone(rectangle, result._rectangle); + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._granularity = granularity; + result._surfaceHeight = surfaceHeight; + result._rotation = rotation; + result._stRotation = stRotation; + result._extrudedHeight = extrudedHeight; + result._shadowVolume = shadowVolume; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +RectangleGeometry.computeRectangle = function(options, result) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const rectangle = options.rectangle; + Check_default.typeOf.object("rectangle", rectangle); + Rectangle_default.validate(rectangle); + if (rectangle.north < rectangle.south) { + throw new DeveloperError_default( + "options.rectangle.north must be greater than or equal to options.rectangle.south" + ); + } + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const rotation = defaultValue_default(options.rotation, 0); + return computeRectangle(rectangle, granularity, rotation, ellipsoid, result); +}; +var tangentRotationMatrixScratch = new Matrix3_default(); +var quaternionScratch = new Quaternion_default(); +var centerScratch = new Cartographic_default(); +RectangleGeometry.createGeometry = function(rectangleGeometry) { + if (Math_default.equalsEpsilon( + rectangleGeometry._rectangle.north, + rectangleGeometry._rectangle.south, + Math_default.EPSILON10 + ) || Math_default.equalsEpsilon( + rectangleGeometry._rectangle.east, + rectangleGeometry._rectangle.west, + Math_default.EPSILON10 + )) { + return void 0; + } + let rectangle = rectangleGeometry._rectangle; + const ellipsoid = rectangleGeometry._ellipsoid; + const rotation = rectangleGeometry._rotation; + const stRotation = rectangleGeometry._stRotation; + const vertexFormat = rectangleGeometry._vertexFormat; + const computedOptions = RectangleGeometryLibrary_default.computeOptions( + rectangle, + rectangleGeometry._granularity, + rotation, + stRotation, + rectangleScratch, + nwScratch, + stNwScratch + ); + const tangentRotationMatrix = tangentRotationMatrixScratch; + if (stRotation !== 0 || rotation !== 0) { + const center = Rectangle_default.center(rectangle, centerScratch); + const axis = ellipsoid.geodeticSurfaceNormalCartographic(center, v1Scratch); + Quaternion_default.fromAxisAngle(axis, -stRotation, quaternionScratch); + Matrix3_default.fromQuaternion(quaternionScratch, tangentRotationMatrix); + } else { + Matrix3_default.clone(Matrix3_default.IDENTITY, tangentRotationMatrix); + } + const surfaceHeight = rectangleGeometry._surfaceHeight; + const extrudedHeight = rectangleGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + surfaceHeight, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + computedOptions.lonScalar = 1 / rectangleGeometry._rectangle.width; + computedOptions.latScalar = 1 / rectangleGeometry._rectangle.height; + computedOptions.tangentRotationMatrix = tangentRotationMatrix; + let geometry; + let boundingSphere; + rectangle = rectangleGeometry._rectangle; + if (extrude) { + geometry = constructExtrudedRectangle(rectangleGeometry, computedOptions); + const topBS = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + surfaceHeight, + topBoundingSphere + ); + const bottomBS = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + extrudedHeight, + bottomBoundingSphere + ); + boundingSphere = BoundingSphere_default.union(topBS, bottomBS); + } else { + geometry = constructRectangle(rectangleGeometry, computedOptions); + geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + geometry.attributes.position.values, + surfaceHeight, + ellipsoid, + false + ); + if (defined_default(rectangleGeometry._offsetAttribute)) { + const length = geometry.attributes.position.values.length; + const offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + boundingSphere = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + surfaceHeight + ); + } + if (!vertexFormat.position) { + delete geometry.attributes.position; + } + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: geometry.primitiveType, + boundingSphere, + offsetAttribute: rectangleGeometry._offsetAttribute + }); +}; +RectangleGeometry.createShadowVolume = function(rectangleGeometry, minHeightFunc, maxHeightFunc) { + const granularity = rectangleGeometry._granularity; + const ellipsoid = rectangleGeometry._ellipsoid; + const minHeight = minHeightFunc(granularity, ellipsoid); + const maxHeight = maxHeightFunc(granularity, ellipsoid); + return new RectangleGeometry({ + rectangle: rectangleGeometry._rectangle, + rotation: rectangleGeometry._rotation, + ellipsoid, + stRotation: rectangleGeometry._stRotation, + granularity, + extrudedHeight: maxHeight, + height: minHeight, + vertexFormat: VertexFormat_default.POSITION_ONLY, + shadowVolume: true + }); +}; +var unrotatedTextureRectangleScratch = new Rectangle_default(); +var points2DScratch = [new Cartesian2_default(), new Cartesian2_default(), new Cartesian2_default()]; +var rotation2DScratch = new Matrix2_default(); +var rectangleCenterScratch = new Cartographic_default(); +function textureCoordinateRotationPoints(rectangleGeometry) { + if (rectangleGeometry._stRotation === 0) { + return [0, 0, 0, 1, 1, 0]; + } + const rectangle = Rectangle_default.clone( + rectangleGeometry._rectangle, + unrotatedTextureRectangleScratch + ); + const granularity = rectangleGeometry._granularity; + const ellipsoid = rectangleGeometry._ellipsoid; + const rotation = rectangleGeometry._rotation - rectangleGeometry._stRotation; + const unrotatedTextureRectangle = computeRectangle( + rectangle, + granularity, + rotation, + ellipsoid, + unrotatedTextureRectangleScratch + ); + const points2D = points2DScratch; + points2D[0].x = unrotatedTextureRectangle.west; + points2D[0].y = unrotatedTextureRectangle.south; + points2D[1].x = unrotatedTextureRectangle.west; + points2D[1].y = unrotatedTextureRectangle.north; + points2D[2].x = unrotatedTextureRectangle.east; + points2D[2].y = unrotatedTextureRectangle.south; + const boundingRectangle = rectangleGeometry.rectangle; + const toDesiredInComputed = Matrix2_default.fromRotation( + rectangleGeometry._stRotation, + rotation2DScratch + ); + const boundingRectangleCenter = Rectangle_default.center( + boundingRectangle, + rectangleCenterScratch + ); + for (let i = 0; i < 3; ++i) { + const point2D = points2D[i]; + point2D.x -= boundingRectangleCenter.longitude; + point2D.y -= boundingRectangleCenter.latitude; + Matrix2_default.multiplyByVector(toDesiredInComputed, point2D, point2D); + point2D.x += boundingRectangleCenter.longitude; + point2D.y += boundingRectangleCenter.latitude; + point2D.x = (point2D.x - boundingRectangle.west) / boundingRectangle.width; + point2D.y = (point2D.y - boundingRectangle.south) / boundingRectangle.height; + } + const minXYCorner = points2D[0]; + const maxYCorner = points2D[1]; + const maxXCorner = points2D[2]; + const result = new Array(6); + Cartesian2_default.pack(minXYCorner, result); + Cartesian2_default.pack(maxYCorner, result, 2); + Cartesian2_default.pack(maxXCorner, result, 4); + return result; +} +Object.defineProperties(RectangleGeometry.prototype, { + /** + * @private + */ + rectangle: { + get: function() { + if (!defined_default(this._rotatedRectangle)) { + this._rotatedRectangle = computeRectangle( + this._rectangle, + this._granularity, + this._rotation, + this._ellipsoid + ); + } + return this._rotatedRectangle; + } + }, + /** + * For remapping texture coordinates when rendering RectangleGeometries as GroundPrimitives. + * This version permits skew in textures by computing offsets directly in cartographic space and + * more accurately approximates rendering RectangleGeometries with height as standard Primitives. + * @see Geometry#_textureCoordinateRotationPoints + * @private + */ + textureCoordinateRotationPoints: { + get: function() { + if (!defined_default(this._textureCoordinateRotationPoints)) { + this._textureCoordinateRotationPoints = textureCoordinateRotationPoints( + this + ); + } + return this._textureCoordinateRotationPoints; + } + } +}); +var RectangleGeometry_default = RectangleGeometry; + +// packages/engine/Source/Workers/createRectangleGeometry.js +function createRectangleGeometry(rectangleGeometry, offset) { + if (defined_default(offset)) { + rectangleGeometry = RectangleGeometry_default.unpack(rectangleGeometry, offset); + } + rectangleGeometry._ellipsoid = Ellipsoid_default.clone(rectangleGeometry._ellipsoid); + rectangleGeometry._rectangle = Rectangle_default.clone(rectangleGeometry._rectangle); + return RectangleGeometry_default.createGeometry(rectangleGeometry); +} +var createRectangleGeometry_default = createRectangleGeometry; +export { + createRectangleGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createRectangleOutlineGeometry.js b/public/assets/cesium/Workers/createRectangleOutlineGeometry.js new file mode 100644 index 0000000..c9bf518 --- /dev/null +++ b/public/assets/cesium/Workers/createRectangleOutlineGeometry.js @@ -0,0 +1,477 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + RectangleGeometryLibrary_default +} from "./chunk-BVKITG4N.js"; +import { + GeometryOffsetAttribute_default +} from "./chunk-GBT7MJ6X.js"; +import { + PolygonPipeline_default +} from "./chunk-TI3TRKIC.js"; +import "./chunk-JSQJDZI4.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/RectangleOutlineGeometry.js +var bottomBoundingSphere = new BoundingSphere_default(); +var topBoundingSphere = new BoundingSphere_default(); +var positionScratch = new Cartesian3_default(); +var rectangleScratch = new Rectangle_default(); +function constructRectangle(geometry, computedOptions) { + const ellipsoid = geometry._ellipsoid; + const height = computedOptions.height; + const width = computedOptions.width; + const northCap = computedOptions.northCap; + const southCap = computedOptions.southCap; + let rowHeight = height; + let widthMultiplier = 2; + let size = 0; + let corners = 4; + if (northCap) { + widthMultiplier -= 1; + rowHeight -= 1; + size += 1; + corners -= 2; + } + if (southCap) { + widthMultiplier -= 1; + rowHeight -= 1; + size += 1; + corners -= 2; + } + size += widthMultiplier * width + 2 * rowHeight - corners; + const positions = new Float64Array(size * 3); + let posIndex = 0; + let row = 0; + let col; + const position = positionScratch; + if (northCap) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + row, + 0, + position + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + } else { + for (col = 0; col < width; col++) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + row, + col, + position + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + } + } + col = width - 1; + for (row = 1; row < height; row++) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + row, + col, + position + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + } + row = height - 1; + if (!southCap) { + for (col = width - 2; col >= 0; col--) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + row, + col, + position + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + } + } + col = 0; + for (row = height - 2; row > 0; row--) { + RectangleGeometryLibrary_default.computePosition( + computedOptions, + ellipsoid, + false, + row, + col, + position + ); + positions[posIndex++] = position.x; + positions[posIndex++] = position.y; + positions[posIndex++] = position.z; + } + const indicesSize = positions.length / 3 * 2; + const indices = IndexDatatype_default.createTypedArray( + positions.length / 3, + indicesSize + ); + let index = 0; + for (let i = 0; i < positions.length / 3 - 1; i++) { + indices[index++] = i; + indices[index++] = i + 1; + } + indices[index++] = positions.length / 3 - 1; + indices[index++] = 0; + const geo = new Geometry_default({ + attributes: new GeometryAttributes_default(), + primitiveType: PrimitiveType_default.LINES + }); + geo.attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + geo.indices = indices; + return geo; +} +function constructExtrudedRectangle(rectangleGeometry, computedOptions) { + const maxHeight = rectangleGeometry._surfaceHeight; + const minHeight = rectangleGeometry._extrudedHeight; + const ellipsoid = rectangleGeometry._ellipsoid; + const geo = constructRectangle(rectangleGeometry, computedOptions); + const height = computedOptions.height; + const width = computedOptions.width; + const topPositions = PolygonPipeline_default.scaleToGeodeticHeight( + geo.attributes.position.values, + maxHeight, + ellipsoid, + false + ); + let length = topPositions.length; + const positions = new Float64Array(length * 2); + positions.set(topPositions); + const bottomPositions = PolygonPipeline_default.scaleToGeodeticHeight( + geo.attributes.position.values, + minHeight, + ellipsoid + ); + positions.set(bottomPositions, length); + geo.attributes.position.values = positions; + const northCap = computedOptions.northCap; + const southCap = computedOptions.southCap; + let corners = 4; + if (northCap) { + corners -= 1; + } + if (southCap) { + corners -= 1; + } + const indicesSize = (positions.length / 3 + corners) * 2; + const indices = IndexDatatype_default.createTypedArray( + positions.length / 3, + indicesSize + ); + length = positions.length / 6; + let index = 0; + for (let i = 0; i < length - 1; i++) { + indices[index++] = i; + indices[index++] = i + 1; + indices[index++] = i + length; + indices[index++] = i + length + 1; + } + indices[index++] = length - 1; + indices[index++] = 0; + indices[index++] = length + length - 1; + indices[index++] = length; + indices[index++] = 0; + indices[index++] = length; + let bottomCorner; + if (northCap) { + bottomCorner = height - 1; + } else { + const topRightCorner = width - 1; + indices[index++] = topRightCorner; + indices[index++] = topRightCorner + length; + bottomCorner = width + height - 2; + } + indices[index++] = bottomCorner; + indices[index++] = bottomCorner + length; + if (!southCap) { + const bottomLeftCorner = width + bottomCorner - 1; + indices[index++] = bottomLeftCorner; + indices[index] = bottomLeftCorner + length; + } + geo.indices = indices; + return geo; +} +function RectangleOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const rectangle = options.rectangle; + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const rotation = defaultValue_default(options.rotation, 0); + if (!defined_default(rectangle)) { + throw new DeveloperError_default("rectangle is required."); + } + Rectangle_default.validate(rectangle); + if (rectangle.north < rectangle.south) { + throw new DeveloperError_default( + "options.rectangle.north must be greater than options.rectangle.south" + ); + } + const height = defaultValue_default(options.height, 0); + const extrudedHeight = defaultValue_default(options.extrudedHeight, height); + this._rectangle = Rectangle_default.clone(rectangle); + this._granularity = granularity; + this._ellipsoid = ellipsoid; + this._surfaceHeight = Math.max(height, extrudedHeight); + this._rotation = rotation; + this._extrudedHeight = Math.min(height, extrudedHeight); + this._offsetAttribute = options.offsetAttribute; + this._workerName = "createRectangleOutlineGeometry"; +} +RectangleOutlineGeometry.packedLength = Rectangle_default.packedLength + Ellipsoid_default.packedLength + 5; +RectangleOutlineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + Rectangle_default.pack(value._rectangle, array, startingIndex); + startingIndex += Rectangle_default.packedLength; + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._granularity; + array[startingIndex++] = value._surfaceHeight; + array[startingIndex++] = value._rotation; + array[startingIndex++] = value._extrudedHeight; + array[startingIndex] = defaultValue_default(value._offsetAttribute, -1); + return array; +}; +var scratchRectangle = new Rectangle_default(); +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchOptions = { + rectangle: scratchRectangle, + ellipsoid: scratchEllipsoid, + granularity: void 0, + height: void 0, + rotation: void 0, + extrudedHeight: void 0, + offsetAttribute: void 0 +}; +RectangleOutlineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + const rectangle = Rectangle_default.unpack(array, startingIndex, scratchRectangle); + startingIndex += Rectangle_default.packedLength; + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const granularity = array[startingIndex++]; + const height = array[startingIndex++]; + const rotation = array[startingIndex++]; + const extrudedHeight = array[startingIndex++]; + const offsetAttribute = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.granularity = granularity; + scratchOptions.height = height; + scratchOptions.rotation = rotation; + scratchOptions.extrudedHeight = extrudedHeight; + scratchOptions.offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return new RectangleOutlineGeometry(scratchOptions); + } + result._rectangle = Rectangle_default.clone(rectangle, result._rectangle); + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._surfaceHeight = height; + result._rotation = rotation; + result._extrudedHeight = extrudedHeight; + result._offsetAttribute = offsetAttribute === -1 ? void 0 : offsetAttribute; + return result; +}; +var nwScratch = new Cartographic_default(); +RectangleOutlineGeometry.createGeometry = function(rectangleGeometry) { + const rectangle = rectangleGeometry._rectangle; + const ellipsoid = rectangleGeometry._ellipsoid; + const computedOptions = RectangleGeometryLibrary_default.computeOptions( + rectangle, + rectangleGeometry._granularity, + rectangleGeometry._rotation, + 0, + rectangleScratch, + nwScratch + ); + let geometry; + let boundingSphere; + if (Math_default.equalsEpsilon( + rectangle.north, + rectangle.south, + Math_default.EPSILON10 + ) || Math_default.equalsEpsilon( + rectangle.east, + rectangle.west, + Math_default.EPSILON10 + )) { + return void 0; + } + const surfaceHeight = rectangleGeometry._surfaceHeight; + const extrudedHeight = rectangleGeometry._extrudedHeight; + const extrude = !Math_default.equalsEpsilon( + surfaceHeight, + extrudedHeight, + 0, + Math_default.EPSILON2 + ); + let offsetValue; + if (extrude) { + geometry = constructExtrudedRectangle(rectangleGeometry, computedOptions); + if (defined_default(rectangleGeometry._offsetAttribute)) { + const size = geometry.attributes.position.values.length / 3; + let offsetAttribute = new Uint8Array(size); + if (rectangleGeometry._offsetAttribute === GeometryOffsetAttribute_default.TOP) { + offsetAttribute = offsetAttribute.fill(1, 0, size / 2); + } else { + offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + offsetAttribute = offsetAttribute.fill(offsetValue); + } + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: offsetAttribute + }); + } + const topBS = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + surfaceHeight, + topBoundingSphere + ); + const bottomBS = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + extrudedHeight, + bottomBoundingSphere + ); + boundingSphere = BoundingSphere_default.union(topBS, bottomBS); + } else { + geometry = constructRectangle(rectangleGeometry, computedOptions); + geometry.attributes.position.values = PolygonPipeline_default.scaleToGeodeticHeight( + geometry.attributes.position.values, + surfaceHeight, + ellipsoid, + false + ); + if (defined_default(rectangleGeometry._offsetAttribute)) { + const length = geometry.attributes.position.values.length; + offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute_default.NONE ? 0 : 1; + const applyOffset = new Uint8Array(length / 3).fill(offsetValue); + geometry.attributes.applyOffset = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: applyOffset + }); + } + boundingSphere = BoundingSphere_default.fromRectangle3D( + rectangle, + ellipsoid, + surfaceHeight + ); + } + return new Geometry_default({ + attributes: geometry.attributes, + indices: geometry.indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere, + offsetAttribute: rectangleGeometry._offsetAttribute + }); +}; +var RectangleOutlineGeometry_default = RectangleOutlineGeometry; + +// packages/engine/Source/Workers/createRectangleOutlineGeometry.js +function createRectangleOutlineGeometry(rectangleGeometry, offset) { + if (defined_default(offset)) { + rectangleGeometry = RectangleOutlineGeometry_default.unpack( + rectangleGeometry, + offset + ); + } + rectangleGeometry._ellipsoid = Ellipsoid_default.clone(rectangleGeometry._ellipsoid); + rectangleGeometry._rectangle = Rectangle_default.clone(rectangleGeometry._rectangle); + return RectangleOutlineGeometry_default.createGeometry(rectangleGeometry); +} +var createRectangleOutlineGeometry_default = createRectangleOutlineGeometry; +export { + createRectangleOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createSimplePolylineGeometry.js b/public/assets/cesium/Workers/createSimplePolylineGeometry.js new file mode 100644 index 0000000..9583dc1 --- /dev/null +++ b/public/assets/cesium/Workers/createSimplePolylineGeometry.js @@ -0,0 +1,398 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Color_default +} from "./chunk-HP5XLODI.js"; +import { + ArcType_default +} from "./chunk-XWOUPGUF.js"; +import { + PolylinePipeline_default +} from "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/SimplePolylineGeometry.js +function interpolateColors(p0, p1, color0, color1, minDistance, array, offset) { + const numPoints = PolylinePipeline_default.numberOfPoints(p0, p1, minDistance); + let i; + const r0 = color0.red; + const g0 = color0.green; + const b0 = color0.blue; + const a0 = color0.alpha; + const r1 = color1.red; + const g1 = color1.green; + const b1 = color1.blue; + const a1 = color1.alpha; + if (Color_default.equals(color0, color1)) { + for (i = 0; i < numPoints; i++) { + array[offset++] = Color_default.floatToByte(r0); + array[offset++] = Color_default.floatToByte(g0); + array[offset++] = Color_default.floatToByte(b0); + array[offset++] = Color_default.floatToByte(a0); + } + return offset; + } + const redPerVertex = (r1 - r0) / numPoints; + const greenPerVertex = (g1 - g0) / numPoints; + const bluePerVertex = (b1 - b0) / numPoints; + const alphaPerVertex = (a1 - a0) / numPoints; + let index = offset; + for (i = 0; i < numPoints; i++) { + array[index++] = Color_default.floatToByte(r0 + i * redPerVertex); + array[index++] = Color_default.floatToByte(g0 + i * greenPerVertex); + array[index++] = Color_default.floatToByte(b0 + i * bluePerVertex); + array[index++] = Color_default.floatToByte(a0 + i * alphaPerVertex); + } + return index; +} +function SimplePolylineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + const colors = options.colors; + const colorsPerVertex = defaultValue_default(options.colorsPerVertex, false); + if (!defined_default(positions) || positions.length < 2) { + throw new DeveloperError_default("At least two positions are required."); + } + if (defined_default(colors) && (colorsPerVertex && colors.length < positions.length || !colorsPerVertex && colors.length < positions.length - 1)) { + throw new DeveloperError_default("colors has an invalid length."); + } + this._positions = positions; + this._colors = colors; + this._colorsPerVertex = colorsPerVertex; + this._arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC); + this._granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + this._ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + this._workerName = "createSimplePolylineGeometry"; + let numComponents = 1 + positions.length * Cartesian3_default.packedLength; + numComponents += defined_default(colors) ? 1 + colors.length * Color_default.packedLength : 1; + this.packedLength = numComponents + Ellipsoid_default.packedLength + 3; +} +SimplePolylineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const colors = value._colors; + length = defined_default(colors) ? colors.length : 0; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Color_default.packedLength) { + Color_default.pack(colors[i], array, startingIndex); + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex++] = value._colorsPerVertex ? 1 : 0; + array[startingIndex++] = value._arcType; + array[startingIndex] = value._granularity; + return array; +}; +SimplePolylineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + const colors = length > 0 ? new Array(length) : void 0; + for (i = 0; i < length; ++i, startingIndex += Color_default.packedLength) { + colors[i] = Color_default.unpack(array, startingIndex); + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + const colorsPerVertex = array[startingIndex++] === 1; + const arcType = array[startingIndex++]; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + return new SimplePolylineGeometry({ + positions, + colors, + ellipsoid, + colorsPerVertex, + arcType, + granularity + }); + } + result._positions = positions; + result._colors = colors; + result._ellipsoid = ellipsoid; + result._colorsPerVertex = colorsPerVertex; + result._arcType = arcType; + result._granularity = granularity; + return result; +}; +var scratchArray1 = new Array(2); +var scratchArray2 = new Array(2); +var generateArcOptionsScratch = { + positions: scratchArray1, + height: scratchArray2, + ellipsoid: void 0, + minDistance: void 0, + granularity: void 0 +}; +SimplePolylineGeometry.createGeometry = function(simplePolylineGeometry) { + const positions = simplePolylineGeometry._positions; + const colors = simplePolylineGeometry._colors; + const colorsPerVertex = simplePolylineGeometry._colorsPerVertex; + const arcType = simplePolylineGeometry._arcType; + const granularity = simplePolylineGeometry._granularity; + const ellipsoid = simplePolylineGeometry._ellipsoid; + const minDistance = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + const perSegmentColors = defined_default(colors) && !colorsPerVertex; + let i; + const length = positions.length; + let positionValues; + let numberOfPositions; + let colorValues; + let color; + let offset = 0; + if (arcType === ArcType_default.GEODESIC || arcType === ArcType_default.RHUMB) { + let subdivisionSize; + let numberOfPointsFunction; + let generateArcFunction; + if (arcType === ArcType_default.GEODESIC) { + subdivisionSize = Math_default.chordLength( + granularity, + ellipsoid.maximumRadius + ); + numberOfPointsFunction = PolylinePipeline_default.numberOfPoints; + generateArcFunction = PolylinePipeline_default.generateArc; + } else { + subdivisionSize = granularity; + numberOfPointsFunction = PolylinePipeline_default.numberOfPointsRhumbLine; + generateArcFunction = PolylinePipeline_default.generateRhumbArc; + } + const heights = PolylinePipeline_default.extractHeights(positions, ellipsoid); + const generateArcOptions = generateArcOptionsScratch; + if (arcType === ArcType_default.GEODESIC) { + generateArcOptions.minDistance = minDistance; + } else { + generateArcOptions.granularity = granularity; + } + generateArcOptions.ellipsoid = ellipsoid; + if (perSegmentColors) { + let positionCount = 0; + for (i = 0; i < length - 1; i++) { + positionCount += numberOfPointsFunction( + positions[i], + positions[i + 1], + subdivisionSize + ) + 1; + } + positionValues = new Float64Array(positionCount * 3); + colorValues = new Uint8Array(positionCount * 4); + generateArcOptions.positions = scratchArray1; + generateArcOptions.height = scratchArray2; + let ci = 0; + for (i = 0; i < length - 1; ++i) { + scratchArray1[0] = positions[i]; + scratchArray1[1] = positions[i + 1]; + scratchArray2[0] = heights[i]; + scratchArray2[1] = heights[i + 1]; + const pos = generateArcFunction(generateArcOptions); + if (defined_default(colors)) { + const segLen = pos.length / 3; + color = colors[i]; + for (let k = 0; k < segLen; ++k) { + colorValues[ci++] = Color_default.floatToByte(color.red); + colorValues[ci++] = Color_default.floatToByte(color.green); + colorValues[ci++] = Color_default.floatToByte(color.blue); + colorValues[ci++] = Color_default.floatToByte(color.alpha); + } + } + positionValues.set(pos, offset); + offset += pos.length; + } + } else { + generateArcOptions.positions = positions; + generateArcOptions.height = heights; + positionValues = new Float64Array( + generateArcFunction(generateArcOptions) + ); + if (defined_default(colors)) { + colorValues = new Uint8Array(positionValues.length / 3 * 4); + for (i = 0; i < length - 1; ++i) { + const p0 = positions[i]; + const p1 = positions[i + 1]; + const c0 = colors[i]; + const c1 = colors[i + 1]; + offset = interpolateColors( + p0, + p1, + c0, + c1, + minDistance, + colorValues, + offset + ); + } + const lastColor = colors[length - 1]; + colorValues[offset++] = Color_default.floatToByte(lastColor.red); + colorValues[offset++] = Color_default.floatToByte(lastColor.green); + colorValues[offset++] = Color_default.floatToByte(lastColor.blue); + colorValues[offset++] = Color_default.floatToByte(lastColor.alpha); + } + } + } else { + numberOfPositions = perSegmentColors ? length * 2 - 2 : length; + positionValues = new Float64Array(numberOfPositions * 3); + colorValues = defined_default(colors) ? new Uint8Array(numberOfPositions * 4) : void 0; + let positionIndex = 0; + let colorIndex = 0; + for (i = 0; i < length; ++i) { + const p = positions[i]; + if (perSegmentColors && i > 0) { + Cartesian3_default.pack(p, positionValues, positionIndex); + positionIndex += 3; + color = colors[i - 1]; + colorValues[colorIndex++] = Color_default.floatToByte(color.red); + colorValues[colorIndex++] = Color_default.floatToByte(color.green); + colorValues[colorIndex++] = Color_default.floatToByte(color.blue); + colorValues[colorIndex++] = Color_default.floatToByte(color.alpha); + } + if (perSegmentColors && i === length - 1) { + break; + } + Cartesian3_default.pack(p, positionValues, positionIndex); + positionIndex += 3; + if (defined_default(colors)) { + color = colors[i]; + colorValues[colorIndex++] = Color_default.floatToByte(color.red); + colorValues[colorIndex++] = Color_default.floatToByte(color.green); + colorValues[colorIndex++] = Color_default.floatToByte(color.blue); + colorValues[colorIndex++] = Color_default.floatToByte(color.alpha); + } + } + } + const attributes = new GeometryAttributes_default(); + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positionValues + }); + if (defined_default(colors)) { + attributes.color = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.UNSIGNED_BYTE, + componentsPerAttribute: 4, + values: colorValues, + normalize: true + }); + } + numberOfPositions = positionValues.length / 3; + const numberOfIndices = (numberOfPositions - 1) * 2; + const indices = IndexDatatype_default.createTypedArray( + numberOfPositions, + numberOfIndices + ); + let index = 0; + for (i = 0; i < numberOfPositions - 1; ++i) { + indices[index++] = i; + indices[index++] = i + 1; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: BoundingSphere_default.fromPoints(positions) + }); +}; +var SimplePolylineGeometry_default = SimplePolylineGeometry; + +// packages/engine/Source/Workers/createSimplePolylineGeometry.js +function createSimplePolylineGeometry(simplePolylineGeometry, offset) { + if (defined_default(offset)) { + simplePolylineGeometry = SimplePolylineGeometry_default.unpack( + simplePolylineGeometry, + offset + ); + } + simplePolylineGeometry._ellipsoid = Ellipsoid_default.clone( + simplePolylineGeometry._ellipsoid + ); + return SimplePolylineGeometry_default.createGeometry(simplePolylineGeometry); +} +var createSimplePolylineGeometry_default = createSimplePolylineGeometry; +export { + createSimplePolylineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createSphereGeometry.js b/public/assets/cesium/Workers/createSphereGeometry.js new file mode 100644 index 0000000..62aa101 --- /dev/null +++ b/public/assets/cesium/Workers/createSphereGeometry.js @@ -0,0 +1,116 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidGeometry_default +} from "./chunk-IZGUQO6Q.js"; +import "./chunk-GBT7MJ6X.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/SphereGeometry.js +function SphereGeometry(options) { + const radius = defaultValue_default(options.radius, 1); + const radii = new Cartesian3_default(radius, radius, radius); + const ellipsoidOptions = { + radii, + stackPartitions: options.stackPartitions, + slicePartitions: options.slicePartitions, + vertexFormat: options.vertexFormat + }; + this._ellipsoidGeometry = new EllipsoidGeometry_default(ellipsoidOptions); + this._workerName = "createSphereGeometry"; +} +SphereGeometry.packedLength = EllipsoidGeometry_default.packedLength; +SphereGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + return EllipsoidGeometry_default.pack(value._ellipsoidGeometry, array, startingIndex); +}; +var scratchEllipsoidGeometry = new EllipsoidGeometry_default(); +var scratchOptions = { + radius: void 0, + radii: new Cartesian3_default(), + vertexFormat: new VertexFormat_default(), + stackPartitions: void 0, + slicePartitions: void 0 +}; +SphereGeometry.unpack = function(array, startingIndex, result) { + const ellipsoidGeometry = EllipsoidGeometry_default.unpack( + array, + startingIndex, + scratchEllipsoidGeometry + ); + scratchOptions.vertexFormat = VertexFormat_default.clone( + ellipsoidGeometry._vertexFormat, + scratchOptions.vertexFormat + ); + scratchOptions.stackPartitions = ellipsoidGeometry._stackPartitions; + scratchOptions.slicePartitions = ellipsoidGeometry._slicePartitions; + if (!defined_default(result)) { + scratchOptions.radius = ellipsoidGeometry._radii.x; + return new SphereGeometry(scratchOptions); + } + Cartesian3_default.clone(ellipsoidGeometry._radii, scratchOptions.radii); + result._ellipsoidGeometry = new EllipsoidGeometry_default(scratchOptions); + return result; +}; +SphereGeometry.createGeometry = function(sphereGeometry) { + return EllipsoidGeometry_default.createGeometry(sphereGeometry._ellipsoidGeometry); +}; +var SphereGeometry_default = SphereGeometry; + +// packages/engine/Source/Workers/createSphereGeometry.js +function createSphereGeometry(sphereGeometry, offset) { + if (defined_default(offset)) { + sphereGeometry = SphereGeometry_default.unpack(sphereGeometry, offset); + } + return SphereGeometry_default.createGeometry(sphereGeometry); +} +var createSphereGeometry_default = createSphereGeometry; +export { + createSphereGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createSphereOutlineGeometry.js b/public/assets/cesium/Workers/createSphereOutlineGeometry.js new file mode 100644 index 0000000..0d51a26 --- /dev/null +++ b/public/assets/cesium/Workers/createSphereOutlineGeometry.js @@ -0,0 +1,116 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidOutlineGeometry_default +} from "./chunk-OPP2SKMA.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/SphereOutlineGeometry.js +function SphereOutlineGeometry(options) { + const radius = defaultValue_default(options.radius, 1); + const radii = new Cartesian3_default(radius, radius, radius); + const ellipsoidOptions = { + radii, + stackPartitions: options.stackPartitions, + slicePartitions: options.slicePartitions, + subdivisions: options.subdivisions + }; + this._ellipsoidGeometry = new EllipsoidOutlineGeometry_default(ellipsoidOptions); + this._workerName = "createSphereOutlineGeometry"; +} +SphereOutlineGeometry.packedLength = EllipsoidOutlineGeometry_default.packedLength; +SphereOutlineGeometry.pack = function(value, array, startingIndex) { + Check_default.typeOf.object("value", value); + return EllipsoidOutlineGeometry_default.pack( + value._ellipsoidGeometry, + array, + startingIndex + ); +}; +var scratchEllipsoidGeometry = new EllipsoidOutlineGeometry_default(); +var scratchOptions = { + radius: void 0, + radii: new Cartesian3_default(), + stackPartitions: void 0, + slicePartitions: void 0, + subdivisions: void 0 +}; +SphereOutlineGeometry.unpack = function(array, startingIndex, result) { + const ellipsoidGeometry = EllipsoidOutlineGeometry_default.unpack( + array, + startingIndex, + scratchEllipsoidGeometry + ); + scratchOptions.stackPartitions = ellipsoidGeometry._stackPartitions; + scratchOptions.slicePartitions = ellipsoidGeometry._slicePartitions; + scratchOptions.subdivisions = ellipsoidGeometry._subdivisions; + if (!defined_default(result)) { + scratchOptions.radius = ellipsoidGeometry._radii.x; + return new SphereOutlineGeometry(scratchOptions); + } + Cartesian3_default.clone(ellipsoidGeometry._radii, scratchOptions.radii); + result._ellipsoidGeometry = new EllipsoidOutlineGeometry_default(scratchOptions); + return result; +}; +SphereOutlineGeometry.createGeometry = function(sphereGeometry) { + return EllipsoidOutlineGeometry_default.createGeometry( + sphereGeometry._ellipsoidGeometry + ); +}; +var SphereOutlineGeometry_default = SphereOutlineGeometry; + +// packages/engine/Source/Workers/createSphereOutlineGeometry.js +function createSphereOutlineGeometry(sphereGeometry, offset) { + if (defined_default(offset)) { + sphereGeometry = SphereOutlineGeometry_default.unpack(sphereGeometry, offset); + } + return SphereOutlineGeometry_default.createGeometry(sphereGeometry); +} +var createSphereOutlineGeometry_default = createSphereOutlineGeometry; +export { + createSphereOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createTaskProcessorWorker.js b/public/assets/cesium/Workers/createTaskProcessorWorker.js new file mode 100644 index 0000000..700d60f --- /dev/null +++ b/public/assets/cesium/Workers/createTaskProcessorWorker.js @@ -0,0 +1,32 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import "./chunk-YCDZX5LS.js"; +export { + createTaskProcessorWorker_default as default +}; diff --git a/public/assets/cesium/Workers/createVectorTileClampedPolylines.js b/public/assets/cesium/Workers/createVectorTileClampedPolylines.js new file mode 100644 index 0000000..d52520f --- /dev/null +++ b/public/assets/cesium/Workers/createVectorTileClampedPolylines.js @@ -0,0 +1,490 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + Rectangle_default, + combine_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createVectorTileClampedPolylines.js +var MAX_SHORT = 32767; +var MITER_BREAK = Math.cos(Math_default.toRadians(150)); +var scratchBVCartographic = new Cartographic_default(); +var scratchEncodedPosition = new Cartesian3_default(); +function decodePositions(uBuffer, vBuffer, heightBuffer, rectangle, minimumHeight, maximumHeight, ellipsoid) { + const positionsLength = uBuffer.length; + const decodedPositions = new Float64Array(positionsLength * 3); + for (let i = 0; i < positionsLength; ++i) { + const u = uBuffer[i]; + const v = vBuffer[i]; + const h = heightBuffer[i]; + const lon = Math_default.lerp(rectangle.west, rectangle.east, u / MAX_SHORT); + const lat = Math_default.lerp( + rectangle.south, + rectangle.north, + v / MAX_SHORT + ); + const alt = Math_default.lerp(minimumHeight, maximumHeight, h / MAX_SHORT); + const cartographic = Cartographic_default.fromRadians( + lon, + lat, + alt, + scratchBVCartographic + ); + const decodedPosition = ellipsoid.cartographicToCartesian( + cartographic, + scratchEncodedPosition + ); + Cartesian3_default.pack(decodedPosition, decodedPositions, i * 3); + } + return decodedPositions; +} +function getPositionOffsets(counts) { + const countsLength = counts.length; + const positionOffsets = new Uint32Array(countsLength + 1); + let offset = 0; + for (let i = 0; i < countsLength; ++i) { + positionOffsets[i] = offset; + offset += counts[i]; + } + positionOffsets[countsLength] = offset; + return positionOffsets; +} +var previousCompressedCartographicScratch = new Cartographic_default(); +var currentCompressedCartographicScratch = new Cartographic_default(); +function removeDuplicates(uBuffer, vBuffer, heightBuffer, counts) { + const countsLength = counts.length; + const positionsLength = uBuffer.length; + const markRemoval = new Uint8Array(positionsLength); + const previous = previousCompressedCartographicScratch; + const current = currentCompressedCartographicScratch; + let offset = 0; + for (let i = 0; i < countsLength; i++) { + const count = counts[i]; + let updatedCount = count; + for (let j = 1; j < count; j++) { + const index = offset + j; + const previousIndex = index - 1; + current.longitude = uBuffer[index]; + current.latitude = vBuffer[index]; + previous.longitude = uBuffer[previousIndex]; + previous.latitude = vBuffer[previousIndex]; + if (Cartographic_default.equals(current, previous)) { + updatedCount--; + markRemoval[previousIndex] = 1; + } + } + counts[i] = updatedCount; + offset += count; + } + let nextAvailableIndex = 0; + for (let k = 0; k < positionsLength; k++) { + if (markRemoval[k] !== 1) { + uBuffer[nextAvailableIndex] = uBuffer[k]; + vBuffer[nextAvailableIndex] = vBuffer[k]; + heightBuffer[nextAvailableIndex] = heightBuffer[k]; + nextAvailableIndex++; + } + } +} +function VertexAttributesAndIndices(volumesCount) { + const vertexCount = volumesCount * 8; + const vec3Floats = vertexCount * 3; + const vec4Floats = vertexCount * 4; + this.startEllipsoidNormals = new Float32Array(vec3Floats); + this.endEllipsoidNormals = new Float32Array(vec3Floats); + this.startPositionAndHeights = new Float32Array(vec4Floats); + this.startFaceNormalAndVertexCornerIds = new Float32Array(vec4Floats); + this.endPositionAndHeights = new Float32Array(vec4Floats); + this.endFaceNormalAndHalfWidths = new Float32Array(vec4Floats); + this.vertexBatchIds = new Uint16Array(vertexCount); + this.indices = IndexDatatype_default.createTypedArray(vertexCount, 36 * volumesCount); + this.vec3Offset = 0; + this.vec4Offset = 0; + this.batchIdOffset = 0; + this.indexOffset = 0; + this.volumeStartIndex = 0; +} +var towardCurrScratch = new Cartesian3_default(); +var towardNextScratch = new Cartesian3_default(); +function computeMiteredNormal(previousPosition, position, nextPosition, ellipsoidSurfaceNormal, result) { + const towardNext = Cartesian3_default.subtract( + nextPosition, + position, + towardNextScratch + ); + let towardCurr = Cartesian3_default.subtract( + position, + previousPosition, + towardCurrScratch + ); + Cartesian3_default.normalize(towardNext, towardNext); + Cartesian3_default.normalize(towardCurr, towardCurr); + if (Cartesian3_default.dot(towardNext, towardCurr) < MITER_BREAK) { + towardCurr = Cartesian3_default.multiplyByScalar( + towardCurr, + -1, + towardCurrScratch + ); + } + Cartesian3_default.add(towardNext, towardCurr, result); + if (Cartesian3_default.equals(result, Cartesian3_default.ZERO)) { + result = Cartesian3_default.subtract(previousPosition, position); + } + Cartesian3_default.cross(result, ellipsoidSurfaceNormal, result); + Cartesian3_default.cross(ellipsoidSurfaceNormal, result, result); + Cartesian3_default.normalize(result, result); + return result; +} +var REFERENCE_INDICES = [ + 0, + 2, + 6, + 0, + 6, + 4, + // right + 0, + 1, + 3, + 0, + 3, + 2, + // start face + 0, + 4, + 5, + 0, + 5, + 1, + // bottom + 5, + 3, + 1, + 5, + 7, + 3, + // left + 7, + 5, + 4, + 7, + 4, + 6, + // end face + 7, + 6, + 2, + 7, + 2, + 3 + // top +]; +var REFERENCE_INDICES_LENGTH = REFERENCE_INDICES.length; +var positionScratch = new Cartesian3_default(); +var scratchStartEllipsoidNormal = new Cartesian3_default(); +var scratchStartFaceNormal = new Cartesian3_default(); +var scratchEndEllipsoidNormal = new Cartesian3_default(); +var scratchEndFaceNormal = new Cartesian3_default(); +VertexAttributesAndIndices.prototype.addVolume = function(preStartRTC, startRTC, endRTC, postEndRTC, startHeight, endHeight, halfWidth, batchId, center, ellipsoid) { + let position = Cartesian3_default.add(startRTC, center, positionScratch); + const startEllipsoidNormal = ellipsoid.geodeticSurfaceNormal( + position, + scratchStartEllipsoidNormal + ); + position = Cartesian3_default.add(endRTC, center, positionScratch); + const endEllipsoidNormal = ellipsoid.geodeticSurfaceNormal( + position, + scratchEndEllipsoidNormal + ); + const startFaceNormal = computeMiteredNormal( + preStartRTC, + startRTC, + endRTC, + startEllipsoidNormal, + scratchStartFaceNormal + ); + const endFaceNormal = computeMiteredNormal( + postEndRTC, + endRTC, + startRTC, + endEllipsoidNormal, + scratchEndFaceNormal + ); + const startEllipsoidNormals = this.startEllipsoidNormals; + const endEllipsoidNormals = this.endEllipsoidNormals; + const startPositionAndHeights = this.startPositionAndHeights; + const startFaceNormalAndVertexCornerIds = this.startFaceNormalAndVertexCornerIds; + const endPositionAndHeights = this.endPositionAndHeights; + const endFaceNormalAndHalfWidths = this.endFaceNormalAndHalfWidths; + const vertexBatchIds = this.vertexBatchIds; + let batchIdOffset = this.batchIdOffset; + let vec3Offset = this.vec3Offset; + let vec4Offset = this.vec4Offset; + let i; + for (i = 0; i < 8; i++) { + Cartesian3_default.pack(startEllipsoidNormal, startEllipsoidNormals, vec3Offset); + Cartesian3_default.pack(endEllipsoidNormal, endEllipsoidNormals, vec3Offset); + Cartesian3_default.pack(startRTC, startPositionAndHeights, vec4Offset); + startPositionAndHeights[vec4Offset + 3] = startHeight; + Cartesian3_default.pack(endRTC, endPositionAndHeights, vec4Offset); + endPositionAndHeights[vec4Offset + 3] = endHeight; + Cartesian3_default.pack( + startFaceNormal, + startFaceNormalAndVertexCornerIds, + vec4Offset + ); + startFaceNormalAndVertexCornerIds[vec4Offset + 3] = i; + Cartesian3_default.pack(endFaceNormal, endFaceNormalAndHalfWidths, vec4Offset); + endFaceNormalAndHalfWidths[vec4Offset + 3] = halfWidth; + vertexBatchIds[batchIdOffset++] = batchId; + vec3Offset += 3; + vec4Offset += 4; + } + this.batchIdOffset = batchIdOffset; + this.vec3Offset = vec3Offset; + this.vec4Offset = vec4Offset; + const indices = this.indices; + const volumeStartIndex = this.volumeStartIndex; + const indexOffset = this.indexOffset; + for (i = 0; i < REFERENCE_INDICES_LENGTH; i++) { + indices[indexOffset + i] = REFERENCE_INDICES[i] + volumeStartIndex; + } + this.volumeStartIndex += 8; + this.indexOffset += REFERENCE_INDICES_LENGTH; +}; +var scratchRectangle = new Rectangle_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchCenter = new Cartesian3_default(); +var scratchPrev = new Cartesian3_default(); +var scratchP0 = new Cartesian3_default(); +var scratchP1 = new Cartesian3_default(); +var scratchNext = new Cartesian3_default(); +function createVectorTileClampedPolylines(parameters, transferableObjects) { + const encodedPositions = new Uint16Array(parameters.positions); + const widths = new Uint16Array(parameters.widths); + const counts = new Uint32Array(parameters.counts); + const batchIds = new Uint16Array(parameters.batchIds); + const rectangle = scratchRectangle; + const ellipsoid = scratchEllipsoid; + const center = scratchCenter; + const packedBuffer = new Float64Array(parameters.packedBuffer); + let offset = 0; + const minimumHeight = packedBuffer[offset++]; + const maximumHeight = packedBuffer[offset++]; + Rectangle_default.unpack(packedBuffer, offset, rectangle); + offset += Rectangle_default.packedLength; + Ellipsoid_default.unpack(packedBuffer, offset, ellipsoid); + offset += Ellipsoid_default.packedLength; + Cartesian3_default.unpack(packedBuffer, offset, center); + let i; + let positionsLength = encodedPositions.length / 3; + const uBuffer = encodedPositions.subarray(0, positionsLength); + const vBuffer = encodedPositions.subarray( + positionsLength, + 2 * positionsLength + ); + const heightBuffer = encodedPositions.subarray( + 2 * positionsLength, + 3 * positionsLength + ); + AttributeCompression_default.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer); + removeDuplicates(uBuffer, vBuffer, heightBuffer, counts); + const countsLength = counts.length; + let volumesCount = 0; + for (i = 0; i < countsLength; i++) { + const polylinePositionCount = counts[i]; + volumesCount += polylinePositionCount - 1; + } + const attribsAndIndices = new VertexAttributesAndIndices(volumesCount); + const positions = decodePositions( + uBuffer, + vBuffer, + heightBuffer, + rectangle, + minimumHeight, + maximumHeight, + ellipsoid, + center + ); + positionsLength = uBuffer.length; + const positionsRTC = new Float32Array(positionsLength * 3); + for (i = 0; i < positionsLength; ++i) { + positionsRTC[i * 3] = positions[i * 3] - center.x; + positionsRTC[i * 3 + 1] = positions[i * 3 + 1] - center.y; + positionsRTC[i * 3 + 2] = positions[i * 3 + 2] - center.z; + } + let currentPositionIndex = 0; + let currentHeightIndex = 0; + for (i = 0; i < countsLength; i++) { + const polylineVolumeCount = counts[i] - 1; + const halfWidth = widths[i] * 0.5; + const batchId = batchIds[i]; + const volumeFirstPositionIndex = currentPositionIndex; + for (let j = 0; j < polylineVolumeCount; j++) { + const volumeStart = Cartesian3_default.unpack( + positionsRTC, + currentPositionIndex, + scratchP0 + ); + const volumeEnd = Cartesian3_default.unpack( + positionsRTC, + currentPositionIndex + 3, + scratchP1 + ); + let startHeight = heightBuffer[currentHeightIndex]; + let endHeight = heightBuffer[currentHeightIndex + 1]; + startHeight = Math_default.lerp( + minimumHeight, + maximumHeight, + startHeight / MAX_SHORT + ); + endHeight = Math_default.lerp( + minimumHeight, + maximumHeight, + endHeight / MAX_SHORT + ); + currentHeightIndex++; + let preStart = scratchPrev; + let postEnd = scratchNext; + if (j === 0) { + const finalPositionIndex = volumeFirstPositionIndex + polylineVolumeCount * 3; + const finalPosition = Cartesian3_default.unpack( + positionsRTC, + finalPositionIndex, + scratchPrev + ); + if (Cartesian3_default.equals(finalPosition, volumeStart)) { + Cartesian3_default.unpack(positionsRTC, finalPositionIndex - 3, preStart); + } else { + const offsetPastStart = Cartesian3_default.subtract( + volumeStart, + volumeEnd, + scratchPrev + ); + preStart = Cartesian3_default.add(offsetPastStart, volumeStart, scratchPrev); + } + } else { + Cartesian3_default.unpack(positionsRTC, currentPositionIndex - 3, preStart); + } + if (j === polylineVolumeCount - 1) { + const firstPosition = Cartesian3_default.unpack( + positionsRTC, + volumeFirstPositionIndex, + scratchNext + ); + if (Cartesian3_default.equals(firstPosition, volumeEnd)) { + Cartesian3_default.unpack( + positionsRTC, + volumeFirstPositionIndex + 3, + postEnd + ); + } else { + const offsetPastEnd = Cartesian3_default.subtract( + volumeEnd, + volumeStart, + scratchNext + ); + postEnd = Cartesian3_default.add(offsetPastEnd, volumeEnd, scratchNext); + } + } else { + Cartesian3_default.unpack(positionsRTC, currentPositionIndex + 6, postEnd); + } + attribsAndIndices.addVolume( + preStart, + volumeStart, + volumeEnd, + postEnd, + startHeight, + endHeight, + halfWidth, + batchId, + center, + ellipsoid + ); + currentPositionIndex += 3; + } + currentPositionIndex += 3; + currentHeightIndex++; + } + const indices = attribsAndIndices.indices; + transferableObjects.push(attribsAndIndices.startEllipsoidNormals.buffer); + transferableObjects.push(attribsAndIndices.endEllipsoidNormals.buffer); + transferableObjects.push(attribsAndIndices.startPositionAndHeights.buffer); + transferableObjects.push( + attribsAndIndices.startFaceNormalAndVertexCornerIds.buffer + ); + transferableObjects.push(attribsAndIndices.endPositionAndHeights.buffer); + transferableObjects.push(attribsAndIndices.endFaceNormalAndHalfWidths.buffer); + transferableObjects.push(attribsAndIndices.vertexBatchIds.buffer); + transferableObjects.push(indices.buffer); + let results = { + indexDatatype: indices.BYTES_PER_ELEMENT === 2 ? IndexDatatype_default.UNSIGNED_SHORT : IndexDatatype_default.UNSIGNED_INT, + startEllipsoidNormals: attribsAndIndices.startEllipsoidNormals.buffer, + endEllipsoidNormals: attribsAndIndices.endEllipsoidNormals.buffer, + startPositionAndHeights: attribsAndIndices.startPositionAndHeights.buffer, + startFaceNormalAndVertexCornerIds: attribsAndIndices.startFaceNormalAndVertexCornerIds.buffer, + endPositionAndHeights: attribsAndIndices.endPositionAndHeights.buffer, + endFaceNormalAndHalfWidths: attribsAndIndices.endFaceNormalAndHalfWidths.buffer, + vertexBatchIds: attribsAndIndices.vertexBatchIds.buffer, + indices: indices.buffer + }; + if (parameters.keepDecodedPositions) { + const positionOffsets = getPositionOffsets(counts); + transferableObjects.push(positions.buffer, positionOffsets.buffer); + results = combine_default(results, { + decodedPositions: positions.buffer, + decodedPositionOffsets: positionOffsets.buffer + }); + } + return results; +} +var createVectorTileClampedPolylines_default = createTaskProcessorWorker_default(createVectorTileClampedPolylines); +export { + createVectorTileClampedPolylines_default as default +}; diff --git a/public/assets/cesium/Workers/createVectorTileGeometries.js b/public/assets/cesium/Workers/createVectorTileGeometries.js new file mode 100644 index 0000000..adc7b9f --- /dev/null +++ b/public/assets/cesium/Workers/createVectorTileGeometries.js @@ -0,0 +1,385 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Color_default +} from "./chunk-HP5XLODI.js"; +import { + CylinderGeometry_default +} from "./chunk-L5GODJAR.js"; +import "./chunk-O72GZTSE.js"; +import { + EllipsoidGeometry_default +} from "./chunk-IZGUQO6Q.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + BoxGeometry_default +} from "./chunk-HJMNR3GC.js"; +import "./chunk-GBT7MJ6X.js"; +import "./chunk-JBSKHTNX.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import "./chunk-X7IQYYHF.js"; +import "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default +} from "./chunk-FFLMY4TE.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Scene/Vector3DTileBatch.js +function Vector3DTileBatch(options) { + this.offset = options.offset; + this.count = options.count; + this.color = options.color; + this.batchIds = options.batchIds; +} +var Vector3DTileBatch_default = Vector3DTileBatch; + +// packages/engine/Source/Workers/createVectorTileGeometries.js +var scratchCartesian = new Cartesian3_default(); +var packedBoxLength = Matrix4_default.packedLength + Cartesian3_default.packedLength; +var packedCylinderLength = Matrix4_default.packedLength + 2; +var packedEllipsoidLength = Matrix4_default.packedLength + Cartesian3_default.packedLength; +var packedSphereLength = Cartesian3_default.packedLength + 1; +var scratchModelMatrixAndBV = { + modelMatrix: new Matrix4_default(), + boundingVolume: new BoundingSphere_default() +}; +function boxModelMatrixAndBoundingVolume(boxes, index) { + let boxIndex = index * packedBoxLength; + const dimensions = Cartesian3_default.unpack(boxes, boxIndex, scratchCartesian); + boxIndex += Cartesian3_default.packedLength; + const boxModelMatrix = Matrix4_default.unpack( + boxes, + boxIndex, + scratchModelMatrixAndBV.modelMatrix + ); + Matrix4_default.multiplyByScale(boxModelMatrix, dimensions, boxModelMatrix); + const boundingVolume = scratchModelMatrixAndBV.boundingVolume; + Cartesian3_default.clone(Cartesian3_default.ZERO, boundingVolume.center); + boundingVolume.radius = Math.sqrt(3); + return scratchModelMatrixAndBV; +} +function cylinderModelMatrixAndBoundingVolume(cylinders, index) { + let cylinderIndex = index * packedCylinderLength; + const cylinderRadius = cylinders[cylinderIndex++]; + const length = cylinders[cylinderIndex++]; + const scale = Cartesian3_default.fromElements( + cylinderRadius, + cylinderRadius, + length, + scratchCartesian + ); + const cylinderModelMatrix = Matrix4_default.unpack( + cylinders, + cylinderIndex, + scratchModelMatrixAndBV.modelMatrix + ); + Matrix4_default.multiplyByScale(cylinderModelMatrix, scale, cylinderModelMatrix); + const boundingVolume = scratchModelMatrixAndBV.boundingVolume; + Cartesian3_default.clone(Cartesian3_default.ZERO, boundingVolume.center); + boundingVolume.radius = Math.sqrt(2); + return scratchModelMatrixAndBV; +} +function ellipsoidModelMatrixAndBoundingVolume(ellipsoids, index) { + let ellipsoidIndex = index * packedEllipsoidLength; + const radii = Cartesian3_default.unpack(ellipsoids, ellipsoidIndex, scratchCartesian); + ellipsoidIndex += Cartesian3_default.packedLength; + const ellipsoidModelMatrix = Matrix4_default.unpack( + ellipsoids, + ellipsoidIndex, + scratchModelMatrixAndBV.modelMatrix + ); + Matrix4_default.multiplyByScale(ellipsoidModelMatrix, radii, ellipsoidModelMatrix); + const boundingVolume = scratchModelMatrixAndBV.boundingVolume; + Cartesian3_default.clone(Cartesian3_default.ZERO, boundingVolume.center); + boundingVolume.radius = 1; + return scratchModelMatrixAndBV; +} +function sphereModelMatrixAndBoundingVolume(spheres, index) { + let sphereIndex = index * packedSphereLength; + const sphereRadius = spheres[sphereIndex++]; + const sphereTranslation = Cartesian3_default.unpack( + spheres, + sphereIndex, + scratchCartesian + ); + const sphereModelMatrix = Matrix4_default.fromTranslation( + sphereTranslation, + scratchModelMatrixAndBV.modelMatrix + ); + Matrix4_default.multiplyByUniformScale( + sphereModelMatrix, + sphereRadius, + sphereModelMatrix + ); + const boundingVolume = scratchModelMatrixAndBV.boundingVolume; + Cartesian3_default.clone(Cartesian3_default.ZERO, boundingVolume.center); + boundingVolume.radius = 1; + return scratchModelMatrixAndBV; +} +var scratchPosition = new Cartesian3_default(); +function createPrimitive(options, primitive, primitiveBatchIds, geometry, getModelMatrixAndBoundingVolume) { + if (!defined_default(primitive)) { + return; + } + const numberOfPrimitives = primitiveBatchIds.length; + const geometryPositions = geometry.attributes.position.values; + const geometryIndices = geometry.indices; + const positions = options.positions; + const vertexBatchIds = options.vertexBatchIds; + const indices = options.indices; + const batchIds = options.batchIds; + const batchTableColors = options.batchTableColors; + const batchedIndices = options.batchedIndices; + const indexOffsets = options.indexOffsets; + const indexCounts = options.indexCounts; + const boundingVolumes = options.boundingVolumes; + const modelMatrix = options.modelMatrix; + const center = options.center; + let positionOffset = options.positionOffset; + let batchIdIndex = options.batchIdIndex; + let indexOffset = options.indexOffset; + const batchedIndicesOffset = options.batchedIndicesOffset; + for (let i = 0; i < numberOfPrimitives; ++i) { + const primitiveModelMatrixAndBV = getModelMatrixAndBoundingVolume( + primitive, + i + ); + const primitiveModelMatrix = primitiveModelMatrixAndBV.modelMatrix; + Matrix4_default.multiply(modelMatrix, primitiveModelMatrix, primitiveModelMatrix); + const batchId = primitiveBatchIds[i]; + const positionsLength = geometryPositions.length; + for (let j = 0; j < positionsLength; j += 3) { + const position = Cartesian3_default.unpack(geometryPositions, j, scratchPosition); + Matrix4_default.multiplyByPoint(primitiveModelMatrix, position, position); + Cartesian3_default.subtract(position, center, position); + Cartesian3_default.pack(position, positions, positionOffset * 3 + j); + vertexBatchIds[batchIdIndex++] = batchId; + } + const indicesLength = geometryIndices.length; + for (let k = 0; k < indicesLength; ++k) { + indices[indexOffset + k] = geometryIndices[k] + positionOffset; + } + const offset = i + batchedIndicesOffset; + batchedIndices[offset] = new Vector3DTileBatch_default({ + offset: indexOffset, + count: indicesLength, + color: Color_default.fromRgba(batchTableColors[batchId]), + batchIds: [batchId] + }); + batchIds[offset] = batchId; + indexOffsets[offset] = indexOffset; + indexCounts[offset] = indicesLength; + boundingVolumes[offset] = BoundingSphere_default.transform( + primitiveModelMatrixAndBV.boundingVolume, + primitiveModelMatrix + ); + positionOffset += positionsLength / 3; + indexOffset += indicesLength; + } + options.positionOffset = positionOffset; + options.batchIdIndex = batchIdIndex; + options.indexOffset = indexOffset; + options.batchedIndicesOffset += numberOfPrimitives; +} +var scratchCenter = new Cartesian3_default(); +var scratchMatrix4 = new Matrix4_default(); +function unpackBuffer(buffer) { + const packedBuffer = new Float64Array(buffer); + let offset = 0; + Cartesian3_default.unpack(packedBuffer, offset, scratchCenter); + offset += Cartesian3_default.packedLength; + Matrix4_default.unpack(packedBuffer, offset, scratchMatrix4); +} +function packedBatchedIndicesLength(batchedIndices) { + const length = batchedIndices.length; + let count = 0; + for (let i = 0; i < length; ++i) { + count += Color_default.packedLength + 3 + batchedIndices[i].batchIds.length; + } + return count; +} +function packBuffer(indicesBytesPerElement, batchedIndices, boundingVolumes) { + const numBVs = boundingVolumes.length; + const length = 1 + 1 + numBVs * BoundingSphere_default.packedLength + 1 + packedBatchedIndicesLength(batchedIndices); + const packedBuffer = new Float64Array(length); + let offset = 0; + packedBuffer[offset++] = indicesBytesPerElement; + packedBuffer[offset++] = numBVs; + for (let i = 0; i < numBVs; ++i) { + BoundingSphere_default.pack(boundingVolumes[i], packedBuffer, offset); + offset += BoundingSphere_default.packedLength; + } + const indicesLength = batchedIndices.length; + packedBuffer[offset++] = indicesLength; + for (let j = 0; j < indicesLength; ++j) { + const batchedIndex = batchedIndices[j]; + Color_default.pack(batchedIndex.color, packedBuffer, offset); + offset += Color_default.packedLength; + packedBuffer[offset++] = batchedIndex.offset; + packedBuffer[offset++] = batchedIndex.count; + const batchIds = batchedIndex.batchIds; + const batchIdsLength = batchIds.length; + packedBuffer[offset++] = batchIdsLength; + for (let k = 0; k < batchIdsLength; ++k) { + packedBuffer[offset++] = batchIds[k]; + } + } + return packedBuffer; +} +function createVectorTileGeometries(parameters, transferableObjects) { + const boxes = defined_default(parameters.boxes) ? new Float32Array(parameters.boxes) : void 0; + const boxBatchIds = defined_default(parameters.boxBatchIds) ? new Uint16Array(parameters.boxBatchIds) : void 0; + const cylinders = defined_default(parameters.cylinders) ? new Float32Array(parameters.cylinders) : void 0; + const cylinderBatchIds = defined_default(parameters.cylinderBatchIds) ? new Uint16Array(parameters.cylinderBatchIds) : void 0; + const ellipsoids = defined_default(parameters.ellipsoids) ? new Float32Array(parameters.ellipsoids) : void 0; + const ellipsoidBatchIds = defined_default(parameters.ellipsoidBatchIds) ? new Uint16Array(parameters.ellipsoidBatchIds) : void 0; + const spheres = defined_default(parameters.spheres) ? new Float32Array(parameters.spheres) : void 0; + const sphereBatchIds = defined_default(parameters.sphereBatchIds) ? new Uint16Array(parameters.sphereBatchIds) : void 0; + const numberOfBoxes = defined_default(boxes) ? boxBatchIds.length : 0; + const numberOfCylinders = defined_default(cylinders) ? cylinderBatchIds.length : 0; + const numberOfEllipsoids = defined_default(ellipsoids) ? ellipsoidBatchIds.length : 0; + const numberOfSpheres = defined_default(spheres) ? sphereBatchIds.length : 0; + const boxGeometry = BoxGeometry_default.getUnitBox(); + const cylinderGeometry = CylinderGeometry_default.getUnitCylinder(); + const ellipsoidGeometry = EllipsoidGeometry_default.getUnitEllipsoid(); + const boxPositions = boxGeometry.attributes.position.values; + const cylinderPositions = cylinderGeometry.attributes.position.values; + const ellipsoidPositions = ellipsoidGeometry.attributes.position.values; + let numberOfPositions = boxPositions.length * numberOfBoxes; + numberOfPositions += cylinderPositions.length * numberOfCylinders; + numberOfPositions += ellipsoidPositions.length * (numberOfEllipsoids + numberOfSpheres); + const boxIndices = boxGeometry.indices; + const cylinderIndices = cylinderGeometry.indices; + const ellipsoidIndices = ellipsoidGeometry.indices; + let numberOfIndices = boxIndices.length * numberOfBoxes; + numberOfIndices += cylinderIndices.length * numberOfCylinders; + numberOfIndices += ellipsoidIndices.length * (numberOfEllipsoids + numberOfSpheres); + const positions = new Float32Array(numberOfPositions); + const vertexBatchIds = new Uint16Array(numberOfPositions / 3); + const indices = IndexDatatype_default.createTypedArray( + numberOfPositions / 3, + numberOfIndices + ); + const numberOfGeometries = numberOfBoxes + numberOfCylinders + numberOfEllipsoids + numberOfSpheres; + const batchIds = new Uint16Array(numberOfGeometries); + const batchedIndices = new Array(numberOfGeometries); + const indexOffsets = new Uint32Array(numberOfGeometries); + const indexCounts = new Uint32Array(numberOfGeometries); + const boundingVolumes = new Array(numberOfGeometries); + unpackBuffer(parameters.packedBuffer); + const options = { + batchTableColors: new Uint32Array(parameters.batchTableColors), + positions, + vertexBatchIds, + indices, + batchIds, + batchedIndices, + indexOffsets, + indexCounts, + boundingVolumes, + positionOffset: 0, + batchIdIndex: 0, + indexOffset: 0, + batchedIndicesOffset: 0, + modelMatrix: scratchMatrix4, + center: scratchCenter + }; + createPrimitive( + options, + boxes, + boxBatchIds, + boxGeometry, + boxModelMatrixAndBoundingVolume + ); + createPrimitive( + options, + cylinders, + cylinderBatchIds, + cylinderGeometry, + cylinderModelMatrixAndBoundingVolume + ); + createPrimitive( + options, + ellipsoids, + ellipsoidBatchIds, + ellipsoidGeometry, + ellipsoidModelMatrixAndBoundingVolume + ); + createPrimitive( + options, + spheres, + sphereBatchIds, + ellipsoidGeometry, + sphereModelMatrixAndBoundingVolume + ); + const packedBuffer = packBuffer( + indices.BYTES_PER_ELEMENT, + batchedIndices, + boundingVolumes + ); + transferableObjects.push( + positions.buffer, + vertexBatchIds.buffer, + indices.buffer + ); + transferableObjects.push( + batchIds.buffer, + indexOffsets.buffer, + indexCounts.buffer + ); + transferableObjects.push(packedBuffer.buffer); + return { + positions: positions.buffer, + vertexBatchIds: vertexBatchIds.buffer, + indices: indices.buffer, + indexOffsets: indexOffsets.buffer, + indexCounts: indexCounts.buffer, + batchIds: batchIds.buffer, + packedBuffer: packedBuffer.buffer + }; +} +var createVectorTileGeometries_default = createTaskProcessorWorker_default(createVectorTileGeometries); +export { + createVectorTileGeometries_default as default +}; diff --git a/public/assets/cesium/Workers/createVectorTilePoints.js b/public/assets/cesium/Workers/createVectorTilePoints.js new file mode 100644 index 0000000..0560fb8 --- /dev/null +++ b/public/assets/cesium/Workers/createVectorTilePoints.js @@ -0,0 +1,112 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createVectorTilePoints.js +var maxShort = 32767; +var scratchBVCartographic = new Cartographic_default(); +var scratchEncodedPosition = new Cartesian3_default(); +var scratchRectangle = new Rectangle_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchMinMaxHeights = { + min: void 0, + max: void 0 +}; +function unpackBuffer(packedBuffer) { + packedBuffer = new Float64Array(packedBuffer); + let offset = 0; + scratchMinMaxHeights.min = packedBuffer[offset++]; + scratchMinMaxHeights.max = packedBuffer[offset++]; + Rectangle_default.unpack(packedBuffer, offset, scratchRectangle); + offset += Rectangle_default.packedLength; + Ellipsoid_default.unpack(packedBuffer, offset, scratchEllipsoid); +} +function createVectorTilePoints(parameters, transferableObjects) { + const positions = new Uint16Array(parameters.positions); + unpackBuffer(parameters.packedBuffer); + const rectangle = scratchRectangle; + const ellipsoid = scratchEllipsoid; + const minimumHeight = scratchMinMaxHeights.min; + const maximumHeight = scratchMinMaxHeights.max; + const positionsLength = positions.length / 3; + const uBuffer = positions.subarray(0, positionsLength); + const vBuffer = positions.subarray(positionsLength, 2 * positionsLength); + const heightBuffer = positions.subarray( + 2 * positionsLength, + 3 * positionsLength + ); + AttributeCompression_default.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer); + const decoded = new Float64Array(positions.length); + for (let i = 0; i < positionsLength; ++i) { + const u = uBuffer[i]; + const v = vBuffer[i]; + const h = heightBuffer[i]; + const lon = Math_default.lerp(rectangle.west, rectangle.east, u / maxShort); + const lat = Math_default.lerp(rectangle.south, rectangle.north, v / maxShort); + const alt = Math_default.lerp(minimumHeight, maximumHeight, h / maxShort); + const cartographic = Cartographic_default.fromRadians( + lon, + lat, + alt, + scratchBVCartographic + ); + const decodedPosition = ellipsoid.cartographicToCartesian( + cartographic, + scratchEncodedPosition + ); + Cartesian3_default.pack(decodedPosition, decoded, i * 3); + } + transferableObjects.push(decoded.buffer); + return { + positions: decoded.buffer + }; +} +var createVectorTilePoints_default = createTaskProcessorWorker_default(createVectorTilePoints); +export { + createVectorTilePoints_default as default +}; diff --git a/public/assets/cesium/Workers/createVectorTilePolygons.js b/public/assets/cesium/Workers/createVectorTilePolygons.js new file mode 100644 index 0000000..a9eca25 --- /dev/null +++ b/public/assets/cesium/Workers/createVectorTilePolygons.js @@ -0,0 +1,383 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + Color_default +} from "./chunk-HP5XLODI.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + OrientedBoundingBox_default +} from "./chunk-2PTKXHJB.js"; +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import "./chunk-KHZNBFOH.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createVectorTilePolygons.js +var scratchCenter = new Cartesian3_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchRectangle = new Rectangle_default(); +var scratchScalars = { + min: void 0, + max: void 0, + indexBytesPerElement: void 0 +}; +function unpackBuffer(buffer) { + const packedBuffer = new Float64Array(buffer); + let offset = 0; + scratchScalars.indexBytesPerElement = packedBuffer[offset++]; + scratchScalars.min = packedBuffer[offset++]; + scratchScalars.max = packedBuffer[offset++]; + Cartesian3_default.unpack(packedBuffer, offset, scratchCenter); + offset += Cartesian3_default.packedLength; + Ellipsoid_default.unpack(packedBuffer, offset, scratchEllipsoid); + offset += Ellipsoid_default.packedLength; + Rectangle_default.unpack(packedBuffer, offset, scratchRectangle); +} +function packedBatchedIndicesLength(batchedIndices) { + const length = batchedIndices.length; + let count = 0; + for (let i = 0; i < length; ++i) { + count += Color_default.packedLength + 3 + batchedIndices[i].batchIds.length; + } + return count; +} +function packBuffer(indexDatatype, boundingVolumes, batchedIndices) { + const numBVs = boundingVolumes.length; + const length = 1 + 1 + numBVs * OrientedBoundingBox_default.packedLength + 1 + packedBatchedIndicesLength(batchedIndices); + const packedBuffer = new Float64Array(length); + let offset = 0; + packedBuffer[offset++] = indexDatatype; + packedBuffer[offset++] = numBVs; + for (let i = 0; i < numBVs; ++i) { + OrientedBoundingBox_default.pack(boundingVolumes[i], packedBuffer, offset); + offset += OrientedBoundingBox_default.packedLength; + } + const indicesLength = batchedIndices.length; + packedBuffer[offset++] = indicesLength; + for (let j = 0; j < indicesLength; ++j) { + const batchedIndex = batchedIndices[j]; + Color_default.pack(batchedIndex.color, packedBuffer, offset); + offset += Color_default.packedLength; + packedBuffer[offset++] = batchedIndex.offset; + packedBuffer[offset++] = batchedIndex.count; + const batchIds = batchedIndex.batchIds; + const batchIdsLength = batchIds.length; + packedBuffer[offset++] = batchIdsLength; + for (let k = 0; k < batchIdsLength; ++k) { + packedBuffer[offset++] = batchIds[k]; + } + } + return packedBuffer; +} +var maxShort = 32767; +var scratchEncodedPosition = new Cartesian3_default(); +var scratchNormal = new Cartesian3_default(); +var scratchScaledNormal = new Cartesian3_default(); +var scratchMinHeightPosition = new Cartesian3_default(); +var scratchMaxHeightPosition = new Cartesian3_default(); +var scratchBVCartographic = new Cartographic_default(); +var scratchBVRectangle = new Rectangle_default(); +function createVectorTilePolygons(parameters, transferableObjects) { + unpackBuffer(parameters.packedBuffer); + let indices; + const indexBytesPerElement = scratchScalars.indexBytesPerElement; + if (indexBytesPerElement === 2) { + indices = new Uint16Array(parameters.indices); + } else { + indices = new Uint32Array(parameters.indices); + } + const positions = new Uint16Array(parameters.positions); + const counts = new Uint32Array(parameters.counts); + const indexCounts = new Uint32Array(parameters.indexCounts); + const batchIds = new Uint32Array(parameters.batchIds); + const batchTableColors = new Uint32Array(parameters.batchTableColors); + const boundingVolumes = new Array(counts.length); + const center = scratchCenter; + const ellipsoid = scratchEllipsoid; + let rectangle = scratchRectangle; + const minHeight = scratchScalars.min; + const maxHeight = scratchScalars.max; + let minimumHeights = parameters.minimumHeights; + let maximumHeights = parameters.maximumHeights; + if (defined_default(minimumHeights) && defined_default(maximumHeights)) { + minimumHeights = new Float32Array(minimumHeights); + maximumHeights = new Float32Array(maximumHeights); + } + let i; + let j; + let rgba; + const positionsLength = positions.length / 2; + const uBuffer = positions.subarray(0, positionsLength); + const vBuffer = positions.subarray(positionsLength, 2 * positionsLength); + AttributeCompression_default.zigZagDeltaDecode(uBuffer, vBuffer); + const decodedPositions = new Float64Array(positionsLength * 3); + for (i = 0; i < positionsLength; ++i) { + const u = uBuffer[i]; + const v = vBuffer[i]; + const x = Math_default.lerp(rectangle.west, rectangle.east, u / maxShort); + const y = Math_default.lerp(rectangle.south, rectangle.north, v / maxShort); + const cart = Cartographic_default.fromRadians(x, y, 0, scratchBVCartographic); + const decodedPosition = ellipsoid.cartographicToCartesian( + cart, + scratchEncodedPosition + ); + Cartesian3_default.pack(decodedPosition, decodedPositions, i * 3); + } + const countsLength = counts.length; + const offsets = new Array(countsLength); + const indexOffsets = new Array(countsLength); + let currentOffset = 0; + let currentIndexOffset = 0; + for (i = 0; i < countsLength; ++i) { + offsets[i] = currentOffset; + indexOffsets[i] = currentIndexOffset; + currentOffset += counts[i]; + currentIndexOffset += indexCounts[i]; + } + const batchedPositions = new Float32Array(positionsLength * 3 * 2); + const batchedIds = new Uint16Array(positionsLength * 2); + const batchedIndexOffsets = new Uint32Array(indexOffsets.length); + const batchedIndexCounts = new Uint32Array(indexCounts.length); + let batchedIndices = []; + const colorToBuffers = {}; + for (i = 0; i < countsLength; ++i) { + rgba = batchTableColors[i]; + if (!defined_default(colorToBuffers[rgba])) { + colorToBuffers[rgba] = { + positionLength: counts[i], + indexLength: indexCounts[i], + offset: 0, + indexOffset: 0, + batchIds: [i] + }; + } else { + colorToBuffers[rgba].positionLength += counts[i]; + colorToBuffers[rgba].indexLength += indexCounts[i]; + colorToBuffers[rgba].batchIds.push(i); + } + } + let buffer; + let byColorPositionOffset = 0; + let byColorIndexOffset = 0; + for (rgba in colorToBuffers) { + if (colorToBuffers.hasOwnProperty(rgba)) { + buffer = colorToBuffers[rgba]; + buffer.offset = byColorPositionOffset; + buffer.indexOffset = byColorIndexOffset; + const positionLength = buffer.positionLength * 2; + const indexLength = buffer.indexLength * 2 + buffer.positionLength * 6; + byColorPositionOffset += positionLength; + byColorIndexOffset += indexLength; + buffer.indexLength = indexLength; + } + } + const batchedDrawCalls = []; + for (rgba in colorToBuffers) { + if (colorToBuffers.hasOwnProperty(rgba)) { + buffer = colorToBuffers[rgba]; + batchedDrawCalls.push({ + color: Color_default.fromRgba(parseInt(rgba)), + offset: buffer.indexOffset, + count: buffer.indexLength, + batchIds: buffer.batchIds + }); + } + } + for (i = 0; i < countsLength; ++i) { + rgba = batchTableColors[i]; + buffer = colorToBuffers[rgba]; + const positionOffset = buffer.offset; + let positionIndex = positionOffset * 3; + let batchIdIndex = positionOffset; + const polygonOffset = offsets[i]; + const polygonCount = counts[i]; + const batchId = batchIds[i]; + let polygonMinimumHeight = minHeight; + let polygonMaximumHeight = maxHeight; + if (defined_default(minimumHeights) && defined_default(maximumHeights)) { + polygonMinimumHeight = minimumHeights[i]; + polygonMaximumHeight = maximumHeights[i]; + } + let minLat = Number.POSITIVE_INFINITY; + let maxLat = Number.NEGATIVE_INFINITY; + let minLon = Number.POSITIVE_INFINITY; + let maxLon = Number.NEGATIVE_INFINITY; + for (j = 0; j < polygonCount; ++j) { + const position = Cartesian3_default.unpack( + decodedPositions, + polygonOffset * 3 + j * 3, + scratchEncodedPosition + ); + ellipsoid.scaleToGeodeticSurface(position, position); + const carto = ellipsoid.cartesianToCartographic( + position, + scratchBVCartographic + ); + const lat = carto.latitude; + const lon = carto.longitude; + minLat = Math.min(lat, minLat); + maxLat = Math.max(lat, maxLat); + minLon = Math.min(lon, minLon); + maxLon = Math.max(lon, maxLon); + const normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal); + let scaledNormal = Cartesian3_default.multiplyByScalar( + normal, + polygonMinimumHeight, + scratchScaledNormal + ); + const minHeightPosition = Cartesian3_default.add( + position, + scaledNormal, + scratchMinHeightPosition + ); + scaledNormal = Cartesian3_default.multiplyByScalar( + normal, + polygonMaximumHeight, + scaledNormal + ); + const maxHeightPosition = Cartesian3_default.add( + position, + scaledNormal, + scratchMaxHeightPosition + ); + Cartesian3_default.subtract(maxHeightPosition, center, maxHeightPosition); + Cartesian3_default.subtract(minHeightPosition, center, minHeightPosition); + Cartesian3_default.pack(maxHeightPosition, batchedPositions, positionIndex); + Cartesian3_default.pack(minHeightPosition, batchedPositions, positionIndex + 3); + batchedIds[batchIdIndex] = batchId; + batchedIds[batchIdIndex + 1] = batchId; + positionIndex += 6; + batchIdIndex += 2; + } + rectangle = scratchBVRectangle; + rectangle.west = minLon; + rectangle.east = maxLon; + rectangle.south = minLat; + rectangle.north = maxLat; + boundingVolumes[i] = OrientedBoundingBox_default.fromRectangle( + rectangle, + minHeight, + maxHeight, + ellipsoid + ); + let indicesIndex = buffer.indexOffset; + const indexOffset = indexOffsets[i]; + const indexCount = indexCounts[i]; + batchedIndexOffsets[i] = indicesIndex; + for (j = 0; j < indexCount; j += 3) { + const i0 = indices[indexOffset + j] - polygonOffset; + const i1 = indices[indexOffset + j + 1] - polygonOffset; + const i2 = indices[indexOffset + j + 2] - polygonOffset; + batchedIndices[indicesIndex++] = i0 * 2 + positionOffset; + batchedIndices[indicesIndex++] = i1 * 2 + positionOffset; + batchedIndices[indicesIndex++] = i2 * 2 + positionOffset; + batchedIndices[indicesIndex++] = i2 * 2 + 1 + positionOffset; + batchedIndices[indicesIndex++] = i1 * 2 + 1 + positionOffset; + batchedIndices[indicesIndex++] = i0 * 2 + 1 + positionOffset; + } + for (j = 0; j < polygonCount; ++j) { + const v0 = j; + const v1 = (j + 1) % polygonCount; + batchedIndices[indicesIndex++] = v0 * 2 + 1 + positionOffset; + batchedIndices[indicesIndex++] = v1 * 2 + positionOffset; + batchedIndices[indicesIndex++] = v0 * 2 + positionOffset; + batchedIndices[indicesIndex++] = v0 * 2 + 1 + positionOffset; + batchedIndices[indicesIndex++] = v1 * 2 + 1 + positionOffset; + batchedIndices[indicesIndex++] = v1 * 2 + positionOffset; + } + buffer.offset += polygonCount * 2; + buffer.indexOffset = indicesIndex; + batchedIndexCounts[i] = indicesIndex - batchedIndexOffsets[i]; + } + batchedIndices = IndexDatatype_default.createTypedArray( + batchedPositions.length / 3, + batchedIndices + ); + const batchedIndicesLength = batchedDrawCalls.length; + for (let m = 0; m < batchedIndicesLength; ++m) { + const tempIds = batchedDrawCalls[m].batchIds; + let count = 0; + const tempIdsLength = tempIds.length; + for (let n = 0; n < tempIdsLength; ++n) { + count += batchedIndexCounts[tempIds[n]]; + } + batchedDrawCalls[m].count = count; + } + const indexDatatype = batchedIndices.BYTES_PER_ELEMENT === 2 ? IndexDatatype_default.UNSIGNED_SHORT : IndexDatatype_default.UNSIGNED_INT; + const packedBuffer = packBuffer( + indexDatatype, + boundingVolumes, + batchedDrawCalls + ); + transferableObjects.push( + batchedPositions.buffer, + batchedIndices.buffer, + batchedIndexOffsets.buffer, + batchedIndexCounts.buffer, + batchedIds.buffer, + packedBuffer.buffer + ); + return { + positions: batchedPositions.buffer, + indices: batchedIndices.buffer, + indexOffsets: batchedIndexOffsets.buffer, + indexCounts: batchedIndexCounts.buffer, + batchIds: batchedIds.buffer, + packedBuffer: packedBuffer.buffer + }; +} +var createVectorTilePolygons_default = createTaskProcessorWorker_default(createVectorTilePolygons); +export { + createVectorTilePolygons_default as default +}; diff --git a/public/assets/cesium/Workers/createVectorTilePolylines.js b/public/assets/cesium/Workers/createVectorTilePolylines.js new file mode 100644 index 0000000..b671a5a --- /dev/null +++ b/public/assets/cesium/Workers/createVectorTilePolylines.js @@ -0,0 +1,260 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + Rectangle_default, + combine_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/decodeVectorPolylinePositions.js +var maxShort = 32767; +var scratchBVCartographic = new Cartographic_default(); +var scratchEncodedPosition = new Cartesian3_default(); +function decodeVectorPolylinePositions(positions, rectangle, minimumHeight, maximumHeight, ellipsoid) { + const positionsLength = positions.length / 3; + const uBuffer = positions.subarray(0, positionsLength); + const vBuffer = positions.subarray(positionsLength, 2 * positionsLength); + const heightBuffer = positions.subarray( + 2 * positionsLength, + 3 * positionsLength + ); + AttributeCompression_default.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer); + const decoded = new Float64Array(positions.length); + for (let i = 0; i < positionsLength; ++i) { + const u = uBuffer[i]; + const v = vBuffer[i]; + const h = heightBuffer[i]; + const lon = Math_default.lerp(rectangle.west, rectangle.east, u / maxShort); + const lat = Math_default.lerp(rectangle.south, rectangle.north, v / maxShort); + const alt = Math_default.lerp(minimumHeight, maximumHeight, h / maxShort); + const cartographic = Cartographic_default.fromRadians( + lon, + lat, + alt, + scratchBVCartographic + ); + const decodedPosition = ellipsoid.cartographicToCartesian( + cartographic, + scratchEncodedPosition + ); + Cartesian3_default.pack(decodedPosition, decoded, i * 3); + } + return decoded; +} +var decodeVectorPolylinePositions_default = decodeVectorPolylinePositions; + +// packages/engine/Source/Workers/createVectorTilePolylines.js +var scratchRectangle = new Rectangle_default(); +var scratchEllipsoid = new Ellipsoid_default(); +var scratchCenter = new Cartesian3_default(); +var scratchMinMaxHeights = { + min: void 0, + max: void 0 +}; +function unpackBuffer(packedBuffer) { + packedBuffer = new Float64Array(packedBuffer); + let offset = 0; + scratchMinMaxHeights.min = packedBuffer[offset++]; + scratchMinMaxHeights.max = packedBuffer[offset++]; + Rectangle_default.unpack(packedBuffer, offset, scratchRectangle); + offset += Rectangle_default.packedLength; + Ellipsoid_default.unpack(packedBuffer, offset, scratchEllipsoid); + offset += Ellipsoid_default.packedLength; + Cartesian3_default.unpack(packedBuffer, offset, scratchCenter); +} +function getPositionOffsets(counts) { + const countsLength = counts.length; + const positionOffsets = new Uint32Array(countsLength + 1); + let offset = 0; + for (let i = 0; i < countsLength; ++i) { + positionOffsets[i] = offset; + offset += counts[i]; + } + positionOffsets[countsLength] = offset; + return positionOffsets; +} +var scratchP0 = new Cartesian3_default(); +var scratchP1 = new Cartesian3_default(); +var scratchPrev = new Cartesian3_default(); +var scratchCur = new Cartesian3_default(); +var scratchNext = new Cartesian3_default(); +function createVectorTilePolylines(parameters, transferableObjects) { + const encodedPositions = new Uint16Array(parameters.positions); + const widths = new Uint16Array(parameters.widths); + const counts = new Uint32Array(parameters.counts); + const batchIds = new Uint16Array(parameters.batchIds); + unpackBuffer(parameters.packedBuffer); + const rectangle = scratchRectangle; + const ellipsoid = scratchEllipsoid; + const center = scratchCenter; + const minimumHeight = scratchMinMaxHeights.min; + const maximumHeight = scratchMinMaxHeights.max; + const positions = decodeVectorPolylinePositions_default( + encodedPositions, + rectangle, + minimumHeight, + maximumHeight, + ellipsoid + ); + const positionsLength = positions.length / 3; + const size = positionsLength * 4 - 4; + const curPositions = new Float32Array(size * 3); + const prevPositions = new Float32Array(size * 3); + const nextPositions = new Float32Array(size * 3); + const expandAndWidth = new Float32Array(size * 2); + const vertexBatchIds = new Uint16Array(size); + let positionIndex = 0; + let expandAndWidthIndex = 0; + let batchIdIndex = 0; + let i; + let offset = 0; + let length = counts.length; + for (i = 0; i < length; ++i) { + const count = counts[i]; + const width = widths[i]; + const batchId = batchIds[i]; + for (let j = 0; j < count; ++j) { + let previous; + if (j === 0) { + const p0 = Cartesian3_default.unpack(positions, offset * 3, scratchP0); + const p1 = Cartesian3_default.unpack(positions, (offset + 1) * 3, scratchP1); + previous = Cartesian3_default.subtract(p0, p1, scratchPrev); + Cartesian3_default.add(p0, previous, previous); + } else { + previous = Cartesian3_default.unpack( + positions, + (offset + j - 1) * 3, + scratchPrev + ); + } + const current = Cartesian3_default.unpack( + positions, + (offset + j) * 3, + scratchCur + ); + let next; + if (j === count - 1) { + const p2 = Cartesian3_default.unpack( + positions, + (offset + count - 1) * 3, + scratchP0 + ); + const p3 = Cartesian3_default.unpack( + positions, + (offset + count - 2) * 3, + scratchP1 + ); + next = Cartesian3_default.subtract(p2, p3, scratchNext); + Cartesian3_default.add(p2, next, next); + } else { + next = Cartesian3_default.unpack(positions, (offset + j + 1) * 3, scratchNext); + } + Cartesian3_default.subtract(previous, center, previous); + Cartesian3_default.subtract(current, center, current); + Cartesian3_default.subtract(next, center, next); + const startK = j === 0 ? 2 : 0; + const endK = j === count - 1 ? 2 : 4; + for (let k = startK; k < endK; ++k) { + Cartesian3_default.pack(current, curPositions, positionIndex); + Cartesian3_default.pack(previous, prevPositions, positionIndex); + Cartesian3_default.pack(next, nextPositions, positionIndex); + positionIndex += 3; + const direction = k - 2 < 0 ? -1 : 1; + expandAndWidth[expandAndWidthIndex++] = 2 * (k % 2) - 1; + expandAndWidth[expandAndWidthIndex++] = direction * width; + vertexBatchIds[batchIdIndex++] = batchId; + } + } + offset += count; + } + const indices = IndexDatatype_default.createTypedArray(size, positionsLength * 6 - 6); + let index = 0; + let indicesIndex = 0; + length = positionsLength - 1; + for (i = 0; i < length; ++i) { + indices[indicesIndex++] = index; + indices[indicesIndex++] = index + 2; + indices[indicesIndex++] = index + 1; + indices[indicesIndex++] = index + 1; + indices[indicesIndex++] = index + 2; + indices[indicesIndex++] = index + 3; + index += 4; + } + transferableObjects.push( + curPositions.buffer, + prevPositions.buffer, + nextPositions.buffer + ); + transferableObjects.push( + expandAndWidth.buffer, + vertexBatchIds.buffer, + indices.buffer + ); + let results = { + indexDatatype: indices.BYTES_PER_ELEMENT === 2 ? IndexDatatype_default.UNSIGNED_SHORT : IndexDatatype_default.UNSIGNED_INT, + currentPositions: curPositions.buffer, + previousPositions: prevPositions.buffer, + nextPositions: nextPositions.buffer, + expandAndWidth: expandAndWidth.buffer, + batchIds: vertexBatchIds.buffer, + indices: indices.buffer + }; + if (parameters.keepDecodedPositions) { + const positionOffsets = getPositionOffsets(counts); + transferableObjects.push(positions.buffer, positionOffsets.buffer); + results = combine_default(results, { + decodedPositions: positions.buffer, + decodedPositionOffsets: positionOffsets.buffer + }); + } + return results; +} +var createVectorTilePolylines_default = createTaskProcessorWorker_default(createVectorTilePolylines); +export { + createVectorTilePolylines_default as default +}; diff --git a/public/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js b/public/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js new file mode 100644 index 0000000..bb73669 --- /dev/null +++ b/public/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js @@ -0,0 +1,567 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidalOccluder_default, + TerrainEncoding_default +} from "./chunk-56EDBCGT.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import { + OrientedBoundingBox_default +} from "./chunk-2PTKXHJB.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-YK3QIKY7.js"; +import { + AxisAlignedBoundingBox_default +} from "./chunk-NDDI2LWR.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default, + Rectangle_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +var sizeOfUint16 = Uint16Array.BYTES_PER_ELEMENT; +var sizeOfInt32 = Int32Array.BYTES_PER_ELEMENT; +var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; +var sizeOfFloat = Float32Array.BYTES_PER_ELEMENT; +var sizeOfDouble = Float64Array.BYTES_PER_ELEMENT; +function indexOfEpsilon(arr, elem, elemType) { + elemType = defaultValue_default(elemType, Math_default); + const count = arr.length; + for (let i = 0; i < count; ++i) { + if (elemType.equalsEpsilon(arr[i], elem, Math_default.EPSILON12)) { + return i; + } + } + return -1; +} +function createVerticesFromGoogleEarthEnterpriseBuffer(parameters, transferableObjects) { + parameters.ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid); + parameters.rectangle = Rectangle_default.clone(parameters.rectangle); + const statistics = processBuffer( + parameters.buffer, + parameters.relativeToCenter, + parameters.ellipsoid, + parameters.rectangle, + parameters.nativeRectangle, + parameters.exaggeration, + parameters.exaggerationRelativeHeight, + parameters.skirtHeight, + parameters.includeWebMercatorT, + parameters.negativeAltitudeExponentBias, + parameters.negativeElevationThreshold + ); + const vertices = statistics.vertices; + transferableObjects.push(vertices.buffer); + const indices = statistics.indices; + transferableObjects.push(indices.buffer); + return { + vertices: vertices.buffer, + indices: indices.buffer, + numberOfAttributes: statistics.encoding.stride, + minimumHeight: statistics.minimumHeight, + maximumHeight: statistics.maximumHeight, + boundingSphere3D: statistics.boundingSphere3D, + orientedBoundingBox: statistics.orientedBoundingBox, + occludeePointInScaledSpace: statistics.occludeePointInScaledSpace, + encoding: statistics.encoding, + vertexCountWithoutSkirts: statistics.vertexCountWithoutSkirts, + indexCountWithoutSkirts: statistics.indexCountWithoutSkirts, + westIndicesSouthToNorth: statistics.westIndicesSouthToNorth, + southIndicesEastToWest: statistics.southIndicesEastToWest, + eastIndicesNorthToSouth: statistics.eastIndicesNorthToSouth, + northIndicesWestToEast: statistics.northIndicesWestToEast + }; +} +var scratchCartographic = new Cartographic_default(); +var scratchCartesian = new Cartesian3_default(); +var minimumScratch = new Cartesian3_default(); +var maximumScratch = new Cartesian3_default(); +var matrix4Scratch = new Matrix4_default(); +function processBuffer(buffer, relativeToCenter, ellipsoid, rectangle, nativeRectangle, exaggeration, exaggerationRelativeHeight, skirtHeight, includeWebMercatorT, negativeAltitudeExponentBias, negativeElevationThreshold) { + let geographicWest; + let geographicSouth; + let geographicEast; + let geographicNorth; + let rectangleWidth, rectangleHeight; + if (!defined_default(rectangle)) { + geographicWest = Math_default.toRadians(nativeRectangle.west); + geographicSouth = Math_default.toRadians(nativeRectangle.south); + geographicEast = Math_default.toRadians(nativeRectangle.east); + geographicNorth = Math_default.toRadians(nativeRectangle.north); + rectangleWidth = Math_default.toRadians(rectangle.width); + rectangleHeight = Math_default.toRadians(rectangle.height); + } else { + geographicWest = rectangle.west; + geographicSouth = rectangle.south; + geographicEast = rectangle.east; + geographicNorth = rectangle.north; + rectangleWidth = rectangle.width; + rectangleHeight = rectangle.height; + } + const quadBorderLatitudes = [geographicSouth, geographicNorth]; + const quadBorderLongitudes = [geographicWest, geographicEast]; + const fromENU = Transforms_default.eastNorthUpToFixedFrame( + relativeToCenter, + ellipsoid + ); + const toENU = Matrix4_default.inverseTransformation(fromENU, matrix4Scratch); + let southMercatorY; + let oneOverMercatorHeight; + if (includeWebMercatorT) { + southMercatorY = WebMercatorProjection_default.geodeticLatitudeToMercatorAngle( + geographicSouth + ); + oneOverMercatorHeight = 1 / (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY); + } + const hasExaggeration = exaggeration !== 1; + const includeGeodeticSurfaceNormals = hasExaggeration; + const dv = new DataView(buffer); + let minHeight = Number.POSITIVE_INFINITY; + let maxHeight = Number.NEGATIVE_INFINITY; + const minimum = minimumScratch; + minimum.x = Number.POSITIVE_INFINITY; + minimum.y = Number.POSITIVE_INFINITY; + minimum.z = Number.POSITIVE_INFINITY; + const maximum = maximumScratch; + maximum.x = Number.NEGATIVE_INFINITY; + maximum.y = Number.NEGATIVE_INFINITY; + maximum.z = Number.NEGATIVE_INFINITY; + let offset = 0; + let size = 0; + let indicesSize = 0; + let quadSize; + let quad; + for (quad = 0; quad < 4; ++quad) { + let o = offset; + quadSize = dv.getUint32(o, true); + o += sizeOfUint32; + const x = Math_default.toRadians(dv.getFloat64(o, true) * 180); + o += sizeOfDouble; + if (indexOfEpsilon(quadBorderLongitudes, x) === -1) { + quadBorderLongitudes.push(x); + } + const y = Math_default.toRadians(dv.getFloat64(o, true) * 180); + o += sizeOfDouble; + if (indexOfEpsilon(quadBorderLatitudes, y) === -1) { + quadBorderLatitudes.push(y); + } + o += 2 * sizeOfDouble; + let c = dv.getInt32(o, true); + o += sizeOfInt32; + size += c; + c = dv.getInt32(o, true); + indicesSize += c * 3; + offset += quadSize + sizeOfUint32; + } + const quadBorderPoints = []; + const quadBorderIndices = []; + const positions = new Array(size); + const uvs = new Array(size); + const heights = new Array(size); + const webMercatorTs = includeWebMercatorT ? new Array(size) : []; + const geodeticSurfaceNormals = includeGeodeticSurfaceNormals ? new Array(size) : []; + const indices = new Array(indicesSize); + const westBorder = []; + const southBorder = []; + const eastBorder = []; + const northBorder = []; + let pointOffset = 0; + let indicesOffset = 0; + offset = 0; + for (quad = 0; quad < 4; ++quad) { + quadSize = dv.getUint32(offset, true); + offset += sizeOfUint32; + const startQuad = offset; + const originX = Math_default.toRadians(dv.getFloat64(offset, true) * 180); + offset += sizeOfDouble; + const originY = Math_default.toRadians(dv.getFloat64(offset, true) * 180); + offset += sizeOfDouble; + const stepX = Math_default.toRadians(dv.getFloat64(offset, true) * 180); + const halfStepX = stepX * 0.5; + offset += sizeOfDouble; + const stepY = Math_default.toRadians(dv.getFloat64(offset, true) * 180); + const halfStepY = stepY * 0.5; + offset += sizeOfDouble; + const numPoints = dv.getInt32(offset, true); + offset += sizeOfInt32; + const numFaces = dv.getInt32(offset, true); + offset += sizeOfInt32; + offset += sizeOfInt32; + const indicesMapping = new Array(numPoints); + for (let i = 0; i < numPoints; ++i) { + const longitude = originX + dv.getUint8(offset++) * stepX; + scratchCartographic.longitude = longitude; + const latitude = originY + dv.getUint8(offset++) * stepY; + scratchCartographic.latitude = latitude; + let height = dv.getFloat32(offset, true); + offset += sizeOfFloat; + if (height !== 0 && height < negativeElevationThreshold) { + height *= -Math.pow(2, negativeAltitudeExponentBias); + } + height *= 6371010; + scratchCartographic.height = height; + if (indexOfEpsilon(quadBorderLongitudes, longitude) !== -1 || indexOfEpsilon(quadBorderLatitudes, latitude) !== -1) { + const index = indexOfEpsilon( + quadBorderPoints, + scratchCartographic, + Cartographic_default + ); + if (index === -1) { + quadBorderPoints.push(Cartographic_default.clone(scratchCartographic)); + quadBorderIndices.push(pointOffset); + } else { + indicesMapping[i] = quadBorderIndices[index]; + continue; + } + } + indicesMapping[i] = pointOffset; + if (Math.abs(longitude - geographicWest) < halfStepX) { + westBorder.push({ + index: pointOffset, + cartographic: Cartographic_default.clone(scratchCartographic) + }); + } else if (Math.abs(longitude - geographicEast) < halfStepX) { + eastBorder.push({ + index: pointOffset, + cartographic: Cartographic_default.clone(scratchCartographic) + }); + } else if (Math.abs(latitude - geographicSouth) < halfStepY) { + southBorder.push({ + index: pointOffset, + cartographic: Cartographic_default.clone(scratchCartographic) + }); + } else if (Math.abs(latitude - geographicNorth) < halfStepY) { + northBorder.push({ + index: pointOffset, + cartographic: Cartographic_default.clone(scratchCartographic) + }); + } + minHeight = Math.min(height, minHeight); + maxHeight = Math.max(height, maxHeight); + heights[pointOffset] = height; + const pos = ellipsoid.cartographicToCartesian(scratchCartographic); + positions[pointOffset] = pos; + if (includeWebMercatorT) { + webMercatorTs[pointOffset] = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight; + } + if (includeGeodeticSurfaceNormals) { + const normal = ellipsoid.geodeticSurfaceNormal(pos); + geodeticSurfaceNormals[pointOffset] = normal; + } + Matrix4_default.multiplyByPoint(toENU, pos, scratchCartesian); + Cartesian3_default.minimumByComponent(scratchCartesian, minimum, minimum); + Cartesian3_default.maximumByComponent(scratchCartesian, maximum, maximum); + let u = (longitude - geographicWest) / (geographicEast - geographicWest); + u = Math_default.clamp(u, 0, 1); + let v = (latitude - geographicSouth) / (geographicNorth - geographicSouth); + v = Math_default.clamp(v, 0, 1); + uvs[pointOffset] = new Cartesian2_default(u, v); + ++pointOffset; + } + const facesElementCount = numFaces * 3; + for (let j = 0; j < facesElementCount; ++j, ++indicesOffset) { + indices[indicesOffset] = indicesMapping[dv.getUint16(offset, true)]; + offset += sizeOfUint16; + } + if (quadSize !== offset - startQuad) { + throw new RuntimeError_default("Invalid terrain tile."); + } + } + positions.length = pointOffset; + uvs.length = pointOffset; + heights.length = pointOffset; + if (includeWebMercatorT) { + webMercatorTs.length = pointOffset; + } + if (includeGeodeticSurfaceNormals) { + geodeticSurfaceNormals.length = pointOffset; + } + const vertexCountWithoutSkirts = pointOffset; + const indexCountWithoutSkirts = indicesOffset; + const skirtOptions = { + hMin: minHeight, + lastBorderPoint: void 0, + skirtHeight, + toENU, + ellipsoid, + minimum, + maximum + }; + westBorder.sort(function(a, b) { + return b.cartographic.latitude - a.cartographic.latitude; + }); + southBorder.sort(function(a, b) { + return a.cartographic.longitude - b.cartographic.longitude; + }); + eastBorder.sort(function(a, b) { + return a.cartographic.latitude - b.cartographic.latitude; + }); + northBorder.sort(function(a, b) { + return b.cartographic.longitude - a.cartographic.longitude; + }); + const percentage = 1e-5; + addSkirt( + positions, + heights, + uvs, + webMercatorTs, + geodeticSurfaceNormals, + indices, + skirtOptions, + westBorder, + -percentage * rectangleWidth, + true, + -percentage * rectangleHeight + ); + addSkirt( + positions, + heights, + uvs, + webMercatorTs, + geodeticSurfaceNormals, + indices, + skirtOptions, + southBorder, + -percentage * rectangleHeight, + false + ); + addSkirt( + positions, + heights, + uvs, + webMercatorTs, + geodeticSurfaceNormals, + indices, + skirtOptions, + eastBorder, + percentage * rectangleWidth, + true, + percentage * rectangleHeight + ); + addSkirt( + positions, + heights, + uvs, + webMercatorTs, + geodeticSurfaceNormals, + indices, + skirtOptions, + northBorder, + percentage * rectangleHeight, + false + ); + if (westBorder.length > 0 && northBorder.length > 0) { + const firstBorderIndex = westBorder[0].index; + const firstSkirtIndex = vertexCountWithoutSkirts; + const lastBorderIndex = northBorder[northBorder.length - 1].index; + const lastSkirtIndex = positions.length - 1; + indices.push( + lastBorderIndex, + lastSkirtIndex, + firstSkirtIndex, + firstSkirtIndex, + firstBorderIndex, + lastBorderIndex + ); + } + size = positions.length; + const boundingSphere3D = BoundingSphere_default.fromPoints(positions); + let orientedBoundingBox; + if (defined_default(rectangle)) { + orientedBoundingBox = OrientedBoundingBox_default.fromRectangle( + rectangle, + minHeight, + maxHeight, + ellipsoid + ); + } + const occluder = new EllipsoidalOccluder_default(ellipsoid); + const occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid( + relativeToCenter, + positions, + minHeight + ); + const aaBox = new AxisAlignedBoundingBox_default(minimum, maximum, relativeToCenter); + const encoding = new TerrainEncoding_default( + relativeToCenter, + aaBox, + skirtOptions.hMin, + maxHeight, + fromENU, + false, + includeWebMercatorT, + includeGeodeticSurfaceNormals, + exaggeration, + exaggerationRelativeHeight + ); + const vertices = new Float32Array(size * encoding.stride); + let bufferIndex = 0; + for (let k = 0; k < size; ++k) { + bufferIndex = encoding.encode( + vertices, + bufferIndex, + positions[k], + uvs[k], + heights[k], + void 0, + webMercatorTs[k], + geodeticSurfaceNormals[k] + ); + } + const westIndicesSouthToNorth = westBorder.map(function(vertex) { + return vertex.index; + }).reverse(); + const southIndicesEastToWest = southBorder.map(function(vertex) { + return vertex.index; + }).reverse(); + const eastIndicesNorthToSouth = eastBorder.map(function(vertex) { + return vertex.index; + }).reverse(); + const northIndicesWestToEast = northBorder.map(function(vertex) { + return vertex.index; + }).reverse(); + southIndicesEastToWest.unshift( + eastIndicesNorthToSouth[eastIndicesNorthToSouth.length - 1] + ); + southIndicesEastToWest.push(westIndicesSouthToNorth[0]); + northIndicesWestToEast.unshift( + westIndicesSouthToNorth[westIndicesSouthToNorth.length - 1] + ); + northIndicesWestToEast.push(eastIndicesNorthToSouth[0]); + return { + vertices, + indices: new Uint16Array(indices), + maximumHeight: maxHeight, + minimumHeight: minHeight, + encoding, + boundingSphere3D, + orientedBoundingBox, + occludeePointInScaledSpace, + vertexCountWithoutSkirts, + indexCountWithoutSkirts, + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast + }; +} +function addSkirt(positions, heights, uvs, webMercatorTs, geodeticSurfaceNormals, indices, skirtOptions, borderPoints, fudgeFactor, eastOrWest, cornerFudge) { + const count = borderPoints.length; + for (let j = 0; j < count; ++j) { + const borderPoint = borderPoints[j]; + const borderCartographic = borderPoint.cartographic; + const borderIndex = borderPoint.index; + const currentIndex = positions.length; + const longitude = borderCartographic.longitude; + let latitude = borderCartographic.latitude; + latitude = Math_default.clamp( + latitude, + -Math_default.PI_OVER_TWO, + Math_default.PI_OVER_TWO + ); + const height = borderCartographic.height - skirtOptions.skirtHeight; + skirtOptions.hMin = Math.min(skirtOptions.hMin, height); + Cartographic_default.fromRadians(longitude, latitude, height, scratchCartographic); + if (eastOrWest) { + scratchCartographic.longitude += fudgeFactor; + } + if (!eastOrWest) { + scratchCartographic.latitude += fudgeFactor; + } else if (j === count - 1) { + scratchCartographic.latitude += cornerFudge; + } else if (j === 0) { + scratchCartographic.latitude -= cornerFudge; + } + const pos = skirtOptions.ellipsoid.cartographicToCartesian( + scratchCartographic + ); + positions.push(pos); + heights.push(height); + uvs.push(Cartesian2_default.clone(uvs[borderIndex])); + if (webMercatorTs.length > 0) { + webMercatorTs.push(webMercatorTs[borderIndex]); + } + if (geodeticSurfaceNormals.length > 0) { + geodeticSurfaceNormals.push(geodeticSurfaceNormals[borderIndex]); + } + Matrix4_default.multiplyByPoint(skirtOptions.toENU, pos, scratchCartesian); + const minimum = skirtOptions.minimum; + const maximum = skirtOptions.maximum; + Cartesian3_default.minimumByComponent(scratchCartesian, minimum, minimum); + Cartesian3_default.maximumByComponent(scratchCartesian, maximum, maximum); + const lastBorderPoint = skirtOptions.lastBorderPoint; + if (defined_default(lastBorderPoint)) { + const lastBorderIndex = lastBorderPoint.index; + indices.push( + lastBorderIndex, + currentIndex - 1, + currentIndex, + currentIndex, + borderIndex, + lastBorderIndex + ); + } + skirtOptions.lastBorderPoint = borderPoint; + } +} +var createVerticesFromGoogleEarthEnterpriseBuffer_default = createTaskProcessorWorker_default( + createVerticesFromGoogleEarthEnterpriseBuffer +); +export { + createVerticesFromGoogleEarthEnterpriseBuffer_default as default +}; diff --git a/public/assets/cesium/Workers/createVerticesFromHeightmap.js b/public/assets/cesium/Workers/createVerticesFromHeightmap.js new file mode 100644 index 0000000..b7211e4 --- /dev/null +++ b/public/assets/cesium/Workers/createVerticesFromHeightmap.js @@ -0,0 +1,2280 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidalOccluder_default, + TerrainEncoding_default +} from "./chunk-56EDBCGT.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import { + OrientedBoundingBox_default +} from "./chunk-2PTKXHJB.js"; +import "./chunk-LJ2JQHJT.js"; +import "./chunk-YK3QIKY7.js"; +import { + AxisAlignedBoundingBox_default +} from "./chunk-NDDI2LWR.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Matrix4_default, + Rectangle_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + __commonJS, + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// node_modules/lerc/LercDecode.js +var require_LercDecode = __commonJS({ + "node_modules/lerc/LercDecode.js"(exports, module) { + /* Copyright 2015-2018 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */ + (function() { + var LercDecode = function() { + var CntZImage = {}; + CntZImage.defaultNoDataValue = -34027999387901484e22; + CntZImage.decode = function(input, options) { + options = options || {}; + var skipMask = options.encodedMaskData || options.encodedMaskData === null; + var parsedData = parse(input, options.inputOffset || 0, skipMask); + var noDataValue = options.noDataValue !== null ? options.noDataValue : CntZImage.defaultNoDataValue; + var uncompressedData = uncompressPixelValues( + parsedData, + options.pixelType || Float32Array, + options.encodedMaskData, + noDataValue, + options.returnMask + ); + var result = { + width: parsedData.width, + height: parsedData.height, + pixelData: uncompressedData.resultPixels, + minValue: uncompressedData.minValue, + maxValue: parsedData.pixels.maxValue, + noDataValue + }; + if (uncompressedData.resultMask) { + result.maskData = uncompressedData.resultMask; + } + if (options.returnEncodedMask && parsedData.mask) { + result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null; + } + if (options.returnFileInfo) { + result.fileInfo = formatFileInfo(parsedData); + if (options.computeUsedBitDepths) { + result.fileInfo.bitDepths = computeUsedBitDepths(parsedData); + } + } + return result; + }; + var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) { + var blockIdx = 0; + var numX = data.pixels.numBlocksX; + var numY = data.pixels.numBlocksY; + var blockWidth = Math.floor(data.width / numX); + var blockHeight = Math.floor(data.height / numY); + var scale = 2 * data.maxZError; + var minValue = Number.MAX_VALUE, currentValue; + maskBitset = maskBitset || (data.mask ? data.mask.bitset : null); + var resultPixels, resultMask; + resultPixels = new TypedArrayClass(data.width * data.height); + if (storeDecodedMask && maskBitset) { + resultMask = new Uint8Array(data.width * data.height); + } + var blockDataBuffer = new Float32Array(blockWidth * blockHeight); + var xx, yy; + for (var y = 0; y <= numY; y++) { + var thisBlockHeight = y !== numY ? blockHeight : data.height % numY; + if (thisBlockHeight === 0) { + continue; + } + for (var x = 0; x <= numX; x++) { + var thisBlockWidth = x !== numX ? blockWidth : data.width % numX; + if (thisBlockWidth === 0) { + continue; + } + var outPtr = y * data.width * blockHeight + x * blockWidth; + var outStride = data.width - thisBlockWidth; + var block = data.pixels.blocks[blockIdx]; + var blockData, blockPtr, constValue; + if (block.encoding < 2) { + if (block.encoding === 0) { + blockData = block.rawData; + } else { + unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue); + blockData = blockDataBuffer; + } + blockPtr = 0; + } else if (block.encoding === 2) { + constValue = 0; + } else { + constValue = block.offset; + } + var maskByte; + if (maskBitset) { + for (yy = 0; yy < thisBlockHeight; yy++) { + if (outPtr & 7) { + maskByte = maskBitset[outPtr >> 3]; + maskByte <<= outPtr & 7; + } + for (xx = 0; xx < thisBlockWidth; xx++) { + if (!(outPtr & 7)) { + maskByte = maskBitset[outPtr >> 3]; + } + if (maskByte & 128) { + if (resultMask) { + resultMask[outPtr] = 1; + } + currentValue = block.encoding < 2 ? blockData[blockPtr++] : constValue; + minValue = minValue > currentValue ? currentValue : minValue; + resultPixels[outPtr++] = currentValue; + } else { + if (resultMask) { + resultMask[outPtr] = 0; + } + resultPixels[outPtr++] = noDataValue; + } + maskByte <<= 1; + } + outPtr += outStride; + } + } else { + if (block.encoding < 2) { + for (yy = 0; yy < thisBlockHeight; yy++) { + for (xx = 0; xx < thisBlockWidth; xx++) { + currentValue = blockData[blockPtr++]; + minValue = minValue > currentValue ? currentValue : minValue; + resultPixels[outPtr++] = currentValue; + } + outPtr += outStride; + } + } else { + minValue = minValue > constValue ? constValue : minValue; + for (yy = 0; yy < thisBlockHeight; yy++) { + for (xx = 0; xx < thisBlockWidth; xx++) { + resultPixels[outPtr++] = constValue; + } + outPtr += outStride; + } + } + } + if (block.encoding === 1 && blockPtr !== block.numValidPixels) { + throw "Block and Mask do not match"; + } + blockIdx++; + } + } + return { + resultPixels, + resultMask, + minValue + }; + }; + var formatFileInfo = function(data) { + return { + "fileIdentifierString": data.fileIdentifierString, + "fileVersion": data.fileVersion, + "imageType": data.imageType, + "height": data.height, + "width": data.width, + "maxZError": data.maxZError, + "eofOffset": data.eofOffset, + "mask": data.mask ? { + "numBlocksX": data.mask.numBlocksX, + "numBlocksY": data.mask.numBlocksY, + "numBytes": data.mask.numBytes, + "maxValue": data.mask.maxValue + } : null, + "pixels": { + "numBlocksX": data.pixels.numBlocksX, + "numBlocksY": data.pixels.numBlocksY, + "numBytes": data.pixels.numBytes, + "maxValue": data.pixels.maxValue, + "noDataValue": data.noDataValue + } + }; + }; + var computeUsedBitDepths = function(data) { + var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY; + var bitDepths = {}; + for (var i = 0; i < numBlocks; i++) { + var block = data.pixels.blocks[i]; + if (block.encoding === 0) { + bitDepths.float32 = true; + } else if (block.encoding === 1) { + bitDepths[block.bitsPerPixel] = true; + } else { + bitDepths[0] = true; + } + } + return Object.keys(bitDepths); + }; + var parse = function(input, fp, skipMask) { + var data = {}; + var fileIdView = new Uint8Array(input, fp, 10); + data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView); + if (data.fileIdentifierString.trim() !== "CntZImage") { + throw "Unexpected file identifier string: " + data.fileIdentifierString; + } + fp += 10; + var view = new DataView(input, fp, 24); + data.fileVersion = view.getInt32(0, true); + data.imageType = view.getInt32(4, true); + data.height = view.getUint32(8, true); + data.width = view.getUint32(12, true); + data.maxZError = view.getFloat64(16, true); + fp += 24; + if (!skipMask) { + view = new DataView(input, fp, 16); + data.mask = {}; + data.mask.numBlocksY = view.getUint32(0, true); + data.mask.numBlocksX = view.getUint32(4, true); + data.mask.numBytes = view.getUint32(8, true); + data.mask.maxValue = view.getFloat32(12, true); + fp += 16; + if (data.mask.numBytes > 0) { + var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8)); + view = new DataView(input, fp, data.mask.numBytes); + var cnt = view.getInt16(0, true); + var ip = 2, op = 0; + do { + if (cnt > 0) { + while (cnt--) { + bitset[op++] = view.getUint8(ip++); + } + } else { + var val = view.getUint8(ip++); + cnt = -cnt; + while (cnt--) { + bitset[op++] = val; + } + } + cnt = view.getInt16(ip, true); + ip += 2; + } while (ip < data.mask.numBytes); + if (cnt !== -32768 || op < bitset.length) { + throw "Unexpected end of mask RLE encoding"; + } + data.mask.bitset = bitset; + fp += data.mask.numBytes; + } else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) { + data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8)); + } + } + view = new DataView(input, fp, 16); + data.pixels = {}; + data.pixels.numBlocksY = view.getUint32(0, true); + data.pixels.numBlocksX = view.getUint32(4, true); + data.pixels.numBytes = view.getUint32(8, true); + data.pixels.maxValue = view.getFloat32(12, true); + fp += 16; + var numBlocksX = data.pixels.numBlocksX; + var numBlocksY = data.pixels.numBlocksY; + var actualNumBlocksX = numBlocksX + (data.width % numBlocksX > 0 ? 1 : 0); + var actualNumBlocksY = numBlocksY + (data.height % numBlocksY > 0 ? 1 : 0); + data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY); + var blockI = 0; + for (var blockY = 0; blockY < actualNumBlocksY; blockY++) { + for (var blockX = 0; blockX < actualNumBlocksX; blockX++) { + var size = 0; + var bytesLeft = input.byteLength - fp; + view = new DataView(input, fp, Math.min(10, bytesLeft)); + var block = {}; + data.pixels.blocks[blockI++] = block; + var headerByte = view.getUint8(0); + size++; + block.encoding = headerByte & 63; + if (block.encoding > 3) { + throw "Invalid block encoding (" + block.encoding + ")"; + } + if (block.encoding === 2) { + fp++; + continue; + } + if (headerByte !== 0 && headerByte !== 2) { + headerByte >>= 6; + block.offsetType = headerByte; + if (headerByte === 2) { + block.offset = view.getInt8(1); + size++; + } else if (headerByte === 1) { + block.offset = view.getInt16(1, true); + size += 2; + } else if (headerByte === 0) { + block.offset = view.getFloat32(1, true); + size += 4; + } else { + throw "Invalid block offset type"; + } + if (block.encoding === 1) { + headerByte = view.getUint8(size); + size++; + block.bitsPerPixel = headerByte & 63; + headerByte >>= 6; + block.numValidPixelsType = headerByte; + if (headerByte === 2) { + block.numValidPixels = view.getUint8(size); + size++; + } else if (headerByte === 1) { + block.numValidPixels = view.getUint16(size, true); + size += 2; + } else if (headerByte === 0) { + block.numValidPixels = view.getUint32(size, true); + size += 4; + } else { + throw "Invalid valid pixel count type"; + } + } + } + fp += size; + if (block.encoding === 3) { + continue; + } + var arrayBuf, store8; + if (block.encoding === 0) { + var numPixels = (data.pixels.numBytes - 1) / 4; + if (numPixels !== Math.floor(numPixels)) { + throw "uncompressed block has invalid length"; + } + arrayBuf = new ArrayBuffer(numPixels * 4); + store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, fp, numPixels * 4)); + var rawData = new Float32Array(arrayBuf); + block.rawData = rawData; + fp += numPixels * 4; + } else if (block.encoding === 1) { + var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8); + var dataWords = Math.ceil(dataBytes / 4); + arrayBuf = new ArrayBuffer(dataWords * 4); + store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, fp, dataBytes)); + block.stuffedData = new Uint32Array(arrayBuf); + fp += dataBytes; + } + } + } + data.eofOffset = fp; + return data; + }; + var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o; + var bitsLeft = 0; + var n, buffer; + var nmax = Math.ceil((maxValue - offset) / scale); + var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); + src[src.length - 1] <<= 8 * numInvalidTailBytes; + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitsLeft - bitsPerPixel & bitMask; + bitsLeft -= bitsPerPixel; + } else { + var missingBits = bitsPerPixel - bitsLeft; + n = (buffer & bitMask) << missingBits & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n += buffer >>> bitsLeft; + } + dest[o] = n < nmax ? offset + n * scale : maxValue; + } + return dest; + }; + return CntZImage; + }(); + var Lerc2Decode = function() { + "use strict"; + var BitStuffer = { + //methods ending with 2 are for the new byte order used by Lerc2.3 and above. + //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons. + unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o; + var bitsLeft = 0; + var n, buffer, missingBits, nmax; + var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); + src[src.length - 1] <<= 8 * numInvalidTailBytes; + if (lutArr) { + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitsLeft - bitsPerPixel & bitMask; + bitsLeft -= bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = (buffer & bitMask) << missingBits & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n += buffer >>> bitsLeft; + } + dest[o] = lutArr[n]; + } + } else { + nmax = Math.ceil((maxValue - offset) / scale); + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitsLeft - bitsPerPixel & bitMask; + bitsLeft -= bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = (buffer & bitMask) << missingBits & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n += buffer >>> bitsLeft; + } + dest[o] = n < nmax ? offset + n * scale : maxValue; + } + } + }, + unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0; + var buffer; + var dest = []; + var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); + src[src.length - 1] <<= 8 * numInvalidTailBytes; + var nmax = Math.ceil((maxValue - offset) / scale); + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitsLeft - bitsPerPixel & bitMask; + bitsLeft -= bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = (buffer & bitMask) << missingBits & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n += buffer >>> bitsLeft; + } + dest[o] = n < nmax ? offset + n * scale : maxValue; + } + dest.unshift(offset); + return dest; + }, + unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o; + var bitsLeft = 0, bitPos = 0; + var n, buffer, missingBits; + if (lutArr) { + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + bitPos = 0; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitPos & bitMask; + bitsLeft -= bitsPerPixel; + bitPos += bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = buffer >>> bitPos & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; + bitPos = missingBits; + } + dest[o] = lutArr[n]; + } + } else { + var nmax = Math.ceil((maxValue - offset) / scale); + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + bitPos = 0; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitPos & bitMask; + bitsLeft -= bitsPerPixel; + bitPos += bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = buffer >>> bitPos & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; + bitPos = missingBits; + } + dest[o] = n < nmax ? offset + n * scale : maxValue; + } + } + return dest; + }, + unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0; + var buffer; + var dest = []; + var nmax = Math.ceil((maxValue - offset) / scale); + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + bitPos = 0; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitPos & bitMask; + bitsLeft -= bitsPerPixel; + bitPos += bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = buffer >>> bitPos & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; + bitPos = missingBits; + } + dest[o] = n < nmax ? offset + n * scale : maxValue; + } + dest.unshift(offset); + return dest; + }, + originalUnstuff: function(src, dest, bitsPerPixel, numPixels) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o; + var bitsLeft = 0; + var n, buffer, missingBits; + var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); + src[src.length - 1] <<= 8 * numInvalidTailBytes; + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitsLeft - bitsPerPixel & bitMask; + bitsLeft -= bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = (buffer & bitMask) << missingBits & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n += buffer >>> bitsLeft; + } + dest[o] = n; + } + return dest; + }, + originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) { + var bitMask = (1 << bitsPerPixel) - 1; + var i = 0, o; + var bitsLeft = 0, bitPos = 0; + var n, buffer, missingBits; + for (o = 0; o < numPixels; o++) { + if (bitsLeft === 0) { + buffer = src[i++]; + bitsLeft = 32; + bitPos = 0; + } + if (bitsLeft >= bitsPerPixel) { + n = buffer >>> bitPos & bitMask; + bitsLeft -= bitsPerPixel; + bitPos += bitsPerPixel; + } else { + missingBits = bitsPerPixel - bitsLeft; + n = buffer >>> bitPos & bitMask; + buffer = src[i++]; + bitsLeft = 32 - missingBits; + n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; + bitPos = missingBits; + } + dest[o] = n; + } + return dest; + } + }; + var Lerc2Helpers = { + HUFFMAN_LUT_BITS_MAX: 12, + //use 2^12 lut, treat it like constant + computeChecksumFletcher32: function(input) { + var sum1 = 65535, sum2 = 65535; + var len = input.length; + var words = Math.floor(len / 2); + var i = 0; + while (words) { + var tlen = words >= 359 ? 359 : words; + words -= tlen; + do { + sum1 += input[i++] << 8; + sum2 += sum1 += input[i++]; + } while (--tlen); + sum1 = (sum1 & 65535) + (sum1 >>> 16); + sum2 = (sum2 & 65535) + (sum2 >>> 16); + } + if (len & 1) { + sum2 += sum1 += input[i] << 8; + } + sum1 = (sum1 & 65535) + (sum1 >>> 16); + sum2 = (sum2 & 65535) + (sum2 >>> 16); + return (sum2 << 16 | sum1) >>> 0; + }, + readHeaderInfo: function(input, data) { + var ptr = data.ptr; + var fileIdView = new Uint8Array(input, ptr, 6); + var headerInfo = {}; + headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView); + if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) { + throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString; + } + ptr += 6; + var view = new DataView(input, ptr, 8); + var fileVersion = view.getInt32(0, true); + headerInfo.fileVersion = fileVersion; + ptr += 4; + if (fileVersion >= 3) { + headerInfo.checksum = view.getUint32(4, true); + ptr += 4; + } + view = new DataView(input, ptr, 12); + headerInfo.height = view.getUint32(0, true); + headerInfo.width = view.getUint32(4, true); + ptr += 8; + if (fileVersion >= 4) { + headerInfo.numDims = view.getUint32(8, true); + ptr += 4; + } else { + headerInfo.numDims = 1; + } + view = new DataView(input, ptr, 40); + headerInfo.numValidPixel = view.getUint32(0, true); + headerInfo.microBlockSize = view.getInt32(4, true); + headerInfo.blobSize = view.getInt32(8, true); + headerInfo.imageType = view.getInt32(12, true); + headerInfo.maxZError = view.getFloat64(16, true); + headerInfo.zMin = view.getFloat64(24, true); + headerInfo.zMax = view.getFloat64(32, true); + ptr += 40; + data.headerInfo = headerInfo; + data.ptr = ptr; + var checksum, keyLength; + if (fileVersion >= 3) { + keyLength = fileVersion >= 4 ? 52 : 48; + checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14)); + if (checksum !== headerInfo.checksum) { + throw "Checksum failed."; + } + } + return true; + }, + checkMinMaxRanges: function(input, data) { + var headerInfo = data.headerInfo; + var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType); + var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType); + var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes); + var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes); + data.ptr += 2 * rangeBytes; + var i, equal = true; + for (i = 0; i < headerInfo.numDims; i++) { + if (minValues[i] !== maxValues[i]) { + equal = false; + break; + } + } + headerInfo.minValues = minValues; + headerInfo.maxValues = maxValues; + return equal; + }, + readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) { + var rawData; + if (OutPixelTypeArray === Uint8Array) { + rawData = new Uint8Array(input, ptr, numBytes); + } else { + var arrayBuf = new ArrayBuffer(numBytes); + var store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, ptr, numBytes)); + rawData = new OutPixelTypeArray(arrayBuf); + } + return rawData; + }, + readMask: function(input, data) { + var ptr = data.ptr; + var headerInfo = data.headerInfo; + var numPixels = headerInfo.width * headerInfo.height; + var numValidPixel = headerInfo.numValidPixel; + var view = new DataView(input, ptr, 4); + var mask = {}; + mask.numBytes = view.getUint32(0, true); + ptr += 4; + if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) { + throw "invalid mask"; + } + var bitset, resultMask; + if (numValidPixel === 0) { + bitset = new Uint8Array(Math.ceil(numPixels / 8)); + mask.bitset = bitset; + resultMask = new Uint8Array(numPixels); + data.pixels.resultMask = resultMask; + ptr += mask.numBytes; + } else if (mask.numBytes > 0) { + bitset = new Uint8Array(Math.ceil(numPixels / 8)); + view = new DataView(input, ptr, mask.numBytes); + var cnt = view.getInt16(0, true); + var ip = 2, op = 0, val = 0; + do { + if (cnt > 0) { + while (cnt--) { + bitset[op++] = view.getUint8(ip++); + } + } else { + val = view.getUint8(ip++); + cnt = -cnt; + while (cnt--) { + bitset[op++] = val; + } + } + cnt = view.getInt16(ip, true); + ip += 2; + } while (ip < mask.numBytes); + if (cnt !== -32768 || op < bitset.length) { + throw "Unexpected end of mask RLE encoding"; + } + resultMask = new Uint8Array(numPixels); + var mb = 0, k = 0; + for (k = 0; k < numPixels; k++) { + if (k & 7) { + mb = bitset[k >> 3]; + mb <<= k & 7; + } else { + mb = bitset[k >> 3]; + } + if (mb & 128) { + resultMask[k] = 1; + } + } + data.pixels.resultMask = resultMask; + mask.bitset = bitset; + ptr += mask.numBytes; + } + data.ptr = ptr; + data.mask = mask; + return true; + }, + readDataOneSweep: function(input, data, OutPixelTypeArray) { + var ptr = data.ptr; + var headerInfo = data.headerInfo; + var numDims = headerInfo.numDims; + var numPixels = headerInfo.width * headerInfo.height; + var imageType = headerInfo.imageType; + var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims; + var rawData; + var mask = data.pixels.resultMask; + if (OutPixelTypeArray === Uint8Array) { + rawData = new Uint8Array(input, ptr, numBytes); + } else { + var arrayBuf = new ArrayBuffer(numBytes); + var store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, ptr, numBytes)); + rawData = new OutPixelTypeArray(arrayBuf); + } + if (rawData.length === numPixels * numDims) { + data.pixels.resultPixels = rawData; + } else { + data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims); + var z = 0, k = 0, i = 0, nStart = 0; + if (numDims > 1) { + for (i = 0; i < numDims; i++) { + nStart = i * numPixels; + for (k = 0; k < numPixels; k++) { + if (mask[k]) { + data.pixels.resultPixels[nStart + k] = rawData[z++]; + } + } + } + } else { + for (k = 0; k < numPixels; k++) { + if (mask[k]) { + data.pixels.resultPixels[k] = rawData[z++]; + } + } + } + } + ptr += numBytes; + data.ptr = ptr; + return true; + }, + readHuffmanTree: function(input, data) { + var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; + var view = new DataView(input, data.ptr, 16); + data.ptr += 16; + var version = view.getInt32(0, true); + if (version < 2) { + throw "unsupported Huffman version"; + } + var size = view.getInt32(4, true); + var i0 = view.getInt32(8, true); + var i1 = view.getInt32(12, true); + if (i0 >= i1) { + return false; + } + var blockDataBuffer = new Uint32Array(i1 - i0); + Lerc2Helpers.decodeBits(input, data, blockDataBuffer); + var codeTable = []; + var i, j, k, len; + for (i = i0; i < i1; i++) { + j = i - (i < size ? 0 : size); + codeTable[j] = { first: blockDataBuffer[i - i0], second: null }; + } + var dataBytes = input.byteLength - data.ptr; + var dataWords = Math.ceil(dataBytes / 4); + var arrayBuf = new ArrayBuffer(dataWords * 4); + var store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, data.ptr, dataBytes)); + var stuffedData = new Uint32Array(arrayBuf); + var bitPos = 0, word, srcPtr = 0; + word = stuffedData[0]; + for (i = i0; i < i1; i++) { + j = i - (i < size ? 0 : size); + len = codeTable[j].first; + if (len > 0) { + codeTable[j].second = word << bitPos >>> 32 - len; + if (32 - bitPos >= len) { + bitPos += len; + if (bitPos === 32) { + bitPos = 0; + srcPtr++; + word = stuffedData[srcPtr]; + } + } else { + bitPos += len - 32; + srcPtr++; + word = stuffedData[srcPtr]; + codeTable[j].second |= word >>> 32 - bitPos; + } + } + } + var numBitsLUT = 0, numBitsLUTQick = 0; + var tree = new TreeNode(); + for (i = 0; i < codeTable.length; i++) { + if (codeTable[i] !== void 0) { + numBitsLUT = Math.max(numBitsLUT, codeTable[i].first); + } + } + if (numBitsLUT >= BITS_MAX) { + numBitsLUTQick = BITS_MAX; + } else { + numBitsLUTQick = numBitsLUT; + } + if (numBitsLUT >= 30) { + console.log("WARning, large NUM LUT BITS IS " + numBitsLUT); + } + var decodeLut = [], entry, code, numEntries, jj, currentBit, node; + for (i = i0; i < i1; i++) { + j = i - (i < size ? 0 : size); + len = codeTable[j].first; + if (len > 0) { + entry = [len, j]; + if (len <= numBitsLUTQick) { + code = codeTable[j].second << numBitsLUTQick - len; + numEntries = 1 << numBitsLUTQick - len; + for (k = 0; k < numEntries; k++) { + decodeLut[code | k] = entry; + } + } else { + code = codeTable[j].second; + node = tree; + for (jj = len - 1; jj >= 0; jj--) { + currentBit = code >>> jj & 1; + if (currentBit) { + if (!node.right) { + node.right = new TreeNode(); + } + node = node.right; + } else { + if (!node.left) { + node.left = new TreeNode(); + } + node = node.left; + } + if (jj === 0 && !node.val) { + node.val = entry[1]; + } + } + } + } + } + return { + decodeLut, + numBitsLUTQick, + numBitsLUT, + tree, + stuffedData, + srcPtr, + bitPos + }; + }, + readHuffman: function(input, data, OutPixelTypeArray) { + var headerInfo = data.headerInfo; + var numDims = headerInfo.numDims; + var height = data.headerInfo.height; + var width = data.headerInfo.width; + var numPixels = width * height; + var huffmanInfo = this.readHuffmanTree(input, data); + var decodeLut = huffmanInfo.decodeLut; + var tree = huffmanInfo.tree; + var stuffedData = huffmanInfo.stuffedData; + var srcPtr = huffmanInfo.srcPtr; + var bitPos = huffmanInfo.bitPos; + var numBitsLUTQick = huffmanInfo.numBitsLUTQick; + var numBitsLUT = huffmanInfo.numBitsLUT; + var offset = data.headerInfo.imageType === 0 ? 128 : 0; + var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit; + var i, j, k, ii; + var prevVal = 0; + if (bitPos > 0) { + srcPtr++; + bitPos = 0; + } + var word = stuffedData[srcPtr]; + var deltaEncode = data.encodeMode === 1; + var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims); + var resultPixels = resultPixelsAllDim; + var iDim; + for (iDim = 0; iDim < headerInfo.numDims; iDim++) { + if (numDims > 1) { + resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels); + prevVal = 0; + } + if (data.headerInfo.numValidPixel === width * height) { + for (k = 0, i = 0; i < height; i++) { + for (j = 0; j < width; j++, k++) { + val = 0; + valTmp = word << bitPos >>> 32 - numBitsLUTQick; + valTmpQuick = valTmp; + if (32 - bitPos < numBitsLUTQick) { + valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick; + valTmpQuick = valTmp; + } + if (decodeLut[valTmpQuick]) { + val = decodeLut[valTmpQuick][1]; + bitPos += decodeLut[valTmpQuick][0]; + } else { + valTmp = word << bitPos >>> 32 - numBitsLUT; + valTmpQuick = valTmp; + if (32 - bitPos < numBitsLUT) { + valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT; + valTmpQuick = valTmp; + } + node = tree; + for (ii = 0; ii < numBitsLUT; ii++) { + currentBit = valTmp >>> numBitsLUT - ii - 1 & 1; + node = currentBit ? node.right : node.left; + if (!(node.left || node.right)) { + val = node.val; + bitPos = bitPos + ii + 1; + break; + } + } + } + if (bitPos >= 32) { + bitPos -= 32; + srcPtr++; + word = stuffedData[srcPtr]; + } + delta = val - offset; + if (deltaEncode) { + if (j > 0) { + delta += prevVal; + } else if (i > 0) { + delta += resultPixels[k - width]; + } else { + delta += prevVal; + } + delta &= 255; + resultPixels[k] = delta; + prevVal = delta; + } else { + resultPixels[k] = delta; + } + } + } + } else { + for (k = 0, i = 0; i < height; i++) { + for (j = 0; j < width; j++, k++) { + if (mask[k]) { + val = 0; + valTmp = word << bitPos >>> 32 - numBitsLUTQick; + valTmpQuick = valTmp; + if (32 - bitPos < numBitsLUTQick) { + valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick; + valTmpQuick = valTmp; + } + if (decodeLut[valTmpQuick]) { + val = decodeLut[valTmpQuick][1]; + bitPos += decodeLut[valTmpQuick][0]; + } else { + valTmp = word << bitPos >>> 32 - numBitsLUT; + valTmpQuick = valTmp; + if (32 - bitPos < numBitsLUT) { + valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT; + valTmpQuick = valTmp; + } + node = tree; + for (ii = 0; ii < numBitsLUT; ii++) { + currentBit = valTmp >>> numBitsLUT - ii - 1 & 1; + node = currentBit ? node.right : node.left; + if (!(node.left || node.right)) { + val = node.val; + bitPos = bitPos + ii + 1; + break; + } + } + } + if (bitPos >= 32) { + bitPos -= 32; + srcPtr++; + word = stuffedData[srcPtr]; + } + delta = val - offset; + if (deltaEncode) { + if (j > 0 && mask[k - 1]) { + delta += prevVal; + } else if (i > 0 && mask[k - width]) { + delta += resultPixels[k - width]; + } else { + delta += prevVal; + } + delta &= 255; + resultPixels[k] = delta; + prevVal = delta; + } else { + resultPixels[k] = delta; + } + } + } + } + } + data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0); + } + data.pixels.resultPixels = resultPixelsAllDim; + }, + decodeBits: function(input, data, blockDataBuffer, offset, iDim) { + { + var headerInfo = data.headerInfo; + var fileVersion = headerInfo.fileVersion; + var blockPtr = 0; + var view = new DataView(input, data.ptr, 5); + var headerByte = view.getUint8(0); + blockPtr++; + var bits67 = headerByte >> 6; + var n = bits67 === 0 ? 4 : 3 - bits67; + var doLut = (headerByte & 32) > 0 ? true : false; + var numBits = headerByte & 31; + var numElements = 0; + if (n === 1) { + numElements = view.getUint8(blockPtr); + blockPtr++; + } else if (n === 2) { + numElements = view.getUint16(blockPtr, true); + blockPtr += 2; + } else if (n === 4) { + numElements = view.getUint32(blockPtr, true); + blockPtr += 4; + } else { + throw "Invalid valid pixel count type"; + } + var scale = 2 * headerInfo.maxZError; + var stuffedData, arrayBuf, store8, dataBytes, dataWords; + var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel; + var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax; + if (doLut) { + data.counter.lut++; + lutBytes = view.getUint8(blockPtr); + lutBitsPerElement = numBits; + blockPtr++; + dataBytes = Math.ceil((lutBytes - 1) * numBits / 8); + dataWords = Math.ceil(dataBytes / 4); + arrayBuf = new ArrayBuffer(dataWords * 4); + store8 = new Uint8Array(arrayBuf); + data.ptr += blockPtr; + store8.set(new Uint8Array(input, data.ptr, dataBytes)); + lutData = new Uint32Array(arrayBuf); + data.ptr += dataBytes; + bitsPerPixel = 0; + while (lutBytes - 1 >>> bitsPerPixel) { + bitsPerPixel++; + } + dataBytes = Math.ceil(numElements * bitsPerPixel / 8); + dataWords = Math.ceil(dataBytes / 4); + arrayBuf = new ArrayBuffer(dataWords * 4); + store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, data.ptr, dataBytes)); + stuffedData = new Uint32Array(arrayBuf); + data.ptr += dataBytes; + if (fileVersion >= 3) { + lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax); + } else { + lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax); + } + if (fileVersion >= 3) { + BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr); + } else { + BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr); + } + } else { + data.counter.bitstuffer++; + bitsPerPixel = numBits; + data.ptr += blockPtr; + if (bitsPerPixel > 0) { + dataBytes = Math.ceil(numElements * bitsPerPixel / 8); + dataWords = Math.ceil(dataBytes / 4); + arrayBuf = new ArrayBuffer(dataWords * 4); + store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, data.ptr, dataBytes)); + stuffedData = new Uint32Array(arrayBuf); + data.ptr += dataBytes; + if (fileVersion >= 3) { + if (offset == null) { + BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements); + } else { + BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax); + } + } else { + if (offset == null) { + BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements); + } else { + BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax); + } + } + } + } + } + }, + readTiles: function(input, data, OutPixelTypeArray) { + var headerInfo = data.headerInfo; + var width = headerInfo.width; + var height = headerInfo.height; + var microBlockSize = headerInfo.microBlockSize; + var imageType = headerInfo.imageType; + var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType); + var numBlocksX = Math.ceil(width / microBlockSize); + var numBlocksY = Math.ceil(height / microBlockSize); + data.pixels.numBlocksY = numBlocksY; + data.pixels.numBlocksX = numBlocksX; + data.pixels.ptr = 0; + var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0; + var view, block, arrayBuf, store8, rawData; + var blockEncoding; + var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize); + var lastBlockHeight = height % microBlockSize || microBlockSize; + var lastBlockWidth = width % microBlockSize || microBlockSize; + var offsetType, offset; + var numDims = headerInfo.numDims, iDim; + var mask = data.pixels.resultMask; + var resultPixels = data.pixels.resultPixels; + for (blockY = 0; blockY < numBlocksY; blockY++) { + thisBlockHeight = blockY !== numBlocksY - 1 ? microBlockSize : lastBlockHeight; + for (blockX = 0; blockX < numBlocksX; blockX++) { + thisBlockWidth = blockX !== numBlocksX - 1 ? microBlockSize : lastBlockWidth; + outPtr = blockY * width * microBlockSize + blockX * microBlockSize; + outStride = width - thisBlockWidth; + for (iDim = 0; iDim < numDims; iDim++) { + if (numDims > 1) { + resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, width * height * iDim * dataTypeSize, width * height); + } + bytesLeft = input.byteLength - data.ptr; + view = new DataView(input, data.ptr, Math.min(10, bytesLeft)); + block = {}; + blockPtr = 0; + headerByte = view.getUint8(0); + blockPtr++; + bits67 = headerByte >> 6 & 255; + testCode = headerByte >> 2 & 15; + if (testCode !== (blockX * microBlockSize >> 3 & 15)) { + throw "integrity issue"; + } + blockEncoding = headerByte & 3; + if (blockEncoding > 3) { + data.ptr += blockPtr; + throw "Invalid block encoding (" + blockEncoding + ")"; + } else if (blockEncoding === 2) { + data.counter.constant++; + data.ptr += blockPtr; + continue; + } else if (blockEncoding === 0) { + data.counter.uncompressed++; + data.ptr += blockPtr; + numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize; + bytesleft = input.byteLength - data.ptr; + numBytes = numBytes < bytesleft ? numBytes : bytesleft; + arrayBuf = new ArrayBuffer(numBytes % dataTypeSize === 0 ? numBytes : numBytes + dataTypeSize - numBytes % dataTypeSize); + store8 = new Uint8Array(arrayBuf); + store8.set(new Uint8Array(input, data.ptr, numBytes)); + rawData = new OutPixelTypeArray(arrayBuf); + z = 0; + if (mask) { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + if (mask[outPtr]) { + resultPixels[outPtr] = rawData[z++]; + } + outPtr++; + } + outPtr += outStride; + } + } else { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + resultPixels[outPtr++] = rawData[z++]; + } + outPtr += outStride; + } + } + data.ptr += z * dataTypeSize; + } else { + offsetType = Lerc2Helpers.getDataTypeUsed(imageType, bits67); + offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view); + blockPtr += Lerc2Helpers.getDataTypeSize(offsetType); + if (blockEncoding === 3) { + data.ptr += blockPtr; + data.counter.constantoffset++; + if (mask) { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + if (mask[outPtr]) { + resultPixels[outPtr] = offset; + } + outPtr++; + } + outPtr += outStride; + } + } else { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + resultPixels[outPtr++] = offset; + } + outPtr += outStride; + } + } + } else { + data.ptr += blockPtr; + Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim); + blockPtr = 0; + if (mask) { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + if (mask[outPtr]) { + resultPixels[outPtr] = blockDataBuffer[blockPtr++]; + } + outPtr++; + } + outPtr += outStride; + } + } else { + for (row = 0; row < thisBlockHeight; row++) { + for (col = 0; col < thisBlockWidth; col++) { + resultPixels[outPtr++] = blockDataBuffer[blockPtr++]; + } + outPtr += outStride; + } + } + } + } + } + } + } + }, + /***************** + * private methods (helper methods) + *****************/ + formatFileInfo: function(data) { + return { + "fileIdentifierString": data.headerInfo.fileIdentifierString, + "fileVersion": data.headerInfo.fileVersion, + "imageType": data.headerInfo.imageType, + "height": data.headerInfo.height, + "width": data.headerInfo.width, + "numValidPixel": data.headerInfo.numValidPixel, + "microBlockSize": data.headerInfo.microBlockSize, + "blobSize": data.headerInfo.blobSize, + "maxZError": data.headerInfo.maxZError, + "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType), + "eofOffset": data.eofOffset, + "mask": data.mask ? { + "numBytes": data.mask.numBytes + } : null, + "pixels": { + "numBlocksX": data.pixels.numBlocksX, + "numBlocksY": data.pixels.numBlocksY, + //"numBytes": data.pixels.numBytes, + "maxValue": data.headerInfo.zMax, + "minValue": data.headerInfo.zMin, + "noDataValue": data.noDataValue + } + }; + }, + constructConstantSurface: function(data) { + var val = data.headerInfo.zMax; + var numDims = data.headerInfo.numDims; + var numPixels = data.headerInfo.height * data.headerInfo.width; + var numPixelAllDims = numPixels * numDims; + var i = 0, k = 0, nStart = 0; + var mask = data.pixels.resultMask; + if (mask) { + if (numDims > 1) { + for (i = 0; i < numDims; i++) { + nStart = i * numPixels; + for (k = 0; k < numPixels; k++) { + if (mask[k]) { + data.pixels.resultPixels[nStart + k] = val; + } + } + } + } else { + for (k = 0; k < numPixels; k++) { + if (mask[k]) { + data.pixels.resultPixels[k] = val; + } + } + } + } else { + if (data.pixels.resultPixels.fill) { + data.pixels.resultPixels.fill(val); + } else { + for (k = 0; k < numPixelAllDims; k++) { + data.pixels.resultPixels[k] = val; + } + } + } + return; + }, + getDataTypeArray: function(t) { + var tp; + switch (t) { + case 0: + tp = Int8Array; + break; + case 1: + tp = Uint8Array; + break; + case 2: + tp = Int16Array; + break; + case 3: + tp = Uint16Array; + break; + case 4: + tp = Int32Array; + break; + case 5: + tp = Uint32Array; + break; + case 6: + tp = Float32Array; + break; + case 7: + tp = Float64Array; + break; + default: + tp = Float32Array; + } + return tp; + }, + getPixelType: function(t) { + var tp; + switch (t) { + case 0: + tp = "S8"; + break; + case 1: + tp = "U8"; + break; + case 2: + tp = "S16"; + break; + case 3: + tp = "U16"; + break; + case 4: + tp = "S32"; + break; + case 5: + tp = "U32"; + break; + case 6: + tp = "F32"; + break; + case 7: + tp = "F64"; + break; + default: + tp = "F32"; + } + return tp; + }, + isValidPixelValue: function(t, val) { + if (val == null) { + return false; + } + var isValid; + switch (t) { + case 0: + isValid = val >= -128 && val <= 127; + break; + case 1: + isValid = val >= 0 && val <= 255; + break; + case 2: + isValid = val >= -32768 && val <= 32767; + break; + case 3: + isValid = val >= 0 && val <= 65536; + break; + case 4: + isValid = val >= -2147483648 && val <= 2147483647; + break; + case 5: + isValid = val >= 0 && val <= 4294967296; + break; + case 6: + isValid = val >= -34027999387901484e22 && val <= 34027999387901484e22; + break; + case 7: + isValid = val >= 5e-324 && val <= 17976931348623157e292; + break; + default: + isValid = false; + } + return isValid; + }, + getDataTypeSize: function(t) { + var s = 0; + switch (t) { + case 0: + //ubyte + case 1: + s = 1; + break; + case 2: + //short + case 3: + s = 2; + break; + case 4: + case 5: + case 6: + s = 4; + break; + case 7: + s = 8; + break; + default: + s = t; + } + return s; + }, + getDataTypeUsed: function(dt, tc) { + var t = dt; + switch (dt) { + case 2: + //short + case 4: + t = dt - tc; + break; + case 3: + //ushort + case 5: + t = dt - 2 * tc; + break; + case 6: + if (0 === tc) { + t = dt; + } else if (1 === tc) { + t = 2; + } else { + t = 1; + } + break; + case 7: + if (0 === tc) { + t = dt; + } else { + t = dt - 2 * tc + 1; + } + break; + default: + t = dt; + break; + } + return t; + }, + getOnePixel: function(block, blockPtr, offsetType, view) { + var temp = 0; + switch (offsetType) { + case 0: + temp = view.getInt8(blockPtr); + break; + case 1: + temp = view.getUint8(blockPtr); + break; + case 2: + temp = view.getInt16(blockPtr, true); + break; + case 3: + temp = view.getUint16(blockPtr, true); + break; + case 4: + temp = view.getInt32(blockPtr, true); + break; + case 5: + temp = view.getUInt32(blockPtr, true); + break; + case 6: + temp = view.getFloat32(blockPtr, true); + break; + case 7: + temp = view.getFloat64(blockPtr, true); + break; + default: + throw "the decoder does not understand this pixel type"; + } + return temp; + } + }; + var TreeNode = function(val, left, right) { + this.val = val; + this.left = left; + this.right = right; + }; + var Lerc2Decode2 = { + /* + * ********removed options compared to LERC1. We can bring some of them back if needed. + * removed pixel type. LERC2 is typed and doesn't require user to give pixel type + * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly. + * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost. + * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc, + * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now. + * We can add it back later if their's a clear requirement. + * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient) + * removed computeUsedBitDepths. + * + * + * response changes compared to LERC1 + * 1. encodedMaskData is not available + * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range) + * 3. maskData is always available + */ + /***************** + * public properties + ******************/ + //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable + /***************** + * public methods + *****************/ + /** + * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata. + * + * @param {ArrayBuffer} input The LERC input byte stream + * @param {object} [options] options Decoding options + * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position + * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process + */ + decode: function(input, options) { + options = options || {}; + var noDataValue = options.noDataValue; + var i = 0, data = {}; + data.ptr = options.inputOffset || 0; + data.pixels = {}; + if (!Lerc2Helpers.readHeaderInfo(input, data)) { + return; + } + var headerInfo = data.headerInfo; + var fileVersion = headerInfo.fileVersion; + var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType); + Lerc2Helpers.readMask(input, data); + if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) { + data.pixels.resultMask = options.maskData; + } + var numPixels = headerInfo.width * headerInfo.height; + data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims); + data.counter = { + onesweep: 0, + uncompressed: 0, + lut: 0, + bitstuffer: 0, + constant: 0, + constantoffset: 0 + }; + if (headerInfo.numValidPixel !== 0) { + if (headerInfo.zMax === headerInfo.zMin) { + Lerc2Helpers.constructConstantSurface(data); + } else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) { + Lerc2Helpers.constructConstantSurface(data); + } else { + var view = new DataView(input, data.ptr, 2); + var bReadDataOneSweep = view.getUint8(0); + data.ptr++; + if (bReadDataOneSweep) { + Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray); + } else { + if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 1e-5) { + var flagHuffman = view.getUint8(1); + data.ptr++; + data.encodeMode = flagHuffman; + if (flagHuffman > 2 || fileVersion < 4 && flagHuffman > 1) { + throw "Invalid Huffman flag " + flagHuffman; + } + if (flagHuffman) { + Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray); + } else { + Lerc2Helpers.readTiles(input, data, OutPixelTypeArray); + } + } else { + Lerc2Helpers.readTiles(input, data, OutPixelTypeArray); + } + } + } + } + data.eofOffset = data.ptr; + var diff; + if (options.inputOffset) { + diff = data.headerInfo.blobSize + options.inputOffset - data.ptr; + if (Math.abs(diff) >= 1) { + data.eofOffset = options.inputOffset + data.headerInfo.blobSize; + } + } else { + diff = data.headerInfo.blobSize - data.ptr; + if (Math.abs(diff) >= 1) { + data.eofOffset = data.headerInfo.blobSize; + } + } + var result = { + width: headerInfo.width, + height: headerInfo.height, + pixelData: data.pixels.resultPixels, + minValue: headerInfo.zMin, + maxValue: headerInfo.zMax, + validPixelCount: headerInfo.numValidPixel, + dimCount: headerInfo.numDims, + dimStats: { + minValues: headerInfo.minValues, + maxValues: headerInfo.maxValues + }, + maskData: data.pixels.resultMask + //noDataValue: noDataValue + }; + if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) { + var mask = data.pixels.resultMask; + for (i = 0; i < numPixels; i++) { + if (!mask[i]) { + result.pixelData[i] = noDataValue; + } + } + result.noDataValue = noDataValue; + } + data.noDataValue = noDataValue; + if (options.returnFileInfo) { + result.fileInfo = Lerc2Helpers.formatFileInfo(data); + } + return result; + }, + getBandCount: function(input) { + var count = 0; + var i = 0; + var temp = {}; + temp.ptr = 0; + temp.pixels = {}; + while (i < input.byteLength - 58) { + Lerc2Helpers.readHeaderInfo(input, temp); + i += temp.headerInfo.blobSize; + count++; + temp.ptr = i; + } + return count; + } + }; + return Lerc2Decode2; + }(); + var isPlatformLittleEndian = function() { + var a = new ArrayBuffer(4); + var b = new Uint8Array(a); + var c = new Uint32Array(a); + c[0] = 1; + return b[0] === 1; + }(); + var Lerc2 = { + /************wrapper**********************************************/ + /** + * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types. + * + * @alias module:Lerc + * @param {ArrayBuffer} input The LERC input byte stream + * @param {object} [options] The decoding options below are optional. + * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position. + * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32. + * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value. + * @returns {{width, height, pixels, pixelType, mask, statistics}} + * @property {number} width Width of decoded image. + * @property {number} height Height of decoded image. + * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height. + * @property {string} pixelType The type of pixels represented in the output. + * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid. + * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values + **/ + decode: function(encodedData, options) { + if (!isPlatformLittleEndian) { + throw "Big endian system is not supported."; + } + options = options || {}; + var inputOffset = options.inputOffset || 0; + var fileIdView = new Uint8Array(encodedData, inputOffset, 10); + var fileIdentifierString = String.fromCharCode.apply(null, fileIdView); + var lerc, majorVersion; + if (fileIdentifierString.trim() === "CntZImage") { + lerc = LercDecode; + majorVersion = 1; + } else if (fileIdentifierString.substring(0, 5) === "Lerc2") { + lerc = Lerc2Decode; + majorVersion = 2; + } else { + throw "Unexpected file identifier string: " + fileIdentifierString; + } + var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData; + var decodedPixelBlock = { + width: 0, + height: 0, + pixels: [], + pixelType: options.pixelType, + mask: null, + statistics: [] + }; + while (inputOffset < eof) { + var result = lerc.decode(encodedData, { + inputOffset, + //for both lerc1 and lerc2 + encodedMaskData, + //lerc1 only + maskData, + //lerc2 only + returnMask: iPlane === 0 ? true : false, + //lerc1 only + returnEncodedMask: iPlane === 0 ? true : false, + //lerc1 only + returnFileInfo: true, + //for both lerc1 and lerc2 + pixelType: options.pixelType || null, + //lerc1 only + noDataValue: options.noDataValue || null + //lerc1 only + }); + inputOffset = result.fileInfo.eofOffset; + if (iPlane === 0) { + encodedMaskData = result.encodedMaskData; + maskData = result.maskData; + decodedPixelBlock.width = result.width; + decodedPixelBlock.height = result.height; + decodedPixelBlock.dimCount = result.dimCount || 1; + decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType; + decodedPixelBlock.mask = result.maskData; + } + if (majorVersion > 1 && result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) { + bandMasks.push(result.maskData); + } + iPlane++; + decodedPixelBlock.pixels.push(result.pixelData); + decodedPixelBlock.statistics.push({ + minValue: result.minValue, + maxValue: result.maxValue, + noDataValue: result.noDataValue, + dimStats: result.dimStats + }); + } + var i, j, numPixels; + if (majorVersion > 1 && bandMasks.length > 1) { + numPixels = decodedPixelBlock.width * decodedPixelBlock.height; + decodedPixelBlock.bandMasks = bandMasks; + maskData = new Uint8Array(numPixels); + maskData.set(bandMasks[0]); + for (i = 1; i < bandMasks.length; i++) { + bandMask = bandMasks[i]; + for (j = 0; j < numPixels; j++) { + maskData[j] = maskData[j] & bandMask[j]; + } + } + decodedPixelBlock.maskData = maskData; + } + return decodedPixelBlock; + } + }; + if (typeof define === "function" && define.amd) { + define([], function() { + return Lerc2; + }); + } else if (typeof module !== "undefined" && module.exports) { + module.exports = Lerc2; + } else { + this.Lerc = Lerc2; + } + })(); + } +}); + +// packages/engine/Source/Core/HeightmapEncoding.js +var HeightmapEncoding = { + /** + * No encoding + * + * @type {number} + * @constant + */ + NONE: 0, + /** + * LERC encoding + * + * @type {number} + * @constant + * + * @see {@link https://github.com/Esri/lerc|The LERC specification} + */ + LERC: 1 +}; +var HeightmapEncoding_default = Object.freeze(HeightmapEncoding); + +// packages/engine/Source/Core/HeightmapTessellator.js +var HeightmapTessellator = {}; +HeightmapTessellator.DEFAULT_STRUCTURE = Object.freeze({ + heightScale: 1, + heightOffset: 0, + elementsPerHeight: 1, + stride: 1, + elementMultiplier: 256, + isBigEndian: false +}); +var cartesian3Scratch = new Cartesian3_default(); +var matrix4Scratch = new Matrix4_default(); +var minimumScratch = new Cartesian3_default(); +var maximumScratch = new Cartesian3_default(); +HeightmapTessellator.computeVertices = function(options) { + if (!defined_default(options) || !defined_default(options.heightmap)) { + throw new DeveloperError_default("options.heightmap is required."); + } + if (!defined_default(options.width) || !defined_default(options.height)) { + throw new DeveloperError_default("options.width and options.height are required."); + } + if (!defined_default(options.nativeRectangle)) { + throw new DeveloperError_default("options.nativeRectangle is required."); + } + if (!defined_default(options.skirtHeight)) { + throw new DeveloperError_default("options.skirtHeight is required."); + } + const cos = Math.cos; + const sin = Math.sin; + const sqrt = Math.sqrt; + const atan = Math.atan; + const exp = Math.exp; + const piOverTwo = Math_default.PI_OVER_TWO; + const toRadians = Math_default.toRadians; + const heightmap = options.heightmap; + const width = options.width; + const height = options.height; + const skirtHeight = options.skirtHeight; + const hasSkirts = skirtHeight > 0; + const isGeographic = defaultValue_default(options.isGeographic, true); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + const oneOverGlobeSemimajorAxis = 1 / ellipsoid.maximumRadius; + const nativeRectangle = Rectangle_default.clone(options.nativeRectangle); + const rectangle = Rectangle_default.clone(options.rectangle); + let geographicWest; + let geographicSouth; + let geographicEast; + let geographicNorth; + if (!defined_default(rectangle)) { + if (isGeographic) { + geographicWest = toRadians(nativeRectangle.west); + geographicSouth = toRadians(nativeRectangle.south); + geographicEast = toRadians(nativeRectangle.east); + geographicNorth = toRadians(nativeRectangle.north); + } else { + geographicWest = nativeRectangle.west * oneOverGlobeSemimajorAxis; + geographicSouth = piOverTwo - 2 * atan(exp(-nativeRectangle.south * oneOverGlobeSemimajorAxis)); + geographicEast = nativeRectangle.east * oneOverGlobeSemimajorAxis; + geographicNorth = piOverTwo - 2 * atan(exp(-nativeRectangle.north * oneOverGlobeSemimajorAxis)); + } + } else { + geographicWest = rectangle.west; + geographicSouth = rectangle.south; + geographicEast = rectangle.east; + geographicNorth = rectangle.north; + } + let relativeToCenter = options.relativeToCenter; + const hasRelativeToCenter = defined_default(relativeToCenter); + relativeToCenter = hasRelativeToCenter ? relativeToCenter : Cartesian3_default.ZERO; + const includeWebMercatorT = defaultValue_default(options.includeWebMercatorT, false); + const exaggeration = defaultValue_default(options.exaggeration, 1); + const exaggerationRelativeHeight = defaultValue_default( + options.exaggerationRelativeHeight, + 0 + ); + const hasExaggeration = exaggeration !== 1; + const includeGeodeticSurfaceNormals = hasExaggeration; + const structure = defaultValue_default( + options.structure, + HeightmapTessellator.DEFAULT_STRUCTURE + ); + const heightScale = defaultValue_default( + structure.heightScale, + HeightmapTessellator.DEFAULT_STRUCTURE.heightScale + ); + const heightOffset = defaultValue_default( + structure.heightOffset, + HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset + ); + const elementsPerHeight = defaultValue_default( + structure.elementsPerHeight, + HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight + ); + const stride = defaultValue_default( + structure.stride, + HeightmapTessellator.DEFAULT_STRUCTURE.stride + ); + const elementMultiplier = defaultValue_default( + structure.elementMultiplier, + HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier + ); + const isBigEndian = defaultValue_default( + structure.isBigEndian, + HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian + ); + let rectangleWidth = Rectangle_default.computeWidth(nativeRectangle); + let rectangleHeight = Rectangle_default.computeHeight(nativeRectangle); + const granularityX = rectangleWidth / (width - 1); + const granularityY = rectangleHeight / (height - 1); + if (!isGeographic) { + rectangleWidth *= oneOverGlobeSemimajorAxis; + rectangleHeight *= oneOverGlobeSemimajorAxis; + } + const radiiSquared = ellipsoid.radiiSquared; + const radiiSquaredX = radiiSquared.x; + const radiiSquaredY = radiiSquared.y; + const radiiSquaredZ = radiiSquared.z; + let minimumHeight = 65536; + let maximumHeight = -65536; + const fromENU = Transforms_default.eastNorthUpToFixedFrame( + relativeToCenter, + ellipsoid + ); + const toENU = Matrix4_default.inverseTransformation(fromENU, matrix4Scratch); + let southMercatorY; + let oneOverMercatorHeight; + if (includeWebMercatorT) { + southMercatorY = WebMercatorProjection_default.geodeticLatitudeToMercatorAngle( + geographicSouth + ); + oneOverMercatorHeight = 1 / (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY); + } + const minimum = minimumScratch; + minimum.x = Number.POSITIVE_INFINITY; + minimum.y = Number.POSITIVE_INFINITY; + minimum.z = Number.POSITIVE_INFINITY; + const maximum = maximumScratch; + maximum.x = Number.NEGATIVE_INFINITY; + maximum.y = Number.NEGATIVE_INFINITY; + maximum.z = Number.NEGATIVE_INFINITY; + let hMin = Number.POSITIVE_INFINITY; + const gridVertexCount = width * height; + const edgeVertexCount = skirtHeight > 0 ? width * 2 + height * 2 : 0; + const vertexCount = gridVertexCount + edgeVertexCount; + const positions = new Array(vertexCount); + const heights = new Array(vertexCount); + const uvs = new Array(vertexCount); + const webMercatorTs = includeWebMercatorT ? new Array(vertexCount) : []; + const geodeticSurfaceNormals = includeGeodeticSurfaceNormals ? new Array(vertexCount) : []; + let startRow = 0; + let endRow = height; + let startCol = 0; + let endCol = width; + if (hasSkirts) { + --startRow; + ++endRow; + --startCol; + ++endCol; + } + const skirtOffsetPercentage = 1e-5; + for (let rowIndex = startRow; rowIndex < endRow; ++rowIndex) { + let row = rowIndex; + if (row < 0) { + row = 0; + } + if (row >= height) { + row = height - 1; + } + let latitude = nativeRectangle.north - granularityY * row; + if (!isGeographic) { + latitude = piOverTwo - 2 * atan(exp(-latitude * oneOverGlobeSemimajorAxis)); + } else { + latitude = toRadians(latitude); + } + let v = (latitude - geographicSouth) / (geographicNorth - geographicSouth); + v = Math_default.clamp(v, 0, 1); + const isNorthEdge = rowIndex === startRow; + const isSouthEdge = rowIndex === endRow - 1; + if (skirtHeight > 0) { + if (isNorthEdge) { + latitude += skirtOffsetPercentage * rectangleHeight; + } else if (isSouthEdge) { + latitude -= skirtOffsetPercentage * rectangleHeight; + } + } + const cosLatitude = cos(latitude); + const nZ = sin(latitude); + const kZ = radiiSquaredZ * nZ; + let webMercatorT; + if (includeWebMercatorT) { + webMercatorT = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight; + } + for (let colIndex = startCol; colIndex < endCol; ++colIndex) { + let col = colIndex; + if (col < 0) { + col = 0; + } + if (col >= width) { + col = width - 1; + } + const terrainOffset = row * (width * stride) + col * stride; + let heightSample; + if (elementsPerHeight === 1) { + heightSample = heightmap[terrainOffset]; + } else { + heightSample = 0; + let elementOffset; + if (isBigEndian) { + for (elementOffset = 0; elementOffset < elementsPerHeight; ++elementOffset) { + heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset]; + } + } else { + for (elementOffset = elementsPerHeight - 1; elementOffset >= 0; --elementOffset) { + heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset]; + } + } + } + heightSample = heightSample * heightScale + heightOffset; + maximumHeight = Math.max(maximumHeight, heightSample); + minimumHeight = Math.min(minimumHeight, heightSample); + let longitude = nativeRectangle.west + granularityX * col; + if (!isGeographic) { + longitude = longitude * oneOverGlobeSemimajorAxis; + } else { + longitude = toRadians(longitude); + } + let u = (longitude - geographicWest) / (geographicEast - geographicWest); + u = Math_default.clamp(u, 0, 1); + let index = row * width + col; + if (skirtHeight > 0) { + const isWestEdge = colIndex === startCol; + const isEastEdge = colIndex === endCol - 1; + const isEdge = isNorthEdge || isSouthEdge || isWestEdge || isEastEdge; + const isCorner = (isNorthEdge || isSouthEdge) && (isWestEdge || isEastEdge); + if (isCorner) { + continue; + } else if (isEdge) { + heightSample -= skirtHeight; + if (isWestEdge) { + index = gridVertexCount + (height - row - 1); + longitude -= skirtOffsetPercentage * rectangleWidth; + } else if (isSouthEdge) { + index = gridVertexCount + height + (width - col - 1); + } else if (isEastEdge) { + index = gridVertexCount + height + width + row; + longitude += skirtOffsetPercentage * rectangleWidth; + } else if (isNorthEdge) { + index = gridVertexCount + height + width + height + col; + } + } + } + const nX = cosLatitude * cos(longitude); + const nY = cosLatitude * sin(longitude); + const kX = radiiSquaredX * nX; + const kY = radiiSquaredY * nY; + const gamma = sqrt(kX * nX + kY * nY + kZ * nZ); + const oneOverGamma = 1 / gamma; + const rSurfaceX = kX * oneOverGamma; + const rSurfaceY = kY * oneOverGamma; + const rSurfaceZ = kZ * oneOverGamma; + const position = new Cartesian3_default(); + position.x = rSurfaceX + nX * heightSample; + position.y = rSurfaceY + nY * heightSample; + position.z = rSurfaceZ + nZ * heightSample; + Matrix4_default.multiplyByPoint(toENU, position, cartesian3Scratch); + Cartesian3_default.minimumByComponent(cartesian3Scratch, minimum, minimum); + Cartesian3_default.maximumByComponent(cartesian3Scratch, maximum, maximum); + hMin = Math.min(hMin, heightSample); + positions[index] = position; + uvs[index] = new Cartesian2_default(u, v); + heights[index] = heightSample; + if (includeWebMercatorT) { + webMercatorTs[index] = webMercatorT; + } + if (includeGeodeticSurfaceNormals) { + geodeticSurfaceNormals[index] = ellipsoid.geodeticSurfaceNormal( + position + ); + } + } + } + const boundingSphere3D = BoundingSphere_default.fromPoints(positions); + let orientedBoundingBox; + if (defined_default(rectangle)) { + orientedBoundingBox = OrientedBoundingBox_default.fromRectangle( + rectangle, + minimumHeight, + maximumHeight, + ellipsoid + ); + } + let occludeePointInScaledSpace; + if (hasRelativeToCenter) { + const occluder = new EllipsoidalOccluder_default(ellipsoid); + occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid( + relativeToCenter, + positions, + minimumHeight + ); + } + const aaBox = new AxisAlignedBoundingBox_default(minimum, maximum, relativeToCenter); + const encoding = new TerrainEncoding_default( + relativeToCenter, + aaBox, + hMin, + maximumHeight, + fromENU, + false, + includeWebMercatorT, + includeGeodeticSurfaceNormals, + exaggeration, + exaggerationRelativeHeight + ); + const vertices = new Float32Array(vertexCount * encoding.stride); + let bufferIndex = 0; + for (let j = 0; j < vertexCount; ++j) { + bufferIndex = encoding.encode( + vertices, + bufferIndex, + positions[j], + uvs[j], + heights[j], + void 0, + webMercatorTs[j], + geodeticSurfaceNormals[j] + ); + } + return { + vertices, + maximumHeight, + minimumHeight, + encoding, + boundingSphere3D, + orientedBoundingBox, + occludeePointInScaledSpace + }; +}; +var HeightmapTessellator_default = HeightmapTessellator; + +// packages/engine/Source/Workers/createVerticesFromHeightmap.js +var import_lerc = __toESM(require_LercDecode(), 1); +function createVerticesFromHeightmap(parameters, transferableObjects) { + if (parameters.encoding === HeightmapEncoding_default.LERC) { + let result; + try { + result = import_lerc.default.decode(parameters.heightmap); + } catch (error) { + throw new RuntimeError_default(error); + } + const lercStatistics = result.statistics[0]; + if (lercStatistics.minValue === Number.MAX_VALUE) { + throw new RuntimeError_default("Invalid tile data"); + } + parameters.heightmap = result.pixels[0]; + parameters.width = result.width; + parameters.height = result.height; + } + parameters.ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid); + parameters.rectangle = Rectangle_default.clone(parameters.rectangle); + const statistics = HeightmapTessellator_default.computeVertices(parameters); + const vertices = statistics.vertices; + transferableObjects.push(vertices.buffer); + return { + vertices: vertices.buffer, + numberOfAttributes: statistics.encoding.stride, + minimumHeight: statistics.minimumHeight, + maximumHeight: statistics.maximumHeight, + gridWidth: parameters.width, + gridHeight: parameters.height, + boundingSphere3D: statistics.boundingSphere3D, + orientedBoundingBox: statistics.orientedBoundingBox, + occludeePointInScaledSpace: statistics.occludeePointInScaledSpace, + encoding: statistics.encoding, + westIndicesSouthToNorth: statistics.westIndicesSouthToNorth, + southIndicesEastToWest: statistics.southIndicesEastToWest, + eastIndicesNorthToSouth: statistics.eastIndicesNorthToSouth, + northIndicesWestToEast: statistics.northIndicesWestToEast + }; +} +var createVerticesFromHeightmap_default = createTaskProcessorWorker_default(createVerticesFromHeightmap); +export { + createVerticesFromHeightmap_default as default +}; diff --git a/public/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js b/public/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js new file mode 100644 index 0000000..c4556d2 --- /dev/null +++ b/public/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js @@ -0,0 +1,743 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidalOccluder_default, + TerrainEncoding_default +} from "./chunk-56EDBCGT.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import "./chunk-LJ2JQHJT.js"; +import { + AxisAlignedBoundingBox_default +} from "./chunk-NDDI2LWR.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import "./chunk-KHZNBFOH.js"; +import { + Matrix4_default, + Rectangle_default, + Transforms_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/TerrainProvider.js +function TerrainProvider() { + DeveloperError_default.throwInstantiationError(); +} +Object.defineProperties(TerrainProvider.prototype, { + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + * @memberof TerrainProvider.prototype + * @type {Event} + * @readonly + */ + errorEvent: { + get: DeveloperError_default.throwInstantiationError + }, + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + * @memberof TerrainProvider.prototype + * @type {Credit} + * @readonly + */ + credit: { + get: DeveloperError_default.throwInstantiationError + }, + /** + * Gets the tiling scheme used by the provider. + * @memberof TerrainProvider.prototype + * @type {TilingScheme} + * @readonly + */ + tilingScheme: { + get: DeveloperError_default.throwInstantiationError + }, + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * @memberof TerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasWaterMask: { + get: DeveloperError_default.throwInstantiationError + }, + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * @memberof TerrainProvider.prototype + * @type {boolean} + * @readonly + */ + hasVertexNormals: { + get: DeveloperError_default.throwInstantiationError + }, + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + * @memberof TerrainProvider.prototype + * @type {TileAvailability} + * @readonly + */ + availability: { + get: DeveloperError_default.throwInstantiationError + } +}); +var regularGridIndicesCache = []; +TerrainProvider.getRegularGridIndices = function(width, height) { + if (width * height >= Math_default.FOUR_GIGABYTES) { + throw new DeveloperError_default( + "The total number of vertices (width * height) must be less than 4,294,967,296." + ); + } + let byWidth = regularGridIndicesCache[width]; + if (!defined_default(byWidth)) { + regularGridIndicesCache[width] = byWidth = []; + } + let indices = byWidth[height]; + if (!defined_default(indices)) { + if (width * height < Math_default.SIXTY_FOUR_KILOBYTES) { + indices = byWidth[height] = new Uint16Array( + (width - 1) * (height - 1) * 6 + ); + } else { + indices = byWidth[height] = new Uint32Array( + (width - 1) * (height - 1) * 6 + ); + } + addRegularGridIndices(width, height, indices, 0); + } + return indices; +}; +var regularGridAndEdgeIndicesCache = []; +TerrainProvider.getRegularGridIndicesAndEdgeIndices = function(width, height) { + if (width * height >= Math_default.FOUR_GIGABYTES) { + throw new DeveloperError_default( + "The total number of vertices (width * height) must be less than 4,294,967,296." + ); + } + let byWidth = regularGridAndEdgeIndicesCache[width]; + if (!defined_default(byWidth)) { + regularGridAndEdgeIndicesCache[width] = byWidth = []; + } + let indicesAndEdges = byWidth[height]; + if (!defined_default(indicesAndEdges)) { + const indices = TerrainProvider.getRegularGridIndices(width, height); + const edgeIndices = getEdgeIndices(width, height); + const westIndicesSouthToNorth = edgeIndices.westIndicesSouthToNorth; + const southIndicesEastToWest = edgeIndices.southIndicesEastToWest; + const eastIndicesNorthToSouth = edgeIndices.eastIndicesNorthToSouth; + const northIndicesWestToEast = edgeIndices.northIndicesWestToEast; + indicesAndEdges = byWidth[height] = { + indices, + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast + }; + } + return indicesAndEdges; +}; +var regularGridAndSkirtAndEdgeIndicesCache = []; +TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices = function(width, height) { + if (width * height >= Math_default.FOUR_GIGABYTES) { + throw new DeveloperError_default( + "The total number of vertices (width * height) must be less than 4,294,967,296." + ); + } + let byWidth = regularGridAndSkirtAndEdgeIndicesCache[width]; + if (!defined_default(byWidth)) { + regularGridAndSkirtAndEdgeIndicesCache[width] = byWidth = []; + } + let indicesAndEdges = byWidth[height]; + if (!defined_default(indicesAndEdges)) { + const gridVertexCount = width * height; + const gridIndexCount = (width - 1) * (height - 1) * 6; + const edgeVertexCount = width * 2 + height * 2; + const edgeIndexCount = Math.max(0, edgeVertexCount - 4) * 6; + const vertexCount = gridVertexCount + edgeVertexCount; + const indexCount = gridIndexCount + edgeIndexCount; + const edgeIndices = getEdgeIndices(width, height); + const westIndicesSouthToNorth = edgeIndices.westIndicesSouthToNorth; + const southIndicesEastToWest = edgeIndices.southIndicesEastToWest; + const eastIndicesNorthToSouth = edgeIndices.eastIndicesNorthToSouth; + const northIndicesWestToEast = edgeIndices.northIndicesWestToEast; + const indices = IndexDatatype_default.createTypedArray(vertexCount, indexCount); + addRegularGridIndices(width, height, indices, 0); + TerrainProvider.addSkirtIndices( + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast, + gridVertexCount, + indices, + gridIndexCount + ); + indicesAndEdges = byWidth[height] = { + indices, + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast, + indexCountWithoutSkirts: gridIndexCount + }; + } + return indicesAndEdges; +}; +TerrainProvider.addSkirtIndices = function(westIndicesSouthToNorth, southIndicesEastToWest, eastIndicesNorthToSouth, northIndicesWestToEast, vertexCount, indices, offset) { + let vertexIndex = vertexCount; + offset = addSkirtIndices( + westIndicesSouthToNorth, + vertexIndex, + indices, + offset + ); + vertexIndex += westIndicesSouthToNorth.length; + offset = addSkirtIndices( + southIndicesEastToWest, + vertexIndex, + indices, + offset + ); + vertexIndex += southIndicesEastToWest.length; + offset = addSkirtIndices( + eastIndicesNorthToSouth, + vertexIndex, + indices, + offset + ); + vertexIndex += eastIndicesNorthToSouth.length; + addSkirtIndices(northIndicesWestToEast, vertexIndex, indices, offset); +}; +function getEdgeIndices(width, height) { + const westIndicesSouthToNorth = new Array(height); + const southIndicesEastToWest = new Array(width); + const eastIndicesNorthToSouth = new Array(height); + const northIndicesWestToEast = new Array(width); + let i; + for (i = 0; i < width; ++i) { + northIndicesWestToEast[i] = i; + southIndicesEastToWest[i] = width * height - 1 - i; + } + for (i = 0; i < height; ++i) { + eastIndicesNorthToSouth[i] = (i + 1) * width - 1; + westIndicesSouthToNorth[i] = (height - i - 1) * width; + } + return { + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast + }; +} +function addRegularGridIndices(width, height, indices, offset) { + let index = 0; + for (let j = 0; j < height - 1; ++j) { + for (let i = 0; i < width - 1; ++i) { + const upperLeft = index; + const lowerLeft = upperLeft + width; + const lowerRight = lowerLeft + 1; + const upperRight = upperLeft + 1; + indices[offset++] = upperLeft; + indices[offset++] = lowerLeft; + indices[offset++] = upperRight; + indices[offset++] = upperRight; + indices[offset++] = lowerLeft; + indices[offset++] = lowerRight; + ++index; + } + ++index; + } +} +function addSkirtIndices(edgeIndices, vertexIndex, indices, offset) { + let previousIndex = edgeIndices[0]; + const length = edgeIndices.length; + for (let i = 1; i < length; ++i) { + const index = edgeIndices[i]; + indices[offset++] = previousIndex; + indices[offset++] = index; + indices[offset++] = vertexIndex; + indices[offset++] = vertexIndex; + indices[offset++] = index; + indices[offset++] = vertexIndex + 1; + previousIndex = index; + ++vertexIndex; + } + return offset; +} +TerrainProvider.heightmapTerrainQuality = 0.25; +TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap = function(ellipsoid, tileImageWidth, numberOfTilesAtLevelZero) { + return ellipsoid.maximumRadius * 2 * Math.PI * TerrainProvider.heightmapTerrainQuality / (tileImageWidth * numberOfTilesAtLevelZero); +}; +TerrainProvider.prototype.requestTileGeometry = DeveloperError_default.throwInstantiationError; +TerrainProvider.prototype.getLevelMaximumGeometricError = DeveloperError_default.throwInstantiationError; +TerrainProvider.prototype.getTileDataAvailable = DeveloperError_default.throwInstantiationError; +TerrainProvider.prototype.loadTileDataAvailability = DeveloperError_default.throwInstantiationError; +var TerrainProvider_default = TerrainProvider; + +// packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js +var maxShort = 32767; +var cartesian3Scratch = new Cartesian3_default(); +var scratchMinimum = new Cartesian3_default(); +var scratchMaximum = new Cartesian3_default(); +var cartographicScratch = new Cartographic_default(); +var toPack = new Cartesian2_default(); +function createVerticesFromQuantizedTerrainMesh(parameters, transferableObjects) { + const quantizedVertices = parameters.quantizedVertices; + const quantizedVertexCount = quantizedVertices.length / 3; + const octEncodedNormals = parameters.octEncodedNormals; + const edgeVertexCount = parameters.westIndices.length + parameters.eastIndices.length + parameters.southIndices.length + parameters.northIndices.length; + const includeWebMercatorT = parameters.includeWebMercatorT; + const exaggeration = parameters.exaggeration; + const exaggerationRelativeHeight = parameters.exaggerationRelativeHeight; + const hasExaggeration = exaggeration !== 1; + const includeGeodeticSurfaceNormals = hasExaggeration; + const rectangle = Rectangle_default.clone(parameters.rectangle); + const west = rectangle.west; + const south = rectangle.south; + const east = rectangle.east; + const north = rectangle.north; + const ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid); + const minimumHeight = parameters.minimumHeight; + const maximumHeight = parameters.maximumHeight; + const center = parameters.relativeToCenter; + const fromENU = Transforms_default.eastNorthUpToFixedFrame(center, ellipsoid); + const toENU = Matrix4_default.inverseTransformation(fromENU, new Matrix4_default()); + let southMercatorY; + let oneOverMercatorHeight; + if (includeWebMercatorT) { + southMercatorY = WebMercatorProjection_default.geodeticLatitudeToMercatorAngle( + south + ); + oneOverMercatorHeight = 1 / (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(north) - southMercatorY); + } + const uBuffer = quantizedVertices.subarray(0, quantizedVertexCount); + const vBuffer = quantizedVertices.subarray( + quantizedVertexCount, + 2 * quantizedVertexCount + ); + const heightBuffer = quantizedVertices.subarray( + quantizedVertexCount * 2, + 3 * quantizedVertexCount + ); + const hasVertexNormals = defined_default(octEncodedNormals); + const uvs = new Array(quantizedVertexCount); + const heights = new Array(quantizedVertexCount); + const positions = new Array(quantizedVertexCount); + const webMercatorTs = includeWebMercatorT ? new Array(quantizedVertexCount) : []; + const geodeticSurfaceNormals = includeGeodeticSurfaceNormals ? new Array(quantizedVertexCount) : []; + const minimum = scratchMinimum; + minimum.x = Number.POSITIVE_INFINITY; + minimum.y = Number.POSITIVE_INFINITY; + minimum.z = Number.POSITIVE_INFINITY; + const maximum = scratchMaximum; + maximum.x = Number.NEGATIVE_INFINITY; + maximum.y = Number.NEGATIVE_INFINITY; + maximum.z = Number.NEGATIVE_INFINITY; + let minLongitude = Number.POSITIVE_INFINITY; + let maxLongitude = Number.NEGATIVE_INFINITY; + let minLatitude = Number.POSITIVE_INFINITY; + let maxLatitude = Number.NEGATIVE_INFINITY; + for (let i = 0; i < quantizedVertexCount; ++i) { + const rawU = uBuffer[i]; + const rawV = vBuffer[i]; + const u = rawU / maxShort; + const v = rawV / maxShort; + const height = Math_default.lerp( + minimumHeight, + maximumHeight, + heightBuffer[i] / maxShort + ); + cartographicScratch.longitude = Math_default.lerp(west, east, u); + cartographicScratch.latitude = Math_default.lerp(south, north, v); + cartographicScratch.height = height; + minLongitude = Math.min(cartographicScratch.longitude, minLongitude); + maxLongitude = Math.max(cartographicScratch.longitude, maxLongitude); + minLatitude = Math.min(cartographicScratch.latitude, minLatitude); + maxLatitude = Math.max(cartographicScratch.latitude, maxLatitude); + const position = ellipsoid.cartographicToCartesian(cartographicScratch); + uvs[i] = new Cartesian2_default(u, v); + heights[i] = height; + positions[i] = position; + if (includeWebMercatorT) { + webMercatorTs[i] = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle( + cartographicScratch.latitude + ) - southMercatorY) * oneOverMercatorHeight; + } + if (includeGeodeticSurfaceNormals) { + geodeticSurfaceNormals[i] = ellipsoid.geodeticSurfaceNormal(position); + } + Matrix4_default.multiplyByPoint(toENU, position, cartesian3Scratch); + Cartesian3_default.minimumByComponent(cartesian3Scratch, minimum, minimum); + Cartesian3_default.maximumByComponent(cartesian3Scratch, maximum, maximum); + } + const westIndicesSouthToNorth = copyAndSort(parameters.westIndices, function(a, b) { + return uvs[a].y - uvs[b].y; + }); + const eastIndicesNorthToSouth = copyAndSort(parameters.eastIndices, function(a, b) { + return uvs[b].y - uvs[a].y; + }); + const southIndicesEastToWest = copyAndSort(parameters.southIndices, function(a, b) { + return uvs[b].x - uvs[a].x; + }); + const northIndicesWestToEast = copyAndSort(parameters.northIndices, function(a, b) { + return uvs[a].x - uvs[b].x; + }); + let occludeePointInScaledSpace; + if (minimumHeight < 0) { + const occluder = new EllipsoidalOccluder_default(ellipsoid); + occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid( + center, + positions, + minimumHeight + ); + } + let hMin = minimumHeight; + hMin = Math.min( + hMin, + findMinMaxSkirts( + parameters.westIndices, + parameters.westSkirtHeight, + heights, + uvs, + rectangle, + ellipsoid, + toENU, + minimum, + maximum + ) + ); + hMin = Math.min( + hMin, + findMinMaxSkirts( + parameters.southIndices, + parameters.southSkirtHeight, + heights, + uvs, + rectangle, + ellipsoid, + toENU, + minimum, + maximum + ) + ); + hMin = Math.min( + hMin, + findMinMaxSkirts( + parameters.eastIndices, + parameters.eastSkirtHeight, + heights, + uvs, + rectangle, + ellipsoid, + toENU, + minimum, + maximum + ) + ); + hMin = Math.min( + hMin, + findMinMaxSkirts( + parameters.northIndices, + parameters.northSkirtHeight, + heights, + uvs, + rectangle, + ellipsoid, + toENU, + minimum, + maximum + ) + ); + const aaBox = new AxisAlignedBoundingBox_default(minimum, maximum, center); + const encoding = new TerrainEncoding_default( + center, + aaBox, + hMin, + maximumHeight, + fromENU, + hasVertexNormals, + includeWebMercatorT, + includeGeodeticSurfaceNormals, + exaggeration, + exaggerationRelativeHeight + ); + const vertexStride = encoding.stride; + const size = quantizedVertexCount * vertexStride + edgeVertexCount * vertexStride; + const vertexBuffer = new Float32Array(size); + let bufferIndex = 0; + for (let j = 0; j < quantizedVertexCount; ++j) { + if (hasVertexNormals) { + const n = j * 2; + toPack.x = octEncodedNormals[n]; + toPack.y = octEncodedNormals[n + 1]; + } + bufferIndex = encoding.encode( + vertexBuffer, + bufferIndex, + positions[j], + uvs[j], + heights[j], + toPack, + webMercatorTs[j], + geodeticSurfaceNormals[j] + ); + } + const edgeTriangleCount = Math.max(0, (edgeVertexCount - 4) * 2); + const indexBufferLength = parameters.indices.length + edgeTriangleCount * 3; + const indexBuffer = IndexDatatype_default.createTypedArray( + quantizedVertexCount + edgeVertexCount, + indexBufferLength + ); + indexBuffer.set(parameters.indices, 0); + const percentage = 1e-4; + const lonOffset = (maxLongitude - minLongitude) * percentage; + const latOffset = (maxLatitude - minLatitude) * percentage; + const westLongitudeOffset = -lonOffset; + const westLatitudeOffset = 0; + const eastLongitudeOffset = lonOffset; + const eastLatitudeOffset = 0; + const northLongitudeOffset = 0; + const northLatitudeOffset = latOffset; + const southLongitudeOffset = 0; + const southLatitudeOffset = -latOffset; + let vertexBufferIndex = quantizedVertexCount * vertexStride; + addSkirt( + vertexBuffer, + vertexBufferIndex, + westIndicesSouthToNorth, + encoding, + heights, + uvs, + octEncodedNormals, + ellipsoid, + rectangle, + parameters.westSkirtHeight, + southMercatorY, + oneOverMercatorHeight, + westLongitudeOffset, + westLatitudeOffset + ); + vertexBufferIndex += parameters.westIndices.length * vertexStride; + addSkirt( + vertexBuffer, + vertexBufferIndex, + southIndicesEastToWest, + encoding, + heights, + uvs, + octEncodedNormals, + ellipsoid, + rectangle, + parameters.southSkirtHeight, + southMercatorY, + oneOverMercatorHeight, + southLongitudeOffset, + southLatitudeOffset + ); + vertexBufferIndex += parameters.southIndices.length * vertexStride; + addSkirt( + vertexBuffer, + vertexBufferIndex, + eastIndicesNorthToSouth, + encoding, + heights, + uvs, + octEncodedNormals, + ellipsoid, + rectangle, + parameters.eastSkirtHeight, + southMercatorY, + oneOverMercatorHeight, + eastLongitudeOffset, + eastLatitudeOffset + ); + vertexBufferIndex += parameters.eastIndices.length * vertexStride; + addSkirt( + vertexBuffer, + vertexBufferIndex, + northIndicesWestToEast, + encoding, + heights, + uvs, + octEncodedNormals, + ellipsoid, + rectangle, + parameters.northSkirtHeight, + southMercatorY, + oneOverMercatorHeight, + northLongitudeOffset, + northLatitudeOffset + ); + TerrainProvider_default.addSkirtIndices( + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast, + quantizedVertexCount, + indexBuffer, + parameters.indices.length + ); + transferableObjects.push(vertexBuffer.buffer, indexBuffer.buffer); + return { + vertices: vertexBuffer.buffer, + indices: indexBuffer.buffer, + westIndicesSouthToNorth, + southIndicesEastToWest, + eastIndicesNorthToSouth, + northIndicesWestToEast, + vertexStride, + center, + minimumHeight, + maximumHeight, + occludeePointInScaledSpace, + encoding, + indexCountWithoutSkirts: parameters.indices.length + }; +} +function findMinMaxSkirts(edgeIndices, edgeHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum) { + let hMin = Number.POSITIVE_INFINITY; + const north = rectangle.north; + const south = rectangle.south; + let east = rectangle.east; + const west = rectangle.west; + if (east < west) { + east += Math_default.TWO_PI; + } + const length = edgeIndices.length; + for (let i = 0; i < length; ++i) { + const index = edgeIndices[i]; + const h = heights[index]; + const uv = uvs[index]; + cartographicScratch.longitude = Math_default.lerp(west, east, uv.x); + cartographicScratch.latitude = Math_default.lerp(south, north, uv.y); + cartographicScratch.height = h - edgeHeight; + const position = ellipsoid.cartographicToCartesian( + cartographicScratch, + cartesian3Scratch + ); + Matrix4_default.multiplyByPoint(toENU, position, position); + Cartesian3_default.minimumByComponent(position, minimum, minimum); + Cartesian3_default.maximumByComponent(position, maximum, maximum); + hMin = Math.min(hMin, cartographicScratch.height); + } + return hMin; +} +function addSkirt(vertexBuffer, vertexBufferIndex, edgeVertices, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, skirtLength, southMercatorY, oneOverMercatorHeight, longitudeOffset, latitudeOffset) { + const hasVertexNormals = defined_default(octEncodedNormals); + const north = rectangle.north; + const south = rectangle.south; + let east = rectangle.east; + const west = rectangle.west; + if (east < west) { + east += Math_default.TWO_PI; + } + const length = edgeVertices.length; + for (let i = 0; i < length; ++i) { + const index = edgeVertices[i]; + const h = heights[index]; + const uv = uvs[index]; + cartographicScratch.longitude = Math_default.lerp(west, east, uv.x) + longitudeOffset; + cartographicScratch.latitude = Math_default.lerp(south, north, uv.y) + latitudeOffset; + cartographicScratch.height = h - skirtLength; + const position = ellipsoid.cartographicToCartesian( + cartographicScratch, + cartesian3Scratch + ); + if (hasVertexNormals) { + const n = index * 2; + toPack.x = octEncodedNormals[n]; + toPack.y = octEncodedNormals[n + 1]; + } + let webMercatorT; + if (encoding.hasWebMercatorT) { + webMercatorT = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle( + cartographicScratch.latitude + ) - southMercatorY) * oneOverMercatorHeight; + } + let geodeticSurfaceNormal; + if (encoding.hasGeodeticSurfaceNormals) { + geodeticSurfaceNormal = ellipsoid.geodeticSurfaceNormal(position); + } + vertexBufferIndex = encoding.encode( + vertexBuffer, + vertexBufferIndex, + position, + uv, + cartographicScratch.height, + toPack, + webMercatorT, + geodeticSurfaceNormal + ); + } +} +function copyAndSort(typedArray, comparator) { + let copy; + if (typeof typedArray.slice === "function") { + copy = typedArray.slice(); + if (typeof copy.sort !== "function") { + copy = void 0; + } + } + if (!defined_default(copy)) { + copy = Array.prototype.slice.call(typedArray); + } + copy.sort(comparator); + return copy; +} +var createVerticesFromQuantizedTerrainMesh_default = createTaskProcessorWorker_default( + createVerticesFromQuantizedTerrainMesh +); +export { + createVerticesFromQuantizedTerrainMesh_default as default +}; diff --git a/public/assets/cesium/Workers/createWallGeometry.js b/public/assets/cesium/Workers/createWallGeometry.js new file mode 100644 index 0000000..504e542 --- /dev/null +++ b/public/assets/cesium/Workers/createWallGeometry.js @@ -0,0 +1,488 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + WallGeometryLibrary_default +} from "./chunk-RTJKHZWU.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import { + VertexFormat_default +} from "./chunk-JBSKHTNX.js"; +import "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/WallGeometry.js +var scratchCartesian3Position1 = new Cartesian3_default(); +var scratchCartesian3Position2 = new Cartesian3_default(); +var scratchCartesian3Position4 = new Cartesian3_default(); +var scratchCartesian3Position5 = new Cartesian3_default(); +var scratchBitangent = new Cartesian3_default(); +var scratchTangent = new Cartesian3_default(); +var scratchNormal = new Cartesian3_default(); +function WallGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const wallPositions = options.positions; + const maximumHeights = options.maximumHeights; + const minimumHeights = options.minimumHeights; + if (!defined_default(wallPositions)) { + throw new DeveloperError_default("options.positions is required."); + } + if (defined_default(maximumHeights) && maximumHeights.length !== wallPositions.length) { + throw new DeveloperError_default( + "options.positions and options.maximumHeights must have the same length." + ); + } + if (defined_default(minimumHeights) && minimumHeights.length !== wallPositions.length) { + throw new DeveloperError_default( + "options.positions and options.minimumHeights must have the same length." + ); + } + const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + this._positions = wallPositions; + this._minimumHeights = minimumHeights; + this._maximumHeights = maximumHeights; + this._vertexFormat = VertexFormat_default.clone(vertexFormat); + this._granularity = granularity; + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._workerName = "createWallGeometry"; + let numComponents = 1 + wallPositions.length * Cartesian3_default.packedLength + 2; + if (defined_default(minimumHeights)) { + numComponents += minimumHeights.length; + } + if (defined_default(maximumHeights)) { + numComponents += maximumHeights.length; + } + this.packedLength = numComponents + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 1; +} +WallGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const minimumHeights = value._minimumHeights; + length = defined_default(minimumHeights) ? minimumHeights.length : 0; + array[startingIndex++] = length; + if (defined_default(minimumHeights)) { + for (i = 0; i < length; ++i) { + array[startingIndex++] = minimumHeights[i]; + } + } + const maximumHeights = value._maximumHeights; + length = defined_default(maximumHeights) ? maximumHeights.length : 0; + array[startingIndex++] = length; + if (defined_default(maximumHeights)) { + for (i = 0; i < length; ++i) { + array[startingIndex++] = maximumHeights[i]; + } + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + VertexFormat_default.pack(value._vertexFormat, array, startingIndex); + startingIndex += VertexFormat_default.packedLength; + array[startingIndex] = value._granularity; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchVertexFormat = new VertexFormat_default(); +var scratchOptions = { + positions: void 0, + minimumHeights: void 0, + maximumHeights: void 0, + ellipsoid: scratchEllipsoid, + vertexFormat: scratchVertexFormat, + granularity: void 0 +}; +WallGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + let minimumHeights; + if (length > 0) { + minimumHeights = new Array(length); + for (i = 0; i < length; ++i) { + minimumHeights[i] = array[startingIndex++]; + } + } + length = array[startingIndex++]; + let maximumHeights; + if (length > 0) { + maximumHeights = new Array(length); + for (i = 0; i < length; ++i) { + maximumHeights[i] = array[startingIndex++]; + } + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const vertexFormat = VertexFormat_default.unpack( + array, + startingIndex, + scratchVertexFormat + ); + startingIndex += VertexFormat_default.packedLength; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.positions = positions; + scratchOptions.minimumHeights = minimumHeights; + scratchOptions.maximumHeights = maximumHeights; + scratchOptions.granularity = granularity; + return new WallGeometry(scratchOptions); + } + result._positions = positions; + result._minimumHeights = minimumHeights; + result._maximumHeights = maximumHeights; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); + result._granularity = granularity; + return result; +}; +WallGeometry.fromConstantHeights = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.positions is required."); + } + let minHeights; + let maxHeights; + const min = options.minimumHeight; + const max = options.maximumHeight; + const doMin = defined_default(min); + const doMax = defined_default(max); + if (doMin || doMax) { + const length = positions.length; + minHeights = doMin ? new Array(length) : void 0; + maxHeights = doMax ? new Array(length) : void 0; + for (let i = 0; i < length; ++i) { + if (doMin) { + minHeights[i] = min; + } + if (doMax) { + maxHeights[i] = max; + } + } + } + const newOptions = { + positions, + maximumHeights: maxHeights, + minimumHeights: minHeights, + ellipsoid: options.ellipsoid, + vertexFormat: options.vertexFormat + }; + return new WallGeometry(newOptions); +}; +WallGeometry.createGeometry = function(wallGeometry) { + const wallPositions = wallGeometry._positions; + const minimumHeights = wallGeometry._minimumHeights; + const maximumHeights = wallGeometry._maximumHeights; + const vertexFormat = wallGeometry._vertexFormat; + const granularity = wallGeometry._granularity; + const ellipsoid = wallGeometry._ellipsoid; + const pos = WallGeometryLibrary_default.computePositions( + ellipsoid, + wallPositions, + maximumHeights, + minimumHeights, + granularity, + true + ); + if (!defined_default(pos)) { + return; + } + const bottomPositions = pos.bottomPositions; + const topPositions = pos.topPositions; + const numCorners = pos.numCorners; + let length = topPositions.length; + let size = length * 2; + const positions = vertexFormat.position ? new Float64Array(size) : void 0; + const normals = vertexFormat.normal ? new Float32Array(size) : void 0; + const tangents = vertexFormat.tangent ? new Float32Array(size) : void 0; + const bitangents = vertexFormat.bitangent ? new Float32Array(size) : void 0; + const textureCoordinates = vertexFormat.st ? new Float32Array(size / 3 * 2) : void 0; + let positionIndex = 0; + let normalIndex = 0; + let bitangentIndex = 0; + let tangentIndex = 0; + let stIndex = 0; + let normal = scratchNormal; + let tangent = scratchTangent; + let bitangent = scratchBitangent; + let recomputeNormal = true; + length /= 3; + let i; + let s = 0; + const ds = 1 / (length - numCorners - 1); + for (i = 0; i < length; ++i) { + const i3 = i * 3; + const topPosition = Cartesian3_default.fromArray( + topPositions, + i3, + scratchCartesian3Position1 + ); + const bottomPosition = Cartesian3_default.fromArray( + bottomPositions, + i3, + scratchCartesian3Position2 + ); + if (vertexFormat.position) { + positions[positionIndex++] = bottomPosition.x; + positions[positionIndex++] = bottomPosition.y; + positions[positionIndex++] = bottomPosition.z; + positions[positionIndex++] = topPosition.x; + positions[positionIndex++] = topPosition.y; + positions[positionIndex++] = topPosition.z; + } + if (vertexFormat.st) { + textureCoordinates[stIndex++] = s; + textureCoordinates[stIndex++] = 0; + textureCoordinates[stIndex++] = s; + textureCoordinates[stIndex++] = 1; + } + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { + let nextTop = Cartesian3_default.clone( + Cartesian3_default.ZERO, + scratchCartesian3Position5 + ); + const groundPosition = Cartesian3_default.subtract( + topPosition, + ellipsoid.geodeticSurfaceNormal( + topPosition, + scratchCartesian3Position2 + ), + scratchCartesian3Position2 + ); + if (i + 1 < length) { + nextTop = Cartesian3_default.fromArray( + topPositions, + i3 + 3, + scratchCartesian3Position5 + ); + } + if (recomputeNormal) { + const scalednextPosition = Cartesian3_default.subtract( + nextTop, + topPosition, + scratchCartesian3Position4 + ); + const scaledGroundPosition = Cartesian3_default.subtract( + groundPosition, + topPosition, + scratchCartesian3Position1 + ); + normal = Cartesian3_default.normalize( + Cartesian3_default.cross(scaledGroundPosition, scalednextPosition, normal), + normal + ); + recomputeNormal = false; + } + if (Cartesian3_default.equalsEpsilon(topPosition, nextTop, Math_default.EPSILON10)) { + recomputeNormal = true; + } else { + s += ds; + if (vertexFormat.tangent) { + tangent = Cartesian3_default.normalize( + Cartesian3_default.subtract(nextTop, topPosition, tangent), + tangent + ); + } + if (vertexFormat.bitangent) { + bitangent = Cartesian3_default.normalize( + Cartesian3_default.cross(normal, tangent, bitangent), + bitangent + ); + } + } + if (vertexFormat.normal) { + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + normals[normalIndex++] = normal.x; + normals[normalIndex++] = normal.y; + normals[normalIndex++] = normal.z; + } + if (vertexFormat.tangent) { + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + tangents[tangentIndex++] = tangent.x; + tangents[tangentIndex++] = tangent.y; + tangents[tangentIndex++] = tangent.z; + } + if (vertexFormat.bitangent) { + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + bitangents[bitangentIndex++] = bitangent.x; + bitangents[bitangentIndex++] = bitangent.y; + bitangents[bitangentIndex++] = bitangent.z; + } + } + } + const attributes = new GeometryAttributes_default(); + if (vertexFormat.position) { + attributes.position = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }); + } + if (vertexFormat.normal) { + attributes.normal = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: normals + }); + } + if (vertexFormat.tangent) { + attributes.tangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: tangents + }); + } + if (vertexFormat.bitangent) { + attributes.bitangent = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 3, + values: bitangents + }); + } + if (vertexFormat.st) { + attributes.st = new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.FLOAT, + componentsPerAttribute: 2, + values: textureCoordinates + }); + } + const numVertices = size / 3; + size -= 6 * (numCorners + 1); + const indices = IndexDatatype_default.createTypedArray(numVertices, size); + let edgeIndex = 0; + for (i = 0; i < numVertices - 2; i += 2) { + const LL = i; + const LR = i + 2; + const pl = Cartesian3_default.fromArray( + positions, + LL * 3, + scratchCartesian3Position1 + ); + const pr = Cartesian3_default.fromArray( + positions, + LR * 3, + scratchCartesian3Position2 + ); + if (Cartesian3_default.equalsEpsilon(pl, pr, Math_default.EPSILON10)) { + continue; + } + const UL = i + 1; + const UR = i + 3; + indices[edgeIndex++] = UL; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = UR; + indices[edgeIndex++] = UR; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = LR; + } + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.TRIANGLES, + boundingSphere: new BoundingSphere_default.fromVertices(positions) + }); +}; +var WallGeometry_default = WallGeometry; + +// packages/engine/Source/Workers/createWallGeometry.js +function createWallGeometry(wallGeometry, offset) { + if (defined_default(offset)) { + wallGeometry = WallGeometry_default.unpack(wallGeometry, offset); + } + wallGeometry._ellipsoid = Ellipsoid_default.clone(wallGeometry._ellipsoid); + return WallGeometry_default.createGeometry(wallGeometry); +} +var createWallGeometry_default = createWallGeometry; +export { + createWallGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/createWallOutlineGeometry.js b/public/assets/cesium/Workers/createWallOutlineGeometry.js new file mode 100644 index 0000000..42a77a9 --- /dev/null +++ b/public/assets/cesium/Workers/createWallOutlineGeometry.js @@ -0,0 +1,336 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + WallGeometryLibrary_default +} from "./chunk-RTJKHZWU.js"; +import "./chunk-QN6TBED4.js"; +import "./chunk-C3EQ27WF.js"; +import "./chunk-57H6I3SV.js"; +import "./chunk-JSQJDZI4.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + GeometryAttributes_default +} from "./chunk-X7IQYYHF.js"; +import { + GeometryAttribute_default, + Geometry_default, + PrimitiveType_default +} from "./chunk-JXVLNVXC.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import "./chunk-6SQMLVGV.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import { + Cartesian3_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/WallOutlineGeometry.js +var scratchCartesian3Position1 = new Cartesian3_default(); +var scratchCartesian3Position2 = new Cartesian3_default(); +function WallOutlineGeometry(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const wallPositions = options.positions; + const maximumHeights = options.maximumHeights; + const minimumHeights = options.minimumHeights; + if (!defined_default(wallPositions)) { + throw new DeveloperError_default("options.positions is required."); + } + if (defined_default(maximumHeights) && maximumHeights.length !== wallPositions.length) { + throw new DeveloperError_default( + "options.positions and options.maximumHeights must have the same length." + ); + } + if (defined_default(minimumHeights) && minimumHeights.length !== wallPositions.length) { + throw new DeveloperError_default( + "options.positions and options.minimumHeights must have the same length." + ); + } + const granularity = defaultValue_default( + options.granularity, + Math_default.RADIANS_PER_DEGREE + ); + const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default); + this._positions = wallPositions; + this._minimumHeights = minimumHeights; + this._maximumHeights = maximumHeights; + this._granularity = granularity; + this._ellipsoid = Ellipsoid_default.clone(ellipsoid); + this._workerName = "createWallOutlineGeometry"; + let numComponents = 1 + wallPositions.length * Cartesian3_default.packedLength + 2; + if (defined_default(minimumHeights)) { + numComponents += minimumHeights.length; + } + if (defined_default(maximumHeights)) { + numComponents += maximumHeights.length; + } + this.packedLength = numComponents + Ellipsoid_default.packedLength + 1; +} +WallOutlineGeometry.pack = function(value, array, startingIndex) { + if (!defined_default(value)) { + throw new DeveloperError_default("value is required"); + } + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + const positions = value._positions; + let length = positions.length; + array[startingIndex++] = length; + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + Cartesian3_default.pack(positions[i], array, startingIndex); + } + const minimumHeights = value._minimumHeights; + length = defined_default(minimumHeights) ? minimumHeights.length : 0; + array[startingIndex++] = length; + if (defined_default(minimumHeights)) { + for (i = 0; i < length; ++i) { + array[startingIndex++] = minimumHeights[i]; + } + } + const maximumHeights = value._maximumHeights; + length = defined_default(maximumHeights) ? maximumHeights.length : 0; + array[startingIndex++] = length; + if (defined_default(maximumHeights)) { + for (i = 0; i < length; ++i) { + array[startingIndex++] = maximumHeights[i]; + } + } + Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); + startingIndex += Ellipsoid_default.packedLength; + array[startingIndex] = value._granularity; + return array; +}; +var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); +var scratchOptions = { + positions: void 0, + minimumHeights: void 0, + maximumHeights: void 0, + ellipsoid: scratchEllipsoid, + granularity: void 0 +}; +WallOutlineGeometry.unpack = function(array, startingIndex, result) { + if (!defined_default(array)) { + throw new DeveloperError_default("array is required"); + } + startingIndex = defaultValue_default(startingIndex, 0); + let i; + let length = array[startingIndex++]; + const positions = new Array(length); + for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { + positions[i] = Cartesian3_default.unpack(array, startingIndex); + } + length = array[startingIndex++]; + let minimumHeights; + if (length > 0) { + minimumHeights = new Array(length); + for (i = 0; i < length; ++i) { + minimumHeights[i] = array[startingIndex++]; + } + } + length = array[startingIndex++]; + let maximumHeights; + if (length > 0) { + maximumHeights = new Array(length); + for (i = 0; i < length; ++i) { + maximumHeights[i] = array[startingIndex++]; + } + } + const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); + startingIndex += Ellipsoid_default.packedLength; + const granularity = array[startingIndex]; + if (!defined_default(result)) { + scratchOptions.positions = positions; + scratchOptions.minimumHeights = minimumHeights; + scratchOptions.maximumHeights = maximumHeights; + scratchOptions.granularity = granularity; + return new WallOutlineGeometry(scratchOptions); + } + result._positions = positions; + result._minimumHeights = minimumHeights; + result._maximumHeights = maximumHeights; + result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); + result._granularity = granularity; + return result; +}; +WallOutlineGeometry.fromConstantHeights = function(options) { + options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); + const positions = options.positions; + if (!defined_default(positions)) { + throw new DeveloperError_default("options.positions is required."); + } + let minHeights; + let maxHeights; + const min = options.minimumHeight; + const max = options.maximumHeight; + const doMin = defined_default(min); + const doMax = defined_default(max); + if (doMin || doMax) { + const length = positions.length; + minHeights = doMin ? new Array(length) : void 0; + maxHeights = doMax ? new Array(length) : void 0; + for (let i = 0; i < length; ++i) { + if (doMin) { + minHeights[i] = min; + } + if (doMax) { + maxHeights[i] = max; + } + } + } + const newOptions = { + positions, + maximumHeights: maxHeights, + minimumHeights: minHeights, + ellipsoid: options.ellipsoid + }; + return new WallOutlineGeometry(newOptions); +}; +WallOutlineGeometry.createGeometry = function(wallGeometry) { + const wallPositions = wallGeometry._positions; + const minimumHeights = wallGeometry._minimumHeights; + const maximumHeights = wallGeometry._maximumHeights; + const granularity = wallGeometry._granularity; + const ellipsoid = wallGeometry._ellipsoid; + const pos = WallGeometryLibrary_default.computePositions( + ellipsoid, + wallPositions, + maximumHeights, + minimumHeights, + granularity, + false + ); + if (!defined_default(pos)) { + return; + } + const bottomPositions = pos.bottomPositions; + const topPositions = pos.topPositions; + let length = topPositions.length; + let size = length * 2; + const positions = new Float64Array(size); + let positionIndex = 0; + length /= 3; + let i; + for (i = 0; i < length; ++i) { + const i3 = i * 3; + const topPosition = Cartesian3_default.fromArray( + topPositions, + i3, + scratchCartesian3Position1 + ); + const bottomPosition = Cartesian3_default.fromArray( + bottomPositions, + i3, + scratchCartesian3Position2 + ); + positions[positionIndex++] = bottomPosition.x; + positions[positionIndex++] = bottomPosition.y; + positions[positionIndex++] = bottomPosition.z; + positions[positionIndex++] = topPosition.x; + positions[positionIndex++] = topPosition.y; + positions[positionIndex++] = topPosition.z; + } + const attributes = new GeometryAttributes_default({ + position: new GeometryAttribute_default({ + componentDatatype: ComponentDatatype_default.DOUBLE, + componentsPerAttribute: 3, + values: positions + }) + }); + const numVertices = size / 3; + size = 2 * numVertices - 4 + numVertices; + const indices = IndexDatatype_default.createTypedArray(numVertices, size); + let edgeIndex = 0; + for (i = 0; i < numVertices - 2; i += 2) { + const LL = i; + const LR = i + 2; + const pl = Cartesian3_default.fromArray( + positions, + LL * 3, + scratchCartesian3Position1 + ); + const pr = Cartesian3_default.fromArray( + positions, + LR * 3, + scratchCartesian3Position2 + ); + if (Cartesian3_default.equalsEpsilon(pl, pr, Math_default.EPSILON10)) { + continue; + } + const UL = i + 1; + const UR = i + 3; + indices[edgeIndex++] = UL; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = UL; + indices[edgeIndex++] = UR; + indices[edgeIndex++] = LL; + indices[edgeIndex++] = LR; + } + indices[edgeIndex++] = numVertices - 2; + indices[edgeIndex++] = numVertices - 1; + return new Geometry_default({ + attributes, + indices, + primitiveType: PrimitiveType_default.LINES, + boundingSphere: new BoundingSphere_default.fromVertices(positions) + }); +}; +var WallOutlineGeometry_default = WallOutlineGeometry; + +// packages/engine/Source/Workers/createWallOutlineGeometry.js +function createWallOutlineGeometry(wallGeometry, offset) { + if (defined_default(offset)) { + wallGeometry = WallOutlineGeometry_default.unpack(wallGeometry, offset); + } + wallGeometry._ellipsoid = Ellipsoid_default.clone(wallGeometry._ellipsoid); + return WallOutlineGeometry_default.createGeometry(wallGeometry); +} +var createWallOutlineGeometry_default = createWallOutlineGeometry; +export { + createWallOutlineGeometry_default as default +}; diff --git a/public/assets/cesium/Workers/decodeDraco.js b/public/assets/cesium/Workers/decodeDraco.js new file mode 100644 index 0000000..f3e8908 --- /dev/null +++ b/public/assets/cesium/Workers/decodeDraco.js @@ -0,0 +1,369 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + require_draco_decoder_nodejs +} from "./chunk-M24KHENR.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + ComponentDatatype_default +} from "./chunk-XIUSRWL6.js"; +import "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import "./chunk-P6TRGU3S.js"; +import { + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/decodeDraco.js +var import_draco_decoder_nodejs = __toESM(require_draco_decoder_nodejs(), 1); +var draco; +function decodeIndexArray(dracoGeometry, dracoDecoder) { + const numPoints = dracoGeometry.num_points(); + const numFaces = dracoGeometry.num_faces(); + const faceIndices = new draco.DracoInt32Array(); + const numIndices = numFaces * 3; + const indexArray = IndexDatatype_default.createTypedArray(numPoints, numIndices); + let offset = 0; + for (let i = 0; i < numFaces; ++i) { + dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices); + indexArray[offset + 0] = faceIndices.GetValue(0); + indexArray[offset + 1] = faceIndices.GetValue(1); + indexArray[offset + 2] = faceIndices.GetValue(2); + offset += 3; + } + draco.destroy(faceIndices); + return { + typedArray: indexArray, + numberOfIndices: numIndices + }; +} +function decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength) { + let vertexArray; + let attributeData; + if (quantization.quantizationBits <= 8) { + attributeData = new draco.DracoUInt8Array(); + vertexArray = new Uint8Array(vertexArrayLength); + dracoDecoder.GetAttributeUInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + } else if (quantization.quantizationBits <= 16) { + attributeData = new draco.DracoUInt16Array(); + vertexArray = new Uint16Array(vertexArrayLength); + dracoDecoder.GetAttributeUInt16ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + } else { + attributeData = new draco.DracoFloat32Array(); + vertexArray = new Float32Array(vertexArrayLength); + dracoDecoder.GetAttributeFloatForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + } + for (let i = 0; i < vertexArrayLength; ++i) { + vertexArray[i] = attributeData.GetValue(i); + } + draco.destroy(attributeData); + return vertexArray; +} +function decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength) { + let vertexArray; + let attributeData; + switch (dracoAttribute.data_type()) { + case 1: + case 11: + attributeData = new draco.DracoInt8Array(); + vertexArray = new Int8Array(vertexArrayLength); + dracoDecoder.GetAttributeInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 2: + attributeData = new draco.DracoUInt8Array(); + vertexArray = new Uint8Array(vertexArrayLength); + dracoDecoder.GetAttributeUInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 3: + attributeData = new draco.DracoInt16Array(); + vertexArray = new Int16Array(vertexArrayLength); + dracoDecoder.GetAttributeInt16ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 4: + attributeData = new draco.DracoUInt16Array(); + vertexArray = new Uint16Array(vertexArrayLength); + dracoDecoder.GetAttributeUInt16ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 5: + case 7: + attributeData = new draco.DracoInt32Array(); + vertexArray = new Int32Array(vertexArrayLength); + dracoDecoder.GetAttributeInt32ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 6: + case 8: + attributeData = new draco.DracoUInt32Array(); + vertexArray = new Uint32Array(vertexArrayLength); + dracoDecoder.GetAttributeUInt32ForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + case 9: + case 10: + attributeData = new draco.DracoFloat32Array(); + vertexArray = new Float32Array(vertexArrayLength); + dracoDecoder.GetAttributeFloatForAllPoints( + dracoGeometry, + dracoAttribute, + attributeData + ); + break; + } + for (let i = 0; i < vertexArrayLength; ++i) { + vertexArray[i] = attributeData.GetValue(i); + } + draco.destroy(attributeData); + return vertexArray; +} +function decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute) { + const numPoints = dracoGeometry.num_points(); + const numComponents = dracoAttribute.num_components(); + let quantization; + let transform = new draco.AttributeQuantizationTransform(); + if (transform.InitFromAttribute(dracoAttribute)) { + const minValues = new Array(numComponents); + for (let i = 0; i < numComponents; ++i) { + minValues[i] = transform.min_value(i); + } + quantization = { + quantizationBits: transform.quantization_bits(), + minValues, + range: transform.range(), + octEncoded: false + }; + } + draco.destroy(transform); + transform = new draco.AttributeOctahedronTransform(); + if (transform.InitFromAttribute(dracoAttribute)) { + quantization = { + quantizationBits: transform.quantization_bits(), + octEncoded: true + }; + } + draco.destroy(transform); + const vertexArrayLength = numPoints * numComponents; + let vertexArray; + if (defined_default(quantization)) { + vertexArray = decodeQuantizedDracoTypedArray( + dracoGeometry, + dracoDecoder, + dracoAttribute, + quantization, + vertexArrayLength + ); + } else { + vertexArray = decodeDracoTypedArray( + dracoGeometry, + dracoDecoder, + dracoAttribute, + vertexArrayLength + ); + } + const componentDatatype = ComponentDatatype_default.fromTypedArray(vertexArray); + return { + array: vertexArray, + data: { + componentsPerAttribute: numComponents, + componentDatatype, + byteOffset: dracoAttribute.byte_offset(), + byteStride: ComponentDatatype_default.getSizeInBytes(componentDatatype) * numComponents, + normalized: dracoAttribute.normalized(), + quantization + } + }; +} +function decodePointCloud(parameters) { + const dracoDecoder = new draco.Decoder(); + if (parameters.dequantizeInShader) { + dracoDecoder.SkipAttributeTransform(draco.POSITION); + dracoDecoder.SkipAttributeTransform(draco.NORMAL); + } + const buffer = new draco.DecoderBuffer(); + buffer.Init(parameters.buffer, parameters.buffer.length); + const geometryType = dracoDecoder.GetEncodedGeometryType(buffer); + if (geometryType !== draco.POINT_CLOUD) { + throw new RuntimeError_default("Draco geometry type must be POINT_CLOUD."); + } + const dracoPointCloud = new draco.PointCloud(); + const decodingStatus = dracoDecoder.DecodeBufferToPointCloud( + buffer, + dracoPointCloud + ); + if (!decodingStatus.ok() || dracoPointCloud.ptr === 0) { + throw new RuntimeError_default( + `Error decoding draco point cloud: ${decodingStatus.error_msg()}` + ); + } + draco.destroy(buffer); + const result = {}; + const properties = parameters.properties; + for (const propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + let dracoAttribute; + if (propertyName === "POSITION" || propertyName === "NORMAL") { + const dracoAttributeId = dracoDecoder.GetAttributeId( + dracoPointCloud, + draco[propertyName] + ); + dracoAttribute = dracoDecoder.GetAttribute( + dracoPointCloud, + dracoAttributeId + ); + } else { + const attributeId = properties[propertyName]; + dracoAttribute = dracoDecoder.GetAttributeByUniqueId( + dracoPointCloud, + attributeId + ); + } + result[propertyName] = decodeAttribute( + dracoPointCloud, + dracoDecoder, + dracoAttribute + ); + } + } + draco.destroy(dracoPointCloud); + draco.destroy(dracoDecoder); + return result; +} +function decodePrimitive(parameters) { + const dracoDecoder = new draco.Decoder(); + const attributesToSkip = ["POSITION", "NORMAL", "COLOR", "TEX_COORD"]; + if (parameters.dequantizeInShader) { + for (let i = 0; i < attributesToSkip.length; ++i) { + dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]); + } + } + const bufferView = parameters.bufferView; + const buffer = new draco.DecoderBuffer(); + buffer.Init(parameters.array, bufferView.byteLength); + const geometryType = dracoDecoder.GetEncodedGeometryType(buffer); + if (geometryType !== draco.TRIANGULAR_MESH) { + throw new RuntimeError_default("Unsupported draco mesh geometry type."); + } + const dracoGeometry = new draco.Mesh(); + const decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry); + if (!decodingStatus.ok() || dracoGeometry.ptr === 0) { + throw new RuntimeError_default( + `Error decoding draco mesh geometry: ${decodingStatus.error_msg()}` + ); + } + draco.destroy(buffer); + const attributeData = {}; + const compressedAttributes = parameters.compressedAttributes; + for (const attributeName in compressedAttributes) { + if (compressedAttributes.hasOwnProperty(attributeName)) { + const compressedAttribute = compressedAttributes[attributeName]; + const dracoAttribute = dracoDecoder.GetAttributeByUniqueId( + dracoGeometry, + compressedAttribute + ); + attributeData[attributeName] = decodeAttribute( + dracoGeometry, + dracoDecoder, + dracoAttribute + ); + } + } + const result = { + indexArray: decodeIndexArray(dracoGeometry, dracoDecoder), + attributeData + }; + draco.destroy(dracoGeometry); + draco.destroy(dracoDecoder); + return result; +} +async function decode(parameters, transferableObjects) { + if (defined_default(parameters.bufferView)) { + return decodePrimitive(parameters); + } + return decodePointCloud(parameters); +} +async function initWorker(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + if (defined_default(wasmConfig) && defined_default(wasmConfig.wasmBinaryFile)) { + draco = await (0, import_draco_decoder_nodejs.default)(wasmConfig); + } else { + draco = await (0, import_draco_decoder_nodejs.default)(); + } + return true; +} +async function decodeDraco(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + if (defined_default(wasmConfig)) { + return initWorker(parameters, transferableObjects); + } + return decode(parameters, transferableObjects); +} +var decodeDraco_default = createTaskProcessorWorker_default(decodeDraco); +export { + decodeDraco_default as default +}; diff --git a/public/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js b/public/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js new file mode 100644 index 0000000..f6bb387 --- /dev/null +++ b/public/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js @@ -0,0 +1,2666 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + __commonJS, + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// node_modules/pako/lib/zlib/adler32.js +var require_adler32 = __commonJS({ + "node_modules/pako/lib/zlib/adler32.js"(exports, module) { + "use strict"; + var adler32 = (adler, buf, len, pos) => { + let s1 = adler & 65535 | 0, s2 = adler >>> 16 & 65535 | 0, n = 0; + while (len !== 0) { + n = len > 2e3 ? 2e3 : len; + len -= n; + do { + s1 = s1 + buf[pos++] | 0; + s2 = s2 + s1 | 0; + } while (--n); + s1 %= 65521; + s2 %= 65521; + } + return s1 | s2 << 16 | 0; + }; + module.exports = adler32; + } +}); + +// node_modules/pako/lib/zlib/crc32.js +var require_crc32 = __commonJS({ + "node_modules/pako/lib/zlib/crc32.js"(exports, module) { + "use strict"; + var makeTable = () => { + let c, table = []; + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1; + } + table[n] = c; + } + return table; + }; + var crcTable = new Uint32Array(makeTable()); + var crc32 = (crc, buf, len, pos) => { + const t = crcTable; + const end = pos + len; + crc ^= -1; + for (let i = pos; i < end; i++) { + crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 255]; + } + return crc ^ -1; + }; + module.exports = crc32; + } +}); + +// node_modules/pako/lib/zlib/inffast.js +var require_inffast = __commonJS({ + "node_modules/pako/lib/zlib/inffast.js"(exports, module) { + "use strict"; + var BAD = 16209; + var TYPE = 16191; + module.exports = function inflate_fast(strm, start) { + let _in; + let last; + let _out; + let beg; + let end; + let dmax; + let wsize; + let whave; + let wnext; + let s_window; + let hold; + let bits; + let lcode; + let dcode; + let lmask; + let dmask; + let here; + let op; + let len; + let dist; + let from; + let from_source; + let input, output; + const state = strm.state; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); + dmax = state.dmax; + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + for (; ; ) { + op = here >>> 24; + hold >>>= op; + bits -= op; + op = here >>> 16 & 255; + if (op === 0) { + output[_out++] = here & 65535; + } else if (op & 16) { + len = here & 65535; + op &= 15; + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & (1 << op) - 1; + hold >>>= op; + bits -= op; + } + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + for (; ; ) { + op = here >>> 24; + hold >>>= op; + bits -= op; + op = here >>> 16 & 255; + if (op & 16) { + dist = here & 65535; + op &= 15; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & (1 << op) - 1; + if (dist > dmax) { + strm.msg = "invalid distance too far back"; + state.mode = BAD; + break top; + } + hold >>>= op; + bits -= op; + op = _out - beg; + if (dist > op) { + op = dist - op; + if (op > whave) { + if (state.sane) { + strm.msg = "invalid distance too far back"; + state.mode = BAD; + break top; + } + } + from = 0; + from_source = s_window; + if (wnext === 0) { + from += wsize - op; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; + from_source = output; + } + } else if (wnext < op) { + from += wsize + wnext - op; + op -= wnext; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; + from_source = output; + } + } + } else { + from += wnext - op; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } else { + from = _out - dist; + do { + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } else if ((op & 64) === 0) { + here = dcode[(here & 65535) + (hold & (1 << op) - 1)]; + continue dodist; + } else { + strm.msg = "invalid distance code"; + state.mode = BAD; + break top; + } + break; + } + } else if ((op & 64) === 0) { + here = lcode[(here & 65535) + (hold & (1 << op) - 1)]; + continue dolen; + } else if (op & 32) { + state.mode = TYPE; + break top; + } else { + strm.msg = "invalid literal/length code"; + state.mode = BAD; + break top; + } + break; + } + } while (_in < last && _out < end); + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); + strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); + state.hold = hold; + state.bits = bits; + return; + }; + } +}); + +// node_modules/pako/lib/zlib/inftrees.js +var require_inftrees = __commonJS({ + "node_modules/pako/lib/zlib/inftrees.js"(exports, module) { + "use strict"; + var MAXBITS = 15; + var ENOUGH_LENS = 852; + var ENOUGH_DISTS = 592; + var CODES = 0; + var LENS = 1; + var DISTS = 2; + var lbase = new Uint16Array([ + /* Length codes 257..285 base */ + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258, + 0, + 0 + ]); + var lext = new Uint8Array([ + /* Length codes 257..285 extra */ + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 17, + 17, + 17, + 17, + 18, + 18, + 18, + 18, + 19, + 19, + 19, + 19, + 20, + 20, + 20, + 20, + 21, + 21, + 21, + 21, + 16, + 72, + 78 + ]); + var dbase = new Uint16Array([ + /* Distance codes 0..29 base */ + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577, + 0, + 0 + ]); + var dext = new Uint8Array([ + /* Distance codes 0..29 extra */ + 16, + 16, + 16, + 16, + 17, + 17, + 18, + 18, + 19, + 19, + 20, + 20, + 21, + 21, + 22, + 22, + 23, + 23, + 24, + 24, + 25, + 25, + 26, + 26, + 27, + 27, + 28, + 28, + 29, + 29, + 64, + 64 + ]); + var inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => { + const bits = opts.bits; + let len = 0; + let sym = 0; + let min = 0, max = 0; + let root = 0; + let curr = 0; + let drop = 0; + let left = 0; + let used = 0; + let huff = 0; + let incr; + let fill; + let low; + let mask; + let next; + let base = null; + let match; + const count = new Uint16Array(MAXBITS + 1); + const offs = new Uint16Array(MAXBITS + 1); + let extra = null; + let here_bits, here_op, here_val; + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { + break; + } + } + if (root > max) { + root = max; + } + if (max === 0) { + table[table_index++] = 1 << 24 | 64 << 16 | 0; + table[table_index++] = 1 << 24 | 64 << 16 | 0; + opts.bits = 1; + return 0; + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { + break; + } + } + if (root < min) { + root = min; + } + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } + } + if (left > 0 && (type === CODES || max !== 1)) { + return -1; + } + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + if (type === CODES) { + base = extra = work; + match = 20; + } else if (type === LENS) { + base = lbase; + extra = lext; + match = 257; + } else { + base = dbase; + extra = dext; + match = 0; + } + huff = 0; + sym = 0; + len = min; + next = table_index; + curr = root; + drop = 0; + low = -1; + used = 1 << root; + mask = used - 1; + if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { + return 1; + } + for (; ; ) { + here_bits = len - drop; + if (work[sym] + 1 < match) { + here_op = 0; + here_val = work[sym]; + } else if (work[sym] >= match) { + here_op = extra[work[sym] - match]; + here_val = base[work[sym] - match]; + } else { + here_op = 32 + 64; + here_val = 0; + } + incr = 1 << len - drop; + fill = 1 << curr; + min = fill; + do { + fill -= incr; + table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; + } while (fill !== 0); + incr = 1 << len - 1; + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + sym++; + if (--count[len] === 0) { + if (len === max) { + break; + } + len = lens[lens_index + work[sym]]; + } + if (len > root && (huff & mask) !== low) { + if (drop === 0) { + drop = root; + } + next += min; + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { + break; + } + curr++; + left <<= 1; + } + used += 1 << curr; + if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { + return 1; + } + low = huff & mask; + table[low] = root << 24 | curr << 16 | next - table_index | 0; + } + } + if (huff !== 0) { + table[next + huff] = len - drop << 24 | 64 << 16 | 0; + } + opts.bits = root; + return 0; + }; + module.exports = inflate_table; + } +}); + +// node_modules/pako/lib/zlib/constants.js +var require_constants = __commonJS({ + "node_modules/pako/lib/zlib/constants.js"(exports, module) { + "use strict"; + module.exports = { + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type + }; + } +}); + +// node_modules/pako/lib/zlib/inflate.js +var require_inflate = __commonJS({ + "node_modules/pako/lib/zlib/inflate.js"(exports, module) { + "use strict"; + var adler32 = require_adler32(); + var crc32 = require_crc32(); + var inflate_fast = require_inffast(); + var inflate_table = require_inftrees(); + var CODES = 0; + var LENS = 1; + var DISTS = 2; + var { + Z_FINISH, + Z_BLOCK, + Z_TREES, + Z_OK, + Z_STREAM_END, + Z_NEED_DICT, + Z_STREAM_ERROR, + Z_DATA_ERROR, + Z_MEM_ERROR, + Z_BUF_ERROR, + Z_DEFLATED + } = require_constants(); + var HEAD = 16180; + var FLAGS = 16181; + var TIME = 16182; + var OS = 16183; + var EXLEN = 16184; + var EXTRA = 16185; + var NAME = 16186; + var COMMENT = 16187; + var HCRC = 16188; + var DICTID = 16189; + var DICT = 16190; + var TYPE = 16191; + var TYPEDO = 16192; + var STORED = 16193; + var COPY_ = 16194; + var COPY = 16195; + var TABLE = 16196; + var LENLENS = 16197; + var CODELENS = 16198; + var LEN_ = 16199; + var LEN = 16200; + var LENEXT = 16201; + var DIST = 16202; + var DISTEXT = 16203; + var MATCH = 16204; + var LIT = 16205; + var CHECK = 16206; + var LENGTH = 16207; + var DONE = 16208; + var BAD = 16209; + var MEM = 16210; + var SYNC = 16211; + var ENOUGH_LENS = 852; + var ENOUGH_DISTS = 592; + var MAX_WBITS = 15; + var DEF_WBITS = MAX_WBITS; + var zswap32 = (q) => { + return (q >>> 24 & 255) + (q >>> 8 & 65280) + ((q & 65280) << 8) + ((q & 255) << 24); + }; + function InflateState() { + this.strm = null; + this.mode = 0; + this.last = false; + this.wrap = 0; + this.havedict = false; + this.flags = 0; + this.dmax = 0; + this.check = 0; + this.total = 0; + this.head = null; + this.wbits = 0; + this.wsize = 0; + this.whave = 0; + this.wnext = 0; + this.window = null; + this.hold = 0; + this.bits = 0; + this.length = 0; + this.offset = 0; + this.extra = 0; + this.lencode = null; + this.distcode = null; + this.lenbits = 0; + this.distbits = 0; + this.ncode = 0; + this.nlen = 0; + this.ndist = 0; + this.have = 0; + this.next = null; + this.lens = new Uint16Array(320); + this.work = new Uint16Array(288); + this.lendyn = null; + this.distdyn = null; + this.sane = 0; + this.back = 0; + this.was = 0; + } + var inflateStateCheck = (strm) => { + if (!strm) { + return 1; + } + const state = strm.state; + if (!state || state.strm !== strm || state.mode < HEAD || state.mode > SYNC) { + return 1; + } + return 0; + }; + var inflateResetKeep = (strm) => { + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + const state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ""; + if (state.wrap) { + strm.adler = state.wrap & 1; + } + state.mode = HEAD; + state.last = 0; + state.havedict = 0; + state.flags = -1; + state.dmax = 32768; + state.head = null; + state.hold = 0; + state.bits = 0; + state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); + state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); + state.sane = 1; + state.back = -1; + return Z_OK; + }; + var inflateReset = (strm) => { + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + const state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep(strm); + }; + var inflateReset2 = (strm, windowBits) => { + let wrap; + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + const state = strm.state; + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } else { + wrap = (windowBits >> 4) + 5; + if (windowBits < 48) { + windowBits &= 15; + } + } + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; + } + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset(strm); + }; + var inflateInit2 = (strm, windowBits) => { + if (!strm) { + return Z_STREAM_ERROR; + } + const state = new InflateState(); + strm.state = state; + state.strm = strm; + state.window = null; + state.mode = HEAD; + const ret = inflateReset2(strm, windowBits); + if (ret !== Z_OK) { + strm.state = null; + } + return ret; + }; + var inflateInit = (strm) => { + return inflateInit2(strm, DEF_WBITS); + }; + var virgin = true; + var lenfix; + var distfix; + var fixedtables = (state) => { + if (virgin) { + lenfix = new Int32Array(512); + distfix = new Int32Array(32); + let sym = 0; + while (sym < 144) { + state.lens[sym++] = 8; + } + while (sym < 256) { + state.lens[sym++] = 9; + } + while (sym < 280) { + state.lens[sym++] = 7; + } + while (sym < 288) { + state.lens[sym++] = 8; + } + inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); + sym = 0; + while (sym < 32) { + state.lens[sym++] = 5; + } + inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); + virgin = false; + } + state.lencode = lenfix; + state.lenbits = 9; + state.distcode = distfix; + state.distbits = 5; + }; + var updatewindow = (strm, src, end, copy) => { + let dist; + const state = strm.state; + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; + state.window = new Uint8Array(state.wsize); + } + if (copy >= state.wsize) { + state.window.set(src.subarray(end - state.wsize, end), 0); + state.wnext = 0; + state.whave = state.wsize; + } else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; + } + state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); + copy -= dist; + if (copy) { + state.window.set(src.subarray(end - copy, end), 0); + state.wnext = copy; + state.whave = state.wsize; + } else { + state.wnext += dist; + if (state.wnext === state.wsize) { + state.wnext = 0; + } + if (state.whave < state.wsize) { + state.whave += dist; + } + } + } + return 0; + }; + var inflate = (strm, flush) => { + let state; + let input, output; + let next; + let put; + let have, left; + let hold; + let bits; + let _in, _out; + let copy; + let from; + let from_source; + let here = 0; + let here_bits, here_op, here_val; + let last_bits, last_op, last_val; + let len; + let ret; + const hbuf = new Uint8Array(4); + let opts; + let n; + const order = ( + /* permutation of code lengths */ + new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]) + ); + if (inflateStateCheck(strm) || !strm.output || !strm.input && strm.avail_in !== 0) { + return Z_STREAM_ERROR; + } + state = strm.state; + if (state.mode === TYPE) { + state.mode = TYPEDO; + } + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + _in = have; + _out = left; + ret = Z_OK; + inf_leave: + for (; ; ) { + switch (state.mode) { + case HEAD: + if (state.wrap === 0) { + state.mode = TYPEDO; + break; + } + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state.wrap & 2 && hold === 35615) { + if (state.wbits === 0) { + state.wbits = 15; + } + state.check = 0; + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state.check = crc32(state.check, hbuf, 2, 0); + hold = 0; + bits = 0; + state.mode = FLAGS; + break; + } + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 255) << 8) + (hold >> 8)) % 31) { + strm.msg = "incorrect header check"; + state.mode = BAD; + break; + } + if ((hold & 15) !== Z_DEFLATED) { + strm.msg = "unknown compression method"; + state.mode = BAD; + break; + } + hold >>>= 4; + bits -= 4; + len = (hold & 15) + 8; + if (state.wbits === 0) { + state.wbits = len; + } + if (len > 15 || len > state.wbits) { + strm.msg = "invalid window size"; + state.mode = BAD; + break; + } + state.dmax = 1 << state.wbits; + state.flags = 0; + strm.adler = state.check = 1; + state.mode = hold & 512 ? DICTID : TYPE; + hold = 0; + bits = 0; + break; + case FLAGS: + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.flags = hold; + if ((state.flags & 255) !== Z_DEFLATED) { + strm.msg = "unknown compression method"; + state.mode = BAD; + break; + } + if (state.flags & 57344) { + strm.msg = "unknown header flags set"; + state.mode = BAD; + break; + } + if (state.head) { + state.head.text = hold >> 8 & 1; + } + if (state.flags & 512 && state.wrap & 4) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state.check = crc32(state.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + state.mode = TIME; + /* falls through */ + case TIME: + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state.head) { + state.head.time = hold; + } + if (state.flags & 512 && state.wrap & 4) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + hbuf[2] = hold >>> 16 & 255; + hbuf[3] = hold >>> 24 & 255; + state.check = crc32(state.check, hbuf, 4, 0); + } + hold = 0; + bits = 0; + state.mode = OS; + /* falls through */ + case OS: + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state.head) { + state.head.xflags = hold & 255; + state.head.os = hold >> 8; + } + if (state.flags & 512 && state.wrap & 4) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state.check = crc32(state.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + state.mode = EXLEN; + /* falls through */ + case EXLEN: + if (state.flags & 1024) { + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if (state.flags & 512 && state.wrap & 4) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state.check = crc32(state.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + } else if (state.head) { + state.head.extra = null; + } + state.mode = EXTRA; + /* falls through */ + case EXTRA: + if (state.flags & 1024) { + copy = state.length; + if (copy > have) { + copy = have; + } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + state.head.extra = new Uint8Array(state.head.extra_len); + } + state.head.extra.set( + input.subarray( + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + next + copy + ), + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + } + if (state.flags & 512 && state.wrap & 4) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; + } + if (state.length) { + break inf_leave; + } + } + state.length = 0; + state.mode = NAME; + /* falls through */ + case NAME: + if (state.flags & 2048) { + if (have === 0) { + break inf_leave; + } + copy = 0; + do { + len = input[next + copy++]; + if (state.head && len && state.length < 65536) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 512 && state.wrap & 4) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { + break inf_leave; + } + } else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT; + /* falls through */ + case COMMENT: + if (state.flags & 4096) { + if (have === 0) { + break inf_leave; + } + copy = 0; + do { + len = input[next + copy++]; + if (state.head && len && state.length < 65536) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 512 && state.wrap & 4) { + state.check = crc32(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { + break inf_leave; + } + } else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC; + /* falls through */ + case HCRC: + if (state.flags & 512) { + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state.wrap & 4 && hold !== (state.check & 65535)) { + strm.msg = "header crc mismatch"; + state.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + if (state.head) { + state.head.hcrc = state.flags >> 9 & 1; + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE; + break; + case DICTID: + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + strm.adler = state.check = zswap32(hold); + hold = 0; + bits = 0; + state.mode = DICT; + /* falls through */ + case DICT: + if (state.havedict === 0) { + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + return Z_NEED_DICT; + } + strm.adler = state.check = 1; + state.mode = TYPE; + /* falls through */ + case TYPE: + if (flush === Z_BLOCK || flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case TYPEDO: + if (state.last) { + hold >>>= bits & 7; + bits -= bits & 7; + state.mode = CHECK; + break; + } + while (bits < 3) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.last = hold & 1; + hold >>>= 1; + bits -= 1; + switch (hold & 3) { + case 0: + state.mode = STORED; + break; + case 1: + fixedtables(state); + state.mode = LEN_; + if (flush === Z_TREES) { + hold >>>= 2; + bits -= 2; + break inf_leave; + } + break; + case 2: + state.mode = TABLE; + break; + case 3: + strm.msg = "invalid block type"; + state.mode = BAD; + } + hold >>>= 2; + bits -= 2; + break; + case STORED: + hold >>>= bits & 7; + bits -= bits & 7; + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if ((hold & 65535) !== (hold >>> 16 ^ 65535)) { + strm.msg = "invalid stored block lengths"; + state.mode = BAD; + break; + } + state.length = hold & 65535; + hold = 0; + bits = 0; + state.mode = COPY_; + if (flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case COPY_: + state.mode = COPY; + /* falls through */ + case COPY: + copy = state.length; + if (copy) { + if (copy > have) { + copy = have; + } + if (copy > left) { + copy = left; + } + if (copy === 0) { + break inf_leave; + } + output.set(input.subarray(next, next + copy), put); + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + state.mode = TYPE; + break; + case TABLE: + while (bits < 14) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.nlen = (hold & 31) + 257; + hold >>>= 5; + bits -= 5; + state.ndist = (hold & 31) + 1; + hold >>>= 5; + bits -= 5; + state.ncode = (hold & 15) + 4; + hold >>>= 4; + bits -= 4; + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = "too many length or distance symbols"; + state.mode = BAD; + break; + } + state.have = 0; + state.mode = LENLENS; + /* falls through */ + case LENLENS: + while (state.have < state.ncode) { + while (bits < 3) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.lens[order[state.have++]] = hold & 7; + hold >>>= 3; + bits -= 3; + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + state.lencode = state.lendyn; + state.lenbits = 7; + opts = { bits: state.lenbits }; + ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + if (ret) { + strm.msg = "invalid code lengths set"; + state.mode = BAD; + break; + } + state.have = 0; + state.mode = CODELENS; + /* falls through */ + case CODELENS: + while (state.have < state.nlen + state.ndist) { + for (; ; ) { + here = state.lencode[hold & (1 << state.lenbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (here_val < 16) { + hold >>>= here_bits; + bits -= here_bits; + state.lens[state.have++] = here_val; + } else { + if (here_val === 16) { + n = here_bits + 2; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + if (state.have === 0) { + strm.msg = "invalid bit length repeat"; + state.mode = BAD; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 3); + hold >>>= 2; + bits -= 2; + } else if (here_val === 17) { + n = here_bits + 3; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + len = 0; + copy = 3 + (hold & 7); + hold >>>= 3; + bits -= 3; + } else { + n = here_bits + 7; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + len = 0; + copy = 11 + (hold & 127); + hold >>>= 7; + bits -= 7; + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = "invalid bit length repeat"; + state.mode = BAD; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } + } + } + if (state.mode === BAD) { + break; + } + if (state.lens[256] === 0) { + strm.msg = "invalid code -- missing end-of-block"; + state.mode = BAD; + break; + } + state.lenbits = 9; + opts = { bits: state.lenbits }; + ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + if (ret) { + strm.msg = "invalid literal/lengths set"; + state.mode = BAD; + break; + } + state.distbits = 6; + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + state.distbits = opts.bits; + if (ret) { + strm.msg = "invalid distances set"; + state.mode = BAD; + break; + } + state.mode = LEN_; + if (flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case LEN_: + state.mode = LEN; + /* falls through */ + case LEN: + if (have >= 6 && left >= 258) { + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + inflate_fast(strm, _out); + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + if (state.mode === TYPE) { + state.back = -1; + } + break; + } + state.back = 0; + for (; ; ) { + here = state.lencode[hold & (1 << state.lenbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (here_op && (here_op & 240) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (; ; ) { + here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (last_bits + here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= last_bits; + bits -= last_bits; + state.back += last_bits; + } + hold >>>= here_bits; + bits -= here_bits; + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + state.mode = LIT; + break; + } + if (here_op & 32) { + state.back = -1; + state.mode = TYPE; + break; + } + if (here_op & 64) { + strm.msg = "invalid literal/length code"; + state.mode = BAD; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT; + /* falls through */ + case LENEXT: + if (state.extra) { + n = state.extra; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.length += hold & (1 << state.extra) - 1; + hold >>>= state.extra; + bits -= state.extra; + state.back += state.extra; + } + state.was = state.length; + state.mode = DIST; + /* falls through */ + case DIST: + for (; ; ) { + here = state.distcode[hold & (1 << state.distbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if ((here_op & 240) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (; ; ) { + here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (last_bits + here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= last_bits; + bits -= last_bits; + state.back += last_bits; + } + hold >>>= here_bits; + bits -= here_bits; + state.back += here_bits; + if (here_op & 64) { + strm.msg = "invalid distance code"; + state.mode = BAD; + break; + } + state.offset = here_val; + state.extra = here_op & 15; + state.mode = DISTEXT; + /* falls through */ + case DISTEXT: + if (state.extra) { + n = state.extra; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state.offset += hold & (1 << state.extra) - 1; + hold >>>= state.extra; + bits -= state.extra; + state.back += state.extra; + } + if (state.offset > state.dmax) { + strm.msg = "invalid distance too far back"; + state.mode = BAD; + break; + } + state.mode = MATCH; + /* falls through */ + case MATCH: + if (left === 0) { + break inf_leave; + } + copy = _out - left; + if (state.offset > copy) { + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = "invalid distance too far back"; + state.mode = BAD; + break; + } + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } else { + from = state.wnext - copy; + } + if (copy > state.length) { + copy = state.length; + } + from_source = state.window; + } else { + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { + copy = left; + } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { + state.mode = LEN; + } + break; + case LIT: + if (left === 0) { + break inf_leave; + } + output[put++] = state.length; + left--; + state.mode = LEN; + break; + case CHECK: + if (state.wrap) { + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold |= input[next++] << bits; + bits += 8; + } + _out -= left; + strm.total_out += _out; + state.total += _out; + if (state.wrap & 4 && _out) { + strm.adler = state.check = /*UPDATE_CHECK(state.check, put - _out, _out);*/ + state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out); + } + _out = left; + if (state.wrap & 4 && (state.flags ? hold : zswap32(hold)) !== state.check) { + strm.msg = "incorrect data check"; + state.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + state.mode = LENGTH; + /* falls through */ + case LENGTH: + if (state.wrap && state.flags) { + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state.wrap & 4 && hold !== (state.total & 4294967295)) { + strm.msg = "incorrect length check"; + state.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + state.mode = DONE; + /* falls through */ + case DONE: + ret = Z_STREAM_END; + break inf_leave; + case BAD: + ret = Z_DATA_ERROR; + break inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* falls through */ + default: + return Z_STREAM_ERROR; + } + } + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { + state.mode = MEM; + return Z_MEM_ERROR; + } + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap & 4 && _out) { + strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ + state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { + ret = Z_BUF_ERROR; + } + return ret; + }; + var inflateEnd = (strm) => { + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + let state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK; + }; + var inflateGetHeader = (strm, head) => { + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + const state = strm.state; + if ((state.wrap & 2) === 0) { + return Z_STREAM_ERROR; + } + state.head = head; + head.done = false; + return Z_OK; + }; + var inflateSetDictionary = (strm, dictionary) => { + const dictLength = dictionary.length; + let state; + let dictid; + let ret; + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + state = strm.state; + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR; + } + if (state.mode === DICT) { + dictid = 1; + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR; + } + } + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + return Z_OK; + }; + module.exports.inflateReset = inflateReset; + module.exports.inflateReset2 = inflateReset2; + module.exports.inflateResetKeep = inflateResetKeep; + module.exports.inflateInit = inflateInit; + module.exports.inflateInit2 = inflateInit2; + module.exports.inflate = inflate; + module.exports.inflateEnd = inflateEnd; + module.exports.inflateGetHeader = inflateGetHeader; + module.exports.inflateSetDictionary = inflateSetDictionary; + module.exports.inflateInfo = "pako inflate (from Nodeca project)"; + } +}); + +// node_modules/pako/lib/utils/common.js +var require_common = __commonJS({ + "node_modules/pako/lib/utils/common.js"(exports, module) { + "use strict"; + var _has = (obj, key) => { + return Object.prototype.hasOwnProperty.call(obj, key); + }; + module.exports.assign = function(obj) { + const sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + const source = sources.shift(); + if (!source) { + continue; + } + if (typeof source !== "object") { + throw new TypeError(source + "must be non-object"); + } + for (const p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + return obj; + }; + module.exports.flattenChunks = (chunks) => { + let len = 0; + for (let i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + const result = new Uint8Array(len); + for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { + let chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + return result; + }; + } +}); + +// node_modules/pako/lib/utils/strings.js +var require_strings = __commonJS({ + "node_modules/pako/lib/utils/strings.js"(exports, module) { + "use strict"; + var STR_APPLY_UIA_OK = true; + try { + String.fromCharCode.apply(null, new Uint8Array(1)); + } catch (__) { + STR_APPLY_UIA_OK = false; + } + var _utf8len = new Uint8Array(256); + for (let q = 0; q < 256; q++) { + _utf8len[q] = q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1; + } + _utf8len[254] = _utf8len[254] = 1; + module.exports.string2buf = (str) => { + if (typeof TextEncoder === "function" && TextEncoder.prototype.encode) { + return new TextEncoder().encode(str); + } + let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 64512) === 55296 && m_pos + 1 < str_len) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 64512) === 56320) { + c = 65536 + (c - 55296 << 10) + (c2 - 56320); + m_pos++; + } + } + buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4; + } + buf = new Uint8Array(buf_len); + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 64512) === 55296 && m_pos + 1 < str_len) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 64512) === 56320) { + c = 65536 + (c - 55296 << 10) + (c2 - 56320); + m_pos++; + } + } + if (c < 128) { + buf[i++] = c; + } else if (c < 2048) { + buf[i++] = 192 | c >>> 6; + buf[i++] = 128 | c & 63; + } else if (c < 65536) { + buf[i++] = 224 | c >>> 12; + buf[i++] = 128 | c >>> 6 & 63; + buf[i++] = 128 | c & 63; + } else { + buf[i++] = 240 | c >>> 18; + buf[i++] = 128 | c >>> 12 & 63; + buf[i++] = 128 | c >>> 6 & 63; + buf[i++] = 128 | c & 63; + } + } + return buf; + }; + var buf2binstring = (buf, len) => { + if (len < 65534) { + if (buf.subarray && STR_APPLY_UIA_OK) { + return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); + } + } + let result = ""; + for (let i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; + }; + module.exports.buf2string = (buf, max) => { + const len = max || buf.length; + if (typeof TextDecoder === "function" && TextDecoder.prototype.decode) { + return new TextDecoder().decode(buf.subarray(0, max)); + } + let i, out; + const utf16buf = new Array(len * 2); + for (out = 0, i = 0; i < len; ) { + let c = buf[i++]; + if (c < 128) { + utf16buf[out++] = c; + continue; + } + let c_len = _utf8len[c]; + if (c_len > 4) { + utf16buf[out++] = 65533; + i += c_len - 1; + continue; + } + c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7; + while (c_len > 1 && i < len) { + c = c << 6 | buf[i++] & 63; + c_len--; + } + if (c_len > 1) { + utf16buf[out++] = 65533; + continue; + } + if (c < 65536) { + utf16buf[out++] = c; + } else { + c -= 65536; + utf16buf[out++] = 55296 | c >> 10 & 1023; + utf16buf[out++] = 56320 | c & 1023; + } + } + return buf2binstring(utf16buf, out); + }; + module.exports.utf8border = (buf, max) => { + max = max || buf.length; + if (max > buf.length) { + max = buf.length; + } + let pos = max - 1; + while (pos >= 0 && (buf[pos] & 192) === 128) { + pos--; + } + if (pos < 0) { + return max; + } + if (pos === 0) { + return max; + } + return pos + _utf8len[buf[pos]] > max ? pos : max; + }; + } +}); + +// node_modules/pako/lib/zlib/messages.js +var require_messages = __commonJS({ + "node_modules/pako/lib/zlib/messages.js"(exports, module) { + "use strict"; + module.exports = { + 2: "need dictionary", + /* Z_NEED_DICT 2 */ + 1: "stream end", + /* Z_STREAM_END 1 */ + 0: "", + /* Z_OK 0 */ + "-1": "file error", + /* Z_ERRNO (-1) */ + "-2": "stream error", + /* Z_STREAM_ERROR (-2) */ + "-3": "data error", + /* Z_DATA_ERROR (-3) */ + "-4": "insufficient memory", + /* Z_MEM_ERROR (-4) */ + "-5": "buffer error", + /* Z_BUF_ERROR (-5) */ + "-6": "incompatible version" + /* Z_VERSION_ERROR (-6) */ + }; + } +}); + +// node_modules/pako/lib/zlib/zstream.js +var require_zstream = __commonJS({ + "node_modules/pako/lib/zlib/zstream.js"(exports, module) { + "use strict"; + function ZStream() { + this.input = null; + this.next_in = 0; + this.avail_in = 0; + this.total_in = 0; + this.output = null; + this.next_out = 0; + this.avail_out = 0; + this.total_out = 0; + this.msg = ""; + this.state = null; + this.data_type = 2; + this.adler = 0; + } + module.exports = ZStream; + } +}); + +// node_modules/pako/lib/zlib/gzheader.js +var require_gzheader = __commonJS({ + "node_modules/pako/lib/zlib/gzheader.js"(exports, module) { + "use strict"; + function GZheader() { + this.text = 0; + this.time = 0; + this.xflags = 0; + this.os = 0; + this.extra = null; + this.extra_len = 0; + this.name = ""; + this.comment = ""; + this.hcrc = 0; + this.done = false; + } + module.exports = GZheader; + } +}); + +// node_modules/pako/lib/inflate.js +var require_inflate2 = __commonJS({ + "node_modules/pako/lib/inflate.js"(exports, module) { + "use strict"; + var zlib_inflate = require_inflate(); + var utils = require_common(); + var strings = require_strings(); + var msg = require_messages(); + var ZStream = require_zstream(); + var GZheader = require_gzheader(); + var toString = Object.prototype.toString; + var { + Z_NO_FLUSH, + Z_FINISH, + Z_OK, + Z_STREAM_END, + Z_NEED_DICT, + Z_STREAM_ERROR, + Z_DATA_ERROR, + Z_MEM_ERROR + } = require_constants(); + function Inflate(options) { + this.options = utils.assign({ + chunkSize: 1024 * 64, + windowBits: 15, + to: "" + }, options || {}); + const opt = this.options; + if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { + opt.windowBits = -15; + } + } + if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) { + opt.windowBits += 32; + } + if (opt.windowBits > 15 && opt.windowBits < 48) { + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; + } + } + this.err = 0; + this.msg = ""; + this.ended = false; + this.chunks = []; + this.strm = new ZStream(); + this.strm.avail_out = 0; + let status = zlib_inflate.inflateInit2( + this.strm, + opt.windowBits + ); + if (status !== Z_OK) { + throw new Error(msg[status]); + } + this.header = new GZheader(); + zlib_inflate.inflateGetHeader(this.strm, this.header); + if (opt.dictionary) { + if (typeof opt.dictionary === "string") { + opt.dictionary = strings.string2buf(opt.dictionary); + } else if (toString.call(opt.dictionary) === "[object ArrayBuffer]") { + opt.dictionary = new Uint8Array(opt.dictionary); + } + if (opt.raw) { + status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary); + if (status !== Z_OK) { + throw new Error(msg[status]); + } + } + } + } + Inflate.prototype.push = function(data, flush_mode) { + const strm = this.strm; + const chunkSize = this.options.chunkSize; + const dictionary = this.options.dictionary; + let status, _flush_mode, last_avail_out; + if (this.ended) return false; + if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; + else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; + if (toString.call(data) === "[object ArrayBuffer]") { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + strm.next_in = 0; + strm.avail_in = strm.input.length; + for (; ; ) { + if (strm.avail_out === 0) { + strm.output = new Uint8Array(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + status = zlib_inflate.inflate(strm, _flush_mode); + if (status === Z_NEED_DICT && dictionary) { + status = zlib_inflate.inflateSetDictionary(strm, dictionary); + if (status === Z_OK) { + status = zlib_inflate.inflate(strm, _flush_mode); + } else if (status === Z_DATA_ERROR) { + status = Z_NEED_DICT; + } + } + while (strm.avail_in > 0 && status === Z_STREAM_END && strm.state.wrap > 0 && data[strm.next_in] !== 0) { + zlib_inflate.inflateReset(strm); + status = zlib_inflate.inflate(strm, _flush_mode); + } + switch (status) { + case Z_STREAM_ERROR: + case Z_DATA_ERROR: + case Z_NEED_DICT: + case Z_MEM_ERROR: + this.onEnd(status); + this.ended = true; + return false; + } + last_avail_out = strm.avail_out; + if (strm.next_out) { + if (strm.avail_out === 0 || status === Z_STREAM_END) { + if (this.options.to === "string") { + let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); + let tail = strm.next_out - next_out_utf8; + let utf8str = strings.buf2string(strm.output, next_out_utf8); + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); + this.onData(utf8str); + } else { + this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); + } + } + } + if (status === Z_OK && last_avail_out === 0) continue; + if (status === Z_STREAM_END) { + status = zlib_inflate.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return true; + } + if (strm.avail_in === 0) break; + } + return true; + }; + Inflate.prototype.onData = function(chunk) { + this.chunks.push(chunk); + }; + Inflate.prototype.onEnd = function(status) { + if (status === Z_OK) { + if (this.options.to === "string") { + this.result = this.chunks.join(""); + } else { + this.result = utils.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + function inflate(input, options) { + const inflator = new Inflate(options); + inflator.push(input); + if (inflator.err) throw inflator.msg || msg[inflator.err]; + return inflator.result; + } + function inflateRaw(input, options) { + options = options || {}; + options.raw = true; + return inflate(input, options); + } + module.exports.Inflate = Inflate; + module.exports.inflate = inflate; + module.exports.inflateRaw = inflateRaw; + module.exports.ungzip = inflate; + module.exports.constants = require_constants(); + } +}); + +// packages/engine/Source/Core/decodeGoogleEarthEnterpriseData.js +var compressedMagic = 1953029805; +var compressedMagicSwap = 2917034100; +function decodeGoogleEarthEnterpriseData(key, data) { + if (decodeGoogleEarthEnterpriseData.passThroughDataForTesting) { + return data; + } + Check_default.typeOf.object("key", key); + Check_default.typeOf.object("data", data); + const keyLength = key.byteLength; + if (keyLength === 0 || keyLength % 4 !== 0) { + throw new RuntimeError_default( + "The length of key must be greater than 0 and a multiple of 4." + ); + } + const dataView = new DataView(data); + const magic = dataView.getUint32(0, true); + if (magic === compressedMagic || magic === compressedMagicSwap) { + return data; + } + const keyView = new DataView(key); + let dp = 0; + const dpend = data.byteLength; + const dpend64 = dpend - dpend % 8; + const kpend = keyLength; + let kp; + let off = 8; + while (dp < dpend64) { + off = (off + 8) % 24; + kp = off; + while (dp < dpend64 && kp < kpend) { + dataView.setUint32( + dp, + dataView.getUint32(dp, true) ^ keyView.getUint32(kp, true), + true + ); + dataView.setUint32( + dp + 4, + dataView.getUint32(dp + 4, true) ^ keyView.getUint32(kp + 4, true), + true + ); + dp += 8; + kp += 24; + } + } + if (dp < dpend) { + if (kp >= kpend) { + off = (off + 8) % 24; + kp = off; + } + while (dp < dpend) { + dataView.setUint8(dp, dataView.getUint8(dp) ^ keyView.getUint8(kp)); + dp++; + kp++; + } + } +} +decodeGoogleEarthEnterpriseData.passThroughDataForTesting = false; +var decodeGoogleEarthEnterpriseData_default = decodeGoogleEarthEnterpriseData; + +// packages/engine/Source/Core/isBitSet.js +function isBitSet(bits, mask) { + return (bits & mask) !== 0; +} +var isBitSet_default = isBitSet; + +// packages/engine/Source/Core/GoogleEarthEnterpriseTileInformation.js +var childrenBitmasks = [1, 2, 4, 8]; +var anyChildBitmask = 15; +var cacheFlagBitmask = 16; +var imageBitmask = 64; +var terrainBitmask = 128; +function GoogleEarthEnterpriseTileInformation(bits, cnodeVersion, imageryVersion, terrainVersion, imageryProvider, terrainProvider) { + this._bits = bits; + this.cnodeVersion = cnodeVersion; + this.imageryVersion = imageryVersion; + this.terrainVersion = terrainVersion; + this.imageryProvider = imageryProvider; + this.terrainProvider = terrainProvider; + this.ancestorHasTerrain = false; + this.terrainState = void 0; +} +GoogleEarthEnterpriseTileInformation.clone = function(info, result) { + if (!defined_default(result)) { + result = new GoogleEarthEnterpriseTileInformation( + info._bits, + info.cnodeVersion, + info.imageryVersion, + info.terrainVersion, + info.imageryProvider, + info.terrainProvider + ); + } else { + result._bits = info._bits; + result.cnodeVersion = info.cnodeVersion; + result.imageryVersion = info.imageryVersion; + result.terrainVersion = info.terrainVersion; + result.imageryProvider = info.imageryProvider; + result.terrainProvider = info.terrainProvider; + } + result.ancestorHasTerrain = info.ancestorHasTerrain; + result.terrainState = info.terrainState; + return result; +}; +GoogleEarthEnterpriseTileInformation.prototype.setParent = function(parent) { + this.ancestorHasTerrain = parent.ancestorHasTerrain || this.hasTerrain(); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasSubtree = function() { + return isBitSet_default(this._bits, cacheFlagBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasImagery = function() { + return isBitSet_default(this._bits, imageBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasTerrain = function() { + return isBitSet_default(this._bits, terrainBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasChildren = function() { + return isBitSet_default(this._bits, anyChildBitmask); +}; +GoogleEarthEnterpriseTileInformation.prototype.hasChild = function(index) { + return isBitSet_default(this._bits, childrenBitmasks[index]); +}; +GoogleEarthEnterpriseTileInformation.prototype.getChildBitmask = function() { + return this._bits & anyChildBitmask; +}; +var GoogleEarthEnterpriseTileInformation_default = GoogleEarthEnterpriseTileInformation; + +// packages/engine/Source/Workers/decodeGoogleEarthEnterprisePacket.js +var import_inflate = __toESM(require_inflate2(), 1); +var sizeOfUint16 = Uint16Array.BYTES_PER_ELEMENT; +var sizeOfInt32 = Int32Array.BYTES_PER_ELEMENT; +var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; +var Types = { + METADATA: 0, + TERRAIN: 1, + DBROOT: 2 +}; +Types.fromString = function(s) { + if (s === "Metadata") { + return Types.METADATA; + } else if (s === "Terrain") { + return Types.TERRAIN; + } else if (s === "DbRoot") { + return Types.DBROOT; + } +}; +function decodeGoogleEarthEnterprisePacket(parameters, transferableObjects) { + const type = Types.fromString(parameters.type); + let buffer = parameters.buffer; + decodeGoogleEarthEnterpriseData_default(parameters.key, buffer); + const uncompressedTerrain = uncompressPacket(buffer); + buffer = uncompressedTerrain.buffer; + const length = uncompressedTerrain.length; + switch (type) { + case Types.METADATA: + return processMetadata(buffer, length, parameters.quadKey); + case Types.TERRAIN: + return processTerrain(buffer, length, transferableObjects); + case Types.DBROOT: + transferableObjects.push(buffer); + return { + buffer + }; + } +} +var qtMagic = 32301; +function processMetadata(buffer, totalSize, quadKey) { + const dv = new DataView(buffer); + let offset = 0; + const magic = dv.getUint32(offset, true); + offset += sizeOfUint32; + if (magic !== qtMagic) { + throw new RuntimeError_default("Invalid magic"); + } + const dataTypeId = dv.getUint32(offset, true); + offset += sizeOfUint32; + if (dataTypeId !== 1) { + throw new RuntimeError_default("Invalid data type. Must be 1 for QuadTreePacket"); + } + const quadVersion = dv.getUint32(offset, true); + offset += sizeOfUint32; + if (quadVersion !== 2) { + throw new RuntimeError_default( + "Invalid QuadTreePacket version. Only version 2 is supported." + ); + } + const numInstances = dv.getInt32(offset, true); + offset += sizeOfInt32; + const dataInstanceSize = dv.getInt32(offset, true); + offset += sizeOfInt32; + if (dataInstanceSize !== 32) { + throw new RuntimeError_default("Invalid instance size."); + } + const dataBufferOffset = dv.getInt32(offset, true); + offset += sizeOfInt32; + const dataBufferSize = dv.getInt32(offset, true); + offset += sizeOfInt32; + const metaBufferSize = dv.getInt32(offset, true); + offset += sizeOfInt32; + if (dataBufferOffset !== numInstances * dataInstanceSize + offset) { + throw new RuntimeError_default("Invalid dataBufferOffset"); + } + if (dataBufferOffset + dataBufferSize + metaBufferSize !== totalSize) { + throw new RuntimeError_default("Invalid packet offsets"); + } + const instances = []; + for (let i = 0; i < numInstances; ++i) { + const bitfield = dv.getUint8(offset); + ++offset; + ++offset; + const cnodeVersion = dv.getUint16(offset, true); + offset += sizeOfUint16; + const imageVersion = dv.getUint16(offset, true); + offset += sizeOfUint16; + const terrainVersion = dv.getUint16(offset, true); + offset += sizeOfUint16; + offset += sizeOfUint16; + offset += sizeOfUint16; + offset += sizeOfInt32; + offset += sizeOfInt32; + offset += 8; + const imageProvider = dv.getUint8(offset++); + const terrainProvider = dv.getUint8(offset++); + offset += sizeOfUint16; + instances.push( + new GoogleEarthEnterpriseTileInformation_default( + bitfield, + cnodeVersion, + imageVersion, + terrainVersion, + imageProvider, + terrainProvider + ) + ); + } + const tileInfo = []; + let index = 0; + function populateTiles(parentKey, parent, level2) { + let isLeaf = false; + if (level2 === 4) { + if (parent.hasSubtree()) { + return; + } + isLeaf = true; + } + for (let i = 0; i < 4; ++i) { + const childKey = parentKey + i.toString(); + if (isLeaf) { + tileInfo[childKey] = null; + } else if (level2 < 4) { + if (!parent.hasChild(i)) { + tileInfo[childKey] = null; + } else { + if (index === numInstances) { + console.log("Incorrect number of instances"); + return; + } + const instance = instances[index++]; + tileInfo[childKey] = instance; + populateTiles(childKey, instance, level2 + 1); + } + } + } + } + let level = 0; + const root = instances[index++]; + if (quadKey === "") { + ++level; + } else { + tileInfo[quadKey] = root; + } + populateTiles(quadKey, root, level); + return tileInfo; +} +var numMeshesPerPacket = 5; +var numSubMeshesPerMesh = 4; +function processTerrain(buffer, totalSize, transferableObjects) { + const dv = new DataView(buffer); + const advanceMesh = function(pos) { + for (let sub = 0; sub < numSubMeshesPerMesh; ++sub) { + const size = dv.getUint32(pos, true); + pos += sizeOfUint32; + pos += size; + if (pos > totalSize) { + throw new RuntimeError_default("Malformed terrain packet found."); + } + } + return pos; + }; + let offset = 0; + const terrainMeshes = []; + while (terrainMeshes.length < numMeshesPerPacket) { + const start = offset; + offset = advanceMesh(offset); + const mesh = buffer.slice(start, offset); + transferableObjects.push(mesh); + terrainMeshes.push(mesh); + } + return terrainMeshes; +} +var compressedMagic2 = 1953029805; +var compressedMagicSwap2 = 2917034100; +function uncompressPacket(data) { + const dv = new DataView(data); + let offset = 0; + const magic = dv.getUint32(offset, true); + offset += sizeOfUint32; + if (magic !== compressedMagic2 && magic !== compressedMagicSwap2) { + throw new RuntimeError_default("Invalid magic"); + } + const size = dv.getUint32(offset, magic === compressedMagic2); + offset += sizeOfUint32; + const compressedPacket = new Uint8Array(data, offset); + const uncompressedPacket = import_inflate.default.inflate(compressedPacket); + if (uncompressedPacket.length !== size) { + throw new RuntimeError_default("Size of packet doesn't match header"); + } + return uncompressedPacket; +} +var decodeGoogleEarthEnterprisePacket_default = createTaskProcessorWorker_default(decodeGoogleEarthEnterprisePacket); +export { + decodeGoogleEarthEnterprisePacket_default as default +}; diff --git a/public/assets/cesium/Workers/decodeI3S.js b/public/assets/cesium/Workers/decodeI3S.js new file mode 100644 index 0000000..f4048de --- /dev/null +++ b/public/assets/cesium/Workers/decodeI3S.js @@ -0,0 +1,1343 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + require_draco_decoder_nodejs +} from "./chunk-M24KHENR.js"; +import { + Color_default +} from "./chunk-HP5XLODI.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + WebMercatorProjection_default +} from "./chunk-RJM36CNY.js"; +import { + Cartesian3_default, + Cartographic_default, + Ellipsoid_default, + Matrix3_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Workers/decodeI3S.js +var import_draco_decoder_nodejs = __toESM(require_draco_decoder_nodejs(), 1); + +// packages/engine/Source/Core/srgbToLinear.js +function srgbToLinear(value) { + Check_default.defined("value", value); + if (value <= 0.04045) { + return value * 0.07739938080495357; + } + return Math.pow( + // eslint-disable-next-line no-loss-of-precision + (value + 0.055) * 0.9478672985781991, + 2.4 + ); +} +var srgbToLinear_default = srgbToLinear; + +// packages/engine/Source/Workers/decodeI3S.js +var draco; +function bilinearInterpolate(tx, ty, h00, h10, h01, h11) { + const a = h00 * (1 - tx) + h10 * tx; + const b = h01 * (1 - tx) + h11 * tx; + return a * (1 - ty) + b * ty; +} +function sampleMap(u, v, width, data) { + const address = u + v * width; + return data[address]; +} +function sampleGeoid(sampleX, sampleY, geoidData) { + const extent = geoidData.nativeExtent; + let x = (sampleX - extent.west) / (extent.east - extent.west) * (geoidData.width - 1); + let y = (sampleY - extent.south) / (extent.north - extent.south) * (geoidData.height - 1); + const xi = Math.floor(x); + let yi = Math.floor(y); + x -= xi; + y -= yi; + const xNext = xi < geoidData.width ? xi + 1 : xi; + let yNext = yi < geoidData.height ? yi + 1 : yi; + yi = geoidData.height - 1 - yi; + yNext = geoidData.height - 1 - yNext; + const h00 = sampleMap(xi, yi, geoidData.width, geoidData.buffer); + const h10 = sampleMap(xNext, yi, geoidData.width, geoidData.buffer); + const h01 = sampleMap(xi, yNext, geoidData.width, geoidData.buffer); + const h11 = sampleMap(xNext, yNext, geoidData.width, geoidData.buffer); + let finalHeight = bilinearInterpolate(x, y, h00, h10, h01, h11); + finalHeight = finalHeight * geoidData.scale + geoidData.offset; + return finalHeight; +} +function sampleGeoidFromList(lon, lat, geoidDataList) { + for (let i = 0; i < geoidDataList.length; i++) { + const localExtent = geoidDataList[i].nativeExtent; + let localPt = new Cartesian3_default(); + if (geoidDataList[i].projectionType === "WebMercator") { + const radii = geoidDataList[i].projection._ellipsoid._radii; + const webMercatorProj = new WebMercatorProjection_default( + new Ellipsoid_default(radii.x, radii.y, radii.z) + ); + localPt = webMercatorProj.project(new Cartographic_default(lon, lat, 0)); + } else { + localPt.x = lon; + localPt.y = lat; + } + if (localPt.x > localExtent.west && localPt.x < localExtent.east && localPt.y > localExtent.south && localPt.y < localExtent.north) { + return sampleGeoid(localPt.x, localPt.y, geoidDataList[i]); + } + } + return 0; +} +function orthometricToEllipsoidal(vertexCount, position, scale_x, scale_y, center, geoidDataList, fast) { + if (fast) { + return; + } + const centerHeight = sampleGeoidFromList( + center.longitude, + center.latitude, + geoidDataList + ); + for (let i = 0; i < vertexCount; ++i) { + const height = sampleGeoidFromList( + center.longitude + Math_default.toRadians(scale_x * position[i * 3]), + center.latitude + Math_default.toRadians(scale_y * position[i * 3 + 1]), + geoidDataList + ); + position[i * 3 + 2] += height - centerHeight; + } +} +function transformToLocal(vertexCount, positions, normals, cartographicCenter, cartesianCenter, parentRotation, ellipsoidRadiiSquare, scale_x, scale_y) { + if (vertexCount === 0 || !defined_default(positions) || positions.length === 0) { + return; + } + const ellipsoid = new Ellipsoid_default( + Math.sqrt(ellipsoidRadiiSquare.x), + Math.sqrt(ellipsoidRadiiSquare.y), + Math.sqrt(ellipsoidRadiiSquare.z) + ); + for (let i = 0; i < vertexCount; ++i) { + const indexOffset = i * 3; + const indexOffset1 = indexOffset + 1; + const indexOffset2 = indexOffset + 2; + const cartographic = new Cartographic_default(); + cartographic.longitude = cartographicCenter.longitude + Math_default.toRadians(scale_x * positions[indexOffset]); + cartographic.latitude = cartographicCenter.latitude + Math_default.toRadians(scale_y * positions[indexOffset1]); + cartographic.height = cartographicCenter.height + positions[indexOffset2]; + const position = {}; + ellipsoid.cartographicToCartesian(cartographic, position); + position.x -= cartesianCenter.x; + position.y -= cartesianCenter.y; + position.z -= cartesianCenter.z; + const rotatedPosition = {}; + Matrix3_default.multiplyByVector(parentRotation, position, rotatedPosition); + positions[indexOffset] = rotatedPosition.x; + positions[indexOffset1] = rotatedPosition.y; + positions[indexOffset2] = rotatedPosition.z; + if (defined_default(normals)) { + const normal = new Cartesian3_default( + normals[indexOffset], + normals[indexOffset1], + normals[indexOffset2] + ); + const rotatedNormal = {}; + Matrix3_default.multiplyByVector(parentRotation, normal, rotatedNormal); + normals[indexOffset] = rotatedNormal.x; + normals[indexOffset1] = rotatedNormal.y; + normals[indexOffset2] = rotatedNormal.z; + } + } +} +function cropUVs(vertexCount, uv0s, uvRegions) { + for (let vertexIndex = 0; vertexIndex < vertexCount; ++vertexIndex) { + const minU = uvRegions[vertexIndex * 4] / 65535; + const minV = uvRegions[vertexIndex * 4 + 1] / 65535; + const scaleU = (uvRegions[vertexIndex * 4 + 2] - uvRegions[vertexIndex * 4]) / 65535; + const scaleV = (uvRegions[vertexIndex * 4 + 3] - uvRegions[vertexIndex * 4 + 1]) / 65535; + uv0s[vertexIndex * 2] *= scaleU; + uv0s[vertexIndex * 2] += minU; + uv0s[vertexIndex * 2 + 1] *= scaleV; + uv0s[vertexIndex * 2 + 1] += minV; + } +} +function generateIndexArray(vertexCount, indices, colors, splitGeometryByColorTransparency) { + const indexArray = new Uint32Array(vertexCount); + const vertexIndexFn = defined_default(indices) ? (vertexIndex) => indices[vertexIndex] : (vertexIndex) => vertexIndex; + let transparentVertexOffset = 0; + if (splitGeometryByColorTransparency && defined_default(colors)) { + const isVertexTransparentFn = (vertexIndex) => colors[vertexIndexFn(vertexIndex) * 4 + 3] < 255; + for (let vertexIndex = 0; vertexIndex < vertexCount; vertexIndex += 3) { + if (!isVertexTransparentFn(vertexIndex) && !isVertexTransparentFn(vertexIndex + 1) && !isVertexTransparentFn(vertexIndex + 2)) { + indexArray[transparentVertexOffset++] = vertexIndexFn(vertexIndex); + indexArray[transparentVertexOffset++] = vertexIndexFn(vertexIndex + 1); + indexArray[transparentVertexOffset++] = vertexIndexFn(vertexIndex + 2); + } + } + if (transparentVertexOffset > 0) { + let offset = transparentVertexOffset; + for (let vertexIndex = 0; vertexIndex < vertexCount; vertexIndex += 3) { + if (isVertexTransparentFn(vertexIndex) || isVertexTransparentFn(vertexIndex + 1) || isVertexTransparentFn(vertexIndex + 2)) { + indexArray[offset++] = vertexIndexFn(vertexIndex); + indexArray[offset++] = vertexIndexFn(vertexIndex + 1); + indexArray[offset++] = vertexIndexFn(vertexIndex + 2); + } + } + } else { + for (let vertexIndex = 0; vertexIndex < vertexCount; ++vertexIndex) { + indexArray[vertexIndex] = vertexIndexFn(vertexIndex); + } + } + } else { + transparentVertexOffset = vertexCount; + for (let vertexIndex = 0; vertexIndex < vertexCount; ++vertexIndex) { + indexArray[vertexIndex] = vertexIndexFn(vertexIndex); + } + } + return { + indexArray, + transparentVertexOffset + }; +} +function getFeatureHash(symbologyData, outlinesHash, featureIndex) { + const featureHash = outlinesHash[featureIndex]; + if (defined_default(featureHash)) { + return featureHash; + } + const newFeatureHash = outlinesHash[featureIndex] = { + positions: {}, + indices: {}, + edges: {} + }; + const featureSymbology = defaultValue_default( + symbologyData[featureIndex], + symbologyData.default + ); + newFeatureHash.hasOutline = defined_default(featureSymbology?.edges); + return newFeatureHash; +} +function addVertexToHash(indexHash, positionHash, vertexIndex, positions) { + if (!defined_default(indexHash[vertexIndex])) { + const startPositionIndex = vertexIndex * 3; + let coordinateHash = positionHash; + for (let index = 0; index < 3; index++) { + const coordinate = positions[startPositionIndex + index]; + if (!defined_default(coordinateHash[coordinate])) { + coordinateHash[coordinate] = {}; + } + coordinateHash = coordinateHash[coordinate]; + } + if (!defined_default(coordinateHash.index)) { + coordinateHash.index = vertexIndex; + } + indexHash[vertexIndex] = coordinateHash.index; + } +} +function addEdgeToHash(edgeHash, vertexAIndex, vertexBIndex, vertexAIndexUnique, vertexBIndexUnique, normalIndex) { + let startVertexIndex; + let endVertexIndex; + if (vertexAIndexUnique < vertexBIndexUnique) { + startVertexIndex = vertexAIndexUnique; + endVertexIndex = vertexBIndexUnique; + } else { + startVertexIndex = vertexBIndexUnique; + endVertexIndex = vertexAIndexUnique; + } + let edgeStart = edgeHash[startVertexIndex]; + if (!defined_default(edgeStart)) { + edgeStart = edgeHash[startVertexIndex] = {}; + } + let edgeEnd = edgeStart[endVertexIndex]; + if (!defined_default(edgeEnd)) { + edgeEnd = edgeStart[endVertexIndex] = { + normalsIndex: [], + outlines: [] + }; + } + edgeEnd.normalsIndex.push(normalIndex); + if (edgeEnd.outlines.length === 0 || vertexAIndex !== vertexAIndexUnique || vertexBIndex !== vertexBIndexUnique) { + edgeEnd.outlines.push(vertexAIndex, vertexBIndex); + } +} +function generateOutlinesHash(symbologyData, featureIndexArray, indexArray, positions) { + const outlinesHash = []; + for (let i = 0; i < indexArray.length; i += 3) { + const featureIndex = defined_default(featureIndexArray) ? featureIndexArray[indexArray[i]] : "default"; + const featureHash = getFeatureHash( + symbologyData, + outlinesHash, + featureIndex + ); + if (!featureHash.hasOutline) { + continue; + } + const indexHash = featureHash.indices; + const positionHash = featureHash.positions; + for (let vertex = 0; vertex < 3; vertex++) { + const vertexIndex = indexArray[i + vertex]; + addVertexToHash(indexHash, positionHash, vertexIndex, positions); + } + const edgeHash = featureHash.edges; + for (let vertex = 0; vertex < 3; vertex++) { + const vertexIndex = indexArray[i + vertex]; + const nextVertexIndex = indexArray[i + (vertex + 1) % 3]; + const uniqueVertexIndex = indexHash[vertexIndex]; + const uniqueNextVertexIndex = indexHash[nextVertexIndex]; + addEdgeToHash( + edgeHash, + vertexIndex, + nextVertexIndex, + uniqueVertexIndex, + uniqueNextVertexIndex, + i + ); + } + } + return outlinesHash; +} +var calculateFaceNormalA = new Cartesian3_default(); +var calculateFaceNormalB = new Cartesian3_default(); +var calculateFaceNormalC = new Cartesian3_default(); +function calculateFaceNormal(normals, vertexAIndex, indexArray, positions) { + const positionAIndex = indexArray[vertexAIndex] * 3; + const positionBIndex = indexArray[vertexAIndex + 1] * 3; + const positionCIndex = indexArray[vertexAIndex + 2] * 3; + Cartesian3_default.fromArray(positions, positionAIndex, calculateFaceNormalA); + Cartesian3_default.fromArray(positions, positionBIndex, calculateFaceNormalB); + Cartesian3_default.fromArray(positions, positionCIndex, calculateFaceNormalC); + Cartesian3_default.subtract( + calculateFaceNormalB, + calculateFaceNormalA, + calculateFaceNormalB + ); + Cartesian3_default.subtract( + calculateFaceNormalC, + calculateFaceNormalA, + calculateFaceNormalC + ); + Cartesian3_default.cross( + calculateFaceNormalB, + calculateFaceNormalC, + calculateFaceNormalA + ); + const magnitude = Cartesian3_default.magnitude(calculateFaceNormalA); + if (magnitude !== 0) { + Cartesian3_default.divideByScalar( + calculateFaceNormalA, + magnitude, + calculateFaceNormalA + ); + } + const normalAIndex = vertexAIndex * 3; + const normalBIndex = (vertexAIndex + 1) * 3; + const normalCIndex = (vertexAIndex + 2) * 3; + Cartesian3_default.pack(calculateFaceNormalA, normals, normalAIndex); + Cartesian3_default.pack(calculateFaceNormalA, normals, normalBIndex); + Cartesian3_default.pack(calculateFaceNormalA, normals, normalCIndex); +} +var isEdgeSmoothA = new Cartesian3_default(); +var isEdgeSmoothB = new Cartesian3_default(); +function isEdgeSmooth(normals, normalAIndex, normalBIndex) { + Cartesian3_default.fromArray(normals, normalAIndex, isEdgeSmoothA); + Cartesian3_default.fromArray(normals, normalBIndex, isEdgeSmoothB); + const cosine = Cartesian3_default.dot(isEdgeSmoothA, isEdgeSmoothB); + const sine = Cartesian3_default.magnitude( + Cartesian3_default.cross(isEdgeSmoothA, isEdgeSmoothB, isEdgeSmoothA) + ); + return Math.atan2(sine, cosine) < 0.25; +} +function addOutlinesForEdge(outlines, edgeData, indexArray, positions, normals) { + if (edgeData.normalsIndex.length > 1) { + const normalsByIndex = positions.length === normals.length; + for (let indexA = 0; indexA < edgeData.normalsIndex.length; indexA++) { + const vertexAIndex = edgeData.normalsIndex[indexA]; + if (!defined_default(normals[vertexAIndex * 3])) { + calculateFaceNormal(normals, vertexAIndex, indexArray, positions); + } + if (indexA === 0) { + continue; + } + for (let indexB = 0; indexB < indexA; indexB++) { + const vertexBIndex = edgeData.normalsIndex[indexB]; + const normalAIndex = normalsByIndex ? indexArray[vertexAIndex] * 3 : vertexAIndex * 3; + const normalBIndex = normalsByIndex ? indexArray[vertexBIndex] * 3 : vertexBIndex * 3; + if (isEdgeSmooth(normals, normalAIndex, normalBIndex)) { + return; + } + } + } + } + outlines.push(...edgeData.outlines); +} +function addOutlinesForFeature(outlines, edgeHash, indexArray, positions, normals) { + const edgeStartKeys = Object.keys(edgeHash); + for (let startIndex = 0; startIndex < edgeStartKeys.length; startIndex++) { + const edgeEnds = edgeHash[edgeStartKeys[startIndex]]; + const edgeEndKeys = Object.keys(edgeEnds); + for (let endIndex = 0; endIndex < edgeEndKeys.length; endIndex++) { + const edgeData = edgeEnds[edgeEndKeys[endIndex]]; + addOutlinesForEdge(outlines, edgeData, indexArray, positions, normals); + } + } +} +function generateOutlinesFromHash(outlinesHash, indexArray, positions, normals) { + const outlines = []; + const features = Object.keys(outlinesHash); + for (let featureIndex = 0; featureIndex < features.length; featureIndex++) { + const edgeHash = outlinesHash[features[featureIndex]].edges; + addOutlinesForFeature(outlines, edgeHash, indexArray, positions, normals); + } + return outlines; +} +function generateOutlinesIndexArray(symbologyData, featureIndexArray, indexArray, positions, normals) { + if (!defined_default(symbologyData) || Object.keys(symbologyData).length === 0) { + return void 0; + } + const outlinesHash = generateOutlinesHash( + symbologyData, + featureIndexArray, + indexArray, + positions + ); + if (!defined_default(normals) || indexArray.length * 3 !== normals.length) { + normals = []; + } + const outlines = generateOutlinesFromHash( + outlinesHash, + indexArray, + positions, + normals + ); + const outlinesIndexArray = outlines.length > 0 ? new Uint32Array(outlines) : void 0; + return outlinesIndexArray; +} +function convertColorsArray(colors) { + const colorsArray = new Float32Array(colors.length); + for (let index = 0; index < colors.length; index += 4) { + colorsArray[index] = srgbToLinear_default(Color_default.byteToFloat(colors[index])); + colorsArray[index + 1] = srgbToLinear_default(Color_default.byteToFloat(colors[index + 1])); + colorsArray[index + 2] = srgbToLinear_default(Color_default.byteToFloat(colors[index + 2])); + colorsArray[index + 3] = Color_default.byteToFloat(colors[index + 3]); + } + return colorsArray; +} +function generateNormals(vertexCount, indices, positions, normals, uv0s, colors, featureIndex) { + const result = { + normals: void 0, + positions: void 0, + uv0s: void 0, + colors: void 0, + featureIndex: void 0, + vertexCount: void 0 + }; + if (vertexCount === 0 || !defined_default(positions) || positions.length === 0 || defined_default(normals)) { + return result; + } + if (defined_default(indices)) { + result.vertexCount = indices.length; + result.positions = new Float32Array(indices.length * 3); + result.uv0s = defined_default(uv0s) ? new Float32Array(indices.length * 2) : void 0; + result.colors = defined_default(colors) ? new Uint8Array(indices.length * 4) : void 0; + result.featureIndex = defined_default(featureIndex) ? new Array(indices.length) : void 0; + for (let i = 0; i < indices.length; i++) { + const index = indices[i]; + result.positions[i * 3] = positions[index * 3]; + result.positions[i * 3 + 1] = positions[index * 3 + 1]; + result.positions[i * 3 + 2] = positions[index * 3 + 2]; + if (defined_default(result.uv0s)) { + result.uv0s[i * 2] = uv0s[index * 2]; + result.uv0s[i * 2 + 1] = uv0s[index * 2 + 1]; + } + if (defined_default(result.colors)) { + result.colors[i * 4] = colors[index * 4]; + result.colors[i * 4 + 1] = colors[index * 4 + 1]; + result.colors[i * 4 + 2] = colors[index * 4 + 2]; + result.colors[i * 4 + 3] = colors[index * 4 + 3]; + } + if (defined_default(result.featureIndex)) { + result.featureIndex[i] = featureIndex[index]; + } + } + vertexCount = indices.length; + positions = result.positions; + } + indices = new Array(vertexCount); + for (let i = 0; i < vertexCount; i++) { + indices[i] = i; + } + result.normals = new Float32Array(indices.length * 3); + for (let i = 0; i < indices.length; i += 3) { + calculateFaceNormal(result.normals, i, indices, positions); + } + return result; +} +function generateGltfBuffer(vertexCount, indices, positions, normals, uv0s, colors, featureIndex, parameters) { + if (vertexCount === 0 || !defined_default(positions) || positions.length === 0) { + return { + buffers: [], + bufferViews: [], + accessors: [], + meshes: [], + nodes: [], + nodesInScene: [] + }; + } + const buffers = []; + const bufferViews = []; + const accessors = []; + const meshes = []; + const nodes = []; + const nodesInScene = []; + const rootExtensions = {}; + const extensionsUsed = []; + if (defined_default(indices)) { + vertexCount = indices.length; + } + const { indexArray, transparentVertexOffset } = generateIndexArray( + vertexCount, + indices, + colors, + parameters.splitGeometryByColorTransparency + ); + const indicesBlob = new Blob([indexArray], { type: "application/binary" }); + const indicesURL = URL.createObjectURL(indicesBlob); + const endIndex = vertexCount; + const featureIndexArray = parameters.enableFeatures && defined_default(featureIndex) ? new Float32Array(featureIndex.length) : void 0; + let featureCount = 0; + if (defined_default(featureIndexArray)) { + for (let index = 0; index < featureIndex.length; ++index) { + featureIndexArray[index] = featureIndex[index]; + const countByIndex = featureIndex[index] + 1; + if (featureCount < countByIndex) { + featureCount = countByIndex; + } + } + } + let outlinesIndicesURL; + const outlinesIndexArray = generateOutlinesIndexArray( + parameters.symbologyData, + featureIndex, + indexArray, + positions, + normals + ); + if (defined_default(outlinesIndexArray)) { + const outlinesIndicesBlob = new Blob([outlinesIndexArray], { + type: "application/binary" + }); + outlinesIndicesURL = URL.createObjectURL(outlinesIndicesBlob); + } + const meshPositions = positions.subarray(0, endIndex * 3); + const positionsBlob = new Blob([meshPositions], { + type: "application/binary" + }); + const positionsURL = URL.createObjectURL(positionsBlob); + let minX = Number.POSITIVE_INFINITY; + let maxX = Number.NEGATIVE_INFINITY; + let minY = Number.POSITIVE_INFINITY; + let maxY = Number.NEGATIVE_INFINITY; + let minZ = Number.POSITIVE_INFINITY; + let maxZ = Number.NEGATIVE_INFINITY; + for (let i = 0; i < meshPositions.length / 3; i++) { + minX = Math.min(minX, meshPositions[i * 3 + 0]); + maxX = Math.max(maxX, meshPositions[i * 3 + 0]); + minY = Math.min(minY, meshPositions[i * 3 + 1]); + maxY = Math.max(maxY, meshPositions[i * 3 + 1]); + minZ = Math.min(minZ, meshPositions[i * 3 + 2]); + maxZ = Math.max(maxZ, meshPositions[i * 3 + 2]); + } + const meshNormals = normals ? normals.subarray(0, endIndex * 3) : void 0; + let normalsURL; + if (defined_default(meshNormals)) { + const normalsBlob = new Blob([meshNormals], { + type: "application/binary" + }); + normalsURL = URL.createObjectURL(normalsBlob); + } + const meshUv0s = uv0s ? uv0s.subarray(0, endIndex * 2) : void 0; + let uv0URL; + if (defined_default(meshUv0s)) { + const uv0Blob = new Blob([meshUv0s], { type: "application/binary" }); + uv0URL = URL.createObjectURL(uv0Blob); + } + const meshColorsInBytes = defined_default(colors) ? convertColorsArray(colors.subarray(0, endIndex * 4)) : void 0; + let colorsURL; + if (defined_default(meshColorsInBytes)) { + const colorsBlob = new Blob([meshColorsInBytes], { + type: "application/binary" + }); + colorsURL = URL.createObjectURL(colorsBlob); + } + const meshFeatureId0 = defined_default(featureIndexArray) ? featureIndexArray.subarray(0, endIndex) : void 0; + let featureId0URL; + if (defined_default(meshFeatureId0)) { + const featureId0Blob = new Blob([meshFeatureId0], { + type: "application/binary" + }); + featureId0URL = URL.createObjectURL(featureId0Blob); + } + const meshPropertyTable0 = defined_default(featureIndexArray) ? new Float32Array(featureCount) : void 0; + let propertyTable0URL; + if (defined_default(meshPropertyTable0)) { + for (let index = 0; index < meshPropertyTable0.length; ++index) { + meshPropertyTable0[index] = index; + } + const propertyTable0Blob = new Blob([meshPropertyTable0], { + type: "application/binary" + }); + propertyTable0URL = URL.createObjectURL(propertyTable0Blob); + } + const attributes = {}; + const extensions = {}; + attributes.POSITION = accessors.length; + buffers.push({ + uri: positionsURL, + byteLength: meshPositions.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshPositions.byteLength, + target: 34962 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5126, + count: meshPositions.length / 3, + type: "VEC3", + max: [minX, minY, minZ], + min: [maxX, maxY, maxZ] + }); + if (defined_default(normalsURL)) { + attributes.NORMAL = accessors.length; + buffers.push({ + uri: normalsURL, + byteLength: meshNormals.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshNormals.byteLength, + target: 34962 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5126, + count: meshNormals.length / 3, + type: "VEC3" + }); + } + if (defined_default(uv0URL)) { + attributes.TEXCOORD_0 = accessors.length; + buffers.push({ + uri: uv0URL, + byteLength: meshUv0s.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshUv0s.byteLength, + target: 34962 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5126, + count: meshUv0s.length / 2, + type: "VEC2" + }); + } + if (defined_default(colorsURL)) { + attributes.COLOR_0 = accessors.length; + buffers.push({ + uri: colorsURL, + byteLength: meshColorsInBytes.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshColorsInBytes.byteLength, + target: 34962 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5126, + count: meshColorsInBytes.length / 4, + type: "VEC4" + }); + } + if (defined_default(featureId0URL)) { + attributes._FEATURE_ID_0 = accessors.length; + buffers.push({ + uri: featureId0URL, + byteLength: meshFeatureId0.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshFeatureId0.byteLength, + target: 34963 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5126, + count: meshFeatureId0.length, + type: "SCALAR" + }); + extensions.EXT_mesh_features = { + featureIds: [ + { + attribute: 0, + propertyTable: 0, + featureCount + } + ] + }; + extensionsUsed.push("EXT_mesh_features"); + } + if (defined_default(propertyTable0URL)) { + buffers.push({ + uri: propertyTable0URL, + byteLength: meshPropertyTable0.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: meshPropertyTable0.byteLength, + target: 34963 + }); + rootExtensions.EXT_structural_metadata = { + schema: { + id: "i3s-metadata-schema-001", + name: "I3S metadata schema 001", + description: "The schema for I3S metadata", + version: "1.0", + classes: { + feature: { + name: "feature", + description: "Feature metadata", + properties: { + index: { + description: "The feature index", + type: "SCALAR", + componentType: "FLOAT32", + required: true + } + } + } + } + }, + propertyTables: [ + { + name: "feature-indices-mapping", + class: "feature", + count: featureCount, + properties: { + index: { + values: bufferViews.length - 1 + } + } + } + ] + }; + extensionsUsed.push("EXT_structural_metadata"); + } + if (defined_default(outlinesIndicesURL)) { + buffers.push({ + uri: outlinesIndicesURL, + byteLength: outlinesIndexArray.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: outlinesIndexArray.byteLength, + target: 34963 + }); + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5125, + count: outlinesIndexArray.length, + type: "SCALAR" + }); + extensions.CESIUM_primitive_outline = { + indices: accessors.length - 1 + }; + extensionsUsed.push("CESIUM_primitive_outline"); + } + buffers.push({ + uri: indicesURL, + byteLength: indexArray.byteLength + }); + bufferViews.push({ + buffer: buffers.length - 1, + byteOffset: 0, + byteLength: indexArray.byteLength, + target: 34963 + }); + const meshPrimitives = []; + if (transparentVertexOffset > 0) { + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 0, + componentType: 5125, + count: transparentVertexOffset, + type: "SCALAR" + }); + meshPrimitives.push({ + attributes, + indices: accessors.length - 1, + material: meshPrimitives.length, + extensions + }); + } + if (transparentVertexOffset < vertexCount) { + accessors.push({ + bufferView: bufferViews.length - 1, + byteOffset: 4 * transparentVertexOffset, + // skip 4 bytes for each opaque vertex + componentType: 5125, + count: vertexCount - transparentVertexOffset, + type: "SCALAR" + }); + meshPrimitives.push({ + attributes, + indices: accessors.length - 1, + material: meshPrimitives.length, + extensions, + extra: { + isTransparent: true + } + }); + } + meshes.push({ + primitives: meshPrimitives + }); + nodesInScene.push(0); + nodes.push({ mesh: 0 }); + return { + buffers, + bufferViews, + accessors, + meshes, + nodes, + nodesInScene, + rootExtensions, + extensionsUsed + }; +} +function decode(data, schema, bufferInfo, featureData) { + const magicNumber = new Uint8Array(data, 0, 5); + if (magicNumber[0] === "D".charCodeAt() && magicNumber[1] === "R".charCodeAt() && magicNumber[2] === "A".charCodeAt() && magicNumber[3] === "C".charCodeAt() && magicNumber[4] === "O".charCodeAt()) { + return decodeDracoEncodedGeometry(data, bufferInfo); + } + return decodeBinaryGeometry(data, schema, bufferInfo, featureData); +} +function decodeDracoEncodedGeometry(data) { + const dracoDecoderModule = draco; + const buffer = new dracoDecoderModule.DecoderBuffer(); + const byteArray = new Uint8Array(data); + buffer.Init(byteArray, byteArray.length); + const dracoDecoder = new dracoDecoderModule.Decoder(); + const geometryType = dracoDecoder.GetEncodedGeometryType(buffer); + const metadataQuerier = new dracoDecoderModule.MetadataQuerier(); + let dracoGeometry; + let status; + if (geometryType === dracoDecoderModule.TRIANGULAR_MESH) { + dracoGeometry = new dracoDecoderModule.Mesh(); + status = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry); + } + const decodedGeometry = { + vertexCount: [0], + featureCount: 0 + }; + if (defined_default(status) && status.ok() && dracoGeometry.ptr !== 0) { + const faceCount = dracoGeometry.num_faces(); + const attributesCount = dracoGeometry.num_attributes(); + const vertexCount = dracoGeometry.num_points(); + decodedGeometry.indices = new Uint32Array(faceCount * 3); + const faces = decodedGeometry.indices; + decodedGeometry.vertexCount[0] = vertexCount; + decodedGeometry.scale_x = 1; + decodedGeometry.scale_y = 1; + const face = new dracoDecoderModule.DracoInt32Array(3); + for (let faceIndex = 0; faceIndex < faceCount; ++faceIndex) { + dracoDecoder.GetFaceFromMesh(dracoGeometry, faceIndex, face); + faces[faceIndex * 3] = face.GetValue(0); + faces[faceIndex * 3 + 1] = face.GetValue(1); + faces[faceIndex * 3 + 2] = face.GetValue(2); + } + dracoDecoderModule.destroy(face); + for (let attrIndex = 0; attrIndex < attributesCount; ++attrIndex) { + const dracoAttribute = dracoDecoder.GetAttribute( + dracoGeometry, + attrIndex + ); + const attributeData = decodeDracoAttribute( + dracoDecoderModule, + dracoDecoder, + dracoGeometry, + dracoAttribute, + vertexCount + ); + const dracoAttributeType = dracoAttribute.attribute_type(); + let attributei3sName = "unknown"; + if (dracoAttributeType === dracoDecoderModule.POSITION) { + attributei3sName = "positions"; + } else if (dracoAttributeType === dracoDecoderModule.NORMAL) { + attributei3sName = "normals"; + } else if (dracoAttributeType === dracoDecoderModule.COLOR) { + attributei3sName = "colors"; + } else if (dracoAttributeType === dracoDecoderModule.TEX_COORD) { + attributei3sName = "uv0s"; + } + const metadata = dracoDecoder.GetAttributeMetadata( + dracoGeometry, + attrIndex + ); + if (metadata.ptr !== 0) { + const numEntries = metadataQuerier.NumEntries(metadata); + for (let entry = 0; entry < numEntries; ++entry) { + const entryName = metadataQuerier.GetEntryName(metadata, entry); + if (entryName === "i3s-scale_x") { + decodedGeometry.scale_x = metadataQuerier.GetDoubleEntry( + metadata, + "i3s-scale_x" + ); + } else if (entryName === "i3s-scale_y") { + decodedGeometry.scale_y = metadataQuerier.GetDoubleEntry( + metadata, + "i3s-scale_y" + ); + } else if (entryName === "i3s-attribute-type") { + attributei3sName = metadataQuerier.GetStringEntry( + metadata, + "i3s-attribute-type" + ); + } + } + } + if (defined_default(decodedGeometry[attributei3sName])) { + console.log("Attribute already exists", attributei3sName); + } + decodedGeometry[attributei3sName] = attributeData; + if (attributei3sName === "feature-index") { + decodedGeometry.featureCount++; + } + } + dracoDecoderModule.destroy(dracoGeometry); + } + dracoDecoderModule.destroy(metadataQuerier); + dracoDecoderModule.destroy(dracoDecoder); + return decodedGeometry; +} +function decodeDracoAttribute(dracoDecoderModule, dracoDecoder, dracoGeometry, dracoAttribute, vertexCount) { + const bufferSize = dracoAttribute.num_components() * vertexCount; + let dracoAttributeData; + const handlers = [ + function() { + }, + // DT_INVALID - 0 + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt8Array(bufferSize); + const success = dracoDecoder.GetAttributeInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Int8Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt8Array(bufferSize); + const success = dracoDecoder.GetAttributeUInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Uint8Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt16Array(bufferSize); + const success = dracoDecoder.GetAttributeInt16ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Int16Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt16Array(bufferSize); + const success = dracoDecoder.GetAttributeUInt16ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Uint16Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt32Array(bufferSize); + const success = dracoDecoder.GetAttributeInt32ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Int32Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoInt32Array(bufferSize); + const success = dracoDecoder.GetAttributeUInt32ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Uint32Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + }, + function() { + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoFloat32Array(bufferSize); + const success = dracoDecoder.GetAttributeFloatForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Float32Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + }, + function() { + }, + function() { + dracoAttributeData = new dracoDecoderModule.DracoUInt8Array(bufferSize); + const success = dracoDecoder.GetAttributeUInt8ForAllPoints( + dracoGeometry, + dracoAttribute, + dracoAttributeData + ); + if (!success) { + console.error("Bad stream"); + } + const attributeData2 = new Uint8Array(bufferSize); + for (let i = 0; i < bufferSize; ++i) { + attributeData2[i] = dracoAttributeData.GetValue(i); + } + return attributeData2; + } + ]; + const attributeData = handlers[dracoAttribute.data_type()](); + if (defined_default(dracoAttributeData)) { + dracoDecoderModule.destroy(dracoAttributeData); + } + return attributeData; +} +var binaryAttributeDecoders = { + position: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 3; + decodedGeometry.positions = new Float32Array(data, offset, count); + offset += count * 4; + return offset; + }, + normal: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 3; + decodedGeometry.normals = new Float32Array(data, offset, count); + offset += count * 4; + return offset; + }, + uv0: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 2; + decodedGeometry.uv0s = new Float32Array(data, offset, count); + offset += count * 4; + return offset; + }, + color: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 4; + decodedGeometry.colors = new Uint8Array(data, offset, count); + offset += count; + return offset; + }, + featureId: function(decodedGeometry, data, offset) { + const count = decodedGeometry.featureCount; + offset += count * 8; + return offset; + }, + id: function(decodedGeometry, data, offset) { + const count = decodedGeometry.featureCount; + offset += count * 8; + return offset; + }, + faceRange: function(decodedGeometry, data, offset) { + const count = decodedGeometry.featureCount * 2; + decodedGeometry.faceRange = new Uint32Array(data, offset, count); + offset += count * 4; + return offset; + }, + uvRegion: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 4; + decodedGeometry["uv-region"] = new Uint16Array(data, offset, count); + offset += count * 2; + return offset; + }, + region: function(decodedGeometry, data, offset) { + const count = decodedGeometry.vertexCount * 4; + decodedGeometry["uv-region"] = new Uint16Array(data, offset, count); + offset += count * 2; + return offset; + } +}; +function decodeBinaryGeometry(data, schema, bufferInfo, featureData) { + const decodedGeometry = { + vertexCount: 0 + }; + const dataView = new DataView(data); + try { + let offset = 0; + decodedGeometry.vertexCount = dataView.getUint32(offset, 1); + offset += 4; + decodedGeometry.featureCount = dataView.getUint32(offset, 1); + offset += 4; + if (defined_default(bufferInfo)) { + for (let attrIndex = 0; attrIndex < bufferInfo.attributes.length; attrIndex++) { + if (defined_default(binaryAttributeDecoders[bufferInfo.attributes[attrIndex]])) { + offset = binaryAttributeDecoders[bufferInfo.attributes[attrIndex]]( + decodedGeometry, + data, + offset + ); + } else { + console.error( + "Unknown decoder for", + bufferInfo.attributes[attrIndex] + ); + } + } + } else { + let ordering = schema.ordering; + let featureAttributeOrder = schema.featureAttributeOrder; + if (defined_default(featureData) && defined_default(featureData.geometryData) && defined_default(featureData.geometryData[0]) && defined_default(featureData.geometryData[0].params)) { + ordering = Object.keys( + featureData.geometryData[0].params.vertexAttributes + ); + featureAttributeOrder = Object.keys( + featureData.geometryData[0].params.featureAttributes + ); + } + for (let i = 0; i < ordering.length; i++) { + const decoder = binaryAttributeDecoders[ordering[i]]; + offset = decoder(decodedGeometry, data, offset); + } + for (let j = 0; j < featureAttributeOrder.length; j++) { + const curDecoder = binaryAttributeDecoders[featureAttributeOrder[j]]; + offset = curDecoder(decodedGeometry, data, offset); + } + } + } catch (e) { + console.error(e); + } + decodedGeometry.scale_x = 1; + decodedGeometry.scale_y = 1; + return decodedGeometry; +} +function decodeAndCreateGltf(parameters) { + const geometryData = decode( + parameters.binaryData, + parameters.schema, + parameters.bufferInfo, + parameters.featureData + ); + if (defined_default(parameters.geoidDataList) && parameters.geoidDataList.length > 0) { + orthometricToEllipsoidal( + geometryData.vertexCount, + geometryData.positions, + geometryData.scale_x, + geometryData.scale_y, + parameters.cartographicCenter, + parameters.geoidDataList, + false + ); + } + transformToLocal( + geometryData.vertexCount, + geometryData.positions, + geometryData.normals, + parameters.cartographicCenter, + parameters.cartesianCenter, + parameters.parentRotation, + parameters.ellipsoidRadiiSquare, + geometryData.scale_x, + geometryData.scale_y + ); + if (defined_default(geometryData.uv0s) && defined_default(geometryData["uv-region"])) { + cropUVs( + geometryData.vertexCount, + geometryData.uv0s, + geometryData["uv-region"] + ); + } + let featureIndex; + if (defined_default(geometryData["feature-index"])) { + featureIndex = geometryData["feature-index"]; + } else if (defined_default(geometryData["faceRange"])) { + featureIndex = new Array(geometryData.vertexCount); + for (let range = 0; range < geometryData["faceRange"].length - 1; range += 2) { + const curIndex = range / 2; + const rangeStart = geometryData["faceRange"][range]; + const rangeEnd = geometryData["faceRange"][range + 1]; + for (let i = rangeStart; i <= rangeEnd; i++) { + featureIndex[i * 3] = curIndex; + featureIndex[i * 3 + 1] = curIndex; + featureIndex[i * 3 + 2] = curIndex; + } + } + } + if (parameters.calculateNormals) { + const data = generateNormals( + geometryData.vertexCount, + geometryData.indices, + geometryData.positions, + geometryData.normals, + geometryData.uv0s, + geometryData.colors, + featureIndex + ); + if (defined_default(data.normals)) { + geometryData.normals = data.normals; + if (defined_default(data.vertexCount)) { + geometryData.vertexCount = data.vertexCount; + geometryData.indices = data.indices; + geometryData.positions = data.positions; + geometryData.uv0s = data.uv0s; + geometryData.colors = data.colors; + featureIndex = data.featureIndex; + } + } + } + const meshData = generateGltfBuffer( + geometryData.vertexCount, + geometryData.indices, + geometryData.positions, + geometryData.normals, + geometryData.uv0s, + geometryData.colors, + featureIndex, + parameters + ); + const customAttributes = { + positions: geometryData.positions, + indices: geometryData.indices, + featureIndex, + sourceURL: parameters.url, + cartesianCenter: parameters.cartesianCenter, + parentRotation: parameters.parentRotation + }; + meshData._customAttributes = customAttributes; + const results = { + meshData + }; + return results; +} +async function initWorker(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + if (defined_default(wasmConfig) && defined_default(wasmConfig.wasmBinaryFile)) { + draco = await (0, import_draco_decoder_nodejs.default)(wasmConfig); + } else { + draco = await (0, import_draco_decoder_nodejs.default)(); + } + return true; +} +function decodeI3S(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + if (defined_default(wasmConfig)) { + return initWorker(parameters, transferableObjects); + } + return decodeAndCreateGltf(parameters, transferableObjects); +} +var decodeI3S_default = createTaskProcessorWorker_default(decodeI3S); +export { + decodeI3S_default as default +}; diff --git a/public/assets/cesium/Workers/transcodeKTX2.js b/public/assets/cesium/Workers/transcodeKTX2.js new file mode 100644 index 0000000..0013700 --- /dev/null +++ b/public/assets/cesium/Workers/transcodeKTX2.js @@ -0,0 +1,3390 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + WebGLConstants_default +} from "./chunk-3HQMMUPU.js"; +import { + RuntimeError_default +} from "./chunk-LLAF3CPH.js"; +import { + defaultValue_default +} from "./chunk-U5HSOKPQ.js"; +import { + Check_default +} from "./chunk-P6TRGU3S.js"; +import { + __commonJS, + __require, + __toESM, + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/ThirdParty/Workers/basis_transcoder.js +var require_basis_transcoder = __commonJS({ + "packages/engine/Source/ThirdParty/Workers/basis_transcoder.js"(exports, module) { + var BASIS = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") _scriptDir = _scriptDir || __filename; + return function(BASIS2) { + BASIS2 = BASIS2 || {}; + var Module = typeof BASIS2 !== "undefined" ? BASIS2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = __require("path").dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) nodeFS = __require("fs"); + if (!nodePath) nodePath = __require("path"); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + if (Module["quit"]) quit_ = Module["quit"]; + var tempRet0 = 0; + var setTempRet0 = function(value) { + tempRet0 = value; + }; + var wasmBinary; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) ++len; + else if (u <= 2047) len += 2; + else if (u <= 65535) len += 3; + else len += 4; + } + return len; + } + var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : void 0; + function UTF16ToString(ptr, maxBytesToRead) { + var endPtr = ptr; + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ""; + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[ptr + i * 2 >> 1]; + if (codeUnit == 0) break; + str += String.fromCharCode(codeUnit); + } + return str; + } + } + function stringToUTF16(str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === void 0) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + var codeUnit = str.charCodeAt(i); + HEAP16[outPtr >> 1] = codeUnit; + outPtr += 2; + } + HEAP16[outPtr >> 1] = 0; + return outPtr - startPtr; + } + function lengthBytesUTF16(str) { + return str.length * 2; + } + function UTF32ToString(ptr, maxBytesToRead) { + var i = 0; + var str = ""; + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[ptr + i * 4 >> 2]; + if (utf32 == 0) break; + ++i; + if (utf32 >= 65536) { + var ch = utf32 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } else { + str += String.fromCharCode(utf32); + } + } + return str; + } + function stringToUTF32(str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === void 0) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023; + } + HEAP32[outPtr >> 2] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + HEAP32[outPtr >> 2] = 0; + return outPtr - startPtr; + } + function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) ++i; + len += 4; + } + return len; + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "basis_transcoder.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info = { "a": asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["K"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["O"]; + addOnInit(Module["asm"]["L"]); + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + var result = WebAssembly.instantiate(binary, info); + return result; + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func = callback.func; + if (typeof func === "number") { + if (callback.arg === void 0) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === void 0 ? null : callback.arg); + } + } + } + var structRegistrations = {}; + function runDestructors(destructors) { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + } + function simpleReadValueFromPointer(pointer) { + return this["fromWireType"](HEAPU32[pointer >> 2]); + } + var awaitingDependencies = {}; + var registeredTypes = {}; + var typeDependencies = {}; + var char_0 = 48; + var char_9 = 57; + function makeLegalFunctionName(name) { + if (void 0 === name) { + return "_unknown"; + } + name = name.replace(/[^a-zA-Z0-9_]/g, "$"); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return "_" + name; + } else { + return name; + } + } + function createNamedFunction(name, body) { + name = makeLegalFunctionName(name); + return new Function("body", "return function " + name + '() {\n "use strict"; return body.apply(this, arguments);\n};\n')(body); + } + function extendError(baseErrorType, errorName) { + var errorClass = createNamedFunction(errorName, function(message) { + this.name = errorName; + this.message = message; + var stack = new Error(message).stack; + if (stack !== void 0) { + this.stack = this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, ""); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function() { + if (this.message === void 0) { + return this.name; + } else { + return this.name + ": " + this.message; + } + }; + return errorClass; + } + var InternalError = void 0; + function throwInternalError(message) { + throw new InternalError(message); + } + function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + myTypes.forEach(function(type) { + typeDependencies[type] = dependentTypes; + }); + function onComplete(typeConverters2) { + var myTypeConverters = getTypeConverters(typeConverters2); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError("Mismatched type converter count"); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach(function(dt, i) { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(function() { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } + } + function __embind_finalize_value_object(structType) { + var reg = structRegistrations[structType]; + delete structRegistrations[structType]; + var rawConstructor = reg.rawConstructor; + var rawDestructor = reg.rawDestructor; + var fieldRecords = reg.fields; + var fieldTypes = fieldRecords.map(function(field) { + return field.getterReturnType; + }).concat(fieldRecords.map(function(field) { + return field.setterArgumentType; + })); + whenDependentTypesAreResolved([structType], fieldTypes, function(fieldTypes2) { + var fields = {}; + fieldRecords.forEach(function(field, i) { + var fieldName = field.fieldName; + var getterReturnType = fieldTypes2[i]; + var getter = field.getter; + var getterContext = field.getterContext; + var setterArgumentType = fieldTypes2[i + fieldRecords.length]; + var setter = field.setter; + var setterContext = field.setterContext; + fields[fieldName] = { read: function(ptr) { + return getterReturnType["fromWireType"](getter(getterContext, ptr)); + }, write: function(ptr, o) { + var destructors = []; + setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o)); + runDestructors(destructors); + } }; + }); + return [{ name: reg.name, "fromWireType": function(ptr) { + var rv = {}; + for (var i in fields) { + rv[i] = fields[i].read(ptr); + } + rawDestructor(ptr); + return rv; + }, "toWireType": function(destructors, o) { + for (var fieldName in fields) { + if (!(fieldName in o)) { + throw new TypeError('Missing field: "' + fieldName + '"'); + } + } + var ptr = rawConstructor(); + for (fieldName in fields) { + fields[fieldName].write(ptr, o[fieldName]); + } + if (destructors !== null) { + destructors.push(rawDestructor, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: rawDestructor }]; + }); + } + function getShiftFromSize(size) { + switch (size) { + case 1: + return 0; + case 2: + return 1; + case 4: + return 2; + case 8: + return 3; + default: + throw new TypeError("Unknown type size: " + size); + } + } + function embind_init_charCodes() { + var codes = new Array(256); + for (var i = 0; i < 256; ++i) { + codes[i] = String.fromCharCode(i); + } + embind_charCodes = codes; + } + var embind_charCodes = void 0; + function readLatin1String(ptr) { + var ret = ""; + var c = ptr; + while (HEAPU8[c]) { + ret += embind_charCodes[HEAPU8[c++]]; + } + return ret; + } + var BindingError = void 0; + function throwBindingError(message) { + throw new BindingError(message); + } + function registerType(rawType, registeredInstance, options) { + options = options || {}; + if (!("argPackAdvance" in registeredInstance)) { + throw new TypeError("registerType registeredInstance requires argPackAdvance"); + } + var name = registeredInstance.name; + if (!rawType) { + throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError("Cannot register type '" + name + "' twice"); + } + } + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach(function(cb) { + cb(); + }); + } + } + function __embind_register_bool(rawType, name, size, trueValue, falseValue) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { name, "fromWireType": function(wt) { + return !!wt; + }, "toWireType": function(destructors, o) { + return o ? trueValue : falseValue; + }, "argPackAdvance": 8, "readValueFromPointer": function(pointer) { + var heap; + if (size === 1) { + heap = HEAP8; + } else if (size === 2) { + heap = HEAP16; + } else if (size === 4) { + heap = HEAP32; + } else { + throw new TypeError("Unknown boolean type size: " + name); + } + return this["fromWireType"](heap[pointer >> shift]); + }, destructorFunction: null }); + } + function ClassHandle_isAliasOf(other) { + if (!(this instanceof ClassHandle)) { + return false; + } + if (!(other instanceof ClassHandle)) { + return false; + } + var leftClass = this.$$.ptrType.registeredClass; + var left = this.$$.ptr; + var rightClass = other.$$.ptrType.registeredClass; + var right = other.$$.ptr; + while (leftClass.baseClass) { + left = leftClass.upcast(left); + leftClass = leftClass.baseClass; + } + while (rightClass.baseClass) { + right = rightClass.upcast(right); + rightClass = rightClass.baseClass; + } + return leftClass === rightClass && left === right; + } + function shallowCopyInternalPointer(o) { + return { count: o.count, deleteScheduled: o.deleteScheduled, preservePointerOnDelete: o.preservePointerOnDelete, ptr: o.ptr, ptrType: o.ptrType, smartPtr: o.smartPtr, smartPtrType: o.smartPtrType }; + } + function throwInstanceAlreadyDeleted(obj) { + function getInstanceTypeName(handle) { + return handle.$$.ptrType.registeredClass.name; + } + throwBindingError(getInstanceTypeName(obj) + " instance already deleted"); + } + var finalizationGroup = false; + function detachFinalizer(handle) { + } + function runDestructor($$) { + if ($$.smartPtr) { + $$.smartPtrType.rawDestructor($$.smartPtr); + } else { + $$.ptrType.registeredClass.rawDestructor($$.ptr); + } + } + function releaseClassHandle($$) { + $$.count.value -= 1; + var toDelete = 0 === $$.count.value; + if (toDelete) { + runDestructor($$); + } + } + function attachFinalizer(handle) { + if ("undefined" === typeof FinalizationGroup) { + attachFinalizer = function(handle2) { + return handle2; + }; + return handle; + } + finalizationGroup = new FinalizationGroup(function(iter) { + for (var result = iter.next(); !result.done; result = iter.next()) { + var $$ = result.value; + if (!$$.ptr) { + console.warn("object already deleted: " + $$.ptr); + } else { + releaseClassHandle($$); + } + } + }); + attachFinalizer = function(handle2) { + finalizationGroup.register(handle2, handle2.$$, handle2.$$); + return handle2; + }; + detachFinalizer = function(handle2) { + finalizationGroup.unregister(handle2.$$); + }; + return attachFinalizer(handle); + } + function ClassHandle_clone() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.preservePointerOnDelete) { + this.$$.count.value += 1; + return this; + } else { + var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { $$: { value: shallowCopyInternalPointer(this.$$) } })); + clone.$$.count.value += 1; + clone.$$.deleteScheduled = false; + return clone; + } + } + function ClassHandle_delete() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + detachFinalizer(this); + releaseClassHandle(this.$$); + if (!this.$$.preservePointerOnDelete) { + this.$$.smartPtr = void 0; + this.$$.ptr = void 0; + } + } + function ClassHandle_isDeleted() { + return !this.$$.ptr; + } + var delayFunction = void 0; + var deletionQueue = []; + function flushPendingDeletes() { + while (deletionQueue.length) { + var obj = deletionQueue.pop(); + obj.$$.deleteScheduled = false; + obj["delete"](); + } + } + function ClassHandle_deleteLater() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + deletionQueue.push(this); + if (deletionQueue.length === 1 && delayFunction) { + delayFunction(flushPendingDeletes); + } + this.$$.deleteScheduled = true; + return this; + } + function init_ClassHandle() { + ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf; + ClassHandle.prototype["clone"] = ClassHandle_clone; + ClassHandle.prototype["delete"] = ClassHandle_delete; + ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted; + ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater; + } + function ClassHandle() { + } + var registeredPointers = {}; + function ensureOverloadTable(proto, methodName, humanName) { + if (void 0 === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + proto[methodName] = function() { + if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { + throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); + } + return proto[methodName].overloadTable[arguments.length].apply(this, arguments); + }; + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + } + function exposePublicSymbol(name, value, numArguments) { + if (Module.hasOwnProperty(name)) { + if (void 0 === numArguments || void 0 !== Module[name].overloadTable && void 0 !== Module[name].overloadTable[numArguments]) { + throwBindingError("Cannot register public name '" + name + "' twice"); + } + ensureOverloadTable(Module, name, name); + if (Module.hasOwnProperty(numArguments)) { + throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); + } + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + if (void 0 !== numArguments) { + Module[name].numArguments = numArguments; + } + } + } + function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) { + this.name = name; + this.constructor = constructor; + this.instancePrototype = instancePrototype; + this.rawDestructor = rawDestructor; + this.baseClass = baseClass; + this.getActualType = getActualType; + this.upcast = upcast; + this.downcast = downcast; + this.pureVirtualFunctions = []; + } + function upcastPointer(ptr, ptrClass, desiredClass) { + while (ptrClass !== desiredClass) { + if (!ptrClass.upcast) { + throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name); + } + ptr = ptrClass.upcast(ptr); + ptrClass = ptrClass.baseClass; + } + return ptr; + } + function constNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + function genericPointerToWireType(destructors, handle) { + var ptr; + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + if (this.isSmartPointer) { + ptr = this.rawConstructor(); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + return ptr; + } else { + return 0; + } + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (!this.isConst && handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + if (this.isSmartPointer) { + if (void 0 === handle.$$.smartPtr) { + throwBindingError("Passing raw pointer to smart pointer is illegal"); + } + switch (this.sharingPolicy) { + case 0: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name); + } + break; + case 1: + ptr = handle.$$.smartPtr; + break; + case 2: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + var clonedHandle = handle["clone"](); + ptr = this.rawShare(ptr, __emval_register(function() { + clonedHandle["delete"](); + })); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + } + break; + default: + throwBindingError("Unsupporting sharing policy"); + } + } + return ptr; + } + function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + handle.$$.ptrType.name + " to parameter type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + function RegisteredPointer_getPointee(ptr) { + if (this.rawGetPointee) { + ptr = this.rawGetPointee(ptr); + } + return ptr; + } + function RegisteredPointer_destructor(ptr) { + if (this.rawDestructor) { + this.rawDestructor(ptr); + } + } + function RegisteredPointer_deleteObject(handle) { + if (handle !== null) { + handle["delete"](); + } + } + function downcastPointer(ptr, ptrClass, desiredClass) { + if (ptrClass === desiredClass) { + return ptr; + } + if (void 0 === desiredClass.baseClass) { + return null; + } + var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); + if (rv === null) { + return null; + } + return desiredClass.downcast(rv); + } + function getInheritedInstanceCount() { + return Object.keys(registeredInstances).length; + } + function getLiveInheritedInstances() { + var rv = []; + for (var k in registeredInstances) { + if (registeredInstances.hasOwnProperty(k)) { + rv.push(registeredInstances[k]); + } + } + return rv; + } + function setDelayFunction(fn) { + delayFunction = fn; + if (deletionQueue.length && delayFunction) { + delayFunction(flushPendingDeletes); + } + } + function init_embind() { + Module["getInheritedInstanceCount"] = getInheritedInstanceCount; + Module["getLiveInheritedInstances"] = getLiveInheritedInstances; + Module["flushPendingDeletes"] = flushPendingDeletes; + Module["setDelayFunction"] = setDelayFunction; + } + var registeredInstances = {}; + function getBasestPointer(class_, ptr) { + if (ptr === void 0) { + throwBindingError("ptr should not be undefined"); + } + while (class_.baseClass) { + ptr = class_.upcast(ptr); + class_ = class_.baseClass; + } + return ptr; + } + function getInheritedInstance(class_, ptr) { + ptr = getBasestPointer(class_, ptr); + return registeredInstances[ptr]; + } + function makeClassHandle(prototype, record) { + if (!record.ptrType || !record.ptr) { + throwInternalError("makeClassHandle requires ptr and ptrType"); + } + var hasSmartPtrType = !!record.smartPtrType; + var hasSmartPtr = !!record.smartPtr; + if (hasSmartPtrType !== hasSmartPtr) { + throwInternalError("Both smartPtrType and smartPtr must be specified"); + } + record.count = { value: 1 }; + return attachFinalizer(Object.create(prototype, { $$: { value: record } })); + } + function RegisteredPointer_fromWireType(ptr) { + var rawPointer = this.getPointee(ptr); + if (!rawPointer) { + this.destructor(ptr); + return null; + } + var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer); + if (void 0 !== registeredInstance) { + if (0 === registeredInstance.$$.count.value) { + registeredInstance.$$.ptr = rawPointer; + registeredInstance.$$.smartPtr = ptr; + return registeredInstance["clone"](); + } else { + var rv = registeredInstance["clone"](); + this.destructor(ptr); + return rv; + } + } + function makeDefaultHandle() { + if (this.isSmartPointer) { + return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this.pointeeType, ptr: rawPointer, smartPtrType: this, smartPtr: ptr }); + } else { + return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this, ptr }); + } + } + var actualType = this.registeredClass.getActualType(rawPointer); + var registeredPointerRecord = registeredPointers[actualType]; + if (!registeredPointerRecord) { + return makeDefaultHandle.call(this); + } + var toType; + if (this.isConst) { + toType = registeredPointerRecord.constPointerType; + } else { + toType = registeredPointerRecord.pointerType; + } + var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass); + if (dp === null) { + return makeDefaultHandle.call(this); + } + if (this.isSmartPointer) { + return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp, smartPtrType: this, smartPtr: ptr }); + } else { + return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp }); + } + } + function init_RegisteredPointer() { + RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee; + RegisteredPointer.prototype.destructor = RegisteredPointer_destructor; + RegisteredPointer.prototype["argPackAdvance"] = 8; + RegisteredPointer.prototype["readValueFromPointer"] = simpleReadValueFromPointer; + RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject; + RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType; + } + function RegisteredPointer(name, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) { + this.name = name; + this.registeredClass = registeredClass; + this.isReference = isReference; + this.isConst = isConst; + this.isSmartPointer = isSmartPointer; + this.pointeeType = pointeeType; + this.sharingPolicy = sharingPolicy; + this.rawGetPointee = rawGetPointee; + this.rawConstructor = rawConstructor; + this.rawShare = rawShare; + this.rawDestructor = rawDestructor; + if (!isSmartPointer && registeredClass.baseClass === void 0) { + if (isConst) { + this["toWireType"] = constNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } else { + this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } + } else { + this["toWireType"] = genericPointerToWireType; + } + } + function replacePublicSymbol(name, value, numArguments) { + if (!Module.hasOwnProperty(name)) { + throwInternalError("Replacing nonexistant public symbol"); + } + if (void 0 !== Module[name].overloadTable && void 0 !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + Module[name].argCount = numArguments; + } + } + function dynCallLegacy(sig, ptr, args) { + var f = Module["dynCall_" + sig]; + return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr); + } + function dynCall(sig, ptr, args) { + if (sig.indexOf("j") != -1) { + return dynCallLegacy(sig, ptr, args); + } + return wasmTable.get(ptr).apply(null, args); + } + function getDynCaller(sig, ptr) { + var argCache = []; + return function() { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; + } + function embind__requireFunction(signature, rawFunction) { + signature = readLatin1String(signature); + function makeDynCaller() { + if (signature.indexOf("j") != -1) { + return getDynCaller(signature, rawFunction); + } + return wasmTable.get(rawFunction); + } + var fp = makeDynCaller(); + if (typeof fp !== "function") { + throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); + } + return fp; + } + var UnboundTypeError = void 0; + function getTypeName(type) { + var ptr = ___getTypeName(type); + var rv = readLatin1String(ptr); + _free(ptr); + return rv; + } + function throwUnboundTypeError(message, types) { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "])); + } + function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name, destructorSignature, rawDestructor) { + name = readLatin1String(name); + getActualType = embind__requireFunction(getActualTypeSignature, getActualType); + if (upcast) { + upcast = embind__requireFunction(upcastSignature, upcast); + } + if (downcast) { + downcast = embind__requireFunction(downcastSignature, downcast); + } + rawDestructor = embind__requireFunction(destructorSignature, rawDestructor); + var legalFunctionName = makeLegalFunctionName(name); + exposePublicSymbol(legalFunctionName, function() { + throwUnboundTypeError("Cannot construct " + name + " due to unbound types", [baseClassRawType]); + }); + whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function(base) { + base = base[0]; + var baseClass; + var basePrototype; + if (baseClassRawType) { + baseClass = base.registeredClass; + basePrototype = baseClass.instancePrototype; + } else { + basePrototype = ClassHandle.prototype; + } + var constructor = createNamedFunction(legalFunctionName, function() { + if (Object.getPrototypeOf(this) !== instancePrototype) { + throw new BindingError("Use 'new' to construct " + name); + } + if (void 0 === registeredClass.constructor_body) { + throw new BindingError(name + " has no accessible constructor"); + } + var body = registeredClass.constructor_body[arguments.length]; + if (void 0 === body) { + throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!"); + } + return body.apply(this, arguments); + }); + var instancePrototype = Object.create(basePrototype, { constructor: { value: constructor } }); + constructor.prototype = instancePrototype; + var registeredClass = new RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast); + var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false); + var pointerConverter = new RegisteredPointer(name + "*", registeredClass, false, false, false); + var constPointerConverter = new RegisteredPointer(name + " const*", registeredClass, false, true, false); + registeredPointers[rawType] = { pointerType: pointerConverter, constPointerType: constPointerConverter }; + replacePublicSymbol(legalFunctionName, constructor); + return [referenceConverter, pointerConverter, constPointerConverter]; + }); + } + function heap32VectorToArray(count, firstElement) { + var array = []; + for (var i = 0; i < count; i++) { + array.push(HEAP32[(firstElement >> 2) + i]); + } + return array; + } + function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) { + assert(argCount > 0); + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + invoker = embind__requireFunction(invokerSignature, invoker); + var args = [rawConstructor]; + var destructors = []; + whenDependentTypesAreResolved([], [rawClassType], function(classType) { + classType = classType[0]; + var humanName = "constructor " + classType.name; + if (void 0 === classType.registeredClass.constructor_body) { + classType.registeredClass.constructor_body = []; + } + if (void 0 !== classType.registeredClass.constructor_body[argCount - 1]) { + throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount - 1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!"); + } + classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() { + throwUnboundTypeError("Cannot construct " + classType.name + " due to unbound types", rawArgTypes); + }; + whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { + classType.registeredClass.constructor_body[argCount - 1] = function constructor_body() { + if (arguments.length !== argCount - 1) { + throwBindingError(humanName + " called with " + arguments.length + " arguments, expected " + (argCount - 1)); + } + destructors.length = 0; + args.length = argCount; + for (var i = 1; i < argCount; ++i) { + args[i] = argTypes[i]["toWireType"](destructors, arguments[i - 1]); + } + var ptr = invoker.apply(null, args); + runDestructors(destructors); + return argTypes[0]["fromWireType"](ptr); + }; + return []; + }); + return []; + }); + } + function new_(constructor, argumentList) { + if (!(constructor instanceof Function)) { + throw new TypeError("new_ called with constructor type " + typeof constructor + " which is not a function"); + } + var dummy = createNamedFunction(constructor.name || "unknownFunctionName", function() { + }); + dummy.prototype = constructor.prototype; + var obj = new dummy(); + var r = constructor.apply(obj, argumentList); + return r instanceof Object ? r : obj; + } + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + var argCount = argTypes.length; + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + var isClassMethodFunc = argTypes[1] !== null && classType !== null; + var needsDestructorStack = false; + for (var i = 1; i < argTypes.length; ++i) { + if (argTypes[i] !== null && argTypes[i].destructorFunction === void 0) { + needsDestructorStack = true; + break; + } + } + var returns = argTypes[0].name !== "void"; + var argsList = ""; + var argsListWired = ""; + for (var i = 0; i < argCount - 2; ++i) { + argsList += (i !== 0 ? ", " : "") + "arg" + i; + argsListWired += (i !== 0 ? ", " : "") + "arg" + i + "Wired"; + } + var invokerFnBody = "return function " + makeLegalFunctionName(humanName) + "(" + argsList + ") {\nif (arguments.length !== " + (argCount - 2) + ") {\nthrowBindingError('function " + humanName + " called with ' + arguments.length + ' arguments, expected " + (argCount - 2) + " args!');\n}\n"; + if (needsDestructorStack) { + invokerFnBody += "var destructors = [];\n"; + } + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; + var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; + if (isClassMethodFunc) { + invokerFnBody += "var thisWired = classParam.toWireType(" + dtorStack + ", this);\n"; + } + for (var i = 0; i < argCount - 2; ++i) { + invokerFnBody += "var arg" + i + "Wired = argType" + i + ".toWireType(" + dtorStack + ", arg" + i + "); // " + argTypes[i + 2].name + "\n"; + args1.push("argType" + i); + args2.push(argTypes[i + 2]); + } + if (isClassMethodFunc) { + argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired; + } + invokerFnBody += (returns ? "var rv = " : "") + "invoker(fn" + (argsListWired.length > 0 ? ", " : "") + argsListWired + ");\n"; + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) { + var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired"; + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += paramName + "_dtor(" + paramName + "); // " + argTypes[i].name + "\n"; + args1.push(paramName + "_dtor"); + args2.push(argTypes[i].destructorFunction); + } + } + } + if (returns) { + invokerFnBody += "var ret = retType.fromWireType(rv);\nreturn ret;\n"; + } else { + } + invokerFnBody += "}\n"; + args1.push(invokerFnBody); + var invokerFunction = new_(Function, args1).apply(null, args2); + return invokerFunction; + } + function __embind_register_class_function(rawClassType, methodName, argCount, rawArgTypesAddr, invokerSignature, rawInvoker, context, isPureVirtual) { + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + methodName = readLatin1String(methodName); + rawInvoker = embind__requireFunction(invokerSignature, rawInvoker); + whenDependentTypesAreResolved([], [rawClassType], function(classType) { + classType = classType[0]; + var humanName = classType.name + "." + methodName; + if (isPureVirtual) { + classType.registeredClass.pureVirtualFunctions.push(methodName); + } + function unboundTypesHandler() { + throwUnboundTypeError("Cannot call " + humanName + " due to unbound types", rawArgTypes); + } + var proto = classType.registeredClass.instancePrototype; + var method = proto[methodName]; + if (void 0 === method || void 0 === method.overloadTable && method.className !== classType.name && method.argCount === argCount - 2) { + unboundTypesHandler.argCount = argCount - 2; + unboundTypesHandler.className = classType.name; + proto[methodName] = unboundTypesHandler; + } else { + ensureOverloadTable(proto, methodName, humanName); + proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler; + } + whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { + var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context); + if (void 0 === proto[methodName].overloadTable) { + memberFunction.argCount = argCount - 2; + proto[methodName] = memberFunction; + } else { + proto[methodName].overloadTable[argCount - 2] = memberFunction; + } + return []; + }); + return []; + }); + } + function __embind_register_constant(name, type, value) { + name = readLatin1String(name); + whenDependentTypesAreResolved([], [type], function(type2) { + type2 = type2[0]; + Module[name] = type2["fromWireType"](value); + return []; + }); + } + var emval_free_list = []; + var emval_handle_array = [{}, { value: void 0 }, { value: null }, { value: true }, { value: false }]; + function __emval_decref(handle) { + if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { + emval_handle_array[handle] = void 0; + emval_free_list.push(handle); + } + } + function count_emval_handles() { + var count = 0; + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== void 0) { + ++count; + } + } + return count; + } + function get_first_emval() { + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== void 0) { + return emval_handle_array[i]; + } + } + return null; + } + function init_emval() { + Module["count_emval_handles"] = count_emval_handles; + Module["get_first_emval"] = get_first_emval; + } + function __emval_register(value) { + switch (value) { + case void 0: { + return 1; + } + case null: { + return 2; + } + case true: { + return 3; + } + case false: { + return 4; + } + default: { + var handle = emval_free_list.length ? emval_free_list.pop() : emval_handle_array.length; + emval_handle_array[handle] = { refcount: 1, value }; + return handle; + } + } + } + function __embind_register_emval(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { name, "fromWireType": function(handle) { + var rv = emval_handle_array[handle].value; + __emval_decref(handle); + return rv; + }, "toWireType": function(destructors, value) { + return __emval_register(value); + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: null }); + } + function enumReadValueFromPointer(name, shift, signed) { + switch (shift) { + case 0: + return function(pointer) { + var heap = signed ? HEAP8 : HEAPU8; + return this["fromWireType"](heap[pointer]); + }; + case 1: + return function(pointer) { + var heap = signed ? HEAP16 : HEAPU16; + return this["fromWireType"](heap[pointer >> 1]); + }; + case 2: + return function(pointer) { + var heap = signed ? HEAP32 : HEAPU32; + return this["fromWireType"](heap[pointer >> 2]); + }; + default: + throw new TypeError("Unknown integer type: " + name); + } + } + function __embind_register_enum(rawType, name, size, isSigned) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + function ctor() { + } + ctor.values = {}; + registerType(rawType, { name, constructor: ctor, "fromWireType": function(c) { + return this.constructor.values[c]; + }, "toWireType": function(destructors, c) { + return c.value; + }, "argPackAdvance": 8, "readValueFromPointer": enumReadValueFromPointer(name, shift, isSigned), destructorFunction: null }); + exposePublicSymbol(name, ctor); + } + function requireRegisteredType(rawType, humanName) { + var impl = registeredTypes[rawType]; + if (void 0 === impl) { + throwBindingError(humanName + " has unknown type " + getTypeName(rawType)); + } + return impl; + } + function __embind_register_enum_value(rawEnumType, name, enumValue) { + var enumType = requireRegisteredType(rawEnumType, "enum"); + name = readLatin1String(name); + var Enum = enumType.constructor; + var Value = Object.create(enumType.constructor.prototype, { value: { value: enumValue }, constructor: { value: createNamedFunction(enumType.name + "_" + name, function() { + }) } }); + Enum.values[enumValue] = Value; + Enum[name] = Value; + } + function _embind_repr(v) { + if (v === null) { + return "null"; + } + var t = typeof v; + if (t === "object" || t === "array" || t === "function") { + return v.toString(); + } else { + return "" + v; + } + } + function floatReadValueFromPointer(name, shift) { + switch (shift) { + case 2: + return function(pointer) { + return this["fromWireType"](HEAPF32[pointer >> 2]); + }; + case 3: + return function(pointer) { + return this["fromWireType"](HEAPF64[pointer >> 3]); + }; + default: + throw new TypeError("Unknown float type: " + name); + } + } + function __embind_register_float(rawType, name, size) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { name, "fromWireType": function(value) { + return value; + }, "toWireType": function(destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + return value; + }, "argPackAdvance": 8, "readValueFromPointer": floatReadValueFromPointer(name, shift), destructorFunction: null }); + } + function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) { + var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + name = readLatin1String(name); + rawInvoker = embind__requireFunction(signature, rawInvoker); + exposePublicSymbol(name, function() { + throwUnboundTypeError("Cannot call " + name + " due to unbound types", argTypes); + }, argCount - 1); + whenDependentTypesAreResolved([], argTypes, function(argTypes2) { + var invokerArgsArray = [argTypes2[0], null].concat(argTypes2.slice(1)); + replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn), argCount - 1); + return []; + }); + } + function integerReadValueFromPointer(name, shift, signed) { + switch (shift) { + case 0: + return signed ? function readS8FromPointer(pointer) { + return HEAP8[pointer]; + } : function readU8FromPointer(pointer) { + return HEAPU8[pointer]; + }; + case 1: + return signed ? function readS16FromPointer(pointer) { + return HEAP16[pointer >> 1]; + } : function readU16FromPointer(pointer) { + return HEAPU16[pointer >> 1]; + }; + case 2: + return signed ? function readS32FromPointer(pointer) { + return HEAP32[pointer >> 2]; + } : function readU32FromPointer(pointer) { + return HEAPU32[pointer >> 2]; + }; + default: + throw new TypeError("Unknown integer type: " + name); + } + } + function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { + name = readLatin1String(name); + if (maxRange === -1) { + maxRange = 4294967295; + } + var shift = getShiftFromSize(size); + var fromWireType = function(value) { + return value; + }; + if (minRange === 0) { + var bitshift = 32 - 8 * size; + fromWireType = function(value) { + return value << bitshift >>> bitshift; + }; + } + var isUnsignedType = name.indexOf("unsigned") != -1; + registerType(primitiveType, { name, "fromWireType": fromWireType, "toWireType": function(destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + if (value < minRange || value > maxRange) { + throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!"); + } + return isUnsignedType ? value >>> 0 : value | 0; + }, "argPackAdvance": 8, "readValueFromPointer": integerReadValueFromPointer(name, shift, minRange !== 0), destructorFunction: null }); + } + function __embind_register_memory_view(rawType, dataTypeIndex, name) { + var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array]; + var TA = typeMapping[dataTypeIndex]; + function decodeMemoryView(handle) { + handle = handle >> 2; + var heap = HEAPU32; + var size = heap[handle]; + var data = heap[handle + 1]; + return new TA(buffer, data, size); + } + name = readLatin1String(name); + registerType(rawType, { name, "fromWireType": decodeMemoryView, "argPackAdvance": 8, "readValueFromPointer": decodeMemoryView }, { ignoreDuplicateRegistrations: true }); + } + function __embind_register_std_string(rawType, name) { + name = readLatin1String(name); + var stdStringIsUTF8 = name === "std::string"; + registerType(rawType, { name, "fromWireType": function(value) { + var length = HEAPU32[value >> 2]; + var str; + if (stdStringIsUTF8) { + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i; + if (i == length || HEAPU8[currentBytePtr] == 0) { + var maxRead = currentBytePtr - decodeStartPtr; + var stringSegment = UTF8ToString(decodeStartPtr, maxRead); + if (str === void 0) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + 1; + } + } + } else { + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAPU8[value + 4 + i]); + } + str = a.join(""); + } + _free(value); + return str; + }, "toWireType": function(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + var getLength; + var valueIsOfTypeString = typeof value === "string"; + if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { + throwBindingError("Cannot pass non-string to std::string"); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + getLength = function() { + return lengthBytesUTF8(value); + }; + } else { + getLength = function() { + return value.length; + }; + } + var length = getLength(); + var ptr = _malloc(4 + length + 1); + HEAPU32[ptr >> 2] = length; + if (stdStringIsUTF8 && valueIsOfTypeString) { + stringToUTF8(value, ptr + 4, length + 1); + } else { + if (valueIsOfTypeString) { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(ptr); + throwBindingError("String has UTF-16 code units that do not fit in 8 bits"); + } + HEAPU8[ptr + 4 + i] = charCode; + } + } else { + for (var i = 0; i < length; ++i) { + HEAPU8[ptr + 4 + i] = value[i]; + } + } + } + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: function(ptr) { + _free(ptr); + } }); + } + function __embind_register_std_wstring(rawType, charSize, name) { + name = readLatin1String(name); + var decodeString, encodeString, getHeap, lengthBytesUTF, shift; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + getHeap = function() { + return HEAPU16; + }; + shift = 1; + } else if (charSize === 4) { + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + getHeap = function() { + return HEAPU32; + }; + shift = 2; + } + registerType(rawType, { name, "fromWireType": function(value) { + var length = HEAPU32[value >> 2]; + var HEAP = getHeap(); + var str; + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i * charSize; + if (i == length || HEAP[currentBytePtr >> shift] == 0) { + var maxReadBytes = currentBytePtr - decodeStartPtr; + var stringSegment = decodeString(decodeStartPtr, maxReadBytes); + if (str === void 0) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + charSize; + } + } + _free(value); + return str; + }, "toWireType": function(destructors, value) { + if (!(typeof value === "string")) { + throwBindingError("Cannot pass non-string to C++ string type " + name); + } + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + HEAPU32[ptr >> 2] = length >> shift; + encodeString(value, ptr + 4, length + charSize); + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: function(ptr) { + _free(ptr); + } }); + } + function __embind_register_value_object(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) { + structRegistrations[rawType] = { name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: [] }; + } + function __embind_register_value_object_field(structType, fieldName, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) { + structRegistrations[structType].fields.push({ fieldName: readLatin1String(fieldName), getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext }); + } + function __embind_register_void(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { isVoid: true, name, "argPackAdvance": 0, "fromWireType": function() { + return void 0; + }, "toWireType": function(destructors, o) { + return void 0; + } }); + } + function requireHandle(handle) { + if (!handle) { + throwBindingError("Cannot use deleted val. handle = " + handle); + } + return emval_handle_array[handle].value; + } + function __emval_as(handle, returnType, destructorsRef) { + handle = requireHandle(handle); + returnType = requireRegisteredType(returnType, "emval::as"); + var destructors = []; + var rd = __emval_register(destructors); + HEAP32[destructorsRef >> 2] = rd; + return returnType["toWireType"](destructors, handle); + } + var emval_symbols = {}; + function getStringOrSymbol(address) { + var symbol = emval_symbols[address]; + if (symbol === void 0) { + return readLatin1String(address); + } else { + return symbol; + } + } + var emval_methodCallers = []; + function __emval_call_void_method(caller, handle, methodName, args) { + caller = emval_methodCallers[caller]; + handle = requireHandle(handle); + methodName = getStringOrSymbol(methodName); + caller(handle, methodName, null, args); + } + function emval_get_global() { + if (typeof globalThis === "object") { + return globalThis; + } + return (/* @__PURE__ */ function() { + return Function; + }())("return this")(); + } + function __emval_get_global(name) { + if (name === 0) { + return __emval_register(emval_get_global()); + } else { + name = getStringOrSymbol(name); + return __emval_register(emval_get_global()[name]); + } + } + function __emval_addMethodCaller(caller) { + var id = emval_methodCallers.length; + emval_methodCallers.push(caller); + return id; + } + function __emval_lookupTypes(argCount, argTypes) { + var a = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + a[i] = requireRegisteredType(HEAP32[(argTypes >> 2) + i], "parameter " + i); + } + return a; + } + function __emval_get_method_caller(argCount, argTypes) { + var types = __emval_lookupTypes(argCount, argTypes); + var retType = types[0]; + var signatureName = retType.name + "_$" + types.slice(1).map(function(t) { + return t.name; + }).join("_") + "$"; + var params = ["retType"]; + var args = [retType]; + var argsList = ""; + for (var i = 0; i < argCount - 1; ++i) { + argsList += (i !== 0 ? ", " : "") + "arg" + i; + params.push("argType" + i); + args.push(types[1 + i]); + } + var functionName = makeLegalFunctionName("methodCaller_" + signatureName); + var functionBody = "return function " + functionName + "(handle, name, destructors, args) {\n"; + var offset = 0; + for (var i = 0; i < argCount - 1; ++i) { + functionBody += " var arg" + i + " = argType" + i + ".readValueFromPointer(args" + (offset ? "+" + offset : "") + ");\n"; + offset += types[i + 1]["argPackAdvance"]; + } + functionBody += " var rv = handle[name](" + argsList + ");\n"; + for (var i = 0; i < argCount - 1; ++i) { + if (types[i + 1]["deleteObject"]) { + functionBody += " argType" + i + ".deleteObject(arg" + i + ");\n"; + } + } + if (!retType.isVoid) { + functionBody += " return retType.toWireType(destructors, rv);\n"; + } + functionBody += "};\n"; + params.push(functionBody); + var invokerFunction = new_(Function, params).apply(null, args); + return __emval_addMethodCaller(invokerFunction); + } + function __emval_get_module_property(name) { + name = getStringOrSymbol(name); + return __emval_register(Module[name]); + } + function __emval_get_property(handle, key2) { + handle = requireHandle(handle); + key2 = requireHandle(key2); + return __emval_register(handle[key2]); + } + function __emval_incref(handle) { + if (handle > 4) { + emval_handle_array[handle].refcount += 1; + } + } + function craftEmvalAllocator(argCount) { + var argsList = ""; + for (var i = 0; i < argCount; ++i) { + argsList += (i !== 0 ? ", " : "") + "arg" + i; + } + var functionBody = "return function emval_allocator_" + argCount + "(constructor, argTypes, args) {\n"; + for (var i = 0; i < argCount; ++i) { + functionBody += "var argType" + i + " = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + " + i + '], "parameter ' + i + '");\nvar arg' + i + " = argType" + i + ".readValueFromPointer(args);\nargs += argType" + i + "['argPackAdvance'];\n"; + } + functionBody += "var obj = new constructor(" + argsList + ");\nreturn __emval_register(obj);\n}\n"; + return new Function("requireRegisteredType", "Module", "__emval_register", functionBody)(requireRegisteredType, Module, __emval_register); + } + var emval_newers = {}; + function __emval_new(handle, argCount, argTypes, args) { + handle = requireHandle(handle); + var newer = emval_newers[argCount]; + if (!newer) { + newer = craftEmvalAllocator(argCount); + emval_newers[argCount] = newer; + } + return newer(handle, argTypes, args); + } + function __emval_new_cstring(v) { + return __emval_register(getStringOrSymbol(v)); + } + function __emval_run_destructors(handle) { + var destructors = emval_handle_array[handle].value; + runDestructors(destructors); + __emval_decref(handle); + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer2 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer2, 0)); + buffer2.length = 0; + } else { + buffer2.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + } }; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + function _setTempRet0($i) { + setTempRet0($i | 0); + } + InternalError = Module["InternalError"] = extendError(Error, "InternalError"); + embind_init_charCodes(); + BindingError = Module["BindingError"] = extendError(Error, "BindingError"); + init_ClassHandle(); + init_RegisteredPointer(); + init_embind(); + UnboundTypeError = Module["UnboundTypeError"] = extendError(Error, "UnboundTypeError"); + init_emval(); + var asmLibraryArg = { "t": __embind_finalize_value_object, "I": __embind_register_bool, "x": __embind_register_class, "w": __embind_register_class_constructor, "d": __embind_register_class_function, "k": __embind_register_constant, "H": __embind_register_emval, "n": __embind_register_enum, "a": __embind_register_enum_value, "A": __embind_register_float, "i": __embind_register_function, "j": __embind_register_integer, "h": __embind_register_memory_view, "B": __embind_register_std_string, "v": __embind_register_std_wstring, "u": __embind_register_value_object, "c": __embind_register_value_object_field, "J": __embind_register_void, "m": __emval_as, "s": __emval_call_void_method, "b": __emval_decref, "y": __emval_get_global, "p": __emval_get_method_caller, "r": __emval_get_module_property, "e": __emval_get_property, "g": __emval_incref, "q": __emval_new, "f": __emval_new_cstring, "l": __emval_run_destructors, "o": _abort, "E": _emscripten_memcpy_big, "F": _emscripten_resize_heap, "G": _fd_close, "C": _fd_seek, "z": _fd_write, "D": _setTempRet0 }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["N"]).apply(null, arguments); + }; + var ___getTypeName = Module["___getTypeName"] = function() { + return (___getTypeName = Module["___getTypeName"] = Module["asm"]["P"]).apply(null, arguments); + }; + var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() { + return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var dynCall_jiji = Module["dynCall_jiji"] = function() { + return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["R"]).apply(null, arguments); + }; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + return BASIS2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = BASIS; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return BASIS; + }); + else if (typeof exports === "object") + exports["BASIS"] = BASIS; + } +}); + +// packages/engine/Source/Renderer/PixelDatatype.js +var PixelDatatype = { + UNSIGNED_BYTE: WebGLConstants_default.UNSIGNED_BYTE, + UNSIGNED_SHORT: WebGLConstants_default.UNSIGNED_SHORT, + UNSIGNED_INT: WebGLConstants_default.UNSIGNED_INT, + FLOAT: WebGLConstants_default.FLOAT, + HALF_FLOAT: WebGLConstants_default.HALF_FLOAT_OES, + UNSIGNED_INT_24_8: WebGLConstants_default.UNSIGNED_INT_24_8, + UNSIGNED_SHORT_4_4_4_4: WebGLConstants_default.UNSIGNED_SHORT_4_4_4_4, + UNSIGNED_SHORT_5_5_5_1: WebGLConstants_default.UNSIGNED_SHORT_5_5_5_1, + UNSIGNED_SHORT_5_6_5: WebGLConstants_default.UNSIGNED_SHORT_5_6_5 +}; +PixelDatatype.toWebGLConstant = function(pixelDatatype, context) { + switch (pixelDatatype) { + case PixelDatatype.UNSIGNED_BYTE: + return WebGLConstants_default.UNSIGNED_BYTE; + case PixelDatatype.UNSIGNED_SHORT: + return WebGLConstants_default.UNSIGNED_SHORT; + case PixelDatatype.UNSIGNED_INT: + return WebGLConstants_default.UNSIGNED_INT; + case PixelDatatype.FLOAT: + return WebGLConstants_default.FLOAT; + case PixelDatatype.HALF_FLOAT: + return context.webgl2 ? WebGLConstants_default.HALF_FLOAT : WebGLConstants_default.HALF_FLOAT_OES; + case PixelDatatype.UNSIGNED_INT_24_8: + return WebGLConstants_default.UNSIGNED_INT_24_8; + case PixelDatatype.UNSIGNED_SHORT_4_4_4_4: + return WebGLConstants_default.UNSIGNED_SHORT_4_4_4_4; + case PixelDatatype.UNSIGNED_SHORT_5_5_5_1: + return WebGLConstants_default.UNSIGNED_SHORT_5_5_5_1; + case PixelDatatype.UNSIGNED_SHORT_5_6_5: + return PixelDatatype.UNSIGNED_SHORT_5_6_5; + } +}; +PixelDatatype.isPacked = function(pixelDatatype) { + return pixelDatatype === PixelDatatype.UNSIGNED_INT_24_8 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_4_4_4_4 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_5_5_1 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_6_5; +}; +PixelDatatype.sizeInBytes = function(pixelDatatype) { + switch (pixelDatatype) { + case PixelDatatype.UNSIGNED_BYTE: + return 1; + case PixelDatatype.UNSIGNED_SHORT: + case PixelDatatype.UNSIGNED_SHORT_4_4_4_4: + case PixelDatatype.UNSIGNED_SHORT_5_5_5_1: + case PixelDatatype.UNSIGNED_SHORT_5_6_5: + case PixelDatatype.HALF_FLOAT: + return 2; + case PixelDatatype.UNSIGNED_INT: + case PixelDatatype.FLOAT: + case PixelDatatype.UNSIGNED_INT_24_8: + return 4; + } +}; +PixelDatatype.validate = function(pixelDatatype) { + return pixelDatatype === PixelDatatype.UNSIGNED_BYTE || pixelDatatype === PixelDatatype.UNSIGNED_SHORT || pixelDatatype === PixelDatatype.UNSIGNED_INT || pixelDatatype === PixelDatatype.FLOAT || pixelDatatype === PixelDatatype.HALF_FLOAT || pixelDatatype === PixelDatatype.UNSIGNED_INT_24_8 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_4_4_4_4 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_5_5_1 || pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_6_5; +}; +PixelDatatype.getTypedArrayConstructor = function(pixelDatatype) { + const sizeInBytes = PixelDatatype.sizeInBytes(pixelDatatype); + if (sizeInBytes === Uint8Array.BYTES_PER_ELEMENT) { + return Uint8Array; + } else if (sizeInBytes === Uint16Array.BYTES_PER_ELEMENT) { + return Uint16Array; + } else if (sizeInBytes === Float32Array.BYTES_PER_ELEMENT && pixelDatatype === PixelDatatype.FLOAT) { + return Float32Array; + } + return Uint32Array; +}; +var PixelDatatype_default = Object.freeze(PixelDatatype); + +// packages/engine/Source/Core/PixelFormat.js +var PixelFormat = { + /** + * A pixel format containing a depth value. + * + * @type {number} + * @constant + */ + DEPTH_COMPONENT: WebGLConstants_default.DEPTH_COMPONENT, + /** + * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}. + * + * @type {number} + * @constant + */ + DEPTH_STENCIL: WebGLConstants_default.DEPTH_STENCIL, + /** + * A pixel format containing an alpha channel. + * + * @type {number} + * @constant + */ + ALPHA: WebGLConstants_default.ALPHA, + /** + * A pixel format containing a red channel + * + * @type {number} + * @constant + */ + RED: WebGLConstants_default.RED, + /** + * A pixel format containing red and green channels. + * + * @type {number} + * @constant + */ + RG: WebGLConstants_default.RG, + /** + * A pixel format containing red, green, and blue channels. + * + * @type {number} + * @constant + */ + RGB: WebGLConstants_default.RGB, + /** + * A pixel format containing red, green, blue, and alpha channels. + * + * @type {number} + * @constant + */ + RGBA: WebGLConstants_default.RGBA, + /** + * A pixel format containing a luminance (intensity) channel. + * + * @type {number} + * @constant + */ + LUMINANCE: WebGLConstants_default.LUMINANCE, + /** + * A pixel format containing luminance (intensity) and alpha channels. + * + * @type {number} + * @constant + */ + LUMINANCE_ALPHA: WebGLConstants_default.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + * + * @type {number} + * @constant + */ + RGB_DXT1: WebGLConstants_default.COMPRESSED_RGB_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT1: WebGLConstants_default.COMPRESSED_RGBA_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT3: WebGLConstants_default.COMPRESSED_RGBA_S3TC_DXT3_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + * + * @type {number} + * @constant + */ + RGBA_DXT5: WebGLConstants_default.COMPRESSED_RGBA_S3TC_DXT5_EXT, + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + * + * @type {number} + * @constant + */ + RGB_PVRTC_4BPPV1: WebGLConstants_default.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + * + * @type {number} + * @constant + */ + RGB_PVRTC_2BPPV1: WebGLConstants_default.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + * + * @type {number} + * @constant + */ + RGBA_PVRTC_4BPPV1: WebGLConstants_default.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + * + * @type {number} + * @constant + */ + RGBA_PVRTC_2BPPV1: WebGLConstants_default.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is ASTC compressed. + * + * @type {number} + * @constant + */ + RGBA_ASTC: WebGLConstants_default.COMPRESSED_RGBA_ASTC_4x4_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + * + * @type {number} + * @constant + */ + RGB_ETC1: WebGLConstants_default.COMPRESSED_RGB_ETC1_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC2 compressed. + * + * @type {number} + * @constant + */ + RGB8_ETC2: WebGLConstants_default.COMPRESSED_RGB8_ETC2, + /** + * A pixel format containing red, green, blue, and alpha channels that is ETC2 compressed. + * + * @type {number} + * @constant + */ + RGBA8_ETC2_EAC: WebGLConstants_default.COMPRESSED_RGBA8_ETC2_EAC, + /** + * A pixel format containing red, green, blue, and alpha channels that is BC7 compressed. + * + * @type {number} + * @constant + */ + RGBA_BC7: WebGLConstants_default.COMPRESSED_RGBA_BPTC_UNORM +}; +PixelFormat.componentsLength = function(pixelFormat) { + switch (pixelFormat) { + case PixelFormat.RGB: + return 3; + case PixelFormat.RGBA: + return 4; + case PixelFormat.LUMINANCE_ALPHA: + case PixelFormat.RG: + return 2; + case PixelFormat.ALPHA: + case PixelFormat.RED: + case PixelFormat.LUMINANCE: + return 1; + default: + return 1; + } +}; +PixelFormat.validate = function(pixelFormat) { + return pixelFormat === PixelFormat.DEPTH_COMPONENT || pixelFormat === PixelFormat.DEPTH_STENCIL || pixelFormat === PixelFormat.ALPHA || pixelFormat === PixelFormat.RED || pixelFormat === PixelFormat.RG || pixelFormat === PixelFormat.RGB || pixelFormat === PixelFormat.RGBA || pixelFormat === PixelFormat.LUMINANCE || pixelFormat === PixelFormat.LUMINANCE_ALPHA || pixelFormat === PixelFormat.RGB_DXT1 || pixelFormat === PixelFormat.RGBA_DXT1 || pixelFormat === PixelFormat.RGBA_DXT3 || pixelFormat === PixelFormat.RGBA_DXT5 || pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || pixelFormat === PixelFormat.RGBA_ASTC || pixelFormat === PixelFormat.RGB_ETC1 || pixelFormat === PixelFormat.RGB8_ETC2 || pixelFormat === PixelFormat.RGBA8_ETC2_EAC || pixelFormat === PixelFormat.RGBA_BC7; +}; +PixelFormat.isColorFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.RED || pixelFormat === PixelFormat.ALPHA || pixelFormat === PixelFormat.RGB || pixelFormat === PixelFormat.RGBA || pixelFormat === PixelFormat.LUMINANCE || pixelFormat === PixelFormat.LUMINANCE_ALPHA; +}; +PixelFormat.isDepthFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.DEPTH_COMPONENT || pixelFormat === PixelFormat.DEPTH_STENCIL; +}; +PixelFormat.isCompressedFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || pixelFormat === PixelFormat.RGBA_DXT1 || pixelFormat === PixelFormat.RGBA_DXT3 || pixelFormat === PixelFormat.RGBA_DXT5 || pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || pixelFormat === PixelFormat.RGBA_ASTC || pixelFormat === PixelFormat.RGB_ETC1 || pixelFormat === PixelFormat.RGB8_ETC2 || pixelFormat === PixelFormat.RGBA8_ETC2_EAC || pixelFormat === PixelFormat.RGBA_BC7; +}; +PixelFormat.isDXTFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || pixelFormat === PixelFormat.RGBA_DXT1 || pixelFormat === PixelFormat.RGBA_DXT3 || pixelFormat === PixelFormat.RGBA_DXT5; +}; +PixelFormat.isPVRTCFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1; +}; +PixelFormat.isASTCFormat = function(pixelFormat) { + return pixelFormat === PixelFormat.RGBA_ASTC; +}; +PixelFormat.isETC1Format = function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_ETC1; +}; +PixelFormat.isETC2Format = function(pixelFormat) { + return pixelFormat === PixelFormat.RGB8_ETC2 || pixelFormat === PixelFormat.RGBA8_ETC2_EAC; +}; +PixelFormat.isBC7Format = function(pixelFormat) { + return pixelFormat === PixelFormat.RGBA_BC7; +}; +PixelFormat.compressedTextureSizeInBytes = function(pixelFormat, width, height) { + switch (pixelFormat) { + case PixelFormat.RGB_DXT1: + case PixelFormat.RGBA_DXT1: + case PixelFormat.RGB_ETC1: + case PixelFormat.RGB8_ETC2: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + case PixelFormat.RGBA_DXT3: + case PixelFormat.RGBA_DXT5: + case PixelFormat.RGBA_ASTC: + case PixelFormat.RGBA8_ETC2_EAC: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + case PixelFormat.RGB_PVRTC_4BPPV1: + case PixelFormat.RGBA_PVRTC_4BPPV1: + return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8); + case PixelFormat.RGB_PVRTC_2BPPV1: + case PixelFormat.RGBA_PVRTC_2BPPV1: + return Math.floor( + (Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8 + ); + case PixelFormat.RGBA_BC7: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; + default: + return 0; + } +}; +PixelFormat.textureSizeInBytes = function(pixelFormat, pixelDatatype, width, height) { + let componentsLength = PixelFormat.componentsLength(pixelFormat); + if (PixelDatatype_default.isPacked(pixelDatatype)) { + componentsLength = 1; + } + return componentsLength * PixelDatatype_default.sizeInBytes(pixelDatatype) * width * height; +}; +PixelFormat.alignmentInBytes = function(pixelFormat, pixelDatatype, width) { + const mod = PixelFormat.textureSizeInBytes(pixelFormat, pixelDatatype, width, 1) % 4; + return mod === 0 ? 4 : mod === 2 ? 2 : 1; +}; +PixelFormat.createTypedArray = function(pixelFormat, pixelDatatype, width, height) { + const constructor = PixelDatatype_default.getTypedArrayConstructor(pixelDatatype); + const size = PixelFormat.componentsLength(pixelFormat) * width * height; + return new constructor(size); +}; +PixelFormat.flipY = function(bufferView, pixelFormat, pixelDatatype, width, height) { + if (height === 1) { + return bufferView; + } + const flipped = PixelFormat.createTypedArray( + pixelFormat, + pixelDatatype, + width, + height + ); + const numberOfComponents = PixelFormat.componentsLength(pixelFormat); + const textureWidth = width * numberOfComponents; + for (let i = 0; i < height; ++i) { + const row = i * width * numberOfComponents; + const flippedRow = (height - i - 1) * width * numberOfComponents; + for (let j = 0; j < textureWidth; ++j) { + flipped[flippedRow + j] = bufferView[row + j]; + } + } + return flipped; +}; +PixelFormat.toInternalFormat = function(pixelFormat, pixelDatatype, context) { + if (!context.webgl2) { + return pixelFormat; + } + if (pixelFormat === PixelFormat.DEPTH_STENCIL) { + return WebGLConstants_default.DEPTH24_STENCIL8; + } + if (pixelFormat === PixelFormat.DEPTH_COMPONENT) { + if (pixelDatatype === PixelDatatype_default.UNSIGNED_SHORT) { + return WebGLConstants_default.DEPTH_COMPONENT16; + } else if (pixelDatatype === PixelDatatype_default.UNSIGNED_INT) { + return WebGLConstants_default.DEPTH_COMPONENT24; + } + } + if (pixelDatatype === PixelDatatype_default.FLOAT) { + switch (pixelFormat) { + case PixelFormat.RGBA: + return WebGLConstants_default.RGBA32F; + case PixelFormat.RGB: + return WebGLConstants_default.RGB32F; + case PixelFormat.RG: + return WebGLConstants_default.RG32F; + case PixelFormat.RED: + return WebGLConstants_default.R32F; + } + } + if (pixelDatatype === PixelDatatype_default.HALF_FLOAT) { + switch (pixelFormat) { + case PixelFormat.RGBA: + return WebGLConstants_default.RGBA16F; + case PixelFormat.RGB: + return WebGLConstants_default.RGB16F; + case PixelFormat.RG: + return WebGLConstants_default.RG16F; + case PixelFormat.RED: + return WebGLConstants_default.R16F; + } + } + return pixelFormat; +}; +var PixelFormat_default = Object.freeze(PixelFormat); + +// packages/engine/Source/Core/VulkanConstants.js +var VulkanConstants = { + VK_FORMAT_UNDEFINED: 0, + VK_FORMAT_R4G4_UNORM_PACK8: 1, + VK_FORMAT_R4G4B4A4_UNORM_PACK16: 2, + VK_FORMAT_B4G4R4A4_UNORM_PACK16: 3, + VK_FORMAT_R5G6B5_UNORM_PACK16: 4, + VK_FORMAT_B5G6R5_UNORM_PACK16: 5, + VK_FORMAT_R5G5B5A1_UNORM_PACK16: 6, + VK_FORMAT_B5G5R5A1_UNORM_PACK16: 7, + VK_FORMAT_A1R5G5B5_UNORM_PACK16: 8, + VK_FORMAT_R8_UNORM: 9, + VK_FORMAT_R8_SNORM: 10, + VK_FORMAT_R8_USCALED: 11, + VK_FORMAT_R8_SSCALED: 12, + VK_FORMAT_R8_UINT: 13, + VK_FORMAT_R8_SINT: 14, + VK_FORMAT_R8_SRGB: 15, + VK_FORMAT_R8G8_UNORM: 16, + VK_FORMAT_R8G8_SNORM: 17, + VK_FORMAT_R8G8_USCALED: 18, + VK_FORMAT_R8G8_SSCALED: 19, + VK_FORMAT_R8G8_UINT: 20, + VK_FORMAT_R8G8_SINT: 21, + VK_FORMAT_R8G8_SRGB: 22, + VK_FORMAT_R8G8B8_UNORM: 23, + VK_FORMAT_R8G8B8_SNORM: 24, + VK_FORMAT_R8G8B8_USCALED: 25, + VK_FORMAT_R8G8B8_SSCALED: 26, + VK_FORMAT_R8G8B8_UINT: 27, + VK_FORMAT_R8G8B8_SINT: 28, + VK_FORMAT_R8G8B8_SRGB: 29, + VK_FORMAT_B8G8R8_UNORM: 30, + VK_FORMAT_B8G8R8_SNORM: 31, + VK_FORMAT_B8G8R8_USCALED: 32, + VK_FORMAT_B8G8R8_SSCALED: 33, + VK_FORMAT_B8G8R8_UINT: 34, + VK_FORMAT_B8G8R8_SINT: 35, + VK_FORMAT_B8G8R8_SRGB: 36, + VK_FORMAT_R8G8B8A8_UNORM: 37, + VK_FORMAT_R8G8B8A8_SNORM: 38, + VK_FORMAT_R8G8B8A8_USCALED: 39, + VK_FORMAT_R8G8B8A8_SSCALED: 40, + VK_FORMAT_R8G8B8A8_UINT: 41, + VK_FORMAT_R8G8B8A8_SINT: 42, + VK_FORMAT_R8G8B8A8_SRGB: 43, + VK_FORMAT_B8G8R8A8_UNORM: 44, + VK_FORMAT_B8G8R8A8_SNORM: 45, + VK_FORMAT_B8G8R8A8_USCALED: 46, + VK_FORMAT_B8G8R8A8_SSCALED: 47, + VK_FORMAT_B8G8R8A8_UINT: 48, + VK_FORMAT_B8G8R8A8_SINT: 49, + VK_FORMAT_B8G8R8A8_SRGB: 50, + VK_FORMAT_A8B8G8R8_UNORM_PACK32: 51, + VK_FORMAT_A8B8G8R8_SNORM_PACK32: 52, + VK_FORMAT_A8B8G8R8_USCALED_PACK32: 53, + VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 54, + VK_FORMAT_A8B8G8R8_UINT_PACK32: 55, + VK_FORMAT_A8B8G8R8_SINT_PACK32: 56, + VK_FORMAT_A8B8G8R8_SRGB_PACK32: 57, + VK_FORMAT_A2R10G10B10_UNORM_PACK32: 58, + VK_FORMAT_A2R10G10B10_SNORM_PACK32: 59, + VK_FORMAT_A2R10G10B10_USCALED_PACK32: 60, + VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 61, + VK_FORMAT_A2R10G10B10_UINT_PACK32: 62, + VK_FORMAT_A2R10G10B10_SINT_PACK32: 63, + VK_FORMAT_A2B10G10R10_UNORM_PACK32: 64, + VK_FORMAT_A2B10G10R10_SNORM_PACK32: 65, + VK_FORMAT_A2B10G10R10_USCALED_PACK32: 66, + VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 67, + VK_FORMAT_A2B10G10R10_UINT_PACK32: 68, + VK_FORMAT_A2B10G10R10_SINT_PACK32: 69, + VK_FORMAT_R16_UNORM: 70, + VK_FORMAT_R16_SNORM: 71, + VK_FORMAT_R16_USCALED: 72, + VK_FORMAT_R16_SSCALED: 73, + VK_FORMAT_R16_UINT: 74, + VK_FORMAT_R16_SINT: 75, + VK_FORMAT_R16_SFLOAT: 76, + VK_FORMAT_R16G16_UNORM: 77, + VK_FORMAT_R16G16_SNORM: 78, + VK_FORMAT_R16G16_USCALED: 79, + VK_FORMAT_R16G16_SSCALED: 80, + VK_FORMAT_R16G16_UINT: 81, + VK_FORMAT_R16G16_SINT: 82, + VK_FORMAT_R16G16_SFLOAT: 83, + VK_FORMAT_R16G16B16_UNORM: 84, + VK_FORMAT_R16G16B16_SNORM: 85, + VK_FORMAT_R16G16B16_USCALED: 86, + VK_FORMAT_R16G16B16_SSCALED: 87, + VK_FORMAT_R16G16B16_UINT: 88, + VK_FORMAT_R16G16B16_SINT: 89, + VK_FORMAT_R16G16B16_SFLOAT: 90, + VK_FORMAT_R16G16B16A16_UNORM: 91, + VK_FORMAT_R16G16B16A16_SNORM: 92, + VK_FORMAT_R16G16B16A16_USCALED: 93, + VK_FORMAT_R16G16B16A16_SSCALED: 94, + VK_FORMAT_R16G16B16A16_UINT: 95, + VK_FORMAT_R16G16B16A16_SINT: 96, + VK_FORMAT_R16G16B16A16_SFLOAT: 97, + VK_FORMAT_R32_UINT: 98, + VK_FORMAT_R32_SINT: 99, + VK_FORMAT_R32_SFLOAT: 100, + VK_FORMAT_R32G32_UINT: 101, + VK_FORMAT_R32G32_SINT: 102, + VK_FORMAT_R32G32_SFLOAT: 103, + VK_FORMAT_R32G32B32_UINT: 104, + VK_FORMAT_R32G32B32_SINT: 105, + VK_FORMAT_R32G32B32_SFLOAT: 106, + VK_FORMAT_R32G32B32A32_UINT: 107, + VK_FORMAT_R32G32B32A32_SINT: 108, + VK_FORMAT_R32G32B32A32_SFLOAT: 109, + VK_FORMAT_R64_UINT: 110, + VK_FORMAT_R64_SINT: 111, + VK_FORMAT_R64_SFLOAT: 112, + VK_FORMAT_R64G64_UINT: 113, + VK_FORMAT_R64G64_SINT: 114, + VK_FORMAT_R64G64_SFLOAT: 115, + VK_FORMAT_R64G64B64_UINT: 116, + VK_FORMAT_R64G64B64_SINT: 117, + VK_FORMAT_R64G64B64_SFLOAT: 118, + VK_FORMAT_R64G64B64A64_UINT: 119, + VK_FORMAT_R64G64B64A64_SINT: 120, + VK_FORMAT_R64G64B64A64_SFLOAT: 121, + VK_FORMAT_B10G11R11_UFLOAT_PACK32: 122, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 123, + VK_FORMAT_D16_UNORM: 124, + VK_FORMAT_X8_D24_UNORM_PACK32: 125, + VK_FORMAT_D32_SFLOAT: 126, + VK_FORMAT_S8_UINT: 127, + VK_FORMAT_D16_UNORM_S8_UINT: 128, + VK_FORMAT_D24_UNORM_S8_UINT: 129, + VK_FORMAT_D32_SFLOAT_S8_UINT: 130, + VK_FORMAT_BC1_RGB_UNORM_BLOCK: 131, + VK_FORMAT_BC1_RGB_SRGB_BLOCK: 132, + VK_FORMAT_BC1_RGBA_UNORM_BLOCK: 133, + VK_FORMAT_BC1_RGBA_SRGB_BLOCK: 134, + VK_FORMAT_BC2_UNORM_BLOCK: 135, + VK_FORMAT_BC2_SRGB_BLOCK: 136, + VK_FORMAT_BC3_UNORM_BLOCK: 137, + VK_FORMAT_BC3_SRGB_BLOCK: 138, + VK_FORMAT_BC4_UNORM_BLOCK: 139, + VK_FORMAT_BC4_SNORM_BLOCK: 140, + VK_FORMAT_BC5_UNORM_BLOCK: 141, + VK_FORMAT_BC5_SNORM_BLOCK: 142, + VK_FORMAT_BC6H_UFLOAT_BLOCK: 143, + VK_FORMAT_BC6H_SFLOAT_BLOCK: 144, + VK_FORMAT_BC7_UNORM_BLOCK: 145, + VK_FORMAT_BC7_SRGB_BLOCK: 146, + VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: 147, + VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: 148, + VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: 149, + VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: 150, + VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: 151, + VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: 152, + VK_FORMAT_EAC_R11_UNORM_BLOCK: 153, + VK_FORMAT_EAC_R11_SNORM_BLOCK: 154, + VK_FORMAT_EAC_R11G11_UNORM_BLOCK: 155, + VK_FORMAT_EAC_R11G11_SNORM_BLOCK: 156, + VK_FORMAT_ASTC_4x4_UNORM_BLOCK: 157, + VK_FORMAT_ASTC_4x4_SRGB_BLOCK: 158, + VK_FORMAT_ASTC_5x4_UNORM_BLOCK: 159, + VK_FORMAT_ASTC_5x4_SRGB_BLOCK: 160, + VK_FORMAT_ASTC_5x5_UNORM_BLOCK: 161, + VK_FORMAT_ASTC_5x5_SRGB_BLOCK: 162, + VK_FORMAT_ASTC_6x5_UNORM_BLOCK: 163, + VK_FORMAT_ASTC_6x5_SRGB_BLOCK: 164, + VK_FORMAT_ASTC_6x6_UNORM_BLOCK: 165, + VK_FORMAT_ASTC_6x6_SRGB_BLOCK: 166, + VK_FORMAT_ASTC_8x5_UNORM_BLOCK: 167, + VK_FORMAT_ASTC_8x5_SRGB_BLOCK: 168, + VK_FORMAT_ASTC_8x6_UNORM_BLOCK: 169, + VK_FORMAT_ASTC_8x6_SRGB_BLOCK: 170, + VK_FORMAT_ASTC_8x8_UNORM_BLOCK: 171, + VK_FORMAT_ASTC_8x8_SRGB_BLOCK: 172, + VK_FORMAT_ASTC_10x5_UNORM_BLOCK: 173, + VK_FORMAT_ASTC_10x5_SRGB_BLOCK: 174, + VK_FORMAT_ASTC_10x6_UNORM_BLOCK: 175, + VK_FORMAT_ASTC_10x6_SRGB_BLOCK: 176, + VK_FORMAT_ASTC_10x8_UNORM_BLOCK: 177, + VK_FORMAT_ASTC_10x8_SRGB_BLOCK: 178, + VK_FORMAT_ASTC_10x10_UNORM_BLOCK: 179, + VK_FORMAT_ASTC_10x10_SRGB_BLOCK: 180, + VK_FORMAT_ASTC_12x10_UNORM_BLOCK: 181, + VK_FORMAT_ASTC_12x10_SRGB_BLOCK: 182, + VK_FORMAT_ASTC_12x12_UNORM_BLOCK: 183, + VK_FORMAT_ASTC_12x12_SRGB_BLOCK: 184, + VK_FORMAT_G8B8G8R8_422_UNORM: 1000156e3, + VK_FORMAT_B8G8R8G8_422_UNORM: 1000156001, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 1000156002, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 1000156003, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: 1000156004, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: 1000156005, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: 1000156006, + VK_FORMAT_R10X6_UNORM_PACK16: 1000156007, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16: 1000156008, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: 1000156009, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: 1000156010, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: 1000156011, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: 1000156012, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: 1000156013, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: 1000156014, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: 1000156015, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: 1000156016, + VK_FORMAT_R12X4_UNORM_PACK16: 1000156017, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16: 1000156018, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: 1000156019, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: 1000156020, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: 1000156021, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: 1000156022, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: 1000156023, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: 1000156024, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: 1000156025, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: 1000156026, + VK_FORMAT_G16B16G16R16_422_UNORM: 1000156027, + VK_FORMAT_B16G16R16G16_422_UNORM: 1000156028, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: 1000156029, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: 1000156030, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: 1000156031, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: 1000156032, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: 1000156033, + VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: 1000054e3, + VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: 1000054001, + VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: 1000054002, + VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: 1000054003, + VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: 1000054004, + VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: 1000054005, + VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: 1000054006, + VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: 1000054007, + VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT: 1000066e3, + VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT: 1000066001, + VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT: 1000066002, + VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT: 1000066003, + VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT: 1000066004, + VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT: 1000066005, + VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT: 1000066006, + VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT: 1000066007, + VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT: 1000066008, + VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT: 1000066009, + VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT: 1000066010, + VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT: 1000066011, + VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT: 1000066012, + VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT: 1000066013, + VK_FORMAT_G8B8G8R8_422_UNORM_KHR: 1000156e3, + VK_FORMAT_B8G8R8G8_422_UNORM_KHR: 1000156001, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR: 1000156002, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR: 1000156003, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR: 1000156004, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR: 1000156005, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR: 1000156006, + VK_FORMAT_R10X6_UNORM_PACK16_KHR: 1000156007, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR: 1000156008, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR: 1000156009, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: 1000156010, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: 1000156011, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR: 1000156012, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR: 1000156013, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR: 1000156014, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR: 1000156015, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR: 1000156016, + VK_FORMAT_R12X4_UNORM_PACK16_KHR: 1000156017, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR: 1000156018, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR: 1000156019, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: 1000156020, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: 1000156021, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR: 1000156022, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR: 1000156023, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR: 1000156024, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR: 1000156025, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR: 1000156026, + VK_FORMAT_G16B16G16R16_422_UNORM_KHR: 1000156027, + VK_FORMAT_B16G16R16G16_422_UNORM_KHR: 1000156028, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR: 1000156029, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR: 1000156030, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR: 1000156031, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR: 1000156032, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR: 1000156033 +}; +var VulkanConstants_default = Object.freeze(VulkanConstants); + +// node_modules/ktx-parse/dist/ktx-parse.modern.js +var KHR_SUPERCOMPRESSION_NONE = 0; +var KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = 0; +var KHR_DF_VENDORID_KHRONOS = 0; +var KHR_DF_VERSION = 2; +var KHR_DF_MODEL_UNSPECIFIED = 0; +var KHR_DF_FLAG_ALPHA_STRAIGHT = 0; +var KHR_DF_TRANSFER_SRGB = 2; +var KHR_DF_PRIMARIES_BT709 = 1; +var KHR_DF_SAMPLE_DATATYPE_SIGNED = 64; +var VK_FORMAT_UNDEFINED = 0; +var KTX2Container = class { + constructor() { + this.vkFormat = VK_FORMAT_UNDEFINED; + this.typeSize = 1; + this.pixelWidth = 0; + this.pixelHeight = 0; + this.pixelDepth = 0; + this.layerCount = 0; + this.faceCount = 1; + this.supercompressionScheme = KHR_SUPERCOMPRESSION_NONE; + this.levels = []; + this.dataFormatDescriptor = [{ + vendorId: KHR_DF_VENDORID_KHRONOS, + descriptorType: KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT, + descriptorBlockSize: 0, + versionNumber: KHR_DF_VERSION, + colorModel: KHR_DF_MODEL_UNSPECIFIED, + colorPrimaries: KHR_DF_PRIMARIES_BT709, + transferFunction: KHR_DF_TRANSFER_SRGB, + flags: KHR_DF_FLAG_ALPHA_STRAIGHT, + texelBlockDimension: [0, 0, 0, 0], + bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0], + samples: [] + }]; + this.keyValue = {}; + this.globalData = null; + } +}; +var BufferReader = class { + constructor(data, byteOffset, byteLength, littleEndian) { + this._dataView = void 0; + this._littleEndian = void 0; + this._offset = void 0; + this._dataView = new DataView(data.buffer, data.byteOffset + byteOffset, byteLength); + this._littleEndian = littleEndian; + this._offset = 0; + } + _nextUint8() { + const value = this._dataView.getUint8(this._offset); + this._offset += 1; + return value; + } + _nextUint16() { + const value = this._dataView.getUint16(this._offset, this._littleEndian); + this._offset += 2; + return value; + } + _nextUint32() { + const value = this._dataView.getUint32(this._offset, this._littleEndian); + this._offset += 4; + return value; + } + _nextUint64() { + const left = this._dataView.getUint32(this._offset, this._littleEndian); + const right = this._dataView.getUint32(this._offset + 4, this._littleEndian); + const value = left + 2 ** 32 * right; + this._offset += 8; + return value; + } + _nextInt32() { + const value = this._dataView.getInt32(this._offset, this._littleEndian); + this._offset += 4; + return value; + } + _nextUint8Array(len) { + const value = new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + this._offset, len); + this._offset += len; + return value; + } + _skip(bytes) { + this._offset += bytes; + return this; + } + _scan(maxByteLength, term = 0) { + const byteOffset = this._offset; + let byteLength = 0; + while (this._dataView.getUint8(this._offset) !== term && byteLength < maxByteLength) { + byteLength++; + this._offset++; + } + if (byteLength < maxByteLength) this._offset++; + return new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + byteOffset, byteLength); + } +}; +var NUL = new Uint8Array([0]); +var KTX2_ID = [ + // '´', 'K', 'T', 'X', '2', '0', 'ª', '\r', '\n', '\x1A', '\n' + 171, + 75, + 84, + 88, + 32, + 50, + 48, + 187, + 13, + 10, + 26, + 10 +]; +function decodeText(buffer) { + if (typeof TextDecoder !== "undefined") { + return new TextDecoder().decode(buffer); + } + return Buffer.from(buffer).toString("utf8"); +} +function read2(data) { + const id = new Uint8Array(data.buffer, data.byteOffset, KTX2_ID.length); + if (id[0] !== KTX2_ID[0] || // '´' + id[1] !== KTX2_ID[1] || // 'K' + id[2] !== KTX2_ID[2] || // 'T' + id[3] !== KTX2_ID[3] || // 'X' + id[4] !== KTX2_ID[4] || // ' ' + id[5] !== KTX2_ID[5] || // '2' + id[6] !== KTX2_ID[6] || // '0' + id[7] !== KTX2_ID[7] || // 'ª' + id[8] !== KTX2_ID[8] || // '\r' + id[9] !== KTX2_ID[9] || // '\n' + id[10] !== KTX2_ID[10] || // '\x1A' + id[11] !== KTX2_ID[11]) { + throw new Error("Missing KTX 2.0 identifier."); + } + const container = new KTX2Container(); + const headerByteLength = 17 * Uint32Array.BYTES_PER_ELEMENT; + const headerReader = new BufferReader(data, KTX2_ID.length, headerByteLength, true); + container.vkFormat = headerReader._nextUint32(); + container.typeSize = headerReader._nextUint32(); + container.pixelWidth = headerReader._nextUint32(); + container.pixelHeight = headerReader._nextUint32(); + container.pixelDepth = headerReader._nextUint32(); + container.layerCount = headerReader._nextUint32(); + container.faceCount = headerReader._nextUint32(); + const levelCount = headerReader._nextUint32(); + container.supercompressionScheme = headerReader._nextUint32(); + const dfdByteOffset = headerReader._nextUint32(); + const dfdByteLength = headerReader._nextUint32(); + const kvdByteOffset = headerReader._nextUint32(); + const kvdByteLength = headerReader._nextUint32(); + const sgdByteOffset = headerReader._nextUint64(); + const sgdByteLength = headerReader._nextUint64(); + const levelByteLength = levelCount * 3 * 8; + const levelReader = new BufferReader(data, KTX2_ID.length + headerByteLength, levelByteLength, true); + for (let i = 0; i < levelCount; i++) { + container.levels.push({ + levelData: new Uint8Array(data.buffer, data.byteOffset + levelReader._nextUint64(), levelReader._nextUint64()), + uncompressedByteLength: levelReader._nextUint64() + }); + } + const dfdReader = new BufferReader(data, dfdByteOffset, dfdByteLength, true); + const dfd = { + vendorId: dfdReader._skip( + 4 + /* totalSize */ + )._nextUint16(), + descriptorType: dfdReader._nextUint16(), + versionNumber: dfdReader._nextUint16(), + descriptorBlockSize: dfdReader._nextUint16(), + colorModel: dfdReader._nextUint8(), + colorPrimaries: dfdReader._nextUint8(), + transferFunction: dfdReader._nextUint8(), + flags: dfdReader._nextUint8(), + texelBlockDimension: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()], + bytesPlane: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()], + samples: [] + }; + const sampleStart = 6; + const sampleWords = 4; + const numSamples = (dfd.descriptorBlockSize / 4 - sampleStart) / sampleWords; + for (let i = 0; i < numSamples; i++) { + const sample = { + bitOffset: dfdReader._nextUint16(), + bitLength: dfdReader._nextUint8(), + channelType: dfdReader._nextUint8(), + samplePosition: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()], + sampleLower: -Infinity, + sampleUpper: Infinity + }; + if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) { + sample.sampleLower = dfdReader._nextInt32(); + sample.sampleUpper = dfdReader._nextInt32(); + } else { + sample.sampleLower = dfdReader._nextUint32(); + sample.sampleUpper = dfdReader._nextUint32(); + } + dfd.samples[i] = sample; + } + container.dataFormatDescriptor.length = 0; + container.dataFormatDescriptor.push(dfd); + const kvdReader = new BufferReader(data, kvdByteOffset, kvdByteLength, true); + while (kvdReader._offset < kvdByteLength) { + const keyValueByteLength = kvdReader._nextUint32(); + const keyData = kvdReader._scan(keyValueByteLength); + const key = decodeText(keyData); + container.keyValue[key] = kvdReader._nextUint8Array(keyValueByteLength - keyData.byteLength - 1); + if (key.match(/^ktx/i)) { + const text = decodeText(container.keyValue[key]); + container.keyValue[key] = text.substring(0, text.lastIndexOf("\0")); + } + const kvPadding = keyValueByteLength % 4 ? 4 - keyValueByteLength % 4 : 0; + kvdReader._skip(kvPadding); + } + if (sgdByteLength <= 0) return container; + const sgdReader = new BufferReader(data, sgdByteOffset, sgdByteLength, true); + const endpointCount = sgdReader._nextUint16(); + const selectorCount = sgdReader._nextUint16(); + const endpointsByteLength = sgdReader._nextUint32(); + const selectorsByteLength = sgdReader._nextUint32(); + const tablesByteLength = sgdReader._nextUint32(); + const extendedByteLength = sgdReader._nextUint32(); + const imageDescs = []; + for (let i = 0; i < levelCount; i++) { + imageDescs.push({ + imageFlags: sgdReader._nextUint32(), + rgbSliceByteOffset: sgdReader._nextUint32(), + rgbSliceByteLength: sgdReader._nextUint32(), + alphaSliceByteOffset: sgdReader._nextUint32(), + alphaSliceByteLength: sgdReader._nextUint32() + }); + } + const endpointsByteOffset = sgdByteOffset + sgdReader._offset; + const selectorsByteOffset = endpointsByteOffset + endpointsByteLength; + const tablesByteOffset = selectorsByteOffset + selectorsByteLength; + const extendedByteOffset = tablesByteOffset + tablesByteLength; + const endpointsData = new Uint8Array(data.buffer, data.byteOffset + endpointsByteOffset, endpointsByteLength); + const selectorsData = new Uint8Array(data.buffer, data.byteOffset + selectorsByteOffset, selectorsByteLength); + const tablesData = new Uint8Array(data.buffer, data.byteOffset + tablesByteOffset, tablesByteLength); + const extendedData = new Uint8Array(data.buffer, data.byteOffset + extendedByteOffset, extendedByteLength); + container.globalData = { + endpointCount, + selectorCount, + imageDescs, + endpointsData, + selectorsData, + tablesData, + extendedData + }; + return container; +} + +// packages/engine/Source/Workers/transcodeKTX2.js +var import_basis_transcoder = __toESM(require_basis_transcoder(), 1); +var faceOrder = [ + "positiveX", + "negativeX", + "positiveY", + "negativeY", + "positiveZ", + "negativeZ" +]; +var colorModelETC1S = 163; +var colorModelUASTC = 166; +var transcoderModule; +function transcode(parameters, transferableObjects) { + Check_default.typeOf.object("transcoderModule", transcoderModule); + const data = parameters.ktx2Buffer; + const supportedTargetFormats = parameters.supportedTargetFormats; + let header; + try { + header = read2(data); + } catch (e) { + throw new RuntimeError_default("Invalid KTX2 file."); + } + if (header.layerCount !== 0) { + throw new RuntimeError_default("KTX2 texture arrays are not supported."); + } + if (header.pixelDepth !== 0) { + throw new RuntimeError_default("KTX2 3D textures are unsupported."); + } + const dfd = header.dataFormatDescriptor[0]; + const result = new Array(header.levelCount); + if (header.vkFormat === 0 && (dfd.colorModel === colorModelETC1S || dfd.colorModel === colorModelUASTC)) { + transcodeCompressed( + data, + header, + supportedTargetFormats, + transcoderModule, + transferableObjects, + result + ); + } else { + transferableObjects.push(data.buffer); + parseUncompressed(header, result); + } + return result; +} +function parseUncompressed(header, result) { + const internalFormat = header.vkFormat === VulkanConstants_default.VK_FORMAT_R8G8B8_SRGB ? PixelFormat_default.RGB : PixelFormat_default.RGBA; + let datatype; + if (header.vkFormat === VulkanConstants_default.VK_FORMAT_R8G8B8A8_UNORM) { + datatype = PixelDatatype_default.UNSIGNED_BYTE; + } else if (header.vkFormat === VulkanConstants_default.VK_FORMAT_R16G16B16A16_SFLOAT) { + datatype = PixelDatatype_default.HALF_FLOAT; + } else if (header.vkFormat === VulkanConstants_default.VK_FORMAT_R32G32B32A32_SFLOAT) { + datatype = PixelDatatype_default.FLOAT; + } + for (let i = 0; i < header.levels.length; ++i) { + const level = {}; + result[i] = level; + const levelBuffer = header.levels[i].levelData; + const width = header.pixelWidth >> i; + const height = header.pixelHeight >> i; + const faceLength = width * height * PixelFormat_default.componentsLength(internalFormat); + for (let j = 0; j < header.faceCount; ++j) { + const faceByteOffset = levelBuffer.byteOffset + faceLength * header.typeSize * j; + let faceView; + if (!defined_default(datatype) || PixelDatatype_default.sizeInBytes(datatype) === 1) { + faceView = new Uint8Array( + levelBuffer.buffer, + faceByteOffset, + faceLength + ); + } else if (PixelDatatype_default.sizeInBytes(datatype) === 2) { + faceView = new Uint16Array( + levelBuffer.buffer, + faceByteOffset, + faceLength + ); + } else { + faceView = new Float32Array( + levelBuffer.buffer, + faceByteOffset, + faceLength + ); + } + level[faceOrder[j]] = { + internalFormat, + datatype, + width, + height, + levelBuffer: faceView + }; + } + } +} +function transcodeCompressed(data, header, supportedTargetFormats, transcoderModule2, transferableObjects, result) { + const ktx2File = new transcoderModule2.KTX2File(data); + let width = ktx2File.getWidth(); + let height = ktx2File.getHeight(); + const levels = ktx2File.getLevels(); + const hasAlpha = ktx2File.getHasAlpha(); + if (!(width > 0) || !(height > 0) || !(levels > 0)) { + ktx2File.close(); + ktx2File.delete(); + throw new RuntimeError_default("Invalid KTX2 file"); + } + let internalFormat, transcoderFormat; + const dfd = header.dataFormatDescriptor[0]; + const BasisFormat = transcoderModule2.transcoder_texture_format; + if (dfd.colorModel === colorModelETC1S) { + if (supportedTargetFormats.etc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA8_ETC2_EAC : PixelFormat_default.RGB8_ETC2; + transcoderFormat = hasAlpha ? BasisFormat.cTFETC2_RGBA : BasisFormat.cTFETC1_RGB; + } else if (supportedTargetFormats.etc1 && !hasAlpha) { + internalFormat = PixelFormat_default.RGB_ETC1; + transcoderFormat = BasisFormat.cTFETC1_RGB; + } else if (supportedTargetFormats.s3tc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA_DXT5 : PixelFormat_default.RGB_DXT1; + transcoderFormat = hasAlpha ? BasisFormat.cTFBC3_RGBA : BasisFormat.cTFBC1_RGB; + } else if (supportedTargetFormats.pvrtc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA_PVRTC_4BPPV1 : PixelFormat_default.RGB_PVRTC_4BPPV1; + transcoderFormat = hasAlpha ? BasisFormat.cTFPVRTC1_4_RGBA : BasisFormat.cTFPVRTC1_4_RGB; + } else if (supportedTargetFormats.astc) { + internalFormat = PixelFormat_default.RGBA_ASTC; + transcoderFormat = BasisFormat.cTFASTC_4x4_RGBA; + } else if (supportedTargetFormats.bc7) { + internalFormat = PixelFormat_default.RGBA_BC7; + transcoderFormat = BasisFormat.cTFBC7_RGBA; + } else { + throw new RuntimeError_default( + "No transcoding format target available for ETC1S compressed ktx2." + ); + } + } else if (dfd.colorModel === colorModelUASTC) { + if (supportedTargetFormats.astc) { + internalFormat = PixelFormat_default.RGBA_ASTC; + transcoderFormat = BasisFormat.cTFASTC_4x4_RGBA; + } else if (supportedTargetFormats.bc7) { + internalFormat = PixelFormat_default.RGBA_BC7; + transcoderFormat = BasisFormat.cTFBC7_RGBA; + } else if (supportedTargetFormats.s3tc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA_DXT5 : PixelFormat_default.RGB_DXT1; + transcoderFormat = hasAlpha ? BasisFormat.cTFBC3_RGBA : BasisFormat.cTFBC1_RGB; + } else if (supportedTargetFormats.etc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA8_ETC2_EAC : PixelFormat_default.RGB8_ETC2; + transcoderFormat = hasAlpha ? BasisFormat.cTFETC2_RGBA : BasisFormat.cTFETC1_RGB; + } else if (supportedTargetFormats.etc1 && !hasAlpha) { + internalFormat = PixelFormat_default.RGB_ETC1; + transcoderFormat = BasisFormat.cTFETC1_RGB; + } else if (supportedTargetFormats.pvrtc) { + internalFormat = hasAlpha ? PixelFormat_default.RGBA_PVRTC_4BPPV1 : PixelFormat_default.RGB_PVRTC_4BPPV1; + transcoderFormat = hasAlpha ? BasisFormat.cTFPVRTC1_4_RGBA : BasisFormat.cTFPVRTC1_4_RGB; + } else { + throw new RuntimeError_default( + "No transcoding format target available for UASTC compressed ktx2." + ); + } + } + if (!ktx2File.startTranscoding()) { + ktx2File.close(); + ktx2File.delete(); + throw new RuntimeError_default("startTranscoding() failed"); + } + for (let i = 0; i < header.levels.length; ++i) { + const level = {}; + result[i] = level; + width = header.pixelWidth >> i; + height = header.pixelHeight >> i; + const dstSize = ktx2File.getImageTranscodedSizeInBytes( + i, + // level index + 0, + // layer index + 0, + // face index + transcoderFormat.value + ); + const dst = new Uint8Array(dstSize); + const transcoded = ktx2File.transcodeImage( + dst, + i, + // level index + 0, + // layer index + 0, + // face index + transcoderFormat.value, + 0, + // get_alpha_for_opaque_formats + -1, + // channel0 + -1 + // channel1 + ); + if (!defined_default(transcoded)) { + throw new RuntimeError_default("transcodeImage() failed."); + } + transferableObjects.push(dst.buffer); + level[faceOrder[0]] = { + internalFormat, + width, + height, + levelBuffer: dst + }; + } + ktx2File.close(); + ktx2File.delete(); + return result; +} +async function initWorker(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + const basisTranscoder = defaultValue_default(import_basis_transcoder.default, self.BASIS); + if (defined_default(wasmConfig.wasmBinaryFile)) { + transcoderModule = await basisTranscoder(wasmConfig); + } else { + transcoderModule = await basisTranscoder(); + } + transcoderModule.initializeBasis(); + return true; +} +function transcodeKTX2(parameters, transferableObjects) { + const wasmConfig = parameters.webAssemblyConfig; + if (defined_default(wasmConfig)) { + return initWorker(parameters, transferableObjects); + } + return transcode(parameters, transferableObjects); +} +var transcodeKTX2_default = createTaskProcessorWorker_default(transcodeKTX2); +export { + transcodeKTX2_default as default +}; diff --git a/public/assets/cesium/Workers/transferTypedArrayTest.js b/public/assets/cesium/Workers/transferTypedArrayTest.js new file mode 100644 index 0000000..19532f6 --- /dev/null +++ b/public/assets/cesium/Workers/transferTypedArrayTest.js @@ -0,0 +1,41 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + + +// packages/engine/Source/Workers/transferTypedArrayTest.js +self.onmessage = function(event) { + const array = event.data.array; + const postMessage = self.webkitPostMessage || self.postMessage; + try { + postMessage( + { + array + }, + [array.buffer] + ); + } catch (e) { + postMessage({}); + } +}; diff --git a/public/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js b/public/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js new file mode 100644 index 0000000..d83b787 --- /dev/null +++ b/public/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js @@ -0,0 +1,817 @@ +/** + * @license + * Cesium - https://github.com/CesiumGS/cesium + * Version 1.121.2 + * + * Copyright 2011-2022 Cesium Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Columbus View (Pat. Pend.) + * + * Portions licensed separately. + * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. + */ + +import { + EllipsoidalOccluder_default, + TerrainEncoding_default +} from "./chunk-56EDBCGT.js"; +import { + createTaskProcessorWorker_default +} from "./chunk-Z2QP3CXW.js"; +import { + OrientedBoundingBox_default +} from "./chunk-2PTKXHJB.js"; +import { + AttributeCompression_default +} from "./chunk-LJ2JQHJT.js"; +import "./chunk-YK3QIKY7.js"; +import "./chunk-NDDI2LWR.js"; +import "./chunk-QQOZO7KO.js"; +import "./chunk-EDLRS3AW.js"; +import { + IndexDatatype_default +} from "./chunk-C4WPMOKT.js"; +import { + BoundingSphere_default +} from "./chunk-KHZNBFOH.js"; +import { + Rectangle_default +} from "./chunk-6SQMLVGV.js"; +import "./chunk-XIUSRWL6.js"; +import { + Cartesian2_default, + Cartesian3_default, + Cartographic_default, + Ellipsoid_default +} from "./chunk-FFLMY4TE.js"; +import { + Math_default +} from "./chunk-WGDFYAGC.js"; +import "./chunk-3HQMMUPU.js"; +import "./chunk-LLAF3CPH.js"; +import "./chunk-U5HSOKPQ.js"; +import { + Check_default, + DeveloperError_default +} from "./chunk-P6TRGU3S.js"; +import { + defined_default +} from "./chunk-YCDZX5LS.js"; + +// packages/engine/Source/Core/Intersections2D.js +var Intersections2D = {}; +Intersections2D.clipTriangleAtAxisAlignedThreshold = function(threshold, keepAbove, u0, u1, u2, result) { + if (!defined_default(threshold)) { + throw new DeveloperError_default("threshold is required."); + } + if (!defined_default(keepAbove)) { + throw new DeveloperError_default("keepAbove is required."); + } + if (!defined_default(u0)) { + throw new DeveloperError_default("u0 is required."); + } + if (!defined_default(u1)) { + throw new DeveloperError_default("u1 is required."); + } + if (!defined_default(u2)) { + throw new DeveloperError_default("u2 is required."); + } + if (!defined_default(result)) { + result = []; + } else { + result.length = 0; + } + let u0Behind; + let u1Behind; + let u2Behind; + if (keepAbove) { + u0Behind = u0 < threshold; + u1Behind = u1 < threshold; + u2Behind = u2 < threshold; + } else { + u0Behind = u0 > threshold; + u1Behind = u1 > threshold; + u2Behind = u2 > threshold; + } + const numBehind = u0Behind + u1Behind + u2Behind; + let u01Ratio; + let u02Ratio; + let u12Ratio; + let u10Ratio; + let u20Ratio; + let u21Ratio; + if (numBehind === 1) { + if (u0Behind) { + u01Ratio = (threshold - u0) / (u1 - u0); + u02Ratio = (threshold - u0) / (u2 - u0); + result.push(1); + result.push(2); + if (u02Ratio !== 1) { + result.push(-1); + result.push(0); + result.push(2); + result.push(u02Ratio); + } + if (u01Ratio !== 1) { + result.push(-1); + result.push(0); + result.push(1); + result.push(u01Ratio); + } + } else if (u1Behind) { + u12Ratio = (threshold - u1) / (u2 - u1); + u10Ratio = (threshold - u1) / (u0 - u1); + result.push(2); + result.push(0); + if (u10Ratio !== 1) { + result.push(-1); + result.push(1); + result.push(0); + result.push(u10Ratio); + } + if (u12Ratio !== 1) { + result.push(-1); + result.push(1); + result.push(2); + result.push(u12Ratio); + } + } else if (u2Behind) { + u20Ratio = (threshold - u2) / (u0 - u2); + u21Ratio = (threshold - u2) / (u1 - u2); + result.push(0); + result.push(1); + if (u21Ratio !== 1) { + result.push(-1); + result.push(2); + result.push(1); + result.push(u21Ratio); + } + if (u20Ratio !== 1) { + result.push(-1); + result.push(2); + result.push(0); + result.push(u20Ratio); + } + } + } else if (numBehind === 2) { + if (!u0Behind && u0 !== threshold) { + u10Ratio = (threshold - u1) / (u0 - u1); + u20Ratio = (threshold - u2) / (u0 - u2); + result.push(0); + result.push(-1); + result.push(1); + result.push(0); + result.push(u10Ratio); + result.push(-1); + result.push(2); + result.push(0); + result.push(u20Ratio); + } else if (!u1Behind && u1 !== threshold) { + u21Ratio = (threshold - u2) / (u1 - u2); + u01Ratio = (threshold - u0) / (u1 - u0); + result.push(1); + result.push(-1); + result.push(2); + result.push(1); + result.push(u21Ratio); + result.push(-1); + result.push(0); + result.push(1); + result.push(u01Ratio); + } else if (!u2Behind && u2 !== threshold) { + u02Ratio = (threshold - u0) / (u2 - u0); + u12Ratio = (threshold - u1) / (u2 - u1); + result.push(2); + result.push(-1); + result.push(0); + result.push(2); + result.push(u02Ratio); + result.push(-1); + result.push(1); + result.push(2); + result.push(u12Ratio); + } + } else if (numBehind !== 3) { + result.push(0); + result.push(1); + result.push(2); + } + return result; +}; +Intersections2D.computeBarycentricCoordinates = function(x, y, x1, y1, x2, y2, x3, y3, result) { + if (!defined_default(x)) { + throw new DeveloperError_default("x is required."); + } + if (!defined_default(y)) { + throw new DeveloperError_default("y is required."); + } + if (!defined_default(x1)) { + throw new DeveloperError_default("x1 is required."); + } + if (!defined_default(y1)) { + throw new DeveloperError_default("y1 is required."); + } + if (!defined_default(x2)) { + throw new DeveloperError_default("x2 is required."); + } + if (!defined_default(y2)) { + throw new DeveloperError_default("y2 is required."); + } + if (!defined_default(x3)) { + throw new DeveloperError_default("x3 is required."); + } + if (!defined_default(y3)) { + throw new DeveloperError_default("y3 is required."); + } + const x1mx3 = x1 - x3; + const x3mx2 = x3 - x2; + const y2my3 = y2 - y3; + const y1my3 = y1 - y3; + const inverseDeterminant = 1 / (y2my3 * x1mx3 + x3mx2 * y1my3); + const ymy3 = y - y3; + const xmx3 = x - x3; + const l1 = (y2my3 * xmx3 + x3mx2 * ymy3) * inverseDeterminant; + const l2 = (-y1my3 * xmx3 + x1mx3 * ymy3) * inverseDeterminant; + const l3 = 1 - l1 - l2; + if (defined_default(result)) { + result.x = l1; + result.y = l2; + result.z = l3; + return result; + } + return new Cartesian3_default(l1, l2, l3); +}; +Intersections2D.computeLineSegmentLineSegmentIntersection = function(x00, y00, x01, y01, x10, y10, x11, y11, result) { + Check_default.typeOf.number("x00", x00); + Check_default.typeOf.number("y00", y00); + Check_default.typeOf.number("x01", x01); + Check_default.typeOf.number("y01", y01); + Check_default.typeOf.number("x10", x10); + Check_default.typeOf.number("y10", y10); + Check_default.typeOf.number("x11", x11); + Check_default.typeOf.number("y11", y11); + const numerator1A = (x11 - x10) * (y00 - y10) - (y11 - y10) * (x00 - x10); + const numerator1B = (x01 - x00) * (y00 - y10) - (y01 - y00) * (x00 - x10); + const denominator1 = (y11 - y10) * (x01 - x00) - (x11 - x10) * (y01 - y00); + if (denominator1 === 0) { + return; + } + const ua1 = numerator1A / denominator1; + const ub1 = numerator1B / denominator1; + if (ua1 >= 0 && ua1 <= 1 && ub1 >= 0 && ub1 <= 1) { + if (!defined_default(result)) { + result = new Cartesian2_default(); + } + result.x = x00 + ua1 * (x01 - x00); + result.y = y00 + ua1 * (y01 - y00); + return result; + } +}; +var Intersections2D_default = Intersections2D; + +// packages/engine/Source/Workers/upsampleQuantizedTerrainMesh.js +var maxShort = 32767; +var halfMaxShort = maxShort / 2 | 0; +var clipScratch = []; +var clipScratch2 = []; +var verticesScratch = []; +var cartographicScratch = new Cartographic_default(); +var cartesian3Scratch = new Cartesian3_default(); +var uScratch = []; +var vScratch = []; +var heightScratch = []; +var indicesScratch = []; +var normalsScratch = []; +var horizonOcclusionPointScratch = new Cartesian3_default(); +var boundingSphereScratch = new BoundingSphere_default(); +var orientedBoundingBoxScratch = new OrientedBoundingBox_default(); +var decodeTexCoordsScratch = new Cartesian2_default(); +var octEncodedNormalScratch = new Cartesian3_default(); +function upsampleQuantizedTerrainMesh(parameters, transferableObjects) { + const isEastChild = parameters.isEastChild; + const isNorthChild = parameters.isNorthChild; + const minU = isEastChild ? halfMaxShort : 0; + const maxU = isEastChild ? maxShort : halfMaxShort; + const minV = isNorthChild ? halfMaxShort : 0; + const maxV = isNorthChild ? maxShort : halfMaxShort; + const uBuffer = uScratch; + const vBuffer = vScratch; + const heightBuffer = heightScratch; + const normalBuffer = normalsScratch; + uBuffer.length = 0; + vBuffer.length = 0; + heightBuffer.length = 0; + normalBuffer.length = 0; + const indices = indicesScratch; + indices.length = 0; + const vertexMap = {}; + const parentVertices = parameters.vertices; + let parentIndices = parameters.indices; + parentIndices = parentIndices.subarray(0, parameters.indexCountWithoutSkirts); + const encoding = TerrainEncoding_default.clone(parameters.encoding); + const hasVertexNormals = encoding.hasVertexNormals; + let vertexCount = 0; + const quantizedVertexCount = parameters.vertexCountWithoutSkirts; + const parentMinimumHeight = parameters.minimumHeight; + const parentMaximumHeight = parameters.maximumHeight; + const parentUBuffer = new Array(quantizedVertexCount); + const parentVBuffer = new Array(quantizedVertexCount); + const parentHeightBuffer = new Array(quantizedVertexCount); + const parentNormalBuffer = hasVertexNormals ? new Array(quantizedVertexCount * 2) : void 0; + const threshold = 20; + let height; + let i, n; + let u, v; + for (i = 0, n = 0; i < quantizedVertexCount; ++i, n += 2) { + const texCoords = encoding.decodeTextureCoordinates( + parentVertices, + i, + decodeTexCoordsScratch + ); + height = encoding.decodeHeight(parentVertices, i); + u = Math_default.clamp(texCoords.x * maxShort | 0, 0, maxShort); + v = Math_default.clamp(texCoords.y * maxShort | 0, 0, maxShort); + parentHeightBuffer[i] = Math_default.clamp( + (height - parentMinimumHeight) / (parentMaximumHeight - parentMinimumHeight) * maxShort | 0, + 0, + maxShort + ); + if (u < threshold) { + u = 0; + } + if (v < threshold) { + v = 0; + } + if (maxShort - u < threshold) { + u = maxShort; + } + if (maxShort - v < threshold) { + v = maxShort; + } + parentUBuffer[i] = u; + parentVBuffer[i] = v; + if (hasVertexNormals) { + const encodedNormal = encoding.getOctEncodedNormal( + parentVertices, + i, + octEncodedNormalScratch + ); + parentNormalBuffer[n] = encodedNormal.x; + parentNormalBuffer[n + 1] = encodedNormal.y; + } + if ((isEastChild && u >= halfMaxShort || !isEastChild && u <= halfMaxShort) && (isNorthChild && v >= halfMaxShort || !isNorthChild && v <= halfMaxShort)) { + vertexMap[i] = vertexCount; + uBuffer.push(u); + vBuffer.push(v); + heightBuffer.push(parentHeightBuffer[i]); + if (hasVertexNormals) { + normalBuffer.push(parentNormalBuffer[n]); + normalBuffer.push(parentNormalBuffer[n + 1]); + } + ++vertexCount; + } + } + const triangleVertices = []; + triangleVertices.push(new Vertex()); + triangleVertices.push(new Vertex()); + triangleVertices.push(new Vertex()); + const clippedTriangleVertices = []; + clippedTriangleVertices.push(new Vertex()); + clippedTriangleVertices.push(new Vertex()); + clippedTriangleVertices.push(new Vertex()); + let clippedIndex; + let clipped2; + for (i = 0; i < parentIndices.length; i += 3) { + const i0 = parentIndices[i]; + const i1 = parentIndices[i + 1]; + const i2 = parentIndices[i + 2]; + const u0 = parentUBuffer[i0]; + const u1 = parentUBuffer[i1]; + const u2 = parentUBuffer[i2]; + triangleVertices[0].initializeIndexed( + parentUBuffer, + parentVBuffer, + parentHeightBuffer, + parentNormalBuffer, + i0 + ); + triangleVertices[1].initializeIndexed( + parentUBuffer, + parentVBuffer, + parentHeightBuffer, + parentNormalBuffer, + i1 + ); + triangleVertices[2].initializeIndexed( + parentUBuffer, + parentVBuffer, + parentHeightBuffer, + parentNormalBuffer, + i2 + ); + const clipped = Intersections2D_default.clipTriangleAtAxisAlignedThreshold( + halfMaxShort, + isEastChild, + u0, + u1, + u2, + clipScratch + ); + clippedIndex = 0; + if (clippedIndex >= clipped.length) { + continue; + } + clippedIndex = clippedTriangleVertices[0].initializeFromClipResult( + clipped, + clippedIndex, + triangleVertices + ); + if (clippedIndex >= clipped.length) { + continue; + } + clippedIndex = clippedTriangleVertices[1].initializeFromClipResult( + clipped, + clippedIndex, + triangleVertices + ); + if (clippedIndex >= clipped.length) { + continue; + } + clippedIndex = clippedTriangleVertices[2].initializeFromClipResult( + clipped, + clippedIndex, + triangleVertices + ); + clipped2 = Intersections2D_default.clipTriangleAtAxisAlignedThreshold( + halfMaxShort, + isNorthChild, + clippedTriangleVertices[0].getV(), + clippedTriangleVertices[1].getV(), + clippedTriangleVertices[2].getV(), + clipScratch2 + ); + addClippedPolygon( + uBuffer, + vBuffer, + heightBuffer, + normalBuffer, + indices, + vertexMap, + clipped2, + clippedTriangleVertices, + hasVertexNormals + ); + if (clippedIndex < clipped.length) { + clippedTriangleVertices[2].clone(clippedTriangleVertices[1]); + clippedTriangleVertices[2].initializeFromClipResult( + clipped, + clippedIndex, + triangleVertices + ); + clipped2 = Intersections2D_default.clipTriangleAtAxisAlignedThreshold( + halfMaxShort, + isNorthChild, + clippedTriangleVertices[0].getV(), + clippedTriangleVertices[1].getV(), + clippedTriangleVertices[2].getV(), + clipScratch2 + ); + addClippedPolygon( + uBuffer, + vBuffer, + heightBuffer, + normalBuffer, + indices, + vertexMap, + clipped2, + clippedTriangleVertices, + hasVertexNormals + ); + } + } + const uOffset = isEastChild ? -maxShort : 0; + const vOffset = isNorthChild ? -maxShort : 0; + const westIndices = []; + const southIndices = []; + const eastIndices = []; + const northIndices = []; + let minimumHeight = Number.MAX_VALUE; + let maximumHeight = -minimumHeight; + const cartesianVertices = verticesScratch; + cartesianVertices.length = 0; + const ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid); + const rectangle = Rectangle_default.clone(parameters.childRectangle); + const north = rectangle.north; + const south = rectangle.south; + let east = rectangle.east; + const west = rectangle.west; + if (east < west) { + east += Math_default.TWO_PI; + } + for (i = 0; i < uBuffer.length; ++i) { + u = Math.round(uBuffer[i]); + if (u <= minU) { + westIndices.push(i); + u = 0; + } else if (u >= maxU) { + eastIndices.push(i); + u = maxShort; + } else { + u = u * 2 + uOffset; + } + uBuffer[i] = u; + v = Math.round(vBuffer[i]); + if (v <= minV) { + southIndices.push(i); + v = 0; + } else if (v >= maxV) { + northIndices.push(i); + v = maxShort; + } else { + v = v * 2 + vOffset; + } + vBuffer[i] = v; + height = Math_default.lerp( + parentMinimumHeight, + parentMaximumHeight, + heightBuffer[i] / maxShort + ); + if (height < minimumHeight) { + minimumHeight = height; + } + if (height > maximumHeight) { + maximumHeight = height; + } + heightBuffer[i] = height; + cartographicScratch.longitude = Math_default.lerp(west, east, u / maxShort); + cartographicScratch.latitude = Math_default.lerp(south, north, v / maxShort); + cartographicScratch.height = height; + ellipsoid.cartographicToCartesian(cartographicScratch, cartesian3Scratch); + cartesianVertices.push(cartesian3Scratch.x); + cartesianVertices.push(cartesian3Scratch.y); + cartesianVertices.push(cartesian3Scratch.z); + } + const boundingSphere = BoundingSphere_default.fromVertices( + cartesianVertices, + Cartesian3_default.ZERO, + 3, + boundingSphereScratch + ); + const orientedBoundingBox = OrientedBoundingBox_default.fromRectangle( + rectangle, + minimumHeight, + maximumHeight, + ellipsoid, + orientedBoundingBoxScratch + ); + const occluder = new EllipsoidalOccluder_default(ellipsoid); + const horizonOcclusionPoint = occluder.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid( + boundingSphere.center, + cartesianVertices, + 3, + boundingSphere.center, + minimumHeight, + horizonOcclusionPointScratch + ); + const heightRange = maximumHeight - minimumHeight; + const vertices = new Uint16Array( + uBuffer.length + vBuffer.length + heightBuffer.length + ); + for (i = 0; i < uBuffer.length; ++i) { + vertices[i] = uBuffer[i]; + } + let start = uBuffer.length; + for (i = 0; i < vBuffer.length; ++i) { + vertices[start + i] = vBuffer[i]; + } + start += vBuffer.length; + for (i = 0; i < heightBuffer.length; ++i) { + vertices[start + i] = maxShort * (heightBuffer[i] - minimumHeight) / heightRange; + } + const indicesTypedArray = IndexDatatype_default.createTypedArray( + uBuffer.length, + indices + ); + let encodedNormals; + if (hasVertexNormals) { + const normalArray = new Uint8Array(normalBuffer); + transferableObjects.push( + vertices.buffer, + indicesTypedArray.buffer, + normalArray.buffer + ); + encodedNormals = normalArray.buffer; + } else { + transferableObjects.push(vertices.buffer, indicesTypedArray.buffer); + } + return { + vertices: vertices.buffer, + encodedNormals, + indices: indicesTypedArray.buffer, + minimumHeight, + maximumHeight, + westIndices, + southIndices, + eastIndices, + northIndices, + boundingSphere, + orientedBoundingBox, + horizonOcclusionPoint + }; +} +function Vertex() { + this.vertexBuffer = void 0; + this.index = void 0; + this.first = void 0; + this.second = void 0; + this.ratio = void 0; +} +Vertex.prototype.clone = function(result) { + if (!defined_default(result)) { + result = new Vertex(); + } + result.uBuffer = this.uBuffer; + result.vBuffer = this.vBuffer; + result.heightBuffer = this.heightBuffer; + result.normalBuffer = this.normalBuffer; + result.index = this.index; + result.first = this.first; + result.second = this.second; + result.ratio = this.ratio; + return result; +}; +Vertex.prototype.initializeIndexed = function(uBuffer, vBuffer, heightBuffer, normalBuffer, index) { + this.uBuffer = uBuffer; + this.vBuffer = vBuffer; + this.heightBuffer = heightBuffer; + this.normalBuffer = normalBuffer; + this.index = index; + this.first = void 0; + this.second = void 0; + this.ratio = void 0; +}; +Vertex.prototype.initializeFromClipResult = function(clipResult, index, vertices) { + let nextIndex = index + 1; + if (clipResult[index] !== -1) { + vertices[clipResult[index]].clone(this); + } else { + this.vertexBuffer = void 0; + this.index = void 0; + this.first = vertices[clipResult[nextIndex]]; + ++nextIndex; + this.second = vertices[clipResult[nextIndex]]; + ++nextIndex; + this.ratio = clipResult[nextIndex]; + ++nextIndex; + } + return nextIndex; +}; +Vertex.prototype.getKey = function() { + if (this.isIndexed()) { + return this.index; + } + return JSON.stringify({ + first: this.first.getKey(), + second: this.second.getKey(), + ratio: this.ratio + }); +}; +Vertex.prototype.isIndexed = function() { + return defined_default(this.index); +}; +Vertex.prototype.getH = function() { + if (defined_default(this.index)) { + return this.heightBuffer[this.index]; + } + return Math_default.lerp(this.first.getH(), this.second.getH(), this.ratio); +}; +Vertex.prototype.getU = function() { + if (defined_default(this.index)) { + return this.uBuffer[this.index]; + } + return Math_default.lerp(this.first.getU(), this.second.getU(), this.ratio); +}; +Vertex.prototype.getV = function() { + if (defined_default(this.index)) { + return this.vBuffer[this.index]; + } + return Math_default.lerp(this.first.getV(), this.second.getV(), this.ratio); +}; +var encodedScratch = new Cartesian2_default(); +var depth = -1; +var cartesianScratch1 = [new Cartesian3_default(), new Cartesian3_default()]; +var cartesianScratch2 = [new Cartesian3_default(), new Cartesian3_default()]; +function lerpOctEncodedNormal(vertex, result) { + ++depth; + let first = cartesianScratch1[depth]; + let second = cartesianScratch2[depth]; + first = AttributeCompression_default.octDecode( + vertex.first.getNormalX(), + vertex.first.getNormalY(), + first + ); + second = AttributeCompression_default.octDecode( + vertex.second.getNormalX(), + vertex.second.getNormalY(), + second + ); + cartesian3Scratch = Cartesian3_default.lerp( + first, + second, + vertex.ratio, + cartesian3Scratch + ); + Cartesian3_default.normalize(cartesian3Scratch, cartesian3Scratch); + AttributeCompression_default.octEncode(cartesian3Scratch, result); + --depth; + return result; +} +Vertex.prototype.getNormalX = function() { + if (defined_default(this.index)) { + return this.normalBuffer[this.index * 2]; + } + encodedScratch = lerpOctEncodedNormal(this, encodedScratch); + return encodedScratch.x; +}; +Vertex.prototype.getNormalY = function() { + if (defined_default(this.index)) { + return this.normalBuffer[this.index * 2 + 1]; + } + encodedScratch = lerpOctEncodedNormal(this, encodedScratch); + return encodedScratch.y; +}; +var polygonVertices = []; +polygonVertices.push(new Vertex()); +polygonVertices.push(new Vertex()); +polygonVertices.push(new Vertex()); +polygonVertices.push(new Vertex()); +function addClippedPolygon(uBuffer, vBuffer, heightBuffer, normalBuffer, indices, vertexMap, clipped, triangleVertices, hasVertexNormals) { + if (clipped.length === 0) { + return; + } + let numVertices = 0; + let clippedIndex = 0; + while (clippedIndex < clipped.length) { + clippedIndex = polygonVertices[numVertices++].initializeFromClipResult( + clipped, + clippedIndex, + triangleVertices + ); + } + for (let i = 0; i < numVertices; ++i) { + const polygonVertex = polygonVertices[i]; + if (!polygonVertex.isIndexed()) { + const key = polygonVertex.getKey(); + if (defined_default(vertexMap[key])) { + polygonVertex.newIndex = vertexMap[key]; + } else { + const newIndex = uBuffer.length; + uBuffer.push(polygonVertex.getU()); + vBuffer.push(polygonVertex.getV()); + heightBuffer.push(polygonVertex.getH()); + if (hasVertexNormals) { + normalBuffer.push(polygonVertex.getNormalX()); + normalBuffer.push(polygonVertex.getNormalY()); + } + polygonVertex.newIndex = newIndex; + vertexMap[key] = newIndex; + } + } else { + polygonVertex.newIndex = vertexMap[polygonVertex.index]; + polygonVertex.uBuffer = uBuffer; + polygonVertex.vBuffer = vBuffer; + polygonVertex.heightBuffer = heightBuffer; + if (hasVertexNormals) { + polygonVertex.normalBuffer = normalBuffer; + } + } + } + if (numVertices === 3) { + indices.push(polygonVertices[0].newIndex); + indices.push(polygonVertices[1].newIndex); + indices.push(polygonVertices[2].newIndex); + } else if (numVertices === 4) { + indices.push(polygonVertices[0].newIndex); + indices.push(polygonVertices[1].newIndex); + indices.push(polygonVertices[2].newIndex); + indices.push(polygonVertices[0].newIndex); + indices.push(polygonVertices[2].newIndex); + indices.push(polygonVertices[3].newIndex); + } +} +var upsampleQuantizedTerrainMesh_default = createTaskProcessorWorker_default(upsampleQuantizedTerrainMesh); +export { + upsampleQuantizedTerrainMesh_default as default +}; diff --git a/public/assets/core-cc7bf7de.js b/public/assets/core-cc7bf7de.js new file mode 100644 index 0000000..eb684fe --- /dev/null +++ b/public/assets/core-cc7bf7de.js @@ -0,0 +1,22095 @@ +var Kd = Object.defineProperty; +var Qd = (i, t, e) => t in i ? Kd(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e; +var h = (i, t, e) => Qd(i, typeof t != "symbol" ? t + "" : t, e); +import { ol$proj$getTransform as $e, ol$proj$get as ef, ol$proj$equivalent as tf, ol$proj$proj4$register as th, ol$sphere$getDistance as bc, ol$geom$Circle as bt, ol$geom$GeometryCollection as Yi, ol$style$Style as K, ol$style$Fill as et, ol$style$Stroke as Be, ol$style$Text as on, ol$style$Icon as ni, ol$style$Circle as Vi, ol$style$RegularShape as Us, ol$has$DEVICE_PIXEL_RATIO as sf, ol$style$Image as Pc, ol$Feature as ue, ol$extent$containsCoordinate as Qn, ol$Map as rf, ol$interaction$defaults as nf, ol$Observable$unByKey as le, ol$View as dl, ol$easing$inAndOut as af, ol$extent$containsXY as Lc, ol$extent$boundingExtent as Ir, ol$layer$Vector as Ic, ol$geom$SimpleGeometry as of, ol$geom$Point as Ve, ol$geom$LineString as xt, ol$geom$Polygon as ht, ol$geom$MultiPoint as fl, ol$geom$MultiLineString as Ga, ol$geom$MultiPolygon as ks, ol$sphere$offset as Vn, ol$geom$Polygon$fromCircle as Tc, ol$geom$Polygon$circular as lf, ol$colorlike$asColorLike as hf, ol$ImageState as Pn, Feature as Fe, ol$extent$getBottomLeft as gl, ol$extent$getBottomRight as Ac, ol$extent$getTopRight as Dc, ol$extent$getTopLeft as ka, ol$proj$transform as as, ol$source$Vector as Tr, ol$tilegrid$createXYZ as Nc, ol$TileState as Rc, ol$proj$Projection as cf, ol$tilegrid$TileGrid as Fc, ol$source$TileImage as uf, ol$layer$Tile as Ws, ol$extent$buffer as Gc, ol$extent$getCenter as cs, ol$geom$Polygon$fromExtent as kc, ol$proj$transformExtent as ih, ol$format$GeoJSON as zc, ol$extent$getWidth as zo, ol$source$TileWMS as df, ol$source$ImageWMS as ff, ol$format$GML2 as Ho, ol$format$WFS as Bo, ol$format$GML3 as Vo, ol$extent$createEmpty as zs, ol$structs$LRUCache as gf, ol$extent$createOrUpdateFromCoordinate as mf, ol$render$canvas$Immediate as pf, ol$geom$flat$transform$transform2D as yf, ol$extent$intersects as Hc, ol$geom$SimpleGeometry$transformGeom2D as _f, ol$transform$scale as vf, ol$transform$create as Sf, ol$transform$compose as wf, ol$extent$extend as Ar, ol$source$OSM as Cf, ol$layer$Image as Bc, ol$source$ImageStatic as Mf, ol$source$TileDebug as xf, ol$source$XYZ as Ef, ol$source$VectorTile as Of, ol$layer$VectorTile as bf, ol$tilegrid$WMTS as Pf, ol$source$WMTS as Lf, ol$format$MVT as If, ol$coordinate$equals as Tf, ol$interaction$DragPan as Af, ol$extent$isEmpty as jo, ol$geom$LinearRing as Df } from "./ol-f921df59.js"; +import { Cartesian3 as _, Math as b, Cartographic as ee, Cesium3DTileStyle as ea, Cesium3DTileColorBlendMode as jn, Color as U, TrustedServers as fi, VerticalOrigin as Lt, Cesium3DTileFeature as Xi, Cesium3DTilePointFeature as Zi, Entity as Ji, Material as At, Cartesian2 as H, Matrix3 as Q, Quaternion as ta, Primitive as St, GeometryInstance as Ze, FrustumGeometry as Nf, ColorGeometryInstanceAttribute as Dr, PerInstanceColorAppearance as Hs, FrustumOutlineGeometry as Rf, destroyObject as Ff, EasingFunction as Gf, ConditionsExpression as kf, Expression as zf, HeightReference as Y, ClassificationType as os, NearFarScalar as wr, SplitDirection as we, sampleTerrainMostDetailed as Ys, PolygonOutlineGeometry as Hf, GroundPolylineGeometry as ml, PolylineGeometry as ls, PolygonHierarchy as $o, PolygonGeometry as Bf, CircleOutlineGeometry as Vf, CircleGeometry as jf, HeadingPitchRoll as us, Matrix4 as G, Transforms as ji, Model as pl, MaterialAppearance as ia, ModelAnimationLoop as $f, CylinderOutlineGeometry as qf, CylinderGeometry as Vc, EllipsoidOutlineGeometry as Uf, EllipsoidGeometry as jc, SphereOutlineGeometry as Wf, SphereGeometry as Yf, BoxOutlineGeometry as Xf, BoxGeometry as yl, LabelStyle as to, HorizontalOrigin as io, WallGeometry as Zf, WallOutlineGeometry as Jf, ArcType as sa, CatmullRomSpline as $c, ClassificationPrimitive as za, SceneTransforms as Kf, ShadowMode as Ha, GroundPrimitive as qc, PolylineMaterialAppearance as ra, GroundPolylinePrimitive as Uc, PrimitiveCollection as $t, BillboardCollection as Qf, LabelCollection as eg, Billboard as Wc, Resource as tg, CesiumTerrainProvider as sh, Cartesian4 as rh, sampleTerrain as ig, Ellipsoid as qo, Clock as sg, DataSourceClock as rg, JulianDate as Yc, KeyboardEventModifier as so, ScreenSpaceEventType as Ni, CesiumWidget as ng, DataSourceDisplay as nh, DataSourceCollection as ah, RequestScheduler as ag, ScreenSpaceEventHandler as og, Ray as Xc, Camera as Zc, ImageryLayer as vs, CustomDataSource as Jc, BoundingSphere as Kc, Intersect as $n, BillboardVisualizer as lg, LabelVisualizer as hg, PointVisualizer as cg, WebMercatorTilingScheme as _l, GeographicTilingScheme as Qc, Rectangle as Et, Cesium3DTileset as na, Composite3DTileContent as ug, ConstantProperty as eu, HeadingPitchRange as dg, BoundingSphereState as oh, OpenStreetMapImageryProvider as fg, SingleTileImageryProvider as gg, TileMapServiceImageryProvider as mg, Event as Uo, WebMapServiceImageryProvider as pg, WebMapTileServiceImageryProvider as yg, TileBoundingRegion as _g, QuadtreeTileProvider as vg, QuadtreeTileLoadState as Ln, Visibility as sr, EntityCollection as Sg, CzmlDataSource as wg, QuadtreePrimitive as Cg, Plane as oe, ClippingPlaneCollection as Nr, ClippingPlane as Rr, Globe as Mg, LinearSpline as xg, QuaternionSpline as Eg, IntersectionTests as Og, Matrix2 as lh, CoplanarPolygonGeometry as bg } from "./cesium-68463534.js"; +const Ss = Symbol("isMatcher"), Pg = Symbol("Integer"), Lg = Symbol("NonEmptyString"), vl = /* @__PURE__ */ new Map(); +[ + [String, "string"], + [Number, "number"], + [Boolean, "boolean"], + [Function, "function"], + [void 0, "undefined"], + [Symbol, "symbol"] +].forEach(([i, t]) => { + vl.set(i, t); +}); +function Ig(i) { + return i == null ? void 0 : i[Ss]; +} +function Fr(i) { + if (!i || String(i) !== "[object Object]") + return !1; + const t = Object.getPrototypeOf(i); + if (!t) + return !0; + const s = {}.hasOwnProperty.call(t, "constructor") && t.constructor; + return typeof s == "function" && String(s) === String(Object); +} +function Ye(i, t) { + if (i === null) + return "null"; + if (typeof i > "u") + return "undefined"; + if (t) + return typeof i; + let e; + if (Array.isArray(i)) + e = `[${i.map((r) => Ye(r, t)).join(",")}]`; + else + try { + e = JSON.stringify(i); + } catch { + e = typeof i; + } + return e = e || typeof i, e.length > 20 ? `${e.substring(0, 20)}...` : e; +} +function Tg(i, t) { + return typeof t == "string" || typeof t == "number" || typeof t == "boolean" || typeof t == "symbol" ? i === t ? !1 : `Expected ${Ye(i)} to equal ${t.toString()}` : null; +} +function Ag(i, t, e) { + if (Array.isArray(t)) { + if (t.length !== 1) + throw new Error("Array patterns may only have one type"); + if (Array.isArray(i)) { + let s = !1; + return i.findIndex((n) => (s = e(n, t[0]), s)) > -1 ? `${String(s)} in ${Ye(i)}` : !1; + } + return `Expected ${Ye(i)} to be an Array`; + } + return null; +} +function Wo(i, t, e, s) { + const r = s ? `${s}.` : ""; + if (!Fr(i)) + return `Expected ${Ye(i)} to be a plain Object`; + let a = !1; + const o = Object.keys(t).find((l) => { + const c = i[l]; + return Fr(t[l]) ? a = Wo(c, t[l], e, r + l) : a = e(c, t[l]), a; + }); + return o ? `${String(a)} in object.${r}${o}` : !1; +} +function Dg(i, t) { + if (t === Number) + return Number.isFinite(i) ? !1 : `expected ${Ye(i)} to be a number, excluding NaN`; + if (t === Pg) + return Number.isInteger(i) ? !1 : `expected ${Ye(i)} to be an integer number`; + if (t === Lg) + return typeof i == "string" && i.length > 0 ? !1 : `expected ${Ye(i)} to be a non-empty string`; + const e = vl.get(t); + return e ? typeof i === e ? !1 : `expected ${Ye(i)} to be a ${String(e)}` : null; +} +function Ba(i) { + if (i === null) + return "null"; + const t = vl.get(i); + if (t) + return t; + const e = i == null ? void 0 : i.className; + if (e) + return e; + let s = String(i); + const r = s.match(/function (.*)\(/); + if (r && r.length > 1) { + const n = i == null ? void 0 : i.name; + return n || r[1].substring(0, 20); + } + if (Fr(i)) { + const n = {}; + Object.keys(i).forEach((a) => { + n[a] = Ba(i[a]); + }); + try { + s = `Object of ${JSON.stringify(n)}`; + } catch { + s = "Object"; + } + } + return s; +} +function Ng(i, t) { + let e = !1; + return Fr(i) ? Object.keys(i).find((n) => (t[n] || (e = `Found additional key ${n}`), e)) ? `${String(e)} in ${Ye(i)}` : !1 : `Expected ${Ye(i)} to be a plain Object`; +} +function Xs(i, t) { + const e = (s, r) => { + if (Ig(r)) + return r(s); + if (r == null) + return s === r ? !1 : `Expected ${Ye(s)} to be ${String(r)}`; + const n = Dg(s, r); + if (n !== null) + return n; + const a = Tg(s, r); + if (a !== null) + return a; + if (Array.isArray(r)) + return Ag(s, r, e); + if (r === Object) + return Wo(s, {}, e); + if (r instanceof Function) + return s instanceof r ? !1 : `Expected ${Ye(s, !0)} to be of Type ${Ba(r)}`; + if (typeof r == "object") { + const o = Wo(s, r, e); + return o || !1; + } + throw new Error(`Cannot handle pattern ${String(r)}`); + }; + return e(i, t); +} +function ws(i, t) { + return !Xs(i, t); +} +let Rg = Error; +function S(i, t) { + const e = Xs(i, t); + if (e) + throw new Rg(`Match failed: ${e}`); +} +function ie(i) { + const t = (e) => { + if (e == null) + return !1; + const s = Xs(e, i); + return s && `${s} or undefined or null`; + }; + return t[Ss] = !0, t; +} +function tu(i) { + const t = (e) => { + if (e === void 0) + return !1; + const s = Xs(e, i); + return s && `${s} or undefined`; + }; + return t[Ss] = !0, t; +} +function je(...i) { + const t = (e) => i.every((r) => Xs(e, r)) ? `Expected ${Ye(e)} to be a ${i.map((r) => Ba(r)).join(" or ")}` : !1; + return t[Ss] = !0, t; +} +function Fg(i) { + S(i, Object); + const t = (e) => { + const s = Xs(e, i); + return s || Ng(e, i); + }; + return t[Ss] = !0, t; +} +function hh(i) { + const t = (e) => Fr(e) ? Object.values(e).every((r) => ws(r, i)) ? !1 : `Not all values of ${Ye(e)} are of type ${Ba(i)}` : `Expected ${Ye(e)} to be a plain Object`; + return t[Ss] = !0, t; +} +function aa(i) { + S(i, Object); + const t = Object.values(i), e = (s) => t.includes(s) ? !1 : `expected ${Ye(s)} to be of enum: ${t.join(", ")}`; + return e[Ss] = !0, e; +} +function Gg(i) { + i("EPSG:4326", "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"), i("EPSG:4269", "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"), i("EPSG:3857", "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"), i.WGS84 = i["EPSG:4326"], i["EPSG:3785"] = i["EPSG:3857"], i.GOOGLE = i["EPSG:3857"], i["EPSG:900913"] = i["EPSG:3857"], i["EPSG:102113"] = i["EPSG:3857"]; +} +var ds = 1, fs = 2, Fs = 3, kg = 4, Yo = 5, ch = 6378137, zg = 6356752314e-3, uh = 0.0066943799901413165, Cr = 484813681109536e-20, O = Math.PI / 2, Hg = 0.16666666666666666, Bg = 0.04722222222222222, Vg = 0.022156084656084655, T = 1e-10, Ue = 0.017453292519943295, ii = 57.29577951308232, se = Math.PI / 4, Gr = Math.PI * 2, xe = 3.14159265359, Pt = {}; +Pt.greenwich = 0; +Pt.lisbon = -9.131906111111; +Pt.paris = 2.337229166667; +Pt.bogota = -74.080916666667; +Pt.madrid = -3.687938888889; +Pt.rome = 12.452333333333; +Pt.bern = 7.439583333333; +Pt.jakarta = 106.807719444444; +Pt.ferro = -17.666666666667; +Pt.brussels = 4.367975; +Pt.stockholm = 18.058277777778; +Pt.athens = 23.7163375; +Pt.oslo = 10.722916666667; +const jg = { + ft: { to_meter: 0.3048 }, + "us-ft": { to_meter: 1200 / 3937 } +}; +var dh = /[\s_\-\/\(\)]/g; +function $i(i, t) { + if (i[t]) + return i[t]; + for (var e = Object.keys(i), s = t.toLowerCase().replace(dh, ""), r = -1, n, a; ++r < e.length; ) + if (n = e[r], a = n.toLowerCase().replace(dh, ""), a === s) + return i[n]; +} +function Xo(i) { + var t = {}, e = i.split("+").map(function(o) { + return o.trim(); + }).filter(function(o) { + return o; + }).reduce(function(o, l) { + var c = l.split("="); + return c.push(!0), o[c[0].toLowerCase()] = c[1], o; + }, {}), s, r, n, a = { + proj: "projName", + datum: "datumCode", + rf: function(o) { + t.rf = parseFloat(o); + }, + lat_0: function(o) { + t.lat0 = o * Ue; + }, + lat_1: function(o) { + t.lat1 = o * Ue; + }, + lat_2: function(o) { + t.lat2 = o * Ue; + }, + lat_ts: function(o) { + t.lat_ts = o * Ue; + }, + lon_0: function(o) { + t.long0 = o * Ue; + }, + lon_1: function(o) { + t.long1 = o * Ue; + }, + lon_2: function(o) { + t.long2 = o * Ue; + }, + alpha: function(o) { + t.alpha = parseFloat(o) * Ue; + }, + gamma: function(o) { + t.rectified_grid_angle = parseFloat(o); + }, + lonc: function(o) { + t.longc = o * Ue; + }, + x_0: function(o) { + t.x0 = parseFloat(o); + }, + y_0: function(o) { + t.y0 = parseFloat(o); + }, + k_0: function(o) { + t.k0 = parseFloat(o); + }, + k: function(o) { + t.k0 = parseFloat(o); + }, + a: function(o) { + t.a = parseFloat(o); + }, + b: function(o) { + t.b = parseFloat(o); + }, + r: function(o) { + t.a = t.b = parseFloat(o); + }, + r_a: function() { + t.R_A = !0; + }, + zone: function(o) { + t.zone = parseInt(o, 10); + }, + south: function() { + t.utmSouth = !0; + }, + towgs84: function(o) { + t.datum_params = o.split(",").map(function(l) { + return parseFloat(l); + }); + }, + to_meter: function(o) { + t.to_meter = parseFloat(o); + }, + units: function(o) { + t.units = o; + var l = $i(jg, o); + l && (t.to_meter = l.to_meter); + }, + from_greenwich: function(o) { + t.from_greenwich = o * Ue; + }, + pm: function(o) { + var l = $i(Pt, o); + t.from_greenwich = (l || parseFloat(o)) * Ue; + }, + nadgrids: function(o) { + o === "@null" ? t.datumCode = "none" : t.nadgrids = o; + }, + axis: function(o) { + var l = "ewnsud"; + o.length === 3 && l.indexOf(o.substr(0, 1)) !== -1 && l.indexOf(o.substr(1, 1)) !== -1 && l.indexOf(o.substr(2, 1)) !== -1 && (t.axis = o); + }, + approx: function() { + t.approx = !0; + } + }; + for (s in e) + r = e[s], s in a ? (n = a[s], typeof n == "function" ? n(r) : t[n] = r) : t[s] = r; + return typeof t.datumCode == "string" && t.datumCode !== "WGS84" && (t.datumCode = t.datumCode.toLowerCase()), t; +} +var kr = 1, iu = 2, su = 3, oa = 4, ru = 5, Sl = -1, $g = /\s/, qg = /[A-Za-z]/, Ug = /[A-Za-z84_]/, Va = /[,\]]/, nu = /[\d\.E\-\+]/; +function Ti(i) { + if (typeof i != "string") + throw new Error("not a string"); + this.text = i.trim(), this.level = 0, this.place = 0, this.root = null, this.stack = [], this.currentObject = null, this.state = kr; +} +Ti.prototype.readCharicter = function() { + var i = this.text[this.place++]; + if (this.state !== oa) + for (; $g.test(i); ) { + if (this.place >= this.text.length) + return; + i = this.text[this.place++]; + } + switch (this.state) { + case kr: + return this.neutral(i); + case iu: + return this.keyword(i); + case oa: + return this.quoted(i); + case ru: + return this.afterquote(i); + case su: + return this.number(i); + case Sl: + return; + } +}; +Ti.prototype.afterquote = function(i) { + if (i === '"') { + this.word += '"', this.state = oa; + return; + } + if (Va.test(i)) { + this.word = this.word.trim(), this.afterItem(i); + return; + } + throw new Error(`havn't handled "` + i + '" in afterquote yet, index ' + this.place); +}; +Ti.prototype.afterItem = function(i) { + if (i === ",") { + this.word !== null && this.currentObject.push(this.word), this.word = null, this.state = kr; + return; + } + if (i === "]") { + this.level--, this.word !== null && (this.currentObject.push(this.word), this.word = null), this.state = kr, this.currentObject = this.stack.pop(), this.currentObject || (this.state = Sl); + return; + } +}; +Ti.prototype.number = function(i) { + if (nu.test(i)) { + this.word += i; + return; + } + if (Va.test(i)) { + this.word = parseFloat(this.word), this.afterItem(i); + return; + } + throw new Error(`havn't handled "` + i + '" in number yet, index ' + this.place); +}; +Ti.prototype.quoted = function(i) { + if (i === '"') { + this.state = ru; + return; + } + this.word += i; +}; +Ti.prototype.keyword = function(i) { + if (Ug.test(i)) { + this.word += i; + return; + } + if (i === "[") { + var t = []; + t.push(this.word), this.level++, this.root === null ? this.root = t : this.currentObject.push(t), this.stack.push(this.currentObject), this.currentObject = t, this.state = kr; + return; + } + if (Va.test(i)) { + this.afterItem(i); + return; + } + throw new Error(`havn't handled "` + i + '" in keyword yet, index ' + this.place); +}; +Ti.prototype.neutral = function(i) { + if (qg.test(i)) { + this.word = i, this.state = iu; + return; + } + if (i === '"') { + this.word = "", this.state = oa; + return; + } + if (nu.test(i)) { + this.word = i, this.state = su; + return; + } + if (Va.test(i)) { + this.afterItem(i); + return; + } + throw new Error(`havn't handled "` + i + '" in neutral yet, index ' + this.place); +}; +Ti.prototype.output = function() { + for (; this.place < this.text.length; ) + this.readCharicter(); + if (this.state === Sl) + return this.root; + throw new Error('unable to parse string "' + this.text + '". State is ' + this.state); +}; +function Wg(i) { + var t = new Ti(i); + return t.output(); +} +function fh(i, t, e) { + Array.isArray(t) && (e.unshift(t), t = null); + var s = t ? {} : i, r = e.reduce(function(n, a) { + return As(a, n), n; + }, s); + t && (i[t] = r); +} +function As(i, t) { + if (!Array.isArray(i)) { + t[i] = !0; + return; + } + var e = i.shift(); + if (e === "PARAMETER" && (e = i.shift()), i.length === 1) { + if (Array.isArray(i[0])) { + t[e] = {}, As(i[0], t[e]); + return; + } + t[e] = i[0]; + return; + } + if (!i.length) { + t[e] = !0; + return; + } + if (e === "TOWGS84") { + t[e] = i; + return; + } + if (e === "AXIS") { + e in t || (t[e] = []), t[e].push(i); + return; + } + Array.isArray(e) || (t[e] = {}); + var s; + switch (e) { + case "UNIT": + case "PRIMEM": + case "VERT_DATUM": + t[e] = { + name: i[0].toLowerCase(), + convert: i[1] + }, i.length === 3 && As(i[2], t[e]); + return; + case "SPHEROID": + case "ELLIPSOID": + t[e] = { + name: i[0], + a: i[1], + rf: i[2] + }, i.length === 4 && As(i[3], t[e]); + return; + case "PROJECTEDCRS": + case "PROJCRS": + case "GEOGCS": + case "GEOCCS": + case "PROJCS": + case "LOCAL_CS": + case "GEODCRS": + case "GEODETICCRS": + case "GEODETICDATUM": + case "EDATUM": + case "ENGINEERINGDATUM": + case "VERT_CS": + case "VERTCRS": + case "VERTICALCRS": + case "COMPD_CS": + case "COMPOUNDCRS": + case "ENGINEERINGCRS": + case "ENGCRS": + case "FITTED_CS": + case "LOCAL_DATUM": + case "DATUM": + i[0] = ["name", i[0]], fh(t, e, i); + return; + default: + for (s = -1; ++s < i.length; ) + if (!Array.isArray(i[s])) + return As(i, t[e]); + return fh(t, e, i); + } +} +var Yg = 0.017453292519943295; +function Xg(i, t) { + var e = t[0], s = t[1]; + !(e in i) && s in i && (i[e] = i[s], t.length === 3 && (i[e] = t[2](i[e]))); +} +function Yt(i) { + return i * Yg; +} +function Zg(i) { + if (i.type === "GEOGCS" ? i.projName = "longlat" : i.type === "LOCAL_CS" ? (i.projName = "identity", i.local = !0) : typeof i.PROJECTION == "object" ? i.projName = Object.keys(i.PROJECTION)[0] : i.projName = i.PROJECTION, i.AXIS) { + for (var t = "", e = 0, s = i.AXIS.length; e < s; ++e) { + var r = [i.AXIS[e][0].toLowerCase(), i.AXIS[e][1].toLowerCase()]; + r[0].indexOf("north") !== -1 || (r[0] === "y" || r[0] === "lat") && r[1] === "north" ? t += "n" : r[0].indexOf("south") !== -1 || (r[0] === "y" || r[0] === "lat") && r[1] === "south" ? t += "s" : r[0].indexOf("east") !== -1 || (r[0] === "x" || r[0] === "lon") && r[1] === "east" ? t += "e" : (r[0].indexOf("west") !== -1 || (r[0] === "x" || r[0] === "lon") && r[1] === "west") && (t += "w"); + } + t.length === 2 && (t += "u"), t.length === 3 && (i.axis = t); + } + i.UNIT && (i.units = i.UNIT.name.toLowerCase(), i.units === "metre" && (i.units = "meter"), i.UNIT.convert && (i.type === "GEOGCS" ? i.DATUM && i.DATUM.SPHEROID && (i.to_meter = i.UNIT.convert * i.DATUM.SPHEROID.a) : i.to_meter = i.UNIT.convert)); + var n = i.GEOGCS; + i.type === "GEOGCS" && (n = i), n && (n.DATUM ? i.datumCode = n.DATUM.name.toLowerCase() : i.datumCode = n.name.toLowerCase(), i.datumCode.slice(0, 2) === "d_" && (i.datumCode = i.datumCode.slice(2)), (i.datumCode === "new_zealand_geodetic_datum_1949" || i.datumCode === "new_zealand_1949") && (i.datumCode = "nzgd49"), (i.datumCode === "wgs_1984" || i.datumCode === "world_geodetic_system_1984") && (i.PROJECTION === "Mercator_Auxiliary_Sphere" && (i.sphere = !0), i.datumCode = "wgs84"), i.datumCode.slice(-6) === "_ferro" && (i.datumCode = i.datumCode.slice(0, -6)), i.datumCode.slice(-8) === "_jakarta" && (i.datumCode = i.datumCode.slice(0, -8)), ~i.datumCode.indexOf("belge") && (i.datumCode = "rnb72"), n.DATUM && n.DATUM.SPHEROID && (i.ellps = n.DATUM.SPHEROID.name.replace("_19", "").replace(/[Cc]larke\_18/, "clrk"), i.ellps.toLowerCase().slice(0, 13) === "international" && (i.ellps = "intl"), i.a = n.DATUM.SPHEROID.a, i.rf = parseFloat(n.DATUM.SPHEROID.rf, 10)), n.DATUM && n.DATUM.TOWGS84 && (i.datum_params = n.DATUM.TOWGS84), ~i.datumCode.indexOf("osgb_1936") && (i.datumCode = "osgb36"), ~i.datumCode.indexOf("osni_1952") && (i.datumCode = "osni52"), (~i.datumCode.indexOf("tm65") || ~i.datumCode.indexOf("geodetic_datum_of_1965")) && (i.datumCode = "ire65"), i.datumCode === "ch1903+" && (i.datumCode = "ch1903"), ~i.datumCode.indexOf("israel") && (i.datumCode = "isr93")), i.b && !isFinite(i.b) && (i.b = i.a); + function a(c) { + var d = i.to_meter || 1; + return c * d; + } + var o = function(c) { + return Xg(i, c); + }, l = [ + ["standard_parallel_1", "Standard_Parallel_1"], + ["standard_parallel_1", "Latitude of 1st standard parallel"], + ["standard_parallel_2", "Standard_Parallel_2"], + ["standard_parallel_2", "Latitude of 2nd standard parallel"], + ["false_easting", "False_Easting"], + ["false_easting", "False easting"], + ["false-easting", "Easting at false origin"], + ["false_northing", "False_Northing"], + ["false_northing", "False northing"], + ["false_northing", "Northing at false origin"], + ["central_meridian", "Central_Meridian"], + ["central_meridian", "Longitude of natural origin"], + ["central_meridian", "Longitude of false origin"], + ["latitude_of_origin", "Latitude_Of_Origin"], + ["latitude_of_origin", "Central_Parallel"], + ["latitude_of_origin", "Latitude of natural origin"], + ["latitude_of_origin", "Latitude of false origin"], + ["scale_factor", "Scale_Factor"], + ["k0", "scale_factor"], + ["latitude_of_center", "Latitude_Of_Center"], + ["latitude_of_center", "Latitude_of_center"], + ["lat0", "latitude_of_center", Yt], + ["longitude_of_center", "Longitude_Of_Center"], + ["longitude_of_center", "Longitude_of_center"], + ["longc", "longitude_of_center", Yt], + ["x0", "false_easting", a], + ["y0", "false_northing", a], + ["long0", "central_meridian", Yt], + ["lat0", "latitude_of_origin", Yt], + ["lat0", "standard_parallel_1", Yt], + ["lat1", "standard_parallel_1", Yt], + ["lat2", "standard_parallel_2", Yt], + ["azimuth", "Azimuth"], + ["alpha", "azimuth", Yt], + ["srsCode", "name"] + ]; + l.forEach(o), !i.long0 && i.longc && (i.projName === "Albers_Conic_Equal_Area" || i.projName === "Lambert_Azimuthal_Equal_Area") && (i.long0 = i.longc), !i.lat_ts && i.lat1 && (i.projName === "Stereographic_South_Pole" || i.projName === "Polar Stereographic (variant B)") ? (i.lat0 = Yt(i.lat1 > 0 ? 90 : -90), i.lat_ts = i.lat1) : !i.lat_ts && i.lat0 && i.projName === "Polar_Stereographic" && (i.lat_ts = i.lat0, i.lat0 = Yt(i.lat0 > 0 ? 90 : -90)); +} +function au(i) { + var t = Wg(i), e = t.shift(), s = t.shift(); + t.unshift(["name", s]), t.unshift(["type", e]); + var r = {}; + return As(t, r), Zg(r), r; +} +function nt(i) { + var t = this; + if (arguments.length === 2) { + var e = arguments[1]; + typeof e == "string" ? e.charAt(0) === "+" ? nt[i] = Xo(arguments[1]) : nt[i] = au(arguments[1]) : nt[i] = e; + } else if (arguments.length === 1) { + if (Array.isArray(i)) + return i.map(function(s) { + Array.isArray(s) ? nt.apply(t, s) : nt(s); + }); + if (typeof i == "string") { + if (i in nt) + return nt[i]; + } else "EPSG" in i ? nt["EPSG:" + i.EPSG] = i : "ESRI" in i ? nt["ESRI:" + i.ESRI] = i : "IAU2000" in i ? nt["IAU2000:" + i.IAU2000] = i : console.log(i); + return; + } +} +Gg(nt); +function Jg(i) { + return typeof i == "string"; +} +function Kg(i) { + return i in nt; +} +var Qg = ["PROJECTEDCRS", "PROJCRS", "GEOGCS", "GEOCCS", "PROJCS", "LOCAL_CS", "GEODCRS", "GEODETICCRS", "GEODETICDATUM", "ENGCRS", "ENGINEERINGCRS"]; +function em(i) { + return Qg.some(function(t) { + return i.indexOf(t) > -1; + }); +} +var tm = ["3857", "900913", "3785", "102113"]; +function im(i) { + var t = $i(i, "authority"); + if (t) { + var e = $i(t, "epsg"); + return e && tm.indexOf(e) > -1; + } +} +function sm(i) { + var t = $i(i, "extension"); + if (t) + return $i(t, "proj4"); +} +function rm(i) { + return i[0] === "+"; +} +function nm(i) { + if (Jg(i)) { + if (Kg(i)) + return nt[i]; + if (em(i)) { + var t = au(i); + if (im(t)) + return nt["EPSG:3857"]; + var e = sm(t); + return e ? Xo(e) : t; + } + if (rm(i)) + return Xo(i); + } else + return i; +} +function gh(i, t) { + i = i || {}; + var e, s; + if (!t) + return i; + for (s in t) + e = t[s], e !== void 0 && (i[s] = e); + return i; +} +function ai(i, t, e) { + var s = i * t; + return e / Math.sqrt(1 - s * s); +} +function ln(i) { + return i < 0 ? -1 : 1; +} +function A(i) { + return Math.abs(i) <= xe ? i : i - ln(i) * Gr; +} +function Vt(i, t, e) { + var s = i * e, r = 0.5 * i; + return s = Math.pow((1 - s) / (1 + s), r), Math.tan(0.5 * (O - t)) / s; +} +function zr(i, t) { + for (var e = 0.5 * i, s, r, n = O - 2 * Math.atan(t), a = 0; a <= 15; a++) + if (s = i * Math.sin(n), r = O - 2 * Math.atan(t * Math.pow((1 - s) / (1 + s), e)) - n, n += r, Math.abs(r) <= 1e-10) + return n; + return -9999; +} +function am() { + var i = this.b / this.a; + this.es = 1 - i * i, "x0" in this || (this.x0 = 0), "y0" in this || (this.y0 = 0), this.e = Math.sqrt(this.es), this.lat_ts ? this.sphere ? this.k0 = Math.cos(this.lat_ts) : this.k0 = ai(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) : this.k0 || (this.k ? this.k0 = this.k : this.k0 = 1); +} +function om(i) { + var t = i.x, e = i.y; + if (e * ii > 90 && e * ii < -90 && t * ii > 180 && t * ii < -180) + return null; + var s, r; + if (Math.abs(Math.abs(e) - O) <= T) + return null; + if (this.sphere) + s = this.x0 + this.a * this.k0 * A(t - this.long0), r = this.y0 + this.a * this.k0 * Math.log(Math.tan(se + 0.5 * e)); + else { + var n = Math.sin(e), a = Vt(this.e, e, n); + s = this.x0 + this.a * this.k0 * A(t - this.long0), r = this.y0 - this.a * this.k0 * Math.log(a); + } + return i.x = s, i.y = r, i; +} +function lm(i) { + var t = i.x - this.x0, e = i.y - this.y0, s, r; + if (this.sphere) + r = O - 2 * Math.atan(Math.exp(-e / (this.a * this.k0))); + else { + var n = Math.exp(-e / (this.a * this.k0)); + if (r = zr(this.e, n), r === -9999) + return null; + } + return s = A(this.long0 + t / (this.a * this.k0)), i.x = s, i.y = r, i; +} +var hm = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; +const cm = { + init: am, + forward: om, + inverse: lm, + names: hm +}; +function um() { +} +function mh(i) { + return i; +} +var dm = ["longlat", "identity"]; +const fm = { + init: um, + forward: mh, + inverse: mh, + names: dm +}; +var gm = [cm, fm], qn = {}, la = []; +function ou(i, t) { + var e = la.length; + return i.names ? (la[e] = i, i.names.forEach(function(s) { + qn[s.toLowerCase()] = e; + }), this) : (console.log(t), !0); +} +function mm(i) { + if (!i) + return !1; + var t = i.toLowerCase(); + if (typeof qn[t] < "u" && la[qn[t]]) + return la[qn[t]]; +} +function pm() { + gm.forEach(ou); +} +const ym = { + start: pm, + add: ou, + get: mm +}; +var q = {}; +q.MERIT = { + a: 6378137, + rf: 298.257, + ellipseName: "MERIT 1983" +}; +q.SGS85 = { + a: 6378136, + rf: 298.257, + ellipseName: "Soviet Geodetic System 85" +}; +q.GRS80 = { + a: 6378137, + rf: 298.257222101, + ellipseName: "GRS 1980(IUGG, 1980)" +}; +q.IAU76 = { + a: 6378140, + rf: 298.257, + ellipseName: "IAU 1976" +}; +q.airy = { + a: 6377563396e-3, + b: 635625691e-2, + ellipseName: "Airy 1830" +}; +q.APL4 = { + a: 6378137, + rf: 298.25, + ellipseName: "Appl. Physics. 1965" +}; +q.NWL9D = { + a: 6378145, + rf: 298.25, + ellipseName: "Naval Weapons Lab., 1965" +}; +q.mod_airy = { + a: 6377340189e-3, + b: 6356034446e-3, + ellipseName: "Modified Airy" +}; +q.andrae = { + a: 637710443e-2, + rf: 300, + ellipseName: "Andrae 1876 (Den., Iclnd.)" +}; +q.aust_SA = { + a: 6378160, + rf: 298.25, + ellipseName: "Australian Natl & S. Amer. 1969" +}; +q.GRS67 = { + a: 6378160, + rf: 298.247167427, + ellipseName: "GRS 67(IUGG 1967)" +}; +q.bessel = { + a: 6377397155e-3, + rf: 299.1528128, + ellipseName: "Bessel 1841" +}; +q.bess_nam = { + a: 6377483865e-3, + rf: 299.1528128, + ellipseName: "Bessel 1841 (Namibia)" +}; +q.clrk66 = { + a: 63782064e-1, + b: 63565838e-1, + ellipseName: "Clarke 1866" +}; +q.clrk80 = { + a: 6378249145e-3, + rf: 293.4663, + ellipseName: "Clarke 1880 mod." +}; +q.clrk80ign = { + a: 63782492e-1, + b: 6356515, + rf: 293.4660213, + ellipseName: "Clarke 1880 (IGN)" +}; +q.clrk58 = { + a: 6378293645208759e-9, + rf: 294.2606763692654, + ellipseName: "Clarke 1858" +}; +q.CPM = { + a: 63757387e-1, + rf: 334.29, + ellipseName: "Comm. des Poids et Mesures 1799" +}; +q.delmbr = { + a: 6376428, + rf: 311.5, + ellipseName: "Delambre 1810 (Belgium)" +}; +q.engelis = { + a: 637813605e-2, + rf: 298.2566, + ellipseName: "Engelis 1985" +}; +q.evrst30 = { + a: 6377276345e-3, + rf: 300.8017, + ellipseName: "Everest 1830" +}; +q.evrst48 = { + a: 6377304063e-3, + rf: 300.8017, + ellipseName: "Everest 1948" +}; +q.evrst56 = { + a: 6377301243e-3, + rf: 300.8017, + ellipseName: "Everest 1956" +}; +q.evrst69 = { + a: 6377295664e-3, + rf: 300.8017, + ellipseName: "Everest 1969" +}; +q.evrstSS = { + a: 6377298556e-3, + rf: 300.8017, + ellipseName: "Everest (Sabah & Sarawak)" +}; +q.fschr60 = { + a: 6378166, + rf: 298.3, + ellipseName: "Fischer (Mercury Datum) 1960" +}; +q.fschr60m = { + a: 6378155, + rf: 298.3, + ellipseName: "Fischer 1960" +}; +q.fschr68 = { + a: 6378150, + rf: 298.3, + ellipseName: "Fischer 1968" +}; +q.helmert = { + a: 6378200, + rf: 298.3, + ellipseName: "Helmert 1906" +}; +q.hough = { + a: 6378270, + rf: 297, + ellipseName: "Hough" +}; +q.intl = { + a: 6378388, + rf: 297, + ellipseName: "International 1909 (Hayford)" +}; +q.kaula = { + a: 6378163, + rf: 298.24, + ellipseName: "Kaula 1961" +}; +q.lerch = { + a: 6378139, + rf: 298.257, + ellipseName: "Lerch 1979" +}; +q.mprts = { + a: 6397300, + rf: 191, + ellipseName: "Maupertius 1738" +}; +q.new_intl = { + a: 63781575e-1, + b: 63567722e-1, + ellipseName: "New International 1967" +}; +q.plessis = { + a: 6376523, + rf: 6355863, + ellipseName: "Plessis 1817 (France)" +}; +q.krass = { + a: 6378245, + rf: 298.3, + ellipseName: "Krassovsky, 1942" +}; +q.SEasia = { + a: 6378155, + b: 63567733205e-4, + ellipseName: "Southeast Asia" +}; +q.walbeck = { + a: 6376896, + b: 63558348467e-4, + ellipseName: "Walbeck" +}; +q.WGS60 = { + a: 6378165, + rf: 298.3, + ellipseName: "WGS 60" +}; +q.WGS66 = { + a: 6378145, + rf: 298.25, + ellipseName: "WGS 66" +}; +q.WGS7 = { + a: 6378135, + rf: 298.26, + ellipseName: "WGS 72" +}; +var _m = q.WGS84 = { + a: 6378137, + rf: 298.257223563, + ellipseName: "WGS 84" +}; +q.sphere = { + a: 6370997, + b: 6370997, + ellipseName: "Normal Sphere (r=6370997)" +}; +function vm(i, t, e, s) { + var r = i * i, n = t * t, a = (r - n) / r, o = 0; + s ? (i *= 1 - a * (Hg + a * (Bg + a * Vg)), r = i * i, a = 0) : o = Math.sqrt(a); + var l = (r - n) / n; + return { + es: a, + e: o, + ep2: l + }; +} +function Sm(i, t, e, s, r) { + if (!i) { + var n = $i(q, s); + n || (n = _m), i = n.a, t = n.b, e = n.rf; + } + return e && !t && (t = (1 - 1 / e) * i), (e === 0 || Math.abs(i - t) < T) && (r = !0, t = i), { + a: i, + b: t, + rf: e, + sphere: r + }; +} +var Ge = {}; +Ge.wgs84 = { + towgs84: "0,0,0", + ellipse: "WGS84", + datumName: "WGS84" +}; +Ge.ch1903 = { + towgs84: "674.374,15.056,405.346", + ellipse: "bessel", + datumName: "swiss" +}; +Ge.ggrs87 = { + towgs84: "-199.87,74.79,246.62", + ellipse: "GRS80", + datumName: "Greek_Geodetic_Reference_System_1987" +}; +Ge.nad83 = { + towgs84: "0,0,0", + ellipse: "GRS80", + datumName: "North_American_Datum_1983" +}; +Ge.nad27 = { + nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", + ellipse: "clrk66", + datumName: "North_American_Datum_1927" +}; +Ge.potsdam = { + towgs84: "598.1,73.7,418.2,0.202,0.045,-2.455,6.7", + ellipse: "bessel", + datumName: "Potsdam Rauenberg 1950 DHDN" +}; +Ge.carthage = { + towgs84: "-263.0,6.0,431.0", + ellipse: "clark80", + datumName: "Carthage 1934 Tunisia" +}; +Ge.hermannskogel = { + towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232", + ellipse: "bessel", + datumName: "Hermannskogel" +}; +Ge.militargeographische_institut = { + towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232", + ellipse: "bessel", + datumName: "Militar-Geographische Institut" +}; +Ge.osni52 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "airy", + datumName: "Irish National" +}; +Ge.ire65 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "mod_airy", + datumName: "Ireland 1965" +}; +Ge.rassadiran = { + towgs84: "-133.63,-157.5,-158.62", + ellipse: "intl", + datumName: "Rassadiran" +}; +Ge.nzgd49 = { + towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", + ellipse: "intl", + datumName: "New Zealand Geodetic Datum 1949" +}; +Ge.osgb36 = { + towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + ellipse: "airy", + datumName: "Airy 1830" +}; +Ge.s_jtsk = { + towgs84: "589,76,480", + ellipse: "bessel", + datumName: "S-JTSK (Ferro)" +}; +Ge.beduaram = { + towgs84: "-106,-87,188", + ellipse: "clrk80", + datumName: "Beduaram" +}; +Ge.gunung_segara = { + towgs84: "-403,684,41", + ellipse: "bessel", + datumName: "Gunung Segara Jakarta" +}; +Ge.rnb72 = { + towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", + ellipse: "intl", + datumName: "Reseau National Belge 1972" +}; +function wm(i, t, e, s, r, n, a) { + var o = {}; + return i === void 0 || i === "none" ? o.datum_type = Yo : o.datum_type = kg, t && (o.datum_params = t.map(parseFloat), (o.datum_params[0] !== 0 || o.datum_params[1] !== 0 || o.datum_params[2] !== 0) && (o.datum_type = ds), o.datum_params.length > 3 && (o.datum_params[3] !== 0 || o.datum_params[4] !== 0 || o.datum_params[5] !== 0 || o.datum_params[6] !== 0) && (o.datum_type = fs, o.datum_params[3] *= Cr, o.datum_params[4] *= Cr, o.datum_params[5] *= Cr, o.datum_params[6] = o.datum_params[6] / 1e6 + 1)), a && (o.datum_type = Fs, o.grids = a), o.a = e, o.b = s, o.es = r, o.ep2 = n, o; +} +var lu = {}; +function Cm(i, t) { + var e = new DataView(t), s = Em(e), r = Om(e, s), n = bm(e, r, s), a = { header: r, subgrids: n }; + return lu[i] = a, a; +} +function Mm(i) { + if (i === void 0) + return null; + var t = i.split(","); + return t.map(xm); +} +function xm(i) { + if (i.length === 0) + return null; + var t = i[0] === "@"; + return t && (i = i.slice(1)), i === "null" ? { name: "null", mandatory: !t, grid: null, isNull: !0 } : { + name: i, + mandatory: !t, + grid: lu[i] || null, + isNull: !1 + }; +} +function Ds(i) { + return i / 3600 * Math.PI / 180; +} +function Em(i) { + var t = i.getInt32(8, !1); + return t === 11 ? !1 : (t = i.getInt32(8, !0), t !== 11 && console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian"), !0); +} +function Om(i, t) { + return { + nFields: i.getInt32(8, t), + nSubgridFields: i.getInt32(24, t), + nSubgrids: i.getInt32(40, t), + shiftType: Zo(i, 56, 64).trim(), + fromSemiMajorAxis: i.getFloat64(120, t), + fromSemiMinorAxis: i.getFloat64(136, t), + toSemiMajorAxis: i.getFloat64(152, t), + toSemiMinorAxis: i.getFloat64(168, t) + }; +} +function Zo(i, t, e) { + return String.fromCharCode.apply(null, new Uint8Array(i.buffer.slice(t, e))); +} +function bm(i, t, e) { + for (var s = 176, r = [], n = 0; n < t.nSubgrids; n++) { + var a = Lm(i, s, e), o = Im(i, s, a, e), l = Math.round( + 1 + (a.upperLongitude - a.lowerLongitude) / a.longitudeInterval + ), c = Math.round( + 1 + (a.upperLatitude - a.lowerLatitude) / a.latitudeInterval + ); + r.push({ + ll: [Ds(a.lowerLongitude), Ds(a.lowerLatitude)], + del: [Ds(a.longitudeInterval), Ds(a.latitudeInterval)], + lim: [l, c], + count: a.gridNodeCount, + cvs: Pm(o) + }), s += 176 + a.gridNodeCount * 16; + } + return r; +} +function Pm(i) { + return i.map(function(t) { + return [Ds(t.longitudeShift), Ds(t.latitudeShift)]; + }); +} +function Lm(i, t, e) { + return { + name: Zo(i, t + 8, t + 16).trim(), + parent: Zo(i, t + 24, t + 24 + 8).trim(), + lowerLatitude: i.getFloat64(t + 72, e), + upperLatitude: i.getFloat64(t + 88, e), + lowerLongitude: i.getFloat64(t + 104, e), + upperLongitude: i.getFloat64(t + 120, e), + latitudeInterval: i.getFloat64(t + 136, e), + longitudeInterval: i.getFloat64(t + 152, e), + gridNodeCount: i.getInt32(t + 168, e) + }; +} +function Im(i, t, e, s) { + for (var r = t + 176, n = 16, a = [], o = 0; o < e.gridNodeCount; o++) { + var l = { + latitudeShift: i.getFloat32(r + o * n, s), + longitudeShift: i.getFloat32(r + o * n + 4, s), + latitudeAccuracy: i.getFloat32(r + o * n + 8, s), + longitudeAccuracy: i.getFloat32(r + o * n + 12, s) + }; + a.push(l); + } + return a; +} +function si(i, t) { + if (!(this instanceof si)) + return new si(i); + t = t || function(c) { + if (c) + throw c; + }; + var e = nm(i); + if (typeof e != "object") { + t("Could not parse to valid json: " + i); + return; + } + var s = si.projections.get(e.projName); + if (!s) { + t("Could not get projection name from: " + i); + return; + } + if (e.datumCode && e.datumCode !== "none") { + var r = $i(Ge, e.datumCode); + r && (e.datum_params = e.datum_params || (r.towgs84 ? r.towgs84.split(",") : null), e.ellps = r.ellipse, e.datumName = r.datumName ? r.datumName : e.datumCode); + } + e.k0 = e.k0 || 1, e.axis = e.axis || "enu", e.ellps = e.ellps || "wgs84", e.lat1 = e.lat1 || e.lat0; + var n = Sm(e.a, e.b, e.rf, e.ellps, e.sphere), a = vm(n.a, n.b, n.rf, e.R_A), o = Mm(e.nadgrids), l = e.datum || wm( + e.datumCode, + e.datum_params, + n.a, + n.b, + a.es, + a.ep2, + o + ); + gh(this, e), gh(this, s), this.a = n.a, this.b = n.b, this.rf = n.rf, this.sphere = n.sphere, this.es = a.es, this.e = a.e, this.ep2 = a.ep2, this.datum = l, this.init(), t(null, this); +} +si.projections = ym; +si.projections.start(); +function Tm(i, t) { + return i.datum_type !== t.datum_type || i.a !== t.a || Math.abs(i.es - t.es) > 5e-11 ? !1 : i.datum_type === ds ? i.datum_params[0] === t.datum_params[0] && i.datum_params[1] === t.datum_params[1] && i.datum_params[2] === t.datum_params[2] : i.datum_type === fs ? i.datum_params[0] === t.datum_params[0] && i.datum_params[1] === t.datum_params[1] && i.datum_params[2] === t.datum_params[2] && i.datum_params[3] === t.datum_params[3] && i.datum_params[4] === t.datum_params[4] && i.datum_params[5] === t.datum_params[5] && i.datum_params[6] === t.datum_params[6] : !0; +} +function hu(i, t, e) { + var s = i.x, r = i.y, n = i.z ? i.z : 0, a, o, l, c; + if (r < -O && r > -1.001 * O) + r = -O; + else if (r > O && r < 1.001 * O) + r = O; + else { + if (r < -O) + return { x: -1 / 0, y: -1 / 0, z: i.z }; + if (r > O) + return { x: 1 / 0, y: 1 / 0, z: i.z }; + } + return s > Math.PI && (s -= 2 * Math.PI), o = Math.sin(r), c = Math.cos(r), l = o * o, a = e / Math.sqrt(1 - t * l), { + x: (a + n) * c * Math.cos(s), + y: (a + n) * c * Math.sin(s), + z: (a * (1 - t) + n) * o + }; +} +function cu(i, t, e, s) { + var r = 1e-12, n = r * r, a = 30, o, l, c, d, u, f, g, m, p, y, v, w, C, x = i.x, E = i.y, I = i.z ? i.z : 0, R, D, X; + if (o = Math.sqrt(x * x + E * E), l = Math.sqrt(x * x + E * E + I * I), o / e < r) { + if (R = 0, l / e < r) + return D = O, X = -s, { + x: i.x, + y: i.y, + z: i.z + }; + } else + R = Math.atan2(E, x); + c = I / l, d = o / l, u = 1 / Math.sqrt(1 - t * (2 - t) * d * d), m = d * (1 - t) * u, p = c * u, C = 0; + do + C++, g = e / Math.sqrt(1 - t * p * p), X = o * m + I * p - g * (1 - t * p * p), f = t * g / (g + X), u = 1 / Math.sqrt(1 - f * (2 - f) * d * d), y = d * (1 - f) * u, v = c * u, w = v * m - y * p, m = y, p = v; + while (w * w > n && C < a); + return D = Math.atan(v / Math.abs(y)), { + x: R, + y: D, + z: X + }; +} +function Am(i, t, e) { + if (t === ds) + return { + x: i.x + e[0], + y: i.y + e[1], + z: i.z + e[2] + }; + if (t === fs) { + var s = e[0], r = e[1], n = e[2], a = e[3], o = e[4], l = e[5], c = e[6]; + return { + x: c * (i.x - l * i.y + o * i.z) + s, + y: c * (l * i.x + i.y - a * i.z) + r, + z: c * (-o * i.x + a * i.y + i.z) + n + }; + } +} +function Dm(i, t, e) { + if (t === ds) + return { + x: i.x - e[0], + y: i.y - e[1], + z: i.z - e[2] + }; + if (t === fs) { + var s = e[0], r = e[1], n = e[2], a = e[3], o = e[4], l = e[5], c = e[6], d = (i.x - s) / c, u = (i.y - r) / c, f = (i.z - n) / c; + return { + x: d + l * u - o * f, + y: -l * d + u + a * f, + z: o * d - a * u + f + }; + } +} +function In(i) { + return i === ds || i === fs; +} +function Nm(i, t, e) { + if (Tm(i, t) || i.datum_type === Yo || t.datum_type === Yo) + return e; + var s = i.a, r = i.es; + if (i.datum_type === Fs) { + var n = ph(i, !1, e); + if (n !== 0) + return; + s = ch, r = uh; + } + var a = t.a, o = t.b, l = t.es; + if (t.datum_type === Fs && (a = ch, o = zg, l = uh), r === l && s === a && !In(i.datum_type) && !In(t.datum_type)) + return e; + if (e = hu(e, r, s), In(i.datum_type) && (e = Am(e, i.datum_type, i.datum_params)), In(t.datum_type) && (e = Dm(e, t.datum_type, t.datum_params)), e = cu(e, l, a, o), t.datum_type === Fs) { + var c = ph(t, !0, e); + if (c !== 0) + return; + } + return e; +} +function ph(i, t, e) { + if (i.grids === null || i.grids.length === 0) + return console.log("Grid shift grids not found"), -1; + var s = { x: -e.x, y: e.y }, r = { x: Number.NaN, y: Number.NaN }, n = []; + e: + for (var a = 0; a < i.grids.length; a++) { + var o = i.grids[a]; + if (n.push(o.name), o.isNull) { + r = s; + break; + } + if (o.mandatory, o.grid === null) { + if (o.mandatory) + return console.log("Unable to find mandatory grid '" + o.name + "'"), -1; + continue; + } + for (var l = o.grid.subgrids, c = 0, d = l.length; c < d; c++) { + var u = l[c], f = (Math.abs(u.del[1]) + Math.abs(u.del[0])) / 1e4, g = u.ll[0] - f, m = u.ll[1] - f, p = u.ll[0] + (u.lim[0] - 1) * u.del[0] + f, y = u.ll[1] + (u.lim[1] - 1) * u.del[1] + f; + if (!(m > s.y || g > s.x || y < s.y || p < s.x) && (r = Rm(s, t, u), !isNaN(r.x))) + break e; + } + } + return isNaN(r.x) ? (console.log("Failed to find a grid shift table for location '" + -s.x * ii + " " + s.y * ii + " tried: '" + n + "'"), -1) : (e.x = -r.x, e.y = r.y, 0); +} +function Rm(i, t, e) { + var s = { x: Number.NaN, y: Number.NaN }; + if (isNaN(i.x)) + return s; + var r = { x: i.x, y: i.y }; + r.x -= e.ll[0], r.y -= e.ll[1], r.x = A(r.x - Math.PI) + Math.PI; + var n = yh(r, e); + if (t) { + if (isNaN(n.x)) + return s; + n.x = r.x - n.x, n.y = r.y - n.y; + var a = 9, o = 1e-12, l, c; + do { + if (c = yh(n, e), isNaN(c.x)) { + console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation."); + break; + } + l = { x: r.x - (c.x + n.x), y: r.y - (c.y + n.y) }, n.x += l.x, n.y += l.y; + } while (a-- && Math.abs(l.x) > o && Math.abs(l.y) > o); + if (a < 0) + return console.log("Inverse grid shift iterator failed to converge."), s; + s.x = A(n.x + e.ll[0]), s.y = n.y + e.ll[1]; + } else + isNaN(n.x) || (s.x = i.x + n.x, s.y = i.y + n.y); + return s; +} +function yh(i, t) { + var e = { x: i.x / t.del[0], y: i.y / t.del[1] }, s = { x: Math.floor(e.x), y: Math.floor(e.y) }, r = { x: e.x - 1 * s.x, y: e.y - 1 * s.y }, n = { x: Number.NaN, y: Number.NaN }, a; + if (s.x < 0 || s.x >= t.lim[0] || s.y < 0 || s.y >= t.lim[1]) + return n; + a = s.y * t.lim[0] + s.x; + var o = { x: t.cvs[a][0], y: t.cvs[a][1] }; + a++; + var l = { x: t.cvs[a][0], y: t.cvs[a][1] }; + a += t.lim[0]; + var c = { x: t.cvs[a][0], y: t.cvs[a][1] }; + a--; + var d = { x: t.cvs[a][0], y: t.cvs[a][1] }, u = r.x * r.y, f = r.x * (1 - r.y), g = (1 - r.x) * (1 - r.y), m = (1 - r.x) * r.y; + return n.x = g * o.x + f * l.x + m * d.x + u * c.x, n.y = g * o.y + f * l.y + m * d.y + u * c.y, n; +} +function _h(i, t, e) { + var s = e.x, r = e.y, n = e.z || 0, a, o, l, c = {}; + for (l = 0; l < 3; l++) + if (!(t && l === 2 && e.z === void 0)) + switch (l === 0 ? (a = s, "ew".indexOf(i.axis[l]) !== -1 ? o = "x" : o = "y") : l === 1 ? (a = r, "ns".indexOf(i.axis[l]) !== -1 ? o = "y" : o = "x") : (a = n, o = "z"), i.axis[l]) { + case "e": + c[o] = a; + break; + case "w": + c[o] = -a; + break; + case "n": + c[o] = a; + break; + case "s": + c[o] = -a; + break; + case "u": + e[o] !== void 0 && (c.z = a); + break; + case "d": + e[o] !== void 0 && (c.z = -a); + break; + default: + return null; + } + return c; +} +function uu(i) { + var t = { + x: i[0], + y: i[1] + }; + return i.length > 2 && (t.z = i[2]), i.length > 3 && (t.m = i[3]), t; +} +function Fm(i) { + vh(i.x), vh(i.y); +} +function vh(i) { + if (typeof Number.isFinite == "function") { + if (Number.isFinite(i)) + return; + throw new TypeError("coordinates must be finite numbers"); + } + if (typeof i != "number" || i !== i || !isFinite(i)) + throw new TypeError("coordinates must be finite numbers"); +} +function Gm(i, t) { + return (i.datum.datum_type === ds || i.datum.datum_type === fs || i.datum.datum_type === Fs) && t.datumCode !== "WGS84" || (t.datum.datum_type === ds || t.datum.datum_type === fs || t.datum.datum_type === Fs) && i.datumCode !== "WGS84"; +} +function ha(i, t, e, s) { + var r; + Array.isArray(e) ? e = uu(e) : e = { + x: e.x, + y: e.y, + z: e.z, + m: e.m + }; + var n = e.z !== void 0; + if (Fm(e), i.datum && t.datum && Gm(i, t) && (r = new si("WGS84"), e = ha(i, r, e, s), i = r), s && i.axis !== "enu" && (e = _h(i, !1, e)), i.projName === "longlat") + e = { + x: e.x * Ue, + y: e.y * Ue, + z: e.z || 0 + }; + else if (i.to_meter && (e = { + x: e.x * i.to_meter, + y: e.y * i.to_meter, + z: e.z || 0 + }), e = i.inverse(e), !e) + return; + if (i.from_greenwich && (e.x += i.from_greenwich), e = Nm(i.datum, t.datum, e), !!e) + return t.from_greenwich && (e = { + x: e.x - t.from_greenwich, + y: e.y, + z: e.z || 0 + }), t.projName === "longlat" ? e = { + x: e.x * ii, + y: e.y * ii, + z: e.z || 0 + } : (e = t.forward(e), t.to_meter && (e = { + x: e.x / t.to_meter, + y: e.y / t.to_meter, + z: e.z || 0 + })), s && t.axis !== "enu" ? _h(t, !0, e) : (e && !n && delete e.z, e); +} +var Sh = si("WGS84"); +function ro(i, t, e, s) { + var r, n, a; + return Array.isArray(e) ? (r = ha(i, t, e, s) || { x: NaN, y: NaN }, e.length > 2 ? typeof i.name < "u" && i.name === "geocent" || typeof t.name < "u" && t.name === "geocent" ? typeof r.z == "number" ? [r.x, r.y, r.z].concat(e.slice(3)) : [r.x, r.y, e[2]].concat(e.slice(3)) : [r.x, r.y].concat(e.slice(2)) : [r.x, r.y]) : (n = ha(i, t, e, s), a = Object.keys(e), a.length === 2 || a.forEach(function(o) { + if (typeof i.name < "u" && i.name === "geocent" || typeof t.name < "u" && t.name === "geocent") { + if (o === "x" || o === "y" || o === "z") + return; + } else if (o === "x" || o === "y") + return; + n[o] = e[o]; + }), n); +} +function wh(i) { + return i instanceof si ? i : i.oProj ? i.oProj : si(i); +} +function Re(i, t, e) { + i = wh(i); + var s = !1, r; + return typeof t > "u" ? (t = i, i = Sh, s = !0) : (typeof t.x < "u" || Array.isArray(t)) && (e = t, t = i, i = Sh, s = !0), t = wh(t), e ? ro(i, t, e) : (r = { + forward: function(n, a) { + return ro(i, t, n, a); + }, + inverse: function(n, a) { + return ro(t, i, n, a); + } + }, s && (r.oProj = t), r); +} +var Ch = 6, du = "AJSAJS", fu = "AFAFAF", Ns = 65, ft = 73, Rt = 79, ur = 86, dr = 90; +const km = { + forward: gu, + inverse: zm, + toPoint: mu +}; +function gu(i, t) { + return t = t || 5, Vm(Hm({ + lat: i[1], + lon: i[0] + }), t); +} +function zm(i) { + var t = wl(yu(i.toUpperCase())); + return t.lat && t.lon ? [t.lon, t.lat, t.lon, t.lat] : [t.left, t.bottom, t.right, t.top]; +} +function mu(i) { + var t = wl(yu(i.toUpperCase())); + return t.lat && t.lon ? [t.lon, t.lat] : [(t.left + t.right) / 2, (t.top + t.bottom) / 2]; +} +function no(i) { + return i * (Math.PI / 180); +} +function Mh(i) { + return 180 * (i / Math.PI); +} +function Hm(i) { + var t = i.lat, e = i.lon, s = 6378137, r = 669438e-8, n = 0.9996, a, o, l, c, d, u, f, g = no(t), m = no(e), p, y; + y = Math.floor((e + 180) / 6) + 1, e === 180 && (y = 60), t >= 56 && t < 64 && e >= 3 && e < 12 && (y = 32), t >= 72 && t < 84 && (e >= 0 && e < 9 ? y = 31 : e >= 9 && e < 21 ? y = 33 : e >= 21 && e < 33 ? y = 35 : e >= 33 && e < 42 && (y = 37)), a = (y - 1) * 6 - 180 + 3, p = no(a), o = r / (1 - r), l = s / Math.sqrt(1 - r * Math.sin(g) * Math.sin(g)), c = Math.tan(g) * Math.tan(g), d = o * Math.cos(g) * Math.cos(g), u = Math.cos(g) * (m - p), f = s * ((1 - r / 4 - 3 * r * r / 64 - 5 * r * r * r / 256) * g - (3 * r / 8 + 3 * r * r / 32 + 45 * r * r * r / 1024) * Math.sin(2 * g) + (15 * r * r / 256 + 45 * r * r * r / 1024) * Math.sin(4 * g) - 35 * r * r * r / 3072 * Math.sin(6 * g)); + var v = n * l * (u + (1 - c + d) * u * u * u / 6 + (5 - 18 * c + c * c + 72 * d - 58 * o) * u * u * u * u * u / 120) + 5e5, w = n * (f + l * Math.tan(g) * (u * u / 2 + (5 - c + 9 * d + 4 * d * d) * u * u * u * u / 24 + (61 - 58 * c + c * c + 600 * d - 330 * o) * u * u * u * u * u * u / 720)); + return t < 0 && (w += 1e7), { + northing: Math.round(w), + easting: Math.round(v), + zoneNumber: y, + zoneLetter: Bm(t) + }; +} +function wl(i) { + var t = i.northing, e = i.easting, s = i.zoneLetter, r = i.zoneNumber; + if (r < 0 || r > 60) + return null; + var n = 0.9996, a = 6378137, o = 669438e-8, l, c = (1 - Math.sqrt(1 - o)) / (1 + Math.sqrt(1 - o)), d, u, f, g, m, p, y, v, w, C = e - 5e5, x = t; + s < "N" && (x -= 1e7), y = (r - 1) * 6 - 180 + 3, l = o / (1 - o), p = x / n, v = p / (a * (1 - o / 4 - 3 * o * o / 64 - 5 * o * o * o / 256)), w = v + (3 * c / 2 - 27 * c * c * c / 32) * Math.sin(2 * v) + (21 * c * c / 16 - 55 * c * c * c * c / 32) * Math.sin(4 * v) + 151 * c * c * c / 96 * Math.sin(6 * v), d = a / Math.sqrt(1 - o * Math.sin(w) * Math.sin(w)), u = Math.tan(w) * Math.tan(w), f = l * Math.cos(w) * Math.cos(w), g = a * (1 - o) / Math.pow(1 - o * Math.sin(w) * Math.sin(w), 1.5), m = C / (d * n); + var E = w - d * Math.tan(w) / g * (m * m / 2 - (5 + 3 * u + 10 * f - 4 * f * f - 9 * l) * m * m * m * m / 24 + (61 + 90 * u + 298 * f + 45 * u * u - 252 * l - 3 * f * f) * m * m * m * m * m * m / 720); + E = Mh(E); + var I = (m - (1 + 2 * u + f) * m * m * m / 6 + (5 - 2 * f + 28 * u - 3 * f * f + 8 * l + 24 * u * u) * m * m * m * m * m / 120) / Math.cos(w); + I = y + Mh(I); + var R; + if (i.accuracy) { + var D = wl({ + northing: i.northing + i.accuracy, + easting: i.easting + i.accuracy, + zoneLetter: i.zoneLetter, + zoneNumber: i.zoneNumber + }); + R = { + top: D.lat, + right: D.lon, + bottom: E, + left: I + }; + } else + R = { + lat: E, + lon: I + }; + return R; +} +function Bm(i) { + var t = "Z"; + return 84 >= i && i >= 72 ? t = "X" : 72 > i && i >= 64 ? t = "W" : 64 > i && i >= 56 ? t = "V" : 56 > i && i >= 48 ? t = "U" : 48 > i && i >= 40 ? t = "T" : 40 > i && i >= 32 ? t = "S" : 32 > i && i >= 24 ? t = "R" : 24 > i && i >= 16 ? t = "Q" : 16 > i && i >= 8 ? t = "P" : 8 > i && i >= 0 ? t = "N" : 0 > i && i >= -8 ? t = "M" : -8 > i && i >= -16 ? t = "L" : -16 > i && i >= -24 ? t = "K" : -24 > i && i >= -32 ? t = "J" : -32 > i && i >= -40 ? t = "H" : -40 > i && i >= -48 ? t = "G" : -48 > i && i >= -56 ? t = "F" : -56 > i && i >= -64 ? t = "E" : -64 > i && i >= -72 ? t = "D" : -72 > i && i >= -80 && (t = "C"), t; +} +function Vm(i, t) { + var e = "00000" + i.easting, s = "00000" + i.northing; + return i.zoneNumber + i.zoneLetter + jm(i.easting, i.northing, i.zoneNumber) + e.substr(e.length - 5, t) + s.substr(s.length - 5, t); +} +function jm(i, t, e) { + var s = pu(e), r = Math.floor(i / 1e5), n = Math.floor(t / 1e5) % 20; + return $m(r, n, s); +} +function pu(i) { + var t = i % Ch; + return t === 0 && (t = Ch), t; +} +function $m(i, t, e) { + var s = e - 1, r = du.charCodeAt(s), n = fu.charCodeAt(s), a = r + i - 1, o = n + t, l = !1; + a > dr && (a = a - dr + Ns - 1, l = !0), (a === ft || r < ft && a > ft || (a > ft || r < ft) && l) && a++, (a === Rt || r < Rt && a > Rt || (a > Rt || r < Rt) && l) && (a++, a === ft && a++), a > dr && (a = a - dr + Ns - 1), o > ur ? (o = o - ur + Ns - 1, l = !0) : l = !1, (o === ft || n < ft && o > ft || (o > ft || n < ft) && l) && o++, (o === Rt || n < Rt && o > Rt || (o > Rt || n < Rt) && l) && (o++, o === ft && o++), o > ur && (o = o - ur + Ns - 1); + var c = String.fromCharCode(a) + String.fromCharCode(o); + return c; +} +function yu(i) { + if (i && i.length === 0) + throw "MGRSPoint coverting from nothing"; + for (var t = i.length, e = null, s = "", r, n = 0; !/[A-Z]/.test(r = i.charAt(n)); ) { + if (n >= 2) + throw "MGRSPoint bad conversion from: " + i; + s += r, n++; + } + var a = parseInt(s, 10); + if (n === 0 || n + 3 > t) + throw "MGRSPoint bad conversion from: " + i; + var o = i.charAt(n++); + if (o <= "A" || o === "B" || o === "Y" || o >= "Z" || o === "I" || o === "O") + throw "MGRSPoint zone letter " + o + " not handled: " + i; + e = i.substring(n, n += 2); + for (var l = pu(a), c = qm(e.charAt(0), l), d = Um(e.charAt(1), l); d < Wm(o); ) + d += 2e6; + var u = t - n; + if (u % 2 !== 0) + throw `MGRSPoint has to have an even number +of digits after the zone letter and two 100km letters - front +half for easting meters, second half for +northing meters` + i; + var f = u / 2, g = 0, m = 0, p, y, v, w, C; + return f > 0 && (p = 1e5 / Math.pow(10, f), y = i.substring(n, n + f), g = parseFloat(y) * p, v = i.substring(n + f), m = parseFloat(v) * p), w = g + c, C = m + d, { + easting: w, + northing: C, + zoneLetter: o, + zoneNumber: a, + accuracy: p + }; +} +function qm(i, t) { + for (var e = du.charCodeAt(t - 1), s = 1e5, r = !1; e !== i.charCodeAt(0); ) { + if (e++, e === ft && e++, e === Rt && e++, e > dr) { + if (r) + throw "Bad character: " + i; + e = Ns, r = !0; + } + s += 1e5; + } + return s; +} +function Um(i, t) { + if (i > "V") + throw "MGRSPoint given invalid Northing " + i; + for (var e = fu.charCodeAt(t - 1), s = 0, r = !1; e !== i.charCodeAt(0); ) { + if (e++, e === ft && e++, e === Rt && e++, e > ur) { + if (r) + throw "Bad character: " + i; + e = Ns, r = !0; + } + s += 1e5; + } + return s; +} +function Wm(i) { + var t; + switch (i) { + case "C": + t = 11e5; + break; + case "D": + t = 2e6; + break; + case "E": + t = 28e5; + break; + case "F": + t = 37e5; + break; + case "G": + t = 46e5; + break; + case "H": + t = 55e5; + break; + case "J": + t = 64e5; + break; + case "K": + t = 73e5; + break; + case "L": + t = 82e5; + break; + case "M": + t = 91e5; + break; + case "N": + t = 0; + break; + case "P": + t = 8e5; + break; + case "Q": + t = 17e5; + break; + case "R": + t = 26e5; + break; + case "S": + t = 35e5; + break; + case "T": + t = 44e5; + break; + case "U": + t = 53e5; + break; + case "V": + t = 62e5; + break; + case "W": + t = 7e6; + break; + case "X": + t = 79e5; + break; + default: + t = -1; + } + if (t >= 0) + return t; + throw "Invalid zone letter: " + i; +} +function Bs(i, t, e) { + if (!(this instanceof Bs)) + return new Bs(i, t, e); + if (Array.isArray(i)) + this.x = i[0], this.y = i[1], this.z = i[2] || 0; + else if (typeof i == "object") + this.x = i.x, this.y = i.y, this.z = i.z || 0; + else if (typeof i == "string" && typeof t > "u") { + var s = i.split(","); + this.x = parseFloat(s[0], 10), this.y = parseFloat(s[1], 10), this.z = parseFloat(s[2], 10) || 0; + } else + this.x = i, this.y = t, this.z = e || 0; + console.warn("proj4.Point will be removed in version 3, use proj4.toPoint"); +} +Bs.fromMGRS = function(i) { + return new Bs(mu(i)); +}; +Bs.prototype.toMGRS = function(i) { + return gu([this.x, this.y], i); +}; +var Ym = 1, Xm = 0.25, xh = 0.046875, Eh = 0.01953125, Oh = 0.01068115234375, Zm = 0.75, Jm = 0.46875, Km = 0.013020833333333334, Qm = 0.007120768229166667, ep = 0.3645833333333333, tp = 0.005696614583333333, ip = 0.3076171875; +function Cl(i) { + var t = []; + t[0] = Ym - i * (Xm + i * (xh + i * (Eh + i * Oh))), t[1] = i * (Zm - i * (xh + i * (Eh + i * Oh))); + var e = i * i; + return t[2] = e * (Jm - i * (Km + i * Qm)), e *= i, t[3] = e * (ep - i * tp), t[4] = e * i * ip, t; +} +function Zs(i, t, e, s) { + return e *= t, t *= t, s[0] * i - e * (s[1] + t * (s[2] + t * (s[3] + t * s[4]))); +} +var sp = 20; +function Ml(i, t, e) { + for (var s = 1 / (1 - t), r = i, n = sp; n; --n) { + var a = Math.sin(r), o = 1 - t * a * a; + if (o = (Zs(r, a, Math.cos(r), e) - i) * (o * Math.sqrt(o)) * s, r -= o, Math.abs(o) < T) + return r; + } + return r; +} +function rp() { + this.x0 = this.x0 !== void 0 ? this.x0 : 0, this.y0 = this.y0 !== void 0 ? this.y0 : 0, this.long0 = this.long0 !== void 0 ? this.long0 : 0, this.lat0 = this.lat0 !== void 0 ? this.lat0 : 0, this.es && (this.en = Cl(this.es), this.ml0 = Zs(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en)); +} +function np(i) { + var t = i.x, e = i.y, s = A(t - this.long0), r, n, a, o = Math.sin(e), l = Math.cos(e); + if (this.es) { + var d = l * s, u = Math.pow(d, 2), f = this.ep2 * Math.pow(l, 2), g = Math.pow(f, 2), m = Math.abs(l) > T ? Math.tan(e) : 0, p = Math.pow(m, 2), y = Math.pow(p, 2); + r = 1 - this.es * Math.pow(o, 2), d = d / Math.sqrt(r); + var v = Zs(e, o, l, this.en); + n = this.a * (this.k0 * d * (1 + u / 6 * (1 - p + f + u / 20 * (5 - 18 * p + y + 14 * f - 58 * p * f + u / 42 * (61 + 179 * y - y * p - 479 * p))))) + this.x0, a = this.a * (this.k0 * (v - this.ml0 + o * s * d / 2 * (1 + u / 12 * (5 - p + 9 * f + 4 * g + u / 30 * (61 + y - 58 * p + 270 * f - 330 * p * f + u / 56 * (1385 + 543 * y - y * p - 3111 * p)))))) + this.y0; + } else { + var c = l * Math.sin(s); + if (Math.abs(Math.abs(c) - 1) < T) + return 93; + if (n = 0.5 * this.a * this.k0 * Math.log((1 + c) / (1 - c)) + this.x0, a = l * Math.cos(s) / Math.sqrt(1 - Math.pow(c, 2)), c = Math.abs(a), c >= 1) { + if (c - 1 > T) + return 93; + a = 0; + } else + a = Math.acos(a); + e < 0 && (a = -a), a = this.a * this.k0 * (a - this.lat0) + this.y0; + } + return i.x = n, i.y = a, i; +} +function ap(i) { + var t, e, s, r, n = (i.x - this.x0) * (1 / this.a), a = (i.y - this.y0) * (1 / this.a); + if (this.es) + if (t = this.ml0 + a / this.k0, e = Ml(t, this.es, this.en), Math.abs(e) < O) { + var u = Math.sin(e), f = Math.cos(e), g = Math.abs(f) > T ? Math.tan(e) : 0, m = this.ep2 * Math.pow(f, 2), p = Math.pow(m, 2), y = Math.pow(g, 2), v = Math.pow(y, 2); + t = 1 - this.es * Math.pow(u, 2); + var w = n * Math.sqrt(t) / this.k0, C = Math.pow(w, 2); + t = t * g, s = e - t * C / (1 - this.es) * 0.5 * (1 - C / 12 * (5 + 3 * y - 9 * m * y + m - 4 * p - C / 30 * (61 + 90 * y - 252 * m * y + 45 * v + 46 * m - C / 56 * (1385 + 3633 * y + 4095 * v + 1574 * v * y)))), r = A(this.long0 + w * (1 - C / 6 * (1 + 2 * y + m - C / 20 * (5 + 28 * y + 24 * v + 8 * m * y + 6 * m - C / 42 * (61 + 662 * y + 1320 * v + 720 * v * y)))) / f); + } else + s = O * ln(a), r = 0; + else { + var o = Math.exp(n / this.k0), l = 0.5 * (o - 1 / o), c = this.lat0 + a / this.k0, d = Math.cos(c); + t = Math.sqrt((1 - Math.pow(d, 2)) / (1 + Math.pow(l, 2))), s = Math.asin(t), a < 0 && (s = -s), l === 0 && d === 0 ? r = 0 : r = A(Math.atan2(l, d) + this.long0); + } + return i.x = r, i.y = s, i; +} +var op = ["Fast_Transverse_Mercator", "Fast Transverse Mercator"]; +const Un = { + init: rp, + forward: np, + inverse: ap, + names: op +}; +function _u(i) { + var t = Math.exp(i); + return t = (t - 1 / t) / 2, t; +} +function pt(i, t) { + i = Math.abs(i), t = Math.abs(t); + var e = Math.max(i, t), s = Math.min(i, t) / (e || 1); + return e * Math.sqrt(1 + Math.pow(s, 2)); +} +function lp(i) { + var t = 1 + i, e = t - 1; + return e === 0 ? i : i * Math.log(t) / e; +} +function hp(i) { + var t = Math.abs(i); + return t = lp(t * (1 + t / (pt(1, t) + 1))), i < 0 ? -t : t; +} +function xl(i, t) { + for (var e = 2 * Math.cos(2 * t), s = i.length - 1, r = i[s], n = 0, a; --s >= 0; ) + a = -n + e * r + i[s], n = r, r = a; + return t + a * Math.sin(2 * t); +} +function cp(i, t) { + for (var e = 2 * Math.cos(t), s = i.length - 1, r = i[s], n = 0, a; --s >= 0; ) + a = -n + e * r + i[s], n = r, r = a; + return Math.sin(t) * a; +} +function up(i) { + var t = Math.exp(i); + return t = (t + 1 / t) / 2, t; +} +function vu(i, t, e) { + for (var s = Math.sin(t), r = Math.cos(t), n = _u(e), a = up(e), o = 2 * r * a, l = -2 * s * n, c = i.length - 1, d = i[c], u = 0, f = 0, g = 0, m, p; --c >= 0; ) + m = f, p = u, f = d, u = g, d = -m + o * f - l * u + i[c], g = -p + l * f + o * u; + return o = s * a, l = r * n, [o * d - l * g, o * g + l * d]; +} +function dp() { + if (!this.approx && (isNaN(this.es) || this.es <= 0)) + throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.'); + this.approx && (Un.init.apply(this), this.forward = Un.forward, this.inverse = Un.inverse), this.x0 = this.x0 !== void 0 ? this.x0 : 0, this.y0 = this.y0 !== void 0 ? this.y0 : 0, this.long0 = this.long0 !== void 0 ? this.long0 : 0, this.lat0 = this.lat0 !== void 0 ? this.lat0 : 0, this.cgb = [], this.cbg = [], this.utg = [], this.gtu = []; + var i = this.es / (1 + Math.sqrt(1 - this.es)), t = i / (2 - i), e = t; + this.cgb[0] = t * (2 + t * (-2 / 3 + t * (-2 + t * (116 / 45 + t * (26 / 45 + t * (-2854 / 675)))))), this.cbg[0] = t * (-2 + t * (2 / 3 + t * (4 / 3 + t * (-82 / 45 + t * (32 / 45 + t * (4642 / 4725)))))), e = e * t, this.cgb[1] = e * (7 / 3 + t * (-8 / 5 + t * (-227 / 45 + t * (2704 / 315 + t * (2323 / 945))))), this.cbg[1] = e * (5 / 3 + t * (-16 / 15 + t * (-13 / 9 + t * (904 / 315 + t * (-1522 / 945))))), e = e * t, this.cgb[2] = e * (56 / 15 + t * (-136 / 35 + t * (-1262 / 105 + t * (73814 / 2835)))), this.cbg[2] = e * (-26 / 15 + t * (34 / 21 + t * (8 / 5 + t * (-12686 / 2835)))), e = e * t, this.cgb[3] = e * (4279 / 630 + t * (-332 / 35 + t * (-399572 / 14175))), this.cbg[3] = e * (1237 / 630 + t * (-12 / 5 + t * (-24832 / 14175))), e = e * t, this.cgb[4] = e * (4174 / 315 + t * (-144838 / 6237)), this.cbg[4] = e * (-734 / 315 + t * (109598 / 31185)), e = e * t, this.cgb[5] = e * (601676 / 22275), this.cbg[5] = e * (444337 / 155925), e = Math.pow(t, 2), this.Qn = this.k0 / (1 + t) * (1 + e * (1 / 4 + e * (1 / 64 + e / 256))), this.utg[0] = t * (-0.5 + t * (2 / 3 + t * (-37 / 96 + t * (1 / 360 + t * (81 / 512 + t * (-96199 / 604800)))))), this.gtu[0] = t * (0.5 + t * (-2 / 3 + t * (5 / 16 + t * (41 / 180 + t * (-127 / 288 + t * (7891 / 37800)))))), this.utg[1] = e * (-1 / 48 + t * (-1 / 15 + t * (437 / 1440 + t * (-46 / 105 + t * (1118711 / 3870720))))), this.gtu[1] = e * (13 / 48 + t * (-3 / 5 + t * (557 / 1440 + t * (281 / 630 + t * (-1983433 / 1935360))))), e = e * t, this.utg[2] = e * (-17 / 480 + t * (37 / 840 + t * (209 / 4480 + t * (-5569 / 90720)))), this.gtu[2] = e * (61 / 240 + t * (-103 / 140 + t * (15061 / 26880 + t * (167603 / 181440)))), e = e * t, this.utg[3] = e * (-4397 / 161280 + t * (11 / 504 + t * (830251 / 7257600))), this.gtu[3] = e * (49561 / 161280 + t * (-179 / 168 + t * (6601661 / 7257600))), e = e * t, this.utg[4] = e * (-4583 / 161280 + t * (108847 / 3991680)), this.gtu[4] = e * (34729 / 80640 + t * (-3418889 / 1995840)), e = e * t, this.utg[5] = e * (-20648693 / 638668800), this.gtu[5] = e * (212378941 / 319334400); + var s = xl(this.cbg, this.lat0); + this.Zb = -this.Qn * (s + cp(this.gtu, 2 * s)); +} +function fp(i) { + var t = A(i.x - this.long0), e = i.y; + e = xl(this.cbg, e); + var s = Math.sin(e), r = Math.cos(e), n = Math.sin(t), a = Math.cos(t); + e = Math.atan2(s, a * r), t = Math.atan2(n * r, pt(s, r * a)), t = hp(Math.tan(t)); + var o = vu(this.gtu, 2 * e, 2 * t); + e = e + o[0], t = t + o[1]; + var l, c; + return Math.abs(t) <= 2.623395162778 ? (l = this.a * (this.Qn * t) + this.x0, c = this.a * (this.Qn * e + this.Zb) + this.y0) : (l = 1 / 0, c = 1 / 0), i.x = l, i.y = c, i; +} +function gp(i) { + var t = (i.x - this.x0) * (1 / this.a), e = (i.y - this.y0) * (1 / this.a); + e = (e - this.Zb) / this.Qn, t = t / this.Qn; + var s, r; + if (Math.abs(t) <= 2.623395162778) { + var n = vu(this.utg, 2 * e, 2 * t); + e = e + n[0], t = t + n[1], t = Math.atan(_u(t)); + var a = Math.sin(e), o = Math.cos(e), l = Math.sin(t), c = Math.cos(t); + e = Math.atan2(a * c, pt(l, c * o)), t = Math.atan2(l, c * o), s = A(t + this.long0), r = xl(this.cgb, e); + } else + s = 1 / 0, r = 1 / 0; + return i.x = s, i.y = r, i; +} +var mp = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc", "Transverse_Mercator", "Transverse Mercator", "Gauss Kruger", "Gauss_Kruger", "tmerc"]; +const Wn = { + init: dp, + forward: fp, + inverse: gp, + names: mp +}; +function pp(i, t) { + if (i === void 0) { + if (i = Math.floor((A(t) + Math.PI) * 30 / Math.PI) + 1, i < 0) + return 0; + if (i > 60) + return 60; + } + return i; +} +var yp = "etmerc"; +function _p() { + var i = pp(this.zone, this.long0); + if (i === void 0) + throw new Error("unknown utm zone"); + this.lat0 = 0, this.long0 = (6 * Math.abs(i) - 183) * Ue, this.x0 = 5e5, this.y0 = this.utmSouth ? 1e7 : 0, this.k0 = 0.9996, Wn.init.apply(this), this.forward = Wn.forward, this.inverse = Wn.inverse; +} +var vp = ["Universal Transverse Mercator System", "utm"]; +const Sp = { + init: _p, + names: vp, + dependsOn: yp +}; +function El(i, t) { + return Math.pow((1 - i) / (1 + i), t); +} +var wp = 20; +function Cp() { + var i = Math.sin(this.lat0), t = Math.cos(this.lat0); + t *= t, this.rc = Math.sqrt(1 - this.es) / (1 - this.es * i * i), this.C = Math.sqrt(1 + this.es * t * t / (1 - this.es)), this.phic0 = Math.asin(i / this.C), this.ratexp = 0.5 * this.C * this.e, this.K = Math.tan(0.5 * this.phic0 + se) / (Math.pow(Math.tan(0.5 * this.lat0 + se), this.C) * El(this.e * i, this.ratexp)); +} +function Mp(i) { + var t = i.x, e = i.y; + return i.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * e + se), this.C) * El(this.e * Math.sin(e), this.ratexp)) - O, i.x = this.C * t, i; +} +function xp(i) { + for (var t = 1e-14, e = i.x / this.C, s = i.y, r = Math.pow(Math.tan(0.5 * s + se) / this.K, 1 / this.C), n = wp; n > 0 && (s = 2 * Math.atan(r * El(this.e * Math.sin(i.y), -0.5 * this.e)) - O, !(Math.abs(s - i.y) < t)); --n) + i.y = s; + return n ? (i.x = e, i.y = s, i) : null; +} +var Ep = ["gauss"]; +const Ol = { + init: Cp, + forward: Mp, + inverse: xp, + names: Ep +}; +function Op() { + Ol.init.apply(this), this.rc && (this.sinc0 = Math.sin(this.phic0), this.cosc0 = Math.cos(this.phic0), this.R2 = 2 * this.rc, this.title || (this.title = "Oblique Stereographic Alternative")); +} +function bp(i) { + var t, e, s, r; + return i.x = A(i.x - this.long0), Ol.forward.apply(this, [i]), t = Math.sin(i.y), e = Math.cos(i.y), s = Math.cos(i.x), r = this.k0 * this.R2 / (1 + this.sinc0 * t + this.cosc0 * e * s), i.x = r * e * Math.sin(i.x), i.y = r * (this.cosc0 * t - this.sinc0 * e * s), i.x = this.a * i.x + this.x0, i.y = this.a * i.y + this.y0, i; +} +function Pp(i) { + var t, e, s, r, n; + if (i.x = (i.x - this.x0) / this.a, i.y = (i.y - this.y0) / this.a, i.x /= this.k0, i.y /= this.k0, n = pt(i.x, i.y)) { + var a = 2 * Math.atan2(n, this.R2); + t = Math.sin(a), e = Math.cos(a), r = Math.asin(e * this.sinc0 + i.y * t * this.cosc0 / n), s = Math.atan2(i.x * t, n * this.cosc0 * e - i.y * this.sinc0 * t); + } else + r = this.phic0, s = 0; + return i.x = s, i.y = r, Ol.inverse.apply(this, [i]), i.x = A(i.x + this.long0), i; +} +var Lp = ["Stereographic_North_Pole", "Oblique_Stereographic", "sterea", "Oblique Stereographic Alternative", "Double_Stereographic"]; +const Ip = { + init: Op, + forward: bp, + inverse: Pp, + names: Lp +}; +function Tp(i, t, e) { + return t *= e, Math.tan(0.5 * (O + i)) * Math.pow((1 - t) / (1 + t), 0.5 * e); +} +function Ap() { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.lat0 = this.lat0 || 0, this.long0 = this.long0 || 0, this.coslat0 = Math.cos(this.lat0), this.sinlat0 = Math.sin(this.lat0), this.sphere ? this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= T && (this.k0 = 0.5 * (1 + ln(this.lat0) * Math.sin(this.lat_ts))) : (Math.abs(this.coslat0) <= T && (this.lat0 > 0 ? this.con = 1 : this.con = -1), this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)), this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= T && Math.abs(Math.cos(this.lat_ts)) > T && (this.k0 = 0.5 * this.cons * ai(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / Vt(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts))), this.ms1 = ai(this.e, this.sinlat0, this.coslat0), this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - O, this.cosX0 = Math.cos(this.X0), this.sinX0 = Math.sin(this.X0)); +} +function Dp(i) { + var t = i.x, e = i.y, s = Math.sin(e), r = Math.cos(e), n, a, o, l, c, d, u = A(t - this.long0); + return Math.abs(Math.abs(t - this.long0) - Math.PI) <= T && Math.abs(e + this.lat0) <= T ? (i.x = NaN, i.y = NaN, i) : this.sphere ? (n = 2 * this.k0 / (1 + this.sinlat0 * s + this.coslat0 * r * Math.cos(u)), i.x = this.a * n * r * Math.sin(u) + this.x0, i.y = this.a * n * (this.coslat0 * s - this.sinlat0 * r * Math.cos(u)) + this.y0, i) : (a = 2 * Math.atan(this.ssfn_(e, s, this.e)) - O, l = Math.cos(a), o = Math.sin(a), Math.abs(this.coslat0) <= T ? (c = Vt(this.e, e * this.con, this.con * s), d = 2 * this.a * this.k0 * c / this.cons, i.x = this.x0 + d * Math.sin(t - this.long0), i.y = this.y0 - this.con * d * Math.cos(t - this.long0), i) : (Math.abs(this.sinlat0) < T ? (n = 2 * this.a * this.k0 / (1 + l * Math.cos(u)), i.y = n * o) : (n = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * o + this.cosX0 * l * Math.cos(u))), i.y = n * (this.cosX0 * o - this.sinX0 * l * Math.cos(u)) + this.y0), i.x = n * l * Math.sin(u) + this.x0, i)); +} +function Np(i) { + i.x -= this.x0, i.y -= this.y0; + var t, e, s, r, n, a = Math.sqrt(i.x * i.x + i.y * i.y); + if (this.sphere) { + var o = 2 * Math.atan(a / (2 * this.a * this.k0)); + return t = this.long0, e = this.lat0, a <= T ? (i.x = t, i.y = e, i) : (e = Math.asin(Math.cos(o) * this.sinlat0 + i.y * Math.sin(o) * this.coslat0 / a), Math.abs(this.coslat0) < T ? this.lat0 > 0 ? t = A(this.long0 + Math.atan2(i.x, -1 * i.y)) : t = A(this.long0 + Math.atan2(i.x, i.y)) : t = A(this.long0 + Math.atan2(i.x * Math.sin(o), a * this.coslat0 * Math.cos(o) - i.y * this.sinlat0 * Math.sin(o))), i.x = t, i.y = e, i); + } else if (Math.abs(this.coslat0) <= T) { + if (a <= T) + return e = this.lat0, t = this.long0, i.x = t, i.y = e, i; + i.x *= this.con, i.y *= this.con, s = a * this.cons / (2 * this.a * this.k0), e = this.con * zr(this.e, s), t = this.con * A(this.con * this.long0 + Math.atan2(i.x, -1 * i.y)); + } else + r = 2 * Math.atan(a * this.cosX0 / (2 * this.a * this.k0 * this.ms1)), t = this.long0, a <= T ? n = this.X0 : (n = Math.asin(Math.cos(r) * this.sinX0 + i.y * Math.sin(r) * this.cosX0 / a), t = A(this.long0 + Math.atan2(i.x * Math.sin(r), a * this.cosX0 * Math.cos(r) - i.y * this.sinX0 * Math.sin(r)))), e = -1 * zr(this.e, Math.tan(0.5 * (O + n))); + return i.x = t, i.y = e, i; +} +var Rp = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)", "Polar_Stereographic"]; +const Fp = { + init: Ap, + forward: Dp, + inverse: Np, + names: Rp, + ssfn_: Tp +}; +function Gp() { + var i = this.lat0; + this.lambda0 = this.long0; + var t = Math.sin(i), e = this.a, s = this.rf, r = 1 / s, n = 2 * r - Math.pow(r, 2), a = this.e = Math.sqrt(n); + this.R = this.k0 * e * Math.sqrt(1 - n) / (1 - n * Math.pow(t, 2)), this.alpha = Math.sqrt(1 + n / (1 - n) * Math.pow(Math.cos(i), 4)), this.b0 = Math.asin(t / this.alpha); + var o = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)), l = Math.log(Math.tan(Math.PI / 4 + i / 2)), c = Math.log((1 + a * t) / (1 - a * t)); + this.K = o - this.alpha * l + this.alpha * a / 2 * c; +} +function kp(i) { + var t = Math.log(Math.tan(Math.PI / 4 - i.y / 2)), e = this.e / 2 * Math.log((1 + this.e * Math.sin(i.y)) / (1 - this.e * Math.sin(i.y))), s = -this.alpha * (t + e) + this.K, r = 2 * (Math.atan(Math.exp(s)) - Math.PI / 4), n = this.alpha * (i.x - this.lambda0), a = Math.atan(Math.sin(n) / (Math.sin(this.b0) * Math.tan(r) + Math.cos(this.b0) * Math.cos(n))), o = Math.asin(Math.cos(this.b0) * Math.sin(r) - Math.sin(this.b0) * Math.cos(r) * Math.cos(n)); + return i.y = this.R / 2 * Math.log((1 + Math.sin(o)) / (1 - Math.sin(o))) + this.y0, i.x = this.R * a + this.x0, i; +} +function zp(i) { + for (var t = i.x - this.x0, e = i.y - this.y0, s = t / this.R, r = 2 * (Math.atan(Math.exp(e / this.R)) - Math.PI / 4), n = Math.asin(Math.cos(this.b0) * Math.sin(r) + Math.sin(this.b0) * Math.cos(r) * Math.cos(s)), a = Math.atan(Math.sin(s) / (Math.cos(this.b0) * Math.cos(s) - Math.sin(this.b0) * Math.tan(r))), o = this.lambda0 + a / this.alpha, l = 0, c = n, d = -1e3, u = 0; Math.abs(c - d) > 1e-7; ) { + if (++u > 20) + return; + l = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + n / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(c)) / 2)), d = c, c = 2 * Math.atan(Math.exp(l)) - Math.PI / 2; + } + return i.x = o, i.y = c, i; +} +var Hp = ["somerc"]; +const Bp = { + init: Gp, + forward: kp, + inverse: zp, + names: Hp +}; +var Ls = 1e-7; +function Vp(i) { + var t = ["Hotine_Oblique_Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin"], e = typeof i.PROJECTION == "object" ? Object.keys(i.PROJECTION)[0] : i.PROJECTION; + return "no_uoff" in i || "no_off" in i || t.indexOf(e) !== -1; +} +function jp() { + var i, t, e, s, r, n, a, o, l, c, d = 0, u, f = 0, g = 0, m = 0, p = 0, y = 0, v = 0; + this.no_off = Vp(this), this.no_rot = "no_rot" in this; + var w = !1; + "alpha" in this && (w = !0); + var C = !1; + if ("rectified_grid_angle" in this && (C = !0), w && (v = this.alpha), C && (d = this.rectified_grid_angle * Ue), w || C) + f = this.longc; + else if (g = this.long1, p = this.lat1, m = this.long2, y = this.lat2, Math.abs(p - y) <= Ls || (i = Math.abs(p)) <= Ls || Math.abs(i - O) <= Ls || Math.abs(Math.abs(this.lat0) - O) <= Ls || Math.abs(Math.abs(y) - O) <= Ls) + throw new Error(); + var x = 1 - this.es; + t = Math.sqrt(x), Math.abs(this.lat0) > T ? (o = Math.sin(this.lat0), e = Math.cos(this.lat0), i = 1 - this.es * o * o, this.B = e * e, this.B = Math.sqrt(1 + this.es * this.B * this.B / x), this.A = this.B * this.k0 * t / i, s = this.B * t / (e * Math.sqrt(i)), r = s * s - 1, r <= 0 ? r = 0 : (r = Math.sqrt(r), this.lat0 < 0 && (r = -r)), this.E = r += s, this.E *= Math.pow(Vt(this.e, this.lat0, o), this.B)) : (this.B = 1 / t, this.A = this.k0, this.E = s = r = 1), w || C ? (w ? (u = Math.asin(Math.sin(v) / s), C || (d = v)) : (u = d, v = Math.asin(s * Math.sin(u))), this.lam0 = f - Math.asin(0.5 * (r - 1 / r) * Math.tan(u)) / this.B) : (n = Math.pow(Vt(this.e, p, Math.sin(p)), this.B), a = Math.pow(Vt(this.e, y, Math.sin(y)), this.B), r = this.E / n, l = (a - n) / (a + n), c = this.E * this.E, c = (c - a * n) / (c + a * n), i = g - m, i < -Math.pi ? m -= Gr : i > Math.pi && (m += Gr), this.lam0 = A(0.5 * (g + m) - Math.atan(c * Math.tan(0.5 * this.B * (g - m)) / l) / this.B), u = Math.atan(2 * Math.sin(this.B * A(g - this.lam0)) / (r - 1 / r)), d = v = Math.asin(s * Math.sin(u))), this.singam = Math.sin(u), this.cosgam = Math.cos(u), this.sinrot = Math.sin(d), this.cosrot = Math.cos(d), this.rB = 1 / this.B, this.ArB = this.A * this.rB, this.BrA = 1 / this.ArB, this.A * this.B, this.no_off ? this.u_0 = 0 : (this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(s * s - 1) / Math.cos(v))), this.lat0 < 0 && (this.u_0 = -this.u_0)), r = 0.5 * u, this.v_pole_n = this.ArB * Math.log(Math.tan(se - r)), this.v_pole_s = this.ArB * Math.log(Math.tan(se + r)); +} +function $p(i) { + var t = {}, e, s, r, n, a, o, l, c; + if (i.x = i.x - this.lam0, Math.abs(Math.abs(i.y) - O) > T) { + if (a = this.E / Math.pow(Vt(this.e, i.y, Math.sin(i.y)), this.B), o = 1 / a, e = 0.5 * (a - o), s = 0.5 * (a + o), n = Math.sin(this.B * i.x), r = (e * this.singam - n * this.cosgam) / s, Math.abs(Math.abs(r) - 1) < T) + throw new Error(); + c = 0.5 * this.ArB * Math.log((1 - r) / (1 + r)), o = Math.cos(this.B * i.x), Math.abs(o) < Ls ? l = this.A * i.x : l = this.ArB * Math.atan2(e * this.cosgam + n * this.singam, o); + } else + c = i.y > 0 ? this.v_pole_n : this.v_pole_s, l = this.ArB * i.y; + return this.no_rot ? (t.x = l, t.y = c) : (l -= this.u_0, t.x = c * this.cosrot + l * this.sinrot, t.y = l * this.cosrot - c * this.sinrot), t.x = this.a * t.x + this.x0, t.y = this.a * t.y + this.y0, t; +} +function qp(i) { + var t, e, s, r, n, a, o, l = {}; + if (i.x = (i.x - this.x0) * (1 / this.a), i.y = (i.y - this.y0) * (1 / this.a), this.no_rot ? (e = i.y, t = i.x) : (e = i.x * this.cosrot - i.y * this.sinrot, t = i.y * this.cosrot + i.x * this.sinrot + this.u_0), s = Math.exp(-this.BrA * e), r = 0.5 * (s - 1 / s), n = 0.5 * (s + 1 / s), a = Math.sin(this.BrA * t), o = (a * this.cosgam + r * this.singam) / n, Math.abs(Math.abs(o) - 1) < T) + l.x = 0, l.y = o < 0 ? -O : O; + else { + if (l.y = this.E / Math.sqrt((1 + o) / (1 - o)), l.y = zr(this.e, Math.pow(l.y, 1 / this.B)), l.y === 1 / 0) + throw new Error(); + l.x = -this.rB * Math.atan2(r * this.cosgam - a * this.singam, Math.cos(this.BrA * t)); + } + return l.x += this.lam0, l; +} +var Up = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "Oblique_Mercator", "omerc"]; +const Wp = { + init: jp, + forward: $p, + inverse: qp, + names: Up +}; +function Yp() { + if (this.lat2 || (this.lat2 = this.lat1), this.k0 || (this.k0 = 1), this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, !(Math.abs(this.lat1 + this.lat2) < T)) { + var i = this.b / this.a; + this.e = Math.sqrt(1 - i * i); + var t = Math.sin(this.lat1), e = Math.cos(this.lat1), s = ai(this.e, t, e), r = Vt(this.e, this.lat1, t), n = Math.sin(this.lat2), a = Math.cos(this.lat2), o = ai(this.e, n, a), l = Vt(this.e, this.lat2, n), c = Vt(this.e, this.lat0, Math.sin(this.lat0)); + Math.abs(this.lat1 - this.lat2) > T ? this.ns = Math.log(s / o) / Math.log(r / l) : this.ns = t, isNaN(this.ns) && (this.ns = t), this.f0 = s / (this.ns * Math.pow(r, this.ns)), this.rh = this.a * this.f0 * Math.pow(c, this.ns), this.title || (this.title = "Lambert Conformal Conic"); + } +} +function Xp(i) { + var t = i.x, e = i.y; + Math.abs(2 * Math.abs(e) - Math.PI) <= T && (e = ln(e) * (O - 2 * T)); + var s = Math.abs(Math.abs(e) - O), r, n; + if (s > T) + r = Vt(this.e, e, Math.sin(e)), n = this.a * this.f0 * Math.pow(r, this.ns); + else { + if (s = e * this.ns, s <= 0) + return null; + n = 0; + } + var a = this.ns * A(t - this.long0); + return i.x = this.k0 * (n * Math.sin(a)) + this.x0, i.y = this.k0 * (this.rh - n * Math.cos(a)) + this.y0, i; +} +function Zp(i) { + var t, e, s, r, n, a = (i.x - this.x0) / this.k0, o = this.rh - (i.y - this.y0) / this.k0; + this.ns > 0 ? (t = Math.sqrt(a * a + o * o), e = 1) : (t = -Math.sqrt(a * a + o * o), e = -1); + var l = 0; + if (t !== 0 && (l = Math.atan2(e * a, e * o)), t !== 0 || this.ns > 0) { + if (e = 1 / this.ns, s = Math.pow(t / (this.a * this.f0), e), r = zr(this.e, s), r === -9999) + return null; + } else + r = -O; + return n = A(l / this.ns + this.long0), i.x = n, i.y = r, i; +} +var Jp = [ + "Lambert Tangential Conformal Conic Projection", + "Lambert_Conformal_Conic", + "Lambert_Conformal_Conic_1SP", + "Lambert_Conformal_Conic_2SP", + "lcc", + "Lambert Conic Conformal (1SP)", + "Lambert Conic Conformal (2SP)" +]; +const Kp = { + init: Yp, + forward: Xp, + inverse: Zp, + names: Jp +}; +function Qp() { + this.a = 6377397155e-3, this.es = 0.006674372230614, this.e = Math.sqrt(this.es), this.lat0 || (this.lat0 = 0.863937979737193), this.long0 || (this.long0 = 0.7417649320975901 - 0.308341501185665), this.k0 || (this.k0 = 0.9999), this.s45 = 0.785398163397448, this.s90 = 2 * this.s45, this.fi0 = this.lat0, this.e2 = this.es, this.e = Math.sqrt(this.e2), this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2)), this.uq = 1.04216856380474, this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa), this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2), this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g, this.k1 = this.k0, this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)), this.s0 = 1.37008346281555, this.n = Math.sin(this.s0), this.ro0 = this.k1 * this.n0 / Math.tan(this.s0), this.ad = this.s90 - this.uq; +} +function ey(i) { + var t, e, s, r, n, a, o, l = i.x, c = i.y, d = A(l - this.long0); + return t = Math.pow((1 + this.e * Math.sin(c)) / (1 - this.e * Math.sin(c)), this.alfa * this.e / 2), e = 2 * (Math.atan(this.k * Math.pow(Math.tan(c / 2 + this.s45), this.alfa) / t) - this.s45), s = -d * this.alfa, r = Math.asin(Math.cos(this.ad) * Math.sin(e) + Math.sin(this.ad) * Math.cos(e) * Math.cos(s)), n = Math.asin(Math.cos(e) * Math.sin(s) / Math.cos(r)), a = this.n * n, o = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(r / 2 + this.s45), this.n), i.y = o * Math.cos(a) / 1, i.x = o * Math.sin(a) / 1, this.czech || (i.y *= -1, i.x *= -1), i; +} +function ty(i) { + var t, e, s, r, n, a, o, l, c = i.x; + i.x = i.y, i.y = c, this.czech || (i.y *= -1, i.x *= -1), a = Math.sqrt(i.x * i.x + i.y * i.y), n = Math.atan2(i.y, i.x), r = n / Math.sin(this.s0), s = 2 * (Math.atan(Math.pow(this.ro0 / a, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45), t = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(r)), e = Math.asin(Math.cos(s) * Math.sin(r) / Math.cos(t)), i.x = this.long0 - e / this.alfa, o = t, l = 0; + var d = 0; + do + i.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(t / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(o)) / (1 - this.e * Math.sin(o)), this.e / 2)) - this.s45), Math.abs(o - i.y) < 1e-10 && (l = 1), o = i.y, d += 1; + while (l === 0 && d < 15); + return d >= 15 ? null : i; +} +var iy = ["Krovak", "krovak"]; +const sy = { + init: Qp, + forward: ey, + inverse: ty, + names: iy +}; +function lt(i, t, e, s, r) { + return i * r - t * Math.sin(2 * r) + e * Math.sin(4 * r) - s * Math.sin(6 * r); +} +function hn(i) { + return 1 - 0.25 * i * (1 + i / 16 * (3 + 1.25 * i)); +} +function cn(i) { + return 0.375 * i * (1 + 0.25 * i * (1 + 0.46875 * i)); +} +function un(i) { + return 0.05859375 * i * i * (1 + 0.75 * i); +} +function dn(i) { + return i * i * i * (35 / 3072); +} +function Vs(i, t, e) { + var s = t * e; + return i / Math.sqrt(1 - s * s); +} +function Ki(i) { + return Math.abs(i) < O ? i : i - ln(i) * Math.PI; +} +function ca(i, t, e, s, r) { + var n, a; + n = i / t; + for (var o = 0; o < 15; o++) + if (a = (i - (t * n - e * Math.sin(2 * n) + s * Math.sin(4 * n) - r * Math.sin(6 * n))) / (t - 2 * e * Math.cos(2 * n) + 4 * s * Math.cos(4 * n) - 6 * r * Math.cos(6 * n)), n += a, Math.abs(a) <= 1e-10) + return n; + return NaN; +} +function ry() { + this.sphere || (this.e0 = hn(this.es), this.e1 = cn(this.es), this.e2 = un(this.es), this.e3 = dn(this.es), this.ml0 = this.a * lt(this.e0, this.e1, this.e2, this.e3, this.lat0)); +} +function ny(i) { + var t, e, s = i.x, r = i.y; + if (s = A(s - this.long0), this.sphere) + t = this.a * Math.asin(Math.cos(r) * Math.sin(s)), e = this.a * (Math.atan2(Math.tan(r), Math.cos(s)) - this.lat0); + else { + var n = Math.sin(r), a = Math.cos(r), o = Vs(this.a, this.e, n), l = Math.tan(r) * Math.tan(r), c = s * Math.cos(r), d = c * c, u = this.es * a * a / (1 - this.es), f = this.a * lt(this.e0, this.e1, this.e2, this.e3, r); + t = o * c * (1 - d * l * (1 / 6 - (8 - l + 8 * u) * d / 120)), e = f - this.ml0 + o * n / a * d * (0.5 + (5 - l + 6 * u) * d / 24); + } + return i.x = t + this.x0, i.y = e + this.y0, i; +} +function ay(i) { + i.x -= this.x0, i.y -= this.y0; + var t = i.x / this.a, e = i.y / this.a, s, r; + if (this.sphere) { + var n = e + this.lat0; + s = Math.asin(Math.sin(n) * Math.cos(t)), r = Math.atan2(Math.tan(t), Math.cos(n)); + } else { + var a = this.ml0 / this.a + e, o = ca(a, this.e0, this.e1, this.e2, this.e3); + if (Math.abs(Math.abs(o) - O) <= T) + return i.x = this.long0, i.y = O, e < 0 && (i.y *= -1), i; + var l = Vs(this.a, this.e, Math.sin(o)), c = l * l * l / this.a / this.a * (1 - this.es), d = Math.pow(Math.tan(o), 2), u = t * this.a / l, f = u * u; + s = o - l * Math.tan(o) / c * u * u * (0.5 - (1 + 3 * d) * u * u / 24), r = u * (1 - f * (d / 3 + (1 + 3 * d) * d * f / 15)) / Math.cos(o); + } + return i.x = A(r + this.long0), i.y = Ki(s), i; +} +var oy = ["Cassini", "Cassini_Soldner", "cass"]; +const ly = { + init: ry, + forward: ny, + inverse: ay, + names: oy +}; +function zi(i, t) { + var e; + return i > 1e-7 ? (e = i * t, (1 - i * i) * (t / (1 - e * e) - 0.5 / i * Math.log((1 - e) / (1 + e)))) : 2 * t; +} +var hy = 1, cy = 2, uy = 3, dy = 4; +function fy() { + var i = Math.abs(this.lat0); + if (Math.abs(i - O) < T ? this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE : Math.abs(i) < T ? this.mode = this.EQUIT : this.mode = this.OBLIQ, this.es > 0) { + var t; + switch (this.qp = zi(this.e, 1), this.mmf = 0.5 / (1 - this.es), this.apa = Cy(this.es), this.mode) { + case this.N_POLE: + this.dd = 1; + break; + case this.S_POLE: + this.dd = 1; + break; + case this.EQUIT: + this.rq = Math.sqrt(0.5 * this.qp), this.dd = 1 / this.rq, this.xmf = 1, this.ymf = 0.5 * this.qp; + break; + case this.OBLIQ: + this.rq = Math.sqrt(0.5 * this.qp), t = Math.sin(this.lat0), this.sinb1 = zi(this.e, t) / this.qp, this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1), this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * t * t) * this.rq * this.cosb1), this.ymf = (this.xmf = this.rq) / this.dd, this.xmf *= this.dd; + break; + } + } else + this.mode === this.OBLIQ && (this.sinph0 = Math.sin(this.lat0), this.cosph0 = Math.cos(this.lat0)); +} +function gy(i) { + var t, e, s, r, n, a, o, l, c, d, u = i.x, f = i.y; + if (u = A(u - this.long0), this.sphere) { + if (n = Math.sin(f), d = Math.cos(f), s = Math.cos(u), this.mode === this.OBLIQ || this.mode === this.EQUIT) { + if (e = this.mode === this.EQUIT ? 1 + d * s : 1 + this.sinph0 * n + this.cosph0 * d * s, e <= T) + return null; + e = Math.sqrt(2 / e), t = e * d * Math.sin(u), e *= this.mode === this.EQUIT ? n : this.cosph0 * n - this.sinph0 * d * s; + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE && (s = -s), Math.abs(f + this.lat0) < T) + return null; + e = se - f * 0.5, e = 2 * (this.mode === this.S_POLE ? Math.cos(e) : Math.sin(e)), t = e * Math.sin(u), e *= s; + } + } else { + switch (o = 0, l = 0, c = 0, s = Math.cos(u), r = Math.sin(u), n = Math.sin(f), a = zi(this.e, n), (this.mode === this.OBLIQ || this.mode === this.EQUIT) && (o = a / this.qp, l = Math.sqrt(1 - o * o)), this.mode) { + case this.OBLIQ: + c = 1 + this.sinb1 * o + this.cosb1 * l * s; + break; + case this.EQUIT: + c = 1 + l * s; + break; + case this.N_POLE: + c = O + f, a = this.qp - a; + break; + case this.S_POLE: + c = f - O, a = this.qp + a; + break; + } + if (Math.abs(c) < T) + return null; + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + c = Math.sqrt(2 / c), this.mode === this.OBLIQ ? e = this.ymf * c * (this.cosb1 * o - this.sinb1 * l * s) : e = (c = Math.sqrt(2 / (1 + l * s))) * o * this.ymf, t = this.xmf * c * l * r; + break; + case this.N_POLE: + case this.S_POLE: + a >= 0 ? (t = (c = Math.sqrt(a)) * r, e = s * (this.mode === this.S_POLE ? c : -c)) : t = e = 0; + break; + } + } + return i.x = this.a * t + this.x0, i.y = this.a * e + this.y0, i; +} +function my(i) { + i.x -= this.x0, i.y -= this.y0; + var t = i.x / this.a, e = i.y / this.a, s, r, n, a, o, l, c; + if (this.sphere) { + var d = 0, u, f = 0; + if (u = Math.sqrt(t * t + e * e), r = u * 0.5, r > 1) + return null; + switch (r = 2 * Math.asin(r), (this.mode === this.OBLIQ || this.mode === this.EQUIT) && (f = Math.sin(r), d = Math.cos(r)), this.mode) { + case this.EQUIT: + r = Math.abs(u) <= T ? 0 : Math.asin(e * f / u), t *= f, e = d * u; + break; + case this.OBLIQ: + r = Math.abs(u) <= T ? this.lat0 : Math.asin(d * this.sinph0 + e * f * this.cosph0 / u), t *= f * this.cosph0, e = (d - Math.sin(r) * this.sinph0) * u; + break; + case this.N_POLE: + e = -e, r = O - r; + break; + case this.S_POLE: + r -= O; + break; + } + s = e === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(t, e); + } else { + if (c = 0, this.mode === this.OBLIQ || this.mode === this.EQUIT) { + if (t /= this.dd, e *= this.dd, l = Math.sqrt(t * t + e * e), l < T) + return i.x = this.long0, i.y = this.lat0, i; + a = 2 * Math.asin(0.5 * l / this.rq), n = Math.cos(a), t *= a = Math.sin(a), this.mode === this.OBLIQ ? (c = n * this.sinb1 + e * a * this.cosb1 / l, o = this.qp * c, e = l * this.cosb1 * n - e * this.sinb1 * a) : (c = e * a / l, o = this.qp * c, e = l * n); + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE && (e = -e), o = t * t + e * e, !o) + return i.x = this.long0, i.y = this.lat0, i; + c = 1 - o / this.qp, this.mode === this.S_POLE && (c = -c); + } + s = Math.atan2(t, e), r = My(Math.asin(c), this.apa); + } + return i.x = A(this.long0 + s), i.y = r, i; +} +var py = 0.3333333333333333, yy = 0.17222222222222222, _y = 0.10257936507936508, vy = 0.06388888888888888, Sy = 0.0664021164021164, wy = 0.016415012942191543; +function Cy(i) { + var t, e = []; + return e[0] = i * py, t = i * i, e[0] += t * yy, e[1] = t * vy, t *= i, e[0] += t * _y, e[1] += t * Sy, e[2] = t * wy, e; +} +function My(i, t) { + var e = i + i; + return i + t[0] * Math.sin(e) + t[1] * Math.sin(e + e) + t[2] * Math.sin(e + e + e); +} +var xy = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; +const Ey = { + init: fy, + forward: gy, + inverse: my, + names: xy, + S_POLE: hy, + N_POLE: cy, + EQUIT: uy, + OBLIQ: dy +}; +function qi(i) { + return Math.abs(i) > 1 && (i = i > 1 ? 1 : -1), Math.asin(i); +} +function Oy() { + Math.abs(this.lat1 + this.lat2) < T || (this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e3 = Math.sqrt(this.es), this.sin_po = Math.sin(this.lat1), this.cos_po = Math.cos(this.lat1), this.t1 = this.sin_po, this.con = this.sin_po, this.ms1 = ai(this.e3, this.sin_po, this.cos_po), this.qs1 = zi(this.e3, this.sin_po), this.sin_po = Math.sin(this.lat2), this.cos_po = Math.cos(this.lat2), this.t2 = this.sin_po, this.ms2 = ai(this.e3, this.sin_po, this.cos_po), this.qs2 = zi(this.e3, this.sin_po), this.sin_po = Math.sin(this.lat0), this.cos_po = Math.cos(this.lat0), this.t3 = this.sin_po, this.qs0 = zi(this.e3, this.sin_po), Math.abs(this.lat1 - this.lat2) > T ? this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1) : this.ns0 = this.con, this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1, this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0); +} +function by(i) { + var t = i.x, e = i.y; + this.sin_phi = Math.sin(e), this.cos_phi = Math.cos(e); + var s = zi(this.e3, this.sin_phi), r = this.a * Math.sqrt(this.c - this.ns0 * s) / this.ns0, n = this.ns0 * A(t - this.long0), a = r * Math.sin(n) + this.x0, o = this.rh - r * Math.cos(n) + this.y0; + return i.x = a, i.y = o, i; +} +function Py(i) { + var t, e, s, r, n, a; + return i.x -= this.x0, i.y = this.rh - i.y + this.y0, this.ns0 >= 0 ? (t = Math.sqrt(i.x * i.x + i.y * i.y), s = 1) : (t = -Math.sqrt(i.x * i.x + i.y * i.y), s = -1), r = 0, t !== 0 && (r = Math.atan2(s * i.x, s * i.y)), s = t * this.ns0 / this.a, this.sphere ? a = Math.asin((this.c - s * s) / (2 * this.ns0)) : (e = (this.c - s * s) / this.ns0, a = this.phi1z(this.e3, e)), n = A(r / this.ns0 + this.long0), i.x = n, i.y = a, i; +} +function Ly(i, t) { + var e, s, r, n, a, o = qi(0.5 * t); + if (i < T) + return o; + for (var l = i * i, c = 1; c <= 25; c++) + if (e = Math.sin(o), s = Math.cos(o), r = i * e, n = 1 - r * r, a = 0.5 * n * n / s * (t / (1 - l) - e / n + 0.5 / i * Math.log((1 - r) / (1 + r))), o = o + a, Math.abs(a) <= 1e-7) + return o; + return null; +} +var Iy = ["Albers_Conic_Equal_Area", "Albers", "aea"]; +const Ty = { + init: Oy, + forward: by, + inverse: Py, + names: Iy, + phi1z: Ly +}; +function Ay() { + this.sin_p14 = Math.sin(this.lat0), this.cos_p14 = Math.cos(this.lat0), this.infinity_dist = 1e3 * this.a, this.rc = 1; +} +function Dy(i) { + var t, e, s, r, n, a, o, l, c = i.x, d = i.y; + return s = A(c - this.long0), t = Math.sin(d), e = Math.cos(d), r = Math.cos(s), a = this.sin_p14 * t + this.cos_p14 * e * r, n = 1, a > 0 || Math.abs(a) <= T ? (o = this.x0 + this.a * n * e * Math.sin(s) / a, l = this.y0 + this.a * n * (this.cos_p14 * t - this.sin_p14 * e * r) / a) : (o = this.x0 + this.infinity_dist * e * Math.sin(s), l = this.y0 + this.infinity_dist * (this.cos_p14 * t - this.sin_p14 * e * r)), i.x = o, i.y = l, i; +} +function Ny(i) { + var t, e, s, r, n, a; + return i.x = (i.x - this.x0) / this.a, i.y = (i.y - this.y0) / this.a, i.x /= this.k0, i.y /= this.k0, (t = Math.sqrt(i.x * i.x + i.y * i.y)) ? (r = Math.atan2(t, this.rc), e = Math.sin(r), s = Math.cos(r), a = qi(s * this.sin_p14 + i.y * e * this.cos_p14 / t), n = Math.atan2(i.x * e, t * this.cos_p14 * s - i.y * this.sin_p14 * e), n = A(this.long0 + n)) : (a = this.phic0, n = 0), i.x = n, i.y = a, i; +} +var Ry = ["gnom"]; +const Fy = { + init: Ay, + forward: Dy, + inverse: Ny, + names: Ry +}; +function Gy(i, t) { + var e = 1 - (1 - i * i) / (2 * i) * Math.log((1 - i) / (1 + i)); + if (Math.abs(Math.abs(t) - e) < 1e-6) + return t < 0 ? -1 * O : O; + for (var s = Math.asin(0.5 * t), r, n, a, o, l = 0; l < 30; l++) + if (n = Math.sin(s), a = Math.cos(s), o = i * n, r = Math.pow(1 - o * o, 2) / (2 * a) * (t / (1 - i * i) - n / (1 - o * o) + 0.5 / i * Math.log((1 - o) / (1 + o))), s += r, Math.abs(r) <= 1e-10) + return s; + return NaN; +} +function ky() { + this.sphere || (this.k0 = ai(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts))); +} +function zy(i) { + var t = i.x, e = i.y, s, r, n = A(t - this.long0); + if (this.sphere) + s = this.x0 + this.a * n * Math.cos(this.lat_ts), r = this.y0 + this.a * Math.sin(e) / Math.cos(this.lat_ts); + else { + var a = zi(this.e, Math.sin(e)); + s = this.x0 + this.a * this.k0 * n, r = this.y0 + this.a * a * 0.5 / this.k0; + } + return i.x = s, i.y = r, i; +} +function Hy(i) { + i.x -= this.x0, i.y -= this.y0; + var t, e; + return this.sphere ? (t = A(this.long0 + i.x / this.a / Math.cos(this.lat_ts)), e = Math.asin(i.y / this.a * Math.cos(this.lat_ts))) : (e = Gy(this.e, 2 * i.y * this.k0 / this.a), t = A(this.long0 + i.x / (this.a * this.k0))), i.x = t, i.y = e, i; +} +var By = ["cea"]; +const Vy = { + init: ky, + forward: zy, + inverse: Hy, + names: By +}; +function jy() { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.lat0 = this.lat0 || 0, this.long0 = this.long0 || 0, this.lat_ts = this.lat_ts || 0, this.title = this.title || "Equidistant Cylindrical (Plate Carre)", this.rc = Math.cos(this.lat_ts); +} +function $y(i) { + var t = i.x, e = i.y, s = A(t - this.long0), r = Ki(e - this.lat0); + return i.x = this.x0 + this.a * s * this.rc, i.y = this.y0 + this.a * r, i; +} +function qy(i) { + var t = i.x, e = i.y; + return i.x = A(this.long0 + (t - this.x0) / (this.a * this.rc)), i.y = Ki(this.lat0 + (e - this.y0) / this.a), i; +} +var Uy = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; +const Wy = { + init: jy, + forward: $y, + inverse: qy, + names: Uy +}; +var bh = 20; +function Yy() { + this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e = Math.sqrt(this.es), this.e0 = hn(this.es), this.e1 = cn(this.es), this.e2 = un(this.es), this.e3 = dn(this.es), this.ml0 = this.a * lt(this.e0, this.e1, this.e2, this.e3, this.lat0); +} +function Xy(i) { + var t = i.x, e = i.y, s, r, n, a = A(t - this.long0); + if (n = a * Math.sin(e), this.sphere) + Math.abs(e) <= T ? (s = this.a * a, r = -1 * this.a * this.lat0) : (s = this.a * Math.sin(n) / Math.tan(e), r = this.a * (Ki(e - this.lat0) + (1 - Math.cos(n)) / Math.tan(e))); + else if (Math.abs(e) <= T) + s = this.a * a, r = -1 * this.ml0; + else { + var o = Vs(this.a, this.e, Math.sin(e)) / Math.tan(e); + s = o * Math.sin(n), r = this.a * lt(this.e0, this.e1, this.e2, this.e3, e) - this.ml0 + o * (1 - Math.cos(n)); + } + return i.x = s + this.x0, i.y = r + this.y0, i; +} +function Zy(i) { + var t, e, s, r, n, a, o, l, c; + if (s = i.x - this.x0, r = i.y - this.y0, this.sphere) + if (Math.abs(r + this.a * this.lat0) <= T) + t = A(s / this.a + this.long0), e = 0; + else { + a = this.lat0 + r / this.a, o = s * s / this.a / this.a + a * a, l = a; + var d; + for (n = bh; n; --n) + if (d = Math.tan(l), c = -1 * (a * (l * d + 1) - l - 0.5 * (l * l + o) * d) / ((l - a) / d - 1), l += c, Math.abs(c) <= T) { + e = l; + break; + } + t = A(this.long0 + Math.asin(s * Math.tan(l) / this.a) / Math.sin(e)); + } + else if (Math.abs(r + this.ml0) <= T) + e = 0, t = A(this.long0 + s / this.a); + else { + a = (this.ml0 + r) / this.a, o = s * s / this.a / this.a + a * a, l = a; + var u, f, g, m, p; + for (n = bh; n; --n) + if (p = this.e * Math.sin(l), u = Math.sqrt(1 - p * p) * Math.tan(l), f = this.a * lt(this.e0, this.e1, this.e2, this.e3, l), g = this.e0 - 2 * this.e1 * Math.cos(2 * l) + 4 * this.e2 * Math.cos(4 * l) - 6 * this.e3 * Math.cos(6 * l), m = f / this.a, c = (a * (u * m + 1) - m - 0.5 * u * (m * m + o)) / (this.es * Math.sin(2 * l) * (m * m + o - 2 * a * m) / (4 * u) + (a - m) * (u * g - 2 / Math.sin(2 * l)) - g), l -= c, Math.abs(c) <= T) { + e = l; + break; + } + u = Math.sqrt(1 - this.es * Math.pow(Math.sin(e), 2)) * Math.tan(e), t = A(this.long0 + Math.asin(s * u / this.a) / Math.sin(e)); + } + return i.x = t, i.y = e, i; +} +var Jy = ["Polyconic", "poly"]; +const Ky = { + init: Yy, + forward: Xy, + inverse: Zy, + names: Jy +}; +function Qy() { + this.A = [], this.A[1] = 0.6399175073, this.A[2] = -0.1358797613, this.A[3] = 0.063294409, this.A[4] = -0.02526853, this.A[5] = 0.0117879, this.A[6] = -55161e-7, this.A[7] = 26906e-7, this.A[8] = -1333e-6, this.A[9] = 67e-5, this.A[10] = -34e-5, this.B_re = [], this.B_im = [], this.B_re[1] = 0.7557853228, this.B_im[1] = 0, this.B_re[2] = 0.249204646, this.B_im[2] = 3371507e-9, this.B_re[3] = -1541739e-9, this.B_im[3] = 0.04105856, this.B_re[4] = -0.10162907, this.B_im[4] = 0.01727609, this.B_re[5] = -0.26623489, this.B_im[5] = -0.36249218, this.B_re[6] = -0.6870983, this.B_im[6] = -1.1651967, this.C_re = [], this.C_im = [], this.C_re[1] = 1.3231270439, this.C_im[1] = 0, this.C_re[2] = -0.577245789, this.C_im[2] = -7809598e-9, this.C_re[3] = 0.508307513, this.C_im[3] = -0.112208952, this.C_re[4] = -0.15094762, this.C_im[4] = 0.18200602, this.C_re[5] = 1.01418179, this.C_im[5] = 1.64497696, this.C_re[6] = 1.9660549, this.C_im[6] = 2.5127645, this.D = [], this.D[1] = 1.5627014243, this.D[2] = 0.5185406398, this.D[3] = -0.03333098, this.D[4] = -0.1052906, this.D[5] = -0.0368594, this.D[6] = 7317e-6, this.D[7] = 0.0122, this.D[8] = 394e-5, this.D[9] = -13e-4; +} +function e_(i) { + var t, e = i.x, s = i.y, r = s - this.lat0, n = e - this.long0, a = r / Cr * 1e-5, o = n, l = 1, c = 0; + for (t = 1; t <= 10; t++) + l = l * a, c = c + this.A[t] * l; + var d = c, u = o, f = 1, g = 0, m, p, y = 0, v = 0; + for (t = 1; t <= 6; t++) + m = f * d - g * u, p = g * d + f * u, f = m, g = p, y = y + this.B_re[t] * f - this.B_im[t] * g, v = v + this.B_im[t] * f + this.B_re[t] * g; + return i.x = v * this.a + this.x0, i.y = y * this.a + this.y0, i; +} +function t_(i) { + var t, e = i.x, s = i.y, r = e - this.x0, n = s - this.y0, a = n / this.a, o = r / this.a, l = 1, c = 0, d, u, f = 0, g = 0; + for (t = 1; t <= 6; t++) + d = l * a - c * o, u = c * a + l * o, l = d, c = u, f = f + this.C_re[t] * l - this.C_im[t] * c, g = g + this.C_im[t] * l + this.C_re[t] * c; + for (var m = 0; m < this.iterations; m++) { + var p = f, y = g, v, w, C = a, x = o; + for (t = 2; t <= 6; t++) + v = p * f - y * g, w = y * f + p * g, p = v, y = w, C = C + (t - 1) * (this.B_re[t] * p - this.B_im[t] * y), x = x + (t - 1) * (this.B_im[t] * p + this.B_re[t] * y); + p = 1, y = 0; + var E = this.B_re[1], I = this.B_im[1]; + for (t = 2; t <= 6; t++) + v = p * f - y * g, w = y * f + p * g, p = v, y = w, E = E + t * (this.B_re[t] * p - this.B_im[t] * y), I = I + t * (this.B_im[t] * p + this.B_re[t] * y); + var R = E * E + I * I; + f = (C * E + x * I) / R, g = (x * E - C * I) / R; + } + var D = f, X = g, te = 1, j = 0; + for (t = 1; t <= 9; t++) + te = te * D, j = j + this.D[t] * te; + var N = this.lat0 + j * Cr * 1e5, rt = this.long0 + X; + return i.x = rt, i.y = N, i; +} +var i_ = ["New_Zealand_Map_Grid", "nzmg"]; +const s_ = { + init: Qy, + forward: e_, + inverse: t_, + names: i_ +}; +function r_() { +} +function n_(i) { + var t = i.x, e = i.y, s = A(t - this.long0), r = this.x0 + this.a * s, n = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + e / 2.5)) * 1.25; + return i.x = r, i.y = n, i; +} +function a_(i) { + i.x -= this.x0, i.y -= this.y0; + var t = A(this.long0 + i.x / this.a), e = 2.5 * (Math.atan(Math.exp(0.8 * i.y / this.a)) - Math.PI / 4); + return i.x = t, i.y = e, i; +} +var o_ = ["Miller_Cylindrical", "mill"]; +const l_ = { + init: r_, + forward: n_, + inverse: a_, + names: o_ +}; +var h_ = 20; +function c_() { + this.sphere ? (this.n = 1, this.m = 0, this.es = 0, this.C_y = Math.sqrt((this.m + 1) / this.n), this.C_x = this.C_y / (this.m + 1)) : this.en = Cl(this.es); +} +function u_(i) { + var t, e, s = i.x, r = i.y; + if (s = A(s - this.long0), this.sphere) { + if (!this.m) + r = this.n !== 1 ? Math.asin(this.n * Math.sin(r)) : r; + else + for (var n = this.n * Math.sin(r), a = h_; a; --a) { + var o = (this.m * r + Math.sin(r) - n) / (this.m + Math.cos(r)); + if (r -= o, Math.abs(o) < T) + break; + } + t = this.a * this.C_x * s * (this.m + Math.cos(r)), e = this.a * this.C_y * r; + } else { + var l = Math.sin(r), c = Math.cos(r); + e = this.a * Zs(r, l, c, this.en), t = this.a * s * c / Math.sqrt(1 - this.es * l * l); + } + return i.x = t, i.y = e, i; +} +function d_(i) { + var t, e, s, r; + return i.x -= this.x0, s = i.x / this.a, i.y -= this.y0, t = i.y / this.a, this.sphere ? (t /= this.C_y, s = s / (this.C_x * (this.m + Math.cos(t))), this.m ? t = qi((this.m * t + Math.sin(t)) / this.n) : this.n !== 1 && (t = qi(Math.sin(t) / this.n)), s = A(s + this.long0), t = Ki(t)) : (t = Ml(i.y / this.a, this.es, this.en), r = Math.abs(t), r < O ? (r = Math.sin(t), e = this.long0 + i.x * Math.sqrt(1 - this.es * r * r) / (this.a * Math.cos(t)), s = A(e)) : r - T < O && (s = this.long0)), i.x = s, i.y = t, i; +} +var f_ = ["Sinusoidal", "sinu"]; +const g_ = { + init: c_, + forward: u_, + inverse: d_, + names: f_ +}; +function m_() { +} +function p_(i) { + for (var t = i.x, e = i.y, s = A(t - this.long0), r = e, n = Math.PI * Math.sin(e); ; ) { + var a = -(r + Math.sin(r) - n) / (1 + Math.cos(r)); + if (r += a, Math.abs(a) < T) + break; + } + r /= 2, Math.PI / 2 - Math.abs(e) < T && (s = 0); + var o = 0.900316316158 * this.a * s * Math.cos(r) + this.x0, l = 1.4142135623731 * this.a * Math.sin(r) + this.y0; + return i.x = o, i.y = l, i; +} +function y_(i) { + var t, e; + i.x -= this.x0, i.y -= this.y0, e = i.y / (1.4142135623731 * this.a), Math.abs(e) > 0.999999999999 && (e = 0.999999999999), t = Math.asin(e); + var s = A(this.long0 + i.x / (0.900316316158 * this.a * Math.cos(t))); + s < -Math.PI && (s = -Math.PI), s > Math.PI && (s = Math.PI), e = (2 * t + Math.sin(2 * t)) / Math.PI, Math.abs(e) > 1 && (e = 1); + var r = Math.asin(e); + return i.x = s, i.y = r, i; +} +var __ = ["Mollweide", "moll"]; +const v_ = { + init: m_, + forward: p_, + inverse: y_, + names: __ +}; +function S_() { + Math.abs(this.lat1 + this.lat2) < T || (this.lat2 = this.lat2 || this.lat1, this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e = Math.sqrt(this.es), this.e0 = hn(this.es), this.e1 = cn(this.es), this.e2 = un(this.es), this.e3 = dn(this.es), this.sinphi = Math.sin(this.lat1), this.cosphi = Math.cos(this.lat1), this.ms1 = ai(this.e, this.sinphi, this.cosphi), this.ml1 = lt(this.e0, this.e1, this.e2, this.e3, this.lat1), Math.abs(this.lat1 - this.lat2) < T ? this.ns = this.sinphi : (this.sinphi = Math.sin(this.lat2), this.cosphi = Math.cos(this.lat2), this.ms2 = ai(this.e, this.sinphi, this.cosphi), this.ml2 = lt(this.e0, this.e1, this.e2, this.e3, this.lat2), this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1)), this.g = this.ml1 + this.ms1 / this.ns, this.ml0 = lt(this.e0, this.e1, this.e2, this.e3, this.lat0), this.rh = this.a * (this.g - this.ml0)); +} +function w_(i) { + var t = i.x, e = i.y, s; + if (this.sphere) + s = this.a * (this.g - e); + else { + var r = lt(this.e0, this.e1, this.e2, this.e3, e); + s = this.a * (this.g - r); + } + var n = this.ns * A(t - this.long0), a = this.x0 + s * Math.sin(n), o = this.y0 + this.rh - s * Math.cos(n); + return i.x = a, i.y = o, i; +} +function C_(i) { + i.x -= this.x0, i.y = this.rh - i.y + this.y0; + var t, e, s, r; + this.ns >= 0 ? (e = Math.sqrt(i.x * i.x + i.y * i.y), t = 1) : (e = -Math.sqrt(i.x * i.x + i.y * i.y), t = -1); + var n = 0; + if (e !== 0 && (n = Math.atan2(t * i.x, t * i.y)), this.sphere) + return r = A(this.long0 + n / this.ns), s = Ki(this.g - e / this.a), i.x = r, i.y = s, i; + var a = this.g - e / this.a; + return s = ca(a, this.e0, this.e1, this.e2, this.e3), r = A(this.long0 + n / this.ns), i.x = r, i.y = s, i; +} +var M_ = ["Equidistant_Conic", "eqdc"]; +const x_ = { + init: S_, + forward: w_, + inverse: C_, + names: M_ +}; +function E_() { + this.R = this.a; +} +function O_(i) { + var t = i.x, e = i.y, s = A(t - this.long0), r, n; + Math.abs(e) <= T && (r = this.x0 + this.R * s, n = this.y0); + var a = qi(2 * Math.abs(e / Math.PI)); + (Math.abs(s) <= T || Math.abs(Math.abs(e) - O) <= T) && (r = this.x0, e >= 0 ? n = this.y0 + Math.PI * this.R * Math.tan(0.5 * a) : n = this.y0 + Math.PI * this.R * -Math.tan(0.5 * a)); + var o = 0.5 * Math.abs(Math.PI / s - s / Math.PI), l = o * o, c = Math.sin(a), d = Math.cos(a), u = d / (c + d - 1), f = u * u, g = u * (2 / c - 1), m = g * g, p = Math.PI * this.R * (o * (u - m) + Math.sqrt(l * (u - m) * (u - m) - (m + l) * (f - m))) / (m + l); + s < 0 && (p = -p), r = this.x0 + p; + var y = l + u; + return p = Math.PI * this.R * (g * y - o * Math.sqrt((m + l) * (l + 1) - y * y)) / (m + l), e >= 0 ? n = this.y0 + p : n = this.y0 - p, i.x = r, i.y = n, i; +} +function b_(i) { + var t, e, s, r, n, a, o, l, c, d, u, f, g; + return i.x -= this.x0, i.y -= this.y0, u = Math.PI * this.R, s = i.x / u, r = i.y / u, n = s * s + r * r, a = -Math.abs(r) * (1 + n), o = a - 2 * r * r + s * s, l = -2 * a + 1 + 2 * r * r + n * n, g = r * r / l + (2 * o * o * o / l / l / l - 9 * a * o / l / l) / 27, c = (a - o * o / 3 / l) / l, d = 2 * Math.sqrt(-c / 3), u = 3 * g / c / d, Math.abs(u) > 1 && (u >= 0 ? u = 1 : u = -1), f = Math.acos(u) / 3, i.y >= 0 ? e = (-d * Math.cos(f + Math.PI / 3) - o / 3 / l) * Math.PI : e = -(-d * Math.cos(f + Math.PI / 3) - o / 3 / l) * Math.PI, Math.abs(s) < T ? t = this.long0 : t = A(this.long0 + Math.PI * (n - 1 + Math.sqrt(1 + 2 * (s * s - r * r) + n * n)) / 2 / s), i.x = t, i.y = e, i; +} +var P_ = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; +const L_ = { + init: E_, + forward: O_, + inverse: b_, + names: P_ +}; +function I_() { + this.sin_p12 = Math.sin(this.lat0), this.cos_p12 = Math.cos(this.lat0); +} +function T_(i) { + var t = i.x, e = i.y, s = Math.sin(i.y), r = Math.cos(i.y), n = A(t - this.long0), a, o, l, c, d, u, f, g, m, p, y, v, w, C, x, E, I, R, D, X, te, j, N; + return this.sphere ? Math.abs(this.sin_p12 - 1) <= T ? (i.x = this.x0 + this.a * (O - e) * Math.sin(n), i.y = this.y0 - this.a * (O - e) * Math.cos(n), i) : Math.abs(this.sin_p12 + 1) <= T ? (i.x = this.x0 + this.a * (O + e) * Math.sin(n), i.y = this.y0 + this.a * (O + e) * Math.cos(n), i) : (R = this.sin_p12 * s + this.cos_p12 * r * Math.cos(n), E = Math.acos(R), I = E ? E / Math.sin(E) : 1, i.x = this.x0 + this.a * I * r * Math.sin(n), i.y = this.y0 + this.a * I * (this.cos_p12 * s - this.sin_p12 * r * Math.cos(n)), i) : (a = hn(this.es), o = cn(this.es), l = un(this.es), c = dn(this.es), Math.abs(this.sin_p12 - 1) <= T ? (d = this.a * lt(a, o, l, c, O), u = this.a * lt(a, o, l, c, e), i.x = this.x0 + (d - u) * Math.sin(n), i.y = this.y0 - (d - u) * Math.cos(n), i) : Math.abs(this.sin_p12 + 1) <= T ? (d = this.a * lt(a, o, l, c, O), u = this.a * lt(a, o, l, c, e), i.x = this.x0 + (d + u) * Math.sin(n), i.y = this.y0 + (d + u) * Math.cos(n), i) : (f = s / r, g = Vs(this.a, this.e, this.sin_p12), m = Vs(this.a, this.e, s), p = Math.atan((1 - this.es) * f + this.es * g * this.sin_p12 / (m * r)), y = Math.atan2(Math.sin(n), this.cos_p12 * Math.tan(p) - this.sin_p12 * Math.cos(n)), y === 0 ? D = Math.asin(this.cos_p12 * Math.sin(p) - this.sin_p12 * Math.cos(p)) : Math.abs(Math.abs(y) - Math.PI) <= T ? D = -Math.asin(this.cos_p12 * Math.sin(p) - this.sin_p12 * Math.cos(p)) : D = Math.asin(Math.sin(n) * Math.cos(p) / Math.sin(y)), v = this.e * this.sin_p12 / Math.sqrt(1 - this.es), w = this.e * this.cos_p12 * Math.cos(y) / Math.sqrt(1 - this.es), C = v * w, x = w * w, X = D * D, te = X * D, j = te * D, N = j * D, E = g * D * (1 - X * x * (1 - x) / 6 + te / 8 * C * (1 - 2 * x) + j / 120 * (x * (4 - 7 * x) - 3 * v * v * (1 - 7 * x)) - N / 48 * C), i.x = this.x0 + E * Math.sin(y), i.y = this.y0 + E * Math.cos(y), i)); +} +function A_(i) { + i.x -= this.x0, i.y -= this.y0; + var t, e, s, r, n, a, o, l, c, d, u, f, g, m, p, y, v, w, C, x, E, I, R, D; + return this.sphere ? (t = Math.sqrt(i.x * i.x + i.y * i.y), t > 2 * O * this.a ? void 0 : (e = t / this.a, s = Math.sin(e), r = Math.cos(e), n = this.long0, Math.abs(t) <= T ? a = this.lat0 : (a = qi(r * this.sin_p12 + i.y * s * this.cos_p12 / t), o = Math.abs(this.lat0) - O, Math.abs(o) <= T ? this.lat0 >= 0 ? n = A(this.long0 + Math.atan2(i.x, -i.y)) : n = A(this.long0 - Math.atan2(-i.x, i.y)) : n = A(this.long0 + Math.atan2(i.x * s, t * this.cos_p12 * r - i.y * this.sin_p12 * s))), i.x = n, i.y = a, i)) : (l = hn(this.es), c = cn(this.es), d = un(this.es), u = dn(this.es), Math.abs(this.sin_p12 - 1) <= T ? (f = this.a * lt(l, c, d, u, O), t = Math.sqrt(i.x * i.x + i.y * i.y), g = f - t, a = ca(g / this.a, l, c, d, u), n = A(this.long0 + Math.atan2(i.x, -1 * i.y)), i.x = n, i.y = a, i) : Math.abs(this.sin_p12 + 1) <= T ? (f = this.a * lt(l, c, d, u, O), t = Math.sqrt(i.x * i.x + i.y * i.y), g = t - f, a = ca(g / this.a, l, c, d, u), n = A(this.long0 + Math.atan2(i.x, i.y)), i.x = n, i.y = a, i) : (t = Math.sqrt(i.x * i.x + i.y * i.y), y = Math.atan2(i.x, i.y), m = Vs(this.a, this.e, this.sin_p12), v = Math.cos(y), w = this.e * this.cos_p12 * v, C = -w * w / (1 - this.es), x = 3 * this.es * (1 - C) * this.sin_p12 * this.cos_p12 * v / (1 - this.es), E = t / m, I = E - C * (1 + C) * Math.pow(E, 3) / 6 - x * (1 + 3 * C) * Math.pow(E, 4) / 24, R = 1 - C * I * I / 2 - E * I * I * I / 6, p = Math.asin(this.sin_p12 * Math.cos(I) + this.cos_p12 * Math.sin(I) * v), n = A(this.long0 + Math.asin(Math.sin(y) * Math.sin(I) / Math.cos(p))), D = Math.sin(p), a = Math.atan2((D - this.es * R * this.sin_p12) * Math.tan(p), D * (1 - this.es)), i.x = n, i.y = a, i)); +} +var D_ = ["Azimuthal_Equidistant", "aeqd"]; +const N_ = { + init: I_, + forward: T_, + inverse: A_, + names: D_ +}; +function R_() { + this.sin_p14 = Math.sin(this.lat0), this.cos_p14 = Math.cos(this.lat0); +} +function F_(i) { + var t, e, s, r, n, a, o, l, c = i.x, d = i.y; + return s = A(c - this.long0), t = Math.sin(d), e = Math.cos(d), r = Math.cos(s), a = this.sin_p14 * t + this.cos_p14 * e * r, n = 1, (a > 0 || Math.abs(a) <= T) && (o = this.a * n * e * Math.sin(s), l = this.y0 + this.a * n * (this.cos_p14 * t - this.sin_p14 * e * r)), i.x = o, i.y = l, i; +} +function G_(i) { + var t, e, s, r, n, a, o; + return i.x -= this.x0, i.y -= this.y0, t = Math.sqrt(i.x * i.x + i.y * i.y), e = qi(t / this.a), s = Math.sin(e), r = Math.cos(e), a = this.long0, Math.abs(t) <= T ? (o = this.lat0, i.x = a, i.y = o, i) : (o = qi(r * this.sin_p14 + i.y * s * this.cos_p14 / t), n = Math.abs(this.lat0) - O, Math.abs(n) <= T ? (this.lat0 >= 0 ? a = A(this.long0 + Math.atan2(i.x, -i.y)) : a = A(this.long0 - Math.atan2(-i.x, i.y)), i.x = a, i.y = o, i) : (a = A(this.long0 + Math.atan2(i.x * s, t * this.cos_p14 * r - i.y * this.sin_p14 * s)), i.x = a, i.y = o, i)); +} +var k_ = ["ortho"]; +const z_ = { + init: R_, + forward: F_, + inverse: G_, + names: k_ +}; +var ye = { + FRONT: 1, + RIGHT: 2, + BACK: 3, + LEFT: 4, + TOP: 5, + BOTTOM: 6 +}, re = { + AREA_0: 1, + AREA_1: 2, + AREA_2: 3, + AREA_3: 4 +}; +function H_() { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.lat0 = this.lat0 || 0, this.long0 = this.long0 || 0, this.lat_ts = this.lat_ts || 0, this.title = this.title || "Quadrilateralized Spherical Cube", this.lat0 >= O - se / 2 ? this.face = ye.TOP : this.lat0 <= -(O - se / 2) ? this.face = ye.BOTTOM : Math.abs(this.long0) <= se ? this.face = ye.FRONT : Math.abs(this.long0) <= O + se ? this.face = this.long0 > 0 ? ye.RIGHT : ye.LEFT : this.face = ye.BACK, this.es !== 0 && (this.one_minus_f = 1 - (this.a - this.b) / this.a, this.one_minus_f_squared = this.one_minus_f * this.one_minus_f); +} +function B_(i) { + var t = { x: 0, y: 0 }, e, s, r, n, a, o, l = { value: 0 }; + if (i.x -= this.long0, this.es !== 0 ? e = Math.atan(this.one_minus_f_squared * Math.tan(i.y)) : e = i.y, s = i.x, this.face === ye.TOP) + n = O - e, s >= se && s <= O + se ? (l.value = re.AREA_0, r = s - O) : s > O + se || s <= -(O + se) ? (l.value = re.AREA_1, r = s > 0 ? s - xe : s + xe) : s > -(O + se) && s <= -se ? (l.value = re.AREA_2, r = s + O) : (l.value = re.AREA_3, r = s); + else if (this.face === ye.BOTTOM) + n = O + e, s >= se && s <= O + se ? (l.value = re.AREA_0, r = -s + O) : s < se && s >= -se ? (l.value = re.AREA_1, r = -s) : s < -se && s >= -(O + se) ? (l.value = re.AREA_2, r = -s - O) : (l.value = re.AREA_3, r = s > 0 ? -s + xe : -s - xe); + else { + var c, d, u, f, g, m, p; + this.face === ye.RIGHT ? s = Gs(s, +O) : this.face === ye.BACK ? s = Gs(s, +xe) : this.face === ye.LEFT && (s = Gs(s, -O)), f = Math.sin(e), g = Math.cos(e), m = Math.sin(s), p = Math.cos(s), c = g * p, d = g * m, u = f, this.face === ye.FRONT ? (n = Math.acos(c), r = Tn(n, u, d, l)) : this.face === ye.RIGHT ? (n = Math.acos(d), r = Tn(n, u, -c, l)) : this.face === ye.BACK ? (n = Math.acos(-c), r = Tn(n, u, -d, l)) : this.face === ye.LEFT ? (n = Math.acos(-d), r = Tn(n, u, c, l)) : (n = r = 0, l.value = re.AREA_0); + } + return o = Math.atan(12 / xe * (r + Math.acos(Math.sin(r) * Math.cos(se)) - O)), a = Math.sqrt((1 - Math.cos(n)) / (Math.cos(o) * Math.cos(o)) / (1 - Math.cos(Math.atan(1 / Math.cos(r))))), l.value === re.AREA_1 ? o += O : l.value === re.AREA_2 ? o += xe : l.value === re.AREA_3 && (o += 1.5 * xe), t.x = a * Math.cos(o), t.y = a * Math.sin(o), t.x = t.x * this.a + this.x0, t.y = t.y * this.a + this.y0, i.x = t.x, i.y = t.y, i; +} +function V_(i) { + var t = { lam: 0, phi: 0 }, e, s, r, n, a, o, l, c, d, u = { value: 0 }; + if (i.x = (i.x - this.x0) / this.a, i.y = (i.y - this.y0) / this.a, s = Math.atan(Math.sqrt(i.x * i.x + i.y * i.y)), e = Math.atan2(i.y, i.x), i.x >= 0 && i.x >= Math.abs(i.y) ? u.value = re.AREA_0 : i.y >= 0 && i.y >= Math.abs(i.x) ? (u.value = re.AREA_1, e -= O) : i.x < 0 && -i.x >= Math.abs(i.y) ? (u.value = re.AREA_2, e = e < 0 ? e + xe : e - xe) : (u.value = re.AREA_3, e += O), d = xe / 12 * Math.tan(e), a = Math.sin(d) / (Math.cos(d) - 1 / Math.sqrt(2)), o = Math.atan(a), r = Math.cos(e), n = Math.tan(s), l = 1 - r * r * n * n * (1 - Math.cos(Math.atan(1 / Math.cos(o)))), l < -1 ? l = -1 : l > 1 && (l = 1), this.face === ye.TOP) + c = Math.acos(l), t.phi = O - c, u.value === re.AREA_0 ? t.lam = o + O : u.value === re.AREA_1 ? t.lam = o < 0 ? o + xe : o - xe : u.value === re.AREA_2 ? t.lam = o - O : t.lam = o; + else if (this.face === ye.BOTTOM) + c = Math.acos(l), t.phi = c - O, u.value === re.AREA_0 ? t.lam = -o + O : u.value === re.AREA_1 ? t.lam = -o : u.value === re.AREA_2 ? t.lam = -o - O : t.lam = o < 0 ? -o - xe : -o + xe; + else { + var f, g, m; + f = l, d = f * f, d >= 1 ? m = 0 : m = Math.sqrt(1 - d) * Math.sin(o), d += m * m, d >= 1 ? g = 0 : g = Math.sqrt(1 - d), u.value === re.AREA_1 ? (d = g, g = -m, m = d) : u.value === re.AREA_2 ? (g = -g, m = -m) : u.value === re.AREA_3 && (d = g, g = m, m = -d), this.face === ye.RIGHT ? (d = f, f = -g, g = d) : this.face === ye.BACK ? (f = -f, g = -g) : this.face === ye.LEFT && (d = f, f = g, g = -d), t.phi = Math.acos(-m) - O, t.lam = Math.atan2(g, f), this.face === ye.RIGHT ? t.lam = Gs(t.lam, -O) : this.face === ye.BACK ? t.lam = Gs(t.lam, -xe) : this.face === ye.LEFT && (t.lam = Gs(t.lam, +O)); + } + if (this.es !== 0) { + var p, y, v; + p = t.phi < 0 ? 1 : 0, y = Math.tan(t.phi), v = this.b / Math.sqrt(y * y + this.one_minus_f_squared), t.phi = Math.atan(Math.sqrt(this.a * this.a - v * v) / (this.one_minus_f * v)), p && (t.phi = -t.phi); + } + return t.lam += this.long0, i.x = t.lam, i.y = t.phi, i; +} +function Tn(i, t, e, s) { + var r; + return i < T ? (s.value = re.AREA_0, r = 0) : (r = Math.atan2(t, e), Math.abs(r) <= se ? s.value = re.AREA_0 : r > se && r <= O + se ? (s.value = re.AREA_1, r -= O) : r > O + se || r <= -(O + se) ? (s.value = re.AREA_2, r = r >= 0 ? r - xe : r + xe) : (s.value = re.AREA_3, r += O)), r; +} +function Gs(i, t) { + var e = i + t; + return e < -xe ? e += Gr : e > +xe && (e -= Gr), e; +} +var j_ = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"]; +const $_ = { + init: H_, + forward: B_, + inverse: V_, + names: j_ +}; +var Jo = [ + [1, 22199e-21, -715515e-10, 31103e-10], + [0.9986, -482243e-9, -24897e-9, -13309e-10], + [0.9954, -83103e-8, -448605e-10, -986701e-12], + [0.99, -135364e-8, -59661e-9, 36777e-10], + [0.9822, -167442e-8, -449547e-11, -572411e-11], + [0.973, -214868e-8, -903571e-10, 18736e-12], + [0.96, -305085e-8, -900761e-10, 164917e-11], + [0.9427, -382792e-8, -653386e-10, -26154e-10], + [0.9216, -467746e-8, -10457e-8, 481243e-11], + [0.8962, -536223e-8, -323831e-10, -543432e-11], + [0.8679, -609363e-8, -113898e-9, 332484e-11], + [0.835, -698325e-8, -640253e-10, 934959e-12], + [0.7986, -755338e-8, -500009e-10, 935324e-12], + [0.7597, -798324e-8, -35971e-9, -227626e-11], + [0.7186, -851367e-8, -701149e-10, -86303e-10], + [0.6732, -986209e-8, -199569e-9, 191974e-10], + [0.6213, -0.010418, 883923e-10, 624051e-11], + [0.5722, -906601e-8, 182e-6, 624051e-11], + [0.5322, -677797e-8, 275608e-9, 624051e-11] +], fr = [ + [-520417e-23, 0.0124, 121431e-23, -845284e-16], + [0.062, 0.0124, -126793e-14, 422642e-15], + [0.124, 0.0124, 507171e-14, -160604e-14], + [0.186, 0.0123999, -190189e-13, 600152e-14], + [0.248, 0.0124002, 710039e-13, -224e-10], + [0.31, 0.0123992, -264997e-12, 835986e-13], + [0.372, 0.0124029, 988983e-12, -311994e-12], + [0.434, 0.0123893, -369093e-11, -435621e-12], + [0.4958, 0.0123198, -102252e-10, -345523e-12], + [0.5571, 0.0121916, -154081e-10, -582288e-12], + [0.6176, 0.0119938, -241424e-10, -525327e-12], + [0.6769, 0.011713, -320223e-10, -516405e-12], + [0.7346, 0.0113541, -397684e-10, -609052e-12], + [0.7903, 0.0109107, -489042e-10, -104739e-11], + [0.8435, 0.0103431, -64615e-9, -140374e-14], + [0.8936, 969686e-8, -64636e-9, -8547e-9], + [0.9394, 840947e-8, -192841e-9, -42106e-10], + [0.9761, 616527e-8, -256e-6, -42106e-10], + [1, 328947e-8, -319159e-9, -42106e-10] +], Su = 0.8487, wu = 1.3523, Cu = ii / 5, q_ = 1 / Cu, Rs = 18, ua = function(i, t) { + return i[0] + t * (i[1] + t * (i[2] + t * i[3])); +}, U_ = function(i, t) { + return i[1] + t * (2 * i[2] + t * 3 * i[3]); +}; +function W_(i, t, e, s) { + for (var r = t; s; --s) { + var n = i(r); + if (r -= n, Math.abs(n) < e) + break; + } + return r; +} +function Y_() { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.long0 = this.long0 || 0, this.es = 0, this.title = this.title || "Robinson"; +} +function X_(i) { + var t = A(i.x - this.long0), e = Math.abs(i.y), s = Math.floor(e * Cu); + s < 0 ? s = 0 : s >= Rs && (s = Rs - 1), e = ii * (e - q_ * s); + var r = { + x: ua(Jo[s], e) * t, + y: ua(fr[s], e) + }; + return i.y < 0 && (r.y = -r.y), r.x = r.x * this.a * Su + this.x0, r.y = r.y * this.a * wu + this.y0, r; +} +function Z_(i) { + var t = { + x: (i.x - this.x0) / (this.a * Su), + y: Math.abs(i.y - this.y0) / (this.a * wu) + }; + if (t.y >= 1) + t.x /= Jo[Rs][0], t.y = i.y < 0 ? -O : O; + else { + var e = Math.floor(t.y * Rs); + for (e < 0 ? e = 0 : e >= Rs && (e = Rs - 1); ; ) + if (fr[e][0] > t.y) + --e; + else if (fr[e + 1][0] <= t.y) + ++e; + else + break; + var s = fr[e], r = 5 * (t.y - s[0]) / (fr[e + 1][0] - s[0]); + r = W_(function(n) { + return (ua(s, n) - t.y) / U_(s, n); + }, r, T, 100), t.x /= ua(Jo[e], r), t.y = (5 * e + r) * Ue, i.y < 0 && (t.y = -t.y); + } + return t.x = A(t.x + this.long0), t; +} +var J_ = ["Robinson", "robin"]; +const K_ = { + init: Y_, + forward: X_, + inverse: Z_, + names: J_ +}; +function Q_() { + this.name = "geocent"; +} +function e0(i) { + var t = hu(i, this.es, this.a); + return t; +} +function t0(i) { + var t = cu(i, this.es, this.a, this.b); + return t; +} +var i0 = ["Geocentric", "geocentric", "geocent", "Geocent"]; +const s0 = { + init: Q_, + forward: e0, + inverse: t0, + names: i0 +}; +var Qe = { + N_POLE: 0, + S_POLE: 1, + EQUIT: 2, + OBLIQ: 3 +}, rr = { + h: { def: 1e5, num: !0 }, + // default is Karman line, no default in PROJ.7 + azi: { def: 0, num: !0, degrees: !0 }, + // default is North + tilt: { def: 0, num: !0, degrees: !0 }, + // default is Nadir + long0: { def: 0, num: !0 }, + // default is Greenwich, conversion to rad is automatic + lat0: { def: 0, num: !0 } + // default is Equator, conversion to rad is automatic +}; +function r0() { + if (Object.keys(rr).forEach((function(e) { + if (typeof this[e] > "u") + this[e] = rr[e].def; + else { + if (rr[e].num && isNaN(this[e])) + throw new Error("Invalid parameter value, must be numeric " + e + " = " + this[e]); + rr[e].num && (this[e] = parseFloat(this[e])); + } + rr[e].degrees && (this[e] = this[e] * Ue); + }).bind(this)), Math.abs(Math.abs(this.lat0) - O) < T ? this.mode = this.lat0 < 0 ? Qe.S_POLE : Qe.N_POLE : Math.abs(this.lat0) < T ? this.mode = Qe.EQUIT : (this.mode = Qe.OBLIQ, this.sinph0 = Math.sin(this.lat0), this.cosph0 = Math.cos(this.lat0)), this.pn1 = this.h / this.a, this.pn1 <= 0 || this.pn1 > 1e10) + throw new Error("Invalid height"); + this.p = 1 + this.pn1, this.rp = 1 / this.p, this.h1 = 1 / this.pn1, this.pfact = (this.p + 1) * this.h1, this.es = 0; + var i = this.tilt, t = this.azi; + this.cg = Math.cos(t), this.sg = Math.sin(t), this.cw = Math.cos(i), this.sw = Math.sin(i); +} +function n0(i) { + i.x -= this.long0; + var t = Math.sin(i.y), e = Math.cos(i.y), s = Math.cos(i.x), r, n; + switch (this.mode) { + case Qe.OBLIQ: + n = this.sinph0 * t + this.cosph0 * e * s; + break; + case Qe.EQUIT: + n = e * s; + break; + case Qe.S_POLE: + n = -t; + break; + case Qe.N_POLE: + n = t; + break; + } + switch (n = this.pn1 / (this.p - n), r = n * e * Math.sin(i.x), this.mode) { + case Qe.OBLIQ: + n *= this.cosph0 * t - this.sinph0 * e * s; + break; + case Qe.EQUIT: + n *= t; + break; + case Qe.N_POLE: + n *= -(e * s); + break; + case Qe.S_POLE: + n *= e * s; + break; + } + var a, o; + return a = n * this.cg + r * this.sg, o = 1 / (a * this.sw * this.h1 + this.cw), r = (r * this.cg - n * this.sg) * this.cw * o, n = a * o, i.x = r * this.a, i.y = n * this.a, i; +} +function a0(i) { + i.x /= this.a, i.y /= this.a; + var t = { x: i.x, y: i.y }, e, s, r; + r = 1 / (this.pn1 - i.y * this.sw), e = this.pn1 * i.x * r, s = this.pn1 * i.y * this.cw * r, i.x = e * this.cg + s * this.sg, i.y = s * this.cg - e * this.sg; + var n = pt(i.x, i.y); + if (Math.abs(n) < T) + t.x = 0, t.y = i.y; + else { + var a, o; + switch (o = 1 - n * n * this.pfact, o = (this.p - Math.sqrt(o)) / (this.pn1 / n + n / this.pn1), a = Math.sqrt(1 - o * o), this.mode) { + case Qe.OBLIQ: + t.y = Math.asin(a * this.sinph0 + i.y * o * this.cosph0 / n), i.y = (a - this.sinph0 * Math.sin(t.y)) * n, i.x *= o * this.cosph0; + break; + case Qe.EQUIT: + t.y = Math.asin(i.y * o / n), i.y = a * n, i.x *= o; + break; + case Qe.N_POLE: + t.y = Math.asin(a), i.y = -i.y; + break; + case Qe.S_POLE: + t.y = -Math.asin(a); + break; + } + t.x = Math.atan2(i.x, i.y); + } + return i.x = t.x + this.long0, i.y = t.y, i; +} +var o0 = ["Tilted_Perspective", "tpers"]; +const l0 = { + init: r0, + forward: n0, + inverse: a0, + names: o0 +}; +function h0() { + if (this.flip_axis = this.sweep === "x" ? 1 : 0, this.h = Number(this.h), this.radius_g_1 = this.h / this.a, this.radius_g_1 <= 0 || this.radius_g_1 > 1e10) + throw new Error(); + if (this.radius_g = 1 + this.radius_g_1, this.C = this.radius_g * this.radius_g - 1, this.es !== 0) { + var i = 1 - this.es, t = 1 / i; + this.radius_p = Math.sqrt(i), this.radius_p2 = i, this.radius_p_inv2 = t, this.shape = "ellipse"; + } else + this.radius_p = 1, this.radius_p2 = 1, this.radius_p_inv2 = 1, this.shape = "sphere"; + this.title || (this.title = "Geostationary Satellite View"); +} +function c0(i) { + var t = i.x, e = i.y, s, r, n, a; + if (t = t - this.long0, this.shape === "ellipse") { + e = Math.atan(this.radius_p2 * Math.tan(e)); + var o = this.radius_p / pt(this.radius_p * Math.cos(e), Math.sin(e)); + if (r = o * Math.cos(t) * Math.cos(e), n = o * Math.sin(t) * Math.cos(e), a = o * Math.sin(e), (this.radius_g - r) * r - n * n - a * a * this.radius_p_inv2 < 0) + return i.x = Number.NaN, i.y = Number.NaN, i; + s = this.radius_g - r, this.flip_axis ? (i.x = this.radius_g_1 * Math.atan(n / pt(a, s)), i.y = this.radius_g_1 * Math.atan(a / s)) : (i.x = this.radius_g_1 * Math.atan(n / s), i.y = this.radius_g_1 * Math.atan(a / pt(n, s))); + } else this.shape === "sphere" && (s = Math.cos(e), r = Math.cos(t) * s, n = Math.sin(t) * s, a = Math.sin(e), s = this.radius_g - r, this.flip_axis ? (i.x = this.radius_g_1 * Math.atan(n / pt(a, s)), i.y = this.radius_g_1 * Math.atan(a / s)) : (i.x = this.radius_g_1 * Math.atan(n / s), i.y = this.radius_g_1 * Math.atan(a / pt(n, s)))); + return i.x = i.x * this.a, i.y = i.y * this.a, i; +} +function u0(i) { + var t = -1, e = 0, s = 0, r, n, a, o; + if (i.x = i.x / this.a, i.y = i.y / this.a, this.shape === "ellipse") { + this.flip_axis ? (s = Math.tan(i.y / this.radius_g_1), e = Math.tan(i.x / this.radius_g_1) * pt(1, s)) : (e = Math.tan(i.x / this.radius_g_1), s = Math.tan(i.y / this.radius_g_1) * pt(1, e)); + var l = s / this.radius_p; + if (r = e * e + l * l + t * t, n = 2 * this.radius_g * t, a = n * n - 4 * r * this.C, a < 0) + return i.x = Number.NaN, i.y = Number.NaN, i; + o = (-n - Math.sqrt(a)) / (2 * r), t = this.radius_g + o * t, e *= o, s *= o, i.x = Math.atan2(e, t), i.y = Math.atan(s * Math.cos(i.x) / t), i.y = Math.atan(this.radius_p_inv2 * Math.tan(i.y)); + } else if (this.shape === "sphere") { + if (this.flip_axis ? (s = Math.tan(i.y / this.radius_g_1), e = Math.tan(i.x / this.radius_g_1) * Math.sqrt(1 + s * s)) : (e = Math.tan(i.x / this.radius_g_1), s = Math.tan(i.y / this.radius_g_1) * Math.sqrt(1 + e * e)), r = e * e + s * s + t * t, n = 2 * this.radius_g * t, a = n * n - 4 * r * this.C, a < 0) + return i.x = Number.NaN, i.y = Number.NaN, i; + o = (-n - Math.sqrt(a)) / (2 * r), t = this.radius_g + o * t, e *= o, s *= o, i.x = Math.atan2(e, t), i.y = Math.atan(s * Math.cos(i.x) / t); + } + return i.x = i.x + this.long0, i; +} +var d0 = ["Geostationary Satellite View", "Geostationary_Satellite", "geos"]; +const f0 = { + init: h0, + forward: c0, + inverse: u0, + names: d0 +}; +var Mr = 1.340264, xr = -0.081106, Er = 893e-6, Or = 3796e-6, da = Math.sqrt(3) / 2; +function g0() { + this.es = 0, this.long0 = this.long0 !== void 0 ? this.long0 : 0; +} +function m0(i) { + var t = A(i.x - this.long0), e = i.y, s = Math.asin(da * Math.sin(e)), r = s * s, n = r * r * r; + return i.x = t * Math.cos(s) / (da * (Mr + 3 * xr * r + n * (7 * Er + 9 * Or * r))), i.y = s * (Mr + xr * r + n * (Er + Or * r)), i.x = this.a * i.x + this.x0, i.y = this.a * i.y + this.y0, i; +} +function p0(i) { + i.x = (i.x - this.x0) / this.a, i.y = (i.y - this.y0) / this.a; + var t = 1e-9, e = 12, s = i.y, r, n, a, o, l, c; + for (c = 0; c < e && (r = s * s, n = r * r * r, a = s * (Mr + xr * r + n * (Er + Or * r)) - i.y, o = Mr + 3 * xr * r + n * (7 * Er + 9 * Or * r), s -= l = a / o, !(Math.abs(l) < t)); ++c) + ; + return r = s * s, n = r * r * r, i.x = da * i.x * (Mr + 3 * xr * r + n * (7 * Er + 9 * Or * r)) / Math.cos(s), i.y = Math.asin(Math.sin(s) / da), i.x = A(i.x + this.long0), i; +} +var y0 = ["eqearth", "Equal Earth", "Equal_Earth"]; +const _0 = { + init: g0, + forward: m0, + inverse: p0, + names: y0 +}; +var Hr = 1e-10; +function v0() { + var i; + if (this.phi1 = this.lat1, Math.abs(this.phi1) < Hr) + throw new Error(); + this.es ? (this.en = Cl(this.es), this.m1 = Zs( + this.phi1, + this.am1 = Math.sin(this.phi1), + i = Math.cos(this.phi1), + this.en + ), this.am1 = i / (Math.sqrt(1 - this.es * this.am1 * this.am1) * this.am1), this.inverse = w0, this.forward = S0) : (Math.abs(this.phi1) + Hr >= O ? this.cphi1 = 0 : this.cphi1 = 1 / Math.tan(this.phi1), this.inverse = M0, this.forward = C0); +} +function S0(i) { + var t = A(i.x - (this.long0 || 0)), e = i.y, s, r, n; + return s = this.am1 + this.m1 - Zs(e, r = Math.sin(e), n = Math.cos(e), this.en), r = n * t / (s * Math.sqrt(1 - this.es * r * r)), i.x = s * Math.sin(r), i.y = this.am1 - s * Math.cos(r), i.x = this.a * i.x + (this.x0 || 0), i.y = this.a * i.y + (this.y0 || 0), i; +} +function w0(i) { + i.x = (i.x - (this.x0 || 0)) / this.a, i.y = (i.y - (this.y0 || 0)) / this.a; + var t, e, s, r; + if (e = pt(i.x, i.y = this.am1 - i.y), r = Ml(this.am1 + this.m1 - e, this.es, this.en), (t = Math.abs(r)) < O) + t = Math.sin(r), s = e * Math.atan2(i.x, i.y) * Math.sqrt(1 - this.es * t * t) / Math.cos(r); + else if (Math.abs(t - O) <= Hr) + s = 0; + else + throw new Error(); + return i.x = A(s + (this.long0 || 0)), i.y = Ki(r), i; +} +function C0(i) { + var t = A(i.x - (this.long0 || 0)), e = i.y, s, r; + return r = this.cphi1 + this.phi1 - e, Math.abs(r) > Hr ? (i.x = r * Math.sin(s = t * Math.cos(e) / r), i.y = this.cphi1 - r * Math.cos(s)) : i.x = i.y = 0, i.x = this.a * i.x + (this.x0 || 0), i.y = this.a * i.y + (this.y0 || 0), i; +} +function M0(i) { + i.x = (i.x - (this.x0 || 0)) / this.a, i.y = (i.y - (this.y0 || 0)) / this.a; + var t, e, s = pt(i.x, i.y = this.cphi1 - i.y); + if (e = this.cphi1 + this.phi1 - s, Math.abs(e) > O) + throw new Error(); + return Math.abs(Math.abs(e) - O) <= Hr ? t = 0 : t = s * Math.atan2(i.x, i.y) / Math.cos(e), i.x = A(t + (this.long0 || 0)), i.y = Ki(e), i; +} +var x0 = ["bonne", "Bonne (Werner lat_1=90)"]; +const E0 = { + init: v0, + names: x0 +}; +function O0(i) { + i.Proj.projections.add(Un), i.Proj.projections.add(Wn), i.Proj.projections.add(Sp), i.Proj.projections.add(Ip), i.Proj.projections.add(Fp), i.Proj.projections.add(Bp), i.Proj.projections.add(Wp), i.Proj.projections.add(Kp), i.Proj.projections.add(sy), i.Proj.projections.add(ly), i.Proj.projections.add(Ey), i.Proj.projections.add(Ty), i.Proj.projections.add(Fy), i.Proj.projections.add(Vy), i.Proj.projections.add(Wy), i.Proj.projections.add(Ky), i.Proj.projections.add(s_), i.Proj.projections.add(l_), i.Proj.projections.add(g_), i.Proj.projections.add(v_), i.Proj.projections.add(x_), i.Proj.projections.add(L_), i.Proj.projections.add(N_), i.Proj.projections.add(z_), i.Proj.projections.add($_), i.Proj.projections.add(K_), i.Proj.projections.add(s0), i.Proj.projections.add(l0), i.Proj.projections.add(f0), i.Proj.projections.add(_0), i.Proj.projections.add(E0); +} +Re.defaultDatum = "WGS84"; +Re.Proj = si; +Re.WGS84 = new Re.Proj("WGS84"); +Re.Point = Bs; +Re.toPoint = uu; +Re.defs = nt; +Re.nadgrid = Cm; +Re.transform = ha; +Re.mgrs = km; +Re.version = "__VERSION__"; +O0(Re); +const fa = $e("EPSG:4326", "EPSG:3857"), bl = $e("EPSG:3857", "EPSG:4326"); +let Pl = { + epsg: "EPSG:4326" +}; +function ga(i, t = "EPSG:") { + if (i) { + const e = new RegExp(`^(?:${t})?:?(\\d+)`, "i"), s = `${i}`.match(e); + if (s && s[1]) + return t ? t.endsWith(":") ? `${t}${s[1]}` : `${t}:${s[1]}` : s[1]; + } + return ""; +} +function Mu(i) { + let t = null; + const e = ga(i.epsg, i.prefix); + if (e) { + try { + t = Re(ga(e)); + } catch { + t = null; + } + if (i.proj4) + try { + t = Re(i.proj4); + } catch { + t = null; + } + } + return t != null; +} +function xu(i) { + const t = { + prefix: i.prefix + }; + return i.epsg && (t.epsg = ga(i.epsg, i.prefix), t.epsg && (i.proj4 && (t.proj4 = i.proj4, Re.defs(t.epsg, i.proj4), th(Re)), i.alias && Array.isArray(i.alias) && (t.alias = i.alias, t.alias.forEach((e) => { + Re.defs(e, Re.defs(t.epsg)), th(Re); + })))), t; +} +function b0(i) { + if (S(i, { + epsg: je(String, Number), + proj4: ie(String) + }), !Mu(i)) + throw new Error("Cannot set invalid projection options as default options"); + Pl = xu(i); +} +class z { + constructor(t = { epsg: "" }) { + h(this, "_proj4"); + h(this, "_epsg"); + h(this, "_alias"); + h(this, "_prefix"); + const e = xu(t); + this._proj4 = e.proj4, this._epsg = String(e.epsg), this.proj || (this._epsg = z.parseEPSGCode(Pl.epsg)), this._alias = e.alias, this._prefix = e.prefix; + } + static get className() { + return "Projection"; + } + get epsg() { + return this._epsg; + } + get proj4() { + return this._proj4; + } + get proj() { + return ef(this.epsg); + } + equals(t) { + return tf(this.proj, t.proj); + } + static transform(t, e, s) { + const r = $e(e.proj, t.proj), n = [0, 0]; + return r([s[0], s[1]], n, 2), s.length > 2 && n.push(s[2]), n; + } + transformTo(t, e) { + return z.transform(t, this, e); + } + static transformCoordinates(t, e, s) { + const r = []; + for (let n = 0; n < s.length; n++) + r.push(z.transform(t, e, s[n])); + return r; + } + /** + * returns a function to transform coordinates from source to dest + */ + static getTransformer(t, e) { + return $e(e.proj, t.proj); + } + transformFrom(t, e) { + return z.transform(this, t, e); + } + /** + * Returns the object literal representation of this object + */ + toJSON() { + const t = { + type: z.className, + epsg: this.epsg + }; + return this.proj4 && (t.proj4 = this.proj4), Array.isArray(this._alias) && this._alias.length > 0 && (t.alias = this._alias.slice()), this._prefix && (t.prefix = this._prefix), t; + } + /** + * Fast transform from Web-Mercator to WGS84 + * @param inPlace - whether to transform in place + */ + static mercatorToWgs84(t, e) { + return bl(t, e ? t : void 0, t.length); + } + /** + * Fast transform from WGS84 to Web-Mercator + * @param inPlace - whether to transform in place + */ + static wgs84ToMercator(t, e) { + return fa(t, e ? t : void 0, t.length); + } + /** + * validates projection options, combination of epsg code and proj4 + */ + static validateOptions(t) { + return Mu(t); + } + /** + * parses an epsg code returns empty string if no code has been found + * for example: + * parseEPSGCode('epsg:4326') ==> '4326' + * parseEPSGCode('epsg:4326', 'EPSG:') ==> 'EPSG:4326' + * parseEPSGCode('asdasd', 'EPSG:') ==> '' + */ + static parseEPSGCode(t, e = "EPSG:") { + return ga(t, e); + } +} +function P0() { + return new z(Pl); +} +const de = new z({ epsg: 4326 }), W = new z({ epsg: 3857 }); +function P1(i, t, e) { + const r = b.toRadians(e), n = b.toRadians(i[1]), a = b.toRadians(i[0]), o = Math.asin(Math.sin(n) * Math.cos(t / 6371e3) + Math.cos(n) * Math.sin(t / 6371e3) * Math.cos(r)), l = a + Math.atan2(Math.sin(r) * Math.sin(t / 6371e3) * Math.cos(n), Math.cos(t / 6371e3) - Math.sin(n) * Math.sin(o)); + return [ + parseFloat(b.toDegrees(l).toFixed(5)), + parseFloat(b.toDegrees(o).toFixed(5)) + ]; +} +function L1(i, t) { + const e = b.toRadians(i[0]), s = b.toRadians(i[1]), r = b.toRadians(t[0]), n = b.toRadians(t[1]), a = Math.sin(r - e) * Math.cos(n), o = Math.cos(s) * Math.sin(n) - Math.sin(s) * Math.cos(n) * Math.cos(r - e); + let l = b.toDegrees(Math.atan2(a, o)); + return l = (l + 360) % 360, l; +} +function bi(i, t) { + let e = Math.atan2(t[0] - i[0], t[1] - i[1]); + return e = e < 0 ? e + b.TWO_PI : e, e; +} +function oi(i, t) { + const e = i[0] - t[0], s = i[1] - t[1]; + return e ** 2 + s ** 2; +} +function Pi(i, t) { + return Math.sqrt(oi(i, t)); +} +function Eu(i, t) { + const e = _.fromElements(i[0], i[1], i[2]), s = _.fromElements(t[0], t[1], t[2]); + return _.distance(e, s); +} +function Ou(i, t) { + const e = _.fromElements(i[0], i[1], i[2]), s = _.fromElements(t[0], t[1], t[2]); + return _.distanceSquared(e, s); +} +function Yn(i, t) { + return (i % t + t) % t; +} +function ss(i) { + return [ + b.toDegrees(i.longitude), + b.toDegrees(i.latitude), + i.height + ]; +} +function bu(i, t) { + return ee.fromDegrees(i[0], i[1], i[2], t); +} +function wt(i, t) { + const e = z.mercatorToWgs84(i); + return _.fromDegrees(e[0], e[1], e[2], void 0, t ?? new _()); +} +function fn(i, t) { + const e = z.mercatorToWgs84(i); + return bu(e, t); +} +function I1(i) { + const t = ee.fromCartesian(i), e = ss(t); + return z.wgs84ToMercator(e); +} +function ja(i, t) { + const e = i.length, s = new Array(e); + for (let r = 0; r < e; r++) + s[r] = i[r] + (t[r] - i[r]) / 2; + return s; +} +function L0(i, t) { + let e; + i[2] > t[2] ? (e = i.slice(), e[2] = t[2]) : (e = t.slice(), e[2] = i[2]); + const s = wt(i), r = wt(t), n = wt(e); + _.subtract(r, s, r), _.subtract(n, s, n), _.normalize(r, r), _.normalize(n, n); + let a; + return i[2] > t[2] ? a = b.toDegrees(Math.acos(_.dot(r, n))) - 90 : a = b.toDegrees(Math.acos(_.dot(r, n))), a; +} +function ao(i, t) { + return i[0] * t[1] - i[1] * t[0]; +} +function I0(i, t) { + const e = [i[1][0] - i[0][0], i[1][1] - i[0][1]], s = [t[1][0] - t[0][0], t[1][1] - t[0][1]]; + if (b.equalsEpsilon(ao(e, s), 0, b.EPSILON8)) + return; + const r = [t[0][0] - i[0][0], t[0][1] - i[0][1]], n = ao(s, r) / ao(s, e); + return [i[0][0] + n * e[0], i[0][1] + n * e[1]]; +} +function T0(i, t) { + return bc(z.mercatorToWgs84(i), z.mercatorToWgs84(t)); +} +let oo = new _(), lo = new _(); +function A0(i, t) { + return oo = wt(i, oo), lo = wt(t, lo), _.distance(oo, lo); +} +bt.prototype.getCoordinates = function() { + return [this.getCenter(), this.getLastCoordinate()]; +}; +bt.prototype.setCoordinates = function(t, e) { + S(t, [[Number]]), S(t.length, 2); + const s = e || this.getLayout(), r = /XYM?/.test(s) ? Pi : Eu; + this.setCenterAndRadius(t[0], r(t[0], t[1]), e); +}; +Yi.prototype.getCoordinates = function() { + return this.getGeometriesArray().map((t) => t.getCoordinates()); +}; +Yi.prototype.setCoordinates = function(t, e) { + S(t, Array), S(t.length, this.getGeometries().length), this.setGeometries(this.getGeometries().map((s, r) => (s.setCoordinates(t[r], e), s))); +}; +const Ph = { + XY: 1, + XYM: 2, + XYZ: 3, + XYZM: 4 +}, D0 = { + XY: 2, + XYM: 3, + XYZ: 3, + XYZM: 4 +}; +function N0(i, t) { + if (!t) + return i; + if (t === "XYM" && i !== "XYM" || i === "XYM" && t !== "XYM") + return "XY"; + const e = Ph[i], s = Ph[t]; + return e < s ? i : t; +} +Yi.prototype.getLayout = function() { + let t; + return this.getGeometriesArrayRecursive().forEach((e) => { + t = N0(e.getLayout(), t); + }), t ?? "XY"; +}; +Yi.prototype.getStride = function() { + const t = this.getLayout(); + return D0[t]; +}; +Yi.prototype.getFlatCoordinates = function() { + const t = this.getStride(), e = []; + return this.getGeometriesArrayRecursive().forEach((s) => { + const r = s.getStride(), n = s.getFlatCoordinates(); + if (r === t) + e.push(n); + else if (r > t) { + const a = n.length, o = Math.round(a / r), l = new Array(o * t); + for (let c = 0; c < a; c += r) + for (let d = 0; d < t; d++) { + const u = Math.round(c / r * t); + l[u + d] = n[c + d]; + } + e.push(l); + } + }), [].concat(...e); +}; +var R0 = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function Pu(i) { + return i && i.__esModule && Object.prototype.hasOwnProperty.call(i, "default") ? i.default : i; +} +var F0 = function i(t, e) { + if (t === e) return !0; + if (t && e && typeof t == "object" && typeof e == "object") { + if (t.constructor !== e.constructor) return !1; + var s, r, n; + if (Array.isArray(t)) { + if (s = t.length, s != e.length) return !1; + for (r = s; r-- !== 0; ) + if (!i(t[r], e[r])) return !1; + return !0; + } + if (t.constructor === RegExp) return t.source === e.source && t.flags === e.flags; + if (t.valueOf !== Object.prototype.valueOf) return t.valueOf() === e.valueOf(); + if (t.toString !== Object.prototype.toString) return t.toString() === e.toString(); + if (n = Object.keys(t), s = n.length, s !== Object.keys(e).length) return !1; + for (r = s; r-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(e, n[r])) return !1; + for (r = s; r-- !== 0; ) { + var a = n[r]; + if (!i(t[a], e[a])) return !1; + } + return !0; + } + return t !== t && e !== e; +}; +const Ke = /* @__PURE__ */ Pu(F0); +function ne(i, t) { + if (i != null) { + const e = Number.parseInt(String(i), 10); + if (e != null && !Number.isNaN(e)) + return e; + } + return t; +} +function k(i, t) { + if (i != null) { + const e = Number.parseFloat(String(i)); + if (e != null && !Number.isNaN(e)) + return e; + } + return t; +} +function ma(i, t, e, s) { + const r = k(i, t); + return r < e ? e : r > s ? s : r; +} +function ce(i, t) { + return i == null ? !!t : typeof i == "boolean" ? i : i === 1 ? !0 : i === 0 ? !1 : typeof i == "string" && (i.toLowerCase() === "true" || i.toLowerCase() === "1") ? !0 : typeof i == "string" && (i.toLowerCase() === "false" || i.toLowerCase() === "0") ? !1 : !!t; +} +function $a(i, t, e) { + if (i != null) { + const s = Object.values(t).find((r) => r == i); + if (s != null) + return s; + } + return e; +} +function Ri(i, t, e) { + if (i != null) { + const s = Object.keys(t).find((r) => r == i); + if (s != null) + return t[s]; + } + return e; +} +function G0(i, t, e) { + return typeof i == "string" && t.includes(i) ? i : e; +} +var qe = []; +for (var ho = 0; ho < 256; ++ho) + qe.push((ho + 256).toString(16).slice(1)); +function k0(i, t = 0) { + return (qe[i[t + 0]] + qe[i[t + 1]] + qe[i[t + 2]] + qe[i[t + 3]] + "-" + qe[i[t + 4]] + qe[i[t + 5]] + "-" + qe[i[t + 6]] + qe[i[t + 7]] + "-" + qe[i[t + 8]] + qe[i[t + 9]] + "-" + qe[i[t + 10]] + qe[i[t + 11]] + qe[i[t + 12]] + qe[i[t + 13]] + qe[i[t + 14]] + qe[i[t + 15]]).toLowerCase(); +} +var An, z0 = new Uint8Array(16); +function H0() { + if (!An && (An = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !An)) + throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); + return An(z0); +} +var B0 = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto); +const Lh = { + randomUUID: B0 +}; +function Xe(i, t, e) { + if (Lh.randomUUID && !t && !i) + return Lh.randomUUID(); + i = i || {}; + var s = i.random || (i.rng || H0)(); + return s[6] = s[6] & 15 | 64, s[8] = s[8] & 63 | 128, k0(s); +} +const Ee = { + OFF: 1, + ERROR: 2, + WARN: 4, + INFO: 8, + DEBUG: 16 +}, vi = { + ERROR: 0, + WARN: 0, + INFO: 0, + DEBUG: 0 +}; +vi.ERROR = Ee.ERROR | Ee.WARN | Ee.INFO | Ee.DEBUG; +vi.WARN = Ee.WARN | Ee.INFO | Ee.DEBUG; +vi.INFO = Ee.INFO | Ee.DEBUG; +vi.DEBUG = Ee.DEBUG; +const nr = { + useTimestamp: !1, + logLevel: Ee.INFO +}, gn = /* @__PURE__ */ new Map(); +gn.set(Ee.ERROR, "error"); +gn.set(Ee.WARN, "warn"); +gn.set(Ee.INFO, "info"); +gn.set(Ee.DEBUG, "log"); +class Lu { + /** + * @param {string=} className + */ + constructor(t) { + this.className = t, this.deprecations = /* @__PURE__ */ new Map(); + } + /** + * Logs an error message + * @param {string} msg The message to log. + * @param {...any} optArgs + */ + error(t, ...e) { + nr.logLevel & vi.ERROR && this._log(String(t), Ee.ERROR, e); + } + /** + * Logs a warning message + * @param {string} msg The message to log. + * @param {...any} optArgs + */ + warning(t, ...e) { + nr.logLevel & vi.WARN && this._log(String(t), Ee.WARN, e); + } + /** + * Deprecate a function. deprecations are stored on the logger + * @param {string} functionName + * @param {string=} alternativeFunctionName + */ + deprecate(t, e) { + const s = String(t), r = e ? String(e) : null; + if (!this.deprecations.has(s)) { + this.deprecations.set(s, r || null); + let n = `${s} has been deprecated and will be removed`; + r && (n = `${n}. ${r}`), this.warning(n); + } + } + /** + * Logs an info message + * @param {string} msg The message to log. + * @param {...any} optArgs + */ + info(t, ...e) { + nr.logLevel & vi.INFO && this._log(String(t), Ee.INFO, e); + } + /** + * Logs a debug message + * @param {string} msg The message to log. + * @param {...any} optArgs + */ + debug(t, ...e) { + nr.logLevel & vi.DEBUG && this._log(String(t), Ee.DEBUG, e); + } + /** + * Alias for debug + * @param {string} msg The message to log. + * @param {...any} optArgs + */ + log(t, ...e) { + nr.logLevel & vi.DEBUG && this._log(String(t), Ee.DEBUG, e); + } + /** + * Logs a message + * @param {string} msg The message to log. + * @param {LOG_LEVEL} level + * @param {Array} optArgs + * @private + */ + _log(t, e, s) { + let r = t; + this.className && (r = `[${this.className}] ${r}`), console[gn.get(e)](r, ...s), e & Ee.ERROR && (console.group(), console.trace(), console.groupEnd()); + } +} +const Ko = /* @__PURE__ */ new Map(); +let co; +function V0() { + return co || (co = new Lu()), co; +} +function j0(i) { + const t = new Lu(i); + return Ko.set(i, t), t; +} +function he(i) { + return i ? Ko.has(i) ? Ko.get(i) : j0(i) : V0(); +} +const Je = Symbol("moduleId"); +var xc; +xc = Je; +class Ut { + constructor(t) { + /** + * unique Name + */ + h(this, "name"); + h(this, "properties"); + h(this, "isDestroyed"); + h(this, xc); + this.name = t.name || Xe(), this.properties = t.properties || {}, this.isDestroyed = !1; + } + static get className() { + return "VcsObject"; + } + get className() { + return this.constructor.className; + } + getLogger() { + return he(this.className); + } + toJSON() { + const t = { + type: this.className, + name: this.name + }; + return Object.keys(this.properties).length > 0 && (t.properties = JSON.parse(JSON.stringify(this.properties))), t; + } + destroy() { + this.isDestroyed = !0, this.properties = {}; + } +} +class L { + constructor() { + h(this, "_listeners", /* @__PURE__ */ new Set()); + } + /** + * The number of listeners + */ + get numberOfListeners() { + return this._listeners.size; + } + /** + * Adds an event listener. An event listener can only be added once. + * A listener added multiple times will only be called once. + * @param listener + * @returns - remove callback. call this function to remove the listener + */ + addEventListener(t) { + return this._listeners.add(t), () => { + this.removeEventListener(t); + }; + } + /** + * Removes the provided listener + * @param listener + * @returns - whether a listener was removed + */ + removeEventListener(t) { + return this._listeners.has(t) ? (this._listeners.delete(t), !0) : !1; + } + /** + * Raise the event, calling all listeners, if a listener is removed in between calling listeners, the listener is not + * called. + * @param event + */ + raiseEvent(t) { + [...this._listeners].forEach((e) => { + this._listeners.has(e) && e(t); + }); + } + async awaitRaisedEvent(t) { + const e = []; + [...this._listeners].forEach((s) => { + this._listeners.has(s) && e.push(s(t)); + }), await Promise.all(e); + } + /** + * clears all listeners + */ + destroy() { + this._listeners.clear(); + } +} +function $0() { + return he("OverrideClassRegistry"); +} +class pi { + constructor(t) { + h(this, "_coreClassRegistry"); + h(this, "_classMap", /* @__PURE__ */ new Map()); + h(this, "_classShadows", /* @__PURE__ */ new Map()); + /** + * Called if a class was replaced. Is passed the className + */ + h(this, "replaced", new L()); + /** + * Called if a class was removed. Is passed the className + */ + h(this, "removed", new L()); + this._coreClassRegistry = t; + } + getClassNames() { + return [ + .../* @__PURE__ */ new Set([ + ...this._classMap.keys(), + ...this._coreClassRegistry.getClassNames() + ]) + ]; + } + /** + * Register a class for a given module by name. If the class already exists, it will be replaced and replaced called with the classeName. + */ + registerClass(t, e, s) { + S(t, String), S(e, String), S(s, Function); + const r = { + moduleId: t, + ctor: s + }, n = this.hasClass(e); + this._classMap.has(e) && (this._classShadows.has(e) || this._classShadows.set(e, []), this._classShadows.get(e).push(this._classMap.get(e))), this._classMap.set(e, r), n && this.replaced.raiseEvent(e); + } + /** + * Unregister a previously registered class. You can only unregister classes added to this registry, not the underlying core registry. + * If when registering this class you have replaced class, it will be re-instated and replaced called. + * If there is no previously registered class, it will be removed and removed will be called. + */ + unregisterClass(t, e) { + if (S(t, String), S(e, String), this._classShadows.has(e)) { + const s = this._classShadows.get(e), r = s.filter((n) => n.moduleId !== t); + r.length === 0 ? this._classShadows.delete(e) : r.length !== s.length && this._classShadows.set(e, r); + } + this._classMap.has(e) && this._classMap.get(e).moduleId === t && (this._classMap.delete(e), this._classShadows.has(e) ? (this._classMap.set(e, this._classShadows.get(e).pop()), this._classShadows.get(e).length === 0 && this._classShadows.delete(e), this.replaced.raiseEvent(e)) : this._coreClassRegistry.hasClass(e) ? this.replaced.raiseEvent(e) : this.removed.raiseEvent(e)); + } + /** + * Gets the constructor for a registered class or undefined, if no such class was registerd + */ + getClass(t) { + return S(t, String), this._classMap.has(t) ? this._classMap.get(t).ctor : this._coreClassRegistry.getClass(t); + } + hasClass(t) { + return S(t, String), this._classMap.has(t) || this._coreClassRegistry.hasClass(t); + } + /** + * Create an object of the given className. The constructor is passed args. + */ + create(t, ...e) { + S(t, String); + const s = this.getClass(t); + if (!s) { + $0().error(`could not find constructor ${t}`); + return; + } + return new s(...e); + } + /** + * A convenience API to pass in a serialized VcsObject directly. It calls create using options.type as the className. + * Will throw an error if options.type is not a string or options is not an Object. + * Passes options and args to the constructor in that order. + */ + createFromTypeOptions(t, ...e) { + return S(t, { type: String }), this.create(t.type, t, ...e); + } + /** + * Removes all classes registered from within a certain module. Will re-instate classes overwritten by the module + * and call the appropriate events, outlined in unregisterClass. + */ + removeModule(t) { + S(t, String), this._classMap.forEach((e, s) => { + this.unregisterClass(t, s); + }); + } + /** + * Destroys the override class registry + */ + destroy() { + this._coreClassRegistry = void 0, this._classMap.clear(), this._classShadows.clear(), this.replaced.destroy(), this.removed.destroy(); + } +} +function gr() { + return he("ClassRegistry"); +} +class Qi { + constructor() { + h(this, "_classMap"); + this._classMap = /* @__PURE__ */ new Map(); + } + getClassNames() { + return [...this._classMap.keys()]; + } + /** + * Register a class by its class name. + * @param className + * @param ctor + */ + registerClass(t, e) { + if (S(t, String), S(e, Function), this._classMap.has(t)) + throw new Error("a constructor with this className has already been registered"); + this._classMap.set(t, e); + } + /** + * Gets the constructor for a registered class or undefined, if no such class was registerd + */ + getClass(t) { + if (S(t, String), this._classMap.has(t)) + return this._classMap.get(t); + } + hasClass(t) { + return S(t, String), this._classMap.has(t); + } + create(t, ...e) { + S(t, String); + const s = this.getClass(t); + if (!s) { + gr().error(`could not find constructor ${t}`); + return; + } + return new s(...e); + } + createFromTypeOptions(t, ...e) { + return S(t, { type: String }), this.create(t.type, t, ...e); + } +} +const ke = new Qi(), Js = new Qi(), Ll = new Qi(), Ks = new Qi(), mn = new Qi(), Iu = new Qi(); +function ei(i, t, ...e) { + if (!ws(i, je(Qi, pi))) + return gr().error(`ObjectCreation failed: no class registry provided for ${String(t.type)}`), null; + if (!(t != null && t.type)) + return gr().warning("ObjectCreation failed: could not find type in options"), null; + let s; + try { + s = i.createFromTypeOptions(t, ...e); + } catch (r) { + gr().warning(`Error: ${String(r)}`); + } + return s || (gr().warning("ObjectCreation failed: could not create new Object"), null); +} +class li extends Ut { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "supportedLayers", []); + /** + * The 3D representation of this style + */ + h(this, "cesiumStyle", new ea({ show: !0 })); + /** + * Fired on style updates + */ + h(this, "styleChanged", new L()); + h(this, "colorBlendMode"); + // eslint-disable-next-line class-methods-use-this + h(this, "_style", () => { + }); + this.colorBlendMode = $a(e.colorBlendMode, jn, jn.HIGHLIGHT); + } + static get className() { + return "StyleItem"; + } + /** + * The 2D representation of this style + */ + get style() { + return this._style; + } + set style(e) { + this._style = e; + } + /** + * @param className + * @todo redundant, remove + */ + isSupported(e) { + return this.supportedLayers.length === 0 || this.supportedLayers.indexOf(e) > -1; + } + toJSON() { + const e = super.toJSON(); + return this.colorBlendMode !== jn.HIGHLIGHT && (e.colorBlendMode = this.colorBlendMode), e; + } + /** + * Clones this style. Does not pass the name property. + * @param {StyleItem=} _result + * @returns {StyleItem} + */ + clone(e) { + return this; + } + /** + * @param styleItem + */ + assign(e) { + return this.properties = JSON.parse(JSON.stringify(e.properties)), this; + } + /** + * Tests if two styleItems are equivalent. Does not match the name property (e.g. identifier) + * @param styleItem + */ + equals(e) { + if (this !== e) { + const s = this.toJSON(); + delete s.name; + const r = e.toJSON(); + return delete r.name, Ke(s, r); + } + return !0; + } + _styleChanged() { + this.styleChanged.raiseEvent(); + } + destroy() { + this.cesiumStyle = new ea(), this.styleChanged.destroy(), super.destroy(); + } +} +mn.registerClass(li.className, li); +function gi(i) { + const { location: t } = window, e = new URL(i, `${t.protocol}//${t.host}${t.pathname}`); + return e.host ? e.protocol === t.protocol && e.host === t.host : !0; +} +function Il() { + return he("StyleHelpers"); +} +var pa; +(function(i) { + i[i.NWSE = 1] = "NWSE", i[i.SWNE = 2] = "SWNE", i[i.DIAGONALCROSS = 3] = "DIAGONALCROSS", i[i.NS = 4] = "NS", i[i.WE = 5] = "WE", i[i.CROSS = 6] = "CROSS"; +})(pa || (pa = {})); +function q0(i, t) { + let e = i.substring(1); + return e.length === 3 && (e = e.replace(/([\w\d])/g, "$1$1")), [ + parseInt(e.substring(0, 2), 16), + parseInt(e.substring(2, 4), 16), + parseInt(e.substring(4, 6), 16), + t ?? 1 + ]; +} +function Fi(i) { + const t = i.toBytes(); + return t[3] /= 255, t; +} +function U0(i, t) { + return U.fromBytes(i[0], i[1], i[2], (i[3] || 1) * 255, t); +} +function We(i, t) { + if (Array.isArray(i)) + return i.length === 3 && i.push(1), i; + if (typeof i == "string") { + if (/^#/.test(i)) + return q0(i); + if (/^rgba?\((\d+(,\s?)?){3}((0|1)(\.\d+)?)?\)/.test(i)) { + const e = i.replace(/^rgba?\(([\s\S]+?)\)/, "$1").replace(/\s/, "").split(",").map((s) => Number(s)); + return e.length === 3 && e.push(1), e; + } + } + if (i instanceof CanvasPattern) + return [255, 255, 255, 0.4]; + if (t) + return t; + throw new Error(`Cannot parse color ${String(i)}`); +} +function ri(i, t) { + const e = We(i, t); + return U.fromBytes(e[0], e[1], e[2], e[3] * 255); +} +function mt(i) { + return `rgba(${We(i).join(",")})`; +} +function W0(i, t) { + const e = sf, s = t || document.createElement("canvas"); + (!t || !s.width) && (s.width = (i.pattern.size || 10) * e, s.height = (i.pattern.size || 10) * e); + const r = s.getContext("2d"); + if (!r) + return null; + const n = s.width; + r.fillStyle = mt(i.color), r.fillRect(0, 0, n, n); + function a(o, l) { + r.strokeStyle = mt(i.pattern.color), r.lineWidth = i.pattern.width, r.lineCap = "square", r.beginPath(), r.moveTo(o[0], o[1]), r.lineTo(l[0], l[1]), r.stroke(); + } + switch (i.pattern.type) { + case 1: + a([n / 2, n], [n, n / 2]), a([0, n / 2], [n / 2, 0]); + break; + case 2: + a([n / 2, n], [0, n / 2]), a([n, n / 2], [n / 2, 0]); + break; + case 3: + a([n / 2, n], [n, n / 2]), a([0, n / 2], [n / 2, 0]), a([n / 2, n], [0, n / 2]), a([n, n / 2], [n / 2, 0]); + break; + case 4: + a([n / 2, 0], [n / 2, n]); + break; + case 5: + a([0, n / 2], [n, n / 2]); + break; + case 6: + a([n / 2, 0], [n / 2, n]), a([0, n / 2], [n, n / 2]); + break; + default: + return null; + } + return r.createPattern(s, "repeat"); +} +function Ih(i) { + function t(e) { + const s = e.toString(16); + return s.length === 1 ? `0${s}` : s; + } + return i.slice(0, 3).reduce((e, s) => `${e}${t(s)}`, "#"); +} +function T1(i) { + return /^#[0-9a-f]{6}$/.test(i); +} +function A1(i) { + if (typeof i != "string") + return i; + let t = null, e = null, s = "normal", r = "normal", n = "normal", a = "normal"; + if (i.split(/\s+/).forEach((o) => { + switch (o) { + case "normal": + break; + case "italic": + case "oblique": + s = o; + break; + case "small-caps": + n = o; + break; + case "bold": + case "bolder": + case "lighter": + case "100": + case "200": + case "300": + case "400": + case "500": + case "600": + case "700": + case "800": + case "900": + r = o; + break; + default: + if (!e) { + const l = o.split("/"); + e = l[0], l.length > 1 && (a = l[1]); + break; + } + t ? t = `${t} ${o}` : t = o; + break; + } + }), !(t && e)) + throw new Error(`Failed to parse font: ${i}`); + return { + fontStyle: s, + fontVariant: n, + fontWeight: r, + fontSize: e, + lineHeight: a, + fontFamily: t + }; +} +function Y0(i) { + const t = [ + "fontStyle", + "fontVariant", + "fontWeight", + "fontSize", + "fontFamily" + ]; + let e = null; + return Object.entries(i).filter((s) => s[1] !== "normal" && s[0] !== "lineWeight").sort((s, r) => { + const n = t.indexOf(s[0]), a = t.indexOf(r[0]); + return n < a ? -1 : n > a ? 1 : 0; + }).forEach((s) => { + e ? e = `${e} ${s[1]}` : e = s[1]; + }), e || ""; +} +function D1(i, t, e, s) { + const r = s || [0, 0], n = i.getImageData(r[0], r[1], e[0], e[1]), { data: a } = n, [o, l, c] = t, d = a.length; + for (let u = 0; u < d; u += 4) + a[u] = o, a[u + 1] = l, a[u + 2] = c; + i.putImageData(n, r[0], r[1]); +} +function ya(i) { + let t = i.getColor(); + try { + t = We(t).slice(); + } catch (e) { + Il().warning(e.message); + } + return { color: t }; +} +function Tu(i) { + return new et(i); +} +function Tl(i) { + return new Be(i); +} +function Br(i) { + let t = i.getColor(); + if (t) + try { + t = We(t).slice(); + } catch (r) { + Il().warning(r.message); + } + const e = { + color: t + }; + i.getWidth() != null && (e.width = i.getWidth()); + const s = i.getLineDash(); + return s && (e.lineDash = s), e; +} +function Au(i) { + return { + font: i.getFont(), + fill: i.getFill() ? ya(i.getFill()) : void 0, + stroke: i.getStroke() ? Br(i.getStroke()) : void 0, + textBaseline: i.getTextBaseline(), + offsetY: i.getOffsetY(), + offsetX: i.getOffsetX(), + text: i.getText() + }; +} +function Du(i) { + const t = { ...i }; + return t.fill && !(t.fill instanceof et) && (t.fill = new et(t.fill)), t.stroke && !(t.stroke instanceof Be) && (t.stroke = new Be(t.stroke)), t.font && typeof t.font != "string" && (t.font = Y0(t.font)), new on(t); +} +function Nu(i) { + if (i instanceof ni) { + const t = { + scale: i.getScale() + }; + try { + const e = i.getColor() ? We(i.getColor()) : void 0; + e && (t.color = e); + } catch (e) { + Il().warning(e.message); + } + if (i.getSrc() && (t.src = i.getSrc()), i.getOpacity() != null && (t.opacity = i.getOpacity()), i.getAnchor() && i.getSize()) { + const e = i.getAnchor()[0] / i.getSize()[0], s = i.getAnchor()[1] / i.getSize()[1]; + t.anchor = [e, s]; + } + return t; + } else if (i instanceof Vi) { + const t = { + scale: i.getScale() + }; + return i.getFill() && (t.fill = ya(i.getFill())), i.getRadius() != null && (t.radius = i.getRadius()), i.getStroke() && (t.stroke = Br(i.getStroke())), t; + } else if (i instanceof Us) { + const t = { + scale: i.getScale() + }; + return i.getFill() && (t.fill = ya(i.getFill())), i.getPoints() && (t.points = i.getPoints()), i.getAngle() && (t.angle = i.getAngle()), i.getRotation() && (t.rotation = i.getRotation()), i.getRadius() != null && (t.radius = i.getRadius()), i.getRadius2() != null && (t.radius2 = i.getRadius2()), i.getStroke() && (t.stroke = Br(i.getStroke())), t; + } + throw new Error("no Subclass of ImageStyle found"); +} +function X0(i) { + if (i.radius) { + const t = i.fill ? Tu(i.fill) : void 0, e = i.stroke ? Tl(i.stroke) : void 0; + return i.points ? new Us({ + fill: t, + stroke: e, + points: i.points, + radius: i.radius, + radius2: i.radius2, + scale: i.scale, + angle: i.angle, + rotation: i.rotation + }) : new Vi({ + fill: t, + stroke: e, + radius: i.radius, + scale: i.scale + }); + } else { + const t = { + src: i.src, + scale: i.scale, + opacity: i.opacity, + color: i.color, + anchor: i.anchor + }; + return i.src && (fi.contains(i.src) ? t.crossOrigin = "use-credentials" : gi(i.src) || (t.crossOrigin = "anonymous")), new ni(t); + } +} +function N1(i) { + return new K({ + stroke: i.stroke ? Tl(i.stroke) : void 0, + fill: i.fill ? Tu(i.fill) : void 0, + image: i.image ? X0(i.image) : void 0, + text: i.text ? Du(i.text) : void 0 + }); +} +function R1(i) { + return { + fill: i.getFill() ? ya(i.getFill()) : void 0, + stroke: i.getStroke() ? Br(i.getStroke()) : void 0, + image: i.getImage() ? Nu(i.getImage()) : void 0, + text: i.getText() ? Au(i.getText()) : void 0 + }; +} +function F1(i) { + const t = { + font: i.getFont(), + textShadow: void 0, + color: void 0 + }; + if (i.getStroke()) { + let e = i.getStroke().getWidth(); + e = e > 1 ? 1 : e; + const s = Ih(We(i.getStroke().getColor())); + t.textShadow = `-${e}px ${e}px 0 ${s},${e}px ${e}px 0 ${s},${e}px -${e}px 0 ${s},-${e}px -${e}px 0 ${s}`; + } + return i.getFill() && (t.color = Ih(We(i.getFill().getColor()))), t; +} +const Z0 = new K({}), G1 = [0, 0, 0, 0], Xn = [255, 255, 255, 1], _a = [0, 0, 0, 1]; +function Ru() { + return { + image: { + fill: { + color: [255, 255, 255, 0.4] + }, + stroke: { + color: _a, + width: 1 + }, + radius: 5 + }, + stroke: { + color: [51, 153, 204, 1], + width: 1.25 + }, + fill: { + color: [255, 255, 255, 0.4] + }, + text: { + font: "bold 18px sans-serif", + textBaseline: "bottom", + offsetY: -15, + offsetX: 0 + } + }; +} +var Ec; +const J0 = { + olcs_color: mt(Xn), + olcs_scale: "1.0", + olcs_outlineWidth: "0.0", + olcs_outlineColor: mt(_a), + olcs_pointSize: "8.0", + olcs_image: String(null), + olcs_font: `'${(Ec = Ru().text) == null ? void 0 : Ec.font}'`, + olcs_fontColor: mt(_a), + olcs_fontOutlineWidth: "1.0", + olcs_fontOutlineColor: mt(Xn), + olcs_labelText: String(null), + olcs_anchorLineColor: mt(Xn) +}; +function zt(i, t) { + const e = `Boolean(\${${i}})===true`, s = t ? `color(\${${i}})` : `\${${i}}`; + return [ + [e, s], + ["true", J0[i]] + ]; +} +const k1 = ( + // eslint-disable-next-line no-template-curly-in-string + "${attributes} !== undefined && ${attributes} !== null && ${attributes.olcs_extrudedHeight} !== undefined && ${attributes.olcs_extrudedHeight}!==null" +); +function Fu(i) { + return i.fill && !(i.fill instanceof et) && (i.fill = new et(i.fill)), i.stroke && !(i.stroke instanceof Be) && (i.stroke = new Be(i.stroke)), i.points ? new Us(i) : new Vi(i); +} +class K0 { + constructor() { + h(this, "shapes", []); + } + addImage(t) { + const s = Fu({ ...t }).getImage(1); + t.src = s.toDataURL(), this.shapes.push(t); + } +} +const Q0 = new K0(), Th = { + fill: new et({ color: [255, 255, 255, 1] }), + stroke: new Be({ color: [0, 0, 0, 1], width: 1 }), + radius: 16 +}; +[ + null, + { points: 3 }, + { points: 3, angle: Math.PI }, + { points: 4, angle: Math.PI / 4 }, + { points: 6 } +].forEach((i) => { + const t = i ? Object.assign(i, Th) : Th; + Q0.addImage(t); +}); +class pn extends et { + static fromFill(t) { + return new pn({ color: t.getColor() }); + } + toFill(t) { + const e = t ?? new et(); + return e.setColor(this.getColor()), e; + } +} +var va; +(function(i) { + i[i.POLYGON = 1] = "POLYGON", i[i.POLYLINE = 2] = "POLYLINE", i[i.POINT = 3] = "POINT"; +})(va || (va = {})); +const yt = Symbol("VcsVectorStyleItem"); +class ge extends li { + constructor(e) { + super(e); + h(this, "exclude"); + h(this, "_fillOptions"); + h(this, "_fill"); + h(this, "_stroke"); + h(this, "_text"); + h(this, "_label"); + h(this, "_cesiumColor"); + h(this, "_image"); + if (this.validateOptions(e), this.exclude = { + fill: e.fill === !1, + stroke: e.stroke === !1, + image: e.image === !1 + }, this._fillOptions = null, this._fill = void 0, this._stroke = e.stroke ? Tl(e.stroke) : void 0, this._text = void 0, e.text && (this._text = Du(e.text)), this._label = e.label, this.label = this._label, this._cesiumColor = new U(), this._image = void 0, e.image) + if (e.image.radius) + this._image = Fu({ ...e.image }); + else { + const s = { ...e.image }; + s.src && (fi.contains(s.src) ? s.crossOrigin = "use-credentials" : gi(s.src) || (s.crossOrigin = "anonymous")), this._image = new ni(s); + } + this._style = new K({ + image: this._image, + stroke: this._stroke, + text: this._text + }), e.fill ? (this._fillOptions = structuredClone(e.fill), this._setFill()) : this.updateCesiumStyle(); + } + static get className() { + return "VectorStyleItem"; + } + validateOptions(e) { + var n, a; + const s = (o) => { + try { + o.color = We(o.color), S(o.color, [Number]), S(o.color.length, je(3, 4)); + } catch (l) { + this.getLogger().error(l.message), o.color = [255, 255, 255, 0.4]; + } + }, r = (o) => { + s(o), o.width || (this.getLogger().error("missing width for stroke, setting to 1.5"), o.width = 1.5); + }; + e.fill && (s(e.fill), e.fill.pattern && (r(e.fill.pattern), e.fill.pattern.type && Object.values(pa).includes(e.fill.pattern.type) || (this.getLogger().error(`Cannot find pattern ${e.fill.pattern.type}`), e.fill.pattern.type = pa.NWSE))), e.stroke && r(e.stroke), e.image && (e.image.icon ? e.image = e.image.icon : e.image.circle && (e.image = e.image.circle), e.image.src || e.image.radius || (this.getLogger().error("missing source or label in style, setting default circle"), e.image = { + fill: { + color: "rgba(255,255,255,0.4)" + }, + stroke: { + color: "#3399CC", + width: 1 + }, + radius: 5 + }), e.image.radius && (e.image.radius = Number(e.image.radius), Number.isFinite(e.image.radius) || (this.getLogger().error("radius must be a number"), e.image.radius = 5), (n = e.image.fill) != null && n.color && s(e.image.fill), (a = e.image.stroke) != null && a.color && r(e.image.stroke))); + } + /** + * the current fill color, not the pattern + */ + get fillColor() { + return this._fillOptions ? this._fillOptions.color : void 0; + } + set fillColor(e) { + this.exclude.fill = !1, this._style instanceof K ? e ? (this._fillOptions ? this._fillOptions.color = We(e) : this._fillOptions = { color: We(e) }, this._setFill()) : (this._fillOptions = null, this._fill = void 0, this._style.setFill(this._fill), this.updateCesiumStyleColor(!0)) : this.getLogger().info("trying to set fill on a style function"); + } + /** + * the current fill color as a cesium color + */ + get cesiumFillColor() { + const e = this.fillColor ? this.fillColor.slice() : null; + return e ? U0(e, this._cesiumColor) : U.RED.clone(this._cesiumColor); + } + get pattern() { + return this._fillOptions && this._fillOptions.pattern ? this._fillOptions.pattern : void 0; + } + set pattern(e) { + if (!this._fillOptions) { + this.getLogger().error("Missing fill color"); + return; + } + e ? (S(e, ie(Fg({ + color: je(String, [Number]), + width: Number, + type: Number, + size: ie(Number) + }))), this._fillOptions.pattern = e) : this._fillOptions.pattern = void 0, this._setFill(); + } + get stroke() { + return this._stroke; + } + set stroke(e) { + this.exclude.stroke = !1, this._style instanceof K ? (S(e, ie(Be)), this._style.setStroke(e), this._stroke = e, this.updateCesiumStyleColor(!0)) : this.getLogger().info("trying to set stroke on a style function"); + } + get label() { + return this._label; + } + set label(e) { + S(e, ie(String)), e ? this._label = e : this._label = void 0, this._text && this._text.setText(e); + } + get text() { + return this._text; + } + set text(e) { + var s, r; + this._style instanceof K ? (S(e, ie(on)), this._text = e, (r = (s = this._text) == null ? void 0 : s.setText) == null || r.call(s, this._label), this._style.setText(this._text)) : this.getLogger().info("trying to set text on a style function"); + } + get image() { + return this._image; + } + set image(e) { + this.exclude.image = !1, this._style instanceof K ? (S(e, ie(Pc)), this._image = e, this._style.setImage(this._image), this.updateCesiumStyle()) : this.getLogger().info("trying to set text on a style function"); + } + get style() { + return this._style; + } + set style(e) { + S(e, ie(je(K, Function))), e instanceof K ? (this._stroke = e.getStroke() ?? void 0, this._fill = e.getFill() ?? void 0, this._text = e.getText() ?? void 0, this._image = e.getImage() ?? void 0) : (this._stroke = void 0, this._fill = void 0, this._text = void 0, this._image = void 0), this._style = e, this._fill && this._fill.getColor() && (this._fillOptions = { + color: We(this._fill.getColor()) + }), this._text && this._text.setText(this._label), this.updateCesiumStyle(); + } + _setFill() { + var e, s, r, n; + if (this._style instanceof K) { + const a = (e = this._fillOptions) != null && e.pattern ? W0(this._fillOptions) : (s = this._fillOptions) == null ? void 0 : s.color; + if (!a) + return; + this._fill ? this._fill.setColor(a) : (this._fill = ((r = this._fillOptions) == null ? void 0 : r.type) === "modelFill" ? new pn({ color: a }) : new et({ color: a }), this._style.setFill(this._fill)), (n = this._fillOptions) != null && n.pattern && (this._fill.fallBackColor = this._fillOptions.color), this.updateCesiumStyle(); + } + } + updateCesiumStyle() { + this.updateCesiumStyleColor(!0), this.updateCesiumStyleImage(!0), this.updateCesiumStyleText(!0), this._styleChanged(); + } + updateCesiumStyleColor(e) { + const s = zt("olcs_color", !0); + this.stroke && this.stroke.getColor() && s.splice(1, 0, [ + `\${olcs_geometryType}===${va.POLYLINE}`, + mt(this.stroke.getColor()) + ]), this._image instanceof Vi && this._image.getFill() && s.splice(1, 0, [ + `\${olcs_geometryType}===${va.POINT}`, + mt(this._image.getFill().getColor()) + ]), this.fillColor && s.splice(-1, 1, ["true", mt(this.fillColor)]), this.cesiumStyle.color = { conditions: s }, e || this._styleChanged(); + } + updateCesiumStyleImage(e) { + var l; + const s = zt("olcs_scale"), r = zt("olcs_outlineWidth"), n = zt("olcs_outlineColor", !0), a = zt("olcs_pointSize"), o = zt("olcs_image"); + if (this._image) + if (this._image.getScale() != null && s.splice(1, 1, [ + "true", + `${String(this._image.getScale())}` + ]), this._image instanceof Vi) { + const c = this._image.getStroke(); + let d = this._image.getRadius() * 2; + if (c) { + (l = this._image.getStroke()) != null && l.getColor() && n.splice(1, 1, [ + "true", + mt(this._image.getStroke().getColor()) + ]); + const u = this._image.getStroke().getWidth(); + r.splice(1, 1, ["true", `${u}`]), d -= u; + } + a.splice(1, 1, ["true", `${d}`]); + } else if (this._image instanceof Us) { + const c = this._image.getImage(1).toDataURL(); + o.splice(1, 1, ["true", `"${c}"`]); + } else this._image instanceof ni && o.splice(1, 1, [ + "true", + `"${String(this._image.getSrc())}"` + ]); + this.cesiumStyle.scale = { conditions: s }, this.cesiumStyle.pointOutlineWidth = { + // @ts-ignore + conditions: r + }, this.cesiumStyle.pointOutlineColor = { + // @ts-ignore + conditions: n + }, this.cesiumStyle.pointSize = { conditions: a }, this.cesiumStyle.image = { conditions: o }, this.cesiumStyle.verticalOrigin = "1", this.cesiumStyle.horizontalOrigin = "0", e || this._styleChanged(); + } + updateCesiumStyleText(e) { + var c, d; + const s = zt("olcs_font"), r = zt("olcs_labelText"), n = zt("olcs_fontColor", !0), a = zt("olcs_fontOutlineWidth"), o = zt("olcs_fontOutlineColor", !0); + this._text && (this._text.getFont() && s.splice(1, 1, [ + "true", + `'${String(this._text.getFont())}'` + ]), this._text.getText() && r.splice(1, 1, [ + "true", + `'${String(this._text.getText())}'` + ]), (c = this._text.getFill()) != null && c.getColor() && n.splice(1, 1, [ + "true", + mt(this._text.getFill().getColor()) + ]), (d = this._text.getStroke()) != null && d.getColor() && (o.splice(1, 1, [ + "true", + mt(this._text.getStroke().getColor()) + ]), a.splice(1, 1, [ + "true", + `${this._text.getStroke().getWidth() || 1.25}` + ]))), this.cesiumStyle.font = { conditions: s }, this.cesiumStyle.labelText = { conditions: r }, this.cesiumStyle.labelColor = { conditions: n }, this.cesiumStyle.labelOutlineWidth = { + // @ts-ignore + conditions: a + }, this.cesiumStyle.labelOutlineColor = { + // @ts-ignore + conditions: o + }, this.cesiumStyle.labelStyle = "Boolean(${olcs_fontOutlineWidth}) === true ? 2 : 0", this.cesiumStyle.labelHorizontalOrigin = "0"; + let l = Lt.CENTER; + if (this._text) + switch (this._text.getTextBaseline()) { + case "top": + l = Lt.TOP; + break; + case "middle": + l = Lt.CENTER; + break; + case "bottom": + l = Lt.BOTTOM; + break; + case "alphabetic": + l = Lt.TOP; + break; + case "hanging": + l = Lt.BOTTOM; + break; + } + this.cesiumStyle.labelVerticalOrigin = l, e || this._styleChanged(); + } + clone(e) { + if (e) + return e.style = this._style instanceof K ? this._style.clone() : this._style, this._fillOptions && this._fillOptions.color && (e.fillColor = this._fillOptions.color.slice(), this._fillOptions.pattern && (e.pattern = { ...this._fillOptions.pattern })), Object.keys(this.exclude).forEach((r) => { + this.exclude[r] && e.unset(r); + }), e; + const s = this.toJSON(); + return delete s.name, new ge(s); + } + assign(e) { + return super.assign(e), e.fillColor && (this.fillColor = e.fillColor.slice()), e.pattern ? this.pattern = { ...e.pattern } : this.pattern = void 0, e.stroke && (this.stroke = e.stroke.clone()), e.image && (this.image = e.image.clone()), e.text && (this.text = e.text.clone()), e.label && (this.label = e.label), Object.keys(e.exclude).forEach((s) => { + e.exclude[s] && this.unset(s); + }), this; + } + toJSON() { + const e = super.toJSON(); + this._fillOptions ? (e.fill = { + color: We(this._fillOptions.color).slice() + }, this._fillOptions.pattern && (e.fill.pattern = { ...this._fillOptions.pattern })) : this.exclude.fill && (e.fill = !1), this._stroke ? e.stroke = Br(this._stroke) : this.exclude.stroke && (e.stroke = !1), this._text && (e.text = Au(this._text)), this._label && (e.label = this._label); + const s = this._image ? Nu(this._image) : void 0; + return s ? e.image = s : this.exclude.image && (e.image = !1), e; + } + getOptionsForFeature(e) { + var l, c; + const s = (l = e.getGeometry()) == null ? void 0 : l.getType(), r = !!e.get("olcs_extrudedHeight"), n = /* @__PURE__ */ new Set(); + s === "Point" || s === "MultiPoint" ? (((c = e[yt]) == null ? void 0 : c.label) != null && (n.add("text"), n.add("label")), n.add("image"), r && n.add("stroke")) : s === "LineString" || s === "MultiLineString" ? (n.add("stroke"), r && n.add("fill")) : s === "Polygon" || s === "MultiPolygon" || s === "Circle" ? (n.add("stroke"), n.add("fill")) : s === "GeometryCollection" && (n.add("stroke"), n.add("fill"), n.add("image"), n.add("text")); + const a = this.toJSON(), o = {}; + return n.forEach((d) => { + o[d] = a[d]; + }), o; + } + /** + * Exclude a section from this style. Excluded section are not returned and cannot be assigned via .assign. + * Setting the section over a property will remove it from the excluded sections. + * @param section - one of fill, stroke, image + */ + unset(e) { + S(e, je(...Object.keys(this.exclude))), e === "fill" ? this.fillColor = void 0 : this[e] = void 0, this.exclude[e] = !0; + } + destroy() { + this._image = void 0, this._stroke = void 0, this._fill = void 0, this._label = void 0, this._text = void 0, this._style = () => { + }, super.destroy(); + } +} +const gs = new ge(Ru()); +mn.registerClass(ge.className, ge); +function ev(i) { + var e; + const t = i.toBytes(); + return t[3] /= 255, new ge({ + fill: { color: t }, + stroke: { + color: t, + width: (e = gs.stroke) == null ? void 0 : e.getWidth() + } + }); +} +const Mi = Symbol("originalStyle"), Ie = Symbol("highlighted"), Ct = Symbol("hidden"), Mt = Symbol("globalHidden"); +var fe; +(function(i) { + i[i.HIGHLIGHT = 1] = "HIGHLIGHT", i[i.UNHIGHLIGHT = 2] = "UNHIGHLIGHT", i[i.HIDE = 3] = "HIDE", i[i.SHOW = 4] = "SHOW"; +})(fe || (fe = {})); +function yn(i) { + return i && i.content && !i.content.isDestroyed() && !i.content.batchTable.isDestroyed(); +} +function Vr(i) { + (i instanceof Xi || i instanceof Zi) && yn(i) || i instanceof Ji ? i.show = !1 : i instanceof ue && i.changed(); +} +function Sa(i) { + Reflect.has(i, Mi) || ((i instanceof Xi || i instanceof Zi) && yn(i) ? i[Mi] = i.color.clone() : i instanceof ue && (i[Mi] = i.getStyle())); +} +function Gu(i) { + if (!(i[Mt] || i[Ct] || i[Ie])) { + const t = i[Mi]; + t && (i instanceof Xi || i instanceof Zi) && yn(i) ? i.color = t : i instanceof ue && i.changed(), delete i[Mi]; + } +} +function jr(i) { + if (!(i[Mt] || i[Ct])) { + const t = i[Ie]; + (i instanceof Xi || i instanceof Zi) && yn(i) && t ? i.color = t.cesiumFillColor : i instanceof ue && i.changed(); + } +} +function Al(i) { + delete i[Mi], Sa(i), i[Ct] || i[Mt] ? Vr(i) : i[Ie] && jr(i); +} +function tv(i) { + delete i[Ie], Gu(i); +} +function ku(i, t) { + delete i[t], i[Ct] || i[Mt] || (((i instanceof Xi || i instanceof Zi) && yn(i) || i instanceof Ji) && (i.show = !0), i[Ie] ? jr(i) : Gu(i)); +} +function iv(i, t) { + function e({ action: n, ids: a }) { + if (n === fe.HIGHLIGHT) { + const o = {}; + a.forEach((l) => { + o[l] = i.highlightedObjects[l].style; + }), t.highlight(o); + } else n === fe.UNHIGHLIGHT ? t.unHighlight(a) : n === fe.HIDE ? t.hideObjects(a) : n === fe.SHOW && t.showObjects(a); + } + const s = Object.keys(i.highlightedObjects); + s.length > 0 && e({ action: fe.HIGHLIGHT, ids: s }); + const r = Object.keys(i.hiddenObjects); + return r.length > 0 && e({ action: fe.HIDE, ids: r }), i.changed.addEventListener(e); +} +class qa { + constructor() { + h(this, "hiddenObjects", {}); + h(this, "highlightedObjects", {}); + h(this, "lastUpdated", Date.now()); + /** + * An event raised when the hidden or highlighted ids change. Is called with + * {@link FeatureVisibilityEvent} as its only argument + */ + h(this, "changed", new L()); + } + /** + * highlights a number of features by ID (import("@vcmap-cesium/engine").Cesium3DTileFeature|ol/Feature) with the given color. + */ + highlight(t) { + const e = []; + Object.entries(t).forEach(([s, r]) => { + var a; + let n; + if (r instanceof U) + n = ev(r); + else if (r instanceof K) { + n = new ge({}); + const o = (a = r.getText()) == null ? void 0 : a.getText(); + o && !Array.isArray(o) && (n.label = String(o)), n.style = r; + } else ws(r, Function) ? (n = new ge({}), n.style = r) : n = r; + this.highlightedObjects[s] ? this.highlightedObjects[s].style !== n && (this.highlightedObjects[s].style = n, this.highlightedObjects[s].features.forEach((o, l) => { + l[Ie] = n, jr(l); + })) : (this.highlightedObjects[s] = { + style: n, + features: /* @__PURE__ */ new Set() + }, e.push(s)); + }), e.length > 0 && (this.lastUpdated = Date.now(), this.changed.raiseEvent({ + action: fe.HIGHLIGHT, + ids: e + })); + } + /** + * unhighlights a number of features given by the ID (import("@vcmap-cesium/engine").Cesium3DTileFeature|import("ol").Feature) + * @param toUnHighlight Array with IDS to unhighlight + */ + unHighlight(t) { + const e = []; + t.forEach((s) => { + this.highlightedObjects[s] && (this.highlightedObjects[s].features.forEach((r) => { + tv(r); + }), delete this.highlightedObjects[s], e.push(s)); + }), e.length > 0 && this.changed.raiseEvent({ + action: fe.UNHIGHLIGHT, + ids: e + }); + } + /** + * clears all highlighted objects + */ + clearHighlighting() { + this.unHighlight(Object.keys(this.highlightedObjects)); + } + hasHighlightFeature(t, e) { + return this.highlightedObjects[t] && this.highlightedObjects[t].features.has(e); + } + addHighlightFeature(t, e) { + this.highlightedObjects[t] && (Sa(e), this.highlightedObjects[t].features.add(e), e[Ie] = this.highlightedObjects[t].style, jr(e)); + } + /** + * hides a number of objects + * @param toHide A list of Object Ids which will be hidden + */ + hideObjects(t) { + const e = []; + t.forEach((s) => { + this.hiddenObjects[s] || (this.hiddenObjects[s] = /* @__PURE__ */ new Set(), e.push(String(s))); + }), e.length > 0 && (this.lastUpdated = Date.now(), this.changed.raiseEvent({ + action: fe.HIDE, + ids: e + })); + } + /** + * unHides a number of objects + * @param unHide A list of Object Ids which will be unHidden + */ + showObjects(t) { + const e = []; + t.forEach((s) => { + this.hiddenObjects[s] && (this.hiddenObjects[s].forEach((r) => { + ku(r, Ct); + }), delete this.hiddenObjects[s], e.push(String(s))); + }), e.length > 0 && this.changed.raiseEvent({ + action: fe.SHOW, + ids: e + }); + } + /** + * clears all the hidden objects + */ + clearHiddenObjects() { + this.showObjects(Object.keys(this.hiddenObjects)); + } + hasHiddenFeature(t, e) { + return this.hiddenObjects[t] && this.hiddenObjects[t].has(e); + } + addHiddenFeature(t, e) { + this.hiddenObjects[t] && (Sa(e), this.hiddenObjects[t].add(e), e[Ct] = !0, Vr(e)); + } + /** + * Clears all caches and removes cesium events. + */ + destroy() { + Object.values(this.hiddenObjects).forEach((t) => { + t.clear(); + }), this.hiddenObjects = {}, Object.values(this.highlightedObjects).forEach(({ features: t }) => { + t.clear(); + }), this.highlightedObjects = {}, this.changed.destroy(); + } +} +ue.prototype.getProperty = function(t) { + var e; + if (t === "attributes") { + const s = this.getProperties(); + return this.getGeometryName() && delete s[this.getGeometryName()], s; + } else if (t === "olcs_geometryType") { + const s = (e = this.getGeometry()) == null ? void 0 : e.getType(); + return s === "Polygon" ? 1 : s === "LineString" ? 2 : s === "Point" ? 3 : s === "Circle" || s === "MultiPolygon" ? 1 : s === "MultiLineString" ? 2 : s === "MultiPoint" ? 3 : void 0; + } + return this.get(t); +}; +ue.prototype.getAttributes = function() { + const t = this.getProperties(); + return this.getGeometryName() && delete t[this.getGeometryName()], t; +}; +ue.prototype.getPropertyInherited = function(t) { + return this.getProperty(t); +}; +const sv = ue.prototype.getStyleFunction; +ue.prototype.getStyleFunction = function() { + return this[Ct] || this[Mt] ? () => [] : this[Ie] ? (t, e) => { + var s, r, n; + return typeof ((s = this[Ie]) == null ? void 0 : s.style) == "function" ? (r = this[Ie]) == null ? void 0 : r.style(t, e) : [(n = this[Ie]) == null ? void 0 : n.style]; + } : sv.bind(this)(); +}; +const rv = ue.prototype.getStyle; +ue.prototype.getStyle = function() { + return this[Ct] || this[Mt] ? new K({}) : this[Ie] ? this[Ie].style : rv.bind(this)(); +}; +At._materialCache.addMaterial("Wallpaper", { + fabric: { + type: "Wallpaper", + uniforms: { + image: At.DefaultImageId, + anchor: new H(0, 0) + }, + components: { + diffuse: "texture2D(image, fract((gl_FragCoord.xy - anchor.xy) / vec2(imageDimensions.xy))).rgb", + alpha: "texture2D(image, fract((gl_FragCoord.xy - anchor.xy) / vec2(imageDimensions.xy))).a" + } + }, + translucent: !1 +}); +Xi.prototype.getId = function() { + return this.getProperty("id") || `${this.content.url}${this._batchId}`; +}; +function zu() { + var i; + if (((i = this.tileset.asset) == null ? void 0 : i.version) === "1.1") { + const t = {}; + return this.getPropertyIds().forEach((e) => { + t[e] = this.getProperty(e); + }), t; + } + return this.getProperty("attributes"); +} +Xi.prototype.getAttributes = zu; +Zi.prototype.getId = function() { + return this.getProperty("id") || `${this.content.url}${this._batchId}`; +}; +Zi.prototype.getAttributes = zu; +Ji.prototype.getId = function() { + return this.id; +}; +Ji.prototype.getProperty = function(t) { + return this[t]; +}; +Ji.prototype.getAttributes = function() { + return this.properties ?? {}; +}; +Ji.prototype.getPropertyInherited = function(t) { + return this.getProperty(t); +}; +const nv = new _(), av = new Q(), ov = new ta(), lv = new U(), hv = [1, 1e5]; +class cv { + constructor(t) { + h(this, "_outlinePrimitives", []); + h(this, "_planesPrimitives", []); + h(this, "show", !0); + h(this, "_camera"); + h(this, "_color"); + h(this, "allowPicking", !0); + h(this, "id", {}); + this.show = typeof t.show > "u" ? !0 : t.show, this._camera = t.camera, this._color = t.color || U.YELLOW, this.allowPicking = typeof t.allowPicking > "u" ? !0 : t.allowPicking, this.id = t.id || {}; + } + update(t) { + if (!this.show) + return; + const e = this._planesPrimitives, s = this._outlinePrimitives; + let r; + if (e.length === 0) { + const a = this._camera, l = a.frustum.clone(), c = hv; + c[0] = this._camera.frustum.near, c[1] = this._camera.frustum.far; + const d = a.positionWC, u = a.directionWC, f = a.upWC; + let g = a.rightWC; + g = _.negate(g, nv); + const m = av; + Q.setColumn(m, 0, g, m), Q.setColumn(m, 1, f, m), Q.setColumn(m, 2, u, m); + const p = ta.fromRotationMatrix(m, ov); + e.length = 1, s.length = 1, l.near = c[0], l.far = c[1], e[0] = new St({ + allowPicking: this.allowPicking, + geometryInstances: new Ze({ + geometry: new Nf({ + origin: d, + orientation: p, + frustum: l, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + _drawNearPlane: !0 + }), + attributes: { + color: Dr.fromColor(U.fromAlpha(this._color, 0.1, lv)) + }, + id: this.id, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + pickPrimitive: this + }), + appearance: new Hs({ + translucent: !0, + flat: !0 + }), + asynchronous: !1 + }), s[0] = new St({ + allowPicking: this.allowPicking, + geometryInstances: new Ze({ + geometry: new Rf({ + origin: d, + orientation: p, + frustum: l, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + _drawNearPlane: !0 + }), + attributes: { + color: Dr.fromColor(this._color) + }, + id: this.id, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + pickPrimitive: this + }), + appearance: new Hs({ + translucent: !1, + flat: !0 + }), + asynchronous: !1 + }); + } + const { length: n } = e; + for (r = 0; r < n; ++r) + s[r].update(t), e[r].update(t); + } + // eslint-disable-next-line class-methods-use-this + isDestroyed() { + return !1; + } + destroy() { + const { length: t } = this._planesPrimitives; + for (let e = 0; e < t; ++e) + this._outlinePrimitives[e] = this._outlinePrimitives[e] && this._outlinePrimitives[e].destroy(), this._planesPrimitives[e] = this._planesPrimitives[e] && this._planesPrimitives[e].destroy(); + return Ff(this); + } +} +function Ah(i) { + return !i || !Array.isArray(i) || i.length !== 4 || !Number.isFinite(i[0]) || !Number.isFinite(i[1]) || !Number.isFinite(i[2]) || !Number.isFinite(i[3]) ? !1 : i[0] <= i[2] && i[1] <= i[3]; +} +class be { + constructor(t = {}) { + h(this, "projection"); + h(this, "extent"); + var e; + this.projection = new z(t.projection), this.extent = t.coordinates || ((e = this.projection.proj) == null ? void 0 : e.getExtent()) || [ + -1 / 0, + -1 / 0, + 1 / 0, + 1 / 0 + ]; + } + static get className() { + return "Extent"; + } + static get WGS_84_EXTENT() { + return [-180, -90, 180, 90]; + } + /** + * validates extent options, checks for valid projection and the geometry of the given coordinates. + * The Coordinate extent is also valid if its a point extent + * @param options + */ + static validateOptions(t) { + return z.validateOptions(t.projection || {}) && Ah(t.coordinates); + } + getCoordinatesInProjection(t, e) { + if (t.epsg === this.projection.epsg) + return e ? e.splice(0, 4, ...this.extent) : this.extent.slice(); + const s = z.getTransformer(t, this.projection), r = e || []; + return s(this.extent, r, 2), r; + } + /** + * only checks for null/nan numbers, does not check for spatial validity of the extent + * @returns true if extent is valid + */ + isValid() { + return Ah(this.extent); + } + toJSON() { + return { + coordinates: this.extent.slice(), + projection: this.projection.toJSON(), + type: be.className + }; + } + clone() { + return new be(this.toJSON()); + } + equals(t) { + return this === t ? !0 : this.isValid() && t.isValid() && this.extent.every((e, s) => e === t.extent[s]) && this.projection.equals(t.projection); + } +} +function Hu(i, t, e) { + return i != null && t != null && Math.abs(i - t) <= e; +} +function uo(i, t, e) { + const s = i - t - Math.trunc((i - t) / 360) * 360; + return Math.abs(s) <= e; +} +function Dh(i, t, e) { + return i != null && t != null && i.every((s, r) => Hu(s, t[r], e)); +} +class It extends Ut { + /** + * @param options + */ + constructor(e) { + super(e); + /** + * position of the camera (optional) (cameraPosition needs x, y, and height value) + * either a cameraPosition or a groundPosition have to be provided + */ + h(this, "cameraPosition"); + /** + * groundPosition, point on the ground the camera looks at (optional) + * either a cameraPosition or a groundPosition have to be provided + */ + h(this, "groundPosition"); + /** + * distance between target and camera position, only needed if a groundPosition is given + * is used to move the cameraPosition backwards to get some distance from the ground + */ + h(this, "distance"); + /** + * heading, angle between 0 and 360 degree 0° = North, 90° = east ... + */ + h(this, "heading"); + /** + * pitch in degrees ranges -90 to 90 + */ + h(this, "pitch"); + /** + * roll in degrees, ranges -90 to 90 + */ + h(this, "roll"); + /** + * animate this viewpoint when setting it on a map + */ + h(this, "animate"); + /** + * An optional duration in seconds to override durations when animating this viewpoint + */ + h(this, "duration"); + /** + * The name of the easing function to use + */ + h(this, "easingFunctionName"); + const s = It.getDefaultOptions(); + this.cameraPosition = null, Array.isArray(e.cameraPosition) && e.cameraPosition.length === 3 && (this.cameraPosition = e.cameraPosition.map((r) => Number(r))), this.groundPosition = null, Array.isArray(e.groundPosition) && (this.groundPosition = e.groundPosition.map((r) => Number(r))), this.distance = k(e.distance, this.cameraPosition ? this.cameraPosition[2] : s.distance), this.heading = k(e.heading, s.heading), this.pitch = k(e.pitch, s.pitch), this.roll = k(e.roll, s.roll), this.animate = ce(e.animate, s.animate), this.duration = k(e.duration), this.easingFunctionName = e.easingFunctionName; + } + static get className() { + return "Viewpoint"; + } + static getDefaultOptions() { + return { + cameraPosition: void 0, + groundPosition: void 0, + distance: 1e3, + heading: 0, + pitch: -90, + roll: 0, + animate: !1, + duration: void 0, + easingFunctionName: void 0 + }; + } + get easingFunction() { + return this.easingFunctionName ? Gf[this.easingFunctionName] : null; + } + /** + * @returns returns a options object. This object can be used to reconstruct a new viewpoint + */ + toJSON() { + return { + ...super.toJSON(), + distance: this.distance, + cameraPosition: this.cameraPosition ? this.cameraPosition.slice() : void 0, + groundPosition: this.groundPosition ? this.groundPosition.slice() : void 0, + heading: this.heading, + pitch: this.pitch, + roll: this.roll, + animate: this.animate, + duration: this.duration, + easingFunctionName: this.easingFunctionName + }; + } + /** + * clones the viewpoint + */ + clone() { + return new It(this.toJSON()); + } + /** + * creates a String representation of this viewpoint + */ + toString() { + return `Viewpoint: [Ground:${String(this.groundPosition ? this.groundPosition : null)}][Camera:${String(this.cameraPosition ? this.cameraPosition : null)}][Distance:${String(this.distance)}][heading:${String(this.distance)}][pitch:${String(this.distance)}][roll:${String(this.distance)}]`; + } + /** + * Creates a viewpoint based on an extent + * @param extent + */ + static createViewpointFromExtent(e) { + const s = e instanceof be ? e.getCoordinatesInProjection(de) : e; + if (s && s.length === 4) { + const r = s[0], n = s[1], a = s[2], o = s[3], l = [(a - r) / 2 + r, (o - n) / 2 + n]; + let c = 0; + const d = Math.max(a - r, o - n); + return d < 1e-3 ? c = 400 : c = d * 3e5, new It({ + name: "viewpointFromExtend", + distance: c, + groundPosition: l, + heading: 360, + pitch: -90, + roll: 0, + animate: !0 + }); + } + return null; + } + /** + * creates a new Viewpoint Object from url Paramter + * @param urlParameter + */ + static parseURLparameter(e) { + const { cameraPosition: s, groundPosition: r } = e; + let n, a; + if (s != null && (n = s.split(",").map((l) => Number(l))), r != null && (a = r.split(",").map((l) => Number(l))), e.epsg != null) { + const { epsg: l, proj4: c } = e, d = new z({ epsg: l, proj4: c }), u = de; + a && (a = z.transform(u, d, a)), n && (n = z.transform(u, d, n)); + } + const o = { + cameraPosition: n, + groundPosition: a, + distance: Number(e.distance), + pitch: Number(e.pitch), + heading: Number(e.heading), + roll: Number(e.roll) + }; + return new It(o); + } + /** + * Checks if this Viewpoint is Valid + */ + isValid() { + const e = this.cameraPosition && Array.isArray(this.cameraPosition) && this.cameraPosition.length === 3 && this.cameraPosition.every((r) => Number.isFinite(r)) && Qn(be.WGS_84_EXTENT, this.cameraPosition); + return !(!(this.groundPosition && Array.isArray(this.groundPosition) && this.groundPosition.length > 1 && this.groundPosition.length < 4 && this.groundPosition.every((r) => Number.isFinite(r)) && Qn(be.WGS_84_EXTENT, this.groundPosition)) && !e || !e && !Number.isFinite(this.distance) || !Number.isFinite(this.heading) || !Number.isFinite(this.pitch) || !Number.isFinite(this.roll)); + } + /** + * compares the provided Viewpoint with this viewpoint componentwise + */ + equals(e, s = 0) { + return e === this || e !== null && Hu(e.distance, this.distance, s) && uo(e.heading, this.heading, s) && uo(e.pitch, this.pitch, s) && uo(e.roll, this.roll, s) && (Dh(e.cameraPosition, this.cameraPosition, s) || Dh(e.groundPosition, this.groundPosition, s)); + } +} +function uv() { + return he("init"); +} +function dv(i, t) { + const e = ei(i.mapClassRegistry, t); + return e && (e.layerCollection = i.layers), e; +} +function fv(i) { + const t = new It(i); + return t && t.isValid() ? t : (uv().warning(`Viewpoint ${String(i.name)} is not valid`), null); +} +function gv(i, t) { + let e; + t.style && (typeof t.style == "string" ? e = i.styles.getByKey(t.style) : e = ei(i.styleClassRegistry, t.style)); + let s; + t.highlightStyle && (typeof t.highlightStyle == "string" ? s = i.styles.getByKey(t.highlightStyle) : s = ei(i.styleClassRegistry, t.highlightStyle)); + let r; + t.tileProvider && (r = ei(i.tileProviderClassRegistry, t.tileProvider)); + let n; + return t.featureProvider && (n = ei(i.featureProviderClassRegistry, t.featureProvider)), ei(i.layerClassRegistry, { + ...t, + style: e, + highlightStyle: s, + tileProvider: r, + featureProvider: n + }); +} +function mv(i, t) { + var s, r; + const e = t.toJSON(); + return e.zIndex = t[i.layers.zIndexSymbol], (s = e == null ? void 0 : e.style) != null && s.name && i.styles.hasKey(e.style.name) && (e.style = e.style.name), (r = e == null ? void 0 : e.highlightStyle) != null && r.name && i.styles.hasKey(e.highlightStyle.name) && (e.highlightStyle = e.highlightStyle.name), e; +} +function pv(i, t, e) { + return i.zIndex !== (t == null ? void 0 : t.zIndex) ? null : e; +} +function yi(i) { + [...i].forEach((t) => { + t.destroy && !t.isDestroyed && t.destroy(); + }), i.destroy(); +} +class jt { + /** + * @param [uniqueKey='name'] - a key to maintain uniquely within the collection. passing false disables uniqueness. + */ + constructor(t) { + h(this, "_array"); + h(this, "_uniqueKey"); + /** + * Event raised if an item is added. Is passed the added item. + */ + h(this, "added"); + /** + * Event raised if an item is removed. Is passed the removed item. + */ + h(this, "removed"); + this._array = [], this._uniqueKey = "name", typeof t == "string" || typeof t == "symbol" ? this._uniqueKey = t : t === !1 && (this._uniqueKey = void 0), this.added = new L(), this.removed = new L(); + } + /** + * Creates a Collection from an iterable, such as an Array. + * @template T + * @param iterable + * @param [uniqueKey='name'] - a key to maintain uniquely within the collection. passing false disables uniqueness. + */ + static from(t, e) { + const s = new jt(e); + if (t) + for (const r of t) + s.add(r); + return s; + } + *[Symbol.iterator]() { + const t = this._array.length; + for (let e = 0; e < t; e++) + yield this._array[e]; + } + /** + * The key by which to check uniqueness against. undefined if no uniqueness constraint is set. + */ + get uniqueKey() { + return this._uniqueKey; + } + get size() { + return this._array.length; + } + /** + * Returns an item identified by the unique constraint key. Returns null, if there is no uniqueness constraint. + * @param value - the value to test against. does a shallow comparison, if the passed a non-atomic value + */ + getByKey(t) { + if (this._uniqueKey) + return this._array.find((e) => e[this._uniqueKey] === t); + } + _checkUniqueness(t) { + if (this._uniqueKey) { + if (t == null || typeof t != "object") + return !1; + const e = t[this._uniqueKey]; + if (e == null || this.getByKey(e) != null) + return !1; + } + return !0; + } + /** + * Adds an item to the collection. + * @param item - the item to be inserted + * @returns the index at which the item was inserted + */ + add(t) { + return this._checkUniqueness(t) ? (this._array.push(t), this.added.raiseEvent(t), this._array.length - 1) : null; + } + /** + * internal remove function, to remove an item from the collection, does not raise an event. + * @param item + * @returns returns the index of the removed item or -1 if the item has not been found. + * @protected + */ + _remove(t) { + const e = this._array.indexOf(t); + return e > -1 && this._array.splice(e, 1), e; + } + /** + * Removes an item from the collection + * @param item + */ + remove(t) { + this._remove(t) > -1 && this.removed.raiseEvent(t); + } + /** + * Equivalent to Array.prototype.includes + * @param item + */ + has(t) { + return this._array.includes(t); + } + /** + * Returns true, if the key exists. Returns undefined, if there is no uniqueness constraint. + * @param value + */ + hasKey(t) { + if (this._uniqueKey) + return this._array.some((e) => e[this._uniqueKey] === t); + } + /** + * clears the array + */ + clear() { + this._array.forEach((t) => { + this.removed.raiseEvent(t); + }), this._array.splice(0); + } + /** + * Destroys the collection, clearing the array and all its events + */ + destroy() { + this._array = [], this.added.destroy(), this.removed.destroy(); + } +} +function fo() { + return he("OverrideCollection"); +} +const Qo = Symbol("OverrideCollection"); +function yv(i) { + return i.toJSON ? i.toJSON() : structuredClone(i); +} +function _i(i, t, e, s, r, n) { + S(i, jt); + const a = i; + if (a[Qo]) + throw new Error("Cannot transform collection, collection already is an OverrideCollection"); + a[Qo] = !0; + const o = s || ((u) => u), l = e || yv, c = n || ((u, f, g) => g); + a.shadowMap = /* @__PURE__ */ new Map(), a.replace = function(f) { + const g = f[a.uniqueKey], m = a.getByKey(g); + if ((m == null ? void 0 : m[Je]) === t()) { + const p = a._remove(m); + if (a.replaced.raiseEvent({ old: m, new: f }), a.add(f, p) >= 0) + return f; + } + return null; + }, a.override = function(f) { + let g, m; + const p = f[a.uniqueKey]; + if (a.hasKey(p)) { + g = a.getByKey(p), m = a._remove(g), a.shadowMap.has(p) || a.shadowMap.set(p, []); + const v = a.shadowMap.get(p), w = l(g); + w[Je] = g[Je], v.push(w); + } + const y = g ? c(g, f, m) : null; + return g && (a.replaced.raiseEvent({ old: g, new: f }), g.destroy && g.destroy()), a.add(f, y) >= 0 ? f : null; + }, a.parseItems = async function(f, g) { + Array.isArray(f) && (await Promise.all(f.map(async (p) => { + const y = await o(p); + return !y || r && !(y instanceof r) ? (fo().warning(`Could not load item ${// eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + String(p[a.uniqueKey])} of type ${String(p.type)}`), null) : (y[Je] = g, y); + }))).filter((p) => p).forEach((p) => { + a.override(p); + }); + }, a.getSerializedByKey = function(f) { + const g = a.getByKey(f); + if (g) + return l(g); + }, a.removed.addEventListener(async (u) => { + var g; + const f = u[a.uniqueKey]; + if (a.shadowMap.has(f)) { + const m = a.shadowMap.get(f).pop(); + if (m) { + const p = await o(m); + if (!p) { + fo().error("failed to deserialize item"); + return; + } + p[Je] = m[Je]; + const y = c( + p, + u, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + u[a.previousIndexSymbol] + ); + a.add(p, y); + } + ((g = a.shadowMap.get(f)) == null ? void 0 : g.length) === 0 && a.shadowMap.delete(f); + } + }), a.added.addEventListener((u) => { + u[Je] || (u[Je] = t()); + }), a.removeModule = function(f) { + a.shadowMap.forEach((g, m) => { + const p = g.filter((y) => y[Je] !== f); + p.length === 0 ? a.shadowMap.delete(m) : p.length !== g.length && a.shadowMap.set(m, p); + }), [...a].filter((g) => g[Je] === f).forEach((g) => { + if (a.remove(g), g.destroy) + try { + g.destroy(); + } catch { + fo().error(`Failed to destroy item ${g[a.uniqueKey]}`); + } + }); + }, a.replaced = new L(), a.serializeModule = function(f) { + return [...a].map((g) => { + if (g[Je] === f) + return l(g); + const m = g[a.uniqueKey]; + if (a.shadowMap.has(m)) { + const y = a.shadowMap.get(m).find((v) => v[Je] === f); + if (y) { + const v = structuredClone(y); + return delete v[Je], v; + } + } + return null; + }).filter((g) => g); + }; + const d = a.destroy.bind(a); + return a.destroy = function() { + d(), a.shadowMap.clear(), a.replaced.destroy(); + }, a; +} +var el; +(function(i) { + i[i.INACTIVE = 1] = "INACTIVE", i[i.ACTIVE = 2] = "ACTIVE", i[i.LOADING = 4] = "LOADING"; +})(el || (el = {})); +const ve = el; +class tl { + constructor() { + h(this, "hiddenObjects", {}); + h(this, "_hiddenObjectFeatures", {}); + h(this, "lastUpdated", Date.now()); + /** + * An event raised when the hidden ids change. Is called with + * {@link FeatureVisibilityEvent} as its only argument + */ + h(this, "changed", new L()); + } + /** + * Add a tick to the hide count, hidding the features if they are not already hidden + */ + hideObjects(t) { + S(t, [String]); + const e = []; + t.forEach((s) => { + this.hiddenObjects[s] || (e.push(s), this.hiddenObjects[s] = 0), this.hiddenObjects[s] += 1; + }), e.length > 0 && (this.lastUpdated = Date.now(), this.changed.raiseEvent({ + action: fe.HIDE, + ids: e + })); + } + /** + * Subtract from the hide count for an Array of ids. If the array reaches 0, features with said UUID will be shown + */ + showObjects(t) { + S(t, [String]); + const e = []; + t.forEach((s) => { + this.hiddenObjects[s] && (this.hiddenObjects[s] -= 1, this.hiddenObjects[s] === 0 && (this._hiddenObjectFeatures[s] && (this._hiddenObjectFeatures[s].forEach((r) => { + ku(r, Mt); + }), this._hiddenObjectFeatures[s].clear()), delete this.hiddenObjects[s], e.push(s))); + }), e.length > 0 && this.changed.raiseEvent({ + action: fe.SHOW, + ids: e + }); + } + addFeature(t, e) { + this._hiddenObjectFeatures[t] || (this._hiddenObjectFeatures[t] = /* @__PURE__ */ new Set()), Sa(e), this._hiddenObjectFeatures[t].add(e), e[Mt] = !0, Vr(e); + } + hasFeature(t, e) { + return this._hiddenObjectFeatures[t] ? this._hiddenObjectFeatures[t].has(e) : !1; + } + destroy() { + this.hiddenObjects = {}, Object.values(this._hiddenObjectFeatures).forEach((t) => { + t.clear(); + }), this._hiddenObjectFeatures = {}, this.changed.destroy(); + } +} +class st extends Ut { + constructor(e) { + super(e); + h(this, "extent"); + h(this, "activeOnStartup"); + h(this, "_allowPicking"); + h(this, "_state"); + h(this, "_loadingPromise"); + h(this, "_initialized"); + /** + * if provided, the layer will only be shown in the given MapNames. + * An empty array will show the layer in all configured maps. + * Changes require calling layer.redraw() to take effect. + */ + h(this, "mapNames"); + /** + * The class names of the supported maps. + */ + h(this, "_supportedMaps"); + h(this, "_url"); + h(this, "_zIndex"); + /** + * Called when the zIndex of this layer is changed. Is passed the new zIndex as its only argument. + */ + h(this, "zIndexChanged"); + /** + * array of object Ids which should be hidden within the context of the layers layerCollection, if this layer is active + */ + h(this, "_hiddenObjectIds"); + h(this, "_globalHider"); + h(this, "_exclusiveGroups"); + /** + * event raised if the exclusives group of the layer changes. is passed the array of exclusive groups as its only argument + */ + h(this, "exclusiveGroupsChanged"); + h(this, "copyright"); + h(this, "_implementations"); + h(this, "_activeMaps"); + /** + * Event raised, if the layers state changes. Is passed the LayerState as its only parameter + */ + h(this, "stateChanged"); + /** + * An optional feature provider to provider features based on click events. + */ + h(this, "featureProvider"); + h(this, "_locale"); + h(this, "_headers"); + /** + * Optional Id to synchronize with the vcPublisher Datasources. This can also be used to track a connection + * to other sources of data. + */ + h(this, "datasourceId"); + const s = st.getDefaultOptions(); + this.extent = e.extent ? new be(e.extent) : null, this.activeOnStartup = ce(e.activeOnStartup, s.activeOnStartup), this._allowPicking = ce(e.allowPicking, s.allowPicking), this._state = ve.INACTIVE, this._loadingPromise = null, this._initialized = !1, this.mapNames = e.mapNames ?? s.mapNames, this._supportedMaps = [], this._url = e.url, this._zIndex = ne(e.zIndex, s.zIndex), this.zIndexChanged = new L(), this._hiddenObjectIds = Array.isArray(e.hiddenObjectIds) ? e.hiddenObjectIds : s.hiddenObjectIds, this._globalHider = void 0, this._exclusiveGroups = Array.isArray(e.exclusiveGroups) ? e.exclusiveGroups.slice() : s.exclusiveGroups, this.exclusiveGroupsChanged = new L(), this.copyright = e.copyright || s.copyright, this._implementations = /* @__PURE__ */ new Map(), this._activeMaps = /* @__PURE__ */ new Set(), this.stateChanged = new L(), this.featureProvider = void 0, this._locale = "en", this.datasourceId = e.datasourceId || s.datasourceId, this._headers = structuredClone(e.headers); + } + static get className() { + return "Layer"; + } + static getDefaultOptions() { + return { + name: void 0, + extent: void 0, + activeOnStartup: !1, + allowPicking: !0, + exclusiveGroups: [], + mapNames: [], + url: void 0, + hiddenObjectIds: [], + copyright: void 0, + datasourceId: void 0, + headers: void 0, + zIndex: 0 + }; + } + /** + * True if this layer has been initialized, typically after its first activation. + */ + get initialized() { + return this._initialized; + } + get active() { + return this._state === ve.ACTIVE; + } + get loading() { + return !!(this._state & ve.LOADING); + } + get state() { + return this._state; + } + get allowPicking() { + return this._allowPicking; + } + set allowPicking(e) { + this._allowPicking = e; + } + /** + * A layers url, should on be configured, else an empty string + */ + get url() { + return this._url ? typeof this._url == "string" ? this._url : this._url[this._locale] ? this._url[this._locale] : Object.values(this._url)[0] : ""; + } + set url(e) { + if (S(e, je(String, hh(String))), this._url !== e) { + const s = this._url; + this._url = e, this.reload().catch((r) => { + this.getLogger().error("failed to reload after URL setting"), this.getLogger().error(String(r)), this._url = s; + }); + } + } + get hiddenObjectIds() { + return this._hiddenObjectIds; + } + set hiddenObjectIds(e) { + S(e, [String]), this._globalHider && this.active && this._globalHider.hideObjects(e), this._hiddenObjectIds = e; + } + get globalHider() { + return this._globalHider; + } + setGlobalHider(e) { + S(e, ie(tl)), e && this.active && e.hideObjects(this.hiddenObjectIds), this._globalHider = e; + } + /** + * Indicates, that this layer is part of an exclusiveGroup + */ + get exclusive() { + return this._exclusiveGroups.length > 0; + } + /** + * An array of arbitrary exclusive groups + */ + get exclusiveGroups() { + return this._exclusiveGroups.slice(); + } + set exclusiveGroups(e) { + S(e, [je(String, Symbol)]), (e.length !== this._exclusiveGroups.length || !e.every((s) => this._exclusiveGroups.includes(s))) && (this._exclusiveGroups = e.slice(), this.exclusiveGroupsChanged.raiseEvent(e)); + } + get zIndex() { + return this._zIndex; + } + set zIndex(e) { + S(e, Number), this._zIndex !== e && (this._zIndex = e, this.zIndexChanged.raiseEvent(e)); + } + /** + * directly manipulating the headers Object will not trigger a reload. Reload the data via layer.reload() manually. + */ + get headers() { + return this._headers; + } + /** + * + * @param headers + */ + set headers(e) { + S(e, tu(hh(String))), Ke(this._headers, e) || (this._headers = structuredClone(e), this.reload()); + } + /** + * returns the currently set locale. Can be used to provide locale specific URLs. + */ + get locale() { + return this._locale; + } + /** + * sets the locale and reloads the layer the if the URL is a locale aware Object. + */ + set locale(e) { + S(e, String), this._locale !== e && (this._locale = e, this._url && typeof this._url == "object" && this._url[this._locale] && this.reload().catch((s) => { + this.getLogger().error("failed to reload after setting locale"), this.getLogger().error(String(s)); + })); + } + /** + * creates an array of layer implementations for the given map. + * @param _map Map + * @returns return the specific implementation + */ + // eslint-disable-next-line class-methods-use-this,no-unused-vars + createImplementationsForMap(e) { + return []; + } + /** + * creates or returns a cached array of layer implementations for the given map. + * @param map initialized Map + * @returns return the specific implementation + */ + getImplementationsForMap(e) { + return this._implementations.has(e) || (this.isSupported(e) ? this._implementations.set(e, this.createImplementationsForMap(e)) : this._implementations.set(e, [])), this._implementations.get(e); + } + /** + * Returns all implementation of this layer for all maps + */ + getImplementations() { + return [...this._implementations.values()].flat(); + } + getImplementationOptions() { + return { + name: this.name, + url: this.url, + headers: this.headers + }; + } + /** + * Reloads all the data loaded and forces a redraw + */ + reload() { + return this.forceRedraw(); + } + /** + * destroys all current implementations and recreates the ones which have an active map. + * called for instance when the URL for a layer changes + */ + async forceRedraw() { + const s = [...this._implementations.keys()].map((r) => (this.removedFromMap(r), r.active ? this.mapActivated(r) : Promise.resolve())); + await Promise.all(s); + } + /** + * returns the Extent of this layer + */ + getExtent() { + return this.extent; + } + /** + * returns the Extent of this layer or null, if the layers extent was not defined or cannot be established + */ + getZoomToExtent() { + return this.extent && this.extent.isValid() ? this.extent : null; + } + /** + * initializes the layer, can be used to defer loading + */ + initialize() { + return this._initialized = !0, Promise.resolve(); + } + /** + * is called from the map when the map is activated, and this layer is in the layerCollection of the map. + * Will create an implementation if it does not exits and will forward the activation call to the implementation. + * @param map + @link */ + async mapActivated(e) { + this.getLogger().debug(`Layer: ${this.name} mapActivated is called from Map: ${e.name}`), this._activeMaps.add(e), (this.active || this.loading && this.initialized) && await this._activateImplsForMap(e); + } + /** + * is called from the map when the map is deactivated, and this layer is in the layerCollection of the map. + * will forward deactivation call to the map specific implementation + * @param map + */ + mapDeactivated(e) { + this.getLogger().debug(`Layer: ${this.name} mapDeactivated is called from Map: ${e.name}`), this._activeMaps.delete(e), (this.active || this.loading) && this.getImplementationsForMap(e).forEach((s) => { + s.deactivate(); + }); + } + /** + * is called when a layer is removed from the layer collection of a map or said map is destroyed. + * destroys the associated implementation. + * @param map + */ + removedFromMap(e) { + this._activeMaps.delete(e), this.getImplementationsForMap(e).forEach((s) => { + s.destroy(); + }), this._implementations.delete(e); + } + /** + * checks if the currently active map supports this layer + * @param map + */ + isSupported(e) { + return e && this._supportedMaps.includes(e.className) && (this.mapNames.length === 0 || this.mapNames.indexOf(e.name) >= 0); + } + async _activateImplsForMap(e) { + const s = this.getImplementationsForMap(e); + try { + await Promise.all(s.map((r) => r.activate())); + } catch (r) { + this.getLogger().error(`Layer ${this.name} could not activate impl for map ${e.name}`), this.getLogger().error(String(r)), this._implementations.set(e, []), s.forEach((n) => { + n.destroy(); + }); + } + } + async _activate() { + this._state = ve.LOADING; + try { + this.stateChanged.raiseEvent(ve.LOADING); + } catch (e) { + this.getLogger().debug(`Error on raising LayerState.LOADING event for layer ${this.name} : ${e.message}`); + } + if (await this.initialize(), this._state === ve.LOADING && (await Promise.all([...this._activeMaps].map((e) => this._activateImplsForMap(e))), this._state === ve.LOADING)) { + this._globalHider && this._globalHider.hideObjects(this.hiddenObjectIds), this._state = ve.ACTIVE; + try { + this.stateChanged.raiseEvent(ve.ACTIVE); + } catch (e) { + this.getLogger().debug(`Error on raising LayerState.ACTIVE event for layer ${this.name} : ${e.message}`); + } + this._loadingPromise = null; + } + } + /** + * Activates this layer object, i.e. changes its internal view state + * and updates the map. The returned promise resolves, once the layer & any _implementations are initialized + * and all data is loaded. + * Once the promise resolves, the layer can still be inactive, if deactivate was called while initializing the layer. + */ + activate() { + return this._loadingPromise ? this._loadingPromise : this._state === ve.INACTIVE ? (this._loadingPromise = this._activate().catch((e) => (this._state = ve.INACTIVE, Promise.reject(e))), this._loadingPromise) : Promise.resolve(); + } + /** + * Deactivates a layer, changing the internal view state + */ + deactivate() { + if (this._loadingPromise && (this._loadingPromise = null), this._state !== ve.INACTIVE) { + this.getImplementations().forEach((e) => { + (e.loading || e.active) && e.deactivate(); + }), this._globalHider && this._globalHider.showObjects(this.hiddenObjectIds), this._state = ve.INACTIVE; + try { + this.stateChanged.raiseEvent(ve.INACTIVE); + } catch (e) { + this.getLogger().debug(`Error on raising LayerState.INACTIVE event for layer ${this.name} : ${e.message}`); + } + } + } + toJSON() { + const e = super.toJSON(), s = st.getDefaultOptions(); + return this.activeOnStartup !== s.activeOnStartup && (e.activeOnStartup = this.activeOnStartup), this.allowPicking !== s.allowPicking && (e.allowPicking = this.allowPicking), this.mapNames.length > 0 && (e.mapNames = this.mapNames.slice()), this.hiddenObjectIds.length > 0 && (e.hiddenObjectIds = this.hiddenObjectIds.slice()), this._url && (e.url = this._url), this.extent && this.extent.isValid() && (e.extent = this.extent.toJSON()), this._exclusiveGroups.length > 0 && (e.exclusiveGroups = this._exclusiveGroups.slice()), this.copyright !== s.copyright && (e.copyright = { ...this.copyright }), this.datasourceId !== s.datasourceId && (e.datasourceId = this.datasourceId), Ke(this._headers, s.headers) || (e.headers = structuredClone(this._headers)), this._zIndex !== s.zIndex && (e.zIndex = this._zIndex), e; + } + /** + * disposes of this layer, removes instances from the current maps and the framework + */ + destroy() { + super.destroy(), this.featureProvider && this.featureProvider.destroy(), this._activeMaps.clear(), this.getImplementations().forEach((e) => { + e.destroy(); + }), this._initialized = !1, this._implementations.clear(), this.stateChanged.destroy(), this.zIndexChanged.destroy(), this.exclusiveGroupsChanged.destroy(); + } +} +ke.registerClass(st.className, st); +const hi = Symbol("alreadyTransformedToMercator"), ze = Symbol("alreadyTransformedToImage"), kt = Symbol("obliqueGeometry"), _n = Symbol("doNotTransform"), $r = Symbol("OriginalFeature"), br = Symbol("ActuallyIsCircle"), pe = Symbol("createSync"), ts = new U(), _v = new on({ + font: "30px sans-serif", + fill: new et({ color: Xn }), + textAlign: "left", + offsetY: -15 +}); +function Nh(i, t, e) { + var r; + let s; + (r = e[t]) != null && r.conditions ? s = new kf(e[t], e.defines) : s = new zf(e[t], e.defines), i[t] = s; +} +class tt extends li { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "_styleOptions"); + h(this, "_circleCache", /* @__PURE__ */ new Map()); + h(this, "_iconCache", /* @__PURE__ */ new Map()); + const s = e.declarativeStyle || {}; + s.show = s.show != null ? s.show : !0, this.cesiumStyle = new ea(s), this._style = this._styleFunction.bind(this), s.strokeColor && Nh(this.cesiumStyle, "strokeColor", s), s.strokeWidth && Nh(this.cesiumStyle, "strokeWidth", s), this._styleOptions = s, this._circleCache = /* @__PURE__ */ new Map(), this._iconCache = /* @__PURE__ */ new Map(); + } + static get className() { + return "DeclarativeStyleItem"; + } + get styleOptions() { + return JSON.parse(JSON.stringify(this._styleOptions)); + } + toJSON() { + const e = super.toJSON(); + return e.declarativeStyle = Object.fromEntries(Object.entries(this.cesiumStyle.style).filter(([, s]) => s != null).map(([s, r]) => ws(r, Boolean) ? [s, String(r)] : [s, r])), e; + } + clone(e) { + if (e) + return e.assign(this); + const s = this.toJSON(); + return delete s.name, new tt(s); + } + assign(e) { + return super.assign(e), this._styleOptions = e.cesiumStyle.style, this.cesiumStyle = new ea(this._styleOptions), this; + } + _styleFunction(e) { + var n; + const s = e[$r] || e; + if (!this.cesiumStyle.show.evaluate(s)) + return; + const r = (n = s.getGeometry()) == null ? void 0 : n.getType(); + if (r === "Point") + return this._stylePoint(s); + if (r === "Polygon") + return this._stylePolygon(s); + if (r === "LineString") + return this._styleLineString(s); + if (r === "Circle") + return this._stylePolygon(s); + if (r === "MultiPoint") + return this._stylePoint(s); + if (r === "MultiPolygon") + return this._stylePolygon(s); + if (r === "MultiLineString") + return this._styleLineString(s); + this.getLogger().warning(`could not style geometry type: ${String(r)}`); + } + _stylePolygon(e) { + const s = new K({}), r = this.cesiumStyle.color ? this.cesiumStyle.color.evaluate(e, ts) : U.WHITE; + return r && s.setFill(new et({ + color: Fi(r) + })), this._evaluateStroke(e, s), s; + } + _styleLineString(e) { + const s = new K({}), r = !!e.get("olcs_extrudedHeight"), n = this.cesiumStyle.color ? this.cesiumStyle.color.evaluate(e, ts) : U.WHITE; + if (n) + if (r) + s.setFill(new et({ + color: Fi(n) + })); + else { + const a = this.cesiumStyle.strokeWidth ? this.cesiumStyle.strokeWidth.evaluate(e) : 1; + s.setStroke(new Be({ + width: Number.isFinite(a) ? a : 1, + color: Fi(n) + })); + } + return r && this._evaluateStroke(e, s), s; + } + _stylePoint(e) { + var r, n; + const s = new K({}); + if (this.cesiumStyle.labelText) { + const a = this.cesiumStyle.labelText.evaluate(e); + if (a) { + const o = _v.clone(); + if (o.setText(a.toString()), this.cesiumStyle.font) { + const l = this.cesiumStyle.font.evaluate(e); + l && o.setFont(l); + } + if (this.cesiumStyle.labelColor) { + const l = this.cesiumStyle.labelColor.evaluateColor(e, ts); + l && o.getFill().setColor(Fi(l)); + } + if (this.cesiumStyle.labelOutlineColor) { + const l = this.cesiumStyle.labelOutlineColor.evaluate(e, ts); + if (l) { + const c = this.cesiumStyle.labelOutlineWidth ? this.cesiumStyle.labelOutlineWidth.evaluate(e) : 1; + o.setStroke(new Be({ + color: Fi(l), + width: Number.isFinite(c) ? c : 1 + })); + } + } + s.setText(o); + } + } + if (this.cesiumStyle.image) { + const a = this.cesiumStyle.image.evaluate(e); + if (a) { + const o = { src: a }; + fi.contains(a) ? o.crossOrigin = "use-credentials" : gi(a) || (o.crossOrigin = "anonymous"); + const l = `${a}${o.crossOrigin}`; + this._iconCache.has(l) || this._iconCache.set(l, new ni(o)), s.setImage(this._iconCache.get(l)); + } + } else { + const a = ((r = this.cesiumStyle.color) == null ? void 0 : r.evaluate(e, ts)) ?? U.WHITE; + let o = 4; + this.cesiumStyle.pointSize && (o = (this.cesiumStyle.pointSize.evaluate(e) ?? 8) / 2); + const l = ((n = this.cesiumStyle.pointOutlineWidth) == null ? void 0 : n.evaluate(e)) ?? 0; + let c = U.BLACK; + l && (this.cesiumStyle.pointOutlineColor && (c = this.cesiumStyle.pointOutlineColor.evaluateColor(e, ts)), o += l / 2); + const d = `${o}${String(a)}${String(l)}${String(c)}`; + if (!this._circleCache.has(d)) { + const u = { + radius: o, + fill: new et({ + color: Fi(a) + }) + }; + l && (u.stroke = new Be({ + color: Fi(c), + width: l + })), this._circleCache.set(d, new Vi(u)); + } + s.setImage(this._circleCache.get(d)); + } + if (this.cesiumStyle.scale && s.getImage()) { + const a = this.cesiumStyle.scale.evaluate(e); + a && Number.isFinite(a) && s.getImage().setScale(a); + } + return this._evaluateStroke(e, s), s; + } + _evaluateStroke(e, s) { + if (this.cesiumStyle.strokeColor) { + const r = this.cesiumStyle.strokeColor.evaluateColor(e, ts); + if (r) { + const n = this.cesiumStyle.strokeWidth ? this.cesiumStyle.strokeWidth.evaluate(e) : 1; + s.setStroke(new Be({ + width: Number.isFinite(n) ? n : 1, + color: Fi(r) + })); + } + } + } + get show() { + return this._styleOptions.show; + } + set show(e) { + this._styleOptions.show = e, this.cesiumStyle.show = e, this._styleChanged(); + } + get color() { + return this._styleOptions.color; + } + set color(e) { + this._styleOptions.color = e, this.cesiumStyle.color = e, this._styleChanged(); + } + get strokeColor() { + return this._styleOptions.strokeColor; + } + set strokeColor(e) { + this._styleOptions.strokeColor = e, this.cesiumStyle.strokeColor = e, this._styleChanged(); + } + get strokeWidth() { + return this._styleOptions.strokeWidth; + } + set strokeWidth(e) { + this._styleOptions.strokeWidth = e, this.cesiumStyle.strokeWidth = e, this._styleChanged(); + } + get image() { + return this._styleOptions.image; + } + set image(e) { + this._styleOptions.image = e, this.cesiumStyle.image = e, this._styleChanged(); + } + get labelText() { + return this._styleOptions.labelText; + } + set labelText(e) { + this._styleOptions.labelText = e, this.cesiumStyle.labelText = e, this._styleChanged(); + } + get labelColor() { + return this._styleOptions.labelColor; + } + set labelColor(e) { + this._styleOptions.labelColor = e, this.cesiumStyle.labelColor = e, this._styleChanged(); + } + get font() { + return this._styleOptions.font; + } + set font(e) { + this._styleOptions.font = e, this.cesiumStyle.font = e, this._styleChanged(); + } + get pointSize() { + return this._styleOptions.pointSize; + } + set pointSize(e) { + this._styleOptions.pointSize = e, this.cesiumStyle.pointSize = e, this._styleChanged(); + } + destroy() { + this._circleCache.clear(), super.destroy(); + } +} +mn.registerClass(tt.className, tt); +const Bu = new tt({}); +function vv() { + return he("VectorProperties"); +} +var Tt; +(function(i) { + i.CYLINDER = "cylinder", i.SPHERE = "sphere", i.ELLIPSOID = "ellipsoid", i.BOX = "box"; +})(Tt || (Tt = {})); +function rs(i, t) { + return i.type === t; +} +const xi = "2.1", mr = { + clampToGround: Y.CLAMP_TO_GROUND, + clampTo3DTiles: Y.CLAMP_TO_3D_TILE, + clampToTerrain: Y.CLAMP_TO_TERRAIN, + absolute: Y.NONE, + relativeToGround: Y.RELATIVE_TO_GROUND, + relativeTo3DTiles: Y.RELATIVE_TO_3D_TILE, + relativeToTerrain: Y.RELATIVE_TO_TERRAIN +}, pr = { + both: os.BOTH, + cesium3DTile: os.CESIUM_3D_TILE, + terrain: os.TERRAIN +}; +function go(i, t) { + if (Array.isArray(i)) { + const e = i.map((s) => k(s)).filter((s) => s != null); + if (e.length === 4) + return new wr(e[0], e[1], e[2], e[3]); + } + return t; +} +function mo(i, t) { + if (Array.isArray(i)) { + const e = i.map((s) => k(s)).filter((s) => s != null); + if (e.length === 3) + return new _(e[0], e[1], e[2]); + } + return t; +} +function Os(i, t) { + if (Array.isArray(i)) + return i.map((e) => k(e)).filter((e) => e != null && e > 0); + { + const e = k(i); + if (e && e > 0) + return [e]; + } + return t ? Array.isArray(t) ? t : [t] : []; +} +function ar(i) { + for (const [t, e] of Object.entries(mr)) + if (e === i) + return t; + throw new Error(`Unknown altitude mode ${i}`); +} +function Dn(i) { + for (const [t, e] of Object.entries(pr)) + if (e === i) + return t; +} +function Nn(i) { + return i ? wr.pack(i, []) : void 0; +} +function Rn(i) { + return i ? _.pack(i, []) : void 0; +} +class Gt { + /** + * @param options + */ + constructor(t) { + h(this, "_altitudeMode"); + h(this, "_allowPicking"); + h(this, "_classificationType"); + h(this, "_scaleByDistance"); + h(this, "_eyeOffset"); + h(this, "_heightAboveGround"); + h(this, "_skirt"); + h(this, "_groundLevel"); + h(this, "_extrudedHeight"); + h(this, "_storeysAboveGround"); + h(this, "_storeysBelowGround"); + h(this, "_storeyHeightsAboveGround"); + h(this, "_storeyHeightsBelowGround"); + h(this, "_modelUrl"); + h(this, "_modelScaleX"); + h(this, "_modelScaleY"); + h(this, "_modelScaleZ"); + h(this, "_modelHeading"); + h(this, "_modelPitch"); + h(this, "_modelRoll"); + h(this, "_baseUrl"); + h(this, "_modelOptions"); + h(this, "_modelAutoScale"); + h(this, "_primitiveOptions"); + /** + * Event raised when properties change. is passed an array of keys for the changed properties. + * @readonly + */ + h(this, "propertyChanged"); + const e = Gt.getDefaultOptions(); + this._altitudeMode = Ri(t.altitudeMode, mr, Y.CLAMP_TO_GROUND), this._allowPicking = ce(t.allowPicking, e.allowPicking), this._classificationType = Ri(t.classificationType, pr), this._scaleByDistance = go(t.scaleByDistance, void 0), this._eyeOffset = mo(t.eyeOffset, void 0), this._heightAboveGround = k(t.heightAboveGround, e.heightAboveGround), this._skirt = k(t.skirt, e.skirt), this._groundLevel = k(t.groundLevel, e.groundLevel), this._extrudedHeight = k(t.extrudedHeight, e.extrudedHeight), this._storeysAboveGround = ne(t.storeysAboveGround, e.storeysAboveGround), this._storeysBelowGround = ne(t.storeysBelowGround, e.storeysBelowGround), this._storeyHeightsAboveGround = Os(t.storeyHeightsAboveGround, e.storeyHeightsAboveGround), this._storeyHeightsBelowGround = Os(t.storeyHeightsBelowGround, e.storeyHeightsBelowGround), this._modelUrl = t.modelUrl ?? e.modelUrl, this._modelScaleX = k(t.modelScaleX, e.modelScaleX), this._modelScaleY = k(t.modelScaleY, e.modelScaleY), this._modelScaleZ = k(t.modelScaleZ, e.modelScaleZ), this._modelHeading = k(t.modelHeading, e.modelHeading), this._modelPitch = k(t.modelPitch, e.modelPitch), this._modelRoll = k(t.modelRoll, e.modelRoll), this._baseUrl = t.baseUrl ?? e.baseUrl, this._modelOptions = t.modelOptions || e.modelOptions, this._modelAutoScale = ce(t.modelAutoScale, e.modelAutoScale), this._primitiveOptions = t.primitiveOptions || e.primitiveOptions, this.propertyChanged = new L(); + } + /** + * Returns the default options for VectorProperties + */ + static getDefaultOptions() { + return { + altitudeMode: "clampToGround", + allowPicking: !0, + classificationType: void 0, + scaleByDistance: void 0, + eyeOffset: void 0, + heightAboveGround: void 0, + skirt: 0, + groundLevel: void 0, + extrudedHeight: 0, + storeysAboveGround: 0, + storeysBelowGround: 0, + storeyHeightsAboveGround: [], + storeyHeightsBelowGround: [], + modelUrl: void 0, + modelScaleX: 1, + modelScaleY: 1, + modelScaleZ: 1, + modelHeading: 0, + modelPitch: 0, + modelRoll: 0, + modelOptions: void 0, + modelAutoScale: !1, + baseUrl: void 0, + primitiveOptions: void 0 + }; + } + get altitudeMode() { + return this._altitudeMode; + } + set altitudeMode(t) { + t !== this._altitudeMode && (S(t, aa(Y)), this._altitudeMode = t, this.propertyChanged.raiseEvent(["altitudeMode"])); + } + getAltitudeMode(t) { + return Ri(t.get("olcs_altitudeMode"), mr, this._altitudeMode); + } + get allowPicking() { + return this._allowPicking; + } + set allowPicking(t) { + t !== this._allowPicking && (S(t, Boolean), this._allowPicking = t, this.propertyChanged.raiseEvent(["allowPicking"])); + } + getAllowPicking(t) { + const e = t.get("olcs_allowPicking"); + return ce(e, this._allowPicking); + } + get classificationType() { + return this._classificationType; + } + set classificationType(t) { + t !== this._classificationType && (S(t, ie(aa(os))), this._classificationType = t, this.propertyChanged.raiseEvent(["classificationType"])); + } + getClassificationType(t) { + return Ri(t.get("olcs_classificationType"), pr, this.classificationType); + } + get scaleByDistance() { + return this._scaleByDistance; + } + set scaleByDistance(t) { + wr.equals(t, this._scaleByDistance) || (S(t, ie(wr)), this._scaleByDistance = t, this.propertyChanged.raiseEvent(["scaleByDistance"])); + } + getScaleByDistance(t) { + return go(t.get("olcs_scaleByDistance"), this.scaleByDistance); + } + get eyeOffset() { + return this._eyeOffset; + } + set eyeOffset(t) { + _.equals(this.eyeOffset, t) || (S(t, ie(_)), this._eyeOffset = t, this.propertyChanged.raiseEvent(["eyeOffset"])); + } + getEyeOffset(t) { + const e = t.get("olcs_eyeOffset"); + if (!e) { + const s = t.get("olcs_zCoordinateEyeOffset"); + if (s) + return vv().deprecate("zCoordinateEyeOffset", "use eyeOffset and provide [0,0,value]"), new _(0, 0, k(s, 0)); + } + return mo(e, this.eyeOffset); + } + get heightAboveGround() { + return this._heightAboveGround; + } + set heightAboveGround(t) { + t !== this._heightAboveGround && (S(t, ie(Number)), this._heightAboveGround = t, this.propertyChanged.raiseEvent(["heightAboveGround"])); + } + getHeightAboveGround(t) { + return k(t.get("olcs_heightAboveGround"), this.heightAboveGround); + } + get skirt() { + return this._skirt; + } + set skirt(t) { + t !== this._skirt && (S(t, Number), this._skirt = t, this.propertyChanged.raiseEvent(["skirt"])); + } + getSkirt(t) { + return k(t.get("olcs_skirt"), this.skirt); + } + get groundLevel() { + return this._groundLevel; + } + set groundLevel(t) { + t !== this._groundLevel && (S(t, ie(Number)), this._groundLevel = t, this.propertyChanged.raiseEvent(["groundLevel"])); + } + getGroundLevel(t) { + return k(t.get("olcs_groundLevel"), this.groundLevel); + } + get extrudedHeight() { + return this._extrudedHeight; + } + set extrudedHeight(t) { + t !== this._extrudedHeight && (S(t, Number), this._extrudedHeight = t, this.propertyChanged.raiseEvent(["extrudedHeight"])); + } + getExtrudedHeight(t) { + return k(t.get("olcs_extrudedHeight"), this.extrudedHeight); + } + get storeysAboveGround() { + return this._storeysAboveGround; + } + set storeysAboveGround(t) { + t !== this._storeysAboveGround && (S(t, Number), this._storeysAboveGround = Math.trunc(t), this.propertyChanged.raiseEvent(["storeysAboveGround"])); + } + getStoreysAboveGround(t) { + return ne(t.get("olcs_storeysAboveGround"), this.storeysAboveGround); + } + get storeysBelowGround() { + return this._storeysBelowGround; + } + set storeysBelowGround(t) { + t !== this._storeysBelowGround && (S(t, Number), this._storeysBelowGround = Math.trunc(t), this.propertyChanged.raiseEvent(["storeysBelowGround"])); + } + getStoreysBelowGround(t) { + return ne(t.get("olcs_storeysBelowGround"), this.storeysBelowGround); + } + get storeyHeightsAboveGround() { + return this._storeyHeightsAboveGround.slice(); + } + set storeyHeightsAboveGround(t) { + Ke(t, this._storeyHeightsAboveGround) || (S(t, [Number]), this._storeyHeightsAboveGround = t, this.propertyChanged.raiseEvent(["storeyHeightsAboveGround"])); + } + getStoreyHeightsAboveGround(t) { + return Os(t.get("olcs_storeyHeightsAboveGround"), this.storeyHeightsAboveGround); + } + get storeyHeightsBelowGround() { + return this._storeyHeightsBelowGround.slice(); + } + set storeyHeightsBelowGround(t) { + Ke(t, this._storeyHeightsBelowGround) || (S(t, [Number]), this._storeyHeightsBelowGround = t, this.propertyChanged.raiseEvent(["storeyHeightsBelowGround"])); + } + getStoreyHeightsBelowGround(t) { + return Os(t.get("olcs_storeyHeightsBelowGround"), this.storeyHeightsBelowGround); + } + get modelUrl() { + return this._modelUrl; + } + set modelUrl(t) { + S(t, ie(String)), this._modelUrl !== t && (this._modelUrl = t, this.propertyChanged.raiseEvent(["modelUrl"])); + } + getModelUrl(t) { + const e = t.get("olcs_modelUrl"); + return e !== void 0 ? e : this.modelUrl; + } + get modelScaleX() { + return this._modelScaleX; + } + set modelScaleX(t) { + S(t, Number), this._modelScaleX !== t && (this._modelScaleX = t, this.propertyChanged.raiseEvent(["modelScaleX"])); + } + getModelScaleX(t) { + return k(t.get("olcs_modelScaleX"), this.modelScaleX); + } + get modelScaleY() { + return this._modelScaleY; + } + set modelScaleY(t) { + S(t, Number), this._modelScaleY !== t && (this._modelScaleY = t, this.propertyChanged.raiseEvent(["modelScaleY"])); + } + getModelScaleY(t) { + return k(t.get("olcs_modelScaleY"), this.modelScaleY); + } + get modelScaleZ() { + return this._modelScaleZ; + } + set modelScaleZ(t) { + S(t, Number), this._modelScaleZ !== t && (this._modelScaleZ = t, this.propertyChanged.raiseEvent(["modelScaleZ"])); + } + getModelScaleZ(t) { + return k(t.get("olcs_modelScaleZ"), this.modelScaleZ); + } + get modelHeading() { + return this._modelHeading; + } + set modelHeading(t) { + S(t, Number), this._modelHeading !== t && (this._modelHeading = t, this.propertyChanged.raiseEvent(["modelHeading"])); + } + getModelHeading(t) { + return k(t.get("olcs_modelHeading"), this.modelHeading); + } + get modelPitch() { + return this._modelPitch; + } + set modelPitch(t) { + S(t, Number), this._modelPitch !== t && (this._modelPitch = t, this.propertyChanged.raiseEvent(["modelPitch"])); + } + getModelPitch(t) { + return k(t.get("olcs_modelPitch"), this.modelPitch); + } + get modelRoll() { + return this._modelRoll; + } + set modelRoll(t) { + S(t, Number), this._modelRoll !== t && (this._modelRoll = t, this.propertyChanged.raiseEvent(["modelRoll"])); + } + getModelRoll(t) { + return k(t.get("olcs_modelRoll"), this.modelRoll); + } + /** + * Model options are merged with the model definition from model url, scale and orientation and accepts any option + * passed to a Cesium.Model. + */ + get modelOptions() { + return this._modelOptions; + } + set modelOptions(t) { + S(t, ie(Object)), this._modelOptions !== t && (this._modelOptions = t, this.propertyChanged.raiseEvent(["modelOptions"])); + } + /** + * Get the features or the properties modelOptions. + * @param feature + */ + getModelOptions(t) { + const e = t.get("olcs_modelOptions"); + if (e) + return e; + if (this.modelOptions) + return this.modelOptions; + } + get modelAutoScale() { + return this._modelAutoScale; + } + set modelAutoScale(t) { + S(t, ie(Boolean)); + const e = !!t; + this._modelAutoScale !== e && (this._modelAutoScale = e, this.propertyChanged.raiseEvent(["modelAutoScale"])); + } + getModelAutoScale(t) { + const e = t.get("olcs_modelAutoScale"); + return e !== void 0 ? e : this.modelAutoScale; + } + get baseUrl() { + return this._baseUrl; + } + set baseUrl(t) { + S(t, ie(String)), this._baseUrl !== t && (this._baseUrl = t, this.propertyChanged.raiseEvent(["baseUrl"])); + } + getBaseUrl(t) { + const e = t.get("olcs_baseUrl"); + return e !== void 0 ? e : this.baseUrl; + } + get primitiveOptions() { + return this._primitiveOptions; + } + set primitiveOptions(t) { + S(t, ie(Object)), this._primitiveOptions !== t && (this._primitiveOptions = t, this.propertyChanged.raiseEvent(["primitiveOptions"])); + } + getPrimitiveOptions(t) { + const e = t.get("olcs_primitiveOptions"); + return e !== void 0 ? e : this.primitiveOptions; + } + _getBaseOptions(t) { + return { + // 0 is not a valid scale value and will crash cesium + scale: [ + this.getModelScaleX(t) || 1, + this.getModelScaleY(t) || 1, + this.getModelScaleZ(t) || 1 + ], + heading: this.getModelHeading(t), + pitch: this.getModelPitch(t), + roll: this.getModelRoll(t), + autoScale: this.getModelAutoScale(t) + }; + } + /** + * Returns the primive definition of this feature + * @param feature + */ + getPrimitive(t) { + const e = this.getPrimitiveOptions(t); + return e != null && e.geometryOptions ? { + ...this._getBaseOptions(t), + primitiveOptions: e + } : null; + } + getModel(t) { + let e = this.getModelUrl(t); + if (!e) + return null; + const s = this.getBaseUrl(t); + return s && (e = new URL(e, s).toString()), { + ...this._getBaseOptions(t), + url: e + }; + } + /** + * Determines if a feature (in general with a point geometry) should be rendered as a geometry (billboard & label etc) or a model or a primitive + * @param feature + */ + renderAs(t) { + var s; + if (t.get("olcs_modelUrl")) + return "model"; + const e = t.get("olcs_primitiveOptions"); + return e != null && e.geometryOptions ? "primitive" : this.modelUrl ? "model" : (s = this.primitiveOptions) != null && s.geometryOptions ? "primitive" : "geometry"; + } + /** + * resets values, either given, or default Value raises propertyChanged event once; + * @param vcsMeta + */ + setVcsMeta(t) { + const e = Gt.getDefaultOptions(); + t.altitudeMode || (t.altitudeMode = ar(this.altitudeMode)), Object.assign(e, t), this.setValues(e); + } + /** + * sets given values only raises propertyChanged event if a value has been set; + * @param options + */ + setValues(t) { + const e = Gt.getDefaultOptions(), s = []; + if ("altitudeMode" in t) { + const r = Ri(e.altitudeMode, mr, void 0), n = Ri(t.altitudeMode, mr, r); + this._altitudeMode !== n && (this._altitudeMode = n, s.push("altitudeMode")); + } + if ("allowPicking" in t) { + const r = ce(t.allowPicking, e.allowPicking); + this._allowPicking !== r && (this._allowPicking = r, s.push("allowPicking")); + } + if ("classificationType" in t) { + const r = Ri(e.classificationType, pr, void 0), n = Ri(t.classificationType, pr, r); + this._classificationType !== n && (this._classificationType = n, s.push("classificationType")); + } + if ("scaleByDistance" in t) { + const r = go(t.scaleByDistance, void 0); + wr.equals(r, this._scaleByDistance) || (this._scaleByDistance = r, s.push("scaleByDistance")); + } + if ("eyeOffset" in t) { + const r = mo(t.eyeOffset, void 0); + _.equals(r, this._eyeOffset) || (this._eyeOffset = r, s.push("eyeOffset")); + } + if ("heightAboveGround" in t) { + const r = k(t.heightAboveGround, e.heightAboveGround); + r !== this._heightAboveGround && (this._heightAboveGround = r, s.push("heightAboveGround")); + } + if ("skirt" in t) { + const r = k(t.skirt, e.skirt); + r !== this._skirt && (this._skirt = r, s.push("skirt")); + } + if ("groundLevel" in t) { + const r = k(t.groundLevel, e.groundLevel); + r !== this._groundLevel && (this._groundLevel = r, s.push("groundLevel")); + } + if ("extrudedHeight" in t) { + const r = k(t.extrudedHeight, e.extrudedHeight); + r !== this._extrudedHeight && (this._extrudedHeight = r, s.push("extrudedHeight")); + } + if ("storeysAboveGround" in t) { + const r = ne(t.storeysAboveGround, e.storeysAboveGround); + r !== this._storeysAboveGround && (this._storeysAboveGround = r, s.push("storeysAboveGround")); + } + if ("storeysBelowGround" in t) { + const r = ne(t.storeysBelowGround, e.storeysBelowGround); + r !== this._storeysBelowGround && (this._storeysBelowGround = r, s.push("storeysBelowGround")); + } + if ("storeyHeightsAboveGround" in t) { + const r = Os(t.storeyHeightsAboveGround, e.storeyHeightsAboveGround); + Ke(r, this._storeyHeightsAboveGround) || (this._storeyHeightsAboveGround = r, s.push("storeyHeightsAboveGround")); + } + if ("storeyHeightsBelowGround" in t) { + const r = Os(t.storeyHeightsBelowGround, e.storeyHeightsBelowGround); + Ke(r, this._storeyHeightsBelowGround) || (this._storeyHeightsBelowGround = r, s.push("storeyHeightsBelowGround")); + } + if ("modelUrl" in t && t.modelUrl !== this._modelUrl && (this._modelUrl = t.modelUrl ?? "", s.push("modelUrl")), "modelScaleX" in t) { + const r = k(t.modelScaleX, e.modelScaleX); + r !== this._modelScaleX && (this._modelScaleX = r, s.push("modelScaleX")); + } + if ("modelScaleY" in t) { + const r = k(t.modelScaleY, e.modelScaleY); + r !== this._modelScaleY && (this._modelScaleY = r, s.push("modelScaleY")); + } + if ("modelScaleZ" in t) { + const r = k(t.modelScaleZ, e.modelScaleZ); + r !== this._modelScaleZ && (this._modelScaleZ = r, s.push("modelScaleZ")); + } + if ("modelHeading" in t) { + const r = k(t.modelHeading, e.modelHeading); + r !== this._modelHeading && (this._modelHeading = r, s.push("modelHeading")); + } + if ("modelPitch" in t) { + const r = k(t.modelPitch, e.modelPitch); + r !== this._modelPitch && (this._modelPitch = r, s.push("modelPitch")); + } + if ("modelRoll" in t) { + const r = k(t.modelRoll, e.modelRoll); + r !== this._modelRoll && (this._modelRoll = r, s.push("modelRoll")); + } + "modelOptions" in t && (Ke(this._modelOptions, t.modelOptions) || (this._modelOptions = t.modelOptions ? structuredClone(t.modelOptions) : void 0, s.push("modelOptions"))), "modelAutoScale" in t && this._modelAutoScale !== t.modelAutoScale && (this._modelAutoScale = !!t.modelAutoScale, s.push("modelAutoScale")), "baseUrl" in t && t.baseUrl !== this._baseUrl && (this._baseUrl = t.baseUrl ?? "", s.push("baseUrl")), "primitiveOptions" in t && (Ke(this._primitiveOptions, t.primitiveOptions) || (this._primitiveOptions = t.primitiveOptions ? structuredClone(t.primitiveOptions) : void 0, s.push("primitiveOptions"))), s.length && this.propertyChanged.raiseEvent(s); + } + getValues() { + return { + altitudeMode: ar(this.altitudeMode), + allowPicking: this.allowPicking, + classificationType: Dn(this.classificationType), + scaleByDistance: Nn(this.scaleByDistance), + eyeOffset: Rn(this.eyeOffset), + heightAboveGround: this.heightAboveGround, + skirt: this.skirt, + groundLevel: this.groundLevel, + extrudedHeight: this.extrudedHeight, + storeysAboveGround: this.storeysAboveGround, + storeysBelowGround: this.storeysBelowGround, + storeyHeightsAboveGround: this.storeyHeightsAboveGround, + storeyHeightsBelowGround: this.storeyHeightsBelowGround, + modelUrl: this.modelUrl, + modelScaleX: this.modelScaleX, + modelScaleY: this.modelScaleY, + modelScaleZ: this.modelScaleZ, + modelHeading: this.modelHeading, + modelPitch: this.modelPitch, + modelRoll: this.modelRoll, + modelAutoScale: this.modelAutoScale, + modelOptions: this.modelOptions, + baseUrl: this.baseUrl, + primitiveOptions: this.primitiveOptions + }; + } + /** + * The common vector properties for the input features. + * @param features Features for which the vector property values should be returned. + * @returns The common vector properties for the features. When a/all feature(s) does not has a property set, the layer or, if not set, the default value is returned. If features have different values for a property, the property key is not added to the returned obeject. If feature array is empty, an empty object is returned. + */ + getValuesForFeatures(t) { + const e = {}; + if (!t.length) + return e; + function s(N) { + return N.every((rt, Nt, Ai) => Nt === 0 ? !0 : Ke(rt, Ai[0])); + } + const r = t.map((N) => this.getAltitudeMode(N)); + s(r) && (e.altitudeMode = ar(r[0])); + const n = t.map((N) => this.getAllowPicking(N)); + s(n) && (e.allowPicking = n[0]); + const a = t.map((N) => this.getClassificationType(N)); + s(a) && (e.classificationType = Dn(a[0])); + const o = t.map((N) => Nn(this.getScaleByDistance(N))); + s(o) && (e.scaleByDistance = o[0]); + const l = t.map((N) => Rn(this.getEyeOffset(N))); + s(l) && (e.eyeOffset = l[0]); + const c = t.map((N) => this.getHeightAboveGround(N)); + s(c) && (e.heightAboveGround = c[0]); + const d = t.map((N) => this.getSkirt(N)); + s(d) && (e.skirt = d[0]); + const u = t.map((N) => this.getGroundLevel(N)); + s(u) && (e.groundLevel = u[0]); + const f = t.map((N) => this.getExtrudedHeight(N)); + s(f) && (e.extrudedHeight = f[0]); + const g = t.map((N) => this.getStoreysAboveGround(N)); + s(g) && (e.storeysAboveGround = g[0]); + const m = t.map((N) => this.getStoreysBelowGround(N)); + s(m) && (e.storeysBelowGround = m[0]); + const p = t.map((N) => this.getStoreyHeightsAboveGround(N)); + s(p) && (e.storeyHeightsAboveGround = p[0]); + const y = t.map((N) => this.getStoreyHeightsBelowGround(N)); + s(y) && (e.storeyHeightsBelowGround = y[0]); + const v = t.map((N) => this.getModelUrl(N)); + s(v) && (e.modelUrl = v[0]); + const w = t.map((N) => this.getModelScaleX(N)); + s(w) && (e.modelScaleX = w[0]); + const C = t.map((N) => this.getModelScaleY(N)); + s(C) && (e.modelScaleY = C[0]); + const x = t.map((N) => this.getModelScaleZ(N)); + s(x) && (e.modelScaleZ = x[0]); + const E = t.map((N) => this.getModelHeading(N)); + s(E) && (e.modelHeading = E[0]); + const I = t.map((N) => this.getModelPitch(N)); + s(I) && (e.modelPitch = I[0]); + const R = t.map((N) => this.getModelRoll(N)); + s(R) && (e.modelRoll = R[0]); + const D = t.map((N) => this.getModelAutoScale(N)); + s(D) && (e.modelAutoScale = D[0]); + const X = t.map((N) => this.getModelOptions(N)); + s(X) && (e.modelOptions = X[0]); + const te = t.map((N) => this.getPrimitiveOptions(N)); + s(te) && (e.primitiveOptions = te[0]); + const j = t.map((N) => this.getBaseUrl(N)); + return s(j) && (e.baseUrl = j[0]), e; + } + /** + * Sets vector property options on a array of features. When a property equals the value that is returned from the getter of the VectorProperties instance, the property is unset from the feature(s). + * @param options The vector property options to be set on the features. + * @param features The features to set the vector property options on. + */ + setValuesForFeatures(t, e) { + const s = this.getValues(), r = []; + Object.entries(t).forEach(([n, a]) => { + const o = n; + r.push({ + key: o, + value: a, + set: !Ke(a, s[o]) + }); + }), e.forEach((n) => { + r.forEach(({ key: a, set: o, value: l }) => { + const c = `olcs_${a}`; + o ? n.set(c, l) : n.unset(c); + }); + }); + } + // XXX ugly design, this does NOT return a VcsMeta (missing version) but is missued to get config objects too often to change + getVcsMeta(t) { + const e = t || Gt.getDefaultOptions(), s = {}; + return ar(this.altitudeMode) !== e.altitudeMode && (s.altitudeMode = ar(this.altitudeMode)), this.allowPicking !== e.allowPicking && (s.allowPicking = this.allowPicking), Dn(this.classificationType) !== e.classificationType && (s.classificationType = Dn(this.classificationType)), Ke(Nn(this.scaleByDistance), e.scaleByDistance) || (s.scaleByDistance = Nn(this.scaleByDistance)), Ke(Rn(this.eyeOffset), e.eyeOffset) || (s.eyeOffset = Rn(this.eyeOffset)), this.heightAboveGround !== e.heightAboveGround && (s.heightAboveGround = this.heightAboveGround), this.skirt !== e.skirt && (s.skirt = this.skirt), this.groundLevel !== e.groundLevel && (s.groundLevel = this.groundLevel), this.extrudedHeight !== e.extrudedHeight && (s.extrudedHeight = this.extrudedHeight), this.storeysAboveGround !== e.storeysAboveGround && (s.storeysAboveGround = this.storeysAboveGround), this.storeysBelowGround !== e.storeysBelowGround && (s.storeysBelowGround = this.storeysBelowGround), Ke(this.storeyHeightsAboveGround, e.storeyHeightsAboveGround) || (s.storeyHeightsAboveGround = this.storeyHeightsAboveGround), Ke(this.storeyHeightsBelowGround, e.storeyHeightsBelowGround) || (s.storeyHeightsBelowGround = this.storeyHeightsBelowGround), this.modelUrl !== e.modelUrl && (s.modelUrl = this.modelUrl), this.modelScaleX !== e.modelScaleX && (s.modelScaleX = this.modelScaleX), this.modelScaleY !== e.modelScaleY && (s.modelScaleY = this.modelScaleY), this.modelScaleZ !== e.modelScaleZ && (s.modelScaleZ = this.modelScaleZ), this.modelHeading !== e.modelHeading && (s.modelHeading = this.modelHeading), this.modelPitch !== e.modelPitch && (s.modelPitch = this.modelPitch), this.modelRoll !== e.modelRoll && (s.modelRoll = this.modelRoll), this.baseUrl !== e.baseUrl && (s.baseUrl = this.baseUrl), s; + } + /** + * destroys the vectorProperties and removes all listeners + */ + destroy() { + this.propertyChanged.destroy(); + } +} +function Vu(i, t) { + if (i.image && i.image.src && /^data:/.test(i.image.src)) + if (t) { + let e = t.indexOf(i.image.src); + e === -1 && (t.push(i.image.src), e = t.length - 1), i.image.src = `:${e}`; + } else + i.image = { + // XXX is this the correct fallback? + radius: 5 + }; + return i; +} +function Sv(i, t = { version: xi }) { + return i instanceof ge ? t.style = Vu(i.toJSON(), t.embeddedIcons) : i instanceof tt && (t.style = i.toJSON()), t; +} +function wa(i, t) { + if (ws(i, je(li, { type: String }))) { + if (i instanceof li) + return i; + { + const e = mn.createFromTypeOptions(i); + if (e) + return e instanceof ge && t instanceof ge ? e.assign(t.clone().assign(e)) : e; + } + } + return t || Bu.clone(); +} +class Li extends st { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "_style"); + h(this, "_defaultStyle"); + /** + * An event, called when the style of the layer changes. Is passed the new style item as its value. + */ + h(this, "styleChanged", new L()); + /** + * a height offset for rendering of a balloon for a feature of this layer. + */ + h(this, "balloonHeightOffset"); + h(this, "_splitDirection", we.NONE); + /** + * raised if the split direction changes, is passed the split direction as its only argument + */ + h(this, "splitDirectionChanged", new L()); + /** + * FeatureVisibility tracks the highlighting and hiding of features on this layer + */ + h(this, "featureVisibility"); + const s = Li.getDefaultOptions(); + this._style = this.getStyleOrDefaultStyle(e.style), this._defaultStyle = this._style, this.balloonHeightOffset = ne(e.balloonHeightOffset, s.balloonHeightOffset), e.splitDirection && (this._splitDirection = e.splitDirection === "left" ? we.LEFT : we.RIGHT), this.featureVisibility = e.featureVisibility || new qa(); + } + static get className() { + return "FeatureLayer"; + } + static getDefaultOptions() { + return { + ...st.getDefaultOptions(), + style: void 0, + balloonHeightOffset: 10, + splitDirection: void 0 + }; + } + /** + * The style the layer had at construction + */ + get defaultStyle() { + return this._defaultStyle; + } + /** + * style, use setStyle to change + */ + get style() { + return this._style; + } + /** + * The splitDirection to be applied - for 3D vector features currently only working on points with a Model + */ + get splitDirection() { + return this._splitDirection; + } + set splitDirection(e) { + e !== this._splitDirection && (this.getImplementations().forEach((s) => { + s.updateSplitDirection(e); + }), this._splitDirection = e, this.splitDirectionChanged.raiseEvent(this._splitDirection)); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + globalHider: this.globalHider, + featureVisibility: this.featureVisibility, + style: this.style, + splitDirection: this.splitDirection + }; + } + setGlobalHider(e) { + super.setGlobalHider(e), this.forceRedraw(); + } + // eslint-disable-next-line class-methods-use-this + getStyleOrDefaultStyle(e, s) { + return wa(e, s); + } + /** + * Sets the style based on a styleName on a layer + */ + setStyle(e, s) { + S(e, je(K, li, Function)), e instanceof li ? this._style = e : (this._style = new ge({}), this._style.style = e), this.getImplementations().forEach((r) => { + r.updateStyle(this._style, s); + }), this.styleChanged.raiseEvent(this._style); + } + /** + * Clears the style of this layer + */ + clearStyle() { + this.setStyle(this.defaultStyle); + } + toJSON() { + const e = super.toJSON(); + return this.getStyleOrDefaultStyle().equals(this._style) || (e.style = this.style.toJSON()), this._splitDirection !== we.NONE && (e.splitDirection = this._splitDirection === we.RIGHT ? "right" : "left"), e; + } + destroy() { + this.featureVisibility && this.featureVisibility.destroy(), this.styleChanged.destroy(), this.splitDirectionChanged.destroy(), super.destroy(); + } +} +ke.registerClass(Li.className, Li); +class Ui extends jt { + /** + * @param [uniqueKey='name'] - a key to maintain uniquely within the collection. passing false disables uniqueness. + */ + constructor(e) { + super(e); + /** + * Event raised if an item is relocated within the collection. Is passed the moved item. + */ + h(this, "moved"); + h(this, "_previousIndexSymbol"); + this.moved = new L(), this._previousIndexSymbol = Symbol("previousIndex"); + } + static from(e, s) { + const r = new Ui(s); + if (e) + for (const n of e) + r.add(n); + return r; + } + /** + * Get the symbol which is attached to an item prior to its removal. If an item is removed, the current index of the item + * is set on the item with this symbol. + */ + get previousIndexSymbol() { + return this._previousIndexSymbol; + } + /** + * Returns an item at index. + * @param index + */ + get(e) { + return this._array[e]; + } + /** + * Adds an item to the collection. Can optionally be passed an index at which to insert the item. + * @param item - the item to be inserted + * @param index - an optional index at which to insert the item. clipped to the last entry + * @returns the index at which the item was inserted + */ + add(e, s) { + if (this._checkUniqueness(e)) { + let r = this._array.length; + return s != null && s < this._array.length ? (r = s >= 0 ? s : 0, this._array.splice(r, 0, e)) : this._array.push(e), this.added.raiseEvent(e), r; + } + return null; + } + remove(e) { + e[this._previousIndexSymbol] = this._array.indexOf(e), super.remove(e); + } + _move(e, s, r) { + let n = r; + return n = n >= 0 ? n : 0, n = n < this._array.length ? n : this._array.length - 1, s !== n && (this._array.splice(s, 1), this._array.splice(n, 0, e), this.moved.raiseEvent(e)), n; + } + /** + * Moves an item to a provided index + * @returns the new index of the item + */ + moveTo(e, s) { + const r = this._array.indexOf(e); + return r > -1 ? this._move(e, r, s) : null; + } + /** + * Lowers an item within the array + * @param [steps=1] - an integer number to lower by + * @returns the new index of the item + */ + lower(e, s = 1) { + const r = this._array.indexOf(e); + return r > -1 ? this._move(e, r, r - Math.ceil(s)) : null; + } + /** + * Raises an item within the array + * @param [steps=1] - an integer number to lower by + * @returns the new index of the item + */ + raise(e, s = 1) { + const r = this._array.indexOf(e); + return r > -1 ? this._move(e, r, r + Math.ceil(s)) : null; + } + /** + * Returns the index of an item or -1 if it is not part of this collection + */ + indexOf(e) { + return this._array.indexOf(e); + } + /** + * Returns the index of a key. Returns undefined, if there is no uniqueness constraint + */ + indexOfKey(e) { + if (this.uniqueKey) + return this._array.findIndex((s) => s[this.uniqueKey] === e); + } + destroy() { + super.destroy(), this.moved.destroy(); + } +} +class wv { + constructor() { + h(this, "layers", /* @__PURE__ */ new Map()); + } + /** + * registers a Layer as Exclusive, the activation of a layer triggers the deactivation of all other exclusive Layers. + * The layer collection adds exclusive layers to the manager on adding the layer to the collection. + * @param layer - layer to register + */ + registerLayer(t) { + const { exclusiveGroups: e } = t; + e.length > 0 && (e.forEach((s) => { + this.layers.has(s) || this.layers.set(s, /* @__PURE__ */ new Set()), this.layers.get(s).add(t); + }), t.active && this.handleLayerActivated(t)); + } + /** + * Removes a layer from tracking. Layer collections remove the layer once they are removed from them. + * @param layer - layer to unregister + */ + unregisterLayer(t) { + const { exclusiveGroups: e } = t; + e.length > 0 && e.forEach((s) => { + this.layers.get(s).delete(t); + }); + } + handleSplitDirectionChanged(t) { + t.active && this.handleLayerActivated(t); + } + /** + * handles the changing of a layer + * @param layer + */ + handleLayerActivated(t) { + const { exclusiveGroups: e } = t; + if (e.length > 0) { + const s = t.splitDirection || 0; + e.forEach((r) => { + this.layers.has(r) && this.layers.get(r).forEach((n) => { + n !== t && !(s && n.splitDirection && n.splitDirection !== s) && n.deactivate(); + }); + }); + } + } + handleExclusiveGroupsChanged(t) { + [...this.layers.values()].forEach((e) => { + e.delete(t); + }), this.registerLayer(t); + } + /** + * Gets all layers in the given group + * @param group + */ + getActiveLayersForGroup(t) { + const e = this.layers.get(t); + if (e) { + const s = []; + return e.forEach((r) => { + r.active && s.push(r); + }), s; + } + return []; + } + /** + * Clears all layer groups + */ + clear() { + this.layers.clear(); + } + /** + * Destroys the ExclusiveManager + */ + destroy() { + this.clear(); + } +} +const Cv = Number.MAX_SAFE_INTEGER; +class Ei extends Ui { + constructor() { + super(); + h(this, "_layerEventListeners"); + h(this, "_zIndexSymbol"); + /** + * Event raised, when a layer of this collection changes its state. Passed the layer. + */ + h(this, "stateChanged"); + /** + * The exclusive manager for this collection. Layers within this collection are automatically added and tracked. + */ + h(this, "exclusiveManager"); + /** + * The global hider for this collection. + */ + h(this, "_globalHider"); + /** + * Locale for this layerCollection, will be synchronized by the vcsApp, if part of an vcsApp. + * This Locale will be set on all Member Layers. On setting the Locale this will trigger a reload of all locale + * aware layers. + */ + h(this, "_locale"); + this._layerEventListeners = {}, this._zIndexSymbol = Symbol("zIndex"), this.stateChanged = new L(), this.exclusiveManager = new wv(), this._globalHider = new tl(), this._locale = "en"; + } + /** + * Creates a LayerCollection from an iterable of layers, such as an Array. + * @param iterable + */ + static from(e) { + const s = new Ei(); + if (e) + for (const r of e) + s.add(r); + return s; + } + /** + * A symbol to describe the local z index of a layer. The local z index must not equal the layers z index, but is + * always consistent in comparison to the neighbouring layers. If a layer is moved other then by z index, the collection + * ensures consistency by setting a new local z index if needed. + */ + get zIndexSymbol() { + return this._zIndexSymbol; + } + /** + * The current global hider of these layers + */ + get globalHider() { + return this._globalHider; + } + /** + * The current global hider of these layers + * @param globalHider + */ + set globalHider(e) { + S(e, tl), this._globalHider = e, this._array.forEach((s) => { + s.setGlobalHider(this._globalHider); + }); + } + get locale() { + return this._locale; + } + set locale(e) { + S(e, String), this._locale !== e && (this._locale = e, [...this].forEach((s) => { + s.locale = this._locale; + })); + } + _listenToLayerEvents(e) { + const s = e.stateChanged.addEventListener((o) => { + o === ve.ACTIVE && this.exclusiveManager.handleLayerActivated(e), this.stateChanged.raiseEvent(e); + }), r = e.zIndexChanged.addEventListener(() => { + this._zIndexChanged(e); + }), n = e.exclusiveGroupsChanged.addEventListener(() => { + this.exclusiveManager.handleExclusiveGroupsChanged(e); + }), a = [s, r, n]; + e.splitDirectionChanged && a.push(e.splitDirectionChanged.addEventListener(() => { + this.exclusiveManager.handleSplitDirectionChanged(e); + })), this._layerEventListeners[e.name] = a; + } + /** + * Determines the location in the array before the first entry with a higher local z index or null if there is no such position + * @param zIndex + * @private + */ + _findZIndexPosition(e) { + const s = this._array.findIndex( + // @ts-ignore + (r) => r[this._zIndexSymbol] > e + ); + return s > -1 ? s : null; + } + /** + * This is callback for a layers zIndex changed. It reevaluates the array given the new zIndex + * an moves the specified layer to its new location determined by findeZIndexPosition or the end of the array failing that. + * @param layer + * @private + */ + _zIndexChanged(e) { + const s = this.indexOf(e); + if (s > -1) { + e[this._zIndexSymbol] = e.zIndex; + let r = this._findZIndexPosition(e.zIndex); + r != null && r > 0 && r > s && (r -= 1), r = r ?? this._array.length - 1, this._move(e, s, r), this._ensureLocalZIndex(e); + } + } + /** + * Ensures the local z index is consistent with the neighbours of a given layer. + * e.g. the layer on elower must have a lower or equal zIndex + * and the one higher a higher or equal zIndex. + */ + _ensureLocalZIndex(e) { + const s = this.indexOf(e), r = e[this._zIndexSymbol]; + if (s > 0) { + const n = this._array[s - 1][this._zIndexSymbol]; + n > r && (e[this._zIndexSymbol] = n); + } + if (s < this._array.length - 1) { + const n = this._array[s + 1][this._zIndexSymbol]; + n < r && (e[this._zIndexSymbol] = n); + } + } + /** + * Adds a layer to the collection. Can optionally be passed an index at which to insert the layer. + * The layer locale will be set to the same locale of the layerCollection. This will trigger a forceRedraw + * of the layer if the layer locale is different and the layer is locale aware. + * @param layer + * @param index + * @returns returns the layer index or null, if the layers name is not unique + */ + add(e, s) { + let r = s; + s == null && (r = this._findZIndexPosition(e.zIndex)); + const n = super.add(e, r); + return n != null && (e[this._zIndexSymbol] = e.zIndex, e.setGlobalHider(this._globalHider), e.locale = this.locale, this._ensureLocalZIndex(e), this._listenToLayerEvents(e), this.exclusiveManager.registerLayer(e)), n; + } + _remove(e) { + return this._layerEventListeners[e.name] && (this._layerEventListeners[e.name].forEach((s) => { + s(); + }), delete this._layerEventListeners[e.name]), delete e[this._zIndexSymbol], e.setGlobalHider(), this.exclusiveManager.unregisterLayer(e), super._remove(e); + } + clear() { + Object.values(this._layerEventListeners).flat().forEach((e) => { + e(); + }), this._array.forEach((e) => { + delete e[this._zIndexSymbol]; + }), this.exclusiveManager.clear(), this._layerEventListeners = {}, super.clear(); + } + destroy() { + Object.values(this._layerEventListeners).flat().forEach((e) => { + e(); + }), this._layerEventListeners = {}, this.exclusiveManager.destroy(), this._globalHider.destroy(), super.destroy(); + } +} +var il; +(function(i) { + i[i.INACTIVE = 1] = "INACTIVE", i[i.ACTIVE = 2] = "ACTIVE", i[i.LOADING = 4] = "LOADING"; +})(il || (il = {})); +const Ht = il, J = Symbol("vcsLayerName"); +function Rh() { + return he("vcMap"); +} +class ci extends Ut { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "mapElement"); + h(this, "_target"); + /** + * The layer collection of this map. LayerCollections can be shared among maps. + * When adding the map to a {@link MapCollection}, the layer collection of the {@link MapCollection} will be set. + */ + h(this, "_layerCollection"); + /** + * Whether to destroy the layerCollection when destroying the map. Defaults to + * false if passing in a LayerCollection and true if a LayerCollection is created. + * Is set to false, when setting a different LayerCollection. + */ + h(this, "destroyLayerCollection"); + h(this, "_collectionListeners"); + h(this, "initialized"); + h(this, "_movementApiCallsDisabled", !1); + h(this, "_movementKeyEventsDisabled", !1); + h(this, "_movementPointerEventsDisabled", !1); + h(this, "movementDisabledChanged"); + /** + * The name of a map to fall back on, if this map cant show a viewpoint + */ + h(this, "fallbackMap"); + /** + * instead of using a fallback map, this map will fail to activate if another map is active and the current viewpoint cannot be shown + */ + h(this, "fallbackToCurrentMap"); + h(this, "_visualizations"); + h(this, "_state"); + /** + * Event raised when the maps state changes. Is passed the {@link MapState} as its only argument. + */ + h(this, "stateChanged"); + /** + * Event raised then the map has a pointer interaction. Raises {@link MapEvent}. + */ + h(this, "pointerInteractionEvent"); + /** + * The split position to use on this map. Is set by the mapCollection + */ + h(this, "_splitPosition"); + h(this, "_postRender"); + const s = ci.getDefaultOptions(); + this.mapElement = document.createElement("div"), this.mapElement.setAttribute("id", Xe()), this.mapElement.classList.add("mapElement"), this.mapElement.style.display = "none", this._target = null, e.target && this.setTarget(e.target), this._layerCollection = e.layerCollection || new Ei(), this.destroyLayerCollection = !e.layerCollection, this._collectionListeners = [], this._setLayerCollectionListeners(), this.initialized = !1, this.movementDisabledChanged = new L(), this.fallbackMap = e.fallbackMap || null, this.fallbackToCurrentMap = ce(e.fallbackToCurrentMap, s.fallbackToCurrentMap), this._visualizations = /* @__PURE__ */ new Map(), this._state = Ht.INACTIVE, this.stateChanged = new L(), this.pointerInteractionEvent = new L(), this._splitPosition = 0.5, this._postRender = new L(); + } + static get className() { + return "VcsMap"; + } + static getDefaultOptions() { + return { + fallbackMap: void 0, + fallbackToCurrentMap: !1 + }; + } + /** + * Whether the map is active or not + */ + get active() { + return this._state === Ht.ACTIVE; + } + /** + * Whether the map is loading or not + */ + get loading() { + return this._state === Ht.LOADING; + } + /** + * The currently set HTML element in which to render the map + */ + get target() { + return this._target; + } + set movementDisabled(e) { + this._movementApiCallsDisabled = e, this._movementKeyEventsDisabled = e, this._movementPointerEventsDisabled = e, Rh().deprecate("movementDisabled", "disableMovement"); + } + /** + * @deprecated use disableMovement() for setting and movementApiCallsDisabled, movementKeyEventsDisabled and movementPointerEventsDisabled getter + */ + get movementDisabled() { + return Rh().deprecate("movementDisabled", 'use the following getters: "movementApiCallsDisabled", "movementKeyEventsDisabled", "movementPointerEventsDisabled"'), this._movementApiCallsDisabled && this._movementKeyEventsDisabled && this._movementPointerEventsDisabled; + } + /** Whether api calls like gotoViewpoint & setting of oblique images are disabled */ + get movementApiCallsDisabled() { + return this._movementApiCallsDisabled; + } + /** Whether movement related key events like the arrow keys for navigating in map are disabled. */ + get movementKeyEventsDisabled() { + return this._movementKeyEventsDisabled; + } + /** Whether movement related pointer events for navigating in map are disabled. */ + get movementPointerEventsDisabled() { + return this._movementPointerEventsDisabled; + } + /** + * The layer collection of this map. LayerCollections can be shared among maps. + * When adding the map to a , the layer collection of the will be set. + * When setting the layer collection, the destroyLayerCollection flag is automatically set to false. + */ + get layerCollection() { + return this._layerCollection; + } + /** + * @param layerCollection + */ + set layerCollection(e) { + S(e, Ei), this.destroyLayerCollection = !1, [...this._layerCollection].forEach((s) => { + s.removedFromMap(this); + }), this._layerCollection = e, this.active && [...this._layerCollection].forEach((s) => { + s.mapActivated(this); + }), this._setLayerCollectionListeners(); + } + get splitPosition() { + return this._splitPosition; + } + /** + * The splitPosition should always be aligned with the mapCollection's splitPosition. + * Use mapCollection to change splitPosition. + */ + set splitPosition(e) { + if (S(e, Number), e < 0 || e > 1) + throw new Error("Position must be between 0 and 1"); + this._splitPosition = e; + } + /** + * An event raised on the maps post render + */ + get postRender() { + return this._postRender; + } + _setLayerCollectionListeners() { + this._collectionListeners.forEach((e) => { + e(); + }), this._collectionListeners = [ + this.layerCollection.moved.addEventListener((e) => { + this.indexChanged(e); + }), + this.layerCollection.added.addEventListener((e) => { + this._layerAdded(e); + }), + this.layerCollection.removed.addEventListener((e) => { + this._layerRemoved(e); + }) + ]; + } + /** + * Determines whether this map can show this viewpoint. Returns true in any other map then {@link ObliqueMap} + */ + // eslint-disable-next-line class-methods-use-this + canShowViewpoint(e) { + return Promise.resolve(!0); + } + /** + * Sets the map target. + */ + setTarget(e) { + S(e, ie(je(String, HTMLElement))), this._target && this._target.removeChild(this.mapElement), this._target = typeof e == "string" ? document.getElementById(e) : e, this._target && this._target.appendChild(this.mapElement); + } + // eslint-disable-next-line class-methods-use-this,no-empty-function + async initialize() { + return Promise.resolve(); + } + /** + * is called if a layer changes its position in the layerCollection. + */ + // eslint-disable-next-line no-unused-vars,class-methods-use-this + indexChanged(e) { + } + /** + * is called if a layer is added to the layerCollection. + */ + _layerAdded(e) { + this.active && e.mapActivated(this); + } + /** + * is called if a layer is added to the layerCollection. + */ + _layerRemoved(e) { + e.removedFromMap(this); + } + /** + * Validates a visualization. A visualization must have the vcsLayeName symbol set and a layer with said name must be + * part of the maps layerCollection. + */ + validateVisualization(e) { + const s = e[J]; + return s == null ? (this.getLogger().warning("item is missing vcsLayerName symbol"), !1) : this.layerCollection.hasKey(s); + } + /** + * Adds a visualization to the visualizations map for its layer. The visualization must be valid, use validateVisualization first + */ + addVisualization(e) { + if (!this.validateVisualization(e)) + throw new Error("Visualization item is not valid, validate before adding"); + const s = e[J]; + this._visualizations.has(s) || this._visualizations.set(s, /* @__PURE__ */ new Set()), this._visualizations.get(s).add(e); + } + /** + * Removes a visualization + */ + removeVisualization(e) { + const s = e[J], r = s ? this._visualizations.get(s) : void 0; + r && s && (r.delete(e), r.size === 0 && this._visualizations.delete(s)); + } + /** + * Gets the visualizations for a specific layer. + */ + getVisualizationsForLayer(e) { + return this._visualizations.get(e.name); + } + /** + * Get all visualizations added to this map. + */ + getVisualizations() { + return [...this._visualizations.values()].map((e) => [...e]).flat(); + } + /** + * activates the map, if necessary initializes the map. + * Once the promise resolves, the map can still be inactive, if deactivate was called while the map was activating. + */ + async activate() { + if (this._state === Ht.INACTIVE) { + if (this._state = Ht.LOADING, this.stateChanged.raiseEvent(Ht.LOADING), this.mapElement.style.display = "", await this.initialize(), this._state !== Ht.LOADING || (this._state = Ht.ACTIVE, await Promise.all([...this.layerCollection].map((e) => e.mapActivated(this))), this._state !== Ht.ACTIVE)) + return; + this.stateChanged.raiseEvent(this._state); + } + } + /** + * deactivates the map + */ + deactivate() { + this._state !== Ht.INACTIVE && (this.mapElement.style.display = "none", this._state = Ht.INACTIVE, [...this.layerCollection].forEach((e) => { + e.mapDeactivated(this); + }), this.stateChanged.raiseEvent(this._state)); + } + /** + * prevent all movement, including api calls (gotoViewpoint, setting oblique images), key and pointer events. + */ + disableMovement(e) { + const s = ws(e, Boolean) ? { + apiCalls: e, + pointerEvents: e, + keyEvents: e + } : e; + this._movementApiCallsDisabled = s.apiCalls, this._movementKeyEventsDisabled = s.keyEvents, this._movementPointerEventsDisabled = s.pointerEvents, this.movementDisabledChanged.raiseEvent(s); + } + /** + * sets the view to the given viewpoint + * @param _viewpoint + * @param _optMaximumHeight during animation (can be used to get rid of the bunny hop) + * gotoViewpoint + */ + // eslint-disable-next-line no-unused-vars,class-methods-use-this + gotoViewpoint(e, s) { + return Promise.resolve(); + } + /** + * Returns the most precise viewpoint possible in ObliqueMap. + */ + // eslint-disable-next-line class-methods-use-this + getViewpoint() { + return Promise.resolve(null); + } + /** + * Returns an approximate viewpoint in ObliqueMap, not requesting terrain. + */ + // eslint-disable-next-line class-methods-use-this + getViewpointSync() { + return null; + } + /** + * Resolution in meters per pixe + * @param _coordinate - coordinate in mercator for which to determine resolution. only required in 3D + */ + // eslint-disable-next-line class-methods-use-this,no-unused-vars + getCurrentResolution(e) { + return 1; + } + // eslint-disable-next-line no-unused-vars,class-methods-use-this + pointIsVisible(e) { + return !1; + } + /** + * Requests this map to render when possible + */ + // eslint-disable-next-line class-methods-use-this + requestRender() { + } + toJSON() { + const e = super.toJSON(); + return this.fallbackMap && (e.fallbackMap = this.fallbackMap), this.fallbackToCurrentMap && (e.fallbackToCurrentMap = this.fallbackToCurrentMap), e; + } + /** + * disposes the map + */ + destroy() { + super.destroy(), this.mapElement && (this.mapElement.parentElement && this.mapElement.parentElement.removeChild(this.mapElement), this.mapElement = document.createElement("div")), this._target = null, this._collectionListeners.forEach((e) => { + e(); + }), this._collectionListeners = [], this.layerCollection && [...this.layerCollection].forEach((e) => { + e.removedFromMap(this); + }), this.stateChanged && this.stateChanged.destroy(), this.destroyLayerCollection && this.layerCollection && this.layerCollection.destroy(), this.pointerInteractionEvent && this.pointerInteractionEvent.destroy(), this._layerCollection = new Ei(), this._layerCollection.destroy(), this._postRender.destroy(); + } +} +Ks.registerClass(ci.className, ci); +var F; +(function(i) { + i[i.NONE = 2] = "NONE", i[i.ALT = 4] = "ALT", i[i.CTRL = 8] = "CTRL", i[i.SHIFT = 16] = "SHIFT", i[i.ALL = 30] = "ALL"; +})(F || (F = {})); +var P; +(function(i) { + i[i.NONE = 0] = "NONE", i[i.CLICK = 32] = "CLICK", i[i.DBLCLICK = 64] = "DBLCLICK", i[i.DRAG = 128] = "DRAG", i[i.DRAGSTART = 256] = "DRAGSTART", i[i.DRAGEND = 512] = "DRAGEND", i[i.MOVE = 1024] = "MOVE", i[i.DRAGEVENTS = 896] = "DRAGEVENTS", i[i.CLICKMOVE = 1056] = "CLICKMOVE", i[i.ALL = 2016] = "ALL"; +})(P || (P = {})); +var Ne; +(function(i) { + i[i.LEFT = 2048] = "LEFT", i[i.RIGHT = 4096] = "RIGHT", i[i.MIDDLE = 8192] = "MIDDLE", i[i.ALL = 14336] = "ALL"; +})(Ne || (Ne = {})); +var at; +(function(i) { + i[i.DOWN = 1] = "DOWN", i[i.UP = 2] = "UP", i[i.MOVE = 3] = "MOVE"; +})(at || (at = {})); +function Fh(i, t, e) { + const s = e.indexOfKey(t[J]); + if (s > -1) { + const r = i.getArray(); + if (!r.includes(t)) { + let n = r.findIndex((a) => e.indexOfKey(a[J]) > s); + n === -1 && (n = r.length), i.insertAt(n, t); + } + } +} +class qr extends ci { + constructor() { + super(...arguments); + h(this, "_olMap", null); + h(this, "_olListeners", []); + } + static get className() { + return "BaseOLMap"; + } + get splitPosition() { + return super.splitPosition; + } + set splitPosition(e) { + super.splitPosition = e, this.requestRender(); + } + get olMap() { + return this._olMap; + } + _raisePointerInteraction(e, s) { + const r = { + "-1": Ne.ALL, + 0: Ne.LEFT, + 1: Ne.MIDDLE, + 2: Ne.RIGHT + }; + let n = e.originalEvent.shiftKey ? F.SHIFT : F.NONE; + n = e.originalEvent.ctrlKey ? F.CTRL : n, n = e.originalEvent.altKey ? F.ALT : n, n !== F.NONE && e.preventDefault(), e.originalEvent.preventDefault(); + const a = [e.coordinate[0], e.coordinate[1]]; + this.pointerInteractionEvent.raiseEvent({ + map: this, + position: a, + positionOrPixel: a, + windowPosition: H.fromArray(e.pixel, 0, new H()), + key: n, + pointer: r[e.originalEvent.button || 0], + pointerEvent: s + }); + } + setTarget(e) { + super.setTarget(e), this._olMap && this.target && this._olMap.updateSize(); + } + initialize() { + if (!this._olMap) { + this._olMap = new rf({ + layers: [], + controls: [], + interactions: nf({ + altShiftDragRotate: !1, + pinchRotate: !1, + shiftDragZoom: !1, + doubleClickZoom: !1 + }), + target: this.mapElement + }); + const e = ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._olMap.on("pointerdown", (a) => { + this._raisePointerInteraction(a, at.DOWN); + }) + ), s = ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._olMap.on("pointerup", (a) => { + this._raisePointerInteraction(a, at.UP); + }) + ), r = this._olMap.on("pointermove", (a) => { + this._raisePointerInteraction(a, at.MOVE); + }), n = this._olMap.on("postrender", (a) => { + this.postRender.raiseEvent({ map: this, originalEvent: a }); + }); + this._olListeners.push(e, s, r, n); + } + return Promise.resolve(); + } + async activate() { + await super.activate(), this.active && this._olMap && this._olMap.updateSize(); + } + indexChanged(e) { + const s = this.getVisualizationsForLayer(e); + s && s.forEach((r) => { + const n = this._olMap.getLayers(); + n.remove(r), Fh(n, r, this.layerCollection); + }); + } + addOLLayer(e) { + this.validateVisualization(e) && (this.addVisualization(e), Fh(this._olMap.getLayers(), e, this.layerCollection)); + } + /** + * Internal API for deregistering representations. + */ + removeOLLayer(e) { + this.removeVisualization(e), this._olMap && this._olMap.getLayers().remove(e); + } + disableMovement(e) { + super.disableMovement(e), this._olMap && this._olMap.getInteractions().forEach((s) => { + s.setActive(!this.movementPointerEventsDisabled); + }); + } + // eslint-disable-next-line no-unused-vars + getCurrentResolution(e) { + const s = this.olMap ? this.olMap.getView() : null; + return s ? s.getResolution() ?? 1 : 1; + } + requestRender() { + this._olMap && this._olMap.render(); + } + destroy() { + this._olMap && this._olMap.setTarget(), le(this._olListeners), super.destroy(); + } +} +Ks.registerClass(qr.className, qr); +class Pe extends qr { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "fixedNorthOrientation"); + const s = Pe.getDefaultOptions(); + this.fixedNorthOrientation = ce(e.fixedNorthOrientation, s.fixedNorthOrientation); + } + static get className() { + return "OpenlayersMap"; + } + static getDefaultOptions() { + return { + ...ci.getDefaultOptions(), + fixedNorthOrientation: !0 + }; + } + async initialize() { + this.initialized || (await super.initialize(), this.olMap.setView(new dl({ + center: [1.2309226203948376e6, 6350766117974091e-9], + zoom: 13 + })), this.initialized = !0); + } + getViewpoint() { + return Promise.resolve(this.getViewpointSync()); + } + getViewpointSync() { + if (!this.olMap) + return null; + const e = this.olMap.getView(), s = e.getCenter(); + if (!s) + return null; + const r = $e(e.getProjection(), "EPSG:4326"), n = Math.PI / 3, a = this.olMap.getViewport(), o = { + height: a.offsetHeight || 1, + width: a.offsetWidth || 1 + }, l = o.width / o.height, c = Math.atan(Math.tan(n * 0.5) / l) * 2, d = r(s.slice(0, 2), void 0, void 0), u = e.getProjection().getMetersPerUnit() ?? 1, g = (e.getResolution() ?? 1) * o.height, m = Math.cos(Math.abs(b.toRadians(d[1]))), p = g * u * m, y = Math.abs(p / 2 / Math.tan(c / 2)), v = -b.toDegrees(e.getRotation()), w = d, C = -90; + return new It({ + groundPosition: w, + pitch: C, + heading: v, + distance: y + }); + } + gotoViewpoint(e) { + if (this.movementApiCallsDisabled || !e.isValid() || !this.olMap) + return Promise.resolve(); + let { heading: s } = e; + this.fixedNorthOrientation && (s = 0); + const r = this.olMap.getView(), n = $e("EPSG:4326", r.getProjection()); + let a = []; + e.groundPosition ? a = e.groundPosition.slice(0, 2) : a = e.cameraPosition.slice(0, 2); + const { distance: o } = e, l = n(a, void 0, void 0), c = Math.PI / 3, d = this.olMap.getViewport(), u = { + height: d.offsetHeight ? d.offsetHeight : 1, + width: d.offsetWidth ? d.offsetWidth : 1 + }, f = u.width / u.height, g = Math.atan(Math.tan(c * 0.5) / f) * 2, m = 2 * (o ?? 1) * Math.tan(g / 2), p = r.getProjection().getMetersPerUnit() ?? 1, y = Math.cos(Math.abs(b.toRadians(a[1]))), w = m / p / y / u.height; + if (e.animate) { + let C = 0; + return !this.fixedNorthOrientation && s != null && (C = -b.toRadians(s)), new Promise((x) => { + r.animate({ + duration: e.duration ? e.duration * 1e3 : 100, + center: l, + easing: af, + // XXX map to viewpoint easingFunctionName? + resolution: w, + rotation: C + }, () => { + x(); + }); + }); + } else + r.setCenter(l), r.setResolution(w), !this.fixedNorthOrientation && s != null && r.setRotation(-b.toRadians(s)); + return Promise.resolve(); + } + pointIsVisible(e) { + if (!this.olMap) + return !1; + const s = this.olMap.getView(), r = s.calculateExtent(this.olMap.getSize()), n = $e(s.getProjection(), "EPSG:4326"), a = [r[0], r[3]], o = [r[2], r[1]], l = [ + n(a, void 0, void 0), + n(o, void 0, void 0) + ]; + return Lc(Ir(l), e[0], e[1]); + } + toJSON() { + const e = super.toJSON(), s = Pe.getDefaultOptions(); + return this.fixedNorthOrientation !== s.fixedNorthOrientation && (e.fixedNorthOrientation = this.fixedNorthOrientation), e; + } +} +Ks.registerClass(Pe.className, Pe); +class es extends Ut { + constructor(e, s) { + super(s); + h(this, "_map"); + h(this, "url"); + h(this, "_state", ve.INACTIVE); + h(this, "_initialized", !1); + h(this, "headers"); + this._map = e, this.url = s.url, this.headers = s.headers; + } + static get className() { + return "LayerImplementation"; + } + get map() { + if (!this._map) + throw new Error("Accessing destroyed implementation"); + return this._map; + } + /** + * Whether this implementation has been initialized (e.g. activated at least once) + */ + get initialized() { + return this._initialized; + } + get active() { + return this._state === ve.ACTIVE; + } + get loading() { + return this._state === ve.LOADING; + } + /** + * interface to initialize this implementation, is used to setup elements which have to be created only once. + * Has to set this.initialized = true; + */ + initialize() { + return this._initialized = !0, Promise.resolve(); + } + /** + * activates the implementation, if the map is also active. calls initialize (only use internally) + * Once the promise resolves, the layer can still be inactive, if deactivate was called while initializing the layer. + */ + async activate() { + this.map.active && !this.active && (this._state = ve.LOADING, await this.initialize(), this.loading && (this._state = ve.ACTIVE)); + } + /** + * deactivates the implementation (only use internally) + */ + deactivate() { + this._state = ve.INACTIVE; + } + /** + * destroys this implementation, after destroying the implementation cannot be used anymore. + */ + destroy() { + this._initialized = !1, this._state = ve.INACTIVE, this._map = void 0, super.destroy(); + } +} +class Ua extends es { + constructor(e, s) { + super(e, s); + h(this, "olLayer", null); + h(this, "splitDirection"); + h(this, "_splitDirectionRenderListeners", null); + this.splitDirection = s.splitDirection; + } + static get className() { + return "LayerOpenlayersImpl"; + } + async initialize() { + this.initialized || (this.olLayer = this.getOLLayer(), this.olLayer[J] = this.name, this.map.addOLLayer(this.olLayer)), await super.initialize(), this.updateSplitDirection(this.splitDirection); + } + async activate() { + await super.activate(), this.active && this.olLayer.setVisible(!0); + } + deactivate() { + super.deactivate(), this.olLayer && this.olLayer.setVisible(!1); + } + /** + * returns the ol Layer + * @returns {import("ol/layer").Layer} + */ + // eslint-disable-next-line class-methods-use-this + getOLLayer() { + throw new Error(); + } + updateSplitDirection(e) { + var s; + this.splitDirection = e, this.initialized && (this.splitDirection === we.NONE && this._splitDirectionRenderListeners ? (le(this._splitDirectionRenderListeners), this._splitDirectionRenderListeners = null, (s = this.olLayer) == null || s.changed()) : e !== we.NONE && !this._splitDirectionRenderListeners && (this._splitDirectionRenderListeners = [], this._splitDirectionRenderListeners.push(this.olLayer.on("prerender", this._splitPreRender.bind(this))), this._splitDirectionRenderListeners.push(this.olLayer.on("postrender", (r) => { + r.context.restore(); + })), this.olLayer.changed())); + } + _splitPreRender(e) { + const s = e.context, r = s.canvas.width * this.map.splitPosition; + s.save(), s.beginPath(), this.splitDirection === we.LEFT ? s.rect(0, 0, r, s.canvas.height) : s.rect(r, 0, s.canvas.width - r, s.canvas.height), s.clip(); + } + destroy() { + this.olLayer && this.map.removeOLLayer(this.olLayer), this.olLayer = null, this._splitDirectionRenderListeners && (le(this._splitDirectionRenderListeners), this._splitDirectionRenderListeners = null), super.destroy(); + } +} +const Is = Symbol("FVlastUpdated"), yr = Symbol("GlobalHiderLastUpdated"); +function Mv(i, t) { + Object.keys(i.highlightedObjects).forEach((e) => { + const s = t.getFeatureById(e); + s && !i.hasHighlightFeature(e, s) && i.addHighlightFeature(e, s); + }), Object.keys(i.hiddenObjects).forEach((e) => { + const s = t.getFeatureById(e); + s && !i.hasHiddenFeature(e, s) && i.addHiddenFeature(e, s); + }), t[Is] = Date.now(); +} +function xv(i, t) { + Object.keys(i.hiddenObjects).forEach((e) => { + const s = t.getFeatureById(e); + s && !i.hasFeature(e, s) && i.addFeature(e, s); + }), t[yr] = Date.now(); +} +function Dl(i, t, e) { + const s = t.on("addfeature", (r) => { + if (!r.feature) + return; + const { feature: n } = r, a = n.getId(); + i.highlightedObjects[a] && i.addHighlightFeature(a, n), i.hiddenObjects[a] && i.addHiddenFeature(a, n), e.hiddenObjects[a] && e.addFeature(a, n); + const o = Date.now(); + t[Is] = o, t[yr] = o; + }); + return (!t[Is] || t[Is] < i.lastUpdated) && Mv(i, t), (!t[yr] || t[yr] < i.lastUpdated) && xv(e, t), [ + i.changed.addEventListener(({ action: r, ids: n }) => { + r === fe.HIGHLIGHT ? (n.forEach((a) => { + const o = t.getFeatureById(a); + o && i.addHighlightFeature(a, o); + }), t[Is] = Date.now()) : r === fe.HIDE && (n.forEach((a) => { + const o = t.getFeatureById(a); + o && i.addHiddenFeature(a, o); + }), t[Is] = Date.now()); + }), + e.changed.addEventListener(({ action: r, ids: n }) => { + r === fe.HIDE && (n.forEach((a) => { + const o = t.getFeatureById(a); + o && e.addFeature(a, o); + }), t[yr] = Date.now()); + }), + () => { + le(s); + } + ]; +} +class ju extends Ua { + constructor(e, s) { + super(e, s); + h(this, "source"); + h(this, "style"); + h(this, "maxResolution"); + h(this, "minResolution"); + h(this, "featureVisibility"); + h(this, "_featureVisibilityListeners", []); + h(this, "olLayer", null); + h(this, "globalHider"); + this.source = s.source, this.style = s.style, this.maxResolution = s.maxResolution, this.minResolution = s.minResolution, this.featureVisibility = s.featureVisibility, this.globalHider = s.globalHider; + } + static get className() { + return "VectorOpenlayersImpl"; + } + // eslint-disable-next-line no-unused-vars + updateStyle(e, s) { + this.style = e, this.initialized && this.olLayer.setStyle(this.style.style); + } + getOLLayer() { + const e = new Ic({ + visible: !1, + source: this.source, + style: this.style.style + }); + return this.minResolution && e.setMinResolution(this.minResolution), this.maxResolution && e.setMaxResolution(this.maxResolution), e; + } + async activate() { + this.active || (await super.activate(), this.active && this._featureVisibilityListeners.length === 0 && (this._featureVisibilityListeners = Dl(this.featureVisibility, this.source, this.globalHider))); + } + deactivate() { + super.deactivate(), this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = []; + } + setVisibility(e) { + this.initialized && this.olLayer.setVisible(e); + } + destroy() { + this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = [], super.destroy(); + } +} +function Ev(i) { + const t = i.getStride(), e = i.getFlatCoordinates(); + if (e.length > 0) { + const s = Math.floor(e.length / t), r = new Array(s); + for (let n = 0; n < s; n++) { + const a = n * t; + r[n] = new Array(t); + for (let o = 0; o < t; o++) + r[n][o] = e[a + o]; + } + return r; + } + return []; +} +function Wt(i, t) { + if (!t && i instanceof of) + return Ev(i); + const e = t; + let s = null; + return i instanceof Ve ? s = [e] : i instanceof xt ? s = e : i instanceof ht ? s = e.reduce((r, n) => r.concat(n)) : i instanceof fl ? s = e : i instanceof Ga ? s = e.reduce((r, n) => r.concat(n)) : i instanceof ks ? s = e.reduce((r, n) => r.concat(n)).reduce((r, n) => r.concat(n)) : i instanceof bt ? s = e : i instanceof Yi && (s = i.getGeometries().map((r, n) => Wt(r, e == null ? void 0 : e[n])).reduce((r, n) => r.concat(n))), s; +} +function $u(i, t) { + const e = Vn(z.mercatorToWgs84(i), t, Math.PI / 2), s = z.wgs84ToMercator(e), r = i[0] - s[0], n = i[1] - s[1], a = r * r, o = n * n, l = Math.sqrt(a + o); + return new bt(i, l); +} +function qu(i) { + return i instanceof bt ? Tc(i) : (i instanceof ht && i.unset("_vcsGeomType"), i); +} +function sl(i) { + const [t, e] = i[i.length - 1]; + i[0][0] === t && i[0][1] === e || i.push(i[0].slice()); +} +function Gh(i) { + const [t, e] = i[i.length - 1]; + i[0][0] === t && i[0][1] === e && i.pop(); +} +function Uu(i) { + if (i instanceof ht) { + const t = i.getCoordinates(); + t.forEach((e) => { + Gh(e); + }), i.setCoordinates(t); + } else if (i instanceof ks) { + const t = i.getCoordinates(); + t.forEach((e) => { + e.forEach((s) => { + Gh(s); + }); + }), i.setCoordinates(t); + } +} +function Ov(i) { + let t = 0; + const e = i.length; + for (let s = 0; s <= e - 2; s++) { + const r = i[s], n = i[s + 1]; + t += r[0] * n[1] - r[1] * n[0]; + } + return t /= 2, t; +} +function bv(i) { + return Ov(i) < 0 && i.reverse(), i; +} +function vt(i) { + return i === "XY" || i === "XYM"; +} +function z1(i) { + const t = i.getLayout(); + if (vt(t)) + return; + const e = i.getCoordinates(); + Wt(i, e).forEach((r) => { + t === "XYZM" ? r[2] = r.pop() : r.pop(); + }), i.setCoordinates(e, t === "XYZM" ? "XYM" : "XY"); +} +async function H1(i, t, e) { + const s = i.getLayout(), r = i.getCoordinates(), n = Wt(i, r), a = n.map((o) => fn(o)); + if (e === Y.CLAMP_TO_GROUND ? await t.sampleHeightMostDetailed(a) : t.terrainProvider.availability ? await Ys(t.terrainProvider, a) : a.forEach((o) => { + o.height = 0; + }), s === "XY" || s === "XYM") { + const o = Math.max(...a.map((l) => l.height)); + n.forEach((l, c) => { + s === "XYM" && (n[c][3] = l[2]), n[c][2] = o; + }); + } else { + const o = n.reduce((l, c, d) => { + const u = a[d].height - c[2]; + return Math.max(u, l); + }, -1 / 0); + Number.isFinite(o) && o !== 0 && n.forEach((l, c) => { + n[c][2] += o; + }); + } + i.setCoordinates(r, s === "XYM" || s === "XYZM" ? "XYZM" : "XYZ"); +} +async function Wu(i, t, e) { + const s = i.getLayout(), r = i.getCoordinates(), n = Wt(i, r), a = n.map((o) => fn(o)); + e === Y.CLAMP_TO_GROUND ? await t.sampleHeightMostDetailed(a) : t.terrainProvider.availability ? await Ys(t.terrainProvider, a) : a.forEach((o) => { + o.height = 0; + }), a.forEach((o, l) => { + s === "XYM" && (n[l][3] = n[l][2]), n[l][2] = o.height; + }), i.setCoordinates(r, s === "XYM" || s === "XYZM" ? "XYZM" : "XYZ"); +} +async function Pv(i, t, e) { + vt(i.getLayout()) && await Wu(i, t, e); +} +function kh(i, t) { + const e = i.getLayout(), s = i.getCoordinates(); + Wt(i, s).forEach((n) => { + e === "XYM" && (n[3] = n[2]), n[2] = t; + }), i.setCoordinates(s, e === "XYM" || e === "XYZM" ? "XYZM" : "XYZ"); +} +async function B1(i, t, e) { + const s = i.clone(), r = s.getGeometry(); + if (!r) + return null; + const n = t.getAltitudeMode(s); + let a = t.getGroundLevel(s); + if (n === Y.NONE) + a != null ? kh(r, a) : vt(r.getLayout()) && await Pv(r, e, Y.CLAMP_TO_GROUND); + else if (Ot(n)) + a != null ? kh(r, a) : await Wu(r, e, n !== Y.CLAMP_TO_TERRAIN ? Y.CLAMP_TO_GROUND : Y.CLAMP_TO_TERRAIN); + else if (ui(n)) { + const o = kl(r); + await Promise.all(o.map(async (l) => { + const c = Rl(s, l, t); + if ({ groundLevel: a } = c, c.clampOrigin) { + const m = [ + fn(c.clampOrigin) + ]; + c.heightReference === Y.RELATIVE_TO_TERRAIN ? await Ys(e.terrainProvider, m) : await e.sampleHeightMostDetailed(m), a = m[0].height; + } + const d = l.getCoordinates(), u = Wt(l, d), { heightAboveGround: f } = c, g = f == null ? (m) => { + m[2] += a; + } : (m) => { + m[2] = a + f; + }; + u.forEach(g), l.setCoordinates(d, "XYZ"); + })), r instanceof fl ? r.setCoordinates(o.map((l) => l.getCoordinates())) : r instanceof ks ? r.setCoordinates(o.map((l) => l.getCoordinates())) : r instanceof Ga ? r.setCoordinates(o.map((l) => l.getCoordinates())) : r instanceof Yi && r.setGeometries(o); + } + return s.set("olcs_altitudeMode", "absolute"), s.unset("olcs_groundLevel"), s.unset("olcs_heightAboveGround"), s; +} +function zh(i, t, e) { + const s = Math.abs(i), r = []; + if (t.length) { + let n = 0; + for (let o = 0; o < t.length; o++) + if (n += t[o], n < s) + r.push(t[o]); + else + return r.push(t[o] - (n - s)), r; + const a = t[t.length - 1]; + for (; n < s; ) + if (n += a, n < s) + r.push(a); + else + return r.push(a - (n - s)), r; + } else if (e) + return new Array(e).fill(s / e); + return [s]; +} +function Hh(i, t) { + if (i && t.length) { + const e = i - t.length; + e > 0 ? t.push(...new Array(e).fill(t[t.length - 1])) : e < 0 && t.splice(t.length + e), i > 100 && t.splice(100); + } else + t.splice(0); +} +function Lv(i, t) { + const e = []; + let s = t; + return i.storeyHeightsAboveGround.forEach((r) => { + const n = s + r; + e.push({ + currentHeight: s, + extrudedHeight: n + }), s = n; + }), s = t, i.storeyHeightsBelowGround.forEach((r) => { + const n = s - r; + e.push({ + currentHeight: s, + extrudedHeight: n + }), s = n; + }), { storeys: e, skirtLevel: s }; +} +function Ot(i) { + return i === Y.CLAMP_TO_GROUND || i === Y.CLAMP_TO_TERRAIN || i === Y.CLAMP_TO_3D_TILE; +} +function ui(i) { + return i === Y.RELATIVE_TO_GROUND || i === Y.RELATIVE_TO_TERRAIN || i === Y.RELATIVE_TO_3D_TILE; +} +function Nl(i) { + return i === Y.NONE; +} +function Iv(i) { + return i === Y.CLAMP_TO_GROUND ? Y.RELATIVE_TO_GROUND : i === Y.CLAMP_TO_TERRAIN ? Y.RELATIVE_TO_TERRAIN : Y.RELATIVE_TO_3D_TILE; +} +function Tv(i, t) { + const e = t.getExtrudedHeight(i); + let s = t.getStoreysAboveGround(i), r = t.getStoreysBelowGround(i), n = t.getStoreyHeightsAboveGround(i), a = t.getStoreyHeightsBelowGround(i); + e && (e > 0 ? (n = zh(e, n, s), s = n.length, a = [], r = 0) : e < 0 && (a = zh(e, a, r), r = a.length, n = [], s = 0)), Hh(s, n), Hh(r, a); + const o = t.getSkirt(i); + return { + extruded: !!(n.length || a.length || o), + storeyHeightsAboveGround: n, + storeyHeightsBelowGround: a, + skirt: o + }; +} +function Av(i) { + const t = i.getStride(), e = i.getFlatCoordinates(); + let s = 0, r = 0; + for (let a = 0; a < e.length; a += t) + s += e[a], r += e[a + 1]; + const n = e.length / t; + return [s / n, r / n]; +} +function Yu(i) { + if (vt(i.getLayout())) + throw new Error("expected geometry to have an YXZ geometry layout"); + const t = i.getStride(), e = i.getFlatCoordinates(); + let s = 1 / 0; + for (let r = 0; r < e.length; r += t) { + const n = e[r + 2]; + s = n < s ? n : s; + } + return s; +} +function Rl(i, t, e) { + const s = Tv(i, e); + let r = e.getAltitudeMode(i), n; + const a = t.getLayout(), o = e.getGroundLevel(i); + if (vt(a) && Nl(r) && o == null && (r = Y.CLAMP_TO_GROUND), Ot(r)) { + const c = t.getType(); + let d = !1; + if ((c === "Point" || c === "MultiPoint") && (d = e.renderAs(i) !== "geometry"), s.extruded || d) + r = Iv(r), n = 0; + else + return { + heightReference: r, + layout: a + }; + } + if (ui(r)) { + n = e.getHeightAboveGround(i) ?? n ?? (vt(a) ? 0 : void 0); + const c = o != null ? void 0 : Av(t), d = !vt(a) && n == null && (!s.extruded || s.extruded && s.storeyHeightsAboveGround.length + s.storeyHeightsBelowGround.length === 1); + return { + ...s, + heightReference: r, + layout: a, + heightAboveGround: n, + clampOrigin: c, + groundLevel: o, + perPositionHeight: d + }; + } + const l = !vt(a) && o == null && (!s.extruded || s.extruded && s.storeyHeightsAboveGround.length + s.storeyHeightsBelowGround.length === 1); + return { + ...s, + groundLevelOrMinHeight: o ?? Yu(t), + perPositionHeight: l, + heightReference: r, + layout: a + }; +} +function Dv(i, t) { + let e = 0; + if (t.heightReference === Y.NONE) + e = t.groundLevelOrMinHeight; + else if (ui(t.heightReference)) { + const s = t; + s.heightAboveGround != null ? e = s.heightAboveGround : e = Yu(i), s.groundLevel && (e += s.groundLevel); + } + return e; +} +function Xu(i) { + if (Ot(i.heightReference)) { + const s = vt(i.layout); + return (r) => { + const n = z.mercatorToWgs84(r); + return n[2] = s ? 0 : n[2], n; + }; + } else if (ui(i.heightReference)) { + const { heightAboveGround: s, groundLevel: r } = i; + return (n) => { + const a = z.mercatorToWgs84(n); + return s != null && (a[2] = s), r && (a[2] += r), a; + }; + } + const { groundLevelOrMinHeight: t, perPositionHeight: e } = i; + return (s) => { + const r = z.mercatorToWgs84(s); + return !e && t && (r[2] = t), r; + }; +} +function Wa(i) { + const t = Xu(i); + return (e) => { + const s = t(e); + return _.fromDegrees(s[0], s[1], s[2]); + }; +} +function Zu(i, t, e, s) { + const r = { + ...i, + perPositionHeight: e, + extrudedHeight: s + }; + return e || (r.height = t), new Bf(r); +} +function Nv(i, t, e, s, r) { + return [ + { + type: "solid", + geometry: Zu(i, e, s, r), + heightInfo: t + } + ]; +} +function Rv(i, t, e, s, r) { + return [ + { + type: "outline", + geometry: new Hf({ + ...i, + height: s ? void 0 : e, + extrudedHeight: r, + perPositionHeight: s, + vertexFormat: Hs.FLAT_VERTEX_FORMAT + }), + heightInfo: t + } + ]; +} +function Fv(i, t, e, s) { + return [ + { + type: "fill", + geometry: Zu(i, e, s), + heightInfo: t + } + ]; +} +function Ju(i, t) { + var r; + const e = k((r = t.getStroke()) == null ? void 0 : r.getWidth(), 1), s = []; + return s.push({ + positions: i.polygonHierarchy.positions, + width: e + }), i.polygonHierarchy.holes.forEach((n) => { + s.push({ + positions: n.positions, + width: e + }); + }), s; +} +function Gv(i, t, e) { + return Ju(i, e).map((s) => ({ + type: "groundLine", + geometry: new ml(s), + heightInfo: t + })); +} +function kv(i, t, e) { + return Ju(i, e).map((s) => ({ + type: "line", + geometry: new ls(s), + heightInfo: t + })); +} +function zv(i, t) { + let e; + const s = [], r = i.getLinearRings(), n = Wa(t); + for (let a = 0; a < r.length; a++) { + const l = r[a].getCoordinates().map(n); + _.equals(l[0], l[l.length - 1]) || l.push(l[0]), a === 0 ? e = l : s.push(new $o(l)); + } + return { + polygonHierarchy: new $o(e, s) + }; +} +function Ku(i) { + if (i.getType() !== "Polygon") + return !1; + const t = i.getFlatCoordinates(), e = i.getEnds(), s = i.getStride(); + if (!e.every((a, o) => { + const l = o ? e[o - 1] : 0; + return a - l >= s * 3; + })) + return !1; + const n = s * 3 * i.getLinearRingCount(); + return t && t.length >= n && i.getLinearRingCount() ? t.every((a) => Number.isFinite(a)) : !1; +} +let po; +function Hv() { + return po || (po = { + type: "polygon", + getGeometryOptions: zv, + createSolidGeometries: Nv, + createOutlineGeometries: Rv, + createFillGeometries: Fv, + createGroundLineGeometries: Gv, + createLineGeometries: kv, + validateGeometry: Ku + }), po; +} +function Qu(i, t, e, s) { + const r = { + ...i, + granularity: 0.02, + extrudedHeight: s + }; + if (!e) + r.height = t; + else { + const n = ee.fromCartesian(i.center); + r.height = n.height; + } + return new jf(r); +} +function Bv(i, t, e, s, r) { + return [ + { + type: "solid", + geometry: Qu(i, e, s, r), + heightInfo: t + } + ]; +} +function Vv(i, t, e, s, r) { + const n = { + ...i, + granularity: 0.02, + extrudedHeight: r + }; + if (!s) + n.height = e; + else { + const a = ee.fromCartesian(i.center); + n.height = a.height; + } + return [ + { + type: "outline", + geometry: new Vf(n), + heightInfo: t + } + ]; +} +function jv(i, t, e, s) { + return [ + { + type: "fill", + geometry: Qu(i, e, s), + heightInfo: t + } + ]; +} +function ed(i, t) { + var d; + const e = k((d = t.getStroke()) == null ? void 0 : d.getWidth(), 1), { center: s, radius: r } = i, n = ee.fromCartesian(s), a = [ + b.toDegrees(n.longitude), + b.toDegrees(n.latitude) + ]; + return { + positions: lf(a, r, 40).getLinearRing(0).getCoordinates().map((u) => _.fromDegrees(u[0], u[1], n.height)), + width: e + }; +} +function $v(i, t, e) { + const s = ed(i, e); + return [ + { + type: "groundLine", + geometry: new ml(s), + heightInfo: t + } + ]; +} +function qv(i, t, e) { + const s = ed(i, e); + return [ + { + type: "line", + geometry: new ls(s), + heightInfo: t + } + ]; +} +function Uv(i, t) { + const e = i.getCenter(), s = e.slice(); + s[0] += i.getRadius(); + const r = Wa(t), n = r(e), a = r(s); + return { + radius: _.distance(n, a), + center: n + }; +} +function td(i) { + if (i.getType() !== "Circle") + return !1; + const t = i.getFlatCoordinates(), e = i.getStride(); + return t && t.length >= e + 1 && t[e] !== t[0] ? t.every((s) => Number.isFinite(s)) : !1; +} +let yo; +function Wv() { + return yo || (yo = { + type: "circle", + getGeometryOptions: Uv, + createSolidGeometries: Bv, + createOutlineGeometries: Vv, + createFillGeometries: jv, + createGroundLineGeometries: $v, + createLineGeometries: qv, + validateGeometry: td + }), yo; +} +var gt; +(function(i) { + i.NONE = "none", i.BOTH = "both", i.START = "start", i.END = "end"; +})(gt || (gt = {})); +function Yv(i, t = 1.5) { + var n; + let e = 13, s = 13, r = [ + [0, 13], + [13, 13], + [6, 0] + ]; + if (rs(i, Tt.SPHERE)) { + const a = Math.floor((((n = i.geometryOptions) == null ? void 0 : n.radius) ?? 1) * t); + return ` + +`; + } + if (rs(i, Tt.BOX) && i.geometryOptions.minimum && i.geometryOptions.maximum) { + const a = Array.isArray(i.geometryOptions.minimum) ? i.geometryOptions.minimum : _.pack(i.geometryOptions.minimum, []), o = Array.isArray(i.geometryOptions.maximum) ? i.geometryOptions.maximum : _.pack(i.geometryOptions.maximum, []); + s = Math.floor((o[0] - a[0]) * t), e = Math.floor((o[1] - a[1]) * t), r = [ + [0, 0], + [s, 0], + [s, e], + [0, e] + ]; + } else if (rs(i, Tt.CYLINDER) && i.geometryOptions.length) { + const a = Math.floor(i.geometryOptions.topRadius * t), o = Math.floor(i.geometryOptions.bottomRadius * t), l = Math.max(a, o); + e = Math.floor(i.geometryOptions.length * t), s = l * 2, r = [ + [s / 2 - o, e], + [s / 2 + o, e], + [s / 2 + a, 0], + [s / 2 - a, 0] + ], o === 0 ? r.splice(1, 1) : a === 0 && r.splice(2, 1); + } + return ``; +} +function Xv() { + return { + type: Tt.CYLINDER, + geometryOptions: { + length: 9, + bottomRadius: 3, + topRadius: 0 + }, + offset: [0, 0, -4.3] + }; +} +class Ya extends K { + constructor(e = {}) { + const s = e.color ?? "#000000", r = { + stroke: new Be({ + color: s, + width: k(e.width, 1) + }), + zIndex: e.zIndex + }, n = e.primitiveOptions ?? Xv(), a = e.arrowIcon ?? { + src: `data:image/svg+xml,${encodeURIComponent(Yv(n))}`, + color: We(s) + }; + r.image = a instanceof Pc ? a : new ni(a); + super(r); + h(this, "primitiveOptions"); + h(this, "end"); + this.primitiveOptions = n, this.end = $a(e.end, gt, gt.END), this.setRenderer(this._render.bind(this)); + } + /** + * Same as getStroke().getWidth() / getStroke().setWidth() + */ + get width() { + var e; + return (e = this.getStroke()) == null ? void 0 : e.getWidth(); + } + set width(e) { + var s; + (s = this.getStroke()) == null || s.setWidth(e); + } + /** + * The color of the stroke and icon styles. Setting the color will not re-apply the icons color. + */ + get color() { + var e; + return ((e = this.getStroke()) == null ? void 0 : e.getColor()) ?? [255, 255, 255, 1]; + } + set color(e) { + var s; + (s = this.getStroke()) == null || s.setColor(e); + } + _drawArrow(e, s, r, n) { + var l; + e.save(); + let a = ((l = this.getImage()) == null ? void 0 : l.getScale()) ?? 1; + a = Array.isArray(a) ? a : [a, a], e.setTransform(a[0], 0, 0, a[1], s[0], s[1]), e.rotate(Math.PI - r); + const o = this.getImage().getImage(n); + e.translate(0, Math.floor(o.height / 2)), e.drawImage(o, -o.width / 2, -o.height / 2), e.restore(); + } + _render(e, s) { + if (s.geometry.getType() === "LineString" && e.length > 1 && this.width) { + const r = s.context; + this.end !== gt.NONE && ((this.end === gt.START || this.end === gt.BOTH) && this._drawArrow(r, e[0], bi(e[1], e[0]), s.pixelRatio), (this.end === gt.END || this.end === gt.BOTH) && this._drawArrow(r, e.at(-1), bi(e.at(-2), e.at(-1)), s.pixelRatio)), r.save(), r.lineJoin = "round", r.lineWidth = this.width, r.strokeStyle = mt(this.color), r.beginPath(), r.moveTo(e[0][0], e[0][1]); + for (let n = 0; n < e.length; n++) + r.lineTo(e[n][0], e[n][1]); + r.stroke(), r.restore(); + } + } + /** + * Returns the style used to render primitives (a style with a circle image and the color of this style). + */ + getOlcsStyle() { + return new K({ + image: new Vi({ + radius: 2, + fill: new et({ color: this.color }) + }) + }); + } + _getCloneOptions() { + return { + color: this.color, + width: this.width, + arrowIcon: this.getImage().clone(), + zIndex: this.getZIndex() + }; + } + clone() { + return new Ya(this._getCloneOptions()); + } +} +function Zv(i, t, e, s) { + const { modelMatrix: r } = i; + let n = e.clone(); + const a = s.clone(); + Object.defineProperty(i, "modelMatrix", { + get() { + return r; + }, + set(o) { + const l = G.getScale(o, new _()); + l.equals(n) || (_.multiplyComponents(l, e, l), G.setScale(o, l, r), n = l, _.multiplyComponents(s, n, a), G.multiplyByPoint(t, a, a), G.setTranslation(r, a, r)); + } + }); +} +function id(i, t) { + const { modelMatrix: e } = i; + let s = t.clone(); + Object.defineProperty(i, "modelMatrix", { + get() { + return e; + }, + set(r) { + const n = G.getScale(r, new _()); + n.equals(s) || (_.multiplyComponents(n, t, n), G.setScale(r, n, e), s = n); + } + }); +} +const Bh = new _(); +function sd(i, t, e, s, r, n, a) { + const o = bu(n), l = (f) => { + f.height += n[2], ee.toCartesian(f, void 0, Bh); + let g = t; + const m = i[nl]; + m != null && (g = new _(m, m, m)); + const p = G.fromScale(g); + a && G.setTranslation(p, _.multiplyComponents(a, g, new _()), p); + const y = ji.headingPitchRollToFixedFrame(Bh, e); + i.modelMatrix = G.multiply(y, p, i.modelMatrix); + }, c = r.updateHeight(o, l, s), d = r.getHeight(o, s); + if (d) { + const f = o.clone(); + f.height = d, l(f); + } + const u = i.destroy.bind(i); + i.destroy = () => { + c(), u(); + }; +} +async function Jv(i, t, e, s, r, n, a) { + const o = s.getModel(i); + if (!o) + return null; + const l = _.fromArray(o.scale), c = us.fromDegrees(o.heading, o.pitch, o.roll), d = s.getAllowPicking(i), u = a == null ? void 0 : a.getFill(); + let f; + if (u instanceof pn) { + const v = u.getColor(); + v && (f = U.fromCssColorString(hf(v))); + } + const g = G.multiply(ji.headingPitchRollToFixedFrame(t, c), G.fromScale(l), new G()), m = s.getModelOptions(i), p = await pl.fromGltfAsync({ + asynchronous: !i[pe], + url: o.url, + modelMatrix: g, + allowPicking: d, + color: f, + ...m + }), y = () => { + p.activeAnimations.addAll({ + loop: $f.REPEAT + }); + }; + if (p.ready) + y(); + else { + const v = p.readyEvent.addEventListener(() => { + v(), y(); + }); + } + return o.autoScale && !_.ONE.equals(l) && id(p, l), ui(n.heightReference) && n.groundLevel == null && sd(p, l, c, n.heightReference, r, e), { + type: "primitive", + item: p, + autoScale: o.autoScale + }; +} +function _o(i, t, e) { + var r, n; + let s; + return rs(i, Tt.CYLINDER) ? s = e ? new qf(i.geometryOptions) : new Vc(i.geometryOptions) : rs(i, Tt.ELLIPSOID) && (Array.isArray((r = i.geometryOptions) == null ? void 0 : r.radii) && (i.geometryOptions.radii = _.fromArray(i.geometryOptions.radii)), Array.isArray((n = i.geometryOptions) == null ? void 0 : n.innerRadii) && (i.geometryOptions.innerRadii = _.fromArray(i.geometryOptions.innerRadii)), s = e ? new Uf(i.geometryOptions) : new jc(i.geometryOptions)), rs(i, Tt.SPHERE) && (s = e ? new Wf(i.geometryOptions) : new Yf(i.geometryOptions)), rs(i, Tt.BOX) && (Array.isArray(i.geometryOptions.minimum) && (i.geometryOptions.minimum = _.fromArray(i.geometryOptions.minimum)), Array.isArray(i.geometryOptions.maximum) && (i.geometryOptions.maximum = _.fromArray(i.geometryOptions.maximum)), s = e ? new Xf(i.geometryOptions) : new yl(i.geometryOptions)), s ? new Ze({ + geometry: s, + attributes: { + color: Dr.fromColor(t) + } + }) : null; +} +function rd(i, t, e, s, r, n, a) { + var R; + const o = r.getPrimitive(i); + if (!o) + return []; + const l = t.getImage(); + let c, d; + if (l instanceof Us ? (c = l.getFill(), d = l.getStroke()) : l && (c = t.getFill(), d = t.getStroke()), !c && !d) + return []; + let u; + c && (u = ri(c.getColor(), [255, 255, 255, 0.4])); + let f; + d && (f = ri(d.getColor(), [255, 255, 255, 0.4])); + const g = _.fromArray(o.scale), m = us.fromDegrees(o.heading, o.pitch, o.roll), p = r.getAllowPicking(i), y = G.fromScale(g); + let v; + ((R = o.primitiveOptions.offset) == null ? void 0 : R.length) === 3 && (v = _.fromArray(o.primitiveOptions.offset), G.setTranslation(y, _.multiplyComponents(v, g, new _()), y)); + const w = ji.headingPitchRollToFixedFrame(e, m), C = G.multiply(w, y, new G()); + let x; + if (o.primitiveOptions.depthFailColor) { + const D = ri(o.primitiveOptions.depthFailColor, [255, 255, 255, 0.4]); + x = new ia({ + translucent: D.alpha < 1, + material: At.fromType("Color", { + color: D + }) + }); + } + const E = (D, X, te) => { + const j = new St({ + asynchronous: !i[pe], + geometryInstances: X.filter((N) => N), + modelMatrix: C, + appearance: new Hs({ + translucent: D, + flat: !0 + }), + depthFailAppearance: te, + allowPicking: p, + ...o.primitiveOptions.additionalOptions + }); + return o.autoScale && (v ? Zv(j, w, g, v) : _.ONE.equals(g) || id(j, g)), ui(a.heightReference) && a.groundLevel == null && sd(j, g, m, a.heightReference, n, s, v), j; + }, I = []; + if (u) + I.push(E(u.alpha < 1 || !!x, [_o(o.primitiveOptions, u)], x)); + else if (x) { + const D = U.TRANSPARENT; + I.push(E(!0, [_o(o.primitiveOptions, D)], x)); + } + return f && I.push(E(f.alpha < 1 || !!x, [ + _o(o.primitiveOptions, f, !0) + ])), I.map((D) => ({ + type: "primitive", + item: D, + autoScale: o.autoScale + })); +} +async function Kv(i, t, e, s, r, n, a) { + const o = r.renderAs(i); + if (o === "model") { + const l = await Jv(i, e, s, r, a, n, t); + return l ? [l] : []; + } + return o === "primitive" ? rd(i, t, e, s, r, a, n) : []; +} +function Qv(i, t, e, s) { + const r = t.getImage(); + if (r) { + const n = new U(1, 1, 1, r.getOpacity()); + let a = null; + r instanceof ni && (r.load(), r.getImageState() === Pn.LOADING && (a = new Promise((l, c) => { + const d = () => { + r.getImageState() === Pn.LOADED || r.getImageState() === Pn.EMPTY ? (l(r.getImage(1)), r.unlistenImageChange(d)) : r.getImageState() === Pn.ERROR && (c(), r.unlistenImageChange(d)); + }; + r.listenImageChange(d); + }))), a || (a = r.getImage(1)); + const o = { + color: n, + scale: r.getScaleArray()[0], + heightReference: e, + verticalOrigin: Lt.BOTTOM, + id: i.getId() + }; + return o.image = a, o.eyeOffset = s.getEyeOffset(i), o.scaleByDistance = s.getScaleByDistance(i), Ot(e) && (o.disableDepthTestDistance = Number.POSITIVE_INFINITY), o; + } + return null; +} +function eS(i, t, e, s) { + const r = t.getText(), n = r ? r.getText() : null; + if (n && r) { + const a = {}; + a.text = n, a.heightReference = e; + const o = r.getOffsetX() ?? 0, l = r.getOffsetY() ?? 0; + a.pixelOffset = new H(o, l), a.scale = r.getScaleArray()[0]; + const c = r.getFont(); + c && (a.font = c); + const d = r.getFill(), u = r.getStroke(); + let f; + d && (a.fillColor = ri( + d.getColor(), + // XXX PatternDescriptor + [0, 0, 0, 1] + ), f = to.FILL), u && (a.outlineWidth = k(u.getWidth(), 1), a.outlineColor = ri(u.getColor(), [0, 0, 0, 1]), f = to.OUTLINE), d && u && (f = to.FILL_AND_OUTLINE), a.style = f; + let g; + switch (r.getTextAlign()) { + case "left": + g = io.LEFT; + break; + case "right": + g = io.RIGHT; + break; + case "center": + default: + g = io.CENTER; + } + a.horizontalOrigin = g; + let m; + switch (r.getTextBaseline()) { + case "top": + m = Lt.TOP; + break; + case "middle": + m = Lt.CENTER; + break; + case "bottom": + m = Lt.BOTTOM; + break; + case "alphabetic": + m = Lt.TOP; + break; + case "hanging": + m = Lt.BOTTOM; + break; + default: + m = Lt.BASELINE; + } + return a.verticalOrigin = m, a.eyeOffset = s.getEyeOffset(i), a.scaleByDistance = s.getScaleByDistance(i), Ot(e) && (a.disableDepthTestDistance = Number.POSITIVE_INFINITY), a; + } + return null; +} +function nd(i) { + if (i.getType() !== "Point") + return !1; + const t = i.getFlatCoordinates(); + return t && t.length >= 2 ? t.every((e) => Number.isFinite(e)) : !1; +} +function tS(i, t, e, s) { + const r = i.skirt + i.storeyHeightsBelowGround.reduce((o, l) => o + l, 0) + i.storeyHeightsAboveGround.reduce((o, l) => o + l, 0), n = _.fromDegrees(e[0], e[1], e[2] - r); + return Fl({ positions: [t, n] }, i, s); +} +function ad(i, t) { + const s = Xu(t)(i.getCoordinates()); + if (!Ot(t.heightReference)) { + const r = t.storeyHeightsAboveGround.reduce((n, a) => n + a, 0); + r && (s[2] += r); + } + return s; +} +async function iS(i, t, e, s, r, n) { + const a = ad(t, n), o = _.fromDegrees(a[0], a[1], a[2]), l = await Kv(i, e, o, a, s, n, r); + if (l.length === 0) { + const c = Qv(i, e, n.heightReference, s); + c && l.push({ + type: "billboard", + item: { ...c, position: o } + }); + const d = eS(i, e, n.heightReference, s); + d && l.push({ + type: "label", + item: { ...d, position: o } + }); + } + return !Ot(n.heightReference) && n.extruded && e.getStroke() && l.push(...tS(n, o, a, e)), l; +} +function Vh(i, t, e) { + let s = Nl(e) ? L0(t, i) : 0; + return s += 90, { + location: t, + pitch: s, + heading: b.toDegrees(bi(i, t) + b.PI_OVER_TWO) + }; +} +function sS(i, t, e, s, r, n) { + var d; + if (t.end === gt.NONE || !((d = t.primitiveOptions) != null && d.geometryOptions)) + return []; + const a = [], o = s.getAltitudeMode(i), l = n ?? e.getCoordinates(); + if ((t.end === gt.START || t.end === gt.BOTH) && a.push(Vh(l[1], l[0], o)), (t.end === gt.END || t.end === gt.BOTH) && a.push(Vh(l.at(-2), l.at(-1), o)), a.length === 0) + return []; + const c = t.getOlcsStyle(); + return a.map((u) => { + const f = new Ve(u.location), g = new Fe({ + ...i.getProperties(), + olcs_primitiveOptions: t.primitiveOptions, + olcs_modelHeading: u.heading, + olcs_modelPitch: u.pitch, + geometry: f, + olcs_modelAutoScale: !0 + }), m = Rl(g, f, s), p = ad(f, m), y = _.fromDegrees(p[0], p[1], p[2]); + return rd(g, c, y, p, s, r, m); + }).flat(); +} +function od(i, t, e, s, r) { + return [ + { + type: "solid", + geometry: Zf.fromConstantHeights({ + ...i, + maximumHeight: s ? void 0 : e, + minimumHeight: r + }), + heightInfo: t + } + ]; +} +function ld(i, t, e, s, r) { + return [ + { + type: "outline", + geometry: Jf.fromConstantHeights({ + ...i, + maximumHeight: s ? void 0 : e, + minimumHeight: r + }), + heightInfo: t + } + ]; +} +function hd(i, t, e) { + const s = k(e.getStroke().getWidth(), 1); + return [ + { + type: "groundLine", + geometry: new ml({ + ...i, + width: s + }), + heightInfo: t + } + ]; +} +function Fl(i, t, e) { + const s = k(e.getStroke().getWidth(), 1); + return [ + { + type: "line", + geometry: new ls({ + ...i, + width: s + }), + heightInfo: t + } + ]; +} +function cd(i, t) { + const e = i.getCoordinates(), s = Wa(t); + return { positions: e.map(s) }; +} +function Gl(i) { + if (i.getType() !== "LineString") + return !1; + const t = i.getFlatCoordinates(), e = i.getStride() * 2; + return t && t.length >= e ? t.every((s) => Number.isFinite(s)) : !1; +} +let vo; +function jh() { + return vo || (vo = { + type: "lineString", + getGeometryOptions: cd, + createSolidGeometries: od, + createOutlineGeometries: ld, + createFillGeometries() { + return []; + }, + createGroundLineGeometries: hd, + createLineGeometries: Fl, + validateGeometry: Gl + }), vo; +} +function rS(i, t, e) { + const s = Wa(e); + return { positions: i.map(s), arcType: sa.NONE }; +} +function nS(i, t) { + return { + type: "arc", + getGeometryOptions: t === Y.NONE ? rS.bind(null, i) : cd, + createSolidGeometries: od, + createOutlineGeometries: ld, + createFillGeometries() { + return []; + }, + createGroundLineGeometries: hd, + createLineGeometries: Fl, + validateGeometry: Gl + }; +} +const ti = Symbol("FeatureArcStruct"), $h = Symbol("ArcStyleId"); +function aS(i, t, e) { + const s = Q.determinant(new Q(i[0], i[1], 1, t[0], t[1], 1, e[0], e[1], 1)); + if (s === 0) + return null; + const r = Q.determinant(new Q(i[0] ** 2 + i[1] ** 2, i[1], 1, t[0] ** 2 + t[1] ** 2, t[1], 1, e[0] ** 2 + e[1] ** 2, e[1], 1)), n = Q.determinant(new Q(i[0] ** 2 + i[1] ** 2, i[0], 1, t[0] ** 2 + t[1] ** 2, t[0], 1, e[0] ** 2 + e[1] ** 2, e[0], 1)), a = [0.5 * (r / s), -0.5 * (n / s)]; + return { + center: a, + radius: Pi(a, i) + }; +} +function oS(i, t, e) { + const s = new H(t[0] - i[0], t[1] - i[1]); + let r = H.normalize(s, new H()); + const { x: n, y: a } = r; + r = new H(a, -n), H.multiplyByScalar(r, e, r); + const o = ja(i, t); + return H.add(r, new H(o[0], o[1]), r), [r.x, r.y]; +} +function lS(i, t, e) { + return i[1] <= t[1] ? e : Math.PI + (Math.PI - e); +} +function hS(i, t, e, s, r, n) { + const a = H.UNIT_X, o = new H(i[0] - e[0], i[1] - e[1]), l = new H(t[0] - e[0], t[1] - e[1]); + let c = H.angleBetween(a, o); + c = lS(e, i, c); + let d = H.angleBetween(o, l); + const u = new Array(r), f = n / s; + c += f, d -= f * 2; + for (let g = 0; g <= r; ++g) { + const m = c + Yn(g, r + 1) * d / r; + u[g] = [ + e[0] + s * Math.cos(m), + e[1] + s * Math.sin(m), + 0 + ]; + } + return u; +} +function cS(i, t, e, s, r, n) { + const a = ja(i, t); + a[2] = a[2] ?? 0, a[2] += e / 2; + const o = Pi(i, t), l = new _(i[0], i[1], i[2] ?? 0), c = new _(a[0], a[1], a[2] ?? 0), d = new _(t[0], t[1], t[2] ?? 0); + let u; + if (n > 0) { + const v = 1 / _.distance(l, c) * n, w = e / 4, C = (v > 0.5 ? Math.abs(1 - v) : v) * w, x = _.lerp(l, c, v, new _()); + x.z += C; + const E = _.lerp(d, c, v, new _()); + E.z += C, u = [x, c, E]; + } else + u = [l, c, d]; + const f = (o - n * 2) / 64, g = new $c({ + times: [0, 0.5, 1], + points: u, + firstTangent: new _(0, 0, r * f), + lastTangent: new _(0, 0, -r * f) + }), m = new Array(s + 1); + let p = new _(); + for (let y = 0; y <= s; y++) + p = g.evaluate(y / s, p), m[y] = [ + p.x, + p.y, + p.z + ]; + return m; +} +function rl(i, t, e, s) { + t[ti] && t[ti].destroy(); + const r = t.getGeometry(), n = [], a = () => { + le(n); + }; + if (n.push(t.on("change:geometry", () => { + rl(i, t, e, s); + })), r instanceof xt) { + n.push(r.on("change", () => { + rl(i, t, e, s); + })); + const o = r.getFirstCoordinate(), l = r.getLastCoordinate(), c = Pi(o, l), d = c * i; + let u = s; + s * 2 > c && (u = 0); + const f = oS(o, l, d), g = aS(o, l, f); + if (!g) { + t[ti] = { + geometry: r, + destroy: a + }; + return; + } + const { center: m, radius: p } = g, y = hS(o, l, m, p, e, u), v = cS(o, l, d, e, i, u); + t[ti] = { + geometry: new xt(y), + coordinates: v, + destroy: a + }; + } else + t[ti] = { + geometry: r, + destroy: a + }; +} +class ud extends Ya { + /** + * @param [options=] + */ + constructor(e = {}) { + super(e); + h(this, "_arcFactor"); + /** + * This styles revision ID. This will enforce an update of a features arc struct, if the feature get applied a new ArcStyle + */ + h(this, "_revisionId", Xe()); + /** + * The number of line segments to interpolate by + */ + h(this, "_numberOfSegments"); + h(this, "_offset"); + this._arcFactor = k(e.arcFactor, 0.15), this._numberOfSegments = ne(e.numberOfSegments, 64), this._offset = k(e.offset, 0), this.setGeometry(this._getFeatureArcGeometry.bind(this)); + } + /** + * The number of segments to render the arc with. + */ + get numberOfSegments() { + return this._numberOfSegments; + } + set numberOfSegments(e) { + S(e, Number), e !== this._numberOfSegments && e > 0 && Number.isInteger(e) && (this._numberOfSegments = e, this._revisionId = Xe()); + } + /** + * An offset from the arc end/start to the starting point / end point + */ + get offset() { + return this._offset; + } + set offset(e) { + S(e, Number), e !== this._offset && e > 0 && (this._offset = e, this._revisionId = Xe()); + } + /** + * The factor with which to calculate the 'height' of an arc using the distance from start to end of the LineString. + */ + get arcFactor() { + return this._arcFactor; + } + set arcFactor(e) { + S(e, Number), e !== this._arcFactor && (this._arcFactor = e, this._revisionId = Xe()); + } + _getFeatureArcGeometry(e) { + var s; + return (!e[ti] || e[$h] !== this._revisionId) && (rl(this._arcFactor, e, this._numberOfSegments, this._offset), e[$h] = this._revisionId), (s = e[ti]) == null ? void 0 : s.geometry; + } + _getCloneOptions() { + const e = super._getCloneOptions(); + return e.arcFactor = this._arcFactor, e.numberOfSegments = this._numberOfSegments, e; + } + clone() { + return new ud(this._getCloneOptions()); + } +} +const Si = new _(); +function uS(i, t) { + return function(s) { + ee.toCartesian(s, void 0, Si), _.subtract(Si, t, Si); + const { modelMatrix: r } = i; + i.modelMatrix = G.setTranslation(r, Si, new G()); + }; +} +function dS(i, t) { + return function(s) { + if (ee.toCartesian(s, void 0, Si), _.subtract(Si, t, Si), i.ready) { + const r = i._primitive, { modelMatrix: n } = r; + r.modelMatrix = G.setTranslation(n, Si, new G()); + } else + i._primitiveOptions.modelMatrix = G.setTranslation(G.IDENTITY, Si, new G()); + }; +} +function fS(i, t, e, s) { + const r = t.destroy.bind(t), n = fn(e); + let a; + t instanceof za ? a = dS(t, ee.toCartesian(n)) : a = uS(t, ee.toCartesian(n)); + const o = i.updateHeight(n, a, s), l = i.getHeight(n, s); + if (l) { + const c = n.clone(); + c.height = l, a(c); + } + t.destroy = () => { + o(), r(); + }; +} +function dd(i, t, e) { + const s = { + flat: !0, + renderState: { + depthTest: { + enabled: !0 + } + } + }, r = t.getColor(); + if (r instanceof CanvasPattern) { + const n = document.createElement("canvas"), a = n.getContext("2d"); + a.fillStyle = r, a.fillRect(0, 0, 300, 300), s.material = At.fromType("Wallpaper", { + image: n, + anchor: Kf.worldToDrawingBufferCoordinates(i, _.fromDegreesArray(gl(e.getGeometry().getExtent()))[0]) + }); + } else { + const n = ri(r, [0, 0, 0, 1]); + s.material = At.fromType("Color", { + color: n + }), s.translucent = n.alpha !== 1; + } + return new ia(s); +} +function fd(i) { + return i === Y.CLAMP_TO_TERRAIN ? os.TERRAIN : i === Y.CLAMP_TO_3D_TILE ? os.CESIUM_3D_TILE : os.BOTH; +} +function gS(i, t, e, s) { + const r = e.getClassificationType(i), n = e.getAllowPicking(i), a = ri( + t.getFill().getColor(), + // XXX PatternDescriptor + [0, 0, 0, 1] + ), o = s.map(({ geometry: c }) => new Ze({ + geometry: c, + attributes: { + color: Dr.fromColor(a) + } + })), l = new Hs({ + flat: !1, + renderState: { + depthTest: { + enabled: !0 + }, + lineWidth: 1 + }, + translucent: a.alpha !== 1 + }); + return { + type: "primitive", + item: new za({ + allowPicking: n, + asynchronous: !i[pe], + classificationType: r, + geometryInstances: o, + appearance: l + }) + }; +} +function mS(i, t, e, s, r) { + const n = e.getAllowPicking(i), a = r.map(({ geometry: l }) => new Ze({ + geometry: l + })), o = dd(s, t.getFill(), i); + return { + type: "primitive", + item: new St({ + shadows: Ha.ENABLED, + allowPicking: n, + asynchronous: !i[pe], + geometryInstances: a, + appearance: o + }) + }; +} +function pS(i, t, e, s, r) { + const n = e.getAllowPicking(i), a = r.map(({ geometry: c }) => new Ze({ + geometry: c + })), o = dd(s, t.getFill(), i), l = e.getClassificationType(i) ?? fd(r[0].heightInfo.heightReference); + return { + type: "primitive", + item: new qc({ + classificationType: l, + allowPicking: n, + asynchronous: !i[pe], + geometryInstances: a, + appearance: o + }) + }; +} +function yS(i, t, e, s) { + const r = e.getAllowPicking(i), n = ri(t.getStroke().getColor(), [0, 0, 0, 1]), a = s.map(({ geometry: l }) => new Ze({ + geometry: l, + attributes: { + color: Dr.fromColor(n) + } + })), o = new Hs({ + flat: !0, + renderState: { + depthTest: { + enabled: !0 + }, + lineWidth: 1 + }, + translucent: n.alpha !== 1 + }); + return { + type: "primitive", + item: new St({ + geometryInstances: a, + appearance: o, + shadows: Ha.ENABLED, + allowPicking: r, + asynchronous: !i[pe] + }) + }; +} +function _S(i, t, e, s) { + var c; + const r = e.getAllowPicking(i), n = s.map(({ geometry: d }) => new Ze({ + geometry: d + })), a = ri(t.getStroke().getColor(), [0, 0, 0, 1]); + let o; + (c = t.getStroke()) != null && c.getLineDash() ? o = At.fromType("Stripe", { + horizontal: !1, + repeat: 500, + evenColor: a, + oddColor: new U(0, 0, 0, 0) + // transparent + }) : o = At.fromType("Color", { color: a }); + const l = new ra({ + renderState: { + depthTest: { + enabled: !0 + }, + lineWidth: 1 + }, + translucent: a.alpha !== 1, + material: o + }); + return { + type: "primitive", + item: new St({ + geometryInstances: n, + appearance: l, + shadows: Ha.ENABLED, + allowPicking: r, + asynchronous: !i[pe] + }) + }; +} +function vS(i, t, e, s) { + var d; + const r = e.getAllowPicking(i), n = s.map(({ geometry: u }) => new Ze({ + geometry: u + })), a = ri(t.getStroke().getColor(), [0, 0, 0, 1]); + let o; + (d = t.getStroke()) != null && d.getLineDash() ? o = At.fromType("Stripe", { + horizontal: !1, + repeat: 500, + evenColor: a, + oddColor: new U(0, 0, 0, 0) + // transparent + }) : o = At.fromType("Color", { color: a }); + const l = new ra({ + renderState: { + depthTest: { + enabled: !0 + }, + lineWidth: 1 + }, + translucent: a.alpha !== 1, + material: o + }), c = e.getClassificationType(i) ?? fd(s[0].heightInfo.heightReference); + return { + type: "primitive", + item: new Uc({ + classificationType: c, + geometryInstances: n, + appearance: l, + allowPicking: r, + asynchronous: !i[pe] + }) + }; +} +function SS(i, t, e, s) { + const r = !!i.getFill(), n = !!i.getStroke(), a = [], o = e.getGeometryOptions(t, s); + if (Ot(s.heightReference)) + r && a.push(...e.createFillGeometries(o, s, 0, !1)), n && a.push(...e.createGroundLineGeometries(o, s, i)); + else { + const l = s, { extruded: c, perPositionHeight: d } = l, u = Dv(t, l); + if (c) { + const f = Lv(l, u); + if (r && f.storeys.forEach((g) => { + a.push(...e.createSolidGeometries(o, s, g.currentHeight, d, g.extrudedHeight)); + }), n && f.storeys.forEach((g) => { + a.push(...e.createOutlineGeometries(o, s, g.currentHeight, d, g.extrudedHeight)); + }), l.skirt) { + const g = f.skirtLevel, m = g - l.skirt, p = l.storeyHeightsBelowGround.length ? !1 : d; + r && a.push(...e.createSolidGeometries(o, s, g, p, m)), n && a.push(...e.createOutlineGeometries(o, s, g, p, m)); + } + } else + r && a.push(...e.createFillGeometries(o, s, u, d)), n && a.push(...e.createLineGeometries(o, s, i)); + } + return a; +} +function Ca(i, t, e = 1) { + const s = []; + return typeof i == "function" ? s.push(...Ca(i(t, e), t, e)) : Array.isArray(i) ? i.forEach((r) => { + s.push(...Ca(r, t, e)); + }) : i instanceof K && s.push(i), s; +} +function kl(i) { + if (i instanceof Ve || i instanceof ht || i instanceof xt || i instanceof bt) + return [i]; + if (i instanceof fl) + return i.getPoints(); + if (i instanceof ks) + return i.getPolygons(); + if (i instanceof Ga) + return i.getLineStrings(); + if (i instanceof Yi) + return i.getGeometriesArray().map(kl).flat(); + throw new Error("Not an implemented geometry"); +} +async function wS(i, t, e, s, r) { + var d, u, f, g; + const n = Rl(i, t, s); + if (t instanceof Ve) + return !e.getImage() && !((d = e.getText()) != null && d.getText()) || !nd(t) ? [] : await iS(i, t, e, s, r, n); + let a, o; + if (t instanceof ht ? a = Hv() : t instanceof xt ? e instanceof Ya ? ((u = i[ti]) != null && u.coordinates ? a = nS((f = i[ti]) == null ? void 0 : f.coordinates, n.heightReference) : a = jh(), o = e) : a = jh() : a = Wv(), !e.getFill() && !e.getStroke() || !a.validateGeometry(t)) + return []; + const l = SS(e, t, a, n); + let c = []; + return o && (c = sS(i, o, t, s, r, (g = i[ti]) == null ? void 0 : g.coordinates)), [...l, ...c]; +} +function gd() { + return { + classificationPrimitive: [], + groundPrimitive: [], + solidPrimitive: [], + outlinePrimitive: [], + linePrimitive: [], + groundLinePrimitive: [], + clampedPrimitives: /* @__PURE__ */ new Map() + }; +} +function CS(i, t, e) { + const s = `${t.join(":")}:${i.heightInfo.heightReference}`; + e.has(s) || e.set(s, []), e.get(s).push(i); +} +function MS(i, t, e, s) { + const r = [], n = gd(), a = e.getClassificationType(t), o = za.isSupported(s), l = qc.isSupported(s), c = Uc.isSupported(s); + return i.forEach((d) => { + if (d.type === "primitive" || d.type === "billboard" || d.type === "label") + r.push(d); + else if (d.type === "groundLine") + c && n.groundLinePrimitive.push(d); + else { + const u = d, { heightReference: f } = u.heightInfo; + ui(f) && u.heightInfo.clampOrigin ? CS(u, u.heightInfo.clampOrigin, n.clampedPrimitives) : d.type === "fill" || d.type === "solid" ? Ot(f) ? l && n.groundPrimitive.push(d) : a != null ? o && n.classificationPrimitive.push(d) : n.solidPrimitive.push(d) : d.type === "outline" ? n.outlinePrimitive.push(d) : d.type === "line" && n.linePrimitive.push(d); + } + }), { batches: n, convertedItems: r }; +} +function xS(i, t, e, s) { + const r = gd(), n = e.getClassificationType(t), a = za.isSupported(s); + return i.forEach((o) => { + o.type === "solid" || o.type === "fill" ? n != null ? a && r.classificationPrimitive.push(o) : r.solidPrimitive.push(o) : o.type === "outline" ? r.outlinePrimitive.push(o) : o.type === "line" && r.linePrimitive.push(o); + }), r; +} +function md(i, t, e, s, r) { + const n = []; + return i.classificationPrimitive.length && n.push(gS(t, e, s, i.classificationPrimitive)), i.solidPrimitive.length && n.push(mS(t, e, s, r, i.solidPrimitive)), i.outlinePrimitive.length && n.push(yS(t, e, s, i.outlinePrimitive)), i.linePrimitive.length && n.push(_S(t, e, s, i.linePrimitive)), i.groundLinePrimitive.length && n.push(vS(t, e, s, i.groundLinePrimitive)), i.groundPrimitive.length && n.push(pS(t, e, s, r, i.groundPrimitive)), i.clampedPrimitives.forEach((a, o) => { + const [l, c, d] = o.split(":").map(Number), u = xS(a, t, s, r), f = md(u, t, e, s, r); + f.forEach(({ item: g }) => { + fS(r, g, [l, c], d); + }), n.push(...f); + }), n; +} +async function pd(i, t, e, s) { + const n = Ca(i.getStyle() || t, i, 0).map((a) => { + const o = a.getGeometryFunction()(i); + return o ? { + style: a, + geometries: kl(o) + } : { + style: a, + geometries: [] + }; + }); + return (await Promise.all(n.map(async ({ geometries: a, style: o }) => { + const c = (await Promise.all(a.map((f) => wS(i, f, o, e, s)))).flat(), { batches: d, convertedItems: u } = MS(c, i, e, s); + return u.push(...md(d, i, o, e, s)), u; + }))).flat(); +} +function yd(i, t) { + t.olFeature = i; +} +function qh(i, t) { + const { length: e } = t; + for (let s = 0; s < e; s++) + if (t.get(s) === i) + return s; + return -1; +} +function Uh(i, t, e, s) { + let r = s[i]; + return r != null && r > e.length && (r = void 0), e.add(t, r); +} +function So(i, t) { + for (let e = 0; e < t.length; e++) { + const s = t.get(e); + (s instanceof pl || s instanceof Wc) && (s.splitDirection = i); + } +} +const nl = Symbol("Scale"), ES = new _(); +function OS(i, t, e) { + let s = new It({}); + return i.getScene().postRender.addEventListener(() => { + const { length: r } = t; + if (r === 0) + return; + const n = i.getViewpointSync(); + if (!(!e.value && s.equals(n, b.EPSILON5))) { + for (let a = 0; a < r; a++) { + const o = t.get(a); + if (!o.isDestroyed()) { + const { modelMatrix: l } = o, c = G.getTranslation(l, ES), d = i.getCurrentResolutionFromCartesian(c); + o[nl] !== d && (o.modelMatrix = G.setScale(l, new _(d, d, d), o.modelMatrix), o[nl] = d); + } + } + e.value = !1, s = n; + } + }); +} +class zl { + constructor(t, e, s) { + h(this, "primitives", new $t()); + h(this, "scaledPrimitives", new $t()); + h(this, "billboards"); + h(this, "labels"); + h(this, "_featureItems", /* @__PURE__ */ new Map()); + h(this, "_convertingFeatures", /* @__PURE__ */ new Map()); + h(this, "splitDirection"); + h(this, "_rootCollection"); + h(this, "_scaledDirty"); + h(this, "_postRenderListener"); + const r = t.getScene(); + this.billboards = new Qf({ scene: r }), this.labels = new eg({ scene: r }), this.splitDirection = s, this._rootCollection = e, this._rootCollection.add(this.primitives), this._rootCollection.add(this.scaledPrimitives), this._rootCollection.add(this.billboards), this._rootCollection.add(this.labels), this._scaledDirty = { value: !0 }, this._postRenderListener = OS(t, this.scaledPrimitives, this._scaledDirty); + } + _addConvertedItems(t, e, s, r) { + const n = s.map((a) => { + let o, l; + return a.type === "primitive" ? a.autoScale ? (o = Uh("scaled", a.item, this.scaledPrimitives, r), o && (l = () => { + const c = qh(o, this.scaledPrimitives); + if (c > -1) + return this._scaledDirty.value = this.scaledPrimitives.remove(o), { + type: "scaled", + index: c + }; + }, this._scaledDirty.value = !0)) : (o = Uh("primitive", a.item, this.primitives, r), o && (l = () => { + const c = qh(o, this.primitives); + if (c > -1) + return this.primitives.remove(o), { + type: "primitive", + index: c + }; + })) : a.type === "billboard" ? (o = this.billboards.add(a.item), o && (l = () => { + this.billboards.remove(o); + })) : a.type === "label" && (o = this.labels.add(a.item), o && (l = () => { + this.labels.remove(o); + })), o && (e && yd(t, o), this.splitDirection && (o instanceof pl || o instanceof Wc) && (o.splitDirection = this.splitDirection)), l; + }).filter((a) => a != null); + this._featureItems.set(t, n); + } + async addFeature(t, e, s, r) { + var c, d, u, f; + (c = this._convertingFeatures.get(t)) == null || c(!0); + let n = !1, a = !1; + this._convertingFeatures.set(t, (g) => { + g ? a = !0 : n = !0; + }); + const o = await pd(t, e, s, r); + if (a) { + o.forEach((g) => { + g.type === "primitive" && g.item.destroy(); + }); + return; + } + const l = ((f = (u = (d = this._featureItems.get(t)) == null ? void 0 : d.map((g) => g())) == null ? void 0 : u.filter((g) => g != null)) == null ? void 0 : f.reduce((g, m) => { + const p = g[m.type]; + return p != null ? g[m.type] = m.index != null && m.index < p ? m.index : g[m.type] : g[m.type] = m.index, g; + }, {})) ?? {}; + this._featureItems.delete(t), n ? o.forEach((g) => { + g.type === "primitive" && g.item.destroy(); + }) : this._addConvertedItems(t, s.getAllowPicking(t), o, l); + } + removeFeature(t) { + var e, s; + (e = this._convertingFeatures.get(t)) == null || e(!1), this._convertingFeatures.delete(t), (s = this._featureItems.get(t)) == null || s.forEach((r) => r()), this._featureItems.delete(t); + } + updateSplitDirection(t) { + this.splitDirection = t, So(t, this.primitives), So(t, this.scaledPrimitives), So(t, this.billboards); + } + clear() { + this.primitives.removeAll(), this._scaledDirty.value = this.scaledPrimitives.length > 0, this.scaledPrimitives.removeAll(), this.billboards.removeAll(), this.labels.removeAll(), this._featureItems.clear(), this._convertingFeatures.forEach((t) => { + t(!0); + }), this._convertingFeatures.clear(); + } + /** + * Destroys this context and all its resources + */ + destroy() { + this._rootCollection && (this._rootCollection.remove(this.primitives), this._rootCollection.remove(this.scaledPrimitives), this._rootCollection.remove(this.billboards), this._rootCollection.remove(this.labels)), this._rootCollection = null, this._convertingFeatures.forEach((t) => { + t(!0); + }), this._convertingFeatures.clear(), this._featureItems.clear(), this._postRenderListener(); + } +} +class bS extends es { + constructor(e, s) { + super(e, s); + h(this, "vectorProperties"); + h(this, "source"); + h(this, "splitDirection"); + h(this, "style"); + h(this, "featureVisibility"); + h(this, "_featureVisibilityListeners", []); + // eslint-disable-next-line class-methods-use-this + h(this, "_removeVectorPropertiesChangeHandler", () => { + }); + h(this, "_rootCollection"); + h(this, "_olListeners", []); + /** + * A set of ol.Features to add once the map is back to cesium + */ + h(this, "_featureToAdd", /* @__PURE__ */ new Set()); + h(this, "_context", null); + h(this, "_scene"); + h(this, "globalHider"); + this.vectorProperties = s.vectorProperties, this.source = s.source, this.splitDirection = s.splitDirection, this.style = s.style, this.featureVisibility = s.featureVisibility, this._rootCollection = new $t(), this._rootCollection[J] = s.name, this.globalHider = s.globalHider; + } + static get className() { + return "VectorCesiumImpl"; + } + _addListeners() { + this._olListeners.push(this.source.on("addfeature", (e) => { + this._addFeature(e.feature).catch(() => { + this.getLogger().error("failed to convert feature"); + }); + })), this._olListeners.push(this.source.on("removefeature", (e) => { + this._removeFeature(e.feature); + })), this._olListeners.push(this.source.on("changefeature", (e) => { + this._featureChanged(e.feature).catch((s) => { + this.getLogger().error("failed to convert feature"); + }); + })), this._removeVectorPropertiesChangeHandler = this.vectorProperties.propertyChanged.addEventListener(this.refresh.bind(this)); + } + _setupContext(e) { + const s = this._rootCollection; + return this._context = new zl(e, s, this.splitDirection), e.addPrimitiveCollection(s), Promise.resolve(); + } + async initialize() { + this.initialized || (this._scene = this.map.getScene(), this._addListeners(), this._addFeatures(this.source.getFeatures()), await this._setupContext(this.map)), await super.initialize(), this.splitDirection && this.updateSplitDirection(this.splitDirection); + } + _addFeatures(e) { + e.forEach((s) => { + this._addFeature(s).catch((r) => { + this.getLogger().error("failed to convert feature", s, r); + }); + }); + } + /** + * converts a feature and adds the associated primitives to the collection of primitives + */ + async _addFeature(e) { + this.active ? await this._context.addFeature(e, this.style.style, this.vectorProperties, this._scene) : this._featureToAdd.add(e); + } + /** + * Forces a complete re-render of all features. + */ + refresh() { + var e; + (e = this._context) == null || e.clear(), this._addFeatures(this.source.getFeatures()); + } + /** + * removes the primitive of the specified feature + */ + _removeFeature(e) { + var s; + (s = this._context) == null || s.removeFeature(e), this._featureToAdd.delete(e); + } + /** + * called when a features property have changed + */ + async _featureChanged(e) { + this._featureToAdd.delete(e), await this._addFeature(e); + } + async activate() { + this.active || (await super.activate(), this.active && (this._addFeatures([...this._featureToAdd]), this._featureToAdd.clear(), this._rootCollection.show = !0, this._featureVisibilityListeners.length === 0 && (this._featureVisibilityListeners = Dl(this.featureVisibility, this.source, this.globalHider)))); + } + deactivate() { + super.deactivate(), this._rootCollection.show = !1, this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = []; + } + updateStyle(e, s) { + this.style = e, this.initialized && !s && this.source.getFeatures().filter((n) => !n.getStyle()).forEach((n) => { + this._featureChanged(n); + }); + } + updateSplitDirection(e) { + var s; + this.splitDirection = e, this.initialized && ((s = this._context) == null || s.updateSplitDirection(e)); + } + _destroyCollection() { + this.map.removePrimitiveCollection(this._rootCollection); + } + destroy() { + var e; + this.initialized && ((e = this._context) == null || e.destroy(), this._destroyCollection()), this._context = null, this._scene = void 0, this._removeVectorPropertiesChangeHandler(), this._olListeners.forEach((s) => { + le(s); + }), this._olListeners = [], this._featureToAdd.clear(), this._featureVisibilityListeners.forEach((s) => { + s(); + }), this._featureVisibilityListeners = [], this.source = null, this.vectorProperties = null, this.featureVisibility = null, this.style = null, this.globalHider = void 0, this._rootCollection = null, super.destroy(); + } +} +var Oe; +(function(i) { + i[i.NORTH = 1] = "NORTH", i[i.EAST = 2] = "EAST", i[i.SOUTH = 3] = "SOUTH", i[i.WEST = 4] = "WEST", i[i.NADIR = 5] = "NADIR"; +})(Oe || (Oe = {})); +const _d = { + north: Oe.NORTH, + east: Oe.EAST, + south: Oe.SOUTH, + west: Oe.WEST, + nadir: Oe.NADIR +}; +function V1(i) { + const t = Object.entries(_d).find(([, e]) => e === i); + return t == null ? void 0 : t[0]; +} +function Ii(i, t) { + return t ? new tg({ + url: i, + headers: t + }) : i; +} +const bs = {}; +async function Ur(i, t, e) { + if (!bs[i]) + return bs[i] = await sh.fromUrl(Ii(i, e), t), bs[i]; + let s = bs[i]; + return (t.requestVertexNormals !== void 0 && s.requestVertexNormals !== t.requestVertexNormals || t.requestWaterMask !== void 0 && s.requestWaterMask !== t.requestWaterMask) && (bs[i] = await sh.fromUrl(Ii(i, e), t), s = bs[i]), s; +} +function Qs(i, t, e, s) { + const r = e ? $e(e.proj, de.proj) : null, n = t.map((o) => { + const l = r ? r(o, o.slice(), o.length) : o; + return ee.fromDegrees(l[0], l[1]); + }), a = s || t.map((o) => o.slice()); + return Ys(i, n).then((o) => (o.forEach((l, c) => { + a[c][2] = l.height || 0; + }), a)); +} +function PS(i, t, e) { + const s = i.tilingScheme.positionToTileXY(e, t, new H()); + return !!i.getTileDataAvailable(s.x, s.y, t); +} +let wo = new H(), Co = new H(); +function Wh(i, t = !1) { + const e = i.slice(), s = Ir(e); + let n = [ + gl(s), + Ac(s), + Dc(s), + ka(s) + ].map((a) => { + let o = 0, l = 1 / 0; + return e.forEach((c, d) => { + const u = oi(a, c); + u < l && (l = u, o = d); + }), e.splice(o, 1)[0]; + }); + return t === Oe.EAST ? n = [n[3], n[0], n[1], n[2]] : t === Oe.SOUTH ? n = [n[2], n[3], n[0], n[1]] : t === Oe.WEST && (n = [n[1], n[2], n[3], n[0]]), n; +} +function or(i, t) { + return wo = H.fromElements(i[0], i[1], wo), Co = H.fromElements(t[0], t[1], Co), H.angleBetween(wo, Co); +} +function Yh(i, t) { + const [[e, s], [r, n]] = i, [[a, o], [l, c]] = t; + let d, u; + const f = { + x: null, + y: null, + onLine1: !1, + onLine2: !1 + }, g = (c - o) * (r - e) - (l - a) * (n - s); + if (g === 0) + return f; + d = s - o, u = e - a; + const m = (l - a) * d - (c - o) * u, p = (r - e) * d - (n - s) * u; + return d = m / g, u = p / g, f.x = e + d * (r - e), f.y = s + d * (n - s), d > 0 && d < 1 && (f.onLine1 = !0), u > 0 && u < 1 && (f.onLine2 = !0), f; +} +function LS(i, t, e, s, r) { + const n = Wh(i, e ? !1 : r), a = Wh(t, e ? r : !1), o = []; + for (let d = 0; d < n.length; ++d) { + const u = []; + for (let m = 0; m < n.length; ++m) { + const p = m === n.length - 1 ? 0 : m + 1; + if (d === m || d === p || m === 3 && p === 0 || m === 1 && p === 2) + continue; + const y = Yh([n[d], s], [n[m], n[p]]); + if (y.x == null || y.y == null) + continue; + const v = [ + s[0] - n[d][0], + s[1] - n[d][1] + ], w = [ + y.x - n[d][0], + y.y - n[d][1] + ], C = or(v, w); + if (C == null || C / (Math.PI * 180) > 5) + continue; + const x = [ + n[m][0] - n[p][0], + n[m][1] - n[p][1] + ], E = [ + n[p][0] - n[m][0], + n[p][1] - n[m][1] + ], I = or(v, x); + if (I == null) + continue; + const R = or(v, E); + if (R == null) + continue; + const D = Pi(n[m], n[p]); + if (D === 0) + continue; + const X = Pi(n[m], [y.x, y.y]) / D; + let te = 0; + X !== 0 && (te = or(E, [ + y.x - n[m][0], + y.y - n[m][1] + ]), te == null) || u.push({ + cornerPoint: d, + intrX: y.x, + intrY: y.y, + angle: I <= R ? I : R, + edgeStart: m, + edgeEnd: p, + ratioStart2End: te / Math.PI * 180 > 5 ? X * -1 : X + }); + } + let f = -1, g = -1; + for (let m = 0; m < u.length; ++m) + u[m].angle > f && (f = u[m].angle, g = m); + g !== -1 && o.push(u[g]); + } + if (o.length < 2) + return null; + const l = []; + for (let d = 0; d < o.length; ++d) + for (let u = d + 1; u < o.length; ++u) + l.push([o[d].angle + o[u].angle, d, u]); + let c = null; + return l.sort().reverse().find((d) => { + const u = [ + o[d[1]], + o[d[2]] + ], f = a[u[0].edgeEnd], g = a[u[0].edgeStart], m = [ + f[0] - g[0], + f[1] - g[1] + ], p = [ + g[0] + m[0] * u[0].ratioStart2End, + g[1] + m[1] * u[0].ratioStart2End + ], y = a[u[1].edgeEnd], v = a[u[1].edgeStart], w = [ + y[0] - v[0], + y[1] - v[1] + ], C = [ + v[0] + w[0] * u[1].ratioStart2End, + v[1] + w[1] * u[1].ratioStart2End + ], x = [ + p[0] - a[u[0].cornerPoint][0], + p[1] - a[u[0].cornerPoint][1] + ], E = [ + C[0] - a[u[1].cornerPoint][0], + C[1] - a[u[1].cornerPoint][1] + ]; + return !(or(x, E) == null || (c = Yh([a[u[0].cornerPoint], p], [a[u[1].cornerPoint], C]), c.x == null || c.y == null)); + }), c; +} +function j1(i, t, e = {}) { + let s; + e.dataProjection && e.dataProjection === i.meta.projection ? s = t : s = e.dataProjection ? as(t, e.dataProjection.proj, i.meta.projection.proj) : as(t, W.proj, i.meta.projection.proj); + function r() { + return { coords: i.transformRealWorld2Image(s), height: i.averageHeight, estimate: !0 }; + } + if (t[2]) { + const n = i.transformRealWorld2Image(s, t[2]); + return Promise.resolve({ + coords: n, + height: t[2], + estimate: !1 + }); + } + return !e.dontUseTerrain && i.meta.terrainProvider ? Qs(i.meta.terrainProvider, [s], i.meta.projection).then(([n]) => n[2] ? { + coords: i.transformRealWorld2Image(s, n[2]), + height: s[2], + estimate: !1 + } : (console.warn("The configured terrain on the oblique layer could not be queried, position might be inaccurate"), r())).catch(() => r()) : Promise.resolve(r()); +} +function vd(i) { + i.count += 1; + const { image: t, worldCoordinate: e, imageCoordinate: s, terrainErrorThreshold: r, terrainErrorCountThreshold: n, count: a, height: o } = i; + return Qs(t.meta.terrainProvider, [e]).then(([l]) => { + if (l[2] != null) { + const c = as(t.transformImage2RealWorld(s, l[2]), t.meta.projection.proj, de.proj); + return c[2] = l[2], Math.abs(o - l[2]) < r || a > n ? { coords: c, estimate: !1 } : (i.height = c[2], i.worldCoordinate = l, vd(i)); + } + return console.log("The configured terrain on the oblique layer could not be queried, position might be inaccurate"), { coords: l, estimate: !0 }; + }).catch(() => ({ coords: e, estimate: !0 })); +} +async function Wr(i, t, e = {}) { + const s = as(i.transformImage2RealWorld(t, i.averageHeight), i.meta.projection.proj, de.proj), r = e.terrainErrorThreshold || 1, n = e.terrainErrorCountThreshold || 3; + let a = { coords: s, estimate: !0 }; + return !e.dontUseTerrain && i.meta.terrainProvider && (a = await vd({ + worldCoordinate: s, + imageCoordinate: t, + image: i, + count: 0, + height: i.averageHeight, + terrainErrorThreshold: r, + terrainErrorCountThreshold: n + })), a.coords = e.dataProjection ? as(a.coords, de.proj, e.dataProjection.proj) : as(a.coords, de.proj, W.proj), a; +} +function $1(i) { + return he("hasSameOrigin").deprecate("hasSameOrigin", "isSameOrigin"), gi(i); +} +function IS(i) { + let t = 0; + for (let e = 0; e < i.length; e++) { + let s = e + 1; + s >= i.length && (s = 0); + const r = i[e], n = i[s], a = oi(r, n); + a > t && (t = a); + } + return Math.sqrt(t); +} +function Sd(i, t) { + const e = IS(t.groundCoordinates), s = Math.PI / 3, r = i.getViewport(), n = { + height: r.offsetHeight || 1, + width: r.offsetWidth || 1 + }, a = n.width / n.height, o = Math.atan(Math.tan(s * 0.5) / a) * 2, [l, c] = t.meta.size, d = l > c ? l : c, u = e / d; + return { + size: n, + fovy: o, + metersPerUnit: u + }; +} +function TS(i, t, e) { + const { size: s, fovy: r, metersPerUnit: n } = Sd(i, t), l = 2 * e * Math.tan(r / 2) / n / s.height; + return i.getView().getZoomForResolution(l); +} +async function AS(i, t, e) { + const s = i instanceof bt ? Tc(i) : i, r = s.getCoordinates(), n = Wt(s, r); + let a = $e(W.proj, e.meta.projection.proj), o = []; + if (e.meta.terrainProvider) { + const l = n.map((c) => (z.mercatorToWgs84(c, !0), ee.fromDegrees(c[0], c[1]))); + a = $e(de.proj, e.meta.projection.proj), o = await Ys(e.meta.terrainProvider, l); + } + return n.forEach((l, c) => { + a(l, l, 3); + const d = o[c] ? o[c].height : null, u = e.transformRealWorld2Image(l, d || l[2] || e.averageHeight); + n[c][0] = u[0], n[c][1] = u[1]; + }), t.setCoordinates(r), t; +} +function DS(i, t, e) { + const s = i.getCoordinates(), n = Wt(i, s).map((a) => Wr(e, a).then((o) => { + a[0] = o.coords[0], a[1] = o.coords[1], a[2] = o.coords[2]; + })); + return Promise.all(n).then(() => (delete t[ze], t.setCoordinates(s), t)); +} +function Xh(i, t = !1) { + const e = i.getGeometry(); + if ((e.get("_vcsGeomType") === "bbox" || e.get("_vcsGeomType") === "rectangle") && t) + return e; + const r = e instanceof bt, n = qu(e); + return n[br] = r, n; +} +function Zh(i, t) { + const e = i.getGeometry(), s = i.getGeometry().clone(); + t.setGeometry(e[ze] ? s : qu(s)), e[ze] && t.getGeometry().setProperties(i.getGeometry().getProperties(), !1), i[kt] = t.getGeometry(); +} +class NS extends es { + constructor() { + super(...arguments); + h(this, "olLayer", null); + } + initialize() { + return this.initialized || (this.olLayer = this.getOLLayer(), this.olLayer[J] = this.name, this.map.addOLLayer(this.olLayer)), super.initialize(); + } + async activate() { + await super.activate(), this.active && this.olLayer && this.olLayer.setVisible(!0); + } + deactivate() { + super.deactivate(), this.olLayer && this.olLayer.setVisible(!1); + } + /** + * returns the ol Layer + */ + // eslint-disable-next-line class-methods-use-this + getOLLayer() { + throw new Error(); + } + destroy() { + this.olLayer && this.map.removeOLLayer(this.olLayer), this.olLayer = null, super.destroy(); + } +} +class wd extends NS { + constructor(e, s) { + super(e, s); + h(this, "obliqueSource", new Tr({})); + h(this, "_featureListeners", {}); + h(this, "_sourceListener", []); + /** + * The extent of the current image for which features where fetched + */ + h(this, "currentExtent", null); + /** + * The image name for which the current features where fetched + */ + h(this, "fetchedFeaturesForImageName", null); + h(this, "_updatingMercator", {}); + h(this, "_updatingOblique", {}); + h(this, "_featureVisibilityListeners", []); + h(this, "globalHider"); + h(this, "source"); + h(this, "style"); + h(this, "featureVisibility"); + h(this, "olLayer", null); + h(this, "_imageChangedListener", null); + this.globalHider = s.globalHider, this.source = s.source, this.style = s.style, this.featureVisibility = s.featureVisibility; + } + static get className() { + return "VectorObliqueImpl"; + } + getOLLayer() { + return new Ic({ + visible: !1, + source: this.obliqueSource, + style: this.style.style + }); + } + // eslint-disable-next-line no-unused-vars + updateStyle(e, s) { + this.style = e, this.initialized && this.olLayer && this.olLayer.setStyle(this.style.style); + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + updateSplitDirection(e) { + } + /** + * clears the current image and fetches features for the next + */ + _onObliqueImageChanged() { + this._clearCurrentImage(), this._fetchFeaturesInView(); + } + _featureInExtent(e) { + if (this.currentExtent) { + const s = e.getGeometry(); + if (s) + return s[ze] || s.intersectsExtent(this.currentExtent); + } + return !1; + } + _addSourceListeners() { + this._sourceListener.push(this.source.on("addfeature", (e) => { + const s = e.feature; + this._featureInExtent(s) && this.addFeature(s); + })), this._sourceListener.push(this.source.on("removefeature", (e) => { + this.removeFeature(e.feature); + })), this._sourceListener.push(this.source.on("changefeature", (e) => { + const s = e.feature, r = s.getId(); + !this._featureListeners[r] && this._featureInExtent(s) && this.addFeature(s); + })); + } + async activate() { + var e; + this.active || (await super.activate(), this.active && (this.olLayer.setVisible(!0), this._featureVisibilityListeners.length === 0 && (this._featureVisibilityListeners = Dl(this.featureVisibility, this.source, this.globalHider)), this._addSourceListeners(), this._imageChangedListener = (e = this.map.imageChanged) == null ? void 0 : e.addEventListener(this._onObliqueImageChanged.bind(this)), this._fetchFeaturesInView())); + } + async addFeature(e) { + if (this.active || (this.fetchedFeaturesForImageName = null), this.active && this.currentExtent) { + const s = e.getId(), r = e.getGeometry(); + if (e[_n]) + return r && !this.obliqueSource.getFeatureById(s) && this.obliqueSource.addFeature(e), Promise.resolve(); + if (this.obliqueSource.getFeatureById(s) || this._updatingOblique[s]) + return Promise.resolve(); + const n = new ue({}); + n.setId(s), n[$r] = e, Zh(e, n), n.setStyle(e.getStyle()), this._setFeatureListeners(e, n), await this._convertToOblique(e, n), this.source.hasFeature(e) && this.obliqueSource.addFeature(n); + } + return Promise.resolve(); + } + _originalGeometryChanged(e, s, r) { + le(e.originalGeometryChanged), le(e.obliqueGeometryChanged), Zh(s, r), this.updateObliqueGeometry(s, r), e.originalGeometryChanged = s.getGeometry().on("change", this.updateObliqueGeometry.bind(this, s, r)), e.obliqueGeometryChanged = r.getGeometry().on("change", this.updateMercatorGeometry.bind(this, s, r)); + } + _setFeatureListeners(e, s) { + const r = s.getId(), n = { + originalFeatureGeometryChanged: e.on("change:geometry", () => { + const a = e.getGeometry(); + if (a[br]) { + le(n.originalGeometryChanged), n.originalGeometryChanged = e.getGeometry().on("change", () => { + this._updatingMercator[r] || (delete a[br], this._originalGeometryChanged(n, e, s)); + }); + return; + } + this._originalGeometryChanged(n, e, s); + }), + originalFeatureChanged: e.on("change", () => { + s.setStyle(e.getStyle()); + }), + originalGeometryChanged: e.getGeometry().on("change", this.updateObliqueGeometry.bind(this, e, s)), + obliqueGeometryChanged: s.getGeometry().on("change", this.updateMercatorGeometry.bind(this, e, s)) + }; + this._featureListeners[r] = n; + } + async _convertToOblique(e, s) { + const r = e.getId(), n = e.getGeometry(), a = s.getGeometry(); + this._updatingOblique[r] = !0; + let o; + n[ze] ? (s.getGeometry().setCoordinates(n.getCoordinates()), o = Promise.resolve()) : o = AS(n, a, this.map.currentImage), await o, this._updatingOblique[r] = null; + } + updateObliqueGeometry(e, s) { + var n; + const r = e.getId(); + this._updatingMercator[r] || (this._updatingOblique[r] != null && clearTimeout(this._updatingOblique[r]), (n = e.getGeometry()) != null && n[ze] ? this._convertToOblique(e, s) : this._updatingOblique[r] = setTimeout(() => { + this._convertToOblique(e, s); + }, 200)); + } + updateMercatorGeometry(e, s) { + const r = e.getId(); + if (this._updatingOblique[r]) + return; + this._updatingMercator[r] != null && clearTimeout(this._updatingMercator[r]); + const n = this.fetchedFeaturesForImageName; + this._updatingMercator[r] = setTimeout(async () => { + const a = Xh(e, !1); + a[br] && e.setGeometry(a); + const o = Xh(s, !0); + this._updatingMercator[r] = !0, await DS(o, a, this.map.collection.getImageByName(n)), this._updatingMercator[r] = null; + }, 200); + } + /** + * Synchronizes image Features if the geometry has been changed. + * also clears source and featureListeners + */ + _clearCurrentImage() { + Object.values(this._featureListeners).forEach((e) => { + le(Object.values(e)); + }), this._featureListeners = {}, this._updatingOblique = {}, this._updatingMercator = {}, this.obliqueSource.getFeatures().forEach((e) => { + const s = e[$r]; + if (s) { + delete s[kt]; + const r = s.getGeometry(); + r != null && r[ze] && this.updateMercatorGeometry(s, e), r == null || delete r[ze]; + } + }), this.obliqueSource.clear(!0), this.fetchedFeaturesForImageName = null; + } + /** + * Fetches the features within the extent of the current image + * @private + */ + _fetchFeaturesInView() { + this.active && this.map.currentImage && this.fetchedFeaturesForImageName !== this.map.currentImage.name && (this.currentExtent = this.map.getExtentOfCurrentImage().getCoordinatesInProjection(W), this.source.forEachFeatureInExtent(this.currentExtent, (e) => { + this.addFeature(e); + }), this.source.forEachFeature((e) => { + var s; + (s = e.getGeometry()) != null && s[ze] && this.addFeature(e); + }), this.fetchedFeaturesForImageName = this.map.currentImage.name); + } + removeFeature(e) { + const s = e.getId(), r = this.obliqueSource.getFeatureById(s); + if (this._updatingOblique[s] != null && (clearTimeout(this._updatingOblique[s]), this._updatingOblique[s] = null), r) { + const n = this._featureListeners[s]; + n && (le(Object.values(n)), delete this._featureListeners[s]), this.obliqueSource.removeFeature(r); + } + } + deactivate() { + super.deactivate(), this.olLayer && this.olLayer.setVisible(!1), this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = [], le(this._sourceListener), this._sourceListener = [], this._imageChangedListener && (this._imageChangedListener(), this._imageChangedListener = null), this._clearCurrentImage(); + } + destroy() { + this.olLayer && this.map.removeOLLayer(this.olLayer), this.olLayer = null, le(this._sourceListener), this._sourceListener = [], this._imageChangedListener && (this._imageChangedListener(), this._imageChangedListener = null), this.obliqueSource.clear(!0), Object.values(this._updatingOblique).forEach((e) => { + e != null && clearTimeout(e); + }), Object.values(this._updatingMercator).forEach((e) => { + e != null && clearTimeout(e); + }), this._clearCurrentImage(), super.destroy(); + } +} +const Hl = Symbol("isDefaultImage"); +var Oc; +Oc = Hl; +class Bl { + constructor(t) { + /** + * Name of the image + */ + h(this, "name"); + /** + * Meta information shared across multiple images. + */ + h(this, "meta"); + /** + * viewDirection + */ + h(this, "viewDirection"); + /** + * viewDirectionAngle in radians, where 0 = east, PI / 2 = north, PI = west and PI * 1.5 = south + */ + h(this, "viewDirectionAngle"); + /** + * The ground coordinates of the image corners (in image world projection). + */ + h(this, "groundCoordinates"); + /** + * The center point of the image in world coordinates (in image world projection). + */ + h(this, "centerPointOnGround"); + /** + * The transformation matrix image to real world (in image world projection). + */ + h(this, "pToRealworld"); + /** + * The transformation matrix real to image (in image world projection). + */ + h(this, "pToImage"); + /** + * The projection center in image world projection + */ + h(this, "projectionCenter"); + /** + * The calculated average height of an image + */ + h(this, "_averageHeight"); + h(this, Oc); + this.name = t.name, this.meta = t.meta, this.viewDirection = t.viewDirection, this.viewDirectionAngle = t.viewDirectionAngle, this.groundCoordinates = t.groundCoordinates, this.centerPointOnGround = t.centerPointOnGround, this.pToRealworld = t.pToRealworld || null, this.pToImage = t.pToImage || null, this.projectionCenter = t.projectionCenter || null, this._averageHeight = null; + } + /** + * returns the averageHeight of the image or 0 if not defined. Be sure to call calculateAverageHeight before hand. + */ + get averageHeight() { + return this._averageHeight != null ? this._averageHeight : 0; + } + /** + * returns whether this image supports exact Coordinate transformation + */ + get hasCamera() { + return !!this.meta.principalPoint; + } + /** + * @param imageCoordinate + * @param optAvgHeight + */ + transformImage2RealWorld(t, e) { + let s = t; + if (this.meta.principalPoint) + this.meta.hasRadial && (s = this.meta.radialDistortionCoordinate(s, !0)); + else return this._transformNoCamera(s, !0, e); + const r = new _(s[0], this.meta.size[1] - s[1], 1), n = Q.multiplyByVector(this.pToRealworld, r, new _()), a = e || this.averageHeight, o = new _(this.centerPointOnGround[0], this.centerPointOnGround[1], a), l = _.subtract(this.projectionCenter, o, new _()), c = _.dot(_.UNIT_Z, l) * -1, d = _.dot(_.UNIT_Z, n), u = c / d, f = _.add(this.projectionCenter, _.multiplyByScalar(n, u, new _()), new _()); + return [f.x, f.y, a]; + } + transformRealWorld2Image(t, e) { + if (!this.meta.principalPoint) + return this._transformNoCamera(t, !1, e); + const s = e || this.averageHeight, r = new rh(t[0], t[1], s, 1), n = G.multiplyByVector(this.pToImage, r, new rh()), a = [n.x / n.z, n.y / n.z], o = [ + a[0], + this.meta.size[1] - a[1] + ]; + return this.meta.radialDistortionCoordinate(o, !1); + } + _transformNoCamera(t, e, s) { + const r = [ + [0, 0], + [this.meta.size[0], 0], + this.meta.size, + [0, this.meta.size[1]] + ], n = LS(e ? r : this.groundCoordinates, e ? this.groundCoordinates : r, e, t, this.viewDirection), a = s || this.averageHeight; + if (n === null || n.x == null || n.y == null) { + console.error("Real world coordinate could not be determined from footprint data, center will be returned"); + const l = [this.centerPointOnGround[0], this.centerPointOnGround[1]]; + return e && l.push(a), l; + } + const o = [n.x, n.y]; + return e && o.push(a), o; + } + /** + * calculates the averageHeight of this image, if a terrainProvider is given the height will be requested + */ + calculateImageAverageHeight() { + if (this._averageHeight === null) { + const t = (this.groundCoordinates[0][2] + this.groundCoordinates[1][2] + this.groundCoordinates[2][2] + this.groundCoordinates[3][2]) / 4; + if (t === 0 && this.meta.terrainProvider) + return Qs(this.meta.terrainProvider, [this.centerPointOnGround.slice()], this.meta.projection).then((e) => { + e[0] && e[0][2] != null && (this._averageHeight = e[0][2]); + }).catch(() => { + this._averageHeight = t; + }); + this._averageHeight = t; + } + return Promise.resolve(); + } +} +class Zn { + constructor(t) { + /** + * The name of the camera associated with these meta data + */ + h(this, "name"); + h(this, "principalPoint"); + h(this, "pixelSize"); + h(this, "radialE2F"); + h(this, "radialF2E"); + h(this, "hasRadial"); + /** + * The size of the images associated with this meta data + */ + h(this, "size"); + /** + * The tile size of the images associated with this meta data + */ + h(this, "tileSize"); + /** + * The tile resolutions of the images associated with this meta data + */ + h(this, "tileResolution"); + /** + * The world projection of the images associated with this meta + */ + h(this, "projection"); + h(this, "url"); + /** + * An optional terrain provider + */ + h(this, "terrainProvider"); + h(this, "format"); + h(this, "headers"); + this.name = t.name, this.principalPoint = t["principal-point"], this.pixelSize = t["pixel-size"], this.radialE2F = t["radial-distorsion-expected-2-found"], this.radialF2E = t["radial-distorsion-found-2-expected"], this.hasRadial = !!(this.pixelSize && this.radialE2F && this.radialF2E), this.size = t.size, this.tileSize = t.tileSize, this.tileResolution = t.tileResolution, this.projection = t.projection, this.url = t.url, this.terrainProvider = t.terrainProvider, this.format = t.format || "jpg", this.headers = t.headers; + } + /** + * Removes radial distortion in image coordinates. Radial coefficients must be provided + * @param coordinate + * @param [useF2E=false] useFound2Expected, if not true expectedToFound is used + */ + radialDistortionCoordinate(t, e) { + if (this.hasRadial && this.principalPoint) { + const s = e ? this.radialF2E : this.radialE2F, r = Pi(this.principalPoint, t) * this.pixelSize[0]; + if (r === 0) + return t.slice(); + const n = t[0] - this.principalPoint[0], a = t[1] - this.principalPoint[1]; + let o = 0; + for (let d = 0; d < s.length; ++d) + o += s[d] * r ** d; + const l = (r + o) / this.pixelSize[0], c = Math.atan2(a, n); + return [ + this.principalPoint[0] + l * Math.cos(c), + this.principalPoint[1] + l * Math.sin(c) + ]; + } + return t.slice(); + } +} +let Jh = 0; +function RS() { + return Jh += 1, Jh; +} +function Cd(i) { + var e, s, r; + const t = {}; + if (i.version) { + const n = i.version.match(/\d+\.\d+/); + n && (t.version = Number(n[0])); + const a = i.version.match(/-\d+-/); + a && (t.buildNumber = Number((r = (s = (e = a == null ? void 0 : a[0]) == null ? void 0 : e.match) == null ? void 0 : s.call(e, /\d+/)) == null ? void 0 : r[0])); + } + return t; +} +function FS(i, t, e, s, r) { + let n = [0, 0]; + i.generalImageInfo.width && i.generalImageInfo.height && (n = [i.generalImageInfo.width, i.generalImageInfo.height]); + const a = i.generalImageInfo["tile-resolution"], o = [ + i.generalImageInfo["tile-width"], + i.generalImageInfo["tile-height"] + ]; + let l = e; + const c = []; + !l && i.generalImageInfo.crs && (l = new z({ + epsg: RS(), + prefix: "OBLIQUE:", + proj4: i.generalImageInfo.crs + })); + const d = { + size: n, + tileResolution: a, + tileSize: o, + projection: l, + url: t, + terrainProvider: s, + headers: r + }; + return i.generalImageInfo.cameraParameter && (Array.isArray(i.generalImageInfo.cameraParameter) ? i.generalImageInfo.cameraParameter.forEach((u) => { + c.push(new Zn({ + ...d, + ...u + })); + }) : typeof i.generalImageInfo.cameraParameter == "object" && Object.entries(i.generalImageInfo.cameraParameter).forEach(([u, f]) => { + c.push(new Zn({ + name: u, + ...d, + ...f + })); + })), c.length === 0 && c.push(new Zn({ + name: "default", + ...d + })), c; +} +function Kh(i, t) { + const e = i.images[0], s = { + name: e.indexOf("name"), + width: e.indexOf("width"), + height: e.indexOf("height"), + tileResolution: e.indexOf("tile-resolution"), + viewDirection: e.indexOf("view-direction"), + viewDirectionAngle: e.indexOf("view-direction-angle"), + groundCoordinates: e.indexOf("groundCoordinates"), + centerPointOnGround: e.indexOf("centerPointOnGround"), + cameraIndex: e.indexOf("camera-index"), + projectionCenter: e.indexOf("projection-center"), + pToRealworld: e.indexOf("p-to-realworld"), + pToImage: e.indexOf("p-to-image") + }, r = new Array(i.images.length - 1); + return i.images.forEach((n, a) => { + if (a === 0) + return; + const o = []; + n[s.pToRealworld] && n[s.pToRealworld].forEach((g) => { + o.push(...g); + }); + const l = n[s.pToRealworld] ? new Q(...o) : void 0, c = []; + n[s.pToImage] && (n[s.pToImage].forEach((g) => { + c.push(...g); + }), c.push(0, 0, 0, 1)); + const d = n[s.projectionCenter] ? _.fromArray(n[s.projectionCenter]) : void 0, u = n[s.pToImage] ? new G(...c) : void 0, f = t[n[s.cameraIndex] || 0]; + (!f.size || f.size[0] === 0 && f.size[1] === 0) && (n[s.height] && n[s.width] ? f.size = [ + n[s.width], + n[s.height] + ] : console.error("missing image meta size")), f.tileResolution || (n[s.tileResolution] ? f.tileResolution = n[s.tileResolution] : console.error("missing image meta tileResolution")), r[a - 1] = new Bl({ + name: n[s.name], + viewDirection: n[s.viewDirection], + viewDirectionAngle: n[s.viewDirectionAngle], + groundCoordinates: n[s.groundCoordinates], + centerPointOnGround: n[s.centerPointOnGround], + meta: f, + projectionCenter: d, + pToRealworld: l, + pToImage: u + }); + }), r; +} +function GS(i, t) { + const { cameraParameter: e } = i.generalImageInfo, { version: s, buildNumber: r } = Cd(i); + return i.images.map((n) => { + const a = _d[n["view-direction"]], o = s >= 3.4 && r >= 18 ? n["view-directionAngle"] : void 0, l = n["projection-center"], { name: c, groundCoordinates: d, centerPointOnGround: u } = n, f = n["camera-name"], g = t.find((y) => y.name === f), m = g || t[0]; + m.size || (n.height && n.width ? m.size = [n.width, n.height] : console.error("missing image meta size")), m.tileResolution || (n.tileResolution ? m.tileResolution = n.tileResolution : console.error("missing image meta tileResolution")); + const p = { + name: c, + meta: m, + viewDirection: a, + viewDirectionAngle: o, + groundCoordinates: d, + centerPointOnGround: u + }; + if (g && f) { + const y = e[f], v = Q.fromRowMajorArray([].concat(...y["camera-matrix"])), w = Q.inverse(v, new Q()), C = Q.fromRowMajorArray([].concat(...n["rotation-matrix"])), x = Q.transpose(C, new Q()), E = y["focal-length"] * -1; + Q.multiplyByScalar(w, E, w); + const I = Q.multiply(x, w, new Q()), R = G.fromRotationTranslation(v, _.ZERO, new G()), D = _.fromArray(l), X = G.fromTranslation(_.multiplyByScalar(D, -1, new _()), new G()), te = G.fromRotationTranslation(C, _.ZERO, new G()), j = G.multiply(R, G.multiply(te, X, new G()), new G()); + p.projectionCenter = D, p.pToRealworld = I, p.pToImage = j; + } + return new Bl(p); + }); +} +async function vn(i, t) { + const e = await fetch(i, t); + if (!e.ok) + throw new Error(`Failed fetching url ${i} with status: ${e.status}`); + return e; +} +async function ms(i, t) { + return (await vn(i, t)).json(); +} +async function kS(i, t) { + return (await vn(i, t)).arrayBuffer(); +} +async function Vl(i, t) { + const s = await (await vn(i, t)).blob(); + return URL.createObjectURL(s); +} +function qt(i, t) { + const e = {}; + return t && (e.headers = t), fi.contains(i) && (e.credentials = "include"), e; +} +var Se; +(function(i) { + i[i.PENDING = 1] = "PENDING", i[i.LOADING = 2] = "LOADING", i[i.READY = 3] = "READY"; +})(Se || (Se = {})); +function Jn(i) { + return i.some((t) => t === Se.PENDING) ? Se.PENDING : i.some((t) => t === Se.LOADING) ? Se.LOADING : Se.READY; +} +class Qh { + constructor(t, e, s, r) { + h(this, "url"); + h(this, "baseUrl"); + h(this, "projection"); + h(this, "_terrainProviderOptions"); + h(this, "_terrainProvider"); + h(this, "_imageMetas", []); + /** + * Event raised when images are loaded. + */ + h(this, "imagesLoaded", new L()); + h(this, "_tiles", /* @__PURE__ */ new Map()); + h(this, "_loadingPromises", /* @__PURE__ */ new Map()); + h(this, "_state", Se.PENDING); + h(this, "_tileLevel"); + h(this, "_tileGrid", Nc()); + h(this, "_images", []); + h(this, "_loadingPromise"); + h(this, "_headers"); + h(this, "copyright"); + this.url = t, /\.json$/.test(this.url) || (this.url = this.url.replace(/\/?$/, "/image.json")), this.baseUrl = this.url.replace(/\/?([^/]+\.json)?$/, ""); + let n = e; + n && !(n instanceof z) && (n = new z(n)), this.projection = n, this._terrainProviderOptions = s ? { ...s } : void 0, this._headers = structuredClone(r); + } + /** + * The loaded images of this DataSet + */ + get images() { + return this._images.slice(); + } + /** + * Gets the state of the meta data information. For tiled data sets, this does not + * reflect the state of loaded tiles. + */ + get state() { + return this._state; + } + /** + * Loads the data set. + */ + async load() { + if (!this._loadingPromise) { + this._state = Se.LOADING; + const t = qt(this.url, this._headers); + this._loadingPromise = ms(this.url, t).then((e) => this._initialize(e)).catch((e) => Promise.reject(e)); + } + return this._loadingPromise; + } + /** + * Returns all tiles of this data set, including its DataState + */ + getTiles() { + const t = {}; + return this._tiles.forEach((e, s) => { + t[s] = e; + }), t; + } + /** + * initialize the DataSet with an existing Object. + * DataSets cannot be initialized more then once. + */ + async initialize(t) { + if (this._state !== Se.PENDING) + throw new Error("DataSet has already been loaded"); + this._loadingPromise = Promise.resolve(), await this._initialize(t); + } + async _initialize(t) { + var e; + if ((e = this._terrainProviderOptions) != null && e.url) { + const s = { + requestVertexNormals: this._terrainProviderOptions.requestVertexNormals, + requestWaterMask: this._terrainProviderOptions.requestWaterMask + }; + this._terrainProvider = await Ur(this._terrainProviderOptions.url, s, this._terrainProviderOptions.headers); + } + this._parseMetaData(t), this._state = Se.READY; + } + _parseMetaData(t) { + this._imageMetas = FS(t, this.baseUrl, this.projection, this._terrainProvider, this._headers); + const { version: e, buildNumber: s } = Cd(t); + if (t.tileLevel) + this._tileLevel = t.tileLevel, t.availableTiles.forEach((r) => { + this._tiles.set(r, Se.PENDING); + }); + else { + let r = []; + e >= 3.5 || e === 3.4 && s > 36 ? r = Kh(t, this._imageMetas) : (e >= 3.1 || e === void 0) && (r = GS(t, this._imageMetas)), r.length > 0 && (this._images = r, this.imagesLoaded.raiseEvent({ images: r })); + } + } + _getClosestTileCoordinate(t) { + if (!this._tileLevel) + return null; + const e = this._tileGrid.getTileCoordForCoordAndZ(t, this._tileLevel); + if (this._tiles.has(e.join("/"))) + return e; + let s = 1 / 0, r = null; + return [...this._tiles.keys()].forEach((n) => { + const a = n.split("/").map(Number), o = oi([e[1], e[2]], [a[1], a[2]]); + o < s && (s = o, r = a); + }), r || e; + } + _getTileCoordinatesForExtent(t) { + const e = this._tileGrid.getTileCoordForCoordAndZ([t[0], t[3]], this._tileLevel), s = this._tileGrid.getTileCoordForCoordAndZ([t[2], t[1]], this._tileLevel), r = []; + for (let n = e[1]; n <= s[1]; n++) + for (let a = e[2]; a <= s[2]; a++) + r.push([this._tileLevel, n, a]); + return r.map((n) => n.join("/")).filter((n) => { + const a = this._tiles.get(n); + return a && a !== Se.READY; + }); + } + /** + * Requests the state of data at a certain location. No data is automatically READY. + * @param mercatorCoordinate - coordinate in web mercator + */ + getDataStateForCoordinate(t) { + if (this._state !== Se.READY || this._tiles.size === 0) + return this._state; + const e = this._getClosestTileCoordinate(t).join("/"); + return this._tiles.has(e) ? this._tiles.get(e) : Se.READY; + } + /** + * Loads all the tiles for a given extent. + */ + getDataStateForExtent(t) { + if (this._state !== Se.READY || this._tiles.size === 0) + return this._state; + const s = this._getTileCoordinatesForExtent(t).map((r) => this._tiles.get(r)).filter((r) => r); + return Jn(s); + } + _loadTile(t) { + if (this._loadingPromises.has(t)) + return this._loadingPromises.get(t); + if (this._tiles.get(t) !== Se.PENDING) + return Promise.resolve(); + this._tiles.set(t, Se.LOADING); + const e = qt(this.url, this._headers), s = ms(`${this.baseUrl}/${t}.json`, e).then((r) => { + const n = Kh(r, this._imageMetas); + n.length > 0 && (this._images = this._images.concat(n), this.imagesLoaded.raiseEvent({ + images: n, + tileCoordinate: t + })); + }).catch((r) => { + console.error(r); + }).finally(() => { + this._tiles.set(t, Se.READY), this._loadingPromises.delete(t); + }); + return this._loadingPromises.set(t, s), s; + } + /** + * Loads the closest data tile for a certain location. Resolves when all data for the location has been loaded. + * @param mercatorCoordinate - coordinate in web mercator + */ + async loadDataForCoordinate(t) { + const e = this._getClosestTileCoordinate(t); + e && await this._loadTile(e.join("/")); + } + /** + * Loads all the tiles for a given extent. + */ + async loadDataForExtent(t) { + const e = this._getTileCoordinatesForExtent(t); + await Promise.all(e.map((s) => this._loadTile(s))); + } + destroy() { + this.imagesLoaded.destroy(), this._images = [], this._imageMetas = [], this._tiles.clear(), this._loadingPromises.clear(), this._terrainProvider = void 0; + } + toJSON() { + const t = { url: this.url }; + return this.projection && (t.projection = this.projection.toJSON()), this._terrainProviderOptions && (t.terrainProvider = { ...this._terrainProviderOptions }), this._headers && (t.headers = this._headers), t; + } +} +function Xa(i) { + return function(e, s) { + const r = e.getImage(), n = qt(s, i); + Vl(s, n).then((a) => { + r.src = a, r.onload = () => { + URL.revokeObjectURL(a); + }; + }).catch(() => { + e.setState(Rc.ERROR); + }); + }; +} +let Mo = ""; +function zS() { + if (!Mo) { + const i = document.createElement("canvas"); + i.height = 512, i.width = 512; + const t = i.getContext("2d"); + t.fillStyle = "#409D76", t.fillRect(0, 0, 512, 512), t.font = "bold 46px Monospace, Courier New", t.fillStyle = "#424242", t.textAlign = "center", t.fillText("No Image", 256, 256), Mo = i.toDataURL("png"); + } + return Mo; +} +class HS { + constructor(t, e) { + h(this, "id", Xe()); + h(this, "size"); + h(this, "url"); + h(this, "tileSize"); + h(this, "format"); + h(this, "minZoom"); + h(this, "maxZoom"); + h(this, "scaleFactor"); + h(this, "tileResolution"); + h(this, "_view"); + h(this, "_tileImageSource"); + h(this, "_layer"); + h(this, "_headers"); + this.size = t.size, this.url = t.url, this.tileSize = t.tileSize, this.format = t.format, this.minZoom = e.minZoom, this.maxZoom = e.maxZoom, this.scaleFactor = e.scaleFactor, this._headers = t.headers; + const { tileResolution: s } = t; + this.tileResolution = s.slice(0, s.length - e.hideLevels); + const r = [0, 0, ...this.size], n = new cf({ + code: "ZOOMIFY", + units: "pixels", + extent: r + }), a = this.maxZoom > 0 ? this.maxZoom : this.tileResolution.length + 4, o = Math.log(2) / Math.log(this.scaleFactor); + this._view = new dl({ + projection: n, + center: [this.size[0] / 2, this.size[1] / 2], + constrainOnlyCenter: !0, + minZoom: this.minZoom * o, + maxZoom: a * o, + extent: [-2e3, -2e3, this.size[0] + 2e3, this.size[1] + 2e3], + zoom: this.minZoom * o, + zoomFactor: this.scaleFactor + }); + const l = { + projection: n, + tileGrid: new Fc({ + origin: [0, 0], + extent: r, + resolutions: this.tileResolution, + tileSize: this.tileSize + }) + }; + fi.contains(this.url) ? l.crossOrigin = "use-credentials" : gi(this.url) || (l.crossOrigin = "anonymous"), this._headers && (l.tileLoadFunction = Xa(this._headers)), this._tileImageSource = new uf(l), this._layer = new Ws({ + source: this.tileImageSource, + extent: r + }); + } + /** + * The view for these oblique images. + */ + get view() { + if (!this._view) + throw new Error("trying to access destroyed oblique view"); + return this._view; + } + /** + * The layer of these images. + */ + get layer() { + if (!this._layer) + throw new Error("trying to access destroyed oblique view"); + return this._layer; + } + /** + * The layer of these images. + */ + get tileImageSource() { + if (!this._tileImageSource) + throw new Error("trying to access destroyed oblique view"); + return this._tileImageSource; + } + /** + * Sets the layers source to request data for this image + * @param name + * @param [isDefaultImage=false] + */ + setImageName(t, e = !1) { + e && this.tileImageSource.setTileLoadFunction((s) => { + s.getImage().src = zS(), s.load(); + }), this.tileImageSource.setTileUrlFunction((s) => { + const [r, n, a] = s, o = -a - 1; + return `${this.url}/${t}/${r}/${n}/${o}.${this.format}`; + }), this.tileImageSource.refresh(); + } + destroy() { + this._view = void 0, this._layer = void 0, this.tileImageSource.clear(), this._tileImageSource = void 0; + } +} +function ec(i, t) { + return i < 0 ? 0 : i > t ? t : i; +} +class BS { + constructor(t) { + h(this, "_active", !1); + h(this, "_loadingImage", null); + h(this, "_olMap"); + h(this, "_viewCache", /* @__PURE__ */ new Map()); + h(this, "_currentImage", null); + h(this, "_currentView"); + h(this, "_collection", null); + h(this, "_mapChangeEvent", "postrender"); + /** + * Event raised once a new image is set on the provider. Will be passed the new image as the only argument. + */ + h(this, "imageChanged", new L()); + /** + * Whether the post render handler should switch on image edge. Setting + * this to false will suspend all post render handler switches. + */ + h(this, "switchEnabled", !0); + /** + * Threshold from 0 to 1 to define when to start switching to other images. Where 0 indicates + * to only switch, when the view center is outside of the image and 1 to always switch. 0.2 would start switching + * if the view center is within the outer 20% of the image. + */ + h(this, "switchThreshold", 0); + h(this, "_postRenderListener"); + this._olMap = t; + } + /** + * The event to listen to on the map. can be 'postrender' or 'moveend'. Default is 'postrender' + */ + get mapChangeEvent() { + return this._mapChangeEvent; + } + set mapChangeEvent(t) { + this._mapChangeEvent = t, this._active && (this._postRenderListener && le(this._postRenderListener), this._postRenderListener = this._olMap.on(this._mapChangeEvent, this._postRenderHandler.bind(this))); + } + get loading() { + return !!this._loadingImage; + } + get active() { + return this._active; + } + get currentImage() { + return this._currentImage; + } + get collection() { + return this._collection; + } + /** + * Set a new collection. The collection must be loaded. + * If a previous collection was set, the current image and its resources will be removed from the olMap. + */ + setCollection(t) { + if (this._loadingImage = null, !t.loaded) { + console.error("cannot set an unloaded collection"); + return; + } + this._collection = t, this._removeCurrentView(), this._currentView = void 0, this._currentImage = null; + } + /** + * Activate the provider, its current view and its post render handler + */ + activate() { + if (!this._collection) + throw new Error("cannot activate provider without an oblique collection."); + this._active || (this._active = !0, this._setCurrentView(), this._postRenderListener || (this._postRenderListener = this._olMap.on(this._mapChangeEvent, this._postRenderHandler.bind(this)))); + } + /** + * Deactivates the provider, removing the current view and post render handler from the map + */ + deactivate() { + this._currentView && this._removeCurrentView(), this._postRenderListener && (le(this._postRenderListener), this._postRenderListener = void 0), this._active = !1; + } + _pullCoordinateToImageCenter(t) { + if (this.currentImage) { + const e = [ + this.currentImage.meta.size[0] / 2, + this.currentImage.meta.size[1] / 2 + ]; + t[0] < e[0] ? t[0] += 50 : t[0] -= 50, t[1] < e[1] ? t[1] += 50 : t[1] -= 50; + } + return t; + } + _postRenderHandler() { + if (this._active && !this.loading && this.switchEnabled) { + const t = this._currentImage ? this._currentImage.meta.size : null, e = this._olMap.getView().getCenter(), s = this.switchThreshold, r = 1 - s; + if (!this._currentImage || e[0] / t[0] > s && e[0] / t[0] < r && e[1] / t[1] > s && e[1] / t[1] < r) + return; + const n = this._pullCoordinateToImageCenter(e.slice()), a = this._currentImage.transformImage2RealWorld(n).slice(0, 2), l = $e(this._currentImage.meta.projection.proj, W.proj)(a, void 0, void 0), c = 200, d = [ + l[0] - c, + l[1] - c, + l[0] + c, + l[1] + c + ], u = this._collection.getDataStateForExtent(d); + if (u === Se.READY) { + const f = this._collection.getImageForCoordinate(l, this._currentImage.viewDirection); + f && f.name !== this._currentImage.name && this._changeImage(f, e); + } else u === Se.PENDING && this._collection.loadDataForExtent(d); + } + } + async _changeImage(t, e) { + this._loadingImage = t; + const { coords: s } = await Wr(this._currentImage, e); + this._loadingImage === t && await this.setImage(t, s); + } + /** + * Sets the current image + * @param image + * @param optCenter - mercator coordinates of an optional center to use. uses the images center if undefined + */ + async setImage(t, e) { + if (!this._collection) + throw new Error("cannot set an image without an oblique collection."); + this._loadingImage = t; + const s = !this._currentImage || this._currentImage.name !== t.name; + if (this._currentImage = t, s && await t.calculateImageAverageHeight(), t !== this._loadingImage) + return !1; + let r; + this._viewCache.has(t.meta) ? r = this._viewCache.get(t.meta) : (r = new HS(t.meta, this._collection.viewOptions), this._viewCache.set(t.meta, r)); + const n = this._currentView; + this._currentView = r, s && this._currentView.setImageName(this._currentImage.name, this._currentImage[Hl]); + const [a, o] = this._currentImage.meta.size; + let l = [a / 2, o / 2]; + if (e) { + const c = $e(W.proj, this._currentImage.meta.projection.proj)(e.slice(0, 2), void 0, void 0), d = this._currentImage.transformRealWorld2Image(c, e[2]); + d[0] = ec(d[0], a), d[1] = ec(d[1], o), l = d; + } + return this._currentView.view.setCenter(l), this._active && this._setCurrentView(n), this._loadingImage = null, s && this.imageChanged.raiseEvent(t), !0; + } + _setCurrentView(t) { + this._currentView && (t && t === this._currentView || (t && this._olMap.removeLayer(t.layer), this._olMap.getView() && this._olMap.getView().getResolution() && this._currentView.view.setResolution(this._olMap.getView().getResolution()), this._olMap.setView(this._currentView.view), this._olMap.getLayers().insertAt(0, this._currentView.layer))); + } + _removeCurrentView() { + this._currentView && (this._olMap.getView() === this._currentView.view && this._olMap.setView(new dl()), this._olMap.removeLayer(this._currentView.layer)); + } + /** + * Sets a new image based on a ground coordinate and a direction. + * @param coordinate + * @param direction + * @param [zoom=2] + */ + async setView(t, e, s = 2) { + if (!this._collection) + throw new Error("cannot set the view without an oblique collection."); + const r = t.slice(), n = `${t.join("")}${e}${s}`; + this._loadingImage = n; + const a = await this._collection.loadImageForCoordinate(t, e); + if (a) { + if (this._loadingImage !== n) + return; + if (this._loadingImage = a, !r[2] && a.meta.terrainProvider) { + const l = [r]; + await Qs(a.meta.terrainProvider, l, W, l); + } + if (this._loadingImage !== a) + return; + await this.setImage(a, r) && this._currentView && this._currentView.view.setZoom(s); + } else + throw new Error("could not find an image for this direction"); + } + /** + * Returns a viewpoint for the currently set view. + */ + async getView() { + if (this._currentView && this._currentImage) { + const t = this._currentView.view.getCenter(), { coords: e } = await Wr(this._currentImage, t); + return { + center: e, + direction: this._currentImage.viewDirection, + zoom: this._currentView.view.getZoom() + }; + } + return null; + } + /** + * Destroys all openlayers resources created by this oblique provider + */ + destroy() { + this._removeCurrentView(), [...this._viewCache.values()].forEach((t) => { + t.destroy(); + }), this._viewCache.clear(), this._loadingImage = null, this._postRenderListener && (le(this._postRenderListener), this._postRenderListener = void 0), this.imageChanged.destroy(), this._collection = null, this._olMap = void 0; + } +} +function Md(i, t, e = 0, s = i.length - 1, r = VS) { + for (; s > e; ) { + if (s - e > 600) { + const l = s - e + 1, c = t - e + 1, d = Math.log(l), u = 0.5 * Math.exp(2 * d / 3), f = 0.5 * Math.sqrt(d * u * (l - u) / l) * (c - l / 2 < 0 ? -1 : 1), g = Math.max(e, Math.floor(t - c * u / l + f)), m = Math.min(s, Math.floor(t + (l - c) * u / l + f)); + Md(i, t, g, m, r); + } + const n = i[t]; + let a = e, o = s; + for (lr(i, e, t), r(i[s], n) > 0 && lr(i, e, s); a < o; ) { + for (lr(i, a, o), a++, o--; r(i[a], n) < 0; ) a++; + for (; r(i[o], n) > 0; ) o--; + } + r(i[e], n) === 0 ? lr(i, e, o) : (o++, lr(i, o, s)), o <= t && (e = o + 1), t <= o && (s = o - 1); + } +} +function lr(i, t, e) { + const s = i[t]; + i[t] = i[e], i[e] = s; +} +function VS(i, t) { + return i < t ? -1 : i > t ? 1 : 0; +} +class al { + constructor(t = 9) { + this._maxEntries = Math.max(4, t), this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)), this.clear(); + } + all() { + return this._all(this.data, []); + } + search(t) { + let e = this.data; + const s = []; + if (!Gn(t, e)) return s; + const r = this.toBBox, n = []; + for (; e; ) { + for (let a = 0; a < e.children.length; a++) { + const o = e.children[a], l = e.leaf ? r(o) : o; + Gn(t, l) && (e.leaf ? s.push(o) : Eo(t, l) ? this._all(o, s) : n.push(o)); + } + e = n.pop(); + } + return s; + } + collides(t) { + let e = this.data; + if (!Gn(t, e)) return !1; + const s = []; + for (; e; ) { + for (let r = 0; r < e.children.length; r++) { + const n = e.children[r], a = e.leaf ? this.toBBox(n) : n; + if (Gn(t, a)) { + if (e.leaf || Eo(t, a)) return !0; + s.push(n); + } + } + e = s.pop(); + } + return !1; + } + load(t) { + if (!(t && t.length)) return this; + if (t.length < this._minEntries) { + for (let s = 0; s < t.length; s++) + this.insert(t[s]); + return this; + } + let e = this._build(t.slice(), 0, t.length - 1, 0); + if (!this.data.children.length) + this.data = e; + else if (this.data.height === e.height) + this._splitRoot(this.data, e); + else { + if (this.data.height < e.height) { + const s = this.data; + this.data = e, e = s; + } + this._insert(e, this.data.height - e.height - 1, !0); + } + return this; + } + insert(t) { + return t && this._insert(t, this.data.height - 1), this; + } + clear() { + return this.data = Ts([]), this; + } + remove(t, e) { + if (!t) return this; + let s = this.data; + const r = this.toBBox(t), n = [], a = []; + let o, l, c; + for (; s || n.length; ) { + if (s || (s = n.pop(), l = n[n.length - 1], o = a.pop(), c = !0), s.leaf) { + const d = jS(t, s.children, e); + if (d !== -1) + return s.children.splice(d, 1), n.push(s), this._condense(n), this; + } + !c && !s.leaf && Eo(s, r) ? (n.push(s), a.push(o), o = 0, l = s, s = s.children[0]) : l ? (o++, s = l.children[o], c = !1) : s = null; + } + return this; + } + toBBox(t) { + return t; + } + compareMinX(t, e) { + return t.minX - e.minX; + } + compareMinY(t, e) { + return t.minY - e.minY; + } + toJSON() { + return this.data; + } + fromJSON(t) { + return this.data = t, this; + } + _all(t, e) { + const s = []; + for (; t; ) + t.leaf ? e.push(...t.children) : s.push(...t.children), t = s.pop(); + return e; + } + _build(t, e, s, r) { + const n = s - e + 1; + let a = this._maxEntries, o; + if (n <= a) + return o = Ts(t.slice(e, s + 1)), Ps(o, this.toBBox), o; + r || (r = Math.ceil(Math.log(n) / Math.log(a)), a = Math.ceil(n / Math.pow(a, r - 1))), o = Ts([]), o.leaf = !1, o.height = r; + const l = Math.ceil(n / a), c = l * Math.ceil(Math.sqrt(a)); + tc(t, e, s, c, this.compareMinX); + for (let d = e; d <= s; d += c) { + const u = Math.min(d + c - 1, s); + tc(t, d, u, l, this.compareMinY); + for (let f = d; f <= u; f += l) { + const g = Math.min(f + l - 1, u); + o.children.push(this._build(t, f, g, r - 1)); + } + } + return Ps(o, this.toBBox), o; + } + _chooseSubtree(t, e, s, r) { + for (; r.push(e), !(e.leaf || r.length - 1 === s); ) { + let n = 1 / 0, a = 1 / 0, o; + for (let l = 0; l < e.children.length; l++) { + const c = e.children[l], d = xo(c), u = US(t, c) - d; + u < a ? (a = u, n = d < n ? d : n, o = c) : u === a && d < n && (n = d, o = c); + } + e = o || e.children[0]; + } + return e; + } + _insert(t, e, s) { + const r = s ? t : this.toBBox(t), n = [], a = this._chooseSubtree(r, this.data, e, n); + for (a.children.push(t), vr(a, r); e >= 0 && n[e].children.length > this._maxEntries; ) + this._split(n, e), e--; + this._adjustParentBBoxes(r, n, e); + } + // split overflowed node into two + _split(t, e) { + const s = t[e], r = s.children.length, n = this._minEntries; + this._chooseSplitAxis(s, n, r); + const a = this._chooseSplitIndex(s, n, r), o = Ts(s.children.splice(a, s.children.length - a)); + o.height = s.height, o.leaf = s.leaf, Ps(s, this.toBBox), Ps(o, this.toBBox), e ? t[e - 1].children.push(o) : this._splitRoot(s, o); + } + _splitRoot(t, e) { + this.data = Ts([t, e]), this.data.height = t.height + 1, this.data.leaf = !1, Ps(this.data, this.toBBox); + } + _chooseSplitIndex(t, e, s) { + let r, n = 1 / 0, a = 1 / 0; + for (let o = e; o <= s - e; o++) { + const l = _r(t, 0, o, this.toBBox), c = _r(t, o, s, this.toBBox), d = WS(l, c), u = xo(l) + xo(c); + d < n ? (n = d, r = o, a = u < a ? u : a) : d === n && u < a && (a = u, r = o); + } + return r || s - e; + } + // sorts node children by the best axis for split + _chooseSplitAxis(t, e, s) { + const r = t.leaf ? this.compareMinX : $S, n = t.leaf ? this.compareMinY : qS, a = this._allDistMargin(t, e, s, r), o = this._allDistMargin(t, e, s, n); + a < o && t.children.sort(r); + } + // total margin of all possible split distributions where each node is at least m full + _allDistMargin(t, e, s, r) { + t.children.sort(r); + const n = this.toBBox, a = _r(t, 0, e, n), o = _r(t, s - e, s, n); + let l = Fn(a) + Fn(o); + for (let c = e; c < s - e; c++) { + const d = t.children[c]; + vr(a, t.leaf ? n(d) : d), l += Fn(a); + } + for (let c = s - e - 1; c >= e; c--) { + const d = t.children[c]; + vr(o, t.leaf ? n(d) : d), l += Fn(o); + } + return l; + } + _adjustParentBBoxes(t, e, s) { + for (let r = s; r >= 0; r--) + vr(e[r], t); + } + _condense(t) { + for (let e = t.length - 1, s; e >= 0; e--) + t[e].children.length === 0 ? e > 0 ? (s = t[e - 1].children, s.splice(s.indexOf(t[e]), 1)) : this.clear() : Ps(t[e], this.toBBox); + } +} +function jS(i, t, e) { + if (!e) return t.indexOf(i); + for (let s = 0; s < t.length; s++) + if (e(i, t[s])) return s; + return -1; +} +function Ps(i, t) { + _r(i, 0, i.children.length, t, i); +} +function _r(i, t, e, s, r) { + r || (r = Ts(null)), r.minX = 1 / 0, r.minY = 1 / 0, r.maxX = -1 / 0, r.maxY = -1 / 0; + for (let n = t; n < e; n++) { + const a = i.children[n]; + vr(r, i.leaf ? s(a) : a); + } + return r; +} +function vr(i, t) { + return i.minX = Math.min(i.minX, t.minX), i.minY = Math.min(i.minY, t.minY), i.maxX = Math.max(i.maxX, t.maxX), i.maxY = Math.max(i.maxY, t.maxY), i; +} +function $S(i, t) { + return i.minX - t.minX; +} +function qS(i, t) { + return i.minY - t.minY; +} +function xo(i) { + return (i.maxX - i.minX) * (i.maxY - i.minY); +} +function Fn(i) { + return i.maxX - i.minX + (i.maxY - i.minY); +} +function US(i, t) { + return (Math.max(t.maxX, i.maxX) - Math.min(t.minX, i.minX)) * (Math.max(t.maxY, i.maxY) - Math.min(t.minY, i.minY)); +} +function WS(i, t) { + const e = Math.max(i.minX, t.minX), s = Math.max(i.minY, t.minY), r = Math.min(i.maxX, t.maxX), n = Math.min(i.maxY, t.maxY); + return Math.max(0, r - e) * Math.max(0, n - s); +} +function Eo(i, t) { + return i.minX <= t.minX && i.minY <= t.minY && t.maxX <= i.maxX && t.maxY <= i.maxY; +} +function Gn(i, t) { + return t.minX <= i.maxX && t.minY <= i.maxY && t.maxX >= i.minX && t.maxY >= i.minY; +} +function Ts(i) { + return { + children: i, + height: 1, + leaf: !0, + minX: 1 / 0, + minY: 1 / 0, + maxX: -1 / 0, + maxY: -1 / 0 + }; +} +function tc(i, t, e, s, r) { + const n = [t, e]; + for (; n.length; ) { + if (e = n.pop(), t = n.pop(), e - t <= s) continue; + const a = t + Math.ceil((e - t) / s / 2) * s; + Md(i, a, t, e, r), n.push(t, a, a, e); + } +} +var xd = { exports: {} }; +(function(i, t) { + (function(e, s) { + i.exports = s(); + })(R0, function() { + var e = function(n, a) { + if (n === void 0 && (n = []), a === void 0 && (a = s), this.data = n, this.length = this.data.length, this.compare = a, this.length > 0) + for (var o = (this.length >> 1) - 1; o >= 0; o--) + this._down(o); + }; + e.prototype.push = function(n) { + this.data.push(n), this.length++, this._up(this.length - 1); + }, e.prototype.pop = function() { + if (this.length !== 0) { + var n = this.data[0], a = this.data.pop(); + return this.length--, this.length > 0 && (this.data[0] = a, this._down(0)), n; + } + }, e.prototype.peek = function() { + return this.data[0]; + }, e.prototype._up = function(n) { + for (var a = this, o = a.data, l = a.compare, c = o[n]; n > 0; ) { + var d = n - 1 >> 1, u = o[d]; + if (l(c, u) >= 0) + break; + o[n] = u, n = d; + } + o[n] = c; + }, e.prototype._down = function(n) { + for (var a = this, o = a.data, l = a.compare, c = this.length >> 1, d = o[n]; n < c; ) { + var u = (n << 1) + 1, f = o[u], g = u + 1; + if (g < this.length && l(o[g], f) < 0 && (u = g, f = o[g]), l(f, d) >= 0) + break; + o[n] = f, n = u; + } + o[n] = d; + }; + function s(r, n) { + return r < n ? -1 : r > n ? 1 : 0; + } + return e; + }); +})(xd); +var YS = xd.exports; +const XS = /* @__PURE__ */ Pu(YS); +function ic(i, t, e, s, r, n) { + let a = i.data; + const o = [], l = i.toBBox, c = new XS(void 0, ZS); + for (; a; ) { + for (let d = 0; d < a.children.length; d++) { + const u = a.children[d], f = JS(t, e, a.leaf ? l(u) : u); + c.push({ + node: u, + isItem: a.leaf, + dist: f + }); + } + for (; c.length && c.peek().isItem; ) { + const d = c.pop().node; + if (o.push(d), s && o.length === s) return o; + } + a = c.pop(), a && (a = a.node); + } + return o; +} +function ZS(i, t) { + return i.dist - t.dist; +} +function JS(i, t, e) { + const s = sc(i, e.minX, e.maxX), r = sc(t, e.minY, e.maxY); + return s * s + r * r; +} +function sc(i, t, e) { + return i < t ? t - i : i <= e ? 0 : i - e; +} +function rc(i) { + return i.map((t) => { + const e = $e(t.meta.projection.proj, W.proj), s = new ue({ + // error in TransformFunction type definition, remove undefined after openlayer fixed the type + geometry: new ht([ + t.groundCoordinates.map((r) => e(r.slice(0, 2), void 0, void 0)) + ]), + viewDirection: t.viewDirection + }); + return s.setId(t.name), s; + }); +} +function nc(i) { + const t = Nc(); + return Object.entries(i).map(([e, s]) => { + const r = e.split("/").map((o) => Number.parseInt(o, 10)), n = t.getTileCoordExtent(r), a = new ue({ + geometry: kc(n), + state: s + }); + return a.setId(e), a; + }); +} +class ps extends Ut { + /** + * @param options + */ + constructor(e) { + super(e); + /** + * Maps each direction to an RTree + */ + h(this, "_directionTrees", /* @__PURE__ */ new Map()); + /** + * Maps image name to image + */ + h(this, "_images", /* @__PURE__ */ new Map()); + /** + * Maps urls to general infos & cameras + */ + h(this, "_dataSets", []); + h(this, "viewOptions"); + h(this, "_loaded", !1); + /** + * Event raised when images are loaded. Is passed an Array of ObliqueImages as its only argument. + */ + h(this, "imagesLoaded", new L()); + h(this, "_tileFeatureSource", null); + h(this, "_imageFeatureSource", null); + h(this, "_destroyed", new L()); + h(this, "_loadingPromise"); + /** + * Optional Id to synchronize with the vcPublisher Datasources. This can also be used to track a connection + * to other sources of data. + */ + h(this, "datasourceId"); + const s = ps.getDefaultOptions(); + this.viewOptions = { + maxZoom: ne(e.maxZoom, s.maxZoom), + minZoom: ne(e.minZoom, s.minZoom), + scaleFactor: k(e.scaleFactor, s.scaleFactor), + hideLevels: ne(e.hideLevels, s.hideLevels) + }, Array.isArray(e.dataSets) && e.dataSets.forEach((r) => { + this._addDataSet(r); + }), this.datasourceId = e.datasourceId || s.datasourceId; + } + static get className() { + return "ObliqueCollection"; + } + static getDefaultOptions() { + return { + maxZoom: 0, + minZoom: 0, + scaleFactor: 4, + dataSets: void 0, + hideLevels: 0, + datasourceId: void 0 + }; + } + get dataSets() { + return this._dataSets.slice(); + } + /** + * Indicates, that this collection has been loaded + */ + get loaded() { + return this._loaded; + } + get destroyed() { + return this._destroyed; + } + /** + * A vector source of all tiles available to this collection in mercator. The feature have a "state" property, + * the id is the string tile coordinate "z/x/y" of the tile + */ + get tileFeatureSource() { + return this._tileFeatureSource || (this._tileFeatureSource = this._createTileFeatureSource()), this._tileFeatureSource; + } + /** + * A vector source of all image currently loaded for this collection in mercator. + * The id is the image name. The feature has a "viewDirection" property. + */ + get imageFeatureSource() { + return this._imageFeatureSource || (this._imageFeatureSource = this._createImageFeatureSource()), this._imageFeatureSource; + } + /** + * All currently loaded images + */ + get images() { + return [...this._images.values()]; + } + _createTileFeatureSource() { + const e = nc(this.getTiles()), s = new Tr(); + return s.addFeatures(e), s; + } + _createImageFeatureSource() { + const e = rc([...this._images.values()]), s = new Tr(); + return s.addFeatures(e), s; + } + async _loadDataSet(e) { + if (await e.load(), this._tileFeatureSource) { + const s = nc(e.getTiles()); + this._tileFeatureSource.addFeatures(s); + } + } + /** + * Adds an oblique data set to this collection. + */ + _addDataSet(e) { + let s; + e instanceof Qh ? s = e : s = new Qh(e.url, e.projection, e.terrainProvider, e.headers), s.imagesLoaded.addEventListener(({ images: r, tileCoordinate: n }) => { + this._loadImages(r, n); + }), this._loadImages(s.images), this._dataSets.push(s); + } + /** + * Adds an oblique data set to this collection. + */ + async addDataSet(e) { + this._loadingPromise && (await this._loadingPromise, await this._loadDataSet(e)), this._addDataSet(e); + } + /** + * Loads all meta data associated with this collection + */ + async load() { + this._loadingPromise || (this._loadingPromise = Promise.all(this._dataSets.map((e) => this._loadDataSet(e))).then(() => { + }), await this._loadingPromise, this._loaded = !0), await this._loadingPromise; + } + _loadImages(e, s) { + if (s && this._tileFeatureSource) { + const n = this._tileFeatureSource.getFeatureById(s); + n && n.set("state", Se.READY); + } + const r = /* @__PURE__ */ new Map(); + if (e.forEach((n) => { + this._images.set(n.name, n), r.has(n.viewDirection) || r.set(n.viewDirection, []); + const a = $e(n.meta.projection.proj, W.proj), o = n.centerPointOnGround.slice(0, 2); + a(o, o, void 0), r.get(n.viewDirection).push({ + minX: o[0], + minY: o[1], + maxX: o[0], + maxY: o[1], + name: n.name + }); + }), r.forEach((n, a) => { + this._directionTrees.get(a) || this._directionTrees.set(a, new al()), this._directionTrees.get(a).load(n); + }), this._imageFeatureSource) { + const n = rc(e); + this._imageFeatureSource.addFeatures(n); + } + this.imagesLoaded.raiseEvent(e); + } + /** + * Gets all available tile coordinates across all data sets, including their loaded state. Return value is + * an object, where the key is the tile coordinate in z/x/y and the value is the data state + */ + getTiles() { + const e = {}; + return this._dataSets.forEach((s) => { + Object.entries(s.getTiles()).forEach(([r, n]) => { + e[r] ? e[r] = Jn([n, e[r]]) : e[r] = n; + }); + }), e; + } + /** + * Returns an image by its name, if it has been loaded + */ + getImageByName(e) { + return this._images.get(e); + } + /** + * Returns a list of viewDirections which a currently available in this collection + */ + getAvailableViewDirections() { + return [...this._directionTrees.keys()]; + } + /** + * Returns the state of the data for a given location an all underlying data sources + * @param mercatorCoordinate - coordinate in web mercator + */ + getDataStateForCoordinate(e) { + const s = this._dataSets.map((r) => r.getDataStateForCoordinate(e)); + return Jn(s); + } + /** + * Returns the state of the data for a given location an all underlying data sources + * @param extent - coordinate in web mercator + */ + getDataStateForExtent(e) { + const s = this._dataSets.map((r) => r.getDataStateForExtent(e)); + return Jn(s); + } + /** + * Loads data for a given mercator Coordinate + * @param mercatorCoordinate - coordinate in web mercator + */ + async loadDataForCoordinate(e) { + await Promise.all(this._dataSets.map((s) => s.loadDataForCoordinate(e))); + } + /** + * Loads all data tiles in the given extent + */ + async loadDataForExtent(e) { + await Promise.all(this._dataSets.map((s) => s.loadDataForExtent(e))); + } + _getNextImageForCoordinate(e, s) { + const r = this._directionTrees.get(s); + if (r) { + const n = ic(r, e[0], e[1], 1); + if (n.length === 1 && n[0].name) + return this.getImageByName(n[0].name); + } + } + /** + * Returns the closest image for the given location and direction (location and image extent must not overlap). + * Returns undefined, if there are no images for the given direction + * @param mercatorCoordinate - coordinate in web mercator + * @param direction - the preferred direction if no image in that direction can be found, other direction will be queried + */ + getImageForCoordinate(e, s) { + const r = [ + s, + ...Object.values(Oe).filter((n) => n !== s) + ]; + for (let n = 0; n < r.length; n++) { + const a = this._getNextImageForCoordinate(e, r[n]); + if (a) + return a; + } + } + /** + * Loads all data for a location and then returns the closest image for the given location and direction (location and image extent must not overlap). + * Returns undefined, if there are no images for the given direction + * @param mercatorCoordinate - coordinate in web mercator + * @param direction + */ + async loadImageForCoordinate(e, s) { + return await this.loadDataForCoordinate(e), this.getImageForCoordinate(e, s); + } + /** + * Checks, if an image exists for a given coordinated + * @param mercatorCoordinate - coordinate in web mercator + * @param direction + */ + async hasImageAtCoordinate(e, s) { + const r = await this.loadImageForCoordinate(e, s); + if (r) { + const n = $e(W.proj, r.meta.projection.proj), a = e.slice(0, 2); + n(a, a, void 0); + const o = Ir(r.groundCoordinates); + return Qn(o, a); + } + return !1; + } + /** + * Loads the image adjacent to a given image in a certain direction from the provided image. + * Returns undefined if there are no images in that direction or there are no images for the direction + * of the provided image. + * @param image + * @param heading - 0 = east, PI / 2 = north, PI = west and PI * 1.5 = south + * @param [deviation=PI/4] + */ + async loadAdjacentImage(e, s, r = Math.PI / 4) { + const n = this._directionTrees.get(e.viewDirection); + if (n) { + const a = $e(e.meta.projection.proj, W.proj), o = e.groundCoordinates.map((f) => a(f.slice(0, 2), void 0, void 0)), l = Ir(o); + await this.loadDataForExtent(Gc(l, 200)); + const c = cs(l), u = ic(n, c[0], c[1], 20).find((f) => { + if (f.name !== e.name) { + let g = Math.atan2(f.minY - c[1], f.minX - c[0]); + g <= 0 && (g += Math.PI * 2); + let m = g - s; + if (m > Math.PI ? m -= Math.PI * 2 : m < -Math.PI && (m += Math.PI * 2), m <= r && m >= -r) + return f; + } + return !1; + }); + if (u) + return this.getImageByName(u.name); + } + } + /** + * Destroys all data sets and all images and any image/tile features for this collection + */ + destroy() { + this._dataSets.forEach((e) => { + e.destroy(); + }), this._dataSets = [], [...this._directionTrees.values()].forEach((e) => { + e.clear(); + }), this._directionTrees.clear(), this._images.clear(), this._tileFeatureSource && (this._tileFeatureSource.clear(!0), this._tileFeatureSource = null), this._imageFeatureSource && (this._imageFeatureSource.clear(!0), this._imageFeatureSource = null), this.imagesLoaded.destroy(), super.destroy(), this.destroyed.raiseEvent(), this._destroyed.destroy(); + } + toJSON() { + const e = super.toJSON(), s = ps.getDefaultOptions(); + return this.viewOptions.maxZoom !== s.maxZoom && (e.maxZoom = this.viewOptions.maxZoom), this.viewOptions.minZoom !== s.minZoom && (e.minZoom = this.viewOptions.minZoom), this.viewOptions.scaleFactor !== s.scaleFactor && (e.scaleFactor = this.viewOptions.scaleFactor), this.viewOptions.hideLevels !== s.hideLevels && (e.hideLevels = this.viewOptions.hideLevels), this.datasourceId !== s.datasourceId && (e.datasourceId = this.datasourceId), this.dataSets.length > 0 && (e.dataSets = this.dataSets.map((r) => r.toJSON())), e; + } +} +const KS = new Zn({ + name: "defaultObliqueMeta", + size: [512, 512], + tileSize: [512, 512], + tileResolution: [1], + projection: W, + format: "png", + url: "" +}); +class QS extends ps { + constructor() { + super({}); + } + getImageForCoordinate(t, e) { + const s = [ + [t[0] - 100, t[1] - 100, 0], + [t[0] + 100, t[1] - 100, 0], + [t[0] + 100, t[1] + 100, 0], + [t[0] - 100, t[1] + 100, 0] + ], r = new Bl({ + meta: KS, + viewDirection: Oe.NORTH, + viewDirectionAngle: 0, + name: this.name, + groundCoordinates: s, + centerPointOnGround: t + }); + return r[Hl] = !0, r; + } +} +const ew = { + [Oe.NORTH]: 0, + [Oe.EAST]: 90, + [Oe.SOUTH]: 180, + [Oe.WEST]: 270, + [Oe.NADIR]: 0 +}, ac = new QS(); +function Oo(i) { + const { heading: t } = i; + let e = Oe.NORTH; + return t >= 45 && t < 135 ? e = Oe.EAST : t >= 135 && t < 225 ? e = Oe.SOUTH : t >= 225 && t < 315 && (e = Oe.WEST), e; +} +function bo(i) { + const t = i.groundPosition ?? i.cameraPosition ?? [0, 0, 0]; + return as(t, de.proj, W.proj); +} +class Ae extends qr { + constructor(e) { + super(e); + h(this, "_loadingCollection"); + h(this, "_mapChangeEvent"); + h(this, "_switchThreshold"); + h(this, "_switchEnabled"); + /** + * An event raise, when the collection changes. Is passed the collection as its only argument. + */ + h(this, "collectionChanged"); + h(this, "failedToSetCollection", new L()); + h(this, "maintainViewpointOnCollectionChange"); + h(this, "_activeCollectionDestroyedListener"); + h(this, "_obliqueProvider", null); + h(this, "initializedPromise", null); + const s = Ae.getDefaultOptions(); + this._loadingCollection = null, this._mapChangeEvent = e.changeOnMoveEnd ? "moveend" : "postrender", this._switchThreshold = k(e.switchThreshold, s.switchThreshold), this._switchThreshold > 1 ? this._switchThreshold = 0.2 : this._switchThreshold < 0 && (this._switchThreshold = 0), this._switchEnabled = ce(e.switchOnEdge, s.switchOnEdge), this.collectionChanged = new L(), this.maintainViewpointOnCollectionChange = ce(e.maintainViewpointOnCollectionChange, s.maintainViewpointOnCollectionChange), this._activeCollectionDestroyedListener = () => { + }; + } + static get className() { + return "ObliqueMap"; + } + static getDefaultOptions() { + return { + ...ci.getDefaultOptions(), + changeOnMoveEnd: !1, + switchThreshold: 0, + switchOnEdge: !0, + maintainViewpointOnCollectionChange: !1 + }; + } + /** + * Whether the post render handler should switch on image edge. Setting + * this to false will suspend all post render handler switches. + */ + get switchEnabled() { + return this._switchEnabled; + } + /** + * @param switchEnabled + */ + set switchEnabled(e) { + this._switchEnabled = e, this._obliqueProvider && (this._obliqueProvider.switchEnabled = e); + } + /** + * Threshold from 0 to 1 to define when to start switching to other images. Where 0 indicates + * to only switch, when the view center is outside of the image and 1 to always switch. 0.2 would start switching + * if the view center is within the outer 20% of the image. + */ + get switchThreshold() { + return this._switchThreshold; + } + /** + * @param threshold + */ + set switchThreshold(e) { + S(e, Number), this._switchThreshold = e, this._switchThreshold > 1 ? this._switchThreshold = 0.2 : this._switchThreshold < 0 && (this._switchThreshold = 0), this._obliqueProvider && (this._obliqueProvider.switchThreshold = this._switchThreshold); + } + async initialize() { + this.initializedPromise || (this.initializedPromise = super.initialize().then(async () => { + this._obliqueProvider = new BS(this.olMap), this.mapChangeEvent = this._mapChangeEvent, this.switchThreshold = this._switchThreshold, this.switchEnabled = this._switchEnabled; + let e = this._loadingCollection; + e || (e = ac), e && await this._setCollection(e); + }).then(() => { + this.initialized = !0; + })), await this.initializedPromise; + } + get mapChangeEvent() { + return this._mapChangeEvent; + } + set mapChangeEvent(e) { + S(e, String), this._mapChangeEvent = e, this._obliqueProvider && (this._obliqueProvider.mapChangeEvent = e); + } + get collection() { + var e; + return ((e = this._obliqueProvider) == null ? void 0 : e.collection) ?? null; + } + get imageChanged() { + var e; + return ((e = this._obliqueProvider) == null ? void 0 : e.imageChanged) ?? null; + } + get currentImage() { + var e; + return ((e = this._obliqueProvider) == null ? void 0 : e.currentImage) ?? null; + } + async canShowViewpoint(e) { + if (await this.initialize(), this.collection) { + const s = Oo(e), r = bo(e); + return this.collection.hasImageAtCoordinate(r, s); + } + return !1; + } + async activate() { + var e, s; + await super.activate(), this.active && ((s = (e = this._obliqueProvider) == null ? void 0 : e.activate) == null || s.call(e)); + } + getExtentOfCurrentImage() { + const e = this.currentImage; + if (e) { + const s = Ir(e.groundCoordinates); + return new be({ + coordinates: ih(s, e.meta.projection.proj, W.proj), + projection: W.toJSON() + }); + } + return new be({ + coordinates: [ + -189243134349e-4, + -155387110963e-4, + 189243134349e-4, + 155387110963e-4 + ], + projection: W.toJSON() + }); + } + deactivate() { + var e, s; + super.deactivate(), (s = (e = this._obliqueProvider) == null ? void 0 : e.deactivate) == null || s.call(e); + } + /** + * Sets a new oblique collection + */ + async setCollection(e, s) { + S(e, ps), !this.movementApiCallsDisabled && (this._loadingCollection = e, this.initializedPromise && (await this.initializedPromise, this._loadingCollection === e && await this._setCollection(e, s))); + } + /** + * Sets a new oblique collection + */ + async _setCollection(e, s) { + var n; + this._loadingCollection = e, await e.load(); + const r = s || await this.getViewpoint(); + if (this._loadingCollection === e) { + if (s && this.maintainViewpointOnCollectionChange && this.collection) { + const a = Oo(s), o = bo(s); + if (!await e.hasImageAtCoordinate(o, a)) { + this.failedToSetCollection.raiseEvent(e); + return; + } + } + (n = this._obliqueProvider) == null || n.setCollection(e), this._activeCollectionDestroyedListener(), this._activeCollectionDestroyedListener = e.destroyed.addEventListener(() => { + this._setCollection(ac); + }), this.collectionChanged.raiseEvent(e), r && await this.gotoViewpoint(r); + } + } + /** + * Sets an image by its name on the map + */ + async setImageByName(e, s) { + var n, a; + if (this.movementApiCallsDisabled || !this.initializedPromise) + return; + await this.initializedPromise; + const r = (a = (n = this._obliqueProvider) == null ? void 0 : n.collection) == null ? void 0 : a.getImageByName(e); + r && await this._obliqueProvider.setImage(r, s); + } + async getViewpoint() { + const e = this.currentImage; + if (!e) + return null; + const s = this.olMap.getView().getCenter(); + if (!s) + return null; + const r = { dataProjection: de }, { coords: n } = await Wr(e, s, r); + return this._computeViewpointInternal(n); + } + getViewpointSync() { + const e = this.currentImage; + if (!e) + return null; + const s = this.olMap.getView().getCenter(); + if (!s) + return null; + const r = e.transformImage2RealWorld(s, e.averageHeight), a = $e(e.meta.projection.proj, de.proj)(r.slice(0, 2), void 0, void 0); + return this._computeViewpointInternal(a); + } + _computeViewpointInternal(e) { + const s = this.currentImage, r = this.olMap, { size: n, fovy: a, metersPerUnit: o } = Sd(r, s), u = (r.getView().getResolution() || 1) * n.height * o, f = Math.abs(u / 2 / Math.tan(a / 2)), g = e[2] || s.averageHeight, m = f + g; + return new It({ + cameraPosition: [e[0], e[1], m], + groundPosition: e, + heading: ew[s.viewDirection], + pitch: -90, + roll: 0, + distance: f + }); + } + async gotoViewpoint(e) { + if (this.movementApiCallsDisabled || !this.olMap || !this._obliqueProvider || !e.isValid()) + return; + const s = Oo(e), r = bo(e), { distance: n } = e; + if (await this._obliqueProvider.setView(r, s), this._obliqueProvider.currentImage) { + const a = TS(this.olMap, this._obliqueProvider.currentImage, n); + this.olMap.getView().setZoom(a); + } + } + pointIsVisible(e) { + const s = this.currentImage; + if (!s || !this.active) + return !1; + const n = this.olMap.getView().calculateExtent(this.olMap.getSize()), a = s.transformImage2RealWorld([n[0], n[1]]), o = s.transformImage2RealWorld([n[2], n[3]]), l = [a[0], a[1], o[0], o[1]], c = ih(l, s.meta.projection.proj, de.proj); + return Lc(c, e[0], e[1]); + } + toJSON() { + const e = super.toJSON(), s = Ae.getDefaultOptions(); + return this.mapChangeEvent === "moveend" && (e.changeOnMoveEnd = !0), this.switchThreshold !== s.switchThreshold && (e.switchThreshold = this.switchThreshold), this.switchEnabled !== s.switchOnEdge && (e.switchOnEdge = this.switchEnabled), this.maintainViewpointOnCollectionChange !== s.maintainViewpointOnCollectionChange && (e.maintainViewpointOnCollectionChange = this.maintainViewpointOnCollectionChange), e; + } + destroy() { + this._obliqueProvider && this._obliqueProvider.destroy(), this.collectionChanged.destroy(), this.failedToSetCollection.destroy(), this._activeCollectionDestroyedListener(), super.destroy(); + } +} +Ks.registerClass(Ae.className, Ae); +var Pr; +(function(i) { + i.HEIGHT = "height", i.DISTANCE = "distance"; +})(Pr || (Pr = {})); +class Yr { + constructor(t) { + /** + * The mode to use. When using DISTANCE mode, be sure to have a terrainProvider set. + */ + h(this, "mode"); + h(this, "_terrainUrl"); + /** + * The minimum height/distance to the terrain the camera must maintain + */ + h(this, "limit"); + /** + * The level to request terrain data at + */ + h(this, "level"); + /** + * last checked camera position + */ + h(this, "lastCheckedPosition", new ee()); + h(this, "terrainRequestHeaders"); + /** + * last updated terrain height + */ + h(this, "_terrainHeight", null); + h(this, "_updatingTerrainHeight", !1); + const e = Yr.getDefaultOptions(); + this.mode = $a(t.mode, Pr, e.mode), this._terrainUrl = t.terrainUrl || e.terrainUrl, this.limit = k(t.limit, e.limit), this.level = t.level === null ? null : ne(t.level, e.level), this.terrainRequestHeaders = t.terrainRequestHeaders; + } + static get className() { + return "CameraLimiter"; + } + static getDefaultOptions() { + return { + mode: Pr.HEIGHT, + terrainUrl: void 0, + terrainRequestHeaders: void 0, + limit: 200, + level: 12 + }; + } + /** + * The url of the terrain to use. Required for mode DISTANCE + */ + get terrainUrl() { + return this._terrainUrl; + } + set terrainUrl(t) { + S(t, ie(String)), this._terrainUrl !== t && (this._terrainUrl = t); + } + async _limitWithLevel(t) { + const e = await Ur(this.terrainUrl, {}, this.terrainRequestHeaders); + return this.level && PS(e, this.level, t) ? ig(e, this.level, [t]) : this._limitMostDetailed(t); + } + async _limitMostDetailed(t) { + const e = await Ur(this.terrainUrl, {}, this.terrainRequestHeaders); + return Ys(e, [t]); + } + async _updateTerrainHeight(t) { + if (!this._updatingTerrainHeight && !t.equalsEpsilon(this.lastCheckedPosition, b.EPSILON5)) { + this._updatingTerrainHeight = !0; + const [e] = this.level != null ? await this._limitWithLevel(t.clone()) : await this._limitMostDetailed(t.clone()); + this._terrainHeight = e.height, this.lastCheckedPosition = t, this._updatingTerrainHeight = !1; + } + } + /** + * Limits the given camera based on this limiters specs. + */ + limitCamera(t) { + let e = Promise.resolve(); + const s = ee.fromCartesian(t.position); + if (s) + if (this.mode === Pr.DISTANCE && this.terrainUrl) { + if (e = this._updateTerrainHeight(s), this._terrainHeight && s.height - this._terrainHeight < this.limit) { + const r = this._terrainHeight + this.limit; + ee.toCartesian(new ee(s.longitude, s.latitude, r), qo.WGS84, t.position); + } + } else s.height < this.limit && ee.toCartesian(new ee(s.longitude, s.latitude, this.limit), qo.WGS84, t.position); + return e; + } + toJSON() { + const t = {}, e = Yr.getDefaultOptions(); + return this.terrainUrl && (t.terrainUrl = this.terrainUrl), this.limit !== e.limit && (t.limit = this.limit), this.mode !== e.mode && (t.mode = this.mode), this.level !== e.level && (t.level = this.level), Ke(this.terrainRequestHeaders, e.terrainRequestHeaders) || (t.terrainRequestHeaders = this.terrainRequestHeaders), t; + } +} +function Ma(i, t, e) { + const s = e.indexOfKey(t[J]); + if (s > -1 && !i.contains(t)) { + const r = i.length; + let n = r; + for (let a = 0; a < r; a++) { + const o = i.get(a); + if (e.indexOfKey(o[J]) > s) { + n = a; + break; + } + } + i.add(t, n); + } +} +async function Ed(i, t, e) { + const s = e.indexOfKey(t[J]); + if (s > -1) { + i.contains(t) || await i.add(t); + const r = i.length; + let n = r; + for (let o = 0; o < r; o++) { + const l = i.get(o); + if (e.indexOfKey(l[J]) > s) { + n = o; + break; + } + } + let a = i.indexOf(t); + if (n > a && (n -= 1), a < n) + for (; a < n; ) + i.raise(t), a = i.indexOf(t); + else if (a > n) + for (; a > n; ) + i.lower(t), a = i.indexOf(t); + } +} +function tw(i, t, e) { + const { destroyPrimitives: s } = i; + i.destroyPrimitives = !1, i.remove(t), Ma(i, t, e), i.destroyPrimitives = s; +} +function iw(i, t, e) { + i.remove(t, !1), Ma(i, t, e); +} +function sw(i, t, e) { + Ed(i, t, e); +} +function oc(i, t) { + return t.clockRange = i.clockRange, t.clockStep = i.clockStep, t.multiplier = i.multiplier, (!t.startTime || !t.startTime.equals(i.startTime) || !t.stopTime || !t.stopTime.equals(i.stopTime)) && (t.startTime = i.startTime, t.stopTime = i.stopTime, t.currentTime = i.currentTime), i.definitionChanged.addEventListener((e, s, r) => { + t[s] = r; + }); +} +class B extends ci { + constructor(e) { + super(e); + h(this, "_cesiumWidget"); + h(this, "dataSourceDisplay"); + /** + * clock for animated data + */ + h(this, "dataSourceDisplayClock"); + /** + * default clock is set, when no datasource clock is active + */ + h(this, "_defaultClock"); + /** + * clocks of active data sources + * the last clock of the array corresponds to the active dataSourceDisplayClock + */ + h(this, "_dataSourceClocks"); + h(this, "enableLightning"); + h(this, "tileCacheSize"); + h(this, "screenSpaceEventHandler"); + h(this, "_screenSpaceListeners"); + h(this, "defaultJDate"); + /** + * The defaultShadowMap which is created when calling the constructor of the CesiumWidet in {@link initialize}. This is a reference, not a clone. + */ + h(this, "_defaultShadowMap"); + /** + * A cache of the shadowMap that is set, before {@link initialize} is called. It is applied as soon the instance is initialized. + */ + h(this, "_initialShadowMap"); + h(this, "shadowMapChanged"); + h(this, "webGLaa"); + h(this, "globeColor"); + h(this, "_clusterDataSourceDisplay"); + h(this, "_terrainProvider"); + h(this, "defaultTerrainProvider"); + h(this, "useOriginalCesiumShader"); + h(this, "_cameraLimiter"); + h(this, "_cameraLimiterOptions"); + h(this, "_preUpdateListener"); + h(this, "_clockSyncListener"); + h(this, "_listeners"); + h(this, "_lastEventFrameNumber"); + h(this, "_lightIntensity"); + h(this, "_contextOptions"); + const s = B.getDefaultOptions(); + this._cesiumWidget = null, this.dataSourceDisplay = null, this.dataSourceDisplayClock = new sg({ shouldAnimate: !0 }); + const r = new rg(); + r.currentTime = this.dataSourceDisplayClock.currentTime, this._defaultClock = r, this._dataSourceClocks = [], this.enableLightning = ce(e.enableLightning, s.enableLightning), this.tileCacheSize = ne(e.tileCacheSize, s.tileCacheSize), this.screenSpaceEventHandler = null, this._screenSpaceListeners = [], this.defaultJDate = Yc.fromDate(new Date(2014, 6, 20, 13, 0, 0, 0)), this._defaultShadowMap = null, this._initialShadowMap = null, this.shadowMapChanged = new L(), this.webGLaa = ce(e.webGLaa, s.webGLaa), this.useOriginalCesiumShader = ce(e.useOriginalCesiumShader, s.useOriginalCesiumShader), this.globeColor = U.fromCssColorString(e.globeColor || s.globeColor), this._clusterDataSourceDisplay = null, this._terrainProvider = null, this.defaultTerrainProvider = null, this._cameraLimiter = null, this._cameraLimiterOptions = e.cameraLimiter || s.cameraLimiter, this._preUpdateListener = null, this._clockSyncListener = null, this._listeners = [], this._lastEventFrameNumber = null, this._lightIntensity = k(e.lightIntensity, s.lightIntensity), this._contextOptions = structuredClone(e.contextOptions); + } + static get className() { + return "CesiumMap"; + } + static getDefaultOptions() { + return { + ...ci.getDefaultOptions(), + enableLightning: !0, + tileCacheSize: 1, + webGLaa: !1, + cameraLimiter: void 0, + globeColor: "#3f47cc", + useOriginalCesiumShader: !1, + lightIntensity: 3, + contextOptions: void 0 + }; + } + /** + * returns the light Intensity, see Cesium https://cesium.com/learn/cesiumjs/ref-doc/SunLight.html?classFilter=sunlight#intensity + */ + get lightIntensity() { + return this._lightIntensity; + } + /** + * sets the light Intensity, see Cesium https://cesium.com/learn/cesiumjs/ref-doc/SunLight.html?classFilter=sunlight#intensity + */ + set lightIntensity(e) { + this._lightIntensity = e, this.initialized && this._cesiumWidget && (this._cesiumWidget.scene.light.intensity = e); + } + get splitPosition() { + return super.splitPosition; + } + set splitPosition(e) { + super.splitPosition = e, this._cesiumWidget && (this._cesiumWidget.scene.splitPosition = e); + } + get defaultShadowMap() { + return this._defaultShadowMap; + } + get terrainProvider() { + return this._terrainProvider; + } + /** + * A camera limit to not allow the camera to get too close to the globe. + */ + get cameraLimiter() { + return this._cameraLimiter; + } + set cameraLimiter(e) { + S(e, ie(Yr)), this._cameraLimiter !== e && (this._cameraLimiter = e, this._cameraLimiter && !this._preUpdateListener && this._cesiumWidget ? this._setupPreUpdateListener() : !this._cameraLimiter && this._preUpdateListener && (this._preUpdateListener(), this._preUpdateListener = null)); + } + _setupPreUpdateListener() { + this._cesiumWidget && (this._preUpdateListener = this._cesiumWidget.scene.preUpdate.addEventListener(() => { + this._cameraLimiter && this._cesiumWidget && this._cameraLimiter.limitCamera(this._cesiumWidget.scene.camera); + })); + } + _raisePointerInteraction(e, s, r, n) { + var l, c; + const a = ( + // eslint-disable-next-line no-underscore-dangle + (((c = (l = this.screenSpaceEventHandler) == null ? void 0 : l._positions) == null ? void 0 : c.length) ?? 0) > 1 + ), o = n.position ? n.position : n.endPosition; + this.pointerInteractionEvent.raiseEvent({ + map: this, + windowPosition: o, + key: e, + pointer: s, + multipleTouch: a, + pointerEvent: r + }); + } + _setupInteractions() { + if (!(this._cesiumWidget && this.screenSpaceEventHandler)) + throw new Error("Cannot setup interactions on uninitailized map"); + const e = [ + { + csModifier: so.ALT, + vcsModifier: F.ALT + }, + { + csModifier: so.CTRL, + vcsModifier: F.CTRL + }, + { + csModifier: so.SHIFT, + vcsModifier: F.SHIFT + }, + { csModifier: void 0, vcsModifier: F.NONE } + ], s = [ + { + type: Ni.LEFT_DOWN, + pointerEvent: at.DOWN, + pointer: Ne.LEFT + }, + { + type: Ni.LEFT_UP, + pointerEvent: at.UP, + pointer: Ne.LEFT + }, + { + type: Ni.RIGHT_DOWN, + pointerEvent: at.DOWN, + pointer: Ne.RIGHT + }, + { + type: Ni.RIGHT_UP, + pointerEvent: at.UP, + pointer: Ne.RIGHT + }, + { + type: Ni.MIDDLE_DOWN, + pointerEvent: at.DOWN, + pointer: Ne.MIDDLE + }, + { + type: Ni.MIDDLE_UP, + pointerEvent: at.UP, + pointer: Ne.MIDDLE + }, + { + type: Ni.MOUSE_MOVE, + pointerEvent: at.MOVE, + pointer: Ne.ALL + } + ]; + this._screenSpaceListeners = s.map(({ pointerEvent: r, pointer: n, type: a }) => e.map(({ csModifier: o, vcsModifier: l }) => { + var d, u; + const c = a === Ni.MOUSE_MOVE ? (f) => { + const g = this._cesiumWidget; + g.scene.frameState.frameNumber !== this._lastEventFrameNumber && (this._lastEventFrameNumber = g.scene.frameState.frameNumber, this._raisePointerInteraction(l, n, r, f)); + } : (f) => { + this._raisePointerInteraction(l, n, r, f); + }; + return (u = (d = this.screenSpaceEventHandler) == null ? void 0 : d.setInputAction) == null || u.call(d, c, a, o), () => { + var f, g; + (g = (f = this == null ? void 0 : this.screenSpaceEventHandler) == null ? void 0 : f.removeInputAction) == null || g.call(f, a, o); + }; + })).flat(); + } + initialize() { + var e; + if (!this.initialized) { + this.useOriginalCesiumShader ? globalThis.useVcsCustomShading && console.error("Cannot activate Original Cesium Shader, flag to use VCS Shader is already set by another Cesium Map or VCMap Instance") : globalThis.useVcsCustomShading = !0; + const s = { + ...this._contextOptions, + webgl: { + ...(e = this._contextOptions) == null ? void 0 : e.webgl, + antialias: this.webGLaa + } + }; + this._cesiumWidget = new ng(this.mapElement, { + requestRenderMode: !1, + scene3DOnly: !0, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore // error in Cesium, recheck on next cesium update + baseLayer: !1, + shadows: !1, + terrainShadows: Ha.ENABLED, + contextOptions: s + }), this._cesiumWidget.scene.globe.tileCacheSize = this.tileCacheSize, this._cesiumWidget.scene.globe.baseColor = this.globeColor, this.dataSourceDisplay = new nh({ + scene: this._cesiumWidget.scene, + dataSourceCollection: new ah() + }), this._cesiumWidget.scene.frameState.creditDisplay.update = () => { + }, this._cesiumWidget.scene.frameState.creditDisplay.beginFrame = () => { + }, this._cesiumWidget.scene.frameState.creditDisplay.endFrame = () => { + }; + const { clock: r } = this._cesiumWidget; + r.shouldAnimate = !0, this._listeners.push(r.onTick.addEventListener(() => { + var o, l; + this.dataSourceDisplayClock.tick(); + const a = this.dataSourceDisplayClock.currentTime; + (l = (o = this.dataSourceDisplay) == null ? void 0 : o.update) == null || l.call(o, a); + })), ag.maximumRequestsPerServer = 12, this._cesiumWidget.scene.shadowMap.maximumDistance = 5e3, this._cesiumWidget.scene.shadowMap.darkness = 0.6, this._cesiumWidget.scene.globe.depthTestAgainstTerrain = !0, this._cesiumWidget.scene.highDynamicRange = !1, this._cesiumWidget.scene.splitPosition = this.splitPosition, this._cesiumWidget.scene.light.intensity = this._lightIntensity, this._cesiumWidget.scene.globe.enableLighting = this.enableLightning, this.setDay(this.defaultJDate); + const n = document.getElementsByClassName("cesium-widget-credits"); + if (n) + for (let a = 0; a < n.length; a++) { + const o = n[a]; + o.style.display = "none"; + } + this._cameraLimiterOptions && !this._cameraLimiter && (this._cameraLimiter = new Yr(this._cameraLimiterOptions)), this._cameraLimiter && this._setupPreUpdateListener(), this.screenSpaceEventHandler = new og(this._cesiumWidget.scene.canvas), this._setupInteractions(), this.initialized = !0, this.defaultTerrainProvider = this._cesiumWidget.scene.terrainProvider, this._terrainProvider = this.defaultTerrainProvider, this._listeners.push(this._cesiumWidget.scene.terrainProviderChanged.addEventListener(this._terrainProviderChanged.bind(this))), this._listeners.push(this._cesiumWidget.scene.postRender.addEventListener((a, o) => { + this.postRender.raiseEvent({ + map: this, + originalEvent: { scene: a, time: o } + }); + })), this._defaultShadowMap = this._cesiumWidget.scene.shadowMap, this._initialShadowMap && (this.setShadowMap(this._initialShadowMap), this._initialShadowMap = null); + } + return Promise.resolve(); + } + async activate() { + await super.activate(), this.active && this._cesiumWidget && (this._cesiumWidget.useDefaultRenderLoop = !0, this._cesiumWidget.resize()); + } + deactivate() { + super.deactivate(), this._cesiumWidget && (this._cesiumWidget.useDefaultRenderLoop = !1); + } + /** + * getHeight for coordinates + * @param positions - in web mercator + * @returns the array of coordinates with heights updated in place + */ + getHeightFromTerrain(e) { + if (!this._cesiumWidget) + return Promise.resolve(e); + const { terrainProvider: s } = this._cesiumWidget.scene; + return s.availability ? Qs(s, e, W, e) : Promise.resolve(e); + } + getViewpoint() { + return Promise.resolve(this.getViewpointSync()); + } + getViewpointSync() { + if (!this._cesiumWidget || !this._cesiumWidget.scene || !this.target) + return null; + const e = this._cesiumWidget.scene.camera, s = e.position; + let r, n; + const a = new Xc(e.position, e.direction), o = this._cesiumWidget.scene.globe.pick(a, this._cesiumWidget.scene); + if (o) { + n = _.distance(o, s); + const d = qo.WGS84.cartesianToCartographic(o); + r = [ + b.toDegrees(d.longitude), + b.toDegrees(d.latitude), + d.height + ]; + } + const l = e.positionCartographic, c = [ + b.toDegrees(l.longitude), + b.toDegrees(l.latitude), + l.height + ]; + return new It({ + groundPosition: r, + cameraPosition: c, + distance: n, + heading: b.toDegrees(e.heading), + pitch: b.toDegrees(e.pitch), + roll: b.toDegrees(e.roll) + }); + } + async gotoViewpoint(e, s) { + if (this.movementApiCallsDisabled || !e.isValid() || !this._cesiumWidget) + return; + let r; + const { distance: n } = e, a = b.toRadians(e.heading), o = b.toRadians(e.pitch), l = b.toRadians(e.roll); + if (e.cameraPosition) { + const u = e.cameraPosition; + r = _.fromDegrees(u[0], u[1], u[2]); + } else { + if (!e.groundPosition) + return; + const u = e.groundPosition; + if (!u[2]) { + const p = await this.getHeightFromTerrain([ + z.wgs84ToMercator(u) + ]); + u[2] = p[0][2]; + } + const f = _.fromDegrees(u[0], u[1], u[2]), g = new Zc(this._cesiumWidget.scene), m = { + destination: f, + orientation: { + heading: a, + pitch: o, + roll: l + } + }; + g.setView(m), g.moveBackward(n), r = g.position; + } + const c = this._cesiumWidget.scene.camera, d = { + heading: a, + pitch: o, + roll: l + }; + r = r || null, c.cancelFlight(), e.animate ? await new Promise((u) => { + const f = { + destination: r, + orientation: d, + complete: () => { + u(); + }, + cancel: () => { + u(); + } + }; + e.duration && (f.duration = e.duration), e.easingFunction && (f.easingFunction = e.easingFunction), s && (f.maximumHeight = s), c.flyTo(f); + }) : c.setView({ + destination: r, + orientation: d + }); + } + _getCurrentResolutionFromCartesianLatitude(e, s) { + if (!this._cesiumWidget) + return 1; + const r = this._cesiumWidget.scene.camera, n = _.distance(e, r.position), a = Math.PI / 3, o = this.mapElement.offsetWidth, l = this.mapElement.offsetHeight, c = o / l, d = Math.atan(Math.tan(a * 0.5) / c) * 2, u = 2 * n * Math.tan(d / 2), f = Math.cos(Math.abs(s)); + return u / f / l; + } + getCurrentResolution(e) { + const s = z.mercatorToWgs84(e), r = _.fromDegrees(s[0], s[1], s[2]); + return this._getCurrentResolutionFromCartesianLatitude(r, b.toRadians(s[1])); + } + getCurrentResolutionFromCartesian(e) { + return this._getCurrentResolutionFromCartesianLatitude(e, ee.fromCartesian(e).latitude); + } + disableMovement(e) { + super.disableMovement(e), this._cesiumWidget && (this._cesiumWidget.scene.screenSpaceCameraController.enableInputs = !this.movementPointerEventsDisabled); + } + /** + * set dataSource clock as display clock to visualize time dependent animation + */ + setDataSourceDisplayClock(e) { + const s = this._dataSourceClocks[this._dataSourceClocks.length - 1]; + e !== s && (this._clockSyncListener && (this._clockSyncListener(), this._clockSyncListener = null), this._clockSyncListener = oc(e, this.dataSourceDisplayClock)), this._dataSourceClocks.push(e); + } + /** + * unset dataSource clock + */ + unsetDataSourceDisplayClock(e) { + const s = this._dataSourceClocks.lastIndexOf(e); + if (s > -1 && (this._dataSourceClocks.splice(s, 1), s === this._dataSourceClocks.length)) { + const r = this._dataSourceClocks[this._dataSourceClocks.length - 1] || this._defaultClock; + this._clockSyncListener && (this._clockSyncListener(), this._clockSyncListener = null), this._clockSyncListener = oc(r, this.dataSourceDisplayClock); + } + } + /** + * sets the position of the sun according to the day + * @param julianDate See the Cesium API + */ + setDay(e) { + this._cesiumWidget && (this._cesiumWidget.clock.currentTime = e, this._cesiumWidget.clock.multiplier = 1); + } + /** + * sets the lighting of the globe with the sun as a light source + */ + setLightning(e) { + this.enableLightning = e, this._cesiumWidget && (this._cesiumWidget.scene.globe.enableLighting = e); + } + /** + * Sets a shadow map on the scene of the cesiumMaps cesiumWidget. Raises an event if the shadow map changes. This function should be used to set the shadowMap instead of setting it directly on the scene. + * @param shadowMap The shadowMap to assign to the scene of the cesium widget. + */ + setShadowMap(e) { + if (!e) + return; + if (!this._cesiumWidget) { + this._initialShadowMap = e; + return; + } + const { scene: s } = this._cesiumWidget; + s.shadowMap !== e && (s.shadowMap = e, this.shadowMapChanged.raiseEvent(e)); + } + /** + * Sets the default shadow map. + */ + setDefaultShadowMap() { + if (!this._cesiumWidget || !this._defaultShadowMap) { + this._initialShadowMap = null; + return; + } + this.setShadowMap(this._defaultShadowMap); + } + /** + * returns the cesium Widget Object + */ + getCesiumWidget() { + return this._cesiumWidget; + } + /** + * returns the Entities Collection + */ + getEntities() { + var e, s; + return (s = (e = this.dataSourceDisplay) == null ? void 0 : e.defaultDataSource) == null ? void 0 : s.entities; + } + /** + * returns the dataSourceCollection associated with the scene + */ + getDatasources() { + var e; + return (e = this.dataSourceDisplay) == null ? void 0 : e.dataSources; + } + /** + * Returns the cluster dataSourceDisplays dataSources. + * This datasource can only handle Entities with Billboards, Labels or Points. + */ + getClusterDatasources() { + if (this._clusterDataSourceDisplay) + return this._clusterDataSourceDisplay.dataSources; + if (!this._cesiumWidget) + throw new Error("Cannot get Datasource collection from uninitialized map"); + const e = new ah(), s = (r, n, a) => { + const { entities: o } = a; + return [ + new lg(n, o), + new hg(n, o), + new cg(n, o) + ]; + }; + return this._clusterDataSourceDisplay = new nh({ + scene: this._cesiumWidget.scene, + dataSourceCollection: e, + visualizersCallback: s + // XXX remove after type fix in cesium, + }), this._listeners.push(this._cesiumWidget.clock.onTick.addEventListener((r) => { + var n, a; + (a = (n = this._clusterDataSourceDisplay) == null ? void 0 : n.update) == null || a.call(n, r.currentTime); + })), e; + } + indexChanged(e) { + const s = this.getVisualizationsForLayer(e); + s && s.forEach((r) => { + r instanceof $t ? tw(this.getScene().primitives, r, this.layerCollection) : r instanceof vs ? iw(this.getScene().imageryLayers, r, this.layerCollection) : r instanceof Jc && sw(this.dataSourceDisplay.dataSources, r, this.layerCollection); + }); + } + /** + * Internal API used to register visualizations from layer implementations + * @param primitiveCollection + */ + addPrimitiveCollection(e) { + if (!this._cesiumWidget) + throw new Error("Cannot add primitive to uninitialized map"); + this.validateVisualization(e) && (this.addVisualization(e), Ma(this._cesiumWidget.scene.primitives, e, this.layerCollection)); + } + /** + * Internal API to unregister the visualization for a layers implementation + * @param primitiveCollection + */ + removePrimitiveCollection(e) { + var s; + this.removeVisualization(e), (s = this.getScene()) == null || s.primitives.remove(e); + } + /** + * Internal API used to register visualizations from layer implementations + * @param imageryLayer + */ + addImageryLayer(e) { + if (!this._cesiumWidget) + throw new Error("Cannot add primitive to uninitialized map"); + this.validateVisualization(e) && (this.addVisualization(e), Ma(this._cesiumWidget.scene.imageryLayers, e, this.layerCollection)); + } + /** + * Internal API used to unregister visualizations from layer implementations + */ + removeImageryLayer(e) { + var s; + this.removeVisualization(e), (s = this.getScene()) == null || s.imageryLayers.remove(e); + } + /** + * Internal API used to register visualizations from layer implementations + */ + async addDataSource(e) { + if (!this.dataSourceDisplay) + throw new Error("Cannot add data source to uninitialized map"); + this.validateVisualization(e) && (this.addVisualization(e), await Ed(this.dataSourceDisplay.dataSources, e, this.layerCollection)); + } + /** + * Internal API used to unregister visualizations from layer implementations + */ + removeDataSource(e) { + this.removeVisualization(e), this.dataSourceDisplay && !this.dataSourceDisplay.isDestroyed() && !this.dataSourceDisplay.dataSources.isDestroyed() && this.dataSourceDisplay.dataSources.remove(e); + } + /** + * set the cesium TerrainProvider + */ + setTerrainProvider(e) { + this.terrainProvider !== e && this._cesiumWidget && (this._cesiumWidget.scene.terrainProvider = e); + } + /** + * unsets the TerrainProvider (changes to the default TerrainProvider if the given terranProvider is currently active) + */ + unsetTerrainProvider(e) { + this.terrainProvider === e && (this._terrainProvider = this.defaultTerrainProvider, this._cesiumWidget && this.defaultTerrainProvider && (this._cesiumWidget.scene.terrainProvider = this.defaultTerrainProvider)); + } + /** + * returns the cesium DataSourceDisplay Object + */ + getDataSourceDisplay() { + return this.dataSourceDisplay; + } + /** + * returns the cesium Scene Object, returns null on non initialized or destroyed maps + */ + getScene() { + var e; + return (e = this._cesiumWidget) == null ? void 0 : e.scene; + } + pointIsVisible(e) { + if (!this._cesiumWidget) + return !1; + const { camera: s } = this._cesiumWidget.scene, r = _.fromDegrees(e[0], e[1], 0); + return s.frustum.computeCullingVolume(s.positionWC, s.directionWC, s.upWC).computeVisibility(new Kc(r)) === $n.INSIDE; + } + /** + * is called when the cesium Terrainprovider changes. Sets the .terrainProvider and deactivates currently + * active TerrainLayer layer if necessary + */ + _terrainProviderChanged(e) { + var s; + if (this.terrainProvider !== e) { + const r = this.layerCollection.getByKey((s = this == null ? void 0 : this.terrainProvider) == null ? void 0 : s[J]); + this._terrainProvider = e, r && r.deactivate(); + } + } + /** + * returns true if the WEBGL Extension WEBGL_depth_texture is supported. (Is used for picking) + */ + pickPositionSupported() { + var e; + return this.initialized ? ((e = this._cesiumWidget) == null ? void 0 : e.scene.pickPositionSupported) ?? !1 : !1; + } + /** + * returns true if the WEBGL Extension EXT_frag_depth is supported. (Is used for GroundPoloygons) + */ + isGroundPrimitiveSupported() { + var e; + return this.initialized ? ((e = this._cesiumWidget) == null ? void 0 : e.scene.context.fragmentDepth) ?? !1 : !1; + } + toJSON() { + const e = super.toJSON(), s = B.getDefaultOptions(); + return this.enableLightning !== s.enableLightning && (e.enableLightning = this.enableLightning), this.tileCacheSize !== s.tileCacheSize && (e.tileCacheSize = this.tileCacheSize), this.webGLaa !== s.webGLaa && (e.webGLaa = this.webGLaa), this.globeColor.toCssHexString() !== s.globeColor && (e.globeColor = this.globeColor.toCssHexString()), this._cameraLimiter ? e.cameraLimiter = this._cameraLimiter.toJSON() : this._cameraLimiterOptions && !this.initialized && (e.cameraLimiter = this._cameraLimiterOptions), this._lightIntensity !== s.lightIntensity && (e.lightIntensity = this._lightIntensity), this.useOriginalCesiumShader !== s.useOriginalCesiumShader && (e.useOriginalCesiumShader = this.useOriginalCesiumShader), this._contextOptions !== s.contextOptions && (e.contextOptions = structuredClone(this._contextOptions)), e; + } + destroy() { + this.dataSourceDisplay && !this.dataSourceDisplay.isDestroyed() && this.dataSourceDisplay.destroy(), this._screenSpaceListeners.forEach((e) => { + e(); + }), this.screenSpaceEventHandler && (this.screenSpaceEventHandler.destroy(), this.screenSpaceEventHandler = null), this._listeners.forEach((e) => { + e(); + }), this._listeners = [], this._terrainProvider = null, this.defaultTerrainProvider = null, this._clockSyncListener && (this._clockSyncListener(), this._clockSyncListener = null), this._preUpdateListener && (this._preUpdateListener(), this._preUpdateListener = null), this._cameraLimiter && (this._cameraLimiter = null), [...this.layerCollection].forEach((e) => { + e.removedFromMap(this); + }), this._clusterDataSourceDisplay && this._clusterDataSourceDisplay.destroy(), this._cesiumWidget && (this._cesiumWidget.destroy(), this._cesiumWidget = null), this._initialShadowMap = null, this._defaultShadowMap = null, this.shadowMapChanged.destroy(), super.destroy(); + } +} +Ks.registerClass(B.className, B); +class ct extends Li { + constructor(e) { + super(e); + h(this, "_supportedMaps", [ + B.className, + Ae.className, + Pe.className + ]); + h(this, "source", new Tr({})); + h(this, "projection"); + h(this, "maxResolution"); + h(this, "minResolution"); + h(this, "dontUseTerrainForOblique"); + h(this, "highlightStyle"); + /** + * A flag to indicate, whether the features in the layer have a UUID, allowing certain interactions, + * e.g. hidding its features in plannings + */ + h(this, "hasFeatureUUID", !1); + h(this, "_visibility", !0); + /** + * If true, the cesium synchronizers are destroyed on map change + */ + h(this, "isDynamic"); + h(this, "_onStyleChangeRemover", null); + h(this, "vectorProperties"); + h(this, "_initialStyle"); + const s = ct.getDefaultOptions(); + this.projection = new z(e.projection), this.maxResolution = e.maxResolution != null ? e.maxResolution : s.maxResolution, this.minResolution = e.minResolution != null ? e.minResolution : s.minResolution, this.dontUseTerrainForOblique = ce(e.dontUseTerrainForOblique, s.dontUseTerrainForOblique), this.highlightStyle = void 0, e.highlightStyle && (this.highlightStyle = e.highlightStyle instanceof ge ? e.highlightStyle : new ge(e.highlightStyle)), this.isDynamic = ce(e.isDynamic, s.isDynamic), this.vectorProperties = new Gt({ + allowPicking: this.allowPicking, + ...e.vectorProperties + }); + let r; + e.style instanceof li ? r = e.style.toJSON() : r = e.style, this._initialStyle = r; + } + static get className() { + return "VectorLayer"; + } + static getDefaultOptions() { + return { + ...st.getDefaultOptions(), + projection: void 0, + maxResolution: void 0, + minResolution: void 0, + dontUseTerrainForOblique: !1, + zIndex: 50, + highlightStyle: void 0, + isDynamic: !1, + vectorProperties: {} + // XXX or should we return VectorProperties default options? + }; + } + get allowPicking() { + return super.allowPicking; + } + set allowPicking(e) { + super.allowPicking = e, this.vectorProperties.allowPicking = e; + } + get visibility() { + return this._visibility; + } + set visibility(e) { + this._visibility !== e && (this._visibility = e, this.forceRedraw()); + } + initialize() { + return super.initialize().then(() => { + this._trackStyleChanges(); + }); + } + /** + * Returns the layers vcsMeta object + * @param options + */ + getVcsMeta(e = {}) { + const s = this.vectorProperties.getVcsMeta(); + if (s.version = xi, e.embedIcons && (s.embeddedIcons = []), e.writeStyle) { + const r = this.getStyleOrDefaultStyle(this._initialStyle); + (e.writeDefaultStyle || !r.equals(this.style)) && Sv(this.style, s); + } + return Object.keys(this.properties).length !== 0 && (s.layerProperties = { ...this.properties }), s; + } + /** + * Sets the meta values based on a Object. Does not carry over the style + * @param vcsMeta + */ + setVcsMeta(e) { + this.vectorProperties.setVcsMeta(e), e.layerProperties && Object.assign(this.properties, e.layerProperties); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + source: this.source, + maxResolution: this.maxResolution, + minResolution: this.minResolution, + vectorProperties: this.vectorProperties + }; + } + createImplementationsForMap(e) { + return this.visibility ? e instanceof Pe ? [new ju(e, this.getImplementationOptions())] : e instanceof B ? [new bS(e, this.getImplementationOptions())] : e instanceof Ae ? [new wd(e, this.getImplementationOptions())] : [] : []; + } + getStyleOrDefaultStyle(e, s) { + return super.getStyleOrDefaultStyle(e, s || gs.clone()); + } + setStyle(e, s) { + super.setStyle(e, s), this._trackStyleChanges(); + const r = this.style instanceof tt; + this.getFeatures().forEach((n) => { + if (n[yt]) { + let a; + r ? (a = !0, n.setStyle(void 0)) : n.getStyle() !== n[yt].style && (a = !0, n.setStyle(n[yt].style)), a && Reflect.has(n, Mi) && Al(n); + } + }); + } + /** + * Changes features which use the layers style or if the layers style is a declarative style so they are re-rendered + * @protected + */ + _trackStyleChanges() { + this._onStyleChangeRemover && (this._onStyleChangeRemover(), this._onStyleChangeRemover = null); + const e = this.style instanceof tt; + this._onStyleChangeRemover = this.style.styleChanged.addEventListener(() => { + this.getFeatures().forEach((s) => { + (e || !s[yt]) && s.changed(); + }); + }); + } + /** + * sets the highlightstyle of this layer + */ + setHighlightStyle(e) { + S(e, je(K, ge, Function)), e instanceof ge ? this.highlightStyle = e : (this.highlightStyle || (this.highlightStyle = new ge({})), this.highlightStyle.style = e); + } + /** + * returns the openlayers vector source + */ + getSource() { + return this.source; + } + /** + * add features to the vector layer and return an array with their ids. + * The geometry will be mutated and transformed to EPSG 3857 mercator coordinate system + * features will be added an id, if they do not already have one. + * + * returns the ids of the added features. if a feature has an id and the same id is alread in the + * layer, it will not be added. + * @todo mechanism to enforce XYZ coordinate layout for internal usage + */ + addFeatures(e) { + S(e, [ue]); + const s = this.style instanceof tt, r = e.map((n) => { + const a = n.getId(); + if (a == null) + n.setId(Xe()); + else if (this.hasFeatureUUID = !0, a && this.getFeatureById(a)) + return !1; + if (this.projection.epsg !== W.epsg) { + const o = n.getGeometry(); + o && (o[hi] || (o.transform(this.projection.proj, W.proj), o[hi] = !0)); + } + return n[J] = this.name, s && n[yt] && n.setStyle(), n; + }).filter((n) => n); + return this.source.addFeatures(r), r.map((n) => n.getId()); + } + /** + * removes features from the vector layer + */ + removeFeaturesById(e) { + const s = this.getFeaturesById(e); + for (let r = 0; r < s.length; r++) + this.source.removeFeature(s[r]); + } + /** + * removes all features from the vector layer + */ + removeAllFeatures() { + this.source.clear(); + } + /** + * returns an array with features + * feature geometries are always in EPSG 3857 mercator coordinate system + */ + getFeaturesById(e) { + return S(e, [je(String, Number)]), e.map((s) => this.getFeatureById(s)).filter((s) => s != null); + } + /** + * returns an feature if found, otherwise null + * feature geometries are always in EPSG 3857 mercator coordinate system + */ + getFeatureById(e) { + return this.source.getFeatureById(e); + } + /** + * returns an array with features + * Feature geometries are always in EPSG 3857 mercator coordinate system + */ + getFeatures() { + return this.source.getFeatures(); + } + /** + * Returns the configured Extent of this layer or tries to calculate the extent based on the current features. + * Returns null of no extent was configured and the layer is void of any features with a valid geometry. + */ + getZoomToExtent() { + const e = super.getZoomToExtent(); + if (e) + return e; + const s = new be({ + projection: W.toJSON(), + coordinates: this.source.getExtent() + }); + return s.isValid() ? s : null; + } + toJSON() { + const e = super.toJSON(), s = ct.getDefaultOptions(); + this.projection.epsg !== P0().epsg && (e.projection = this.projection.toJSON()), this.maxResolution !== s.maxResolution && (e.maxResolution = this.maxResolution), this.minResolution !== s.minResolution && (e.minResolution = this.minResolution), this.dontUseTerrainForOblique !== s.dontUseTerrainForOblique && (e.dontUseTerrainForOblique = this.dontUseTerrainForOblique), this.highlightStyle && (e.highlightStyle = this.highlightStyle.toJSON()), this.isDynamic !== s.isDynamic && (e.isDynamic = this.isDynamic); + const r = this.vectorProperties.getVcsMeta(); + return Object.keys(r).length > 0 && (e.vectorProperties = r), e; + } + destroy() { + this.source && this.source.clear(!0), this._onStyleChangeRemover && this._onStyleChangeRemover(), this.vectorProperties.destroy(), super.destroy(); + } +} +ke.registerClass(ct.className, ct); +const Bt = Symbol("vcsFeatureType"); +class wi { + constructor(t = 1 / 0, e = 1 / 0, s = 1 / 0, r = -1 / 0, n = -1 / 0, a = -1 / 0) { + h(this, "minX"); + h(this, "minY"); + h(this, "minZ"); + h(this, "maxX"); + h(this, "maxY"); + h(this, "maxZ"); + this.minX = t, this.minY = e, this.minZ = s, this.maxX = r, this.maxY = n, this.maxZ = a; + } + static fromArray(t) { + return S(t, [Number]), S(t.length, 6), new wi(t[0], t[1], t[2], t[3], t[4], t[5]); + } + static fromGeometry(t) { + const e = new wi(); + return e.extendWithGeometry(t), e; + } + /** + * @param heightInfo + */ + static fromHeightInfo(t) { + const e = new wi(); + return e.extendWithHeightInfo(t), e; + } + static fromCoordinates(t) { + S(t, [[Number]]); + const e = new wi(); + return t.forEach((s) => { + e.extendXYZ(s[0], s[1], s[2] ?? 0); + }), e; + } + extendWithGeometry(t) { + if (t) + if (t.getType() === "GeometryCollection") + t.getGeometriesArray().forEach((e) => { + this.extendWithGeometry(e); + }); + else if (t.getType() === "Circle") { + const e = t.getFlatCoordinates(), s = t.getStride(), r = e[s] - e[0]; + this.extendXY(e[0] - r, e[1] - r), this.extendXY(e[0] + r, e[1] + r), s > 2 && this.extendZ(e[2]); + } else { + const e = t.getFlatCoordinates(), s = t.getStride(); + this.extendFlatCoordinates(e, s); + } + } + extendWithHeightInfo(t) { + if (t.extruded) { + const e = t.groundLevelOrMinHeight + t.storeyHeightsAboveGround.reduce((r, n) => r + n, 0); + this.extendZ(e); + const s = t.groundLevelOrMinHeight - t.storeyHeightsBelowGround.reduce((r, n) => r + n, 0); + this.extendZ(s); + } + } + extendXYZ(t, e, s) { + this.minX = Math.min(this.minX, t), this.minY = Math.min(this.minY, e), this.minZ = Math.min(this.minZ, s), this.maxX = Math.max(this.maxX, t), this.maxY = Math.max(this.maxY, e), this.maxZ = Math.max(this.maxZ, s); + } + extendXY(t, e) { + this.minX = Math.min(this.minX, t), this.minY = Math.min(this.minY, e), this.maxX = Math.max(this.maxX, t), this.maxY = Math.max(this.maxY, e); + } + extendZ(t) { + this.minZ = Math.min(this.minZ, t), this.maxZ = Math.max(this.maxZ, t); + } + extendFlatCoordinates(t, e) { + const { length: s } = t; + for (let r = 0; r < s; r += e) + e > 2 ? this.extendXYZ(t[r], t[r + 1], t[r + 2]) : this.extendXY(t[r], t[r + 1]); + } + to2D() { + return [this.minX, this.minY, this.maxX, this.maxY]; + } + toArray() { + return [this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ]; + } + isEmpty() { + return this.minX === 1 / 0 && this.minY === 1 / 0 && this.minZ === 1 / 0 && this.maxX === -1 / 0 && this.maxY === -1 / 0 && this.maxZ === -1 / 0; + } + getCenter() { + if (this.isEmpty()) + return [0, 0, 0]; + const t = this.minZ + (this.maxZ - this.minZ) / 2; + return [ + this.minX + (this.maxX - this.minX) / 2, + this.minY + (this.maxY - this.minY) / 2, + Number.isFinite(t) ? t : 0 + ]; + } + getSize() { + return this.isEmpty() ? [0, 0, 0] : [ + this.maxX - this.minX, + this.maxY - this.minY, + this.maxZ - this.minZ + ]; + } + clone() { + return new wi(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + } +} +const rw = "EPSG:3857"; +let Po; +function jl() { + return Po || (Po = new zc()), Po; +} +function nw(i) { + const { crs: t } = i; + if (t) { + if (t.type === "name") + return t.properties.name; + if (t.type === "EPSG") + return `EPSG:${t.properties.code}`; + } + return null; +} +function aw(i) { + if (i.get("altitudeMode") && (i.set("olcs_altitudeMode", i.get("altitudeMode"), !0), i.unset("altitudeMode", !0)), i.get("extrudedHeight")) { + if (i.get("drawingType")) + i.set("olcs_extrudedHeight", i.get("extrudedHeight"), !0); + else { + const t = wi.fromGeometry(i.getGeometry()), e = Number.isFinite(t.minZ) ? t.minZ : 0; + i.set("olcs_extrudedHeight", i.get("extrudedHeight") - e, !0); + } + i.unset("extrudedHeight", !0); + } + i.get("skirt") && (i.set("olcs_skirt", i.get("skirt"), !0), i.unset("skirt", !0)), i.get("radius") && i.unset("radius", !0); +} +function ow(i, t) { + var s; + const e = jl().readGeometry(i, t.formatOptions); + return String((s = t.formatOptions) == null ? void 0 : s.featureProjection) === "EPSG:3857" && (e[hi] = !0), Uu(e), new ue({ geometry: e }); +} +function Od(i, t) { + return i.image && i.image.src && /^:\d+$/.test(i.image.src) && (t.embeddedIcons ? i.image.src = t.embeddedIcons[Number(i.image.src.substring(1))] : delete i.image.src), i; +} +function lw(i, t) { + const e = i.color ? We(i.color) : !1, s = k(i.width, 1.25), r = k(i.pointRadius, 5), n = k(i.opacity, 0.8); + if (delete i.color, delete i.width, delete i.pointRadius, delete i.opacity, t === "Polygon" || t === "Circle") { + const a = e ? e.slice() : [255, 255, 255, 0.4]; + return a[3] = n, { + fill: { color: a }, + stroke: { + color: e || We("#3399CC"), + width: s + } + }; + } + if (t === "LineString") + return { + stroke: { + color: e || We("#3399CC"), + width: s + } + }; + if (t === "Point") + return { + image: { + fill: { + color: [255, 255, 255, 0.4] + }, + radius: r, + stroke: { + color: e || We("#3399CC"), + width: 1 + } + } + }; +} +function lc(i, t) { + var a; + if (!i.geometry) + return null; + const e = i.geometry.olcs_radius; + let s = jl().readGeometry(i.geometry, t.formatOptions); + if (i.radius && s instanceof Ve) { + const o = s.getCoordinates(); + s = new bt(o, i.radius); + } + if (e && s instanceof Ve) { + const o = s.getCoordinates(); + s = $u(o, e); + } + String((a = t.formatOptions) == null ? void 0 : a.featureProjection) === "EPSG:3857" && (s[hi] = !0), i.vcsMeta = i.vcsMeta || {}; + const { properties: r } = i; + r && t.readLegacyStyleOptions && !i.vcsMeta.style && (i.vcsMeta.style = lw(r, s.getType())), Uu(s); + const n = new ue({ ...r, geometry: s }); + if (i.id && n.setId(i.id), i.state && (n[Bt] = i.state), i.vcsMeta.style && !t.dontReadStyle) { + i.vcsMeta.style = Od(i.vcsMeta.style, t); + let o; + t.defaultStyle ? (o = t.defaultStyle.clone().assign(new ge(i.vcsMeta.style)), o.label != null && s.set("_vcsGeomType", "Label")) : o = new ge(i.vcsMeta.style), n[yt] = o, n.setStyle(o.style); + } + return aw(n), n; +} +function Hi(i, t = {}) { + const e = typeof i == "string" ? JSON.parse(i) : i, s = nw(e), r = s ? { epsg: s } : t.dataProjection, n = { + formatOptions: { + dataProjection: r ? r.epsg : de.epsg, + featureProjection: t.targetProjection ? t.targetProjection.epsg : W.epsg + }, + dontReadStyle: t.dontReadStyle, + readLegacyStyleOptions: t.readLegacyStyleOptions, + defaultStyle: t.defaultStyle + }; + if (t.dynamicStyle && !n.defaultStyle && (n.defaultStyle = gs), e.type === "FeatureCollection") { + e.vcsMeta = e.vcsMeta || { + embeddedIcons: e.vcsEmbeddedIcons + }; + let a; + return e.vcsMeta.embeddedIcons && (n.embeddedIcons = e.vcsMeta.embeddedIcons), e.vcsMeta.style && t.dynamicStyle && (e.vcsMeta.style.type === tt.className ? a = new tt(e.vcsMeta.style) : (e.vcsMeta.style = Od(e.vcsMeta.style, n), n.defaultStyle = (n.defaultStyle ?? gs).clone().assign(new ge(e.vcsMeta.style)), a = n.defaultStyle)), { + features: e.features.map((o) => lc(o, n)).filter((o) => o), + style: e.vcsMeta.style ? a : void 0, + vcsMeta: e.vcsMeta ? e.vcsMeta : void 0 + }; + } else if (e.type === "Feature") { + const a = lc(e, n); + return { + features: a ? [a] : [], + vcsMeta: e.vcsMeta ? e.vcsMeta : void 0 + }; + } else if (e.type != null) + return { features: [ow(e, n)] }; + return { features: [] }; +} +function Xr(i, t = {}, e = []) { + let s = i.getGeometry(); + if (!s) + throw new Error("Cannot write geometry less feature to geojson"); + let r = null; + if (s instanceof bt) { + const l = s.getCoordinates(); + r = bc(z.mercatorToWgs84(l[0], !0), z.mercatorToWgs84(l[1], !0)), s = new Ve(s.getCenter()); + } else if (s instanceof ht) { + const l = s.getCoordinates(); + l.forEach((c) => { + sl(c); + }), s = new ht(l, s.getLayout()); + } else if (s instanceof ks) { + const l = s.getCoordinates(); + l.forEach((c) => { + c.forEach((d) => { + sl(d); + }); + }), s = new ks(l, s.getLayout()); + } + const n = jl().writeGeometryObject(s, { + featureProjection: rw, + rightHanded: !0 + }), a = i.getProperties(); + delete a[i.getGeometryName()], delete a.style, delete a.olcs_allowPicking; + const o = { + type: "Feature", + properties: a, + geometry: n + }; + return t.writeId && (o.id = i.getId()), r && (o.geometry.olcs_radius = r), o.vcsMeta = { + version: xi + }, t.writeStyle && i[yt] && (o.vcsMeta.style = Vu(i[yt].getOptionsForFeature(i), e)), o; +} +function q1(i, t) { + const e = i.vcsMeta || { version: xi }; + e.version = xi; + const r = { + type: "FeatureCollection", + features: i.features.map((a) => Xr(a, t, e.embeddedIcons)), + vcsMeta: e + }; + return t != null && t.asObject ? r : JSON.stringify(r, void 0, t != null && t.prettyPrint ? 2 : void 0); +} +const hw = Xe(); +function $l(i) { + i[Je] = hw; +} +class ol { + /** + * @param config + */ + constructor(t) { + h(this, "_uuid"); + h(this, "name"); + h(this, "description"); + h(this, "properties"); + h(this, "startingViewpointName"); + h(this, "startingMapName"); + h(this, "startingObliqueCollectionName"); + h(this, "projection"); + h(this, "_config"); + this._uuid = t._id || Xe(), this.name = t.name ?? this._uuid, this.description = t.description, this.properties = t.properties, this.startingViewpointName = t.startingViewpointName, this.startingMapName = t.startingMapName, this.startingObliqueCollectionName = t.startingObliqueCollectionName, this.projection = t.projection ? new z(t.projection) : t.projection, this._config = t; + } + get _id() { + return this._uuid; + } + get config() { + return JSON.parse(JSON.stringify(this._config)); + } + /** + * Sets the config object by serializing all runtime objects of the current app. + * @param app + */ + setConfigFromApp(t) { + this._config = { ...this.config, ...t.serializeModule(this._uuid) }; + } + toJSON() { + var e; + const t = {}; + return this._config._id && (t._id = this._config._id), t.name = this.name, this.properties && Object.keys(this.properties).length > 0 && (t.properties = JSON.parse(JSON.stringify(this.properties))), this.description !== void 0 && (t.description = this.description), this.startingViewpointName !== void 0 && (t.startingViewpointName = this.startingViewpointName), this.startingMapName !== void 0 && (t.startingMapName = this.startingMapName), this.startingObliqueCollectionName !== void 0 && (t.startingObliqueCollectionName = this.startingObliqueCollectionName), this.projection !== void 0 && (t.projection = ((e = this.projection) == null ? void 0 : e.toJSON()) ?? null), t; + } +} +function cw(i, t) { + if (t.style && i.setStyle(wa(t.style, i.defaultStyle)), t.highlightStyle) { + const e = wa(t.highlightStyle, i.highlightStyle); + i.setHighlightStyle(e); + } + t.vectorProperties && i.vectorProperties.setValues(t.vectorProperties), t.zIndex != null && (i.zIndex = t.zIndex); +} +function Lo(i, t, e, s) { + if (s == null ? t !== e : s !== t) + throw new Error(`Cannot merge options, values of ${i} do not match`); +} +class Bi extends Ut { + constructor(e) { + super(e); + h(this, "title"); + h(this, "_app", null); + h(this, "_featureProperty"); + h(this, "_classRegistryName"); + h(this, "_layerOptions"); + h(this, "_layer"); + h(this, "_keyProperty"); + /** + * Event raised if the collection is reset + */ + h(this, "_collectionChanged", new L()); + h(this, "_collectionListeners", []); + h(this, "_collection", _i(new Ui(), this._getDynamicModuleId.bind(this), this._serializeItem.bind(this), this._deserializeItem.bind(this))); + // eslint-disable-next-line class-methods-use-this + h(this, "_moduleRemovedListener", () => { + }); + const s = Bi.getDefaultConfig(); + this.title = e.title || this.name, this._featureProperty = e.featureProperty || s.featureProperty, this._classRegistryName = e.classRegistryName, this._layerOptions = e.layerOptions || s.layerOptions, this._layer = null, this._featureProperty && (this._layer = new ct(this._layerOptions), $l(this._layer)), this._keyProperty = e.keyProperty || s.keyProperty, this.setCollection(new Ui(this._keyProperty)); + } + static get className() { + return "Category"; + } + static getDefaultConfig() { + return { + title: "", + featureProperty: void 0, + classRegistryName: void 0, + layerOptions: {}, + keyProperty: "name" + }; + } + get classRegistryName() { + return this._classRegistryName; + } + get collection() { + return this._collection; + } + /** + * Event raised if the collection is reset + */ + get collectionChanged() { + return this._collectionChanged; + } + /** + * Returns the layer of this collection. Caution, do not use the layer API to add or remove items. + * When adding items to the collection, the features are added to the layer async (timeout of 0), since there is weird behavior + * when removing and adding a feature with the same id in the same sync call. + */ + get layer() { + return this._layer; + } + _itemAdded(e) { + if (this._featureProperty && this._layer) { + const s = e[this._keyProperty]; + this._layer.removeFeaturesById([s]); + const r = e[this._featureProperty]; + let n; + if (r instanceof Fe) + n = r; + else if (typeof r == "object") { + const { features: a } = Hi(r); + a[0] && (n = a[0]); + } + n && (n.setId(String(s)), setTimeout(() => { + var a; + (a = this._layer) == null || a.addFeatures([n]); + }, 0)); + } + } + _itemRemoved(e) { + this._featureProperty && this._layer && this._layer.removeFeaturesById([e[this._keyProperty]]); + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + _itemReplaced(e) { + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + _itemMoved(e) { + } + _getDynamicModuleId() { + if (!this._app) + throw new Error("Cannot get dynamic module id, before setting the vcApp"); + return this._app.dynamicModuleId; + } + /** + * Throws if typed, featureProperty and keyProperty do not match. Merges other options. + * Only merges: style, highlightStyle, zIndex & vectorProperties from layerOptions. + * @param options + */ + mergeOptions(e) { + const s = Bi.getDefaultConfig(); + Lo("classRegistryName", this._classRegistryName, s.classRegistryName, e.classRegistryName), Lo("featureProperty", this._featureProperty, s.featureProperty, e.featureProperty), Lo("keyProperty", this._keyProperty, s.keyProperty, e.keyProperty), this.title = e.title || this.title, e.layerOptions && this._layer && cw(this._layer, e.layerOptions); + } + /** + * When setting the category, it MUST use the same uniqueKey as the previous collection (default is "name"). + * All items in the current collection _will be destroyed_ and the current collection will be destroyed. The category will take + * complete ownership of the collection and destroy it once the category is destroyed. The collection will + * be turned into an {@link OverrideCollection} + * @param collection + */ + setCollection(e) { + if (S(e, jt), this._keyProperty !== e.uniqueKey) + throw new Error("The collections key property does not match the categories key property"); + this._collectionListeners.forEach((s) => { + s(); + }), this._collection && yi(this._collection), this._layer && this._layer.removeAllFeatures(), this._collection = e[Qo] ? e : _i(e, this._getDynamicModuleId.bind(this), this._serializeItem.bind(this), this._deserializeItem.bind(this)), [...this.collection].forEach((s) => { + this._itemAdded(s); + }), this._collectionListeners = [ + this._collection.added.addEventListener(this._itemAdded.bind(this)), + this._collection.removed.addEventListener(this._itemRemoved.bind(this)), + this._collection.replaced.addEventListener(this._itemReplaced.bind(this)) + ], this._collection.moved && this._collectionListeners.push(this._collection.moved.addEventListener(this._itemMoved.bind(this))), this.collectionChanged.raiseEvent(); + } + setApp(e) { + if (this._app) + throw new Error("Cannot switch apps"); + this._app = e, this._moduleRemovedListener = this._app.moduleRemoved.addEventListener((s) => { + this._collection.removeModule(s._id); + }), this._layer && this._app.layers.add(this._layer); + } + _deserializeItem(e) { + if (!this._app) + throw new Error("Cannot deserialize item before setting the vcApp"); + const s = this._classRegistryName ? this._app[this._classRegistryName] : null; + let r = null; + return s && s instanceof pi && (r = ei(s, e)), Promise.resolve(r ?? e); + } + _serializeItem(e) { + const s = JSON.parse(JSON.stringify(e)); + if (this._featureProperty && this._layer) { + const r = this._layer.getFeatureById(e[this._keyProperty]); + r && (s[this._featureProperty] = Xr(r)); + } + return s; + } + serializeModule(e) { + return this._collection.size === 0 ? null : { + name: this.name, + items: this.collection.serializeModule(e) + }; + } + toJSON() { + const e = super.toJSON(), s = Bi.getDefaultConfig(); + return this.title !== this.name && (e.title = this.title), this._featureProperty !== s.featureProperty && (e.featureProperty = this._featureProperty), this._classRegistryName !== s.classRegistryName && (e.classRegistryName = this._classRegistryName), Object.keys(this._layerOptions).length > 0 && (e.layerOptions = { ...this._layerOptions }), this._keyProperty !== s.keyProperty && (e.keyProperty = this._keyProperty), e; + } + destroy() { + super.destroy(), this._app && this._layer && this._app.layers.remove(this._layer), this._layer && this._layer.destroy(), this._collectionListeners.forEach((e) => { + e(); + }), this._collectionListeners.splice(0), this._moduleRemovedListener(), this._moduleRemovedListener = () => { + }, yi(this._collection), this._collectionChanged.destroy(), this._app = null; + } +} +Iu.registerClass(Bi.className, Bi); +function hc() { + return he("CategoryCollection"); +} +class uw extends Ui { + constructor(e) { + super(); + h(this, "_app"); + /** + * Map of category names, where the value is a map of moduleId and items. + */ + h(this, "_cache", /* @__PURE__ */ new Map()); + h(this, "_moduleRemovedListener"); + this._app = e, this._moduleRemovedListener = this._app.moduleRemoved.addEventListener((s) => { + this._cache.forEach((r, n) => { + r.delete(s._id), r.size === 0 && this._cache.delete(n); + }); + }); + } + /** + * Do not call add directly. Use request category for adding categories. + */ + add(e) { + if (this.hasKey(e.name)) + return null; + e.setApp(this._app); + const s = super.add(e); + return s != null && this._cache.has(e.name) && (this._cache.get(e.name).forEach((r, n) => { + this.parseCategoryItems(e.name, r, n); + }), this._cache.delete(e.name)), s; + } + /** + * Categories should be static. Removing them can lead to undefined behavior. + */ + remove(e) { + super.remove(e), this._cache.delete(e.name); + } + /** + * Parses the category items. Items will only be parsed, if a category with said name exists. Otherwise, + * they will be cached, until such a category is requested. + */ + async parseCategoryItems(e, s, r) { + const n = this.getByKey(e); + n ? await n.collection.parseItems(s, r) : this._cache.has(e) ? this._cache.get(e).set(r, s) : this._cache.set(e, /* @__PURE__ */ new Map([[r, s]])); + } + /** + * Add categories with this API. + */ + requestCategory(e) { + if (!e.name) + return hc().error("Cannot request a category without a name"), null; + e.type || (hc().warning(`Implicitly typing category ${e.name} as ${Bi.className}`), e.type = Bi.className); + let s; + if (this.hasKey(e.name)) + s = this.getByKey(e.name), s.mergeOptions(e); + else if (s = ei(this._app.categoryClassRegistry, e), s && this.add(s) == null) + return null; + if (!s) + throw new Error(`Category ${e.name} with type ${e.type} could not be created`); + return s; + } + destroy() { + super.destroy(), this._moduleRemovedListener(), this._cache.clear(); + } +} +const dw = Symbol("isProvidedFeature"); +class js extends Ut { + constructor(e, s) { + super(s); + /** + * The layer name of the associated layer + */ + h(this, "layerName"); + /** + * The style set on features created by this provider + */ + h(this, "style"); + /** + * Whether to show the geometry on selection. + */ + h(this, "showGeometry"); + /** + * The vector properties assigned to features created by this provider + */ + h(this, "vectorProperties"); + /** + * Map ClassNames Can be used to only apply this featureProvider to the specified maps + */ + h(this, "mapTypes"); + const r = js.getDefaultOptions(); + this.layerName = e, this.style = s.style ? wa(s.style, gs.clone()) : void 0, this.showGeometry = ce(s.showGeometry, r.showGeometry), this.vectorProperties = s.vectorProperties instanceof Gt ? s.vectorProperties : new Gt({ + ...r.vectorProperties, + ...s.vectorProperties + }), this.mapTypes = Array.isArray(s.mapTypes) ? s.mapTypes : r.mapTypes; + } + static get className() { + return "AbstractFeatureProvider"; + } + static getDefaultOptions() { + return { + vectorProperties: { + allowPicking: !1 + }, + showGeometry: !1, + mapTypes: [] + }; + } + /** + * checks if the featureProvider is supported for provided Map + */ + isSupported(e) { + return e && (this.mapTypes.length === 0 || this.mapTypes.includes(e.className)); + } + /** + * Ensures the feature has an ID, applies all vectorProperties and adds style and the vcsLayerName + * and isProvidedFeature symbols to the feature + */ + getProviderFeature(e) { + return e.getId() || e.setId(Xe()), this.style && e.setStyle(this.style.style), e[J] = this.layerName, e[dw] = !0, Object.entries(this.vectorProperties.getValues()).forEach(([s, r]) => { + const n = `olcs_${s}`; + e.get(n) === void 0 && r !== void 0 && e.set(n, r); + }), e; + } + /** + * This method must be overwritten by any implementations. Before returning the array of features, be sure to use the getProviderFeature + * on each feature to ensure all properties and symbols required by the VCM architecture + * to handle your feature is called: (e.g. return features.map(f => this.getProviderFeature(f)); + * @param coordinate - in mercator + * @param resolution - meters per pixel for the given location + * @param headers - headers optional request headers to be sent with the server request + */ + // eslint-disable-next-line no-unused-vars,class-methods-use-this + getFeaturesByCoordinate(e, s, r) { + return Promise.resolve([]); + } + /** + * Returns the object required to configure this feature provider. + */ + toJSON() { + const e = super.toJSON(), s = js.getDefaultOptions(); + delete e.name, this.showGeometry !== s.showGeometry && (e.showGeometry = this.showGeometry), this.style && (e.style = this.style.toJSON()); + const r = this.vectorProperties.getVcsMeta({ + ...Gt.getDefaultOptions(), + ...s.vectorProperties + }); + return Object.keys(r).length > 0 && (e.vectorProperties = r), e; + } + destroy() { + this.style = void 0, this.vectorProperties.destroy(), super.destroy(); + } +} +class ll extends js { + /** + * @param layerName + * @param options + */ + constructor(e, s) { + super(e, s); + h(this, "tileProvider"); + this.mapTypes = ["CesiumMap"], this.tileProvider = s.tileProvider; + } + static get className() { + return "TileProviderFeatureProvider"; + } + async getFeaturesByCoordinate(e, s, r) { + const n = await this.tileProvider.getFeaturesByCoordinate(e, s, r), a = (o) => this.style ? !!this.style.cesiumStyle.show.evaluate(o) : !0; + return n.filter((o) => this.vectorProperties.getAllowPicking(o) && a(o)); + } + destroy() { + this.tileProvider.destroy(), super.destroy(); + } +} +Ll.registerClass(ll.className, ll); +var it; +(function(i) { + i.GEOGRAPHIC = "geographic", i.MERCATOR = "mercator"; +})(it || (it = {})); +function bd(i) { + const t = {}; + return i.numberOfLevelZeroTilesX && i.numberOfLevelZeroTilesX > 1 && (t.numberOfLevelZeroTilesX = i.numberOfLevelZeroTilesX), i.numberOfLevelZeroTilesY && i.numberOfLevelZeroTilesY > 1 && (t.numberOfLevelZeroTilesY = i.numberOfLevelZeroTilesY), i.tilingSchema === it.MERCATOR ? new _l(t) : new Qc(t); +} +function fw(i, t, e, s = 0) { + if (!i.isValid()) + return s; + const r = i.getCoordinatesInProjection(de); + r[1] < -85 && (r[1] = -85), r[3] > 85 && (r[3] = 85); + const a = [ + gl(r), + Ac(r), + Dc(r), + ka(r) + ].map((l) => ee.fromDegrees(l[0], l[1])); + let o = s; + for (; o < e; ) { + const l = a.map((d) => t.positionToTileXY(d, o)), c = []; + if (c.push(Math.abs(l[0].x - l[1].x)), c.push(Math.abs(l[0].y - l[3].y)), c[0] > 1 || c[1] > 1) { + o -= 1; + break; + } + o += 1; + } + return o; +} +class Dt extends st { + /** + * @param options + */ + constructor(e) { + super({ url: "", ...e }); + h(this, "extent"); + /** + * The {@link TilingScheme} of this layer + * Changes require calling layer.redraw() to take effect. + */ + h(this, "tilingSchema"); + /** + * The maximum level to load. + * Changes require calling layer.redraw() to take effect. + */ + h(this, "maxLevel"); + h(this, "_minLevel"); + /** + * The minimum level to load. + * Changes require calling layer.redraw() to take effect. + */ + h(this, "minLevel"); + /** + * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`. + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "minRenderingLevel"); + /** + * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`. + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "maxRenderingLevel"); + h(this, "_opacity"); + h(this, "_splitDirection", we.NONE); + /** + * can be used to forward options to the cesium ImageryLayer + * @see https://cesium.com/learn/cesiumjs/ref-doc/ImageryLayer.html#.ConstructorOptions + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "imageryLayerOptions"); + /** + * raised if the split direction changes, is passed the split direction as its only argument + */ + h(this, "splitDirectionChanged", new L()); + const s = Dt.getDefaultOptions(); + this.extent = e.extent ? new be(e.extent) : new be(), this.tilingSchema = $a(e.tilingSchema, it, s.tilingSchema), this.maxLevel = ne(e.maxLevel, s.maxLevel), this._minLevel = ne(e.minLevel, s.minLevel); + const r = bd(e); + this.minLevel = fw(this.extent, r, this.maxLevel, this._minLevel), this.minRenderingLevel = ne(e.minRenderingLevel, s.minRenderingLevel), this.maxRenderingLevel = ne(e.maxRenderingLevel, s.maxRenderingLevel), this._opacity = ma(e.opacity, s.opacity, 0, 1), e.splitDirection && (this._splitDirection = e.splitDirection === "left" ? we.LEFT : we.RIGHT), this.imageryLayerOptions = structuredClone(e.imageryLayerOptions); + } + static get className() { + return "RasterLayer"; + } + static getDefaultOptions() { + return { + ...st.getDefaultOptions(), + minLevel: 0, + maxLevel: 18, + minRenderingLevel: void 0, + maxRenderingLevel: void 0, + tilingSchema: it.GEOGRAPHIC, + opacity: 1, + splitDirection: void 0, + imageryLayerOptions: void 0 + }; + } + /** + * The split directions of this layer + */ + get splitDirection() { + return this._splitDirection; + } + set splitDirection(e) { + e !== this._splitDirection && (this._splitDirection = e, this.getImplementations().forEach((s) => { + s.updateSplitDirection(e); + }), this.splitDirectionChanged.raiseEvent(this._splitDirection)); + } + /** + * The opacity between 0 (fully transparent) and 1 (fully opaque) + */ + get opacity() { + return this._opacity; + } + set opacity(e) { + const s = ma(e, this._opacity, 0, 1); + this._opacity !== s && (this._opacity = s, this.getImplementations().forEach((r) => { + r.updateOpacity(s); + })); + } + getImplementationOptions() { + var s; + const e = { + ...super.getImplementationOptions(), + minLevel: this.minLevel, + maxLevel: this.maxLevel, + minRenderingLevel: this.minRenderingLevel, + maxRenderingLevel: this.maxRenderingLevel, + tilingSchema: this.tilingSchema, + opacity: this.opacity, + splitDirection: this._splitDirection, + imageryLayerOptions: this.imageryLayerOptions + }; + return (s = this.extent) != null && s.isValid() && (e.extent = this.extent), e; + } + toJSON() { + var r; + const e = super.toJSON(), s = Dt.getDefaultOptions(); + return (r = this.extent) != null && r.equals(new be()) && delete e.extent, this._minLevel !== s.minLevel && (e.minLevel = this._minLevel), this.maxLevel !== s.maxLevel && (e.maxLevel = this.maxLevel), this.minRenderingLevel !== s.minRenderingLevel && (e.minRenderingLevel = this.minRenderingLevel), this.maxRenderingLevel !== s.maxRenderingLevel && (e.maxRenderingLevel = this.maxRenderingLevel), this.tilingSchema !== s.tilingSchema && (e.tilingSchema = this.tilingSchema), this.opacity !== s.opacity && (e.opacity = this.opacity), this._splitDirection !== we.NONE && (e.splitDirection = this._splitDirection === we.RIGHT ? "right" : "left"), this.imageryLayerOptions !== s.imageryLayerOptions && (e.imageryLayerOptions = structuredClone(this.imageryLayerOptions)), e; + } + destroy() { + this.splitDirectionChanged.destroy(), super.destroy(); + } +} +ke.registerClass(Dt.className, Dt); +function Pd(i, t) { + return i === "geographic" ? t === "1.3.0" ? "CRS:84" : "EPSG:4326" : "EPSG:3857"; +} +function Ld(i) { + const t = i.tilingSchema === "geographic" ? de : W, e = t.proj.getExtent(), s = zo(e), r = i.tilingSchema === it.GEOGRAPHIC ? s / (i.tileSize[0] * 2) : s / i.tileSize[0], n = i.maxLevel + 1, a = []; + for (let c = 0; c < n; ++c) + a.push(r / 2 ** c); + const o = { + origin: ka(e), + resolutions: a, + tileSize: i.tileSize, + minZoom: i.minLevel + }; + i.extent && i.extent.isValid() && (o.extent = i.extent.getCoordinatesInProjection(t)); + const l = { + url: i.url, + tileGrid: new Fc(o), + params: i.parameters, + projection: Pd(i.tilingSchema, i.version) + }; + return fi.contains(i.url) ? l.crossOrigin = "use-credentials" : gi(i.url) || (l.crossOrigin = "anonymous"), i.headers && (l.tileLoadFunction = Xa(i.headers)), new df(l); +} +function gw(i) { + const t = { + url: i.url, + params: i.parameters, + projection: Pd(i.tilingSchema, i.version) + }; + return fi.contains(i.url) ? t.crossOrigin = "use-credentials" : gi(i.url) || (t.crossOrigin = "anonymous"), i.headers && (t.imageLoadFunction = function(s, r) { + const n = s.getImage(), a = qt(r, i.headers); + Vl(r, a).then((o) => { + n.src = o, n.onload = () => { + URL.revokeObjectURL(o); + }; + }).catch(() => { + he("ImageWMSSource").error(`Could not load image: ${r}`); + }); + }), new ff(t); +} +const mw = { + GML: Vo, + GML2: Ho, + GML3: Vo +}, pw = [ + "application/geojson", + "application/json", + "application/vnd.geo+json", + "application/geo+json" +]; +function yw(i, t = {}) { + if (i === "text/xml") { + const e = t.gmlFormat ? new mw[t.gmlFormat]() : new Ho(); + return new Bo({ ...t, gmlFormat: e }); + } + return pw.includes(i) ? new zc(t) : i === "application/vnd.ogc.gml" ? new Ho(t) : i === "application/vnd.ogc.gml/3.1.1" || i === "text/xml; subtype=gml/3.1.1" ? new Vo(t) : null; +} +class ys extends js { + constructor(e, s) { + super(e, s); + h(this, "extent", null); + h(this, "_wmsSourceOptions"); + /** + * The WmsLayer Source used to generate getFeatureInfo urls + */ + h(this, "_wmsSource"); + /** + * The response type of the get feature info response, e.g. text/xml + */ + h(this, "featureInfoResponseType"); + h(this, "_formatOptions"); + /** + * The feature response format determined by the response type. Use formatOptions to configure the underlying ol.format.Feature + */ + h(this, "featureFormat"); + /** + * The feature response projection, if not present in the response format. + */ + h(this, "projection"); + const r = ys.getDefaultOptions(); + s.extent && (s.extent instanceof be ? this.extent = s.extent : this.extent = new be(s.extent)), this._wmsSourceOptions = { + url: s.url, + tilingSchema: s.tilingSchema || r.tilingSchema, + maxLevel: ne(s.maxLevel, r.maxLevel), + minLevel: ne(s.minLevel, r.minLevel), + tileSize: s.tileSize || r.tileSize, + parameters: s.parameters, + version: s.version || r.version + }, this._wmsSource = Ld(this._wmsSourceOptions), this.featureInfoResponseType = s.responseType || r.responseType, this._formatOptions = s.formatOptions || r.formatOptions, this.featureFormat = yw(this.featureInfoResponseType, s.formatOptions), this.projection = s.projection ? new z(s.projection) : void 0; + } + static get className() { + return "WMSFeatureProvider"; + } + static getDefaultOptions() { + return { + ...js.getDefaultOptions(), + responseType: "text/xml", + style: void 0, + formatOptions: void 0, + projection: void 0, + url: "", + tilingSchema: it.GEOGRAPHIC, + version: "1.1.1", + maxLevel: 0, + minLevel: 0, + tileSize: [256, 256], + parameters: {}, + extent: void 0 + }; + } + get wmsSource() { + if (!this._wmsSource) + throw new Error("Accessing destroyed WMSFeatureProvider"); + return this._wmsSource; + } + set wmsSource(e) { + this._wmsSource = e; + } + featureResponseCallback(e, s) { + let r; + try { + r = this.featureFormat.readFeatures(e, { + dataProjection: this.projection ? this.projection.proj : void 0, + featureProjection: W.proj + }); + } catch { + return this.getLogger().warning("Features could not be read, please verify the featureInfoResponseType with the capabilities from the server"), []; + } + return Array.isArray(r) ? (r.forEach((n) => { + n.getGeometry() || n.setGeometry(new Ve(s)); + }), r) : []; + } + async getFeaturesByCoordinate(e, s, r) { + const n = this.wmsSource.getProjection(); + let a = e; + n && (a = $e(W.proj, n)(e.slice(), void 0, void 0)); + const l = this.wmsSource.getFeatureInfoUrl(a, s / 111194.87428468118, n, { INFO_FORMAT: this.featureInfoResponseType }); + if (l) { + const c = qt(l, r); + let d; + try { + d = await (await vn(l, c)).text(); + } catch { + return this.getLogger().error(`Failed fetching WMS FeatureInfo ${l}`), []; + } + return this.featureResponseCallback(d, e).map((u) => this.getProviderFeature(u)); + } + return []; + } + toJSON() { + var r, n; + const e = super.toJSON(), s = ys.getDefaultOptions(); + return this.featureInfoResponseType !== s.responseType && (e.responseType = this.featureInfoResponseType), this._formatOptions !== s.formatOptions && (e.formatOptions = { ...this._formatOptions }), this.projection && (e.projection = this.projection.toJSON()), e.url = this._wmsSourceOptions.url, e.parameters = { ...this._wmsSourceOptions.parameters }, this._wmsSourceOptions.tilingSchema !== s.tilingSchema && (e.tilingSchema = this._wmsSourceOptions.tilingSchema), this._wmsSourceOptions.maxLevel !== s.maxLevel && (e.maxLevel = this._wmsSourceOptions.maxLevel), this._wmsSourceOptions.minLevel !== s.minLevel && (e.minLevel = this._wmsSourceOptions.minLevel), this._wmsSourceOptions.version !== s.version && (e.version = this._wmsSourceOptions.version), (this._wmsSourceOptions.tileSize[0] !== ((r = s == null ? void 0 : s.tileSize) == null ? void 0 : r[0]) || this._wmsSourceOptions.tileSize[1] !== ((n = s == null ? void 0 : s.tileSize) == null ? void 0 : n[1])) && (e.tileSize = this._wmsSourceOptions.tileSize.slice()), this.extent && (e.extent = this.extent.toJSON()), e; + } + destroy() { + this._wmsSource = void 0, this.featureFormat = null, this.projection = void 0, this._formatOptions = void 0, super.destroy(); + } +} +Ll.registerClass(ys.className, ys); +class ae { + /** + * @param [defaultActive=EventType.NONE] - A bitmask representing the default to listen to + * @param [defaultModificationKey=ModificationKeyType.NONE] - A bitmask representing the default keys to listen to + * @param [defaultPointerKey=PointerKeyType.LEFT] - A bitmask representing the pointer key to listen to + */ + constructor(t = P.NONE, e = F.NONE, s = Ne.LEFT) { + /** + * A unique identifier for this interaction + */ + h(this, "id"); + h(this, "_defaultActive"); + /** + * The current active bitmask for {@link EventType} + */ + h(this, "active"); + h(this, "_defaultModificationKey"); + /** + * The current active {@link ModificationKeyType} + */ + h(this, "modificationKey"); + h(this, "_defaultPointerKey"); + /** + * The currently active {@link PointerKeyType} + */ + h(this, "pointerKey"); + this.id = Xe(), this._defaultActive = t, this.active = this._defaultActive, this._defaultModificationKey = e, this.modificationKey = this._defaultModificationKey, this._defaultPointerKey = s, this.pointerKey = this._defaultPointerKey; + } + /** + * Main function, called when an event is raised for this interaction + */ + // eslint-disable-next-line class-methods-use-this + pipe(t) { + return Promise.resolve(t); + } + /** + * Called when the modifier keys have changed. + */ + // eslint-disable-next-line class-methods-use-this,no-unused-vars + modifierChanged(t) { + } + /** + * Sets the interaction active. + * Use boolean (true|false) to toggle default behavior. + * Pass it a bitmask of {@link EventType} + * to change the active state. + * Call without arguments to reset the default active, modification key and pointer Key behavior + */ + setActive(t) { + typeof t > "u" ? (this.active = this._defaultActive, this.modificationKey = this._defaultModificationKey, this.pointerKey = this._defaultPointerKey) : typeof t == "boolean" ? this.active = t ? this._defaultActive : P.NONE : this.active = t; + } + /** + * Sets the modification key to listen to or the default modification key if none is provided. + */ + setModification(t) { + t ? this.modificationKey = t : this.modificationKey = this._defaultModificationKey; + } + /** + * Sets the pointer key for this interaction or the default pointer if none is provided. + */ + setPointer(t) { + t ? this.pointerKey = t : this.pointerKey = this._defaultPointerKey; + } + /** + * destroys the implementation, removing any created resources + */ + // eslint-disable-next-line class-methods-use-this + destroy() { + } +} +class ql extends ae { + constructor() { + super(P.ALL, F.ALL, Ne.ALL); + h(this, "_scratchCartographic", new ee()); + h(this, "_scratchCartesian", new _()); + this.setActive(); + } + async pipe(e) { + return e.map.className === "CesiumMap" ? this._cesiumHandler(e) : e.map.className === "ObliqueMap" ? ql.obliqueHandler(e) : e; + } + _cesiumHandler(e) { + const r = e.map.getScene(); + if (!r || (e.ray = r.camera.getPickRay(e.windowPosition), !e.ray)) + return Promise.resolve(e); + const n = r.globe.pick(e.ray, r, this._scratchCartesian); + return n ? (this._scratchCartographic = ee.fromCartesian(n, r.globe.ellipsoid, this._scratchCartographic), e.position = z.wgs84ToMercator([ + b.toDegrees(this._scratchCartographic.longitude), + b.toDegrees(this._scratchCartographic.latitude), + this._scratchCartographic.height + ], !0)) : e.position = [0, 0, 0], e.positionOrPixel = e.position, Promise.resolve(e); + } + static obliqueHandler(e) { + const r = e.map.currentImage; + if (r) { + const n = e.type & (P.MOVE ^ P.DRAGEVENTS), a = e.position.slice(0, 2); + if (Number.isFinite(a[0]) && Number.isFinite(a[1])) + return Wr(r, a, { + dontUseTerrain: !!n, + dataProjection: W + }).then((o) => (e.obliqueParameters = { pixel: a, estimate: o.estimate }, e.position = o.coords, e)); + } + return e.stopPropagation = !0, Promise.resolve(e); + } +} +class Cs extends ae { + constructor(e) { + super(P.ALL, F.ALL, Ne.ALL); + /** + * The interactions to handle one after the other + */ + h(this, "chain"); + this.chain = e || [], this.setActive(); + } + /** + * Add an interaction to the chain. Optionally passing an index where to add the interaction to. + */ + addInteraction(e, s) { + s != null ? this.chain.splice(s, 0, e) : this.chain.push(e); + } + /** + * Removes an interaction from the chain, returning the index from which it was removed + */ + removeInteraction(e) { + const s = this.chain.findIndex((r) => r.id === e.id); + return s > -1 && this.chain.splice(s, 1), s; + } + async pipe(e) { + let s = e; + const r = this.chain.slice(), n = r.length; + for (let a = 0; a < n; a++) { + const o = r[a]; + if (o.active & e.type && o.modificationKey & e.key && o.pointerKey & e.pointer && (s = await o.pipe(s), s.stopPropagation)) + break; + } + return s; + } + modifierChanged(e) { + this.chain.filter((s) => s.active !== P.NONE).forEach((s) => { + s.modifierChanged(e); + }); + } + /** + * You cannot set the modification of an interaction chain, only of its containing interactions + */ + setModification() { + super.setModification(); + } + /** + * You cannot set the pointer of an interaction chain, only of its containing interactions + */ + setPointer() { + super.setPointer(); + } + destroy() { + this.chain.forEach((e) => { + e.destroy(); + }), this.chain = [], super.destroy(); + } +} +class _w extends ae { + constructor() { + super(P.ALL ^ P.MOVE, F.ALL, Ne.ALL); + /** + * event type for which to pick the position of the scene. this will create a second render. + */ + h(this, "pickPosition", P.CLICK); + /** + * whether to pick translucent depth or not, defaults to true + */ + h(this, "pickTranslucent", !0); + /** + * Pulls the picked position towards the camera position by this number + */ + h(this, "pullPickedPosition", 0); + /** + * The number of pixels to take into account for picking features + */ + h(this, "hitTolerance", 10); + h(this, "_draggingFeature", null); + this.setActive(); + } + async pipe(e) { + return e.type & P.DRAG && !(this.pickPosition & P.DRAG) ? (this._draggingFeature && (e.feature = this._draggingFeature), e) : (e.type & P.DRAGEND && (this._draggingFeature = null), e.map.className === "OpenlayersMap" ? await this._openlayersHandler(e) : e.map.className === "ObliqueMap" ? await this._obliqueHandler(e) : e.map.className === "CesiumMap" && await this._cesiumHandler(e), e.type & P.DRAGSTART && e.feature && (this._draggingFeature = e.feature), e.type & P.DRAG && this._draggingFeature && (e.feature = this._draggingFeature), e); + } + setActive(e) { + typeof e > "u" && (this.pickPosition = P.CLICK, this.pullPickedPosition = 0), super.setActive(e); + } + _openlayersHandler(e) { + let s = null, r = null; + return e.map.olMap.forEachFeatureAtPixel([e.windowPosition.x, e.windowPosition.y], (n, a) => (n && (n.get("olcs_allowPicking") == null || n.get("olcs_allowPicking") === !0) && (s = n, r = a), !0), { hitTolerance: this.hitTolerance }), s && r && (e.feature = s, e.feature.get("features") && (e.feature[J] = r[J]), e.exactPosition = !0), Promise.resolve(e); + } + _obliqueHandler(e) { + let s = null, r = null; + return e.map.olMap.forEachFeatureAtPixel([e.windowPosition.x, e.windowPosition.y], (n, a) => (n && (s = n[$r] || n), r = a, !0), { hitTolerance: this.hitTolerance }), s && r && (e.feature = s, e.feature.get("features") && (e.feature[J] = r[J]), e.exactPosition = !0), Promise.resolve(e); + } + _cesiumHandler(e) { + const r = e.map.getScene(); + if (!r) + return Promise.resolve(e); + const n = r.pick(e.windowPosition, this.hitTolerance, this.hitTolerance); + let a = new ee(), o = new _(), l = new _(); + const { pickTranslucentDepth: c } = r, d = () => o ? (this.pullPickedPosition && e.ray && (l = _.multiplyByScalar(e.ray.direction, this.pullPickedPosition, l), o = _.subtract(o, l, o)), a = ee.fromCartesian(o, r.globe.ellipsoid, a), e.position = z.wgs84ToMercator([ + b.toDegrees(a.longitude), + b.toDegrees(a.latitude), + a.height + ], !0), e.positionOrPixel = e.position, r.pickTranslucentDepth = c, Promise.resolve(e)) : (o = new _(), Promise.resolve(e)); + if (n) { + if (n.primitive && n.primitive.olFeature) + e.feature = n.primitive.olFeature; + else if (n.primitive && n.primitive[J] && (n instanceof Xi || n instanceof Zi)) { + e.feature = n; + const u = Object.getOwnPropertySymbols(n.primitive), f = u.length; + for (let g = 0; g < f; g++) + e.feature[u[g]] = n.primitive[u[g]]; + } else n.id && n.id.olFeature ? e.feature = n.id.olFeature : n.id && n.id[J] && n.id instanceof Ji && (e.feature = n.id); + if (!(e.type & this.pickPosition)) + return Promise.resolve(e); + if (r.pickPositionSupported) + return n.primitive && this.pickTranslucent && (r.pickTranslucentDepth = !0, e.exactPosition = !0), o = r.pickPosition(e.windowPosition, o), d(); + } + return Promise.resolve(e); + } +} +class vw extends ae { + constructor() { + super(P.CLICK, F.ALL, Ne.ALL), this.setActive(); + } + // eslint-disable-next-line class-methods-use-this + async pipe(t) { + if (!t.feature) { + const e = [...t.map.layerCollection].filter((s) => s.featureProvider && s.active && s.isSupported(t.map) && s.featureProvider.isSupported(t.map)).reverse(); + if (e.length > 0) { + const s = t.map.getCurrentResolution(t.position), r = (await Promise.all(e.map((n) => { + var a, o; + return (o = (a = n.featureProvider) == null ? void 0 : a.getFeaturesByCoordinate) == null ? void 0 : o.call(a, t.position, s, n.headers); + }))).flat(); + r.length > 0 && (t.feature = r[0]); + } + } + return t; + } +} +function Sw() { + return he("EventHandler"); +} +class ww { + constructor() { + h(this, "_positionInteraction"); + h(this, "_featureInteraction"); + h(this, "_featureProviderInteraction"); + h(this, "_interactionChain"); + h(this, "clickDuration"); + h(this, "dragDuration"); + h(this, "_lastDown"); + h(this, "_lastClick"); + h(this, "_lastKeyEventModifiers"); + h(this, "_lastDispatchedModifier"); + h(this, "_dragging"); + h(this, "_running"); + h(this, "_eventQueue"); + h(this, "_exclusiveInteraction"); + h(this, "_multiples"); + h(this, "exclusiveRemoved"); + h(this, "exclusiveAdded"); + h(this, "_boundKeyListener"); + h(this, "_modifierChanged"); + this._positionInteraction = new ql(), this._featureInteraction = new _w(), this._featureProviderInteraction = new vw(), this._interactionChain = new Cs([ + this._positionInteraction, + this._featureInteraction, + this._featureProviderInteraction + ]), this.clickDuration = 400, this.dragDuration = 100, this._lastDown = null, this._lastClick = { + time: null, + windowPosition: new H() + }, this._lastKeyEventModifiers = /* @__PURE__ */ new Map(), this._lastKeyEventModifiers.set(F.SHIFT, !1), this._lastKeyEventModifiers.set(F.ALT, !1), this._lastKeyEventModifiers.set(F.CTRL, !1), this._lastDispatchedModifier = F.NONE, this._dragging = null, this._running = !1, this._eventQueue = [], this._exclusiveInteraction = null, this._multiples = !1, this.exclusiveRemoved = new L(), this.exclusiveAdded = new L(), this._boundKeyListener = this._keyListener.bind(this), window.addEventListener("keydown", this._boundKeyListener), window.addEventListener("keyup", this._boundKeyListener), this._modifierChanged = new L(); + } + get positionInteraction() { + return this._positionInteraction; + } + get featureInteraction() { + return this._featureInteraction; + } + get featureProviderInteraction() { + return this._featureProviderInteraction; + } + /** + * A copy of all the EventHandler interactions + */ + get interactions() { + return this._interactionChain.chain.slice(); + } + /** + * An event called, when the modifier changes. Order of precedence, if more then one key is pressed: SHIFT, ALT, CTRL + */ + get modifierChanged() { + return this._modifierChanged; + } + /** + * if an exclusive Interaction is set, this will return the id of the exclusive Interaction + * This can be used to add another Interaction to the same Id + */ + get exclusiveInteractionId() { + var t; + return (t = this._exclusiveInteraction) == null ? void 0 : t.id; + } + /** + * Add a dynamic interaction to the interaction chain. This is the default methodology for + * user map interactions, such as drawing or measuring. If another exclusive interaction is added, + * this interaction is removed and a provided callback is called. Use the id parameter to add multiple interactions + * from the same source (if you don't wish to provide an {@link InteractionChain}) + * @param interaction + * @param removed - the callback for when the interaction is forcefully removed. + * @param index - the position at which to push the interaction. If no index is provided, the interaction is pushed at the end and therefore is executed last. + * @param id - an id to allow for multiple interactions to belong to the same exclusive registerer + * @returns function to remove the interaction with. returns number of removed interactions (0|1) + */ + addExclusiveInteraction(t, e, s, r) { + return S(t, ae), S(e, Function), S(s, ie(Number)), S(r, ie(String)), this._exclusiveInteraction && this._exclusiveInteraction.id !== r && this.removeExclusive(), this._interactionChain.addInteraction(t, s), this._exclusiveInteraction ? (this._exclusiveInteraction.interactions.push(t), this._exclusiveInteraction.cb.push(e)) : this._exclusiveInteraction = { + id: r || Xe(), + cb: [e], + interactions: [t] + }, this.exclusiveAdded.raiseEvent(), this._exclusiveUnListen.bind(this, t, this._exclusiveInteraction.id); + } + /** + * Removes any exclusive listeners. Typically only called from the framework to ensure the pubsub listeners are consistent + */ + removeExclusive() { + this._exclusiveInteraction && (this._exclusiveInteraction.interactions.filter((t) => t).forEach((t) => { + this._interactionChain.removeInteraction(t); + }), this._exclusiveInteraction.cb.filter((t) => t).forEach((t) => { + t(); + }), this._exclusiveInteraction = null, this.exclusiveRemoved.raiseEvent()); + } + /** + * Removes an exclusive interaction by its id + */ + _exclusiveUnListen(t, e) { + if (!this._exclusiveInteraction || this._exclusiveInteraction && this._exclusiveInteraction.id !== e) + return 0; + const s = this._interactionChain.removeInteraction(t), r = this._exclusiveInteraction.interactions.findIndex((n) => n && n.id === t.id); + return r > -1 && (this._exclusiveInteraction.interactions.splice(r, 1, void 0), this._exclusiveInteraction.cb.splice(r, 1, void 0)), this._exclusiveInteraction.interactions.every((n) => n === void 0) && (this._exclusiveInteraction = null), s > -1 && this.exclusiveRemoved.raiseEvent(), s !== -1 ? 1 : 0; + } + /** + * Adds an interaction permanently to the interaction chain. Only add non-interferring + * interactions in such a fashion (for instance for displaying the cursor position) + * @param interaction + * @param [index=3] - at what position this interaction should be added. By default, it is added after the featureProviderInteraction + * @returns function to remove the interaction with. returns number of removed interactions (0|1) + */ + addPersistentInteraction(t, e = 3) { + return S(t, ae), S(e, Number), this._interactionChain.addInteraction(t, e), () => this._interactionChain.removeInteraction(t) !== -1 ? 1 : 0; + } + /** + * Handles an event triggered by + */ + handleMapEvent(t) { + t.pointerEvent === at.MOVE ? this._mouseMove(t) : t.pointerEvent === at.DOWN ? this._mouseDown(t) : t.pointerEvent === at.UP && this._mouseUp(t); + } + _mouseDown(t) { + if (this._lastDown) { + this._multiples = !0; + return; + } + t.windowPosition.x === 0 && t.windowPosition.y === 0 || (this._lastDown = t, this._lastDown.time = Date.now()); + } + _mouseUp(t) { + if (t.multipleTouch) { + this._multiples = !0, this._lastDown = null; + return; + } + if (this._multiples) { + this._lastDown = null, this._multiples = !1; + return; + } + const e = { + ...t, + chainEnded: new L() + }; + this._dragging ? (e.type = P.DRAGEND, e.key = this._dragging.key, e.pointer = this._dragging.pointer, this._startChain(e)) : this._lastDown && (this._lastClick.time && Date.now() - this._lastClick.time < this.clickDuration && H.distanceSquared(this._lastClick.windowPosition, e.windowPosition) < 12 ? (this._lastClick.time = null, e.type = P.DBLCLICK) : (this._lastClick.time = Date.now(), H.clone(e.windowPosition, this._lastClick.windowPosition), e.type = P.CLICK), this._startChain(e)), this._dragging = null, this._lastDown = null; + } + _mouseMove(t) { + let e = { + ...t, + chainEnded: new L() + }; + this._lastDown ? this._dragging ? (e.type = P.DRAG, e.key = this._dragging.key, e.pointer = this._dragging.pointer, this._startChain(e, !0)) : !this._dragging && Date.now() - this._lastDown.time > this.dragDuration && (e = { + type: P.DRAGSTART, + ...this._lastDown, + chainEnded: new L() + }, this._dragging = e, this._startChain(e, !0)) : (e.type = P.MOVE, this._startChain(e, !0)); + } + _keyListener(t) { + if ((t.key === "Shift" || t.key === "Alt") && (t.preventDefault(), t.stopPropagation()), this._lastKeyEventModifiers.get(F.SHIFT) !== t.shiftKey || this._lastKeyEventModifiers.get(F.ALT) !== t.altKey || this._lastKeyEventModifiers.get(F.CTRL) !== t.ctrlKey) { + this._lastKeyEventModifiers.set(F.SHIFT, t.shiftKey), this._lastKeyEventModifiers.set(F.ALT, t.altKey), this._lastKeyEventModifiers.set(F.CTRL, t.ctrlKey); + const e = [...this._lastKeyEventModifiers.keys()].find((s) => this._lastKeyEventModifiers.get(s)) || F.NONE; + e !== this._lastDispatchedModifier && (this._interactionChain.modifierChanged(e), this._lastDispatchedModifier = e, this._modifierChanged.raiseEvent(e)); + } + } + /** + * @param event + * @param discardOnRunning if true the event will discarded if an eventHandler is already Running + */ + _startChain(t, e) { + this._running && e || (this._running ? this._eventQueue.push(t) : (this._running = !0, this._interactionChain.pipe(t).catch((s) => { + Sw().error(s.message); + }).finally(() => { + var r, n; + (r = t.chainEnded) == null || r.raiseEvent(), (n = t.chainEnded) == null || n.destroy(), this._running = !1; + const s = this._eventQueue.shift(); + s && this._startChain(s); + }))); + } + /** + * Destroys the event handler and its interaction chain. + */ + destroy() { + this.removeExclusive(), this.exclusiveAdded.destroy(), this.exclusiveRemoved.destroy(), this._interactionChain.destroy(), this._positionInteraction.destroy(), this._featureInteraction.destroy(), this._eventQueue = [], window.removeEventListener("keydown", this._boundKeyListener), window.removeEventListener("keyup", this._boundKeyListener); + } +} +const Gi = Symbol("cesiumTilesetLastUpdated"), kn = Symbol("updateFeatureOverride"); +function Id(i) { + if (!i) + return zs(); + const { rectangle: t } = i.root.boundingVolume; + if (t) { + const o = Et.southwest(t), l = Et.northeast(t), c = z.wgs84ToMercator([ + b.toDegrees(o.longitude), + b.toDegrees(o.latitude) + ]), d = z.wgs84ToMercator([ + b.toDegrees(l.longitude), + b.toDegrees(l.latitude) + ]); + return [c[0], c[1], d[0], d[1]]; + } + const { center: e, radius: s } = i.boundingSphere, r = ee.fromCartesian(e), n = z.wgs84ToMercator([ + b.toDegrees(r.longitude), + b.toDegrees(r.latitude), + r.height + ]); + return $u(n, s).getExtent(); +} +class ns extends es { + constructor(e, s) { + super(e, s); + h(this, "cesium3DTileset"); + h(this, "tilesetOptions"); + h(this, "splitDirection"); + h(this, "style"); + h(this, "featureVisibility"); + h(this, "globalHider"); + h(this, "tilesetProperties"); + h(this, "modelMatrix"); + h(this, "offset"); + h(this, "_initializedPromise", null); + h(this, "_originalOrigin", null); + h(this, "_styleLastUpdated", Date.now()); + h(this, "_onStyleChangeRemover", null); + h(this, "_customShader"); + this.cesium3DTileset = null, this.tilesetOptions = s.tilesetOptions, this.splitDirection = s.splitDirection, this.style = s.style, this.featureVisibility = s.featureVisibility, this.globalHider = s.globalHider, this.tilesetProperties = s.tilesetProperties, this.modelMatrix = s.modelMatrix, this.offset = s.offset, this._customShader = s.customShader; + } + static get className() { + return "CesiumTilesetCesiumImpl"; + } + get customShader() { + return this._customShader; + } + async initialize() { + if (!this._initializedPromise) { + this._initializedPromise = na.fromUrl(Ii(this.url, this.headers), { + ...this.tilesetOptions, + show: !1 + // show is handled by activate + }); + try { + this.cesium3DTileset = await this._initializedPromise; + } catch (e) { + if (this.url && !/\.json$/.test(this.url)) + this.url = `${this.url.replace(/\/$/, "")}/tileset.json`, this._initializedPromise = na.fromUrl(Ii(this.url, this.headers), { + ...this.tilesetOptions, + show: !1 + // show is handled by activate + }), this.cesium3DTileset = await this._initializedPromise; + else + throw e; + } + if (this.cesium3DTileset.customShader = this._customShader, this.isDestroyed) { + this.cesium3DTileset.destroy(); + return; + } + this.tilesetProperties && this.tilesetProperties.forEach(({ key: e, value: s }) => { + this.cesium3DTileset[e] = s; + }), this.cesium3DTileset[J] = this.name, this.cesium3DTileset.tileVisible.addEventListener(this.applyStyle.bind(this)), this.cesium3DTileset.tileUnload.addEventListener((e) => { + delete e[Gi], delete e.content[Gi], delete e.content[kn]; + }), this._originalOrigin = _.clone(this.cesium3DTileset.boundingSphere.center), this.modelMatrix ? this.cesium3DTileset.modelMatrix = this.modelMatrix : this.offset && this._calculateOffset(), this.map.addPrimitiveCollection(this.cesium3DTileset), await super.initialize(), this.splitDirection && (this.cesium3DTileset.splitDirection = this.splitDirection), this.updateStyle(this.style); + } + await this._initializedPromise; + } + _calculateOffset() { + if (this.cesium3DTileset && !this.modelMatrix && this._originalOrigin) + if (!this.offset) + this.cesium3DTileset.modelMatrix = G.IDENTITY; + else { + const e = ee.fromCartesian(this._originalOrigin); + e.longitude += b.toRadians(this.offset[0]), e.latitude += b.toRadians(this.offset[1]), e.height += this.offset[2]; + const s = ee.toCartesian(e), r = _.subtract(s, this._originalOrigin, s); + this.cesium3DTileset.modelMatrix = G.fromTranslation(r); + } + } + updateModelMatrix(e) { + this.modelMatrix = e, this.cesium3DTileset && (this.modelMatrix ? this.cesium3DTileset.modelMatrix = this.modelMatrix : this.offset ? this._calculateOffset() : this.cesium3DTileset.modelMatrix = G.IDENTITY); + } + updateOffset(e) { + this.offset = e, this._calculateOffset(); + } + updateCustomShader(e) { + this._customShader = e, this.cesium3DTileset && (this.cesium3DTileset.customShader = this._customShader); + } + async activate() { + await super.activate(), this.active && this.cesium3DTileset && (this.cesium3DTileset.show = !0); + } + deactivate() { + super.deactivate(), this.cesium3DTileset && (this.cesium3DTileset.show = !1); + } + updateStyle(e, s) { + this.style = e, this.initialized && this.cesium3DTileset && (this.cesium3DTileset.style = this.style.cesiumStyle, this._onStyleChangeRemover && this._onStyleChangeRemover(), this._onStyleChangeRemover = this.style.styleChanged.addEventListener(() => { + var r; + (r = this.cesium3DTileset) == null || r.makeStyleDirty(), this._styleLastUpdated = Date.now(); + }), this._styleLastUpdated = Date.now(), this.cesium3DTileset.colorBlendMode !== this.style.colorBlendMode && (this.style.colorBlendMode !== jn.HIGHLIGHT ? this.cesium3DTileset.extras && // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,no-underscore-dangle + this.cesium3DTileset.extras._3DTILESDIFFUSE && (this.cesium3DTileset.colorBlendMode = this.style.colorBlendMode) : this.cesium3DTileset.colorBlendMode = this.style.colorBlendMode)); + } + updateSplitDirection(e) { + this.splitDirection = e, this.cesium3DTileset && (this.cesium3DTileset.splitDirection = e); + } + applyStyle(e) { + if (e.contentReady) + if (e.content instanceof ug) + for (let s = 0; s < e.content.innerContents.length; s++) + this.styleContent(e.content.innerContents[s]); + else + this.styleContent(e.content); + } + styleContent(e) { + var s, r, n, a, o; + if (!e[Gi] || e[Gi] < this.featureVisibility.lastUpdated || e[Gi] < (((s = this.globalHider) == null ? void 0 : s.lastUpdated) ?? 0) || e[Gi] < this._styleLastUpdated) { + delete e[kn]; + const l = e.featuresLength, c = { + hideLocal: [], + hideGlobal: [], + highlight: [] + }; + for (let d = 0; d < l; d++) { + const u = e.getFeature(d); + if (u) { + let f = u.getProperty("id"); + f || (f = `${e.url}${d}`); + let g = !0; + this.featureVisibility.highlightedObjects[f] && !this.featureVisibility.hasHighlightFeature(f, u) && (this.featureVisibility.addHighlightFeature(f, u), c.highlight.push([f, u]), g = !1), this.featureVisibility.hiddenObjects[f] && !this.featureVisibility.hasHiddenFeature(f, u) && (this.featureVisibility.addHiddenFeature(f, u), c.hideLocal.push([f, u])), (r = this.globalHider) != null && r.hiddenObjects[f] && !((n = this.globalHider) != null && n.hasFeature(f, u)) && ((a = this.globalHider) == null || a.addFeature(f, u), c.hideGlobal.push([f, u])), g && this._styleLastUpdated > (e[Gi] ?? 0) && u[Mi] && Al(u); + } + } + (c.hideLocal.length > 0 || c.hideGlobal.length > 0 || c.highlight.length > 0) && (e[kn] = () => { + c.hideGlobal.forEach(([d, u]) => { + var f; + (f = this.globalHider) != null && f.hasFeature(d, u) && Vr(u); + }), c.hideLocal.forEach(([d, u]) => { + this.featureVisibility.hasHiddenFeature(d, u) && Vr(u); + }), c.highlight.forEach(([d, u]) => { + this.featureVisibility.hasHighlightFeature(d, u) && jr(u); + }); + }), e[Gi] = Date.now(); + } else + (o = e[kn]) == null || o.call(e); + } + destroy() { + if (this.cesium3DTileset) { + if (this.map.initialized) { + const e = this.cesium3DTileset; + this.map.removePrimitiveCollection(e); + } else + this.cesium3DTileset.destroy(); + this.cesium3DTileset = null; + } + this._onStyleChangeRemover && this._onStyleChangeRemover(), super.destroy(); + } +} +class U1 { + constructor(t, e) { + h(this, "entities"); + h(this, "splitDirection"); + h(this, "_splitDirectionProperty"); + h(this, "_featureItems", /* @__PURE__ */ new Map()); + h(this, "_convertingFeatures", /* @__PURE__ */ new Map()); + this.entities = t.entities, this.splitDirection = e, this._splitDirectionProperty = new eu(e); + } + _addConvertedItems(t, e, s) { + const r = s.map((n) => { + let a, o; + return n.type === "billboard" ? a = this.entities.add({ + billboard: { + ...n.item, + splitDirection: this._splitDirectionProperty + }, + position: n.item.position + }) : n.type === "label" && (a = this.entities.add({ + label: n.item, + position: n.item.position + })), a && (o = () => { + this.entities.remove(a); + }), a && e && yd(t, a), o; + }).filter((n) => n != null); + this._featureItems.set(t, r); + } + async addFeature(t, e, s, r) { + var o, l; + (o = this._convertingFeatures.get(t)) == null || o(); + let n = !1; + this._convertingFeatures.set(t, () => { + n = !0; + }); + const a = await pd(t, e, s, r); + (l = this._featureItems.get(t)) == null || l.forEach((c) => c()), n ? a.forEach((c) => { + c.type === "primitive" && c.item.destroy(); + }) : this._addConvertedItems(t, s.getAllowPicking(t), a); + } + removeFeature(t) { + var e, s; + (e = this._convertingFeatures.get(t)) == null || e(), this._convertingFeatures.delete(t), (s = this._featureItems.get(t)) == null || s.forEach((r) => r()), this._featureItems.delete(t); + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + updateSplitDirection(t) { + this.splitDirection = t, this._splitDirectionProperty.setValue(this.splitDirection); + } + clear() { + this.entities.removeAll(), this._featureItems.clear(), this._convertingFeatures.forEach((t) => { + t(); + }), this._convertingFeatures.clear(); + } + destroy() { + this.clear(); + } +} +function Cw(i, t) { + return i.values.forEach((e) => { + t.add(e); + }), i.collectionChanged.addEventListener((e, s, r) => { + s.forEach((n) => { + t.add(n); + }), r.forEach((n) => { + t.remove(n); + }); + }); +} +class Mw extends es { + constructor(e, s) { + super(e, s); + h(this, "dataSource"); + h(this, "entities"); + h(this, "clock"); + // eslint-disable-next-line class-methods-use-this + h(this, "_collectionListener", () => { + }); + this.dataSource = new Jc(this.name), this.dataSource[J] = this.name, this.entities = s.entities, this.clock = s.clock; + } + static get className() { + return "DataSourceCesiumImpl"; + } + async initialize() { + this.initialized || (this._collectionListener = Cw(this.entities, this.dataSource.entities), await this.map.addDataSource(this.dataSource)), await super.initialize(); + } + async activate() { + await super.activate(), this.active && (this.dataSource.show = !0), this.clock && this.map.setDataSourceDisplayClock(this.clock); + } + deactivate() { + super.deactivate(), this.dataSource.show = !1, this.clock && this.map.unsetDataSourceDisplayClock(this.clock); + } + flyToEntity(e) { + if (this.active) { + const s = this.dataSource.entities.getById(e); + if (!s) { + this.getLogger().warning("could not find entity on this layer"); + return; + } + const r = this.map.getDataSourceDisplay(), n = this.map.getScene(), { camera: a } = n, o = new Kc(), l = this.map.getViewpointSync(), { heading: c, pitch: d } = l, u = new dg(b.toRadians(c), b.toRadians(d < -45 ? d : -45), void 0); + let f, g = 0; + const m = () => { + const y = r.getBoundingSphere(s, !0, o); + if (y !== oh.PENDING) { + if (y === oh.FAILED) { + g += 1, g > 3 && f(); + return; + } + a.flyToBoundingSphere(o, { + duration: 1, + offset: u + }), f(); + } + }, p = r.defaultDataSource; + if (p.isLoading) { + const y = p.loadingEvent.addEventListener(() => { + f = n.postRender.addEventListener(m), y(); + }); + } else + f = n.postRender.addEventListener(m); + } + } + destroy() { + this.map.initialized && !this.isDestroyed && this.map.removeDataSource(this.dataSource), this._collectionListener(), this.dataSource.entities.removeAll(), this.clock && this.map.unsetDataSourceDisplayClock(this.clock), super.destroy(); + } +} +class er extends es { + constructor(e, s) { + super(e, s); + h(this, "cesiumLayer", null); + h(this, "splitDirection"); + h(this, "minLevel"); + h(this, "maxLevel"); + h(this, "minRenderingLevel"); + h(this, "maxRenderingLevel"); + h(this, "extent"); + h(this, "opacity"); + h(this, "tilingSchema"); + h(this, "imageryLayerOptions"); + this.splitDirection = s.splitDirection, this.minLevel = s.minLevel, this.maxLevel = s.maxLevel, this.minRenderingLevel = s.minRenderingLevel, this.maxRenderingLevel = s.maxRenderingLevel, this.extent = s.extent, this.opacity = s.opacity, this.tilingSchema = s.tilingSchema, this.imageryLayerOptions = s.imageryLayerOptions; + } + static get className() { + return "RasterLayerCesiumImpl"; + } + async initialize() { + if (!this.initialized) { + if (this.cesiumLayer = await this.getCesiumLayer(), this.isDestroyed) + return this.cesiumLayer.destroy(), Promise.resolve(); + this.cesiumLayer[J] = this.name, this.cesiumLayer.show = !1, this.map.addImageryLayer(this.cesiumLayer); + } + return super.initialize(); + } + updateSplitDirection(e) { + this.splitDirection = e, this.initialized && this.cesiumLayer && (this.cesiumLayer.splitDirection = e); + } + getCesiumLayerOptions() { + return { + ...this.imageryLayerOptions, + alpha: this.opacity, + splitDirection: this.splitDirection, + minimumTerrainLevel: this.minRenderingLevel, + maximumTerrainLevel: this.maxRenderingLevel + }; + } + // eslint-disable-next-line class-methods-use-this + getCesiumLayer() { + throw new Error("implementation error"); + } + async activate() { + await super.activate(), this.active && this.cesiumLayer && (this.cesiumLayer.show = !0); + } + deactivate() { + super.deactivate(), this.cesiumLayer && (this.cesiumLayer.show = !1); + } + updateOpacity(e) { + this.opacity = e, this.initialized && this.cesiumLayer && (this.cesiumLayer.alpha = e); + } + destroy() { + this.cesiumLayer && this.map.removeImageryLayer(this.cesiumLayer), this.cesiumLayer = null, super.destroy(); + } +} +class xw extends er { + static get className() { + return "OpenStreetMapCesiumImpl"; + } + getCesiumLayer() { + const t = this.getCesiumLayerOptions(); + return Promise.resolve(new vs(new fg({ maximumLevel: this.maxLevel }), t)); + } +} +class Ew extends er { + constructor(e, s) { + super(e, s); + h(this, "credit"); + this.credit = s.credit; + } + static get className() { + return "SingleImageCesiumImpl"; + } + async getCesiumLayer() { + var a; + const e = { + credit: this.credit + }, s = (a = this.extent) == null ? void 0 : a.getCoordinatesInProjection(de); + s && (e.rectangle = Et.fromDegrees(s[0], s[1], s[2], s[3])); + const r = await gg.fromUrl(Ii(this.url, this.headers), e), n = this.getCesiumLayerOptions(); + return n.rectangle = e.rectangle, new vs(r, n); + } +} +class Ow extends es { + constructor(e, s) { + super(e, s); + h(this, "requestVertexNormals"); + h(this, "requestWaterMask"); + h(this, "terrainProvider"); + this.requestVertexNormals = s.requestVertexNormals, this.requestWaterMask = s.requestWaterMask; + } + static get className() { + return "TerrainCesiumImpl"; + } + async initialize() { + return this.initialized || (this.terrainProvider = await Ur(this.url, { + requestVertexNormals: this.requestVertexNormals, + requestWaterMask: this.requestWaterMask + }, this.headers), this.terrainProvider[J] = this.name), super.initialize(); + } + async activate() { + await super.activate(), this.active && this.terrainProvider && this.map.setTerrainProvider(this.terrainProvider); + } + deactivate() { + super.deactivate(), this.terrainProvider && this.map.unsetTerrainProvider(this.terrainProvider); + } + destroy() { + this.terrainProvider && this.map.unsetTerrainProvider(this.terrainProvider), this.terrainProvider = void 0, super.destroy(); + } +} +class bw extends er { + constructor(e, s) { + super(e, s); + h(this, "format"); + this.format = s.format; + } + static get className() { + return "TmsCesiumImpl"; + } + async getCesiumLayer() { + const e = { + fileExtension: this.format, + maximumLevel: this.maxLevel, + minimumLevel: this.minLevel, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + show: !1 + }; + if (this.extent && this.extent.isValid()) { + const n = this.extent.getCoordinatesInProjection(de); + e.rectangle = Et.fromDegrees(n[0], n[1], n[2], n[3]); + } + this.tilingSchema === it.GEOGRAPHIC && (e.tilingScheme = new Qc()); + const s = await mg.fromUrl(Ii(this.url, this.headers), e), r = this.getCesiumLayerOptions(); + return new vs(s, r); + } +} +const xa = new Array(25); +for (let i = 0; i < xa.length; i++) + xa[i] = 200375083427892e-7 * 2 / 256 / 2 ** (i + 1); +function Ul(i) { + const t = Et.southwest(i), e = Et.northeast(i), s = [ + b.toDegrees(t.longitude), + b.toDegrees(t.latitude) + ], r = [ + b.toDegrees(e.longitude), + b.toDegrees(e.latitude) + ], n = fa(s), a = fa(r); + return [...n, ...a]; +} +class ut extends Ut { + constructor(e) { + var n; + super(e); + /** + * Cesium Webmercator TilingScheme + */ + h(this, "tilingScheme", new _l()); + /** + * sorted baseLevels, maximumLevel first example: [18,17,16] + */ + h(this, "baseLevels"); + h(this, "_tileCacheSize"); + /** + * cache of tiles for each baseLevel + */ + h(this, "cache", /* @__PURE__ */ new Map()); + /** + * Caches the loaded rTrees for quick Access to all features. + */ + h(this, "rtreeCache", /* @__PURE__ */ new Map()); + h(this, "trackFeaturesToTiles"); + h(this, "allowTileAggregation"); + /** + * set of currently loaded featureIds with the corresponding tileIds + */ + h(this, "featureIdToTileIds", /* @__PURE__ */ new Map()); + h(this, "tileLoadedEvent", new L()); + h(this, "_locale", "en"); + h(this, "_idProperty"); + const s = ut.getDefaultOptions(); + this._tileCacheSize = ne(e.tileCacheSize, s.tileCacheSize); + const r = Array.isArray(e.baseLevels) ? e.baseLevels.slice() : ((n = s.baseLevels) == null ? void 0 : n.slice()) || []; + r.sort((a, o) => o - a), this.baseLevels = [...new Set(r)], this.baseLevels.forEach((a) => { + this.cache.set(a, new gf(this.tileCacheSize)); + }), this.trackFeaturesToTiles = ce(e.trackFeaturesToTiles, s.trackFeaturesToTiles), this.allowTileAggregation = ce(e.allowTileAggregation, s.allowTileAggregation), this._idProperty = e.idProperty || s.idProperty; + } + static get className() { + return "TileProvider"; + } + static getDefaultOptions() { + return { + tileCacheSize: 50, + baseLevels: [15], + trackFeaturesToTiles: !0, + allowTileAggregation: !0, + idProperty: void 0 + }; + } + /** + * use setTileCacheSize to change + */ + get tileCacheSize() { + return this._tileCacheSize; + } + get idProperty() { + return this._idProperty; + } + get locale() { + return this._locale; + } + /** + * sets the locale and reloads the layer the if the URL is a locale aware Object. + */ + set locale(e) { + S(e, String), this._locale !== e && (this._locale = e); + } + async setTileCacheSize(e) { + const s = []; + this._tileCacheSize = e, this.cache.forEach((r, n) => { + for (r.setSize(this._tileCacheSize); r.canExpireCache(); ) + s.push(this._removeLastTileFromCache(n)); + }), await Promise.all(s); + } + /** + * tracks Features if the features have ids. + */ + _trackFeatures(e, s) { + this.trackFeaturesToTiles && e.forEach((r) => { + const n = r.getId(); + n && (this.featureIdToTileIds.has(String(n)) || this.featureIdToTileIds.set(String(n), /* @__PURE__ */ new Set()), this.featureIdToTileIds.get(String(n)).add(s)); + }); + } + /** + * untracks Features + */ + _unTrackFeatures(e, s) { + this.trackFeaturesToTiles && e.forEach((r) => { + const n = r.getId(); + if (n && this.featureIdToTileIds.has(String(n))) { + const a = this.featureIdToTileIds.get(String(n)); + a.delete(s), a.size === 0 && this.featureIdToTileIds.delete(String(n)); + } + }); + } + async _addTilePromiseToCache(e, s, r) { + const n = e.then((a) => { + a.forEach((l) => { + const c = this.idProperty ? l.get(this.idProperty) : null; + c != null && l.setId(String(c)), l.getId() || l.setId(Xe()); + }); + const o = new al(a.length); + return o.load(a.map((l) => { + const c = l.getGeometry(); + if (c) { + const d = c.getExtent(); + return { + minX: d[0], + minY: d[1], + maxX: d[2], + maxY: d[3], + value: l + }; + } + return null; + }).filter((l) => l)), this.tileLoadedEvent.raiseEvent({ tileId: r, rtree: o }), this._trackFeatures(a, r), this.rtreeCache.set(r, o), o; + }).catch(() => { + this.getLogger().warning(`Could not load Tile ${r}`); + const a = new al(); + return this.rtreeCache.set(r, a), a; + }); + this.cache.get(s).set(r, n), this.cache.get(s).canExpireCache() && await Promise.all([ + n, + this._removeLastTileFromCache(s) + ]), await n; + } + _removeLastTileFromCache(e) { + var n; + const s = this.cache.get(e).peekLastKey(), r = (n = this.cache.get(e)) == null ? void 0 : n.pop(); + if (r) + return r.then((a) => { + a && (this.rtreeCache.delete(s), setTimeout(() => { + this._unTrackFeatures(a.all().map((o) => o.value), s), a.clear(); + }, 0)); + }); + } + /** + * returns the closest baseLevel for the given resolution + * @param latitude in radians + */ + getBaseLevelForResolution(e, s) { + const r = e / Math.cos(s); + let n = 0; + for (let o = 0; o < xa.length && (n = o, !(r >= xa[o])); o++) + ; + const a = this.getBaseLevel(n); + return a === void 0 ? this.baseLevels[this.baseLevels.length - 1] : a; + } + /** + * returns the nearest parent BaseLevel or undefined if no parent baseLevel is found + */ + getBaseLevel(e) { + return this.baseLevels.find((s) => e >= s); + } + // eslint-disable-next-line class-methods-use-this + getCacheKey(e, s, r) { + return `${r}/${e}/${s}`; + } + async _getRtreeForBaseTile(e, s, r) { + const n = this.tilingScheme.positionToTileXY(s, e), a = this.getCacheKey(n.x, n.y, e); + if (this.cache.has(e)) { + if (!this.cache.get(e).containsKey(a)) { + const o = this.loader(n.x, n.y, e, r); + this._addTilePromiseToCache(o, e, a); + } + return this.cache.get(e).get(a); + } + return null; + } + /** + * returns the features intersecting this coordinate. Depending on the resolution a buffer around the coordinate is requested. + * The Buffer has the size of the resolution. + * @param coordinate in mercator + * @param resolution in m per pixel + * @param headers optional request headers to be sent with the server request + */ + async getFeaturesByCoordinate(e, s, r) { + const n = mf(e); + Gc(n, s, n); + const a = bl(e), o = ee.fromDegrees(a[0], a[1]), l = this.getBaseLevelForResolution(s, o.latitude), c = await this._getRtreeForBaseTile(l, o, r); + return c ? c.search({ + minX: n[0], + minY: n[1], + maxX: n[2], + maxY: n[3] + }).map((u) => u.value) : []; + } + /** + * returns features for the requested Tile. + * @param x + * @param y + * @param level - if the level is not a base level, will use the closest match + * @param headers optional request headers to be sent with the server request + */ + async getFeaturesForTile(e, s, r, n) { + const a = this.tilingScheme.tileXYToRectangle(e, s, r), o = Et.center(a), l = this.getBaseLevel(r); + if (l != null) { + const c = await this._getRtreeForBaseTile(l, o, n); + if (c) { + if (r === l) + return c.all().map((d) => d.value); + { + const d = Ul(a); + return c.search({ + minX: d[0], + minY: d[1], + maxX: d[2], + maxY: d[3] + }).map((f) => f.value); + } + } + } else if (this.allowTileAggregation && this.baseLevels[this.baseLevels.length - 1] - r <= 2) { + const c = r + 1, d = e * 2, u = s * 2; + return [ + ...await this.getFeaturesForTile(d, u, c, n), + ...await this.getFeaturesForTile(d + 1, u, c, n), + ...await this.getFeaturesForTile(d + 1, u + 1, c, n), + ...await this.getFeaturesForTile(d, u + 1, c, n) + ]; + } + return []; + } + /** + * Retrieves all features which intersect the given extent. Will load all intersecting tiles. + * @param extent + * @param level - Optional level to request. Will use highest level if omitted. If the provided level is not a base level, will use the closest match. + * @param headers Optional request headers to be sent with the server request + */ + async getFeaturesForExtent(e, s, r) { + let n = s ?? this.baseLevels[0]; + n = this.getBaseLevel(n); + const [a, o, l, c] = e.getCoordinatesInProjection(de), d = this.tilingScheme.positionToTileXY(ee.fromDegrees(a, c), n), u = this.tilingScheme.positionToTileXY(ee.fromDegrees(l, o), n), f = []; + for (let { x: p } = d; p <= u.x; p++) + for (let { y } = d; y <= u.y; y++) + f.push([p, y]); + const g = await Promise.all(f.map(([p, y]) => this.getFeaturesForTile(p, y, n, r))), m = e.getCoordinatesInProjection(W); + return g.flat().filter((p) => { + const y = p.getGeometry(); + return y && y.intersectsExtent(m); + }); + } + /** + * calls the given Function for Each feature currently in the cache + * @param callback + */ + forEachFeature(e) { + this.rtreeCache.forEach((s) => { + s.all().map((r) => r.value).forEach(e); + }); + } + /** + * Public API to load features from a source (for example a rest API, or WfsLayer) + * + * Can be used to write custom TileProvider to provide an interface to a "feature Source" + * Can also be used to manipulate the features, for example setting an ID Prefix or filter the features. + * + * @example to request Geojson from a rest API: + * const rectangle = this.tilingScheme.tileXYToRectangle(x, y, z); + * const southwest = Rectangle.southwest(rectangle); + * const northeast = Rectangle.northeast(rectangle); + * const minx = CesiumMath.toDegrees(southwest.longitude); + * const miny = CesiumMath.toDegrees(southwest.latitude); + * const maxx = CesiumMath.toDegrees(northeast.longitude); + * const maxy = CesiumMath.toDegrees(northeast.latitude); + * const url = `http://myFeatureSource/layer/getFeatures?minx=${minx}&miny=${miny}&maxx=${maxx}&maxy=${maxy}` + * + * return fetch.get(url) + * .then(response => response.json()) + * .then((data) => { + * const { features } = parseGeoJSON(data.data, { dynamicStyle: true }); + * return features; + * }); + */ + // eslint-disable-next-line class-methods-use-this,no-unused-vars + loader(e, s, r, n) { + return Promise.resolve([]); + } + toJSON() { + var r; + const e = super.toJSON(), s = ut.getDefaultOptions(); + return s.tileCacheSize !== this.tileCacheSize && (e.tileCacheSize = this.tileCacheSize), this.baseLevels.length === ((r = s.baseLevels) == null ? void 0 : r.length) && this.baseLevels.every((n) => { + var a; + return (a = s.baseLevels) == null ? void 0 : a.includes(n); + }) || (e.baseLevels = this.baseLevels.slice()), s.trackFeaturesToTiles !== this.trackFeaturesToTiles && (e.trackFeaturesToTiles = this.trackFeaturesToTiles), s.allowTileAggregation !== this.allowTileAggregation && (e.allowTileAggregation = this.allowTileAggregation), this.idProperty && (e.idProperty = this.idProperty), e; + } + /** + * clears the cache and removes all entries + */ + async clearCache() { + const e = []; + this.cache.forEach((s) => { + s.forEach((r) => { + e.push(r); + }), s.clear(); + }), await Promise.all(e), this.rtreeCache.forEach((s) => { + s.clear(); + }), this.rtreeCache.clear(), this.featureIdToTileIds.clear(); + } + destroy() { + super.destroy(), this.clearCache(), this.cache.clear(), this.isDestroyed = !0, this.tileLoadedEvent.destroy(); + } +} +Js.registerClass(ut.className, ut); +class Pw extends pf { + /** + * @param {CanvasRenderingContext2D} context Context. + * @param {number} pixelRatio Pixel ratio. + * @param {import("ol/extent").Extent} extent Extent. + * @param {import("ol/transform").Transform} transform Transform. + * @param {number} viewRotation View rotation. + * @param {number=} squaredTolerance Optional squared tolerance for simplification. + * @param {import("ol/proj").TransformFunction=} userTransform Transform from user to view projection. + * @param {number} [scaleY=1] Scale value for Scaling Circles, Images, Text in Y direction. + */ + constructor(t, e, s, r, n, a, o, l = 1) { + super(t, e, s, r, n, a, o), this.scaleY = l, this.scaledImageScale_ = [0, 0], this.scaledTextScale_ = [0, 0]; + } + /** + * @private + * @type {import("ol/size").Size} + */ + get imageScale_() { + return this.scaledImageScale_; + } + /** + * @private + * @param {import("ol/size").Size} value + */ + set imageScale_(t) { + const e = t || [1, 1]; + this.scaledImageScale_ = [e[0], e[1] * this.scaleY]; + } + /** + * @private + * @type {import("ol/size").Size} + */ + get textScale_() { + return this.scaledTextScale_; + } + /** + * @private + * @param {import("ol/size").Size} value + */ + set textScale_(t) { + const e = t || [1, 1]; + this.scaledTextScale_ = [e[0], e[1] * this.scaleY]; + } + /** + * @param {Array} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {boolean} close Close. + * @private + * @returns {number} end End. + */ + moveToLineTo_(t, e, s, r, n) { + const a = this.context_, o = yf(t, e, s, r, this.transform_, this.pixelCoordinates_); + a.moveTo(o[0], o[1]); + const { length: l } = o; + for (let c = 2; c < l; c += 2) + a.lineTo(o[c], o[c + 1]); + return n && a.closePath(), s; + } + /** + * Render a circle geometry into the canvas. Rendering is immediate and uses + * the current fill and stroke styles. + * + * takes the mercator yscale into account and draws a ellipse instead of a circle. + */ + drawCircle(t) { + if (Hc(this.extent_, t.getExtent())) { + if (this.fillState_ || this.strokeState_) { + this.fillState_ && this.setContextFillState_(this.fillState_), this.strokeState_ && this.setContextStrokeState_(this.strokeState_); + const e = _f(t, this.transform_, this.pixelCoordinates_), s = e[2] - e[0], r = e[3] - e[1], n = Math.sqrt(s * s + r * r), a = this.context_; + a.beginPath(), a.ellipse(e[0], e[1], n, n * this.scaleY, 0, 0, 2 * Math.PI), this.fillState_ && a.fill(), this.strokeState_ && a.stroke(); + } + this.text_ !== "" && this.drawText_(t.getCenter(), 0, 2, 2); + } + } +} +function Lw(i, t, e, s) { + const { canvas: r } = e; + r.width = s[0], r.height = s[1], r.style.width = `${s[0]}px`, r.style.height = `${s[1]}px`; + const n = (i[2] - i[0]) / (i[3] - i[1]), a = 1 / ((i[2] - i[0]) / 256), o = -1 / ((i[3] - i[1]) / 256), l = vf(Sf(), 1, 1), c = wf(l, 128, 128, a, o, 0, -t[0], -t[1]); + return new Pw(e, 1, i, c, 0, void 0, void 0, n); +} +function Iw(i, t, e, s) { + const r = document.createElement("canvas"); + r.width = s[0], r.height = s[0]; + const n = fa([ + b.toDegrees(e.longitude), + b.toDegrees(e.latitude) + ]), a = Lw(t, n, r.getContext("2d"), s); + return i.forEach((o) => { + o.getStyleFunction()(o, 1).forEach((d) => { + a.drawFeature(o, d); + }); + }), r; +} +class Tw { + constructor(t) { + h(this, "tileProvider"); + h(this, "_tilingScheme"); + h(this, "_tileSize"); + h(this, "_errorEvent", new Uo()); + h(this, "headers"); + h(this, "emptyCanvas"); + h(this, "minLevel", 0); + h(this, "maxLevel", 26); + h(this, "_reload"); + this.tileProvider = t.tileProvider, this._tilingScheme = this.tileProvider.tilingScheme, this._tileSize = t.tileSize, this._errorEvent = new Uo(), this.emptyCanvas = document.createElement("canvas"), this.emptyCanvas.width = this.tileWidth, this.emptyCanvas.height = this.tileHeight, this.headers = t.headers; + } + // eslint-disable-next-line class-methods-use-this + get _ready() { + return !0; + } + // eslint-disable-next-line class-methods-use-this + get ready() { + return !0; + } + get rectangle() { + return this._tilingScheme.rectangle; + } + get tileWidth() { + return this._tileSize[0]; + } + get tileHeight() { + return this._tileSize[1]; + } + get maximumLevel() { + return this.maxLevel; + } + get minimumLevel() { + return this.minLevel; + } + get tilingScheme() { + return this._tilingScheme; + } + // eslint-disable-next-line class-methods-use-this + get tileDiscardPolicy() { + } + get errorEvent() { + return this._errorEvent; + } + // eslint-disable-next-line class-methods-use-this + get credit() { + } + // eslint-disable-next-line class-methods-use-this + get proxy() { + } + // eslint-disable-next-line class-methods-use-this + get hasAlphaChannel() { + return !0; + } + /** + * Requests the image for a given tile. This function should + * not be called before returns true. + * + * @param x The tile X coordinate. + * @param y The tile Y coordinate. + * @param level The tile level. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + async requestImage(t, e, s) { + const r = await this.tileProvider.getFeaturesForTile(t, e, s, this.headers); + if (r.length === 0) + return this.emptyCanvas; + const n = this.tileProvider.tilingScheme.tileXYToRectangle(t, e, s), a = Ul(n), o = Et.center(n); + return Iw(r, a, o, this._tileSize); + } +} +class Aw extends er { + constructor(e, s) { + const r = { + ...s, + tilingSchema: it.MERCATOR, + opacity: 1 + }; + super(e, r); + h(this, "tileProvider"); + h(this, "tileSize"); + h(this, "_reloadTimeout"); + h(this, "imageryProvider"); + this.tileProvider = s.tileProvider, this.tileSize = s.tileSize; + } + static get className() { + return "VectorRasterTileCesiumImpl"; + } + getCesiumLayer() { + this.imageryProvider = new Tw({ + tileProvider: this.tileProvider, + tileSize: this.tileSize, + headers: this.headers + }); + const e = { + alpha: this.opacity, + splitDirection: this.splitDirection, + minimumTerrainLevel: this.minLevel, + maximumTerrainLevel: this.maxLevel + }; + if (this.extent && this.extent.isValid()) { + const s = this.extent.getCoordinatesInProjection(de); + e.rectangle = Et.fromDegrees(s[0], s[1], s[2], s[3]); + } + return Promise.resolve(new vs( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.imageryProvider, + e + )); + } + /** + * reloads the tiles + */ + _reloadTiles() { + window.clearTimeout(this._reloadTimeout), this.imageryProvider && this.imageryProvider._reload && (this._reloadTimeout = window.setTimeout(() => { + var e, s; + (s = (e = this.imageryProvider) == null ? void 0 : e._reload) == null || s.call(e), this._reloadTimeout = void 0; + })); + } + /** + * rerenders the specified tiles + * rendering happens async + */ + updateTiles(e) { + e.length > 0 && this._reloadTiles(); + } + // eslint-disable-next-line no-unused-vars + updateStyle(e, s) { + this._reloadTiles(); + } +} +class Dw extends er { + constructor(e, s) { + super(e, s); + h(this, "parameters"); + h(this, "highResolution"); + h(this, "tileSize"); + this.parameters = s.parameters, this.highResolution = s.highResolution, this.tileSize = s.tileSize; + } + static get className() { + return "WmsCesiumImpl"; + } + getCesiumLayer() { + const e = { ...this.parameters }; + this.highResolution && (e.width = String(this.tileSize[0] * 2), e.height = String(this.tileSize[1] * 2)); + const s = { + url: Ii(this.url, this.headers), + layers: e.LAYERS, + minimumLevel: this.minLevel, + maximumLevel: this.maxLevel, + parameters: e, + tileWidth: this.tileSize[0], + tileHeight: this.tileSize[1] + }; + if (this.extent && this.extent.isValid()) { + const a = this.extent.getCoordinatesInProjection(de); + a && (s.rectangle = Et.fromDegrees(a[0], a[1], a[2], a[3])); + } + this.tilingSchema === "mercator" && (s.tilingScheme = new _l()); + const r = new pg(s), n = this.getCesiumLayerOptions(); + return Promise.resolve(new vs(r, n)); + } +} +class Nw extends er { + constructor(e, s) { + super(e, s); + h(this, "layer"); + h(this, "style"); + h(this, "format"); + h(this, "tileMatrixSetID"); + h(this, "tileSize"); + h(this, "numberOfLevelZeroTilesX"); + h(this, "numberOfLevelZeroTilesY"); + h(this, "matrixIds"); + this.layer = s.layer, this.style = s.style, this.format = s.format, this.tileMatrixSetID = s.tileMatrixSetID, this.tileSize = s.tileSize, this.numberOfLevelZeroTilesX = s.numberOfLevelZeroTilesX, this.numberOfLevelZeroTilesY = s.numberOfLevelZeroTilesY, this.matrixIds = s.matrixIds; + } + static get className() { + return "WmtsCesiumImpl"; + } + getCesiumLayer() { + const e = this.url, s = e.indexOf("{Layer}") !== -1 ? e.replace("{Layer}", this.layer) : e, r = this.extent.getCoordinatesInProjection(de), n = { + url: Ii(s, this.headers), + layer: this.layer, + style: this.style, + format: this.format, + tileMatrixSetID: this.tileMatrixSetID, + maximumLevel: this.maxLevel, + rectangle: Et.fromDegrees(r[0], r[1], r[2], r[3]), + tileWidth: this.tileSize[0], + tileHeight: this.tileSize[1] + }; + n.tilingScheme = bd({ + tilingSchema: this.tilingSchema, + numberOfLevelZeroTilesX: this.numberOfLevelZeroTilesX, + numberOfLevelZeroTilesY: this.numberOfLevelZeroTilesY + }), n.tileMatrixLabels = this.matrixIds; + const a = new yg(n), o = this.getCesiumLayerOptions(); + return Promise.resolve(new vs(a, o)); + } +} +function hs() { + const i = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(i) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(i.substring(0, 4)); +} +class di extends Li { + constructor(e) { + super(e); + h(this, "highlightStyle"); + h(this, "screenSpaceError"); + h(this, "screenSpaceErrorMobile"); + h(this, "tilesetOptions"); + h(this, "_modelMatrix"); + h(this, "_offset"); + h(this, "_supportedMaps", [B.className]); + h(this, "_customShader"); + this._supportedMaps = [B.className]; + const s = di.getDefaultOptions(); + this.highlightStyle = null, e.highlightStyle && (this.highlightStyle = e.highlightStyle instanceof ge ? e.highlightStyle : new ge(e.highlightStyle)), this.screenSpaceError = ne(e.screenSpaceError, s.screenSpaceError), this.screenSpaceErrorMobile = ne(e.screenSpaceErrorMobile, s.screenSpaceErrorMobile); + const r = e.tilesetOptions || s.tilesetOptions; + this.tilesetOptions = { + maximumScreenSpaceError: hs() ? this.screenSpaceErrorMobile : this.screenSpaceError, + ...r + }, this._modelMatrix = void 0, this._offset = e.offset || s.offset; + } + static get className() { + return "CesiumTilesetLayer"; + } + static getDefaultOptions() { + return { + ...Li.getDefaultOptions(), + highlightStyle: void 0, + screenSpaceError: 16, + screenSpaceErrorMobile: 32, + tilesetOptions: {}, + offset: void 0 + }; + } + /** + * A model matrix to apply to each cesium3DTileset created from this layer. + * This will overwrite any modelMatrix calculated by the offset property. + */ + get modelMatrix() { + return this._modelMatrix; + } + set modelMatrix(e) { + S(e, ie(G)), this._modelMatrix = e, this.getImplementations().forEach((s) => { + s.updateModelMatrix(e); + }); + } + /** + * An offset in x, y, z. x and y are in degrees longitude latitude respectively. + * If a modelMatrix is defined on this layer, setting an offset will not take effect until you + * set the modelMatrix to undefined. + */ + get offset() { + return this._offset; + } + set offset(e) { + S(e, ie([Number])), this._offset = e, this.getImplementations().forEach((s) => { + s.updateOffset(e); + }); + } + get customShader() { + return this._customShader; + } + set customShader(e) { + this._customShader !== e && (this._customShader = e, this.getImplementations().forEach((s) => { + s.updateCustomShader(e); + })); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + tilesetOptions: this.tilesetOptions, + modelMatrix: this.modelMatrix, + offset: this.offset, + customShader: this.customShader + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [ + new ns(e, this.getImplementationOptions()) + ] : []; + } + /** + * Returns the configured Extent of this layer or tries to calculate the extent based on tileset. + * Returns null of no extent was configured and the layers tileset is not yet loaded or ready. + */ + getZoomToExtent() { + const e = super.getZoomToExtent(); + if (e) + return e; + const s = this.getImplementations()[0]; + if (s != null && s.cesium3DTileset) { + const r = Id(s.cesium3DTileset), n = new be({ + projection: W.toJSON(), + coordinates: r + }); + if (n.isValid()) + return n; + } + return null; + } + /** + * set the maximum screenspace error of this layer + */ + setMaximumScreenSpaceError(e) { + this.getImplementations().forEach((s) => { + s.cesium3DTileset && (s.cesium3DTileset.maximumScreenSpaceError = e); + }); + } + toJSON() { + const e = super.toJSON(), s = di.getDefaultOptions(); + this.highlightStyle && (e.highlightStyle = this.highlightStyle.toJSON()), this.screenSpaceError !== s.screenSpaceError && (e.screenSpaceError = this.screenSpaceError), this.screenSpaceErrorMobile !== s.screenSpaceErrorMobile && (e.screenSpaceErrorMobile = this.screenSpaceErrorMobile); + const r = { ...this.tilesetOptions }, n = hs() ? this.screenSpaceErrorMobile : this.screenSpaceError; + return r.maximumScreenSpaceError === n && delete r.maximumScreenSpaceError, Object.keys(r).length > 0 && (e.tilesetOptions = r), Array.isArray(this.offset) && (e.offset = this.offset.slice()), e; + } + /** + * disposes of this layer, removes instances from the current maps and the framework + */ + destroy() { + super.destroy(); + } +} +ke.registerClass(di.className, di); +var He; +(function(i) { + i[i.LOADING = 0] = "LOADING", i[i.PROCESSING = 1] = "PROCESSING", i[i.READY = 2] = "READY", i[i.FAILED = 3] = "FAILED"; +})(He || (He = {})); +var _s; +(function(i) { + i[i.VECTOR = 0] = "VECTOR", i[i.CHILD = 1] = "CHILD", i[i.NO_DATA = 2] = "NO_DATA", i[i.DEBUG = 3] = "DEBUG"; +})(_s || (_s = {})); +function Wl(i, t) { + const e = t.tileXYToRectangle(i.x, i.y, i.level); + return [ + b.toDegrees(e.west), + b.toDegrees(e.south), + b.toDegrees(e.east), + b.toDegrees(e.north) + ]; +} +function Rw(i, t) { + const e = Wl(i, t), s = z.wgs84ToMercator([e[0], e[1]]), r = z.wgs84ToMercator([e[2], e[3]]); + return [s[0], s[1], r[0], r[1]]; +} +function Za(i, t) { + var s; + const e = ((s = t.getScene()) == null ? void 0 : s.getHeight(Et.center(i.rectangle), Y.CLAMP_TO_GROUND)) ?? 0; + return new _g({ + rectangle: i.rectangle, + maximumHeight: e, + minimumHeight: e + }); +} +function Fw(i, t, e) { + const s = /* @__PURE__ */ new Set(); + for (let n = i; n <= t; n++) { + const a = e.getBaseLevel(n); + if (a != null) { + const o = a < i ? i : a; + s.add(o); + } + } + if (s.size === 0) + throw new Error("No base levels for this tile data set"); + const r = [...s].at(-1); + return { + dataLevels: s, + dataRange: [i, r > i ? r : i] + }; +} +function hl(i) { + return `${i.level}/${i.x}/${i.y}`; +} +class Gw { + constructor(t, e) { + h(this, "state", He.LOADING); + h(this, "type", _s.CHILD); + h(this, "tileBoundingRegion"); + h(this, "_tile"); + this.tileBoundingRegion = Za(t, e), this.state = He.READY, this._tile = t; + } + get show() { + var t, e; + return ((e = (t = this._tile.parent) == null ? void 0 : t.data) == null ? void 0 : e.show) ?? !1; + } + // eslint-disable-next-line class-methods-use-this,@typescript-eslint/no-empty-function + set show(t) { + } +} +let Io; +function kw() { + return Io || (Io = new Gt({})), Io; +} +class zw { + constructor(t, e) { + h(this, "state", He.LOADING); + h(this, "type", _s.DEBUG); + h(this, "tileBoundingRegion"); + h(this, "_tile"); + h(this, "_vectorContext"); + h(this, "_rootCollection", new $t()); + h(this, "_extentFeature"); + h(this, "_map"); + h(this, "_tileProvider"); + h(this, "_style"); + h(this, "_layerPrimitiveCollection"); + this._tile = t, this._map = e.map, this._tileProvider = e.tileProvider, this._style = e.style, this._layerPrimitiveCollection = e.primitiveCollection, this._vectorContext = new zl(this._map, this._rootCollection, we.NONE), this._rootCollection[J] = e.name, this._rootCollection.show = !1, this._layerPrimitiveCollection.add(this._rootCollection), this.tileBoundingRegion = Za(t, this._map), this._load().catch(() => { + this.state = He.FAILED; + }); + } + async _load() { + this.state = He.LOADING; + const t = this._map.getScene(); + this.state = He.PROCESSING; + const e = Wl(this._tile, this._tileProvider.tilingScheme), s = new Fe({ + geometry: new Ve(z.wgs84ToMercator(cs(e))), + olcs_altitudeMode: "relativeToGround", + olcs_heightAboveGround: 5 + }); + s.setStyle(new K({ + text: new on({ + text: `${this._tile.level}/${this._tile.x}/${this._tile.y}` + }) + })), this._extentFeature = new Fe({ + geometry: kc(e).transform(de.proj, W.proj) + }), this._extentFeature[pe] = !0; + const r = [this._extentFeature, s]; + await Promise.all(r.map((n) => this._vectorContext.addFeature(n, n.getStyle() ?? this._style, kw(), t))), this.state = He.READY; + } + get show() { + return this._rootCollection.show; + } + set show(t) { + this._rootCollection.show = t; + } + freeResources() { + he("VcsDebugTile").log(`freeing resources: ${hl(this._tile)}`), this.destroy(); + } + destroy() { + this._vectorContext.destroy(), this._layerPrimitiveCollection.remove(this._rootCollection), this._tile.data = void 0; + } +} +class Hw { + constructor(t, e) { + h(this, "state", He.LOADING); + h(this, "type", _s.NO_DATA); + h(this, "tileBoundingRegion"); + this.tileBoundingRegion = Za(t, e), this.state = He.READY; + } + // eslint-disable-next-line class-methods-use-this + get show() { + return !1; + } + // eslint-disable-next-line class-methods-use-this,@typescript-eslint/no-empty-function + set show(t) { + } +} +class Bw { + constructor(t, e) { + h(this, "state", He.LOADING); + h(this, "type", _s.VECTOR); + h(this, "tileBoundingRegion"); + h(this, "_tile"); + h(this, "_vectorContext"); + h(this, "_rootCollection", new $t()); + h(this, "_featureListeners", []); + h(this, "_map"); + h(this, "_tileProvider"); + h(this, "_style"); + h(this, "_vectorProperties"); + h(this, "_layerPrimitiveCollection"); + h(this, "_isDestroyed"); + this._tile = t, this._map = e.map, this._tileProvider = e.tileProvider, this._style = e.style, this._vectorProperties = e.vectorProperties, this._layerPrimitiveCollection = e.primitiveCollection, this._vectorContext = new zl(e.map, this._rootCollection, e.splitDirection), this._rootCollection[J] = e.name, this._rootCollection.show = !1, e.primitiveCollection.add(this._rootCollection), this.tileBoundingRegion = Za(t, e.map), this._load().catch(() => { + this.state = He.FAILED; + }), this._isDestroyed = !1; + } + async _load() { + this.state = He.LOADING; + const t = this._map.getScene(), e = await this._tileProvider.getFeaturesForTile(this._tile.x, this._tile.y, this._tile.level); + if (this._isDestroyed) + return; + const s = Rw(this._tile, this._tileProvider.tilingScheme); + this.state = He.PROCESSING, await Promise.all(e.map(async (r) => { + var a; + if (this._isDestroyed) + return; + const n = (a = r.getGeometry()) == null ? void 0 : a.getExtent(); + n && Qn(s, cs(n)) && (this._featureListeners.push(r.on("change", () => { + this._vectorContext.addFeature(r, this._style, this._vectorProperties, t).catch(() => { + he("VcsVectorTile").error("failed to add changed feature"); + }); + })), await this._vectorContext.addFeature(r, this._style, this._vectorProperties, t)); + })), !this._isDestroyed && (this.state = He.READY); + } + get show() { + return this._rootCollection.show; + } + set show(t) { + this._rootCollection.show = t; + } + freeResources() { + this.destroy(); + } + destroy() { + le(this._featureListeners), this._isDestroyed = !0, this._vectorContext.destroy(), this._layerPrimitiveCollection.remove(this._rootCollection), this._tile.data = void 0; + } +} +const Vw = new _(); +class jw { + constructor(t, e, s) { + h(this, "quadtree"); + h(this, "tilingScheme"); + h(this, "errorEvent", new Uo()); + h(this, "_destroyed", !1); + h(this, "_levelZeroMaximumError"); + h(this, "_tileOptions"); + h(this, "_showingTiles", /* @__PURE__ */ new Set()); + h(this, "_dataLevels"); + h(this, "_dataRange"); + h(this, "_extentWgs84"); + h(this, "_debug", !1); + this._tileOptions = { + map: t, + primitiveCollection: e, + style: s.style.style, + name: s.name, + tileProvider: s.tileProvider, + vectorProperties: s.vectorProperties, + splitDirection: s.splitDirection + }, this._debug = ce(s.debug, !1), this.tilingScheme = s.tileProvider.tilingScheme, this._levelZeroMaximumError = vg.computeDefaultLevelZeroMaximumGeometricError(this.tilingScheme); + const { dataLevels: r, dataRange: n } = Fw(s.minLevel, s.maxLevel, s.tileProvider); + this._dataLevels = r, this._dataRange = n; + const a = s.extent; + a != null && a.isValid() && (this._extentWgs84 = a == null ? void 0 : a.getCoordinatesInProjection(de)); + } + // eslint-disable-next-line class-methods-use-this + get className() { + return "VcsQuadtreeTileProvider"; + } + _withinDataRange(t) { + if (t.level >= this._dataRange[0] && t.level <= this._dataRange[1]) { + if (this._extentWgs84) { + const e = Wl(t, this.tilingScheme); + return Hc(e, this._extentWgs84); + } + return !0; + } + return !1; + } + _initializeTile(t) { + t.state === Ln.START && (t.data || (this._withinDataRange(t) ? this._dataLevels.has(t.level) ? t.data = this._debug ? new zw(t, this._tileOptions) : new Bw(t, this._tileOptions) : t.data = new Gw(t, this._tileOptions.map) : t.data = new Hw(t, this._tileOptions.map)), t.state = Ln.LOADING); + } + updateStyle(t) { + this._tileOptions.style = t.style; + } + updateSplitDirection(t) { + this._tileOptions.splitDirection = t; + } + update(t) { + var e, s, r; + (e = this.quadtree) == null || e.beginFrame(t), (s = this.quadtree) == null || s.render(t), (r = this.quadtree) == null || r.endFrame(t); + } + endUpdate(t) { + var e; + (e = this.quadtree) == null || e.forEachLoadedTile((s) => { + s.data && (s.data.show = this._showingTiles.has(hl(s))); + }), this._showingTiles.clear(); + } + getLevelMaximumGeometricError(t) { + return this._levelZeroMaximumError / (1 << t); + } + loadTile(t, e) { + var s, r; + this._initializeTile(e), ((s = e.data) == null ? void 0 : s.state) === He.READY ? (e.renderable = !0, e.state = Ln.DONE) : ((r = e.data) == null ? void 0 : r.state) === He.FAILED && (e.state = Ln.FAILED); + } + computeTileLoadPriority(t, e) { + const s = t.data; + if (s === void 0) + return 0; + const r = s.tileBoundingRegion.boundingVolume; + if (r === void 0) + return 0; + const n = e.camera.positionWC, a = e.camera.directionWC, o = _.subtract(r.center, n, Vw), l = _.magnitude(o); + return l < b.EPSILON5 ? 0 : (_.divideByScalar(o, l, o), (1 - _.dot(o, a)) * // eslint-disable-next-line no-underscore-dangle + (t._distance ?? this.computeDistanceToTile(t, e))); + } + computeTileVisibility(t, e) { + var a; + const s = this.computeDistanceToTile(t, e); + if (t._distance = s, e.fog && b.fog(s, e.fog.density) >= 1) + return sr.NONE; + let r = sr.NONE; + const n = (a = t.data) == null ? void 0 : a.tileBoundingRegion.boundingVolume; + if (n) { + const o = e.cullingVolume.computeVisibility(n); + o === $n.OUTSIDE ? r = sr.NONE : o === $n.INTERSECTING ? r = sr.PARTIAL : o === $n.INSIDE && (r = sr.FULL); + } + return r; + } + // eslint-disable-next-line class-methods-use-this + showTileThisFrame(t) { + var s; + let e = t; + for (; ((s = e == null ? void 0 : e.data) == null ? void 0 : s.type) === _s.CHILD; ) + e = e.parent; + e != null && e.data && this._showingTiles.add(hl(e)); + } + computeDistanceToTile(t, e) { + var s; + return this._initializeTile(t), ((s = t.data) == null ? void 0 : s.tileBoundingRegion.distanceToCamera(e)) ?? 9999999999; + } + canRefine(t) { + return t.level < this._dataRange[1]; + } + isDestroyed() { + return this._destroyed; + } + // eslint-disable-next-line class-methods-use-this + cancelReprojections() { + } + // eslint-disable-next-line class-methods-use-this + initialize(t) { + } + // eslint-disable-next-line class-methods-use-this + beginUpdate(t) { + } + // eslint-disable-next-line class-methods-use-this + updateForPick(t) { + } + destroy() { + this._destroyed = !0, this._showingTiles.clear(); + } +} +class Ea extends st { + constructor() { + super(...arguments); + /** + * The entities of this layer. Use the `addEntity` API to add Enitities to ensure interoperability with vcm interfaces + */ + h(this, "entities", new Sg()); + h(this, "clock"); + /** + * The feature visibility of this layer. NOTE: Entities cannot be highlighted at this moment. + */ + h(this, "featureVisibility", new qa()); + h(this, "_supportedMaps", [B.className]); + h(this, "_featureVisibilityListeners", []); + } + static get className() { + return "DataSourceLayer"; + } + setGlobalHider(e) { + super.setGlobalHider(e), this._setUpFeatureVisibility(); + } + /** + * Sets up listeners for featureVisibility and global hider + */ + _setUpFeatureVisibility() { + this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = [ + this.featureVisibility.changed.addEventListener(({ action: e, ids: s }) => { + e === fe.HIDE && s.forEach((r) => { + const n = this.entities.getById(r); + n && this.featureVisibility.addHiddenFeature(r, n); + }); + }), + this.entities.collectionChanged.addEventListener((e, s) => { + s.forEach((r) => { + this.featureVisibility.hiddenObjects[r.id] && this.featureVisibility.addHiddenFeature(r.id, r), this.globalHider && this.globalHider.hiddenObjects[r.id] && this.globalHider.addFeature(r.id, r); + }); + }) + ], this.globalHider && this._featureVisibilityListeners.push(this.globalHider.changed.addEventListener(({ action: e, ids: s }) => { + e === fe.HIDE && s.forEach((r) => { + const n = this.entities.getById(r); + n && this.globalHider.addFeature(r, n); + }); + })); + } + initialize() { + return this.initialized || this._setUpFeatureVisibility(), super.initialize(); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + entities: this.entities, + clock: this.clock + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [new Mw(e, this.getImplementationOptions())] : []; + } + /** + * adds an entity + * @param options - Cesium Entity options or the entity + * @param attributes - a set of properties, typically used for rendering a balloon + * @param allowPicking - whether to override the layers allowPicking setting for this entity + * @returns the entities id + */ + addEntity(e, s, r) { + const n = this.entities.add(e); + return n[J] = this.name, n.attributes = s, n.allowPicking = r, n.id; + } + /** + * Zooms to an entity with the given id + */ + flyToEntity(e) { + this.getImplementations().forEach((s) => { + s.flyToEntity(e); + }); + } + /** + * Removes an entity from this layer by id + */ + removeEntityById(e) { + this.entities.removeById(e); + } + destroy() { + this.entities.removeAll(), this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = [], this.featureVisibility.destroy(), super.destroy(); + } +} +ke.registerClass(Ea.className, Ea); +class Oa extends Ea { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "_dataSource", new wg()); + h(this, "sourceUri"); + // eslint-disable-next-line class-methods-use-this + h(this, "_loadedResolve", () => { + }); + // eslint-disable-next-line class-methods-use-this + h(this, "_loadedReject", () => { + }); + /** + * A Promise resolving with the DataSourceLayer on load + */ + h(this, "loaded", new Promise((e, s) => { + this._loadedResolve = e, this._loadedReject = s; + })); + h(this, "_initializedPromise"); + this.entities = this.dataSource.entities; + const s = Oa.getDefaultOptions(); + this.sourceUri = e.sourceUri || s.sourceUri; + } + static get className() { + return "CzmlLayer"; + } + static getDefaultOptions() { + return { + ...Ea.getDefaultOptions(), + sourceUri: void 0 + }; + } + get dataSource() { + if (!this._dataSource) + throw new Error("Accessing destroyed czml layer"); + return this._dataSource; + } + set dataSource(e) { + this._dataSource = e; + } + initialize() { + return this._initializedPromise || (this._initializedPromise = this._loadData().then(() => super.initialize()).then(() => { + this._loadedResolve(); + }).catch((e) => { + this._loadedReject(e); + })), this._initializedPromise; + } + async _loadData() { + await this.dataSource.load(Ii(this.url, this.headers), this.sourceUri ? { sourceUri: this.sourceUri } : void 0), this.entities.values.forEach((e) => { + e[J] = this.name; + }), this.clock = this.dataSource.clock; + } + async reload() { + this.entities.removeAll(), await this._loadData(), await this.forceRedraw(); + } + toJSON() { + const e = super.toJSON(); + return this.sourceUri && (e.sourceUri = this.sourceUri), e; + } + destroy() { + super.destroy(), this._dataSource && (this._dataSource._entityCluster.destroy(), this._dataSource._entityCluster = null, this._dataSource._entityCollection = null, this._dataSource._changed = null, this._dataSource._error = null, this._dataSource._loading = null), this._dataSource = null; + } +} +ke.registerClass(Oa.className, Oa); +function $w(i, t, e) { + const s = []; + return i.forEach((r) => { + const n = Xr(r, { + writeStyle: !0 + }); + s.push({ + action: "add", + feature: n, + original: r, + success(a) { + r.setId(a), r[Bt] = "dynamic"; + } + }); + }), t.forEach((r) => { + const n = Xr(r, { + writeStyle: !0 + }); + n._id = r.getId(), s.push({ + action: "edit", + original: r, + feature: n, + success() { + r[Bt] === "static" && (r[Bt] = "edited"); + } + }); + }), e.forEach((r) => { + s.push({ + original: r, + action: "remove", + feature: { _id: r.getId() }, + success() { + } + }); + }), s; +} +class qw extends Ut { + constructor(e) { + super({}); + h(this, "_layer"); + h(this, "_changesListeners", { + addfeature: null, + changefeature: null, + removefeature: null + }); + h(this, "_addedFeatures", /* @__PURE__ */ new Set()); + h(this, "_editedFeatures", /* @__PURE__ */ new Set()); + h(this, "_removedFeatures", /* @__PURE__ */ new Set()); + h(this, "_convertedFeatures", /* @__PURE__ */ new Set()); + h(this, "changed", new L()); + this._layer = e; + } + static get className() { + return "FeatureStoreLayerChanges"; + } + get layer() { + if (!this._layer) + throw new Error("Trying to access destroyed feature store changes"); + return this._layer; + } + /** + * Whether changes are being tracked or not + */ + get active() { + return Object.values(this._changesListeners).some((e) => e !== null); + } + /** + * starts tracking changes on the layer + * starts tracking changes on the feature store layer + */ + track() { + this._changesListeners.addfeature === null && (this._changesListeners.addfeature = this.layer.source.on("addfeature", this._featureAdded.bind(this))), this._changesListeners.changefeature === null && (this._changesListeners.changefeature = this.layer.source.on("changefeature", this._featureChanged.bind(this))), this._changesListeners.removefeature === null && (this._changesListeners.removefeature = this.layer.source.on("removefeature", this._featureRemoved.bind(this))); + } + getChanges() { + return { + add: [...this._addedFeatures], + edit: [...this._editedFeatures], + remove: [...this._removedFeatures] + }; + } + hasChanges() { + return this._addedFeatures.size !== 0 || this._editedFeatures.size !== 0 || this._removedFeatures.size !== 0; + } + /** + * commits the changes to the provided url. url should contain accessTokens and point to a featureStore layers bulk operation endpoint + */ + async commitChanges(e) { + const s = $w(this._addedFeatures, this._editedFeatures, this._removedFeatures); + if (s.length > 0) { + const r = await e(s.map((a) => ({ action: a.action, feature: a.feature }))), n = r.failedActions.map(({ index: a, error: o }) => { + const l = s[a]; + return this.getLogger().log(`failed action ${l.action}: ${o}`), s[a] = null, this._resetFeature(l.original); + }); + s.forEach((a) => { + var o; + a && (a.action === "add" ? a.success((o = r.insertedIds.shift()) == null ? void 0 : o._id) : a.success()); + }), await Promise.all(n); + } else { + try { + await Promise.all([...this._convertedFeatures].map(async (r) => { + await this._resetFeature(r); + })); + } catch (r) { + this.getLogger().error(String(r)); + } + this._resetValues(); + } + } + /** + * resets all changes since the last commit or the beginning of tracking + */ + async reset() { + const e = []; + return this._addedFeatures.forEach((s) => { + e.push(this._resetFeature(s)); + }), this._editedFeatures.forEach((s) => { + e.push(this._resetFeature(s)); + }), this._removedFeatures.forEach((s) => { + e.push(this._resetFeature(s)); + }), this._convertedFeatures.forEach((s) => { + e.push(this._resetFeature(s)); + }), Promise.all(e).then(() => { + this._resetValues(); + }).catch((s) => { + this.getLogger().error(String(s)), this._resetValues(); + }); + } + _resetFeature(e) { + const s = e.getId(), r = [s]; + return e[Bt] ? e[Bt] === "static" ? (this.layer.resetStaticFeature(s), Promise.resolve()) : this.layer.injectedFetchDynamicFeatureFunc(s).then((n) => { + const { features: a } = Hi(n); + this.layer.removeFeaturesById(r), this.layer.addFeatures(a); + }).catch((n) => { + this.getLogger().error("failed to reset feature, giving up", String(n)); + }) : (this.layer.removeFeaturesById(r), Promise.resolve()); + } + _resetValues() { + this._addedFeatures.clear(), this._editedFeatures.clear(), this._removedFeatures.clear(), this._convertedFeatures.clear(); + } + /** + * stops tracking changes on the feature store layer + */ + unTrack() { + le(Object.values(this._changesListeners).filter((e) => e)), this._changesListeners.addfeature = null, this._changesListeners.changefeature = null, this._changesListeners.removefeature = null, this._resetValues(); + } + /** + * pauses the tracking of the given event, but does not reset features + * @param event - one of: addfeature, changefeature or removefeature + */ + pauseTracking(e) { + this._changesListeners[e] && (le(this._changesListeners[e]), this._changesListeners[e] = null); + } + _featureAdded(e) { + const { feature: s } = e; + s && (s[Bt] ? s[Bt] === "static" && (this._convertedFeatures.add(s), this.changed.raiseEvent()) : (this._addedFeatures.add(s), this.changed.raiseEvent())); + } + _featureChanged(e) { + const { feature: s } = e; + s && s[Bt] && (this._convertedFeatures.delete(s), this._editedFeatures.add(s), this.changed.raiseEvent()); + } + _featureRemoved(e) { + const { feature: s } = e; + s && (s[Bt] ? (this._removedFeatures.add(s), this._editedFeatures.delete(s), this._convertedFeatures.delete(s), this.changed.raiseEvent()) : this._addedFeatures.delete(s)); + } + /** + * tracks the change of removing a static feature + */ + removeFeature(e) { + S(e, ue), this._featureRemoved({ feature: e }); + } + /** + * adds an addition to the tracker. prefer use of .track + */ + addFeature(e) { + S(e, ue), this._featureAdded({ feature: e }); + } + /** + * adds an edit to the tracker. prefer use of .track + */ + editFeature(e) { + S(e, ue), this._featureChanged({ feature: e }); + } + destroy() { + this.unTrack(), this._layer = void 0, this.changed.destroy(), super.destroy(); + } +} +class Uw extends qa { + constructor(e) { + super(); + h(this, "_changeTracker"); + this._changeTracker = e; + } + highlight(e) { + const s = this._changeTracker.active; + s && this._changeTracker.pauseTracking("changefeature"), super.highlight(e), s && this._changeTracker.track(); + } + unHighlight(e) { + const s = this._changeTracker.active; + s && this._changeTracker.pauseTracking("changefeature"), super.unHighlight(e), s && this._changeTracker.track(); + } + hideObjects(e) { + const s = this._changeTracker.active; + s && this._changeTracker.pauseTracking("changefeature"), super.hideObjects(e), s && this._changeTracker.track(); + } + showObjects(e) { + const s = this._changeTracker.active; + s && this._changeTracker.pauseTracking("changefeature"), super.showObjects(e), s && this._changeTracker.track(); + } +} +const Zr = Symbol("isTiledFeature"); +class Wi extends ct { + constructor(e) { + const s = Wi.getDefaultOptions(); + super({ + projection: s.projection, + ...e + }); + /** + * Feature Store layers have feature UUIDs by design + */ + h(this, "hasFeatureUUID", !0); + h(this, "layerId"); + h(this, "staticRepresentation"); + h(this, "hiddenStaticFeatureIds"); + h(this, "changeTracker"); + h(this, "vcsMeta"); + h(this, "screenSpaceErrorMobile"); + h(this, "screenSpaceError"); + h(this, "featureVisibility"); + h(this, "_removeVectorPropertiesChangeHandler"); + /** + * Synchronize featureVisibilities, while maintaining static features hidden. + */ + h(this, "_featureVisibilitySyncListeners"); + /** + * a function to retrieve a single feature from the server + */ + // eslint-disable-next-line class-methods-use-this + h(this, "injectedFetchDynamicFeatureFunc", () => { + throw new Error("Missing get dynamic feature"); + }); + h(this, "_staticFeatureVisibility", new qa()); + h(this, "_setEditing", null); + h(this, "_twoDimLoaded", null); + h(this, "_twoDimStyleChanged", null); + h(this, "_twoDimStaticSource", new Tr()); + this._supportedMaps = [ + B.className, + Pe.className, + Ae.className + ], this.layerId = e.id, this.staticRepresentation = e.staticRepresentation || s.staticRepresentation || {}, this.hiddenStaticFeatureIds = new Set(e.hiddenStaticFeatureIds || s.hiddenStaticFeatureIds), this.changeTracker = new qw(this); + const { vcsMeta: r } = s; + if (e.vcsMeta && Object.assign(r, e.vcsMeta), this.vcsMeta = r, this.setVcsMeta(this.vcsMeta), this.screenSpaceErrorMobile = this.vcsMeta.screenSpaceError, this.screenSpaceError = this.vcsMeta.screenSpaceError, this._removeVectorPropertiesChangeHandler = this.vectorProperties.propertyChanged.addEventListener(() => { + this.changeTracker.changed.raiseEvent(); + }), this.injectedFetchDynamicFeatureFunc = e.injectedFetchDynamicFeatureFunc ?? this.injectedFetchDynamicFeatureFunc, this.featureVisibility = e.featureVisibility ?? new Uw(this.changeTracker), this._featureVisibilitySyncListeners = [ + iv(this.featureVisibility, this._staticFeatureVisibility), + this._staticFeatureVisibility.changed.addEventListener(({ action: n }) => { + n === fe.SHOW && this._staticFeatureVisibility.hideObjects([ + ...this.hiddenStaticFeatureIds + ]); + }) + ], e.features) { + const n = { + type: "FeatureCollection", + features: e.features, + vcsMeta: e.vcsMeta + }, { style: a, features: o } = Hi(n, { + targetProjection: W, + dynamicStyle: !0 + }); + a && (this._defaultStyle = a, this.setStyle(a)), this.addFeatures(o); + } + } + static get className() { + return "FeatureStoreLayer"; + } + static getDefaultOptions() { + return { + id: "", + type: "FeatureStoreLayer", + featureType: "simple", + features: [], + ...ct.getDefaultOptions(), + featureVisibility: void 0, + projection: W.toJSON(), + staticRepresentation: {}, + hiddenStaticFeatureIds: [], + vcsMeta: { + version: xi, + screenSpaceError: 4, + altitudeMode: "clampToGround" + } + }; + } + initialize() { + return this.initialized ? super.initialize() : super.initialize().then(() => { + this._staticFeatureVisibility.hideObjects([ + ...this.hiddenStaticFeatureIds + ]); + }); + } + _loadTwoDim() { + if (!this.staticRepresentation.twoDim) + return Promise.resolve(); + const { twoDim: e } = this.staticRepresentation; + return this._twoDimLoaded || (this._twoDimLoaded = (async () => { + const s = await ms(e, { + headers: this.headers + }), { features: r } = Hi(s, { + targetProjection: W, + dynamicStyle: !0 + }), n = this.style instanceof tt; + r.forEach((a) => { + a[J] = this.name, a[Zr] = !0, n && a[yt] && a.setStyle(), this._setEditing && this._setEditing.featureType != null && (a[this._setEditing.symbol] = this._setEditing.featureType); + }), this._twoDimStaticSource.addFeatures(r); + })()), this._twoDimLoaded; + } + _getTwoDimStaticImplOptions() { + return { + ...super.getImplementationOptions(), + source: this._twoDimStaticSource, + featureVisibility: this._staticFeatureVisibility + }; + } + createImplementationsForMap(e) { + const s = super.createImplementationsForMap(e); + return e instanceof B && this.staticRepresentation && this.staticRepresentation.threeDim ? s.push(new ns(e, { + url: this.staticRepresentation.threeDim, + tilesetOptions: { + maximumScreenSpaceError: hs() ? this.screenSpaceErrorMobile : this.screenSpaceError, + url: this.staticRepresentation.threeDim + }, + tilesetProperties: [ + { + key: Zr, + value: !0 + } + ], + name: this.name, + style: this.style, + featureVisibility: this._staticFeatureVisibility, + globalHider: this.globalHider, + splitDirection: we.NONE, + headers: this.headers + })) : this.staticRepresentation && this.staticRepresentation.twoDim && (this._loadTwoDim(), e instanceof Pe ? s.push(new ju(e, this._getTwoDimStaticImplOptions())) : e instanceof Ae && s.push(new wd(e, this._getTwoDimStaticImplOptions()))), s; + } + reload() { + return this._twoDimLoaded = null, this._twoDimStaticSource.clear(), super.reload(); + } + async activate() { + await super.activate(), this.active && this._setEditing && this.setEditing(this._setEditing.symbol, this._setEditing.featureType); + } + _trackStyleChanges() { + if (super._trackStyleChanges(), this.staticRepresentation.twoDim) { + this._twoDimStyleChanged && (this._twoDimStyleChanged(), this._twoDimStyleChanged = null); + const e = this.style instanceof tt; + this._twoDimStyleChanged = this.style.styleChanged.addEventListener(() => { + this._twoDimStaticSource.getFeatures().forEach((s) => { + (e || !s[yt]) && s.changed(); + }); + }); + } + } + setStyle(e, s) { + const r = this.changeTracker.active; + r && this.changeTracker.pauseTracking("changefeature"), super.setStyle(e, s); + const n = this.style instanceof tt; + this._twoDimStaticSource.getFeatures().forEach((a) => { + if (a[yt]) { + let o; + n ? (o = !0, a.setStyle(void 0)) : a.getStyle() !== a[yt].style && (o = !0, a.setStyle(a[yt].style)), o && Reflect.has(a, Mi) && Al(a); + } + }), r && (this.changeTracker.track(), this.changeTracker.changed.raiseEvent()); + } + setEditing(e, s) { + this.getImplementations().forEach((r) => { + r instanceof ns && (r.initialized ? (s != null ? r.cesium3DTileset[e] = s : delete r.cesium3DTileset[e], this._setEditing = null) : this._setEditing = { symbol: e, featureType: s }); + }), this.staticRepresentation.twoDim && (this._twoDimLoaded ? this._twoDimLoaded.then(() => { + this._twoDimStaticSource.getFeatures().forEach((r) => { + s != null ? r[e] = s : delete r[e]; + }); + }).catch((r) => { + this.getLogger().error(`failed to set two dims editing: ${String(r)}`); + }) : this._setEditing = { symbol: e, featureType: s }); + } + getZoomToExtent() { + if (this.extent && this.extent.isValid()) + return this.extent; + const e = super.getZoomToExtent(), s = e ? e.getCoordinatesInProjection(W) : zs(); + if (this.staticRepresentation.threeDim) { + const n = this.getImplementations().find((a) => a instanceof ns && a.cesium3DTileset); + if (n != null && n.cesium3DTileset) { + const a = Id(n.cesium3DTileset); + Ar(s, a); + } + } + this.staticRepresentation.twoDim && this._twoDimLoaded && Ar(s, this._twoDimStaticSource.getExtent()); + const r = new be({ + projection: W.toJSON(), + coordinates: s + }); + return r.isValid() ? r : null; + } + /** + * set the maximum screen space error of this layer + */ + setMaximumScreenSpaceError(e) { + hs() ? this.screenSpaceErrorMobile = e : this.screenSpaceError = e, this.getImplementations().forEach((s) => { + s instanceof ns && s.cesium3DTileset && (s.cesium3DTileset.maximumScreenSpaceError = e); + }); + } + /** + * switch an array of static features to dynamic features + * This is done by hiding the static features and adding their dynamic counterparts to the FeatureStoreLayer layer + * @param [featureId] input static feature ID + */ + switchStaticFeatureToDynamic(e) { + return this.hiddenStaticFeatureIds.has(e) ? Promise.resolve(this.getFeatureById(e)) : this.injectedFetchDynamicFeatureFunc ? this.injectedFetchDynamicFeatureFunc(e).then((s) => { + const { features: r } = Hi(s, { + targetProjection: W, + defaultStyle: this.defaultStyle instanceof ge ? this.defaultStyle : gs + }); + return this._staticFeatureVisibility.hideObjects([e]), this.hiddenStaticFeatureIds.add(e), this.addFeatures(r), r[0]; + }).catch((s) => { + this.getLogger().error(s.message); + }) : Promise.reject(new Error("no injected fetching function")); + } + /** + * removes a static feature from featureStore layer + * @param featureId + */ + removeStaticFeature(e) { + this._staticFeatureVisibility.hideObjects([e]), this.hiddenStaticFeatureIds.add(e); + const s = new ue(); + s.setId(e), s[Bt] = "static", this.changeTracker.removeFeature(s); + } + /** + * Resets a feature which used to be static but is now dynamic. called from featureStoreChanges API. + * @param featureId + */ + resetStaticFeature(e) { + if (this.hiddenStaticFeatureIds.has(e)) { + const s = [e]; + this.removeFeaturesById(s), this.hiddenStaticFeatureIds.delete(e), this.featureVisibility.hiddenObjects[e] || this._staticFeatureVisibility.showObjects(s); + } + } + toJSON() { + const e = super.toJSON(), s = Wi.getDefaultOptions(); + delete e.projection; + const r = this.vectorProperties.getVcsMeta({ + ...Gt.getDefaultOptions(), + ...s.vcsMeta + }); + return Object.keys(r).length > 0 && (e.vcsMeta = { ...r, version: xi }), this.vcsMeta.screenSpaceError !== s.vcsMeta.screenSpaceError && (e.vcsMeta = e.vcsMeta || { version: xi }, e.vcsMeta.screenSpaceError = this.vcsMeta.screenSpaceError), Object.keys(this.staticRepresentation).length > 0 && (e.staticRepresentation = { ...this.staticRepresentation }), this.hiddenStaticFeatureIds.size > 0 && (e.hiddenStaticFeatureIds = [...this.hiddenStaticFeatureIds]), e; + } + destroy() { + this.removeAllFeatures(), this._twoDimStaticSource.clear(), this._twoDimStyleChanged && (this._twoDimStyleChanged(), this._twoDimStyleChanged = null), this._featureVisibilitySyncListeners.forEach((e) => { + e(); + }), this._featureVisibilitySyncListeners = [], this._staticFeatureVisibility.destroy(), this.changeTracker.destroy(), this._removeVectorPropertiesChangeHandler && this._removeVectorPropertiesChangeHandler(), super.destroy(); + } +} +ke.registerClass(Wi.className, Wi); +const To = Symbol("featureFromOptions"); +class Jr extends ct { + constructor(e) { + const s = Jr.getDefaultOptions(); + super({ + projection: s.projection, + ...e + }); + h(this, "_dataFetchedPromise", null); + h(this, "_featuresToLoad"); + this._featuresToLoad = e.features || s.features; + } + static get className() { + return "GeoJSONLayer"; + } + static getDefaultOptions() { + return { + ...ct.getDefaultOptions(), + projection: de.toJSON(), + features: void 0 + }; + } + async initialize() { + return this.initialized || await this.fetchData(), super.initialize(); + } + async reload() { + if (this._dataFetchedPromise) { + const e = this.getFeatures().filter((s) => s[To]); + this.removeAllFeatures(), this.source.addFeatures(e), this._dataFetchedPromise = null, await this.fetchData(); + } + return super.reload(); + } + /** + * Fetches the data for the layer. If data is already fetched returns a resolved Promise + */ + fetchData() { + if (this._dataFetchedPromise) + return this._dataFetchedPromise; + if (Array.isArray(this._featuresToLoad) && (this._parseGeojsonData({ + type: "FeatureCollection", + features: this._featuresToLoad + }), this.getFeatures().forEach((e) => { + e[To] = !0; + }), this._featuresToLoad = void 0), this.url) { + const e = qt(this.url, this.headers); + this._dataFetchedPromise = ms(this.url, e).then((s) => this._parseGeojsonData(s)).catch((s) => (this.getLogger().warning(`Could not send request for loading layer content (${String(s)})`), Promise.reject(s))); + } else + this._dataFetchedPromise = Promise.resolve(); + return this._dataFetchedPromise; + } + _parseGeojsonData(e) { + const s = Hi(e, { + dataProjection: this.projection, + dynamicStyle: !0 + }); + if (this.addFeatures(s.features), s.style && this.setStyle(s.style), s.vcsMeta) { + const r = { ...s.vcsMeta, ...this.vectorProperties.getVcsMeta() }; + this.setVcsMeta(r); + } + } + toJSON() { + const e = super.toJSON(), s = Jr.getDefaultOptions(), r = new z(s.projection); + if (this.projection.equals(r) ? delete e.projection : e.projection = this.projection.toJSON(), Array.isArray(this._featuresToLoad)) + e.features = this._featuresToLoad.slice(); + else { + const n = this.getFeatures().filter((a) => a[To]); + n.length > 0 && (e.features = n.map((a) => Xr(a, { writeStyle: !0, writeId: !0 }))); + } + return e; + } + destroy() { + super.destroy(), this._featuresToLoad = []; + } +} +ke.registerClass(Jr.className, Jr); +class Sn extends Ua { + constructor(e, s) { + super(e, s); + h(this, "minLevel"); + h(this, "maxLevel"); + h(this, "minRenderingLevel"); + h(this, "maxRenderingLevel"); + h(this, "tilingSchema"); + h(this, "extent"); + h(this, "opacity"); + this.minLevel = s.minLevel, this.maxLevel = s.maxLevel, this.minRenderingLevel = s.minRenderingLevel, this.maxRenderingLevel = s.maxRenderingLevel, this.tilingSchema = s.tilingSchema, this.extent = s.extent, this.opacity = s.opacity; + } + static get className() { + return "RasterLayerOpenlayersImpl"; + } + updateOpacity(e) { + this.opacity = e, this.initialized && this.olLayer.setOpacity(this.opacity); + } +} +class Ww extends Sn { + static get className() { + return "OpenStreetMapOpenlayersImpl"; + } + getOLLayer() { + return new Ws({ + opacity: this.opacity, + source: new Cf({ + maxZoom: this.maxLevel + }), + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel + }); + } +} +class Kr extends st { + constructor(e) { + super(e); + h(this, "_splitDirection"); + h(this, "_opacity"); + /** + * raised if the split direction changes, is passed the split direction as its only argument + */ + h(this, "splitDirectionChanged", new L()); + /** + * The maximum level to load. + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "maxLevel"); + /** + * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`. + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "minRenderingLevel"); + /** + * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`. + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "maxRenderingLevel"); + /** + * can be used to forward options to the cesium ImageryLayer + * @see https://cesium.com/learn/cesiumjs/ref-doc/ImageryLayer.html#.ConstructorOptions + * Changes requires calling layer.redraw() to take effect. + */ + h(this, "imageryLayerOptions"); + h(this, "_supportedMaps", [B.className, Pe.className]); + const s = Kr.getDefaultOptions(); + this._splitDirection = we.NONE, e.splitDirection && (this._splitDirection = e.splitDirection === "left" ? we.LEFT : we.RIGHT), this._opacity = ma(e.opacity, s.opacity, 0, 1), this.maxLevel = ne(e.maxLevel, s.maxLevel), this.minRenderingLevel = ne(e.minRenderingLevel, s.minRenderingLevel), this.maxRenderingLevel = ne(e.maxRenderingLevel, s.maxRenderingLevel), this.imageryLayerOptions = structuredClone(e.imageryLayerOptions); + } + static get className() { + return "OpenStreetMapLayer"; + } + static getDefaultOptions() { + return { + ...st.getDefaultOptions(), + splitDirection: void 0, + opacity: 1, + maxLevel: 19, + minRenderingLevel: void 0, + maxRenderingLevel: void 0 + }; + } + get splitDirection() { + return this._splitDirection; + } + set splitDirection(e) { + e !== this._splitDirection && (this._splitDirection = e, this.getImplementations().forEach((s) => { + s.updateSplitDirection(this._splitDirection); + }), this.splitDirectionChanged.raiseEvent(this._splitDirection)); + } + /** + * The opacity between 0 (fully transparent) and 1 (fully opaque) + */ + get opacity() { + return this._opacity; + } + set opacity(e) { + const s = ma(e, this._opacity, 0, 1); + this._opacity !== s && (this._opacity = s, this.getImplementations().forEach((r) => { + r.updateOpacity(s); + })); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + opacity: this.opacity, + splitDirection: this.splitDirection, + minLevel: 0, + maxLevel: this.maxLevel, + minRenderingLevel: this.minRenderingLevel, + maxRenderingLevel: this.maxRenderingLevel, + tilingSchema: it.GEOGRAPHIC, + imageryLayerOptions: this.imageryLayerOptions + }; + } + createImplementationsForMap(e) { + return e instanceof Pe ? [ + new Ww(e, this.getImplementationOptions()) + ] : e instanceof B ? [ + new xw(e, this.getImplementationOptions()) + ] : []; + } + toJSON() { + const e = super.toJSON(), s = Kr.getDefaultOptions(); + return this._splitDirection !== we.NONE && (e.splitDirection = this._splitDirection === we.RIGHT ? "right" : "left"), this.opacity !== s.opacity && (e.opacity = this.opacity), this.maxLevel !== s.maxLevel && (e.maxLevel = this.maxLevel), this.minRenderingLevel !== s.minRenderingLevel && (e.minRenderingLevel = this.minRenderingLevel), this.maxRenderingLevel !== s.maxRenderingLevel && (e.maxRenderingLevel = this.maxRenderingLevel), this._splitDirection !== we.NONE && (e.splitDirection = this._splitDirection === we.RIGHT ? "right" : "left"), this.imageryLayerOptions !== s.imageryLayerOptions && (e.imageryLayerOptions = structuredClone(this.imageryLayerOptions)), e; + } + destroy() { + this.splitDirectionChanged.destroy(), super.destroy(); + } +} +ke.registerClass(Kr.className, Kr); +class Yw extends Sn { + constructor(e, s) { + super(e, s); + h(this, "credit"); + this.credit = s.credit; + } + static get className() { + return "SingleImageOpenlayersImpl"; + } + /** + * returns the ol Layer + */ + getOLLayer() { + const e = { + attributions: this.credit, + url: this.url, + projection: "EPSG:4326", + imageExtent: this.extent.getCoordinatesInProjection(de) + }; + return fi.contains(e.url) ? e.crossOrigin = "use-credentials" : gi(this.url) || (e.crossOrigin = "anonymous"), this.headers && (e.imageLoadFunction = (s, r) => { + const n = qt(r, this.headers); + Vl(r, n).then((a) => { + const o = s.getImage(); + o.src = a, o.onload = () => { + URL.revokeObjectURL(a); + }; + }).catch(() => { + s.handleImageError_(); + }); + }), new Bc({ + source: new Mf(e), + opacity: this.opacity, + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel + }); + } +} +class W1 extends Ua { + static get className() { + return "TileDebugOpenlayersImpl"; + } + // eslint-disable-next-line class-methods-use-this + getOLLayer() { + return new Ws({ + source: new xf() + }); + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + updateStyle(t, e) { + } + // eslint-disable-next-line class-methods-use-this,no-unused-vars + updateTiles(t) { + } +} +class Xw extends Sn { + /** + * @param map + * @param options + */ + constructor(e, s) { + super(e, s); + h(this, "format"); + h(this, "tileSize"); + this.format = s.format, this.tileSize = s.tileSize; + } + static get className() { + return "TmsOpenlayersImpl"; + } + getOLLayer() { + const e = { + tileUrlFunction: (r) => { + const n = this.url.replace(/\/$/, ""), a = (1 << r[0]) - r[2] - 1; + return `${n}/${r[0]}/${r[1]}/${a}.${this.format}`; + }, + tileSize: this.tileSize, + minZoom: this.minLevel, + maxZoom: this.maxLevel, + wrapX: !1 + }; + fi.contains(this.url) ? e.crossOrigin = "use-credentials" : gi(this.url) || (e.crossOrigin = "anonymous"), this.tilingSchema === it.GEOGRAPHIC && (e.projection = "EPSG:4326"), this.headers && (e.tileLoadFunction = Xa(this.headers)); + const s = { + source: new Ef(e), + opacity: this.opacity, + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel + }; + return this.extent && this.extent.isValid() && (s.extent = this.extent.getCoordinatesInProjection(W)), new Ws(s); + } +} +class Zw extends Ua { + constructor(e, s) { + super(e, s); + h(this, "tileProvider"); + h(this, "source"); + h(this, "tileSize"); + h(this, "minLevel"); + h(this, "maxLevel"); + h(this, "extent"); + h(this, "declutter"); + this.tileProvider = s.tileProvider, this.tileSize = s.tileSize, this.minLevel = s.minLevel, this.maxLevel = s.maxLevel, this.extent = s.extent, this.declutter = s.declutter; + } + static get className() { + return "VectorTileOpenlayersImpl"; + } + getOLLayer() { + this.source = new Of({ + minZoom: 0, + maxZoom: 26, + tileSize: this.tileSize, + tileLoadFunction: (a) => { + this.tileProvider.getFeaturesForTile(a.tileCoord[1], a.tileCoord[2], a.tileCoord[0], this.headers).then((o) => { + o.length > 0 ? a.setFeatures(o) : (a.setFeatures([]), a.setState(Rc.EMPTY)); + }).catch((o) => { + this.getLogger().error(o.message); + }); + }, + // url needs to be set for the tileLoadFunction to work. + url: "/{z}/{x}/{y}" + }); + const e = this.extent && this.extent.isValid() ? this.extent.getCoordinatesInProjection(W) : void 0, s = this.minLevel ? this.minLevel : void 0, r = this.maxLevel ? this.maxLevel + 1 : void 0; + return new bf({ + visible: !1, + source: this.source, + renderBuffer: 200, + renderMode: "hybrid", + declutter: this.declutter, + extent: e, + minZoom: s, + maxZoom: r + }); + } + /** + * refreshes the openlayers Layer, which will redraw the scene, seems to magically work + */ + updateTiles(e) { + var s; + e.length > 0 && ((s = this.olLayer) == null || s.changed()); + } + // eslint-disable-next-line no-unused-vars + updateStyle(e, s) { + var r; + this.initialized && ((r = this.olLayer) == null || r.changed()); + } + setVisibility(e) { + this.initialized && this.olLayer.setVisible(e); + } + destroy() { + this.source && (this.source.clear(), this.source = null), this.tileProvider = null, super.destroy(); + } +} +class Jw extends Sn { + constructor(e, s) { + super(e, s); + h(this, "parameters"); + h(this, "version"); + h(this, "tileSize"); + h(this, "singleImage2d"); + this.parameters = s.parameters, this.version = s.version, this.tileSize = s.tileSize, this.singleImage2d = s.singleImage2d; + } + static get className() { + return "WmsOpenlayersImpl"; + } + getOLLayer() { + return this.singleImage2d ? new Bc({ + extent: this.extent.getCoordinatesInProjection(W), + visible: !1, + source: gw({ + url: this.url, + parameters: this.parameters, + tilingSchema: this.tilingSchema, + version: this.version, + headers: this.headers + }), + opacity: this.opacity, + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel + }) : new Ws({ + visible: !1, + source: Ld({ + url: this.url, + parameters: this.parameters, + version: this.version, + extent: this.extent, + tileSize: this.tileSize, + minLevel: this.minLevel, + maxLevel: this.maxLevel, + tilingSchema: this.tilingSchema, + headers: this.headers + }), + opacity: this.opacity, + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel + }); + } +} +class Kw extends Sn { + constructor(e, s) { + super(e, s); + h(this, "layer"); + h(this, "style"); + h(this, "format"); + h(this, "tileMatrixSetID"); + h(this, "tileSize"); + h(this, "numberOfLevelZeroTilesX"); + h(this, "numberOfLevelZeroTilesY"); + h(this, "matrixIds"); + h(this, "openlayersOptions"); + this.layer = s.layer, this.style = s.style, this.format = s.format, this.tileMatrixSetID = s.tileMatrixSetID, this.tileSize = s.tileSize, this.numberOfLevelZeroTilesX = s.numberOfLevelZeroTilesX, this.numberOfLevelZeroTilesY = s.numberOfLevelZeroTilesY, this.matrixIds = s.matrixIds, this.openlayersOptions = s.openlayersOptions; + } + static get className() { + return "WmtsOpenlayersImpl"; + } + getOLLayer() { + const e = this.tilingSchema === it.GEOGRAPHIC ? de : W, s = e.proj.getExtent(); + let r = zo(s) / this.tileSize[0]; + this.numberOfLevelZeroTilesX > 1 && (r /= this.numberOfLevelZeroTilesX), this.tilingSchema === it.GEOGRAPHIC && (r = zo(s) / (this.tileSize[0] * 2)); + const n = this.maxLevel + 1, a = new Array(n).fill(void 0).map((f, g) => r / 2 ** g), o = this.extent.getCoordinatesInProjection(e), l = { + origin: ka(s), + extent: o, + resolutions: a, + matrixIds: this.matrixIds, + tileSize: this.tileSize + }; + if (this.numberOfLevelZeroTilesX > 1 || this.numberOfLevelZeroTilesY > 1) { + const f = []; + let g = this.numberOfLevelZeroTilesX, m = this.numberOfLevelZeroTilesY; + for (let p = 0; p <= n; p++) + f.push([g, m]), g *= 2, m *= 2; + l.sizes = f; + } + const c = new Pf(l), d = this.url.indexOf("{") >= 0 ? "REST" : "KVP", u = { + tileGrid: c, + requestEncoding: d, + layer: this.layer, + style: this.style, + format: this.format, + matrixSet: this.tileMatrixSetID, + url: this.url + }; + return fi.contains(this.url) ? u.crossOrigin = "use-credentials" : gi(this.url) || (u.crossOrigin = "anonymous"), this.tilingSchema === it.GEOGRAPHIC && (u.projection = "EPSG:4326"), this.headers && (u.tileLoadFunction = Xa(this.headers)), Object.assign(u, this.openlayersOptions), new Ws({ + opacity: this.opacity, + minZoom: this.minRenderingLevel, + maxZoom: this.maxRenderingLevel, + source: new Lf(u) + }); + } +} +class Qr extends di { + constructor(e) { + super(e); + /** + * The default point size to fall back on, if no point size is given. Uses Cesium default of 1 if null. + */ + h(this, "defaultPointSize"); + h(this, "_pointSize"); + h(this, "_supportedMaps", [B.className]); + const s = Qr.getDefaultOptions(); + this.defaultPointSize = e.pointSize != null ? e.pointSize : s.pointSize, this._pointSize = this.defaultPointSize; + } + static get className() { + return "PointCloudLayer"; + } + static getDefaultOptions() { + return { + ...di.getDefaultOptions(), + pointSize: void 0 + }; + } + getStyleOrDefaultStyle(e, s) { + return super.getStyleOrDefaultStyle(e, s || Bu); + } + get pointSize() { + return this._pointSize; + } + set pointSize(e) { + S(e, ie(je(Number, String))), this._pointSize = e, this.style.pointSize = e == null ? void 0 : e.toString(); + } + async initialize() { + await super.initialize(), this.pointSize = this._pointSize; + } + createImplementationsForMap(e) { + return e instanceof B ? [ + new ns(e, this.getImplementationOptions()) + ] : []; + } + /** + * Clears the style of this layer resets the point size to the defaultPointSize + */ + clearStyle() { + super.clearStyle(), this.pointSize = this.defaultPointSize; + } + /** + * Sets a new declarative style. Cannot set a VectorLayer style on PointCloudLayer layers. + */ + setStyle(e, s) { + e instanceof ge ? this.getLogger().warning("trying to apply vector style to point cloud layer.") : super.setStyle(e, s); + } + toJSON() { + const e = super.toJSON(), s = Qr.getDefaultOptions(); + return this.defaultPointSize !== s.pointSize && (e.pointSize = this.defaultPointSize), e; + } +} +ke.registerClass(Qr.className, Qr); +class ba extends Dt { + constructor(e) { + super(e); + h(this, "credit"); + const s = ba.getDefaultOptions(); + this.credit = e.credit || s.credit, this.extent.isValid() || (this.getLogger().warning(`layer ${this.name} was constructed with an invalid extent, defaulting to global extent`), this.extent = new be({ + projection: de.toJSON(), + coordinates: [-180, -90, 180, 90] + })), this._supportedMaps = [B.className, Pe.className]; + } + static get className() { + return "SingleImageLayer"; + } + static getDefaultOptions() { + return { + ...Dt.getDefaultOptions(), + credit: void 0 + }; + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + credit: this.credit + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [new Ew(e, this.getImplementationOptions())] : e instanceof Pe ? [ + new Yw(e, this.getImplementationOptions()) + ] : []; + } + /** + * sets the image extent + * @param extent + */ + setExtent(e) { + if (S(e, be), !e.isValid()) + throw new Error("Cannot set invalid extent"); + this.extent = e, this.forceRedraw(); + } + toJSON() { + const e = super.toJSON(); + return delete e.tilingSchema, this.credit && (e.credit = this.credit), e; + } +} +ke.registerClass(ba.className, ba); +class en extends st { + constructor(e) { + super(e); + h(this, "_supportedMaps", [B.className]); + h(this, "requestVertexNormals"); + h(this, "requestWaterMask"); + const s = en.getDefaultOptions(); + this.requestVertexNormals = ce(e.requestVertexNormals, s.requestVertexNormals), this.requestWaterMask = ce(e.requestWaterMask, s.requestWaterMask); + } + static get className() { + return "TerrainLayer"; + } + static getDefaultOptions() { + return { + ...st.getDefaultOptions(), + requestVertexNormals: !0, + requestWaterMask: !1 + }; + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + requestVertexNormals: this.requestVertexNormals, + requestWaterMask: this.requestWaterMask + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [new Ow(e, this.getImplementationOptions())] : []; + } + /** + * getHeight for coordinates + * @param coords - the height is added to the coordinates in place + */ + async getHeightForWGS84Coordinates(e) { + const s = await Ur(this.url, { + requestVertexNormals: this.requestVertexNormals, + requestWaterMask: this.requestWaterMask + }, this.headers); + return Qs(s, e, void 0, e); + } + toJSON() { + const e = super.toJSON(), s = en.getDefaultOptions(); + return this.requestVertexNormals !== s.requestVertexNormals && (e.requestVertexNormals = this.requestVertexNormals), this.requestWaterMask !== s.requestWaterMask && (e.requestWaterMask = this.requestWaterMask), e; + } +} +ke.registerClass(en.className, en); +function Qw(i, t) { + return new Promise((e) => { + var n; + let s; + const r = ((n = i.cesium3DTileset) == null ? void 0 : n.allTilesLoaded.addEventListener(() => { + s && clearTimeout(s), r(), e(); + })) ?? (() => { + }); + t != null && (s = setTimeout(() => { + r(), e(); + }, t)); + }); +} +async function Y1(i, t) { + const e = i.getImplementations().filter((s) => s instanceof ns); + !i.active || e.every((s) => { + var r; + return (r = s.cesium3DTileset) == null ? void 0 : r.tilesLoaded; + }) || await Promise.all(e.map((s) => Qw(s, t))); +} +function X1(i, t) { + return i.tilesLoaded ? Promise.resolve() : new Promise((e) => { + let s; + const r = i.tileLoadProgressEvent.addEventListener((n) => { + n < 1 && (s && clearTimeout(s), r(), e()); + }); + t != null && (s = setTimeout(() => { + r(), e(); + }, t)); + }); +} +function Td(i, t, e, s, r, n = "en") { + let a = i; + if (r) { + const o = Et.southwest(r), l = Et.northeast(r), c = b.toDegrees(o.longitude), d = b.toDegrees(o.latitude), u = b.toDegrees(l.longitude), f = b.toDegrees(l.latitude); + a = a.replace(/\{minx\}/, String(c)).replace(/\{miny\}/, String(d)).replace(/\{maxx\}/, String(u)).replace(/\{maxy\}/, String(f)); + } + return a = a.replace(/\{x\}/, String(t)).replace(/\{y\}/, String(e)).replace(/\{z\}/, String(s)).replace(/\{locale\}/, n), a; +} +class Pa extends ut { + constructor(e) { + const s = Pa.getDefaultOptions(); + super(e); + h(this, "url"); + this.url = e.url || s.url; + } + static get className() { + return "URLTemplateTileProvider"; + } + static getDefaultOptions() { + return { + ...ut.getDefaultOptions(), + url: "" + }; + } + get locale() { + return super.locale; + } + /** + * sets the locale and clears the Cache if the URL is a locale aware Object. + */ + set locale(e) { + this.locale !== e && (super.locale = e, this.url.includes("{locale}") && this.clearCache()); + } + async loader(e, s, r, n) { + const a = this.tilingScheme.tileXYToRectangle(e, s, r), o = Td(this.url, e, s, r, a, this.locale), l = qt(this.url, n), c = await ms(o, l), { features: d } = Hi(c, { dynamicStyle: !0 }); + return d; + } + toJSON() { + const e = super.toJSON(); + return this.url && (e.url = this.url), e; + } +} +Js.registerClass(Pa.className, Pa); +class La extends ut { + constructor(e) { + const s = La.getDefaultOptions(); + super(e); + h(this, "url"); + h(this, "_MVTFormat", new If({ featureClass: ue })); + this.url = e.url || s.url; + } + static get className() { + return "MVTTileProvider"; + } + static getDefaultOptions() { + return { + ...ut.getDefaultOptions(), + url: "" + }; + } + get locale() { + return super.locale; + } + /** + * sets the locale and clears the Cache if the URL is a locale aware Object. + */ + set locale(e) { + this.locale !== e && (super.locale = e, this.url.includes("{locale}") && this.clearCache()); + } + async loader(e, s, r, n) { + const a = this.tilingScheme.tileXYToRectangle(e, s, r), o = Td(this.url, e, s, r, a, this.locale), l = Ul(a), c = cs(l), d = qt(this.url, n), u = await kS(o, d), f = this._MVTFormat.readFeatures(u), g = (l[2] - l[0]) / 4096, m = -((l[3] - l[1]) / 4096); + return f.forEach((p) => { + const v = p.getGeometry().getFlatCoordinates(), w = v.length; + for (let C = 0; C < w; C++) + C % 2 ? (v[C] = (v[C] - 2048) * m, v[C] += c[1]) : (v[C] = (v[C] - 2048) * g, v[C] += c[0]); + }), f; + } + toJSON() { + const e = super.toJSON(); + return this.url && (e.url = this.url), e; + } +} +Js.registerClass(La.className, La); +class Ia extends ut { + constructor(e) { + const s = Ia.getDefaultOptions(); + super({ ...e, baseLevels: s.baseLevels }); + h(this, "url"); + this.url = e.url || s.url; + } + static get className() { + return "StaticGeoJSONTileProvider"; + } + static getDefaultOptions() { + return { + ...ut.getDefaultOptions(), + url: "", + baseLevels: [0] + }; + } + // eslint-disable-next-line no-unused-vars + async loader(e, s, r, n) { + const a = qt(this.url, n), o = await ms(this.url, a), { features: l } = Hi(o, { dynamicStyle: !0 }); + return l; + } + toJSON() { + const e = super.toJSON(); + return delete e.baseLevels, this.url && (e.url = this.url), e; + } +} +Js.registerClass(Ia.className, Ia); +class Ad extends ut { + constructor(e) { + const s = Ad.getDefaultOptions(); + super({ ...e, baseLevels: [0] }); + h(this, "_features"); + this._features = e.features || s.features; + } + static get className() { + return "StaticFeatureTileProvider"; + } + static getDefaultOptions() { + return { + ...ut.getDefaultOptions(), + features: [] + }; + } + // eslint-disable-next-line no-unused-vars + loader(e, s, r, n) { + return Promise.resolve(this._features); + } + toJSON() { + const e = super.toJSON(); + return delete e.baseLevels, { + ...structuredClone(e), + features: this._features + }; + } + destroy() { + this._features = [], super.destroy(); + } +} +class tn extends Dt { + constructor(e) { + const s = tn.getDefaultOptions(); + super({ tilingSchema: s.tilingSchema, ...e }); + h(this, "format"); + h(this, "tileSize"); + this._supportedMaps = [Pe.className, B.className], this.format = e.format || s.format, this.tileSize = Array.isArray(e.tileSize) ? e.tileSize.slice() : s.tileSize; + } + static get className() { + return "TMSLayer"; + } + static getDefaultOptions() { + return { + ...Dt.getDefaultOptions(), + tilingSchema: it.MERCATOR, + format: "jpeg", + tileSize: [256, 256] + }; + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + format: this.format, + tileSize: this.tileSize + }; + } + createImplementationsForMap(e) { + return e instanceof Pe ? [new Xw(e, this.getImplementationOptions())] : e instanceof B ? [new bw(e, this.getImplementationOptions())] : []; + } + toJSON() { + var r; + const e = super.toJSON(), s = tn.getDefaultOptions(); + return this.tilingSchema !== s.tilingSchema ? e.tilingSchema = this.tilingSchema : delete e.tilingSchema, this.format !== s.format && (e.format = this.format), (this.tileSize[0] !== ((r = s == null ? void 0 : s.tileSize) == null ? void 0 : r[0]) || this.tileSize[1] !== s.tileSize[1]) && (e.tileSize = this.tileSize.slice()), e; + } +} +ke.registerClass(tn.className, tn); +class eC extends es { + constructor(e, s) { + super(e, s); + h(this, "_quadtreeProvider"); + h(this, "_quadtreePrimitive"); + h(this, "_primitiveCollection", new $t()); + this._quadtreeProvider = new jw(e, this._primitiveCollection, s), this._quadtreePrimitive = new Cg({ + tileProvider: this._quadtreeProvider + }), this._primitiveCollection.add(this._quadtreePrimitive), this._primitiveCollection[J] = this.name, this._primitiveCollection.show = !1; + } + static get className() { + return "VectorTileCesiumImpl"; + } + updateTiles(e, s) { + s || this._quadtreePrimitive.invalidateAllTiles(); + } + async initialize() { + this.initialized || this.map.addPrimitiveCollection(this._primitiveCollection), await super.initialize(); + } + async activate() { + return this._primitiveCollection.show = !0, super.activate(); + } + deactivate() { + this._primitiveCollection.show = !1, super.deactivate(); + } + updateStyle(e, s) { + this._quadtreeProvider.updateStyle(e), this._quadtreePrimitive.invalidateAllTiles(); + } + updateSplitDirection(e) { + this._quadtreeProvider.updateSplitDirection(e), this._quadtreePrimitive.invalidateAllTiles(); + } + destroy() { + this.isDestroyed || (this._quadtreeProvider.destroy(), this._quadtreePrimitive.invalidateAllTiles(), this.map.initialized ? this.map.removePrimitiveCollection(this._primitiveCollection) : this._primitiveCollection.destroy()), super.destroy(); + } +} +function cc(i, t, e) { + const s = e.getId(); + let r = !1; + i.hiddenObjects[s] ? (e[Ct] = !0, r = !0) : e[Ct] && (delete e[Ct], r = !0), i.highlightedObjects[s] ? (e[Ie] = i.highlightedObjects[s].style, r = !0) : e[Ie] && (delete e[Ie], r = !0), t != null && t.hiddenObjects[s] ? (e[Mt] = !0, r = !0) : e[Mt] && (delete e[Mt], r = !0), r && e.changed(); +} +const tC = ["image", "primitive"]; +class sn extends Li { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "highlightStyle"); + h(this, "_tileSize", [256, 256]); + /** + * at the moment only used for allowPicking, triggers a reload on change + */ + h(this, "vectorProperties"); + h(this, "tileProvider"); + h(this, "_maxLevel"); + h(this, "_minLevel"); + h(this, "_declutter"); + h(this, "_featureVisibilityListeners", []); + // eslint-disable-next-line class-methods-use-this + h(this, "_tileLoadEventListener", () => { + }); + // eslint-disable-next-line class-methods-use-this + h(this, "_vectorPropertiesChangedListener", () => { + }); + /** + * zIndex for features with featureStyle // Do we maybe need a global counter ? + */ + h(this, "_styleZIndex", 0); + h(this, "_debug", !1); + h(this, "_renderer"); + this._supportedMaps = [B.className, Pe.className]; + const s = sn.getDefaultOptions(); + this.highlightStyle = void 0, e.highlightStyle && (this.highlightStyle = e.highlightStyle instanceof ge ? e.highlightStyle : new ge(e.highlightStyle)), this.vectorProperties = new Gt({ + allowPicking: this.allowPicking, + ...e.vectorProperties + }), this.tileProvider = e.tileProvider instanceof ut ? e.tileProvider : ei(Js, e.tileProvider ?? { type: ut.className }), this.tileProvider && (this.tileProvider.locale = this.locale), this._maxLevel = ne(e.maxLevel, s.maxLevel), this._minLevel = ne(e.minLevel, s.minLevel), this._declutter = ce(e.declutter, s.declutter), this._debug = ce(e.debug, s.debug), this._renderer = G0(e.renderer, tC, s.renderer); + } + static get className() { + return "VectorTileLayer"; + } + static getDefaultOptions() { + return { + ...Li.getDefaultOptions(), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + tileProvider: void 0, + highlightStyle: void 0, + vectorProperties: {}, + minLevel: void 0, + maxLevel: void 0, + declutter: !0, + debug: !1, + renderer: "image" + }; + } + /** + * returns the currently set locale. Can be used to provide locale specific URLs. + */ + get locale() { + return super.locale; + } + set locale(e) { + this.tileProvider && (this.tileProvider.locale = super.locale), super.locale = e; + } + async initialize() { + this.initialized || (this._tileLoadEventListener = this.tileProvider.tileLoadedEvent.addEventListener((e) => this._handleTileLoaded(e)), this._vectorPropertiesChangedListener = this.vectorProperties.propertyChanged.addEventListener(() => { + this.reload(); + }), this._renderer === "image" && (this.featureProvider = new ll(this.name, { + // XXX this overwrites + style: this.style, + tileProvider: this.tileProvider, + vectorProperties: this.vectorProperties + }))), await super.initialize(); + } + _getNextStyleZIndex() { + return this._styleZIndex += 1, this._styleZIndex; + } + _handleTileLoaded({ rtree: e }) { + e.all().map((s) => s.value).forEach((s) => { + const r = s.getStyle(); + r && r instanceof K && r.setZIndex(this._getNextStyleZIndex()), s[J] = this.name, s.getStyleFunction = () => this._featureStyle.bind(this), this.tileProvider.trackFeaturesToTiles && this.globalHider && cc(this.featureVisibility, this.globalHider, s); + }); + } + setGlobalHider(e) { + super.setGlobalHider(e), this._setupFeatureVisibilityHandlers(); + } + /** + * Sets up listeners for featureVisibility and global hider + */ + _setupFeatureVisibilityHandlers() { + this.tileProvider.trackFeaturesToTiles && (this._featureVisibilityListeners.forEach((e) => { + e(); + }), this._featureVisibilityListeners = [ + this.featureVisibility.changed.addEventListener(({ action: e, ids: s }) => { + const r = /* @__PURE__ */ new Set(); + s.forEach((n) => { + const a = this.tileProvider.featureIdToTileIds.get(n); + a && a.forEach((o) => { + const c = this.tileProvider.rtreeCache.get(o).all().find((d) => d.value.getId() === n); + if (c) { + const d = c.value; + r.add(o), e === fe.HIGHLIGHT ? d[Ie] = this.featureVisibility.highlightedObjects[n].style : e === fe.UNHIGHLIGHT ? delete d[Ie] : e === fe.HIDE ? d[Ct] = !0 : e === fe.SHOW && delete d[Ct], d.changed(); + } + }); + }), this._updateTiles([...r], !0); + }) + ], this.globalHider && this._featureVisibilityListeners.push(this.globalHider.changed.addEventListener(({ action: e, ids: s }) => { + const r = /* @__PURE__ */ new Set(); + s.forEach((n) => { + const a = this.tileProvider.featureIdToTileIds.get(n); + a && a.forEach((o) => { + const c = this.tileProvider.rtreeCache.get(o).all().find((d) => d.value.getId() === n); + if (c) { + const d = c.value; + r.add(o), e === fe.HIDE ? d[Mt] = !0 : e === fe.SHOW && delete d[Mt], d.changed(); + } + }); + }), this._updateTiles([...r], !0); + }))); + } + _updateTiles(e, s) { + this.getImplementations().forEach((r) => { + r.updateTiles(e, !!s); + }); + } + /** + * rerenders the specified tiles + * rendering happens async + */ + updateTiles(e) { + this._updateTiles(e); + } + /** + * calculates the style the feature has to be rendered + */ + _featureStyle(e, s) { + let r; + return e[Ct] || e[Mt] ? [] : (e[Ie] ? { style: r } = e[Ie] : this.style instanceof tt ? { style: r } = this.style : r = e.getStyle() || this.style.style, Ca(r, e, s)); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + tileProvider: this.tileProvider, + tileSize: this._tileSize, + minLevel: this._minLevel, + maxLevel: this._maxLevel, + extent: this.extent ?? new be(), + declutter: this._declutter, + vectorProperties: this.vectorProperties, + debug: this._debug + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [ + this._renderer === "image" ? new Aw(e, this.getImplementationOptions()) : new eC(e, this.getImplementationOptions()) + ] : e instanceof Pe ? [ + new Zw(e, this.getImplementationOptions()) + ] : []; + } + getStyleOrDefaultStyle(e, s) { + return super.getStyleOrDefaultStyle(e, s || gs.clone()); + } + async activate() { + await super.activate(), this._setupFeatureVisibilityHandlers(), this.tileProvider.trackFeaturesToTiles && this.tileProvider.forEachFeature((e) => { + cc(this.featureVisibility, this.globalHider, e); + }); + } + deactivate() { + super.deactivate(), this._featureVisibilityListeners.forEach((e) => { + e(); + }); + } + destroy() { + this._featureVisibilityListeners.forEach((e) => { + e(); + }), super.destroy(), this._tileLoadEventListener(), this.featureProvider && this.featureProvider.destroy(), this.tileProvider && this.tileProvider.destroy(), this._vectorPropertiesChangedListener(), this.vectorProperties && this.vectorProperties.destroy(); + } + toJSON() { + const e = super.toJSON(), s = sn.getDefaultOptions(); + this._maxLevel !== s.maxLevel && (e.maxLevel = this._maxLevel), this._minLevel !== s.minLevel && (e.minLevel = this._minLevel); + const r = this.vectorProperties.getVcsMeta(); + return Object.keys(r).length > 0 && (e.vectorProperties = r), this.tileProvider && (e.tileProvider = this.tileProvider.toJSON()), this._declutter !== s.declutter && (e.declutter = this._declutter), this._renderer !== s.renderer && (e.renderer = this._renderer), e; + } +} +ke.registerClass(sn.className, sn); +class Ta extends ct { + constructor(e) { + var r; + const s = new z(e.projection).toJSON(); + s.alias = [ + `http://www.opengis.net/gml/srs/epsg.xml#${(r = s.epsg.match(/\d+/)) == null ? void 0 : r[0]}` + ]; + super({ ...e, projection: s }); + h(this, "featureType"); + h(this, "featureNS"); + h(this, "featurePrefix"); + h(this, "version"); + h(this, "getFeaturesOptions"); + h(this, "wfsFormat"); + h(this, "_dataFetchedPromise"); + this.featureType = Array.isArray(e.featureType) ? e.featureType : [e.featureType], this.featureNS = e.featureNS, this.featurePrefix = e.featurePrefix, this.getFeaturesOptions = e.getFeatureOptions || {}, this.version = e.version, this.wfsFormat = new Bo({ + featureNS: this.featureNS, + featureType: this.featureType, + version: this.version + }), this._dataFetchedPromise = null; + } + static get className() { + return "WFSLayer"; + } + static getDefaultOptions() { + return { + ...ct.getDefaultOptions(), + featureType: [], + featureNS: "", + featurePrefix: "", + getFeatureOptions: {}, + version: void 0 + }; + } + async initialize() { + return this.initialized || await this.fetchData(), super.initialize(); + } + async reload() { + return this.wfsFormat = new Bo({ + featureNS: this.featureNS, + featureType: this.featureType, + version: this.version + }), this._dataFetchedPromise && (this.removeAllFeatures(), this._dataFetchedPromise = null, await this.fetchData()), super.reload(); + } + /** + * Fetches the data for the layer. If data is already fetched returns a resolved Promise + */ + fetchData() { + if (this._dataFetchedPromise) + return this._dataFetchedPromise; + if (this.url != null) { + const e = this.wfsFormat.writeGetFeature({ + featureNS: this.featureNS, + featurePrefix: this.featurePrefix, + featureTypes: this.featureType, + srsName: this.projection.epsg, + ...this.getFeaturesOptions + }), s = new XMLSerializer().serializeToString(e), r = qt(this.url, this.headers); + return r.method = "POST", r.body = s, r.headers = { + ...r.headers, + "Content-Type": "application/text+xml" + }, this._dataFetchedPromise = vn(this.url, r).then((n) => n.text()).then((n) => this._parseWFSData(n)).catch((n) => (this.getLogger().info(`Could not send request for loading layer content (${String(n)})`), Promise.reject(n))), this._dataFetchedPromise; + } + return this.getLogger().warning("Could not load WFSLayer layer, no url is set"), Promise.reject(new Error("missing url in WFSLayer layer")); + } + _parseWFSData(e) { + const s = this.wfsFormat.readFeatures(e); + this.addFeatures(s); + } + toJSON() { + const e = super.toJSON(), s = Ta.getDefaultOptions(); + return e.featureType = this.featureType.slice(), e.featureNS = this.featureNS, e.featurePrefix = this.featurePrefix, Object.keys(this.getFeaturesOptions).length > 0 && (e.getFeatureOptions = this.getFeaturesOptions), this.version !== s.version && (e.version = this.version), e; + } +} +ke.registerClass(Ta.className, Ta); +class rn extends Dt { + /** + * @param options + */ + constructor(e) { + super(e); + h(this, "version"); + h(this, "parameters"); + h(this, "tileSize"); + h(this, "highResolution"); + h(this, "singleImage2d"); + h(this, "_featureInfoOptions"); + const s = rn.getDefaultOptions(); + if (this.version = e.version || s.version, this.parameters = {}, e.parameters) { + let r = {}; + typeof e.parameters == "string" ? r = Object.fromEntries(new URLSearchParams(e.parameters)) : e.parameters instanceof Object && (r = e.parameters), Object.keys(r).forEach((n) => { + this.parameters[n.toUpperCase()] = r[n]; + }); + } + this.parameters.TRANSPARENT == null && (this.parameters.TRANSPARENT = !1), this.version && (this.parameters.VERSION = this.version), this.parameters.LAYERS = e.layers || s.layers, this.tileSize = e.tileSize || s.tileSize, this.highResolution = ce(e.highResolution, s.highResolution), this._featureInfoOptions = e.featureInfo || s.featureInfo, this._supportedMaps = [B.className, Pe.className], this.singleImage2d = ce(e.singleImage2d, s.singleImage2d); + } + static get className() { + return "WMSLayer"; + } + static getDefaultOptions() { + return { + ...Dt.getDefaultOptions(), + version: "1.1.1", + parameters: void 0, + featureInfo: void 0, + tileSize: [256, 256], + highResolution: !1, + layers: "", + singleImage2d: !1 + }; + } + initialize() { + return this.initialized || this._setFeatureProvider(), super.initialize(); + } + /** + * Sets a FeatureProvider if provided with featureInfo options + */ + _setFeatureProvider() { + if (this._featureInfoOptions) { + const e = { + url: this.url, + tilingSchema: this.tilingSchema, + maxLevel: this.maxLevel, + minLevel: this.minLevel, + tileSize: this.tileSize, + extent: this.extent, + parameters: this.parameters, + version: this.version, + ...this._featureInfoOptions + }; + this.featureProvider = new ys(this.name, e); + } + } + async reload() { + return this.featureProvider && this._featureInfoOptions && (this.featureProvider.destroy(), this._setFeatureProvider()), super.reload(); + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + version: this.version, + parameters: this.parameters, + highResolution: this.highResolution, + tileSize: this.tileSize, + singleImage2d: this.singleImage2d + }; + } + createImplementationsForMap(e) { + return e instanceof B ? [new Dw(e, this.getImplementationOptions())] : e instanceof Pe ? [new Jw(e, this.getImplementationOptions())] : []; + } + /** + * Sets the layers to request from the WmsLayer + * @param layers - a layer name or an array of layer names + */ + async setLayers(e) { + S(e, je(String, [String])); + const s = Array.isArray(e) ? e : [e]; + this.parameters.LAYERS = s.join(","), await this.forceRedraw(); + } + /** + * Returns the currently active layers + */ + getLayers() { + return this.parameters.LAYERS ? this.parameters.LAYERS.split(",") : []; + } + toJSON() { + var n, a, o; + const e = super.toJSON(), s = rn.getDefaultOptions(); + this.parameters.LAYERS && (e.layers = this.parameters.LAYERS), this.version !== s.version && (e.version = this.version); + const r = { ...this.parameters }; + if (delete r.VERSION, delete r.LAYERS, r.TRANSPARENT === !1 && delete r.TRANSPARENT, Object.keys(r).length > 0 && (e.parameters = r), this.version !== s.version && (e.version = this.version), this.highResolution !== s.highResolution && (e.highResolution = this.highResolution), (this.tileSize[0] !== ((n = s == null ? void 0 : s.tileSize) == null ? void 0 : n[0]) || this.tileSize[1] !== s.tileSize[1]) && (e.tileSize = this.tileSize.slice()), this.singleImage2d !== s.singleImage2d && (e.singleImage2d = this.singleImage2d), this.featureProvider && this.featureProvider instanceof ys) { + const l = this.featureProvider.toJSON(); + (this.tileSize[0] === ((a = l == null ? void 0 : l.tileSize) == null ? void 0 : a[0]) || this.tileSize[1] === ((o = l == null ? void 0 : l.tileSize) == null ? void 0 : o[1])) && delete l.tileSize, Object.entries(this.parameters).every(([c, d]) => { + var u; + return ((u = l == null ? void 0 : l.parameters) == null ? void 0 : u[c]) === d; + }) && delete l.parameters, l.extent && new be(l.extent).equals(this.extent) && delete l.extent, this.url === l.url && delete l.url, this.tilingSchema === l.tilingSchema && delete l.tilingSchema, this.version === l.version && delete l.version, this.minLevel === l.minLevel && delete l.minLevel, this.maxLevel === l.maxLevel && delete l.maxLevel, e.featureInfo = l; + } else this._featureInfoOptions && (e.featureInfo = this._featureInfoOptions); + return e; + } +} +ke.registerClass(rn.className, rn); +function iC(i, t, e) { + if (i.length > 0) { + if (i.length === t + 1) + return i; + he("WmtsCesiumImpl").log("matrixIds must have the same length as maxLevel"); + } + return new Array(t + 1).fill(void 0).map((s, r) => `${e}${r}`); +} +class nn extends Dt { + constructor(e) { + const s = nn.getDefaultOptions(); + super({ tilingSchema: s.tilingSchema, ...e }); + h(this, "numberOfLevelZeroTilesX"); + h(this, "numberOfLevelZeroTilesY"); + h(this, "layer"); + h(this, "wmtsStyle"); + h(this, "format"); + h(this, "tileMatrixPrefix"); + h(this, "tileMatrixSetID"); + h(this, "openlayersOptions"); + h(this, "matrixIds"); + h(this, "tileSize"); + this._supportedMaps = [Pe.className, B.className], this.numberOfLevelZeroTilesX = ne(e.numberOfLevelZeroTilesX, s.numberOfLevelZeroTilesX), this.numberOfLevelZeroTilesY = ne(e.numberOfLevelZeroTilesY, s.numberOfLevelZeroTilesY), this.layer = e.layer || s.layer, this.wmtsStyle = e.wmtsStyle || s.wmtsStyle, this.format = e.format || s.format, this.tileMatrixPrefix = e.tileMatrixPrefix || s.tileMatrixPrefix, this.tileMatrixSetID = e.tileMatrixSetID || s.tileMatrixSetID, this.openlayersOptions = e.openlayersOptions || s.openlayersOptions || {}, this.matrixIds = Array.isArray(e.matrixIds) ? e.matrixIds : s.matrixIds, this.tileSize = e.tileSize || s.tileSize; + } + static get className() { + return "WMTSLayer"; + } + static getDefaultOptions() { + return { + ...Dt.getDefaultOptions(), + tilingSchema: it.MERCATOR, + numberOfLevelZeroTilesX: 1, + numberOfLevelZeroTilesY: 1, + layer: "", + wmtsStyle: "", + format: "", + tileMatrixPrefix: "", + tileMatrixSetID: "", + openlayersOptions: {}, + matrixIds: [], + tileSize: [256, 256] + }; + } + getImplementationOptions() { + return { + ...super.getImplementationOptions(), + layer: this.layer, + style: this.wmtsStyle, + format: this.format, + tileMatrixSetID: this.tileMatrixSetID, + tileSize: this.tileSize, + numberOfLevelZeroTilesX: this.numberOfLevelZeroTilesX, + numberOfLevelZeroTilesY: this.numberOfLevelZeroTilesY, + matrixIds: iC(this.matrixIds, this.maxLevel, this.tileMatrixPrefix), + openlayersOptions: this.openlayersOptions + }; + } + createImplementationsForMap(e) { + return e instanceof Pe ? [new Kw(e, this.getImplementationOptions())] : e instanceof B ? [new Nw(e, this.getImplementationOptions())] : []; + } + toJSON() { + var r; + const e = super.toJSON(), s = nn.getDefaultOptions(); + return this.tilingSchema !== s.tilingSchema ? e.tilingSchema = this.tilingSchema : delete e.tilingSchema, this.numberOfLevelZeroTilesX !== s.numberOfLevelZeroTilesX && (e.numberOfLevelZeroTilesX = this.numberOfLevelZeroTilesX), this.numberOfLevelZeroTilesY !== s.numberOfLevelZeroTilesY && (e.numberOfLevelZeroTilesY = this.numberOfLevelZeroTilesY), this.layer !== s.layer && (e.layer = this.layer), this.wmtsStyle !== s.wmtsStyle && (e.wmtsStyle = this.wmtsStyle), this.format !== s.format && (e.format = this.format), this.tileMatrixPrefix !== s.tileMatrixPrefix && (e.tileMatrixPrefix = this.tileMatrixPrefix), this.tileMatrixSetID !== s.tileMatrixSetID && (e.tileMatrixSetID = this.tileMatrixSetID), Object.keys(this.openlayersOptions).length > 0 && (e.openlayersOptions = { ...this.openlayersOptions }), this.matrixIds.length > 0 && (e.matrixIds = this.matrixIds.slice()), (this.tileSize[0] !== ((r = s == null ? void 0 : s.tileSize) == null ? void 0 : r[0]) || this.tileSize[1] !== s.tileSize[1]) && (e.tileSize = this.tileSize.slice()), e; + } +} +ke.registerClass(nn.className, nn); +function Ao() { + return he("ClippingObject"); +} +const zn = Symbol("ClippingObjectGlobe"); +class Hn { + constructor(t = {}) { + h(this, "id", Xe()); + /** + * The current layerNames. Use add/removeimport("@vcmap/core").Layer to manipulate. + */ + h(this, "layerNames"); + /** + * Key is a semantic identifier, eg. layerName or layerName-entitiyId, depending on the target. Targets + * represent Cesium Object which support the clippingPlanes API + */ + h(this, "targets", /* @__PURE__ */ new Map()); + /** + * The current entities and their respective layerNames. Use add/removeEntity to manipulate + */ + h(this, "entities"); + h(this, "_clippingPlaneCollection"); + h(this, "_terrain"); + h(this, "_local"); + /** + * Event, raised on a change of targets + */ + h(this, "targetsUpdated", new L()); + /** + * Event, raised on changes to the clippingPlaneCollection property + */ + h(this, "clippingPlaneUpdated", new L()); + h(this, "_cachedLayers", /* @__PURE__ */ new Set()); + h(this, "_activeMap", null); + h(this, "_layerCollection", null); + this.layerNames = t.layerNames || [], this.entities = t.entities || [], this._clippingPlaneCollection = t.clippingPlaneCollection, this._terrain = ce(t.terrain, !1), this._local = ce(t.local, !1); + } + /** + * The current Cesium.ClippingPlaneCollection. To update the collection, set this property to the new definition. + */ + get clippingPlaneCollection() { + return this._clippingPlaneCollection; + } + set clippingPlaneCollection(t) { + this._clippingPlaneCollection = t, this.clippingPlaneUpdated.raiseEvent(); + } + /** + * Flag to indicate whether the globe/terrain is part of the targets. + */ + get terrain() { + return this._terrain; + } + set terrain(t) { + S(t, Boolean), this._terrain !== t && (this._terrain = t, this.handleMapChanged(this._activeMap)); + } + /** + * Flag to indicate, whether this ClippingObject represents coordinates in a local frame. If false, + * Plane coordiantes are assumed to be in ECEF or have an appropriate model matrix + * applied to the Cesium.ClippingPlaneCollection. + */ + get local() { + return this._local; + } + set local(t) { + S(t, Boolean), this._local !== t && (this._local = t, this.clippingPlaneUpdated.raiseEvent()); + } + setLayerCollection(t) { + if (S(t, Ei), this._layerCollection && this._layerCollection !== t) + throw new Error("layerCollection has already been set"); + this._layerCollection = t, [...this._layerCollection].forEach((e) => { + this.handleLayerChanged(e); + }); + } + handleLayerChanged(t) { + const e = this._activeMap; + if (e instanceof B) { + if (this.layerNames.includes(t.name)) + if (t.active) { + const s = e.getVisualizationsForLayer(t), r = s ? [...s].filter((n) => n instanceof na) : []; + if (r.length > 0) + r.forEach((n) => { + this.layerNames.includes(t.name) && t.active && (this.targets.set(t.name, n), this.targetsUpdated.raiseEvent()); + }); + else { + const n = this.layerNames.indexOf(t.name); + Ao().warning(`layer ${t.name} cannot have a ClippingObject applied`), this.layerNames.splice(n, 1); + } + } else this.targets.has(t.name) && (this.targets.delete(t.name), this.targetsUpdated.raiseEvent()); + else if (this.entities.find((s) => s.layerName === t.name)) { + let s = !1; + const r = e.getVisualizationsForLayer(t), n = r ? [...r][0] : null; + if (!n) { + const a = this.layerNames.indexOf(t.name); + Ao().warning(`layer ${t.name} cannot have a ClippingObject applied`), this.layerNames.splice(a, 1); + return; + } + this.entities.filter((a) => a.layerName === t.name).forEach((a) => { + const o = `${a.layerName}-${a.entityId}`; + if (t.active) { + const l = n.entities.getById(a.entityId); + if (l) + this.targets.set(o, l), s = !0; + else { + const c = this.entities.indexOf(a); + Ao().warning(`could not find entity with id ${a.entityId} in layer ${a.layerName}`), this.entities.splice(c, 1); + } + } else this.targets.has(o) && (this.targets.delete(o), s = !0); + }), s && this.targetsUpdated.raiseEvent(); + } + } else this.layerNames.includes(t.name) && (t instanceof Wi || t instanceof di) && (t.active ? this._cachedLayers.add(t) : this._cachedLayers.has(t) && this._cachedLayers.delete(t)); + } + handleMapChanged(t) { + if (this.targets.forEach((e, s) => { + e.isDestroyed && e.isDestroyed() && this.targets.delete(s); + }), t instanceof B) { + const { globe: e } = t.getScene(); + let s = !1; + this._terrain && this.targets.get(zn) !== e ? (this.targets.set(zn, e), s = !0) : !this._terrain && this.targets.has(zn) && (this.targets.delete(zn), s = !0), s && this.targetsUpdated.raiseEvent(), this._cachedLayers.size > 0 && (this._cachedLayers.forEach((r) => { + this.handleLayerChanged(r); + }), this._cachedLayers.clear()); + } + this._activeMap = t; + } + /** + * add a layer name to the ClippingObject's layerNames array + * @param layerName + */ + addLayer(t) { + if (S(t, String), !this.layerNames.includes(t)) { + this.layerNames.push(t); + const e = this._layerCollection ? this._layerCollection.getByKey(t) : null; + e && e.active && this.handleLayerChanged(e); + } + } + /** + * removes a layer from the ClippingObject's layerNames array + * @param layerName + */ + removeLayer(t) { + S(t, String); + const e = this.layerNames.indexOf(t); + e > -1 && this.layerNames.splice(e, 1), this.targets.has(t) && (this.targets.delete(t), this.targetsUpdated.raiseEvent()); + } + /** + * add an entity to the ClippingObject's entities array + * @param layerName + * @param entityId + */ + addEntity(t, e) { + if (S(t, String), S(e, String), !this.entities.find((s) => s.layerName === t && s.entityId === e)) { + this.entities.push({ layerName: t, entityId: e }); + const s = this._layerCollection ? this._layerCollection.getByKey(t) : null; + s && s.active && this.handleLayerChanged(s); + } + } + /** + * remove entity from the ClippingObject's entities array + * @param layerName + * @param entityId + */ + removeEntity(t, e) { + S(t, String), S(e, String); + const s = this.entities.findIndex((n) => n.layerName === t && n.entityId === e); + s > -1 && this.entities.splice(s, 1); + const r = `${t}-${e}`; + this.targets.has(r) && (this.targets.delete(r), this.targetsUpdated.raiseEvent()); + } +} +function uc(i, t) { + const e = _.subtract(i, t, new _()); + _.normalize(e, e); + const s = oe.fromPointNormal(i, e); + return Rr.fromPlane(s); +} +function sC(i) { + const t = [], e = i.map((s) => wt(s)); + for (let s = 0; s < e.length - 1; s++) { + const r = s + 1, n = new _(); + _.cross(e[r], e[s], n), _.normalize(n, n); + const a = new oe(n, 0); + Number.isNaN(a.distance) || t.push(Rr.fromPlane(a)); + } + return t; +} +function dc(i, t, e = {}) { + const s = [], r = wi.fromGeometry(i.getGeometry()); + let n = Number.isFinite(r.minZ) ? r.minZ : 0, a = Number.isFinite(r.maxZ) ? r.maxZ : 0; + const o = i.get("olcs_extrudedHeight"); + o && (a += o, i.get("olcs_skirt") && (n -= i.get("olcs_skirt"))), n === a && (a += 1); + const [l, c] = z.mercatorToWgs84(t[0]), d = _.fromDegrees(l, c, n), u = _.fromDegrees(l, c, a); + return e.createBottomPlane && s.push(uc(d, u)), o && e.createTopPlane && s.push(uc(u, d)), s; +} +function rC(i) { + const t = [], e = i.map((n) => wt(n)), s = new _(); + _.cross(e[0], e[1], s), _.normalize(s, s); + function r(n) { + const a = _.add(n, s, new _()), o = new _(); + _.cross(n, a, o), _.normalize(o, o); + const l = new oe(o, 0); + t.push(Rr.fromPlane(l)); + } + return r(e[0]), _.negate(s, s), r(e[1]), t; +} +function Z1(i, t = {}, e = void 0) { + S(i, ue), S(t, Object), S(e, tu(G)); + const s = [], r = i.getGeometry(), n = r.getType(); + if (n === "Point") + s.push(...dc(i, [r.getCoordinates()], t)); + else { + const a = Wt(r); + if (a.length < 2 || a[0][0] === a[1][0] && a[0][1] === a[1][1]) + return null; + n === "Polygon" ? (sl(a), bv(a)) : n === "LineString" && a.length === 2 && t.createEndingPlanes && s.push(...rC(a)), t.createVerticalPlanes && s.push(...sC(a)), i.get("olcs_altitudeMode") === "absolute" && (t.createBottomPlane || t.createTopPlane) && s.push(...dc(i, a, t)); + } + return e && s.forEach((a) => { + const o = oe.transform(a, e); + a.normal = o.normal, a.distance = o.distance; + }), t.reverse && s.forEach((a) => { + _.negate(a.normal, a.normal), a.distance *= -1; + }), new Nr({ + planes: s, + unionClippingRegions: t.reverse + }); +} +function Lr(i, t, e, s) { + S(i, Nr), S(t, Nr), t.length > 0 && t.removeAll(); + for (let r = 0; r < i.length; r++) { + const n = i.get(r); + if (e && s) { + const a = oe.getPointDistance(n, s), o = oe.transform(n, e); + o.distance = a, t.add(Rr.fromPlane(o)); + } else + t.add(Rr.clone(n)); + } + return t.modelMatrix = i.modelMatrix.clone(), t.unionClippingRegions = i.unionClippingRegions, t.edgeColor = i.edgeColor.clone(), t.edgeWidth = i.edgeWidth, t; +} +function Ja(i) { + i.isDestroyed && i.isDestroyed() || (i instanceof Ji ? i.model && (i.model.clippingPlanes ? i.model.clippingPlanes.getValue().removeAll() : i.model.clippingPlanes = new eu(new Nr())) : i.clippingPlanes ? i.clippingPlanes.removeAll() : i.clippingPlanes = new Nr()); +} +function nC(i, t, e) { + if (Ja(i), e) + Lr(t, i.clippingPlanes); + else if (!t.modelMatrix.equals(G.IDENTITY)) + Lr(t, i.clippingPlanes), i.clippingPlanes.modelMatrix = G.multiply(G.inverse(i.clippingPlanesOriginMatrix, i.clippingPlanes.modelMatrix), t.modelMatrix, i.clippingPlanes.modelMatrix); + else { + const s = G.getMatrix3(G.inverse(i.clippingPlanesOriginMatrix, new G()), new Q()), r = G.fromRotationTranslation(s, new _()); + Lr(t, i.clippingPlanes, r, i.boundingSphere.center); + } +} +function aC(i, t) { + Ja(i), Lr(t, i.clippingPlanes); +} +function oC(i, t, e) { + if (i.model) { + Ja(i); + const s = i.model.clippingPlanes.getValue(); + if (Lr(t, s), !e) { + const r = i.computeModelMatrix(Yc.now()); + G.inverseTransformation(r, s.modelMatrix), t.modelMatrix.equals(G.IDENTITY) || G.multiply(s.modelMatrix, t.modelMatrix, s.modelMatrix); + } + } +} +function fc(i, t, e) { + i instanceof na ? nC(i, t, e) : i instanceof Mg ? aC(i, t) : oC(i, t, e); +} +function J1(i, t, e = !1, s = 25, r = 0) { + S(i, [Number]), S(e, Boolean), S(s, Number); + let n; + if (e) { + const o = Vn(i, -s, t.heading + r), l = Vn(i, s, t.heading + r); + n = new xt([ + [o[0], o[1], i[2] - s], + [l[0], l[1], i[2] - s] + ], "XYZ"); + } else { + n = new ht([[]], "XYZ"); + let o = 2 * Math.PI - Math.PI / 4 + r; + const l = [...new Array(4)].map(() => { + const c = Vn(i, s, o); + return o -= Math.PI / 2, [c[0], c[1], i[2]]; + }); + n.setCoordinates([l]); + } + const a = new ue({ geometry: n }); + return a.set("olcs_altitudeMode", "absolute"), e && a.set("olcs_extrudedHeight", s * 2), n.transform(de.proj, W.proj), a; +} +function K1(i, t = !1) { + return S(i, ie(ue)), S(t, Boolean), (i ? i.getGeometry().getType() === "LineString" : !1) ? { + createBottomPlane: !t, + createTopPlane: !t, + createEndingPlanes: !t, + createVerticalPlanes: !0 + } : { + createVerticalPlanes: !t, + createBottomPlane: !0 + }; +} +class lC { + constructor(t) { + h(this, "_defaultClippingObjects", /* @__PURE__ */ new Set()); + h(this, "_exclusiveClippingObjects", null); + h(this, "_targetsMap", /* @__PURE__ */ new Map()); + h(this, "_listenersMap", /* @__PURE__ */ new Map()); + h(this, "_exclusiveRemovedCb", null); + h(this, "initialized", !1); + h(this, "_updateSuspended", !1); + h(this, "_dirty", !1); + h(this, "_layerCollection"); + h(this, "_activeMap", null); + h(this, "_layerChangedListener"); + this._layerCollection = t, this._layerChangedListener = this._layerCollection.stateChanged.addEventListener((e) => { + this._layerChanged(e); + }); + } + static get className() { + return "ClippingObjectManager"; + } + /** + * Suspend updates, changes to managed [ClippingObjects] will not trigger a reset of targets or plane definitions + */ + get suspendUpdate() { + return this._updateSuspended; + } + set suspendUpdate(t) { + S(t, Boolean), this._updateSuspended = t, !this._updateSuspended && this._dirty && (this._dirty = !1, this._update()); + } + _layerChanged(t) { + this.suspendUpdate = !0, this._defaultClippingObjects.forEach((e) => { + e.handleLayerChanged(t); + }), this._exclusiveClippingObjects && this._exclusiveClippingObjects.forEach((e) => { + e.handleLayerChanged(t); + }), this.suspendUpdate = !1; + } + mapActivated(t) { + this.suspendUpdate = !0, this._defaultClippingObjects.forEach((e) => { + e.handleMapChanged(t); + }), this._exclusiveClippingObjects && this._exclusiveClippingObjects.forEach((e) => { + e.handleMapChanged(t); + }), this.suspendUpdate = !1, this._activeMap = t; + } + /** + * Add a default [ClippingObject] to the manager. The order in which objects are added, determines their priority. + * In case two objects have the same target, the one added last is applied. Should the last added object be removed, + * the first one is re-applied. An object may not be added if is already part of the manager, use [hasClippingObject] + * to test. + */ + addClippingObject(t) { + if (S(t, Hn), this.hasClippingObject(t)) + throw new Error("ClippingObject already managed, remove it first"); + this._activeMap instanceof B && t.handleMapChanged(this._activeMap), t.setLayerCollection(this._layerCollection), this._defaultClippingObjects.add(t), this._listenersMap.set(t, [ + t.targetsUpdated.addEventListener(this._update.bind(this)), + t.clippingPlaneUpdated.addEventListener(this._clippingPlaneUpdated.bind(this, t)) + ]), this._update(); + } + /** + * Remove a default [ClippingObject] instance from the manager. + */ + removeClippingObject(t) { + S(t, Hn), this._defaultClippingObjects.has(t) && (this._defaultClippingObjects.delete(t), this._listenersMap.get(t).forEach((e) => { + e(); + }), this._listenersMap.delete(t), this._update()); + } + /** + * Test if a is part of managers context + */ + hasClippingObject(t) { + return S(t, Hn), this._defaultClippingObjects.has(t) || !!(this._exclusiveClippingObjects && this._exclusiveClippingObjects.includes(t)); + } + /** + * Sets an Array of [ClippingObjects] to be added to the managers context. Exclusive objects + * are intended for [ClippingObjects] which can be directly manipulated by the user. They + * are always applied last and will overwrite any managed default [ClippingObject] with the same targets. + * The manager will only allow a single context (eg. one widget/plugin) for exclusive objects. Should the current context be switched or cleared, the provided + * callback is called to inform the setting context of its removal. + * @throws ClippingObjects is already managed + */ + setExclusiveClippingObjects(t, e) { + if (S(t, [Hn]), S(e, Function), t.find((s) => this._defaultClippingObjects.has(s))) + throw new Error("Some ClippingObjects are already managed, remove them first"); + this._clearExclusiveClippingObjects(), this._exclusiveRemovedCb = e, this._exclusiveClippingObjects = t, this._exclusiveClippingObjects.forEach((s) => { + this._activeMap instanceof B && s.handleMapChanged(this._activeMap), s.setLayerCollection(this._layerCollection), this._listenersMap.set(s, [ + s.targetsUpdated.addEventListener(this._update.bind(this)), + s.clippingPlaneUpdated.addEventListener(this._clippingPlaneUpdated.bind(this, s)) + ]); + }), this._update(); + } + _clearExclusiveClippingObjects(t) { + this._exclusiveClippingObjects && (this._exclusiveClippingObjects.forEach((e) => { + this._listenersMap.get(e).forEach((s) => { + s(); + }), this._listenersMap.delete(e); + }), this._exclusiveClippingObjects = null), !t && this._exclusiveRemovedCb && this._exclusiveRemovedCb(), this._exclusiveRemovedCb = null; + } + /** + * Clears the exclusive set of [ClippingObject]. If called with the silent flag, the + * removed callback is not called (eg. when removing exclusive clipping objects from the same context). + * @param silent + */ + clearExclusiveClippingObjects(t) { + this._clearExclusiveClippingObjects(t), this._update(); + } + _update() { + if (this._updateSuspended) { + this._dirty = !0; + return; + } + const t = new Set(this._targetsMap.keys()), e = (s) => { + s.targets.forEach((r) => { + r.isDestroyed && r.isDestroyed() || (this._targetsMap.set(r, s), t.delete(r)); + }); + }; + this._targetsMap.clear(), this._defaultClippingObjects.forEach(e), this._exclusiveClippingObjects && this._exclusiveClippingObjects.forEach(e), t.forEach((s) => { + Ja(s); + }), this._targetsMap.forEach((s, r) => { + s.clippingPlaneCollection && fc(r, s.clippingPlaneCollection, s.local); + }); + } + _clippingPlaneUpdated(t) { + this._targetsMap.forEach((e, s) => { + e === t && t.clippingPlaneCollection && fc(s, t.clippingPlaneCollection); + }); + } + destroy() { + this._listenersMap.forEach((t) => { + t.forEach((e) => { + e(); + }); + }), this._layerChangedListener(), this._listenersMap.clear(), this._targetsMap.clear(), this._defaultClippingObjects.clear(), this._exclusiveClippingObjects = null; + } +} +var Jt; +(function(i) { + i.LOW = "low", i.MEDIUM = "medium", i.HIGH = "high"; +})(Jt || (Jt = {})); +class Aa { + constructor(t) { + h(this, "_app"); + h(this, "_layerSettingsCache"); + h(this, "_viewModelSettings"); + h(this, "_currentQualityLevel"); + h(this, "_listeners"); + /** + * An event raised when the current quality level has been changed + */ + h(this, "qualityLevelChanged", new L()); + this._app = t, this._layerSettingsCache = [], this._viewModelSettings = Aa.getDefaultOptions(), this._currentQualityLevel = void 0, this._listeners = [ + this._app.maps.mapActivated.addEventListener(() => { + this._app.maps.activeMap instanceof B && !this.currentQualityLevel && (hs() ? this.setLevel(this._viewModelSettings.startingMobileQualityLevel) : this.setLevel(this._viewModelSettings.startingQualityLevel)); + }), + this._app.layers.stateChanged.addEventListener((e) => { + e.active && this._app.maps.activeMap instanceof B && this._setLayerQuality(e.name); + }), + this._app.layers.removed.addEventListener((e) => { + const s = this._layerSettingsCache.findIndex((r) => r.layerName === e.name); + s > -1 && this._layerSettingsCache.splice(s, 1); + }) + ]; + } + static get className() { + return "DisplayQuality"; + } + static getDefaultOptions() { + return { + startingQualityLevel: Jt.MEDIUM, + startingMobileQualityLevel: Jt.LOW, + low: { + sse: 4, + fxaa: !1, + fogEnabled: !0, + fogDensity: 9e-4, + fogScreenSpaceErrorFactor: 6, + resolutionScale: 0.9, + layerSSEFactor: 2, + msaa: 1 + }, + medium: { + sse: 2.333, + fxaa: !1, + fogEnabled: !0, + fogDensity: 5e-4, + fogScreenSpaceErrorFactor: 4, + resolutionScale: 1, + layerSSEFactor: 1.1, + msaa: 1 + }, + high: { + sse: 4 / 3, + fxaa: !0, + fogEnabled: !1, + fogDensity: 0, + fogScreenSpaceErrorFactor: 0, + resolutionScale: 1, + layerSSEFactor: 0.5, + msaa: 4 + } + }; + } + /** + * The starting quality level + */ + get startingQualityLevel() { + return this._viewModelSettings.startingQualityLevel; + } + /** + * The current quality level + */ + get currentQualityLevel() { + return this._currentQualityLevel; + } + /** + * The current quality view model + * @private + */ + get _viewModel() { + if (this._currentQualityLevel) + return this._viewModelSettings[this._currentQualityLevel]; + } + /** + * Update the display quality options + * @param options + * @param silent + */ + updateOptions(t, e) { + S(t, Object); + const s = Object.fromEntries(Object.entries(t).filter(([, n]) => n != null).map(([n, a]) => n === Jt.LOW || n === Jt.MEDIUM || n === Jt.HIGH ? [ + n, + Object.fromEntries(Object.entries(a).filter(([o, l]) => o === "msaa" ? [1, 2, 4, 8].includes(l) : l != null)) + ] : [n, a])), r = Aa.getDefaultOptions(); + this._viewModelSettings = { + ...r, + ...s, + low: { ...r.low, ...s.low }, + medium: { ...r.medium, ...s.medium }, + high: { ...r.high, ...s.high } + }, e || (this.currentQualityLevel ? this.setLevel(this.currentQualityLevel) : hs() ? this.setLevel(this._viewModelSettings.startingMobileQualityLevel) : this.setLevel(this._viewModelSettings.startingQualityLevel)); + } + /** + * Set display quality level for 3D map and layers + * @param level + */ + setLevel(t) { + if (S(t, je(Jt.LOW, Jt.MEDIUM, Jt.HIGH)), !(this._app.maps.activeMap instanceof B)) { + this._currentQualityLevel = void 0, this._viewModelSettings.startingQualityLevel = t, this._viewModelSettings.startingMobileQualityLevel = t; + return; + } + const e = this._currentQualityLevel; + this._currentQualityLevel = t, [...this._app.layers].filter((r) => r.active && (r instanceof di || r instanceof Wi)).forEach((r) => { + this._setLayerQuality(r.name); + }); + const s = this._app.maps.activeMap.getCesiumWidget(); + s && this._viewModel && (s.scene.globe.maximumScreenSpaceError = this._viewModel.sse, s.scene.postProcessStages && (s.scene.postProcessStages.fxaa.enabled = this._viewModel.fxaa), s.resolutionScale = this._viewModel.resolutionScale, s.scene.fog.enabled = this._viewModel.fogEnabled, s.scene.fog.density = this._viewModel.fogDensity, s.scene.fog.screenSpaceErrorFactor = this._viewModel.fogScreenSpaceErrorFactor, this._viewModel.msaa && (s.scene.msaaSamples = this._viewModel.msaa)), this._currentQualityLevel !== e && this.qualityLevelChanged.raiseEvent(); + } + /** + * Set layer quality + * @param layerName + * @private + */ + _setLayerQuality(t) { + S(t, String); + const e = this._app.layers.getByKey(t); + if ((e instanceof di || e instanceof Wi) && e.active) { + let s = this._layerSettingsCache.find((n) => n.layerName === t), r; + s || (r = hs() ? e.screenSpaceErrorMobile : e.screenSpaceError, r && (s = { + layerName: e.name, + defaultSse: r + }, this._layerSettingsCache.push(s))), s && this._viewModel && e.setMaximumScreenSpaceError(s.defaultSse * this._viewModel.layerSSEFactor); + } + } + /** + * Destroys the display quality, clearing its event listeners + */ + destroy() { + this._listeners.forEach((t) => { + t(); + }), this.qualityLevelChanged.destroy(); + } +} +const Yl = Symbol("alreadySnapped"); +var $s; +(function(i) { + i.CREATE = "create", i.EDIT_GEOMETRY = "editGeometry", i.EDIT_FEATURES = "editFeatures", i.SELECT = "selectFeatures"; +})($s || ($s = {})); +function Xl(i) { + const t = new ct({ + projection: W.toJSON(), + vectorProperties: { + altitudeMode: "clampToGround", + eyeOffset: [0, 0, -5], + primitiveOptions: { + type: Tt.SPHERE, + geometryOptions: { + radius: 4 + }, + depthFailColor: "rgba(255,255,255,0.47)" + }, + modelAutoScale: !0 + }, + isDynamic: !0, + zIndex: Cv, + style: { + image: { + radius: 5, + fill: { + color: "rgba(255,255,255,0.47)" + }, + stroke: { + width: 1, + color: "#000000" + } + } + } + }); + return $l(t), i.add(t), t.activate(), t; +} +function Ka(i, t) { + const e = new Cs(), s = new L(), r = i.addExclusiveInteraction(e, () => { + s.raiseEvent(); + }, void 0, t), n = i.featureInteraction.active; + return i.featureInteraction.setActive(P.CLICKMOVE | P.DRAGEVENTS), { + interactionChain: e, + destroy() { + r(), s.destroy(), e.destroy(), i.featureInteraction.setActive(n); + }, + removed: s + }; +} +var Le; +(function(i) { + i.Point = "Point", i.Circle = "Circle", i.LineString = "LineString", i.Polygon = "Polygon", i.BBox = "BBox"; +})(Le || (Le = {})); +function Dd(i) { + const t = i.maps.eventHandler.featureInteraction.pickPosition; + return i.maps.eventHandler.featureInteraction.pickPosition = P.CLICKMOVE | P.DRAGEVENTS, () => { + i.maps.eventHandler.featureInteraction.pickPosition = t; + }; +} +class hC extends ae { + constructor() { + super(P.CLICKMOVE | P.DBLCLICK, F.NONE | F.CTRL); + h(this, "_geometry", null); + h(this, "_coordinates", []); + h(this, "_lastCoordinate", null); + h(this, "finished", new L()); + h(this, "created", new L()); + this.setActive(); + } + /** + * Sets the coordiantes on the geometry + * @private + */ + _setCoordinates() { + this._geometry && this._geometry.setCoordinates(this._coordinates); + } + pipe(e) { + return e.type & P.CLICKMOVE && this._geometry && (this._lastCoordinate.splice(0, e.positionOrPixel.length, ...e.positionOrPixel), this._setCoordinates()), e.type & P.CLICK && (this._geometry ? (this._lastCoordinate = [...this._lastCoordinate], this._coordinates.push(this._lastCoordinate)) : (this._geometry = new xt([e.positionOrPixel]), e.map instanceof Ae ? this._geometry[ze] = !0 : this._geometry[hi] = !0, this.created.raiseEvent(this._geometry), this._coordinates = [e.positionOrPixel.slice()], this._lastCoordinate = this._coordinates[0].slice(), this._coordinates.push(this._lastCoordinate))), e.type & P.DBLCLICK && this.finish(), Promise.resolve(e); + } + /** + * Finish the current creation. Calls finish and sets the interaction to be inactive + */ + finish() { + this.active !== P.NONE && (this._coordinates.pop(), this._setCoordinates(), this.setActive(!1), this.finished.raiseEvent(this._geometry)); + } + destroy() { + this._geometry = null, this._coordinates = [], this.finished.destroy(), this.created.destroy(), super.destroy(); + } +} +class cC extends ae { + constructor() { + super(P.CLICKMOVE | P.DBLCLICK); + h(this, "_geometry", null); + h(this, "_coordinates", []); + h(this, "_lastCoordinate", null); + h(this, "finished", new L()); + h(this, "created", new L()); + this.setActive(); + } + /** + * Sets the geometry coordinates based on the interactions coordinates + */ + _setCoordinates() { + this._geometry && this._geometry.setCoordinates(this._coordinates); + } + pipe(e) { + return e.type & P.CLICKMOVE && this._geometry && (this._lastCoordinate.splice(0, e.positionOrPixel.length, ...e.positionOrPixel), this._setCoordinates()), e.type & P.CLICK && (this._geometry ? this.finish() : (this._geometry = new bt(e.positionOrPixel, 20), this._geometry[br] = e.map instanceof Ae, e.map instanceof Ae ? this._geometry[ze] = !0 : this._geometry[hi] = !0, this.created.raiseEvent(this._geometry), this._coordinates = this._geometry.getCoordinates(), this._lastCoordinate = this._coordinates[1])), e.type & P.DBLCLICK && this.finish(), Promise.resolve(e); + } + /** + * Finish the current creation. Calls finish and sets the interaction to be inactive + */ + finish() { + this.active !== P.NONE && (this._setCoordinates(), this.setActive(!1), this.finished.raiseEvent(this._geometry)); + } + destroy() { + this._geometry = null, this._coordinates = [], this.finished.destroy(), this.created.destroy(), super.destroy(); + } +} +const gc = 1e-6; +class uC extends ae { + constructor() { + super(P.CLICKMOVE | P.DBLCLICK); + h(this, "_geometry", null); + h(this, "_origin", null); + h(this, "_lastCoordinate", null); + h(this, "_is3D", !1); + h(this, "finished", new L()); + h(this, "created", new L()); + this.setActive(); + } + /** + * Sets the coordinates given the last coordinate and the current origin + * @private + */ + _setCoordinates() { + if (this._geometry && this._origin && this._lastCoordinate) { + const e = this._origin[0] >= this._lastCoordinate[0], s = this._origin[1] >= this._lastCoordinate[1]; + this._origin[0] === this._lastCoordinate[0] && (this._lastCoordinate[0] += gc), this._origin[1] === this._lastCoordinate[1] && (this._lastCoordinate[1] += gc), this._is3D && (this._lastCoordinate[2] = this._origin[2]); + let r, n; + e && s || !e && !s ? (r = [this._lastCoordinate[0], this._origin[1]], n = [this._origin[0], this._lastCoordinate[1]]) : (r = [this._origin[0], this._lastCoordinate[1]], n = [this._lastCoordinate[0], this._origin[1]]), this._is3D && (r.push(this._origin[2]), n.push(this._origin[2])), this._geometry.setCoordinates([ + [this._origin, r, this._lastCoordinate, n] + ]); + } + } + pipe(e) { + return e.type & P.CLICKMOVE && this._geometry && (this._lastCoordinate.splice(0, e.positionOrPixel.length, ...e.positionOrPixel), this._setCoordinates()), e.type & P.CLICK && (this._geometry ? this.finish() : (this._geometry = new ht([[e.positionOrPixel.slice()]]), this._geometry.set("_vcsGeomType", Le.BBox), this._is3D = !vt(this._geometry.getLayout()), e.map instanceof Ae ? this._geometry[ze] = !0 : this._geometry[hi] = !0, this.created.raiseEvent(this._geometry), this._origin = e.positionOrPixel.slice(), this._lastCoordinate = this._origin.slice())), e.type & P.DBLCLICK && this.finish(), Promise.resolve(e); + } + /** + * Finish the current creation. Calls finish and sets the interaction to be inactive + */ + finish() { + this.active !== P.NONE && (this._setCoordinates(), this.setActive(!1), this.finished.raiseEvent(this._geometry)); + } + destroy() { + this._geometry = null, this.finished.destroy(), this.created.destroy(), super.destroy(); + } +} +class dC extends ae { + constructor() { + super(P.CLICK); + h(this, "_geometry", null); + h(this, "finished", new L()); + h(this, "created", new L()); + this.setActive(); + } + pipe(e) { + return this._geometry = new Ve(e.positionOrPixel), e.map instanceof Ae ? this._geometry[ze] = !0 : this._geometry[hi] = !0, this.created.raiseEvent(this._geometry), this.finish(), Promise.resolve(e); + } + /** + * Finish the current creation. Calls finish and sets the interaction to be inactive + */ + finish() { + this.active !== P.NONE && (this.setActive(!1), this.finished.raiseEvent(this._geometry)); + } + destroy() { + this.finished.destroy(), this.created.destroy(), super.destroy(); + } +} +const Da = Symbol("validityPlaceholder"); +class fC extends ae { + constructor() { + super(P.CLICKMOVE | P.DBLCLICK, F.NONE | F.CTRL); + h(this, "_geometry", null); + h(this, "_coordinates", []); + h(this, "_lastCoordinate", null); + /** + * This coordinate is added together with the first click to ensure a valid geometry + * so the user has feedback. On the second click, this coordinate gets sliced to no longer be in + * sync with the last coordinate. + */ + h(this, "_validityPlaceHolder", null); + h(this, "finished", new L()); + h(this, "created", new L()); + this.setActive(); + } + /** + * Sets the coordiantes on the geometry + * @private + */ + _setCoordinates() { + this._geometry && this._geometry.setCoordinates([this._coordinates]); + } + pipe(e) { + return e.type & P.CLICKMOVE && this._geometry && (this._lastCoordinate.splice(0, e.positionOrPixel.length, ...e.positionOrPixel), this._setCoordinates()), e.type & P.CLICK && (this._geometry ? this._validityPlaceHolder ? (this._lastCoordinate = [...this._lastCoordinate], this._coordinates.splice(2, 1, this._lastCoordinate), this._validityPlaceHolder = null, this._geometry[Da] = !1) : (this._lastCoordinate = [...this._lastCoordinate], this._coordinates.push(this._lastCoordinate)) : (this._geometry = new ht([[e.positionOrPixel.slice()]]), e.map instanceof Ae ? this._geometry[ze] = !0 : this._geometry[hi] = !0, this._geometry[Da] = !0, this.created.raiseEvent(this._geometry), this._coordinates = [e.positionOrPixel.slice()], this._lastCoordinate = [...e.positionOrPixel], this._validityPlaceHolder = e.positionOrPixel.slice(), this._coordinates.push(this._lastCoordinate), this._coordinates.push(this._validityPlaceHolder))), e.type & P.DBLCLICK && this.finish(), Promise.resolve(e); + } + /** + * Finish the current creation. Calls finish and sets the interaction to be inactive + */ + finish() { + this.active !== P.NONE && (this._coordinates.pop(), this._validityPlaceHolder && this._coordinates.pop(), this._setCoordinates(), this.setActive(!1), this.finished.raiseEvent(this._geometry)); + } + destroy() { + this._geometry = null, this._coordinates = [], this.finished.destroy(), this.created.destroy(), super.destroy(); + } +} +async function gC(i, t) { + const e = i.getViewpointSync(); + if (!e) + return; + const s = e.clone(); + s.heading = 0, s.pitch = -90, e && !e.equals(s) && (t.fixedNorthOrientation && (e.heading = 0), e.pitch = -90, e.animate = !0, e.duration = 1, e.groundPosition && (e.cameraPosition = null), await i.gotoViewpoint(e)); +} +class Zl extends jt { + constructor() { + super(); + h(this, "_activeMap", null); + h(this, "_target", null); + /** + * if the active map is removed the last viewpoint is cached for the next mapActivation. + */ + h(this, "_cachedViewpoint", null); + /** + * The map pointer event handler. The EventHandler is shared amongst all maps within the collection. + */ + h(this, "eventHandler", new ww()); + /** + * Collection of layers shared amongst the maps within this collection, + * layers will be rendered if supported on the currently active map. + */ + h(this, "_layerCollection", new Ei()); + /** + * Called, if a map fails to initialize. The map causing the error will be removed from the collection. + */ + h(this, "initializeError", new L()); + /** + * Called, when a map (typically an oblique map) cannot show the current viewpoint. Is passed + * the map which cannot show the current viewpoint. + */ + h(this, "fallbackMapActivated", new L()); + /** + * Called, when a map is activated. Is passed the activated map. + */ + h(this, "mapActivated", new L()); + /** + * Manages the clipping object for the maps in this collection. + */ + h(this, "clippingObjectManager"); + h(this, "_mapPointerListeners", []); + h(this, "_splitPosition", 0.5); + /** + * Event raised when the maps split position changes. It passed the position as its only argument. + */ + h(this, "splitPositionChanged", new L()); + h(this, "_postRender", new L()); + // eslint-disable-next-line class-methods-use-this + h(this, "_postRenderListener", () => { + }); + /** Callback function that is passed when calling requestExclusiveMapControls and called when exclusive map controls are forcefully removed. */ + // eslint-disable-next-line class-methods-use-this + h(this, "_exclusiveMapControlsRemoved", () => { + }); + this.clippingObjectManager = new lC(this._layerCollection); + } + /** + * Creates a MapCollection from an iterable of maps, such as an Array. + */ + static from(e) { + const s = new Zl(); + if (e) + for (const r of e) + s.add(r); + return s; + } + /** + * The currently active map + */ + get activeMap() { + return this._activeMap; + } + /** + * The currently set HTML element in which to render the maps + */ + get target() { + return this._target; + } + /** + * The current layer collection + */ + get layerCollection() { + return this._layerCollection; + } + /** + * Set the layer collection for these maps. + */ + set layerCollection(e) { + S(e, Ei), this._layerCollection = e, this._array.forEach((s) => { + s.layerCollection = this._layerCollection; + }); + } + /** + * The current splitPosition + */ + get splitPosition() { + return this._splitPosition; + } + /** + * Set the splitPosition for these maps. + */ + set splitPosition(e) { + if (S(e, Number), e < 0 || e > 1) + throw new Error("Position must be between 0 and 1"); + Math.abs(this._splitPosition - e) > 1e-4 && (this._splitPosition = e, this._array.forEach((s) => { + s.splitPosition = this._splitPosition; + }), this.splitPositionChanged.raiseEvent(e)); + } + /** + * Raised on the active maps post render event + */ + get postRender() { + return this._postRender; + } + /** + * Adds a map to the collection. This will set the collections target + * and the collections on the map. + * It will add map event listeners and pass them to the event handler of this collection. + */ + add(e) { + const s = super.add(e); + return s !== null && (this._mapPointerListeners.push(e.pointerInteractionEvent.addEventListener(this.eventHandler.handleMapEvent.bind(this.eventHandler))), e.layerCollection = this._layerCollection, e.setTarget(this._target)), s; + } + _remove(e) { + if (this._activeMap === e) { + if (this._postRenderListener(), this._postRenderListener = () => { + }, this._cachedViewpoint = e.getViewpointSync(), this._target) { + const s = this._activeMap.className; + this._target.classList.remove(s); + } + this._activeMap = null; + } + return this.has(e) && (e.setTarget(null), e.layerCollection = new Ei()), super._remove(e); + } + _setActiveMapCSSClass() { + if (this._target && this._activeMap) { + const e = this._activeMap.className; + this._target.classList.add(e); + } + } + /** + * Set the target for these maps. + */ + setTarget(e) { + S(e, ie(je(String, HTMLElement))), this._target = typeof e == "string" ? document.getElementById(e) : e, this._array.forEach((s) => { + s.setTarget(this._target); + }), this._setActiveMapCSSClass(); + } + _getFallbackMap(e) { + const { fallbackMap: s } = e; + if (s) { + const r = this.getByKey(s); + if (r && r !== e) + return r; + he().warning(`the fallback map with the name: ${s} is missconfigured`); + } + return null; + } + _getFallbackMapOrDefault(e) { + return this._getFallbackMap(e) || this.getByType("OpenlayersMap")[0] || this._array[0]; + } + /** + * Sets the active map. This will 1. get the current viewpoint of an acitve map (if one is set) 2. + * determine that the map to be activated can show this viewpoint or has no fallback map set and 3. + * activates the map 4. calls gotoViewpoint with the previous maps viewpoint + */ + async setActiveMap(e) { + const s = this.getByKey(e); + if (!s) + return he("MapCollection").warning(`could not find map with name ${e}`), Promise.resolve(); + this._activeMap && this._activeMap.className === "CesiumMap" && s.className === "OpenlayersMap" && await gC(this._activeMap, s); + try { + await s.initialize(); + } catch (o) { + he("MapCollection").error(String(o)), this.remove(s); + const l = this._getFallbackMapOrDefault(s); + if (this.initializeError.raiseEvent({ + map: s, + error: o + }), !s.fallbackMap && s.fallbackToCurrentMap && this._activeMap) + return this.fallbackMapActivated.raiseEvent(s), Promise.resolve(); + if (l) + return this.fallbackMapActivated.raiseEvent(s), this.setActiveMap(l.name); + throw new Error("cannot activate a single map"); + } + let r; + if (this._activeMap || this._cachedViewpoint) { + if (this._activeMap === s) + return s.activate(); + if (r = this._activeMap ? await this._activeMap.getViewpoint() : this._cachedViewpoint, !await s.canShowViewpoint(r)) { + const l = this._getFallbackMap(s); + if (l) + return this.fallbackMapActivated.raiseEvent(s), this.setActiveMap(l.name); + if (s.fallbackToCurrentMap && this._activeMap) + return this.fallbackMapActivated.raiseEvent(s), Promise.resolve(); + } + if (this._cachedViewpoint = null, this._activeMap && (this._activeMap.deactivate(), this._target)) { + const l = this._activeMap.className; + this._target.classList.remove(l); + } + } + const n = this._activeMap; + this._activeMap = s, await this._activeMap.activate(), this._setActiveMapCSSClass(), r && await this._activeMap.gotoViewpoint(r); + const a = { + apiCalls: !!(n != null && n.movementApiCallsDisabled), + keyEvents: !!(n != null && n.movementKeyEventsDisabled), + pointerEvents: !!(n != null && n.movementPointerEventsDisabled) + }; + return s.disableMovement(a), n == null || n.disableMovement(!1), this.clippingObjectManager.mapActivated(s), this._postRenderListener(), this._postRenderListener = this._activeMap.postRender.addEventListener((o) => { + this.postRender.raiseEvent(o); + }), this.mapActivated.raiseEvent(s), Promise.resolve(); + } + /** + * Returns all maps of a specified type + */ + getByType(e) { + return this._array.filter((s) => s.className === e); + } + /** + * Manages the disabling of map navigation controls. By calling this function the map navigation controls passed in the options are disabled. The remove function passed by the previous caller is executed. + * @param options - which of the movement controls should be disabled. + * @param removed - the callback for when the interaction is forcefully removed. + * @returns function to reset map controls. + */ + requestExclusiveMapControls(e, s) { + return this._exclusiveMapControlsRemoved(), this._activeMap && this._activeMap.disableMovement(e), this._exclusiveMapControlsRemoved = s, () => { + s === this._exclusiveMapControlsRemoved && (this._exclusiveMapControlsRemoved = () => { + }, this._activeMap && this._activeMap.disableMovement(!1)); + }; + } + destroy() { + super.destroy(), [...this._layerCollection].forEach((e) => { + e.destroy(); + }), this._layerCollection.destroy(), this.eventHandler.destroy(), this.mapActivated.destroy(), this.clippingObjectManager.destroy(), this.splitPositionChanged.destroy(), this.fallbackMapActivated.destroy(), this.initializeError.destroy(), this._mapPointerListeners.forEach((e) => { + e(); + }), this._mapPointerListeners = [], this._target = null; + } +} +function mC() { + return navigator.language ? navigator.language.substring(0, 2) : "en"; +} +function pC(i, t) { + const e = _i(new jt("id"), i); + return e.added.addEventListener(({ id: s }) => { + t.hideObjects([s]); + }), e.replaced.addEventListener(({ new: s }) => { + t.showObjects([s.id]); + }), e.removed.addEventListener(({ id: s }) => { + t.showObjects([s]); + }), e; +} +function Q1(i) { + const t = i.toJSON(); + return t.loop != null && t.loop, t.interpolation != null && t.interpolation, t.multiplier != null && t.multiplier, { + type: "FeatureCollection", + features: t.anchors ?? [], + vcsMeta: { + version: xi, + flightOptions: t + } + }; +} +function Nd(i) { + const { loop: t, anchors: e } = i, s = [...e], r = t ? e.size + 1 : e.size, n = new Array(r), a = new Array(r), o = new Array(r); + if (s.forEach((d, u) => { + if (n[u] = _.fromDegrees(d.coordinate[0], d.coordinate[1], d.coordinate[2]), a[u] = ta.fromHeadingPitchRoll(us.fromDegrees(d.heading, d.pitch, d.roll)), u > 0) { + let f = s[u - 1].duration; + f || (f = _.distance(n[u - 1], n[u]) / 300 || 1), o[u] = o[u - 1] + f; + } else + o[u] = 0; + }), t) { + n[r - 1] = _.fromDegrees(s[0].coordinate[0], s[0].coordinate[1], s[0].coordinate[2]), a[r - 1] = ta.fromHeadingPitchRoll(us.fromDegrees(s[0].heading, s[0].pitch, s[0].roll)); + let d = s[r - 2].duration; + d || (d = _.distance(n[r - 2], n[r - 1]) / 300 || 1), o[r - 1] = o[r - 2] + d; + } + const l = i.interpolation === "spline" ? new $c({ times: o, points: n }) : new xg({ times: o, points: n }), c = new Eg({ times: o, points: a }); + return { + destinationSpline: l, + quaternionSpline: c, + times: o + }; +} +function Rd(i) { + const t = []; + if (i.interpolation === "spline") { + const { destinationSpline: e, times: s } = Nd(i), r = new ee(), n = (l) => { + ee.fromCartesian(e.evaluate(l), void 0, r), t.push([ + b.toDegrees(r.longitude), + b.toDegrees(r.latitude), + r.height + ]); + }, a = s[s.length - 1], o = a / 0.2 > 500 ? a / 500 : 0.2; + for (let l = 0; l < a; l += o) + n(l); + n(a); + } else { + for (const e of i.anchors) + t.push(e.coordinate); + i.loop && t.push(t[0]); + } + return t; +} +function eM(i) { + return { + type: "FeatureCollection", + features: [ + { + type: "Feature", + geometry: { + type: "LineString", + coordinates: Rd(i) + }, + properties: {} + } + ] + }; +} +function yC(i) { + const t = i.vcsMeta && i.vcsMeta.flightOptions ? i.vcsMeta.flightOptions : {}; + return t.anchors = i.features, t; +} +const Fd = { + name: String, + coordinate: [Number], + heading: Number, + pitch: Number, + roll: Number, + duration: Number, + title: ie(String) +}; +function _C(i) { + return ws(i, Fd) && i.coordinate.length === 3; +} +function Gd(i) { + S(i, Fd); + const t = new L(), { name: e } = i; + let { title: s, heading: r, pitch: n, roll: a, coordinate: o, duration: l } = i; + return o = o.slice(), { + get changed() { + return t; + }, + get name() { + return e; + }, + get coordinate() { + return o; + }, + set coordinate(c) { + S(c, [Number]), S(c.length, 3), Tf(o, c) || (o = c.slice(), t.raiseEvent()); + }, + get heading() { + return r; + }, + set heading(c) { + S(c, Number), r !== c && (r = c, t.raiseEvent()); + }, + get pitch() { + return n; + }, + set pitch(c) { + S(c, Number), n !== c && (n = c, t.raiseEvent()); + }, + get roll() { + return a; + }, + set roll(c) { + S(c, Number), a !== c && (a = c, t.raiseEvent()); + }, + get duration() { + return l; + }, + set duration(c) { + S(c, Number), l !== c && (l = c, t.raiseEvent()); + }, + get title() { + return s; + }, + set title(c) { + S(c, ie(String)), s !== c && (s = c, t.raiseEvent()); + }, + destroy() { + t.destroy(); + } + }; +} +function tM(i) { + if (i.cameraPosition) + return Gd({ + ...i, + coordinate: i.cameraPosition, + duration: i.duration ?? 1, + title: i.properties.title + }); +} +function mc(i) { + const t = { + ...i.properties, + name: i.id ? String(i.id) : Xe(), + coordinate: i.geometry.coordinates + }; + if (_C(t)) + return Gd(t); +} +function iM(i) { + return new It({ + name: i.name, + cameraPosition: i.coordinate.slice(), + heading: i.heading, + pitch: i.pitch, + roll: i.roll, + duration: i.duration, + properties: { + title: i.title + } + }); +} +function vC(i) { + const t = { + heading: i.heading, + pitch: i.pitch, + roll: i.roll, + duration: i.duration + }; + return i.title && (t.title = i.title), { + type: "Feature", + id: i.name, + geometry: { + type: "Point", + coordinates: i.coordinate.slice() + }, + properties: t + }; +} +class qs extends Ut { + constructor(e) { + super(e); + h(this, "anchors"); + h(this, "_multiplier"); + h(this, "_loop"); + h(this, "_interpolation"); + /** + * Raised when anchors are added, removed, moved or changed + */ + h(this, "anchorsChanged", new L()); + /** + * Raised when multiplier, loop or interpolation changes. + */ + h(this, "propertyChanged", new L()); + h(this, "_url"); + h(this, "_readyPromise", null); + h(this, "_anchorListeners", /* @__PURE__ */ new Map()); + const s = qs.getDefaultOptions(), r = (e.anchors ?? s.anchors).map(mc).filter((n) => !!n); + this.anchors = Ui.from(r), this._multiplier = k(e.multiplier, s.multiplier), this._loop = ce(e.loop, s.loop), this._interpolation = e.interpolation || s.interpolation, this.anchorsChanged = new L(), this._url = e.url; + } + static get className() { + return "FlightInstance"; + } + static getDefaultOptions() { + return { + multiplier: 1, + loop: !1, + interpolation: "spline", + anchors: [] + }; + } + get initialized() { + return !!this._readyPromise; + } + get multiplier() { + return this._multiplier; + } + set multiplier(e) { + S(e, Number), this._multiplier !== e && (this._multiplier = e, this.propertyChanged.raiseEvent("multiplier")); + } + /** + * Whether this flight represents a circular flight path or not + */ + get loop() { + return this._loop; + } + set loop(e) { + S(e, Boolean), this._loop !== e && (this._loop = e, this.propertyChanged.raiseEvent("loop")); + } + get interpolation() { + return this._interpolation; + } + set interpolation(e) { + S(e, je("linear", "spline")), this._interpolation !== e && (this._interpolation = e, this.propertyChanged.raiseEvent("interpolation")); + } + initialize() { + if (!this._readyPromise) { + this._url ? this._readyPromise = ms(this._url).then((e) => { + const s = yC(e); + (s.anchors ?? []).map(mc).filter((r) => !!r).forEach((r) => this.anchors.add(r)), this._multiplier = s.multiplier ?? this._multiplier, this._loop = s.loop ?? this._loop, this._interpolation = s.interpolation ?? this._interpolation; + }) : this._readyPromise = Promise.resolve(); + for (const e of this.anchors) + this._anchorListeners.set(e.name, e.changed.addEventListener(() => { + this.anchorsChanged.raiseEvent(); + })); + this.anchors.added.addEventListener((e) => { + this._anchorListeners.set(e.name, e.changed.addEventListener(() => { + this.anchorsChanged.raiseEvent(); + })), this.anchorsChanged.raiseEvent(); + }), this.anchors.removed.addEventListener((e) => { + var s; + (s = this._anchorListeners.get(e.name)) == null || s(), this._anchorListeners.delete(e.name), this.anchorsChanged.raiseEvent(); + }), this.anchors.moved.addEventListener(() => { + this.anchorsChanged.raiseEvent(); + }); + } + return this._readyPromise; + } + /** + * checks if this flightInstance is valid. To be valid, a flight must have at least 2 anchors. + * @returns + */ + isValid() { + return this.anchors.size >= 2; + } + /** + * returns an options object for this flight. if this flight was configured via an URL, only the url will be configured. + * @returns + */ + toJSON() { + const e = super.toJSON(); + if (this._url) + return e.url = this._url, e; + const s = qs.getDefaultOptions(); + return this._multiplier !== s.multiplier && (e.multiplier = this._multiplier), this._loop !== s.loop && (e.loop = this._loop), this._interpolation !== s.interpolation && (e.interpolation = this._interpolation), this.anchors.size > 0 && (e.anchors = [...this.anchors].map(vC)), e; + } + destroy() { + this.anchorsChanged.destroy(), yi(this.anchors), this._anchorListeners.clear(), super.destroy(); + } +} +function SC() { + let i = 0, t = 0, e = 0, s = []; + return { + get startTime() { + return t; + }, + get endTime() { + return e; + }, + get currentTime() { + return i; + }, + get times() { + return s; + }, + currentSystemTime: void 0, + changed: new L(), + setCurrentTime(r) { + return i = r, this.changed.raiseEvent(this), this.currentTime; + }, + reset() { + i = 0, t = 0, e = 0, s = [], this.changed.raiseEvent(this); + }, + setTimes(r) { + s = r.slice(), e = s[s.length - 1], this.changed.raiseEvent(this); + }, + destroy() { + this.changed.destroy(); + } + }; +} +async function wC(i, t) { + S(i, qs), S(t, kd); + let e = t.maps.activeMap instanceof B ? t.maps.activeMap : t.maps.getByType(B.className)[0]; + if (!e) + throw new Error("Cannot start a flight player without a cesium map"); + await i.initialize(); + const s = SC(); + let r = "stopped"; + const n = new L(), a = (E) => { + r = E, n.raiseEvent(r); + }; + let o, l, c, d, u; + const f = () => { + r !== "stopped" && (c && (c(), c = void 0), d && (d(), d = void 0), a("stopped"), s.currentSystemTime = void 0, s.setCurrentTime(0)); + }, g = () => { + if (!i.isValid()) + f(), s.reset(); + else { + const E = Nd(i); + ({ destinationSpline: o, quaternionSpline: l } = E); + const { times: I } = E; + s.setTimes(I); + } + }; + g(); + const m = [ + i.anchorsChanged.addEventListener(g), + i.propertyChanged.addEventListener((E) => { + (E === "interpolation" || E === "loop") && g(); + }), + t.maps.mapActivated.addEventListener(() => { + f(), t.maps.activeMap instanceof B && (e = t.maps.activeMap); + }) + ], p = (E) => { + if (o && l) + return { + destination: o.evaluate(E), + orientation: us.fromQuaternion(l.evaluate(E)) + }; + he("FlightPlayer").error("cannot evaluate spline"); + }, y = (E) => { + const I = Date.now() / 1e3; + s.currentSystemTime || (s.currentSystemTime = I); + const R = I - s.currentSystemTime; + if (s.currentSystemTime = I, r === "paused") { + d && (d(), d = void 0); + return; + } + if (s.setCurrentTime(s.currentTime + R * i.multiplier), s.currentTime > s.endTime) + if (i.loop && s.endTime > 0) + for (; s.currentTime > s.endTime; ) + s.setCurrentTime(s.currentTime - s.endTime); + else + f(); + else if (s.currentTime < s.startTime) + if (i.loop) + s.setCurrentTime(s.endTime + s.currentTime); + else { + s.setCurrentTime(s.startTime); + return; + } + const D = p(s.currentTime); + D && E.camera.setView(D), r === "playing" && !d && (d = t.maps.requestExclusiveMapControls({ apiCalls: !0, keyEvents: !0, pointerEvents: !0 }, f)); + }, v = () => { + if (!i.isValid()) { + he("FlightPlayer").error(`cannot play invalid flight ${i.name}`); + return; + } + if (r === "playing") + return; + if (!(t.maps.activeMap instanceof B)) { + he("FlightPlayer").warning("cannot play without a cesium map active"); + return; + } + if (r === "paused") { + a("playing"); + return; + } + c && (c(), c = void 0), d && (d(), d = void 0); + const E = e.getScene(); + E && (c = E.postRender.addEventListener(y), s.currentSystemTime = void 0, a("playing")); + }, w = (E) => { + var I; + if (!i.isValid()) { + he("FlightPlayer").error(`cannot goToTime of invalid flight ${i.name}`); + return; + } + if (E > s.endTime) { + he("FlightPlayer").warning(`time: ${E} out of range`); + return; + } + if (s.currentSystemTime = void 0, s.setCurrentTime(E), r !== "playing") { + const R = p(s.currentTime); + R && ((I = e.getScene()) == null || I.camera.setView(R)); + } + }, C = new L(), x = () => { + c && (c(), c = void 0), d && (d(), d = void 0), u != null && clearTimeout(u), m.forEach((E) => { + E(); + }), s.destroy(), n.destroy(), C.raiseEvent(), C.destroy(); + }; + return m.push(t.flights.removed.addEventListener((E) => { + E === i && x(); + }), t.flights.added.addEventListener((E) => { + E.name === i.name && x(); + })), { + get flightInstanceName() { + return i.name; + }, + get clock() { + return s; + }, + get state() { + return r; + }, + get stateChanged() { + return n; + }, + get destroyed() { + return C; + }, + play: v, + stop: f, + pause() { + r === "playing" && a("paused"); + }, + goToTime: w, + /** + * forwards the currentTime to the next anchor + */ + forward() { + const E = s.currentTime, I = s.times.find((R) => R > E) || s.times[s.times.length - 1]; + w(I); + }, + /** + * resets the currentTime to the previous anchor + */ + backward() { + const E = s.currentTime; + let I = s.times.findIndex((D) => D >= E) - 1; + u != null && (I -= 1, clearTimeout(u)), I < 0 && (I = 0); + const R = s.times[I]; + w(R), u = window.setTimeout(() => { + u = void 0; + }, 700); + }, + destroy: x + }; +} +class CC extends jt { + constructor(e) { + super(); + h(this, "_app"); + h(this, "_player"); + h(this, "playerChanged"); + h(this, "_playerDestroyedListener"); + this._app = e, this._player = void 0, this.playerChanged = new L(), this._playerDestroyedListener = () => { + }; + } + get player() { + return this._player; + } + remove(e) { + var s; + ((s = this._player) == null ? void 0 : s.flightInstanceName) === e.name && (this._player.stop(), this._player.destroy()), super.remove(e); + } + /** + * Creates a FlightPlayer for a flight instance, if not already existing for provided instance + * @param flight + */ + async setPlayerForFlight(e) { + var s; + return ((s = this._player) == null ? void 0 : s.flightInstanceName) === e.name ? this._player : (this._player && (this._playerDestroyedListener(), this._player.stop(), this._player.destroy()), this._player = await wC(e, this._app), this.playerChanged.raiseEvent(this._player), this._playerDestroyedListener = this._player.destroyed.addEventListener(() => { + this._player = void 0, this.playerChanged.raiseEvent(void 0); + }), this._player); + } + destroy() { + this._player && (this._player.stop(), this._player.destroy(), this._player = void 0), this.playerChanged.destroy(), this._playerDestroyedListener(), super.destroy(); + } +} +function hr() { + return he("init"); +} +const Na = /* @__PURE__ */ new Map(), MC = "_defaultDynamicModule"; +class kd { + /** + * @param options + */ + constructor(t = {}) { + h(this, "_id"); + h(this, "name"); + h(this, "description"); + h(this, "properties"); + h(this, "_defaultDynamicModule"); + h(this, "_dynamicModule"); + h(this, "_dynamicModuleIdChanged"); + /** + * represents the current Locale. + */ + h(this, "_locale"); + /** + * fires if the current Locale changes. + */ + h(this, "_localeChanged"); + h(this, "_mapClassRegistry"); + h(this, "_maps"); + h(this, "_layerClassRegistry"); + h(this, "_layers"); + h(this, "_obliqueCollections"); + h(this, "_viewpoints"); + h(this, "_styleClassRegistry"); + h(this, "_styles"); + h(this, "_modules"); + h(this, "_hiddenObjects"); + h(this, "_flights"); + h(this, "_categoryClassRegistry"); + h(this, "_categories"); + h(this, "_displayQuality"); + h(this, "_destroyed"); + h(this, "_moduleMutationChain"); + h(this, "_categoryItemClassRegistry"); + h(this, "_tileProviderClassRegistry"); + h(this, "_featureProviderClassRegistry"); + this._id = (t == null ? void 0 : t._id) || Xe(), this.name = t.name ?? this._id, this.description = t.description, this.properties = t.properties, this._defaultDynamicModule = new ol({ _id: MC }), this._dynamicModule = this._defaultDynamicModule; + const e = () => this._dynamicModule._id; + this._dynamicModuleIdChanged = new L(), this._locale = mC(), this._localeChanged = new L(), this._mapClassRegistry = new pi(Ks), this._maps = _i(new Zl(), e, void 0, dv.bind(null, this), ci), this._layerClassRegistry = new pi(ke), this._layers = _i(this._maps.layerCollection, e, mv.bind(null, this), gv.bind(null, this), st, pv), this._layers.locale = this.locale, this._obliqueCollections = _i(new jt(), e, void 0, (s) => new ps(s), ps), this._viewpoints = _i(new jt(), e, void 0, fv, It), this._styleClassRegistry = new pi(mn), this._styles = _i(new jt(), e, void 0, (s) => ei(this._styleClassRegistry, s), li), this._modules = new Ui("_id"), this._modules.add(this._dynamicModule), this._hiddenObjects = pC(e, this._layers.globalHider), this._flights = _i(new CC(this), e, void 0, (s) => new qs(s)), this._categoryClassRegistry = new pi(Iu), this._categories = new uw(this), this._displayQuality = new Aa(this), this._destroyed = new L(), this._moduleMutationChain = { running: !1, items: [] }, this._categoryItemClassRegistry = new pi(new Qi()), this._tileProviderClassRegistry = new pi(Js), this._featureProviderClassRegistry = new pi(Ll), Na.set(this._id, this); + } + get id() { + return this._id; + } + get locale() { + return this._locale; + } + /** + * sets the locale of the vcsApp and the linked layerCollection. + * This will trigger the localeChanged Event. + * @param value new locale with 2 letters + */ + set locale(t) { + if (S(t, String), t.length !== 2) { + hr().warning('Provide a valid locale, for example "en", "de" with max. 2 letters'); + return; + } + this._locale !== t && (this._locale = t, this.layers.locale = t, this._localeChanged.raiseEvent(t)); + } + get localeChanged() { + return this._localeChanged; + } + get maps() { + return this._maps; + } + get layers() { + return this._layers; + } + get obliqueCollections() { + return this._obliqueCollections; + } + get viewpoints() { + return this._viewpoints; + } + get styles() { + return this._styles; + } + get categories() { + return this._categories; + } + get hiddenObject() { + return this._hiddenObjects; + } + get flights() { + return this._flights; + } + get displayQuality() { + return this._displayQuality; + } + get destroyed() { + return this._destroyed; + } + get modules() { + return [...this._modules]; + } + get moduleAdded() { + return this._modules.added; + } + get moduleRemoved() { + return this._modules.removed; + } + get dynamicModuleId() { + return this._dynamicModule._id; + } + get dynamicModuleIdChanged() { + return this._dynamicModuleIdChanged; + } + get mapClassRegistry() { + return this._mapClassRegistry; + } + get layerClassRegistry() { + return this._layerClassRegistry; + } + get styleClassRegistry() { + return this._styleClassRegistry; + } + get categoryClassRegistry() { + return this._categoryClassRegistry; + } + get categoryItemClassRegistry() { + return this._categoryItemClassRegistry; + } + get tileProviderClassRegistry() { + return this._tileProviderClassRegistry; + } + get featureProviderClassRegistry() { + return this._featureProviderClassRegistry; + } + getModuleById(t) { + return this._modules.getByKey(t); + } + async _parseModule(t) { + const { config: e } = t; + e.projection && b0(e.projection), await this._styles.parseItems(e.styles, t._id), await this._layers.parseItems(e.layers, t._id), await this._obliqueCollections.parseItems(e.obliqueCollections, t._id), await this._viewpoints.parseItems(e.viewpoints, t._id), await this._maps.parseItems(e.maps, t._id), await this._hiddenObjects.parseItems(e.hiddenObjects, t._id), await this._flights.parseItems(e.flights, t._id), Array.isArray(e.categories) && await Promise.all(e.categories.map(async ({ name: s, items: r }) => { + await this._categories.parseCategoryItems(s, r, t._id); + })); + } + async _setModuleState(t) { + const { config: e } = t; + if ([...this._layers].filter((s) => s[Je] === t._id).forEach((s) => { + s.activeOnStartup && s.activate().catch((r) => { + hr().error(`Failed to activate active on startup layer ${s.name}`), hr().error(String(r)); + }); + }), e.startingObliqueCollectionName) { + const s = this._obliqueCollections.getByKey(e.startingObliqueCollectionName); + s && await Promise.all([...this._maps].filter((r) => r instanceof Ae).map((r) => r.setCollection(s))); + } + if (e.startingMapName ? await this._maps.setActiveMap(e.startingMapName) : !this._maps.activeMap && this._maps.size > 0 && await this._maps.setActiveMap([...this._maps][0].name), e.startingViewpointName && this._maps.activeMap) { + const s = this._viewpoints.getByKey(e.startingViewpointName); + s && await this._maps.activeMap.gotoViewpoint(s); + } + } + /** + * When adding multiple modules, adding of previous modules are awaited. + * If an invalid module is added an error is thrown and already added items of invalid module are removed. + * @param module + */ + async addModule(t) { + S(t, ol); + const e = async () => { + try { + if (this._modules.hasKey(t._id)) { + hr().info(`module with id ${t._id} already loaded`); + return; + } + await this._parseModule(t), await this._setModuleState(t), this._modules.add(t); + } catch (s) { + throw await this._removeModule(t._id), s; + } + }; + return new Promise((s, r) => { + this._moduleMutationChain.items.push({ + moduleId: t._id, + mutation: e, + resolve: s, + reject: r + }), this._startModuleMutationChain(); + }); + } + _startModuleMutationChain() { + if (!this._moduleMutationChain.running) { + const t = this._moduleMutationChain.items.shift(); + if (t) + try { + this._moduleMutationChain.running = !0, t.mutation().then(() => t.resolve()).catch((e) => t.reject(e)).finally(() => { + this._moduleMutationChain.running = !1, this._startModuleMutationChain(); + }); + } catch (e) { + t.reject(e), this._moduleMutationChain.running = !1, this._startModuleMutationChain(); + } + } + } + serializeModule(t) { + if (S(t, String), !this._modules.hasKey(t)) + throw new Error("VcsModule is not managed by this app, call add(module) before"); + const e = this._modules.getByKey(t).toJSON(); + return e.maps = this._maps.serializeModule(t), e.layers = this._layers.serializeModule(t), e.obliqueCollections = this._obliqueCollections.serializeModule(t), e.viewpoints = this._viewpoints.serializeModule(t), e.styles = this._styles.serializeModule(t), e.hiddenObjects = this._hiddenObjects.serializeModule(t), e.flights = this._flights.serializeModule(t), e.categories = [...this._categories].map((s) => s.serializeModule(t)).filter((s) => !!s), e; + } + /** + * sets the given module as the dynamic + * @param module + */ + setDynamicModule(t) { + if (!this._modules.has(t)) + throw new Error("VcsModule is not managed by this app, call add(module) before"); + this._dynamicModule !== t && (this._dynamicModule = t, this.dynamicModuleIdChanged.raiseEvent(this.dynamicModuleId)); + } + /** + * resets the dynamic VcsModule to the "defaultDynamicModule" + */ + resetDynamicModule() { + this.setDynamicModule(this._defaultDynamicModule); + } + async _removeModule(t) { + await Promise.all([ + this._maps.removeModule(t), + this._layers.removeModule(t), + this._viewpoints.removeModule(t), + this._styles.removeModule(t), + this._obliqueCollections.removeModule(t), + this._hiddenObjects.removeModule(t), + this._flights.removeModule(t) + ]); + } + async removeModule(t) { + const e = async () => { + const s = this._modules.getByKey(t); + if (!s) { + hr().info(`module with id ${t} has already been removed`); + return; + } + await this._removeModule(t), this._modules.remove(s); + }; + return new Promise((s, r) => { + this._moduleMutationChain.items.push({ + moduleId: t, + mutation: e, + resolve: s, + reject: r + }), this._startModuleMutationChain(); + }); + } + /** + * Destroys the app and all its collections, their content and ui managers. + */ + destroy() { + this._moduleMutationChain.running = !1, this._moduleMutationChain.items.splice(0), Object.defineProperty(this, "_moduleMutationChain", { + get() { + throw new Error("VcsApp was destroyed"); + } + }), Na.delete(this._id), yi(this._maps), yi(this._layers), yi(this._obliqueCollections), yi(this._viewpoints), yi(this._styles), yi(this._categories), this._modules.destroy(), this._hiddenObjects.destroy(), this._mapClassRegistry.destroy(), this._layerClassRegistry.destroy(), this._styleClassRegistry.destroy(), this._categoryClassRegistry.destroy(), this._categoryItemClassRegistry.destroy(), this._tileProviderClassRegistry.destroy(), this._featureProviderClassRegistry.destroy(), this._displayQuality.destroy(), this.destroyed.raiseEvent(), this.destroyed.destroy(), this.localeChanged.destroy(), this.dynamicModuleIdChanged.destroy(); + } +} +function sM(i) { + return Na.get(i); +} +window.vcs = window.vcs || {}; +window.vcs.apps = Na; +window.vcs.createModuleFromConfig = (i) => new ol(i); +function zd(i) { + if (!i) + return !1; + const t = i.getType(); + return t === "LineString" ? Gl(i) : t === "Polygon" ? Ku(i) : t === "Point" ? nd(i) : t === "Circle" ? td(i) : !1; +} +const Jl = Symbol("Vertex"), wn = Symbol("VertexIndex"), Te = Symbol("Handler"), Oi = Symbol("MouseOver"), Kl = [ + "olcs_altitudeMode", + "olcs_groundLevel", + "olcs_heightAboveGround" +], pc = [ + "altitudeMode", + "groundLevel", + "heightAboveGround" +]; +function yc(i, t, e) { + i[t] = e; +} +function Hd(i, t, e) { + return pc.forEach((s) => { + yc(i.vectorProperties, s, t.vectorProperties[s]); + }), t.vectorProperties.propertyChanged.addEventListener((s) => { + pc.forEach((r) => { + s.includes(r) && (yc(i.vectorProperties, r, t.vectorProperties[r]), r === "altitudeMode" && (e == null || e())); + }); + }); +} +function tr(i) { + const t = {}; + return Kl.forEach((e) => { + const s = i.get(e); + s != null && (t[e] = s); + }), t; +} +function ir(i, t, e) { + const s = new Ve(i); + s[ze] = !0; + const r = new ue({ + geometry: s, + ...t + }); + return r[Jl] = !0, r[wn] = e, r[_n] = !0, r[pe] = !0, r; +} +function Cn(i) { + return i instanceof ue && !!i[Jl]; +} +function Mn(i) { + let t = !1; + const e = new Array(i.length * 3); + i.forEach((r, n) => { + const a = r.getGeometry().getCoordinates(); + t = t || a.length === 2, e[n * 3] = a[0], e[n * 3 + 1] = a[1], e[n * 3 + 2] = a[2]; + }); + const s = new Array(i.length); + for (let r = 0; r < i.length; r++) { + const n = [e[r * 3], e[r * 3 + 1]]; + t || (n[2] = e[r * 3 + 2]), s[r] = n; + } + return { + coordinates: s, + layout: t ? "XY" : "XYZ" + }; +} +let Me = new H(), Kt = new H(), Do = new H(), ot = new _(), De = new _(), No = new _(); +function an(i, t, e) { + Me = H.fromElements(t[0] - i[0], t[1] - i[1], Me), Me.equals(H.ZERO) && (Me = H.fromElements(1, 1, Me)), Me = H.normalize(Me, Me), Kt = H.fromElements(e[0] - i[0], e[1] - i[1], Kt); + const s = H.dot(Me, Kt); + return Me = H.multiplyByScalar(Me, s, Me), [ + Me.x + i[0], + Me.y + i[1], + e[2] + ]; +} +function xC(i, t, e, s) { + ot = _.fromElements(t[0] - i[0], t[1] - i[1], t[2] - i[2], ot), De = _.fromElements(e[0] - i[0], e[1] - i[1], e[2] - i[2], De), No = _.fromElements(e[0] - t[0], e[1] - t[1], e[2] - e[2], No); + const r = _.magnitude(ot); + return r < _.magnitude(De) || r < _.magnitude(No) ? !1 : (ot = _.normalize(ot, ot), De = _.normalize(De, De), ot.equalsEpsilon(De, s || b.EPSILON5)); +} +function EC(i, t, e, s) { + Me = H.fromElements(t[0] - i[0], t[1] - i[1], Me), Kt = H.fromElements(e[0] - i[0], e[1] - i[1], Kt), Do = H.fromElements(e[0] - t[0], e[1] - t[1], Do); + const r = H.magnitude(Me); + return r < H.magnitude(Kt) || r < H.magnitude(Do) ? !1 : (Me = H.normalize(Me, Me), Kt = H.normalize(Kt, Kt), Me.equalsEpsilon(Kt, s || b.EPSILON5)); +} +function Bd(i, t) { + return ot = wt(i, ot), De = t.globe.ellipsoid.geodeticSurfaceNormal(ot, De), De = _.cross(t.camera.rightWC, De, De), De = _.normalize(De, De), oe.fromPointNormal(ot, De); +} +function rM(i, t) { + return ot = wt(i, ot), De = t.globe.ellipsoid.geodeticSurfaceNormal(ot, De), oe.fromPointNormal(ot, De); +} +function Qt(i, t, e) { + const s = t.getPickRay(e, new Xc()), r = Og.rayPlane(s, i); + return r ? ee.fromCartesian(r) : ee.ZERO; +} +async function nM(i, t) { + if (he("editor helpers").deprecate("drapeGeometryOnTerrain", "drapeGeometryOnTerrain is deprecated and will be removed in 6.1. Use drapeGeometryOnSurface instead."), t instanceof B) { + const e = i.getCoordinates(), s = Wt(i, e); + await t.getHeightFromTerrain(s), i.setCoordinates(e, "XYZ"); + } +} +async function aM(i, t) { + if (he("editor helpers").deprecate("placeGeometryOnTerrain", "place geometry on terrain is deprecated and will be removed in 6.1. Use placeGeometryOnSurface instead."), t instanceof B) { + const e = i.getCoordinates(), s = Wt(i, e); + await t.getHeightFromTerrain(s); + let r = 1 / 0; + s.forEach((n) => { + r > n[2] && (r = n[2]); + }), s.forEach((n) => { + n[2] = r; + }), i.setCoordinates(e, "XYZ"); + } +} +const OC = ` + + + + + +`, _t = { + // TODO these can now be designed custom. IE11 no linger required + auto: "auto", + scaleNESW: "nesw-resize", + scaleNWSE: "nwse-resize", + rotate: "crosshair", + translate: "move", + select: "pointer", + edit: `url("data:image/svg+xml;charset=utf-8,${encodeURIComponent(OC)}"), pointer`, + // fa pencil + translateVertex: "move", + // fa-stack pointer-move + removeVertex: "no-drop", + // fa-stack pencil-minus + insertVertex: "cell", + // fa-stack pencil-plus + addToSelection: "cell", + // fa-stack pointer-black + removeFromSelection: "not-allowed" +}; +class bC extends ae { + constructor(e) { + super(P.MOVE, (e ? F.NONE : F.NONE | F.SHIFT) | F.CTRL); + h(this, "_currentVertex", null); + h(this, "cursorStyle"); + this.setActive(); + } + pipe(e) { + var s; + return Cn(e.feature) ? this._currentVertex = e.feature : this._currentVertex = null, !this.cursorStyle && ((s = e.map) != null && s.target) && (this.cursorStyle = e.map.target.style), this._evaluate(e.key), Promise.resolve(e); + } + modifierChanged(e) { + this._evaluate(e); + } + setActive(e) { + super.setActive(e), this.reset(); + } + /** + * Reset the cursorStyle to auto + */ + reset() { + this.cursorStyle && this.cursorStyle.cursor && (this.cursorStyle.cursor = _t.auto); + } + _evaluate(e) { + var s; + this.cursorStyle && (this._currentVertex ? (e === F.SHIFT ? this.cursorStyle.cursor = _t.removeVertex : this.cursorStyle.cursor = _t.translateVertex, this.cursorStyle[Oi] = this.id) : ((s = this.cursorStyle) == null ? void 0 : s[Oi]) === this.id && (this.cursorStyle.cursor = _t.auto, delete this.cursorStyle[Oi])); + } + destroy() { + this.reset(), super.destroy(); + } +} +const Qa = ["orthogonal", "parallel", "vertex", "edge"]; +let Ro = new H(), Xt = new H(); +const PC = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABkCAYAAAA2VDb+AAACmElEQVR4Xu2a3zHFQBjFz60AFeDNGypABcaTVzqgAlSADuiACuiADtCBDpgzk525Yyb5cpNNzibOvt652f1+3/n+bbIA8IP6tWj4bRY/0UADsAIcArUEnANmkemCGHcSdBJ0EnQSrCPgKuAqMHMCngU8DHka9DjsVtitsFtht8JuhWsIeBaYeScMt8Juhd0KuxV2K+xWuJ7ANoDPOZfCqAzSdgJ4AvAK4HluMNoA+GszYdxXQCbPowuAZDRBXE49RPoASCAeANxMFUQOAAnEXaWISYVFTgA0nInyBMD3VCjkBpCqBiG8TwHCEACS3ecAmB+KXhGAfQCHAM4A7HawhOXyosP/RvtLBGD5RoggrgEcrHi6opWwCoBkdxcQxULoAiCBoLRvW6qBVeGoxMTYBwBtpxrYEa61AFEkhL4AaPdWBaFNkuRgxQmzmJUDAI1Zr5qgNhDYNjOZFrFyAVgFAkOB5bWIe4acAFI4sAOMcgLzBrtF+coNgAbtVeEQQWBV4OwgXUMAoEGM8avAsiIS4lAAaDsN3AwgMBdIh6YhAbBHeAkAyGeFIQHQdia74wYI8jAYGgAT4lugAlYDgpKsoQG0yQWP1bg9WwBRRWBjtCGxHhjl+wDOCh+BgQQguUccIwRoO0td05wga4rGAhBVA75g4bX66GssAFEekPUDEQCOrjnWDoDThgd9qW6QIwA5jC/6GQYQfCVWtPdyHM4KsAKavxPMobKin8EQKOaGVkFq+d2fYn/5ngYgd4H4AFaA2AHy7a0AuQvEB7ACxA6Qb28FyF0gPoAVIHaAfHsrQO4C8QGsALED5NtbAXIXiA9gBYgdIN/eCpC7QHwAK0DsAPn2VoDcBeIDWAFiB8i3twLkLhAf4N8r4Bch+4Nf5+N6mQAAAABJRU5ErkJggg=="; +let Fo; +function LC() { + return Fo || (Fo = new K({ + image: new ni({ + src: PC, + scale: 0.25, + anchor: [0.5, 1] + }) + })), Fo; +} +const IC = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAd1JREFUeJzt00EKwkAQRcFEPGyOpKfVE/iyiDIzWLVv+DS8bQMAAAAAAAAAAAAAAAAAAAAAAAAAAID/so8esIDj4v3jKys+m33f0gRy7nXx/tc/nn3f0m6jB8DMBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBAEAkEgEAQCQSAQBAJBIBDuowcs4Dl6wInZ9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAALeQNcNQZTV+qErgAAAABJRU5ErkJggg=="; +let Go; +function TC() { + return Go || (Go = new K({ + image: new ni({ + src: IC, + scale: 0.1, + anchor: [0.5, 1] + }) + })), Go; +} +let ko; +function AC() { + return ko || (ko = new K({ + image: new Us({ + radius: 6, + points: 4, + fill: new et({ + color: [255, 255, 255, 0.4] + }), + stroke: new Be({ + color: _a, + width: 1 + }) + }) + })), ko; +} +const Ft = b.toRadians(5); +function DC(i, t, e) { + Ro = H.fromElements(t[0] - i[0], t[1] - i[1], Ro); + const s = lh.fromArray([0, 1, -1, 0]); + Xt = lh.multiplyByVector(s, Ro, Xt), Xt = H.normalize(Xt, Xt), Xt = H.multiplyByScalar(Xt, 1e-4, Xt); + const r = [ + Xt.x + t[0], + Xt.y + t[1], + e[2] + ]; + return an(t, r, e); +} +function NC(i, t, e) { + const s = an(i, t, e), r = DC(i, t, e), n = oi(s, e), a = oi(r, e); + return n > a ? r : s; +} +function RC(i, t, e) { + let s = e + b.PI_OVER_TWO; + s = s > b.TWO_PI ? s - b.TWO_PI : s; + const r = [ + i[0] + 100 * Math.cos(s), + i[1] - 100 * Math.sin(s), + i[2] + ]; + return an(i, r, t); +} +function FC(i, t, e, s) { + const r = bi(t, i), n = bi(e, t), a = Math.abs(n - r); + if (a < Ft || // 5 + a > b.PI_OVER_TWO - Ft && a < b.PI_OVER_TWO + Ft || // 90 +/- 5 + a > b.PI - Ft && a < b.PI + Ft || // 180 +/- 5 + a > b.THREE_PI_OVER_TWO - Ft && a < b.THREE_PI_OVER_TWO + Ft || // 280 +/- 5 + a > b.TWO_PI - Ft) + return { + type: "orthogonal", + snapped: NC(e, t, i), + otherVertexIndex: s + }; +} +function GC(i, t, e, s) { + const r = bi(t, i), n = e.length; + for (let a = 0; a < n; a++) { + const o = e[a]; + if (o >= 0) { + const l = Math.abs(o - r); + if (l < Ft || // 5 + l > b.PI - Ft && l < b.PI + Ft || // 180 +/- 5 + l > b.TWO_PI - Ft) + return { + type: "parallel", + snapped: RC(t, i, o), + otherVertexIndex: s, + parallelIndex: a + }; + } + } +} +function ki(i, t, e, s, r, n, a = !0, o = !0, l = Y.CLAMP_TO_GROUND) { + let c = a ? FC(i, t, e, r) : void 0; + !c && o && (c = GC(i, t, s, r)); + const d = i.length === 2 || Ot(l) ? oi : Ou; + if (c != null && c.snapped && d(c.snapped, i) <= n) + return c; +} +function Ql(i, t, e, s = !0, r = !0, n = Y.CLAMP_TO_GROUND) { + let a = 1 / 0, o; + const l = t.length === 2 || Ot(n) ? oi : Ou; + return s && i.forEach((c) => { + const d = c.getFlatCoordinates(), u = c.getStride(), { length: f } = d; + for (let g = 0; g < f; g += u) { + const m = [d[g], d[g + 1]]; + u > 2 && (m[2] = d[g + 2]); + const p = l(m, t); + p < a && p <= e && (a = p, o ? (o.type = "vertex", o.snapped = m) : o = { + type: "vertex", + snapped: m + }); + } + }), !o && r && (a = 1 / 0, i.forEach((c) => { + const d = c.getClosestPoint(t), u = l(d, t); + u < a && u <= e && (a = u, o ? (o.type = "edge", o.snapped = d) : o = { + type: "edge", + snapped: d + }); + })), o; +} +function eh(i, t, e) { + const s = i.map((r) => { + let n; + if ((r == null ? void 0 : r.type) === "orthogonal" && r.otherVertexIndex > -1) + n = new Fe({ + geometry: new Ve(t[r.otherVertexIndex]) + }), n.setStyle(LC); + else if ((r == null ? void 0 : r.type) === "parallel" && r.parallelIndex > -1) { + const { parallelIndex: a } = r, o = a !== t.length - 1 ? a + 1 : 0, l = ja(t[a], t[o]); + n = new Fe({ + geometry: new Ve(l) + }), n.setStyle(TC()); + } else (r == null ? void 0 : r.type) === "vertex" ? (n = new Fe({ + geometry: new Ve(r.snapped), + olcs_allowPicking: !1, + olcs_primitiveOptions: { + type: Tt.BOX, + geometryOptions: { + minimum: [-3, -3, -3], + maximum: [3, 3, 3] + }, + depthFailColor: "rgba(150,147,147,0.47)" + }, + olcs_modelAutoScale: !0 + }), n.setStyle(AC())) : (r == null ? void 0 : r.type) === "edge" && (n = new Fe({ + geometry: new Ve(r.snapped), + olcs_allowPicking: !1, + olcs_primitiveOptions: { + type: Tt.SPHERE, + geometryOptions: { + radius: 3 + }, + depthFailColor: "rgba(150,147,147,0.47)" + }, + olcs_modelAutoScale: !0 + })); + if (n) { + const a = n.getGeometry(); + a[ze] = !0, a[hi] = !0, n[_n] = !0; + } + return n; + }).filter((r) => !!r); + return ui(e.vectorProperties.altitudeMode) && s.forEach((r) => { + r.set("olcs_altitudeMode", "absolute"); + }), e.addFeatures(s), () => { + e.removeFeaturesById(s.map((r) => r.getId())); + }; +} +function Vd(i, t, e) { + var n, a; + const s = (n = i[0]) == null ? void 0 : n.snapped, r = (a = i[1]) == null ? void 0 : a.snapped; + if (s && r && (i[0].type === "orthogonal" || i[0].type === "parallel") && (i[1].type === "orthogonal" || i[1].type === "parallel")) { + const o = t[i[0].otherVertexIndex], l = t[i[1].otherVertexIndex]; + if (o && l) { + const c = I0([s, o], [r, l]); + if (c && oi(c, s) <= e) + return [c[0], c[1], s[2]]; + } + } + if (r) + return r; + if (s) + return s; +} +function kC(i) { + const t = i.length - 2; + if (t > 0) { + const e = new Array(t); + for (let s = 0; s < t; s++) + e[s] = bi(i[s], i[s + 1]); + return e; + } + return []; +} +class zC extends ae { + constructor(e, s = [...Qa]) { + super(P.CLICKMOVE | P.DBLCLICK, F.NONE | F.CTRL); + h(this, "_coordinates", []); + h(this, "_bearings", []); + h(this, "_scratchLayer"); + h(this, "_isPolygon", !1); + h(this, "_coordinatesDirty", !1); + h(this, "_geometryLister"); + h(this, "_removeFeatures"); + h(this, "_snappingGeometry"); + h(this, "_snapToVertex", !0); + h(this, "_snapToEdge", !0); + h(this, "_snapOrthogonal", !0); + h(this, "_snapParallel", !0); + this._scratchLayer = e, this.snapTo = s; + } + get snapTo() { + const e = []; + return this._snapToVertex && e.push("vertex"), this._snapToEdge && e.push("edge"), this._snapOrthogonal && e.push("orthogonal"), this._snapParallel && e.push("parallel"), e; + } + set snapTo(e) { + this._snapToVertex = e.includes("vertex"), this._snapToEdge = e.includes("edge"), this._snapOrthogonal = e.includes("orthogonal"), this._snapParallel = e.includes("parallel"); + } + _setCoordinates(e) { + this._coordinates = e, this._bearings = kC(this._coordinates), this._coordinates.length > 2 && (this._snappingGeometry = new xt(this._coordinates.slice(0, this._coordinates.length - 1))); + } + setGeometry(e) { + var n; + (n = this._geometryLister) == null || n.call(this), this._snappingGeometry = void 0; + let s; + e instanceof ht ? (this._isPolygon = !0, s = () => { + e[Da] || this._setCoordinates(e.getCoordinates()[0]); + }) : (this._isPolygon = !1, s = () => { + this._setCoordinates(e.getCoordinates()); + }), s(); + const r = e.on("change", () => { + this._coordinatesDirty && (s(), this._coordinatesDirty = !1); + }); + this._geometryLister = () => { + le(r); + }; + } + pipe(e) { + var s, r, n; + if ((s = this._removeFeatures) == null || s.call(this), e.type === P.CLICK && ((r = e.chainEnded) == null || r.addEventListener(() => { + this._coordinatesDirty = !0; + })), !e[Yl] && e.key !== F.CTRL && this._coordinates.length >= 3) { + const a = new Array(2), o = (e.map.getCurrentResolution(e.positionOrPixel) * 12) ** 2; + if (this._snappingGeometry && (a[0] = Ql([this._snappingGeometry], e.positionOrPixel, o, this._snapToVertex, this._snapToEdge, this._scratchLayer.vectorProperties.altitudeMode)), !a[0] && (this._snapOrthogonal || this._snapParallel) && (a[0] = ki(e.positionOrPixel, this._coordinates.at(-2), this._coordinates.at(-3), this._bearings, this._coordinates.length - 2, o, this._snapOrthogonal, this._snapParallel, this._scratchLayer.vectorProperties.altitudeMode), this._isPolygon)) { + const c = ((n = a[0]) == null ? void 0 : n.snapped) ?? e.positionOrPixel; + a[1] = ki(c, this._coordinates.at(0), this._coordinates.at(1), this._bearings, 0, o, this._snapOrthogonal, this._snapParallel, this._scratchLayer.vectorProperties.altitudeMode); + } + const l = Vd(a, this._coordinates, o); + l && (e.positionOrPixel.length > l.length ? l[2] = e.positionOrPixel[2] : e.positionOrPixel.length < l.length && l.pop(), e.positionOrPixel = l, this._removeFeatures = eh(a, this._coordinates, this._scratchLayer)); + } + return Promise.resolve(e); + } + destroy() { + var e, s; + (e = this._geometryLister) == null || e.call(this), (s = this._removeFeatures) == null || s.call(this), super.destroy(); + } +} +class jd extends ae { + constructor(e, s, r, n = ["vertex", "edge"], a = P.CLICKMOVE | P.DBLCLICK) { + super(a, F.NONE | F.CTRL); + h(this, "layers"); + h(this, "_scratchLayer"); + h(this, "_removeFeatures"); + h(this, "_filter"); + h(this, "_snapToVertex", !0); + h(this, "_snapToEdge", !0); + this.layers = e, this._scratchLayer = s, this._filter = r, this.snapTo = n; + } + get snapTo() { + const e = []; + return this._snapToVertex && e.push("vertex"), this._snapToEdge && e.push("edge"), e; + } + set snapTo(e) { + this._snapToVertex = e.includes("vertex"), this._snapToEdge = e.includes("edge"); + } + pipe(e) { + var s; + if ((s = this._removeFeatures) == null || s.call(this), e.key !== F.CTRL) { + const r = e.positionOrPixel, n = e.map.getCurrentResolution(r) * 12, a = n ** 2, o = e.map instanceof Ae, l = this.layers.flatMap((d) => { + let u; + return o ? u = d.getImplementationsForMap(e.map)[0].getOLLayer().getSource() : u = d.getSource(), u.getFeaturesInExtent([ + r[0] - n, + r[1] - n, + r[0] + n, + r[1] + n + ]); + }).filter((d) => { + const u = d[$r] ?? d; + return this._filter(u); + }).map((d) => d.getGeometry()), c = Ql(l, r, a, this._snapToVertex, this._snapToEdge, this._scratchLayer.vectorProperties.altitudeMode); + if (c) { + const d = c.snapped; + r.length > d.length ? d[2] = r[2] : r.length < d.length && d.pop(), e.positionOrPixel = d, e[Yl] = !0, this._removeFeatures = eh([c], [c.snapped], this._scratchLayer); + } + } + return Promise.resolve(e); + } + destroy() { + var e; + (e = this._removeFeatures) == null || e.call(this), this.layers = [], super.destroy(); + } +} +function HC(i, t) { + if (i instanceof bt) + return [i.getCoordinates()]; + const e = i.getFlatCoordinates(); + let s, r = !1; + i instanceof ht ? (r = !0, s = i.getEnds()[0]) : s = e.length; + const n = i.getStride(), a = i.getLayout(); + if (e.length < n * 2) + return []; + let o = Math.round(t * n); + if (t === -1 && (o = s - n), e.length < o + n) + return []; + const l = t === 0 ? n : o - n; + let c; + r && !i[Da] ? o === 0 ? c = s - n : o + n === s ? c = 0 : c = o + n : o > 0 && o + n < s && (c = o + n); + const d = vt(a) ? (f) => [e[f], e[f + 1]] : (f) => [e[f], e[f + 1], e[f + 2]], u = [ + [d(o), d(l)] + ]; + return c != null && e.length >= c + n && u.push([ + d(o), + d(c) + ]), u; +} +function BC(i, t, e) { + const s = i.map((r) => { + const n = ja(r[0], r[1]), a = new Fe({ + geometry: new Ve(n) + }), o = e ? A0(r[0], r[1]) : T0(r[0], r[1]); + return a.setStyle(new K({ + text: new on({ + text: `${o.toFixed(2)} m`, + font: "16px Helvetica, sans-serif" + }) + })), a[pe] = !0, a; + }); + return t.addFeatures(s), () => { + t.removeFeaturesById(s.map((r) => r.getId())), s.splice(0); + }; +} +function VC(i, t) { + const e = new Fe({ + geometry: new xt(i) + }); + e[pe] = !0; + const s = [e]; + return t.addFeatures(s), () => { + t.removeFeaturesById(s.map((r) => r.getId())), s.splice(0); + }; +} +class xn extends ae { + constructor(e, s) { + super(s ? P.MOVE : P.DRAGEVENTS, F.CTRL | F.NONE); + h(this, "_scratchLayer"); + h(this, "_geometry"); + h(this, "_isCircle", !1); + // eslint-disable-next-line class-methods-use-this + h(this, "_removeLabels", () => { + }); + // eslint-disable-next-line class-methods-use-this + h(this, "_vectorPropertiesListener", () => { + }); + h(this, "_is3D", !1); + h(this, "creation"); + this._scratchLayer = e, this._is3D = e.vectorProperties.altitudeMode === Y.NONE, this._vectorPropertiesListener = e.vectorProperties.propertyChanged.addEventListener(() => { + this._is3D = e.vectorProperties.altitudeMode === Y.NONE; + }), this.creation = s; + } + pipe(e) { + if (this._removeLabels(), this._geometry) { + let s; + if (this.creation ? s = -1 : Cn(e.feature) && (s = e.feature[wn]), s != null) { + const r = HC(this._geometry, s); + let n = BC(r, this._scratchLayer, this._is3D); + if (this._isCircle) { + const a = n, o = VC(r[0], this._scratchLayer); + n = () => { + a(), o(); + }; + } + this._removeLabels = n; + } + } + return Promise.resolve(e); + } + setGeometry(e) { + this._geometry = e, this._isCircle = e instanceof bt; + } + destroy() { + this._removeLabels(), this._vectorPropertiesListener(), super.destroy(); + } +} +function jC(i) { + let t; + if (i === Le.Polygon) + t = new fC(); + else if (i === Le.Point) + t = new dC(); + else if (i === Le.LineString) + t = new hC(); + else if (i === Le.BBox) + t = new uC(); + else if (i === Le.Circle) + t = new cC(); + else + throw new Error(`Unexpected geometry tpye ${i}`); + return t; +} +function oM(i, t, e, s, r) { + var Z, Ce; + S(i, kd), S(t, ct), S(e, aa(Le)); + let n = ((Z = r == null ? void 0 : r.snapTo) == null ? void 0 : Z.slice()) ?? Qa.slice(); + const a = !(r != null && r.hideSegmentLength), { interactionChain: o, removed: l, destroy: c } = Ka(i.maps.eventHandler), d = Xl(i.layers), u = new L(), f = new L(), g = new L(); + let m = !1, p = null, y = null, v = null, w = null, C = null, x = ((Ce = r == null ? void 0 : r.initialSnapToLayers) == null ? void 0 : Ce.slice()) ?? [ + t + ], E = !1, I = s; + const R = Dd(i), D = () => { + const $ = y ?? new Fe({ olcs_altitudeMode: I }); + d.vectorProperties.altitudeMode = t.vectorProperties.getAltitudeMode($); + }, X = Hd(d, t, () => { + I || D(); + }); + D(); + let te = () => { + }, j = []; + const N = () => { + te(), p && (o.removeInteraction(p), p.destroy(), p = null), v && (o.removeInteraction(v), v.destroy(), v = null), w && (o.removeInteraction(w), w.destroy(), w = null), C && (o.removeInteraction(C), C.destroy(), C = null), j.forEach(($) => { + $(); + }), j = []; + }, rt = () => { + N(), p = jC(e), w = new jd(x, d, ($) => y !== $, n), (e === Le.Polygon || e === Le.LineString) && (v = new zC(d, n)), a && (e === Le.Polygon || e === Le.LineString || e === Le.BBox || e === Le.Circle) && (C = new xn(d, !0)), j = [ + p.created.addEventListener(($) => { + E && (i.maps.activeMap.switchEnabled = !1), y = new Fe({ geometry: $ }), y[pe] = !0, I && y.set("olcs_altitudeMode", I), y.set("olcs_allowPicking", !1); + const _e = y.on("propertychange", (dt) => { + dt.key === "olcs_altitudeMode" && D(); + }); + te = () => { + le(_e); + }, t.addFeatures([y]), u.raiseEvent(y), v && v.setGeometry($), C && C.setGeometry($); + }), + p.finished.addEventListener(($) => { + E && (i.maps.activeMap.switchEnabled = !0), y && (delete y[pe], y.set("olcs_allowPicking", !0), (!$ || y.getGeometry() !== $ || !zd($)) && (t.removeFeaturesById([ + y.getId() + ]), y = null), te()), D(), f.raiseEvent(y), y = null, m || rt(); + }) + ], o.addInteraction(w), v && o.addInteraction(v), o.addInteraction(p), C && o.addInteraction(C); + }; + rt(); + const Nt = () => { + p && p.finish(), rt(); + }; + let Ai = () => { + }; + const Ms = () => { + var _e; + Ai(); + const { activeMap: $ } = i.maps; + E = $ instanceof Ae, E ? Ai = ((_e = $.imageChanged) == null ? void 0 : _e.addEventListener(Nt)) ?? (() => { + }) : Ai = () => { + }; + }, bn = i.maps.mapActivated.addEventListener(() => { + Ms(), Nt(); + }); + Ms(), i.maps.target && (i.maps.target.style.cursor = _t.edit); + const V = () => { + m = !0, i.layers.remove(d), d.destroy(), i.maps.target && (i.maps.target.style.cursor = _t.auto), bn(), Ai(), p && p.finish(), N(), c(), te(), X(), R(), g.raiseEvent(), g.destroy(), u.destroy(); + }; + return l.addEventListener(V), { + type: $s.CREATE, + geometryType: e, + get featureAltitudeMode() { + return I; + }, + set featureAltitudeMode($) { + I !== $ && (I = $, y ? I ? y.set("olcs_altitudeMode", I) : y.unset("olcs_altitudeMode") : D()); + }, + get snapToLayers() { + return x.slice(); + }, + set snapToLayers($) { + x = $.slice(), w && (w.layers = x); + }, + get snapTo() { + return n.slice(); + }, + set snapTo($) { + n = $.slice(), w && (w.snapTo = n), v && (v.snapTo = n); + }, + featureCreated: u, + creationFinished: f, + stopped: g, + finish: () => { + p && p.finish(); + }, + stop: V + }; +} +var M; +(function(i) { + i.X = "X", i.Y = "Y", i.Z = "Z", i.XY = "XY", i.XZ = "XZ", i.YZ = "YZ", i.XYZ = "XYZ", i.NONE = "NONE"; +})(M || (M = {})); +var me; +(function(i) { + i.TRANSLATE = "translate", i.ROTATE = "rotate", i.SCALE = "scale", i.EXTRUDE = "extrude"; +})(me || (me = {})); +const En = U.GRAY.withAlpha(0.5); +function Ra(i) { + return i === M.X || i === M.Y || i === M.Z; +} +function Fa(i) { + return i === M.XY || i === M.XZ || i === M.YZ; +} +function $C(i) { + return i === M.XYZ; +} +function Sr(i) { + if (i[Te]) { + const t = new Fe(); + t[Te] = i[Te], i.olFeature = t; + } +} +function Kn(i) { + return { + appearance: new ra({ + material: At.fromType("Color", { + color: i + }) + }), + depthFailAppearance: new ra({ + material: At.fromType("Color", { + color: U.divideByScalar(i, 1.5, new U()).withAlpha(0.2) + }) + }) + }; +} +function eo(i) { + return { + appearance: new ia({ + flat: !0, + material: At.fromType("Color", { + color: i + }) + }), + depthFailAppearance: new ia({ + flat: !0, + material: At.fromType("Color", { + color: U.divideByScalar(i, 1.5, new U()).withAlpha(0.2) + }) + }) + }; +} +function cr(i, t, e = !1) { + let s, r; + i === M.Z ? (s = U.BLUE, r = Q.IDENTITY.clone()) : i === M.X ? (s = U.RED, r = Q.multiply(Q.fromRotationY(Math.PI / 2), Q.fromRotationX(Math.PI / 2), new Q())) : (s = U.GREEN, r = Q.fromRotationY(Math.PI / 2)), s = e ? En : s; + const n = new St({ + allowPicking: !e, + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new jc({ + radii: new _(0.5, 0.5, 0.5), + innerRadii: new _(0.45, 0.45, 0.45), + minimumCone: b.toRadians(88), + maximumCone: b.toRadians(92) + }) + }) + ], + ...eo(s) + }); + let a = G.multiplyByMatrix3(t, r, new G()); + return Object.defineProperty(n, "modelMatrix", { + set(o) { + G.equals(o, a) || (a = G.multiplyByMatrix3(o, r, a)); + }, + get() { + return a; + } + }), e || (n[Te] = i), Sr(n), n; +} +function qC(i) { + i[0] > 180 ? i[0] -= 360 : i[0] < -180 && (i[0] += 360), i[1] > 90 ? (i[1] = 90 - (i[1] - 90), i[0] < 180 ? i[0] += 180 : i[1] -= 180) : i[1] < -90 && (i[1] = -90 + (i[1] + 90), i[0] < 180 ? i[0] += 180 : i[1] -= 180); +} +function _c(i, t) { + return [-15, -5, 0, 5, 15].map((s) => { + const r = i.slice(); + return t === M.X ? r[0] += s : r[1] += s, qC(r), r; + }); +} +function UC(i, t) { + const e = [], s = z.mercatorToWgs84(t); + (i === M.X || i === M.XY || i === M.XZ || i === M.XYZ) && e.push(new St({ + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new ls({ + positions: _.fromDegreesArrayHeights(_c(s, M.X).flat()), + width: 1, + arcType: sa.RHUMB + }) + }) + ], + ...Kn(U.RED.withAlpha(0.5)) + })), (i === M.Y || i === M.XY || i === M.YZ || i === M.XYZ) && e.push(new St({ + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new ls({ + positions: _.fromDegreesArrayHeights(_c(s, M.Y).flat()), + width: 1, + arcType: sa.RHUMB + }) + }) + ], + ...Kn(U.GREEN.withAlpha(0.5)) + })), (i === M.Z || i === M.XZ || i === M.YZ || i === M.XYZ) && e.push(new St({ + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new ls({ + positions: _.fromDegreesArrayHeights([ + s[0], + s[1], + (t[2] ?? 0) - 5e5, + s[0], + s[1], + t[2], + s[0], + s[1], + (t[2] ?? 0) + 5e5 + ]), + width: 1 + }) + }) + ], + ...Kn(U.BLUE.withAlpha(0.5)) + })); + const r = new $t(); + return e.forEach((n) => { + r.add(n); + }), r; +} +function WC(i) { + let t; + return (e, s) => { + t && (i.remove(t), t = void 0), e !== M.NONE && (t = UC(e, s), i.add(t)); + }; +} +function YC(i, t, e, s, r) { + const n = new St({ + allowPicking: r, + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: i + }) + ], + ...eo(t) + }); + let a = G.multiply(e, s, new G()); + return Object.defineProperty(n, "modelMatrix", { + set(o) { + G.equals(o, a) || (a = G.multiply(o, s, a)); + }, + get() { + return a; + } + }), n; +} +function Zt(i, t, e, s = !1) { + let r, n, a; + i === M.X ? (r = new _(1, b.EPSILON8, 0), n = U.RED, a = G.fromRotationTranslation(Q.fromRotationY(Math.PI / 2), new _(1, 0, 0))) : i === M.Y ? (r = new _(b.EPSILON8, 1, 0), n = U.GREEN, a = G.fromRotationTranslation(Q.multiply(Q.fromRotationY(Math.PI / 2), Q.fromRotationX(-(Math.PI / 2)), new Q()), new _(0, 1, 0))) : (r = new _(b.EPSILON8, b.EPSILON8, 1), n = U.BLUE, a = G.fromRotationTranslation(Q.IDENTITY.clone(), new _(0, 0, 1))), n = s ? En : n; + const o = e === me.SCALE ? new yl({ + minimum: new _(-0.1, -0.1, -0.1), + maximum: new _(0.1, 0.1, 0.1) + }) : new Vc({ + length: 0.2, + topRadius: 0, + bottomRadius: 0.06 + }), l = [ + new St({ + allowPicking: !s, + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new ls({ + positions: [ + new _(b.EPSILON8, b.EPSILON8, 0), + r + ], + width: 5, + arcType: sa.NONE + }) + }) + ], + ...Kn(n), + modelMatrix: t + }), + YC(o, n, t, a, !s) + ]; + return s || l.forEach((c) => { + c[Te] = i; + }), l; +} +function is(i, t, e = !1) { + let s, r; + i === M.XY ? (s = [ + new _(0.2, 0.2, 0), + new _(0.4, 0.2, 0), + new _(0.4, 0.4, 0), + new _(0.2, 0.4, 0) + ], r = U.BLUE) : i === M.XZ ? (s = [ + new _(0.2, 1e-7, 0.2), + new _(0.4, 1e-7, 0.2), + new _(0.4, 1e-7, 0.4), + new _(0.2, 1e-7, 0.4) + ], r = U.GREEN) : (s = [ + new _(1e-7, 0.2, 0.2), + new _(1e-7, 0.4, 0.2), + new _(1e-7, 0.4, 0.4), + new _(1e-7, 0.2, 0.4) + ], r = U.RED), r = e ? En : r; + const n = new St({ + allowPicking: !e, + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new bg({ + polygonHierarchy: new $o(s) + }) + }) + ], + ...eo(r), + modelMatrix: t + }); + return e || (n[Te] = i), n; +} +function cl(i, t = !1) { + const e = t ? En : U.GAINSBORO, s = new St({ + allowPicking: !t, + asynchronous: !1, + geometryInstances: [ + new Ze({ + geometry: new yl({ + minimum: new _(0.2, 0.2, 0.2), + maximum: new _(0.4, 0.4, 0.4) + }) + }) + ], + ...eo(e), + modelMatrix: i + }); + return t || (s[Te] = M.XYZ), s; +} +function XC(i) { + let t; + return (e, s, r) => { + t && (i.remove(t), t = void 0), e !== M.NONE && (t = new $t(), Ra(e) ? Zt(e, s, r, !0).forEach((n) => { + t.add(n); + }) : Fa(e) ? t.add(is(e, s, !0)) : $C(e) && t.add(cl(s, !0)), i.add(t)); + }; +} +function ZC(i, t) { + const e = new $t(), s = G.fromTranslation(_.fromDegrees(0, 0, 0)), r = []; + if (t === me.TRANSLATE) { + const g = [ + ...Zt(M.X, s, t), + ...Zt(M.Y, s, t), + is(M.XY, s) + ]; + r.push(...Zt(M.Z, s, t), is(M.XZ, s), is(M.YZ, s)), g.push(...r), g.forEach((m) => { + Sr(m), e.add(m); + }); + } else if (t === me.ROTATE) + r.push(cr(M.X, s), cr(M.Y, s)), r.forEach((g) => { + e.add(g); + }), e.add(cr(M.Z, s)); + else if (t === me.SCALE) { + const g = [ + ...Zt(M.X, s, t), + ...Zt(M.Y, s, t) + ]; + r.push(...Zt(M.Z, s, t), cl(s)), g.push(...r), g.forEach((m) => { + Sr(m), e.add(m); + }); + } else t === me.EXTRUDE && Zt(M.Z, s, t).forEach((g) => { + Sr(g), e.add(g); + }); + const n = i.getScene(); + let a = [0, 0, 0], o = 1; + const l = n.postRender.addEventListener(() => { + if (!(a[0] === 0 && a[1] === 0 && a[2] === 0)) { + const g = i.getCurrentResolution(a) * 60; + if (g !== o) { + G.setScale(s, new _(g, g, g), s); + for (let m = 0; m < e.length; m++) + e.get(m).modelMatrix = s; + } + o = g; + } + }); + let c = M.NONE; + const d = WC(e), u = XC(e); + let f = !1; + return { + get show() { + return e.show; + }, + set show(g) { + e.show = g, g && !n.primitives.contains(e) && n.primitives.add(e); + }, + get showAxis() { + return c; + }, + set showAxis(g) { + c = g, d(g, a.slice()), u(g, s.clone(), t); + }, + get greyOutZ() { + return f; + }, + set greyOutZ(g) { + g !== f && (f = g, r.forEach((m) => { + e.remove(m); + }), r.splice(0), t === me.TRANSLATE ? r.push(...Zt(M.Z, s, t, g), is(M.XZ, s, g), is(M.YZ, s, g)) : t === me.ROTATE ? g || r.push(cr(M.X, s, g), cr(M.Y, s, g)) : t === me.SCALE && (g ? r.push(is(M.XY, s)) : r.push(...Zt(M.Z, s, t, g), cl(s))), r.forEach((m) => { + Sr(m), e.add(m); + })); + }, + setCenter(g) { + a = g.slice(), ji.headingPitchRollToFixedFrame(wt(a), new us(0, 0, 0), void 0, void 0, s), G.multiplyByUniformScale(s, o, s); + for (let m = 0; m < e.length; m++) + e.get(m).modelMatrix = s; + }, + destroy() { + l(), d(M.NONE, a), u(M.NONE, s.clone(), t), n.primitives.contains(e) && n.primitives.remove(e); + } + }; +} +function vc(i, t, e) { + return t === M.X ? [ + [e[0], i[1]], + [i[0], i[1]], + [e[2], i[1]] + ] : [ + [i[0], e[1]], + [i[0], i[1]], + [i[0], e[3]] + ]; +} +function JC(i, t) { + let e; + const s = W.proj.getExtent(); + return (r, n) => { + if (e && (i.removeFeaturesById(e), e = void 0), r !== M.NONE) { + const a = []; + if (r === M.X || r === M.XY) { + const o = new Fe({ + geometry: new xt(vc(n, M.X, s)) + }); + o.setStyle(new K({ + stroke: new Be({ + color: U.RED.withAlpha(0.5).toCssColorString(), + width: 1 + }) + })), a.push(o); + } + if (r === M.Y || r === M.XY) { + const o = new Fe({ + geometry: new xt(vc(n, M.Y, s)) + }); + o.setStyle(new K({ + stroke: new Be({ + color: U.GREEN.withAlpha(0.5).toCssColorString(), + width: 1 + }) + })), a.push(o); + } + a.forEach((o) => { + const l = o.getGeometry(); + l[ze] = !0, o[_n] = !0; + }), e = i.addFeatures(a); + } + }; +} +function ul(i, t, e) { + let s, r, n = 0; + i === M.X ? (s = U.RED.toCssColorString(), r = [ + [0, 0], + [1, 0] + ], n = Math.PI / 2) : (s = U.GREEN.toCssColorString(), r = [ + [0, 0], + [0, 1] + ]), s = e ?? s; + let a; + t === me.TRANSLATE ? a = '' : a = '', a = `data:image/svg+xml,${encodeURIComponent(a)}`; + const o = [ + new Fe({ + geometry: new Ve(r[1].slice()), + axis: i + }), + new Fe({ + geometry: new xt(r), + axis: i + }) + ]; + return o[0].setStyle(new K({ + image: new ni({ + src: a, + anchor: [0.5, 1], + color: s, + rotation: n + }) + })), o[1].setStyle(new K({ stroke: new Be({ color: s, width: 4 }) })), o; +} +function $d(i) { + const t = new Fe({ + geometry: new ht([ + [ + [0.2, 0.2], + [0.2, 0.4], + [0.4, 0.4], + [0.4, 0.2], + [0.2, 0.2] + ] + ]), + axis: M.XY + }), e = i ?? U.BLUE.toCssColorString(); + return t.setStyle(new K({ fill: new et({ color: e }) })), t; +} +function KC(i) { + let t; + const e = En.toCssColorString(); + return (s, r, n, a) => { + if (t && (i.removeFeaturesById(t), t = void 0), s !== M.NONE) { + let o = []; + Ra(s) ? o = ul(s, r, e) : Fa(s) && (o = [$d(e)]), o.forEach((l) => { + l.getGeometry().applyTransform((c, d, u = 2) => { + const f = c.length; + for (let g = 0; g < f; g += u) + d[g] = c[g] * a + n[0], d[g + 1] = c[g + 1] * a + n[1]; + return d; + }); + }), t = i.addFeatures(o); + } + }; +} +function QC(i, t, e) { + let s = [0, 0], r = 1, n = []; + e === me.TRANSLATE || e === me.SCALE ? n = [ + ...ul(M.X, e), + ...ul(M.Y, e), + $d() + ] : e === me.ROTATE && (n = [ + new Fe({ + geometry: new bt([0, 0, 0], 0.5), + axis: M.Z + }) + ], n[0].setStyle(new K({ + stroke: new Be({ color: U.BLUE.toCssColorString(), width: 2 }) + }))), n.forEach((u) => { + const f = u.getGeometry(); + f[ze] = !0, u[_n] = !0, u[Te] = u.get("axis"); + }); + const a = i.olMap.on("postrender", () => { + if (!(s[0] === 0 && s[1] === 0)) { + const u = i.getCurrentResolution(s) * 60, f = u / r; + f !== 1 && n.forEach((g) => { + g.getGeometry().applyTransform((m, p, y = 2) => { + const v = m.length; + for (let w = 0; w < v; w += y) + p[w] = (m[w] - s[0]) * f + s[0], p[w + 1] = (m[w + 1] - s[1]) * f + s[1]; + return p; + }); + }), r = u; + } + }); + let o = M.NONE; + const l = JC(t), c = KC(t); + let d = !1; + return { + get show() { + return d; + }, + set show(u) { + u !== d && (d = u, u ? t.addFeatures(n) : t.removeFeaturesById(n.map((f) => f.getId()))); + }, + get showAxis() { + return o; + }, + set showAxis(u) { + o = u, l(u, s), c(u, e, s, r); + }, + greyOutZ: !1, + setCenter(u) { + const f = u[0] - s[0], g = u[1] - s[1]; + n.forEach((m) => { + m.getGeometry().applyTransform((p, y, v = 2) => { + const w = p.length; + for (let C = 0; C < w; C += v) + y[C] = p[C] + f, y[C + 1] = p[C + 1] + g, v > 2 && (y[C + 2] = p[C + 2]); + return y; + }); + }), s = u.slice(); + }, + destroy() { + le(a), l(M.NONE, s), c(M.NONE, e, s, r), t.removeFeaturesById(n.map((u) => u.getId()).filter((u) => u)); + } + }; +} +function e1(i, t, e) { + var l; + const s = new wi(); + let r = !1, n = t !== me.TRANSLATE, a; + return e.forEach((c) => { + const d = c.getGeometry(); + s.extendWithGeometry(d), r = r || vt(d.getLayout()); + const u = i.vectorProperties.getAltitudeMode(c); + if (a !== !1) { + const f = ui(u); + a = f, r = r || f; + } + r = r || Ot(u), n = n || vt(d.getLayout()) || Ot(u) || ui(u) && i.vectorProperties.getHeightAboveGround(c) != null || Nl(u) && i.vectorProperties.getGroundLevel(c) != null; + }), e.length === 1 && (t === me.ROTATE || t === me.SCALE) && ((l = e[0].getGeometry()) == null ? void 0 : l.getType()) === "Point" && i.vectorProperties.renderAs(e[0]) !== "geometry" && (n = !1), { + center: s.getCenter(), + calculateHeight: r, + greyOutZ: n, + offsetHeight: !!a + }; +} +function t1(i) { + const t = zs(); + return i.forEach((e) => { + const s = e[kt] ?? e.getGeometry(); + Ar(t, s.getExtent()); + }), { + center: [...cs(t)], + calculateHeight: !1, + greyOutZ: !1, + offsetHeight: !1 + }; +} +function i1(i, t, e, s) { + let r, n = [0, 0, 0], a, o = null; + const l = (c) => { + if (c.length > 0) { + const { center: u, calculateHeight: f, greyOutZ: g, offsetHeight: m } = a(c); + if (n = u, r.greyOutZ = g, (!o || !f) && (r.show = !0, r.setCenter(n)), o && f) { + const p = o.getScene().getHeight(fn(n), Y.CLAMP_TO_GROUND); + p && (m ? n[2] += p : n[2] = p), r.show = !0, r.setCenter(n); + } + } else + r.show = !1; + }; + return i instanceof B ? (r = ZC(i, s), a = e1.bind(null, t, s), o = i) : i instanceof qr && (r = QC(i, e, s), a = t1), { + get showing() { + return r.show; + }, + get center() { + return n.slice(); + }, + get showAxis() { + return r.showAxis; + }, + set showAxis(c) { + r.showAxis = c; + }, + translate(c, d, u) { + n[0] += c, n[1] += d, n[2] += u, r.setCenter(n); + }, + setFeatures: l, + destroy() { + r.destroy(), e.removeAllFeatures(); + } + }; +} +function s1(i) { + const t = i.olMap.getInteractions().getArray().find((e) => e instanceof Af); + return t ? (t.setActive(!1), () => { + t.setActive(!0); + }) : () => { + }; +} +function r1(i) { + function t(r) { + return Array.isArray(r) ? r.slice() : typeof r == "object" ? { ...r } : r; + } + const e = {}, { screenSpaceCameraController: s } = i.getScene(); + return [ + "lookEventTypes", + "tiltEventTypes", + "rotateEventTypes" + ].forEach((r) => { + s != null && (e[r] = t(s[r])); + }), s.lookEventTypes = void 0, s.tiltEventTypes = void 0, s.rotateEventTypes = void 0, () => { + s.lookEventTypes = e.lookEventTypes, s.tiltEventTypes = e.tiltEventTypes, s.rotateEventTypes = e.rotateEventTypes; + }; +} +class qd extends ae { + constructor() { + super(P.MOVE, F.ALL); + // eslint-disable-next-line class-methods-use-this + h(this, "_clear", () => { + }); + this.setActive(); + } + pipe(e) { + return this.reset(), e.feature && (e.feature[Jl] || e.feature[Te]) && (e.map.className === "CesiumMap" ? this._clear = r1(e.map) : this._clear = s1(e.map)), Promise.resolve(e); + } + reset() { + this._clear(), this._clear = () => { + }; + } + destroy() { + this.reset(); + } +} +class n1 extends ae { + constructor(e) { + super(P.DRAGEVENTS); + h(this, "_transformationHandler"); + /** + * Event raised if the handlers are dragged. The resulting array is of type [dx, dy, dz] where all numbers + * are considered to be deltas to the previous event (where 0 means no translating). + */ + h(this, "translated", new L()); + h(this, "_getTranslateEvent", null); + this._transformationHandler = e; + } + pipe(e) { + var s; + if (this._getTranslateEvent) + this.translated.raiseEvent(this._getTranslateEvent(e.positionOrPixel, e.windowPosition)), e.type === P.DRAGEND && (this._getTranslateEvent = null, this._transformationHandler.showAxis = M.NONE); + else if (e.type === P.DRAGSTART && ((s = e == null ? void 0 : e.feature) != null && s[Te])) { + const r = e.feature[Te]; + r !== M.NONE && (this._transformationHandler.showAxis = r, e.map instanceof B ? Ra(r) ? this._getTranslateEvent = this._dragAlongAxis3D(r, e) : Fa(r) && (this._getTranslateEvent = this._dragAlongPlane3D(r, e)) : Ra(r) ? this._getTranslateEvent = this._dragAlongAxis2D(r, e) : Fa(r) && (this._getTranslateEvent = this._dragAlongPlane2D(r, e))); + } + return Promise.resolve(e); + } + _dragAlongAxis3D(e, s) { + const r = s.map.getScene(); + if (e !== M.Z) { + const n = wt(this._transformationHandler.center); + let a = oe.clone(oe.ORIGIN_XY_PLANE); + a = oe.transform(a, ji.eastNorthUpToFixedFrame(n), a); + let o = Qt(a, r.camera, s.windowPosition), l = z.wgs84ToMercator(ss(o)); + return (c, d) => { + o = Qt(a, r.camera, d); + const u = z.wgs84ToMercator(ss(o)), f = e === M.X ? [u[0] - l[0], 0, 0] : [0, u[1] - l[1], 0]; + return l = u, f; + }; + } else { + const n = Bd(this._transformationHandler.center.slice(), r); + let a = Qt(n, r.camera, s.windowPosition).height; + return (o, l) => { + const c = Qt(n, r.camera, l).height, d = [0, 0, c - a]; + return a = c, d; + }; + } + } + _dragAlongPlane3D(e, s) { + const r = s.map.getScene(), n = wt(this._transformationHandler.center); + let a; + e === M.YZ ? a = oe.clone(oe.ORIGIN_YZ_PLANE) : e === M.XZ ? a = oe.clone(oe.ORIGIN_ZX_PLANE) : a = oe.clone(oe.ORIGIN_XY_PLANE), a = oe.transform(a, ji.eastNorthUpToFixedFrame(n), a); + let o = Qt(a, r.camera, s.windowPosition), l = z.wgs84ToMercator(ss(o)); + return (c, d) => { + o = Qt(a, r.camera, d); + const u = z.wgs84ToMercator(ss(o)), f = [ + u[0] - l[0], + u[1] - l[1], + u[2] - l[2] + ]; + return l = u, f; + }; + } + _dragAlongAxis2D(e, s) { + const r = this._transformationHandler.center.slice(), n = W.proj.getExtent(), a = e === M.X ? [n[0], r[1], r[2]] : [r[0], n[1], r[2]]; + let o = an(r, a, s.positionOrPixel); + return (l) => { + const c = an(r, a, l), d = e === M.X ? [c[0] - o[0], 0, 0] : [0, c[1] - o[1], 0]; + return o = c, d; + }; + } + // eslint-disable-next-line class-methods-use-this + _dragAlongPlane2D(e, s) { + let r = s.positionOrPixel.slice(); + return (n) => { + const a = [ + n[0] - r[0], + n[1] - r[1], + 0 + ]; + return r = n.slice(), a; + }; + } + destroy() { + this._transformationHandler = null, this.translated.destroy(); + } +} +function a1(i, t, e) { + return i.x * t.y - i.y * t.x > 0 ? e : e * -1; +} +function Sc(i, t, e) { + let s = i(t.positionOrPixel, t.windowPosition); + return (r, n) => { + const a = i(r, n), o = a1(s, a, H.angleBetween(s, a)); + return s = a, { angle: o, axis: e }; + }; +} +class o1 extends ae { + constructor(e) { + super(P.DRAGEVENTS); + h(this, "_transformationHandler"); + /** + * The event raised, if the rings are dragged. Event is raised with the angle delta to the last event in radians. + */ + h(this, "rotated", new L()); + h(this, "_getRotationEvent", null); + this._transformationHandler = e; + } + pipe(e) { + var s; + if (this._getRotationEvent) + this.rotated.raiseEvent(this._getRotationEvent(e.positionOrPixel, e.windowPosition)), e.type === P.DRAGEND && (this._getRotationEvent = null); + else if (e.type === P.DRAGSTART && ((s = e == null ? void 0 : e.feature) != null && s[Te])) { + const r = e.feature[Te]; + r !== M.NONE && (e.map instanceof B ? this._getRotationEvent = this._dragAlongPlane3D(r, e) : this._getRotationEvent = this._dragAlongPlane2D(r, e)); + } + return Promise.resolve(e); + } + _dragAlongPlane3D(e, s) { + const r = s.map.getScene(), n = wt(this._transformationHandler.center); + let a; + return e === M.X ? a = oe.clone(oe.ORIGIN_YZ_PLANE) : e === M.Y ? a = oe.clone(oe.ORIGIN_ZX_PLANE) : a = oe.clone(oe.ORIGIN_XY_PLANE), a = oe.transform(a, ji.eastNorthUpToFixedFrame(n), a), Sc((o, l) => { + const c = Qt(a, r.camera, l), d = z.wgs84ToMercator(ss(c)), u = this._transformationHandler.center; + return d[0] = u[0] - d[0], d[1] = u[1] - d[1], d[2] = u[2] - d[2], e === M.Z ? H.fromArray(d) : e === M.X ? new H(d[1], d[2]) : new H(d[0], d[2]); + }, s, e); + } + _dragAlongPlane2D(e, s) { + return Sc((r) => { + const n = r.slice(), { center: a } = this._transformationHandler; + return n[0] = a[0] - n[0], n[1] = a[1] - n[1], n[2] = a[2] - n[2], H.fromArray(n); + }, s, e); + } + destroy() { + this._transformationHandler = null, this.rotated.destroy(); + } +} +function wc(i, t, e, s) { + const { center: r } = e; + let n = !1, a = !1, o = !1; + const l = (u, f) => { + const g = i(u, f), m = g[0] - r[0], p = g[1] - r[1]; + let y = g[2] - r[2]; + y = Number.isFinite(y) ? y : 0; + let v; + return s === M.X ? v = Math.abs(m) : s === M.Y ? v = Math.abs(p) : s === M.Z ? v = Math.abs(y) : s === M.XYZ ? v = Eu(r, g) : v = Pi(r, g), { distance: v, dx: m, dy: p, dz: y }; + }, { distance: c } = l(t.positionOrPixel, t.windowPosition); + let d = c; + return (u, f) => { + const { distance: g, dx: m, dy: p, dz: y } = l(u, f), v = g / d, w = m < 0, C = p < 0, x = y < 0; + let E = v, I = v, R = v; + return w !== n && (n = w, E *= -1), C !== a && (a = C, I *= -1), x !== o && (o = x, R *= -1), d = g, s === M.X ? [E, 1, 1] : s === M.Y ? [1, I, 1] : s === M.XY ? [E, I, 1] : s === M.XYZ ? [E, I, R] : s === M.Z ? [1, 1, R] : [1, 1, 1]; + }; +} +class l1 extends ae { + constructor(e) { + super(P.DRAGEVENTS); + h(this, "_transformationHandler"); + /** + * Event raised if the handlers are dragged. The resulting array is of type [sx, sy, sz] where all numbers + * are considered to be deltas to the previous event (where 1 means no scaling). + */ + h(this, "scaled", new L()); + h(this, "_getScaleEvent", null); + this._transformationHandler = e; + } + pipe(e) { + var s; + if (this._getScaleEvent) + this.scaled.raiseEvent(this._getScaleEvent(e.positionOrPixel, e.windowPosition)), e.type === P.DRAGEND && (this._getScaleEvent = null, this._transformationHandler.showAxis = M.NONE); + else if (e.type === P.DRAGSTART && ((s = e == null ? void 0 : e.feature) != null && s[Te])) { + const r = e.feature[Te]; + r !== M.NONE && (this._transformationHandler.showAxis = r, e.map instanceof B ? this._getScaleEvent = this._dragAlongPlane3D(r, e) : this._getScaleEvent = this._dragAlongPlane2D(r, e)); + } + return Promise.resolve(e); + } + _dragAlongPlane3D(e, s) { + const r = s.map.getScene(), n = wt(this._transformationHandler.center); + let a = oe.clone(e === M.Z ? oe.ORIGIN_ZX_PLANE : oe.ORIGIN_XY_PLANE); + return a = oe.transform(a, ji.eastNorthUpToFixedFrame(n), a), wc((o, l) => { + const c = Qt(a, r.camera, l); + return z.wgs84ToMercator(ss(c)); + }, s, this._transformationHandler, e); + } + _dragAlongPlane2D(e, s) { + return wc((r) => r.slice(), s, this._transformationHandler, e); + } + destroy() { + this._transformationHandler = null, this.scaled.destroy(); + } +} +class h1 extends ae { + constructor(e) { + super(P.DRAGEVENTS); + h(this, "_transformationHandler"); + h(this, "_getExtrudeEvent", null); + /** + * Event raised with the extrusion delta to the last event fired. + */ + h(this, "extruded", new L()); + this._transformationHandler = e; + } + pipe(e) { + var s; + if (this._getExtrudeEvent) + this.extruded.raiseEvent(this._getExtrudeEvent(e.positionOrPixel, e.windowPosition)), e.type === P.DRAGEND && (this._getExtrudeEvent = null, this._transformationHandler.showAxis = M.NONE); + else if (e.type === P.DRAGSTART && ((s = e == null ? void 0 : e.feature) != null && s[Te])) { + const r = e.feature[Te]; + if (r === M.Z) { + const n = e.map.getScene(); + this._transformationHandler.showAxis = r; + const a = Bd(this._transformationHandler.center.slice(), n); + let o = Qt(a, n.camera, e.windowPosition).height; + this._getExtrudeEvent = (l, c) => { + const d = Qt(a, n.camera, c).height, u = d - o; + return o = d, u; + }; + } + } + return Promise.resolve(e); + } + destroy() { + this._transformationHandler = null, this.extruded.destroy(); + } +} +class c1 extends ae { + /** + * @param selectedFeatures Reference to the selected features. + */ + constructor(e) { + super(P.DRAGSTART | P.MOVE); + h(this, "_featureSelection"); + this._featureSelection = e; + } + pipe(e) { + if (e.feature && this._featureSelection.length > 0 && !e.feature[Te] && e.map instanceof B) { + const n = e.map.getScene().drillPick(e.windowPosition, void 0, 10, 10).find((a) => { + var o, l; + return (l = (o = a == null ? void 0 : a.primitive) == null ? void 0 : o.olFeature) == null ? void 0 : l[Te]; + }); + n && (e.feature = n.primitive.olFeature); + } + return Promise.resolve(e); + } +} +class u1 extends ae { + constructor() { + super(P.MOVE, F.NONE); + h(this, "_currentHandler", null); + h(this, "cursorStyle"); + this.setActive(); + } + pipe(e) { + var s; + return e.feature && e.feature[Te] ? this._currentHandler = e.feature : this._currentHandler = null, !this.cursorStyle && ((s = e.map) != null && s.target) && (this.cursorStyle = e.map.target.style), this._evaluate(), Promise.resolve(e); + } + setActive(e) { + super.setActive(e), this.reset(); + } + /** + * Reset the cursorStyle to auto + */ + reset() { + this.cursorStyle && this.cursorStyle.cursor && (this.cursorStyle.cursor = _t.auto, this.cursorStyle = void 0); + } + _evaluate() { + var e; + this.cursorStyle && (this._currentHandler ? (this.cursorStyle.cursor = _t.translate, this.cursorStyle[Oi] = this.id) : ((e = this.cursorStyle) == null ? void 0 : e[Oi]) === this.id && (this.cursorStyle.cursor = _t.auto, delete this.cursorStyle[Oi])); + } + destroy() { + this.reset(), super.destroy(); + } +} +function d1(i) { + return new Promise((t) => { + setTimeout(t, i); + }); +} +class f1 extends ae { + constructor() { + super(P.CLICK, F.NONE, Ne.RIGHT); + h(this, "rightClicked", new L()); + h(this, "eventChainFinished", new L()); + } + async pipe(e) { + var s; + return this.rightClicked.raiseEvent(), (s = e.chainEnded) == null || s.addEventListener(() => { + this.eventChainFinished.raiseEvent(); + }), await d1(0), e; + } + destroy() { + this.rightClicked.destroy(), this.eventChainFinished.destroy(), super.destroy(); + } +} +function g1(i, t, e) { + const s = i.getId(); + t.has(s) || t.set(s, i.get("olcs_allowPicking")), e !== F.CTRL && i.set("olcs_allowPicking", !1); +} +function Cc(i, t) { + const e = t.get(i.getId()); + e != null ? i.set("olcs_allowPicking", e) : i.unset("olcs_allowPicking"); +} +function m1(i, t) { + const e = i.getId(), s = !!i[pe]; + t.set(e, s), i[pe] = !0; +} +function Mc(i, t) { + const e = i.getId(); + t.get(e) || delete i[pe], t.delete(e); +} +function lM(i, t, e, s = me.TRANSLATE) { + const r = new L(), n = [], a = /* @__PURE__ */ new Map(); + let o; + const l = i.maps.eventHandler.modifierChanged.addEventListener((V) => { + o = V; + const Z = o === F.CTRL; + n.forEach((Ce) => { + Ce.set("olcs_allowPicking", Z); + }); + }), c = new f1(); + c.rightClicked.addEventListener(() => { + n.forEach((V) => { + V.set("olcs_allowPicking", !0); + }); + }), c.eventChainFinished.addEventListener(() => { + const V = o === F.CTRL; + n.forEach((Z) => { + Z.set("olcs_allowPicking", V); + }); + }); + const d = Xl(i.layers), { interactionChain: u, removed: f, destroy: g } = Ka(i.maps.eventHandler, e), { exclusiveInteractionId: m } = i.maps.eventHandler, p = i.maps.eventHandler.addExclusiveInteraction(c, () => f.raiseEvent(), 0, m), y = new u1(); + u.addInteraction(y), u.addInteraction(new c1(n)); + const v = new qd(); + u.addInteraction(v); + let w = s, C = () => { + }, x; + const E = (V, Z, Ce) => { + var $; + ($ = x == null ? void 0 : x.translate) == null || $.call(x, V, Z, Ce), n.forEach((_e) => { + (_e[kt] ?? _e.getGeometry()).applyTransform((mi, xs, Es = 2) => { + const Jd = mi.length; + for (let Di = 0; Di < Jd; Di += Es) + xs[Di] = mi[Di] + V, xs[Di + 1] = mi[Di + 1] + Z, Es > 2 && (xs[Di + 2] = mi[Di + 2] + Ce); + return xs; + }); + }); + }, I = (V, Z = M.Z) => { + var Ce; + if (n.length === 1 && ((Ce = n[0].getGeometry()) == null ? void 0 : Ce.getType()) === "Point" && t.vectorProperties.renderAs(n[0]) !== "geometry") { + if (Z === M.Z) { + const $ = t.vectorProperties.getModelHeading(n[0]); + n[0].set("olcs_modelHeading", $ - b.toDegrees(V)); + } else if (Z === M.X) { + const $ = t.vectorProperties.getModelPitch(n[0]); + n[0].set("olcs_modelPitch", $ - b.toDegrees(V)); + } else if (Z === M.Y) { + const $ = t.vectorProperties.getModelRoll(n[0]); + n[0].set("olcs_modelRoll", $ - b.toDegrees(V)); + } + } else { + let $ = x == null ? void 0 : x.center; + if (!$) { + const _e = zs(); + n.forEach((dt) => { + Ar(_e, dt.getGeometry().getExtent()); + }), jo(_e) || ($ = cs(_e)); + } + n.forEach((_e) => { + (_e[kt] ?? _e.getGeometry()).rotate(V, $); + }); + } + }, R = (V, Z, Ce) => { + var $; + if (n.length === 1 && (($ = n[0].getGeometry()) == null ? void 0 : $.getType()) === "Point" && t.vectorProperties.renderAs(n[0]) !== "geometry") { + const _e = n[0], dt = t.vectorProperties.getModelScaleX(_e), mi = t.vectorProperties.getModelScaleY(_e), xs = t.vectorProperties.getModelScaleZ(_e); + n[0].set("olcs_modelScaleX", dt * V), n[0].set("olcs_modelScaleY", mi * Z); + let Es = Ce; + Es == null && (Es = V === Z ? V : 1), n[0].set("olcs_modelScaleZ", xs * Es); + } else { + let _e = x == null ? void 0 : x.center; + if (!_e) { + const dt = zs(); + n.forEach((mi) => { + Ar(dt, mi.getGeometry().getExtent()); + }), jo(dt) || (_e = cs(dt)); + } + n.forEach((dt) => { + (dt[kt] ?? dt.getGeometry()).scale(V, Z, _e); + }); + } + }, D = () => { + C(), x = i1(i.maps.activeMap, t, d, w), x.setFeatures(n); + let V; + if (w === me.TRANSLATE) + V = new n1(x), V.translated.addEventListener(([Z, Ce, $]) => { + E(Z, Ce, $); + }); + else if (w === me.EXTRUDE) + V = new h1(x), V.extruded.addEventListener((Z) => { + n.forEach((Ce) => { + let $ = Ce.get("olcs_extrudedHeight") ?? 0; + $ += Z, Ce.set("olcs_extrudedHeight", $); + }); + }); + else if (w === me.ROTATE) + V = new o1(x), V.rotated.addEventListener(({ angle: Z, axis: Ce }) => { + I(Z, Ce); + }); + else if (w === me.SCALE) + V = new l1(x), V.scaled.addEventListener(([Z, Ce, $]) => { + R(Z, Ce, $); + }); + else + throw new Error(`Unknown transformation mode ${String(w)}`); + u.addInteraction(V), C = () => { + u.removeInteraction(V), V.destroy(), x == null || x.destroy(), x = void 0; + }; + }, X = new L(), te = (V) => { + V !== w && (V === me.EXTRUDE && !(i.maps.activeMap instanceof B) ? he("EditFeaturesSession").warning("Cannot set extrude mode if map is not a CesiumMap") : (w = V, D(), X.raiseEvent(w))); + }; + let j = () => { + }; + const N = (V) => { + var Z; + j(), V instanceof Ae ? j = ((Z = V.imageChanged) == null ? void 0 : Z.addEventListener(() => { + D(); + })) ?? (() => { + }) : j = () => { + }, w === me.EXTRUDE && !(V instanceof B) ? te(me.TRANSLATE) : D(); + }, rt = i.maps.mapActivated.addEventListener(N); + N(i.maps.activeMap); + let Nt = []; + const Ai = () => { + le(Nt), Nt = n.map((V) => V.on("propertychange", ({ key: Z }) => { + Kl.includes(Z) && (x == null || x.setFeatures(n)); + })); + }, Ms = /* @__PURE__ */ new Map(), bn = () => { + C(), g(), j(), rt(), l(), le(Nt), n.forEach((V) => { + Cc(V, a), Mc(V, Ms); + }), a.clear(), i.layers.remove(d), d.destroy(), X.destroy(), p(), c.destroy(), r.raiseEvent(), r.destroy(); + }; + return f.addEventListener(bn), { + type: $s.EDIT_FEATURES, + stopped: r, + stop: bn, + get mode() { + return w; + }, + modeChanged: X, + setMode: te, + rotate: I, + translate: E, + scale: R, + setFeatures(V) { + n.forEach((Z) => { + Cc(Z, a), Mc(Z, Ms); + }), n.length = 0, n.push(...V), n.forEach((Z) => { + g1(Z, a, o), m1(Z, Ms); + }), Ai(), x == null || x.setFeatures(V); + }, + get features() { + return n.slice(); + } + }; +} +class On extends ae { + constructor(e) { + super(P.DRAGEVENTS, F.NONE | F.CTRL); + h(this, "vertexChanged", new L()); + h(this, "_vertex", null); + h(this, "_feature"); + this._feature = e, this.setActive(); + } + pipe(e) { + return this._vertex ? (this._vertex.getGeometry().setCoordinates(e.positionOrPixel), this.vertexChanged.raiseEvent(this._vertex), e.type & P.DRAGEND && (this._vertex.unset("olcs_allowPicking"), this._feature.unset("olcs_allowPicking"), this._vertex.setStyle(void 0), this._vertex = null)) : e.type & P.DRAGSTART && Cn(e.feature) && (this._vertex = e.feature, this._vertex.set("olcs_allowPicking", !1), this._feature.set("olcs_allowPicking", !1), this._vertex.setStyle(Z0)), Promise.resolve(e); + } + destroy() { + this.vertexChanged.destroy(), super.destroy(); + } +} +class Ud extends ae { + constructor() { + super(P.CLICK, F.SHIFT); + h(this, "vertexRemoved", new L()); + this.setActive(); + } + pipe(e) { + return Cn(e.feature) && this.vertexRemoved.raiseEvent(e.feature), Promise.resolve(e); + } + destroy() { + this.vertexRemoved.destroy(), super.destroy(); + } +} +class Wd extends ae { + /** + * @param feature + * @param geometry + */ + constructor(e, s, r) { + super(P.CLICK, F.NONE); + h(this, "vertexInserted", new L()); + h(this, "_feature"); + h(this, "_geometry"); + h(this, "_isLinearRing"); + h(this, "_vectorProperties"); + this._feature = e, this._geometry = s, this._vectorProperties = r, this._isLinearRing = this._geometry instanceof Df, this.setActive(); + } + pipe(e) { + if (e.feature === this._feature) { + const s = this._geometry.getCoordinates(), r = e.positionOrPixel, n = this._geometry.getClosestPoint(r); + this._isLinearRing && s.push(s[0]); + const a = oi(n, r), o = vt(this._geometry.getLayout()) || Ot(this._vectorProperties.getAltitudeMode(this._feature)); + if (a < (e.map.getCurrentResolution(r) * 5) ** 2) { + const l = s.length - 1; + let c = 0; + for (c; c < l && !(o ? EC(s[c], s[c + 1], n) : xC(s[c], s[c + 1], n)); c++) + ; + let d = c + 1; + this._isLinearRing && d === s.length && (d = 0), this.vertexInserted.raiseEvent({ + vertex: ir(n, tr(this._feature), -1), + index: d + }); + } + } + return Promise.resolve(e); + } + destroy() { + this.vertexInserted.destroy(), super.destroy(); + } +} +function p1(i, t) { + const e = t ? i.length : i.length - 1; + if (e > 0) { + const s = new Array(e); + for (let r = 0; r < e; r++) + r === i.length - 1 ? s[r] = bi(i[r], i[0]) : s[r] = bi(i[r], i[r + 1]); + return s; + } + return []; +} +class Yd extends ae { + constructor(e, s, r = [...Qa]) { + super(P.DRAGEVENTS, F.NONE | F.CTRL); + h(this, "_coordinates", []); + h(this, "_bearings", []); + h(this, "_scratchLayer"); + h(this, "_isPolygon", !1); + h(this, "_getCoordinates"); + h(this, "_removeFeatures"); + h(this, "_lastCoordinate"); + h(this, "_snappingGeometry"); + h(this, "_snapToVertex", !0); + h(this, "_snapToEdge", !0); + h(this, "_snapOrthogonal", !0); + h(this, "_snapParallel", !0); + this._scratchLayer = e, s instanceof ht ? (this._isPolygon = !0, this._getCoordinates = () => s.getCoordinates()[0]) : (this._isPolygon = !1, this._getCoordinates = () => s.getCoordinates()), this.snapTo = r; + } + get snapTo() { + const e = []; + return this._snapToVertex && e.push("vertex"), this._snapToEdge && e.push("edge"), this._snapOrthogonal && e.push("orthogonal"), this._snapParallel && e.push("parallel"), e; + } + set snapTo(e) { + this._snapToVertex = e.includes("vertex"), this._snapToEdge = e.includes("edge"), this._snapOrthogonal = e.includes("orthogonal"), this._snapParallel = e.includes("parallel"); + } + _setCoordinates(e) { + if (this._coordinates = this._getCoordinates(), this._bearings = p1(this._coordinates, this._isPolygon), this._coordinates.length > 2) + if (this._isPolygon) { + const s = [ + ...this._coordinates.slice(0, e), + ...this._coordinates.slice(e + 1) + ]; + s.push(s[0]), this._snappingGeometry = new xt(s); + } else + this._snappingGeometry = new Ga([ + this._coordinates.slice(0, e), + this._coordinates.slice(e + 1) + ]); + } + pipe(e) { + var s, r; + if ((s = this._removeFeatures) == null || s.call(this), e[Yl]) + return this._lastCoordinate = void 0, this._snappingGeometry = void 0, Promise.resolve(e); + if (e.type === P.DRAGEND && this._lastCoordinate) + e.positionOrPixel = this._lastCoordinate, this._lastCoordinate = void 0; + else if (e.key !== F.CTRL && Cn(e.feature)) { + const n = e.feature[wn]; + e.type === P.DRAGSTART && this._setCoordinates(n); + const a = new Array(2), o = (e.map.getCurrentResolution(e.positionOrPixel) * 12) ** 2, l = e.positionOrPixel; + if (this._snappingGeometry && (a[0] = Ql([this._snappingGeometry], e.positionOrPixel, o, this._snapToVertex, this._snapToEdge, this._scratchLayer.vectorProperties.altitudeMode)), !a[0] && (this._snapOrthogonal || this._snapParallel)) { + const d = this._bearings.map((u, f) => f === n || f === n - 1 || this._isPolygon && n === 0 && f === this._bearings.length - 1 ? -1 : u); + if (n > 1 ? a[0] = ki(l, this._coordinates[n - 1], this._coordinates[n - 2], d, n - 1, o, this._snapOrthogonal, this._snapParallel, this._scratchLayer.vectorProperties.altitudeMode) : this._isPolygon && (n === 1 ? a[0] = ki(l, this._coordinates[n - 1], this._coordinates.at(-1), d, n - 1, o, this._snapOrthogonal, this._snapParallel, this._scratchLayer.vectorProperties.altitudeMode) : a[0] = ki(l, this._coordinates.at(-1), this._coordinates.at(-2), d, this._coordinates.length - 1, o, this._snapOrthogonal, this._snapParallel, this._scratchLayer.vectorProperties.altitudeMode)), this._coordinates.length > 2) { + const u = ((r = a[0]) == null ? void 0 : r.snapped) ?? l; + n < this._coordinates.length - 2 ? a[1] = ki(u, this._coordinates[n + 1], this._coordinates[n + 2], d, n + 1, o, this._snapOrthogonal, this._snapParallel) : this._isPolygon && (n === this._coordinates.length - 1 ? a[1] = ki(u, this._coordinates[0], this._coordinates[1], d, 0, o, this._snapOrthogonal, this._snapParallel) : a[1] = ki(u, this._coordinates.at(-1), this._coordinates[0], d, this._coordinates.length - 1, o, this._snapOrthogonal, this._snapParallel)); + } + } + const c = Vd(a, this._coordinates, o); + c ? (l.length > c.length ? c[2] = e.positionOrPixel[2] : l.length < c.length && c.pop(), e.positionOrPixel = c, this._removeFeatures = eh(a, this._coordinates, this._scratchLayer), this._lastCoordinate = e.positionOrPixel) : this._lastCoordinate = void 0; + } + return Promise.resolve(e); + } + destroy() { + var e; + (e = this._removeFeatures) == null || e.call(this), super.destroy(); + } +} +function y1(i, t, e, s, r) { + const n = i[kt] ?? i.getGeometry(), a = tr(i), o = n.getCoordinates().map((g, m) => ir(g, a, m)); + t.addFeatures(o); + const l = () => { + const { coordinates: g, layout: m } = Mn(o); + n.setCoordinates(g, m); + }, c = new On(i); + c.vertexChanged.addEventListener(l); + const d = new Yd(t, n, r), u = [ + d, + c + ]; + if (!s.hideSegmentLength) { + const g = new xn(t, !1); + g.setGeometry(n), u.push(g); + } + if (!s.denyInsertion) { + const g = new Wd(i, n, e); + g.vertexInserted.addEventListener(({ vertex: m, index: p }) => { + t.addFeatures([m]), o.splice(p, 0, m), o.forEach((y, v) => { + y[wn] = v; + }), l(); + }), u.push(g); + } + if (!s.denyRemoval) { + const g = new Ud(); + g.vertexRemoved.addEventListener((m) => { + t.removeFeaturesById([m.getId()]); + const p = o.indexOf(m); + p > -1 && (o.splice(p, 1), l()); + }), u.push(g); + } + const f = new Cs(u); + return { + interactionChain: f, + setSnapTo(g) { + d.snapTo = g; + }, + destroy: () => { + t.removeFeaturesById(o.map((g) => g.getId())), f.destroy(); + } + }; +} +function _1(i, t, e) { + const s = i[kt] ?? i.getGeometry(), r = tr(i), n = s.getCoordinates().map((u, f) => ir(u, r, f)); + t.addFeatures(n); + const a = new On(i); + let o = !1; + a.vertexChanged.addEventListener((u) => { + if (o = !0, n.indexOf(u) === 1) { + const f = s.getCoordinates(); + f[1] = u.getGeometry().getCoordinates(); + const g = Pi(f[0], f[1]); + s.setRadius(g); + } else { + const { coordinates: f, layout: g } = Mn([ + u + ]); + s.setCenterAndRadius(f[0], s.getRadius(), g), n[1].getGeometry().setCoordinates(s.getCoordinates()[1], g); + } + o = !1; + }); + const l = s.on("change", () => { + o || s.getCoordinates().forEach((u, f) => { + n[f].getGeometry().setCoordinates(u); + }); + }), c = [a]; + if (!e.hideSegmentLength) { + const u = new xn(t, !1); + u.setGeometry(s), c.push(u); + } + const d = new Cs(c); + return { + interactionChain: d, + destroy: () => { + t.removeFeaturesById(n.map((u) => u.getId())), d.destroy(), le(l); + } + }; +} +function v1(i, t, e) { + const s = i[kt] ?? i.getGeometry(), r = tr(i), n = s.getCoordinates()[0].map((u, f) => ir(u, r, f)); + t.addFeatures(n); + let a = !1; + const o = new On(i); + o.vertexChanged.addEventListener((u) => { + const f = n.indexOf(u), g = Yn(f + 2, 4), m = Yn(f + 1, 4), p = Yn(f - 1, 4), y = n[g].getGeometry().getCoordinates(), v = u.getGeometry().getCoordinates(); + let w = !1; + y[0] === v[0] && (v[0] += 1e-8, w = !0), y[1] === v[1] && (v[1] += 1e-8, w = !0), w && u.getGeometry().setCoordinates(v); + const C = (I) => { + const R = n[I].getGeometry(), D = R.getCoordinates(); + D[0] === y[0] ? D[1] = v[1] : D[0] = v[0], R.setCoordinates(D); + }; + C(m), C(p), a = !0; + const { coordinates: x, layout: E } = Mn(n); + s.setCoordinates([x], E), a = !1; + }); + const l = s.on("change", () => { + if (!a) { + const u = s.getLayout(); + s.getCoordinates()[0].forEach((f, g) => { + n[g].getGeometry().setCoordinates(f, u); + }); + } + }), c = [o]; + if (!e.hideSegmentLength) { + const u = new xn(t, !1); + u.setGeometry(s), c.push(u); + } + const d = new Cs(c); + return { + interactionChain: d, + destroy: () => { + t.removeFeaturesById(n.map((u) => u.getId())), d.destroy(), le(l); + } + }; +} +function S1(i, t, e, s, r) { + const n = i[kt] ?? i.getGeometry(), a = n.getLinearRing(0), o = tr(i), l = a.getCoordinates().map((m, p) => ir(m, o, p)); + t.addFeatures(l); + const c = () => { + const { coordinates: m, layout: p } = Mn(l); + a.setCoordinates(m, p), n.setCoordinates([m], p); + }, d = new On(i); + d.vertexChanged.addEventListener(c); + const u = new Yd(t, n, r), f = [ + u, + d + ]; + if (!s.hideSegmentLength) { + const m = new xn(t, !1); + m.setGeometry(n), f.push(m); + } + if (!s.denyInsertion) { + const m = new Wd(i, a, e); + m.vertexInserted.addEventListener(({ vertex: p, index: y }) => { + t.addFeatures([p]), l.splice(y, 0, p), l.forEach((v, w) => { + v[wn] = w; + }), c(); + }), f.push(m); + } + if (!s.denyRemoval) { + const m = new Ud(); + m.vertexRemoved.addEventListener((p) => { + t.removeFeaturesById([p.getId()]); + const y = l.indexOf(p); + y > -1 && (l.splice(y, 1), c()); + }), f.push(m); + } + const g = new Cs(f); + return { + interactionChain: g, + setSnapTo(m) { + u.snapTo = m; + }, + destroy: () => { + t.removeFeaturesById(l.map((m) => m.getId())), g.destroy(); + } + }; +} +function w1(i, t, e) { + const s = i[kt] ?? i.getGeometry(), r = tr(i), n = ir(s.getCoordinates(), r, 0), a = [i.getId()]; + e.featureVisibility.hideObjects(a), n[pe] = !0, t.addFeatures([n]); + const o = new On(i); + let l = !1; + o.vertexChanged.addEventListener(() => { + l = !0; + const { coordinates: u, layout: f } = Mn([ + n + ]); + s.setCoordinates(u[0], f), l = !1; + }); + const c = s.on("change", () => { + l || n.getGeometry().setCoordinates(s.getCoordinates(), s.getLayout()); + }), d = new Cs([o]); + return { + interactionChain: d, + destroy: () => { + d.destroy(), t.removeFeaturesById([n.getId()]), e.featureVisibility.showObjects(a), le(c); + } + }; +} +function hM(i, t, e, s = {}) { + var X, te; + const { interactionChain: r, removed: n, destroy: a } = Ka(i.maps.eventHandler, e), o = Xl(i.layers), l = new qd(); + r.addInteraction(l); + const c = new bC(s.denyRemoval); + r.addInteraction(c); + const d = new L(); + let u = null, f = null, g = null, m = ((X = s == null ? void 0 : s.initialSnapToLayers) == null ? void 0 : X.slice()) ?? [t], p = ((te = s == null ? void 0 : s.snapTo) == null ? void 0 : te.slice()) ?? [...Qa]; + const y = Dd(i), v = () => { + o.vectorProperties.altitudeMode = f ? t.vectorProperties.getAltitudeMode(f) : t.vectorProperties.altitudeMode; + }; + v(); + const w = Hd(o, t, v), C = () => { + u && (r.removeInteraction(u.interactionChain), u.destroy(), u = null, g = null), f && (delete f[pe], zd(f.getGeometry()) || t.removeFeaturesById([f.getId()])), f = null, v(); + }; + let x; + function E(j) { + if (C(), x && le(x), j) { + x = j.on("propertychange", ({ key: Nt }) => { + Kl.includes(Nt) && E(j); + }), f = j, f[pe] = !0; + const N = j[kt] ?? j.getGeometry(), rt = N.getType(); + o.vectorProperties.altitudeMode = t.vectorProperties.getAltitudeMode(j), rt === Le.Polygon ? N.get("_vcsGeomType") === Le.BBox ? u = v1(j, o, s) : N.getLinearRingCount() === 1 && (u = S1(j, o, t.vectorProperties, s, p)) : rt === Le.LineString ? u = y1(j, o, t.vectorProperties, s, p) : rt === Le.Point ? u = w1(j, o, t) : rt === Le.Circle && (u = _1(j, o, s)), u ? (g = new jd(m, o, (Nt) => Nt !== j, p, P.DRAGEVENTS), u.interactionChain.addInteraction(g, 0), r.addInteraction(u.interactionChain), v()) : (he("EditGeometrySession").warning(`Geometry of type ${rt} is currently not supported`), f[pe] = !1, f = null); + } + } + const I = () => { + l.reset(), c.reset(), E(); + }, R = i.maps.mapActivated.addEventListener(I); + I(); + const D = () => { + i.layers.remove(o), o.destroy(), x && le(x), R(), l.reset(), c.reset(), C(), a(), w(), y(), d.raiseEvent(), d.destroy(); + }; + return n.addEventListener(D), { + type: $s.EDIT_GEOMETRY, + stopped: d, + stop: D, + setFeature(j) { + E(j); + }, + get feature() { + return f; + }, + get snapTo() { + return p.slice(); + }, + set snapTo(j) { + var N; + p = j.slice(), g && (g.snapTo = p), (N = u == null ? void 0 : u.setSnapTo) == null || N.call(u, p); + }, + get snapToLayers() { + return m.slice(); + }, + set snapToLayers(j) { + m = j.slice(), g && (g.layers = m); + } + }; +} +class Xd extends ae { + constructor(e) { + super(P.CLICK, F.NONE | F.CTRL); + h(this, "_layer"); + h(this, "_selectedFeatures", /* @__PURE__ */ new Map()); + /** + * Event raised when the feature selection changes. Will be called with an array of features or an empty array, when no feature is selected + */ + h(this, "featuresChanged", new L()); + this._layer = e, this.setActive(); + } + get selected() { + return [...this._selectedFeatures.values()]; + } + /** + * Checks if a feature with a spicific id is selected. + */ + hasFeatureId(e) { + return this._selectedFeatures.has(e); + } + async pipe(e) { + return e.feature && e.feature[J] === this._layer.name ? e.key & F.CTRL ? (e.stopPropagation = !0, await this._modifySelectionSet(e.feature)) : (!this._selectedFeatures.has(e.feature.getId()) || this._selectedFeatures.has(e.feature.getId()) && this._selectedFeatures.size > 1) && (e.stopPropagation = !0, await this.setSelected([e.feature])) : e.key & F.CTRL || this.clear(), e; + } + async setSelected(e) { + this._selectedFeatures.clear(); + const s = Array.isArray(e) ? e : [e]; + (await Promise.all(s.map((n) => n[Zr] ? this._layer.switchStaticFeatureToDynamic(n.getId()) : n))).forEach((n) => { + this._selectedFeatures.set(n.getId(), n); + }), this.featuresChanged.raiseEvent(this.selected); + } + async _modifySelectionSet(e) { + const s = e.getId(); + if (this._selectedFeatures.has(s)) + this._selectedFeatures.delete(s); + else { + let r = e; + e[Zr] && (r = await this._layer.switchStaticFeatureToDynamic(s)), this._selectedFeatures.set(s, r); + } + this.featuresChanged.raiseEvent(this.selected); + } + /** + * Clears the interaction, removing all features and calling the featureChange event with an empty array + */ + clear() { + this._selectedFeatures.size > 0 && (this._selectedFeatures.clear(), this.featuresChanged.raiseEvent([])); + } + destroy() { + this._selectedFeatures.clear(), this.featuresChanged.destroy(), super.destroy(); + } +} +class Zd extends ae { + constructor(e) { + super(P.CLICK, F.NONE); + h(this, "_layer"); + h(this, "_selectedFeature", null); + /** + * Event called when the feature changes. Called with null if the selection is cleared. + */ + h(this, "featureChanged", new L()); + this._layer = e, this.setActive(); + } + get selected() { + return this._selectedFeature ? [this._selectedFeature] : []; + } + async pipe(e) { + return e.feature && e.feature[J] === this._layer.name ? this._selectedFeature && e.feature.getId() === this._selectedFeature.getId() || (e.stopPropagation = !0, await this.setSelected(e.feature)) : this.clear(), e; + } + /** + * Selects the given feature. if passed in a tiled feature store feature, it will be converted. Do not pass in uneditable features (feature which do not + * belong to the layer for which this interaction was created) + */ + async setSelected(e) { + let s = Array.isArray(e) ? e[0] : e; + e[Zr] && (s = await this._layer.switchStaticFeatureToDynamic(s.getId())), this._selectedFeature = s, this.featureChanged.raiseEvent(this._selectedFeature); + } + /** + * Checks if a feature with a spicific id is selected. + */ + hasFeatureId(e) { + var s; + return ((s = this._selectedFeature) == null ? void 0 : s.getId()) === e; + } + /** + * Clears the current selection, if there is one. + */ + clear() { + this._selectedFeature && (this._selectedFeature = null, this.featureChanged.raiseEvent(null)); + } + destroy() { + this._selectedFeature = null, this.featureChanged.destroy(), super.destroy(); + } +} +var Ci; +(function(i) { + i.SINGLE = "single", i.MULTI = "multi"; +})(Ci || (Ci = {})); +class C1 extends ae { + constructor(e, s) { + let r, n; + if (s instanceof Zd) + r = F.NONE, n = Ci.SINGLE; + else if (s instanceof Xd) + r = F.NONE | F.CTRL, n = Ci.MULTI; + else + throw new Error("This interaction is not supported"); + super(P.MOVE, r); + h(this, "_selectFeatureInteraction"); + h(this, "selectionMode"); + /** + * The feature that is currently hovered and belongs to the layer with the layerName. + */ + h(this, "_currentFeature", null); + /** + * The layer name to react to + */ + h(this, "layerName"); + h(this, "cursorStyle"); + this._selectFeatureInteraction = s, this.selectionMode = n, this.layerName = e; + } + pipe(e) { + var s; + return e.feature && e.feature[J] === this.layerName ? this._currentFeature = e.feature : this._currentFeature = null, !this.cursorStyle && ((s = e.map) != null && s.target) && (this.cursorStyle = e.map.target.style), this._evaluate(e.key), Promise.resolve(e); + } + modifierChanged(e) { + this._evaluate(e); + } + setActive(e) { + super.setActive(e), this.reset(); + } + reset() { + this.cursorStyle && this.cursorStyle.cursor && (this.cursorStyle.cursor = _t.auto, this.cursorStyle = void 0); + } + _evaluate(e) { + var s; + if (this.cursorStyle) + if (this._currentFeature) { + const r = this.selectionMode === Ci.MULTI && e & F.CTRL, n = this._selectFeatureInteraction.hasFeatureId(this._currentFeature.getId()); + r ? this.cursorStyle.cursor = n ? _t.removeFromSelection : _t.addToSelection : this.cursorStyle.cursor = _t.select, this.cursorStyle[Oi] = this.id; + } else ((s = this.cursorStyle) == null ? void 0 : s[Oi]) === this.id && (this.cursorStyle.cursor = _t.auto, delete this.cursorStyle[Oi]); + } + destroy() { + this.reset(), super.destroy(); + } +} +function M1(i, t) { + const e = /* @__PURE__ */ new Map(), s = (r) => { + const n = new Set(r.map((l) => (l[pe] = !0, l.getId()))), a = []; + n.forEach((l) => { + e.has(l) || a.push(l); + }); + const o = []; + e.forEach((l, c) => { + n.has(c) || o.push(c); + }), i.featureVisibility.unHighlight(o), i.featureVisibility.highlight(Object.fromEntries(a.map((l) => [l, t]))), i.getFeaturesById(o).forEach((l) => delete l[pe]), e.clear(), r.forEach((l) => e.set(l.getId(), l)); + }; + return { + get highlightedFeatures() { + return [...e.values()]; + }, + update(r) { + const n = r.filter((a) => a[J] === i.name); + s(n); + }, + destroy() { + if (e.size > 0) { + const r = [...e.keys()]; + i.featureVisibility.unHighlight(r), i.getFeaturesById(r).forEach((n) => delete n[pe]), e.clear(); + } + } + }; +} +function x1() { + const i = new pn({ color: "rgba(76,175,80,0.2)" }), t = new Be({ color: "#4CAF50", width: 2 }); + return new K({ + fill: i, + stroke: t, + image: new Vi({ + fill: i, + stroke: t, + radius: 14 + }) + }); +} +function cM(i, t, e, s = Ci.MULTI, r = x1()) { + const n = new L(), a = new L(), o = new L(); + let l = null, c = null, d, u = null; + const { interactionChain: f, removed: g, destroy: m } = Ka(i.maps.eventHandler, e), p = M1(t, r); + let y = []; + function v() { + l && (l && (f.removeInteraction(l), l.destroy(), l = null), c && (f.removeInteraction(c), c.destroy(), c = null)), y.forEach((R) => { + R(); + }), y = []; + } + function w(R) { + if (R === d) + return; + if (v(), R === Ci.SINGLE) + l = new Zd(t), y.push(l.featureChanged.addEventListener((X) => { + const te = X ? [X] : []; + p.update(te), o.raiseEvent(te), u && (u.switchEnabled = !X); + })); + else if (R === Ci.MULTI) + l = new Xd(t), y.push(l.featuresChanged.addEventListener((X) => { + p.update(X), o.raiseEvent(X), u && (u.switchEnabled = X.length === 0); + })); + else + throw new Error(`Unknown selection mode ${String(R)}`); + const { highlightedFeatures: D } = p; + D && l.setSelected(D), d = R, f.addInteraction(l), c = new C1(t.name, l), f.addInteraction(c); + } + w(s); + let C = () => { + }; + const x = (R) => { + var D; + C(), R instanceof Ae ? (l == null || l.clear(), C = ((D = R.imageChanged) == null ? void 0 : D.addEventListener(() => { + l == null || l.clear(); + })) ?? (() => { + }), u = R) : (u && (l == null || l.clear()), u = null, C = () => { + }); + }, E = i.maps.mapActivated.addEventListener(x); + x(i.maps.activeMap); + const I = () => { + v(), m(), p.destroy(), E(), C(), u && (u.switchEnabled = !0), n.raiseEvent(), n.destroy(), a.destroy(), o.destroy(); + }; + return g.addEventListener(I), { + type: $s.SELECT, + stopped: n, + stop: I, + setCurrentFeatures(R) { + return (l == null ? void 0 : l.setSelected(R)) ?? Promise.resolve(); + }, + get currentFeatures() { + return (l == null ? void 0 : l.selected) ?? []; + }, + get firstFeature() { + return (l == null ? void 0 : l.selected[0]) ?? null; + }, + get mode() { + return d; + }, + setMode(R) { + S(R, aa(Ci)), w(R), a.raiseEvent(d); + }, + modeChanged: a, + featuresChanged: o, + clearSelection() { + l == null || l.clear(); + } + }; +} +const Bn = Symbol("flightVisualization"); +async function uM(i, t) { + if (S(i, qs), i[Bn]) + return i[Bn]; + await i.initialize(); + let e = zs(); + const s = new $t(); + s.show = !1; + const r = new ct({ + projection: de.toJSON(), + name: `flightLayer-${i.name}`, + style: { + type: tt.className, + declarativeStyle: { + // eslint-disable-next-line no-template-curly-in-string + labelText: "${title}", + image: "false", + color: 'color("#333333")', + strokeWidth: "2" + } + }, + vectorProperties: { + altitudeMode: "absolute" + } + }); + $l(r); + let n; + const [a] = t.maps.getByType(B.className); + a && (n = a.getScene(), n && !n.primitives.contains(s) && n.primitives.add(s)), t.layers.add(r); + const o = () => { + r.removeAllFeatures(), s.removeAll(); + const f = []; + for (const m of i.anchors) { + if (n) { + const p = new Zc(n); + p.frustum.far = 200, p.frustum.near = 10, p.setView({ + destination: _.fromDegrees(m.coordinate[0], m.coordinate[1], m.coordinate[2]), + orientation: us.fromDegrees(m.heading, m.pitch, m.roll) + }), s.add(new cv({ camera: p, allowPicking: !1 })); + } + f.push(new ue({ + geometry: new Ve(m.coordinate, "XYZ"), + title: m.title ?? m.name, + duration: m.duration + })); + } + if (i.isValid()) { + const m = Rd(i), p = new ue({ + geometry: new xt(m, "XYZ") + }); + p.setId("flightPathGeom"), f.push(p); + } + r.addFeatures(f); + const g = r.getSource().getExtent(); + e = bl(g, g, 2); + }; + o(); + const l = [ + i.anchorsChanged.addEventListener(o), + i.propertyChanged.addEventListener((f) => { + (f === "loop" || f === "interpolation") && o(); + }) + ], c = new L(), d = () => { + r.deactivate(), t.layers.remove(r), r.destroy(), n && n.primitives.contains(s) && n.primitives.remove(s), l.forEach((f) => { + f(); + }), c.raiseEvent(), c.destroy(), delete i[Bn]; + }; + l.push(t.flights.removed.addEventListener((f) => { + f === i && d(); + }), t.flights.added.addEventListener((f) => { + f.name === i.name && d(); + })); + const u = { + get state() { + return r.state; + }, + get stateChanged() { + return r.stateChanged; + }, + get destroyed() { + return c; + }, + async activate() { + await r.activate(), s.show = !0; + }, + deactivate() { + r.deactivate(), s.show = !1; + }, + destroy: d, + async zoomToExtent() { + var g; + if (!i.isValid() || jo(e)) + return; + const f = It.createViewpointFromExtent(e); + f && await ((g = t.maps.activeMap) == null ? void 0 : g.gotoViewpoint(f)); + } + }; + return i[Bn] = u, u; +} +export { + js as AbstractFeatureProvider, + ae as AbstractInteraction, + mr as AltitudeModeCesium, + ud as ArcStyle, + gt as ArrowEnd, + Ya as ArrowStyle, + M as AxisAndPlanes, + qr as BaseOLMap, + Yr as CameraLimiter, + Pr as CameraLimiterMode, + Bi as Category, + uw as CategoryCollection, + B as CesiumMap, + ns as CesiumTilesetCesiumImpl, + di as CesiumTilesetLayer, + Qi as ClassRegistry, + pr as ClassificationTypeCesium, + Hn as ClippingObject, + lC as ClippingObjectManager, + U1 as ClusterContext, + jt as Collection, + ql as CoordinateAtPixel, + uC as CreateBBoxInteraction, + cC as CreateCircleInteraction, + hC as CreateLineStringInteraction, + dC as CreatePointInteraction, + fC as CreatePolygonInteraction, + zC as CreationSnapping, + Oa as CzmlLayer, + Mw as DataSourceCesiumImpl, + Ea as DataSourceLayer, + Se as DataState, + tt as DeclarativeStyleItem, + QS as DefaultObliqueCollection, + Aa as DisplayQuality, + Jt as DisplayQualityLevel, + u1 as EditFeaturesMouseOverInteraction, + bC as EditGeometryMouseOverInteraction, + c1 as EnsureHandlerSelectionInteraction, + ww as EventHandler, + P as EventType, + wv as ExclusiveManager, + be as Extent, + wi as Extent3D, + h1 as ExtrudeInteraction, + _w as FeatureAtPixelInteraction, + Li as FeatureLayer, + vw as FeatureProviderInteraction, + Wi as FeatureStoreLayer, + qw as FeatureStoreLayerChanges, + qa as FeatureVisibility, + fe as FeatureVisibilityAction, + CC as FlightCollection, + qs as FlightInstance, + Jr as GeoJSONLayer, + Le as GeometryType, + tl as GlobalHider, + Ui as IndexedCollection, + Wd as InsertVertexInteraction, + Cs as InteractionChain, + st as Layer, + Ei as LayerCollection, + es as LayerImplementation, + NS as LayerObliqueImpl, + Ua as LayerOpenlayersImpl, + jd as LayerSnapping, + ve as LayerState, + La as MVTTileProvider, + Zl as MapCollection, + qd as MapInteractionController, + Ht as MapState, + pn as ModelFill, + F as ModificationKeyType, + ps as ObliqueCollection, + Qh as ObliqueDataSet, + Bl as ObliqueImage, + Zn as ObliqueImageMeta, + Ae as ObliqueMap, + BS as ObliqueProvider, + HS as ObliqueView, + Oe as ObliqueViewDirection, + va as OlcsGeometryType, + xw as OpenStreetMapCesiumImpl, + Kr as OpenStreetMapLayer, + Ww as OpenStreetMapOpenlayersImpl, + Pe as OpenlayersMap, + pi as OverrideClassRegistry, + pa as PatternType, + Qr as PointCloudLayer, + at as PointerEventType, + Ne as PointerKeyType, + Tt as PrimitiveOptionsType, + z as Projection, + Dt as RasterLayer, + er as RasterLayerCesiumImpl, + Sn as RasterLayerOpenlayersImpl, + Ud as RemoveVertexInteraction, + o1 as RotateInteraction, + l1 as ScaleInteraction, + xn as SegmentLengthInteraction, + C1 as SelectFeatureMouseOverInteraction, + Xd as SelectMultiFeatureInteraction, + Zd as SelectSingleFeatureInteraction, + Ci as SelectionMode, + $s as SessionType, + Ew as SingleImageCesiumImpl, + ba as SingleImageLayer, + Yw as SingleImageOpenlayersImpl, + Ad as StaticFeatureTileProvider, + Ia as StaticGeoJSONTileProvider, + li as StyleItem, + tn as TMSLayer, + Ow as TerrainCesiumImpl, + en as TerrainLayer, + W1 as TileDebugOpenlayersImpl, + ut as TileProvider, + ll as TileProviderFeatureProvider, + it as TilingScheme, + bw as TmsCesiumImpl, + Xw as TmsOpenlayersImpl, + me as TransformationMode, + n1 as TranslateInteraction, + On as TranslateVertexInteraction, + Yd as TranslationSnapping, + Pa as URLTemplateTileProvider, + kd as VcsApp, + cv as VcsCameraPrimitive, + Gw as VcsChildTile, + zw as VcsDebugTile, + L as VcsEvent, + ci as VcsMap, + ol as VcsModule, + Hw as VcsNoDataTile, + Ut as VcsObject, + jw as VcsQuadtreeTileProvider, + He as VcsTileState, + _s as VcsTileType, + Bw as VcsVectorTile, + bS as VectorCesiumImpl, + zl as VectorContext, + ct as VectorLayer, + wd as VectorObliqueImpl, + ju as VectorOpenlayersImpl, + Gt as VectorProperties, + Aw as VectorRasterTileCesiumImpl, + ge as VectorStyleItem, + Tw as VectorTileImageryProvider, + sn as VectorTileLayer, + Zw as VectorTileOpenlayersImpl, + It as Viewpoint, + Ta as WFSLayer, + ys as WMSFeatureProvider, + rn as WMSLayer, + nn as WMTSLayer, + Dw as WmsCesiumImpl, + Jw as WmsOpenlayersImpl, + Nw as WmtsCesiumImpl, + Kw as WmtsOpenlayersImpl, + br as actuallyIsCircle, + Yl as alreadySnapped, + ze as alreadyTransformedToImage, + hi as alreadyTransformedToMercator, + mc as anchorFromGeojsonFeature, + tM as anchorFromViewpoint, + vC as anchorToGeojsonFeature, + iM as anchorToViewpoint, + uo as angleEqualsEpsilon, + _a as blackColor, + fw as calculateMinLevel, + Pi as cartesian2DDistance, + oi as cartesian2DDistanceSquared, + Eu as cartesian3DDistance, + Ou as cartesian3DDistanceSquared, + I1 as cartesianToMercator, + ss as cartographicToWgs84, + Iu as categoryClassRegistry, + Fi as cesiumColorToColor, + Gi as cesiumTilesetLastUpdated, + Yh as checkLineIntersection, + $u as circleFromCenterRadius, + Ja as clearClippingPlanes, + D1 as colorInCanvas, + Y0 as combineFont, + pd as convert, + qu as convertGeometryToPolygon, + P1 as coordinateAtDistance, + Dh as coordinateEqualsEpsilon, + Lr as copyClippingPlanesToCollection, + QC as create2DHandlers, + ZC as create3DHandlers, + B1 as createAbsoluteFeature, + Bd as createCameraVerticalPlane, + gS as createClassificationPrimitiveItem, + J1 as createClippingFeature, + Z1 as createClippingPlaneCollection, + wC as createFlightPlayer, + uM as createFlightVisualization, + vS as createGroundLinePrimitiveItem, + pS as createGroundPrimitiveItem, + pC as createHiddenObjectsCollection, + rM as createHorizontalPlane, + _S as createLinePrimitiveItem, + yS as createOutlinePrimitiveItem, + W0 as createPattern, + mS as createSolidPrimitiveItem, + pe as createSync, + i1 as createTransformationHandler, + ir as createVertex, + _t as cursorMap, + Bu as defaultDeclarativeStyle, + MC as defaultDynamicModuleId, + k1 as defaultExtrudedHeightCondition, + gs as defaultVectorStyle, + gv as deserializeLayer, + dv as deserializeMap, + fv as deserializeViewpoint, + yi as destroyCollection, + mC as detectBrowserLocale, + _n as doNotTransform, + Wu as drapeGeometryOnSurface, + nM as drapeGeometryOnTerrain, + A0 as ecef3DDistance, + Vu as embedIconsInStyle, + G1 as emptyColor, + Z0 as emptyStyle, + sl as enforceEndingVertex, + bv as enforceRightHand, + Q1 as exportFlightAsGeoJson, + eM as exportFlightPathAsGeoJson, + ti as featureArcStruct, + yn as featureExists, + To as featureFromOptions, + Ll as featureProviderClassRegistry, + Bt as featureStoreStateSymbol, + Pv as from2Dto3DLayout, + z1 as from3Dto2DLayout, + ev as fromCesiumColor, + Is as fvLastUpdated, + zd as geometryIsValid, + ar as getAltitudeModeOptions, + ki as getAngleSnapResult, + nS as getArcGeometryFactory, + sS as getArrowHeadPrimitives, + Qv as getBillboardOptions, + Iw as getCanvasFromFeatures, + Rn as getCartesian3Options, + bi as getCartesianBearing, + L0 as getCartesianPitch, + Qt as getCartographicFromPlane, + ri as getCesiumColor, + SS as getCesiumGeometriesOptions, + Wv as getCircleGeometryFactory, + Av as getClampOrigin, + Dn as getClassificationTypeOptions, + K1 as getClippingOptions, + an as getClosestPointOn2DLine, + Mn as getCoordinatesAndLayoutFromVertices, + F1 as getCssStyleFromTextStyle, + zt as getDefaultCondition, + x1 as getDefaultHighlightStyle, + P0 as getDefaultProjection, + Ru as getDefaultVectorStyleItemOptions, + V1 as getDirectionName, + nw as getEPSGCodeFromGeojson, + Id as getExtentFromTileset, + Tv as getExtrusionHeightInfo, + Tu as getFillFromOptions, + ya as getFillOptions, + Wt as getFlatCoordinateReferences, + Ev as getFlatCoordinatesFromSimpleGeometry, + Rd as getFlightPathCoordinatesFromInstance, + yw as getFormat, + Ql as getGeometrySnapResult, + Qs as getHeightFromTerrainProvider, + Rl as getHeightInfo, + X0 as getImageStyleFromOptions, + Nu as getImageStyleOptions, + eS as getLabelOptions, + pv as getLayerIndex, + jh as getLineStringGeometryFactory, + IS as getLongestSide, + dd as getMaterialAppearance, + ja as getMidPoint, + Yu as getMinHeight, + Jv as getModelOptions, + Kv as getModelOrPointPrimitiveOptions, + Nn as getNearFarValueOptions, + ei as getObjectFromClassRegistry, + iS as getPointPrimitives, + Hv as getPolygonGeometryFactory, + Xh as getPolygonizedGeometry, + rd as getPrimitiveOptions, + Iv as getRelativeEquivalent, + Sd as getResolutionOptions, + Fu as getShapeFromOptions, + Vd as getSnappedCoordinateForResults, + Nd as getSplineAndTimesForInstance, + Jn as getStateFromStatesArray, + zh as getStoreyHeights, + Lv as getStoreyOptions, + mt as getStringColor, + Tl as getStrokeFromOptions, + Br as getStrokeOptions, + N1 as getStyleFromOptions, + R1 as getStyleOptions, + wa as getStyleOrDefaultStyle, + Ca as getStylesArray, + Ur as getTerrainProviderForUrl, + Du as getTextFromOptions, + Au as getTextOptions, + hl as getTileHash, + Xa as getTileLoadFunction, + Rw as getTileWebMercatorExtent, + Wl as getTileWgs84Extent, + bd as getTilingScheme, + Td as getURL, + sM as getVcsAppById, + Cd as getVersionFromImageJson, + Oo as getViewDirectionFromViewpoint, + Ld as getWMSSource, + ad as getWgs84CoordinatesForPoint, + TS as getZoom, + Mt as globalHidden, + yr as globalHiderLastUpdated, + X1 as globeLoaded, + En as greyedOutColor, + Te as handlerSymbol, + $1 as hasSameOrigin, + q0 as hexToOlColor, + Ct as hidden, + Ie as highlighted, + DS as imageGeometryToMercatorGeometry, + L1 as initialBearingBetweenCoords, + Ra as is1DAxis, + Fa as is2DAxis, + vt as is2DLayout, + Nl as isAbsoluteHeightReference, + Ot as isClampedHeightReference, + hs as isMobile, + Qo as isOverrideCollection, + dw as isProvidedFeature, + ui as isRelativeHeightReference, + gi as isSameOrigin, + PS as isTerrainTileAvailable, + Zr as isTiledFeature, + Cn as isVertex, + ke as layerClassRegistry, + _i as makeOverrideCollection, + Ks as mapClassRegistry, + $l as markVolatile, + Cv as maxZIndex, + AS as mercatorGeometryToImageGeometry, + W as mercatorProjection, + xa as mercatorResolutionsToLevel, + wt as mercatorToCartesian, + Wa as mercatorToCartesianTransformerForHeightInfo, + bl as mercatorToWgs84Transformer, + Xu as mercatorToWgs84TransformerForHeightInfo, + Je as moduleIdSymbol, + Yn as modulo, + Oi as mouseOverSymbol, + kt as obliqueGeometry, + _d as obliqueViewDirectionNames, + U0 as olColorToCesiumColor, + Ih as olColorToHex, + $r as originalFeatureSymbol, + Mi as originalStyle, + mo as parseCartesian3, + We as parseColor, + yC as parseFlightOptionsFromGeoJson, + A1 as parseFont, + Hi as parseGeoJSON, + Kh as parseImageData, + FS as parseImageMeta, + GS as parseLegacyImageData, + go as parseNearFarScalar, + Os as parseStoreyHeights, + H1 as placeGeometryOnSurface, + aM as placeGeometryOnTerrain, + EC as pointOnLine2D, + xC as pointOnLine3D, + Hu as propertyEqualsEpsilon, + Ul as rectangleToExtent, + Gh as removeEndingVertex, + Uu as removeEndingVertexFromGeometry, + kS as requestArrayBuffer, + ms as requestJson, + vn as requestUrl, + mv as serializeLayer, + fc as setClippingPlanes, + b0 as setDefaultProjectionOptions, + Zh as setNewGeometry, + yd as setReferenceForPicking, + eh as setSnappingFeatures, + So as setSplitDirectionOnPrimitives, + fS as setupClampedPrimitive, + OS as setupScalingPrimitiveCollection, + Xl as setupScratchLayer, + Q0 as shapeCategory, + Qa as snapTypes, + Wh as sortRealWordEdgeCoordinates, + T0 as spherical2Distance, + oM as startCreateFeatureSession, + lM as startEditFeaturesSession, + hM as startEditGeometrySession, + cM as startSelectFeaturesSession, + mn as styleClassRegistry, + iv as synchronizeFeatureVisibility, + Dl as synchronizeFeatureVisibilityWithSource, + Js as tileProviderClassRegistry, + Y1 as tiledLayerLoaded, + Lw as toContext, + LS as transformCWIFC, + Wr as transformFromImage, + j1 as transformToImage, + Mv as updateFeatureVisibility, + xv as updateGlobalHider, + aw as updateLegacyFeature, + td as validateCircle, + T1 as validateHexColor, + Gl as validateLineString, + nd as validatePoint, + Ku as validatePolygon, + Hh as validateStoreys, + Da as validityPlaceholder, + J as vcsLayerName, + xi as vcsMetaVersion, + yt as vectorStyleSymbol, + wn as vertexIndexSymbol, + Jl as vertexSymbol, + hw as volatileModuleId, + de as wgs84Projection, + fa as wgs84ToMercatorTransformer, + Xn as whiteColor, + q1 as writeGeoJSON, + Xr as writeGeoJSONFeature, + Sv as writeStyle +}; diff --git a/public/assets/core.js b/public/assets/core.js new file mode 100644 index 0000000..78bec01 --- /dev/null +++ b/public/assets/core.js @@ -0,0 +1 @@ +export * from "./core-cc7bf7de.js"; diff --git a/public/assets/favicon-128-4c4ce5df.png b/public/assets/favicon-128-4c4ce5df.png new file mode 100644 index 0000000000000000000000000000000000000000..0e62b6fbc88a42b44590b9ccc99826266d73af2b GIT binary patch literal 1312 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 PCn!&(-vs?{*8Rts+>*J^0qSsL{3S0FLa0>&w5D zKOng0!!hgXqLJ?icD*}c@lxJXX^X$WB;3j`uHBXAN8CX_i;^5XXxU`hSJGMkuRwC;Et)n|Q5ub=hf;FM;Fxqsd)Nsb(i$_bu4m%iqqnEc<1>ZqvtJ>jF$ z<&pd*)A5Zt_OSq`Qf*#(wc9R=1vh9UtM*!_U6y;ajrmfG<|FdeYwm2*iIzoW{`(pE z{uA{0$=3Gqm!&7`?gYENc|vThxpuWb(dVZmmnNX!z~~>@(Q~qG@NE6fiA9$R+=c_( z2fuzbiOX7l{a4RnQd+>_3*Z-_nDetJ*A0yN;j6P^sp&y$61PHfF8v~IqLV%R3D&y} zGC*Z3cA8JsS@p+KbeCRE8N#iL^X`ObR`W(R&uK!JA6~1fZ-4Ww0zaN-pU7oWpFC|0 zJEwdr{#J^I9FH1$#T^cwW;Ww~>Q>G=-ED5o%A1&pj)T|7A9MY#L6$rV1 z0J8bBvKi>_D?ezzjW4g%itx`Qx`RQ_p|rZ|%~Znh*ErMX%`Un4jQ7IU+^netmt3Xu z%z`)}o7Wd+YkCwg>apmOXT|eN(Ubd~lol8vBS>&`BMgP*MUdIz>6#w>MLR+H;O~{< zOn^#I%|x)KmfvnTcN4>GxnIk`+a3V1XnHk*)ms6^h~Q*^O2IgZqCVQhYGG73U`b07 zO+maJY84KEu)KJ+%ARsE_XC9PPzUY@hy-+qqU_SvvO@S3fSjyS1nV}@Q3T)K(n9$0 zmKMT&TUr1wZD|24-qM9|%a$&LRhzhI&z(c;FF|iSvmu1cfTv{x7k@}I#-Iu4*6h-$ z$hUvQjM87=o6`i{i}tcwfKO?_H>@0rFJ!Lk+OO<4$_myry#Lalnj# zPH@1IvmYV#(jdN_Y!a~l68Mu&_{{i+Sq33D)=&9=kSZGG1A~ws#7l250Fno&U=8@lerrwkhee0j@M8eb(r+7R%6ARUrf6Q*`=ID|68p*g|0D6 zI*l$-E8Wo=v!vtb-_*)OXmrvMw40*L7lRqQgt;Psbs#9O0)MsReg|Q5NYGucjea5l z*h6fLH9nwHfMy0$WoTkhfa46N#?VAZX6Q`4p^1jf(8m;prp+8$V?}UMoUy=x0Nf+S z2~6_43F^T2P^bZ`A6E@z%l>^*_ghHJb~857>)hRqC!x`T;WvtZ(~o-StRHKJKk`-){i|50#8)h qlp` literal 0 HcmV?d00001 diff --git a/public/assets/favicon-32-4c4ce5df.png b/public/assets/favicon-32-4c4ce5df.png new file mode 100644 index 0000000000000000000000000000000000000000..53ba8da91a873c9d6868597416894a5cf7e64469 GIT binary patch literal 557 zcmV+|0@D47P)F6XU=)mW!00fyEDT6D z0x=&c8vpFI4#vbekakGFeV@|hn%4M`{&Pp82jHp#y?w5i~iVfLX3;l5MVlx+_eM9NCx6h zl*Hx#{|x_6-{JdCf+JQ{`F|(`g#ZK85g~MRL_NrI5Q7OO0(8VxYC2-UUMa30znB=Y zC@BP54v%&wWEpBY;?^^+Z$L+IqB#O&`6^_!Oz4`SjxYz}tCZ&PM{hX5j`;qI=`%LV zu{r?ih)>XvpxhB0mVcW+FMVG1eic@;m~d&NiX&tU*%|bM|1vN!s{wgy7#8f(CfWgL zj#x#qS`GsJOynePpd(iC^79q4u(B{Ra0)Urm?dyBh^l=f(Q**D%1BWr4>6Ht vaII2eVCVTorU?|6GoxS>i~@=QK!5=Nn0dfffXxAV00000NkvXXu0mjfL{{k! literal 0 HcmV?d00001 diff --git a/public/assets/favicon-4c4ce5df.svg b/public/assets/favicon-4c4ce5df.svg new file mode 100644 index 0000000..d8a7205 --- /dev/null +++ b/public/assets/favicon-4c4ce5df.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/font/OFL.txt b/public/assets/font/OFL.txt new file mode 100644 index 0000000..4a44b9b --- /dev/null +++ b/public/assets/font/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/assets/font/TitilliumWeb-Regular-9ca076be.woff2 b/public/assets/font/TitilliumWeb-Regular-9ca076be.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..82b27bcb85040d0060d3cfec003e0e924d08c2c9 GIT binary patch literal 20368 zcmV)mK%T#MPew8T0RR9108fwr4*&oF0O7m<08cRh0RR9100000000000000000000 z0000Q78`+@033r324Db#BoPP-f$BW&|Jwhj0gyVGIWwdA?WB zZTl59BXZjSpxN}gj(J8RbUP?Y59n+6z(9QjF*WWejn66cJ-0rZ@$0te!Elpi%_QIpArixG3*GG|D~LpjO@SD1LQQ zH$2r;)Ee+bp?=>%vN?xo+CqO^yr(=wsXA4fldG$pODFnlrWU$TlOu4jKFs8e`k3L$YRguNv}Sjyj;D35g% z_VEvK)c)J^0$N%+tz*3Lzyix4jx!7};KoZKz0xl80^%VahHYcoMTR}M+i7j`dh%Sy zi)FL=fuapk^IQQ06hMFqa}Lu1D|JB0#&?X@@}^UA8kV14@{k2G1+_;G)g-54d^s(5 zCHu>+G@+T`#seGfQ1bfDMc?oLotd!GtqHSeO2r95L8Z}eh4B9Ycm7W``#ToML8O9i zdw?(g3@H|nG{c%Oh=vy8hBg@gnH-ui$A2aI-f_DO{F~N5kHpx-#68tk&E|QMMKMG zC2R!{2PCbJWeTeB2{>#2%{qTYuwzmT1VO<<%U?k6^}lNU_yz>ny8id3rtN+P5fnWh z!ihR(N<)RrqSH|+^6Xs3)M4Mp$KvnDg5Yuw;$koGNChq_o=NcThCu;800e>4&Elw( z0(lN0hSt4n6{XwGQfqfEn#x7*ac7?Y|7HI_+mkoy1^FcIZTZ|U;Ye2Wt=liGUlbwN z=+Qqo4ozxu{gCb@D_j&3g~T=ak}r=aLlhF3B*T-1L>R~M_fD(3Yb)GS`+G)X(;5_I zW$zhA5Mc(vr{UM)m4}4SL=Y7#YYDB;GFJ1w+xhl7Iqm(@D?RQlgy4zP1Y?8{Mrgu# z$KS4{+AOFe(ij;x>_Za93g!r5NGnelrA=d+XGT~2w`*k>LBNfIYz0Z$|9wFq1^^6E zZ_^?WF+ivN`sMHd==(Rr0h$B&J_E#jde<4S{QM~n&_DzP%-tsx1I&{zV8}fBkS
    Kc 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 e in n ? LC(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t; +var pf = (n, e, t) => FC(n, typeof e != "symbol" ? e + "" : e, t); +class xt { + /** + * @param {string} type Type. + */ + constructor(e) { + this.propagationStopped, this.defaultPrevented, this.type = e, this.target = null; + } + /** + * Prevent default. This means that no emulated `click`, `singleclick` or `doubleclick` events + * will be fired. + * @api + */ + preventDefault() { + this.defaultPrevented = !0; + } + /** + * Stop event propagation. + * @api + */ + stopPropagation() { + this.propagationStopped = !0; + } +} +function bC(n) { + n.stopPropagation(); +} +function eO(n) { + n.preventDefault(); +} +const Yr = { + /** + * Triggered when a property is changed. + * @event module:ol/Object.ObjectEvent#propertychange + * @api + */ + PROPERTYCHANGE: "propertychange" +}; +class Bo { + constructor() { + this.disposed = !1; + } + /** + * Clean up. + */ + dispose() { + this.disposed || (this.disposed = !0, this.disposeInternal()); + } + /** + * Extension point for disposable objects. + * @protected + */ + disposeInternal() { + } +} +function PC(n, e, t) { + let i, r; + t = t || gn; + let s = 0, o = n.length, a = !1; + for (; s < o; ) + i = s + (o - s >> 1), r = +t(n[i], e), r < 0 ? s = i + 1 : (o = i, a = !r); + return a ? s : ~s; +} +function gn(n, e) { + return n > e ? 1 : n < e ? -1 : 0; +} +function MC(n, e) { + return n < e ? 1 : n > e ? -1 : 0; +} +function uc(n, e, t) { + if (n[0] <= e) + return 0; + const i = n.length; + if (e <= n[i - 1]) + return i - 1; + if (typeof t == "function") { + for (let r = 1; r < i; ++r) { + const s = n[r]; + if (s === e) + return r; + if (s < e) + return t(e, n[r - 1], s) > 0 ? r - 1 : r; + } + return i - 1; + } + if (t > 0) { + for (let r = 1; r < i; ++r) + if (n[r] < e) + return r - 1; + return i - 1; + } + if (t < 0) { + for (let r = 1; r < i; ++r) + if (n[r] <= e) + return r; + return i - 1; + } + for (let r = 1; r < i; ++r) { + if (n[r] == e) + return r; + if (n[r] < e) + return n[r - 1] - e < e - n[r] ? r - 1 : r; + } + return i - 1; +} +function NC(n, e, t) { + for (; e < t; ) { + const i = n[e]; + n[e] = n[t], n[t] = i, ++e, --t; + } +} +function Se(n, e) { + const t = Array.isArray(e) ? e : [e], i = t.length; + for (let r = 0; r < i; r++) + n[n.length] = t[r]; +} +function tO(n, e) { + const t = n.indexOf(e), i = t > -1; + return i && n.splice(t, 1), i; +} +function yn(n, e) { + const t = n.length; + if (t !== e.length) + return !1; + for (let i = 0; i < t; i++) + if (n[i] !== e[i]) + return !1; + return !0; +} +function iO(n, e) { + const t = n.length, i = Array(n.length); + let r; + for (r = 0; r < t; r++) + i[r] = { index: r, value: n[r] }; + for (i.sort(function(s, o) { + return e(s.value, o.value) || s.index - o.index; + }), r = 0; r < n.length; r++) + n[r] = i[r].value; +} +function OC(n, e, t) { + const i = e || gn; + return n.every(function(r, s) { + if (s === 0) + return !0; + const o = i(n[s - 1], r); + return !(o > 0 || t && o === 0); + }); +} +function bi() { + return !0; +} +function is() { + return !1; +} +function io() { +} +function _p(n) { + let e, t, i; + return function() { + const r = Array.prototype.slice.call(arguments); + return (!t || this !== i || !yn(r, t)) && (i = this, t = r, e = n.apply(this, arguments)), e; + }; +} +function og(n) { + function e() { + let t; + try { + t = n(); + } catch (i) { + return Promise.reject(i); + } + return t instanceof Promise ? t : Promise.resolve(t); + } + return e(); +} +function ns(n) { + for (const e in n) + delete n[e]; +} +function Hi(n) { + let e; + for (e in n) + return !1; + return !e; +} +class So extends Bo { + /** + * @param {*} [target] Default event target for dispatched events. + */ + constructor(e) { + super(), this.eventTarget_ = e, this.pendingRemovals_ = null, this.dispatching_ = null, this.listeners_ = null; + } + /** + * @param {string} type Type. + * @param {import("../events.js").Listener} listener Listener. + */ + addEventListener(e, t) { + if (!e || !t) + return; + const i = this.listeners_ || (this.listeners_ = {}), r = i[e] || (i[e] = []); + r.includes(t) || r.push(t); + } + /** + * Dispatches an event and calls all listeners listening for events + * of this type. The event parameter can either be a string or an + * Object with a `type` property. + * + * @param {import("./Event.js").default|string} event Event object. + * @return {boolean|undefined} `false` if anyone called preventDefault on the + * event object or if any of the listeners returned false. + * @api + */ + dispatchEvent(e) { + const t = typeof e == "string", i = t ? e : e.type, r = this.listeners_ && this.listeners_[i]; + if (!r) + return; + const s = t ? new xt(e) : ( + /** @type {Event} */ + e + ); + s.target || (s.target = this.eventTarget_ || this); + const o = this.dispatching_ || (this.dispatching_ = {}), a = this.pendingRemovals_ || (this.pendingRemovals_ = {}); + i in o || (o[i] = 0, a[i] = 0), ++o[i]; + let l; + for (let A = 0, c = r.length; A < c; ++A) + if ("handleEvent" in r[A] ? l = /** @type {import("../events.js").ListenerObject} */ + r[A].handleEvent(s) : l = /** @type {import("../events.js").ListenerFunction} */ + r[A].call(this, s), l === !1 || s.propagationStopped) { + l = !1; + break; + } + if (--o[i] === 0) { + let A = a[i]; + for (delete a[i]; A--; ) + this.removeEventListener(i, io); + delete o[i]; + } + return l; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.listeners_ && ns(this.listeners_); + } + /** + * Get the listeners for a specified event type. Listeners are returned in the + * order that they will be called in. + * + * @param {string} type Type. + * @return {Array|undefined} Listeners. + */ + getListeners(e) { + return this.listeners_ && this.listeners_[e] || void 0; + } + /** + * @param {string} [type] Type. If not provided, + * `true` will be returned if this event target has any listeners. + * @return {boolean} Has listeners. + */ + hasListener(e) { + return this.listeners_ ? e ? e in this.listeners_ : Object.keys(this.listeners_).length > 0 : !1; + } + /** + * @param {string} type Type. + * @param {import("../events.js").Listener} listener Listener. + */ + removeEventListener(e, t) { + if (!this.listeners_) + return; + const i = this.listeners_[e]; + if (!i) + return; + const r = i.indexOf(t); + r !== -1 && (this.pendingRemovals_ && e in this.pendingRemovals_ ? (i[r] = io, ++this.pendingRemovals_[e]) : (i.splice(r, 1), i.length === 0 && delete this.listeners_[e])); + } +} +const j = { + /** + * Generic change event. Triggered when the revision counter is increased. + * @event module:ol/events/Event~BaseEvent#change + * @api + */ + CHANGE: "change", + /** + * Generic error event. Triggered when an error occurs. + * @event module:ol/events/Event~BaseEvent#error + * @api + */ + ERROR: "error", + BLUR: "blur", + CLEAR: "clear", + CONTEXTMENU: "contextmenu", + CLICK: "click", + DBLCLICK: "dblclick", + DRAGENTER: "dragenter", + DRAGOVER: "dragover", + DROP: "drop", + FOCUS: "focus", + KEYDOWN: "keydown", + KEYPRESS: "keypress", + LOAD: "load", + RESIZE: "resize", + TOUCHMOVE: "touchmove", + WHEEL: "wheel" +}; +function ie(n, e, t, i, r) { + if (r) { + const o = t; + t = function() { + n.removeEventListener(e, t), o.apply(i ?? this, arguments); + }; + } else i && i !== n && (t = t.bind(i)); + const s = { + target: n, + type: e, + listener: t + }; + return n.addEventListener(e, t), s; +} +function no(n, e, t, i) { + return ie(n, e, t, i, !0); +} +function Re(n) { + n && n.target && (n.target.removeEventListener(n.type, n.listener), ns(n)); +} +class rl extends So { + constructor() { + super(), this.on = /** @type {ObservableOnSignature} */ + this.onInternal, this.once = /** @type {ObservableOnSignature} */ + this.onceInternal, this.un = /** @type {ObservableOnSignature} */ + this.unInternal, this.revision_ = 0; + } + /** + * Increases the revision counter and dispatches a 'change' event. + * @api + */ + changed() { + ++this.revision_, this.dispatchEvent(j.CHANGE); + } + /** + * Get the version number for this object. Each time the object is modified, + * its version number will be incremented. + * @return {number} Revision. + * @api + */ + getRevision() { + return this.revision_; + } + /** + * @param {string|Array} type Type. + * @param {function((Event|import("./events/Event").default)): ?} listener Listener. + * @return {import("./events.js").EventsKey|Array} Event key. + * @protected + */ + onInternal(e, t) { + if (Array.isArray(e)) { + const i = e.length, r = new Array(i); + for (let s = 0; s < i; ++s) + r[s] = ie(this, e[s], t); + return r; + } + return ie( + this, + /** @type {string} */ + e, + t + ); + } + /** + * @param {string|Array} type Type. + * @param {function((Event|import("./events/Event").default)): ?} listener Listener. + * @return {import("./events.js").EventsKey|Array} Event key. + * @protected + */ + onceInternal(e, t) { + let i; + if (Array.isArray(e)) { + const r = e.length; + i = new Array(r); + for (let s = 0; s < r; ++s) + i[s] = no(this, e[s], t); + } else + i = no( + this, + /** @type {string} */ + e, + t + ); + return t.ol_key = i, i; + } + /** + * Unlisten for a certain type of event. + * @param {string|Array} type Type. + * @param {function((Event|import("./events/Event").default)): ?} listener Listener. + * @protected + */ + unInternal(e, t) { + const i = ( + /** @type {Object} */ + t.ol_key + ); + if (i) + GC(i); + else if (Array.isArray(e)) + for (let r = 0, s = e.length; r < s; ++r) + this.removeEventListener(e[r], t); + else + this.removeEventListener(e, t); + } +} +rl.prototype.on; +rl.prototype.once; +rl.prototype.un; +function GC(n) { + if (Array.isArray(n)) + for (let e = 0, t = n.length; e < t; ++e) + Re(n[e]); + else + Re( + /** @type {import("./events.js").EventsKey} */ + n + ); +} +function ae() { + throw new Error("Unimplemented abstract method."); +} +let kC = 0; +function X(n) { + return n.ol_uid || (n.ol_uid = String(++kC)); +} +const nO = "10.2.1"; +class _f extends xt { + /** + * @param {string} type The event type. + * @param {string} key The property name. + * @param {*} oldValue The old value for `key`. + */ + constructor(e, t, i) { + super(e), this.key = t, this.oldValue = i; + } +} +class Oi extends rl { + /** + * @param {Object} [values] An object with key-value pairs. + */ + constructor(e) { + super(), this.on, this.once, this.un, X(this), this.values_ = null, e !== void 0 && this.setProperties(e); + } + /** + * Gets a value. + * @param {string} key Key name. + * @return {*} Value. + * @api + */ + get(e) { + let t; + return this.values_ && this.values_.hasOwnProperty(e) && (t = this.values_[e]), t; + } + /** + * Get a list of object property names. + * @return {Array} List of property names. + * @api + */ + getKeys() { + return this.values_ && Object.keys(this.values_) || []; + } + /** + * Get an object of all property names and values. + * @return {Object} Object. + * @api + */ + getProperties() { + return this.values_ && Object.assign({}, this.values_) || {}; + } + /** + * Get an object of all property names and values. + * @return {Object?} Object. + */ + getPropertiesInternal() { + return this.values_; + } + /** + * @return {boolean} The object has properties. + */ + hasProperties() { + return !!this.values_; + } + /** + * @param {string} key Key name. + * @param {*} oldValue Old value. + */ + notify(e, t) { + let i; + i = `change:${e}`, this.hasListener(i) && this.dispatchEvent(new _f(i, e, t)), i = Yr.PROPERTYCHANGE, this.hasListener(i) && this.dispatchEvent(new _f(i, e, t)); + } + /** + * @param {string} key Key name. + * @param {import("./events.js").Listener} listener Listener. + */ + addChangeListener(e, t) { + this.addEventListener(`change:${e}`, t); + } + /** + * @param {string} key Key name. + * @param {import("./events.js").Listener} listener Listener. + */ + removeChangeListener(e, t) { + this.removeEventListener(`change:${e}`, t); + } + /** + * Sets a value. + * @param {string} key Key name. + * @param {*} value Value. + * @param {boolean} [silent] Update without triggering an event. + * @api + */ + set(e, t, i) { + const r = this.values_ || (this.values_ = {}); + if (i) + r[e] = t; + else { + const s = r[e]; + r[e] = t, s !== t && this.notify(e, s); + } + } + /** + * Sets a collection of key-value pairs. Note that this changes any existing + * properties and adds new ones (it does not remove any existing properties). + * @param {Object} values Values. + * @param {boolean} [silent] Update without triggering an event. + * @api + */ + setProperties(e, t) { + for (const i in e) + this.set(i, e[i], t); + } + /** + * Apply any properties from another object without triggering events. + * @param {BaseObject} source The source object. + * @protected + */ + applyProperties(e) { + e.values_ && Object.assign(this.values_ || (this.values_ = {}), e.values_); + } + /** + * Unsets a property. + * @param {string} key Key name. + * @param {boolean} [silent] Unset without triggering an event. + * @api + */ + unset(e, t) { + if (this.values_ && e in this.values_) { + const i = this.values_[e]; + delete this.values_[e], Hi(this.values_) && (this.values_ = null), t || this.notify(e, i); + } + } +} +const ct = { + /** + * Triggered when an item is added to the collection. + * @event module:ol/Collection.CollectionEvent#add + * @api + */ + ADD: "add", + /** + * Triggered when an item is removed from the collection. + * @event module:ol/Collection.CollectionEvent#remove + * @api + */ + REMOVE: "remove" +}, If = { + LENGTH: "length" +}; +class Fl extends xt { + /** + * @param {import("./CollectionEventType.js").default} type Type. + * @param {T} element Element. + * @param {number} index The index of the added or removed element. + */ + constructor(e, t, i) { + super(e), this.element = t, this.index = i; + } +} +class wt extends Oi { + /** + * @param {Array} [array] Array. + * @param {Options} [options] Collection options. + */ + constructor(e, t) { + if (super(), this.on, this.once, this.un, t = t || {}, this.unique_ = !!t.unique, this.array_ = e || [], this.unique_) + for (let i = 0, r = this.array_.length; i < r; ++i) + this.assertUnique_(this.array_[i], i); + this.updateLength_(); + } + /** + * Remove all elements from the collection. + * @api + */ + clear() { + for (; this.getLength() > 0; ) + this.pop(); + } + /** + * Add elements to the collection. This pushes each item in the provided array + * to the end of the collection. + * @param {!Array} arr Array. + * @return {Collection} This collection. + * @api + */ + extend(e) { + for (let t = 0, i = e.length; t < i; ++t) + this.push(e[t]); + return this; + } + /** + * Iterate over each element, calling the provided callback. + * @param {function(T, number, Array): *} f The function to call + * for every element. This function takes 3 arguments (the element, the + * index and the array). The return value is ignored. + * @api + */ + forEach(e) { + const t = this.array_; + for (let i = 0, r = t.length; i < r; ++i) + e(t[i], i, t); + } + /** + * Get a reference to the underlying Array object. Warning: if the array + * is mutated, no events will be dispatched by the collection, and the + * collection's "length" property won't be in sync with the actual length + * of the array. + * @return {!Array} Array. + * @api + */ + getArray() { + return this.array_; + } + /** + * Get the element at the provided index. + * @param {number} index Index. + * @return {T} Element. + * @api + */ + item(e) { + return this.array_[e]; + } + /** + * Get the length of this collection. + * @return {number} The length of the array. + * @observable + * @api + */ + getLength() { + return this.get(If.LENGTH); + } + /** + * Insert an element at the provided index. + * @param {number} index Index. + * @param {T} elem Element. + * @api + */ + insertAt(e, t) { + if (e < 0 || e > this.getLength()) + throw new Error("Index out of bounds: " + e); + this.unique_ && this.assertUnique_(t), this.array_.splice(e, 0, t), this.updateLength_(), this.dispatchEvent( + new Fl(ct.ADD, t, e) + ); + } + /** + * Remove the last element of the collection and return it. + * Return `undefined` if the collection is empty. + * @return {T|undefined} Element. + * @api + */ + pop() { + return this.removeAt(this.getLength() - 1); + } + /** + * Insert the provided element at the end of the collection. + * @param {T} elem Element. + * @return {number} New length of the collection. + * @api + */ + push(e) { + this.unique_ && this.assertUnique_(e); + const t = this.getLength(); + return this.insertAt(t, e), this.getLength(); + } + /** + * Remove the first occurrence of an element from the collection. + * @param {T} elem Element. + * @return {T|undefined} The removed element or undefined if none found. + * @api + */ + remove(e) { + const t = this.array_; + for (let i = 0, r = t.length; i < r; ++i) + if (t[i] === e) + return this.removeAt(i); + } + /** + * Remove the element at the provided index and return it. + * Return `undefined` if the collection does not contain this index. + * @param {number} index Index. + * @return {T|undefined} Value. + * @api + */ + removeAt(e) { + if (e < 0 || e >= this.getLength()) + return; + const t = this.array_[e]; + return this.array_.splice(e, 1), this.updateLength_(), this.dispatchEvent( + /** @type {CollectionEvent} */ + new Fl(ct.REMOVE, t, e) + ), t; + } + /** + * Set the element at the provided index. + * @param {number} index Index. + * @param {T} elem Element. + * @api + */ + setAt(e, t) { + const i = this.getLength(); + if (e >= i) { + this.insertAt(e, t); + return; + } + if (e < 0) + throw new Error("Index out of bounds: " + e); + this.unique_ && this.assertUnique_(t, e); + const r = this.array_[e]; + this.array_[e] = t, this.dispatchEvent( + /** @type {CollectionEvent} */ + new Fl(ct.REMOVE, r, e) + ), this.dispatchEvent( + /** @type {CollectionEvent} */ + new Fl(ct.ADD, t, e) + ); + } + /** + * @private + */ + updateLength_() { + this.set(If.LENGTH, this.array_.length); + } + /** + * @private + * @param {T} elem Element. + * @param {number} [except] Optional index to ignore. + */ + assertUnique_(e, t) { + for (let i = 0, r = this.array_.length; i < r; ++i) + if (this.array_[i] === e && i !== t) + throw new Error("Duplicate item added to a unique collection"); + } +} +const $ = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + /** + * Indicates that tile loading failed + * @type {number} + */ + ERROR: 3, + EMPTY: 4 +}; +function Ip(n) { + return Math.pow(n, 3); +} +function rs(n) { + return 1 - Ip(1 - n); +} +function pu(n) { + return 3 * n * n - 2 * n * n * n; +} +function $C(n) { + return n; +} +function rO(n) { + return n < 0.5 ? pu(2 * n) : 1 - pu(2 * (n - 0.5)); +} +class Ro extends So { + /** + * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. + * @param {import("./TileState.js").default} state State. + * @param {Options} [options] Tile options. + */ + constructor(e, t, i) { + super(), i = i || {}, this.tileCoord = e, this.state = t, this.key = "", this.transition_ = i.transition === void 0 ? 250 : i.transition, this.transitionStarts_ = {}, this.interpolate = !!i.interpolate; + } + /** + * @protected + */ + changed() { + this.dispatchEvent(j.CHANGE); + } + /** + * Called by the tile cache when the tile is removed from the cache due to expiry + */ + release() { + this.state === $.ERROR && this.setState($.EMPTY); + } + /** + * @return {string} Key. + */ + getKey() { + return this.key + "/" + this.tileCoord; + } + /** + * Get the tile coordinate for this tile. + * @return {import("./tilecoord.js").TileCoord} The tile coordinate. + * @api + */ + getTileCoord() { + return this.tileCoord; + } + /** + * @return {import("./TileState.js").default} State. + */ + getState() { + return this.state; + } + /** + * Sets the state of this tile. If you write your own {@link module:ol/Tile~LoadFunction tileLoadFunction} , + * it is important to set the state correctly to {@link module:ol/TileState~ERROR} + * when the tile cannot be loaded. Otherwise the tile cannot be removed from + * the tile queue and will block other requests. + * @param {import("./TileState.js").default} state State. + * @api + */ + setState(e) { + if (this.state !== $.ERROR && this.state > e) + throw new Error("Tile load sequence violation"); + this.state = e, this.changed(); + } + /** + * Load the image or retry if loading previously failed. + * Loading is taken care of by the tile queue, and calling this method is + * only needed for preloading or for reloading in case of an error. + * @abstract + * @api + */ + load() { + ae(); + } + /** + * Get the alpha value for rendering. + * @param {string} id An id for the renderer. + * @param {number} time The render frame time. + * @return {number} A number between 0 and 1. + */ + getAlpha(e, t) { + if (!this.transition_) + return 1; + let i = this.transitionStarts_[e]; + if (!i) + i = t, this.transitionStarts_[e] = i; + else if (i === -1) + return 1; + const r = t - i + 1e3 / 60; + return r >= this.transition_ ? 1 : Ip(r / this.transition_); + } + /** + * Determine if a tile is in an alpha transition. A tile is considered in + * transition if tile.getAlpha() has not yet been called or has been called + * and returned 1. + * @param {string} id An id for the renderer. + * @return {boolean} The tile is in transition. + */ + inTransition(e) { + return this.transition_ ? this.transitionStarts_[e] !== -1 : !1; + } + /** + * Mark a transition as complete. + * @param {string} id An id for the renderer. + */ + endTransition(e) { + this.transition_ && (this.transitionStarts_[e] = -1); + } + /** + * @override + */ + disposeInternal() { + this.release(), super.disposeInternal(); + } +} +const Er = typeof navigator < "u" && typeof navigator.userAgent < "u" ? navigator.userAgent.toLowerCase() : "", UC = Er.includes("firefox"), YC = Er.includes("safari") && !Er.includes("chrom"), zC = YC && (Er.includes("version/15.4") || /cpu (os|iphone os) 15_4 like mac os x/.test(Er)), VC = Er.includes("webkit") && !Er.includes("edge"), ag = Er.includes("macintosh"), lg = typeof devicePixelRatio < "u" ? devicePixelRatio : 1, Cp = typeof WorkerGlobalScope < "u" && typeof OffscreenCanvas < "u" && self instanceof WorkerGlobalScope, Ag = typeof Image < "u" && Image.prototype.decode, HC = typeof createImageBitmap == "function", yp = function() { + let n = !1; + try { + const e = Object.defineProperty({}, "passive", { + get: function() { + n = !0; + } + }); + window.addEventListener("_", null, e), window.removeEventListener("_", null, e); + } catch { + } + return n; +}(); +function Ve(n, e, t, i) { + let r; + return t && t.length ? r = /** @type {HTMLCanvasElement} */ + t.shift() : Cp ? r = new OffscreenCanvas(n || 300, e || 300) : r = document.createElement("canvas"), n && (r.width = n), e && (r.height = e), /** @type {CanvasRenderingContext2D} */ + r.getContext("2d", i); +} +let lh; +function BA() { + return lh || (lh = Ve(1, 1)), lh; +} +function zr(n) { + const e = n.canvas; + e.width = 1, e.height = 1, n.clearRect(0, 0, 1, 1); +} +function XC(n) { + let e = n.offsetWidth; + const t = getComputedStyle(n); + return e += parseInt(t.marginLeft, 10) + parseInt(t.marginRight, 10), e; +} +function qC(n) { + let e = n.offsetHeight; + const t = getComputedStyle(n); + return e += parseInt(t.marginTop, 10) + parseInt(t.marginBottom, 10), e; +} +function ro(n, e) { + const t = e.parentNode; + t && t.replaceChild(n, e); +} +function wp(n) { + for (; n.lastChild; ) + n.lastChild.remove(); +} +function jC(n, e) { + const t = n.childNodes; + for (let i = 0; ; ++i) { + const r = t[i], s = e[i]; + if (!r && !s) + break; + if (r !== s) { + if (!r) { + n.appendChild(s); + continue; + } + if (!s) { + n.removeChild(r), --i; + continue; + } + n.insertBefore(s, r); + } + } +} +function so(n) { + return n instanceof Image || n instanceof HTMLCanvasElement || n instanceof HTMLVideoElement || n instanceof ImageBitmap ? n : null; +} +function _u(n) { + return n instanceof Uint8Array || n instanceof Uint8ClampedArray || n instanceof Float32Array || n instanceof DataView ? n : null; +} +const KC = new Error("disposed"); +let ps = null; +function WC(n) { + ps || (ps = Ve( + n.width, + n.height, + void 0, + { willReadFrequently: !0 } + )); + const e = ps.canvas, t = n.width; + e.width !== t && (e.width = t); + const i = n.height; + return e.height !== i && (e.height = i), ps.clearRect(0, 0, t, i), ps.drawImage(n, 0, 0), ps.getImageData(0, 0, t, i).data; +} +const ZC = [256, 256]; +class Ta extends Ro { + /** + * @param {Options} options Tile options. + */ + constructor(e) { + const t = $.IDLE; + super(e.tileCoord, t, { + transition: e.transition, + interpolate: e.interpolate + }), this.loader_ = e.loader, this.data_ = null, this.error_ = null, this.size_ = e.size || null, this.controller_ = e.controller || null; + } + /** + * Get the tile size. + * @return {import('./size.js').Size} Tile size. + */ + getSize() { + if (this.size_) + return this.size_; + const e = so(this.data_); + return e ? [e.width, e.height] : ZC; + } + /** + * Get the data for the tile. + * @return {Data} Tile data. + * @api + */ + getData() { + return this.data_; + } + /** + * Get any loading error. + * @return {Error} Loading error. + * @api + */ + getError() { + return this.error_; + } + /** + * Load the tile data. + * @api + * @override + */ + load() { + if (this.state !== $.IDLE && this.state !== $.ERROR) + return; + this.state = $.LOADING, this.changed(); + const e = this; + this.loader_().then(function(t) { + e.data_ = t, e.state = $.LOADED, e.changed(); + }).catch(function(t) { + e.error_ = t, e.state = $.ERROR, e.changed(); + }); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.controller_ && (this.controller_.abort(KC), this.controller_ = null), super.disposeInternal(); + } +} +function Ie(n, e) { + if (!n) + throw new Error(e); +} +class ve extends Oi { + /** + * @param {Geometry|ObjectWithGeometry} [geometryOrProperties] + * You may pass a Geometry object directly, or an object literal containing + * properties. If you pass an object literal, you may include a Geometry + * associated with a `geometry` key. + */ + constructor(e) { + if (super(), this.on, this.once, this.un, this.id_ = void 0, this.geometryName_ = "geometry", this.style_ = null, this.styleFunction_ = void 0, this.geometryChangeKey_ = null, this.addChangeListener(this.geometryName_, this.handleGeometryChanged_), e) + if (typeof /** @type {?} */ + e.getSimplifiedGeometry == "function") { + const t = ( + /** @type {Geometry} */ + e + ); + this.setGeometry(t); + } else { + const t = e; + this.setProperties(t); + } + } + /** + * Clone this feature. If the original feature has a geometry it + * is also cloned. The feature id is not set in the clone. + * @return {Feature} The clone. + * @api + */ + clone() { + const e = ( + /** @type {Feature} */ + new ve(this.hasProperties() ? this.getProperties() : null) + ); + e.setGeometryName(this.getGeometryName()); + const t = this.getGeometry(); + t && e.setGeometry( + /** @type {Geometry} */ + t.clone() + ); + const i = this.getStyle(); + return i && e.setStyle(i), e; + } + /** + * Get the feature's default geometry. A feature may have any number of named + * geometries. The "default" geometry (the one that is rendered by default) is + * set when calling {@link module:ol/Feature~Feature#setGeometry}. + * @return {Geometry|undefined} The default geometry for the feature. + * @api + * @observable + */ + getGeometry() { + return ( + /** @type {Geometry|undefined} */ + this.get(this.geometryName_) + ); + } + /** + * Get the feature identifier. This is a stable identifier for the feature and + * is either set when reading data from a remote source or set explicitly by + * calling {@link module:ol/Feature~Feature#setId}. + * @return {number|string|undefined} Id. + * @api + */ + getId() { + return this.id_; + } + /** + * Get the name of the feature's default geometry. By default, the default + * geometry is named `geometry`. + * @return {string} Get the property name associated with the default geometry + * for this feature. + * @api + */ + getGeometryName() { + return this.geometryName_; + } + /** + * Get the feature's style. Will return what was provided to the + * {@link module:ol/Feature~Feature#setStyle} method. + * @return {import("./style/Style.js").StyleLike|undefined} The feature style. + * @api + */ + getStyle() { + return this.style_; + } + /** + * Get the feature's style function. + * @return {import("./style/Style.js").StyleFunction|undefined} Return a function + * representing the current style of this feature. + * @api + */ + getStyleFunction() { + return this.styleFunction_; + } + /** + * @private + */ + handleGeometryChange_() { + this.changed(); + } + /** + * @private + */ + handleGeometryChanged_() { + this.geometryChangeKey_ && (Re(this.geometryChangeKey_), this.geometryChangeKey_ = null); + const e = this.getGeometry(); + e && (this.geometryChangeKey_ = ie( + e, + j.CHANGE, + this.handleGeometryChange_, + this + )), this.changed(); + } + /** + * Set the default geometry for the feature. This will update the property + * with the name returned by {@link module:ol/Feature~Feature#getGeometryName}. + * @param {Geometry|undefined} geometry The new geometry. + * @api + * @observable + */ + setGeometry(e) { + this.set(this.geometryName_, e); + } + /** + * Set the style for the feature to override the layer style. This can be a + * single style object, an array of styles, or a function that takes a + * resolution and returns an array of styles. To unset the feature style, call + * `setStyle()` without arguments or a falsey value. + * @param {import("./style/Style.js").StyleLike} [style] Style for this feature. + * @api + * @fires module:ol/events/Event~BaseEvent#event:change + */ + setStyle(e) { + this.style_ = e, this.styleFunction_ = e ? JC(e) : void 0, this.changed(); + } + /** + * Set the feature id. The feature id is considered stable and may be used when + * requesting features or comparing identifiers returned from a remote source. + * The feature id can be used with the + * {@link module:ol/source/Vector~VectorSource#getFeatureById} method. + * @param {number|string|undefined} id The feature id. + * @api + * @fires module:ol/events/Event~BaseEvent#event:change + */ + setId(e) { + this.id_ = e, this.changed(); + } + /** + * Set the property name to be used when getting the feature's default geometry. + * When calling {@link module:ol/Feature~Feature#getGeometry}, the value of the property with + * this name will be returned. + * @param {string} name The property name of the default geometry. + * @api + */ + setGeometryName(e) { + this.removeChangeListener(this.geometryName_, this.handleGeometryChanged_), this.geometryName_ = e, this.addChangeListener(this.geometryName_, this.handleGeometryChanged_), this.handleGeometryChanged_(); + } +} +function JC(n) { + if (typeof n == "function") + return n; + let e; + return Array.isArray(n) ? e = n : (Ie( + typeof /** @type {?} */ + n.getZIndex == "function", + "Expected an `ol/style/Style` or an array of `ol/style/Style.js`" + ), e = [ + /** @type {import("./style/Style.js").default} */ + n + ]), function() { + return e; + }; +} +const cg = new Array(6); +function Fe() { + return [1, 0, 0, 1, 0, 0]; +} +function Iu(n) { + return sl(n, 1, 0, 0, 1, 0, 0); +} +function yr(n, e) { + const t = n[0], i = n[1], r = n[2], s = n[3], o = n[4], a = n[5], l = e[0], A = e[1], c = e[2], h = e[3], u = e[4], g = e[5]; + return n[0] = t * l + r * A, n[1] = i * l + s * A, n[2] = t * c + r * h, n[3] = i * c + s * h, n[4] = t * u + r * g + o, n[5] = i * u + s * g + a, n; +} +function sl(n, e, t, i, r, s, o) { + return n[0] = e, n[1] = t, n[2] = i, n[3] = r, n[4] = s, n[5] = o, n; +} +function SA(n, e) { + return n[0] = e[0], n[1] = e[1], n[2] = e[2], n[3] = e[3], n[4] = e[4], n[5] = e[5], n; +} +function Pe(n, e) { + const t = e[0], i = e[1]; + return e[0] = n[0] * t + n[2] * i + n[4], e[1] = n[1] * t + n[3] * i + n[5], e; +} +function ey(n, e) { + const t = Math.cos(e), i = Math.sin(e); + return yr(n, sl(cg, t, i, -i, t, 0, 0)); +} +function Hs(n, e, t) { + return yr(n, sl(cg, e, 0, 0, t, 0, 0)); +} +function sO(n, e, t) { + return sl(n, e, 0, 0, t, 0, 0); +} +function ol(n, e, t) { + return yr(n, sl(cg, 1, 0, 0, 1, e, t)); +} +function ai(n, e, t, i, r, s, o, a) { + const l = Math.sin(s), A = Math.cos(s); + return n[0] = i * A, n[1] = r * l, n[2] = -i * l, n[3] = r * A, n[4] = o * i * A - a * i * l + e, n[5] = o * r * l + a * r * A + t, n; +} +function oO(n, e, t, i, r, s, o) { + return xp(ai(Fe(), n, e, t, i, r, s, o)); +} +function aO(n) { + return Xn(n, n); +} +function Xn(n, e) { + const t = ty(e); + Ie(t !== 0, "Transformation matrix cannot be inverted"); + const i = e[0], r = e[1], s = e[2], o = e[3], a = e[4], l = e[5]; + return n[0] = o / t, n[1] = -r / t, n[2] = -s / t, n[3] = i / t, n[4] = (s * l - o * a) / t, n[5] = -(i * l - r * a) / t, n; +} +function ty(n) { + return n[0] * n[3] - n[1] * n[2]; +} +const Cf = [1e6, 1e6, 1e6, 1e6, 2, 2]; +function xp(n) { + return "matrix(" + n.map( + (t, i) => Math.round(t * Cf[i]) / Cf[i] + ).join(", ") + ")"; +} +const St = { + UNKNOWN: 0, + INTERSECTING: 1, + ABOVE: 2, + RIGHT: 4, + BELOW: 8, + LEFT: 16 +}; +function rt(n) { + const e = Ft(); + for (let t = 0, i = n.length; t < i; ++t) + qs(e, n[t]); + return e; +} +function iy(n, e, t) { + const i = Math.min.apply(null, n), r = Math.min.apply(null, e), s = Math.max.apply(null, n), o = Math.max.apply(null, e); + return Pi(i, r, s, o, t); +} +function Xt(n, e, t) { + return t ? (t[0] = n[0] - e, t[1] = n[1] - e, t[2] = n[2] + e, t[3] = n[3] + e, t) : [ + n[0] - e, + n[1] - e, + n[2] + e, + n[3] + e + ]; +} +function Bp(n, e) { + return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n.slice(); +} +function ss(n, e, t) { + let i, r; + return e < n[0] ? i = n[0] - e : n[2] < e ? i = e - n[2] : i = 0, t < n[1] ? r = n[1] - t : n[3] < t ? r = t - n[3] : r = 0, i * i + r * r; +} +function mi(n, e) { + return hg(n, e[0], e[1]); +} +function Mt(n, e) { + return n[0] <= e[0] && e[2] <= n[2] && n[1] <= e[1] && e[3] <= n[3]; +} +function hg(n, e, t) { + return n[0] <= e && e <= n[2] && n[1] <= t && t <= n[3]; +} +function Cu(n, e) { + const t = n[0], i = n[1], r = n[2], s = n[3], o = e[0], a = e[1]; + let l = St.UNKNOWN; + return o < t ? l = l | St.LEFT : o > r && (l = l | St.RIGHT), a < i ? l = l | St.BELOW : a > s && (l = l | St.ABOVE), l === St.UNKNOWN && (l = St.INTERSECTING), l; +} +function Ft() { + return [1 / 0, 1 / 0, -1 / 0, -1 / 0]; +} +function Pi(n, e, t, i, r) { + return r ? (r[0] = n, r[1] = e, r[2] = t, r[3] = i, r) : [n, e, t, i]; +} +function wr(n) { + return Pi(1 / 0, 1 / 0, -1 / 0, -1 / 0, n); +} +function Xs(n, e) { + const t = n[0], i = n[1]; + return Pi(t, i, t, i, e); +} +function lO(n, e) { + const t = wr(e); + return Rp(t, n); +} +function ug(n, e, t, i, r) { + const s = wr(r); + return Tp(s, n, e, t, i); +} +function AO(n, e) { + const t = wr(e); + return ry(t, n); +} +function Ci(n, e) { + return n[0] == e[0] && n[2] == e[2] && n[1] == e[1] && n[3] == e[3]; +} +function ny(n, e, t) { + return Math.abs(n[0] - e[0]) < t && Math.abs(n[2] - e[2]) < t && Math.abs(n[1] - e[1]) < t && Math.abs(n[3] - e[3]) < t; +} +function Sp(n, e) { + return e[0] < n[0] && (n[0] = e[0]), e[2] > n[2] && (n[2] = e[2]), e[1] < n[1] && (n[1] = e[1]), e[3] > n[3] && (n[3] = e[3]), n; +} +function qs(n, e) { + e[0] < n[0] && (n[0] = e[0]), e[0] > n[2] && (n[2] = e[0]), e[1] < n[1] && (n[1] = e[1]), e[1] > n[3] && (n[3] = e[1]); +} +function Rp(n, e) { + for (let t = 0, i = e.length; t < i; ++t) + qs(n, e[t]); + return n; +} +function Tp(n, e, t, i, r) { + for (; t < i; t += r) + sy(n, e[t], e[t + 1]); + return n; +} +function ry(n, e) { + for (let t = 0, i = e.length; t < i; ++t) + Rp(n, e[t]); + return n; +} +function sy(n, e, t) { + n[0] = Math.min(n[0], e), n[1] = Math.min(n[1], t), n[2] = Math.max(n[2], e), n[3] = Math.max(n[3], t); +} +function gg(n, e) { + let t; + return t = e(Hr(n)), t || (t = e(To(n)), t) || (t = e(vo(n)), t) || (t = e(Ki(n)), t) ? t : !1; +} +function Vr(n) { + let e = 0; + return wn(n) || (e = he(n) * ze(n)), e; +} +function Hr(n) { + return [n[0], n[1]]; +} +function To(n) { + return [n[2], n[1]]; +} +function Dt(n) { + return [(n[0] + n[2]) / 2, (n[1] + n[3]) / 2]; +} +function oy(n, e) { + let t; + if (e === "bottom-left") + t = Hr(n); + else if (e === "bottom-right") + t = To(n); + else if (e === "top-left") + t = Ki(n); + else if (e === "top-right") + t = vo(n); + else + throw new Error("Invalid corner"); + return t; +} +function cO(n, e) { + const t = Math.min(n[0], e[0]), i = Math.min(n[1], e[1]), r = Math.max(n[2], e[2]), s = Math.max(n[3], e[3]); + return (r - t) * (s - i); +} +function va(n, e, t, i, r) { + const [s, o, a, l, A, c, h, u] = ay( + n, + e, + t, + i + ); + return Pi( + Math.min(s, a, A, h), + Math.min(o, l, c, u), + Math.max(s, a, A, h), + Math.max(o, l, c, u), + r + ); +} +function ay(n, e, t, i) { + const r = e * i[0] / 2, s = e * i[1] / 2, o = Math.cos(t), a = Math.sin(t), l = r * o, A = r * a, c = s * o, h = s * a, u = n[0], g = n[1]; + return [ + u - l + h, + g - A - c, + u - l - h, + g - A + c, + u + l - h, + g + A + c, + u + l + h, + g + A - c, + u - l + h, + g - A - c + ]; +} +function ze(n) { + return n[3] - n[1]; +} +function hO(n, e) { + const t = tt(n, e); + return Vr(t); +} +function tt(n, e, t) { + const i = t || Ft(); + return He(n, e) ? (n[0] > e[0] ? i[0] = n[0] : i[0] = e[0], n[1] > e[1] ? i[1] = n[1] : i[1] = e[1], n[2] < e[2] ? i[2] = n[2] : i[2] = e[2], n[3] < e[3] ? i[3] = n[3] : i[3] = e[3]) : wr(i), i; +} +function uO(n) { + return he(n) + ze(n); +} +function gO(n) { + return [n[2] - n[0], n[3] - n[1]]; +} +function Ki(n) { + return [n[0], n[3]]; +} +function vo(n) { + return [n[2], n[3]]; +} +function he(n) { + return n[2] - n[0]; +} +function He(n, e) { + return n[0] <= e[2] && n[2] >= e[0] && n[1] <= e[3] && n[3] >= e[1]; +} +function wn(n) { + return n[2] < n[0] || n[3] < n[1]; +} +function ly(n, e) { + return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n; +} +function dg(n, e) { + const t = (n[2] - n[0]) / 2 * (e - 1), i = (n[3] - n[1]) / 2 * (e - 1); + n[0] -= t, n[2] += t, n[1] -= i, n[3] += i; +} +function Ay(n, e, t) { + let i = !1; + const r = Cu(n, e), s = Cu(n, t); + if (r === St.INTERSECTING || s === St.INTERSECTING) + i = !0; + else { + const o = n[0], a = n[1], l = n[2], A = n[3], c = e[0], h = e[1], u = t[0], g = t[1], d = (g - h) / (u - c); + let m, f; + s & St.ABOVE && !(r & St.ABOVE) && (m = u - (g - A) / d, i = m >= o && m <= l), !i && s & St.RIGHT && !(r & St.RIGHT) && (f = g - (u - l) * d, i = f >= a && f <= A), !i && s & St.BELOW && !(r & St.BELOW) && (m = u - (g - a) / d, i = m >= o && m <= l), !i && s & St.LEFT && !(r & St.LEFT) && (f = g - (u - o) * d, i = f >= a && f <= A); + } + return i; +} +function oo(n, e, t, i) { + if (wn(n)) + return wr(t); + let r = []; + if (i > 1) { + const a = n[2] - n[0], l = n[3] - n[1]; + for (let A = 0; A < i; ++A) + r.push( + n[0] + a * A / i, + n[1], + n[2], + n[1] + l * A / i, + n[2] - a * A / i, + n[3], + n[0], + n[3] - l * A / i + ); + } else + r = [ + n[0], + n[1], + n[2], + n[1], + n[2], + n[3], + n[0], + n[3] + ]; + e(r, r, 2); + const s = [], o = []; + for (let a = 0, l = r.length; a < l; a += 2) + s.push(r[a]), o.push(r[a + 1]); + return iy(s, o, t); +} +function fg(n, e) { + const t = e.getExtent(), i = Dt(n); + if (e.canWrapX() && (i[0] < t[0] || i[0] >= t[2])) { + const r = he(t), o = Math.floor( + (i[0] - t[0]) / r + ) * r; + n[0] -= o, n[2] -= o; + } + return n; +} +function mg(n, e, t) { + if (e.canWrapX()) { + const i = e.getExtent(); + if (!isFinite(n[0]) || !isFinite(n[2])) + return [[i[0], n[1], i[2], n[3]]]; + fg(n, e); + const r = he(i); + if (he(n) > r && !t) + return [[i[0], n[1], i[2], n[3]]]; + if (n[0] < i[0]) + return [ + [n[0] + r, n[1], i[2], n[3]], + [i[0], n[1], n[2], n[3]] + ]; + if (n[2] > i[2]) + return [ + [n[0], n[1], i[2], n[3]], + [i[0], n[1], n[2] - r, n[3]] + ]; + } + return [n]; +} +const cy = { + 9001: "m", + 9002: "ft", + 9003: "us-ft", + 9101: "radians", + 9102: "degrees" +}; +function yf(n) { + return cy[n]; +} +const ao = { + // use the radius of the Normal sphere + radians: 6370997 / (2 * Math.PI), + degrees: 2 * Math.PI * 6370997 / 360, + ft: 0.3048, + m: 1, + "us-ft": 1200 / 3937 +}; +class lo { + /** + * @param {Options} options Projection options. + */ + constructor(e) { + this.code_ = e.code, this.units_ = /** @type {import("./Units.js").Units} */ + e.units, this.extent_ = e.extent !== void 0 ? e.extent : null, this.worldExtent_ = e.worldExtent !== void 0 ? e.worldExtent : null, this.axisOrientation_ = e.axisOrientation !== void 0 ? e.axisOrientation : "enu", this.global_ = e.global !== void 0 ? e.global : !1, this.canWrapX_ = !!(this.global_ && this.extent_), this.getPointResolutionFunc_ = e.getPointResolution, this.defaultTileGrid_ = null, this.metersPerUnit_ = e.metersPerUnit; + } + /** + * @return {boolean} The projection is suitable for wrapping the x-axis + */ + canWrapX() { + return this.canWrapX_; + } + /** + * Get the code for this projection, e.g. 'EPSG:4326'. + * @return {string} Code. + * @api + */ + getCode() { + return this.code_; + } + /** + * Get the validity extent for this projection. + * @return {import("../extent.js").Extent} Extent. + * @api + */ + getExtent() { + return this.extent_; + } + /** + * Get the units of this projection. + * @return {import("./Units.js").Units} Units. + * @api + */ + getUnits() { + return this.units_; + } + /** + * Get the amount of meters per unit of this projection. If the projection is + * not configured with `metersPerUnit` or a units identifier, the return is + * `undefined`. + * @return {number|undefined} Meters. + * @api + */ + getMetersPerUnit() { + return this.metersPerUnit_ || ao[this.units_]; + } + /** + * Get the world extent for this projection. + * @return {import("../extent.js").Extent} Extent. + * @api + */ + getWorldExtent() { + return this.worldExtent_; + } + /** + * Get the axis orientation of this projection. + * Example values are: + * enu - the default easting, northing, elevation. + * neu - northing, easting, up - useful for "lat/long" geographic coordinates, + * or south orientated transverse mercator. + * wnu - westing, northing, up - some planetary coordinate systems have + * "west positive" coordinate systems + * @return {string} Axis orientation. + * @api + */ + getAxisOrientation() { + return this.axisOrientation_; + } + /** + * Is this projection a global projection which spans the whole world? + * @return {boolean} Whether the projection is global. + * @api + */ + isGlobal() { + return this.global_; + } + /** + * Set if the projection is a global projection which spans the whole world + * @param {boolean} global Whether the projection is global. + * @api + */ + setGlobal(e) { + this.global_ = e, this.canWrapX_ = !!(e && this.extent_); + } + /** + * @return {import("../tilegrid/TileGrid.js").default} The default tile grid. + */ + getDefaultTileGrid() { + return this.defaultTileGrid_; + } + /** + * @param {import("../tilegrid/TileGrid.js").default} tileGrid The default tile grid. + */ + setDefaultTileGrid(e) { + this.defaultTileGrid_ = e; + } + /** + * Set the validity extent for this projection. + * @param {import("../extent.js").Extent} extent Extent. + * @api + */ + setExtent(e) { + this.extent_ = e, this.canWrapX_ = !!(this.global_ && e); + } + /** + * Set the world extent for this projection. + * @param {import("../extent.js").Extent} worldExtent World extent + * [minlon, minlat, maxlon, maxlat]. + * @api + */ + setWorldExtent(e) { + this.worldExtent_ = e; + } + /** + * Set the getPointResolution function (see {@link module:ol/proj.getPointResolution} + * for this projection. + * @param {function(number, import("../coordinate.js").Coordinate):number} func Function + * @api + */ + setGetPointResolution(e) { + this.getPointResolutionFunc_ = e; + } + /** + * Get the custom point resolution function for this projection (if set). + * @return {function(number, import("../coordinate.js").Coordinate):number|undefined} The custom point + * resolution function (if set). + */ + getPointResolutionFunc() { + return this.getPointResolutionFunc_; + } +} +const al = 6378137, Gs = Math.PI * al, hy = [-Gs, -Gs, Gs, Gs], uy = [-180, -85, 180, 85], bl = al * Math.log(Math.tan(Math.PI / 2)); +class _s extends lo { + /** + * @param {string} code Code. + */ + constructor(e) { + super({ + code: e, + units: "m", + extent: hy, + global: !0, + worldExtent: uy, + getPointResolution: function(t, i) { + return t / Math.cosh(i[1] / al); + } + }); + } +} +const wf = [ + new _s("EPSG:3857"), + new _s("EPSG:102100"), + new _s("EPSG:102113"), + new _s("EPSG:900913"), + new _s("http://www.opengis.net/def/crs/EPSG/0/3857"), + new _s("http://www.opengis.net/gml/srs/epsg.xml#3857") +]; +function gy(n, e, t, i) { + const r = n.length; + t = t > 1 ? t : 2, i = i ?? t, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(r)); + for (let s = 0; s < r; s += i) { + e[s] = Gs * n[s] / 180; + let o = al * Math.log(Math.tan(Math.PI * (+n[s + 1] + 90) / 360)); + o > bl ? o = bl : o < -bl && (o = -bl), e[s + 1] = o; + } + return e; +} +function dy(n, e, t, i) { + const r = n.length; + t = t > 1 ? t : 2, i = i ?? t, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(r)); + for (let s = 0; s < r; s += i) + e[s] = 180 * n[s] / Gs, e[s + 1] = 360 * Math.atan(Math.exp(n[s + 1] / al)) / Math.PI - 90; + return e; +} +const fy = 6378137, xf = [-180, -90, 180, 90], my = Math.PI * fy / 180; +class vr extends lo { + /** + * @param {string} code Code. + * @param {string} [axisOrientation] Axis orientation. + */ + constructor(e, t) { + super({ + code: e, + units: "degrees", + extent: xf, + axisOrientation: t, + global: !0, + metersPerUnit: my, + worldExtent: xf + }); + } +} +const Bf = [ + new vr("CRS:84"), + new vr("EPSG:4326", "neu"), + new vr("urn:ogc:def:crs:OGC:1.3:CRS84"), + new vr("urn:ogc:def:crs:OGC:2:84"), + new vr("http://www.opengis.net/def/crs/OGC/1.3/CRS84"), + new vr("http://www.opengis.net/gml/srs/epsg.xml#4326", "neu"), + new vr("http://www.opengis.net/def/crs/EPSG/0/4326", "neu") +]; +let RA = {}; +function Ey() { + RA = {}; +} +function py(n) { + return RA[n] || RA[n.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\w+)$/, "EPSG:$3")] || null; +} +function _y(n, e) { + RA[n] = e; +} +let zi = {}; +function Iy() { + zi = {}; +} +function Ao(n, e, t) { + const i = n.getCode(), r = e.getCode(); + i in zi || (zi[i] = {}), zi[i][r] = t; +} +function dO(n, e) { + const t = n.getCode(), i = e.getCode(), r = zi[t][i]; + return delete zi[t][i], Hi(zi[t]) && delete zi[t], r; +} +function vp(n, e) { + let t; + return n in zi && e in zi[n] && (t = zi[n][e]), t; +} +function ue(n, e, t) { + return Math.min(Math.max(n, e), t); +} +function Qp(n, e, t, i, r, s) { + const o = r - t, a = s - i; + if (o !== 0 || a !== 0) { + const l = ((n - t) * o + (e - i) * a) / (o * o + a * a); + l > 1 ? (t = r, i = s) : l > 0 && (t += o * l, i += a * l); + } + return dn(n, e, t, i); +} +function dn(n, e, t, i) { + const r = t - n, s = i - e; + return r * r + s * s; +} +function Cy(n) { + const e = n.length; + for (let i = 0; i < e; i++) { + let r = i, s = Math.abs(n[i][i]); + for (let a = i + 1; a < e; a++) { + const l = Math.abs(n[a][i]); + l > s && (s = l, r = a); + } + if (s === 0) + return null; + const o = n[r]; + n[r] = n[i], n[i] = o; + for (let a = i + 1; a < e; a++) { + const l = -n[a][i] / n[i][i]; + for (let A = i; A < e + 1; A++) + i == A ? n[a][A] = 0 : n[a][A] += l * n[i][A]; + } + } + const t = new Array(e); + for (let i = e - 1; i >= 0; i--) { + t[i] = n[i][e] / n[i][i]; + for (let r = i - 1; r >= 0; r--) + n[r][e] -= n[r][i] * t[i]; + } + return t; +} +function TA(n) { + return n * 180 / Math.PI; +} +function Tt(n) { + return n * Math.PI / 180; +} +function Li(n, e) { + const t = n % e; + return t * e < 0 ? t + e : t; +} +function di(n, e, t) { + return n + t * (e - n); +} +function os(n, e) { + const t = Math.pow(10, e); + return Math.round(n * t) / t; +} +function vA(n, e) { + return Math.round(os(n, e)); +} +function ks(n, e) { + return Math.floor(os(n, e)); +} +function lr(n, e) { + return Math.ceil(os(n, e)); +} +function Fr(n, e, t) { + const i = t !== void 0 ? n.toFixed(t) : "" + n; + let r = i.indexOf("."); + return r = r === -1 ? i.length : r, r > e ? i : new Array(1 + e - r).join("0") + i; +} +function gc(n, e) { + const t = ("" + n).split("."), i = ("" + e).split("."); + for (let r = 0; r < Math.max(t.length, i.length); r++) { + const s = parseInt(t[r] || "0", 10), o = parseInt(i[r] || "0", 10); + if (s > o) + return 1; + if (o > s) + return -1; + } + return 0; +} +function Dp(n, e) { + return n[0] += +e[0], n[1] += +e[1], n; +} +function yy(n, e) { + const t = e.getRadius(), i = e.getCenter(), r = i[0], s = i[1], o = n[0], a = n[1]; + let l = o - r; + const A = a - s; + l === 0 && A === 0 && (l = 1); + const c = Math.sqrt(l * l + A * A), h = r + t * l / c, u = s + t * A / c; + return [h, u]; +} +function dc(n, e) { + const t = n[0], i = n[1], r = e[0], s = e[1], o = r[0], a = r[1], l = s[0], A = s[1], c = l - o, h = A - a, u = c === 0 && h === 0 ? 0 : (c * (t - o) + h * (i - a)) / (c * c + h * h || 0); + let g, d; + return u <= 0 ? (g = o, d = a) : u >= 1 ? (g = l, d = A) : (g = o + u * c, d = a + u * h), [g, d]; +} +function fO(n) { + return ( + /** + * @param {Coordinate} coordinate Coordinate. + * @return {string} String XY. + */ + function(e) { + return xy(e, n); + } + ); +} +function QA(n, e, t) { + const i = Li(e + 180, 360) - 180, r = Math.abs(3600 * i), s = t || 0; + let o = Math.floor(r / 3600), a = Math.floor((r - o * 3600) / 60), l = os(r - o * 3600 - a * 60, s); + l >= 60 && (l = 0, a += 1), a >= 60 && (a = 0, o += 1); + let A = o + "°"; + return (a !== 0 || l !== 0) && (A += " " + Fr(a, 2) + "′"), l !== 0 && (A += " " + Fr(l, 2, s) + "″"), i !== 0 && (A += " " + n.charAt(i < 0 ? 1 : 0)), A; +} +function wy(n, e, t) { + return n ? e.replace("{x}", n[0].toFixed(t)).replace("{y}", n[1].toFixed(t)) : ""; +} +function $i(n, e) { + let t = !0; + for (let i = n.length - 1; i >= 0; --i) + if (n[i] != e[i]) { + t = !1; + break; + } + return t; +} +function Eg(n, e) { + const t = Math.cos(e), i = Math.sin(e), r = n[0] * t - n[1] * i, s = n[1] * t + n[0] * i; + return n[0] = r, n[1] = s, n; +} +function Lp(n, e) { + return n[0] *= e, n[1] *= e, n; +} +function Fi(n, e) { + const t = n[0] - e[0], i = n[1] - e[1]; + return t * t + i * i; +} +function Qa(n, e) { + return Math.sqrt(Fi(n, e)); +} +function yu(n, e) { + return Fi(n, dc(n, e)); +} +function mO(n, e) { + return n ? QA("NS", n[1], e) + " " + QA("EW", n[0], e) : ""; +} +function xy(n, e) { + return wy(n, "{x}, {y}", e); +} +function fc(n, e) { + if (e.canWrapX()) { + const t = he(e.getExtent()), i = Fp(n, e, t); + i && (n[0] -= i * t); + } + return n; +} +function Fp(n, e, t) { + const i = e.getExtent(); + let r = 0; + return e.canWrapX() && (n[0] < i[0] || n[0] > i[2]) && (t = t || he(i), r = Math.floor( + (n[0] - i[0]) / t + )), r; +} +const mc = 63710088e-1; +function wu(n, e, t) { + t = t || mc; + const i = Tt(n[1]), r = Tt(e[1]), s = (r - i) / 2, o = Tt(e[0] - n[0]) / 2, a = Math.sin(s) * Math.sin(s) + Math.sin(o) * Math.sin(o) * Math.cos(i) * Math.cos(r); + return 2 * t * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); +} +function Ah(n, e) { + let t = 0; + for (let i = 0, r = n.length; i < r - 1; ++i) + t += wu(n[i], n[i + 1], e); + return t; +} +function By(n, e) { + e = e || {}; + const t = e.radius || mc, i = e.projection || "EPSG:3857", r = n.getType(); + r !== "GeometryCollection" && (n = n.clone().transform(i, "EPSG:4326")); + let s = 0, o, a, l, A, c, h; + switch (r) { + case "Point": + case "MultiPoint": + break; + case "LineString": + case "LinearRing": { + o = /** @type {import("./geom/SimpleGeometry.js").default} */ + n.getCoordinates(), s = Ah(o, t); + break; + } + case "MultiLineString": + case "Polygon": { + for (o = /** @type {import("./geom/SimpleGeometry.js").default} */ + n.getCoordinates(), l = 0, A = o.length; l < A; ++l) + s += Ah(o[l], t); + break; + } + case "MultiPolygon": { + for (o = /** @type {import("./geom/SimpleGeometry.js").default} */ + n.getCoordinates(), l = 0, A = o.length; l < A; ++l) + for (a = o[l], c = 0, h = a.length; c < h; ++c) + s += Ah(a[c], t); + break; + } + case "GeometryCollection": { + const u = ( + /** @type {import("./geom/GeometryCollection.js").default} */ + n.getGeometries() + ); + for (l = 0, A = u.length; l < A; ++l) + s += By(u[l], e); + break; + } + default: + throw new Error("Unsupported geometry type: " + r); + } + return s; +} +function Pl(n, e) { + let t = 0; + const i = n.length; + let r = n[i - 1][0], s = n[i - 1][1]; + for (let o = 0; o < i; o++) { + const a = n[o][0], l = n[o][1]; + t += Tt(a - r) * (2 + Math.sin(Tt(s)) + Math.sin(Tt(l))), r = a, s = l; + } + return t * e * e / 2; +} +function Sy(n, e) { + e = e || {}; + const t = e.radius || mc, i = e.projection || "EPSG:3857", r = n.getType(); + r !== "GeometryCollection" && (n = n.clone().transform(i, "EPSG:4326")); + let s = 0, o, a, l, A, c, h; + switch (r) { + case "Point": + case "MultiPoint": + case "LineString": + case "MultiLineString": + case "LinearRing": + break; + case "Polygon": { + for (o = /** @type {import("./geom/Polygon.js").default} */ + n.getCoordinates(), s = Math.abs(Pl(o[0], t)), l = 1, A = o.length; l < A; ++l) + s -= Math.abs(Pl(o[l], t)); + break; + } + case "MultiPolygon": { + for (o = /** @type {import("./geom/SimpleGeometry.js").default} */ + n.getCoordinates(), l = 0, A = o.length; l < A; ++l) + for (a = o[l], s += Math.abs(Pl(a[0], t)), c = 1, h = a.length; c < h; ++c) + s -= Math.abs(Pl(a[c], t)); + break; + } + case "GeometryCollection": { + const u = ( + /** @type {import("./geom/GeometryCollection.js").default} */ + n.getGeometries() + ); + for (l = 0, A = u.length; l < A; ++l) + s += Sy(u[l], e); + break; + } + default: + throw new Error("Unsupported geometry type: " + r); + } + return s; +} +function Ry(n, e, t, i) { + i = i || mc; + const r = Tt(n[1]), s = Tt(n[0]), o = e / i, a = Math.asin( + Math.sin(r) * Math.cos(o) + Math.cos(r) * Math.sin(o) * Math.cos(t) + ), l = s + Math.atan2( + Math.sin(t) * Math.sin(o) * Math.cos(r), + Math.cos(o) - Math.sin(r) * Math.sin(a) + ); + return [TA(l), TA(a)]; +} +const ll = { + info: 1, + warn: 2, + error: 3, + none: 4 +}; +let Ec = ll.info; +function EO(n) { + Ec = ll[n]; +} +function pO(...n) { + Ec > ll.info || console.log(...n); +} +function bp(...n) { + Ec > ll.warn || console.warn(...n); +} +function Da(...n) { + Ec > ll.error || console.error(...n); +} +let xu = !0; +function Pp(n) { + xu = !(n === void 0 ? !0 : n); +} +function pg(n, e) { + if (e !== void 0) { + for (let t = 0, i = n.length; t < i; ++t) + e[t] = n[t]; + e = e; + } else + e = n.slice(); + return e; +} +function pc(n, e) { + if (e !== void 0 && n !== e) { + for (let t = 0, i = n.length; t < i; ++t) + e[t] = n[t]; + n = e; + } + return n; +} +function Mp(n) { + _y(n.getCode(), n), Ao(n, n, pg); +} +function Ty(n) { + n.forEach(Mp); +} +function q(n) { + return typeof n == "string" ? py( + /** @type {string} */ + n + ) : ( + /** @type {Projection} */ + n || null + ); +} +function DA(n, e, t, i) { + n = q(n); + let r; + const s = n.getPointResolutionFunc(); + if (s) { + if (r = s(e, t), i && i !== n.getUnits()) { + const o = n.getMetersPerUnit(); + o && (r = r * o / ao[i]); + } + } else { + const o = n.getUnits(); + if (o == "degrees" && !i || i == "degrees") + r = e; + else { + const a = li( + n, + q("EPSG:4326") + ); + if (a === pc && o !== "degrees") + r = e * n.getMetersPerUnit(); + else { + let A = [ + t[0] - e / 2, + t[1], + t[0] + e / 2, + t[1], + t[0], + t[1] - e / 2, + t[0], + t[1] + e / 2 + ]; + A = a(A, A, 2); + const c = wu(A.slice(0, 2), A.slice(2, 4)), h = wu(A.slice(4, 6), A.slice(6, 8)); + r = (c + h) / 2; + } + const l = i ? ao[i] : n.getMetersPerUnit(); + l !== void 0 && (r /= l); + } + } + return r; +} +function Bu(n) { + Ty(n), n.forEach(function(e) { + n.forEach(function(t) { + e !== t && Ao(e, t, pg); + }); + }); +} +function vy(n, e, t, i) { + n.forEach(function(r) { + e.forEach(function(s) { + Ao(r, s, t), Ao(s, r, i); + }); + }); +} +function _O() { + Ey(), Iy(); +} +function _g(n, e) { + return n ? typeof n == "string" ? q(n) : ( + /** @type {Projection} */ + n + ) : q(e); +} +function Sf(n) { + return ( + /** + * @param {Array} input Input. + * @param {Array} [output] Output. + * @param {number} [dimension] Dimensions that should be transformed. + * @param {number} [stride] Stride. + * @return {Array} Output. + */ + function(e, t, i, r) { + const s = e.length; + i = i !== void 0 ? i : 2, r = r ?? i, t = t !== void 0 ? t : new Array(s); + for (let o = 0; o < s; o += r) { + const a = n(e.slice(o, o + i)), l = a.length; + for (let A = 0, c = r; A < c; ++A) + t[o + A] = A >= l ? e[o + A] : a[A]; + } + return t; + } + ); +} +function Qy(n, e, t, i) { + const r = q(n), s = q(e); + Ao( + r, + s, + Sf(t) + ), Ao( + s, + r, + Sf(i) + ); +} +function IO(n, e) { + return Pp(), as( + n, + "EPSG:4326", + e !== void 0 ? e : "EPSG:3857" + ); +} +function Rf(n, e) { + const t = as( + n, + e !== void 0 ? e : "EPSG:3857", + "EPSG:4326" + ), i = t[0]; + return (i < -180 || i > 180) && (t[0] = Li(i + 180, 360) - 180), t; +} +function _i(n, e) { + if (n === e) + return !0; + const t = n.getUnits() === e.getUnits(); + return (n.getCode() === e.getCode() || li(n, e) === pg) && t; +} +function li(n, e) { + const t = n.getCode(), i = e.getCode(); + let r = vp(t, i); + return r || (r = pc), r; +} +function Xi(n, e) { + const t = q(n), i = q(e); + return li(t, i); +} +function as(n, e, t) { + return Xi(e, t)(n, void 0, n.length); +} +function _c(n, e, t, i) { + const r = Xi(e, t); + return oo(n, r, void 0, i); +} +function CO(n, e, t) { + return li( + e, + t + )(n); +} +let qt = null; +function Dy(n) { + qt = q(n); +} +function yO() { + qt = null; +} +function gt() { + return qt; +} +function wO() { + Dy("EPSG:4326"); +} +function pr(n, e) { + return qt ? as(n, e, qt) : n; +} +function Ue(n, e) { + return qt ? as(n, qt, e) : (xu && !$i(n, [0, 0]) && n[0] >= -180 && n[0] <= 180 && n[1] >= -90 && n[1] <= 90 && (xu = !1, bp( + "Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates." + )), n); +} +function pn(n, e) { + return qt ? _c(n, e, qt) : n; +} +function Vt(n, e) { + return qt ? _c(n, qt, e) : n; +} +function Np(n, e) { + if (!qt) + return n; + const t = q(e).getMetersPerUnit(), i = qt.getMetersPerUnit(); + return t && i ? n * t / i : n; +} +function Ly(n, e) { + if (!qt) + return n; + const t = q(e).getMetersPerUnit(), i = qt.getMetersPerUnit(); + return t && i ? n * i / t : n; +} +function Tf(n, e, t) { + return function(i) { + let r, s; + if (n.canWrapX()) { + const o = n.getExtent(), a = he(o); + i = i.slice(0), s = Fp(i, n, a), s && (i[0] = i[0] - s * a), i[0] = ue(i[0], o[0], o[2]), i[1] = ue(i[1], o[1], o[3]), r = t(i); + } else + r = t(i); + return s && e.canWrapX() && (r[0] += s * he(e.getExtent())), r; + }; +} +function Fy() { + Bu(wf), Bu(Bf), vy( + Bf, + wf, + gy, + dy + ); +} +Fy(); +function fn(n, e, t, i, r, s, o) { + s = s || [], o = o || 2; + let a = 0; + for (let l = e; l < t; l += i) { + const A = n[l], c = n[l + 1]; + s[a++] = r[0] * A + r[2] * c + r[4], s[a++] = r[1] * A + r[3] * c + r[5]; + for (let h = 2; h < o; h++) + s[a++] = n[l + h]; + } + return s && s.length != a && (s.length = a), s; +} +function Ig(n, e, t, i, r, s, o) { + o = o || []; + const a = Math.cos(r), l = Math.sin(r), A = s[0], c = s[1]; + let h = 0; + for (let u = e; u < t; u += i) { + const g = n[u] - A, d = n[u + 1] - c; + o[h++] = A + g * a - d * l, o[h++] = c + g * l + d * a; + for (let m = u + 2; m < u + i; ++m) + o[h++] = n[m]; + } + return o && o.length != h && (o.length = h), o; +} +function by(n, e, t, i, r, s, o, a) { + a = a || []; + const l = o[0], A = o[1]; + let c = 0; + for (let h = e; h < t; h += i) { + const u = n[h] - l, g = n[h + 1] - A; + a[c++] = l + r * u, a[c++] = A + s * g; + for (let d = h + 2; d < h + i; ++d) + a[c++] = n[d]; + } + return a && a.length != c && (a.length = c), a; +} +function Py(n, e, t, i, r, s, o) { + o = o || []; + let a = 0; + for (let l = e; l < t; l += i) { + o[a++] = n[l] + r, o[a++] = n[l + 1] + s; + for (let A = l + 2; A < l + i; ++A) + o[a++] = n[A]; + } + return o && o.length != a && (o.length = a), o; +} +const vf = Fe(); +class Cg extends Oi { + constructor() { + super(), this.extent_ = Ft(), this.extentRevision_ = -1, this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = 0, this.simplifyTransformedInternal = _p( + (e, t, i) => { + if (!i) + return this.getSimplifiedGeometry(t); + const r = this.clone(); + return r.applyTransform(i), r.getSimplifiedGeometry(t); + } + ); + } + /** + * Get a transformed and simplified version of the geometry. + * @abstract + * @param {number} squaredTolerance Squared tolerance. + * @param {import("../proj.js").TransformFunction} [transform] Optional transform function. + * @return {Geometry} Simplified geometry. + */ + simplifyTransformed(e, t) { + return this.simplifyTransformedInternal( + this.getRevision(), + e, + t + ); + } + /** + * Make a complete copy of the geometry. + * @abstract + * @return {!Geometry} Clone. + */ + clone() { + return ae(); + } + /** + * @abstract + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + */ + closestPointXY(e, t, i, r) { + return ae(); + } + /** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ + containsXY(e, t) { + const i = this.getClosestPoint([e, t]); + return i[0] === e && i[1] === t; + } + /** + * Return the closest point of the geometry to the passed point as + * {@link module:ol/coordinate~Coordinate coordinate}. + * @param {import("../coordinate.js").Coordinate} point Point. + * @param {import("../coordinate.js").Coordinate} [closestPoint] Closest point. + * @return {import("../coordinate.js").Coordinate} Closest point. + * @api + */ + getClosestPoint(e, t) { + return t = t || [NaN, NaN], this.closestPointXY(e[0], e[1], t, 1 / 0), t; + } + /** + * Returns true if this geometry includes the specified coordinate. If the + * coordinate is on the boundary of the geometry, returns false. + * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. + * @return {boolean} Contains coordinate. + * @api + */ + intersectsCoordinate(e) { + return this.containsXY(e[0], e[1]); + } + /** + * @abstract + * @param {import("../extent.js").Extent} extent Extent. + * @protected + * @return {import("../extent.js").Extent} extent Extent. + */ + computeExtent(e) { + return ae(); + } + /** + * Get the extent of the geometry. + * @param {import("../extent.js").Extent} [extent] Extent. + * @return {import("../extent.js").Extent} extent Extent. + * @api + */ + getExtent(e) { + if (this.extentRevision_ != this.getRevision()) { + const t = this.computeExtent(this.extent_); + (isNaN(t[0]) || isNaN(t[1])) && wr(t), this.extentRevision_ = this.getRevision(); + } + return ly(this.extent_, e); + } + /** + * Rotate the geometry around a given coordinate. This modifies the geometry + * coordinates in place. + * @abstract + * @param {number} angle Rotation angle in radians. + * @param {import("../coordinate.js").Coordinate} anchor The rotation center. + * @api + */ + rotate(e, t) { + ae(); + } + /** + * Scale the geometry (with an optional origin). This modifies the geometry + * coordinates in place. + * @abstract + * @param {number} sx The scaling factor in the x-direction. + * @param {number} [sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [anchor] The scale origin (defaults to the center + * of the geometry extent). + * @api + */ + scale(e, t, i) { + ae(); + } + /** + * Create a simplified version of this geometry. For linestrings, this uses + * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm) + * algorithm. For polygons, a quantization-based + * simplification is used to preserve topology. + * @param {number} tolerance The tolerance distance for simplification. + * @return {Geometry} A new, simplified version of the original geometry. + * @api + */ + simplify(e) { + return this.getSimplifiedGeometry(e * e); + } + /** + * Create a simplified version of this geometry using the Douglas Peucker + * algorithm. + * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm. + * @abstract + * @param {number} squaredTolerance Squared tolerance. + * @return {Geometry} Simplified geometry. + */ + getSimplifiedGeometry(e) { + return ae(); + } + /** + * Get the type of this geometry. + * @abstract + * @return {Type} Geometry type. + */ + getType() { + return ae(); + } + /** + * Apply a transform function to the coordinates of the geometry. + * The geometry is modified in place. + * If you do not want the geometry modified in place, first `clone()` it and + * then use this function on the clone. + * @abstract + * @param {import("../proj.js").TransformFunction} transformFn Transform function. + * Called with a flat array of geometry coordinates. + */ + applyTransform(e) { + ae(); + } + /** + * Test if the geometry and the passed extent intersect. + * @abstract + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + */ + intersectsExtent(e) { + return ae(); + } + /** + * Translate the geometry. This modifies the geometry coordinates in place. If + * instead you want a new geometry, first `clone()` this geometry. + * @abstract + * @param {number} deltaX Delta X. + * @param {number} deltaY Delta Y. + * @api + */ + translate(e, t) { + ae(); + } + /** + * Transform each coordinate of the geometry from one coordinate reference + * system to another. The geometry is modified in place. + * For example, a line will be transformed to a line and a circle to a circle. + * If you do not want the geometry modified in place, first `clone()` it and + * then use this function on the clone. + * + * @param {import("../proj.js").ProjectionLike} source The current projection. Can be a + * string identifier or a {@link module:ol/proj/Projection~Projection} object. + * @param {import("../proj.js").ProjectionLike} destination The desired projection. Can be a + * string identifier or a {@link module:ol/proj/Projection~Projection} object. + * @return {this} This geometry. Note that original geometry is + * modified in place. + * @api + */ + transform(e, t) { + const i = q(e), r = i.getUnits() == "tile-pixels" ? function(s, o, a) { + const l = i.getExtent(), A = i.getWorldExtent(), c = ze(A) / ze(l); + return ai( + vf, + A[0], + A[3], + c, + -c, + 0, + 0, + 0 + ), fn( + s, + 0, + s.length, + a, + vf, + o + ), Xi(i, t)( + s, + o, + a + ); + } : Xi(i, t); + return this.applyTransform(r), this; + } +} +class _n extends Cg { + constructor() { + super(), this.layout = "XY", this.stride = 2, this.flatCoordinates; + } + /** + * @param {import("../extent.js").Extent} extent Extent. + * @protected + * @return {import("../extent.js").Extent} extent Extent. + * @override + */ + computeExtent(e) { + return ug( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e + ); + } + /** + * @abstract + * @return {Array<*> | null} Coordinates. + */ + getCoordinates() { + return ae(); + } + /** + * Return the first coordinate of the geometry. + * @return {import("../coordinate.js").Coordinate} First coordinate. + * @api + */ + getFirstCoordinate() { + return this.flatCoordinates.slice(0, this.stride); + } + /** + * @return {Array} Flat coordinates. + */ + getFlatCoordinates() { + return this.flatCoordinates; + } + /** + * Return the last coordinate of the geometry. + * @return {import("../coordinate.js").Coordinate} Last point. + * @api + */ + getLastCoordinate() { + return this.flatCoordinates.slice( + this.flatCoordinates.length - this.stride + ); + } + /** + * Return the {@link import("./Geometry.js").GeometryLayout layout} of the geometry. + * @return {import("./Geometry.js").GeometryLayout} Layout. + * @api + */ + getLayout() { + return this.layout; + } + /** + * Create a simplified version of this geometry using the Douglas Peucker algorithm. + * @param {number} squaredTolerance Squared tolerance. + * @return {SimpleGeometry} Simplified geometry. + * @override + */ + getSimplifiedGeometry(e) { + if (this.simplifiedGeometryRevision !== this.getRevision() && (this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = this.getRevision()), e < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && e <= this.simplifiedGeometryMaxMinSquaredTolerance) + return this; + const t = this.getSimplifiedGeometryInternal(e); + return t.getFlatCoordinates().length < this.flatCoordinates.length ? t : (this.simplifiedGeometryMaxMinSquaredTolerance = e, this); + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {SimpleGeometry} Simplified geometry. + * @protected + */ + getSimplifiedGeometryInternal(e) { + return this; + } + /** + * @return {number} Stride. + */ + getStride() { + return this.stride; + } + /** + * @param {import("./Geometry.js").GeometryLayout} layout Layout. + * @param {Array} flatCoordinates Flat coordinates. + */ + setFlatCoordinates(e, t) { + this.stride = La(e), this.layout = e, this.flatCoordinates = t; + } + /** + * @abstract + * @param {!Array<*>} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + setCoordinates(e, t) { + ae(); + } + /** + * @param {import("./Geometry.js").GeometryLayout|undefined} layout Layout. + * @param {Array<*>} coordinates Coordinates. + * @param {number} nesting Nesting. + * @protected + */ + setLayout(e, t, i) { + let r; + if (e) + r = La(e); + else { + for (let s = 0; s < i; ++s) { + if (t.length === 0) { + this.layout = "XY", this.stride = 2; + return; + } + t = /** @type {Array} */ + t[0]; + } + r = t.length, e = ls(r); + } + this.layout = e, this.stride = r; + } + /** + * Apply a transform function to the coordinates of the geometry. + * The geometry is modified in place. + * If you do not want the geometry modified in place, first `clone()` it and + * then use this function on the clone. + * @param {import("../proj.js").TransformFunction} transformFn Transform function. + * Called with a flat array of geometry coordinates. + * @api + * @override + */ + applyTransform(e) { + this.flatCoordinates && (e( + this.flatCoordinates, + this.flatCoordinates, + this.layout.startsWith("XYZ") ? 3 : 2, + this.stride + ), this.changed()); + } + /** + * Rotate the geometry around a given coordinate. This modifies the geometry + * coordinates in place. + * @param {number} angle Rotation angle in counter-clockwise radians. + * @param {import("../coordinate.js").Coordinate} anchor The rotation center. + * @api + * @override + */ + rotate(e, t) { + const i = this.getFlatCoordinates(); + if (i) { + const r = this.getStride(); + Ig( + i, + 0, + i.length, + r, + e, + t, + i + ), this.changed(); + } + } + /** + * Scale the geometry (with an optional origin). This modifies the geometry + * coordinates in place. + * @param {number} sx The scaling factor in the x-direction. + * @param {number} [sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [anchor] The scale origin (defaults to the center + * of the geometry extent). + * @api + * @override + */ + scale(e, t, i) { + t === void 0 && (t = e), i || (i = Dt(this.getExtent())); + const r = this.getFlatCoordinates(); + if (r) { + const s = this.getStride(); + by( + r, + 0, + r.length, + s, + e, + t, + i, + r + ), this.changed(); + } + } + /** + * Translate the geometry. This modifies the geometry coordinates in place. If + * instead you want a new geometry, first `clone()` this geometry. + * @param {number} deltaX Delta X. + * @param {number} deltaY Delta Y. + * @api + * @override + */ + translate(e, t) { + const i = this.getFlatCoordinates(); + if (i) { + const r = this.getStride(); + Py( + i, + 0, + i.length, + r, + e, + t, + i + ), this.changed(); + } + } +} +function ls(n) { + let e; + return n == 2 ? e = "XY" : n == 3 ? e = "XYZ" : n == 4 && (e = "XYZM"), /** @type {import("./Geometry.js").GeometryLayout} */ + e; +} +function La(n) { + let e; + return n == "XY" ? e = 2 : n == "XYZ" || n == "XYM" ? e = 3 : n == "XYZM" && (e = 4), /** @type {number} */ + e; +} +function My(n, e, t) { + const i = n.getFlatCoordinates(); + if (!i) + return null; + const r = n.getStride(); + return fn( + i, + 0, + i.length, + r, + e, + t + ); +} +function Qf(n, e, t, i, r, s, o) { + const a = n[e], l = n[e + 1], A = n[t] - a, c = n[t + 1] - l; + let h; + if (A === 0 && c === 0) + h = e; + else { + const u = ((r - a) * A + (s - l) * c) / (A * A + c * c); + if (u > 1) + h = t; + else if (u > 0) { + for (let g = 0; g < i; ++g) + o[g] = di( + n[e + g], + n[t + g], + u + ); + o.length = i; + return; + } else + h = e; + } + for (let u = 0; u < i; ++u) + o[u] = n[h + u]; + o.length = i; +} +function yg(n, e, t, i, r) { + let s = n[e], o = n[e + 1]; + for (e += i; e < t; e += i) { + const a = n[e], l = n[e + 1], A = dn(s, o, a, l); + A > r && (r = A), s = a, o = l; + } + return r; +} +function wg(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + r = yg(n, e, a, i, r), e = a; + } + return r; +} +function Ny(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + r = wg(n, e, a, i, r), e = a[a.length - 1]; + } + return r; +} +function xg(n, e, t, i, r, s, o, a, l, A, c) { + if (e == t) + return A; + let h, u; + if (r === 0) { + if (u = dn( + o, + a, + n[e], + n[e + 1] + ), u < A) { + for (h = 0; h < i; ++h) + l[h] = n[e + h]; + return l.length = i, u; + } + return A; + } + c = c || [NaN, NaN]; + let g = e + i; + for (; g < t; ) + if (Qf( + n, + g - i, + g, + i, + o, + a, + c + ), u = dn(o, a, c[0], c[1]), u < A) { + for (A = u, h = 0; h < i; ++h) + l[h] = c[h]; + l.length = i, g += i; + } else + g += i * Math.max( + (Math.sqrt(u) - Math.sqrt(A)) / r | 0, + 1 + ); + if (s && (Qf( + n, + t - i, + e, + i, + o, + a, + c + ), u = dn(o, a, c[0], c[1]), u < A)) { + for (A = u, h = 0; h < i; ++h) + l[h] = c[h]; + l.length = i; + } + return A; +} +function Bg(n, e, t, i, r, s, o, a, l, A, c) { + c = c || [NaN, NaN]; + for (let h = 0, u = t.length; h < u; ++h) { + const g = t[h]; + A = xg( + n, + e, + g, + i, + r, + s, + o, + a, + l, + A, + c + ), e = g; + } + return A; +} +function Oy(n, e, t, i, r, s, o, a, l, A, c) { + c = c || [NaN, NaN]; + for (let h = 0, u = t.length; h < u; ++h) { + const g = t[h]; + A = Bg( + n, + e, + g, + i, + r, + s, + o, + a, + l, + A, + c + ), e = g[g.length - 1]; + } + return A; +} +function Op(n, e, t, i) { + for (let r = 0, s = t.length; r < s; ++r) + n[e++] = t[r]; + return e; +} +function Al(n, e, t, i) { + for (let r = 0, s = t.length; r < s; ++r) { + const o = t[r]; + for (let a = 0; a < i; ++a) + n[e++] = o[a]; + } + return e; +} +function cl(n, e, t, i, r) { + r = r || []; + let s = 0; + for (let o = 0, a = t.length; o < a; ++o) { + const l = Al( + n, + e, + t[o], + i + ); + r[s++] = l, e = l; + } + return r.length = s, r; +} +function Gp(n, e, t, i, r) { + r = r || []; + let s = 0; + for (let o = 0, a = t.length; o < a; ++o) { + const l = cl( + n, + e, + t[o], + i, + r[s] + ); + l.length === 0 && (l[0] = e), r[s++] = l, e = l[l.length - 1]; + } + return r.length = s, r; +} +function xO(n, e, t, i, r, s, o) { + return o = o !== void 0 ? o : [], s || (t = Gy( + n, + e, + t, + i, + r, + o, + 0 + ), n = o, e = 0, i = 2), o.length = hl( + n, + e, + t, + i, + r, + o, + 0 + ), o; +} +function hl(n, e, t, i, r, s, o) { + const a = (t - e) / i; + if (a < 3) { + for (; e < t; e += i) + s[o++] = n[e], s[o++] = n[e + 1]; + return o; + } + const l = new Array(a); + l[0] = 1, l[a - 1] = 1; + const A = [e, t - i]; + let c = 0; + for (; A.length > 0; ) { + const h = A.pop(), u = A.pop(); + let g = 0; + const d = n[u], m = n[u + 1], f = n[h], E = n[h + 1]; + for (let p = u + i; p < h; p += i) { + const _ = n[p], I = n[p + 1], y = Qp(_, I, d, m, f, E); + y > g && (c = p, g = y); + } + g > r && (l[(c - e) / i] = 1, u + i < c && A.push(u, c), c + i < h && A.push(c, h)); + } + for (let h = 0; h < a; ++h) + l[h] && (s[o++] = n[e + h * i], s[o++] = n[e + h * i + 1]); + return o; +} +function Sg(n, e, t, i, r, s, o, a) { + for (let l = 0, A = t.length; l < A; ++l) { + const c = t[l]; + o = hl( + n, + e, + c, + i, + r, + s, + o + ), a.push(o), e = c; + } + return o; +} +function BO(n, e, t, i, r, s, o, a) { + for (let l = 0, A = t.length; l < A; ++l) { + const c = t[l], h = []; + o = Sg( + n, + e, + c, + i, + r, + s, + o, + h + ), a.push(h), e = c[c.length - 1]; + } + return o; +} +function Gy(n, e, t, i, r, s, o) { + if (t <= e + i) { + for (; e < t; e += i) + s[o++] = n[e], s[o++] = n[e + 1]; + return o; + } + let a = n[e], l = n[e + 1]; + s[o++] = a, s[o++] = l; + let A = a, c = l; + for (e += i; e < t; e += i) + A = n[e], c = n[e + 1], dn(a, l, A, c) > r && (s[o++] = A, s[o++] = c, a = A, l = c); + return (A != a || c != l) && (s[o++] = A, s[o++] = c), o; +} +function Lr(n, e) { + return e * Math.round(n / e); +} +function ky(n, e, t, i, r, s, o) { + if (e == t) + return o; + let a = Lr(n[e], r), l = Lr(n[e + 1], r); + e += i, s[o++] = a, s[o++] = l; + let A, c; + do + if (A = Lr(n[e], r), c = Lr(n[e + 1], r), e += i, e == t) + return s[o++] = A, s[o++] = c, o; + while (A == a && c == l); + for (; e < t; ) { + const h = Lr(n[e], r), u = Lr(n[e + 1], r); + if (e += i, h == A && u == c) + continue; + const g = A - a, d = c - l, m = h - a, f = u - l; + if (g * f == d * m && (g < 0 && m < g || g == m || g > 0 && m > g) && (d < 0 && f < d || d == f || d > 0 && f > d)) { + A = h, c = u; + continue; + } + s[o++] = A, s[o++] = c, a = A, l = c, A = h, c = u; + } + return s[o++] = A, s[o++] = c, o; +} +function Rg(n, e, t, i, r, s, o, a) { + for (let l = 0, A = t.length; l < A; ++l) { + const c = t[l]; + o = ky( + n, + e, + c, + i, + r, + s, + o + ), a.push(o), e = c; + } + return o; +} +function $y(n, e, t, i, r, s, o, a) { + for (let l = 0, A = t.length; l < A; ++l) { + const c = t[l], h = []; + o = Rg( + n, + e, + c, + i, + r, + s, + o, + h + ), a.push(h), e = c[c.length - 1]; + } + return o; +} +function kn(n, e, t, i, r) { + r = r !== void 0 ? r : []; + let s = 0; + for (let o = e; o < t; o += i) + r[s++] = n.slice(o, o + i); + return r.length = s, r; +} +function Fa(n, e, t, i, r) { + r = r !== void 0 ? r : []; + let s = 0; + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o]; + r[s++] = kn( + n, + e, + l, + i, + r[s] + ), e = l; + } + return r.length = s, r; +} +function Su(n, e, t, i, r) { + r = r !== void 0 ? r : []; + let s = 0; + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o]; + r[s++] = l.length === 1 && l[0] === e ? [] : Fa( + n, + e, + l, + i, + r[s] + ), e = l[l.length - 1]; + } + return r.length = s, r; +} +function Tg(n, e, t, i) { + let r = 0; + const s = n[t - i], o = n[t - i + 1]; + let a = 0, l = 0; + for (; e < t; e += i) { + const A = n[e] - s, c = n[e + 1] - o; + r += l * A - a * c, a = A, l = c; + } + return r / 2; +} +function kp(n, e, t, i) { + let r = 0; + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + r += Tg(n, e, a, i), e = a; + } + return r; +} +function Uy(n, e, t, i) { + let r = 0; + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + r += kp(n, e, a, i), e = a[a.length - 1]; + } + return r; +} +class _r extends _n { + /** + * @param {Array|Array} coordinates Coordinates. + * For internal use, flat coordinates in combination with `layout` are also accepted. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + constructor(e, t) { + super(), this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, t !== void 0 && !Array.isArray(e[0]) ? this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ) : this.setCoordinates( + /** @type {Array} */ + e, + t + ); + } + /** + * Make a complete copy of the geometry. + * @return {!LinearRing} Clone. + * @api + * @override + */ + clone() { + return new _r(this.flatCoordinates.slice(), this.layout); + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + return r < ss(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( + yg( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + 0 + ) + ), this.maxDeltaRevision_ = this.getRevision()), xg( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + this.maxDelta_, + !0, + e, + t, + i, + r + )); + } + /** + * Return the area of the linear ring on projected plane. + * @return {number} Area (on projected plane). + * @api + */ + getArea() { + return Tg( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride + ); + } + /** + * Return the coordinates of the linear ring. + * @return {Array} Coordinates. + * @api + * @override + */ + getCoordinates() { + return kn( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride + ); + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {LinearRing} Simplified LinearRing. + * @protected + * @override + */ + getSimplifiedGeometryInternal(e) { + const t = []; + return t.length = hl( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e, + t, + 0 + ), new _r(t, "XY"); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "LinearRing"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return !1; + } + /** + * Set the coordinates of the linear ring. + * @param {!Array} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 1), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = Al( + this.flatCoordinates, + 0, + e, + this.stride + ), this.changed(); + } +} +class Xe extends _n { + /** + * @param {import("../coordinate.js").Coordinate} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + constructor(e, t) { + super(), this.setCoordinates(e, t); + } + /** + * Make a complete copy of the geometry. + * @return {!Point} Clone. + * @api + * @override + */ + clone() { + const e = new Xe(this.flatCoordinates.slice(), this.layout); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + const s = this.flatCoordinates, o = dn( + e, + t, + s[0], + s[1] + ); + if (o < r) { + const a = this.stride; + for (let l = 0; l < a; ++l) + i[l] = s[l]; + return i.length = a, o; + } + return r; + } + /** + * Return the coordinate of the point. + * @return {import("../coordinate.js").Coordinate} Coordinates. + * @api + * @override + */ + getCoordinates() { + return this.flatCoordinates.slice(); + } + /** + * @param {import("../extent.js").Extent} extent Extent. + * @protected + * @return {import("../extent.js").Extent} extent Extent. + * @override + */ + computeExtent(e) { + return Xs(this.flatCoordinates, e); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "Point"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return hg(e, this.flatCoordinates[0], this.flatCoordinates[1]); + } + /** + * @param {!Array<*>} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 0), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = Op( + this.flatCoordinates, + 0, + e, + this.stride + ), this.changed(); + } +} +function Yy(n, e, t, i, r) { + return !gg( + r, + /** + * @param {import("../../coordinate.js").Coordinate} coordinate Coordinate. + * @return {boolean} Contains (x, y). + */ + function(o) { + return !Pr( + n, + e, + t, + i, + o[0], + o[1] + ); + } + ); +} +function Pr(n, e, t, i, r, s) { + let o = 0, a = n[t - i], l = n[t - i + 1]; + for (; e < t; e += i) { + const A = n[e], c = n[e + 1]; + l <= s ? c > s && (A - a) * (s - l) - (r - a) * (c - l) > 0 && o++ : c <= s && (A - a) * (s - l) - (r - a) * (c - l) < 0 && o--, a = A, l = c; + } + return o !== 0; +} +function vg(n, e, t, i, r, s) { + if (t.length === 0 || !Pr(n, e, t[0], i, r, s)) + return !1; + for (let o = 1, a = t.length; o < a; ++o) + if (Pr(n, t[o - 1], t[o], i, r, s)) + return !1; + return !0; +} +function zy(n, e, t, i, r, s) { + if (t.length === 0) + return !1; + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o]; + if (vg(n, e, l, i, r, s)) + return !0; + e = l[l.length - 1]; + } + return !1; +} +function Qg(n, e, t, i, r, s, o) { + let a, l, A, c, h, u, g; + const d = r[s + 1], m = []; + for (let p = 0, _ = t.length; p < _; ++p) { + const I = t[p]; + for (c = n[I - i], u = n[I - i + 1], a = e; a < I; a += i) + h = n[a], g = n[a + 1], (d <= u && g <= d || u <= d && d <= g) && (A = (d - u) / (g - u) * (h - c) + c, m.push(A)), c = h, u = g; + } + let f = NaN, E = -1 / 0; + for (m.sort(gn), c = m[0], a = 1, l = m.length; a < l; ++a) { + h = m[a]; + const p = Math.abs(h - c); + p > E && (A = (c + h) / 2, vg(n, e, t, i, A, d) && (f = A, E = p)), c = h; + } + return isNaN(f) && (f = r[s]), o ? (o.push(f, d, E), o) : [f, d, E]; +} +function $p(n, e, t, i, r) { + let s = []; + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o]; + s = Qg( + n, + e, + l, + i, + r, + 2 * o, + s + ), e = l[l.length - 1]; + } + return s; +} +function Up(n, e, t, i, r) { + let s; + for (e += i; e < t; e += i) + if (s = r( + n.slice(e - i, e), + n.slice(e, e + i) + ), s) + return s; + return !1; +} +function Ic(n, e, t, i, r) { + const s = Tp( + Ft(), + n, + e, + t, + i + ); + return He(r, s) ? Mt(r, s) || s[0] >= r[0] && s[2] <= r[2] || s[1] >= r[1] && s[3] <= r[3] ? !0 : Up( + n, + e, + t, + i, + /** + * @param {import("../../coordinate.js").Coordinate} point1 Start point. + * @param {import("../../coordinate.js").Coordinate} point2 End point. + * @return {boolean} `true` if the segment and the extent intersect, + * `false` otherwise. + */ + function(o, a) { + return Ay(r, o, a); + } + ) : !1; +} +function Vy(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) { + if (Ic(n, e, t[s], i, r)) + return !0; + e = t[s]; + } + return !1; +} +function Yp(n, e, t, i, r) { + return !!(Ic(n, e, t, i, r) || Pr( + n, + e, + t, + i, + r[0], + r[1] + ) || Pr( + n, + e, + t, + i, + r[0], + r[3] + ) || Pr( + n, + e, + t, + i, + r[2], + r[1] + ) || Pr( + n, + e, + t, + i, + r[2], + r[3] + )); +} +function zp(n, e, t, i, r) { + if (!Yp(n, e, t[0], i, r)) + return !1; + if (t.length === 1) + return !0; + for (let s = 1, o = t.length; s < o; ++s) + if (Yy( + n, + t[s - 1], + t[s], + i, + r + ) && !Ic( + n, + t[s - 1], + t[s], + i, + r + )) + return !1; + return !0; +} +function Hy(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + if (zp(n, e, a, i, r)) + return !0; + e = a[a.length - 1]; + } + return !1; +} +function Xy(n, e, t, i) { + for (; e < t - i; ) { + for (let r = 0; r < i; ++r) { + const s = n[e + r]; + n[e + r] = n[t - i + r], n[t - i + r] = s; + } + e += i, t -= i; + } +} +function Cc(n, e, t, i) { + let r = 0, s = n[t - i], o = n[t - i + 1]; + for (; e < t; e += i) { + const a = n[e], l = n[e + 1]; + r += (a - s) * (l + o), s = a, o = l; + } + return r === 0 ? void 0 : r > 0; +} +function Dg(n, e, t, i, r) { + r = r !== void 0 ? r : !1; + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s], l = Cc( + n, + e, + a, + i + ); + if (s === 0) { + if (r && l || !r && !l) + return !1; + } else if (r && !l || !r && l) + return !1; + e = a; + } + return !0; +} +function Vp(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s]; + if (!Dg(n, e, a, i, r)) + return !1; + a.length && (e = a[a.length - 1]); + } + return !0; +} +function LA(n, e, t, i, r) { + r = r !== void 0 ? r : !1; + for (let s = 0, o = t.length; s < o; ++s) { + const a = t[s], l = Cc( + n, + e, + a, + i + ); + (s === 0 ? r && l || !r && !l : r && !l || !r && l) && Xy(n, e, a, i), e = a; + } + return e; +} +function Ru(n, e, t, i, r) { + for (let s = 0, o = t.length; s < o; ++s) + e = LA( + n, + e, + t[s], + i, + r + ); + return e; +} +function yc(n, e) { + const t = []; + let i = 0, r = 0, s; + for (let o = 0, a = e.length; o < a; ++o) { + const l = e[o], A = Cc(n, i, l, 2); + if (s === void 0 && (s = A), A === s) + t.push(e.slice(r, o + 1)); + else { + if (t.length === 0) + continue; + t[t.length - 1].push(e[r]); + } + r = o + 1, i = l; + } + return t; +} +class it extends _n { + /** + * @param {!Array>|!Array} coordinates + * Array of linear rings that define the polygon. The first linear ring of the + * array defines the outer-boundary or surface of the polygon. Each subsequent + * linear ring defines a hole in the surface of the polygon. A linear ring is + * an array of vertices' coordinates where the first coordinate and the last are + * equivalent. (For internal use, flat coordinates in combination with + * `layout` and `ends` are also accepted.) + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @param {Array} [ends] Ends (for internal use with flat coordinates). + */ + constructor(e, t, i) { + super(), this.ends_ = [], this.flatInteriorPointRevision_ = -1, this.flatInteriorPoint_ = null, this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, this.orientedRevision_ = -1, this.orientedFlatCoordinates_ = null, t !== void 0 && i ? (this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ), this.ends_ = i) : this.setCoordinates( + /** @type {Array>} */ + e, + t + ); + } + /** + * Append the passed linear ring to this polygon. + * @param {LinearRing} linearRing Linear ring. + * @api + */ + appendLinearRing(e) { + this.flatCoordinates ? Se(this.flatCoordinates, e.getFlatCoordinates()) : this.flatCoordinates = e.getFlatCoordinates().slice(), this.ends_.push(this.flatCoordinates.length), this.changed(); + } + /** + * Make a complete copy of the geometry. + * @return {!Polygon} Clone. + * @api + * @override + */ + clone() { + const e = new it( + this.flatCoordinates.slice(), + this.layout, + this.ends_.slice() + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + return r < ss(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( + wg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + 0 + ) + ), this.maxDeltaRevision_ = this.getRevision()), Bg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + this.maxDelta_, + !0, + e, + t, + i, + r + )); + } + /** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + * @override + */ + containsXY(e, t) { + return vg( + this.getOrientedFlatCoordinates(), + 0, + this.ends_, + this.stride, + e, + t + ); + } + /** + * Return the area of the polygon on projected plane. + * @return {number} Area (on projected plane). + * @api + */ + getArea() { + return kp( + this.getOrientedFlatCoordinates(), + 0, + this.ends_, + this.stride + ); + } + /** + * Get the coordinate array for this geometry. This array has the structure + * of a GeoJSON coordinate array for polygons. + * + * @param {boolean} [right] Orient coordinates according to the right-hand + * rule (counter-clockwise for exterior and clockwise for interior rings). + * If `false`, coordinates will be oriented according to the left-hand rule + * (clockwise for exterior and counter-clockwise for interior rings). + * By default, coordinate orientation will depend on how the geometry was + * constructed. + * @return {Array>} Coordinates. + * @api + * @override + */ + getCoordinates(e) { + let t; + return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), LA(t, 0, this.ends_, this.stride, e)) : t = this.flatCoordinates, Fa(t, 0, this.ends_, this.stride); + } + /** + * @return {Array} Ends. + */ + getEnds() { + return this.ends_; + } + /** + * @return {Array} Interior point. + */ + getFlatInteriorPoint() { + if (this.flatInteriorPointRevision_ != this.getRevision()) { + const e = Dt(this.getExtent()); + this.flatInteriorPoint_ = Qg( + this.getOrientedFlatCoordinates(), + 0, + this.ends_, + this.stride, + e, + 0 + ), this.flatInteriorPointRevision_ = this.getRevision(); + } + return ( + /** @type {import("../coordinate.js").Coordinate} */ + this.flatInteriorPoint_ + ); + } + /** + * Return an interior point of the polygon. + * @return {Point} Interior point as XYM coordinate, where M is the + * length of the horizontal intersection that the point belongs to. + * @api + */ + getInteriorPoint() { + return new Xe(this.getFlatInteriorPoint(), "XYM"); + } + /** + * Return the number of rings of the polygon, this includes the exterior + * ring and any interior rings. + * + * @return {number} Number of rings. + * @api + */ + getLinearRingCount() { + return this.ends_.length; + } + /** + * Return the Nth linear ring of the polygon geometry. Return `null` if the + * given index is out of range. + * The exterior linear ring is available at index `0` and the interior rings + * at index `1` and beyond. + * + * @param {number} index Index. + * @return {LinearRing|null} Linear ring. + * @api + */ + getLinearRing(e) { + return e < 0 || this.ends_.length <= e ? null : new _r( + this.flatCoordinates.slice( + e === 0 ? 0 : this.ends_[e - 1], + this.ends_[e] + ), + this.layout + ); + } + /** + * Return the linear rings of the polygon. + * @return {Array} Linear rings. + * @api + */ + getLinearRings() { + const e = this.layout, t = this.flatCoordinates, i = this.ends_, r = []; + let s = 0; + for (let o = 0, a = i.length; o < a; ++o) { + const l = i[o], A = new _r( + t.slice(s, l), + e + ); + r.push(A), s = l; + } + return r; + } + /** + * @return {Array} Oriented flat coordinates. + */ + getOrientedFlatCoordinates() { + if (this.orientedRevision_ != this.getRevision()) { + const e = this.flatCoordinates; + Dg(e, 0, this.ends_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = LA( + this.orientedFlatCoordinates_, + 0, + this.ends_, + this.stride + )), this.orientedRevision_ = this.getRevision(); + } + return ( + /** @type {Array} */ + this.orientedFlatCoordinates_ + ); + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {Polygon} Simplified Polygon. + * @protected + * @override + */ + getSimplifiedGeometryInternal(e) { + const t = [], i = []; + return t.length = Rg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + Math.sqrt(e), + t, + 0, + i + ), new it(t, "XY", i); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "Polygon"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return zp( + this.getOrientedFlatCoordinates(), + 0, + this.ends_, + this.stride, + e + ); + } + /** + * Set the coordinates of the polygon. + * @param {!Array>} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 2), this.flatCoordinates || (this.flatCoordinates = []); + const i = cl( + this.flatCoordinates, + 0, + e, + this.stride, + this.ends_ + ); + this.flatCoordinates.length = i.length === 0 ? 0 : i[i.length - 1], this.changed(); + } +} +function qy(n, e, t, i) { + t = t || 32; + const r = []; + for (let s = 0; s < t; ++s) + Se( + r, + Ry(n, e, 2 * Math.PI * s / t, i) + ); + return r.push(r[0], r[1]), new it(r, "XY", [r.length]); +} +function co(n) { + if (wn(n)) + throw new Error("Cannot create polygon from empty extent"); + const e = n[0], t = n[1], i = n[2], r = n[3], s = [ + e, + t, + e, + r, + i, + r, + i, + t, + e, + t + ]; + return new it(s, "XY", [s.length]); +} +function FA(n, e, t) { + e = e || 32; + const i = n.getStride(), r = n.getLayout(), s = n.getCenter(), o = i * (e + 1), a = new Array(o); + for (let c = 0; c < o; c += i) { + a[c] = 0, a[c + 1] = 0; + for (let h = 2; h < i; h++) + a[c + h] = s[h]; + } + const l = [a.length], A = new it(a, r, l); + return Hp(A, s, n.getRadius(), t), A; +} +function Hp(n, e, t, i) { + const r = n.getFlatCoordinates(), s = n.getStride(), o = r.length / s - 1, a = i || 0; + for (let l = 0; l <= o; ++l) { + const A = l * s, c = a + Li(l, o) * 2 * Math.PI / o; + r[A] = e[0] + t * Math.cos(c), r[A + 1] = e[1] + t * Math.sin(c); + } + n.changed(); +} +const nt = { + ACCURACY: "accuracy", + ACCURACY_GEOMETRY: "accuracyGeometry", + ALTITUDE: "altitude", + ALTITUDE_ACCURACY: "altitudeAccuracy", + HEADING: "heading", + POSITION: "position", + PROJECTION: "projection", + SPEED: "speed", + TRACKING: "tracking", + TRACKING_OPTIONS: "trackingOptions" +}, jy = { + /** + * Triggered when a `GeolocationPositionError` occurs. + * @event module:ol/Geolocation.GeolocationError#error + * @api + */ + ERROR: "error" +}; +class Ky extends xt { + /** + * @param {GeolocationPositionError} error error object. + */ + constructor(e) { + super(jy.ERROR), this.code = e.code, this.message = e.message; + } +} +class SO extends Oi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), this.on, this.once, this.un, e = e || {}, this.position_ = null, this.transform_ = pc, this.watchId_ = void 0, this.addChangeListener(nt.PROJECTION, this.handleProjectionChanged_), this.addChangeListener(nt.TRACKING, this.handleTrackingChanged_), e.projection !== void 0 && this.setProjection(e.projection), e.trackingOptions !== void 0 && this.setTrackingOptions(e.trackingOptions), this.setTracking(e.tracking !== void 0 ? e.tracking : !1); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.setTracking(!1), super.disposeInternal(); + } + /** + * @private + */ + handleProjectionChanged_() { + const e = this.getProjection(); + e && (this.transform_ = li( + q("EPSG:4326"), + e + ), this.position_ && this.set(nt.POSITION, this.transform_(this.position_))); + } + /** + * @private + */ + handleTrackingChanged_() { + if ("geolocation" in navigator) { + const e = this.getTracking(); + e && this.watchId_ === void 0 ? this.watchId_ = navigator.geolocation.watchPosition( + this.positionChange_.bind(this), + this.positionError_.bind(this), + this.getTrackingOptions() + ) : !e && this.watchId_ !== void 0 && (navigator.geolocation.clearWatch(this.watchId_), this.watchId_ = void 0); + } + } + /** + * @private + * @param {GeolocationPosition} position position event. + */ + positionChange_(e) { + const t = e.coords; + this.set(nt.ACCURACY, t.accuracy), this.set( + nt.ALTITUDE, + t.altitude === null ? void 0 : t.altitude + ), this.set( + nt.ALTITUDE_ACCURACY, + t.altitudeAccuracy === null ? void 0 : t.altitudeAccuracy + ), this.set( + nt.HEADING, + t.heading === null ? void 0 : Tt(t.heading) + ), this.position_ ? (this.position_[0] = t.longitude, this.position_[1] = t.latitude) : this.position_ = [t.longitude, t.latitude]; + const i = this.transform_(this.position_); + this.set(nt.POSITION, i.slice()), this.set(nt.SPEED, t.speed === null ? void 0 : t.speed); + const r = qy(this.position_, t.accuracy); + r.applyTransform(this.transform_), this.set(nt.ACCURACY_GEOMETRY, r), this.changed(); + } + /** + * @private + * @param {GeolocationPositionError} error error object. + */ + positionError_(e) { + this.dispatchEvent(new Ky(e)); + } + /** + * Get the accuracy of the position in meters. + * @return {number|undefined} The accuracy of the position measurement in + * meters. + * @observable + * @api + */ + getAccuracy() { + return ( + /** @type {number|undefined} */ + this.get(nt.ACCURACY) + ); + } + /** + * Get a geometry of the position accuracy. + * @return {?import("./geom/Polygon.js").default} A geometry of the position accuracy. + * @observable + * @api + */ + getAccuracyGeometry() { + return ( + /** @type {?import("./geom/Polygon.js").default} */ + this.get(nt.ACCURACY_GEOMETRY) || null + ); + } + /** + * Get the altitude associated with the position. + * @return {number|undefined} The altitude of the position in meters above mean + * sea level. + * @observable + * @api + */ + getAltitude() { + return ( + /** @type {number|undefined} */ + this.get(nt.ALTITUDE) + ); + } + /** + * Get the altitude accuracy of the position. + * @return {number|undefined} The accuracy of the altitude measurement in + * meters. + * @observable + * @api + */ + getAltitudeAccuracy() { + return ( + /** @type {number|undefined} */ + this.get(nt.ALTITUDE_ACCURACY) + ); + } + /** + * Get the heading as radians clockwise from North. + * Note: depending on the browser, the heading is only defined if the `enableHighAccuracy` + * is set to `true` in the tracking options. + * @return {number|undefined} The heading of the device in radians from north. + * @observable + * @api + */ + getHeading() { + return ( + /** @type {number|undefined} */ + this.get(nt.HEADING) + ); + } + /** + * Get the position of the device. + * @return {import("./coordinate.js").Coordinate|undefined} The current position of the device reported + * in the current projection. + * @observable + * @api + */ + getPosition() { + return ( + /** @type {import("./coordinate.js").Coordinate|undefined} */ + this.get(nt.POSITION) + ); + } + /** + * Get the projection associated with the position. + * @return {import("./proj/Projection.js").default|undefined} The projection the position is + * reported in. + * @observable + * @api + */ + getProjection() { + return ( + /** @type {import("./proj/Projection.js").default|undefined} */ + this.get(nt.PROJECTION) + ); + } + /** + * Get the speed in meters per second. + * @return {number|undefined} The instantaneous speed of the device in meters + * per second. + * @observable + * @api + */ + getSpeed() { + return ( + /** @type {number|undefined} */ + this.get(nt.SPEED) + ); + } + /** + * Determine if the device location is being tracked. + * @return {boolean} The device location is being tracked. + * @observable + * @api + */ + getTracking() { + return ( + /** @type {boolean} */ + this.get(nt.TRACKING) + ); + } + /** + * Get the tracking options. + * See https://www.w3.org/TR/geolocation-API/#position-options. + * @return {PositionOptions|undefined} PositionOptions as defined by + * the [HTML5 Geolocation spec + * ](https://www.w3.org/TR/geolocation-API/#position_options_interface). + * @observable + * @api + */ + getTrackingOptions() { + return ( + /** @type {PositionOptions|undefined} */ + this.get(nt.TRACKING_OPTIONS) + ); + } + /** + * Set the projection to use for transforming the coordinates. + * @param {import("./proj.js").ProjectionLike} projection The projection the position is + * reported in. + * @observable + * @api + */ + setProjection(e) { + this.set(nt.PROJECTION, q(e)); + } + /** + * Enable or disable tracking. + * @param {boolean} tracking Enable tracking. + * @observable + * @api + */ + setTracking(e) { + this.set(nt.TRACKING, e); + } + /** + * Set the tracking options. + * See http://www.w3.org/TR/geolocation-API/#position-options. + * @param {PositionOptions} options PositionOptions as defined by the + * [HTML5 Geolocation spec + * ](http://www.w3.org/TR/geolocation-API/#position_options_interface). + * @observable + * @api + */ + setTrackingOptions(e) { + this.set(nt.TRACKING_OPTIONS, e); + } +} +const W = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + ERROR: 3, + EMPTY: 4 +}; +class wc extends So { + /** + * @param {import("./extent.js").Extent} extent Extent. + * @param {number|Array|undefined} resolution Resolution. If provided as array, x and y + * resolution will be assumed. + * @param {number} pixelRatio Pixel ratio. + * @param {import("./ImageState.js").default|import("./Image.js").Loader} stateOrLoader State. + */ + constructor(e, t, i, r) { + super(), this.extent = e, this.pixelRatio_ = i, this.resolution = t, this.state = typeof r == "function" ? W.IDLE : r, this.image_ = null, this.loader = typeof r == "function" ? r : null; + } + /** + * @protected + */ + changed() { + this.dispatchEvent(j.CHANGE); + } + /** + * @return {import("./extent.js").Extent} Extent. + */ + getExtent() { + return this.extent; + } + /** + * @return {import('./DataTile.js').ImageLike} Image. + */ + getImage() { + return this.image_; + } + /** + * @return {number} PixelRatio. + */ + getPixelRatio() { + return this.pixelRatio_; + } + /** + * @return {number|Array} Resolution. + */ + getResolution() { + return ( + /** @type {number} */ + this.resolution + ); + } + /** + * @return {import("./ImageState.js").default} State. + */ + getState() { + return this.state; + } + /** + * Load not yet loaded URI. + */ + load() { + if (this.state == W.IDLE && this.loader) { + this.state = W.LOADING, this.changed(); + const e = this.getResolution(), t = Array.isArray(e) ? e[0] : e; + og( + () => this.loader( + this.getExtent(), + t, + this.getPixelRatio() + ) + ).then((i) => { + "image" in i && (this.image_ = i.image), "extent" in i && (this.extent = i.extent), "resolution" in i && (this.resolution = i.resolution), "pixelRatio" in i && (this.pixelRatio_ = i.pixelRatio), (i instanceof HTMLImageElement || i instanceof ImageBitmap || i instanceof HTMLCanvasElement || i instanceof HTMLVideoElement) && (this.image_ = i), this.state = W.LOADED; + }).catch((i) => { + this.state = W.ERROR, console.error(i); + }).finally(() => this.changed()); + } + } + /** + * @param {import('./DataTile.js').ImageLike} image The image. + */ + setImage(e) { + this.image_ = e; + } + /** + * @param {number|Array} resolution Resolution. + */ + setResolution(e) { + this.resolution = e; + } +} +function Wy(n, e, t) { + const i = ( + /** @type {HTMLImageElement} */ + n + ); + let r = !0, s = !1, o = !1; + const a = [ + no(i, j.LOAD, function() { + o = !0, s || e(); + }) + ]; + return i.src && Ag ? (s = !0, i.decode().then(function() { + r && e(); + }).catch(function(l) { + r && (o ? e() : t()); + })) : a.push(no(i, j.ERROR, t)), function() { + r = !1, a.forEach(Re); + }; +} +function Zy(n, e) { + return new Promise((t, i) => { + function r() { + o(), t(n); + } + function s() { + o(), i(new Error("Image load error")); + } + function o() { + n.removeEventListener("load", r), n.removeEventListener("error", s); + } + n.addEventListener("load", r), n.addEventListener("error", s), e && (n.src = e); + }); +} +function Xp(n, e) { + return e && (n.src = e), n.src && Ag ? new Promise( + (t, i) => n.decode().then(() => t(n)).catch( + (r) => n.complete && n.width ? t(n) : i(r) + ) + ) : Zy(n); +} +function xr(n, e) { + return e && (n.src = e), n.src && Ag && HC ? n.decode().then(() => createImageBitmap(n)).catch((t) => { + if (n.complete && n.width) + return n; + throw t; + }) : Xp(n); +} +class Lg extends wc { + /** + * @param {import("./extent.js").Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {HTMLCanvasElement} canvas Canvas. + * @param {Loader} [loader] Optional loader function to + * support asynchronous canvas drawing. + */ + constructor(e, t, i, r, s) { + const o = s !== void 0 ? W.IDLE : W.LOADED; + super(e, t, i, o), this.loader_ = s !== void 0 ? s : null, this.canvas_ = r, this.error_ = null; + } + /** + * Get any error associated with asynchronous rendering. + * @return {?Error} Any error that occurred during rendering. + */ + getError() { + return this.error_; + } + /** + * Handle async drawing complete. + * @param {Error} [err] Any error during drawing. + * @private + */ + handleLoad_(e) { + e ? (this.error_ = e, this.state = W.ERROR) : this.state = W.LOADED, this.changed(); + } + /** + * Load not yet loaded URI. + * @override + */ + load() { + this.state == W.IDLE && (this.state = W.LOADING, this.changed(), this.loader_(this.handleLoad_.bind(this))); + } + /** + * @return {HTMLCanvasElement} Canvas element. + * @override + */ + getImage() { + return this.canvas_; + } +} +class ul extends Ro { + /** + * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. + * @param {import("./TileState.js").default} state State. + * @param {string} src Image source URI. + * @param {?string} crossOrigin Cross origin. + * @param {import("./Tile.js").LoadFunction} tileLoadFunction Tile load function. + * @param {import("./Tile.js").Options} [options] Tile options. + */ + constructor(e, t, i, r, s, o) { + super(e, t, o), this.crossOrigin_ = r, this.src_ = i, this.key = i, this.image_ = new Image(), r !== null && (this.image_.crossOrigin = r), this.unlisten_ = null, this.tileLoadFunction_ = s; + } + /** + * Get the HTML image element for this tile (may be a Canvas, Image, or Video). + * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. + * @api + */ + getImage() { + return this.image_; + } + /** + * Sets an HTML image element for this tile (may be a Canvas or preloaded Image). + * @param {HTMLCanvasElement|HTMLImageElement} element Element. + */ + setImage(e) { + this.image_ = e, this.state = $.LOADED, this.unlistenImage_(), this.changed(); + } + /** + * Tracks loading or read errors. + * + * @private + */ + handleImageError_() { + this.state = $.ERROR, this.unlistenImage_(), this.image_ = Jy(), this.changed(); + } + /** + * Tracks successful image load. + * + * @private + */ + handleImageLoad_() { + const e = ( + /** @type {HTMLImageElement} */ + this.image_ + ); + e.naturalWidth && e.naturalHeight ? this.state = $.LOADED : this.state = $.EMPTY, this.unlistenImage_(), this.changed(); + } + /** + * Load the image or retry if loading previously failed. + * Loading is taken care of by the tile queue, and calling this method is + * only needed for preloading or for reloading in case of an error. + * + * To retry loading tiles on failed requests, use a custom `tileLoadFunction` + * that checks for error status codes and reloads only when the status code is + * 408, 429, 500, 502, 503 and 504, and only when not too many retries have been + * made already: + * + * ```js + * const retryCodes = [408, 429, 500, 502, 503, 504]; + * const retries = {}; + * source.setTileLoadFunction((tile, src) => { + * const image = tile.getImage(); + * fetch(src) + * .then((response) => { + * if (retryCodes.includes(response.status)) { + * retries[src] = (retries[src] || 0) + 1; + * if (retries[src] <= 3) { + * setTimeout(() => tile.load(), retries[src] * 1000); + * } + * return Promise.reject(); + * } + * return response.blob(); + * }) + * .then((blob) => { + * const imageUrl = URL.createObjectURL(blob); + * image.src = imageUrl; + * setTimeout(() => URL.revokeObjectURL(imageUrl), 5000); + * }) + * .catch(() => tile.setState(3)); // error + * }); + * ``` + * @api + * @override + */ + load() { + this.state == $.ERROR && (this.state = $.IDLE, this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_)), this.state == $.IDLE && (this.state = $.LOADING, this.changed(), this.tileLoadFunction_(this, this.src_), this.unlisten_ = Wy( + this.image_, + this.handleImageLoad_.bind(this), + this.handleImageError_.bind(this) + )); + } + /** + * Discards event handlers which listen for load completion or errors. + * + * @private + */ + unlistenImage_() { + this.unlisten_ && (this.unlisten_(), this.unlisten_ = null); + } + /** + * @override + */ + disposeInternal() { + this.unlistenImage_(), this.image_ = null, super.disposeInternal(); + } +} +function Jy() { + const n = Ve(1, 1); + return n.fillStyle = "rgba(0,0,0,0)", n.fillRect(0, 0, 1, 1), n.canvas; +} +class ew { + /** + * @param {number} decay Rate of decay (must be negative). + * @param {number} minVelocity Minimum velocity (pixels/millisecond). + * @param {number} delay Delay to consider to calculate the kinetic + * initial values (milliseconds). + */ + constructor(e, t, i) { + this.decay_ = e, this.minVelocity_ = t, this.delay_ = i, this.points_ = [], this.angle_ = 0, this.initialVelocity_ = 0; + } + /** + * FIXME empty description for jsdoc + */ + begin() { + this.points_.length = 0, this.angle_ = 0, this.initialVelocity_ = 0; + } + /** + * @param {number} x X. + * @param {number} y Y. + */ + update(e, t) { + this.points_.push(e, t, Date.now()); + } + /** + * @return {boolean} Whether we should do kinetic animation. + */ + end() { + if (this.points_.length < 6) + return !1; + const e = Date.now() - this.delay_, t = this.points_.length - 3; + if (this.points_[t + 2] < e) + return !1; + let i = t - 3; + for (; i > 0 && this.points_[i + 2] > e; ) + i -= 3; + const r = this.points_[t + 2] - this.points_[i + 2]; + if (r < 1e3 / 60) + return !1; + const s = this.points_[t] - this.points_[i], o = this.points_[t + 1] - this.points_[i + 1]; + return this.angle_ = Math.atan2(o, s), this.initialVelocity_ = Math.sqrt(s * s + o * o) / r, this.initialVelocity_ > this.minVelocity_; + } + /** + * @return {number} Total distance travelled (pixels). + */ + getDistance() { + return (this.minVelocity_ - this.initialVelocity_) / this.decay_; + } + /** + * @return {number} Angle of the kinetic panning animation (radians). + */ + getAngle() { + return this.angle_; + } +} +const Le = { + OPACITY: "opacity", + VISIBLE: "visible", + EXTENT: "extent", + Z_INDEX: "zIndex", + MAX_RESOLUTION: "maxResolution", + MIN_RESOLUTION: "minResolution", + MAX_ZOOM: "maxZoom", + MIN_ZOOM: "minZoom", + SOURCE: "source", + MAP: "map" +}; +class qp extends Oi { + /** + * @param {Options} options Layer options. + */ + constructor(e) { + super(), this.on, this.once, this.un, this.background_ = e.background; + const t = Object.assign({}, e); + typeof e.properties == "object" && (delete t.properties, Object.assign(t, e.properties)), t[Le.OPACITY] = e.opacity !== void 0 ? e.opacity : 1, Ie( + typeof t[Le.OPACITY] == "number", + "Layer opacity must be a number" + ), t[Le.VISIBLE] = e.visible !== void 0 ? e.visible : !0, t[Le.Z_INDEX] = e.zIndex, t[Le.MAX_RESOLUTION] = e.maxResolution !== void 0 ? e.maxResolution : 1 / 0, t[Le.MIN_RESOLUTION] = e.minResolution !== void 0 ? e.minResolution : 0, t[Le.MIN_ZOOM] = e.minZoom !== void 0 ? e.minZoom : -1 / 0, t[Le.MAX_ZOOM] = e.maxZoom !== void 0 ? e.maxZoom : 1 / 0, this.className_ = t.className !== void 0 ? t.className : "ol-layer", delete t.className, this.setProperties(t), this.state_ = null; + } + /** + * Get the background for this layer. + * @return {BackgroundColor|false} Layer background. + */ + getBackground() { + return this.background_; + } + /** + * @return {string} CSS class name. + */ + getClassName() { + return this.className_; + } + /** + * This method is not meant to be called by layers or layer renderers because the state + * is incorrect if the layer is included in a layer group. + * + * @param {boolean} [managed] Layer is managed. + * @return {import("./Layer.js").State} Layer state. + */ + getLayerState(e) { + const t = this.state_ || /** @type {?} */ + { + layer: this, + managed: e === void 0 ? !0 : e + }, i = this.getZIndex(); + return t.opacity = ue(Math.round(this.getOpacity() * 100) / 100, 0, 1), t.visible = this.getVisible(), t.extent = this.getExtent(), t.zIndex = i === void 0 && !t.managed ? 1 / 0 : i, t.maxResolution = this.getMaxResolution(), t.minResolution = Math.max(this.getMinResolution(), 0), t.minZoom = this.getMinZoom(), t.maxZoom = this.getMaxZoom(), this.state_ = t, t; + } + /** + * @abstract + * @param {Array} [array] Array of layers (to be + * modified in place). + * @return {Array} Array of layers. + */ + getLayersArray(e) { + return ae(); + } + /** + * @abstract + * @param {Array} [states] Optional list of layer + * states (to be modified in place). + * @return {Array} List of layer states. + */ + getLayerStatesArray(e) { + return ae(); + } + /** + * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it + * will be visible regardless of extent. + * @return {import("../extent.js").Extent|undefined} The layer extent. + * @observable + * @api + */ + getExtent() { + return ( + /** @type {import("../extent.js").Extent|undefined} */ + this.get(Le.EXTENT) + ); + } + /** + * Return the maximum resolution of the layer. Returns Infinity if + * the layer has no maximum resolution set. + * @return {number} The maximum resolution of the layer. + * @observable + * @api + */ + getMaxResolution() { + return ( + /** @type {number} */ + this.get(Le.MAX_RESOLUTION) + ); + } + /** + * Return the minimum resolution of the layer. Returns 0 if + * the layer has no minimum resolution set. + * @return {number} The minimum resolution of the layer. + * @observable + * @api + */ + getMinResolution() { + return ( + /** @type {number} */ + this.get(Le.MIN_RESOLUTION) + ); + } + /** + * Return the minimum zoom level of the layer. Returns -Infinity if + * the layer has no minimum zoom set. + * @return {number} The minimum zoom level of the layer. + * @observable + * @api + */ + getMinZoom() { + return ( + /** @type {number} */ + this.get(Le.MIN_ZOOM) + ); + } + /** + * Return the maximum zoom level of the layer. Returns Infinity if + * the layer has no maximum zoom set. + * @return {number} The maximum zoom level of the layer. + * @observable + * @api + */ + getMaxZoom() { + return ( + /** @type {number} */ + this.get(Le.MAX_ZOOM) + ); + } + /** + * Return the opacity of the layer (between 0 and 1). + * @return {number} The opacity of the layer. + * @observable + * @api + */ + getOpacity() { + return ( + /** @type {number} */ + this.get(Le.OPACITY) + ); + } + /** + * @abstract + * @return {import("../source/Source.js").State} Source state. + */ + getSourceState() { + return ae(); + } + /** + * Return the value of this layer's `visible` property. To find out whether the layer + * is visible on a map, use `isVisible()` instead. + * @return {boolean} The value of the `visible` property of the layer. + * @observable + * @api + */ + getVisible() { + return ( + /** @type {boolean} */ + this.get(Le.VISIBLE) + ); + } + /** + * Return the Z-index of the layer, which is used to order layers before + * rendering. Returns undefined if the layer is unmanaged. + * @return {number|undefined} The Z-index of the layer. + * @observable + * @api + */ + getZIndex() { + return ( + /** @type {number|undefined} */ + this.get(Le.Z_INDEX) + ); + } + /** + * Sets the background color. + * @param {BackgroundColor} [background] Background color. + */ + setBackground(e) { + this.background_ = e, this.changed(); + } + /** + * Set the extent at which the layer is visible. If `undefined`, the layer + * will be visible at all extents. + * @param {import("../extent.js").Extent|undefined} extent The extent of the layer. + * @observable + * @api + */ + setExtent(e) { + this.set(Le.EXTENT, e); + } + /** + * Set the maximum resolution at which the layer is visible. + * @param {number} maxResolution The maximum resolution of the layer. + * @observable + * @api + */ + setMaxResolution(e) { + this.set(Le.MAX_RESOLUTION, e); + } + /** + * Set the minimum resolution at which the layer is visible. + * @param {number} minResolution The minimum resolution of the layer. + * @observable + * @api + */ + setMinResolution(e) { + this.set(Le.MIN_RESOLUTION, e); + } + /** + * Set the maximum zoom (exclusive) at which the layer is visible. + * Note that the zoom levels for layer visibility are based on the + * view zoom level, which may be different from a tile source zoom level. + * @param {number} maxZoom The maximum zoom of the layer. + * @observable + * @api + */ + setMaxZoom(e) { + this.set(Le.MAX_ZOOM, e); + } + /** + * Set the minimum zoom (inclusive) at which the layer is visible. + * Note that the zoom levels for layer visibility are based on the + * view zoom level, which may be different from a tile source zoom level. + * @param {number} minZoom The minimum zoom of the layer. + * @observable + * @api + */ + setMinZoom(e) { + this.set(Le.MIN_ZOOM, e); + } + /** + * Set the opacity of the layer, allowed values range from 0 to 1. + * @param {number} opacity The opacity of the layer. + * @observable + * @api + */ + setOpacity(e) { + Ie(typeof e == "number", "Layer opacity must be a number"), this.set(Le.OPACITY, e); + } + /** + * Set the visibility of the layer (`true` or `false`). + * @param {boolean} visible The visibility of the layer. + * @observable + * @api + */ + setVisible(e) { + this.set(Le.VISIBLE, e); + } + /** + * Set Z-index of the layer, which is used to order layers before rendering. + * The default Z-index is 0. + * @param {number} zindex The z-index of the layer. + * @observable + * @api + */ + setZIndex(e) { + this.set(Le.Z_INDEX, e); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.state_ && (this.state_.layer = null, this.state_ = null), super.disposeInternal(); + } +} +const yt = { + /** + * Triggered before a layer is rendered. + * @event module:ol/render/Event~RenderEvent#prerender + * @api + */ + PRERENDER: "prerender", + /** + * Triggered after a layer is rendered. + * @event module:ol/render/Event~RenderEvent#postrender + * @api + */ + POSTRENDER: "postrender", + /** + * Triggered before layers are composed. When dispatched by the map, the event object will not have + * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only + * WebGL layers currently dispatch this event. + * @event module:ol/render/Event~RenderEvent#precompose + * @api + */ + PRECOMPOSE: "precompose", + /** + * Triggered after layers are composed. When dispatched by the map, the event object will not have + * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only + * WebGL layers currently dispatch this event. + * @event module:ol/render/Event~RenderEvent#postcompose + * @api + */ + POSTCOMPOSE: "postcompose", + /** + * Triggered when rendering is complete, i.e. all sources and tiles have + * finished loading for the current viewport, and all tiles are faded in. + * The event object will not have a `context` set. + * @event module:ol/render/Event~RenderEvent#rendercomplete + * @api + */ + RENDERCOMPLETE: "rendercomplete" +}, Me = { + ANIMATING: 0, + INTERACTING: 1 +}, ui = { + CENTER: "center", + RESOLUTION: "resolution", + ROTATION: "rotation" +}, jp = 42, ho = 256; +function Df(n, e, t) { + return ( + /** + * @param {import("./coordinate.js").Coordinate|undefined} center Center. + * @param {number|undefined} resolution Resolution. + * @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @param {Array} [centerShift] Shift between map center and viewport center. + * @return {import("./coordinate.js").Coordinate|undefined} Center. + */ + function(i, r, s, o, a) { + if (!i) + return; + if (!r && !e) + return i; + const l = e ? 0 : s[0] * r, A = e ? 0 : s[1] * r, c = a ? a[0] : 0, h = a ? a[1] : 0; + let u = n[0] + l / 2 + c, g = n[2] - l / 2 + c, d = n[1] + A / 2 + h, m = n[3] - A / 2 + h; + u > g && (u = (g + u) / 2, g = u), d > m && (d = (m + d) / 2, m = d); + let f = ue(i[0], u, g), E = ue(i[1], d, m); + if (o && t && r) { + const p = 30 * r; + f += -p * Math.log(1 + Math.max(0, u - i[0]) / p) + p * Math.log(1 + Math.max(0, i[0] - g) / p), E += -p * Math.log(1 + Math.max(0, d - i[1]) / p) + p * Math.log(1 + Math.max(0, i[1] - m) / p); + } + return [f, E]; + } + ); +} +function tw(n) { + return n; +} +function Fg(n, e, t, i) { + const r = he(e) / t[0], s = ze(e) / t[1]; + return i ? Math.min(n, Math.max(r, s)) : Math.min(n, Math.min(r, s)); +} +function bg(n, e, t) { + let i = Math.min(n, e); + const r = 50; + return i *= Math.log(1 + r * Math.max(0, n / e - 1)) / r + 1, t && (i = Math.max(i, t), i /= Math.log(1 + r * Math.max(0, t / n - 1)) / r + 1), ue(i, t / 2, e * 2); +} +function iw(n, e, t, i) { + return e = e !== void 0 ? e : !0, /** + * @param {number|undefined} resolution Resolution. + * @param {number} direction Direction. + * @param {import("./size.js").Size} size Viewport size. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @return {number|undefined} Resolution. + */ + function(r, s, o, a) { + if (r !== void 0) { + const l = n[0], A = n[n.length - 1], c = t ? Fg( + l, + t, + o, + i + ) : l; + if (a) + return e ? bg( + r, + c, + A + ) : ue(r, A, c); + const h = Math.min(c, r), u = Math.floor(uc(n, h, s)); + return n[u] > c && u < n.length - 1 ? n[u + 1] : n[u]; + } + }; +} +function nw(n, e, t, i, r, s) { + return i = i !== void 0 ? i : !0, t = t !== void 0 ? t : 0, /** + * @param {number|undefined} resolution Resolution. + * @param {number} direction Direction. + * @param {import("./size.js").Size} size Viewport size. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @return {number|undefined} Resolution. + */ + function(o, a, l, A) { + if (o !== void 0) { + const c = r ? Fg( + e, + r, + l, + s + ) : e; + if (A) + return i ? bg( + o, + c, + t + ) : ue(o, t, c); + const h = 1e-9, u = Math.ceil( + Math.log(e / c) / Math.log(n) - h + ), g = -a * (0.5 - h) + 0.5, d = Math.min(c, o), m = Math.floor( + Math.log(e / d) / Math.log(n) + g + ), f = Math.max(u, m), E = e / Math.pow(n, f); + return ue(E, t, c); + } + }; +} +function Lf(n, e, t, i, r) { + return t = t !== void 0 ? t : !0, /** + * @param {number|undefined} resolution Resolution. + * @param {number} direction Direction. + * @param {import("./size.js").Size} size Viewport size. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @return {number|undefined} Resolution. + */ + function(s, o, a, l) { + if (s !== void 0) { + const A = i ? Fg( + n, + i, + a, + r + ) : n; + return !t || !l ? ue(s, e, A) : bg( + s, + A, + e + ); + } + }; +} +function Pg(n) { + if (n !== void 0) + return 0; +} +function Ff(n) { + if (n !== void 0) + return n; +} +function rw(n) { + const e = 2 * Math.PI / n; + return ( + /** + * @param {number|undefined} rotation Rotation. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @return {number|undefined} Rotation. + */ + function(t, i) { + if (i) + return t; + if (t !== void 0) + return t = Math.floor(t / e + 0.5) * e, t; + } + ); +} +function sw(n) { + const e = n === void 0 ? Tt(5) : n; + return ( + /** + * @param {number|undefined} rotation Rotation. + * @param {boolean} [isMoving] True if an interaction or animation is in progress. + * @return {number|undefined} Rotation. + */ + function(t, i) { + return i || t === void 0 ? t : Math.abs(t) <= e ? 0 : t; + } + ); +} +const ch = 0; +class an extends Oi { + /** + * @param {ViewOptions} [options] View options. + */ + constructor(e) { + super(), this.on, this.once, this.un, e = Object.assign({}, e), this.hints_ = [0, 0], this.animations_ = [], this.updateAnimationKey_, this.projection_ = _g(e.projection, "EPSG:3857"), this.viewportSize_ = [100, 100], this.targetCenter_ = null, this.targetResolution_, this.targetRotation_, this.nextCenter_ = null, this.nextResolution_, this.nextRotation_, this.cancelAnchor_ = void 0, e.projection && Pp(), e.center && (e.center = Ue(e.center, this.projection_)), e.extent && (e.extent = Vt(e.extent, this.projection_)), this.applyOptions_(e); + } + /** + * Set up the view with the given options. + * @param {ViewOptions} options View options. + */ + applyOptions_(e) { + const t = Object.assign({}, e); + for (const a in ui) + delete t[a]; + this.setProperties(t, !0); + const i = aw(e); + this.maxResolution_ = i.maxResolution, this.minResolution_ = i.minResolution, this.zoomFactor_ = i.zoomFactor, this.resolutions_ = e.resolutions, this.padding_ = e.padding, this.minZoom_ = i.minZoom; + const r = ow(e), s = i.constraint, o = lw(e); + this.constraints_ = { + center: r, + resolution: s, + rotation: o + }, this.setRotation(e.rotation !== void 0 ? e.rotation : 0), this.setCenterInternal( + e.center !== void 0 ? e.center : null + ), e.resolution !== void 0 ? this.setResolution(e.resolution) : e.zoom !== void 0 && this.setZoom(e.zoom); + } + /** + * Padding (in css pixels). + * If the map viewport is partially covered with other content (overlays) along + * its edges, this setting allows to shift the center of the viewport away from that + * content. The order of the values in the array is top, right, bottom, left. + * The default is no padding, which is equivalent to `[0, 0, 0, 0]`. + * @type {Array|undefined} + * @api + */ + get padding() { + return this.padding_; + } + set padding(e) { + let t = this.padding_; + this.padding_ = e; + const i = this.getCenterInternal(); + if (i) { + const r = e || [0, 0, 0, 0]; + t = t || [0, 0, 0, 0]; + const s = this.getResolution(), o = s / 2 * (r[3] - t[3] + t[1] - r[1]), a = s / 2 * (r[0] - t[0] + t[2] - r[2]); + this.setCenterInternal([i[0] + o, i[1] - a]); + } + } + /** + * Get an updated version of the view options used to construct the view. The + * current resolution (or zoom), center, and rotation are applied to any stored + * options. The provided options can be used to apply new min/max zoom or + * resolution limits. + * @param {ViewOptions} newOptions New options to be applied. + * @return {ViewOptions} New options updated with the current view state. + */ + getUpdatedOptions_(e) { + const t = this.getProperties(); + return t.resolution !== void 0 ? t.resolution = this.getResolution() : t.zoom = this.getZoom(), t.center = this.getCenterInternal(), t.rotation = this.getRotation(), Object.assign({}, t, e); + } + /** + * Animate the view. The view's center, zoom (or resolution), and rotation + * can be animated for smooth transitions between view states. For example, + * to animate the view to a new zoom level: + * + * view.animate({zoom: view.getZoom() + 1}); + * + * By default, the animation lasts one second and uses in-and-out easing. You + * can customize this behavior by including `duration` (in milliseconds) and + * `easing` options (see {@link module:ol/easing}). + * + * To chain together multiple animations, call the method with multiple + * animation objects. For example, to first zoom and then pan: + * + * view.animate({zoom: 10}, {center: [0, 0]}); + * + * If you provide a function as the last argument to the animate method, it + * will get called at the end of an animation series. The callback will be + * called with `true` if the animation series completed on its own or `false` + * if it was cancelled. + * + * Animations are cancelled by user interactions (e.g. dragging the map) or by + * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()` + * (or another method that calls one of these). + * + * @param {...(AnimationOptions|function(boolean): void)} var_args Animation + * options. Multiple animations can be run in series by passing multiple + * options objects. To run multiple animations in parallel, call the method + * multiple times. An optional callback can be provided as a final + * argument. The callback will be called with a boolean indicating whether + * the animation completed without being cancelled. + * @api + */ + animate(e) { + this.isDef() && !this.getAnimating() && this.resolveConstraints(0); + const t = new Array(arguments.length); + for (let i = 0; i < t.length; ++i) { + let r = arguments[i]; + r.center && (r = Object.assign({}, r), r.center = Ue( + r.center, + this.getProjection() + )), r.anchor && (r = Object.assign({}, r), r.anchor = Ue( + r.anchor, + this.getProjection() + )), t[i] = r; + } + this.animateInternal.apply(this, t); + } + /** + * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options. + */ + animateInternal(e) { + let t = arguments.length, i; + t > 1 && typeof arguments[t - 1] == "function" && (i = arguments[t - 1], --t); + let r = 0; + for (; r < t && !this.isDef(); ++r) { + const c = arguments[r]; + c.center && this.setCenterInternal(c.center), c.zoom !== void 0 ? this.setZoom(c.zoom) : c.resolution && this.setResolution(c.resolution), c.rotation !== void 0 && this.setRotation(c.rotation); + } + if (r === t) { + i && Ml(i, !0); + return; + } + let s = Date.now(), o = this.targetCenter_.slice(), a = this.targetResolution_, l = this.targetRotation_; + const A = []; + for (; r < t; ++r) { + const c = ( + /** @type {AnimationOptions} */ + arguments[r] + ), h = { + start: s, + complete: !1, + anchor: c.anchor, + duration: c.duration !== void 0 ? c.duration : 1e3, + easing: c.easing || pu, + callback: i + }; + if (c.center && (h.sourceCenter = o, h.targetCenter = c.center.slice(), o = h.targetCenter), c.zoom !== void 0 ? (h.sourceResolution = a, h.targetResolution = this.getResolutionForZoom(c.zoom), a = h.targetResolution) : c.resolution && (h.sourceResolution = a, h.targetResolution = c.resolution, a = h.targetResolution), c.rotation !== void 0) { + h.sourceRotation = l; + const u = Li(c.rotation - l + Math.PI, 2 * Math.PI) - Math.PI; + h.targetRotation = l + u, l = h.targetRotation; + } + Aw(h) ? h.complete = !0 : s += h.duration, A.push(h); + } + this.animations_.push(A), this.setHint(Me.ANIMATING, 1), this.updateAnimations_(); + } + /** + * Determine if the view is being animated. + * @return {boolean} The view is being animated. + * @api + */ + getAnimating() { + return this.hints_[Me.ANIMATING] > 0; + } + /** + * Determine if the user is interacting with the view, such as panning or zooming. + * @return {boolean} The view is being interacted with. + * @api + */ + getInteracting() { + return this.hints_[Me.INTERACTING] > 0; + } + /** + * Cancel any ongoing animations. + * @api + */ + cancelAnimations() { + this.setHint(Me.ANIMATING, -this.hints_[Me.ANIMATING]); + let e; + for (let t = 0, i = this.animations_.length; t < i; ++t) { + const r = this.animations_[t]; + if (r[0].callback && Ml(r[0].callback, !1), !e) + for (let s = 0, o = r.length; s < o; ++s) { + const a = r[s]; + if (!a.complete) { + e = a.anchor; + break; + } + } + } + this.animations_.length = 0, this.cancelAnchor_ = e, this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN; + } + /** + * Update all animations. + */ + updateAnimations_() { + if (this.updateAnimationKey_ !== void 0 && (cancelAnimationFrame(this.updateAnimationKey_), this.updateAnimationKey_ = void 0), !this.getAnimating()) + return; + const e = Date.now(); + let t = !1; + for (let i = this.animations_.length - 1; i >= 0; --i) { + const r = this.animations_[i]; + let s = !0; + for (let o = 0, a = r.length; o < a; ++o) { + const l = r[o]; + if (l.complete) + continue; + const A = e - l.start; + let c = l.duration > 0 ? A / l.duration : 1; + c >= 1 ? (l.complete = !0, c = 1) : s = !1; + const h = l.easing(c); + if (l.sourceCenter) { + const u = l.sourceCenter[0], g = l.sourceCenter[1], d = l.targetCenter[0], m = l.targetCenter[1]; + this.nextCenter_ = l.targetCenter; + const f = u + h * (d - u), E = g + h * (m - g); + this.targetCenter_ = [f, E]; + } + if (l.sourceResolution && l.targetResolution) { + const u = h === 1 ? l.targetResolution : l.sourceResolution + h * (l.targetResolution - l.sourceResolution); + if (l.anchor) { + const g = this.getViewportSize_(this.getRotation()), d = this.constraints_.resolution( + u, + 0, + g, + !0 + ); + this.targetCenter_ = this.calculateCenterZoom( + d, + l.anchor + ); + } + this.nextResolution_ = l.targetResolution, this.targetResolution_ = u, this.applyTargetState_(!0); + } + if (l.sourceRotation !== void 0 && l.targetRotation !== void 0) { + const u = h === 1 ? Li(l.targetRotation + Math.PI, 2 * Math.PI) - Math.PI : l.sourceRotation + h * (l.targetRotation - l.sourceRotation); + if (l.anchor) { + const g = this.constraints_.rotation( + u, + !0 + ); + this.targetCenter_ = this.calculateCenterRotate( + g, + l.anchor + ); + } + this.nextRotation_ = l.targetRotation, this.targetRotation_ = u; + } + if (this.applyTargetState_(!0), t = !0, !l.complete) + break; + } + if (s) { + this.animations_[i] = null, this.setHint(Me.ANIMATING, -1), this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN; + const o = r[0].callback; + o && Ml(o, !0); + } + } + this.animations_ = this.animations_.filter(Boolean), t && this.updateAnimationKey_ === void 0 && (this.updateAnimationKey_ = requestAnimationFrame( + this.updateAnimations_.bind(this) + )); + } + /** + * @param {number} rotation Target rotation. + * @param {import("./coordinate.js").Coordinate} anchor Rotation anchor. + * @return {import("./coordinate.js").Coordinate|undefined} Center for rotation and anchor. + */ + calculateCenterRotate(e, t) { + let i; + const r = this.getCenterInternal(); + return r !== void 0 && (i = [r[0] - t[0], r[1] - t[1]], Eg(i, e - this.getRotation()), Dp(i, t)), i; + } + /** + * @param {number} resolution Target resolution. + * @param {import("./coordinate.js").Coordinate} anchor Zoom anchor. + * @return {import("./coordinate.js").Coordinate|undefined} Center for resolution and anchor. + */ + calculateCenterZoom(e, t) { + let i; + const r = this.getCenterInternal(), s = this.getResolution(); + if (r !== void 0 && s !== void 0) { + const o = t[0] - e * (t[0] - r[0]) / s, a = t[1] - e * (t[1] - r[1]) / s; + i = [o, a]; + } + return i; + } + /** + * Returns the current viewport size. + * @private + * @param {number} [rotation] Take into account the rotation of the viewport when giving the size + * @return {import("./size.js").Size} Viewport size or `[100, 100]` when no viewport is found. + */ + getViewportSize_(e) { + const t = this.viewportSize_; + if (e) { + const i = t[0], r = t[1]; + return [ + Math.abs(i * Math.cos(e)) + Math.abs(r * Math.sin(e)), + Math.abs(i * Math.sin(e)) + Math.abs(r * Math.cos(e)) + ]; + } + return t; + } + /** + * Stores the viewport size on the view. The viewport size is not read every time from the DOM + * to avoid performance hit and layout reflow. + * This should be done on map size change. + * Note: the constraints are not resolved during an animation to avoid stopping it + * @param {import("./size.js").Size} [size] Viewport size; if undefined, [100, 100] is assumed + */ + setViewportSize(e) { + this.viewportSize_ = Array.isArray(e) ? e.slice() : [100, 100], this.getAnimating() || this.resolveConstraints(0); + } + /** + * Get the view center. + * @return {import("./coordinate.js").Coordinate|undefined} The center of the view. + * @observable + * @api + */ + getCenter() { + const e = this.getCenterInternal(); + return e && pr(e, this.getProjection()); + } + /** + * Get the view center without transforming to user projection. + * @return {import("./coordinate.js").Coordinate|undefined} The center of the view. + */ + getCenterInternal() { + return ( + /** @type {import("./coordinate.js").Coordinate|undefined} */ + this.get(ui.CENTER) + ); + } + /** + * @return {Constraints} Constraints. + */ + getConstraints() { + return this.constraints_; + } + /** + * @return {boolean} Resolution constraint is set + */ + getConstrainResolution() { + return this.get("constrainResolution"); + } + /** + * @param {Array} [hints] Destination array. + * @return {Array} Hint. + */ + getHints(e) { + return e !== void 0 ? (e[0] = this.hints_[0], e[1] = this.hints_[1], e) : this.hints_.slice(); + } + /** + * Calculate the extent for the current view state and the passed box size. + * @param {import("./size.js").Size} [size] The pixel dimensions of the box + * into which the calculated extent should fit. Defaults to the size of the + * map the view is associated with. + * If no map or multiple maps are connected to the view, provide the desired + * box size (e.g. `map.getSize()`). + * @return {import("./extent.js").Extent} Extent. + * @api + */ + calculateExtent(e) { + const t = this.calculateExtentInternal(e); + return pn(t, this.getProjection()); + } + /** + * @param {import("./size.js").Size} [size] Box pixel size. If not provided, + * the map's last known viewport size will be used. + * @return {import("./extent.js").Extent} Extent. + */ + calculateExtentInternal(e) { + e = e || this.getViewportSizeMinusPadding_(); + const t = ( + /** @type {!import("./coordinate.js").Coordinate} */ + this.getCenterInternal() + ); + Ie(t, "The view center is not defined"); + const i = ( + /** @type {!number} */ + this.getResolution() + ); + Ie(i !== void 0, "The view resolution is not defined"); + const r = ( + /** @type {!number} */ + this.getRotation() + ); + return Ie(r !== void 0, "The view rotation is not defined"), va(t, i, r, e); + } + /** + * Get the maximum resolution of the view. + * @return {number} The maximum resolution of the view. + * @api + */ + getMaxResolution() { + return this.maxResolution_; + } + /** + * Get the minimum resolution of the view. + * @return {number} The minimum resolution of the view. + * @api + */ + getMinResolution() { + return this.minResolution_; + } + /** + * Get the maximum zoom level for the view. + * @return {number} The maximum zoom level. + * @api + */ + getMaxZoom() { + return ( + /** @type {number} */ + this.getZoomForResolution(this.minResolution_) + ); + } + /** + * Set a new maximum zoom level for the view. + * @param {number} zoom The maximum zoom level. + * @api + */ + setMaxZoom(e) { + this.applyOptions_(this.getUpdatedOptions_({ maxZoom: e })); + } + /** + * Get the minimum zoom level for the view. + * @return {number} The minimum zoom level. + * @api + */ + getMinZoom() { + return ( + /** @type {number} */ + this.getZoomForResolution(this.maxResolution_) + ); + } + /** + * Set a new minimum zoom level for the view. + * @param {number} zoom The minimum zoom level. + * @api + */ + setMinZoom(e) { + this.applyOptions_(this.getUpdatedOptions_({ minZoom: e })); + } + /** + * Set whether the view should allow intermediary zoom levels. + * @param {boolean} enabled Whether the resolution is constrained. + * @api + */ + setConstrainResolution(e) { + this.applyOptions_(this.getUpdatedOptions_({ constrainResolution: e })); + } + /** + * Get the view projection. + * @return {import("./proj/Projection.js").default} The projection of the view. + * @api + */ + getProjection() { + return this.projection_; + } + /** + * Get the view resolution. + * @return {number|undefined} The resolution of the view. + * @observable + * @api + */ + getResolution() { + return ( + /** @type {number|undefined} */ + this.get(ui.RESOLUTION) + ); + } + /** + * Get the resolutions for the view. This returns the array of resolutions + * passed to the constructor of the View, or undefined if none were given. + * @return {Array|undefined} The resolutions of the view. + * @api + */ + getResolutions() { + return this.resolutions_; + } + /** + * Get the resolution for a provided extent (in map units) and size (in pixels). + * @param {import("./extent.js").Extent} extent Extent. + * @param {import("./size.js").Size} [size] Box pixel size. + * @return {number} The resolution at which the provided extent will render at + * the given size. + * @api + */ + getResolutionForExtent(e, t) { + return this.getResolutionForExtentInternal( + Vt(e, this.getProjection()), + t + ); + } + /** + * Get the resolution for a provided extent (in map units) and size (in pixels). + * @param {import("./extent.js").Extent} extent Extent. + * @param {import("./size.js").Size} [size] Box pixel size. + * @return {number} The resolution at which the provided extent will render at + * the given size. + */ + getResolutionForExtentInternal(e, t) { + t = t || this.getViewportSizeMinusPadding_(); + const i = he(e) / t[0], r = ze(e) / t[1]; + return Math.max(i, r); + } + /** + * Return a function that returns a value between 0 and 1 for a + * resolution. Exponential scaling is assumed. + * @param {number} [power] Power. + * @return {function(number): number} Resolution for value function. + */ + getResolutionForValueFunction(e) { + e = e || 2; + const t = this.getConstrainedResolution(this.maxResolution_), i = this.minResolution_, r = Math.log(t / i) / Math.log(e); + return ( + /** + * @param {number} value Value. + * @return {number} Resolution. + */ + function(s) { + return t / Math.pow(e, s * r); + } + ); + } + /** + * Get the view rotation. + * @return {number} The rotation of the view in radians. + * @observable + * @api + */ + getRotation() { + return ( + /** @type {number} */ + this.get(ui.ROTATION) + ); + } + /** + * Return a function that returns a resolution for a value between + * 0 and 1. Exponential scaling is assumed. + * @param {number} [power] Power. + * @return {function(number): number} Value for resolution function. + */ + getValueForResolutionFunction(e) { + const t = Math.log(e || 2), i = this.getConstrainedResolution(this.maxResolution_), r = this.minResolution_, s = Math.log(i / r) / t; + return ( + /** + * @param {number} resolution Resolution. + * @return {number} Value. + */ + function(o) { + return Math.log(i / o) / t / s; + } + ); + } + /** + * Returns the size of the viewport minus padding. + * @private + * @param {number} [rotation] Take into account the rotation of the viewport when giving the size + * @return {import("./size.js").Size} Viewport size reduced by the padding. + */ + getViewportSizeMinusPadding_(e) { + let t = this.getViewportSize_(e); + const i = this.padding_; + return i && (t = [ + t[0] - i[1] - i[3], + t[1] - i[0] - i[2] + ]), t; + } + /** + * @return {State} View state. + */ + getState() { + const e = this.getProjection(), t = this.getResolution(), i = this.getRotation(); + let r = ( + /** @type {import("./coordinate.js").Coordinate} */ + this.getCenterInternal() + ); + const s = this.padding_; + if (s) { + const o = this.getViewportSizeMinusPadding_(); + r = hh( + r, + this.getViewportSize_(), + [o[0] / 2 + s[3], o[1] / 2 + s[0]], + t, + i + ); + } + return { + center: r.slice(0), + projection: e !== void 0 ? e : null, + resolution: t, + nextCenter: this.nextCenter_, + nextResolution: this.nextResolution_, + nextRotation: this.nextRotation_, + rotation: i, + zoom: this.getZoom() + }; + } + /** + * @return {ViewStateLayerStateExtent} Like `FrameState`, but just `viewState` and `extent`. + */ + getViewStateAndExtent() { + return { + viewState: this.getState(), + extent: this.calculateExtent() + }; + } + /** + * Get the current zoom level. This method may return non-integer zoom levels + * if the view does not constrain the resolution, or if an interaction or + * animation is underway. + * @return {number|undefined} Zoom. + * @api + */ + getZoom() { + let e; + const t = this.getResolution(); + return t !== void 0 && (e = this.getZoomForResolution(t)), e; + } + /** + * Get the zoom level for a resolution. + * @param {number} resolution The resolution. + * @return {number|undefined} The zoom level for the provided resolution. + * @api + */ + getZoomForResolution(e) { + let t = this.minZoom_ || 0, i, r; + if (this.resolutions_) { + const s = uc(this.resolutions_, e, 1); + t = s, i = this.resolutions_[s], s == this.resolutions_.length - 1 ? r = 2 : r = i / this.resolutions_[s + 1]; + } else + i = this.maxResolution_, r = this.zoomFactor_; + return t + Math.log(i / e) / Math.log(r); + } + /** + * Get the resolution for a zoom level. + * @param {number} zoom Zoom level. + * @return {number} The view resolution for the provided zoom level. + * @api + */ + getResolutionForZoom(e) { + var t; + if ((t = this.resolutions_) != null && t.length) { + if (this.resolutions_.length === 1) + return this.resolutions_[0]; + const i = ue( + Math.floor(e), + 0, + this.resolutions_.length - 2 + ), r = this.resolutions_[i] / this.resolutions_[i + 1]; + return this.resolutions_[i] / Math.pow(r, ue(e - i, 0, 1)); + } + return this.maxResolution_ / Math.pow(this.zoomFactor_, e - this.minZoom_); + } + /** + * Fit the given geometry or extent based on the given map size and border. + * The size is pixel dimensions of the box to fit the extent into. + * In most cases you will want to use the map size, that is `map.getSize()`. + * Takes care of the map angle. + * @param {import("./geom/SimpleGeometry.js").default|import("./extent.js").Extent} geometryOrExtent The geometry or + * extent to fit the view to. + * @param {FitOptions} [options] Options. + * @api + */ + fit(e, t) { + let i; + if (Ie( + Array.isArray(e) || typeof /** @type {?} */ + e.getSimplifiedGeometry == "function", + "Invalid extent or geometry provided as `geometry`" + ), Array.isArray(e)) { + Ie( + !wn(e), + "Cannot fit empty extent provided as `geometry`" + ); + const r = Vt(e, this.getProjection()); + i = co(r); + } else if (e.getType() === "Circle") { + const r = Vt( + e.getExtent(), + this.getProjection() + ); + i = co(r), i.rotate(this.getRotation(), Dt(r)); + } else { + const r = gt(); + r ? i = /** @type {import("./geom/SimpleGeometry.js").default} */ + e.clone().transform(r, this.getProjection()) : i = e; + } + this.fitInternal(i, t); + } + /** + * Calculate rotated extent + * @param {import("./geom/SimpleGeometry.js").default} geometry The geometry. + * @return {import("./extent").Extent} The rotated extent for the geometry. + */ + rotatedExtentForGeometry(e) { + const t = this.getRotation(), i = Math.cos(t), r = Math.sin(-t), s = e.getFlatCoordinates(), o = e.getStride(); + let a = 1 / 0, l = 1 / 0, A = -1 / 0, c = -1 / 0; + for (let h = 0, u = s.length; h < u; h += o) { + const g = s[h] * i - s[h + 1] * r, d = s[h] * r + s[h + 1] * i; + a = Math.min(a, g), l = Math.min(l, d), A = Math.max(A, g), c = Math.max(c, d); + } + return [a, l, A, c]; + } + /** + * @param {import("./geom/SimpleGeometry.js").default} geometry The geometry. + * @param {FitOptions} [options] Options. + */ + fitInternal(e, t) { + t = t || {}; + let i = t.size; + i || (i = this.getViewportSizeMinusPadding_()); + const r = t.padding !== void 0 ? t.padding : [0, 0, 0, 0], s = t.nearest !== void 0 ? t.nearest : !1; + let o; + t.minResolution !== void 0 ? o = t.minResolution : t.maxZoom !== void 0 ? o = this.getResolutionForZoom(t.maxZoom) : o = 0; + const a = this.rotatedExtentForGeometry(e); + let l = this.getResolutionForExtentInternal(a, [ + i[0] - r[1] - r[3], + i[1] - r[0] - r[2] + ]); + l = isNaN(l) ? o : Math.max(l, o), l = this.getConstrainedResolution(l, s ? 0 : 1); + const A = this.getRotation(), c = Math.sin(A), h = Math.cos(A), u = Dt(a); + u[0] += (r[1] - r[3]) / 2 * l, u[1] += (r[0] - r[2]) / 2 * l; + const g = u[0] * h - u[1] * c, d = u[1] * h + u[0] * c, m = this.getConstrainedCenter([g, d], l), f = t.callback ? t.callback : io; + t.duration !== void 0 ? this.animateInternal( + { + resolution: l, + center: m, + duration: t.duration, + easing: t.easing + }, + f + ) : (this.targetResolution_ = l, this.targetCenter_ = m, this.applyTargetState_(!1, !0), Ml(f, !0)); + } + /** + * Center on coordinate and view position. + * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. + * @param {import("./size.js").Size} size Box pixel size. + * @param {import("./pixel.js").Pixel} position Position on the view to center on. + * @api + */ + centerOn(e, t, i) { + this.centerOnInternal( + Ue(e, this.getProjection()), + t, + i + ); + } + /** + * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. + * @param {import("./size.js").Size} size Box pixel size. + * @param {import("./pixel.js").Pixel} position Position on the view to center on. + */ + centerOnInternal(e, t, i) { + this.setCenterInternal( + hh( + e, + t, + i, + this.getResolution(), + this.getRotation() + ) + ); + } + /** + * Calculates the shift between map and viewport center. + * @param {import("./coordinate.js").Coordinate} center Center. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {import("./size.js").Size} size Size. + * @return {Array|undefined} Center shift. + */ + calculateCenterShift(e, t, i, r) { + let s; + const o = this.padding_; + if (o && e) { + const a = this.getViewportSizeMinusPadding_(-i), l = hh( + e, + r, + [a[0] / 2 + o[3], a[1] / 2 + o[0]], + t, + i + ); + s = [ + e[0] - l[0], + e[1] - l[1] + ]; + } + return s; + } + /** + * @return {boolean} Is defined. + */ + isDef() { + return !!this.getCenterInternal() && this.getResolution() !== void 0; + } + /** + * Adds relative coordinates to the center of the view. Any extent constraint will apply. + * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add. + * @api + */ + adjustCenter(e) { + const t = pr(this.targetCenter_, this.getProjection()); + this.setCenter([ + t[0] + e[0], + t[1] + e[1] + ]); + } + /** + * Adds relative coordinates to the center of the view. Any extent constraint will apply. + * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add. + */ + adjustCenterInternal(e) { + const t = this.targetCenter_; + this.setCenterInternal([ + t[0] + e[0], + t[1] + e[1] + ]); + } + /** + * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution + * constraint will apply. + * @param {number} ratio The ratio to apply on the view resolution. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + * @api + */ + adjustResolution(e, t) { + t = t && Ue(t, this.getProjection()), this.adjustResolutionInternal(e, t); + } + /** + * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution + * constraint will apply. + * @param {number} ratio The ratio to apply on the view resolution. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + */ + adjustResolutionInternal(e, t) { + const i = this.getAnimating() || this.getInteracting(), r = this.getViewportSize_(this.getRotation()), s = this.constraints_.resolution( + this.targetResolution_ * e, + 0, + r, + i + ); + t && (this.targetCenter_ = this.calculateCenterZoom(s, t)), this.targetResolution_ *= e, this.applyTargetState_(); + } + /** + * Adds a value to the view zoom level, optionally using an anchor. Any resolution + * constraint will apply. + * @param {number} delta Relative value to add to the zoom level. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + * @api + */ + adjustZoom(e, t) { + this.adjustResolution(Math.pow(this.zoomFactor_, -e), t); + } + /** + * Adds a value to the view rotation, optionally using an anchor. Any rotation + * constraint will apply. + * @param {number} delta Relative value to add to the zoom rotation, in radians. + * @param {import("./coordinate.js").Coordinate} [anchor] The rotation center. + * @api + */ + adjustRotation(e, t) { + t && (t = Ue(t, this.getProjection())), this.adjustRotationInternal(e, t); + } + /** + * @param {number} delta Relative value to add to the zoom rotation, in radians. + * @param {import("./coordinate.js").Coordinate} [anchor] The rotation center. + */ + adjustRotationInternal(e, t) { + const i = this.getAnimating() || this.getInteracting(), r = this.constraints_.rotation( + this.targetRotation_ + e, + i + ); + t && (this.targetCenter_ = this.calculateCenterRotate(r, t)), this.targetRotation_ += e, this.applyTargetState_(); + } + /** + * Set the center of the current view. Any extent constraint will apply. + * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view. + * @observable + * @api + */ + setCenter(e) { + this.setCenterInternal( + e && Ue(e, this.getProjection()) + ); + } + /** + * Set the center using the view projection (not the user projection). + * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view. + */ + setCenterInternal(e) { + this.targetCenter_ = e, this.applyTargetState_(); + } + /** + * @param {import("./ViewHint.js").default} hint Hint. + * @param {number} delta Delta. + * @return {number} New value. + */ + setHint(e, t) { + return this.hints_[e] += t, this.changed(), this.hints_[e]; + } + /** + * Set the resolution for this view. Any resolution constraint will apply. + * @param {number|undefined} resolution The resolution of the view. + * @observable + * @api + */ + setResolution(e) { + this.targetResolution_ = e, this.applyTargetState_(); + } + /** + * Set the rotation for this view. Any rotation constraint will apply. + * @param {number} rotation The rotation of the view in radians. + * @observable + * @api + */ + setRotation(e) { + this.targetRotation_ = e, this.applyTargetState_(); + } + /** + * Zoom to a specific zoom level. Any resolution constrain will apply. + * @param {number} zoom Zoom level. + * @api + */ + setZoom(e) { + this.setResolution(this.getResolutionForZoom(e)); + } + /** + * Recompute rotation/resolution/center based on target values. + * Note: we have to compute rotation first, then resolution and center considering that + * parameters can influence one another in case a view extent constraint is present. + * @param {boolean} [doNotCancelAnims] Do not cancel animations. + * @param {boolean} [forceMoving] Apply constraints as if the view is moving. + * @private + */ + applyTargetState_(e, t) { + const i = this.getAnimating() || this.getInteracting() || t, r = this.constraints_.rotation( + this.targetRotation_, + i + ), s = this.getViewportSize_(r), o = this.constraints_.resolution( + this.targetResolution_, + 0, + s, + i + ), a = this.constraints_.center( + this.targetCenter_, + o, + s, + i, + this.calculateCenterShift( + this.targetCenter_, + o, + r, + s + ) + ); + this.get(ui.ROTATION) !== r && this.set(ui.ROTATION, r), this.get(ui.RESOLUTION) !== o && (this.set(ui.RESOLUTION, o), this.set("zoom", this.getZoom(), !0)), (!a || !this.get(ui.CENTER) || !$i(this.get(ui.CENTER), a)) && this.set(ui.CENTER, a), this.getAnimating() && !e && this.cancelAnimations(), this.cancelAnchor_ = void 0; + } + /** + * If any constraints need to be applied, an animation will be triggered. + * This is typically done on interaction end. + * Note: calling this with a duration of 0 will apply the constrained values straight away, + * without animation. + * @param {number} [duration] The animation duration in ms. + * @param {number} [resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + */ + resolveConstraints(e, t, i) { + e = e !== void 0 ? e : 200; + const r = t || 0, s = this.constraints_.rotation(this.targetRotation_), o = this.getViewportSize_(s), a = this.constraints_.resolution( + this.targetResolution_, + r, + o + ), l = this.constraints_.center( + this.targetCenter_, + a, + o, + !1, + this.calculateCenterShift( + this.targetCenter_, + a, + s, + o + ) + ); + if (e === 0 && !this.cancelAnchor_) { + this.targetResolution_ = a, this.targetRotation_ = s, this.targetCenter_ = l, this.applyTargetState_(); + return; + } + i = i || (e === 0 ? this.cancelAnchor_ : void 0), this.cancelAnchor_ = void 0, (this.getResolution() !== a || this.getRotation() !== s || !this.getCenterInternal() || !$i(this.getCenterInternal(), l)) && (this.getAnimating() && this.cancelAnimations(), this.animateInternal({ + rotation: s, + center: l, + resolution: a, + duration: e, + easing: rs, + anchor: i + })); + } + /** + * Notify the View that an interaction has started. + * The view state will be resolved to a stable one if needed + * (depending on its constraints). + * @api + */ + beginInteraction() { + this.resolveConstraints(0), this.setHint(Me.INTERACTING, 1); + } + /** + * Notify the View that an interaction has ended. The view state will be resolved + * to a stable one if needed (depending on its constraints). + * @param {number} [duration] Animation duration in ms. + * @param {number} [resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + * @api + */ + endInteraction(e, t, i) { + i = i && Ue(i, this.getProjection()), this.endInteractionInternal(e, t, i); + } + /** + * Notify the View that an interaction has ended. The view state will be resolved + * to a stable one if needed (depending on its constraints). + * @param {number} [duration] Animation duration in ms. + * @param {number} [resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [anchor] The origin of the transformation. + */ + endInteractionInternal(e, t, i) { + this.getInteracting() && (this.setHint(Me.INTERACTING, -1), this.resolveConstraints(e, t, i)); + } + /** + * Get a valid position for the view center according to the current constraints. + * @param {import("./coordinate.js").Coordinate|undefined} targetCenter Target center position. + * @param {number} [targetResolution] Target resolution. If not supplied, the current one will be used. + * This is useful to guess a valid center position at a different zoom level. + * @return {import("./coordinate.js").Coordinate|undefined} Valid center position. + */ + getConstrainedCenter(e, t) { + const i = this.getViewportSize_(this.getRotation()); + return this.constraints_.center( + e, + t || this.getResolution(), + i + ); + } + /** + * Get a valid zoom level according to the current view constraints. + * @param {number|undefined} targetZoom Target zoom. + * @param {number} [direction=0] Indicate which resolution should be used + * by a renderer if the view resolution does not match any resolution of the tile source. + * If 0, the nearest resolution will be used. If 1, the nearest lower resolution + * will be used. If -1, the nearest higher resolution will be used. + * @return {number|undefined} Valid zoom level. + */ + getConstrainedZoom(e, t) { + const i = this.getResolutionForZoom(e); + return this.getZoomForResolution( + this.getConstrainedResolution(i, t) + ); + } + /** + * Get a valid resolution according to the current view constraints. + * @param {number|undefined} targetResolution Target resolution. + * @param {number} [direction=0] Indicate which resolution should be used + * by a renderer if the view resolution does not match any resolution of the tile source. + * If 0, the nearest resolution will be used. If 1, the nearest lower resolution + * will be used. If -1, the nearest higher resolution will be used. + * @return {number|undefined} Valid resolution. + */ + getConstrainedResolution(e, t) { + t = t || 0; + const i = this.getViewportSize_(this.getRotation()); + return this.constraints_.resolution(e, t, i); + } +} +function Ml(n, e) { + setTimeout(function() { + n(e); + }, 0); +} +function ow(n) { + if (n.extent !== void 0) { + const t = n.smoothExtentConstraint !== void 0 ? n.smoothExtentConstraint : !0; + return Df(n.extent, n.constrainOnlyCenter, t); + } + const e = _g(n.projection, "EPSG:3857"); + if (n.multiWorld !== !0 && e.isGlobal()) { + const t = e.getExtent().slice(); + return t[0] = -1 / 0, t[2] = 1 / 0, Df(t, !1, !1); + } + return tw; +} +function aw(n) { + let e, t, i, o = n.minZoom !== void 0 ? n.minZoom : ch, a = n.maxZoom !== void 0 ? n.maxZoom : 28; + const l = n.zoomFactor !== void 0 ? n.zoomFactor : 2, A = n.multiWorld !== void 0 ? n.multiWorld : !1, c = n.smoothResolutionConstraint !== void 0 ? n.smoothResolutionConstraint : !0, h = n.showFullExtent !== void 0 ? n.showFullExtent : !1, u = _g(n.projection, "EPSG:3857"), g = u.getExtent(); + let d = n.constrainOnlyCenter, m = n.extent; + if (!A && !m && u.isGlobal() && (d = !1, m = g), n.resolutions !== void 0) { + const f = n.resolutions; + t = f[o], i = f[a] !== void 0 ? f[a] : f[f.length - 1], n.constrainResolution ? e = iw( + f, + c, + !d && m, + h + ) : e = Lf( + t, + i, + c, + !d && m, + h + ); + } else { + const E = (g ? Math.max(he(g), ze(g)) : ( + // use an extent that can fit the whole world if need be + 360 * ao.degrees / u.getMetersPerUnit() + )) / ho / Math.pow(2, ch), p = E / Math.pow(2, 28 - ch); + t = n.maxResolution, t !== void 0 ? o = 0 : t = E / Math.pow(l, o), i = n.minResolution, i === void 0 && (n.maxZoom !== void 0 ? n.maxResolution !== void 0 ? i = t / Math.pow(l, a) : i = E / Math.pow(l, a) : i = p), a = o + Math.floor( + Math.log(t / i) / Math.log(l) + ), i = t / Math.pow(l, a - o), n.constrainResolution ? e = nw( + l, + t, + i, + c, + !d && m, + h + ) : e = Lf( + t, + i, + c, + !d && m, + h + ); + } + return { + constraint: e, + maxResolution: t, + minResolution: i, + minZoom: o, + zoomFactor: l + }; +} +function lw(n) { + if (n.enableRotation !== void 0 ? n.enableRotation : !0) { + const t = n.constrainRotation; + return t === void 0 || t === !0 ? sw() : t === !1 ? Ff : typeof t == "number" ? rw(t) : Ff; + } + return Pg; +} +function Aw(n) { + return !(n.sourceCenter && n.targetCenter && !$i(n.sourceCenter, n.targetCenter) || n.sourceResolution !== n.targetResolution || n.sourceRotation !== n.targetRotation); +} +function hh(n, e, t, i, r) { + const s = Math.cos(-r); + let o = Math.sin(-r), a = n[0] * s - n[1] * o, l = n[1] * s + n[0] * o; + a += (e[0] / 2 - t[0]) * i, l += (t[1] - e[1] / 2) * i, o = -o; + const A = a * s - l * o, c = l * s + a * o; + return [A, c]; +} +class Qo extends qp { + /** + * @param {Options} options Layer options. + */ + constructor(e) { + const t = Object.assign({}, e); + delete t.source, super(t), this.on, this.once, this.un, this.mapPrecomposeKey_ = null, this.mapRenderKey_ = null, this.sourceChangeKey_ = null, this.renderer_ = null, this.sourceReady_ = !1, this.rendered = !1, e.render && (this.render = e.render), e.map && this.setMap(e.map), this.addChangeListener( + Le.SOURCE, + this.handleSourcePropertyChange_ + ); + const i = e.source ? ( + /** @type {SourceType} */ + e.source + ) : null; + this.setSource(i); + } + /** + * @param {Array} [array] Array of layers (to be modified in place). + * @return {Array} Array of layers. + * @override + */ + getLayersArray(e) { + return e = e || [], e.push(this), e; + } + /** + * @param {Array} [states] Optional list of layer states (to be modified in place). + * @return {Array} List of layer states. + * @override + */ + getLayerStatesArray(e) { + return e = e || [], e.push(this.getLayerState()), e; + } + /** + * Get the layer source. + * @return {SourceType|null} The layer source (or `null` if not yet set). + * @observable + * @api + */ + getSource() { + return ( + /** @type {SourceType} */ + this.get(Le.SOURCE) || null + ); + } + /** + * @return {SourceType|null} The source being rendered. + */ + getRenderSource() { + return this.getSource(); + } + /** + * @return {import("../source/Source.js").State} Source state. + * @override + */ + getSourceState() { + const e = this.getSource(); + return e ? e.getState() : "undefined"; + } + /** + * @private + */ + handleSourceChange_() { + this.changed(), !(this.sourceReady_ || this.getSource().getState() !== "ready") && (this.sourceReady_ = !0, this.dispatchEvent("sourceready")); + } + /** + * @private + */ + handleSourcePropertyChange_() { + this.sourceChangeKey_ && (Re(this.sourceChangeKey_), this.sourceChangeKey_ = null), this.sourceReady_ = !1; + const e = this.getSource(); + e && (this.sourceChangeKey_ = ie( + e, + j.CHANGE, + this.handleSourceChange_, + this + ), e.getState() === "ready" && (this.sourceReady_ = !0, setTimeout(() => { + this.dispatchEvent("sourceready"); + }, 0))), this.changed(); + } + /** + * @param {import("../pixel").Pixel} pixel Pixel. + * @return {Promise>} Promise that resolves with + * an array of features. + */ + getFeatures(e) { + return this.renderer_ ? this.renderer_.getFeatures(e) : Promise.resolve([]); + } + /** + * @param {import("../pixel").Pixel} pixel Pixel. + * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data. + */ + getData(e) { + return !this.renderer_ || !this.rendered ? null : this.renderer_.getData(e); + } + /** + * The layer is visible on the map view, i.e. within its min/max resolution or zoom and + * extent, not set to `visible: false`, and not inside a layer group that is set + * to `visible: false`. + * @param {View|import("../View.js").ViewStateLayerStateExtent} [view] View or {@link import("../Map.js").FrameState}. + * Only required when the layer is not added to a map. + * @return {boolean} The layer is visible in the map view. + * @api + */ + isVisible(e) { + let t; + const i = this.getMapInternal(); + !e && i && (e = i.getView()), e instanceof an ? t = { + viewState: e.getState(), + extent: e.calculateExtent() + } : t = e, !t.layerStatesArray && i && (t.layerStatesArray = i.getLayerGroup().getLayerStatesArray()); + let r; + t.layerStatesArray ? r = t.layerStatesArray.find( + (o) => o.layer === this + ) : r = this.getLayerState(); + const s = this.getExtent(); + return Mg(r, t.viewState) && (!s || He(s, t.extent)); + } + /** + * Get the attributions of the source of this layer for the given view. + * @param {View|import("../View.js").ViewStateLayerStateExtent} [view] View or {@link import("../Map.js").FrameState}. + * Only required when the layer is not added to a map. + * @return {Array} Attributions for this layer at the given view. + * @api + */ + getAttributions(e) { + var s; + if (!this.isVisible(e)) + return []; + const t = (s = this.getSource()) == null ? void 0 : s.getAttributions(); + if (!t) + return []; + const i = e instanceof an ? e.getViewStateAndExtent() : e; + let r = t(i); + return Array.isArray(r) || (r = [r]), r; + } + /** + * In charge to manage the rendering of the layer. One layer type is + * bounded with one layer renderer. + * @param {?import("../Map.js").FrameState} frameState Frame state. + * @param {HTMLElement} target Target which the renderer may (but need not) use + * for rendering its content. + * @return {HTMLElement|null} The rendered element. + */ + render(e, t) { + const i = this.getRenderer(); + return i.prepareFrame(e) ? (this.rendered = !0, i.renderFrame(e, t)) : null; + } + /** + * Called when a layer is not visible during a map render. + */ + unrender() { + this.rendered = !1; + } + /** @return {string} Declutter */ + getDeclutter() { + } + /** + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {import("../layer/Layer.js").State} layerState Layer state. + */ + renderDeclutter(e, t) { + } + /** + * When the renderer follows a layout -> render approach, do the final rendering here. + * @param {import('../Map.js').FrameState} frameState Frame state + */ + renderDeferred(e) { + const t = this.getRenderer(); + t && t.renderDeferred(e); + } + /** + * For use inside the library only. + * @param {import("../Map.js").default|null} map Map. + */ + setMapInternal(e) { + e || this.unrender(), this.set(Le.MAP, e); + } + /** + * For use inside the library only. + * @return {import("../Map.js").default|null} Map. + */ + getMapInternal() { + return this.get(Le.MAP); + } + /** + * Sets the layer to be rendered on top of other layers on a map. The map will + * not manage this layer in its layers collection. This + * is useful for temporary layers. To remove an unmanaged layer from the map, + * use `#setMap(null)`. + * + * To add the layer to a map and have it managed by the map, use + * {@link module:ol/Map~Map#addLayer} instead. + * @param {import("../Map.js").default|null} map Map. + * @api + */ + setMap(e) { + this.mapPrecomposeKey_ && (Re(this.mapPrecomposeKey_), this.mapPrecomposeKey_ = null), e || this.changed(), this.mapRenderKey_ && (Re(this.mapRenderKey_), this.mapRenderKey_ = null), e && (this.mapPrecomposeKey_ = ie( + e, + yt.PRECOMPOSE, + this.handlePrecompose_, + this + ), this.mapRenderKey_ = ie(this, j.CHANGE, e.render, e), this.changed()); + } + /** + * @param {import("../events/Event.js").default} renderEvent Render event + * @private + */ + handlePrecompose_(e) { + const t = ( + /** @type {import("../render/Event.js").default} */ + e.frameState.layerStatesArray + ), i = this.getLayerState(!1); + Ie( + !t.some( + (r) => r.layer === i.layer + ), + "A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both." + ), t.push(i); + } + /** + * Set the layer source. + * @param {SourceType|null} source The layer source. + * @observable + * @api + */ + setSource(e) { + this.set(Le.SOURCE, e); + } + /** + * Get the renderer for this layer. + * @return {RendererType|null} The layer renderer. + */ + getRenderer() { + return this.renderer_ || (this.renderer_ = this.createRenderer()), this.renderer_; + } + /** + * @return {boolean} The layer has a renderer. + */ + hasRenderer() { + return !!this.renderer_; + } + /** + * Create a renderer for this layer. + * @return {RendererType} A layer renderer. + * @protected + */ + createRenderer() { + return null; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.renderer_ && (this.renderer_.dispose(), delete this.renderer_), this.setSource(null), super.disposeInternal(); + } +} +function Mg(n, e) { + if (!n.visible) + return !1; + const t = e.resolution; + if (t < n.minResolution || t >= n.maxResolution) + return !1; + const i = e.zoom; + return i > n.minZoom && i <= n.maxZoom; +} +function Kp(n, e, t = 0, i = n.length - 1, r = cw) { + for (; i > t; ) { + if (i - t > 600) { + const l = i - t + 1, A = e - t + 1, c = Math.log(l), h = 0.5 * Math.exp(2 * c / 3), u = 0.5 * Math.sqrt(c * h * (l - h) / l) * (A - l / 2 < 0 ? -1 : 1), g = Math.max(t, Math.floor(e - A * h / l + u)), d = Math.min(i, Math.floor(e + (l - A) * h / l + u)); + Kp(n, e, g, d, r); + } + const s = n[e]; + let o = t, a = i; + for (Wo(n, t, e), r(n[i], s) > 0 && Wo(n, t, i); o < a; ) { + for (Wo(n, o, a), o++, a--; r(n[o], s) < 0; ) o++; + for (; r(n[a], s) > 0; ) a--; + } + r(n[t], s) === 0 ? Wo(n, t, a) : (a++, Wo(n, a, i)), a <= e && (t = a + 1), e <= a && (i = a - 1); + } +} +function Wo(n, e, t) { + const i = n[e]; + n[e] = n[t], n[t] = i; +} +function cw(n, e) { + return n < e ? -1 : n > e ? 1 : 0; +} +let Ng = class { + constructor(e = 9) { + this._maxEntries = Math.max(4, e), this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)), this.clear(); + } + all() { + return this._all(this.data, []); + } + search(e) { + let t = this.data; + const i = []; + if (!Ol(e, t)) return i; + const r = this.toBBox, s = []; + for (; t; ) { + for (let o = 0; o < t.children.length; o++) { + const a = t.children[o], l = t.leaf ? r(a) : a; + Ol(e, l) && (t.leaf ? i.push(a) : gh(e, l) ? this._all(a, i) : s.push(a)); + } + t = s.pop(); + } + return i; + } + collides(e) { + let t = this.data; + if (!Ol(e, t)) return !1; + const i = []; + for (; t; ) { + for (let r = 0; r < t.children.length; r++) { + const s = t.children[r], o = t.leaf ? this.toBBox(s) : s; + if (Ol(e, o)) { + if (t.leaf || gh(e, o)) return !0; + i.push(s); + } + } + t = i.pop(); + } + return !1; + } + load(e) { + if (!(e && e.length)) return this; + if (e.length < this._minEntries) { + for (let i = 0; i < e.length; i++) + this.insert(e[i]); + return this; + } + let t = this._build(e.slice(), 0, e.length - 1, 0); + if (!this.data.children.length) + this.data = t; + else if (this.data.height === t.height) + this._splitRoot(this.data, t); + else { + if (this.data.height < t.height) { + const i = this.data; + this.data = t, t = i; + } + this._insert(t, this.data.height - t.height - 1, !0); + } + return this; + } + insert(e) { + return e && this._insert(e, this.data.height - 1), this; + } + clear() { + return this.data = bs([]), this; + } + remove(e, t) { + if (!e) return this; + let i = this.data; + const r = this.toBBox(e), s = [], o = []; + let a, l, A; + for (; i || s.length; ) { + if (i || (i = s.pop(), l = s[s.length - 1], a = o.pop(), A = !0), i.leaf) { + const c = hw(e, i.children, t); + if (c !== -1) + return i.children.splice(c, 1), s.push(i), this._condense(s), this; + } + !A && !i.leaf && gh(i, r) ? (s.push(i), o.push(a), a = 0, l = i, i = i.children[0]) : l ? (a++, i = l.children[a], A = !1) : i = null; + } + return this; + } + toBBox(e) { + return e; + } + compareMinX(e, t) { + return e.minX - t.minX; + } + compareMinY(e, t) { + return e.minY - t.minY; + } + toJSON() { + return this.data; + } + fromJSON(e) { + return this.data = e, this; + } + _all(e, t) { + const i = []; + for (; e; ) + e.leaf ? t.push(...e.children) : i.push(...e.children), e = i.pop(); + return t; + } + _build(e, t, i, r) { + const s = i - t + 1; + let o = this._maxEntries, a; + if (s <= o) + return a = bs(e.slice(t, i + 1)), Is(a, this.toBBox), a; + r || (r = Math.ceil(Math.log(s) / Math.log(o)), o = Math.ceil(s / Math.pow(o, r - 1))), a = bs([]), a.leaf = !1, a.height = r; + const l = Math.ceil(s / o), A = l * Math.ceil(Math.sqrt(o)); + bf(e, t, i, A, this.compareMinX); + for (let c = t; c <= i; c += A) { + const h = Math.min(c + A - 1, i); + bf(e, c, h, l, this.compareMinY); + for (let u = c; u <= h; u += l) { + const g = Math.min(u + l - 1, h); + a.children.push(this._build(e, u, g, r - 1)); + } + } + return Is(a, this.toBBox), a; + } + _chooseSubtree(e, t, i, r) { + for (; r.push(t), !(t.leaf || r.length - 1 === i); ) { + let s = 1 / 0, o = 1 / 0, a; + for (let l = 0; l < t.children.length; l++) { + const A = t.children[l], c = uh(A), h = dw(e, A) - c; + h < o ? (o = h, s = c < s ? c : s, a = A) : h === o && c < s && (s = c, a = A); + } + t = a || t.children[0]; + } + return t; + } + _insert(e, t, i) { + const r = i ? e : this.toBBox(e), s = [], o = this._chooseSubtree(r, this.data, t, s); + for (o.children.push(e), la(o, r); t >= 0 && s[t].children.length > this._maxEntries; ) + this._split(s, t), t--; + this._adjustParentBBoxes(r, s, t); + } + // split overflowed node into two + _split(e, t) { + const i = e[t], r = i.children.length, s = this._minEntries; + this._chooseSplitAxis(i, s, r); + const o = this._chooseSplitIndex(i, s, r), a = bs(i.children.splice(o, i.children.length - o)); + a.height = i.height, a.leaf = i.leaf, Is(i, this.toBBox), Is(a, this.toBBox), t ? e[t - 1].children.push(a) : this._splitRoot(i, a); + } + _splitRoot(e, t) { + this.data = bs([e, t]), this.data.height = e.height + 1, this.data.leaf = !1, Is(this.data, this.toBBox); + } + _chooseSplitIndex(e, t, i) { + let r, s = 1 / 0, o = 1 / 0; + for (let a = t; a <= i - t; a++) { + const l = aa(e, 0, a, this.toBBox), A = aa(e, a, i, this.toBBox), c = fw(l, A), h = uh(l) + uh(A); + c < s ? (s = c, r = a, o = h < o ? h : o) : c === s && h < o && (o = h, r = a); + } + return r || i - t; + } + // sorts node children by the best axis for split + _chooseSplitAxis(e, t, i) { + const r = e.leaf ? this.compareMinX : uw, s = e.leaf ? this.compareMinY : gw, o = this._allDistMargin(e, t, i, r), a = this._allDistMargin(e, t, i, s); + o < a && e.children.sort(r); + } + // total margin of all possible split distributions where each node is at least m full + _allDistMargin(e, t, i, r) { + e.children.sort(r); + const s = this.toBBox, o = aa(e, 0, t, s), a = aa(e, i - t, i, s); + let l = Nl(o) + Nl(a); + for (let A = t; A < i - t; A++) { + const c = e.children[A]; + la(o, e.leaf ? s(c) : c), l += Nl(o); + } + for (let A = i - t - 1; A >= t; A--) { + const c = e.children[A]; + la(a, e.leaf ? s(c) : c), l += Nl(a); + } + return l; + } + _adjustParentBBoxes(e, t, i) { + for (let r = i; r >= 0; r--) + la(t[r], e); + } + _condense(e) { + for (let t = e.length - 1, i; t >= 0; t--) + e[t].children.length === 0 ? t > 0 ? (i = e[t - 1].children, i.splice(i.indexOf(e[t]), 1)) : this.clear() : Is(e[t], this.toBBox); + } +}; +function hw(n, e, t) { + if (!t) return e.indexOf(n); + for (let i = 0; i < e.length; i++) + if (t(n, e[i])) return i; + return -1; +} +function Is(n, e) { + aa(n, 0, n.children.length, e, n); +} +function aa(n, e, t, i, r) { + r || (r = bs(null)), r.minX = 1 / 0, r.minY = 1 / 0, r.maxX = -1 / 0, r.maxY = -1 / 0; + for (let s = e; s < t; s++) { + const o = n.children[s]; + la(r, n.leaf ? i(o) : o); + } + return r; +} +function la(n, e) { + return n.minX = Math.min(n.minX, e.minX), n.minY = Math.min(n.minY, e.minY), n.maxX = Math.max(n.maxX, e.maxX), n.maxY = Math.max(n.maxY, e.maxY), n; +} +function uw(n, e) { + return n.minX - e.minX; +} +function gw(n, e) { + return n.minY - e.minY; +} +function uh(n) { + return (n.maxX - n.minX) * (n.maxY - n.minY); +} +function Nl(n) { + return n.maxX - n.minX + (n.maxY - n.minY); +} +function dw(n, e) { + return (Math.max(e.maxX, n.maxX) - Math.min(e.minX, n.minX)) * (Math.max(e.maxY, n.maxY) - Math.min(e.minY, n.minY)); +} +function fw(n, e) { + const t = Math.max(n.minX, e.minX), i = Math.max(n.minY, e.minY), r = Math.min(n.maxX, e.maxX), s = Math.min(n.maxY, e.maxY); + return Math.max(0, r - t) * Math.max(0, s - i); +} +function gh(n, e) { + return n.minX <= e.minX && n.minY <= e.minY && e.maxX <= n.maxX && e.maxY <= n.maxY; +} +function Ol(n, e) { + return e.minX <= n.maxX && e.minY <= n.maxY && e.maxX >= n.minX && e.maxY >= n.minY; +} +function bs(n) { + return { + children: n, + height: 1, + leaf: !0, + minX: 1 / 0, + minY: 1 / 0, + maxX: -1 / 0, + maxY: -1 / 0 + }; +} +function bf(n, e, t, i, r) { + const s = [e, t]; + for (; s.length; ) { + if (t = s.pop(), e = s.pop(), t - e <= i) continue; + const o = e + Math.ceil((t - e) / i / 2) * i; + Kp(n, o, e, t, r), s.push(e, o, o, t); + } +} +function TO(n, e, t) { + return t === void 0 && (t = [0, 0]), t[0] = n[0] + 2 * e, t[1] = n[1] + 2 * e, t; +} +function Pf(n) { + return n[0] > 0 && n[1] > 0; +} +function Wp(n, e, t) { + return t === void 0 && (t = [0, 0]), t[0] = n[0] * e + 0.5 | 0, t[1] = n[1] * e + 0.5 | 0, t; +} +function qe(n, e) { + return Array.isArray(n) ? n : (e === void 0 ? e = [n, n] : (e[0] = n, e[1] = n), e); +} +class xc { + /** + * @param {Options} options Options. + */ + constructor(e) { + this.opacity_ = e.opacity, this.rotateWithView_ = e.rotateWithView, this.rotation_ = e.rotation, this.scale_ = e.scale, this.scaleArray_ = qe(e.scale), this.displacement_ = e.displacement, this.declutterMode_ = e.declutterMode; + } + /** + * Clones the style. + * @return {ImageStyle} The cloned style. + * @api + */ + clone() { + const e = this.getScale(); + return new xc({ + opacity: this.getOpacity(), + scale: Array.isArray(e) ? e.slice() : e, + rotation: this.getRotation(), + rotateWithView: this.getRotateWithView(), + displacement: this.getDisplacement().slice(), + declutterMode: this.getDeclutterMode() + }); + } + /** + * Get the symbolizer opacity. + * @return {number} Opacity. + * @api + */ + getOpacity() { + return this.opacity_; + } + /** + * Determine whether the symbolizer rotates with the map. + * @return {boolean} Rotate with map. + * @api + */ + getRotateWithView() { + return this.rotateWithView_; + } + /** + * Get the symoblizer rotation. + * @return {number} Rotation. + * @api + */ + getRotation() { + return this.rotation_; + } + /** + * Get the symbolizer scale. + * @return {number|import("../size.js").Size} Scale. + * @api + */ + getScale() { + return this.scale_; + } + /** + * Get the symbolizer scale array. + * @return {import("../size.js").Size} Scale array. + */ + getScaleArray() { + return this.scaleArray_; + } + /** + * Get the displacement of the shape + * @return {Array} Shape's center displacement + * @api + */ + getDisplacement() { + return this.displacement_; + } + /** + * Get the declutter mode of the shape + * @return {import("./Style.js").DeclutterMode} Shape's declutter mode + * @api + */ + getDeclutterMode() { + return this.declutterMode_; + } + /** + * Get the anchor point in pixels. The anchor determines the center point for the + * symbolizer. + * @abstract + * @return {Array} Anchor. + */ + getAnchor() { + return ae(); + } + /** + * Get the image element for the symbolizer. + * @abstract + * @param {number} pixelRatio Pixel ratio. + * @return {import('../DataTile.js').ImageLike} Image element. + */ + getImage(e) { + return ae(); + } + /** + * @abstract + * @return {import('../DataTile.js').ImageLike} Image element. + */ + getHitDetectionImage() { + return ae(); + } + /** + * Get the image pixel ratio. + * @param {number} pixelRatio Pixel ratio. + * @return {number} Pixel ratio. + */ + getPixelRatio(e) { + return 1; + } + /** + * @abstract + * @return {import("../ImageState.js").default} Image state. + */ + getImageState() { + return ae(); + } + /** + * @abstract + * @return {import("../size.js").Size} Image size. + */ + getImageSize() { + return ae(); + } + /** + * Get the origin of the symbolizer. + * @abstract + * @return {Array} Origin. + */ + getOrigin() { + return ae(); + } + /** + * Get the size of the symbolizer (in pixels). + * @abstract + * @return {import("../size.js").Size} Size. + */ + getSize() { + return ae(); + } + /** + * Set the displacement. + * + * @param {Array} displacement Displacement. + * @api + */ + setDisplacement(e) { + this.displacement_ = e; + } + /** + * Set the opacity. + * + * @param {number} opacity Opacity. + * @api + */ + setOpacity(e) { + this.opacity_ = e; + } + /** + * Set whether to rotate the style with the view. + * + * @param {boolean} rotateWithView Rotate with map. + * @api + */ + setRotateWithView(e) { + this.rotateWithView_ = e; + } + /** + * Set the rotation. + * + * @param {number} rotation Rotation. + * @api + */ + setRotation(e) { + this.rotation_ = e; + } + /** + * Set the scale. + * + * @param {number|import("../size.js").Size} scale Scale. + * @api + */ + setScale(e) { + this.scale_ = e, this.scaleArray_ = qe(e); + } + /** + * @abstract + * @param {function(import("../events/Event.js").default): void} listener Listener function. + */ + listenImageChange(e) { + ae(); + } + /** + * Load not yet loaded URI. + * @abstract + */ + load() { + ae(); + } + /** + * @abstract + * @param {function(import("../events/Event.js").default): void} listener Listener function. + */ + unlistenImageChange(e) { + ae(); + } + /** + * @return {Promise} `false` or Promise that resolves when the style is ready to use. + */ + ready() { + return Promise.resolve(); + } +} +const ba = { + name: "rgb", + min: [0, 0, 0], + max: [255, 255, 255], + channel: ["red", "green", "blue"], + alias: ["RGB"] +}; +var Nt = { + name: "xyz", + min: [0, 0, 0], + channel: ["X", "Y", "Z"], + alias: ["XYZ", "ciexyz", "cie1931"] +}; +Nt.whitepoint = { + //1931 2° + 2: { + //incadescent + A: [109.85, 100, 35.585], + // B:[], + C: [98.074, 100, 118.232], + D50: [96.422, 100, 82.521], + D55: [95.682, 100, 92.149], + //daylight + D65: [95.045592705167, 100, 108.9057750759878], + D75: [94.972, 100, 122.638], + //flourescent + // F1: [], + F2: [99.187, 100, 67.395], + // F3: [], + // F4: [], + // F5: [], + // F6:[], + F7: [95.044, 100, 108.755], + // F8: [], + // F9: [], + // F10: [], + F11: [100.966, 100, 64.37], + // F12: [], + E: [100, 100, 100] + }, + //1964 10° + 10: { + //incadescent + A: [111.144, 100, 35.2], + C: [97.285, 100, 116.145], + D50: [96.72, 100, 81.427], + D55: [95.799, 100, 90.926], + //daylight + D65: [94.811, 100, 107.304], + D75: [94.416, 100, 120.641], + //flourescent + F2: [103.28, 100, 69.026], + F7: [95.792, 100, 107.687], + F11: [103.866, 100, 65.627], + E: [100, 100, 100] + } +}; +Nt.max = Nt.whitepoint[2].D65; +Nt.rgb = function(n, e) { + e = e || Nt.whitepoint[2].E; + var t = n[0] / e[0], i = n[1] / e[1], r = n[2] / e[2], s, o, a; + return s = t * 3.240969941904521 + i * -1.537383177570093 + r * -0.498610760293, o = t * -0.96924363628087 + i * 1.87596750150772 + r * 0.041555057407175, a = t * 0.055630079696993 + i * -0.20397695888897 + r * 1.056971514242878, s = s > 31308e-7 ? 1.055 * Math.pow(s, 1 / 2.4) - 0.055 : s = s * 12.92, o = o > 31308e-7 ? 1.055 * Math.pow(o, 1 / 2.4) - 0.055 : o = o * 12.92, a = a > 31308e-7 ? 1.055 * Math.pow(a, 1 / 2.4) - 0.055 : a = a * 12.92, s = Math.min(Math.max(0, s), 1), o = Math.min(Math.max(0, o), 1), a = Math.min(Math.max(0, a), 1), [s * 255, o * 255, a * 255]; +}; +ba.xyz = function(n, e) { + var t = n[0] / 255, i = n[1] / 255, r = n[2] / 255; + t = t > 0.04045 ? Math.pow((t + 0.055) / 1.055, 2.4) : t / 12.92, i = i > 0.04045 ? Math.pow((i + 0.055) / 1.055, 2.4) : i / 12.92, r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; + var s = t * 0.41239079926595 + i * 0.35758433938387 + r * 0.18048078840183, o = t * 0.21263900587151 + i * 0.71516867876775 + r * 0.072192315360733, a = t * 0.019330818715591 + i * 0.11919477979462 + r * 0.95053215224966; + return e = e || Nt.whitepoint[2].E, [s * e[0], o * e[1], a * e[2]]; +}; +const Og = { + name: "luv", + //NOTE: luv has no rigidly defined limits + //easyrgb fails to get proper coords + //boronine states no rigid limits + //colorMine refers this ones: + min: [0, -134, -140], + max: [100, 224, 122], + channel: ["lightness", "u", "v"], + alias: ["LUV", "cieluv", "cie1976"], + xyz: function(n, e, t) { + var i, r, s, o, a, l, A, c, h, u, g, d, m; + if (s = n[0], o = n[1], a = n[2], s === 0) return [0, 0, 0]; + var f = 0.0011070564598794539; + return e = e || "D65", t = t || 2, h = Nt.whitepoint[t][e][0], u = Nt.whitepoint[t][e][1], g = Nt.whitepoint[t][e][2], d = 4 * h / (h + 15 * u + 3 * g), m = 9 * u / (h + 15 * u + 3 * g), i = o / (13 * s) + d || 0, r = a / (13 * s) + m || 0, A = s > 8 ? u * Math.pow((s + 16) / 116, 3) : u * s * f, l = A * 9 * i / (4 * r) || 0, c = A * (12 - 3 * i - 20 * r) / (4 * r) || 0, [l, A, c]; + } +}; +Nt.luv = function(n, e, t) { + var i, r, s, o, a, l, A, c, h, u, g, d, m, f = 0.008856451679035631, E = 903.2962962962961; + e = e || "D65", t = t || 2, h = Nt.whitepoint[t][e][0], u = Nt.whitepoint[t][e][1], g = Nt.whitepoint[t][e][2], d = 4 * h / (h + 15 * u + 3 * g), m = 9 * u / (h + 15 * u + 3 * g), l = n[0], A = n[1], c = n[2], i = 4 * l / (l + 15 * A + 3 * c) || 0, r = 9 * A / (l + 15 * A + 3 * c) || 0; + var p = A / u; + return s = p <= f ? E * p : 116 * Math.pow(p, 1 / 3) - 16, o = 13 * s * (i - d), a = 13 * s * (r - m), [s, o, a]; +}; +var Zp = { + name: "lchuv", + channel: ["lightness", "chroma", "hue"], + alias: ["LCHuv", "cielchuv"], + min: [0, 0, 0], + max: [100, 100, 360], + luv: function(n) { + var e = n[0], t = n[1], i = n[2], r, s, o; + return o = i / 360 * 2 * Math.PI, r = t * Math.cos(o), s = t * Math.sin(o), [e, r, s]; + }, + xyz: function(n) { + return Og.xyz(Zp.luv(n)); + } +}; +Og.lchuv = function(n) { + var e = n[0], t = n[1], i = n[2], r = Math.sqrt(t * t + i * i), s = Math.atan2(i, t), o = s * 360 / 2 / Math.PI; + return o < 0 && (o += 360), [e, r, o]; +}; +Nt.lchuv = function(n) { + return Og.lchuv(Nt.luv(n)); +}; +const Mf = { + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + grey: [128, 128, 128], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + rebeccapurple: [102, 51, 153], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] +}; +var Nf = { + red: 0, + orange: 60, + yellow: 120, + green: 180, + blue: 240, + purple: 300 +}; +function mw(n) { + var c, h; + var e, t = [], i = 1, r; + if (typeof n == "number") + return { space: "rgb", values: [n >>> 16, (n & 65280) >>> 8, n & 255], alpha: 1 }; + if (typeof n == "number") return { space: "rgb", values: [n >>> 16, (n & 65280) >>> 8, n & 255], alpha: 1 }; + if (n = String(n).toLowerCase(), Mf[n]) + t = Mf[n].slice(), r = "rgb"; + else if (n === "transparent") + i = 0, r = "rgb", t = [0, 0, 0]; + else if (n[0] === "#") { + var s = n.slice(1), o = s.length, a = o <= 4; + i = 1, a ? (t = [ + parseInt(s[0] + s[0], 16), + parseInt(s[1] + s[1], 16), + parseInt(s[2] + s[2], 16) + ], o === 4 && (i = parseInt(s[3] + s[3], 16) / 255)) : (t = [ + parseInt(s[0] + s[1], 16), + parseInt(s[2] + s[3], 16), + parseInt(s[4] + s[5], 16) + ], o === 8 && (i = parseInt(s[6] + s[7], 16) / 255)), t[0] || (t[0] = 0), t[1] || (t[1] = 0), t[2] || (t[2] = 0), r = "rgb"; + } else if (e = /^((?:rgba?|hs[lvb]a?|hwba?|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms|oklch|oklab|color))\s*\(([^\)]*)\)/.exec(n)) { + var l = e[1]; + r = l.replace(/a$/, ""); + var A = r === "cmyk" ? 4 : r === "gray" ? 1 : 3; + t = e[2].trim().split(/\s*[,\/]\s*|\s+/), r === "color" && (r = t.shift()), t = t.map(function(u, g) { + if (u[u.length - 1] === "%") + return u = parseFloat(u) / 100, g === 3 ? u : r === "rgb" ? u * 255 : r[0] === "h" || r[0] === "l" && !g ? u * 100 : r === "lab" ? u * 125 : r === "lch" ? g < 2 ? u * 150 : u * 360 : r[0] === "o" && !g ? u : r === "oklab" ? u * 0.4 : r === "oklch" ? g < 2 ? u * 0.4 : u * 360 : u; + if (r[g] === "h" || g === 2 && r[r.length - 1] === "h") { + if (Nf[u] !== void 0) return Nf[u]; + if (u.endsWith("deg")) return parseFloat(u); + if (u.endsWith("turn")) return parseFloat(u) * 360; + if (u.endsWith("grad")) return parseFloat(u) * 360 / 400; + if (u.endsWith("rad")) return parseFloat(u) * 180 / Math.PI; + } + return u === "none" ? 0 : parseFloat(u); + }), i = t.length > A ? t.pop() : 1; + } else /[0-9](?:\s|\/|,)/.test(n) && (t = n.match(/([0-9]+)/g).map(function(u) { + return parseFloat(u); + }), r = ((h = (c = n.match(/([a-z])/ig)) == null ? void 0 : c.join("")) == null ? void 0 : h.toLowerCase()) || "rgb"); + return { + space: r, + values: t, + alpha: i + }; +} +const dh = { + name: "hsl", + min: [0, 0, 0], + max: [360, 100, 100], + channel: ["hue", "saturation", "lightness"], + alias: ["HSL"], + rgb: function(n) { + var e = n[0] / 360, t = n[1] / 100, i = n[2] / 100, r, s, o, a, l, A = 0; + if (t === 0) return l = i * 255, [l, l, l]; + for (s = i < 0.5 ? i * (1 + t) : i + t - i * t, r = 2 * i - s, a = [0, 0, 0]; A < 3; ) + o = e + 1 / 3 * -(A - 1), o < 0 ? o++ : o > 1 && o--, l = 6 * o < 1 ? r + (s - r) * 6 * o : 2 * o < 1 ? s : 3 * o < 2 ? r + (s - r) * (2 / 3 - o) * 6 : r, a[A++] = l * 255; + return a; + } +}; +ba.hsl = function(n) { + var e = n[0] / 255, t = n[1] / 255, i = n[2] / 255, r = Math.min(e, t, i), s = Math.max(e, t, i), o = s - r, a, l, A; + return s === r ? a = 0 : e === s ? a = (t - i) / o : t === s ? a = 2 + (i - e) / o : i === s && (a = 4 + (e - t) / o), a = Math.min(a * 60, 360), a < 0 && (a += 360), A = (r + s) / 2, s === r ? l = 0 : A <= 0.5 ? l = o / (s + r) : l = o / (2 - s - r), [a, l * 100, A * 100]; +}; +function Ew(n) { + Array.isArray(n) && n.raw && (n = String.raw(...arguments)), n instanceof Number && (n = +n); + var e, t = mw(n); + if (!t.space) return []; + const i = t.space[0] === "h" ? dh.min : ba.min, r = t.space[0] === "h" ? dh.max : ba.max; + return e = Array(3), e[0] = Math.min(Math.max(t.values[0], i[0]), r[0]), e[1] = Math.min(Math.max(t.values[1], i[1]), r[1]), e[2] = Math.min(Math.max(t.values[2], i[2]), r[2]), t.space[0] === "h" && (e = dh.rgb(e)), e.push(Math.min(Math.max(t.alpha, 0), 1)), e; +} +const Gg = [NaN, NaN, NaN, 0]; +function pw(n) { + return typeof n == "string" ? n : kg(n); +} +const _w = 1024, Zo = {}; +let fh = 0; +function Iw(n) { + if (n.length === 4) + return n; + const e = n.slice(); + return e[3] = 1, e; +} +function Of(n) { + const e = Nt.lchuv(ba.xyz(n)); + return e[3] = n[3], e; +} +function Cw(n) { + const e = Nt.rgb(Zp.xyz(n)); + return e[3] = n[3], e; +} +function Bc(n) { + if (n === "none") + return Gg; + if (Zo.hasOwnProperty(n)) + return Zo[n]; + if (fh >= _w) { + let t = 0; + for (const i in Zo) + t++ & 3 || (delete Zo[i], --fh); + } + const e = Ew(n); + if (e.length !== 4) + throw new Error('failed to parse "' + n + '" as color'); + for (const t of e) + if (isNaN(t)) + throw new Error('failed to parse "' + n + '" as color'); + return Jp(e), Zo[n] = e, ++fh, e; +} +function qi(n) { + return Array.isArray(n) ? n : Bc(n); +} +function Jp(n) { + return n[0] = ue(n[0] + 0.5 | 0, 0, 255), n[1] = ue(n[1] + 0.5 | 0, 0, 255), n[2] = ue(n[2] + 0.5 | 0, 0, 255), n[3] = ue(n[3], 0, 1), n; +} +function kg(n) { + let e = n[0]; + e != (e | 0) && (e = e + 0.5 | 0); + let t = n[1]; + t != (t | 0) && (t = t + 0.5 | 0); + let i = n[2]; + i != (i | 0) && (i = i + 0.5 | 0); + const r = n[3] === void 0 ? 1 : Math.round(n[3] * 1e3) / 1e3; + return "rgba(" + e + "," + t + "," + i + "," + r + ")"; +} +function vO(n) { + try { + return Bc(n), !0; + } catch { + return !1; + } +} +class yw { + constructor() { + this.cache_ = {}, this.patternCache_ = {}, this.cacheSize_ = 0, this.maxCacheSize_ = 32; + } + /** + * FIXME empty description for jsdoc + */ + clear() { + this.cache_ = {}, this.patternCache_ = {}, this.cacheSize_ = 0; + } + /** + * @return {boolean} Can expire cache. + */ + canExpireCache() { + return this.cacheSize_ > this.maxCacheSize_; + } + /** + * FIXME empty description for jsdoc + */ + expire() { + if (this.canExpireCache()) { + let e = 0; + for (const t in this.cache_) { + const i = this.cache_[t]; + !(e++ & 3) && !i.hasListener() && (delete this.cache_[t], delete this.patternCache_[t], --this.cacheSize_); + } + } + } + /** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @param {import("../color.js").Color|string|null} color Color. + * @return {import("./IconImage.js").default} Icon image. + */ + get(e, t, i) { + const r = mh(e, t, i); + return r in this.cache_ ? this.cache_[r] : null; + } + /** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @param {import("../color.js").Color|string|null} color Color. + * @return {CanvasPattern} Icon image. + */ + getPattern(e, t, i) { + const r = mh(e, t, i); + return r in this.patternCache_ ? this.patternCache_[r] : null; + } + /** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @param {import("../color.js").Color|string|null} color Color. + * @param {import("./IconImage.js").default|null} iconImage Icon image. + * @param {boolean} [pattern] Also cache a `'repeat'` pattern with this `iconImage`. + */ + set(e, t, i, r, s) { + const o = mh(e, t, i), a = o in this.cache_; + this.cache_[o] = r, s && (r.getImageState() === W.IDLE && r.load(), r.getImageState() === W.LOADING ? r.ready().then(() => { + this.patternCache_[o] = BA().createPattern( + r.getImage(1), + "repeat" + ); + }) : this.patternCache_[o] = BA().createPattern( + r.getImage(1), + "repeat" + )), a || ++this.cacheSize_; + } + /** + * Set the cache size of the icon cache. Default is `32`. Change this value when + * your map uses more than 32 different icon images and you are not caching icon + * styles on the application level. + * @param {number} maxCacheSize Cache max size. + * @api + */ + setSize(e) { + this.maxCacheSize_ = e, this.expire(); + } +} +function mh(n, e, t) { + const i = t ? qi(t) : "null"; + return e + ":" + n + ":" + i; +} +const cn = new yw(); +let Jo = null; +class ww extends So { + /** + * @param {HTMLImageElement|HTMLCanvasElement|ImageBitmap|null} image Image. + * @param {string|undefined} src Src. + * @param {?string} crossOrigin Cross origin. + * @param {import("../ImageState.js").default|undefined} imageState Image state. + * @param {import("../color.js").Color|string|null} color Color. + */ + constructor(e, t, i, r, s) { + super(), this.hitDetectionImage_ = null, this.image_ = e, this.crossOrigin_ = i, this.canvas_ = {}, this.color_ = s, this.imageState_ = r === void 0 ? W.IDLE : r, this.size_ = e && e.width && e.height ? [e.width, e.height] : null, this.src_ = t, this.tainted_, this.ready_ = null; + } + /** + * @private + */ + initializeImage_() { + this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_); + } + /** + * @private + * @return {boolean} The image canvas is tainted. + */ + isTainted_() { + if (this.tainted_ === void 0 && this.imageState_ === W.LOADED) { + Jo || (Jo = Ve(1, 1, void 0, { + willReadFrequently: !0 + })), Jo.drawImage(this.image_, 0, 0); + try { + Jo.getImageData(0, 0, 1, 1), this.tainted_ = !1; + } catch { + Jo = null, this.tainted_ = !0; + } + } + return this.tainted_ === !0; + } + /** + * @private + */ + dispatchChangeEvent_() { + this.dispatchEvent(j.CHANGE); + } + /** + * @private + */ + handleImageError_() { + this.imageState_ = W.ERROR, this.dispatchChangeEvent_(); + } + /** + * @private + */ + handleImageLoad_() { + this.imageState_ = W.LOADED, this.size_ = [this.image_.width, this.image_.height], this.dispatchChangeEvent_(); + } + /** + * @param {number} pixelRatio Pixel ratio. + * @return {HTMLImageElement|HTMLCanvasElement|ImageBitmap} Image or Canvas element or image bitmap. + */ + getImage(e) { + return this.image_ || this.initializeImage_(), this.replaceColor_(e), this.canvas_[e] ? this.canvas_[e] : this.image_; + } + /** + * @param {number} pixelRatio Pixel ratio. + * @return {number} Image or Canvas element. + */ + getPixelRatio(e) { + return this.replaceColor_(e), this.canvas_[e] ? e : 1; + } + /** + * @return {import("../ImageState.js").default} Image state. + */ + getImageState() { + return this.imageState_; + } + /** + * @return {HTMLImageElement|HTMLCanvasElement|ImageBitmap} Image element. + */ + getHitDetectionImage() { + if (this.image_ || this.initializeImage_(), !this.hitDetectionImage_) + if (this.isTainted_()) { + const e = this.size_[0], t = this.size_[1], i = Ve(e, t); + i.fillRect(0, 0, e, t), this.hitDetectionImage_ = i.canvas; + } else + this.hitDetectionImage_ = this.image_; + return this.hitDetectionImage_; + } + /** + * Get the size of the icon (in pixels). + * @return {import("../size.js").Size} Image size. + */ + getSize() { + return this.size_; + } + /** + * @return {string|undefined} Image src. + */ + getSrc() { + return this.src_; + } + /** + * Load not yet loaded URI. + */ + load() { + if (this.imageState_ === W.IDLE) { + this.image_ || this.initializeImage_(), this.imageState_ = W.LOADING; + try { + this.src_ !== void 0 && (this.image_.src = this.src_); + } catch { + this.handleImageError_(); + } + this.image_ instanceof HTMLImageElement && Xp(this.image_, this.src_).then((e) => { + this.image_ = e, this.handleImageLoad_(); + }).catch(this.handleImageError_.bind(this)); + } + } + /** + * @param {number} pixelRatio Pixel ratio. + * @private + */ + replaceColor_(e) { + if (!this.color_ || this.canvas_[e] || this.imageState_ !== W.LOADED) + return; + const t = this.image_, i = Ve( + Math.ceil(t.width * e), + Math.ceil(t.height * e) + ), r = i.canvas; + i.scale(e, e), i.drawImage(t, 0, 0), i.globalCompositeOperation = "multiply", i.fillStyle = pw(this.color_), i.fillRect(0, 0, r.width / e, r.height / e), i.globalCompositeOperation = "destination-in", i.drawImage(t, 0, 0), this.canvas_[e] = r; + } + /** + * @return {Promise} Promise that resolves when the image is loaded. + */ + ready() { + return this.ready_ || (this.ready_ = new Promise((e) => { + if (this.imageState_ === W.LOADED || this.imageState_ === W.ERROR) + e(); + else { + const t = () => { + (this.imageState_ === W.LOADED || this.imageState_ === W.ERROR) && (this.removeEventListener(j.CHANGE, t), e()); + }; + this.addEventListener(j.CHANGE, t); + } + })), this.ready_; + } +} +function $g(n, e, t, i, r, s) { + let o = e === void 0 ? void 0 : cn.get(e, t, r); + return o || (o = new ww( + n, + n && "src" in n ? n.src || void 0 : e, + t, + i, + r + ), cn.set(e, t, r, o, s)), s && o && !cn.getPattern(e, t, r) && cn.set(e, t, r, o, s), o; +} +function hn(n) { + return n ? Array.isArray(n) ? kg(n) : typeof n == "object" && "src" in n ? xw(n) : n : null; +} +function xw(n) { + if (!n.offset || !n.size) + return cn.getPattern(n.src, "anonymous", n.color); + const e = n.src + ":" + n.offset, t = cn.getPattern( + e, + void 0, + n.color + ); + if (t) + return t; + const i = cn.get(n.src, "anonymous", null); + if (i.getImageState() !== W.LOADED) + return null; + const r = Ve( + n.size[0], + n.size[1] + ); + return r.drawImage( + i.getImage(1), + n.offset[0], + n.offset[1], + n.size[0], + n.size[1], + 0, + 0, + n.size[0], + n.size[1] + ), $g( + r.canvas, + e, + void 0, + W.LOADED, + n.color, + !0 + ), cn.getPattern(e, void 0, n.color); +} +const Gl = "ol-hidden", Bw = "ol-selectable", In = "ol-unselectable", Gf = "ol-unsupported", As = "ol-control", bA = "ol-collapsed", Sw = new RegExp( + [ + "^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)", + "(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)", + "(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)", + "(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?", + "(?:small|large)|medium|smaller|larger|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))", + "(?:\\s*\\/\\s*(normal|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])?))", + `?\\s*([-,\\"\\'\\sa-z]+?)\\s*$` + ].join(""), + "i" +), kf = [ + "style", + "variant", + "weight", + "size", + "lineHeight", + "family" +], e_ = function(n) { + const e = n.match(Sw); + if (!e) + return null; + const t = ( + /** @type {FontParameters} */ + { + lineHeight: "normal", + size: "1.2em", + style: "normal", + weight: "normal", + variant: "normal" + } + ); + for (let i = 0, r = kf.length; i < r; ++i) { + const s = e[i + 1]; + s !== void 0 && (t[kf[i]] = s); + } + return t.families = t.family.split(/,\s?/), t; +}, t_ = "10px sans-serif", ni = "#000", uo = "round", Un = [], Yn = 0, go = "round", Pa = 10, Ma = "#000", Na = "center", PA = "middle", Mr = [0, 0, 0, 0], Oa = 1, Fn = new Oi(); +let Ps = null, Tu; +const vu = {}, Rw = function() { + const e = "32px ", t = ["monospace", "serif"], i = t.length, r = "wmytzilWMYTZIL@#/&?$%10"; + let s, o; + function a(A, c, h) { + let u = !0; + for (let g = 0; g < i; ++g) { + const d = t[g]; + if (o = MA( + A + " " + c + " " + e + d, + r + ), h != d) { + const m = MA( + A + " " + c + " " + e + h + "," + d, + r + ); + u = u && m != o; + } + } + return !!u; + } + function l() { + let A = !0; + const c = Fn.getKeys(); + for (let h = 0, u = c.length; h < u; ++h) { + const g = c[h]; + if (Fn.get(g) < 100) { + const [d, m, f] = g.split(` +`); + a(d, m, f) ? (ns(vu), Ps = null, Tu = void 0, Fn.set(g, 100)) : (Fn.set(g, Fn.get(g) + 1, !0), A = !1); + } + } + A && (clearInterval(s), s = void 0); + } + return function(A) { + const c = e_(A); + if (!c) + return; + const h = c.families; + for (let u = 0, g = h.length; u < g; ++u) { + const d = h[u], m = c.style + ` +` + c.weight + ` +` + d; + Fn.get(m) === void 0 && (Fn.set(m, 100, !0), a(c.style, c.weight, d) || (Fn.set(m, 0, !0), s === void 0 && (s = setInterval(l, 32)))); + } + }; +}(), Tw = /* @__PURE__ */ function() { + let n; + return function(e) { + let t = vu[e]; + if (t == null) { + if (Cp) { + const i = e_(e), r = i_(e, "Žg"); + t = (isNaN(Number(i.lineHeight)) ? 1.2 : Number(i.lineHeight)) * (r.actualBoundingBoxAscent + r.actualBoundingBoxDescent); + } else + n || (n = document.createElement("div"), n.innerHTML = "M", n.style.minHeight = "0", n.style.maxHeight = "none", n.style.height = "auto", n.style.padding = "0", n.style.border = "none", n.style.position = "absolute", n.style.display = "block", n.style.left = "-99999px"), n.style.font = e, document.body.appendChild(n), t = n.offsetHeight, document.body.removeChild(n); + vu[e] = t; + } + return t; + }; +}(); +function i_(n, e) { + return Ps || (Ps = Ve(1, 1)), n != Tu && (Ps.font = n, Tu = Ps.font), Ps.measureText(e); +} +function MA(n, e) { + return i_(n, e).width; +} +function $f(n, e, t) { + if (e in t) + return t[e]; + const i = e.split(` +`).reduce((r, s) => Math.max(r, MA(n, s)), 0); + return t[e] = i, i; +} +function vw(n, e) { + const t = [], i = [], r = []; + let s = 0, o = 0, a = 0, l = 0; + for (let A = 0, c = e.length; A <= c; A += 2) { + const h = e[A]; + if (h === ` +` || A === c) { + s = Math.max(s, o), r.push(o), o = 0, a += l, l = 0; + continue; + } + const u = e[A + 1] || n.font, g = MA(u, h); + t.push(g), o += g; + const d = Tw(u); + i.push(d), l = Math.max(l, d); + } + return { width: s, height: a, widths: t, heights: i, lineWidths: r }; +} +function QO(n, e, t, i) { + e !== 0 && (n.translate(t, i), n.rotate(e), n.translate(-t, -i)); +} +function Qw(n, e, t, i, r, s, o, a, l, A, c) { + n.save(), t !== 1 && (n.globalAlpha === void 0 ? n.globalAlpha = (h) => h.globalAlpha *= t : n.globalAlpha *= t), e && n.transform.apply(n, e), /** @type {*} */ + i.contextInstructions ? (n.translate(l, A), n.scale(c[0], c[1]), Dw( + /** @type {Label} */ + i, + n + )) : c[0] < 0 || c[1] < 0 ? (n.translate(l, A), n.scale(c[0], c[1]), n.drawImage( + /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ + i, + r, + s, + o, + a, + 0, + 0, + o, + a + )) : n.drawImage( + /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ + i, + r, + s, + o, + a, + l, + A, + o * c[0], + a * c[1] + ), n.restore(); +} +function Dw(n, e) { + const t = n.contextInstructions; + for (let i = 0, r = t.length; i < r; i += 2) + Array.isArray(t[i + 1]) ? e[t[i]].apply( + e, + t[i + 1] + ) : e[t[i]] = t[i + 1]; +} +class Sc extends xc { + /** + * @param {Options} options Options. + */ + constructor(e) { + super({ + opacity: 1, + rotateWithView: e.rotateWithView !== void 0 ? e.rotateWithView : !1, + rotation: e.rotation !== void 0 ? e.rotation : 0, + scale: e.scale !== void 0 ? e.scale : 1, + displacement: e.displacement !== void 0 ? e.displacement : [0, 0], + declutterMode: e.declutterMode + }), this.canvases_, this.hitDetectionCanvas_ = null, this.fill_ = e.fill !== void 0 ? e.fill : null, this.origin_ = [0, 0], this.points_ = e.points, this.radius = e.radius, this.radius2_ = e.radius2, this.angle_ = e.angle !== void 0 ? e.angle : 0, this.stroke_ = e.stroke !== void 0 ? e.stroke : null, this.size_, this.renderOptions_, this.imageState_ = this.fill_ && this.fill_.loading() ? W.LOADING : W.LOADED, this.imageState_ === W.LOADING && this.ready().then(() => this.imageState_ = W.LOADED), this.render(); + } + /** + * Clones the style. + * @return {RegularShape} The cloned style. + * @api + * @override + */ + clone() { + const e = this.getScale(), t = new Sc({ + fill: this.getFill() ? this.getFill().clone() : void 0, + points: this.getPoints(), + radius: this.getRadius(), + radius2: this.getRadius2(), + angle: this.getAngle(), + stroke: this.getStroke() ? this.getStroke().clone() : void 0, + rotation: this.getRotation(), + rotateWithView: this.getRotateWithView(), + scale: Array.isArray(e) ? e.slice() : e, + displacement: this.getDisplacement().slice(), + declutterMode: this.getDeclutterMode() + }); + return t.setOpacity(this.getOpacity()), t; + } + /** + * Get the anchor point in pixels. The anchor determines the center point for the + * symbolizer. + * @return {Array} Anchor. + * @api + * @override + */ + getAnchor() { + const e = this.size_, t = this.getDisplacement(), i = this.getScaleArray(); + return [ + e[0] / 2 - t[0] / i[0], + e[1] / 2 + t[1] / i[1] + ]; + } + /** + * Get the angle used in generating the shape. + * @return {number} Shape's rotation in radians. + * @api + */ + getAngle() { + return this.angle_; + } + /** + * Get the fill style for the shape. + * @return {import("./Fill.js").default|null} Fill style. + * @api + */ + getFill() { + return this.fill_; + } + /** + * Set the fill style. + * @param {import("./Fill.js").default|null} fill Fill style. + * @api + */ + setFill(e) { + this.fill_ = e, this.render(); + } + /** + * @return {HTMLCanvasElement} Image element. + * @override + */ + getHitDetectionImage() { + return this.hitDetectionCanvas_ || (this.hitDetectionCanvas_ = this.createHitDetectionCanvas_( + this.renderOptions_ + )), this.hitDetectionCanvas_; + } + /** + * Get the image icon. + * @param {number} pixelRatio Pixel ratio. + * @return {HTMLCanvasElement} Image or Canvas element. + * @api + * @override + */ + getImage(e) { + let t = this.canvases_[e]; + if (!t) { + const i = this.renderOptions_, r = Ve( + i.size * e, + i.size * e + ); + this.draw_(i, r, e), t = r.canvas, this.canvases_[e] = t; + } + return t; + } + /** + * Get the image pixel ratio. + * @param {number} pixelRatio Pixel ratio. + * @return {number} Pixel ratio. + * @override + */ + getPixelRatio(e) { + return e; + } + /** + * @return {import("../size.js").Size} Image size. + * @override + */ + getImageSize() { + return this.size_; + } + /** + * @return {import("../ImageState.js").default} Image state. + * @override + */ + getImageState() { + return this.imageState_; + } + /** + * Get the origin of the symbolizer. + * @return {Array} Origin. + * @api + * @override + */ + getOrigin() { + return this.origin_; + } + /** + * Get the number of points for generating the shape. + * @return {number} Number of points for stars and regular polygons. + * @api + */ + getPoints() { + return this.points_; + } + /** + * Get the (primary) radius for the shape. + * @return {number} Radius. + * @api + */ + getRadius() { + return this.radius; + } + /** + * Get the secondary radius for the shape. + * @return {number|undefined} Radius2. + * @api + */ + getRadius2() { + return this.radius2_; + } + /** + * Get the size of the symbolizer (in pixels). + * @return {import("../size.js").Size} Size. + * @api + * @override + */ + getSize() { + return this.size_; + } + /** + * Get the stroke style for the shape. + * @return {import("./Stroke.js").default|null} Stroke style. + * @api + */ + getStroke() { + return this.stroke_; + } + /** + * Set the stroke style. + * @param {import("./Stroke.js").default|null} stroke Stroke style. + * @api + */ + setStroke(e) { + this.stroke_ = e, this.render(); + } + /** + * @param {function(import("../events/Event.js").default): void} listener Listener function. + * @override + */ + listenImageChange(e) { + } + /** + * Load not yet loaded URI. + * @override + */ + load() { + } + /** + * @param {function(import("../events/Event.js").default): void} listener Listener function. + * @override + */ + unlistenImageChange(e) { + } + /** + * Calculate additional canvas size needed for the miter. + * @param {string} lineJoin Line join + * @param {number} strokeWidth Stroke width + * @param {number} miterLimit Miter limit + * @return {number} Additional canvas size needed + * @private + */ + calculateLineJoinSize_(e, t, i) { + if (t === 0 || this.points_ === 1 / 0 || e !== "bevel" && e !== "miter") + return t; + let r = this.radius, s = this.radius2_ === void 0 ? r : this.radius2_; + if (r < s) { + const C = r; + r = s, s = C; + } + const o = this.radius2_ === void 0 ? this.points_ : this.points_ * 2, a = 2 * Math.PI / o, l = s * Math.sin(a), A = Math.sqrt(s * s - l * l), c = r - A, h = Math.sqrt(l * l + c * c), u = h / l; + if (e === "miter" && u <= i) + return u * t; + const g = t / 2 / u, d = t / 2 * (c / h), f = Math.sqrt((r + g) * (r + g) + d * d) - r; + if (this.radius2_ === void 0 || e === "bevel") + return f * 2; + const E = r * Math.sin(a), p = Math.sqrt(r * r - E * E), _ = s - p, y = Math.sqrt(E * E + _ * _) / E; + if (y <= i) { + const C = y * t / 2 - s - r; + return 2 * Math.max(f, C); + } + return f * 2; + } + /** + * @return {RenderOptions} The render options + * @protected + */ + createRenderOptions() { + let e = uo, t = go, i = 0, r = null, s = 0, o, a = 0; + this.stroke_ && (o = hn(this.stroke_.getColor() ?? Ma), a = this.stroke_.getWidth() ?? Oa, r = this.stroke_.getLineDash(), s = this.stroke_.getLineDashOffset() ?? 0, t = this.stroke_.getLineJoin() ?? go, e = this.stroke_.getLineCap() ?? uo, i = this.stroke_.getMiterLimit() ?? Pa); + const l = this.calculateLineJoinSize_(t, a, i), A = Math.max(this.radius, this.radius2_ || 0), c = Math.ceil(2 * A + l); + return { + strokeStyle: o, + strokeWidth: a, + size: c, + lineCap: e, + lineDash: r, + lineDashOffset: s, + lineJoin: t, + miterLimit: i + }; + } + /** + * @protected + */ + render() { + this.renderOptions_ = this.createRenderOptions(); + const e = this.renderOptions_.size; + this.canvases_ = {}, this.hitDetectionCanvas_ = null, this.size_ = [e, e]; + } + /** + * @private + * @param {RenderOptions} renderOptions Render options. + * @param {CanvasRenderingContext2D} context The rendering context. + * @param {number} pixelRatio The pixel ratio. + */ + draw_(e, t, i) { + if (t.scale(i, i), t.translate(e.size / 2, e.size / 2), this.createPath_(t), this.fill_) { + let r = this.fill_.getColor(); + r === null && (r = ni), t.fillStyle = hn(r), t.fill(); + } + e.strokeStyle && (t.strokeStyle = e.strokeStyle, t.lineWidth = e.strokeWidth, e.lineDash && (t.setLineDash(e.lineDash), t.lineDashOffset = e.lineDashOffset), t.lineCap = e.lineCap, t.lineJoin = e.lineJoin, t.miterLimit = e.miterLimit, t.stroke()); + } + /** + * @private + * @param {RenderOptions} renderOptions Render options. + * @return {HTMLCanvasElement} Canvas containing the icon + */ + createHitDetectionCanvas_(e) { + let t; + if (this.fill_) { + let i = this.fill_.getColor(), r = 0; + typeof i == "string" && (i = qi(i)), i === null ? r = 1 : Array.isArray(i) && (r = i.length === 4 ? i[3] : 1), r === 0 && (t = Ve(e.size, e.size), this.drawHitDetectionCanvas_(e, t)); + } + return t ? t.canvas : this.getImage(1); + } + /** + * @private + * @param {CanvasRenderingContext2D} context The context to draw in. + */ + createPath_(e) { + let t = this.points_; + const i = this.radius; + if (t === 1 / 0) + e.arc(0, 0, i, 0, 2 * Math.PI); + else { + const r = this.radius2_ === void 0 ? i : this.radius2_; + this.radius2_ !== void 0 && (t *= 2); + const s = this.angle_ - Math.PI / 2, o = 2 * Math.PI / t; + for (let a = 0; a < t; a++) { + const l = s + a * o, A = a % 2 === 0 ? i : r; + e.lineTo(A * Math.cos(l), A * Math.sin(l)); + } + e.closePath(); + } + } + /** + * @private + * @param {RenderOptions} renderOptions Render options. + * @param {CanvasRenderingContext2D} context The context. + */ + drawHitDetectionCanvas_(e, t) { + t.translate(e.size / 2, e.size / 2), this.createPath_(t), t.fillStyle = ni, t.fill(), e.strokeStyle && (t.strokeStyle = e.strokeStyle, t.lineWidth = e.strokeWidth, e.lineDash && (t.setLineDash(e.lineDash), t.lineDashOffset = e.lineDashOffset), t.lineJoin = e.lineJoin, t.miterLimit = e.miterLimit, t.stroke()); + } + /** + * @override + */ + ready() { + return this.fill_ ? this.fill_.ready() : Promise.resolve(); + } +} +class gl extends Sc { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || { radius: 5 }, super({ + points: 1 / 0, + fill: e.fill, + radius: e.radius, + stroke: e.stroke, + scale: e.scale !== void 0 ? e.scale : 1, + rotation: e.rotation !== void 0 ? e.rotation : 0, + rotateWithView: e.rotateWithView !== void 0 ? e.rotateWithView : !1, + displacement: e.displacement !== void 0 ? e.displacement : [0, 0], + declutterMode: e.declutterMode + }); + } + /** + * Clones the style. + * @return {CircleStyle} The cloned style. + * @api + * @override + */ + clone() { + const e = this.getScale(), t = new gl({ + fill: this.getFill() ? this.getFill().clone() : void 0, + stroke: this.getStroke() ? this.getStroke().clone() : void 0, + radius: this.getRadius(), + scale: Array.isArray(e) ? e.slice() : e, + rotation: this.getRotation(), + rotateWithView: this.getRotateWithView(), + displacement: this.getDisplacement().slice(), + declutterMode: this.getDeclutterMode() + }); + return t.setOpacity(this.getOpacity()), t; + } + /** + * Set the circle radius. + * + * @param {number} radius Circle radius. + * @api + */ + setRadius(e) { + this.radius = e, this.render(); + } +} +class Mi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, this.patternImage_ = null, this.color_ = null, e.color !== void 0 && this.setColor(e.color); + } + /** + * Clones the style. The color is not cloned if it is a {@link module:ol/colorlike~ColorLike}. + * @return {Fill} The cloned style. + * @api + */ + clone() { + const e = this.getColor(); + return new Mi({ + color: Array.isArray(e) ? e.slice() : e || void 0 + }); + } + /** + * Get the fill color. + * @return {import("../color.js").Color|import("../colorlike.js").ColorLike|import('../colorlike.js').PatternDescriptor|null} Color. + * @api + */ + getColor() { + return this.color_; + } + /** + * Set the color. + * + * @param {import("../color.js").Color|import("../colorlike.js").ColorLike|import('../colorlike.js').PatternDescriptor|null} color Color. + * @api + */ + setColor(e) { + if (e !== null && typeof e == "object" && "src" in e) { + const t = $g( + null, + e.src, + "anonymous", + void 0, + e.offset ? null : e.color ? e.color : null, + !(e.offset && e.size) + ); + t.ready().then(() => { + this.patternImage_ = null; + }), t.getImageState() === W.IDLE && t.load(), t.getImageState() === W.LOADING && (this.patternImage_ = t); + } + this.color_ = e; + } + /** + * @return {boolean} The fill style is loading an image pattern. + */ + loading() { + return !!this.patternImage_; + } + /** + * @return {Promise} `false` or a promise that resolves when the style is ready to use. + */ + ready() { + return this.patternImage_ ? this.patternImage_.ready() : Promise.resolve(); + } +} +class Ii { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, this.color_ = e.color !== void 0 ? e.color : null, this.lineCap_ = e.lineCap, this.lineDash_ = e.lineDash !== void 0 ? e.lineDash : null, this.lineDashOffset_ = e.lineDashOffset, this.lineJoin_ = e.lineJoin, this.miterLimit_ = e.miterLimit, this.width_ = e.width; + } + /** + * Clones the style. + * @return {Stroke} The cloned style. + * @api + */ + clone() { + const e = this.getColor(); + return new Ii({ + color: Array.isArray(e) ? e.slice() : e || void 0, + lineCap: this.getLineCap(), + lineDash: this.getLineDash() ? this.getLineDash().slice() : void 0, + lineDashOffset: this.getLineDashOffset(), + lineJoin: this.getLineJoin(), + miterLimit: this.getMiterLimit(), + width: this.getWidth() + }); + } + /** + * Get the stroke color. + * @return {import("../color.js").Color|import("../colorlike.js").ColorLike} Color. + * @api + */ + getColor() { + return this.color_; + } + /** + * Get the line cap type for the stroke. + * @return {CanvasLineCap|undefined} Line cap. + * @api + */ + getLineCap() { + return this.lineCap_; + } + /** + * Get the line dash style for the stroke. + * @return {Array|null} Line dash. + * @api + */ + getLineDash() { + return this.lineDash_; + } + /** + * Get the line dash offset for the stroke. + * @return {number|undefined} Line dash offset. + * @api + */ + getLineDashOffset() { + return this.lineDashOffset_; + } + /** + * Get the line join type for the stroke. + * @return {CanvasLineJoin|undefined} Line join. + * @api + */ + getLineJoin() { + return this.lineJoin_; + } + /** + * Get the miter limit for the stroke. + * @return {number|undefined} Miter limit. + * @api + */ + getMiterLimit() { + return this.miterLimit_; + } + /** + * Get the stroke width. + * @return {number|undefined} Width. + * @api + */ + getWidth() { + return this.width_; + } + /** + * Set the color. + * + * @param {import("../color.js").Color|import("../colorlike.js").ColorLike} color Color. + * @api + */ + setColor(e) { + this.color_ = e; + } + /** + * Set the line cap. + * + * @param {CanvasLineCap|undefined} lineCap Line cap. + * @api + */ + setLineCap(e) { + this.lineCap_ = e; + } + /** + * Set the line dash. + * + * @param {Array|null} lineDash Line dash. + * @api + */ + setLineDash(e) { + this.lineDash_ = e; + } + /** + * Set the line dash offset. + * + * @param {number|undefined} lineDashOffset Line dash offset. + * @api + */ + setLineDashOffset(e) { + this.lineDashOffset_ = e; + } + /** + * Set the line join. + * + * @param {CanvasLineJoin|undefined} lineJoin Line join. + * @api + */ + setLineJoin(e) { + this.lineJoin_ = e; + } + /** + * Set the miter limit. + * + * @param {number|undefined} miterLimit Miter limit. + * @api + */ + setMiterLimit(e) { + this.miterLimit_ = e; + } + /** + * Set the width. + * + * @param {number|undefined} width Width. + * @api + */ + setWidth(e) { + this.width_ = e; + } +} +class pt { + /** + * @param {Options} [options] Style options. + */ + constructor(e) { + e = e || {}, this.geometry_ = null, this.geometryFunction_ = Uf, e.geometry !== void 0 && this.setGeometry(e.geometry), this.fill_ = e.fill !== void 0 ? e.fill : null, this.image_ = e.image !== void 0 ? e.image : null, this.renderer_ = e.renderer !== void 0 ? e.renderer : null, this.hitDetectionRenderer_ = e.hitDetectionRenderer !== void 0 ? e.hitDetectionRenderer : null, this.stroke_ = e.stroke !== void 0 ? e.stroke : null, this.text_ = e.text !== void 0 ? e.text : null, this.zIndex_ = e.zIndex; + } + /** + * Clones the style. + * @return {Style} The cloned style. + * @api + */ + clone() { + let e = this.getGeometry(); + return e && typeof e == "object" && (e = /** @type {import("../geom/Geometry.js").default} */ + e.clone()), new pt({ + geometry: e ?? void 0, + fill: this.getFill() ? this.getFill().clone() : void 0, + image: this.getImage() ? this.getImage().clone() : void 0, + renderer: this.getRenderer() ?? void 0, + stroke: this.getStroke() ? this.getStroke().clone() : void 0, + text: this.getText() ? this.getText().clone() : void 0, + zIndex: this.getZIndex() + }); + } + /** + * Get the custom renderer function that was configured with + * {@link #setRenderer} or the `renderer` constructor option. + * @return {RenderFunction|null} Custom renderer function. + * @api + */ + getRenderer() { + return this.renderer_; + } + /** + * Sets a custom renderer function for this style. When set, `fill`, `stroke` + * and `image` options of the style will be ignored. + * @param {RenderFunction|null} renderer Custom renderer function. + * @api + */ + setRenderer(e) { + this.renderer_ = e; + } + /** + * Sets a custom renderer function for this style used + * in hit detection. + * @param {RenderFunction|null} renderer Custom renderer function. + * @api + */ + setHitDetectionRenderer(e) { + this.hitDetectionRenderer_ = e; + } + /** + * Get the custom renderer function that was configured with + * {@link #setHitDetectionRenderer} or the `hitDetectionRenderer` constructor option. + * @return {RenderFunction|null} Custom renderer function. + * @api + */ + getHitDetectionRenderer() { + return this.hitDetectionRenderer_; + } + /** + * Get the geometry to be rendered. + * @return {string|import("../geom/Geometry.js").default|GeometryFunction|null} + * Feature property or geometry or function that returns the geometry that will + * be rendered with this style. + * @api + */ + getGeometry() { + return this.geometry_; + } + /** + * Get the function used to generate a geometry for rendering. + * @return {!GeometryFunction} Function that is called with a feature + * and returns the geometry to render instead of the feature's geometry. + * @api + */ + getGeometryFunction() { + return this.geometryFunction_; + } + /** + * Get the fill style. + * @return {import("./Fill.js").default|null} Fill style. + * @api + */ + getFill() { + return this.fill_; + } + /** + * Set the fill style. + * @param {import("./Fill.js").default|null} fill Fill style. + * @api + */ + setFill(e) { + this.fill_ = e; + } + /** + * Get the image style. + * @return {import("./Image.js").default|null} Image style. + * @api + */ + getImage() { + return this.image_; + } + /** + * Set the image style. + * @param {import("./Image.js").default} image Image style. + * @api + */ + setImage(e) { + this.image_ = e; + } + /** + * Get the stroke style. + * @return {import("./Stroke.js").default|null} Stroke style. + * @api + */ + getStroke() { + return this.stroke_; + } + /** + * Set the stroke style. + * @param {import("./Stroke.js").default|null} stroke Stroke style. + * @api + */ + setStroke(e) { + this.stroke_ = e; + } + /** + * Get the text style. + * @return {import("./Text.js").default|null} Text style. + * @api + */ + getText() { + return this.text_; + } + /** + * Set the text style. + * @param {import("./Text.js").default} text Text style. + * @api + */ + setText(e) { + this.text_ = e; + } + /** + * Get the z-index for the style. + * @return {number|undefined} ZIndex. + * @api + */ + getZIndex() { + return this.zIndex_; + } + /** + * Set a geometry that is rendered instead of the feature's geometry. + * + * @param {string|import("../geom/Geometry.js").default|GeometryFunction} geometry + * Feature property or geometry or function returning a geometry to render + * for this style. + * @api + */ + setGeometry(e) { + typeof e == "function" ? this.geometryFunction_ = e : typeof e == "string" ? this.geometryFunction_ = function(t) { + return ( + /** @type {import("../geom/Geometry.js").default} */ + t.get(e) + ); + } : e ? e !== void 0 && (this.geometryFunction_ = function() { + return ( + /** @type {import("../geom/Geometry.js").default} */ + e + ); + }) : this.geometryFunction_ = Uf, this.geometry_ = e; + } + /** + * Set the z-index. + * + * @param {number|undefined} zIndex ZIndex. + * @api + */ + setZIndex(e) { + this.zIndex_ = e; + } +} +function Lw(n) { + let e; + if (typeof n == "function") + e = n; + else { + let t; + Array.isArray(n) ? t = n : (Ie( + typeof /** @type {?} */ + n.getZIndex == "function", + "Expected an `Style` or an array of `Style`" + ), t = [ + /** @type {Style} */ + n + ]), e = function() { + return t; + }; + } + return e; +} +let Eh = null; +function n_(n, e) { + if (!Eh) { + const t = new Mi({ + color: "rgba(255,255,255,0.4)" + }), i = new Ii({ + color: "#3399CC", + width: 1.25 + }); + Eh = [ + new pt({ + image: new gl({ + fill: t, + stroke: i, + radius: 5 + }), + fill: t, + stroke: i + }) + ]; + } + return Eh; +} +function dl() { + const n = {}, e = [255, 255, 255, 1], t = [0, 153, 255, 1], i = 3; + return n.Polygon = [ + new pt({ + fill: new Mi({ + color: [255, 255, 255, 0.5] + }) + }) + ], n.MultiPolygon = n.Polygon, n.LineString = [ + new pt({ + stroke: new Ii({ + color: e, + width: i + 2 + }) + }), + new pt({ + stroke: new Ii({ + color: t, + width: i + }) + }) + ], n.MultiLineString = n.LineString, n.Circle = n.Polygon.concat(n.LineString), n.Point = [ + new pt({ + image: new gl({ + radius: i * 2, + fill: new Mi({ + color: t + }), + stroke: new Ii({ + color: e, + width: i / 2 + }) + }), + zIndex: 1 / 0 + }) + ], n.MultiPoint = n.Point, n.GeometryCollection = n.Polygon.concat( + n.LineString, + n.Point + ), n; +} +function Uf(n) { + return n.getGeometry(); +} +function Yf(n, e, t, i) { + return t !== void 0 && i !== void 0 ? [t / n, i / e] : t !== void 0 ? t / n : i !== void 0 ? i / e : 1; +} +class Do extends xc { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}; + const t = e.opacity !== void 0 ? e.opacity : 1, i = e.rotation !== void 0 ? e.rotation : 0, r = e.scale !== void 0 ? e.scale : 1, s = e.rotateWithView !== void 0 ? e.rotateWithView : !1; + super({ + opacity: t, + rotation: i, + scale: r, + displacement: e.displacement !== void 0 ? e.displacement : [0, 0], + rotateWithView: s, + declutterMode: e.declutterMode + }), this.anchor_ = e.anchor !== void 0 ? e.anchor : [0.5, 0.5], this.normalizedAnchor_ = null, this.anchorOrigin_ = e.anchorOrigin !== void 0 ? e.anchorOrigin : "top-left", this.anchorXUnits_ = e.anchorXUnits !== void 0 ? e.anchorXUnits : "fraction", this.anchorYUnits_ = e.anchorYUnits !== void 0 ? e.anchorYUnits : "fraction", this.crossOrigin_ = e.crossOrigin !== void 0 ? e.crossOrigin : null; + const o = e.img !== void 0 ? e.img : null; + let a = e.src; + Ie( + !(a !== void 0 && o), + "`image` and `src` cannot be provided at the same time" + ), (a === void 0 || a.length === 0) && o && (a = /** @type {HTMLImageElement} */ + o.src || X(o)), Ie( + a !== void 0 && a.length > 0, + "A defined and non-empty `src` or `image` must be provided" + ), Ie( + !((e.width !== void 0 || e.height !== void 0) && e.scale !== void 0), + "`width` or `height` cannot be provided together with `scale`" + ); + let l; + if (e.src !== void 0 ? l = W.IDLE : o !== void 0 && ("complete" in o ? o.complete ? l = o.src ? W.LOADED : W.IDLE : l = W.LOADING : l = W.LOADED), this.color_ = e.color !== void 0 ? qi(e.color) : null, this.iconImage_ = $g( + o, + /** @type {string} */ + a, + this.crossOrigin_, + l, + this.color_ + ), this.offset_ = e.offset !== void 0 ? e.offset : [0, 0], this.offsetOrigin_ = e.offsetOrigin !== void 0 ? e.offsetOrigin : "top-left", this.origin_ = null, this.size_ = e.size !== void 0 ? e.size : null, this.initialOptions_, e.width !== void 0 || e.height !== void 0) { + let A, c; + if (e.size) + [A, c] = e.size; + else { + const h = this.getImage(1); + if (h.width && h.height) + A = h.width, c = h.height; + else if (h instanceof HTMLImageElement) { + this.initialOptions_ = e; + const u = () => { + if (this.unlistenImageChange(u), !this.initialOptions_) + return; + const g = this.iconImage_.getSize(); + this.setScale( + Yf( + g[0], + g[1], + e.width, + e.height + ) + ); + }; + this.listenImageChange(u); + return; + } + } + A !== void 0 && this.setScale( + Yf(A, c, e.width, e.height) + ); + } + } + /** + * Clones the style. The underlying Image/HTMLCanvasElement is not cloned. + * @return {Icon} The cloned style. + * @api + * @override + */ + clone() { + let e, t, i; + return this.initialOptions_ ? (t = this.initialOptions_.width, i = this.initialOptions_.height) : (e = this.getScale(), e = Array.isArray(e) ? e.slice() : e), new Do({ + anchor: this.anchor_.slice(), + anchorOrigin: this.anchorOrigin_, + anchorXUnits: this.anchorXUnits_, + anchorYUnits: this.anchorYUnits_, + color: this.color_ && this.color_.slice ? this.color_.slice() : this.color_ || void 0, + crossOrigin: this.crossOrigin_, + offset: this.offset_.slice(), + offsetOrigin: this.offsetOrigin_, + opacity: this.getOpacity(), + rotateWithView: this.getRotateWithView(), + rotation: this.getRotation(), + scale: e, + width: t, + height: i, + size: this.size_ !== null ? this.size_.slice() : void 0, + src: this.getSrc(), + displacement: this.getDisplacement().slice(), + declutterMode: this.getDeclutterMode() + }); + } + /** + * Get the anchor point in pixels. The anchor determines the center point for the + * symbolizer. + * @return {Array} Anchor. + * @api + * @override + */ + getAnchor() { + let e = this.normalizedAnchor_; + if (!e) { + e = this.anchor_; + const r = this.getSize(); + if (this.anchorXUnits_ == "fraction" || this.anchorYUnits_ == "fraction") { + if (!r) + return null; + e = this.anchor_.slice(), this.anchorXUnits_ == "fraction" && (e[0] *= r[0]), this.anchorYUnits_ == "fraction" && (e[1] *= r[1]); + } + if (this.anchorOrigin_ != "top-left") { + if (!r) + return null; + e === this.anchor_ && (e = this.anchor_.slice()), (this.anchorOrigin_ == "top-right" || this.anchorOrigin_ == "bottom-right") && (e[0] = -e[0] + r[0]), (this.anchorOrigin_ == "bottom-left" || this.anchorOrigin_ == "bottom-right") && (e[1] = -e[1] + r[1]); + } + this.normalizedAnchor_ = e; + } + const t = this.getDisplacement(), i = this.getScaleArray(); + return [ + e[0] - t[0] / i[0], + e[1] + t[1] / i[1] + ]; + } + /** + * Set the anchor point. The anchor determines the center point for the + * symbolizer. + * + * @param {Array} anchor Anchor. + * @api + */ + setAnchor(e) { + this.anchor_ = e, this.normalizedAnchor_ = null; + } + /** + * Get the icon color. + * @return {import("../color.js").Color} Color. + * @api + */ + getColor() { + return this.color_; + } + /** + * Get the image icon. + * @param {number} pixelRatio Pixel ratio. + * @return {HTMLImageElement|HTMLCanvasElement|ImageBitmap} Image or Canvas element. If the Icon + * style was configured with `src` or with a not let loaded `img`, an `ImageBitmap` will be returned. + * @api + * @override + */ + getImage(e) { + return this.iconImage_.getImage(e); + } + /** + * Get the pixel ratio. + * @param {number} pixelRatio Pixel ratio. + * @return {number} The pixel ratio of the image. + * @api + * @override + */ + getPixelRatio(e) { + return this.iconImage_.getPixelRatio(e); + } + /** + * @return {import("../size.js").Size} Image size. + * @override + */ + getImageSize() { + return this.iconImage_.getSize(); + } + /** + * @return {import("../ImageState.js").default} Image state. + * @override + */ + getImageState() { + return this.iconImage_.getImageState(); + } + /** + * @return {HTMLImageElement|HTMLCanvasElement|ImageBitmap} Image element. + * @override + */ + getHitDetectionImage() { + return this.iconImage_.getHitDetectionImage(); + } + /** + * Get the origin of the symbolizer. + * @return {Array} Origin. + * @api + * @override + */ + getOrigin() { + if (this.origin_) + return this.origin_; + let e = this.offset_; + if (this.offsetOrigin_ != "top-left") { + const t = this.getSize(), i = this.iconImage_.getSize(); + if (!t || !i) + return null; + e = e.slice(), (this.offsetOrigin_ == "top-right" || this.offsetOrigin_ == "bottom-right") && (e[0] = i[0] - t[0] - e[0]), (this.offsetOrigin_ == "bottom-left" || this.offsetOrigin_ == "bottom-right") && (e[1] = i[1] - t[1] - e[1]); + } + return this.origin_ = e, this.origin_; + } + /** + * Get the image URL. + * @return {string|undefined} Image src. + * @api + */ + getSrc() { + return this.iconImage_.getSrc(); + } + /** + * Get the size of the icon (in pixels). + * @return {import("../size.js").Size} Image size. + * @api + * @override + */ + getSize() { + return this.size_ ? this.size_ : this.iconImage_.getSize(); + } + /** + * Get the width of the icon (in pixels). Will return undefined when the icon image is not yet loaded. + * @return {number} Icon width (in pixels). + * @api + */ + getWidth() { + const e = this.getScaleArray(); + if (this.size_) + return this.size_[0] * e[0]; + if (this.iconImage_.getImageState() == W.LOADED) + return this.iconImage_.getSize()[0] * e[0]; + } + /** + * Get the height of the icon (in pixels). Will return undefined when the icon image is not yet loaded. + * @return {number} Icon height (in pixels). + * @api + */ + getHeight() { + const e = this.getScaleArray(); + if (this.size_) + return this.size_[1] * e[1]; + if (this.iconImage_.getImageState() == W.LOADED) + return this.iconImage_.getSize()[1] * e[1]; + } + /** + * Set the scale. + * + * @param {number|import("../size.js").Size} scale Scale. + * @api + * @override + */ + setScale(e) { + delete this.initialOptions_, super.setScale(e); + } + /** + * @param {function(import("../events/Event.js").default): void} listener Listener function. + * @override + */ + listenImageChange(e) { + this.iconImage_.addEventListener(j.CHANGE, e); + } + /** + * Load not yet loaded URI. + * When rendering a feature with an icon style, the vector renderer will + * automatically call this method. However, you might want to call this + * method yourself for preloading or other purposes. + * @api + * @override + */ + load() { + this.iconImage_.load(); + } + /** + * @param {function(import("../events/Event.js").default): void} listener Listener function. + * @override + */ + unlistenImageChange(e) { + this.iconImage_.removeEventListener(j.CHANGE, e); + } + /** + * @override + */ + ready() { + return this.iconImage_.ready(); + } +} +const Fw = "#333"; +class Xr { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, this.font_ = e.font, this.rotation_ = e.rotation, this.rotateWithView_ = e.rotateWithView, this.scale_ = e.scale, this.scaleArray_ = qe(e.scale !== void 0 ? e.scale : 1), this.text_ = e.text, this.textAlign_ = e.textAlign, this.justify_ = e.justify, this.repeat_ = e.repeat, this.textBaseline_ = e.textBaseline, this.fill_ = e.fill !== void 0 ? e.fill : new Mi({ color: Fw }), this.maxAngle_ = e.maxAngle !== void 0 ? e.maxAngle : Math.PI / 4, this.placement_ = e.placement !== void 0 ? e.placement : "point", this.overflow_ = !!e.overflow, this.stroke_ = e.stroke !== void 0 ? e.stroke : null, this.offsetX_ = e.offsetX !== void 0 ? e.offsetX : 0, this.offsetY_ = e.offsetY !== void 0 ? e.offsetY : 0, this.backgroundFill_ = e.backgroundFill ? e.backgroundFill : null, this.backgroundStroke_ = e.backgroundStroke ? e.backgroundStroke : null, this.padding_ = e.padding === void 0 ? null : e.padding, this.declutterMode_ = e.declutterMode; + } + /** + * Clones the style. + * @return {Text} The cloned style. + * @api + */ + clone() { + const e = this.getScale(); + return new Xr({ + font: this.getFont(), + placement: this.getPlacement(), + repeat: this.getRepeat(), + maxAngle: this.getMaxAngle(), + overflow: this.getOverflow(), + rotation: this.getRotation(), + rotateWithView: this.getRotateWithView(), + scale: Array.isArray(e) ? e.slice() : e, + text: this.getText(), + textAlign: this.getTextAlign(), + justify: this.getJustify(), + textBaseline: this.getTextBaseline(), + fill: this.getFill() ? this.getFill().clone() : void 0, + stroke: this.getStroke() ? this.getStroke().clone() : void 0, + offsetX: this.getOffsetX(), + offsetY: this.getOffsetY(), + backgroundFill: this.getBackgroundFill() ? this.getBackgroundFill().clone() : void 0, + backgroundStroke: this.getBackgroundStroke() ? this.getBackgroundStroke().clone() : void 0, + padding: this.getPadding() || void 0, + declutterMode: this.getDeclutterMode() + }); + } + /** + * Get the `overflow` configuration. + * @return {boolean} Let text overflow the length of the path they follow. + * @api + */ + getOverflow() { + return this.overflow_; + } + /** + * Get the font name. + * @return {string|undefined} Font. + * @api + */ + getFont() { + return this.font_; + } + /** + * Get the maximum angle between adjacent characters. + * @return {number} Angle in radians. + * @api + */ + getMaxAngle() { + return this.maxAngle_; + } + /** + * Get the label placement. + * @return {TextPlacement} Text placement. + * @api + */ + getPlacement() { + return this.placement_; + } + /** + * Get the repeat interval of the text. + * @return {number|undefined} Repeat interval in pixels. + * @api + */ + getRepeat() { + return this.repeat_; + } + /** + * Get the x-offset for the text. + * @return {number} Horizontal text offset. + * @api + */ + getOffsetX() { + return this.offsetX_; + } + /** + * Get the y-offset for the text. + * @return {number} Vertical text offset. + * @api + */ + getOffsetY() { + return this.offsetY_; + } + /** + * Get the fill style for the text. + * @return {import("./Fill.js").default|null} Fill style. + * @api + */ + getFill() { + return this.fill_; + } + /** + * Determine whether the text rotates with the map. + * @return {boolean|undefined} Rotate with map. + * @api + */ + getRotateWithView() { + return this.rotateWithView_; + } + /** + * Get the text rotation. + * @return {number|undefined} Rotation. + * @api + */ + getRotation() { + return this.rotation_; + } + /** + * Get the text scale. + * @return {number|import("../size.js").Size|undefined} Scale. + * @api + */ + getScale() { + return this.scale_; + } + /** + * Get the symbolizer scale array. + * @return {import("../size.js").Size} Scale array. + */ + getScaleArray() { + return this.scaleArray_; + } + /** + * Get the stroke style for the text. + * @return {import("./Stroke.js").default|null} Stroke style. + * @api + */ + getStroke() { + return this.stroke_; + } + /** + * Get the text to be rendered. + * @return {string|Array|undefined} Text. + * @api + */ + getText() { + return this.text_; + } + /** + * Get the text alignment. + * @return {CanvasTextAlign|undefined} Text align. + * @api + */ + getTextAlign() { + return this.textAlign_; + } + /** + * Get the justification. + * @return {TextJustify|undefined} Justification. + * @api + */ + getJustify() { + return this.justify_; + } + /** + * Get the text baseline. + * @return {CanvasTextBaseline|undefined} Text baseline. + * @api + */ + getTextBaseline() { + return this.textBaseline_; + } + /** + * Get the background fill style for the text. + * @return {import("./Fill.js").default|null} Fill style. + * @api + */ + getBackgroundFill() { + return this.backgroundFill_; + } + /** + * Get the background stroke style for the text. + * @return {import("./Stroke.js").default|null} Stroke style. + * @api + */ + getBackgroundStroke() { + return this.backgroundStroke_; + } + /** + * Get the padding for the text. + * @return {Array|null} Padding. + * @api + */ + getPadding() { + return this.padding_; + } + /** + * Get the declutter mode of the shape + * @return {import("./Style.js").DeclutterMode} Shape's declutter mode + * @api + */ + getDeclutterMode() { + return this.declutterMode_; + } + /** + * Set the `overflow` property. + * + * @param {boolean} overflow Let text overflow the path that it follows. + * @api + */ + setOverflow(e) { + this.overflow_ = e; + } + /** + * Set the font. + * + * @param {string|undefined} font Font. + * @api + */ + setFont(e) { + this.font_ = e; + } + /** + * Set the maximum angle between adjacent characters. + * + * @param {number} maxAngle Angle in radians. + * @api + */ + setMaxAngle(e) { + this.maxAngle_ = e; + } + /** + * Set the x offset. + * + * @param {number} offsetX Horizontal text offset. + * @api + */ + setOffsetX(e) { + this.offsetX_ = e; + } + /** + * Set the y offset. + * + * @param {number} offsetY Vertical text offset. + * @api + */ + setOffsetY(e) { + this.offsetY_ = e; + } + /** + * Set the text placement. + * + * @param {TextPlacement} placement Placement. + * @api + */ + setPlacement(e) { + this.placement_ = e; + } + /** + * Set the repeat interval of the text. + * @param {number|undefined} [repeat] Repeat interval in pixels. + * @api + */ + setRepeat(e) { + this.repeat_ = e; + } + /** + * Set whether to rotate the text with the view. + * + * @param {boolean} rotateWithView Rotate with map. + * @api + */ + setRotateWithView(e) { + this.rotateWithView_ = e; + } + /** + * Set the fill. + * + * @param {import("./Fill.js").default|null} fill Fill style. + * @api + */ + setFill(e) { + this.fill_ = e; + } + /** + * Set the rotation. + * + * @param {number|undefined} rotation Rotation. + * @api + */ + setRotation(e) { + this.rotation_ = e; + } + /** + * Set the scale. + * + * @param {number|import("../size.js").Size|undefined} scale Scale. + * @api + */ + setScale(e) { + this.scale_ = e, this.scaleArray_ = qe(e !== void 0 ? e : 1); + } + /** + * Set the stroke. + * + * @param {import("./Stroke.js").default|null} stroke Stroke style. + * @api + */ + setStroke(e) { + this.stroke_ = e; + } + /** + * Set the text. + * + * @param {string|Array|undefined} text Text. + * @api + */ + setText(e) { + this.text_ = e; + } + /** + * Set the text alignment. + * + * @param {CanvasTextAlign|undefined} textAlign Text align. + * @api + */ + setTextAlign(e) { + this.textAlign_ = e; + } + /** + * Set the justification. + * + * @param {TextJustify|undefined} justify Justification. + * @api + */ + setJustify(e) { + this.justify_ = e; + } + /** + * Set the text baseline. + * + * @param {CanvasTextBaseline|undefined} textBaseline Text baseline. + * @api + */ + setTextBaseline(e) { + this.textBaseline_ = e; + } + /** + * Set the background fill. + * + * @param {import("./Fill.js").default|null} fill Fill style. + * @api + */ + setBackgroundFill(e) { + this.backgroundFill_ = e; + } + /** + * Set the background stroke. + * + * @param {import("./Stroke.js").default|null} stroke Stroke style. + * @api + */ + setBackgroundStroke(e) { + this.backgroundStroke_ = e; + } + /** + * Set the padding (`[top, right, bottom, left]`). + * + * @param {Array|null} padding Padding. + * @api + */ + setPadding(e) { + this.padding_ = e; + } +} +let cs = 0; +const DO = 0, Pt = 1 << cs++, ee = 1 << cs++, vt = 1 << cs++, We = 1 << cs++, jt = 1 << cs++, Vi = 1 << cs++, kl = Math.pow(2, cs) - 1, Ug = { + [Pt]: "boolean", + [ee]: "number", + [vt]: "string", + [We]: "color", + [jt]: "number[]", + [Vi]: "size" +}, bw = Object.keys(Ug).map(Number).sort(gn); +function Pw(n) { + return n in Ug; +} +function $s(n) { + const e = []; + for (const t of bw) + Aa(n, t) && e.push(Ug[t]); + return e.length === 0 ? "untyped" : e.length < 3 ? e.join(" or ") : e.slice(0, -1).join(", ") + ", or " + e[e.length - 1]; +} +function Aa(n, e) { + return (n & e) === e; +} +function LO(n, e) { + return !!(n & e); +} +function er(n, e) { + return n === e; +} +class Ct { + /** + * @param {number} type The value type. + * @param {LiteralValue} value The literal value. + */ + constructor(e, t) { + if (!Pw(e)) + throw new Error( + `literal expressions must have a specific type, got ${$s(e)}` + ); + this.type = e, this.value = t; + } +} +class r_ { + /** + * @param {number} type The return type. + * @param {string} operator The operator. + * @param {...Expression} args The arguments. + */ + constructor(e, t, ...i) { + this.type = e, this.operator = t, this.args = i; + } +} +function Yg() { + return { + variables: /* @__PURE__ */ new Set(), + properties: /* @__PURE__ */ new Set(), + featureId: !1, + geometryType: !1 + }; +} +function Qt(n, e, t) { + switch (typeof n) { + case "boolean": { + if (er(e, vt)) + return new Ct(vt, n ? "true" : "false"); + if (!Aa(e, Pt)) + throw new Error( + `got a boolean, but expected ${$s(e)}` + ); + return new Ct(Pt, n); + } + case "number": { + if (er(e, Vi)) + return new Ct(Vi, qe(n)); + if (er(e, Pt)) + return new Ct(Pt, !!n); + if (er(e, vt)) + return new Ct(vt, n.toString()); + if (!Aa(e, ee)) + throw new Error(`got a number, but expected ${$s(e)}`); + return new Ct(ee, n); + } + case "string": { + if (er(e, We)) + return new Ct(We, Bc(n)); + if (er(e, Pt)) + return new Ct(Pt, !!n); + if (!Aa(e, vt)) + throw new Error(`got a string, but expected ${$s(e)}`); + return new Ct(vt, n); + } + } + if (!Array.isArray(n)) + throw new Error("expression must be an array or a primitive value"); + if (n.length === 0) + throw new Error("empty expression"); + if (typeof n[0] == "string") + return Hw(n, e, t); + for (const i of n) + if (typeof i != "number") + throw new Error("expected an array of numbers"); + if (er(e, Vi)) { + if (n.length !== 2) + throw new Error( + `expected an array of two values for a size, got ${n.length}` + ); + return new Ct(Vi, n); + } + if (er(e, We)) { + if (n.length === 3) + return new Ct(We, [...n, 1]); + if (n.length === 4) + return new Ct(We, n); + throw new Error( + `expected an array of 3 or 4 values for a color, got ${n.length}` + ); + } + if (!Aa(e, jt)) + throw new Error( + `got an array of numbers, but expected ${$s(e)}` + ); + return new Ct(jt, n); +} +const b = { + Get: "get", + Var: "var", + Concat: "concat", + GeometryType: "geometry-type", + LineMetric: "line-metric", + Any: "any", + All: "all", + Not: "!", + Resolution: "resolution", + Zoom: "zoom", + Time: "time", + Equal: "==", + NotEqual: "!=", + GreaterThan: ">", + GreaterThanOrEqualTo: ">=", + LessThan: "<", + LessThanOrEqualTo: "<=", + Multiply: "*", + Divide: "/", + Add: "+", + Subtract: "-", + Clamp: "clamp", + Mod: "%", + Pow: "^", + Abs: "abs", + Floor: "floor", + Ceil: "ceil", + Round: "round", + Sin: "sin", + Cos: "cos", + Atan: "atan", + Sqrt: "sqrt", + Match: "match", + Between: "between", + Interpolate: "interpolate", + Coalesce: "coalesce", + Case: "case", + In: "in", + Number: "number", + String: "string", + Array: "array", + Color: "color", + Id: "id", + Band: "band", + Palette: "palette", + ToString: "to-string", + Has: "has" +}, Mw = { + [b.Get]: pe(Ce(1, 1 / 0), zf), + [b.Var]: pe(Ce(1, 1), Nw), + [b.Has]: pe(Ce(1, 1 / 0), zf), + [b.Id]: pe(Ow, Cs), + [b.Concat]: pe( + Ce(2, 1 / 0), + Oe(vt) + ), + [b.GeometryType]: pe(Gw, Cs), + [b.LineMetric]: pe(Cs), + [b.Resolution]: pe(Cs), + [b.Zoom]: pe(Cs), + [b.Time]: pe(Cs), + [b.Any]: pe( + Ce(2, 1 / 0), + Oe(Pt) + ), + [b.All]: pe( + Ce(2, 1 / 0), + Oe(Pt) + ), + [b.Not]: pe( + Ce(1, 1), + Oe(Pt) + ), + [b.Equal]: pe( + Ce(2, 2), + Oe(kl) + ), + [b.NotEqual]: pe( + Ce(2, 2), + Oe(kl) + ), + [b.GreaterThan]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.GreaterThanOrEqualTo]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.LessThan]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.LessThanOrEqualTo]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.Multiply]: pe( + Ce(2, 1 / 0), + Vf + ), + [b.Coalesce]: pe( + Ce(2, 1 / 0), + Vf + ), + [b.Divide]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.Add]: pe( + Ce(2, 1 / 0), + Oe(ee) + ), + [b.Subtract]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.Clamp]: pe( + Ce(3, 3), + Oe(ee) + ), + [b.Mod]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.Pow]: pe( + Ce(2, 2), + Oe(ee) + ), + [b.Abs]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Floor]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Ceil]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Round]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Sin]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Cos]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Atan]: pe( + Ce(1, 2), + Oe(ee) + ), + [b.Sqrt]: pe( + Ce(1, 1), + Oe(ee) + ), + [b.Match]: pe( + Ce(4, 1 / 0), + Hf, + $w + ), + [b.Between]: pe( + Ce(3, 3), + Oe(ee) + ), + [b.Interpolate]: pe( + Ce(6, 1 / 0), + Hf, + Uw + ), + [b.Case]: pe( + Ce(3, 1 / 0), + kw, + Yw + ), + [b.In]: pe(Ce(2, 2), zw), + [b.Number]: pe( + Ce(1, 1 / 0), + Oe(kl) + ), + [b.String]: pe( + Ce(1, 1 / 0), + Oe(kl) + ), + [b.Array]: pe( + Ce(1, 1 / 0), + Oe(ee) + ), + [b.Color]: pe( + Ce(1, 4), + Oe(ee) + ), + [b.Band]: pe( + Ce(1, 3), + Oe(ee) + ), + [b.Palette]: pe( + Ce(2, 2), + Vw + ), + [b.ToString]: pe( + Ce(1, 1), + Oe(Pt | ee | vt | We) + ) +}; +function zf(n, e, t) { + const i = n.length - 1, r = new Array(i); + for (let s = 0; s < i; ++s) { + const o = n[s + 1]; + switch (typeof o) { + case "number": { + r[s] = new Ct(ee, o); + break; + } + case "string": { + r[s] = new Ct(vt, o); + break; + } + default: + throw new Error( + `expected a string key or numeric array index for a get operation, got ${o}` + ); + } + s === 0 && t.properties.add(String(o)); + } + return r; +} +function Nw(n, e, t) { + const i = n[1]; + if (typeof i != "string") + throw new Error("expected a string argument for var operation"); + return t.variables.add(i), [new Ct(vt, i)]; +} +function Ow(n, e, t) { + t.featureId = !0; +} +function Gw(n, e, t) { + t.geometryType = !0; +} +function Cs(n, e, t) { + const i = n[0]; + if (n.length !== 1) + throw new Error(`expected no arguments for ${i} operation`); + return []; +} +function Ce(n, e) { + return function(t, i, r) { + const s = t[0], o = t.length - 1; + if (n === e) { + if (o !== n) { + const a = n === 1 ? "" : "s"; + throw new Error( + `expected ${n} argument${a} for ${s}, got ${o}` + ); + } + } else if (o < n || o > e) { + const a = e === 1 / 0 ? `${n} or more` : `${n} to ${e}`; + throw new Error( + `expected ${a} arguments for ${s}, got ${o}` + ); + } + }; +} +function Vf(n, e, t) { + const i = n.length - 1, r = new Array(i); + for (let s = 0; s < i; ++s) { + const o = Qt(n[s + 1], e, t); + r[s] = o; + } + return r; +} +function Oe(n) { + return function(e, t, i) { + const r = e.length - 1, s = new Array(r); + for (let o = 0; o < r; ++o) { + const a = Qt(e[o + 1], n, i); + s[o] = a; + } + return s; + }; +} +function kw(n, e, t) { + const i = n[0], r = n.length - 1; + if (r % 2 === 0) + throw new Error( + `expected an odd number of arguments for ${i}, got ${r} instead` + ); +} +function Hf(n, e, t) { + const i = n[0], r = n.length - 1; + if (r % 2 === 1) + throw new Error( + `expected an even number of arguments for operation ${i}, got ${r} instead` + ); +} +function $w(n, e, t) { + const i = n.length - 1, r = vt | ee | Pt, s = Qt(n[1], r, t), o = Qt(n[n.length - 1], e, t), a = new Array(i - 2); + for (let l = 0; l < i - 2; l += 2) { + try { + const A = Qt(n[l + 2], s.type, t); + a[l] = A; + } catch (A) { + throw new Error( + `failed to parse argument ${l + 1} of match expression: ${A.message}` + ); + } + try { + const A = Qt(n[l + 3], o.type, t); + a[l + 1] = A; + } catch (A) { + throw new Error( + `failed to parse argument ${l + 2} of match expression: ${A.message}` + ); + } + } + return [s, ...a, o]; +} +function Uw(n, e, t) { + const i = n[1]; + let r; + switch (i[0]) { + case "linear": + r = 1; + break; + case "exponential": + const l = i[1]; + if (typeof l != "number" || l <= 0) + throw new Error( + `expected a number base for exponential interpolation, got ${JSON.stringify(l)} instead` + ); + r = l; + break; + default: + throw new Error( + `invalid interpolation type: ${JSON.stringify(i)}` + ); + } + const s = new Ct(ee, r); + let o; + try { + o = Qt(n[2], ee, t); + } catch (l) { + throw new Error( + `failed to parse argument 1 in interpolate expression: ${l.message}` + ); + } + const a = new Array(n.length - 3); + for (let l = 0; l < a.length; l += 2) { + try { + const A = Qt(n[l + 3], ee, t); + a[l] = A; + } catch (A) { + throw new Error( + `failed to parse argument ${l + 2} for interpolate expression: ${A.message}` + ); + } + try { + const A = Qt(n[l + 4], e, t); + a[l + 1] = A; + } catch (A) { + throw new Error( + `failed to parse argument ${l + 3} for interpolate expression: ${A.message}` + ); + } + } + return [s, o, ...a]; +} +function Yw(n, e, t) { + const i = Qt(n[n.length - 1], e, t), r = new Array(n.length - 1); + for (let s = 0; s < r.length - 1; s += 2) { + try { + const o = Qt(n[s + 1], Pt, t); + r[s] = o; + } catch (o) { + throw new Error( + `failed to parse argument ${s} of case expression: ${o.message}` + ); + } + try { + const o = Qt(n[s + 2], i.type, t); + r[s + 1] = o; + } catch (o) { + throw new Error( + `failed to parse argument ${s + 1} of case expression: ${o.message}` + ); + } + } + return r[r.length - 1] = i, r; +} +function zw(n, e, t) { + let i = n[2]; + if (!Array.isArray(i)) + throw new Error( + 'the second argument for the "in" operator must be an array' + ); + let r; + if (typeof i[0] == "string") { + if (i[0] !== "literal") + throw new Error( + 'for the "in" operator, a string array should be wrapped in a "literal" operator to disambiguate from expressions' + ); + if (!Array.isArray(i[1])) + throw new Error( + 'failed to parse "in" expression: the literal operator must be followed by an array' + ); + i = i[1], r = vt; + } else + r = ee; + const s = new Array(i.length); + for (let a = 0; a < s.length; a++) + try { + const l = Qt(i[a], r, t); + s[a] = l; + } catch (l) { + throw new Error( + `failed to parse haystack item ${a} for "in" expression: ${l.message}` + ); + } + return [Qt(n[1], r, t), ...s]; +} +function Vw(n, e, t) { + let i; + try { + i = Qt(n[1], ee, t); + } catch (o) { + throw new Error( + `failed to parse first argument in palette expression: ${o.message}` + ); + } + const r = n[2]; + if (!Array.isArray(r)) + throw new Error("the second argument of palette must be an array"); + const s = new Array(r.length); + for (let o = 0; o < s.length; o++) { + let a; + try { + a = Qt(r[o], We, t); + } catch (l) { + throw new Error( + `failed to parse color at index ${o} in palette expression: ${l.message}` + ); + } + if (!(a instanceof Ct)) + throw new Error( + `the palette color at index ${o} must be a literal value` + ); + s[o] = a; + } + return [i, ...s]; +} +function pe(...n) { + return function(e, t, i) { + const r = e[0]; + let s; + for (let o = 0; o < n.length; o++) { + const a = n[o](e, t, i); + if (o == n.length - 1) { + if (!a) + throw new Error( + "expected last argument validator to return the parsed args" + ); + s = a; + } + } + return new r_(t, r, ...s); + }; +} +function Hw(n, e, t) { + const i = n[0], r = Mw[i]; + if (!r) + throw new Error(`unknown operator: ${i}`); + return r(n, e, t); +} +function zg(n) { + if (!n) + return ""; + const e = n.getType(); + switch (e) { + case "Point": + case "LineString": + case "Polygon": + return e; + case "MultiPoint": + case "MultiLineString": + case "MultiPolygon": + return ( + /** @type {'Point'|'LineString'|'Polygon'} */ + e.substring(5) + ); + case "Circle": + return "Polygon"; + case "GeometryCollection": + return zg( + /** @type {import("../geom/GeometryCollection.js").default} */ + n.getGeometries()[0] + ); + default: + return ""; + } +} +function s_() { + return { + variables: {}, + properties: {}, + resolution: NaN, + featureId: null, + geometryType: "" + }; +} +function jn(n, e, t) { + const i = Qt(n, e, t); + return ji(i); +} +function ji(n, e) { + if (n instanceof Ct) { + if (n.type === We && typeof n.value == "string") { + const i = Bc(n.value); + return function() { + return i; + }; + } + return function() { + return n.value; + }; + } + const t = n.operator; + switch (t) { + case b.Number: + case b.String: + case b.Coalesce: + return Xw(n); + case b.Get: + case b.Var: + case b.Has: + return qw(n); + case b.Id: + return (i) => i.featureId; + case b.GeometryType: + return (i) => i.geometryType; + case b.Concat: { + const i = n.args.map((r) => ji(r)); + return (r) => "".concat(...i.map((s) => s(r).toString())); + } + case b.Resolution: + return (i) => i.resolution; + case b.Any: + case b.All: + case b.Between: + case b.In: + case b.Not: + return Kw(n); + case b.Equal: + case b.NotEqual: + case b.LessThan: + case b.LessThanOrEqualTo: + case b.GreaterThan: + case b.GreaterThanOrEqualTo: + return jw(n); + case b.Multiply: + case b.Divide: + case b.Add: + case b.Subtract: + case b.Clamp: + case b.Mod: + case b.Pow: + case b.Abs: + case b.Floor: + case b.Ceil: + case b.Round: + case b.Sin: + case b.Cos: + case b.Atan: + case b.Sqrt: + return Ww(n); + case b.Case: + return Zw(n); + case b.Match: + return Jw(n); + case b.Interpolate: + return ex(n); + case b.ToString: + return tx(n); + default: + throw new Error(`Unsupported operator ${t}`); + } +} +function Xw(n, e) { + const t = n.operator, i = n.args.length, r = new Array(i); + for (let s = 0; s < i; ++s) + r[s] = ji(n.args[s]); + switch (t) { + case b.Coalesce: + return (s) => { + for (let o = 0; o < i; ++o) { + const a = r[o](s); + if (typeof a < "u" && a !== null) + return a; + } + throw new Error("Expected one of the values to be non-null"); + }; + case b.Number: + case b.String: + return (s) => { + for (let o = 0; o < i; ++o) { + const a = r[o](s); + if (typeof a === t) + return a; + } + throw new Error(`Expected one of the values to be a ${t}`); + }; + default: + throw new Error(`Unsupported assertion operator ${t}`); + } +} +function qw(n, e) { + const i = ( + /** @type {string} */ + /** @type {LiteralExpression} */ + n.args[0].value + ); + switch (n.operator) { + case b.Get: + return (r) => { + const s = n.args; + let o = r.properties[i]; + for (let a = 1, l = s.length; a < l; ++a) { + const c = ( + /** @type {string|number} */ + /** @type {LiteralExpression} */ + s[a].value + ); + o = o[c]; + } + return o; + }; + case b.Var: + return (r) => r.variables[i]; + case b.Has: + return (r) => { + const s = n.args; + if (!(i in r.properties)) + return !1; + let o = r.properties[i]; + for (let a = 1, l = s.length; a < l; ++a) { + const c = ( + /** @type {string|number} */ + /** @type {LiteralExpression} */ + s[a].value + ); + if (!o || !Object.hasOwn(o, c)) + return !1; + o = o[c]; + } + return !0; + }; + default: + throw new Error(`Unsupported accessor operator ${n.operator}`); + } +} +function jw(n, e) { + const t = n.operator, i = ji(n.args[0]), r = ji(n.args[1]); + switch (t) { + case b.Equal: + return (s) => i(s) === r(s); + case b.NotEqual: + return (s) => i(s) !== r(s); + case b.LessThan: + return (s) => i(s) < r(s); + case b.LessThanOrEqualTo: + return (s) => i(s) <= r(s); + case b.GreaterThan: + return (s) => i(s) > r(s); + case b.GreaterThanOrEqualTo: + return (s) => i(s) >= r(s); + default: + throw new Error(`Unsupported comparison operator ${t}`); + } +} +function Kw(n, e) { + const t = n.operator, i = n.args.length, r = new Array(i); + for (let s = 0; s < i; ++s) + r[s] = ji(n.args[s]); + switch (t) { + case b.Any: + return (s) => { + for (let o = 0; o < i; ++o) + if (r[o](s)) + return !0; + return !1; + }; + case b.All: + return (s) => { + for (let o = 0; o < i; ++o) + if (!r[o](s)) + return !1; + return !0; + }; + case b.Between: + return (s) => { + const o = r[0](s), a = r[1](s), l = r[2](s); + return o >= a && o <= l; + }; + case b.In: + return (s) => { + const o = r[0](s); + for (let a = 1; a < i; ++a) + if (o === r[a](s)) + return !0; + return !1; + }; + case b.Not: + return (s) => !r[0](s); + default: + throw new Error(`Unsupported logical operator ${t}`); + } +} +function Ww(n, e) { + const t = n.operator, i = n.args.length, r = new Array(i); + for (let s = 0; s < i; ++s) + r[s] = ji(n.args[s]); + switch (t) { + case b.Multiply: + return (s) => { + let o = 1; + for (let a = 0; a < i; ++a) + o *= r[a](s); + return o; + }; + case b.Divide: + return (s) => r[0](s) / r[1](s); + case b.Add: + return (s) => { + let o = 0; + for (let a = 0; a < i; ++a) + o += r[a](s); + return o; + }; + case b.Subtract: + return (s) => r[0](s) - r[1](s); + case b.Clamp: + return (s) => { + const o = r[0](s), a = r[1](s); + if (o < a) + return a; + const l = r[2](s); + return o > l ? l : o; + }; + case b.Mod: + return (s) => r[0](s) % r[1](s); + case b.Pow: + return (s) => Math.pow(r[0](s), r[1](s)); + case b.Abs: + return (s) => Math.abs(r[0](s)); + case b.Floor: + return (s) => Math.floor(r[0](s)); + case b.Ceil: + return (s) => Math.ceil(r[0](s)); + case b.Round: + return (s) => Math.round(r[0](s)); + case b.Sin: + return (s) => Math.sin(r[0](s)); + case b.Cos: + return (s) => Math.cos(r[0](s)); + case b.Atan: + return i === 2 ? (s) => Math.atan2(r[0](s), r[1](s)) : (s) => Math.atan(r[0](s)); + case b.Sqrt: + return (s) => Math.sqrt(r[0](s)); + default: + throw new Error(`Unsupported numeric operator ${t}`); + } +} +function Zw(n, e) { + const t = n.args.length, i = new Array(t); + for (let r = 0; r < t; ++r) + i[r] = ji(n.args[r]); + return (r) => { + for (let s = 0; s < t - 1; s += 2) + if (i[s](r)) + return i[s + 1](r); + return i[t - 1](r); + }; +} +function Jw(n, e) { + const t = n.args.length, i = new Array(t); + for (let r = 0; r < t; ++r) + i[r] = ji(n.args[r]); + return (r) => { + const s = i[0](r); + for (let o = 1; o < t; o += 2) + if (s === i[o](r)) + return i[o + 1](r); + return i[t - 1](r); + }; +} +function ex(n, e) { + const t = n.args.length, i = new Array(t); + for (let r = 0; r < t; ++r) + i[r] = ji(n.args[r]); + return (r) => { + const s = i[0](r), o = i[1](r); + let a, l; + for (let A = 2; A < t; A += 2) { + const c = i[A](r); + let h = i[A + 1](r); + const u = Array.isArray(h); + if (u && (h = Iw(h)), c >= o) + return A === 2 ? h : u ? ix( + s, + o, + a, + l, + c, + h + ) : ca( + s, + o, + a, + l, + c, + h + ); + a = c, l = h; + } + return l; + }; +} +function tx(n, e) { + const t = n.operator, i = n.args.length, r = new Array(i); + for (let s = 0; s < i; ++s) + r[s] = ji(n.args[s]); + switch (t) { + case b.ToString: + return (s) => { + const o = r[0](s); + return n.args[0].type === We ? kg(o) : o.toString(); + }; + default: + throw new Error(`Unsupported convert operator ${t}`); + } +} +function ca(n, e, t, i, r, s) { + const o = r - t; + if (o === 0) + return i; + const a = e - t, l = n === 1 ? a / o : (Math.pow(n, a) - 1) / (Math.pow(n, o) - 1); + return i + l * (s - i); +} +function ix(n, e, t, i, r, s) { + if (r - t === 0) + return i; + const a = Of(i), l = Of(s); + let A = l[2] - a[2]; + A > 180 ? A -= 360 : A < -180 && (A += 360); + const c = [ + ca(n, e, t, a[0], r, l[0]), + ca(n, e, t, a[1], r, l[1]), + a[2] + ca(n, e, t, 0, r, A), + ca(n, e, t, i[3], r, s[3]) + ]; + return Jp(Cw(c)); +} +function nx(n) { + return !0; +} +function rx(n) { + const e = Yg(), t = sx(n, e), i = s_(); + return function(r, s) { + if (i.properties = r.getPropertiesInternal(), i.resolution = s, e.featureId) { + const o = r.getId(); + o !== void 0 ? i.featureId = o : i.featureId = null; + } + return e.geometryType && (i.geometryType = zg( + r.getGeometry() + )), t(i); + }; +} +function Xf(n) { + const e = Yg(), t = n.length, i = new Array(t); + for (let o = 0; o < t; ++o) + i[o] = Qu(n[o], e); + const r = s_(), s = new Array(t); + return function(o, a) { + if (r.properties = o.getPropertiesInternal(), r.resolution = a, e.featureId) { + const A = o.getId(); + A !== void 0 ? r.featureId = A : r.featureId = null; + } + let l = 0; + for (let A = 0; A < t; ++A) { + const c = i[A](r); + c && (s[l] = c, l += 1); + } + return s.length = l, s; + }; +} +function sx(n, e) { + const t = n.length, i = new Array(t); + for (let r = 0; r < t; ++r) { + const s = n[r], o = "filter" in s ? jn(s.filter, Pt, e) : nx; + let a; + if (Array.isArray(s.style)) { + const l = s.style.length; + a = new Array(l); + for (let A = 0; A < l; ++A) + a[A] = Qu(s.style[A], e); + } else + a = [Qu(s.style, e)]; + i[r] = { filter: o, styles: a }; + } + return function(r) { + const s = []; + let o = !1; + for (let a = 0; a < t; ++a) { + const l = i[a].filter; + if (l(r) && !(n[a].else && o)) { + o = !0; + for (const A of i[a].styles) { + const c = A(r); + c && s.push(c); + } + } + } + return s; + }; +} +function Qu(n, e) { + const t = Ga(n, "", e), i = ka(n, "", e), r = ox(n, e), s = ax(n, e), o = ri(n, "z-index", e); + if (!t && !i && !r && !s && !Hi(n)) + throw new Error( + "No fill, stroke, point, or text symbolizer properties in style: " + JSON.stringify(n) + ); + const a = new pt(); + return function(l) { + let A = !0; + if (t) { + const c = t(l); + c && (A = !1), a.setFill(c); + } + if (i) { + const c = i(l); + c && (A = !1), a.setStroke(c); + } + if (r) { + const c = r(l); + c && (A = !1), a.setText(c); + } + if (s) { + const c = s(l); + c && (A = !1), a.setImage(c); + } + return o && a.setZIndex(o(l)), A ? null : a; + }; +} +function Ga(n, e, t) { + let i; + if (e + "fill-pattern-src" in n) + i = hx(n, e + "fill-", t); + else { + if (n[e + "fill-color"] === "none") + return (s) => null; + i = Vg( + n, + e + "fill-color", + t + ); + } + if (!i) + return null; + const r = new Mi(); + return function(s) { + const o = i(s); + return o === Gg ? null : (r.setColor(o), r); + }; +} +function ka(n, e, t) { + const i = ri( + n, + e + "stroke-width", + t + ), r = Vg( + n, + e + "stroke-color", + t + ); + if (!i && !r) + return null; + const s = Mn( + n, + e + "stroke-line-cap", + t + ), o = Mn( + n, + e + "stroke-line-join", + t + ), a = o_( + n, + e + "stroke-line-dash", + t + ), l = ri( + n, + e + "stroke-line-dash-offset", + t + ), A = ri( + n, + e + "stroke-miter-limit", + t + ), c = new Ii(); + return function(h) { + if (r) { + const u = r(h); + if (u === Gg) + return null; + c.setColor(u); + } + if (i && c.setWidth(i(h)), s) { + const u = s(h); + if (u !== "butt" && u !== "round" && u !== "square") + throw new Error("Expected butt, round, or square line cap"); + c.setLineCap(u); + } + if (o) { + const u = o(h); + if (u !== "bevel" && u !== "round" && u !== "miter") + throw new Error("Expected bevel, round, or miter line join"); + c.setLineJoin(u); + } + return a && c.setLineDash(a(h)), l && c.setLineDashOffset(l(h)), A && c.setMiterLimit(A(h)), c; + }; +} +function ox(n, e) { + const t = "text-", i = Mn(n, t + "value", e); + if (!i) + return null; + const r = Ga(n, t, e), s = Ga( + n, + t + "background-", + e + ), o = ka(n, t, e), a = ka( + n, + t + "background-", + e + ), l = Mn(n, t + "font", e), A = ri( + n, + t + "max-angle", + e + ), c = ri( + n, + t + "offset-x", + e + ), h = ri( + n, + t + "offset-y", + e + ), u = $a( + n, + t + "overflow", + e + ), g = Mn( + n, + t + "placement", + e + ), d = ri(n, t + "repeat", e), m = Rc(n, t + "scale", e), f = $a( + n, + t + "rotate-with-view", + e + ), E = ri( + n, + t + "rotation", + e + ), p = Mn(n, t + "align", e), _ = Mn( + n, + t + "justify", + e + ), I = Mn( + n, + t + "baseline", + e + ), y = o_( + n, + t + "padding", + e + ), C = Tc( + n, + t + "declutter-mode" + ), w = new Xr({ declutterMode: C }); + return function(x) { + if (w.setText(i(x)), r && w.setFill(r(x)), s && w.setBackgroundFill(s(x)), o && w.setStroke(o(x)), a && w.setBackgroundStroke(a(x)), l && w.setFont(l(x)), A && w.setMaxAngle(A(x)), c && w.setOffsetX(c(x)), h && w.setOffsetY(h(x)), u && w.setOverflow(u(x)), g) { + const B = g(x); + if (B !== "point" && B !== "line") + throw new Error("Expected point or line for text-placement"); + w.setPlacement(B); + } + if (d && w.setRepeat(d(x)), m && w.setScale(m(x)), f && w.setRotateWithView(f(x)), E && w.setRotation(E(x)), p) { + const B = p(x); + if (B !== "left" && B !== "center" && B !== "right" && B !== "end" && B !== "start") + throw new Error( + "Expected left, right, center, start, or end for text-align" + ); + w.setTextAlign(B); + } + if (_) { + const B = _(x); + if (B !== "left" && B !== "right" && B !== "center") + throw new Error("Expected left, right, or center for text-justify"); + w.setJustify(B); + } + if (I) { + const B = I(x); + if (B !== "bottom" && B !== "top" && B !== "middle" && B !== "alphabetic" && B !== "hanging") + throw new Error( + "Expected bottom, top, middle, alphabetic, or hanging for text-baseline" + ); + w.setTextBaseline(B); + } + return y && w.setPadding(y(x)), w; + }; +} +function ax(n, e) { + return "icon-src" in n ? lx(n, e) : "shape-points" in n ? Ax(n, e) : "circle-radius" in n ? cx(n, e) : null; +} +function lx(n, e) { + const t = "icon-", i = t + "src", r = a_(n[i], i), s = NA( + n, + t + "anchor", + e + ), o = Rc(n, t + "scale", e), a = ri( + n, + t + "opacity", + e + ), l = NA( + n, + t + "displacement", + e + ), A = ri( + n, + t + "rotation", + e + ), c = $a( + n, + t + "rotate-with-view", + e + ), h = jf(n, t + "anchor-origin"), u = Kf( + n, + t + "anchor-x-units" + ), g = Kf( + n, + t + "anchor-y-units" + ), d = fx(n, t + "color"), m = gx(n, t + "cross-origin"), f = dx(n, t + "offset"), E = jf(n, t + "offset-origin"), p = OA(n, t + "width"), _ = OA(n, t + "height"), I = ux(n, t + "size"), y = Tc( + n, + t + "declutter-mode" + ), C = new Do({ + src: r, + anchorOrigin: h, + anchorXUnits: u, + anchorYUnits: g, + color: d, + crossOrigin: m, + offset: f, + offsetOrigin: E, + height: _, + width: p, + size: I, + declutterMode: y + }); + return function(w) { + return a && C.setOpacity(a(w)), l && C.setDisplacement(l(w)), A && C.setRotation(A(w)), c && C.setRotateWithView(c(w)), o && C.setScale(o(w)), s && C.setAnchor(s(w)), C; + }; +} +function Ax(n, e) { + const t = "shape-", i = t + "points", r = t + "radius", s = Du(n[i], i), o = Du(n[r], r), a = Ga(n, t, e), l = ka(n, t, e), A = Rc(n, t + "scale", e), c = NA( + n, + t + "displacement", + e + ), h = ri( + n, + t + "rotation", + e + ), u = $a( + n, + t + "rotate-with-view", + e + ), g = OA(n, t + "radius2"), d = OA(n, t + "angle"), m = Tc( + n, + t + "declutter-mode" + ), f = new Sc({ + points: s, + radius: o, + radius2: g, + angle: d, + declutterMode: m + }); + return function(E) { + return a && f.setFill(a(E)), l && f.setStroke(l(E)), c && f.setDisplacement(c(E)), h && f.setRotation(h(E)), u && f.setRotateWithView(u(E)), A && f.setScale(A(E)), f; + }; +} +function cx(n, e) { + const t = "circle-", i = Ga(n, t, e), r = ka(n, t, e), s = ri(n, t + "radius", e), o = Rc(n, t + "scale", e), a = NA( + n, + t + "displacement", + e + ), l = ri( + n, + t + "rotation", + e + ), A = $a( + n, + t + "rotate-with-view", + e + ), c = Tc( + n, + t + "declutter-mode" + ), h = new gl({ + radius: 5, + // this is arbitrary, but required - the evaluated radius is used below + declutterMode: c + }); + return function(u) { + return s && h.setRadius(s(u)), i && h.setFill(i(u)), r && h.setStroke(r(u)), a && h.setDisplacement(a(u)), l && h.setRotation(l(u)), A && h.setRotateWithView(A(u)), o && h.setScale(o(u)), h; + }; +} +function ri(n, e, t) { + if (!(e in n)) + return; + const i = jn(n[e], ee, t); + return function(r) { + return Du(i(r), e); + }; +} +function Mn(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], vt, t); + return function(r) { + return a_(i(r), e); + }; +} +function hx(n, e, t) { + const i = Mn( + n, + e + "pattern-src", + t + ), r = qf( + n, + e + "pattern-offset", + t + ), s = qf( + n, + e + "pattern-size", + t + ), o = Vg( + n, + e + "color", + t + ); + return function(a) { + return { + src: i(a), + offset: r && r(a), + size: s && s(a), + color: o && o(a) + }; + }; +} +function $a(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], Pt, t); + return function(r) { + const s = i(r); + if (typeof s != "boolean") + throw new Error(`Expected a boolean for ${e}`); + return s; + }; +} +function Vg(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], We, t); + return function(r) { + return l_(i(r), e); + }; +} +function o_(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], jt, t); + return function(r) { + return fl(i(r), e); + }; +} +function NA(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], jt, t); + return function(r) { + const s = fl(i(r), e); + if (s.length !== 2) + throw new Error(`Expected two numbers for ${e}`); + return s; + }; +} +function qf(n, e, t) { + if (!(e in n)) + return null; + const i = jn(n[e], jt, t); + return function(r) { + return A_(i(r), e); + }; +} +function Rc(n, e, t) { + if (!(e in n)) + return null; + const i = jn( + n[e], + jt | ee, + t + ); + return function(r) { + return mx(i(r), e); + }; +} +function OA(n, e) { + const t = n[e]; + if (t !== void 0) { + if (typeof t != "number") + throw new Error(`Expected a number for ${e}`); + return t; + } +} +function ux(n, e) { + const t = n[e]; + if (t !== void 0) { + if (typeof t == "number") + return qe(t); + if (!Array.isArray(t)) + throw new Error(`Expected a number or size array for ${e}`); + if (t.length !== 2 || typeof t[0] != "number" || typeof t[1] != "number") + throw new Error(`Expected a number or size array for ${e}`); + return t; + } +} +function gx(n, e) { + const t = n[e]; + if (t !== void 0) { + if (typeof t != "string") + throw new Error(`Expected a string for ${e}`); + return t; + } +} +function jf(n, e) { + const t = n[e]; + if (t !== void 0) { + if (t !== "bottom-left" && t !== "bottom-right" && t !== "top-left" && t !== "top-right") + throw new Error( + `Expected bottom-left, bottom-right, top-left, or top-right for ${e}` + ); + return t; + } +} +function Kf(n, e) { + const t = n[e]; + if (t !== void 0) { + if (t !== "pixels" && t !== "fraction") + throw new Error(`Expected pixels or fraction for ${e}`); + return t; + } +} +function dx(n, e) { + const t = n[e]; + if (t !== void 0) + return fl(t, e); +} +function Tc(n, e) { + const t = n[e]; + if (t !== void 0) { + if (typeof t != "string") + throw new Error(`Expected a string for ${e}`); + if (t !== "declutter" && t !== "obstacle" && t !== "none") + throw new Error(`Expected declutter, obstacle, or none for ${e}`); + return t; + } +} +function fx(n, e) { + const t = n[e]; + if (t !== void 0) + return l_(t, e); +} +function fl(n, e) { + if (!Array.isArray(n)) + throw new Error(`Expected an array for ${e}`); + const t = n.length; + for (let i = 0; i < t; ++i) + if (typeof n[i] != "number") + throw new Error(`Expected an array of numbers for ${e}`); + return n; +} +function a_(n, e) { + if (typeof n != "string") + throw new Error(`Expected a string for ${e}`); + return n; +} +function Du(n, e) { + if (typeof n != "number") + throw new Error(`Expected a number for ${e}`); + return n; +} +function l_(n, e) { + if (typeof n == "string") + return n; + const t = fl(n, e), i = t.length; + if (i < 3 || i > 4) + throw new Error(`Expected a color with 3 or 4 values for ${e}`); + return t; +} +function A_(n, e) { + const t = fl(n, e); + if (t.length !== 2) + throw new Error(`Expected an array of two numbers for ${e}`); + return t; +} +function mx(n, e) { + return typeof n == "number" ? n : A_(n, e); +} +const Wf = { + RENDER_ORDER: "renderOrder" +}; +class hs extends Qo { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}; + const t = Object.assign({}, e); + delete t.style, delete t.renderBuffer, delete t.updateWhileAnimating, delete t.updateWhileInteracting, super(t), this.declutter_ = e.declutter ? String(e.declutter) : void 0, this.renderBuffer_ = e.renderBuffer !== void 0 ? e.renderBuffer : 100, this.style_ = null, this.styleFunction_ = void 0, this.setStyle(e.style), this.updateWhileAnimating_ = e.updateWhileAnimating !== void 0 ? e.updateWhileAnimating : !1, this.updateWhileInteracting_ = e.updateWhileInteracting !== void 0 ? e.updateWhileInteracting : !1; + } + /** + * @return {string} Declutter group. + * @override + */ + getDeclutter() { + return this.declutter_; + } + /** + * Get the topmost feature that intersects the given pixel on the viewport. Returns a promise + * that resolves with an array of features. The array will either contain the topmost feature + * when a hit was detected, or it will be empty. + * + * The hit detection algorithm used for this method is optimized for performance, but is less + * accurate than the one used in [map.getFeaturesAtPixel()]{@link import("../Map.js").default#getFeaturesAtPixel}. + * Text is not considered, and icons are only represented by their bounding box instead of the exact + * image. + * + * @param {import("../pixel.js").Pixel} pixel Pixel. + * @return {Promise>} Promise that resolves with an array of features. + * @api + * @override + */ + getFeatures(e) { + return super.getFeatures(e); + } + /** + * @return {number|undefined} Render buffer. + */ + getRenderBuffer() { + return this.renderBuffer_; + } + /** + * @return {function(import("../Feature.js").default, import("../Feature.js").default): number|null|undefined} Render + * order. + */ + getRenderOrder() { + return ( + /** @type {import("../render.js").OrderFunction|null|undefined} */ + this.get(Wf.RENDER_ORDER) + ); + } + /** + * Get the style for features. This returns whatever was passed to the `style` + * option at construction or to the `setStyle` method. + * @return {import("../style/Style.js").StyleLike|import("../style/flat.js").FlatStyleLike|null|undefined} Layer style. + * @api + */ + getStyle() { + return this.style_; + } + /** + * Get the style function. + * @return {import("../style/Style.js").StyleFunction|undefined} Layer style function. + * @api + */ + getStyleFunction() { + return this.styleFunction_; + } + /** + * @return {boolean} Whether the rendered layer should be updated while + * animating. + */ + getUpdateWhileAnimating() { + return this.updateWhileAnimating_; + } + /** + * @return {boolean} Whether the rendered layer should be updated while + * interacting. + */ + getUpdateWhileInteracting() { + return this.updateWhileInteracting_; + } + /** + * Render declutter items for this layer + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {import("../layer/Layer.js").State} layerState Layer state. + * @override + */ + renderDeclutter(e, t) { + const i = this.getDeclutter(); + i in e.declutter || (e.declutter[i] = new Ng(9)), this.getRenderer().renderDeclutter(e, t); + } + /** + * @param {import("../render.js").OrderFunction|null|undefined} renderOrder + * Render order. + */ + setRenderOrder(e) { + this.set(Wf.RENDER_ORDER, e); + } + /** + * Set the style for features. This can be a single style object, an array + * of styles, or a function that takes a feature and resolution and returns + * an array of styles. If set to `null`, the layer has no style (a `null` style), + * so only features that have their own styles will be rendered in the layer. Call + * `setStyle()` without arguments to reset to the default style. See + * [the ol/style/Style module]{@link module:ol/style/Style~Style} for information on the default style. + * + * If your layer has a static style, you can use [flat style]{@link module:ol/style/flat~FlatStyle} object + * literals instead of using the `Style` and symbolizer constructors (`Fill`, `Stroke`, etc.): + * ```js + * vectorLayer.setStyle({ + * "fill-color": "yellow", + * "stroke-color": "black", + * "stroke-width": 4 + * }) + * ``` + * + * @param {import("../style/Style.js").StyleLike|import("../style/flat.js").FlatStyleLike|null} [style] Layer style. + * @api + */ + setStyle(e) { + this.style_ = e === void 0 ? n_ : e; + const t = Ex(e); + this.styleFunction_ = e === null ? void 0 : Lw(t), this.changed(); + } +} +function Ex(n) { + if (n === void 0) + return n_; + if (!n) + return null; + if (typeof n == "function" || n instanceof pt) + return n; + if (!Array.isArray(n)) + return Xf([n]); + if (n.length === 0) + return []; + const e = n.length, t = n[0]; + if (t instanceof pt) { + const r = new Array(e); + for (let s = 0; s < e; ++s) { + const o = n[s]; + if (!(o instanceof pt)) + throw new Error("Expected a list of style instances"); + r[s] = o; + } + return r; + } + if ("style" in t) { + const r = new Array(e); + for (let s = 0; s < e; ++s) { + const o = n[s]; + if (!("style" in o)) + throw new Error("Expected a list of rules with a style property"); + r[s] = o; + } + return rx(r); + } + return Xf( + /** @type {Array} */ + n + ); +} +class px extends Bo { + /** + * @param {import("../Map.js").default} map Map. + */ + constructor(e) { + super(), this.map_ = e; + } + /** + * @abstract + * @param {import("../render/EventType.js").default} type Event type. + * @param {import("../Map.js").FrameState} frameState Frame state. + */ + dispatchRenderEvent(e, t) { + ae(); + } + /** + * @param {import("../Map.js").FrameState} frameState FrameState. + * @protected + */ + calculateMatrices2D(e) { + const t = e.viewState, i = e.coordinateToPixelTransform, r = e.pixelToCoordinateTransform; + ai( + i, + e.size[0] / 2, + e.size[1] / 2, + 1 / t.resolution, + -1 / t.resolution, + -t.rotation, + -t.center[0], + -t.center[1] + ), Xn(r, i); + } + /** + * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. + * @param {import("../Map.js").FrameState} frameState FrameState. + * @param {number} hitTolerance Hit tolerance in pixels. + * @param {boolean} checkWrapped Check for wrapped geometries. + * @param {import("./vector.js").FeatureCallback} callback Feature callback. + * @param {S} thisArg Value to use as `this` when executing `callback`. + * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter + * function, only layers which are visible and for which this function + * returns `true` will be tested for features. By default, all visible + * layers will be tested. + * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`. + * @return {T|undefined} Callback result. + * @template S,T,U + */ + forEachFeatureAtCoordinate(e, t, i, r, s, o, a, l) { + let A; + const c = t.viewState; + function h(I, y, C, w) { + return s.call(o, y, I ? C : null, w); + } + const u = c.projection, g = fc(e.slice(), u), d = [[0, 0]]; + if (u.canWrapX() && r) { + const I = u.getExtent(), y = he(I); + d.push([-y, 0], [y, 0]); + } + const m = t.layerStatesArray, f = m.length, E = ( + /** @type {Array>} */ + [] + ), p = []; + for (let I = 0; I < d.length; I++) + for (let y = f - 1; y >= 0; --y) { + const C = m[y], w = C.layer; + if (w.hasRenderer() && Mg(C, c) && a.call(l, w)) { + const x = w.getRenderer(), B = w.getSource(); + if (x && B) { + const T = B.getWrapX() ? g : e, S = h.bind( + null, + C.managed + ); + p[0] = T[0] + d[I][0], p[1] = T[1] + d[I][1], A = x.forEachFeatureAtCoordinate( + p, + t, + i, + S, + E + ); + } + if (A) + return A; + } + } + if (E.length === 0) + return; + const _ = 1 / E.length; + return E.forEach((I, y) => I.distanceSq += y * _), E.sort((I, y) => I.distanceSq - y.distanceSq), E.some((I) => A = I.callback(I.feature, I.layer, I.geometry)), A; + } + /** + * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. + * @param {import("../Map.js").FrameState} frameState FrameState. + * @param {number} hitTolerance Hit tolerance in pixels. + * @param {boolean} checkWrapped Check for wrapped geometries. + * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter + * function, only layers which are visible and for which this function + * returns `true` will be tested for features. By default, all visible + * layers will be tested. + * @param {U} thisArg Value to use as `this` when executing `layerFilter`. + * @return {boolean} Is there a feature at the given coordinate? + * @template U + */ + hasFeatureAtCoordinate(e, t, i, r, s, o) { + return this.forEachFeatureAtCoordinate( + e, + t, + i, + r, + bi, + this, + s, + o + ) !== void 0; + } + /** + * @return {import("../Map.js").default} Map. + */ + getMap() { + return this.map_; + } + /** + * Render. + * @abstract + * @param {?import("../Map.js").FrameState} frameState Frame state. + */ + renderFrame(e) { + ae(); + } + /** + * @param {import("../Map.js").FrameState} frameState Frame state. + * @protected + */ + scheduleExpireIconCache(e) { + cn.canExpireCache() && e.postRenderFunctions.push(_x); + } +} +function _x(n, e) { + cn.expire(); +} +class ma extends xt { + /** + * @param {import("./EventType.js").default} type Type. + * @param {import("../transform.js").Transform} [inversePixelTransform] Transform for + * CSS pixels to rendered pixels. + * @param {import("../Map.js").FrameState} [frameState] Frame state. + * @param {?(CanvasRenderingContext2D|WebGLRenderingContext)} [context] Context. + */ + constructor(e, t, i, r) { + super(e), this.inversePixelTransform = t, this.frameState = i, this.context = r; + } +} +class Ix extends px { + /** + * @param {import("../Map.js").default} map Map. + */ + constructor(e) { + super(e), this.fontChangeListenerKey_ = ie( + Fn, + Yr.PROPERTYCHANGE, + e.redrawText, + e + ), this.element_ = document.createElement("div"); + const t = this.element_.style; + t.position = "absolute", t.width = "100%", t.height = "100%", t.zIndex = "0", this.element_.className = In + " ol-layers"; + const i = e.getViewport(); + i.insertBefore(this.element_, i.firstChild || null), this.children_ = [], this.renderedVisible_ = !0; + } + /** + * @param {import("../render/EventType.js").default} type Event type. + * @param {import("../Map.js").FrameState} frameState Frame state. + * @override + */ + dispatchRenderEvent(e, t) { + const i = this.getMap(); + if (i.hasListener(e)) { + const r = new ma(e, void 0, t); + i.dispatchEvent(r); + } + } + /** + * @override + */ + disposeInternal() { + Re(this.fontChangeListenerKey_), this.element_.remove(), super.disposeInternal(); + } + /** + * Render. + * @param {?import("../Map.js").FrameState} frameState Frame state. + * @override + */ + renderFrame(e) { + if (!e) { + this.renderedVisible_ && (this.element_.style.display = "none", this.renderedVisible_ = !1); + return; + } + this.calculateMatrices2D(e), this.dispatchRenderEvent(yt.PRECOMPOSE, e); + const t = e.layerStatesArray.sort( + (a, l) => a.zIndex - l.zIndex + ); + t.some( + (a) => a.layer instanceof hs && a.layer.getDeclutter() + ) && (e.declutter = {}); + const r = e.viewState; + this.children_.length = 0; + const s = []; + let o = null; + for (let a = 0, l = t.length; a < l; ++a) { + const A = t[a]; + e.layerIndex = a; + const c = A.layer, h = c.getSourceState(); + if (!Mg(A, r) || h != "ready" && h != "undefined") { + c.unrender(); + continue; + } + const u = c.render(e, o); + u && (u !== o && (this.children_.push(u), o = u), s.push(A)); + } + this.declutter(e, s), jC(this.element_, this.children_), this.dispatchRenderEvent(yt.POSTCOMPOSE, e), this.renderedVisible_ || (this.element_.style.display = "", this.renderedVisible_ = !0), this.scheduleExpireIconCache(e); + } + /** + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {Array} layerStates Layers. + */ + declutter(e, t) { + if (e.declutter) { + for (let i = t.length - 1; i >= 0; --i) { + const r = t[i], s = r.layer; + s.getDeclutter() && s.renderDeclutter(e, r); + } + t.forEach( + (i) => i.layer.renderDeferred(e) + ); + } + } +} +class or extends xt { + /** + * @param {GroupEventType} type The event type. + * @param {BaseLayer} layer The layer. + */ + constructor(e, t) { + super(e), this.layer = t; + } +} +const ph = { + LAYERS: "layers" +}; +class Lo extends qp { + /** + * @param {Options} [options] Layer options. + */ + constructor(e) { + e = e || {}; + const t = ( + /** @type {Options} */ + Object.assign({}, e) + ); + delete t.layers; + let i = e.layers; + super(t), this.on, this.once, this.un, this.layersListenerKeys_ = [], this.listenerKeys_ = {}, this.addChangeListener(ph.LAYERS, this.handleLayersChanged_), i ? Array.isArray(i) ? i = new wt(i.slice(), { unique: !0 }) : Ie( + typeof /** @type {?} */ + i.getArray == "function", + "Expected `layers` to be an array or a `Collection`" + ) : i = new wt(void 0, { unique: !0 }), this.setLayers(i); + } + /** + * @private + */ + handleLayerChange_() { + this.changed(); + } + /** + * @private + */ + handleLayersChanged_() { + this.layersListenerKeys_.forEach(Re), this.layersListenerKeys_.length = 0; + const e = this.getLayers(); + this.layersListenerKeys_.push( + ie(e, ct.ADD, this.handleLayersAdd_, this), + ie( + e, + ct.REMOVE, + this.handleLayersRemove_, + this + ) + ); + for (const i in this.listenerKeys_) + this.listenerKeys_[i].forEach(Re); + ns(this.listenerKeys_); + const t = e.getArray(); + for (let i = 0, r = t.length; i < r; i++) { + const s = t[i]; + this.registerLayerListeners_(s), this.dispatchEvent(new or("addlayer", s)); + } + this.changed(); + } + /** + * @param {BaseLayer} layer The layer. + */ + registerLayerListeners_(e) { + const t = [ + ie( + e, + Yr.PROPERTYCHANGE, + this.handleLayerChange_, + this + ), + ie(e, j.CHANGE, this.handleLayerChange_, this) + ]; + e instanceof Lo && t.push( + ie(e, "addlayer", this.handleLayerGroupAdd_, this), + ie(e, "removelayer", this.handleLayerGroupRemove_, this) + ), this.listenerKeys_[X(e)] = t; + } + /** + * @param {GroupEvent} event The layer group event. + */ + handleLayerGroupAdd_(e) { + this.dispatchEvent(new or("addlayer", e.layer)); + } + /** + * @param {GroupEvent} event The layer group event. + */ + handleLayerGroupRemove_(e) { + this.dispatchEvent(new or("removelayer", e.layer)); + } + /** + * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent. + * @private + */ + handleLayersAdd_(e) { + const t = e.element; + this.registerLayerListeners_(t), this.dispatchEvent(new or("addlayer", t)), this.changed(); + } + /** + * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent. + * @private + */ + handleLayersRemove_(e) { + const t = e.element, i = X(t); + this.listenerKeys_[i].forEach(Re), delete this.listenerKeys_[i], this.dispatchEvent(new or("removelayer", t)), this.changed(); + } + /** + * Returns the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers} + * in this group. + * @return {!Collection} Collection of + * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group. + * @observable + * @api + */ + getLayers() { + return ( + /** @type {!Collection} */ + this.get(ph.LAYERS) + ); + } + /** + * Set the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers} + * in this group. + * @param {!Collection} layers Collection of + * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group. + * @observable + * @api + */ + setLayers(e) { + const t = this.getLayers(); + if (t) { + const i = t.getArray(); + for (let r = 0, s = i.length; r < s; ++r) + this.dispatchEvent(new or("removelayer", i[r])); + } + this.set(ph.LAYERS, e); + } + /** + * @param {Array} [array] Array of layers (to be modified in place). + * @return {Array} Array of layers. + * @override + */ + getLayersArray(e) { + return e = e !== void 0 ? e : [], this.getLayers().forEach(function(t) { + t.getLayersArray(e); + }), e; + } + /** + * Get the layer states list and use this groups z-index as the default + * for all layers in this and nested groups, if it is unset at this point. + * If dest is not provided and this group's z-index is undefined + * 0 is used a the default z-index. + * @param {Array} [dest] Optional list + * of layer states (to be modified in place). + * @return {Array} List of layer states. + * @override + */ + getLayerStatesArray(e) { + const t = e !== void 0 ? e : [], i = t.length; + this.getLayers().forEach(function(o) { + o.getLayerStatesArray(t); + }); + const r = this.getLayerState(); + let s = r.zIndex; + !e && r.zIndex === void 0 && (s = 0); + for (let o = i, a = t.length; o < a; o++) { + const l = t[o]; + l.opacity *= r.opacity, l.visible = l.visible && r.visible, l.maxResolution = Math.min( + l.maxResolution, + r.maxResolution + ), l.minResolution = Math.max( + l.minResolution, + r.minResolution + ), l.minZoom = Math.max(l.minZoom, r.minZoom), l.maxZoom = Math.min(l.maxZoom, r.maxZoom), r.extent !== void 0 && (l.extent !== void 0 ? l.extent = tt( + l.extent, + r.extent + ) : l.extent = r.extent), l.zIndex === void 0 && (l.zIndex = s); + } + return t; + } + /** + * @return {import("../source/Source.js").State} Source state. + * @override + */ + getSourceState() { + return "ready"; + } +} +class Ms extends xt { + /** + * @param {string} type Event type. + * @param {import("./Map.js").default} map Map. + * @param {?import("./Map.js").FrameState} [frameState] Frame state. + */ + constructor(e, t, i) { + super(e), this.map = t, this.frameState = i !== void 0 ? i : null; + } +} +class Pn extends Ms { + /** + * @param {string} type Event type. + * @param {import("./Map.js").default} map Map. + * @param {EVENT} originalEvent Original event. + * @param {boolean} [dragging] Is the map currently being dragged? + * @param {import("./Map.js").FrameState} [frameState] Frame state. + * @param {Array} [activePointers] Active pointers. + */ + constructor(e, t, i, r, s, o) { + super(e, t, s), this.originalEvent = i, this.pixel_ = null, this.coordinate_ = null, this.dragging = r !== void 0 ? r : !1, this.activePointers = o; + } + /** + * The map pixel relative to the viewport corresponding to the original event. + * @type {import("./pixel.js").Pixel} + * @api + */ + get pixel() { + return this.pixel_ || (this.pixel_ = this.map.getEventPixel(this.originalEvent)), this.pixel_; + } + set pixel(e) { + this.pixel_ = e; + } + /** + * The coordinate corresponding to the original browser event. This will be in the user + * projection if one is set. Otherwise it will be in the view projection. + * @type {import("./coordinate.js").Coordinate} + * @api + */ + get coordinate() { + return this.coordinate_ || (this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel)), this.coordinate_; + } + set coordinate(e) { + this.coordinate_ = e; + } + /** + * Prevents the default browser action. + * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault. + * @api + * @override + */ + preventDefault() { + super.preventDefault(), "preventDefault" in this.originalEvent && this.originalEvent.preventDefault(); + } + /** + * Prevents further propagation of the current event. + * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation. + * @api + * @override + */ + stopPropagation() { + super.stopPropagation(), "stopPropagation" in this.originalEvent && this.originalEvent.stopPropagation(); + } +} +const _e = { + /** + * A true single click with no dragging and no double click. Note that this + * event is delayed by 250 ms to ensure that it is not a double click. + * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick + * @api + */ + SINGLECLICK: "singleclick", + /** + * A click with no dragging. A double click will fire two of this. + * @event module:ol/MapBrowserEvent~MapBrowserEvent#click + * @api + */ + CLICK: j.CLICK, + /** + * A true double click, with no dragging. + * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick + * @api + */ + DBLCLICK: j.DBLCLICK, + /** + * Triggered when a pointer is dragged. + * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag + * @api + */ + POINTERDRAG: "pointerdrag", + /** + * Triggered when a pointer is moved. Note that on touch devices this is + * triggered when the map is panned, so is not the same as mousemove. + * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove + * @api + */ + POINTERMOVE: "pointermove", + POINTERDOWN: "pointerdown", + POINTERUP: "pointerup", + POINTEROVER: "pointerover", + POINTEROUT: "pointerout", + POINTERENTER: "pointerenter", + POINTERLEAVE: "pointerleave", + POINTERCANCEL: "pointercancel" +}, ln = { + POINTERMOVE: "pointermove", + POINTERDOWN: "pointerdown", + POINTERUP: "pointerup", + POINTEROVER: "pointerover", + POINTEROUT: "pointerout", + POINTERENTER: "pointerenter", + POINTERLEAVE: "pointerleave", + POINTERCANCEL: "pointercancel" +}; +class Cx extends So { + /** + * @param {import("./Map.js").default} map The map with the viewport to listen to events on. + * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move. + */ + constructor(e, t) { + super(e), this.map_ = e, this.clickTimeoutId_, this.emulateClicks_ = !1, this.dragging_ = !1, this.dragListenerKeys_ = [], this.moveTolerance_ = t === void 0 ? 1 : t, this.down_ = null; + const i = this.map_.getViewport(); + this.activePointers_ = [], this.trackedTouches_ = {}, this.element_ = i, this.pointerdownListenerKey_ = ie( + i, + ln.POINTERDOWN, + this.handlePointerDown_, + this + ), this.originalPointerMoveEvent_, this.relayedListenerKey_ = ie( + i, + ln.POINTERMOVE, + this.relayMoveEvent_, + this + ), this.boundHandleTouchMove_ = this.handleTouchMove_.bind(this), this.element_.addEventListener( + j.TOUCHMOVE, + this.boundHandleTouchMove_, + yp ? { passive: !1 } : !1 + ); + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + emulateClick_(e) { + let t = new Pn( + _e.CLICK, + this.map_, + e + ); + this.dispatchEvent(t), this.clickTimeoutId_ !== void 0 ? (clearTimeout(this.clickTimeoutId_), this.clickTimeoutId_ = void 0, t = new Pn( + _e.DBLCLICK, + this.map_, + e + ), this.dispatchEvent(t)) : this.clickTimeoutId_ = setTimeout(() => { + this.clickTimeoutId_ = void 0; + const i = new Pn( + _e.SINGLECLICK, + this.map_, + e + ); + this.dispatchEvent(i); + }, 250); + } + /** + * Keeps track on how many pointers are currently active. + * + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + updateActivePointers_(e) { + const t = e, i = t.pointerId; + if (t.type == _e.POINTERUP || t.type == _e.POINTERCANCEL) { + delete this.trackedTouches_[i]; + for (const r in this.trackedTouches_) + if (this.trackedTouches_[r].target !== t.target) { + delete this.trackedTouches_[r]; + break; + } + } else (t.type == _e.POINTERDOWN || t.type == _e.POINTERMOVE) && (this.trackedTouches_[i] = t); + this.activePointers_ = Object.values(this.trackedTouches_); + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + handlePointerUp_(e) { + this.updateActivePointers_(e); + const t = new Pn( + _e.POINTERUP, + this.map_, + e, + void 0, + void 0, + this.activePointers_ + ); + this.dispatchEvent(t), this.emulateClicks_ && !t.defaultPrevented && !this.dragging_ && this.isMouseActionButton_(e) && this.emulateClick_(this.down_), this.activePointers_.length === 0 && (this.dragListenerKeys_.forEach(Re), this.dragListenerKeys_.length = 0, this.dragging_ = !1, this.down_ = null); + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @return {boolean} If the left mouse button was pressed. + * @private + */ + isMouseActionButton_(e) { + return e.button === 0; + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + handlePointerDown_(e) { + this.emulateClicks_ = this.activePointers_.length === 0, this.updateActivePointers_(e); + const t = new Pn( + _e.POINTERDOWN, + this.map_, + e, + void 0, + void 0, + this.activePointers_ + ); + if (this.dispatchEvent(t), this.down_ = new PointerEvent(e.type, e), Object.defineProperty(this.down_, "target", { + writable: !1, + value: e.target + }), this.dragListenerKeys_.length === 0) { + const i = this.map_.getOwnerDocument(); + this.dragListenerKeys_.push( + ie( + i, + _e.POINTERMOVE, + this.handlePointerMove_, + this + ), + ie(i, _e.POINTERUP, this.handlePointerUp_, this), + /* Note that the listener for `pointercancel is set up on + * `pointerEventHandler_` and not `documentPointerEventHandler_` like + * the `pointerup` and `pointermove` listeners. + * + * The reason for this is the following: `TouchSource.vacuumTouches_()` + * issues `pointercancel` events, when there was no `touchend` for a + * `touchstart`. Now, let's say a first `touchstart` is registered on + * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up. + * But `documentPointerEventHandler_` doesn't know about the first + * `touchstart`. If there is no `touchend` for the `touchstart`, we can + * only receive a `touchcancel` from `pointerEventHandler_`, because it is + * only registered there. + */ + ie( + this.element_, + _e.POINTERCANCEL, + this.handlePointerUp_, + this + ) + ), this.element_.getRootNode && this.element_.getRootNode() !== i && this.dragListenerKeys_.push( + ie( + this.element_.getRootNode(), + _e.POINTERUP, + this.handlePointerUp_, + this + ) + ); + } + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + handlePointerMove_(e) { + if (this.isMoving_(e)) { + this.updateActivePointers_(e), this.dragging_ = !0; + const t = new Pn( + _e.POINTERDRAG, + this.map_, + e, + this.dragging_, + void 0, + this.activePointers_ + ); + this.dispatchEvent(t); + } + } + /** + * Wrap and relay a pointermove event. + * @param {PointerEvent} pointerEvent Pointer + * event. + * @private + */ + relayMoveEvent_(e) { + this.originalPointerMoveEvent_ = e; + const t = !!(this.down_ && this.isMoving_(e)); + this.dispatchEvent( + new Pn( + _e.POINTERMOVE, + this.map_, + e, + t + ) + ); + } + /** + * Flexible handling of a `touch-action: none` css equivalent: because calling + * `preventDefault()` on a `pointermove` event does not stop native page scrolling + * and zooming, we also listen for `touchmove` and call `preventDefault()` on it + * when an interaction (currently `DragPan` handles the event. + * @param {TouchEvent} event Event. + * @private + */ + handleTouchMove_(e) { + const t = this.originalPointerMoveEvent_; + (!t || t.defaultPrevented) && (typeof e.cancelable != "boolean" || e.cancelable === !0) && e.preventDefault(); + } + /** + * @param {PointerEvent} pointerEvent Pointer + * event. + * @return {boolean} Is moving. + * @private + */ + isMoving_(e) { + return this.dragging_ || Math.abs(e.clientX - this.down_.clientX) > this.moveTolerance_ || Math.abs(e.clientY - this.down_.clientY) > this.moveTolerance_; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.relayedListenerKey_ && (Re(this.relayedListenerKey_), this.relayedListenerKey_ = null), this.element_.removeEventListener( + j.TOUCHMOVE, + this.boundHandleTouchMove_ + ), this.pointerdownListenerKey_ && (Re(this.pointerdownListenerKey_), this.pointerdownListenerKey_ = null), this.dragListenerKeys_.forEach(Re), this.dragListenerKeys_.length = 0, this.element_ = null, super.disposeInternal(); + } +} +const Ui = { + /** + * Triggered after a map frame is rendered. + * @event module:ol/MapEvent~MapEvent#postrender + * @api + */ + POSTRENDER: "postrender", + /** + * Triggered when the map starts moving. + * @event module:ol/MapEvent~MapEvent#movestart + * @api + */ + MOVESTART: "movestart", + /** + * Triggered after the map is moved. + * @event module:ol/MapEvent~MapEvent#moveend + * @api + */ + MOVEEND: "moveend", + /** + * Triggered when loading of additional map data (tiles, images, features) starts. + * @event module:ol/MapEvent~MapEvent#loadstart + * @api + */ + LOADSTART: "loadstart", + /** + * Triggered when loading of additional map data has completed. + * @event module:ol/MapEvent~MapEvent#loadend + * @api + */ + LOADEND: "loadend" +}, ut = { + LAYERGROUP: "layergroup", + SIZE: "size", + TARGET: "target", + VIEW: "view" +}, GA = 1 / 0; +class yx { + /** + * @param {function(T): number} priorityFunction Priority function. + * @param {function(T): string} keyFunction Key function. + */ + constructor(e, t) { + this.priorityFunction_ = e, this.keyFunction_ = t, this.elements_ = [], this.priorities_ = [], this.queuedElements_ = {}; + } + /** + * FIXME empty description for jsdoc + */ + clear() { + this.elements_.length = 0, this.priorities_.length = 0, ns(this.queuedElements_); + } + /** + * Remove and return the highest-priority element. O(log N). + * @return {T} Element. + */ + dequeue() { + const e = this.elements_, t = this.priorities_, i = e[0]; + e.length == 1 ? (e.length = 0, t.length = 0) : (e[0] = /** @type {T} */ + e.pop(), t[0] = /** @type {number} */ + t.pop(), this.siftUp_(0)); + const r = this.keyFunction_(i); + return delete this.queuedElements_[r], i; + } + /** + * Enqueue an element. O(log N). + * @param {T} element Element. + * @return {boolean} The element was added to the queue. + */ + enqueue(e) { + Ie( + !(this.keyFunction_(e) in this.queuedElements_), + "Tried to enqueue an `element` that was already added to the queue" + ); + const t = this.priorityFunction_(e); + return t != GA ? (this.elements_.push(e), this.priorities_.push(t), this.queuedElements_[this.keyFunction_(e)] = !0, this.siftDown_(0, this.elements_.length - 1), !0) : !1; + } + /** + * @return {number} Count. + */ + getCount() { + return this.elements_.length; + } + /** + * Gets the index of the left child of the node at the given index. + * @param {number} index The index of the node to get the left child for. + * @return {number} The index of the left child. + * @private + */ + getLeftChildIndex_(e) { + return e * 2 + 1; + } + /** + * Gets the index of the right child of the node at the given index. + * @param {number} index The index of the node to get the right child for. + * @return {number} The index of the right child. + * @private + */ + getRightChildIndex_(e) { + return e * 2 + 2; + } + /** + * Gets the index of the parent of the node at the given index. + * @param {number} index The index of the node to get the parent for. + * @return {number} The index of the parent. + * @private + */ + getParentIndex_(e) { + return e - 1 >> 1; + } + /** + * Make this a heap. O(N). + * @private + */ + heapify_() { + let e; + for (e = (this.elements_.length >> 1) - 1; e >= 0; e--) + this.siftUp_(e); + } + /** + * @return {boolean} Is empty. + */ + isEmpty() { + return this.elements_.length === 0; + } + /** + * @param {string} key Key. + * @return {boolean} Is key queued. + */ + isKeyQueued(e) { + return e in this.queuedElements_; + } + /** + * @param {T} element Element. + * @return {boolean} Is queued. + */ + isQueued(e) { + return this.isKeyQueued(this.keyFunction_(e)); + } + /** + * @param {number} index The index of the node to move down. + * @private + */ + siftUp_(e) { + const t = this.elements_, i = this.priorities_, r = t.length, s = t[e], o = i[e], a = e; + for (; e < r >> 1; ) { + const l = this.getLeftChildIndex_(e), A = this.getRightChildIndex_(e), c = A < r && i[A] < i[l] ? A : l; + t[e] = t[c], i[e] = i[c], e = c; + } + t[e] = s, i[e] = o, this.siftDown_(a, e); + } + /** + * @param {number} startIndex The index of the root. + * @param {number} index The index of the node to move up. + * @private + */ + siftDown_(e, t) { + const i = this.elements_, r = this.priorities_, s = i[t], o = r[t]; + for (; t > e; ) { + const a = this.getParentIndex_(t); + if (r[a] > o) + i[t] = i[a], r[t] = r[a], t = a; + else + break; + } + i[t] = s, r[t] = o; + } + /** + * FIXME empty description for jsdoc + */ + reprioritize() { + const e = this.priorityFunction_, t = this.elements_, i = this.priorities_; + let r = 0; + const s = t.length; + let o, a, l; + for (a = 0; a < s; ++a) + o = t[a], l = e(o), l == GA ? delete this.queuedElements_[this.keyFunction_(o)] : (i[r] = l, t[r++] = o); + t.length = r, i.length = r, this.heapify_(); + } +} +class c_ extends yx { + /** + * @param {PriorityFunction} tilePriorityFunction Tile priority function. + * @param {function(): ?} tileChangeCallback Function called on each tile change event. + */ + constructor(e, t) { + super( + /** + * @param {Array} element Element. + * @return {number} Priority. + */ + function(i) { + return e.apply(null, i); + }, + /** + * @param {Array} element Element. + * @return {string} Key. + */ + function(i) { + return ( + /** @type {import("./Tile.js").default} */ + i[0].getKey() + ); + } + ), this.boundHandleTileChange_ = this.handleTileChange.bind(this), this.tileChangeCallback_ = t, this.tilesLoading_ = 0, this.tilesLoadingKeys_ = {}; + } + /** + * @param {Array} element Element. + * @return {boolean} The element was added to the queue. + * @override + */ + enqueue(e) { + const t = super.enqueue(e); + return t && e[0].addEventListener(j.CHANGE, this.boundHandleTileChange_), t; + } + /** + * @return {number} Number of tiles loading. + */ + getTilesLoading() { + return this.tilesLoading_; + } + /** + * @param {import("./events/Event.js").default} event Event. + * @protected + */ + handleTileChange(e) { + const t = ( + /** @type {import("./Tile.js").default} */ + e.target + ), i = t.getState(); + if (i === $.LOADED || i === $.ERROR || i === $.EMPTY) { + i !== $.ERROR && t.removeEventListener(j.CHANGE, this.boundHandleTileChange_); + const r = t.getKey(); + r in this.tilesLoadingKeys_ && (delete this.tilesLoadingKeys_[r], --this.tilesLoading_), this.tileChangeCallback_(); + } + } + /** + * @param {number} maxTotalLoading Maximum number tiles to load simultaneously. + * @param {number} maxNewLoads Maximum number of new tiles to load. + */ + loadMoreTiles(e, t) { + let i = 0; + for (; this.tilesLoading_ < e && i < t && this.getCount() > 0; ) { + const r = this.dequeue()[0], s = r.getKey(); + r.getState() === $.IDLE && !(s in this.tilesLoadingKeys_) && (this.tilesLoadingKeys_[s] = !0, ++this.tilesLoading_, ++i, r.load()); + } + } +} +function wx(n, e, t, i, r) { + if (!n || !(t in n.wantedTiles) || !n.wantedTiles[t][e.getKey()]) + return GA; + const s = n.viewState.center, o = i[0] - s[0], a = i[1] - s[1]; + return 65536 * Math.log(r) + Math.sqrt(o * o + a * a) / r; +} +class Kn extends Oi { + /** + * @param {Options} options Control options. + */ + constructor(e) { + super(); + const t = e.element; + t && !e.target && !t.style.pointerEvents && (t.style.pointerEvents = "auto"), this.element = t || null, this.target_ = null, this.map_ = null, this.listenerKeys = [], e.render && (this.render = e.render), e.target && this.setTarget(e.target); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + var e; + (e = this.element) == null || e.remove(), super.disposeInternal(); + } + /** + * Get the map associated with this control. + * @return {import("../Map.js").default|null} Map. + * @api + */ + getMap() { + return this.map_; + } + /** + * Remove the control from its current map and attach it to the new map. + * Pass `null` to just remove the control from the current map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + * @api + */ + setMap(e) { + var t; + this.map_ && ((t = this.element) == null || t.remove()); + for (let i = 0, r = this.listenerKeys.length; i < r; ++i) + Re(this.listenerKeys[i]); + this.listenerKeys.length = 0, this.map_ = e, e && ((this.target_ ?? e.getOverlayContainerStopEvent()).appendChild(this.element), this.render !== io && this.listenerKeys.push( + ie(e, Ui.POSTRENDER, this.render, this) + ), e.render()); + } + /** + * Renders the control. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @api + */ + render(e) { + } + /** + * This function is used to set a target element for the control. It has no + * effect if it is called after the control has been added to the map (i.e. + * after `setMap` is called on the control). If no `target` is set in the + * options passed to the control constructor and if `setTarget` is not called + * then the control is added to the map's overlay container. + * @param {HTMLElement|string} target Target. + * @api + */ + setTarget(e) { + this.target_ = typeof e == "string" ? document.getElementById(e) : e; + } +} +class xx extends Kn { + /** + * @param {Options} [options] Attribution options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + render: e.render, + target: e.target + }), this.ulElement_ = document.createElement("ul"), this.collapsed_ = e.collapsed !== void 0 ? e.collapsed : !0, this.userCollapsed_ = this.collapsed_, this.overrideCollapsible_ = e.collapsible !== void 0, this.collapsible_ = e.collapsible !== void 0 ? e.collapsible : !0, this.collapsible_ || (this.collapsed_ = !1), this.attributions_ = e.attributions; + const t = e.className !== void 0 ? e.className : "ol-attribution", i = e.tipLabel !== void 0 ? e.tipLabel : "Attributions", r = e.expandClassName !== void 0 ? e.expandClassName : t + "-expand", s = e.collapseLabel !== void 0 ? e.collapseLabel : "›", o = e.collapseClassName !== void 0 ? e.collapseClassName : t + "-collapse"; + typeof s == "string" ? (this.collapseLabel_ = document.createElement("span"), this.collapseLabel_.textContent = s, this.collapseLabel_.className = o) : this.collapseLabel_ = s; + const a = e.label !== void 0 ? e.label : "i"; + typeof a == "string" ? (this.label_ = document.createElement("span"), this.label_.textContent = a, this.label_.className = r) : this.label_ = a; + const l = this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_; + this.toggleButton_ = document.createElement("button"), this.toggleButton_.setAttribute("type", "button"), this.toggleButton_.setAttribute("aria-expanded", String(!this.collapsed_)), this.toggleButton_.title = i, this.toggleButton_.appendChild(l), this.toggleButton_.addEventListener( + j.CLICK, + this.handleClick_.bind(this), + !1 + ); + const A = t + " " + In + " " + As + (this.collapsed_ && this.collapsible_ ? " " + bA : "") + (this.collapsible_ ? "" : " ol-uncollapsible"), c = this.element; + c.className = A, c.appendChild(this.toggleButton_), c.appendChild(this.ulElement_), this.renderedAttributions_ = [], this.renderedVisible_ = !0; + } + /** + * Collect a list of visible attributions and set the collapsible state. + * @param {import("../Map.js").FrameState} frameState Frame state. + * @return {Array} Attributions. + * @private + */ + collectSourceAttributions_(e) { + const t = this.getMap().getAllLayers(), i = new Set( + t.flatMap((r) => r.getAttributions(e)) + ); + if (this.attributions_ !== void 0 && (Array.isArray(this.attributions_) ? this.attributions_.forEach((r) => i.add(r)) : i.add(this.attributions_)), !this.overrideCollapsible_) { + const r = !t.some( + (s) => { + var o; + return ((o = s.getSource()) == null ? void 0 : o.getAttributionsCollapsible()) === !1; + } + ); + this.setCollapsible(r); + } + return Array.from(i); + } + /** + * @private + * @param {?import("../Map.js").FrameState} frameState Frame state. + */ + async updateElement_(e) { + if (!e) { + this.renderedVisible_ && (this.element.style.display = "none", this.renderedVisible_ = !1); + return; + } + const t = await Promise.all( + this.collectSourceAttributions_(e).map( + (r) => og(() => r) + ) + ), i = t.length > 0; + if (this.renderedVisible_ != i && (this.element.style.display = i ? "" : "none", this.renderedVisible_ = i), !yn(t, this.renderedAttributions_)) { + wp(this.ulElement_); + for (let r = 0, s = t.length; r < s; ++r) { + const o = document.createElement("li"); + o.innerHTML = t[r], this.ulElement_.appendChild(o); + } + this.renderedAttributions_ = t; + } + } + /** + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e) { + e.preventDefault(), this.handleToggle_(), this.userCollapsed_ = this.collapsed_; + } + /** + * @private + */ + handleToggle_() { + this.element.classList.toggle(bA), this.collapsed_ ? ro(this.collapseLabel_, this.label_) : ro(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_, this.toggleButton_.setAttribute("aria-expanded", String(!this.collapsed_)); + } + /** + * Return `true` if the attribution is collapsible, `false` otherwise. + * @return {boolean} True if the widget is collapsible. + * @api + */ + getCollapsible() { + return this.collapsible_; + } + /** + * Set whether the attribution should be collapsible. + * @param {boolean} collapsible True if the widget is collapsible. + * @api + */ + setCollapsible(e) { + this.collapsible_ !== e && (this.collapsible_ = e, this.element.classList.toggle("ol-uncollapsible"), this.userCollapsed_ && this.handleToggle_()); + } + /** + * Collapse or expand the attribution according to the passed parameter. Will + * not do anything if the attribution isn't collapsible or if the current + * collapsed state is already the one requested. + * @param {boolean} collapsed True if the widget is collapsed. + * @api + */ + setCollapsed(e) { + this.userCollapsed_ = e, !(!this.collapsible_ || this.collapsed_ === e) && this.handleToggle_(); + } + /** + * Return `true` when the attribution is currently collapsed or `false` + * otherwise. + * @return {boolean} True if the widget is collapsed. + * @api + */ + getCollapsed() { + return this.collapsed_; + } + /** + * Update the attribution element. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + this.updateElement_(e.frameState); + } +} +class Bx extends Kn { + /** + * @param {Options} [options] Rotate options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + render: e.render, + target: e.target + }); + const t = e.className !== void 0 ? e.className : "ol-rotate", i = e.label !== void 0 ? e.label : "⇧", r = e.compassClassName !== void 0 ? e.compassClassName : "ol-compass"; + this.label_ = null, typeof i == "string" ? (this.label_ = document.createElement("span"), this.label_.className = r, this.label_.textContent = i) : (this.label_ = i, this.label_.classList.add(r)); + const s = e.tipLabel ? e.tipLabel : "Reset rotation", o = document.createElement("button"); + o.className = t + "-reset", o.setAttribute("type", "button"), o.title = s, o.appendChild(this.label_), o.addEventListener( + j.CLICK, + this.handleClick_.bind(this), + !1 + ); + const a = t + " " + In + " " + As, l = this.element; + l.className = a, l.appendChild(o), this.callResetNorth_ = e.resetNorth ? e.resetNorth : void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.autoHide_ = e.autoHide !== void 0 ? e.autoHide : !0, this.rotation_ = void 0, this.autoHide_ && this.element.classList.add(Gl); + } + /** + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e) { + e.preventDefault(), this.callResetNorth_ !== void 0 ? this.callResetNorth_() : this.resetNorth_(); + } + /** + * @private + */ + resetNorth_() { + const t = this.getMap().getView(); + if (!t) + return; + const i = t.getRotation(); + i !== void 0 && (this.duration_ > 0 && i % (2 * Math.PI) !== 0 ? t.animate({ + rotation: 0, + duration: this.duration_, + easing: rs + }) : t.setRotation(0)); + } + /** + * Update the rotate control element. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + const t = e.frameState; + if (!t) + return; + const i = t.viewState.rotation; + if (i != this.rotation_) { + const r = "rotate(" + i + "rad)"; + if (this.autoHide_) { + const s = this.element.classList.contains(Gl); + !s && i === 0 ? this.element.classList.add(Gl) : s && i !== 0 && this.element.classList.remove(Gl); + } + this.label_.style.transform = r; + } + this.rotation_ = i; + } +} +class Sx extends Kn { + /** + * @param {Options} [options] Zoom options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + target: e.target + }); + const t = e.className !== void 0 ? e.className : "ol-zoom", i = e.delta !== void 0 ? e.delta : 1, r = e.zoomInClassName !== void 0 ? e.zoomInClassName : t + "-in", s = e.zoomOutClassName !== void 0 ? e.zoomOutClassName : t + "-out", o = e.zoomInLabel !== void 0 ? e.zoomInLabel : "+", a = e.zoomOutLabel !== void 0 ? e.zoomOutLabel : "–", l = e.zoomInTipLabel !== void 0 ? e.zoomInTipLabel : "Zoom in", A = e.zoomOutTipLabel !== void 0 ? e.zoomOutTipLabel : "Zoom out", c = document.createElement("button"); + c.className = r, c.setAttribute("type", "button"), c.title = l, c.appendChild( + typeof o == "string" ? document.createTextNode(o) : o + ), c.addEventListener( + j.CLICK, + this.handleClick_.bind(this, i), + !1 + ); + const h = document.createElement("button"); + h.className = s, h.setAttribute("type", "button"), h.title = A, h.appendChild( + typeof a == "string" ? document.createTextNode(a) : a + ), h.addEventListener( + j.CLICK, + this.handleClick_.bind(this, -i), + !1 + ); + const u = t + " " + In + " " + As, g = this.element; + g.className = u, g.appendChild(c), g.appendChild(h), this.duration_ = e.duration !== void 0 ? e.duration : 250; + } + /** + * @param {number} delta Zoom delta. + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e, t) { + t.preventDefault(), this.zoomByDelta_(e); + } + /** + * @param {number} delta Zoom delta. + * @private + */ + zoomByDelta_(e) { + const i = this.getMap().getView(); + if (!i) + return; + const r = i.getZoom(); + if (r !== void 0) { + const s = i.getConstrainedZoom(r + e); + this.duration_ > 0 ? (i.getAnimating() && i.cancelAnimations(), i.animate({ + zoom: s, + duration: this.duration_, + easing: rs + })) : i.setZoom(s); + } + } +} +function Rx(n) { + n = n || {}; + const e = new wt(); + return (n.zoom !== void 0 ? n.zoom : !0) && e.push(new Sx(n.zoomOptions)), (n.rotate !== void 0 ? n.rotate : !0) && e.push(new Bx(n.rotateOptions)), (n.attribution !== void 0 ? n.attribution : !0) && e.push(new xx(n.attributionOptions)), e; +} +const kA = { + ACTIVE: "active" +}; +class Wn extends Oi { + /** + * @param {InteractionOptions} [options] Options. + */ + constructor(e) { + super(), this.on, this.once, this.un, e && e.handleEvent && (this.handleEvent = e.handleEvent), this.map_ = null, this.setActive(!0); + } + /** + * Return whether the interaction is currently active. + * @return {boolean} `true` if the interaction is active, `false` otherwise. + * @observable + * @api + */ + getActive() { + return ( + /** @type {boolean} */ + this.get(kA.ACTIVE) + ); + } + /** + * Get the map associated with this interaction. + * @return {import("../Map.js").default|null} Map. + * @api + */ + getMap() { + return this.map_; + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event}. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @api + */ + handleEvent(e) { + return !0; + } + /** + * Activate or deactivate the interaction. + * @param {boolean} active Active. + * @observable + * @api + */ + setActive(e) { + this.set(kA.ACTIVE, e); + } + /** + * Remove the interaction from its current map and attach it to the new map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + */ + setMap(e) { + this.map_ = e; + } +} +function Tx(n, e, t) { + const i = n.getCenterInternal(); + if (i) { + const r = [i[0] + e[0], i[1] + e[1]]; + n.animateInternal({ + duration: t !== void 0 ? t : 250, + easing: $C, + center: n.getConstrainedCenter(r) + }); + } +} +function Hg(n, e, t, i) { + const r = n.getZoom(); + if (r === void 0) + return; + const s = n.getConstrainedZoom(r + e), o = n.getResolutionForZoom(s); + n.getAnimating() && n.cancelAnimations(), n.animate({ + resolution: o, + anchor: t, + duration: i !== void 0 ? i : 250, + easing: rs + }); +} +class vx extends Wn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250; + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a + * doubleclick) and eventually zooms the map. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @override + */ + handleEvent(e) { + let t = !1; + if (e.type == _e.DBLCLICK) { + const i = ( + /** @type {MouseEvent} */ + e.originalEvent + ), r = e.map, s = e.coordinate, o = i.shiftKey ? -this.delta_ : this.delta_, a = r.getView(); + Hg(a, o, s, this.duration_), i.preventDefault(), t = !0; + } + return !t; + } +} +class Wi extends Wn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super( + /** @type {import("./Interaction.js").InteractionOptions} */ + e + ), e.handleDownEvent && (this.handleDownEvent = e.handleDownEvent), e.handleDragEvent && (this.handleDragEvent = e.handleDragEvent), e.handleMoveEvent && (this.handleMoveEvent = e.handleMoveEvent), e.handleUpEvent && (this.handleUpEvent = e.handleUpEvent), e.stopDown && (this.stopDown = e.stopDown), this.handlingDownUpSequence = !1, this.targetPointers = []; + } + /** + * Returns the current number of pointers involved in the interaction, + * e.g. `2` when two fingers are used. + * @return {number} The number of pointers. + * @api + */ + getPointerCount() { + return this.targetPointers.length; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @protected + */ + handleDownEvent(e) { + return !1; + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @protected + */ + handleDragEvent(e) { + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may call into + * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are + * detected. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @api + * @override + */ + handleEvent(e) { + if (!e.originalEvent) + return !0; + let t = !1; + if (this.updateTrackedPointers_(e), this.handlingDownUpSequence) { + if (e.type == _e.POINTERDRAG) + this.handleDragEvent(e), e.originalEvent.preventDefault(); + else if (e.type == _e.POINTERUP) { + const i = this.handleUpEvent(e); + this.handlingDownUpSequence = i && this.targetPointers.length > 0; + } + } else if (e.type == _e.POINTERDOWN) { + const i = this.handleDownEvent(e); + this.handlingDownUpSequence = i, t = this.stopDown(i); + } else e.type == _e.POINTERMOVE && this.handleMoveEvent(e); + return !t; + } + /** + * Handle pointer move events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @protected + */ + handleMoveEvent(e) { + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @protected + */ + handleUpEvent(e) { + return !1; + } + /** + * This function is used to determine if "down" events should be propagated + * to other interactions or should be stopped. + * @param {boolean} handled Was the event handled by the interaction? + * @return {boolean} Should the `down` event be stopped? + */ + stopDown(e) { + return e; + } + /** + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @private + */ + updateTrackedPointers_(e) { + e.activePointers && (this.targetPointers = e.activePointers); + } +} +function Xg(n) { + const e = n.length; + let t = 0, i = 0; + for (let r = 0; r < e; r++) + t += n[r].clientX, i += n[r].clientY; + return { clientX: t / e, clientY: i / e }; +} +function Lu(n) { + const e = arguments; + return function(t) { + let i = !0; + for (let r = 0, s = e.length; r < s && (i = i && e[r](t), !!i); ++r) + ; + return i; + }; +} +const Qx = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return e.altKey && !(e.metaKey || e.ctrlKey) && !e.shiftKey; +}, Dx = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey; +}, Lx = function(n) { + const e = n.map.getTargetElement(), t = e.getRootNode(), i = n.map.getOwnerDocument().activeElement; + return t instanceof ShadowRoot ? t.host.contains(i) : e.contains(i); +}, h_ = function(n) { + const e = n.map.getTargetElement(), t = e.getRootNode(); + return (t instanceof ShadowRoot ? t.host : e).hasAttribute("tabindex") ? Lx(n) : !0; +}, fo = bi, FO = function(n) { + return n.type == _e.CLICK; +}, u_ = function(n) { + const e = ( + /** @type {MouseEvent} */ + n.originalEvent + ); + return e.button == 0 && !(VC && ag && e.ctrlKey); +}, Fu = is, bO = function(n) { + return n.type == "pointermove"; +}, g_ = function(n) { + return n.type == _e.SINGLECLICK; +}, PO = function(n) { + return n.type == _e.DBLCLICK; +}, qg = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return !e.altKey && !(e.metaKey || e.ctrlKey) && !e.shiftKey; +}, MO = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return !e.altKey && (ag ? e.metaKey : e.ctrlKey) && !e.shiftKey; +}, Fx = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return ag ? e.metaKey : e.ctrlKey; +}, vc = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ); + return !e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey; +}, d_ = function(n) { + const e = ( + /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ + n.originalEvent + ), t = ( + /** @type {Element} */ + e.target.tagName + ); + return t !== "INPUT" && t !== "SELECT" && t !== "TEXTAREA" && // `isContentEditable` is only available on `HTMLElement`, but it may also be a + // different type like `SVGElement`. + // @ts-ignore + !e.target.isContentEditable; +}, js = function(n) { + const e = ( + /** @type {import("../MapBrowserEvent").default} */ + n.originalEvent + ); + return Ie( + e !== void 0, + "mapBrowserEvent must originate from a pointer event" + ), e.pointerType == "mouse"; +}, NO = function(n) { + const e = ( + /** @type {import("../MapBrowserEvent").default} */ + n.originalEvent + ); + return Ie( + e !== void 0, + "mapBrowserEvent must originate from a pointer event" + ), e.pointerType === "touch"; +}, OO = function(n) { + const e = ( + /** @type {import("../MapBrowserEvent").default} */ + n.originalEvent + ); + return Ie( + e !== void 0, + "mapBrowserEvent must originate from a pointer event" + ), e.pointerType === "pen"; +}, f_ = function(n) { + const e = ( + /** @type {import("../MapBrowserEvent").default} */ + n.originalEvent + ); + return Ie( + e !== void 0, + "mapBrowserEvent must originate from a pointer event" + ), e.isPrimary && e.button === 0; +}; +class bx extends Wi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super({ + stopDown: is + }), e = e || {}, this.kinetic_ = e.kinetic, this.lastCentroid = null, this.lastPointersCount_, this.panning_ = !1; + const t = e.condition ? e.condition : Lu(qg, f_); + this.condition_ = e.onFocusOnly ? Lu(h_, t) : t, this.noKinetic_ = !1; + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @override + */ + handleDragEvent(e) { + const t = e.map; + this.panning_ || (this.panning_ = !0, t.getView().beginInteraction()); + const i = this.targetPointers, r = t.getEventPixel(Xg(i)); + if (i.length == this.lastPointersCount_) { + if (this.kinetic_ && this.kinetic_.update(r[0], r[1]), this.lastCentroid) { + const s = [ + this.lastCentroid[0] - r[0], + r[1] - this.lastCentroid[1] + ], a = e.map.getView(); + Lp(s, a.getResolution()), Eg(s, a.getRotation()), a.adjustCenterInternal(s); + } + } else this.kinetic_ && this.kinetic_.begin(); + this.lastCentroid = r, this.lastPointersCount_ = i.length, e.originalEvent.preventDefault(); + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleUpEvent(e) { + const t = e.map, i = t.getView(); + if (this.targetPointers.length === 0) { + if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) { + const r = this.kinetic_.getDistance(), s = this.kinetic_.getAngle(), o = i.getCenterInternal(), a = t.getPixelFromCoordinateInternal(o), l = t.getCoordinateFromPixelInternal([ + a[0] - r * Math.cos(s), + a[1] - r * Math.sin(s) + ]); + i.animateInternal({ + center: i.getConstrainedCenter(l), + duration: 500, + easing: rs + }); + } + return this.panning_ && (this.panning_ = !1, i.endInteraction()), !1; + } + return this.kinetic_ && this.kinetic_.begin(), this.lastCentroid = null, !0; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleDownEvent(e) { + if (this.targetPointers.length > 0 && this.condition_(e)) { + const i = e.map.getView(); + return this.lastCentroid = null, i.getAnimating() && i.cancelAnimations(), this.kinetic_ && this.kinetic_.begin(), this.noKinetic_ = this.targetPointers.length > 1, !0; + } + return !1; + } +} +class Px extends Wi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super({ + stopDown: is + }), this.condition_ = e.condition ? e.condition : Dx, this.lastAngle_ = void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250; + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @override + */ + handleDragEvent(e) { + if (!js(e)) + return; + const t = e.map, i = t.getView(); + if (i.getConstraints().rotation === Pg) + return; + const r = t.getSize(), s = e.pixel, o = Math.atan2(r[1] / 2 - s[1], s[0] - r[0] / 2); + if (this.lastAngle_ !== void 0) { + const a = o - this.lastAngle_; + i.adjustRotationInternal(-a); + } + this.lastAngle_ = o; + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleUpEvent(e) { + return js(e) ? (e.map.getView().endInteraction(this.duration_), !1) : !0; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleDownEvent(e) { + return js(e) && u_(e) && this.condition_(e) ? (e.map.getView().beginInteraction(), this.lastAngle_ = void 0, !0) : !1; + } +} +class Mx extends Bo { + /** + * @param {string} className CSS class name. + */ + constructor(e) { + super(), this.geometry_ = null, this.element_ = document.createElement("div"), this.element_.style.position = "absolute", this.element_.style.pointerEvents = "auto", this.element_.className = "ol-box " + e, this.map_ = null, this.startPixel_ = null, this.endPixel_ = null; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.setMap(null); + } + /** + * @private + */ + render_() { + const e = this.startPixel_, t = this.endPixel_, i = "px", r = this.element_.style; + r.left = Math.min(e[0], t[0]) + i, r.top = Math.min(e[1], t[1]) + i, r.width = Math.abs(t[0] - e[0]) + i, r.height = Math.abs(t[1] - e[1]) + i; + } + /** + * @param {import("../Map.js").default|null} map Map. + */ + setMap(e) { + if (this.map_) { + this.map_.getOverlayContainer().removeChild(this.element_); + const t = this.element_.style; + t.left = "inherit", t.top = "inherit", t.width = "inherit", t.height = "inherit"; + } + this.map_ = e, this.map_ && this.map_.getOverlayContainer().appendChild(this.element_); + } + /** + * @param {import("../pixel.js").Pixel} startPixel Start pixel. + * @param {import("../pixel.js").Pixel} endPixel End pixel. + */ + setPixels(e, t) { + this.startPixel_ = e, this.endPixel_ = t, this.createOrUpdateGeometry(), this.render_(); + } + /** + * Creates or updates the cached geometry. + */ + createOrUpdateGeometry() { + if (!this.map_) + return; + const e = this.startPixel_, t = this.endPixel_, r = [ + e, + [e[0], t[1]], + t, + [t[0], e[1]] + ].map( + this.map_.getCoordinateFromPixelInternal, + this.map_ + ); + r[4] = r[0].slice(), this.geometry_ ? this.geometry_.setCoordinates([r]) : this.geometry_ = new it([r]); + } + /** + * @return {import("../geom/Polygon.js").default} Geometry. + */ + getGeometry() { + return this.geometry_; + } +} +const ys = { + /** + * Triggered upon drag box start. + * @event DragBoxEvent#boxstart + * @api + */ + BOXSTART: "boxstart", + /** + * Triggered on drag when box is active. + * @event DragBoxEvent#boxdrag + * @api + */ + BOXDRAG: "boxdrag", + /** + * Triggered upon drag box end. + * @event DragBoxEvent#boxend + * @api + */ + BOXEND: "boxend", + /** + * Triggered upon drag box canceled. + * @event DragBoxEvent#boxcancel + * @api + */ + BOXCANCEL: "boxcancel" +}; +class ea extends xt { + /** + * @param {string} type The event type. + * @param {import("../coordinate.js").Coordinate} coordinate The event coordinate. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Originating event. + */ + constructor(e, t, i) { + super(e), this.coordinate = t, this.mapBrowserEvent = i; + } +} +class Nx extends Wi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), this.on, this.once, this.un, e = e ?? {}, this.box_ = new Mx(e.className || "ol-dragbox"), this.minArea_ = e.minArea ?? 64, e.onBoxEnd && (this.onBoxEnd = e.onBoxEnd), this.startPixel_ = null, this.condition_ = e.condition ?? u_, this.boxEndCondition_ = e.boxEndCondition ?? this.defaultBoxEndCondition; + } + /** + * The default condition for determining whether the boxend event + * should fire. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent The originating MapBrowserEvent + * leading to the box end. + * @param {import("../pixel.js").Pixel} startPixel The starting pixel of the box. + * @param {import("../pixel.js").Pixel} endPixel The end pixel of the box. + * @return {boolean} Whether or not the boxend condition should be fired. + */ + defaultBoxEndCondition(e, t, i) { + const r = i[0] - t[0], s = i[1] - t[1]; + return r * r + s * s >= this.minArea_; + } + /** + * Returns geometry of last drawn box. + * @return {import("../geom/Polygon.js").default} Geometry. + * @api + */ + getGeometry() { + return this.box_.getGeometry(); + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @override + */ + handleDragEvent(e) { + this.startPixel_ && (this.box_.setPixels(this.startPixel_, e.pixel), this.dispatchEvent( + new ea( + ys.BOXDRAG, + e.coordinate, + e + ) + )); + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleUpEvent(e) { + if (!this.startPixel_) + return !1; + const t = this.boxEndCondition_( + e, + this.startPixel_, + e.pixel + ); + return t && this.onBoxEnd(e), this.dispatchEvent( + new ea( + t ? ys.BOXEND : ys.BOXCANCEL, + e.coordinate, + e + ) + ), this.box_.setMap(null), this.startPixel_ = null, !1; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleDownEvent(e) { + return this.condition_(e) ? (this.startPixel_ = e.pixel, this.box_.setMap(e.map), this.box_.setPixels(this.startPixel_, this.startPixel_), this.dispatchEvent( + new ea( + ys.BOXSTART, + e.coordinate, + e + ) + ), !0) : !1; + } + /** + * Function to execute just before `onboxend` is fired + * @param {import("../MapBrowserEvent.js").default} event Event. + */ + onBoxEnd(e) { + } + /** + * Activate or deactivate the interaction. + * @param {boolean} active Active. + * @observable + * @api + * @override + */ + setActive(e) { + e || (this.box_.setMap(null), this.startPixel_ && (this.dispatchEvent( + new ea(ys.BOXCANCEL, this.startPixel_, null) + ), this.startPixel_ = null)), super.setActive(e); + } + /** + * @param {import("../Map.js").default|null} map Map. + * @override + */ + setMap(e) { + this.getMap() && (this.box_.setMap(null), this.startPixel_ && (this.dispatchEvent( + new ea(ys.BOXCANCEL, this.startPixel_, null) + ), this.startPixel_ = null)), super.setMap(e); + } +} +class Ox extends Nx { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}; + const t = e.condition ? e.condition : vc; + super({ + condition: t, + className: e.className || "ol-dragzoom", + minArea: e.minArea + }), this.duration_ = e.duration !== void 0 ? e.duration : 200, this.out_ = e.out !== void 0 ? e.out : !1; + } + /** + * Function to execute just before `onboxend` is fired + * @param {import("../MapBrowserEvent.js").default} event Event. + * @override + */ + onBoxEnd(e) { + const i = ( + /** @type {!import("../View.js").default} */ + this.getMap().getView() + ); + let r = this.getGeometry(); + if (this.out_) { + const s = i.rotatedExtentForGeometry(r), o = i.getResolutionForExtentInternal(s), a = i.getResolution() / o; + r = r.clone(), r.scale(a * a); + } + i.fitInternal(r, { + duration: this.duration_, + easing: rs + }); + } +} +const Qr = { + LEFT: "ArrowLeft", + UP: "ArrowUp", + RIGHT: "ArrowRight", + DOWN: "ArrowDown" +}; +class Gx extends Wn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.defaultCondition_ = function(t) { + return qg(t) && d_(t); + }, this.condition_ = e.condition !== void 0 ? e.condition : this.defaultCondition_, this.duration_ = e.duration !== void 0 ? e.duration : 100, this.pixelDelta_ = e.pixelDelta !== void 0 ? e.pixelDelta : 128; + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a + * `KeyEvent`, and decides the direction to pan to (if an arrow key was + * pressed). + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @override + */ + handleEvent(e) { + let t = !1; + if (e.type == j.KEYDOWN) { + const i = ( + /** @type {KeyboardEvent} */ + e.originalEvent + ), r = i.key; + if (this.condition_(e) && (r == Qr.DOWN || r == Qr.LEFT || r == Qr.RIGHT || r == Qr.UP)) { + const o = e.map.getView(), a = o.getResolution() * this.pixelDelta_; + let l = 0, A = 0; + r == Qr.DOWN ? A = -a : r == Qr.LEFT ? l = -a : r == Qr.RIGHT ? l = a : A = a; + const c = [l, A]; + Eg(c, o.getRotation()), Tx(o, c, this.duration_), i.preventDefault(), t = !0; + } + } + return !t; + } +} +class kx extends Wn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.condition_ = e.condition ? e.condition : function(t) { + return !Fx(t) && d_(t); + }, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 100; + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a + * `KeyEvent`, and decides whether to zoom in or out (depending on whether the + * key pressed was '+' or '-'). + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @override + */ + handleEvent(e) { + let t = !1; + if (e.type == j.KEYDOWN || e.type == j.KEYPRESS) { + const i = ( + /** @type {KeyboardEvent} */ + e.originalEvent + ), r = i.key; + if (this.condition_(e) && (r === "+" || r === "-")) { + const s = e.map, o = r === "+" ? this.delta_ : -this.delta_, a = s.getView(); + Hg(a, o, void 0, this.duration_), i.preventDefault(), t = !0; + } + } + return !t; + } +} +class $x extends Wn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super( + /** @type {import("./Interaction.js").InteractionOptions} */ + e + ), this.totalDelta_ = 0, this.lastDelta_ = 0, this.maxDelta_ = e.maxDelta !== void 0 ? e.maxDelta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.timeout_ = e.timeout !== void 0 ? e.timeout : 80, this.useAnchor_ = e.useAnchor !== void 0 ? e.useAnchor : !0, this.constrainResolution_ = e.constrainResolution !== void 0 ? e.constrainResolution : !1; + const t = e.condition ? e.condition : fo; + this.condition_ = e.onFocusOnly ? Lu(h_, t) : t, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_, this.mode_ = void 0, this.trackpadEventGap_ = 400, this.trackpadTimeoutId_, this.deltaPerZoom_ = 300; + } + /** + * @private + */ + endInteraction_() { + this.trackpadTimeoutId_ = void 0; + const e = this.getMap(); + if (!e) + return; + e.getView().endInteraction( + void 0, + this.lastDelta_ ? this.lastDelta_ > 0 ? 1 : -1 : 0, + this.lastAnchor_ ? e.getCoordinateFromPixel(this.lastAnchor_) : null + ); + } + /** + * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually + * zooms the map. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. + * @return {boolean} `false` to stop event propagation. + * @override + */ + handleEvent(e) { + if (!this.condition_(e) || e.type !== j.WHEEL) + return !0; + const i = e.map, r = ( + /** @type {WheelEvent} */ + e.originalEvent + ); + r.preventDefault(), this.useAnchor_ && (this.lastAnchor_ = e.pixel); + let s; + if (e.type == j.WHEEL && (s = r.deltaY, UC && r.deltaMode === WheelEvent.DOM_DELTA_PIXEL && (s /= lg), r.deltaMode === WheelEvent.DOM_DELTA_LINE && (s *= 40)), s === 0) + return !1; + this.lastDelta_ = s; + const o = Date.now(); + this.startTime_ === void 0 && (this.startTime_ = o), (!this.mode_ || o - this.startTime_ > this.trackpadEventGap_) && (this.mode_ = Math.abs(s) < 4 ? "trackpad" : "wheel"); + const a = i.getView(); + if (this.mode_ === "trackpad" && !(a.getConstrainResolution() || this.constrainResolution_)) + return this.trackpadTimeoutId_ ? clearTimeout(this.trackpadTimeoutId_) : (a.getAnimating() && a.cancelAnimations(), a.beginInteraction()), this.trackpadTimeoutId_ = setTimeout( + this.endInteraction_.bind(this), + this.timeout_ + ), a.adjustZoom( + -s / this.deltaPerZoom_, + this.lastAnchor_ ? i.getCoordinateFromPixel(this.lastAnchor_) : null + ), this.startTime_ = o, !1; + this.totalDelta_ += s; + const l = Math.max(this.timeout_ - (o - this.startTime_), 0); + return clearTimeout(this.timeoutId_), this.timeoutId_ = setTimeout( + this.handleWheelZoom_.bind(this, i), + l + ), !1; + } + /** + * @private + * @param {import("../Map.js").default} map Map. + */ + handleWheelZoom_(e) { + const t = e.getView(); + t.getAnimating() && t.cancelAnimations(); + let i = -ue( + this.totalDelta_, + -this.maxDelta_ * this.deltaPerZoom_, + this.maxDelta_ * this.deltaPerZoom_ + ) / this.deltaPerZoom_; + (t.getConstrainResolution() || this.constrainResolution_) && (i = i ? i > 0 ? 1 : -1 : 0), Hg( + t, + i, + this.lastAnchor_ ? e.getCoordinateFromPixel(this.lastAnchor_) : null, + this.duration_ + ), this.mode_ = void 0, this.totalDelta_ = 0, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_ = void 0; + } + /** + * Enable or disable using the mouse's location as an anchor when zooming + * @param {boolean} useAnchor true to zoom to the mouse's location, false + * to zoom to the center of the map + * @api + */ + setMouseAnchor(e) { + this.useAnchor_ = e, e || (this.lastAnchor_ = null); + } +} +class Ux extends Wi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}; + const t = ( + /** @type {import("./Pointer.js").Options} */ + e + ); + t.stopDown || (t.stopDown = is), super(t), this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.threshold_ = e.threshold !== void 0 ? e.threshold : 0.3, this.duration_ = e.duration !== void 0 ? e.duration : 250; + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @override + */ + handleDragEvent(e) { + let t = 0; + const i = this.targetPointers[0], r = this.targetPointers[1], s = Math.atan2( + r.clientY - i.clientY, + r.clientX - i.clientX + ); + if (this.lastAngle_ !== void 0) { + const l = s - this.lastAngle_; + this.rotationDelta_ += l, !this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_ && (this.rotating_ = !0), t = l; + } + this.lastAngle_ = s; + const o = e.map, a = o.getView(); + a.getConstraints().rotation !== Pg && (this.anchor_ = o.getCoordinateFromPixelInternal( + o.getEventPixel(Xg(this.targetPointers)) + ), this.rotating_ && (o.render(), a.adjustRotationInternal(t, this.anchor_))); + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleUpEvent(e) { + return this.targetPointers.length < 2 ? (e.map.getView().endInteraction(this.duration_), !1) : !0; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleDownEvent(e) { + if (this.targetPointers.length >= 2) { + const t = e.map; + return this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.handlingDownUpSequence || t.getView().beginInteraction(), !0; + } + return !1; + } +} +class Yx extends Wi { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}; + const t = ( + /** @type {import("./Pointer.js").Options} */ + e + ); + t.stopDown || (t.stopDown = is), super(t), this.anchor_ = null, this.duration_ = e.duration !== void 0 ? e.duration : 400, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1; + } + /** + * Handle pointer drag events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @override + */ + handleDragEvent(e) { + let t = 1; + const i = this.targetPointers[0], r = this.targetPointers[1], s = i.clientX - r.clientX, o = i.clientY - r.clientY, a = Math.sqrt(s * s + o * o); + this.lastDistance_ !== void 0 && (t = this.lastDistance_ / a), this.lastDistance_ = a; + const l = e.map, A = l.getView(); + t != 1 && (this.lastScaleDelta_ = t), this.anchor_ = l.getCoordinateFromPixelInternal( + l.getEventPixel(Xg(this.targetPointers)) + ), l.render(), A.adjustResolutionInternal(t, this.anchor_); + } + /** + * Handle pointer up events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleUpEvent(e) { + if (this.targetPointers.length < 2) { + const i = e.map.getView(), r = this.lastScaleDelta_ > 1 ? 1 : -1; + return i.endInteraction(this.duration_, r), !1; + } + return !0; + } + /** + * Handle pointer down events. + * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. + * @return {boolean} If the event was consumed. + * @override + */ + handleDownEvent(e) { + if (this.targetPointers.length >= 2) { + const t = e.map; + return this.anchor_ = null, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1, this.handlingDownUpSequence || t.getView().beginInteraction(), !0; + } + return !1; + } +} +function zx(n) { + n = n || {}; + const e = new wt(), t = new ew(-5e-3, 0.05, 100); + return (n.altShiftDragRotate !== void 0 ? n.altShiftDragRotate : !0) && e.push(new Px()), (n.doubleClickZoom !== void 0 ? n.doubleClickZoom : !0) && e.push( + new vx({ + delta: n.zoomDelta, + duration: n.zoomDuration + }) + ), (n.dragPan !== void 0 ? n.dragPan : !0) && e.push( + new bx({ + onFocusOnly: n.onFocusOnly, + kinetic: t + }) + ), (n.pinchRotate !== void 0 ? n.pinchRotate : !0) && e.push(new Ux()), (n.pinchZoom !== void 0 ? n.pinchZoom : !0) && e.push( + new Yx({ + duration: n.zoomDuration + }) + ), (n.keyboard !== void 0 ? n.keyboard : !0) && (e.push(new Gx()), e.push( + new kx({ + delta: n.zoomDelta, + duration: n.zoomDuration + }) + )), (n.mouseWheelZoom !== void 0 ? n.mouseWheelZoom : !0) && e.push( + new $x({ + onFocusOnly: n.onFocusOnly, + duration: n.zoomDuration + }) + ), (n.shiftDragZoom !== void 0 ? n.shiftDragZoom : !0) && e.push( + new Ox({ + duration: n.zoomDuration + }) + ), e; +} +function m_(n) { + if (n instanceof Qo) { + n.setMapInternal(null); + return; + } + n instanceof Lo && n.getLayers().forEach(m_); +} +function E_(n, e) { + if (n instanceof Qo) { + n.setMapInternal(e); + return; + } + if (n instanceof Lo) { + const t = n.getLayers().getArray(); + for (let i = 0, r = t.length; i < r; ++i) + E_(t[i], e); + } +} +let Vx = class extends Oi { + /** + * @param {MapOptions} [options] Map options. + */ + constructor(e) { + super(), e = e || {}, this.on, this.once, this.un; + const t = Hx(e); + this.renderComplete_ = !1, this.loaded_ = !0, this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this), this.maxTilesLoading_ = e.maxTilesLoading !== void 0 ? e.maxTilesLoading : 16, this.pixelRatio_ = e.pixelRatio !== void 0 ? e.pixelRatio : lg, this.postRenderTimeoutHandle_, this.animationDelayKey_, this.animationDelay_ = this.animationDelay_.bind(this), this.coordinateToPixelTransform_ = Fe(), this.pixelToCoordinateTransform_ = Fe(), this.frameIndex_ = 0, this.frameState_ = null, this.previousExtent_ = null, this.viewPropertyListenerKey_ = null, this.viewChangeListenerKey_ = null, this.layerGroupPropertyListenerKeys_ = null, this.viewport_ = document.createElement("div"), this.viewport_.className = "ol-viewport" + ("ontouchstart" in window ? " ol-touch" : ""), this.viewport_.style.position = "relative", this.viewport_.style.overflow = "hidden", this.viewport_.style.width = "100%", this.viewport_.style.height = "100%", this.overlayContainer_ = document.createElement("div"), this.overlayContainer_.style.position = "absolute", this.overlayContainer_.style.zIndex = "0", this.overlayContainer_.style.width = "100%", this.overlayContainer_.style.height = "100%", this.overlayContainer_.style.pointerEvents = "none", this.overlayContainer_.className = "ol-overlaycontainer", this.viewport_.appendChild(this.overlayContainer_), this.overlayContainerStopEvent_ = document.createElement("div"), this.overlayContainerStopEvent_.style.position = "absolute", this.overlayContainerStopEvent_.style.zIndex = "0", this.overlayContainerStopEvent_.style.width = "100%", this.overlayContainerStopEvent_.style.height = "100%", this.overlayContainerStopEvent_.style.pointerEvents = "none", this.overlayContainerStopEvent_.className = "ol-overlaycontainer-stopevent", this.viewport_.appendChild(this.overlayContainerStopEvent_), this.mapBrowserEventHandler_ = null, this.moveTolerance_ = e.moveTolerance, this.keyboardEventTarget_ = t.keyboardEventTarget, this.targetChangeHandlerKeys_ = null, this.targetElement_ = null, this.resizeObserver_ = new ResizeObserver(() => this.updateSize()), this.controls = t.controls || Rx(), this.interactions = t.interactions || zx({ + onFocusOnly: !0 + }), this.overlays_ = t.overlays, this.overlayIdIndex_ = {}, this.renderer_ = null, this.postRenderFunctions_ = [], this.tileQueue_ = new c_( + this.getTilePriority.bind(this), + this.handleTileChange_.bind(this) + ), this.addChangeListener( + ut.LAYERGROUP, + this.handleLayerGroupChanged_ + ), this.addChangeListener(ut.VIEW, this.handleViewChanged_), this.addChangeListener(ut.SIZE, this.handleSizeChanged_), this.addChangeListener(ut.TARGET, this.handleTargetChanged_), this.setProperties(t.values); + const i = this; + e.view && !(e.view instanceof an) && e.view.then(function(r) { + i.setView(new an(r)); + }), this.controls.addEventListener( + ct.ADD, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent + */ + (r) => { + r.element.setMap(this); + } + ), this.controls.addEventListener( + ct.REMOVE, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. + */ + (r) => { + r.element.setMap(null); + } + ), this.interactions.addEventListener( + ct.ADD, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. + */ + (r) => { + r.element.setMap(this); + } + ), this.interactions.addEventListener( + ct.REMOVE, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. + */ + (r) => { + r.element.setMap(null); + } + ), this.overlays_.addEventListener( + ct.ADD, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. + */ + (r) => { + this.addOverlayInternal_(r.element); + } + ), this.overlays_.addEventListener( + ct.REMOVE, + /** + * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. + */ + (r) => { + const s = r.element.getId(); + s !== void 0 && delete this.overlayIdIndex_[s.toString()], r.element.setMap(null); + } + ), this.controls.forEach( + /** + * @param {import("./control/Control.js").default} control Control. + */ + (r) => { + r.setMap(this); + } + ), this.interactions.forEach( + /** + * @param {import("./interaction/Interaction.js").default} interaction Interaction. + */ + (r) => { + r.setMap(this); + } + ), this.overlays_.forEach(this.addOverlayInternal_.bind(this)); + } + /** + * Add the given control to the map. + * @param {import("./control/Control.js").default} control Control. + * @api + */ + addControl(e) { + this.getControls().push(e); + } + /** + * Add the given interaction to the map. If you want to add an interaction + * at another point of the collection use `getInteractions()` and the methods + * available on {@link module:ol/Collection~Collection}. This can be used to + * stop the event propagation from the handleEvent function. The interactions + * get to handle the events in the reverse order of this collection. + * @param {import("./interaction/Interaction.js").default} interaction Interaction to add. + * @api + */ + addInteraction(e) { + this.getInteractions().push(e); + } + /** + * Adds the given layer to the top of this map. If you want to add a layer + * elsewhere in the stack, use `getLayers()` and the methods available on + * {@link module:ol/Collection~Collection}. + * @param {import("./layer/Base.js").default} layer Layer. + * @api + */ + addLayer(e) { + this.getLayerGroup().getLayers().push(e); + } + /** + * @param {import("./layer/Group.js").GroupEvent} event The layer add event. + * @private + */ + handleLayerAdd_(e) { + E_(e.layer, this); + } + /** + * Add the given overlay to the map. + * @param {import("./Overlay.js").default} overlay Overlay. + * @api + */ + addOverlay(e) { + this.getOverlays().push(e); + } + /** + * This deals with map's overlay collection changes. + * @param {import("./Overlay.js").default} overlay Overlay. + * @private + */ + addOverlayInternal_(e) { + const t = e.getId(); + t !== void 0 && (this.overlayIdIndex_[t.toString()] = e), e.setMap(this); + } + /** + * + * Clean up. + * @override + */ + disposeInternal() { + this.controls.clear(), this.interactions.clear(), this.overlays_.clear(), this.resizeObserver_.disconnect(), this.setTarget(null), super.disposeInternal(); + } + /** + * Detect features that intersect a pixel on the viewport, and execute a + * callback with each intersecting feature. Layers included in the detection can + * be configured through the `layerFilter` option in `options`. + * @param {import("./pixel.js").Pixel} pixel Pixel. + * @param {function(import("./Feature.js").FeatureLike, import("./layer/Layer.js").default, import("./geom/SimpleGeometry.js").default): T} callback Feature callback. The callback will be + * called with two arguments. The first argument is one + * {@link module:ol/Feature~Feature feature} or + * {@link module:ol/render/Feature~RenderFeature render feature} at the pixel, the second is + * the {@link module:ol/layer/Layer~Layer layer} of the feature and will be null for + * unmanaged layers. To stop detection, callback functions can return a + * truthy value. + * @param {AtPixelOptions} [options] Optional options. + * @return {T|undefined} Callback result, i.e. the return value of last + * callback execution, or the first truthy callback return value. + * @template T + * @api + */ + forEachFeatureAtPixel(e, t, i) { + if (!this.frameState_ || !this.renderer_) + return; + const r = this.getCoordinateFromPixelInternal(e); + i = i !== void 0 ? i : {}; + const s = i.hitTolerance !== void 0 ? i.hitTolerance : 0, o = i.layerFilter !== void 0 ? i.layerFilter : bi, a = i.checkWrapped !== !1; + return this.renderer_.forEachFeatureAtCoordinate( + r, + this.frameState_, + s, + a, + t, + null, + o, + null + ); + } + /** + * Get all features that intersect a pixel on the viewport. + * @param {import("./pixel.js").Pixel} pixel Pixel. + * @param {AtPixelOptions} [options] Optional options. + * @return {Array} The detected features or + * an empty array if none were found. + * @api + */ + getFeaturesAtPixel(e, t) { + const i = []; + return this.forEachFeatureAtPixel( + e, + function(r) { + i.push(r); + }, + t + ), i; + } + /** + * Get all layers from all layer groups. + * @return {Array} Layers. + * @api + */ + getAllLayers() { + const e = []; + function t(i) { + i.forEach(function(r) { + r instanceof Lo ? t(r.getLayers()) : e.push(r); + }); + } + return t(this.getLayers()), e; + } + /** + * Detect if features intersect a pixel on the viewport. Layers included in the + * detection can be configured through the `layerFilter` option. + * @param {import("./pixel.js").Pixel} pixel Pixel. + * @param {AtPixelOptions} [options] Optional options. + * @return {boolean} Is there a feature at the given pixel? + * @api + */ + hasFeatureAtPixel(e, t) { + if (!this.frameState_ || !this.renderer_) + return !1; + const i = this.getCoordinateFromPixelInternal(e); + t = t !== void 0 ? t : {}; + const r = t.layerFilter !== void 0 ? t.layerFilter : bi, s = t.hitTolerance !== void 0 ? t.hitTolerance : 0, o = t.checkWrapped !== !1; + return this.renderer_.hasFeatureAtCoordinate( + i, + this.frameState_, + s, + o, + r, + null + ); + } + /** + * Returns the coordinate in user projection for a browser event. + * @param {MouseEvent} event Event. + * @return {import("./coordinate.js").Coordinate} Coordinate. + * @api + */ + getEventCoordinate(e) { + return this.getCoordinateFromPixel(this.getEventPixel(e)); + } + /** + * Returns the coordinate in view projection for a browser event. + * @param {MouseEvent} event Event. + * @return {import("./coordinate.js").Coordinate} Coordinate. + */ + getEventCoordinateInternal(e) { + return this.getCoordinateFromPixelInternal(this.getEventPixel(e)); + } + /** + * Returns the map pixel position for a browser event relative to the viewport. + * @param {UIEvent|{clientX: number, clientY: number}} event Event. + * @return {import("./pixel.js").Pixel} Pixel. + * @api + */ + getEventPixel(e) { + const i = this.viewport_.getBoundingClientRect(), r = this.getSize(), s = i.width / r[0], o = i.height / r[1], a = ( + //FIXME Are we really calling this with a TouchEvent anywhere? + "changedTouches" in e ? ( + /** @type {TouchEvent} */ + e.changedTouches[0] + ) : ( + /** @type {MouseEvent} */ + e + ) + ); + return [ + (a.clientX - i.left) / s, + (a.clientY - i.top) / o + ]; + } + /** + * Get the target in which this map is rendered. + * Note that this returns what is entered as an option or in setTarget: + * if that was an element, it returns an element; if a string, it returns that. + * @return {HTMLElement|string|undefined} The Element or id of the Element that the + * map is rendered in. + * @observable + * @api + */ + getTarget() { + return ( + /** @type {HTMLElement|string|undefined} */ + this.get(ut.TARGET) + ); + } + /** + * Get the DOM element into which this map is rendered. In contrast to + * `getTarget` this method always return an `Element`, or `null` if the + * map has no target. + * @return {HTMLElement} The element that the map is rendered in. + * @api + */ + getTargetElement() { + return this.targetElement_; + } + /** + * Get the coordinate for a given pixel. This returns a coordinate in the + * user projection. + * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport. + * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position. + * @api + */ + getCoordinateFromPixel(e) { + return pr( + this.getCoordinateFromPixelInternal(e), + this.getView().getProjection() + ); + } + /** + * Get the coordinate for a given pixel. This returns a coordinate in the + * map view projection. + * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport. + * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position. + */ + getCoordinateFromPixelInternal(e) { + const t = this.frameState_; + return t ? Pe(t.pixelToCoordinateTransform, e.slice()) : null; + } + /** + * Get the map controls. Modifying this collection changes the controls + * associated with the map. + * @return {Collection} Controls. + * @api + */ + getControls() { + return this.controls; + } + /** + * Get the map overlays. Modifying this collection changes the overlays + * associated with the map. + * @return {Collection} Overlays. + * @api + */ + getOverlays() { + return this.overlays_; + } + /** + * Get an overlay by its identifier (the value returned by overlay.getId()). + * Note that the index treats string and numeric identifiers as the same. So + * `map.getOverlayById(2)` will return an overlay with id `'2'` or `2`. + * @param {string|number} id Overlay identifier. + * @return {import("./Overlay.js").default|null} Overlay. + * @api + */ + getOverlayById(e) { + const t = this.overlayIdIndex_[e.toString()]; + return t !== void 0 ? t : null; + } + /** + * Get the map interactions. Modifying this collection changes the interactions + * associated with the map. + * + * Interactions are used for e.g. pan, zoom and rotate. + * @return {Collection} Interactions. + * @api + */ + getInteractions() { + return this.interactions; + } + /** + * Get the layergroup associated with this map. + * @return {LayerGroup} A layer group containing the layers in this map. + * @observable + * @api + */ + getLayerGroup() { + return ( + /** @type {LayerGroup} */ + this.get(ut.LAYERGROUP) + ); + } + /** + * Clear any existing layers and add layers to the map. + * @param {Array|Collection} layers The layers to be added to the map. + * @api + */ + setLayers(e) { + const t = this.getLayerGroup(); + if (e instanceof wt) { + t.setLayers(e); + return; + } + const i = t.getLayers(); + i.clear(), i.extend(e); + } + /** + * Get the collection of layers associated with this map. + * @return {!Collection} Layers. + * @api + */ + getLayers() { + return this.getLayerGroup().getLayers(); + } + /** + * @return {boolean} Layers have sources that are still loading. + */ + getLoadingOrNotReady() { + const e = this.getLayerGroup().getLayerStatesArray(); + for (let t = 0, i = e.length; t < i; ++t) { + const r = e[t]; + if (!r.visible) + continue; + const s = r.layer.getRenderer(); + if (s && !s.ready) + return !0; + const o = r.layer.getSource(); + if (o && o.loading) + return !0; + } + return !1; + } + /** + * Get the pixel for a coordinate. This takes a coordinate in the user + * projection and returns the corresponding pixel. + * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate. + * @return {import("./pixel.js").Pixel} A pixel position in the map viewport. + * @api + */ + getPixelFromCoordinate(e) { + const t = Ue( + e, + this.getView().getProjection() + ); + return this.getPixelFromCoordinateInternal(t); + } + /** + * Get the pixel for a coordinate. This takes a coordinate in the map view + * projection and returns the corresponding pixel. + * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate. + * @return {import("./pixel.js").Pixel} A pixel position in the map viewport. + */ + getPixelFromCoordinateInternal(e) { + const t = this.frameState_; + return t ? Pe( + t.coordinateToPixelTransform, + e.slice(0, 2) + ) : null; + } + /** + * Get the map renderer. + * @return {import("./renderer/Map.js").default|null} Renderer + */ + getRenderer() { + return this.renderer_; + } + /** + * Get the size of this map. + * @return {import("./size.js").Size|undefined} The size in pixels of the map in the DOM. + * @observable + * @api + */ + getSize() { + return ( + /** @type {import("./size.js").Size|undefined} */ + this.get(ut.SIZE) + ); + } + /** + * Get the view associated with this map. A view manages properties such as + * center and resolution. + * @return {View} The view that controls this map. + * @observable + * @api + */ + getView() { + return ( + /** @type {View} */ + this.get(ut.VIEW) + ); + } + /** + * Get the element that serves as the map viewport. + * @return {HTMLElement} Viewport. + * @api + */ + getViewport() { + return this.viewport_; + } + /** + * Get the element that serves as the container for overlays. Elements added to + * this container will let mousedown and touchstart events through to the map, + * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent} + * events. + * @return {!HTMLElement} The map's overlay container. + */ + getOverlayContainer() { + return this.overlayContainer_; + } + /** + * Get the element that serves as a container for overlays that don't allow + * event propagation. Elements added to this container won't let mousedown and + * touchstart events through to the map, so clicks and gestures on an overlay + * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}. + * @return {!HTMLElement} The map's overlay container that stops events. + */ + getOverlayContainerStopEvent() { + return this.overlayContainerStopEvent_; + } + /** + * @return {!Document} The document where the map is displayed. + */ + getOwnerDocument() { + const e = this.getTargetElement(); + return e ? e.ownerDocument : document; + } + /** + * @param {import("./Tile.js").default} tile Tile. + * @param {string} tileSourceKey Tile source key. + * @param {import("./coordinate.js").Coordinate} tileCenter Tile center. + * @param {number} tileResolution Tile resolution. + * @return {number} Tile priority. + */ + getTilePriority(e, t, i, r) { + return wx( + this.frameState_, + e, + t, + i, + r + ); + } + /** + * @param {UIEvent} browserEvent Browser event. + * @param {string} [type] Type. + */ + handleBrowserEvent(e, t) { + t = t || e.type; + const i = new Pn(t, this, e); + this.handleMapBrowserEvent(i); + } + /** + * @param {MapBrowserEvent} mapBrowserEvent The event to handle. + */ + handleMapBrowserEvent(e) { + if (!this.frameState_) + return; + const t = ( + /** @type {PointerEvent} */ + e.originalEvent + ), i = t.type; + if (i === ln.POINTERDOWN || i === j.WHEEL || i === j.KEYDOWN) { + const r = this.getOwnerDocument(), s = this.viewport_.getRootNode ? this.viewport_.getRootNode() : r, o = ( + /** @type {Node} */ + t.target + ), a = s instanceof ShadowRoot ? s.host === o ? s.host.ownerDocument : s : s === r ? r.documentElement : s; + if ( + // Abort if the target is a child of the container for elements whose events are not meant + // to be handled by map interactions. + this.overlayContainerStopEvent_.contains(o) || // Abort if the event target is a child of the container that is no longer in the page. + // It's possible for the target to no longer be in the page if it has been removed in an + // event listener, this might happen in a Control that recreates it's content based on + // user interaction either manually or via a render in something like https://reactjs.org/ + !a.contains(o) + ) + return; + } + if (e.frameState = this.frameState_, this.dispatchEvent(e) !== !1) { + const r = this.getInteractions().getArray().slice(); + for (let s = r.length - 1; s >= 0; s--) { + const o = r[s]; + if (o.getMap() !== this || !o.getActive() || !this.getTargetElement()) + continue; + if (!o.handleEvent(e) || e.propagationStopped) + break; + } + } + } + /** + * @protected + */ + handlePostRender() { + const e = this.frameState_, t = this.tileQueue_; + if (!t.isEmpty()) { + let r = this.maxTilesLoading_, s = r; + if (e) { + const o = e.viewHints; + if (o[Me.ANIMATING] || o[Me.INTERACTING]) { + const a = Date.now() - e.time > 8; + r = a ? 0 : 8, s = a ? 0 : 2; + } + } + t.getTilesLoading() < r && (t.reprioritize(), t.loadMoreTiles(r, s)); + } + e && this.renderer_ && !e.animate && (this.renderComplete_ ? (this.hasListener(yt.RENDERCOMPLETE) && this.renderer_.dispatchRenderEvent( + yt.RENDERCOMPLETE, + e + ), this.loaded_ === !1 && (this.loaded_ = !0, this.dispatchEvent( + new Ms(Ui.LOADEND, this, e) + ))) : this.loaded_ === !0 && (this.loaded_ = !1, this.dispatchEvent( + new Ms(Ui.LOADSTART, this, e) + ))); + const i = this.postRenderFunctions_; + for (let r = 0, s = i.length; r < s; ++r) + i[r](this, e); + i.length = 0; + } + /** + * @private + */ + handleSizeChanged_() { + this.getView() && !this.getView().getAnimating() && this.getView().resolveConstraints(0), this.render(); + } + /** + * @private + */ + handleTargetChanged_() { + if (this.mapBrowserEventHandler_) { + for (let i = 0, r = this.targetChangeHandlerKeys_.length; i < r; ++i) + Re(this.targetChangeHandlerKeys_[i]); + this.targetChangeHandlerKeys_ = null, this.viewport_.removeEventListener( + j.CONTEXTMENU, + this.boundHandleBrowserEvent_ + ), this.viewport_.removeEventListener( + j.WHEEL, + this.boundHandleBrowserEvent_ + ), this.mapBrowserEventHandler_.dispose(), this.mapBrowserEventHandler_ = null, this.viewport_.remove(); + } + if (this.targetElement_) { + this.resizeObserver_.unobserve(this.targetElement_); + const i = this.targetElement_.getRootNode(); + i instanceof ShadowRoot && this.resizeObserver_.unobserve(i.host), this.setSize(void 0); + } + const e = this.getTarget(), t = typeof e == "string" ? document.getElementById(e) : e; + if (this.targetElement_ = t, !t) + this.renderer_ && (clearTimeout(this.postRenderTimeoutHandle_), this.postRenderTimeoutHandle_ = void 0, this.postRenderFunctions_.length = 0, this.renderer_.dispose(), this.renderer_ = null), this.animationDelayKey_ && (cancelAnimationFrame(this.animationDelayKey_), this.animationDelayKey_ = void 0); + else { + t.appendChild(this.viewport_), this.renderer_ || (this.renderer_ = new Ix(this)), this.mapBrowserEventHandler_ = new Cx( + this, + this.moveTolerance_ + ); + for (const s in _e) + this.mapBrowserEventHandler_.addEventListener( + _e[s], + this.handleMapBrowserEvent.bind(this) + ); + this.viewport_.addEventListener( + j.CONTEXTMENU, + this.boundHandleBrowserEvent_, + !1 + ), this.viewport_.addEventListener( + j.WHEEL, + this.boundHandleBrowserEvent_, + yp ? { passive: !1 } : !1 + ); + let i; + if (this.keyboardEventTarget_) + i = this.keyboardEventTarget_; + else { + const s = t.getRootNode(); + i = s instanceof ShadowRoot ? s.host : t; + } + this.targetChangeHandlerKeys_ = [ + ie( + i, + j.KEYDOWN, + this.handleBrowserEvent, + this + ), + ie( + i, + j.KEYPRESS, + this.handleBrowserEvent, + this + ) + ]; + const r = t.getRootNode(); + r instanceof ShadowRoot && this.resizeObserver_.observe(r.host), this.resizeObserver_.observe(t); + } + this.updateSize(); + } + /** + * @private + */ + handleTileChange_() { + this.render(); + } + /** + * @private + */ + handleViewPropertyChanged_() { + this.render(); + } + /** + * @private + */ + handleViewChanged_() { + this.viewPropertyListenerKey_ && (Re(this.viewPropertyListenerKey_), this.viewPropertyListenerKey_ = null), this.viewChangeListenerKey_ && (Re(this.viewChangeListenerKey_), this.viewChangeListenerKey_ = null); + const e = this.getView(); + e && (this.updateViewportSize_(this.getSize()), this.viewPropertyListenerKey_ = ie( + e, + Yr.PROPERTYCHANGE, + this.handleViewPropertyChanged_, + this + ), this.viewChangeListenerKey_ = ie( + e, + j.CHANGE, + this.handleViewPropertyChanged_, + this + ), e.resolveConstraints(0)), this.render(); + } + /** + * @private + */ + handleLayerGroupChanged_() { + this.layerGroupPropertyListenerKeys_ && (this.layerGroupPropertyListenerKeys_.forEach(Re), this.layerGroupPropertyListenerKeys_ = null); + const e = this.getLayerGroup(); + e && (this.handleLayerAdd_(new or("addlayer", e)), this.layerGroupPropertyListenerKeys_ = [ + ie(e, Yr.PROPERTYCHANGE, this.render, this), + ie(e, j.CHANGE, this.render, this), + ie(e, "addlayer", this.handleLayerAdd_, this), + ie(e, "removelayer", this.handleLayerRemove_, this) + ]), this.render(); + } + /** + * @return {boolean} Is rendered. + */ + isRendered() { + return !!this.frameState_; + } + /** + * @private + */ + animationDelay_() { + this.animationDelayKey_ = void 0, this.renderFrame_(Date.now()); + } + /** + * Requests an immediate render in a synchronous manner. + * @api + */ + renderSync() { + this.animationDelayKey_ && cancelAnimationFrame(this.animationDelayKey_), this.animationDelay_(); + } + /** + * Redraws all text after new fonts have loaded + */ + redrawText() { + const e = this.getLayerGroup().getLayerStatesArray(); + for (let t = 0, i = e.length; t < i; ++t) { + const r = e[t].layer; + r.hasRenderer() && r.getRenderer().handleFontsChanged(); + } + } + /** + * Request a map rendering (at the next animation frame). + * @api + */ + render() { + this.renderer_ && this.animationDelayKey_ === void 0 && (this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_)); + } + /** + * Remove the given control from the map. + * @param {import("./control/Control.js").default} control Control. + * @return {import("./control/Control.js").default|undefined} The removed control (or undefined + * if the control was not found). + * @api + */ + removeControl(e) { + return this.getControls().remove(e); + } + /** + * Remove the given interaction from the map. + * @param {import("./interaction/Interaction.js").default} interaction Interaction to remove. + * @return {import("./interaction/Interaction.js").default|undefined} The removed interaction (or + * undefined if the interaction was not found). + * @api + */ + removeInteraction(e) { + return this.getInteractions().remove(e); + } + /** + * Removes the given layer from the map. + * @param {import("./layer/Base.js").default} layer Layer. + * @return {import("./layer/Base.js").default|undefined} The removed layer (or undefined if the + * layer was not found). + * @api + */ + removeLayer(e) { + return this.getLayerGroup().getLayers().remove(e); + } + /** + * @param {import("./layer/Group.js").GroupEvent} event The layer remove event. + * @private + */ + handleLayerRemove_(e) { + m_(e.layer); + } + /** + * Remove the given overlay from the map. + * @param {import("./Overlay.js").default} overlay Overlay. + * @return {import("./Overlay.js").default|undefined} The removed overlay (or undefined + * if the overlay was not found). + * @api + */ + removeOverlay(e) { + return this.getOverlays().remove(e); + } + /** + * @param {number} time Time. + * @private + */ + renderFrame_(e) { + const t = this.getSize(), i = this.getView(), r = this.frameState_; + let s = null; + if (t !== void 0 && Pf(t) && i && i.isDef()) { + const o = i.getHints( + this.frameState_ ? this.frameState_.viewHints : void 0 + ), a = i.getState(); + if (s = { + animate: !1, + coordinateToPixelTransform: this.coordinateToPixelTransform_, + declutter: null, + extent: va( + a.center, + a.resolution, + a.rotation, + t + ), + index: this.frameIndex_++, + layerIndex: 0, + layerStatesArray: this.getLayerGroup().getLayerStatesArray(), + pixelRatio: this.pixelRatio_, + pixelToCoordinateTransform: this.pixelToCoordinateTransform_, + postRenderFunctions: [], + size: t, + tileQueue: this.tileQueue_, + time: e, + usedTiles: {}, + viewState: a, + viewHints: o, + wantedTiles: {}, + mapId: X(this), + renderTargets: {} + }, a.nextCenter && a.nextResolution) { + const l = isNaN(a.nextRotation) ? a.rotation : a.nextRotation; + s.nextExtent = va( + a.nextCenter, + a.nextResolution, + l, + t + ); + } + } + this.frameState_ = s, this.renderer_.renderFrame(s), s && (s.animate && this.render(), Array.prototype.push.apply( + this.postRenderFunctions_, + s.postRenderFunctions + ), r && (!this.previousExtent_ || !wn(this.previousExtent_) && !Ci(s.extent, this.previousExtent_)) && (this.dispatchEvent( + new Ms(Ui.MOVESTART, this, r) + ), this.previousExtent_ = wr(this.previousExtent_)), this.previousExtent_ && !s.viewHints[Me.ANIMATING] && !s.viewHints[Me.INTERACTING] && !Ci(s.extent, this.previousExtent_) && (this.dispatchEvent( + new Ms(Ui.MOVEEND, this, s) + ), Bp(s.extent, this.previousExtent_))), this.dispatchEvent(new Ms(Ui.POSTRENDER, this, s)), this.renderComplete_ = (this.hasListener(Ui.LOADSTART) || this.hasListener(Ui.LOADEND) || this.hasListener(yt.RENDERCOMPLETE)) && !this.tileQueue_.getTilesLoading() && !this.tileQueue_.getCount() && !this.getLoadingOrNotReady(), this.postRenderTimeoutHandle_ || (this.postRenderTimeoutHandle_ = setTimeout(() => { + this.postRenderTimeoutHandle_ = void 0, this.handlePostRender(); + }, 0)); + } + /** + * Sets the layergroup of this map. + * @param {LayerGroup} layerGroup A layer group containing the layers in this map. + * @observable + * @api + */ + setLayerGroup(e) { + const t = this.getLayerGroup(); + t && this.handleLayerRemove_(new or("removelayer", t)), this.set(ut.LAYERGROUP, e); + } + /** + * Set the size of this map. + * @param {import("./size.js").Size|undefined} size The size in pixels of the map in the DOM. + * @observable + * @api + */ + setSize(e) { + this.set(ut.SIZE, e); + } + /** + * Set the target element to render this map into. + * For accessibility (focus and keyboard events for map navigation), the `target` element must have a + * properly configured `tabindex` attribute. If the `target` element is inside a Shadow DOM, the + * `tabindex` atribute must be set on the custom element's host element. + * @param {HTMLElement|string} [target] The Element or id of the Element + * that the map is rendered in. + * @observable + * @api + */ + setTarget(e) { + this.set(ut.TARGET, e); + } + /** + * Set the view for this map. + * @param {View|Promise} view The view that controls this map. + * It is also possible to pass a promise that resolves to options for constructing a view. This + * alternative allows view properties to be resolved by sources or other components that load + * view-related metadata. + * @observable + * @api + */ + setView(e) { + if (!e || e instanceof an) { + this.set(ut.VIEW, e); + return; + } + this.set(ut.VIEW, new an()); + const t = this; + e.then(function(i) { + t.setView(new an(i)); + }); + } + /** + * Force a recalculation of the map viewport size. This should be called when + * third-party code changes the size of the map viewport. + * @api + */ + updateSize() { + const e = this.getTargetElement(); + let t; + if (e) { + const r = getComputedStyle(e), s = e.offsetWidth - parseFloat(r.borderLeftWidth) - parseFloat(r.paddingLeft) - parseFloat(r.paddingRight) - parseFloat(r.borderRightWidth), o = e.offsetHeight - parseFloat(r.borderTopWidth) - parseFloat(r.paddingTop) - parseFloat(r.paddingBottom) - parseFloat(r.borderBottomWidth); + !isNaN(s) && !isNaN(o) && (t = [Math.max(0, s), Math.max(0, o)], !Pf(t) && (e.offsetWidth || e.offsetHeight || e.getClientRects().length) && bp( + "No map visible because the map container's width or height are 0." + )); + } + const i = this.getSize(); + t && (!i || !yn(t, i)) && (this.setSize(t), this.updateViewportSize_(t)); + } + /** + * Recomputes the viewport size and save it on the view object (if any) + * @param {import("./size.js").Size|undefined} size The size. + * @private + */ + updateViewportSize_(e) { + const t = this.getView(); + t && t.setViewportSize(e); + } +}; +function Hx(n) { + let e = null; + n.keyboardEventTarget !== void 0 && (e = typeof n.keyboardEventTarget == "string" ? document.getElementById(n.keyboardEventTarget) : n.keyboardEventTarget); + const t = {}, i = n.layers && typeof /** @type {?} */ + n.layers.getLayers == "function" ? ( + /** @type {LayerGroup} */ + n.layers + ) : new Lo({ + layers: ( + /** @type {Collection|Array} */ + n.layers + ) + }); + t[ut.LAYERGROUP] = i, t[ut.TARGET] = n.target, t[ut.VIEW] = n.view instanceof an ? n.view : new an(); + let r; + n.controls !== void 0 && (Array.isArray(n.controls) ? r = new wt(n.controls.slice()) : (Ie( + typeof /** @type {?} */ + n.controls.getArray == "function", + "Expected `controls` to be an array or an `ol/Collection.js`" + ), r = n.controls)); + let s; + n.interactions !== void 0 && (Array.isArray(n.interactions) ? s = new wt(n.interactions.slice()) : (Ie( + typeof /** @type {?} */ + n.interactions.getArray == "function", + "Expected `interactions` to be an array or an `ol/Collection.js`" + ), s = n.interactions)); + let o; + return n.overlays !== void 0 ? Array.isArray(n.overlays) ? o = new wt(n.overlays.slice()) : (Ie( + typeof /** @type {?} */ + n.overlays.getArray == "function", + "Expected `overlays` to be an array or an `ol/Collection.js`" + ), o = n.overlays) : o = new wt(), { + controls: r, + interactions: s, + keyboardEventTarget: e, + overlays: o, + values: t + }; +} +const $t = { + ELEMENT: "element", + MAP: "map", + OFFSET: "offset", + POSITION: "position", + POSITIONING: "positioning" +}; +class Xx extends Oi { + /** + * @param {Options} options Overlay options. + */ + constructor(e) { + super(), this.on, this.once, this.un, this.options = e, this.id = e.id, this.insertFirst = e.insertFirst !== void 0 ? e.insertFirst : !0, this.stopEvent = e.stopEvent !== void 0 ? e.stopEvent : !0, this.element = document.createElement("div"), this.element.className = e.className !== void 0 ? e.className : "ol-overlay-container " + Bw, this.element.style.position = "absolute", this.element.style.pointerEvents = "auto", this.autoPan = e.autoPan === !0 ? {} : e.autoPan || void 0, this.rendered = { + transform_: "", + visible: !0 + }, this.mapPostrenderListenerKey = null, this.addChangeListener($t.ELEMENT, this.handleElementChanged), this.addChangeListener($t.MAP, this.handleMapChanged), this.addChangeListener($t.OFFSET, this.handleOffsetChanged), this.addChangeListener($t.POSITION, this.handlePositionChanged), this.addChangeListener($t.POSITIONING, this.handlePositioningChanged), e.element !== void 0 && this.setElement(e.element), this.setOffset(e.offset !== void 0 ? e.offset : [0, 0]), this.setPositioning(e.positioning || "top-left"), e.position !== void 0 && this.setPosition(e.position); + } + /** + * Get the DOM element of this overlay. + * @return {HTMLElement|undefined} The Element containing the overlay. + * @observable + * @api + */ + getElement() { + return ( + /** @type {HTMLElement|undefined} */ + this.get($t.ELEMENT) + ); + } + /** + * Get the overlay identifier which is set on constructor. + * @return {number|string|undefined} Id. + * @api + */ + getId() { + return this.id; + } + /** + * Get the map associated with this overlay. + * @return {import("./Map.js").default|null} The map that the + * overlay is part of. + * @observable + * @api + */ + getMap() { + return ( + /** @type {import("./Map.js").default|null} */ + this.get($t.MAP) || null + ); + } + /** + * Get the offset of this overlay. + * @return {Array} The offset. + * @observable + * @api + */ + getOffset() { + return ( + /** @type {Array} */ + this.get($t.OFFSET) + ); + } + /** + * Get the current position of this overlay. + * @return {import("./coordinate.js").Coordinate|undefined} The spatial point that the overlay is + * anchored at. + * @observable + * @api + */ + getPosition() { + return ( + /** @type {import("./coordinate.js").Coordinate|undefined} */ + this.get($t.POSITION) + ); + } + /** + * Get the current positioning of this overlay. + * @return {Positioning} How the overlay is positioned + * relative to its point on the map. + * @observable + * @api + */ + getPositioning() { + return ( + /** @type {Positioning} */ + this.get($t.POSITIONING) + ); + } + /** + * @protected + */ + handleElementChanged() { + wp(this.element); + const e = this.getElement(); + e && this.element.appendChild(e); + } + /** + * @protected + */ + handleMapChanged() { + var t; + this.mapPostrenderListenerKey && ((t = this.element) == null || t.remove(), Re(this.mapPostrenderListenerKey), this.mapPostrenderListenerKey = null); + const e = this.getMap(); + if (e) { + this.mapPostrenderListenerKey = ie( + e, + Ui.POSTRENDER, + this.render, + this + ), this.updatePixelPosition(); + const i = this.stopEvent ? e.getOverlayContainerStopEvent() : e.getOverlayContainer(); + this.insertFirst ? i.insertBefore(this.element, i.childNodes[0] || null) : i.appendChild(this.element), this.performAutoPan(); + } + } + /** + * @protected + */ + render() { + this.updatePixelPosition(); + } + /** + * @protected + */ + handleOffsetChanged() { + this.updatePixelPosition(); + } + /** + * @protected + */ + handlePositionChanged() { + this.updatePixelPosition(), this.performAutoPan(); + } + /** + * @protected + */ + handlePositioningChanged() { + this.updatePixelPosition(); + } + /** + * Set the DOM element to be associated with this overlay. + * @param {HTMLElement|undefined} element The Element containing the overlay. + * @observable + * @api + */ + setElement(e) { + this.set($t.ELEMENT, e); + } + /** + * Set the map to be associated with this overlay. + * @param {import("./Map.js").default|null} map The map that the + * overlay is part of. Pass `null` to just remove the overlay from the current map. + * @observable + * @api + */ + setMap(e) { + this.set($t.MAP, e); + } + /** + * Set the offset for this overlay. + * @param {Array} offset Offset. + * @observable + * @api + */ + setOffset(e) { + this.set($t.OFFSET, e); + } + /** + * Set the position for this overlay. If the position is `undefined` the + * overlay is hidden. + * @param {import("./coordinate.js").Coordinate|undefined} position The spatial point that the overlay + * is anchored at. + * @observable + * @api + */ + setPosition(e) { + this.set($t.POSITION, e); + } + /** + * Pan the map so that the overlay is entirely visible in the current viewport + * (if necessary) using the configured autoPan parameters + * @protected + */ + performAutoPan() { + this.autoPan && this.panIntoView(this.autoPan); + } + /** + * Pan the map so that the overlay is entirely visible in the current viewport + * (if necessary). + * @param {PanIntoViewOptions} [panIntoViewOptions] Options for the pan action + * @api + */ + panIntoView(e) { + const t = this.getMap(); + if (!t || !t.getTargetElement() || !this.get($t.POSITION)) + return; + const i = this.getRect(t.getTargetElement(), t.getSize()), r = this.getElement(), s = this.getRect(r, [ + XC(r), + qC(r) + ]); + e = e || {}; + const o = e.margin === void 0 ? 20 : e.margin; + if (!Mt(i, s)) { + const a = s[0] - i[0], l = i[2] - s[2], A = s[1] - i[1], c = i[3] - s[3], h = [0, 0]; + if (a < 0 ? h[0] = a - o : l < 0 && (h[0] = Math.abs(l) + o), A < 0 ? h[1] = A - o : c < 0 && (h[1] = Math.abs(c) + o), h[0] !== 0 || h[1] !== 0) { + const u = ( + /** @type {import("./coordinate.js").Coordinate} */ + t.getView().getCenterInternal() + ), g = t.getPixelFromCoordinateInternal(u); + if (!g) + return; + const d = [g[0] + h[0], g[1] + h[1]], m = e.animation || {}; + t.getView().animateInternal({ + center: t.getCoordinateFromPixelInternal(d), + duration: m.duration, + easing: m.easing + }); + } + } + } + /** + * Get the extent of an element relative to the document + * @param {HTMLElement} element The element. + * @param {import("./size.js").Size} size The size of the element. + * @return {import("./extent.js").Extent} The extent. + * @protected + */ + getRect(e, t) { + const i = e.getBoundingClientRect(), r = i.left + window.pageXOffset, s = i.top + window.pageYOffset; + return [r, s, r + t[0], s + t[1]]; + } + /** + * Set the positioning for this overlay. + * @param {Positioning} positioning how the overlay is + * positioned relative to its point on the map. + * @observable + * @api + */ + setPositioning(e) { + this.set($t.POSITIONING, e); + } + /** + * Modify the visibility of the element. + * @param {boolean} visible Element visibility. + * @protected + */ + setVisible(e) { + this.rendered.visible !== e && (this.element.style.display = e ? "" : "none", this.rendered.visible = e); + } + /** + * Update pixel position. + * @protected + */ + updatePixelPosition() { + const e = this.getMap(), t = this.getPosition(); + if (!e || !e.isRendered() || !t) { + this.setVisible(!1); + return; + } + const i = e.getPixelFromCoordinate(t), r = e.getSize(); + this.updateRenderedPosition(i, r); + } + /** + * @param {import("./pixel.js").Pixel} pixel The pixel location. + * @param {import("./size.js").Size|undefined} mapSize The map size. + * @protected + */ + updateRenderedPosition(e, t) { + const i = this.element.style, r = this.getOffset(), s = this.getPositioning(); + this.setVisible(!0); + const o = Math.round(e[0] + r[0]) + "px", a = Math.round(e[1] + r[1]) + "px"; + let l = "0%", A = "0%"; + s == "bottom-right" || s == "center-right" || s == "top-right" ? l = "-100%" : (s == "bottom-center" || s == "center-center" || s == "top-center") && (l = "-50%"), s == "bottom-left" || s == "bottom-center" || s == "bottom-right" ? A = "-100%" : (s == "center-left" || s == "center-center" || s == "center-right") && (A = "-50%"); + const c = `translate(${l}, ${A}) translate(${o}, ${a})`; + this.rendered.transform_ != c && (this.rendered.transform_ = c, i.transform = c); + } + /** + * returns the options this Overlay has been created with + * @return {Options} overlay options + */ + getOptions() { + return this.options; + } +} +class Qc { + /** + * @param {number} [highWaterMark] High water mark. + */ + constructor(e) { + this.highWaterMark = e !== void 0 ? e : 2048, this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null; + } + /** + * @return {boolean} Can expire cache. + */ + canExpireCache() { + return this.highWaterMark > 0 && this.getCount() > this.highWaterMark; + } + /** + * Expire the cache. When the cache entry is a {@link module:ol/Disposable~Disposable}, + * the entry will be disposed. + * @param {!Object} [keep] Keys to keep. To be implemented by subclasses. + */ + expireCache(e) { + for (; this.canExpireCache(); ) { + const t = this.pop(); + t instanceof Bo && t.dispose(); + } + } + /** + * FIXME empty description for jsdoc + */ + clear() { + this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null; + } + /** + * @param {string} key Key. + * @return {boolean} Contains key. + */ + containsKey(e) { + return this.entries_.hasOwnProperty(e); + } + /** + * @param {function(T, string, LRUCache): ?} f The function + * to call for every entry from the oldest to the newer. This function takes + * 3 arguments (the entry value, the entry key and the LRUCache object). + * The return value is ignored. + */ + forEach(e) { + let t = this.oldest_; + for (; t; ) + e(t.value_, t.key_, this), t = t.newer; + } + /** + * @param {string} key Key. + * @param {*} [options] Options (reserved for subclasses). + * @return {T} Value. + */ + get(e, t) { + const i = this.entries_[e]; + return Ie( + i !== void 0, + "Tried to get a value for a key that does not exist in the cache" + ), i === this.newest_ || (i === this.oldest_ ? (this.oldest_ = /** @type {Entry} */ + this.oldest_.newer, this.oldest_.older = null) : (i.newer.older = i.older, i.older.newer = i.newer), i.newer = null, i.older = this.newest_, this.newest_.newer = i, this.newest_ = i), i.value_; + } + /** + * Remove an entry from the cache. + * @param {string} key The entry key. + * @return {T} The removed entry. + */ + remove(e) { + const t = this.entries_[e]; + return Ie( + t !== void 0, + "Tried to get a value for a key that does not exist in the cache" + ), t === this.newest_ ? (this.newest_ = /** @type {Entry} */ + t.older, this.newest_ && (this.newest_.newer = null)) : t === this.oldest_ ? (this.oldest_ = /** @type {Entry} */ + t.newer, this.oldest_ && (this.oldest_.older = null)) : (t.newer.older = t.older, t.older.newer = t.newer), delete this.entries_[e], --this.count_, t.value_; + } + /** + * @return {number} Count. + */ + getCount() { + return this.count_; + } + /** + * @return {Array} Keys. + */ + getKeys() { + const e = new Array(this.count_); + let t = 0, i; + for (i = this.newest_; i; i = i.older) + e[t++] = i.key_; + return e; + } + /** + * @return {Array} Values. + */ + getValues() { + const e = new Array(this.count_); + let t = 0, i; + for (i = this.newest_; i; i = i.older) + e[t++] = i.value_; + return e; + } + /** + * @return {T} Last value. + */ + peekLast() { + return this.oldest_.value_; + } + /** + * @return {string} Last key. + */ + peekLastKey() { + return this.oldest_.key_; + } + /** + * Get the key of the newest item in the cache. Throws if the cache is empty. + * @return {string} The newest key. + */ + peekFirstKey() { + return this.newest_.key_; + } + /** + * Return an entry without updating least recently used time. + * @param {string} key Key. + * @return {T|undefined} Value. + */ + peek(e) { + var t; + return (t = this.entries_[e]) == null ? void 0 : t.value_; + } + /** + * @return {T} value Value. + */ + pop() { + const e = this.oldest_; + return delete this.entries_[e.key_], e.newer && (e.newer.older = null), this.oldest_ = /** @type {Entry} */ + e.newer, this.oldest_ || (this.newest_ = null), --this.count_, e.value_; + } + /** + * @param {string} key Key. + * @param {T} value Value. + */ + replace(e, t) { + this.get(e), this.entries_[e].value_ = t; + } + /** + * @param {string} key Key. + * @param {T} value Value. + */ + set(e, t) { + Ie( + !(e in this.entries_), + "Tried to set a value for a key that is used already" + ); + const i = { + key_: e, + newer: null, + older: this.newest_, + value_: t + }; + this.newest_ ? this.newest_.newer = i : this.oldest_ = i, this.newest_ = i, this.entries_[e] = i, ++this.count_; + } + /** + * Set a maximum number of entries for the cache. + * @param {number} size Cache size. + * @api + */ + setSize(e) { + this.highWaterMark = e; + } +} +function qr(n, e, t, i) { + return i !== void 0 ? (i[0] = n, i[1] = e, i[2] = t, i) : [n, e, t]; +} +function jg(n, e, t) { + return n + "/" + e + "/" + t; +} +function br(n) { + return jg(n[0], n[1], n[2]); +} +function kO(n) { + const [e, t, i] = n.substring(n.lastIndexOf("/") + 1, n.length).split(",").map(Number); + return jg(e, t, i); +} +function qx(n) { + return n.split("/").map(Number); +} +function Kg(n) { + return p_(n[0], n[1], n[2]); +} +function p_(n, e, t) { + return (e << n) + t; +} +function jx(n, e) { + const t = n[0], i = n[1], r = n[2]; + if (e.getMinZoom() > t || t > e.getMaxZoom()) + return !1; + const s = e.getFullTileRange(t); + return s ? s.containsXY(i, r) : !0; +} +class $O extends Qc { + /** + * @override + */ + clear() { + for (; this.getCount() > 0; ) + this.pop().release(); + super.clear(); + } + /** + * @param {!Object} usedTiles Used tiles. + * @override + */ + expireCache(e) { + for (; this.canExpireCache() && !(this.peekLast().getKey() in e); ) + this.pop().release(); + } + /** + * Prune all tiles from the cache that don't have the same z as the newest tile. + */ + pruneExceptNewestZ() { + if (this.getCount() === 0) + return; + const e = this.peekFirstKey(), i = qx(e)[0]; + this.forEach((r) => { + r.tileCoord[0] !== i && (this.remove(br(r.tileCoord)), r.release()); + }); + } +} +class Dc { + /** + * @param {number} minX Minimum X. + * @param {number} maxX Maximum X. + * @param {number} minY Minimum Y. + * @param {number} maxY Maximum Y. + */ + constructor(e, t, i, r) { + this.minX = e, this.maxX = t, this.minY = i, this.maxY = r; + } + /** + * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. + * @return {boolean} Contains tile coordinate. + */ + contains(e) { + return this.containsXY(e[1], e[2]); + } + /** + * @param {TileRange} tileRange Tile range. + * @return {boolean} Contains. + */ + containsTileRange(e) { + return this.minX <= e.minX && e.maxX <= this.maxX && this.minY <= e.minY && e.maxY <= this.maxY; + } + /** + * @param {number} x Tile coordinate x. + * @param {number} y Tile coordinate y. + * @return {boolean} Contains coordinate. + */ + containsXY(e, t) { + return this.minX <= e && e <= this.maxX && this.minY <= t && t <= this.maxY; + } + /** + * @param {TileRange} tileRange Tile range. + * @return {boolean} Equals. + */ + equals(e) { + return this.minX == e.minX && this.minY == e.minY && this.maxX == e.maxX && this.maxY == e.maxY; + } + /** + * @param {TileRange} tileRange Tile range. + */ + extend(e) { + e.minX < this.minX && (this.minX = e.minX), e.maxX > this.maxX && (this.maxX = e.maxX), e.minY < this.minY && (this.minY = e.minY), e.maxY > this.maxY && (this.maxY = e.maxY); + } + /** + * @return {number} Height. + */ + getHeight() { + return this.maxY - this.minY + 1; + } + /** + * @return {import("./size.js").Size} Size. + */ + getSize() { + return [this.getWidth(), this.getHeight()]; + } + /** + * @return {number} Width. + */ + getWidth() { + return this.maxX - this.minX + 1; + } + /** + * @param {TileRange} tileRange Tile range. + * @return {boolean} Intersects. + */ + intersects(e) { + return this.minX <= e.maxX && this.maxX >= e.minX && this.minY <= e.maxY && this.maxY >= e.minY; + } +} +function ws(n, e, t, i, r) { + return r !== void 0 ? (r.minX = n, r.maxX = e, r.minY = t, r.maxY = i, r) : new Dc(n, e, t, i); +} +const Zf = []; +class Kx extends Ro { + /** + * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. + * @param {import("./TileState.js").default} state State. + * @param {import("./tilecoord.js").TileCoord} urlTileCoord Wrapped tile coordinate for source urls. + * @param {function(VectorRenderTile):Array} getSourceTiles Function. + * @param {function(VectorRenderTile):void} removeSourceTiles Function. + */ + constructor(e, t, i, r, s) { + super(e, t, { transition: 0 }), this.context_ = null, this.executorGroups = [], this.loadingSourceTiles = 0, this.hitDetectionImageData = {}, this.replayState_ = {}, this.sourceTiles = [], this.errorTileKeys = {}, this.wantedResolution, this.getSourceTiles = r.bind(void 0, this), this.removeSourceTiles_ = s, this.wrappedTileCoord = i; + } + /** + * @return {CanvasRenderingContext2D} The rendering context. + */ + getContext() { + return this.context_ || (this.context_ = Ve(1, 1, Zf)), this.context_; + } + /** + * @return {boolean} Tile has a rendering context. + */ + hasContext() { + return !!this.context_; + } + /** + * Get the Canvas for this tile. + * @return {HTMLCanvasElement} Canvas. + */ + getImage() { + return this.hasContext() ? this.getContext().canvas : null; + } + /** + * @param {import("./layer/Layer.js").default} layer Layer. + * @return {ReplayState} The replay state. + */ + getReplayState(e) { + const t = X(e); + return t in this.replayState_ || (this.replayState_[t] = { + dirty: !1, + renderedRenderOrder: null, + renderedResolution: NaN, + renderedRevision: -1, + renderedTileResolution: NaN, + renderedTileRevision: -1, + renderedTileZ: -1 + }), this.replayState_[t]; + } + /** + * Load the tile. + * @override + */ + load() { + this.getSourceTiles(); + } + /** + * Remove from the cache due to expiry + * @override + */ + release() { + this.context_ && (zr(this.context_), Zf.push(this.context_.canvas), this.context_ = null), this.removeSourceTiles_(this), this.sourceTiles.length = 0, super.release(); + } +} +let Wx = class extends Ro { + /** + * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. + * @param {import("./TileState.js").default} state State. + * @param {string} src Data source url. + * @param {import("./format/Feature.js").default} format Feature format. + * @param {import("./Tile.js").LoadFunction} tileLoadFunction Tile load function. + * @param {import("./Tile.js").Options} [options] Tile options. + */ + constructor(e, t, i, r, s, o) { + super(e, t, o), this.extent = null, this.format_ = r, this.features_ = null, this.loader_, this.projection = null, this.resolution, this.tileLoadFunction_ = s, this.url_ = i, this.key = i; + } + /** + * @return {string} Tile url. + */ + getTileUrl() { + return this.url_; + } + /** + * Get the feature format assigned for reading this tile's features. + * @return {import("./format/Feature.js").default} Feature format. + * @api + */ + getFormat() { + return this.format_; + } + /** + * Get the features for this tile. Geometries will be in the view projection. + * @return {Array} Features. + * @api + */ + getFeatures() { + return this.features_; + } + /** + * Load not yet loaded URI. + * @override + */ + load() { + this.state == $.IDLE && (this.setState($.LOADING), this.tileLoadFunction_(this, this.url_), this.loader_ && this.loader_(this.extent, this.resolution, this.projection)); + } + /** + * Handler for successful tile load. + * @param {Array} features The loaded features. + * @param {import("./proj/Projection.js").default} dataProjection Data projection. + */ + onLoad(e, t) { + this.setFeatures(e); + } + /** + * Handler for tile load errors. + */ + onError() { + this.setState($.ERROR); + } + /** + * Function for use in a {@link module:ol/source/VectorTile~VectorTile}'s `tileLoadFunction`. + * Sets the features for the tile. + * @param {Array} features Features. + * @api + */ + setFeatures(e) { + this.features_ = e, this.setState($.LOADED); + } + /** + * Set the feature loader for reading this tile's features. + * @param {import("./featureloader.js").FeatureLoader} loader Feature loader. + * @api + */ + setLoader(e) { + this.loader_ = e; + } +}; +const Jf = [ + "fullscreenchange", + "webkitfullscreenchange", + "MSFullscreenChange" +], em = { + /** + * Triggered after the map entered fullscreen. + * @event FullScreenEventType#enterfullscreen + * @api + */ + ENTERFULLSCREEN: "enterfullscreen", + /** + * Triggered after the map leave fullscreen. + * @event FullScreenEventType#leavefullscreen + * @api + */ + LEAVEFULLSCREEN: "leavefullscreen" +}; +class YO extends Kn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + target: e.target + }), this.on, this.once, this.un, this.keys_ = e.keys !== void 0 ? e.keys : !1, this.source_ = e.source, this.isInFullscreen_ = !1, this.boundHandleMapTargetChange_ = this.handleMapTargetChange_.bind(this), this.cssClassName_ = e.className !== void 0 ? e.className : "ol-full-screen", this.documentListeners_ = [], this.activeClassName_ = e.activeClassName !== void 0 ? e.activeClassName.split(" ") : [this.cssClassName_ + "-true"], this.inactiveClassName_ = e.inactiveClassName !== void 0 ? e.inactiveClassName.split(" ") : [this.cssClassName_ + "-false"]; + const t = e.label !== void 0 ? e.label : "⤢"; + this.labelNode_ = typeof t == "string" ? document.createTextNode(t) : t; + const i = e.labelActive !== void 0 ? e.labelActive : "×"; + this.labelActiveNode_ = typeof i == "string" ? document.createTextNode(i) : i; + const r = e.tipLabel ? e.tipLabel : "Toggle full-screen"; + this.button_ = document.createElement("button"), this.button_.title = r, this.button_.setAttribute("type", "button"), this.button_.appendChild(this.labelNode_), this.button_.addEventListener( + j.CLICK, + this.handleClick_.bind(this), + !1 + ), this.setClassName_(this.button_, this.isInFullscreen_), this.element.className = `${this.cssClassName_} ${In} ${As}`, this.element.appendChild(this.button_); + } + /** + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e) { + e.preventDefault(), this.handleFullScreen_(); + } + /** + * @private + */ + handleFullScreen_() { + const e = this.getMap(); + if (!e) + return; + const t = e.getOwnerDocument(); + if (tm(t)) + if (im(t)) + Jx(t); + else { + let i; + this.source_ ? i = typeof this.source_ == "string" ? t.getElementById(this.source_) : this.source_ : i = e.getTargetElement(), this.keys_ ? Zx(i) : __(i); + } + } + /** + * @private + */ + handleFullScreenChange_() { + const e = this.getMap(); + if (!e) + return; + const t = this.isInFullscreen_; + this.isInFullscreen_ = im(e.getOwnerDocument()), t !== this.isInFullscreen_ && (this.setClassName_(this.button_, this.isInFullscreen_), this.isInFullscreen_ ? (ro(this.labelActiveNode_, this.labelNode_), this.dispatchEvent(em.ENTERFULLSCREEN)) : (ro(this.labelNode_, this.labelActiveNode_), this.dispatchEvent(em.LEAVEFULLSCREEN)), e.updateSize()); + } + /** + * @param {HTMLElement} element Target element + * @param {boolean} fullscreen True if fullscreen class name should be active + * @private + */ + setClassName_(e, t) { + t ? (e.classList.remove(...this.inactiveClassName_), e.classList.add(...this.activeClassName_)) : (e.classList.remove(...this.activeClassName_), e.classList.add(...this.inactiveClassName_)); + } + /** + * Remove the control from its current map and attach it to the new map. + * Pass `null` to just remove the control from the current map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + * @api + * @override + */ + setMap(e) { + const t = this.getMap(); + t && t.removeChangeListener( + ut.TARGET, + this.boundHandleMapTargetChange_ + ), super.setMap(e), this.handleMapTargetChange_(), e && e.addChangeListener( + ut.TARGET, + this.boundHandleMapTargetChange_ + ); + } + /** + * @private + */ + handleMapTargetChange_() { + const e = this.documentListeners_; + for (let i = 0, r = e.length; i < r; ++i) + Re(e[i]); + e.length = 0; + const t = this.getMap(); + if (t) { + const i = t.getOwnerDocument(); + tm(i) ? this.element.classList.remove(Gf) : this.element.classList.add(Gf); + for (let r = 0, s = Jf.length; r < s; ++r) + e.push( + ie(i, Jf[r], this.handleFullScreenChange_, this) + ); + this.handleFullScreenChange_(); + } + } +} +function tm(n) { + const e = n.body; + return !!(e.webkitRequestFullscreen || e.requestFullscreen && n.fullscreenEnabled); +} +function im(n) { + return !!(n.webkitIsFullScreen || n.fullscreenElement); +} +function __(n) { + n.requestFullscreen ? n.requestFullscreen() : n.webkitRequestFullscreen && n.webkitRequestFullscreen(); +} +function Zx(n) { + n.webkitRequestFullscreen ? n.webkitRequestFullscreen() : __(n); +} +function Jx(n) { + n.exitFullscreen ? n.exitFullscreen() : n.webkitExitFullscreen && n.webkitExitFullscreen(); +} +const _h = "projection", nm = "coordinateFormat"; +class zO extends Kn { + /** + * @param {Options} [options] Mouse position options. + */ + constructor(e) { + e = e || {}; + const t = document.createElement("div"); + t.className = e.className !== void 0 ? e.className : "ol-mouse-position", super({ + element: t, + render: e.render, + target: e.target + }), this.on, this.once, this.un, this.addChangeListener(_h, this.handleProjectionChanged_), e.coordinateFormat && this.setCoordinateFormat(e.coordinateFormat), e.projection && this.setProjection(e.projection), this.renderOnMouseOut_ = e.placeholder !== void 0, this.placeholder_ = this.renderOnMouseOut_ ? e.placeholder : " ", this.renderedHTML_ = t.innerHTML, this.mapProjection_ = null, this.transform_ = null, this.wrapX_ = e.wrapX !== !1; + } + /** + * @private + */ + handleProjectionChanged_() { + this.transform_ = null; + } + /** + * Return the coordinate format type used to render the current position or + * undefined. + * @return {import("../coordinate.js").CoordinateFormat|undefined} The format to render the current + * position in. + * @observable + * @api + */ + getCoordinateFormat() { + return ( + /** @type {import("../coordinate.js").CoordinateFormat|undefined} */ + this.get(nm) + ); + } + /** + * Return the projection that is used to report the mouse position. + * @return {import("../proj/Projection.js").default|undefined} The projection to report mouse + * position in. + * @observable + * @api + */ + getProjection() { + return ( + /** @type {import("../proj/Projection.js").default|undefined} */ + this.get(_h) + ); + } + /** + * @param {MouseEvent} event Browser event. + * @protected + */ + handleMouseMove(e) { + const t = this.getMap(); + this.updateHTML_(t.getEventPixel(e)); + } + /** + * @param {Event} event Browser event. + * @protected + */ + handleMouseOut(e) { + this.updateHTML_(null); + } + /** + * Remove the control from its current map and attach it to the new map. + * Pass `null` to just remove the control from the current map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + * @api + * @override + */ + setMap(e) { + if (super.setMap(e), e) { + const t = e.getViewport(); + this.listenerKeys.push( + ie(t, ln.POINTERMOVE, this.handleMouseMove, this) + ), this.renderOnMouseOut_ && this.listenerKeys.push( + ie(t, ln.POINTEROUT, this.handleMouseOut, this) + ), this.updateHTML_(null); + } + } + /** + * Set the coordinate format type used to render the current position. + * @param {import("../coordinate.js").CoordinateFormat} format The format to render the current + * position in. + * @observable + * @api + */ + setCoordinateFormat(e) { + this.set(nm, e); + } + /** + * Set the projection that is used to report the mouse position. + * @param {import("../proj.js").ProjectionLike} projection The projection to report mouse + * position in. + * @observable + * @api + */ + setProjection(e) { + this.set(_h, q(e)); + } + /** + * @param {?import("../pixel.js").Pixel} pixel Pixel. + * @private + */ + updateHTML_(e) { + let t = this.placeholder_; + if (e && this.mapProjection_) { + if (!this.transform_) { + const s = this.getProjection(); + s ? this.transform_ = li( + this.mapProjection_, + s + ) : this.transform_ = pc; + } + const r = this.getMap().getCoordinateFromPixelInternal(e); + if (r) { + const s = gt(); + if (s && (this.transform_ = li( + this.mapProjection_, + s + )), this.transform_(r, r), this.wrapX_) { + const a = s || this.getProjection() || this.mapProjection_; + fc(r, a); + } + const o = this.getCoordinateFormat(); + o ? t = o(r) : t = r.toString(); + } + } + (!this.renderedHTML_ || t !== this.renderedHTML_) && (this.element.innerHTML = t, this.renderedHTML_ = t); + } + /** + * Update the projection. Rendering of the coordinates is done in + * `handleMouseMove` and `handleMouseUp`. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + const t = e.frameState; + t ? this.mapProjection_ != t.viewState.projection && (this.mapProjection_ = t.viewState.projection, this.transform_ = null) : this.mapProjection_ = null; + } +} +const Ih = 0.75, $l = 0.1; +class VO extends Kn { + /** + * @param {Options} [options] OverviewMap options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + render: e.render, + target: e.target + }), this.boundHandleRotationChanged_ = this.handleRotationChanged_.bind(this), this.collapsed_ = e.collapsed !== void 0 ? e.collapsed : !0, this.collapsible_ = e.collapsible !== void 0 ? e.collapsible : !0, this.collapsible_ || (this.collapsed_ = !1), this.rotateWithView_ = e.rotateWithView !== void 0 ? e.rotateWithView : !1, this.viewExtent_ = void 0; + const t = e.className !== void 0 ? e.className : "ol-overviewmap", i = e.tipLabel !== void 0 ? e.tipLabel : "Overview map", r = e.collapseLabel !== void 0 ? e.collapseLabel : "‹"; + typeof r == "string" ? (this.collapseLabel_ = document.createElement("span"), this.collapseLabel_.textContent = r) : this.collapseLabel_ = r; + const s = e.label !== void 0 ? e.label : "›"; + typeof s == "string" ? (this.label_ = document.createElement("span"), this.label_.textContent = s) : this.label_ = s; + const o = this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_, a = document.createElement("button"); + a.setAttribute("type", "button"), a.title = i, a.appendChild(o), a.addEventListener( + j.CLICK, + this.handleClick_.bind(this), + !1 + ), this.ovmapDiv_ = document.createElement("div"), this.ovmapDiv_.className = "ol-overviewmap-map", this.view_ = e.view; + const l = new Vx({ + view: e.view, + controls: new wt(), + interactions: new wt() + }); + this.ovmap_ = l, e.layers && e.layers.forEach(function(p) { + l.addLayer(p); + }); + const A = document.createElement("div"); + A.className = "ol-overviewmap-box", A.style.boxSizing = "border-box", this.boxOverlay_ = new Xx({ + position: [0, 0], + positioning: "center-center", + element: A + }), this.ovmap_.addOverlay(this.boxOverlay_); + const c = t + " " + In + " " + As + (this.collapsed_ && this.collapsible_ ? " " + bA : "") + (this.collapsible_ ? "" : " ol-uncollapsible"), h = this.element; + h.className = c, h.appendChild(this.ovmapDiv_), h.appendChild(a); + const u = this, g = this.boxOverlay_, d = this.boxOverlay_.getElement(), m = function(p) { + return { + clientX: p.clientX, + clientY: p.clientY + }; + }, f = function(p) { + const _ = ( + /** @type {?} */ + m(p) + ), I = l.getEventCoordinate( + /** @type {MouseEvent} */ + _ + ); + g.setPosition(I); + }, E = function(p) { + const _ = l.getEventCoordinateInternal(p); + u.getMap().getView().setCenterInternal(_), window.removeEventListener("pointermove", f), window.removeEventListener("pointerup", E); + }; + this.ovmapDiv_.addEventListener("pointerdown", function() { + event.target === d && window.addEventListener("pointermove", f), window.addEventListener("pointerup", E); + }); + } + /** + * Remove the control from its current map and attach it to the new map. + * Pass `null` to just remove the control from the current map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + * @api + * @override + */ + setMap(e) { + const t = this.getMap(); + if (e !== t) { + if (t) { + const i = t.getView(); + i && this.unbindView_(i), this.ovmap_.setTarget(null); + } + if (super.setMap(e), e) { + this.ovmap_.setTarget(this.ovmapDiv_), this.listenerKeys.push( + ie( + e, + Yr.PROPERTYCHANGE, + this.handleMapPropertyChange_, + this + ) + ); + const i = e.getView(); + i && this.bindView_(i), this.ovmap_.isRendered() || this.updateBoxAfterOvmapIsRendered_(); + } + } + } + /** + * Handle map property changes. This only deals with changes to the map's view. + * @param {import("../Object.js").ObjectEvent} event The propertychange event. + * @private + */ + handleMapPropertyChange_(e) { + if (e.key === ut.VIEW) { + const t = ( + /** @type {import("../View.js").default} */ + e.oldValue + ); + t && this.unbindView_(t); + const i = this.getMap().getView(); + this.bindView_(i); + } else !this.ovmap_.isRendered() && (e.key === ut.TARGET || e.key === ut.SIZE) && this.ovmap_.updateSize(); + } + /** + * Register listeners for view property changes. + * @param {import("../View.js").default} view The view. + * @private + */ + bindView_(e) { + if (!this.view_) { + const t = new an({ + projection: e.getProjection() + }); + this.ovmap_.setView(t); + } + e.addChangeListener( + ui.ROTATION, + this.boundHandleRotationChanged_ + ), this.handleRotationChanged_(), e.isDef() && (this.ovmap_.updateSize(), this.resetExtent_()); + } + /** + * Unregister listeners for view property changes. + * @param {import("../View.js").default} view The view. + * @private + */ + unbindView_(e) { + e.removeChangeListener( + ui.ROTATION, + this.boundHandleRotationChanged_ + ); + } + /** + * Handle rotation changes to the main map. + * @private + */ + handleRotationChanged_() { + this.rotateWithView_ && this.ovmap_.getView().setRotation(this.getMap().getView().getRotation()); + } + /** + * Reset the overview map extent if the box size (width or + * height) is less than the size of the overview map size times minRatio + * or is greater than the size of the overview size times maxRatio. + * + * If the map extent was not reset, the box size can fits in the defined + * ratio sizes. This method then checks if is contained inside the overview + * map current extent. If not, recenter the overview map to the current + * main map center location. + * @private + */ + validateExtent_() { + const e = this.getMap(), t = this.ovmap_; + if (!e.isRendered() || !t.isRendered()) + return; + const i = ( + /** @type {import("../size.js").Size} */ + e.getSize() + ), s = e.getView().calculateExtentInternal(i); + if (this.viewExtent_ && Ci(s, this.viewExtent_)) + return; + this.viewExtent_ = s; + const o = ( + /** @type {import("../size.js").Size} */ + t.getSize() + ), l = t.getView().calculateExtentInternal(o), A = t.getPixelFromCoordinateInternal( + Ki(s) + ), c = t.getPixelFromCoordinateInternal( + To(s) + ), h = Math.abs(A[0] - c[0]), u = Math.abs(A[1] - c[1]), g = o[0], d = o[1]; + h < g * $l || u < d * $l || h > g * Ih || u > d * Ih ? this.resetExtent_() : Mt(l, s) || this.recenter_(); + } + /** + * Reset the overview map extent to half calculated min and max ratio times + * the extent of the main map. + * @private + */ + resetExtent_() { + const e = this.getMap(), t = this.ovmap_, i = ( + /** @type {import("../size.js").Size} */ + e.getSize() + ), s = e.getView().calculateExtentInternal(i), o = t.getView(), a = Math.log(Ih / $l) / Math.LN2, l = 1 / (Math.pow(2, a / 2) * $l); + dg(s, l), o.fitInternal(co(s)); + } + /** + * Set the center of the overview map to the map center without changing its + * resolution. + * @private + */ + recenter_() { + const e = this.getMap(), t = this.ovmap_, i = e.getView(); + t.getView().setCenterInternal(i.getCenterInternal()); + } + /** + * Update the box using the main map extent + * @private + */ + updateBox_() { + const e = this.getMap(), t = this.ovmap_; + if (!e.isRendered() || !t.isRendered()) + return; + const i = ( + /** @type {import("../size.js").Size} */ + e.getSize() + ), r = e.getView(), s = t.getView(), o = this.rotateWithView_ ? 0 : -r.getRotation(), a = this.boxOverlay_, l = this.boxOverlay_.getElement(), A = r.getCenter(), c = r.getResolution(), h = s.getResolution(), u = i[0] * c / h, g = i[1] * c / h; + if (a.setPosition(A), l) { + l.style.width = u + "px", l.style.height = g + "px"; + const d = "rotate(" + o + "rad)"; + l.style.transform = d; + } + } + /** + * @private + */ + updateBoxAfterOvmapIsRendered_() { + this.ovmapPostrenderKey_ || (this.ovmapPostrenderKey_ = no( + this.ovmap_, + Ui.POSTRENDER, + (e) => { + delete this.ovmapPostrenderKey_, this.updateBox_(); + } + )); + } + /** + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e) { + e.preventDefault(), this.handleToggle_(); + } + /** + * @private + */ + handleToggle_() { + this.element.classList.toggle(bA), this.collapsed_ ? ro(this.collapseLabel_, this.label_) : ro(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_; + const e = this.ovmap_; + if (!this.collapsed_) { + if (e.isRendered()) { + this.viewExtent_ = void 0, e.render(); + return; + } + e.updateSize(), this.resetExtent_(), this.updateBoxAfterOvmapIsRendered_(); + } + } + /** + * Return `true` if the overview map is collapsible, `false` otherwise. + * @return {boolean} True if the widget is collapsible. + * @api + */ + getCollapsible() { + return this.collapsible_; + } + /** + * Set whether the overview map should be collapsible. + * @param {boolean} collapsible True if the widget is collapsible. + * @api + */ + setCollapsible(e) { + this.collapsible_ !== e && (this.collapsible_ = e, this.element.classList.toggle("ol-uncollapsible"), !e && this.collapsed_ && this.handleToggle_()); + } + /** + * Collapse or expand the overview map according to the passed parameter. Will + * not do anything if the overview map isn't collapsible or if the current + * collapsed state is already the one requested. + * @param {boolean} collapsed True if the widget is collapsed. + * @api + */ + setCollapsed(e) { + !this.collapsible_ || this.collapsed_ === e || this.handleToggle_(); + } + /** + * Determine if the overview map is collapsed. + * @return {boolean} The overview map is collapsed. + * @api + */ + getCollapsed() { + return this.collapsed_; + } + /** + * Return `true` if the overview map view can rotate, `false` otherwise. + * @return {boolean} True if the control view can rotate. + * @api + */ + getRotateWithView() { + return this.rotateWithView_; + } + /** + * Set whether the overview map view should rotate with the main map view. + * @param {boolean} rotateWithView True if the control view should rotate. + * @api + */ + setRotateWithView(e) { + this.rotateWithView_ !== e && (this.rotateWithView_ = e, this.getMap().getView().getRotation() !== 0 && (this.rotateWithView_ ? this.handleRotationChanged_() : this.ovmap_.getView().setRotation(0), this.viewExtent_ = void 0, this.validateExtent_(), this.updateBox_())); + } + /** + * Return the overview map. + * @return {import("../Map.js").default} Overview map. + * @api + */ + getOverviewMap() { + return this.ovmap_; + } + /** + * Update the overview map element. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + this.validateExtent_(), this.updateBox_(); + } +} +const Ch = "units", eB = [1, 2, 5], ta = 25.4 / 0.28; +class HO extends Kn { + /** + * @param {Options} [options] Scale line options. + */ + constructor(e) { + e = e || {}; + const t = document.createElement("div"); + t.style.pointerEvents = "none", super({ + element: t, + render: e.render, + target: e.target + }), this.on, this.once, this.un; + const i = e.className !== void 0 ? e.className : e.bar ? "ol-scale-bar" : "ol-scale-line"; + this.innerElement_ = document.createElement("div"), this.innerElement_.className = i + "-inner", this.element.className = i + " " + In, this.element.appendChild(this.innerElement_), this.viewState_ = null, this.minWidth_ = e.minWidth !== void 0 ? e.minWidth : 64, this.maxWidth_ = e.maxWidth, this.renderedVisible_ = !1, this.renderedWidth_ = void 0, this.renderedHTML_ = "", this.addChangeListener(Ch, this.handleUnitsChanged_), this.setUnits(e.units || "metric"), this.scaleBar_ = e.bar || !1, this.scaleBarSteps_ = e.steps || 4, this.scaleBarText_ = e.text || !1, this.dpi_ = e.dpi || void 0; + } + /** + * Return the units to use in the scale line. + * @return {Units} The units + * to use in the scale line. + * @observable + * @api + */ + getUnits() { + return this.get(Ch); + } + /** + * @private + */ + handleUnitsChanged_() { + this.updateElement_(); + } + /** + * Set the units to use in the scale line. + * @param {Units} units The units to use in the scale line. + * @observable + * @api + */ + setUnits(e) { + this.set(Ch, e); + } + /** + * Specify the dpi of output device such as printer. + * @param {number|undefined} dpi The dpi of output device. + * @api + */ + setDpi(e) { + this.dpi_ = e; + } + /** + * @private + */ + updateElement_() { + const e = this.viewState_; + if (!e) { + this.renderedVisible_ && (this.element.style.display = "none", this.renderedVisible_ = !1); + return; + } + const t = e.center, i = e.projection, r = this.getUnits(), s = r == "degrees" ? "degrees" : "m"; + let o = DA( + i, + e.resolution, + t, + s + ); + const a = this.minWidth_ * (this.dpi_ || ta) / ta, l = this.maxWidth_ !== void 0 ? this.maxWidth_ * (this.dpi_ || ta) / ta : void 0; + let A = a * o, c = ""; + if (r == "degrees") { + const _ = ao.degrees; + A *= _, A < _ / 60 ? (c = "″", o *= 3600) : A < _ ? (c = "′", o *= 60) : c = "°"; + } else if (r == "imperial") + A < 0.9144 ? (c = "in", o /= 0.0254) : A < 1609.344 ? (c = "ft", o /= 0.3048) : (c = "mi", o /= 1609.344); + else if (r == "nautical") + o /= 1852, c = "NM"; + else if (r == "metric") + A < 1e-6 ? (c = "nm", o *= 1e9) : A < 1e-3 ? (c = "μm", o *= 1e6) : A < 1 ? (c = "mm", o *= 1e3) : A < 1e3 ? c = "m" : (c = "km", o /= 1e3); + else if (r == "us") + A < 0.9144 ? (c = "in", o *= 39.37) : A < 1609.344 ? (c = "ft", o /= 0.30480061) : (c = "mi", o /= 1609.3472); + else + throw new Error("Invalid units"); + let h = 3 * Math.floor(Math.log(a * o) / Math.log(10)), u, g, d, m, f, E; + for (; ; ) { + d = Math.floor(h / 3); + const _ = Math.pow(10, d); + if (u = eB[(h % 3 + 3) % 3] * _, g = Math.round(u / o), isNaN(g)) { + this.element.style.display = "none", this.renderedVisible_ = !1; + return; + } + if (l !== void 0 && g >= l) { + u = m, g = f, d = E; + break; + } else if (g >= a) + break; + m = u, f = g, E = d, ++h; + } + const p = this.scaleBar_ ? this.createScaleBar(g, u, c) : u.toFixed(d < 0 ? -d : 0) + " " + c; + this.renderedHTML_ != p && (this.innerElement_.innerHTML = p, this.renderedHTML_ = p), this.renderedWidth_ != g && (this.innerElement_.style.width = g + "px", this.renderedWidth_ = g), this.renderedVisible_ || (this.element.style.display = "", this.renderedVisible_ = !0); + } + /** + * @private + * @param {number} width The current width of the scalebar. + * @param {number} scale The current scale. + * @param {string} suffix The suffix to append to the scale text. + * @return {string} The stringified HTML of the scalebar. + */ + createScaleBar(e, t, i) { + const r = this.getScaleForResolution(), s = r < 1 ? Math.round(1 / r).toLocaleString() + " : 1" : "1 : " + Math.round(r).toLocaleString(), o = this.scaleBarSteps_, a = e / o, l = [this.createMarker("absolute")]; + for (let c = 0; c < o; ++c) { + const h = c % 2 === 0 ? "ol-scale-singlebar-odd" : "ol-scale-singlebar-even"; + l.push( + `

    " + ); + } + return l.push(this.createStepText(o, e, !0, t, i)), (this.scaleBarText_ ? `
    ` + s + "
    " : "") + l.join(""); + } + /** + * Creates a marker at given position + * @param {'absolute'|'relative'} position The position, absolute or relative + * @return {string} The stringified div containing the marker + */ + createMarker(e) { + return `
    `; + } + /** + * Creates the label for a marker marker at given position + * @param {number} i The iterator + * @param {number} width The width the scalebar will currently use + * @param {boolean} isLast Flag indicating if we add the last step text + * @param {number} scale The current scale for the whole scalebar + * @param {string} suffix The suffix for the scale + * @return {string} The stringified div containing the step text + */ + createStepText(e, t, i, r, s) { + const a = (e === 0 ? 0 : Math.round(r / this.scaleBarSteps_ * e * 100) / 100) + (e === 0 ? "" : " " + s), l = e === 0 ? -3 : t / this.scaleBarSteps_ * -1, A = e === 0 ? 0 : t / this.scaleBarSteps_ * 2; + return `
    ` + a + "
    "; + } + /** + * Returns the appropriate scale for the given resolution and units. + * @return {number} The appropriate scale. + */ + getScaleForResolution() { + const e = DA( + this.viewState_.projection, + this.viewState_.resolution, + this.viewState_.center, + "m" + ), t = this.dpi_ || ta, i = 1e3 / 25.4; + return e * i * t; + } + /** + * Update the scale line element. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + const t = e.frameState; + t ? this.viewState_ = t.viewState : this.viewState_ = null, this.updateElement_(); + } +} +const ia = { + VERTICAL: 0, + HORIZONTAL: 1 +}; +class XO extends Kn { + /** + * @param {Options} [options] Zoom slider options. + */ + constructor(e) { + e = e || {}, super({ + target: e.target, + element: document.createElement("div"), + render: e.render + }), this.dragListenerKeys_ = [], this.currentResolution_ = void 0, this.direction_ = ia.VERTICAL, this.dragging_, this.heightLimit_ = 0, this.widthLimit_ = 0, this.startX_, this.startY_, this.thumbSize_ = null, this.sliderInitialized_ = !1, this.duration_ = e.duration !== void 0 ? e.duration : 200; + const t = e.className !== void 0 ? e.className : "ol-zoomslider", i = document.createElement("button"); + i.setAttribute("type", "button"), i.className = t + "-thumb " + In; + const r = this.element; + r.className = t + " " + In + " " + As, r.appendChild(i), r.addEventListener( + ln.POINTERDOWN, + this.handleDraggerStart_.bind(this), + !1 + ), r.addEventListener( + ln.POINTERMOVE, + this.handleDraggerDrag_.bind(this), + !1 + ), r.addEventListener( + ln.POINTERUP, + this.handleDraggerEnd_.bind(this), + !1 + ), r.addEventListener( + j.CLICK, + this.handleContainerClick_.bind(this), + !1 + ), i.addEventListener(j.CLICK, bC, !1); + } + /** + * Remove the control from its current map and attach it to the new map. + * Pass `null` to just remove the control from the current map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {import("../Map.js").default|null} map Map. + * @api + * @override + */ + setMap(e) { + super.setMap(e), e && e.render(); + } + /** + * Initializes the slider element. This will determine and set this controls + * direction_ and also constrain the dragging of the thumb to always be within + * the bounds of the container. + * + * @return {boolean} Initialization successful + * @private + */ + initSlider_() { + const e = this.element; + let t = e.offsetWidth, i = e.offsetHeight; + if (t === 0 && i === 0) + return this.sliderInitialized_ = !1; + const r = getComputedStyle(e); + t -= parseFloat(r.paddingRight) + parseFloat(r.paddingLeft), i -= parseFloat(r.paddingTop) + parseFloat(r.paddingBottom); + const s = ( + /** @type {HTMLElement} */ + e.firstElementChild + ), o = getComputedStyle(s), a = s.offsetWidth + parseFloat(o.marginRight) + parseFloat(o.marginLeft), l = s.offsetHeight + parseFloat(o.marginTop) + parseFloat(o.marginBottom); + return this.thumbSize_ = [a, l], t > i ? (this.direction_ = ia.HORIZONTAL, this.widthLimit_ = t - a) : (this.direction_ = ia.VERTICAL, this.heightLimit_ = i - l), this.sliderInitialized_ = !0; + } + /** + * @param {PointerEvent} event The browser event to handle. + * @private + */ + handleContainerClick_(e) { + const t = this.getMap().getView(), i = this.getRelativePosition_( + e.offsetX - this.thumbSize_[0] / 2, + e.offsetY - this.thumbSize_[1] / 2 + ), r = this.getResolutionForPosition_(i), s = t.getConstrainedZoom(t.getZoomForResolution(r)); + t.animateInternal({ + zoom: s, + duration: this.duration_, + easing: rs + }); + } + /** + * Handle dragger start events. + * @param {PointerEvent} event The drag event. + * @private + */ + handleDraggerStart_(e) { + if (!this.dragging_ && e.target === this.element.firstElementChild) { + const t = ( + /** @type {HTMLElement} */ + this.element.firstElementChild + ); + if (this.getMap().getView().beginInteraction(), this.startX_ = e.clientX - parseFloat(t.style.left), this.startY_ = e.clientY - parseFloat(t.style.top), this.dragging_ = !0, this.dragListenerKeys_.length === 0) { + const i = this.handleDraggerDrag_, r = this.handleDraggerEnd_, s = this.getMap().getOwnerDocument(); + this.dragListenerKeys_.push( + ie(s, ln.POINTERMOVE, i, this), + ie(s, ln.POINTERUP, r, this) + ); + } + } + } + /** + * Handle dragger drag events. + * + * @param {PointerEvent} event The drag event. + * @private + */ + handleDraggerDrag_(e) { + if (this.dragging_) { + const t = e.clientX - this.startX_, i = e.clientY - this.startY_, r = this.getRelativePosition_(t, i); + this.currentResolution_ = this.getResolutionForPosition_(r), this.getMap().getView().setResolution(this.currentResolution_); + } + } + /** + * Handle dragger end events. + * @param {PointerEvent} event The drag event. + * @private + */ + handleDraggerEnd_(e) { + this.dragging_ && (this.getMap().getView().endInteraction(), this.dragging_ = !1, this.startX_ = void 0, this.startY_ = void 0, this.dragListenerKeys_.forEach(Re), this.dragListenerKeys_.length = 0); + } + /** + * Positions the thumb inside its container according to the given resolution. + * + * @param {number} res The res. + * @private + */ + setThumbPosition_(e) { + const t = this.getPositionForResolution_(e), i = ( + /** @type {HTMLElement} */ + this.element.firstElementChild + ); + this.direction_ == ia.HORIZONTAL ? i.style.left = this.widthLimit_ * t + "px" : i.style.top = this.heightLimit_ * t + "px"; + } + /** + * Calculates the relative position of the thumb given x and y offsets. The + * relative position scales from 0 to 1. The x and y offsets are assumed to be + * in pixel units within the dragger limits. + * + * @param {number} x Pixel position relative to the left of the slider. + * @param {number} y Pixel position relative to the top of the slider. + * @return {number} The relative position of the thumb. + * @private + */ + getRelativePosition_(e, t) { + let i; + return this.direction_ === ia.HORIZONTAL ? i = e / this.widthLimit_ : i = t / this.heightLimit_, ue(i, 0, 1); + } + /** + * Calculates the corresponding resolution of the thumb given its relative + * position (where 0 is the minimum and 1 is the maximum). + * + * @param {number} position The relative position of the thumb. + * @return {number} The corresponding resolution. + * @private + */ + getResolutionForPosition_(e) { + return this.getMap().getView().getResolutionForValueFunction()(1 - e); + } + /** + * Determines the relative position of the slider for the given resolution. A + * relative position of 0 corresponds to the minimum view resolution. A + * relative position of 1 corresponds to the maximum view resolution. + * + * @param {number} res The resolution. + * @return {number} The relative position value (between 0 and 1). + * @private + */ + getPositionForResolution_(e) { + const t = this.getMap().getView().getValueForResolutionFunction(); + return ue(1 - t(e), 0, 1); + } + /** + * Update the zoomslider element. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @override + */ + render(e) { + if (!e.frameState || !this.sliderInitialized_ && !this.initSlider_()) + return; + const t = e.frameState.viewState.resolution; + this.currentResolution_ = t, this.setThumbPosition_(t); + } +} +class qO extends Kn { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super({ + element: document.createElement("div"), + target: e.target + }), this.extent = e.extent ? e.extent : null; + const t = e.className !== void 0 ? e.className : "ol-zoom-extent", i = e.label !== void 0 ? e.label : "E", r = e.tipLabel !== void 0 ? e.tipLabel : "Fit to extent", s = document.createElement("button"); + s.setAttribute("type", "button"), s.title = r, s.appendChild( + typeof i == "string" ? document.createTextNode(i) : i + ), s.addEventListener( + j.CLICK, + this.handleClick_.bind(this), + !1 + ); + const o = t + " " + In + " " + As, a = this.element; + a.className = o, a.appendChild(s); + } + /** + * @param {MouseEvent} event The event to handle + * @private + */ + handleClick_(e) { + e.preventDefault(), this.handleZoomToExtent(); + } + /** + * @protected + */ + handleZoomToExtent() { + const t = this.getMap().getView(), i = this.extent ? Vt(this.extent, t.getProjection()) : t.getProjection().getExtent(); + t.fitInternal(co(i)); + } +} +const tB = { + /** + * Triggered upon snapping to vertex or edge + * @event SnapEvent#snap + * @api + */ + SNAP: "snap" +}; +class iB extends xt { + /** + * @param {SnapEventType} type Type. + * @param {Object} options Options. + * @param {import("../coordinate.js").Coordinate} options.vertex The snapped vertex. + * @param {import("../coordinate.js").Coordinate} options.vertexPixel The pixel of the snapped vertex. + * @param {import("../Feature.js").default} options.feature The feature being snapped. + * @param {Array|null} options.segment Segment, or `null` if snapped to a vertex. + */ + constructor(e, t) { + super(e), this.vertex = t.vertex, this.vertexPixel = t.vertexPixel, this.feature = t.feature, this.segment = t.segment; + } +} +class nB { + /** + * @param {string} name The name of the texture. + * @param {Uint8Array} data The texture data. + */ + constructor(e, t) { + this.name = e, this.data = t, this.texture_ = null; + } + /** + * @param {WebGLRenderingContext} gl Rendering context. + * @return {WebGLTexture} The texture. + */ + getTexture(e) { + if (!this.texture_) { + const t = e.createTexture(); + e.bindTexture(e.TEXTURE_2D, t), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texImage2D( + e.TEXTURE_2D, + 0, + e.RGBA, + this.data.length / 4, + 1, + 0, + e.RGBA, + e.UNSIGNED_BYTE, + this.data + ), this.texture_ = t; + } + return this.texture_; + } + /** + * @param {WebGLRenderingContext} gl Rendering context. + */ + delete(e) { + this.texture_ && e.deleteTexture(this.texture_), this.texture_ = null; + } +} +const Wg = 0.5, rB = 10, rm = 0.25; +class Zg { + /** + * @param {import("../proj/Projection.js").default} sourceProj Source projection. + * @param {import("../proj/Projection.js").default} targetProj Target projection. + * @param {import("../extent.js").Extent} targetExtent Target extent to triangulate. + * @param {import("../extent.js").Extent} maxSourceExtent Maximal source extent that can be used. + * @param {number} errorThreshold Acceptable error (in source units). + * @param {?number} destinationResolution The (optional) resolution of the destination. + */ + constructor(e, t, i, r, s, o) { + this.sourceProj_ = e, this.targetProj_ = t; + let a = {}; + const l = Xi(this.targetProj_, this.sourceProj_); + this.transformInv_ = function(p) { + const _ = p[0] + "/" + p[1]; + return a[_] || (a[_] = l(p)), a[_]; + }, this.maxSourceExtent_ = r, this.errorThresholdSquared_ = s * s, this.triangles_ = [], this.wrapsXInSource_ = !1, this.canWrapXInSource_ = this.sourceProj_.canWrapX() && !!r && !!this.sourceProj_.getExtent() && he(r) >= he(this.sourceProj_.getExtent()), this.sourceWorldWidth_ = this.sourceProj_.getExtent() ? he(this.sourceProj_.getExtent()) : null, this.targetWorldWidth_ = this.targetProj_.getExtent() ? he(this.targetProj_.getExtent()) : null; + const A = Ki(i), c = vo(i), h = To(i), u = Hr(i), g = this.transformInv_(A), d = this.transformInv_(c), m = this.transformInv_(h), f = this.transformInv_(u), E = rB + (o ? Math.max( + 0, + Math.ceil( + Math.log2( + Vr(i) / (o * o * 256 * 256) + ) + ) + ) : 0); + if (this.addQuad_( + A, + c, + h, + u, + g, + d, + m, + f, + E + ), this.wrapsXInSource_) { + let p = 1 / 0; + this.triangles_.forEach(function(_, I, y) { + p = Math.min( + p, + _.source[0][0], + _.source[1][0], + _.source[2][0] + ); + }), this.triangles_.forEach((_) => { + if (Math.max( + _.source[0][0], + _.source[1][0], + _.source[2][0] + ) - p > this.sourceWorldWidth_ / 2) { + const I = [ + [_.source[0][0], _.source[0][1]], + [_.source[1][0], _.source[1][1]], + [_.source[2][0], _.source[2][1]] + ]; + I[0][0] - p > this.sourceWorldWidth_ / 2 && (I[0][0] -= this.sourceWorldWidth_), I[1][0] - p > this.sourceWorldWidth_ / 2 && (I[1][0] -= this.sourceWorldWidth_), I[2][0] - p > this.sourceWorldWidth_ / 2 && (I[2][0] -= this.sourceWorldWidth_); + const y = Math.min( + I[0][0], + I[1][0], + I[2][0] + ); + Math.max( + I[0][0], + I[1][0], + I[2][0] + ) - y < this.sourceWorldWidth_ / 2 && (_.source = I); + } + }); + } + a = {}; + } + /** + * Adds triangle to the triangulation. + * @param {import("../coordinate.js").Coordinate} a The target a coordinate. + * @param {import("../coordinate.js").Coordinate} b The target b coordinate. + * @param {import("../coordinate.js").Coordinate} c The target c coordinate. + * @param {import("../coordinate.js").Coordinate} aSrc The source a coordinate. + * @param {import("../coordinate.js").Coordinate} bSrc The source b coordinate. + * @param {import("../coordinate.js").Coordinate} cSrc The source c coordinate. + * @private + */ + addTriangle_(e, t, i, r, s, o) { + this.triangles_.push({ + source: [r, s, o], + target: [e, t, i] + }); + } + /** + * Adds quad (points in clock-wise order) to the triangulation + * (and reprojects the vertices) if valid. + * Performs quad subdivision if needed to increase precision. + * + * @param {import("../coordinate.js").Coordinate} a The target a coordinate. + * @param {import("../coordinate.js").Coordinate} b The target b coordinate. + * @param {import("../coordinate.js").Coordinate} c The target c coordinate. + * @param {import("../coordinate.js").Coordinate} d The target d coordinate. + * @param {import("../coordinate.js").Coordinate} aSrc The source a coordinate. + * @param {import("../coordinate.js").Coordinate} bSrc The source b coordinate. + * @param {import("../coordinate.js").Coordinate} cSrc The source c coordinate. + * @param {import("../coordinate.js").Coordinate} dSrc The source d coordinate. + * @param {number} maxSubdivision Maximal allowed subdivision of the quad. + * @private + */ + addQuad_(e, t, i, r, s, o, a, l, A) { + const c = rt([s, o, a, l]), h = this.sourceWorldWidth_ ? he(c) / this.sourceWorldWidth_ : null, u = ( + /** @type {number} */ + this.sourceWorldWidth_ + ), g = this.sourceProj_.canWrapX() && h > 0.5 && h < 1; + let d = !1; + if (A > 0) { + if (this.targetProj_.isGlobal() && this.targetWorldWidth_) { + const f = rt([e, t, i, r]); + d = he(f) / this.targetWorldWidth_ > rm || d; + } + !g && this.sourceProj_.isGlobal() && h && (d = h > rm || d); + } + if (!d && this.maxSourceExtent_ && isFinite(c[0]) && isFinite(c[1]) && isFinite(c[2]) && isFinite(c[3]) && !He(c, this.maxSourceExtent_)) + return; + let m = 0; + if (!d && (!isFinite(s[0]) || !isFinite(s[1]) || !isFinite(o[0]) || !isFinite(o[1]) || !isFinite(a[0]) || !isFinite(a[1]) || !isFinite(l[0]) || !isFinite(l[1]))) { + if (A > 0) + d = !0; + else if (m = (!isFinite(s[0]) || !isFinite(s[1]) ? 8 : 0) + (!isFinite(o[0]) || !isFinite(o[1]) ? 4 : 0) + (!isFinite(a[0]) || !isFinite(a[1]) ? 2 : 0) + (!isFinite(l[0]) || !isFinite(l[1]) ? 1 : 0), m != 1 && m != 2 && m != 4 && m != 8) + return; + } + if (A > 0) { + if (!d) { + const f = [(e[0] + i[0]) / 2, (e[1] + i[1]) / 2], E = this.transformInv_(f); + let p; + g ? p = (Li(s[0], u) + Li(a[0], u)) / 2 - Li(E[0], u) : p = (s[0] + a[0]) / 2 - E[0]; + const _ = (s[1] + a[1]) / 2 - E[1]; + d = p * p + _ * _ > this.errorThresholdSquared_; + } + if (d) { + if (Math.abs(e[0] - i[0]) <= Math.abs(e[1] - i[1])) { + const f = [(t[0] + i[0]) / 2, (t[1] + i[1]) / 2], E = this.transformInv_(f), p = [(r[0] + e[0]) / 2, (r[1] + e[1]) / 2], _ = this.transformInv_(p); + this.addQuad_( + e, + t, + f, + p, + s, + o, + E, + _, + A - 1 + ), this.addQuad_( + p, + f, + i, + r, + _, + E, + a, + l, + A - 1 + ); + } else { + const f = [(e[0] + t[0]) / 2, (e[1] + t[1]) / 2], E = this.transformInv_(f), p = [(i[0] + r[0]) / 2, (i[1] + r[1]) / 2], _ = this.transformInv_(p); + this.addQuad_( + e, + f, + p, + r, + s, + E, + _, + l, + A - 1 + ), this.addQuad_( + f, + t, + i, + p, + E, + o, + a, + _, + A - 1 + ); + } + return; + } + } + if (g) { + if (!this.canWrapXInSource_) + return; + this.wrapsXInSource_ = !0; + } + m & 11 || this.addTriangle_(e, i, r, s, a, l), m & 14 || this.addTriangle_(e, i, t, s, a, o), m && (m & 13 || this.addTriangle_(t, r, e, o, l, s), m & 7 || this.addTriangle_(t, r, i, o, l, a)); + } + /** + * Calculates extent of the `source` coordinates from all the triangles. + * + * @return {import("../extent.js").Extent} Calculated extent. + */ + calculateSourceExtent() { + const e = Ft(); + return this.triangles_.forEach(function(t, i, r) { + const s = t.source; + qs(e, s[0]), qs(e, s[1]), qs(e, s[2]); + }), e; + } + /** + * @return {Array} Array of the calculated triangles. + */ + getTriangles() { + return this.triangles_; + } +} +let yh; +const zn = []; +function sm(n, e, t, i, r) { + n.beginPath(), n.moveTo(0, 0), n.lineTo(e, t), n.lineTo(i, r), n.closePath(), n.save(), n.clip(), n.fillRect(0, 0, Math.max(e, i) + 1, Math.max(t, r)), n.restore(); +} +function wh(n, e) { + return Math.abs(n[e * 4] - 210) > 2 || Math.abs(n[e * 4 + 3] - 0.75 * 255) > 2; +} +function sB() { + if (yh === void 0) { + const n = Ve(6, 6, zn); + n.globalCompositeOperation = "lighter", n.fillStyle = "rgba(210, 0, 0, 0.75)", sm(n, 4, 5, 4, 0), sm(n, 4, 5, 0, 5); + const e = n.getImageData(0, 0, 3, 3).data; + yh = wh(e, 0) || wh(e, 4) || wh(e, 8), zr(n), zn.push(n.canvas); + } + return yh; +} +function Ua(n, e, t, i) { + const r = as(t, e, n); + let s = DA( + e, + i, + t + ); + const o = e.getMetersPerUnit(); + o !== void 0 && (s *= o); + const a = n.getMetersPerUnit(); + a !== void 0 && (s /= a); + const l = n.getExtent(); + if (!l || mi(l, r)) { + const A = DA(n, s, r) / s; + isFinite(A) && A > 0 && (s /= A); + } + return s; +} +function I_(n, e, t, i) { + const r = Dt(t); + let s = Ua( + n, + e, + r, + i + ); + return (!isFinite(s) || s <= 0) && gg(t, function(o) { + return s = Ua( + n, + e, + o, + i + ), isFinite(s) && s > 0; + }), s; +} +function Jg(n, e, t, i, r, s, o, a, l, A, c, h, u, g) { + const d = Ve( + Math.round(t * n), + Math.round(t * e), + zn + ); + if (h || (d.imageSmoothingEnabled = !1), l.length === 0) + return d.canvas; + d.scale(t, t); + function m(y) { + return Math.round(y * t) / t; + } + d.globalCompositeOperation = "lighter"; + const f = Ft(); + l.forEach(function(y, C, w) { + Sp(f, y.extent); + }); + let E; + const p = t / i, _ = (h ? 1 : 1 + Math.pow(2, -24)) / p; + if (!u || l.length !== 1 || A !== 0) { + if (E = Ve( + Math.round(he(f) * p), + Math.round(ze(f) * p), + zn + ), h || (E.imageSmoothingEnabled = !1), r && g) { + const y = (r[0] - f[0]) * p, C = -(r[3] - f[3]) * p, w = he(r) * p, x = ze(r) * p; + E.rect(y, C, w, x), E.clip(); + } + l.forEach(function(y, C, w) { + if (y.image.width > 0 && y.image.height > 0) { + if (y.clipExtent) { + E.save(); + const v = (y.clipExtent[0] - f[0]) * p, F = -(y.clipExtent[3] - f[3]) * p, P = he(y.clipExtent) * p, L = ze(y.clipExtent) * p; + E.rect( + h ? v : Math.round(v), + h ? F : Math.round(F), + h ? P : Math.round(v + P) - Math.round(v), + h ? L : Math.round(F + L) - Math.round(F) + ), E.clip(); + } + const x = (y.extent[0] - f[0]) * p, B = -(y.extent[3] - f[3]) * p, T = he(y.extent) * p, S = ze(y.extent) * p; + E.drawImage( + y.image, + A, + A, + y.image.width - 2 * A, + y.image.height - 2 * A, + h ? x : Math.round(x), + h ? B : Math.round(B), + h ? T : Math.round(x + T) - Math.round(x), + h ? S : Math.round(B + S) - Math.round(B) + ), y.clipExtent && E.restore(); + } + }); + } + const I = Ki(o); + return a.getTriangles().forEach(function(y, C, w) { + const x = y.source, B = y.target; + let T = x[0][0], S = x[0][1], v = x[1][0], F = x[1][1], P = x[2][0], L = x[2][1]; + const Q = m((B[0][0] - I[0]) / s), N = m( + -(B[0][1] - I[1]) / s + ), G = m((B[1][0] - I[0]) / s), Y = m( + -(B[1][1] - I[1]) / s + ), z = m((B[2][0] - I[0]) / s), H = m( + -(B[2][1] - I[1]) / s + ), K = T, de = S; + T = 0, S = 0, v -= K, F -= de, P -= K, L -= de; + const M = [ + [v, F, 0, 0, G - Q], + [P, L, 0, 0, z - Q], + [0, 0, v, F, Y - N], + [0, 0, P, L, H - N] + ], te = Cy(M); + if (!te) + return; + if (d.save(), d.beginPath(), sB() || !h) { + d.moveTo(G, Y); + const le = 4, we = Q - G, Ne = N - Y; + for (let De = 0; De < le; De++) + d.lineTo( + G + m((De + 1) * we / le), + Y + m(De * Ne / (le - 1)) + ), De != le - 1 && d.lineTo( + G + m((De + 1) * we / le), + Y + m((De + 1) * Ne / (le - 1)) + ); + d.lineTo(z, H); + } else + d.moveTo(G, Y), d.lineTo(Q, N), d.lineTo(z, H); + d.clip(), d.transform( + te[0], + te[2], + te[1], + te[3], + Q, + N + ), d.translate( + f[0] - K, + f[3] - de + ); + let Z; + if (E) + Z = E.canvas, d.scale(_, -_); + else { + const le = l[0], we = le.extent; + Z = le.image, d.scale( + he(we) / Z.width, + -ze(we) / Z.height + ); + } + d.drawImage(Z, 0, 0), d.restore(); + }), E && (zr(E), zn.push(E.canvas)), c && (d.save(), d.globalCompositeOperation = "source-over", d.strokeStyle = "black", d.lineWidth = 1, a.getTriangles().forEach(function(y, C, w) { + const x = y.target, B = (x[0][0] - I[0]) / s, T = -(x[0][1] - I[1]) / s, S = (x[1][0] - I[0]) / s, v = -(x[1][1] - I[1]) / s, F = (x[2][0] - I[0]) / s, P = -(x[2][1] - I[1]) / s; + d.beginPath(), d.moveTo(S, v), d.lineTo(B, T), d.lineTo(F, P), d.closePath(), d.stroke(); + }), d.restore()), d.canvas; +} +class Lc extends Ta { + /** + * @param {Options} options Tile options. + */ + constructor(e) { + super({ + tileCoord: e.tileCoord, + loader: () => Promise.resolve(new Uint8ClampedArray(4)), + interpolate: e.interpolate, + transition: e.transition + }), this.pixelRatio_ = e.pixelRatio, this.gutter_ = e.gutter, this.reprojData_ = null, this.reprojError_ = null, this.reprojSize_ = void 0, this.sourceTileGrid_ = e.sourceTileGrid, this.targetTileGrid_ = e.targetTileGrid, this.wrappedTileCoord_ = e.wrappedTileCoord || e.tileCoord, this.sourceTiles_ = [], this.sourcesListenerKeys_ = null, this.sourceZ_ = 0; + const t = e.sourceProj, i = t.getExtent(), r = e.sourceTileGrid.getExtent(); + this.clipExtent_ = t.canWrapX() ? r ? tt(i, r) : i : r; + const s = this.targetTileGrid_.getTileCoordExtent( + this.wrappedTileCoord_ + ), o = this.targetTileGrid_.getExtent(); + let a = this.sourceTileGrid_.getExtent(); + const l = o ? tt(s, o) : s; + if (Vr(l) === 0) { + this.state = $.EMPTY; + return; + } + i && (a ? a = tt(a, i) : a = i); + const A = this.targetTileGrid_.getResolution( + this.wrappedTileCoord_[0] + ), c = e.targetProj, h = I_( + t, + c, + l, + A + ); + if (!isFinite(h) || h <= 0) { + this.state = $.EMPTY; + return; + } + const u = e.errorThreshold !== void 0 ? e.errorThreshold : Wg; + if (this.triangulation_ = new Zg( + t, + c, + l, + a, + h * u, + A + ), this.triangulation_.getTriangles().length === 0) { + this.state = $.EMPTY; + return; + } + this.sourceZ_ = this.sourceTileGrid_.getZForResolution(h); + let g = this.triangulation_.calculateSourceExtent(); + if (a && (t.canWrapX() ? (g[1] = ue( + g[1], + a[1], + a[3] + ), g[3] = ue( + g[3], + a[1], + a[3] + )) : g = tt(g, a)), !Vr(g)) + this.state = $.EMPTY; + else { + let d = 0, m = 0; + t.canWrapX() && (d = he(i), m = Math.floor( + (g[0] - i[0]) / d + )), mg( + g.slice(), + t, + !0 + ).forEach((E) => { + const p = this.sourceTileGrid_.getTileRangeForExtentAndZ( + E, + this.sourceZ_ + ), _ = e.getTileFunction; + for (let I = p.minX; I <= p.maxX; I++) + for (let y = p.minY; y <= p.maxY; y++) { + const C = _(this.sourceZ_, I, y, this.pixelRatio_); + if (C) { + const w = m * d; + this.sourceTiles_.push({ tile: C, offset: w }); + } + } + ++m; + }), this.sourceTiles_.length === 0 && (this.state = $.EMPTY); + } + } + /** + * Get the tile size. + * @return {import('../size.js').Size} Tile size. + * @override + */ + getSize() { + return this.reprojSize_; + } + /** + * Get the data for the tile. + * @return {import("../DataTile.js").Data} Tile data. + * @override + */ + getData() { + return this.reprojData_; + } + /** + * Get any loading error. + * @return {Error} Loading error. + * @override + */ + getError() { + return this.reprojError_; + } + /** + * @private + */ + reproject_() { + const e = []; + let t = !1; + if (this.sourceTiles_.forEach((d) => { + var N; + const m = d.tile; + if (!m || m.getState() !== $.LOADED) + return; + const f = m.getSize(), E = this.gutter_; + let p; + const _ = _u(m.getData()); + _ ? p = _ : (t = !0, p = WC(so(m.getData()))); + const I = [f[0] + 2 * E, f[1] + 2 * E], y = p instanceof Float32Array, C = I[0] * I[1], w = y ? Float32Array : Uint8ClampedArray, x = new w(p.buffer), B = w.BYTES_PER_ELEMENT, T = B * x.length / C, S = x.byteLength / I[1], v = Math.floor( + S / B / I[0] + ), F = C * v; + let P = x; + if (x.length !== F) { + P = new w(F); + let G = 0, Y = 0; + const z = I[0] * v; + for (let H = 0; H < I[1]; ++H) { + for (let K = 0; K < z; ++K) + P[G++] = x[Y + K]; + Y += S / B; + } + } + const L = this.sourceTileGrid_.getTileCoordExtent(m.tileCoord); + L[0] += d.offset, L[2] += d.offset; + const Q = (N = this.clipExtent_) == null ? void 0 : N.slice(); + Q && (Q[0] += d.offset, Q[2] += d.offset), e.push({ + extent: L, + clipExtent: Q, + data: new Uint8ClampedArray(P.buffer), + dataType: w, + bytesPerPixel: T, + pixelSize: I + }); + }), this.sourceTiles_.length = 0, e.length === 0) { + this.state = $.ERROR, this.changed(); + return; + } + const i = this.wrappedTileCoord_[0], r = this.targetTileGrid_.getTileSize(i), s = typeof r == "number" ? r : r[0], o = typeof r == "number" ? r : r[1], a = this.targetTileGrid_.getResolution(i), l = this.sourceTileGrid_.getResolution(this.sourceZ_), A = this.targetTileGrid_.getTileCoordExtent( + this.wrappedTileCoord_ + ); + let c, h; + const u = e[0].bytesPerPixel, g = Math.ceil(u / 3); + for (let d = g - 1; d >= 0; --d) { + const m = []; + for (let y = 0, C = e.length; y < C; ++y) { + const w = e[y], x = w.data, B = w.pixelSize, T = B[0], S = B[1], v = Ve(T, S, zn), F = v.createImageData(T, S), P = F.data; + let L = d * 3; + for (let Q = 0, N = P.length; Q < N; Q += 4) + P[Q] = x[L], P[Q + 1] = x[L + 1], P[Q + 2] = x[L + 2], P[Q + 3] = 255, L += u; + v.putImageData(F, 0, 0), m.push({ + extent: w.extent, + clipExtent: w.clipExtent, + image: v.canvas + }); + } + const f = Jg( + s, + o, + this.pixelRatio_, + l, + this.sourceTileGrid_.getExtent(), + a, + A, + this.triangulation_, + m, + this.gutter_, + !1, + !1, + !1 + ); + for (let y = 0, C = m.length; y < C; ++y) { + const x = m[y].image.getContext("2d"); + zr(x), zn.push(x.canvas); + } + const E = f.getContext("2d"), p = E.getImageData(0, 0, f.width, f.height); + zr(E), zn.push(f), c || (h = new Uint8ClampedArray( + u * p.width * p.height + ), c = new e[0].dataType(h.buffer)); + const _ = p.data; + let I = d * 3; + for (let y = 0, C = _.length; y < C; y += 4) + _[y + 3] === 255 ? (h[I] = _[y], h[I + 1] = _[y + 1], h[I + 2] = _[y + 2]) : (h[I] = 0, h[I + 1] = 0, h[I + 2] = 0), I += u; + } + if (t) { + const d = Ve(s, o), m = new ImageData(c, s); + d.putImageData(m, 0, 0), this.reprojData_ = d.canvas; + } else + this.reprojData_ = c; + this.reprojSize_ = [ + Math.round(s * this.pixelRatio_), + Math.round(o * this.pixelRatio_) + ], this.state = $.LOADED, this.changed(); + } + /** + * Load not yet loaded URI. + * @override + */ + load() { + if (this.state !== $.IDLE && this.state !== $.ERROR) + return; + this.state = $.LOADING, this.changed(); + let e = 0; + this.sourcesListenerKeys_ = [], this.sourceTiles_.forEach(({ tile: t }) => { + const i = t.getState(); + if (i !== $.IDLE && i !== $.LOADING) + return; + e++; + const r = ie(t, j.CHANGE, () => { + const s = t.getState(); + (s == $.LOADED || s == $.ERROR || s == $.EMPTY) && (Re(r), e--, e === 0 && (this.unlistenSources_(), this.reproject_())); + }); + this.sourcesListenerKeys_.push(r); + }), e === 0 ? setTimeout(this.reproject_.bind(this), 0) : this.sourceTiles_.forEach(function({ tile: t }) { + t.getState() == $.IDLE && t.load(); + }); + } + /** + * @private + */ + unlistenSources_() { + this.sourcesListenerKeys_.forEach(Re), this.sourcesListenerKeys_ = null; + } +} +class mo extends Ro { + /** + * @param {import("../proj/Projection.js").default} sourceProj Source projection. + * @param {import("../tilegrid/TileGrid.js").default} sourceTileGrid Source tile grid. + * @param {import("../proj/Projection.js").default} targetProj Target projection. + * @param {import("../tilegrid/TileGrid.js").default} targetTileGrid Target tile grid. + * @param {import("../tilecoord.js").TileCoord} tileCoord Coordinate of the tile. + * @param {import("../tilecoord.js").TileCoord} wrappedTileCoord Coordinate of the tile wrapped in X. + * @param {number} pixelRatio Pixel ratio. + * @param {number} gutter Gutter of the source tiles. + * @param {FunctionType} getTileFunction + * Function returning source tiles (z, x, y, pixelRatio). + * @param {number} [errorThreshold] Acceptable reprojection error (in px). + * @param {boolean} [renderEdges] Render reprojection edges. + * @param {import("../Tile.js").Options} [options] Tile options. + */ + constructor(e, t, i, r, s, o, a, l, A, c, h, u) { + super(s, $.IDLE, u), this.renderEdges_ = h !== void 0 ? h : !1, this.pixelRatio_ = a, this.gutter_ = l, this.canvas_ = null, this.sourceTileGrid_ = t, this.targetTileGrid_ = r, this.wrappedTileCoord_ = o || s, this.sourceTiles_ = [], this.sourcesListenerKeys_ = null, this.sourceZ_ = 0, this.clipExtent_ = e.canWrapX() ? e.getExtent() : void 0; + const g = r.getTileCoordExtent( + this.wrappedTileCoord_ + ), d = this.targetTileGrid_.getExtent(); + let m = this.sourceTileGrid_.getExtent(); + const f = d ? tt(g, d) : g; + if (Vr(f) === 0) { + this.state = $.EMPTY; + return; + } + const E = e.getExtent(); + E && (m ? m = tt(m, E) : m = E); + const p = r.getResolution( + this.wrappedTileCoord_[0] + ), _ = I_( + e, + i, + f, + p + ); + if (!isFinite(_) || _ <= 0) { + this.state = $.EMPTY; + return; + } + const I = c !== void 0 ? c : Wg; + if (this.triangulation_ = new Zg( + e, + i, + f, + m, + _ * I, + p + ), this.triangulation_.getTriangles().length === 0) { + this.state = $.EMPTY; + return; + } + this.sourceZ_ = t.getZForResolution(_); + let y = this.triangulation_.calculateSourceExtent(); + if (m && (e.canWrapX() ? (y[1] = ue( + y[1], + m[1], + m[3] + ), y[3] = ue( + y[3], + m[1], + m[3] + )) : y = tt(y, m)), !Vr(y)) + this.state = $.EMPTY; + else { + let C = 0, w = 0; + e.canWrapX() && (C = he(E), w = Math.floor( + (y[0] - E[0]) / C + )), mg( + y.slice(), + e, + !0 + ).forEach((B) => { + const T = t.getTileRangeForExtentAndZ( + B, + this.sourceZ_ + ); + for (let S = T.minX; S <= T.maxX; S++) + for (let v = T.minY; v <= T.maxY; v++) { + const F = A(this.sourceZ_, S, v, a); + if (F) { + const P = w * C; + this.sourceTiles_.push({ tile: F, offset: P }); + } + } + ++w; + }), this.sourceTiles_.length === 0 && (this.state = $.EMPTY); + } + } + /** + * Get the HTML Canvas element for this tile. + * @return {HTMLCanvasElement} Canvas. + */ + getImage() { + return this.canvas_; + } + /** + * @private + */ + reproject_() { + const e = []; + if (this.sourceTiles_.forEach((t) => { + var r; + const i = t.tile; + if (i && i.getState() == $.LOADED) { + const s = this.sourceTileGrid_.getTileCoordExtent(i.tileCoord); + s[0] += t.offset, s[2] += t.offset; + const o = (r = this.clipExtent_) == null ? void 0 : r.slice(); + o && (o[0] += t.offset, o[2] += t.offset), e.push({ + extent: s, + clipExtent: o, + image: i.getImage() + }); + } + }), this.sourceTiles_.length = 0, e.length === 0) + this.state = $.ERROR; + else { + const t = this.wrappedTileCoord_[0], i = this.targetTileGrid_.getTileSize(t), r = typeof i == "number" ? i : i[0], s = typeof i == "number" ? i : i[1], o = this.targetTileGrid_.getResolution(t), a = this.sourceTileGrid_.getResolution( + this.sourceZ_ + ), l = this.targetTileGrid_.getTileCoordExtent( + this.wrappedTileCoord_ + ); + this.canvas_ = Jg( + r, + s, + this.pixelRatio_, + a, + this.sourceTileGrid_.getExtent(), + o, + l, + this.triangulation_, + e, + this.gutter_, + this.renderEdges_, + this.interpolate + ), this.state = $.LOADED; + } + this.changed(); + } + /** + * Load not yet loaded URI. + * @override + */ + load() { + if (this.state == $.IDLE) { + this.state = $.LOADING, this.changed(); + let e = 0; + this.sourcesListenerKeys_ = [], this.sourceTiles_.forEach(({ tile: t }) => { + const i = t.getState(); + if (i == $.IDLE || i == $.LOADING) { + e++; + const r = ie(t, j.CHANGE, (s) => { + const o = t.getState(); + (o == $.LOADED || o == $.ERROR || o == $.EMPTY) && (Re(r), e--, e === 0 && (this.unlistenSources_(), this.reproject_())); + }); + this.sourcesListenerKeys_.push(r); + } + }), e === 0 ? setTimeout(this.reproject_.bind(this), 0) : this.sourceTiles_.forEach(function({ tile: t }, i, r) { + t.getState() == $.IDLE && t.load(); + }); + } + } + /** + * @private + */ + unlistenSources_() { + this.sourcesListenerKeys_.forEach(Re), this.sourcesListenerKeys_ = null; + } + /** + * Remove from the cache due to expiry + * @override + */ + release() { + this.canvas_ && (zr(this.canvas_.getContext("2d")), zn.push(this.canvas_), this.canvas_ = null), super.release(); + } +} +class C_ extends So { + /** + * @param {TileRepresentationOptions} options The tile representation options. + */ + constructor(e) { + super(), this.tile, this.handleTileChange_ = this.handleTileChange_.bind(this), this.gutter = e.gutter || 0, this.helper = e.helper, this.loaded = !1, this.ready = !1; + } + /** + * @param {TileType} tile Tile. + */ + setTile(e) { + if (e !== this.tile) + if (this.tile && this.tile.removeEventListener(j.CHANGE, this.handleTileChange_), this.tile = e, this.loaded = e.getState() === $.LOADED, this.loaded) + this.uploadTile(); + else { + if (e instanceof ul) { + const t = e.getImage(); + t instanceof Image && !t.crossOrigin && (t.crossOrigin = "anonymous"); + } + e.addEventListener(j.CHANGE, this.handleTileChange_); + } + } + /** + * @abstract + * @protected + */ + uploadTile() { + ae(); + } + setReady() { + this.ready = !0, this.dispatchEvent(j.CHANGE); + } + handleTileChange_() { + this.tile.getState() === $.LOADED && (this.loaded = !0, this.uploadTile()); + } + /** + * @param {import("./Helper.js").default} helper The WebGL helper. + */ + setHelper(e) { + this.helper = e, this.helper && this.loaded && this.uploadTile(); + } + /** + * @override + */ + disposeInternal() { + this.setHelper(null), this.tile.removeEventListener(j.CHANGE, this.handleTileChange_); + } +} +const Ir = 34962, Fo = 34963, oB = 35040, jr = 35044, Ya = 35048, aB = 5121, lB = 5123, AB = 5125, y_ = 5126, om = ["experimental-webgl", "webgl", "webkit-3d", "moz-webgl"]; +function w_(n, e) { + e = Object.assign( + { + preserveDrawingBuffer: !0, + antialias: !zC + // https://bugs.webkit.org/show_bug.cgi?id=237906 + }, + e + ); + const t = om.length; + for (let i = 0; i < t; ++i) + try { + const r = n.getContext(om[i], e); + if (r) + return ( + /** @type {!WebGLRenderingContext} */ + r + ); + } catch { + } + return null; +} +let xh = null; +function jO() { + if (!xh) { + const n = document.createElement("canvas"), e = w_(n); + e && (xh = e.getSupportedExtensions()); + } + return xh; +} +const cB = { + STATIC_DRAW: jr, + STREAM_DRAW: oB, + DYNAMIC_DRAW: Ya +}; +class Cn { + /** + * @param {number} type Buffer type, either ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER. + * @param {number} [usage] Intended usage, either `STATIC_DRAW`, `STREAM_DRAW` or `DYNAMIC_DRAW`. + * Default is `STATIC_DRAW`. + */ + constructor(e, t) { + this.array_ = null, this.type_ = e, Ie( + e === Ir || e === Fo, + "A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`" + ), this.usage_ = t !== void 0 ? t : cB.STATIC_DRAW; + } + /** + * Populates the buffer with an array of the given size (all values will be zeroes). + * @param {number} size Array size + * @return {WebGLArrayBuffer} This + */ + ofSize(e) { + return this.array_ = new (Ul(this.type_))(e), this; + } + /** + * Populates the buffer with an array of the given size. + * @param {Array} array Numerical array + * @return {WebGLArrayBuffer} This + */ + fromArray(e) { + return this.array_ = Ul(this.type_).from(e), this; + } + /** + * Populates the buffer with a raw binary array buffer. + * @param {ArrayBuffer} buffer Raw binary buffer to populate the array with. Note that this buffer must have been + * initialized for the same typed array class. + * @return {WebGLArrayBuffer} This + */ + fromArrayBuffer(e) { + return this.array_ = new (Ul(this.type_))(e), this; + } + /** + * @return {number} Buffer type. + */ + getType() { + return this.type_; + } + /** + * Will return null if the buffer was not initialized + * @return {Float32Array|Uint32Array|null} Array. + */ + getArray() { + return this.array_; + } + /** + * @param {Float32Array|Uint32Array} array Array. + */ + setArray(e) { + const t = Ul(this.type_); + if (!(e instanceof t)) + throw new Error(`Expected ${t}`); + this.array_ = e; + } + /** + * @return {number} Usage. + */ + getUsage() { + return this.usage_; + } + /** + * Will return 0 if the buffer is not initialized + * @return {number} Array size + */ + getSize() { + return this.array_ ? this.array_.length : 0; + } +} +function Ul(n) { + switch (n) { + case Ir: + return Float32Array; + case Fo: + return Uint32Array; + default: + return Float32Array; + } +} +function x_(n, e, t) { + const i = t ? n.LINEAR : n.NEAREST; + n.bindTexture(n.TEXTURE_2D, e), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, n.CLAMP_TO_EDGE), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, n.CLAMP_TO_EDGE), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, i), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, i); +} +function hB(n, e, t, i) { + x_(n, e, i), n.texImage2D(n.TEXTURE_2D, 0, n.RGBA, n.RGBA, n.UNSIGNED_BYTE, t); +} +function am(n, e, t, i, r, s) { + const o = n.getGL(); + let a, l; + t instanceof Float32Array ? (a = o.FLOAT, n.getExtension("OES_texture_float"), l = n.getExtension("OES_texture_float_linear") !== null) : (a = o.UNSIGNED_BYTE, l = !0), x_(o, e, s && l); + const A = t.byteLength / i[1]; + let c = 1; + A % 8 === 0 ? c = 8 : A % 4 === 0 ? c = 4 : A % 2 === 0 && (c = 2); + let h; + switch (r) { + case 1: { + h = o.LUMINANCE; + break; + } + case 2: { + h = o.LUMINANCE_ALPHA; + break; + } + case 3: { + h = o.RGB; + break; + } + case 4: { + h = o.RGBA; + break; + } + default: + throw new Error(`Unsupported number of bands: ${r}`); + } + const u = o.getParameter(o.UNPACK_ALIGNMENT); + o.pixelStorei(o.UNPACK_ALIGNMENT, c), o.texImage2D( + o.TEXTURE_2D, + 0, + h, + i[0], + i[1], + 0, + h, + a, + t + ), o.pixelStorei(o.UNPACK_ALIGNMENT, u); +} +let Ns = null; +function uB() { + Ns = Ve(1, 1, void 0, { + willReadFrequently: !0 + }); +} +class gB extends C_ { + /** + * @param {import("./BaseTileRepresentation.js").TileRepresentationOptions} options The tile texture options. + */ + constructor(e) { + super(e), this.textures = [], this.renderSize_ = qe( + e.grid.getTileSize(e.tile.tileCoord[0]) + ), this.bandCount = NaN; + const t = new Cn(Ir, jr); + t.fromArray([ + 0, + // P0 + 1, + 1, + // P1 + 1, + 1, + // P2 + 0, + 0, + // P3 + 0 + ]), this.helper.flushBufferData(t), this.coords = t, this.setTile(e.tile); + } + /** + * @override + * @param {import("./Helper.js").default} helper The WebGL helper. + */ + setHelper(e) { + var i; + const t = (i = this.helper) == null ? void 0 : i.getGL(); + if (t) { + this.helper.deleteBuffer(this.coords); + for (let r = 0; r < this.textures.length; ++r) + t.deleteTexture(this.textures[r]); + } + super.setHelper(e), e && e.flushBufferData(this.coords); + } + /** + * @override + */ + uploadTile() { + const e = this.helper, t = e.getGL(), i = this.tile; + this.textures.length = 0; + let r; + i instanceof ul || i instanceof mo ? r = i.getImage() : r = i.getData(); + const s = so(r); + if (s) { + const p = t.createTexture(); + this.textures.push(p), this.bandCount = 4, hB(t, p, s, i.interpolate), this.setReady(); + return; + } + r = _u(r); + const o = ( + /** @type {DataTile} */ + i.getSize() + ), a = [ + o[0] + 2 * this.gutter, + o[1] + 2 * this.gutter + ], l = r instanceof Float32Array, A = a[0] * a[1], c = l ? Float32Array : Uint8Array, h = c.BYTES_PER_ELEMENT, u = r.byteLength / a[1]; + this.bandCount = Math.floor(u / h / a[0]); + const g = Math.ceil(this.bandCount / 4); + if (g === 1) { + const p = t.createTexture(); + this.textures.push(p), am( + e, + p, + r, + a, + this.bandCount, + i.interpolate + ), this.setReady(); + return; + } + const d = new Array(g); + for (let p = 0; p < g; ++p) { + const _ = t.createTexture(); + this.textures.push(_); + const I = p < g - 1 ? 4 : (this.bandCount - 1) % 4 + 1; + d[p] = new c(A * I); + } + let m = 0, f = 0; + const E = a[0] * this.bandCount; + for (let p = 0; p < a[1]; ++p) { + for (let _ = 0; _ < E; ++_) { + const I = r[f + _], y = Math.floor(m / this.bandCount), C = _ % this.bandCount, w = Math.floor(C / 4), x = d[w], B = x.length / A, T = C % 4; + x[y * B + T] = I, ++m; + } + f += u / h; + } + for (let p = 0; p < g; ++p) { + const _ = this.textures[p], I = d[p], y = I.length / A; + am( + e, + _, + I, + a, + y, + i.interpolate + ); + } + this.setReady(); + } + /** + * @param {import("../DataTile.js").ImageLike} image The image. + * @param {number} renderCol The column index (in rendered tile space). + * @param {number} renderRow The row index (in rendered tile space). + * @return {Uint8ClampedArray|null} The data. + * @private + */ + getImagePixelData_(e, t, i) { + const r = this.gutter, s = this.renderSize_[0], o = this.renderSize_[1]; + Ns || uB(), Ns.clearRect(0, 0, 1, 1); + const a = e.width, l = e.height, A = a - 2 * r, c = l - 2 * r, h = r + Math.floor(A * (t / s)), u = r + Math.floor(c * (i / o)); + let g; + try { + Ns.drawImage(e, h, u, 1, 1, 0, 0, 1, 1), g = Ns.getImageData(0, 0, 1, 1).data; + } catch { + return Ns = null, null; + } + return g; + } + /** + * @param {import("../DataTile.js").ArrayLike} data The data. + * @param {import("../size.js").Size} sourceSize The size. + * @param {number} renderCol The column index (in rendered tile space). + * @param {number} renderRow The row index (in rendered tile space). + * @return {import("../DataTile.js").ArrayLike|null} The data. + * @private + */ + getArrayPixelData_(e, t, i, r) { + const s = this.gutter, o = this.renderSize_[0], a = this.renderSize_[1], l = t[0], A = t[1], c = l + 2 * s, h = A + 2 * s, u = s + Math.floor(l * (i / o)), g = s + Math.floor(A * (r / a)); + if (e instanceof DataView) { + const m = e.byteLength / (c * h), f = m * (g * c + u), E = e.buffer.slice(f, f + m); + return new DataView(E); + } + const d = this.bandCount * (g * c + u); + return e.slice(d, d + this.bandCount); + } + /** + * Get data for a pixel. If the tile is not loaded, null is returned. + * @param {number} renderCol The column index (in rendered tile space). + * @param {number} renderRow The row index (in rendered tile space). + * @return {import("../DataTile.js").ArrayLike|null} The data. + */ + getPixelData(e, t) { + if (!this.loaded) + return null; + if (this.tile instanceof Ta) { + const i = this.tile.getData(), r = _u(i); + if (r) { + const s = this.tile.getSize(); + return this.getArrayPixelData_( + r, + s, + e, + t + ); + } + return this.getImagePixelData_(so(i), e, t); + } + return this.getImagePixelData_(this.tile.getImage(), e, t); + } +} +const dB = 5; +class B_ extends rl { + /** + * @param {LayerType} layer Layer. + */ + constructor(e) { + super(), this.ready = !0, this.boundHandleImageChange_ = this.handleImageChange_.bind(this), this.layer_ = e, this.staleKeys_ = new Array(), this.maxStaleKeys = dB; + } + /** + * @return {Array} Get the list of stale keys. + */ + getStaleKeys() { + return this.staleKeys_; + } + /** + * @param {string} key The new stale key. + */ + prependStaleKey(e) { + this.staleKeys_.unshift(e), this.staleKeys_.length > this.maxStaleKeys && (this.staleKeys_.length = this.maxStaleKeys); + } + /** + * Asynchronous layer level hit detection. + * @param {import("../pixel.js").Pixel} pixel Pixel. + * @return {Promise>} Promise that resolves with + * an array of features. + */ + getFeatures(e) { + return ae(); + } + /** + * @param {import("../pixel.js").Pixel} pixel Pixel. + * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data. + */ + getData(e) { + return null; + } + /** + * Determine whether render should be called. + * @abstract + * @param {import("../Map.js").FrameState} frameState Frame state. + * @return {boolean} Layer is ready to be rendered. + */ + prepareFrame(e) { + return ae(); + } + /** + * Render the layer. + * @abstract + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {HTMLElement|null} target Target that may be used to render content to. + * @return {HTMLElement|null} The rendered element. + */ + renderFrame(e, t) { + return ae(); + } + /** + * @abstract + * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {number} hitTolerance Hit tolerance in pixels. + * @param {import("./vector.js").FeatureCallback} callback Feature callback. + * @param {Array>} matches The hit detected matches with tolerance. + * @return {T|undefined} Callback result. + * @template T + */ + forEachFeatureAtCoordinate(e, t, i, r, s) { + } + /** + * @return {LayerType} Layer. + */ + getLayer() { + return this.layer_; + } + /** + * Perform action necessary to get the layer rendered after new fonts have loaded + * @abstract + */ + handleFontsChanged() { + } + /** + * Handle changes in image state. + * @param {import("../events/Event.js").default} event Image change event. + * @private + */ + handleImageChange_(e) { + const t = ( + /** @type {import("../Image.js").default} */ + e.target + ); + (t.getState() === W.LOADED || t.getState() === W.ERROR) && this.renderIfReadyAndVisible(); + } + /** + * Load the image if not already loaded, and register the image change + * listener if needed. + * @param {import("../Image.js").default} image Image. + * @return {boolean} `true` if the image is already loaded, `false` otherwise. + * @protected + */ + loadImage(e) { + let t = e.getState(); + return t != W.LOADED && t != W.ERROR && e.addEventListener(j.CHANGE, this.boundHandleImageChange_), t == W.IDLE && (e.load(), t = e.getState()), t == W.LOADED; + } + /** + * @protected + */ + renderIfReadyAndVisible() { + const e = this.getLayer(); + e && e.getVisible() && e.getSourceState() === "ready" && e.changed(); + } + /** + * @param {import("../Map.js").FrameState} frameState Frame state. + */ + renderDeferred(e) { + } + /** + * Clean up. + * @override + */ + disposeInternal() { + delete this.layer_, super.disposeInternal(); + } +} +const Yl = { + LOST: "webglcontextlost", + RESTORED: "webglcontextrestored" +}, fB = ` + precision mediump float; + + attribute vec2 a_position; + varying vec2 v_texCoord; + varying vec2 v_screenCoord; + + uniform vec2 u_screenSize; + + void main() { + v_texCoord = a_position * 0.5 + 0.5; + v_screenCoord = v_texCoord * u_screenSize; + gl_Position = vec4(a_position, 0.0, 1.0); + } +`, mB = ` + precision mediump float; + + uniform sampler2D u_image; + uniform float u_opacity; + + varying vec2 v_texCoord; + + void main() { + gl_FragColor = texture2D(u_image, v_texCoord) * u_opacity; + } +`; +class lm { + /** + * @param {Options} options Options. + */ + constructor(e) { + this.gl_ = e.webGlContext; + const t = this.gl_; + this.scaleRatio_ = e.scaleRatio || 1, this.renderTargetTexture_ = t.createTexture(), this.renderTargetTextureSize_ = null, this.frameBuffer_ = t.createFramebuffer(), this.depthBuffer_ = t.createRenderbuffer(); + const i = t.createShader(t.VERTEX_SHADER); + t.shaderSource( + i, + e.vertexShader || fB + ), t.compileShader(i); + const r = t.createShader(t.FRAGMENT_SHADER); + t.shaderSource( + r, + e.fragmentShader || mB + ), t.compileShader(r), this.renderTargetProgram_ = t.createProgram(), t.attachShader(this.renderTargetProgram_, i), t.attachShader(this.renderTargetProgram_, r), t.linkProgram(this.renderTargetProgram_), this.renderTargetVerticesBuffer_ = t.createBuffer(); + const s = [-1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1]; + t.bindBuffer(t.ARRAY_BUFFER, this.renderTargetVerticesBuffer_), t.bufferData( + t.ARRAY_BUFFER, + new Float32Array(s), + t.STATIC_DRAW + ), this.renderTargetAttribLocation_ = t.getAttribLocation( + this.renderTargetProgram_, + "a_position" + ), this.renderTargetUniformLocation_ = t.getUniformLocation( + this.renderTargetProgram_, + "u_screenSize" + ), this.renderTargetOpacityLocation_ = t.getUniformLocation( + this.renderTargetProgram_, + "u_opacity" + ), this.renderTargetTextureLocation_ = t.getUniformLocation( + this.renderTargetProgram_, + "u_image" + ), this.uniforms_ = [], e.uniforms && Object.keys(e.uniforms).forEach((o) => { + this.uniforms_.push({ + value: e.uniforms[o], + location: t.getUniformLocation(this.renderTargetProgram_, o) + }); + }); + } + getRenderTargetTexture() { + return this.renderTargetTexture_; + } + /** + * Get the WebGL rendering context + * @return {WebGLRenderingContext} The rendering context. + */ + getGL() { + return this.gl_; + } + /** + * Initialize the render target texture of the post process, make sure it is at the + * right size and bind it as a render target for the next draw calls. + * The last step to be initialized will be the one where the primitives are rendered. + * @param {import("../Map.js").FrameState} frameState current frame state + */ + init(e) { + const t = this.getGL(), i = [ + t.drawingBufferWidth * this.scaleRatio_, + t.drawingBufferHeight * this.scaleRatio_ + ]; + if (t.bindFramebuffer(t.FRAMEBUFFER, this.getFrameBuffer()), t.bindRenderbuffer(t.RENDERBUFFER, this.getDepthBuffer()), t.viewport(0, 0, i[0], i[1]), !this.renderTargetTextureSize_ || this.renderTargetTextureSize_[0] !== i[0] || this.renderTargetTextureSize_[1] !== i[1]) { + this.renderTargetTextureSize_ = i; + const r = 0, s = t.RGBA, o = 0, a = t.RGBA, l = t.UNSIGNED_BYTE, A = null; + t.bindTexture(t.TEXTURE_2D, this.renderTargetTexture_), t.texImage2D( + t.TEXTURE_2D, + r, + s, + i[0], + i[1], + o, + a, + l, + A + ), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.LINEAR), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, t.CLAMP_TO_EDGE), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, t.CLAMP_TO_EDGE), t.framebufferTexture2D( + t.FRAMEBUFFER, + t.COLOR_ATTACHMENT0, + t.TEXTURE_2D, + this.renderTargetTexture_, + 0 + ), t.renderbufferStorage( + t.RENDERBUFFER, + t.DEPTH_COMPONENT16, + i[0], + i[1] + ), t.framebufferRenderbuffer( + t.FRAMEBUFFER, + t.DEPTH_ATTACHMENT, + t.RENDERBUFFER, + this.depthBuffer_ + ); + } + } + /** + * Render to the next postprocessing pass (or to the canvas if final pass). + * @param {import("../Map.js").FrameState} frameState current frame state + * @param {WebGLPostProcessingPass} [nextPass] Next pass, optional + * @param {function(WebGLRenderingContext, import("../Map.js").FrameState):void} [preCompose] Called before composing. + * @param {function(WebGLRenderingContext, import("../Map.js").FrameState):void} [postCompose] Called before composing. + */ + apply(e, t, i, r) { + const s = this.getGL(), o = e.size; + if (s.bindFramebuffer( + s.FRAMEBUFFER, + t ? t.getFrameBuffer() : null + ), s.activeTexture(s.TEXTURE0), s.bindTexture(s.TEXTURE_2D, this.renderTargetTexture_), !t) { + const l = X(s.canvas); + if (!e.renderTargets[l]) { + const A = s.getContextAttributes(); + A && A.preserveDrawingBuffer && (s.clearColor(0, 0, 0, 0), s.clearDepth(1), s.clear(s.COLOR_BUFFER_BIT | s.DEPTH_BUFFER_BIT)), e.renderTargets[l] = !0; + } + } + s.disable(s.DEPTH_TEST), s.enable(s.BLEND), s.blendFunc(s.ONE, s.ONE_MINUS_SRC_ALPHA), s.viewport(0, 0, s.drawingBufferWidth, s.drawingBufferHeight), s.bindBuffer(s.ARRAY_BUFFER, this.renderTargetVerticesBuffer_), s.useProgram(this.renderTargetProgram_), s.enableVertexAttribArray(this.renderTargetAttribLocation_), s.vertexAttribPointer( + this.renderTargetAttribLocation_, + 2, + s.FLOAT, + !1, + 0, + 0 + ), s.uniform2f(this.renderTargetUniformLocation_, o[0], o[1]), s.uniform1i(this.renderTargetTextureLocation_, 0); + const a = e.layerStatesArray[e.layerIndex].opacity; + s.uniform1f(this.renderTargetOpacityLocation_, a), this.applyUniforms(e), i && i(s, e), s.drawArrays(s.TRIANGLES, 0, 6), r && r(s, e); + } + /** + * @return {WebGLFramebuffer} Frame buffer + */ + getFrameBuffer() { + return this.frameBuffer_; + } + /** + * @return {WebGLRenderbuffer} Depth buffer + */ + getDepthBuffer() { + return this.depthBuffer_; + } + /** + * Sets the custom uniforms based on what was given in the constructor. + * @param {import("../Map.js").FrameState} frameState Frame state. + * @private + */ + applyUniforms(e) { + const t = this.getGL(); + let i, r = 1; + this.uniforms_.forEach(function(s) { + if (i = typeof s.value == "function" ? s.value(e) : s.value, i instanceof HTMLCanvasElement || i instanceof ImageData) + s.texture || (s.texture = t.createTexture()), t.activeTexture(t[`TEXTURE${r}`]), t.bindTexture(t.TEXTURE_2D, s.texture), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.LINEAR), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, t.CLAMP_TO_EDGE), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, t.CLAMP_TO_EDGE), i instanceof ImageData ? t.texImage2D( + t.TEXTURE_2D, + 0, + t.RGBA, + t.RGBA, + i.width, + i.height, + 0, + t.UNSIGNED_BYTE, + new Uint8Array(i.data) + ) : t.texImage2D( + t.TEXTURE_2D, + 0, + t.RGBA, + t.RGBA, + t.UNSIGNED_BYTE, + i + ), t.uniform1i(s.location, r++); + else if (Array.isArray(i)) + switch (i.length) { + case 2: + t.uniform2f(s.location, i[0], i[1]); + return; + case 3: + t.uniform3f(s.location, i[0], i[1], i[2]); + return; + case 4: + t.uniform4f( + s.location, + i[0], + i[1], + i[2], + i[3] + ); + return; + default: + return; + } + else typeof i == "number" && t.uniform1f(s.location, i); + }); + } +} +function Fc() { + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; +} +function Ar(n, e) { + return n[0] = e[0], n[1] = e[1], n[4] = e[2], n[5] = e[3], n[12] = e[4], n[13] = e[5], n; +} +const KO = { + FRAGMENT_SHADER: 35632, + VERTEX_SHADER: 35633 +}, Ri = { + PROJECTION_MATRIX: "u_projectionMatrix", + SCREEN_TO_WORLD_MATRIX: "u_screenToWorldMatrix", + TIME: "u_time", + ZOOM: "u_zoom", + RESOLUTION: "u_resolution", + ROTATION: "u_rotation", + VIEWPORT_SIZE_PX: "u_viewportSizePx", + PIXEL_RATIO: "u_pixelRatio", + HIT_DETECTION: "u_hitDetection" +}, At = { + UNSIGNED_BYTE: aB, + UNSIGNED_SHORT: lB, + UNSIGNED_INT: AB, + FLOAT: y_ +}, $A = {}; +function Am(n) { + return "shared/" + n; +} +let cm = 0; +function EB() { + const n = "unique/" + cm; + return cm += 1, n; +} +function pB(n) { + let e = $A[n]; + if (!e) { + const t = document.createElement("canvas"); + t.width = 1, t.height = 1, t.style.position = "absolute", t.style.left = "0", e = { users: 0, context: w_(t) }, $A[n] = e; + } + return e.users += 1, e.context; +} +function _B(n) { + const e = $A[n]; + if (!e || (e.users -= 1, e.users > 0)) + return; + const t = e.context, i = t.getExtension("WEBGL_lose_context"); + i && i.loseContext(); + const r = t.canvas; + r.width = 1, r.height = 1, delete $A[n]; +} +class IB extends Bo { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.boundHandleWebGLContextLost_ = this.handleWebGLContextLost.bind(this), this.boundHandleWebGLContextRestored_ = this.handleWebGLContextRestored.bind(this), this.canvasCacheKey_ = e.canvasCacheKey ? Am(e.canvasCacheKey) : EB(), this.gl_ = pB(this.canvasCacheKey_), this.bufferCache_ = {}, this.extensionCache_ = {}, this.currentProgram_ = null, this.needsToBeRecreated_ = !1; + const t = this.gl_.canvas; + t.addEventListener( + Yl.LOST, + this.boundHandleWebGLContextLost_ + ), t.addEventListener( + Yl.RESTORED, + this.boundHandleWebGLContextRestored_ + ), this.offsetRotateMatrix_ = Fe(), this.offsetScaleMatrix_ = Fe(), this.tmpMat4_ = Fc(), this.uniformLocationsByProgram_ = {}, this.attribLocationsByProgram_ = {}, this.uniforms_ = [], e.uniforms && this.setUniforms(e.uniforms), this.postProcessPasses_ = e.postProcesses ? e.postProcesses.map( + (i) => new lm({ + webGlContext: this.gl_, + scaleRatio: i.scaleRatio, + vertexShader: i.vertexShader, + fragmentShader: i.fragmentShader, + uniforms: i.uniforms + }) + ) : [new lm({ webGlContext: this.gl_ })], this.shaderCompileErrors_ = null, this.startTime_ = Date.now(); + } + /** + * @param {Object} uniforms Uniform definitions. + */ + setUniforms(e) { + this.uniforms_ = [], this.addUniforms(e); + } + /** + * @param {Object} uniforms Uniform definitions. + */ + addUniforms(e) { + for (const t in e) + this.uniforms_.push({ + name: t, + value: e[t] + }); + } + /** + * @param {string} canvasCacheKey The canvas cache key. + * @return {boolean} The provided key matches the one this helper was constructed with. + */ + canvasCacheKeyMatches(e) { + return this.canvasCacheKey_ === Am(e); + } + /** + * Get a WebGL extension. If the extension is not supported, null is returned. + * Extensions are cached after they are enabled for the first time. + * @param {string} name The extension name. + * @return {Object|null} The extension or null if not supported. + */ + getExtension(e) { + if (e in this.extensionCache_) + return this.extensionCache_[e]; + const t = this.gl_.getExtension(e); + return this.extensionCache_[e] = t, t; + } + /** + * Just bind the buffer if it's in the cache. Otherwise create + * the WebGL buffer, bind it, populate it, and add an entry to + * the cache. + * @param {import("./Buffer").default} buffer Buffer. + */ + bindBuffer(e) { + const t = this.gl_, i = X(e); + let r = this.bufferCache_[i]; + if (!r) { + const s = t.createBuffer(); + r = { + buffer: e, + webGlBuffer: s + }, this.bufferCache_[i] = r; + } + t.bindBuffer(e.getType(), r.webGlBuffer); + } + /** + * Update the data contained in the buffer array; this is required for the + * new data to be rendered + * @param {import("./Buffer").default} buffer Buffer. + */ + flushBufferData(e) { + const t = this.gl_; + this.bindBuffer(e), t.bufferData(e.getType(), e.getArray(), e.getUsage()); + } + /** + * @param {import("./Buffer.js").default} buf Buffer. + */ + deleteBuffer(e) { + const t = X(e); + delete this.bufferCache_[t]; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + const e = this.gl_.canvas; + e.removeEventListener( + Yl.LOST, + this.boundHandleWebGLContextLost_ + ), e.removeEventListener( + Yl.RESTORED, + this.boundHandleWebGLContextRestored_ + ), _B(this.canvasCacheKey_), delete this.gl_; + } + /** + * Clear the buffer & set the viewport to draw. + * Post process passes will be initialized here, the first one being bound as a render target for + * subsequent draw calls. + * @param {import("../Map.js").FrameState} frameState current frame state + * @param {boolean} [disableAlphaBlend] If true, no alpha blending will happen. + * @param {boolean} [enableDepth] If true, enables depth testing. + */ + prepareDraw(e, t, i) { + const r = this.gl_, s = this.getCanvas(), o = e.size, a = e.pixelRatio; + (s.width !== o[0] * a || s.height !== o[1] * a) && (s.width = o[0] * a, s.height = o[1] * a, s.style.width = o[0] + "px", s.style.height = o[1] + "px"); + for (let l = this.postProcessPasses_.length - 1; l >= 0; l--) + this.postProcessPasses_[l].init(e); + r.bindTexture(r.TEXTURE_2D, null), r.clearColor(0, 0, 0, 0), r.depthRange(0, 1), r.clearDepth(1), r.clear(r.COLOR_BUFFER_BIT | r.DEPTH_BUFFER_BIT), r.enable(r.BLEND), r.blendFunc(r.ONE, t ? r.ZERO : r.ONE_MINUS_SRC_ALPHA), i ? (r.enable(r.DEPTH_TEST), r.depthFunc(r.LEQUAL)) : r.disable(r.DEPTH_TEST); + } + /** + * @param {WebGLFramebuffer|null} frameBuffer The frame buffer. + * @param {WebGLTexture} [texture] The texture. + */ + bindFrameBuffer(e, t) { + const i = this.getGL(); + i.bindFramebuffer(i.FRAMEBUFFER, e), t && i.framebufferTexture2D( + i.FRAMEBUFFER, + i.COLOR_ATTACHMENT0, + i.TEXTURE_2D, + t, + 0 + ); + } + /** + * Bind the frame buffer from the initial render. + */ + bindInitialFrameBuffer() { + const e = this.getGL(), t = this.postProcessPasses_[0].getFrameBuffer(); + e.bindFramebuffer(e.FRAMEBUFFER, t); + const i = this.postProcessPasses_[0].getRenderTargetTexture(); + e.framebufferTexture2D( + e.FRAMEBUFFER, + e.COLOR_ATTACHMENT0, + e.TEXTURE_2D, + i, + 0 + ); + } + /** + * Prepare a program to use a texture. + * @param {WebGLTexture} texture The texture. + * @param {number} slot The texture slot. + * @param {string} uniformName The corresponding uniform name. + */ + bindTexture(e, t, i) { + const r = this.gl_; + r.activeTexture(r.TEXTURE0 + t), r.bindTexture(r.TEXTURE_2D, e), r.uniform1i(this.getUniformLocation(i), t); + } + /** + * Set up an attribute array buffer for use in the vertex shader. + * @param {import("./Buffer").default} buffer The buffer. + * @param {string} attributeName The attribute name. + * @param {number} size The number of components per attribute vertex. + */ + bindAttribute(e, t, i) { + const r = this.getGL(); + this.bindBuffer(e); + const s = this.getAttributeLocation(t); + r.enableVertexAttribArray(s), r.vertexAttribPointer(s, i, r.FLOAT, !1, 0, 0); + } + /** + * Clear the render target & bind it for future draw operations. + * This is similar to `prepareDraw`, only post processes will not be applied. + * Note: the whole viewport will be drawn to the render target, regardless of its size. + * @param {import("../Map.js").FrameState} frameState current frame state + * @param {import("./RenderTarget.js").default} renderTarget Render target to draw to + * @param {boolean} [disableAlphaBlend] If true, no alpha blending will happen. + * @param {boolean} [enableDepth] If true, enables depth testing. + */ + prepareDrawToRenderTarget(e, t, i, r) { + const s = this.gl_, o = t.getSize(); + s.bindFramebuffer(s.FRAMEBUFFER, t.getFramebuffer()), s.bindRenderbuffer(s.RENDERBUFFER, t.getDepthbuffer()), s.viewport(0, 0, o[0], o[1]), s.bindTexture(s.TEXTURE_2D, t.getTexture()), s.clearColor(0, 0, 0, 0), s.depthRange(0, 1), s.clearDepth(1), s.clear(s.COLOR_BUFFER_BIT | s.DEPTH_BUFFER_BIT), s.enable(s.BLEND), s.blendFunc(s.ONE, i ? s.ZERO : s.ONE_MINUS_SRC_ALPHA), r ? (s.enable(s.DEPTH_TEST), s.depthFunc(s.LEQUAL)) : s.disable(s.DEPTH_TEST); + } + /** + * Execute a draw call based on the currently bound program, texture, buffers, attributes. + * @param {number} start Start index. + * @param {number} end End index. + */ + drawElements(e, t) { + const i = this.gl_; + this.getExtension("OES_element_index_uint"); + const r = i.UNSIGNED_INT, s = 4, o = t - e, a = e * s; + i.drawElements(i.TRIANGLES, o, r, a); + } + /** + * Apply the successive post process passes which will eventually render to the actual canvas. + * @param {import("../Map.js").FrameState} frameState current frame state + * @param {function(WebGLRenderingContext, import("../Map.js").FrameState):void} [preCompose] Called before composing. + * @param {function(WebGLRenderingContext, import("../Map.js").FrameState):void} [postCompose] Called before composing. + */ + finalizeDraw(e, t, i) { + for (let r = 0, s = this.postProcessPasses_.length; r < s; r++) + r === s - 1 ? this.postProcessPasses_[r].apply( + e, + null, + t, + i + ) : this.postProcessPasses_[r].apply( + e, + this.postProcessPasses_[r + 1] + ); + } + /** + * @return {HTMLCanvasElement} Canvas. + */ + getCanvas() { + return ( + /** @type {HTMLCanvasElement} */ + this.gl_.canvas + ); + } + /** + * Get the WebGL rendering context + * @return {WebGLRenderingContext} The rendering context. + */ + getGL() { + return this.gl_; + } + /** + * Sets the default matrix uniforms for a given frame state. This is called internally in `prepareDraw`. + * @param {import("../Map.js").FrameState} frameState Frame state. + */ + applyFrameState(e) { + const t = e.size, i = e.viewState.rotation, r = e.pixelRatio; + this.setUniformFloatValue( + Ri.TIME, + (Date.now() - this.startTime_) * 1e-3 + ), this.setUniformFloatValue(Ri.ZOOM, e.viewState.zoom), this.setUniformFloatValue( + Ri.RESOLUTION, + e.viewState.resolution + ), this.setUniformFloatValue(Ri.PIXEL_RATIO, r), this.setUniformFloatVec2(Ri.VIEWPORT_SIZE_PX, [ + t[0], + t[1] + ]), this.setUniformFloatValue(Ri.ROTATION, i); + } + /** + * Sets the `u_hitDetection` uniform. + * @param {boolean} enabled Whether to enable the hit detection code path + */ + applyHitDetectionUniform(e) { + const t = this.getUniformLocation(Ri.HIT_DETECTION); + this.getGL().uniform1i(t, e ? 1 : 0), e && this.setUniformFloatValue(Ri.PIXEL_RATIO, 0.5); + } + /** + * Sets the custom uniforms based on what was given in the constructor. This is called internally in `prepareDraw`. + * @param {import("../Map.js").FrameState} frameState Frame state. + */ + applyUniforms(e) { + const t = this.gl_; + let i, r = 0; + this.uniforms_.forEach((s) => { + if (i = typeof s.value == "function" ? s.value(e) : s.value, i instanceof HTMLCanvasElement || i instanceof HTMLImageElement || i instanceof ImageData || i instanceof WebGLTexture) { + i instanceof WebGLTexture && !s.texture ? (s.prevValue = void 0, s.texture = i) : s.texture || (s.prevValue = void 0, s.texture = t.createTexture()), this.bindTexture(s.texture, r, s.name), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.LINEAR), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, t.CLAMP_TO_EDGE), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, t.CLAMP_TO_EDGE); + const o = !(i instanceof HTMLImageElement) || /** @type {HTMLImageElement} */ + i.complete; + !(i instanceof WebGLTexture) && o && s.prevValue !== i && (s.prevValue = i, t.texImage2D( + t.TEXTURE_2D, + 0, + t.RGBA, + t.RGBA, + t.UNSIGNED_BYTE, + i + )), r++; + } else if (Array.isArray(i) && i.length === 6) + this.setUniformMatrixValue( + s.name, + Ar(this.tmpMat4_, i) + ); + else if (Array.isArray(i) && i.length <= 4) + switch (i.length) { + case 2: + t.uniform2f( + this.getUniformLocation(s.name), + i[0], + i[1] + ); + return; + case 3: + t.uniform3f( + this.getUniformLocation(s.name), + i[0], + i[1], + i[2] + ); + return; + case 4: + t.uniform4f( + this.getUniformLocation(s.name), + i[0], + i[1], + i[2], + i[3] + ); + return; + default: + return; + } + else typeof i == "number" && t.uniform1f(this.getUniformLocation(s.name), i); + }); + } + /** + * Set up a program for use. The program will be set as the current one. Then, the uniforms used + * in the program will be set based on the current frame state and the helper configuration. + * @param {WebGLProgram} program Program. + * @param {import("../Map.js").FrameState} [frameState] Frame state. + */ + useProgram(e, t) { + this.gl_.useProgram(e), this.currentProgram_ = e, t && (this.applyFrameState(t), this.applyUniforms(t)); + } + /** + * Will attempt to compile a vertex or fragment shader based on source + * On error, the shader will be returned but + * `gl.getShaderParameter(shader, gl.COMPILE_STATUS)` will return `true` + * Use `gl.getShaderInfoLog(shader)` to have details + * @param {string} source Shader source + * @param {ShaderType} type VERTEX_SHADER or FRAGMENT_SHADER + * @return {WebGLShader} Shader object + */ + compileShader(e, t) { + const i = this.gl_, r = i.createShader(t); + return i.shaderSource(r, e), i.compileShader(r), r; + } + /** + * Create a program for a vertex and fragment shader. Throws if shader compilation fails. + * @param {string} fragmentShaderSource Fragment shader source. + * @param {string} vertexShaderSource Vertex shader source. + * @return {WebGLProgram} Program + */ + getProgram(e, t) { + const i = this.gl_, r = this.compileShader( + e, + i.FRAGMENT_SHADER + ), s = this.compileShader( + t, + i.VERTEX_SHADER + ), o = i.createProgram(); + if (i.attachShader(o, r), i.attachShader(o, s), i.linkProgram(o), !i.getShaderParameter(r, i.COMPILE_STATUS)) { + const a = `Fragment shader compilation failed: ${i.getShaderInfoLog( + r + )}`; + throw new Error(a); + } + if (i.deleteShader(r), !i.getShaderParameter(s, i.COMPILE_STATUS)) { + const a = `Vertex shader compilation failed: ${i.getShaderInfoLog( + s + )}`; + throw new Error(a); + } + if (i.deleteShader(s), !i.getProgramParameter(o, i.LINK_STATUS)) { + const a = `GL program linking failed: ${i.getProgramInfoLog( + o + )}`; + throw new Error(a); + } + return o; + } + /** + * Will get the location from the shader or the cache + * @param {string} name Uniform name + * @return {WebGLUniformLocation} uniformLocation + */ + getUniformLocation(e) { + const t = X(this.currentProgram_); + return this.uniformLocationsByProgram_[t] === void 0 && (this.uniformLocationsByProgram_[t] = {}), this.uniformLocationsByProgram_[t][e] === void 0 && (this.uniformLocationsByProgram_[t][e] = this.gl_.getUniformLocation(this.currentProgram_, e)), this.uniformLocationsByProgram_[t][e]; + } + /** + * Will get the location from the shader or the cache + * @param {string} name Attribute name + * @return {number} attribLocation + */ + getAttributeLocation(e) { + const t = X(this.currentProgram_); + return this.attribLocationsByProgram_[t] === void 0 && (this.attribLocationsByProgram_[t] = {}), this.attribLocationsByProgram_[t][e] === void 0 && (this.attribLocationsByProgram_[t][e] = this.gl_.getAttribLocation(this.currentProgram_, e)), this.attribLocationsByProgram_[t][e]; + } + /** + * Sets the given transform to apply the rotation/translation/scaling of the given frame state. + * The resulting transform can be used to convert world space coordinates to view coordinates in the [-1, 1] range. + * @param {import("../Map.js").FrameState} frameState Frame state. + * @param {import("../transform").Transform} transform Transform to update. + * @return {import("../transform").Transform} The updated transform object. + */ + makeProjectionTransform(e, t) { + const i = e.size, r = e.viewState.rotation, s = e.viewState.resolution, o = e.viewState.center; + return ai( + t, + 0, + 0, + 2 / (s * i[0]), + 2 / (s * i[1]), + -r, + -o[0], + -o[1] + ), t; + } + /** + * Give a value for a standard float uniform + * @param {string} uniform Uniform name + * @param {number} value Value + */ + setUniformFloatValue(e, t) { + this.gl_.uniform1f(this.getUniformLocation(e), t); + } + /** + * Give a value for a vec2 uniform + * @param {string} uniform Uniform name + * @param {Array} value Array of length 4. + */ + setUniformFloatVec2(e, t) { + this.gl_.uniform2fv(this.getUniformLocation(e), t); + } + /** + * Give a value for a vec4 uniform + * @param {string} uniform Uniform name + * @param {Array} value Array of length 4. + */ + setUniformFloatVec4(e, t) { + this.gl_.uniform4fv(this.getUniformLocation(e), t); + } + /** + * Give a value for a standard matrix4 uniform + * @param {string} uniform Uniform name + * @param {Array} value Matrix value + */ + setUniformMatrixValue(e, t) { + this.gl_.uniformMatrix4fv(this.getUniformLocation(e), !1, t); + } + /** + * Will set the currently bound buffer to an attribute of the shader program. Used by `#enableAttributes` + * internally. + * @param {string} attribName Attribute name + * @param {number} size Number of components per attributes + * @param {number} type UNSIGNED_INT, UNSIGNED_BYTE, UNSIGNED_SHORT or FLOAT + * @param {number} stride Stride in bytes (0 means attribs are packed) + * @param {number} offset Offset in bytes + * @private + */ + enableAttributeArray_(e, t, i, r, s) { + const o = this.getAttributeLocation(e); + o < 0 || (this.gl_.enableVertexAttribArray(o), this.gl_.vertexAttribPointer(o, t, i, !1, r, s)); + } + /** + * Will enable the following attributes to be read from the currently bound buffer, + * i.e. tell the GPU where to read the different attributes in the buffer. An error in the + * size/type/order of attributes will most likely break the rendering and throw a WebGL exception. + * @param {Array} attributes Ordered list of attributes to read from the buffer + */ + enableAttributes(e) { + const t = CB(e); + let i = 0; + for (let r = 0; r < e.length; r++) { + const s = e[r]; + this.enableAttributeArray_( + s.name, + s.size, + s.type || y_, + t, + i + ), i += s.size * S_(s.type); + } + } + /** + * WebGL context was lost + * @param {WebGLContextEvent} event The context loss event. + * @private + */ + handleWebGLContextLost(e) { + ns(this.bufferCache_), this.currentProgram_ = null, e.preventDefault(); + } + /** + * WebGL context was restored + * @private + */ + handleWebGLContextRestored() { + this.needsToBeRecreated_ = !0; + } + /** + * Returns whether this helper needs to be recreated, as the context was lost and then restored. + * @return {boolean} Whether this helper needs to be recreated. + */ + needsToBeRecreated() { + return this.needsToBeRecreated_; + } + /** + * Will create or reuse a given webgl texture and apply the given size. If no image data + * specified, the texture will be empty, otherwise image data will be used and the `size` + * parameter will be ignored. If a Uint8Array is provided for data, a size must also be provided. + * Note: wrap parameters are set to clamp to edge, min filter is set to linear. + * @param {Array} size Expected size of the texture + * @param {ImageData|HTMLImageElement|HTMLCanvasElement|Uint8Array|null} data Image data/object to bind to the texture + * @param {WebGLTexture} [texture] Existing texture to reuse + * @param {boolean} [nearest] Use gl.NEAREST for min/mag filter. + * @return {WebGLTexture} The generated texture + */ + createTexture(e, t, i, r) { + const s = this.gl_; + i = i || s.createTexture(); + const o = r ? s.NEAREST : s.LINEAR; + s.bindTexture(s.TEXTURE_2D, i), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, o), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, o), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE); + const a = 0, l = s.RGBA, A = 0, c = s.RGBA, h = s.UNSIGNED_BYTE; + return t instanceof Uint8Array ? s.texImage2D( + s.TEXTURE_2D, + a, + l, + e[0], + e[1], + A, + c, + h, + t + ) : t ? s.texImage2D(s.TEXTURE_2D, a, l, c, h, t) : s.texImage2D( + s.TEXTURE_2D, + a, + l, + e[0], + e[1], + A, + c, + h, + null + ), i; + } +} +function CB(n) { + let e = 0; + for (let t = 0; t < n.length; t++) { + const i = n[t]; + e += i.size * S_(i.type); + } + return e; +} +function S_(n) { + switch (n) { + case At.UNSIGNED_BYTE: + return Uint8Array.BYTES_PER_ELEMENT; + case At.UNSIGNED_SHORT: + return Uint16Array.BYTES_PER_ELEMENT; + case At.UNSIGNED_INT: + return Uint32Array.BYTES_PER_ELEMENT; + case At.FLOAT: + default: + return Float32Array.BYTES_PER_ELEMENT; + } +} +class ml extends B_ { + /** + * @param {LayerType} layer Layer. + * @param {Options} [options] Options. + */ + constructor(e, t) { + super(e), t = t || {}, this.inversePixelTransform_ = Fe(), this.postProcesses_ = t.postProcesses, this.uniforms_ = t.uniforms, this.helper, this.onMapChanged_ = () => { + this.clearCache(), this.removeHelper(); + }, e.addChangeListener(Le.MAP, this.onMapChanged_), this.dispatchPreComposeEvent = this.dispatchPreComposeEvent.bind(this), this.dispatchPostComposeEvent = this.dispatchPostComposeEvent.bind(this); + } + /** + * @param {WebGLRenderingContext} context The WebGL rendering context. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @protected + */ + dispatchPreComposeEvent(e, t) { + const i = this.getLayer(); + if (i.hasListener(yt.PRECOMPOSE)) { + const r = new ma( + yt.PRECOMPOSE, + void 0, + t, + e + ); + i.dispatchEvent(r); + } + } + /** + * @param {WebGLRenderingContext} context The WebGL rendering context. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @protected + */ + dispatchPostComposeEvent(e, t) { + const i = this.getLayer(); + if (i.hasListener(yt.POSTCOMPOSE)) { + const r = new ma( + yt.POSTCOMPOSE, + void 0, + t, + e + ); + i.dispatchEvent(r); + } + } + /** + * Reset options (only handles uniforms). + * @param {Options} options Options. + */ + reset(e) { + this.uniforms_ = e.uniforms, this.helper && this.helper.setUniforms(this.uniforms_); + } + /** + * @protected + */ + removeHelper() { + this.helper && (this.helper.dispose(), delete this.helper); + } + /** + * Determine whether renderFrame should be called. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @return {boolean} Layer is ready to be rendered. + * @override + */ + prepareFrame(e) { + if (this.getLayer().getRenderSource()) { + let t = !0, i = -1, r; + for (let o = 0, a = e.layerStatesArray.length; o < a; o++) { + const l = e.layerStatesArray[o].layer, A = l.getRenderer(); + if (!(A instanceof ml)) { + t = !0; + continue; + } + const c = l.getClassName(); + if ((t || c !== r) && (i += 1, t = !1), r = c, A === this) + break; + } + const s = "map/" + e.mapId + "/group/" + i; + (!this.helper || !this.helper.canvasCacheKeyMatches(s) || this.helper.needsToBeRecreated()) && (this.removeHelper(), this.helper = new IB({ + postProcesses: this.postProcesses_, + uniforms: this.uniforms_, + canvasCacheKey: s + }), r && (this.helper.getCanvas().className = r), this.afterHelperCreated()); + } + return this.prepareFrameInternal(e); + } + /** + * @protected + */ + afterHelperCreated() { + } + /** + * Determine whether renderFrame should be called. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @return {boolean} Layer is ready to be rendered. + * @protected + */ + prepareFrameInternal(e) { + return !0; + } + /** + * @protected + */ + clearCache() { + } + /** + * Clean up. + * @override + */ + disposeInternal() { + var e; + this.clearCache(), this.removeHelper(), (e = this.getLayer()) == null || e.removeChangeListener( + Le.MAP, + this.onMapChanged_ + ), super.disposeInternal(); + } + /** + * @param {import("../../render/EventType.js").default} type Event type. + * @param {WebGLRenderingContext} context The rendering context. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @private + */ + dispatchRenderEvent_(e, t, i) { + const r = this.getLayer(); + if (r.hasListener(e)) { + ai( + this.inversePixelTransform_, + 0, + 0, + i.pixelRatio, + -i.pixelRatio, + 0, + 0, + -i.size[1] + ); + const s = new ma( + e, + this.inversePixelTransform_, + i, + t + ); + r.dispatchEvent(s); + } + } + /** + * @param {WebGLRenderingContext} context The rendering context. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @protected + */ + preRender(e, t) { + this.dispatchRenderEvent_(yt.PRERENDER, e, t); + } + /** + * @param {WebGLRenderingContext} context The rendering context. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @protected + */ + postRender(e, t) { + this.dispatchRenderEvent_(yt.POSTRENDER, e, t); + } +} +const R_ = { + TILE_TRANSFORM: "u_tileTransform", + TRANSITION_ALPHA: "u_transitionAlpha", + DEPTH: "u_depth", + RENDER_EXTENT: "u_renderExtent", + // intersection of layer, source, and view extent + PATTERN_ORIGIN: "u_patternOrigin", + RESOLUTION: "u_resolution", + ZOOM: "u_zoom", + GLOBAL_ALPHA: "u_globalAlpha", + PROJECTION_MATRIX: "u_projectionMatrix", + SCREEN_TO_WORLD_MATRIX: "u_screenToWorldMatrix" +}; +function hm(n) { + return 1 / (n + 2); +} +function yB() { + return { tileIds: /* @__PURE__ */ new Set(), representationsByZ: {} }; +} +function um(n, e) { + return n.tileIds.has(X(e)); +} +function gm(n, e, t) { + const i = n.representationsByZ; + t in i || (i[t] = /* @__PURE__ */ new Set()), i[t].add(e), n.tileIds.add(X(e.tile)); +} +function Bh(n, e) { + const t = n.layerStatesArray[n.layerIndex]; + t.extent && (e = tt( + e, + Vt(t.extent, n.viewState.projection) + )); + const i = ( + /** @type {import("../../source/Tile.js").default} */ + t.layer.getRenderSource() + ); + if (!i.getWrapX()) { + const r = i.getTileGridForProjection(n.viewState.projection).getExtent(); + r && (e = tt(e, r)); + } + return e; +} +function bu(n, e) { + return `${n.getKey()},${br(e)}`; +} +class T_ extends ml { + /** + * @param {LayerType} tileLayer Tile layer. + * @param {Options} options Options. + */ + constructor(e, t) { + super(e, { + uniforms: t.uniforms, + postProcesses: t.postProcesses + }), this.renderComplete = !1, this.tileTransform_ = Fe(), this.tempMat4 = Fc(), this.tempTileRange_ = new Dc(0, 0, 0, 0), this.tempTileCoord_ = qr(0, 0, 0), this.tempSize_ = [0, 0]; + const i = t.cacheSize !== void 0 ? t.cacheSize : 512; + this.tileRepresentationCache = new Qc(i), this.frameState = null, this.renderedProjection_ = void 0; + } + /** + * @param {Options} options Options. + * @override + */ + reset(e) { + super.reset({ + uniforms: e.uniforms + }); + } + /** + * Determine whether renderFrame should be called. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @return {boolean} Layer is ready to be rendered. + * @override + */ + prepareFrameInternal(e) { + this.renderedProjection_ ? e.viewState.projection !== this.renderedProjection_ && (this.clearCache(), this.renderedProjection_ = e.viewState.projection) : this.renderedProjection_ = e.viewState.projection; + const i = this.getLayer().getRenderSource(); + return !i || wn(Bh(e, e.extent)) ? !1 : i.getState() === "ready"; + } + /** + * @abstract + * @param {import("../../webgl/BaseTileRepresentation.js").TileRepresentationOptions} options tile representation options + * @return {TileRepresentation} A new tile representation + * @protected + */ + createTileRepresentation(e) { + return ae(); + } + /** + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @param {import("../../extent.js").Extent} extent The extent to be rendered. + * @param {number} initialZ The zoom level. + * @param {TileRepresentationLookup} tileRepresentationLookup The zoom level. + * @param {number} preload Number of additional levels to load. + */ + enqueueTiles(e, t, i, r, s) { + const o = e.viewState, a = this.getLayer(), l = a.getRenderSource(), A = l.getTileGridForProjection(o.projection), c = l.getGutterForProjection(o.projection), h = X(l); + h in e.wantedTiles || (e.wantedTiles[h] = {}); + const u = e.wantedTiles[h], g = this.tileRepresentationCache, d = a.getMapInternal(), m = Math.max( + i - s, + A.getMinZoom(), + A.getZForResolution( + Math.min( + a.getMaxResolution(), + d ? d.getView().getResolutionForZoom(Math.max(a.getMinZoom(), 0)) : A.getResolution(0) + ), + l.zDirection + ) + ); + for (let f = i; f >= m; --f) { + const E = A.getTileRangeForExtentAndZ( + t, + f, + this.tempTileRange_ + ), p = A.getResolution(f); + for (let _ = E.minX; _ <= E.maxX; ++_) + for (let I = E.minY; I <= E.maxY; ++I) { + const y = qr(f, _, I, this.tempTileCoord_), C = bu(l, y); + let w, x; + if (g.containsKey(C) && (w = g.get(C), x = w.tile), (!w || w.tile.key !== l.getKey()) && (x = l.getTile( + f, + _, + I, + e.pixelRatio, + o.projection + ), !x) || um(r, x)) + continue; + w ? w.setTile(x) : (w = this.createTileRepresentation({ + tile: x, + grid: A, + helper: this.helper, + gutter: c + }), g.set(C, w)), gm( + r, + w, + f + ); + const B = x.getKey(); + u[B] = !0, x.getState() === $.IDLE && (e.tileQueue.isKeyQueued(B) || e.tileQueue.enqueue([ + x, + h, + A.getTileCoordCenter(y), + p + ])); + } + } + } + /** + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @param {boolean} tilesWithAlpha True if at least one of the rendered tiles has alpha + * @protected + */ + beforeTilesRender(e, t) { + this.helper.prepareDraw(this.frameState, !t, !0); + } + /** + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @return {boolean} If returns false, tile mask rendering will be skipped + * @protected + */ + beforeTilesMaskRender(e) { + return !1; + } + /** + * @param {TileRepresentation} tileRepresentation Tile representation + * @param {import("../../transform.js").Transform} tileTransform Tile transform + * @param {import("../../Map.js").FrameState} frameState Frame state + * @param {import("../../extent.js").Extent} renderExtent Render extent + * @param {number} tileResolution Tile resolution + * @param {import("../../size.js").Size} tileSize Tile size + * @param {import("../../coordinate.js").Coordinate} tileOrigin Tile origin + * @param {import("../../extent.js").Extent} tileExtent tile Extent + * @param {number} depth Depth + * @param {number} gutter Gutter + * @param {number} alpha Alpha + * @protected + */ + renderTile(e, t, i, r, s, o, a, l, A, c, h) { + } + /** + * @param {TileRepresentation} tileRepresentation Tile representation + * @param {number} tileZ Tile Z + * @param {import("../../extent.js").Extent} extent Render extent + * @param {number} depth Depth + * @protected + */ + renderTileMask(e, t, i, r) { + } + drawTile_(e, t, i, r, s, o, a) { + if (!t.ready) + return; + const A = t.tile.tileCoord, c = br(A), h = c in o ? o[c] : 1, u = a.getResolution(i), g = qe(a.getTileSize(i), this.tempSize_), d = a.getOrigin(i), m = a.getTileCoordExtent(A), f = h < 1 ? -1 : hm(i); + h < 1 && (e.animate = !0); + const E = e.viewState, p = E.center[0], _ = E.center[1], I = g[0] + 2 * r, y = g[1] + 2 * r, C = I / y, w = (p - d[0]) / (g[0] * u), x = (d[1] - _) / (g[1] * u), B = E.resolution / u, T = A[1], S = A[2]; + Iu(this.tileTransform_), Hs( + this.tileTransform_, + 2 / (e.size[0] * B / I), + -2 / (e.size[1] * B / I) + ), ey(this.tileTransform_, E.rotation), Hs(this.tileTransform_, 1, 1 / C), ol( + this.tileTransform_, + (g[0] * (T - w) - r) / I, + (g[1] * (S - x) - r) / y + ), this.renderTile( + /** @type {TileRepresentation} */ + t, + this.tileTransform_, + e, + s, + u, + g, + d, + m, + f, + r, + h + ); + } + /** + * Render the layer. + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @return {HTMLElement} The rendered element. + * @override + */ + renderFrame(e) { + this.frameState = e, this.renderComplete = !0; + const t = this.helper.getGL(); + this.preRender(t, e); + const i = e.viewState, r = this.getLayer(), s = r.getRenderSource(), o = s.getTileGridForProjection(i.projection), a = s.getGutterForProjection(i.projection), l = Bh(e, e.extent), A = o.getZForResolution( + i.resolution, + s.zDirection + ), c = yB(), h = r.getPreload(); + if (e.nextExtent) { + const y = o.getZForResolution( + i.nextResolution, + s.zDirection + ), C = Bh(e, e.nextExtent); + this.enqueueTiles( + e, + C, + y, + c, + h + ); + } + this.enqueueTiles(e, l, A, c, 0), h > 0 && setTimeout(() => { + this.enqueueTiles( + e, + l, + A - 1, + c, + h - 1 + ); + }, 0); + const u = {}, g = X(this), d = e.time; + let m = !1; + const f = c.representationsByZ; + if (A in f) + for (const y of f[A]) { + const C = y.tile; + if ((C instanceof mo || C instanceof Lc) && C.getState() === $.EMPTY) + continue; + const w = C.tileCoord; + if (y.ready) { + const T = C.getAlpha(g, d); + if (T === 1) { + C.endTransition(g); + continue; + } + m = !0; + const S = br(w); + u[S] = T; + } + if (this.renderComplete = !1, this.findAltTiles_( + o, + w, + A + 1, + c + )) + continue; + const B = o.getMinZoom(); + for (let T = A - 1; T >= B && !this.findAltTiles_( + o, + w, + T, + c + ); --T) + ; + } + const E = Object.keys(f).map(Number).sort(MC); + if (this.beforeTilesMaskRender(e)) + for (let y = 0, C = E.length; y < C; ++y) { + const w = E[y]; + for (const x of f[w]) { + const B = x.tile.tileCoord; + if (br(B) in u) + continue; + const S = o.getTileCoordExtent(B); + this.renderTileMask( + /** @type {TileRepresentation} */ + x, + w, + S, + hm(w) + ); + } + } + this.beforeTilesRender(e, m); + for (let y = 0, C = E.length; y < C; ++y) { + const w = E[y]; + for (const x of f[w]) { + const B = x.tile.tileCoord; + br(B) in u || this.drawTile_( + e, + x, + w, + a, + l, + u, + o + ); + } + } + if (A in f) + for (const y of f[A]) { + const C = y.tile.tileCoord; + br(C) in u && this.drawTile_( + e, + y, + A, + a, + l, + u, + o + ); + } + this.beforeFinalize(e), this.helper.finalizeDraw( + e, + this.dispatchPreComposeEvent, + this.dispatchPostComposeEvent + ); + const _ = this.helper.getCanvas(), I = this.tileRepresentationCache; + for (; I.canExpireCache(); ) + I.pop().dispose(); + return this.postRender(t, e), _; + } + /** + * @param {import("../../Map.js").FrameState} frameState Frame state. + * @protected + */ + beforeFinalize(e) { + } + /** + * Look for tiles covering the provided tile coordinate at an alternate + * zoom level. Loaded tiles will be added to the provided tile representation lookup. + * @param {import("../../tilegrid/TileGrid.js").default} tileGrid The tile grid. + * @param {import("../../tilecoord.js").TileCoord} tileCoord The target tile coordinate. + * @param {number} altZ The alternate zoom level. + * @param {TileRepresentationLookup} tileRepresentationLookup Lookup of + * tile representations by zoom level. + * @return {boolean} The tile coordinate is covered by loaded tiles at the alternate zoom level. + * @private + */ + findAltTiles_(e, t, i, r) { + const s = e.getTileRangeForTileCoordAndZ( + t, + i, + this.tempTileRange_ + ); + if (!s) + return !1; + let o = !0; + const a = this.tileRepresentationCache, l = this.getLayer().getRenderSource(); + for (let A = s.minX; A <= s.maxX; ++A) + for (let c = s.minY; c <= s.maxY; ++c) { + const h = bu(l, [i, A, c]); + let u = !1; + if (a.containsKey(h)) { + const g = a.get(h); + g.ready && !um(r, g.tile) && (gm( + r, + g, + i + ), u = !0); + } + u || (o = !1); + } + return o; + } + /** + * @override + */ + clearCache() { + super.clearCache(); + const e = this.tileRepresentationCache; + e.forEach( + (t) => t.dispose() + ), e.clear(); + } + /** + * @override + */ + afterHelperCreated() { + super.afterHelperCreated(), this.tileRepresentationCache.forEach( + (e) => e.setHelper(this.helper) + ); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + super.disposeInternal(), delete this.frameState; + } +} +const J = { + ...R_, + TILE_TEXTURE_ARRAY: "u_tileTextures", + TEXTURE_PIXEL_WIDTH: "u_texturePixelWidth", + TEXTURE_PIXEL_HEIGHT: "u_texturePixelHeight", + TEXTURE_RESOLUTION: "u_textureResolution", + // map units per texture pixel + TEXTURE_ORIGIN_X: "u_textureOriginX", + // map x coordinate of left edge of texture + TEXTURE_ORIGIN_Y: "u_textureOriginY" + // map y coordinate of top edge of texture +}, $r = { + TEXTURE_COORD: "a_textureCoord" +}, wB = [ + { + name: $r.TEXTURE_COORD, + size: 2, + type: At.FLOAT + } +]; +class v_ extends T_ { + /** + * @param {LayerType} tileLayer Tile layer. + * @param {Options} options Options. + */ + constructor(e, t) { + super(e, t), this.program_, this.vertexShader_ = t.vertexShader, this.fragmentShader_ = t.fragmentShader, this.indices_ = new Cn(Fo, jr), this.indices_.fromArray([0, 1, 3, 1, 2, 3]), this.paletteTextures_ = t.paletteTextures || []; + } + /** + * @param {Options} options Options. + * @override + */ + reset(e) { + if (super.reset(e), this.helper) { + const t = this.helper.getGL(); + for (const i of this.paletteTextures_) + i.delete(t); + } + if (this.vertexShader_ = e.vertexShader, this.fragmentShader_ = e.fragmentShader, this.paletteTextures_ = e.paletteTextures || [], this.helper) { + this.program_ = this.helper.getProgram( + this.fragmentShader_, + this.vertexShader_ + ); + const t = this.helper.getGL(); + for (const i of this.paletteTextures_) + i.getTexture(t); + } + } + /** + * @override + */ + afterHelperCreated() { + super.afterHelperCreated(); + const e = this.helper.getGL(); + for (const t of this.paletteTextures_) + t.getTexture(e); + this.program_ = this.helper.getProgram( + this.fragmentShader_, + this.vertexShader_ + ), this.helper.flushBufferData(this.indices_); + } + /** + * @override + */ + removeHelper() { + if (this.helper) { + const e = this.helper.getGL(); + for (const t of this.paletteTextures_) + t.delete(e); + } + super.removeHelper(); + } + /** + * @override + */ + createTileRepresentation(e) { + return new gB(e); + } + /** + * @override + */ + beforeTilesRender(e, t) { + super.beforeTilesRender(e, t), this.helper.useProgram(this.program_, e); + } + /** + * @override + */ + renderTile(e, t, i, r, s, o, a, l, A, c, h) { + const u = this.helper.getGL(); + this.helper.bindBuffer(e.coords), this.helper.bindBuffer(this.indices_), this.helper.enableAttributes(wB); + let g = 0; + for (; g < e.textures.length; ) { + const C = `${J.TILE_TEXTURE_ARRAY}[${g}]`; + this.helper.bindTexture( + e.textures[g], + g, + C + ), ++g; + } + for (let C = 0; C < this.paletteTextures_.length; ++C) { + const w = this.paletteTextures_[C], x = w.getTexture(u); + this.helper.bindTexture(x, g, w.name), ++g; + } + const d = i.viewState, m = o[0] + 2 * c, f = o[1] + 2 * c, p = e.tile.tileCoord, _ = p[1], I = p[2]; + this.helper.setUniformMatrixValue( + J.TILE_TRANSFORM, + Ar(this.tempMat4, t) + ), this.helper.setUniformFloatValue(J.TRANSITION_ALPHA, h), this.helper.setUniformFloatValue(J.DEPTH, A); + let y = r; + c > 0 && (y = l, tt(y, r, y)), this.helper.setUniformFloatVec4(J.RENDER_EXTENT, y), this.helper.setUniformFloatValue(J.RESOLUTION, d.resolution), this.helper.setUniformFloatValue(J.ZOOM, d.zoom), this.helper.setUniformFloatValue( + J.TEXTURE_PIXEL_WIDTH, + m + ), this.helper.setUniformFloatValue( + J.TEXTURE_PIXEL_HEIGHT, + f + ), this.helper.setUniformFloatValue( + J.TEXTURE_RESOLUTION, + s + ), this.helper.setUniformFloatValue( + J.TEXTURE_ORIGIN_X, + a[0] + _ * o[0] * s - c * s + ), this.helper.setUniformFloatValue( + J.TEXTURE_ORIGIN_Y, + a[1] - I * o[1] * s + c * s + ), this.helper.drawElements(0, this.indices_.getSize()); + } + /** + * @param {import("../../pixel.js").Pixel} pixel Pixel. + * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView} Data at the pixel location. + * @override + */ + getData(e) { + if (!this.helper.getGL()) + return null; + const i = this.frameState; + if (!i) + return null; + const r = this.getLayer(), s = Pe( + i.pixelToCoordinateTransform, + e.slice() + ), o = i.viewState, a = r.getExtent(); + if (a && !mi( + Vt(a, o.projection), + s + )) + return null; + const l = r.getSources( + rt([s]), + o.resolution + ); + let A, c, h; + for (A = l.length - 1; A >= 0; --A) + if (c = l[A], c.getState() === "ready") { + if (h = c.getTileGridForProjection(o.projection), c.getWrapX()) + break; + const g = h.getExtent(); + if (!g || mi(g, s)) + break; + } + if (A < 0) + return null; + const u = this.tileRepresentationCache; + for (let g = h.getZForResolution(o.resolution); g >= h.getMinZoom(); --g) { + const d = h.getTileCoordForCoordAndZ(s, g), m = bu(c, d); + if (!u.containsKey(m)) + continue; + const f = u.get(m), E = f.tile; + if ((E instanceof mo || E instanceof Lc) && E.getState() === $.EMPTY) + return null; + if (!f.loaded) + continue; + const p = h.getOrigin(g), _ = qe(h.getTileSize(g)), I = h.getResolution(g), y = (s[0] - p[0]) / I - d[1] * _[0], C = (p[1] - s[1]) / I - d[2] * _[1]; + return f.getPixelData(y, C); + } + return null; + } + /** + * Clean up. + * @override + */ + disposeInternal() { + const e = this.helper; + if (e) { + const t = e.getGL(); + for (const i of this.paletteTextures_) + i.delete(t); + this.paletteTextures_.length = 0, t.deleteProgram(this.program_), delete this.program_, e.deleteBuffer(this.indices_); + } + super.disposeInternal(), delete this.indices_; + } +} +function xB(n, e) { + return `operator_${n}_${Object.keys(e.functions).length}`; +} +function Ur(n) { + const e = n.toString(); + return e.includes(".") ? e : e + ".0"; +} +function ed(n) { + if (n.length < 2 || n.length > 4) + throw new Error( + "`formatArray` can only output `vec2`, `vec3` or `vec4` arrays." + ); + return `vec${n.length}(${n.map(Ur).join(", ")})`; +} +function IA(n) { + const e = qi(n), t = e.length > 3 ? e[3] : 1; + return ed([e[0] / 255, e[1] / 255, e[2] / 255, t]); +} +function BB(n) { + const e = qe(n); + return ed(e); +} +const Sh = {}; +let SB = 0; +function za(n) { + return n in Sh || (Sh[n] = SB++), Sh[n]; +} +function Nn(n) { + return Ur(za(n)); +} +function bc(n) { + return "u_var_" + n; +} +function Q_() { + return { + inFragmentShader: !1, + variables: {}, + properties: {}, + functions: {}, + bandCount: 0, + style: {} + }; +} +const Rh = "getBandValue", D_ = "u_paletteTextures"; +function RB(n, e, t, i) { + const r = Qt(n, e, t); + return td(r, e, i); +} +function be(n) { + return (e, t, i) => { + const r = t.args.length, s = new Array(r); + for (let o = 0; o < r; ++o) + s[o] = td(t.args[o], i, e); + return n(s, e); + }; +} +const TB = { + [b.Get]: (n, e) => { + const i = ( + /** @type {string} */ + /** @type {LiteralExpression} */ + e.args[0].value + ); + return i in n.properties || (n.properties[i] = { + name: i, + type: e.type + }), (n.inFragmentShader ? "v_prop_" : "a_prop_") + i; + }, + [b.GeometryType]: (n, e, t) => { + const i = "geometryType"; + return i in n.properties || (n.properties[i] = { + name: i, + type: vt, + evaluator: (o) => zg(o.getGeometry()) + }), (n.inFragmentShader ? "v_prop_" : "a_prop_") + i; + }, + [b.LineMetric]: () => "currentLineMetric", + // this variable is assumed to always be present in shaders, default is 0. + [b.Var]: (n, e) => { + const i = ( + /** @type {string} */ + /** @type {LiteralExpression} */ + e.args[0].value + ); + return i in n.variables || (n.variables[i] = { + name: i, + type: e.type + }), bc(i); + }, + [b.Resolution]: () => "u_resolution", + [b.Zoom]: () => "u_zoom", + [b.Time]: () => "u_time", + [b.Any]: be((n) => `(${n.join(" || ")})`), + [b.All]: be((n) => `(${n.join(" && ")})`), + [b.Not]: be(([n]) => `(!${n})`), + [b.Equal]: be( + ([n, e]) => `(${n} == ${e})` + ), + [b.NotEqual]: be( + ([n, e]) => `(${n} != ${e})` + ), + [b.GreaterThan]: be( + ([n, e]) => `(${n} > ${e})` + ), + [b.GreaterThanOrEqualTo]: be( + ([n, e]) => `(${n} >= ${e})` + ), + [b.LessThan]: be( + ([n, e]) => `(${n} < ${e})` + ), + [b.LessThanOrEqualTo]: be( + ([n, e]) => `(${n} <= ${e})` + ), + [b.Multiply]: be( + (n) => `(${n.join(" * ")})` + ), + [b.Divide]: be( + ([n, e]) => `(${n} / ${e})` + ), + [b.Add]: be((n) => `(${n.join(" + ")})`), + [b.Subtract]: be( + ([n, e]) => `(${n} - ${e})` + ), + [b.Clamp]: be( + ([n, e, t]) => `clamp(${n}, ${e}, ${t})` + ), + [b.Mod]: be(([n, e]) => `mod(${n}, ${e})`), + [b.Pow]: be(([n, e]) => `pow(${n}, ${e})`), + [b.Abs]: be(([n]) => `abs(${n})`), + [b.Floor]: be(([n]) => `floor(${n})`), + [b.Ceil]: be(([n]) => `ceil(${n})`), + [b.Round]: be(([n]) => `floor(${n} + 0.5)`), + [b.Sin]: be(([n]) => `sin(${n})`), + [b.Cos]: be(([n]) => `cos(${n})`), + [b.Atan]: be(([n, e]) => e !== void 0 ? `atan(${n}, ${e})` : `atan(${n})`), + [b.Sqrt]: be(([n]) => `sqrt(${n})`), + [b.Match]: be((n) => { + const e = n[0], t = n[n.length - 1]; + let i = null; + for (let r = n.length - 3; r >= 1; r -= 2) { + const s = n[r], o = n[r + 1]; + i = `(${e} == ${s} ? ${o} : ${i || t})`; + } + return i; + }), + [b.Between]: be( + ([n, e, t]) => `(${n} >= ${e} && ${n} <= ${t})` + ), + [b.Interpolate]: be(([n, e, ...t]) => { + let i = ""; + for (let r = 0; r < t.length - 2; r += 2) { + const s = t[r], o = i || t[r + 1], a = t[r + 2], l = t[r + 3]; + let A; + n === Ur(1) ? A = `(${e} - ${s}) / (${a} - ${s})` : A = `(pow(${n}, (${e} - ${s})) - 1.0) / (pow(${n}, (${a} - ${s})) - 1.0)`, i = `mix(${o}, ${l}, clamp(${A}, 0.0, 1.0))`; + } + return i; + }), + [b.Case]: be((n) => { + const e = n[n.length - 1]; + let t = null; + for (let i = n.length - 3; i >= 0; i -= 2) { + const r = n[i], s = n[i + 1]; + t = `(${r} ? ${s} : ${t || e})`; + } + return t; + }), + [b.In]: be(([n, ...e], t) => { + const i = xB("in", t), r = []; + for (let s = 0; s < e.length; s += 1) + r.push(` if (inputValue == ${e[s]}) { return true; }`); + return t.functions[i] = `bool ${i}(float inputValue) { +${r.join(` +`)} + return false; +}`, `${i}(${n})`; + }), + [b.Array]: be( + (n) => `vec${n.length}(${n.join(", ")})` + ), + [b.Color]: be((n) => { + if (n.length === 1) + return `vec4(vec3(${n[0]} / 255.0), 1.0)`; + if (n.length === 2) + return `vec4(vec3(${n[0]} / 255.0), ${n[1]})`; + const e = n.slice(0, 3).map((i) => `${i} / 255.0`); + if (n.length === 3) + return `vec4(${e.join(", ")}, 1.0)`; + const t = n[3]; + return `vec4(${e.join(", ")}, ${t})`; + }), + [b.Band]: be(([n, e, t], i) => { + if (!(Rh in i.functions)) { + let r = ""; + const s = i.bandCount || 1; + for (let o = 0; o < s; o++) { + const a = Math.floor(o / 4); + let l = o % 4; + o === s - 1 && l === 1 && (l = 3); + const A = `${J.TILE_TEXTURE_ARRAY}[${a}]`; + r += ` if (band == ${o + 1}.0) { + return texture2D(${A}, v_textureCoord + vec2(dx, dy))[${l}]; + } +`; + } + i.functions[Rh] = `float getBandValue(float band, float xOffset, float yOffset) { + float dx = xOffset / ${J.TEXTURE_PIXEL_WIDTH}; + float dy = yOffset / ${J.TEXTURE_PIXEL_HEIGHT}; +${r} +}`; + } + return `${Rh}(${n}, ${e ?? "0.0"}, ${t ?? "0.0"})`; + }), + [b.Palette]: (n, e) => { + const [t, ...i] = e.args, r = i.length, s = new Uint8Array(r * 4); + for (let A = 0; A < i.length; A++) { + const c = ( + /** @type {string | Array} */ + /** @type {LiteralExpression} */ + i[A].value + ), h = qi(c), u = A * 4; + s[u] = h[0], s[u + 1] = h[1], s[u + 2] = h[2], s[u + 3] = h[3] * 255; + } + n.paletteTextures || (n.paletteTextures = []); + const o = `${D_}[${n.paletteTextures.length}]`, a = new nB(o, s); + n.paletteTextures.push(a); + const l = td(t, ee, n); + return `texture2D(${o}, vec2((${l} + 0.5) / ${r}.0, 0.5))`; + } + // TODO: unimplemented + // Ops.Number + // Ops.String + // Ops.Coalesce + // Ops.Concat + // Ops.ToString +}; +function td(n, e, t) { + if (n instanceof r_) { + const i = TB[n.operator]; + if (i === void 0) + throw new Error( + `No compiler defined for this operator: ${JSON.stringify( + n.operator + )}` + ); + return i(t, n, e); + } + if ((n.type & ee) > 0) + return Ur( + /** @type {number} */ + n.value + ); + if ((n.type & Pt) > 0) + return n.value.toString(); + if ((n.type & vt) > 0) + return Nn(n.value.toString()); + if ((n.type & We) > 0) + return IA( + /** @type {Array | string} */ + n.value + ); + if ((n.type & jt) > 0) + return ed( + /** @type {Array} */ + n.value + ); + if ((n.type & Vi) > 0) + return BB( + /** @type {number|import('../size.js').Size} */ + n.value + ); + throw new Error( + `Unexpected expression ${n.value} (expected type ${$s( + e + )})` + ); +} +let L_ = !1; +function F_(n, e, t, i, r, s, o) { + const a = new XMLHttpRequest(); + a.open( + "GET", + typeof n == "function" ? n(t, i, r) : n, + !0 + ), e.getType() == "arraybuffer" && (a.responseType = "arraybuffer"), a.withCredentials = L_, a.onload = function(l) { + if (!a.status || a.status >= 200 && a.status < 300) { + const A = e.getType(); + try { + let c; + A == "text" || A == "json" ? c = a.responseText : A == "xml" ? c = a.responseXML || a.responseText : A == "arraybuffer" && (c = /** @type {ArrayBuffer} */ + a.response), c ? s( + /** @type {Array} */ + e.readFeatures(c, { + extent: t, + featureProjection: r + }), + e.readProjection(c) + ) : o(); + } catch { + o(); + } + } else + o(); + }, a.onerror = o, a.send(); +} +function dm(n, e) { + return function(t, i, r, s, o) { + const a = ( + /** @type {import("./source/Vector").default} */ + this + ); + F_( + n, + e, + t, + i, + r, + /** + * @param {Array} features The loaded features. + * @param {import("./proj/Projection.js").default} dataProjection Data + * projection. + */ + function(l, A) { + a.addFeatures(l), s !== void 0 && s(l); + }, + /* FIXME handle error */ + o || io + ); + }; +} +function WO(n) { + L_ = n; +} +class El extends _n { + /** + * @param {!import("../coordinate.js").Coordinate} center Center. + * For internal use, flat coordinates in combination with `layout` and no + * `radius` are also accepted. + * @param {number} [radius] Radius in units of the projection. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + constructor(e, t, i) { + super(), i !== void 0 && t === void 0 ? this.setFlatCoordinates(i, e) : (t = t || 0, this.setCenterAndRadius(e, t, i)); + } + /** + * Make a complete copy of the geometry. + * @return {!Circle} Clone. + * @api + * @override + */ + clone() { + const e = new El( + this.flatCoordinates.slice(), + void 0, + this.layout + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + const s = this.flatCoordinates, o = e - s[0], a = t - s[1], l = o * o + a * a; + if (l < r) { + if (l === 0) + for (let A = 0; A < this.stride; ++A) + i[A] = s[A]; + else { + const A = this.getRadius() / Math.sqrt(l); + i[0] = s[0] + A * o, i[1] = s[1] + A * a; + for (let c = 2; c < this.stride; ++c) + i[c] = s[c]; + } + return i.length = this.stride, l; + } + return r; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + * @override + */ + containsXY(e, t) { + const i = this.flatCoordinates, r = e - i[0], s = t - i[1]; + return r * r + s * s <= this.getRadiusSquared_(); + } + /** + * Return the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}. + * @return {import("../coordinate.js").Coordinate} Center. + * @api + */ + getCenter() { + return this.flatCoordinates.slice(0, this.stride); + } + /** + * @param {import("../extent.js").Extent} extent Extent. + * @protected + * @return {import("../extent.js").Extent} extent Extent. + * @override + */ + computeExtent(e) { + const t = this.flatCoordinates, i = t[this.stride] - t[0]; + return Pi( + t[0] - i, + t[1] - i, + t[0] + i, + t[1] + i, + e + ); + } + /** + * Return the radius of the circle. + * @return {number} Radius. + * @api + */ + getRadius() { + return Math.sqrt(this.getRadiusSquared_()); + } + /** + * @private + * @return {number} Radius squared. + */ + getRadiusSquared_() { + const e = this.flatCoordinates[this.stride] - this.flatCoordinates[0], t = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1]; + return e * e + t * t; + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "Circle"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + const t = this.getExtent(); + if (He(e, t)) { + const i = this.getCenter(); + return e[0] <= i[0] && e[2] >= i[0] || e[1] <= i[1] && e[3] >= i[1] ? !0 : gg(e, this.intersectsCoordinate.bind(this)); + } + return !1; + } + /** + * Set the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}. + * @param {import("../coordinate.js").Coordinate} center Center. + * @api + */ + setCenter(e) { + const t = this.stride, i = this.flatCoordinates[t] - this.flatCoordinates[0], r = e.slice(); + r[t] = r[0] + i; + for (let s = 1; s < t; ++s) + r[t + s] = e[s]; + this.setFlatCoordinates(this.layout, r), this.changed(); + } + /** + * Set the center (as {@link module:ol/coordinate~Coordinate coordinate}) and the radius (as + * number) of the circle. + * @param {!import("../coordinate.js").Coordinate} center Center. + * @param {number} radius Radius. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + */ + setCenterAndRadius(e, t, i) { + this.setLayout(i, e, 0), this.flatCoordinates || (this.flatCoordinates = []); + const r = this.flatCoordinates; + let s = Op(r, 0, e, this.stride); + r[s++] = r[0] + t; + for (let o = 1, a = this.stride; o < a; ++o) + r[s++] = r[o]; + r.length = s, this.changed(); + } + /** + * @override + */ + getCoordinates() { + return null; + } + /** + * @override + */ + setCoordinates(e, t) { + } + /** + * Set the radius of the circle. The radius is in the units of the projection. + * @param {number} radius Radius. + * @api + */ + setRadius(e) { + this.flatCoordinates[this.stride] = this.flatCoordinates[0] + e, this.changed(); + } + /** + * Rotate the geometry around a given coordinate. This modifies the geometry + * coordinates in place. + * @param {number} angle Rotation angle in counter-clockwise radians. + * @param {import("../coordinate.js").Coordinate} anchor The rotation center. + * @api + * @override + */ + rotate(e, t) { + const i = this.getCenter(), r = this.getStride(); + this.setCenter( + Ig(i, 0, i.length, r, e, t, i) + ), this.changed(); + } +} +El.prototype.transform; +class _t extends Cg { + /** + * @param {Array} geometries Geometries. + */ + constructor(e) { + super(), this.geometries_ = e, this.changeEventsKeys_ = [], this.listenGeometriesChange_(); + } + /** + * @private + */ + unlistenGeometriesChange_() { + this.changeEventsKeys_.forEach(Re), this.changeEventsKeys_.length = 0; + } + /** + * @private + */ + listenGeometriesChange_() { + const e = this.geometries_; + for (let t = 0, i = e.length; t < i; ++t) + this.changeEventsKeys_.push( + ie(e[t], j.CHANGE, this.changed, this) + ); + } + /** + * Make a complete copy of the geometry. + * @return {!GeometryCollection} Clone. + * @api + * @override + */ + clone() { + const e = new _t( + Th(this.geometries_) + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + if (r < ss(this.getExtent(), e, t)) + return r; + const s = this.geometries_; + for (let o = 0, a = s.length; o < a; ++o) + r = s[o].closestPointXY( + e, + t, + i, + r + ); + return r; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + * @override + */ + containsXY(e, t) { + const i = this.geometries_; + for (let r = 0, s = i.length; r < s; ++r) + if (i[r].containsXY(e, t)) + return !0; + return !1; + } + /** + * @param {import("../extent.js").Extent} extent Extent. + * @protected + * @return {import("../extent.js").Extent} extent Extent. + * @override + */ + computeExtent(e) { + wr(e); + const t = this.geometries_; + for (let i = 0, r = t.length; i < r; ++i) + Sp(e, t[i].getExtent()); + return e; + } + /** + * Return the geometries that make up this geometry collection. + * @return {Array} Geometries. + * @api + */ + getGeometries() { + return Th(this.geometries_); + } + /** + * @return {Array} Geometries. + */ + getGeometriesArray() { + return this.geometries_; + } + /** + * @return {Array} Geometries. + */ + getGeometriesArrayRecursive() { + let e = []; + const t = this.geometries_; + for (let i = 0, r = t.length; i < r; ++i) + t[i].getType() === this.getType() ? e = e.concat( + /** @type {GeometryCollection} */ + t[i].getGeometriesArrayRecursive() + ) : e.push(t[i]); + return e; + } + /** + * Create a simplified version of this geometry using the Douglas Peucker algorithm. + * @param {number} squaredTolerance Squared tolerance. + * @return {GeometryCollection} Simplified GeometryCollection. + * @override + */ + getSimplifiedGeometry(e) { + if (this.simplifiedGeometryRevision !== this.getRevision() && (this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = this.getRevision()), e < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && e < this.simplifiedGeometryMaxMinSquaredTolerance) + return this; + const t = [], i = this.geometries_; + let r = !1; + for (let s = 0, o = i.length; s < o; ++s) { + const a = i[s], l = a.getSimplifiedGeometry(e); + t.push(l), l !== a && (r = !0); + } + return r ? new _t( + t + ) : (this.simplifiedGeometryMaxMinSquaredTolerance = e, this); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "GeometryCollection"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + const t = this.geometries_; + for (let i = 0, r = t.length; i < r; ++i) + if (t[i].intersectsExtent(e)) + return !0; + return !1; + } + /** + * @return {boolean} Is empty. + */ + isEmpty() { + return this.geometries_.length === 0; + } + /** + * Rotate the geometry around a given coordinate. This modifies the geometry + * coordinates in place. + * @param {number} angle Rotation angle in radians. + * @param {import("../coordinate.js").Coordinate} anchor The rotation center. + * @api + * @override + */ + rotate(e, t) { + const i = this.geometries_; + for (let r = 0, s = i.length; r < s; ++r) + i[r].rotate(e, t); + this.changed(); + } + /** + * Scale the geometry (with an optional origin). This modifies the geometry + * coordinates in place. + * @abstract + * @param {number} sx The scaling factor in the x-direction. + * @param {number} [sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [anchor] The scale origin (defaults to the center + * of the geometry extent). + * @api + * @override + */ + scale(e, t, i) { + i || (i = Dt(this.getExtent())); + const r = this.geometries_; + for (let s = 0, o = r.length; s < o; ++s) + r[s].scale(e, t, i); + this.changed(); + } + /** + * Set the geometries that make up this geometry collection. + * @param {Array} geometries Geometries. + * @api + */ + setGeometries(e) { + this.setGeometriesArray(Th(e)); + } + /** + * @param {Array} geometries Geometries. + */ + setGeometriesArray(e) { + this.unlistenGeometriesChange_(), this.geometries_ = e, this.listenGeometriesChange_(), this.changed(); + } + /** + * Apply a transform function to the coordinates of the geometry. + * The geometry is modified in place. + * If you do not want the geometry modified in place, first `clone()` it and + * then use this function on the clone. + * @param {import("../proj.js").TransformFunction} transformFn Transform function. + * Called with a flat array of geometry coordinates. + * @api + * @override + */ + applyTransform(e) { + const t = this.geometries_; + for (let i = 0, r = t.length; i < r; ++i) + t[i].applyTransform(e); + this.changed(); + } + /** + * Translate the geometry. This modifies the geometry coordinates in place. If + * instead you want a new geometry, first `clone()` this geometry. + * @param {number} deltaX Delta X. + * @param {number} deltaY Delta Y. + * @api + * @override + */ + translate(e, t) { + const i = this.geometries_; + for (let r = 0, s = i.length; r < s; ++r) + i[r].translate(e, t); + this.changed(); + } + /** + * Clean up. + * @override + */ + disposeInternal() { + this.unlistenGeometriesChange_(), super.disposeInternal(); + } +} +function Th(n) { + return n.map((e) => e.clone()); +} +function UA(n, e, t, i, r, s, o) { + let a, l; + const A = (t - e) / i; + if (A === 1) + a = e; + else if (A === 2) + a = e, l = r; + else if (A !== 0) { + let c = n[e], h = n[e + 1], u = 0; + const g = [0]; + for (let f = e + i; f < t; f += i) { + const E = n[f], p = n[f + 1]; + u += Math.sqrt((E - c) * (E - c) + (p - h) * (p - h)), g.push(u), c = E, h = p; + } + const d = r * u, m = PC(g, d); + m < 0 ? (l = (d - g[-m - 2]) / (g[-m - 1] - g[-m - 2]), a = e + (-m - 2) * i) : a = e + m * i; + } + o = o > 1 ? o : 2, s = s || new Array(o); + for (let c = 0; c < o; ++c) + s[c] = a === void 0 ? NaN : l === void 0 ? n[a + c] : di(n[a + c], n[a + i + c], l); + return s; +} +function Pu(n, e, t, i, r, s) { + if (t == e) + return null; + let o; + if (r < n[e + i - 1]) + return s ? (o = n.slice(e, e + i), o[i - 1] = r, o) : null; + if (n[t - 1] < r) + return s ? (o = n.slice(t - i, t), o[i - 1] = r, o) : null; + if (r == n[e + i - 1]) + return n.slice(e, e + i); + let a = e / i, l = t / i; + for (; a < l; ) { + const u = a + l >> 1; + r < n[(u + 1) * i - 1] ? l = u : a = u + 1; + } + const A = n[a * i - 1]; + if (r == A) + return n.slice((a - 1) * i, (a - 1) * i + i); + const c = n[(a + 1) * i - 1], h = (r - A) / (c - A); + o = []; + for (let u = 0; u < i - 1; ++u) + o.push( + di( + n[(a - 1) * i + u], + n[a * i + u], + h + ) + ); + return o.push(r), o; +} +function vB(n, e, t, i, r, s, o) { + if (o) + return Pu( + n, + e, + t[t.length - 1], + i, + r, + s + ); + let a; + if (r < n[i - 1]) + return s ? (a = n.slice(0, i), a[i - 1] = r, a) : null; + if (n[n.length - 1] < r) + return s ? (a = n.slice(n.length - i), a[i - 1] = r, a) : null; + for (let l = 0, A = t.length; l < A; ++l) { + const c = t[l]; + if (e != c) { + if (r < n[e + i - 1]) + return null; + if (r <= n[c - 1]) + return Pu( + n, + e, + c, + i, + r, + !1 + ); + e = c; + } + } + return null; +} +function id(n, e, t, i) { + let r = n[e], s = n[e + 1], o = 0; + for (let a = e + i; a < t; a += i) { + const l = n[a], A = n[a + 1]; + o += Math.sqrt((l - r) * (l - r) + (A - s) * (A - s)), r = l, s = A; + } + return o; +} +function ZO(n, e, t, i) { + let r = id(n, e, t, i); + const s = n[t - i] - n[e], o = n[t - i + 1] - n[e + 1]; + return r += Math.sqrt(s * s + o * o), r; +} +class Ke extends _n { + /** + * @param {Array|Array} coordinates Coordinates. + * For internal use, flat coordinates in combination with `layout` are also accepted. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + constructor(e, t) { + super(), this.flatMidpoint_ = null, this.flatMidpointRevision_ = -1, this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, t !== void 0 && !Array.isArray(e[0]) ? this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ) : this.setCoordinates( + /** @type {Array} */ + e, + t + ); + } + /** + * Append the passed coordinate to the coordinates of the linestring. + * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. + * @api + */ + appendCoordinate(e) { + Se(this.flatCoordinates, e), this.changed(); + } + /** + * Make a complete copy of the geometry. + * @return {!LineString} Clone. + * @api + * @override + */ + clone() { + const e = new Ke( + this.flatCoordinates.slice(), + this.layout + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + return r < ss(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( + yg( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + 0 + ) + ), this.maxDeltaRevision_ = this.getRevision()), xg( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + this.maxDelta_, + !1, + e, + t, + i, + r + )); + } + /** + * Iterate over each segment, calling the provided callback. + * If the callback returns a truthy value the function returns that + * value immediately. Otherwise the function returns `false`. + * + * @param {function(this: S, import("../coordinate.js").Coordinate, import("../coordinate.js").Coordinate): T} callback Function + * called for each segment. The function will receive two arguments, the start and end coordinates of the segment. + * @return {T|boolean} Value. + * @template T,S + * @api + */ + forEachSegment(e) { + return Up( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e + ); + } + /** + * Returns the coordinate at `m` using linear interpolation, or `null` if no + * such coordinate exists. + * + * `extrapolate` controls extrapolation beyond the range of Ms in the + * MultiLineString. If `extrapolate` is `true` then Ms less than the first + * M will return the first coordinate and Ms greater than the last M will + * return the last coordinate. + * + * @param {number} m M. + * @param {boolean} [extrapolate] Extrapolate. Default is `false`. + * @return {import("../coordinate.js").Coordinate|null} Coordinate. + * @api + */ + getCoordinateAtM(e, t) { + return this.layout != "XYM" && this.layout != "XYZM" ? null : (t = t !== void 0 ? t : !1, Pu( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e, + t + )); + } + /** + * Return the coordinates of the linestring. + * @return {Array} Coordinates. + * @api + * @override + */ + getCoordinates() { + return kn( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride + ); + } + /** + * Return the coordinate at the provided fraction along the linestring. + * The `fraction` is a number between 0 and 1, where 0 is the start of the + * linestring and 1 is the end. + * @param {number} fraction Fraction. + * @param {import("../coordinate.js").Coordinate} [dest] Optional coordinate whose values will + * be modified. If not provided, a new coordinate will be returned. + * @return {import("../coordinate.js").Coordinate} Coordinate of the interpolated point. + * @api + */ + getCoordinateAt(e, t) { + return UA( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e, + t, + this.stride + ); + } + /** + * Return the length of the linestring on projected plane. + * @return {number} Length (on projected plane). + * @api + */ + getLength() { + return id( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride + ); + } + /** + * @return {Array} Flat midpoint. + */ + getFlatMidpoint() { + return this.flatMidpointRevision_ != this.getRevision() && (this.flatMidpoint_ = this.getCoordinateAt( + 0.5, + this.flatMidpoint_ ?? void 0 + ), this.flatMidpointRevision_ = this.getRevision()), /** @type {Array} */ + this.flatMidpoint_; + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {LineString} Simplified LineString. + * @protected + * @override + */ + getSimplifiedGeometryInternal(e) { + const t = []; + return t.length = hl( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e, + t, + 0 + ), new Ke(t, "XY"); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "LineString"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return Ic( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride, + e + ); + } + /** + * Set the coordinates of the linestring. + * @param {!Array} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 1), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = Al( + this.flatCoordinates, + 0, + e, + this.stride + ), this.changed(); + } +} +class Ot extends _n { + /** + * @param {Array|LineString>|Array} coordinates + * Coordinates or LineString geometries. (For internal use, flat coordinates in + * combination with `layout` and `ends` are also accepted.) + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @param {Array} [ends] Flat coordinate ends for internal use. + */ + constructor(e, t, i) { + if (super(), this.ends_ = [], this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, Array.isArray(e[0])) + this.setCoordinates( + /** @type {Array>} */ + e, + t + ); + else if (t !== void 0 && i) + this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ), this.ends_ = i; + else { + const r = ( + /** @type {Array} */ + e + ), s = [], o = []; + for (let l = 0, A = r.length; l < A; ++l) { + const c = r[l]; + Se(s, c.getFlatCoordinates()), o.push(s.length); + } + const a = r.length === 0 ? this.getLayout() : r[0].getLayout(); + this.setFlatCoordinates(a, s), this.ends_ = o; + } + } + /** + * Append the passed linestring to the multilinestring. + * @param {LineString} lineString LineString. + * @api + */ + appendLineString(e) { + Se(this.flatCoordinates, e.getFlatCoordinates().slice()), this.ends_.push(this.flatCoordinates.length), this.changed(); + } + /** + * Make a complete copy of the geometry. + * @return {!MultiLineString} Clone. + * @api + * @override + */ + clone() { + const e = new Ot( + this.flatCoordinates.slice(), + this.layout, + this.ends_.slice() + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + return r < ss(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( + wg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + 0 + ) + ), this.maxDeltaRevision_ = this.getRevision()), Bg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + this.maxDelta_, + !1, + e, + t, + i, + r + )); + } + /** + * Returns the coordinate at `m` using linear interpolation, or `null` if no + * such coordinate exists. + * + * `extrapolate` controls extrapolation beyond the range of Ms in the + * MultiLineString. If `extrapolate` is `true` then Ms less than the first + * M will return the first coordinate and Ms greater than the last M will + * return the last coordinate. + * + * `interpolate` controls interpolation between consecutive LineStrings + * within the MultiLineString. If `interpolate` is `true` the coordinates + * will be linearly interpolated between the last coordinate of one LineString + * and the first coordinate of the next LineString. If `interpolate` is + * `false` then the function will return `null` for Ms falling between + * LineStrings. + * + * @param {number} m M. + * @param {boolean} [extrapolate] Extrapolate. Default is `false`. + * @param {boolean} [interpolate] Interpolate. Default is `false`. + * @return {import("../coordinate.js").Coordinate|null} Coordinate. + * @api + */ + getCoordinateAtM(e, t, i) { + return this.layout != "XYM" && this.layout != "XYZM" || this.flatCoordinates.length === 0 ? null : (t = t !== void 0 ? t : !1, i = i !== void 0 ? i : !1, vB( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + e, + t, + i + )); + } + /** + * Return the coordinates of the multilinestring. + * @return {Array>} Coordinates. + * @api + * @override + */ + getCoordinates() { + return Fa( + this.flatCoordinates, + 0, + this.ends_, + this.stride + ); + } + /** + * @return {Array} Ends. + */ + getEnds() { + return this.ends_; + } + /** + * Return the linestring at the specified index. + * @param {number} index Index. + * @return {LineString} LineString. + * @api + */ + getLineString(e) { + return e < 0 || this.ends_.length <= e ? null : new Ke( + this.flatCoordinates.slice( + e === 0 ? 0 : this.ends_[e - 1], + this.ends_[e] + ), + this.layout + ); + } + /** + * Return the linestrings of this multilinestring. + * @return {Array} LineStrings. + * @api + */ + getLineStrings() { + const e = this.flatCoordinates, t = this.ends_, i = this.layout, r = []; + let s = 0; + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o], A = new Ke( + e.slice(s, l), + i + ); + r.push(A), s = l; + } + return r; + } + /** + * @return {Array} Flat midpoints. + */ + getFlatMidpoints() { + const e = [], t = this.flatCoordinates; + let i = 0; + const r = this.ends_, s = this.stride; + for (let o = 0, a = r.length; o < a; ++o) { + const l = r[o], A = UA( + t, + i, + l, + s, + 0.5 + ); + Se(e, A), i = l; + } + return e; + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {MultiLineString} Simplified MultiLineString. + * @protected + * @override + */ + getSimplifiedGeometryInternal(e) { + const t = [], i = []; + return t.length = Sg( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + e, + t, + 0, + i + ), new Ot(t, "XY", i); + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "MultiLineString"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return Vy( + this.flatCoordinates, + 0, + this.ends_, + this.stride, + e + ); + } + /** + * Set the coordinates of the multilinestring. + * @param {!Array>} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 2), this.flatCoordinates || (this.flatCoordinates = []); + const i = cl( + this.flatCoordinates, + 0, + e, + this.stride, + this.ends_ + ); + this.flatCoordinates.length = i.length === 0 ? 0 : i[i.length - 1], this.changed(); + } +} +class yi extends _n { + /** + * @param {Array|Array} coordinates Coordinates. + * For internal use, flat coordinates in combination with `layout` are also accepted. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + */ + constructor(e, t) { + super(), t && !Array.isArray(e[0]) ? this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ) : this.setCoordinates( + /** @type {Array} */ + e, + t + ); + } + /** + * Append the passed point to this multipoint. + * @param {Point} point Point. + * @api + */ + appendPoint(e) { + Se(this.flatCoordinates, e.getFlatCoordinates()), this.changed(); + } + /** + * Make a complete copy of the geometry. + * @return {!MultiPoint} Clone. + * @api + * @override + */ + clone() { + const e = new yi( + this.flatCoordinates.slice(), + this.layout + ); + return e.applyProperties(this), e; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + if (r < ss(this.getExtent(), e, t)) + return r; + const s = this.flatCoordinates, o = this.stride; + for (let a = 0, l = s.length; a < l; a += o) { + const A = dn( + e, + t, + s[a], + s[a + 1] + ); + if (A < r) { + r = A; + for (let c = 0; c < o; ++c) + i[c] = s[a + c]; + i.length = o; + } + } + return r; + } + /** + * Return the coordinates of the multipoint. + * @return {Array} Coordinates. + * @api + * @override + */ + getCoordinates() { + return kn( + this.flatCoordinates, + 0, + this.flatCoordinates.length, + this.stride + ); + } + /** + * Return the point at the specified index. + * @param {number} index Index. + * @return {Point} Point. + * @api + */ + getPoint(e) { + const t = this.flatCoordinates.length / this.stride; + return e < 0 || t <= e ? null : new Xe( + this.flatCoordinates.slice( + e * this.stride, + (e + 1) * this.stride + ), + this.layout + ); + } + /** + * Return the points of this multipoint. + * @return {Array} Points. + * @api + */ + getPoints() { + const e = this.flatCoordinates, t = this.layout, i = this.stride, r = []; + for (let s = 0, o = e.length; s < o; s += i) { + const a = new Xe(e.slice(s, s + i), t); + r.push(a); + } + return r; + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "MultiPoint"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + const t = this.flatCoordinates, i = this.stride; + for (let r = 0, s = t.length; r < s; r += i) { + const o = t[r], a = t[r + 1]; + if (hg(e, o, a)) + return !0; + } + return !1; + } + /** + * Set the coordinates of the multipoint. + * @param {!Array} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 1), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = Al( + this.flatCoordinates, + 0, + e, + this.stride + ), this.changed(); + } +} +function b_(n, e, t, i) { + const r = []; + let s = Ft(); + for (let o = 0, a = t.length; o < a; ++o) { + const l = t[o]; + s = ug( + n, + e, + l[0], + i + ), r.push((s[0] + s[2]) / 2, (s[1] + s[3]) / 2), e = l[l.length - 1]; + } + return r; +} +class Kt extends _n { + /** + * @param {Array>|Polygon>|Array} coordinates Coordinates. + * For internal use, flat coordinates in combination with `layout` and `endss` are also accepted. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @param {Array>} [endss] Array of ends for internal use with flat coordinates. + */ + constructor(e, t, i) { + if (super(), this.endss_ = [], this.flatInteriorPointsRevision_ = -1, this.flatInteriorPoints_ = null, this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, this.orientedRevision_ = -1, this.orientedFlatCoordinates_ = null, !i && !Array.isArray(e[0])) { + const r = ( + /** @type {Array} */ + e + ), s = [], o = []; + for (let a = 0, l = r.length; a < l; ++a) { + const A = r[a], c = s.length, h = A.getEnds(); + for (let u = 0, g = h.length; u < g; ++u) + h[u] += c; + Se(s, A.getFlatCoordinates()), o.push(h); + } + t = r.length === 0 ? this.getLayout() : r[0].getLayout(), e = s, i = o; + } + t !== void 0 && i ? (this.setFlatCoordinates( + t, + /** @type {Array} */ + e + ), this.endss_ = i) : this.setCoordinates( + /** @type {Array>>} */ + e, + t + ); + } + /** + * Append the passed polygon to this multipolygon. + * @param {Polygon} polygon Polygon. + * @api + */ + appendPolygon(e) { + let t; + if (!this.flatCoordinates) + this.flatCoordinates = e.getFlatCoordinates().slice(), t = e.getEnds().slice(), this.endss_.push(); + else { + const i = this.flatCoordinates.length; + Se(this.flatCoordinates, e.getFlatCoordinates()), t = e.getEnds().slice(); + for (let r = 0, s = t.length; r < s; ++r) + t[r] += i; + } + this.endss_.push(t), this.changed(); + } + /** + * Make a complete copy of the geometry. + * @return {!MultiPolygon} Clone. + * @api + * @override + */ + clone() { + const e = this.endss_.length, t = new Array(e); + for (let r = 0; r < e; ++r) + t[r] = this.endss_[r].slice(); + const i = new Kt( + this.flatCoordinates.slice(), + this.layout, + t + ); + return i.applyProperties(this), i; + } + /** + * @param {number} x X. + * @param {number} y Y. + * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + * @override + */ + closestPointXY(e, t, i, r) { + return r < ss(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( + Ny( + this.flatCoordinates, + 0, + this.endss_, + this.stride, + 0 + ) + ), this.maxDeltaRevision_ = this.getRevision()), Oy( + this.getOrientedFlatCoordinates(), + 0, + this.endss_, + this.stride, + this.maxDelta_, + !0, + e, + t, + i, + r + )); + } + /** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + * @override + */ + containsXY(e, t) { + return zy( + this.getOrientedFlatCoordinates(), + 0, + this.endss_, + this.stride, + e, + t + ); + } + /** + * Return the area of the multipolygon on projected plane. + * @return {number} Area (on projected plane). + * @api + */ + getArea() { + return Uy( + this.getOrientedFlatCoordinates(), + 0, + this.endss_, + this.stride + ); + } + /** + * Get the coordinate array for this geometry. This array has the structure + * of a GeoJSON coordinate array for multi-polygons. + * + * @param {boolean} [right] Orient coordinates according to the right-hand + * rule (counter-clockwise for exterior and clockwise for interior rings). + * If `false`, coordinates will be oriented according to the left-hand rule + * (clockwise for exterior and counter-clockwise for interior rings). + * By default, coordinate orientation will depend on how the geometry was + * constructed. + * @return {Array>>} Coordinates. + * @api + * @override + */ + getCoordinates(e) { + let t; + return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), Ru( + t, + 0, + this.endss_, + this.stride, + e + )) : t = this.flatCoordinates, Su( + t, + 0, + this.endss_, + this.stride + ); + } + /** + * @return {Array>} Endss. + */ + getEndss() { + return this.endss_; + } + /** + * @return {Array} Flat interior points. + */ + getFlatInteriorPoints() { + if (this.flatInteriorPointsRevision_ != this.getRevision()) { + const e = b_( + this.flatCoordinates, + 0, + this.endss_, + this.stride + ); + this.flatInteriorPoints_ = $p( + this.getOrientedFlatCoordinates(), + 0, + this.endss_, + this.stride, + e + ), this.flatInteriorPointsRevision_ = this.getRevision(); + } + return ( + /** @type {Array} */ + this.flatInteriorPoints_ + ); + } + /** + * Return the interior points as {@link module:ol/geom/MultiPoint~MultiPoint multipoint}. + * @return {MultiPoint} Interior points as XYM coordinates, where M is + * the length of the horizontal intersection that the point belongs to. + * @api + */ + getInteriorPoints() { + return new yi(this.getFlatInteriorPoints().slice(), "XYM"); + } + /** + * @return {Array} Oriented flat coordinates. + */ + getOrientedFlatCoordinates() { + if (this.orientedRevision_ != this.getRevision()) { + const e = this.flatCoordinates; + Vp(e, 0, this.endss_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = Ru( + this.orientedFlatCoordinates_, + 0, + this.endss_, + this.stride + )), this.orientedRevision_ = this.getRevision(); + } + return ( + /** @type {Array} */ + this.orientedFlatCoordinates_ + ); + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {MultiPolygon} Simplified MultiPolygon. + * @protected + * @override + */ + getSimplifiedGeometryInternal(e) { + const t = [], i = []; + return t.length = $y( + this.flatCoordinates, + 0, + this.endss_, + this.stride, + Math.sqrt(e), + t, + 0, + i + ), new Kt(t, "XY", i); + } + /** + * Return the polygon at the specified index. + * @param {number} index Index. + * @return {Polygon} Polygon. + * @api + */ + getPolygon(e) { + if (e < 0 || this.endss_.length <= e) + return null; + let t; + if (e === 0) + t = 0; + else { + const s = this.endss_[e - 1]; + t = s[s.length - 1]; + } + const i = this.endss_[e].slice(), r = i[i.length - 1]; + if (t !== 0) + for (let s = 0, o = i.length; s < o; ++s) + i[s] -= t; + return new it( + this.flatCoordinates.slice(t, r), + this.layout, + i + ); + } + /** + * Return the polygons of this multipolygon. + * @return {Array} Polygons. + * @api + */ + getPolygons() { + const e = this.layout, t = this.flatCoordinates, i = this.endss_, r = []; + let s = 0; + for (let o = 0, a = i.length; o < a; ++o) { + const l = i[o].slice(), A = l[l.length - 1]; + if (s !== 0) + for (let h = 0, u = l.length; h < u; ++h) + l[h] -= s; + const c = new it( + t.slice(s, A), + e, + l + ); + r.push(c), s = A; + } + return r; + } + /** + * Get the type of this geometry. + * @return {import("./Geometry.js").Type} Geometry type. + * @api + * @override + */ + getType() { + return "MultiPolygon"; + } + /** + * Test if the geometry and the passed extent intersect. + * @param {import("../extent.js").Extent} extent Extent. + * @return {boolean} `true` if the geometry and the extent intersect. + * @api + * @override + */ + intersectsExtent(e) { + return Hy( + this.getOrientedFlatCoordinates(), + 0, + this.endss_, + this.stride, + e + ); + } + /** + * Set the coordinates of the multipolygon. + * @param {!Array>>} coordinates Coordinates. + * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. + * @api + * @override + */ + setCoordinates(e, t) { + this.setLayout(t, e, 3), this.flatCoordinates || (this.flatCoordinates = []); + const i = Gp( + this.flatCoordinates, + 0, + e, + this.stride, + this.endss_ + ); + if (i.length === 0) + this.flatCoordinates.length = 0; + else { + const r = i[i.length - 1]; + this.flatCoordinates.length = r.length === 0 ? 0 : r[r.length - 1]; + } + this.changed(); + } +} +const fm = Fe(); +class Ut { + /** + * @param {Type} type Geometry type. + * @param {Array} flatCoordinates Flat coordinates. These always need + * to be right-handed for polygons. + * @param {Array} ends Ends. + * @param {number} stride Stride. + * @param {Object} properties Properties. + * @param {number|string|undefined} id Feature id. + */ + constructor(e, t, i, r, s, o) { + this.styleFunction, this.extent_, this.id_ = o, this.type_ = e, this.flatCoordinates_ = t, this.flatInteriorPoints_ = null, this.flatMidpoints_ = null, this.ends_ = i || null, this.properties_ = s, this.squaredTolerance_, this.stride_ = r, this.simplifiedGeometry_; + } + /** + * Get a feature property by its key. + * @param {string} key Key + * @return {*} Value for the requested key. + * @api + */ + get(e) { + return this.properties_[e]; + } + /** + * Get the extent of this feature's geometry. + * @return {import("../extent.js").Extent} Extent. + * @api + */ + getExtent() { + return this.extent_ || (this.extent_ = this.type_ === "Point" ? Xs(this.flatCoordinates_) : ug( + this.flatCoordinates_, + 0, + this.flatCoordinates_.length, + 2 + )), this.extent_; + } + /** + * @return {Array} Flat interior points. + */ + getFlatInteriorPoint() { + if (!this.flatInteriorPoints_) { + const e = Dt(this.getExtent()); + this.flatInteriorPoints_ = Qg( + this.flatCoordinates_, + 0, + this.ends_, + 2, + e, + 0 + ); + } + return this.flatInteriorPoints_; + } + /** + * @return {Array} Flat interior points. + */ + getFlatInteriorPoints() { + if (!this.flatInteriorPoints_) { + const e = yc(this.flatCoordinates_, this.ends_), t = b_(this.flatCoordinates_, 0, e, 2); + this.flatInteriorPoints_ = $p( + this.flatCoordinates_, + 0, + e, + 2, + t + ); + } + return this.flatInteriorPoints_; + } + /** + * @return {Array} Flat midpoint. + */ + getFlatMidpoint() { + return this.flatMidpoints_ || (this.flatMidpoints_ = UA( + this.flatCoordinates_, + 0, + this.flatCoordinates_.length, + 2, + 0.5 + )), this.flatMidpoints_; + } + /** + * @return {Array} Flat midpoints. + */ + getFlatMidpoints() { + if (!this.flatMidpoints_) { + this.flatMidpoints_ = []; + const e = this.flatCoordinates_; + let t = 0; + const i = ( + /** @type {Array} */ + this.ends_ + ); + for (let r = 0, s = i.length; r < s; ++r) { + const o = i[r], a = UA(e, t, o, 2, 0.5); + Se(this.flatMidpoints_, a), t = o; + } + } + return this.flatMidpoints_; + } + /** + * Get the feature identifier. This is a stable identifier for the feature and + * is set when reading data from a remote source. + * @return {number|string|undefined} Id. + * @api + */ + getId() { + return this.id_; + } + /** + * @return {Array} Flat coordinates. + */ + getOrientedFlatCoordinates() { + return this.flatCoordinates_; + } + /** + * For API compatibility with {@link module:ol/Feature~Feature}, this method is useful when + * determining the geometry type in style function (see {@link #getType}). + * @return {RenderFeature} Feature. + * @api + */ + getGeometry() { + return this; + } + /** + * @param {number} squaredTolerance Squared tolerance. + * @return {RenderFeature} Simplified geometry. + */ + getSimplifiedGeometry(e) { + return this; + } + /** + * Get a transformed and simplified version of the geometry. + * @param {number} squaredTolerance Squared tolerance. + * @param {import("../proj.js").TransformFunction} [transform] Optional transform function. + * @return {RenderFeature} Simplified geometry. + */ + simplifyTransformed(e, t) { + return this; + } + /** + * Get the feature properties. + * @return {Object} Feature properties. + * @api + */ + getProperties() { + return this.properties_; + } + /** + * Get an object of all property names and values. This has the same behavior as getProperties, + * but is here to conform with the {@link module:ol/Feature~Feature} interface. + * @return {Object?} Object. + */ + getPropertiesInternal() { + return this.properties_; + } + /** + * @return {number} Stride. + */ + getStride() { + return this.stride_; + } + /** + * @return {import('../style/Style.js').StyleFunction|undefined} Style + */ + getStyleFunction() { + return this.styleFunction; + } + /** + * Get the type of this feature's geometry. + * @return {Type} Geometry type. + * @api + */ + getType() { + return this.type_; + } + /** + * Transform geometry coordinates from tile pixel space to projected. + * + * @param {import("../proj.js").ProjectionLike} projection The data projection + */ + transform(e) { + e = q(e); + const t = e.getExtent(), i = e.getWorldExtent(); + if (t && i) { + const r = ze(i) / ze(t); + ai( + fm, + i[0], + i[3], + r, + -r, + 0, + 0, + 0 + ), fn( + this.flatCoordinates_, + 0, + this.flatCoordinates_.length, + 2, + fm, + this.flatCoordinates_ + ); + } + } + /** + * Apply a transform function to the coordinates of the geometry. + * The geometry is modified in place. + * If you do not want the geometry modified in place, first `clone()` it and + * then use this function on the clone. + * @param {import("../proj.js").TransformFunction} transformFn Transform function. + */ + applyTransform(e) { + e(this.flatCoordinates_, this.flatCoordinates_, this.stride_); + } + /** + * @return {RenderFeature} A cloned render feature. + */ + clone() { + var e; + return new Ut( + this.type_, + this.flatCoordinates_.slice(), + (e = this.ends_) == null ? void 0 : e.slice(), + this.stride_, + Object.assign({}, this.properties_), + this.id_ + ); + } + /** + * @return {Array|null} Ends. + */ + getEnds() { + return this.ends_; + } + /** + * Add transform and resolution based geometry simplification to this instance. + * @return {RenderFeature} This render feature. + */ + enableSimplifyTransformed() { + return this.simplifyTransformed = _p((e, t) => { + if (e === this.squaredTolerance_) + return this.simplifiedGeometry_; + this.simplifiedGeometry_ = this.clone(), t && this.simplifiedGeometry_.applyTransform(t); + const i = this.simplifiedGeometry_.getFlatCoordinates(); + let r; + switch (this.type_) { + case "LineString": + i.length = hl( + i, + 0, + this.simplifiedGeometry_.flatCoordinates_.length, + this.simplifiedGeometry_.stride_, + e, + i, + 0 + ), r = [i.length]; + break; + case "MultiLineString": + r = [], i.length = Sg( + i, + 0, + this.simplifiedGeometry_.ends_, + this.simplifiedGeometry_.stride_, + e, + i, + 0, + r + ); + break; + case "Polygon": + r = [], i.length = Rg( + i, + 0, + this.simplifiedGeometry_.ends_, + this.simplifiedGeometry_.stride_, + Math.sqrt(e), + i, + 0, + r + ); + break; + } + return r && (this.simplifiedGeometry_ = new Ut( + this.type_, + i, + r, + 2, + this.properties_, + this.id_ + )), this.squaredTolerance_ = e, this.simplifiedGeometry_; + }), this; + } +} +Ut.prototype.getFlatCoordinates = Ut.prototype.getOrientedFlatCoordinates; +function QB(n) { + const e = n.getType(); + switch (e) { + case "Point": + return new Xe(n.getFlatCoordinates()); + case "MultiPoint": + return new yi(n.getFlatCoordinates(), "XY"); + case "LineString": + return new Ke(n.getFlatCoordinates(), "XY"); + case "MultiLineString": + return new Ot( + n.getFlatCoordinates(), + "XY", + /** @type {Array} */ + n.getEnds() + ); + case "Polygon": + const t = n.getFlatCoordinates(), i = n.getEnds(), r = yc(t, i); + return r.length > 1 ? new Kt(t, "XY", r) : new it(t, "XY", i); + default: + throw new Error("Invalid geometry type:" + e); + } +} +function JO(n, e) { + const t = n.getId(), i = QB(n), r = n.getProperties(), s = new ve(); + return e !== void 0 && s.setGeometryName(e), s.setGeometry(i), t !== void 0 && s.setId(t), s.setProperties(r, !0), s; +} +class pl { + constructor() { + this.dataProjection = void 0, this.defaultFeatureProjection = void 0, this.featureClass = /** @type {FeatureToFeatureClass} */ + ve, this.supportedMediaTypes = null; + } + /** + * Adds the data projection to the read options. + * @param {Document|Element|Object|string} source Source. + * @param {ReadOptions} [options] Options. + * @return {ReadOptions|undefined} Options. + * @protected + */ + getReadOptions(e, t) { + if (t) { + let i = t.dataProjection ? q(t.dataProjection) : this.readProjection(e); + t.extent && i && i.getUnits() === "tile-pixels" && (i = q(i), i.setWorldExtent(t.extent)), t = { + dataProjection: i, + featureProjection: t.featureProjection + }; + } + return this.adaptOptions(t); + } + /** + * Sets the `dataProjection` on the options, if no `dataProjection` + * is set. + * @param {WriteOptions|ReadOptions|undefined} options + * Options. + * @protected + * @return {WriteOptions|ReadOptions|undefined} + * Updated options. + */ + adaptOptions(e) { + return Object.assign( + { + dataProjection: this.dataProjection, + featureProjection: this.defaultFeatureProjection, + featureClass: this.featureClass + }, + e + ); + } + /** + * @abstract + * @return {Type} The format type. + */ + getType() { + return ae(); + } + /** + * Read a single feature from a source. + * + * @abstract + * @param {Document|Element|Object|string} source Source. + * @param {ReadOptions} [options] Read options. + * @return {FeatureType|Array} Feature. + */ + readFeature(e, t) { + return ae(); + } + /** + * Read all features from a source. + * + * @abstract + * @param {Document|Element|ArrayBuffer|Object|string} source Source. + * @param {ReadOptions} [options] Read options. + * @return {Array} Features. + */ + readFeatures(e, t) { + return ae(); + } + /** + * Read a single geometry from a source. + * + * @abstract + * @param {Document|Element|Object|string} source Source. + * @param {ReadOptions} [options] Read options. + * @return {import("../geom/Geometry.js").default} Geometry. + */ + readGeometry(e, t) { + return ae(); + } + /** + * Read the projection from a source. + * + * @abstract + * @param {Document|Element|Object|string} source Source. + * @return {import("../proj/Projection.js").default|undefined} Projection. + */ + readProjection(e) { + return ae(); + } + /** + * Encode a feature in this format. + * + * @abstract + * @param {Feature} feature Feature. + * @param {WriteOptions} [options] Write options. + * @return {string|ArrayBuffer} Result. + */ + writeFeature(e, t) { + return ae(); + } + /** + * Encode an array of features in this format. + * + * @abstract + * @param {Array} features Features. + * @param {WriteOptions} [options] Write options. + * @return {string|ArrayBuffer} Result. + */ + writeFeatures(e, t) { + return ae(); + } + /** + * Write a single geometry in this format. + * + * @abstract + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {WriteOptions} [options] Write options. + * @return {string|ArrayBuffer} Result. + */ + writeGeometry(e, t) { + return ae(); + } +} +function je(n, e, t) { + const i = t ? q(t.featureProjection) : null, r = t ? q(t.dataProjection) : null; + let s = n; + if (i && r && !_i(i, r)) { + e && (s = /** @type {T} */ + n.clone()); + const o = e ? i : r, a = e ? r : i; + o.getUnits() === "tile-pixels" ? s.transform(o, a) : s.applyTransform(Xi(o, a)); + } + if (e && t && /** @type {WriteOptions} */ + t.decimals !== void 0) { + const o = Math.pow( + 10, + /** @type {WriteOptions} */ + t.decimals + ), a = function(l) { + for (let A = 0, c = l.length; A < c; ++A) + l[A] = Math.round(l[A] * o) / o; + return l; + }; + s === n && (s = /** @type {T} */ + n.clone()), s.applyTransform(a); + } + return s; +} +function nd(n, e) { + const t = e ? q(e.featureProjection) : null, i = e ? q(e.dataProjection) : null; + return t && i && !_i(t, i) ? _c(n, i, t) : n; +} +const DB = { + Point: Xe, + LineString: Ke, + Polygon: it, + MultiPoint: yi, + MultiLineString: Ot, + MultiPolygon: Kt +}; +function LB(n, e, t) { + return Array.isArray(e[0]) ? (Vp(n, 0, e, t) || (n = n.slice(), Ru(n, 0, e, t)), n) : (Dg(n, 0, e, t) || (n = n.slice(), LA(n, 0, e, t)), n); +} +function P_(n, e) { + var s; + const t = n.geometry; + if (!t) + return []; + if (Array.isArray(t)) + return t.map((o) => P_({ ...n, geometry: o })).flat(); + const i = t.type === "MultiPolygon" ? "Polygon" : t.type; + if (i === "GeometryCollection" || i === "Circle") + throw new Error("Unsupported geometry type: " + i); + const r = t.layout.length; + return je( + new Ut( + i, + i === "Polygon" ? LB(t.flatCoordinates, t.ends, r) : t.flatCoordinates, + (s = t.ends) == null ? void 0 : s.flat(), + r, + n.properties || {}, + n.id + ).enableSimplifyTransformed(), + !1, + e + ); +} +function rd(n, e) { + if (!n) + return null; + if (Array.isArray(n)) { + const i = n.map( + (r) => rd(r, e) + ); + return new _t(i); + } + const t = DB[n.type]; + return je( + new t(n.flatCoordinates, n.layout, n.ends), + !1, + e + ); +} +class sd extends pl { + constructor() { + super(); + } + /** + * @return {import("./Feature.js").Type} Format. + * @override + */ + getType() { + return "json"; + } + /** + * Read a feature. Only works for a single feature. Use `readFeatures` to + * read a feature collection. + * + * @param {ArrayBuffer|Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {FeatureType|Array} Feature. + * @api + * @override + */ + readFeature(e, t) { + return this.readFeatureFromObject( + zl(e), + this.getReadOptions(e, t) + ); + } + /** + * Read all features. Works with both a single feature and a feature + * collection. + * + * @param {ArrayBuffer|Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {Array} Features. + * @api + * @override + */ + readFeatures(e, t) { + return this.readFeaturesFromObject( + zl(e), + this.getReadOptions(e, t) + ); + } + /** + * @abstract + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {FeatureType|Array} Feature. + */ + readFeatureFromObject(e, t) { + return ae(); + } + /** + * @abstract + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {Array} Features. + */ + readFeaturesFromObject(e, t) { + return ae(); + } + /** + * Read a geometry. + * + * @param {ArrayBuffer|Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../geom/Geometry.js").default} Geometry. + * @api + * @override + */ + readGeometry(e, t) { + return this.readGeometryFromObject( + zl(e), + this.getReadOptions(e, t) + ); + } + /** + * @abstract + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + */ + readGeometryFromObject(e, t) { + return ae(); + } + /** + * Read the projection. + * + * @param {ArrayBuffer|Document|Element|Object|string} source Source. + * @return {import("../proj/Projection.js").default} Projection. + * @api + * @override + */ + readProjection(e) { + return this.readProjectionFromObject(zl(e)); + } + /** + * @abstract + * @param {Object} object Object. + * @protected + * @return {import("../proj/Projection.js").default} Projection. + */ + readProjectionFromObject(e) { + return ae(); + } + /** + * Encode a feature as string. + * + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded feature. + * @api + * @override + */ + writeFeature(e, t) { + return JSON.stringify(this.writeFeatureObject(e, t)); + } + /** + * @abstract + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {Object} Object. + */ + writeFeatureObject(e, t) { + return ae(); + } + /** + * Encode an array of features as string. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded features. + * @api + * @override + */ + writeFeatures(e, t) { + return JSON.stringify(this.writeFeaturesObject(e, t)); + } + /** + * @abstract + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {Object} Object. + */ + writeFeaturesObject(e, t) { + return ae(); + } + /** + * Encode a geometry as string. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded geometry. + * @api + * @override + */ + writeGeometry(e, t) { + return JSON.stringify(this.writeGeometryObject(e, t)); + } + /** + * @abstract + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {Object} Object. + */ + writeGeometryObject(e, t) { + return ae(); + } +} +function zl(n) { + if (typeof n == "string") { + const e = JSON.parse(n); + return e || null; + } + return n !== null ? n : null; +} +const FB = { + Point: MB, + LineString: NB, + Polygon: $B, + MultiPoint: GB, + MultiLineString: OB, + MultiPolygon: kB +}, bB = { + Point: UB, + LineString: YB, + Polygon: zB, + MultiPoint: HB, + MultiLineString: VB, + MultiPolygon: XB +}; +class eG extends sd { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super(), this.geometryName_ = e.geometryName; + } + /** + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @param {string} [idField] Name of the field where to get the id from. + * @protected + * @return {import("../Feature.js").default} Feature. + * @override + */ + readFeatureFromObject(e, t, i) { + const r = ( + /** @type {EsriJSONFeature} */ + e + ), s = mm(r.geometry, t), o = new ve(); + if (this.geometryName_ && o.setGeometryName(this.geometryName_), o.setGeometry(s), r.attributes) { + o.setProperties(r.attributes, !0); + const a = r.attributes[i]; + a !== void 0 && o.setId( + /** @type {number} */ + a + ); + } + return o; + } + /** + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {Array} Features. + * @override + */ + readFeaturesFromObject(e, t) { + if (t = t || {}, e.features) { + const i = ( + /** @type {EsriJSONFeatureSet} */ + e + ), r = [], s = i.features; + for (let o = 0, a = s.length; o < a; ++o) + r.push( + this.readFeatureFromObject( + s[o], + t, + e.objectIdFieldName + ) + ); + return r; + } + return [this.readFeatureFromObject(e, t)]; + } + /** + * @param {EsriJSONGeometry} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + * @override + */ + readGeometryFromObject(e, t) { + return mm(e, t); + } + /** + * @param {Object} object Object. + * @protected + * @return {import("../proj/Projection.js").default} Projection. + * @override + */ + readProjectionFromObject(e) { + if (e.spatialReference && e.spatialReference.wkid !== void 0) { + const i = /** @type {EsriJSONSpatialReferenceWkid} */ e.spatialReference.wkid; + return q("EPSG:" + i); + } + return null; + } + /** + * Encode a geometry as a EsriJSON object. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {EsriJSONGeometry} Object. + * @api + * @override + */ + writeGeometryObject(e, t) { + return Em(e, this.adaptOptions(t)); + } + /** + * Encode a feature as a esriJSON Feature object. + * + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {Object} Object. + * @api + * @override + */ + writeFeatureObject(e, t) { + t = this.adaptOptions(t); + const i = {}; + if (!e.hasProperties()) + return i.attributes = {}, i; + const r = e.getProperties(), s = e.getGeometry(); + if (s) { + i.geometry = Em(s, t); + const o = t && (t.dataProjection || t.featureProjection); + o && (i.geometry.spatialReference = /** @type {EsriJSONSpatialReferenceWkid} */ + { + wkid: Number(q(o).getCode().split(":").pop()) + }), delete r[e.getGeometryName()]; + } + return Hi(r) ? i.attributes = {} : i.attributes = r, i; + } + /** + * Encode an array of features as a EsriJSON object. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {EsriJSONFeatureSet} EsriJSON Object. + * @api + * @override + */ + writeFeaturesObject(e, t) { + t = this.adaptOptions(t); + const i = []; + for (let r = 0, s = e.length; r < s; ++r) + i.push(this.writeFeatureObject(e[r], t)); + return { + features: i + }; + } +} +function mm(n, e) { + if (!n) + return null; + let t; + if (typeof n.x == "number" && typeof n.y == "number") + t = "Point"; + else if (n.points) + t = "MultiPoint"; + else if (n.paths) + /** @type {EsriJSONPolyline} */ + n.paths.length === 1 ? t = "LineString" : t = "MultiLineString"; + else if (n.rings) { + const r = ( + /** @type {EsriJSONPolygon} */ + n + ), s = bo(r), o = PB(r.rings, s); + o.length === 1 ? (t = "Polygon", n = Object.assign({}, n, { rings: o[0] })) : (t = "MultiPolygon", n = Object.assign({}, n, { rings: o })); + } + const i = FB[t]; + return je(i(n), !1, e); +} +function PB(n, e) { + const t = [], i = [], r = []; + let s, o; + for (s = 0, o = n.length; s < o; ++s) + t.length = 0, Al(t, 0, n[s], e.length), Cc( + t, + 0, + t.length, + e.length + ) ? i.push([n[s]]) : r.push(n[s]); + for (; r.length; ) { + const a = r.shift(); + let l = !1; + for (s = i.length - 1; s >= 0; s--) { + const A = i[s][0]; + if (Mt( + new _r(A).getExtent(), + new _r(a).getExtent() + )) { + i[s].push(a), l = !0; + break; + } + } + l || i.push([a.reverse()]); + } + return i; +} +function MB(n) { + let e; + return n.m !== void 0 && n.z !== void 0 ? e = new Xe([n.x, n.y, n.z, n.m], "XYZM") : n.z !== void 0 ? e = new Xe([n.x, n.y, n.z], "XYZ") : n.m !== void 0 ? e = new Xe([n.x, n.y, n.m], "XYM") : e = new Xe([n.x, n.y]), e; +} +function NB(n) { + const e = bo(n); + return new Ke(n.paths[0], e); +} +function OB(n) { + const e = bo(n); + return new Ot(n.paths, e); +} +function bo(n) { + let e = "XY"; + return n.hasZ === !0 && n.hasM === !0 ? e = "XYZM" : n.hasZ === !0 ? e = "XYZ" : n.hasM === !0 && (e = "XYM"), e; +} +function GB(n) { + const e = bo(n); + return new yi(n.points, e); +} +function kB(n) { + const e = bo(n); + return new Kt(n.rings, e); +} +function $B(n) { + const e = bo(n); + return new it(n.rings, e); +} +function UB(n, e) { + const t = n.getCoordinates(); + let i; + const r = n.getLayout(); + if (r === "XYZ") + i = { + x: t[0], + y: t[1], + z: t[2] + }; + else if (r === "XYM") + i = { + x: t[0], + y: t[1], + m: t[2] + }; + else if (r === "XYZM") + i = { + x: t[0], + y: t[1], + z: t[2], + m: t[3] + }; + else if (r === "XY") + i = { + x: t[0], + y: t[1] + }; + else + throw new Error("Invalid geometry layout"); + return i; +} +function _l(n) { + const e = n.getLayout(); + return { + hasZ: e === "XYZ" || e === "XYZM", + hasM: e === "XYM" || e === "XYZM" + }; +} +function YB(n, e) { + const t = _l(n); + return { + hasZ: t.hasZ, + hasM: t.hasM, + paths: [ + /** @type {Array} */ + n.getCoordinates() + ] + }; +} +function zB(n, e) { + const t = _l(n); + return { + hasZ: t.hasZ, + hasM: t.hasM, + rings: ( + /** @type {Array>} */ + n.getCoordinates(!1) + ) + }; +} +function VB(n, e) { + const t = _l(n); + return { + hasZ: t.hasZ, + hasM: t.hasM, + paths: ( + /** @type {Array>} */ + n.getCoordinates() + ) + }; +} +function HB(n, e) { + const t = _l(n); + return { + hasZ: t.hasZ, + hasM: t.hasM, + points: ( + /** @type {Array} */ + n.getCoordinates() + ) + }; +} +function XB(n, e) { + const t = _l(n), i = n.getCoordinates(!1), r = []; + for (let s = 0; s < i.length; s++) + for (let o = i[s].length - 1; o >= 0; o--) + r.push(i[s][o]); + return { + hasZ: t.hasZ, + hasM: t.hasM, + rings: ( + /** @type {Array>} */ + r + ) + }; +} +function Em(n, e) { + const t = bB[n.getType()]; + return t( + je(n, !0, e), + e + ); +} +const Kr = "http://www.w3.org/2001/XMLSchema-instance"; +function fe(n, e) { + return Po().createElementNS(n, e); +} +function Wt(n, e) { + return M_(n, e, []).join(""); +} +function M_(n, e, t) { + if (n.nodeType == Node.CDATA_SECTION_NODE || n.nodeType == Node.TEXT_NODE) + e ? t.push(String(n.nodeValue).replace(/(\r\n|\r|\n)/g, "")) : t.push(n.nodeValue); + else { + let i; + for (i = n.firstChild; i; i = i.nextSibling) + M_(i, e, t); + } + return t; +} +function vi(n) { + return "documentElement" in n; +} +function qB(n, e, t) { + return n.getAttributeNS(e, t) || ""; +} +function Qi(n) { + return new DOMParser().parseFromString(n, "application/xml"); +} +function YA(n, e) { + return ( + /** + * @param {Node} node Node. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(t, i) { + const r = n.call(e ?? this, t, i); + if (r !== void 0) { + const s = ( + /** @type {Array<*>} */ + i[i.length - 1] + ); + Se(s, r); + } + } + ); +} +function re(n, e) { + return ( + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(t, i) { + const r = n.call(e ?? this, t, i); + r !== void 0 && /** @type {Array<*>} */ + i[i.length - 1].push(r); + } + ); +} +function Ae(n, e) { + return ( + /** + * @param {Node} node Node. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(t, i) { + const r = n.call(e ?? this, t, i); + r !== void 0 && (i[i.length - 1] = r); + } + ); +} +function $e(n, e, t) { + return ( + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(i, r) { + const s = n.call(t ?? this, i, r); + if (s !== void 0) { + const o = ( + /** @type {!Object} */ + r[r.length - 1] + ), a = e !== void 0 ? e : i.localName; + let l; + a in o ? l = o[a] : (l = [], o[a] = l), l.push(s); + } + } + ); +} +function R(n, e, t) { + return ( + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(i, r) { + const s = n.call(t ?? this, i, r); + if (s !== void 0) { + const o = ( + /** @type {!Object} */ + r[r.length - 1] + ), a = e !== void 0 ? e : i.localName; + o[a] = s; + } + } + ); +} +function D(n, e) { + return ( + /** + * @param {Element} node Node. + * @param {*} value Value to be written. + * @param {Array<*>} objectStack Object stack. + * @this {*} + */ + function(t, i, r) { + n.call(e ?? this, t, i, r), /** @type {NodeStackItem} */ + r[r.length - 1].node.appendChild(t); + } + ); +} +function N_(n, e) { + let t, i; + return function(r, s, o) { + if (t === void 0) { + t = {}; + const a = {}; + a[r.localName] = n, t[r.namespaceURI] = a, i = ot(r.localName); + } + O_(t, i, s, o); + }; +} +function ot(n, e) { + return ( + /** + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [newNodeName] Node name. + * @return {Node} Node. + */ + function(t, i, r) { + const o = /** @type {NodeStackItem} */ i[i.length - 1].node; + let a = n; + a === void 0 && (a = r); + const l = e !== void 0 ? e : o.namespaceURI; + return fe( + l, + /** @type {string} */ + a + ); + } + ); +} +const Lt = ot(); +function Ai(n, e) { + const t = e.length, i = new Array(t); + for (let r = 0; r < t; ++r) + i[r] = n[e[r]]; + return i; +} +function O(n, e, t) { + t = t !== void 0 ? t : {}; + let i, r; + for (i = 0, r = n.length; i < r; ++i) + t[n[i]] = e; + return t; +} +function oi(n, e, t, i) { + let r; + for (r = e.firstElementChild; r; r = r.nextElementSibling) { + const s = n[r.namespaceURI]; + if (s !== void 0) { + const o = s[r.localName]; + o !== void 0 && o.call(i, r, t); + } + } +} +function k(n, e, t, i, r) { + return i.push(n), oi(e, t, i, r), /** @type {T} */ + i.pop(); +} +function O_(n, e, t, i, r, s) { + const o = (r !== void 0 ? r : t).length; + let a, l; + for (let A = 0; A < o; ++A) + a = t[A], a !== void 0 && (l = e.call( + s, + a, + i, + r !== void 0 ? r[A] : void 0 + ), l !== void 0 && n[l.namespaceURI][l.localName].call( + s, + l, + a, + i + )); +} +function Ee(n, e, t, i, r, s, o) { + return r.push(n), O_(e, t, i, r, s, o), /** @type {O|undefined} */ + r.pop(); +} +let CA; +function tG(n) { + CA = n; +} +function jB() { + return CA === void 0 && typeof XMLSerializer < "u" && (CA = new XMLSerializer()), CA; +} +let yA; +function iG(n) { + yA = n; +} +function Po() { + return yA === void 0 && typeof document < "u" && (yA = document.implementation.createDocument("", "", null)), yA; +} +class Mo extends pl { + constructor() { + super(), this.xmlSerializer_ = jB(); + } + /** + * @return {import("./Feature.js").Type} Format. + * @override + */ + getType() { + return "xml"; + } + /** + * Read a single feature. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../Feature.js").default} Feature. + * @api + * @override + */ + readFeature(e, t) { + if (!e) + return null; + if (typeof e == "string") { + const i = Qi(e); + return this.readFeatureFromDocument(i, t); + } + return vi(e) ? this.readFeatureFromDocument( + /** @type {Document} */ + e, + t + ) : this.readFeatureFromNode( + /** @type {Element} */ + e, + t + ); + } + /** + * @param {Document} doc Document. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {import("../Feature.js").default} Feature. + */ + readFeatureFromDocument(e, t) { + const i = this.readFeaturesFromDocument(e, t); + return i.length > 0 ? i[0] : null; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {import("../Feature.js").default} Feature. + */ + readFeatureFromNode(e, t) { + return null; + } + /** + * Read all features from a feature collection. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {Array} Features. + * @api + * @override + */ + readFeatures(e, t) { + if (!e) + return []; + if (typeof e == "string") { + const i = Qi(e); + return this.readFeaturesFromDocument(i, t); + } + return vi(e) ? this.readFeaturesFromDocument( + /** @type {Document} */ + e, + t + ) : this.readFeaturesFromNode( + /** @type {Element} */ + e, + t + ); + } + /** + * @param {Document} doc Document. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @protected + * @return {Array} Features. + */ + readFeaturesFromDocument(e, t) { + const i = []; + for (let r = e.firstChild; r; r = r.nextSibling) + r.nodeType == Node.ELEMENT_NODE && Se( + i, + this.readFeaturesFromNode( + /** @type {Element} */ + r, + t + ) + ); + return i; + } + /** + * @abstract + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @protected + * @return {Array} Features. + */ + readFeaturesFromNode(e, t) { + return ae(); + } + /** + * Read a single geometry from a source. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../geom/Geometry.js").default} Geometry. + * @override + */ + readGeometry(e, t) { + if (!e) + return null; + if (typeof e == "string") { + const i = Qi(e); + return this.readGeometryFromDocument(i, t); + } + return vi(e) ? this.readGeometryFromDocument( + /** @type {Document} */ + e, + t + ) : this.readGeometryFromNode( + /** @type {Element} */ + e, + t + ); + } + /** + * @param {Document} doc Document. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + */ + readGeometryFromDocument(e, t) { + return null; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + */ + readGeometryFromNode(e, t) { + return null; + } + /** + * Read the projection from the source. + * + * @param {Document|Element|Object|string} source Source. + * @return {import("../proj/Projection.js").default} Projection. + * @api + * @override + */ + readProjection(e) { + if (!e) + return null; + if (typeof e == "string") { + const t = Qi(e); + return this.readProjectionFromDocument(t); + } + return vi(e) ? this.readProjectionFromDocument( + /** @type {Document} */ + e + ) : this.readProjectionFromNode( + /** @type {Element} */ + e + ); + } + /** + * @param {Document} doc Document. + * @protected + * @return {import("../proj/Projection.js").default} Projection. + */ + readProjectionFromDocument(e) { + return this.dataProjection; + } + /** + * @param {Element} node Node. + * @protected + * @return {import("../proj/Projection.js").default} Projection. + */ + readProjectionFromNode(e) { + return this.dataProjection; + } + /** + * Encode a feature as string. + * + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded feature. + * @override + */ + writeFeature(e, t) { + const i = this.writeFeatureNode(e, t); + return this.xmlSerializer_.serializeToString(i); + } + /** + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @protected + * @return {Node} Node. + */ + writeFeatureNode(e, t) { + return null; + } + /** + * Encode an array of features as string. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Result. + * @api + * @override + */ + writeFeatures(e, t) { + const i = this.writeFeaturesNode(e, t); + return this.xmlSerializer_.serializeToString(i); + } + /** + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Node} Node. + */ + writeFeaturesNode(e, t) { + return null; + } + /** + * Encode a geometry as string. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded geometry. + * @override + */ + writeGeometry(e, t) { + const i = this.writeGeometryNode(e, t); + return this.xmlSerializer_.serializeToString(i); + } + /** + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Node} Node. + */ + writeGeometryNode(e, t) { + return null; + } +} +const Vn = "http://www.opengis.net/gml", KB = /^\s*$/; +class ne extends Mo { + /** + * @param {Options} [options] Optional configuration object. + */ + constructor(e) { + super(), e = e || {}, this.featureType = e.featureType, this.featureNS = e.featureNS, this.srsName = e.srsName, this.schemaLocation = "", this.FEATURE_COLLECTION_PARSERS = {}, this.FEATURE_COLLECTION_PARSERS[this.namespace] = { + featureMember: re(this.readFeaturesInternal), + featureMembers: Ae(this.readFeaturesInternal) + }, this.supportedMediaTypes = ["application/gml+xml"]; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array | undefined} Features. + */ + readFeaturesInternal(e, t) { + const i = e.localName; + let r = null; + if (i == "FeatureCollection") + r = k( + [], + this.FEATURE_COLLECTION_PARSERS, + e, + t, + this + ); + else if (i == "featureMembers" || i == "featureMember" || i == "member") { + const s = t[0]; + let o = s.featureType, a = s.featureNS; + const l = "p", A = "p0"; + if (!o && e.childNodes) { + o = [], a = {}; + for (let u = 0, g = e.childNodes.length; u < g; ++u) { + const d = ( + /** @type {Element} */ + e.childNodes[u] + ); + if (d.nodeType === 1) { + const m = d.nodeName.split(":").pop(); + if (!o.includes(m)) { + let f = "", E = 0; + const p = d.namespaceURI; + for (const _ in a) { + if (a[_] === p) { + f = _; + break; + } + ++E; + } + f || (f = l + E, a[f] = p), o.push(f + ":" + m); + } + } + } + i != "featureMember" && (s.featureType = o, s.featureNS = a); + } + if (typeof a == "string") { + const u = a; + a = {}, a[A] = u; + } + const c = {}, h = Array.isArray(o) ? o : [o]; + for (const u in a) { + const g = {}; + for (let d = 0, m = h.length; d < m; ++d) + (h[d].includes(":") ? h[d].split(":")[0] : A) === u && (g[h[d].split(":").pop()] = i == "featureMembers" ? re(this.readFeatureElement, this) : Ae(this.readFeatureElement, this)); + c[a[u]] = g; + } + i == "featureMember" || i == "member" ? r = k(void 0, c, e, t) : r = k([], c, e, t); + } + return r === null && (r = []), r; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {import("../geom/Geometry.js").default|import("../extent.js").Extent|undefined} Geometry. + */ + readGeometryOrExtent(e, t) { + const i = ( + /** @type {Object} */ + t[0] + ); + return i.srsName = e.firstElementChild.getAttribute("srsName"), i.srsDimension = e.firstElementChild.getAttribute("srsDimension"), k( + null, + this.GEOMETRY_PARSERS, + e, + t, + this + ); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {import("../extent.js").Extent|undefined} Geometry. + */ + readExtentElement(e, t) { + const i = ( + /** @type {Object} */ + t[0] + ), r = ( + /** @type {import("../extent.js").Extent} */ + this.readGeometryOrExtent(e, t) + ); + return r ? nd(r, i) : void 0; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {import("../geom/Geometry.js").default|undefined} Geometry. + */ + readGeometryElement(e, t) { + const i = ( + /** @type {Object} */ + t[0] + ), r = ( + /** @type {import("../geom/Geometry.js").default} */ + this.readGeometryOrExtent(e, t) + ); + return r ? je(r, !1, i) : void 0; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @param {boolean} asFeature whether result should be wrapped as a feature. + * @return {Feature|Object} Feature + */ + readFeatureElementInternal(e, t, i) { + let r; + const s = {}; + for (let l = e.firstElementChild; l; l = l.nextElementSibling) { + let A; + const c = l.localName; + l.childNodes.length === 0 || l.childNodes.length === 1 && (l.firstChild.nodeType === 3 || l.firstChild.nodeType === 4) ? (A = Wt(l, !1), KB.test(A) && (A = void 0)) : (i && (A = c === "boundedBy" ? this.readExtentElement(l, t) : this.readGeometryElement(l, t)), A ? c !== "boundedBy" && (r = c) : A = this.readFeatureElementInternal(l, t, !1)); + const h = l.attributes.length; + if (h > 0 && !(A instanceof Cg)) { + A = { _content_: A }; + for (let u = 0; u < h; u++) { + const g = l.attributes[u].name; + A[g] = l.attributes[u].value; + } + } + s[c] ? (s[c] instanceof Array || (s[c] = [s[c]]), s[c].push(A)) : s[c] = A; + } + if (!i) + return s; + const o = new ve(s); + r && o.setGeometryName(r); + const a = e.getAttribute("fid") || qB(e, this.namespace, "id"); + return a && o.setId(a), o; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Feature} Feature. + */ + readFeatureElement(e, t) { + return this.readFeatureElementInternal(e, t, !0); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Point|undefined} Point. + */ + readPoint(e, t) { + const i = this.readFlatCoordinatesFromNode(e, t); + if (i) + return new Xe(i, "XYZ"); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {MultiPoint|undefined} MultiPoint. + */ + readMultiPoint(e, t) { + const i = k( + [], + this.MULTIPOINT_PARSERS, + e, + t, + this + ); + if (i) + return new yi(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {MultiLineString|undefined} MultiLineString. + */ + readMultiLineString(e, t) { + const i = k( + [], + this.MULTILINESTRING_PARSERS, + e, + t, + this + ); + if (i) + return new Ot(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {MultiPolygon|undefined} MultiPolygon. + */ + readMultiPolygon(e, t) { + const i = k( + [], + this.MULTIPOLYGON_PARSERS, + e, + t, + this + ); + if (i) + return new Kt(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + pointMemberParser(e, t) { + oi(this.POINTMEMBER_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + lineStringMemberParser(e, t) { + oi(this.LINESTRINGMEMBER_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + polygonMemberParser(e, t) { + oi(this.POLYGONMEMBER_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {LineString|undefined} LineString. + */ + readLineString(e, t) { + const i = this.readFlatCoordinatesFromNode(e, t); + if (i) + return new Ke(i, "XYZ"); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} LinearRing flat coordinates. + */ + readFlatLinearRing(e, t) { + const i = k( + null, + this.GEOMETRY_FLAT_COORDINATES_PARSERS, + e, + t, + this + ); + if (i) + return i; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {LinearRing|undefined} LinearRing. + */ + readLinearRing(e, t) { + const i = this.readFlatCoordinatesFromNode(e, t); + if (i) + return new _r(i, "XYZ"); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Polygon|undefined} Polygon. + */ + readPolygon(e, t) { + const i = k( + [null], + this.FLAT_LINEAR_RINGS_PARSERS, + e, + t, + this + ); + if (i && i[0]) { + const r = i[0], s = [r.length]; + let o, a; + for (o = 1, a = i.length; o < a; ++o) + Se(r, i[o]), s.push(r.length); + return new it(r, "XYZ", s); + } + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array} Flat coordinates. + */ + readFlatCoordinatesFromNode(e, t) { + return k( + null, + this.GEOMETRY_FLAT_COORDINATES_PARSERS, + e, + t, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + * @override + */ + readGeometryFromNode(e, t) { + const i = this.readGeometryElement(e, [ + this.getReadOptions(e, t || {}) + ]); + return i || null; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {Array} Features. + * @override + */ + readFeaturesFromNode(e, t) { + const i = { + featureType: this.featureType, + featureNS: this.featureNS + }; + return i && Object.assign(i, this.getReadOptions(e, t)), this.readFeaturesInternal(e, [i]) || []; + } + /** + * @param {Element} node Node. + * @return {import("../proj/Projection.js").default} Projection. + * @override + */ + readProjectionFromNode(e) { + return q( + this.srsName ? this.srsName : e.firstElementChild.getAttribute("srsName") + ); + } +} +ne.prototype.namespace = Vn; +ne.prototype.FLAT_LINEAR_RINGS_PARSERS = { + "http://www.opengis.net/gml": {} +}; +ne.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { + "http://www.opengis.net/gml": {} +}; +ne.prototype.GEOMETRY_PARSERS = { + "http://www.opengis.net/gml": {} +}; +ne.prototype.MULTIPOINT_PARSERS = { + "http://www.opengis.net/gml": { + pointMember: re(ne.prototype.pointMemberParser), + pointMembers: re(ne.prototype.pointMemberParser) + } +}; +ne.prototype.MULTILINESTRING_PARSERS = { + "http://www.opengis.net/gml": { + lineStringMember: re( + ne.prototype.lineStringMemberParser + ), + lineStringMembers: re( + ne.prototype.lineStringMemberParser + ) + } +}; +ne.prototype.MULTIPOLYGON_PARSERS = { + "http://www.opengis.net/gml": { + polygonMember: re(ne.prototype.polygonMemberParser), + polygonMembers: re(ne.prototype.polygonMemberParser) + } +}; +ne.prototype.POINTMEMBER_PARSERS = { + "http://www.opengis.net/gml": { + Point: re(ne.prototype.readFlatCoordinatesFromNode) + } +}; +ne.prototype.LINESTRINGMEMBER_PARSERS = { + "http://www.opengis.net/gml": { + LineString: re(ne.prototype.readLineString) + } +}; +ne.prototype.POLYGONMEMBER_PARSERS = { + "http://www.opengis.net/gml": { + Polygon: re(ne.prototype.readPolygon) + } +}; +ne.prototype.RING_PARSERS = { + "http://www.opengis.net/gml": { + LinearRing: Ae(ne.prototype.readFlatLinearRing) + } +}; +function Cr(n) { + const e = Wt(n, !1); + return Di(e); +} +function Di(n) { + const e = /^\s*(true|1)|(false|0)\s*$/.exec(n); + if (e) + return e[1] !== void 0 || !1; +} +function Pc(n) { + const e = Wt(n, !1), t = Date.parse(e); + return isNaN(t) ? void 0 : t / 1e3; +} +function Be(n) { + const e = Wt(n, !1); + return Yi(e); +} +function Yi(n) { + const e = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(n); + if (e) + return parseFloat(e[1]); +} +function ht(n) { + const e = Wt(n, !1); + return $n(e); +} +function $n(n) { + const e = /^\s*(\d+)\s*$/.exec(n); + if (e) + return parseInt(e[1], 10); +} +function U(n) { + return Wt(n, !1).trim(); +} +function Eo(n, e) { + ge(n, e ? "1" : "0"); +} +function WB(n, e) { + n.appendChild(Po().createCDATASection(e)); +} +function ZB(n, e) { + const t = new Date(e * 1e3), i = t.getUTCFullYear() + "-" + Fr(t.getUTCMonth() + 1, 2) + "-" + Fr(t.getUTCDate(), 2) + "T" + Fr(t.getUTCHours(), 2) + ":" + Fr(t.getUTCMinutes(), 2) + ":" + Fr(t.getUTCSeconds(), 2) + "Z"; + n.appendChild(Po().createTextNode(i)); +} +function ii(n, e) { + const t = e.toPrecision(); + n.appendChild(Po().createTextNode(t)); +} +function zA(n, e) { + const t = e.toString(); + n.appendChild(Po().createTextNode(t)); +} +function ge(n, e) { + n.appendChild(Po().createTextNode(e)); +} +const JB = Vn + " http://schemas.opengis.net/gml/2.1.2/feature.xsd", eS = { + MultiLineString: "lineStringMember", + MultiCurve: "curveMember", + MultiPolygon: "polygonMember", + MultiSurface: "surfaceMember" +}; +class xe extends ne { + /** + * @param {import("./GMLBase.js").Options} [options] Optional configuration object. + */ + constructor(e) { + e = e || {}, super(e), this.FEATURE_COLLECTION_PARSERS[Vn].featureMember = re( + this.readFeaturesInternal + ), this.schemaLocation = e.schemaLocation ? e.schemaLocation : JB; + } + /** + * @param {Node} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} Flat coordinates. + */ + readFlatCoordinates(e, t) { + const i = Wt(e, !1).replace(/^\s*|\s*$/g, ""), s = /** @type {import("../xml.js").NodeStackItem} */ t[0].srsName; + let o = "enu"; + if (s) { + const A = q(s); + A && (o = A.getAxisOrientation()); + } + const a = i.trim().split(/\s+/), l = []; + for (let A = 0, c = a.length; A < c; A++) { + const h = a[A].split(/,+/), u = parseFloat(h[0]), g = parseFloat(h[1]), d = h.length === 3 ? parseFloat(h[2]) : 0; + o.startsWith("en") ? l.push(u, g, d) : l.push(g, u, d); + } + return l; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {import("../extent.js").Extent|undefined} Envelope. + */ + readBox(e, t) { + const i = k( + [null], + this.BOX_PARSERS_, + e, + t, + this + ); + return Pi( + i[1][0], + i[1][1], + i[1][3], + i[1][4] + ); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + innerBoundaryIsParser(e, t) { + const i = k( + void 0, + this.RING_PARSERS, + e, + t, + this + ); + i && /** @type {Array>} */ + t[t.length - 1].push(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + outerBoundaryIsParser(e, t) { + const i = k( + void 0, + this.RING_PARSERS, + e, + t, + this + ); + if (i) { + const r = ( + /** @type {Array>} */ + t[t.length - 1] + ); + r[0] = i; + } + } + /** + * @const + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Element|undefined} Node. + * @private + */ + GEOMETRY_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1], s = r.multiSurface, o = r.surface, a = r.multiCurve; + return Array.isArray(e) ? i = "Envelope" : (i = /** @type {import("../geom/Geometry.js").default} */ + e.getType(), i === "MultiPolygon" && s === !0 ? i = "MultiSurface" : i === "Polygon" && o === !0 ? i = "Surface" : i === "MultiLineString" && a === !0 && (i = "MultiCurve")), fe("http://www.opengis.net/gml", i); + } + /** + * @param {Element} node Node. + * @param {import("../Feature.js").default} feature Feature. + * @param {Array<*>} objectStack Node stack. + */ + writeFeatureElement(e, t, i) { + const r = t.getId(); + r && e.setAttribute( + "fid", + /** @type {string} */ + r + ); + const s = ( + /** @type {Object} */ + i[i.length - 1] + ), o = s.featureNS, a = t.getGeometryName(); + s.serializers || (s.serializers = {}, s.serializers[o] = {}); + const l = [], A = []; + if (t.hasProperties()) { + const h = t.getProperties(); + for (const u in h) { + const g = h[u]; + g != null && (l.push(u), A.push(g), u == a || typeof /** @type {?} */ + g.getSimplifiedGeometry == "function" ? u in s.serializers[o] || (s.serializers[o][u] = D( + this.writeGeometryElement, + this + )) : u in s.serializers[o] || (s.serializers[o][u] = D(ge))); + } + } + const c = Object.assign({}, s); + c.node = e, Ee( + /** @type {import("../xml.js").NodeStackItem} */ + c, + s.serializers, + ot(void 0, o), + A, + i, + l + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LineString.js").default} geometry LineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeCurveOrLineString(e, t, i) { + const s = i[i.length - 1].srsName; + if (e.nodeName !== "LineStringSegment" && s && e.setAttribute("srsName", s), e.nodeName === "LineString" || e.nodeName === "LineStringSegment") { + const o = this.createCoordinatesNode_(e.namespaceURI); + e.appendChild(o), this.writeCoordinates_(o, t, i); + } else if (e.nodeName === "Curve") { + const o = fe(e.namespaceURI, "segments"); + e.appendChild(o), this.writeCurveSegments_(o, t, i); + } + } + /** + * @param {Element} node Node. + * @param {import("../geom/LineString.js").default} line LineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeLineStringOrCurveMember(e, t, i) { + const r = this.GEOMETRY_NODE_FACTORY_(t, i); + r && (e.appendChild(r), this.writeCurveOrLineString(r, t, i)); + } + /** + * @param {Element} node Node. + * @param {import("../geom/MultiLineString.js").default} geometry MultiLineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiCurveOrLineString(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName, a = r.curve; + o && e.setAttribute("srsName", o); + const l = t.getLineStrings(); + Ee( + { node: e, hasZ: s, srsName: o, curve: a }, + this.LINESTRINGORCURVEMEMBER_SERIALIZERS, + this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, + l, + i, + void 0, + this + ); + } + /** + * @param {Node} node Node. + * @param {import("../geom/Geometry.js").default|import("../extent.js").Extent} geometry Geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeGeometryElement(e, t, i) { + const r = ( + /** @type {import("./Feature.js").WriteOptions} */ + i[i.length - 1] + ), s = Object.assign({}, r); + s.node = e; + let o; + Array.isArray(t) ? o = nd( + /** @type {import("../extent.js").Extent} */ + t, + r + ) : o = je( + /** @type {import("../geom/Geometry.js").default} */ + t, + !0, + r + ), Ee( + /** @type {import("../xml.js").NodeStackItem} */ + s, + this.GEOMETRY_SERIALIZERS, + this.GEOMETRY_NODE_FACTORY_, + [o], + i, + void 0, + this + ); + } + /** + * @param {string} namespaceURI XML namespace. + * @return {Element} coordinates node. + * @private + */ + createCoordinatesNode_(e) { + const t = fe(e, "coordinates"); + return t.setAttribute("decimal", "."), t.setAttribute("cs", ","), t.setAttribute("ts", " "), t; + } + /** + * @param {Node} node Node. + * @param {import("../geom/LineString.js").default|import("../geom/LinearRing.js").default} value Geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeCoordinates_(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName, a = t.getCoordinates(), l = a.length, A = new Array(l); + for (let c = 0; c < l; ++c) { + const h = a[c]; + A[c] = this.getCoords_(h, o, s); + } + ge(e, A.join(" ")); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LineString.js").default} line LineString geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeCurveSegments_(e, t, i) { + const r = fe(e.namespaceURI, "LineStringSegment"); + e.appendChild(r), this.writeCurveOrLineString(r, t, i); + } + /** + * @param {Element} node Node. + * @param {import("../geom/Polygon.js").default} geometry Polygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeSurfaceOrPolygon(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName; + if (e.nodeName !== "PolygonPatch" && o && e.setAttribute("srsName", o), e.nodeName === "Polygon" || e.nodeName === "PolygonPatch") { + const a = t.getLinearRings(); + Ee( + { node: e, hasZ: s, srsName: o }, + this.RING_SERIALIZERS, + this.RING_NODE_FACTORY_, + a, + i, + void 0, + this + ); + } else if (e.nodeName === "Surface") { + const a = fe(e.namespaceURI, "patches"); + e.appendChild(a), this.writeSurfacePatches_(a, t, i); + } + } + /** + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Node} Node. + * @private + */ + RING_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1], s = r.node, o = r.exteriorWritten; + return o === void 0 && (r.exteriorWritten = !0), fe( + s.namespaceURI, + o !== void 0 ? "innerBoundaryIs" : "outerBoundaryIs" + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/Polygon.js").default} polygon Polygon geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeSurfacePatches_(e, t, i) { + const r = fe(e.namespaceURI, "PolygonPatch"); + e.appendChild(r), this.writeSurfaceOrPolygon(r, t, i); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LinearRing.js").default} ring LinearRing geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeRing(e, t, i) { + const r = fe(e.namespaceURI, "LinearRing"); + e.appendChild(r), this.writeLinearRing(r, t, i); + } + /** + * @param {Array} point Point geometry. + * @param {string} [srsName] Optional srsName + * @param {boolean} [hasZ] whether the geometry has a Z coordinate (is 3D) or not. + * @return {string} The coords string. + * @private + */ + getCoords_(e, t, i) { + let s = (t ? q(t).getAxisOrientation() : "enu").startsWith("en") ? e[0] + "," + e[1] : e[1] + "," + e[0]; + if (i) { + const o = e[2] || 0; + s += "," + o; + } + return s; + } + /** + * @param {Element} node Node. + * @param {import("../geom/Point.js").default} geometry Point geometry. + * @param {Array<*>} objectStack Node stack. + */ + writePoint(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName; + o && e.setAttribute("srsName", o); + const a = this.createCoordinatesNode_(e.namespaceURI); + e.appendChild(a); + const l = t.getCoordinates(), A = this.getCoords_(l, o, s); + ge(a, A); + } + /** + * @param {Element} node Node. + * @param {import("../geom/MultiPoint.js").default} geometry MultiPoint geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiPoint(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName; + o && e.setAttribute("srsName", o); + const a = t.getPoints(); + Ee( + { node: e, hasZ: s, srsName: o }, + this.POINTMEMBER_SERIALIZERS, + ot("pointMember"), + a, + i, + void 0, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/Point.js").default} point Point geometry. + * @param {Array<*>} objectStack Node stack. + */ + writePointMember(e, t, i) { + const r = fe(e.namespaceURI, "Point"); + e.appendChild(r), this.writePoint(r, t, i); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LinearRing.js").default} geometry LinearRing geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeLinearRing(e, t, i) { + const s = i[i.length - 1].srsName; + s && e.setAttribute("srsName", s); + const o = this.createCoordinatesNode_(e.namespaceURI); + e.appendChild(o), this.writeCoordinates_(o, t, i); + } + /** + * @param {Element} node Node. + * @param {import("../geom/MultiPolygon.js").default} geometry MultiPolygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiSurfaceOrPolygon(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName, a = r.surface; + o && e.setAttribute("srsName", o); + const l = t.getPolygons(); + Ee( + { node: e, hasZ: s, srsName: o, surface: a }, + this.SURFACEORPOLYGONMEMBER_SERIALIZERS, + this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, + l, + i, + void 0, + this + ); + } + /** + * @param {Node} node Node. + * @param {import("../geom/Polygon.js").default} polygon Polygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeSurfaceOrPolygonMember(e, t, i) { + const r = this.GEOMETRY_NODE_FACTORY_(t, i); + r && (e.appendChild(r), this.writeSurfaceOrPolygon(r, t, i)); + } + /** + * @param {Element} node Node. + * @param {import("../extent.js").Extent} extent Extent. + * @param {Array<*>} objectStack Node stack. + */ + writeEnvelope(e, t, i) { + const s = i[i.length - 1].srsName; + s && e.setAttribute("srsName", s); + const o = ["lowerCorner", "upperCorner"], a = [t[0] + " " + t[1], t[2] + " " + t[3]]; + Ee( + /** @type {import("../xml.js").NodeStackItem} */ + { node: e }, + this.ENVELOPE_SERIALIZERS, + Lt, + a, + i, + o, + this + ); + } + /** + * @const + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Node|undefined} Node. + * @private + */ + MULTIGEOMETRY_MEMBER_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1].node; + return fe( + "http://www.opengis.net/gml", + eS[r.nodeName] + ); + } +} +xe.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { + "http://www.opengis.net/gml": { + coordinates: Ae(xe.prototype.readFlatCoordinates) + } +}; +xe.prototype.FLAT_LINEAR_RINGS_PARSERS = { + "http://www.opengis.net/gml": { + innerBoundaryIs: xe.prototype.innerBoundaryIsParser, + outerBoundaryIs: xe.prototype.outerBoundaryIsParser + } +}; +xe.prototype.BOX_PARSERS_ = { + "http://www.opengis.net/gml": { + coordinates: re(xe.prototype.readFlatCoordinates) + } +}; +xe.prototype.GEOMETRY_PARSERS = { + "http://www.opengis.net/gml": { + Point: Ae(ne.prototype.readPoint), + MultiPoint: Ae(ne.prototype.readMultiPoint), + LineString: Ae(ne.prototype.readLineString), + MultiLineString: Ae(ne.prototype.readMultiLineString), + LinearRing: Ae(ne.prototype.readLinearRing), + Polygon: Ae(ne.prototype.readPolygon), + MultiPolygon: Ae(ne.prototype.readMultiPolygon), + Box: Ae(xe.prototype.readBox) + } +}; +xe.prototype.GEOMETRY_SERIALIZERS = { + "http://www.opengis.net/gml": { + Curve: D(xe.prototype.writeCurveOrLineString), + MultiCurve: D(xe.prototype.writeMultiCurveOrLineString), + Point: D(xe.prototype.writePoint), + MultiPoint: D(xe.prototype.writeMultiPoint), + LineString: D(xe.prototype.writeCurveOrLineString), + MultiLineString: D( + xe.prototype.writeMultiCurveOrLineString + ), + LinearRing: D(xe.prototype.writeLinearRing), + Polygon: D(xe.prototype.writeSurfaceOrPolygon), + MultiPolygon: D( + xe.prototype.writeMultiSurfaceOrPolygon + ), + Surface: D(xe.prototype.writeSurfaceOrPolygon), + MultiSurface: D( + xe.prototype.writeMultiSurfaceOrPolygon + ), + Envelope: D(xe.prototype.writeEnvelope) + } +}; +xe.prototype.LINESTRINGORCURVEMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + lineStringMember: D( + xe.prototype.writeLineStringOrCurveMember + ), + curveMember: D( + xe.prototype.writeLineStringOrCurveMember + ) + } +}; +xe.prototype.RING_SERIALIZERS = { + "http://www.opengis.net/gml": { + outerBoundaryIs: D(xe.prototype.writeRing), + innerBoundaryIs: D(xe.prototype.writeRing) + } +}; +xe.prototype.POINTMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + pointMember: D(xe.prototype.writePointMember) + } +}; +xe.prototype.SURFACEORPOLYGONMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + surfaceMember: D( + xe.prototype.writeSurfaceOrPolygonMember + ), + polygonMember: D( + xe.prototype.writeSurfaceOrPolygonMember + ) + } +}; +xe.prototype.ENVELOPE_SERIALIZERS = { + "http://www.opengis.net/gml": { + lowerCorner: D(ge), + upperCorner: D(ge) + } +}; +const tS = Vn + " http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd", iS = { + MultiLineString: "lineStringMember", + MultiCurve: "curveMember", + MultiPolygon: "polygonMember", + MultiSurface: "surfaceMember" +}; +class V extends ne { + /** + * @param {import("./GMLBase.js").Options} [options] Optional configuration object. + */ + constructor(e) { + e = e || {}, super(e), this.surface_ = e.surface !== void 0 ? e.surface : !1, this.curve_ = e.curve !== void 0 ? e.curve : !1, this.multiCurve_ = e.multiCurve !== void 0 ? e.multiCurve : !0, this.multiSurface_ = e.multiSurface !== void 0 ? e.multiSurface : !0, this.schemaLocation = e.schemaLocation ? e.schemaLocation : tS, this.hasZ = e.hasZ !== void 0 ? e.hasZ : !1; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {MultiLineString|undefined} MultiLineString. + */ + readMultiCurve(e, t) { + const i = k( + [], + this.MULTICURVE_PARSERS, + e, + t, + this + ); + if (i) + return new Ot(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} Polygon. + */ + readFlatCurveRing(e, t) { + const i = k( + [], + this.MULTICURVE_PARSERS, + e, + t, + this + ), r = []; + for (let s = 0, o = i.length; s < o; ++s) + Se(r, i[s].getFlatCoordinates()); + return r; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {MultiPolygon|undefined} MultiPolygon. + */ + readMultiSurface(e, t) { + const i = k( + [], + this.MULTISURFACE_PARSERS, + e, + t, + this + ); + if (i) + return new Kt(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + curveMemberParser(e, t) { + oi(this.CURVEMEMBER_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + surfaceMemberParser(e, t) { + oi(this.SURFACEMEMBER_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array<(Array)>|undefined} flat coordinates. + */ + readPatch(e, t) { + return k( + [null], + this.PATCHES_PARSERS, + e, + t, + this + ); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} flat coordinates. + */ + readSegment(e, t) { + return k([], this.SEGMENTS_PARSERS, e, t, this); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array<(Array)>|undefined} flat coordinates. + */ + readPolygonPatch(e, t) { + return k( + [null], + this.FLAT_LINEAR_RINGS_PARSERS, + e, + t, + this + ); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} flat coordinates. + */ + readLineStringSegment(e, t) { + return k( + [null], + this.GEOMETRY_FLAT_COORDINATES_PARSERS, + e, + t, + this + ); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + interiorParser(e, t) { + const i = k( + void 0, + this.RING_PARSERS, + e, + t, + this + ); + i && /** @type {Array>} */ + t[t.length - 1].push(i); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + */ + exteriorParser(e, t) { + const i = k( + void 0, + this.RING_PARSERS, + e, + t, + this + ); + if (i) { + const r = ( + /** @type {Array>} */ + t[t.length - 1] + ); + r[0] = i; + } + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Polygon|undefined} Polygon. + */ + readSurface(e, t) { + const i = k( + [null], + this.SURFACE_PARSERS, + e, + t, + this + ); + if (i && i[0]) { + const r = i[0], s = [r.length]; + let o, a; + for (o = 1, a = i.length; o < a; ++o) + Se(r, i[o]), s.push(r.length); + return new it(r, "XYZ", s); + } + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {LineString|undefined} LineString. + */ + readCurve(e, t) { + const i = k( + [null], + this.CURVE_PARSERS, + e, + t, + this + ); + if (i) + return new Ke(i, "XYZ"); + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {import("../extent.js").Extent|undefined} Envelope. + */ + readEnvelope(e, t) { + const i = k( + [null], + this.ENVELOPE_PARSERS, + e, + t, + this + ); + return Pi( + i[1][0], + i[1][1], + i[2][0], + i[2][1] + ); + } + /** + * @param {Node} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} Flat coordinates. + */ + readFlatPos(e, t) { + let i = Wt(e, !1); + const r = /^\s*([+\-]?\d*\.?\d+(?:[eE][+\-]?\d+)?)\s*/, s = []; + let o; + for (; o = r.exec(i); ) + s.push(parseFloat(o[1])), i = i.substr(o[0].length); + if (i !== "") + return; + const l = t[0].srsName; + if ((l ? q(l).getAxisOrientation() : "enu") === "neu") + for (let h = 0, u = s.length; h < u; h += 3) { + const g = s[h], d = s[h + 1]; + s[h] = d, s[h + 1] = g; + } + const c = s.length; + if (c == 2 && s.push(0), c !== 0) + return s; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @return {Array|undefined} Flat coordinates. + */ + readFlatPosList(e, t) { + const i = Wt(e, !1).replace(/^\s*|\s*$/g, ""), r = t[0], s = r.srsName, o = r.srsDimension, a = s ? q(s).getAxisOrientation() : "enu", l = i.split(/\s+/); + let A = 2; + e.getAttribute("srsDimension") ? A = $n(e.getAttribute("srsDimension")) : e.getAttribute("dimension") ? A = $n(e.getAttribute("dimension")) : /** @type {Element} */ e.parentNode.getAttribute("srsDimension") ? A = $n( + /** @type {Element} */ + e.parentNode.getAttribute("srsDimension") + ) : o && (A = $n(o)); + const c = a.startsWith("en"); + let h, u, g; + const d = []; + for (let m = 0, f = l.length; m < f; m += A) + h = parseFloat(l[m]), u = parseFloat(l[m + 1]), g = A === 3 ? parseFloat(l[m + 2]) : 0, c ? d.push(h, u, g) : d.push(u, h, g); + return d; + } + /** + * @param {Element} node Node. + * @param {import("../geom/Point.js").default} value Point geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writePos_(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = s ? "3" : "2"; + e.setAttribute("srsDimension", o); + const a = r.srsName, l = a ? q(a).getAxisOrientation() : "enu", A = t.getCoordinates(); + let c = l.startsWith("en") ? A[0] + " " + A[1] : A[1] + " " + A[0]; + if (s) { + const h = A[2] || 0; + c += " " + h; + } + ge(e, c); + } + /** + * @param {Array} point Point geometry. + * @param {string} [srsName] Optional srsName + * @param {boolean} [hasZ] whether the geometry has a Z coordinate (is 3D) or not. + * @return {string} The coords string. + * @private + */ + getCoords_(e, t, i) { + let s = (t ? q(t).getAxisOrientation() : "enu").startsWith("en") ? e[0] + " " + e[1] : e[1] + " " + e[0]; + if (i) { + const o = e[2] || 0; + s += " " + o; + } + return s; + } + /** + * @param {Element} node Node. + * @param {LineString|import("../geom/LinearRing.js").default} value Geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writePosList_(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = s ? "3" : "2"; + e.setAttribute("srsDimension", o); + const a = r.srsName, l = t.getCoordinates(), A = l.length, c = new Array(A); + let h; + for (let u = 0; u < A; ++u) + h = l[u], c[u] = this.getCoords_(h, a, s); + ge(e, c.join(" ")); + } + /** + * @param {Element} node Node. + * @param {import("../geom/Point.js").default} geometry Point geometry. + * @param {Array<*>} objectStack Node stack. + */ + writePoint(e, t, i) { + const s = i[i.length - 1].srsName; + s && e.setAttribute("srsName", s); + const o = fe(e.namespaceURI, "pos"); + e.appendChild(o), this.writePos_(o, t, i); + } + /** + * @param {Element} node Node. + * @param {import("../extent.js").Extent} extent Extent. + * @param {Array<*>} objectStack Node stack. + */ + writeEnvelope(e, t, i) { + const s = i[i.length - 1].srsName; + s && e.setAttribute("srsName", s); + const o = ["lowerCorner", "upperCorner"], a = [t[0] + " " + t[1], t[2] + " " + t[3]]; + Ee( + /** @type {import("../xml.js").NodeStackItem} */ + { node: e }, + this.ENVELOPE_SERIALIZERS, + Lt, + a, + i, + o, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LinearRing.js").default} geometry LinearRing geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeLinearRing(e, t, i) { + const s = i[i.length - 1].srsName; + s && e.setAttribute("srsName", s); + const o = fe(e.namespaceURI, "posList"); + e.appendChild(o), this.writePosList_(o, t, i); + } + /** + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Node} Node. + * @private + */ + RING_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1], s = r.node, o = r.exteriorWritten; + return o === void 0 && (r.exteriorWritten = !0), fe( + s.namespaceURI, + o !== void 0 ? "interior" : "exterior" + ); + } + /** + * @param {Element} node Node. + * @param {Polygon} geometry Polygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeSurfaceOrPolygon(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName; + if (e.nodeName !== "PolygonPatch" && o && e.setAttribute("srsName", o), e.nodeName === "Polygon" || e.nodeName === "PolygonPatch") { + const a = t.getLinearRings(); + Ee( + { node: e, hasZ: s, srsName: o }, + this.RING_SERIALIZERS, + this.RING_NODE_FACTORY_, + a, + i, + void 0, + this + ); + } else if (e.nodeName === "Surface") { + const a = fe(e.namespaceURI, "patches"); + e.appendChild(a), this.writeSurfacePatches_(a, t, i); + } + } + /** + * @param {Element} node Node. + * @param {LineString} geometry LineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeCurveOrLineString(e, t, i) { + const s = i[i.length - 1].srsName; + if (e.nodeName !== "LineStringSegment" && s && e.setAttribute("srsName", s), e.nodeName === "LineString" || e.nodeName === "LineStringSegment") { + const o = fe(e.namespaceURI, "posList"); + e.appendChild(o), this.writePosList_(o, t, i); + } else if (e.nodeName === "Curve") { + const o = fe(e.namespaceURI, "segments"); + e.appendChild(o), this.writeCurveSegments_(o, t, i); + } + } + /** + * @param {Element} node Node. + * @param {MultiPolygon} geometry MultiPolygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiSurfaceOrPolygon(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName, a = r.surface; + o && e.setAttribute("srsName", o); + const l = t.getPolygons(); + Ee( + { node: e, hasZ: s, srsName: o, surface: a }, + this.SURFACEORPOLYGONMEMBER_SERIALIZERS, + this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, + l, + i, + void 0, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/MultiPoint.js").default} geometry MultiPoint geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiPoint(e, t, i) { + const r = i[i.length - 1], s = r.srsName, o = r.hasZ; + s && e.setAttribute("srsName", s); + const a = t.getPoints(); + Ee( + { node: e, hasZ: o, srsName: s }, + this.POINTMEMBER_SERIALIZERS, + ot("pointMember"), + a, + i, + void 0, + this + ); + } + /** + * @param {Element} node Node. + * @param {MultiLineString} geometry MultiLineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeMultiCurveOrLineString(e, t, i) { + const r = i[i.length - 1], s = r.hasZ, o = r.srsName, a = r.curve; + o && e.setAttribute("srsName", o); + const l = t.getLineStrings(); + Ee( + { node: e, hasZ: s, srsName: o, curve: a }, + this.LINESTRINGORCURVEMEMBER_SERIALIZERS, + this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, + l, + i, + void 0, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("../geom/LinearRing.js").default} ring LinearRing geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeRing(e, t, i) { + const r = fe(e.namespaceURI, "LinearRing"); + e.appendChild(r), this.writeLinearRing(r, t, i); + } + /** + * @param {Node} node Node. + * @param {Polygon} polygon Polygon geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeSurfaceOrPolygonMember(e, t, i) { + const r = this.GEOMETRY_NODE_FACTORY_(t, i); + r && (e.appendChild(r), this.writeSurfaceOrPolygon(r, t, i)); + } + /** + * @param {Element} node Node. + * @param {import("../geom/Point.js").default} point Point geometry. + * @param {Array<*>} objectStack Node stack. + */ + writePointMember(e, t, i) { + const r = fe(e.namespaceURI, "Point"); + e.appendChild(r), this.writePoint(r, t, i); + } + /** + * @param {Node} node Node. + * @param {LineString} line LineString geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeLineStringOrCurveMember(e, t, i) { + const r = this.GEOMETRY_NODE_FACTORY_(t, i); + r && (e.appendChild(r), this.writeCurveOrLineString(r, t, i)); + } + /** + * @param {Element} node Node. + * @param {Polygon} polygon Polygon geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeSurfacePatches_(e, t, i) { + const r = fe(e.namespaceURI, "PolygonPatch"); + e.appendChild(r), this.writeSurfaceOrPolygon(r, t, i); + } + /** + * @param {Element} node Node. + * @param {LineString} line LineString geometry. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeCurveSegments_(e, t, i) { + const r = fe(e.namespaceURI, "LineStringSegment"); + e.appendChild(r), this.writeCurveOrLineString(r, t, i); + } + /** + * @param {Node} node Node. + * @param {import("../geom/Geometry.js").default|import("../extent.js").Extent} geometry Geometry. + * @param {Array<*>} objectStack Node stack. + */ + writeGeometryElement(e, t, i) { + const r = ( + /** @type {import("./Feature.js").WriteOptions} */ + i[i.length - 1] + ), s = Object.assign({}, r); + s.node = e; + let o; + Array.isArray(t) ? o = nd( + /** @type {import("../extent.js").Extent} */ + t, + r + ) : o = je( + /** @type {import("../geom/Geometry.js").default} */ + t, + !0, + r + ), Ee( + /** @type {import("../xml.js").NodeStackItem} */ + s, + this.GEOMETRY_SERIALIZERS, + this.GEOMETRY_NODE_FACTORY_, + [o], + i, + void 0, + this + ); + } + /** + * @param {Element} node Node. + * @param {import("../Feature.js").default} feature Feature. + * @param {Array<*>} objectStack Node stack. + */ + writeFeatureElement(e, t, i) { + const r = t.getId(); + r && e.setAttribute( + "fid", + /** @type {string} */ + r + ); + const s = ( + /** @type {Object} */ + i[i.length - 1] + ), o = s.featureNS, a = t.getGeometryName(); + s.serializers || (s.serializers = {}, s.serializers[o] = {}); + const l = [], A = []; + if (t.hasProperties()) { + const h = t.getProperties(); + for (const u in h) { + const g = h[u]; + g != null && (l.push(u), A.push(g), u == a || typeof /** @type {?} */ + g.getSimplifiedGeometry == "function" ? u in s.serializers[o] || (s.serializers[o][u] = D( + this.writeGeometryElement, + this + )) : u in s.serializers[o] || (s.serializers[o][u] = D(ge))); + } + } + const c = Object.assign({}, s); + c.node = e, Ee( + /** @type {import("../xml.js").NodeStackItem} */ + c, + s.serializers, + ot(void 0, o), + A, + i, + l + ); + } + /** + * @param {Node} node Node. + * @param {Array} features Features. + * @param {Array<*>} objectStack Node stack. + * @private + */ + writeFeatureMembers_(e, t, i) { + const r = ( + /** @type {Object} */ + i[i.length - 1] + ), s = r.featureType, o = r.featureNS, a = {}; + a[o] = {}, a[o][s] = D( + this.writeFeatureElement, + this + ); + const l = Object.assign({}, r); + l.node = e, Ee( + /** @type {import("../xml.js").NodeStackItem} */ + l, + a, + ot(s, o), + t, + i + ); + } + /** + * @const + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Node|undefined} Node. + * @private + */ + MULTIGEOMETRY_MEMBER_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1].node; + return fe( + this.namespace, + iS[r.nodeName] + ); + } + /** + * @const + * @param {*} value Value. + * @param {Array<*>} objectStack Object stack. + * @param {string} [nodeName] Node name. + * @return {Element|undefined} Node. + * @private + */ + GEOMETRY_NODE_FACTORY_(e, t, i) { + const r = t[t.length - 1], s = r.multiSurface, o = r.surface, a = r.curve, l = r.multiCurve; + return Array.isArray(e) ? i = "Envelope" : (i = /** @type {import("../geom/Geometry.js").default} */ + e.getType(), i === "MultiPolygon" && s === !0 ? i = "MultiSurface" : i === "Polygon" && o === !0 ? i = "Surface" : i === "LineString" && a === !0 ? i = "Curve" : i === "MultiLineString" && l === !0 && (i = "MultiCurve")), fe(this.namespace, i); + } + /** + * Encode a geometry in GML 3.1.1 Simple Features. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Node} Node. + * @api + * @override + */ + writeGeometryNode(e, t) { + t = this.adaptOptions(t); + const i = fe(this.namespace, "geom"), r = { + node: i, + hasZ: this.hasZ, + srsName: this.srsName, + curve: this.curve_, + surface: this.surface_, + multiSurface: this.multiSurface_, + multiCurve: this.multiCurve_ + }; + return t && Object.assign(r, t), this.writeGeometryElement(i, e, [r]), i; + } + /** + * Encode an array of features in the GML 3.1.1 format as an XML node. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Element} Node. + * @api + * @override + */ + writeFeaturesNode(e, t) { + t = this.adaptOptions(t); + const i = fe(this.namespace, "featureMembers"); + i.setAttributeNS( + Kr, + "xsi:schemaLocation", + this.schemaLocation + ); + const r = { + srsName: this.srsName, + hasZ: this.hasZ, + curve: this.curve_, + surface: this.surface_, + multiSurface: this.multiSurface_, + multiCurve: this.multiCurve_, + featureNS: this.featureNS, + featureType: this.featureType + }; + return t && Object.assign(r, t), this.writeFeatureMembers_(i, e, [r]), i; + } +} +V.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { + "http://www.opengis.net/gml": { + pos: Ae(V.prototype.readFlatPos), + posList: Ae(V.prototype.readFlatPosList), + coordinates: Ae(xe.prototype.readFlatCoordinates) + } +}; +V.prototype.FLAT_LINEAR_RINGS_PARSERS = { + "http://www.opengis.net/gml": { + interior: V.prototype.interiorParser, + exterior: V.prototype.exteriorParser + } +}; +V.prototype.GEOMETRY_PARSERS = { + "http://www.opengis.net/gml": { + Point: Ae(ne.prototype.readPoint), + MultiPoint: Ae(ne.prototype.readMultiPoint), + LineString: Ae(ne.prototype.readLineString), + MultiLineString: Ae(ne.prototype.readMultiLineString), + LinearRing: Ae(ne.prototype.readLinearRing), + Polygon: Ae(ne.prototype.readPolygon), + MultiPolygon: Ae(ne.prototype.readMultiPolygon), + Surface: Ae(V.prototype.readSurface), + MultiSurface: Ae(V.prototype.readMultiSurface), + Curve: Ae(V.prototype.readCurve), + MultiCurve: Ae(V.prototype.readMultiCurve), + Envelope: Ae(V.prototype.readEnvelope) + } +}; +V.prototype.MULTICURVE_PARSERS = { + "http://www.opengis.net/gml": { + curveMember: re(V.prototype.curveMemberParser), + curveMembers: re(V.prototype.curveMemberParser) + } +}; +V.prototype.MULTISURFACE_PARSERS = { + "http://www.opengis.net/gml": { + surfaceMember: re(V.prototype.surfaceMemberParser), + surfaceMembers: re(V.prototype.surfaceMemberParser) + } +}; +V.prototype.CURVEMEMBER_PARSERS = { + "http://www.opengis.net/gml": { + LineString: re(ne.prototype.readLineString), + Curve: re(V.prototype.readCurve) + } +}; +V.prototype.SURFACEMEMBER_PARSERS = { + "http://www.opengis.net/gml": { + Polygon: re(ne.prototype.readPolygon), + Surface: re(V.prototype.readSurface) + } +}; +V.prototype.SURFACE_PARSERS = { + "http://www.opengis.net/gml": { + patches: Ae(V.prototype.readPatch) + } +}; +V.prototype.CURVE_PARSERS = { + "http://www.opengis.net/gml": { + segments: Ae(V.prototype.readSegment) + } +}; +V.prototype.ENVELOPE_PARSERS = { + "http://www.opengis.net/gml": { + lowerCorner: re(V.prototype.readFlatPosList), + upperCorner: re(V.prototype.readFlatPosList) + } +}; +V.prototype.PATCHES_PARSERS = { + "http://www.opengis.net/gml": { + PolygonPatch: Ae(V.prototype.readPolygonPatch) + } +}; +V.prototype.SEGMENTS_PARSERS = { + "http://www.opengis.net/gml": { + LineStringSegment: YA( + V.prototype.readLineStringSegment + ) + } +}; +ne.prototype.RING_PARSERS = { + "http://www.opengis.net/gml": { + LinearRing: Ae(ne.prototype.readFlatLinearRing), + Ring: Ae(V.prototype.readFlatCurveRing) + } +}; +V.prototype.writeFeatures; +V.prototype.RING_SERIALIZERS = { + "http://www.opengis.net/gml": { + exterior: D(V.prototype.writeRing), + interior: D(V.prototype.writeRing) + } +}; +V.prototype.ENVELOPE_SERIALIZERS = { + "http://www.opengis.net/gml": { + lowerCorner: D(ge), + upperCorner: D(ge) + } +}; +V.prototype.SURFACEORPOLYGONMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + surfaceMember: D( + V.prototype.writeSurfaceOrPolygonMember + ), + polygonMember: D( + V.prototype.writeSurfaceOrPolygonMember + ) + } +}; +V.prototype.POINTMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + pointMember: D(V.prototype.writePointMember) + } +}; +V.prototype.LINESTRINGORCURVEMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml": { + lineStringMember: D( + V.prototype.writeLineStringOrCurveMember + ), + curveMember: D( + V.prototype.writeLineStringOrCurveMember + ) + } +}; +V.prototype.GEOMETRY_SERIALIZERS = { + "http://www.opengis.net/gml": { + Curve: D(V.prototype.writeCurveOrLineString), + MultiCurve: D(V.prototype.writeMultiCurveOrLineString), + Point: D(V.prototype.writePoint), + MultiPoint: D(V.prototype.writeMultiPoint), + LineString: D(V.prototype.writeCurveOrLineString), + MultiLineString: D( + V.prototype.writeMultiCurveOrLineString + ), + LinearRing: D(V.prototype.writeLinearRing), + Polygon: D(V.prototype.writeSurfaceOrPolygon), + MultiPolygon: D( + V.prototype.writeMultiSurfaceOrPolygon + ), + Surface: D(V.prototype.writeSurfaceOrPolygon), + MultiSurface: D( + V.prototype.writeMultiSurfaceOrPolygon + ), + Envelope: D(V.prototype.writeEnvelope) + } +}; +const G_ = V; +G_.prototype.writeFeatures; +G_.prototype.writeFeaturesNode; +class Qe extends V { + /** + * @param {import("./GMLBase.js").Options} [options] Optional configuration object. + */ + constructor(e) { + e = e || {}, super(e), this.schemaLocation = e.schemaLocation ? e.schemaLocation : this.namespace + " http://schemas.opengis.net/gml/3.2.1/gml.xsd"; + } + /** + * @param {Node} node Node. + * @param {import("../geom/Geometry.js").default|import("../extent.js").Extent} geometry Geometry. + * @param {Array<*>} objectStack Node stack. + * @override + */ + writeGeometryElement(e, t, i) { + const r = i[i.length - 1]; + i[i.length - 1] = Object.assign( + { multiCurve: !0, multiSurface: !0 }, + r + ), super.writeGeometryElement(e, t, i); + } +} +Qe.prototype.namespace = "http://www.opengis.net/gml/3.2"; +Qe.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { + "http://www.opengis.net/gml/3.2": { + pos: Ae(V.prototype.readFlatPos), + posList: Ae(V.prototype.readFlatPosList), + coordinates: Ae(xe.prototype.readFlatCoordinates) + } +}; +Qe.prototype.FLAT_LINEAR_RINGS_PARSERS = { + "http://www.opengis.net/gml/3.2": { + interior: V.prototype.interiorParser, + exterior: V.prototype.exteriorParser + } +}; +Qe.prototype.GEOMETRY_PARSERS = { + "http://www.opengis.net/gml/3.2": { + Point: Ae(ne.prototype.readPoint), + MultiPoint: Ae(ne.prototype.readMultiPoint), + LineString: Ae(ne.prototype.readLineString), + MultiLineString: Ae(ne.prototype.readMultiLineString), + LinearRing: Ae(ne.prototype.readLinearRing), + Polygon: Ae(ne.prototype.readPolygon), + MultiPolygon: Ae(ne.prototype.readMultiPolygon), + Surface: Ae(Qe.prototype.readSurface), + MultiSurface: Ae(V.prototype.readMultiSurface), + Curve: Ae(Qe.prototype.readCurve), + MultiCurve: Ae(V.prototype.readMultiCurve), + Envelope: Ae(Qe.prototype.readEnvelope) + } +}; +Qe.prototype.MULTICURVE_PARSERS = { + "http://www.opengis.net/gml/3.2": { + curveMember: re(V.prototype.curveMemberParser), + curveMembers: re(V.prototype.curveMemberParser) + } +}; +Qe.prototype.MULTISURFACE_PARSERS = { + "http://www.opengis.net/gml/3.2": { + surfaceMember: re(V.prototype.surfaceMemberParser), + surfaceMembers: re(V.prototype.surfaceMemberParser) + } +}; +Qe.prototype.CURVEMEMBER_PARSERS = { + "http://www.opengis.net/gml/3.2": { + LineString: re(ne.prototype.readLineString), + Curve: re(V.prototype.readCurve) + } +}; +Qe.prototype.SURFACEMEMBER_PARSERS = { + "http://www.opengis.net/gml/3.2": { + Polygon: re(ne.prototype.readPolygon), + Surface: re(V.prototype.readSurface) + } +}; +Qe.prototype.SURFACE_PARSERS = { + "http://www.opengis.net/gml/3.2": { + patches: Ae(V.prototype.readPatch) + } +}; +Qe.prototype.CURVE_PARSERS = { + "http://www.opengis.net/gml/3.2": { + segments: Ae(V.prototype.readSegment) + } +}; +Qe.prototype.ENVELOPE_PARSERS = { + "http://www.opengis.net/gml/3.2": { + lowerCorner: re(V.prototype.readFlatPosList), + upperCorner: re(V.prototype.readFlatPosList) + } +}; +Qe.prototype.PATCHES_PARSERS = { + "http://www.opengis.net/gml/3.2": { + PolygonPatch: Ae(V.prototype.readPolygonPatch) + } +}; +Qe.prototype.SEGMENTS_PARSERS = { + "http://www.opengis.net/gml/3.2": { + LineStringSegment: YA( + V.prototype.readLineStringSegment + ) + } +}; +Qe.prototype.MULTIPOINT_PARSERS = { + "http://www.opengis.net/gml/3.2": { + pointMember: re(ne.prototype.pointMemberParser), + pointMembers: re(ne.prototype.pointMemberParser) + } +}; +Qe.prototype.MULTILINESTRING_PARSERS = { + "http://www.opengis.net/gml/3.2": { + lineStringMember: re( + ne.prototype.lineStringMemberParser + ), + lineStringMembers: re( + ne.prototype.lineStringMemberParser + ) + } +}; +Qe.prototype.MULTIPOLYGON_PARSERS = { + "http://www.opengis.net/gml/3.2": { + polygonMember: re(ne.prototype.polygonMemberParser), + polygonMembers: re(ne.prototype.polygonMemberParser) + } +}; +Qe.prototype.POINTMEMBER_PARSERS = { + "http://www.opengis.net/gml/3.2": { + Point: re(ne.prototype.readFlatCoordinatesFromNode) + } +}; +Qe.prototype.LINESTRINGMEMBER_PARSERS = { + "http://www.opengis.net/gml/3.2": { + LineString: re(ne.prototype.readLineString) + } +}; +Qe.prototype.POLYGONMEMBER_PARSERS = { + "http://www.opengis.net/gml/3.2": { + Polygon: re(ne.prototype.readPolygon) + } +}; +Qe.prototype.RING_PARSERS = { + "http://www.opengis.net/gml/3.2": { + LinearRing: Ae(ne.prototype.readFlatLinearRing), + Ring: Ae(Qe.prototype.readFlatCurveRing) + } +}; +Qe.prototype.RING_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + exterior: D(V.prototype.writeRing), + interior: D(V.prototype.writeRing) + } +}; +Qe.prototype.ENVELOPE_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + lowerCorner: D(ge), + upperCorner: D(ge) + } +}; +Qe.prototype.SURFACEORPOLYGONMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + surfaceMember: D( + V.prototype.writeSurfaceOrPolygonMember + ), + polygonMember: D( + V.prototype.writeSurfaceOrPolygonMember + ) + } +}; +Qe.prototype.POINTMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + pointMember: D(V.prototype.writePointMember) + } +}; +Qe.prototype.LINESTRINGORCURVEMEMBER_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + lineStringMember: D( + V.prototype.writeLineStringOrCurveMember + ), + curveMember: D( + V.prototype.writeLineStringOrCurveMember + ) + } +}; +Qe.prototype.GEOMETRY_SERIALIZERS = { + "http://www.opengis.net/gml/3.2": { + Curve: D(V.prototype.writeCurveOrLineString), + MultiCurve: D(V.prototype.writeMultiCurveOrLineString), + Point: D(Qe.prototype.writePoint), + MultiPoint: D(V.prototype.writeMultiPoint), + LineString: D(V.prototype.writeCurveOrLineString), + MultiLineString: D( + V.prototype.writeMultiCurveOrLineString + ), + LinearRing: D(V.prototype.writeLinearRing), + Polygon: D(V.prototype.writeSurfaceOrPolygon), + MultiPolygon: D( + V.prototype.writeMultiSurfaceOrPolygon + ), + Surface: D(V.prototype.writeSurfaceOrPolygon), + MultiSurface: D( + V.prototype.writeMultiSurfaceOrPolygon + ), + Envelope: D(V.prototype.writeEnvelope) + } +}; +const Ze = [ + null, + "http://www.topografix.com/GPX/1/0", + "http://www.topografix.com/GPX/1/1" +], nS = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd", rS = { + rte: k_, + trk: $_, + wpt: U_ +}, sS = O(Ze, { + rte: re(k_), + trk: re($_), + wpt: re(U_) +}), oS = O(Ze, { + text: R(U, "linkText"), + type: R(U, "linkType") +}), aS = O(Ze, { + name: R(U), + email: FS, + link: Il +}), lS = O(Ze, { + name: R(U), + desc: R(U), + author: R(QS), + copyright: R(DS), + link: Il, + time: R(Pc), + keywords: R(U), + bounds: LS, + extensions: Mc +}), AS = O(Ze, { + year: R(ht), + license: R(U) +}), cS = O(Ze, { + rte: D(NS), + trk: D(OS), + wpt: D(kS) +}); +class nG extends Mo { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.dataProjection = q("EPSG:4326"), this.readExtensions_ = e.readExtensions; + } + /** + * @param {Array} features List of features. + * @private + */ + handleReadExtensions_(e) { + e || (e = []); + for (let t = 0, i = e.length; t < i; ++t) { + const r = e[t]; + if (this.readExtensions_) { + const s = r.get("extensionsNode_") || null; + this.readExtensions_(r, s); + } + r.set("extensionsNode_", void 0); + } + } + /** + * Reads a GPX file's metadata tag, reading among other things: + * - the name and description of this GPX + * - its author + * - the copyright associated with this GPX file + * + * Will return null if no metadata tag is present (or no valid source is given). + * + * @param {Document|Element|Object|string} source Source. + * @return {GPXMetadata | null} Metadata + * @api + */ + readMetadata(e) { + return e ? typeof e == "string" ? this.readMetadataFromDocument(Qi(e)) : vi(e) ? this.readMetadataFromDocument( + /** @type {Document} */ + e + ) : this.readMetadataFromNode(e) : null; + } + /** + * @param {Document} doc Document. + * @return {GPXMetadata | null} Metadata + */ + readMetadataFromDocument(e) { + for (let t = ( + /** @type {Node} */ + e.firstChild + ); t; t = t.nextSibling) + if (t.nodeType === Node.ELEMENT_NODE) { + const i = this.readMetadataFromNode( + /** @type {Element} */ + t + ); + if (i) + return i; + } + return null; + } + /** + * @param {Element} node Node. + * @return {Object} Metadata + */ + readMetadataFromNode(e) { + if (!Ze.includes(e.namespaceURI)) + return null; + for (let t = e.firstElementChild; t; t = t.nextElementSibling) + if (Ze.includes(t.namespaceURI) && t.localName === "metadata") + return k({}, lS, t, []); + return null; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {import("../Feature.js").default} Feature. + * @override + */ + readFeatureFromNode(e, t) { + if (!Ze.includes(e.namespaceURI)) + return null; + const i = rS[e.localName]; + if (!i) + return null; + const r = i(e, [this.getReadOptions(e, t)]); + return r ? (this.handleReadExtensions_([r]), r) : null; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {Array} Features. + * @override + */ + readFeaturesFromNode(e, t) { + if (!Ze.includes(e.namespaceURI)) + return []; + if (e.localName == "gpx") { + const i = k([], sS, e, [ + this.getReadOptions(e, t) + ]); + return i ? (this.handleReadExtensions_(i), i) : []; + } + return []; + } + /** + * Encode an array of features in the GPX format as an XML node. + * LineString geometries are output as routes (``), and MultiLineString + * as tracks (``). + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Node} Node. + * @api + * @override + */ + writeFeaturesNode(e, t) { + t = this.adaptOptions(t); + const i = fe("http://www.topografix.com/GPX/1/1", "gpx"); + return i.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xsi", Kr), i.setAttributeNS( + Kr, + "xsi:schemaLocation", + nS + ), i.setAttribute("version", "1.1"), i.setAttribute("creator", "OpenLayers"), Ee( + /** @type {import("../xml.js").NodeStackItem} */ + { node: i }, + cS, + vS, + e, + [t] + ), i; + } +} +const hS = O(Ze, { + name: R(U), + cmt: R(U), + desc: R(U), + src: R(U), + link: Il, + number: R(ht), + extensions: Mc, + type: R(U), + rtept: bS +}), uS = O(Ze, { + ele: R(Be), + time: R(Pc) +}), gS = O(Ze, { + name: R(U), + cmt: R(U), + desc: R(U), + src: R(U), + link: Il, + number: R(ht), + type: R(U), + extensions: Mc, + trkseg: MS +}), dS = O(Ze, { + trkpt: PS +}), fS = O(Ze, { + ele: R(Be), + time: R(Pc) +}), mS = O(Ze, { + ele: R(Be), + time: R(Pc), + magvar: R(Be), + geoidheight: R(Be), + name: R(U), + cmt: R(U), + desc: R(U), + src: R(U), + link: Il, + sym: R(U), + type: R(U), + fix: R(U), + sat: R(ht), + hdop: R(Be), + vdop: R(Be), + pdop: R(Be), + ageofdgpsdata: R(Be), + dgpsid: R(ht), + extensions: Mc +}), ES = ["text", "type"], pS = O(Ze, { + text: D(ge), + type: D(ge) +}), _S = O(Ze, [ + "name", + "cmt", + "desc", + "src", + "link", + "number", + "type", + "rtept" +]), IS = O(Ze, { + name: D(ge), + cmt: D(ge), + desc: D(ge), + src: D(ge), + link: D(ld), + number: D(zA), + type: D(ge), + rtept: N_(D(Ad)) +}), CS = O(Ze, ["ele", "time"]), yS = O(Ze, [ + "name", + "cmt", + "desc", + "src", + "link", + "number", + "type", + "trkseg" +]), wS = O(Ze, { + name: D(ge), + cmt: D(ge), + desc: D(ge), + src: D(ge), + link: D(ld), + number: D(zA), + type: D(ge), + trkseg: N_(D(GS)) +}), xS = ot("trkpt"), BS = O(Ze, { + trkpt: D(Ad) +}), SS = O(Ze, [ + "ele", + "time", + "magvar", + "geoidheight", + "name", + "cmt", + "desc", + "src", + "link", + "sym", + "type", + "fix", + "sat", + "hdop", + "vdop", + "pdop", + "ageofdgpsdata", + "dgpsid" +]), RS = O(Ze, { + ele: D(ii), + time: D(ZB), + magvar: D(ii), + geoidheight: D(ii), + name: D(ge), + cmt: D(ge), + desc: D(ge), + src: D(ge), + link: D(ld), + sym: D(ge), + type: D(ge), + fix: D(ge), + sat: D(zA), + hdop: D(ii), + vdop: D(ii), + pdop: D(ii), + ageofdgpsdata: D(ii), + dgpsid: D(zA) +}), TS = { + Point: "wpt", + LineString: "rte", + MultiLineString: "trk" +}; +function vS(n, e, t) { + const i = ( + /** @type {Feature} */ + n.getGeometry() + ); + if (i) { + const r = TS[i.getType()]; + if (r) { + const s = e[e.length - 1].node; + return fe(s.namespaceURI, r); + } + } +} +function od(n, e, t, i) { + return n.push( + parseFloat(t.getAttribute("lon")), + parseFloat(t.getAttribute("lat")) + ), "ele" in i ? (n.push( + /** @type {number} */ + i.ele + ), delete i.ele, e.hasZ = !0) : n.push(0), "time" in i ? (n.push( + /** @type {number} */ + i.time + ), delete i.time, e.hasM = !0) : n.push(0), n; +} +function ad(n, e, t) { + let i = "XY", r = 2; + if (n.hasZ && n.hasM ? (i = "XYZM", r = 4) : n.hasZ ? (i = "XYZ", r = 3) : n.hasM && (i = "XYM", r = 3), r !== 4) { + for (let s = 0, o = e.length / 4; s < o; s++) + e[s * r] = e[s * 4], e[s * r + 1] = e[s * 4 + 1], n.hasZ && (e[s * r + 2] = e[s * 4 + 2]), n.hasM && (e[s * r + 2] = e[s * 4 + 3]); + if (e.length = e.length / 4 * r, t) + for (let s = 0, o = t.length; s < o; s++) + t[s] = t[s] / 4 * r; + } + return i; +} +function QS(n, e) { + const t = k({}, aS, n, e); + if (t) + return t; +} +function DS(n, e) { + const t = k({}, AS, n, e); + if (t) { + const i = n.getAttribute("author"); + return i !== null && (t.author = i), t; + } +} +function LS(n, e) { + const t = ( + /** @type {Object} */ + e[e.length - 1] + ), i = n.getAttribute("minlat"), r = n.getAttribute("minlon"), s = n.getAttribute("maxlat"), o = n.getAttribute("maxlon"); + r !== null && i !== null && o !== null && s !== null && (t.bounds = [ + [parseFloat(r), parseFloat(i)], + [parseFloat(o), parseFloat(s)] + ]); +} +function FS(n, e) { + const t = ( + /** @type {Object} */ + e[e.length - 1] + ), i = n.getAttribute("id"), r = n.getAttribute("domain"); + i !== null && r !== null && (t.email = `${i}@${r}`); +} +function Il(n, e) { + const t = ( + /** @type {Object} */ + e[e.length - 1] + ), i = n.getAttribute("href"); + i !== null && (t.link = i), oi(oS, n, e); +} +function Mc(n, e) { + const t = ( + /** @type {Object} */ + e[e.length - 1] + ); + t.extensionsNode_ = n; +} +function bS(n, e) { + const t = k({}, uS, n, e); + if (t) { + const i = ( + /** @type {!Object} */ + e[e.length - 1] + ), r = ( + /** @type {Array} */ + i.flatCoordinates + ), s = ( + /** @type {LayoutOptions} */ + i.layoutOptions + ); + od(r, s, n, t); + } +} +function PS(n, e) { + const t = k({}, fS, n, e); + if (t) { + const i = ( + /** @type {!Object} */ + e[e.length - 1] + ), r = ( + /** @type {Array} */ + i.flatCoordinates + ), s = ( + /** @type {LayoutOptions} */ + i.layoutOptions + ); + od(r, s, n, t); + } +} +function MS(n, e) { + const t = ( + /** @type {Object} */ + e[e.length - 1] + ); + oi(dS, n, e); + const i = ( + /** @type {Array} */ + t.flatCoordinates + ); + /** @type {Array} */ + t.ends.push(i.length); +} +function k_(n, e) { + const t = ( + /** @type {import("./Feature.js").ReadOptions} */ + e[0] + ), i = k( + { + flatCoordinates: [], + layoutOptions: {} + }, + hS, + n, + e + ); + if (!i) + return; + const r = ( + /** @type {Array} */ + i.flatCoordinates + ); + delete i.flatCoordinates; + const s = ( + /** @type {LayoutOptions} */ + i.layoutOptions + ); + delete i.layoutOptions; + const o = ad(s, r), a = new Ke(r, o); + je(a, !1, t); + const l = new ve(a); + return l.setProperties(i, !0), l; +} +function $_(n, e) { + const t = ( + /** @type {import("./Feature.js").ReadOptions} */ + e[0] + ), i = k( + { + flatCoordinates: [], + ends: [], + layoutOptions: {} + }, + gS, + n, + e + ); + if (!i) + return; + const r = ( + /** @type {Array} */ + i.flatCoordinates + ); + delete i.flatCoordinates; + const s = ( + /** @type {Array} */ + i.ends + ); + delete i.ends; + const o = ( + /** @type {LayoutOptions} */ + i.layoutOptions + ); + delete i.layoutOptions; + const a = ad(o, r, s), l = new Ot(r, a, s); + je(l, !1, t); + const A = new ve(l); + return A.setProperties(i, !0), A; +} +function U_(n, e) { + const t = ( + /** @type {import("./Feature.js").ReadOptions} */ + e[0] + ), i = k({}, mS, n, e); + if (!i) + return; + const r = ( + /** @type {LayoutOptions} */ + {} + ), s = od([], r, n, i), o = ad(r, s), a = new Xe(s, o); + je(a, !1, t); + const l = new ve(a); + return l.setProperties(i, !0), l; +} +function ld(n, e, t) { + n.setAttribute("href", e); + const r = t[t.length - 1].properties, s = [r.linkText, r.linkType]; + Ee( + /** @type {import("../xml.js").NodeStackItem} */ + { node: n }, + pS, + Lt, + s, + t, + ES + ); +} +function Ad(n, e, t) { + const i = t[t.length - 1], s = i.node.namespaceURI, o = i.properties; + switch (n.setAttributeNS(null, "lat", String(e[1])), n.setAttributeNS(null, "lon", String(e[0])), i.geometryLayout) { + case "XYZM": + e[3] !== 0 && (o.time = e[3]); + case "XYZ": + e[2] !== 0 && (o.ele = e[2]); + break; + case "XYM": + e[2] !== 0 && (o.time = e[2]); + break; + } + const l = n.nodeName == "rtept" ? CS[s] : SS[s], A = Ai(o, l); + Ee( + /** @type {import("../xml.js").NodeStackItem} */ + { node: n, properties: o }, + RS, + Lt, + A, + t, + l + ); +} +function NS(n, e, t) { + const i = ( + /** @type {import("./Feature.js").WriteOptions} */ + t[0] + ), r = e.getProperties(), s = { node: n }; + s.properties = r; + const o = e.getGeometry(); + if (o.getType() == "LineString") { + const c = ( + /** @type {LineString} */ + je(o, !0, i) + ); + s.geometryLayout = c.getLayout(), r.rtept = c.getCoordinates(); + } + const a = t[t.length - 1].node, l = _S[a.namespaceURI], A = Ai(r, l); + Ee( + s, + IS, + Lt, + A, + t, + l + ); +} +function OS(n, e, t) { + const i = ( + /** @type {import("./Feature.js").WriteOptions} */ + t[0] + ), r = e.getProperties(), s = { node: n }; + s.properties = r; + const o = e.getGeometry(); + if (o.getType() == "MultiLineString") { + const c = ( + /** @type {MultiLineString} */ + je(o, !0, i) + ); + r.trkseg = c.getLineStrings(); + } + const a = t[t.length - 1].node, l = yS[a.namespaceURI], A = Ai(r, l); + Ee( + s, + wS, + Lt, + A, + t, + l + ); +} +function GS(n, e, t) { + const i = { node: n }; + i.geometryLayout = e.getLayout(), i.properties = {}, Ee( + i, + BS, + xS, + e.getCoordinates(), + t + ); +} +function kS(n, e, t) { + const i = ( + /** @type {import("./Feature.js").WriteOptions} */ + t[0] + ), r = t[t.length - 1]; + r.properties = e.getProperties(); + const s = e.getGeometry(); + if (s.getType() == "Point") { + const o = ( + /** @type {Point} */ + je(s, !0, i) + ); + r.geometryLayout = o.getLayout(), Ad(n, o.getCoordinates(), t); + } +} +class rG extends sd { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + e = e || {}, super(), this.dataProjection = q( + e.dataProjection ? e.dataProjection : "EPSG:4326" + ), e.featureProjection && (this.defaultFeatureProjection = q(e.featureProjection)), e.featureClass && (this.featureClass = e.featureClass), this.geometryName_ = e.geometryName, this.extractGeometryName_ = e.extractGeometryName, this.supportedMediaTypes = [ + "application/geo+json", + "application/vnd.geo+json" + ]; + } + /** + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {FeatureType|Array} Feature. + * @override + */ + readFeatureFromObject(e, t) { + let i = null; + e.type === "Feature" ? i = /** @type {GeoJSONFeature} */ + e : i = { + type: "Feature", + geometry: ( + /** @type {GeoJSONGeometry} */ + e + ), + properties: null + }; + const r = cd(i.geometry); + if (this.featureClass === Ut) + return ( + /** @type {FeatureType|Array} */ + P_( + { + geometry: r, + id: i.id, + properties: i.properties + }, + t + ) + ); + const s = new ve(); + return this.geometryName_ ? s.setGeometryName(this.geometryName_) : this.extractGeometryName_ && i.geometry_name && s.setGeometryName(i.geometry_name), s.setGeometry(rd(r, t)), "id" in i && s.setId(i.id), i.properties && s.setProperties(i.properties, !0), /** @type {FeatureType|Array} */ + s; + } + /** + * @param {Object} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {Array} Features. + * @override + */ + readFeaturesFromObject(e, t) { + const i = ( + /** @type {GeoJSONObject} */ + e + ); + let r = null; + if (i.type === "FeatureCollection") { + const s = ( + /** @type {GeoJSONFeatureCollection} */ + e + ); + r = []; + const o = s.features; + for (let a = 0, l = o.length; a < l; ++a) { + const A = this.readFeatureFromObject( + o[a], + t + ); + A && r.push(A); + } + } else + r = [this.readFeatureFromObject(e, t)]; + return ( + /** @type {Array} */ + r.flat() + ); + } + /** + * @param {GeoJSONGeometry} object Object. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + * @override + */ + readGeometryFromObject(e, t) { + return $S(e, t); + } + /** + * @param {Object} object Object. + * @protected + * @return {import("../proj/Projection.js").default} Projection. + * @override + */ + readProjectionFromObject(e) { + const t = e.crs; + let i; + if (t) + if (t.type == "name") + i = q(t.properties.name); + else if (t.type === "EPSG") + i = q("EPSG:" + t.properties.code); + else + throw new Error("Unknown SRS type"); + else + i = this.dataProjection; + return ( + /** @type {import("../proj/Projection.js").default} */ + i + ); + } + /** + * Encode a feature as a GeoJSON Feature object. + * + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {GeoJSONFeature} Object. + * @api + * @override + */ + writeFeatureObject(e, t) { + t = this.adaptOptions(t); + const i = { + type: "Feature", + geometry: null, + properties: null + }, r = e.getId(); + if (r !== void 0 && (i.id = r), !e.hasProperties()) + return i; + const s = e.getProperties(), o = e.getGeometry(); + return o && (i.geometry = Mu(o, t), delete s[e.getGeometryName()]), Hi(s) || (i.properties = s), i; + } + /** + * Encode an array of features as a GeoJSON object. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {GeoJSONFeatureCollection} GeoJSON Object. + * @api + * @override + */ + writeFeaturesObject(e, t) { + t = this.adaptOptions(t); + const i = []; + for (let r = 0, s = e.length; r < s; ++r) + i.push(this.writeFeatureObject(e[r], t)); + return { + type: "FeatureCollection", + features: i + }; + } + /** + * Encode a geometry as a GeoJSON object. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {GeoJSONGeometry|GeoJSONGeometryCollection} Object. + * @api + * @override + */ + writeGeometryObject(e, t) { + return Mu(e, this.adaptOptions(t)); + } +} +function cd(n, e) { + if (!n) + return null; + let t; + switch (n.type) { + case "Point": { + t = YS( + /** @type {GeoJSONPoint} */ + n + ); + break; + } + case "LineString": { + t = zS( + /** @type {GeoJSONLineString} */ + n + ); + break; + } + case "Polygon": { + t = qS( + /** @type {GeoJSONPolygon} */ + n + ); + break; + } + case "MultiPoint": { + t = HS( + /** @type {GeoJSONMultiPoint} */ + n + ); + break; + } + case "MultiLineString": { + t = VS( + /** @type {GeoJSONMultiLineString} */ + n + ); + break; + } + case "MultiPolygon": { + t = XS( + /** @type {GeoJSONMultiPolygon} */ + n + ); + break; + } + case "GeometryCollection": { + t = US( + /** @type {GeoJSONGeometryCollection} */ + n + ); + break; + } + default: + throw new Error("Unsupported GeoJSON type: " + n.type); + } + return t; +} +function $S(n, e) { + const t = cd(n); + return rd(t, e); +} +function US(n, e) { + return n.geometries.map( + /** + * @param {GeoJSONGeometry} geometry Geometry. + * @return {import("./Feature.js").GeometryObject} geometry Geometry. + */ + function(i) { + return cd(i); + } + ); +} +function YS(n) { + const e = n.coordinates; + return { + type: "Point", + flatCoordinates: e, + layout: ls(e.length) + }; +} +function zS(n) { + var i; + const e = n.coordinates, t = e.flat(); + return { + type: "LineString", + flatCoordinates: t, + ends: [t.length], + layout: ls(((i = e[0]) == null ? void 0 : i.length) || 2) + }; +} +function VS(n) { + var s, o; + const e = n.coordinates, t = ((o = (s = e[0]) == null ? void 0 : s[0]) == null ? void 0 : o.length) || 2, i = [], r = cl(i, 0, e, t); + return { + type: "MultiLineString", + flatCoordinates: i, + ends: r, + layout: ls(t) + }; +} +function HS(n) { + var t; + const e = n.coordinates; + return { + type: "MultiPoint", + flatCoordinates: e.flat(), + layout: ls(((t = e[0]) == null ? void 0 : t.length) || 2) + }; +} +function XS(n) { + var s, o; + const e = n.coordinates, t = [], i = ((o = (s = e[0]) == null ? void 0 : s[0]) == null ? void 0 : o[0].length) || 2, r = Gp( + t, + 0, + e, + i + ); + return { + type: "MultiPolygon", + flatCoordinates: t, + ends: r, + layout: ls(i) + }; +} +function qS(n) { + var s, o; + const e = n.coordinates, t = [], i = (o = (s = e[0]) == null ? void 0 : s[0]) == null ? void 0 : o.length, r = cl(t, 0, e, i); + return { + type: "Polygon", + flatCoordinates: t, + ends: r, + layout: ls(i) + }; +} +function Mu(n, e) { + n = je(n, !0, e); + const t = n.getType(); + let i; + switch (t) { + case "Point": { + i = eR( + /** @type {import("../geom/Point.js").default} */ + n + ); + break; + } + case "LineString": { + i = KS( + /** @type {import("../geom/LineString.js").default} */ + n + ); + break; + } + case "Polygon": { + i = tR( + /** @type {import("../geom/Polygon.js").default} */ + n, + e + ); + break; + } + case "MultiPoint": { + i = ZS( + /** @type {import("../geom/MultiPoint.js").default} */ + n + ); + break; + } + case "MultiLineString": { + i = WS( + /** @type {import("../geom/MultiLineString.js").default} */ + n + ); + break; + } + case "MultiPolygon": { + i = JS( + /** @type {import("../geom/MultiPolygon.js").default} */ + n, + e + ); + break; + } + case "GeometryCollection": { + i = jS( + /** @type {import("../geom/GeometryCollection.js").default} */ + n, + e + ); + break; + } + case "Circle": { + i = { + type: "GeometryCollection", + geometries: [] + }; + break; + } + default: + throw new Error("Unsupported geometry type: " + t); + } + return i; +} +function jS(n, e) { + return e = Object.assign({}, e), delete e.featureProjection, { + type: "GeometryCollection", + geometries: n.getGeometriesArray().map(function(i) { + return Mu(i, e); + }) + }; +} +function KS(n, e) { + return { + type: "LineString", + coordinates: n.getCoordinates() + }; +} +function WS(n, e) { + return { + type: "MultiLineString", + coordinates: n.getCoordinates() + }; +} +function ZS(n, e) { + return { + type: "MultiPoint", + coordinates: n.getCoordinates() + }; +} +function JS(n, e) { + let t; + return e && (t = e.rightHanded), { + type: "MultiPolygon", + coordinates: n.getCoordinates(t) + }; +} +function eR(n, e) { + return { + type: "Point", + coordinates: n.getCoordinates() + }; +} +function tR(n, e) { + let t; + return e && (t = e.rightHanded), { + type: "Polygon", + coordinates: n.getCoordinates(t) + }; +} +class hd extends pl { + constructor() { + super(); + } + /** + * @return {import("./Feature.js").Type} Format. + * @override + */ + getType() { + return "text"; + } + /** + * Read the feature from the source. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../Feature.js").default} Feature. + * @api + * @override + */ + readFeature(e, t) { + return this.readFeatureFromText( + Vl(e), + this.adaptOptions(t) + ); + } + /** + * @abstract + * @param {string} text Text. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {import("../Feature.js").default} Feature. + */ + readFeatureFromText(e, t) { + return ae(); + } + /** + * Read the features from the source. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {Array} Features. + * @api + * @override + */ + readFeatures(e, t) { + return this.readFeaturesFromText( + Vl(e), + this.adaptOptions(t) + ); + } + /** + * @abstract + * @param {string} text Text. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {Array} Features. + */ + readFeaturesFromText(e, t) { + return ae(); + } + /** + * Read the geometry from the source. + * + * @param {Document|Element|Object|string} source Source. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../geom/Geometry.js").default} Geometry. + * @api + * @override + */ + readGeometry(e, t) { + return this.readGeometryFromText( + Vl(e), + this.adaptOptions(t) + ); + } + /** + * @abstract + * @param {string} text Text. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {import("../geom/Geometry.js").default} Geometry. + */ + readGeometryFromText(e, t) { + return ae(); + } + /** + * Read the projection from the source. + * + * @param {Document|Element|Object|string} source Source. + * @return {import("../proj/Projection.js").default|undefined} Projection. + * @api + * @override + */ + readProjection(e) { + return this.readProjectionFromText(Vl(e)); + } + /** + * @param {string} text Text. + * @protected + * @return {import("../proj/Projection.js").default|undefined} Projection. + */ + readProjectionFromText(e) { + return this.dataProjection; + } + /** + * Encode a feature as a string. + * + * @param {import("../Feature.js").default} feature Feature. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded feature. + * @api + * @override + */ + writeFeature(e, t) { + return this.writeFeatureText(e, this.adaptOptions(t)); + } + /** + * @abstract + * @param {import("../Feature.js").default} feature Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @protected + * @return {string} Text. + */ + writeFeatureText(e, t) { + return ae(); + } + /** + * Encode an array of features as string. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Encoded features. + * @api + * @override + */ + writeFeatures(e, t) { + return this.writeFeaturesText(e, this.adaptOptions(t)); + } + /** + * @abstract + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @protected + * @return {string} Text. + */ + writeFeaturesText(e, t) { + return ae(); + } + /** + * Write a single geometry. + * + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @return {string} Geometry. + * @api + * @override + */ + writeGeometry(e, t) { + return this.writeGeometryText(e, this.adaptOptions(t)); + } + /** + * @abstract + * @param {import("../geom/Geometry.js").default} geometry Geometry. + * @param {import("./Feature.js").WriteOptions} [options] Write options. + * @protected + * @return {string} Text. + */ + writeGeometryText(e, t) { + return ae(); + } +} +function Vl(n) { + return typeof n == "string" ? n : ""; +} +const iR = /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{5})([NS])(\d{3})(\d{5})([EW])([AV])(\d{5})(\d{5})/, nR = /^H.([A-Z]{3}).*?:(.*)/, rR = /^HFDTE(\d{2})(\d{2})(\d{2})/, sR = /^HFDTEDATE:(\d{2})(\d{2})(\d{2}),(\d{2})/, oR = /\r\n|\r|\n/; +class sG extends hd { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, this.dataProjection = q("EPSG:4326"), this.altitudeMode_ = e.altitudeMode ? e.altitudeMode : "none", this.lad_ = !1, this.lod_ = !1, this.ladStart_ = 0, this.ladStop_ = 0, this.lodStart_ = 0, this.lodStop_ = 0; + } + /** + * @protected + * @param {string} text Text. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @return {import("../Feature.js").default} Feature. + * @override + */ + readFeatureFromText(e, t) { + const i = this.altitudeMode_, r = e.split(oR), s = {}, o = []; + let a = 2e3, l = 0, A = 1, c = -1, h, u; + for (h = 0, u = r.length; h < u; ++h) { + const f = r[h]; + let E; + if (f.charAt(0) == "B") { + if (E = iR.exec(f), E) { + const p = parseInt(E[1], 10), _ = parseInt(E[2], 10), I = parseInt(E[3], 10); + let y = parseInt(E[4], 10) + parseInt(E[5], 10) / 6e4; + this.lad_ && (y += parseInt(f.slice(this.ladStart_, this.ladStop_), 10) / 6e4 / 10 ** (this.ladStop_ - this.ladStart_)), E[6] == "S" && (y = -y); + let C = parseInt(E[7], 10) + parseInt(E[8], 10) / 6e4; + if (this.lod_ && (C += parseInt(f.slice(this.lodStart_, this.lodStop_), 10) / 6e4 / 10 ** (this.lodStop_ - this.lodStart_)), E[9] == "W" && (C = -C), o.push(C, y), i != "none") { + let x; + i == "gps" ? x = parseInt(E[11], 10) : i == "barometric" ? x = parseInt(E[12], 10) : x = 0, o.push(x); + } + let w = Date.UTC(a, l, A, p, _, I); + w < c && (w = Date.UTC(a, l, A + 1, p, _, I)), o.push(w / 1e3), c = w; + } + } else if (f.charAt(0) == "H") + E = sR.exec(f), E ? (A = parseInt(E[1], 10), l = parseInt(E[2], 10) - 1, a = 2e3 + parseInt(E[3], 10)) : (E = rR.exec(f), E ? (A = parseInt(E[1], 10), l = parseInt(E[2], 10) - 1, a = 2e3 + parseInt(E[3], 10)) : (E = nR.exec(f), E && (s[E[1]] = E[2].trim()))); + else if (f.charAt(0) == "I") { + const p = parseInt(f.slice(1, 3), 10); + for (let _ = 0; _ < p; _++) { + const I = f.slice(7 + _ * 7, 10 + _ * 7); + if (I === "LAD" || I === "LOD") { + const y = parseInt(f.slice(3 + _ * 7, 5 + _ * 7), 10) - 1, C = parseInt(f.slice(5 + _ * 7, 7 + _ * 7), 10); + I === "LAD" ? (this.lad_ = !0, this.ladStart_ = y, this.ladStop_ = C) : I === "LOD" && (this.lod_ = !0, this.lodStart_ = y, this.lodStop_ = C); + } + } + } + } + if (o.length === 0) + return null; + const g = i == "none" ? "XYM" : "XYZM", d = new Ke(o, g), m = new ve( + je(d, !1, t) + ); + return m.setProperties(s, !0), m; + } + /** + * @param {string} text Text. + * @param {import("./Feature.js").ReadOptions} [options] Read options. + * @protected + * @return {Array} Features. + * @override + */ + readFeaturesFromText(e, t) { + const i = this.readFeatureFromText(e, t); + return i ? [i] : []; + } +} +const Et = { + VERSION1: "version1", + VERSION2: "version2", + VERSION3: "version3" +}, Wr = {}; +Wr[Et.VERSION1] = { + level0: { + supports: [], + formats: [], + qualities: ["native"] + }, + level1: { + supports: ["regionByPx", "sizeByW", "sizeByH", "sizeByPct"], + formats: ["jpg"], + qualities: ["native"] + }, + level2: { + supports: [ + "regionByPx", + "regionByPct", + "sizeByW", + "sizeByH", + "sizeByPct", + "sizeByConfinedWh", + "sizeByWh" + ], + formats: ["jpg", "png"], + qualities: ["native", "color", "grey", "bitonal"] + } +}; +Wr[Et.VERSION2] = { + level0: { + supports: [], + formats: ["jpg"], + qualities: ["default"] + }, + level1: { + supports: ["regionByPx", "sizeByW", "sizeByH", "sizeByPct"], + formats: ["jpg"], + qualities: ["default"] + }, + level2: { + supports: [ + "regionByPx", + "regionByPct", + "sizeByW", + "sizeByH", + "sizeByPct", + "sizeByConfinedWh", + "sizeByDistortedWh", + "sizeByWh" + ], + formats: ["jpg", "png"], + qualities: ["default", "bitonal"] + } +}; +Wr[Et.VERSION3] = { + level0: { + supports: [], + formats: ["jpg"], + qualities: ["default"] + }, + level1: { + supports: ["regionByPx", "regionSquare", "sizeByW", "sizeByH", "sizeByWh"], + formats: ["jpg"], + qualities: ["default"] + }, + level2: { + supports: [ + "regionByPx", + "regionSquare", + "regionByPct", + "sizeByW", + "sizeByH", + "sizeByPct", + "sizeByConfinedWh", + "sizeByWh" + ], + formats: ["jpg", "png"], + qualities: ["default"] + } +}; +Wr.none = { + none: { + supports: [], + formats: [], + qualities: [] + } +}; +const aR = /^https?:\/\/library\.stanford\.edu\/iiif\/image-api\/(?:1\.1\/)?compliance\.html#level[0-2]$/, pm = /^https?:\/\/iiif\.io\/api\/image\/2\/level[0-2](?:\.json)?$/, lR = /(^https?:\/\/iiif\.io\/api\/image\/3\/level[0-2](?:\.json)?$)|(^level[0-2]$)/; +function AR(n) { + let e = n.getComplianceLevelSupportedFeatures(); + return e === void 0 && (e = Wr[Et.VERSION1].level0), { + url: n.imageInfo["@id"] === void 0 ? void 0 : n.imageInfo["@id"].replace(/\/?(?:info\.json)?$/g, ""), + supports: e.supports, + formats: [ + ...e.formats, + n.imageInfo.formats === void 0 ? [] : n.imageInfo.formats + ], + qualities: [ + ...e.qualities, + n.imageInfo.qualities === void 0 ? [] : n.imageInfo.qualities + ], + resolutions: n.imageInfo.scale_factors, + tileSize: n.imageInfo.tile_width !== void 0 ? n.imageInfo.tile_height !== void 0 ? [n.imageInfo.tile_width, n.imageInfo.tile_height] : [n.imageInfo.tile_width, n.imageInfo.tile_width] : n.imageInfo.tile_height != null ? [n.imageInfo.tile_height, n.imageInfo.tile_height] : void 0 + }; +} +function cR(n) { + const e = n.getComplianceLevelSupportedFeatures(), t = Array.isArray(n.imageInfo.profile) && n.imageInfo.profile.length > 1, i = t && n.imageInfo.profile[1].supports ? n.imageInfo.profile[1].supports : [], r = t && n.imageInfo.profile[1].formats ? n.imageInfo.profile[1].formats : [], s = t && n.imageInfo.profile[1].qualities ? n.imageInfo.profile[1].qualities : []; + return { + url: n.imageInfo["@id"].replace(/\/?(?:info\.json)?$/g, ""), + sizes: n.imageInfo.sizes === void 0 ? void 0 : n.imageInfo.sizes.map(function(o) { + return [o.width, o.height]; + }), + tileSize: n.imageInfo.tiles === void 0 ? void 0 : [ + n.imageInfo.tiles.map(function(o) { + return o.width; + })[0], + n.imageInfo.tiles.map(function(o) { + return o.height === void 0 ? o.width : o.height; + })[0] + ], + resolutions: n.imageInfo.tiles === void 0 ? void 0 : n.imageInfo.tiles.map(function(o) { + return o.scaleFactors; + })[0], + supports: [...e.supports, ...i], + formats: [...e.formats, ...r], + qualities: [...e.qualities, ...s] + }; +} +function hR(n) { + const e = n.getComplianceLevelSupportedFeatures(), t = n.imageInfo.extraFormats === void 0 ? e.formats : [...e.formats, ...n.imageInfo.extraFormats], i = n.imageInfo.preferredFormats !== void 0 && Array.isArray(n.imageInfo.preferredFormats) && n.imageInfo.preferredFormats.length > 0 ? n.imageInfo.preferredFormats.filter(function(r) { + return ["jpg", "png", "gif"].includes(r); + }).reduce(function(r, s) { + return r === void 0 && t.includes(s) ? s : r; + }, void 0) : void 0; + return { + url: n.imageInfo.id, + sizes: n.imageInfo.sizes === void 0 ? void 0 : n.imageInfo.sizes.map(function(r) { + return [r.width, r.height]; + }), + tileSize: n.imageInfo.tiles === void 0 ? void 0 : [ + n.imageInfo.tiles.map(function(r) { + return r.width; + })[0], + n.imageInfo.tiles.map(function(r) { + return r.height; + })[0] + ], + resolutions: n.imageInfo.tiles === void 0 ? void 0 : n.imageInfo.tiles.map(function(r) { + return r.scaleFactors; + })[0], + supports: n.imageInfo.extraFeatures === void 0 ? e.supports : [...e.supports, ...n.imageInfo.extraFeatures], + formats: t, + qualities: n.imageInfo.extraQualities === void 0 ? e.qualities : [...e.qualities, ...n.imageInfo.extraQualities], + preferredFormat: i + }; +} +const Nc = {}; +Nc[Et.VERSION1] = AR; +Nc[Et.VERSION2] = cR; +Nc[Et.VERSION3] = hR; +class oG { + /** + * @param {string|ImageInformationResponse} imageInfo + * Deserialized image information JSON response object or JSON response as string + */ + constructor(e) { + this.setImageInfo(e); + } + /** + * @param {string|ImageInformationResponse} imageInfo + * Deserialized image information JSON response object or JSON response as string + * @api + */ + setImageInfo(e) { + typeof e == "string" ? this.imageInfo = JSON.parse(e) : this.imageInfo = e; + } + /** + * @return {Versions|undefined} Major IIIF version. + * @api + */ + getImageApiVersion() { + if (this.imageInfo === void 0) + return; + let e = this.imageInfo["@context"] || "ol-no-context"; + typeof e == "string" && (e = [e]); + for (let t = 0; t < e.length; t++) + switch (e[t]) { + case "http://library.stanford.edu/iiif/image-api/1.1/context.json": + case "http://iiif.io/api/image/1/context.json": + return Et.VERSION1; + case "http://iiif.io/api/image/2/context.json": + return Et.VERSION2; + case "http://iiif.io/api/image/3/context.json": + return Et.VERSION3; + case "ol-no-context": + if (this.getComplianceLevelEntryFromProfile(Et.VERSION1) && this.imageInfo.identifier) + return Et.VERSION1; + break; + } + Ie( + !1, + "Cannot determine IIIF Image API version from provided image information JSON" + ); + } + /** + * @param {Versions} version Optional IIIF image API version + * @return {string|undefined} Compliance level as it appears in the IIIF image information + * response. + */ + getComplianceLevelEntryFromProfile(e) { + if (!(this.imageInfo === void 0 || this.imageInfo.profile === void 0)) + switch (e === void 0 && (e = this.getImageApiVersion()), e) { + case Et.VERSION1: + if (aR.test(this.imageInfo.profile)) + return this.imageInfo.profile; + break; + case Et.VERSION3: + if (lR.test(this.imageInfo.profile)) + return this.imageInfo.profile; + break; + case Et.VERSION2: + if (typeof this.imageInfo.profile == "string" && pm.test(this.imageInfo.profile)) + return this.imageInfo.profile; + if (Array.isArray(this.imageInfo.profile) && this.imageInfo.profile.length > 0 && typeof this.imageInfo.profile[0] == "string" && pm.test(this.imageInfo.profile[0])) + return this.imageInfo.profile[0]; + break; + } + } + /** + * @param {Versions} version Optional IIIF image API version + * @return {string} Compliance level, on of 'level0', 'level1' or 'level2' or undefined + */ + getComplianceLevelFromProfile(e) { + const t = this.getComplianceLevelEntryFromProfile(e); + if (t === void 0) + return; + const i = t.match(/level[0-2](?:\.json)?$/g); + return Array.isArray(i) ? i[0].replace(".json", "") : void 0; + } + /** + * @return {SupportedFeatures|undefined} Image formats, qualities and region / size calculation + * methods that are supported by the IIIF service. + */ + getComplianceLevelSupportedFeatures() { + if (this.imageInfo === void 0) + return; + const e = this.getImageApiVersion(), t = this.getComplianceLevelFromProfile(e); + return t === void 0 ? Wr.none.none : Wr[e][t]; + } + /** + * @param {PreferredOptions} [preferredOptions] Optional options for preferred format and quality. + * @return {import("../source/IIIF.js").Options|undefined} IIIF tile source ready constructor options. + * @api + */ + getTileSourceOptions(e) { + const t = e || {}, i = this.getImageApiVersion(); + if (i === void 0) + return; + const r = i === void 0 ? void 0 : Nc[i](this); + if (r !== void 0) + return { + url: r.url, + version: i, + size: [this.imageInfo.width, this.imageInfo.height], + sizes: r.sizes, + format: t.format !== void 0 && r.formats.includes(t.format) ? t.format : r.preferredFormat !== void 0 ? r.preferredFormat : "jpg", + supports: r.supports, + quality: t.quality && r.qualities.includes(t.quality) ? t.quality : r.qualities.includes("native") ? "native" : "default", + resolutions: Array.isArray(r.resolutions) ? r.resolutions.sort(function(s, o) { + return o - s; + }) : void 0, + tileSize: r.tileSize + }; + } +} +const Zn = ["http://www.google.com/kml/ext/2.2"], oe = [ + null, + "http://earth.google.com/kml/2.0", + "http://earth.google.com/kml/2.1", + "http://earth.google.com/kml/2.2", + "http://www.opengis.net/kml/2.2" +], uR = "http://www.opengis.net/kml/2.2 https://developers.google.com/kml/schema/kml22gx.xsd", _m = { + fraction: "fraction", + pixels: "pixels", + insetPixels: "pixels" +}, gR = O( + oe, + { + ExtendedData: nI, + Region: rI, + MultiGeometry: R(eI, "geometry"), + LineString: R(Z_, "geometry"), + LinearRing: R(J_, "geometry"), + Point: R(tI, "geometry"), + Polygon: R(iI, "geometry"), + Style: R(dd), + StyleMap: jR, + address: R(U), + description: R(U), + name: R(U), + open: R(Cr), + phoneNumber: R(U), + styleUrl: R(X_), + visibility: R(Cr) + }, + O(Zn, { + MultiTrack: R(MR, "geometry"), + Track: R(W_, "geometry") + }) +), dR = O(oe, { + ExtendedData: nI, + Region: rI, + Link: aT, + address: R(U), + description: R(U), + name: R(U), + open: R(Cr), + phoneNumber: R(U), + visibility: R(Cr) +}), fR = O(oe, { + href: R(H_) +}), mR = O(oe, { + Altitude: R(Be), + Longitude: R(Be), + Latitude: R(Be), + Tilt: R(Be), + AltitudeMode: R(U), + Heading: R(Be), + Roll: R(Be) +}), Y_ = O(oe, { + LatLonAltBox: eT, + Lod: iT +}), ER = O(oe, ["Document", "Placemark"]), pR = O(oe, { + Document: D(fT), + Placemark: D(aI) +}); +let Ks, Ea = null; +function aG() { + return Ea; +} +let Nu, pa, _a, Ia, VA, HA = null; +function lG() { + return HA; +} +let ud, XA = null; +function AG() { + return XA; +} +let Ou, cr = null; +function cG() { + return cr; +} +let Gu = null; +function hG() { + return Gu; +} +let qA = null; +function uG() { + return qA; +} +function jA(n) { + return 32 / Math.min(n[0], n[1]); +} +function _R() { + Ks = [255, 255, 255, 1], Ea = new Mi({ + color: Ks + }), Nu = [20, 2], pa = "pixels", _a = "pixels", Ia = [64, 64], VA = "https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", HA = new Do({ + anchor: Nu, + anchorOrigin: "bottom-left", + anchorXUnits: pa, + anchorYUnits: _a, + crossOrigin: "anonymous", + rotation: 0, + scale: jA(Ia), + size: Ia, + src: VA + }), ud = "NO_IMAGE", XA = new Ii({ + color: Ks, + width: 1 + }), Ou = new Ii({ + color: [51, 51, 51, 1], + width: 2 + }), cr = new Xr({ + font: "bold 16px Helvetica", + fill: Ea, + stroke: Ou, + scale: 0.8 + }), Gu = new pt({ + fill: Ea, + image: HA, + text: cr, + stroke: XA, + zIndex: 0 + }), qA = [Gu]; +} +let Hl; +function IR(n) { + return n; +} +class gG extends Mo { + /** + * @param {Options} [options] Options. + */ + constructor(e) { + super(), e = e || {}, qA || _R(), this.dataProjection = q("EPSG:4326"), this.defaultStyle_ = e.defaultStyle ? e.defaultStyle : qA, this.extractStyles_ = e.extractStyles !== void 0 ? e.extractStyles : !0, this.writeStyles_ = e.writeStyles !== void 0 ? e.writeStyles : !0, this.sharedStyles_ = {}, this.showPointNames_ = e.showPointNames !== void 0 ? e.showPointNames : !0, this.crossOrigin_ = e.crossOrigin !== void 0 ? e.crossOrigin : "anonymous", this.iconUrlFunction_ = e.iconUrlFunction ? e.iconUrlFunction : IR, this.supportedMediaTypes = ["application/vnd.google-earth.kml+xml"]; + } + /** + * @param {Node} node Node. + * @param {Array<*>} objectStack Object stack. + * @private + * @return {Array|undefined} Features. + */ + readDocumentOrFolder_(e, t) { + const i = O(oe, { + Document: YA(this.readDocumentOrFolder_, this), + Folder: YA(this.readDocumentOrFolder_, this), + Placemark: re(this.readPlacemark_, this), + Style: this.readSharedStyle_.bind(this), + StyleMap: this.readSharedStyleMap_.bind(this) + }), r = k([], i, e, t, this); + if (r) + return r; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @private + * @return {Feature|undefined} Feature. + */ + readPlacemark_(e, t) { + const i = k( + { geometry: null }, + gR, + e, + t, + this + ); + if (!i) + return; + const r = new ve(), s = e.getAttribute("id"); + s !== null && r.setId(s); + const o = ( + /** @type {import("./Feature.js").ReadOptions} */ + t[0] + ), a = i.geometry; + if (a && je(a, !1, o), r.setGeometry(a), delete i.geometry, this.extractStyles_) { + const l = i.Style, A = i.styleUrl, c = yR( + l, + A, + this.defaultStyle_, + this.sharedStyles_, + this.showPointNames_ + ); + r.setStyle(c); + } + return delete i.Style, r.setProperties(i, !0), r; + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @private + */ + readSharedStyle_(e, t) { + const i = e.getAttribute("id"); + if (i !== null) { + const r = dd.call(this, e, t); + if (r) { + let s, o = e.baseURI; + (!o || o == "about:blank") && (o = window.location.href), o ? s = new URL("#" + i, o).href : s = "#" + i, this.sharedStyles_[s] = r; + } + } + } + /** + * @param {Element} node Node. + * @param {Array<*>} objectStack Object stack. + * @private + */ + readSharedStyleMap_(e, t) { + const i = e.getAttribute("id"); + if (i === null) + return; + const r = j_.call(this, e, t); + if (!r) + return; + let s, o = e.baseURI; + (!o || o == "about:blank") && (o = window.location.href), o ? s = new URL("#" + i, o).href : s = "#" + i, this.sharedStyles_[s] = r; + } + /** + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {import("../Feature.js").default} Feature. + * @override + */ + readFeatureFromNode(e, t) { + if (!oe.includes(e.namespaceURI)) + return null; + const i = this.readPlacemark_(e, [ + this.getReadOptions(e, t) + ]); + return i || null; + } + /** + * @protected + * @param {Element} node Node. + * @param {import("./Feature.js").ReadOptions} [options] Options. + * @return {Array} Features. + * @override + */ + readFeaturesFromNode(e, t) { + if (!oe.includes(e.namespaceURI)) + return []; + let i; + const r = e.localName; + if (r == "Document" || r == "Folder") + return i = this.readDocumentOrFolder_(e, [ + this.getReadOptions(e, t) + ]), i || []; + if (r == "Placemark") { + const s = this.readPlacemark_(e, [ + this.getReadOptions(e, t) + ]); + return s ? [s] : []; + } + if (r == "kml") { + i = []; + for (let s = e.firstElementChild; s; s = s.nextElementSibling) { + const o = this.readFeaturesFromNode(s, t); + o && Se(i, o); + } + return i; + } + return []; + } + /** + * Read the name of the KML. + * + * @param {Document|Element|string} source Source. + * @return {string|undefined} Name. + * @api + */ + readName(e) { + if (e) { + if (typeof e == "string") { + const t = Qi(e); + return this.readNameFromDocument(t); + } + return vi(e) ? this.readNameFromDocument( + /** @type {Document} */ + e + ) : this.readNameFromNode( + /** @type {Element} */ + e + ); + } + } + /** + * @param {Document} doc Document. + * @return {string|undefined} Name. + */ + readNameFromDocument(e) { + for (let t = ( + /** @type {Node} */ + e.firstChild + ); t; t = t.nextSibling) + if (t.nodeType == Node.ELEMENT_NODE) { + const i = this.readNameFromNode( + /** @type {Element} */ + t + ); + if (i) + return i; + } + } + /** + * @param {Element} node Node. + * @return {string|undefined} Name. + */ + readNameFromNode(e) { + for (let t = e.firstElementChild; t; t = t.nextElementSibling) + if (oe.includes(t.namespaceURI) && t.localName == "name") + return U(t); + for (let t = e.firstElementChild; t; t = t.nextElementSibling) { + const i = t.localName; + if (oe.includes(t.namespaceURI) && (i == "Document" || i == "Folder" || i == "Placemark" || i == "kml")) { + const r = this.readNameFromNode(t); + if (r) + return r; + } + } + } + /** + * Read the network links of the KML. + * + * @param {Document|Element|string} source Source. + * @return {Array} Network links. + * @api + */ + readNetworkLinks(e) { + const t = []; + if (typeof e == "string") { + const i = Qi(e); + Se(t, this.readNetworkLinksFromDocument(i)); + } else vi(e) ? Se( + t, + this.readNetworkLinksFromDocument( + /** @type {Document} */ + e + ) + ) : Se( + t, + this.readNetworkLinksFromNode( + /** @type {Element} */ + e + ) + ); + return t; + } + /** + * @param {Document} doc Document. + * @return {Array} Network links. + */ + readNetworkLinksFromDocument(e) { + const t = []; + for (let i = ( + /** @type {Node} */ + e.firstChild + ); i; i = i.nextSibling) + i.nodeType == Node.ELEMENT_NODE && Se( + t, + this.readNetworkLinksFromNode( + /** @type {Element} */ + i + ) + ); + return t; + } + /** + * @param {Element} node Node. + * @return {Array} Network links. + */ + readNetworkLinksFromNode(e) { + const t = []; + for (let i = e.firstElementChild; i; i = i.nextElementSibling) + if (oe.includes(i.namespaceURI) && i.localName == "NetworkLink") { + const r = k({}, dR, i, []); + t.push(r); + } + for (let i = e.firstElementChild; i; i = i.nextElementSibling) { + const r = i.localName; + oe.includes(i.namespaceURI) && (r == "Document" || r == "Folder" || r == "kml") && Se(t, this.readNetworkLinksFromNode(i)); + } + return t; + } + /** + * Read the regions of the KML. + * + * @param {Document|Element|string} source Source. + * @return {Array} Regions. + * @api + */ + readRegion(e) { + const t = []; + if (typeof e == "string") { + const i = Qi(e); + Se(t, this.readRegionFromDocument(i)); + } else vi(e) ? Se( + t, + this.readRegionFromDocument( + /** @type {Document} */ + e + ) + ) : Se(t, this.readRegionFromNode( + /** @type {Element} */ + e + )); + return t; + } + /** + * @param {Document} doc Document. + * @return {Array} Region. + */ + readRegionFromDocument(e) { + const t = []; + for (let i = ( + /** @type {Node} */ + e.firstChild + ); i; i = i.nextSibling) + i.nodeType == Node.ELEMENT_NODE && Se(t, this.readRegionFromNode( + /** @type {Element} */ + i + )); + return t; + } + /** + * @param {Element} node Node. + * @return {Array} Region. + * @api + */ + readRegionFromNode(e) { + const t = []; + for (let i = e.firstElementChild; i; i = i.nextElementSibling) + if (oe.includes(i.namespaceURI) && i.localName == "Region") { + const r = k({}, Y_, i, []); + t.push(r); + } + for (let i = e.firstElementChild; i; i = i.nextElementSibling) { + const r = i.localName; + oe.includes(i.namespaceURI) && (r == "Document" || r == "Folder" || r == "kml") && Se(t, this.readRegionFromNode(i)); + } + return t; + } + /** + * @typedef {Object} KMLCamera Specifies the observer's viewpoint and associated view parameters. + * @property {number} [Latitude] Latitude of the camera. + * @property {number} [Longitude] Longitude of the camera. + * @property {number} [Altitude] Altitude of the camera. + * @property {string} [AltitudeMode] Floor-related altitude mode. + * @property {number} [Heading] Horizontal camera rotation. + * @property {number} [Tilt] Lateral camera rotation. + * @property {number} [Roll] Vertical camera rotation. + */ + /** + * Read the cameras of the KML. + * + * @param {Document|Element|string} source Source. + * @return {Array} Cameras. + * @api + */ + readCamera(e) { + const t = []; + if (typeof e == "string") { + const i = Qi(e); + Se(t, this.readCameraFromDocument(i)); + } else vi(e) ? Se( + t, + this.readCameraFromDocument( + /** @type {Document} */ + e + ) + ) : Se(t, this.readCameraFromNode( + /** @type {Element} */ + e + )); + return t; + } + /** + * @param {Document} doc Document. + * @return {Array} Cameras. + */ + readCameraFromDocument(e) { + const t = []; + for (let i = ( + /** @type {Node} */ + e.firstChild + ); i; i = i.nextSibling) + i.nodeType === Node.ELEMENT_NODE && Se(t, this.readCameraFromNode( + /** @type {Element} */ + i + )); + return t; + } + /** + * @param {Element} node Node. + * @return {Array} Cameras. + * @api + */ + readCameraFromNode(e) { + const t = []; + for (let i = e.firstElementChild; i; i = i.nextElementSibling) + if (oe.includes(i.namespaceURI) && i.localName === "Camera") { + const r = k({}, mR, i, []); + t.push(r); + } + for (let i = e.firstElementChild; i; i = i.nextElementSibling) { + const r = i.localName; + oe.includes(i.namespaceURI) && (r === "Document" || r === "Folder" || r === "Placemark" || r === "kml") && Se(t, this.readCameraFromNode(i)); + } + return t; + } + /** + * Encode an array of features in the KML format as an XML node. GeometryCollections, + * MultiPoints, MultiLineStrings, and MultiPolygons are output as MultiGeometries. + * + * @param {Array} features Features. + * @param {import("./Feature.js").WriteOptions} [options] Options. + * @return {Node} Node. + * @api + * @override + */ + writeFeaturesNode(e, t) { + t = this.adaptOptions(t); + const i = fe(oe[4], "kml"), r = "http://www.w3.org/2000/xmlns/"; + i.setAttributeNS(r, "xmlns:gx", Zn[0]), i.setAttributeNS(r, "xmlns:xsi", Kr), i.setAttributeNS( + Kr, + "xsi:schemaLocation", + uR + ); + const s = { + node: i + }, o = {}; + e.length > 1 ? o.Document = e : e.length == 1 && (o.Placemark = e[0]); + const a = ER[i.namespaceURI], l = Ai(o, a); + return Ee( + s, + pR, + Lt, + l, + [t], + a, + this + ), i; + } +} +function CR(n, e) { + const t = [0, 0]; + let i = "start"; + const r = n.getImage(); + if (r) { + const a = r.getSize(); + if (a && a.length == 2) { + const l = r.getScaleArray(), A = r.getAnchor(); + t[0] = l[0] * (a[0] - A[0]), t[1] = l[1] * (a[1] / 2 - A[1]), i = "left"; + } + } + let s = n.getText(); + return s ? (s = s.clone(), s.setFont(s.getFont() || cr.getFont()), s.setScale(s.getScale() || cr.getScale()), s.setFill(s.getFill() || cr.getFill()), s.setStroke(s.getStroke() || Ou)) : s = cr.clone(), s.setText(e), s.setOffsetX(t[0]), s.setOffsetY(t[1]), s.setTextAlign(i), new pt({ + image: r, + text: s + }); +} +function yR(n, e, t, i, r) { + return ( + /** + * @param {Feature} feature feature. + * @param {number} resolution Resolution. + * @return {Array + + + + + +
    Generated by GDAL2Tiles, Copyright © 2008 Klokan Petr Pridal, GDAL & OSGeo GSoC + +
    +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-03-20_render/leaflet.html b/public/datasource-data/superres_s3_2024-03-20_render/leaflet.html new file mode 100644 index 0000000..e058e62 --- /dev/null +++ b/public/datasource-data/superres_s3_2024-03-20_render/leaflet.html @@ -0,0 +1,107 @@ + + + + + + input.vrt + + + + + + + + + + +
    + + + + + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-03-20_render/openlayers.html b/public/datasource-data/superres_s3_2024-03-20_render/openlayers.html new file mode 100644 index 0000000..cf8299c --- /dev/null +++ b/public/datasource-data/superres_s3_2024-03-20_render/openlayers.html @@ -0,0 +1,99 @@ + + + + input.vrt + + + + + + + + + +
    Generated by GDAL2Tiles    
    +
    +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-03-20_render/tilemapresource.xml b/public/datasource-data/superres_s3_2024-03-20_render/tilemapresource.xml new file mode 100644 index 0000000..7b9bdaf --- /dev/null +++ b/public/datasource-data/superres_s3_2024-03-20_render/tilemapresource.xml @@ -0,0 +1,15 @@ + + + input.vrt + + EPSG:3857 + + + + + + + + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-06-08_render/10/537/671.jpg b/public/datasource-data/superres_s3_2024-06-08_render/10/537/671.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e7d64ed6f98656571d3c54e139c81eba52adfb0 GIT binary patch literal 4155 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 nX;Y5(K8bzRo2Av8?m% literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/10/538/671.jpg b/public/datasource-data/superres_s3_2024-06-08_render/10/538/671.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7d6f416e2423cab48ca1fd06dea325fde3711b2 GIT binary patch literal 9049 zcmc(EWl$VUv+m+)!i*zs|4IGe2f(rn{e-n(2OK=JChlPXMu+lByB_1qA>=c`AU%C4d3|4HfmD z`XuO26$2Xs105X$7Yhp$8y^=R9}gD~kAUzQF##b7As!wv1u+RJ896yQJ`p7q1sT;d zGIFwijG&-B>7ZlaU|`^o5#SM!{g36b3qXSX4<gr)L&cA5*5EjL|%~LBaTceE~3^jA3A*U_XsY zkpNIpP|+|jQL)jn{u|6wmjwM8BL*g^fIO3VXhHY7dp;I9g^+@lP953g#woMlYm2a? zv&TgMKH3v55;PKkEMQifi2*w*goz0d6@~i0)g;JPzqGos82V^QKUS2tItzLP{A?Y% zwDfiOz9YuJosH6sDCu|v)S70-iuOm#BnPle3hAedY?}6d?Yk|Hsq7_5t+L|tgy4lR zT^k!5#24SzYm{rBERaH_O~k zvedUd8UMO0~QQ#+4|EjKF-mZ+t;wN&1|Kj*?;q1Q)Bih5~=Gv})aw)|@4e z=#-c-9oYrFwpOpZKO7t(0y1H?XD*BJ=rPu)Qmm%S+p@A9X;!mU0i*Fs&t2l;u?qSJ zI3*xs8~*dh zRY!Ub*AD-|d~5FFhwS#YHE5Fbi^_xrcc$}oJeqlc#@LT4YX^vJ8_D3$?AV&jicuDF5S%~8*J2+Zd`|iXI7aJ#Wz#P zbR6VSGI|!7t%YI#`Uy`?@^4bri*-%%(3l*<%yvtN4Saj!vV{fb&@buU&$~upd^CXoP95GNzEmP!Pw7>S7ptGYO zsL3HZqA9&Y(0nmC{mm@3qNtM}nfu%4k|Bx2i#hY-YdI1U!0Xp2B*f_dG*Mbn47h6( z_i~I@kHz%2JhPu8Y!I|`>3AR77W8b=mD4MpYtDGC<6{{YnLYwM2Ack|j9Qn6hG8jI zHdW(8M|^)9>*tE`SOi6f_iEHQd}1l$pbL zq%qFdlEdOX$LeK{qO~{K58IGpl zT)N;Z!=x8J+^>J8;FY*C_MirjDbo>Eu~UhzH`0N49iXjGKrOrDS_qPA{0Lc`X`^|s z50L^ilTq?4OwVBR^;@gf(qe)W%8@E_6H<75#Ytb10?H4m zJITw+u7;6q-9BmTpBT~JdkkdgTOkU=kw~F$CS@k2!$A@TRhTl;HN{Z%*XHAnv01A) z;EU4q{K}e$_0>s8?w=2$x(aGn$~r=;G`yB6N7o2GyfZ`{)?9Nz!8_hqhZh5P6>Jjb z&wieQAOoTJ37DeEK?$5(FLogJn5yq6<(hWfPE}93uvRrF0MiRwROeTsH|5t8OGw?P@ZxMJaYemmDHFi47R5+1vhb#0YdJIl zUoq=xTx)=B*6e;Yo$Oh>s-t${9i7+i(a1TUQAzHua4f6@=&79*ElcdAy6IVvC-vV* zewbParR914oX%~)mP(4!B|4#LK6O`%l)3g~I&u?-L{5Bcm$G>V z8tUWZdnimffKF>ytnYh*u4Ch+C4>Hc#AV|6GyETPXwk(DR!Td7KPAtiWrwB^F?NR~ zD*`L87Xd@xte-`M?O>h+cy!Q{*zf!QEpgzo|Z?3g%{c{M< zEhTxeiJ~FBg}HZ%eKEFbu12lJ}Aw}5dc00r zao2mZc1u2D{%8Tk*L1Ysr#CS_XC76Q^n`^^eDaL*G@I;#oL-Adf$lp2xQ(awDpld< zLSXZi(n+h8!$ls&Y&^GCg+w@qo) z@P?iBZfB`2Rf3z?PJNxE1`oKq&zuc3Fp>$RGZ&d9$5Jme!&o$N4X?Sb8L(lu%K`6h zy8EOU-Om<-V1kxhGUe=DfR!b*Sl%$&#W{jj+#f@2rTykR z4t5?aQ`)@?eo3|*{}yk41Wc!je+NO+^D(1hJlwzko5qVBykz=T6?Ae{q1-3^S~aZ> z6U)y8#8@kpR5EByZo(aAOYsc~;9bg1;~Ln8JM5>)j3+{AR>Y)ST4_1OQjdc~!n!y> zYWH!H?`F3Ll>PFw}viP-}9bE2OMt?ttA5^G{|nqTw|d8fr!uHIMhQI;Tj zE2xa{!eukWNz8nWcE>>A-Npl@Mh{+VJsOQ_S2#$x%6$cPyN1zAmN_BN8aCIoC`VgU z_oq7JEQ9}6sZlxqct#x(tf)N_)m)H!Oys!;46x^#r3^?dQx`eP*JEaWkpvK4Zas0t zAf0tO6RCsKzrTb@i3O#|XQ*8(4T_6AEc&pu$fU&6QCv5SD&U*i{8-)JHsX2nl{)N8 zrr*>EWB3$Sc3L7pDlpxebPdD|NNgK)KK9W9qYvPUJ{X9%t}HK`7;9F>3BME%;o0s@ zvX1AWjR$FrIP?WuWr5wczuHphNqr#xfmcRDM=FtdlGxVn;e$1+VUcpNaoL}xJU45L z>~rqAe5>mf7AH_&8=bY(R<(>_?3~i6Hk@su%D!G)z@!5#b_ZsYx+Yl5g5q`N%~>-m zt+bW+EQdNb6X5kblI3(Ow>DiqbmbOl`d{~$Q;JN9 z8`lun#5ag?%3gas0^$%Z-TJATL^`oSti3G!;}6z%uVY>-@{9BTUpDaH!~l4Z%=Y%n z0pmEd(xj}?C&sE$GEeQcbl@svk7h~wSouNUQQZ9&Srhz|U0R2^-w=O&RubCO<>%YE z`1O5kis2aQ>waanf8*JvyJLz z(Gpri6KTL)f0A?w)t!pMPOy+}UfLkn5DHb)iGoF2ir6=R`MTdG^^y|=AePS$3gFZJRS@2ImiLsO_V`|)ku8zu1HpaVHshD_19@+^JYl{m;u1GXRpyPq2s7{0 zCPXg<8fKC~4QgW`E_Tb(9%8hrH{B#)xRypNIuYHx5%pxGhf@Os3=O8Y^cA^nYdmNq z99s9ez{7d0qQm2aJsf#x>NF6)3v%+Pb*&NBw65*Jj+OGhiiJ$S+xw}#AE%wHBamnAx$OU?Hnd8AWnJgaD?(=krWHhhPB%^+aq8D!qcI$)yLBf?OFXuPe@mGwVxxVrNsyo+IIrgi!Vp0^W`x z>iCoQbt+q5CN)(}@FSE(ijUl#<0I};ttR9RW-jFUbS~5hW=#mVVboD>UIF$DVN$0Z zZn26(>wDr~FT{Tt#w3f#+3lL{m9j`<)rJ-Y41eh3FE3|(#cF0Zi`p|6nRR?w(>)dk)BA8o#S7Q|*2DH-J_Uyq5xO%NpX&D0xa5IKHJg__v1f<`e(KOLA5AovmI&?68rbwk7Ffs3gX)7aM0`^m0kJ>=g;aev z)qy_Yq|P~9eHpPjKhHan_Ub`Y%tJA{eDiIa=(!}!-FGUGLBrzq}l)UhU5;OV(oJRn7OLE1>$Dns+JK*?4ljtlxA3Z82&?DsE zY4~NB+x1t7BOZ#Uxiu%Zec+mr(%K8^Ma;=sK}vC9Z)7TrLZTMR!s3L@wR6K8X;a0% zdXO}oCLCuNHn3hYoZK%at}MU(eXR%WpljWDt3-BT#bP;HO(YY=XZP z7q09mL~GH?BI5p=*=|N0?F5`mA3bx7@RAc$l9+p0aL*?{qdkZ}P7sHgd$|BJPA<7HaP?Nl2rhK!G{nAOGPz(28CB;eNtM+l-tHGnq`Os@oteq?hkYa<KKy5FlC6?V*aTAk2;|A7vmJx@ky#Z|0v|Ah*0|>QVZkSB!NSw@j|j?g9tA0= zJ&U7z*hkqa4goc`5Go+nXg~LsZ648RJ2jHFA(^;{S3WRq5l}H=aSrMh6UA!XvM-c< zui;7QxWk+*k94exLL79W2!v z*9T%Ip_1-WZ)aYz9&_^q>s9Hc7xS?}YH01uAIFI5S7|ZS-a|Nq3 z+NX3y9^e+&)G+&nd&C&hA&r~1yO~qd_B(QqtEAWPea(yM=8S2Ba)P+4?;R;(vGSp> zs{~^s_GpePb1cb9Mwvb>{1k{9BHRb~)enX}EsNpD4G9j}^R!|mM&YLM?_=(bp3bmg zcm=7YIh;eG&?%nT`!-xk1}%z3CaE^)Ehv?^o6~_YO|_A#R~2o=IxR;P-&PY5<%#*W zu+nM53NE}qw*=`|lA{e(2Il9ae_H`L&DHTVulX56#|2_eSOa`m3To@Zxi0N$agO-8C3x zT3lWvjI3PkRFD@^?UnJ`C3xIr@au@i!sVLuHtF9w#DinnkJ`8ej2A3qTkz+QDH?9< z%_Zc_s$cMzgM@6zO}PBuvti425(j9_%D(%`pJGmjScmziq^m`u3DfwGo%nr)%Ij^s z7HOM_R=Q*r9L0=I>`pK6W9uiGEXAvLu;Q2FfQ|X>hji3o=>38IZLY*(!E?d;c&o9b z+w9(IKV3SSj782N20UTBhjMs9&InE2_);ygyp)egrUN)Xt2jPxu#5G&ldE59Of^&b z1wJ=|Ex5BTFq-PS@jOuo=RhA?xNe`wxa3&WO+_`Iu(Z!xkC25t+26slCZfA2*ltp&v>oryw=5UX0 zi_jz{d{J$g?L1bg56)w!N1qyO$UCdNt>BU}=kEJe=$MO`6mR={7QkmebA+HXuhRfW z&G=KD;C|5-7-boBlo;O(RJQhqWn07;(pXL{?bF3zI&lgJfA~yz)kcX-F3(R~Parv* ze%|in#7+LEiA%^9qLmFvxf$nCmti&pehd+J!Z@xR^|s5!;D^5&Y$b*|1@{{sx?08i z=n`XGq78?S^8_Q=2wqeZN}?>)e=8-+Qu$$y7!cHY^9vZ2R6{iDXdm$2VNTyuZ0u&| z&gl_Q>9GL9&=Q7OX8VADq*fXKbj=p1_rCXjf0in?vhw07lWwi4BsKD{J@+U67F9Ax z_8$-6d$LqvnELik_^7?-uXbUXu*6*a$&xYWW^Jlvg&VC=w;uorU2;i;rMvyC4Sdai zLwgF8yy!88U2*Z+MJn$RSoI0fl) zp5Tlm4Q(Pzz}!A!IB_e3-;c}`m!Al1DN4Cxs_YL+nmOAQNoEn1!^(;+@!gv(z-^N%?7|Cwxe) zkoOZ~nI|CJr2b;xhW&JQyT;=K-$oN*UyhZJwgk!-&DFvC*&%XW(iw?V-MR)%>P5cc zs9pr{<2+_v=y+m~0kP9Y>xOv6-o6!|8DZOxFvVuwrp#SK1i5xl>i2@tQ+Yb>tAX!p z>ozMIH6<|aUP$jd^);{$E%;zmh$su_uGEk);Y5K)J=g~+Qs-Xcv( ztbo|?Y5A-Sj!iEO#~gxQY=(z>40jG5EqJ~b#LZ=!b1cPU(gru zkJI+ZBY@gH_Tnh{-Cx1xw%BfkjEYr9YM>Sao!zq16{KW5De59vyvqe>BBl5+CE-Q8 zl)9q0+@V50g<*WjU+1Woef64?iKDH*=igtYw_1JfO6uCCyV2<2<@l7>3$TL7J;NccK=`lVf96=qF()uDE#hXj)lzL7=C`5u0~H zxt`bPOt+=`E*XoSK=T(Q>I&O|!{TbW9q4&W23af!tQQ-X%)D=J?W}anv~gEvJF8lt zva+xEu)mcdFg|DOq|7bI0pqTEnC1(q=2(+wIN&hy}+kEr!l23fgWesT-J#~mZ5P^cN7s_JQ zd!AWBfuZ1%o^)CZG8)r&p)f9wncq}}6-z=)82L!TtKTaI)axYHLXdg;^K|EcTLili ziDQfBu}eTgSYt)Sf&Bq%mNfrm#@%n$L>H7zyc+VI!WYCYE!LO3YIe@rgOn?M=eip9 zl~Cc@-SDZ_*5YFBY1*!=#R*jaNtK2%`0wAe6 zC9{edTbi&wBO2}3e+!L#1pi)i>t9JFv?WpWtf1UxGx{*BIR?epX+KAMk2#Nr3J#!; z3GdtGJa{*?E0Sa!k>twP@h&EQES!CM%wsLs{K}@qSV<0)yKBJixZd|mP`jzCanBRy zXZTu_HFewWi@hUe%=u%#U-jW#wOKi=N#j+7v6bqDu52ziclv6>v-3jEbYum~rlk^+ zze%O*bGMaT9pfvTd~!x|v(M^}avV$9e$8+>>L#_FMf%0Lh`QS~T|-L8Hx?%7&~ESl z36)vL(_j9%-Dbbv^7n0{s zj&^|jb3PNK=J2vu&UBv@4sCnivYh!)(4?xX+jf0N|C$O6D`~cQIl=gK%kV}`3G3C= zO~Amha(Cd~lL~K;8p5SsZP}HtErF*ab1kxT@W(A5teP{KA-XH=SblMMVvq@5l2%nq z%yQuxOn4wioq%|UOhD+4Ky};Z&hOI8PKYoKQ~5sCAqVgDq;5SU|6GZ!Su=ot*d~L96cF|pq=cX%y4!v&wRmU0jy?#O zdGpFDg|t+Y1`ng~!FHyk;m_c9#~pj8(a5o}(J$AoivVD=*T=|?cBRSoljGHW{~hU2+%A~Az5=lnq!iY7r7S(jP1C*|L7$v2j2*e-HSW|wjNj)_$w_`_`e~jx{hSi zj#V)nmZWkGC+OIc-$^{tD^kPzoxpkWj)issr)$yDY!ReUdi3*Ef^{Qz9ksMKRbPEN Tj+Q$aqGEj&!u}nH9vA)#7)9lT literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/11/1075/1342.jpg b/public/datasource-data/superres_s3_2024-06-08_render/11/1075/1342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2519b10d8818d15b3f00185d559054c0c3ba9db4 GIT binary patch literal 5889 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/11/1075/1343.jpg b/public/datasource-data/superres_s3_2024-06-08_render/11/1075/1343.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98e620a467c787576ffa06ac6ab050751de23bd4 GIT binary patch literal 4962 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

    Bi6vQN?B>zB= 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/11/1077/1342.jpg b/public/datasource-data/superres_s3_2024-06-08_render/11/1077/1342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72132e4ea60c8250045146a0555f5258aa7bc56a GIT binary patch literal 2353 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2151/2684.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2151/2684.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12b9943cebd9b97de3e28ab8bad8456b8d0528ac GIT binary patch literal 7370 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 sZ0AvsSb-cK-y;Ge($zkvWk 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2151/2686.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2151/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe25ff6c23183926795ae21de2c300c32cab5015 GIT binary patch literal 9134 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 O8-(cpzeDNY+W!DZXyDrb literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2152/2685.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2152/2685.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13d44c5bca9c92b3c942956c5c77ba10d9f6a9c6 GIT binary patch literal 9549 zcmb7o^;Z;L(Eh>#OP4HNvP*X?A&o4sbS(|i-5{+r=+YsvB3(-g2vRDDG)s3&3JOXK zD7=2o`+om`?=$nmJ!kGbGk4Ct_sp65#rsVFrKTD}4S<6K0O0%+!2Jr~F#w2*`=9;; z-ao}B#K*_O!zTuT2nb1uNl8hFNl3`ZsVT|GsmMu4C}}CF9?*cnU{VS?dRiKKY8o)j zeeY?*UK|{+AOFhXa61g#)C*x&H!S0RV7;IR63ge*og) z;uGM20E9&U%rHs-?!U-5csT!MkN@APaDf0kDtzjPqRIphI1KD){Gvf(8MF`;u(%-| zl+(T>=ARog&i}FgKT^Oy4qSWy0f_LQm5U01`@i@X`G0rd;8Fn}Qj6j#Kj6SOpb@k4 zi@sk5kOKeFPywj`ih#?n0Ro92dN86|b8qu&WPcd`$K>c#d$x`;g;;Nbqoh0jvqQ8^ z+EmkN3218Hwd1946<5`dV-V_`?Z&HJzmgN!+fNkeTBu^eu6|^6TDmcs_U%N`5;JDY z4G1=u5Njitd1u-c)~FsEmhke?cW`dov|tjmO8ZT}Oq$sCRM&QBlUYuhEcYr-P&#k= z$IoQ3o#*C(gjPHnbOFzKEH>`@|sR+fb0*`kIP&jiT7MwCHHHrO>|K16LH}A!fZ=Ndlk<3G)N~_oePIfz^ zSgO>I=iqjRG~6yW7(KDF5Q$!QyQJ2rw$XuVju221uP(W!6EW&U75p_gJ`WFyUsly` zuZ^g=A^TI!i)1AWfDHQ{(LZcKXbB;%Xkt7je+CZa1dGNmQ_PuKFRqLk(=S~0%QGjP z`}7Sb)ze=$D#ATQ{uQojwfv08QIR>co;kyU(k=(~hZzZ-pH%zFC=3pqp-rb+A*Q*Tl^5H!`z+JT;y52IOzo)O!^q?Yq` zpq@w+l``y^zlbt(1zu0{co&6q!_J0d#B|P*IsN4@Y3Lx*v^LT<#ZusCs-B?4>8)ds zhg7|r|E-5u6Dhg-iQC)X7TH(0U-pFTGjnYr7;R?zK z+9GzCn>L>r5q)I9pT}w`7ZmqtJpx( zWL0fruanzVkI;;fZ=@@ikWAFiHw#ZGT0?$LdHn_g?ghr+Kx%N_yn5-caZ|e{IZhBU zL;%XtUN>9mjHQmE2m$LNL?d(fkm|?&Dakl%&yJ$n?Vb>6$W2KRFf{T-KwN=eC>==` zdOx&&&w@)k|LxWYuwm(R%fnRR7C!q29!hFNpdd$;Y|EuzV`=#qNNkD$k`^|Z+x#pIGI+=lR2`l%V zy!{lWk^Fd`Q;~K5=ii%^ER-Hcs6UkuA_Qez8L>xCkXV2!o9e}M(h5I;Lj^{eEt7(` zS}vuCub7ku_@v(JdaH)FPaxHq>}LkY)lloFJhQxZMeAMF*2;n%hKt*E^E#FJ-oHkI zp3S{_rzPPpUhtNgxHjIi>~rbtYjLT5Z~IyE5oIM{c@V1-UVP-PLD8n_LVY6e#lXe|MYzD#cH+mDSz#$~*HR zT?bQ;JI0gLp;N50yZTneC3dKaY-`O@wNTwYsqx^zdq7E~eyhey7z|RP(yp&nd*|+} zLu;hYG#Ib=aI4mUmG)s%@^8$$21jz~3Dk|VIU%u<4~!pPik`F#UPhe3ovGdiNz+u1 z0BVAr3lkQ#YZ|H)pOV&LymBOiaYNn%Z)ZFtVsQxjIlY{J9V2Co=6SzFZ);OctPxFS zx38zI)uYhoJRyPJ?Pc)~Bip($zvfjP{EAnFDBpTlSLjkO&su9mNusy2*7DcPwdgC?f$C4`yl8euG{>y5 z3ti$h0TW!cg{z|wxro9h-M5xNE=#!!_{=@vD2KmSVr_crT@l!|R8LQ1I^R5xwyv_w zdH&IALDqGnp+}q*g#tg>A)M=qGjt-*Gr;Rd@Bo%q2SbzDOLGrcr%-UGmBje?N7FN- z1J#bp!R+=q&8-d#U+3=&YZ7 zcJ1Y<`L63erU8F3#erdB&c#Qd5Uf&zkl#e!jzN{8{fb~R4|#p!Jd3c@!l;ru|KHOn z@uFIncr^mkSmou$tW3rsdjHIXHrH^yh4!6&wjVbZ(HDm&^K1jT%A0WgK@u8UD_DQk z5zQCxT-6wq@AzzHZ6j^(0pNLh*m!o<974-czB=s>&K<9g%DN0kFMQ?JNMMtc*yJF; z1R@PaAPM46bw?^^jsorhP89b5EV+)*QZDP4hWXhMR1Uv_M;!9x*vSrmWMFG?FI#g6m$~0pzu)SsGxq`0Qn;+;F zD-Cd>)hrCxj8Yn403q}2%JX+)(fm$(su4oJX+-2Xi|XJLWvs(+epOnHowG3CKL2ih zU>Vq~F@kIva5q^l$YAMezp1kFGWa0i)em)binfk*$Urh;OOMq(BVl%|WmHOIi~Yuj z!3Ta^>x0oqR1gJqW_owJz>A1++v>hGovq9m7=Ronk)R*v zg}R{r($08LzZ(o-DLd0$dF)f`G?Msq$K;V|jw&gAPJLs!KwQxJdDJn4s}a_37BOj7 zG8{y_t?M^r^&Fp8P(BlzKfw6T072SA`N7Yq5Sk-aCsM92)1tVat34tgC$=mdK`W00 z9gK9TC{6qcusEor#rG;==Zm?--8dE|txRE{uq(Pj4%0*$rt+Ti6kfp-=j@(p2u~?7nXR_T*C8YA%8sU5Jp3L zA0p?5_TjI$Gf*daTfDr>etN&}0ds{}CnG0sv#b$PUwDUZ%YCHkRNH@FW6e^Af*%z1 zLmI3Sqtk_?D;L5f?fzzJ^tk8pOY9o7Pt4&!R>u9^rJ|ta4h%5b=vPv_LlUPJ@{9;* z5>x0`v>4R3PL9}m&gL5pe$*dBDz$*ZNLa}fM~bzLT~Ytzn;*>I8NEQ$=iD8+YmPh# z4c^C_GsVlXJ0O55EYbj8WqA}w{+6HTCcisRTvB-lMXVeCj7Uu!dzlNDs`cUQDhf~- ze*{Yn!cS^(B^FpE)nq$KpIA`N>LIo(nB53w7+AG4()qp0tiLq9 zA_WX0eW2SGWbmcsNXO@XI0m2x$Vw6t?P1^6v)~H zbheg=;Ak?NU|T)kMPG%r-#W{q)*Qj(3mx!vlgbdYdtH#qhyKgiOg@=OgKG7^2b6^T zNeQ#1U6$%}A|;8Pqgk}Ej2Vkjy$1|bZ+41I{PZ_tKC`I)s}AmOPA@tp7lprSNI2#F zjImHGEjbOVPB+`@N)9kI!SnUN7QOEL7WEjt`=xNzajJbl4`65{^Qs5PQF1_=w)BHE zi$Mdbzs$vboaZR}yteEx@iEbY60YO+P=zpu5b-wp*++8BPCIZt7GFglzd2o2c|v%ixdwsW}d7kql4wPCmG5yVbWbIAbHFw~}5 z`-8OkP`@?cgp$LpOk$q)DKlgZa)D;+jV}Kny%OpYG2W_aTTLVxU!M9d_3)<)H*qjy zV{~7eju-sfRr}s7xU5t673XXof6tG(#5QUZ=#fVEv-!puw11NCs^fg{-1MNA+>0n+ z5e=t;VF@gMcVsiUVs~cUTGX3P4ybKD$oP?d(jjpbP(Um|*_0Qzmv`>=s78G`4!?qo z8dr3kFK6%bo;tTT;R$N7Tx^&gnI<61QM+5vE2?Hx)MCJ3U=?aHEjo43LXx0!yIpyyD4D14A(h| zH8PxoonL7-LmS_Gk;B0PzUqRW^F+~E752m9w{rg|@ckU;Q)W=xw!V5+5<4-6-|)H& zbp(0!)<_d*AD`6~i;gSr+PruoeCr(VpeYf98D0)?*h4|A%S9O~K1`0$lXo=?GG{gM z7Z@*@vi+f(MQ9;J2k;%Bvyx52P}IVDKI^*cl7fvQEIU>OZC>zcP@Xv62CK(}O4@-4 zOmszVpvX%?HcGPm_qW_fyoAggz4{(T%&C<#EoFx+yJl2k>7|Ej6lKG5WVk=(VU~l@ zHCp-gv%H|IdfIxNEaU9RONsuXs%gJt4JkGLrwC}>4UPW*rB%W+`9lW}B67qszj)mt zx6$lQM5g#&Q8$X;jgbcj@OMs2rKyYgPi<*tM8;wXK6i%DKuK$mDtDO);rbF0BjEWr z$rc6&Cbb~c^M%c4!!)+U2_xfrOXsFiwAH^i(PmX2gNFc$&UKDxsVK>H9h22l*`6D) zF}dtBW>q+;(pJlQdGbgBd5Vo1j*`qDRNaEJ+0jcN)WBhJT~LSNRa+>BlL1z9NWQ?y zQTF8x#$qCUOs>HG&HI^kH#PMy*9yD|_W_ke=h z-n}Fm90Id5P0k+%*JWz=01R`W$1qnKwmCWXcZ?=dgQGJgU8xwsIxUy6RjE67gVo8f zP;e&OaHz5IkMhc%Xcplt>#E=QP>OBN(=wcDoJb=1E9cBprY_wfxhx}1K~L`cWkGW<(~ zkD7G92U$jkI!ZjV54XDNuF&060gv2Y8pi9t!gR8m$WoWtc*9xq{dGnrtWS!dx)qPD zBqJ7gR}YLyya~qKhF7q^-!weC2WZ1&G3M{>f(nuuIZ`MbPUT$PblCEbV@7M6M|qIz z{&1_q<%-sds)M5)1|Vn6#%$3Hf32W}+U2n9#F^^r8|z@s1Z{el16fnMMOl@EWxv(WM~r0-|#1O<=4PcyaOHf)o#S?p`PKX3*Km8W@2&X7Q#Xip_( zy*w1Co$hUwh4zw$zycjpl&o-hWqtH)Xk?xo$sti;&v$3IyPqK)XP(6lOG|mZw9;%& zCjhY6XMWHJD5yu90M*bkpAo&kTyqr)^JjRj8+3#nF`orJE7YLW-ALVcHTtX*8Kz!U zqfD>(f}i&D)*L*zRju(Z?XP7T1PZ9 z^u!|w`4hN*TAPeqUSatNrqsMXiG4`HjlP~pm+}hhb@YtWzs-yUt*NKC5gyHvrWj!? zkW|ad#>IrlHo0u-X9yKhq|pGQJd zT2Uk0D^K#z%vZWX>vsEgo_oxHnhN$_`Oqz?P?M#9j=br(DqT-3L%kCltR+hv8~E7v ze9_E*F4P`u3zC~7ZKhU`I7%LSTRpB5>iWo~F91HmS+EERR*UZaaSy=#*R=W0Q6IgR zE|nB2o)!?;S$hS<&3~n&oN$~uy`x{>Z3M@w1MAUfoD0H?6xgH0hbn$x^eFa9Z&OG0-;GPp3^0D2@azNekB-!N>-KN6P%msh!B2n7jtM3m zac6&%sqJO#+aiPf)#HbqJzVKN?8*U;29Zy6IBBn@tFck;BgMV);x^a(KcL;EfXpGGc;lOGMm<7lYdt|HN{T= zsnjCYgMra=U@!7MzcvEvCe6A~w!rQM+&!a#IU4MCX*E(tF_4L$pwKSkSE=yg=koew zH%fvc1$-+n{A)0OIQ`Kq&2i<_pLPkZqnG0m6)v`)aS4A<{%uW3;`0A+#Z1!Z7SH8w)(&w(+ zy!{3^scmV_2|63h$y;@SznP1NzGIDUc{qijJuGLYZ9>zQm?uYdvuz<`%c%*OoI!ms zH8W%gh@%oEdM%;MK(*hbR;F-psWQfwS@pYW`=Oej<}&**cc)vzqrFBJb_SLq_D)|V z2uIfJVmD_KoZ9c2hQA}RHFmF3cgjqy91S;oOVplx$0yWF58hVbGX!=4Z1ooby4$f@ z;ySd;@>7|ouyHakqHzKb{L=l4lk|?g4}dQt(JwY*xLTBvn{86U{Park2Zhv+$Ph_%|YK6cTq8m|1& zW97Rwr}`p|fr8SyCd^FyC&gOf|w-z!;b z#K&$NOg%(s{2y-FPA9rpy1T{LMP@@~`JrgR1(Xw`-}8|-%I`(EJ55xbki;?)10@;0 zl;j{|21mZ`WGR*8#O>(^Xu&!lX{*)pmaJb|O;uJn>&riLaTEd~(Y=^(!3+!Kqn~3& zZ|(srdPK+-8LTnbd{}z<^T)IZ^@p7&#;&BrMesw7rU6~?#}AH%0mL>q0=1`4($>J+ zhUE`Z`Lb~{p}9m42k~o!0}^`difW4ACLEKgsPT>EZ^P^e-Uz(cufZ&3?cWCSBK2J=+)Waz%f_>({ zrn>pmr&R(_Wa`1}N-dpt zc=usbNm-SFr#$fCFnqeo{Wo;319A&4=YeA*V{>h&hcrsWEVIR`e#4b_geGH8_xE-$ z#M;707T47u?!w(HHb>fV(=Bt{B&l?&dK362H6Oi@o5@itxK%J)k%3*zGcL`hYDl=G zM=!ug5{*1Jt{rOFJH6gbFwV;h3tVMMM|gWiE2m8xm9wr4XGVhCE>+(P|Aw9aVhiy) zZjo+TQpch-B^~NNFbPEcdGR;isqr3AfsX4;8sWs1lmprfG#-6bqCrIEi1hgLyoAj> zV#}UDnS3Zzh^#O@q8h7BTdu9T%XG)l9X35#3wO))_mZ=Z=@Xzpz0N#HOx*qR>PAua z`;(b^wE^V1GSpY8<{og)dETAF)*3Ec?=Am2FZ&#BxP)m>55!l;Lc>TE)3E~Xo;?YrNCp%*%;HG1n2Y6g6Ar6i5BEu{Daui86ov%auIS`SL!H}ij8ogOW?G^Mp38f{ zacm(^cizuoXx$aNl@Kn{@J-OtaCK^mpc08J~3hoWxL;^&qsOn zxcDILz>~_%L2hOu>l6gGcHky>9V~cjP|6EODbrmR9JxcXcbyJ8^9(GsL zgqvB%Bsal8Hez}(nfAQ*OAQUsaX7mVw`VUQE+8hgiQCQ zO9P`j_@*d95r!$V)fWm}>L;p}@Yw_meMk8d zEAz-IEgaU>fGe$4fZ&dTpH4V~r+!0yp3*(Q31yN}+cVC#Ig5NT5vXXIG33x&5T(>6d0}2)bzXdx* z@1gw?*bCiuTAi6IXUd5Q$IO6b>X+juJI3HB&lyTB1{u$}Nd~E<=@LtTK_+L2W$>Ke z@iuR(>2=BN=0jjN@*MbMtgEKAZ~s=gS^_@quxXT1F*e=w?SYPRsb-BXoTqrB%z8K3 z)G162vOnCg`M`u*BmEj|BzuRpPi(SUU>!=%QLhvO;6^PCWBt4z8#}#G#y)n1+RupH zRm*zQK_KAVj*Mrs20Qb87ENB7w*LmE|DL;sVms7LY%9~PLo!T{O-R~7)5l(iYZrL< zsw-6nu#Urif}V`5+U;SAs%Vr~a8T-Rc8#!Dblo2eb7JcWZJ;w4aPPZI)l(}Cw2wf2 zP0Lhlt~|PAe;8E(|IWLOe&034Q1(;q0-;r^KtQwAfTm#RZRi=q6r4W7Oki%)3lqVd z=VvW0-il#1w<8~q!AqY4$y!-4{8&La9!RuG5pLxfw7|hD;lx-$C09D6%sSsJjHbrZQ#R|#~erZI1 zZ*rP&uJCZ2Y4eM|F6#5L;cwM6b@nUe(m`0Yl@w)aL zziq*B@98SQYCDyum%Ml4#9HH0eO$^k{J1Wi>n{hMt%;(M{(@o1UK<{z%wf|_=qj6s`yq;8r~Wd6fiSW<4Fcl_+A+npzC5mCWx-%-zsxF$t*P{5>qPFKp{j(hJ1LG$HZ_?dn|4a}47xk#ecZ(MxL*X)b0Z-G zy-c7F-b|E@9>>$>Kq1@x}`$V0!Z{h5_z{X8ZO#E zF0N^=Nr^9Kq{A~2=z7=B9c+`9pDNS%KH0Ek4fweLeIujl2g({A;O}7RQ{DfVDxxem zFLe53Zf!(7x(HU$)!gfrv`O`Op6kX<(JF{kD8evw=fZg~HdXK=BwGIMzmE?#l!~~; zK4lh*Ep!W}hAtVLNVKAPtt%yWfT(}N<~C&-j{c@XvIjj_vw8#JkSvtCp}(=8E|tb% zGM>9Q*2Eg`OD+uVp>@?yD!KK%#xmH~okJwym2+u%Ftc-XFw-#YgH8`VI_?@08GR?P%QZP) z^+_i`8NXtK*o+FZ3J2OWv>x391|{y2YHqJWR#2nmsEEA=`A2;hWo*V8Ivs*ZF1>`? zS!MQ4q}{1*p+k-`42^|wn{j-yhBA^KtlUy8ed{}q8wT8ehVdxp+jW(v& zM&TgMFy+0b`ke85{@6Kg$yv18JiVIPY`!CmUER3ieElX>RC5P&3l{vEKvdEpiAhX_ zfm~TNH-lA&w^2#K8C!8PtY^lZWG2G(YtLhPcOlXzW(*(vL97e+fL6?f_24~#cIN_p z7HY!9AYHbN%53xcZD#v5KrM&OLaNz{OA&3qF+Xq&dNG*U$AGohj3Q()x-phDlJ2=J t?e_Z-W+Mr0NVI{RdY-z@i!{d!d?Y#6dS|4K-|QdhUi%!SX;F5+^gsANzl8t* literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2152/2686.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2152/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f13c43022d6a2213e01806731e62850a1c906921 GIT binary patch literal 10383 zcmb8U& zgG&G;1P~GbqeZ9yIR9P-;{Ch+x&3ni;@|@CsPSny#FPjgaT+>+#NmXrT$vKeQFKQC z0+@mSFW>){4)8A;2OmH{Nc4~8r3T>qU*P_)jQ{Hb#G%IJpb^7Udc-Mi=ztHRRgU_* z3LyK({v)UX&j1(L;x*QC=r`qg_DE6tyff`1Hjb$OKx#S5$q*#vb{~*uwd}l6Lxz`$ zY=Ms6X;?G@M6CM0kJ+T@;Wd3BhN?5AUquc8V;bU4AX{4AWBHtjkTWKW zv&&Kpy~6jI{t6S^utm42CubV+HfTGI4z5si+JgiCEGh4qyI|!psZc^nh9y^BbElqm ze}TJOVAfH(cTx5gD7j&nP=y2g3*d1*FUlzpEZ_2=P()(}ajU=QRM(e;HY?nXB6^Nod)?2@m6v?Z_8wY?C< z@1HVos4I6p^Fz%)5A-li$2bZ$Y0Ee(1WTe(eL;dIo+sKnZBNE`OUW3n33ts@9(NUX z%t10W^=&ab1bWS`oI>rTQ(~q$=&<=@zc}wVz}xye4+jr#zRt1x$z@s?1c-dn!zwvS zC95%JXt|+p>8ZT70%=e19sUv+zbi5jpv|V|(&gp)+U5k2SY9+bL_e%Il$#27FTa>J zt(|AJ?vW7xJ<(6ATUGU1_)D}XxobVtbgtxbrIpfezThw5z~;Jmv4{K|9ChJ0Hb5~H z+%LQ28T6_Ac}Kb#Sz*Ds-<#m$HXqr{ox4910cc=cub^O+>lTW87}oYpDLqjfCIN!?{%vqL+#%QJIi2ufSiTBcxC zL~rn+ULJjJD#f?8N~0xvg-z@xM!%#W)j8y@l1y$j&EGJP9!%~`N~4cTRSkxc*m$Tl zoWHkRK7J9FwAwW!f+0(yR@D4KPwQM&M@@i}QnVlDXph!>a_cBFrVxigf5BmOuA4*Ocii+e z7uao=O+WJ@#Gm(My8tyz3+8$?^YVc3;XvrchjqMbo=QWvUwt~>$u%?xPA9>2+$p|p z#XmHKE)07pbJ^z|DnC4V074%pHNZ5G()-LbyXj}WXh(?XPxyAMD#xhYUUDynhQZd- zC)y3#y$sVEWRNTYt;!2af7LFD>*2^-HBLB27ubjkA>#=%?cB(3>L)npy})Mw>0Gp< z%nq1aVupcG!Itohro1#yVS(WqCIa>V^IFlP?h5bV+J#Z;mxNnOYzrN`r0hSgi{W|u zUjt8{-KG3MD8|;|gqn6-w%$J1^nn>$24Odi-S6i~JuNX3Xn%!6M%VHZX!Yyd7G(l# z;Z@oBqIFU({Sw}Fz0GDdsW6Ks=Z71S1+l5RV*U@3Fl8+%Tw&(Sm@Ii#ZE6Rn)W3kx zmu&%$^&#)4h9oa2Ym8(=Jx?quE^yikn?NYe)eh&Yt19lXGN1j)_m&Ze3*Y&b1?DI_ z+JpbhG%7cVQ-W~XPyYfeO5-Gc{g!i@X?4uXQxABz?J|)m2bYJO>m=Vs)dr6?N!kBY zHF{1Y^DIlXencak^A)KCaeSzb^X^Y{`X30g-9=CXcL1Xxo}^F)y3N>IJjNLO4cCcBn^z zN~lGjzkrIj>bUG1d+GCjYTb5km=2rz8{z|9@I9)m&6EpwjDChBE@#{^-YznBwy1(# zxDZor=sn9Ai8q^kC&}LrcIH3g)*+{sFY5Wqi#yTMRrv>kZa#%Em<#Ui$skq?~kyHGuB?dr+* z`H)$h{oOxj>eY~ue53RUf`erz>ZAuTcW}$PBwF7w?di`!8P+jAAu2;<(0*=Y5Ch zijA=>Q$t7jaA7(WZI-#4K_^r3$n$Mxc7^;oxM*2_g4GROhF(3ae)jW^GSQ!A+WPaw z%tz!q#~u;2s9nQloof&rH6X7Y%0yiy7XT9!9GI;1sAYpr*tcmi`FcC|)r2yBOe~dB zoVY-cMX(URFim~Kw0ZE`YK@pH%RiJvg?nZLl`<~|eaYjP(Rp8)y*6;u(?`fqlYZVI z2|FcGx44v=gJ>Uwg-X@DPO0s;Ac0lW#&atY1ef+of}U-7zTMUPUQmvN`x6SJoOH|{ zqkSGqHOEtMAeE0O=$RiNKOv63YgxtkkB?AJ3H3e$9eEg57lP6yF+f?2(jjAr9dMMs zlK*vvFa}_1l*L3@rdQR=bdn>R7_YC_GR9NlR`r0??QcVba6AvfBO&>9gl``0iqPG6 zcFIOgPS+g$1=!6V%aKfnr#2kp@_f_z&{QPlHC|P%dwPO8Xc?v z;(_hfqT+d5!QJ(q{M1(*$s3)3qS{ZUwJKF!Sj5}$@(dkIW^r(D5qK5!p#hjMAR{UN z;+Itp0{R89x~lC3j{O+KH3eSc=y+nCul}ue#u(i;ry^T8hunAG=cSpT=E6IRu|6^Z z2ij~sDd@jZ4*Uz~93~)~p>0`wJvlE>`oORAE<D2vlf#F#!kHM3-l2J5I|P zzjy!n?WKT}upV9JF$76L?lw}kxQ%9sLg#y=NtM5;6 zvs4d)3pd`K^xyUllEWb>F_GbWHtE?*}hWY?UCQl`99cP-^T(?^XA>KK&wfl6C#Br zJUz6fGZ2yE*@cVX38@mxeeLGkF?p&y+d)N9&1U3I>EKEtwqa4@?Hj0;zJqLfNuqCf zTNwNAS2Q;feNbpbh)*GBDAsIoW@Te|XvfE0F4?(w{|(V(QhH|j5`61|9SQ}r7n%?I_&EPRWnrqqX4EbX-o0qEfRs#Q4KDtPJn@IZ|*en{cKJ!lxwH~ud$d@ zHgadK$@Gx*`2Dw{nrMOXLkqZRaEx~JD@9yKo=RwWGWI)jQrq;=F(Vx~sJ0!Vx{wWZ zs*f3RH=e(I_(nz=t}E0%XE%zBd2?s%u66FA0kvtAPed6?Wrk;E^AgfGRQ#x>agB|Z zlV+&DQQsvM|3NDQmIXy+?sdapYqA2CPUVXuPt9vLCAv!bZ=uH`2KB39v$;aYpRp&F zhCa+K0&%Mg!N>Qc0+b*IweZ-}7cl`Q4(+rMS)FmMoxAXwQ2$|Pq4f1YHj{^kJ<*i3 zx8ZSw%+|)+{DbG7Up!TBrnTaz9?PaGbhJ1ph4pD{XAgKBmq)^_$Q6v4wJ4!7Qjh|@ z9&T_@3WP@Uww92Y!u4l64Ucg*1vMHxGf$g58;07WPBA9+R4qG=&$aGOdQidYFz$k$ z0}*wKm09O{$JaLTLt^K*)wlmsUq2ifSZTgXBwbYrGL^wINLv9z z9ItDAJV>Wx+^5RJYpg@K1@oO*79A}wKsPD1T(KX+-9ndiT0Fwdf0@!fE%+XNrQix5 z&fPa=OQ*L%0)37t+?SWcwqrc*XALLXrOOJ)U#SkN24Hjn_Iuq~b;9&Br}ipLM?7^M zM(?<5H8a*8WmsI*uOmZJ2*h+noV81(3T$Rlml;Y&G<|5cJN)?psjY9+C~G%LS^+JD z$CVBqnSTK&x<<;&OIf8-aQzEn8IDk~-oe@$?x(Hu`HwtCBF-$2c=k1TPCNUnXxv-1 zc?Y7*kzr)cM%}7@y8QB`vl$78IYVw8@>L9H`uVxm1~zBf6;A%7DU{v&=vn$70+j+q z-0gnYbV;cmF%I7h+L5ECCJu2gkKa$rAIokFs>9^dYsJmviE1tlx#zyw(G1W-KdU1h z3?re9UpeI7MRI{6_BSjvWkxWx5Ai>=Rn|fr@Bq|>3t%)-lsZnfaz zC}0S!LMn~a)${Za{Wy%3adwWi%s*e8}Fet zSvBAD#8VcP8&}SBX*N?gAQ54$#cHXwtk?_KiHg#p7_`2EcnC7o#=HG)gHcw#Mq1`` zW!;-J%?*paK8fzQal_mR$+vDQj|uxFHQ1JkzxSfsRG?oZ$2<_^$EBH?Tm_FVa9oG~ zOF9+E)Avk1ZztjAN);XeM~;>`!p~j(+IMPGB*R|SPz#g%1*GMp5)WAbdtIyCT`KB& zEM|nUbQxYyZ>>tQnz2&UKiN|coW4#5&Okp|v_DJ-I*{ksRp&80O&b@Ipf#|K;QZ!V? zA9}ZVPiz;0eFPPcM(d{<)`M*aq;+yx(xDG*1`G{KVh+_t`ZKu}+BRlUjYr3%@jJjR z!#65IlQJ2OECzGIk?`zUZN<>Z(XoohBqm}#E8D3+cFYP|moQ1dt9`5FRZIY!aYrHXQo z_>~P$>$RL!Cf=-+bRpQM(jfS+JsbWBjzT{~5jxBV?vwPcWSHMph6tX@^q}xKosDiv zFfaTU+xByfGnIZp5C6{o+wvNS#;qP?>!?QtjJb-ts#DKoHwu)YU2#k$oEQ>92V9B70ea@`SPThF`XHS%$0-vxP0Y+@3?%MYqKt0?c?~c? zi^Jfen!g8*V>6I(tyakzV8UG(N0&+X(+0)^+-0wzE~uOpH_C&F;lce7#{PSZs4}V~ z={S-j96J6@m#B(Y=EPhDxK1ZFGE?U?Nr<lpTrn{rMW8wbczx$w4_Ei0Y@rcbcl=I%df2&5gq zK?8ezfb^fAnZB&k1ea;2XjgQ@Ih0Z;#33D*L_QpNSvw0JrGL^cziUWN8C$0WtnZ|IhfIp z_y|XsvGaPUMV09FFpyc%02`#vx=}SEq{v-N`tL|x*uq%CXQ?~i#RI^FqqNt7~=dMde za-T82<6pB&+j!D)b7H4-_|we^QxUXGR=D-AVN!Q_oPPU(-9_%X2ul)nzb`k8Qh~Yu zF+|n(D4z1y`(JK_TKj~N#3UuI{n~yy*S&us;1niV2Afw3jDt$@RFBX;sl2*$y&}t}V&w-C4YSAHSZ) zC-WccwlZvIR^2{$g&~o5iu@@Lke5~dvG9NboO-ZKlKEz4^WCsRtNH1 z*IW%t1#p&f7(#D-vwuzJUYzXxU=d%ZVA!0@XOIcsOWVdOuH(d2_LO^)x(t4&un^kA zKhM@mh#4l(0FufPRR__F_81ir3Mr) zOM*aVOmfU7D`hwQu*Ra%|KdVL(@IQ}I&UWwGrK{QxGGbJWS`kdEe}wscdxhka95Xr zI-hb3?s)amDURS|jdA*rMxpF@!arj4o@8Ar&V8pVogl-V5iecFnZf2af1uWrvL_Te zuzOPpmZ}4B6@UA1^ZofYutyw>&1A~g%^b`lU4orunV_>R4l3=cd?Gmeu4A&J=HNC= zOHF9`ln-LBuEabz_P!6_L%3e8nJHX#X~z1tQ&80XCzrO;QkEp6zWQr@#nsUYOyUqX z21?|~$&tO|i`mz))mywTMcyDl$hBIOx7Otshf{GGZl0h+i=nRO>yZszA(QHUa8O;< zycI+5(6dL&jqJ{0ou4b~S9V|NT%YgbAd6#EG7O2ns)-hgt1Yf0Y(_}beQfe)Jum&2 zBm$Q;FT0J2 zU9*=%hNxK=)s7wSC1u)*Qf6sbSpNd9sE3;SS*T5N@w&0P`q!Ih2bt2X9wG(pRzKWV zcKkUNNJ|cPW6c4+9C4SMFTp7pb!VnZIcKsgXlp-~Ld8fS*{vOPIRKE8pctm<74uR#!J=D}gvLLPr1&MOUXE9uWF zNcXG|9fFtFm7n6RCY0&soWEi(RPC)wxA2 z+>Ka8@A5E=F6$`6h)}v@Wly^jwQ$!n1kM9US3cj^ZAdF8FW$P0c{TR1iff8exDLWY zz;_X8gF_*v^tD-8Ym1JRKTf?o@FCqDY4jrv-{hq3x~U_}=D(O>i0CQA7WB~>lBq^I zAp94ws!n`UH)*#I>0vlip2oBCE3co<@#@Z|mR)MG9qR2gJd*Zhg*BFHq*PCdbfz&l zh^@641eHOTb)>F@I%f-Jewwn5#cD_kh-tU?NZT!^_PL=^V%HVjUuZkz_9{i3un|s< zBIlj=9nN5C&7zq|3;(ALx;u3s!LM%s^|lXn;4C0u(6QBR-&&r6!dobFHE{IVMa60C zuu0*)>E5m>DgT%}VuzfH&|iFmL}2FBM(ZfYAGz^I16-;I_<3S%O@C|Ba5pxw58>{Fz+k|)hw(JJ=Cv86QhHn_vH46*L z_dE@7$=r~hi5P*fURA(0eF|Jk3n!PiFx)d_J;{n_3g7<>>%WRIT}#$HhU=)*;Q($c zZiz6d)83i|q1F;f)${Q9YK;njhLbtnt{B}g5{^xi4}0-3#)%y>>Kc1(BBeHC z3_h~dcNpRd8`S`CmE>#EOX}w%_L<$UaxzjQlX+JIIWtu1>?|^PZ1?35EKuoV0WlE<&m9*bl)AG?1xC-xTr7<%-e zd<1 zRP6JM7n(J?0t3{Js(No~tM2DgpLY-96e-judz6PCSvr6Gu*WN7j1f;IB`b=6rfa3H zDs@s-exPoDLun`Ayt3kZKqW5d6)BbW`kv#%Fo=$IPwQ=643^PC-mC0+#)~r&iGWae8Vd?lR!rDdYIxgnCCls7K7GT5~GOvm1n*} zi)Fqhl`tD0^As!cbWmx(@6mG`F^#KnN{uOn)EJE@R*UO;TTG8&v_&U;`rjmbuNHk- zL3vlVK?A>xZ|mp&%6rTq!eYMmiS}!%Pk>yZd6oi)hWVeDokvqX8}!5OZR|Y7t!nQ& ztD!w6+npm`J2P_|g3qt-%!Tp{Tl_Ywpvbphj_kop=@B;SzEb${GhceGjX%;LOZ=~= zf+#QIaYKq*$y$U72z~#g)N#tQUBk6UV}80My8VH?5*@=cT-~f7UBg#8^Qr}+U=4`q zSkn&`#h<0K`pjny|ZRNal=Q}l8kw8QVE+tLRU}0S!*OMHh#;2vm7}$< zDd5*o=$U#eR(iBiaFCz=pGKOz-T5i^M@4Ihi&e)kaGIjlzMPPKb_tyh9R;ov)ix zldR6!&rG82{U2Q!v3$&w)@FWS6?FbGLJ2Rn@MY)vrF#s!vJ9>2(r22-1*f1;HMPEE zr~DVcw#;d+BpiY`^YkYF%lkQ`vby#D_TN&z`su$ha@<--zcqkb$=w2lf0hwk(%?)z zS^09EFV*V1u;90~;oTivn;ePkz%dS!`cuUzH2A{K@ZPkS(LcNOpQ;Ex*OYYm3*eLm zBF-XyGA4i0M{5Z3-;uOJ*OlseK&M|yf#f>s6FPQ7-T}y9rOZqi|U;jY`bbj~9l7GG`YcMTR2j>-TdX7i|2V1lW z+NLeS)G9q5Geql2u3iYeff9>4po$cJrj!IrgX9K5^wK4bO*BM`yh0|$0#9b-cMIbk zISW%Rbiey`wk#i<;)1$2EuE6V-oa%~UDmRplZxQLnuyXfw5AehA3aTcC1Mha-dmzp zUdvzmH)hFI3x4F2 zW3pRk8v+YnulRf?(8X&uBXf z*5#8^oC2rVwF!8K^${PP*yybEUnIdAZ+Sa5(U$u(%a%@NhqXF6F>c-2I^z|8)u!Cz)R>cL$r^+qCr*45-~5cn+bgY^ z)-dXl-xlW+M8;( zR`4D7*p}&&)8dr0uL4P=e3j#=4@?3dgPJOP?@e^52~IE~;oczyIWmQU?2`_{%t| zGfl+`q*QN_{AlI9oTFRUJe>^4D!i_u6ZG_4^17{M(nkKEIr>~@%^&xgDzN(XxoUZN z4O>e|@;cf8%-ziypG)5Q!54d&(iv@0zQMQ^Hs`5s=~9S0OzF2rH;q*Jbt{78HVEB| z7He(UPA2Zdm+hjp>o209+-r3y)<7sEQ9w_@z zx-4MGUYDn5`#?muGtmIf$adgf{LVe8)98(29-XGpGW+O0-16XjJ9hLAcwv>i!X4Y3 zgsU#glda7)or5JD(y`_Rm1pMnyk}v-@uu{RKI5hrVKzIo<=3JaBr%d#KoZmc@DyVx zcYiTOROEoCH~$nkCRgC%DcGUo_-`>cCG$?xg5|!I)TP#5oVu{-wz7+#iA`WsDc6|& z@>Cp@oikO>m&>y_VEExDD`OcQ0yU_)5(Gq6$9gQR|!ol_J`J!J9yeSJr zm3Tj$j6Hi%GFaaNzGc;LXO@tN!#$3~fNkHIsqvoJvpn5%{k*O`x1kSv75HQaDL`Ys zLX{HqTFsL_Ri(%8tHM6NGsW6loT?I2!SXjS&OQjr`x!!9_(utxet;LO1)lpvF0yxcDv}K=qx7Q2f zI335snz7`M>E$sml7nN7BMD99E;*825Ilq$2A|Jt7sQV0%3?C3`DAr;r7AT3uKXV? C-nI0*RpqA%F^qgr*oUytw;z=KX!Y-k*2wow;-8`_6a1Ip@yYqp70>fH>UB z#tOj00|4-F7vN|Xa2deI%lmV4gP*&BLO>utKk&Gqpn#CbaS;*W9fTDM3A`T=iBdcufds16J@{c~~C3IM3X?X)T|1?*akE{M4@;~!|0)ku+BEhZA z%P+vo?ajZ7^YBXW0ZYgEC8f`4A*3!VnhSumFF75}07UqBxTg6e05HHI;cut^KmRu! z5XAm?N2>OSNW00Ag6TGy5g4e#7i^2B?=FY5k8F;|2DP?$`9^-ie(!|-?Z?LTUmEB- zhkwEAYxVTdl4e^N&S69$Uj6GTYWNd2soIs%``Z`NU6fqSez*AN2^hSjzz4O~Nmt?g zHUmo}|4mIz(JCHKtO;HmixMH#6Op&pe*Dv2ubaGg?U1%?RKI6KOXZBIpN#FQ&MR>6 zBHtw;8)HO$*CvYQ%tY6k*Ba>>JNrp~BERGGe~d@ceFz>ptg6w$I`$`cuNzIy__+ z#XQu*3%W;zjv38lpeOLo8S@Um1Po$*m4r427VhBWxiAJUx2MN=~dy##(eJv#3 za7#10O~gkD@wKnek=52al9Uz14!mm5C4hJ#Z$`af-{p{M^yd(8pYoGRQd}85uQp?f z5Nskek7}9=%b|>@WFVEEO>QX;$0_}eF^&B>hBv#xFv?I(@WP8Ix@c9WJ5#+bOD*fy z3d)FvMpcj}=Z0Hc8J8QS@paYs7enjQ3V1PB#;bp9Zj#WbBY^X*E+?37U5QJ2z1dx` zn`OL8NrA&Pawp0D%_wrvda@??kR$j>gk3>&<@ip+5*$X&G^$M9YDw@$N)laa$NEq1 z5PZorW^j|jiu%m1B>IQ1Dw0>EcHn1S=4)~p7u>oNC?n_VR^}PXzU3-Qe(T)FrDD9e z=MXTS5>kHT4AB1zyf+eTrZj^R&RF|+(9*~C`bJ51M= zZ=?~!IYfVytBF^2B?D1W$xplWUeqg3(4;}8cvJnZ(99MswXy7l6^4|J+cOHccVd14 zYc{7O4nZF0)s8$dI+K6eV@2ud+xCO>DPoD`Robxr(^k=>AXzJDXrrxQC2cWJ6`Etd zio;NwDw^6Y7)8E9o!^UZ#b-0yQby>gQV8*^=s=>CW7Pwe7cSnjt#R&Y?q@&5<8Y zn6iAv;m$qri3Y^10hKnFOsSQCxT{)`avC+X)HdhyXH;9|x3m$C_PR4EbNBDzud7`8oa4aV6_%rLj0*T|9(8q$)av{|Zu!@~7<`td zFUb|PogSshe*9>Z0z}s0R6m$>hy;=oL3vm!iSN(3sx2d}5>J-9GGz?i$z61|- z=pZ;ohhzo}I`!IoJS`Jot2yVeN--rg!R+dLEb${U;7C~$Rqw}ZYcBZSmuA}!?FQ}L zu$mNqUjrG!O~hE$;I}WDqgpwJiv;^bAEY(DF z$dGnt79>)8M}s+;sIKps+9a?=QcbbDad2!fl<5JKSKb7pz=vA$6_-Y~=!^clXwbop zL!r|JqR^Kn_&M)uQSIGH)x^q>h8*p-7M2<7Yns|wZ?%!36Wtt1&_=WtZe6zDvlF@f z-G99VdwVN3i4SusvMlbN$e%)|`W3_46LZIPNFrLc`7_RO0DKFyw%2ti1=Z&yI6Y3YQ2p z3@Ce4wGtCQBlqogFo+sBW5Ec7mZPEGNuRa6J!u{$AXGM?cv=35k2)Jcc| z9KGoa*R8V_y^se6AOdT*t-a6QK&D0n*`gMyD zT@dTs3GcLMvCGBz+gNTbyk}2^vtvAedGMrTi~%yb)0Sov>V8>aHd{BwqdxrBv)ZyI zO1Onb=%*UTk% zsD?O(GP4-+Z6#@_q{IQ%zJY5dh&KInuiC|6i%}>Z*$KwMM@@5$U#75YXKfH4H_z3q zUfbpYPK>(=}ByU444yp{J(L)6&xx0AE>NNgjZL0sx>q55UtZKo)?8iu#{D1O3@B zUSeRNqhnxUV!n8ZgN1{GjfIVki${o$i${Qmjg3!=Pe4RWLPCNABzsLt{F;!Mg!n%a z6tw3Ubc|OR7_W$Nv2lt2pYhZKAb9!Tnb1()0#FH1&ox$yz0sHo4mpJy}x3dZxTPyuM@1hg20JVbA$wO&{d^SXzU&?WIJP|z`6V7`3z(i8m0_ssQwGoqjppwSZYyp={L(&BZuAbwf_;GjK| z5TFqNqyV?acBoEZ>Ep3k1Sp|QO6M2aW2!TCX7!J`E70Y=MmY1v)ExKlxRV&?e$!1( zar^Wl>MLWhfNcK^T~9?Sn1$vEe;IUjOtisGdf%?DVP=K6?qHvx5@lJ5E+DqPf<(WP zjMc^|$LN*dWh)D5kZe1%x(@_Mj|sr-38n!xvY_e)$RM8pcJFlR+{K&j46Y=qqaN3s zCONOD7uWn|uj(^)BC^G7x8yH&#Xi+9f_}Tgpy+TKD*2N5jof7sj>82lA0ok2sQEAY zlE43)BTW4C%3b7Ji5PB5u(UY<_J+RMII8ZE(S<2zgh5`Bi=NOX%vR~B@bb(c@#}r# z-~ZGojNnSMY;S(~9)6(MjnY?(yKgoZGf~<+F_yjUNjp20EOokSoO!de??xQrg)3d~ z8V`qv>`e$ph}camK>%6Zk(oPZtWK@;1A9vyhPZsmY^RHDoy&Q{JEpi{y)~#2G43Pm z6V!5?nhj(gjLejmlWd}=zIf3mT68oL>xfdmEI#oUlEtK5PbwmOnNCg6X?S7uQ*u6* zu!FRn_WK2TA4Mr1a(&7PI*aAP)i743W#Q(_orEA4KQS;dO%GWng3`nhjfBv)6MNme zT~{e(4fg|MDM2Lhw+~Q%+sOn1QxTTv-YKH@{PF1&nko#=jsBVYE-PQXuo}%U%So`%l%^XYLW4~4AHU6onK7q-4^N{$WU2?a$4=h2FL*ZndOH z_I<)5_>zs!tmlkSYDWMkL5cIkbKd;4%ngi#~_bTGT8_e~O+DE0}oJSx{ z&)baE(ey&=VQRr-5M_zYgYqi#-vFYwq8FFttiIyv8D&N>(B0Ql)jxvI1eT5}_jMbO zGhctZhyO^wN|+{^EcD;COsb~lR(6}F`MVt%8>=l}Y2`>4f%7v)xLi0RsmV5*RR|Jw|~i0V);o72U^=?%VkTnXVy%TG5!+d zWV6_&6;DqGk*uA@sOvLWtDlSHCMsa=+dcu*T~?R=7F2d(%I@j{94M8{9HZ5XiGq`bBR2NY2=*6FlDLqEPNgFcM?q$2hH^r|njCw-}Xr z2xi^MhC_!X1q5zn=c}UT`I)g+sOV$MwP@3JVpNu>)J|IV6p?2nO+`nUXXVVoL-fR9 z;(d`HR_rd=ul&HvzQlE#1NkY<2cN$c$GP|+UwYBOg24^gxo+sub`^xI?O}ImH{H<8i!O4qV z6)5oatPF1;Y9m^IQ_Cc7~v7Qt;hl0++6} z7^5E7%|tzm_|2oQM_1a|H{Ki0@%$Br^5)U`hkWgKwc+9%yX@^yCkqUzy?E$N-$0bA zkoDetTTG8oCRylEYxG%h*9|n!XL>g*!ITe`X|5b|;2bzykW^0yu~{u$Jk+n;Qh&c^ zLd7I$fT4x23H7{Uu23^ZihS9&u2MkvC6b*_PaAMXS-;J?<*{ohu?%nu0Ut+xOX)UYM6kbFN*`-=lpb7MSSY)eL*-Jvd_2Bt^*7%PvsJCjd|@NSk~ zRkg7Xb)?nIaz;mWdfh^=6p!9Ije%{@WhsoWYfdE+trr~kfwAZhLSCIsW}=-iM;?p6 z$DP1)<)o^!N@$%wt7Xg^2WtN#boZRf?5B}Gi14a5}ijCw;Pk@InDo=ncOM{&azzeiw`rL;8(X64%K1o>rGor~vIJy6H| zCM>bFnFU6|s+7}z4z}LL#57%fRahk&iOoh?eFts1&h=Njle85P`k48`R`t!xVOx2; zCqPVE8Sh`C<%C+#!Nc*bF4)dIyZJjN2waZEpPu(qE&dlLE@{u)GtMVKqLV(_Z6@}G zb+3n_D36pjoNJC(uTmn^iuhyh@GxM2!Yw8aA8@Z6Y|ea+x{ zHs)lkRicgq8X{Ai&@%Vs;LPj&i(2^-NFAYNhsNkedpIwEMnZ+ABsC!9jHLRp5TBHn zTi0PYj8jZuhUasFE>@AfhPcd>Vil0lGWa!IBj!iNhoo8}f3P$!fN7O)Ox$o{>Xl`h z!cW)hRHk&^$~FmguQmBciwv7;(VfbBpDkw@lFnaS}g-KS#_aIxZM`|6; z_Q{JucD9|Njr0fA?1=@S-e=153RA`b zBLm4zx5Se$Ya&j!P8f}z0KJC6@^iTS1_>WX!;W z?k{LqkbkWG1aRszfhRyx5S@<-WWLB5Q*x=Pt#YMFw<%AjUoD2dxCH|3(pQa17qPqL z#G_z?D)_t=9vFkL^o8c%g`CIgB*(37Y?h6JZvFPVU6*oNz5UqZS515UCuas_g8f5i z0dS(Z&YcBI?+x^yZ%ep7gId$u@W`Y2@-nO$S#>o=ucI8{tRpW)ZIA+f529TKg>#w# zmhHE4E;7Z^0YNsIqk14!ov^SN1T_Hi;=nDYs?)^NmvF)*XQ?;Am3KiKpAQd6DAbUX zl9q2j(r|R{XO@ENPptn&fVJUk@m({*HEKarV!lpY_lx4Vvv;^C>x)s`9zIRb5v|g` z^{vJe09yX=K~3!y{A0mL)aB<#g^N0>!VCvfsbkju9%{bvQ$*XCGL;6V`|yW9UaLk+ zrHu)UoXvO@#N3tv3Q1QO0x}lDN~{!?YuDTQdvrlK_G+OSj=a~MhL9ZnN1_mms3dDV zEO6piE{#0|Wk6>C$SJ#$bp2U&M=v?*U8oTn+W)wxryJfs` zo2GIx6&hzGh9h=2cgnJ}NyQ2s%%QMWPcEG|vF(&Wy*U1=kgbdt!G~76R-LE%ZeRJW z*>^vui#cF0(@?1i;W&H!9rTuHu28A@;J)u)b?qA`#5Db9I(QTlY=-kqp)%*Tw2xkYr-F~k5$19D=j&SPF2JNLGac_)giR~Ag9Spw~D zzsr`>8%J0*760gamyir&!(i0PozS<|{NOkdINJ~96$=yl`i9H0VR#7^GbH0}iiRpM zG4iN(T~^$k^1YZY8GX8(^~<;lM+lJShQQs0b2{g9I?G25Q9=8mj!HuO`{DGDHwM)X ztNP)dEADKE>&>{!SG;)-^DaQWhPF9k+58r9zh)W9<{xT<&J;nVzkk4m46jgNw90Xu z+E0Mv3ykKoam3HdGF%cNgRzP3)db!L`E$YWTxA6>(1~u!URGX&NIGAsBY~FeF#D#Mx3h#Pn#f?=p zl>2?nwWJKl5q0XTDet4|k$-%92~TI^1M)2#Ww6FM zUg4HpiVQg~d2{Mrgo!&?wsmV^mKnowKkqxtaxIu{7ieT=)0NC8rB2>I=J%y6-BVgH z?#4DfDDsiinjcLVcrB~$9W};%QS0{?3sVcGd!J9K!K2V zlx7qv*E8~73dfaUulZF*ZG-K7j$Tx9OzB1WO&Msu9K&7f=$|iH zqd766#KVP0$J8!?-0xZ0=|<8_Ycia0ALNT64q^4BN}TayepJ@WTKmN?XP|J*!`E7|LPbOz-Ivv+t?y+nhgAgK_985Irb+hDJ2LucY~gs?%5RQ*u<@S(xBBeS=icN%Ma)M6~I z)T=G>!a;nhkCGMaw-~AMzeJ8{RQJ7AKI~^Oqzu3CSWe%)giyUhid<-v?*zNM$GxfF zaYx*?SI&^FR$ucSNF`CN-Nhg$Zrz4IhDhvsN1gs1g0g zQop69CKzsvQhl$Qq13Wt`~Y+WipINhFm6u~K=gn4?RY@cW`JI*K=5$+Z07GZ4FVy# zT89sTLw+Kc6_;qmnR^@YoW`Haa&uGTtdj4U*GNJJy#f*HWDKKXu6(N_pQw3Vmz9)6 zovygbD4LcO!;Y&~iCVWSt)f;cS&vRkGzXH67??RWZWaeVhnl|!xD#9HkGe|Y*nT(Y z5eug^6pXSzsgDKnqo|-wSa|rmNS~UE6zW~4hK8^3K`#sM^u0IsbjpW5oG&FEco?|A zC05pEJUb1&8M-32^KK)D5N)SQY+HeY#6sT6DI*EI4%#6R$M_6OIjKce1U(kwB%B?S zk$+9+@vFoMthqK;EMU0PxJa2VFufj0$*p5!w5C19eS*w^%|Cg$C^=pNko@i2xWDMG z?lJ#nsZ~}b`boT#*FyJcj=c5m!*oN0cE_skL-x(vYLb8bm9ae;?VMG|{!IN^4C>k+ z_A%Sa%ARe-kJ`g^_Sog`1*u-@KwR$cEwndusO=ULf@Qy%k=O>(X01)@NQ{v_pdp4g z&5b(M&-InX$iAG~U8@3Q6M5Rg;B5RfDoih2!y{jNP5Gtt3A)q$Fw3g>If4QoXCo1x zPk-RCxb&9NCi@ia%Mm&Xy%BBv7*XMy2au*^dxk1IU$O;I% zBZs;MedZyE-&+J+4L-{ntw~_I9Fv-ih@0k~sVm6efoo~JFLnYj(L5-~g-EpsEZ8B0 z>^HNBvsCDB>%J5}0TO1)j(6O!8%#O}^8-IDc`7`7eOWM3&6(rdVthf{n`I8h!E3*O4738ktp_D zOxzvTHx8VU>7-?tGqrxF=2_J0@1~=T4qffeT98s_ZMPK8)=>goPx6FKHxqI3FBRGb zx0VJ~9LiiRiGQ9jNP1^p(ZO>=AY{}xUIkRk>RzkRHb=(W)XFD`7D7Ueo$|`(!Dd{9 z(-ixxhZU>?+Qu6lnSrgZGFCPesmvRzRKDs|Ok--pp_CE9FDUZn6LbzGV@_8VCJg7P z>bCq~7<%5jsQ6%DqytOQFKkL9jS2#&L`yTc8yzVMVfl{HWnp-Di2uZb)Ktjl=mt`V||RR*W2hP0LyUOj?r=hkmte~ZWTkeSx-1?l4<>>ul1!F`9O#F zDUP!i;+TA&Z324hifLrh@7|EXWF$rhCt6xAnX#fvjMKss2WElcH|f){+6_7gnYJ1q zq$9HeBd6(eCG0eO{8~;)NFVEH4U6#8N&y9SYF7!bNp`FpPvcIgW$1A{t0IeHIk1nc zjXronf=G?R7UW>1qJJ70q&5EgKz$e+h7IMo1GJ;!>cf_FRnfZn?}dWcW>@P#S&VGT zC&25&giHxvkq_6=%80(fny+!-m&1!dnShYREbr-$dn7Wtha6si7CAHi^fmk`C9T#) zeLM)%s4`Gty%CK(y)FC%a+EPrmmbt$5So_srWr#|UwxnM5+h(fO(j6FYXt9_RElW` zuSfar&i7tDp3TUb^^c;t(8T_hVGJG$SQi|RVgl;-D96>G`+Qbrpz7#3a1$YC)t*9Z zW+8h_J{On~VWl}i`Uz6i)e$0)55moME9MMoi}xF;qaaTFoLpne#|+%w_Z&;&;ibgX6XKMa4Ktde_SDgF9#CF9x2qI zIi6^X3NrE~rqw>GxsATAC~OMfg$<&oI_C*GcvM$4MXTgxakD~WGDUN3XV?exHB&x3 z0Y<{BqmPaq5Lh)Oh@A^xL} zOlmXk)r~xqC%P@2yba=?TYgc{r77sj(e|bPqamAjRcmgg2o}Q!73(qAT4Y4o+Q{oi z(GTcR?%_$E>!f9Qdu59!TH$DV*t1wVF`qIup2IL(>;n57sQax}1Sw$hiv`6DdPKNc zG0SNdlxG7NN9Jo$jUxlY4bOUZBkoQ3o+q4L!;az!Krm)=ePGmx{d>AbWD~v5L_%-} zJkC-Cn;~m{m~6kAa(Z!PNm&gIB@Yv-7kPbLo&1gjmea;pN+IcVokZMzj_JvXXK!$e9J*uX0~&ny)+~D;kDDnRoih%$hKxH zLxkgsq`*sQLpRh2%!^l3|3tpT=q6=BKxoN2@;Yjye2EnwsORR^XZy{LQ8J9vJufTT zm3f&T;0D}54@UULv!O#0_kk0^dx7NjGOG%gRPS%0di*ve7 z-;^!3Zqy0Y@?HujSUV{b`Uq@B1&JFa7!JGM{7?lB9gdAY*D%1fm*CRixjT;^a5&N` zkVKyqUxdZy27^c45}d~8`m&>4*Kpb^yR!jUmiY^PN*tjoKgt#rQS2l0_+ zh>*oXhwQ)l#IA5xk2aJ!Avx@D+fumjmhyx0cZqB%nAk7`muA2D-NVnC1 z@$1O?2d~BBXyzsOlP1~2oEt;)4#aK{eckY)>Sx*IRY`~a;`mHha9;ILN{@(2kdU}GgxWl~bg zZ|{|WEOwPxOiu1HUF+%FG#MML1RXegFk7uQSnJn4O4GYW4aTbkn*hr_Nf@ycOL~0g z2wa)h3*F^#~O30zK$m*;e)Anh)NC+AETt{_L+TEIjexoEq zW1>0>_ZY99;`2{$8AZQu%$F~BT74vWfYN<{7*&b44fosQ-u1T}F+LO<=VwKBPm$mi zm4LX2wN9fGd)~Gh^c=&_G|Shr|3N8xZf<(Qk31(xHr5Q?So<$H*~Xx}OXEIh*8C`m z;&r*xVhs7XT4%@wRjV9lp!{^!M&%93SAs~vO*i%`HeSl6qP&HJ#;sHe={osFo9iLw z^Gu{wm>S|i(ysdE;@uO#BbcSaba0ky?J~z`$uWSp(#`=fO{xCoY+ggPwj*1R%+_rJ z`&hMz^M}c)wI|kK3}kXAdfpjFAtaFvf=K{RI~wStut;duFEw1GvgaH8p-=@t>v&{Tf@w}==qbA${2Nzs&<)dx=O@baiQZT}GK{S7AeQ!r7H88@Ylr?HTHku~vJsl#bnb-^L2%-pe@{ z!b5;!b4)k5-|dy-Lo+;Y2d{+OHYZ}_2Hl$f>{gbcd|N&7BzU*%{MxY~M*iM6I+$)$ zIKhZ!yU5s6_sdGO$OM;BhW;i#rGM)M^<7@phT6nmdC@PY7Cx{hX@I1aC_fj8St*N# z@16b5&J*A-+?%Z-e2ThNY%Tuf+D|8>gAIkICll9>LexrUQ<%>I%w5mbt49b`Cb+bs zq%O!u#G|n^;QH$)i_Z7F;4w6V^ly;Kj_3DA5sXlqYin(i5ZJFLvEgneIQR4d!hOw# zJTPf8yO3r`#0hByC%4MfW?AK5;Vvz8eD?AEx{p#z+#JQ7I$~|;8`sAq5(p%g+Fcq zZhrOE_j2FvnSPt<(>+r)-KXby`FRUKs;;c23_wEz0MPy|!1F5L4FCfj{XhE$%zuW3 zi-m=WiG`1YgN;jwPe@3BPe4FKOioHfOh!yVKuS$YMnOqMMMX$LLrYCbOHN5e`5y@y z#y=lSEIceMJW3)0BFg_~Jof|0aR18*1C14cPKJg-hW0!Jpa%fZG0^@2@c#o73mpR+ z4F`bxZ&#cYfR2ui_Fv-YXy{m2{|evz|NH^iIRCM7kp0K{5B~-J|H7i7lVPxs3u7u$uu=j+SZtopNB|+m zKNd0!GJrhbtaXgzVKBI8!=WBtJ)$K8mHJ;Lol?YG|M||(yjuNY73Y%b(`ze09$wYP z7QSN0329ncqMidT6?8+9X!R~~!OA$w+eNYA1ED7`HEH$Qj}u+kV7}D_n#No++7NF} z6x(}CB$ea(H-p7x=$Z8iKGC7Bbu!*r$4i%b7eL7Cl(#cVNw(R{rye&4KdjM3NycOO zOt2<=6mHg>=sFannJ4PKTlBOq2fvBaVLq|8DmY1>vmm5N${*Z}}TDWG9A3dF7&aASop50yh!C zO1F&1k~0+V&u7H!6=K;cUaLgsWGg8in##Rx9>Hy4Bh{$cjnShl%O~vl{bs0L;iq`n z30J0Te!W@94);>NNK6268ISn`lgir>sttIQxn<@jcpA~2@U&{di)G*mz8*(XNxk~A zL!SS}$+l!RMTFurAPnvXS6~>xq!H!2P`R~VVw)=&x!e$=7SOi+at;4G>9q|udIrRW zR#*W~l0`5(-a7nPVFg2r_@ zC2RH(bQL2?(hBmznu}rvUGZshbH=x{E4&P!ukTXjQmm*r97G?3SJ{&BJUk>W$?WH0`B@B@#AlG zxtPNPe@Vj%W!9caj9)#zVWO%pfhU<*dhvBa=~hkaBU`qd%L(rrQ|h)ltCejZzVLP$ zq+)WXT%p4Q)oaF1Pe7yO;sdKm61`nC&D@wlsj>qza5bh^xUkMQIOlQ2_GQ+-w+S;fI-2b2*ut9 ztk?oM1-mXA*9)x9bc_(TDq$6yFH$#axH?``;k&nMyf#UhU6;rEkf2ZV_{eIsd6p+% zv1PabpIKge|Ea!-5f!?6)~CI7HU>AwHx9fMxbF$@KaU0WXJhdS$mVNTq97g{ws-ZX zB2NIHlhj2X!BOF?{@Qe~KTxl&RBYQfucuWT9n?DfTT(5f3}b92K7i+>p)WeJT54;Q z0e^<}89?e~Of}IP=U*pMt6sP5!En3xVRfy07_lAc`ru?9)$H}rskqI9aV|Hfe({PO zCFE9+=~NL-x74f$>;pwv5g>P`qG}P!7xIg_NDItTBOH*zPYc`O0yUW?M znYbDQhWPr*w*3^jb^T;@n=Q{+^OBHHp{nH>;1O4UL{e1CD&w5Ic&giU#y zp2^jJ^9?9%L^j$SS#umTrn8Zq)RQ9Md#bf9qYx-!o~5c>f45B#Y**Ft$D{L@p$uu9 zdOy%C4cpe7_2mtu+5W|0AbpIAd({TAUmr^^rAmu$l(_%=`{o{=wiwt4U55v)tQ~hc zZ?u!K{T72=v#<(v;g5_+)x@5rvkft(iY2H34--Fm#>@^&r0o)^3j_{q5h=aunEjfX zXz#3~z%SMzq4=sz;gWCvCQt6Cb}>Uy{PkWkNyu#y~Hw!)D zGdrHXP}}r2r0U)L@AVWcunT!U=vw9B3nY8KF}x%AQ{)&sshk*|X$T1>%&Nj}aKgc~ zHDE%y`KMChr^qs`huHWVCRZh83ZY;ANe)%nW(33d*m172&PyKGcM(tN13d;>ePmH8 zHR(Tb*({(RWYNa?Vo8*6Ftvo7#vj@^oTy#HRLe_))cFkG_{k>nc{U`GyPsLpJu9otB6q;YI7xZnb zxN$F-vSn!!YdD)JJ*o#ij>Z^gBR`a&FBe(x;ddVEMyWVcLtb*3Gb;obTz8^O2FLL0!+%{aK1Fb7vX7nGLtl>blg0h}UncNHZ3?ppSMfzk=OOwu7MBJc!*{-q zr~q%0q4=Ykx&+jNmpBnT5K%FSRG6h7_C?EWym%Y{C(qxnlrhwR%ce?e zlsqJJ$y4gDMx+ye@I?{#IJNP8br?qkmo3M4p(PQ;2z5EBo45g{hZt*MV7HrY3iTarZ=A1&I3UVIUlBXi&4cVHWa{IZ=X4&_K)-bb zyj?-Z?Buay06{0xu;>R&In=RwQcuh=c3uYyKSIwc^S`SW2RW(cZb9s6l-0ziCzs~T z+A3<)*JKKELXzIW4Jr?vu8@*aG34E*Rp3!Hf$TM{s@Tsh2E{mRDPlmi1-7L-NxB%2 z32m9ecb7LGevNid+FO0}dFVi&2#)hknx~$qp_FiT9)~tc_0+^Ub-nAgv>H>v9}iq^ zl1p#CNxI?-3@X^V8q=J%L8!(R_6l<&JQY9W}zv~~smN-U~zvD=HXWqy8R#e_g z4NFd&y}1*?3+vSB`k4#i?Ai~SwE%y_33B!{jXm5SIWM@(pqP0Ed@$2;cEgRZ=d~!? zghAJaz`X^JGYk!G5`W*4%UoJ_DZwhKs{$PHzDJzOoFJ6By4sRtX$}ik!hCBU5LmT; zk20?rbBWnhjWpDz{CAaqP?zEH>7G^R7?quc^JY+L4_V*P8+GoTY}hW2Sb_&?6x-I2dgF^9He zwfblHT!S1>w$x+sAYxW+{b|9J!9>(Z9e3NZP(vg3Bam5s1t4(T_!p%&q6V;)scw6p zMR!e_-}8M`*qm$Af!Rq6LaE<#cbB+8m0hNKr?2O*pEdoyi**uFsgsd_2`C>F~Gp4rV(zwcQyXrCW2Tef|tcSvz6vdx`Ka zrTd_`Gmvwcby=1mQl$F~u&50Kv~~T-y0$PW-6dp#LDTY7w_-wMq{SHIMHok=nl$g? zmVnjSF-_<{wh)?BEwBhI%>}UazxZMHdG}{K#vp z<+Tf(w%Hbo2?^m^YDYUXwI^o#gqd9T7wSZU_C0wO9&V$U8~F(&z)HE2gO)03^RiWw zTyY>hkB;{GT~ZU{uvxmylXYG~Un%c1K%7C6F=w%JN&-CURNgcXk;9y1%t?%`|I#m) zRGm=RGx~8_!_-%w-tEmZAU)}Q{3qBKh?VC(we1vr!8}{}WuOI9eZ?~Up}P~86$lWq zyMxs;ZjP!0=JC}tWpMEoO&%3B7<3LGAI6t!gUA@&SD&Az->uesi82z$DBtT@pv4HcH11fME7^`>fH z$c0IhdIjmn{>~Yt9&Wk(_O&iecF@pXy(OBnNdgeFR)OL5LbNhWC6gp6>u5af(&kLc ztYwWM^%~}&tVPs;6TmCS8Aqz{ppZVNzP!`!DLHxlX6j@)CO0G52~7owlXdpJ{ee-o zMRZY$l~Q-8q)s6l-7p8UN$p z=|`E9Kn>7crQg_&;Tys;S6nN~SIIAqbSbMzTuoEtuO3-mugIGyL4p!&9Xr~jFGt|Qg{+4N>Ga>a5~jirGPW7IOv5XWL*O90@98X#-~blFg3~ z8o6n@J)hv}U6+0p5(KsD#{)(wkO{0}iEXp>k^XHTaK1O|C*2x6Ovg)KeynD@yo2h( zxQPh3e-?%tj6&nGDj>aYs)Vz*@ab*n-toMl+c8J?-zgJsI-H^6)m3{3M%&{^RXOXg z?{r_Ej{I)Fb6v0TluGk+ID#Q^@HqK0Z#O1njO}e^W8$ z5iO9>?qPdWVrp%<<^mVk4KRr$Xf~ah#2-Z6;JSDR%T>D6KMp#cKYjV(yUw$E8w>l{ zV~CqfVet&GFZn|=Cs*4Y=VhFf$E%VgNk2E^4Xov!Ck=Va_6*>(Yhs+O+tu*WST@Xg ziGq4oR}c_Tv@_vsGt4z)a6!-tiNn&(F82&rc&yz+a8p5=w;7eagAu)4#=)e&UvLda z<>p>@SR>`h4Zxs4t@bDZ!9YLkE$Eva<7(-p_`8UPchab&+D1N{sUqSul?wavjoCm~ zqskF8mM-ZCBDa6SWBk6!;xZg{Xn8!X92l}GGyVD=B!8bMlT@+4U5}ifoP1z3oUBWX zcRDQ$Qr%s6qIqHoM;FY}ymw-{4QrCru+Okx)Ur9-%F@wYFM45T{o%e%>LyQ|pfSAG z<{%fU2?kId*>5;>22>P4g79*u%h(uev2RZKzyAn0(u9-ky)lUXX1e2;?dP_z1ii8( z*3KjfR(u7TmM7n|=-a^m(%zE4*kED-OeFDx%E;JvljG1u_Gz`fQJ7fAa8*(I^OIZ~ zT5_+Z2w@v1)9~q{Cn65s*(`H>-TJSjqh6-ww1-WzpEbwh*682S{{V&Wn53>`>1_F@ z(GOL-(3X6F4L1~}71q$mqUo4|!pu0SbZ7q3_zr>A(QkoHgYE(n|?n%IE1 zvk@4!G2*CtvPL0DYWn(u9=y^*SbJ@W>JM;3#yi}7Luh>Ct}`#|p0~3KaMEz%GyZHE zoP!i92^6)-NJnHC6urtxZ1k+PUiFyc_;hi{$Qf~nVKoj~^R2c1Y8}-Ditc%txqDm6 zNzfF)u?<#k4VtQn1oiq- z7jee5jA3i|eOilz)m-0ZeC+c@sNSTSuI_-oII&Xe0eP8+?u=jwUC#g*!ri*9Pzg?( zA}F~Ak^gdW_a%CY&;4zK8+JeK5h&iET>2#DpW;BLP}x(%DevNH15X;MDNimby4~ab z9Zf68_uIA$NjY%|&O?%9?ueAXY^o?xUg*yJmVu0unRRE2dG&FQoPBng=+MHN?Uv=E zE<^Z51CI4|_6qawk^UsY-P>(aJ`}w-ulMRs78bvJVY%d+AWb%5bDXS%gA5}P#f`A+ z33rnq@#${D#i6EAloi#|nl!BWD9l;v;&rQMU6!S68vNDmX9_>-r%8qZFH`E7ND(@; zZFIex3*4{P_8JjecvRI5QvYVtP<=!A4oJ zO7*gxVSs8e=Ca3i%u4uC8>?acjzeN-$^3;g(nE!e31r}6hja4B<9|Mr^yH3E;b8I- z7b)+p@4{%K^*5vodD#5!Eq4@EHZbpUNIVUlM4q}d7g*U`=Pow~x}Yq9B)&n(n9k}HZQr-;;P$Njq-(Kd=^4#b*=W+8pT*@iK)}Ht|+T@*5_rYas7XkwZ9+ z1TbRFk7v1emD}%lIlSF%+n2v{@`A(Y752!NPFiDSvwJpTwY3r<<0`-P9i*dMjegM3 zO$D)P6xb!?1$|7;i{n2~>_J=Ib1VHm`YcN@s^?5+Ob?T6167H(%md2llYnsS9&24(De%;0yKMeF!5jWl2}` z@2j8%PPb8ZWKjLU6cVo99n3xXp;FU_~-D(L>Ut@Md?7EgzFk=y2D`=etr{XfXt=9DF=$E@yW)>}sLp%L|~qiO+Irm<{K;f% zt3r|fUrgveYt3v&If>{;J+1nal|+KCFrLg=ogU&bOt?&)fc>Rw*?h=65J`7&U*U!M zO4~rFRw`3;2!%wo)-4$Xz?oPrx5Y-!`S2Mgy~m0m%pFyI2Dl?0x&l`&_|*wG|7w-s zYUf%K9w{6-T%otUy!mRF96QE*sGF3~8r-?WXq`7_B*>kh{&&3i2X{rmLXQ#Ja`2X5 z_O)C_|4q9799>)Y`S(474Ba`qXMlr9vN<#+@~7bUF`GolYPNZT^jcQNKp6zq^>I>O z6-zpmfk9n6pYff+R|uR4g99u~#}(ah!C(0_O1CFbGf<=5jiF~h{<;XJyo89&*TZ_> zTo0PgGC62re(BQSnN>x!r-Y0Vgr{(3P-(i~=aITH`gUNNH0BO2oR}p%19nzP$XiSrEYnSj>4 z`$bIUBsw>4!lwNdqY5 zWgTB$xbq{WG$ZRqkA~eMIs=&i5%AWK9-8~%ijk+9`rV8>C$o<4)Rin>rH@1xQ3P3o zNQRGi8@)jcM#Y}Ppc70#Vhr}u4x?JaCOAJDTU@~PX8n(MV9sU4rUo{%TzgjN-^mgTH*a~(^coHLe)%e{9l>-`S5KxA*`_;GX7 zXA;;@k!Q$&mJ$4T;r_>R>%WQMrgC`>=@D;tRp_rr0hXS@u;oA*n^$CZB_`@GGyju%YICc6ZATf_?qN z11tq=xOQkm^4)x*pM!^*`=J^wTFua+FPbjZd2q@6Rlpk29eg;h?>!$y9VtZ@wxa)US9C55kUM)YzR#bydkNAzT{jPJUK(-W7hx9G3Z zHc0t)_%*bl%znHxwDRO2@ZuZh+?!qUCPAlKg$O--omV;w@b!5;BNLeAIv)!fV8?r< zKJKk~l#iBYawo^7WsFwu$7T4wtUgTgPDuLRzwV#di@t>y{)q6QvH)v{7De2pblwl5 z;@&uAk3at4Y5l`fyKQ@mWu&_=Fa4?wT>1JA>dcuF8@Zgp9Y~}6_J(=O-2Kz~{@CN9wN8vt6b+M8-Gp8@Kq%KwEhx5G_A^A;Mta|o-9 z1)2&zfaqH>(c{p#0y%T&qqL*6&QSQVed*<3=sUxavh+uZ$wjmaS(VbzYsZW7-VnsJ ztlsDBCTDK>dL=xuI`U#iPt1AiuY5c-QBpun>oz9x)@nWRpb7WT25B@x?dEL$qV2A_2EAJxrKH$HRH$E;4L`s(C`FvAWnf_~0(pBJo`<;GDg3 z-O_m=^&14jPkcq##i(W$Cnc`gY>eGK$w>p2kS8)fwgag z2x^VgCH~1q#-&b|vWW5RUf&lj%9@w=QeGf`-h7yipr@AjL+@TBmZ=X*0+OreZoEg;Q&d0Ih1YN|DeD&vDv5lRdG&>V8J&K%nyu_I)bAL%n3A|{J z_Waq3Y{S|1Lg=J_?hZ%M8b-%j)yJo78*>}Fp@^b2NX~U<68tExxD@1RnE^W21#w@0u*D zIM;Ri^GR%fYaPw>*9=cO%zp;Z1!)`Yr`H-#83=YxGYxgk=d;l51%&=Qar$1PwiR7! zTSPYL5Ris*9N-R16j+}RCoteP(C#iTRCpHCJn#3H=NeROp^OHVR&wwfE4qee6 zsm+c=k9rZ(X-DXYqF-m}OZ-o3RPcw6T^0XjpGB1A<0N{G6Y+;pM)uP8cG=D0&Na1! zY5)=&X;n)b7f?)Zna2sHhc)6ePm^WB%J_=yE6qw-Y2Kbb&m>vt4!<4>Tr}6mM-ZH3$nSI7nkoe4u$WCA`4FTb*^-|;&AqQ}q09_Wi@0*j6t1Lm7g5hQv()jW z3RcrmUveG!t(W72!}vk67|~X!644G$xt|aVHOkG zQCf6B@oBd0ejaqWj%TQY7Ub-0EmEb7(t!|StBGE+?0)=at0Qx9Soc@PX`sFjIl67@ z`IH`T)Cx2COx()VcvafQnVgM$&-7u$#c~m?#{cVZx~8s8uV6+xXovIDlHR@P_KI8e zA3I(qO}?c=9_;U@6PEhjgx?k>!P|@|cPKr63Ny<_ zOeO-15h7>pn&}M(Qu^2==k?u(tzSOu?2%04iCqC&83_Y_0`=reM?Kc!U6S~w)FSTAmCQ09LSO>XH1mHf$SZr} zC1#heKmFA-Gl&gL>W+A&PLf9+qQ?5~(ji%b2Y1PU(AL? sk8;9s1*XIdXuf}n2q|81-;n6wsOw$y`;&!CBY=m365`pD<)2sn4;-$YqyPW_ literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2153/2686.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2153/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40e0505b1533bece5de8657f7fe0e27e38638010 GIT binary patch literal 10117 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 uyf-mP&J~@)Hu?tLP*YDeiiZ!mtlt47EbUVO literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2684.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2684.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9481fb617bfdc8f44a1133f369ab15dee963acf1 GIT binary patch literal 2683 zcmb7^eK^y5AIE>pP>3E+UW1-+Heem}q0@BR7wKFVK} zzX1k^4<0%QsHp*fn(6_RqriRuq^`c&RZTU3F`lcIApc@UL#?VzKY9Q4e4e&ZJcpX$vM-Td!oATcPM0=G9 zq-FuAL)1VJHDx!jMYW+qTjl-UG_=6$)Ir*stLD81Dzlop21rXCqy_$ZLQNf{0ns+x zW)IeE)iQ!w?EC5BjuQ?}_l!-wW6#{|+z1a!Zc^PeQ@Q+Kzkrsux&|1u>edFLG6JfF zN|0}_U3CkFY;z(sH5=MH8=+Gi_Wcy&9dts;1$05G(-05@Kmdxt@rFnu47)v^T7yNs z>G(KT9qGufel;nUq2y&ftS$52OSXZOlVe-LaR)@K!>`^Ljg-A!xEQdraiMhT7PBV1 z_nK=gyBp1osg!a)qb+m!cKRS$Xh!VZyf7!Ca^TsQ$X(@$vd|4ax5&+hzV1#yq3a>l5`)tcJ)ZiYfDymz03Le)xAmM(Q0k(9P}H#Z_qhWUF1u)qRFwqnFa-nxsUP^NkX zrFSCb<&(^bq3%f-*`@Z?UaE-R*O?jY<4enO^hq7{QwdT;VQT)^CmHB(%VU2UD>1C| zyKNq-Q{8^=$l1n17Rhh%N6^{l-)a6F6Cdt&CmyxgRG$My%J;RqNsTtwlvZ2ZJSx^E zgrb&^u!Kx+*Lowwj`=HrR|P_va|Xg`p~(m7BR?0X1oSd~nJZ>!w|)8qH;O!|H8e0(??b+%n!T8&!3u-#%;y%TDy?&pa)zU}8pK z3F0TITMfrB_=NXYnR&bY2ol39iRY7Jd9^&Y;YWqrh@io8Ceyc#=McNJ46p94L%|JZ zT;{q2Gxn`36%+wKbZ4;T%MWLI5`rZJ7fwpDqU7@pO~KVQu)sTAant0UQSvP^8*ThQs2h4Vu9II?J6awRZU2Ca3fDVR9@B&Kzj=Hs3a*2-$sle^dA zCrOzz{<3IuPhl!IL_aqza@ge%6;6Yvh3(BGrNp!ynz*V2#2`46zo|JqCaL`f%49a2 zPN`Lozwl@%%{<|5X6oIFFf`Rw9!5YpJeNg@W9%;Q$ulvMxfo}!kj}cCGo!HScMVRY zX`y*4V|+*oab4Lyy0w&m>tl4yE@z%@Frh%x^`{1s#^TvoA3pJh{jOzAgjDt4k`_Hv z{o-Mg^;Px#5g{yO2Jvg^GS_|tPT*TbYcS9{Fi6&PbAHF9!m zX{NDBDgOnXEY@lBJ7neQ!1ZPf=%|{>J&95pteMhr+A)I z<;YUOTE5Y|2<{_V_E?k6F`+{gCZ@6(E@q45m)$KfcJ8U(ArX^q@lZT9rtv+jOYSl_ ziQbK{nNPkGT8~Z@&HGXXWyS2)0Zf!Mnq%f+%zQ5{yqe|AWpp9djVi2+J*a7w<%*~0 z%NmrxOZjr-;TqfVw79PoF)%DYpz3yh$4U?|Mp%nw_IDQlsL0WX?w5P^HkQ&Zv|{rT z;+?kQ^}4-=A-mpx)f0@Uih`> z!U(@H&>uz{a6(r~!)cH^7tBbO)h2;S3|9* z*}dWU+uAh2dp%>CH+amk?1zbic)#IO{ryQ7LjOgcxAgZc6eS8fV;KC_>)HGO_U#SSf)>I!x4T+pD+d+|I7I77w z_j=L?t%u^Y1Hn%^IP=~e)!0LAY-dHmvg5HlPWcyPRs8FNx}IoDvkgBCFQ5@4mt}iC z$x$3^NzP(6-gu!`fdP!*=QqtVr)zJB%^O(e>{OL9uJV_^`JXb>9 znvoWL;Xz>?=GF3y&QsK>q_lzKW#*7w#PB0y0le#4u)n&auN?Ug$31@V literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2685.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2685.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b7df2cba267e5c41adba1abe97bc847387e9943 GIT binary patch literal 2720 zcmb7FX;f3^7QIP`ARrJD1d%`mL@i>N(SX?2LVyAhEknX2AVUa|iUcHJu!9Ijp=bpJ z1FxbWB?&?ZsAW72rhr_p{cBt$?{ohO01R#_)HNhZ; z02Bd%At16A0KF*_4%yVZwG=^#+qOd?O5kH#4F~{*K(;Bsz`L+dZ$O|hgu*r@%{>-y z{$yyFOaiFFKz;-a0UQI;W35Pxxehv>%Nr*wM;JMG^I{w- zS-nqiQKw3;_>wu;k-2N2j270I1olbu-N_;}x75jNDGxlh`mXX?> zO21J$HQ_=5wUE|r+PITkYYQX-on9~V0j|3CD_F>lw zO;=4G4?X|8NG#_I(4ipCW9CzgBTjKbXeRI|s^!OI(ZMw$L6-<$IyiUBbX2)w` zXr>~yc#Z?LH_UY1Q|w&VYm86VJoNVuAbnIVVoEzLg8PH}F4>>>*OnT2RBLk9J0G?B zWPAlvRuw8Tu@KkxkoXQg#irch-b&kB+Ll6I$FofL!-j@N=+rA2{pR5>{N^SN7V6uH z%k}ZS^ok?qlSTRUzmEC7{Jf`wV?HZZM-;qvYrB>8)3^cmS=vqfE-!vd&SLx2dZEI> z$8+nCyx8!Eb(B=$>Z(#vUrLTqAS*i$Pc(%YrK zvezV(w!UXUjKhD6i#l(|kj$M!)Mu~aNte}1g3K2-hV6dG&mJvASwDWb+ui|miJ*Xv zLv(>Xm3a4(oO}zQ%j+bRd(^d`U_qV36N}ah zE#FKBa?&%3UUvjpv9*UzrI;LRmR``f8$E1gaI2+o>D2fPy&I|(c!b{7t$XqK;fR8@ z|81GZz3ihlp$Y4S{c-W4Py(|YmGm*MC|9I!8ODzLIx)-jL^js?qfPu`n(~IC9Xpi% zggaonzXaRT^(6jV&QUTa|F4fO*X>EhLQCJc=<9p=bQ@ECOWRU=>{1XPittz?d)9fx z{<6XEKmC71XP*#;`W~N)*}9*i{h+D!L?B zvIXqD*l{GJDyP%ki`X8hqnbEYO**#F`IeF7rT?4e0}?;`9>(h3{W3j9K;>ef5$ixW zKPAbi?$CKE+YG%PGTi(QQIhF1d!JORxjJn1W`@p(YJzof$0PkmN@JfUA5{7>F?{ut zomcZ?Kg^d;e4(k-w8buuieYO8XYYtu9SM{RmLfq=(2ajPn6{Y@ciN1MWaKPY63x=g z&?Pn}7LA;XTfGF1+FaC&C|)sv#tRkR&dgS(Hu5?74o)9#aD#*^k9$^*gtRpj{V}*a zJ}?7*DRoahvgkm|;PTfAYuZ&!KZ?@=KN-7wxo|@UY)+iduF0jy0kv2kJ5nIZp7)_L zjMbstM{M=ZS&59C8Sm~qnk40k2@`+R8KyK4r5TgThbDbPSKF@rInryLCo(Xc7rU4U z>!_DYJc><5Ui*)O z>IA9jW4?Wtj1iaQVzz)<%~C=SYM{)+hC#FIc$IQBl#jUQ;q|_C@%IRO-%>x9Rrl_N zm!R8Gfp5%(j~aw07a39W77Oneb*7UhTBnw$GeZSfTuIZrvA+9lZHW=d-Vs{S#C;gL)Y z8fdF*4RhPLD7pBZIHq}5xkGKm-TBaxWEsH0I(VQOwESw(@4DY(Y||x=t_*fmO5SXr yHh-r7%^d;`qp@3Pz?0^A>Aq{C90Xl&IT))O;g^>+Uor6o`uWdW^^-?MS^wW84SZ?< literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2686.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abcc809c4d20fef9434a10344a21907c9ddc4d66 GIT binary patch literal 3056 zcmb7_Yc$*07Qp`zL0hjhXiIU+RN6bZ^^QmAj8?RimZF}SN{b@YvqD6BJ0ocoQ%1dY zwH|3HT9PnAbxP~1gi9JKT84Nl5kVtDZp@nLeDLY+bJjY0t$ofuzkT-J>qtIGeg{;~ zI-PL>Kp+4BNe3Vq0UQCajLgoIimY@(6d({;S;$^_c{v5ey^4za_U_xKq`Y5MNg1lV zZ=b4$Dio%suCA`Aa^Rqb+QI#5>S{YqKw#+^S;!s;WRIHCJ|(sPTO_XlsKO2t7^DZt zKtW(ANYV*t?_kP;rKDd)UKS#^M+U60W42KR0Wu&NS+E=!A`kgv3rGem3xz1`KO$%H zojgqK!exryH$Uo|nj_-PzV`^ea_g74+m9N5lb$^+eFQLQN4~n2l~;hsfI)Int07c+ zv5c&oG%oO;_8rd<=#l*<=CLmtEMVUS>s|1OyNtOd;Q)$KLK!F+3OE3(wfbbrYqDo; zy$Z|e46mh##YWm!rxLP_>(4DMzzq3^zl0qmRbw)87xAdbyu#VJ0@0JTfQSnZ`Y+v? zdzhQ9s~p83Bnnr#GT>#w)3!$#?ofv zXOGSr6RP0F?%G%_)TDifn_ynh)AFtMFT$T-1#ZnftPQW}liF%uqx`DKiIL0(bn-y3 zdJEQW(CVQDD)2bW*5p%krn$&}vWulPG~Z{US>F;&r(aO~H#Q)Z9#z?0^TwL2o<BgQ4n9kph3Zc04g+}kp{ zCzbZir9$ghUD*drf{f~pk-Bu{DX7(?^BnH0-ewn1A#36g5m9E?1M}ep5(a>h$-fBy zUah!qsOw#o)DSvP=X!cG%?0h7gP|lC;AvIievN^fH|{uzQH~khxM*imvDsD;WqJUy z_i6d1{(By#Q)0x#RbTS>(EGk?a}-=Bea+@>7@Vwx!Cn9F6jL+nN!gQ!2$#Y5#E|ML zi*$;0N5``Gt&pxOB)~o|KdNB&Ug0qw-h+!A8eje7V~Oq`UL<##xkbFZOybpWPQpGu z{~Pm9O>TuZ!CX5)s_!T9kqLsC*1?ekx1}v}wDN%&ZsM7ldTi zWP_(N)~PDOc?9P(f1KCIvt=;yYM*l~%Ot>QB`pheScld>g`owE`c6FJtS*W(aCoh@SDQq5WH5!oUs!gL(dM*Iilto6-ZluE^jt{(Ab|1M-kBO(gZ8feZ#cP~l+6`4Z;AC$BDu=Yoa%%Xqpyun`l$DXD0yU4)T zHI3n$hq`iXT@&-{%k9>@gKfWmjEEeQog4`l*;su!INgRkYhykX(wL>4Q0cEBEP>ji z==Z#yt#07o7X{F^J}j>0VR_ajZ$eW?(bk!8Cz>_Abc4vh(j{`Iye8(#Tlu3-j2ez? z!8w;57xF;^zB?^p8NGri6Kz$1th;wH0oWe*E~;h`OS|g$IXXQ$y`NCc7=_c724e8J zWmINR!Ly1ot?Gf9jtpvWqKA5y{BT`#|Ed+~l3>Vu;9ps}?KQNbk0QTQQ+0d?ixCUc zX*Tl&H~R*3dL~LcQdregCD6$}eBleK_&#|)y%9%iZ<|(mlei(45}rDKySRj~P!O%* ziKPkM#wuPDhYY|KjU(=)5ZAHE806ZfvrJshZe~s!1+fOznB(BT1ekb;2zQ?KxgJ~H z3Yvze9SexL(v7GIDxFBZSVDuu+2!|YcPaKe(@w$ngdhReeq!6Ou26jw22R&srjUKO2-I@SNl;9zZWIAcwh>BFJcg8m(WxM?KV$;A^gz*)>z?HZnWH__hEehqMq*^Q{BT}h$TrcPI3_7jR1U+AqCGb$&xIbu|J zFW*6F{lop7q2Jc zXqf*(cD)&t&(xsKA(_t)!hN! zbu68Frg>(Wo;f-6KC cBK5_1M&sO&)tkP}Z`Xg8ZBp2kd5~oIe+uAGbN~PV literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2687.jpg b/public/datasource-data/superres_s3_2024-06-08_render/12/2154/2687.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6b608c6a2f1bedee94667a37212412e136fdd9a GIT binary patch literal 1224 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTivNsy6Qkn#T!205Sr6VPoyr@{a;2NNd?7b6=xD^T7<04UGE%)-Xb z2~)zz#LObd%E2kb#xAUAxK+f_Jur3ZWl>30BUAJ6!qzQ7UD81R1I>i#0GZ6f&dAKl z!~vAl5(K(}iJ6U+6=oxlE6B{UkyS|4WZ^|c!{DSMN2j2|#{ah%cz_NA$_X;qGh7XT zD<5TG4S^fJJDhW?e*2uPnfIR|@==9zZpXLjlYZL%+uVNaTm9-w)mAm;=08gN-d6WE z|Gg+3|I=9YQ}y4p(udqz*UInQsatzL`TlETh*BAIbNTd$ch^_^lKWsAkX*`r?cKc> zYRQ?Ga~{1}@BZxE!w2U?3$0`J$(dw&&b;h**@z5k~_n|A8u zv}-nhT<#Gbxh`4wyH$hwq6Q4Rt;M4w=cbiT* zzDHMkU5Bof%j*ZnFX@Y3j(ZZeeO>CN)J3z>{^{y`g$X1_wMy`3+9{Lc`MT}zxw%(bt|Sm4U6Zyyq7=a$nCOcGoG~Uh<3U@qdQDF{K45T z`;8~oF82ykyXE4XlH`9aP+i}5t&hp?BSsf%KUCEle)!Lze_DId!Tj&N62EVKc`vk2 o_=Wt3)T>`Ba(?dfXRF=vl54WH^v*RA-~Bc*yimjpAN&6|0W&i~C;$Ke literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-06-08_render/googlemaps.html b/public/datasource-data/superres_s3_2024-06-08_render/googlemaps.html new file mode 100644 index 0000000..69b8356 --- /dev/null +++ b/public/datasource-data/superres_s3_2024-06-08_render/googlemaps.html @@ -0,0 +1,247 @@ + + + + input.vrt + + + + + + + +

    + +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-06-08_render/leaflet.html b/public/datasource-data/superres_s3_2024-06-08_render/leaflet.html new file mode 100644 index 0000000..e058e62 --- /dev/null +++ b/public/datasource-data/superres_s3_2024-06-08_render/leaflet.html @@ -0,0 +1,107 @@ + + + + + + input.vrt + + + + + + + + + + +
    + + + + + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-06-08_render/openlayers.html b/public/datasource-data/superres_s3_2024-06-08_render/openlayers.html new file mode 100644 index 0000000..cf8299c --- /dev/null +++ b/public/datasource-data/superres_s3_2024-06-08_render/openlayers.html @@ -0,0 +1,99 @@ + + + + input.vrt + + + + + + + + + +
    Generated by GDAL2Tiles    
    +
    +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-06-08_render/tilemapresource.xml b/public/datasource-data/superres_s3_2024-06-08_render/tilemapresource.xml new file mode 100644 index 0000000..7b9bdaf --- /dev/null +++ b/public/datasource-data/superres_s3_2024-06-08_render/tilemapresource.xml @@ -0,0 +1,15 @@ + + + input.vrt + + EPSG:3857 + + + + + + + + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-09-19_render/10/537/671.jpg b/public/datasource-data/superres_s3_2024-09-19_render/10/537/671.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1898e63b673456685db9c4d034c37f38d75739c0 GIT binary patch literal 4331 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 G@qYpI_s&TG literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/10/538/671.jpg b/public/datasource-data/superres_s3_2024-09-19_render/10/538/671.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2db913d30a6f581a58699156589316ded02f73e GIT binary patch literal 9116 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 YfBD$1Lcr#GdD4Ggg8y?f#JQdOUqcKwT>t<8 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/11/1075/1342.jpg b/public/datasource-data/superres_s3_2024-09-19_render/11/1075/1342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24504c6bda55583fec03bf70d95e86d12a60e417 GIT binary patch literal 6666 zcmb7IbzD^6wjUTe9U7&iLqfVk>2M?lq#LBAh8$_61nC+;y1S&26o+z#P7x4k7zqjC z;r)H?d-uL~e}BAv&gY!{*=wJ**4b;X@7inK&fR_m+*4OpQwCsQ000V z#QbyLHLSZE8xI>B3k#b77Z(SQh=7QQkbsbon1t*eF$su-knkSWJrFqsB_$;hDK!lh z1q~SmCB+{m7{I%4u(0v5vGFO035hBG-|e;+0K)sD6A*(LfC<6?f-r6e0Q7&<#K!oe z?>`$hCJ+k;7Xu&fj;weOfQg9##KZ#L>5N18=dUmUKoAz$L+r=o%nI5#c$O@J?jeb| z6s%8lXuMMLDTQq6n~ph!pIUi@g%=im{Bm^1h3=01A0hvgaQD7riiL}ZjdMrk1^tn6 zCjt-n&lwn)ARyL5Y_iAo%nBal6s*Eev~{c~1sg1H7XUlRRN7V^4e(=-|i8ppldl}KhJJH3DEf8Nr=EwC1n#kdDDo0vQ7 ze`(q&s?iy{dp4tWa06fHjos8!h+EIBXy)S8SH1;sEbTF1;Pt<8C|P}>a$TUiR?SQ8 z5b@*fI=to2E35#&*uJag(%lj-@ChCMo^ddn)pu2D;V8ds! z`6l%z#@g3}$s56^CA(y6wr<8e$DvYI%G)QYb72EIrU^`*qV#f__1wBTUx7(@Ta2p7 zs__O`Wj)nhUdzJ8u4K#08Cxt1ia(I;f|&c(OZI{WzaNzCkQnOr6ZoyzMCPq+9+|XZ zXIQj0HIEj=fgR}FOFo4l&Gj>}xMWLA`9$RZ-sp@cAaY;e$P;J5Xl>%G5aWaR$4_KB)+FEc%Nuyqm)WZ&%gysUG zq*X^+3=tA)l&#O`KYo<gnAr~{=>E6O{<7q66#6>k7GSkXZ0-8QBWCvQ$)5!T@s#Ky0n`MN_-mO&;_~$aGpOcp>)tATXEl_ z*?8?Sl$ZZ->Ve4x#@B$ccRJXm!5>b}Gb!|IJ}ltK*r!h@o##|KjfNE}n7W-gR^X3| zju2Kfycg)q)AZLo3ZBC(6W?k|E(ZE##3hcySlL(@{BjmWW{BizcoH+Uo!KX!!BmRo z1j5e_Pr^zxsVo3zg3_Bkj@<(g$_PDfl0Bbvk$p>K3r(;@y7N=p_mG_KqO)|mu)bix zA=j3TTYyMueb!hJ<1m@QvrJ^!Ve-gX5~Uuwg#2n$N*WzzVZ8f-+Gj-4$XJ82L?vQ) z!-|Aq_J0)G}OnC9l0>4Yt}TSE<^pk2H5U zC|LAbqvSb;j5AJF{qzZ-b-koY4V_bU8B(t*h3R-<^gHn*E{YmN8=U-MEs=^X7>}y(^*y%3dHr9>AbQm|wd&dMfP3u$7&r^{r| z;_Gzf@!Vil)cWS}A}R`#nF%i{n3);yKV6KI#mxucZ-JfHti2)OQ$D9R?DNwH+o^gr zi*rIm;|Azd+i3LGQ7{oDtqAR>TYy80H|%Laoy5}P9lP{du|q!?xDC0)hFE&#&oU3% z)p&lDPJB4T{zPzT>EZ>69-^2wnP$D4T>_bIoism; z`lDgmq?m@2hhEpQ#8Yz&k7O9+Zmd==`oD|*08{K_3~GxhK} zIof2(w(V~b9jb_5fdAU+e+*5v8`OOrr>21Wd$2$CR4a1lJ(3WqYFgoY ziO}B?2Y!;#G=HZ9BgEjb47X6*kA{e3^C^xm!D+3vRYLndcdit}ZUOinX_e23%b*{m z%TH1{j16;Kl{%gO0&FTqpdLB6yzk6BJ&Is#v{qR zxz}?$YFVZ3hb(;}DJ;f+`8@v_27(mq&~z##7v$+ek^Oi$rYm7aasE9_zc}O-MM&F( zT+!#S!r6XV)A@+W-J|BzdaccP@jcmw9Mg*5M&G6R_Dgr!ynf%)_7`t`^-O+`6_Vxc zUloY$GE9et*`T!M{RQKS=FvOM>|5efe}gej=p21n)9!m#__}6=a^P<+IUxp@#!Q#b zM9_KVHWvZEBp$v1 z@76y~EnQrpX*9Gln=L`~->WYdKjKbla?6C5>k6g~(>(D_72-}17&&;| zNYf%6FB&Y)Z1AmSzsC23Hl;w=)Q%dXP4pJ9mZ9$ucvbni=QQYw-@wisaKv^CAg%_I zbrIC!(}~b_^tbX@oX{t%31;w~?)7pj6P)Kd3R4;du8Xe&qeH!+FI|u39vIM?yb6*q z>%vE-pYGTj6rr}g5Lz0|2B=AO{%s?T9fHpa9IW{Rjdq>EK!^Q@ksgKOxj#;)7vZ8` zN#yWKBGi1VYE}}SOu2XD3c}cvkNLqAyX9ZDA=erdzgN_7J6Bw%=-<3t@$9SmgsLEW zBvP>$XA_cmF{1oTD&5^Kje7K4R%}3Vg@Y~Xe<9Cbe!!^NtpmLU*dK;RZ^WE39*d5D zpp&ADb6;>@O(i6j;}62`7L=AzaXSa)wxY#W1Z{P?xP3tJBnW|3~m8S z{m7j?sIa-A)|0qgaXD??nO5Uz6CM{xZIZGtyMEb+d;^<|PMb7W8LU%mNclpD&;*cH z5aCc&hROQ~msN1^t=|?N#nex%Nd^3bLF;ncm*5@jGsf$FxG z2#MYi+{3P`=zcnKJIB~{(Qlm&X0v}8W`@bo&mr3&2+nt6PC6Yt0&^?QLrv<0=}BDp`4& z%2;E^msOB8rVIMbq)8~teZ)}bRRtN^^^|1mIGvQK`%J{0AgIcjJ-OeC4Oy3eQVtIpUOrAqvILh?Pg;O5*2P-96xG5t!8& z+e4f@*Kfm0x ziY~qVFwLPJZ8tEAcfr#nTb2+ zx^qpR5x}Kl@cbms(mBBV09dgZ*4ihX1 zV9#b|*0!V9*N&Lk9o4UhX4#y5MJq}QdpoIQesB8wj-0GJfhs_RnE)HV2MH8uW0zfO zUbX;=dU^|ZsVv0abW##6D&)4+?U%MaGpig;u5$$?fsXRp5BNLku>l9E{tu3zZ37`ii@USCTYIMA(%0)%bnA2#cR3Snk+R|F>%Lzh@29YWy zO0T=U3_=u0Y%1J1U{8CcdDkgX?Ws?Nnb%+28iisaS6>gV87%JJSC65((rJ<7ptFMT znU3^H=dzxQ4E{2Q7+0s+R&ua*KrctPES2FigUSJn3jDh+79Tap$MI#8X$Ynt9p9i> z5SjjqJ9am|)l3}(nfWI1RBFje z0~|cx%}INyj@~uc%08vV zuCk>_+eMUdnIr8vh4utPL-cGW#f7MIeg5QfwVu=sf|iv5>7;v;H~##vaRDfXFBp;nWA(sg3N zUE5v{;>9@G0guRyYRhIk&5Rlz!{gCPJfbg0&@Ch$QV3U`(V;Zf_5wFeMo7g76LX!+ z#c0XCYfCj`?<}4~pb+`A#~j56f4`Dm>&mt)rbA8cx!KQ709s1WX8C-XmdoDy@*)UC z?g@YSH&&#%FhO%t6E74d{Jq_rI#q7uTrw=&#(a1ibzGaZ;)yr5P6_Rv z(G|e5hRbe1$!~)5`N3Nk2MC^yD|A4x8ahu{`EJqi=#? z@)(8x%FMl@x60?!*`}_Q1nVPqkMpWBf4NoC<79uFo;jC-m&*)q2}ss8YPr`SJ#}AA zniFzM)ALr0MdCfwPAy{5kmgR+`Q?KL8}(x$WI$1l9#;fp_kC-d0*mD&wn}T z;FQ$uD0RO3a4438J>M{8d!zz%^0%`Z6Yol3luQ#-%j0BbcD0Th_|Jv3l2tB8Fk-k5 z3sdzkd$l^g)t{8t*In`-mqVvG-%Rx2tv^)qk6*oWP;Z9KrX-vI0I6Sz$SvScGL^&I zm)>g;R20BORl*PHf5mK>qy0t7z>>Z3ocHj8Hh0B}eo|k>nE^dtITX~SIfcuzV#zWS zYi2`jI1`(qYk*7ZDv@=Nn=QPSxx>WxePCJ6L%rImTq)=(jr5#WZAZj;9wtlOt*m$B zv6ITJIu>d60zGJ0rsFpC0;D1Mczk`EbH`M2Oq_6?Cn-p+e)rPDkw+gXST?~e1!8HY z7aWjxQhF`Wi|?*E5~;Ub{Z?<)qG5=Yg=iVJz1yw;uDi@o>0)q@=^DZ`!X zn25jU&R;5Dq%Xjue9AGSvM~E(wyUg`@a43yB)0^_q=64oKd0Hg^BZ01+8jako+t#o znoX5ftT@G_bd~Md8Wvr%SPsUTjG>4ZV^jraCK@s*Po#VSi5U*}{ol&NpE!xUJLG2s zc3(4f_05*aU1!@{Rno4E0?tM^Ryi*zJ2ns3IP3`SSF6ab-etz0Pz3_oTY#%Ep&F-^ zhT8daN%IJi>(|(qDh)EX08{H$8{Lr6Pa@7`0xUAeEB+Ze^1V354IlIFcDm1@^g(GM z6yc<%+kr)XxL}FAADd%}9W{&|7;C=v58WCqWg*9V=|*cc>@HK!-m~o?3)QZfM1E%I zM9#^*`btYyUXCiSb8fOv-P6pNez`E}3M=vfHl1~+yZ;ojAuUSsiv5xmvz$0G#Z_mw zvj;X=XE{yp@zr=UFPM5Dk zYK={Ibs%O#V9kUJM8<_~iOqIbimlGvg&&CAn-2On$SHoI-gK9x1%=H9OUua1-Q~&d zF|DaU#)?|PNGgaM_)qX&||#Q~KcMsqEgiEXC{x3xgAt z25v;**FsQ2*AKSXlf6Mh6QRp6p=8}}lNv|z!wijt+8%n~DEB?;&W~!p6LbWZAbH)= zMM3bcZQ&V`bwlGSow_92Zsl5^sswS==?1$6nHPdsuK6FG2T-^g`xrg|hniK0IK927bPAm44F}E=@9}<9ObH`iqC-V%DAI z46#r2X?!P!$u@iH6Zef+#N zZphmGT&@buWGu4;o7jD@xOCI_Da85w&!C&z&R>+3)v2Hte;$S#@+|>vU4Q0XChST_ JQBB;={};J1Nkjku literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/11/1075/1343.jpg b/public/datasource-data/superres_s3_2024-09-19_render/11/1075/1343.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fabdd75511347777e466f38ba0fea0650d080ff4 GIT binary patch literal 5269 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 bz#F4Jr#*G$OUu*XqjrWCZGhb8d_w;pIrG)3 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/11/1076/1342.jpg b/public/datasource-data/superres_s3_2024-09-19_render/11/1076/1342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11aac8f607bcac04f1b2e78abd354f9b6c665760 GIT binary patch literal 13528 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 Skis_RO6B?~LU*~3OaBKmKLJw! literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/11/1077/1342.jpg b/public/datasource-data/superres_s3_2024-09-19_render/11/1077/1342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e776afbec733b5e090138b275ddf4473a3a061e8 GIT binary patch literal 2402 zcmb7EYgCe38U~RxwekziI%bwmc+N39VRvq}IN-W)xVAQ2Pe*5iu7RF`fxe!;{-(`a z4L5BDHtXvfZZiZBM#jd*23t(FZ!_Ay)yUXrB?%M;p3#PHgu^!)ZPMRl^nZuuB?Qo2 z(FB89K(qiT41j8yA!aL5VcmRWJWPxhIbalXGM?)w?3#tXz(uV58;9oa@OWFW@ zgU;4H2$aRo9>sx1#wM1wo)I_xo?E-^w}0&Qj*Oy#CwHvm{U$4T7N(=Cy~2qEKpCJB zpe3uEVA5)BAY#wKLy=oih@hW612tlZ0SqJuU;qRQx!aX#W9t@nP=ehriOI5}{e<%+ z`?Jw_rQBx7G2m3kFC9s$6Z7<(7>PNYIf|)V5+EASC6@8;UKV@B)3ZvtK9&3QO;83ztaszp#Am+8{!_34VICYPys7KOp zI8d}BlSY0R>cq?zgk4bVku(uxQb+B z!W&G+*i-BJWqYkjinw%1+p8*`X=p)9#ig{_d!{(~CL)PlT%5Obk>yiyeiD%H{954X zeP7G)O4ZXO$1x6ONl;PKM#{D{sA7E%Prx5T9R7xJ6+-(dZhXsoFbcj_@AW> zv=`Pj`>+_Z#!GZ*!(7gX`ICY(m|EwdK-rUgN%-MP)uOuCgpw`X>AZvLGje{0am_07 z+NuZZGmL$-qM3Z(eQ@&JO!{2okCr}})V!GmmlyMG`+G_X@*M_w_I1H?b7x0iFZkia zp}Er7R7-y|!lXwi_AgUoIs~ia>ZmswNR0n-!XuGcV13NF=OTgpDA^C2{Bc?kT;~GZ z{HyTG>lFdW$aUT|1S?yt=lO4_B=&@~l%ehEcF(F#G3x0>OrgzV;m8L^+g5AbaL2A- zYG`SuK{SUqFstSBJIFrRSbtFmCXESwChm^;5RER z3X`--Zis>kZbfi|B#uK0S25BWWmYYVQ=)%p6+SGrk9t#qi7)9!@HCL=EMigBWaV9N zT7booqAoRFIWP5*&A)MF4}N_BIQ8u>nqRMNvI zLeoo;$we9QnR!t(SiY@arzD+ZgH`19GCXK{wfK}VS23Eh^Na_=++F00#!TYhgct7l z+w`)(Vnx~c-RpwZ&;-6Xb$B@UU}D{ak(}$8+eO1~e=B3*#;J$6%(%4r^vhQ!u8c>V zIB9d(B6-KB!KS2tId(fGB^eae1N?@9d2g3K;_?|zyx_|i(KF(L`)drbB@gR|w<=?6 zAfIn>(lwB~y-h3t5N6ZTRQ2D9+9VB5)PaX`ujarUS}pI77yHkYUFCPlRRwMB0YNi@ zky6*iZRzhElv{8M`@|HSXdsk~H6UO-+cgk8$&P@#&#O$RUPO_d1vIpvt~4yGzVMEW z>8-*iKT+NE&En!w6+DTXir`5~W)3sVPLDN4&oYgL=MoiTwqk^SWDlv((tyJLTq$2F z@4SYLSo3Ecz?g)~g2d;xA&yP~Bq`@rsz7r=~>-e$; zrz-<1zTCEZNOMSHf~|CMoqY{WSXsE2+@!M7szNAS`O;qgFvI6G#o1KKzv`apYQ2Gc zVuaP*hvKMfp3W%}1MbODz@>LzvSw244pFhl&gbC;6^pt16KL0$ndjnqmofY8*hS{* zPq)3NgDkk7GTrn~Y0~eyN|RG68$77}pdQq6?JMwJL2%MF4eLOsP@Vim1M%WXxLD!) RT?(sbu$Swr>qtj4@L%Lr^ojrg literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/11/1077/1343.jpg b/public/datasource-data/superres_s3_2024-09-19_render/11/1077/1343.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b2524a4f772371e27d79fead78ddecf5e3a0c44 GIT binary patch literal 1974 zcmd6jX;71A6otQRYylx=aiL%vt&R&)nkHIN7&Q%wK!&{-mXWG}Az)OL#vpC2mc=A> zqhX1uP?jbkG$av3Aa0OK0#qqMK#0m#Vq*jhvINo(XPo{h)0zJ3xp(IMaps=;yx02J z`V?^Sr|hKw5C{N3zyhqjz-|Brg)THGIM@g~1Og66IM~|S*f}~lIwBpANT(%BU7VJn zmLQQXI2RNegT-PUotG`gVU{n&U@;3J5EwWEN7y3}_82Fm6Xrk5dK*C5Eil0#cmRrm zz)%qDeZUPw1z}-ey_1bS0t$meZ0$gsyO%%e$cIgLRJJA?? zFjj82ddmUk*Jm#hb{$Ilw&c-eaBk&7=0fn_g4x=^p*EoBi2^C0a0C>JeCNK+B*>P2 z@Coyn*G}9;1peb)!666YuRnZb?ExHNAOs4A0(^m%AK#7qPu^9Eb+3~Q0j%-Xf%ypM zIlhW=ru49i@#&Gtn%?18nZ_S)660KBGRl+^Em@bL&wfZLT+^>q8fmGn)U0!vV@uYJ zcUY_d{l(K&B^fUxC(13=Be}0CBO%Z0+Ez%Lwh{}rcXf<35zyV2@(OykWcQrp3;pg^ z8vbmpt85Fs(Xl-t$~!|9cjB^%(Mfz57;17Lpi(?yrB7I7E&C^kaj`QIkv9I8`?04h zy-jEr!;y5(T4hc|{K*O2*iZ{6aAQSB+qGUY?Q~$nvyNvomF_VVy1|6ap^awq&w832)sDX45&PM(jD(Sx4ZplV$OaAV+h~sD_?nfvR{Rdq)SGViTFGc=&kEZW zzxRy`Zlkx}{wEEjwBSki(a~zQ!>OU1xm9)1g0;e2=Eg2}8jZTouPCoKDS95sgH!em z<_4q^+_|eT1B#A$5nds%L^6iyrfNZ%WL`^B-l~tTxL^e$SZ3-njoGu%>(r@9CL_kX zarUqxB`?&xd(&Yr309bJC;E39b ztEY12*ezdV9|h4O=!%20J?vyrSK{%pP4Y~BwuJIfC4YXetce#K9p#ZMM=OgPFIq5t z*hB9XQaafvO{c)k|IW79;t7h|b3HQKkW|kK>SoxN#ziD8pDAy{R^_Od>&Sj)=@pvp z#Lq@ouYS_;rWj#g#5j zZj9{_`p;-?U4KyA$o(i1TkPROR|#L1m8Bn$i^Sg$9u&BREA&4<=}R(S^ArnbC08TN z$7DgG2~NCs{MNQ=ypLX5w>P!>QMn>nUE41*U3m%QH!sGrT_bAB^+=+>Y3r9cpI~ZP z?DP^RQh_%0(r?2rJ_@;s_fRs7o|~eMCf)c+Cm%U8yIy-;F}0q5J|m6psZ9$lI;NhU zYOdDni9>5dh8m-H;pA(}7m?Fl{*}Gk!X`QV0oTr$als&jaAA@4D?bx+sG5N?dSLwO z(Z>E*%L;l$liu61CyO(0lEX)*jCd7pBP)O$L`7Rj>1tTRvB9D(Dt0=rd^G=@cM)q} zGP5}MV)#R9EBan*&F0U=XJ71|@)K{F5`>H()mb&mbkw;n{|zj$TSMUR zAH9s)Mk#4tc}a7m?dpz_!=BCNNOt*`K)}EvP&VAS9~Apfca3ULsZqRBqOCSu0%d=~ z1AW|{a{0Yr?Pcy5?$NV9v&Q-egw0(}tp$%gD_Xz9Ii8e!7Jsc!WM5EBV9bbakrO^{ z=T?x_AveWe<_nvYH0_KP;2gXw6roiiH>H`KX>o#sce~}K)Wq&wW?#5|L(TW_w)YnS zO4L=I?;x>BdHEQyDIAOFkI$aI- z@$3BAl=5j!N`Q7qDEF-sqTKclSMa>1q~dn7gddg`Bnv8?I27L?i}es?Wli!p2kUy? N!d&qBH<(Oo_g}U)_z?gA literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2684.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2684.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43875386cab70c1111244df6bfe1ef43b7944027 GIT binary patch literal 8716 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 SJf5`IVGl(9!Lv!dU-%y{lD&uk literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2686.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..012d349a3173ce2656f949c196d13c3907646d72 GIT binary patch literal 9653 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 N1m9O}Rx#Wx{~sGJN;3ce literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2687.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2151/2687.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b0f8b69015a835e6f14a8b487891d6f16fd8218 GIT binary patch literal 3367 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Ν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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2152/2685.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2152/2685.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84f53b8974ced23cdd953de3d8c1af6711a74eb7 GIT binary patch literal 10359 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 T-=ZfGT9N;C@}nZ_-_`#CfD%|C literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2152/2686.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2152/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efe244575fcd0c542e4c2ce7a5ded4c462c1183b GIT binary patch literal 10862 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 Pfs}Zjz~2;iv-|CV_3)?M$C&)pg_le}aJQT>k@R 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2153/2685.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2153/2685.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e747498dcfc7abe7e86e336aad30ccf66d0a8b5 GIT binary patch literal 9349 zcmb7oRZtvE)a>E`f`-N2gS)d>aDubAyIWY?f`s7i?(XghvUq?j4j~D?un=4WH{Y$g zb*uijzvs-$%$)A2emd1Jt1mwR_$ms@3IHS|008OV0=#ShOc zsAyOi80fEFW4(TjjfIVkgG-2ygG+#mjg3!?Pw<8a2n4>yBOxUwA|)gO68%Slgz~Qk z6%7*&4U-558;9tBjhA5n!K?rNgn~p5Kqf#!AwYT=1yBM2$S6qv0Qi4EMMFkGM*?8H z`ghBX4?spn{wMw4M)~gz5;6b!adK z_3Ev|%^#a%jXlF3F&CBw12yK3rYRu#g~!hwz|!1>^w_PwPorG@Uawet3Hy$4Wpvg< zesv#ohHnObf@51%a2m3)8dIWMwlO7BkRCbXf_7bd8>-Dvd*k#|)}fEXglEkkTwSvr z{;Hf=J3pddb9N5YfQ0N@unWS54zynY6)ynk`G8D^h=Fn84=Jur`Z9wvt@(B&?5MOs z1&Z|Pwn&jAY=^#+t+{l(NQ^@d0rkG1HEmO6QhokwLaSMp*ttrH6C&x)DqnijEH- zZKFzC=4O0h=RiJ8D{S|P&ljGsRb{G?!*ThwCdxD=q>n(ZvP{C>BP(eMCjpCCfoh;- z_o~BB9@FYeybK(FkrMKyPP)(JDUH|V1f}Xvvy$1m*b8B3YE|rnX%3pPw3pHxlkmvZ zwf7G52U=B1GbWz)p_F&&ris~*(2in_oMWB7F7t`MN=F%7e0sm4toItSRv*Neg~lhF z+Mh^4#IG7NPALnmDOGgrox5uUtS4FTM2)MpeP@0(^OEy?j{^_IyxES>yhS5`#BY}3 zfGuj{Fd%t{?~YZsoQ2(4_9cy+If6f`frY=m0ATHhtg{M-CNNGB=s>6Rc{Q80?ygbj zu~w!!zgUYKD*AB>`y$TGePs4T=fkU~UfyF`0O`}{vW<{r>xZVnv7t+lYXsNplh_*l-SO?-<# z)3(NcZ|3oR6R1#~Z_Q`+p-%vV3YYZ4$H7r?Y7b8*qM~;o8B!eW?mbiS3m4B^&|*wj_s@_$ zY#lbYo`?ggn!rWqg%+@sKo%L+;ojm@DD;+NOP?=*x!Z25LBprxA9h~=H&R`1d<>89 zL4l>`a(i!aCMn$n`AwKPOzd0yC1Q>V8Wb-M2^szA`n(q&m^OnV{v3h61I=+NQgivHFXQ&BiLk0++d3e5fJeQi(5Ygs6Jt2$ zcve*8tei~)E+U8Fk=tJ%0JDm5w+$friGWTq!xrGPgae7v3QjS`X25)itAex0a+c!CZEmAOc z;8*Krg z^(np*Ol}&%r0vJOJH>YF3fyVP1(jT$i(3Fc79;hz9&H}4+uCY)obJmu-T=cM#3Zs^ z!#t~7G|D$UyQgvb!cN2f#^hcoG&={UKu<~WSIh$v)#!Vjnm-yKU1Q7Fy*nXjL^ZZ^ zwBh}0^v!5)3$Py6@a~UYMD5jRP?DB1M+j=!AF|=a$FlSc3d%u;{)xPfEiqttya2u=LOSe95IZbGr>q?kzownDYqnk7yY>DGqi! zvc?bts&cNR8Ms#4We*Ef>{&cb-l#Q6A4aiUrKd}k#&UOHyc~I{N$L)lMNn#@xM&Dk zgl#kA&_)<(s_n4fBnmLnozI9D=8>$u0JNg6R`ScK*wsTE^qjRyFM!mq^%J8(Y=H)Oqz(+$|v~#Z3*6<;LO`o_vm{{9;pBLx>=suFW%vCQx*X@%$lgt{|9X8Q*zS zZRHKI1BcThJNS$im+mg)2jaq_vPkx;#%CvExKQ#X(T!E+@<+Z_@keKwQ@*wY1zz0g zEt_np5I&K^Q#*wO-`Y{;V)zTdE325{h^niu!313FrqEd2^z<~A75)Q|;*3naogJiA zVx53n+qGongP^8EdYp^d=Qyeuxn~M_=Z3|riJLTIypZcu07S>On@Dr|LbZE*&DGce zcD-!s1{oQ9hl9iZP9cfgy8Mb+5sQM2rPGi<#L0GwvLQCNtDyu*l^~>)EGDHMFEZTQ zXQperWPdS2_E;BLMLxKggR8ISCDKBnI!NJ8@OA8CJKo9Hnh`z5Lox*{^0#8UvY9K= z0urPAMa+l=L#px`y_7ccF7uz_RqpG}FMyQ%`eqA%i7A$A?CmN8su-;r#?ko=ZeDn| z<&N=VK3!l(!}RXtO$*9SO~A!Wf;cu(_mTS!+>b>H#94LAu_-3=di<2G@Yn-l*TjaZc=BE?f9S-^$%Olf zN(w#e8Yd0n!Ti%;Q5{=%H;}>p>`x30CU?VCH!P)@3a${ml2laIO-sboCw z+lzTDvg%YY1QHaf%>nHoC@nkQ99d;4X;kKKWbQk3>?{4~u?su4>%_Zhbb6M`X#ZKt z+M`Oc6YvnHI+;sgenhw=j0^h(-7KA9Vd?8i!L&T;o~O7^>4dJdpM;bozHf}{^}eAV zR}a|%^xwYf1Lhb)6uxcRy4I+8NpH_!tbV>x)+o5UFXU{L`K=$jH@SeOmeY_39VG}+ zBFt<)UAaxY4rVBM3Sl8HTwlwJIOiOfzIzPaqZ5?xz9)tRLQt9b3osn{YI*ay2AQ^_ zHIgmF@b40O!FF)k%fCBVlqYSWF?E#-M`gq>0Q{v%why8Ne8vmWj>g4RNO|@-dTym7 zn;%fSg#yxnSHMVdr(&R}SVk=%pZW-5l$jKrzris zH7hJ-_WTk9Jh&a&0zh^`)1f3xE|kkp&;cnanCIFM0?7KnXFFD>@T--Cfs}9<_;bqh zg0+HdZTty|5PMB49miM6@RNo5Z)J3b&$9+u?-NMgQZJ&od*pg=V7^&E~D2M1`F?N;Iy4$>MmOc)k26;*5WJaa%Fv;&NxhO z)_Ql7NlQ^bOtciDAiSLKS!<)Dw&>EY8;>=+0hj1eo`d6e_n->JcGYuUw?OeEY{1dq z@j(eU$+3RU5Z_x8PBO0$SNf}R!!KeyYPpTOEa9BB!^`dg1W}H~fx#Pby?hrQR=F)( z$G4$$?41eCOxAkt@2BvEZ1`&Q07)R5R@heD8| zoQ>jHpM$EoTgFx!6AO}^kV0dq?bRjAL)~G4)}<_!RiAZsS*nU@FRTXFq>!VApHiwW zKuqpo4u6z+TQ>|q(kyVVZ8e88uX~=sNtyz8I7MIQR8mS+ z?4YTZ^Ko(Np8(5=OfAjQ<&|@Z7;dXdSeo4K6qdfd=c2ieb*2@w;fD!P@yDzvyMQBO z%u`-mA@73(-bRqJONE}8>3y!8rBl{-)4yW_Ql-lUgQo|NxnewH%3sKH_7`SnMb=Au zg$DW^;6NP|yGI!*5B8jlD?yR04i{k{*v7MEDeGkySU^=#q` z|7`T81H&uz2GuI-fwQizc3vnd?~2La@MgElX=U|wXSk_G-%;)7E=oRg*@f=;IA4)YdttqXQ$DW)aUK4sUmTT!2r zWgK_y2w&HMVlP{Sp*C(8TUaeb$*^rew#A#G&xjWDbpT2;%P8~I*BV+UloD;{QX%}C z^YH_h2F<{V4=(`F!QCIG#ve`h>3H(gQ7(R)=fy987}cm6nfnZEKZcpe_eI%U_2Qfv zMIM(}Q^PJN8sIAWVaaJ~yBC0Z9?1vX?G}PnuK?5fAkT@%f+hCD2O=+yj4{M3b&B~f zdBYNuTn>z7302__(cfWjg!WY(0Y!I{hKn`5U-hO!;$0twyv}*#TXSzZs{)SK=M%Fc zbLbj0bt8&jN8O=eSWr!Y-jz|%opb40$)fa#8!`NqKeyIebnEr9X znRfr$Kp0i2LL)doQ5fhxnU!_{DW`9?1|=nOwy&?R#{I|wpO{H$b;&EJ?|C-dg>%K< z)9kg24NGRZ+X)7xZIpCZ#*(?5?#4{e4|co&)^ZhDn1pTW6x&k$(uf`-2Xu7{{b8{N z`O+=K?`y4&p`Up^1@MJ5uTTFN{eW_CiWBP^5g`kFg(ka% z&xM0DG+RYTjK>S?hz+T7Pq@o(T9>&9^$@!lI~2Xe`|QZEW4w=p^?Ny|_-ltzk;L3b zIsBmDv0!mp?Fy5p5trHbxZk@wJ8ja*-4eHqYSzwi#^i}UN)+LvPgRalpPiBZGBw?* z#_d46LPgMz%Hvg1|H4$nDMp{!i;|wFoC+M^?YJaaEBgETrW;<8?WVg{W-sSy0kJ#v zQsWJjO~AF)#Kna8G}v3L&u7uS7V_g0CSOkW?b;4!*Jm-;27*7g5i|N1*7!13Q%q*8 zm$r%~$1Oy4m62~f8q2}01D5I6Tw|sy@A!`z#V2!cJ0iI!+_uH@TBZXf@y2KFUGAe5 z)jQ*EB8=`+CRI<^{<*t*|HiuD`>cv8z$)O#=*<1oU0(Xh75=wLgTa22b)YH>#@vDH zuv+BJ3xIoj)Y7rJ`4%6eU}`Jj{Z^yx2Il)42DLabHzoaB=KU-@Mw0?Kdc4lk*R?n} zXCTYuL+qd4gzWNaE6uOYsV#{#F0K%<*`CCJbQZZ8pUQRx^BJ{A&CNuggEvYkCE z{1RDdS*gH>;*mfA3R$pqe>KfDiY;Z@OdIjCBKakW0;Hp)!3ix)`16LjG2&cuYm+F2 z!T(fjxpZcrRY;r9k*;6f(16$)jQK3(*--r)j%DT2SYjKu`iRhw>h^58Lktjp?WX`( zucJDe#^OFk|88&X`xkf}o<%U`c0e@TT{`PU6~@Q<=AP+*Nb9P8aUSA1;o=AyKL0JX z?=V)V{CZa!a{nt&*K_&()_Nu0B$bYZ+a^L{-An*c6i;DR%(3O#YS@qX%T&+REmt9K z56TI|?M{q}{%V=o>)P=X43kk(jz5};5=wm;06ZS{vv$yJ$u(CQo!g%cdQ-Hq3QHe4 z%gt@V(S;Rvz7n@j?wj-xM|Y;#96H=aS28>!LdCN+CiuMb9MTV<55#5G^>H~oC^LL3`gK{oSQfd zY8g2f4{p5C#?%_LK1tlGa}ZbhjUsJV`Q<6`mV!i~->o6#ivWbkyJ|bzjQ&{?+8K;4L;mHD*sla1uw z4Sj$=OoQS(uY`(`{X8%CH5}~76**4zvy6aUqGgzDZkGv({{C>oexnP!P&D zn>rb7gfWF}>Ot^p!ka9f%ce+;NS(bz1xt_R6yfsBvGJRxNIPXBR3jm@Nazbs*PUurxyKwalA*6>?@G8}ab~3ht)25~*G!1_%Ucu618^l~k zU-9me-_U8=n_$OVjcj>@`6OcT=CXu#)t2Zfjk|JA^qd3B#q}%(B9*4#TYXj8w%sTl zvyD9W+u%K7g2*xYr|>VPtJcPhGHWqG>$&Be%f^}rAHhs@tJ6Ha_VuwBKtvE(-EsZh z^ieYIpq+aSAq-IU?y{$mYhis%SmgT!8mz|}@mmWlZ`A;Se=stt(idmg2jF&5ru6bI zp+8I8u&Q_9eF?ZAS(Na_abseLa=oy;VhW4a77|Ssx%t+`uTmpH3Kd;0}I@zD)()TI77dlaJgo^KI1?x9O0?JhDG0UhsmeltO5iFG#d z?h2stgL@c{*@>8xXO+Bx0t3ufEK42`>$&G^R4-SabY{#$EjSOKh*OQkn^u6ZidcKxI<|*TDhZK1|$#{}T1Z%x7 zUlsjBA76^+xqX+*++YAiw{L3+banIJMy51)dT)TV63)@Yu*l#&QSj-Vx2RQJ%0q$> zgm5b>H86yBytJw0Qlc|=uHu?+h;izWYE);rSImB=TMv0y;#;l{)5KU$P3sUP=8dXO zm(h83MAKD%Q1AQrVgpfhDQb1Ge^XD~MM&4Uu_AP%H&4TlR(LdFqV~r&L6#A;ZQ0$u z1GgBx^T`u&;9Xo$Sjg9&qy2b;2g}g!aKoMZG#gvR6_o+Ng+?~j(5ac z>ja4%mzYgVPF^F5vfeCYE@(cD5~D?N_PgW@ljdo}sdl!cGp;$yihsl?VvQwF+Ehen zc%qM70A4Z-rzly*OBRd}6db0X5Rs8`f~eF3T0~zL6%0Gs3b#n{acJ5G>Ql#dgHl$_ zhr*^`x{>5`NR=buw3g)-^dyg0U@MB;b&$PB(_688W6>dNOG2c+sj2hrE}}O|YhB}% zWN_>tjkQBJn^o7Cvxy)#dE2Y+khQE}nuMXX0sRH=CNaSa8MlkwMn4eUh7f z{8h7yGq7&PtfwI<-PwKT9Jk({gmIy275fEnq6p(;zMV5%a&njAZKwewxI;H-8JtgNQn!0NCt`#O(Jhj~RTNXl` z`H*pQAJ90LM_)oD>x6^s{P*19(D<`f=v&v;T--ijrBWb&g@*`y5rgS0CzvhGO6l$35_{qupQ z-cR}ib6rKXi9AbMP2|Yb)7a}u*N5OEGeWN05?&i!50ILXZlK7&R8JjaGUAu!Pv3it zG?tufbbg#enm4PEjEZ;W5n>&0)lN8yP2eh3Z14PFtIYfzf7W-z8{u#*gRn>gnnpRgLyLp6C~VL+QqkX<#-Ya{j8n z2wbSq{m$QSX7B+Ta8I5(K10M3fH2;baaxX=WAj|7er?)OqhDiQEdx5_BGDt(G!Eoz z^HEb?*wiD1k-PGI*A}tfdS*;r(nI_x6%R-%KIvP#%UoJI_Q1U4jw8EPiB5>*kaLh2 z{Tnc((%wVVmQ+1HSQ({~gwHY9pzmB|?*Z%H%1U^zTGF>(Vc=||R_G>IDVH{}jVwZ? z)8`b|NzYMNVV)OA5nMMEqoubxqovtJPnvYxg44K9`3l@LuC*yt$}@5#sQEMM{KEF0 zG%nZ;bMY=^(vT@bxG_qq$oRPE&9~gR3ECJvN%AD6#-2xBh`y?TuP1^=dx__J#0PVI z9aSYwfl%+Y9ANAh>*~xs!J@yJ7&+d#9h(}r(Ph@lMC%Uh)plhydeqz9(X9^s-KLkX zq;I(5BYauHTdfxxC`y1p=>qWCg!EP~z0E@ga$n%eUHh_aptHrurkypY6%zwG`T;iy zx*P`o?($}ooqE(lS31pfB!odG@^hk#IdA=%P?lZYgDG4f!vouI)BLaEcQj!HNyIk- zcSZOMAR$$tJe+Fp+7`al8omyut0FU;^(d6+&r%GnI6He?oQjcbcS%|VmFc-WI}$`b zmc5*Lz~v^w^+y?1Fq`w8(c^>GG}>aAM&tz7J2g4~VRUv43$b?t2SHFK--ym2tDQR^ zg~1TFD{kpHNSE~8aq$J;CZ!1LKT@|}rAKe`bo>lZ9w79TRzM40|2gcvDxw+DrF~NR zpbt3l|Cpy2&N3Mt{l%aA%XDW-ap0m}N;>#JQ!2TjoP2mCIz1oUGL15zx)hz-XPaTW zl>qK24PnZrve>p>8uG}p-{H4dv6y$Klx90}PW(E*D|*SCOaF`UtodZ5Ibq0m2Dfj_ z7YJU`XmKEmczwliE#pVGVs#+V&=M?4l5trlK-{~ z$hIZDtWgJr7m9%s8ikdO_>}cfY0#-BlVb3Edw!{Wj*p}^VjiGAp1}B)6MIj|#FB!@ zpP1tMu{1BG?Sp6Ex3BE!3_w4%i9}x+|-m?U5I^ zkU4IY=d_~;S2z)D{HdQT3bQu@IyyEd{ti+dB6D#&U1*`0SiNApvI|I37v(UNEDus! zG5E6e4yh737*Cjz&n3|Kn&{xl=|Yp=!-ouWp$Ttd2OQL2qf;ti?N%h8Wx3WWjgs)q zXVa$gn>(6%JPQSTFeAR?H1v%Qq#eQp(tM9%WzEG$V1MbjJ@sS~MT5iEd(0W!#3<7= z`4o-x$6?313QM0{agd}pUpM%Jhx@mf-Al0+Y(Wnop;F~yef0)QZau|KS;&! zXZyt0+i?ju)!xzkKesOy^HQ=DyABJPmp2^)OUioYnR11Y^_UOURO?h6`Z#Omz?Z5R_@>}&Z;{YXQ zv-j64A%iRv`6c5TcJBN%f3$|hElF-ZRrPcCL;WW@cLYDBhS1OD{_aC2T2H$aWGQRI z3~`?X#ZXTh@G?4w3kFNoh43I4T^d9XCOV5v5qz}Q4O0hBi+jM&(d+|7IfVuvzk|AkXHVn{@!86M`cdLM_Zbj$&`GVIMchW z`m6~nk%y}P@65Emt#I92u@}GvNUGd@{Qhh93qYLG#`^4O3&OIPzk9414bwzog<_fBSbnJ-7O#>0t!k= zy?);B_5K0h`#e9Lr_Z_0b?)oAU%cN0P-uc7U;qvd0D$vv0q$1-&j3JN-2dbs@cs!t z5k5X19zF>nApsE?2^kqF2`MT011bvg2b2#;NhxS4D5*g-G&E!n>F8-e^i&`k(0@U2 zfd72(@QLy9i9zI~j=-1h(|iTnu-X^pzgx$&DTSgt;4weep&y@m&~ z3Qi0N6AdV(Yu^NmR}2Wa$8WvEyDBv7PS{SHC=PXO8gM(>WHbn>0_AQ0LhHXW+*9Fr|79GZ_>T4b=lRnGZ$ahSH+;)wAN!E`goQDu5e2sEWA6nOC zrH{z)CE7b26JGw}F9{&wR4$|-#516@RP%3NN;hctT!p0l#srfSUR7zgy^n7P}G<`{2+)xAR&0a1an7TlkZYwk@K4 zcnD6Pm6=$%Id2l(htxsXwQ0TALN9OF#T4iXldAJ-oLIGlmG++0-%fc%5#lkYZ^gM- zqq_&vY`RKCon%OjT4t#YQ&tU9$sg8ApDmlo{#M!lc_|J8ZqAOjI0};Je>$D73D$@3>QK3F!5@<%;|+bo4M$wM%xjeGcU)Q9{3jo}rw-O-oogINaN+3S)ahKk zLn#k|e4zXTB*^+OA{#@CTtUSjDxT}B_AHlWt>-$-I5<~NcypGa*XASRia#64cl8lAF%^Rksawr^37BoRH2?+X69P`eiy7t8LI=B{x3*0jrw({GrKb;fS%{q#?Vv7 z4~P5>)VN=}dp`R932_J*NNyo8X|$`|KCTb?nf*XWrMxtK*f2*i~&0oWOnjAP>a$M=92rt1353D4?|N?DUZj`sE6jA$Snk2@YJ;HVX7 zMOUaxOYk|qJ}8Y|?`Vs7u)^D>!|dII0(;AqWaPQUe*1D_7+*0X#sfz-yc{m4Gn*05 z2xMo&V5aO7`lFfj?7GoeLS6m*+Xoe%YkA+bGOi>adK!5F{~h&p8fS(ABh-V&-VR?Z zA%O^#!$2}pk3KHLOL`E#Rc8vT5LL5g&6!|5TC5UD7$h~UrIb~lBubL-^g&-@#hGll z^>g0@a8LI~P=yw=0zmvv^;<=aw98ggDb3h0w6BJ@hl{lxnK-IHQoeVf%;}@nU^IXF zhZ*o1E7H-tJZjKae<&h@iOgDxP}pjk58@U2BD-DZvfXf5TRugbZ|qxi@*GE!S9TE@ zabaxT^HWHUeDt9m`tOKzG9V?%o;Q0#jV3??(NIb3xJH+TRo6~DWgg>LYu1;Sh&qaJ zZB1!j(JYC!{1Xe|S4|zC114QO@64rhIgV*FqG=U}{FIV;GJ5q{P(V25T*GIKr8w5T zr}3+9$bdyCqhEvWGQs*%i4*yRB!m!zT3oc#e;iV3S(eZHC@FI512mmT*fa+D9I0JD ztSB_5{f8;3ncP!n!rql-HzjsmlDS^?xap#8f_#cHU$H9r^M&NMH0T4cE;;oxN5YT$ z&*u+n0;LFp9EDFZ><6^Kca5}Zzt7ZlghP}>W1MCPR(Vvl+<8^t_8xC3h#of1_rApkb2Be}ed$taq;P=Udy(M(0kr{U+lZsm+lD@UEg;vhin*@J%}0Rya9Ke&j~w0N(f>tlGwh8f*^L0+&mVCgqWt z5ffg{a=dKNgKtBkG?!y4nSQt~^qV6=5RdCSO zA;~YNQU{|fX4;s4U4tJz{%wUX(qheq{^%HV415EhfwZI;N1IJ0-yS~dM1AxhetK8| z)Pzpy)GllfaoT%(Np`=W8TrA7l6GP3?|%IK4y7f0>?}&e9t_&A-p5e3E|Y4!Meh9i zglU}j8q7<5ExV)N@I`mte$8@UHEZ0oS-ML?3#Q=5Yj6)h7f-8Dg$LIRe(!Z)l|r8nu@P5x@`hp4O{Qn1=DDK4tAZzey=&q?LhzD&P* zNgz|ZaHoJ|5|X}&vdI0sTazI(xU`Cm+!`1;x{IY))AES)2D@wo$G5eJWAgh4Yl_VG zP>fec$F)7lfvK_sIzjv2et$cNw-{krhwMK<`DU~|W2Xn`2Zj}rfs6xkhoqqzD>=(c zou0-Ri6`ghp>sd7eVG&(Kh69VXBtcc+a(sePYGYFzVE&~Kq?=B46m>JX zin6?z1(Y@=u|Ks{Ke8Aja+v|`0HolBt+U9Q@~UtFYm?@uDV9&F_AZVXPO%8rBwBYu z@|()|T97u;aShrwb%MUux4sPdCvh`E!0H~r2(+AKpZQs+k??9`j8$;HOXH3QRS4UG ztuKn|;Z2rxyihZ0XH0Z2e5tosP3%O-cB1l(ji@K-mC>zuuK>dOAaGi?$&HB`BmPTa z%GAdbR@+niWYc^(`SghEaMJA5(i)!@EvhulFT13Koq&)gcQ46sc4IPO#ts*TY1)Q3 ze1r$l3piP8uS&9Np)ZFHryUL5NT3H*?$I(r+sBd7TG{a-w!m|j=C=h&&UIL6q@WLc zANN?=oRvqu?bW=V!38X?js6OO4Ha(vRjOiS_VqODw`p}DvR}Wr4 z7zR3^niLcb3aU%B_Q; zGTynHT+-|Lz`T2a8-xynlj|$ZwTnWE59oULb}%;dNgVB=1jB6Io?b`ZGCDsyQk&Wf ze4U3_ScPy3YLqYAwuPvY7DdJ{|u&}0rKYW?D&@<{SNc?t2s=R7&+(Y zKN6;_1wkh30ze@v+l)y&lkdWc{1{tTy>%XjQdcPo9FdnSzV%gdN)1gkM_6QW17cYD z-G7XbImzs-q$SVRjbpb>k%1TV|K6fZZ|kVoORb;0EETHDA9loGcR9Xu`#KfrPUuaX zIrhosdq7XC1;cBv5vgiAv8Sl&dh1m~U(NM+g_`6MpYIG;FhcoUDWX4Temz_laL$8W z5xLE}S3My#ue!^Q)e5{A4jR{hqYz8Fr`0OFI8p+s!j2msB?J0BdZclFYt`krW^Cgq zRvXn9uf}*L`UnWhRKINF_UU}5#ioAYR3)CasE}-Hremyju*VNa9q=HM)vD? zNFAj`H4!G-uYI>46QzH*zDlXQ^>&O|&OSRJv3)WY)^k~IX;ay1y2StFcHYjyp{d91 zU==HvR&!ndTgEv=XW4^2UTg)LA((lg*g8qliRj zBCd$%wyQ7IBu9-^jmS$={Rq7iBGuH;W-eJ%zvq?Hw_cR>?Jm)X{mP}9Y#zLIOBK7N zIAr7AxC$OGtaNy~Tjb@$W%p3_!~m_bX_sBiU%GhyJc{M1B@bzIz99NhS1%6pv_F~` zH-!UufP$vL8q1O&Qo7Rxx_uep|NMfeu4YucX62Jp(?j12d`&8%^2Zv_-RNl*bx4y* zg3*Q5S+TULihB7dGuA(7;n##cg|^{MNe`4>^TXV2tmVX*L$Zu|a65}vCJhF6rV)!d z!TD381qqUBO`OmyPrc)gYE6rJutr(06?x}xW08`=^gLLO^&{IOk!`#!iWuwv_KH>Y=7lZ?$c3^8_3=+RCizvxpd3i_ zliUzh{0RBZ)Ll+mov=fYo#vU*k*K;<1^rFD2F86zf(fB{J7>21u|AiB8IGtu@NenP zWc#+&^xK`b?%PEwtR9*yCaGm!^Be9ma1N8kpz|cI&1OEoQUQ z0l~$hfB0Gx99$nLL|UVtw=`LBu6A@_L(eoWB)3Xv_0{@MH+PEj`IiDh$kL#lw)mST z+BFCeJOhK5_LTm)dt-DCB>ktkAINh;$R{I zEbCPM`I+wkmEUiTUdDT2Q2N%grd7dog&cAoWAyzVkobrzxTrj8OBqkIkorvTn1Rgd zs<0SC`^AhYE*hN6#xPP{T+KpjXWT&Y(0>&L9cobK4k@C&gFFVkFynDr>3BNX@e2M< zK&inavJ7m#!0hYF@*zT1cfh)K2eh<4xoq;eh@!d}$^(Rt6Sn^(;uF z-M3suPdU)Ftz7uLuf1q#0zZzofG0}urhf7I05eInAaoBfj*~a``?lko0)mv-y4*Ba zMXC;U1hJWbNu{SDAiZsF{%EDqEX_Za(5gx_hjI_AYh5I_>3q}kim>e> z*|DB4G{}#a#`>?>^JTsL>fY{^d@OIQcz1~8ZJxR-Kv_I&K=gUL<+MtiiCUAG?#Apd z9UNKL+F3f=1u4XtdZnlENBiWLk2=PM%*vK{zI6&uX9`P1h1Pg)r4yLH=CAr>ALd@( z(28K7r%wqk4v#9SHaWnZ-eX2Uvu6An2<2UA80Vl zqiee73i~RgO5Mlvn%+m{bNLucWOAuOFqZv21lZ`Qa1U6sgL@uY`P3jidux9pA(}cP z6QF)oZe1eaaVkoXWs#@T%*H)_(lOgl+ou~|hS-=(`tVq9_=VXd-wt(i6h0|)1F2E_ zh_9TaRPAr*V-qgCg~|)snWD0@^mspnfL00UGuuzy(pl>rbBovHyG1@8sSZ>`QV9z$ zdUfSe$%v0odnNj_qOaoMVpEddO``Cgd%#OAsrUv8CwfPP*ZWzE!%_kdVBgjW9uI-q zj2nW|`M8qiEY(gdz@d_(*G9?3FMJBt9A&z24B!6Yp7vjH3AqRC-_35HnR9da46W#tdMHb_737W1&15Cr$gn=^LP&+mCM1J81Bq^vUu zd148r94=DYmC9dBhBN9-1pd6NYZrOa6d66}E`l>IvQM)75@pMtcW9u;=*}WXjOY2p z{ut?QslKVqtuD)(hWjOCq;{)pW~!R;OS;}O=+!---~YRvvTtZj%H2o*-*JwYz`U)t z{11_y>|U4UbPc7C4|o32p1JhsQgOv+eSAb*6ETVXm#YK{#(X%s#8`>;XxMDT4%t=V zquw^-okNWH&LoqnL6H5GN$b2vpLeDF@OU+XsHddnqY@>9qa~j`_p+ssxyEaAxT`(q z5U3;9$7C4GA9ndIeS6SNhXau6V%cDrh%7gQg}%#55k3(}g95p799^!{G&T)MS;UV| zZ+mwJLkC>*2e$^e$O?Hvjhj7f#Qfj?)|xjQUCO-jVkoy%EXTCW4=EEyTM)|(y6%4Ye<2F_X`Wd%5EUL3AH&Ab>yjlMRk71PFwdwd#G59kVz%cuaJ})CVsGtav zR8TA|%Z&kZ?7H)WXnHy@tXSwk?*ZIn91haKBtCgtU37*nCg#mhKZ~&fJ?IA2587wJ z0~W;U?Og5KI|Jd3gI@-7e-H=A$HYS^3)troOah{HMZPO0x*8~gtQ^;V9~gU(nydEC zamEq%nL2Mr0@yN$04Goz1gfAq-84NrkQ~At*)w$zRfO~=9muli7{9{BbWZn2?-CCV{vNYO0 z(f*oG_~01e#M#B*Hxle; zQ^FW}%Y2co0*uT_*=c5D@24~z-sZv_4WNm{!*)BvYzA|bDjnmg`s*ihf?y~$KW_xM zFK5(p<&E~^>vDbQutv{TCV#OudUM5PGPL-s09x1b-ZMO=hEzS-ES} z9|DtAg?T&vX=iif)5s9sF5uMfQZczE94vvl=464OCk6VP$-Q{QD;iJb;ZoHPIpe`8 z8&l?BnnEbr`@vaRe#NJRLt}MzzHvbw-W>#)udb1$ST#kKenrhZQb|vXJV(d5z$Z=; zKE4boBSUErv|&se++AJL#@J0+$tAeliwn58i{G(CxSWg5&ydzRG90H_mZ-mZY`RPk zQX=JL5N0+mvccbn(Yf+fK=id9Hwv789wP2YKL;O!+uKjS>R4Y!T z&L$TD3?jX-rQPfs{+|$kGd~Z@rSjC9jsc#QY)?>QK0-`a3ffAW($-zgW5@j#!qxpb zA77kg%9Orct<`1ct>xFUp$Sy^C5kh0H;v)g^O(z2Sf7=+f-Xr~Fu$i3^%5=9;=#&5 z*oE{a%=xhYkYRZV7n4@?HVL4vF!@__AF=Vb_?&TtP$P$(p7nq+b1Y0&=r;>vT=($T zkO5uSCls}FbPZ?COFCyY$yDAJD&zd|b=h0SoA@W-RqK`39pKBNlC~HyL}|V2O?`;v zHD?9-i6OU}@(Y*mrS25PMjzIks-o7HiLNL_>y)q0;q-LnGihp%qcT|DpCT<0>69QtZk(wNNgQ2;RI0nw_u%H$$yAnjaj4_z??0=U65vgP zEPFr9@hV;|aBSRRv`nKu5y}zor4^U-;o$aFF3i-=%h(3TJXIC>Dn|J z`Vf6lxZNSt{A4VhntNJHu5u?GKB<`L=k9fk?%hgP5L?zmJBKoFB^S&E(fM4H5v*5Z zpG+OX4eLl%T76UF`_l8(2vNH8ryVu+KFlZDe^fy7HYS$^m`_GoqhEQ5qF>8MR#*A! zj3G2jzIe4jTi+v;`B1E3d)nbmIhfmJ7L~M4q*9B11Hn6|=g|XJm4AsUOFuAL17X-K zi)c*+64cc?Q?V9#$-t|U=N>dW24lgJ z12{aypiZ~L&6A>(527gL2HEJnIFq>z=y_Wi6iW!g1{DvQ(R7BQ4-Q`$u2egJ&;>>R zt^Si6!fDEW6Sqdg9g9{2AI@|;jPC#u4+QDu&B&VVOK5CSHOjfV@}(BzhWuuDG^;IZ zU!f0^URMT}h-vpE_v8zXuxAAVd~PeF%j|_nxq_%i=mfjw=2H_tO!+TWHxsy%GQ5TR zU?0Nx+PocYf5MH9kgY37K9&+FHt&>N9x*5CvF_we|DYVNeb(5@q0C%ak_{Fi}aM-t|?iObIcE0a1cQa|8Qh8!l-YUsh7W z_4zcPXKFsOafgI=-R)DR-GFtTLZ&8TA!g2RSZ-65_XAY4+RZT$^uguxjIYj%ccnPo zF|qJv7uIc0&mXef`}jyfE9fGAS6?0#fxF80u@xw3I}e&8hz!?Vgu7RkcpP+QY`rSk zK#icox~GWXE7)>wUrSonZsr_AC?ejTz{|N#2r-}6-Jgh8F0Pn_?Pi<1KOw+d1*@?Q zPBY(FfcY1>>SYOWTSKKW^{&0NR(bYP-^LEu>|HW^XM5Rf75~^Xd(vjo-v(;$17-=S}4VRy&7zFfegHsBZk>EhjFl{m`QH$YrlW^0JgP3^jls z70VQOlB1ko)rJg84&lN)vS1;!{ zubc?4`^_;qmO^_9(vLm8P!lX%D}j04be#*LQkNn}mNf4~T|2!Dgo9U+=1UdrofJLh z_Gge+-!S&+(W=R+5Ro)1&*4otl;`5>@I&}wk8rSM%VD^PjXGH#&c<>4OH%dr@j;sb z(P-}NE<#At6zN($ok2aiXBTireK2v8lL< z)bG>~EePJ?r*mD8V8nIFw2F`^&R&C%`MR-J%D&7=V>WTYKccdFlQCP|NO2QQ{am7I zgf!>ak6{~RI_Ud~(iM8LEXA<4Muy_DvM0dIyw}AUAQ#4Rcg>eF+eyqgQCP)#qCz`= zRC>wu*i`v9ii6m1!lx*Z_I4Znh#x|Mz+}Z2v?W_1Fl>O$Gw!v~7QF5rP(?2&p;FedEi)kA)|K$*j0DF{zVHL$fjFdCZ*sV`nYzqP z$X@i<5?7R<+OYf~@V1qbOO_LSW_<=VO~mdr1Ocn_jc z!w0+~;zc+VGdd&T7i#%j)h@kYO`?A0Sj3}MGl-2KIRqNml_BE%)kPI_&D3BuMx=!ZfZ5E3!>c5ZufQM3|#$wvvJKyM7fPB z(rYSo+ZR#zr_vMujkD0?23|v{o)!9_@rbT_=a}N&pEVx`IuBo4^$Wpuy+eJdxB*Rp! zHqX>oZEK6e_TO$g)Cv^Ks;seZvo!-5ZR^x%u<2yq;+{^ook_O66U+_dkR0S^XoTQH zYvwD_M{gU(m<&@J`&Xa26e$CbDr4tfM1+5{-tIKW!6vGg3ETr9C+6EOjYw4qr)W(<(q~T-DaMlH)dQZrm+bIDSU0Un@$A>hd^K)W z*>ysKg_3gq5|4>KfWn|JOt2QV0e>~pyge)PJ63Ge1`QXqlXk-?c-^P6oiPF#w- zEi~q>^rY9&LA4g-Lus9$7Ay%S>dD>qkA2@(cA#yTR5x!>i;P0GA}oYou4n{aa8TOH zaAt;a`)(L>G}9UF1wM1eJo;7YD8HC0c==$+pE(8dv-wnUU}R#BCE2g-FKEI8Ph3>y zkP&x9JM4m-VhurDYw2qEFsUly_4n=%WhyWRv53q99xgUyVasAb?(^WsiypplP>wI~# zx4Y3f#9MfUOlAXO{27Dv8+!KSjP8lh0^et;DB0L$dd#>K)QoZ7#&OVX@WLxD$)qjXrF*7@VxNTw<-`mN*{8#~*z zVWV?58<9X?McLlf_a#=%$a9mItTPtYy6X%>yWEL=NiztQpW z5|USst^y*?b(q|l10_6zR@KaNjC1|C-@cA9sIn4Gg`0A4c!^j9m5f_$fT#niawA@$ zM}Q++Sz46}9yAps^rwVyCZjVvqeTS`5)CznBke|A>Ja;NNI96c)hKQV-TDW{^XUTe znS0J#U8Fx(i}{s_8g+=Ex03(hWDODh<{sABnlyl>aFNR$mh>@7et?c6>#M9MxnTR8 zA@?TP!hBATC<=t!@W;GLmx0_?x?sGC%#(Yg|K0TyvVql@34l?2DX*|G(!qL-T4f~O zf)_*av#l+gQwERu_4kZ|nM@7(;jO4{_`1ODCVawl)vZ1^fXR0&v7uJhNbTJ_FOW_{ z{o+Stg}%K1S6I!LC)DZcgWNH=L#)R404~*K zs|E~`s$`h(;KOTG6;DpbG4vsc^pHckZYAzIVU}q!chA#G$7mC) zAWgzGC`Cg8+P$Dp-7sXlCK^PIF}>?ehfBt(7U+iL+l)m@j zjv8G+Wu(K46rT52C6d<~rVE5j@jH{&LUyt;LaB@^h4Gm(G6&Ha#9(IThbZZ@c>&z= zKm?YpysUIH4E|7Ip{_NofM%FfwDxM7r#gdqUoQ~ zUeQ0suWYv}?s}j*DuM+asWIuhM0L0Tj|Gnyox9570Z0l0=cn1PoYi?*? z;35?d_M4;9emXIAqZYNez9!S$#kKQXMwLfiX}p>a+(Whg1~dAbx2npN*8?Mrcbs#A zeBJ<>fiFZ_BeCT=!oPLG)HBLHOm^del|_&~mSNS4{wwBdwO{JM1cc!C6GXJ-J_tSI z{JY}=nce}~&5(oa@X>C)>}qR@wmHVHTEo(tznV2|ORq6j`qF`o+MmDC^EEu*aD~%} zNlVxSIE_5Z#M2m*>EmB-E@D_eY_}3PQD3scKq0_Xjo-!=(03m4-g*qRmeNYl`j5ea z_Vgt+j>b3%J%zk);}j5rKH!PS?ie^y=fU)rtRnm741Z0@Il=)j@2^rXK$zoR#*Rkl z`5@Gdt2l+z%3L!rY$Gpf(Un^{-^WjfTJ8avqOGiJUrHFt1GAH;I$OvvbZG}sJPCY` z3Gdio#u}eue5ce#Z|BYze9=Oj4=yFa#)Db_okzv)KK=v0gsilu1O~(BHoiKI8^f;K z56Z|yElOj&)&0BOuhce8Wp`Vk`%=Dd3|dQY&dpzuO@9pN%4FCyS->a* literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2153/2687.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2153/2687.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c5aa0cae38840e07550afd27ba6e2825cfcf2e6 GIT binary patch literal 3695 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 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2684.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2684.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43f551605fd33883b4c7857c7df9ecf05751ad65 GIT binary patch literal 2792 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 Q_HVX-!TyhdJ<5^)05mwV?EnA( literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2685.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2685.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b8a0abbda7f614e9bef3b404ebda31843ad4d81 GIT binary patch literal 2816 zcmb7`3pCrw9>@Pl&=y7NQR`7#w`KcCJ=)MpB6nM*y2#?H#`BO0VJ#7qsM_vbmWF2Q zy|n4wBHC`Eiv;!R-3nIYaR|cSZY*h8G>^MOA&*F16j7>YADw>KYn* zwf5=k)k11%Xy_Q|Aa(Wh_4PHi_Zu4M8Sc~5*V{G%LqKa(RQIT=?$O(;u~+Z^PRf4+ z$lcpa2$(qlN5T+Dm{I_kZeyy#wt3&BT@a$$9yn|_G>q1P0dN=`p{9y}t0CUZfO;y( z-TMxzs_EK%%-f}Be#p}{B>u`*`uh#-Z`?k0mI^I1hU_6AqkpohvTL_00tSZ$k0GHg z;i@Wdm=9yI?3SQy?j*Cv+dBR9|8H z$%q*wtMHDz6C*Qxd<0$OWfkRDtpp;&AK}S8cP@)INMz&Sa$!Kz;(X8S!_m}I{jN#B zS_7uge!}-~{nI=2qaCK~>Wi<}#dS=9ltB38o{5(dXx*IN5`z=xkA&X@7dNiWJGn(G z0fsF0epoFD453yEY(J;9hSS!M$-hyVHu(eZT>~~m8Jg-kIbi40c5AR|=|Bu0yggjA zl!xZ(Ud|f5SZB7NO*=h@6%D6pCn-E`-x_lss4f=TFaCb1q?vexWnmAd?llj7aQ`S6 z{Li&Yp>!j89;XEG#~^^Oz7t54!1UM2_A~fsNVt_I5+oc1#7ZzC7kO?LC@#RGvfqKc zujit<2KV}nk9eG3un7H|61Z8&>CBsQkVVV-FYw2o-IeKscC&G$o?Jd?pB{OhWHnUR zcgDKCw*8^$!If2C%-Rp-q%|cVDe26=_L%=HYu~B?|K+4ci{}P`lCHy5Xo)m(91j-O zGHaep2lKwLJoA3*cP*`YN#WGYOLbx>*ToQ$e zmY0l)S@d&exwXWc=I>TJvI{veHad#30m`t6ViMf4)JdJ?(Kjl2&oaHl`cLQQ>1lj< zgXhulYMFI|Xz~Nn=`q{CW_TK0TWNs_P7dW8UOV#bw{yS!66=8>@#2;VynsFt|5+`M{COooS4rU#XklFMH=MnoLbrvCKMKmwgu&TgB=YpEMJ@2|BphF`*2{)^ln&p5k`m z)LMpruYGq_vKYE!y?=iX^0tMjIfIG{j$FyGJRTRu>l=z5z4;<*Jc6`ha`FRF z{!TLv7qe->dfjf$LMttK*U3O}uvMOrlG6U=nhf8xT9t*g(Tbsl1qFSG8PeUff{toH z2^cKY>)f4VPC`oEppGOKV<`)oZFf=&`W!aPVP}5Y0Rki%jM_Ra%KB%YOp&7E1B3XP z62n`AVrl=cT`B&v%jq8&zZzQZ44BbrtgAJR=7IJpJzQ>e=OJfF4MXA0U-X?pBi(kG>x|AW*L#kHwZpdH5tUJQocTqzM!#J;a7XkI%mL~3D@*r#8d#dIw& zbz6QtoaD20X9ew+I`l2uk)i~^!woaB&R8_3SK&N{^VTMy(+iL{PD zCw93OSBYNo9*NZgY9km;zQAC1C* zj^4>zB8YN>6fBs;w+t_hzu07{SU=%lum>RDi|DEEK7m#OjVLI!j9c@3 ziJbltx zmdNvv5OkA-x}vR1zJpiV3Q5s(zcI^7^=79l4ZKeZwCU`$3VE@o5pl9=DNj01M>*2o zM3w+M9D6@RW)*Hs_QmHyXdZDp$NYZ*&+cLQggztswmsx-v0dr^u@_K*I5CDZ`Y3IH@Zxum{vD;UuvSC z>kUo268WHbjV5JiQooie0XpS?=VGf!{m>^SKA?DQRl*3m%G=m}q=r|Rl=O~!I?vZT zM+4@RK*e8#UUvya#Q1Q*`Rm+bH|l;)?^xeN_=A>(1g6zxZyNF+ zuR$Mg!&+UuwJ=2HcZKJ*JeFp0c4Xl^i4yWKqfv&VdG-5?`;-4wRd#5T+P_x(bxwR| z_h%c%?S}*#iSu@n;3yf@yqw#PPIkmzW#P9!6$SjaZ#X$Yel>VoOLywdV>VNc{uf)c B(Te~8 literal 0 HcmV?d00001 diff --git a/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2686.jpg b/public/datasource-data/superres_s3_2024-09-19_render/12/2154/2686.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad3378429ea6d443aabc9b6b40e9d5275b8a8a93 GIT binary patch literal 3129 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 + + + input.vrt + + + + + + + + +
    Generated by GDAL2Tiles, Copyright © 2008 Klokan Petr Pridal, GDAL & OSGeo GSoC + +
    +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-09-19_render/leaflet.html b/public/datasource-data/superres_s3_2024-09-19_render/leaflet.html new file mode 100644 index 0000000..e058e62 --- /dev/null +++ b/public/datasource-data/superres_s3_2024-09-19_render/leaflet.html @@ -0,0 +1,107 @@ + + + + + + input.vrt + + + + + + + + + + +
    + + + + + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-09-19_render/openlayers.html b/public/datasource-data/superres_s3_2024-09-19_render/openlayers.html new file mode 100644 index 0000000..cf8299c --- /dev/null +++ b/public/datasource-data/superres_s3_2024-09-19_render/openlayers.html @@ -0,0 +1,99 @@ + + + + input.vrt + + + + + + + + + +
    Generated by GDAL2Tiles    
    +
    +
    + + + \ No newline at end of file diff --git a/public/datasource-data/superres_s3_2024-09-19_render/tilemapresource.xml b/public/datasource-data/superres_s3_2024-09-19_render/tilemapresource.xml new file mode 100644 index 0000000..7b9bdaf --- /dev/null +++ b/public/datasource-data/superres_s3_2024-09-19_render/tilemapresource.xml @@ -0,0 +1,15 @@ + + + input.vrt + + EPSG:3857 + + + + + + + + + + \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..20e816a --- /dev/null +++ b/public/index.html @@ -0,0 +1,112 @@ + + + + VC Map + + + + + + + + + + + + +
    +
    +
    LOADING
    +
    +
    +
    + + + -- GitLab